texlive[55101] Master/texmf-dist: l3kernel (11may20)

commits+karl at tug.org commits+karl at tug.org
Mon May 11 22:47:47 CEST 2020


Revision: 55101
          http://tug.org/svn/texlive?view=revision&revision=55101
Author:   karl
Date:     2020-05-11 22:47:47 +0200 (Mon, 11 May 2020)
Log Message:
-----------
l3kernel (11may20)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md
    trunk/Master/texmf-dist/doc/latex/l3kernel/README.md
    trunk/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news01.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news02.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news03.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news04.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news05.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news06.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news07.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news08.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news09.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news10.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news11.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news12.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex
    trunk/Master/texmf-dist/doc/latex/l3kernel/source3.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex
    trunk/Master/texmf-dist/doc/latex/l3kernel/source3body.tex
    trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3.ins
    trunk/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3final.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3format.ins
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3text.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx
    trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex
    trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex
    trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.ltx
    trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3debug.def

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md	2020-05-11 20:47:47 UTC (rev 55101)
@@ -7,6 +7,11 @@
 
 ## [Unreleased]
 
+## [2020-05-11]
+
+### Changed
+- Internal changes to quark handling
+
 ## [2020-05-05]
 
 ### Added
@@ -673,7 +678,8 @@
 - 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

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/README.md	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/README.md	2020-05-11 20:47:47 UTC (rev 55101)
@@ -1,7 +1,7 @@
 LaTeX3 Programming Conventions
 ==============================
 
-Release 2020-05-05
+Release 2020-05-11
 
 Overview
 --------

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex	2020-05-11 20:47:47 UTC (rev 55101)
@@ -54,7 +54,7 @@
          {latex-team at latex-project.org}%
    }%
 }
-\date{Released 2020-05-05}
+\date{Released 2020-05-11}
 
 \pagenumbering{roman}
 \maketitle

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news01.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news02.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news03.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news04.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news05.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news06.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news07.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news08.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news09.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news10.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news11.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news12.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex	2020-05-11 20:47:47 UTC (rev 55101)
@@ -32,7 +32,7 @@
         {latex-team at latex-project.org}%
     }%
 }
-\date{Released 2020-05-05}
+\date{Released 2020-05-11}
 
 \begin{document}
 

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex	2020-05-11 20:47:47 UTC (rev 55101)
@@ -32,7 +32,7 @@
         {latex-team at latex-project.org}%
     }%
 }
-\date{Released 2020-05-05}
+\date{Released 2020-05-11}
 
 \newcommand{\TF}{\textit{(TF)}}
 

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex	2020-05-11 20:47:47 UTC (rev 55101)
@@ -32,7 +32,7 @@
         {latex-team at latex-project.org}%
     }%
 }
-\date{Released 2020-05-05}
+\date{Released 2020-05-11}
 
 \newcommand{\TF}{\textit{(TF)}}
 

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/source3.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex	2020-05-11 20:47:47 UTC (rev 55101)
@@ -53,7 +53,7 @@
          {latex-team at latex-project.org}%
    }%
 }
-\date{Released 2020-05-05}
+\date{Released 2020-05-11}
 
 \pagenumbering{roman}
 \maketitle

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/source3body.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/source3body.tex	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/source3body.tex	2020-05-11 20:47:47 UTC (rev 55101)
@@ -436,10 +436,10 @@
 \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}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -24,7 +24,7 @@
 %
 %<*driver|generic|package|2ekernel>
 %</driver|generic|package|2ekernel>
-\def\ExplFileDate{2020-05-05}%
+\def\ExplFileDate{2020-05-11}%
 %<*driver>
 \documentclass[full]{l3doc}
 \usepackage{graphicx}
@@ -51,7 +51,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
 %
 % \maketitle
 %
@@ -1334,6 +1334,17 @@
   { \sys_everyjob: }
 %    \end{macrocode}
 %
