diff --git a/base/changes.txt b/base/changes.txt index 09e4082dc..269369483 100644 --- a/base/changes.txt +++ b/base/changes.txt @@ -10,6 +10,14 @@ are not part of the distribution. All changes above are only part of the development branch for the next release. ================================================================================ +2021-01-07 Phelype Oleinik + + * ltfilehook.dtx: + Undefine \@expl@@@filehook@file@pop@@ to avoid error when rolling back (gh/463). + + * lthooks.dtx: + Modified internal copies of l3tl commands to avoid errors with l3debug (gh/463). + ######################### # 2020-10-01 PL 4 Release ######################### diff --git a/base/ltfilehook.dtx b/base/ltfilehook.dtx index c7ed13f04..8a07819b9 100644 --- a/base/ltfilehook.dtx +++ b/base/ltfilehook.dtx @@ -31,8 +31,8 @@ %%% From File: ltfilehook.dtx % % \begin{macrocode} -\providecommand\ltfilehookversion{v1.0d} -\providecommand\ltfilehookdate{2020/11/24} +\providecommand\ltfilehookversion{v1.0e} +\providecommand\ltfilehookdate{2021/01/07} % \end{macrocode} % %<*driver> @@ -1488,10 +1488,22 @@ % \begin{macrocode} \ExplSyntaxOff % \end{macrocode} -% +% +% This one specifically has to be undefined because it is left over in +% the input stream from \cs{InputIfFileExists} and executed when +% \pkg{latexrelease} is loaded. It cannot be \cs{let} to \cs{@undefined} +% otherwise it would error as well, so it is \cs{let} to \cs{relax} to +% be silently ignored when loading \cs{latexrelease}. +% \changes{v1.0e}{2021/01/07}{Added rollback for this case to avoid +% spurious errors (part of gh/463)} % \begin{macrocode} % %\EndIncludeInRelease +% +%\IncludeInRelease{0000/00/00}% +% {\@expl@@@filehook@if@no@extension@@nTF}{2e tmp interfaces}% +%\let\@expl@@@filehook@file@pop@@\relax +%\EndIncludeInRelease %<*2ekernel> % \end{macrocode} % diff --git a/base/lthooks.dtx b/base/lthooks.dtx index cc79892ca..234a54d24 100644 --- a/base/lthooks.dtx +++ b/base/lthooks.dtx @@ -31,8 +31,8 @@ %%% From File: lthooks.dtx % % \begin{macrocode} -\def\lthooksversion{v1.0g} -\def\lthooksdate{2020/12/18} +\def\lthooksversion{v1.0h} +\def\lthooksdate{2021/01/07} % \end{macrocode} % %<*driver> @@ -1873,35 +1873,80 @@ % \end{macrocode} % \end{macro} % -% \begin{macro}{\@@_tl_set:Nn,\@@_tl_set:cn,\@@_tl_set:cx} -% \begin{macro}{\@@_tl_gset:Nn,\@@_tl_gset:cn,\@@_tl_gset:co,\@@_tl_gset:cx} -% \begin{macro}{\@@_tl_gput_right:Nn,\@@_tl_gput_right:No,\@@_tl_gput_right:cn} -% \begin{macro}{\@@_tl_gput_left:Nn,\@@_tl_gput_left:No} -% \begin{macro}{\@@_tl_gclear:N,\@@_tl_gclear:c} -% \begin{macro}{\@@_tl_gset_eq:NN} +% \begin{macro}{\@@_tl_set:Nn,\@@_tl_set:Nx, +% \@@_tl_set:cn,\@@_tl_set:cx} % Private copies of a few \pkg{expl3} functions. \pkg{l3debug} will % only add debugging to the public names, not to these copies, so we % don't have to use \cs{debug_suspend:} and \cs{debug_resume:} % everywhere. +% +% Functions like \cs{@@_tl_set:Nn} have to be redefined, rather than +% copied because in \pkg{expl3} they use +% \cs[no-index]{__kernel_tl_(g)set:Nx}, which is also patched by +% \pkg{l3debug}. +% \changes{v1.0h}{2021/01/07}{Manually define some \pkg{l3tl} commands +% to work around \pkg{expl3} changes} % \begin{macrocode} -\cs_new_eq:NN \@@_tl_set:Nn \tl_set:Nn -\cs_generate_variant:Nn \@@_tl_set:Nn { cn, cx } -\cs_new_eq:NN \@@_tl_gset:Nn \tl_gset:Nn -\cs_generate_variant:Nn \@@_tl_gset:Nn { cn, co, cx } -\cs_new_eq:NN \@@_tl_gput_right:Nn \tl_gput_right:Nn -\cs_generate_variant:Nn \@@_tl_gput_right:Nn { No, cn } -\cs_new_eq:NN \@@_tl_gput_left:Nn \tl_gput_left:Nn -\cs_generate_variant:Nn \@@_tl_gput_left:Nn { No } -\cs_new_protected:Npn \@@_tl_gclear:N #1 - { \@@_tl_gset_eq:NN #1 \c_empty_tl } -\cs_generate_variant:Nn \@@_tl_gclear:N { c } -\cs_new_eq:NN \@@_tl_gset_eq:NN \tl_gset_eq:NN +\cs_new_protected:Npn \@@_tl_set:Nn #1#2 + { \cs_set_nopar:Npx #1 { \__kernel_exp_not:w {#2} } } +\cs_new_protected:Npn \@@_tl_set:Nx #1#2 + { \cs_set_nopar:Npx #1 {#2} } +\cs_generate_variant:Nn \@@_tl_set:Nn { c } +\cs_generate_variant:Nn \@@_tl_set:Nx { c } % \end{macrocode} % \end{macro} +% +% \begin{macro}{\@@_tl_gset:Nn,\@@_tl_gset:No,\@@_tl_gset:Nx, +% \@@_tl_gset:cn,\@@_tl_gset:co,\@@_tl_gset:cx} +% Same as above. +% \begin{macrocode} +\cs_new_protected:Npn \@@_tl_gset:Nn #1#2 + { \cs_gset_nopar:Npx #1 { \__kernel_exp_not:w {#2} } } +\cs_new_protected:Npn \@@_tl_gset:No #1#2 + { \cs_gset_nopar:Npx #1 { \__kernel_exp_not:w \exp_after:wN {#2} } } +\cs_new_protected:Npn \@@_tl_gset:Nx #1#2 + { \cs_gset_nopar:Npx #1 {#2} } +\cs_generate_variant:Nn \@@_tl_gset:Nn { c } +\cs_generate_variant:Nn \@@_tl_gset:No { c } +\cs_generate_variant:Nn \@@_tl_gset:Nx { c } +% \end{macrocode} % \end{macro} +% +% \begin{macro}{\@@_tl_gput_right:Nn,\@@_tl_gput_right:No,\@@_tl_gput_right:cn} +% Same as above. +% \begin{macrocode} +\cs_new_protected:Npn \@@_tl_gput_right:Nn #1#2 + { \@@_tl_gset:Nx #1 { \__kernel_exp_not:w \exp_after:wN { #1 #2 } } } +\cs_generate_variant:Nn \@@_tl_gput_right:Nn { No, cn } +% \end{macrocode} % \end{macro} +% +% \begin{macro}{\@@_tl_gput_left:Nn,\@@_tl_gput_left:No} +% Same as above. +% \begin{macrocode} +\cs_new_protected:Npn \@@_tl_gput_left:Nn #1#2 + { + \@@_tl_gset:Nx #1 + { \__kernel_exp_not:w {#2} \__kernel_exp_not:w \exp_after:wN {#1} } + } +\cs_generate_variant:Nn \@@_tl_gput_left:Nn { No } +% \end{macrocode} % \end{macro} +% +% \begin{macro}{\@@_tl_gset_eq:NN} +% Same as above. +% \begin{macrocode} +\cs_new_eq:NN \@@_tl_gset_eq:NN \tl_gset_eq:NN +% \end{macrocode} % \end{macro} +% +% \begin{macro}{\@@_tl_gclear:N,\@@_tl_gclear:c} +% Same as above. +% \begin{macrocode} +\cs_new_protected:Npn \@@_tl_gclear:N #1 + { \@@_tl_gset_eq:NN #1 \c_empty_tl } +\cs_generate_variant:Nn \@@_tl_gclear:N { c } +% \end{macrocode} % \end{macro} % % diff --git a/base/testfiles/tlb-latexrelease-rollback-003-often.luatex.tlg b/base/testfiles/tlb-latexrelease-rollback-003-often.luatex.tlg index 4255c03f2..3357b4619 100644 --- a/base/testfiles/tlb-latexrelease-rollback-003-often.luatex.tlg +++ b/base/testfiles/tlb-latexrelease-rollback-003-often.luatex.tlg @@ -393,6 +393,7 @@ Skipping: [....-..-..] Tortoise and Hare on input line .... Skipping: [....-..-..] Disable packages on input line .... Applying: [....-..-..] Disable packages on input line .... Skipping: [....-..-..] 2e tmp interfaces on input line .... +Applying: [....-..-..] 2e tmp interfaces on input line .... Skipping: [....-..-..] Hook mangement (shipout) on input line .... Applying: [....-..-..] The hook management (shipout) on input line .... LaTeX Info: Redefining \AtBeginDvi on input line .... @@ -885,6 +886,7 @@ Skipping: [....-..-..] Tortoise and Hare on input line .... Skipping: [....-..-..] Disable packages on input line .... Applying: [....-..-..] Disable packages on input line .... Skipping: [....-..-..] 2e tmp interfaces on input line .... +Applying: [....-..-..] 2e tmp interfaces on input line .... Skipping: [....-..-..] Hook mangement (shipout) on input line .... Applying: [....-..-..] The hook management (shipout) on input line .... LaTeX Info: Redefining \AtBeginDvi on input line .... diff --git a/base/testfiles/tlb-latexrelease-rollback-003-often.tlg b/base/testfiles/tlb-latexrelease-rollback-003-often.tlg index acc2b0660..3ba377b57 100644 --- a/base/testfiles/tlb-latexrelease-rollback-003-often.tlg +++ b/base/testfiles/tlb-latexrelease-rollback-003-often.tlg @@ -387,6 +387,7 @@ Skipping: [....-..-..] Tortoise and Hare on input line .... Skipping: [....-..-..] Disable packages on input line .... Applying: [....-..-..] Disable packages on input line .... Skipping: [....-..-..] 2e tmp interfaces on input line .... +Applying: [....-..-..] 2e tmp interfaces on input line .... Skipping: [....-..-..] Hook mangement (shipout) on input line .... Applying: [....-..-..] The hook management (shipout) on input line .... LaTeX Info: Redefining \AtBeginDvi on input line .... @@ -869,6 +870,7 @@ Skipping: [....-..-..] Tortoise and Hare on input line .... Skipping: [....-..-..] Disable packages on input line .... Applying: [....-..-..] Disable packages on input line .... Skipping: [....-..-..] 2e tmp interfaces on input line .... +Applying: [....-..-..] 2e tmp interfaces on input line .... Skipping: [....-..-..] Hook mangement (shipout) on input line .... Applying: [....-..-..] The hook management (shipout) on input line .... LaTeX Info: Redefining \AtBeginDvi on input line .... diff --git a/base/testfiles/tlb-latexrelease-rollback-003-often.xetex.tlg b/base/testfiles/tlb-latexrelease-rollback-003-often.xetex.tlg index 073988f99..2c2bd3214 100644 --- a/base/testfiles/tlb-latexrelease-rollback-003-often.xetex.tlg +++ b/base/testfiles/tlb-latexrelease-rollback-003-often.xetex.tlg @@ -387,6 +387,7 @@ Skipping: [....-..-..] Tortoise and Hare on input line .... Skipping: [....-..-..] Disable packages on input line .... Applying: [....-..-..] Disable packages on input line .... Skipping: [....-..-..] 2e tmp interfaces on input line .... +Applying: [....-..-..] 2e tmp interfaces on input line .... Skipping: [....-..-..] Hook mangement (shipout) on input line .... Applying: [....-..-..] The hook management (shipout) on input line .... LaTeX Info: Redefining \AtBeginDvi on input line .... @@ -878,6 +879,7 @@ Skipping: [....-..-..] Tortoise and Hare on input line .... Skipping: [....-..-..] Disable packages on input line .... Applying: [....-..-..] Disable packages on input line .... Skipping: [....-..-..] 2e tmp interfaces on input line .... +Applying: [....-..-..] 2e tmp interfaces on input line .... Skipping: [....-..-..] Hook mangement (shipout) on input line .... Applying: [....-..-..] The hook management (shipout) on input line .... LaTeX Info: Redefining \AtBeginDvi on input line .... diff --git a/base/testfiles/tlb-rollback-004-often.luatex.tlg b/base/testfiles/tlb-rollback-004-often.luatex.tlg index f0c67910e..7977673f2 100644 --- a/base/testfiles/tlb-rollback-004-often.luatex.tlg +++ b/base/testfiles/tlb-rollback-004-often.luatex.tlg @@ -765,6 +765,7 @@ Skipping: [....-..-..] Tortoise and Hare on input line .... Skipping: [....-..-..] Disable packages on input line .... Applying: [....-..-..] Disable packages on input line .... Skipping: [....-..-..] 2e tmp interfaces on input line .... +Applying: [....-..-..] 2e tmp interfaces on input line .... Skipping: [....-..-..] Hook mangement (shipout) on input line .... Applying: [....-..-..] The hook management (shipout) on input line .... LaTeX Info: Redefining \AtBeginDvi on input line .... diff --git a/base/testfiles/tlb-rollback-004-often.tlg b/base/testfiles/tlb-rollback-004-often.tlg index 6640ae3fa..875de0a0c 100644 --- a/base/testfiles/tlb-rollback-004-often.tlg +++ b/base/testfiles/tlb-rollback-004-often.tlg @@ -753,6 +753,7 @@ Skipping: [....-..-..] Tortoise and Hare on input line .... Skipping: [....-..-..] Disable packages on input line .... Applying: [....-..-..] Disable packages on input line .... Skipping: [....-..-..] 2e tmp interfaces on input line .... +Applying: [....-..-..] 2e tmp interfaces on input line .... Skipping: [....-..-..] Hook mangement (shipout) on input line .... Applying: [....-..-..] The hook management (shipout) on input line .... LaTeX Info: Redefining \AtBeginDvi on input line .... diff --git a/base/testfiles/tlb-rollback-004-often.xetex.tlg b/base/testfiles/tlb-rollback-004-often.xetex.tlg index ecfdecdf9..b8f333288 100644 --- a/base/testfiles/tlb-rollback-004-often.xetex.tlg +++ b/base/testfiles/tlb-rollback-004-often.xetex.tlg @@ -754,6 +754,7 @@ Skipping: [....-..-..] Tortoise and Hare on input line .... Skipping: [....-..-..] Disable packages on input line .... Applying: [....-..-..] Disable packages on input line .... Skipping: [....-..-..] 2e tmp interfaces on input line .... +Applying: [....-..-..] 2e tmp interfaces on input line .... Skipping: [....-..-..] Hook mangement (shipout) on input line .... Applying: [....-..-..] The hook management (shipout) on input line .... LaTeX Info: Redefining \AtBeginDvi on input line .... diff --git a/base/testfiles/tlb-syntonly-001.luatex.tlg b/base/testfiles/tlb-syntonly-001.luatex.tlg index ae780efcb..e4dd3e1f6 100644 --- a/base/testfiles/tlb-syntonly-001.luatex.tlg +++ b/base/testfiles/tlb-syntonly-001.luatex.tlg @@ -9,7 +9,7 @@ Package fixltx2e Warning: fixltx2e is not required with releases after 2015 Already applied: [....-..-..] Old fixltx2e package on input line .... ) (syntonly.sty Package: syntonly ....-..-.. v... Standard LaTeX2e package -warning (font): lua-loaded font '25' with name 'dummy' has no characters +warning (font): lua-loaded font '23' with name 'dummy' has no characters ) \output=\toks... Author: Frank Mittelbach diff --git a/texmf/tex/latex/l3kernel/expl3-code.tex b/texmf/tex/latex/l3kernel/expl3-code.tex index 7807eb086..73bfa9ffd 100644 --- a/texmf/tex/latex/l3kernel/expl3-code.tex +++ b/texmf/tex/latex/l3kernel/expl3-code.tex @@ -69,7 +69,7 @@ %% and all files in that bundle must be distributed together. %% %% File: expl3.dtx -\def\ExplFileDate{2020-09-24}% +\def\ExplFileDate{2020-12-07}% \begingroup \def\next{\endgroup}% \expandafter\ifx\csname PackageError\endcsname\relax @@ -3626,6 +3626,8 @@ } \cs_new:Npn \use_none_delimit_by_s_stop:w #1 \s_stop { } %% File: l3tl.dtx +\cs_new_eq:NN \__kernel_tl_set:Nx \cs_set_nopar:Npx +\cs_new_eq:NN \__kernel_tl_gset:Nx \cs_gset_nopar:Npx \cs_new_protected:Npn \tl_new:N #1 { \__kernel_chk_if_free_cs:N #1 @@ -3635,7 +3637,7 @@ \cs_new_protected:Npn \tl_const:Nn #1#2 { \__kernel_chk_if_free_cs:N #1 - \cs_gset_nopar:Npx #1 { \exp_not:n {#2} } + \cs_gset_nopar:Npx #1 { \__kernel_exp_not:w {#2} } } \cs_new_protected:Npn \tl_const:Nx #1#2 { @@ -3661,9 +3663,21 @@ \cs_generate_variant:Nn \tl_set_eq:NN { cN, Nc, cc } \cs_generate_variant:Nn \tl_gset_eq:NN { cN, Nc, cc } \cs_new_protected:Npn \tl_concat:NNN #1#2#3 - { \tl_set:Nx #1 { \exp_not:o {#2} \exp_not:o {#3} } } + { + \__kernel_tl_set:Nx #1 + { + \__kernel_exp_not:w \exp_after:wN {#2} + \__kernel_exp_not:w \exp_after:wN {#3} + } + } \cs_new_protected:Npn \tl_gconcat:NNN #1#2#3 - { \tl_gset:Nx #1 { \exp_not:o {#2} \exp_not:o {#3} } } + { + \__kernel_tl_gset:Nx #1 + { + \__kernel_exp_not:w \exp_after:wN {#2} + \__kernel_exp_not:w \exp_after:wN {#3} + } + } \cs_generate_variant:Nn \tl_concat:NNN { ccc } \cs_generate_variant:Nn \tl_gconcat:NNN { ccc } \prg_new_eq_conditional:NNn \tl_if_exist:N \cs_if_exist:N { TF , T , F , p } @@ -3680,17 +3694,17 @@ } \tl_const:Nn \c_space_tl { ~ } \cs_new_protected:Npn \tl_set:Nn #1#2 - { \cs_set_nopar:Npx #1 { \exp_not:n {#2} } } + { \__kernel_tl_set:Nx #1 { \__kernel_exp_not:w {#2} } } \cs_new_protected:Npn \tl_set:No #1#2 - { \cs_set_nopar:Npx #1 { \exp_not:o {#2} } } + { \__kernel_tl_set:Nx #1 { \__kernel_exp_not:w \exp_after:wN {#2} } } \cs_new_protected:Npn \tl_set:Nx #1#2 - { \cs_set_nopar:Npx #1 {#2} } + { \__kernel_tl_set:Nx #1 {#2} } \cs_new_protected:Npn \tl_gset:Nn #1#2 - { \cs_gset_nopar:Npx #1 { \exp_not:n {#2} } } + { \__kernel_tl_gset:Nx #1 { \__kernel_exp_not:w {#2} } } \cs_new_protected:Npn \tl_gset:No #1#2 - { \cs_gset_nopar:Npx #1 { \exp_not:o {#2} } } + { \__kernel_tl_gset:Nx #1 { \__kernel_exp_not:w \exp_after:wN {#2} } } \cs_new_protected:Npn \tl_gset:Nx #1#2 - { \cs_gset_nopar:Npx #1 {#2} } + { \__kernel_tl_gset:Nx #1 {#2} } \cs_generate_variant:Nn \tl_set:Nn { NV , Nv , Nf } \cs_generate_variant:Nn \tl_set:Nx { c } \cs_generate_variant:Nn \tl_set:Nn { c, co , cV , cv , cf } @@ -3698,21 +3712,45 @@ \cs_generate_variant:Nn \tl_gset:Nx { c } \cs_generate_variant:Nn \tl_gset:Nn { c, co , cV , cv , cf } \cs_new_protected:Npn \tl_put_left:Nn #1#2 - { \cs_set_nopar:Npx #1 { \exp_not:n {#2} \exp_not:o #1 } } + { + \__kernel_tl_set:Nx #1 + { \__kernel_exp_not:w {#2} \__kernel_exp_not:w \exp_after:wN {#1} } + } \cs_new_protected:Npn \tl_put_left:NV #1#2 - { \cs_set_nopar:Npx #1 { \exp_not:V #2 \exp_not:o #1 } } + { + \__kernel_tl_set:Nx #1 + { \exp_not:V #2 \__kernel_exp_not:w \exp_after:wN {#1} } + } \cs_new_protected:Npn \tl_put_left:No #1#2 - { \cs_set_nopar:Npx #1 { \exp_not:o {#2} \exp_not:o #1 } } + { + \__kernel_tl_set:Nx #1 + { + \__kernel_exp_not:w \exp_after:wN {#2} + \__kernel_exp_not:w \exp_after:wN {#1} + } + } \cs_new_protected:Npn \tl_put_left:Nx #1#2 - { \cs_set_nopar:Npx #1 { #2 \exp_not:o #1 } } + { \__kernel_tl_set:Nx #1 { #2 \__kernel_exp_not:w \exp_after:wN {#1} } } \cs_new_protected:Npn \tl_gput_left:Nn #1#2 - { \cs_gset_nopar:Npx #1 { \exp_not:n {#2} \exp_not:o #1 } } + { + \__kernel_tl_gset:Nx #1 + { \__kernel_exp_not:w {#2} \__kernel_exp_not:w \exp_after:wN {#1} } + } \cs_new_protected:Npn \tl_gput_left:NV #1#2 - { \cs_gset_nopar:Npx #1 { \exp_not:V #2 \exp_not:o #1 } } + { + \__kernel_tl_gset:Nx #1 + { \exp_not:V #2 \__kernel_exp_not:w \exp_after:wN {#1} } + } \cs_new_protected:Npn \tl_gput_left:No #1#2 - { \cs_gset_nopar:Npx #1 { \exp_not:o {#2} \exp_not:o #1 } } + { + \__kernel_tl_gset:Nx #1 + { + \__kernel_exp_not:w \exp_after:wN {#2} + \__kernel_exp_not:w \exp_after:wN {#1} + } + } \cs_new_protected:Npn \tl_gput_left:Nx #1#2 - { \cs_gset_nopar:Npx #1 { #2 \exp_not:o {#1} } } + { \__kernel_tl_gset:Nx #1 { #2 \__kernel_exp_not:w \exp_after:wN {#1} } } \cs_generate_variant:Nn \tl_put_left:Nn { c } \cs_generate_variant:Nn \tl_put_left:NV { c } \cs_generate_variant:Nn \tl_put_left:No { c } @@ -3722,21 +3760,39 @@ \cs_generate_variant:Nn \tl_gput_left:No { c } \cs_generate_variant:Nn \tl_gput_left:Nx { c } \cs_new_protected:Npn \tl_put_right:Nn #1#2 - { \cs_set_nopar:Npx #1 { \exp_not:o #1 \exp_not:n {#2} } } + { \__kernel_tl_set:Nx #1 { \__kernel_exp_not:w \exp_after:wN { #1 #2 } } } \cs_new_protected:Npn \tl_put_right:NV #1#2 - { \cs_set_nopar:Npx #1 { \exp_not:o #1 \exp_not:V #2 } } + { + \__kernel_tl_set:Nx #1 + { \__kernel_exp_not:w \exp_after:wN {#1} \exp_not:V #2 } + } \cs_new_protected:Npn \tl_put_right:No #1#2 - { \cs_set_nopar:Npx #1 { \exp_not:o #1 \exp_not:o {#2} } } + { + \__kernel_tl_set:Nx #1 + { + \__kernel_exp_not:w \exp_after:wN {#1} + \__kernel_exp_not:w \exp_after:wN {#2} + } + } \cs_new_protected:Npn \tl_put_right:Nx #1#2 - { \cs_set_nopar:Npx #1 { \exp_not:o #1 #2 } } + { \__kernel_tl_set:Nx #1 { \__kernel_exp_not:w \exp_after:wN {#1} #2 } } \cs_new_protected:Npn \tl_gput_right:Nn #1#2 - { \cs_gset_nopar:Npx #1 { \exp_not:o #1 \exp_not:n {#2} } } + { \__kernel_tl_gset:Nx #1 { \__kernel_exp_not:w \exp_after:wN { #1 #2 } } } \cs_new_protected:Npn \tl_gput_right:NV #1#2 - { \cs_gset_nopar:Npx #1 { \exp_not:o #1 \exp_not:V #2 } } + { + \__kernel_tl_gset:Nx #1 + { \__kernel_exp_not:w \exp_after:wN {#1} \exp_not:V #2 } + } \cs_new_protected:Npn \tl_gput_right:No #1#2 - { \cs_gset_nopar:Npx #1 { \exp_not:o #1 \exp_not:o {#2} } } + { + \__kernel_tl_gset:Nx #1 + { + \__kernel_exp_not:w \exp_after:wN {#1} + \__kernel_exp_not:w \exp_after:wN {#2} + } + } \cs_new_protected:Npn \tl_gput_right:Nx #1#2 - { \cs_gset_nopar:Npx #1 { \exp_not:o {#1} #2 } } + { \__kernel_tl_gset:Nx #1 { \__kernel_exp_not:w \exp_after:wN {#1} #2 } } \cs_generate_variant:Nn \tl_put_right:Nn { c } \cs_generate_variant:Nn \tl_put_right:NV { c } \cs_generate_variant:Nn \tl_put_right:No { c } @@ -3756,9 +3812,11 @@ \cs_new_protected:Npn \tl_rescan:nn #1#2 { \tl_set_rescan:Nnn \l__tl_internal_a_tl {#1} {#2} - \exp_after:wN \tl_clear:N \exp_after:wN \l__tl_internal_a_tl + \exp_after:wN \__tl_rescan_aux: \l__tl_internal_a_tl } +\exp_args:NNo \cs_new_protected:Npn \__tl_rescan_aux: + { \tl_clear:N \l__tl_internal_a_tl } \cs_new_protected:Npn \tl_set_rescan:Nnn { \__tl_set_rescan:NNnn \tl_set:No } \cs_new_protected:Npn \tl_gset_rescan:Nnn @@ -3777,7 +3835,7 @@ } \cs_new_protected:Npn \__tl_set_rescan_multi:nNN #1#2#3 { - \exp_args:No \tex_everyeof:D { \c__tl_rescan_marker_tl } + \tex_everyeof:D \exp_after:wN { \c__tl_rescan_marker_tl } \exp_after:wN \__tl_rescan:NNw \exp_after:wN #2 \exp_after:wN #3 @@ -3850,13 +3908,13 @@ \c__tl_rescan_marker_tl #2 { \use_i:nn \exp_end: #1 } \cs_new_protected:Npn \tl_replace_once:Nnn - { \__tl_replace:NnNNNnn \q__tl_mark ? \__tl_replace_wrap:w \tl_set:Nx } + { \__tl_replace:NnNNNnn \q__tl_mark ? \__tl_replace_wrap:w \__kernel_tl_set:Nx } \cs_new_protected:Npn \tl_greplace_once:Nnn - { \__tl_replace:NnNNNnn \q__tl_mark ? \__tl_replace_wrap:w \tl_gset:Nx } + { \__tl_replace:NnNNNnn \q__tl_mark ? \__tl_replace_wrap:w \__kernel_tl_gset:Nx } \cs_new_protected:Npn \tl_replace_all:Nnn - { \__tl_replace:NnNNNnn \q__tl_mark ? \__tl_replace_next:w \tl_set:Nx } + { \__tl_replace:NnNNNnn \q__tl_mark ? \__tl_replace_next:w \__kernel_tl_set:Nx } \cs_new_protected:Npn \tl_greplace_all:Nnn - { \__tl_replace:NnNNNnn \q__tl_mark ? \__tl_replace_next:w \tl_gset:Nx } + { \__tl_replace:NnNNNnn \q__tl_mark ? \__tl_replace_next:w \__kernel_tl_gset:Nx } \cs_generate_variant:Nn \tl_replace_once:Nnn { c } \cs_generate_variant:Nn \tl_greplace_once:Nnn { c } \cs_generate_variant:Nn \tl_replace_all:Nnn { c } @@ -3893,7 +3951,7 @@ { \group_align_safe_begin: \cs_set:Npn \__tl_replace_wrap:w ##1 #1 ##2 - { \exp_not:o { \use_none:nn ##1 } ##2 } + { \__kernel_exp_not:w \exp_after:wN { \use_none:nn ##1 } ##2 } \cs_set:Npx \__tl_replace_next:w ##1 #5 { \exp_not:N \__tl_replace_wrap:w ##1 @@ -3903,9 +3961,7 @@ } #3 #4 { - \exp_after:wN \__tl_replace_next:w - \exp_after:wN { \exp_after:wN } - \exp_after:wN { \exp_after:wN } + \exp_after:wN \__tl_replace_next_aux:w #4 #1 { @@ -3916,6 +3972,7 @@ } \group_align_safe_end: } +\cs_new:Npn \__tl_replace_next_aux:w { \__tl_replace_next:w { } { } } \cs_new_eq:NN \__tl_replace_wrap:w ? \cs_new_eq:NN \__tl_replace_next:w ? \cs_new_protected:Npn \tl_remove_once:Nn #1#2 @@ -3930,16 +3987,6 @@ { \tl_greplace_all:Nnn #1 {#2} { } } \cs_generate_variant:Nn \tl_remove_all:Nn { c } \cs_generate_variant:Nn \tl_gremove_all:Nn { c } -\prg_new_conditional:Npnn \tl_if_blank:n #1 { p , T , F , TF } - { - \__tl_if_empty_if:o { \use_none:n #1 ? } - \prg_return_true: - \else: - \prg_return_false: - \fi: - } -\prg_generate_conditional_variant:Nnn \tl_if_blank:n - { e , V , o } { p , T , F , TF } \prg_new_conditional:Npnn \tl_if_empty:N #1 { p , T , F , TF } { \if_meaning:w #1 \c_empty_tl @@ -3952,8 +3999,7 @@ { c } { p , T , F , TF } \prg_new_conditional:Npnn \tl_if_empty:n #1 { p , TF , T , F } { - \exp_after:wN \if_meaning:w \exp_after:wN \q__tl_nil - \tl_to_str:n {#1} \q__tl_nil + \if:w \scan_stop: \tl_to_str:n {#1} \scan_stop: \prg_return_true: \else: \prg_return_false: @@ -3963,10 +4009,10 @@ { V } { p , TF , T , F } \cs_new:Npn \__tl_if_empty_if:o #1 { - \exp_after:wN \if_meaning:w \exp_after:wN \q__tl_nil - \__kernel_tl_to_str:w \exp_after:wN {#1} \q__tl_nil + \if:w \scan_stop: \__kernel_tl_to_str:w \exp_after:wN {#1} \scan_stop: } -\prg_new_conditional:Npnn \tl_if_empty:o #1 { p , TF , T , F } +\exp_args:Nno \use:n + { \prg_new_conditional:Npnn \tl_if_empty:o #1 { p , TF , T , F } } { \__tl_if_empty_if:o {#1} \prg_return_true: @@ -3974,6 +4020,17 @@ \prg_return_false: \fi: } +\exp_args:Nno \use:n + { \prg_new_conditional:Npnn \tl_if_blank:n #1 { p , T , F , TF } } + { + \__tl_if_empty_if:o { \use_none:n #1 ? } + \prg_return_true: + \else: + \prg_return_false: + \fi: + } +\prg_generate_conditional_variant:Nnn \tl_if_blank:n + { e , V , o } { p , T , F , TF } \prg_new_conditional:Npnn \tl_if_eq:NN #1#2 { p , T , F , TF } { \if_meaning:w #1 #2 @@ -4048,9 +4105,9 @@ \cs_new:Npn \tl_if_single:NTF { \exp_args:No \tl_if_single:nTF } \prg_new_conditional:Npnn \tl_if_single:n #1 { p , T , F , TF } { - \if_catcode:w ^ \exp_after:wN \__tl_if_single:nnw + \if:w \scan_stop: \exp_after:wN \__tl_if_single:nnw \__kernel_tl_to_str:w - \exp_after:wN { \use_none:nn #1 ?? } ^ ? \s__tl_stop + \exp_after:wN { \use_none:nn #1 ?? } \scan_stop: ? \s__tl_stop \prg_return_true: \else: \prg_return_false: @@ -4196,18 +4253,16 @@ { \int_eval:n { - \__tl_act:NNNnn - \__tl_act_count_normal:nN - \__tl_act_count_group:nn - \__tl_act_count_space:n - { } + \__tl_act:NNNn + \__tl_act_count_normal:N + \__tl_act_count_group:n + \__tl_act_count_space: {#1} } } -\cs_new:Npn \__tl_act_count_normal:nN #1 #2 { 1 + } -\cs_new:Npn \__tl_act_count_space:n #1 { 1 + } -\cs_new:Npn \__tl_act_count_group:nn #1 #2 - { 2 + \tl_count_tokens:n {#2} + } +\cs_new:Npn \__tl_act_count_normal:N #1 { 1 + } +\cs_new:Npn \__tl_act_count_space: { 1 + } +\cs_new:Npn \__tl_act_count_group:n #1 { 2 + \tl_count_tokens:n {#1} + } \cs_new:Npn \tl_reverse_items:n #1 { \__tl_reverse_items:nwNwn #1 ? @@ -4223,43 +4278,48 @@ \s__tl_stop { {#1} #5 } } \cs_new:Npn \__tl_reverse_items:wn #1 \s__tl_stop #2 - { \exp_not:o { \use_none:nn #2 } } + { \__kernel_exp_not:w \exp_after:wN { \use_none:nn #2 } } \cs_new:Npn \tl_trim_spaces:n #1 - { \__tl_trim_spaces:nn { \s__tl_mark #1 } \exp_not:o } + { + \__tl_trim_spaces:nn + { \__tl_trim_mark: #1 } + { \__kernel_exp_not:w \exp_after:wN } + } \cs_generate_variant:Nn \tl_trim_spaces:n { o } \cs_new:Npn \tl_trim_spaces_apply:nN #1#2 - { \__tl_trim_spaces:nn { \s__tl_mark #1 } { \exp_args:No #2 } } + { \__tl_trim_spaces:nn { \__tl_trim_mark: #1 } { \exp_args:No #2 } } \cs_generate_variant:Nn \tl_trim_spaces_apply:nN { o } \cs_new_protected:Npn \tl_trim_spaces:N #1 - { \tl_set:Nx #1 { \exp_args:No \tl_trim_spaces:n {#1} } } + { \__kernel_tl_set:Nx #1 { \exp_args:No \tl_trim_spaces:n {#1} } } \cs_new_protected:Npn \tl_gtrim_spaces:N #1 - { \tl_gset:Nx #1 { \exp_args:No \tl_trim_spaces:n {#1} } } + { \__kernel_tl_gset:Nx #1 { \exp_args:No \tl_trim_spaces:n {#1} } } \cs_generate_variant:Nn \tl_trim_spaces:N { c } \cs_generate_variant:Nn \tl_gtrim_spaces:N { c } -\cs_set:Npn \__tl_tmp:w #1 +\cs_set_protected:Npn \__tl_tmp:w #1 { \cs_new:Npn \__tl_trim_spaces:nn ##1 { \__tl_trim_spaces_auxi:w ##1 \s__tl_nil - \s__tl_mark #1 { } - \s__tl_mark \__tl_trim_spaces_auxii:w + \__tl_trim_mark: #1 { } + \__tl_trim_mark: \__tl_trim_spaces_auxii:w \__tl_trim_spaces_auxiii:w #1 \s__tl_nil \__tl_trim_spaces_auxiv:w \s__tl_stop } - \cs_new:Npn \__tl_trim_spaces_auxi:w ##1 \s__tl_mark #1 ##2 \s__tl_mark ##3 + \cs_new:Npn + \__tl_trim_spaces_auxi:w ##1 \__tl_trim_mark: #1 ##2 \__tl_trim_mark: ##3 { ##3 \__tl_trim_spaces_auxi:w - \s__tl_mark + \__tl_trim_mark: ##2 - \s__tl_mark #1 {##1} + \__tl_trim_mark: #1 {##1} } \cs_new:Npn \__tl_trim_spaces_auxii:w - \__tl_trim_spaces_auxi:w \s__tl_mark \s__tl_mark ##1 + \__tl_trim_spaces_auxi:w \__tl_trim_mark: \__tl_trim_mark: ##1 { \__tl_trim_spaces_auxiii:w ##1 @@ -4271,111 +4331,52 @@ \__tl_trim_spaces_auxiii:w } \cs_new:Npn \__tl_trim_spaces_auxiv:w ##1 \s__tl_nil ##2 \s__tl_stop ##3 - { ##3 { \use_none:n ##1 } } + { ##3 { ##1 } } + \cs_new:Npn \__tl_trim_mark: {} } \__tl_tmp:w { ~ } -\quark_new:N \q__tl_act_mark -\quark_new:N \q__tl_act_stop -\cs_new:Npn \__tl_act:NNNnn #1#2#3#4#5 - { - \group_align_safe_begin: - \__tl_act_loop:w #5 \q__tl_act_mark \q__tl_act_stop - {#4} #1 #2 #3 - \__tl_act_result:n { } - } -\cs_new:Npn \__tl_act_loop:w #1 \q__tl_act_stop +\cs_if_exist:NTF \tex_expanded:D { - \tl_if_head_is_N_type:nTF {#1} - { \__tl_act_normal:NwnNNN } + \cs_new:Npn \tl_head:n #1 { - \tl_if_head_is_group:nTF {#1} - { \__tl_act_group:nwnNNN } - { \__tl_act_space:wwnNNN } + \__kernel_exp_not:w \tex_expanded:D + { { \if_false: { \fi: \__tl_head_aux:n #1 { } } } } + } + \cs_new:Npn \__tl_head_aux:n #1 + { + \__kernel_exp_not:w {#1} + \exp_after:wN \use_none:n \exp_after:wN { \if_false: } \fi: } - #1 \q__tl_act_stop - } -\cs_new:Npn \__tl_act_normal:NwnNNN #1 #2 \q__tl_act_stop #3#4 - { - \if_meaning:w \q__tl_act_mark #1 - \exp_after:wN \__tl_act_end:wn - \fi: - #4 {#3} #1 - \__tl_act_loop:w #2 \q__tl_act_stop - {#3} #4 - } -\cs_new:Npn \__tl_act_end:wn #1 \__tl_act_result:n #2 - { \group_align_safe_end: \exp_end: #2 } -\cs_new:Npn \__tl_act_group:nwnNNN #1 #2 \q__tl_act_stop #3#4#5 - { - #5 {#3} {#1} - \__tl_act_loop:w #2 \q__tl_act_stop - {#3} #4 #5 - } -\exp_last_unbraced:NNo - \cs_new:Npn \__tl_act_space:wwnNNN \c_space_tl #1 \q__tl_act_stop #2#3#4#5 - { - #5 {#2} - \__tl_act_loop:w #1 \q__tl_act_stop - {#2} #3 #4 #5 } -\cs_new:Npn \__tl_act_output:n #1 #2 \__tl_act_result:n #3 - { #2 \__tl_act_result:n { #3 #1 } } -\cs_new:Npn \__tl_act_reverse_output:n #1 #2 \__tl_act_result:n #3 - { #2 \__tl_act_result:n { #1 #3 } } -\cs_new:Npn \tl_reverse:n #1 { - \__kernel_exp_not:w \exp_after:wN + \cs_new:Npn \tl_head:n #1 { - \exp:w - \__tl_act:NNNnn - \__tl_reverse_normal:nN - \__tl_reverse_group_preserve:nn - \__tl_reverse_space:n - { } + \__kernel_exp_not:w + \if_false: { \fi: \__tl_head_auxi:nw #1 { } \s__tl_stop } + } + \cs_new:Npn \__tl_head_auxi:nw #1#2 \s__tl_stop + { + \exp_after:wN \__tl_head_auxii:n \exp_after:wN { + \if_false: } \fi: {#1} + } + \exp_args:Nno \use:n + { \cs_new:Npn \__tl_head_auxii:n #1 } + { + \__tl_if_empty_if:o { \use_none:n #1 } + \exp_after:wN \use_ii:nnn + \fi: + \use_ii:nn {#1} + { \if_false: { \fi: \__tl_head_auxi:nw #1 } } } } -\cs_generate_variant:Nn \tl_reverse:n { o , V } -\cs_new:Npn \__tl_reverse_normal:nN #1#2 - { \__tl_act_reverse_output:n {#2} } -\cs_new:Npn \__tl_reverse_group_preserve:nn #1#2 - { \__tl_act_reverse_output:n { {#2} } } -\cs_new:Npn \__tl_reverse_space:n #1 - { \__tl_act_reverse_output:n { ~ } } -\cs_new_protected:Npn \tl_reverse:N #1 - { \tl_set:Nx #1 { \exp_args:No \tl_reverse:n { #1 } } } -\cs_new_protected:Npn \tl_greverse:N #1 - { \tl_gset:Nx #1 { \exp_args:No \tl_reverse:n { #1 } } } -\cs_generate_variant:Nn \tl_reverse:N { c } -\cs_generate_variant:Nn \tl_greverse:N { c } -\cs_new:Npn \tl_head:n #1 - { - \__kernel_exp_not:w - \if_false: { \fi: \__tl_head_auxi:nw #1 { } \s__tl_stop } - } -\cs_new:Npn \__tl_head_auxi:nw #1#2 \s__tl_stop - { - \exp_after:wN \__tl_head_auxii:n \exp_after:wN { - \if_false: } \fi: {#1} - } -\cs_new:Npn \__tl_head_auxii:n #1 - { - \exp_after:wN \if_meaning:w \exp_after:wN \q__tl_nil - \__kernel_tl_to_str:w \exp_after:wN { \use_none:n #1 } \q__tl_nil - \exp_after:wN \use_i:nn - \else: - \exp_after:wN \use_ii:nn - \fi: - {#1} - { \if_false: { \fi: \__tl_head_auxi:nw #1 } } - } \cs_generate_variant:Nn \tl_head:n { V , v , f } \cs_new:Npn \tl_head:w #1#2 \q_stop {#1} \cs_new:Npn \__tl_tl_head:w #1#2 \s__tl_stop {#1} \cs_new:Npn \tl_head:N { \exp_args:No \tl_head:n } -\cs_new:Npn \tl_tail:n #1 +\exp_args:Nno \use:n { \cs_new:Npn \tl_tail:n #1 } { - \__kernel_exp_not:w + \exp_after:wN \__kernel_exp_not:w \tl_if_blank:nTF {#1} { { } } { \exp_after:wN { \use_none:n #1 } } @@ -4385,13 +4386,10 @@ \prg_new_conditional:Npnn \tl_if_head_eq_charcode:nN #1#2 { p , T , F , TF } { \if_charcode:w - \exp_not:N #2 \tl_if_head_is_N_type:nTF { #1 ? } - { - \exp_after:wN \exp_not:N - \__tl_tl_head:w #1 { ? \use_none:nn } \s__tl_stop - } + { \__tl_head_exp_not:w #1 { ^ \__tl_if_head_eq_empty_arg:w } \s__tl_stop } { \str_head:n {#1} } + \exp_not:N #2 \prg_return_true: \else: \prg_return_false: @@ -4402,17 +4400,14 @@ \prg_new_conditional:Npnn \tl_if_head_eq_catcode:nN #1 #2 { p , T , F , TF } { \if_catcode:w - \exp_not:N #2 \tl_if_head_is_N_type:nTF { #1 ? } - { - \exp_after:wN \exp_not:N - \__tl_tl_head:w #1 { ? \use_none:nn } \s__tl_stop - } + { \__tl_head_exp_not:w #1 { ^ \__tl_if_head_eq_empty_arg:w } \s__tl_stop } { \tl_if_head_is_group:nTF {#1} - { \c_group_begin_token } - { \c_space_token } + \c_group_begin_token + \c_space_token } + \exp_not:N #2 \prg_return_true: \else: \prg_return_false: @@ -4423,8 +4418,8 @@ \prg_new_conditional:Npnn \tl_if_head_eq_meaning:nN #1#2 { p , T , F , TF } { \tl_if_head_is_N_type:nTF { #1 ? } - { \__tl_if_head_eq_meaning_normal:nN } - { \__tl_if_head_eq_meaning_special:nN } + \__tl_if_head_eq_meaning_normal:nN + \__tl_if_head_eq_meaning_special:nN {#1} #2 } \cs_new:Npn \__tl_if_head_eq_meaning_normal:nN #1 #2 @@ -4439,11 +4434,11 @@ \cs_new:Npn \__tl_if_head_eq_meaning_special:nN #1 #2 { \if_charcode:w \str_head:n {#1} \exp_not:N #2 - \exp_after:wN \use:n + \exp_after:wN \use_ii:nn \else: \prg_return_false: - \exp_after:wN \use_none:n \fi: + \use_none:n { \if_catcode:w \exp_not:N #2 \tl_if_head_is_group:nTF {#1} @@ -4455,46 +4450,148 @@ \fi: } } +\cs_new:Npn \__tl_head_exp_not:w #1 #2 \s__tl_stop + { \exp_not:N #1 } +\cs_new:Npn \__tl_if_head_eq_empty_arg:w \exp_not:N #1 + { ? } \prg_new_conditional:Npnn \tl_if_head_is_N_type:n #1 { p , T , F , TF } { - \if_catcode:w - \if_false: { \fi: \__tl_if_head_is_N_type:w ? #1 ~ } - \exp_after:wN \use_none:n - \exp_after:wN { \exp_after:wN { \token_to_str:N #1 ? } } - * * + \if:w + \if_false: { \fi: \__tl_if_head_is_N_type_auxi:w \prg_do_nothing: #1 ~ } + { \exp_after:wN { \token_to_str:N #1 } } + \scan_stop: \scan_stop: \prg_return_true: \else: \prg_return_false: \fi: } -\cs_new:Npn \__tl_if_head_is_N_type:w #1 ~ +\exp_args:Nno \use:n { \cs_new:Npn \__tl_if_head_is_N_type_auxi:w #1 ~ } { - \tl_if_empty:oTF { \use_none:n #1 } { ^ } { } - \exp_after:wN \use_none:n \exp_after:wN { \if_false: } \fi: + \tl_if_empty:oTF { #1 } + { f \exp_after:wN \use_none:nn } + { \exp_after:wN \__tl_if_head_is_N_type_auxii:n } + \exp_after:wN { \if_false: } \fi: } +\cs_new:Npn \__tl_if_head_is_N_type_auxii:n #1 + { \exp_after:wN \use_none:n \exp_after:wN } \prg_new_conditional:Npnn \tl_if_head_is_group:n #1 { p , T , F , TF } { - \if_catcode:w + \if:w \exp_after:wN \use_none:n \exp_after:wN { \exp_after:wN { \token_to_str:N #1 ? } } - * * - \prg_return_false: - \else: + \scan_stop: \scan_stop: + \__tl_if_head_is_group_fi_false:w + \fi: + \if_true: \prg_return_true: + \else: + \prg_return_false: \fi: } +\cs_new:Npn \__tl_if_head_is_group_fi_false:w \fi: \if_true: { \fi: \if_false: } \prg_new_conditional:Npnn \tl_if_head_is_space:n #1 { p , T , F , TF } { - \exp:w \if_false: { \fi: - \__tl_if_head_is_space:w ? #1 ? ~ } + \if:w + \if_false: { \fi: \__tl_if_head_is_space:w \prg_do_nothing: #1 ? ~ } + \scan_stop: \scan_stop: + \prg_return_true: + \else: + \prg_return_false: + \fi: } -\cs_new:Npn \__tl_if_head_is_space:w #1 ~ +\exp_args:Nno \use:n { \cs_new:Npn \__tl_if_head_is_space:w #1 ~ } { - \tl_if_empty:oTF { \use_none:n #1 } - { \exp_after:wN \exp_end: \exp_after:wN \prg_return_true: } - { \exp_after:wN \exp_end: \exp_after:wN \prg_return_false: } + \__tl_if_empty_if:o {#1} \else: f \fi: \exp_after:wN \use_none:n \exp_after:wN { \if_false: } \fi: } +\scan_new:N \s__tl_act_stop +\cs_set_protected:Npn \__tl_tmp:w #1 + { + \cs_new:Npn \__tl_act_if_head_is_space:nTF ##1 + { + \__tl_act_if_head_is_space:w + \s__tl_act_stop ##1 \s__tl_act_stop \__tl_act_if_head_is_space_true:w + \s__tl_act_stop #1 \s__tl_act_stop \use_ii:nn + } + \cs_new:Npn \__tl_act_if_head_is_space:w + ##1 \s__tl_act_stop #1 ##2 \s__tl_act_stop + {} + \cs_new:Npn \__tl_act_if_head_is_space_true:w + \s__tl_act_stop #1 \s__tl_act_stop \use_ii:nn ##1 ##2 + {##1} + } +\__tl_tmp:w { ~ } +\exp_args:Nnx \use:n { \cs_new:Npn \__tl_act_loop:w #1 \s__tl_act_stop } + { + \exp_not:o { \__tl_act_if_head_is_space:nTF {#1} } + \exp_not:N \__tl_act_space:wwNNN + { + \exp_not:o { \tl_if_head_is_group:nTF {#1} } + \exp_not:N \__tl_act_group:nwNNN + \exp_not:N \__tl_act_normal:NwNNN + } + \exp_not:n {#1} \s__tl_act_stop + } +\cs_undefine:N \__tl_act_if_head_is_space:nTF +\cs_new:Npn \__tl_act_normal:NwNNN #1 #2 \s__tl_act_stop #3 + { + #3 #1 + \__tl_act_loop:w #2 \s__tl_act_stop + #3 + } +\cs_new:Npn \__tl_use_none_delimit_by_s_act_stop:w #1 \s__tl_act_stop { } +\cs_new:Npn \__tl_act_end:wn #1 \__tl_act_result:n #2 + { \group_align_safe_end: \exp_end: #2 } +\cs_new:Npn \__tl_act_group:nwNNN #1 #2 \s__tl_act_stop #3#4#5 + { + \__tl_use_none_delimit_by_s_act_stop:w #1 \__tl_act_end:wn \s__tl_act_stop + #5 {#1} + \__tl_act_loop:w #2 \s__tl_act_stop + #3 #4 #5 + } +\exp_last_unbraced:NNo + \cs_new:Npn \__tl_act_space:wwNNN \c_space_tl #1 \s__tl_act_stop #2#3 + { + #3 + \__tl_act_loop:w #1 \s__tl_act_stop + #2 #3 + } +\cs_new:Npn \__tl_act:NNNn #1#2#3#4 + { + \group_align_safe_begin: + \__tl_act_loop:w #4 { \s__tl_act_stop } ? \s__tl_act_stop + #1 #3 #2 + \__tl_act_result:n { } + } +\cs_new:Npn \__tl_act_output:n #1 #2 \__tl_act_result:n #3 + { #2 \__tl_act_result:n { #3 #1 } } +\cs_new:Npn \__tl_act_reverse_output:n #1 #2 \__tl_act_result:n #3 + { #2 \__tl_act_result:n { #1 #3 } } +\cs_new:Npn \tl_reverse:n #1 + { + \__kernel_exp_not:w \exp_after:wN + { + \exp:w + \__tl_act:NNNn + \__tl_reverse_normal:N + \__tl_reverse_group_preserve:n + \__tl_reverse_space: + {#1} + } + } +\cs_generate_variant:Nn \tl_reverse:n { o , V } +\cs_new:Npn \__tl_reverse_normal:N + { \__tl_act_reverse_output:n } +\cs_new:Npn \__tl_reverse_group_preserve:n #1 + { \__tl_act_reverse_output:n { {#1} } } +\cs_new:Npn \__tl_reverse_space: + { \__tl_act_reverse_output:n { ~ } } +\cs_new_protected:Npn \tl_reverse:N #1 + { \__kernel_tl_set:Nx #1 { \exp_args:No \tl_reverse:n { #1 } } } +\cs_new_protected:Npn \tl_greverse:N #1 + { \__kernel_tl_gset:Nx #1 { \exp_args:No \tl_reverse:n { #1 } } } +\cs_generate_variant:Nn \tl_reverse:N { c } +\cs_generate_variant:Nn \tl_greverse:N { c } \cs_new:Npn \tl_item:nn #1#2 { \exp_args:Nf \__tl_item:nn @@ -4630,7 +4727,10 @@ \cs_new_protected:Npn \__tl_show:NN #1#2 { \__kernel_chk_defined:NT #2 - { \exp_args:Nx #1 { \token_to_str:N #2 = \exp_not:o {#2} } } + { + \exp_args:Ne #1 + { \token_to_str:N #2 = \__kernel_exp_not:w \exp_after:wN {#2} } + } } \cs_new_protected:Npn \tl_show:n #1 { \iow_wrap:nnnN { >~ \tl_to_str:n {#1} . } { } { } \__tl_show:n } @@ -4656,6 +4756,7 @@ \tl_new:N \g_tmpb_tl \tl_new:N \l_tmpa_tl \tl_new:N \l_tmpb_tl +\cs_undefine:N \__tl_tmp:w %% File: l3str.dtx \scan_new:N \s__str_mark \scan_new:N \s__str_stop @@ -4717,13 +4818,13 @@ { } \group_end: \cs_new_protected:Npn \str_replace_once:Nnn - { \__str_replace:NNNnn \prg_do_nothing: \tl_set:Nx } + { \__str_replace:NNNnn \prg_do_nothing: \__kernel_tl_set:Nx } \cs_new_protected:Npn \str_greplace_once:Nnn - { \__str_replace:NNNnn \prg_do_nothing: \tl_gset:Nx } + { \__str_replace:NNNnn \prg_do_nothing: \__kernel_tl_gset:Nx } \cs_new_protected:Npn \str_replace_all:Nnn - { \__str_replace:NNNnn \__str_replace_next:w \tl_set:Nx } + { \__str_replace:NNNnn \__str_replace_next:w \__kernel_tl_set:Nx } \cs_new_protected:Npn \str_greplace_all:Nnn - { \__str_replace:NNNnn \__str_replace_next:w \tl_gset:Nx } + { \__str_replace:NNNnn \__str_replace_next:w \__kernel_tl_gset:Nx } \cs_generate_variant:Nn \str_replace_once:Nnn { c } \cs_generate_variant:Nn \str_greplace_once:Nnn { c } \cs_generate_variant:Nn \str_replace_all:Nnn { c } @@ -5318,22 +5419,22 @@ \cs_new_eq:NN \seq_gset_eq:cc \tl_gset_eq:cc \cs_new_protected:Npn \seq_set_from_clist:NN #1#2 { - \tl_set:Nx #1 + \__kernel_tl_set:Nx #1 { \s__seq \clist_map_function:NN #2 \__seq_wrap_item:n } } \cs_new_protected:Npn \seq_set_from_clist:Nn #1#2 { - \tl_set:Nx #1 + \__kernel_tl_set:Nx #1 { \s__seq \clist_map_function:nN {#2} \__seq_wrap_item:n } } \cs_new_protected:Npn \seq_gset_from_clist:NN #1#2 { - \tl_gset:Nx #1 + \__kernel_tl_gset:Nx #1 { \s__seq \clist_map_function:NN #2 \__seq_wrap_item:n } } \cs_new_protected:Npn \seq_gset_from_clist:Nn #1#2 { - \tl_gset:Nx #1 + \__kernel_tl_gset:Nx #1 { \s__seq \clist_map_function:nN {#2} \__seq_wrap_item:n } } \cs_generate_variant:Nn \seq_set_from_clist:NN { Nc } @@ -5349,9 +5450,9 @@ } \cs_generate_variant:Nn \seq_const_from_clist:Nn { c } \cs_new_protected:Npn \seq_set_split:Nnn - { \__seq_set_split:NNnn \tl_set:Nx } + { \__seq_set_split:NNnn \__kernel_tl_set:Nx } \cs_new_protected:Npn \seq_gset_split:Nnn - { \__seq_set_split:NNnn \tl_gset:Nx } + { \__seq_set_split:NNnn \__kernel_tl_gset:Nx } \cs_new_protected:Npn \__seq_set_split:NNnn #1#2#3#4 { \tl_if_empty:nTF {#3} @@ -5371,7 +5472,7 @@ \__seq_set_split_end: \__seq_set_split_auxi:w \prg_do_nothing: } - \tl_set:Nx \l__seq_internal_a_tl { \l__seq_internal_a_tl } + \__kernel_tl_set:Nx \l__seq_internal_a_tl { \l__seq_internal_a_tl } } #1 #2 { \s__seq \l__seq_internal_a_tl } } @@ -5397,7 +5498,7 @@ { TF , T , F , p } \cs_new_protected:Npn \seq_put_left:Nn #1#2 { - \tl_set:Nx #1 + \__kernel_tl_set:Nx #1 { \exp_not:n { \s__seq \__seq_item:n {#2} } \exp_not:f { \exp_after:wN \__seq_put_left_aux:w #1 } @@ -5405,7 +5506,7 @@ } \cs_new_protected:Npn \seq_gput_left:Nn #1#2 { - \tl_gset:Nx #1 + \__kernel_tl_gset:Nx #1 { \exp_not:n { \s__seq \__seq_item:n {#2} } \exp_not:f { \exp_after:wN \__seq_put_left_aux:w #1 } @@ -5443,9 +5544,9 @@ \cs_generate_variant:Nn \seq_remove_duplicates:N { c } \cs_generate_variant:Nn \seq_gremove_duplicates:N { c } \cs_new_protected:Npn \seq_remove_all:Nn - { \__seq_remove_all_aux:NNn \tl_set:Nx } + { \__seq_remove_all_aux:NNn \__kernel_tl_set:Nx } \cs_new_protected:Npn \seq_gremove_all:Nn - { \__seq_remove_all_aux:NNn \tl_gset:Nx } + { \__seq_remove_all_aux:NNn \__kernel_tl_gset:Nx } \cs_new_protected:Npn \__seq_remove_all_aux:NNn #1#2#3 { \__seq_push_item_def:n @@ -5469,9 +5570,9 @@ \cs_generate_variant:Nn \seq_remove_all:Nn { c } \cs_generate_variant:Nn \seq_gremove_all:Nn { c } \cs_new_protected:Npn \seq_reverse:N - { \__seq_reverse:NN \tl_set:Nx } + { \__seq_reverse:NN \__kernel_tl_set:Nx } \cs_new_protected:Npn \seq_greverse:N - { \__seq_reverse:NN \tl_gset:Nx } + { \__seq_reverse:NN \__kernel_tl_gset:Nx } \cs_new_protected:Npn \__seq_reverse:NN #1 #2 { \cs_set_eq:NN \__seq_tmp:w \__seq_item:n @@ -5584,7 +5685,7 @@ } \cs_new_protected:Npn \seq_get_left:NN #1#2 { - \tl_set:Nx #2 + \__kernel_tl_set:Nx #2 { \exp_after:wN \__seq_get_left:wnw #1 \__seq_item:n { \q_no_value } \s__seq_stop @@ -5609,7 +5710,7 @@ \cs_generate_variant:Nn \seq_gpop_left:NN { c } \cs_new_protected:Npn \seq_get_right:NN #1#2 { - \tl_set:Nx #2 + \__kernel_tl_set:Nx #2 { \exp_after:wN \use_i_ii:nnn \exp_after:wN \__seq_get_right_loop:nw @@ -5626,9 +5727,9 @@ \cs_new:Npn \__seq_get_right_end:NnN #1#2#3 { \exp_not:n {#2} } \cs_generate_variant:Nn \seq_get_right:NN { c } \cs_new_protected:Npn \seq_pop_right:NN - { \__seq_pop:NNNN \__seq_pop_right:NNN \tl_set:Nx } + { \__seq_pop:NNNN \__seq_pop_right:NNN \__kernel_tl_set:Nx } \cs_new_protected:Npn \seq_gpop_right:NN - { \__seq_pop:NNNN \__seq_pop_right:NNN \tl_gset:Nx } + { \__seq_pop:NNNN \__seq_pop_right:NNN \__kernel_tl_gset:Nx } \cs_new_protected:Npn \__seq_pop_right:NNN #1#2#3 { \cs_set_eq:NN \__seq_tmp:w \__seq_item:n @@ -5640,7 +5741,7 @@ #2 { \if_false: { \fi: } - \tl_set:Nx #3 + \__kernel_tl_set:Nx #3 } { } \use_none:nn \cs_set_eq:NN \__seq_item:n \__seq_tmp:w @@ -5668,10 +5769,10 @@ { \__seq_pop_TF:NNNN \__seq_pop_left:NNN \tl_gset:Nn #1 #2 } \prg_new_protected_conditional:Npnn \seq_pop_right:NN #1#2 { T , F , TF } - { \__seq_pop_TF:NNNN \__seq_pop_right:NNN \tl_set:Nx #1 #2 } + { \__seq_pop_TF:NNNN \__seq_pop_right:NNN \__kernel_tl_set:Nx #1 #2 } \prg_new_protected_conditional:Npnn \seq_gpop_right:NN #1#2 { T , F , TF } - { \__seq_pop_TF:NNNN \__seq_pop_right:NNN \tl_gset:Nx #1 #2 } + { \__seq_pop_TF:NNNN \__seq_pop_right:NNN \__kernel_tl_gset:Nx #1 #2 } \prg_generate_conditional_variant:Nnn \seq_pop_left:NN { c } { T , F , TF } \prg_generate_conditional_variant:Nnn \seq_gpop_left:NN { c } @@ -5819,9 +5920,9 @@ \int_value:w \int_eval:w 1 + #2 ; } \cs_new_protected:Npn \seq_set_map_x:NNn - { \__seq_set_map_x:NNNn \tl_set:Nx } + { \__seq_set_map_x:NNNn \__kernel_tl_set:Nx } \cs_new_protected:Npn \seq_gset_map_x:NNn - { \__seq_set_map_x:NNNn \tl_gset:Nx } + { \__seq_set_map_x:NNNn \__kernel_tl_gset:Nx } \cs_new_protected:Npn \__seq_set_map_x:NNNn #1#2#3#4 { \__seq_push_item_def:n { \exp_not:N \__seq_item:n {#4} } @@ -5829,9 +5930,9 @@ \__seq_pop_item_def: } \cs_new_protected:Npn \seq_set_map:NNn - { \__seq_set_map:NNNn \tl_set:Nx } + { \__seq_set_map:NNNn \__kernel_tl_set:Nx } \cs_new_protected:Npn \seq_gset_map:NNn - { \__seq_set_map:NNNn \tl_gset:Nx } + { \__seq_set_map:NNNn \__kernel_tl_gset:Nx } \cs_new_protected:Npn \__seq_set_map:NNNn #1#2#3#4 { \__seq_push_item_def:n { \exp_not:n { \__seq_item:n {#4} } } @@ -7478,7 +7579,7 @@ \tl_new:N \g__sys_backend_tl \__sys_finalise:n { - \tl_gset:Nx \g__sys_backend_tl + \__kernel_tl_gset:Nx \g__sys_backend_tl { \sys_if_engine_xetex:TF { xdvipdfmx } @@ -7594,9 +7695,9 @@ \cs_new_eq:NN \clist_gset_eq:cN \tl_gset_eq:cN \cs_new_eq:NN \clist_gset_eq:cc \tl_gset_eq:cc \cs_new_protected:Npn \clist_set_from_seq:NN - { \__clist_set_from_seq:NNNN \clist_clear:N \tl_set:Nx } + { \__clist_set_from_seq:NNNN \clist_clear:N \__kernel_tl_set:Nx } \cs_new_protected:Npn \clist_gset_from_seq:NN - { \__clist_set_from_seq:NNNN \clist_gclear:N \tl_gset:Nx } + { \__clist_set_from_seq:NNNN \clist_gclear:N \__kernel_tl_gset:Nx } \cs_new_protected:Npn \__clist_set_from_seq:NNNN #1#2#3#4 { \seq_if_empty:NTF #4 @@ -7621,9 +7722,9 @@ \cs_generate_variant:Nn \clist_gset_from_seq:NN { Nc } \cs_generate_variant:Nn \clist_gset_from_seq:NN { c , cc } \cs_new_protected:Npn \clist_concat:NNN - { \__clist_concat:NNNN \tl_set:Nx } + { \__clist_concat:NNNN \__kernel_tl_set:Nx } \cs_new_protected:Npn \clist_gconcat:NNN - { \__clist_concat:NNNN \tl_gset:Nx } + { \__clist_concat:NNNN \__kernel_tl_gset:Nx } \cs_new_protected:Npn \__clist_concat:NNNN #1#2#3#4 { #1 #2 @@ -7640,9 +7741,9 @@ \prg_new_eq_conditional:NNn \clist_if_exist:c \cs_if_exist:c { TF , T , F , p } \cs_new_protected:Npn \clist_set:Nn #1#2 - { \tl_set:Nx #1 { \__clist_sanitize:n {#2} } } + { \__kernel_tl_set:Nx #1 { \__clist_sanitize:n {#2} } } \cs_new_protected:Npn \clist_gset:Nn #1#2 - { \tl_gset:Nx #1 { \__clist_sanitize:n {#2} } } + { \__kernel_tl_gset:Nx #1 { \__clist_sanitize:n {#2} } } \cs_generate_variant:Nn \clist_set:Nn { NV , No , Nx , c , cV , co , cx } \cs_generate_variant:Nn \clist_gset:Nn { NV , No , Nx , c , cV , co , cx } \cs_new_protected:Npn \clist_put_left:Nn @@ -7683,9 +7784,9 @@ { \tl_set:Nn #3 {#1} } \cs_generate_variant:Nn \clist_get:NN { c } \cs_new_protected:Npn \clist_pop:NN - { \__clist_pop:NNN \tl_set:Nx } + { \__clist_pop:NNN \__kernel_tl_set:Nx } \cs_new_protected:Npn \clist_gpop:NN - { \__clist_pop:NNN \tl_gset:Nx } + { \__clist_pop:NNN \__kernel_tl_gset:Nx } \cs_new_protected:Npn \__clist_pop:NNN #1#2#3 { \if_meaning:w #2 \c_empty_clist @@ -7719,9 +7820,9 @@ } \prg_generate_conditional_variant:Nnn \clist_get:NN { c } { T , F , TF } \prg_new_protected_conditional:Npnn \clist_pop:NN #1#2 { T , F , TF } - { \__clist_pop_TF:NNN \tl_set:Nx #1 #2 } + { \__clist_pop_TF:NNN \__kernel_tl_set:Nx #1 #2 } \prg_new_protected_conditional:Npnn \clist_gpop:NN #1#2 { T , F , TF } - { \__clist_pop_TF:NNN \tl_gset:Nx #1 #2 } + { \__clist_pop_TF:NNN \__kernel_tl_gset:Nx #1 #2 } \cs_new_protected:Npn \__clist_pop_TF:NNN #1#2#3 { \if_meaning:w #2 \c_empty_clist @@ -7768,9 +7869,9 @@ \cs_generate_variant:Nn \clist_remove_duplicates:N { c } \cs_generate_variant:Nn \clist_gremove_duplicates:N { c } \cs_new_protected:Npn \clist_remove_all:Nn - { \__clist_remove_all:NNNn \clist_set_from_seq:NN \tl_set:Nx } + { \__clist_remove_all:NNNn \clist_set_from_seq:NN \__kernel_tl_set:Nx } \cs_new_protected:Npn \clist_gremove_all:Nn - { \__clist_remove_all:NNNn \clist_gset_from_seq:NN \tl_gset:Nx } + { \__clist_remove_all:NNNn \clist_gset_from_seq:NN \__kernel_tl_gset:Nx } \cs_new_protected:Npn \__clist_remove_all:NNNn #1#2#3#4 { \__clist_if_wrap:nTF {#4} @@ -7807,9 +7908,9 @@ \cs_generate_variant:Nn \clist_remove_all:Nn { c } \cs_generate_variant:Nn \clist_gremove_all:Nn { c } \cs_new_protected:Npn \clist_reverse:N #1 - { \tl_set:Nx #1 { \exp_args:No \clist_reverse:n {#1} } } + { \__kernel_tl_set:Nx #1 { \exp_args:No \clist_reverse:n {#1} } } \cs_new_protected:Npn \clist_greverse:N #1 - { \tl_gset:Nx #1 { \exp_args:No \clist_reverse:n {#1} } } + { \__kernel_tl_gset:Nx #1 { \exp_args:No \clist_reverse:n {#1} } } \cs_generate_variant:Nn \clist_reverse:N { c } \cs_generate_variant:Nn \clist_greverse:N { c } \cs_new:Npn \clist_reverse:n #1 @@ -8306,7 +8407,7 @@ \tl_put_right:Nn \l__char_tmp_tl { ^^@ \if_false: } } \char_set_catcode_group_end:n { 0 } \tl_put_right:Nn \l__char_tmp_tl { { \fi: \exp_not:N \or: ^^@ } % } - \tl_set:Nx \l__char_tmp_tl { \l__char_tmp_tl } + \__kernel_tl_set:Nx \l__char_tmp_tl { \l__char_tmp_tl } \char_set_catcode_math_toggle:n { 0 } \tl_put_right:Nn \l__char_tmp_tl { \or: ^^@ } \char_set_catcode_alignment:n { 0 } @@ -8581,6 +8682,7 @@ { \tl_to_str:n {#2} } } \tl_const:Nx \c_catcode_other_space_tl { \char_generate:nn { `\ } { 12 } } +\scan_new:N \s__token_mark \scan_new:N \s__token_stop \group_begin: \__kernel_chk_if_free_cs:N \c_group_begin_token @@ -8725,6 +8827,7 @@ \__token_tmp:w { char" } \__token_tmp:w { count } \__token_tmp:w { dimen } +\__token_tmp:w { ~ font } \__token_tmp:w { macro } \__token_tmp:w { muskip } \__token_tmp:w { skip } @@ -8772,6 +8875,7 @@ { \tl_to_str:n { \protected } macro } \__token_tmp:w { protected_long_macro } { macro } { \token_to_str:N \protected \tl_to_str:n { \long } macro } +\__token_tmp:w { font_selection } { ~ font } { select ~ font } \__token_tmp:w { dim_register } { dimen } { \token_to_str:N \dimen } \__token_tmp:w { int_register } { count } { \token_to_str:N \count } \__token_tmp:w { muskip_register } { muskip } { \token_to_str:N \muskip } @@ -8848,6 +8952,45 @@ \fi: } } +\cs_new:Npn \token_case_catcode:Nn #1#2 + { \exp:w \__token_case:NNnTF \token_if_eq_catcode:NNTF #1 {#2} { } { } } +\cs_new:Npn \token_case_catcode:NnT #1#2#3 + { \exp:w \__token_case:NNnTF \token_if_eq_catcode:NNTF #1 {#2} {#3} { } } +\cs_new:Npn \token_case_catcode:NnF #1#2 + { \exp:w \__token_case:NNnTF \token_if_eq_catcode:NNTF #1 {#2} { } } +\cs_new:Npn \token_case_catcode:NnTF + { \exp:w \__token_case:NNnTF \token_if_eq_catcode:NNTF } +\cs_new:Npn \token_case_charcode:Nn #1#2 + { \exp:w \__token_case:NNnTF \token_if_eq_charcode:NNTF #1 {#2} { } { } } +\cs_new:Npn \token_case_charcode:NnT #1#2#3 + { \exp:w \__token_case:NNnTF \token_if_eq_charcode:NNTF #1 {#2} {#3} { } } +\cs_new:Npn \token_case_charcode:NnF #1#2 + { \exp:w \__token_case:NNnTF \token_if_eq_charcode:NNTF #1 {#2} { } } +\cs_new:Npn \token_case_charcode:NnTF + { \exp:w \__token_case:NNnTF \token_if_eq_charcode:NNTF } +\cs_new:Npn \token_case_meaning:Nn #1#2 + { \exp:w \__token_case:NNnTF \token_if_eq_meaning:NNTF #1 {#2} { } { } } +\cs_new:Npn \token_case_meaning:NnT #1#2#3 + { \exp:w \__token_case:NNnTF \token_if_eq_meaning:NNTF #1 {#2} {#3} { } } +\cs_new:Npn \token_case_meaning:NnF #1#2 + { \exp:w \__token_case:NNnTF \token_if_eq_meaning:NNTF #1 {#2} { } } +\cs_new:Npn \token_case_meaning:NnTF + { \exp:w \__token_case:NNnTF \token_if_eq_meaning:NNTF } +\cs_new:Npn \__token_case:NNnTF #1#2#3#4#5 + { + \__token_case:NNw #1 #2 #3 #2 { } + \s__token_mark {#4} + \s__token_mark {#5} + \s__token_stop + } +\cs_new:Npn \__token_case:NNw #1#2#3#4 + { + #1 #2 #3 + { \__token_case_end:nw {#4} } + { \__token_case:NNw #1 #2 } + } +\cs_new:Npn \__token_case_end:nw #1#2#3 \s__token_mark #4#5 \s__token_stop + { \exp_end: #1 #4 } \cs_new_eq:NN \l_peek_token ? \cs_new_eq:NN \g_peek_token ? \cs_new_eq:NN \l__peek_search_token ? @@ -9237,8 +9380,8 @@ } \prg_generate_conditional_variant:Nnn \prop_pop:NnN { c } { T , F , TF } \prg_generate_conditional_variant:Nnn \prop_gpop:NnN { c } { T , F , TF } -\cs_new_protected:Npn \prop_put:Nnn { \__prop_put:NNnn \tl_set:Nx } -\cs_new_protected:Npn \prop_gput:Nnn { \__prop_put:NNnn \tl_gset:Nx } +\cs_new_protected:Npn \prop_put:Nnn { \__prop_put:NNnn \__kernel_tl_set:Nx } +\cs_new_protected:Npn \prop_gput:Nnn { \__prop_put:NNnn \__kernel_tl_gset:Nx } \cs_new_protected:Npn \__prop_put:NNnn #1#2#3#4 { \tl_set:Nn \l__prop_internal_tl @@ -9259,9 +9402,9 @@ \cs_generate_variant:Nn \prop_gput:Nnn { c , cnV , cno , cnx , cV , cVV , cVx , cvx , co , coo , cxx } \cs_new_protected:Npn \prop_put_if_new:Nnn - { \__prop_put_if_new:NNnn \tl_set:Nx } + { \__prop_put_if_new:NNnn \__kernel_tl_set:Nx } \cs_new_protected:Npn \prop_gput_if_new:Nnn - { \__prop_put_if_new:NNnn \tl_gset:Nx } + { \__prop_put_if_new:NNnn \__kernel_tl_gset:Nx } \cs_new_protected:Npn \__prop_put_if_new:NNnn #1#2#3#4 { \tl_set:Nn \l__prop_internal_tl @@ -10402,7 +10545,7 @@ { \__ior_open_stream:Nn #1 {#2} } { \__ior_new:N #1 - \tl_set:Nx \l__ior_stream_tl { \int_eval:n {#1} } + \__kernel_tl_set:Nx \l__ior_stream_tl { \int_eval:n {#1} } \__ior_open_stream:Nn #1 {#2} } } @@ -10592,14 +10735,14 @@ \tl_new:N \l__iow_file_name_tl \cs_new_protected:Npn \iow_open:Nn #1#2 { - \tl_set:Nx \l__iow_file_name_tl + \__kernel_tl_set:Nx \l__iow_file_name_tl { \__kernel_file_name_sanitize:n {#2} } \iow_close:N #1 \seq_gpop:NNTF \g__iow_streams_seq \l__iow_stream_tl { \__iow_open_stream:NV #1 \l__iow_file_name_tl } { \__iow_new:N #1 - \tl_set:Nx \l__iow_stream_tl { \int_eval:n {#1} } + \__kernel_tl_set:Nx \l__iow_stream_tl { \int_eval:n {#1} } \__iow_open_stream:NV #1 \l__iow_file_name_tl } } @@ -10675,7 +10818,7 @@ \cs_new:Npn \__iow_unindent:w { } \cs_new_protected:Npn \__iow_set_indent:n #1 { - \tl_set:Nx \l__iow_one_indent_tl + \__kernel_tl_set:Nx \l__iow_one_indent_tl { \exp_args:No \__kernel_str_to_other_fast:n { \tl_to_str:n {#1} } } \int_set:Nn \l__iow_one_indent_int { \str_count:N \l__iow_one_indent_tl } @@ -10750,11 +10893,11 @@ \cs_set_eq:NN \iow_indent:n \__iow_indent:n #3 \cs_set_eq:NN \protect \token_to_str:N - \tl_set:Nx \l__iow_wrap_tl {#1} + \__kernel_tl_set:Nx \l__iow_wrap_tl {#1} \cs_set_eq:NN \iow_allow_break: \__iow_allow_break_error: \cs_set_eq:NN \iow_indent:n \__iow_indent_error:n - \tl_set:Nx \l__iow_newline_tl { \iow_newline: #2 } - \tl_set:Nx \l__iow_newline_tl { \tl_to_str:N \l__iow_newline_tl } + \__kernel_tl_set:Nx \l__iow_newline_tl { \iow_newline: #2 } + \__kernel_tl_set:Nx \l__iow_newline_tl { \tl_to_str:N \l__iow_newline_tl } \int_set:Nn \l__iow_line_target_int { \l_iow_line_count_int - \str_count:N \l__iow_newline_tl + 1 } \int_compare:nNnT { \l__iow_line_target_int } < 0 @@ -10770,12 +10913,12 @@ \cs_generate_variant:Nn \iow_wrap:nnnN { nx } \cs_new_protected:Npn \__iow_wrap_do: { - \tl_set:Nx \l__iow_wrap_tl + \__kernel_tl_set:Nx \l__iow_wrap_tl { \exp_args:No \__kernel_str_to_other_fast:n \l__iow_wrap_tl \c__iow_wrap_end_marker_tl } - \tl_set:Nx \l__iow_wrap_tl + \__kernel_tl_set:Nx \l__iow_wrap_tl { \exp_after:wN \__iow_wrap_fix_newline:w \l__iow_wrap_tl ^^J \q__iow_nil ^^J \s__iow_stop @@ -10933,7 +11076,7 @@ } \cs_new_protected:Npn \__iow_wrap_allow_break:n #1 { - \tl_set:Nx \l__iow_line_tl + \__kernel_tl_set:Nx \l__iow_line_tl { \l__iow_line_tl \__iow_wrap_trim:N \l__iow_line_part_tl } \bool_set_false:N \l__iow_line_break_bool \tl_if_empty:NTF \l__iow_line_part_tl @@ -10953,7 +11096,7 @@ \tl_put_right:Nx \l__iow_line_tl { \l__iow_line_part_tl } \bool_set_false:N \l__iow_line_break_bool \int_sub:Nn \l__iow_indent_int { \l__iow_one_indent_int } - \tl_set:Nx \l__iow_indent_tl + \__kernel_tl_set:Nx \l__iow_indent_tl { \exp_after:wN \__iow_unindent:w \l__iow_indent_tl } \__iow_wrap_chunk:nw {#1} } @@ -10972,9 +11115,9 @@ } \cs_new_protected:Npn \__iow_wrap_store_do:n #1 { - \tl_set:Nx \l__iow_line_tl + \__kernel_tl_set:Nx \l__iow_line_tl { \l__iow_line_tl \l__iow_line_part_tl } - \tl_set:Nx \l__iow_wrap_tl + \__kernel_tl_set:Nx \l__iow_wrap_tl { \l__iow_wrap_tl \l__iow_newline_tl @@ -11268,7 +11411,7 @@ \cs_generate_variant:Nn \file_get_full_name:nN { V } \prg_new_protected_conditional:Npnn \file_get_full_name:nN #1#2 { T , F , TF } { - \tl_set:Nx #2 + \__kernel_tl_set:Nx #2 { \file_full_name:n {#1} } \tl_if_empty:NTF #2 { \prg_return_false: } @@ -11281,7 +11424,7 @@ { \prg_set_protected_conditional:Npnn \file_get_full_name:nN #1#2 { T , F , TF } { - \tl_set:Nx \l__file_base_name_tl + \__kernel_tl_set:Nx \l__file_base_name_tl { \__kernel_file_name_sanitize:n {#1} } \__file_get_full_name_search:nN { } \use:n \seq_map_inline:Nn \l_file_search_path_seq @@ -11316,7 +11459,7 @@ } \cs_new_protected:Npn \__file_get_full_name_search:nN #1#2 { - \tl_set:Nx \l__file_full_name_tl + \__kernel_tl_set:Nx \l__file_full_name_tl { \tl_to_str:n {#1} \l__file_base_name_tl } \__kernel_ior_open:No \g__file_internal_ior \l__file_full_name_tl \ior_if_eof:NF \g__file_internal_ior { #2 { \prg_break: } } @@ -11423,7 +11566,7 @@ { \__file_get_details:nnN {#1} { timestamp } #2 } \cs_new_protected:Npn \__file_get_details:nnN #1#2#3 { - \tl_set:Nx #3 + \__kernel_tl_set:Nx #3 { \use:c { file_ #2 :n } {#1} } \tl_if_empty:NTF #3 { \prg_return_false: } @@ -11457,7 +11600,7 @@ \prg_new_protected_conditional:Npnn \file_get_hex_dump:nnnN #1#2#3#4 { T , F , TF } { - \tl_set:Nx #4 + \__kernel_tl_set:Nx #4 { \file_hex_dump:nnn {#1} {#2} {#3} } \tl_if_empty:NTF #4 { \prg_return_false: } @@ -13083,7 +13226,7 @@ { \clist_clear:N \l__keys_unused_clist \__keys_set_known:nnn {#2} {#3} {#4} - \tl_set:Nx #5 { \exp_not:o \l__keys_unused_clist } + \__kernel_tl_set:Nx #5 { \exp_not:o \l__keys_unused_clist } \tl_set:Nn \l__keys_unused_clist {#1} } \cs_new_protected:Npn \keys_set_known:nn #1#2 @@ -13125,7 +13268,7 @@ { \clist_clear:N \l__keys_unused_clist \__keys_set_filter:nnnn {#2} {#3} {#4} {#5} - \tl_set:Nx #6 { \exp_not:o \l__keys_unused_clist } + \__kernel_tl_set:Nx #6 { \exp_not:o \l__keys_unused_clist } \tl_set:Nn \l__keys_unused_clist {#1} } \cs_new_protected:Npn \keys_set_filter:nnn #1#2#3 @@ -13191,7 +13334,7 @@ } \cs_new_protected:Npn \__keys_set_keyval:nnn #1#2#3 { - \tl_set:Nx \l_keys_path_str + \__kernel_tl_set:Nx \l_keys_path_str { \tl_if_blank:nF {#1} { #1 / } @@ -13389,7 +13532,7 @@ } \cs_new_protected:Npn \__keys_store_unused_aux: { - \tl_set:Nx \l__keys_relative_tl + \__kernel_tl_set:Nx \l__keys_relative_tl { \exp_args:No \__keys_trim_spaces:n \l__keys_relative_tl } \use:x { @@ -13727,6 +13870,39 @@ \exp_after:wN \__intarray_to_clist:w \int_value:w \int_eval:w #1 + \c_one_int ; #2 {#3} } +\cs_new:Npn \__kernel_intarray_range_to_clist:Nnn #1#2#3 + { + \exp_last_unbraced:Nf \use_none:n + { + \exp_after:wN \__intarray_range_to_clist:ww + \int_value:w \int_eval:w #2 \exp_after:wN ; + \int_value:w \int_eval:w #3 ; + #1 \prg_break_point: + } + } +\cs_new:Npn \__intarray_range_to_clist:ww #1 ; #2 ; #3 + { + \if_int_compare:w #1 > #2 \exp_stop_f: + \prg_break:n + \fi: + , \__kernel_intarray_item:Nn #3 {#1} + \exp_after:wN \__intarray_range_to_clist:ww + \int_value:w \int_eval:w #1 + \c_one_int ; #2 ; #3 + } +\cs_new_protected:Npn \__kernel_intarray_gset_range_from_clist:Nnn #1#2#3 + { + \int_set:Nn \l__intarray_loop_int {#2} + \__intarray_gset_range:Nw #1 #3 , , \prg_break_point: + } +\cs_new_protected:Npn \__intarray_gset_range:Nw #1 #2 , + { + \if_catcode:w \scan_stop: \tl_to_str:n {#2} \scan_stop: + \prg_break:n + \fi: + \__kernel_intarray_gset:Nnn #1 \l__intarray_loop_int {#2} + \int_incr:N \l__intarray_loop_int + \__intarray_gset_range:Nw #1 + } \cs_new_protected:Npn \intarray_show:N { \__intarray_show:NN \msg_show:nnxxxx } \cs_generate_variant:Nn \intarray_show:N { c } \cs_new_protected:Npn \intarray_log:N { \__intarray_show:NN \msg_log:nnxxxx } @@ -16027,9 +16203,9 @@ { \cs_new_eq:NN #1 \c_zero_fp } \cs_generate_variant:Nn \fp_new:N {c} \cs_new_protected:Npn \fp_set:Nn #1#2 - { \tl_set:Nx #1 { \exp_not:f { \__fp_parse:n {#2} } } } + { \__kernel_tl_set:Nx #1 { \exp_not:f { \__fp_parse:n {#2} } } } \cs_new_protected:Npn \fp_gset:Nn #1#2 - { \tl_gset:Nx #1 { \exp_not:f { \__fp_parse:n {#2} } } } + { \__kernel_tl_gset:Nx #1 { \exp_not:f { \__fp_parse:n {#2} } } } \cs_new_protected:Npn \fp_const:Nn #1#2 { \tl_const:Nx #1 { \exp_not:f { \__fp_parse:n {#2} } } } \cs_generate_variant:Nn \fp_set:Nn {c} @@ -20461,6 +20637,9 @@ \char_set_catcode_group_end:n { 125 } % right brace \char_set_catcode_space:n { 126 } % tilde \char_set_catcode_invalid:n { 127 } % ^^? + \bool_lazy_or:nnF + { \sys_if_engine_xetex_p: } { \sys_if_engine_luatex_p: } + { \int_step_function:nnN { 128 } { 255 } \char_set_catcode_active:n } \__cctab_gset:n { \c_code_cctab } \group_end: \cctab_const:Nn \c_document_cctab @@ -20629,7 +20808,7 @@ { \group_begin: \__sort_main:NNNn \tl_map_inline:Nn \tl_map_break:n #2 {#3} - \tl_gset:Nx \g__sort_internal_tl + \__kernel_tl_gset:Nx \g__sort_internal_tl { \__sort_tl_toks:w \l__sort_min_int ; } \group_end: #1 #2 \g__sort_internal_tl @@ -21012,7 +21191,7 @@ \fi: } \group_begin: - \tl_set:Nx \l__str_internal_tl { \tl_to_str:n { 0123456789ABCDEF } } + \__kernel_tl_set:Nx \l__str_internal_tl { \tl_to_str:n { 0123456789ABCDEF } } \tl_map_inline:Nn \l__str_internal_tl { \tl_map_inline:Nn \l__str_internal_tl @@ -21057,7 +21236,7 @@ } \cs_new_protected:Npn \__str_convert_gmap:N #1 { - \tl_gset:Nx \g__str_result_tl + \__kernel_tl_gset:Nx \g__str_result_tl { \exp_after:wN \__str_convert_gmap_loop:NN \exp_after:wN #1 @@ -21073,7 +21252,7 @@ } \cs_new_protected:Npn \__str_convert_gmap_internal:N #1 { - \tl_gset:Nx \g__str_result_tl + \__kernel_tl_gset:Nx \g__str_result_tl { \exp_after:wN \__str_convert_gmap_internal_loop:Nww \exp_after:wN #1 @@ -21123,7 +21302,7 @@ { \group_begin: #1 - \tl_gset:Nx \g__str_result_tl { \__kernel_str_to_other_fast:n {#4} } + \__kernel_tl_gset:Nx \g__str_result_tl { \__kernel_str_to_other_fast:n {#4} } \exp_after:wN \__str_convert:wwwnn \tl_to_str:n {#5} /// \s__str_stop { decode } { unescape } @@ -21269,7 +21448,7 @@ \cs_new_protected:Npn \__str_convert_unescape_: { \flag_clear:n { str_byte } - \tl_gset:Nx \g__str_result_tl + \__kernel_tl_gset:Nx \g__str_result_tl { \exp_args:No \__str_filter_bytes:n \g__str_result_tl } \__str_if_flag_error:nnx { str_byte } { non-byte } { bytes } } @@ -21321,7 +21500,7 @@ \cs_new_protected:Npn \__str_convert_decode_clist: { \clist_gset:No \g__str_result_tl \g__str_result_tl - \tl_gset:Nx \g__str_result_tl + \__kernel_tl_gset:Nx \g__str_result_tl { \exp_args:No \clist_map_function:nN \g__str_result_tl \__str_decode_clist_char:n @@ -21332,7 +21511,7 @@ \cs_new_protected:Npn \__str_convert_encode_clist: { \__str_convert_gmap_internal:N \__str_encode_clist_char:n - \tl_gset:Nx \g__str_result_tl { \tl_tail:N \g__str_result_tl } + \__kernel_tl_gset:Nx \g__str_result_tl { \tl_tail:N \g__str_result_tl } } \cs_new:Npn \__str_encode_clist_char:n #1 { , #1 } \cs_new_protected:Npn \__str_declare_eight_bit_encoding:nnnn #1 @@ -21490,7 +21669,7 @@ \group_begin: \flag_clear:n { str_error } \int_set:Nn \tex_escapechar:D { 92 } - \tl_gset:Nx \g__str_result_tl + \__kernel_tl_gset:Nx \g__str_result_tl { \__str_output_byte:w " \exp_last_unbraced:Nf \__str_unescape_hex_auxi:N @@ -21539,7 +21718,7 @@ \flag_clear:n { str_byte } \flag_clear:n { str_error } \int_set:Nn \tex_escapechar:D { 92 } - \tl_gset:Nx \g__str_result_tl + \__kernel_tl_gset:Nx \g__str_result_tl { \exp_after:wN #3 \g__str_result_tl #1 ? { ? \prg_break: } @@ -21592,13 +21771,13 @@ \flag_clear:n { str_byte } \flag_clear:n { str_error } \int_set:Nn \tex_escapechar:D { 92 } - \tl_gset:Nx \g__str_result_tl + \__kernel_tl_gset:Nx \g__str_result_tl { \exp_after:wN \__str_unescape_string_newlines:wN \g__str_result_tl \prg_break: ^^M ? \prg_break_point: } - \tl_gset:Nx \g__str_result_tl + \__kernel_tl_gset:Nx \g__str_result_tl { \exp_after:wN \__str_unescape_string_loop:wNNN \g__str_result_tl #1 ?? { ? \prg_break: } @@ -21829,7 +22008,7 @@ \flag_clear:n { str_extra } \flag_clear:n { str_overlong } \flag_clear:n { str_overflow } - \tl_gset:Nx \g__str_result_tl + \__kernel_tl_gset:Nx \g__str_result_tl { \exp_after:wN \__str_decode_utf_viii_start:N \g__str_result_tl { \prg_break: \__str_decode_utf_viii_end: } @@ -22029,7 +22208,7 @@ \flag_clear:n { str_extra } \flag_clear:n { str_end } \cs_set:Npn \__str_tmp:w ##1 ##2 { ` ## #1 } - \tl_gset:Nx \g__str_result_tl + \__kernel_tl_gset:Nx \g__str_result_tl { \exp_after:wN \__str_decode_utf_xvi_pair:NN #2 \q__str_nil \q__str_nil @@ -22186,7 +22365,7 @@ \flag_clear:n { str_end } \flag_clear:n { str_error } \cs_set:Npn \__str_tmp:w ##1 ##2 { ` ## #1 } - \tl_gset:Nx \g__str_result_tl + \__kernel_tl_gset:Nx \g__str_result_tl { \exp_after:wN \__str_decode_utf_xxxii_loop:NNNN #2 \s__str_stop \s__str_stop \s__str_stop \s__str_stop @@ -22270,6 +22449,23 @@ \scan_new:N \s__tl \cs_new_eq:NN \l__tl_analysis_token ? \cs_new_eq:NN \l__tl_analysis_char_token ? +\cs_new_eq:NN \l__tl_analysis_next_token ? +\tl_new:N \l__tl_peek_code_tl +\group_begin: +\char_set_active_eq:NN \ \scan_stop: +\tl_const:Nx \c__tl_peek_catcodes_tl + { + \char_generate:nn { 32 } { 3 } 3 + \char_generate:nn { 32 } { 4 } 4 + # \char_generate:nn { 32 } { 6 } 6 + \char_generate:nn { 32 } { 7 } 7 + \char_generate:nn { 32 } { 8 } 8 + \c_space_tl \token_to_str:N A + \char_generate:nn { 32 } { 11 } \token_to_str:N B + \char_generate:nn { 32 } { 12 } \token_to_str:N C + \char_generate:nn { 32 } { 13 } \token_to_str:N D + } +\group_end: \int_new:N \l__tl_analysis_normal_int \int_new:N \l__tl_analysis_index_int \int_new:N \l__tl_analysis_nesting_int @@ -22466,7 +22662,7 @@ } \cs_new_protected:Npn \__tl_analysis_b:n #1 { - \tl_gset:Nx \g__tl_analysis_result_tl + \__kernel_tl_gset:Nx \g__tl_analysis_result_tl { \__tl_analysis_b_loop:w 0; #1 \prg_break_point: @@ -22688,56 +22884,279 @@ { #1 ~ ( #4 #2 #3 ) } } \cs_generate_variant:Nn \__tl_analysis_show_long_aux:nnnn { oof } -\tl_const:Nx \c__tl_analysis_show_etc_str % ( - { \token_to_str:N \ETC.) } -\__kernel_msg_new:nnn { kernel } { show-tl-analysis } +\cs_new:Npn \peek_analysis_map_break: + { \prg_map_break:Nn \peek_analysis_map_break: { } } +\cs_new:Npn \peek_analysis_map_break:n + { \prg_map_break:Nn \peek_analysis_map_break: } +\int_new:N \l__tl_peek_charcode_int +\cs_new:Npn \__tl_analysis_char_arg:Nw { - The~token~list~ \tl_if_empty:nF {#1} { #1 ~ } - \tl_if_empty:nTF {#2} - { is~empty } - { contains~the~tokens: #2 } + \if_meaning:w \l__tl_analysis_token \c_space_token + \exp_after:wN \__tl_analysis_char_arg_aux:Nw + \fi: } -%% File: l3regex.dtx -\cs_new_eq:NN \__regex_int_eval:w \tex_numexpr:D -\cs_new_protected:Npn \__regex_standard_escapechar: - { \int_set:Nn \tex_escapechar:D { `\\ } } -\cs_new:Npn \__regex_toks_use:w { \tex_the:D \tex_toks:D } -\cs_new_protected:Npn \__regex_toks_clear:N #1 - { \__regex_toks_set:Nn #1 { } } -\cs_new_eq:NN \__regex_toks_set:Nn \tex_toks:D -\cs_new_protected:Npn \__regex_toks_set:No #1 - { \__regex_toks_set:Nn #1 \exp_after:wN } -\cs_new_protected:Npn \__regex_toks_memcpy:NNn #1#2#3 +\cs_new:Npn \__tl_analysis_char_arg_aux:Nw #1 ~ { #1 { ~ } } +\cs_new_protected:Npn \peek_analysis_map_inline:n #1 { - \prg_replicate:nn {#3} + \int_gincr:N \g__kernel_prg_map_int + \cs_set_protected:cpn + { __tl_analysis_map_ \int_use:N \g__kernel_prg_map_int :nnN } + ##1##2##3 { - \tex_toks:D #1 = \tex_toks:D #2 - \int_incr:N #1 - \int_incr:N #2 + \group_end: + #1 + \__tl_peek_analysis_loop:NNn + \prg_break_point:Nn \peek_analysis_map_break: { } } + \__tl_peek_analysis_loop:NNn ? ? ? } -\cs_new_protected:Npn \__regex_toks_put_left:Nx #1#2 +\cs_new_protected:Npn \__tl_peek_analysis_loop:NNn #1#2#3 { - \cs_set:Npx \__regex_tmp:w { #2 } - \tex_toks:D #1 \exp_after:wN \exp_after:wN \exp_after:wN - { \exp_after:wN \__regex_tmp:w \tex_the:D \tex_toks:D #1 } + \group_begin: + \tl_set:Nx \l__tl_peek_code_tl + { + \exp_not:c + { __tl_analysis_map_ \int_use:N \g__kernel_prg_map_int :nnN } + } + \int_set:Nn \tex_escapechar:D { `\\ } + \peek_after:Nw \__tl_peek_analysis_test: } -\cs_new_protected:Npn \__regex_toks_put_right:Nx #1#2 +\cs_new_protected:Npn \__tl_peek_analysis_test: { - \cs_set:Npx \__regex_tmp:w {#2} - \tex_toks:D #1 \exp_after:wN - { \tex_the:D \tex_toks:D \exp_after:wN #1 \__regex_tmp:w } + \if_int_odd:w + \if_catcode:w \exp_not:N \l_peek_token { 0 \exp_stop_f: \fi: + \if_catcode:w \exp_not:N \l_peek_token } 0 \exp_stop_f: \fi: + \if_meaning:w \l_peek_token \c_space_token 0 \exp_stop_f: \fi: + 1 \exp_stop_f: + \exp_after:wN \exp_after:wN + \exp_after:wN \__tl_peek_analysis_normal:N + \exp_after:wN \exp_not:N + \else: + \exp_after:wN \__tl_peek_analysis_special: + \fi: } -\cs_new_protected:Npn \__regex_toks_put_right:Nn #1#2 - { \tex_toks:D #1 \exp_after:wN { \tex_the:D \tex_toks:D #1 #2 } } -\cs_new:Npn \__regex_curr_cs_to_str: +\cs_new_protected:Npn \__tl_peek_analysis_normal:N #1 { - \exp_after:wN \exp_after:wN \exp_after:wN \cs_to_str:N - \tex_the:D \tex_toks:D \l__regex_curr_pos_int - } -\cs_new:Npn \__regex_tmp:w { } -\tl_new:N \l__regex_internal_a_tl -\tl_new:N \l__regex_internal_b_tl + \exp_after:wN \reverse_if:N \exp_after:wN \if_meaning:w + \exp_not:N #1 #1 + \tex_let:D #1 \scan_stop: + \tl_put_right:Nn \l__tl_peek_code_tl { { \exp_not:N #1 } } + \else: + \tl_put_right:Nn \l__tl_peek_code_tl { { \exp_not:n {#1} } } + \fi: + \if_charcode:w + \scan_stop: + \exp_after:wN \use_none:n \token_to_str:N #1 \prg_do_nothing: + \scan_stop: + \exp_after:wN \__tl_peek_analysis_char:N + \exp_after:wN #1 + \else: + \exp_after:wN \__tl_peek_analysis_cs: + \fi: + } +\cs_new_protected:Npn \__tl_peek_analysis_cs: + { \l__tl_peek_code_tl { -1 } 0 } +\cs_new_protected:Npn \__tl_peek_analysis_char:N #1 + { + \char_set_lccode:nn { `#1 } { 32 } + \tex_lowercase:D { \__tl_peek_analysis_char:nN {#1} } #1 + } +\cs_new_protected:Npn \__tl_peek_analysis_char:nN #1#2 + { + \cs_set_protected:Npn \__tl_tmp:w ##1 #1 ##2 ##3 \scan_stop: + { \exp_args:No \l__tl_peek_code_tl { \int_value:w `#2 } ##2 } + \exp_after:wN \__tl_tmp:w \c__tl_peek_catcodes_tl \scan_stop: + } +\cs_new_protected:Npn \__tl_peek_analysis_special: + { + \tex_let:D \l__tl_analysis_token = ~ \l_peek_token + \int_set:Nn \l__tl_peek_charcode_int + { \__tl_analysis_extract_charcode: } + \if_int_compare:w \l__tl_peek_charcode_int = \tex_escapechar:D + \int_set:Nn \tex_escapechar:D { `\/ } + \fi: + \char_set_active_eq:nN { \l__tl_peek_charcode_int } \scan_stop: + \char_set_active_eq:nN { \tex_escapechar:D } \scan_stop: + \cs_set_eq:cN { } \scan_stop: + \tex_futurelet:D \l__tl_analysis_token + \__tl_peek_analysis_retest: + } +\cs_new_protected:Npn \__tl_peek_analysis_retest: + { + \if_meaning:w \l__tl_analysis_token \scan_stop: + \exp_after:wN \__tl_peek_analysis_normal:N + \else: + \exp_after:wN \__tl_peek_analysis_next: + \fi: + } +\cs_new_protected:Npn \__tl_peek_analysis_next: + { + \tl_if_empty:oT { \tex_the:D \tex_everyeof:D } + { \tex_everyeof:D { \scan_stop: } } + \tex_afterassignment:D \__tl_peek_analysis_str: + \tex_futurelet:D \l__tl_analysis_next_token + } +\cs_new_protected:Npn \__tl_peek_analysis_str: + { + \exp_after:wN \tex_futurelet:D + \exp_after:wN \l__tl_analysis_token + \exp_after:wN \__tl_peek_analysis_str:w + \token_to_str:N + } +\cs_new_protected:Npn \__tl_peek_analysis_str:w + { \__tl_analysis_char_arg:Nw \__tl_peek_analysis_str:n } +\cs_new_protected:Npn \__tl_peek_analysis_str:n #1 + { + \int_case:nnF { `#1 } + { + { \l__tl_peek_charcode_int } + { \__tl_peek_analysis_explicit:n {#1} } + { \tex_escapechar:D } { \__tl_peek_analysis_escape: } + } + { \__tl_peek_analysis_active_str:n {#1} } + } +\cs_new_protected:Npn \__tl_peek_analysis_active_str:n #1 + { + \tl_put_right:Nx \l__tl_peek_code_tl + { + { \char_generate:nn { `#1 } { 13 } } + { \int_value:w `#1 } + \token_to_str:N D + } + \l__tl_peek_code_tl + } +\cs_new_protected:Npn \__tl_peek_analysis_explicit:n #1 + { + \tl_put_right:Nx \l__tl_peek_code_tl + { + \if_meaning:w \l_peek_token \c_space_token + { ~ } { 32 } \token_to_str:N A + \else: + \if_catcode:w \l_peek_token \c_group_begin_token + { + \exp_not:N \exp_after:wN + \char_generate:nn { `#1 } { 1 } + \exp_not:N \if_false: + \if_false: { \fi: } + \exp_not:N \fi: + } + { \int_value:w `#1 } + 1 + \else: + { + \exp_not:N \if_false: + { \if_false: } \fi: + \exp_not:N \fi: + \char_generate:nn { `#1 } { 2 } + } + { \int_value:w `#1 } + 2 + \fi: + \fi: + } + \l__tl_peek_code_tl + } +\cs_new_protected:Npn \__tl_peek_analysis_escape: + { + \tl_clear:N \l__tl_internal_a_tl + \tex_futurelet:D \l__tl_analysis_token + \__tl_peek_analysis_collect:w + } +\cs_new_protected:Npn \__tl_peek_analysis_collect:w + { \__tl_analysis_char_arg:Nw \__tl_peek_analysis_collect:n } +\cs_new_protected:Npn \__tl_peek_analysis_collect:n #1 + { + \tl_put_right:Nn \l__tl_internal_a_tl {#1} + \__tl_peek_analysis_collect_loop: + } +\cs_new_protected:Npn \__tl_peek_analysis_collect_loop: + { + \tex_futurelet:D \l__tl_analysis_token + \__tl_peek_analysis_collect_test: + } +\cs_new_protected:Npn \__tl_peek_analysis_collect_test: + { + \if_meaning:w \l__tl_analysis_token \l__tl_analysis_next_token + \exp_after:wN \if_meaning:w \cs:w \l__tl_internal_a_tl \cs_end: \l_peek_token + \__tl_peek_analysis_collect_end:NNN + \fi: + \fi: + \__tl_peek_analysis_collect:w + } +\cs_new_protected:Npn \__tl_peek_analysis_collect_end:NNN #1#2#3 + { + #1 #2 + \tl_put_right:Nx \l__tl_peek_code_tl + { + { \exp_not:N \exp_not:n { \exp_not:c { \l__tl_internal_a_tl } } } + { -1 } + 0 + } + \l__tl_peek_code_tl + } +\tl_const:Nx \c__tl_analysis_show_etc_str % ( + { \token_to_str:N \ETC.) } +\__kernel_msg_new:nnn { kernel } { show-tl-analysis } + { + The~token~list~ \tl_if_empty:nF {#1} { #1 ~ } + \tl_if_empty:nTF {#2} + { is~empty } + { contains~the~tokens: #2 } + } +%% File: l3regex.dtx +\cs_new_eq:NN \__regex_int_eval:w \tex_numexpr:D +\cs_new_protected:Npn \__regex_standard_escapechar: + { \int_set:Nn \tex_escapechar:D { `\\ } } +\cs_new:Npn \__regex_toks_use:w { \tex_the:D \tex_toks:D } +\cs_new_protected:Npn \__regex_toks_clear:N #1 + { \__regex_toks_set:Nn #1 { } } +\cs_new_eq:NN \__regex_toks_set:Nn \tex_toks:D +\cs_new_protected:Npn \__regex_toks_set:No #1 + { \tex_toks:D #1 \exp_after:wN } +\cs_new_protected:Npn \__regex_toks_memcpy:NNn #1#2#3 + { + \prg_replicate:nn {#3} + { + \tex_toks:D #1 = \tex_toks:D #2 + \int_incr:N #1 + \int_incr:N #2 + } + } +\cs_new_protected:Npn \__regex_toks_put_left:Nx #1#2 + { + \cs_set_nopar:Npx \__regex_tmp:w { #2 } + \tex_toks:D #1 \exp_after:wN \exp_after:wN \exp_after:wN + { \exp_after:wN \__regex_tmp:w \tex_the:D \tex_toks:D #1 } + } +\cs_new_protected:Npn \__regex_toks_put_right:Nx #1#2 + { + \cs_set_nopar:Npx \__regex_tmp:w {#2} + \tex_toks:D #1 \exp_after:wN + { \tex_the:D \tex_toks:D \exp_after:wN #1 \__regex_tmp:w } + } +\cs_new_protected:Npn \__regex_toks_put_right:Nn #1#2 + { \tex_toks:D #1 \exp_after:wN { \tex_the:D \tex_toks:D #1 #2 } } +\cs_new:Npn \__regex_curr_cs_to_str: + { + \exp_after:wN \exp_after:wN \exp_after:wN \cs_to_str:N + \l__regex_curr_token_tl + } +\cs_new:Npn \__regex_intarray_item:NnF #1#2 + { \exp_args:Nf \__regex_intarray_item_aux:nNF { \int_eval:n {#2} } #1 } +\cs_new:Npn \__regex_intarray_item_aux:nNF #1#2 + { + \if_int_compare:w #1 > \c_zero_int + \exp_after:wN \use_i:nn + \else: + \exp_after:wN \use_ii:nn + \fi: + { \__kernel_intarray_item:Nn #2 {#1} } + } +\cs_new:Npn \__regex_maplike_break: + { \prg_map_break:Nn \__regex_maplike_break: { } } +\cs_new:Npn \__regex_tmp:w { } +\tl_new:N \l__regex_internal_a_tl +\tl_new:N \l__regex_internal_b_tl \int_new:N \l__regex_internal_a_int \int_new:N \l__regex_internal_b_int \int_new:N \l__regex_internal_c_int @@ -22750,11 +23169,7 @@ \__regex_branch:n { \__regex_class:NnnnN \c_true_bool { } { 1 } { 0 } \c_true_bool } } -\intarray_new:Nn \g__regex_charcode_intarray { 65536 } -\intarray_new:Nn \g__regex_catcode_intarray { 65536 } -\intarray_new:Nn \g__regex_balance_intarray { 65536 } \int_new:N \l__regex_balance_int -\tl_new:N \l__regex_cs_name_tl \int_const:Nn \c__regex_ascii_min_int { 0 } \int_const:Nn \c__regex_ascii_max_control_int { 31 } \int_const:Nn \c__regex_ascii_max_int { 127 } @@ -22867,7 +23282,7 @@ { \int_compare:nNnTF \l__regex_curr_catcode_int = 0 { - \tl_set:Nx \l__regex_internal_a_tl + \__kernel_tl_set:Nx \l__regex_internal_a_tl { \scan_stop: \__regex_curr_cs_to_str: \scan_stop: } \tl_if_in:noTF { \scan_stop: #1 \scan_stop: } \l__regex_internal_a_tl @@ -22880,13 +23295,12 @@ \int_compare:nNnT \l__regex_curr_catcode_int = 0 { \group_begin: - \tl_set:Nx \l__regex_cs_name_tl { \__regex_curr_cs_to_str: } \__regex_single_match: \__regex_disable_submatches: \__regex_build_for_cs:n {#1} \bool_set_eq:NN \l__regex_saved_success_bool \g__regex_success_bool - \exp_args:NV \__regex_match_cs:n \l__regex_cs_name_tl + \exp_args:Nx \__regex_match_cs:n { \__regex_curr_cs_to_str: } \if_meaning:w \c_true_bool \g__regex_success_bool \group_insert_after:N \__regex_break_true:w \fi: @@ -22978,7 +23392,7 @@ \cs_set:Npn \__regex_escape_escaped:N ##1 { #2 } \cs_set:Npn \__regex_escape_raw:N ##1 { #3 } \__regex_standard_escapechar: - \tl_gset:Nx \g__regex_internal_tl + \__kernel_tl_gset:Nx \g__regex_internal_tl { \__kernel_str_to_other_fast:n {#4} } \tl_put_right:Nx \l__regex_internal_a_tl { @@ -23605,48 +24019,39 @@ \__regex_tmp:w w W \cs_new_protected:cpn { __regex_compile_/N: } { \__regex_compile_one:n \__regex_prop_N: } -\cs_new_protected:Npn \__regex_compile_anchor:NF #1#2 +\cs_new_protected:Npn \__regex_compile_anchor_letter:NNN #1#2#3 { - \__regex_if_in_class_or_catcode:TF {#2} + \__regex_if_in_class_or_catcode:TF { \__regex_compile_raw_error:N #1 } { \tl_build_put_right:Nn \l__regex_build_tl - { \__regex_assertion:Nn \c_true_bool { \__regex_anchor:N #1 } } + { \__regex_assertion:Nn #2 {#3} } } } -\cs_set_protected:Npn \__regex_tmp:w #1#2 - { - \cs_new_protected:cpn { __regex_compile_/#1: } - { \__regex_compile_anchor:NF #2 { \__regex_compile_raw_error:N #1 } } - } -\__regex_tmp:w A \l__regex_min_pos_int -\__regex_tmp:w G \l__regex_start_pos_int -\__regex_tmp:w Z \l__regex_max_pos_int -\__regex_tmp:w z \l__regex_max_pos_int -\cs_set_protected:Npn \__regex_tmp:w #1#2 - { - \cs_new_protected:cpn { __regex_compile_#1: } - { \__regex_compile_anchor:NF #2 { \__regex_compile_raw:N #1 } } - } -\exp_args:Nx \__regex_tmp:w { \iow_char:N \^ } \l__regex_min_pos_int -\exp_args:Nx \__regex_tmp:w { \iow_char:N \$ } \l__regex_max_pos_int +\cs_new_protected:cpn { __regex_compile_/A: } + { \__regex_compile_anchor_letter:NNN A \c_true_bool \__regex_A_test: } +\cs_new_protected:cpn { __regex_compile_/G: } + { \__regex_compile_anchor_letter:NNN G \c_true_bool \__regex_G_test: } +\cs_new_protected:cpn { __regex_compile_/Z: } + { \__regex_compile_anchor_letter:NNN Z \c_true_bool \__regex_Z_test: } +\cs_new_protected:cpn { __regex_compile_/z: } + { \__regex_compile_anchor_letter:NNN z \c_true_bool \__regex_Z_test: } \cs_new_protected:cpn { __regex_compile_/b: } - { - \__regex_if_in_class_or_catcode:TF - { \__regex_compile_raw_error:N b } - { - \tl_build_put_right:Nn \l__regex_build_tl - { \__regex_assertion:Nn \c_true_bool { \__regex_b_test: } } - } - } + { \__regex_compile_anchor_letter:NNN b \c_true_bool \__regex_b_test: } \cs_new_protected:cpn { __regex_compile_/B: } + { \__regex_compile_anchor_letter:NNN B \c_false_bool \__regex_b_test: } +\cs_set_protected:Npn \__regex_tmp:w #1#2 { - \__regex_if_in_class_or_catcode:TF - { \__regex_compile_raw_error:N B } + \cs_new_protected:cpn { __regex_compile_#1: } { - \tl_build_put_right:Nn \l__regex_build_tl - { \__regex_assertion:Nn \c_false_bool { \__regex_b_test: } } + \__regex_if_in_class_or_catcode:TF { \__regex_compile_raw:N #1 } + { + \tl_build_put_right:Nn \l__regex_build_tl + { \__regex_assertion:Nn \c_true_bool {#2} } + } } } +\exp_args:Nx \__regex_tmp:w { \iow_char:N \^ } { \__regex_A_test: } +\exp_args:Nx \__regex_tmp:w { \iow_char:N \$ } { \__regex_Z_test: } \cs_new_protected:cpn { __regex_compile_]: } { \__regex_if_in_class:TF @@ -23736,12 +24141,12 @@ \__regex_two_if_eq:NNNNTF #5 #6 \__regex_compile_special:N ^ { \bool_set_false:N \l__regex_internal_bool - \tl_set:Nx \l__regex_internal_a_tl { \if_false: } \fi: + \__kernel_tl_set:Nx \l__regex_internal_a_tl { \if_false: } \fi: \__regex_compile_class_posix_loop:w } { \bool_set_true:N \l__regex_internal_bool - \tl_set:Nx \l__regex_internal_a_tl { \if_false: } \fi: + \__kernel_tl_set:Nx \l__regex_internal_a_tl { \if_false: } \fi: \__regex_compile_class_posix_loop:w #5 #6 } } @@ -24006,7 +24411,7 @@ { \__regex_compile_end: \flag_clear:n { __regex_cs } - \tl_set:Nx \l__regex_internal_a_tl + \__kernel_tl_set:Nx \l__regex_internal_a_tl { \exp_after:wN \__regex_compile_cs_aux:Nn \l__regex_internal_regex \q__regex_nil \q__regex_nil \q__regex_recursion_stop @@ -24067,7 +24472,7 @@ { \__regex_two_if_eq:NNNNTF #1 #2 \__regex_compile_special:N \c_left_brace_str { - \tl_set:Nx \l__regex_internal_a_tl { \if_false: } \fi: + \__kernel_tl_set:Nx \l__regex_internal_a_tl { \if_false: } \fi: \__regex_compile_u_loop:NN } { @@ -24106,7 +24511,7 @@ } \cs_new_protected:Npn \__regex_compile_u_in_cs: { - \tl_gset:Nx \g__regex_internal_tl + \__kernel_tl_gset:Nx \g__regex_internal_tl { \exp_args:No \__kernel_str_to_other_fast:n { \l__regex_internal_a_tl } @@ -24176,7 +24581,9 @@ { \bool_if:NF ##1 { negative~ } assertion:~##2 } } \cs_set:Npn \__regex_b_test: { word~boundary } - \cs_set_eq:NN \__regex_anchor:N \__regex_show_anchor_to_str:N + \cs_set:Npn \__regex_Z_test: { anchor~at~end~(\iow_char:N\\Z) } + \cs_set:Npn \__regex_A_test: { anchor~at~start~(\iow_char:N\\A) } + \cs_set:Npn \__regex_G_test: { anchor~at~start~of~match~(\iow_char:N\\G) } \cs_set_protected:Npn \__regex_item_caseful_equal:n ##1 { \__regex_show_one:n { char~code~\int_eval:n{##1} } } \cs_set_protected:Npn \__regex_item_caseful_range:nn ##1##2 @@ -24277,17 +24684,6 @@ } } } -\cs_new:Npn \__regex_show_anchor_to_str:N #1 - { - anchor~at~ - \str_case:nnF { #1 } - { - { \l__regex_min_pos_int } { start~(\iow_char:N\\A) } - { \l__regex_start_pos_int } { start~of~match~(\iow_char:N\\G) } - { \l__regex_max_pos_int } { end~(\iow_char:N\\Z) } - } - { } - } \cs_new_protected:Npn \__regex_show_item_catcode:NnT #1#2 { \seq_set_split:Nnn \l__regex_internal_seq { } { CBEMTPUDSLOA } @@ -24317,12 +24713,16 @@ \seq_new:N \l__regex_left_state_seq \seq_new:N \l__regex_right_state_seq \int_new:N \l__regex_capturing_group_int -\cs_new_protected:Npn \__regex_build:n #1 +\cs_new_protected:Npn \__regex_build:n + { \__regex_build_aux:Nn \c_true_bool } +\cs_new_protected:Npn \__regex_build:N + { \__regex_build_aux:NN \c_true_bool } +\cs_new_protected:Npn \__regex_build_aux:Nn #1#2 { - \__regex_compile:n {#1} - \__regex_build:N \l__regex_internal_regex + \__regex_compile:n {#2} + \__regex_build_aux:NN #1 \l__regex_internal_regex } -\cs_new_protected:Npn \__regex_build:N #1 +\cs_new_protected:Npn \__regex_build_aux:NN #1#2 { \__regex_standard_escapechar: \int_zero:N \l__regex_capturing_group_int @@ -24330,15 +24730,14 @@ \__regex_build_new_state: \__regex_build_new_state: \__regex_toks_put_right:Nn \l__regex_left_state_int - { \__regex_action_start_wildcard: } - \__regex_group:nnnN {#1} { 1 } { 0 } \c_false_bool + { \__regex_action_start_wildcard:N #1 } + \__regex_group:nnnN {#2} { 1 } { 0 } \c_false_bool \__regex_toks_put_right:Nn \l__regex_right_state_int { \__regex_action_success: } } \cs_new_protected:Npn \__regex_build_for_cs:n #1 { - \int_set_eq:NN \l__regex_min_state_int \l__regex_max_active_int - \int_set_eq:NN \l__regex_max_state_int \l__regex_min_state_int + \int_set_eq:NN \l__regex_min_state_int \l__regex_max_state_int \__regex_build_new_state: \__regex_build_new_state: \__regex_push_lr_states: @@ -24346,7 +24745,7 @@ \__regex_pop_lr_states: \__regex_toks_put_right:Nn \l__regex_right_state_int { - \if_int_compare:w \l__regex_curr_pos_int = \l__regex_max_pos_int + \if_int_compare:w -2 = \l__regex_curr_char_int \exp_after:wN \__regex_action_success: \fi: } @@ -24518,8 +24917,8 @@ \cs_new_protected:Npn \__regex_group_submatches:nNN #1#2#3 { \if_int_compare:w #1 > - 1 \exp_stop_f: - \__regex_toks_put_left:Nx #2 { \__regex_action_submatch:n { #1 < } } - \__regex_toks_put_left:Nx #3 { \__regex_action_submatch:n { #1 > } } + \__regex_toks_put_left:Nx #2 { \__regex_action_submatch:nN {#1} < } + \__regex_toks_put_left:Nx #3 { \__regex_action_submatch:nN {#1} > } \fi: } \cs_new_protected:Npn \__regex_group_repeat_aux:n #1 @@ -24625,12 +25024,6 @@ \bool_if:NT #1 { { } } } } -\cs_new_protected:Npn \__regex_anchor:N #1 - { - \if_int_compare:w #1 = \l__regex_curr_pos_int - \exp_after:wN \__regex_break_true:w - \fi: - } \cs_new_protected:Npn \__regex_b_test: { \group_begin: @@ -24640,12 +25033,30 @@ { \group_end: \__regex_item_reverse:n \__regex_prop_w: } { \group_end: \__regex_prop_w: } } +\cs_new_protected:Npn \__regex_Z_test: + { + \if_int_compare:w -2 = \l__regex_curr_char_int + \exp_after:wN \__regex_break_true:w + \fi: + } +\cs_new_protected:Npn \__regex_A_test: + { + \if_int_compare:w -2 = \l__regex_last_char_int + \exp_after:wN \__regex_break_true:w + \fi: + } +\cs_new_protected:Npn \__regex_G_test: + { + \if_int_compare:w \l__regex_curr_pos_int = \l__regex_start_pos_int + \exp_after:wN \__regex_break_true:w + \fi: + } \cs_new_protected:Npn \__regex_command_K: { \__regex_build_new_state: \__regex_toks_put_right:Nx \l__regex_left_state_int { - \__regex_action_submatch:n { 0< } + \__regex_action_submatch:nN { 0 } < \bool_set_true:N \l__regex_fresh_thread_bool \__regex_action_free:n { @@ -24662,16 +25073,20 @@ \int_new:N \l__regex_success_pos_int \int_new:N \l__regex_curr_char_int \int_new:N \l__regex_curr_catcode_int +\tl_new:N \l__regex_curr_token_tl \int_new:N \l__regex_last_char_int +\int_new:N \l__regex_last_char_success_int \int_new:N \l__regex_case_changed_char_int \int_new:N \l__regex_curr_state_int -\prop_new:N \l__regex_curr_submatches_prop -\prop_new:N \l__regex_success_submatches_prop +\tl_new:N \l__regex_curr_submatches_tl +\tl_new:N \l__regex_success_submatches_tl \int_new:N \l__regex_step_int -\int_new:N \l__regex_min_active_int -\int_new:N \l__regex_max_active_int +\int_new:N \l__regex_min_thread_int +\int_new:N \l__regex_max_thread_int \intarray_new:Nn \g__regex_state_active_intarray { 65536 } -\intarray_new:Nn \g__regex_thread_state_intarray { 65536 } +\intarray_new:Nn \g__regex_thread_info_intarray { 65536 } +\tl_new:N \l__regex_matched_analysis_tl +\tl_new:N \l__regex_curr_analysis_tl \tl_new:N \l__regex_every_match_tl \bool_new:N \l__regex_fresh_thread_bool \bool_new:N \l__regex_empty_success_bool @@ -24681,38 +25096,26 @@ \bool_new:N \l__regex_match_success_bool \cs_new_protected:Npn \__regex_match:n #1 { - \int_zero:N \l__regex_balance_int - \int_set:Nn \l__regex_curr_pos_int { 2 * \l__regex_max_state_int } - \__regex_query_set:nnn { } { -1 } { -2 } - \int_set_eq:NN \l__regex_min_pos_int \l__regex_curr_pos_int - \tl_analysis_map_inline:nn {#1} - { \__regex_query_set:nnn {##1} {"##3} {##2} } - \int_set_eq:NN \l__regex_max_pos_int \l__regex_curr_pos_int - \__regex_query_set:nnn { } { -1 } { -2 } \__regex_match_init: - \__regex_match_once: + \__regex_match_once_init: + \tl_analysis_map_inline:nn {#1} + { \__regex_match_one_token:nnN {##1} {##2} ##3 } + \__regex_match_one_token:nnN { } { -2 } F + \prg_break_point:Nn \__regex_maplike_break: { } } \cs_new_protected:Npn \__regex_match_cs:n #1 { - \int_zero:N \l__regex_balance_int - \int_set:Nn \l__regex_curr_pos_int - { - \int_max:nn { 2 * \l__regex_max_state_int - \l__regex_min_state_int } - { \l__regex_max_pos_int } - + 1 - } - \__regex_query_set:nnn { } { -1 } { -2 } - \int_set_eq:NN \l__regex_min_pos_int \l__regex_curr_pos_int + \int_set_eq:NN \l__regex_min_thread_int \l__regex_max_thread_int + \__regex_match_init: + \__regex_match_once_init: \str_map_inline:nn {#1} { - \__regex_query_set:nnn { \exp_not:n {##1} } - { \tl_if_blank:nTF {##1} { 10 } { 12 } } - { `##1 } + \tl_if_blank:nTF {##1} + { \__regex_match_one_token:nnN {##1} {`##1} A } + { \__regex_match_one_token:nnN {##1} {`##1} C } } - \int_set_eq:NN \l__regex_max_pos_int \l__regex_curr_pos_int - \__regex_query_set:nnn { } { -1 } { -2 } - \__regex_match_init: - \__regex_match_once: + \__regex_match_one_token:nnN { } { -2 } F + \prg_break_point:Nn \__regex_maplike_break: { } } \cs_new_protected:Npn \__regex_match_init: { @@ -24723,15 +25126,17 @@ \__kernel_intarray_gset:Nnn \g__regex_state_active_intarray {##1} { 1 } } - \int_set_eq:NN \l__regex_min_active_int \l__regex_max_state_int \int_zero:N \l__regex_step_int + \int_set:Nn \l__regex_min_pos_int { 2 } \int_set_eq:NN \l__regex_success_pos_int \l__regex_min_pos_int - \int_set:Nn \l__regex_min_submatch_int - { 2 * \l__regex_max_state_int } + \int_set:Nn \l__regex_last_char_success_int { -2 } + \tl_build_begin:N \l__regex_matched_analysis_tl + \tl_clear:N \l__regex_curr_analysis_tl + \int_set:Nn \l__regex_min_submatch_int { 1 } \int_set_eq:NN \l__regex_submatch_int \l__regex_min_submatch_int \bool_set_false:N \l__regex_empty_success_bool } -\cs_new_protected:Npn \__regex_match_once: +\cs_new_protected:Npn \__regex_match_once_init: { \if_meaning:w \c_true_bool \l__regex_empty_success_bool \cs_set:Npn \__regex_if_two_empty_matches:F @@ -24744,14 +25149,24 @@ \fi: \int_set_eq:NN \l__regex_start_pos_int \l__regex_success_pos_int \bool_set_false:N \l__regex_match_success_bool - \prop_clear:N \l__regex_curr_submatches_prop - \int_set_eq:NN \l__regex_max_active_int \l__regex_min_active_int + \tl_set:Nx \l__regex_curr_submatches_tl + { \prg_replicate:nn { 2 * \l__regex_capturing_group_int } { 0 , } } + \int_set_eq:NN \l__regex_max_thread_int \l__regex_min_thread_int \__regex_store_state:n { \l__regex_min_state_int } \int_set:Nn \l__regex_curr_pos_int { \l__regex_start_pos_int - 1 } - \__regex_query_get: - \__regex_match_loop: - \l__regex_every_match_tl + \int_set_eq:NN \l__regex_curr_char_int \l__regex_last_char_success_int + \tl_build_get:NN \l__regex_matched_analysis_tl \l__regex_internal_a_tl + \exp_args:NNf \__regex_match_once_init_aux: + \tl_map_inline:nn + { \exp_after:wN \l__regex_internal_a_tl \l__regex_curr_analysis_tl } + { \__regex_match_one_token:nnN ##1 } + \prg_break_point:Nn \__regex_maplike_break: { } + } +\cs_new_protected:Npn \__regex_match_once_init_aux: + { + \tl_build_clear:N \l__regex_matched_analysis_tl + \tl_clear:N \l__regex_curr_analysis_tl } \cs_new_protected:Npn \__regex_single_match: { @@ -24760,71 +25175,58 @@ \bool_gset_eq:NN \g__regex_success_bool \l__regex_match_success_bool + \__regex_maplike_break: } } \cs_new_protected:Npn \__regex_multi_match:n #1 { \tl_set:Nn \l__regex_every_match_tl { - \if_meaning:w \c_true_bool \l__regex_match_success_bool - \bool_gset_true:N \g__regex_success_bool - #1 - \exp_after:wN \__regex_match_once: + \if_meaning:w \c_false_bool \l__regex_match_success_bool + \exp_after:wN \__regex_maplike_break: \fi: + \bool_gset_true:N \g__regex_success_bool + #1 + \__regex_match_once_init: } } -\cs_new_protected:Npn \__regex_match_loop: +\cs_new_protected:Npn \__regex_match_one_token:nnN #1#2#3 { \int_add:Nn \l__regex_step_int { 2 } \int_incr:N \l__regex_curr_pos_int \int_set_eq:NN \l__regex_last_char_int \l__regex_curr_char_int \int_set_eq:NN \l__regex_case_changed_char_int \c_max_int - \__regex_query_get: + \tl_set:Nn \l__regex_curr_token_tl {#1} + \int_set:Nn \l__regex_curr_char_int {#2} + \int_set:Nn \l__regex_curr_catcode_int { "#3 } + \tl_build_put_right:Nx \l__regex_matched_analysis_tl + { \exp_not:o \l__regex_curr_analysis_tl } + \tl_set:Nn \l__regex_curr_analysis_tl { { {#1} {#2} #3 } } \use:x { - \int_set_eq:NN \l__regex_max_active_int \l__regex_min_active_int + \int_set_eq:NN \l__regex_max_thread_int \l__regex_min_thread_int \int_step_function:nnN - { \l__regex_min_active_int } - { \l__regex_max_active_int - 1 } + { \l__regex_min_thread_int } + { \l__regex_max_thread_int - 1 } \__regex_match_one_active:n } \prg_break_point: \bool_set_false:N \l__regex_fresh_thread_bool - \if_int_compare:w \l__regex_max_active_int > \l__regex_min_active_int - \if_int_compare:w \l__regex_curr_pos_int < \l__regex_max_pos_int - \exp_after:wN \exp_after:wN \exp_after:wN \__regex_match_loop: + \if_int_compare:w \l__regex_max_thread_int > \l__regex_min_thread_int + \if_int_compare:w -2 < \l__regex_curr_char_int + \exp_after:wN \exp_after:wN \exp_after:wN \use_none:n \fi: \fi: + \l__regex_every_match_tl } \cs_new:Npn \__regex_match_one_active:n #1 { - \__regex_use_state_and_submatches:nn - { \__kernel_intarray_item:Nn \g__regex_thread_state_intarray {#1} } - { \__regex_toks_use:w #1 } - } -\cs_new_protected:Npn \__regex_query_set:nnn #1#2#3 - { - \__kernel_intarray_gset:Nnn \g__regex_charcode_intarray - { \l__regex_curr_pos_int } {#3} - \__kernel_intarray_gset:Nnn \g__regex_catcode_intarray - { \l__regex_curr_pos_int } {#2} - \__kernel_intarray_gset:Nnn \g__regex_balance_intarray - { \l__regex_curr_pos_int } { \l__regex_balance_int } - \__regex_toks_set:Nn \l__regex_curr_pos_int {#1} - \int_incr:N \l__regex_curr_pos_int - \if_case:w #2 \exp_stop_f: - \or: \int_incr:N \l__regex_balance_int - \or: \int_decr:N \l__regex_balance_int - \fi: - } -\cs_new_protected:Npn \__regex_query_get: - { - \l__regex_curr_char_int - = \__kernel_intarray_item:Nn \g__regex_charcode_intarray - { \l__regex_curr_pos_int } \scan_stop: - \l__regex_curr_catcode_int - = \__kernel_intarray_item:Nn \g__regex_catcode_intarray - { \l__regex_curr_pos_int } \scan_stop: + \__regex_use_state_and_submatches:w + \__kernel_intarray_range_to_clist:Nnn + \g__regex_thread_info_intarray + { 1 + #1 * (\l__regex_capturing_group_int * 2 + 1) } + { (1 + #1) * (\l__regex_capturing_group_int * 2 + 1) } + ; } \cs_new_protected:Npn \__regex_use_state: { @@ -24835,24 +25237,24 @@ { \l__regex_curr_state_int } { \int_eval:n { \l__regex_step_int + 1 } } } -\cs_new_protected:Npn \__regex_use_state_and_submatches:nn #1 #2 +\cs_new_protected:Npn \__regex_use_state_and_submatches:w #1 , #2 ; { \int_set:Nn \l__regex_curr_state_int {#1} \if_int_compare:w \__kernel_intarray_item:Nn \g__regex_state_active_intarray { \l__regex_curr_state_int } < \l__regex_step_int - \tl_set:Nn \l__regex_curr_submatches_prop {#2} + \tl_set:Nn \l__regex_curr_submatches_tl { #2 , } \exp_after:wN \__regex_use_state: \fi: \scan_stop: } -\cs_new_protected:Npn \__regex_action_start_wildcard: +\cs_new_protected:Npn \__regex_action_start_wildcard:N #1 { \bool_set_true:N \l__regex_fresh_thread_bool \__regex_action_free:n {1} \bool_set_false:N \l__regex_fresh_thread_bool - \__regex_action_cost:n {0} + \bool_if:NT #1 { \__regex_action_cost:n {0} } } \cs_new_protected:Npn \__regex_action_free:n { \__regex_action_free_aux:nn { > \l__regex_step_int \else: } } @@ -24874,8 +25276,8 @@ } \int_set:Nn \l__regex_curr_state_int { \int_use:N \l__regex_curr_state_int } - \tl_set:Nn \exp_not:N \l__regex_curr_submatches_prop - { \exp_not:o \l__regex_curr_submatches_prop } + \tl_set:Nn \exp_not:N \l__regex_curr_submatches_tl + { \exp_not:o \l__regex_curr_submatches_tl } } } \cs_new_protected:Npn \__regex_action_cost:n #1 @@ -24885,26 +25287,47 @@ } \cs_new_protected:Npn \__regex_store_state:n #1 { - \__regex_store_submatches: - \__kernel_intarray_gset:Nnn \g__regex_thread_state_intarray - { \l__regex_max_active_int } {#1} - \int_incr:N \l__regex_max_active_int + \exp_args:No \__regex_store_submatches:nn + \l__regex_curr_submatches_tl {#1} + \int_incr:N \l__regex_max_thread_int } -\cs_new_protected:Npn \__regex_store_submatches: +\cs_new_protected:Npn \__regex_store_submatches:nn #1#2 { - \__regex_toks_set:No \l__regex_max_active_int - { \l__regex_curr_submatches_prop } + \__kernel_intarray_gset_range_from_clist:Nnn + \g__regex_thread_info_intarray + { + \__regex_int_eval:w + 1 + \l__regex_max_thread_int * + (\l__regex_capturing_group_int * 2 + 1) + } + { #2 , #1 } } \cs_new_protected:Npn \__regex_disable_submatches: { - \cs_set_protected:Npn \__regex_store_submatches: { } - \cs_set_protected:Npn \__regex_action_submatch:n ##1 { } + \cs_set_protected:Npn \__regex_store_submatches:n ##1 { } + \cs_set_protected:Npn \__regex_action_submatch:nN ##1##2 { } + } +\cs_new_protected:Npn \__regex_action_submatch:nN #1#2 + { + \exp_after:wN \__regex_action_submatch_aux:w + \l__regex_curr_submatches_tl ; {#1} #2 } -\cs_new_protected:Npn \__regex_action_submatch:n #1 +\cs_new_protected:Npn \__regex_action_submatch_aux:w #1 ; #2#3 { - \prop_put:Nno \l__regex_curr_submatches_prop {#1} - { \int_use:N \l__regex_curr_pos_int } + \tl_set:Nx \l__regex_curr_submatches_tl + { + \prg_replicate:nn + { #2 \if_meaning:w > #3 + \l__regex_capturing_group_int \fi: } + { \__regex_action_submatch_auxii:w } + \__regex_action_submatch_auxiii:w + #1 + } } +\cs_new:Npn \__regex_action_submatch_auxii:w + #1 \__regex_action_submatch_auxiii:w #2 , + { #2 , #1 \__regex_action_submatch_auxiii:w } +\cs_new:Npn \__regex_action_submatch_auxiii:w #1 , + { \int_use:N \l__regex_curr_pos_int , } \cs_new_protected:Npn \__regex_action_success: { \__regex_if_two_empty_matches:F @@ -24913,8 +25336,10 @@ \bool_set_eq:NN \l__regex_empty_success_bool \l__regex_fresh_thread_bool \int_set_eq:NN \l__regex_success_pos_int \l__regex_curr_pos_int - \prop_set_eq:NN \l__regex_success_submatches_prop - \l__regex_curr_submatches_prop + \int_set_eq:NN \l__regex_last_char_success_int \l__regex_last_char_int + \tl_build_clear:N \l__regex_matched_analysis_tl + \tl_set_eq:NN \l__regex_success_submatches_tl + \l__regex_curr_submatches_tl \prg_break: } } @@ -24931,6 +25356,7 @@ { \__kernel_intarray_item:Nn \g__regex_submatch_begin_intarray {#1} } } \cs_new:Npn \__regex_replacement_exp_not:N #1 { \exp_not:n {#1} } +\cs_new_eq:NN \__regex_replacement_exp_not:V \exp_not:V \cs_new:Npn \__regex_query_range:nn #1#2 { \exp_after:wN \__regex_query_range_loop:ww @@ -24957,37 +25383,21 @@ \cs_new_protected:Npn \__regex_submatch_balance:n #1 { \int_eval:n - { - \int_compare:nNnTF - { - \__kernel_intarray_item:Nn - \g__regex_submatch_end_intarray {#1} - } - = 0 - { 0 } - { - \__kernel_intarray_item:Nn \g__regex_balance_intarray - { - \__kernel_intarray_item:Nn - \g__regex_submatch_end_intarray {#1} - } - } - - - \int_compare:nNnTF - { - \__kernel_intarray_item:Nn - \g__regex_submatch_begin_intarray {#1} - } - = 0 - { 0 } - { - \__kernel_intarray_item:Nn \g__regex_balance_intarray - { - \__kernel_intarray_item:Nn - \g__regex_submatch_begin_intarray {#1} - } - } - } + { + \__regex_intarray_item:NnF \g__regex_balance_intarray + { + \__kernel_intarray_item:Nn + \g__regex_submatch_end_intarray {#1} + } + { 0 } + - + \__regex_intarray_item:NnF \g__regex_balance_intarray + { + \__kernel_intarray_item:Nn + \g__regex_submatch_begin_intarray {#1} + } + { 0 } + } } \cs_new_protected:Npn \__regex_replacement:n #1 { @@ -25047,10 +25457,12 @@ #1 } } +\cs_new_protected:Npn \__regex_replacement_put:n + { \tl_build_put_right:Nn \l__regex_build_tl } \cs_new_protected:Npn \__regex_replacement_normal:n #1 { \tl_if_empty:NTF \l__regex_replacement_category_tl - { \tl_build_put_right:Nn \l__regex_build_tl {#1} } + { \__regex_replacement_put:n {#1} } { % ( \token_if_eq_charcode:NNTF #1 ) { @@ -25082,15 +25494,19 @@ \cs_new_protected:Npn \__regex_replacement_put_submatch:n #1 { \if_int_compare:w #1 < \l__regex_capturing_group_int - \tl_build_put_right:Nn \l__regex_build_tl - { \__regex_query_submatch:n { \int_eval:n { #1 + ##1 } } } - \if_int_compare:w \l__regex_replacement_csnames_int = 0 \exp_stop_f: - \tl_put_right:Nn \l__regex_balance_tl - { - + \__regex_submatch_balance:n - { \exp_not:N \int_eval:n { #1 + ##1 } } - } - \fi: + \__regex_replacement_put_submatch_aux:n {#1} + \fi: + } +\cs_new_protected:Npn \__regex_replacement_put_submatch_aux:n #1 + { + \tl_build_put_right:Nn \l__regex_build_tl + { \__regex_query_submatch:n { \int_eval:n { #1 + ##1 } } } + \if_int_compare:w \l__regex_replacement_csnames_int = 0 \exp_stop_f: + \tl_put_right:Nn \l__regex_balance_tl + { + + \__regex_submatch_balance:n + { \exp_not:N \int_eval:n { #1 + ##1 } } + } \fi: } \cs_new_protected:Npn \__regex_replacement_g:w #1#2 @@ -25156,7 +25572,7 @@ { \__regex_two_if_eq:NNNNTF #1 #2 \__regex_replacement_normal:n \c_left_brace_str - { \__regex_replacement_cu_aux:Nw \exp_not:V } + { \__regex_replacement_cu_aux:Nw \__regex_replacement_exp_not:V } { \__regex_replacement_error:NNN u #1#2 } } \cs_new_protected:Npn \__regex_replacement_rbrace:N #1 @@ -25206,7 +25622,7 @@ \cs_new_protected:Npn \__regex_replacement_char:nNN #1#2#3 { \tex_lccode:D 0 = `#3 \scan_stop: - \tex_lowercase:D { \tl_build_put_right:Nn \l__regex_build_tl {#1} } + \tex_lowercase:D { \__regex_replacement_put:n {#1} } } \char_set_catcode_active:N \^^@ \cs_new_protected:Npn \__regex_replacement_c_A:w @@ -25223,7 +25639,7 @@ \cs_new_protected:Npn \__regex_replacement_c_C:w #1#2 { \tl_build_put_right:Nn \l__regex_build_tl - { \exp_not:N \exp_not:N \exp_not:c {#2} } + { \exp_not:N \__regex_replacement_exp_not:N \exp_not:c {#2} } } \char_set_catcode_math_subscript:N \^^@ \cs_new_protected:Npn \__regex_replacement_c_D:w @@ -25258,7 +25674,7 @@ \__kernel_msg_error:nn { kernel } { replacement-null-space } \fi: \tex_lccode:D `\ = `#2 \scan_stop: - \tex_lowercase:D { \tl_build_put_right:Nn \l__regex_build_tl {~} } + \tex_lowercase:D { \__regex_replacement_put:n {~} } } \char_set_catcode_alignment:N \^^@ \cs_new_protected:Npn \__regex_replacement_c_T:w @@ -25352,6 +25768,7 @@ \intarray_new:Nn \g__regex_submatch_prev_intarray { 65536 } \intarray_new:Nn \g__regex_submatch_begin_intarray { 65536 } \intarray_new:Nn \g__regex_submatch_end_intarray { 65536 } +\intarray_new:Nn \g__regex_balance_intarray { 65536 } \cs_new_protected:Npn \__regex_return: { \if_meaning:w \c_true_bool \g__regex_success_bool @@ -25360,6 +25777,27 @@ \prg_return_false: \fi: } +\cs_new_protected:Npn \__regex_query_set:n #1 + { + \int_zero:N \l__regex_balance_int + \int_zero:N \l__regex_curr_pos_int + \__regex_query_set_aux:nN { } F + \tl_analysis_map_inline:nn {#1} + { \__regex_query_set_aux:nN {##1} ##3 } + \__regex_query_set_aux:nN { } F + \int_set_eq:NN \l__regex_max_pos_int \l__regex_curr_pos_int + } +\cs_new_protected:Npn \__regex_query_set_aux:nN #1#2 + { + \int_incr:N \l__regex_curr_pos_int + \__regex_toks_set:Nn \l__regex_curr_pos_int {#1} + \__kernel_intarray_gset:Nnn \g__regex_balance_intarray + { \l__regex_curr_pos_int } { \l__regex_balance_int } + \if_case:w "#2 \exp_stop_f: + \or: \int_incr:N \l__regex_balance_int + \or: \int_decr:N \l__regex_balance_int + \fi: + } \cs_new_protected:Npn \__regex_if_match:nn #1#2 { \group_begin: @@ -25388,6 +25826,7 @@ #1 \__regex_match:n {#2} \__regex_extract: + \__regex_query_set:n {#2} \__regex_group_end_extract_seq:N #3 } \cs_new_protected:Npn \__regex_extract_all:nnN #1#2#3 @@ -25396,6 +25835,7 @@ \__regex_multi_match:n { \__regex_extract: } #1 \__regex_match:n {#2} + \__regex_query_set:n {#2} \__regex_group_end_extract_seq:N #3 } \cs_new_protected:Npn \__regex_split:nnN #1#2#3 @@ -25421,6 +25861,7 @@ } #1 \__regex_match:n {#2} + \__regex_query_set:n {#2} \__kernel_intarray_gset:Nnn \g__regex_submatch_prev_intarray { \l__regex_submatch_int } { 0 } \__kernel_intarray_gset:Nnn \g__regex_submatch_end_intarray @@ -25487,51 +25928,44 @@ \int_set_eq:NN \l__regex_zeroth_submatch_int \l__regex_submatch_int \prg_replicate:nn \l__regex_capturing_group_int { - \__kernel_intarray_gset:Nnn \g__regex_submatch_begin_intarray - { \l__regex_submatch_int } { 0 } - \__kernel_intarray_gset:Nnn \g__regex_submatch_end_intarray - { \l__regex_submatch_int } { 0 } \__kernel_intarray_gset:Nnn \g__regex_submatch_prev_intarray { \l__regex_submatch_int } { 0 } \int_incr:N \l__regex_submatch_int } - \prop_map_inline:Nn \l__regex_success_submatches_prop + \__kernel_intarray_gset:Nnn \g__regex_submatch_prev_intarray + { \l__regex_zeroth_submatch_int } { \l__regex_start_pos_int } + \int_zero:N \l__regex_internal_a_int + \clist_map_inline:Nn \l__regex_success_submatches_tl { - \if_int_compare:w ##1 - 1 \exp_stop_f: - \exp_after:wN \__regex_extract_e:wn \int_value:w + \if_int_compare:w \l__regex_internal_a_int < \l__regex_capturing_group_int + \__kernel_intarray_gset:Nnn \g__regex_submatch_begin_intarray + { \__regex_int_eval:w \l__regex_zeroth_submatch_int + \l__regex_internal_a_int } {##1} \else: - \exp_after:wN \__regex_extract_b:wn \int_value:w + \__kernel_intarray_gset:Nnn \g__regex_submatch_end_intarray + { \__regex_int_eval:w \l__regex_zeroth_submatch_int + \l__regex_internal_a_int - \l__regex_capturing_group_int } {##1} \fi: - \__regex_int_eval:w \l__regex_zeroth_submatch_int + ##1 {##2} + \int_incr:N \l__regex_internal_a_int } - \__kernel_intarray_gset:Nnn \g__regex_submatch_prev_intarray - { \l__regex_zeroth_submatch_int } { \l__regex_start_pos_int } \fi: } -\cs_new_protected:Npn \__regex_extract_b:wn #1 < #2 - { - \__kernel_intarray_gset:Nnn - \g__regex_submatch_begin_intarray {#1} {#2} - } -\cs_new_protected:Npn \__regex_extract_e:wn #1 > #2 - { \__kernel_intarray_gset:Nnn \g__regex_submatch_end_intarray {#1} {#2} } \cs_new_protected:Npn \__regex_replace_once:nnN #1#2#3 { \group_begin: \__regex_single_match: #1 - \__regex_replacement:n {#2} - \exp_args:No \__regex_match:n { #3 } + \exp_args:No \__regex_match:n {#3} \if_meaning:w \c_false_bool \g__regex_success_bool \group_end: \else: \__regex_extract: + \exp_args:No \__regex_query_set:n {#3} + \__regex_replacement:n {#2} \int_set:Nn \l__regex_balance_int { \__regex_replacement_balance_one_match:n { \l__regex_zeroth_submatch_int } } - \tl_set:Nx \l__regex_internal_a_tl + \__kernel_tl_set:Nx \l__regex_internal_a_tl { \__regex_replacement_do_one_match:n { \l__regex_zeroth_submatch_int } @@ -25550,8 +25984,9 @@ \group_begin: \__regex_multi_match:n { \__regex_extract: } #1 - \__regex_replacement:n {#2} \exp_args:No \__regex_match:n {#3} + \exp_args:No \__regex_query_set:n {#3} + \__regex_replacement:n {#2} \int_set:Nn \l__regex_balance_int { 0 @@ -25561,7 +25996,7 @@ { \l__regex_submatch_int - 1 } \__regex_replacement_balance_one_match:n } - \tl_set:Nx \l__regex_internal_a_tl + \__kernel_tl_set:Nx \l__regex_internal_a_tl { \int_step_function:nnnN { \l__regex_min_submatch_int } @@ -25599,6 +26034,196 @@ } } } +\tl_new:N \l__regex_peek_true_tl +\tl_new:N \l__regex_peek_false_tl +\tl_new:N \l__regex_replacement_tl +\tl_new:N \l__regex_input_tl +\cs_new_eq:NN \__regex_input_item:n ? +\cs_new_protected:Npn \peek_regex:nTF #1 + { + \__regex_peek:nnTF + { \__regex_build_aux:Nn \c_false_bool {#1} } + { \__regex_peek_end: } + } +\cs_new_protected:Npn \peek_regex:nT #1#2 + { \peek_regex:nTF {#1} {#2} { } } +\cs_new_protected:Npn \peek_regex:nF #1 { \peek_regex:nTF {#1} { } } +\cs_new_protected:Npn \peek_regex:NTF #1 + { + \__regex_peek:nnTF + { \__regex_build_aux:NN \c_false_bool #1 } + { \__regex_peek_end: } + } +\cs_new_protected:Npn \peek_regex:NT #1#2 + { \peek_regex:NTF #1 {#2} { } } +\cs_new_protected:Npn \peek_regex:NF #1 { \peek_regex:NTF {#1} { } } +\cs_new_protected:Npn \peek_regex_remove_once:nTF #1 + { + \__regex_peek:nnTF + { \__regex_build_aux:Nn \c_false_bool {#1} } + { \__regex_peek_remove_end:n {##1} } + } +\cs_new_protected:Npn \peek_regex_remove_once:nT #1#2 + { \peek_regex_remove_once:nTF {#1} {#2} { } } +\cs_new_protected:Npn \peek_regex_remove_once:nF #1 + { \peek_regex_remove_once:nTF {#1} { } } +\cs_new_protected:Npn \peek_regex_remove_once:NTF #1 + { + \__regex_peek:nnTF + { \__regex_build_aux:NN \c_false_bool #1 } + { \__regex_peek_remove_end:n {##1} } + } +\cs_new_protected:Npn \peek_regex_remove_once:NT #1#2 + { \peek_regex_remove_once:NTF #1 {#2} { } } +\cs_new_protected:Npn \peek_regex_remove_once:NF #1 + { \peek_regex_remove_once:NTF #1 { } } +\cs_new_protected:Npn \__regex_peek:nnTF #1 + { + \__regex_peek_aux:nnTF + { + \__regex_disable_submatches: + #1 + } + } +\cs_new_protected:Npn \__regex_peek_aux:nnTF #1#2#3#4 + { + \group_begin: + \tl_set:Nn \l__regex_peek_true_tl { \group_end: #3 } + \tl_set:Nn \l__regex_peek_false_tl { \group_end: #4 } + \__regex_single_match: + #1 + \__regex_match_init: + \tl_build_clear:N \l__regex_input_tl + \__regex_match_once_init: + \peek_analysis_map_inline:n + { + \tl_build_put_right:Nn \l__regex_input_tl + { \__regex_input_item:n {##1} } + \__regex_match_one_token:nnN {##1} {##2} ##3 + \use_none:nnn + \prg_break_point:Nn \__regex_maplike_break: + { \peek_analysis_map_break:n {#2} } + } + } +\cs_new_protected:Npn \__regex_peek_end: + { + \bool_if:NTF \g__regex_success_bool + { \__regex_peek_reinsert:N \l__regex_peek_true_tl } + { \__regex_peek_reinsert:N \l__regex_peek_false_tl } + } +\cs_new_protected:Npn \__regex_peek_remove_end:n #1 + { + \bool_if:NTF \g__regex_success_bool + { \exp_args:NNo \use:nn \l__regex_peek_true_tl {#1} } + { \__regex_peek_reinsert:N \l__regex_peek_false_tl } + } +\cs_new_protected:Npn \__regex_peek_reinsert:N #1 + { + \tl_build_end:N \l__regex_input_tl + \cs_set_eq:NN \__regex_input_item:n \__regex_reinsert_item:n + \exp_after:wN #1 \exp:w \l__regex_input_tl \exp_end: + } +\cs_new_protected:Npn \__regex_reinsert_item:n #1 + { + \exp_after:wN \exp_after:wN + \exp_after:wN \exp_end: + \exp_after:wN \exp_after:wN + #1 + \exp:w + } +\cs_new_protected:Npn \peek_regex_replace_once:nnTF #1 + { \__regex_peek_replace:nnTF { \__regex_build_aux:Nn \c_false_bool {#1} } } +\cs_new_protected:Npn \peek_regex_replace_once:nnT #1#2#3 + { \peek_regex_replace_once:nnTF {#1} {#2} {#3} { } } +\cs_new_protected:Npn \peek_regex_replace_once:nnF #1#2 + { \peek_regex_replace_once:nnTF {#1} {#2} { } } +\cs_new_protected:Npn \peek_regex_replace_once:nn #1#2 + { \peek_regex_replace_once:nnTF {#1} {#2} { } { } } +\cs_new_protected:Npn \peek_regex_replace_once:NnTF #1 + { \__regex_peek_replace:nnTF { \__regex_build_aux:NN \c_false_bool #1 } } +\cs_new_protected:Npn \peek_regex_replace_once:NnT #1#2#3 + { \peek_regex_replace_once:NnTF #1 {#2} {#3} { } } +\cs_new_protected:Npn \peek_regex_replace_once:NnF #1#2 + { \peek_regex_replace_once:NnTF #1 {#2} { } } +\cs_new_protected:Npn \peek_regex_replace_once:Nn #1#2 + { \peek_regex_replace_once:NnTF #1 {#2} { } { } } +\cs_new_protected:Npn \__regex_peek_replace:nnTF #1#2 + { + \tl_set:Nn \l__regex_replacement_tl {#2} + \__regex_peek_aux:nnTF {#1} { \__regex_peek_replace_end: } + } +\cs_new_protected:Npn \__regex_peek_replace_end: + { + \bool_if:NTF \g__regex_success_bool + { + \__regex_extract: + \__regex_query_set_from_input_tl: + \cs_set_eq:NN \__regex_replacement_put:n \__regex_peek_replacement_put:n + \cs_set_eq:NN \__regex_replacement_put_submatch_aux:n + \__regex_peek_replacement_put_submatch_aux:n + \cs_set_eq:NN \__regex_input_item:n \__regex_reinsert_item:n + \cs_set_eq:NN \__regex_replacement_exp_not:N \__regex_peek_replacement_token:n + \cs_set_eq:NN \__regex_replacement_exp_not:V \__regex_peek_replacement_var:N + \exp_args:No \__regex_replacement:n { \l__regex_replacement_tl } + \use:x + { + \exp_not:n { \exp_after:wN \l__regex_peek_true_tl \exp:w } + \__regex_replacement_do_one_match:n + { \l__regex_zeroth_submatch_int } + \__regex_query_range:nn + { + \__kernel_intarray_item:Nn \g__regex_submatch_end_intarray + { \l__regex_zeroth_submatch_int } + } + { \l__regex_max_pos_int } + \exp_end: + } + } + { \__regex_peek_reinsert:N \l__regex_peek_false_tl } + } +\cs_new_protected:Npn \__regex_query_set_from_input_tl: + { + \tl_build_end:N \l__regex_input_tl + \int_zero:N \l__regex_curr_pos_int + \cs_set_eq:NN \__regex_input_item:n \__regex_query_set_item:n + \__regex_query_set_item:n { } + \l__regex_input_tl + \__regex_query_set_item:n { } + \int_set_eq:NN \l__regex_max_pos_int \l__regex_curr_pos_int + } +\cs_new_protected:Npn \__regex_query_set_item:n #1 + { + \int_incr:N \l__regex_curr_pos_int + \__regex_toks_set:Nn \l__regex_curr_pos_int { \__regex_input_item:n {#1} } + } +\cs_new_protected:Npn \__regex_peek_replacement_put:n #1 + { + \if_case:w \l__regex_replacement_csnames_int + \tl_build_put_right:Nn \l__regex_build_tl + { \exp_not:N \__regex_reinsert_item:n {#1} } + \else: + \tl_build_put_right:Nn \l__regex_build_tl {#1} + \fi: + } +\cs_new_protected:Npn \__regex_peek_replacement_token:n #1 + { \exp_after:wN \exp_end: \exp_after:wN #1 \exp:w } +\cs_new_protected:Npn \__regex_peek_replacement_put_submatch_aux:n #1 + { + \if_case:w \l__regex_replacement_csnames_int + \tl_build_put_right:Nn \l__regex_build_tl + { \__regex_query_submatch:n { \int_eval:n { #1 + ##1 } } } + \else: + \tl_build_put_right:Nn \l__regex_build_tl + { \exp:w \__regex_query_submatch:n { \int_eval:n { #1 + ##1 } } \exp_end: } + \fi: + } +\cs_new_protected:Npn \__regex_peek_replacement_var:N #1 + { + \exp_after:wN \exp_last_unbraced:NV + \exp_after:wN \exp_end: + \exp_after:wN #1 + \exp:w + } \use:x { \__kernel_msg_new:nnn { kernel } { trailing-backslash } @@ -26748,10 +27373,13 @@ } \cs_new_protected:Npx \__coffin_set_vertical_aux: { - \cs_if_exist:NT \linewidth - { \dim_set_eq:NN \linewidth \tex_hsize:D } - \cs_if_exist:NT \columnwidth - { \dim_set_eq:NN \columnwidth \tex_hsize:D } + \bool_lazy_and:nnT + { \cs_if_exist_p:N \fmtname } + { \str_if_eq_p:Vn \fmtname { LaTeX2e } } + { + \dim_set_eq:NN \exp_not:N \linewidth \tex_hsize:D + \dim_set_eq:NN \exp_not:N \columnwidth \tex_hsize:D + } } \cs_new_protected:Npn \hcoffin_set:Nw #1 { @@ -27630,36 +28258,38 @@ \dim_new:N \l__coffin_display_x_dim \dim_new:N \l__coffin_display_y_dim \prop_new:N \l__coffin_display_poles_prop -\tl_new:N \l__coffin_display_font_tl -\cs_if_exist:NTF \AtBeginDocument - { \AtBeginDocument } - { \use:n } +\tl_new:N \l__coffin_display_font_tl +\bool_lazy_and:nnT + { \cs_if_exist_p:N \fmtname } + { \str_if_eq_p:Vn \fmtname { LaTeX2e } } { - \tl_set:Nx \l__coffin_display_font_tl - { - \cs_if_exist:NT \sffamily { \exp_not:N \sffamily } - \cs_if_exist:NT \tiny { \exp_not:N \tiny } - } + \tl_set:Nn \l__coffin_display_font_tl + { \sffamily \tiny } } -\cs_if_exist:NTF \AtBeginDocument - { \AtBeginDocument } - { \use:n } +\cs_new_protected:Npn \__coffin_color:n #1 {#1} +\bool_lazy_and:nnT + { \cs_if_exist_p:N \fmtname } + { \str_if_eq_p:Vn \fmtname { LaTeX2e } } { - \cs_new_protected:Npx \__coffin_color:n #1 + \cs_gset_protected:Npn \__coffin_color:n { - \cs_if_exist:NTF \color_select:n - { \color_select:n {#1} } + \cs_gset_protected:Npx \__coffin_color:n { - \cs_if_exist:NT \color - { \exp_not:N \color {#1} } + \cs_if_exist:NTF \color_select:n + { \color_select:n } + { + \cs_if_exist:NTF \color + { \exp_not:N \color } + { \exp_not:N \use_none:n } + } } + \__coffin_color:n } } -\cs_new_protected:Npx \__coffin_rule:nn #1#2 +\cs_new_protected:Npn \__coffin_rule:nn #1#2 { - \cs_if_exist:NTF \rule - { \exp_not:N \rule {#1} {#2} } - { \hbox:n { \tex_vrule:D width #1 height #2 \scan_stop: } } + \mode_leave_vertical: + \hbox:n { \tex_vrule:D width #1 height #2 \scan_stop: } } \cs_new_protected:Npn \coffin_mark_handle:Nnnn #1#2#3#4 { @@ -28446,8 +29076,10 @@ \exp_not:N \str_if_eq:nnTF {#1} { \exp_not:N \protect } { \exp_not:N \__text_expand_protect:N } { - \cs_if_exist:cTF { @current@cmd } - { \exp_not:N \__text_expand_encoding:N #1 } + \bool_lazy_and:nnTF + { \cs_if_exist_p:N \fmtname } + { \str_if_eq_p:Vn \fmtname { LaTeX2e } } + { \exp_not:N \__text_expand_testopt:N #1 } { \exp_not:N \__text_expand_replace:N #1 } } } @@ -28469,18 +29101,24 @@ { \__text_expand_store:n { \protect #1 } } \__text_expand_loop:w } +\cs_new:Npn \__text_expand_testopt:N #1 + { + \str_if_eq:nnTF {#1} { \@protected@testopt } + { \__text_expand_testopt:NNn } + { \__text_expand_encoding:N #1 } + } +\cs_new:Npn \__text_expand_testopt:NNn #1#2#3 + { + \__text_expand_store:n {#1} + \__text_expand_loop:w + } \cs_new:Npn \__text_expand_encoding:N #1 { - \cs_if_eq:NNTF #1 \@current@cmd + \bool_lazy_or:nnTF + { \cs_if_eq_p:NN #1 \@current@cmd } + { \cs_if_eq_p:NN #1 \@changed@cmd } { \exp_after:wN \__text_expand_loop:w \__text_expand_encoding_escape:NN } - { - \cs_if_eq:NNTF #1 \@changed@cmd - { - \exp_after:wN \__text_expand_loop:w - \__text_expand_encoding_escape:NN - } - { \__text_expand_replace:N #1 } - } + { \__text_expand_replace:N #1 } } \cs_new:Npn \__text_expand_encoding_escape:NN #1#2 { \exp_not:n {#1} } \cs_new:Npn \__text_expand_replace:N #1 @@ -28557,6 +29195,7 @@ \cs_new:Npn \__text_change_case_aux:nnn #1#2#3 { \group_align_safe_begin: + \cs_if_exist_use:c { __text_change_case_boundary_ #2 _ #3 :Nnnw } \__text_change_case_loop:nnw {#2} {#3} #1 \q__text_recursion_tail \q__text_recursion_stop \__text_change_case_result:n { } @@ -28632,6 +29271,7 @@ } { \__text_change_case_store:n { ~ } + \cs_if_exist_use:c { __text_change_case_boundary_ #1 _ #2 :Nnnw } \__text_change_case_loop:nnw {#1} {#2} } \cs_new:Npn \__text_change_case_N_type:nnN #1#2#3 @@ -28764,16 +29404,10 @@ { \__text_change_case_loop:nnw {#3} {#4} } } } -\cs_new:Npx \__text_change_case_char_lower:nnN #1#2#3 +\cs_new:Npn \__text_change_case_char_lower:nnN #1#2#3 { - \exp_not:N \cs_if_exist_use:cF { __text_change_case_lower_ #2 :nnnN } - { - \bool_lazy_or:nnTF - { \sys_if_engine_luatex_p: } - { \sys_if_engine_xetex_p: } - { \exp_not:N \__text_change_case_lower_sigma:nnnN } - { \exp_not:N \__text_change_case_char:nnnN } - } + \cs_if_exist_use:cF { __text_change_case_lower_ #2 :nnnN } + { \__text_change_case_lower_sigma:nnnN } {#1} {#1} {#2} #3 } \cs_new:Npn \__text_change_case_char_upper:nnN #1#2#3 @@ -28782,7 +29416,7 @@ { \__text_change_case_char:nnnN } {#1} {#1} {#2} #3 } -\bool_lazy_or:nnT +\bool_lazy_or:nnTF { \sys_if_engine_luatex_p: } { \sys_if_engine_xetex_p: } { @@ -28814,6 +29448,44 @@ \__text_change_case_loop:nnw {#2} {#3} #4 } } + { + \cs_new:Npn \__text_change_case_lower_sigma:nnnN #1#2#3#4 + { + \int_compare:nNnTF { `#4 } = { "CE } + { \__text_change_case_lower_sigma:nnnNN } + { \__text_change_case_char:nnnN } + {#1} {#2} {#3} #4 + } + \cs_new:Npn \__text_change_case_lower_sigma:nnnNN #1#2#3#4#5 + { + \int_compare:nNnTF { `#5 } = { "A3 } + { \__text_change_case_lower_sigma:nnw {#2} {#3} } + { \__text_change_case_char:nnnN {#1} {#2} {#3} #4#5 } + } + \cs_new:Npn \__text_change_case_lower_sigma:nnw #1#2#3 \q__text_recursion_stop + { + \tl_if_head_is_N_type:nTF {#3} + { \__text_change_case_lower_sigma:nnN } + { + \__text_change_case_store:V \c__text_final_sigma_tl + \__text_change_case_loop:nnw + } + {#1} {#2} #3 \q__text_recursion_stop + } + \cs_new:Npn \__text_change_case_lower_sigma:nnN #1#2#3 + { + \bool_lazy_or:nnTF + { \token_if_letter_p:N #3 } + { + \bool_lazy_and_p:nn + { \token_if_active_p:N #3 } + { \int_compare_p:nNn { `#3 } > { "80 } } + } + { \__text_change_case_store:V \c__text_sigma_tl } + { \__text_change_case_store:V \c__text_final_sigma_tl } + \__text_change_case_loop:nnw {#1} {#2} #3 + } + } \cs_new:Npx \__text_change_case_char_title:nnN #1#2#3 { \exp_not:N \bool_if:NTF \l_text_titlecase_check_letter_bool @@ -28950,90 +29622,250 @@ { \__text_change_case_if_greek:nTF { `#4 } { - \exp_args:Ne \__text_change_case_upper_el:nnnn - { \char_to_nfd:N #4 } {#1} {#2} {#3} + \exp_args:Ne \__text_change_case_upper_el:nnn + { \char_to_nfd:N #4 } {#2} {#3} } { \__text_change_case_char:nnnN {#1} {#2} {#3} #4 } } - \cs_new:Npn \__text_change_case_upper_el:nnnn #1#2#3#4 - { \__text_change_case_upper_el_aux:nnnN {#2} {#3} {#4} #1 } - \cs_new:Npn \__text_change_case_upper_el_aux:nnnN #1#2#3#4 + \cs_new:Npn \__text_change_case_upper_el:nnn #1#2#3 + { \__text_change_case_upper_el:nnNw {#2} {#3} #1 } + \cs_new:Npn \__text_change_case_upper_el:nnNw #1#2#3#4 \q__text_recursion_stop { - \__text_change_case_store:e { \use:c { char_ #1 case:N } #4 } - \__text_change_case_upper_el_loop:nnw {#2} {#3} - } - \cs_new:Npn \__text_change_case_upper_el_loop:nnw - #1#2#3 \q__text_recursion_stop - { - \tl_if_head_is_N_type:nTF {#3} - { \__text_change_case_upper_el:nnN } - { \__text_change_case_loop:nnw } - {#1} {#2} #3 \q__text_recursion_stop + \tl_if_head_is_N_type:nTF {#4} + { \__text_change_case_upper_el:NnnN #3 } + { + \__text_change_case_store:e { \char_uppercase:N #3 } + \__text_change_case_loop:nnw + } + {#1} {#2} #4 \q__text_recursion_stop } - \cs_new:Npn \__text_change_case_upper_el:nnN #1#2#3 + \cs_new:Npn \__text_change_case_upper_el:NnnN #1#2#3#4 { - \token_if_cs:NTF #3 - { \__text_change_case_loop:nnw {#1} {#2} #3 } + \token_if_cs:NTF #4 { - \int_compare:nNnTF { `#3 } = { "0308 } - { - \__text_change_case_store:n {#3} - \__text_change_case_upper_el_loop:nnw {#1} {#2} - } + \__text_change_case_store:e { \char_uppercase:N #1 } + \__text_change_case_loop:nnw {#2} {#3} #4 + } + { + \int_compare:nNnTF { `#4 } = { "0308 } + { \__text_change_case_upper_el_dialytika:nnN {#2} {#3} #1 } { - \bool_lazy_any:nTF + \__text_change_case_if_greek_accent:nTF { `#4 } + { \__text_change_case_upper_el_hiatus:nnNw {#2} {#3} #1 } { - { \int_compare_p:nNn { `#3 } = { "0300 } } - { \int_compare_p:nNn { `#3 } = { "0301 } } - { \int_compare_p:nNn { `#3 } = { "0304 } } - { \int_compare_p:nNn { `#3 } = { "0306 } } - { \int_compare_p:nNn { `#3 } = { "0308 } } - { \int_compare_p:nNn { `#3 } = { "0313 } } - { \int_compare_p:nNn { `#3 } = { "0314 } } - { \int_compare_p:nNn { `#3 } = { "0342 } } - { \int_compare_p:nNn { `#3 } = { "0340 } } - { \int_compare_p:nNn { `#3 } = { "0341 } } - { \int_compare_p:nNn { `#3 } = { "0343 } } - } - { \__text_change_case_upper_el_loop:nnw {#1} {#2} } - { - \int_compare:nNnTF { `#3 } = { "0344 } + \__text_change_case_if_greek_diacritic:nTF { `#4 } { - \__text_change_case_store:e - { - \char_generate:nn { "0308 } - { \__text_char_catcode:N #3 } - } - \__text_change_case_upper_el_loop:nnw {#1} {#2} + \__text_change_case_store:e { \char_uppercase:N #1 } + \__text_change_case_loop:nnw {#2} {#3} } { - \int_compare:nNnTF { `#3 } = { "0345 } - { \__text_change_case_loop:nnw {#1} {#2} } - { \__text_change_case_loop:nnw {#1} {#2} #3 } + \__text_change_case_store:e { \char_uppercase:N #1 } + \__text_change_case_loop:nnw {#2} {#3} #4 } } } } } - \prg_new_conditional:Npnn \__text_change_case_if_greek:n #1 { TF } + \cs_new:Npn \__text_change_case_upper_el_dialytika:nnN #1#2#3 + { + \__text_change_case_if_takes_dialytika:nTF { `#3 } + { \__text_change_case_upper_el_dialytika:N #3 } + { \__text_change_case_store:e { \char_uppercase:N #3 } } + \__text_change_case_upper_el_gobble:nnw {#1} {#2} + } + \cs_new:Npn \__text_change_case_upper_el_dialytika:N #1 + { + \__text_change_case_store:e + { + \bool_lazy_or:nnTF + { \int_compare_p:nNn { `#1 } = { "0399 } } + { \int_compare_p:nNn { `#1 } = { "03B9 } } + { \char_generate:nn { "03AA } { \__text_char_catcode:N #1 } } + { \char_generate:nn { "03AB } { \__text_char_catcode:N #1 } } + } + } + \cs_new:Npn \__text_change_case_upper_el_hiatus:nnNw + #1#2#3#4 \q__text_recursion_stop + { + \__text_change_case_store:e { \char_uppercase:N #3 } + \tl_if_head_is_N_type:nTF {#4} + { \__text_change_case_upper_el_hiatus:nnN } + { \__text_change_case_loop:nnw } + {#1} {#2} #4 \q__text_recursion_stop + } + \cs_new:Npn \__text_change_case_upper_el_hiatus:nnN #1#2#3 + { + \token_if_cs:NTF #3 + { \__text_change_case_loop:nnw {#1} {#2} #3 } + { + \__text_change_case_if_takes_dialytika:nTF { `#3 } + { + \__text_change_case_upper_el_dialytika:N #3 + \__text_change_case_upper_el_gobble:nnw {#1} {#2} + } + { \__text_change_case_loop:nnw {#1} {#2} #3 } + } + } + \cs_new:Npn \__text_change_case_upper_el_gobble:nnw + #1#2#3 \q__text_recursion_stop + { + \tl_if_head_is_N_type:nTF {#3} + { \__text_change_case_upper_el_gobble:nnN } + { \__text_change_case_loop:nnw } + {#1} {#2} #3 \q__text_recursion_stop + } + \cs_new:Npn \__text_change_case_upper_el_gobble:nnN #1#2#3 { - \if_int_compare:w #1 < "0370 \exp_stop_f: + \bool_lazy_or:nnTF + { \token_if_cs_p:N #3 } + { + ! \bool_lazy_or_p:nn + { \__text_change_case_if_greek_accent_p:n { `#3 } } + { \__text_change_case_if_greek_diacritic_p:n { `#3 } } + } + { \__text_change_case_loop:nnw {#1} {#2} #3 } + { \__text_change_case_upper_el_gobble:nnw {#1} {#2} } + } + } +\prg_new_conditional:Npnn \__text_change_case_if_greek:n #1 { TF } + { + \if_int_compare:w #1 < "0370 \exp_stop_f: + \prg_return_false: + \else: + \if_int_compare:w #1 > "03FF \exp_stop_f: + \if_int_compare:w #1 < "1F00 \exp_stop_f: \prg_return_false: \else: - \if_int_compare:w #1 > "03FF \exp_stop_f: - \if_int_compare:w #1 < "1F00 \exp_stop_f: - \prg_return_false: + \if_int_compare:w #1 > "1FFF \exp_stop_f: + \prg_return_false: + \else: + \prg_return_true: + \fi: + \fi: + \else: + \prg_return_true: + \fi: + \fi: + } +\prg_new_conditional:Npnn \__text_change_case_if_greek_accent:n #1 { TF , p } + { + \if_int_compare:w #1 = "0300 \exp_stop_f: + \prg_return_true: + \else: + \if_int_compare:w #1 = "0301 \exp_stop_f: + \prg_return_true: + \else: + \if_int_compare:w #1 = "0342 \exp_stop_f: + \prg_return_true: + \else: + \if_int_compare:w #1 = "0302 \exp_stop_f: + \prg_return_true: + \else: + \if_int_compare:w #1 = "0303 \exp_stop_f: + \prg_return_true: \else: - \if_int_compare:w #1 > "1FFF \exp_stop_f: - \prg_return_false: - \else: + \if_int_compare:w #1 = "0311 \exp_stop_f: \prg_return_true: + \else: + \prg_return_false: \fi: \fi: + \fi: + \fi: + \fi: + \fi: + } +\prg_new_conditional:Npnn \__text_change_case_if_greek_diacritic:n + #1 { TF , p } + { + \if_int_compare:w #1 = "0304 \exp_stop_f: + \prg_return_true: + \else: + \if_int_compare:w #1 = "0306 \exp_stop_f: + \prg_return_true: + \else: + \if_int_compare:w #1 = "0313 \exp_stop_f: + \prg_return_true: + \else: + \if_int_compare:w #1 = "0314 \exp_stop_f: + \prg_return_true: \else: + \if_int_compare:w #1 = "0343 \exp_stop_f: + \prg_return_true: + \else: + \prg_return_false: + \fi: + \fi: + \fi: + \fi: + \fi: + } +\prg_new_conditional:Npnn \__text_change_case_if_takes_dialytika:n #1 { TF } + { + \if_int_compare:w #1 = "0399 \exp_stop_f: + \prg_return_true: + \else: + \if_int_compare:w #1 = "03B9 \exp_stop_f: + \prg_return_true: + \else: + \if_int_compare:w #1 = "03A5 \exp_stop_f: + \prg_return_true: + \else: + \if_int_compare:w #1 = "03C5 \exp_stop_f: \prg_return_true: + \else: + \prg_return_false: \fi: \fi: + \fi: + \fi: + } +\bool_lazy_or:nnT + { \sys_if_engine_luatex_p: } + { \sys_if_engine_xetex_p: } + { + \cs_new:Npn \__text_change_case_boundary_upper_el:Nnnw + #1#2#3#4 \q__text_recursion_stop + { + \tl_if_head_is_N_type:nTF {#4} + { \__text_change_case_boundary_upper_el:nnN } + { \__text_change_case_loop:nnw } + {#2} {#3} #4 \q__text_recursion_stop + } + \cs_new:Npn \__text_change_case_boundary_upper_el:nnN #1#2#3 + { + \bool_lazy_or:nnTF + { \token_if_cs_p:N #3 } + { + ! \bool_lazy_or_p:nn + { \int_compare_p:nNn { `#3 } = { "03AE } } + { \int_compare_p:nNn { `#3 } = { "1F22 } } + } + { \__text_change_case_loop:nnw } + { \__text_change_case_boundary_upper_el:nnNw } + {#1} {#2} #3 + } + \cs_new:Npn \__text_change_case_boundary_upper_el:nnNw + #1#2#3#4 \q__text_recursion_stop + { + \tl_if_head_is_N_type:nTF {#4} + { \__text_change_case_boundary_upper_el:NnnN #3 } + { + \__text_change_case_store:e + { \char_generate:nn { "0389 } { \__text_char_catcode:N #3 } } + \__text_change_case_loop:nnw + } + {#1} {#2} #4 \q__text_recursion_stop + } + \cs_new:Npn \__text_change_case_boundary_upper_el:NnnN #1#2#3#4 + { + \token_if_letter:NTF #4 + { \__text_change_case_loop:nnw {#2} {#3} #1#4 } + { + \__text_change_case_store:e + { \char_generate:nn { "0389 } { \__text_char_catcode:N #1 } } + \__text_change_case_loop:nnw {#2} {#3} #4 + } } } \bool_lazy_or:nnT @@ -29330,6 +30162,8 @@ \__text_tmp:w \c__text_dotted_I_tl { 0130 } \__text_tmp:w \c__text_i_ogonek_tl { 012F } \__text_tmp:w \c__text_I_ogonek_tl { 012E } + \__text_tmp:w \c__text_final_sigma_tl { 03C2 } + \__text_tmp:w \c__text_sigma_tl { 03C3 } \__text_tmp:w \c__text_grosses_Eszett_tl { 1E9E } } \group_end: @@ -29532,6 +30366,16 @@ { 042D } { 044D } { 042E } { 044E } { 042F } { 044F } + { 0370 } { 0371 } + { 0372 } { 0373 } + { 0376 } { 0377 } + { 03FD } { 037B } + { 03FE } { 037C } + { 03FF } { 037D } + { 0386 } { 03AC } + { 0388 } { 03AD } + { 0389 } { 03AE } + { 038A } { 03AF } { 0391 } { 03B1 } { 0392 } { 03B2 } { 0393 } { 03B3 } @@ -29556,19 +30400,73 @@ { 03A7 } { 03C7 } { 03A8 } { 03C8 } { 03A9 } { 03C9 } + { 03AA } { 03CA } + { 03AB } { 03CB } + { 038C } { 03CC } + { 038E } { 03CD } + { 038F } { 03CE } + { 03CF } { 03D7 } { 03D8 } { 03D9 } { 03DA } { 03DB } { 03DC } { 03DD } { 03DE } { 03DF } { 03E0 } { 03E1 } + { 03E2 } { 03E3 } + { 03E4 } { 03E5 } + { 03E6 } { 03E7 } + { 03E8 } { 03E9 } + { 03EA } { 03EB } + { 03EC } { 03ED } + { 03EE } { 03EF } + { 03F9 } { 03F2 } + { 037F } { 03F3 } + { 03F7 } { 03F8 } + { 03FA } { 03FB } \q_recursion_tail ? \q_recursion_stop \cs_set_protected:Npn \__text_tmp:w #1#2#3 { \group_begin: - \cs_set_protected:Npn \__text_tmp:w ##1##2##3##4 + \cs_set_protected:Npn \__text_tmp:w ##1##2##3##4##5##6##7##8 { \tl_const:cx + { + c__text_ #3 case_ + \char_generate:nn {##1} { 12 } + \char_generate:nn {##2} { 12 } + _tl + } + { + \exp_after:wN \exp_after:wN \exp_after:wN + \exp_not:N \char_generate:nn {##5} { 13 } + \exp_after:wN \exp_after:wN \exp_after:wN + \exp_not:N \char_generate:nn {##6} { 13 } + } + } + \use:x + { + \__text_tmp:w + \char_to_utfviii_bytes:n { "#1 } + \char_to_utfviii_bytes:n { "#2 } + } + \group_end: + } + \__text_tmp:w { 0345 } { 0399 } { upper } + \__text_tmp:w { 03C2 } { 03A3 } { upper } + \__text_tmp:w { 03D0 } { 0392 } { upper } + \__text_tmp:w { 03D1 } { 0398 } { upper } + \__text_tmp:w { 03D5 } { 03A6 } { upper } + \__text_tmp:w { 03D6 } { 03A0 } { upper } + \__text_tmp:w { 03F0 } { 039A } { upper } + \__text_tmp:w { 03F1 } { 03A1 } { upper } + \__text_tmp:w { 03F4 } { 03B8 } { lower } + \__text_tmp:w { 03F5 } { 0395 } { upper } + \cs_set_protected:Npn \__text_tmp:w #1#2#3 + { + \group_begin: + \cs_set_protected:Npn \__text_tmp:w ##1##2##3##4 + { + \tl_const:cn { c__text_ #3 case_ \char_generate:nn {##1} { 12 } @@ -29584,8 +30482,176 @@ \__text_tmp:w { 00DF } { SS } { upper } \__text_tmp:w { 00DF } { Ss } { title } \__text_tmp:w { 0131 } { I } { upper } - } - \group_end: + \cs_set_protected:Npn \__text_tmp:nnnnnn #1#2#3#4#5#6#7 + { + \tl_const:cx + { + c__text_ #1 case_ + \char_generate:nn {#2} { 12 } + \char_generate:nn {#3} { 12 } + \char_generate:nn {#4} { 12 } + _tl + } + { + \exp_after:wN \exp_after:wN \exp_after:wN + \exp_not:N \char_generate:nn {#5} { 13 } + \exp_after:wN \exp_after:wN \exp_after:wN + \exp_not:N \char_generate:nn {#6} { 13 } + \exp_after:wN \exp_after:wN \exp_after:wN + \exp_not:N \char_generate:nn {#7} { 13 } + } + } + \cs_set_protected:Npn \__text_tmp:w #1#2#3#4#5#6#7#8 + { + \tl_const:cx + { + c__text_lowercase_ + \char_generate:nn {#1} { 12 } + \char_generate:nn {#2} { 12 } + \char_generate:nn {#3} { 12 } + _tl + } + { + \exp_after:wN \exp_after:wN \exp_after:wN + \exp_not:N \char_generate:nn {#5} { 13 } + \exp_after:wN \exp_after:wN \exp_after:wN + \exp_not:N \char_generate:nn {#6} { 13 } + \exp_after:wN \exp_after:wN \exp_after:wN + \exp_not:N \char_generate:nn {#7} { 13 } + } + \__text_tmp:nnnnnn { upper } {#5} {#6} {#7} {#1} {#2} {#3} + \__text_tmp:nnnnnn { title } {#5} {#6} {#7} {#1} {#2} {#3} + } + \__text_loop:nn + { 1F08 } { 1F00 } + { 1F09 } { 1F01 } + { 1F0A } { 1F02 } + { 1F0B } { 1F03 } + { 1F0C } { 1F04 } + { 1F0D } { 1F05 } + { 1F0E } { 1F06 } + { 1F0F } { 1F07 } + { 1F18 } { 1F10 } + { 1F19 } { 1F11 } + { 1F1A } { 1F12 } + { 1F1B } { 1F13 } + { 1F1C } { 1F14 } + { 1F1D } { 1F15 } + { 1F28 } { 1F20 } + { 1F29 } { 1F21 } + { 1F2A } { 1F22 } + { 1F2B } { 1F23 } + { 1F2C } { 1F24 } + { 1F2D } { 1F25 } + { 1F2E } { 1F26 } + { 1F2F } { 1F27 } + { 1F38 } { 1F30 } + { 1F39 } { 1F31 } + { 1F3A } { 1F32 } + { 1F3B } { 1F33 } + { 1F3C } { 1F34 } + { 1F3D } { 1F35 } + { 1F3E } { 1F36 } + { 1F3F } { 1F37 } + { 1F48 } { 1F40 } + { 1F49 } { 1F41 } + { 1F4A } { 1F42 } + { 1F4B } { 1F43 } + { 1F4C } { 1F44 } + { 1F4D } { 1F45 } + { 1F59 } { 1F51 } + { 1F5B } { 1F53 } + { 1F5D } { 1F55 } + { 1F5F } { 1F57 } + { 1F68 } { 1F60 } + { 1F69 } { 1F61 } + { 1F6A } { 1F62 } + { 1F6B } { 1F63 } + { 1F6C } { 1F64 } + { 1F6D } { 1F65 } + { 1F6E } { 1F66 } + { 1F6F } { 1F67 } + { 1FBA } { 1F70 } + { 1FBB } { 1F71 } + { 1FC8 } { 1F72 } + { 1FC9 } { 1F73 } + { 1FCA } { 1F74 } + { 1FCB } { 1F75 } + { 1FDA } { 1F76 } + { 1FDB } { 1F77 } + { 1FF8 } { 1F78 } + { 1FF9 } { 1F79 } + { 1FEA } { 1F7A } + { 1FEB } { 1F7B } + { 1FFA } { 1F7C } + { 1FFB } { 1F7D } + { 1F88 } { 1F80 } + { 1F89 } { 1F81 } + { 1F8A } { 1F82 } + { 1F8B } { 1F83 } + { 1F8C } { 1F84 } + { 1F8D } { 1F85 } + { 1F8E } { 1F86 } + { 1F8F } { 1F87 } + { 1F98 } { 1F90 } + { 1F99 } { 1F91 } + { 1F9A } { 1F92 } + { 1F9B } { 1F93 } + { 1F9C } { 1F94 } + { 1F9D } { 1F95 } + { 1F9E } { 1F96 } + { 1F9F } { 1F97 } + { 1FA8 } { 1FA0 } + { 1FA9 } { 1FA1 } + { 1FAA } { 1FA2 } + { 1FAB } { 1FA3 } + { 1FAC } { 1FA4 } + { 1FAD } { 1FA5 } + { 1FAE } { 1FA6 } + { 1FAF } { 1FA7 } + { 1FB8 } { 1FB0 } + { 1FB9 } { 1FB1 } + { 1FBC } { 1FB3 } + { 1FCC } { 1FC3 } + { 1FD8 } { 1FD0 } + { 1FD9 } { 1FD1 } + { 1FE8 } { 1FE0 } + { 1FE9 } { 1FE1 } + { 1FEC } { 1FE5 } + { 1FFC } { 1FF3 } + \q_recursion_tail ? + \q_recursion_stop + \cs_set_protected:Npn \__text_tmp:w #1#2#3 + { + \group_begin: + \cs_set_protected:Npn \__text_tmp:w ##1##2##3##4##5##6##7##8 + { + \tl_const:cx + { + c__text_ #3 case_ + \char_generate:nn {##1} { 12 } + \char_generate:nn {##2} { 12 } + \char_generate:nn {##3} { 12 } + _tl + } + { + \exp_after:wN \exp_after:wN \exp_after:wN + \exp_not:N \char_generate:nn {##5} { 13 } + \exp_after:wN \exp_after:wN \exp_after:wN + \exp_not:N \char_generate:nn {##6} { 13 } + } + } + \use:x + { + \__text_tmp:w + \char_to_utfviii_bytes:n { "#1 } + \char_to_utfviii_bytes:n { "#2 } + } + \group_end: + } + \__text_tmp:w { 1FBE } { 0399 } { upper } + } +\group_end: \group_begin: \cs_set_protected:Npn \__text_change_case_setup:NN #1#2 { @@ -29883,8 +30949,11 @@ \tiny } { \text_declare_purify_equivalent:Nn #1 { } } +\exp_args:Nc \text_declare_purify_equivalent:Nn + { @protected@testopt } { \use_none:nnn } \text_declare_purify_equivalent:Nn \begin { \use:c } -\text_declare_purify_equivalent:Nn \end { \use:c } +\text_declare_purify_equivalent:Nn \end { \__text_end_env:n } +\cs_new:Npn \__text_end_env:n #1 { \cs:w end #1 \cs_end: } \text_declare_purify_equivalent:Nn \\ { } \tl_map_inline:nn { \{ \} \# \$ \% \_ } @@ -30472,9 +31541,9 @@ } \cs_generate_variant:Nn \seq_mapthread_function:NNN { Nc , c , cc } \cs_new_protected:Npn \seq_set_filter:NNn - { \__seq_set_filter:NNNn \tl_set:Nx } + { \__seq_set_filter:NNNn \__kernel_tl_set:Nx } \cs_new_protected:Npn \seq_gset_filter:NNn - { \__seq_set_filter:NNNn \tl_gset:Nx } + { \__seq_set_filter:NNNn \__kernel_tl_gset:Nx } \cs_new_protected:Npn \__seq_set_filter:NNNn #1#2#3#4 { \__seq_push_item_def:n { \bool_if:nT {#4} { \__seq_wrap_item:n {##1} } } @@ -30482,9 +31551,9 @@ \__seq_pop_item_def: } \cs_new_protected:Npn \seq_set_from_inline_x:Nnn - { \__seq_set_from_inline_x:NNnn \tl_set:Nx } + { \__seq_set_from_inline_x:NNnn \__kernel_tl_set:Nx } \cs_new_protected:Npn \seq_gset_from_inline_x:Nnn - { \__seq_set_from_inline_x:NNnn \tl_gset:Nx } + { \__seq_set_from_inline_x:NNnn \__kernel_tl_gset:Nx } \cs_new_protected:Npn \__seq_set_from_inline_x:NNnn #1#2#3#4 { \__seq_push_item_def:n { \exp_not:N \__seq_item:n {#4} } @@ -30644,7 +31713,7 @@ } } \cs_new_protected:Npn \tl_build_get:NN - { \__tl_build_get:NNN \tl_set:Nx } + { \__tl_build_get:NNN \__kernel_tl_set:Nx } \cs_new_protected:Npn \__tl_build_get:NNN #1#2#3 { #1 #3 { \if_false: { \fi: \exp_after:wN \__tl_build_get:w #2 } } } \cs_new:Npn \__tl_build_get:w #1 \__tl_build_last:NNn #2#3#4 @@ -30659,12 +31728,12 @@ { \exp_after:wN \exp_not:n \exp_after:wN { \if_false: } \fi: } \cs_new_protected:Npn \tl_build_end:N #1 { - \__tl_build_get:NNN \tl_set:Nx #1 #1 + \__tl_build_get:NNN \__kernel_tl_set:Nx #1 #1 \exp_args:Nc \__tl_build_end_loop:NN { \cs_to_str:N #1 ' } \tl_clear:N } \cs_new_protected:Npn \tl_build_gend:N #1 { - \__tl_build_get:NNN \tl_gset:Nx #1 #1 + \__tl_build_get:NNN \__kernel_tl_gset:Nx #1 #1 \exp_args:Nc \__tl_build_end_loop:NN { \cs_to_str:N #1 ' } \tl_gclear:N } \cs_new_protected:Npn \__tl_build_end_loop:NN #1#2 diff --git a/texmf/tex/latex/l3kernel/expl3-generic.tex b/texmf/tex/latex/l3kernel/expl3-generic.tex index 9b4cd0935..4c46ec108 100644 --- a/texmf/tex/latex/l3kernel/expl3-generic.tex +++ b/texmf/tex/latex/l3kernel/expl3-generic.tex @@ -19,16 +19,13 @@ %% and all files in that bundle must be distributed together. %% %% File: expl3.dtx -\def\ExplFileDate{2020-09-24}% +\def\ExplFileDate{2020-12-07}% \let\ExplLoaderFileDate\ExplFileDate \begingroup - \catcode`\>=12 - \def\aux#1>{} - \def\auxi{c__kernel_expl_date_tl}% - \edef\auxi{\expandafter\aux\meaning\auxi}% + \catcode`\_=11 \expandafter - \ifx\csname\auxi\endcsname\relax - \global\expandafter\let\csname\auxi\endcsname\ExplFileDate + \ifx\csname c__kernel_expl_date_tl\endcsname\relax + \global\let\c__kernel_expl_date_tl\ExplFileDate \fi \endgroup \begingroup diff --git a/texmf/tex/latex/l3kernel/expl3.ltx b/texmf/tex/latex/l3kernel/expl3.ltx index 558342f78..25f252196 100644 --- a/texmf/tex/latex/l3kernel/expl3.ltx +++ b/texmf/tex/latex/l3kernel/expl3.ltx @@ -19,16 +19,13 @@ %% and all files in that bundle must be distributed together. %% %% File: expl3.dtx -\def\ExplFileDate{2020-09-24}% +\def\ExplFileDate{2020-12-07}% \let\ExplLoaderFileDate\ExplFileDate \begingroup - \catcode`\>=12 - \def\aux#1>{} - \def\auxi{c__kernel_expl_date_tl}% - \edef\auxi{\expandafter\aux\meaning\auxi}% + \catcode`\_=11 \expandafter - \ifx\csname\auxi\endcsname\relax - \global\expandafter\let\csname\auxi\endcsname\ExplFileDate + \ifx\csname c__kernel_expl_date_tl\endcsname\relax + \global\let\c__kernel_expl_date_tl\ExplFileDate \fi \endgroup \everyjob\expandafter{\the\everyjob @@ -63,7 +60,7 @@ \else \expandafter\@gobble \fi - {\input{expl3-code.tex}}% + {\input expl3-code.tex }% \begingroup\expandafter\expandafter\expandafter\endgroup \expandafter\ifx\csname tex\string _let:D\endcsname\relax \expandafter\endinput diff --git a/texmf/tex/latex/l3kernel/expl3.lua b/texmf/tex/latex/l3kernel/expl3.lua index a60086c34..5b2308432 100644 --- a/texmf/tex/latex/l3kernel/expl3.lua +++ b/texmf/tex/latex/l3kernel/expl3.lua @@ -259,12 +259,17 @@ local luacmd do end end -- File: l3names.dtx +local minus_tok = token.new(string.byte'-', 12) +local zero_tok = token.new(string.byte'0', 12) +local one_tok = token.new(string.byte'1', 12) luacmd('tex_strcmp:D', function() local first = scan_string() local second = scan_string() - write(first == second and '0' - or first < second and '-1' - or '1') + if first < second then + put_next(minus_tok, one_tok) + else + put_next(first == second and zero_tok or one_tok) + end end, 'global') local cprint = tex.cprint luacmd('tex_Ucharcat:D', function() diff --git a/texmf/tex/latex/l3kernel/expl3.sty b/texmf/tex/latex/l3kernel/expl3.sty index d9cb4aa5c..19aeabe29 100644 --- a/texmf/tex/latex/l3kernel/expl3.sty +++ b/texmf/tex/latex/l3kernel/expl3.sty @@ -19,7 +19,7 @@ %% and all files in that bundle must be distributed together. %% %% File: expl3.dtx -\def\ExplFileDate{2020-09-24}% +\def\ExplFileDate{2020-12-07}% \let\ExplLoaderFileDate\ExplFileDate \ProvidesPackage{expl3} [% @@ -55,7 +55,7 @@ \else \expandafter\@gobble \fi - {\input{expl3-code.tex}}% + {\input expl3-code.tex }% \begingroup\expandafter\expandafter\expandafter\endgroup \expandafter\ifx\csname tex\string _let:D\endcsname\relax \expandafter\endinput diff --git a/texmf/tex/latex/l3kernel/l3debug.def b/texmf/tex/latex/l3kernel/l3debug.def index e995f3daa..d597ed971 100644 --- a/texmf/tex/latex/l3kernel/l3debug.def +++ b/texmf/tex/latex/l3kernel/l3debug.def @@ -71,7 +71,7 @@ } \cs_set_protected:Npn \debug_resume: { - \tl_set:Nx \l__debug_suspended_tl + \__kernel_tl_set:Nx \l__debug_suspended_tl { \tl_tail:N \l__debug_suspended_tl } \tl_if_empty:NT \l__debug_suspended_tl { @@ -213,11 +213,11 @@ \tl_new:N \l__debug_tmpb_tl \cs_new_protected:Npn \__debug_generate_parameter_list:NNN #1#2#3 { - \tl_set:Nx \l__debug_internal_tl + \__kernel_tl_set:Nx \l__debug_internal_tl { \exp_last_unbraced:Nf \use_ii:nnn \cs_split_function:N #1 } - \tl_set:Nx #2 + \__kernel_tl_set:Nx #2 { \exp_args:NV \__debug_build_parm_text:n \l__debug_internal_tl } - \tl_set:Nx #3 + \__kernel_tl_set:Nx #3 { \exp_args:NV \__debug_build_arg_list:n \l__debug_internal_tl } } \cs_new:Npn \__debug_build_parm_text:n #1 @@ -423,6 +423,8 @@ \tl_concat:NNN \tl_gconcat:NNN } +\cs_gset_protected:Npn \__kernel_tl_set:Nx { \cs_set_nopar:Npx } +\cs_gset_protected:Npn \__kernel_tl_gset:Nx { \cs_gset_nopar:Npx } \__kernel_patch:nnn { \__kernel_chk_var_local:N #1 } { } @@ -463,9 +465,7 @@ \skip_set_eq:NN \skip_add:Nn \skip_sub:Nn - \tl_set:Nn - \tl_set:No - \tl_set:Nx + \__kernel_tl_set:Nx \tl_set_eq:NN \tl_put_left:Nn \tl_put_left:NV @@ -527,9 +527,7 @@ \skip_gset_eq:NN \skip_gadd:Nn \skip_gsub:Nn - \tl_gset:Nn - \tl_gset:No - \tl_gset:Nx + \__kernel_tl_gset:Nx \tl_gset_eq:NN \tl_gput_left:Nn \tl_gput_left:NV @@ -650,7 +648,7 @@ { \__regex_trace_push:nnN { regex } { 1 } \__regex_escape_use:nnnn \group_begin: - \tl_set:Nx \l__regex_internal_a_tl + \__kernel_tl_set:Nx \l__regex_internal_a_tl { \__regex_trace_pop:nnN { regex } { 1 } \__regex_escape_use:nnnn } \use_none:nnn } diff --git a/texmf/tex/latex/l3kernel/l3deprecation.def b/texmf/tex/latex/l3kernel/l3deprecation.def index c38e4562a..2984fcc0a 100644 --- a/texmf/tex/latex/l3kernel/l3deprecation.def +++ b/texmf/tex/latex/l3kernel/l3deprecation.def @@ -74,7 +74,7 @@ \group_begin: \file_get:nnN {#3} {#2} \l__tl_internal_a_tl #2 \scan_stop: - \tl_set:Nx \l__tl_internal_a_tl { \l__tl_internal_a_tl } + \__kernel_tl_set:Nx \l__tl_internal_a_tl { \l__tl_internal_a_tl } \exp_args:NNNo \group_end: \tl_set:Nn #1 \l__tl_internal_a_tl } @@ -85,7 +85,7 @@ \group_begin: \file_get:nnN {#3} {#2} \l__tl_internal_a_tl #2 \scan_stop: - \tl_gset:Nx #1 { \l__tl_internal_a_tl } + \__kernel_tl_gset:Nx #1 { \l__tl_internal_a_tl } \group_end: } \cs_generate_variant:Nn \tl_gset_from_file_x:Nnn { c } diff --git a/texmf/tex/latex/l3kernel/l3doc.cls b/texmf/tex/latex/l3kernel/l3doc.cls index 529d1f129..0e0ce537e 100644 --- a/texmf/tex/latex/l3kernel/l3doc.cls +++ b/texmf/tex/latex/l3kernel/l3doc.cls @@ -135,7 +135,7 @@ \cs_new_protected:Npn \__codedoc_trim_right:Nn #1#2 { \cs_set:Npn \__codedoc_tmp:w ##1 #2 ##2 \q_stop { \exp_not:n {##1} } - \tl_set:Nx #1 { \exp_after:wN \__codedoc_tmp:w #1 #2 \q_stop } + \__kernel_tl_set:Nx #1 { \exp_after:wN \__codedoc_tmp:w #1 #2 \q_stop } } \cs_generate_variant:Nn \__codedoc_trim_right:Nn { No } \prg_new_protected_conditional:Npnn \__codedoc_str_if_begin:nn #1#2 { TF , T , F } @@ -270,14 +270,14 @@ \__codedoc_if_almost_str:nTF {#1} { \__codedoc_key_get_base_TF:nN {#1} \l__codedoc_tmpa_tl - \tl_set:Nx #2 + \__kernel_tl_set:Nx #2 { \__codedoc_split_function_do:on \l__codedoc_tmpa_tl { \__codedoc_base_form_aux:nnN } } } { \tl_set:Nn #2 {#1} } } \cs_new:Npx \__codedoc_key_get_base_TF:nN #1#2 { - \tl_set:Nx #2 { \exp_not:N \tl_to_str:n {#1} } + \__kernel_tl_set:Nx #2 { \exp_not:N \tl_to_str:n {#1} } \tl_if_in:NoF #2 { \tl_to_str:n {:} } { \exp_not:N \prg_break: } \tl_if_in:onT { #2 z } { \tl_to_str:n {TF} z } @@ -709,7 +709,7 @@ \verbatim@font \__codedoc_if_almost_str:VT \l__codedoc_cmd_tl { - \tl_set:Nx \l__codedoc_cmd_tl { \tl_to_str:N \l__codedoc_cmd_tl } + \__kernel_tl_set:Nx \l__codedoc_cmd_tl { \tl_to_str:N \l__codedoc_cmd_tl } \bool_if:NT \g__codedoc_cs_break_bool { \regex_replace_all:nnN @@ -726,14 +726,14 @@ { \quark_if_no_value:NF \l__codedoc_cmd_index_tl { - \tl_set:Nx \l__codedoc_cmd_tl + \__kernel_tl_set:Nx \l__codedoc_cmd_tl { \c_backslash_str \exp_not:o { \l__codedoc_cmd_index_tl } } } \exp_args:No \__codedoc_key_get:n { \l__codedoc_cmd_tl } \quark_if_no_value:NF \l__codedoc_cmd_module_tl { - \tl_set:Nx \l__codedoc_index_module_tl + \__kernel_tl_set:Nx \l__codedoc_index_module_tl { \tl_to_str:N \l__codedoc_cmd_module_tl } } \__codedoc_special_index_module:ooonN @@ -810,7 +810,7 @@ } \cs_new_protected:Npn \__codedoc_get_hyper_target:nN #1#2 { - \tl_set:Nx #2 { \tl_to_str:n {#1} } + \__kernel_tl_set:Nx #2 { \tl_to_str:n {#1} } \tl_replace_all:Nxn #2 { \c_underscore_str } { / } \tl_remove_all:Nx #2 { \c_backslash_str } \tl_put_left:Nn #2 { doc/function// } @@ -818,7 +818,7 @@ \cs_generate_variant:Nn \__codedoc_get_hyper_target:nN { o , x } \cs_new_protected:Npn \__codedoc_names_get_seq:nN #1#2 { - \tl_set:Nx \l__codedoc_tmpa_tl { \tl_to_str:n {#1} } + \__kernel_tl_set:Nx \l__codedoc_tmpa_tl { \tl_to_str:n {#1} } \bool_if:NTF \l__codedoc_names_verb_bool { \seq_clear:N #2 @@ -1417,7 +1417,7 @@ \l__codedoc_macro_do_not_index_tl \exp_args:NNV \seq_set_from_clist:Nn \l__codedoc_tmpa_seq \l__codedoc_macro_do_not_index_tl - \tl_set:Nx \l__codedoc_macro_do_not_index_tl + \__kernel_tl_set:Nx \l__codedoc_macro_do_not_index_tl { \seq_use:Nn \l__codedoc_tmpa_seq { , } } \exp_args:NV \DoNotIndex \l__codedoc_macro_do_not_index_tl } @@ -2207,7 +2207,7 @@ } \cs_new_protected:Npn \__codedoc_special_index_set:Nn #1#2 { - \tl_set:Nx #1 { \tl_to_str:n {#2} } + \__kernel_tl_set:Nx #1 { \tl_to_str:n {#2} } \__codedoc_if_almost_str:nTF {#2} { \tl_replace_all:Non #1 { \tl_to_str:n { __ } } @@ -2225,7 +2225,7 @@ \token_to_str:N \verb * \verbatimchar } } - \tl_set:Nx #1 + \__kernel_tl_set:Nx #1 { \token_to_str:N \verb * \verbatimchar #1 \verbatimchar @@ -2250,7 +2250,7 @@ \cs_new_protected:Npn \__codedoc_key_get:n #1 { \__codedoc_key_get_base:nN {#1} \l__codedoc_index_macro_tl - \tl_set:Nx \l__codedoc_index_key_tl + \__kernel_tl_set:Nx \l__codedoc_index_key_tl { \tl_to_str:N \l__codedoc_index_macro_tl } \tl_clear:N \l__codedoc_index_module_tl \tl_if_in:NoTF \l__codedoc_index_key_tl { \tl_to_str:n { __ } } @@ -2273,14 +2273,14 @@ } \cs_new_protected:Npn \__codedoc_key_pop: { - \tl_set:Nx \l__codedoc_index_key_tl + \__kernel_tl_set:Nx \l__codedoc_index_key_tl { \tl_tail:N \l__codedoc_index_key_tl } } \cs_new_protected:Npn \__codedoc_key_trim_module:n #1 { \cs_set:Npn \__codedoc_tmpa:w ##1 #1 ##2 \q_stop { \exp_not:n {##1} } - \tl_set:Nx \l__codedoc_index_module_tl + \__kernel_tl_set:Nx \l__codedoc_index_module_tl { \exp_after:wN \__codedoc_tmpa:w \l__codedoc_index_module_tl #1 \q_stop } } \cs_new_protected:Npn \__codedoc_key_drop_underscores: @@ -2314,7 +2314,7 @@ { \seq_set_split:NoV \l__codedoc_tmpa_seq { \token_to_str:N _ } \l__codedoc_index_key_tl - \tl_set:Nx \l__codedoc_index_module_tl + \__kernel_tl_set:Nx \l__codedoc_index_module_tl { \int_case:nnF { \seq_count:N \l__codedoc_tmpa_seq } { diff --git a/texmf/tex/latex/l3packages/xparse/xparse.ltx b/texmf/tex/latex/l3packages/xparse/xparse.ltx index af239a716..386d9dc09 100644 --- a/texmf/tex/latex/l3packages/xparse/xparse.ltx +++ b/texmf/tex/latex/l3packages/xparse/xparse.ltx @@ -23,7 +23,7 @@ \message{xparse <2020-03-03>}% } \ExplSyntaxOn -\file_input:n { xparse-generic.tex } +\input xparse-generic.tex ~ \ExplSyntaxOff %% %% diff --git a/texmf/tex/latex/l3packages/xparse/xparse.sty b/texmf/tex/latex/l3packages/xparse/xparse.sty index e14094269..9631935b7 100644 --- a/texmf/tex/latex/l3packages/xparse/xparse.sty +++ b/texmf/tex/latex/l3packages/xparse/xparse.sty @@ -32,7 +32,7 @@ }% \endinput } -\ProvidesExplPackage{xparse}{2020-05-15}{} +\ProvidesExplPackage{xparse}{2020-10-27}{} {L3 Experimental document command parser} \clist_new:N \l__xparse_options_clist \DeclareOption* { \clist_put_right:NV \l__xparse_options_clist \CurrentOption } @@ -45,7 +45,7 @@ \keys_set:nV { xparse } \l__xparse_options_clist \bool_if:NF \l__xparse_log_bool { \msg_redirect_module:nnn { LaTeX / xparse } { info } { none } } -\file_input:n { xparse-generic.tex } +\input xparse-generic.tex ~ \cs_gset_protected:Npn \__xparse_normalize_arg_spec_loop:n #1 { \quark_if_recursion_tail_stop:n {#1}