summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/l3kernel
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2020-05-12 03:03:03 +0000
committerNorbert Preining <norbert@preining.info>2020-05-12 03:03:03 +0000
commit675bcc9067ccef91624a9eca025506a4ce1d37b3 (patch)
tree03c68d83f091c038ad751310955938e407b46ff4 /macros/latex/contrib/l3kernel
parentfd95e879442e050790f06552eb074eeb7c5b4cab (diff)
CTAN sync 202005120303
Diffstat (limited to 'macros/latex/contrib/l3kernel')
-rw-r--r--macros/latex/contrib/l3kernel/CHANGELOG.md8
-rw-r--r--macros/latex/contrib/l3kernel/README.md2
-rw-r--r--macros/latex/contrib/l3kernel/expl3.dtx19
-rw-r--r--macros/latex/contrib/l3kernel/expl3.pdfbin584652 -> 584772 bytes
-rw-r--r--macros/latex/contrib/l3kernel/interface3.pdfbin1544267 -> 1544205 bytes
-rw-r--r--macros/latex/contrib/l3kernel/interface3.tex2
-rw-r--r--macros/latex/contrib/l3kernel/l3.ins2
-rw-r--r--macros/latex/contrib/l3kernel/l3alloc.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3basics.dtx85
-rw-r--r--macros/latex/contrib/l3kernel/l3bootstrap.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3box.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3candidates.dtx43
-rw-r--r--macros/latex/contrib/l3kernel/l3clist.dtx171
-rw-r--r--macros/latex/contrib/l3kernel/l3coffins.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3color-base.dtx23
-rw-r--r--macros/latex/contrib/l3kernel/l3debug.dtx51
-rw-r--r--macros/latex/contrib/l3kernel/l3deprecation.dtx18
-rw-r--r--macros/latex/contrib/l3kernel/l3doc.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3docstrip.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3docstrip.pdfbin263236 -> 263360 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3expan.dtx116
-rw-r--r--macros/latex/contrib/l3kernel/l3file.dtx160
-rw-r--r--macros/latex/contrib/l3kernel/l3final.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3flag.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3format.ins2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-assign.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-aux.dtx47
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-basics.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-convert.dtx6
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-expo.dtx6
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-extended.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-logic.dtx28
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-parse.dtx46
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-random.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-round.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-traps.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-trig.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fparray.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3int.dtx81
-rw-r--r--macros/latex/contrib/l3kernel/l3intarray.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3kernel-functions.dtx100
-rw-r--r--macros/latex/contrib/l3kernel/l3keys.dtx166
-rw-r--r--macros/latex/contrib/l3kernel/l3legacy.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3luatex.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3msg.dtx51
-rw-r--r--macros/latex/contrib/l3kernel/l3names.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3news.pdfbin379228 -> 379248 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news01.pdfbin113529 -> 113529 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news02.pdfbin140777 -> 140776 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news03.pdfbin137983 -> 144784 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news04.pdfbin107122 -> 107117 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news05.pdfbin105090 -> 105090 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news06.pdfbin140797 -> 140797 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news07.pdfbin119092 -> 119092 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news08.pdfbin152413 -> 152413 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news09.pdfbin235516 -> 235323 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news10.pdfbin140297 -> 147096 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news11.pdfbin159154 -> 165956 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news12.pdfbin192383 -> 199153 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3prefixes.pdfbin75066 -> 75066 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3prg.dtx46
-rw-r--r--macros/latex/contrib/l3kernel/l3prop.dtx66
-rw-r--r--macros/latex/contrib/l3kernel/l3quark.dtx399
-rw-r--r--macros/latex/contrib/l3kernel/l3regex.dtx53
-rw-r--r--macros/latex/contrib/l3kernel/l3seq.dtx34
-rw-r--r--macros/latex/contrib/l3kernel/l3skip.dtx40
-rw-r--r--macros/latex/contrib/l3kernel/l3sort.dtx78
-rw-r--r--macros/latex/contrib/l3kernel/l3str-convert.dtx150
-rw-r--r--macros/latex/contrib/l3kernel/l3str.dtx140
-rw-r--r--macros/latex/contrib/l3kernel/l3styleguide.pdfbin279985 -> 280109 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3styleguide.tex2
-rw-r--r--macros/latex/contrib/l3kernel/l3syntax-changes.pdfbin228282 -> 228403 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3syntax-changes.tex2
-rw-r--r--macros/latex/contrib/l3kernel/l3sys.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3term-glossary.pdfbin186503 -> 186619 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3term-glossary.tex2
-rw-r--r--macros/latex/contrib/l3kernel/l3text-case.dtx56
-rw-r--r--macros/latex/contrib/l3kernel/l3text-purify.dtx45
-rw-r--r--macros/latex/contrib/l3kernel/l3text.dtx96
-rw-r--r--macros/latex/contrib/l3kernel/l3tl-analysis.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3tl.dtx203
-rw-r--r--macros/latex/contrib/l3kernel/l3token.dtx93
-rw-r--r--macros/latex/contrib/l3kernel/l3unicode.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/source3.pdfbin5830603 -> 5890263 bytes
-rw-r--r--macros/latex/contrib/l3kernel/source3.tex2
-rw-r--r--macros/latex/contrib/l3kernel/source3body.tex2
87 files changed, 1950 insertions, 840 deletions
diff --git a/macros/latex/contrib/l3kernel/CHANGELOG.md b/macros/latex/contrib/l3kernel/CHANGELOG.md
index fdcb30461f..5baa671d01 100644
--- a/macros/latex/contrib/l3kernel/CHANGELOG.md
+++ b/macros/latex/contrib/l3kernel/CHANGELOG.md
@@ -7,6 +7,11 @@ this project uses date-based 'snapshot' version identifiers.
## [Unreleased]
+## [2020-05-11]
+
+### Changed
+- Internal changes to quark handling
+
## [2020-05-05]
### Added
@@ -673,7 +678,8 @@ this project uses date-based 'snapshot' version identifiers.
- Step func­tions have been added for dim vari­ables,
e.g. `\dim_step_in­line:nnnn`
-[Unreleased]: https://github.com/latex3/latex3/compare/2020-05-05...HEAD
+[Unreleased]: https://github.com/latex3/latex3/compare/2020-05-11...HEAD
+[2020-05-11]: https://github.com/latex3/latex3/compare/2020-05-05...2020-05-11
[2020-05-05]: https://github.com/latex3/latex3/compare/2020-04-06...2020-05-05
[2020-04-06]: https://github.com/latex3/latex3/compare/2020-03-06...2020-04-06
[2020-03-06]: https://github.com/latex3/latex3/compare/2020-03-03...2020-03-06
diff --git a/macros/latex/contrib/l3kernel/README.md b/macros/latex/contrib/l3kernel/README.md
index 2dc96da2b8..3a7c3730b9 100644
--- a/macros/latex/contrib/l3kernel/README.md
+++ b/macros/latex/contrib/l3kernel/README.md
@@ -1,7 +1,7 @@
LaTeX3 Programming Conventions
==============================
-Release 2020-05-05
+Release 2020-05-11
Overview
--------
diff --git a/macros/latex/contrib/l3kernel/expl3.dtx b/macros/latex/contrib/l3kernel/expl3.dtx
index 3c90cc81a3..a24e520f45 100644
--- a/macros/latex/contrib/l3kernel/expl3.dtx
+++ b/macros/latex/contrib/l3kernel/expl3.dtx
@@ -24,7 +24,7 @@
%
%<*driver|generic|package|2ekernel>
%</driver|generic|package|2ekernel>
-\def\ExplFileDate{2020-05-05}%
+\def\ExplFileDate{2020-05-11}%
%<*driver>
\documentclass[full]{l3doc}
\usepackage{graphicx}
@@ -51,7 +51,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
@@ -1334,6 +1334,17 @@
{ \sys_everyjob: }
% \end{macrocode}
%
+% \begin{variable}{\s_@@_stop}
+% Internal scan marks. This code has to be reload-safe, so this one
+% has to be guarded with \cs{if_cs_exist:N} (\cs{cs_if_exist:NF}) wouldn't
+% do because it returns false for control sequences equal to \cs{scan_stop:}.
+% \begin{macrocode}
+\reverse_if:N \if_cs_exist:N \s_@@_stop
+ \scan_new:N \s_@@_stop
+\fi:
+% \end{macrocode}
+% \end{variable}
+%
% \begin{macro}{\@pushfilename, \@popfilename}
% \begin{macro}{\@@_status_pop:w}
% The idea here is to use \LaTeXe{}'s \tn{@pushfilename} and
@@ -1372,14 +1383,14 @@
\__kernel_file_input_pop:
\tl_if_empty:NTF \l_@@_status_stack_tl
{ \ExplSyntaxOff }
- { \exp_after:wN \@@_status_pop:w \l_@@_status_stack_tl \q_stop }
+ { \exp_after:wN \@@_status_pop:w \l_@@_status_stack_tl \s_@@_stop }
}
% \end{macrocode}
% The pop auxiliary function removes the first item from the stack,
% saves the rest of the stack and then does the test. The flag here
% is not a proper \texttt{bool}, so a low-level test is used.
% \begin{macrocode}
-\cs_gset_protected:Npn \@@_status_pop:w #1#2 \q_stop
+\cs_gset_protected:Npn \@@_status_pop:w #1#2 \s_@@_stop
{
\tl_set:Nn \l_@@_status_stack_tl {#2}
\int_if_odd:nTF {#1}
diff --git a/macros/latex/contrib/l3kernel/expl3.pdf b/macros/latex/contrib/l3kernel/expl3.pdf
index 7c1568abfb..b16b80e0c7 100644
--- a/macros/latex/contrib/l3kernel/expl3.pdf
+++ b/macros/latex/contrib/l3kernel/expl3.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/interface3.pdf b/macros/latex/contrib/l3kernel/interface3.pdf
index 302d3f088b..f91da62ed4 100644
--- a/macros/latex/contrib/l3kernel/interface3.pdf
+++ b/macros/latex/contrib/l3kernel/interface3.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/interface3.tex b/macros/latex/contrib/l3kernel/interface3.tex
index 7b0c6e179b..e1b46c0897 100644
--- a/macros/latex/contrib/l3kernel/interface3.tex
+++ b/macros/latex/contrib/l3kernel/interface3.tex
@@ -54,7 +54,7 @@ for those people who are interested.
{latex-team@latex-project.org}%
}%
}
-\date{Released 2020-05-05}
+\date{Released 2020-05-11}
\pagenumbering{roman}
\maketitle
diff --git a/macros/latex/contrib/l3kernel/l3.ins b/macros/latex/contrib/l3kernel/l3.ins
index 86d4ac5280..04d1e18a34 100644
--- a/macros/latex/contrib/l3kernel/l3.ins
+++ b/macros/latex/contrib/l3kernel/l3.ins
@@ -65,9 +65,9 @@ and all files in that bundle must be distributed together.
\from{l3names.dtx} {package}
\from{l3basics.dtx} {package}
\from{l3expan.dtx} {package}
+ \from{l3quark.dtx} {package}
\from{l3tl.dtx} {package}
\from{l3str.dtx} {package}
- \from{l3quark.dtx} {package}
\from{l3seq.dtx} {package}
\from{l3int.dtx} {package}
\from{l3flag.dtx} {package}
diff --git a/macros/latex/contrib/l3kernel/l3alloc.dtx b/macros/latex/contrib/l3kernel/l3alloc.dtx
index fee2e0fdfa..188477adcf 100644
--- a/macros/latex/contrib/l3kernel/l3alloc.dtx
+++ b/macros/latex/contrib/l3kernel/l3alloc.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3basics.dtx b/macros/latex/contrib/l3kernel/l3basics.dtx
index 5784ade6f5..22b7a75d15 100644
--- a/macros/latex/contrib/l3kernel/l3basics.dtx
+++ b/macros/latex/contrib/l3kernel/l3basics.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
@@ -1368,6 +1368,7 @@
\tex_let:D \if_charcode:w \tex_if:D
\tex_let:D \if_catcode:w \tex_ifcat:D
\tex_let:D \if_meaning:w \tex_ifx:D
+\tex_let:D \if_bool:N \tex_ifodd:D
% \end{macrocode}
% \end{macro}
%
@@ -1693,7 +1694,7 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}
+% \begin{macro}[EXP]
% {
% \use_i_delimit_by_q_nil:nw ,
% \use_i_delimit_by_q_stop:nw ,
@@ -1846,6 +1847,14 @@
% two arguments are absorbed then the code would work.
% \end{macro}
%
+% \begin{macro}[EXP]{\@@_use_none_delimit_by_q_recursion_stop:w}
+% Private version of \cs{use_none_delimit_by_q_recursion_stop:w}.
+% \begin{macrocode}
+\cs_set:Npn \@@_use_none_delimit_by_q_recursion_stop:w
+ #1 \q_@@_recursion_stop { }
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}
% {
% \prg_set_conditional:Npnn ,
@@ -1981,17 +1990,17 @@
\exp_not:N \@@_generate_conditional:NNnnnnNw
\exp_not:n { #4 #5 {#1} {#2} {#6} }
\@@_generate_conditional_test:w
- #8 \q_mark
+ #8 \s_@@_mark
\@@_generate_conditional_fast:nw
- \prg_return_true: \else: \prg_return_false: \fi: \q_mark
+ \prg_return_true: \else: \prg_return_false: \fi: \s_@@_mark
\use_none:n
\exp_not:n { {#8} \use_i_ii:nnn }
\tl_to_str:n {#7}
- \exp_not:n { , \q_recursion_tail , \q_recursion_stop }
+ \exp_not:n { , \q_@@_recursion_tail , \q_@@_recursion_stop }
}
}
\cs_set:Npn \@@_generate_conditional_test:w
- #1 \prg_return_true: \else: \prg_return_false: \fi: \q_mark #2
+ #1 \prg_return_true: \else: \prg_return_false: \fi: \s_@@_mark #2
{ #2 {#1} }
\cs_set:Npn \@@_generate_conditional_fast:nw #1#2 \exp_not:n #3
{ \exp_not:n { {#1} \use_i:nn } }
@@ -2006,8 +2015,8 @@
% \begin{macrocode}
\cs_set_protected:Npn \@@_generate_conditional:NNnnnnNw #1#2#3#4#5#6#7#8 ,
{
- \if_meaning:w \q_recursion_tail #8
- \exp_after:wN \use_none_delimit_by_q_recursion_stop:w
+ \if_meaning:w \q_@@_recursion_tail #8
+ \exp_after:wN \@@_use_none_delimit_by_q_recursion_stop:w
\fi:
\use:c { @@_generate_ #8 _form:wNNnnnnN }
\tl_if_empty:nF {#8}
@@ -2017,7 +2026,7 @@
{#8} { \token_to_str:c { #3 : #4 } }
}
\use_none:nnnnnnnn
- \q_stop
+ \s_@@_stop
#1 #2 {#3} {#4} {#5} {#6} #7
\@@_generate_conditional:NNnnnnNw #1 #2 {#3} {#4} {#5} {#6} #7
}
@@ -2052,7 +2061,7 @@
% nesting of conditionals.
% \begin{macrocode}
\cs_set_protected:Npn \@@_generate_p_form:wNNnnnnN
- #1 \q_stop #2#3#4#5#6#7#8
+ #1 \s_@@_stop #2#3#4#5#6#7#8
{
\if_meaning:w e #3
\exp_after:wN \use_i:nn
@@ -2071,7 +2080,7 @@
}
}
\cs_set_protected:Npn \@@_generate_T_form:wNNnnnnN
- #1 \q_stop #2#3#4#5#6#7#8
+ #1 \s_@@_stop #2#3#4#5#6#7#8
{
#8
{ \exp_args:Nc #2 { #4 : #5 T } #6 }
@@ -2079,7 +2088,7 @@
{ #7 \exp_after:wN \use_ii:nn \fi: \use_none:n }
}
\cs_set_protected:Npn \@@_generate_F_form:wNNnnnnN
- #1 \q_stop #2#3#4#5#6#7#8
+ #1 \s_@@_stop #2#3#4#5#6#7#8
{
#8
{ \exp_args:Nc #2 { #4 : #5 F } #6 }
@@ -2087,7 +2096,7 @@
{ #7 \exp_after:wN \use_none:nn \fi: \use:n }
}
\cs_set_protected:Npn \@@_generate_TF_form:wNNnnnnN
- #1 \q_stop #2#3#4#5#6#7#8
+ #1 \s_@@_stop #2#3#4#5#6#7#8
{
#8
{ \exp_args:Nc #2 { #4 : #5 TF } #6 }
@@ -2104,8 +2113,8 @@
% The setting-equal functions. Split both functions and feed
% \Arg{name_1} \Arg{signature_1} \meta{boolean_1}
% \Arg{name_2} \Arg{signature_2} \meta{boolean_2}
-% \meta{copying~function} \meta{conditions} |,| \cs{q_recursion_tail}
-% |,| \cs{q_recursion_stop}
+% \meta{copying~function} \meta{conditions} |,| \cs{q_@@_recursion_tail}
+% |,| \cs{q_@@_recursion_stop}
% to a first auxiliary.
% \begin{macrocode}
\cs_set_protected:Npn \prg_set_eq_conditional:NNn
@@ -2121,7 +2130,7 @@
\cs_split_function:N #3
\exp_not:N #1
\tl_to_str:n {#4}
- \exp_not:n { , \q_recursion_tail , \q_recursion_stop }
+ \exp_not:n { , \q_@@_recursion_tail , \q_@@_recursion_stop }
}
}
% \end{macrocode}
@@ -2156,19 +2165,19 @@
\if_meaning:w \c_false_bool #3
\__kernel_msg_error:nnx { kernel } { missing-colon }
{ \token_to_str:c {#1} }
- \exp_after:wN \use_none_delimit_by_q_recursion_stop:w
+ \exp_after:wN \@@_use_none_delimit_by_q_recursion_stop:w
\fi:
\if_meaning:w \c_false_bool #6
\__kernel_msg_error:nnx { kernel } { missing-colon }
{ \token_to_str:c {#4} }
- \exp_after:wN \use_none_delimit_by_q_recursion_stop:w
+ \exp_after:wN \@@_use_none_delimit_by_q_recursion_stop:w
\fi:
\@@_set_eq_conditional_loop:nnnnNw {#1} {#2} {#4} {#5}
}
\cs_set_protected:Npn \@@_set_eq_conditional_loop:nnnnNw #1#2#3#4#5#6 ,
{
- \if_meaning:w \q_recursion_tail #6
- \exp_after:wN \use_none_delimit_by_q_recursion_stop:w
+ \if_meaning:w \q_@@_recursion_tail #6
+ \exp_after:wN \@@_use_none_delimit_by_q_recursion_stop:w
\fi:
\use:c { @@_set_eq_conditional_ #6 _form:wNnnnn }
\tl_if_empty:nF {#6}
@@ -2178,17 +2187,17 @@
{#6} { \token_to_str:c { #1 : #2 } }
}
\use_none:nnnnnn
- \q_stop
+ \s_@@_stop
#5 {#1} {#2} {#3} {#4}
\@@_set_eq_conditional_loop:nnnnNw {#1} {#2} {#3} {#4} #5
}
-\cs_set:Npn \@@_set_eq_conditional_p_form:wNnnnn #1 \q_stop #2#3#4#5#6
+\cs_set:Npn \@@_set_eq_conditional_p_form:wNnnnn #1 \s_@@_stop #2#3#4#5#6
{ #2 { #3 _p : #4 } { #5 _p : #6 } }
-\cs_set:Npn \@@_set_eq_conditional_TF_form:wNnnnn #1 \q_stop #2#3#4#5#6
+\cs_set:Npn \@@_set_eq_conditional_TF_form:wNnnnn #1 \s_@@_stop #2#3#4#5#6
{ #2 { #3 : #4 TF } { #5 : #6 TF } }
-\cs_set:Npn \@@_set_eq_conditional_T_form:wNnnnn #1 \q_stop #2#3#4#5#6
+\cs_set:Npn \@@_set_eq_conditional_T_form:wNnnnn #1 \s_@@_stop #2#3#4#5#6
{ #2 { #3 : #4 T } { #5 : #6 T } }
-\cs_set:Npn \@@_set_eq_conditional_F_form:wNnnnn #1 \q_stop #2#3#4#5#6
+\cs_set:Npn \@@_set_eq_conditional_F_form:wNnnnn #1 \s_@@_stop #2#3#4#5#6
{ #2 { #3 : #4 F } { #5 : #6 F } }
% \end{macrocode}
% \end{macro}
@@ -2335,12 +2344,12 @@
% First ensure that we actually get a properly evaluated string by
% expanding \cs{cs_to_str:N} twice. If the function contained a
% colon, the auxiliary takes as |#1| the function name, delimited by
-% the first colon, then the signature |#2|, delimited by \cs{q_mark},
-% then \cs{c_true_bool} as |#3|, and |#4| cleans up until \cs{q_stop}.
-% Otherwise, the |#1| contains the function name and \cs{q_mark}
+% the first colon, then the signature |#2|, delimited by \cs{s_@@_mark},
+% then \cs{c_true_bool} as |#3|, and |#4| cleans up until \cs{s_@@_stop}.
+% Otherwise, the |#1| contains the function name and \cs{s_@@_mark}
% \cs{c_true_bool}, |#2| is empty, |#3| is \cs{c_false_bool}, and |#4|
% cleans up. The second
-% auxiliary trims the trailing \cs{q_mark} from the function name if
+% auxiliary trims the trailing \cs{s_@@_mark} from the function name if
% present (that is, if the original function had no colon).
% \begin{macrocode}
\cs_set_protected:Npn \@@_tmp:w #1
@@ -2349,13 +2358,13 @@
{
\exp_after:wN \exp_after:wN \exp_after:wN
\@@_split_function_auxi:w
- \cs_to_str:N ##1 \q_mark \c_true_bool
- #1 \q_mark \c_false_bool \q_stop
+ \cs_to_str:N ##1 \s_@@_mark \c_true_bool
+ #1 \s_@@_mark \c_false_bool \s_@@_stop
}
\cs_set:Npn \@@_split_function_auxi:w
- ##1 #1 ##2 \q_mark ##3##4 \q_stop
- { \@@_split_function_auxii:w ##1 \q_mark \q_stop {##2} ##3 }
- \cs_set:Npn \@@_split_function_auxii:w ##1 \q_mark ##2 \q_stop
+ ##1 #1 ##2 \s_@@_mark ##3##4 \s_@@_stop
+ { \@@_split_function_auxii:w ##1 \s_@@_mark \s_@@_stop {##2} ##3 }
+ \cs_set:Npn \@@_split_function_auxii:w ##1 \s_@@_mark ##2 \s_@@_stop
{ {##1} }
}
\exp_after:wN \@@_tmp:w \token_to_str:N :
@@ -3158,7 +3167,7 @@
\use:x
{
\exp_not:n { \cs_new:Npn \@@_prefix_arg_replacement:wN #1 }
- \tl_to_str:n { macro : } \exp_not:n { #2 -> #3 \q_stop #4 }
+ \tl_to_str:n { macro : } \exp_not:n { #2 -> #3 \s_@@_stop #4 }
}
{ #4 {#1} {#2} {#3} }
\cs_new:Npn \cs_prefix_spec:N #1
@@ -3166,7 +3175,7 @@
\token_if_macro:NTF #1
{
\exp_after:wN \@@_prefix_arg_replacement:wN
- \token_to_meaning:N #1 \q_stop \use_i:nnn
+ \token_to_meaning:N #1 \s_@@_stop \use_i:nnn
}
{ \scan_stop: }
}
@@ -3175,7 +3184,7 @@
\token_if_macro:NTF #1
{
\exp_after:wN \@@_prefix_arg_replacement:wN
- \token_to_meaning:N #1 \q_stop \use_ii:nnn
+ \token_to_meaning:N #1 \s_@@_stop \use_ii:nnn
}
{ \scan_stop: }
}
@@ -3184,7 +3193,7 @@
\token_if_macro:NTF #1
{
\exp_after:wN \@@_prefix_arg_replacement:wN
- \token_to_meaning:N #1 \q_stop \use_iii:nnn
+ \token_to_meaning:N #1 \s_@@_stop \use_iii:nnn
}
{ \scan_stop: }
}
diff --git a/macros/latex/contrib/l3kernel/l3bootstrap.dtx b/macros/latex/contrib/l3kernel/l3bootstrap.dtx
index 224163be1b..4ff6267be1 100644
--- a/macros/latex/contrib/l3kernel/l3bootstrap.dtx
+++ b/macros/latex/contrib/l3kernel/l3bootstrap.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3box.dtx b/macros/latex/contrib/l3kernel/l3box.dtx
index 3c8e9d93f2..7c6b12dd78 100644
--- a/macros/latex/contrib/l3kernel/l3box.dtx
+++ b/macros/latex/contrib/l3kernel/l3box.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3candidates.dtx b/macros/latex/contrib/l3kernel/l3candidates.dtx
index 7ae1a7afe8..c97fb26e25 100644
--- a/macros/latex/contrib/l3kernel/l3candidates.dtx
+++ b/macros/latex/contrib/l3kernel/l3candidates.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
@@ -1001,8 +1001,8 @@
\cs_new:Npn \@@_expandable_error_module:nn #1#2
{
\exp_after:wN \exp_after:wN
- \exp_after:wN \use_none_delimit_by_q_stop:w
- \use:n { \::error ! ~ #2 : ~ #1 } \q_stop
+ \exp_after:wN \@@_use_none_delimit_by_s_stop:w
+ \use:n { \::error ! ~ #2 : ~ #1 } \s_@@_stop
}
% \end{macrocode}
% \end{macro}
@@ -1079,6 +1079,14 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{variable}{\s_@@_mark,\s_@@_stop}
+% Internal scan marks.
+% \begin{macrocode}
+\scan_new:N \s_@@_mark
+\scan_new:N \s_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
% \begin{macro}[EXP, noTF]{\bool_case_true:n, \bool_case_false:n}
% \begin{macro}{\@@_case:NnTF}
% \begin{macro}{\@@_case_true:w, \@@_case_false:w, \@@_case_end:nw}
@@ -1104,7 +1112,7 @@
\cs_new:Npn \@@_case:NnTF #1#2#3#4
{
\bool_if:NTF #1 \@@_case_true:w \@@_case_false:w
- #2 #1 { } \q_mark {#3} \q_mark {#4} \q_stop
+ #2 #1 { } \s_@@_mark {#3} \s_@@_mark {#4} \s_@@_stop
}
\cs_new:Npn \@@_case_true:w #1#2
{
@@ -1118,7 +1126,7 @@
{ \@@_case_false:w }
{ \@@_case_end:nw {#2} }
}
-\cs_new:Npn \@@_case_end:nw #1#2#3 \q_mark #4#5 \q_stop
+\cs_new:Npn \@@_case_end:nw #1#2#3 \s_@@_mark #4#5 \s_@@_stop
{ \exp_end: #1 #4 }
% \end{macrocode}
% \end{macro}
@@ -1131,6 +1139,13 @@
%<@@=prop>
% \end{macrocode}
%
+% \begin{macro}[EXP]{\@@_use_i_delimit_by_s_stop:nw}
+% Functions to gobble up to a scan mark.
+% \begin{macrocode}
+\cs_new:Npn \@@_use_i_delimit_by_s_stop:nw #1 #2 \s_@@_stop {#1}
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}[EXP]
% {\prop_rand_key_value:N, \prop_rand_key_value:c}
% \begin{macro}[EXP]{\@@_rand_item:w}
@@ -1146,14 +1161,14 @@
{
\exp_after:wN \@@_rand_item:w
\int_value:w \int_rand:nn { 1 } { \prop_count:N #1 }
- #1 \q_stop
+ #1 \s_@@_stop
}
}
\cs_generate_variant:Nn \prop_rand_key_value:N { c }
\cs_new:Npn \@@_rand_item:w #1 \s_@@ \@@_pair:wn #2 \s_@@ #3
{
\int_compare:nNnF {#1} > 1
- { \use_i_delimit_by_q_stop:nw { \exp_not:n { {#2} {#3} } } }
+ { \@@_use_i_delimit_by_s_stop:nw { \exp_not:n { {#2} {#3} } } }
\exp_after:wN \@@_rand_item:w
\int_value:w \int_eval:n { #1 - 1 } \s_@@
}
@@ -1189,25 +1204,25 @@
% worrying about which is longer.
% \begin{macrocode}
\cs_new:Npn \seq_mapthread_function:NNN #1#2#3
- { \exp_after:wN \@@_mapthread_function:wNN #2 \q_stop #1 #3 }
-\cs_new:Npn \@@_mapthread_function:wNN \s_@@ #1 \q_stop #2#3
+ { \exp_after:wN \@@_mapthread_function:wNN #2 \s_@@_stop #1 #3 }
+\cs_new:Npn \@@_mapthread_function:wNN \s_@@ #1 \s_@@_stop #2#3
{
- \exp_after:wN \@@_mapthread_function:wNw #2 \q_stop #3
+ \exp_after:wN \@@_mapthread_function:wNw #2 \s_@@_stop #3
#1 { ? \prg_break: } { }
\prg_break_point:
}
-\cs_new:Npn \@@_mapthread_function:wNw \s_@@ #1 \q_stop #2
+\cs_new:Npn \@@_mapthread_function:wNw \s_@@ #1 \s_@@_stop #2
{
\@@_mapthread_function:Nnnwnn #2
#1 { ? \prg_break: } { }
- \q_stop
+ \s_@@_stop
}
-\cs_new:Npn \@@_mapthread_function:Nnnwnn #1#2#3#4 \q_stop #5#6
+\cs_new:Npn \@@_mapthread_function:Nnnwnn #1#2#3#4 \s_@@_stop #5#6
{
\use_none:n #2
\use_none:n #5
#1 {#3} {#6}
- \@@_mapthread_function:Nnnwnn #1 #4 \q_stop
+ \@@_mapthread_function:Nnnwnn #1 #4 \s_@@_stop
}
\cs_generate_variant:Nn \seq_mapthread_function:NNN { Nc , c , cc }
% \end{macrocode}
diff --git a/macros/latex/contrib/l3kernel/l3clist.dtx b/macros/latex/contrib/l3kernel/l3clist.dtx
index ec24d2de47..0b011f80e0 100644
--- a/macros/latex/contrib/l3kernel/l3clist.dtx
+++ b/macros/latex/contrib/l3kernel/l3clist.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
@@ -94,8 +94,7 @@
% than their sequence analogues for large lists. However, these
% functions work slowly for \enquote{unsafe} items that must be braced,
% and may produce errors when their argument contains |{|, |}| or |#|
-% (assuming the usual \TeX{} category codes apply). In addition, comma
-% lists cannot store quarks \cs{q_mark} or \cs{q_stop}. The sequence
+% (assuming the usual \TeX{} category codes apply). The sequence
% data type should thus certainly be preferred to comma lists to store
% such items.
%
@@ -785,6 +784,41 @@
% \end{macrocode}
% \end{variable}
%
+% \begin{variable}{\s_@@_mark,\s_@@_stop}
+% Internal scan marks.
+% \begin{macrocode}
+\scan_new:N \s_@@_mark
+\scan_new:N \s_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP]{
+% \@@_use_none_delimit_by_s_stop:w,
+% \@@_use_i_delimit_by_s_stop:nw
+% }
+% Functions to gobble up to a scan mark.
+% \begin{macrocode}
+\cs_new:Npn \@@_use_none_delimit_by_s_stop:w #1 \s_@@_stop { }
+\cs_new:Npn \@@_use_i_delimit_by_s_stop:nw #1 #2 \s_@@_stop {#1}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{variable}{\q_@@_recursion_tail,\q_@@_recursion_stop}
+% Internal recursion quarks.
+% \begin{macrocode}
+\quark_new:N \q_@@_recursion_tail
+\quark_new:N \q_@@_recursion_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP]{\@@_if_recursion_tail_break:nN,\@@_if_recursion_tail_stop:n}
+% Functions to query recursion quarks.
+% \begin{macrocode}
+\__kernel_quark_new_test:N \@@_if_recursion_tail_break:nN
+\__kernel_quark_new_test:N \@@_if_recursion_tail_stop:n
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\@@_tmp:w}
% A temporary function for various purposes.
% \begin{macrocode}
@@ -826,11 +860,11 @@
{
\exp_after:wN \@@_sanitize:Nn \exp_after:wN \c_empty_tl
\exp:w \@@_trim_next:w \prg_do_nothing:
- #1 , \q_recursion_tail , \q_recursion_stop
+ #1 , \q_@@_recursion_tail , \q_@@_recursion_stop
}
\cs_new:Npn \@@_sanitize:Nn #1#2
{
- \quark_if_recursion_tail_stop:n {#2}
+ \@@_if_recursion_tail_stop:n {#2}
#1 \@@_wrap_item:w #2 ,
\exp_after:wN \@@_sanitize:Nn \exp_after:wN ,
\exp:w \@@_trim_next:w \prg_do_nothing:
@@ -850,7 +884,7 @@
% \end{itemize}
% All \pkg{l3clist} functions go through the same test when they need
% to determine whether to brace an item, so it is not a problem that
-% this test has false positives such as \enquote{\cs{q_mark}
+% this test has false positives such as \enquote{\cs{s_@@_mark}
% \texttt{?}}. If the argument starts or end with a space or contains
% a comma then one of the three arguments of \cs{@@_if_wrap:w} will
% have its end delimiter (partly) in one of the three copies of |#1|
@@ -865,7 +899,8 @@
\tl_if_empty:oTF
{
\@@_if_wrap:w
- \q_mark ? #1 ~ \q_mark ? ~ #1 \q_mark , ~ \q_mark #1 ,
+ \s_@@_mark ? #1 ~ \s_@@_mark ? ~ #1
+ \s_@@_mark , ~ \s_@@_mark #1 ,
}
{
\tl_if_head_is_group:nTF { #1 { } }
@@ -882,7 +917,7 @@
}
{ \prg_return_true: }
}
-\cs_new:Npn \@@_if_wrap:w #1 \q_mark ? ~ #2 ~ \q_mark #3 , { }
+\cs_new:Npn \@@_if_wrap:w #1 \s_@@_mark ? ~ #2 ~ \s_@@_mark #3 , { }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -1180,10 +1215,10 @@
\if_meaning:w #1 \c_empty_clist
\tl_set:Nn #2 { \q_no_value }
\else:
- \exp_after:wN \@@_get:wN #1 , \q_stop #2
+ \exp_after:wN \@@_get:wN #1 , \s_@@_stop #2
\fi:
}
-\cs_new_protected:Npn \@@_get:wN #1 , #2 \q_stop #3
+\cs_new_protected:Npn \@@_get:wN #1 , #2 \s_@@_stop #3
{ \tl_set:Nn #3 {#1} }
\cs_generate_variant:Nn \clist_get:NN { c }
% \end{macrocode}
@@ -1199,8 +1234,8 @@
% An empty clist leads to \cs{q_no_value}, otherwise grab until the
% first comma and assign to the variable. The second argument of
% \cs{@@_pop:wwNNN} is a comma list ending in a comma and
-% \cs{q_mark}, unless the original clist contained exactly one item:
-% then the argument is just \cs{q_mark}. The next auxiliary picks
+% \cs{s_@@_mark}, unless the original clist contained exactly one item:
+% then the argument is just \cs{s_@@_mark}. The next auxiliary picks
% either \cs{exp_not:n} or \cs{use_none:n} as |#2|, ensuring that the
% result can safely be an empty comma list.
% \begin{macrocode}
@@ -1213,21 +1248,21 @@
\if_meaning:w #2 \c_empty_clist
\tl_set:Nn #3 { \q_no_value }
\else:
- \exp_after:wN \@@_pop:wwNNN #2 , \q_mark \q_stop #1#2#3
+ \exp_after:wN \@@_pop:wwNNN #2 , \s_@@_mark \s_@@_stop #1#2#3
\fi:
}
-\cs_new_protected:Npn \@@_pop:wwNNN #1 , #2 \q_stop #3#4#5
+\cs_new_protected:Npn \@@_pop:wwNNN #1 , #2 \s_@@_stop #3#4#5
{
\tl_set:Nn #5 {#1}
#3 #4
{
\@@_pop:wN \prg_do_nothing:
#2 \exp_not:o
- , \q_mark \use_none:n
- \q_stop
+ , \s_@@_mark \use_none:n
+ \s_@@_stop
}
}
-\cs_new:Npn \@@_pop:wN #1 , \q_mark #2 #3 \q_stop { #2 {#1} }
+\cs_new:Npn \@@_pop:wN #1 , \s_@@_mark #2 #3 \s_@@_stop { #2 {#1} }
\cs_generate_variant:Nn \clist_pop:NN { c }
\cs_generate_variant:Nn \clist_gpop:NN { c }
% \end{macrocode}
@@ -1246,7 +1281,7 @@
\if_meaning:w #1 \c_empty_clist
\prg_return_false:
\else:
- \exp_after:wN \@@_get:wN #1 , \q_stop #2
+ \exp_after:wN \@@_get:wN #1 , \s_@@_stop #2
\prg_return_true:
\fi:
}
@@ -1260,7 +1295,7 @@
\if_meaning:w #2 \c_empty_clist
\prg_return_false:
\else:
- \exp_after:wN \@@_pop:wwNNN #2 , \q_mark \q_stop #1#2#3
+ \exp_after:wN \@@_pop:wwNNN #2 , \s_@@_mark \s_@@_stop #1#2#3
\prg_return_true:
\fi:
}
@@ -1364,13 +1399,13 @@
% the expanded comma list, and another copy of the \meta{item}.
% The loop is controlled by the argument grabbed by
% \cs{@@_remove_all:w}: when the item was found,
-% the \cs{q_mark} delimiter used is the one inserted by
-% \cs{@@_tmp:w}, and \cs{use_none_delimit_by_q_stop:w}
+% the \cs{s_@@_mark} delimiter used is the one inserted by
+% \cs{@@_tmp:w}, and \cs{@@_use_none_delimit_by_s_stop:w}
% is deleted. At the end, the final \meta{item} is
% grabbed, and the argument of \cs{@@_tmp:w} contains
-% \cs{q_mark}: in that case, \cs{@@_remove_all:w}
-% removes the second \cs{q_mark} (inserted by \cs{@@_tmp:w}),
-% and lets \cs{use_none_delimit_by_q_stop:w} act.
+% \cs{s_@@_mark}: in that case, \cs{@@_remove_all:w}
+% removes the second \cs{s_@@_mark} (inserted by \cs{@@_tmp:w}),
+% and lets \cs{@@_use_none_delimit_by_s_stop:w} act.
%
% No brace is lost because items are always grabbed with a leading comma.
% The result of the first assignment has an extra leading comma,
@@ -1396,13 +1431,13 @@
\cs_set:Npn \@@_tmp:w ##1 , #4 ,
{
##1
- , \q_mark , \use_none_delimit_by_q_stop:w ,
+ , \s_@@_mark , \@@_use_none_delimit_by_s_stop:w ,
\@@_remove_all:
}
#2 #3
{
\exp_after:wN \@@_remove_all:
- #3 , \q_mark , #4 , \q_stop
+ #3 , \s_@@_mark , #4 , \s_@@_stop
}
\clist_if_empty:NF #3
{
@@ -1416,7 +1451,7 @@
}
\cs_new:Npn \@@_remove_all:
{ \exp_after:wN \@@_remove_all:w \@@_tmp:w , }
-\cs_new:Npn \@@_remove_all:w #1 , \q_mark , #2 , { \exp_not:n {#1} }
+\cs_new:Npn \@@_remove_all:w #1 , \s_@@_mark , #2 , { \exp_not:n {#1} }
\cs_generate_variant:Nn \clist_remove_all:Nn { c }
\cs_generate_variant:Nn \clist_gremove_all:Nn { c }
% \end{macrocode}
@@ -1448,19 +1483,19 @@
% \begin{macro}[EXP]{\clist_reverse:n}
% \begin{macro}[EXP]{\@@_reverse:wwNww, \@@_reverse_end:ww}
% The reversed token list is built one item at a time, and stored
-% between \cs{q_stop} and \cs{q_mark}, in the form of |?| followed by
+% between \cs{s_@@_stop} and \cs{s_@@_mark}, in the form of |?| followed by
% zero or more instances of \enquote{\meta{item}\texttt{,}}. We start from a comma
% list \enquote{\meta{item_1}\texttt{,\ldots,}\meta{item_n}}. During the loop,
% the auxiliary \cs{@@_reverse:wwNww} receives \enquote{\texttt{?}\meta{item_i}} as
% |#1|, \enquote{\meta{item_{i+1}}\texttt{,\ldots,}\meta{item_n}} as |#2|,
-% \cs{@@_reverse:wwNww} as |#3|, what remains until \cs{q_stop} as
+% \cs{@@_reverse:wwNww} as |#3|, what remains until \cs{s_@@_stop} as
% |#4|, and \enquote{\meta{item_{i-1}}\texttt{,\ldots,}\meta{item_1}\texttt{,}} as |#5|.
% The auxiliary moves |#1| just before |#5|, with a comma, and calls
% itself (|#3|). After the last item is moved, \cs{@@_reverse:wwNww}
-% receives \enquote{\cs{q_mark} \cs{@@_reverse:wwNww} \texttt{!}} as its argument
+% receives \enquote{\cs{s_@@_mark} \cs{@@_reverse:wwNww} \texttt{!}} as its argument
% |#1|, thus \cs{@@_reverse_end:ww} as its argument |#3|. This second
% auxiliary cleans up until the marker~|!|, removes the trailing comma
-% (introduced when the first item was moved after \cs{q_stop}), and
+% (introduced when the first item was moved after \cs{s_@@_stop}), and
% leaves its argument~|#1| within \cs{exp_not:n}. There is also a
% need to remove a leading comma, hence \cs{exp_not:o} and
% \cs{use_none:n}.
@@ -1468,14 +1503,14 @@
\cs_new:Npn \clist_reverse:n #1
{
\@@_reverse:wwNww ? #1 ,
- \q_mark \@@_reverse:wwNww ! ,
- \q_mark \@@_reverse_end:ww
- \q_stop ? \q_mark
+ \s_@@_mark \@@_reverse:wwNww ! ,
+ \s_@@_mark \@@_reverse_end:ww
+ \s_@@_stop ? \s_@@_mark
}
\cs_new:Npn \@@_reverse:wwNww
- #1 , #2 \q_mark #3 #4 \q_stop ? #5 \q_mark
- { #3 ? #2 \q_mark #3 #4 \q_stop #1 , #5 \q_mark }
-\cs_new:Npn \@@_reverse_end:ww #1 ! #2 , \q_mark
+ #1 , #2 \s_@@_mark #3 #4 \s_@@_stop ? #5 \s_@@_mark
+ { #3 ? #2 \s_@@_mark #3 #4 \s_@@_stop #1 , #5 \s_@@_mark }
+\cs_new:Npn \@@_reverse_end:ww #1 ! #2 , \s_@@_mark
{ \exp_not:o { \use_none:n #2 } }
% \end{macrocode}
% \end{macro}
@@ -1511,14 +1546,14 @@
% item is non-blank, exit: the second auxiliary grabs
% \cs{prg_return_false:} as |#2|, unless every item in
% the comma list was blank and the loop actually got broken
-% by the trailing |\q_mark \prg_return_false:| item.
+% by the trailing \cs{s_@@_mark} \cs{prg_return_false:} item.
% \begin{macrocode}
\prg_new_conditional:Npnn \clist_if_empty:n #1 { p , T , F , TF }
{
\@@_if_empty_n:w ? #1
- , \q_mark \prg_return_false:
- , \q_mark \prg_return_true:
- \q_stop
+ , \s_@@_mark \prg_return_false:
+ , \s_@@_mark \prg_return_true:
+ \s_@@_stop
}
\cs_new:Npn \@@_if_empty_n:w #1 ,
{
@@ -1526,7 +1561,7 @@
{ \@@_if_empty_n:w ? }
{ \@@_if_empty_n:wNw }
}
-\cs_new:Npn \@@_if_empty_n:wNw #1 \q_mark #2#3 \q_stop {#2}
+\cs_new:Npn \@@_if_empty_n:wNw #1 \s_@@_mark #2#3 \s_@@_stop {#2}
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -1595,7 +1630,7 @@
% If the variable is empty, the mapping is skipped (otherwise,
% that comma-list would be seen as consisting of one empty item).
% Then loop over the comma-list, grabbing one comma-delimited
-% item at a time. The end is marked by \cs{q_recursion_tail}.
+% item at a time. The end is marked by \cs{q_@@_recursion_tail}.
% The auxiliary function \cs{@@_map_function:Nw} is also used
% in \cs{clist_map_inline:Nn}.
% \begin{macrocode}
@@ -1604,13 +1639,13 @@
\clist_if_empty:NF #1
{
\exp_last_unbraced:NNo \@@_map_function:Nw #2 #1
- , \q_recursion_tail ,
+ , \q_@@_recursion_tail ,
\prg_break_point:Nn \clist_map_break: { }
}
}
\cs_new:Npn \@@_map_function:Nw #1#2 ,
{
- \quark_if_recursion_tail_break:nN {#2} \clist_map_break:
+ \@@_if_recursion_tail_break:nN {#2} \clist_map_break:
#1 {#2}
\@@_map_function:Nw #1
}
@@ -1634,12 +1669,12 @@
\cs_new:Npn \clist_map_function:nN #1#2
{
\exp_after:wN \@@_map_function_n:Nn \exp_after:wN #2
- \exp:w \@@_trim_next:w \prg_do_nothing: #1 , \q_recursion_tail ,
+ \exp:w \@@_trim_next:w \prg_do_nothing: #1 , \q_@@_recursion_tail ,
\prg_break_point:Nn \clist_map_break: { }
}
\cs_new:Npn \@@_map_function_n:Nn #1 #2
{
- \quark_if_recursion_tail_break:nN {#2} \clist_map_break:
+ \@@_if_recursion_tail_break:nN {#2} \clist_map_break:
\@@_map_unbrace:Nw #1 #2,
\exp_after:wN \@@_map_function_n:Nn \exp_after:wN #1
\exp:w \@@_trim_next:w \prg_do_nothing:
@@ -1675,7 +1710,7 @@
{ @@_map_ \int_use:N \g__kernel_prg_map_int :w } ##1 {#2}
\exp_last_unbraced:Nco \@@_map_function:Nw
{ @@_map_ \int_use:N \g__kernel_prg_map_int :w }
- #1 , \q_recursion_tail ,
+ #1 , \q_@@_recursion_tail ,
\prg_break_point:Nn \clist_map_break:
{ \int_gdecr:N \g__kernel_prg_map_int }
}
@@ -1702,7 +1737,7 @@
% The quark test is done before assigning the item to the variable:
% this avoids storing a quark which the user wouldn't expect.
% The strange \cs{use:n} avoids unlikely problems when |#2| would
-% contain \cs{q_recursion_stop}.
+% contain \cs{q_@@_recursion_stop}.
% \begin{macrocode}
\cs_new_protected:Npn \clist_map_variable:NNn #1#2#3
{
@@ -1711,7 +1746,7 @@
\exp_args:Nno \use:nn
{ \@@_map_variable:Nnw #2 {#3} }
#1
- , \q_recursion_tail , \q_recursion_stop
+ , \q_@@_recursion_tail , \q_@@_recursion_stop
\prg_break_point:Nn \clist_map_break: { }
}
}
@@ -1722,7 +1757,7 @@
}
\cs_new_protected:Npn \@@_map_variable:Nnw #1#2#3,
{
- \quark_if_recursion_tail_stop:n {#3}
+ \@@_if_recursion_tail_stop:n {#3}
\tl_set:Nn #1 {#3}
\use:n {#2}
\@@_map_variable:Nnw #1 {#2}
@@ -1769,13 +1804,13 @@
{
0
\exp_not:N \@@_count:w \c_space_tl
- #1 \exp_not:n { , \q_recursion_tail , \q_recursion_stop }
+ #1 \exp_not:n { , \q_@@_recursion_tail , \q_@@_recursion_stop }
}
}
\cs_new:Npn \@@_count:n #1 { + 1 }
\cs_new:Npx \@@_count:w #1 ,
{
- \exp_not:n { \exp_args:Nf \quark_if_recursion_tail_stop:n } {#1}
+ \exp_not:n { \exp_args:Nf \@@_if_recursion_tail_stop:n } {#1}
\exp_not:N \tl_if_blank:nF {#1} { + 1 }
\exp_not:N \@@_count:w \c_space_tl
}
@@ -1801,15 +1836,15 @@
% quarks), 5: the rest of the comma list, 6: a \meta{continuation}
% function (\texttt{use_ii} or \texttt{use_iii} with its
% \meta{separator} argument), 7: junk, and 8: the temporary result,
-% which is built in a brace group following \cs{q_stop}. The
+% which is built in a brace group following \cs{q_@@_stop}. The
% \meta{separator} and the first of the three items are placed in the
% result, then we use the \meta{continuation}, placing the remaining
% two items after it. When we begin this loop, the three items really
-% belong to the comma list, the first \cs{q_mark} is taken as a
+% belong to the comma list, the first \cs{q_@@_mark} is taken as a
% delimiter to the \texttt{use_ii} function, and the continuation is
% \texttt{use_ii} itself. When we reach the last two items of the
-% original token list, \cs{q_mark} is taken as a third item, and now
-% the second \cs{q_mark} serves as a delimiter to \texttt{use_ii},
+% original token list, \cs{q_@@_mark} is taken as a third item, and now
+% the second \cs{q_@@_mark} serves as a delimiter to \texttt{use_ii},
% switching to the other \meta{continuation}, \texttt{use_iii}, which
% uses the \meta{separator between final two}.
% \begin{macrocode}
@@ -1826,9 +1861,9 @@
{
\exp_after:wN \@@_use:nwwwwnwn
\exp_after:wN { \exp_after:wN } #1 ,
- \q_mark , { \@@_use:nwwwwnwn {#3} }
- \q_mark , { \@@_use:nwwn {#4} }
- \q_stop { }
+ \s_@@_mark , { \@@_use:nwwwwnwn {#3} }
+ \s_@@_mark , { \@@_use:nwwn {#4} }
+ \s_@@_stop { }
}
}
{
@@ -1839,9 +1874,9 @@
\cs_generate_variant:Nn \clist_use:Nnnn { c }
\cs_new:Npn \@@_use:wwn #1 , #2 , #3 { \exp_not:n { #1 #3 #2 } }
\cs_new:Npn \@@_use:nwwwwnwn
- #1#2 , #3 , #4 , #5 \q_mark , #6#7 \q_stop #8
- { #6 {#3} , {#4} , #5 \q_mark , {#6} #7 \q_stop { #8 #1 #2 } }
-\cs_new:Npn \@@_use:nwwn #1#2 , #3 \q_stop #4
+ #1#2 , #3 , #4 , #5 \s_@@_mark , #6#7 \s_@@_stop #8
+ { #6 {#3} , {#4} , #5 \s_@@_mark , {#6} #7 \s_@@_stop { #8 #1 #2 } }
+\cs_new:Npn \@@_use:nwwn #1#2 , #3 \s_@@_stop #4
{ \exp_not:n { #4 #1 #2 } }
\cs_new:Npn \clist_use:Nn #1#2
{ \clist_use:Nnnn #1 {#2} {#2} {#2} }
@@ -1877,21 +1912,21 @@
\int_compare:nNnTF {#2} < 0
{
\int_compare:nNnTF {#2} < { - #1 }
- { \use_none_delimit_by_q_stop:w }
+ { \@@_use_none_delimit_by_s_stop:w }
{ \exp_args:Nf #4 { \int_eval:n { #2 + 1 + #1 } } }
}
{
\int_compare:nNnTF {#2} > {#1}
- { \use_none_delimit_by_q_stop:w }
+ { \@@_use_none_delimit_by_s_stop:w }
{ #4 {#2} }
}
- { } , #3 , \q_stop
+ { } , #3 , \s_@@_stop
}
\cs_generate_variant:Nn \@@_item:nnnN { ffo, ff }
\cs_new:Npn \@@_item_N_loop:nw #1 #2,
{
\int_compare:nNnTF {#1} = 0
- { \use_i_delimit_by_q_stop:nw { \exp_not:n {#2} } }
+ { \@@_use_i_delimit_by_s_stop:nw { \exp_not:n {#2} } }
{ \exp_args:Nf \@@_item_N_loop:nw { \int_eval:n { #1 - 1 } } }
}
\cs_generate_variant:Nn \clist_item:Nn { c }
@@ -1936,7 +1971,7 @@
}
}
}
-\cs_new:Npn \@@_item_n_end:n #1 #2 \q_stop
+\cs_new:Npn \@@_item_n_end:n #1 #2 \s_@@_stop
{ \tl_trim_spaces_apply:nN {#1} \@@_item_n_strip:n }
\cs_new:Npn \@@_item_n_strip:n #1 { \@@_item_n_strip:w #1 , }
\cs_new:Npn \@@_item_n_strip:w #1 , { \exp_not:n {#1} }
diff --git a/macros/latex/contrib/l3kernel/l3coffins.dtx b/macros/latex/contrib/l3kernel/l3coffins.dtx
index fb7d09bcc7..47fca97465 100644
--- a/macros/latex/contrib/l3kernel/l3coffins.dtx
+++ b/macros/latex/contrib/l3kernel/l3coffins.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3color-base.dtx b/macros/latex/contrib/l3kernel/l3color-base.dtx
index 124d07bccd..0555edc19c 100644
--- a/macros/latex/contrib/l3kernel/l3color-base.dtx
+++ b/macros/latex/contrib/l3kernel/l3color-base.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
@@ -147,6 +147,13 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{variable}{\s_@@_stop}
+% Internal scan marks.
+% \begin{macrocode}
+\scan_new:N \s_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
% \begin{macro}{\@@_select:n, \@@_select:V}
% \begin{macro}{\@@_select:w}
% \begin{macro}
@@ -156,17 +163,17 @@
% higher-level experimental material.
% \begin{macrocode}
\cs_new_protected:Npn \@@_select:n #1
- { \@@_select:w #1 \q_stop }
+ { \@@_select:w #1 \s_@@_stop }
\cs_generate_variant:Nn \@@_select:n { V }
-\cs_new_protected:Npn \@@_select:w #1 ~ #2 \q_stop
- { \use:c { @@_select_ #1 :w } #2 \q_stop }
-\cs_new_protected:Npn \@@_select_cmyk:w #1 ~ #2 ~ #3 ~ #4 \q_stop
+\cs_new_protected:Npn \@@_select:w #1 ~ #2 \s_@@_stop
+ { \use:c { @@_select_ #1 :w } #2 \s_@@_stop }
+\cs_new_protected:Npn \@@_select_cmyk:w #1 ~ #2 ~ #3 ~ #4 \s_@@_stop
{ \@@_backend_cmyk:nnnn {#1} {#2} {#3} {#4} }
-\cs_new_protected:Npn \@@_select_gray:w #1 \q_stop
+\cs_new_protected:Npn \@@_select_gray:w #1 \s_@@_stop
{ \@@_backend_gray:n {#1} }
-\cs_new_protected:Npn \@@_select_rgb:w #1 ~ #2 ~ #3 \q_stop
+\cs_new_protected:Npn \@@_select_rgb:w #1 ~ #2 ~ #3 \s_@@_stop
{ \@@_backend_rgb:nnn {#1} {#2} {#3} }
-\cs_new_protected:Npn \@@_select_spot:w #1 ~ #2 \q_stop
+\cs_new_protected:Npn \@@_select_spot:w #1 ~ #2 \s_@@_stop
{ \@@_backend_spot:nn {#1} {#2} }
% \end{macrocode}
% \end{macro}
diff --git a/macros/latex/contrib/l3kernel/l3debug.dtx b/macros/latex/contrib/l3kernel/l3debug.dtx
index 2e80e1b8a3..df79d6a031 100644
--- a/macros/latex/contrib/l3kernel/l3debug.dtx
+++ b/macros/latex/contrib/l3kernel/l3debug.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
@@ -131,6 +131,37 @@
\ProvidesExplFile{l3debug.def}{2019-04-06}{}{L3 Debugging support}
% \end{macrocode}
%
+% \begin{variable}{\s_@@_stop}
+% Internal scan marks.
+% \begin{macrocode}
+\scan_new:N \s_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP]{\@@_use_i_delimit_by_s_stop:nw}
+% Functions to gobble up to a scan mark.
+% \begin{macrocode}
+\cs_new:Npn \@@_use_i_delimit_by_s_stop:nw #1 #2 \s_@@_stop {#1}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{variable}{\q_@@_recursion_tail,\q_@@_recursion_stop}
+% Internal quarks.
+% \begin{macrocode}
+\quark_new:N \q_@@_recursion_tail
+\quark_new:N \q_@@_recursion_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP]{\@@_if_recursion_tail_stop:N}
+% Functions to query recursion quarks.
+% \begin{macrocode}
+\cs_new:Npn \@@_use_none_delimit_by_q_recursion_stop:w
+ #1 \q_@@_recursion_stop { }
+\__kernel_quark_new_test:N \@@_if_recursion_tail_stop:N
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\debug_on:n, \debug_off:n, \@@_all_on:, \@@_all_off:}
% \begin{macrocode}
\cs_set_protected:Npn \debug_on:n #1
@@ -314,9 +345,9 @@
{ \exp_args:NNf \@@_chk_var_scope_aux:Nn #1 { \cs_to_str:N #2 } }
\cs_new_protected:Npn \@@_chk_var_scope_aux:Nn #1#2
{
- \if:w _ \use_i:nn \use_i_delimit_by_q_stop:nw #2 ? ? \q_stop
+ \if:w _ \use_i:nn \@@_use_i_delimit_by_s_stop:nw #2 ? ? \s_@@_stop
\exp_after:wN \@@_chk_var_scope_aux:NNn
- \use_i_delimit_by_q_stop:nw #2 ? \q_stop
+ \@@_use_i_delimit_by_s_stop:nw #2 ? \s_@@_stop
#1 {#2}
\else:
\exp_args:Nc \@@_chk_var_scope_aux:NNn
@@ -489,16 +520,16 @@
\cs_new:Npn \@@_build_parm_text:n #1
{
\@@_arg_list_from_signature:nNN { 1 } \c_false_bool #1
- \q_recursion_tail \q_recursion_stop
+ \q_@@_recursion_tail \q_@@_recursion_stop
}
\cs_new:Npn \@@_build_arg_list:n #1
{
\@@_arg_list_from_signature:nNN { 1 } \c_true_bool #1
- \q_recursion_tail \q_recursion_stop
+ \q_@@_recursion_tail \q_@@_recursion_stop
}
\cs_new:Npn \@@_arg_list_from_signature:nNN #1 #2 #3
{
- \quark_if_recursion_tail_stop:N #3
+ \@@_if_recursion_tail_stop:N #3
\@@_arg_check_invalid:N #3
\bool_if:NT #2 { \@@_arg_if_braced:NT #3 { \use_none:n } }
\use:n { \c_hash_str \int_eval:n {#1} }
@@ -523,7 +554,7 @@
\exp_end:
}
\cs_new:Npn \@@_parm_terminate:w
- { \exp_after:wN \use_none_delimit_by_q_recursion_stop:w \exp:w }
+ { \exp_after:wN \@@_use_none_delimit_by_q_recursion_stop:w \exp:w }
\prg_new_conditional:Npnn \@@_arg_if_braced:N #1 { T }
{ \exp_args:Nf \@@_arg_if_braced:n { \@@_get_base_form:N #1 } }
\cs_new:Npn \@@_arg_if_braced:n #1
@@ -649,7 +680,7 @@
####2 \tl_to_str:n { -> }
####3 \c_backslash_str \tl_to_str:n { __debug_ }
\cs_to_str:N #1
- ####4 \exp_not:N \q_mark
+ ####4 \s_@@_stop
{
\exp_not:N \exp_args:Nx \exp_not:N \tex_scantokens:D
{
@@ -663,7 +694,7 @@
}
}
}
- \exp_after:wN \@@_tmp:w \cs_meaning:N #1 \q_mark
+ \exp_after:wN \@@_tmp:w \cs_meaning:N #1 \s_@@_stop
}
% \end{macrocode}
% Some functions, however, won't work with the signature reading setup
@@ -1380,7 +1411,7 @@
\__kernel_chk_expr:nNnN
{##1} \tex_glueexpr:D { } \skip_if_finite:n
; \prg_return_false:
- #1 ; \prg_return_true: \q_stop
+ #1 ; \prg_return_true: \s_@@_stop
}
}
\exp_args:No \@@_tmp:w { \tl_to_str:n { fil } }
diff --git a/macros/latex/contrib/l3kernel/l3deprecation.dtx b/macros/latex/contrib/l3kernel/l3deprecation.dtx
index ab3f7a3dee..f84e9faea3 100644
--- a/macros/latex/contrib/l3kernel/l3deprecation.dtx
+++ b/macros/latex/contrib/l3kernel/l3deprecation.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
@@ -109,15 +109,23 @@
% \end{macrocode}
% \end{variable}
%
+% \begin{variable}{\s_@@_mark,\s_@@_stop}
+% Internal scan marks.
+% \begin{macrocode}
+\scan_new:N \s_@@_mark
+\scan_new:N \s_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
% \begin{macro}[EXP]{\@@_date_compare:nNnTF, \@@_date_compare_aux:w}
% Expects |#1| and |#3| to be dates in the format YYYY-MM-DD (but
% accepts YYYY or YYYY-MM too, filling in zeros for the missing data).
% Compares them using |#2| (one of |<|, |=|, |>|).
% \begin{macrocode}
\cs_new:Npn \@@_date_compare:nNnTF #1#2#3
- { \@@_date_compare_aux:w #1 -0-0- \q_mark #2 #3 -0-0- \q_stop }
+ { \@@_date_compare_aux:w #1 -0-0- \s_@@_mark #2 #3 -0-0- \s_@@_stop }
\cs_new:Npn \@@_date_compare_aux:w
- #1 - #2 - #3 - #4 \q_mark #5 #6 - #7 - #8 - #9 \q_stop
+ #1 - #2 - #3 - #4 \s_@@_mark #5 #6 - #7 - #8 - #9 \s_@@_stop
{
\int_compare:nNnTF {#1} = {#6}
{
@@ -155,7 +163,7 @@
\exp_args:Nf \@@_date_compare:nNnTF
{
\exp_after:wN \@@_minus_six_months:w
- \ExplLoaderFileDate -0-0- \q_stop
+ \ExplLoaderFileDate -0-0- \s_@@_stop
} < {#1}
{
\bool_set_true:N \l_@@_grace_period_bool
@@ -164,7 +172,7 @@
{ \use_ii:nn }
}
}
-\cs_new:Npn \@@_minus_six_months:w #1 - #2 - #3 - #4 \q_stop
+\cs_new:Npn \@@_minus_six_months:w #1 - #2 - #3 - #4 \s_@@_stop
{
\int_compare:nNnTF {#2} > 6
{ #1 - \int_eval:n { #2 - 6 } - #3 }
diff --git a/macros/latex/contrib/l3kernel/l3doc.dtx b/macros/latex/contrib/l3kernel/l3doc.dtx
index 94217cd8c5..9ef8771afb 100644
--- a/macros/latex/contrib/l3kernel/l3doc.dtx
+++ b/macros/latex/contrib/l3kernel/l3doc.dtx
@@ -79,7 +79,7 @@ and all files in that bundle must be distributed together.
%
% \title{The \cls{l3doc} class}
% \author{\Team}
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
% \maketitle
% \tableofcontents
%
diff --git a/macros/latex/contrib/l3kernel/l3docstrip.dtx b/macros/latex/contrib/l3kernel/l3docstrip.dtx
index ab79ecabf1..044e3fbab5 100644
--- a/macros/latex/contrib/l3kernel/l3docstrip.dtx
+++ b/macros/latex/contrib/l3kernel/l3docstrip.dtx
@@ -63,7 +63,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3docstrip.pdf b/macros/latex/contrib/l3kernel/l3docstrip.pdf
index 00c3018ede..870f43aacb 100644
--- a/macros/latex/contrib/l3kernel/l3docstrip.pdf
+++ b/macros/latex/contrib/l3kernel/l3docstrip.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3expan.dtx b/macros/latex/contrib/l3kernel/l3expan.dtx
index 7eb3465b7c..0841f43fc4 100644
--- a/macros/latex/contrib/l3kernel/l3expan.dtx
+++ b/macros/latex/contrib/l3kernel/l3expan.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
@@ -2165,6 +2165,35 @@
%<@@=cs>
% \end{macrocode}
%
+% \begin{variable}{\s_@@_mark,\s_@@_stop}
+% Internal scan marks. No \pkg{l3quark} yet, so do things by hand.
+% \begin{macrocode}
+\cs_new_eq:NN \s_@@_mark \scan_stop:
+\cs_new_eq:NN \s_@@_stop \scan_stop:
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\q_@@_recursion_stop}
+% Internal recursion quarks. No \pkg{l3quark} yet, so do things by hand.
+% \begin{macrocode}
+\cs_new:Npn \q_@@_recursion_stop { \q_@@_recursion_stop }
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP]{
+% \@@_use_none_delimit_by_s_stop:w,
+% \@@_use_i_delimit_by_s_stop:nw,
+% \@@_use_none_delimit_by_q_recursion_stop:w
+% }
+% Internal scan marks.
+% \begin{macrocode}
+\cs_new:Npn \@@_use_none_delimit_by_s_stop:w #1 \s_@@_stop { }
+\cs_new:Npn \@@_use_i_delimit_by_s_stop:nw #1 #2 \s_@@_stop {#1}
+\cs_new:Npn \@@_use_none_delimit_by_q_recursion_stop:w
+ #1 \q_@@_recursion_stop { }
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\cs_generate_variant:Nn, \cs_generate_variant:cn}
% \begin{arguments}
% \item Base form of a function; \emph{e.g.},~\cs{tl_set:Nn}
@@ -2189,7 +2218,7 @@
\exp_not:N #1
\tl_to_str:n {#2} ,
\exp_not:N \scan_stop: ,
- \exp_not:N \q_recursion_stop
+ \exp_not:N \q_@@_recursion_stop
}
}
\cs_new_protected:Npn \cs_generate_variant:cn
@@ -2217,7 +2246,7 @@
% \verb*|\protected |, \verb*|\protected\long |, |\first|, |\top|,
% |\bot|, |\splittop|, or |\splitbot|, with |\| replaced by the
% appropriate escape character. If |pr| appears in the part before
-% |ma|, the first \cs{q_mark} is taken as an argument of the |wwNw|
+% |ma|, the first \cs{s_@@_mark} is taken as an argument of the |wwNw|
% auxiliary, and |#3| is \cs{cs_new_protected:Npx}, otherwise it
% is \cs{cs_new:Npx}.
% \begin{macrocode}
@@ -2229,20 +2258,20 @@
\exp_not:N \else:
\exp_not:N \exp_after:wN \exp_not:N \@@_generate_variant:ww
\exp_not:N \token_to_meaning:N #1 \tl_to_str:n { ma }
- \exp_not:N \q_mark
- \exp_not:N \q_mark \cs_new_protected:Npx
+ \s_@@_mark
+ \s_@@_mark \cs_new_protected:Npx
\tl_to_str:n { pr }
- \exp_not:N \q_mark \cs_new:Npx
- \exp_not:N \q_stop
+ \s_@@_mark \cs_new:Npx
+ \s_@@_stop
\exp_not:N \fi:
}
\exp_last_unbraced:NNNNo
\cs_new_protected:Npn \@@_generate_variant:ww
- #1 { \tl_to_str:n { ma } } #2 \q_mark
+ #1 { \tl_to_str:n { ma } } #2 \s_@@_mark
{ \@@_generate_variant:wwNw #1 }
\exp_last_unbraced:NNNNo
\cs_new_protected:Npn \@@_generate_variant:wwNw
- #1 { \tl_to_str:n { pr } } #2 \q_mark #3 #4 \q_stop
+ #1 { \tl_to_str:n { pr } } #2 \s_@@_mark #3 #4 \s_@@_stop
{ \cs_set_eq:NN \@@_tmp:w #3 }
% \end{macrocode}
% \end{macro}
@@ -2265,7 +2294,7 @@
\if_meaning:w \c_false_bool #3
\__kernel_msg_error:nnx { kernel } { missing-colon }
{ \token_to_str:c {#1} }
- \exp_after:wN \use_none_delimit_by_q_recursion_stop:w
+ \exp_after:wN \@@_use_none_delimit_by_q_recursion_stop:w
\fi:
\@@_generate_variant:Nnnw #4 {#1}{#2}
}
@@ -2312,8 +2341,8 @@
% We compare the base and variant signatures one character at a time
% within |x|-expansion. The result is given to
% \cs{@@_generate_variant:wwNN} (defined later) in the form
-% \meta{processed variant signature} \cs{q_mark} \meta{errors}
-% \cs{q_stop} \meta{base function} \meta{new function}. If all went
+% \meta{processed variant signature} \cs{s_@@_mark} \meta{errors}
+% \cs{s_@@_stop} \meta{base function} \meta{new function}. If all went
% well, \meta{errors} is empty; otherwise, it is a kernel error
% message and some clean-up code.
%
@@ -2325,7 +2354,7 @@
\cs_new_protected:Npn \@@_generate_variant:Nnnw #1#2#3#4 ,
{
\if_meaning:w \scan_stop: #4
- \exp_after:wN \use_none_delimit_by_q_recursion_stop:w
+ \exp_after:wN \@@_use_none_delimit_by_q_recursion_stop:w
\fi:
\use:x
{
@@ -2333,11 +2362,11 @@
\@@_generate_variant_loop:nNwN { }
#4
\@@_generate_variant_loop_end:nwwwNNnn
- \q_mark
+ \s_@@_mark
#3 ~
{ ~ { } \fi: \@@_generate_variant_loop_long:wNNnn } ~
{ }
- \q_stop
+ \s_@@_stop
\exp_not:N #1 {#2} {#4}
}
\@@_generate_variant:Nnnw #1 {#2} {#3}
@@ -2407,7 +2436,7 @@
% argument: this empty brace group produces the correct signature for
% the full variant.
% \begin{macrocode}
-\cs_new:Npn \@@_generate_variant_loop:nNwN #1#2#3 \q_mark #4
+\cs_new:Npn \@@_generate_variant_loop:nNwN #1#2#3 \s_@@_mark #4
{
\if:w #2 #4
\exp_after:wN \@@_generate_variant_loop_same:w
@@ -2426,7 +2455,7 @@
#1
\prg_do_nothing:
#2
- \@@_generate_variant_loop:nNwN { } #3 \q_mark
+ \@@_generate_variant_loop:nNwN { } #3 \s_@@_mark
}
\cs_new:Npn \@@_generate_variant_loop_base:N #1
{
@@ -2454,46 +2483,45 @@
#1 \prg_do_nothing: #2#3#4
{ #3 { #1 \@@_generate_variant_same:N #2 } }
\cs_new:Npn \@@_generate_variant_loop_end:nwwwNNnn
- #1#2 \q_mark #3 ~ #4 \q_stop #5#6#7#8
+ #1#2 \s_@@_mark #3 ~ #4 \s_@@_stop #5#6#7#8
{
\scan_stop: \scan_stop: \fi:
- \exp_not:N \q_mark
- \exp_not:N \q_stop
+ \s_@@_mark \s_@@_stop
\exp_not:N #6
\exp_not:c { #7 : #8 #1 #3 }
}
-\cs_new:Npn \@@_generate_variant_loop_long:wNNnn #1 \q_stop #2#3#4#5
+\cs_new:Npn \@@_generate_variant_loop_long:wNNnn #1 \s_@@_stop #2#3#4#5
{
\exp_not:n
{
- \q_mark
+ \s_@@_mark
\__kernel_msg_error:nnxx { kernel } { variant-too-long }
{#5} { \token_to_str:N #3 }
\use_none:nnn
- \q_stop
+ \s_@@_stop
#3
#3
}
}
\cs_new:Npn \@@_generate_variant_loop_invalid:NNwNNnn
- #1#2 \fi: \fi: \fi: #3 \q_stop #4#5#6#7
+ #1#2 \fi: \fi: \fi: #3 \s_@@_stop #4#5#6#7
{
\fi: \fi: \fi:
\exp_not:n
{
- \q_mark
+ \s_@@_mark
\__kernel_msg_error:nnxxxx { kernel } { invalid-variant }
{#7} { \token_to_str:N #5 } {#1} {#2}
\use_none:nnn
- \q_stop
+ \s_@@_stop
#5
#5
}
}
\cs_new:Npn \@@_generate_variant_loop_special:NNwNNnn
- #1#2#3 \q_stop #4#5#6#7
+ #1#2#3 \s_@@_stop #4#5#6#7
{
- #3 \q_stop #4 #5 {#6} {#7}
+ #3 \s_@@_stop #4 #5 {#6} {#7}
\exp_not:n
{
\__kernel_msg_error:nnxxxx
@@ -2534,7 +2562,7 @@
% combining the |\exp_args:N #3| variant and the base function.
% \begin{macrocode}
\cs_new_protected:Npn \@@_generate_variant:wwNN
- #1 \q_mark #2 \q_stop #3#4
+ #1 \s_@@_mark #2 \s_@@_stop #3#4
{
#2
\cs_if_free:NT #4
@@ -2568,20 +2596,20 @@
\cs_new_protected:Npx \@@_generate_internal_variant:n #1
{
\exp_not:N \@@_generate_internal_variant:wwnNwn
- #1 \exp_not:N \q_mark
+ #1 \s_@@_mark
{ \cs_set_eq:NN \exp_not:N \@@_tmp:w \cs_new_protected:Npx }
\cs_new_protected:cpn
\use:x
- \token_to_str:N x \exp_not:N \q_mark
+ \token_to_str:N x \s_@@_mark
{ }
\cs_new:cpn
\exp_not:N \tex_expanded:D
- \exp_not:N \q_stop
+ \s_@@_stop
{#1}
}
\exp_last_unbraced:NNNNo
\cs_new_protected:Npn \@@_generate_internal_variant:wwnNwn #1
- { \token_to_str:N x } #2 \q_mark #3#4#5#6 \q_stop #7
+ { \token_to_str:N x } #2 \s_@@_mark #3#4#5#6 \s_@@_stop #7
{
#3
\cs_if_free:cT { exp_args:N #7 }
@@ -2600,7 +2628,7 @@
\exp_after:wN \@@_generate_internal_test_aux:w \exp_after:wN #1
\fi:
##3
- \q_mark
+ \s_@@_mark
{
\use:x
{
@@ -2609,12 +2637,12 @@
}
}
#1
- \q_mark
+ \s_@@_mark
{ \exp_not:n { \@@_generate_internal_one_go:NNn ##1 ##2 {##3} } }
- \q_stop
+ \s_@@_stop
}
\cs_new_protected:Npn \@@_generate_internal_test_aux:w
- ##1 #1 ##2 \q_mark ##3 ##4 \q_stop {##3}
+ ##1 #1 ##2 \s_@@_mark ##3 ##4 \s_@@_stop {##3}
\cs_if_exist:NTF \tex_expanded:D
{
\cs_new_eq:NN \@@_generate_internal_test:Nw
@@ -2722,20 +2750,20 @@
\if_meaning:w \c_false_bool #3
\__kernel_msg_error:nnx { kernel } { missing-colon }
{ \token_to_str:c {#1} }
- \use_i_delimit_by_q_stop:nw
+ \@@_use_i_delimit_by_s_stop:nw
\fi:
\exp_after:wN \@@_generate_variant:w
- \tl_to_str:n {#5} , \scan_stop: , \q_recursion_stop
- \use_none_delimit_by_q_stop:w \q_mark {#1} {#2} {#4} \q_stop
+ \tl_to_str:n {#5} , \scan_stop: , \q_@@_recursion_stop
+ \@@_use_none_delimit_by_s_stop:w \s_@@_mark {#1} {#2} {#4} \s_@@_stop
}
\cs_new_protected:Npn \@@_generate_variant:w
- #1 , #2 \q_mark #3#4#5
+ #1 , #2 \s_@@_mark #3#4#5
{
\if_meaning:w \scan_stop: #1 \scan_stop:
- \if_meaning:w \q_nil #1 \q_nil
+ \if_meaning:w \q_@@_nil #1 \q_@@_nil
\use_i:nnn
\fi:
- \exp_after:wN \use_none_delimit_by_q_recursion_stop:w
+ \exp_after:wN \@@_use_none_delimit_by_q_recursion_stop:w
\else:
\cs_if_exist_use:cTF { @@_generate_variant_#1_form:nnn }
{ {#3} {#4} {#5} }
@@ -2745,7 +2773,7 @@
{#1} { \token_to_str:c { #3 : #4 } }
}
\fi:
- \@@_generate_variant:w #2 \q_mark {#3} {#4} {#5}
+ \@@_generate_variant:w #2 \s_@@_mark {#3} {#4} {#5}
}
\cs_new_protected:Npn \@@_generate_variant_p_form:nnn #1#2
{ \cs_generate_variant:cn { #1 _p : #2 } }
diff --git a/macros/latex/contrib/l3kernel/l3file.dtx b/macros/latex/contrib/l3kernel/l3file.dtx
index a3e398c2e8..c816d771fb 100644
--- a/macros/latex/contrib/l3kernel/l3file.dtx
+++ b/macros/latex/contrib/l3kernel/l3file.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
@@ -1420,6 +1420,30 @@
% \end{macrocode}
% \end{variable}
%
+% \subsubsection{Internal auxiliaries}
+%
+% \begin{variable}{\s_@@_mark,\s_@@_stop}
+% Internal scan marks.
+% \begin{macrocode}
+\scan_new:N \s_@@_mark
+\scan_new:N \s_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP]{\@@_use_i_delimit_by_s_stop:nw}
+% Functions to gobble up to a scan mark.
+% \begin{macrocode}
+\cs_new:Npn \@@_use_i_delimit_by_s_stop:nw #1 #2 \s_@@_stop {#1}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{variable}{\q_@@_nil}
+% Internal quarks.
+% \begin{macrocode}
+\quark_new:N \q_@@_nil
+% \end{macrocode}
+% \end{variable}
+%
% \subsection{Stream management}
%
% \begin{macro}{\iow_new:N, \iow_new:c}
@@ -1912,15 +1936,15 @@
\tl_set:Nx \l_@@_wrap_tl
{
\exp_after:wN \@@_wrap_fix_newline:w \l_@@_wrap_tl
- ^^J \q_nil ^^J \q_stop
+ ^^J \q_@@_nil ^^J \s_@@_stop
}
\exp_after:wN \@@_wrap_start:w \l_@@_wrap_tl
}
\cs_new:Npn \@@_wrap_fix_newline:w #1 ^^J #2 ^^J
{
#1
- \if_meaning:w \q_nil #2
- \use_i_delimit_by_q_stop:nw
+ \if_meaning:w \q_@@_nil #2
+ \@@_use_i_delimit_by_s_stop:nw
\fi:
\c_@@_wrap_newline_marker_tl
\@@_wrap_fix_newline:w #2 ^^J
@@ -1970,7 +1994,7 @@
}
{ \@@_wrap_line:nw { } ##1 ; }
##2 #1
- \@@_wrap_end_chunk:w 7 6 5 4 3 2 1 0 \q_stop
+ \@@_wrap_end_chunk:w 7 6 5 4 3 2 1 0 \s_@@_stop
}
}
\cs_new_protected:Npn \@@_wrap_next:nw ##1##2 #1
@@ -2066,7 +2090,7 @@
\@@_wrap_next_line:w
}
\cs_new:Npn \@@_wrap_end_chunk:w
- #1 \int_eval:w #2 - #3 ; #4#5 \q_stop
+ #1 \int_eval:w #2 - #3 ; #4#5 \s_@@_stop
{
\if_false: { \fi: }
\exp_args:Nf \@@_wrap_next:nw { \int_eval:n { #2 - #4 } }
@@ -2111,14 +2135,14 @@
\l_@@_line_part_tl
#1
{ ? \@@_wrap_break_end:w }
- \q_mark
+ \s_@@_mark
}
\cs_new:Npn \@@_wrap_break_first:w ##1 #1 ##2
{
\use_none:nn ##2 \@@_wrap_break_none:w
\@@_wrap_break_loop:w ##1 #1 ##2
}
- \cs_new:Npn \@@_wrap_break_none:w ##1##2 #1 ##3 \q_mark ##4 #1
+ \cs_new:Npn \@@_wrap_break_none:w ##1##2 #1 ##3 \s_@@_mark ##4 #1
{
\tl_if_empty:NTF \l_@@_line_tl
{ ##2 ##4 \@@_wrap_line_end:nw { } }
@@ -2130,7 +2154,7 @@
##1 #1
\@@_wrap_break_loop:w ##2 #1 ##3
}
- \cs_new:Npn \@@_wrap_break_end:w ##1 #1 ##2 ##3 #1 ##4 \q_mark
+ \cs_new:Npn \@@_wrap_break_end:w ##1 #1 ##2 ##3 #1 ##4 \s_@@_mark
{ ##1 \@@_wrap_line_end:nw { } ##3 }
}
\exp_args:NV \@@_tmp:w \c_catcode_other_space_tl
@@ -2144,7 +2168,7 @@
% call \cs{@@_wrap_line:nw} to find characters for the next line
% (remembering to account for the indentation).
% \begin{macrocode}
-\cs_new_protected:Npn \@@_wrap_next_line:w #1#2 \q_stop
+\cs_new_protected:Npn \@@_wrap_next_line:w #1#2 \s_@@_stop
{
\tl_clear:N \l_@@_line_tl
\token_if_eq_meaning:NNTF #1 \@@_wrap_end_chunk:w
@@ -2157,7 +2181,7 @@
\@@_wrap_line:nw
{ \l_@@_indent_tl }
\l_@@_line_target_int - \l_@@_indent_int ;
- #1 #2 \q_stop
+ #1 #2 \s_@@_stop
}
}
% \end{macrocode}
@@ -2262,10 +2286,10 @@
\cs_set_protected:Npn \@@_tmp:w #1
{
\cs_new:Npn \@@_wrap_trim:N ##1
- { \exp_after:wN \@@_wrap_trim:w ##1 \q_mark #1 \q_mark \q_stop }
- \cs_new:Npn \@@_wrap_trim:w ##1 #1 \q_mark
- { \@@_wrap_trim_aux:w ##1 \q_mark }
- \cs_new:Npn \@@_wrap_trim_aux:w ##1 \q_mark ##2 \q_stop {##1}
+ { \exp_after:wN \@@_wrap_trim:w ##1 \s_@@_mark #1 \s_@@_mark \s_@@_stop }
+ \cs_new:Npn \@@_wrap_trim:w ##1 #1 \s_@@_mark
+ { \@@_wrap_trim_aux:w ##1 \s_@@_mark }
+ \cs_new:Npn \@@_wrap_trim_aux:w ##1 \s_@@_mark ##2 \s_@@_stop {##1}
}
\exp_args:NV \@@_tmp:w \c_catcode_other_space_tl
% \end{macrocode}
@@ -2314,12 +2338,12 @@
{
\tl_if_blank:nTF {#1}
{
- \cs_set:Npn \@@_tmp:w ##1 " ##2 " ##3 \q_stop
+ \cs_set:Npn \@@_tmp:w ##1 " ##2 " ##3 \s_@@_stop
{ { } {##2} { } }
\seq_gput_right:Nx \g_@@_stack_seq
{
\exp_after:wN \@@_tmp:w \tex_jobname:D
- " \tex_jobname:D " \q_stop
+ " \tex_jobname:D " \s_@@_stop
}
}
{
@@ -2389,6 +2413,48 @@
% \end{macrocode}
% \end{variable}
%
+% \subsubsection{Internal auxiliaries}
+%
+% \begin{variable}{\s_@@_stop}
+% Internal scan marks.
+% \begin{macrocode}
+\scan_new:N \s_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\q_@@_nil}
+% Internal quarks.
+% \begin{macrocode}
+\quark_new:N \q_@@_nil
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[pTF]{\@@_quark_if_nil:n}
+% Branching quark conditional.
+% \begin{macrocode}
+\__kernel_quark_new_conditional:Nn \@@_quark_if_nil:n { TF }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{variable}{\q_@@_recursion_tail,\q_@@_recursion_stop}
+% Internal recursion quarks.
+% \begin{macrocode}
+\quark_new:N \q_@@_recursion_tail
+\quark_new:N \q_@@_recursion_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP]{
+% \@@_if_recursion_tail_break:NN,
+% \@@_if_recursion_tail_stop_do:Nn
+% }
+% Functions to query recursion quarks.
+% \begin{macrocode}
+\__kernel_quark_new_test:N \@@_if_recursion_tail_stop:N
+\__kernel_quark_new_test:N \@@_if_recursion_tail_stop_do:nn
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}[EXP]{\__kernel_file_name_sanitize:n}
% \begin{macro}[EXP]{\__kernel_file_name_expand_loop:w}
% \begin{macro}[EXP]{\__kernel_file_name_expand_N_type:Nw}
@@ -2413,11 +2479,11 @@
\exp_args:Ne \__kernel_file_name_strip_quotes:n
{
\__kernel_file_name_expand_loop:w #1
- \q_recursion_tail \q_recursion_stop
+ \q_@@_recursion_tail \q_@@_recursion_stop
}
}
}
-\cs_new:Npn \__kernel_file_name_expand_loop:w #1 \q_recursion_stop
+\cs_new:Npn \__kernel_file_name_expand_loop:w #1 \q_@@_recursion_stop
{
\tl_if_head_is_N_type:nTF {#1}
{ \__kernel_file_name_expand_N_type:Nw }
@@ -2426,11 +2492,11 @@
{ \__kernel_file_name_expand_group:nw }
{ \__kernel_file_name_expand_space:w }
}
- #1 \q_recursion_stop
+ #1 \q_@@_recursion_stop
}
\cs_new:Npn \__kernel_file_name_expand_N_type:Nw #1
{
- \quark_if_recursion_tail_stop:N #1
+ \@@_if_recursion_tail_stop:N #1
\bool_lazy_and:nnTF
{ \token_if_expandable_p:N #1 }
{
@@ -2470,11 +2536,11 @@
\cs_new:Npn \__kernel_file_name_strip_quotes:n #1
{
\__kernel_file_name_strip_quotes:nnnw {#1} { 0 } { }
- #1 " \q_recursion_tail " \q_recursion_stop
+ #1 " \q_@@_recursion_tail " \q_@@_recursion_stop
}
\cs_new:Npn \__kernel_file_name_strip_quotes:nnnw #1#2#3#4 "
{
- \quark_if_recursion_tail_stop_do:nn {#4}
+ \@@_if_recursion_tail_stop_do:nn {#4}
{ \__kernel_file_name_strip_quotes:nnn {#1} {#2} {#3} }
\__kernel_file_name_strip_quotes:nnnw {#1} { #2 + 1 } { #3#4 }
}
@@ -2495,19 +2561,19 @@
% removed at the end.
% \begin{macrocode}
\cs_new:Npn \__kernel_file_name_trim_spaces:n #1
- { \__kernel_file_name_trim_spaces:nw {#1} #1 . \q_nil . \q_stop }
-\cs_new:Npn \__kernel_file_name_trim_spaces:nw #1#2 . #3 . #4 \q_stop
+ { \__kernel_file_name_trim_spaces:nw {#1} #1 . \q_@@_nil . \s_@@_stop }
+\cs_new:Npn \__kernel_file_name_trim_spaces:nw #1#2 . #3 . #4 \s_@@_stop
{
- \quark_if_nil:nTF {#3}
+ \@@_quark_if_nil:nTF {#3}
{
\exp_args:Ne \__kernel_file_name_trim_spaces_aux:n
- { \tl_trim_spaces:n { #1 \s_stop } }
+ { \tl_trim_spaces:n { #1 \s_@@_stop } }
}
{ \tl_trim_spaces:n {#1} }
}
\cs_new:Npn \__kernel_file_name_trim_spaces_aux:n #1
{ \__kernel_file_name_trim_spaces_aux:w #1 }
-\cs_new:Npn \__kernel_file_name_trim_spaces_aux:w #1 \s_stop {#1}
+\cs_new:Npn \__kernel_file_name_trim_spaces_aux:w #1 \s_@@_stop {#1}
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -2526,10 +2592,10 @@
% \begin{macro}[EXP]{\__kernel_file_name_quote:nw}
% \begin{macrocode}
\cs_new:Npn \__kernel_file_name_quote:n #1
- { \__kernel_file_name_quote:nw {#1} #1 ~ \q_nil \q_stop }
-\cs_new:Npn \__kernel_file_name_quote:nw #1 #2 ~ #3 \q_stop
+ { \__kernel_file_name_quote:nw {#1} #1 ~ \q_@@_nil \s_@@_stop }
+\cs_new:Npn \__kernel_file_name_quote:nw #1 #2 ~ #3 \s_@@_stop
{
- \quark_if_nil:nTF {#3}
+ \@@_quark_if_nil:nTF {#3}
{ #1 }
{ "#1" }
}
@@ -2686,19 +2752,19 @@
% directory part, saving that. Then check for an extension.
% \begin{macrocode}
\cs_new:Npn \@@_ext_check:n #1
- { \@@_ext_check:nw { / } #1 / \q_nil / \q_stop }
-\cs_new:Npn \@@_ext_check:nw #1 #2 / #3 / #4 \q_stop
+ { \@@_ext_check:nw { / } #1 / \q_@@_nil / \s_@@_stop }
+\cs_new:Npn \@@_ext_check:nw #1 #2 / #3 / #4 \s_@@_stop
{
- \quark_if_nil:nTF {#3}
+ \@@_quark_if_nil:nTF {#3}
{
\exp_args:No \@@_ext_check:nnw
- { \use_none:n #1 } {#2} #2 . \q_nil . \q_stop
+ { \use_none:n #1 } {#2} #2 . \q_@@_nil . \s_@@_stop
}
- { \@@_ext_check:nw { #1 #2 / } #3 / #4 \q_stop }
+ { \@@_ext_check:nw { #1 #2 / } #3 / #4 \s_@@_stop }
}
-\cs_new:Npx \@@_ext_check:nnw #1#2#3 . #4 . #5 \q_stop
+\cs_new:Npx \@@_ext_check:nnw #1#2#3 . #4 . #5 \s_@@_stop
{
- \exp_not:N \quark_if_nil:nTF {#4}
+ \exp_not:N \@@_quark_if_nil:nTF {#4}
{
\exp_not:N \@@_ext_check:nn
{ #1 #2 } { #1 #2 \tl_to_str:n { .tex } }
@@ -3309,11 +3375,11 @@
\cs_new_protected:Npn \file_parse_full_name:nNNN #1#2#3#4
{
\exp_after:wN \@@_parse_full_name_auxi:w
- \tl_to_str:n { #1 " #1 " } \q_stop #2#3#4
+ \tl_to_str:n { #1 " #1 " } \s_@@_stop #2#3#4
}
\cs_generate_variant:Nn \file_parse_full_name:nNNN { V }
\cs_new_protected:Npn \@@_parse_full_name_auxi:w
- #1 " #2 " #3 \q_stop #4#5#6
+ #1 " #2 " #3 \s_@@_stop #4#5#6
{
\@@_parse_full_name_split:nNNNTF {#2} / #4 #5
{ \str_if_empty:NT #4 { \str_set:Nn #4 { / } } }
@@ -3327,7 +3393,7 @@
}
\cs_new_protected:Npn \@@_parse_full_name_split:nNNNTF #1#2#3#4
{
- \cs_set_protected:Npn \@@_tmp:w ##1 ##2 #2 ##3 \q_stop
+ \cs_set_protected:Npn \@@_tmp:w ##1 ##2 #2 ##3 \s_@@_stop
{
\tl_if_empty:nTF {##3}
{
@@ -3342,9 +3408,9 @@
\use_i:nn
}
}
- { \@@_tmp:w { ##1 #2 ##2 } ##3 \q_stop }
+ { \@@_tmp:w { ##1 #2 ##2 } ##3 \s_@@_stop }
}
- \@@_tmp:w { } #1 #2 \q_stop
+ \@@_tmp:w { } #1 #2 \s_@@_stop
}
% \end{macrocode}
% \end{macro}
@@ -3449,7 +3515,7 @@
\tl_set:Nn \ExplFileExtension { [unknown~extension] }
\tl_set:Nn \ExplFileVersion {-1}
}
- { \@@_id_info_auxii:w #1 ~ \q_stop }
+ { \@@_id_info_auxii:w #1 ~ \s_@@_stop }
}
% \end{macrocode}
% Here, |#1| is |Id|, |#2| is the file name, |#3| is the extension,
@@ -3458,19 +3524,19 @@
% |-1| value then |#5| and |#6| are empty.
% \begin{macrocode}
\cs_new_protected:Npn \@@_id_info_auxii:w
- #1 ~ #2.#3 ~ #4 ~ #5 ~ #6 \q_stop
+ #1 ~ #2.#3 ~ #4 ~ #5 ~ #6 \s_@@_stop
{
\tl_set:Nn \ExplFileName {#2}
\tl_set:Nn \ExplFileExtension {#3}
\tl_set:Nn \ExplFileVersion {#4}
\str_if_eq:nnTF {#4} {-1}
{ \tl_set:Nn \ExplFileDate { 0000/00/00 } }
- { \@@_id_info_auxiii:w #5 - 0 - 0 - \q_stop }
+ { \@@_id_info_auxiii:w #5 - 0 - 0 - \s_@@_stop }
}
% \end{macrocode}
% Convert an \textsc{svn}-style date into a \LaTeX{}-style one.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_id_info_auxiii:w #1 - #2 - #3 - #4 \q_stop
+\cs_new_protected:Npn \@@_id_info_auxiii:w #1 - #2 - #3 - #4 \s_@@_stop
{ \tl_set:Nn \ExplFileDate { #1/#2/#3 } }
% \end{macrocode}
% \end{macro}
diff --git a/macros/latex/contrib/l3kernel/l3final.dtx b/macros/latex/contrib/l3kernel/l3final.dtx
index 4cd9eead10..d48aac03f5 100644
--- a/macros/latex/contrib/l3kernel/l3final.dtx
+++ b/macros/latex/contrib/l3kernel/l3final.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3flag.dtx b/macros/latex/contrib/l3kernel/l3flag.dtx
index 8309ffad51..7a76d29386 100644
--- a/macros/latex/contrib/l3kernel/l3flag.dtx
+++ b/macros/latex/contrib/l3kernel/l3flag.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3format.ins b/macros/latex/contrib/l3kernel/l3format.ins
index a4f728a0d0..99e9389728 100644
--- a/macros/latex/contrib/l3kernel/l3format.ins
+++ b/macros/latex/contrib/l3kernel/l3format.ins
@@ -62,9 +62,9 @@ and all files in that bundle must be distributed together.
\from{l3names.dtx} {initex}
\from{l3basics.dtx} {initex}
\from{l3expan.dtx} {initex}
+ \from{l3quark.dtx} {initex}
\from{l3tl.dtx} {initex}
\from{l3str.dtx} {initex}
- \from{l3quark.dtx} {initex}
\from{l3seq.dtx} {initex}
% ======== FORMAT ONLY =========
\from{l3alloc.dtx} {initex}
diff --git a/macros/latex/contrib/l3kernel/l3fp-assign.dtx b/macros/latex/contrib/l3kernel/l3fp-assign.dtx
index ce09c02627..725abc23b9 100644
--- a/macros/latex/contrib/l3kernel/l3fp-assign.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-assign.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
% \maketitle
%
% \begin{documentation}
diff --git a/macros/latex/contrib/l3kernel/l3fp-aux.dtx b/macros/latex/contrib/l3kernel/l3fp-aux.dtx
index 44b55728cd..0281772275 100644
--- a/macros/latex/contrib/l3kernel/l3fp-aux.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-aux.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
@@ -245,12 +245,27 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\s_@@_mark, \s_@@_stop}
+% \begin{variable}{\s_@@_expr_mark, \s_@@_expr_stop}
% Aliases of \cs{tex_relax:D}, used to terminate expressions.
% \begin{macrocode}
+\scan_new:N \s_@@_expr_mark
+\scan_new:N \s_@@_expr_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\s_@@_mark, \s_@@_stop}
+% Generic scan marks used throughout the module.
+% \begin{macrocode}
\scan_new:N \s_@@_mark
\scan_new:N \s_@@_stop
% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP]{\@@_use_i_delimit_by_s_stop:nw}
+% Functions to gobble up to a scan mark.
+% \begin{macrocode}
+\cs_new:Npn \@@_use_i_delimit_by_s_stop:nw #1 #2 \s_@@_stop {#1}
+% \end{macrocode}
% \end{macro}
%
% \begin{macro}
@@ -378,7 +393,7 @@
\@@_if_type_fp:NTwFw
#1 \@@_use_ii_until_s:nnw
\s_@@ { \@@_use_i_until_s:nw 4 }
- \q_stop
+ \s_@@_stop
}
% \end{macrocode}
% \end{macro}
@@ -540,12 +555,12 @@
%
% \begin{macro}[EXP]{\@@_if_type_fp:NTwFw}
% Used as \cs{@@_if_type_fp:NTwFw} \meta{marker} \Arg{true code}
-% \cs{s_@@} \Arg{false code} \cs{q_stop}, this test whether the
+% \cs{s_@@} \Arg{false code} \cs{s_@@_stop}, this test whether the
% \meta{marker} is \cs{s_@@} or not and runs the appropriate
% \meta{code}. The very unusual syntax is for optimization purposes
% as that function is used for all floating point operations.
% \begin{macrocode}
-\cs_new:Npn \@@_if_type_fp:NTwFw #1 \s_@@ #2 #3 \q_stop {#2}
+\cs_new:Npn \@@_if_type_fp:NTwFw #1 \s_@@ #2 #3 \s_@@_stop {#2}
% \end{macrocode}
% \end{macro}
%
@@ -562,7 +577,7 @@
\@@_if_type_fp:NTwFw
#1 \@@_array_if_all_fp_loop:w
\s_@@ { \prg_break:n \use_iii:nnn }
- \q_stop
+ \s_@@_stop
}
% \end{macrocode}
% \end{macro}
@@ -579,17 +594,17 @@
\@@_if_type_fp:NTwFw
#1 { }
\s_@@ { \@@_type_from_scan_other:N #1 }
- \q_stop
+ \s_@@_stop
}
\cs_new:Npx \@@_type_from_scan_other:N #1
{
\exp_not:N \exp_after:wN \exp_not:N \@@_type_from_scan:w
- \exp_not:N \token_to_str:N #1 \exp_not:N \q_mark
- \tl_to_str:n { s_@@ _? } \exp_not:N \q_mark \exp_not:N \q_stop
+ \exp_not:N \token_to_str:N #1 \s_@@_mark
+ \tl_to_str:n { s_@@ _? } \s_@@_mark \s_@@_stop
}
\exp_last_unbraced:NNNNo
\cs_new:Npn \@@_type_from_scan:w #1
- { \tl_to_str:n { s_@@ } } #2 \q_mark #3 \q_stop {#2}
+ { \tl_to_str:n { s_@@ } } #2 \s_@@_mark #3 \s_@@_stop {#2}
% \end{macrocode}
% \end{macro}
%
@@ -614,7 +629,7 @@
\cs_end:
#2 #3
}
- \q_stop
+ \s_@@_stop
}
\exp_last_unbraced:NNNNo
\cs_new:Npn \@@_change_func_type_aux:w #1 { \tl_to_str:n { @@ } } { }
@@ -631,7 +646,7 @@
% \end{macro}
%
% \begin{macro}[EXP]{\@@_exp_after_any_f:Nnw, \@@_exp_after_any_f:nw}
-% \begin{macro}[EXP]{\@@_exp_after_stop_f:nw}
+% \begin{macro}[EXP]{\@@_exp_after_expr_stop_f:nw}
% The |Nnw| function simply dispatches to the appropriate
% \cs[no-index]{@@_exp_after\ldots{}_f:nw} with \enquote{\ldots{}}
% (either empty or |_|\meta{type}) extracted from |#1|, which should
@@ -649,10 +664,10 @@
\@@_if_type_fp:NTwFw
#2 \@@_exp_after_f:nw
\s_@@ { \@@_exp_after_any_f:Nnw #2 }
- \q_stop
+ \s_@@_stop
{#1} #2
}
-\cs_new_eq:NN \@@_exp_after_stop_f:nw \use_none:nn
+\cs_new_eq:NN \@@_exp_after_expr_stop_f:nw \use_none:nn
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -667,7 +682,7 @@
% \meta{fp_1} |;|\\
% \ldots{}\\
% \meta{fp_n} |;|\\
-% \cs{s_@@_stop}
+% \cs{s_@@_expr_stop}
% \end{quote}
% \begin{macrocode}
\cs_new:Npn \@@_exp_after_tuple_o:w
@@ -679,7 +694,7 @@
\exp_after:wN \@@_tuple_chk:w
\exp_after:wN {
\exp:w \exp_end_continue_f:w
- \@@_exp_after_array_f:w #2 \s_@@_stop
+ \@@_exp_after_array_f:w #2 \s_@@_expr_stop
\exp_after:wN }
\exp_after:wN ;
\exp:w \exp_end_continue_f:w #1
diff --git a/macros/latex/contrib/l3kernel/l3fp-basics.dtx b/macros/latex/contrib/l3kernel/l3fp-basics.dtx
index 65165842fc..55823ba7fb 100644
--- a/macros/latex/contrib/l3kernel/l3fp-basics.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-basics.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-convert.dtx b/macros/latex/contrib/l3kernel/l3fp-convert.dtx
index e070533c59..fc629937c4 100644
--- a/macros/latex/contrib/l3kernel/l3fp-convert.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-convert.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
@@ -111,11 +111,11 @@
\cs_new:Npn \@@_trim_zeros:w #1 ;
{
\@@_trim_zeros_loop:w #1
- ; \@@_trim_zeros_loop:w 0; \@@_trim_zeros_dot:w .; \s_stop
+ ; \@@_trim_zeros_loop:w 0; \@@_trim_zeros_dot:w .; \s_@@_stop
}
\cs_new:Npn \@@_trim_zeros_loop:w #1 0; #2 { #2 #1 ; #2 }
\cs_new:Npn \@@_trim_zeros_dot:w #1 .; { \@@_trim_zeros_end:w #1 ; }
-\cs_new:Npn \@@_trim_zeros_end:w #1 ; #2 \s_stop { #1 }
+\cs_new:Npn \@@_trim_zeros_end:w #1 ; #2 \s_@@_stop { #1 }
% \end{macrocode}
% \end{macro}
% \end{macro}
diff --git a/macros/latex/contrib/l3kernel/l3fp-expo.dtx b/macros/latex/contrib/l3kernel/l3fp-expo.dtx
index 00ff667502..a1defe9889 100644
--- a/macros/latex/contrib/l3kernel/l3fp-expo.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-expo.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
@@ -704,7 +704,7 @@
; #2#3#4 0000 0000 ;
}
\cs_new:Npn \@@_exp_Taylor_ii:ww #1; #2;
- { \@@_exp_Taylor_loop:www 10 ; #1 ; #1 ; \s_stop }
+ { \@@_exp_Taylor_loop:www 10 ; #1 ; #1 ; \s_@@_stop }
\cs_new:Npn \@@_exp_Taylor_loop:www #1; #2; #3;
{
\if_int_compare:w #1 = 1 \exp_stop_f:
@@ -719,7 +719,7 @@
#2 ;
}
}
-\cs_new:Npn \@@_exp_Taylor_break:Nww #1 #2; #3 \s_stop
+\cs_new:Npn \@@_exp_Taylor_break:Nww #1 #2; #3 \s_@@_stop
{ \@@_fixed_add_one:wN #2 ; }
% \end{macrocode}
% \end{macro}
diff --git a/macros/latex/contrib/l3kernel/l3fp-extended.dtx b/macros/latex/contrib/l3kernel/l3fp-extended.dtx
index 2c906bf480..8904c44200 100644
--- a/macros/latex/contrib/l3kernel/l3fp-extended.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-extended.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-logic.dtx b/macros/latex/contrib/l3kernel/l3fp-logic.dtx
index 632346bc4a..a503e3a3d4 100644
--- a/macros/latex/contrib/l3kernel/l3fp-logic.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-logic.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
@@ -125,8 +125,8 @@
{
\if_charcode:w 0
\@@_if_type_fp:NTwFw
- #1 { \use_i_delimit_by_q_stop:nw #3 \q_stop }
- \s_@@ 1 \q_stop
+ #1 { \@@_use_i_delimit_by_s_stop:nw #3 \s_@@_stop }
+ \s_@@ 1 \s_@@_stop
\prg_return_false:
\else:
\prg_return_true:
@@ -181,8 +181,8 @@
\cs_new:Npn \@@_compare_back_any:ww #1#2; #3
{
\@@_if_type_fp:NTwFw
- #1 { \@@_if_type_fp:NTwFw #3 \use_i:nn \s_@@ \use_ii:nn \q_stop }
- \s_@@ \use_ii:nn \q_stop
+ #1 { \@@_if_type_fp:NTwFw #3 \use_i:nn \s_@@ \use_ii:nn \s_@@_stop }
+ \s_@@ \use_ii:nn \s_@@_stop
\@@_compare_back:ww
{
\cs:w
@@ -416,9 +416,9 @@
% \begin{macrocode}
\cs_new:Npn \@@_step:wwwN #1#2; #3#4; #5#6; #7
{
- \@@_if_type_fp:NTwFw #1 { } \s_@@ \prg_break: \q_stop
- \@@_if_type_fp:NTwFw #3 { } \s_@@ \prg_break: \q_stop
- \@@_if_type_fp:NTwFw #5 { } \s_@@ \prg_break: \q_stop
+ \@@_if_type_fp:NTwFw #1 { } \s_@@ \prg_break: \s_@@_stop
+ \@@_if_type_fp:NTwFw #3 { } \s_@@ \prg_break: \s_@@_stop
+ \@@_if_type_fp:NTwFw #5 { } \s_@@ \prg_break: \s_@@_stop
\use_i:nnnn { \@@_step_fp:wwwN #1#2; #3#4; #5#6; #7 }
\prg_break_point:
\use:n
@@ -683,15 +683,15 @@
\if_meaning:w \@@_parse_infix_::N #5
\if_charcode:w 0
\@@_if_type_fp:NTwFw
- #2 { \use_i:nn \use_i_delimit_by_q_stop:nw #3 \q_stop }
- \s_@@ 1 \q_stop
+ #2 { \use_i:nn \@@_use_i_delimit_by_s_stop:nw #3 \s_@@_stop }
+ \s_@@ 1 \s_@@_stop
\exp_after:wN \exp_after:wN \exp_after:wN \@@_ternary_auxii:NwwN
\else:
\exp_after:wN \exp_after:wN \exp_after:wN \@@_ternary_auxi:NwwN
\fi:
\exp_after:wN #1
\exp:w \exp_end_continue_f:w
- \@@_exp_after_array_f:w #4 \s_@@_stop
+ \@@_exp_after_array_f:w #4 \s_@@_expr_stop
\exp_after:wN @
\exp:w
\@@_parse_operand:Nw \c_@@_prec_colon_int
@@ -702,7 +702,7 @@
\exp_after:wN \@@_parse_continue:NwN
\exp_after:wN #1
\exp:w \exp_end_continue_f:w
- \@@_exp_after_array_f:w #4 \s_@@_stop
+ \@@_exp_after_array_f:w #4 \s_@@_expr_stop
\exp_after:wN #5
\exp_after:wN #1
\fi:
@@ -712,7 +712,7 @@
\exp_after:wN \@@_parse_continue:NwN
\exp_after:wN #1
\exp:w \exp_end_continue_f:w
- \@@_exp_after_array_f:w #2 \s_@@_stop
+ \@@_exp_after_array_f:w #2 \s_@@_expr_stop
#4 #1
}
\cs_new:Npn \@@_ternary_auxii:NwwN #1#2@#3@#4
@@ -720,7 +720,7 @@
\exp_after:wN \@@_parse_continue:NwN
\exp_after:wN #1
\exp:w \exp_end_continue_f:w
- \@@_exp_after_array_f:w #3 \s_@@_stop
+ \@@_exp_after_array_f:w #3 \s_@@_expr_stop
#4 #1
}
% \end{macrocode}
diff --git a/macros/latex/contrib/l3kernel/l3fp-parse.dtx b/macros/latex/contrib/l3kernel/l3fp-parse.dtx
index 8c5a03bd24..978d4dfe7f 100644
--- a/macros/latex/contrib/l3kernel/l3fp-parse.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-parse.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
@@ -468,7 +468,7 @@
% \item If the next token is a control sequence with the meaning of
% \cs{scan_stop:}, it can be: \cs{s_@@}, in which case our job is
% done, as what follows is an internal floating point number, or
-% \cs{s_@@_mark}, in which case the expression has come to an early
+% \cs{s_@@_expr_mark}, in which case the expression has come to an early
% end, as we are still looking for a number here, or something else,
% in which case we consider the control sequence to be a bad
% variable resulting from \texttt{c}-expansion.
@@ -499,7 +499,7 @@
% operator. This goes as follows.
% \begin{itemize}
% \item If the next token is a control sequence, it could be the
-% special marker \cs{s_@@_mark}, and
+% special marker \cs{s_@@_expr_mark}, and
% otherwise it is a case of juxtaposing numbers, such as
% |2\c_zero_int|, with an implied multiplication.
% \item If the next token is a letter, it is also a case of
@@ -741,7 +741,7 @@
% \begin{macro}[EXP]
% {
% \@@_parse_one_fp:NN,
-% \@@_exp_after_mark_f:nw,
+% \@@_exp_after_expr_mark_f:nw,
% \@@_exp_after_?_f:nw
% }
% This function receives a \meta{precedence} and a control sequence
@@ -750,8 +750,8 @@
% \item \cs{s_@@} starts a floating point number, and we call
% \cs{@@_exp_after_f:nw}, which |f|-expands after the floating
% point.
-% \item \cs{s_@@_mark} is a premature end, we call
-% \cs{@@_exp_after_mark_f:nw}, which triggers an |fp-early-end|
+% \item \cs{s_@@_expr_mark} is a premature end, we call
+% \cs{@@_exp_after_expr_mark_f:nw}, which triggers an |fp-early-end|
% error.
% \item For a control sequence not containing \cs[no-index]{s_@@}, we call
% \cs{@@_exp_after_?_f:nw}, causing a |bad-variable| error.
@@ -776,7 +776,7 @@
\exp_after:wN #1 \exp:w \@@_parse_expand:w
}
}
-\cs_new:Npn \@@_exp_after_mark_f:nw #1
+\cs_new:Npn \@@_exp_after_expr_mark_f:nw #1
{
\int_case:nnF { \exp_after:wN \use_i:nnn \use_none:nnn #1 }
{
@@ -877,11 +877,11 @@
; \exp_not:N \@@_parse_one_register_dim:ww
\tl_to_str:n { pt } ; \exp_not:N \@@_parse_one_register_mu:www
. \tl_to_str:n { pt } ; \exp_not:N \@@_parse_one_register_int:www
- \exp_not:N \q_stop
+ \s_@@_stop
}
\exp_args:Nno \use:nn
{ \cs_new:Npn \@@_parse_one_register_auxii:wwwNw #1 . #2 }
- { \tl_to_str:n { pt } #3 ; #4#5 \q_stop }
+ { \tl_to_str:n { pt } #3 ; #4#5 \s_@@_stop }
{ #4 #1.#2; }
\exp_args:Nno \use:nn
{ \cs_new:Npn \@@_parse_one_register_mu:www #1 }
@@ -1837,12 +1837,12 @@
% \begin{macrocode}
\cs_new:Npn \@@_parse_apply_unary:NNNwN #1#2#3#4@#5
{
- \@@_parse_apply_unary_chk:NwNw #4 @ ; . \q_stop
+ \@@_parse_apply_unary_chk:NwNw #4 @ ; . \s_@@_stop
\@@_parse_apply_unary_type:NNN
#3 #2 #4 @
\exp:w \exp_end_continue_f:w #5 #1
}
-\cs_new:Npn \@@_parse_apply_unary_chk:NwNw #1#2 ; #3#4 \q_stop
+\cs_new:Npn \@@_parse_apply_unary_chk:NwNw #1#2 ; #3#4 \s_@@_stop
{
\if_meaning:w @ #3 \else:
\token_if_eq_meaning:NNTF . #3
@@ -1947,7 +1947,7 @@
\exp_not:N \token_if_eq_meaning:NNTF #3
\exp_not:c { @@_parse_infix_):N }
{
- \exp_not:N \@@_exp_after_array_f:w #2 \s_@@_stop
+ \exp_not:N \@@_exp_after_array_f:w #2 \s_@@_expr_stop
\exp_not:N \exp_after:wN
\exp_not:N \@@_parse_infix_after_paren:NN
\exp_not:N \exp_after:wN #1
@@ -2116,7 +2116,7 @@
% in two steps. The \cs{@@_parse_operand:Nw} function performs
% computations until reaching an operation with precedence
% \cs{c_@@_prec_end_int} or less, namely, the end of the expression. The
-% marker \cs{s_@@_mark} indicates that the next token is an already
+% marker \cs{s_@@_expr_mark} indicates that the next token is an already
% parsed version of an infix operator, and \cs{@@_parse_infix_end:N}
% has infinitely negative precedence. Finally, clean up a
% (well-defined) set of extra tokens and stop the initial expansion
@@ -2129,12 +2129,12 @@
\exp:w
\@@_parse_operand:Nw \c_@@_prec_end_int
\@@_parse_expand:w #1
- \s_@@_mark \@@_parse_infix_end:N
- \s_@@_stop
+ \s_@@_expr_mark \@@_parse_infix_end:N
+ \s_@@_expr_stop
\exp_end:
}
\cs_new:Npn \@@_parse_after:ww
- #1@ \@@_parse_infix_end:N \s_@@_stop #2 { #2 #1 }
+ #1@ \@@_parse_infix_end:N \s_@@_expr_stop #2 { #2 #1 }
\cs_new:Npn \@@_parse_o:n #1
{
\exp:w
@@ -2142,8 +2142,8 @@
\exp:w
\@@_parse_operand:Nw \c_@@_prec_end_int
\@@_parse_expand:w #1
- \s_@@_mark \@@_parse_infix_end:N
- \s_@@_stop
+ \s_@@_expr_mark \@@_parse_infix_end:N
+ \s_@@_expr_stop
{
\exp_end_continue_f:w
\@@_exp_after_any_f:nw { \exp_after:wN \exp_stop_f: }
@@ -2265,7 +2265,7 @@
{
\if_catcode:w \scan_stop: \exp_not:N #2
\if_int_compare:w
- \@@_str_if_eq:nn { \s_@@_mark } { \exp_not:N #2 }
+ \@@_str_if_eq:nn { \s_@@_expr_mark } { \exp_not:N #2 }
= 0 \exp_stop_f:
\exp_after:wN \exp_after:wN
\exp_after:wN \@@_parse_infix_mark:NNN
@@ -2317,7 +2317,7 @@
{
\if_catcode:w \scan_stop: \exp_not:N #2
\if_int_compare:w
- \@@_str_if_eq:nn { \s_@@_mark } { \exp_not:N #2 }
+ \@@_str_if_eq:nn { \s_@@_expr_mark } { \exp_not:N #2 }
= 0 \exp_stop_f:
\exp_after:wN \exp_after:wN
\exp_after:wN \@@_parse_infix_mark:NNN
@@ -2349,7 +2349,7 @@
% \subsubsection{Closing parentheses and commas}
%
% \begin{macro}[EXP]{\@@_parse_infix_mark:NNN}
-% As an infix operator, \cs{s_@@_mark} means that the next
+% As an infix operator, \cs{s_@@_expr_mark} means that the next
% token~(|#3|) has already gone through \cs{@@_parse_infix:NN} and
% should be provided the precedence~|#1|. The scan mark~|#2| is
% discarded.
@@ -2764,7 +2764,7 @@
\cs_new:Npn \@@_parse_function_one_two:nnw #1#2#3
{
\@@_if_type_fp:NTwFw
- #3 { } \s_@@ \@@_parse_function_one_two_error_o:w \q_stop
+ #3 { } \s_@@ \@@_parse_function_one_two_error_o:w \s_@@_stop
\@@_parse_function_one_two_aux:nnw {#1} {#2} #3
}
\cs_new:Npn \@@_parse_function_one_two_error_o:w #1#2#3#4 @
@@ -2786,7 +2786,7 @@
\fi:
\@@_parse_function_one_two_error_o:w
}
- \q_stop
+ \s_@@_stop
\@@_parse_function_one_two_auxii:nnw {#1} {#2} #3; #4
}
\cs_new:Npn \@@_parse_function_one_two_auxii:nnw #1#2#3; #4; #5
diff --git a/macros/latex/contrib/l3kernel/l3fp-random.dtx b/macros/latex/contrib/l3kernel/l3fp-random.dtx
index 8ff26feedd..11bf7d311d 100644
--- a/macros/latex/contrib/l3kernel/l3fp-random.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-random.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-round.dtx b/macros/latex/contrib/l3kernel/l3fp-round.dtx
index 89453a55ca..a5b0bc6485 100644
--- a/macros/latex/contrib/l3kernel/l3fp-round.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-round.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-traps.dtx b/macros/latex/contrib/l3kernel/l3fp-traps.dtx
index 441a2e9436..51d25a090e 100644
--- a/macros/latex/contrib/l3kernel/l3fp-traps.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-traps.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
% \maketitle
%
% \begin{documentation}
diff --git a/macros/latex/contrib/l3kernel/l3fp-trig.dtx b/macros/latex/contrib/l3kernel/l3fp-trig.dtx
index 1a34892a4b..156485e628 100644
--- a/macros/latex/contrib/l3kernel/l3fp-trig.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-trig.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp.dtx b/macros/latex/contrib/l3kernel/l3fp.dtx
index b781dda55d..f9bcbee467 100644
--- a/macros/latex/contrib/l3kernel/l3fp.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp.dtx
@@ -49,7 +49,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fparray.dtx b/macros/latex/contrib/l3kernel/l3fparray.dtx
index 74c09b293c..d41c366b73 100644
--- a/macros/latex/contrib/l3kernel/l3fparray.dtx
+++ b/macros/latex/contrib/l3kernel/l3fparray.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3int.dtx b/macros/latex/contrib/l3kernel/l3int.dtx
index 6ec7cd6528..faab276e44 100644
--- a/macros/latex/contrib/l3kernel/l3int.dtx
+++ b/macros/latex/contrib/l3kernel/l3int.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
@@ -1053,6 +1053,37 @@
% \end{macro}
% \end{macro}
%
+% \begin{variable}{\s_@@_mark,\s_@@_stop}
+% Scan marks used throughout the module.
+% \begin{macrocode}
+\scan_new:N \s_@@_mark
+\scan_new:N \s_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP]{\@@_use_none_delimit_by_s_stop:w}
+% Function to gobble until a scan mark.
+% \begin{macrocode}
+\cs_new:Npn \@@_use_none_delimit_by_s_stop:w #1 \s_@@_stop { }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{variable}{\q_@@_recursion_tail,\q_@@_recursion_stop}
+% Quarks for recursion.
+% \begin{macrocode}
+\quark_new:N \q_@@_recursion_tail
+\quark_new:N \q_@@_recursion_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP]{\@@_if_recursion_tail_stop_do:Nn,\@@_if_recursion_tail_stop:N}
+% Functions to query quarks.
+% \begin{macrocode}
+\__kernel_quark_new_test:N \@@_if_recursion_tail_stop_do:Nn
+\__kernel_quark_new_test:N \@@_if_recursion_tail_stop:N
+% \end{macrocode}
+% \end{macro}
+%
% \subsection{Integer expressions}
%
% \begin{macro}{\int_eval:n}
@@ -1469,7 +1500,7 @@
\@@_compare_error:
}
\cs_new:Npn \@@_compare_error:Nw
- #1#2 \q_stop
+ #1#2 \s_@@_stop
{
{ }
\c_zero_int \fi:
@@ -1525,7 +1556,7 @@
% \cs{@@_compare:w} receives as its argument an integer, a relation
% symbol, and some more tokens. We then setup the loop, which is
% ended by the two odd-looking items |e| and |{=nd_}|, with a trailing
-% \cs{q_stop} used to grab the entire argument when necessary.
+% \cs{s_@@_stop} used to grab the entire argument when necessary.
% \begin{macrocode}
\prg_new_conditional:Npnn \int_compare:n #1 { p , T , F , TF }
{
@@ -1535,7 +1566,7 @@
\cs_new:Npn \@@_compare:w #1 \@@_compare_error:
{
\exp_after:wN \if_false: \int_value:w
- \@@_compare:Nw #1 e { = nd_ } \q_stop
+ \@@_compare:Nw #1 e { = nd_ } \s_@@_stop
}
% \end{macrocode}
% The goal here is to find an \meta{operand} and a \meta{comparison}.
@@ -1552,13 +1583,13 @@
% \cs{scan_stop:}, ignored thanks to \tn{unexpanded}, and
% \cs{@@_compare_error:Nw} raises an error.
% \begin{macrocode}
-\cs_new:Npn \@@_compare:Nw #1#2 \q_stop
+\cs_new:Npn \@@_compare:Nw #1#2 \s_@@_stop
{
\exp_after:wN \@@_compare:NNw
- \@@_to_roman:w - 0 #2 \q_mark
- #1#2 \q_stop
+ \@@_to_roman:w - 0 #2 \s_@@_mark
+ #1#2 \s_@@_stop
}
-\cs_new:Npn \@@_compare:NNw #1#2#3 \q_mark
+\cs_new:Npn \@@_compare:NNw #1#2#3 \s_@@_mark
{
\__kernel_exp_not:w
\use:c
@@ -1585,7 +1616,7 @@
% and call \cs{@@_compare:Nw} to look for additional operands, after
% evaluating the following expression.
% \begin{macrocode}
-\cs_new:cpn { @@_compare_end_=:NNw } #1#2#3 e #4 \q_stop
+\cs_new:cpn { @@_compare_end_=:NNw } #1#2#3 e #4 \s_@@_stop
{
{#3} \exp_stop_f:
\prg_return_false: \else: \prg_return_true: \fi:
@@ -1593,7 +1624,7 @@
\cs_new:Npn \@@_compare:nnN #1#2#3
{
{#2} \exp_stop_f:
- \prg_return_false: \exp_after:wN \use_none_delimit_by_q_stop:w
+ \prg_return_false: \exp_after:wN \@@_use_none_delimit_by_s_stop:w
\fi:
#1 #2 #3 \exp_after:wN \@@_compare:Nw \int_value:w \@@_eval:w
}
@@ -1665,14 +1696,14 @@
\exp_args:Nf \@@_case:nnTF { \int_eval:n {#1} } {#2} { } { }
}
\cs_new:Npn \@@_case:nnTF #1#2#3#4
- { \@@_case:nw {#1} #2 {#1} { } \q_mark {#3} \q_mark {#4} \q_stop }
+ { \@@_case:nw {#1} #2 {#1} { } \s_@@_mark {#3} \s_@@_mark {#4} \s_@@_stop }
\cs_new:Npn \@@_case:nw #1#2#3
{
\int_compare:nNnTF {#1} = {#2}
{ \@@_case_end:nw {#3} }
{ \@@_case:nw {#1} }
}
-\cs_new:Npn \@@_case_end:nw #1#2#3 \q_mark #4#5 \q_stop
+\cs_new:Npn \@@_case_end:nw #1#2#3 \s_@@_mark #4#5 \s_@@_stop
{ \exp_end: #1 #4 }
% \end{macrocode}
% \end{macro}
@@ -2261,10 +2292,10 @@
% \subsection{Converting from other formats to integers}
%
% \begin{macro}[rEXP]{\@@_pass_signs:wn, \@@_pass_signs_end:wn}
-% Called as \cs{@@_pass_signs:wn} \meta{signs and digits} \cs{q_stop}
+% Called as \cs{@@_pass_signs:wn} \meta{signs and digits} \cs{s_@@_stop}
% \Arg{code}, this function leaves in the input stream any sign it
% finds, then inserts the \meta{code} before the first non-sign token
-% (and removes \cs{q_stop}). More precisely, it deletes any~|+| and
+% (and removes \cs{s_@@_stop}). More precisely, it deletes any~|+| and
% passes any~|-| to the input stream, hence should be called in an
% integer expression.
% \begin{macrocode}
@@ -2277,7 +2308,7 @@
\exp_after:wN #1
\fi:
}
-\cs_new:Npn \@@_pass_signs_end:wn #1 \q_stop #2 { #2 #1 }
+\cs_new:Npn \@@_pass_signs_end:wn #1 \s_@@_stop #2 { #2 #1 }
% \end{macrocode}
% \end{macro}
%
@@ -2295,13 +2326,13 @@
\int_eval:n
{
\exp_after:wN \@@_pass_signs:wn \tl_to_str:n {#1}
- \q_stop { \@@_from_alph:nN { 0 } }
- \q_recursion_tail \q_recursion_stop
+ \s_@@_stop { \@@_from_alph:nN { 0 } }
+ \q_@@_recursion_tail \q_@@_recursion_stop
}
}
\cs_new:Npn \@@_from_alph:nN #1#2
{
- \quark_if_recursion_tail_stop_do:Nn #2 {#1}
+ \@@_if_recursion_tail_stop_do:Nn #2 {#1}
\exp_args:Nf \@@_from_alph:nN
{ \int_eval:n { #1 * 26 + \@@_from_alph:N #2 } }
}
@@ -2327,13 +2358,13 @@
\int_eval:n
{
\exp_after:wN \@@_pass_signs:wn \tl_to_str:n {#1}
- \q_stop { \@@_from_base:nnN { 0 } {#2} }
- \q_recursion_tail \q_recursion_stop
+ \s_@@_stop { \@@_from_base:nnN { 0 } {#2} }
+ \q_@@_recursion_tail \q_@@_recursion_stop
}
}
\cs_new:Npn \@@_from_base:nnN #1#2#3
{
- \quark_if_recursion_tail_stop_do:Nn #3 {#1}
+ \@@_if_recursion_tail_stop_do:Nn #3 {#1}
\exp_args:Nf \@@_from_base:nnN
{ \int_eval:n { #1 * #2 + \@@_from_base:N #3 } }
{#2}
@@ -2409,16 +2440,16 @@
(
0
\exp_after:wN \@@_from_roman:NN \tl_to_str:n {#1}
- \q_recursion_tail \q_recursion_tail \q_recursion_stop
+ \q_@@_recursion_tail \q_@@_recursion_tail \q_@@_recursion_stop
)
}
}
\cs_new:Npn \@@_from_roman:NN #1#2
{
- \quark_if_recursion_tail_stop:N #1
+ \@@_if_recursion_tail_stop:N #1
\int_if_exist:cF { c_@@_from_roman_ #1 _int }
{ \@@_from_roman_error:w }
- \quark_if_recursion_tail_stop_do:Nn #2
+ \@@_if_recursion_tail_stop_do:Nn #2
{ + \use:c { c_@@_from_roman_ #1 _int } }
\int_if_exist:cF { c_@@_from_roman_ #2 _int }
{ \@@_from_roman_error:w }
@@ -2436,7 +2467,7 @@
\@@_from_roman:NN #2
}
}
-\cs_new:Npn \@@_from_roman_error:w #1 \q_recursion_stop #2
+\cs_new:Npn \@@_from_roman_error:w #1 \q_@@_recursion_stop #2
{ #2 * 0 - 1 }
% \end{macrocode}
% \end{macro}
diff --git a/macros/latex/contrib/l3kernel/l3intarray.dtx b/macros/latex/contrib/l3kernel/l3intarray.dtx
index 900151aa0c..1c68482f55 100644
--- a/macros/latex/contrib/l3kernel/l3intarray.dtx
+++ b/macros/latex/contrib/l3kernel/l3intarray.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3kernel-functions.dtx b/macros/latex/contrib/l3kernel/l3kernel-functions.dtx
index fa09742458..d5cc6170ad 100644
--- a/macros/latex/contrib/l3kernel/l3kernel-functions.dtx
+++ b/macros/latex/contrib/l3kernel/l3kernel-functions.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
@@ -329,6 +329,104 @@
% and variable mappings.
% \end{variable}
%
+% \begin{function}{\__kernel_quark_new_test:N}
+% \begin{syntax}
+% \cs{__kernel_quark_new_test:N} \cs[no-index]{\meta{name}:\meta{arg spec}}
+% \end{syntax}
+% Defines a quark-test function \cs[no-index]{\meta{name}:\meta{arg spec}}
+% which tests if its argument is \cs[no-index]{q__\meta{namespace}_recursion_tail},
+% then acts accordingly, as described below for each possible
+% \meta{arg spec}.
+%
+% The \meta{namespace} is determined as the first (nonempty)
+% |_|-delimited word in \meta{name} and is used internally
+% in the definition of auxiliaries. The function
+% \cs{__kernel_quark_new_test:N} does \emph{not} define
+% the \cs[no-index]{q__\meta{namespace}_recursion_tail} and
+% \cs[no-index]{q__\meta{namespace}_recursion_stop} quarks.
+% They should be manually defined with \cs{quark_new:N}.
+%
+% There are $6$ different types of quark-test functions. Which one is
+% defined depends on the \meta{arg spec}, which \emph{must} be one of
+% the options listed now. Four of them are modeled after
+% \cs[no-index]{quark_if_recursion_tail:(N|n)} and
+% \cs[no-index]{quark_if_recursion_tail_do:(N|n)n}.
+% \begin{description}
+% \def\makelabel#1{\texttt{#1}}
+% \item[n] defines \cs[no-index]{\meta{name}:n} such that it
+% checks if |#1| contains only \cs[no-index]{q__\meta{namespace}_recursion_tail}, and
+% if so consumes all tokens up to \cs[no-index]{q__\meta{namespace}_recursion_stop}
+% (\emph{c.f.}~\cs{quark_if_recursion_tail_stop:n}).
+% \item[nn] defines \cs[no-index]{\meta{name}:nn} such that it
+% checks if |#1| contains only \cs[no-index]{q__\meta{namespace}_recursion_tail}, and
+% if so consumes all tokens up to \cs[no-index]{q__\meta{namespace}_recursion_stop},
+% then executes the code |#2| after that
+% (\emph{c.f.}~\cs{quark_if_recursion_tail_stop_do:nn}).
+% \item[N] defines \cs[no-index]{\meta{name}:N} such that it
+% checks if |#1| is \cs[no-index]{q__\meta{namespace}_recursion_tail}, and if so consumes
+% all tokens up to \cs[no-index]{q__\meta{namespace}_recursion_stop}
+% (\emph{c.f.}~\cs{quark_if_recursion_tail_stop:N}).
+% \item[Nn] defines \cs[no-index]{\meta{name}:Nn} such that it
+% checks if |#1| is \cs[no-index]{q__\meta{namespace}_recursion_tail}, and if so consumes
+% all tokens up to \cs[no-index]{q__\meta{namespace}_recursion_stop}, then executes
+% the code |#2| after that
+% (\emph{c.f.}~\cs{quark_if_recursion_tail_stop_do:Nn}).
+% \end{description}
+% The last two are modeled after
+% \cs[no-index]{quark_if_recursion_tail_break:(n|N)N}, and in those
+% cases the quark \cs[no-index]{q__\meta{namespace}_recursion_stop} is
+% not used (and thus needs not be defined).
+% \begin{description}
+% \def\makelabel#1{\texttt{#1}}
+% \item[nN] defines \cs[no-index]{\meta{name}:nN} such that it
+% checks if |#1| contains only \cs[no-index]{q__\meta{namespace}_recursion_tail}, and
+% if so uses the \cs[no-index]{\meta{type}_map_break:} function |#2|.
+% \item[NN] defines \cs[no-index]{\meta{name}:NN} such that it
+% checks if |#1| is \cs[no-index]{q__\meta{namespace}_recursion_tail}, and if so uses
+% the \cs[no-index]{\meta{type}_map_break:} function |#2|.
+% \end{description}
+% Any other signature, as well as a function without signature
+% are errors, and in such case the definition is aborted.
+% \end{function}
+%
+% \begin{function}{\__kernel_quark_new_conditional:Nn}
+% \begin{syntax}
+% \cs{__kernel_quark_new_conditional:Nn} \cs[no-index]{__\meta{namespace}_quark_if_\meta{name}:\meta{arg spec}} \Arg{conditions}
+% \end{syntax}
+% Defines a collection of quark conditionals that test if their
+% argument is the quark \cs[no-index]{q__\meta{namespace}_\meta{name}}
+% and perform suitable actions. The \meta{conditions} are a
+% comma-separated list of one or more of |p|, |T|, |F|, and |TF|, and
+% one conditional is defined for each \meta{condition} in the list, as
+% described for \cs{prg_new_conditional:Npnn}. The conditionals are
+% defined using \cs{prg_new_conditional:Npnn}, so that their name is
+% obtained by adding |p|, |T|, |F|, or |TF| to the base name
+% \cs[no-index]{__\meta{namespace}_quark_if_\meta{name}:\meta{arg spec}}.
+%
+% The first argument of \cs{__kernel_quark_new_conditional:Nn} must
+% contain |_quark_if_| and |:|, as these markers are used to determine
+% the \meta{name} of the quark
+% \cs[no-index]{q__\meta{namespace}_\meta{name}} to be tested. This
+% quark should be manually defined with \cs{quark_new:N}, as
+% \cs{__kernel_quark_new_conditional:Nn} does \emph{not} define it.
+%
+% The function \cs{__kernel_quark_new_conditional:Nn} can define $2$
+% different types of quark conditionals. Which one is defined depends
+% on the \meta{arg spec}, which \emph{must} be one of the following
+% options, modeled after \cs[no-index]{quark_if_nil:(N|n)(TF)}.
+% \begin{description}
+% \def\makelabel#1{\texttt{#1}}
+% \item[n] defines \cs[no-index]{__\meta{namespace}_quark_if_\meta{name}:n(TF)} such that it
+% checks if |#1| contains only \cs[no-index]{q__\meta{namespace}_\meta{name}}, and
+% executes the proper conditional branch.
+% \item[N] defines \cs[no-index]{__\meta{namespace}_quark_if_\meta{name}:N(TF)} such that it
+% checks if |#1| is \cs[no-index]{q__\meta{namespace}_\meta{name}}, and
+% executes the proper conditional branch.
+% \end{description}
+% Any other signature, as well as a function without signature
+% are errors, and in such case the definition is aborted.
+% \end{function}
+%
% \begin{variable}{\c__kernel_randint_max_int}
% Maximal allowed argument to \cs{__kernel_randint:n}. Equal to
% $2^{17}-1$.
diff --git a/macros/latex/contrib/l3kernel/l3keys.dtx b/macros/latex/contrib/l3kernel/l3keys.dtx
index f00f95309c..b3630af0b1 100644
--- a/macros/latex/contrib/l3kernel/l3keys.dtx
+++ b/macros/latex/contrib/l3kernel/l3keys.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
@@ -976,9 +976,7 @@
% argument.
% \begin{macrocode}
\cs_new:Npn \keyval_parse:NNn ##1 ##2 ##3
- {
- \@@_loop_active:NNw ##1 ##2 \s_@@_mark ##3 #1 \s_@@_tail #1
- }
+ { \@@_loop_active:NNw ##1 ##2 \s_@@_mark ##3 #1 \s_@@_tail #1 }
% \end{macrocode}
% \end{macro}
%
@@ -1043,16 +1041,14 @@
% control to \cs[no-index]{@@_key_val:nnN}.
% \begin{macrocode}
\cs_new:Npn \@@_split_active:w ##1 #2
+ { \@@_trim:nN { ##1 } \@@_split_active:nw \s_@@_mark }
+ \cs_new:Npn \@@_split_active:nw ##1 ##2 #2 ##3 \s_@@_stop
{
- \@@_trim:nN { ##1 } \@@_split_active:nw \s_@@_mark
+ \@@_if_empty:w \s_@@_mark ##3 \s_@@_stop
+ \@@_has_false:w \s_@@_mark \s_@@_stop \use_i:nn
+ { \@@_misplaced_equal_error: \use_none:n }
+ { \@@_trim:nN { ##2 } \@@_key_val:nnN { ##1 } }
}
- \cs_new:Npn \@@_split_active:nw ##1 ##2 #2 ##3 \s_@@_stop
- {
- \@@_if_empty:w \s_@@_mark ##3 \s_@@_stop
- \@@_has_false:w \s_@@_mark \s_@@_stop \use_i:nn
- { \@@_misplaced_equal_error: \use_none:n }
- { \@@_trim:nN { ##2 } \@@_key_val:nnN { ##1 } }
- }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -1062,9 +1058,7 @@
% active equals sign and then runs the test for an empty argument.
% \begin{macrocode}
\cs_new:Npn \@@_if_has_equal_active:w ##1 #2
- {
- \@@_if_empty:w \s_@@_mark
- }
+ { \@@_if_empty:w \s_@@_mark }
% \end{macrocode}
% \end{macro}
%
@@ -1089,14 +1083,14 @@
\s_@@_mark \s_@@_tail
\@@_loop_other:NNw #1 , \s_@@_tail ,
\@@_loop_active:NNw #2 \s_@@_mark
- {}
+ { }
\cs_new:Npn \@@_end_loop_other:w
\s_@@_mark \s_@@_tail
\@@_if_has_equal_other:w #1 = \s_@@_stop
\@@_has_false:w \s_@@_mark \s_@@_stop \use_i:nn
#2
\@@_loop_other:NNw #3 \s_@@_mark
- {}
+ { }
% \end{macrocode}
% \end{macro}
%
@@ -1106,16 +1100,14 @@
% equals signs of category other.
% \begin{macrocode}
\cs_new:Npn \@@_split_other:w #1 =
+ { \@@_trim:nN { #1 } \@@_split_other:nw \s_@@_mark }
+\cs_new:Npn \@@_split_other:nw #1 #2 = #3 \s_@@_stop
{
- \@@_trim:nN { #1 } \@@_split_other:nw \s_@@_mark
+ \@@_if_empty:w \s_@@_mark #3 \s_@@_stop
+ \@@_has_false:w \s_@@_mark \s_@@_stop \use_i:nn
+ { \@@_misplaced_equal_error: \use_none:n }
+ { \@@_trim:nN { #2 } \@@_key_val:nnN { #1 } }
}
- \cs_new:Npn \@@_split_other:nw #1 #2 = #3 \s_@@_stop
- {
- \@@_if_empty:w \s_@@_mark #3 \s_@@_stop
- \@@_has_false:w \s_@@_mark \s_@@_stop \use_i:nn
- { \@@_misplaced_equal_error: \use_none:n }
- { \@@_trim:nN { #2 } \@@_key_val:nnN { #1 } }
- }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -1126,9 +1118,7 @@
% them.
% \begin{macrocode}
\cs_new:Npn \@@_key:nN #1 #2
- {
- \exp_not:n { #2 { #1 } }
- }
+ { \exp_not:n { #2 { #1 } } }
% \end{macrocode}
% \end{macro}
%
@@ -1166,9 +1156,7 @@
\cs_new:Npn \@@_has_false:w \s_@@_mark \s_@@_stop \use_i:nn #1 #2 { #2 }
\cs_new:Npn \@@_blank_true:w \s_@@_mark \s_@@_stop \use:n #1 {}
\cs_new:Npn \@@_empty_key:w \s_@@_mark \s_@@_stop \exp_not:n #1
- {
- \@@_misplaced_equal_error:
- }
+ { \@@_misplaced_equal_error: }
% \end{macrocode}
% \end{macro}
%
@@ -1176,9 +1164,7 @@
% Another test that works by gobbling tokens until a specific one is hit.
% \begin{macrocode}
\cs_new:Npn \@@_if_has_equal_other:w #1 =
- {
- \@@_if_empty:w \s_@@_mark
- }
+ { \@@_if_empty:w \s_@@_mark }
% \end{macrocode}
% \end{macro}
%
@@ -1189,9 +1175,7 @@
% doesn't have to be fast anyway.
% \begin{macrocode}
\cs_new:Npn \@@_misplaced_equal_error:
- {
- \__kernel_msg_expandable_error:nn { kernel } { misplaced-equals-sign }
- }
+ { \__kernel_msg_expandable_error:nn { kernel } { misplaced-equals-sign } }
% \end{macrocode}
% \end{macro}
%
@@ -1360,7 +1344,7 @@
% be explicitly no-value, it must be a token list.
% \begin{macrocode}
\tl_new:N \l_@@_relative_tl
-\tl_set:Nn \l_@@_relative_tl { \q_no_value }
+\tl_set:Nn \l_@@_relative_tl { \q_@@_no_value }
% \end{macrocode}
% \end{variable}
%
@@ -1412,6 +1396,46 @@
% \end{macrocode}
% \end{variable}
%
+% \subsubsection{Internal auxiliaries}
+%
+% \begin{variable}{\s_@@_stop}
+% Internal scan marks.
+% \begin{macrocode}
+\scan_new:N \s_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\q_@@_nil,\q_@@_no_value}
+% Internal quarks.
+% \begin{macrocode}
+\quark_new:N \q_@@_nil
+\quark_new:N \q_@@_no_value
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[pTF]{\@@_quark_if_nil:n}
+% Branching quark conditional.
+% \begin{macrocode}
+\__kernel_quark_new_conditional:Nn \@@_quark_if_nil:n { TF }
+\__kernel_quark_new_conditional:Nn \@@_quark_if_no_value:N { TF }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{variable}{\q_@@_recursion_tail,\q_@@_recursion_stop}
+% Internal recursion quarks.
+% \begin{macrocode}
+\quark_new:N \q_@@_recursion_tail
+\quark_new:N \q_@@_recursion_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP]{\@@_if_recursion_tail_stop:n}
+% Functions to query recursion quarks.
+% \begin{macrocode}
+\__kernel_quark_new_test:N \@@_if_recursion_tail_stop:n
+% \end{macrocode}
+% \end{macro}
+%
% \subsection{The key defining mechanism}
%
% \begin{macro}{\keys_define:nn}
@@ -1461,7 +1485,7 @@
\str_if_empty:NF \l_@@_property_str
{
\__kernel_msg_error:nnxx { kernel } { key-property-unknown }
- { \l_@@_property_str } { \l_keys_path_str }
+ { \l_@@_property_str } { \l_keys_path_str }
}
}
}
@@ -1480,9 +1504,9 @@
{
\str_set:Nx \l_@@_property_str { \@@_trim_spaces:n {#1} }
\exp_after:wN \@@_property_find:w \l_@@_property_str . .
- \q_stop {#1}
+ \s_@@_stop {#1}
}
-\cs_new_protected:Npn \@@_property_find:w #1 . #2 . #3 \q_stop #4
+\cs_new_protected:Npn \@@_property_find:w #1 . #2 . #3 \s_@@_stop #4
{
\tl_if_blank:nTF {#3}
{
@@ -1496,18 +1520,18 @@
{
\str_if_empty:NF \l_@@_module_str
{ \l_@@_module_str / }
- \tl_trim_spaces:n {#1}
+ \tl_trim_spaces:n {#1}
}
\str_set:Nn \l_@@_property_str { . #2 }
}
{
\str_set:Nx \l_keys_path_str { \l_@@_module_str / #1 . #2 }
- \@@_property_search:w #3 \q_stop
+ \@@_property_search:w #3 \s_@@_stop
}
\tl_set_eq:NN \l_keys_path_tl \l_keys_path_str
}
}
-\cs_new_protected:Npn \@@_property_search:w #1 . #2 \q_stop
+\cs_new_protected:Npn \@@_property_search:w #1 . #2 \s_@@_stop
{
\str_if_eq:nnTF {#2} { . }
{
@@ -1516,7 +1540,7 @@
}
{
\str_set:Nx \l_keys_path_str { \l_keys_path_str . #1 }
- \@@_property_search:w #2 \q_stop
+ \@@_property_search:w #2 \s_@@_stop
}
}
% \end{macrocode}
@@ -1536,18 +1560,18 @@
\bool_if:NTF \l_@@_no_value_bool
{
\exp_after:wN \@@_define_code:w
- \l_@@_property_str \q_stop
+ \l_@@_property_str \s_@@_stop
{ \use:c { \c_@@_props_root_str \l_@@_property_str } }
{
\__kernel_msg_error:nnxx { kernel }
{ key-property-requires-value } { \l_@@_property_str }
{ \l_keys_path_str }
- }
+ }
}
{ \use:c { \c_@@_props_root_str \l_@@_property_str } {#1} }
}
\exp_last_unbraced:NNNNo
- \cs_new:Npn \@@_define_code:w #1 \c_colon_str #2 \q_stop
+ \cs_new:Npn \@@_define_code:w #1 \c_colon_str #2 \s_@@_stop
{ \tl_if_empty:nTF {#2} }
% \end{macrocode}
% \end{macro}
@@ -1800,7 +1824,7 @@
\exp_after:wN \@@_find_key_module:NNw
\exp_after:wN \l_@@_tmpa_tl
\exp_after:wN \l_@@_tmpb_tl
- \l_keys_path_str / \q_stop
+ \l_keys_path_str / \s_@@_stop
\@@_cmd_set:nx { \l_keys_path_str }
{
\exp_not:c { prop_ #2 put:Nnn }
@@ -2277,7 +2301,7 @@
\bool_set_false:N \exp_not:N \l_@@_filtered_bool
\bool_set_false:N \exp_not:N \l_@@_selective_bool
\tl_set:Nn \exp_not:N \l_@@_relative_tl
- { \exp_not:N \q_no_value }
+ { \exp_not:N \q_@@_no_value }
\@@_set:nn \exp_not:n { {#1} {#2} }
\bool_if:NT \l_@@_only_known_bool
{ \bool_set_true:N \exp_not:N \l_@@_only_known_bool }
@@ -2328,7 +2352,7 @@
\cs_new_protected:Npn \keys_set_known:nnN #1#2#3
{
\exp_args:No \@@_set_known:nnnnN
- \l_@@_unused_clist { \q_no_value } {#1} {#2} #3
+ \l_@@_unused_clist { \q_@@_no_value } {#1} {#2} #3
}
\cs_generate_variant:Nn \keys_set_known:nnN { nV , nv , no }
\cs_new_protected:Npn \keys_set_known:nnnN #1#2#3#4
@@ -2345,7 +2369,7 @@
\tl_set:Nn \l_@@_unused_clist {#1}
}
\cs_new_protected:Npn \keys_set_known:nn #1#2
- { \@@_set_known:nnn { \q_no_value } {#1} {#2} }
+ { \@@_set_known:nnn { \q_@@_no_value } {#1} {#2} }
\cs_generate_variant:Nn \keys_set_known:nn { nV , nv , no }
\cs_new_protected:Npn \@@_set_known:nnn #1#2#3
{
@@ -2406,7 +2430,7 @@
{
\exp_args:No \@@_set_filter:nnnnnN
\l_@@_unused_clist
- { \q_no_value } {#1} {#2} {#3} #4
+ { \q_@@_no_value } {#1} {#2} {#3} #4
}
\cs_generate_variant:Nn \keys_set_filter:nnnN { nnV , nnv , nno }
\cs_new_protected:Npn \keys_set_filter:nnnnN #1#2#3#4#5
@@ -2423,7 +2447,7 @@
\tl_set:Nn \l_@@_unused_clist {#1}
}
\cs_new_protected:Npn \keys_set_filter:nnn #1#2#3
- {\@@_set_filter:nnnn { \q_no_value } {#1} {#2} {#3} }
+ {\@@_set_filter:nnnn { \q_@@_no_value } {#1} {#2} {#3} }
\cs_generate_variant:Nn \keys_set_filter:nnn { nnV , nnv , nno }
\cs_new_protected:Npn \@@_set_filter:nnnn #1#2#3#4
{
@@ -2452,7 +2476,7 @@
\bool_set_false:N \exp_not:N \l_@@_filtered_bool
\bool_set_true:N \exp_not:N \l_@@_selective_bool
\tl_set:Nn \exp_not:N \l_@@_relative_tl
- { \exp_not:N \q_no_value }
+ { \exp_not:N \q_@@_no_value }
\@@_set_selective:nnn \exp_not:n { {#1} {#2} {#3} }
\bool_if:NT \l_@@_only_known_bool
{ \bool_set_true:N \exp_not:N \l_@@_only_known_bool }
@@ -2522,7 +2546,7 @@
\exp_after:wN \@@_find_key_module:NNw
\exp_after:wN \l_@@_module_str
\exp_after:wN \l_keys_key_str
- \l_keys_path_str / \q_stop
+ \l_keys_path_str / \s_@@_stop
\tl_set_eq:NN \l_keys_key_tl \l_keys_key_str
\@@_value_or_default:n {#3}
\bool_if:NTF \l_@@_selective_bool
@@ -2531,7 +2555,7 @@
\str_set:Nn \l_@@_module_str {#1}
}
\cs_generate_variant:Nn \@@_set_keyval:nnn { o }
-\cs_new_protected:Npn \@@_find_key_module:NNw #1#2#3 / #4 \q_stop
+\cs_new_protected:Npn \@@_find_key_module:NNw #1#2#3 / #4 \s_@@_stop
{
\tl_if_blank:nTF {#4}
{ \str_set:Nn #2 {#3} }
@@ -2541,7 +2565,7 @@
\str_if_empty:NF #1 { / }
#3
}
- \@@_find_key_module:NNw #1#2 #4 \q_stop
+ \@@_find_key_module:NNw #1#2 #4 \s_@@_stop
}
}
% \end{macrocode}
@@ -2722,12 +2746,12 @@
% When there is no relative path, things here are easy: just save the key
% name and value. When we are working with a relative path, first we
% need to turn it into a string: that can't happen earlier as we need
-% to store \cs{q_no_value}. Then, use a standard delimited approach to fish
+% to store \cs{q_@@_no_value}. Then, use a standard delimited approach to fish
% out the partial path.
% \begin{macrocode}
\cs_new_protected:Npn \@@_store_unused:
{
- \quark_if_no_value:NTF \l_@@_relative_tl
+ \@@_quark_if_no_value:NTF \l_@@_relative_tl
{
\clist_put_right:Nx \l_@@_unused_clist
{
@@ -2758,7 +2782,7 @@
\cs_set_protected:Npn \@@_store_unused:w
####1 \l_@@_relative_tl /
####2 \l_@@_relative_tl /
- ####3 \exp_not:N \q_stop
+ ####3 \s_@@_stop
}
{
\tl_if_blank:nF {##1}
@@ -2778,7 +2802,7 @@
{
\@@_store_unused:w \l_keys_path_str
\l_@@_relative_tl / \l_@@_relative_tl /
- \exp_not:N \q_stop
+ \s_@@_stop
}
}
\cs_new_protected:Npn \@@_store_unused:w { }
@@ -2824,9 +2848,9 @@
% Used to strip off the ending part of the key path after the last~|/|.
% \begin{macrocode}
\cs_new:Npn \@@_parent:n #1
- { \@@_parent:w #1 / / \q_stop { } }
+ { \@@_parent:w #1 / / \s_@@_stop { } }
\cs_generate_variant:Nn \@@_parent:n { o }
-\cs_new:Npn \@@_parent:w #1 / #2 / #3 \q_stop #4
+\cs_new:Npn \@@_parent:w #1 / #2 / #3 \s_@@_stop #4
{
\tl_if_blank:nTF {#2}
{
@@ -2834,7 +2858,7 @@
{ \use_none:n #4 }
}
{
- \@@_parent:w #2 / #3 \q_stop { #4 / #1 }
+ \@@_parent:w #2 / #3 \s_@@_stop { #4 / #1 }
}
}
% \end{macrocode}
@@ -2854,22 +2878,22 @@
\cs_new:Npn \@@_trim_spaces:n #1
{
\exp_after:wN \@@_trim_spaces_auxi:w \tl_to_str:n {#1}
- / \q_nil \q_stop
+ / \q_@@_nil \s_@@_stop
}
-\cs_new:Npn \@@_trim_spaces_auxi:w #1 / #2 \q_stop
+\cs_new:Npn \@@_trim_spaces_auxi:w #1 / #2 \s_@@_stop
{
- \quark_if_nil:nTF {#2}
+ \@@_quark_if_nil:nTF {#2}
{ \tl_trim_spaces:n {#1} }
{ \@@_trim_spaces_auxii:w #1 / #2 }
}
-\cs_new:Npn \@@_trim_spaces_auxii:w #1 / #2 / \q_nil
+\cs_new:Npn \@@_trim_spaces_auxii:w #1 / #2 / \q_@@_nil
{
\tl_trim_spaces:n {#1}
- \@@_trim_spaces_auxiii:w #2 / \q_recursion_tail / \q_recursion_stop
+ \@@_trim_spaces_auxiii:w #2 / \q_@@_recursion_tail / \q_@@_recursion_stop
}
\cs_set:Npn \@@_trim_spaces_auxiii:w #1 /
{
- \quark_if_recursion_tail_stop:n {#1}
+ \@@_if_recursion_tail_stop:n {#1}
/ \tl_trim_spaces:n { #1 }
\@@_trim_spaces_auxiii:w
}
diff --git a/macros/latex/contrib/l3kernel/l3legacy.dtx b/macros/latex/contrib/l3kernel/l3legacy.dtx
index f1505be1b1..1c017035de 100644
--- a/macros/latex/contrib/l3kernel/l3legacy.dtx
+++ b/macros/latex/contrib/l3kernel/l3legacy.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3luatex.dtx b/macros/latex/contrib/l3kernel/l3luatex.dtx
index c3a5ec4985..5b3c8243fe 100644
--- a/macros/latex/contrib/l3kernel/l3luatex.dtx
+++ b/macros/latex/contrib/l3kernel/l3luatex.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3msg.dtx b/macros/latex/contrib/l3kernel/l3msg.dtx
index 8dd4c2df83..feb233bf54 100644
--- a/macros/latex/contrib/l3kernel/l3msg.dtx
+++ b/macros/latex/contrib/l3kernel/l3msg.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
@@ -525,6 +525,23 @@
% \end{macrocode}
% \end{variable}
%
+% \subsection{Internal auxiliaries}
+%
+% \begin{variable}{\s_@@_mark,\s_@@_stop}
+% Internal scan marks.
+% \begin{macrocode}
+\scan_new:N \s_@@_mark
+\scan_new:N \s_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP]{\@@_use_none_delimit_by_s_stop:w}
+% Functions to gobble up to a scan mark.
+% \begin{macrocode}
+\cs_new:Npn \@@_use_none_delimit_by_s_stop:w #1 \s_@@_stop { }
+% \end{macrocode}
+% \end{macro}
+%
% \subsection{Creating messages}
%
% Messages are created and used separately, so there two parts to
@@ -1207,15 +1224,15 @@
{
\tl_if_in:nnTF { ^^J #1 } { ^^J > ~ }
{
- \tl_if_in:nnTF { #1 \q_mark } { . \q_mark }
+ \tl_if_in:nnTF { #1 \s_@@_mark } { . \s_@@_mark }
{ \@@_show_dot:w } { \@@_show:w }
- ^^J #1 \q_stop
+ ^^J #1 \s_@@_stop
}
{ \@@_show:nn { ? #1 } { } }
}
- \cs_new:Npn \@@_show_dot:w #1 ^^J > ~ #2 . \q_stop
+ \cs_new:Npn \@@_show_dot:w #1 ^^J > ~ #2 . \s_@@_stop
{ \@@_show:nn {#1} {#2} }
- \cs_new:Npn \@@_show:w #1 ^^J > ~ #2 \q_stop
+ \cs_new:Npn \@@_show:w #1 ^^J > ~ #2 \s_@@_stop
{ \@@_show:nn {#1} {#2} }
\cs_new_protected:Npn \@@_show:nn #1#2
{
@@ -1338,16 +1355,16 @@
{
\seq_clear:N \l_@@_hierarchy_seq
\@@_use_hierarchy:nwwN { }
- #1 \q_mark \@@_use_hierarchy:nwwN
- / \q_mark \use_none_delimit_by_q_stop:w
- \q_stop
+ #1 \s_@@_mark \@@_use_hierarchy:nwwN
+ / \s_@@_mark \@@_use_none_delimit_by_s_stop:w
+ \s_@@_stop
\@@_use_redirect_module:n { }
}
}
-\cs_new_protected:Npn \@@_use_hierarchy:nwwN #1#2 / #3 \q_mark #4
+\cs_new_protected:Npn \@@_use_hierarchy:nwwN #1#2 / #3 \s_@@_mark #4
{
\seq_put_left:Nn \l_@@_hierarchy_seq {#1}
- #4 { #1 / #2 } #3 \q_mark #4
+ #4 { #1 / #2 } #3 \s_@@_mark #4
}
% \end{macrocode}
% At this point, the items of \cs{l_@@_hierarchy_seq} are the
@@ -1798,6 +1815,18 @@
\__kernel_msg_new:nnnn { kernel } { quote-in-shell }
{ Quotes~in~shell~command~'#1'. }
{ Shell~commands~cannot~contain~quotes~("). }
+\__kernel_msg_new:nnnn { kernel } { invalid-quark-function }
+ { Quark~test~function~'#1'~is~invalid. }
+ {
+ \c__msg_coding_error_text_tl
+ LaTeX~has~been~asked~to~create~quark~test~function~'#1'~
+ \tl_if_empty:nTF {#2}
+ { but~that~name~ }
+ { with~signature~'#2',~but~that~signature~ }
+ is~not~valid.
+ }
+\__kernel_msg_new:nnn { kernel } { invalid-quark }
+ { Invalid~quark~variable~'#1'. }
\__kernel_msg_new:nnnn { kernel } { scanmark-already-defined }
{ Scan~mark~#1~already~defined. }
{
@@ -1984,7 +2013,7 @@
% is an extra subtlety: if the user inserts tokens for error recovery,
% they should be kept. Thus we also use an odd space character
% (with category code $7$) and keep tokens until that space character,
-% dropping everything else until \cs{q_stop}. The \cs{exp_end:} prevents
+% dropping everything else until \cs{s_@@_stop}. The \cs{exp_end:} prevents
% losing braces around the user-inserted text if any, and stops the
% expansion of \cs{exp:w}. The group is used to prevent
% |\LaTeX3~error:| from being globally equal to \cs{scan_stop:}.
diff --git a/macros/latex/contrib/l3kernel/l3names.dtx b/macros/latex/contrib/l3kernel/l3names.dtx
index 1ff80abdbf..2878654f58 100644
--- a/macros/latex/contrib/l3kernel/l3names.dtx
+++ b/macros/latex/contrib/l3kernel/l3names.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3news.pdf b/macros/latex/contrib/l3kernel/l3news.pdf
index 1f47cf6159..d3d8cd3d8a 100644
--- a/macros/latex/contrib/l3kernel/l3news.pdf
+++ b/macros/latex/contrib/l3kernel/l3news.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news01.pdf b/macros/latex/contrib/l3kernel/l3news01.pdf
index 5a6cf44044..e7e64883a3 100644
--- a/macros/latex/contrib/l3kernel/l3news01.pdf
+++ b/macros/latex/contrib/l3kernel/l3news01.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news02.pdf b/macros/latex/contrib/l3kernel/l3news02.pdf
index 242ad64340..54d75387b2 100644
--- a/macros/latex/contrib/l3kernel/l3news02.pdf
+++ b/macros/latex/contrib/l3kernel/l3news02.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news03.pdf b/macros/latex/contrib/l3kernel/l3news03.pdf
index 10e4d27c06..60aa4d7d5d 100644
--- a/macros/latex/contrib/l3kernel/l3news03.pdf
+++ b/macros/latex/contrib/l3kernel/l3news03.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news04.pdf b/macros/latex/contrib/l3kernel/l3news04.pdf
index 9d236ae6ec..2165c12d76 100644
--- a/macros/latex/contrib/l3kernel/l3news04.pdf
+++ b/macros/latex/contrib/l3kernel/l3news04.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news05.pdf b/macros/latex/contrib/l3kernel/l3news05.pdf
index 5285b6494a..56d2d5f600 100644
--- a/macros/latex/contrib/l3kernel/l3news05.pdf
+++ b/macros/latex/contrib/l3kernel/l3news05.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news06.pdf b/macros/latex/contrib/l3kernel/l3news06.pdf
index 18cf35ef6c..4c0f81e8cb 100644
--- a/macros/latex/contrib/l3kernel/l3news06.pdf
+++ b/macros/latex/contrib/l3kernel/l3news06.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news07.pdf b/macros/latex/contrib/l3kernel/l3news07.pdf
index 558df172bd..f90ddaf6b1 100644
--- a/macros/latex/contrib/l3kernel/l3news07.pdf
+++ b/macros/latex/contrib/l3kernel/l3news07.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news08.pdf b/macros/latex/contrib/l3kernel/l3news08.pdf
index 9003cc10ad..0061ae2c85 100644
--- a/macros/latex/contrib/l3kernel/l3news08.pdf
+++ b/macros/latex/contrib/l3kernel/l3news08.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news09.pdf b/macros/latex/contrib/l3kernel/l3news09.pdf
index aa6826ec5c..149274576f 100644
--- a/macros/latex/contrib/l3kernel/l3news09.pdf
+++ b/macros/latex/contrib/l3kernel/l3news09.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news10.pdf b/macros/latex/contrib/l3kernel/l3news10.pdf
index ed057b204c..c6b222cbb4 100644
--- a/macros/latex/contrib/l3kernel/l3news10.pdf
+++ b/macros/latex/contrib/l3kernel/l3news10.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news11.pdf b/macros/latex/contrib/l3kernel/l3news11.pdf
index 2b42dd8612..ea68c02321 100644
--- a/macros/latex/contrib/l3kernel/l3news11.pdf
+++ b/macros/latex/contrib/l3kernel/l3news11.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news12.pdf b/macros/latex/contrib/l3kernel/l3news12.pdf
index 56b04c76ac..d8e0127011 100644
--- a/macros/latex/contrib/l3kernel/l3news12.pdf
+++ b/macros/latex/contrib/l3kernel/l3news12.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3prefixes.pdf b/macros/latex/contrib/l3kernel/l3prefixes.pdf
index 0fe83d65c8..fbf3f14164 100644
--- a/macros/latex/contrib/l3kernel/l3prefixes.pdf
+++ b/macros/latex/contrib/l3kernel/l3prefixes.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3prg.dtx b/macros/latex/contrib/l3kernel/l3prg.dtx
index 1ea045aa74..d14576f08c 100644
--- a/macros/latex/contrib/l3kernel/l3prg.dtx
+++ b/macros/latex/contrib/l3kernel/l3prg.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
@@ -778,8 +778,9 @@
% \begin{macro}{\if_bool:N}
% \begin{macro}{\if_predicate:w}
% Those two primitive \TeX{} conditionals are synonyms.
+% \cs{if_bool:N} is defined in \pkg{l3basics}, as it's needed
+% earlier to define quark test functions.
% \begin{macrocode}
-\cs_new_eq:NN \if_bool:N \tex_ifodd:D
\cs_new_eq:NN \if_predicate:w \tex_ifodd:D
% \end{macrocode}
% \end{macro}
@@ -916,6 +917,31 @@
% \end{macro}
% \end{macro}
%
+% \subsection{Internal auxiliaries}
+%
+% \begin{variable}{\q_@@_recursion_tail,\q_@@_recursion_stop}
+% Internal recursion quarks.
+% \begin{macrocode}
+\quark_new:N \q_@@_recursion_tail
+\quark_new:N \q_@@_recursion_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP]{\@@_use_i_delimit_by_q_recursion_stop:nw}
+% Functions to gobble up to a quark.
+% \begin{macrocode}
+\cs_new:Npn \@@_use_i_delimit_by_q_recursion_stop:nw
+ #1 #2 \q_@@_recursion_stop {#1}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\@@_if_recursion_tail_stop_do:nn}
+% Functions to query recursion quarks.
+% \begin{macrocode}
+\__kernel_quark_new_test:N \@@_if_recursion_tail_stop_do:nn
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}[pTF]{\bool_if:N, \bool_if:c}
% \UnitTested
% Straight forward here. We could optimize here if we wanted to as
@@ -1213,7 +1239,7 @@
% \texttt{false} expression, then the result is \texttt{true}.
% \begin{macrocode}
\cs_new:Npn \bool_lazy_all_p:n #1
- { \@@_lazy_all:n #1 \q_recursion_tail \q_recursion_stop }
+ { \@@_lazy_all:n #1 \q_@@_recursion_tail \q_@@_recursion_stop }
\prg_new_conditional:Npnn \bool_lazy_all:n #1 { T , F , TF }
{
\if_predicate:w \bool_lazy_all_p:n {#1}
@@ -1224,9 +1250,9 @@
}
\cs_new:Npn \@@_lazy_all:n #1
{
- \quark_if_recursion_tail_stop_do:nn {#1} { \c_true_bool }
+ \@@_if_recursion_tail_stop_do:nn {#1} { \c_true_bool }
\bool_if:nF {#1}
- { \use_i_delimit_by_q_recursion_stop:nw { \c_false_bool } }
+ { \@@_use_i_delimit_by_q_recursion_stop:nw { \c_false_bool } }
\@@_lazy_all:n
}
% \end{macrocode}
@@ -1260,7 +1286,7 @@
% \texttt{true} expression, then the result is \texttt{false}.
% \begin{macrocode}
\cs_new:Npn \bool_lazy_any_p:n #1
- { \@@_lazy_any:n #1 \q_recursion_tail \q_recursion_stop }
+ { \@@_lazy_any:n #1 \q_@@_recursion_tail \q_@@_recursion_stop }
\prg_new_conditional:Npnn \bool_lazy_any:n #1 { T , F , TF }
{
\if_predicate:w \bool_lazy_any_p:n {#1}
@@ -1271,9 +1297,9 @@
}
\cs_new:Npn \@@_lazy_any:n #1
{
- \quark_if_recursion_tail_stop_do:nn {#1} { \c_false_bool }
+ \@@_if_recursion_tail_stop_do:nn {#1} { \c_false_bool }
\bool_if:nT {#1}
- { \use_i_delimit_by_q_recursion_stop:nw { \c_true_bool } }
+ { \@@_use_i_delimit_by_q_recursion_stop:nw { \c_true_bool } }
\@@_lazy_any:n
}
% \end{macrocode}
@@ -1606,10 +1632,6 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macrocode}
-%<@@=prg>
-% \end{macrocode}
-%
% \begin{variable}{\g__kernel_prg_map_int}
% A nesting counter for mapping.
% \begin{macrocode}
diff --git a/macros/latex/contrib/l3kernel/l3prop.dtx b/macros/latex/contrib/l3kernel/l3prop.dtx
index 9cc9111f34..c586164260 100644
--- a/macros/latex/contrib/l3kernel/l3prop.dtx
+++ b/macros/latex/contrib/l3kernel/l3prop.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
@@ -617,6 +617,34 @@
% \end{macrocode}
% \end{variable}
%
+% \subsection{Internal auxiliaries}
+%
+% \begin{variable}{\s_@@_mark,\s_@@_stop}
+% Internal scan marks.
+% \begin{macrocode}
+\scan_new:N \s_@@_mark
+\scan_new:N \s_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\q_@@_recursion_tail,\q_@@_recursion_stop}
+% Internal recursion quarks.
+% \begin{macrocode}
+\quark_new:N \q_@@_recursion_tail
+\quark_new:N \q_@@_recursion_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP]{\@@_if_recursion_tail_stop:n}
+% \begin{macro}[EXP]{\@@_if_recursion_tail_stop:o}
+% Functions to query recursion quarks.
+% \begin{macrocode}
+\__kernel_quark_new_test:N \@@_if_recursion_tail_stop:n
+\cs_generate_variant:Nn \@@_if_recursion_tail_stop:n { o }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
% \subsection{Allocation and initialisation}
%
% \begin{macro}[tested = m3prop001]{\prop_new:N, \prop_new:c}
@@ -718,9 +746,9 @@
% trailing~|=| that we added). For both splits trim spaces and call a
% function (first \cs{@@_from_keyval_key:w} then
% \cs{@@_from_keyval_value:w}), followed by the trimmed material,
-% \cs{q_nil}, the subsequent part of the item, and the trailing |=|'s
-% and \cs{q_stop}. After finding the \meta{key} just store it after
-% \cs{q_stop}. After finding the \meta{value} ignore completely empty
+% \cs{s_@@_mark}, the subsequent part of the item, and the trailing |=|'s
+% and \cs{s_@@_stop}. After finding the \meta{key} just store it after
+% \cs{s_@@_stop}. After finding the \meta{value} ignore completely empty
% items (both trailing~|=| were used as delimiters and all parts are
% empty); if the remaining part~|#2| consists exactly of the second
% trailing~|=| (namely there was exactly one |=|~in the item) then
@@ -754,27 +782,27 @@
\cs_new_protected:Npn \@@_from_keyval:n #1
{
\@@_from_keyval_loop:w \prg_do_nothing: #1 ,
- \q_recursion_tail , \q_recursion_stop
+ \q_@@_recursion_tail , \q_@@_recursion_stop
}
\cs_new_protected:Npn \@@_from_keyval_loop:w #1 ,
{
- \quark_if_recursion_tail_stop:o {#1}
+ \@@_if_recursion_tail_stop:o {#1}
\@@_from_keyval_split:Nw \@@_from_keyval_key:n
- #1 = = \q_stop {#1}
+ #1 = = \s_@@_stop {#1}
\@@_from_keyval_loop:w \prg_do_nothing:
}
\cs_new_protected:Npn \@@_from_keyval_split:Nw #1#2 =
{ \tl_trim_spaces_apply:oN {#2} #1 }
\cs_new_protected:Npn \@@_from_keyval_key:n #1
- { \@@_from_keyval_key:w #1 \q_nil }
-\cs_new_protected:Npn \@@_from_keyval_key:w #1 \q_nil #2 \q_stop
+ { \@@_from_keyval_key:w #1 \s_@@_mark }
+\cs_new_protected:Npn \@@_from_keyval_key:w #1 \s_@@_mark #2 \s_@@_stop
{
\@@_from_keyval_split:Nw \@@_from_keyval_value:n
- \prg_do_nothing: #2 \q_stop {#1}
+ \prg_do_nothing: #2 \s_@@_stop {#1}
}
\cs_new_protected:Npn \@@_from_keyval_value:n #1
- { \@@_from_keyval_value:w #1 \q_nil }
-\cs_new_protected:Npn \@@_from_keyval_value:w #1 \q_nil #2 \q_stop #3#4
+ { \@@_from_keyval_value:w #1 \s_@@_mark }
+\cs_new_protected:Npn \@@_from_keyval_value:w #1 \s_@@_mark #2 \s_@@_stop #3#4
{
\tl_if_empty:nF { #3 #1 #2 }
{
@@ -808,7 +836,7 @@
% \begin{quote}
% \cs{cs_set:Npn} \cs{@@_split_aux:w} |#1| \\
% \quad \cs{@@_pair:wn} \meta{key} \cs{s_@@} |#2| \\
-% \quad |#3| \cs{q_mark} |#4| |#5| \cs{q_stop} \\
+% \quad |#3| \cs{s_@@_mark} |#4| |#5| \cs{s_@@_stop} \\
% \quad |{| |#4| \Arg{true code} \Arg{false code} |}|
% \end{quote}
%
@@ -829,10 +857,10 @@
\cs_new_protected:Npn \@@_split_aux:NnTF #1#2#3#4
{
\cs_set:Npn \@@_split_aux:w ##1
- \@@_pair:wn #2 \s_@@ ##2 ##3 \q_mark ##4 ##5 \q_stop
+ \@@_pair:wn #2 \s_@@ ##2 ##3 \s_@@_mark ##4 ##5 \s_@@_stop
{ ##4 {#3} {#4} }
- \exp_after:wN \@@_split_aux:w #1 \q_mark \use_i:nn
- \@@_pair:wn #2 \s_@@ { } \q_mark \use_ii:nn \q_stop
+ \exp_after:wN \@@_split_aux:w #1 \s_@@_mark \use_i:nn
+ \@@_pair:wn #2 \s_@@ { } \s_@@_mark \use_ii:nn \s_@@_stop
}
\cs_new:Npn \@@_split_aux:w { }
% \end{macrocode}
@@ -1147,7 +1175,7 @@
% most often empty. When the \meta{key} is found in the list,
% \cs{@@_if_in:N} receives \cs{@@_pair:wn}, and if it is
% found as the extra item, the function receives
-% \cs{q_recursion_tail}, easily recognizable.
+% \cs{q_@@_recursion_tail}, easily recognizable.
%
% Here, \cs{prop_map_function:NN} is not sufficient for the mapping,
% since it can only map a single token, and cannot carry the key that
@@ -1157,7 +1185,7 @@
{
\exp_last_unbraced:Noo \@@_if_in:nwwn { \tl_to_str:n {#2} } #1
\@@_pair:wn \tl_to_str:n {#2} \s_@@ { }
- \q_recursion_tail
+ \q_@@_recursion_tail
\prg_break_point:
}
\cs_new:Npn \@@_if_in:nwwn #1#2 \@@_pair:wn #3 \s_@@ #4
@@ -1168,7 +1196,7 @@
}
\cs_new:Npn \@@_if_in:N #1
{
- \if_meaning:w \q_recursion_tail #1
+ \if_meaning:w \q_@@_recursion_tail #1
\prg_return_false:
\else:
\prg_return_true:
diff --git a/macros/latex/contrib/l3kernel/l3quark.dtx b/macros/latex/contrib/l3kernel/l3quark.dtx
index a6c66f1561..f513fcb026 100644
--- a/macros/latex/contrib/l3kernel/l3quark.dtx
+++ b/macros/latex/contrib/l3kernel/l3quark.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
@@ -399,9 +399,25 @@
% \end{macrocode}
% \end{variable}
%
-% \begin{macro}{\quark_if_recursion_tail_stop:N}
+% \begin{variable}{\s_@@}
+% Private scan mark used in \pkg{l3quark}. We don't have \pkg{l3scan}
+% yet, so we declare the scan mark here and add it to the scan mark pool
+% later.
+% \begin{macrocode}
+\cs_new_eq:NN \s_@@ \scan_stop:
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\q_@@_nil}
+% Private quark use for some tests.
+% \begin{macrocode}
+\quark_new:N \q_@@_nil
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP]{\quark_if_recursion_tail_stop:N}
% \UnitTested
-% \begin{macro}{\quark_if_recursion_tail_stop_do:Nn}
+% \begin{macro}[EXP]{\quark_if_recursion_tail_stop_do:Nn}
% \UnitTested
% When doing recursions, it is easy to spend a lot of time testing if the
% end marker has been found. To avoid this, a dedicated end marker is used
@@ -429,13 +445,13 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}
+% \begin{macro}[EXP]
% {\quark_if_recursion_tail_stop:n, \quark_if_recursion_tail_stop:o}
% \UnitTested
-% \begin{macro}
+% \begin{macro}[EXP]
% {\quark_if_recursion_tail_stop_do:nn, \quark_if_recursion_tail_stop_do:on}
% \UnitTested
-% \begin{macro}{\@@_if_recursion_tail:w}
+% \begin{macro}[EXP]{\@@_if_recursion_tail:w}
% See \cs{quark_if_nil:nTF} for the details. Expanding
% \cs{@@_if_recursion_tail:w} once in front of the tokens chosen here
% gives an empty result if and only if |#1|~is exactly
@@ -464,8 +480,8 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}{\quark_if_recursion_tail_break:NN}
-% \begin{macro}{\quark_if_recursion_tail_break:nN}
+% \begin{macro}[EXP]{\quark_if_recursion_tail_break:NN}
+% \begin{macro}[EXP]{\quark_if_recursion_tail_break:nN}
% Analogues of the \cs[index=quark_if_recursion_tail_stop:n]
% {quark_if_recursion_tail_stop\ldots{}} functions.
% Break the mapping using |#2|.
@@ -574,6 +590,353 @@
% \end{macro}
% \end{macro}
%
+% \begin{macro}{\__kernel_quark_new_test:N}
+% The function \cs{__kernel_quark_new_test:N} defines |#1| in a
+% similar way as \cs[no-index]{quark_if_recursion_tail_...} functions
+% (as described below), using
+% \cs[no-index]{q__\meta{namespace}_recursion_tail} as the test quark
+% and \cs[no-index]{q__\meta{namespace}_recursion_stop} as the
+% delimiter quark, where the \meta{namespace} is determined as the
+% first |_|-delimited part in~|#1|.
+%
+% There are six possible function types which this function can define,
+% and which is defined depends on the signature of the function being
+% defined:
+% \begin{description}
+% \def\makelabel#1{\texttt{:#1}~}
+% \item[n] gives an analogue of \cs{quark_if_recursion_tail_stop:n}
+% \item[nn] gives an analogue of \cs{quark_if_recursion_tail_stop_do:nn}
+% \item[nN] gives an analogue of \cs{quark_if_recursion_tail_break:nN}
+% \item[N] gives an analogue of \cs{quark_if_recursion_tail_stop:N}
+% \item[Nn] gives an analogue of \cs{quark_if_recursion_tail_stop_do:Nn}
+% \item[NN] gives an analogue of \cs{quark_if_recursion_tail_break:NN}
+% \end{description}
+% Any other signature causes an error, as does a function without signature.
+%
+% \begin{macro}{\__kernel_quark_new_conditional:Nn}
+% Similar to \cs{__kernel_quark_new_test:N}, but defines quark
+% branching conditionals like \cs{quark_if_nil:nTF} that test for the
+% quark \cs[no-index]{q__\meta{namespace}_\meta{name}}.
+% The \meta{namespace} and \meta{name} are determined from the
+% conditional~|#1|, which must take the rather rigid form
+% \cs[no-index]{__\meta{namespace}_quark_if_\meta{name}:\meta{arg spec}}.
+% There are only two cases for the \meta{arg spec} here:
+% \begin{description}
+% \def\makelabel#1{\texttt{:#1}~}
+% \item[n] gives an analogue of \cs[no-index]{quark_if_nil:n(TF)}
+% \item[N] gives an analogue of \cs[no-index]{quark_if_nil:N(TF)}
+% \end{description}
+% Any other signature causes an error, as does a function without signature.
+% We use low-level emptiness tests as \pkg{l3tl} is not available yet when these
+% functions are used; thankfully we only care about whether strings
+% are empty so a simple \cs{if_meaning:w} \cs{q_nil} \meta{string}
+% \cs{q_nil} suffices.
+%
+% \begin{macro}{\@@_new_test:NNNn, \@@_new_test:Nccn,
+% \@@_new_test_aux:nnNNnnnn}
+% \begin{macro}{\@@_new_conditional:Nnnn, \@@_new_conditional:Nxxn}
+% \begin{macrocode}
+\cs_new_protected:Npn \__kernel_quark_new_test:N #1
+ { \@@_new_test_aux:Nx #1 { \@@_module_name:N #1 } }
+\cs_new_protected:Npn \@@_new_test_aux:Nn #1 #2
+ {
+ \if_meaning:w \q_nil #2 \q_nil
+ \__kernel_msg_error:nnx { kernel } { invalid-quark-function }
+ { \token_to_str:N #1 }
+ \else:
+ \@@_new_test:Nccn #1
+ { q__#2_recursion_tail } { q__#2_recursion_stop } { __#2 }
+ \fi:
+ }
+\cs_generate_variant:Nn \@@_new_test_aux:Nn { Nx }
+\cs_new_protected:Npn \@@_new_test:NNNn #1
+ {
+ \exp_last_unbraced:Nf \@@_new_test_aux:nnNNnnnn
+ { \cs_split_function:N #1 }
+ #1 { test }
+ }
+\cs_generate_variant:Nn \@@_new_test:NNNn { Ncc }
+\cs_new_protected:Npn \__kernel_quark_new_conditional:Nn #1
+ {
+ \@@_new_conditional:Nxxn #1
+ { \@@_quark_conditional_name:N #1 }
+ { \@@_module_name:N #1 }
+ }
+\cs_new_protected:Npn \@@_new_conditional:Nnnn #1#2#3#4
+ {
+ \if_meaning:w \q_nil #2 \q_nil
+ \__kernel_msg_error:nnx { kernel } { invalid-quark-function }
+ { \token_to_str:N #1 }
+ \else:
+ \if_meaning:w \q_nil #3 \q_nil
+ \__kernel_msg_error:nnx { kernel } { invalid-quark-function }
+ { \token_to_str:N #1 }
+ \else:
+ \exp_last_unbraced:Nf \@@_new_test_aux:nnNNnnnn
+ { \cs_split_function:N #1 }
+ #1 { conditional }
+ {#2} {#3} {#4}
+ \fi:
+ \fi:
+ }
+\cs_generate_variant:Nn \@@_new_conditional:Nnnn { Nxx }
+\cs_new_protected:Npn \@@_new_test_aux:nnNNnnnn #1 #2 #3 #4 #5
+ {
+ \cs_if_exist_use:cTF { @@_new_#5_#2:Nnnn } { #4 }
+ {
+ \__kernel_msg_error:nnxx { kernel } { invalid-quark-function }
+ { \token_to_str:N #4 } {#2}
+ \use_none:nnn
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{
+% \@@_new_test_n:Nnnn, \@@_new_test_nn:Nnnn,
+% \@@_new_test_N:Nnnn, \@@_new_test_Nn:Nnnn,
+% \@@_new_test_NN:Nnnn, \@@_new_test_NN:Nnnn,
+% }
+% These macros implement the six possibilities mentioned above, passing
+% the right arguments to \cs{@@_new_test_aux_do:nNNnnnnNNn},
+% which defines some auxiliaries, and then to
+% \cs{@@_new_test_define_tl:nNnNNn} (|:n(n)| variants) or to
+% \cs{@@_new_test_define_ifx:nNnNNn} (|:N(n)|) which define the
+% main conditionals.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_new_test_n:Nnnn #1 #2 #3 #4
+ {
+ \@@_new_test_aux_do:nNNnnnnNNn {#4} #2 #3 { none } { } { } { }
+ \@@_new_test_define_tl:nNnNNn #1 { }
+ }
+\cs_new_protected:Npn \@@_new_test_nn:Nnnn #1 #2 #3 #4
+ {
+ \@@_new_test_aux_do:nNNnnnnNNn {#4} #2 #3 { i } { n } {##1} {##2}
+ \@@_new_test_define_tl:nNnNNn #1 { \use_none:n }
+ }
+\cs_new_protected:Npn \@@_new_test_nN:Nnnn #1 #2 #3 #4
+ {
+ \@@_new_test_aux_do:nNNnnnnNNn {#4} #2 #3 { i } { n } {##1} {##2}
+ \@@_new_test_define_break_tl:nNNNNn #1 { }
+ }
+\cs_new_protected:Npn \@@_new_test_N:Nnnn #1 #2 #3 #4
+ {
+ \@@_new_test_aux_do:nNNnnnnNNn {#4} #2 #3 { none } { } { } { }
+ \@@_new_test_define_ifx:nNnNNn #1 { }
+ }
+\cs_new_protected:Npn \@@_new_test_Nn:Nnnn #1 #2 #3 #4
+ {
+ \@@_new_test_aux_do:nNNnnnnNNn {#4} #2 #3 { i } { n } {##1} {##2}
+ \@@_new_test_define_ifx:nNnNNn #1
+ { \else: \exp_after:wN \use_none:n }
+ }
+\cs_new_protected:Npn \@@_new_test_NN:Nnnn #1 #2 #3 #4
+ {
+ \@@_new_test_aux_do:nNNnnnnNNn {#4} #2 #3 { i } { n } {##1} {##2}
+ \@@_new_test_define_break_ifx:nNNNNn #1 { }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{
+% \@@_new_test_aux_do:nNNnnnnNNn,
+% \@@_test_define_aux:NNNNnnNNn
+% }
+% \cs{@@_new_test_aux_do:nNNnnnnNNn} makes the control sequence names
+% which will be used by \cs{@@_test_define_aux:NNNNnnNNn}, and then later
+% by \cs{@@_new_test_define_tl:nNnNNn} or
+% \cs{@@_new_test_define_ifx:nNnNNn}. The control sequences defined
+% here are analogous to \cs{@@_if_recursion_tail:w} and to
+% \cs[no-index]{use_(none|i)_delimit_by_q_recursion_stop:(|n)w}.
+%
+% The name is composed by the name-space and the name of the quarks.
+% Suppose \cs{__kernel_quark_new_test:N} was used with:
+% \begin{verbatim}
+% \__kernel_quark_new_test:N \__test_quark_tail:n
+% \end{verbatim}
+% then the first auxiliary will be \cs[no-index]{__test_quark_recursion_tail:w},
+% and the second one will be
+% \cs[no-index]{__test_use_none_delimit_by_q_recursion_stop:w}.
+%
+% Note that the actual quarks are \emph{not} defined here. They should
+% be defined separately using \cs{quark_new:N}.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_new_test_aux_do:nNNnnnnNNn #1 #2 #3 #4 #5
+ {
+ \exp_args:Ncc \@@_test_define_aux:NNNNnnNNn
+ { #1 _quark_recursion_tail:w }
+ { #1 _use_ #4 _delimit_by_q_recursion_stop: #5 w }
+ #2 #3
+ }
+\cs_new_protected:Npn \@@_test_define_aux:NNNNnnNNn #1 #2 #3 #4 #5 #6 #7
+ {
+ \cs_gset:Npn #1 ##1 #3 ##2 ? ##3 ?! { ##1 ##2 }
+ \cs_gset:Npn #2 ##1 #6 #4 {#5}
+ #7 {##1} #1 #2 #3
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{
+% \@@_new_test_define_tl:nNnNNn,
+% \@@_new_test_define_ifx:nNnNNn
+% }
+% \begin{macro}{
+% \@@_new_test_define_break_tl:nNNNNn,
+% \@@_new_test_define_break_ifx:nNNNNn
+% }
+% Finally, these two macros define the main conditional function using
+% what's been set up before.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_new_test_define_tl:nNnNNn #1 #2 #3 #4 #5 #6
+ {
+ \cs_new:Npn #5 #1
+ {
+ \tl_if_empty:oTF
+ { #2 {} ##1 {} ?! #4 ??! }
+ {#3} {#6}
+ }
+ }
+\cs_new_protected:Npn \@@_new_test_define_ifx:nNnNNn #1 #2 #3 #4 #5 #6
+ {
+ \cs_new:Npn #5 #1
+ {
+ \if_meaning:w #4 ##1
+ \exp_after:wN #3
+ #6
+ \fi:
+ }
+ }
+\cs_new_protected:Npn \@@_new_test_define_break_tl:nNNNNn #1 #2 #3
+ { \@@_new_test_define_tl:nNnNNn {##1##2} #2 {##2} }
+\cs_new_protected:Npn \@@_new_test_define_break_ifx:nNNNNn #1 #2 #3
+ { \@@_new_test_define_ifx:nNnNNn {##1##2} #2 {##2} }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{
+% \@@_new_conditional_n:Nnnn,
+% \@@_new_conditional_N:Nnnn,
+% }
+% These macros implement the two possibilities for branching quark
+% conditionals, passing
+% the right arguments to \cs{@@_new_conditional_aux_do:NNnnn},
+% which defines some auxiliaries and defines the
+% main conditionals.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_new_conditional_n:Nnnn
+ { \@@_new_conditional_aux_do:NNnnn \use_i:nn }
+\cs_new_protected:Npn \@@_new_conditional_N:Nnnn
+ { \@@_new_conditional_aux_do:NNnnn \use_ii:nn }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{
+% \@@_new_conditional_aux_do:NNnnn,
+% \@@_new_conditional_define:NNNNn,
+% }
+% Similar to the previous macros, but branching conditionals only
+% require one auxiliary, so we take a shortcut. In
+% \cs{@@_new_conditional_define:NNNNn}, |#4| is \cs{use_i:nn} to
+% define the \texttt{n}-type function (which needs an auxiliary) and
+% is \cs{use_ii:nn} to define the \texttt{N}-type function.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_new_conditional_aux_do:NNnnn #1 #2 #3 #4
+ {
+ \exp_args:Ncc \@@_new_conditional_define:NNNNn
+ { __ #4 _if_quark_ #3 :w } { q__ #4 _ #3 } #2 #1
+ }
+\cs_new_protected:Npn \@@_new_conditional_define:NNNNn #1 #2 #3 #4 #5
+ {
+ #4 { \cs_gset:Npn #1 ##1 #2 ##2 ? ##3 ?! { ##1 ##2 } } { }
+ \exp_args:Nno \use:n { \prg_new_conditional:Npnn #3 ##1 {#5} }
+ {
+ #4 { \@@_if_empty_if:o { #1 {} ##1 {} ?! #2 ??! } }
+ { \if_meaning:w #2 ##1 }
+ \prg_return_true: \else: \prg_return_false: \fi:
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\@@_module_name:N}
+% \begin{macro}[EXP]{
+% \@@_module_name:w,
+% \@@_module_name_loop:w,
+% \@@_module_name_end:w
+% }
+% \cs{@@_module_name:N} takes a control sequence and returns its
+% \meta{module} name, determined as the first non-empty
+% non-single-character word, separated by |_| or~|:|. These rules
+% give the correct result for public functions
+% \cs[no-index]{\meta{module}_\ldots{}}, private functions
+% \cs[no-index]{__\meta{module}_\ldots{}}, and variables such as
+% \cs[no-index]{l_\meta{module}_\ldots{}}. If no valid module is
+% found the result is an empty string. The approach is to first cut
+% off everything after the (first) |:| if any is present, then
+% repeatedly grab |_|-delimited words until finding one of length at
+% least~$2$ (we use low-level tests as \pkg{l3tl} is not fully
+% available when \cs{__kernel_quark_new_test:N} is first used.
+% If no \meta{module} is found (such as in \cs{::n}) we
+% get the trailing marker \cs{use_none:n} |{}|, which expands to
+% nothing.
+% \begin{macrocode}
+\cs_set:Npn \@@_tmp:w #1#2
+ {
+ \cs_new:Npn \@@_module_name:N ##1
+ {
+ \exp_last_unbraced:Nf \@@_module_name:w
+ { \cs_to_str:N ##1 } #1 \s_@@
+ }
+ \cs_new:Npn \@@_module_name:w ##1 #1 ##2 \s_@@
+ { \@@_module_name_loop:w ##1 #2 \use_none:n { } #2 \s_@@ }
+ \cs_new:Npn \@@_module_name_loop:w ##1 #2
+ {
+ \use_i_ii:nnn \if_meaning:w \prg_do_nothing:
+ ##1 \prg_do_nothing: \prg_do_nothing:
+ \exp_after:wN \@@_module_name_loop:w
+ \else:
+ \@@_module_name_end:w ##1
+ \fi:
+ }
+ \cs_new:Npn \@@_module_name_end:w
+ ##1 \fi: ##2 \s_@@ { \fi: ##1 }
+ }
+\exp_after:wN \@@_tmp:w \tl_to_str:n { : _ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\@@_quark_conditional_name:N, \@@_quark_conditional_name:w}
+% \cs{@@_quark_conditional_name:N} determines the quark name that the quark
+% conditional function~|##1| queries, as the part of the function name
+% between |_quark_if_| and the trailing~|:|. Again we define it
+% through \cs{@@_tmp:w}, which receives |:| as |#1| and |_quark_if_|
+% as |#2|. The auxiliary \cs{@@_quark_conditional_name:w} returns the part
+% between the first |_quark_if_| and the next~|:|, and we apply this
+% auxiliary to the function name followed by |:| (in case the function
+% name is lacking a signature), and |_quark_if_:| so that
+% \cs{@@_quark_conditional_name:N} returns an empty string if |_quark_if_| is
+% not present.
+% \begin{macrocode}
+\cs_set:Npn \@@_tmp:w #1 #2 \s_@@
+ {
+ \cs_new:Npn \@@_quark_conditional_name:N ##1
+ {
+ \exp_last_unbraced:Nf \@@_quark_conditional_name:w
+ { \cs_to_str:N ##1 } #1 #2 #1 \s_@@
+ }
+ \cs_new:Npn \@@_quark_conditional_name:w
+ ##1 #2 ##2 #1 ##3 \s_@@ {##2}
+ }
+\exp_after:wN \@@_tmp:w \tl_to_str:n { : _quark_if_ } \s_@@
+% \end{macrocode}
+% \end{macro}
+%
% \subsection{Scan marks}
%
% \begin{macrocode}
@@ -583,8 +946,9 @@
% \begin{variable}{\g_@@_marks_tl}
% \UnitTested
% The list of all scan marks currently declared.
+% No \pkg{l3tl} yet, so define this by hand.
% \begin{macrocode}
-\tl_new:N \g_@@_marks_tl
+\cs_gset:Npn \g_@@_marks_tl { }
% \end{macrocode}
% \end{variable}
%
@@ -612,12 +976,25 @@
% \UnitTested
% We only declare one scan mark here, more can be defined
% by specific modules.
+% Can't use \cs{scan_new:N} yet because \pkg{l3tl} isn't loaded,
+% so define \cs{s_stop} by hand and add it to \cs{g_@@_marks_tl}.
+% We also add \cs{s__quark} (declared earlier) to the pool here.
+% Since it lives in a different namespace, a little \pkg{l3docstrip}
+% cheating is necessary.
% \begin{macrocode}
-\scan_new:N \s_stop
+\cs_new_eq:NN \s_stop \scan_stop:
+\cs_gset_nopar:Npx \g_@@_marks_tl
+ {
+ \exp_not:o \g_@@_marks_tl
+ \s_stop
+%<@@=quark>
+ \s_@@
+%<@@=scan>
+ }
% \end{macrocode}
% \end{variable}
%
-% \begin{macro}{\use_none_delimit_by_s_stop:w}
+% \begin{macro}[EXP]{\use_none_delimit_by_s_stop:w}
% \UnitTested
% Similar to \cs{use_none_delimit_by_q_stop:w}.
% \begin{macrocode}
diff --git a/macros/latex/contrib/l3kernel/l3regex.dtx b/macros/latex/contrib/l3kernel/l3regex.dtx
index 3b4fc4fbc8..7c2d8e7504 100644
--- a/macros/latex/contrib/l3kernel/l3regex.dtx
+++ b/macros/latex/contrib/l3kernel/l3regex.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
@@ -1105,6 +1105,42 @@
% \end{macrocode}
% \end{variable}
%
+% \subsubsection{Internal auxiliaries}
+%
+% \begin{variable}{\q_@@_recursion_stop}
+% Internal recursion quarks.
+% \begin{macrocode}
+\quark_new:N \q_@@_recursion_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP]{
+% \@@_use_none_delimit_by_q_recursion_stop:w,
+% \@@_use_i_delimit_by_q_recursion_stop:nw
+% }
+% Functions to gobble up to a quark.
+% \begin{macrocode}
+\cs_new:Npn \@@_use_none_delimit_by_q_recursion_stop:w
+ #1 \q_@@_recursion_stop { }
+\cs_new:Npn \@@_use_i_delimit_by_q_recursion_stop:nw
+ #1 #2 \q_@@_recursion_stop {#1}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{variable}{\q_@@_nil}
+% Internal quarks.
+% \begin{macrocode}
+\quark_new:N \q_@@_nil
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[pTF]{\@@_quark_if_nil:n}
+% Branching quark conditional.
+% \begin{macrocode}
+\__kernel_quark_new_conditional:Nn \@@_quark_if_nil:N { F }
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\@@_break_point:TF}
% \begin{macro}{\@@_break_true:w}
% When testing whether a character of the query token list matches
@@ -3242,7 +3278,7 @@
\tl_set:Nx \l_@@_internal_a_tl
{
\exp_after:wN \@@_compile_cs_aux:Nn \l_@@_internal_regex
- \q_nil \q_nil \q_recursion_stop
+ \q_@@_nil \q_@@_nil \q_@@_recursion_stop
}
\exp_args:Nx \@@_compile_one:n
{
@@ -3260,12 +3296,13 @@
{
\scan_stop:
\@@_compile_cs_aux:NNnnnN #2
- \q_nil \q_nil \q_nil \q_nil \q_nil \q_nil \q_recursion_stop
+ \q_@@_nil \q_@@_nil \q_@@_nil
+ \q_@@_nil \q_@@_nil \q_@@_nil \q_@@_recursion_stop
\@@_compile_cs_aux:Nn
}
{
- \quark_if_nil:NF #1 { \flag_raise_if_clear:n { @@_cs } }
- \use_none_delimit_by_q_recursion_stop:w
+ \@@_quark_if_nil:NF #1 { \flag_raise_if_clear:n { @@_cs } }
+ \@@_use_none_delimit_by_q_recursion_stop:w
}
}
\cs_new:Npn \@@_compile_cs_aux:NNnnnN #1#2#3#4#5#6
@@ -3284,12 +3321,12 @@
\@@_compile_cs_aux:NNnnnN
}
{
- \quark_if_nil:NF #1
+ \@@_quark_if_nil:NF #1
{
\flag_raise_if_clear:n { @@_cs }
- \use_i_delimit_by_q_recursion_stop:nw
+ \@@_use_i_delimit_by_q_recursion_stop:nw
}
- \use_none_delimit_by_q_recursion_stop:w
+ \@@_use_none_delimit_by_q_recursion_stop:w
}
}
% \end{macrocode}
diff --git a/macros/latex/contrib/l3kernel/l3seq.dtx b/macros/latex/contrib/l3kernel/l3seq.dtx
index 071f202e81..56c4bc1fda 100644
--- a/macros/latex/contrib/l3kernel/l3seq.dtx
+++ b/macros/latex/contrib/l3kernel/l3seq.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
@@ -985,6 +985,14 @@
% \end{macrocode}
% \end{variable}
%
+% \begin{variable}{\s_@@_mark,\s_@@_stop}
+% Private scan marks.
+% \begin{macrocode}
+\scan_new:N \s_@@_mark
+\scan_new:N \s_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
% \begin{macro}{\@@_item:n}
% The delimiter is always defined, but when used incorrectly simply
% removes its argument and hits an undefined control sequence to
@@ -1645,10 +1653,10 @@
\tl_set:Nx #2
{
\exp_after:wN \@@_get_left:wnw
- #1 \@@_item:n { \q_no_value } \q_stop
+ #1 \@@_item:n { \q_no_value } \s_@@_stop
}
}
-\cs_new:Npn \@@_get_left:wnw #1 \@@_item:n #2#3 \q_stop
+\cs_new:Npn \@@_get_left:wnw #1 \@@_item:n #2#3 \s_@@_stop
{ \exp_not:n {#2} }
\cs_generate_variant:Nn \seq_get_left:NN { c }
% \end{macrocode}
@@ -1670,9 +1678,9 @@
\cs_new_protected:Npn \seq_gpop_left:NN
{ \@@_pop:NNNN \@@_pop_left:NNN \tl_gset:Nn }
\cs_new_protected:Npn \@@_pop_left:NNN #1#2#3
- { \exp_after:wN \@@_pop_left:wnwNNN #2 \q_stop #1#2#3 }
+ { \exp_after:wN \@@_pop_left:wnwNNN #2 \s_@@_stop #1#2#3 }
\cs_new_protected:Npn \@@_pop_left:wnwNNN
- #1 \@@_item:n #2#3 \q_stop #4#5#6
+ #1 \@@_item:n #2#3 \s_@@_stop #4#5#6
{
#4 #5 { #1 #3 }
\tl_set:Nn #6 {#2}
@@ -1823,8 +1831,8 @@
% of being empty, terminating the loop and returning nothing at all.
% \begin{macrocode}
\cs_new:Npn \seq_item:Nn #1
- { \exp_after:wN \@@_item:wNn #1 \q_stop #1 }
-\cs_new:Npn \@@_item:wNn \s_@@ #1 \q_stop #2#3
+ { \exp_after:wN \@@_item:wNn #1 \s_@@_stop #1 }
+\cs_new:Npn \@@_item:wNn \s_@@ #1 \s_@@_stop #2#3
{
\exp_args:Nf \@@_item:nwn
{ \exp_args:Nf \@@_item:nN { \int_eval:n {#3} } #2 }
@@ -2070,9 +2078,9 @@
}
{
\exp_after:wN \@@_use_setup:w #1 \@@_item:n
- \q_mark { \@@_use:nwwwwnwn {#3} }
- \q_mark { \@@_use:nwwn {#4} }
- \q_stop { }
+ \s_@@_mark { \@@_use:nwwwwnwn {#3} }
+ \s_@@_mark { \@@_use:nwwn {#4} }
+ \s_@@_stop { }
}
}
{
@@ -2085,12 +2093,12 @@
\cs_new:Npn \@@_use_setup:w \s_@@ { \@@_use:nwwwwnwn { } }
\cs_new:Npn \@@_use:nwwwwnwn
#1 \@@_item:n #2 \@@_item:n #3 \@@_item:n #4#5
- \q_mark #6#7 \q_stop #8
+ \s_@@_mark #6#7 \s_@@_stop #8
{
#6 \@@_item:n {#3} \@@_item:n {#4} #5
- \q_mark {#6} #7 \q_stop { #8 #1 #2 }
+ \s_@@_mark {#6} #7 \s_@@_stop { #8 #1 #2 }
}
-\cs_new:Npn \@@_use:nwwn #1 \@@_item:n #2 #3 \q_stop #4
+\cs_new:Npn \@@_use:nwwn #1 \@@_item:n #2 #3 \s_@@_stop #4
{ \exp_not:n { #4 #1 #2 } }
\cs_new:Npn \seq_use:Nn #1#2
{ \seq_use:Nnnn #1 {#2} {#2} {#2} }
diff --git a/macros/latex/contrib/l3kernel/l3skip.dtx b/macros/latex/contrib/l3kernel/l3skip.dtx
index 152b90a3c0..8cfd78d6f1 100644
--- a/macros/latex/contrib/l3kernel/l3skip.dtx
+++ b/macros/latex/contrib/l3kernel/l3skip.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
@@ -1087,6 +1087,23 @@
% \end{macro}
% \end{macro}
%
+% \subsection{Internal auxiliaries}
+%
+% \begin{variable}{\s_@@_mark,\s_@@_stop}
+% Internal scan marks.
+% \begin{macrocode}
+\scan_new:N \s_@@_mark
+\scan_new:N \s_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP]{\@@_use_none_delimit_by_s_stop:w}
+% Functions to gobble up to a scan mark.
+% \begin{macrocode}
+\cs_new:Npn \@@_use_none_delimit_by_s_stop:w #1 \s_@@_stop { }
+% \end{macrocode}
+% \end{macro}
+%
% \subsection{Creating and initialising \texttt{dim} variables}
%
% \begin{macro}{\dim_new:N, \dim_new:c}
@@ -1337,7 +1354,7 @@
\cs_new:Npn \@@_compare:w #1 \@@_compare_error:
{
\exp_after:wN \if_false: \exp:w \exp_end_continue_f:w
- \@@_compare:wNN #1 ? { = \@@_compare_end:w \else: } \q_stop
+ \@@_compare:wNN #1 ? { = \@@_compare_end:w \else: } \s_@@_stop
}
\exp_args:Nno \use:nn
{ \cs_new:Npn \@@_compare:wNN #1 } { \tl_to_str:n {pt} #2#3 }
@@ -1347,7 +1364,7 @@
\fi:
#1 pt \exp_stop_f:
\prg_return_false:
- \exp_after:wN \use_none_delimit_by_q_stop:w
+ \exp_after:wN \@@_use_none_delimit_by_s_stop:w
\fi:
\reverse_if:N \if_dim:w #1 pt #2
\exp_after:wN \@@_compare:wNN
@@ -1361,7 +1378,7 @@
#1 \reverse_if:N #2 < #3 = { #1 #2 > #3 }
\cs_new:cpn { @@_compare_ > :w }
#1 \reverse_if:N #2 > #3 = { #1 #2 < #3 }
-\cs_new:Npn \@@_compare_end:w #1 \prg_return_false: #2 \q_stop
+\cs_new:Npn \@@_compare_end:w #1 \prg_return_false: #2 \s_@@_stop
{ #1 \prg_return_false: \else: \prg_return_true: \fi: }
\cs_new_protected:Npn \@@_compare_error:
{
@@ -1403,14 +1420,14 @@
\exp_args:Nf \@@_case:nnTF { \dim_eval:n {#1} } {#2} { } { }
}
\cs_new:Npn \@@_case:nnTF #1#2#3#4
- { \@@_case:nw {#1} #2 {#1} { } \q_mark {#3} \q_mark {#4} \q_stop }
+ { \@@_case:nw {#1} #2 {#1} { } \s_@@_mark {#3} \s_@@_mark {#4} \s_@@_stop }
\cs_new:Npn \@@_case:nw #1#2#3
{
\dim_compare:nNnTF {#1} = {#2}
{ \@@_case_end:nw {#3} }
{ \@@_case:nw {#1} }
}
-\cs_new:Npn \@@_case_end:nw #1#2#3 \q_mark #4#5 \q_stop
+\cs_new:Npn \@@_case_end:nw #1#2#3 \s_@@_mark #4#5 \s_@@_stop
{ \exp_end: #1 #4 }
% \end{macrocode}
% \end{macro}
@@ -1766,6 +1783,13 @@
%<@@=skip>
% \end{macrocode}
%
+% \begin{variable}{\s_@@_stop}
+% Internal scan marks.
+% \begin{macrocode}
+\scan_new:N \s_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
% \begin{macro}{\skip_new:N, \skip_new:c}
% Allocation of a new internal registers.
% \begin{macrocode}
@@ -1914,9 +1938,9 @@
{
\exp_after:wN \@@_if_finite:wwNw
\skip_use:N \tex_glueexpr:D ##1 ; \prg_return_false:
- #1 ; \prg_return_true: \q_stop
+ #1 ; \prg_return_true: \s_@@_stop
}
- \cs_new:Npn \@@_if_finite:wwNw ##1 #1 ##2 ; ##3 ##4 \q_stop {##3}
+ \cs_new:Npn \@@_if_finite:wwNw ##1 #1 ##2 ; ##3 ##4 \s_@@_stop {##3}
}
\exp_args:No \@@_tmp:w { \tl_to_str:n { fil } }
% \end{macrocode}
diff --git a/macros/latex/contrib/l3kernel/l3sort.dtx b/macros/latex/contrib/l3kernel/l3sort.dtx
index 2dbb5b6931..6b41acfe3e 100644
--- a/macros/latex/contrib/l3kernel/l3sort.dtx
+++ b/macros/latex/contrib/l3kernel/l3sort.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
@@ -199,6 +199,14 @@
% \end{variable}
% \end{variable}
%
+% \begin{variable}{\s_@@_mark,\s_@@_stop}
+% Internal scan marks.
+% \begin{macrocode}
+\scan_new:N \s_@@_mark
+\scan_new:N \s_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
% \subsection{Finding available \tn{toks} registers}
%
% \begin{macro}{\@@_shrink_range:}
@@ -555,7 +563,7 @@
\prg_do_nothing:
\@@_return_mark:w
\@@_return_mark:w
- \q_mark
+ \s_@@_mark
\@@_return_none_error:
}
% \end{macrocode}
@@ -567,7 +575,7 @@
% Each comparison should call \cs{sort_return_same:} or
% \cs{sort_return_swapped:} exactly once. If neither is called,
% \cs{@@_return_none_error:} is called, since the \texttt{return_mark}
-% removes tokens until \cs{q_mark}. If one is called, the
+% removes tokens until \cs{s_@@_mark}. If one is called, the
% \texttt{return_mark} auxiliary removes everything except
% \cs{@@_return_same:w} (or its \texttt{swapped} analogue) followed by
% \cs{@@_return_none_error:}. Finally if two or more are called,
@@ -575,26 +583,26 @@
% so that it produces an error.
% \begin{macrocode}
\cs_new_protected:Npn \sort_return_same:
- #1 \@@_return_mark:w #2 \q_mark
+ #1 \@@_return_mark:w #2 \s_@@_mark
{
#1
#2
\@@_return_two_error:
\@@_return_mark:w
- \q_mark
+ \s_@@_mark
\@@_return_same:w
}
\cs_new_protected:Npn \sort_return_swapped:
- #1 \@@_return_mark:w #2 \q_mark
+ #1 \@@_return_mark:w #2 \s_@@_mark
{
#1
#2
\@@_return_two_error:
\@@_return_mark:w
- \q_mark
+ \s_@@_mark
\@@_return_swapped:w
}
-\cs_new_protected:Npn \@@_return_mark:w #1 \q_mark { }
+\cs_new_protected:Npn \@@_return_mark:w #1 \s_@@_mark { }
\cs_new_protected:Npn \@@_return_none_error:
{
\__kernel_msg_error:nnxx { kernel } { return-none }
@@ -707,7 +715,7 @@
% \tl_if_blank:nF {#1}
% {
% \__sort:nnNnn { } { } #2
-% #1 \q_recursion_tail \q_recursion_stop
+% #1 \q__sort_recursion_tail \q__sort_recursion_stop
% }
% }
% \cs_new:Npn \__sort:nnNnn #1#2#3#4#5
@@ -742,7 +750,7 @@
% ~~~~~~\meta{extra arguments}\\
% ~~|}|\\
% \cs{@@_loop:wNn}~\ldots{}~\meta{prepared tokens}\\
-% ~~\meta{end-loop}~|{}|~\cs{q_stop}
+% ~~\meta{end-loop}~|{}|~\cs{s_@@_stop}
% \end{quote}
% In this example, which matches the structure of
% \cs{@@_quick_split_i:NnnnnNn} and a few other functions below, the
@@ -782,13 +790,13 @@
%
% The third speed up is to avoid |\use:ff| using a continuation-passing
% style: \cs{@@_quick_split:NnNn} expects a list followed by
-% \cs{q_mark} \Arg{code}, and expands to \meta{code} \meta{sorted list}.
+% \cs{s_@@_mark} \Arg{code}, and expands to \meta{code} \meta{sorted list}.
% Sorting the two parts of the list around the pivot is done with
% \begin{quote}
% \ttfamily
-% \cs{@@_quick_split:NnNn} |#2| \ldots{} \cs{q_mark}\\
+% \cs{@@_quick_split:NnNn} |#2| \ldots{} \cs{s_@@_mark}\\
% ~~|{|\\
-% ~~~~\cs{@@_quick_split:NnNn} |#1| \ldots{} \cs{q_mark} \Arg{code}\\
+% ~~~~\cs{@@_quick_split:NnNn} |#1| \ldots{} \cs{s_@@_mark} \Arg{code}\\
% ~~~~\Arg{pivot}\\
% ~~|}|
% \end{quote}
@@ -823,7 +831,7 @@
% argument of the third \cs{use:n}, hence must remain in memory, and so
% on. The memory consumption grows quadratically with the number of
% nested \cs{use:n}. In practice, this means that we must read
-% everything until a trailing \cs{q_stop} once in a while, otherwise
+% everything until a trailing \cs{s_@@_stop} once in a while, otherwise
% sorting lists of more than a few thousand items would exhaust a
% typical \TeX{}'s memory.
%
@@ -846,8 +854,8 @@
% \texttt{prepare_end} auxiliary finds the prepared token list
% as~|#4|. The scene is then set up for \cs{@@_quick_split:NnNn},
% which sorts the prepared list and perform the post action placed
-% after \cs{q_mark}, namely removing the trailing \cs{s_stop} and
-% \cs{q_stop} and leaving \cs{exp_stop_f:} to stop
+% after \cs{s_@@_mark}, namely removing the trailing \cs{s_@@_stop} and
+% \cs{s_@@_stop} and leaving \cs{exp_stop_f:} to stop
% \texttt{f}-expansion.
% \begin{macrocode}
\cs_new:Npn \tl_sort:nN #1#2
@@ -859,7 +867,7 @@
\@@_quick_prepare:Nnnn #2 { } { }
#1
{ \prg_break_point: \@@_quick_prepare_end:NNNnw }
- \q_stop
+ \s_@@_stop
}
}
}
@@ -868,13 +876,13 @@
\prg_break: #4 \prg_break_point:
\@@_quick_prepare:Nnnn #1 { #2 #3 } { #1 {#4} }
}
-\cs_new:Npn \@@_quick_prepare_end:NNNnw #1#2#3#4#5 \q_stop
+\cs_new:Npn \@@_quick_prepare_end:NNNnw #1#2#3#4#5 \s_@@_stop
{
\@@_quick_split:NnNn #4 \@@_quick_end:nnTFNn { }
- \q_mark { \@@_quick_cleanup:w \exp_stop_f: }
- \s_stop \q_stop
+ \s_@@_mark { \@@_quick_cleanup:w \exp_stop_f: }
+ \s_@@_mark \s_@@_stop
}
-\cs_new:Npn \@@_quick_cleanup:w #1 \s_stop \q_stop {#1}
+\cs_new:Npn \@@_quick_cleanup:w #1 \s_@@_mark \s_@@_stop {#1}
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -961,9 +969,9 @@
% auxiliaries here) and another copy~|#6| of the fake item. All those
% are discarded except the function~|#5|. This function receives
% lists~|#1| and~|#2| of items less than or greater than the
-% pivot~|#3|, then a continuation code~|#5| just after \cs{q_mark}.
+% pivot~|#3|, then a continuation code~|#5| just after \cs{s_@@_mark}.
% To avoid a memory problem described earlier, all of the ending
-% functions read~|#6| until \cs{q_stop} and place~|#6| back into the
+% functions read~|#6| until \cs{s_@@_stop} and place~|#6| back into the
% input stream. When the lists |#1| and~|#2| are empty, the
% \texttt{single} auxiliary simply places the continuation~|#5| before
% the pivot~|{#3}|. When |#2|~is empty, |#1|~is sorted and placed
@@ -976,30 +984,30 @@
% continuations are done in such a way to place the pivot in between.
% \begin{macrocode}
\cs_new:Npn \@@_quick_end:nnTFNn #1#2#3#4#5#6 {#5}
-\cs_new:Npn \@@_quick_single_end:nnnwnw #1#2#3#4 \q_mark #5#6 \q_stop
- { #5 {#3} #6 \q_stop }
-\cs_new:Npn \@@_quick_only_i_end:nnnwnw #1#2#3#4 \q_mark #5#6 \q_stop
+\cs_new:Npn \@@_quick_single_end:nnnwnw #1#2#3#4 \s_@@_mark #5#6 \s_@@_stop
+ { #5 {#3} #6 \s_@@_stop }
+\cs_new:Npn \@@_quick_only_i_end:nnnwnw #1#2#3#4 \s_@@_mark #5#6 \s_@@_stop
{
\@@_quick_split:NnNn #1
- \@@_quick_end:nnTFNn { } \q_mark {#5}
+ \@@_quick_end:nnTFNn { } \s_@@_mark {#5}
{#3}
- #6 \q_stop
+ #6 \s_@@_stop
}
-\cs_new:Npn \@@_quick_only_ii_end:nnnwnw #1#2#3#4 \q_mark #5#6 \q_stop
+\cs_new:Npn \@@_quick_only_ii_end:nnnwnw #1#2#3#4 \s_@@_mark #5#6 \s_@@_stop
{
\@@_quick_split:NnNn #2
- \@@_quick_end:nnTFNn { } \q_mark { #5 {#3} }
- #6 \q_stop
+ \@@_quick_end:nnTFNn { } \s_@@_mark { #5 {#3} }
+ #6 \s_@@_stop
}
-\cs_new:Npn \@@_quick_split_end:nnnwnw #1#2#3#4 \q_mark #5#6 \q_stop
+\cs_new:Npn \@@_quick_split_end:nnnwnw #1#2#3#4 \s_@@_mark #5#6 \s_@@_stop
{
- \@@_quick_split:NnNn #2 \@@_quick_end:nnTFNn { } \q_mark
+ \@@_quick_split:NnNn #2 \@@_quick_end:nnTFNn { } \s_@@_mark
{
\@@_quick_split:NnNn #1
- \@@_quick_end:nnTFNn { } \q_mark {#5}
+ \@@_quick_end:nnTFNn { } \s_@@_mark {#5}
{#3}
}
- #6 \q_stop
+ #6 \s_@@_stop
}
% \end{macrocode}
% \end{macro}
diff --git a/macros/latex/contrib/l3kernel/l3str-convert.dtx b/macros/latex/contrib/l3kernel/l3str-convert.dtx
index 9092f8fdbc..4620342091 100644
--- a/macros/latex/contrib/l3kernel/l3str-convert.dtx
+++ b/macros/latex/contrib/l3kernel/l3str-convert.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
@@ -286,6 +286,20 @@
% \end{macrocode}
% \end{variable}
%
+% \begin{variable}{\s_@@}
+% Internal scan marks.
+% \begin{macrocode}
+\scan_new:N \s_@@
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\q_@@_nil}
+% Internal quarks.
+% \begin{macrocode}
+\quark_new:N \q_@@_nil
+% \end{macrocode}
+% \end{variable}
+%
% \begin{variable}{\g_@@_alias_prop}
% To avoid needing one file per encoding/escaping alias, we keep track
% of those in a property list.
@@ -557,13 +571,13 @@
{
\exp_after:wN \@@_convert_gmap_internal_loop:Nww
\exp_after:wN #1
- \g_@@_result_tl \s__tl \q_stop \prg_break: \s__tl
+ \g_@@_result_tl \s_@@ \s_@@_stop \prg_break: \s_@@
\prg_break_point:
}
}
-\cs_new:Npn \@@_convert_gmap_internal_loop:Nww #1 #2 \s__tl #3 \s__tl
+\cs_new:Npn \@@_convert_gmap_internal_loop:Nww #1 #2 \s_@@ #3 \s_@@
{
- \use_none_delimit_by_q_stop:w #3 \q_stop
+ \@@_use_none_delimit_by_s_stop:w #3 \s_@@_stop
#1 {#3}
\@@_convert_gmap_internal_loop:Nww #1
}
@@ -626,7 +640,7 @@
% to a list of Unicode characters in an internal representation,
% with items of the form
% \begin{quote}
-% \meta{bytes} \cs{s__tl} \meta{Unicode code point} \cs{s__tl}
+% \meta{bytes} \cs{s_@@} \meta{Unicode code point} \cs{s_@@}
% \end{quote}
% where we have collected the \meta{bytes} which combined to form
% this particular Unicode character, and the \meta{Unicode code
@@ -679,12 +693,12 @@
#1
\tl_gset:Nx \g_@@_result_tl { \__kernel_str_to_other_fast:n {#4} }
\exp_after:wN \@@_convert:wwwnn
- \tl_to_str:n {#5} /// \q_stop
+ \tl_to_str:n {#5} /// \s_@@_stop
{ decode } { unescape }
\prg_do_nothing:
\@@_convert_decode_:
\exp_after:wN \@@_convert:wwwnn
- \tl_to_str:n {#6} /// \q_stop
+ \tl_to_str:n {#6} /// \s_@@_stop
{ encode } { escape }
\use_ii_i:nn
\@@_convert_encode_:
@@ -721,7 +735,7 @@
% was given, and only the encoding, |#1|, should be performed.
% \begin{macrocode}
\cs_new_protected:Npn \@@_convert:wwwnn
- #1 / #2 // #3 \q_stop #4#5
+ #1 / #2 // #3 \s_@@_stop #4#5
{
\@@_convert:nnn {enc} {#4} {#1}
\@@_convert:nnn {esc} {#5} {#2}
@@ -967,7 +981,7 @@
\cs_new_protected:Npn \@@_convert_decode_:
{ \@@_convert_gmap:N \@@_decode_native_char:N }
\cs_new:Npn \@@_decode_native_char:N #1
- { #1 \s__tl \int_value:w `#1 \s__tl }
+ { #1 \s_@@ \int_value:w `#1 \s_@@ }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -1039,7 +1053,7 @@
}
}
\cs_new:Npn \@@_decode_clist_char:n #1
- { #1 \s__tl \int_eval:n {#1} \s__tl }
+ { #1 \s_@@ \int_eval:n {#1} \s_@@ }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -1115,11 +1129,11 @@
\int_zero:N \l_@@_internal_int
\exp_last_unbraced:Nx \@@_decode_eight_bit_load:nn
{ \tl_use:c { c_@@_encoding_#1_tl } }
- { \q_stop \prg_break: } { }
+ { \s_@@_stop \prg_break: } { }
\prg_break_point:
\exp_last_unbraced:Nx \@@_decode_eight_bit_load_missing:n
{ \tl_use:c { c_@@_encoding_#1_missing_tl } }
- { \q_stop \prg_break: }
+ { \s_@@_stop \prg_break: }
\prg_break_point:
\flag_clear:n { str_error }
\@@_convert_gmap:N \@@_decode_eight_bit_char:N
@@ -1128,7 +1142,7 @@
}
\cs_new_protected:Npn \@@_decode_eight_bit_load:nn #1#2
{
- \use_none_delimit_by_q_stop:w #1 \q_stop
+ \@@_use_none_delimit_by_s_stop:w #1 \s_@@_stop
\tex_dimen:D "#1 = \l_@@_internal_int sp \scan_stop:
\tex_skip:D \l_@@_internal_int = "#1 sp \scan_stop:
\tex_toks:D \l_@@_internal_int \exp_after:wN { \int_value:w "#2 }
@@ -1137,7 +1151,7 @@
}
\cs_new_protected:Npn \@@_decode_eight_bit_load_missing:n #1
{
- \use_none_delimit_by_q_stop:w #1 \q_stop
+ \@@_use_none_delimit_by_s_stop:w #1 \s_@@_stop
\tex_dimen:D "#1 = \l_@@_internal_int sp \scan_stop:
\tex_skip:D \l_@@_internal_int = "#1 sp \scan_stop:
\tex_toks:D \l_@@_internal_int \exp_after:wN
@@ -1147,13 +1161,13 @@
}
\cs_new:Npn \@@_decode_eight_bit_char:N #1
{
- #1 \s__tl
+ #1 \s_@@
\if_int_compare:w \tex_dimen:D `#1 < \l_@@_internal_int
\if_int_compare:w \tex_skip:D \tex_dimen:D `#1 = `#1 \exp_stop_f:
\tex_the:D \tex_toks:D \tex_dimen:D
\fi:
\fi:
- \int_value:w `#1 \s__tl
+ \int_value:w `#1 \s_@@
}
% \end{macrocode}
% \end{macro}
@@ -1173,7 +1187,7 @@
\int_zero:N \l_@@_internal_int
\exp_last_unbraced:Nx \@@_encode_eight_bit_load:nn
{ \tl_use:c { c_@@_encoding_#1_tl } }
- { \q_stop \prg_break: } { }
+ { \s_@@_stop \prg_break: } { }
\prg_break_point:
\flag_clear:n { str_error }
\@@_convert_gmap_internal:N \@@_encode_eight_bit_char:n
@@ -1182,7 +1196,7 @@
}
\cs_new_protected:Npn \@@_encode_eight_bit_load:nn #1#2
{
- \use_none_delimit_by_q_stop:w #1 \q_stop
+ \@@_use_none_delimit_by_s_stop:w #1 \s_@@_stop
\tex_dimen:D "#2 = \l_@@_internal_int sp \scan_stop:
\tex_skip:D \l_@@_internal_int = "#2 sp \scan_stop:
\exp_args:NNf \tex_toks:D \l_@@_internal_int
@@ -1762,17 +1776,17 @@
{ 32 } { 192 }
{ 16 } { 224 }
{ 8 } { 240 }
- \q_stop
+ \s_@@_stop
}
-\cs_new:Npn \@@_encode_utf_viii_loop:wwnnw #1; #2; #3#4 #5 \q_stop
+\cs_new:Npn \@@_encode_utf_viii_loop:wwnnw #1; #2; #3#4 #5 \s_@@_stop
{
\if_int_compare:w #1 < #3 \exp_stop_f:
\@@_output_byte:n { #1 + #4 }
- \exp_after:wN \use_none_delimit_by_q_stop:w
+ \exp_after:wN \@@_use_none_delimit_by_s_stop:w
\fi:
\exp_after:wN \@@_encode_utf_viii_loop:wwnnw
\int_value:w \int_div_truncate:nn {#1} {64} ; #1 ;
- #5 \q_stop
+ #5 \s_@@_stop
\@@_output_byte:n { #2 - 64 * ( #1 - 2 ) }
}
% \end{macrocode}
@@ -1949,7 +1963,7 @@
{
#1
\if_int_compare:w `#1 < "C0 \exp_stop_f:
- \s__tl
+ \s_@@
\if_int_compare:w `#1 < "80 \exp_stop_f:
\int_value:w `#1
\else:
@@ -1961,12 +1975,12 @@
\exp_after:wN \@@_decode_utf_viii_continuation:wwN
\int_value:w \int_eval:n { `#1 - "C0 } \exp_after:wN
\fi:
- \s__tl
- \use_none_delimit_by_q_stop:w {"80} {"800} {"10000} {"110000} \q_stop
+ \s_@@
+ \@@_use_none_delimit_by_s_stop:w {"80} {"800} {"10000} {"110000} \s_@@_stop
\@@_decode_utf_viii_start:N
}
\cs_new:Npn \@@_decode_utf_viii_continuation:wwN
- #1 \s__tl #2 \@@_decode_utf_viii_start:N #3
+ #1 \s_@@ #2 \@@_decode_utf_viii_start:N #3
{
\use_none:n #3
\if_int_compare:w `#3 <
@@ -1976,20 +1990,20 @@
\exp_after:wN \@@_decode_utf_viii_aux:wNnnwN
\int_value:w \int_eval:n { #1 * "40 + `#3 - "80 } \exp_after:wN
\else:
- \s__tl
+ \s_@@
\flag_raise:n { str_missing }
\flag_raise:n { str_error }
\int_use:N \c_@@_replacement_char_int
\fi:
- \s__tl
+ \s_@@
#2
\@@_decode_utf_viii_start:N #3
}
\cs_new:Npn \@@_decode_utf_viii_aux:wNnnwN
- #1 \s__tl #2#3#4 #5 \@@_decode_utf_viii_start:N #6
+ #1 \s_@@ #2#3#4 #5 \@@_decode_utf_viii_start:N #6
{
\if_int_compare:w #1 < #4 \exp_stop_f:
- \s__tl
+ \s_@@
\if_int_compare:w #1 < #3 \exp_stop_f:
\flag_raise:n { str_overlong }
\flag_raise:n { str_error }
@@ -1998,13 +2012,13 @@
#1
\fi:
\else:
- \if_meaning:w \q_stop #5
+ \if_meaning:w \s_@@_stop #5
\@@_decode_utf_viii_overflow:w #1
\fi:
\exp_after:wN \@@_decode_utf_viii_continuation:wwN
\int_value:w \int_eval:n { #1 - #4 } \exp_after:wN
\fi:
- \s__tl
+ \s_@@
#2 {#4} #5
\@@_decode_utf_viii_start:N
}
@@ -2017,10 +2031,10 @@
}
\cs_new:Npn \@@_decode_utf_viii_end:
{
- \s__tl
+ \s_@@
\flag_raise:n { str_missing }
\flag_raise:n { str_error }
- \int_use:N \c_@@_replacement_char_int \s__tl
+ \int_use:N \c_@@_replacement_char_int \s_@@
\prg_break:
}
% \end{macrocode}
@@ -2192,7 +2206,7 @@
% big-endianness. The three endianness cases are based on a common
% auxiliary whose first argument is $1$ for big-endian and $2$ for
% little-endian, and whose second argument, delimited by the scan mark
-% \cs{s_stop}, is expanded once (the string may be long; passing
+% \cs{s_@@_stop}, is expanded once (the string may be long; passing
% \cs{g_@@_result_tl} as an argument before expansion is cheaper).
%
% The \cs{@@_decode_utf_xvi:Nw} function defines \cs{@@_tmp:w} to
@@ -2202,13 +2216,13 @@
% \cs{@@_decode_utf_xvi_pair:NN} described below.
% \begin{macrocode}
\cs_new_protected:cpn { @@_convert_decode_utf16be: }
- { \@@_decode_utf_xvi:Nw 1 \g_@@_result_tl \s_stop }
+ { \@@_decode_utf_xvi:Nw 1 \g_@@_result_tl \s_@@_stop }
\cs_new_protected:cpn { @@_convert_decode_utf16le: }
- { \@@_decode_utf_xvi:Nw 2 \g_@@_result_tl \s_stop }
+ { \@@_decode_utf_xvi:Nw 2 \g_@@_result_tl \s_@@_stop }
\cs_new_protected:cpn { @@_convert_decode_utf16: }
{
\exp_after:wN \@@_decode_utf_xvi_bom:NN
- \g_@@_result_tl \s_stop \s_stop \s_stop
+ \g_@@_result_tl \s_@@_stop \s_@@_stop \s_@@_stop
}
\cs_new_protected:Npn \@@_decode_utf_xvi_bom:NN #1#2
{
@@ -2220,7 +2234,7 @@
{ \@@_decode_utf_xvi:Nw 1 #1#2 }
}
}
- \cs_new_protected:Npn \@@_decode_utf_xvi:Nw #1#2 \s_stop
+ \cs_new_protected:Npn \@@_decode_utf_xvi:Nw #1#2 \s_@@_stop
{
\flag_clear:n { str_error }
\flag_clear:n { str_missing }
@@ -2230,7 +2244,7 @@
\tl_gset:Nx \g_@@_result_tl
{
\exp_after:wN \@@_decode_utf_xvi_pair:NN
- #2 \q_nil \q_nil
+ #2 \q_@@_nil \q_@@_nil
\prg_break_point:
}
\@@_if_flag_error:nnx { str_error } { utf16-decode } { }
@@ -2271,8 +2285,8 @@
% range $[\hexnum{DC}, \hexnum{DF}]$ (trail surrogate). The test is
% similar to the test used for continuation bytes in the
% \textsc{utf-8} decoding functions. In the case where |#4#5| is
-% indeed a trail surrogate, leave |#1#2#4#5| \cs{s__tl}
-% \meta{code~point} \cs{s__tl}, and remove the pair |#4#5| before
+% indeed a trail surrogate, leave |#1#2#4#5| \cs{s_@@}
+% \meta{code~point} \cs{s_@@}, and remove the pair |#4#5| before
% looping with \cs{@@_decode_utf_xvi_pair:NN}. Otherwise, of course,
% complain about the missing surrogate.
%
@@ -2281,13 +2295,13 @@
% \hexnum{DC00} - \hexnum{10000}$.
%
% Every time we read a pair of bytes, we test for the end-marker
-% \cs{q_nil}. When reaching the end, we additionally check that the
+% \cs{q_@@_nil}. When reaching the end, we additionally check that the
% string had an even length. Also, if the end is reached when
% expecting a trail surrogate, we treat that as a missing surrogate.
% \begin{macrocode}
\cs_new:Npn \@@_decode_utf_xvi_pair:NN #1#2
{
- \if_meaning:w \q_nil #2
+ \if_meaning:w \q_@@_nil #2
\@@_decode_utf_xvi_pair_end:Nw #1
\fi:
\if_case:w
@@ -2295,14 +2309,14 @@
\or: \exp_after:wN \@@_decode_utf_xvi_quad:NNwNN
\or: \exp_after:wN \@@_decode_utf_xvi_extra:NNw
\fi:
- #1#2 \s__tl
- \int_eval:n { "100 * \@@_tmp:w #1#2 + \@@_tmp:w #2#1 } \s__tl
+ #1#2 \s_@@
+ \int_eval:n { "100 * \@@_tmp:w #1#2 + \@@_tmp:w #2#1 } \s_@@
\@@_decode_utf_xvi_pair:NN
}
\cs_new:Npn \@@_decode_utf_xvi_quad:NNwNN
#1#2 #3 \@@_decode_utf_xvi_pair:NN #4#5
{
- \if_meaning:w \q_nil #5
+ \if_meaning:w \q_@@_nil #5
\@@_decode_utf_xvi_error:nNN { missing } #1#2
\@@_decode_utf_xvi_pair_end:Nw #4
\fi:
@@ -2313,13 +2327,13 @@
\@@_tmp:w #4#5 < "E0
\fi:
\exp_stop_f:
- #1 #2 #4 #5 \s__tl
+ #1 #2 #4 #5 \s_@@
\int_eval:n
{
( "100 * \@@_tmp:w #1#2 + \@@_tmp:w #2#1 - "D7F7 ) * "400
+ "100 * \@@_tmp:w #4#5 + \@@_tmp:w #5#4
}
- \s__tl
+ \s_@@
\exp_after:wN \use_i:nnn
\else:
\@@_decode_utf_xvi_error:nNN { missing } #1#2
@@ -2329,20 +2343,20 @@
\cs_new:Npn \@@_decode_utf_xvi_pair_end:Nw #1 \fi:
{
\fi:
- \if_meaning:w \q_nil #1
+ \if_meaning:w \q_@@_nil #1
\else:
\@@_decode_utf_xvi_error:nNN { end } #1 \prg_do_nothing:
\fi:
\prg_break:
}
- \cs_new:Npn \@@_decode_utf_xvi_extra:NNw #1#2 \s__tl #3 \s__tl
+ \cs_new:Npn \@@_decode_utf_xvi_extra:NNw #1#2 \s_@@ #3 \s_@@
{ \@@_decode_utf_xvi_error:nNN { extra } #1#2 }
\cs_new:Npn \@@_decode_utf_xvi_error:nNN #1#2#3
{
\flag_raise:n { str_error }
\flag_raise:n { str_#1 }
- #2 #3 \s__tl
- \int_use:N \c_@@_replacement_char_int \s__tl
+ #2 #3 \s_@@
+ \int_use:N \c_@@_replacement_char_int \s_@@
}
% \end{macrocode}
% \end{macro}
@@ -2470,7 +2484,7 @@
%
% The structure is similar to \textsc{utf-16} decoding functions. If
% the endianness is not given, test the first $4$ bytes of the string
-% (possibly \cs{s_stop} if the string is too short) for the presence
+% (possibly \cs{s_@@_stop} if the string is too short) for the presence
% of a byte-order mark. If there is a byte-order mark, use that
% endianness, and remove the $4$ bytes, otherwise default to
% big-endian, and leave the $4$ bytes in place. The
@@ -2482,22 +2496,22 @@
% inside an \texttt{x}-expanding assignment to \cs{g_@@_result_tl}.
%
% The \texttt{_loop} auxiliary first checks for the end-of-string
-% marker \cs{s_stop}, calling the \texttt{_end} auxiliary if
-% appropriate. Otherwise, leave the \meta{4~bytes} \cs{s__tl} behind,
+% marker \cs{s_@@_stop}, calling the \texttt{_end} auxiliary if
+% appropriate. Otherwise, leave the \meta{4~bytes} \cs{s_@@} behind,
% then check that the code point is not overflowing: the leading byte
% must be $0$, and the following byte at most $16$.
%
% In the ending code, we check that there remains no byte: there
-% should be nothing left until the first \cs{s_stop}. Break the map.
+% should be nothing left until the first \cs{s_@@_stop}. Break the map.
% \begin{macrocode}
\cs_new_protected:cpn { @@_convert_decode_utf32be: }
- { \@@_decode_utf_xxxii:Nw 1 \g_@@_result_tl \s_stop }
+ { \@@_decode_utf_xxxii:Nw 1 \g_@@_result_tl \s_@@_stop }
\cs_new_protected:cpn { @@_convert_decode_utf32le: }
- { \@@_decode_utf_xxxii:Nw 2 \g_@@_result_tl \s_stop }
+ { \@@_decode_utf_xxxii:Nw 2 \g_@@_result_tl \s_@@_stop }
\cs_new_protected:cpn { @@_convert_decode_utf32: }
{
\exp_after:wN \@@_decode_utf_xxxii_bom:NNNN \g_@@_result_tl
- \s_stop \s_stop \s_stop \s_stop \s_stop
+ \s_@@_stop \s_@@_stop \s_@@_stop \s_@@_stop \s_@@_stop
}
\cs_new_protected:Npn \@@_decode_utf_xxxii_bom:NNNN #1#2#3#4
{
@@ -2509,7 +2523,7 @@
{ \@@_decode_utf_xxxii:Nw 1 #1#2#3#4 }
}
}
- \cs_new_protected:Npn \@@_decode_utf_xxxii:Nw #1#2 \s_stop
+ \cs_new_protected:Npn \@@_decode_utf_xxxii:Nw #1#2 \s_@@_stop
{
\flag_clear:n { str_overflow }
\flag_clear:n { str_end }
@@ -2518,17 +2532,17 @@
\tl_gset:Nx \g_@@_result_tl
{
\exp_after:wN \@@_decode_utf_xxxii_loop:NNNN
- #2 \s_stop \s_stop \s_stop \s_stop
+ #2 \s_@@_stop \s_@@_stop \s_@@_stop \s_@@_stop
\prg_break_point:
}
\@@_if_flag_error:nnx { str_error } { utf32-decode } { }
}
\cs_new:Npn \@@_decode_utf_xxxii_loop:NNNN #1#2#3#4
{
- \if_meaning:w \s_stop #4
+ \if_meaning:w \s_@@_stop #4
\exp_after:wN \@@_decode_utf_xxxii_end:w
\fi:
- #1#2#3#4 \s__tl
+ #1#2#3#4 \s_@@
\if_int_compare:w \@@_tmp:w #1#4 > 0 \exp_stop_f:
\flag_raise:n { str_overflow }
\flag_raise:n { str_error }
@@ -2543,17 +2557,17 @@
{ \@@_tmp:w #2#3*"10000 + \@@_tmp:w #3#2*"100 + \@@_tmp:w #4#1 }
\fi:
\fi:
- \s__tl
+ \s_@@
\@@_decode_utf_xxxii_loop:NNNN
}
- \cs_new:Npn \@@_decode_utf_xxxii_end:w #1 \s_stop
+ \cs_new:Npn \@@_decode_utf_xxxii_end:w #1 \s_@@_stop
{
\tl_if_empty:nF {#1}
{
\flag_raise:n { str_end }
\flag_raise:n { str_error }
- #1 \s__tl
- \int_use:N \c_@@_replacement_char_int \s__tl
+ #1 \s_@@
+ \int_use:N \c_@@_replacement_char_int \s_@@
}
\prg_break:
}
diff --git a/macros/latex/contrib/l3kernel/l3str.dtx b/macros/latex/contrib/l3kernel/l3str.dtx
index 66909707c0..d4cbc2bb49 100644
--- a/macros/latex/contrib/l3kernel/l3str.dtx
+++ b/macros/latex/contrib/l3kernel/l3str.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
@@ -862,6 +862,46 @@
%<@@=str>
% \end{macrocode}
%
+% \subsection{Internal auxiliaries}
+%
+% \begin{variable}{\s_@@_mark,\s_@@_stop}
+% Internal scan marks.
+% \begin{macrocode}
+\scan_new:N \s_@@_mark
+\scan_new:N \s_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP]{
+% \@@_use_none_delimit_by_s_stop:w,
+% \@@_use_i_delimit_by_s_stop:nw
+% }
+% Functions to gobble up to a scan mark.
+% \begin{macrocode}
+\cs_new:Npn \@@_use_none_delimit_by_s_stop:w #1 \s_@@_stop { }
+\cs_new:Npn \@@_use_i_delimit_by_s_stop:nw #1 #2 \s_@@_stop {#1}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{variable}{\q_@@_recursion_tail,\q_@@_recursion_stop}
+% Internal recursion quarks.
+% \begin{macrocode}
+\quark_new:N \q_@@_recursion_tail
+\quark_new:N \q_@@_recursion_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP]{
+% \@@_if_recursion_tail_break:NN,
+% \@@_if_recursion_tail_stop_do:Nn
+% }
+% Functions to query recursion quarks.
+% \begin{macrocode}
+\__kernel_quark_new_test:N \@@_if_recursion_tail_break:NN
+\__kernel_quark_new_test:N \@@_if_recursion_tail_stop_do:Nn
+% \end{macrocode}
+% \end{macro}
+%
% \subsection{Creating and setting string variables}
%
% \begin{macro}
@@ -978,7 +1018,7 @@
% issues if we are fed a token list variable. Then the code is a much
% simplified version of the token list code because neither the
% delimiter nor the replacement can contain macro parameters or
-% braces. The delimiter \cs{q_mark} cannot appear in the string to
+% braces. The delimiter \cs{s_@@_mark} cannot appear in the string to
% edit so it is used in all cases. Some |x|-expansion is unnecessary.
% There is no need to avoid losing braces nor to protect against
% expansion. The ending code is much simplified and does not need to
@@ -1018,9 +1058,9 @@
{
\@@_replace_next:w
#4
- \use_none_delimit_by_q_stop:w
+ \@@_use_none_delimit_by_s_stop:w
#5
- \q_stop
+ \s_@@_stop
}
}
\cs_new_eq:NN \@@_replace_next:w ?
@@ -1214,7 +1254,7 @@
\@@_case:nnTF {#1} {#2}
}
\cs_new:Npn \@@_case:nnTF #1#2#3#4
- { \@@_case:nw {#1} #2 {#1} { } \q_mark {#3} \q_mark {#4} \q_stop }
+ { \@@_case:nw {#1} #2 {#1} { } \s_@@_mark {#3} \s_@@_mark {#4} \s_@@_stop }
\cs_generate_variant:Nn \str_case:nn { V , o , nV , nv }
\prg_generate_conditional_variant:Nnn \str_case:nn
{ V , o , nV , nv } { T , F , TF }
@@ -1245,14 +1285,14 @@
\@@_case_e:nnTF {#1} {#2}
}
\cs_new:Npn \@@_case_e:nnTF #1#2#3#4
- { \@@_case_e:nw {#1} #2 {#1} { } \q_mark {#3} \q_mark {#4} \q_stop }
+ { \@@_case_e:nw {#1} #2 {#1} { } \s_@@_mark {#3} \s_@@_mark {#4} \s_@@_stop }
\cs_new:Npn \@@_case_e:nw #1#2#3
{
\str_if_eq:eeTF {#1} {#2}
{ \@@_case_end:nw {#3} }
{ \@@_case_e:nw {#1} }
}
-\cs_new:Npn \@@_case_end:nw #1#2#3 \q_mark #4#5 \q_stop
+\cs_new:Npn \@@_case_end:nw #1#2#3 \s_@@_mark #4#5 \s_@@_stop
{ \exp_end: #1 #4 }
% \end{macrocode}
% \end{macro}
@@ -1280,12 +1320,12 @@
% These are received by \cs{@@_map_function:Nn}, which passes
% the space to |#1| and calls \cs{@@_map_function:w} to deal with the
% next space. The space before the braced space allows to optimize
-% the \cs{q_recursion_tail} test. Of course we need to include a
+% the \cs{q_@@_recursion_tail} test. Of course we need to include a
% trailing space (the question mark is needed to avoid losing the
% space when \TeX{} tokenizes the line).
% At the cost of about three more auxiliaries this code could get a $9$
% times speed up by testing only every $9$-th character for whether it
-% is \cs{q_recursion_tail} (also by converting $9$ spaces at a time in
+% is \cs{q_@@_recursion_tail} (also by converting $9$ spaces at a time in
% the \cs{str_map_function:nN} case).
%
% For the \texttt{map_variable} functions we use a string assignment
@@ -1297,7 +1337,7 @@
\exp_after:wN \@@_map_function:w
\exp_after:wN \@@_map_function:Nn \exp_after:wN #2
\__kernel_tl_to_str:w {#1}
- \q_recursion_tail ? ~
+ \q_@@_recursion_tail ? ~
\prg_break_point:Nn \str_map_break: { }
}
\cs_new:Npn \str_map_function:NN
@@ -1306,7 +1346,7 @@
{ #1 { ~ { ~ } \@@_map_function:w } }
\cs_new:Npn \@@_map_function:Nn #1#2
{
- \if_meaning:w \q_recursion_tail #2
+ \if_meaning:w \q_@@_recursion_tail #2
\exp_after:wN \str_map_break:
\fi:
#1 #2 \@@_map_function:Nn #1
@@ -1323,7 +1363,7 @@
\exp_not:c { @@_map_ \int_use:N \g__kernel_prg_map_int :w }
\__kernel_str_to_other_fast:n {#1}
}
- \q_recursion_tail
+ \q_@@_recursion_tail
\prg_break_point:Nn \str_map_break:
{ \int_gdecr:N \g__kernel_prg_map_int }
}
@@ -1332,7 +1372,7 @@
\cs_generate_variant:Nn \str_map_inline:Nn { c }
\cs_new:Npn \@@_map_inline:NN #1#2
{
- \quark_if_recursion_tail_break:NN #2 \str_map_break:
+ \@@_if_recursion_tail_break:NN #2 \str_map_break:
\exp_args:No #1 { \token_to_str:N #2 }
\@@_map_inline:NN #1
}
@@ -1343,14 +1383,14 @@
\exp_not:n { \@@_map_variable:NnN #2 {#3} }
\__kernel_str_to_other_fast:n {#1}
}
- \q_recursion_tail
+ \q_@@_recursion_tail
\prg_break_point:Nn \str_map_break: { }
}
\cs_new_protected:Npn \str_map_variable:NNn
{ \exp_args:No \str_map_variable:nNn }
\cs_new_protected:Npn \@@_map_variable:NnN #1#2#3
{
- \quark_if_recursion_tail_break:NN #3 \str_map_break:
+ \@@_if_recursion_tail_break:NN #3 \str_map_break:
\str_set:Nn #1 {#3}
\use:n {#2}
\@@_map_variable:NnN #1 {#2}
@@ -1378,17 +1418,17 @@
% \begin{macro}[EXP]{\@@_to_other_loop:w, \@@_to_other_end:w}
% First apply \cs{tl_to_str:n}, then replace all spaces by
% \enquote{other} spaces, $8$ at a time, storing the converted part of
-% the string between the \cs{q_mark} and \cs{q_stop} markers. The end
+% the string between the \cs{s_@@_mark} and \cs{s_@@_stop} markers. The end
% is detected when \cs{@@_to_other_loop:w} finds one of the trailing
% |A|, distinguished from any contents of the initial token list by
% their category. Then \cs{@@_to_other_end:w} is called, and finds
-% the result between \cs{q_mark} and the first |A| (well, there is
+% the result between \cs{s_@@_mark} and the first |A| (well, there is
% also the need to remove a space).
% \begin{macrocode}
\cs_new:Npn \__kernel_str_to_other:n #1
{
\exp_after:wN \@@_to_other_loop:w
- \tl_to_str:n {#1} ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ \q_mark \q_stop
+ \tl_to_str:n {#1} ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ \s_@@_mark \s_@@_stop
}
\group_begin:
\tex_lccode:D `\* = `\ %
@@ -1397,15 +1437,15 @@
{
\group_end:
\cs_new:Npn \@@_to_other_loop:w
- #1 ~ #2 ~ #3 ~ #4 ~ #5 ~ #6 ~ #7 ~ #8 ~ #9 \q_stop
+ #1 ~ #2 ~ #3 ~ #4 ~ #5 ~ #6 ~ #7 ~ #8 ~ #9 \s_@@_stop
{
\if_meaning:w A #8
\@@_to_other_end:w
\fi:
\@@_to_other_loop:w
- #9 #1 * #2 * #3 * #4 * #5 * #6 * #7 * #8 * \q_stop
+ #9 #1 * #2 * #3 * #4 * #5 * #6 * #7 * #8 * \s_@@_stop
}
- \cs_new:Npn \@@_to_other_end:w \fi: #1 \q_mark #2 * A #3 \q_stop
+ \cs_new:Npn \@@_to_other_end:w \fi: #1 \s_@@_mark #2 * A #3 \s_@@_stop
{ \fi: #2 }
}
% \end{macrocode}
@@ -1421,7 +1461,7 @@
\cs_new:Npn \__kernel_str_to_other_fast:n #1
{
\exp_after:wN \@@_to_other_fast_loop:w \tl_to_str:n {#1} ~
- A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ \q_stop
+ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ \s_@@_stop
}
\group_begin:
\tex_lccode:D `\* = `\ %
@@ -1438,7 +1478,7 @@
#1 * #2 * #3 * #4 * #5 * #6 * #7 * #8 * #9
\@@_to_other_fast_loop:w *
}
- \cs_new:Npn \@@_to_other_fast_end:w #1 * A #2 \q_stop {#1}
+ \cs_new:Npn \@@_to_other_fast_end:w #1 * A #2 \s_@@_stop {#1}
}
% \end{macrocode}
% \end{macro}
@@ -1481,25 +1521,25 @@
\exp_after:wN \@@_item:w
\int_value:w \int_eval:n {#2} \exp_after:wN ;
\int_value:w \@@_count:n {#1} ;
- #1 \q_stop
+ #1 \s_@@_stop
}
\cs_new:Npn \@@_item:w #1; #2;
{
\int_compare:nNnTF {#1} < 0
{
\int_compare:nNnTF {#1} < {-#2}
- { \use_none_delimit_by_q_stop:w }
+ { \@@_use_none_delimit_by_s_stop:w }
{
- \exp_after:wN \use_i_delimit_by_q_stop:nw
+ \exp_after:wN \@@_use_i_delimit_by_s_stop:nw
\exp:w \exp_after:wN \@@_skip_exp_end:w
\int_value:w \int_eval:n { #1 + #2 } ;
}
}
{
\int_compare:nNnTF {#1} > {#2}
- { \use_none_delimit_by_q_stop:w }
+ { \@@_use_none_delimit_by_s_stop:w }
{
- \exp_after:wN \use_i_delimit_by_q_stop:nw
+ \exp_after:wN \@@_use_i_delimit_by_s_stop:nw
\exp:w \@@_skip_exp_end:w #1 ; { }
}
}
@@ -1581,7 +1621,7 @@
\int_value:w \@@_count:n {#1} \exp_after:wN ;
\int_value:w \int_eval:n { (#2) - 1 } \exp_after:wN ;
\int_value:w \int_eval:n {#3} ;
- #1 \q_stop
+ #1 \s_@@_stop
}
\cs_new:Npn \@@_range:w #1; #2; #3;
{
@@ -1635,7 +1675,7 @@
% \@@_collect_end:wn, \@@_collect_end:nnnnnnnnw
% }
% Collects |max(#1,0)| characters, and removes everything else until
-% \cs{q_stop}. This is somewhat similar to \cs{@@_skip_exp_end:w}, but
+% \cs{s_@@_stop}. This is somewhat similar to \cs{@@_skip_exp_end:w}, but
% accepts integer expression arguments. This time we can only grab
% $7$ characters at a time. At the end, we use an \cs{if_case:w}
% trick again, so that the $8$ first arguments of
@@ -1668,7 +1708,7 @@
#1 \else: 0 \fi: \exp_stop_f:
\or: \or: \or: \or: \or: \or: \fi:
}
-\cs_new:Npn \@@_collect_end:nnnnnnnnw #1#2#3#4#5#6#7#8 #9 \q_stop
+\cs_new:Npn \@@_collect_end:nnnnnnnnw #1#2#3#4#5#6#7#8 #9 \s_@@_stop
{ #1#2#3#4#5#6#7#8 }
% \end{macrocode}
% \end{macro}
@@ -1695,13 +1735,13 @@
\exp_after:wN \@@_count_spaces_loop:w
\tl_to_str:n {#1} ~
X 7 ~ X 6 ~ X 5 ~ X 4 ~ X 3 ~ X 2 ~ X 1 ~ X 0 ~ X -1 ~
- \q_stop
+ \s_@@_stop
}
}
\cs_new:Npn \@@_count_spaces_loop:w #1~#2~#3~#4~#5~#6~#7~#8~#9~
{
\if_meaning:w X #9
- \use_i_delimit_by_q_stop:nw
+ \@@_use_i_delimit_by_s_stop:nw
\fi:
9 + \@@_count_spaces_loop:w
}
@@ -1755,13 +1795,13 @@
{ X 8 } { X 7 } { X 6 }
{ X 5 } { X 4 } { X 3 }
{ X 2 } { X 1 } { X 0 }
- \q_stop
+ \s_@@_stop
}
}
\cs_new:Npn \@@_count_loop:NNNNNNNNN #1#2#3#4#5#6#7#8#9
{
\if_meaning:w X #9
- \exp_after:wN \use_none_delimit_by_q_stop:w
+ \exp_after:wN \@@_use_none_delimit_by_s_stop:w
\fi:
9 + \@@_count_loop:NNNNNNNNN
}
@@ -1781,14 +1821,14 @@
% hands it to \cs{str_head:n}. To circumvent the fact that \TeX{}
% skips spaces when grabbing undelimited macro parameters,
% \cs{@@_head:w} takes an argument delimited by a space. If |#1|
-% starts with a non-space character, \cs{use_i_delimit_by_q_stop:nw}
+% starts with a non-space character, \cs{@@_use_i_delimit_by_s_stop:nw}
% leaves that in the input stream. On the other hand, if |#1| starts
% with a space, the \cs{@@_head:w} takes an empty argument, and the
% single (initially braced) space in the definition of \cs{@@_head:w}
% makes its way to the output. Finally, for an empty argument, the
% (braced) empty brace group in the definition of \cs{str_head:n}
% gives an empty result after passing through
-% \cs{use_i_delimit_by_q_stop:nw}.
+% \cs{@@_use_i_delimit_by_s_stop:nw}.
% \begin{macrocode}
\cs_new:Npn \str_head:N { \exp_args:No \str_head:n }
\cs_generate_variant:Nn \str_head:N { c }
@@ -1796,14 +1836,14 @@
{
\exp_after:wN \@@_head:w
\tl_to_str:n {#1}
- { { } } ~ \q_stop
+ { { } } ~ \s_@@_stop
}
\cs_new:Npn \@@_head:w #1 ~ %
- { \use_i_delimit_by_q_stop:nw #1 { ~ } }
+ { \@@_use_i_delimit_by_s_stop:nw #1 { ~ } }
\cs_new:Npn \str_head_ignore_spaces:n #1
{
- \exp_after:wN \use_i_delimit_by_q_stop:nw
- \tl_to_str:n {#1} { } \q_stop
+ \exp_after:wN \@@_use_i_delimit_by_s_stop:nw
+ \tl_to_str:n {#1} { } \s_@@_stop
}
% \end{macrocode}
% \end{macro}
@@ -1823,7 +1863,7 @@
% end-marker |X| be unexpandable and not a control sequence). The
% \texttt{_ignore_spaces} is rather simpler: after converting the
% input to a string, \cs{@@_tail_auxii:w} removes one undelimited
-% argument and leaves everything else until an end-marker \cs{q_mark}.
+% argument and leaves everything else until an end-marker \cs{s_@@_mark}.
% One can check that an empty (or blank) string yields an empty
% tail.
% \begin{macrocode}
@@ -1833,15 +1873,15 @@
{
\exp_after:wN \@@_tail_auxi:w
\reverse_if:N \if_charcode:w
- \scan_stop: \tl_to_str:n {#1} X X \q_stop
+ \scan_stop: \tl_to_str:n {#1} X X \s_@@_stop
}
-\cs_new:Npn \@@_tail_auxi:w #1 X #2 \q_stop { \fi: #1 }
+\cs_new:Npn \@@_tail_auxi:w #1 X #2 \s_@@_stop { \fi: #1 }
\cs_new:Npn \str_tail_ignore_spaces:n #1
{
\exp_after:wN \@@_tail_auxii:w
- \tl_to_str:n {#1} \q_mark \q_mark \q_stop
+ \tl_to_str:n {#1} \s_@@_mark \s_@@_mark \s_@@_stop
}
-\cs_new:Npn \@@_tail_auxii:w #1 #2 \q_mark #3 \q_stop { #2 }
+\cs_new:Npn \@@_tail_auxii:w #1 #2 \s_@@_mark #3 \s_@@_stop { #2 }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -1880,7 +1920,7 @@
}
\cs_new:Npn \@@_change_case_aux:nn #1#2
{
- \@@_change_case_loop:nw {#2} #1 \q_recursion_tail \q_recursion_stop
+ \@@_change_case_loop:nw {#2} #1 \q_@@_recursion_tail \q_@@_recursion_stop
\@@_change_case_result:n { }
}
\cs_new:Npn \@@_change_case_output:nw #1#2 \@@_change_case_result:n #3
@@ -1888,12 +1928,12 @@
\cs_generate_variant:Nn \@@_change_case_output:nw { f }
\cs_new:Npn \@@_change_case_end:wn #1 \@@_change_case_result:n #2
{ \tl_to_str:n {#2} }
-\cs_new:Npn \@@_change_case_loop:nw #1#2 \q_recursion_stop
+\cs_new:Npn \@@_change_case_loop:nw #1#2 \q_@@_recursion_stop
{
\tl_if_head_is_space:nTF {#2}
{ \@@_change_case_space:n }
{ \@@_change_case_char:nN }
- {#1} #2 \q_recursion_stop
+ {#1} #2 \q_@@_recursion_stop
}
\exp_last_unbraced:NNNNo
\cs_new:Npn \@@_change_case_space:n #1 \c_space_tl
@@ -1903,7 +1943,7 @@
}
\cs_new:Npn \@@_change_case_char:nN #1#2
{
- \quark_if_recursion_tail_stop_do:Nn #2
+ \@@_if_recursion_tail_stop_do:Nn #2
{ \@@_change_case_end:wn }
\@@_change_case_output:fw
{ \use:c { char_str_ #1 case:N } #2 }
diff --git a/macros/latex/contrib/l3kernel/l3styleguide.pdf b/macros/latex/contrib/l3kernel/l3styleguide.pdf
index ecd36e76ee..eb0878701d 100644
--- a/macros/latex/contrib/l3kernel/l3styleguide.pdf
+++ b/macros/latex/contrib/l3kernel/l3styleguide.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3styleguide.tex b/macros/latex/contrib/l3kernel/l3styleguide.tex
index 1896458840..16d5983a04 100644
--- a/macros/latex/contrib/l3kernel/l3styleguide.tex
+++ b/macros/latex/contrib/l3kernel/l3styleguide.tex
@@ -32,7 +32,7 @@ The released version of this bundle is available from CTAN.
{latex-team@latex-project.org}%
}%
}
-\date{Released 2020-05-05}
+\date{Released 2020-05-11}
\begin{document}
diff --git a/macros/latex/contrib/l3kernel/l3syntax-changes.pdf b/macros/latex/contrib/l3kernel/l3syntax-changes.pdf
index 37dd80b173..44c75ca2e3 100644
--- a/macros/latex/contrib/l3kernel/l3syntax-changes.pdf
+++ b/macros/latex/contrib/l3kernel/l3syntax-changes.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3syntax-changes.tex b/macros/latex/contrib/l3kernel/l3syntax-changes.tex
index e1aa7562c0..0bc6adc9ac 100644
--- a/macros/latex/contrib/l3kernel/l3syntax-changes.tex
+++ b/macros/latex/contrib/l3kernel/l3syntax-changes.tex
@@ -32,7 +32,7 @@ The released version of this bundle is available from CTAN.
{latex-team@latex-project.org}%
}%
}
-\date{Released 2020-05-05}
+\date{Released 2020-05-11}
\newcommand{\TF}{\textit{(TF)}}
diff --git a/macros/latex/contrib/l3kernel/l3sys.dtx b/macros/latex/contrib/l3kernel/l3sys.dtx
index 4b36af5e14..feef711735 100644
--- a/macros/latex/contrib/l3kernel/l3sys.dtx
+++ b/macros/latex/contrib/l3kernel/l3sys.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3term-glossary.pdf b/macros/latex/contrib/l3kernel/l3term-glossary.pdf
index 7955976684..974430a84b 100644
--- a/macros/latex/contrib/l3kernel/l3term-glossary.pdf
+++ b/macros/latex/contrib/l3kernel/l3term-glossary.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3term-glossary.tex b/macros/latex/contrib/l3kernel/l3term-glossary.tex
index 4d96050ff0..eab4b9053c 100644
--- a/macros/latex/contrib/l3kernel/l3term-glossary.tex
+++ b/macros/latex/contrib/l3kernel/l3term-glossary.tex
@@ -32,7 +32,7 @@ The released version of this bundle is available from CTAN.
{latex-team@latex-project.org}%
}%
}
-\date{Released 2020-05-05}
+\date{Released 2020-05-11}
\newcommand{\TF}{\textit{(TF)}}
diff --git a/macros/latex/contrib/l3kernel/l3text-case.dtx b/macros/latex/contrib/l3kernel/l3text-case.dtx
index 950635ec93..ad71e49319 100644
--- a/macros/latex/contrib/l3kernel/l3text-case.dtx
+++ b/macros/latex/contrib/l3kernel/l3text-case.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
@@ -207,7 +207,7 @@
{
\group_align_safe_begin:
\@@_change_case_loop:nnw {#2} {#3} #1
- \q_recursion_tail \q_recursion_stop
+ \q_@@_recursion_tail \q_@@_recursion_stop
\@@_change_case_result:n { }
}
% \end{macrocode}
@@ -227,7 +227,7 @@
% \end{macrocode}
% The main loop is the standard \texttt{tl action} type.
% \begin{macrocode}
-\cs_new:Npn \@@_change_case_loop:nnw #1#2#3 \q_recursion_stop
+\cs_new:Npn \@@_change_case_loop:nnw #1#2#3 \q_@@_recursion_stop
{
\tl_if_head_is_N_type:nTF {#3}
{ \@@_change_case_N_type:nnN }
@@ -236,9 +236,9 @@
{ \use:c { @@_change_case_group_ #1 :nnn } }
{ \@@_change_case_space:nnw }
}
- {#1} {#2} #3 \q_recursion_stop
+ {#1} {#2} #3 \q_@@_recursion_stop
}
-\cs_new:Npn \@@_change_case_break:w #1 \q_recursion_tail \q_recursion_stop
+\cs_new:Npn \@@_change_case_break:w #1 \q_@@_recursion_tail \q_@@_recursion_stop
{
\@@_change_case_store:n {#1}
\@@_change_case_end:w
@@ -309,7 +309,7 @@
% \begin{macrocode}
\cs_new:Npn \@@_change_case_N_type:nnN #1#2#3
{
- \quark_if_recursion_tail_stop_do:Nn #3
+ \@@_if_recursion_tail_stop_do:Nn #3
{ \@@_change_case_end:w }
\@@_change_case_N_type_aux:nnN {#1} {#2} #3
}
@@ -321,16 +321,16 @@
\cs_new:Npn \@@_change_case_N_type:nnnN #1#2#3#4
{
\@@_change_case_math_search:nnNNN {#2} {#3} #4 #1
- \q_recursion_tail \q_recursion_tail
- \q_recursion_stop
+ \q_@@_recursion_tail \q_@@_recursion_tail
+ \q_@@_recursion_stop
}
\cs_new:Npn \@@_change_case_math_search:nnNNN #1#2#3#4#5
{
- \quark_if_recursion_tail_stop_do:Nn #4
+ \@@_if_recursion_tail_stop_do:Nn #4
{ \@@_change_case_cs_check:nnN {#1} {#2} #3 }
\token_if_eq_meaning:NNTF #3 #4
{
- \use_i_delimit_by_q_recursion_stop:nw
+ \@@_use_i_delimit_by_q_recursion_stop:nw
{
\@@_change_case_store:n {#3}
\@@_change_case_math_loop:nnNw {#1} {#2} #5
@@ -338,7 +338,7 @@
}
{ \@@_change_case_math_search:nnNNN {#1} {#2} #3 }
}
-\cs_new:Npn \@@_change_case_math_loop:nnNw #1#2#3#4 \q_recursion_stop
+\cs_new:Npn \@@_change_case_math_loop:nnNw #1#2#3#4 \q_@@_recursion_stop
{
\tl_if_head_is_N_type:nTF {#4}
{ \@@_change_case_math_N_type:nnNN }
@@ -347,11 +347,11 @@
{ \@@_change_case_math_group:nnNn }
{ \@@_change_case_math_space:nnNw }
}
- {#1} {#2} #3 #4 \q_recursion_stop
+ {#1} {#2} #3 #4 \q_@@_recursion_stop
}
\cs_new:Npn \@@_change_case_math_N_type:nnNN #1#2#3#4
{
- \quark_if_recursion_tail_stop_do:Nn #4
+ \@@_if_recursion_tail_stop_do:Nn #4
{ \@@_change_case_end:w }
\@@_change_case_store:n {#4}
\token_if_eq_meaning:NNTF #4 #3
@@ -402,15 +402,15 @@
\cs_new:Npn \@@_change_case_exclude:nnnN #1#2#3#4
{
\@@_change_case_exclude:nnNN {#2} {#3} #4 #1
- \q_recursion_tail \q_recursion_stop
+ \q_@@_recursion_tail \q_@@_recursion_stop
}
\cs_new:Npn \@@_change_case_exclude:nnNN #1#2#3#4
{
- \quark_if_recursion_tail_stop_do:Nn #4
+ \@@_if_recursion_tail_stop_do:Nn #4
{ \use:c { @@_change_case_letterlike_ #1 :nnN } {#1} {#2} #3 }
\cs_if_eq:NNTF #3 #4
{
- \use_i_delimit_by_q_recursion_stop:nw
+ \@@_use_i_delimit_by_q_recursion_stop:nw
{ \@@_change_case_exclude:nnNn {#1} {#2} #3 }
}
{ \@@_change_case_exclude:nnNN {#1} {#2} #3 }
@@ -495,7 +495,7 @@
{ \@@_change_case_lower_sigma:nnNw {#2} {#3} #4 }
{ \@@_change_case_char:nnnN {#1} {#2} {#3} #4 }
}
- \cs_new:Npn \@@_change_case_lower_sigma:nnNw #1#2#3#4 \q_recursion_stop
+ \cs_new:Npn \@@_change_case_lower_sigma:nnNw #1#2#3#4 \q_@@_recursion_stop
{
\tl_if_head_is_N_type:nTF {#4}
{ \@@_change_case_lower_sigma:NnnN #3 }
@@ -504,7 +504,7 @@
{ \char_generate:nn { "03C2 } { \@@_char_catcode:N #3 } }
\@@_change_case_loop:nnw
}
- {#1} {#2} #4 \q_recursion_stop
+ {#1} {#2} #4 \q_@@_recursion_stop
}
\cs_new:Npn \@@_change_case_lower_sigma:NnnN #1#2#3#4
{
@@ -742,12 +742,12 @@
\@@_change_case_upper_el_loop:nnw {#2} {#3}
}
\cs_new:Npn \@@_change_case_upper_el_loop:nnw
- #1#2#3 \q_recursion_stop
+ #1#2#3 \q_@@_recursion_stop
{
\tl_if_head_is_N_type:nTF {#3}
{ \@@_change_case_upper_el:nnN }
{ \@@_change_case_loop:nnw }
- {#1} {#2} #3 \q_recursion_stop
+ {#1} {#2} #3 \q_@@_recursion_stop
}
% \end{macrocode}
% In addition to the Greek accents, we list three cases here where an
@@ -916,12 +916,12 @@
\@@_change_case_lower_lt:nnw {#2} {#3}
}
}
- \cs_new:Npn \@@_change_case_lower_lt:nnw #1#2#3 \q_recursion_stop
+ \cs_new:Npn \@@_change_case_lower_lt:nnw #1#2#3 \q_@@_recursion_stop
{
\tl_if_head_is_N_type:nTF {#3}
{ \@@_change_case_lower_lt:nnN }
{ \@@_change_case_loop:nnw }
- {#1} {#2} #3 \q_recursion_stop
+ {#1} {#2} #3 \q_@@_recursion_stop
}
\cs_new:Npn \@@_change_case_lower_lt:nnN #1#2#3
{
@@ -983,12 +983,12 @@
\@@_change_case_upper_lt:nnw {#2} {#3}
}
}
- \cs_new:Npn \@@_change_case_upper_lt:nnw #1#2#3 \q_recursion_stop
+ \cs_new:Npn \@@_change_case_upper_lt:nnw #1#2#3 \q_@@_recursion_stop
{
\tl_if_head_is_N_type:nTF {#3}
{ \@@_change_case_upper_lt:nnN }
{ \use:c { @@_change_case_char_next_ #1 :nn } }
- {#1} {#2} #3 \q_recursion_stop
+ {#1} {#2} #3 \q_@@_recursion_stop
}
\cs_new:Npn \@@_change_case_upper_lt:nnN #1#2#3
{
@@ -1023,12 +1023,12 @@
}
{ \@@_change_case_char:nnnN {#1} {#2} {#3} #4 }
}
-\cs_new:Npn \@@_change_case_title_nl:nnw #1#2#3 \q_recursion_stop
+\cs_new:Npn \@@_change_case_title_nl:nnw #1#2#3 \q_@@_recursion_stop
{
\tl_if_head_is_N_type:nTF {#3}
{ \@@_change_case_title_nl:nnN }
{ \use:c { @@_change_case_char_next_ #1 :nn } }
- {#1} {#2} #3 \q_recursion_stop
+ {#1} {#2} #3 \q_@@_recursion_stop
}
\cs_new:Npn \@@_change_case_title_nl:nnN #1#2#3
{
@@ -1084,7 +1084,7 @@
% combination is found both the dotless-I and the dot-above char have to
% be removed from the input.
% \begin{macrocode}
- \cs_new:Npn \@@_change_case_lower_tr:nnNw #1#2#3#4 \q_recursion_stop
+ \cs_new:Npn \@@_change_case_lower_tr:nnNw #1#2#3#4 \q_@@_recursion_stop
{
\tl_if_head_is_N_type:nTF {#4}
{ \@@_change_case_lower_tr:NnnN #3 }
@@ -1093,7 +1093,7 @@
{ \char_generate:nn { "0131 } { \@@_char_catcode:N #3 } }
\@@_change_case_loop:nnw
}
- {#1} {#2} #4 \q_recursion_stop
+ {#1} {#2} #4 \q_@@_recursion_stop
}
\cs_new:Npn \@@_change_case_lower_tr:NnnN #1#2#3#4
{
diff --git a/macros/latex/contrib/l3kernel/l3text-purify.dtx b/macros/latex/contrib/l3kernel/l3text-purify.dtx
index 0de4896617..070e41956f 100644
--- a/macros/latex/contrib/l3kernel/l3text-purify.dtx
+++ b/macros/latex/contrib/l3kernel/l3text-purify.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
@@ -53,7 +53,7 @@
%
% \begin{implementation}
%
-% \section{\pkg{l3text} implementation}
+% \section{\pkg{l3text-purify} implementation}
%
% \begin{macrocode}
%<*initex|package>
@@ -65,6 +65,13 @@
%
% \subsection{Purifying text}
%
+% \begin{macro}[EXP]{\@@_if_recursion_tail_stop:N}
+% Functions to query recursion quarks.
+% \begin{macrocode}
+\__kernel_quark_new_test:N \@@_if_recursion_tail_stop:N
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}[rEXP]{\text_purify:n, \@@_purify:n}
% \begin{macro}[rEXP]{\@@_purify_loop:w}
% \begin{macro}[rEXP]{\@@_purify_group:n}
@@ -98,13 +105,13 @@
\group_align_safe_end:
}
\cs_new:Npn \@@_purify:n #1
- { \@@_purify_loop:w #1 \q_recursion_tail \q_recursion_stop }
+ { \@@_purify_loop:w #1 \q_@@_recursion_tail \q_@@_recursion_stop }
% \end{macrocode}
% The main loop is a standard \enquote{tl action}. Unlike the expansion
% or case changing, here any groups have to be run inline. Most of the
% business end is as before in the \texttt{N}-type token processing.
% \begin{macrocode}
-\cs_new:Npn \@@_purify_loop:w #1 \q_recursion_stop
+\cs_new:Npn \@@_purify_loop:w #1 \q_@@_recursion_stop
{
\tl_if_head_is_N_type:nTF {#1}
{ \@@_purify_N_type:N }
@@ -113,7 +120,7 @@
{ \@@_purify_group:n }
{ \@@_purify_space:w }
}
- #1 \q_recursion_stop
+ #1 \q_@@_recursion_stop
}
\cs_new:Npn \@@_purify_group:n #1 { \@@_purify_loop:w #1 }
\exp_last_unbraced:NNo \cs_new:Npn \@@_purify_space:w \c_space_tl
@@ -128,30 +135,30 @@
% \begin{macrocode}
\cs_new:Npn \@@_purify_N_type:N #1
{
- \quark_if_recursion_tail_stop:N #1
+ \@@_if_recursion_tail_stop:N #1
\@@_purify_N_type_aux:N #1
}
\cs_new:Npn \@@_purify_N_type_aux:N #1
{
\exp_after:wN \@@_purify_math_search:NNN
\exp_after:wN #1 \l_text_math_delims_tl
- \q_recursion_tail ?
- \q_recursion_stop
+ \q_@@_recursion_tail ?
+ \q_@@_recursion_stop
}
\cs_new:Npn \@@_purify_math_search:NNN #1#2#3
{
- \quark_if_recursion_tail_stop_do:Nn #2
+ \@@_if_recursion_tail_stop_do:Nn #2
{ \@@_purify_math_cmd:N #1 }
\token_if_eq_meaning:NNTF #1 #2
{
- \use_i_delimit_by_q_recursion_stop:nw
+ \@@_use_i_delimit_by_q_recursion_stop:nw
{ \@@_purify_math_start:NNw #2 #3 }
}
{ \@@_purify_math_search:NNN #1 }
}
-\cs_new:Npn \@@_purify_math_start:NNw #1#2#3 \q_recursion_stop
+\cs_new:Npn \@@_purify_math_start:NNw #1#2#3 \q_@@_recursion_stop
{
- \@@_purify_math_loop:NNw #1#2#3 \q_recursion_stop
+ \@@_purify_math_loop:NNw #1#2#3 \q_@@_recursion_stop
\@@_purify_math_result:n { }
}
\cs_new:Npn \@@_purify_math_store:n #1
@@ -165,7 +172,7 @@
}
\cs_new:Npn \@@_purify_math_stop:Nw #1 \@@_purify_math_result:n #2
{ \exp_not:n {#1#2} }
-\cs_new:Npn \@@_purify_math_loop:NNw #1#2#3 \q_recursion_stop
+\cs_new:Npn \@@_purify_math_loop:NNw #1#2#3 \q_@@_recursion_stop
{
\tl_if_head_is_N_type:nTF {#3}
{ \@@_purify_math_N_type:NNN }
@@ -174,11 +181,11 @@
{ \@@_purify_math_group:NNn }
{ \@@_purify_math_space:NNw }
}
- #1#2#3 \q_recursion_stop
+ #1#2#3 \q_@@_recursion_stop
}
\cs_new:Npn \@@_purify_math_N_type:NNN #1#2#3
{
- \quark_if_recursion_tail_stop_do:Nn #3
+ \@@_if_recursion_tail_stop_do:Nn #3
{ \@@_purify_math_stop:Nw #1 }
\token_if_eq_meaning:NNTF #3 #2
{ \@@_purify_math_end:w }
@@ -206,15 +213,15 @@
\cs_new:Npn \@@_purify_math_cmd:N #1
{
\exp_after:wN \@@_purify_math_cmd:NN \exp_after:wN #1
- \l_text_math_arg_tl \q_recursion_tail \q_recursion_stop
+ \l_text_math_arg_tl \q_@@_recursion_tail \q_@@_recursion_stop
}
\cs_new:Npn \@@_purify_math_cmd:NN #1#2
{
- \quark_if_recursion_tail_stop_do:Nn #2
+ \@@_if_recursion_tail_stop_do:Nn #2
{ \@@_purify_replace:N #1 }
\cs_if_eq:NNTF #2 #1
{
- \use_i_delimit_by_q_recursion_stop:nw
+ \@@_use_i_delimit_by_q_recursion_stop:nw
{ \@@_purify_math_cmd:n }
}
{ \@@_purify_math_cmd:NN #1 }
@@ -264,7 +271,7 @@
}
\cs_new:Npn \@@_purify_protect:N #1
{
- \quark_if_recursion_tail_stop:N #1
+ \@@_if_recursion_tail_stop:N #1
\@@_purify_loop:w
}
% \end{macrocode}
diff --git a/macros/latex/contrib/l3kernel/l3text.dtx b/macros/latex/contrib/l3kernel/l3text.dtx
index 73f2064561..5113e03cc9 100644
--- a/macros/latex/contrib/l3kernel/l3text.dtx
+++ b/macros/latex/contrib/l3kernel/l3text.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
@@ -277,6 +277,52 @@
%<@@=text>
% \end{macrocode}
%
+% \subsection{Internal auxiliaries}
+%
+% \begin{variable}{\s_@@_stop}
+% Internal scan marks.
+% \begin{macrocode}
+\scan_new:N \s_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\q_@@_nil}
+% Internal quarks.
+% \begin{macrocode}
+\quark_new:N \q_@@_nil
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[pTF]{\@@_quark_if_nil:n}
+% Branching quark conditional.
+% \begin{macrocode}
+\__kernel_quark_new_conditional:Nn \@@_quark_if_nil:n { TF }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{variable}{\q_@@_recursion_tail,\q_@@_recursion_stop}
+% Internal recursion quarks.
+% \begin{macrocode}
+\quark_new:N \q_@@_recursion_tail
+\quark_new:N \q_@@_recursion_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP]{\@@_use_i_delimit_by_q_recursion_stop:nw}
+% Functions to gobble up to a quark.
+% \begin{macrocode}
+\cs_new:Npn \@@_use_i_delimit_by_q_recursion_stop:nw
+ #1 #2 \q_@@_recursion_stop {#1}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\@@_if_recursion_tail_stop_do:Nn}
+% Functions to query recursion quarks.
+% \begin{macrocode}
+\__kernel_quark_new_test:N \@@_if_recursion_tail_stop_do:Nn
+% \end{macrocode}
+% \end{macro}
+%
% \subsection{Utilities}
%
% \begin{macro}[EXP]
@@ -379,9 +425,9 @@
\if_catcode:w + #1 12 \else:
4 \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi:
\exp_after:wN ;
- \token_to_meaning:N #1 \q_stop
+ \token_to_meaning:N #1 \s_@@_stop
}
-\cs_new:Npn \@@_token_to_explicit_auxi:w #1 ; #2 \q_stop
+\cs_new:Npn \@@_token_to_explicit_auxi:w #1 ; #2 \s_@@_stop
{
\char_generate:nn
{
@@ -453,7 +499,7 @@
{
{ \token_if_protected_macro_p:N #1 }
{ \token_if_protected_long_macro_p:N #1 }
- { \token_if_eq_meaning_p:NN \q_recursion_tail #1 }
+ { \token_if_eq_meaning_p:NN \q_@@_recursion_tail #1 }
}
{ \prg_return_false: }
{ \prg_return_true: }
@@ -615,7 +661,7 @@
{
\group_align_safe_begin:
\@@_expand_loop:w #1
- \q_recursion_tail \q_recursion_stop
+ \q_@@_recursion_tail \q_@@_recursion_stop
\@@_expand_result:n { }
}
% \end{macrocode}
@@ -638,7 +684,7 @@
% recursively, while spaces are just passed through. Thus all of the
% action is in handling \texttt{N}-type tokens.
% \begin{macrocode}
-\cs_new:Npn \@@_expand_loop:w #1 \q_recursion_stop
+\cs_new:Npn \@@_expand_loop:w #1 \q_@@_recursion_stop
{
\tl_if_head_is_N_type:nTF {#1}
{ \@@_expand_N_type:N }
@@ -647,7 +693,7 @@
{ \@@_expand_group:n }
{ \@@_expand_space:w }
}
- #1 \q_recursion_stop
+ #1 \q_@@_recursion_stop
}
\cs_new:Npn \@@_expand_group:n #1
{
@@ -675,7 +721,7 @@
% \begin{macrocode}
\cs_new:Npx \@@_expand_N_type:N #1
{
- \exp_not:N \quark_if_recursion_tail_stop_do:Nn #1
+ \exp_not:N \@@_if_recursion_tail_stop_do:Nn #1
{ \exp_not:N \@@_expand_end:w }
\exp_not:N \bool_lazy_any:nTF
{
@@ -749,16 +795,16 @@
{
\exp_after:wN \@@_expand_math_search:NNN
\exp_after:wN #1 \l_text_math_delims_tl
- \q_recursion_tail \q_recursion_tail
- \q_recursion_stop
+ \q_@@_recursion_tail \q_@@_recursion_tail
+ \q_@@_recursion_stop
}
\cs_new:Npn \@@_expand_math_search:NNN #1#2#3
{
- \quark_if_recursion_tail_stop_do:Nn #2
+ \@@_if_recursion_tail_stop_do:Nn #2
{ \@@_expand_explicit:N #1 }
\token_if_eq_meaning:NNTF #1 #2
{
- \use_i_delimit_by_q_recursion_stop:nw
+ \@@_use_i_delimit_by_q_recursion_stop:nw
{
\@@_expand_store:n {#1}
\@@_expand_math_loop:Nw #3
@@ -766,7 +812,7 @@
}
{ \@@_expand_math_search:NNN #1 }
}
-\cs_new:Npn \@@_expand_math_loop:Nw #1#2 \q_recursion_stop
+\cs_new:Npn \@@_expand_math_loop:Nw #1#2 \q_@@_recursion_stop
{
\tl_if_head_is_N_type:nTF {#2}
{ \@@_expand_math_N_type:NN }
@@ -775,11 +821,11 @@
{ \@@_expand_math_group:Nn }
{ \@@_expand_math_space:Nw }
}
- #1#2 \q_recursion_stop
+ #1#2 \q_@@_recursion_stop
}
\cs_new:Npn \@@_expand_math_N_type:NN #1#2
{
- \quark_if_recursion_tail_stop_do:Nn #2
+ \@@_if_recursion_tail_stop_do:Nn #2
{ \@@_expand_end:w }
\@@_expand_store:n {#2}
\token_if_eq_meaning:NNTF #2 #1
@@ -820,7 +866,7 @@
\exp_after:wN \@@_expand_exclude:NN
\l_text_math_arg_tl
#1
- \q_recursion_tail \q_recursion_stop
+ \q_@@_recursion_tail \q_@@_recursion_stop
%</initex>
%<*package>
\exp_args:Ne \@@_expand_exclude:nN
@@ -836,12 +882,12 @@
\cs_new:Npn \@@_expand_exclude:nN #1#2
{
\@@_expand_exclude:NN #2 #1
- \q_recursion_tail \q_recursion_stop
+ \q_@@_recursion_tail \q_@@_recursion_stop
}
%</package>
\cs_new:Npn \@@_expand_exclude:NN #1#2
{
- \quark_if_recursion_tail_stop_do:Nn #2
+ \@@_if_recursion_tail_stop_do:Nn #2
%<*initex>
{ \@@_expand_cs:N #1 }
%</initex>
@@ -850,7 +896,7 @@
%</package>
\cs_if_eq:NNTF #2 #1
{
- \use_i_delimit_by_q_recursion_stop:nw
+ \@@_use_i_delimit_by_q_recursion_stop:nw
{ \@@_expand_exclude:Nn #1 }
}
{ \@@_expand_exclude:NN #1 }
@@ -869,15 +915,15 @@
{
\exp_after:wN \@@_expand_letterlike:NN \exp_after:wN
#1 \l_text_letterlike_tl
- \q_recursion_tail \q_recursion_stop
+ \q_@@_recursion_tail \q_@@_recursion_stop
}
\cs_new:Npn \@@_expand_letterlike:NN #1#2
{
- \quark_if_recursion_tail_stop_do:Nn #2
+ \@@_if_recursion_tail_stop_do:Nn #2
{ \@@_expand_cs:N #1 }
\cs_if_eq:NNTF #2 #1
{
- \use_i_delimit_by_q_recursion_stop:nw
+ \@@_use_i_delimit_by_q_recursion_stop:nw
{
\@@_expand_store:n {#1}
\@@_expand_loop:w
@@ -908,10 +954,10 @@
{ \cs_to_str:N #1 } #1
}
\cs_new:Npn \@@_expand_protect:nN #1#2
- { \@@_expand_protect:Nw #2 #1 \q_nil #1 ~ \q_nil \q_nil \q_stop }
-\cs_new:Npn \@@_expand_protect:Nw #1 #2 ~ \q_nil #3 \q_nil #4 \q_stop
+ { \@@_expand_protect:Nw #2 #1 \q_@@_nil #1 ~ \q_@@_nil \q_@@_nil \s_@@_stop }
+\cs_new:Npn \@@_expand_protect:Nw #1 #2 ~ \q_@@_nil #3 \q_@@_nil #4 \s_@@_stop
{
- \quark_if_nil:nTF {#4}
+ \@@_quark_if_nil:nTF {#4}
{
\cs_if_exist:cTF {#2}
{ \exp_args:Ne \@@_expand_store:n { \exp_not:c {#2} } }
diff --git a/macros/latex/contrib/l3kernel/l3tl-analysis.dtx b/macros/latex/contrib/l3kernel/l3tl-analysis.dtx
index 969e15a485..6fbe2f1bbb 100644
--- a/macros/latex/contrib/l3kernel/l3tl-analysis.dtx
+++ b/macros/latex/contrib/l3kernel/l3tl-analysis.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3tl.dtx b/macros/latex/contrib/l3kernel/l3tl.dtx
index 7c5217cb1d..53f61e9750 100644
--- a/macros/latex/contrib/l3kernel/l3tl.dtx
+++ b/macros/latex/contrib/l3kernel/l3tl.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
@@ -1505,6 +1505,35 @@
% \end{macro}
% \end{macro}
%
+% \subsection{Internal quarks and quark-query functions}
+%
+% \begin{variable}{\q_@@_nil,\q_@@_mark,\q_@@_stop}
+% Internal quarks.
+% \begin{macrocode}
+\quark_new:N \q_@@_nil
+\quark_new:N \q_@@_mark
+\quark_new:N \q_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\q_@@_recursion_tail,\q_@@_recursion_stop}
+% Internal recursion quarks.
+% \begin{macrocode}
+\quark_new:N \q_@@_recursion_tail
+\quark_new:N \q_@@_recursion_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP]{\@@_if_recursion_tail_break:nN}
+% \begin{macro}[pTF]{\@@_if_recursion_tail_stop:n}
+% Functions to query recursion quarks.
+% \begin{macrocode}
+\__kernel_quark_new_test:N \@@_if_recursion_tail_break:nN
+\__kernel_quark_new_conditional:Nn \@@_quark_if_nil:n { TF }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
% \subsection{Reassigning token list category codes}
%
% \begin{variable}{\c_@@_rescan_marker_tl}
@@ -1670,7 +1699,7 @@
% token list may contain a comment character, in which case the |'| we
% expected is not there. We fix this as follows: rather than just
% |::| we set \tn{everyeof} to |::|\Arg{code1} |'::|\Arg{code2}
-% \cs{q_stop}. The auxiliary \cs{@@_set_rescan_single:NNww} runs the
+% \cs{s_@@_stop}. The auxiliary \cs{@@_set_rescan_single:NNww} runs the
% \texttt{o}-expanding assignment, expanding either \meta{code1} or
% \meta{code2} before its the main argument~|#3|. In the typical case
% without comment character, \meta{code1} is expanded, removing the
@@ -1717,9 +1746,9 @@
{
#1 \use_none:n
#2 #1 { \exp:w \@@_set_rescan_single_aux:w }
- \q_stop
+ \s_@@_stop
}
- \cs_set:Npn \@@_rescan:NNw ##1##2##3 #2 #1 ##4 ##5 \q_stop
+ \cs_set:Npn \@@_rescan:NNw ##1##2##3 #2 #1 ##4 ##5 \s_@@_stop
{
\group_end:
##1 ##2 { ##4 ##3 }
@@ -1756,13 +1785,13 @@
% the \meta{tl~var} by \meta{token list}.
% \begin{macrocode}
\cs_new_protected:Npn \tl_replace_once:Nnn
- { \@@_replace:NnNNNnn \q_mark ? \@@_replace_wrap:w \tl_set:Nx }
+ { \@@_replace:NnNNNnn \q_@@_mark ? \@@_replace_wrap:w \tl_set:Nx }
\cs_new_protected:Npn \tl_greplace_once:Nnn
- { \@@_replace:NnNNNnn \q_mark ? \@@_replace_wrap:w \tl_gset:Nx }
+ { \@@_replace:NnNNNnn \q_@@_mark ? \@@_replace_wrap:w \tl_gset:Nx }
\cs_new_protected:Npn \tl_replace_all:Nnn
- { \@@_replace:NnNNNnn \q_mark ? \@@_replace_next:w \tl_set:Nx }
+ { \@@_replace:NnNNNnn \q_@@_mark ? \@@_replace_next:w \tl_set:Nx }
\cs_new_protected:Npn \tl_greplace_all:Nnn
- { \@@_replace:NnNNNnn \q_mark ? \@@_replace_next:w \tl_gset:Nx }
+ { \@@_replace:NnNNNnn \q_@@_mark ? \@@_replace_next:w \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 }
@@ -1816,9 +1845,9 @@
% at most $O(n^{3/2})$. Bear in mind that these upper bounds are
% reached only in very contrived scenarios: we include the case
% \enquote{\meta{A}} in the list of delimiters to try, so that the
-% \meta{delimiter} is simply \cs{q_mark} in the most common
+% \meta{delimiter} is simply \cs{q_@@_mark} in the most common
% situation where neither the \meta{token list} nor the \meta{pattern}
-% contains \cs{q_mark}.
+% contains \cs{q_@@_mark}.
%
% Let us now ahead, optimizing for this most common case. First, two
% special cases: an empty \meta{pattern}~|#6| is an error, and if
@@ -1826,14 +1855,14 @@
% \meta{pattern}~|#6| then we can use it as the \meta{delimiter}
% through \cs{@@_replace_auxii:nNNNnn} |{#1}|. Otherwise, we end up
% calling \cs{@@_replace:NnNNNnn} repeatedly with the first two
-% arguments \cs{q_mark} |{?}|, |\?| |{??}|, |\??| |{???}|, and so on,
+% arguments \cs{q_@@_mark} |{?}|, |\?| |{??}|, |\??| |{???}|, and so on,
% until |#6|~does not contain the control sequence~|#1|, which we take
% as our~\meta{A}. The argument~|#2| only serves to collect~|?|
% characters for~|#1|. Note that the order of the tests means that
% the first two are done every time, which is wasteful (for instance,
% we repeatedly test for the emptyness of~|#6|). However, this is
% rare enough not to matter. Finally, choose~\meta{B} to be
-% \cs{q_nil} or~\cs{q_stop} such that it is not equal to~|#6|.
+% \cs{q_@@_nil} or~\cs{q_@@_stop} such that it is not equal to~|#6|.
%
% The \cs{@@_replace_auxi:NnnNNNnn} auxiliary receives \Arg{A} and
% |{|\meta{A}$^n$\meta{B}|}| as its arguments, initially with $n=1$.
@@ -1855,9 +1884,9 @@
\tl_if_in:nnTF {#6} {#1}
{ \exp_args:Nc \@@_replace:NnNNNnn {#2} {#2?} }
{
- \quark_if_nil:nTF {#6}
- { \@@_replace_auxi:NnnNNNnn #5 {#1} { #1 \q_stop } }
- { \@@_replace_auxi:NnnNNNnn #5 {#1} { #1 \q_nil } }
+ \@@_quark_if_nil:nTF {#6}
+ { \@@_replace_auxi:NnnNNNnn #5 {#1} { #1 \q_@@_stop } }
+ { \@@_replace_auxi:NnnNNNnn #5 {#1} { #1 \q_@@_nil } }
}
}
{ \@@_replace_auxii:nNNNnn {#1} }
@@ -1988,7 +2017,7 @@
% \meta{token list} |?| is empty after one expansion. The auxiliary
% \cs{@@_if_empty_if:o} is a fast emptyness test, converting its
% argument to a string (after one expansion) and using the test
-% \cs{if_meaning:w} \cs{q_nil} |...| \cs{q_nil}.
+% \cs{if_meaning:w} \cs{q_@@_nil} |...| \cs{q_@@_nil}.
% \begin{macrocode}
\prg_new_conditional:Npnn \tl_if_blank:n #1 { p , T , F , TF }
{
@@ -2023,22 +2052,22 @@
%
% \begin{macro}[pTF]{\tl_if_empty:n, \tl_if_empty:V}
% Convert the argument to a string: this is empty if and only if
-% the argument is. Then |\if_meaning:w \q_nil ... \q_nil| is
+% the argument is. Then |\if_meaning:w \q_@@_nil ... \q_@@_nil| is
% \texttt{true} if and only if the string |...| is empty.
-% It could be tempting to use |\if_meaning:w \q_nil #1 \q_nil| directly.
+% It could be tempting to use |\if_meaning:w \q_@@_nil #1 \q_@@_nil| directly.
% This fails on a token
-% list starting with \cs{q_nil} of course but more troubling is the
+% list starting with \cs{q_@@_nil} of course but more troubling is the
% case where argument is a complete conditional such as \cs{if_true:}
% a \cs{else:} b \cs{fi:} because then \cs{if_true:} is used by
% \cs{if_meaning:w}, the test turns out \texttt{false}, the \cs{else:}
% executes the \texttt{false} branch, the \cs{fi:} ends it and the
-% \cs{q_nil} at the end
+% \cs{q_@@_nil} at the end
% starts executing\dots{}
% \begin{macrocode}
\prg_new_conditional:Npnn \tl_if_empty:n #1 { p , TF , T , F }
{
- \exp_after:wN \if_meaning:w \exp_after:wN \q_nil
- \tl_to_str:n {#1} \q_nil
+ \exp_after:wN \if_meaning:w \exp_after:wN \q_@@_nil
+ \tl_to_str:n {#1} \q_@@_nil
\prg_return_true:
\else:
\prg_return_false:
@@ -2064,8 +2093,8 @@
% \begin{macrocode}
\cs_new:Npn \@@_if_empty_if:o #1
{
- \exp_after:wN \if_meaning:w \exp_after:wN \q_nil
- \__kernel_tl_to_str:w \exp_after:wN {#1} \q_nil
+ \exp_after:wN \if_meaning:w \exp_after:wN \q_@@_nil
+ \__kernel_tl_to_str:w \exp_after:wN {#1} \q_@@_nil
}
\prg_new_conditional:Npnn \tl_if_empty:o #1 { p , TF , T , F }
{
@@ -2221,13 +2250,13 @@
{
\if_catcode:w ^ \exp_after:wN \@@_if_single:nnw
\__kernel_tl_to_str:w
- \exp_after:wN { \use_none:nn #1 ?? } ^ ? \q_stop
+ \exp_after:wN { \use_none:nn #1 ?? } ^ ? \s_@@_stop
\prg_return_true:
\else:
\prg_return_false:
\fi:
}
-\cs_new:Npn \@@_if_single:nnw #1#2#3 \q_stop {#2}
+\cs_new:Npn \@@_if_single:nnw #1#2#3 \s_@@_stop {#2}
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -2291,7 +2320,7 @@
\@@_case:NnTF #1 {#2}
}
\cs_new:Npn \@@_case:NnTF #1#2#3#4
- { \@@_case:Nw #1 #2 #1 { } \q_mark {#3} \q_mark {#4} \q_stop }
+ { \@@_case:Nw #1 #2 #1 { } \s_@@_mark {#3} \s_@@_mark {#4} \s_@@_stop }
\cs_new:Npn \@@_case:Nw #1#2#3
{
\tl_if_eq:NNTF #1 #2
@@ -2306,14 +2335,14 @@
% one of the cases searched for, then |#1| is the code to insert,
% |#2| is the \emph{next} case to check on and |#3| is all of
% the rest of the cases code. That means that |#4| is the \texttt{true}
-% branch code, and |#5| tidies up the spare \cs{q_mark} and the
+% branch code, and |#5| tidies up the spare \cs{s_@@_mark} and the
% \texttt{false} branch. On the other hand, if none of the cases matched
% then we arrive here using the \enquote{termination} case of comparing
% the search with itself. That means that |#1| is empty, |#2| is
-% the first \cs{q_mark} and so |#4| is the \texttt{false} code (the
+% the first \cs{s_@@_mark} and so |#4| is the \texttt{false} code (the
% \texttt{true} code is mopped up by |#3|).
% \begin{macrocode}
-\cs_new:Npn \@@_case_end:nw #1#2#3 \q_mark #4#5 \q_stop
+\cs_new:Npn \@@_case_end:nw #1#2#3 \s_@@_mark #4#5 \s_@@_stop
{ \exp_end: #1 #4 }
% \end{macrocode}
% \end{macro}
@@ -2333,14 +2362,14 @@
\cs_new:Npn \tl_map_function:nN #1#2
{
\@@_map_function:Nn #2 #1
- \q_recursion_tail
+ \q_@@_recursion_tail
\prg_break_point:Nn \tl_map_break: { }
}
\cs_new:Npn \tl_map_function:NN
{ \exp_args:No \tl_map_function:nN }
\cs_new:Npn \@@_map_function:Nn #1#2
{
- \quark_if_recursion_tail_break:nN {#2} \tl_map_break:
+ \@@_if_recursion_tail_break:nN {#2} \tl_map_break:
#1 {#2} \@@_map_function:Nn #1
}
\cs_generate_variant:Nn \tl_map_function:NN { c }
@@ -2363,7 +2392,7 @@
{ @@_map_ \int_use:N \g__kernel_prg_map_int :w } ##1 {#2}
\exp_args:Nc \@@_map_function:Nn
{ @@_map_ \int_use:N \g__kernel_prg_map_int :w }
- #1 \q_recursion_tail
+ #1 \q_@@_recursion_tail
\prg_break_point:Nn \tl_map_break:
{ \int_gdecr:N \g__kernel_prg_map_int }
}
@@ -2382,7 +2411,7 @@
\cs_new:Npn \tl_map_tokens:nn #1#2
{
\@@_map_tokens:nn {#2} #1
- \q_recursion_tail
+ \q_@@_recursion_tail
\prg_break_point:Nn \tl_map_break: { }
}
\cs_new:Npn \tl_map_tokens:Nn
@@ -2390,7 +2419,7 @@
\cs_generate_variant:Nn \tl_map_tokens:Nn { c }
\cs_new:Npn \@@_map_tokens:nn #1#2
{
- \quark_if_recursion_tail_break:nN {#2} \tl_map_break:
+ \@@_if_recursion_tail_break:nN {#2} \tl_map_break:
\use:n {#1} {#2}
\@@_map_tokens:nn {#1}
}
@@ -2410,14 +2439,14 @@
\cs_new_protected:Npn \tl_map_variable:nNn #1#2#3
{
\@@_map_variable:Nnn #2 {#3} #1
- \q_recursion_tail
+ \q_@@_recursion_tail
\prg_break_point:Nn \tl_map_break: { }
}
\cs_new_protected:Npn \tl_map_variable:NNn
{ \exp_args:No \tl_map_variable:nNn }
\cs_new_protected:Npn \@@_map_variable:Nnn #1#2#3
{
- \quark_if_recursion_tail_break:nN {#3} \tl_map_break:
+ \@@_if_recursion_tail_break:nN {#3} \tl_map_break:
\tl_set:Nn #1 {#3}
\use:n {#2}
\@@_map_variable:Nnn #1 {#2}
@@ -2538,23 +2567,23 @@
% \begin{macro}{\@@_reverse_items:nwNwn}
% \begin{macro}{\@@_reverse_items:wn}
% Reversal of a token list is done by taking one item at a time
-% and putting it after \cs{q_stop}.
+% and putting it after \cs{s_@@_stop}.
% \begin{macrocode}
\cs_new:Npn \tl_reverse_items:n #1
{
\@@_reverse_items:nwNwn #1 ?
- \q_mark \@@_reverse_items:nwNwn
- \q_mark \@@_reverse_items:wn
- \q_stop { }
+ \s_@@_mark \@@_reverse_items:nwNwn
+ \s_@@_mark \@@_reverse_items:wn
+ \s_@@_stop { }
}
-\cs_new:Npn \@@_reverse_items:nwNwn #1 #2 \q_mark #3 #4 \q_stop #5
+\cs_new:Npn \@@_reverse_items:nwNwn #1 #2 \s_@@_mark #3 #4 \s_@@_stop #5
{
#3 #2
- \q_mark \@@_reverse_items:nwNwn
- \q_mark \@@_reverse_items:wn
- \q_stop { {#1} #5 }
+ \s_@@_mark \@@_reverse_items:nwNwn
+ \s_@@_mark \@@_reverse_items:wn
+ \s_@@_stop { {#1} #5 }
}
-\cs_new:Npn \@@_reverse_items:wn #1 \q_stop #2
+\cs_new:Npn \@@_reverse_items:wn #1 \s_@@_stop #2
{ \exp_not:o { \use_none:nn #2 } }
% \end{macrocode}
% \end{macro}
@@ -2570,17 +2599,17 @@
% }
% Trimming spaces from around the input is deferred to an internal
% function whose first argument is the token list to trim, augmented
-% by an initial \cs{q_mark}, and whose second argument is a
+% by an initial \cs{s_@@_mark}, and whose second argument is a
% \meta{continuation}, which receives as a braced argument
-% \cs{use_none:n} \cs{q_mark} \meta{trimmed token list}. In the case
+% \cs{use_none:n} \cs{s_@@_mark} \meta{trimmed token list}. In the case
% at hand, we take \cs{exp_not:o} as our continuation, so that space
% trimming behaves correctly within an \texttt{x}-type expansion.
% \begin{macrocode}
\cs_new:Npn \tl_trim_spaces:n #1
- { \@@_trim_spaces:nn { \q_mark #1 } \exp_not:o }
+ { \@@_trim_spaces:nn { \s_@@_mark #1 } \exp_not:o }
\cs_generate_variant:Nn \tl_trim_spaces:n { o }
\cs_new:Npn \tl_trim_spaces_apply:nN #1#2
- { \@@_trim_spaces:nn { \q_mark #1 } { \exp_args:No #2 } }
+ { \@@_trim_spaces:nn { \s_@@_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} } }
@@ -2603,14 +2632,14 @@
% definitions, we nest those in \cs{@@_tmp:w}, which then receives
% a single space as its argument: |#1| is \verb*+ +.
% Removing leading spaces is done with \cs{@@_trim_spaces_auxi:w},
-% which loops until \cs{q_mark}\verb*+ + matches the end of the token
+% which loops until \cs{s_@@_mark}\verb*+ + matches the end of the token
% list: then |##1| is the token list and |##3| is
% \cs{@@_trim_spaces_auxii:w}. This hands the relevant tokens to the
% loop \cs{@@_trim_spaces_auxiii:w}, responsible for trimming
-% trailing spaces. The end is reached when \verb*+ + \cs{q_nil}
+% trailing spaces. The end is reached when \verb*+ + \cs{s_@@_nil}
% matches the one present in the definition of \cs{tl_trim_spacs:n}.
% Then \cs{@@_trim_spaces_auxiv:w} puts the token list into a group,
-% with \cs{use_none:n} placed there to gobble a lingering \cs{q_mark},
+% with \cs{use_none:n} placed there to gobble a lingering \cs{s_@@_mark},
% and feeds this to the \meta{continuation}.
% \begin{macrocode}
\cs_set:Npn \@@_tmp:w #1
@@ -2619,35 +2648,35 @@
{
\@@_trim_spaces_auxi:w
##1
- \q_nil
- \q_mark #1 { }
- \q_mark \@@_trim_spaces_auxii:w
+ \s_@@_nil
+ \s_@@_mark #1 { }
+ \s_@@_mark \@@_trim_spaces_auxii:w
\@@_trim_spaces_auxiii:w
- #1 \q_nil
+ #1 \s_@@_nil
\@@_trim_spaces_auxiv:w
- \q_stop
+ \s_@@_stop
}
- \cs_new:Npn \@@_trim_spaces_auxi:w ##1 \q_mark #1 ##2 \q_mark ##3
+ \cs_new:Npn \@@_trim_spaces_auxi:w ##1 \s_@@_mark #1 ##2 \s_@@_mark ##3
{
##3
\@@_trim_spaces_auxi:w
- \q_mark
+ \s_@@_mark
##2
- \q_mark #1 {##1}
+ \s_@@_mark #1 {##1}
}
\cs_new:Npn \@@_trim_spaces_auxii:w
- \@@_trim_spaces_auxi:w \q_mark \q_mark ##1
+ \@@_trim_spaces_auxi:w \s_@@_mark \s_@@_mark ##1
{
\@@_trim_spaces_auxiii:w
##1
}
- \cs_new:Npn \@@_trim_spaces_auxiii:w ##1 #1 \q_nil ##2
+ \cs_new:Npn \@@_trim_spaces_auxiii:w ##1 #1 \s_@@_nil ##2
{
##2
- ##1 \q_nil
+ ##1 \s_@@_nil
\@@_trim_spaces_auxiii:w
}
- \cs_new:Npn \@@_trim_spaces_auxiv:w ##1 \q_nil ##2 \q_stop ##3
+ \cs_new:Npn \@@_trim_spaces_auxiv:w ##1 \s_@@_nil ##2 \s_@@_stop ##3
{ ##3 { \use_none:n ##1 } }
}
\@@_tmp:w { ~ }
@@ -2669,10 +2698,9 @@
% in the token list.
% Only \cs{q_@@_act_mark} and \cs{q_@@_act_stop} may not appear
% in the token lists manipulated by \cs{@@_act:NNNnn} functions.
-% No quark module yet, so do things by hand.
% \begin{macrocode}
-\cs_new_nopar:Npn \q_@@_act_mark { \q_@@_act_mark }
-\cs_new_nopar:Npn \q_@@_act_stop { \q_@@_act_stop }
+\quark_new:N \q_@@_act_mark
+\quark_new:N \q_@@_act_stop
% \end{macrocode}
% \end{variable}
%
@@ -2819,7 +2847,7 @@
%
% \begin{macro}{\tl_head:N, \tl_head:n, \tl_head:V, \tl_head:v, \tl_head:f}
% \begin{macro}{\@@_head_auxi:nw, \@@_head_auxii:n}
-% \begin{macro}{\tl_head:w}
+% \begin{macro}{\tl_head:w,\@@_tl_head:w}
% \begin{macro}{\tl_tail:N, \tl_tail:n, \tl_tail:V, \tl_tail:v, \tl_tail:f}
% Finding the head of a token list expandably always strips braces, which
% is fine as this is consistent with for example mapping to a list. The
@@ -2836,17 +2864,17 @@
\cs_new:Npn \tl_head:n #1
{
\__kernel_exp_not:w
- \if_false: { \fi: \@@_head_auxi:nw #1 { } \q_stop }
+ \if_false: { \fi: \@@_head_auxi:nw #1 { } \s_@@_stop }
}
-\cs_new:Npn \@@_head_auxi:nw #1#2 \q_stop
+\cs_new:Npn \@@_head_auxi:nw #1#2 \s_@@_stop
{
\exp_after:wN \@@_head_auxii:n \exp_after:wN {
\if_false: } \fi: {#1}
}
\cs_new:Npn \@@_head_auxii:n #1
{
- \exp_after:wN \if_meaning:w \exp_after:wN \q_nil
- \__kernel_tl_to_str:w \exp_after:wN { \use_none:n #1 } \q_nil
+ \exp_after:wN \if_meaning:w \exp_after:wN \q_@@_nil
+ \__kernel_tl_to_str:w \exp_after:wN { \use_none:n #1 } \q_@@_nil
\exp_after:wN \use_i:nn
\else:
\exp_after:wN \use_ii:nn
@@ -2856,6 +2884,7 @@
}
\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_head:w #1#2 \s_@@_stop {#1}
\cs_new:Npn \tl_head:N { \exp_args:No \tl_head:n }
% \end{macrocode}
% To correctly leave the tail of a token list, it's important \emph{not} to
@@ -2923,7 +2952,7 @@
\tl_if_head_is_N_type:nTF { #1 ? }
{
\exp_after:wN \exp_not:N
- \tl_head:w #1 { ? \use_none:nn } \q_stop
+ \@@_tl_head:w #1 { ? \use_none:nn } \s_@@_stop
}
{ \str_head:n {#1} }
\prg_return_true:
@@ -2950,7 +2979,7 @@
\tl_if_head_is_N_type:nTF { #1 ? }
{
\exp_after:wN \exp_not:N
- \tl_head:w #1 { ? \use_none:nn } \q_stop
+ \@@_tl_head:w #1 { ? \use_none:nn } \s_@@_stop
}
{
\tl_if_head_is_group:nTF {#1}
@@ -2986,7 +3015,7 @@
\cs_new:Npn \@@_if_head_eq_meaning_normal:nN #1 #2
{
\exp_after:wN \if_meaning:w
- \tl_head:w #1 { ?? \use_none:nnn } \q_stop #2
+ \@@_tl_head:w #1 { ?? \use_none:nnn } \s_@@_stop #2
\prg_return_true:
\else:
\prg_return_false:
@@ -3109,7 +3138,7 @@
% \begin{macro}{\@@_item_aux:nn, \@@_item:nn}
% The idea here is to find the offset of the item from the left, then use
% a loop to grab the correct item. If the resulting offset is too large,
-% then \cs{quark_if_recursion_tail_stop:n} terminates the loop, and returns
+% then \cs{@@_if_recursion_tail_break:nN} terminates the loop, and returns
% nothing at all.
% \begin{macrocode}
\cs_new:Npn \tl_item:nn #1#2
@@ -3117,7 +3146,7 @@
\exp_args:Nf \@@_item:nn
{ \exp_args:Nf \@@_item_aux:nn { \int_eval:n {#2} } {#1} }
#1
- \q_recursion_tail
+ \q_@@_recursion_tail
\prg_break_point:
}
\cs_new:Npn \@@_item_aux:nn #1#2
@@ -3128,7 +3157,7 @@
}
\cs_new:Npn \@@_item:nn #1#2
{
- \quark_if_recursion_tail_break:nN {#2} \prg_break:
+ \@@_if_recursion_tail_break:nN {#2} \prg_break:
\int_compare:nNnTF {#1} = 1
{ \prg_break:n { \exp_not:n {#2} } }
{ \exp_args:Nf \@@_item:nn { \int_eval:n { #1 - 1 } } }
@@ -3331,7 +3360,7 @@
{ \iow_wrap:nnnN { >~ \tl_to_str:n {#1} . } { } { } \@@_show:n }
\cs_new_protected:Npn \@@_show:n #1
{
- \tl_set:Nf \l_@@_internal_a_tl { \@@_show:w #1 \q_stop }
+ \tl_set:Nf \l_@@_internal_a_tl { \@@_show:w #1 \s_@@_stop }
\__kernel_iow_with:Nnn \tex_newlinechar:D { 10 }
{
\__kernel_iow_with:Nnn \tex_errorcontextlines:D { -1 }
@@ -3341,7 +3370,7 @@
}
}
}
-\cs_new:Npn \@@_show:w #1 > #2 . \q_stop {#2}
+\cs_new:Npn \@@_show:w #1 > #2 . \s_@@_stop {#2}
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -3355,6 +3384,18 @@
% \end{macrocode}
% \end{macro}
%
+% \subsection{Internal scan marks}
+%
+% \begin{variable}{\s_@@_nil,\s_@@_mark,\s_@@_stop}
+% Internal scan marks. These are defined here at the end because the
+% code for \cs{scan_new:N} depends on some \pkg{l3tl} functions.
+% \begin{macrocode}
+\scan_new:N \s_@@_nil
+\scan_new:N \s_@@_mark
+\scan_new:N \s_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
% \subsection{Scratch token lists}
%
% \begin{variable}{\g_tmpa_tl, \g_tmpb_tl}
diff --git a/macros/latex/contrib/l3kernel/l3token.dtx b/macros/latex/contrib/l3kernel/l3token.dtx
index 61565b47c0..0608820bba 100644
--- a/macros/latex/contrib/l3kernel/l3token.dtx
+++ b/macros/latex/contrib/l3kernel/l3token.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
@@ -1101,6 +1101,29 @@
%<@@=char>
% \end{macrocode}
%
+% \subsection{Internal auxiliaries}
+%
+% \begin{variable}{\s_@@_stop}
+% Internal scan mark.
+% \begin{macrocode}
+\scan_new:N \s_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\q_@@_no_value}
+% Internal recursion quarks.
+% \begin{macrocode}
+\quark_new:N \q_@@_no_value
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[pTF]{\@@_quark_if_no_value:N}
+% Functions to query recursion quarks.
+% \begin{macrocode}
+\__kernel_quark_new_conditional:Nn \@@_quark_if_no_value:N { TF }
+% \end{macrocode}
+% \end{macro}
+%
% \subsection{Manipulating and interrogating character tokens}
%
% \begin{macro}{\char_set_catcode:nn}
@@ -1667,12 +1690,12 @@
\exp_after:wN \exp_after:wN \exp_after:wN \@@_to_nfd:Nw
\exp_after:wN \exp_after:wN \exp_after:wN #1
\cs:w c_@@_nfd_ \token_to_str:N #1 _ tl \cs_end:
- \q_stop
+ \s_@@_stop
}
{ \exp_not:n {#1} }
}
\cs_set_eq:NN \@@_to_nfd:n \char_to_nfd:N
-\cs_new:Npn \@@_to_nfd:Nw #1#2#3 \q_stop
+\cs_new:Npn \@@_to_nfd:Nw #1#2#3 \s_@@_stop
{
\exp_args:Ne \@@_to_nfd:n
{ \char_generate:nn { `#2 } { \@@_change_case_catcode:N #1 } }
@@ -1744,13 +1767,13 @@
{ \char_generate:nn {#1} { \@@_change_case_catcode:N #2 } }
}
\cs_new:Npn \@@_change_case_multi:nN #1#2
- { \@@_change_case_multi:NNNNw #2 #1 \q_no_value \q_no_value \q_stop }
+ { \@@_change_case_multi:NNNNw #2 #1 \q_@@_no_value \q_@@_no_value \s_@@_stop }
\cs_generate_variant:Nn \@@_change_case_multi:nN { v }
-\cs_new:Npn \@@_change_case_multi:NNNNw #1#2#3#4#5 \q_stop
+\cs_new:Npn \@@_change_case_multi:NNNNw #1#2#3#4#5 \s_@@_stop
{
- \quark_if_no_value:NTF #4
+ \@@_quark_if_no_value:NTF #4
{
- \quark_if_no_value:NTF #3
+ \@@_quark_if_no_value:NTF #3
{ \@@_change_case:NN #1 #2 }
{ \@@_change_case:NNN #1 #2#3 }
}
@@ -1865,6 +1888,13 @@
%<@@=token>
% \end{macrocode}
%
+% \begin{variable}{\s_@@_stop}
+% Internal scan marks.
+% \begin{macrocode}
+\scan_new:N \s_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
% \begin{macro}{\token_to_meaning:N, \token_to_meaning:c}
% \begin{macro}{\token_to_str:N, \token_to_str:c}
% These are all defined in \pkg{l3basics}, as they are needed
@@ -2136,10 +2166,10 @@
{
\exp_not:N \exp_after:wN \exp_not:N \@@_if_macro_p:w
\exp_not:N \token_to_meaning:N ##1 \tl_to_str:n { ma : }
- \exp_not:N \q_stop
+ \s_@@_stop
}
\cs_new:Npn \exp_not:N \@@_if_macro_p:w
- ##1 \tl_to_str:n { ma } ##2 \c_colon_str ##3 \exp_not:N \q_stop
+ ##1 \tl_to_str:n { ma } ##2 \c_colon_str ##3 \s_@@_stop
}
{
\str_if_eq:nnTF { #2 } { cro }
@@ -2200,7 +2230,7 @@
% conditionals which detect whether the \tn{meaning} of their
% argument begins with a particular string. Each auxiliary takes an
% argument delimited by a string, a second one delimited by
-% \cs{q_stop}, and returns the first one and its delimiter.
+% \cs{s_@@_stop}, and returns the first one and its delimiter.
% This result is eventually compared to another string.
% \begin{macrocode}
\group_begin:
@@ -2209,7 +2239,7 @@
\use:x
{
\cs_new:Npn \exp_not:c { @@_delimit_by_ #1 :w }
- ####1 \tl_to_str:n {#1} ####2 \exp_not:N \q_stop
+ ####1 \tl_to_str:n {#1} ####2 \s_@@_stop
{ ####1 \tl_to_str:n {#1} }
}
}
@@ -2297,7 +2327,7 @@
\exp_not:N \exp_after:wN
\exp_not:c { @@_delimit_by_ #2 :w }
\exp_not:N \token_to_meaning:N ####1
- ? \tl_to_str:n {#2} \exp_not:N \q_stop
+ ? \tl_to_str:n {#2} \s_@@_stop
}
{ \exp_not:n {#3} }
{ \exp_not:N \prg_return_true: }
@@ -2356,7 +2386,7 @@
% nonexistent depending on \tn{endlinechar}), and takes care
% of three of the exceptions: \tn{space}, \tn{italiccorr}
% and \tn{hyphen}, whose meaning is at most two characters.
-% This leaves a string terminated by some |:|, and \cs{q_stop}.
+% This leaves a string terminated by some |:|, and \cs{s_@@_stop}.
%
% The meaning of each one of the five \tn[no-index]{...mark} primitives
% has the form \meta{letters}|:|\meta{user material}. In other words,
@@ -2389,17 +2419,17 @@
{
\exp_not:N \exp_after:wN \exp_not:N \@@_if_primitive:NNw
\exp_not:N \token_to_meaning:N ##1
- \tl_to_str:n { : : : } \exp_not:N \q_stop ##1
+ \tl_to_str:n { : : : } \s_@@_stop ##1
}
}
\cs_new:Npn \exp_not:N \@@_if_primitive:NNw
- ##1##2 ##3 \c_colon_str ##4 \exp_not:N \q_stop
+ ##1##2 ##3 \c_colon_str ##4 \s_@@_stop
{
\exp_not:N \tl_if_empty:oTF
{ \exp_not:N \@@_if_primitive_space:w ##3 ~ }
{
\exp_not:N \@@_if_primitive_loop:N ##3
- \c_colon_str \exp_not:N \q_stop
+ \c_colon_str \s_@@_stop
}
{ \exp_not:N \@@_if_primitive_nullfont:N }
}
@@ -2422,7 +2452,7 @@
\exp_after:wN \@@_if_primitive_loop:N
\fi:
}
-\cs_new:Npn \@@_if_primitive:Nw #1 #2 \q_stop
+\cs_new:Npn \@@_if_primitive:Nw #1 #2 \s_@@_stop
{
\if:w : #1
\exp_after:wN \@@_if_primitive_undefined:N
@@ -2497,6 +2527,21 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{variable}{\s_@@_mark,\s_@@_stop}
+% Internal scan marks.
+% \begin{macrocode}
+\scan_new:N \s_@@_mark
+\scan_new:N \s_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP]{\@@_use_none_delimit_by_s_stop:w}
+% Functions to gobble up to a scan mark.
+% \begin{macrocode}
+\cs_new:Npn \@@_use_none_delimit_by_s_stop:w #1 \s_@@_stop { }
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\peek_after:Nw}
% \begin{macro}{\peek_gafter:Nw}
% Simple wrappers for \tn{futurelet}: no arguments absorbed
@@ -2759,7 +2804,7 @@
% \texttt{true} branch, we must detect outer tokens, without impacting
% performance too much for non-outer tokens. The first filter is to
% search for \texttt{outer} in the \tn{meaning} of \cs{l_peek_token}.
-% If that is absent, \cs{use_none_delimit_by_q_stop:w} cleans up, and
+% If that is absent, \cs{@@_use_none_delimit_by_s_stop:w} cleans up, and
% we call \cs{@@_true:w}. Otherwise, the token can be a non-outer
% macro or a primitive mark whose parameter or replacement text
% contains \texttt{outer}, it can be the primitive \tn{outer}, or it
@@ -2772,7 +2817,7 @@
% \cs{@@_token_generic:NNTF} function.
% \begin{macrocode}
\group_begin:
- \cs_set_protected:Npn \@@_tmp:w #1 \q_stop
+ \cs_set_protected:Npn \@@_tmp:w #1 \s_@@_stop
{
\cs_new_protected:Npn \@@_execute_branches_N_type:
{
@@ -2783,18 +2828,18 @@
1 \exp_stop_f:
\exp_after:wN \@@_N_type:w
\token_to_meaning:N \l_peek_token
- \q_mark \@@_N_type_aux:nnw
- #1 \q_mark \use_none_delimit_by_q_stop:w
- \q_stop
+ \s_@@_mark \@@_N_type_aux:nnw
+ #1 \s_@@_mark \@@_use_none_delimit_by_s_stop:w
+ \s_@@_stop
\exp_after:wN \@@_true:w
\else:
\exp_after:wN \@@_false:w
\fi:
}
- \cs_new_protected:Npn \@@_N_type:w ##1 #1 ##2 \q_mark ##3
+ \cs_new_protected:Npn \@@_N_type:w ##1 #1 ##2 \s_@@_mark ##3
{ ##3 {##1} {##2} }
}
- \exp_after:wN \@@_tmp:w \tl_to_str:n { outer } \q_stop
+ \exp_after:wN \@@_tmp:w \tl_to_str:n { outer } \s_@@_stop
\group_end:
\cs_new_protected:Npn \@@_N_type_aux:nnw #1 #2 #3 \fi:
{
diff --git a/macros/latex/contrib/l3kernel/l3unicode.dtx b/macros/latex/contrib/l3kernel/l3unicode.dtx
index 346f310a93..bc0466eeca 100644
--- a/macros/latex/contrib/l3kernel/l3unicode.dtx
+++ b/macros/latex/contrib/l3kernel/l3unicode.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/source3.pdf b/macros/latex/contrib/l3kernel/source3.pdf
index efdf8a34ec..21358a14f7 100644
--- a/macros/latex/contrib/l3kernel/source3.pdf
+++ b/macros/latex/contrib/l3kernel/source3.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/source3.tex b/macros/latex/contrib/l3kernel/source3.tex
index 27cfc97124..91b33318e5 100644
--- a/macros/latex/contrib/l3kernel/source3.tex
+++ b/macros/latex/contrib/l3kernel/source3.tex
@@ -53,7 +53,7 @@ for those people who are interested.
{latex-team@latex-project.org}%
}%
}
-\date{Released 2020-05-05}
+\date{Released 2020-05-11}
\pagenumbering{roman}
\maketitle
diff --git a/macros/latex/contrib/l3kernel/source3body.tex b/macros/latex/contrib/l3kernel/source3body.tex
index 4edd3d5b6c..83203e6427 100644
--- a/macros/latex/contrib/l3kernel/source3body.tex
+++ b/macros/latex/contrib/l3kernel/source3body.tex
@@ -436,10 +436,10 @@ used on top of \LaTeXe{} if \cs{outer} tokens are used in the arguments.
\ExplSyntaxOff
\DocInput{l3basics.dtx}
\DocInput{l3expan.dtx}
+\DocInput{l3quark.dtx}
\DocInput{l3tl.dtx}
\DocInput{l3str.dtx}
\DocInput{l3str-convert.dtx}
-\DocInput{l3quark.dtx}
\DocInput{l3seq.dtx}
\DocInput{l3int.dtx}
\DocInput{l3flag.dtx}