+% \begin{variable}{\s_@@_stop}
+%   Internal scan marks. This code has to be reload-safe, so this one
+%   has to be guarded with \cs{if_cs_exist:N} (\cs{cs_if_exist:NF}) wouldn't
+%   do because it returns false for control sequences equal to \cs{scan_stop:}.
+%    \begin{macrocode}
+\reverse_if:N \if_cs_exist:N \s_@@_stop
+  \scan_new:N \s_@@_stop
+\fi:
+%    \end{macrocode}
+% \end{variable}
+%
 % \begin{macro}{\@pushfilename, \@popfilename}
 % \begin{macro}{\@@_status_pop:w}
 %   The idea here is to use \LaTeXe{}'s \tn{@pushfilename} and
@@ -1372,7 +1383,7 @@
     \__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,
@@ -1379,7 +1390,7 @@
 %   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}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3.ins
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3.ins	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3.ins	2020-05-11 20:47:47 UTC (rev 55101)
@@ -65,9 +65,9 @@
         \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}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -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: }
   }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -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,7 +1161,7 @@
       {
         \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 }
@@ -1153,7 +1168,7 @@
 \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}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -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,10 +1248,10 @@
     \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
@@ -1223,11 +1258,11 @@
       {
         \@@_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} }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -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}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -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 } }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
 %
 % \maketitle
 %
@@ -109,6 +109,14 @@
 %    \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).
@@ -115,9 +123,9 @@
 %   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 }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -79,7 +79,7 @@
 %
 % \title{The \cls{l3doc} class}
 % \author{\Team}
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
 % \maketitle
 % \tableofcontents
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -63,7 +63,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -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 } }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -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,7 +1936,7 @@
     \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
   }
@@ -1919,8 +1943,8 @@
 \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,7 +2135,7 @@
             \l_@@_line_part_tl
             #1
             { ? \@@_wrap_break_end:w }
-            \q_mark
+            \s_@@_mark
       }
     \cs_new:Npn \@@_wrap_break_first:w ##1 #1 ##2
       {
@@ -2118,7 +2142,7 @@
         \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,7 +3524,7 @@
 %   |-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}
@@ -3465,12 +3531,12 @@
     \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}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3final.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3final.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3final.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3format.ins
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3format.ins	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3format.ins	2020-05-11 20:47:47 UTC (rev 55101)
@@ -62,9 +62,9 @@
         \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}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
 % \maketitle
 %
 % \begin{documentation}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -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

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -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}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -40,7 +40,7 @@
 %          {latex-team at 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}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -40,7 +40,7 @@
 %          {latex-team at 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,8 +683,8 @@
     \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
@@ -691,7 +691,7 @@
       \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}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -40,7 +40,7 @@
 %          {latex-team at 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

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
 % \maketitle
 %
 % \begin{documentation}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -49,7 +49,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -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,7 +1696,7 @@
     \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}
@@ -1672,7 +1703,7 @@
       { \@@_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}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -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$.

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -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,7 +1083,7 @@
     \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
@@ -1096,7 +1090,7 @@
     \@@_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
   }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -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:}.

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -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}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -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:

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -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}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -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}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -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} }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -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,7 +1420,7 @@
     \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}
@@ -1410,7 +1427,7 @@
       { \@@_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}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -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}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -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,7 +2532,7 @@
       \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 } { }
@@ -2525,10 +2539,10 @@
     }
   \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:
     }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -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,7 +1285,7 @@
     \@@_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}
@@ -1252,7 +1292,7 @@
       { \@@_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,7 +1383,7 @@
         \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
@@ -1350,7 +1390,7 @@
   { \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,7 +1521,7 @@
     \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;
   {
@@ -1488,9 +1528,9 @@
     \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 } ;
           }
@@ -1497,9 +1537,9 @@
       }
       {
         \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,7 +1821,7 @@
 %   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}
