From bffbeb435746ef4bfc3abbbce80006f657360f3a Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Mon, 11 May 2020 20:47:47 +0000 Subject: l3kernel (11may20) git-svn-id: svn://tug.org/texlive/trunk@55101 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md | 8 +- Master/texmf-dist/doc/latex/l3kernel/README.md | 2 +- Master/texmf-dist/doc/latex/l3kernel/expl3.pdf | Bin 584652 -> 584772 bytes .../texmf-dist/doc/latex/l3kernel/interface3.pdf | Bin 1544267 -> 1544205 bytes .../texmf-dist/doc/latex/l3kernel/interface3.tex | 2 +- .../texmf-dist/doc/latex/l3kernel/l3docstrip.pdf | Bin 263236 -> 263360 bytes Master/texmf-dist/doc/latex/l3kernel/l3news.pdf | Bin 379228 -> 379248 bytes Master/texmf-dist/doc/latex/l3kernel/l3news01.pdf | Bin 113529 -> 113529 bytes Master/texmf-dist/doc/latex/l3kernel/l3news02.pdf | Bin 140777 -> 140776 bytes Master/texmf-dist/doc/latex/l3kernel/l3news03.pdf | Bin 137983 -> 144784 bytes Master/texmf-dist/doc/latex/l3kernel/l3news04.pdf | Bin 107122 -> 107117 bytes Master/texmf-dist/doc/latex/l3kernel/l3news05.pdf | Bin 105090 -> 105090 bytes Master/texmf-dist/doc/latex/l3kernel/l3news06.pdf | Bin 140797 -> 140797 bytes Master/texmf-dist/doc/latex/l3kernel/l3news07.pdf | Bin 119092 -> 119092 bytes Master/texmf-dist/doc/latex/l3kernel/l3news08.pdf | Bin 152413 -> 152413 bytes Master/texmf-dist/doc/latex/l3kernel/l3news09.pdf | Bin 235516 -> 235323 bytes Master/texmf-dist/doc/latex/l3kernel/l3news10.pdf | Bin 140297 -> 147096 bytes Master/texmf-dist/doc/latex/l3kernel/l3news11.pdf | Bin 159154 -> 165956 bytes Master/texmf-dist/doc/latex/l3kernel/l3news12.pdf | Bin 192383 -> 199153 bytes .../texmf-dist/doc/latex/l3kernel/l3prefixes.pdf | Bin 75066 -> 75066 bytes .../texmf-dist/doc/latex/l3kernel/l3styleguide.pdf | Bin 279985 -> 280109 bytes .../texmf-dist/doc/latex/l3kernel/l3styleguide.tex | 2 +- .../doc/latex/l3kernel/l3syntax-changes.pdf | Bin 228282 -> 228403 bytes .../doc/latex/l3kernel/l3syntax-changes.tex | 2 +- .../doc/latex/l3kernel/l3term-glossary.pdf | Bin 186503 -> 186619 bytes .../doc/latex/l3kernel/l3term-glossary.tex | 2 +- Master/texmf-dist/doc/latex/l3kernel/source3.pdf | Bin 5830603 -> 5890263 bytes Master/texmf-dist/doc/latex/l3kernel/source3.tex | 2 +- .../texmf-dist/doc/latex/l3kernel/source3body.tex | 2 +- Master/texmf-dist/source/latex/l3kernel/expl3.dtx | 19 +- Master/texmf-dist/source/latex/l3kernel/l3.ins | 2 +- .../texmf-dist/source/latex/l3kernel/l3alloc.dtx | 2 +- .../texmf-dist/source/latex/l3kernel/l3basics.dtx | 85 +- .../source/latex/l3kernel/l3bootstrap.dtx | 2 +- Master/texmf-dist/source/latex/l3kernel/l3box.dtx | 2 +- .../source/latex/l3kernel/l3candidates.dtx | 43 +- .../texmf-dist/source/latex/l3kernel/l3clist.dtx | 171 +- .../texmf-dist/source/latex/l3kernel/l3coffins.dtx | 2 +- .../source/latex/l3kernel/l3color-base.dtx | 23 +- .../texmf-dist/source/latex/l3kernel/l3debug.dtx | 51 +- .../source/latex/l3kernel/l3deprecation.dtx | 18 +- Master/texmf-dist/source/latex/l3kernel/l3doc.dtx | 2 +- .../source/latex/l3kernel/l3docstrip.dtx | 2 +- .../texmf-dist/source/latex/l3kernel/l3expan.dtx | 116 +- Master/texmf-dist/source/latex/l3kernel/l3file.dtx | 160 +- .../texmf-dist/source/latex/l3kernel/l3final.dtx | 2 +- Master/texmf-dist/source/latex/l3kernel/l3flag.dtx | 2 +- .../texmf-dist/source/latex/l3kernel/l3format.ins | 2 +- .../source/latex/l3kernel/l3fp-assign.dtx | 2 +- .../texmf-dist/source/latex/l3kernel/l3fp-aux.dtx | 47 +- .../source/latex/l3kernel/l3fp-basics.dtx | 2 +- .../source/latex/l3kernel/l3fp-convert.dtx | 6 +- .../texmf-dist/source/latex/l3kernel/l3fp-expo.dtx | 6 +- .../source/latex/l3kernel/l3fp-extended.dtx | 2 +- .../source/latex/l3kernel/l3fp-logic.dtx | 28 +- .../source/latex/l3kernel/l3fp-parse.dtx | 46 +- .../source/latex/l3kernel/l3fp-random.dtx | 2 +- .../source/latex/l3kernel/l3fp-round.dtx | 2 +- .../source/latex/l3kernel/l3fp-traps.dtx | 2 +- .../texmf-dist/source/latex/l3kernel/l3fp-trig.dtx | 2 +- Master/texmf-dist/source/latex/l3kernel/l3fp.dtx | 2 +- .../texmf-dist/source/latex/l3kernel/l3fparray.dtx | 2 +- Master/texmf-dist/source/latex/l3kernel/l3int.dtx | 81 +- .../source/latex/l3kernel/l3intarray.dtx | 2 +- .../source/latex/l3kernel/l3kernel-functions.dtx | 100 +- Master/texmf-dist/source/latex/l3kernel/l3keys.dtx | 166 +- .../texmf-dist/source/latex/l3kernel/l3legacy.dtx | 2 +- .../texmf-dist/source/latex/l3kernel/l3luatex.dtx | 2 +- Master/texmf-dist/source/latex/l3kernel/l3msg.dtx | 51 +- .../texmf-dist/source/latex/l3kernel/l3names.dtx | 2 +- Master/texmf-dist/source/latex/l3kernel/l3prg.dtx | 46 +- Master/texmf-dist/source/latex/l3kernel/l3prop.dtx | 66 +- .../texmf-dist/source/latex/l3kernel/l3quark.dtx | 399 ++++- .../texmf-dist/source/latex/l3kernel/l3regex.dtx | 53 +- Master/texmf-dist/source/latex/l3kernel/l3seq.dtx | 34 +- Master/texmf-dist/source/latex/l3kernel/l3skip.dtx | 40 +- Master/texmf-dist/source/latex/l3kernel/l3sort.dtx | 78 +- .../source/latex/l3kernel/l3str-convert.dtx | 150 +- Master/texmf-dist/source/latex/l3kernel/l3str.dtx | 140 +- Master/texmf-dist/source/latex/l3kernel/l3sys.dtx | 2 +- .../source/latex/l3kernel/l3text-case.dtx | 56 +- .../source/latex/l3kernel/l3text-purify.dtx | 45 +- Master/texmf-dist/source/latex/l3kernel/l3text.dtx | 96 +- .../source/latex/l3kernel/l3tl-analysis.dtx | 2 +- Master/texmf-dist/source/latex/l3kernel/l3tl.dtx | 203 ++- .../texmf-dist/source/latex/l3kernel/l3token.dtx | 93 +- .../texmf-dist/source/latex/l3kernel/l3unicode.dtx | 2 +- .../texmf-dist/tex/latex/l3kernel/expl3-code.tex | 1813 ++++++++++++-------- .../tex/latex/l3kernel/expl3-generic.tex | 2 +- Master/texmf-dist/tex/latex/l3kernel/expl3.ltx | 9 +- Master/texmf-dist/tex/latex/l3kernel/expl3.sty | 9 +- Master/texmf-dist/tex/latex/l3kernel/l3debug.def | 25 +- 92 files changed, 3033 insertions(+), 1615 deletions(-) (limited to 'Master') diff --git a/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md b/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md index fdcb30461fd..5baa671d014 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md +++ b/Master/texmf-dist/doc/latex/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/Master/texmf-dist/doc/latex/l3kernel/README.md b/Master/texmf-dist/doc/latex/l3kernel/README.md index 2dc96da2b86..3a7c3730b9e 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/README.md +++ b/Master/texmf-dist/doc/latex/l3kernel/README.md @@ -1,7 +1,7 @@ LaTeX3 Programming Conventions ============================== -Release 2020-05-05 +Release 2020-05-11 Overview -------- diff --git a/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf b/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf index 7c1568abfbe..b16b80e0c70 100644 Binary files a/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf and b/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf differ diff --git a/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf b/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf index 302d3f088b6..f91da62ed4c 100644 Binary files a/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf and b/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf differ diff --git a/Master/texmf-dist/doc/latex/l3kernel/interface3.tex b/Master/texmf-dist/doc/latex/l3kernel/interface3.tex index 7b0c6e179b2..e1b46c0897f 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/interface3.tex +++ b/Master/texmf-dist/doc/latex/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/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf index 00c3018ede3..870f43aacb5 100644 Binary files a/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf and b/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf differ diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news.pdf index 1f47cf61592..d3d8cd3d8ae 100644 Binary files a/Master/texmf-dist/doc/latex/l3kernel/l3news.pdf and b/Master/texmf-dist/doc/latex/l3kernel/l3news.pdf differ diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news01.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news01.pdf index 5a6cf440449..e7e64883a38 100644 Binary files a/Master/texmf-dist/doc/latex/l3kernel/l3news01.pdf and b/Master/texmf-dist/doc/latex/l3kernel/l3news01.pdf differ diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news02.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news02.pdf index 242ad643409..54d75387b2d 100644 Binary files a/Master/texmf-dist/doc/latex/l3kernel/l3news02.pdf and b/Master/texmf-dist/doc/latex/l3kernel/l3news02.pdf differ diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news03.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news03.pdf index 10e4d27c06f..60aa4d7d5db 100644 Binary files a/Master/texmf-dist/doc/latex/l3kernel/l3news03.pdf and b/Master/texmf-dist/doc/latex/l3kernel/l3news03.pdf differ diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news04.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news04.pdf index 9d236ae6ecb..2165c12d768 100644 Binary files a/Master/texmf-dist/doc/latex/l3kernel/l3news04.pdf and b/Master/texmf-dist/doc/latex/l3kernel/l3news04.pdf differ diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news05.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news05.pdf index 5285b6494a5..56d2d5f6001 100644 Binary files a/Master/texmf-dist/doc/latex/l3kernel/l3news05.pdf and b/Master/texmf-dist/doc/latex/l3kernel/l3news05.pdf differ diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news06.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news06.pdf index 18cf35ef6c2..4c0f81e8cb4 100644 Binary files a/Master/texmf-dist/doc/latex/l3kernel/l3news06.pdf and b/Master/texmf-dist/doc/latex/l3kernel/l3news06.pdf differ diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news07.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news07.pdf index 558df172bdb..f90ddaf6b16 100644 Binary files a/Master/texmf-dist/doc/latex/l3kernel/l3news07.pdf and b/Master/texmf-dist/doc/latex/l3kernel/l3news07.pdf differ diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news08.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news08.pdf index 9003cc10ad2..0061ae2c850 100644 Binary files a/Master/texmf-dist/doc/latex/l3kernel/l3news08.pdf and b/Master/texmf-dist/doc/latex/l3kernel/l3news08.pdf differ diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news09.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news09.pdf index aa6826ec5c2..149274576f2 100644 Binary files a/Master/texmf-dist/doc/latex/l3kernel/l3news09.pdf and b/Master/texmf-dist/doc/latex/l3kernel/l3news09.pdf differ diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news10.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news10.pdf index ed057b204cb..c6b222cbb45 100644 Binary files a/Master/texmf-dist/doc/latex/l3kernel/l3news10.pdf and b/Master/texmf-dist/doc/latex/l3kernel/l3news10.pdf differ diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news11.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news11.pdf index 2b42dd8612a..ea68c023214 100644 Binary files a/Master/texmf-dist/doc/latex/l3kernel/l3news11.pdf and b/Master/texmf-dist/doc/latex/l3kernel/l3news11.pdf differ diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news12.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news12.pdf index 56b04c76ace..d8e01270114 100644 Binary files a/Master/texmf-dist/doc/latex/l3kernel/l3news12.pdf and b/Master/texmf-dist/doc/latex/l3kernel/l3news12.pdf differ diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.pdf index 0fe83d65c82..fbf3f14164b 100644 Binary files a/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.pdf and b/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.pdf differ diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf index ecd36e76eea..eb0878701d2 100644 Binary files a/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf and b/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf differ diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex b/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex index 18964588401..16d5983a046 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex +++ b/Master/texmf-dist/doc/latex/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/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf index 37dd80b173a..44c75ca2e30 100644 Binary files a/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf and b/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf differ diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex b/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex index e1aa7562c0a..0bc6adc9ac4 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex +++ b/Master/texmf-dist/doc/latex/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/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.pdf index 7955976684a..974430a84b7 100644 Binary files a/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.pdf and b/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.pdf differ diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex b/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex index 4d96050ff05..eab4b9053c3 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex +++ b/Master/texmf-dist/doc/latex/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/Master/texmf-dist/doc/latex/l3kernel/source3.pdf b/Master/texmf-dist/doc/latex/l3kernel/source3.pdf index efdf8a34eca..21358a14f78 100644 Binary files a/Master/texmf-dist/doc/latex/l3kernel/source3.pdf and b/Master/texmf-dist/doc/latex/l3kernel/source3.pdf differ diff --git a/Master/texmf-dist/doc/latex/l3kernel/source3.tex b/Master/texmf-dist/doc/latex/l3kernel/source3.tex index 27cfc971248..91b33318e56 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/source3.tex +++ b/Master/texmf-dist/doc/latex/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/Master/texmf-dist/doc/latex/l3kernel/source3body.tex b/Master/texmf-dist/doc/latex/l3kernel/source3body.tex index 4edd3d5b6c9..83203e64278 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/source3body.tex +++ b/Master/texmf-dist/doc/latex/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} diff --git a/Master/texmf-dist/source/latex/l3kernel/expl3.dtx b/Master/texmf-dist/source/latex/l3kernel/expl3.dtx index 3c90cc81a3e..a24e520f458 100644 --- a/Master/texmf-dist/source/latex/l3kernel/expl3.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/expl3.dtx @@ -24,7 +24,7 @@ % %<*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/Master/texmf-dist/source/latex/l3kernel/l3.ins b/Master/texmf-dist/source/latex/l3kernel/l3.ins index 86d4ac52801..04d1e18a343 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3.ins +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx b/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx index fee2e0fdfa2..188477adcf5 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-05-05} +% \date{Released 2020-05-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx b/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx index 5784ade6f52..22b7a75d15d 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx b/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx index 224163be1bc..4ff6267be1c 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-05-05} +% \date{Released 2020-05-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3box.dtx b/Master/texmf-dist/source/latex/l3kernel/l3box.dtx index 3c8e9d93f2f..7c6b12dd787 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3box.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3box.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-05-05} +% \date{Released 2020-05-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx b/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx index 7ae1a7afe84..c97fb26e258 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx b/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx index ec24d2de47c..0b011f80e0e 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx b/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx index fb7d09bcc7e..47fca974655 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-05-05} +% \date{Released 2020-05-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx b/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx index 124d07bccd2..0555edc19cb 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx b/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx index 2e80e1b8a36..df79d6a031d 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx b/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx index ab3f7a3dee8..f84e9faea3a 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx b/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx index 94217cd8c52..9ef8771afb4 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx b/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx index ab79ecabf17..044e3fbab5f 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx @@ -63,7 +63,7 @@ % }^^A % } % -% \date{Released 2020-05-05} +% \date{Released 2020-05-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx b/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx index 7eb3465b7c3..0841f43fc44 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3file.dtx b/Master/texmf-dist/source/latex/l3kernel/l3file.dtx index a3e398c2e8b..c816d771fbe 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3file.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3final.dtx b/Master/texmf-dist/source/latex/l3kernel/l3final.dtx index 4cd9eead10b..d48aac03f51 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3final.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3final.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-05-05} +% \date{Released 2020-05-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx b/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx index 8309ffad516..7a76d293869 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-05-05} +% \date{Released 2020-05-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3format.ins b/Master/texmf-dist/source/latex/l3kernel/l3format.ins index a4f728a0d07..99e9389728f 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3format.ins +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx index ce09c026277..725abc23b9e 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx index 44b55728cd9..02817722757 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx index 65165842fca..55823ba7fb2 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx index e070533c591..fc629937c47 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx index 00ff6675023..a1defe98894 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx index 2c906bf4802..8904c442005 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx index 632346bc4a8..a503e3a3d49 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx index 8c5a03bd24f..978d4dfe7f3 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx index 8ff26feeddc..11bf7d311d1 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx index 89453a55ca1..a5b0bc64859 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-05-05} +% \date{Released 2020-05-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx index 441a2e94360..51d25a090ee 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx index 1a34892a4b2..156485e6286 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx index b781dda55de..f9bcbee4677 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx @@ -49,7 +49,7 @@ % }^^A % } % -% \date{Released 2020-05-05} +% \date{Released 2020-05-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx index 74c09b293cc..d41c366b739 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2020-05-05} +% \date{Released 2020-05-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3int.dtx b/Master/texmf-dist/source/latex/l3kernel/l3int.dtx index 6ec7cd65285..faab276e44a 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3int.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx b/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx index 900151aa0c4..1c68482f551 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2020-05-05} +% \date{Released 2020-05-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx b/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx index fa09742458f..d5cc6170ad4 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx b/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx index f00f95309c2..b3630af0b16 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx b/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx index f1505be1b1c..1c017035de8 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-05-05} +% \date{Released 2020-05-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx b/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx index c3a5ec49857..5b3c8243fe0 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-05-05} +% \date{Released 2020-05-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx b/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx index 8dd4c2df83d..feb233bf54c 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3names.dtx b/Master/texmf-dist/source/latex/l3kernel/l3names.dtx index 1ff80abdbf0..2878654f585 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3names.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3names.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-05-05} +% \date{Released 2020-05-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx b/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx index 1ea045aa74d..d14576f08c0 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx b/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx index 9cc9111f345..c586164260d 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx b/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx index a6c66f1561e..f513fcb026a 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx b/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx index 3b4fc4fbc88..7c2d8e7504a 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx b/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx index 071f202e81c..56c4bc1fda7 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx b/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx index 152b90a3c0f..8cfd78d6f14 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx b/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx index 2dbb5b69311..6b41acfe3ee 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx b/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx index 9092f8fdbc4..4620342091a 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3str.dtx b/Master/texmf-dist/source/latex/l3kernel/l3str.dtx index 66909707c0b..d4cbc2bb49f 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3str.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx b/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx index 4b36af5e148..feef7117355 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-05-05} +% \date{Released 2020-05-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx b/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx index 950635ec939..ad71e493198 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx b/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx index 0de48966179..070e41956fb 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3text.dtx b/Master/texmf-dist/source/latex/l3kernel/l3text.dtx index 73f20645612..5113e03cc9c 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3text.dtx +++ b/Master/texmf-dist/source/latex/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 % %<*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 } % \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 } % @@ -850,7 +896,7 @@ % \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/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx b/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx index 969e15a485f..6fbe2f1bbb8 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2020-05-05} +% \date{Released 2020-05-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx b/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx index 7c5217cb1d9..53f61e97508 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3token.dtx b/Master/texmf-dist/source/latex/l3kernel/l3token.dtx index 61565b47c0f..0608820bbac 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3token.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx b/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx index 346f310a938..bc0466eecae 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-05-05} +% \date{Released 2020-05-11} % % \maketitle % diff --git a/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex b/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex index 7c496cc6033..4e1b9a8bdc0 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex +++ b/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex @@ -9,9 +9,9 @@ %% l3names.dtx (with options: `package') %% l3basics.dtx (with options: `package') %% l3expan.dtx (with options: `package') +%% l3quark.dtx (with options: `package') %% l3tl.dtx (with options: `package') %% l3str.dtx (with options: `package') -%% l3quark.dtx (with options: `package') %% l3seq.dtx (with options: `package') %% l3int.dtx (with options: `package') %% l3flag.dtx (with options: `package') @@ -68,7 +68,7 @@ %% and all files in that bundle must be distributed together. %% %% File: expl3.dtx -\def\ExplFileDate{2020-05-05}% +\def\ExplFileDate{2020-05-11}% \begingroup \def\next{\endgroup}% \expandafter\ifx\csname PackageError\endcsname\relax @@ -2116,6 +2116,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 \tex_let:D \if_mode_math: \tex_ifmmode:D \tex_let:D \if_mode_horizontal: \tex_ifhmode:D \tex_let:D \if_mode_vertical: \tex_ifvmode:D @@ -2260,6 +2261,8 @@ { \exp_after:wN \use_i:nn \exp:w } \cs_set:Npn \prg_return_false: { \exp_after:wN \use_ii:nn \exp:w} +\cs_set:Npn \__prg_use_none_delimit_by_q_recursion_stop:w + #1 \q__prg_recursion_stop { } \cs_set_protected:Npn \prg_set_conditional:Npnn { \__prg_generate_conditional_parm:NNNpnn \cs_set:Npn e } \cs_set_protected:Npn \prg_new_conditional:Npnn @@ -2318,24 +2321,24 @@ \exp_not:N \__prg_generate_conditional:NNnnnnNw \exp_not:n { #4 #5 {#1} {#2} {#6} } \__prg_generate_conditional_test:w - #8 \q_mark + #8 \s__prg_mark \__prg_generate_conditional_fast:nw - \prg_return_true: \else: \prg_return_false: \fi: \q_mark + \prg_return_true: \else: \prg_return_false: \fi: \s__prg_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__prg_recursion_tail , \q__prg_recursion_stop } } } \cs_set:Npn \__prg_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__prg_mark #2 { #2 {#1} } \cs_set:Npn \__prg_generate_conditional_fast:nw #1#2 \exp_not:n #3 { \exp_not:n { {#1} \use_i:nn } } \cs_set_protected:Npn \__prg_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__prg_recursion_tail #8 + \exp_after:wN \__prg_use_none_delimit_by_q_recursion_stop:w \fi: \use:c { __prg_generate_ #8 _form:wNNnnnnN } \tl_if_empty:nF {#8} @@ -2345,12 +2348,12 @@ {#8} { \token_to_str:c { #3 : #4 } } } \use_none:nnnnnnnn - \q_stop + \s__prg_stop #1 #2 {#3} {#4} {#5} {#6} #7 \__prg_generate_conditional:NNnnnnNw #1 #2 {#3} {#4} {#5} {#6} #7 } \cs_set_protected:Npn \__prg_generate_p_form:wNNnnnnN - #1 \q_stop #2#3#4#5#6#7#8 + #1 \s__prg_stop #2#3#4#5#6#7#8 { \if_meaning:w e #3 \exp_after:wN \use_i:nn @@ -2369,7 +2372,7 @@ } } \cs_set_protected:Npn \__prg_generate_T_form:wNNnnnnN - #1 \q_stop #2#3#4#5#6#7#8 + #1 \s__prg_stop #2#3#4#5#6#7#8 { #8 { \exp_args:Nc #2 { #4 : #5 T } #6 } @@ -2377,7 +2380,7 @@ { #7 \exp_after:wN \use_ii:nn \fi: \use_none:n } } \cs_set_protected:Npn \__prg_generate_F_form:wNNnnnnN - #1 \q_stop #2#3#4#5#6#7#8 + #1 \s__prg_stop #2#3#4#5#6#7#8 { #8 { \exp_args:Nc #2 { #4 : #5 F } #6 } @@ -2385,7 +2388,7 @@ { #7 \exp_after:wN \use_none:nn \fi: \use:n } } \cs_set_protected:Npn \__prg_generate_TF_form:wNNnnnnN - #1 \q_stop #2#3#4#5#6#7#8 + #1 \s__prg_stop #2#3#4#5#6#7#8 { #8 { \exp_args:Nc #2 { #4 : #5 TF } #6 } @@ -2406,7 +2409,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__prg_recursion_tail , \q__prg_recursion_stop } } } \cs_set_protected:Npn \__prg_set_eq_conditional:nnNnnNNw #1#2#3#4#5#6 @@ -2414,19 +2417,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 \__prg_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 \__prg_use_none_delimit_by_q_recursion_stop:w \fi: \__prg_set_eq_conditional_loop:nnnnNw {#1} {#2} {#4} {#5} } \cs_set_protected:Npn \__prg_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__prg_recursion_tail #6 + \exp_after:wN \__prg_use_none_delimit_by_q_recursion_stop:w \fi: \use:c { __prg_set_eq_conditional_ #6 _form:wNnnnn } \tl_if_empty:nF {#6} @@ -2436,17 +2439,17 @@ {#6} { \token_to_str:c { #1 : #2 } } } \use_none:nnnnnn - \q_stop + \s__prg_stop #5 {#1} {#2} {#3} {#4} \__prg_set_eq_conditional_loop:nnnnNw {#1} {#2} {#3} {#4} #5 } -\cs_set:Npn \__prg_set_eq_conditional_p_form:wNnnnn #1 \q_stop #2#3#4#5#6 +\cs_set:Npn \__prg_set_eq_conditional_p_form:wNnnnn #1 \s__prg_stop #2#3#4#5#6 { #2 { #3 _p : #4 } { #5 _p : #6 } } -\cs_set:Npn \__prg_set_eq_conditional_TF_form:wNnnnn #1 \q_stop #2#3#4#5#6 +\cs_set:Npn \__prg_set_eq_conditional_TF_form:wNnnnn #1 \s__prg_stop #2#3#4#5#6 { #2 { #3 : #4 TF } { #5 : #6 TF } } -\cs_set:Npn \__prg_set_eq_conditional_T_form:wNnnnn #1 \q_stop #2#3#4#5#6 +\cs_set:Npn \__prg_set_eq_conditional_T_form:wNnnnn #1 \s__prg_stop #2#3#4#5#6 { #2 { #3 : #4 T } { #5 : #6 T } } -\cs_set:Npn \__prg_set_eq_conditional_F_form:wNnnnn #1 \q_stop #2#3#4#5#6 +\cs_set:Npn \__prg_set_eq_conditional_F_form:wNnnnn #1 \s__prg_stop #2#3#4#5#6 { #2 { #3 : #4 F } { #5 : #6 F } } \tex_chardef:D \c_true_bool = 1 ~ \tex_chardef:D \c_false_bool = 0 ~ @@ -2465,13 +2468,13 @@ { \exp_after:wN \exp_after:wN \exp_after:wN \__cs_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__cs_mark \c_true_bool + #1 \s__cs_mark \c_false_bool \s__cs_stop } \cs_set:Npn \__cs_split_function_auxi:w - ##1 #1 ##2 \q_mark ##3##4 \q_stop - { \__cs_split_function_auxii:w ##1 \q_mark \q_stop {##2} ##3 } - \cs_set:Npn \__cs_split_function_auxii:w ##1 \q_mark ##2 \q_stop + ##1 #1 ##2 \s__cs_mark ##3##4 \s__cs_stop + { \__cs_split_function_auxii:w ##1 \s__cs_mark \s__cs_stop {##2} ##3 } + \cs_set:Npn \__cs_split_function_auxii:w ##1 \s__cs_mark ##2 \s__cs_stop { {##1} } } \exp_after:wN \__cs_tmp:w \token_to_str:N : @@ -2864,7 +2867,7 @@ \use:x { \exp_not:n { \cs_new:Npn \__kernel_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__kernel_stop #4 } } { #4 {#1} {#2} {#3} } \cs_new:Npn \cs_prefix_spec:N #1 @@ -2872,7 +2875,7 @@ \token_if_macro:NTF #1 { \exp_after:wN \__kernel_prefix_arg_replacement:wN - \token_to_meaning:N #1 \q_stop \use_i:nnn + \token_to_meaning:N #1 \s__kernel_stop \use_i:nnn } { \scan_stop: } } @@ -2881,7 +2884,7 @@ \token_if_macro:NTF #1 { \exp_after:wN \__kernel_prefix_arg_replacement:wN - \token_to_meaning:N #1 \q_stop \use_ii:nnn + \token_to_meaning:N #1 \s__kernel_stop \use_ii:nnn } { \scan_stop: } } @@ -2890,7 +2893,7 @@ \token_if_macro:NTF #1 { \exp_after:wN \__kernel_prefix_arg_replacement:wN - \token_to_meaning:N #1 \q_stop \use_iii:nnn + \token_to_meaning:N #1 \s__kernel_stop \use_iii:nnn } { \scan_stop: } } @@ -3519,6 +3522,13 @@ \cs_new_eq:NN \__exp_e_the_pdfpagesattr: ? \cs_new_eq:NN \__exp_e_the_pdfpkmode: ? } +\cs_new_eq:NN \s__cs_mark \scan_stop: +\cs_new_eq:NN \s__cs_stop \scan_stop: +\cs_new:Npn \q__cs_recursion_stop { \q__cs_recursion_stop } +\cs_new:Npn \__cs_use_none_delimit_by_s_stop:w #1 \s__cs_stop { } +\cs_new:Npn \__cs_use_i_delimit_by_s_stop:nw #1 #2 \s__cs_stop {#1} +\cs_new:Npn \__cs_use_none_delimit_by_q_recursion_stop:w + #1 \q__cs_recursion_stop { } \cs_new_protected:Npn \cs_generate_variant:Nn #1#2 { \__cs_generate_variant:N #1 @@ -3529,7 +3539,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__cs_recursion_stop } } \cs_new_protected:Npn \cs_generate_variant:cn @@ -3542,34 +3552,34 @@ \exp_not:N \else: \exp_not:N \exp_after:wN \exp_not:N \__cs_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__cs_mark + \s__cs_mark \cs_new_protected:Npx \tl_to_str:n { pr } - \exp_not:N \q_mark \cs_new:Npx - \exp_not:N \q_stop + \s__cs_mark \cs_new:Npx + \s__cs_stop \exp_not:N \fi: } \exp_last_unbraced:NNNNo \cs_new_protected:Npn \__cs_generate_variant:ww - #1 { \tl_to_str:n { ma } } #2 \q_mark + #1 { \tl_to_str:n { ma } } #2 \s__cs_mark { \__cs_generate_variant:wwNw #1 } \exp_last_unbraced:NNNNo \cs_new_protected:Npn \__cs_generate_variant:wwNw - #1 { \tl_to_str:n { pr } } #2 \q_mark #3 #4 \q_stop + #1 { \tl_to_str:n { pr } } #2 \s__cs_mark #3 #4 \s__cs_stop { \cs_set_eq:NN \__cs_tmp:w #3 } \cs_new_protected:Npn \__cs_generate_variant:nnNN #1#2#3#4 { \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 \__cs_use_none_delimit_by_q_recursion_stop:w \fi: \__cs_generate_variant:Nnnw #4 {#1}{#2} } \cs_new_protected:Npn \__cs_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 \__cs_use_none_delimit_by_q_recursion_stop:w \fi: \use:x { @@ -3577,16 +3587,16 @@ \__cs_generate_variant_loop:nNwN { } #4 \__cs_generate_variant_loop_end:nwwwNNnn - \q_mark + \s__cs_mark #3 ~ { ~ { } \fi: \__cs_generate_variant_loop_long:wNNnn } ~ { } - \q_stop + \s__cs_stop \exp_not:N #1 {#2} {#4} } \__cs_generate_variant:Nnnw #1 {#2} {#3} } -\cs_new:Npn \__cs_generate_variant_loop:nNwN #1#2#3 \q_mark #4 +\cs_new:Npn \__cs_generate_variant_loop:nNwN #1#2#3 \s__cs_mark #4 { \if:w #2 #4 \exp_after:wN \__cs_generate_variant_loop_same:w @@ -3605,7 +3615,7 @@ #1 \prg_do_nothing: #2 - \__cs_generate_variant_loop:nNwN { } #3 \q_mark + \__cs_generate_variant_loop:nNwN { } #3 \s__cs_mark } \cs_new:Npn \__cs_generate_variant_loop_base:N #1 { @@ -3633,46 +3643,45 @@ #1 \prg_do_nothing: #2#3#4 { #3 { #1 \__cs_generate_variant_same:N #2 } } \cs_new:Npn \__cs_generate_variant_loop_end:nwwwNNnn - #1#2 \q_mark #3 ~ #4 \q_stop #5#6#7#8 + #1#2 \s__cs_mark #3 ~ #4 \s__cs_stop #5#6#7#8 { \scan_stop: \scan_stop: \fi: - \exp_not:N \q_mark - \exp_not:N \q_stop + \s__cs_mark \s__cs_stop \exp_not:N #6 \exp_not:c { #7 : #8 #1 #3 } } -\cs_new:Npn \__cs_generate_variant_loop_long:wNNnn #1 \q_stop #2#3#4#5 +\cs_new:Npn \__cs_generate_variant_loop_long:wNNnn #1 \s__cs_stop #2#3#4#5 { \exp_not:n { - \q_mark + \s__cs_mark \__kernel_msg_error:nnxx { kernel } { variant-too-long } {#5} { \token_to_str:N #3 } \use_none:nnn - \q_stop + \s__cs_stop #3 #3 } } \cs_new:Npn \__cs_generate_variant_loop_invalid:NNwNNnn - #1#2 \fi: \fi: \fi: #3 \q_stop #4#5#6#7 + #1#2 \fi: \fi: \fi: #3 \s__cs_stop #4#5#6#7 { \fi: \fi: \fi: \exp_not:n { - \q_mark + \s__cs_mark \__kernel_msg_error:nnxxxx { kernel } { invalid-variant } {#7} { \token_to_str:N #5 } {#1} {#2} \use_none:nnn - \q_stop + \s__cs_stop #5 #5 } } \cs_new:Npn \__cs_generate_variant_loop_special:NNwNNnn - #1#2#3 \q_stop #4#5#6#7 + #1#2#3 \s__cs_stop #4#5#6#7 { - #3 \q_stop #4 #5 {#6} {#7} + #3 \s__cs_stop #4 #5 {#6} {#7} \exp_not:n { \__kernel_msg_error:nnxxxx @@ -3692,7 +3701,7 @@ \fi: } \cs_new_protected:Npn \__cs_generate_variant:wwNN - #1 \q_mark #2 \q_stop #3#4 + #1 \s__cs_mark #2 \s__cs_stop #3#4 { #2 \cs_if_free:NT #4 @@ -3706,20 +3715,20 @@ \cs_new_protected:Npx \__cs_generate_internal_variant:n #1 { \exp_not:N \__cs_generate_internal_variant:wwnNwn - #1 \exp_not:N \q_mark + #1 \s__cs_mark { \cs_set_eq:NN \exp_not:N \__cs_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__cs_mark { } \cs_new:cpn \exp_not:N \tex_expanded:D - \exp_not:N \q_stop + \s__cs_stop {#1} } \exp_last_unbraced:NNNNo \cs_new_protected:Npn \__cs_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__cs_mark #3#4#5#6 \s__cs_stop #7 { #3 \cs_if_free:cT { exp_args:N #7 } @@ -3738,7 +3747,7 @@ \exp_after:wN \__cs_generate_internal_test_aux:w \exp_after:wN #1 \fi: ##3 - \q_mark + \s__cs_mark { \use:x { @@ -3747,12 +3756,12 @@ } } #1 - \q_mark + \s__cs_mark { \exp_not:n { \__cs_generate_internal_one_go:NNn ##1 ##2 {##3} } } - \q_stop + \s__cs_stop } \cs_new_protected:Npn \__cs_generate_internal_test_aux:w - ##1 #1 ##2 \q_mark ##3 ##4 \q_stop {##3} + ##1 #1 ##2 \s__cs_mark ##3 ##4 \s__cs_stop {##3} \cs_if_exist:NTF \tex_expanded:D { \cs_new_eq:NN \__cs_generate_internal_test:Nw @@ -3837,20 +3846,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 + \__cs_use_i_delimit_by_s_stop:nw \fi: \exp_after:wN \__cs_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__cs_recursion_stop + \__cs_use_none_delimit_by_s_stop:w \s__cs_mark {#1} {#2} {#4} \s__cs_stop } \cs_new_protected:Npn \__cs_generate_variant:w - #1 , #2 \q_mark #3#4#5 + #1 , #2 \s__cs_mark #3#4#5 { \if_meaning:w \scan_stop: #1 \scan_stop: - \if_meaning:w \q_nil #1 \q_nil + \if_meaning:w \q__cs_nil #1 \q__cs_nil \use_i:nnn \fi: - \exp_after:wN \use_none_delimit_by_q_recursion_stop:w + \exp_after:wN \__cs_use_none_delimit_by_q_recursion_stop:w \else: \cs_if_exist_use:cTF { __cs_generate_variant_#1_form:nnn } { {#3} {#4} {#5} } @@ -3860,7 +3869,7 @@ {#1} { \token_to_str:c { #3 : #4 } } } \fi: - \__cs_generate_variant:w #2 \q_mark {#3} {#4} {#5} + \__cs_generate_variant:w #2 \s__cs_mark {#3} {#4} {#5} } \cs_new_protected:Npn \__cs_generate_variant_p_form:nnn #1#2 { \cs_generate_variant:cn { #1 _p : #2 } } @@ -3937,6 +3946,302 @@ \__cs_tmp:w { ccx } \__cs_tmp:w { cnx } \__cs_tmp:w { oox } +%% File: l3quark.dtx +\cs_new_protected:Npn \quark_new:N #1 + { + \__kernel_chk_if_free_cs:N #1 + \cs_gset_nopar:Npn #1 {#1} + } +\quark_new:N \q_nil +\quark_new:N \q_mark +\quark_new:N \q_no_value +\quark_new:N \q_stop +\quark_new:N \q_recursion_tail +\quark_new:N \q_recursion_stop +\cs_new_eq:NN \s__quark \scan_stop: +\quark_new:N \q__quark_nil +\cs_new:Npn \quark_if_recursion_tail_stop:N #1 + { + \if_meaning:w \q_recursion_tail #1 + \exp_after:wN \use_none_delimit_by_q_recursion_stop:w + \fi: + } +\cs_new:Npn \quark_if_recursion_tail_stop_do:Nn #1 + { + \if_meaning:w \q_recursion_tail #1 + \exp_after:wN \use_i_delimit_by_q_recursion_stop:nw + \else: + \exp_after:wN \use_none:n + \fi: + } +\cs_new:Npn \quark_if_recursion_tail_stop:n #1 + { + \tl_if_empty:oTF + { \__quark_if_recursion_tail:w {} #1 {} ?! \q_recursion_tail ??! } + { \use_none_delimit_by_q_recursion_stop:w } + { } + } +\cs_new:Npn \quark_if_recursion_tail_stop_do:nn #1 + { + \tl_if_empty:oTF + { \__quark_if_recursion_tail:w {} #1 {} ?! \q_recursion_tail ??! } + { \use_i_delimit_by_q_recursion_stop:nw } + { \use_none:n } + } +\cs_new:Npn \__quark_if_recursion_tail:w + #1 \q_recursion_tail #2 ? #3 ?! { #1 #2 } +\cs_generate_variant:Nn \quark_if_recursion_tail_stop:n { o } +\cs_generate_variant:Nn \quark_if_recursion_tail_stop_do:nn { o } +\cs_new:Npn \quark_if_recursion_tail_break:NN #1#2 + { + \if_meaning:w \q_recursion_tail #1 + \exp_after:wN #2 + \fi: + } +\cs_new:Npn \quark_if_recursion_tail_break:nN #1#2 + { + \tl_if_empty:oT + { \__quark_if_recursion_tail:w {} #1 {} ?! \q_recursion_tail ??! } + {#2} + } +\prg_new_conditional:Npnn \quark_if_nil:N #1 { p, T , F , TF } + { + \if_meaning:w \q_nil #1 + \prg_return_true: + \else: + \prg_return_false: + \fi: + } +\prg_new_conditional:Npnn \quark_if_no_value:N #1 { p, T , F , TF } + { + \if_meaning:w \q_no_value #1 + \prg_return_true: + \else: + \prg_return_false: + \fi: + } +\prg_generate_conditional_variant:Nnn \quark_if_no_value:N + { c } { p , T , F , TF } +\prg_new_conditional:Npnn \quark_if_nil:n #1 { p, T , F , TF } + { + \__quark_if_empty_if:o + { \__quark_if_nil:w {} #1 {} ? ! \q_nil ? ? ! } + \prg_return_true: + \else: + \prg_return_false: + \fi: + } +\cs_new:Npn \__quark_if_nil:w #1 \q_nil #2 ? #3 ? ! { #1 #2 } +\prg_new_conditional:Npnn \quark_if_no_value:n #1 { p, T , F , TF } + { + \__quark_if_empty_if:o + { \__quark_if_no_value:w {} #1 {} ? ! \q_no_value ? ? ! } + \prg_return_true: + \else: + \prg_return_false: + \fi: + } +\cs_new:Npn \__quark_if_no_value:w #1 \q_no_value #2 ? #3 ? ! { #1 #2 } +\prg_generate_conditional_variant:Nnn \quark_if_nil:n + { V , o } { p , TF , T , F } +\cs_new:Npn \__quark_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 + } +\cs_new_protected:Npn \__kernel_quark_new_test:N #1 + { \__quark_new_test_aux:Nx #1 { \__quark_module_name:N #1 } } +\cs_new_protected:Npn \__quark_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: + \__quark_new_test:Nccn #1 + { q__#2_recursion_tail } { q__#2_recursion_stop } { __#2 } + \fi: + } +\cs_generate_variant:Nn \__quark_new_test_aux:Nn { Nx } +\cs_new_protected:Npn \__quark_new_test:NNNn #1 + { + \exp_last_unbraced:Nf \__quark_new_test_aux:nnNNnnnn + { \cs_split_function:N #1 } + #1 { test } + } +\cs_generate_variant:Nn \__quark_new_test:NNNn { Ncc } +\cs_new_protected:Npn \__kernel_quark_new_conditional:Nn #1 + { + \__quark_new_conditional:Nxxn #1 + { \__quark_quark_conditional_name:N #1 } + { \__quark_module_name:N #1 } + } +\cs_new_protected:Npn \__quark_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 \__quark_new_test_aux:nnNNnnnn + { \cs_split_function:N #1 } + #1 { conditional } + {#2} {#3} {#4} + \fi: + \fi: + } +\cs_generate_variant:Nn \__quark_new_conditional:Nnnn { Nxx } +\cs_new_protected:Npn \__quark_new_test_aux:nnNNnnnn #1 #2 #3 #4 #5 + { + \cs_if_exist_use:cTF { __quark_new_#5_#2:Nnnn } { #4 } + { + \__kernel_msg_error:nnxx { kernel } { invalid-quark-function } + { \token_to_str:N #4 } {#2} + \use_none:nnn + } + } +\cs_new_protected:Npn \__quark_new_test_n:Nnnn #1 #2 #3 #4 + { + \__quark_new_test_aux_do:nNNnnnnNNn {#4} #2 #3 { none } { } { } { } + \__quark_new_test_define_tl:nNnNNn #1 { } + } +\cs_new_protected:Npn \__quark_new_test_nn:Nnnn #1 #2 #3 #4 + { + \__quark_new_test_aux_do:nNNnnnnNNn {#4} #2 #3 { i } { n } {##1} {##2} + \__quark_new_test_define_tl:nNnNNn #1 { \use_none:n } + } +\cs_new_protected:Npn \__quark_new_test_nN:Nnnn #1 #2 #3 #4 + { + \__quark_new_test_aux_do:nNNnnnnNNn {#4} #2 #3 { i } { n } {##1} {##2} + \__quark_new_test_define_break_tl:nNNNNn #1 { } + } +\cs_new_protected:Npn \__quark_new_test_N:Nnnn #1 #2 #3 #4 + { + \__quark_new_test_aux_do:nNNnnnnNNn {#4} #2 #3 { none } { } { } { } + \__quark_new_test_define_ifx:nNnNNn #1 { } + } +\cs_new_protected:Npn \__quark_new_test_Nn:Nnnn #1 #2 #3 #4 + { + \__quark_new_test_aux_do:nNNnnnnNNn {#4} #2 #3 { i } { n } {##1} {##2} + \__quark_new_test_define_ifx:nNnNNn #1 + { \else: \exp_after:wN \use_none:n } + } +\cs_new_protected:Npn \__quark_new_test_NN:Nnnn #1 #2 #3 #4 + { + \__quark_new_test_aux_do:nNNnnnnNNn {#4} #2 #3 { i } { n } {##1} {##2} + \__quark_new_test_define_break_ifx:nNNNNn #1 { } + } +\cs_new_protected:Npn \__quark_new_test_aux_do:nNNnnnnNNn #1 #2 #3 #4 #5 + { + \exp_args:Ncc \__quark_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 \__quark_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 + } +\cs_new_protected:Npn \__quark_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 \__quark_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 \__quark_new_test_define_break_tl:nNNNNn #1 #2 #3 + { \__quark_new_test_define_tl:nNnNNn {##1##2} #2 {##2} } +\cs_new_protected:Npn \__quark_new_test_define_break_ifx:nNNNNn #1 #2 #3 + { \__quark_new_test_define_ifx:nNnNNn {##1##2} #2 {##2} } +\cs_new_protected:Npn \__quark_new_conditional_n:Nnnn + { \__quark_new_conditional_aux_do:NNnnn \use_i:nn } +\cs_new_protected:Npn \__quark_new_conditional_N:Nnnn + { \__quark_new_conditional_aux_do:NNnnn \use_ii:nn } +\cs_new_protected:Npn \__quark_new_conditional_aux_do:NNnnn #1 #2 #3 #4 + { + \exp_args:Ncc \__quark_new_conditional_define:NNNNn + { __ #4 _if_quark_ #3 :w } { q__ #4 _ #3 } #2 #1 + } +\cs_new_protected:Npn \__quark_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 { \__quark_if_empty_if:o { #1 {} ##1 {} ?! #2 ??! } } + { \if_meaning:w #2 ##1 } + \prg_return_true: \else: \prg_return_false: \fi: + } + } +\cs_set:Npn \__quark_tmp:w #1#2 + { + \cs_new:Npn \__quark_module_name:N ##1 + { + \exp_last_unbraced:Nf \__quark_module_name:w + { \cs_to_str:N ##1 } #1 \s__quark + } + \cs_new:Npn \__quark_module_name:w ##1 #1 ##2 \s__quark + { \__quark_module_name_loop:w ##1 #2 \use_none:n { } #2 \s__quark } + \cs_new:Npn \__quark_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 \__quark_module_name_loop:w + \else: + \__quark_module_name_end:w ##1 + \fi: + } + \cs_new:Npn \__quark_module_name_end:w + ##1 \fi: ##2 \s__quark { \fi: ##1 } + } +\exp_after:wN \__quark_tmp:w \tl_to_str:n { : _ } +\cs_set:Npn \__quark_tmp:w #1 #2 \s__quark + { + \cs_new:Npn \__quark_quark_conditional_name:N ##1 + { + \exp_last_unbraced:Nf \__quark_quark_conditional_name:w + { \cs_to_str:N ##1 } #1 #2 #1 \s__quark + } + \cs_new:Npn \__quark_quark_conditional_name:w + ##1 #2 ##2 #1 ##3 \s__quark {##2} + } +\exp_after:wN \__quark_tmp:w \tl_to_str:n { : _quark_if_ } \s__quark +\cs_gset:Npn \g__scan_marks_tl { } +\cs_new_protected:Npn \scan_new:N #1 + { + \tl_if_in:NnTF \g__scan_marks_tl { #1 } + { + \__kernel_msg_error:nnx { kernel } { scanmark-already-defined } + { \token_to_str:N #1 } + } + { + \tl_gput_right:Nn \g__scan_marks_tl {#1} + \cs_new_eq:NN #1 \scan_stop: + } + } +\cs_new_eq:NN \s_stop \scan_stop: +\cs_gset_nopar:Npx \g__scan_marks_tl + { + \exp_not:o \g__scan_marks_tl + \s_stop + \s__quark + } +\cs_new:Npn \use_none_delimit_by_s_stop:w #1 \s_stop { } %% File: l3tl.dtx \cs_new_protected:Npn \tl_new:N #1 { @@ -4057,6 +4362,13 @@ \cs_generate_variant:Nn \tl_gput_right:NV { c } \cs_generate_variant:Nn \tl_gput_right:No { c } \cs_generate_variant:Nn \tl_gput_right:Nx { c } +\quark_new:N \q__tl_nil +\quark_new:N \q__tl_mark +\quark_new:N \q__tl_stop +\quark_new:N \q__tl_recursion_tail +\quark_new:N \q__tl_recursion_stop +\__kernel_quark_new_test:N \__tl_if_recursion_tail_break:nN +\__kernel_quark_new_conditional:Nn \__tl_quark_if_nil:n { TF } \tl_const:Nx \c__tl_rescan_marker_tl { : \token_to_str:N : } \cs_new_protected:Npn \tl_rescan:nn #1#2 { @@ -4138,9 +4450,9 @@ { #1 \use_none:n #2 #1 { \exp:w \__tl_set_rescan_single_aux:w } - \q_stop + \s__tl_stop } - \cs_set:Npn \__tl_rescan:NNw ##1##2##3 #2 #1 ##4 ##5 \q_stop + \cs_set:Npn \__tl_rescan:NNw ##1##2##3 #2 #1 ##4 ##5 \s__tl_stop { \group_end: ##1 ##2 { ##4 ##3 } @@ -4155,13 +4467,13 @@ \c__tl_rescan_marker_tl #2 { \use_i:nn \exp_end: #1 } \cs_new_protected:Npn \tl_replace_once:Nnn - { \__tl_replace:NnNNNnn \q_mark ? \__tl_replace_wrap:w \tl_set:Nx } + { \__tl_replace:NnNNNnn \q__tl_mark ? \__tl_replace_wrap:w \tl_set:Nx } \cs_new_protected:Npn \tl_greplace_once:Nnn - { \__tl_replace:NnNNNnn \q_mark ? \__tl_replace_wrap:w \tl_gset:Nx } + { \__tl_replace:NnNNNnn \q__tl_mark ? \__tl_replace_wrap:w \tl_gset:Nx } \cs_new_protected:Npn \tl_replace_all:Nnn - { \__tl_replace:NnNNNnn \q_mark ? \__tl_replace_next:w \tl_set:Nx } + { \__tl_replace:NnNNNnn \q__tl_mark ? \__tl_replace_next:w \tl_set:Nx } \cs_new_protected:Npn \tl_greplace_all:Nnn - { \__tl_replace:NnNNNnn \q_mark ? \__tl_replace_next:w \tl_gset:Nx } + { \__tl_replace:NnNNNnn \q__tl_mark ? \__tl_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 } @@ -4179,9 +4491,9 @@ \tl_if_in:nnTF {#6} {#1} { \exp_args:Nc \__tl_replace:NnNNNnn {#2} {#2?} } { - \quark_if_nil:nTF {#6} - { \__tl_replace_auxi:NnnNNNnn #5 {#1} { #1 \q_stop } } - { \__tl_replace_auxi:NnnNNNnn #5 {#1} { #1 \q_nil } } + \__tl_quark_if_nil:nTF {#6} + { \__tl_replace_auxi:NnnNNNnn #5 {#1} { #1 \q__tl_stop } } + { \__tl_replace_auxi:NnnNNNnn #5 {#1} { #1 \q__tl_nil } } } } { \__tl_replace_auxii:nNNNnn {#1} } @@ -4257,8 +4569,8 @@ { c } { p , T , F , TF } \prg_new_conditional:Npnn \tl_if_empty:n #1 { p , TF , T , F } { - \exp_after:wN \if_meaning:w \exp_after:wN \q_nil - \tl_to_str:n {#1} \q_nil + \exp_after:wN \if_meaning:w \exp_after:wN \q__tl_nil + \tl_to_str:n {#1} \q__tl_nil \prg_return_true: \else: \prg_return_false: @@ -4268,8 +4580,8 @@ { V } { p , TF , T , F } \cs_new:Npn \__tl_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__tl_nil + \__kernel_tl_to_str:w \exp_after:wN {#1} \q__tl_nil } \prg_new_conditional:Npnn \tl_if_empty:o #1 { p , TF , T , F } { @@ -4342,13 +4654,13 @@ { \if_catcode:w ^ \exp_after:wN \__tl_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__tl_stop \prg_return_true: \else: \prg_return_false: \fi: } -\cs_new:Npn \__tl_if_single:nnw #1#2#3 \q_stop {#2} +\cs_new:Npn \__tl_if_single:nnw #1#2#3 \s__tl_stop {#2} \prg_new_conditional:Npnn \tl_if_single_token:n #1 { p , T , F , TF } { \tl_if_head_is_N_type:nTF {#1} @@ -4384,7 +4696,7 @@ \__tl_case:NnTF #1 {#2} } \cs_new:Npn \__tl_case:NnTF #1#2#3#4 - { \__tl_case:Nw #1 #2 #1 { } \q_mark {#3} \q_mark {#4} \q_stop } + { \__tl_case:Nw #1 #2 #1 { } \s__tl_mark {#3} \s__tl_mark {#4} \s__tl_stop } \cs_new:Npn \__tl_case:Nw #1#2#3 { \tl_if_eq:NNTF #1 #2 @@ -4394,19 +4706,19 @@ \cs_generate_variant:Nn \tl_case:Nn { c } \prg_generate_conditional_variant:Nnn \tl_case:Nn { c } { T , F , TF } -\cs_new:Npn \__tl_case_end:nw #1#2#3 \q_mark #4#5 \q_stop +\cs_new:Npn \__tl_case_end:nw #1#2#3 \s__tl_mark #4#5 \s__tl_stop { \exp_end: #1 #4 } \cs_new:Npn \tl_map_function:nN #1#2 { \__tl_map_function:Nn #2 #1 - \q_recursion_tail + \q__tl_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 \__tl_map_function:Nn #1#2 { - \quark_if_recursion_tail_break:nN {#2} \tl_map_break: + \__tl_if_recursion_tail_break:nN {#2} \tl_map_break: #1 {#2} \__tl_map_function:Nn #1 } \cs_generate_variant:Nn \tl_map_function:NN { c } @@ -4417,7 +4729,7 @@ { __tl_map_ \int_use:N \g__kernel_prg_map_int :w } ##1 {#2} \exp_args:Nc \__tl_map_function:Nn { __tl_map_ \int_use:N \g__kernel_prg_map_int :w } - #1 \q_recursion_tail + #1 \q__tl_recursion_tail \prg_break_point:Nn \tl_map_break: { \int_gdecr:N \g__kernel_prg_map_int } } @@ -4427,7 +4739,7 @@ \cs_new:Npn \tl_map_tokens:nn #1#2 { \__tl_map_tokens:nn {#2} #1 - \q_recursion_tail + \q__tl_recursion_tail \prg_break_point:Nn \tl_map_break: { } } \cs_new:Npn \tl_map_tokens:Nn @@ -4435,21 +4747,21 @@ \cs_generate_variant:Nn \tl_map_tokens:Nn { c } \cs_new:Npn \__tl_map_tokens:nn #1#2 { - \quark_if_recursion_tail_break:nN {#2} \tl_map_break: + \__tl_if_recursion_tail_break:nN {#2} \tl_map_break: \use:n {#1} {#2} \__tl_map_tokens:nn {#1} } \cs_new_protected:Npn \tl_map_variable:nNn #1#2#3 { \__tl_map_variable:Nnn #2 {#3} #1 - \q_recursion_tail + \q__tl_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 \__tl_map_variable:Nnn #1#2#3 { - \quark_if_recursion_tail_break:nN {#3} \tl_map_break: + \__tl_if_recursion_tail_break:nN {#3} \tl_map_break: \tl_set:Nn #1 {#3} \use:n {#2} \__tl_map_variable:Nnn #1 {#2} @@ -4503,24 +4815,24 @@ \cs_new:Npn \tl_reverse_items:n #1 { \__tl_reverse_items:nwNwn #1 ? - \q_mark \__tl_reverse_items:nwNwn - \q_mark \__tl_reverse_items:wn - \q_stop { } + \s__tl_mark \__tl_reverse_items:nwNwn + \s__tl_mark \__tl_reverse_items:wn + \s__tl_stop { } } -\cs_new:Npn \__tl_reverse_items:nwNwn #1 #2 \q_mark #3 #4 \q_stop #5 +\cs_new:Npn \__tl_reverse_items:nwNwn #1 #2 \s__tl_mark #3 #4 \s__tl_stop #5 { #3 #2 - \q_mark \__tl_reverse_items:nwNwn - \q_mark \__tl_reverse_items:wn - \q_stop { {#1} #5 } + \s__tl_mark \__tl_reverse_items:nwNwn + \s__tl_mark \__tl_reverse_items:wn + \s__tl_stop { {#1} #5 } } -\cs_new:Npn \__tl_reverse_items:wn #1 \q_stop #2 +\cs_new:Npn \__tl_reverse_items:wn #1 \s__tl_stop #2 { \exp_not:o { \use_none:nn #2 } } \cs_new:Npn \tl_trim_spaces:n #1 - { \__tl_trim_spaces:nn { \q_mark #1 } \exp_not:o } + { \__tl_trim_spaces:nn { \s__tl_mark #1 } \exp_not:o } \cs_generate_variant:Nn \tl_trim_spaces:n { o } \cs_new:Npn \tl_trim_spaces_apply:nN #1#2 - { \__tl_trim_spaces:nn { \q_mark #1 } { \exp_args:No #2 } } + { \__tl_trim_spaces:nn { \s__tl_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} } } @@ -4534,40 +4846,40 @@ { \__tl_trim_spaces_auxi:w ##1 - \q_nil - \q_mark #1 { } - \q_mark \__tl_trim_spaces_auxii:w + \s__tl_nil + \s__tl_mark #1 { } + \s__tl_mark \__tl_trim_spaces_auxii:w \__tl_trim_spaces_auxiii:w - #1 \q_nil + #1 \s__tl_nil \__tl_trim_spaces_auxiv:w - \q_stop + \s__tl_stop } - \cs_new:Npn \__tl_trim_spaces_auxi:w ##1 \q_mark #1 ##2 \q_mark ##3 + \cs_new:Npn \__tl_trim_spaces_auxi:w ##1 \s__tl_mark #1 ##2 \s__tl_mark ##3 { ##3 \__tl_trim_spaces_auxi:w - \q_mark + \s__tl_mark ##2 - \q_mark #1 {##1} + \s__tl_mark #1 {##1} } \cs_new:Npn \__tl_trim_spaces_auxii:w - \__tl_trim_spaces_auxi:w \q_mark \q_mark ##1 + \__tl_trim_spaces_auxi:w \s__tl_mark \s__tl_mark ##1 { \__tl_trim_spaces_auxiii:w ##1 } - \cs_new:Npn \__tl_trim_spaces_auxiii:w ##1 #1 \q_nil ##2 + \cs_new:Npn \__tl_trim_spaces_auxiii:w ##1 #1 \s__tl_nil ##2 { ##2 - ##1 \q_nil + ##1 \s__tl_nil \__tl_trim_spaces_auxiii:w } - \cs_new:Npn \__tl_trim_spaces_auxiv:w ##1 \q_nil ##2 \q_stop ##3 + \cs_new:Npn \__tl_trim_spaces_auxiv:w ##1 \s__tl_nil ##2 \s__tl_stop ##3 { ##3 { \use_none:n ##1 } } } \__tl_tmp:w { ~ } -\cs_new_nopar:Npn \q__tl_act_mark { \q__tl_act_mark } -\cs_new_nopar:Npn \q__tl_act_stop { \q__tl_act_stop } +\quark_new:N \q__tl_act_mark +\quark_new:N \q__tl_act_stop \cs_new:Npn \__tl_act:NNNnn #1#2#3#4#5 { \group_align_safe_begin: @@ -4643,17 +4955,17 @@ \cs_new:Npn \tl_head:n #1 { \__kernel_exp_not:w - \if_false: { \fi: \__tl_head_auxi:nw #1 { } \q_stop } + \if_false: { \fi: \__tl_head_auxi:nw #1 { } \s__tl_stop } } -\cs_new:Npn \__tl_head_auxi:nw #1#2 \q_stop +\cs_new:Npn \__tl_head_auxi:nw #1#2 \s__tl_stop { \exp_after:wN \__tl_head_auxii:n \exp_after:wN { \if_false: } \fi: {#1} } \cs_new:Npn \__tl_head_auxii:n #1 { - \exp_after:wN \if_meaning:w \exp_after:wN \q_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__tl_nil + \__kernel_tl_to_str:w \exp_after:wN { \use_none:n #1 } \q__tl_nil \exp_after:wN \use_i:nn \else: \exp_after:wN \use_ii:nn @@ -4663,6 +4975,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_tl_head:w #1#2 \s__tl_stop {#1} \cs_new:Npn \tl_head:N { \exp_args:No \tl_head:n } \cs_new:Npn \tl_tail:n #1 { @@ -4680,7 +4993,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_tl_head:w #1 { ? \use_none:nn } \s__tl_stop } { \str_head:n {#1} } \prg_return_true: @@ -4697,7 +5010,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_tl_head:w #1 { ? \use_none:nn } \s__tl_stop } { \tl_if_head_is_group:nTF {#1} @@ -4721,7 +5034,7 @@ \cs_new:Npn \__tl_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_tl_head:w #1 { ?? \use_none:nnn } \s__tl_stop #2 \prg_return_true: \else: \prg_return_false: @@ -4791,7 +5104,7 @@ \exp_args:Nf \__tl_item:nn { \exp_args:Nf \__tl_item_aux:nn { \int_eval:n {#2} } {#1} } #1 - \q_recursion_tail + \q__tl_recursion_tail \prg_break_point: } \cs_new:Npn \__tl_item_aux:nn #1#2 @@ -4802,7 +5115,7 @@ } \cs_new:Npn \__tl_item:nn #1#2 { - \quark_if_recursion_tail_break:nN {#2} \prg_break: + \__tl_if_recursion_tail_break:nN {#2} \prg_break: \int_compare:nNnTF {#1} = 1 { \prg_break:n { \exp_not:n {#2} } } { \exp_args:Nf \__tl_item:nn { \int_eval:n { #1 - 1 } } } @@ -4927,7 +5240,7 @@ { \iow_wrap:nnnN { >~ \tl_to_str:n {#1} . } { } { } \__tl_show:n } \cs_new_protected:Npn \__tl_show:n #1 { - \tl_set:Nf \l__tl_internal_a_tl { \__tl_show:w #1 \q_stop } + \tl_set:Nf \l__tl_internal_a_tl { \__tl_show:w #1 \s__tl_stop } \__kernel_iow_with:Nnn \tex_newlinechar:D { 10 } { \__kernel_iow_with:Nnn \tex_errorcontextlines:D { -1 } @@ -4937,14 +5250,25 @@ } } } -\cs_new:Npn \__tl_show:w #1 > #2 . \q_stop {#2} +\cs_new:Npn \__tl_show:w #1 > #2 . \s__tl_stop {#2} \cs_new_protected:Npn \tl_log:n #1 { \iow_wrap:nnnN { > ~ \tl_to_str:n {#1} . } { } { } \iow_log:n } +\scan_new:N \s__tl_nil +\scan_new:N \s__tl_mark +\scan_new:N \s__tl_stop \tl_new:N \g_tmpa_tl \tl_new:N \g_tmpb_tl \tl_new:N \l_tmpa_tl \tl_new:N \l_tmpb_tl %% File: l3str.dtx +\scan_new:N \s__str_mark +\scan_new:N \s__str_stop +\cs_new:Npn \__str_use_none_delimit_by_s_stop:w #1 \s__str_stop { } +\cs_new:Npn \__str_use_i_delimit_by_s_stop:nw #1 #2 \s__str_stop {#1} +\quark_new:N \q__str_recursion_tail +\quark_new:N \q__str_recursion_stop +\__kernel_quark_new_test:N \__str_if_recursion_tail_break:NN +\__kernel_quark_new_test:N \__str_if_recursion_tail_stop_do:Nn \group_begin: \cs_set_protected:Npn \__str_tmp:n #1 { @@ -5030,9 +5354,9 @@ { \__str_replace_next:w #4 - \use_none_delimit_by_q_stop:w + \__str_use_none_delimit_by_s_stop:w #5 - \q_stop + \s__str_stop } } \cs_new_eq:NN \__str_replace_next:w ? @@ -5135,7 +5459,7 @@ \__str_case:nnTF {#1} {#2} } \cs_new:Npn \__str_case:nnTF #1#2#3#4 - { \__str_case:nw {#1} #2 {#1} { } \q_mark {#3} \q_mark {#4} \q_stop } + { \__str_case:nw {#1} #2 {#1} { } \s__str_mark {#3} \s__str_mark {#4} \s__str_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 } @@ -5166,21 +5490,21 @@ \__str_case_e:nnTF {#1} {#2} } \cs_new:Npn \__str_case_e:nnTF #1#2#3#4 - { \__str_case_e:nw {#1} #2 {#1} { } \q_mark {#3} \q_mark {#4} \q_stop } + { \__str_case_e:nw {#1} #2 {#1} { } \s__str_mark {#3} \s__str_mark {#4} \s__str_stop } \cs_new:Npn \__str_case_e:nw #1#2#3 { \str_if_eq:eeTF {#1} {#2} { \__str_case_end:nw {#3} } { \__str_case_e:nw {#1} } } -\cs_new:Npn \__str_case_end:nw #1#2#3 \q_mark #4#5 \q_stop +\cs_new:Npn \__str_case_end:nw #1#2#3 \s__str_mark #4#5 \s__str_stop { \exp_end: #1 #4 } \cs_new:Npn \str_map_function:nN #1#2 { \exp_after:wN \__str_map_function:w \exp_after:wN \__str_map_function:Nn \exp_after:wN #2 \__kernel_tl_to_str:w {#1} - \q_recursion_tail ? ~ + \q__str_recursion_tail ? ~ \prg_break_point:Nn \str_map_break: { } } \cs_new:Npn \str_map_function:NN @@ -5189,7 +5513,7 @@ { #1 { ~ { ~ } \__str_map_function:w } } \cs_new:Npn \__str_map_function:Nn #1#2 { - \if_meaning:w \q_recursion_tail #2 + \if_meaning:w \q__str_recursion_tail #2 \exp_after:wN \str_map_break: \fi: #1 #2 \__str_map_function:Nn #1 @@ -5206,7 +5530,7 @@ \exp_not:c { __str_map_ \int_use:N \g__kernel_prg_map_int :w } \__kernel_str_to_other_fast:n {#1} } - \q_recursion_tail + \q__str_recursion_tail \prg_break_point:Nn \str_map_break: { \int_gdecr:N \g__kernel_prg_map_int } } @@ -5215,7 +5539,7 @@ \cs_generate_variant:Nn \str_map_inline:Nn { c } \cs_new:Npn \__str_map_inline:NN #1#2 { - \quark_if_recursion_tail_break:NN #2 \str_map_break: + \__str_if_recursion_tail_break:NN #2 \str_map_break: \exp_args:No #1 { \token_to_str:N #2 } \__str_map_inline:NN #1 } @@ -5226,14 +5550,14 @@ \exp_not:n { \__str_map_variable:NnN #2 {#3} } \__kernel_str_to_other_fast:n {#1} } - \q_recursion_tail + \q__str_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 \__str_map_variable:NnN #1#2#3 { - \quark_if_recursion_tail_break:NN #3 \str_map_break: + \__str_if_recursion_tail_break:NN #3 \str_map_break: \str_set:Nn #1 {#3} \use:n {#2} \__str_map_variable:NnN #1 {#2} @@ -5246,7 +5570,7 @@ \cs_new:Npn \__kernel_str_to_other:n #1 { \exp_after:wN \__str_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__str_mark \s__str_stop } \group_begin: \tex_lccode:D `\* = `\ % @@ -5255,21 +5579,21 @@ { \group_end: \cs_new:Npn \__str_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__str_stop { \if_meaning:w A #8 \__str_to_other_end:w \fi: \__str_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__str_stop } - \cs_new:Npn \__str_to_other_end:w \fi: #1 \q_mark #2 * A #3 \q_stop + \cs_new:Npn \__str_to_other_end:w \fi: #1 \s__str_mark #2 * A #3 \s__str_stop { \fi: #2 } } \cs_new:Npn \__kernel_str_to_other_fast:n #1 { \exp_after:wN \__str_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__str_stop } \group_begin: \tex_lccode:D `\* = `\ % @@ -5286,7 +5610,7 @@ #1 * #2 * #3 * #4 * #5 * #6 * #7 * #8 * #9 \__str_to_other_fast_loop:w * } - \cs_new:Npn \__str_to_other_fast_end:w #1 * A #2 \q_stop {#1} + \cs_new:Npn \__str_to_other_fast_end:w #1 * A #2 \s__str_stop {#1} } \cs_new:Npn \str_item:Nn { \exp_args:No \str_item:nn } \cs_generate_variant:Nn \str_item:Nn { c } @@ -5305,25 +5629,25 @@ \exp_after:wN \__str_item:w \int_value:w \int_eval:n {#2} \exp_after:wN ; \int_value:w \__str_count:n {#1} ; - #1 \q_stop + #1 \s__str_stop } \cs_new:Npn \__str_item:w #1; #2; { \int_compare:nNnTF {#1} < 0 { \int_compare:nNnTF {#1} < {-#2} - { \use_none_delimit_by_q_stop:w } + { \__str_use_none_delimit_by_s_stop:w } { - \exp_after:wN \use_i_delimit_by_q_stop:nw + \exp_after:wN \__str_use_i_delimit_by_s_stop:nw \exp:w \exp_after:wN \__str_skip_exp_end:w \int_value:w \int_eval:n { #1 + #2 } ; } } { \int_compare:nNnTF {#1} > {#2} - { \use_none_delimit_by_q_stop:w } + { \__str_use_none_delimit_by_s_stop:w } { - \exp_after:wN \use_i_delimit_by_q_stop:nw + \exp_after:wN \__str_use_i_delimit_by_s_stop:nw \exp:w \__str_skip_exp_end:w #1 ; { } } } @@ -5367,7 +5691,7 @@ \int_value:w \__str_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__str_stop } \cs_new:Npn \__str_range:w #1; #2; #3; { @@ -5424,7 +5748,7 @@ #1 \else: 0 \fi: \exp_stop_f: \or: \or: \or: \or: \or: \or: \fi: } -\cs_new:Npn \__str_collect_end:nnnnnnnnw #1#2#3#4#5#6#7#8 #9 \q_stop +\cs_new:Npn \__str_collect_end:nnnnnnnnw #1#2#3#4#5#6#7#8 #9 \s__str_stop { #1#2#3#4#5#6#7#8 } \cs_new:Npn \str_count_spaces:N { \exp_args:No \str_count_spaces:n } @@ -5436,13 +5760,13 @@ \exp_after:wN \__str_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__str_stop } } \cs_new:Npn \__str_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 + \__str_use_i_delimit_by_s_stop:nw \fi: 9 + \__str_count_spaces_loop:w } @@ -5474,13 +5798,13 @@ { X 8 } { X 7 } { X 6 } { X 5 } { X 4 } { X 3 } { X 2 } { X 1 } { X 0 } - \q_stop + \s__str_stop } } \cs_new:Npn \__str_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 \__str_use_none_delimit_by_s_stop:w \fi: 9 + \__str_count_loop:NNNNNNNNN } @@ -5490,14 +5814,14 @@ { \exp_after:wN \__str_head:w \tl_to_str:n {#1} - { { } } ~ \q_stop + { { } } ~ \s__str_stop } \cs_new:Npn \__str_head:w #1 ~ % - { \use_i_delimit_by_q_stop:nw #1 { ~ } } + { \__str_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 \__str_use_i_delimit_by_s_stop:nw + \tl_to_str:n {#1} { } \s__str_stop } \cs_new:Npn \str_tail:N { \exp_args:No \str_tail:n } \cs_generate_variant:Nn \str_tail:N { c } @@ -5505,15 +5829,15 @@ { \exp_after:wN \__str_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__str_stop } -\cs_new:Npn \__str_tail_auxi:w #1 X #2 \q_stop { \fi: #1 } +\cs_new:Npn \__str_tail_auxi:w #1 X #2 \s__str_stop { \fi: #1 } \cs_new:Npn \str_tail_ignore_spaces:n #1 { \exp_after:wN \__str_tail_auxii:w - \tl_to_str:n {#1} \q_mark \q_mark \q_stop + \tl_to_str:n {#1} \s__str_mark \s__str_mark \s__str_stop } -\cs_new:Npn \__str_tail_auxii:w #1 #2 \q_mark #3 \q_stop { #2 } +\cs_new:Npn \__str_tail_auxii:w #1 #2 \s__str_mark #3 \s__str_stop { #2 } \cs_new:Npn \str_foldcase:n #1 { \__str_change_case:nn {#1} { fold } } \cs_new:Npn \str_lowercase:n #1 { \__str_change_case:nn {#1} { lower } } \cs_new:Npn \str_uppercase:n #1 { \__str_change_case:nn {#1} { upper } } @@ -5527,7 +5851,7 @@ } \cs_new:Npn \__str_change_case_aux:nn #1#2 { - \__str_change_case_loop:nw {#2} #1 \q_recursion_tail \q_recursion_stop + \__str_change_case_loop:nw {#2} #1 \q__str_recursion_tail \q__str_recursion_stop \__str_change_case_result:n { } } \cs_new:Npn \__str_change_case_output:nw #1#2 \__str_change_case_result:n #3 @@ -5535,12 +5859,12 @@ \cs_generate_variant:Nn \__str_change_case_output:nw { f } \cs_new:Npn \__str_change_case_end:wn #1 \__str_change_case_result:n #2 { \tl_to_str:n {#2} } -\cs_new:Npn \__str_change_case_loop:nw #1#2 \q_recursion_stop +\cs_new:Npn \__str_change_case_loop:nw #1#2 \q__str_recursion_stop { \tl_if_head_is_space:nTF {#2} { \__str_change_case_space:n } { \__str_change_case_char:nN } - {#1} #2 \q_recursion_stop + {#1} #2 \q__str_recursion_stop } \exp_last_unbraced:NNNNo \cs_new:Npn \__str_change_case_space:n #1 \c_space_tl @@ -5550,7 +5874,7 @@ } \cs_new:Npn \__str_change_case_char:nN #1#2 { - \quark_if_recursion_tail_stop_do:Nn #2 + \__str_if_recursion_tail_stop_do:Nn #2 { \__str_change_case_end:wn } \__str_change_case_output:fw { \use:c { char_str_ #1 case:N } #2 } @@ -5578,124 +5902,10 @@ \cs_new_eq:NN \str_log:n \tl_log:n \cs_new_eq:NN \str_log:N \tl_log:N \cs_generate_variant:Nn \str_log:N { c } -%% File: l3quark.dtx -\cs_new_protected:Npn \quark_new:N #1 - { - \__kernel_chk_if_free_cs:N #1 - \cs_gset_nopar:Npn #1 {#1} - } -\quark_new:N \q_nil -\quark_new:N \q_mark -\quark_new:N \q_no_value -\quark_new:N \q_stop -\quark_new:N \q_recursion_tail -\quark_new:N \q_recursion_stop -\cs_new:Npn \quark_if_recursion_tail_stop:N #1 - { - \if_meaning:w \q_recursion_tail #1 - \exp_after:wN \use_none_delimit_by_q_recursion_stop:w - \fi: - } -\cs_new:Npn \quark_if_recursion_tail_stop_do:Nn #1 - { - \if_meaning:w \q_recursion_tail #1 - \exp_after:wN \use_i_delimit_by_q_recursion_stop:nw - \else: - \exp_after:wN \use_none:n - \fi: - } -\cs_new:Npn \quark_if_recursion_tail_stop:n #1 - { - \tl_if_empty:oTF - { \__quark_if_recursion_tail:w {} #1 {} ?! \q_recursion_tail ??! } - { \use_none_delimit_by_q_recursion_stop:w } - { } - } -\cs_new:Npn \quark_if_recursion_tail_stop_do:nn #1 - { - \tl_if_empty:oTF - { \__quark_if_recursion_tail:w {} #1 {} ?! \q_recursion_tail ??! } - { \use_i_delimit_by_q_recursion_stop:nw } - { \use_none:n } - } -\cs_new:Npn \__quark_if_recursion_tail:w - #1 \q_recursion_tail #2 ? #3 ?! { #1 #2 } -\cs_generate_variant:Nn \quark_if_recursion_tail_stop:n { o } -\cs_generate_variant:Nn \quark_if_recursion_tail_stop_do:nn { o } -\cs_new:Npn \quark_if_recursion_tail_break:NN #1#2 - { - \if_meaning:w \q_recursion_tail #1 - \exp_after:wN #2 - \fi: - } -\cs_new:Npn \quark_if_recursion_tail_break:nN #1#2 - { - \tl_if_empty:oT - { \__quark_if_recursion_tail:w {} #1 {} ?! \q_recursion_tail ??! } - {#2} - } -\prg_new_conditional:Npnn \quark_if_nil:N #1 { p, T , F , TF } - { - \if_meaning:w \q_nil #1 - \prg_return_true: - \else: - \prg_return_false: - \fi: - } -\prg_new_conditional:Npnn \quark_if_no_value:N #1 { p, T , F , TF } - { - \if_meaning:w \q_no_value #1 - \prg_return_true: - \else: - \prg_return_false: - \fi: - } -\prg_generate_conditional_variant:Nnn \quark_if_no_value:N - { c } { p , T , F , TF } -\prg_new_conditional:Npnn \quark_if_nil:n #1 { p, T , F , TF } - { - \__quark_if_empty_if:o - { \__quark_if_nil:w {} #1 {} ? ! \q_nil ? ? ! } - \prg_return_true: - \else: - \prg_return_false: - \fi: - } -\cs_new:Npn \__quark_if_nil:w #1 \q_nil #2 ? #3 ? ! { #1 #2 } -\prg_new_conditional:Npnn \quark_if_no_value:n #1 { p, T , F , TF } - { - \__quark_if_empty_if:o - { \__quark_if_no_value:w {} #1 {} ? ! \q_no_value ? ? ! } - \prg_return_true: - \else: - \prg_return_false: - \fi: - } -\cs_new:Npn \__quark_if_no_value:w #1 \q_no_value #2 ? #3 ? ! { #1 #2 } -\prg_generate_conditional_variant:Nnn \quark_if_nil:n - { V , o } { p , TF , T , F } -\cs_new:Npn \__quark_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 - } -\tl_new:N \g__scan_marks_tl -\cs_new_protected:Npn \scan_new:N #1 - { - \tl_if_in:NnTF \g__scan_marks_tl { #1 } - { - \__kernel_msg_error:nnx { kernel } { scanmark-already-defined } - { \token_to_str:N #1 } - } - { - \tl_gput_right:Nn \g__scan_marks_tl {#1} - \cs_new_eq:NN #1 \scan_stop: - } - } -\scan_new:N \s_stop -\cs_new:Npn \use_none_delimit_by_s_stop:w #1 \s_stop { } %% File: l3seq.dtx \scan_new:N \s__seq +\scan_new:N \s__seq_mark +\scan_new:N \s__seq_stop \cs_new:Npn \__seq_item:n { \__kernel_msg_expandable_error:nn { kernel } { misused-sequence } @@ -6002,10 +6212,10 @@ \tl_set:Nx #2 { \exp_after:wN \__seq_get_left:wnw - #1 \__seq_item:n { \q_no_value } \q_stop + #1 \__seq_item:n { \q_no_value } \s__seq_stop } } -\cs_new:Npn \__seq_get_left:wnw #1 \__seq_item:n #2#3 \q_stop +\cs_new:Npn \__seq_get_left:wnw #1 \__seq_item:n #2#3 \s__seq_stop { \exp_not:n {#2} } \cs_generate_variant:Nn \seq_get_left:NN { c } \cs_new_protected:Npn \seq_pop_left:NN @@ -6013,9 +6223,9 @@ \cs_new_protected:Npn \seq_gpop_left:NN { \__seq_pop:NNNN \__seq_pop_left:NNN \tl_gset:Nn } \cs_new_protected:Npn \__seq_pop_left:NNN #1#2#3 - { \exp_after:wN \__seq_pop_left:wnwNNN #2 \q_stop #1#2#3 } + { \exp_after:wN \__seq_pop_left:wnwNNN #2 \s__seq_stop #1#2#3 } \cs_new_protected:Npn \__seq_pop_left:wnwNNN - #1 \__seq_item:n #2#3 \q_stop #4#5#6 + #1 \__seq_item:n #2#3 \s__seq_stop #4#5#6 { #4 #5 { #1 #3 } \tl_set:Nn #6 {#2} @@ -6096,8 +6306,8 @@ \prg_generate_conditional_variant:Nnn \seq_gpop_right:NN { c } { T , F , TF } \cs_new:Npn \seq_item:Nn #1 - { \exp_after:wN \__seq_item:wNn #1 \q_stop #1 } -\cs_new:Npn \__seq_item:wNn \s__seq #1 \q_stop #2#3 + { \exp_after:wN \__seq_item:wNn #1 \s__seq_stop #1 } +\cs_new:Npn \__seq_item:wNn \s__seq #1 \s__seq_stop #2#3 { \exp_args:Nf \__seq_item:nwn { \exp_args:Nf \__seq_item:nN { \int_eval:n {#3} } #2 } @@ -6236,9 +6446,9 @@ } { \exp_after:wN \__seq_use_setup:w #1 \__seq_item:n - \q_mark { \__seq_use:nwwwwnwn {#3} } - \q_mark { \__seq_use:nwwn {#4} } - \q_stop { } + \s__seq_mark { \__seq_use:nwwwwnwn {#3} } + \s__seq_mark { \__seq_use:nwwn {#4} } + \s__seq_stop { } } } { @@ -6251,12 +6461,12 @@ \cs_new:Npn \__seq_use_setup:w \s__seq { \__seq_use:nwwwwnwn { } } \cs_new:Npn \__seq_use:nwwwwnwn #1 \__seq_item:n #2 \__seq_item:n #3 \__seq_item:n #4#5 - \q_mark #6#7 \q_stop #8 + \s__seq_mark #6#7 \s__seq_stop #8 { #6 \__seq_item:n {#3} \__seq_item:n {#4} #5 - \q_mark {#6} #7 \q_stop { #8 #1 #2 } + \s__seq_mark {#6} #7 \s__seq_stop { #8 #1 #2 } } -\cs_new:Npn \__seq_use:nwwn #1 \__seq_item:n #2 #3 \q_stop #4 +\cs_new:Npn \__seq_use:nwwn #1 \__seq_item:n #2 #3 \s__seq_stop #4 { \exp_not:n { #4 #1 #2 } } \cs_new:Npn \seq_use:Nn #1#2 { \seq_use:Nnnn #1 {#2} {#2} {#2} } @@ -6317,6 +6527,13 @@ \cs_new_eq:NN \__int_eval_end: \tex_relax:D \cs_new_eq:NN \if_int_odd:w \tex_ifodd:D \cs_new_eq:NN \if_case:w \tex_ifcase:D +\scan_new:N \s__int_mark +\scan_new:N \s__int_stop +\cs_new:Npn \__int_use_none_delimit_by_s_stop:w #1 \s__int_stop { } +\quark_new:N \q__int_recursion_tail +\quark_new:N \q__int_recursion_stop +\__kernel_quark_new_test:N \__int_if_recursion_tail_stop_do:Nn +\__kernel_quark_new_test:N \__int_if_recursion_tail_stop:N \cs_new:Npn \int_eval:n #1 { \int_value:w \__int_eval:w #1 \__int_eval_end: } \cs_new:Npn \int_eval:w { \int_value:w \__int_eval:w } @@ -6501,7 +6718,7 @@ \__int_compare_error: } \cs_new:Npn \__int_compare_error:Nw - #1#2 \q_stop + #1#2 \s__int_stop { { } \c_zero_int \fi: @@ -6517,15 +6734,15 @@ \cs_new:Npn \__int_compare:w #1 \__int_compare_error: { \exp_after:wN \if_false: \int_value:w - \__int_compare:Nw #1 e { = nd_ } \q_stop + \__int_compare:Nw #1 e { = nd_ } \s__int_stop } -\cs_new:Npn \__int_compare:Nw #1#2 \q_stop +\cs_new:Npn \__int_compare:Nw #1#2 \s__int_stop { \exp_after:wN \__int_compare:NNw - \__int_to_roman:w - 0 #2 \q_mark - #1#2 \q_stop + \__int_to_roman:w - 0 #2 \s__int_mark + #1#2 \s__int_stop } -\cs_new:Npn \__int_compare:NNw #1#2#3 \q_mark +\cs_new:Npn \__int_compare:NNw #1#2#3 \s__int_mark { \__kernel_exp_not:w \use:c @@ -6536,7 +6753,7 @@ } \__int_compare_error:Nw #1 } -\cs_new:cpn { __int_compare_end_=:NNw } #1#2#3 e #4 \q_stop +\cs_new:cpn { __int_compare_end_=:NNw } #1#2#3 e #4 \s__int_stop { {#3} \exp_stop_f: \prg_return_false: \else: \prg_return_true: \fi: @@ -6544,7 +6761,7 @@ \cs_new:Npn \__int_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 \__int_use_none_delimit_by_s_stop:w \fi: #1 #2 #3 \exp_after:wN \__int_compare:Nw \int_value:w \__int_eval:w } @@ -6591,14 +6808,14 @@ \exp_args:Nf \__int_case:nnTF { \int_eval:n {#1} } {#2} { } { } } \cs_new:Npn \__int_case:nnTF #1#2#3#4 - { \__int_case:nw {#1} #2 {#1} { } \q_mark {#3} \q_mark {#4} \q_stop } + { \__int_case:nw {#1} #2 {#1} { } \s__int_mark {#3} \s__int_mark {#4} \s__int_stop } \cs_new:Npn \__int_case:nw #1#2#3 { \int_compare:nNnTF {#1} = {#2} { \__int_case_end:nw {#3} } { \__int_case:nw {#1} } } -\cs_new:Npn \__int_case_end:nw #1#2#3 \q_mark #4#5 \q_stop +\cs_new:Npn \__int_case_end:nw #1#2#3 \s__int_mark #4#5 \s__int_stop { \exp_end: #1 #4 } \prg_new_conditional:Npnn \int_if_odd:n #1 { p , T , F , TF} { @@ -7002,19 +7219,19 @@ \exp_after:wN #1 \fi: } -\cs_new:Npn \__int_pass_signs_end:wn #1 \q_stop #2 { #2 #1 } +\cs_new:Npn \__int_pass_signs_end:wn #1 \s__int_stop #2 { #2 #1 } \cs_new:Npn \int_from_alph:n #1 { \int_eval:n { \exp_after:wN \__int_pass_signs:wn \tl_to_str:n {#1} - \q_stop { \__int_from_alph:nN { 0 } } - \q_recursion_tail \q_recursion_stop + \s__int_stop { \__int_from_alph:nN { 0 } } + \q__int_recursion_tail \q__int_recursion_stop } } \cs_new:Npn \__int_from_alph:nN #1#2 { - \quark_if_recursion_tail_stop_do:Nn #2 {#1} + \__int_if_recursion_tail_stop_do:Nn #2 {#1} \exp_args:Nf \__int_from_alph:nN { \int_eval:n { #1 * 26 + \__int_from_alph:N #2 } } } @@ -7025,13 +7242,13 @@ \int_eval:n { \exp_after:wN \__int_pass_signs:wn \tl_to_str:n {#1} - \q_stop { \__int_from_base:nnN { 0 } {#2} } - \q_recursion_tail \q_recursion_stop + \s__int_stop { \__int_from_base:nnN { 0 } {#2} } + \q__int_recursion_tail \q__int_recursion_stop } } \cs_new:Npn \__int_from_base:nnN #1#2#3 { - \quark_if_recursion_tail_stop_do:Nn #3 {#1} + \__int_if_recursion_tail_stop_do:Nn #3 {#1} \exp_args:Nf \__int_from_base:nnN { \int_eval:n { #1 * #2 + \__int_from_base:N #3 } } {#2} @@ -7069,16 +7286,16 @@ ( 0 \exp_after:wN \__int_from_roman:NN \tl_to_str:n {#1} - \q_recursion_tail \q_recursion_tail \q_recursion_stop + \q__int_recursion_tail \q__int_recursion_tail \q__int_recursion_stop ) } } \cs_new:Npn \__int_from_roman:NN #1#2 { - \quark_if_recursion_tail_stop:N #1 + \__int_if_recursion_tail_stop:N #1 \int_if_exist:cF { c__int_from_roman_ #1 _int } { \__int_from_roman_error:w } - \quark_if_recursion_tail_stop_do:Nn #2 + \__int_if_recursion_tail_stop_do:Nn #2 { + \use:c { c__int_from_roman_ #1 _int } } \int_if_exist:cF { c__int_from_roman_ #2 _int } { \__int_from_roman_error:w } @@ -7096,7 +7313,7 @@ \__int_from_roman:NN #2 } } -\cs_new:Npn \__int_from_roman_error:w #1 \q_recursion_stop #2 +\cs_new:Npn \__int_from_roman_error:w #1 \q__int_recursion_stop #2 { #2 * 0 - 1 } \cs_new_eq:NN \int_show:N \__kernel_register_show:N \cs_generate_variant:Nn \int_show:N { c } @@ -7184,7 +7401,6 @@ \int_value:w \flag_height:n {#1} ; } %% File: l3prg.dtx -\cs_new_eq:NN \if_bool:N \tex_ifodd:D \cs_new_eq:NN \if_predicate:w \tex_ifodd:D \cs_new_protected:Npn \bool_new:N #1 { \cs_new_eq:NN #1 \c_false_bool } \cs_generate_variant:Nn \bool_new:N { c } @@ -7222,6 +7438,11 @@ } \cs_generate_variant:Nn \bool_set:Nn { c } \cs_generate_variant:Nn \bool_gset:Nn { c } +\quark_new:N \q__bool_recursion_tail +\quark_new:N \q__bool_recursion_stop +\cs_new:Npn \__bool_use_i_delimit_by_q_recursion_stop:nw + #1 #2 \q__bool_recursion_stop {#1} +\__kernel_quark_new_test:N \__bool_if_recursion_tail_stop_do:nn \prg_new_conditional:Npnn \bool_if:N #1 { p , T , F , TF } { \if_bool:N #1 @@ -7313,7 +7534,7 @@ \cs_new:cpn { __bool_|_1: } | { \__bool_get_next:NN \use_iii:nnnn } \cs_new:cpn { __bool_|_2: } | { \__bool_get_next:NN \use_iii:nnnn } \cs_new:Npn \bool_lazy_all_p:n #1 - { \__bool_lazy_all:n #1 \q_recursion_tail \q_recursion_stop } + { \__bool_lazy_all:n #1 \q__bool_recursion_tail \q__bool_recursion_stop } \prg_new_conditional:Npnn \bool_lazy_all:n #1 { T , F , TF } { \if_predicate:w \bool_lazy_all_p:n {#1} @@ -7324,9 +7545,9 @@ } \cs_new:Npn \__bool_lazy_all:n #1 { - \quark_if_recursion_tail_stop_do:nn {#1} { \c_true_bool } + \__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 } } + { \__bool_use_i_delimit_by_q_recursion_stop:nw { \c_false_bool } } \__bool_lazy_all:n } \prg_new_conditional:Npnn \bool_lazy_and:nn #1#2 { p , T , F , TF } @@ -7339,7 +7560,7 @@ \fi: } \cs_new:Npn \bool_lazy_any_p:n #1 - { \__bool_lazy_any:n #1 \q_recursion_tail \q_recursion_stop } + { \__bool_lazy_any:n #1 \q__bool_recursion_tail \q__bool_recursion_stop } \prg_new_conditional:Npnn \bool_lazy_any:n #1 { T , F , TF } { \if_predicate:w \bool_lazy_any_p:n {#1} @@ -7350,9 +7571,9 @@ } \cs_new:Npn \__bool_lazy_any:n #1 { - \quark_if_recursion_tail_stop_do:nn {#1} { \c_false_bool } + \__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 } } + { \__bool_use_i_delimit_by_q_recursion_stop:nw { \c_true_bool } } \__bool_lazy_any:n } \prg_new_conditional:Npnn \bool_lazy_or:nn #1#2 { p , T , F , TF } @@ -7810,6 +8031,14 @@ %% File: l3clist.dtx \cs_new_eq:NN \c_empty_clist \c_empty_tl \tl_new:N \l__clist_internal_clist +\scan_new:N \s__clist_mark +\scan_new:N \s__clist_stop +\cs_new:Npn \__clist_use_none_delimit_by_s_stop:w #1 \s__clist_stop { } +\cs_new:Npn \__clist_use_i_delimit_by_s_stop:nw #1 #2 \s__clist_stop {#1} +\quark_new:N \q__clist_recursion_tail +\quark_new:N \q__clist_recursion_stop +\__kernel_quark_new_test:N \__clist_if_recursion_tail_break:nN +\__kernel_quark_new_test:N \__clist_if_recursion_tail_stop:n \cs_new_protected:Npn \__clist_tmp:w { } \cs_new:Npn \__clist_trim_next:w #1 , { @@ -7821,11 +8050,11 @@ { \exp_after:wN \__clist_sanitize:Nn \exp_after:wN \c_empty_tl \exp:w \__clist_trim_next:w \prg_do_nothing: - #1 , \q_recursion_tail , \q_recursion_stop + #1 , \q__clist_recursion_tail , \q__clist_recursion_stop } \cs_new:Npn \__clist_sanitize:Nn #1#2 { - \quark_if_recursion_tail_stop:n {#2} + \__clist_if_recursion_tail_stop:n {#2} #1 \__clist_wrap_item:w #2 , \exp_after:wN \__clist_sanitize:Nn \exp_after:wN , \exp:w \__clist_trim_next:w \prg_do_nothing: @@ -7835,7 +8064,8 @@ \tl_if_empty:oTF { \__clist_if_wrap:w - \q_mark ? #1 ~ \q_mark ? ~ #1 \q_mark , ~ \q_mark #1 , + \s__clist_mark ? #1 ~ \s__clist_mark ? ~ #1 + \s__clist_mark , ~ \s__clist_mark #1 , } { \tl_if_head_is_group:nTF { #1 { } } @@ -7852,7 +8082,7 @@ } { \prg_return_true: } } -\cs_new:Npn \__clist_if_wrap:w #1 \q_mark ? ~ #2 ~ \q_mark #3 , { } +\cs_new:Npn \__clist_if_wrap:w #1 \s__clist_mark ? ~ #2 ~ \s__clist_mark #3 , { } \cs_new:Npn \__clist_wrap_item:w #1 , { \__clist_if_wrap:nTF {#1} { \exp_not:n { {#1} } } { \exp_not:n {#1} } } \cs_new_eq:NN \clist_new:N \tl_new:N @@ -7959,10 +8189,10 @@ \if_meaning:w #1 \c_empty_clist \tl_set:Nn #2 { \q_no_value } \else: - \exp_after:wN \__clist_get:wN #1 , \q_stop #2 + \exp_after:wN \__clist_get:wN #1 , \s__clist_stop #2 \fi: } -\cs_new_protected:Npn \__clist_get:wN #1 , #2 \q_stop #3 +\cs_new_protected:Npn \__clist_get:wN #1 , #2 \s__clist_stop #3 { \tl_set:Nn #3 {#1} } \cs_generate_variant:Nn \clist_get:NN { c } \cs_new_protected:Npn \clist_pop:NN @@ -7974,21 +8204,21 @@ \if_meaning:w #2 \c_empty_clist \tl_set:Nn #3 { \q_no_value } \else: - \exp_after:wN \__clist_pop:wwNNN #2 , \q_mark \q_stop #1#2#3 + \exp_after:wN \__clist_pop:wwNNN #2 , \s__clist_mark \s__clist_stop #1#2#3 \fi: } -\cs_new_protected:Npn \__clist_pop:wwNNN #1 , #2 \q_stop #3#4#5 +\cs_new_protected:Npn \__clist_pop:wwNNN #1 , #2 \s__clist_stop #3#4#5 { \tl_set:Nn #5 {#1} #3 #4 { \__clist_pop:wN \prg_do_nothing: #2 \exp_not:o - , \q_mark \use_none:n - \q_stop + , \s__clist_mark \use_none:n + \s__clist_stop } } -\cs_new:Npn \__clist_pop:wN #1 , \q_mark #2 #3 \q_stop { #2 {#1} } +\cs_new:Npn \__clist_pop:wN #1 , \s__clist_mark #2 #3 \s__clist_stop { #2 {#1} } \cs_generate_variant:Nn \clist_pop:NN { c } \cs_generate_variant:Nn \clist_gpop:NN { c } \prg_new_protected_conditional:Npnn \clist_get:NN #1#2 { T , F , TF } @@ -7996,7 +8226,7 @@ \if_meaning:w #1 \c_empty_clist \prg_return_false: \else: - \exp_after:wN \__clist_get:wN #1 , \q_stop #2 + \exp_after:wN \__clist_get:wN #1 , \s__clist_stop #2 \prg_return_true: \fi: } @@ -8010,7 +8240,7 @@ \if_meaning:w #2 \c_empty_clist \prg_return_false: \else: - \exp_after:wN \__clist_pop:wwNNN #2 , \q_mark \q_stop #1#2#3 + \exp_after:wN \__clist_pop:wwNNN #2 , \s__clist_mark \s__clist_stop #1#2#3 \prg_return_true: \fi: } @@ -8066,13 +8296,13 @@ \cs_set:Npn \__clist_tmp:w ##1 , #4 , { ##1 - , \q_mark , \use_none_delimit_by_q_stop:w , + , \s__clist_mark , \__clist_use_none_delimit_by_s_stop:w , \__clist_remove_all: } #2 #3 { \exp_after:wN \__clist_remove_all: - #3 , \q_mark , #4 , \q_stop + #3 , \s__clist_mark , #4 , \s__clist_stop } \clist_if_empty:NF #3 { @@ -8086,7 +8316,7 @@ } \cs_new:Npn \__clist_remove_all: { \exp_after:wN \__clist_remove_all:w \__clist_tmp:w , } -\cs_new:Npn \__clist_remove_all:w #1 , \q_mark , #2 , { \exp_not:n {#1} } +\cs_new:Npn \__clist_remove_all:w #1 , \s__clist_mark , #2 , { \exp_not:n {#1} } \cs_generate_variant:Nn \clist_remove_all:Nn { c } \cs_generate_variant:Nn \clist_gremove_all:Nn { c } \cs_new_protected:Npn \clist_reverse:N #1 @@ -8098,14 +8328,14 @@ \cs_new:Npn \clist_reverse:n #1 { \__clist_reverse:wwNww ? #1 , - \q_mark \__clist_reverse:wwNww ! , - \q_mark \__clist_reverse_end:ww - \q_stop ? \q_mark + \s__clist_mark \__clist_reverse:wwNww ! , + \s__clist_mark \__clist_reverse_end:ww + \s__clist_stop ? \s__clist_mark } \cs_new:Npn \__clist_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 \__clist_reverse_end:ww #1 ! #2 , \q_mark + #1 , #2 \s__clist_mark #3 #4 \s__clist_stop ? #5 \s__clist_mark + { #3 ? #2 \s__clist_mark #3 #4 \s__clist_stop #1 , #5 \s__clist_mark } +\cs_new:Npn \__clist_reverse_end:ww #1 ! #2 , \s__clist_mark { \exp_not:o { \use_none:n #2 } } \prg_new_eq_conditional:NNn \clist_if_empty:N \tl_if_empty:N { p , T , F , TF } @@ -8114,9 +8344,9 @@ \prg_new_conditional:Npnn \clist_if_empty:n #1 { p , T , F , TF } { \__clist_if_empty_n:w ? #1 - , \q_mark \prg_return_false: - , \q_mark \prg_return_true: - \q_stop + , \s__clist_mark \prg_return_false: + , \s__clist_mark \prg_return_true: + \s__clist_stop } \cs_new:Npn \__clist_if_empty_n:w #1 , { @@ -8124,7 +8354,7 @@ { \__clist_if_empty_n:w ? } { \__clist_if_empty_n:wNw } } -\cs_new:Npn \__clist_if_empty_n:wNw #1 \q_mark #2#3 \q_stop {#2} +\cs_new:Npn \__clist_if_empty_n:wNw #1 \s__clist_mark #2#3 \s__clist_stop {#2} \prg_new_protected_conditional:Npnn \clist_if_in:Nn #1#2 { T , F , TF } { \exp_args:No \__clist_if_in_return:nnN #1 {#2} #1 @@ -8167,13 +8397,13 @@ \clist_if_empty:NF #1 { \exp_last_unbraced:NNo \__clist_map_function:Nw #2 #1 - , \q_recursion_tail , + , \q__clist_recursion_tail , \prg_break_point:Nn \clist_map_break: { } } } \cs_new:Npn \__clist_map_function:Nw #1#2 , { - \quark_if_recursion_tail_break:nN {#2} \clist_map_break: + \__clist_if_recursion_tail_break:nN {#2} \clist_map_break: #1 {#2} \__clist_map_function:Nw #1 } @@ -8181,12 +8411,12 @@ \cs_new:Npn \clist_map_function:nN #1#2 { \exp_after:wN \__clist_map_function_n:Nn \exp_after:wN #2 - \exp:w \__clist_trim_next:w \prg_do_nothing: #1 , \q_recursion_tail , + \exp:w \__clist_trim_next:w \prg_do_nothing: #1 , \q__clist_recursion_tail , \prg_break_point:Nn \clist_map_break: { } } \cs_new:Npn \__clist_map_function_n:Nn #1 #2 { - \quark_if_recursion_tail_break:nN {#2} \clist_map_break: + \__clist_if_recursion_tail_break:nN {#2} \clist_map_break: \__clist_map_unbrace:Nw #1 #2, \exp_after:wN \__clist_map_function_n:Nn \exp_after:wN #1 \exp:w \__clist_trim_next:w \prg_do_nothing: @@ -8201,7 +8431,7 @@ { __clist_map_ \int_use:N \g__kernel_prg_map_int :w } ##1 {#2} \exp_last_unbraced:Nco \__clist_map_function:Nw { __clist_map_ \int_use:N \g__kernel_prg_map_int :w } - #1 , \q_recursion_tail , + #1 , \q__clist_recursion_tail , \prg_break_point:Nn \clist_map_break: { \int_gdecr:N \g__kernel_prg_map_int } } @@ -8219,7 +8449,7 @@ \exp_args:Nno \use:nn { \__clist_map_variable:Nnw #2 {#3} } #1 - , \q_recursion_tail , \q_recursion_stop + , \q__clist_recursion_tail , \q__clist_recursion_stop \prg_break_point:Nn \clist_map_break: { } } } @@ -8230,7 +8460,7 @@ } \cs_new_protected:Npn \__clist_map_variable:Nnw #1#2#3, { - \quark_if_recursion_tail_stop:n {#3} + \__clist_if_recursion_tail_stop:n {#3} \tl_set:Nn #1 {#3} \use:n {#2} \__clist_map_variable:Nnw #1 {#2} @@ -8255,13 +8485,13 @@ { 0 \exp_not:N \__clist_count:w \c_space_tl - #1 \exp_not:n { , \q_recursion_tail , \q_recursion_stop } + #1 \exp_not:n { , \q__clist_recursion_tail , \q__clist_recursion_stop } } } \cs_new:Npn \__clist_count:n #1 { + 1 } \cs_new:Npx \__clist_count:w #1 , { - \exp_not:n { \exp_args:Nf \quark_if_recursion_tail_stop:n } {#1} + \exp_not:n { \exp_args:Nf \__clist_if_recursion_tail_stop:n } {#1} \exp_not:N \tl_if_blank:nF {#1} { + 1 } \exp_not:N \__clist_count:w \c_space_tl } @@ -8278,9 +8508,9 @@ { \exp_after:wN \__clist_use:nwwwwnwn \exp_after:wN { \exp_after:wN } #1 , - \q_mark , { \__clist_use:nwwwwnwn {#3} } - \q_mark , { \__clist_use:nwwn {#4} } - \q_stop { } + \s__clist_mark , { \__clist_use:nwwwwnwn {#3} } + \s__clist_mark , { \__clist_use:nwwn {#4} } + \s__clist_stop { } } } { @@ -8291,9 +8521,9 @@ \cs_generate_variant:Nn \clist_use:Nnnn { c } \cs_new:Npn \__clist_use:wwn #1 , #2 , #3 { \exp_not:n { #1 #3 #2 } } \cs_new:Npn \__clist_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 \__clist_use:nwwn #1#2 , #3 \q_stop #4 + #1#2 , #3 , #4 , #5 \s__clist_mark , #6#7 \s__clist_stop #8 + { #6 {#3} , {#4} , #5 \s__clist_mark , {#6} #7 \s__clist_stop { #8 #1 #2 } } +\cs_new:Npn \__clist_use:nwwn #1#2 , #3 \s__clist_stop #4 { \exp_not:n { #4 #1 #2 } } \cs_new:Npn \clist_use:Nn #1#2 { \clist_use:Nnnn #1 {#2} {#2} {#2} } @@ -8311,21 +8541,21 @@ \int_compare:nNnTF {#2} < 0 { \int_compare:nNnTF {#2} < { - #1 } - { \use_none_delimit_by_q_stop:w } + { \__clist_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 } + { \__clist_use_none_delimit_by_s_stop:w } { #4 {#2} } } - { } , #3 , \q_stop + { } , #3 , \s__clist_stop } \cs_generate_variant:Nn \__clist_item:nnnN { ffo, ff } \cs_new:Npn \__clist_item_N_loop:nw #1 #2, { \int_compare:nNnTF {#1} = 0 - { \use_i_delimit_by_q_stop:nw { \exp_not:n {#2} } } + { \__clist_use_i_delimit_by_s_stop:nw { \exp_not:n {#2} } } { \exp_args:Nf \__clist_item_N_loop:nw { \int_eval:n { #1 - 1 } } } } \cs_generate_variant:Nn \clist_item:Nn { c } @@ -8353,7 +8583,7 @@ } } } -\cs_new:Npn \__clist_item_n_end:n #1 #2 \q_stop +\cs_new:Npn \__clist_item_n_end:n #1 #2 \s__clist_stop { \tl_trim_spaces_apply:nN {#1} \__clist_item_n_strip:n } \cs_new:Npn \__clist_item_n_strip:n #1 { \__clist_item_n_strip:w #1 , } \cs_new:Npn \__clist_item_n_strip:w #1 , { \exp_not:n {#1} } @@ -8396,6 +8626,9 @@ \clist_new:N \g_tmpa_clist \clist_new:N \g_tmpb_clist %% File: l3token.dtx +\scan_new:N \s__char_stop +\quark_new:N \q__char_no_value +\__kernel_quark_new_conditional:Nn \__char_quark_if_no_value:N { TF } \cs_new_protected:Npn \char_set_catcode:nn #1#2 { \tex_catcode:D \int_eval:n {#1} = \int_eval:n {#2} \exp_stop_f: } \cs_new:Npn \char_value_catcode:n #1 @@ -8735,12 +8968,12 @@ \exp_after:wN \exp_after:wN \exp_after:wN \__char_to_nfd:Nw \exp_after:wN \exp_after:wN \exp_after:wN #1 \cs:w c__char_nfd_ \token_to_str:N #1 _ tl \cs_end: - \q_stop + \s__char_stop } { \exp_not:n {#1} } } \cs_set_eq:NN \__char_to_nfd:n \char_to_nfd:N -\cs_new:Npn \__char_to_nfd:Nw #1#2#3 \q_stop +\cs_new:Npn \__char_to_nfd:Nw #1#2#3 \s__char_stop { \exp_args:Ne \__char_to_nfd:n { \char_generate:nn { `#2 } { \__char_change_case_catcode:N #1 } } @@ -8781,13 +9014,13 @@ { \char_generate:nn {#1} { \__char_change_case_catcode:N #2 } } } \cs_new:Npn \__char_change_case_multi:nN #1#2 - { \__char_change_case_multi:NNNNw #2 #1 \q_no_value \q_no_value \q_stop } + { \__char_change_case_multi:NNNNw #2 #1 \q__char_no_value \q__char_no_value \s__char_stop } \cs_generate_variant:Nn \__char_change_case_multi:nN { v } -\cs_new:Npn \__char_change_case_multi:NNNNw #1#2#3#4#5 \q_stop +\cs_new:Npn \__char_change_case_multi:NNNNw #1#2#3#4#5 \s__char_stop { - \quark_if_no_value:NTF #4 + \__char_quark_if_no_value:NTF #4 { - \quark_if_no_value:NTF #3 + \__char_quark_if_no_value:NTF #3 { \__char_change_case:NN #1 #2 } { \__char_change_case:NNN #1 #2#3 } } @@ -8872,6 +9105,7 @@ { \tl_to_str:n {#2} } } \tl_const:Nx \c_catcode_other_space_tl { \char_generate:nn { `\ } { 12 } } +\scan_new:N \s__token_stop \group_begin: \__kernel_chk_if_free_cs:N \c_group_begin_token \tex_global:D \tex_let:D \c_group_begin_token { @@ -8975,10 +9209,10 @@ { \exp_not:N \exp_after:wN \exp_not:N \__token_if_macro_p:w \exp_not:N \token_to_meaning:N ##1 \tl_to_str:n { ma : } - \exp_not:N \q_stop + \s__token_stop } \cs_new:Npn \exp_not:N \__token_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__token_stop } { \str_if_eq:nnTF { #2 } { cro } @@ -9008,7 +9242,7 @@ \use:x { \cs_new:Npn \exp_not:c { __token_delimit_by_ #1 :w } - ####1 \tl_to_str:n {#1} ####2 \exp_not:N \q_stop + ####1 \tl_to_str:n {#1} ####2 \s__token_stop { ####1 \tl_to_str:n {#1} } } } @@ -9042,7 +9276,7 @@ \exp_not:N \exp_after:wN \exp_not:c { __token_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__token_stop } { \exp_not:n {#3} } { \exp_not:N \prg_return_true: } @@ -9079,17 +9313,17 @@ { \exp_not:N \exp_after:wN \exp_not:N \__token_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__token_stop ##1 } } \cs_new:Npn \exp_not:N \__token_if_primitive:NNw - ##1##2 ##3 \c_colon_str ##4 \exp_not:N \q_stop + ##1##2 ##3 \c_colon_str ##4 \s__token_stop { \exp_not:N \tl_if_empty:oTF { \exp_not:N \__token_if_primitive_space:w ##3 ~ } { \exp_not:N \__token_if_primitive_loop:N ##3 - \c_colon_str \exp_not:N \q_stop + \c_colon_str \s__token_stop } { \exp_not:N \__token_if_primitive_nullfont:N } } @@ -9112,7 +9346,7 @@ \exp_after:wN \__token_if_primitive_loop:N \fi: } -\cs_new:Npn \__token_if_primitive:Nw #1 #2 \q_stop +\cs_new:Npn \__token_if_primitive:Nw #1 #2 \s__token_stop { \if:w : #1 \exp_after:wN \__token_if_primitive_undefined:N @@ -9137,6 +9371,9 @@ \cs_new:Npn \__peek_true_aux:w { } \cs_new:Npn \__peek_false:w { } \cs_new:Npn \__peek_tmp:w { } +\scan_new:N \s__peek_mark +\scan_new:N \s__peek_stop +\cs_new:Npn \__peek_use_none_delimit_by_s_stop:w #1 \s__peek_stop { } \cs_new_protected:Npn \peek_after:Nw { \tex_futurelet:D \l_peek_token } \cs_new_protected:Npn \peek_gafter:Nw @@ -9271,7 +9508,7 @@ } } \group_begin: - \cs_set_protected:Npn \__peek_tmp:w #1 \q_stop + \cs_set_protected:Npn \__peek_tmp:w #1 \s__peek_stop { \cs_new_protected:Npn \__peek_execute_branches_N_type: { @@ -9282,18 +9519,18 @@ 1 \exp_stop_f: \exp_after:wN \__peek_N_type:w \token_to_meaning:N \l_peek_token - \q_mark \__peek_N_type_aux:nnw - #1 \q_mark \use_none_delimit_by_q_stop:w - \q_stop + \s__peek_mark \__peek_N_type_aux:nnw + #1 \s__peek_mark \__peek_use_none_delimit_by_s_stop:w + \s__peek_stop \exp_after:wN \__peek_true:w \else: \exp_after:wN \__peek_false:w \fi: } - \cs_new_protected:Npn \__peek_N_type:w ##1 #1 ##2 \q_mark ##3 + \cs_new_protected:Npn \__peek_N_type:w ##1 #1 ##2 \s__peek_mark ##3 { ##3 {##1} {##2} } } - \exp_after:wN \__peek_tmp:w \tl_to_str:n { outer } \q_stop + \exp_after:wN \__peek_tmp:w \tl_to_str:n { outer } \s__peek_stop \group_end: \cs_new_protected:Npn \__peek_N_type_aux:nnw #1 #2 #3 \fi: { @@ -9317,6 +9554,12 @@ { \__kernel_msg_expandable_error:nn { kernel } { misused-prop } } \tl_new:N \l__prop_internal_tl \tl_const:Nn \c_empty_prop { \s__prop } +\scan_new:N \s__prop_mark +\scan_new:N \s__prop_stop +\quark_new:N \q__prop_recursion_tail +\quark_new:N \q__prop_recursion_stop +\__kernel_quark_new_test:N \__prop_if_recursion_tail_stop:n +\cs_generate_variant:Nn \__prop_if_recursion_tail_stop:n { o } \cs_new_protected:Npn \prop_new:N #1 { \__kernel_chk_if_free_cs:N #1 @@ -9375,27 +9618,27 @@ \cs_new_protected:Npn \__prop_from_keyval:n #1 { \__prop_from_keyval_loop:w \prg_do_nothing: #1 , - \q_recursion_tail , \q_recursion_stop + \q__prop_recursion_tail , \q__prop_recursion_stop } \cs_new_protected:Npn \__prop_from_keyval_loop:w #1 , { - \quark_if_recursion_tail_stop:o {#1} + \__prop_if_recursion_tail_stop:o {#1} \__prop_from_keyval_split:Nw \__prop_from_keyval_key:n - #1 = = \q_stop {#1} + #1 = = \s__prop_stop {#1} \__prop_from_keyval_loop:w \prg_do_nothing: } \cs_new_protected:Npn \__prop_from_keyval_split:Nw #1#2 = { \tl_trim_spaces_apply:oN {#2} #1 } \cs_new_protected:Npn \__prop_from_keyval_key:n #1 - { \__prop_from_keyval_key:w #1 \q_nil } -\cs_new_protected:Npn \__prop_from_keyval_key:w #1 \q_nil #2 \q_stop + { \__prop_from_keyval_key:w #1 \s__prop_mark } +\cs_new_protected:Npn \__prop_from_keyval_key:w #1 \s__prop_mark #2 \s__prop_stop { \__prop_from_keyval_split:Nw \__prop_from_keyval_value:n - \prg_do_nothing: #2 \q_stop {#1} + \prg_do_nothing: #2 \s__prop_stop {#1} } \cs_new_protected:Npn \__prop_from_keyval_value:n #1 - { \__prop_from_keyval_value:w #1 \q_nil } -\cs_new_protected:Npn \__prop_from_keyval_value:w #1 \q_nil #2 \q_stop #3#4 + { \__prop_from_keyval_value:w #1 \s__prop_mark } +\cs_new_protected:Npn \__prop_from_keyval_value:w #1 \s__prop_mark #2 \s__prop_stop #3#4 { \tl_if_empty:nF { #3 #1 #2 } { @@ -9412,10 +9655,10 @@ \cs_new_protected:Npn \__prop_split_aux:NnTF #1#2#3#4 { \cs_set:Npn \__prop_split_aux:w ##1 - \__prop_pair:wn #2 \s__prop ##2 ##3 \q_mark ##4 ##5 \q_stop + \__prop_pair:wn #2 \s__prop ##2 ##3 \s__prop_mark ##4 ##5 \s__prop_stop { ##4 {#3} {#4} } - \exp_after:wN \__prop_split_aux:w #1 \q_mark \use_i:nn - \__prop_pair:wn #2 \s__prop { } \q_mark \use_ii:nn \q_stop + \exp_after:wN \__prop_split_aux:w #1 \s__prop_mark \use_i:nn + \__prop_pair:wn #2 \s__prop { } \s__prop_mark \use_ii:nn \s__prop_stop } \cs_new:Npn \__prop_split_aux:w { } \cs_new_protected:Npn \prop_remove:Nn #1#2 @@ -9562,7 +9805,7 @@ { \exp_last_unbraced:Noo \__prop_if_in:nwwn { \tl_to_str:n {#2} } #1 \__prop_pair:wn \tl_to_str:n {#2} \s__prop { } - \q_recursion_tail + \q__prop_recursion_tail \prg_break_point: } \cs_new:Npn \__prop_if_in:nwwn #1#2 \__prop_pair:wn #3 \s__prop #4 @@ -9573,7 +9816,7 @@ } \cs_new:Npn \__prop_if_in:N #1 { - \if_meaning:w \q_recursion_tail #1 + \if_meaning:w \q__prop_recursion_tail #1 \prg_return_false: \else: \prg_return_true: @@ -9660,6 +9903,9 @@ \tl_new:N \l__msg_internal_tl \str_new:N \l__msg_name_str \str_new:N \l__msg_text_str +\scan_new:N \s__msg_mark +\scan_new:N \s__msg_stop +\cs_new:Npn \__msg_use_none_delimit_by_s_stop:w #1 \s__msg_stop { } \tl_const:Nn \c__msg_text_prefix_tl { msg~text~>~ } \tl_const:Nn \c__msg_more_text_prefix_tl { msg~extra~text~>~ } \prg_new_conditional:Npnn \msg_if_exist:nn #1#2 { p , T , F , TF } @@ -10004,15 +10250,15 @@ { \tl_if_in:nnTF { ^^J #1 } { ^^J > ~ } { - \tl_if_in:nnTF { #1 \q_mark } { . \q_mark } + \tl_if_in:nnTF { #1 \s__msg_mark } { . \s__msg_mark } { \__msg_show_dot:w } { \__msg_show:w } - ^^J #1 \q_stop + ^^J #1 \s__msg_stop } { \__msg_show:nn { ? #1 } { } } } - \cs_new:Npn \__msg_show_dot:w #1 ^^J > ~ #2 . \q_stop + \cs_new:Npn \__msg_show_dot:w #1 ^^J > ~ #2 . \s__msg_stop { \__msg_show:nn {#1} {#2} } - \cs_new:Npn \__msg_show:w #1 ^^J > ~ #2 \q_stop + \cs_new:Npn \__msg_show:w #1 ^^J > ~ #2 \s__msg_stop { \__msg_show:nn {#1} {#2} } \cs_new_protected:Npn \__msg_show:nn #1#2 { @@ -10069,16 +10315,16 @@ { \seq_clear:N \l__msg_hierarchy_seq \__msg_use_hierarchy:nwwN { } - #1 \q_mark \__msg_use_hierarchy:nwwN - / \q_mark \use_none_delimit_by_q_stop:w - \q_stop + #1 \s__msg_mark \__msg_use_hierarchy:nwwN + / \s__msg_mark \__msg_use_none_delimit_by_s_stop:w + \s__msg_stop \__msg_use_redirect_module:n { } } } -\cs_new_protected:Npn \__msg_use_hierarchy:nwwN #1#2 / #3 \q_mark #4 +\cs_new_protected:Npn \__msg_use_hierarchy:nwwN #1#2 / #3 \s__msg_mark #4 { \seq_put_left:Nn \l__msg_hierarchy_seq {#1} - #4 { #1 / #2 } #3 \q_mark #4 + #4 { #1 / #2 } #3 \s__msg_mark #4 } \cs_new_protected:Npn \__msg_use_redirect_module:n #1 { @@ -10378,6 +10624,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. } { @@ -10797,6 +11055,10 @@ { \prop_gput:Nnn \g__iow_streams_prop {#1} { Reserved~by~format } } +\scan_new:N \s__iow_mark +\scan_new:N \s__iow_stop +\cs_new:Npn \__iow_use_i_delimit_by_s_stop:nw #1 #2 \s__iow_stop {#1} +\quark_new:N \q__iow_nil \cs_new_protected:Npn \iow_new:N #1 { \cs_new_eq:NN #1 \c_term_iow } \cs_generate_variant:Nn \iow_new:N { c } \iow_new:N \g_tmpa_iow @@ -10992,15 +11254,15 @@ \tl_set:Nx \l__iow_wrap_tl { \exp_after:wN \__iow_wrap_fix_newline:w \l__iow_wrap_tl - ^^J \q_nil ^^J \q_stop + ^^J \q__iow_nil ^^J \s__iow_stop } \exp_after:wN \__iow_wrap_start:w \l__iow_wrap_tl } \cs_new:Npn \__iow_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__iow_nil #2 + \__iow_use_i_delimit_by_s_stop:nw \fi: \c__iow_wrap_newline_marker_tl \__iow_wrap_fix_newline:w #2 ^^J @@ -11033,7 +11295,7 @@ } { \__iow_wrap_line:nw { } ##1 ; } ##2 #1 - \__iow_wrap_end_chunk:w 7 6 5 4 3 2 1 0 \q_stop + \__iow_wrap_end_chunk:w 7 6 5 4 3 2 1 0 \s__iow_stop } } \cs_new_protected:Npn \__iow_wrap_next:nw ##1##2 #1 @@ -11091,7 +11353,7 @@ \__iow_wrap_next_line:w } \cs_new:Npn \__iow_wrap_end_chunk:w - #1 \int_eval:w #2 - #3 ; #4#5 \q_stop + #1 \int_eval:w #2 - #3 ; #4#5 \s__iow_stop { \if_false: { \fi: } \exp_args:Nf \__iow_wrap_next:nw { \int_eval:n { #2 - #4 } } @@ -11106,14 +11368,14 @@ \l__iow_line_part_tl #1 { ? \__iow_wrap_break_end:w } - \q_mark + \s__iow_mark } \cs_new:Npn \__iow_wrap_break_first:w ##1 #1 ##2 { \use_none:nn ##2 \__iow_wrap_break_none:w \__iow_wrap_break_loop:w ##1 #1 ##2 } - \cs_new:Npn \__iow_wrap_break_none:w ##1##2 #1 ##3 \q_mark ##4 #1 + \cs_new:Npn \__iow_wrap_break_none:w ##1##2 #1 ##3 \s__iow_mark ##4 #1 { \tl_if_empty:NTF \l__iow_line_tl { ##2 ##4 \__iow_wrap_line_end:nw { } } @@ -11125,11 +11387,11 @@ ##1 #1 \__iow_wrap_break_loop:w ##2 #1 ##3 } - \cs_new:Npn \__iow_wrap_break_end:w ##1 #1 ##2 ##3 #1 ##4 \q_mark + \cs_new:Npn \__iow_wrap_break_end:w ##1 #1 ##2 ##3 #1 ##4 \s__iow_mark { ##1 \__iow_wrap_line_end:nw { } ##3 } } \exp_args:NV \__iow_tmp:w \c_catcode_other_space_tl -\cs_new_protected:Npn \__iow_wrap_next_line:w #1#2 \q_stop +\cs_new_protected:Npn \__iow_wrap_next_line:w #1#2 \s__iow_stop { \tl_clear:N \l__iow_line_tl \token_if_eq_meaning:NNTF #1 \__iow_wrap_end_chunk:w @@ -11142,7 +11404,7 @@ \__iow_wrap_line:nw { \l__iow_indent_tl } \l__iow_line_target_int - \l__iow_indent_int ; - #1 #2 \q_stop + #1 #2 \s__iow_stop } } \cs_new_protected:Npn \__iow_wrap_allow_break:n #1 @@ -11199,10 +11461,10 @@ \cs_set_protected:Npn \__iow_tmp:w #1 { \cs_new:Npn \__iow_wrap_trim:N ##1 - { \exp_after:wN \__iow_wrap_trim:w ##1 \q_mark #1 \q_mark \q_stop } - \cs_new:Npn \__iow_wrap_trim:w ##1 #1 \q_mark - { \__iow_wrap_trim_aux:w ##1 \q_mark } - \cs_new:Npn \__iow_wrap_trim_aux:w ##1 \q_mark ##2 \q_stop {##1} + { \exp_after:wN \__iow_wrap_trim:w ##1 \s__iow_mark #1 \s__iow_mark \s__iow_stop } + \cs_new:Npn \__iow_wrap_trim:w ##1 #1 \s__iow_mark + { \__iow_wrap_trim_aux:w ##1 \s__iow_mark } + \cs_new:Npn \__iow_wrap_trim_aux:w ##1 \s__iow_mark ##2 \s__iow_stop {##1} } \exp_args:NV \__iow_tmp:w \c_catcode_other_space_tl \tl_new:N \l__file_internal_tl @@ -11215,12 +11477,12 @@ { \tl_if_blank:nTF {#1} { - \cs_set:Npn \__file_tmp:w ##1 " ##2 " ##3 \q_stop + \cs_set:Npn \__file_tmp:w ##1 " ##2 " ##3 \s__file_stop { { } {##2} { } } \seq_gput_right:Nx \g__file_stack_seq { \exp_after:wN \__file_tmp:w \tex_jobname:D - " \tex_jobname:D " \q_stop + " \tex_jobname:D " \s__file_stop } } { @@ -11242,6 +11504,13 @@ \str_new:N \l__file_name_str \seq_new:N \l_file_search_path_seq \seq_new:N \l__file_tmp_seq +\scan_new:N \s__file_stop +\quark_new:N \q__file_nil +\__kernel_quark_new_conditional:Nn \__file_quark_if_nil:n { TF } +\quark_new:N \q__file_recursion_tail +\quark_new:N \q__file_recursion_stop +\__kernel_quark_new_test:N \__file_if_recursion_tail_stop:N +\__kernel_quark_new_test:N \__file_if_recursion_tail_stop_do:nn \cs_new:Npn \__kernel_file_name_sanitize:n #1 { \exp_args:Ne \__kernel_file_name_trim_spaces:n @@ -11249,11 +11518,11 @@ \exp_args:Ne \__kernel_file_name_strip_quotes:n { \__kernel_file_name_expand_loop:w #1 - \q_recursion_tail \q_recursion_stop + \q__file_recursion_tail \q__file_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__file_recursion_stop { \tl_if_head_is_N_type:nTF {#1} { \__kernel_file_name_expand_N_type:Nw } @@ -11262,11 +11531,11 @@ { \__kernel_file_name_expand_group:nw } { \__kernel_file_name_expand_space:w } } - #1 \q_recursion_stop + #1 \q__file_recursion_stop } \cs_new:Npn \__kernel_file_name_expand_N_type:Nw #1 { - \quark_if_recursion_tail_stop:N #1 + \__file_if_recursion_tail_stop:N #1 \bool_lazy_and:nnTF { \token_if_expandable_p:N #1 } { @@ -11302,11 +11571,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__file_recursion_tail " \q__file_recursion_stop } \cs_new:Npn \__kernel_file_name_strip_quotes:nnnw #1#2#3#4 " { - \quark_if_recursion_tail_stop_do:nn {#4} + \__file_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 } } @@ -11320,24 +11589,24 @@ #3 } \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__file_nil . \s__file_stop } +\cs_new:Npn \__kernel_file_name_trim_spaces:nw #1#2 . #3 . #4 \s__file_stop { - \quark_if_nil:nTF {#3} + \__file_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__file_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__file_stop {#1} \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__file_nil \s__file_stop } +\cs_new:Npn \__kernel_file_name_quote:nw #1 #2 ~ #3 \s__file_stop { - \quark_if_nil:nTF {#3} + \__file_quark_if_nil:nTF {#3} { #1 } { "#1" } } @@ -11430,19 +11699,19 @@ \cs_new:Npn \__file_name_cleanup:w #1 \__file_name_end: { } \cs_new:Npn \__file_name_end: { } \cs_new:Npn \__file_ext_check:n #1 - { \__file_ext_check:nw { / } #1 / \q_nil / \q_stop } -\cs_new:Npn \__file_ext_check:nw #1 #2 / #3 / #4 \q_stop + { \__file_ext_check:nw { / } #1 / \q__file_nil / \s__file_stop } +\cs_new:Npn \__file_ext_check:nw #1 #2 / #3 / #4 \s__file_stop { - \quark_if_nil:nTF {#3} + \__file_quark_if_nil:nTF {#3} { \exp_args:No \__file_ext_check:nnw - { \use_none:n #1 } {#2} #2 . \q_nil . \q_stop + { \use_none:n #1 } {#2} #2 . \q__file_nil . \s__file_stop } - { \__file_ext_check:nw { #1 #2 / } #3 / #4 \q_stop } + { \__file_ext_check:nw { #1 #2 / } #3 / #4 \s__file_stop } } -\cs_new:Npx \__file_ext_check:nnw #1#2#3 . #4 . #5 \q_stop +\cs_new:Npx \__file_ext_check:nnw #1#2#3 . #4 . #5 \s__file_stop { - \exp_not:N \quark_if_nil:nTF {#4} + \exp_not:N \__file_quark_if_nil:nTF {#4} { \exp_not:N \__file_ext_check:nn { #1 #2 } { #1 #2 \tl_to_str:n { .tex } } @@ -11864,11 +12133,11 @@ \cs_new_protected:Npn \file_parse_full_name:nNNN #1#2#3#4 { \exp_after:wN \__file_parse_full_name_auxi:w - \tl_to_str:n { #1 " #1 " } \q_stop #2#3#4 + \tl_to_str:n { #1 " #1 " } \s__file_stop #2#3#4 } \cs_generate_variant:Nn \file_parse_full_name:nNNN { V } \cs_new_protected:Npn \__file_parse_full_name_auxi:w - #1 " #2 " #3 \q_stop #4#5#6 + #1 " #2 " #3 \s__file_stop #4#5#6 { \__file_parse_full_name_split:nNNNTF {#2} / #4 #5 { \str_if_empty:NT #4 { \str_set:Nn #4 { / } } } @@ -11882,7 +12151,7 @@ } \cs_new_protected:Npn \__file_parse_full_name_split:nNNNTF #1#2#3#4 { - \cs_set_protected:Npn \__file_tmp:w ##1 ##2 #2 ##3 \q_stop + \cs_set_protected:Npn \__file_tmp:w ##1 ##2 #2 ##3 \s__file_stop { \tl_if_empty:nTF {##3} { @@ -11897,9 +12166,9 @@ \use_i:nn } } - { \__file_tmp:w { ##1 #2 ##2 } ##3 \q_stop } + { \__file_tmp:w { ##1 #2 ##2 } ##3 \s__file_stop } } - \__file_tmp:w { } #1 #2 \q_stop + \__file_tmp:w { } #1 #2 \s__file_stop } \cs_new_protected:Npn \file_show_list: { \__file_list:N \msg_show:nnxxxx } \cs_new_protected:Npn \file_log_list: { \__file_list:N \msg_log:nnxxxx } @@ -11953,19 +12222,19 @@ \tl_set:Nn \ExplFileExtension { [unknown~extension] } \tl_set:Nn \ExplFileVersion {-1} } - { \__file_id_info_auxii:w #1 ~ \q_stop } + { \__file_id_info_auxii:w #1 ~ \s__file_stop } } \cs_new_protected:Npn \__file_id_info_auxii:w - #1 ~ #2.#3 ~ #4 ~ #5 ~ #6 \q_stop + #1 ~ #2.#3 ~ #4 ~ #5 ~ #6 \s__file_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 } } - { \__file_id_info_auxiii:w #5 - 0 - 0 - \q_stop } + { \__file_id_info_auxiii:w #5 - 0 - 0 - \s__file_stop } } -\cs_new_protected:Npn \__file_id_info_auxiii:w #1 - #2 - #3 - #4 \q_stop +\cs_new_protected:Npn \__file_id_info_auxiii:w #1 - #2 - #3 - #4 \s__file_stop { \tl_set:Nn \ExplFileDate { #1/#2/#3 } } \__kernel_msg_new:nnnn { kernel } { file-not-found } { File~'#1'~not~found. } @@ -12032,6 +12301,9 @@ \cs_new_eq:NN \if_dim:w \tex_ifdim:D \cs_new_eq:NN \__dim_eval:w \tex_dimexpr:D \cs_new_eq:NN \__dim_eval_end: \tex_relax:D +\scan_new:N \s__dim_mark +\scan_new:N \s__dim_stop +\cs_new:Npn \__dim_use_none_delimit_by_s_stop:w #1 \s__dim_stop { } \cs_new_protected:Npn \dim_new:N #1 { \__kernel_chk_if_free_cs:N #1 @@ -12137,7 +12409,7 @@ \cs_new:Npn \__dim_compare:w #1 \__dim_compare_error: { \exp_after:wN \if_false: \exp:w \exp_end_continue_f:w - \__dim_compare:wNN #1 ? { = \__dim_compare_end:w \else: } \q_stop + \__dim_compare:wNN #1 ? { = \__dim_compare_end:w \else: } \s__dim_stop } \exp_args:Nno \use:nn { \cs_new:Npn \__dim_compare:wNN #1 } { \tl_to_str:n {pt} #2#3 } @@ -12147,7 +12419,7 @@ \fi: #1 pt \exp_stop_f: \prg_return_false: - \exp_after:wN \use_none_delimit_by_q_stop:w + \exp_after:wN \__dim_use_none_delimit_by_s_stop:w \fi: \reverse_if:N \if_dim:w #1 pt #2 \exp_after:wN \__dim_compare:wNN @@ -12161,7 +12433,7 @@ #1 \reverse_if:N #2 < #3 = { #1 #2 > #3 } \cs_new:cpn { __dim_compare_ > :w } #1 \reverse_if:N #2 > #3 = { #1 #2 < #3 } -\cs_new:Npn \__dim_compare_end:w #1 \prg_return_false: #2 \q_stop +\cs_new:Npn \__dim_compare_end:w #1 \prg_return_false: #2 \s__dim_stop { #1 \prg_return_false: \else: \prg_return_true: \fi: } \cs_new_protected:Npn \__dim_compare_error: { @@ -12190,14 +12462,14 @@ \exp_args:Nf \__dim_case:nnTF { \dim_eval:n {#1} } {#2} { } { } } \cs_new:Npn \__dim_case:nnTF #1#2#3#4 - { \__dim_case:nw {#1} #2 {#1} { } \q_mark {#3} \q_mark {#4} \q_stop } + { \__dim_case:nw {#1} #2 {#1} { } \s__dim_mark {#3} \s__dim_mark {#4} \s__dim_stop } \cs_new:Npn \__dim_case:nw #1#2#3 { \dim_compare:nNnTF {#1} = {#2} { \__dim_case_end:nw {#3} } { \__dim_case:nw {#1} } } -\cs_new:Npn \__dim_case_end:nw #1#2#3 \q_mark #4#5 \q_stop +\cs_new:Npn \__dim_case_end:nw #1#2#3 \s__dim_mark #4#5 \s__dim_stop { \exp_end: #1 #4 } \cs_new:Npn \dim_while_do:nn #1#2 { @@ -12373,6 +12645,7 @@ \dim_new:N \l_tmpb_dim \dim_new:N \g_tmpa_dim \dim_new:N \g_tmpb_dim +\scan_new:N \s__skip_stop \cs_new_protected:Npn \skip_new:N #1 { \__kernel_chk_if_free_cs:N #1 @@ -12433,9 +12706,9 @@ { \exp_after:wN \__skip_if_finite:wwNw \skip_use:N \tex_glueexpr:D ##1 ; \prg_return_false: - #1 ; \prg_return_true: \q_stop + #1 ; \prg_return_true: \s__skip_stop } - \cs_new:Npn \__skip_if_finite:wwNw ##1 #1 ##2 ; ##3 ##4 \q_stop {##3} + \cs_new:Npn \__skip_if_finite:wwNw ##1 #1 ##2 ; ##3 ##4 \s__skip_stop {##3} } \exp_args:No \__skip_tmp:w { \tl_to_str:n { fil } } \cs_new:Npn \skip_eval:n #1 @@ -12541,9 +12814,7 @@ \cs_set_protected:Npn \__keyval_tmp:NN #1#2 { \cs_new:Npn \keyval_parse:NNn ##1 ##2 ##3 - { - \__keyval_loop_active:NNw ##1 ##2 \s__keyval_mark ##3 #1 \s__keyval_tail #1 - } + { \__keyval_loop_active:NNw ##1 ##2 \s__keyval_mark ##3 #1 \s__keyval_tail #1 } \cs_new:Npn \__keyval_loop_active:NNw ##1 ##2 ##3 #1 { \__keyval_if_recursion_tail:w ##3 @@ -12576,20 +12847,16 @@ \__keyval_loop_other:NNw ##1 ##2 \s__keyval_mark } \cs_new:Npn \__keyval_split_active:w ##1 #2 + { \__keyval_trim:nN { ##1 } \__keyval_split_active:nw \s__keyval_mark } + \cs_new:Npn \__keyval_split_active:nw ##1 ##2 #2 ##3 \s__keyval_stop { - \__keyval_trim:nN { ##1 } \__keyval_split_active:nw \s__keyval_mark + \__keyval_if_empty:w \s__keyval_mark ##3 \s__keyval_stop + \__keyval_has_false:w \s__keyval_mark \s__keyval_stop \use_i:nn + { \__keyval_misplaced_equal_error: \use_none:n } + { \__keyval_trim:nN { ##2 } \__keyval_key_val:nnN { ##1 } } } - \cs_new:Npn \__keyval_split_active:nw ##1 ##2 #2 ##3 \s__keyval_stop - { - \__keyval_if_empty:w \s__keyval_mark ##3 \s__keyval_stop - \__keyval_has_false:w \s__keyval_mark \s__keyval_stop \use_i:nn - { \__keyval_misplaced_equal_error: \use_none:n } - { \__keyval_trim:nN { ##2 } \__keyval_key_val:nnN { ##1 } } - } \cs_new:Npn \__keyval_if_has_equal_active:w ##1 #2 - { - \__keyval_if_empty:w \s__keyval_mark - } + { \__keyval_if_empty:w \s__keyval_mark } } \char_set_catcode_active:n { `\, } \char_set_catcode_active:n { `\= } @@ -12599,29 +12866,25 @@ \s__keyval_mark \s__keyval_tail \__keyval_loop_other:NNw #1 , \s__keyval_tail , \__keyval_loop_active:NNw #2 \s__keyval_mark - {} + { } \cs_new:Npn \__keyval_end_loop_other:w \s__keyval_mark \s__keyval_tail \__keyval_if_has_equal_other:w #1 = \s__keyval_stop \__keyval_has_false:w \s__keyval_mark \s__keyval_stop \use_i:nn #2 \__keyval_loop_other:NNw #3 \s__keyval_mark - {} + { } \cs_new:Npn \__keyval_split_other:w #1 = + { \__keyval_trim:nN { #1 } \__keyval_split_other:nw \s__keyval_mark } +\cs_new:Npn \__keyval_split_other:nw #1 #2 = #3 \s__keyval_stop { - \__keyval_trim:nN { #1 } \__keyval_split_other:nw \s__keyval_mark + \__keyval_if_empty:w \s__keyval_mark #3 \s__keyval_stop + \__keyval_has_false:w \s__keyval_mark \s__keyval_stop \use_i:nn + { \__keyval_misplaced_equal_error: \use_none:n } + { \__keyval_trim:nN { #2 } \__keyval_key_val:nnN { #1 } } } - \cs_new:Npn \__keyval_split_other:nw #1 #2 = #3 \s__keyval_stop - { - \__keyval_if_empty:w \s__keyval_mark #3 \s__keyval_stop - \__keyval_has_false:w \s__keyval_mark \s__keyval_stop \use_i:nn - { \__keyval_misplaced_equal_error: \use_none:n } - { \__keyval_trim:nN { #2 } \__keyval_key_val:nnN { #1 } } - } \cs_new:Npn \__keyval_key:nN #1 #2 - { - \exp_not:n { #2 { #1 } } - } + { \exp_not:n { #2 { #1 } } } \cs_new:Npn \__keyval_key_val:nnN #1 #2 #3 { \__keyval_if_empty:w \s__keyval_mark #2 \s__keyval_stop @@ -12634,17 +12897,11 @@ \cs_new:Npn \__keyval_has_false:w \s__keyval_mark \s__keyval_stop \use_i:nn #1 #2 { #2 } \cs_new:Npn \__keyval_blank_true:w \s__keyval_mark \s__keyval_stop \use:n #1 {} \cs_new:Npn \__keyval_empty_key:w \s__keyval_mark \s__keyval_stop \exp_not:n #1 - { - \__keyval_misplaced_equal_error: - } + { \__keyval_misplaced_equal_error: } \cs_new:Npn \__keyval_if_has_equal_other:w #1 = - { - \__keyval_if_empty:w \s__keyval_mark - } + { \__keyval_if_empty:w \s__keyval_mark } \cs_new:Npn \__keyval_misplaced_equal_error: - { - \__kernel_msg_expandable_error:nn { kernel } { misplaced-equals-sign } - } + { \__kernel_msg_expandable_error:nn { kernel } { misplaced-equals-sign } } \__kernel_msg_new:nnn { kernel } { misplaced-equals-sign } { Misplaced~equals~sign~in~key-value~input~\msg_line_context: } \group_begin: @@ -12705,7 +12962,7 @@ \tl_new:N \l_keys_path_tl \str_new:N \l__keys_inherit_str \tl_new:N \l__keys_relative_tl -\tl_set:Nn \l__keys_relative_tl { \q_no_value } +\tl_set:Nn \l__keys_relative_tl { \q__keys_no_value } \str_new:N \l__keys_property_str \bool_new:N \l__keys_selective_bool \bool_new:N \l__keys_filtered_bool @@ -12715,6 +12972,14 @@ \bool_new:N \l__keys_tmp_bool \tl_new:N \l__keys_tmpa_tl \tl_new:N \l__keys_tmpb_tl +\scan_new:N \s__keys_stop +\quark_new:N \q__keys_nil +\quark_new:N \q__keys_no_value +\__kernel_quark_new_conditional:Nn \__keys_quark_if_nil:n { TF } +\__kernel_quark_new_conditional:Nn \__keys_quark_if_no_value:N { TF } +\quark_new:N \q__keys_recursion_tail +\quark_new:N \q__keys_recursion_stop +\__kernel_quark_new_test:N \__keys_if_recursion_tail_stop:n \cs_new_protected:Npn \keys_define:nn { \__keys_define:onn \l__keys_module_str } \cs_new_protected:Npn \__keys_define:nnn #1#2#3 @@ -12743,7 +13008,7 @@ \str_if_empty:NF \l__keys_property_str { \__kernel_msg_error:nnxx { kernel } { key-property-unknown } - { \l__keys_property_str } { \l_keys_path_str } + { \l__keys_property_str } { \l_keys_path_str } } } } @@ -12751,9 +13016,9 @@ { \str_set:Nx \l__keys_property_str { \__keys_trim_spaces:n {#1} } \exp_after:wN \__keys_property_find:w \l__keys_property_str . . - \q_stop {#1} + \s__keys_stop {#1} } -\cs_new_protected:Npn \__keys_property_find:w #1 . #2 . #3 \q_stop #4 +\cs_new_protected:Npn \__keys_property_find:w #1 . #2 . #3 \s__keys_stop #4 { \tl_if_blank:nTF {#3} { @@ -12767,18 +13032,18 @@ { \str_if_empty:NF \l__keys_module_str { \l__keys_module_str / } - \tl_trim_spaces:n {#1} + \tl_trim_spaces:n {#1} } \str_set:Nn \l__keys_property_str { . #2 } } { \str_set:Nx \l_keys_path_str { \l__keys_module_str / #1 . #2 } - \__keys_property_search:w #3 \q_stop + \__keys_property_search:w #3 \s__keys_stop } \tl_set_eq:NN \l_keys_path_tl \l_keys_path_str } } -\cs_new_protected:Npn \__keys_property_search:w #1 . #2 \q_stop +\cs_new_protected:Npn \__keys_property_search:w #1 . #2 \s__keys_stop { \str_if_eq:nnTF {#2} { . } { @@ -12787,7 +13052,7 @@ } { \str_set:Nx \l_keys_path_str { \l_keys_path_str . #1 } - \__keys_property_search:w #2 \q_stop + \__keys_property_search:w #2 \s__keys_stop } } \cs_new_protected:Npn \__keys_define_code:n #1 @@ -12795,18 +13060,18 @@ \bool_if:NTF \l__keys_no_value_bool { \exp_after:wN \__keys_define_code:w - \l__keys_property_str \q_stop + \l__keys_property_str \s__keys_stop { \use:c { \c__keys_props_root_str \l__keys_property_str } } { \__kernel_msg_error:nnxx { kernel } { key-property-requires-value } { \l__keys_property_str } { \l_keys_path_str } - } + } } { \use:c { \c__keys_props_root_str \l__keys_property_str } {#1} } } \exp_last_unbraced:NNNNo - \cs_new:Npn \__keys_define_code:w #1 \c_colon_str #2 \q_stop + \cs_new:Npn \__keys_define_code:w #1 \c_colon_str #2 \s__keys_stop { \tl_if_empty:nTF {#2} } \cs_new_protected:Npn \__keys_bool_set:Nn #1#2 { @@ -12961,7 +13226,7 @@ \exp_after:wN \__keys_find_key_module:NNw \exp_after:wN \l__keys_tmpa_tl \exp_after:wN \l__keys_tmpb_tl - \l_keys_path_str / \q_stop + \l_keys_path_str / \s__keys_stop \__keys_cmd_set:nx { \l_keys_path_str } { \exp_not:c { prop_ #2 put:Nnn } @@ -13209,7 +13474,7 @@ \bool_set_false:N \exp_not:N \l__keys_filtered_bool \bool_set_false:N \exp_not:N \l__keys_selective_bool \tl_set:Nn \exp_not:N \l__keys_relative_tl - { \exp_not:N \q_no_value } + { \exp_not:N \q__keys_no_value } \__keys_set:nn \exp_not:n { {#1} {#2} } \bool_if:NT \l__keys_only_known_bool { \bool_set_true:N \exp_not:N \l__keys_only_known_bool } @@ -13233,7 +13498,7 @@ \cs_new_protected:Npn \keys_set_known:nnN #1#2#3 { \exp_args:No \__keys_set_known:nnnnN - \l__keys_unused_clist { \q_no_value } {#1} {#2} #3 + \l__keys_unused_clist { \q__keys_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 @@ -13250,7 +13515,7 @@ \tl_set:Nn \l__keys_unused_clist {#1} } \cs_new_protected:Npn \keys_set_known:nn #1#2 - { \__keys_set_known:nnn { \q_no_value } {#1} {#2} } + { \__keys_set_known:nnn { \q__keys_no_value } {#1} {#2} } \cs_generate_variant:Nn \keys_set_known:nn { nV , nv , no } \cs_new_protected:Npn \__keys_set_known:nnn #1#2#3 { @@ -13275,7 +13540,7 @@ { \exp_args:No \__keys_set_filter:nnnnnN \l__keys_unused_clist - { \q_no_value } {#1} {#2} {#3} #4 + { \q__keys_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 @@ -13292,7 +13557,7 @@ \tl_set:Nn \l__keys_unused_clist {#1} } \cs_new_protected:Npn \keys_set_filter:nnn #1#2#3 - {\__keys_set_filter:nnnn { \q_no_value } {#1} {#2} {#3} } + {\__keys_set_filter:nnnn { \q__keys_no_value } {#1} {#2} {#3} } \cs_generate_variant:Nn \keys_set_filter:nnn { nnV , nnv , nno } \cs_new_protected:Npn \__keys_set_filter:nnnn #1#2#3#4 { @@ -13321,7 +13586,7 @@ \bool_set_false:N \exp_not:N \l__keys_filtered_bool \bool_set_true:N \exp_not:N \l__keys_selective_bool \tl_set:Nn \exp_not:N \l__keys_relative_tl - { \exp_not:N \q_no_value } + { \exp_not:N \q__keys_no_value } \__keys_set_selective:nnn \exp_not:n { {#1} {#2} {#3} } \bool_if:NT \l__keys_only_known_bool { \bool_set_true:N \exp_not:N \l__keys_only_known_bool } @@ -13365,7 +13630,7 @@ \exp_after:wN \__keys_find_key_module:NNw \exp_after:wN \l__keys_module_str \exp_after:wN \l_keys_key_str - \l_keys_path_str / \q_stop + \l_keys_path_str / \s__keys_stop \tl_set_eq:NN \l_keys_key_tl \l_keys_key_str \__keys_value_or_default:n {#3} \bool_if:NTF \l__keys_selective_bool @@ -13374,7 +13639,7 @@ \str_set:Nn \l__keys_module_str {#1} } \cs_generate_variant:Nn \__keys_set_keyval:nnn { o } -\cs_new_protected:Npn \__keys_find_key_module:NNw #1#2#3 / #4 \q_stop +\cs_new_protected:Npn \__keys_find_key_module:NNw #1#2#3 / #4 \s__keys_stop { \tl_if_blank:nTF {#4} { \str_set:Nn #2 {#3} } @@ -13384,7 +13649,7 @@ \str_if_empty:NF #1 { / } #3 } - \__keys_find_key_module:NNw #1#2 #4 \q_stop + \__keys_find_key_module:NNw #1#2 #4 \s__keys_stop } } \cs_new_protected:Npn \__keys_set_selective: @@ -13522,7 +13787,7 @@ } \cs_new_protected:Npn \__keys_store_unused: { - \quark_if_no_value:NTF \l__keys_relative_tl + \__keys_quark_if_no_value:NTF \l__keys_relative_tl { \clist_put_right:Nx \l__keys_unused_clist { @@ -13553,7 +13818,7 @@ \cs_set_protected:Npn \__keys_store_unused:w ####1 \l__keys_relative_tl / ####2 \l__keys_relative_tl / - ####3 \exp_not:N \q_stop + ####3 \s__keys_stop } { \tl_if_blank:nF {##1} @@ -13573,7 +13838,7 @@ { \__keys_store_unused:w \l_keys_path_str \l__keys_relative_tl / \l__keys_relative_tl / - \exp_not:N \q_stop + \s__keys_stop } } \cs_new_protected:Npn \__keys_store_unused:w { } @@ -13595,9 +13860,9 @@ \cs_new:Npn \__keys_multichoice_find:n #1 { \clist_map_function:nN {#1} \__keys_choice_find:n } \cs_new:Npn \__keys_parent:n #1 - { \__keys_parent:w #1 / / \q_stop { } } + { \__keys_parent:w #1 / / \s__keys_stop { } } \cs_generate_variant:Nn \__keys_parent:n { o } -\cs_new:Npn \__keys_parent:w #1 / #2 / #3 \q_stop #4 +\cs_new:Npn \__keys_parent:w #1 / #2 / #3 \s__keys_stop #4 { \tl_if_blank:nTF {#2} { @@ -13605,28 +13870,28 @@ { \use_none:n #4 } } { - \__keys_parent:w #2 / #3 \q_stop { #4 / #1 } + \__keys_parent:w #2 / #3 \s__keys_stop { #4 / #1 } } } \cs_new:Npn \__keys_trim_spaces:n #1 { \exp_after:wN \__keys_trim_spaces_auxi:w \tl_to_str:n {#1} - / \q_nil \q_stop + / \q__keys_nil \s__keys_stop } -\cs_new:Npn \__keys_trim_spaces_auxi:w #1 / #2 \q_stop +\cs_new:Npn \__keys_trim_spaces_auxi:w #1 / #2 \s__keys_stop { - \quark_if_nil:nTF {#2} + \__keys_quark_if_nil:nTF {#2} { \tl_trim_spaces:n {#1} } { \__keys_trim_spaces_auxii:w #1 / #2 } } -\cs_new:Npn \__keys_trim_spaces_auxii:w #1 / #2 / \q_nil +\cs_new:Npn \__keys_trim_spaces_auxii:w #1 / #2 / \q__keys_nil { \tl_trim_spaces:n {#1} - \__keys_trim_spaces_auxiii:w #2 / \q_recursion_tail / \q_recursion_stop + \__keys_trim_spaces_auxiii:w #2 / \q__keys_recursion_tail / \q__keys_recursion_stop } \cs_set:Npn \__keys_trim_spaces_auxiii:w #1 / { - \quark_if_recursion_tail_stop:n {#1} + \__keys_if_recursion_tail_stop:n {#1} / \tl_trim_spaces:n { #1 } \__keys_trim_spaces_auxiii:w } @@ -13970,8 +14235,11 @@ \scan_new:N \s__fp \cs_new_protected:Npn \__fp_chk:w #1 ; { \__fp_misused:n { \s__fp \__fp_chk:w #1 ; } } +\scan_new:N \s__fp_expr_mark +\scan_new:N \s__fp_expr_stop \scan_new:N \s__fp_mark \scan_new:N \s__fp_stop +\cs_new:Npn \__fp_use_i_delimit_by_s_stop:nw #1 #2 \s__fp_stop {#1} \scan_new:N \s__fp_invalid \scan_new:N \s__fp_underflow \scan_new:N \s__fp_overflow @@ -14015,7 +14283,7 @@ \__fp_if_type_fp:NTwFw #1 \__fp_use_ii_until_s:nnw \s__fp { \__fp_use_i_until_s:nw 4 } - \q_stop + \s__fp_stop } \cs_new:Npn \__fp_sanitize:Nw #1 #2; { @@ -14091,7 +14359,7 @@ } \cs_new:Npn \__fp_tuple_count_loop:Nw #1#2; { \use_none:n #1 + 1 \__fp_tuple_count_loop:Nw } -\cs_new:Npn \__fp_if_type_fp:NTwFw #1 \s__fp #2 #3 \q_stop {#2} +\cs_new:Npn \__fp_if_type_fp:NTwFw #1 \s__fp #2 #3 \s__fp_stop {#2} \cs_new:Npn \__fp_array_if_all_fp:nTF #1 { \__fp_array_if_all_fp_loop:w #1 { \s__fp \prg_break: } ; @@ -14102,24 +14370,24 @@ \__fp_if_type_fp:NTwFw #1 \__fp_array_if_all_fp_loop:w \s__fp { \prg_break:n \use_iii:nnn } - \q_stop + \s__fp_stop } \cs_new:Npn \__fp_type_from_scan:N #1 { \__fp_if_type_fp:NTwFw #1 { } \s__fp { \__fp_type_from_scan_other:N #1 } - \q_stop + \s__fp_stop } \cs_new:Npx \__fp_type_from_scan_other:N #1 { \exp_not:N \exp_after:wN \exp_not:N \__fp_type_from_scan:w - \exp_not:N \token_to_str:N #1 \exp_not:N \q_mark - \tl_to_str:n { s__fp _? } \exp_not:N \q_mark \exp_not:N \q_stop + \exp_not:N \token_to_str:N #1 \s__fp_mark + \tl_to_str:n { s__fp _? } \s__fp_mark \s__fp_stop } \exp_last_unbraced:NNNNo \cs_new:Npn \__fp_type_from_scan:w #1 - { \tl_to_str:n { s__fp } } #2 \q_mark #3 \q_stop {#2} + { \tl_to_str:n { s__fp } } #2 \s__fp_mark #3 \s__fp_stop {#2} \cs_new:Npn \__fp_change_func_type:NNN #1#2#3 { \__fp_if_type_fp:NTwFw @@ -14133,7 +14401,7 @@ \cs_end: #2 #3 } - \q_stop + \s__fp_stop } \exp_last_unbraced:NNNNo \cs_new:Npn \__fp_change_func_type_aux:w #1 { \tl_to_str:n { __fp } } { } @@ -14152,10 +14420,10 @@ \__fp_if_type_fp:NTwFw #2 \__fp_exp_after_f:nw \s__fp { \__fp_exp_after_any_f:Nnw #2 } - \q_stop + \s__fp_stop {#1} #2 } -\cs_new_eq:NN \__fp_exp_after_stop_f:nw \use_none:nn +\cs_new_eq:NN \__fp_exp_after_expr_stop_f:nw \use_none:nn \cs_new:Npn \__fp_exp_after_tuple_o:w { \__fp_exp_after_tuple_f:nw { \exp_after:wN \exp_stop_f: } } \cs_new:Npn \__fp_exp_after_tuple_f:nw @@ -14165,7 +14433,7 @@ \exp_after:wN \__fp_tuple_chk:w \exp_after:wN { \exp:w \exp_end_continue_f:w - \__fp_exp_after_array_f:w #2 \s__fp_stop + \__fp_exp_after_array_f:w #2 \s__fp_expr_stop \exp_after:wN } \exp_after:wN ; \exp:w \exp_end_continue_f:w #1 @@ -14882,7 +15150,7 @@ \exp_after:wN #1 \exp:w \__fp_parse_expand:w } } -\cs_new:Npn \__fp_exp_after_mark_f:nw #1 +\cs_new:Npn \__fp_exp_after_expr_mark_f:nw #1 { \int_case:nnF { \exp_after:wN \use_i:nnn \use_none:nnn #1 } { @@ -14952,11 +15220,11 @@ ; \exp_not:N \__fp_parse_one_register_dim:ww \tl_to_str:n { pt } ; \exp_not:N \__fp_parse_one_register_mu:www . \tl_to_str:n { pt } ; \exp_not:N \__fp_parse_one_register_int:www - \exp_not:N \q_stop + \s__fp_stop } \exp_args:Nno \use:nn { \cs_new:Npn \__fp_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__fp_stop } { #4 #1.#2; } \exp_args:Nno \use:nn { \cs_new:Npn \__fp_parse_one_register_mu:www #1 } @@ -15463,12 +15731,12 @@ } \cs_new:Npn \__fp_parse_apply_unary:NNNwN #1#2#3#4@#5 { - \__fp_parse_apply_unary_chk:NwNw #4 @ ; . \q_stop + \__fp_parse_apply_unary_chk:NwNw #4 @ ; . \s__fp_stop \__fp_parse_apply_unary_type:NNN #3 #2 #4 @ \exp:w \exp_end_continue_f:w #5 #1 } -\cs_new:Npn \__fp_parse_apply_unary_chk:NwNw #1#2 ; #3#4 \q_stop +\cs_new:Npn \__fp_parse_apply_unary_chk:NwNw #1#2 ; #3#4 \s__fp_stop { \if_meaning:w @ #3 \else: \token_if_eq_meaning:NNTF . #3 @@ -15533,7 +15801,7 @@ \exp_not:N \token_if_eq_meaning:NNTF #3 \exp_not:c { __fp_parse_infix_):N } { - \exp_not:N \__fp_exp_after_array_f:w #2 \s__fp_stop + \exp_not:N \__fp_exp_after_array_f:w #2 \s__fp_expr_stop \exp_not:N \exp_after:wN \exp_not:N \__fp_parse_infix_after_paren:NN \exp_not:N \exp_after:wN #1 @@ -15631,12 +15899,12 @@ \exp:w \__fp_parse_operand:Nw \c__fp_prec_end_int \__fp_parse_expand:w #1 - \s__fp_mark \__fp_parse_infix_end:N - \s__fp_stop + \s__fp_expr_mark \__fp_parse_infix_end:N + \s__fp_expr_stop \exp_end: } \cs_new:Npn \__fp_parse_after:ww - #1@ \__fp_parse_infix_end:N \s__fp_stop #2 { #2 #1 } + #1@ \__fp_parse_infix_end:N \s__fp_expr_stop #2 { #2 #1 } \cs_new:Npn \__fp_parse_o:n #1 { \exp:w @@ -15644,8 +15912,8 @@ \exp:w \__fp_parse_operand:Nw \c__fp_prec_end_int \__fp_parse_expand:w #1 - \s__fp_mark \__fp_parse_infix_end:N - \s__fp_stop + \s__fp_expr_mark \__fp_parse_infix_end:N + \s__fp_expr_stop { \exp_end_continue_f:w \__fp_exp_after_any_f:nw { \exp_after:wN \exp_stop_f: } @@ -15726,7 +15994,7 @@ { \if_catcode:w \scan_stop: \exp_not:N #2 \if_int_compare:w - \__fp_str_if_eq:nn { \s__fp_mark } { \exp_not:N #2 } + \__fp_str_if_eq:nn { \s__fp_expr_mark } { \exp_not:N #2 } = 0 \exp_stop_f: \exp_after:wN \exp_after:wN \exp_after:wN \__fp_parse_infix_mark:NNN @@ -15770,7 +16038,7 @@ { \if_catcode:w \scan_stop: \exp_not:N #2 \if_int_compare:w - \__fp_str_if_eq:nn { \s__fp_mark } { \exp_not:N #2 } + \__fp_str_if_eq:nn { \s__fp_expr_mark } { \exp_not:N #2 } = 0 \exp_stop_f: \exp_after:wN \exp_after:wN \exp_after:wN \__fp_parse_infix_mark:NNN @@ -16068,7 +16336,7 @@ \cs_new:Npn \__fp_parse_function_one_two:nnw #1#2#3 { \__fp_if_type_fp:NTwFw - #3 { } \s__fp \__fp_parse_function_one_two_error_o:w \q_stop + #3 { } \s__fp \__fp_parse_function_one_two_error_o:w \s__fp_stop \__fp_parse_function_one_two_aux:nnw {#1} {#2} #3 } \cs_new:Npn \__fp_parse_function_one_two_error_o:w #1#2#3#4 @ @@ -16090,7 +16358,7 @@ \fi: \__fp_parse_function_one_two_error_o:w } - \q_stop + \s__fp_stop \__fp_parse_function_one_two_auxii:nnw {#1} {#2} #3; #4 } \cs_new:Npn \__fp_parse_function_one_two_auxii:nnw #1#2#3; #4; #5 @@ -16255,8 +16523,8 @@ { \if_charcode:w 0 \__fp_if_type_fp:NTwFw - #1 { \use_i_delimit_by_q_stop:nw #3 \q_stop } - \s__fp 1 \q_stop + #1 { \__fp_use_i_delimit_by_s_stop:nw #3 \s__fp_stop } + \s__fp 1 \s__fp_stop \prg_return_false: \else: \prg_return_true: @@ -16281,8 +16549,8 @@ \cs_new:Npn \__fp_compare_back_any:ww #1#2; #3 { \__fp_if_type_fp:NTwFw - #1 { \__fp_if_type_fp:NTwFw #3 \use_i:nn \s__fp \use_ii:nn \q_stop } - \s__fp \use_ii:nn \q_stop + #1 { \__fp_if_type_fp:NTwFw #3 \use_i:nn \s__fp \use_ii:nn \s__fp_stop } + \s__fp \use_ii:nn \s__fp_stop \__fp_compare_back:ww { \cs:w @@ -16438,9 +16706,9 @@ \cs_generate_variant:Nn \fp_step_function:nnnN { nnnc } \cs_new:Npn \__fp_step:wwwN #1#2; #3#4; #5#6; #7 { - \__fp_if_type_fp:NTwFw #1 { } \s__fp \prg_break: \q_stop - \__fp_if_type_fp:NTwFw #3 { } \s__fp \prg_break: \q_stop - \__fp_if_type_fp:NTwFw #5 { } \s__fp \prg_break: \q_stop + \__fp_if_type_fp:NTwFw #1 { } \s__fp \prg_break: \s__fp_stop + \__fp_if_type_fp:NTwFw #3 { } \s__fp \prg_break: \s__fp_stop + \__fp_if_type_fp:NTwFw #5 { } \s__fp \prg_break: \s__fp_stop \use_i:nnnn { \__fp_step_fp:wwwN #1#2; #3#4; #5#6; #7 } \prg_break_point: \use:n @@ -16607,15 +16875,15 @@ \if_meaning:w \__fp_parse_infix_::N #5 \if_charcode:w 0 \__fp_if_type_fp:NTwFw - #2 { \use_i:nn \use_i_delimit_by_q_stop:nw #3 \q_stop } - \s__fp 1 \q_stop + #2 { \use_i:nn \__fp_use_i_delimit_by_s_stop:nw #3 \s__fp_stop } + \s__fp 1 \s__fp_stop \exp_after:wN \exp_after:wN \exp_after:wN \__fp_ternary_auxii:NwwN \else: \exp_after:wN \exp_after:wN \exp_after:wN \__fp_ternary_auxi:NwwN \fi: \exp_after:wN #1 \exp:w \exp_end_continue_f:w - \__fp_exp_after_array_f:w #4 \s__fp_stop + \__fp_exp_after_array_f:w #4 \s__fp_expr_stop \exp_after:wN @ \exp:w \__fp_parse_operand:Nw \c__fp_prec_colon_int @@ -16626,7 +16894,7 @@ \exp_after:wN \__fp_parse_continue:NwN \exp_after:wN #1 \exp:w \exp_end_continue_f:w - \__fp_exp_after_array_f:w #4 \s__fp_stop + \__fp_exp_after_array_f:w #4 \s__fp_expr_stop \exp_after:wN #5 \exp_after:wN #1 \fi: @@ -16636,7 +16904,7 @@ \exp_after:wN \__fp_parse_continue:NwN \exp_after:wN #1 \exp:w \exp_end_continue_f:w - \__fp_exp_after_array_f:w #2 \s__fp_stop + \__fp_exp_after_array_f:w #2 \s__fp_expr_stop #4 #1 } \cs_new:Npn \__fp_ternary_auxii:NwwN #1#2@#3@#4 @@ -16644,7 +16912,7 @@ \exp_after:wN \__fp_parse_continue:NwN \exp_after:wN #1 \exp:w \exp_end_continue_f:w - \__fp_exp_after_array_f:w #3 \s__fp_stop + \__fp_exp_after_array_f:w #3 \s__fp_expr_stop #4 #1 } %% File: l3fp-basics.dtx @@ -18222,7 +18490,7 @@ ; #2#3#4 0000 0000 ; } \cs_new:Npn \__fp_exp_Taylor_ii:ww #1; #2; - { \__fp_exp_Taylor_loop:www 10 ; #1 ; #1 ; \s_stop } + { \__fp_exp_Taylor_loop:www 10 ; #1 ; #1 ; \s__fp_stop } \cs_new:Npn \__fp_exp_Taylor_loop:www #1; #2; #3; { \if_int_compare:w #1 = 1 \exp_stop_f: @@ -18237,7 +18505,7 @@ #2 ; } } -\cs_new:Npn \__fp_exp_Taylor_break:Nww #1 #2; #3 \s_stop +\cs_new:Npn \__fp_exp_Taylor_break:Nww #1 #2; #3 \s__fp_stop { \__fp_fixed_add_one:wN #2 ; } \intarray_const_from_clist:Nn \c__fp_exp_intarray { @@ -19553,11 +19821,11 @@ \cs_new:Npn \__fp_trim_zeros:w #1 ; { \__fp_trim_zeros_loop:w #1 - ; \__fp_trim_zeros_loop:w 0; \__fp_trim_zeros_dot:w .; \s_stop + ; \__fp_trim_zeros_loop:w 0; \__fp_trim_zeros_dot:w .; \s__fp_stop } \cs_new:Npn \__fp_trim_zeros_loop:w #1 0; #2 { #2 #1 ; #2 } \cs_new:Npn \__fp_trim_zeros_dot:w #1 .; { \__fp_trim_zeros_end:w #1 ; } -\cs_new:Npn \__fp_trim_zeros_end:w #1 ; #2 \s_stop { #1 } +\cs_new:Npn \__fp_trim_zeros_end:w #1 ; #2 \s__fp_stop { #1 } \cs_new:Npn \fp_to_scientific:N #1 { \exp_after:wN \__fp_to_scientific_dispatch:w #1 } \cs_generate_variant:Nn \fp_to_scientific:N { c } @@ -20314,6 +20582,8 @@ \int_new:N \l__sort_A_int \int_new:N \l__sort_B_int \int_new:N \l__sort_C_int +\scan_new:N \s__sort_mark +\scan_new:N \s__sort_stop \cs_new_protected:Npn \__sort_shrink_range: { \int_set:Nn \l__sort_A_int @@ -20507,30 +20777,30 @@ \prg_do_nothing: \__sort_return_mark:w \__sort_return_mark:w - \q_mark + \s__sort_mark \__sort_return_none_error: } \cs_new_protected:Npn \sort_return_same: - #1 \__sort_return_mark:w #2 \q_mark + #1 \__sort_return_mark:w #2 \s__sort_mark { #1 #2 \__sort_return_two_error: \__sort_return_mark:w - \q_mark + \s__sort_mark \__sort_return_same:w } \cs_new_protected:Npn \sort_return_swapped: - #1 \__sort_return_mark:w #2 \q_mark + #1 \__sort_return_mark:w #2 \s__sort_mark { #1 #2 \__sort_return_two_error: \__sort_return_mark:w - \q_mark + \s__sort_mark \__sort_return_swapped:w } -\cs_new_protected:Npn \__sort_return_mark:w #1 \q_mark { } +\cs_new_protected:Npn \__sort_return_mark:w #1 \s__sort_mark { } \cs_new_protected:Npn \__sort_return_none_error: { \__kernel_msg_error:nnxx { kernel } { return-none } @@ -20583,7 +20853,7 @@ \__sort_quick_prepare:Nnnn #2 { } { } #1 { \prg_break_point: \__sort_quick_prepare_end:NNNnw } - \q_stop + \s__sort_stop } } } @@ -20592,13 +20862,13 @@ \prg_break: #4 \prg_break_point: \__sort_quick_prepare:Nnnn #1 { #2 #3 } { #1 {#4} } } -\cs_new:Npn \__sort_quick_prepare_end:NNNnw #1#2#3#4#5 \q_stop +\cs_new:Npn \__sort_quick_prepare_end:NNNnw #1#2#3#4#5 \s__sort_stop { \__sort_quick_split:NnNn #4 \__sort_quick_end:nnTFNn { } - \q_mark { \__sort_quick_cleanup:w \exp_stop_f: } - \s_stop \q_stop + \s__sort_mark { \__sort_quick_cleanup:w \exp_stop_f: } + \s__sort_mark \s__sort_stop } -\cs_new:Npn \__sort_quick_cleanup:w #1 \s_stop \q_stop {#1} +\cs_new:Npn \__sort_quick_cleanup:w #1 \s__sort_mark \s__sort_stop {#1} \cs_new:Npn \__sort_quick_split:NnNn #1#2#3#4 { #3 {#2} {#4} \__sort_quick_only_ii:NnnnnNn @@ -20635,30 +20905,30 @@ { #6 {#7} } {#3} { #4 #2 } {#5} } \cs_new:Npn \__sort_quick_end:nnTFNn #1#2#3#4#5#6 {#5} -\cs_new:Npn \__sort_quick_single_end:nnnwnw #1#2#3#4 \q_mark #5#6 \q_stop - { #5 {#3} #6 \q_stop } -\cs_new:Npn \__sort_quick_only_i_end:nnnwnw #1#2#3#4 \q_mark #5#6 \q_stop +\cs_new:Npn \__sort_quick_single_end:nnnwnw #1#2#3#4 \s__sort_mark #5#6 \s__sort_stop + { #5 {#3} #6 \s__sort_stop } +\cs_new:Npn \__sort_quick_only_i_end:nnnwnw #1#2#3#4 \s__sort_mark #5#6 \s__sort_stop { \__sort_quick_split:NnNn #1 - \__sort_quick_end:nnTFNn { } \q_mark {#5} + \__sort_quick_end:nnTFNn { } \s__sort_mark {#5} {#3} - #6 \q_stop + #6 \s__sort_stop } -\cs_new:Npn \__sort_quick_only_ii_end:nnnwnw #1#2#3#4 \q_mark #5#6 \q_stop +\cs_new:Npn \__sort_quick_only_ii_end:nnnwnw #1#2#3#4 \s__sort_mark #5#6 \s__sort_stop { \__sort_quick_split:NnNn #2 - \__sort_quick_end:nnTFNn { } \q_mark { #5 {#3} } - #6 \q_stop + \__sort_quick_end:nnTFNn { } \s__sort_mark { #5 {#3} } + #6 \s__sort_stop } -\cs_new:Npn \__sort_quick_split_end:nnnwnw #1#2#3#4 \q_mark #5#6 \q_stop +\cs_new:Npn \__sort_quick_split_end:nnnwnw #1#2#3#4 \s__sort_mark #5#6 \s__sort_stop { - \__sort_quick_split:NnNn #2 \__sort_quick_end:nnTFNn { } \q_mark + \__sort_quick_split:NnNn #2 \__sort_quick_end:nnTFNn { } \s__sort_mark { \__sort_quick_split:NnNn #1 - \__sort_quick_end:nnTFNn { } \q_mark {#5} + \__sort_quick_end:nnTFNn { } \s__sort_mark {#5} {#3} } - #6 \q_stop + #6 \s__sort_stop } \cs_new_protected:Npn \__sort_error: { @@ -20723,6 +20993,8 @@ \tl_new:N \g__str_result_tl \int_const:Nn \c__str_replacement_char_int { "FFFD } \int_const:Nn \c__str_max_byte_int { 255 } +\scan_new:N \s__str +\quark_new:N \q__str_nil \prop_new:N \g__str_alias_prop \prop_gput:Nnn \g__str_alias_prop { latin1 } { iso88591 } \prop_gput:Nnn \g__str_alias_prop { latin2 } { iso88592 } @@ -20857,13 +21129,13 @@ { \exp_after:wN \__str_convert_gmap_internal_loop:Nww \exp_after:wN #1 - \g__str_result_tl \s__tl \q_stop \prg_break: \s__tl + \g__str_result_tl \s__str \s__str_stop \prg_break: \s__str \prg_break_point: } } -\cs_new:Npn \__str_convert_gmap_internal_loop:Nww #1 #2 \s__tl #3 \s__tl +\cs_new:Npn \__str_convert_gmap_internal_loop:Nww #1 #2 \s__str #3 \s__str { - \use_none_delimit_by_q_stop:w #3 \q_stop + \__str_use_none_delimit_by_s_stop:w #3 \s__str_stop #1 {#3} \__str_convert_gmap_internal_loop:Nww #1 } @@ -20905,12 +21177,12 @@ #1 \tl_gset:Nx \g__str_result_tl { \__kernel_str_to_other_fast:n {#4} } \exp_after:wN \__str_convert:wwwnn - \tl_to_str:n {#5} /// \q_stop + \tl_to_str:n {#5} /// \s__str_stop { decode } { unescape } \prg_do_nothing: \__str_convert_decode_: \exp_after:wN \__str_convert:wwwnn - \tl_to_str:n {#6} /// \q_stop + \tl_to_str:n {#6} /// \s__str_stop { encode } { escape } \use_ii_i:nn \__str_convert_encode_: @@ -20918,7 +21190,7 @@ #2 #3 \g__str_result_tl } \cs_new_protected:Npn \__str_convert:wwwnn - #1 / #2 // #3 \q_stop #4#5 + #1 / #2 // #3 \s__str_stop #4#5 { \__str_convert:nnn {enc} {#4} {#1} \__str_convert:nnn {esc} {#5} {#2} @@ -21061,7 +21333,7 @@ \cs_new_protected:Npn \__str_convert_decode_: { \__str_convert_gmap:N \__str_decode_native_char:N } \cs_new:Npn \__str_decode_native_char:N #1 - { #1 \s__tl \int_value:w `#1 \s__tl } + { #1 \s__str \int_value:w `#1 \s__str } \bool_lazy_any:nTF { \sys_if_engine_luatex_p: @@ -21108,7 +21380,7 @@ } } \cs_new:Npn \__str_decode_clist_char:n #1 - { #1 \s__tl \int_eval:n {#1} \s__tl } + { #1 \s__str \int_eval:n {#1} \s__str } \cs_new_protected:Npn \__str_convert_encode_clist: { \__str_convert_gmap_internal:N \__str_encode_clist_char:n @@ -21131,11 +21403,11 @@ \int_zero:N \l__str_internal_int \exp_last_unbraced:Nx \__str_decode_eight_bit_load:nn { \tl_use:c { c__str_encoding_#1_tl } } - { \q_stop \prg_break: } { } + { \s__str_stop \prg_break: } { } \prg_break_point: \exp_last_unbraced:Nx \__str_decode_eight_bit_load_missing:n { \tl_use:c { c__str_encoding_#1_missing_tl } } - { \q_stop \prg_break: } + { \s__str_stop \prg_break: } \prg_break_point: \flag_clear:n { str_error } \__str_convert_gmap:N \__str_decode_eight_bit_char:N @@ -21144,7 +21416,7 @@ } \cs_new_protected:Npn \__str_decode_eight_bit_load:nn #1#2 { - \use_none_delimit_by_q_stop:w #1 \q_stop + \__str_use_none_delimit_by_s_stop:w #1 \s__str_stop \tex_dimen:D "#1 = \l__str_internal_int sp \scan_stop: \tex_skip:D \l__str_internal_int = "#1 sp \scan_stop: \tex_toks:D \l__str_internal_int \exp_after:wN { \int_value:w "#2 } @@ -21153,7 +21425,7 @@ } \cs_new_protected:Npn \__str_decode_eight_bit_load_missing:n #1 { - \use_none_delimit_by_q_stop:w #1 \q_stop + \__str_use_none_delimit_by_s_stop:w #1 \s__str_stop \tex_dimen:D "#1 = \l__str_internal_int sp \scan_stop: \tex_skip:D \l__str_internal_int = "#1 sp \scan_stop: \tex_toks:D \l__str_internal_int \exp_after:wN @@ -21163,13 +21435,13 @@ } \cs_new:Npn \__str_decode_eight_bit_char:N #1 { - #1 \s__tl + #1 \s__str \if_int_compare:w \tex_dimen:D `#1 < \l__str_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__str } \cs_new_protected:Npn \__str_convert_encode_eight_bit:n #1 { @@ -21177,7 +21449,7 @@ \int_zero:N \l__str_internal_int \exp_last_unbraced:Nx \__str_encode_eight_bit_load:nn { \tl_use:c { c__str_encoding_#1_tl } } - { \q_stop \prg_break: } { } + { \s__str_stop \prg_break: } { } \prg_break_point: \flag_clear:n { str_error } \__str_convert_gmap_internal:N \__str_encode_eight_bit_char:n @@ -21186,7 +21458,7 @@ } \cs_new_protected:Npn \__str_encode_eight_bit_load:nn #1#2 { - \use_none_delimit_by_q_stop:w #1 \q_stop + \__str_use_none_delimit_by_s_stop:w #1 \s__str_stop \tex_dimen:D "#2 = \l__str_internal_int sp \scan_stop: \tex_skip:D \l__str_internal_int = "#2 sp \scan_stop: \exp_args:NNf \tex_toks:D \l__str_internal_int @@ -21535,17 +21807,17 @@ { 32 } { 192 } { 16 } { 224 } { 8 } { 240 } - \q_stop + \s__str_stop } -\cs_new:Npn \__str_encode_utf_viii_loop:wwnnw #1; #2; #3#4 #5 \q_stop +\cs_new:Npn \__str_encode_utf_viii_loop:wwnnw #1; #2; #3#4 #5 \s__str_stop { \if_int_compare:w #1 < #3 \exp_stop_f: \__str_output_byte:n { #1 + #4 } - \exp_after:wN \use_none_delimit_by_q_stop:w + \exp_after:wN \__str_use_none_delimit_by_s_stop:w \fi: \exp_after:wN \__str_encode_utf_viii_loop:wwnnw \int_value:w \int_div_truncate:nn {#1} {64} ; #1 ; - #5 \q_stop + #5 \s__str_stop \__str_output_byte:n { #2 - 64 * ( #1 - 2 ) } } \flag_clear_new:n { str_missing } @@ -21618,7 +21890,7 @@ { #1 \if_int_compare:w `#1 < "C0 \exp_stop_f: - \s__tl + \s__str \if_int_compare:w `#1 < "80 \exp_stop_f: \int_value:w `#1 \else: @@ -21630,12 +21902,12 @@ \exp_after:wN \__str_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__str + \__str_use_none_delimit_by_s_stop:w {"80} {"800} {"10000} {"110000} \s__str_stop \__str_decode_utf_viii_start:N } \cs_new:Npn \__str_decode_utf_viii_continuation:wwN - #1 \s__tl #2 \__str_decode_utf_viii_start:N #3 + #1 \s__str #2 \__str_decode_utf_viii_start:N #3 { \use_none:n #3 \if_int_compare:w `#3 < @@ -21645,20 +21917,20 @@ \exp_after:wN \__str_decode_utf_viii_aux:wNnnwN \int_value:w \int_eval:n { #1 * "40 + `#3 - "80 } \exp_after:wN \else: - \s__tl + \s__str \flag_raise:n { str_missing } \flag_raise:n { str_error } \int_use:N \c__str_replacement_char_int \fi: - \s__tl + \s__str #2 \__str_decode_utf_viii_start:N #3 } \cs_new:Npn \__str_decode_utf_viii_aux:wNnnwN - #1 \s__tl #2#3#4 #5 \__str_decode_utf_viii_start:N #6 + #1 \s__str #2#3#4 #5 \__str_decode_utf_viii_start:N #6 { \if_int_compare:w #1 < #4 \exp_stop_f: - \s__tl + \s__str \if_int_compare:w #1 < #3 \exp_stop_f: \flag_raise:n { str_overlong } \flag_raise:n { str_error } @@ -21667,13 +21939,13 @@ #1 \fi: \else: - \if_meaning:w \q_stop #5 + \if_meaning:w \s__str_stop #5 \__str_decode_utf_viii_overflow:w #1 \fi: \exp_after:wN \__str_decode_utf_viii_continuation:wwN \int_value:w \int_eval:n { #1 - #4 } \exp_after:wN \fi: - \s__tl + \s__str #2 {#4} #5 \__str_decode_utf_viii_start:N } @@ -21686,10 +21958,10 @@ } \cs_new:Npn \__str_decode_utf_viii_end: { - \s__tl + \s__str \flag_raise:n { str_missing } \flag_raise:n { str_error } - \int_use:N \c__str_replacement_char_int \s__tl + \int_use:N \c__str_replacement_char_int \s__str \prg_break: } \group_begin: @@ -21781,13 +22053,13 @@ } } \cs_new_protected:cpn { __str_convert_decode_utf16be: } - { \__str_decode_utf_xvi:Nw 1 \g__str_result_tl \s_stop } + { \__str_decode_utf_xvi:Nw 1 \g__str_result_tl \s__str_stop } \cs_new_protected:cpn { __str_convert_decode_utf16le: } - { \__str_decode_utf_xvi:Nw 2 \g__str_result_tl \s_stop } + { \__str_decode_utf_xvi:Nw 2 \g__str_result_tl \s__str_stop } \cs_new_protected:cpn { __str_convert_decode_utf16: } { \exp_after:wN \__str_decode_utf_xvi_bom:NN - \g__str_result_tl \s_stop \s_stop \s_stop + \g__str_result_tl \s__str_stop \s__str_stop \s__str_stop } \cs_new_protected:Npn \__str_decode_utf_xvi_bom:NN #1#2 { @@ -21799,7 +22071,7 @@ { \__str_decode_utf_xvi:Nw 1 #1#2 } } } - \cs_new_protected:Npn \__str_decode_utf_xvi:Nw #1#2 \s_stop + \cs_new_protected:Npn \__str_decode_utf_xvi:Nw #1#2 \s__str_stop { \flag_clear:n { str_error } \flag_clear:n { str_missing } @@ -21809,14 +22081,14 @@ \tl_gset:Nx \g__str_result_tl { \exp_after:wN \__str_decode_utf_xvi_pair:NN - #2 \q_nil \q_nil + #2 \q__str_nil \q__str_nil \prg_break_point: } \__str_if_flag_error:nnx { str_error } { utf16-decode } { } } \cs_new:Npn \__str_decode_utf_xvi_pair:NN #1#2 { - \if_meaning:w \q_nil #2 + \if_meaning:w \q__str_nil #2 \__str_decode_utf_xvi_pair_end:Nw #1 \fi: \if_case:w @@ -21824,14 +22096,14 @@ \or: \exp_after:wN \__str_decode_utf_xvi_quad:NNwNN \or: \exp_after:wN \__str_decode_utf_xvi_extra:NNw \fi: - #1#2 \s__tl - \int_eval:n { "100 * \__str_tmp:w #1#2 + \__str_tmp:w #2#1 } \s__tl + #1#2 \s__str + \int_eval:n { "100 * \__str_tmp:w #1#2 + \__str_tmp:w #2#1 } \s__str \__str_decode_utf_xvi_pair:NN } \cs_new:Npn \__str_decode_utf_xvi_quad:NNwNN #1#2 #3 \__str_decode_utf_xvi_pair:NN #4#5 { - \if_meaning:w \q_nil #5 + \if_meaning:w \q__str_nil #5 \__str_decode_utf_xvi_error:nNN { missing } #1#2 \__str_decode_utf_xvi_pair_end:Nw #4 \fi: @@ -21842,13 +22114,13 @@ \__str_tmp:w #4#5 < "E0 \fi: \exp_stop_f: - #1 #2 #4 #5 \s__tl + #1 #2 #4 #5 \s__str \int_eval:n { ( "100 * \__str_tmp:w #1#2 + \__str_tmp:w #2#1 - "D7F7 ) * "400 + "100 * \__str_tmp:w #4#5 + \__str_tmp:w #5#4 } - \s__tl + \s__str \exp_after:wN \use_i:nnn \else: \__str_decode_utf_xvi_error:nNN { missing } #1#2 @@ -21858,20 +22130,20 @@ \cs_new:Npn \__str_decode_utf_xvi_pair_end:Nw #1 \fi: { \fi: - \if_meaning:w \q_nil #1 + \if_meaning:w \q__str_nil #1 \else: \__str_decode_utf_xvi_error:nNN { end } #1 \prg_do_nothing: \fi: \prg_break: } - \cs_new:Npn \__str_decode_utf_xvi_extra:NNw #1#2 \s__tl #3 \s__tl + \cs_new:Npn \__str_decode_utf_xvi_extra:NNw #1#2 \s__str #3 \s__str { \__str_decode_utf_xvi_error:nNN { extra } #1#2 } \cs_new:Npn \__str_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__str_replacement_char_int \s__tl + #2 #3 \s__str + \int_use:N \c__str_replacement_char_int \s__str } \group_end: \group_begin: @@ -21939,13 +22211,13 @@ } } \cs_new_protected:cpn { __str_convert_decode_utf32be: } - { \__str_decode_utf_xxxii:Nw 1 \g__str_result_tl \s_stop } + { \__str_decode_utf_xxxii:Nw 1 \g__str_result_tl \s__str_stop } \cs_new_protected:cpn { __str_convert_decode_utf32le: } - { \__str_decode_utf_xxxii:Nw 2 \g__str_result_tl \s_stop } + { \__str_decode_utf_xxxii:Nw 2 \g__str_result_tl \s__str_stop } \cs_new_protected:cpn { __str_convert_decode_utf32: } { \exp_after:wN \__str_decode_utf_xxxii_bom:NNNN \g__str_result_tl - \s_stop \s_stop \s_stop \s_stop \s_stop + \s__str_stop \s__str_stop \s__str_stop \s__str_stop \s__str_stop } \cs_new_protected:Npn \__str_decode_utf_xxxii_bom:NNNN #1#2#3#4 { @@ -21957,7 +22229,7 @@ { \__str_decode_utf_xxxii:Nw 1 #1#2#3#4 } } } - \cs_new_protected:Npn \__str_decode_utf_xxxii:Nw #1#2 \s_stop + \cs_new_protected:Npn \__str_decode_utf_xxxii:Nw #1#2 \s__str_stop { \flag_clear:n { str_overflow } \flag_clear:n { str_end } @@ -21966,17 +22238,17 @@ \tl_gset:Nx \g__str_result_tl { \exp_after:wN \__str_decode_utf_xxxii_loop:NNNN - #2 \s_stop \s_stop \s_stop \s_stop + #2 \s__str_stop \s__str_stop \s__str_stop \s__str_stop \prg_break_point: } \__str_if_flag_error:nnx { str_error } { utf32-decode } { } } \cs_new:Npn \__str_decode_utf_xxxii_loop:NNNN #1#2#3#4 { - \if_meaning:w \s_stop #4 + \if_meaning:w \s__str_stop #4 \exp_after:wN \__str_decode_utf_xxxii_end:w \fi: - #1#2#3#4 \s__tl + #1#2#3#4 \s__str \if_int_compare:w \__str_tmp:w #1#4 > 0 \exp_stop_f: \flag_raise:n { str_overflow } \flag_raise:n { str_error } @@ -21991,17 +22263,17 @@ { \__str_tmp:w #2#3*"10000 + \__str_tmp:w #3#2*"100 + \__str_tmp:w #4#1 } \fi: \fi: - \s__tl + \s__str \__str_decode_utf_xxxii_loop:NNNN } - \cs_new:Npn \__str_decode_utf_xxxii_end:w #1 \s_stop + \cs_new:Npn \__str_decode_utf_xxxii_end:w #1 \s__str_stop { \tl_if_empty:nF {#1} { \flag_raise:n { str_end } \flag_raise:n { str_error } - #1 \s__tl - \int_use:N \c__str_replacement_char_int \s__tl + #1 \s__str + \int_use:N \c__str_replacement_char_int \s__str } \prg_break: } @@ -22499,6 +22771,13 @@ \int_const:Nn \c__regex_ascii_max_control_int { 31 } \int_const:Nn \c__regex_ascii_max_int { 127 } \int_const:Nn \c__regex_ascii_lower_int { `a - `A } +\quark_new:N \q__regex_recursion_stop +\cs_new:Npn \__regex_use_none_delimit_by_q_recursion_stop:w + #1 \q__regex_recursion_stop { } +\cs_new:Npn \__regex_use_i_delimit_by_q_recursion_stop:nw + #1 #2 \q__regex_recursion_stop {#1} +\quark_new:N \q__regex_nil +\__kernel_quark_new_conditional:Nn \__regex_quark_if_nil:N { F } \cs_new_protected:Npn \__regex_break_true:w #1 \__regex_break_point:TF #2 #3 {#2} \cs_new_protected:Npn \__regex_break_point:TF #1 #2 { #2 } @@ -23742,7 +24021,7 @@ \tl_set:Nx \l__regex_internal_a_tl { \exp_after:wN \__regex_compile_cs_aux:Nn \l__regex_internal_regex - \q_nil \q_nil \q_recursion_stop + \q__regex_nil \q__regex_nil \q__regex_recursion_stop } \exp_args:Nx \__regex_compile_one:n { @@ -23760,12 +24039,13 @@ { \scan_stop: \__regex_compile_cs_aux:NNnnnN #2 - \q_nil \q_nil \q_nil \q_nil \q_nil \q_nil \q_recursion_stop + \q__regex_nil \q__regex_nil \q__regex_nil + \q__regex_nil \q__regex_nil \q__regex_nil \q__regex_recursion_stop \__regex_compile_cs_aux:Nn } { - \quark_if_nil:NF #1 { \flag_raise_if_clear:n { __regex_cs } } - \use_none_delimit_by_q_recursion_stop:w + \__regex_quark_if_nil:NF #1 { \flag_raise_if_clear:n { __regex_cs } } + \__regex_use_none_delimit_by_q_recursion_stop:w } } \cs_new:Npn \__regex_compile_cs_aux:NNnnnN #1#2#3#4#5#6 @@ -23784,12 +24064,12 @@ \__regex_compile_cs_aux:NNnnnN } { - \quark_if_nil:NF #1 + \__regex_quark_if_nil:NF #1 { \flag_raise_if_clear:n { __regex_cs } - \use_i_delimit_by_q_recursion_stop:nw + \__regex_use_i_delimit_by_q_recursion_stop:nw } - \use_none_delimit_by_q_recursion_stop:w + \__regex_use_none_delimit_by_q_recursion_stop:w } } \cs_new_protected:cpn { __regex_compile_/u: } #1#2 @@ -26319,18 +26599,19 @@ \__color_backend_pickup:N \l__color_current_tl \__color_select:V \l__color_current_tl } +\scan_new:N \s__color_stop \cs_new_protected:Npn \__color_select:n #1 - { \__color_select:w #1 \q_stop } + { \__color_select:w #1 \s__color_stop } \cs_generate_variant:Nn \__color_select:n { V } -\cs_new_protected:Npn \__color_select:w #1 ~ #2 \q_stop - { \use:c { __color_select_ #1 :w } #2 \q_stop } -\cs_new_protected:Npn \__color_select_cmyk:w #1 ~ #2 ~ #3 ~ #4 \q_stop +\cs_new_protected:Npn \__color_select:w #1 ~ #2 \s__color_stop + { \use:c { __color_select_ #1 :w } #2 \s__color_stop } +\cs_new_protected:Npn \__color_select_cmyk:w #1 ~ #2 ~ #3 ~ #4 \s__color_stop { \__color_backend_cmyk:nnnn {#1} {#2} {#3} {#4} } -\cs_new_protected:Npn \__color_select_gray:w #1 \q_stop +\cs_new_protected:Npn \__color_select_gray:w #1 \s__color_stop { \__color_backend_gray:n {#1} } -\cs_new_protected:Npn \__color_select_rgb:w #1 ~ #2 ~ #3 \q_stop +\cs_new_protected:Npn \__color_select_rgb:w #1 ~ #2 ~ #3 \s__color_stop { \__color_backend_rgb:nnn {#1} {#2} {#3} } -\cs_new_protected:Npn \__color_select_spot:w #1 ~ #2 \q_stop +\cs_new_protected:Npn \__color_select_spot:w #1 ~ #2 \s__color_stop { \__color_backend_spot:nn {#1} {#2} } \tl_new:N \l__color_current_tl \tl_set:Nn \l__color_current_tl { gray~0 } @@ -27765,6 +28046,14 @@ \group_end: } %% File: l3text.dtx +\scan_new:N \s__text_stop +\quark_new:N \q__text_nil +\__kernel_quark_new_conditional:Nn \__text_quark_if_nil:n { TF } +\quark_new:N \q__text_recursion_tail +\quark_new:N \q__text_recursion_stop +\cs_new:Npn \__text_use_i_delimit_by_q_recursion_stop:nw + #1 #2 \q__text_recursion_stop {#1} +\__kernel_quark_new_test:N \__text_if_recursion_tail_stop_do:Nn \group_begin: \char_set_catcode_active:n { 0 } \cs_new:Npn \__text_token_to_explicit:N #1 @@ -27832,9 +28121,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__text_stop } -\cs_new:Npn \__text_token_to_explicit_auxi:w #1 ; #2 \q_stop +\cs_new:Npn \__text_token_to_explicit_auxi:w #1 ; #2 \s__text_stop { \char_generate:nn { @@ -27890,7 +28179,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__text_recursion_tail #1 } } { \prg_return_false: } { \prg_return_true: } @@ -27943,7 +28232,7 @@ { \group_align_safe_begin: \__text_expand_loop:w #1 - \q_recursion_tail \q_recursion_stop + \q__text_recursion_tail \q__text_recursion_stop \__text_expand_result:n { } } \cs_new:Npn \__text_expand_store:n #1 @@ -27957,7 +28246,7 @@ \exp_end: #2 } -\cs_new:Npn \__text_expand_loop:w #1 \q_recursion_stop +\cs_new:Npn \__text_expand_loop:w #1 \q__text_recursion_stop { \tl_if_head_is_N_type:nTF {#1} { \__text_expand_N_type:N } @@ -27966,7 +28255,7 @@ { \__text_expand_group:n } { \__text_expand_space:w } } - #1 \q_recursion_stop + #1 \q__text_recursion_stop } \cs_new:Npn \__text_expand_group:n #1 { @@ -27987,7 +28276,7 @@ } \cs_new:Npx \__text_expand_N_type:N #1 { - \exp_not:N \quark_if_recursion_tail_stop_do:Nn #1 + \exp_not:N \__text_if_recursion_tail_stop_do:Nn #1 { \exp_not:N \__text_expand_end:w } \exp_not:N \bool_lazy_any:nTF { @@ -28044,16 +28333,16 @@ { \exp_after:wN \__text_expand_math_search:NNN \exp_after:wN #1 \l_text_math_delims_tl - \q_recursion_tail \q_recursion_tail - \q_recursion_stop + \q__text_recursion_tail \q__text_recursion_tail + \q__text_recursion_stop } \cs_new:Npn \__text_expand_math_search:NNN #1#2#3 { - \quark_if_recursion_tail_stop_do:Nn #2 + \__text_if_recursion_tail_stop_do:Nn #2 { \__text_expand_explicit:N #1 } \token_if_eq_meaning:NNTF #1 #2 { - \use_i_delimit_by_q_recursion_stop:nw + \__text_use_i_delimit_by_q_recursion_stop:nw { \__text_expand_store:n {#1} \__text_expand_math_loop:Nw #3 @@ -28061,7 +28350,7 @@ } { \__text_expand_math_search:NNN #1 } } -\cs_new:Npn \__text_expand_math_loop:Nw #1#2 \q_recursion_stop +\cs_new:Npn \__text_expand_math_loop:Nw #1#2 \q__text_recursion_stop { \tl_if_head_is_N_type:nTF {#2} { \__text_expand_math_N_type:NN } @@ -28070,11 +28359,11 @@ { \__text_expand_math_group:Nn } { \__text_expand_math_space:Nw } } - #1#2 \q_recursion_stop + #1#2 \q__text_recursion_stop } \cs_new:Npn \__text_expand_math_N_type:NN #1#2 { - \quark_if_recursion_tail_stop_do:Nn #2 + \__text_if_recursion_tail_stop_do:Nn #2 { \__text_expand_end:w } \__text_expand_store:n {#2} \token_if_eq_meaning:NNTF #2 #1 @@ -28114,15 +28403,15 @@ \cs_new:Npn \__text_expand_exclude:nN #1#2 { \__text_expand_exclude:NN #2 #1 - \q_recursion_tail \q_recursion_stop + \q__text_recursion_tail \q__text_recursion_stop } \cs_new:Npn \__text_expand_exclude:NN #1#2 { - \quark_if_recursion_tail_stop_do:Nn #2 + \__text_if_recursion_tail_stop_do:Nn #2 { \__text_expand_letterlike:N #1 } \cs_if_eq:NNTF #2 #1 { - \use_i_delimit_by_q_recursion_stop:nw + \__text_use_i_delimit_by_q_recursion_stop:nw { \__text_expand_exclude:Nn #1 } } { \__text_expand_exclude:NN #1 } @@ -28136,15 +28425,15 @@ { \exp_after:wN \__text_expand_letterlike:NN \exp_after:wN #1 \l_text_letterlike_tl - \q_recursion_tail \q_recursion_stop + \q__text_recursion_tail \q__text_recursion_stop } \cs_new:Npn \__text_expand_letterlike:NN #1#2 { - \quark_if_recursion_tail_stop_do:Nn #2 + \__text_if_recursion_tail_stop_do:Nn #2 { \__text_expand_cs:N #1 } \cs_if_eq:NNTF #2 #1 { - \use_i_delimit_by_q_recursion_stop:nw + \__text_use_i_delimit_by_q_recursion_stop:nw { \__text_expand_store:n {#1} \__text_expand_loop:w @@ -28168,10 +28457,10 @@ { \cs_to_str:N #1 } #1 } \cs_new:Npn \__text_expand_protect:nN #1#2 - { \__text_expand_protect:Nw #2 #1 \q_nil #1 ~ \q_nil \q_nil \q_stop } -\cs_new:Npn \__text_expand_protect:Nw #1 #2 ~ \q_nil #3 \q_nil #4 \q_stop + { \__text_expand_protect:Nw #2 #1 \q__text_nil #1 ~ \q__text_nil \q__text_nil \s__text_stop } +\cs_new:Npn \__text_expand_protect:Nw #1 #2 ~ \q__text_nil #3 \q__text_nil #4 \s__text_stop { - \quark_if_nil:nTF {#4} + \__text_quark_if_nil:nTF {#4} { \cs_if_exist:cTF {#2} { \exp_args:Ne \__text_expand_store:n { \exp_not:c {#2} } } @@ -28269,7 +28558,7 @@ { \group_align_safe_begin: \__text_change_case_loop:nnw {#2} {#3} #1 - \q_recursion_tail \q_recursion_stop + \q__text_recursion_tail \q__text_recursion_stop \__text_change_case_result:n { } } \cs_new:Npn \__text_change_case_store:n #1 @@ -28283,7 +28572,7 @@ \exp_end: #2 } -\cs_new:Npn \__text_change_case_loop:nnw #1#2#3 \q_recursion_stop +\cs_new:Npn \__text_change_case_loop:nnw #1#2#3 \q__text_recursion_stop { \tl_if_head_is_N_type:nTF {#3} { \__text_change_case_N_type:nnN } @@ -28292,9 +28581,9 @@ { \use:c { __text_change_case_group_ #1 :nnn } } { \__text_change_case_space:nnw } } - {#1} {#2} #3 \q_recursion_stop + {#1} {#2} #3 \q__text_recursion_stop } -\cs_new:Npn \__text_change_case_break:w #1 \q_recursion_tail \q_recursion_stop +\cs_new:Npn \__text_change_case_break:w #1 \q__text_recursion_tail \q__text_recursion_stop { \__text_change_case_store:n {#1} \__text_change_case_end:w @@ -28347,7 +28636,7 @@ } \cs_new:Npn \__text_change_case_N_type:nnN #1#2#3 { - \quark_if_recursion_tail_stop_do:Nn #3 + \__text_if_recursion_tail_stop_do:Nn #3 { \__text_change_case_end:w } \__text_change_case_N_type_aux:nnN {#1} {#2} #3 } @@ -28359,16 +28648,16 @@ \cs_new:Npn \__text_change_case_N_type:nnnN #1#2#3#4 { \__text_change_case_math_search:nnNNN {#2} {#3} #4 #1 - \q_recursion_tail \q_recursion_tail - \q_recursion_stop + \q__text_recursion_tail \q__text_recursion_tail + \q__text_recursion_stop } \cs_new:Npn \__text_change_case_math_search:nnNNN #1#2#3#4#5 { - \quark_if_recursion_tail_stop_do:Nn #4 + \__text_if_recursion_tail_stop_do:Nn #4 { \__text_change_case_cs_check:nnN {#1} {#2} #3 } \token_if_eq_meaning:NNTF #3 #4 { - \use_i_delimit_by_q_recursion_stop:nw + \__text_use_i_delimit_by_q_recursion_stop:nw { \__text_change_case_store:n {#3} \__text_change_case_math_loop:nnNw {#1} {#2} #5 @@ -28376,7 +28665,7 @@ } { \__text_change_case_math_search:nnNNN {#1} {#2} #3 } } -\cs_new:Npn \__text_change_case_math_loop:nnNw #1#2#3#4 \q_recursion_stop +\cs_new:Npn \__text_change_case_math_loop:nnNw #1#2#3#4 \q__text_recursion_stop { \tl_if_head_is_N_type:nTF {#4} { \__text_change_case_math_N_type:nnNN } @@ -28385,11 +28674,11 @@ { \__text_change_case_math_group:nnNn } { \__text_change_case_math_space:nnNw } } - {#1} {#2} #3 #4 \q_recursion_stop + {#1} {#2} #3 #4 \q__text_recursion_stop } \cs_new:Npn \__text_change_case_math_N_type:nnNN #1#2#3#4 { - \quark_if_recursion_tail_stop_do:Nn #4 + \__text_if_recursion_tail_stop_do:Nn #4 { \__text_change_case_end:w } \__text_change_case_store:n {#4} \token_if_eq_meaning:NNTF #4 #3 @@ -28429,15 +28718,15 @@ \cs_new:Npn \__text_change_case_exclude:nnnN #1#2#3#4 { \__text_change_case_exclude:nnNN {#2} {#3} #4 #1 - \q_recursion_tail \q_recursion_stop + \q__text_recursion_tail \q__text_recursion_stop } \cs_new:Npn \__text_change_case_exclude:nnNN #1#2#3#4 { - \quark_if_recursion_tail_stop_do:Nn #4 + \__text_if_recursion_tail_stop_do:Nn #4 { \use:c { __text_change_case_letterlike_ #1 :nnN } {#1} {#2} #3 } \cs_if_eq:NNTF #3 #4 { - \use_i_delimit_by_q_recursion_stop:nw + \__text_use_i_delimit_by_q_recursion_stop:nw { \__text_change_case_exclude:nnNn {#1} {#2} #3 } } { \__text_change_case_exclude:nnNN {#1} {#2} #3 } @@ -28503,7 +28792,7 @@ { \__text_change_case_lower_sigma:nnNw {#2} {#3} #4 } { \__text_change_case_char:nnnN {#1} {#2} {#3} #4 } } - \cs_new:Npn \__text_change_case_lower_sigma:nnNw #1#2#3#4 \q_recursion_stop + \cs_new:Npn \__text_change_case_lower_sigma:nnNw #1#2#3#4 \q__text_recursion_stop { \tl_if_head_is_N_type:nTF {#4} { \__text_change_case_lower_sigma:NnnN #3 } @@ -28512,7 +28801,7 @@ { \char_generate:nn { "03C2 } { \__text_char_catcode:N #3 } } \__text_change_case_loop:nnw } - {#1} {#2} #4 \q_recursion_stop + {#1} {#2} #4 \q__text_recursion_stop } \cs_new:Npn \__text_change_case_lower_sigma:NnnN #1#2#3#4 { @@ -28674,12 +28963,12 @@ \__text_change_case_upper_el_loop:nnw {#2} {#3} } \cs_new:Npn \__text_change_case_upper_el_loop:nnw - #1#2#3 \q_recursion_stop + #1#2#3 \q__text_recursion_stop { \tl_if_head_is_N_type:nTF {#3} { \__text_change_case_upper_el:nnN } { \__text_change_case_loop:nnw } - {#1} {#2} #3 \q_recursion_stop + {#1} {#2} #3 \q__text_recursion_stop } \cs_new:Npn \__text_change_case_upper_el:nnN #1#2#3 { @@ -28806,12 +29095,12 @@ \__text_change_case_lower_lt:nnw {#2} {#3} } } - \cs_new:Npn \__text_change_case_lower_lt:nnw #1#2#3 \q_recursion_stop + \cs_new:Npn \__text_change_case_lower_lt:nnw #1#2#3 \q__text_recursion_stop { \tl_if_head_is_N_type:nTF {#3} { \__text_change_case_lower_lt:nnN } { \__text_change_case_loop:nnw } - {#1} {#2} #3 \q_recursion_stop + {#1} {#2} #3 \q__text_recursion_stop } \cs_new:Npn \__text_change_case_lower_lt:nnN #1#2#3 { @@ -28859,12 +29148,12 @@ \__text_change_case_upper_lt:nnw {#2} {#3} } } - \cs_new:Npn \__text_change_case_upper_lt:nnw #1#2#3 \q_recursion_stop + \cs_new:Npn \__text_change_case_upper_lt:nnw #1#2#3 \q__text_recursion_stop { \tl_if_head_is_N_type:nTF {#3} { \__text_change_case_upper_lt:nnN } { \use:c { __text_change_case_char_next_ #1 :nn } } - {#1} {#2} #3 \q_recursion_stop + {#1} {#2} #3 \q__text_recursion_stop } \cs_new:Npn \__text_change_case_upper_lt:nnN #1#2#3 { @@ -28887,12 +29176,12 @@ } { \__text_change_case_char:nnnN {#1} {#2} {#3} #4 } } -\cs_new:Npn \__text_change_case_title_nl:nnw #1#2#3 \q_recursion_stop +\cs_new:Npn \__text_change_case_title_nl:nnw #1#2#3 \q__text_recursion_stop { \tl_if_head_is_N_type:nTF {#3} { \__text_change_case_title_nl:nnN } { \use:c { __text_change_case_char_next_ #1 :nn } } - {#1} {#2} #3 \q_recursion_stop + {#1} {#2} #3 \q__text_recursion_stop } \cs_new:Npn \__text_change_case_title_nl:nnN #1#2#3 { @@ -28928,7 +29217,7 @@ { \__text_change_case_lower_sigma:nnnN {#1} {#2} {#3} #4 } } } - \cs_new:Npn \__text_change_case_lower_tr:nnNw #1#2#3#4 \q_recursion_stop + \cs_new:Npn \__text_change_case_lower_tr:nnNw #1#2#3#4 \q__text_recursion_stop { \tl_if_head_is_N_type:nTF {#4} { \__text_change_case_lower_tr:NnnN #3 } @@ -28937,7 +29226,7 @@ { \char_generate:nn { "0131 } { \__text_char_catcode:N #3 } } \__text_change_case_loop:nnw } - {#1} {#2} #4 \q_recursion_stop + {#1} {#2} #4 \q__text_recursion_stop } \cs_new:Npn \__text_change_case_lower_tr:NnnN #1#2#3#4 { @@ -29358,6 +29647,7 @@ } } %% File: l3text-purify.dtx +\__kernel_quark_new_test:N \__text_if_recursion_tail_stop:N \cs_new:Npn \text_purify:n #1 { \group_align_safe_begin: @@ -29366,8 +29656,8 @@ \group_align_safe_end: } \cs_new:Npn \__text_purify:n #1 - { \__text_purify_loop:w #1 \q_recursion_tail \q_recursion_stop } -\cs_new:Npn \__text_purify_loop:w #1 \q_recursion_stop + { \__text_purify_loop:w #1 \q__text_recursion_tail \q__text_recursion_stop } +\cs_new:Npn \__text_purify_loop:w #1 \q__text_recursion_stop { \tl_if_head_is_N_type:nTF {#1} { \__text_purify_N_type:N } @@ -29376,7 +29666,7 @@ { \__text_purify_group:n } { \__text_purify_space:w } } - #1 \q_recursion_stop + #1 \q__text_recursion_stop } \cs_new:Npn \__text_purify_group:n #1 { \__text_purify_loop:w #1 } \exp_last_unbraced:NNo \cs_new:Npn \__text_purify_space:w \c_space_tl @@ -29386,30 +29676,30 @@ } \cs_new:Npn \__text_purify_N_type:N #1 { - \quark_if_recursion_tail_stop:N #1 + \__text_if_recursion_tail_stop:N #1 \__text_purify_N_type_aux:N #1 } \cs_new:Npn \__text_purify_N_type_aux:N #1 { \exp_after:wN \__text_purify_math_search:NNN \exp_after:wN #1 \l_text_math_delims_tl - \q_recursion_tail ? - \q_recursion_stop + \q__text_recursion_tail ? + \q__text_recursion_stop } \cs_new:Npn \__text_purify_math_search:NNN #1#2#3 { - \quark_if_recursion_tail_stop_do:Nn #2 + \__text_if_recursion_tail_stop_do:Nn #2 { \__text_purify_math_cmd:N #1 } \token_if_eq_meaning:NNTF #1 #2 { - \use_i_delimit_by_q_recursion_stop:nw + \__text_use_i_delimit_by_q_recursion_stop:nw { \__text_purify_math_start:NNw #2 #3 } } { \__text_purify_math_search:NNN #1 } } -\cs_new:Npn \__text_purify_math_start:NNw #1#2#3 \q_recursion_stop +\cs_new:Npn \__text_purify_math_start:NNw #1#2#3 \q__text_recursion_stop { - \__text_purify_math_loop:NNw #1#2#3 \q_recursion_stop + \__text_purify_math_loop:NNw #1#2#3 \q__text_recursion_stop \__text_purify_math_result:n { } } \cs_new:Npn \__text_purify_math_store:n #1 @@ -29423,7 +29713,7 @@ } \cs_new:Npn \__text_purify_math_stop:Nw #1 \__text_purify_math_result:n #2 { \exp_not:n {#1#2} } -\cs_new:Npn \__text_purify_math_loop:NNw #1#2#3 \q_recursion_stop +\cs_new:Npn \__text_purify_math_loop:NNw #1#2#3 \q__text_recursion_stop { \tl_if_head_is_N_type:nTF {#3} { \__text_purify_math_N_type:NNN } @@ -29432,11 +29722,11 @@ { \__text_purify_math_group:NNn } { \__text_purify_math_space:NNw } } - #1#2#3 \q_recursion_stop + #1#2#3 \q__text_recursion_stop } \cs_new:Npn \__text_purify_math_N_type:NNN #1#2#3 { - \quark_if_recursion_tail_stop_do:Nn #3 + \__text_if_recursion_tail_stop_do:Nn #3 { \__text_purify_math_stop:Nw #1 } \token_if_eq_meaning:NNTF #3 #2 { \__text_purify_math_end:w } @@ -29460,15 +29750,15 @@ \cs_new:Npn \__text_purify_math_cmd:N #1 { \exp_after:wN \__text_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__text_recursion_tail \q__text_recursion_stop } \cs_new:Npn \__text_purify_math_cmd:NN #1#2 { - \quark_if_recursion_tail_stop_do:Nn #2 + \__text_if_recursion_tail_stop_do:Nn #2 { \__text_purify_replace:N #1 } \cs_if_eq:NNTF #2 #1 { - \use_i_delimit_by_q_recursion_stop:nw + \__text_use_i_delimit_by_q_recursion_stop:nw { \__text_purify_math_cmd:n } } { \__text_purify_math_cmd:NN #1 } @@ -29510,7 +29800,7 @@ } \cs_new:Npn \__text_purify_protect:N #1 { - \quark_if_recursion_tail_stop:N #1 + \__text_if_recursion_tail_stop:N #1 \__text_purify_loop:w } \cs_new_protected:Npn \text_declare_purify_equivalent:Nn #1#2 @@ -30082,8 +30372,8 @@ \cs_new:Npn \__msg_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 \__msg_use_none_delimit_by_s_stop:w + \use:n { \::error ! ~ #2 : ~ #1 } \s__msg_stop } \cs_new_protected:Npn \msg_show_eval:Nn #1#2 { \exp_args:Nf \__msg_show_eval:nnN { #1 {#2} } {#2} \tl_show:n } @@ -30114,6 +30404,8 @@ \cs_new_protected:Npn \bool_gset_inverse:N #1 { \bool_if:NTF #1 { \bool_gset_false:N } { \bool_gset_true:N } #1 } \cs_generate_variant:Nn \bool_gset_inverse:N { c } +\scan_new:N \s__bool_mark +\scan_new:N \s__bool_stop \cs_new:Npn \bool_case_true:nTF { \exp:w \__bool_case:NnTF \c_true_bool } \cs_new:Npn \bool_case_true:nT #1#2 @@ -30133,7 +30425,7 @@ \cs_new:Npn \__bool_case:NnTF #1#2#3#4 { \bool_if:NTF #1 \__bool_case_true:w \__bool_case_false:w - #2 #1 { } \q_mark {#3} \q_mark {#4} \q_stop + #2 #1 { } \s__bool_mark {#3} \s__bool_mark {#4} \s__bool_stop } \cs_new:Npn \__bool_case_true:w #1#2 { @@ -30147,45 +30439,46 @@ { \__bool_case_false:w } { \__bool_case_end:nw {#2} } } -\cs_new:Npn \__bool_case_end:nw #1#2#3 \q_mark #4#5 \q_stop +\cs_new:Npn \__bool_case_end:nw #1#2#3 \s__bool_mark #4#5 \s__bool_stop { \exp_end: #1 #4 } +\cs_new:Npn \__prop_use_i_delimit_by_s_stop:nw #1 #2 \s__prop_stop {#1} \cs_new:Npn \prop_rand_key_value:N #1 { \prop_if_empty:NF #1 { \exp_after:wN \__prop_rand_item:w \int_value:w \int_rand:nn { 1 } { \prop_count:N #1 } - #1 \q_stop + #1 \s__prop_stop } } \cs_generate_variant:Nn \prop_rand_key_value:N { c } \cs_new:Npn \__prop_rand_item:w #1 \s__prop \__prop_pair:wn #2 \s__prop #3 { \int_compare:nNnF {#1} > 1 - { \use_i_delimit_by_q_stop:nw { \exp_not:n { {#2} {#3} } } } + { \__prop_use_i_delimit_by_s_stop:nw { \exp_not:n { {#2} {#3} } } } \exp_after:wN \__prop_rand_item:w \int_value:w \int_eval:n { #1 - 1 } \s__prop } \cs_new:Npn \seq_mapthread_function:NNN #1#2#3 - { \exp_after:wN \__seq_mapthread_function:wNN #2 \q_stop #1 #3 } -\cs_new:Npn \__seq_mapthread_function:wNN \s__seq #1 \q_stop #2#3 + { \exp_after:wN \__seq_mapthread_function:wNN #2 \s__seq_stop #1 #3 } +\cs_new:Npn \__seq_mapthread_function:wNN \s__seq #1 \s__seq_stop #2#3 { - \exp_after:wN \__seq_mapthread_function:wNw #2 \q_stop #3 + \exp_after:wN \__seq_mapthread_function:wNw #2 \s__seq_stop #3 #1 { ? \prg_break: } { } \prg_break_point: } -\cs_new:Npn \__seq_mapthread_function:wNw \s__seq #1 \q_stop #2 +\cs_new:Npn \__seq_mapthread_function:wNw \s__seq #1 \s__seq_stop #2 { \__seq_mapthread_function:Nnnwnn #2 #1 { ? \prg_break: } { } - \q_stop + \s__seq_stop } -\cs_new:Npn \__seq_mapthread_function:Nnnwnn #1#2#3#4 \q_stop #5#6 +\cs_new:Npn \__seq_mapthread_function:Nnnwnn #1#2#3#4 \s__seq_stop #5#6 { \use_none:n #2 \use_none:n #5 #1 {#3} {#6} - \__seq_mapthread_function:Nnnwnn #1 #4 \q_stop + \__seq_mapthread_function:Nnnwnn #1 #4 \s__seq_stop } \cs_generate_variant:Nn \seq_mapthread_function:NNN { Nc , c , cc } \cs_new_protected:Npn \seq_set_filter:NNn @@ -30526,10 +30819,12 @@ } %% File: l3deprecation.dtx \bool_new:N \l__deprecation_grace_period_bool +\scan_new:N \s__deprecation_mark +\scan_new:N \s__deprecation_stop \cs_new:Npn \__deprecation_date_compare:nNnTF #1#2#3 - { \__deprecation_date_compare_aux:w #1 -0-0- \q_mark #2 #3 -0-0- \q_stop } + { \__deprecation_date_compare_aux:w #1 -0-0- \s__deprecation_mark #2 #3 -0-0- \s__deprecation_stop } \cs_new:Npn \__deprecation_date_compare_aux:w - #1 - #2 - #3 - #4 \q_mark #5 #6 - #7 - #8 - #9 \q_stop + #1 - #2 - #3 - #4 \s__deprecation_mark #5 #6 - #7 - #8 - #9 \s__deprecation_stop { \int_compare:nNnTF {#1} = {#6} { @@ -30549,7 +30844,7 @@ \exp_args:Nf \__deprecation_date_compare:nNnTF { \exp_after:wN \__deprecation_minus_six_months:w - \ExplLoaderFileDate -0-0- \q_stop + \ExplLoaderFileDate -0-0- \s__deprecation_stop } < {#1} { \bool_set_true:N \l__deprecation_grace_period_bool @@ -30558,7 +30853,7 @@ { \use_ii:nn } } } -\cs_new:Npn \__deprecation_minus_six_months:w #1 - #2 - #3 - #4 \q_stop +\cs_new:Npn \__deprecation_minus_six_months:w #1 - #2 - #3 - #4 \s__deprecation_stop { \int_compare:nNnTF {#2} > 6 { #1 - \int_eval:n { #2 - 6 } - #3 } diff --git a/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex b/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex index e90fd568615..ca20bd595a7 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex +++ b/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex @@ -19,7 +19,7 @@ %% and all files in that bundle must be distributed together. %% %% File: expl3.dtx -\def\ExplFileDate{2020-05-05}% +\def\ExplFileDate{2020-05-11}% \let\ExplLoaderFileDate\ExplFileDate \begingroup \def\tempa{LaTeX2e}% diff --git a/Master/texmf-dist/tex/latex/l3kernel/expl3.ltx b/Master/texmf-dist/tex/latex/l3kernel/expl3.ltx index 3308eb7f937..0cf5f0fd3a1 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/expl3.ltx +++ b/Master/texmf-dist/tex/latex/l3kernel/expl3.ltx @@ -19,7 +19,7 @@ %% and all files in that bundle must be distributed together. %% %% File: expl3.dtx -\def\ExplFileDate{2020-05-05}% +\def\ExplFileDate{2020-05-11}% \let\ExplLoaderFileDate\ExplFileDate \everyjob\expandafter{\the\everyjob \message{L3 programming layer <\ExplFileDate>}% @@ -104,6 +104,9 @@ } } { \sys_everyjob: } +\reverse_if:N \if_cs_exist:N \s__expl_stop + \scan_new:N \s__expl_stop +\fi: \tl_put_left:Nn \@pushfilename { \exp_args:Nx \__kernel_file_input_push:n @@ -130,9 +133,9 @@ \__kernel_file_input_pop: \tl_if_empty:NTF \l__expl_status_stack_tl { \ExplSyntaxOff } - { \exp_after:wN \__expl_status_pop:w \l__expl_status_stack_tl \q_stop } + { \exp_after:wN \__expl_status_pop:w \l__expl_status_stack_tl \s__expl_stop } } -\cs_gset_protected:Npn \__expl_status_pop:w #1#2 \q_stop +\cs_gset_protected:Npn \__expl_status_pop:w #1#2 \s__expl_stop { \tl_set:Nn \l__expl_status_stack_tl {#2} \int_if_odd:nTF {#1} diff --git a/Master/texmf-dist/tex/latex/l3kernel/expl3.sty b/Master/texmf-dist/tex/latex/l3kernel/expl3.sty index 0817fbd604a..b962ab36e6e 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/expl3.sty +++ b/Master/texmf-dist/tex/latex/l3kernel/expl3.sty @@ -19,7 +19,7 @@ %% and all files in that bundle must be distributed together. %% %% File: expl3.dtx -\def\ExplFileDate{2020-05-05}% +\def\ExplFileDate{2020-05-11}% \let\ExplLoaderFileDate\ExplFileDate \ProvidesPackage{expl3} [% @@ -121,6 +121,9 @@ } } { \sys_everyjob: } +\reverse_if:N \if_cs_exist:N \s__expl_stop + \scan_new:N \s__expl_stop +\fi: \tl_put_left:Nn \@pushfilename { \exp_args:Nx \__kernel_file_input_push:n @@ -147,9 +150,9 @@ \__kernel_file_input_pop: \tl_if_empty:NTF \l__expl_status_stack_tl { \ExplSyntaxOff } - { \exp_after:wN \__expl_status_pop:w \l__expl_status_stack_tl \q_stop } + { \exp_after:wN \__expl_status_pop:w \l__expl_status_stack_tl \s__expl_stop } } -\cs_gset_protected:Npn \__expl_status_pop:w #1#2 \q_stop +\cs_gset_protected:Npn \__expl_status_pop:w #1#2 \s__expl_stop { \tl_set:Nn \l__expl_status_stack_tl {#2} \int_if_odd:nTF {#1} diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3debug.def b/Master/texmf-dist/tex/latex/l3kernel/l3debug.def index cfe9bcf7de7..8f0b6e73e4d 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3debug.def +++ b/Master/texmf-dist/tex/latex/l3kernel/l3debug.def @@ -20,6 +20,13 @@ %% %% File: l3debug.dtx \ProvidesExplFile{l3debug.def}{2019-04-06}{}{L3 Debugging support} +\scan_new:N \s__debug_stop +\cs_new:Npn \__debug_use_i_delimit_by_s_stop:nw #1 #2 \s__debug_stop {#1} +\quark_new:N \q__debug_recursion_tail +\quark_new:N \q__debug_recursion_stop +\cs_new:Npn \__debug_use_none_delimit_by_q_recursion_stop:w + #1 \q__debug_recursion_stop { } +\__kernel_quark_new_test:N \__debug_if_recursion_tail_stop:N \cs_set_protected:Npn \debug_on:n #1 { \exp_args:No \clist_map_inline:nn { \tl_to_str:n {#1} } @@ -139,9 +146,9 @@ { \exp_args:NNf \__debug_chk_var_scope_aux:Nn #1 { \cs_to_str:N #2 } } \cs_new_protected:Npn \__debug_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 \__debug_use_i_delimit_by_s_stop:nw #2 ? ? \s__debug_stop \exp_after:wN \__debug_chk_var_scope_aux:NNn - \use_i_delimit_by_q_stop:nw #2 ? \q_stop + \__debug_use_i_delimit_by_s_stop:nw #2 ? \s__debug_stop #1 {#2} \else: \exp_args:Nc \__debug_chk_var_scope_aux:NNn @@ -216,16 +223,16 @@ \cs_new:Npn \__debug_build_parm_text:n #1 { \__debug_arg_list_from_signature:nNN { 1 } \c_false_bool #1 - \q_recursion_tail \q_recursion_stop + \q__debug_recursion_tail \q__debug_recursion_stop } \cs_new:Npn \__debug_build_arg_list:n #1 { \__debug_arg_list_from_signature:nNN { 1 } \c_true_bool #1 - \q_recursion_tail \q_recursion_stop + \q__debug_recursion_tail \q__debug_recursion_stop } \cs_new:Npn \__debug_arg_list_from_signature:nNN #1 #2 #3 { - \quark_if_recursion_tail_stop:N #3 + \__debug_if_recursion_tail_stop:N #3 \__debug_arg_check_invalid:N #3 \bool_if:NT #2 { \__debug_arg_if_braced:NT #3 { \use_none:n } } \use:n { \c_hash_str \int_eval:n {#1} } @@ -246,7 +253,7 @@ \exp_end: } \cs_new:Npn \__debug_parm_terminate:w - { \exp_after:wN \use_none_delimit_by_q_recursion_stop:w \exp:w } + { \exp_after:wN \__debug_use_none_delimit_by_q_recursion_stop:w \exp:w } \prg_new_conditional:Npnn \__debug_arg_if_braced:N #1 { T } { \exp_args:Nf \__debug_arg_if_braced:n { \__debug_get_base_form:N #1 } } \cs_new:Npn \__debug_arg_if_braced:n #1 @@ -332,7 +339,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__debug_stop { \exp_not:N \exp_args:Nx \exp_not:N \tex_scantokens:D { @@ -346,7 +353,7 @@ } } } - \exp_after:wN \__debug_tmp:w \cs_meaning:N #1 \q_mark + \exp_after:wN \__debug_tmp:w \cs_meaning:N #1 \s__debug_stop } \cs_set_protected:Npn \__kernel_patch_weird:nnn { @@ -943,7 +950,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__skip_stop } } \exp_args:No \__skip_tmp:w { \tl_to_str:n { fil } } -- cgit v1.2.3