From 7b5c10900c6d64887e7cf383116766be4b18c6d0 Mon Sep 17 00:00:00 2001
From: mbertucci47 <61854785+mbertucci47@users.noreply.github.com>
Date: Sun, 22 Dec 2024 05:00:54 -0600
Subject: [PATCH] add expl3 package interfaces (#3921)
---
completion.qrc | 7 +++
completion/GS1.cwl | 11 +++-
completion/etl.cwl | 56 ++++++++++++++++++
completion/fontspec.cwl | 50 +++++++++++++++-
completion/gtl.cwl | 110 ++++++++++++++++++++++++++++++++++++
completion/jsonparse.cwl | 10 ++++
completion/keytheorems.cwl | 3 +
completion/l3benchmark.cwl | 12 ++++
completion/l3draw.cwl | 86 ++++++++++++++++++++++++++++
completion/l3graphics.cwl | 15 +++++
completion/l3opacity.cwl | 6 ++
completion/lt3luabridge.cwl | 16 +++++-
completion/pdfoverlay.cwl | 11 +++-
completion/pgfmath-xfp.cwl | 8 ++-
completion/rule-D.cwl | 5 ++
completion/tagpdf.cwl | 48 ++++++++++++++--
completion/unravel.cwl | 9 ++-
17 files changed, 450 insertions(+), 13 deletions(-)
create mode 100644 completion/etl.cwl
create mode 100644 completion/gtl.cwl
create mode 100644 completion/l3benchmark.cwl
create mode 100644 completion/l3draw.cwl
create mode 100644 completion/l3graphics.cwl
create mode 100644 completion/l3opacity.cwl
create mode 100644 completion/rule-D.cwl
diff --git a/completion.qrc b/completion.qrc
index e45d0c494d..6067b39702 100644
--- a/completion.qrc
+++ b/completion.qrc
@@ -1441,6 +1441,7 @@
completion/etaremune.cwl
completion/ETbb.cwl
completion/etextools.cwl
+completion/etl.cwl
completion/etoc.cwl
completion/etoolbox.cwl
completion/etruscan.cwl
@@ -1790,6 +1791,7 @@
completion/grundgesetze.cwl
completion/grverb.cwl
completion/GS1.cwl
+completion/gtl.cwl
completion/gtrcrd.cwl
completion/gtrlib.largetrees.cwl
completion/Gudea.cwl
@@ -2063,7 +2065,11 @@
completion/kvmap.cwl
completion/kvoptions.cwl
completion/kvsetkeys.cwl
+completion/l3benchmark.cwl
+completion/l3draw.cwl
+completion/l3graphics.cwl
completion/l3keys2e.cwl
+completion/l3opacity.cwl
completion/l3sys-query.cwl
completion/labels4easylist.cwl
completion/labels.cwl
@@ -3214,6 +3220,7 @@
completion/rubikrotation.cwl
completion/rubiktwocube.cwl
completion/ruby.cwl
+completion/rule-D.cwl
completion/rulerbox.cwl
completion/runcode.cwl
completion/runic.cwl
diff --git a/completion/GS1.cwl b/completion/GS1.cwl
index ded291ec9a..9ab7fbab66 100644
--- a/completion/GS1.cwl
+++ b/completion/GS1.cwl
@@ -1,5 +1,5 @@
# GS1 package
-# Matthew Bertucci 11/18/2021 for v23
+# Matthew Bertucci 2024/12/21 for v23
#include:rule-D
@@ -18,4 +18,11 @@ code=#EAN-8,EAN-13
scale=%
scale_to_font#true,false
add_control#true,false
-#endkeyvals
\ No newline at end of file
+#endkeyvals
+
+# expl3 interface
+\GS_cut_EAN_control_digit:N %<⟨seq var⟩%>#/%expl3
+\GS_set_code_digit_seq:Nn %<⟨seq var⟩%> {%<⟨tokens⟩%>}#/%expl3
+\GS_set_EAN_control_digit:N %<⟨seq var⟩%>#/%expl3
+\GS_use_as_EAN_barcode:N %<⟨seq var⟩%>#/%expl3
+\int_set_to_EAN_control_digit:NN %<⟨integer⟩ ⟨seq var⟩%>#/%expl3
\ No newline at end of file
diff --git a/completion/etl.cwl b/completion/etl.cwl
new file mode 100644
index 0000000000..7613ec38ad
--- /dev/null
+++ b/completion/etl.cwl
@@ -0,0 +1,56 @@
+# etl package
+# Matthew Bertucci 2024/12/21 for v0.3
+
+\etl_act:nnnnn {%<⟨normal⟩%>} {%<⟨space⟩%>} {%<⟨group⟩%>} {%<⟨status⟩%>} {%<⟨tokens⟩%>}#/%expl3
+\etl_act:nnnnnn {%<⟨normal⟩%>} {%<⟨space⟩%>} {%<⟨group⟩%>} {%<⟨final⟩%>} {%<⟨status⟩%>} {%<⟨tokens⟩%>}#/%expl3
+\etl_act:nnnnnnn {%<⟨normal⟩%>} {%<⟨space⟩%>} {%<⟨group⟩%>} {%<⟨final⟩%>} {%<⟨status⟩%>} {%<⟨output⟩%>} {%<⟨tokens⟩%>}#/%expl3
+\etl_act_apply_to_rest:n {%<⟨code⟩%>}#/%expl3
+\etl_act_break:#/%expl3
+\etl_act_break:n {%<⟨tokens⟩%>}#/%expl3
+\etl_act_break_discard:#/%expl3
+\etl_act_break_post:n {%<⟨tokens⟩%>}#/%expl3
+\etl_act_break_pre:n {%<⟨tokens⟩%>}#/%expl3
+\etl_act_do_final:#/%expl3
+\etl_act_output:n {%<⟨tokens⟩%>}#/%expl3
+\etl_act_output_pre:n {%<⟨tokens⟩%>}#/%expl3
+\etl_act_output_rest:#/%expl3
+\etl_act_output_rest_pre:#/%expl3
+\etl_act_put_back:n {%<⟨tokens⟩%>}#/%expl3
+\etl_act_status:n {%<⟨status⟩%>}#/%expl3
+\etl_act_switch:nnn {%<⟨normal⟩%>} {%<⟨space⟩%>} {%<⟨group⟩%>}#/%expl3
+\etl_act_switch_group:n {%<⟨group⟩%>}#/%expl3
+\etl_act_switch_normal:n {%<⟨normal⟩%>}#/%expl3
+\etl_act_switch_space:n {%<⟨space⟩%>}#/%expl3
+\etl_if_eq:nnF {%<⟨tokens1⟩%>} {%<⟨tokens2⟩%>} {%<⟨false code⟩%>}#/%expl3
+\etl_if_eq:nnT {%<⟨tokens1⟩%>} {%<⟨tokens2⟩%>} {%<⟨true code⟩%>}#/%expl3
+\etl_if_eq:nnTF {%<⟨tokens1⟩%>} {%<⟨tokens2⟩%>} {%<⟨true code⟩%>} {%<⟨false code⟩%>}#/%expl3
+\etl_if_eq_p:nn {%<⟨tokens1⟩%>} {%<⟨tokens2⟩%>}#/%expl3
+\etl_if_in:nnF {%<⟨tokens⟩%>} {%<⟨search text⟩%>} {%<⟨false code⟩%>}#/%expl3
+\etl_if_in:nnT {%<⟨tokens⟩%>} {%<⟨search text⟩%>} {%<⟨true code⟩%>}#/%expl3
+\etl_if_in:nnTF {%<⟨tokens⟩%>} {%<⟨search text⟩%>} {%<⟨true code⟩%>} {%<⟨false code⟩%>}#/%expl3
+\etl_if_in_deep:nnF {%<⟨tokens⟩%>} {%<⟨search text⟩%>} {%<⟨false code⟩%>}#/%expl3
+\etl_if_in_deep:nnT {%<⟨tokens⟩%>} {%<⟨search text⟩%>} {%<⟨true code⟩%>}#/%expl3
+\etl_if_in_deep:nnTF {%<⟨tokens⟩%>} {%<⟨search text⟩%>} {%<⟨true code⟩%>} {%<⟨false code⟩%>}#/%expl3
+\etl_if_in_deep_p:nn {%<⟨tokens⟩%>} {%<⟨search text⟩%>}#/%expl3
+\etl_if_in_p:nn {%<⟨tokens⟩%>} {%<⟨search text⟩%>}#/%expl3
+\etl_new_if_in:Nnn %<⟨function⟩%> {%<⟨search text⟩%>} {%<⟨conditions⟩%>}#/%expl3
+\etl_new_replace_all:Nn %<⟨function⟩%> {%<⟨search text⟩%>}#/%expl3
+\etl_new_replace_once:Nn %<⟨function⟩%> {%<⟨search text⟩%>}#/%expl3
+\etl_replace_all:nnn {%<⟨tokens⟩%>} {%<⟨search text⟩%>} {%<⟨replacement⟩%>}#/%expl3
+\etl_replace_all_deep:nnn {%<⟨tokens⟩%>} {%<⟨search text⟩%>} {%<⟨replacement⟩%>}#/%expl3
+\etl_replace_once:nnn {%<⟨tokens⟩%>} {%<⟨search text⟩%>} {%<⟨replacement⟩%>}#/%expl3
+\etl_token_if_eq:NNF %<⟨token1⟩ ⟨token2⟩%> {%<⟨false code⟩%>}#/%expl3
+\etl_token_if_eq:NNT %<⟨token1⟩ ⟨token2⟩%> {%<⟨true code⟩%>}#/%expl3
+\etl_token_if_eq:NNTF %<⟨token1⟩ ⟨token2⟩%> {%<⟨true code⟩%>} {%<⟨false code⟩%>}#/%expl3
+\etl_token_if_eq_p:NN %<⟨token1⟩ ⟨token2⟩%>#/%expl3
+\etl_token_if_in:nNF {%<⟨tokens⟩%>} %<⟨token⟩%> {%<⟨false code⟩%>}#/%expl3
+\etl_token_if_in:nNT {%<⟨tokens⟩%>} %<⟨token⟩%> {%<⟨true code⟩%>}#/%expl3
+\etl_token_if_in:nNTF {%<⟨tokens⟩%>} %<⟨token⟩%> {%<⟨true code⟩%>} {%<⟨false code⟩%>}#/%expl3
+\etl_token_if_in_deep:nNF {%<⟨tokens⟩%>} %<⟨token⟩%> {%<⟨false code⟩%>}#/%expl3
+\etl_token_if_in_deep:nNT {%<⟨tokens⟩%>} %<⟨token⟩%> {%<⟨true code⟩%>}#/%expl3
+\etl_token_if_in_deep:nNTF {%<⟨tokens⟩%>} %<⟨token⟩%> {%<⟨true code⟩%>} {%<⟨false code⟩%>}#/%expl3
+\etl_token_if_in_deep_p:nN {%<⟨tokens⟩%>} %<⟨token⟩%>#/%expl3
+\etl_token_if_in_p:nN {%<⟨tokens⟩%>} %<⟨token⟩%>#/%expl3
+\etl_token_replace_all:nNn {%<⟨tokens⟩%>} %<⟨token⟩%> {%<⟨replacement⟩%>}#/%expl3
+\etl_token_replace_all_deep:nNn {%<⟨tokens⟩%>} %<⟨token⟩%> {%<⟨replacement⟩%>}#/%expl3
+\etl_token_replace_once:nNn {%<⟨tokens⟩%>} %<⟨token⟩%> {%<⟨replacement⟩%>}#/%expl3
\ No newline at end of file
diff --git a/completion/fontspec.cwl b/completion/fontspec.cwl
index 3e85509179..ff5ae417b2 100644
--- a/completion/fontspec.cwl
+++ b/completion/fontspec.cwl
@@ -1,7 +1,7 @@
# fontspec package
# nja/17 July 2007 for fontspec v1.14
# muzimuzhi/30 Aug 2019 for fontspec v2.7c
-# Matthew Bertucci 27 Apr 2024 for v2.9b
+# Matthew Bertucci 21 Dec 2024 for v2.9e
# url: http://www.ctan.org/tex-archive/help/Catalogue/entries/fontspec.html
#keyvals:\usepackage/fontspec#c
@@ -248,3 +248,51 @@ Renderer=%
\Hwithstroke#*n
\hwithstroke#*n
\k{arg}#n
+
+# expl3 interface
+\fontspec_font_if_exist:nF {%<⟨font name⟩%>} {%<⟨false code⟩%>}#/%expl3
+\fontspec_font_if_exist:nT {%<⟨font name⟩%>} {%<⟨true code⟩%>}#/%expl3
+\fontspec_font_if_exist:nTF {%<⟨font name⟩%>} {%<⟨true code⟩%>} {%<⟨false code⟩%>}#/%expl3
+\fontspec_gset_family:Nnn %<⟨family⟩%> {%<⟨features⟩%>} {%<⟨font name⟩%>}#/%expl3
+\fontspec_gset_fontface:NNnn %<⟨face⟩%> %<⟨family⟩%> {%<⟨features⟩%>} {%<⟨font name⟩%>}#/%expl3
+\fontspec_if_aat_feature:nnF {%<⟨feature⟩%>} {%<⟨option⟩%>} {%<⟨false code⟩%>}#/%expl3
+\fontspec_if_aat_feature:nnT {%<⟨feature⟩%>} {%<⟨option⟩%>} {%<⟨true code⟩%>}#/%expl3
+\fontspec_if_aat_feature:nnTF {%<⟨feature⟩%>} {%<⟨option⟩%>} {%<⟨true code⟩%>} {%<⟨false code⟩%>}#/%expl3
+\fontspec_if_current_feature:nF {%<⟨feature tag⟩%>} {%<⟨false code⟩%>}#/%expl3
+\fontspec_if_current_feature:nT {%<⟨feature tag⟩%>} {%<⟨true code⟩%>}#/%expl3
+\fontspec_if_current_feature:nTF {%<⟨feature tag⟩%>} {%<⟨true code⟩%>} {%<⟨false code⟩%>}#/%expl3
+\fontspec_if_current_language:nF {%<⟨lang tag⟩%>} {%<⟨false code⟩%>}#/%expl3
+\fontspec_if_current_language:nT {%<⟨lang tag⟩%>} {%<⟨true code⟩%>}#/%expl3
+\fontspec_if_current_language:nTF {%<⟨lang tag⟩%>} {%<⟨true code⟩%>} {%<⟨false code⟩%>}#/%expl3
+\fontspec_if_current_script:nF {%<⟨script tag⟩%>} {%<⟨false code⟩%>}#/%expl3
+\fontspec_if_current_script:nT {%<⟨script tag⟩%>} {%<⟨true code⟩%>}#/%expl3
+\fontspec_if_current_script:nTF {%<⟨script tag⟩%>} {%<⟨true code⟩%>} {%<⟨false code⟩%>}#/%expl3
+\fontspec_if_feature:nF {%<⟨feature tag⟩%>} {%<⟨false code⟩%>}#/%expl3
+\fontspec_if_feature:nnnF {%<⟨script tag⟩%>} {%<⟨lang tag⟩%>} {%<⟨feature tag⟩%>} {%<⟨false code⟩%>}#/%expl3
+\fontspec_if_feature:nnnT {%<⟨script tag⟩%>} {%<⟨lang tag⟩%>} {%<⟨feature tag⟩%>} {%<⟨true code⟩%>}#/%expl3
+\fontspec_if_feature:nnnTF {%<⟨script tag⟩%>} {%<⟨lang tag⟩%>} {%<⟨feature tag⟩%>} {%<⟨true code⟩%>} {%<⟨false code⟩%>}#/%expl3
+\fontspec_if_feature:nT {%<⟨feature tag⟩%>} {%<⟨true code⟩%>}#/%expl3
+\fontspec_if_feature:nTF {%<⟨feature tag⟩%>} {%<⟨true code⟩%>} {%<⟨false code⟩%>}#/%expl3
+\fontspec_if_fontspec_font:F {%<⟨false code⟩%>}#/%expl3
+\fontspec_if_fontspec_font:T {%<⟨true code⟩%>}#/%expl3
+\fontspec_if_fontspec_font:TF {%<⟨true code⟩%>} {%<⟨false code⟩%>}#/%expl3
+\fontspec_if_language:nF {%<⟨lang tag⟩%>} {%<⟨false code⟩%>}#/%expl3
+\fontspec_if_language:nnF {%<⟨script tag⟩%>} {%<⟨lang tag⟩%>} {%<⟨false code⟩%>}#/%expl3
+\fontspec_if_language:nnT {%<⟨script tag⟩%>} {%<⟨lang tag⟩%>} {%<⟨true code⟩%>}#/%expl3
+\fontspec_if_language:nnTF {%<⟨script tag⟩%>} {%<⟨lang tag⟩%>} {%<⟨true code⟩%>} {%<⟨false code⟩%>}#/%expl3
+\fontspec_if_language:nT {%<⟨lang tag⟩%>} {%<⟨true code⟩%>}#/%expl3
+\fontspec_if_language:nTF {%<⟨lang tag⟩%>} {%<⟨true code⟩%>} {%<⟨false code⟩%>}#/%expl3
+\fontspec_if_opentype:F {%<⟨false code⟩%>}#/%expl3
+\fontspec_if_opentype:T {%<⟨true code⟩%>}#/%expl3
+\fontspec_if_opentype:TF {%<⟨true code⟩%>} {%<⟨false code⟩%>}#/%expl3
+\fontspec_if_script:nF {%<⟨script tag⟩%>} {%<⟨false code⟩%>}#/%expl3
+\fontspec_if_script:nT {%<⟨script tag⟩%>} {%<⟨true code⟩%>}#/%expl3
+\fontspec_if_script:nTF {%<⟨script tag⟩%>} {%<⟨true code⟩%>} {%<⟨false code⟩%>}#/%expl3
+\fontspec_if_small_caps:F {%<⟨false code⟩%>}#/%expl3
+\fontspec_if_small_caps:T {%<⟨true code⟩%>}#/%expl3
+\fontspec_if_small_caps:TF {%<⟨true code⟩%>} {%<⟨false code⟩%>}#/%expl3
+\fontspec_set_family:Nnn %<⟨family⟩%> {%<⟨features⟩%>} {%<⟨font name⟩%>}#/%expl3
+\fontspec_set_fontface:NNnn %<⟨face⟩%> %<⟨family⟩%> {%<⟨features⟩%>} {%<⟨font name⟩%>}#/%expl3
+\g_fontspec_encoding_tl#/%expl3
+\l_fontspec_family_tl#/%expl3
+\l_fontspec_font#/%expl3
\ No newline at end of file
diff --git a/completion/gtl.cwl b/completion/gtl.cwl
new file mode 100644
index 0000000000..b2d2f682b9
--- /dev/null
+++ b/completion/gtl.cwl
@@ -0,0 +1,110 @@
+# gtl package
+# Matthew Bertucci 2024/12/21 for v0.6
+
+\c_empty_gtl#/%expl3
+\c_group_begin_gtl#/%expl3
+\c_group_end_gtl#/%expl3
+\gtl_clear:N %<⟨gtl var⟩%>#/%expl3
+\gtl_clear_new:N %<⟨gtl var⟩%>#/%expl3
+\gtl_concat:NNN %<⟨gtl var1⟩ ⟨gtl var2⟩ ⟨gtl var3⟩%>#/%expl3
+\gtl_const:Ne %<⟨gtl var⟩%> {%<⟨tokens⟩%>}#/%expl3
+\gtl_const:Nn %<⟨gtl var⟩%> {%<⟨tokens⟩%>}#/%expl3
+\gtl_const:Nx %<⟨gtl var⟩%> {%<⟨tokens⟩%>}#/%expl3
+\gtl_count_tokens:N %<⟨gtl var⟩%>#/%expl3
+\gtl_extra_begin:N %<⟨gtl var⟩%>#/%expl3
+\gtl_extra_end:N %<⟨gtl var⟩%>#/%expl3
+\gtl_gclear:N %<⟨gtl var⟩%>#/%expl3
+\gtl_gclear_new:N %<⟨gtl var⟩%>#/%expl3
+\gtl_gconcat:NNN %<⟨gtl var1⟩ ⟨gtl var2⟩ ⟨gtl var3⟩%>#/%expl3
+\gtl_get_left:NN %<⟨gtl var1⟩ ⟨gtl var2⟩%>#/%expl3
+\gtl_gpop_left:N %<⟨gtl var⟩%>#/%expl3
+\gtl_gpop_left:NN %<⟨gtl var1⟩ ⟨gtl var2⟩%>#/%expl3
+\gtl_gpop_left_item:NNF %<⟨gtl var⟩ ⟨tl var⟩%> {%<⟨false code⟩%>}#/%expl3
+\gtl_gpop_left_item:NNT %<⟨gtl var⟩ ⟨tl var⟩%> {%<⟨true code⟩%>}#/%expl3
+\gtl_gpop_left_item:NNTF %<⟨gtl var⟩ ⟨tl var⟩%> {%<⟨true code⟩%>} {%<⟨false code⟩%>}#/%expl3
+\gtl_gpop_left_text:N %<⟨gtl var⟩%>#/%expl3
+\gtl_gpop_left_tl:N %<⟨gtl var⟩%>#/%expl3
+\gtl_gput_left:Nn %<⟨gtl var⟩%> {%<⟨tokens⟩%>}#/%expl3
+\gtl_gput_right:Nn %<⟨gtl var⟩%> {%<⟨tokens⟩%>}#/%expl3
+\gtl_gset:Ne %<⟨gtl var⟩%> {%<⟨tokens⟩%>}#/%expl3
+\gtl_gset:Nn %<⟨gtl var⟩%> {%<⟨tokens⟩%>}#/%expl3
+\gtl_gset:Nx %<⟨gtl var⟩%> {%<⟨tokens⟩%>}#/%expl3
+\gtl_gset_eq:NN %<⟨gtl var1⟩ ⟨gtl var2⟩%>#/%expl3
+\gtl_head:N %<⟨gtl var⟩%>#/%expl3
+\gtl_head_do:NN %<⟨gtl var⟩ ⟨function⟩%>#/%expl3
+\gtl_head_do:NNF %<⟨gtl var⟩ ⟨function⟩%> {%<⟨false code⟩%>}#/%expl3
+\gtl_head_do:NNT %<⟨gtl var⟩ ⟨function⟩%> {%<⟨true code⟩%>}#/%expl3
+\gtl_head_do:NNTF %<⟨gtl var⟩ ⟨function⟩%> {%<⟨true code⟩%>} {%<⟨false code⟩%>}#/%expl3
+\gtl_if_blank:NF %<⟨gtl var⟩%> {%<⟨false code⟩%>}#/%expl3
+\gtl_if_blank:NT %<⟨gtl var⟩%> {%<⟨true code⟩%>}#/%expl3
+\gtl_if_blank:NTF %<⟨gtl var⟩%>#/%expl3
+\gtl_if_blank_p:N %<⟨gtl var⟩%>#/%expl3
+\gtl_if_empty:NF %<⟨gtl var⟩%> {%<⟨false code⟩%>}#/%expl3
+\gtl_if_empty:NT %<⟨gtl var⟩%> {%<⟨true code⟩%>}#/%expl3
+\gtl_if_empty:NTF %<⟨gtl var⟩%> {%<⟨true code⟩%>} {%<⟨false code⟩%>}#/%expl3
+\gtl_if_empty_p:N %<⟨gtl var⟩%>#/%expl3
+\gtl_if_eq:NNF %<⟨gtl var1⟩ ⟨gtl var2⟩%> {%<⟨false code⟩%>}#/%expl3
+\gtl_if_eq:NNT %<⟨gtl var1⟩ ⟨gtl var2⟩%> {%<⟨true code⟩%>}#/%expl3
+\gtl_if_eq:NNTF %<⟨gtl var1⟩ ⟨gtl var2⟩%> {%<⟨true code⟩%>} {%<⟨false code⟩%>}#/%expl3
+\gtl_if_eq_p:NN %<⟨gtl var1⟩ ⟨gtl var2⟩%>#/%expl3
+\gtl_if_exist:NF %<⟨gtl var⟩%> {%<⟨false code⟩%>}#/%expl3
+\gtl_if_exist:NT %<⟨gtl var⟩%> {%<⟨true code⟩%>}#/%expl3
+\gtl_if_exist:NTF %<⟨gtl var⟩%> {%<⟨true code⟩%>} {%<⟨false code⟩%>}#/%expl3
+\gtl_if_exist_p:N %<⟨gtl var⟩%>#/%expl3
+\gtl_if_head_eq_catcode:NNF %<⟨gtl var1⟩ ⟨token⟩%> {%<⟨false code⟩%>}#/%expl3
+\gtl_if_head_eq_catcode:NNT %<⟨gtl var1⟩ ⟨token⟩%> {%<⟨true code⟩%>}#/%expl3
+\gtl_if_head_eq_catcode:NNTF %<⟨gtl var1⟩ ⟨token⟩%> {%<⟨true code⟩%>} {%<⟨false code⟩%>}#/%expl3
+\gtl_if_head_eq_catcode_p:NN %<⟨gtl var1⟩ ⟨token⟩%>#/%expl3
+\gtl_if_head_eq_charcode:NNF %<⟨gtl var1⟩ ⟨token⟩%> {%<⟨false code⟩%>}#/%expl3
+\gtl_if_head_eq_charcode:NNT %<⟨gtl var1⟩ ⟨token⟩%> {%<⟨true code⟩%>}#/%expl3
+\gtl_if_head_eq_charcode:NNTF %<⟨gtl var1⟩ ⟨token⟩%> {%<⟨true code⟩%>} {%<⟨false code⟩%>}#/%expl3
+\gtl_if_head_eq_charcode_p:NN %<⟨gtl var1⟩ ⟨token⟩%>#/%expl3
+\gtl_if_head_eq_meaning:NNF %<⟨gtl var1⟩ ⟨token⟩%> {%<⟨false code⟩%>}#/%expl3
+\gtl_if_head_eq_meaning:NNT %<⟨gtl var1⟩ ⟨token⟩%> {%<⟨true code⟩%>}#/%expl3
+\gtl_if_head_eq_meaning:NNTF %<⟨gtl var1⟩ ⟨token⟩%> {%<⟨true code⟩%>} {%<⟨false code⟩%>}#/%expl3
+\gtl_if_head_eq_meaning_p:NN %<⟨gtl var1⟩ ⟨token⟩%>#/%expl3
+\gtl_if_head_is_group_begin:NF %<⟨gtl var⟩%> {%<⟨false code⟩%>}#/%expl3
+\gtl_if_head_is_group_begin:NT %<⟨gtl var⟩%> {%<⟨true code⟩%>}#/%expl3
+\gtl_if_head_is_group_begin:NTF %<⟨gtl var⟩%> {%<⟨true code⟩%>} {%<⟨false code⟩%>}#/%expl3
+\gtl_if_head_is_group_begin_p:N %<⟨gtl var⟩%>#/%expl3
+\gtl_if_head_is_group_end:NF %<⟨gtl var⟩%> {%<⟨false code⟩%>}#/%expl3
+\gtl_if_head_is_group_end:NT %<⟨gtl var⟩%> {%<⟨true code⟩%>}#/%expl3
+\gtl_if_head_is_group_end:NTF %<⟨gtl var⟩%> {%<⟨true code⟩%>} {%<⟨false code⟩%>}#/%expl3
+\gtl_if_head_is_group_end_p:N %<⟨gtl var⟩%>#/%expl3
+\gtl_if_head_is_N_type:NF %<⟨gtl var⟩%> {%<⟨false code⟩%>}#/%expl3
+\gtl_if_head_is_N_type:NT %<⟨gtl var⟩%> {%<⟨true code⟩%>}#/%expl3
+\gtl_if_head_is_N_type:NTF %<⟨gtl var⟩%> {%<⟨true code⟩%>} {%<⟨false code⟩%>}#/%expl3
+\gtl_if_head_is_N_type_p:N %<⟨gtl var⟩%>#/%expl3
+\gtl_if_head_is_space:NF %<⟨gtl var⟩%> {%<⟨false code⟩%>}#/%expl3
+\gtl_if_head_is_space:NT %<⟨gtl var⟩%> {%<⟨true code⟩%>}#/%expl3
+\gtl_if_head_is_space:NTF %<⟨gtl var⟩%> {%<⟨true code⟩%>} {%<⟨false code⟩%>}#/%expl3
+\gtl_if_head_is_space_p:N %<⟨gtl var⟩%>#/%expl3
+\gtl_if_single_token:NF %<⟨gtl var⟩%> {%<⟨false code⟩%>}#/%expl3
+\gtl_if_single_token:NT %<⟨gtl var⟩%> {%<⟨true code⟩%>}#/%expl3
+\gtl_if_single_token:NTF %<⟨gtl var⟩%> {%<⟨true code⟩%>} {%<⟨false code⟩%>}#/%expl3
+\gtl_if_single_token_p:N %<⟨gtl var⟩%>#/%expl3
+\gtl_if_tl:NF %<⟨gtl var⟩%> {%<⟨false code⟩%>}#/%expl3
+\gtl_if_tl:NT %<⟨gtl var⟩%> {%<⟨true code⟩%>}#/%expl3
+\gtl_if_tl:NTF %<⟨gtl var⟩%> {%<⟨true code⟩%>} {%<⟨false code⟩%>}#/%expl3
+\gtl_if_tl_p:N %<⟨gtl var⟩%>#/%expl3
+\gtl_left_item:NF %<⟨gtl var⟩%> {%<⟨false code⟩%>}#/%expl3
+\gtl_left_text:NF %<⟨gtl var⟩%> {%<⟨false code⟩%>}#/%expl3
+\gtl_left_tl:N %<⟨gtl var⟩%>#/%expl3
+\gtl_log:N %<⟨gtl var⟩%>#/%expl3
+\gtl_new:N %<⟨gtl var⟩%>#/%expl3
+\gtl_pop_left:N %<⟨gtl var⟩%>#/%expl3
+\gtl_pop_left:NN %<⟨gtl var1⟩ ⟨gtl var2⟩%>#/%expl3
+\gtl_pop_left_item:NNF %<⟨gtl var⟩ ⟨tl var⟩%> {%<⟨false code⟩%>}#/%expl3
+\gtl_pop_left_item:NNT %<⟨gtl var⟩ ⟨tl var⟩%> {%<⟨true code⟩%>}#/%expl3
+\gtl_pop_left_item:NNTF %<⟨gtl var⟩ ⟨tl var⟩%> {%<⟨true code⟩%>} {%<⟨false code⟩%>}#/%expl3
+\gtl_pop_left_text:N %<⟨gtl var⟩%>#/%expl3
+\gtl_pop_left_tl:N %<⟨gtl var⟩%>#/%expl3
+\gtl_put_left:Nn %<⟨gtl var⟩%> {%<⟨tokens⟩%>}#/%expl3
+\gtl_put_right:Nn %<⟨gtl var⟩%> {%<⟨tokens⟩%>}#/%expl3
+\gtl_set:Ne %<⟨gtl var⟩%> {%<⟨tokens⟩%>}#/%expl3
+\gtl_set:Nn %<⟨gtl var⟩%> {%<⟨tokens⟩%>}#/%expl3
+\gtl_set:Nx %<⟨gtl var⟩%> {%<⟨tokens⟩%>}#/%expl3
+\gtl_set_eq:NN %<⟨gtl var1⟩ ⟨gtl var2⟩%>#/%expl3
+\gtl_show:N %<⟨gtl var⟩%>#/%expl3
+\gtl_to_str:N %<⟨gtl var⟩%>#/%expl3
+\gtl_to_str:n {%<⟨tokens⟩%>}#/%expl3
\ No newline at end of file
diff --git a/completion/jsonparse.cwl b/completion/jsonparse.cwl
index 750cacfdc6..9f0fc21298 100644
--- a/completion/jsonparse.cwl
+++ b/completion/jsonparse.cwl
@@ -64,3 +64,13 @@ check num#true,false
escape={%}
rescan#true,false
#endkeyvals
+
+# expl3 interface
+\jsonparse_array_count:NN %<⟨tl var⟩ ⟨integer⟩%>#/%expl3
+\jsonparse_filter:Nn %<⟨tl var⟩%> {%<⟨key⟩%>}#/%expl3
+\jsonparse_if_num:nF {%<⟨false code⟩%>} {%<⟨string⟩%>}#/%expl3
+\jsonparse_if_num:nT {%<⟨true code⟩%>} {%<⟨string⟩%>}#/%expl3
+\jsonparse_if_num:nTF {%<⟨true code⟩%>} {%<⟨false code⟩%>} {%<⟨string⟩%>}#/%expl3
+\jsonparse_if_num_p:n {%<⟨string⟩%>}#/%expl3
+\jsonparse_parse:n {%<⟨JSON string⟩%>}#/%expl3
+\jsonparse_parse_to_prop:Nn %<⟨tl var⟩%> {%<⟨JSON string⟩%>}#/%expl3
\ No newline at end of file
diff --git a/completion/keytheorems.cwl b/completion/keytheorems.cwl
index f45418090e..802ec9cf33 100644
--- a/completion/keytheorems.cwl
+++ b/completion/keytheorems.cwl
@@ -172,3 +172,6 @@ format-code=%
\Autoref{label}#r
\Autoref*{label}#r
+
+# expl3 interface
+\l_keythms_thmuse_envname_tl#/%expl3
\ No newline at end of file
diff --git a/completion/l3benchmark.cwl b/completion/l3benchmark.cwl
new file mode 100644
index 0000000000..1242d58da8
--- /dev/null
+++ b/completion/l3benchmark.cwl
@@ -0,0 +1,12 @@
+# l3benchmark package
+# Matthew Bertucci 2024/12/21
+
+\benchmark:n {%<⟨code⟩%>}#/%expl3
+\benchmark_once:n {%<⟨code⟩%>}#/%expl3
+\benchmark_once_silent:n {%<⟨code⟩%>}#/%expl3
+\benchmark_silent:n {%<⟨code⟩%>}#/%expl3
+\benchmark_tic:#/%expl3
+\benchmark_toc:#/%expl3
+\g_benchmark_duration_target_fp#/%expl3
+\g_benchmark_ops_fp#/%expl3
+\g_benchmark_time_fp#/%expl3
\ No newline at end of file
diff --git a/completion/l3draw.cwl b/completion/l3draw.cwl
new file mode 100644
index 0000000000..48558e6935
--- /dev/null
+++ b/completion/l3draw.cwl
@@ -0,0 +1,86 @@
+# l3draw package
+# Matthew Bertucci 2024/12/21
+
+\draw_baseline:n {%<⟨length⟩%>}#/%expl3
+\draw_begin:#/%expl3
+\draw_box_use:N %<⟨box⟩%>#/%expl3
+\draw_box_use:Nn %<⟨box⟩%> {%<⟨point⟩%>}#/%expl3
+\draw_cap_butt:#/%expl3
+\draw_cap_rectangle:#/%expl3
+\draw_cap_round:#/%expl3
+\draw_coffin_use:Nnn %<⟨coffin⟩%> {%<⟨hpole⟩%>} {%<⟨vpole⟩%>}#/%expl3
+\draw_coffin_use:Nnnn %<⟨coffin⟩%> {%<⟨hpole⟩%>} {%<⟨vpole⟩%>} {%<⟨point⟩%>}#/%expl3
+\draw_dash_pattern:nn {%<⟨pattern⟩%>} {%<⟨phase⟩%>}#/%expl3
+\draw_end:#/%expl3
+\draw_evenodd_rule:#/%expl3
+\draw_join_bevel:#/%expl3
+\draw_join_miter:#/%expl3
+\draw_join_round:#/%expl3
+\draw_layer_begin:n {%<⟨layer⟩%>}#/%expl3
+\draw_layer_end:#/%expl3
+\draw_layer_new:n {%<⟨layer⟩%>}#/%expl3
+\draw_linewidth:n {%<⟨width⟩%>}#/%expl3
+\draw_miterlimit:n {%<⟨factor⟩%>}#/%expl3
+\draw_nonzero_rule:#/%expl3
+\draw_path_arc:nnn {%<⟨angle1⟩%>} {%<⟨angle2⟩%>} {%<⟨radius⟩%>}#/%expl3
+\draw_path_arc:nnnn {%<⟨angle1⟩%>} {%<⟨angle2⟩%>} {%<⟨radius-a⟩%>} {%<⟨radius-b⟩%>}#/%expl3
+\draw_path_arc_axes:nnn {%<⟨angle1⟩%>} {%<⟨angle2⟩%>} {%<⟨vector1⟩%>} {%<⟨vector2⟩%>}#/%expl3
+\draw_path_canvas_curveto:nnn {%<⟨control1⟩%>} {%<⟨control2⟩%>} {%<⟨end⟩%>}#/%expl3
+\draw_path_canvas_lineto:n {%<⟨canvas point⟩%>}#/%expl3
+\draw_path_canvas_moveto:n {%<⟨canvas point⟩%>}#/%expl3
+\draw_path_circle:nn {%<⟨center⟩%>} {%<⟨radius⟩%>}#/%expl3
+\draw_path_close:#/%expl3
+\draw_path_corner_arc:nn {%<⟨length1⟩%>} {%<⟨length2⟩%>}#/%expl3
+\draw_path_curveto:nn {%<⟨control⟩%>} {%<⟨end⟩%>}#/%expl3
+\draw_path_curveto:nnn {%<⟨control1⟩%>} {%<⟨control2⟩%>} {%<⟨end⟩%>}#/%expl3
+\draw_path_ellipse:nnn {%<⟨center⟩%>} {%<⟨vector1⟩%>} {%<⟨vector2⟩%>}#/%expl3
+\draw_path_grid:nnnn {%<⟨xstep⟩%>} {%<⟨ystep⟩%>} {%<⟨lower-left⟩%>} {%<⟨upper-right⟩%>}#/%expl3
+\draw_path_lineto:n {%<⟨point⟩%>}#/%expl3
+\draw_path_moveto:n {%<⟨point⟩%>}#/%expl3
+\draw_path_rectangle:nn {%<⟨lower-left⟩%>} {%<⟨displacement⟩%>}#/%expl3
+\draw_path_rectangle_corners:nn {%<⟨lower-left⟩%>} {%<⟨top-right⟩%>}#/%expl3
+\draw_path_replace_bb:#/%expl3
+\draw_path_scope_begin:#/%expl3
+\draw_path_scope_end:#/%expl3
+\draw_path_use:n {%<⟨action(s)⟩%>}#/%expl3
+\draw_point_interpolate_curve:nnnnnn {%<⟨part⟩%>} {%<⟨start⟩%>} {%<⟨control1⟩%>} {%<⟨control2⟩%>} {%<⟨end⟩%>}#/%expl3
+\draw_point_interpolate_distance:nnn {%<⟨distance⟩%>} {%<⟨point expr1⟩%>} {%<⟨point expr2⟩%>}#/%expl3
+\draw_point_interpolate_line:nnn {%<⟨part⟩%>} {%<⟨point1⟩%>} {%<⟨point2⟩%>}#/%expl3
+\draw_point_intersect_circles:nnnnn {%<⟨center1⟩%>} {%<⟨radius1⟩%>} {%<⟨center2⟩%>} {%<⟨radius2⟩%>} {%<⟨root⟩%>}#/%expl3
+\draw_point_intersect_line_circle:nnnnn {%<⟨point1⟩%>} {%<⟨point2⟩%>} {%<⟨center⟩%>} {%<⟨radius⟩%>} {%<⟨root⟩%>}#/%expl3
+\draw_point_intersect_lines:nnnn {%<⟨point1⟩%>} {%<⟨point2⟩%>} {%<⟨point3⟩%>} {%<⟨point4⟩%>}#/%expl3
+\draw_point_polar:nn {%<⟨radius⟩%>} {%<⟨angle⟩%>}#/%expl3
+\draw_point_polar:nnn {%<⟨radius-a⟩%>} {%<⟨radius-b⟩%>} {%<⟨angle⟩%>}#/%expl3
+\draw_point_transform:n {%<⟨point⟩%>}#/%expl3
+\draw_point_unit_vector:n {%<⟨point⟩%>}#/%expl3
+\draw_point_vec:nn {%<⟨xscale⟩%>} {%<⟨yscale⟩%>}#/%expl3
+\draw_point_vec:nnn {%<⟨xscale⟩%>} {%<⟨yscale⟩%>} {%<⟨zscale⟩%>}#/%expl3
+\draw_point_vec_polar:nn {%<⟨radius⟩%>} {%<⟨angle⟩%>}#/%expl3
+\draw_point_vec_polar:nnn {%<⟨radius-a⟩%>} {%<⟨radius-b⟩%>} {%<⟨angle⟩%>}#/%expl3
+\draw_scope_begin:#/%expl3
+\draw_scope_end:#/%expl3
+\draw_suspend_begin:#/%expl3
+\draw_suspend_end:#/%expl3
+\draw_transform_matrix:nnnn {%<⟨a⟩%>} {%<⟨b⟩%>} {%<⟨c⟩%>} {%<⟨d⟩%>}#/%expl3
+\draw_transform_matrix_absolute:nnnn {%<⟨a⟩%>} {%<⟨b⟩%>} {%<⟨c⟩%>} {%<⟨d⟩%>}#/%expl3
+\draw_transform_matrix_invert:#/%expl3
+\draw_transform_matrix_reset:#/%expl3
+\draw_transform_rotate:n {%<⟨angle⟩%>}#/%expl3
+\draw_transform_scale:n {%<⟨scale⟩%>}#/%expl3
+\draw_transform_shift:n {%<⟨vector⟩%>}#/%expl3
+\draw_transform_shift_absolute:n {%<⟨vector⟩%>}#/%expl3
+\draw_transform_shift_invert:#/%expl3
+\draw_transform_shift_reset:#/%expl3
+\draw_transform_triangle:nnn {%<⟨origin⟩%>} {%<⟨point1⟩%>} {%<⟨point2⟩%>}#/%expl3
+\draw_transform_xscale:n {%<⟨scale⟩%>}#/%expl3
+\draw_transform_xshift:n {%<⟨shift⟩%>}#/%expl3
+\draw_transform_xslant:n {%<⟨slant⟩%>}#/%expl3
+\draw_transform_yscale:n {%<⟨scale⟩%>}#/%expl3
+\draw_transform_yshift:n {%<⟨shift⟩%>}#/%expl3
+\draw_transform_yslant:n {%<⟨slant⟩%>}#/%expl3
+\draw_xvec:n {%<⟨point⟩%>}#/%expl3
+\draw_yvec:n {%<⟨point⟩%>}#/%expl3
+\draw_zvec:n {%<⟨point⟩%>}#/%expl3
+\l_draw_bb_update_bool#/%expl3
+\l_draw_default_linewidth_dim#/%expl3
+\l_draw_layers_clist#/%expl3
\ No newline at end of file
diff --git a/completion/l3graphics.cwl b/completion/l3graphics.cwl
new file mode 100644
index 0000000000..ce3b7a29d3
--- /dev/null
+++ b/completion/l3graphics.cwl
@@ -0,0 +1,15 @@
+# l3graphics package
+# Matthew Bertucci 2024/12/21
+
+\graphics_get_full_name:nN {%<⟨file⟩%>} %<⟨tl var⟩%>#/%expl3
+\graphics_get_full_name:nNF {%<⟨file⟩%>} %<⟨tl var⟩%> {%<⟨false code⟩%>}#/%expl3
+\graphics_get_full_name:nNT {%<⟨file⟩%>} %<⟨tl var⟩%> {%<⟨true code⟩%>}#/%expl3
+\graphics_get_full_name:nNTF {%<⟨file⟩%>} %<⟨tl var⟩%> {%<⟨true code⟩%>} {%<⟨false code⟩%>}#/%expl3
+\graphics_get_pagecount:nn {%<⟨file⟩%>} %<⟨tl var⟩%>#/%expl3
+\graphics_include:nn {%<⟨keys⟩%>} {%<⟨file⟩%>}#/%expl3
+\graphics_include:nV {%<⟨keys⟩%>} %<⟨tl var⟩%>#/%expl3
+\graphics_log_list:#/%expl3
+\graphics_show_list:#/%expl3
+\l_graphics_ext_type_prop#/%expl3
+\l_graphics_search_ext_seq#/%expl3
+\l_graphics_search_path_seq#/%expl3
\ No newline at end of file
diff --git a/completion/l3opacity.cwl b/completion/l3opacity.cwl
new file mode 100644
index 0000000000..5e3e0e6973
--- /dev/null
+++ b/completion/l3opacity.cwl
@@ -0,0 +1,6 @@
+# l3opacity package
+# Matthew Bertucci 2024/12/21
+
+\opacity_select:n {%<⟨expression⟩%>}#/%expl3
+\opacity_fill:n {%<⟨expression⟩%>}#/%expl3
+\opacity_stroke:n {%<⟨expression⟩%>}#/%expl3
\ No newline at end of file
diff --git a/completion/lt3luabridge.cwl b/completion/lt3luabridge.cwl
index ad62bdcfbd..597a539c54 100644
--- a/completion/lt3luabridge.cwl
+++ b/completion/lt3luabridge.cwl
@@ -1,6 +1,20 @@
# lt3luabridge package
-# Matthew Bertucci 2022/06/29 for v1.0.1
+# Matthew Bertucci 2024/12/21 for v2.2.1
#include:luatex
\luabridgeExecute{lua code%definition}
+
+# expl3 interface
+\c_luabridge_default_error_output_filename_str#/%expl3
+\c_luabridge_default_helper_script_filename_str#/%expl3
+\c_luabridge_default_output_dirname_str#/%expl3
+\c_luabridge_method_directlua_int#/%expl3
+\c_luabridge_method_shell_int#/%expl3
+\g_luabridge_error_output_filename_str#/%expl3
+\g_luabridge_helper_script_filename_str#/%expl3
+\g_luabridge_method_int#/%expl3
+\g_luabridge_output_dirname_str#/%expl3
+\luabridge_now:e {%<⟨tokens⟩%>}#/%expl3
+\luabridge_now:n {%<⟨tokens⟩%>}#/%expl3
+\luabridge_tl_set:Nn %<⟨tl var%> {%<⟨tokens⟩%>}#/%expl3
\ No newline at end of file
diff --git a/completion/pdfoverlay.cwl b/completion/pdfoverlay.cwl
index 7e6bf50231..d59e0aa05c 100644
--- a/completion/pdfoverlay.cwl
+++ b/completion/pdfoverlay.cwl
@@ -1,5 +1,5 @@
# pdfoverlay package
-# Matthew Bertucci 11/3/2021 for v1.2b
+# Matthew Bertucci 2024/12/21 for v1.3
#include:graphicx
@@ -44,3 +44,12 @@ decodearray={%}
\pdfoverlaySkipToPage{page number}
\pdfoverlayPauseOutput
\pdfoverlayResumeOutput
+
+# expl3 interface
+\pdfoverlay_include_to_last_page:#/%expl3
+\pdfoverlay_include_to_page:n {%<⟨page number⟩%>}#/%expl3
+\pdfoverlay_pause_output:#/%expl3
+\pdfoverlay_resume_output:#/%expl3
+\pdfoverlay_set_graphics_options:n {%<⟨options⟩%>}#/%expl3
+\pdfoverlay_set_pdf:n {%<⟨pdf file⟩%>}#/%expl3
+\pdfoverlay_skip_to_page:n {%<⟨page number⟩%>}#/%expl3
\ No newline at end of file
diff --git a/completion/pgfmath-xfp.cwl b/completion/pgfmath-xfp.cwl
index 2f4162b915..bf55e8066a 100644
--- a/completion/pgfmath-xfp.cwl
+++ b/completion/pgfmath-xfp.cwl
@@ -1,5 +1,5 @@
# pgfmath-xfp package
-# Matthew Bertucci 11/2/2021 for v1.0
+# Matthew Bertucci 2024/12/21 for v1.0
#include:pgfmath
@@ -7,4 +7,8 @@
\pgfmxfpdeclarefunction{name}{args}[process-args]{fp expression}
\pgfmxfpDate#S
-\pgfmxfpVersion#S
\ No newline at end of file
+\pgfmxfpVersion#S
+
+# expl3 interface
+\pgfmxfp_declare:nnn {%<⟨name⟩%>} {%<⟨arg count⟩%>} {%<⟨fp expr⟩%>}#/%expl3
+\pgfmxfp_declare_processed_args:nnnn {%<⟨name⟩%>} {%<⟨arg count⟩%>} {%<⟨processed args⟩%>} {%<⟨fp expr⟩%>}#/%expl3
\ No newline at end of file
diff --git a/completion/rule-D.cwl b/completion/rule-D.cwl
new file mode 100644
index 0000000000..387aa3ae72
--- /dev/null
+++ b/completion/rule-D.cwl
@@ -0,0 +1,5 @@
+# rule-D package
+# Matthew Bertucci 2024/12/21 for v23
+
+\rule:nnn {%<⟨raise⟩%>} {%<⟨width⟩%>} {%<⟨height⟩%>}#/%expl3
+\rule:nn {%<⟨width⟩%>} {%<⟨height⟩%>}#/%expl3
\ No newline at end of file
diff --git a/completion/tagpdf.cwl b/completion/tagpdf.cwl
index c5b97e58b7..27cdae3e0a 100644
--- a/completion/tagpdf.cwl
+++ b/completion/tagpdf.cwl
@@ -1,5 +1,5 @@
# tagpdf package
-# Matthew Bertucci 2024/09/18 for v0.99f
+# Matthew Bertucci 2024/12/21 for v0.99k
#include:pdfmanagement-testphase
@@ -100,9 +100,6 @@ E=%
\tagstructend
\tagstructuse{label}
-\tagstop
-\tagstart
-
\ShowTagging{keyvals}
#keyvals:\ShowTagging
@@ -114,3 +111,46 @@ debug/structures
# not documented
\tagpdfsuppressmarks{arg}#*
+
+# expl3 interface
+\tag_check_child:nnF {%<⟨tag⟩%>} {%<⟨namespace⟩%>} {%<⟨false code⟩%>}#/%expl3
+\tag_check_child:nnT {%<⟨tag⟩%>} {%<⟨namespace⟩%>} {%<⟨true code⟩%>}#/%expl3
+\tag_check_child:nnTF {%<⟨tag⟩%>} {%<⟨namespace⟩%>} {%<⟨true code⟩%>} {%<⟨false code⟩%>}#/%expl3
+\tag_get:n {%<⟨keyword⟩%>}#/%expl3
+\tag_if_active:F {%<⟨false code⟩%>}#/%expl3
+\tag_if_active:T {%<⟨true code⟩%>}#/%expl3
+\tag_if_active:TF {%<⟨true code⟩%>} {%<⟨false code⟩%>}#/%expl3
+\tag_if_active_p:#/%expl3
+\tag_if_box_tagged:N %<⟨box⟩%>#/%expl3
+\tag_if_box_tagged:NF %<⟨box⟩%> {%<⟨false code⟩%>}#/%expl3
+\tag_if_box_tagged:NT %<⟨box⟩%> {%<⟨true code⟩%>}#/%expl3
+\tag_if_box_tagged:NTF %<⟨box⟩%> {%<⟨true code⟩%>} {%<⟨false code⟩%>}#/%expl3
+\tag_if_box_tagged_p:N %<⟨box⟩%>#/%expl3
+\tag_mc_add_missing_to_stream:Nn %<⟨box⟩%> {%<⟨stream name⟩%>}#/%expl3
+\tag_mc_artifact_group_begin:n {%<⟨name⟩%>}#/%expl3
+\tag_mc_artifact_group_end:#/%expl3
+\tag_mc_begin:n {%<⟨keyvals⟩%>}#/%expl3
+\tag_mc_begin_pop:n {%<⟨keyvals⟩%>}#/%expl3
+\tag_mc_end:#/%expl3
+\tag_mc_end_push:#/%expl3
+\tag_mc_if_in:F {%<⟨false code⟩%>}#/%expl3
+\tag_mc_if_in:T {%<⟨true code⟩%>}#/%expl3
+\tag_mc_if_in:TF {%<⟨true code⟩%>} {%<⟨false code⟩%>}#/%expl3
+\tag_mc_if_in_p:#/%expl3
+\tag_mc_new_stream:n {%<⟨stream name⟩%>}#/%expl3
+\tag_mc_reset_box:N %<⟨box⟩%>#/%expl3
+\tag_mc_use:n {%<⟨label⟩%>}#/%expl3
+\tag_spacechar_off:#/%expl3
+\tag_spacechar_on:#/%expl3
+\tag_struct_begin:n {%<⟨keyvals⟩%>}#/%expl3
+\tag_struct_end:#/%expl3
+\tag_struct_end:n {%<⟨tag⟩%>}#/%expl3
+\tag_struct_gput:nnn {%<⟨struct number⟩%>} {%<⟨keyword⟩%>} {%<⟨value⟩%>}#/%expl3
+\tag_struct_gput_ref:nnn {%<⟨struct number⟩%>} {%<⟨keyword⟩%>} {%<⟨value⟩%>}#/%expl3
+\tag_struct_insert_annot:nn {%<⟨object ref⟩%>}{%<⟨struct parent number⟩%>}#/%expl3
+\tag_struct_object_ref:e {%<⟨struct number⟩%>}#/%expl3
+\tag_struct_object_ref:n {%<⟨struct number⟩%>}#/%expl3
+\tag_struct_parent_int:#/%expl3
+\tag_struct_use:n {%<⟨label⟩%>}#/%expl3
+\tag_struct_use_num:n {%<⟨struct number⟩%>}#/%expl3
+\tag_tool:n {%<⟨keyval⟩%>}#/%expl3
\ No newline at end of file
diff --git a/completion/unravel.cwl b/completion/unravel.cwl
index 3c5bc63d21..0ee52a2df9 100644
--- a/completion/unravel.cwl
+++ b/completion/unravel.cwl
@@ -3,8 +3,8 @@
#include:gtl
-\unravel{content}
-\unravel[keyvals]{content}
+\unravel{code}
+\unravel[keyvals]{code}
\unravelsetup{keyvals}
#keyvals:\unravel,\unravelsetup
@@ -23,3 +23,8 @@ trace-expansion#true,false
trace-other#true,false
welcome-message#true,false
#endkeyvals
+
+# expl3 interface
+\unravel:nn {%<⟨keyvals⟩%>} {%<⟨code⟩%>}#/%expl3
+\unravel_get:nnN {%<⟨keyvals⟩%>} {%<⟨code⟩%>} %<⟨tl var⟩%>#/%expl3
+\unravel_setup:n {%<⟨keyvals⟩%>}#/%expl3
\ No newline at end of file