@@ -1788,7 +1828,7 @@
 %   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 }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -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
       {

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -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,7 +135,7 @@
 %    \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
@@ -135,23 +142,23 @@
   {
     \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}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3text.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3text.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3text.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
 %
 % \maketitle
 %
@@ -277,6 +277,52 @@
 %<@@=text>
 %    \end{macrocode}
 %
+% \subsection{Internal auxiliaries}
+%
+% \begin{variable}{\s_@@_stop}
+%   Internal scan marks.
+%    \begin{macrocode}
+\scan_new:N \s_@@_stop
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\q_@@_nil}
+%   Internal quarks.
+%    \begin{macrocode}
+\quark_new:N \q_@@_nil
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[pTF]{\@@_quark_if_nil:n}
+%   Branching quark conditional.
+%    \begin{macrocode}
+\__kernel_quark_new_conditional:Nn \@@_quark_if_nil:n { TF }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{variable}{\q_@@_recursion_tail,\q_@@_recursion_stop}
+%   Internal recursion quarks.
+%    \begin{macrocode}
+\quark_new:N \q_@@_recursion_tail
+\quark_new:N \q_@@_recursion_stop
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP]{\@@_use_i_delimit_by_q_recursion_stop:nw}
+%   Functions to gobble up to a quark.
+%    \begin{macrocode}
+\cs_new:Npn \@@_use_i_delimit_by_q_recursion_stop:nw
+  #1 #2 \q_@@_recursion_stop {#1}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\@@_if_recursion_tail_stop_do:Nn}
+%   Functions to query recursion quarks.
+%    \begin{macrocode}
+\__kernel_quark_new_test:N \@@_if_recursion_tail_stop_do:Nn
+%    \end{macrocode}
+% \end{macro}
+%
 % \subsection{Utilities}
 %
 % \begin{macro}[EXP]
@@ -379,9 +425,9 @@
         \if_catcode:w + #1 12 \else:
         4 \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi:
     \exp_after:wN ;
-    \token_to_meaning:N #1 \q_stop
+    \token_to_meaning:N #1 \s_@@_stop
   }
-\cs_new:Npn \@@_token_to_explicit_auxi:w #1 ; #2 \q_stop
+\cs_new:Npn \@@_token_to_explicit_auxi:w #1 ; #2 \s_@@_stop
   {
     \char_generate:nn
       {
@@ -453,7 +499,7 @@
           {
             { \token_if_protected_macro_p:N      #1 }
             { \token_if_protected_long_macro_p:N #1 }
-            { \token_if_eq_meaning_p:NN \q_recursion_tail #1 }
+            { \token_if_eq_meaning_p:NN \q_@@_recursion_tail #1 }
           }
           { \prg_return_false: }
           { \prg_return_true: }
@@ -615,7 +661,7 @@
   {
     \group_align_safe_begin:
     \@@_expand_loop:w #1
-      \q_recursion_tail \q_recursion_stop
+      \q_@@_recursion_tail \q_@@_recursion_stop
     \@@_expand_result:n { }
   }
 %    \end{macrocode}
@@ -638,7 +684,7 @@
 %   recursively, while spaces are just passed through. Thus all of the
 %   action is in handling \texttt{N}-type tokens.
 %    \begin{macrocode}
-\cs_new:Npn \@@_expand_loop:w #1 \q_recursion_stop
+\cs_new:Npn \@@_expand_loop:w #1 \q_@@_recursion_stop
   {
     \tl_if_head_is_N_type:nTF {#1}
       { \@@_expand_N_type:N }
@@ -647,7 +693,7 @@
           { \@@_expand_group:n }
           { \@@_expand_space:w }
       }
-    #1 \q_recursion_stop
+    #1 \q_@@_recursion_stop
   }
 \cs_new:Npn \@@_expand_group:n #1
   {
@@ -675,7 +721,7 @@
 %    \begin{macrocode}
 \cs_new:Npx \@@_expand_N_type:N #1
   {
-    \exp_not:N \quark_if_recursion_tail_stop_do:Nn #1
+    \exp_not:N \@@_if_recursion_tail_stop_do:Nn #1
       { \exp_not:N \@@_expand_end:w }
     \exp_not:N \bool_lazy_any:nTF
       {
@@ -749,16 +795,16 @@
   {
     \exp_after:wN \@@_expand_math_search:NNN
       \exp_after:wN #1 \l_text_math_delims_tl
-      \q_recursion_tail \q_recursion_tail
-      \q_recursion_stop
+      \q_@@_recursion_tail \q_@@_recursion_tail
+      \q_@@_recursion_stop
   }
 \cs_new:Npn \@@_expand_math_search:NNN #1#2#3
   {
-    \quark_if_recursion_tail_stop_do:Nn #2
+    \@@_if_recursion_tail_stop_do:Nn #2
       { \@@_expand_explicit:N #1 }
     \token_if_eq_meaning:NNTF #1 #2
       {
-        \use_i_delimit_by_q_recursion_stop:nw
+        \@@_use_i_delimit_by_q_recursion_stop:nw
            {
              \@@_expand_store:n {#1}
              \@@_expand_math_loop:Nw #3
@@ -766,7 +812,7 @@
       }
       { \@@_expand_math_search:NNN #1 }
   }
-\cs_new:Npn \@@_expand_math_loop:Nw #1#2 \q_recursion_stop
+\cs_new:Npn \@@_expand_math_loop:Nw #1#2 \q_@@_recursion_stop
   {
     \tl_if_head_is_N_type:nTF {#2}
       { \@@_expand_math_N_type:NN }
@@ -775,11 +821,11 @@
           { \@@_expand_math_group:Nn }
           { \@@_expand_math_space:Nw }
       }
-    #1#2 \q_recursion_stop
+    #1#2 \q_@@_recursion_stop
   }
 \cs_new:Npn \@@_expand_math_N_type:NN #1#2
   {
-    \quark_if_recursion_tail_stop_do:Nn #2
+    \@@_if_recursion_tail_stop_do:Nn #2
       { \@@_expand_end:w }
     \@@_expand_store:n {#2}
     \token_if_eq_meaning:NNTF #2 #1
@@ -820,7 +866,7 @@
     \exp_after:wN \@@_expand_exclude:NN
       \l_text_math_arg_tl
       #1
-      \q_recursion_tail \q_recursion_stop
+      \q_@@_recursion_tail \q_@@_recursion_stop
 %</initex>
 %<*package>
     \exp_args:Ne \@@_expand_exclude:nN
@@ -836,12 +882,12 @@
 \cs_new:Npn \@@_expand_exclude:nN #1#2
   {
     \@@_expand_exclude:NN #2 #1
-      \q_recursion_tail \q_recursion_stop
+      \q_@@_recursion_tail \q_@@_recursion_stop
   }
 %</package>
 \cs_new:Npn \@@_expand_exclude:NN #1#2
   {
-    \quark_if_recursion_tail_stop_do:Nn #2
+    \@@_if_recursion_tail_stop_do:Nn #2
 %<*initex>
       { \@@_expand_cs:N #1 }
 %</initex>
@@ -850,7 +896,7 @@
 %</package>
     \cs_if_eq:NNTF #2 #1
       {
-        \use_i_delimit_by_q_recursion_stop:nw
+        \@@_use_i_delimit_by_q_recursion_stop:nw
           { \@@_expand_exclude:Nn #1 }
       }
       { \@@_expand_exclude:NN #1 }
@@ -869,15 +915,15 @@
   {
     \exp_after:wN \@@_expand_letterlike:NN \exp_after:wN
       #1 \l_text_letterlike_tl
-      \q_recursion_tail \q_recursion_stop
+      \q_@@_recursion_tail \q_@@_recursion_stop
   }
 \cs_new:Npn \@@_expand_letterlike:NN #1#2
   {
-    \quark_if_recursion_tail_stop_do:Nn #2
+    \@@_if_recursion_tail_stop_do:Nn #2
       { \@@_expand_cs:N #1 }
     \cs_if_eq:NNTF #2 #1
       {
-        \use_i_delimit_by_q_recursion_stop:nw
+        \@@_use_i_delimit_by_q_recursion_stop:nw
           {
             \@@_expand_store:n {#1}
             \@@_expand_loop:w
@@ -908,10 +954,10 @@
       { \cs_to_str:N #1 } #1
   }
 \cs_new:Npn \@@_expand_protect:nN #1#2
-  { \@@_expand_protect:Nw #2 #1 \q_nil #1 ~ \q_nil \q_nil \q_stop }
-\cs_new:Npn \@@_expand_protect:Nw #1 #2 ~ \q_nil #3 \q_nil #4 \q_stop
+  { \@@_expand_protect:Nw #2 #1 \q_@@_nil #1 ~ \q_@@_nil \q_@@_nil \s_@@_stop }
+\cs_new:Npn \@@_expand_protect:Nw #1 #2 ~ \q_@@_nil #3 \q_@@_nil #4 \s_@@_stop
   {
-    \quark_if_nil:nTF {#4}
+    \@@_quark_if_nil:nTF {#4}
       {
         \cs_if_exist:cTF {#2}
           { \exp_args:Ne \@@_expand_store:n { \exp_not:c {#2} } }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -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,7 +1855,7 @@
 %   \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
@@ -1833,7 +1862,7 @@
 %   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,7 +2362,7 @@
 \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
@@ -2340,7 +2369,7 @@
   { \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,7 +2439,7 @@
 \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
@@ -2417,7 +2446,7 @@
   { \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,9 +2864,9 @@
 \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}
@@ -2845,8 +2873,8 @@
   }
 \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}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -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:
   {

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2020-05-05}
+% \date{Released 2020-05-11}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex	2020-05-11 20:47:47 UTC (rev 55101)
@@ -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,20 +3552,20 @@
     \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
   {
@@ -3562,7 +3572,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 \__cs_use_none_delimit_by_q_recursion_stop:w
     \fi:
     \__cs_generate_variant:Nnnw #4 {#1}{#2}
   }
@@ -3569,7 +3579,7 @@
 \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,12 +4706,12 @@
 \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
@@ -4406,7 +4718,7 @@
   { \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,7 +4747,7 @@
 \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}
   }
@@ -4442,7 +4754,7 @@
 \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
@@ -4449,7 +4761,7 @@
   { \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,9 +4955,9 @@
 \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}
@@ -4652,8 +4964,8 @@
   }
 \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,7 +5490,7 @@
     \__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}
@@ -5173,7 +5497,7 @@
       { \__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
   {
@@ -5180,7 +5504,7 @@
     \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,7 +5550,7 @@
         \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
@@ -5233,7 +5557,7 @@
   { \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,7 +5629,7 @@
     \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;
   {
@@ -5312,9 +5636,9 @@
     \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 } ;
           }
@@ -5321,9 +5645,9 @@
       }
       {
         \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,7 +6808,7 @@
     \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}
@@ -6598,7 +6815,7 @@
       { \__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,10 +8204,10 @@
     \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
@@ -7984,11 +8214,11 @@
       {
         \__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,7 +11254,7 @@
     \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
   }
@@ -10999,8 +11261,8 @@
 \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,7 +11368,7 @@
             \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
       {
@@ -11113,7 +11375,7 @@
         \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,10 +12222,10 @@
         \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}
@@ -11963,9 +12232,9 @@
     \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,7 +12462,7 @@
     \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}
@@ -12197,7 +12469,7 @@
       { \__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,7 +12866,7 @@
     \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
@@ -12606,22 +12873,18 @@
     \__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,7 +14370,7 @@
     \__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
   {
@@ -14109,17 +14377,17 @@
     \__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,8 +16875,8 @@
     \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
@@ -16615,7 +16883,7 @@
       \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,7 +22081,7 @@
       \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 } { }
@@ -21816,7 +22088,7 @@
     }
   \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,7 +22238,7 @@
       \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 } { }
@@ -21973,10 +22245,10 @@
     }
   \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,7 +29676,7 @@
   }
 \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
@@ -29393,23 +29683,23 @@
   {
     \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,8 +30439,9 @@
       { \__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
@@ -30155,7 +30448,7 @@
       {
         \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 }
@@ -30162,30 +30455,30 @@
 \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 }

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex	2020-05-11 20:47:47 UTC (rev 55101)
@@ -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}%

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.ltx
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.ltx	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.ltx	2020-05-11 20:47:47 UTC (rev 55101)
@@ -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}

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty	2020-05-11 20:47:47 UTC (rev 55101)
@@ -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}

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3debug.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3debug.def	2020-05-11 20:47:10 UTC (rev 55100)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3debug.def	2020-05-11 20:47:47 UTC (rev 55101)
@@ -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 } }



More information about the tex-live-commits mailing list.