summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2011-04-28 22:35:52 +0000
committerKarl Berry <karl@freefriends.org>2011-04-28 22:35:52 +0000
commit97073d3a436fba10891a4529c3b2f96a6b11b08f (patch)
treea68eb99942fefb8ca54dd0623056bc5d78dacd03 /Master/texmf-dist/source
parent04501ab6f2e03def86e94a6d0a0aefe99bdbab6e (diff)
expl3 2155 (28apr11)
git-svn-id: svn://tug.org/texlive/trunk@22236 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source')
-rw-r--r--Master/texmf-dist/source/latex/expl3/expl3.dtx63
-rw-r--r--Master/texmf-dist/source/latex/expl3/l3alloc.dtx7
-rw-r--r--Master/texmf-dist/source/latex/expl3/l3basics.dtx233
-rw-r--r--Master/texmf-dist/source/latex/expl3/l3box.dtx7
-rw-r--r--Master/texmf-dist/source/latex/expl3/l3calc.dtx7
-rw-r--r--Master/texmf-dist/source/latex/expl3/l3candidates.dtx101
-rw-r--r--Master/texmf-dist/source/latex/expl3/l3chk.dtx8
-rw-r--r--Master/texmf-dist/source/latex/expl3/l3clist.dtx8
-rw-r--r--Master/texmf-dist/source/latex/expl3/l3doc.dtx163
-rw-r--r--Master/texmf-dist/source/latex/expl3/l3expan.dtx8
-rw-r--r--Master/texmf-dist/source/latex/expl3/l3file.dtx526
-rw-r--r--Master/texmf-dist/source/latex/expl3/l3font.dtx97
-rw-r--r--Master/texmf-dist/source/latex/expl3/l3fp.dtx26
-rw-r--r--Master/texmf-dist/source/latex/expl3/l3int.dtx11
-rw-r--r--Master/texmf-dist/source/latex/expl3/l3keyval.dtx7
-rw-r--r--Master/texmf-dist/source/latex/expl3/l3precom.dtx8
-rw-r--r--Master/texmf-dist/source/latex/expl3/l3prg.dtx7
-rw-r--r--Master/texmf-dist/source/latex/expl3/l3prop.dtx8
-rw-r--r--Master/texmf-dist/source/latex/expl3/l3quark.dtx135
-rw-r--r--Master/texmf-dist/source/latex/expl3/l3seq.dtx1921
-rw-r--r--Master/texmf-dist/source/latex/expl3/l3tl.dtx136
-rw-r--r--Master/texmf-dist/source/latex/expl3/l3token.dtx7
-rw-r--r--Master/texmf-dist/source/latex/expl3/l3toks.dtx8
-rw-r--r--Master/texmf-dist/source/latex/expl3/l3xref.dtx7
24 files changed, 2007 insertions, 1502 deletions
diff --git a/Master/texmf-dist/source/latex/expl3/expl3.dtx b/Master/texmf-dist/source/latex/expl3/expl3.dtx
index 6535553a72a..0ff399f6404 100644
--- a/Master/texmf-dist/source/latex/expl3/expl3.dtx
+++ b/Master/texmf-dist/source/latex/expl3/expl3.dtx
@@ -37,7 +37,7 @@
\RequirePackage{l3names}
%</driver|package>
%\fi
-\GetIdInfo$Id: expl3.dtx 2156 2011-02-17 15:40:23Z will $
+\GetIdInfo$Id: expl3.dtx 2222 2011-04-09 12:47:12Z will $
{L3 Experimental code bundle wrapper}%
%\iffalse
%<*driver>
@@ -298,6 +298,13 @@
% \item[g] variables whose value should only be set globally;
% \item[l] variables whose value should only be set locally.
%\end{arg-description}
+%
+% Separate functions are provided to assign data to local and global
+% variables; for example, "\tl_set:Nn" and "\tl_gset:Nn" respectively
+% set the value of a local or global `token list' variable.
+% Note that it is a poor \TeX\ practise to intermix local and global
+% assignments to a variable; otherwise you risk exhausting the save stack.
+% \unskip\footnote{See the \TeX book, p.\,301, for further information.}
%
% The \m{type} will be in the list of available
% \emph{data-types};\footnote{Of course, if a totally new data type is
@@ -928,7 +935,7 @@
l3file,
l3fp,
l3luatex,
- l3font
+% l3font
}
\RequirePackage{calc}
% \end{macrocode}
@@ -948,8 +955,58 @@
}
}
% \end{macrocode}
-%
+%
+%\begin{macro}{\_tl_check_exists:N}
+% When used as a package, there is an option to be picky and to
+% check definitions exist.
+% These redefinitions are delayed until here so that all the necessary
+% definitions are in place.
+% \begin{macrocode}
+\tex_ifodd:D \@l@expl@check@declarations@bool \scan_stop:
+ \cs_set_protected:Npn \_tl_check_exists:N #1
+ {
+ \cs_if_exist:NF #1
+ {
+ \msg_kernel_error:nnx { check } { non-declared-variable }
+ { \token_to_str:N #1 }
+ }
+ }
+ \cs_set_protected:Npn \tl_set:Nn #1#2
+ {
+ \_tl_check_exists:N #1
+ \cs_set_nopar:Npx #1 { \exp_not:n {#2} }
+ }
+ \cs_set_protected:Npn \tl_set:Nx #1#2
+ {
+ \_tl_check_exists:N #1
+ \cs_set_nopar:Npx #1 {#2}
+ }
+ \cs_set_protected:Npn \tl_gset:Nn #1#2
+ {
+ \_tl_check_exists:N #1
+ \cs_gset_nopar:Npx #1 { \exp_not:n {#2} }
+ }
+ \cs_set_protected:Npn \tl_gset:Nx #1#2
+ {
+ \_tl_check_exists:N #1
+ \cs_gset_nopar:Npx #1 {#2}
+ }
+ \cs_set_protected:Npn \tl_set_eq:NN #1#2
+ {
+ \_tl_check_exists:N #1
+ \_tl_check_exists:N #2
+ \cs_set_eq:NN #1 #2
+ }
+ \cs_set_protected:Npn \tl_gset_eq:NN #1#2
+ {
+ \_tl_check_exists:N #1
+ \_tl_check_exists:N #2
+ \cs_gset_eq:NN #1 #2
+ }
+\tex_fi:D
%</package>
+% \end{macrocode}
+%\end{macro}
%
% \end{implementation}
%
diff --git a/Master/texmf-dist/source/latex/expl3/l3alloc.dtx b/Master/texmf-dist/source/latex/expl3/l3alloc.dtx
index 509a7f9ae15..c095e913a82 100644
--- a/Master/texmf-dist/source/latex/expl3/l3alloc.dtx
+++ b/Master/texmf-dist/source/latex/expl3/l3alloc.dtx
@@ -36,7 +36,7 @@
\RequirePackage{l3names}
%</driver>
%\fi
-\GetIdInfo$Id: l3alloc.dtx 2153 2011-02-16 10:37:45Z will $
+\GetIdInfo$Id: l3alloc.dtx 2223 2011-04-09 12:57:14Z will $
{L3 Experimental register allocation}%
%\iffalse
%<*driver>
@@ -258,11 +258,6 @@
%</initex>
% \end{macrocode}
%
-% \begin{macrocode}
-%<*showmemory>
-\showMemUsage
-%</showmemory>
-% \end{macrocode}
%
% \end{implementation}
% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/expl3/l3basics.dtx b/Master/texmf-dist/source/latex/expl3/l3basics.dtx
index f6c5cebd626..527146b66d7 100644
--- a/Master/texmf-dist/source/latex/expl3/l3basics.dtx
+++ b/Master/texmf-dist/source/latex/expl3/l3basics.dtx
@@ -35,7 +35,7 @@
\RequirePackage{l3names}
%</driver|package>
%\fi
-\GetIdInfo$Id: l3basics.dtx 2158 2011-02-26 12:37:22Z mittelba $
+\GetIdInfo$Id: l3basics.dtx 2246 2011-04-23 08:01:25Z joseph $
{L3 Experimental basic definitions}
%\iffalse
%<*driver>
@@ -1745,30 +1745,22 @@
%
% \begin{macro}{\prg_return_true:}
% \begin{macro}{\prg_return_false:}
-% These break statements put \TeX\ in a \m{true} or \m{false} state.
-% The idea is that the expansion of |\tex_romannumeral:D \c_zero| is
-% \m{null} so we set off a |\tex_romannumeral:D|. It will on its
-% way expand any |\else:| or |\fi:| that are waiting to be discarded
-% anyway before finally arriving at the |\c_zero| we will place
-% right after the conditional. After this expansion has terminated,
-% we issue either |\if_true:| or |\if_false:| to put \TeX\ in the
-% correct state.
-% \begin{macrocode}
-\cs_set:Npn \prg_return_true: { \exp_after:wN\if_true:\tex_romannumeral:D }
-\cs_set:Npn \prg_return_false: {\exp_after:wN\if_false:\tex_romannumeral:D }
-% \end{macrocode}
-% An extended state space could instead utilize |\tex_ifcase:D|:
-% \begin{verbatim}
-% \cs_set:Npn \prg_return_true: {
-% \exp_after:wN\tex_ifcase:D \exp_after:wN \c_zero \tex_romannumeral:D
-% }
-% \cs_set:Npn \prg_return_false: {
-% \exp_after:wN\tex_ifcase:D \exp_after:wN \c_one \tex_romannumeral:D
-% }
-% \cs_set:Npn \prg_return_error: {
-% \exp_after:wN\tex_ifcase:D \exp_after:wN \c_two \tex_romannumeral:D
-% }
-% \end{verbatim}
+% The idea here is that \cs{tex_romanumeral:D} will expand fully any
+% \cs{tex_else:D} and the \cs{tex_fi:D} that are waiting to be discarded,
+% before reaching the \cs{c_zero} which will leave the expansion null.
+% The code can then leave either the first or second argument in the
+% input stream. This means that all of the branching code has to contain
+% at least two tokens: see how the logical tests are actually implemented
+% to see this.
+% \begin{macrocode}
+\cs_set_nopar:Npn \prg_return_true:
+ { \exp_after:wN \use_i:nn \tex_romannumeral:D }
+\cs_set_nopar:Npn \prg_return_false:
+ { \exp_after:wN \use_ii:nn \tex_romannumeral:D }
+% \end{macrocode}
+% An extended state space could be implemented by including a more
+% elaborate function in place of \cs{use_i:nn}/\cs{use_ii:nn}. Provided
+% two arguments are absorbed then the code will work.
% \end{macro}
% \end{macro}
%
@@ -1904,67 +1896,91 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[aux]{\prg_generate_p_form_parm:Nnnnn,
+% \begin{macro}[aux]
+% {
+% \prg_generate_p_form_parm:Nnnnn,
% \prg_generate_TF_form_parm:Nnnnn,
% \prg_generate_T_form_parm:Nnnnn,
% \prg_generate_F_form_parm:Nnnnn
% }
-% How to generate the various forms. The "parm" types here takes the
+% How to generate the various forms. The |parm| types here takes the
% following arguments: 1: how to define (an N-type), 2: name, 3:
-% signature, 4: parameter text (or empty), 5: replacement.
+% signature, 4: parameter text (or empty), 5: replacement. Remember that
+% the logic-returning functions expect two arguments to be present after
+% \cs{c_zero}: notice the construction of the different variants
+% relies on this, and that the |TF| variant will be slightly faster
+% than the |T| version.
% \begin{macrocode}
-\cs_set:Npn \prg_generate_p_form_parm:Nnnnn #1#2#3#4#5{
- \exp_args:Nc #1 {#2_p:#3}#4{#5 \c_zero
- \exp_after:wN\c_true_bool\else:\exp_after:wN\c_false_bool\fi:
+\cs_set_protected:Npn \prg_generate_p_form_parm:Nnnnn #1#2#3#4#5
+ {
+ \exp_args:Nc #1 { #2 _p: #3 } #4
+ {
+ #5 \c_zero
+ \c_true_bool \c_false_bool
+ }
}
-}
-\cs_set:Npn \prg_generate_TF_form_parm:Nnnnn #1#2#3#4#5{
- \exp_args:Nc#1 {#2:#3TF}#4{#5 \c_zero
- \exp_after:wN \use_i:nn \else: \exp_after:wN \use_ii:nn \fi:
+\cs_set_protected:Npn \prg_generate_T_form_parm:Nnnnn #1#2#3#4#5
+ {
+ \exp_args:Nc #1 { #2 : #3 T } #4
+ {
+ #5 \c_zero
+ \use:n \use_none:n
+ }
}
-}
-\cs_set:Npn \prg_generate_T_form_parm:Nnnnn #1#2#3#4#5{
- \exp_args:Nc#1 {#2:#3T}#4{#5 \c_zero
- \else:\exp_after:wN\use_none:nn\fi:\use:n
+\cs_set_protected:Npn \prg_generate_F_form_parm:Nnnnn #1#2#3#4#5
+ {
+ \exp_args:Nc #1 { #2 : #3 F } #4
+ {
+ #5 \c_zero
+ { }
+ }
}
-}
-\cs_set:Npn \prg_generate_F_form_parm:Nnnnn #1#2#3#4#5{
- \exp_args:Nc#1 {#2:#3F}#4{#5 \c_zero
- \exp_after:wN\use_none:nn\fi:\use:n
+\cs_set_protected:Npn \prg_generate_TF_form_parm:Nnnnn #1#2#3#4#5
+ {
+ \exp_args:Nc #1 { #2 : #3 TF } #4
+ { #5 \c_zero }
}
-}
% \end{macrocode}
% \end{macro}
-%
-% \begin{macro}[aux]{\prg_generate_p_form_count:Nnnnn,
+% \begin{macro}[aux]
+% {
+% \prg_generate_p_form_count:Nnnnn,
% \prg_generate_TF_form_count:Nnnnn,
% \prg_generate_T_form_count:Nnnnn,
% \prg_generate_F_form_count:Nnnnn
% }
-% How to generate the various forms. The "count" types here use a
-% number to insert the correct parameter text, otherwise like the
-% "parm" functions above.
+% The |count| form is similar, but of course requires a number rather
+% than a primitive argument specification.
% \begin{macrocode}
-\cs_set:Npn \prg_generate_p_form_count:Nnnnn #1#2#3#4#5{
- \cs_generate_from_arg_count:cNnn {#2_p:#3} #1 {#4}{#5 \c_zero
- \exp_after:wN\c_true_bool\else:\exp_after:wN\c_false_bool\fi:
+\cs_set_protected:Npn \prg_generate_p_form_count:Nnnnn #1#2#3#4#5
+ {
+ \cs_generate_from_arg_count:cNnn { #2 _p: #3 } #1 {#4}
+ {
+ #5 \c_zero
+ \c_true_bool \c_false_bool
+ }
}
-}
-\cs_set:Npn \prg_generate_TF_form_count:Nnnnn #1#2#3#4#5{
- \cs_generate_from_arg_count:cNnn {#2:#3TF} #1 {#4}{#5 \c_zero
- \exp_after:wN\use_i:nn\else:\exp_after:wN\use_ii:nn\fi:
+\cs_set_protected:Npn \prg_generate_T_form_count:Nnnnn #1#2#3#4#5
+ {
+ \cs_generate_from_arg_count:cNnn { #2 : #3 T } #1 {#4}
+ {
+ #5 \c_zero
+ \use:n \use_none:n
+ }
}
-}
-\cs_set:Npn \prg_generate_T_form_count:Nnnnn #1#2#3#4#5{
- \cs_generate_from_arg_count:cNnn {#2:#3T} #1 {#4}{#5 \c_zero
- \else:\exp_after:wN\use_none:nn\fi:\use:n
+\cs_set_protected:Npn \prg_generate_F_form_count:Nnnnn #1#2#3#4#5
+ {
+ \cs_generate_from_arg_count:cNnn { #2 : #3 F } #1 {#4}
+ {
+ #5 \c_zero
+ { }
+ }
}
-}
-\cs_set:Npn \prg_generate_F_form_count:Nnnnn #1#2#3#4#5{
- \cs_generate_from_arg_count:cNnn {#2:#3F} #1 {#4}{#5 \c_zero
- \exp_after:wN\use_none:nn\fi:\use:n
+\cs_set_protected:Npn \prg_generate_TF_form_count:Nnnnn #1#2#3#4#5
+ {
+ \cs_generate_from_arg_count:cNnn { #2 : #3 TF } #1 {#4}
+ { #5 \c_zero }
}
-}
% \end{macrocode}
% \end{macro}
%
@@ -2021,44 +2037,58 @@
%
% \begin{macro}{\cs_to_str:N}
% \begin{macro}[aux]{\cs_to_str_aux:w}
-% This converts a control sequence into the character string of its
-% name, removing the leading escape character. This turns out to be
-% a non-trivial matter as there a different cases:
-% \begin{itemize}
+% This converts a control sequence into the character string of its
+% name, removing the leading escape character. This turns out to be
+% a non-trivial matter as there a different cases:
+% \begin{itemize}
% \item The usual case of a printable escape character;
% \item the case of a non-printable escape characters, e.g., when
% the value of |\tex_escapechar:D| is negative;
% \item when the escape character is a space.
-% \end{itemize}
-% The route chosen is this: If |\token_to_str:N \a| produces a
-% non-space escape char, then this will produce two tokens. If the
-% escape char is non-printable, only one token is produced. If the
-% escape char is a space, then a space token plus one token
-% character token is produced. If we augment the result of this
-% expansion with the letters |ax| we get the following three
-% scenarios (with \meta{X} being a printable non-space escape
-% character):
-% \begin{itemize}
-% \item \meta{X}"aax"
-% \item "aax"
-% \item " aax"
-% \end{itemize}
-% In the second and third case, putting an auxiliary function in front
-% reading undelimited arguments will treat them the same, removing the
-% space token for us automatically. Therefore, if we test the second
-% and third argument of what such a function reads, in case 1 we will
-% get true and in cases 2 and 3 we will get false. If we choose to
-% optimize for the usual case of a printable escape char, we can do it
-% like this (again getting TeX to remove the leading space for us):
-% \begin{macrocode}
-\cs_set_nopar:Npn \cs_to_str:N {
- \if:w \exp_after:wN \cs_str_aux:w\token_to_str:N \a ax\q_stop
- \else:
- \exp_after:wN \exp_after:wN\exp_after:wN \use_ii:nn
- \fi:
- \exp_after:wN \use_none:n \token_to_str:N
-}
-\cs_set:Npn \cs_str_aux:w #1#2#3#4\q_stop{#2#3}
+% \end{itemize}
+% One approach to solve this is to test how many tokens result from
+% |\token_to_str:N \a|. If there are two tokens, then the escape
+% character is printable, while if it is non-printable then only
+% one is present.
+%
+% However, there is an additional complication: the control
+% sequence itself may start with a space. Clearly that should \emph{not} be
+% lost in the process of converting to a string. So the approach adopted is
+% a little more intricate still. When the escape character is printable,
+% \verb*|\token_to_str:N \ | yields the escape character itself and a space.
+% The escape sequence will terminate the expansion started by
+% \cs{tex_romannumeral:D}, which is a negative number and so will not
+% gobble the escape character even if it's a number. The \cs{tex_if:D}
+% test will then be \texttt{false}, and the na\"ive approach of gobbling
+% the first character of the \cs{token_to_str:N} version of the control
+% sequence will work, even if the first character is a space.
+% The second case is that the escape character is itself a space. In this
+% case, the escape character space is consumed terminating the first
+% \cs{tex_romannumeral:D}, and \cs{cs_to_str_aux:w} is expanded. This
+% inserts a space, making the \cs{tex_if:D} test \texttt{true}. The
+% second \cs{tex_romannumeral:D} will then execute the \cs{token_to_str:N},
+% with the escape-character space being consumed by the
+% \cs{tex_romannumeral:D}, and thus leaving the control sequence name in the
+% input stream. The final case is where the escape character is not printable.
+% The flow here starts with the \verb*|\token_to_str:N \ | giving just a
+% space, which terminates the first \cs{tex_romannumeral:D} but leaves no
+% token for the \cs{tex_if:D} test. This means that the \cs{tex_romannumeral:D}
+% is executed before the test is finished. The result is that the
+% \cs{tex_fi:D}, expanded before the \cs{tex_if:D} is finished, becomes
+% \cs{tex_relax:D} \cs{tex_fi:D}, and the \cs{tex_relax:D} is then used in
+% the \cs{tex_if:D} test.
+% In this case, \cs{token_to_str:N} is therefore used with no gobbling at
+% all, which is exactly what is needed in this case.
+% \begin{macrocode}
+\cs_set:Npn \cs_to_str:N
+ {
+ \tex_if:D \tex_romannumeral:D - `0 \token_to_str:N \ %
+ \cs_to_str_aux:w
+ \tex_fi:D
+ \exp_after:wN \use_none:n \token_to_str:N
+ }
+\cs_set_nopar:Npn \cs_to_str_aux:w #1 \use_none:n
+ { ~ \tex_romannumeral:D - `0 \tex_fi:D }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -3151,11 +3181,6 @@
%</initex|package>
% \end{macrocode}
%
-% \begin{macrocode}
-%<*showmemory>
-\showMemUsage
-%</showmemory>
-% \end{macrocode}
%
% \end{implementation}
%
diff --git a/Master/texmf-dist/source/latex/expl3/l3box.dtx b/Master/texmf-dist/source/latex/expl3/l3box.dtx
index fbf531008d2..4ee8af4cf5f 100644
--- a/Master/texmf-dist/source/latex/expl3/l3box.dtx
+++ b/Master/texmf-dist/source/latex/expl3/l3box.dtx
@@ -36,7 +36,7 @@
\RequirePackage{l3names}
%</driver|package>
%\fi
-\GetIdInfo$Id: l3box.dtx 2178 2011-03-06 09:03:44Z mittelba $
+\GetIdInfo$Id: l3box.dtx 2223 2011-04-09 12:57:14Z will $
{L3 Experimental Box module}
%\iffalse
%<*driver>
@@ -1029,11 +1029,6 @@
%</initex|package>
% \end{macrocode}
%
-% \begin{macrocode}
-%<*showmemory>
-\showMemUsage
-%</showmemory>
-% \end{macrocode}
%
% \end{implementation}
% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/expl3/l3calc.dtx b/Master/texmf-dist/source/latex/expl3/l3calc.dtx
index 0e525ab5704..4d477acf7be 100644
--- a/Master/texmf-dist/source/latex/expl3/l3calc.dtx
+++ b/Master/texmf-dist/source/latex/expl3/l3calc.dtx
@@ -35,7 +35,7 @@
\RequirePackage{l3names}
%</driver|package>
%\fi
-\GetIdInfo$Id: l3calc.dtx 1776 2010-02-07 21:51:23Z joseph $
+\GetIdInfo$Id: l3calc.dtx 2223 2011-04-09 12:57:14Z will $
{L3 Experimental calc module}
%\iffalse
%<*driver>
@@ -1158,11 +1158,6 @@
% \end{macro}
% \end{macro}
%
-% \begin{macrocode}
-%<*showmemory>
-\showMemUsage
-%</showmemory>
-% \end{macrocode}
%
% \end{implementation}
% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/expl3/l3candidates.dtx b/Master/texmf-dist/source/latex/expl3/l3candidates.dtx
index 842adff6471..d7217f8eb97 100644
--- a/Master/texmf-dist/source/latex/expl3/l3candidates.dtx
+++ b/Master/texmf-dist/source/latex/expl3/l3candidates.dtx
@@ -37,7 +37,7 @@
%</driver|package>
%\fi
\errorcontextlines=999
-\GetIdInfo$Id: l3candidates.dtx 2179 2011-03-06 09:06:18Z mittelba $
+\GetIdInfo$Id: l3candidates.dtx 2233 2011-04-14 06:32:45Z joseph $
{L3 Experimental 'extras' module}
%\iffalse
%<*driver>
@@ -251,14 +251,16 @@
% \begin{macrocode}
\group_begin:
\char_make_active:N \^^@
-\cs_set:Npn \char_tmp:NN {
- \cs_gnew:Npn #1 ##1 {
- \char_make_active:n {`##1}
- \group_begin:
- \tex_lccode:D `\^^@ `##1
- \tex_lowercase:D{\group_end: #2 ^^@}
+\cs_set:Npn \char_tmp:NN #1#2
+ {
+ \cs_new:Npn #1 ##1
+ {
+ \char_make_active:n { `##1 }
+ \group_begin:
+ \tex_lccode:D `\^^@ `##1
+ \tex_lowercase:D { \group_end: #2 ^^@ }
+ }
}
-}
\char_tmp:NN \char_active_set:Npn \cs_set:Npn
\char_tmp:NN \char_active_set:Npx \cs_set:Npx
\char_tmp:NN \char_active_gset:Npn \cs_gset:Npn
@@ -303,15 +305,6 @@
% \end{macrocode}
%
%
-% \begin{macro}{\seq_get_length:NN}
-% \begin{macrocode}
-\cs_new:Nn \seq_get_length:NN {
- \int_zero:N #1
- \seq_map_inline:Nn #2 { \int_incr:N #1}
-}
-% \end{macrocode}
-% \end{macro}
-%
% \begin{macrocode}
\cs_new:Nn \seq_mapthread_function:NNN {
\seq_get_length:NN \l_tmpa_int #1
@@ -409,9 +402,19 @@
% \end{macrocode}
% \end{macro}
%
-%\begin{macro}{\clist_length:N}
-%\begin{macro}{\clist_length:c}
-%\begin{macro}{\clist_length:n}
+% \begin{macro}{\seq_length:N}
+% \begin{macrocode}
+\cs_new:Nn \seq_length:N {
+ \tex_number:D \etex_numexpr:D
+ 0
+ \seq_map_function:NN #1 \tl_elt_count_aux:n
+ \scan_stop:
+}
+\cs_generate_variant:Nn \seq_length:N { c }
+% \end{macrocode}
+% \end{macro}
+%
+%\begin{macro}{\clist_length:N,\clist_length:c,\clist_length:n}
% Counting the elements in a comma-list is straight-forward, using the
% same approach as for other lists of tokens.
% \begin{macrocode}
@@ -430,12 +433,8 @@
}
% \end{macrocode}
%\end{macro}
-%\end{macro}
-%\end{macro}
%
-%\begin{macro}{\clist_item:Nn}
-%\begin{macro}{\clist_item:cn}
-%\begin{macro}{\clist_item:nn}
+%\begin{macro}{\clist_item:Nn,\clist_item:cn,\clist_item:nn}
%\begin{macro}[aux]{\clist_element_aux:nw}
% Recovering an item from a list is indexed from \( 0 \), with negative
% numbers meaning ``from the end of the list''. So the first test
@@ -471,20 +470,60 @@
% \end{macrocode}
%\end{macro}
%\end{macro}
-%\end{macro}
-%\end{macro}
%
%
+% \begin{macro}{\seq_map_expandable:NN}
+% Expandable form of "\seq_map_function:NN".
% \begin{macrocode}
-%</initex|package>
+\cs_new:Npn \seq_map_expandable:NN #1#2 {
+ \exp_last_unbraced:NNo \seq_map_exp_aux:Nw #2 #1
+ \seq_elt:w \q_recursion_tail \seq_elt_end:
+ \q_recursion_stop
+}
+\cs_new:Npn \seq_map_exp_aux:Nw #1 \seq_elt:w #2 \seq_elt_end: {
+ \quark_if_recursion_tail_stop:n {#2}
+ #1 {#2}
+ \seq_map_exp_aux:Nw #1
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\seq_item:Nn,\seq_item:cn}
+% \begin{macrocode}
+\cs_new:Npn \seq_item:Nn #1#2 {
+ \int_compare:nNnTF {#2} < { 0 }
+ {
+ \exp_args:Nfo
+ \seq_item_aux:nn { \int_eval:n {\seq_length:N #1 + #2} } {#1}
+ }
+ {
+ \exp_args:Nno \seq_item_aux:nn {#2} {#1}
+ }
+}
+\cs_generate_variant:Nn \seq_item:Nn { c }
+\cs_new:Npn \seq_item_aux:nn #1#2 {
+ \seq_item_aux:nw {#1} #2
+ \seq_elt:w \q_recursion_tail \seq_elt_end:
+ \q_recursion_stop
+}
+\cs_new:Npn \seq_item_aux:nw #1 \seq_elt:w #2 \seq_elt_end: {
+ \int_compare:nNnTF {#1} = { 0 }
+ { \use_i_delimit_by_q_recursion_stop:nw {#2} }
+ {
+ \quark_if_recursion_tail_stop:n {#2}
+ \exp_args:Nf \seq_item_aux:nw { \int_eval:n { #1 - 1 } }
+ }
+}
% \end{macrocode}
+% \end{macro}
+%%
%
% \begin{macrocode}
-%<*showmemory>
-\showMemUsage
-%</showmemory>
+%</initex|package>
% \end{macrocode}
%
+%
% \end{implementation}
%
% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/expl3/l3chk.dtx b/Master/texmf-dist/source/latex/expl3/l3chk.dtx
index ad016f91c91..9153433d4a5 100644
--- a/Master/texmf-dist/source/latex/expl3/l3chk.dtx
+++ b/Master/texmf-dist/source/latex/expl3/l3chk.dtx
@@ -36,7 +36,7 @@
\RequirePackage{l3names}
%</driver|package>
%\fi
-\GetIdInfo$Id: l3chk.dtx 1362 2009-05-28 20:19:21Z joseph $
+\GetIdInfo$Id: l3chk.dtx 2223 2011-04-09 12:57:14Z will $
{L3 Experimental check module}
%\iffalse
%<*driver>
@@ -380,12 +380,6 @@
% \end{macro}
%
%
-% Show token usage:
-% \begin{macrocode}
-%<*showmemory>
-\showMemUsage
-%</showmemory>
-% \end{macrocode}
%
% \end{implementation}
% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/expl3/l3clist.dtx b/Master/texmf-dist/source/latex/expl3/l3clist.dtx
index bfec9e082b6..612bddb82cc 100644
--- a/Master/texmf-dist/source/latex/expl3/l3clist.dtx
+++ b/Master/texmf-dist/source/latex/expl3/l3clist.dtx
@@ -36,7 +36,7 @@
\RequirePackage{l3names}
%</driver|package>
%\fi
-\GetIdInfo$Id: l3clist.dtx 2178 2011-03-06 09:03:44Z mittelba $
+\GetIdInfo$Id: l3clist.dtx 2223 2011-04-09 12:57:14Z will $
{L3 Experimental comma separated lists}
%\iffalse
%<*driver>
@@ -1126,12 +1126,6 @@
%</initex|package>
% \end{macrocode}
%
-% Show token usage:
-% \begin{macrocode}
-%<*showmemory>
-%\showMemUsage
-%</showmemory>
-% \end{macrocode}
%
% \end{implementation}
% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/expl3/l3doc.dtx b/Master/texmf-dist/source/latex/expl3/l3doc.dtx
index b374d8c5942..9ea04f3260a 100644
--- a/Master/texmf-dist/source/latex/expl3/l3doc.dtx
+++ b/Master/texmf-dist/source/latex/expl3/l3doc.dtx
@@ -77,7 +77,7 @@ Do not distribute a modified version of this file.
% \end{macrocode}
%
%<*driver|class>
-\GetIdInfo$Id: l3doc.dtx 2180 2011-03-06 10:38:35Z will $
+\GetIdInfo$Id: l3doc.dtx 2228 2011-04-10 08:37:13Z joseph $
{L3 Experimental documentation class}
%</driver|class>
%
@@ -85,6 +85,7 @@ Do not distribute a modified version of this file.
\ProvidesFile{\filename.\filenameext}
[\filedate\space v\fileversion\space\filedescription]
\documentclass{l3doc}
+\usepackage{framed}
\begin{document}
\DocInput{l3doc.dtx}
\end{document}
@@ -269,6 +270,8 @@ Do not distribute a modified version of this file.
% \DescribeEnv{syntax}
% Two heavily-used environments are defined to describe the syntax
% of \textsf{expl3} functions and variables.
+% \begin{framed}
+% \vspace{-\baselineskip}
% \begin{verbatim}
% \begin{function}{ list_of , functions }
% \begin{syntax}
@@ -277,22 +280,49 @@ Do not distribute a modified version of this file.
% <description>
% \end{function}
% \end{verbatim}
-%
+% \vspace{-2\baselineskip}
+% \hrulefill
% \begin{function}{ list_of , functions }
% \begin{syntax}
% "\foo_bar:" \Arg{meta} <test1>
% \end{syntax}
% <description>
% \end{function}
+% \end{framed}
+%
+% Function environments take an optional argument to indicate whether the function(s) it
+% describes are expandable or defined in conditional forms. Use "EXP", "TF", or "pTF"
+% for this; note that "pTF" implies "EXP" since predicates must always be expandable.
+% As an example:
+% \begin{framed}
+% \vspace{-\baselineskip}
+% \begin{verbatim}
+% \begin{function}[pTF]{ \cs_if_exist:N }
+% \begin{syntax}
+% "\cs_if_exist_p:N" <cs>
+% \end{syntax}
+% <description>
+% \end{function}
+% \end{verbatim}
+% \vspace{-2\baselineskip}
+% \hrulefill
+% \begin{function}[pTF]{ \cs_if_exist:N }
+% \begin{syntax}
+% "\cs_if_exist_p:N" <cs>
+% \end{syntax}
+% <description>
+% \end{function}
+% \end{framed}
%
-% Functions may be suffixed by an optional flag or two to indicate whether it is
-% expandable or defined in conditional forms. Use "/" to separate the function name
-% from the flag(s) and then add any of "(EXP)", "(TF)", or "(pTF)" for this.
-% Note that "(pTF)" implies "(EXP)" since predicates must always be expandable.
+% Note that the list of functions used to use "|" as a separator instead,
+% and this syntax is still supported.
%
-% Note that the list of functions used to use "|" as a separator instead, and this syntax is still supported.
+% In the old syntax, individual functions could be suffixed by an optional flag or
+% two to indicate the same information given in the optional argument.
+% This is still supported; use "/" to separate the function name
+% from the flag(s) and then add any of "(EXP)", "(TF)", or "(pTF)".
%
-% \DescribeEnv{function}
+% \DescribeEnv{variable}
% If you are documenting a variable instead of a function, use the "variable" environment instead; it behaves identically to the "function" environment above.
%
% \subsection{Describing functions in the implementation}
@@ -300,7 +330,7 @@ Do not distribute a modified version of this file.
% \DescribeEnv{macro}
% The well-used environment from \LaTeXe\ for marking up the implementation
% of macros/functions remains the \env{macro} environment.
-% One change in \pkg{l3doc}: it now accepts comma-separated lists
+% Some changes in \pkg{l3doc}: it now accepts comma-separated lists
% of functions, to avoid a very large number of consecutive "\end{macro}"
% statements.
% \begin{verbatim}
@@ -316,23 +346,36 @@ Do not distribute a modified version of this file.
% environment. In this case, write "\begin[aux]{macro}" and it will be
% marked as such; its margin call-out will be printed in grey.
%
+% Similarly, an internal package function still requires documentation
+% but usually will not be documented for users to see; these can be marked
+% as such with "\begin[internal]{macro}".
+%
% For documenting \pkg{expl3}-type conditionals, you may also pass this
% environment a "TF" option (and omit it from the function name) to denote that
% the function is provided with "T", "F", and "TF" suffixes.
% A similar "pTF" option will print both "TF" and "_p" predicate forms.
%
-% \DescribeMacro{\testfile}
+%
+% \DescribeMacro{\TestFiles}
+% \cs{TestFiles}\marg{list of files} is used to indicate which test files
+% are used for the current code; they will be printed in the documentation.
+%
+% \DescribeMacro{\UnitTested}
% Within a "macro" environment, it is a good idea to mark whether a unit test has
-% been created for the commands it defines. This is indicated by writing \cs{testfile}\marg{filename}
+% been created for the commands it defines. This is indicated by writing \cs{UnitTested}
% anywhere within "\begin{macro}" \dots "\end{macro}".
-% The first time a test file is referred to its filename will be printed in the documentation;
-% subsequent referals will be noted by \textsf{l3doc} but not printed.
%
% If the class option "checktest" is enabled, then it is an \emph{error} to have a
% "macro" environment without a \cs{testfile} file. This is intended for large packages such
% as \pkg{expl3} that should have absolutely comprehensive tests suites and whose authors
% may not always be as sharp at adding new tests with new code as they should be.
%
+% \DescribeMacro{\TestMissing}
+% If a function is missing a test, this may be flagged by writing (as many times as needed)
+% \cs{TestMissing}\marg{explanation of test required}.
+% These missing tests will be summarised in the listing printed at the end of the
+% compilation run.
+%
% \DescribeEnv{variable}
% When documenting variable definitions, use the "variable" environment instead.
% It will, here, behave identically to the "macro" environment, except that if the class
@@ -500,7 +543,7 @@ Do not distribute a modified version of this file.
% \begin{macrocode}
\LoadClass{article}
\RequirePackage{doc}
-\RequirePackage{array,alphalph,booktabs,color,fixltx2e,enumitem,textcomp,trace,underscore}
+\RequirePackage{array,alphalph,booktabs,color,fixltx2e,enumitem,textcomp,trace,underscore,csquotes}
% \end{macrocode}
%
% \begin{macrocode}
@@ -518,11 +561,23 @@ Do not distribute a modified version of this file.
\let\doc@verbatim\verbatim
\let\enddoc@verbatim\endverbatim
\let\doc@@verbatim\@verbatim
+\expandafter\let\csname doc@verbatim*\expandafter\endcsname
+ \csname verbatim*\endcsname
+\expandafter\let\csname enddoc@verbatim*\expandafter\endcsname
+ \csname endverbatim*\endcsname
+\expandafter\let\csname doc@@verbatim*\expandafter\endcsname
+ \csname @verbatim*\endcsname
\RequirePackage{verbatim}
\AtBeginDocument{%
\let\verbatim\doc@verbatim
\let\endverbatim\enddoc@verbatim
\let\@verbatim\doc@@verbatim
+ \expandafter\let\csname verbatim*\expandafter\endcsname
+ \csname doc@verbatim*\endcsname
+ \expandafter\let\csname endverbatim*\expandafter\endcsname
+ \csname enddoc@verbatim*\endcsname
+ \expandafter\let\csname @verbatim*\expandafter\endcsname
+ \csname doc@@verbatim*\endcsname
}
% \end{macrocode}
%
@@ -715,12 +770,21 @@ Do not distribute a modified version of this file.
% allow |<...>| to be used as markup for |\meta{...}|.
% Ignore spaces and sanitize with catcodes before reading argument.
% \begin{macrocode}
-\group_begin:
\char_make_active:N \<
-\cs_new_nopar:Npn \function {
+\DeclareDocumentCommand \function { O{} } {
+
\phantomsection
+
+ \bool_gset_false:N \l_doc_meta_TF_bool
+ \bool_gset_false:N \l_doc_meta_pTF_bool
+ \bool_gset_false:N \l_doc_meta_EXP_bool
+
+ \cs_set_nopar:Npn \KV_key_no_value_elt:n ##1 { \use:c {doc_meta_opt_##1:} }
+ \KV_parse_space_removal_sanitize:n {#1}
+
\char_make_active:N \<
\cs_set_eq:NN < \doc_open_meta:n
+
\group_begin:
\MakePrivateLetters
\char_make_other:N \|
@@ -731,10 +795,24 @@ Do not distribute a modified version of this file.
\char_make_ignore:N \^^I
\function_aux:n
}
-\group_end:
+\char_make_other:N \<
\cs_set_eq:NN \variabledoc \function
% \end{macrocode}
%
+% \begin{macrocode}
+\cs_set:Nn \doc_meta_opt_TF: {
+ \bool_gset_true:N \l_doc_meta_TF_bool
+}
+\cs_set:Nn \doc_meta_opt_EXP: {
+ \bool_gset_true:N \l_doc_meta_EXP_bool
+}
+\cs_set:Nn \doc_meta_opt_pTF: {
+ \bool_gset_true:N \l_doc_meta_pTF_bool
+ \bool_gset_true:N \l_doc_meta_TF_bool
+ \bool_gset_true:N \l_doc_meta_EXP_bool
+}
+% \end{macrocode}
+%
% \begin{macro}{\function_aux:n}
% \begin{arguments}
% \item Vertical bar--separated list of functions with optional metadata;
@@ -800,26 +878,22 @@ Do not distribute a modified version of this file.
% \begin{macrocode}
\cs_new_nopar:Npn \doc_showmacro_aux:w #1 / #2 \q_stop {
- \tl_if_in:nnTF {#2} { (TF) } {
+ \tl_if_in:nnT {#2} { (TF) } {
\bool_gset_true:N \l_doc_meta_TF_bool
- }{
- \bool_gset_false:N \l_doc_meta_TF_bool
}
- \tl_if_in:nnTF {#2} { (EXP) } {
+
+ \tl_if_in:nnT {#2} { (EXP) } {
\bool_gset_true:N \l_doc_meta_EXP_bool
- }{
- \bool_gset_false:N \l_doc_meta_EXP_bool
}
- \tl_if_in:nnTF {#2} { (pTF) } {
+
+ \tl_if_in:nnT {#2} { (pTF) } {
\bool_gset_true:N \l_doc_meta_TF_bool
\bool_gset_true:N \l_doc_meta_pTF_bool
\bool_gset_true:N \l_doc_meta_EXP_bool
- \tl_set:Nx \l_doc_pTF_name_tl { \doc_predicate_from_base:w #1 \q_nil }
- }{
- \bool_gset_false:N \l_doc_meta_pTF_bool
}
\bool_if:NT \l_doc_meta_pTF_bool {
+ \tl_set:Nx \l_doc_pTF_name_tl { \doc_predicate_from_base:w #1 \q_nil }
\doc_special_main_index:o { \l_doc_pTF_name_tl }
\seq_gput_right:Nx \g_doc_functions_seq { \tl_to_str:N \l_doc_pTF_name_tl }
}
@@ -965,6 +1039,7 @@ Do not distribute a modified version of this file.
{ \int_incr:N \g_doc_nested_macro_int }
\bool_set_false:N \l_doc_macro_aux_bool
+ \bool_set_false:N \l_doc_macro_internal_bool
\bool_set_false:N \l_doc_macro_TF_bool
\bool_set_false:N \l_doc_macro_pTF_bool
\bool_set_false:N \l_doc_macro_var_bool
@@ -995,26 +1070,33 @@ Do not distribute a modified version of this file.
\bool_if:NTF \l_doc_macro_pTF_bool
{
\clist_map_inline:nn {#1}
- {
- \exp_args:Nf \doc_macro_single
- { \doc_predicate_from_base:w ##1 \q_nil }
- }
+ {
+ \tl_if_blank:nF {##1}
+ {
+ \exp_args:Nf \doc_macro_single
+ { \doc_predicate_from_base:w ##1 \q_nil }
+ }
+ }
\bool_set_true:N \l_doc_macro_TF_bool
- \clist_map_inline:nn {#1} { \doc_macro_single {##1} }
+ \clist_map_inline:nn {#1}
+ { \tl_if_blank:nF {##1} { \doc_macro_single {##1} } }
\bool_set_false:N \l_doc_macro_TF_bool
}
{
- \clist_map_inline:nn {#1} { \doc_macro_single {##1} }
+ \clist_map_inline:nn {#1}
+ { \tl_if_blank:nF {##1} { \doc_macro_single {##1} } }
}
}
% \end{macrocode}
%
% \begin{macrocode}
+\bool_new:N \l_doc_macro_internal_bool
\bool_new:N \l_doc_macro_aux_bool
\bool_new:N \l_doc_macro_TF_bool
\bool_new:N \l_doc_macro_pTF_bool
\bool_new:N \l_doc_macro_var_bool
\cs_set_nopar:Npn \doc_macro_opt_aux: { \bool_set_true:N \l_doc_macro_aux_bool }
+\cs_set_nopar:Npn \doc_macro_opt_internal: { \bool_set_true:N \l_doc_macro_internal_bool }
\cs_set_nopar:Npn \doc_macro_opt_TF: { \bool_set_true:N \l_doc_macro_TF_bool }
\cs_set_nopar:Npn \doc_macro_opt_pTF: { \bool_set_true:N \l_doc_macro_pTF_bool }
\cs_set_nopar:Npn \doc_macro_opt_var: { \bool_set_true:N \l_doc_macro_var_bool }
@@ -1278,6 +1360,7 @@ Do not distribute a modified version of this file.
}
\bool_if:nT {
!\l_doc_macro_aux_bool &&
+ !\l_doc_macro_internal_bool &&
\int_compare_p:n {\g_doc_nested_macro_int<1}
}
{
@@ -1922,6 +2005,16 @@ page_precedence "rnaA"
% Test.
% \end{function}
%
+% \begin{function}[EXP]{\fffoo:N}
+% Test.
+% \end{function}
+% \begin{function}[TF]{\ffffoo:N}
+% Test.
+% \end{function}
+% \begin{function}[pTF]{\ffoo:N}
+% Test.
+% \end{function}
+%
% \begin{function}{ \bar / (EXP) | \bar: / (EXP) | \bar:x / (EXP) | }
% \begin{syntax}
% "\example_foo:N" <arg1>
@@ -1945,6 +2038,10 @@ page_precedence "rnaA"
% Testing.
% \end{macro}
%
+% \begin{macro}[internal]{ \foo_if:d }
+% Testing.
+% \end{macro}
+%
% \bigskip\bigskip
%
% \begin{macro}{\aaaa_bbbb_cccc_dddd_eeee_ffff_gggg_hhhh}
diff --git a/Master/texmf-dist/source/latex/expl3/l3expan.dtx b/Master/texmf-dist/source/latex/expl3/l3expan.dtx
index ca4c7d5acb9..9055ca588df 100644
--- a/Master/texmf-dist/source/latex/expl3/l3expan.dtx
+++ b/Master/texmf-dist/source/latex/expl3/l3expan.dtx
@@ -36,7 +36,7 @@
\RequirePackage{l3names}
%</driver|package>
%\fi
-\GetIdInfo$Id: l3expan.dtx 2037 2010-09-20 21:22:45Z joseph $
+\GetIdInfo$Id: l3expan.dtx 2223 2011-04-09 12:57:14Z will $
{L3 Experimental Argument Expansion module}
%\iffalse
%<*driver>
@@ -1257,12 +1257,6 @@
%</initex|package>
% \end{macrocode}
%
-% Show token usage:
-% \begin{macrocode}
-%<*showmemory>
-\showMemUsage
-%</showmemory>
-% \end{macrocode}
%
% \end{implementation}
% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/expl3/l3file.dtx b/Master/texmf-dist/source/latex/expl3/l3file.dtx
index 8d672b074c4..63c21100ba8 100644
--- a/Master/texmf-dist/source/latex/expl3/l3file.dtx
+++ b/Master/texmf-dist/source/latex/expl3/l3file.dtx
@@ -1,5 +1,7 @@
-% \iffalse
-%% File: l3file.dtx Copyright (C) 2009-2010 LaTeX3 project
+% \iffalse meta-comment
+%
+%% File: l3file.dtx Copyright (C) 2009-2011 by
+%% The LaTeX3 Project <latex-team@latex-project.org>
%%
%% It may be distributed and/or modified under the conditions of the
%% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -8,7 +10,7 @@
%%
%% http://www.latex-project.org/lppl.txt
%%
-%% This file is part of the ``expl3 bundle'' (The Work in LPPL)
+%% This file is part of the "expl3 bundle" (The Work in LPPL)
%% and all files in that bundle must be distributed together.
%%
%% The released version of this bundle is available from CTAN.
@@ -28,327 +30,389 @@
%% Snapshots taken from the repository represent work in progress and may
%% not work or may contain conflicting material! We therefore ask
%% people _not_ to put them into distributions, archives, etc. without
-%% prior consultation with the LaTeX Project Team.
+%% prior consultation with the LaTeX3 Project.
%%
%% -----------------------------------------------------------------------
-%%
%
%<*driver|package>
\RequirePackage{l3names}
+\GetIdInfo$Id: l3file.dtx 2242 2011-04-21 08:07:24Z joseph $
+ {The LaTeX3 kernel: file operations}
%</driver|package>
-%\fi
-\GetIdInfo$Id: l3file.dtx 1853 2010-03-21 09:11:08Z joseph $
- {L3 Experimental file loading}
-%\iffalse
%<*driver>
-%\fi
-\ProvidesFile{\filename.\filenameext}
- [\filedate\space v\fileversion\space\filedescription]
-%\iffalse
\documentclass[full]{l3doc}
+\usepackage{csquotes}
\begin{document}
- \DocInput{l3file.dtx}
+ \DocInput{\jobname.dtx}
\end{document}
%</driver>
% \fi
%
-% \title{The \textsf{l3file} package\thanks{This file
-% has version number \fileversion, last
-% revised \filedate.}\\
-% File Loading}
-% \author{\Team}
-% \date{\filedate}
+% \GetFileInfo{\jobname.sty}
+%
+% \title{^^A
+% \fileinfo
+% \thanks{This file describes v\fileversion, last revised \filedate.}^^A
+% }
+%
+% \author{^^A
+% The \LaTeX3 Project\thanks
+% {^^A
+% E-mail:
+% \href{mailto:latex-team@latex-project.org}
+% {latex-team@latex-project.org}^^A
+% }^^A
+% }
+%
+% \date{Released \filedate}
+%
% \maketitle
%
% \begin{documentation}
-%
-% \section{Loading files}
%
% In contrast to the \pkg{l3io} module, which deals with the lowest
% level of file management, the \pkg{l3file} module provides a higher
% level interface for handling file contents. This involves providing
% convenient wrappers around many of the functions in \pkg{l3io}
% to make them more generally accessible.
+%
+% It is important to remember that \TeX{} will attempt to locate files using
+% both the operating system path and entries in the \TeX{} file database (most
+% \TeX{} systems use such a database). Thus the \enquote{current path} for
+% \TeX{} is somewhat broader than that for other programs.
+%
+% \begin{variable}{\g_file_current_name_tl}
+% Contains the name of the current \LaTeX{} file. This variable
+% should not be modified: it is intended for information only. It
+% will be equal to \cs{c_job_name_tl} at the start of a \LaTeX{}
+% run and will be modified each time a file is read using
+% \cs{file_input:n}.
+% \end{variable}
+%
+% \begin{function}[TF]{\file_if_exist:n}
+% \begin{syntax}
+% \cs{file_if_exist:nTF} \Arg{file name} \Arg{true code} \Arg{false code}
+% \end{syntax}
+% Searches for \meta{file name} using the current \TeX{} search
+% path and the additional paths controlled by
+% \cs{file_path_include:n}). The branching versions then leave
+% either \meta{true code} or \meta{false code} in the input stream,
+% as appropriate to the truth of the test and the variant of the
+% function chosen.
+% \begin{texnote}
+% The \meta{file name} may contain both literal items and expandable
+% content, which should on full expansion be the desired file name.
+% The expansion occurs when \TeX{} searches for the file.
+% \end{texnote}
+% \end{function}
+%
+% \begin{function}{\file_add_path:nN}
+% \begin{syntax}
+% \cs{file_add_path:nN} \Arg{file name} \meta{tl var}
+% \end{syntax}
+% Searches for \meta{file name} in the path as detailed for
+% \cs{file_if_exist:nTF}, and if found sets the \meta{tl var} the
+% fully-qualified name of the file, \emph{i.e}.~the path and file name.
+% If the file is not found then the \meta{tl var} will be empty.
+% \begin{texnote}
+% The \meta{file name} may contain both literal items and expandable
+% content, which should on full expansion be the desired file name.
+% The expansion occurs when \TeX{} searches for the file.
+% \end{texnote}
+% \end{function}
+%
+% \begin{function}{\file_input:n}
+% \begin{syntax}
+% \cs{file_input:n} \Arg{file name}
+% \end{syntax}
+% Searches for \meta{file name} in the path as detailed for
+% \cs{file_if_exist:nTF}, and if found reads in the file as
+% additional \LaTeX{} source. All files read are recorded
+% for information and the file name stack is updated by this
+% function.
+% \begin{texnote}
+% The \meta{file name} may contain both literal items and expandable
+% content, which should on full expansion be the desired file name.
+% The expansion occurs when \TeX{} searches for the file.
+% \end{texnote}
+% \end{function}
+%
+% \begin{function}{\file_path_include:n}
+% \begin{syntax}
+% \cs{file_path_include:n} \Arg{path}
+% \end{syntax}
+% Adds \meta{path} to the list of those used to search for files
+% by the \cs{file_input:n} and \cs{file_if_exist:n} function. The
+% assignment is local.
+% \end{function}
+%
+% \begin{function}{\file_path_remove:n}
+% \begin{syntax}
+% \cs{file_path_remove:n} \Arg{path}
+% \end{syntax}
+% Removes \meta{path} from the list of those used to search for files
+% by the \cs{file_input:n} and \cs{file_if_exist:n} function. The
+% assignment is local.
+% \end{function}
+%
+% \begin{function}{\file_list:}
+% \begin{syntax}
+% \cs{file_list:}
+% \end{syntax}
+% This function will list all files loaded using \cs{file_input:n}
+% in the log file.
+% \end{function}
+%
+% \end{documentation}
+%
+% \begin{implementation}
%
-% It is important to remember that \TeX\ will attempt to locate
-% files using both the operating system path and entries in the
-% \TeX\ file database (most \TeX\ systems use such a database). Thus
-% the `current path' for \TeX\ is somewhat broader than that for other
-% programs.
+% \section{Internal file functions}
%
-%\begin{variable}{ \g_file_current_name_tl }
-% Contains the name of the current LaTeX file. This variable
-% should not be modified: it is intended for information only. It
-% will be equal to \cs{c_job_name_tl} at the start of a \LaTeX\
-% run and will be modified each time a file is read using
-% \cs{file_input:n}.
-%\end{variable}
-%
-%\begin{function}{
-% \file_if_exist:n / (TF) |
-% \file_if_exist:V / (TF)
-%}
-% \begin{syntax}
-% \cs{file_if_exist:nTF} \Arg{file name} \Arg{true code} \Arg{false code}
-% \end{syntax}
-% Searches for \meta{file name} using the current \TeX\ search
-% path and the additional paths controlled by
-% \cs{file_path_include:n}). The branching versions then leave
-% either \meta{true code} or \meta{false code} in the input stream,
-% as appropriate to the truth of the test and the variant of the
-% function chosen.
-%\end{function}
-%
-%\begin{function}{
-% \file_input:n |
-% \file_input:V
-%}
-% \begin{syntax}
-% \cs{file_input:n} \Arg{file name}
-% \end{syntax}
-% Searches for \meta{file name} in the path as detailed for
-% \cs{file_if_exist:nTF}, and if found reads in the file as
-% additional \LaTeX\ source. All files read are recorded
-% for information and the file name stack is updated by this
-% function.
-%\end{function}
-%
-%\begin{function}{ \file_path_include:n }
-% \begin{syntax}
-% \cs{file_path_include:n} \Arg{path}
-% \end{syntax}
-% Adds \meta{path} to the list of those used to search for files
-% by the \cs{file_input:n} and \cs{file_if_exist:n} function. The
-% assignment is local.
-%\end{function}
-%
-%\begin{function}{ \file_path_remove:n }
-% \begin{syntax}
-% \cs{file_path_remove:n} \Arg{path}
-% \end{syntax}
-% Removes \meta{path} from the list of those used to search for files
-% by the \cs{file_input:n} and \cs{file_if_exist:n} function. The
-% assignment is local.
-%\end{function}
-%
-%\begin{function}{ \file_list: }
-% \begin{syntax}
-% \cs{file_list:}
-% \end{syntax}
-% This function will list all files loaded using \cs{file_input:n}
-% in the log file.
-%\end{function}
+% \begin{function}{\g_file_stack_seq}
+% Stores the stack of nested files loaded using \cs{file_input:n}. This
+% is needed to restore the appropriate file name to
+% \cs{g_file_current_name_tl} at the end of each file.
+% \end{function}
%
-% \end{documentation}
+% \begin{function}{\g_file_record_seq}
+% Stores the name of every file loaded using \cs{file_input:n}. In
+% contrast to \cs{g_file_stack_seq}, no items are ever removed from this
+% sequence.
+% \end{function}
%
-% \begin{implementation}
+% \begin{function}{\l_file_name_tl}
+% Used to return the full name of a file for internal use.
+% \end{function}
+%
+% \begin{function}{\l_file_search_path_seq}
+% The sequence of file paths to search when loading a file.
+% \end{function}
+%
+% \begin{function}{\l_file_search_path_saved_seq}
+% When loaded on top of \LaTeXe{}, there is a need to save the search
+% path so that \cs{input@path} can be used as appropriate.
+% \end{function}
%
-% \section{\pkg{l3file} implementation}
+% \section{File operation implementation}
+%
+% \TestFiles{m3file001}
+%
+% \begin{macrocode}
+%<*initex|package>
+% \end{macrocode}
%
-% The usual lead-off.
% \begin{macrocode}
%<*package>
\ProvidesExplPackage
{\filename}{\filedate}{\fileversion}{\filedescription}
\package_check_loaded_expl:
%</package>
-%<*initex|package>
% \end{macrocode}
%
-%\begin{macro}{\g_file_current_name_tl}
-%\begin{macro}{\g_file_stack_seq}
+% \begin{macro}{\g_file_current_name_tl}
% The name of the current file should be available at all times.
% \begin{macrocode}
\tl_new:N \g_file_current_name_tl
-\seq_new:N \g_file_stack_seq
% \end{macrocode}
-%
% For the format the file name needs to be picked up at the start of the
-% file. In package mode the current file name is collected from LaTeX2e.
+% file. In package mode the current file name is collected from \LaTeXe{}.
% \begin{macrocode}
-%</initex|package>
%<*initex>
-\toks_put_right:Nn \tex_everyjob:D {
- \tl_gset:Nx \g_file_current_name_tl { \tex_jobname:D }
-}
+\tex_everyjob:D \exp_after:wN
+ {
+ \tex_the:D \tex_everyjob:D
+ \tl_gset:Nx \g_file_current_name_tl { \tex_jobname:D }
+ }
%</initex>
%<*package>
\tl_gset_eq:NN \g_file_current_name_tl \@currname
%</package>
-%<*initex|package>
% \end{macrocode}
-%\end{macro}
-%\end{macro}
+% \end{macro}
+%
+% \begin{macro}[int]{\g_file_stack_seq}
+% The input list of files is stored as a sequence stack.
+% \begin{macrocode}
+\seq_new:N \g_file_stack_seq
+% \end{macrocode}
+% \end{macro}
%
-%\begin{macro}{\g_file_record_seq}
-% The total list of files used is recorded separately from the
-% stack.
+% \begin{macro}[int]{\g_file_record_seq}
+% The total list of files used is recorded separately from the current file
+% stack, as nothing is ever popped from this list.
% \begin{macrocode}
\seq_new:N \g_file_record_seq
% \end{macrocode}
-%
% The current file name should be included in the file list!
% \begin{macrocode}
-%</initex|package>
%<*initex>
-\toks_put_right:Nn \tex_everyjob:D {
- \seq_gput_right:NV \g_file_record_seq \g_file_current_name_tl
-}
+\tex_everyjob:D \exp_after:wN
+ {
+ \tex_the:D \tex_everyjob:D
+ \seq_gput_right:NV \g_file_record_seq \g_file_current_name_tl
+ }
%</initex>
-%<*initex|package>
% \end{macrocode}
-%\end{macro}
+% \end{macro}
+%
+% \begin{macro}[int]{\l_file_name_tl}
+% Used to return the fully-qualified name of a file.
+% \begin{macrocode}
+\tl_new:N \l_file_name_tl
+% \end{macrocode}
+% \end{macro}
%
-%\begin{macro}{\l_file_search_path_seq}
+% \begin{macro}[int]{\l_file_search_path_seq}
% The current search path.
% \begin{macrocode}
\seq_new:N \l_file_search_path_seq
% \end{macrocode}
-%\end{macro}
+% \end{macro}
%
-%\begin{macro}{\l_file_search_path_saved_seq}
+% \begin{macro}[int]{\l_file_search_path_saved_seq}
% The current search path has to be saved for package use.
% \begin{macrocode}
-%</initex|package>
%<*package>
\seq_new:N \l_file_search_path_saved_seq
%</package>
-%<*initex|package>
% \end{macrocode}
-%\end{macro}
-%
-%\begin{macro}{\l_file_name_tl}
-%\begin{macro}{\g_file_test_stream}
-%\begin{macro}[TF]{\file_if_exist:n}
-%\begin{macro}[TF]{\file_if_exist:V}
-%\begin{macro}[aux]{\file_if_exist_aux:n}
-% Checking if a file exists takes place in two parts. First, look on
-% the TeX path, then look on the LaTeX path. The
-% token list \cs{l_file_name_tl} is used as a marker for finding
-% the file, and is also needed by \cs{file_input:n}.
+% \end{macro}
+%
+% \begin{macro}{\file_add_path:nN}
+% \begin{macro}[aux]{\g_file_test_stream}
+% \begin{macro}[aux]{\file_add_path_search:nN}
+% The way to test if a file exists is to try to open it: if it does not
+% exist then \TeX{} will report end-of-file. For files which are in the
+% current directory, this is straight-forward. For other locations, a
+% search has to be made looking at each potential path in turn. The first
+% location is of course treated as the correct one. If nothing is found,
+% |#2| is returned empty.
% \begin{macrocode}
-\tl_new:N \l_file_name_tl
-\prg_new_protected_conditional:Nnn \file_if_exist:n { T , F , TF } {
- \ior_open:Nn \g_file_test_stream {#1}
- \ior_if_eof:NTF \g_file_test_stream
- { \file_if_exist_path_aux:n {#1} }
- {
- \ior_close:N \g_file_test_stream
- \tl_set:Nn \l_file_name_tl {#1}
- \prg_return_true:
- }
-}
-\cs_new_protected_nopar:Npn \file_if_exist_path_aux:n #1 {
- \tl_clear:N \l_file_name_tl
-%</initex|package>
+\cs_new_protected_nopar:Npn \file_add_path:nN #1#2
+ {
+ \ior_open:Nn \g_file_test_stream {#1}
+ \ior_if_eof:NTF \g_file_test_stream
+ { \file_add_path_search:nN {#1} #2 }
+ {
+ \ior_close:N \g_file_test_stream
+ \tl_set:Nx #2 {#1}
+ }
+ }
+\cs_new_protected_nopar:Npn \file_add_path_search:nN #1#2
+ {
+ \tl_clear:N #2
%<*package>
- \cs_if_exist:NT \input@path
- {
- \seq_set_eq:NN \l_file_search_path_saved_seq
- \l_file_search_path_seq
- \clist_map_inline:Nn \input@path
- { \seq_put_right:Nn \l_file_search_path_seq {##1} }
- }
+ \cs_if_exist:NT \input@path
+ {
+ \seq_set_eq:NN \l_file_search_path_saved_seq \l_file_search_path_seq
+ \clist_map_inline:Nn \input@path
+ { \seq_put_right:Nn \l_file_search_path_seq {##1} }
+ }
%</package>
-%<*initex|package>
- \seq_map_inline:Nn \l_file_search_path_seq
- {
- \ior_open:Nn \g_file_test_stream { ##1 #1 }
- \ior_if_eof:NF \g_file_test_stream
- {
- \tl_set:Nn \l_file_name_tl { ##1 #1 }
- \seq_map_break:
- }
- }
-%</initex|package>
+ \seq_map_inline:Nn \l_file_search_path_seq
+ {
+ \ior_open:Nn \g_file_test_stream { ##1 #1 }
+ \ior_if_eof:NF \g_file_test_stream
+ {
+ \tl_set:Nx #2 { ##1 #1 }
+ \seq_map_break:
+ }
+ }
%<*package>
- \cs_if_exist:NT \input@path
- {
- \seq_set_eq:NN \l_file_search_path_seq
- \l_file_search_path_saved_seq
- }
+ \cs_if_exist:NT \input@path
+ { \seq_set_eq:NN \l_file_search_path_seq \l_file_search_path_saved_seq }
%</package>
-%<*initex|package>
- \ior_close:N \g_file_test_stream
- \tl_if_empty:NTF \l_file_name_tl
- { \prg_return_false: }
- { \prg_return_true: }
-}
-\cs_generate_variant:Nn \file_if_exist:nT { V }
-\cs_generate_variant:Nn \file_if_exist:nF { V }
-\cs_generate_variant:Nn \file_if_exist:nTF { V }
+ \ior_close:N \g_file_test_stream
+ }
% \end{macrocode}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%
-%\begin{macro}{\file_input:n}
-%\begin{macro}{\file_input:V}
-% Most of the work is done by the file test above.
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[TF]{\file_if_exist:n}
+% The test for the existence of a file is a wrapper around the function to
+% add a path to a file. If the file was found, the path will contain something,
+% whereas if the file was not located then the return value will be empty.
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \file_input:n #1 {
- \file_if_exist:nT {#1}
- {
-%</initex|package>
+\prg_new_protected_conditional:Nnn \file_if_exist:n { T , F , TF }
+ {
+ \file_add_path:nN {#1} \l_file_name_tl
+ \tl_if_empty:NTF \l_file_name_tl
+ { \prg_return_false: }
+ { \prg_return_true: }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\file_input:n}
+% Loading a file is done in a safe way, checking first that the file
+% exists and loading only if it does.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \file_input:n #1
+ {
+ \file_add_path:nN {#1} \l_file_name_tl
+ \tl_if_empty:NF \l_file_name_tl
+ {
+%<*initex>
+ \seq_gput_right:Nx \g_file_record_seq {#1}
+%</initex>
%<*package>
- \@addtofilelist {#1}
+ \@addtofilelist {#1}
%</package>
-%<*initex|package>
- \seq_gpush:NV \g_file_stack_seq \g_file_current_name_tl
- \tl_gset:Nn \g_file_current_name_tl {#1}
- \tex_expandafter:D \tex_input:D \l_file_name_tl ~
- \seq_gpop:NN \g_file_stack_seq \g_file_current_name_tl
- }
-}
-\cs_generate_variant:Nn \file_input:n { V }
+ \seq_gpush:NV \g_file_stack_seq \g_file_current_name_tl
+ \tl_gset:Nn \g_file_current_name_tl {#1}
+ \tex_expandafter:D \tex_input:D \l_file_name_tl ~
+ \seq_gpop:NN \g_file_stack_seq \g_file_current_name_tl
+ }
+ }
% \end{macrocode}
-%\end{macro}
-%\end{macro}
+% \end{macro}
%
-%\begin{macro}{\file_path_include:n}
-%\begin{macro}{\file_path_remove:n}
+% \begin{macro}{\file_path_include:n}
+% \begin{macro}{\file_path_remove:n}
% Wrapper functions to manage the search path.
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \file_path_include:n #1 {
- \seq_put_right:Nn \l_file_search_path_seq {#1}
- \seq_remove_duplicates:N \l_file_search_path_seq
-}
-\cs_new_protected_nopar:Npn \file_path_remove:n #1 {
- \seq_remove_element:Nn \l_file_search_path_seq {#1}
-}
+\cs_new_protected_nopar:Npn \file_path_include:n #1
+ {
+ \seq_if_in:NnF \l_file_search_path_seq {#1}
+ { \seq_put_right:Nn \l_file_search_path_seq {#1} }
+ }
+\cs_new_protected_nopar:Npn \file_path_remove:n #1
+ { \seq_remove_all:Nn \l_file_search_path_seq {#1} }
% \end{macrocode}
-%\end{macro}
-%\end{macro}
+% \end{macro}
+% \end{macro}
%
-%\begin{macro}{\file_list:}
-%\begin{macro}[aux]{\file_list_aux:n}
+% \begin{macro}{\file_list:}
% A function to list all files used to the log.
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \file_list: {
- \seq_remove_duplicates:N \g_file_record_seq
- \iow_log:n { *~File~List~* }
- \seq_map_function:NN \g_file_record_seq \file_list_aux:n
- \iow_log:n { ************* }
-}
-\cs_new_protected_nopar:Npn \file_list_aux:n #1 { \iow_log:n {#1} }
+\cs_new_protected_nopar:Npn \file_list:
+ {
+ \seq_remove_duplicates:N \g_file_record_seq
+ \iow_log:n { *~File~List~* }
+ \seq_map_inline:Nn \g_file_record_seq { \iow_log:n {##1} }
+ \iow_log:n { ************* }
+ }
% \end{macrocode}
-%\end{macro}
-%\end{macro}
+% \end{macro}
%
% When used as a package, there is a need to hold onto the standard
% file list as well as the new one here.
% \begin{macrocode}
-%</initex|package>
%<*package>
-\AtBeginDocument{
- \clist_map_inline:Nn \@filelist
- { \seq_put_right:Nn \g_file_record_seq {#1} }
-}
+\AtBeginDocument
+ {
+ \clist_map_inline:Nn \@filelist
+ { \seq_put_right:Nn \g_file_record_seq {#1} }
+ }
%</package>
% \end{macrocode}
%
+% \begin{macrocode}
+%</initex|package>
+% \end{macrocode}
+%
% \end{implementation}
-%
-% \PrintIndex
+%
+% \PrintIndex \ No newline at end of file
diff --git a/Master/texmf-dist/source/latex/expl3/l3font.dtx b/Master/texmf-dist/source/latex/expl3/l3font.dtx
index 0098dab3314..2999b41ef4a 100644
--- a/Master/texmf-dist/source/latex/expl3/l3font.dtx
+++ b/Master/texmf-dist/source/latex/expl3/l3font.dtx
@@ -36,7 +36,7 @@
\RequirePackage{l3names}
%</driver|package>
%\fi
-\GetIdInfo$Id: l3font.dtx 2175 2011-03-03 12:16:46Z will $
+\GetIdInfo$Id: l3font.dtx 2223 2011-04-09 12:57:14Z will $
{L3 Experimental Font Loading}
%\iffalse
%<*driver>
@@ -66,21 +66,39 @@
% Functions are provided to load font faces and extract various
% properties from them.
%
-% Some features within are specific \XeTeX\ and \LuaTeX; such functions
+% Some features within are specific to \XeTeX\ and \LuaTeX; such functions
% will be explicitly noted.
%
% This module is currently a work in progress as we incorporate \LaTeXe's
-% font loading into \pkg{expl3}. The successor to the NFSS will provide
+% font loading into \pkg{expl3}. The successor to the NFSS
+% (tentatively denoted "xfss")
+% will provide
% (backwards compatible) user-level functions for font selection.
%
+% \section{Naming and scope}
+%
+% The "l3font" module largely provides commands for selecting and working
+% with typefaces selected at specific sizes.
+% (Many fonts have different shapes intended for use at different physical
+% sizes.)
+% We call a font at some size a "fontface" which is the function prefix
+% used for these commands and also should be the variable suffix for
+% denoting variables of this type.
+%
+% We reserve for future use the module name and variable type "font" for
+% higher-level font selection commands, such as for font families which have
+% linked bold, italic, etc., shapes with automatically-chosen optical sizes.
+% (I.e., what is currently provided in \LaTeXe\ by the NFSS.)
+%
%
% \section{Functions}
%
%
-% \begin{function}{\font_set:Nnn,\font_gset:Nnn,
-% \font_set:cnn,\font_gset:cnn}
+% \begin{function}{\fontface_set:Nnn,\fontface_gset:Nnn,
+% \fontface_set:cnn,\fontface_gset:cnn}
% \begin{syntax}
-% "\font_set:Nnn" <font cs> \Arg{font name} \Arg{font size}
+% "\fontface_set:Nnn" <font cs> \Arg{font name} \Arg{font size}
+% "\fontface_set:Nnn \l_tenrm_fontface {cmr10} {10pt}"
% \end{syntax}
% Defines <cs> as a command to select the font defined by <font name>
% at the <font size>. If the <font size> is empty, the font will be loaded
@@ -88,23 +106,23 @@
% For fonts without a typical design size, this will usually be 10\,pt.
% \end{function}
%
-% \begin{function}{\font_set_eq:NN,\font_gset_eq:NN}
+% \begin{function}{\fontface_set_eq:NN,\fontface_gset_eq:NN}
% \begin{syntax}
-% "\font_set_eq:NN" <font cs1> <font cs2>
+% "\fontface_set_eq:NN" <font cs1> <font cs2>
% \end{syntax}
% Copies <font cs2> into <font cs1>.
% \end{function}
%
-% \begin{function}{\font_set_to_current:N,\font_gset_to_current:N}
+% \begin{function}{\fontface_set_to_current:N,\fontface_gset_to_current:N}
% \begin{syntax}
-% "\font_set_to_current:N" <font cs>
+% "\fontface_set_to_current:N" <font cs>
% \end{syntax}
% Sets <font cs> to the font that is currently selected.
% \end{function}
%
-% \begin{function}{\font_if_null_p:N /(EXP) | \font_if_null:N / (TF)(EXP)}
+% \begin{function}{ \fontface_if_null:N / (pTF) }
% \begin{syntax}
-% "\font_if_null:NTF" <font cs> \Arg{true} \Arg{false}
+% "\fontface_if_null:NTF" <font cs> \Arg{true} \Arg{false}
% \end{syntax}
% Conditional to switch whether the control sequence is the `null font'.
% \end{function}
@@ -117,7 +135,7 @@
% \emph{Not available in pdf\TeX.}
% In LuaTeX or XeTeX, the error when a font is selected but does not exist
% can be toggled with these two commands. The non-existance of a font can
-% then be tested with the "\font_if_null_p:N" conditional.
+% then be tested with the "\fontface_if_null_p:N" conditional.
% \end{function}
%
%
@@ -138,55 +156,59 @@
%<*initex|package>
% \end{macrocode}
%
+% \TestFiles{m3font001.lvt}
%
-% \begin{macro}{\font_set:Nnn,\font_gset:Nnn,\font_set:cnn,\font_gset:cnn}
+% \begin{macro}{\fontface_set:Nnn,\fontface_gset:Nnn,
+% \fontface_set:cnn,\fontface_gset:cnn}
+% \UnitTested
% \begin{arguments}
% \item csname \item fontname \item size (dimension)
% \end{arguments}
% Note that the fontname needs to be escaped appropriately in "xetex"
% or "luatex".
-% \testfile{m3font001.lvt}
% \begin{macrocode}
-\cs_new_protected:Npn \font_set:Nnn #1#2#3 { \tex_font:D #1 = #2 ~at~ #3 \scan_stop: }
+\cs_new_protected:Npn \fontface_set:Nnn #1#2#3 {
+ \tex_font:D #1 = #2 ~at~ #3 \scan_stop:
+}
% \end{macrocode}
%
% \begin{macrocode}
-\cs_new_protected:Npn \font_gset:Nnn #1#2#3 {
+\cs_new_protected:Npn \fontface_gset:Nnn #1#2#3 {
\tex_global:D \tex_font:D #1 = #2 ~at~ #3 \scan_stop:
}
% \end{macrocode}
%
% \begin{macrocode}
-\cs_generate_variant:Nn \font_set:Nnn {c}
-\cs_generate_variant:Nn \font_gset:Nnn {c}
+\cs_generate_variant:Nn \fontface_set:Nnn {c}
+\cs_generate_variant:Nn \fontface_gset:Nnn {c}
% \end{macrocode}
% \end{macro}
%
%
-% \begin{macro}{\font_set_eq:NN}
-% \testfile*
+% \begin{macro}{\fontface_set_eq:NN}
+% \UnitTested
% \begin{macrocode}
-\cs_set_eq:NN \font_set_eq:NN \tex_let:D
-\cs_set_protected:Npn \font_gset_eq:NN { \tex_global:D \tex_let:D }
+\cs_set_eq:NN \fontface_set_eq:NN \tex_let:D
+\cs_set_protected:Npn \fontface_gset_eq:NN { \tex_global:D \tex_let:D }
% \end{macrocode}
% \end{macro}
%
%
-% \begin{macro}{\font_set_to_current:N,\font_gset_to_current:N}
-% \testfile*
+% \begin{macro}{\fontface_set_to_current:N,\fontface_gset_to_current:N}
+% \UnitTested
% \begin{macrocode}
-\cs_set:Npn \font_set_to_current:N #1 {
- \exp_after:wN \font_set_eq:NN \exp_after:wN #1 \tex_the:D \tex_font:D
+\cs_set:Npn \fontface_set_to_current:N #1 {
+ \exp_after:wN \fontface_set_eq:NN \exp_after:wN #1 \tex_the:D \tex_font:D
}
-\cs_set:Npn \font_gset_to_current:N #1 {
- \tex_global:D \exp_after:wN \font_set_eq:NN \exp_after:wN #1 \tex_the:D \tex_font:D
+\cs_set:Npn \fontface_gset_to_current:N #1 {
+ \tex_global:D \exp_after:wN \fontface_set_eq:NN \exp_after:wN #1 \tex_the:D \tex_font:D
}
% \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\font_suppress_not_found_error:,\font_enable_not_found_error:}
-% \testfile* ^^A THIS IS A BIG LIE! NOT TESTED, BUT OH WELL
+% \UnitTested ^^A THIS IS A BIG LIE! NOT TESTED, BUT OH WELL
% \begin{macrocode}
\luatex_if_engine:TF
{
@@ -218,12 +240,10 @@
% \end{macro}
%
%
-% \begin{macro}{\font_if_null_p:N}
-% \testfile*
-% \begin{macro}[TF]{\font_if_null:N}
-% \testfile*
+% \begin{macro}[pTF]{\fontface_if_null:N}
+% \UnitTested
% \begin{macrocode}
-\prg_new_conditional:Nnn \font_if_null:N {p,TF,T,F} {
+\prg_new_conditional:Nnn \fontface_if_null:N {p,TF,T,F} {
\if_meaning:w #1 \tex_nullfont:D
\prg_return_true:
\else:
@@ -232,18 +252,11 @@
}
% \end{macrocode}
% \end{macro}
-% \end{macro}
%
% \begin{macrocode}
%</initex|package>
% \end{macrocode}
%
-% Show token usage:
-% \begin{macrocode}
-%<*showmemory>
-\showMemUsage
-%</showmemory>
-% \end{macrocode}
%
% \end{implementation}
% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/expl3/l3fp.dtx b/Master/texmf-dist/source/latex/expl3/l3fp.dtx
index 6232374336a..8e592fe9a88 100644
--- a/Master/texmf-dist/source/latex/expl3/l3fp.dtx
+++ b/Master/texmf-dist/source/latex/expl3/l3fp.dtx
@@ -35,7 +35,7 @@
\RequirePackage{l3names}
%</driver|package>
%\fi
-\GetIdInfo$Id: l3fp.dtx 2178 2011-03-06 09:03:44Z mittelba $
+\GetIdInfo$Id: l3fp.dtx 2201 2011-03-19 17:16:13Z joseph $
{L3 Experimental floating-point operations}
%\iffalse
%<*driver>
@@ -616,11 +616,13 @@
% \begin{syntax}
% \cs{fp_pow:Nn} \meta{floating point} \Arg{value}
% \end{syntax}
-% Raises the \meta{floating point} to the given \meta{value}, which
-% should be a positive real number or a negative integer.
-% Mathematically invalid operations such as \( 0^{0} \) will give
-% set the \meta{floating point} to to \cs{c_undefined_fp}. The
-% assignment is local.
+% Raises the \meta{floating point} to the given \meta{value}. If the
+% \meta{floating point} is negative, then the \meta{value} should be
+% either a positive real number or a negative integer. If the
+% \meta{floating point} is positive, then the \meta{value} may be any
+% real value. Mathematically invalid operations such as \( 0^{0} \)
+% will give set the \meta{floating point} to to \cs{c_undefined_fp}.
+% The assignment is local.
%\end{function}
%
%\begin{function}{
@@ -630,11 +632,13 @@
% \begin{syntax}
% \cs{fp_gpow:Nn} \meta{floating point} \Arg{value}
% \end{syntax}
-% Raises the \meta{floating point} to the given \meta{value}, which
-% should be a positive real number or a negative integer.
-% Mathematically invalid operations such as \( 0^{0} \) will give
-% set the \meta{floating point} to to \cs{c_undefined_fp}. The
-% assignment is global.
+% Raises the \meta{floating point} to the given \meta{value}. If the
+% \meta{floating point} is negative, then the \meta{value} should be
+% either a positive real number or a negative integer. If the
+% \meta{floating point} is positive, then the \meta{value} may be any
+% real value. Mathematically invalid operations such as \( 0^{0} \)
+% will give set the \meta{floating point} to to \cs{c_undefined_fp}.
+% The assignment is global.
%\end{function}
%
%\subsection{Exponential and logarithm functions}
diff --git a/Master/texmf-dist/source/latex/expl3/l3int.dtx b/Master/texmf-dist/source/latex/expl3/l3int.dtx
index fac6c0245f3..4bb794a4b82 100644
--- a/Master/texmf-dist/source/latex/expl3/l3int.dtx
+++ b/Master/texmf-dist/source/latex/expl3/l3int.dtx
@@ -36,7 +36,7 @@
\RequirePackage{l3names}
%</driver|package>
%\fi
-\GetIdInfo$Id: l3int.dtx 2178 2011-03-06 09:03:44Z mittelba $
+\GetIdInfo$Id: l3int.dtx 2229 2011-04-11 17:37:05Z joseph $
{L3 Experimental Integer module}
%\iffalse
%<*driver>
@@ -2261,7 +2261,8 @@
}
{
\chk_if_free_cs:N #1
- \tex_global:D \tex_mathchardef:D #1 = \int_eval:n {#2}
+ \tex_global:D \tex_mathchardef:D #1 =
+ \etex_numexpr:D #2 \scan_stop:
}
}
{
@@ -2444,12 +2445,6 @@
%</initex|package>
% \end{macrocode}
%
-% Show token usage:
-% \begin{macrocode}
-%<*showmemory>
-\showMemUsage
-%</showmemory>
-% \end{macrocode}
%
% \end{implementation}
% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/expl3/l3keyval.dtx b/Master/texmf-dist/source/latex/expl3/l3keyval.dtx
index 54a89df8955..e9bd88f9852 100644
--- a/Master/texmf-dist/source/latex/expl3/l3keyval.dtx
+++ b/Master/texmf-dist/source/latex/expl3/l3keyval.dtx
@@ -35,7 +35,7 @@
\RequirePackage{l3names}
%</driver|package>
%\fi
-\GetIdInfo$Id: l3keyval.dtx 1890 2010-04-11 03:37:15Z will $
+\GetIdInfo$Id: l3keyval.dtx 2223 2011-04-09 12:57:14Z will $
{L3 Experimental keyval processing}
%\iffalse
%<*driver>
@@ -824,11 +824,6 @@
%</initex|package>
% \end{macrocode}
%
-% \begin{macrocode}
-%<*showmemory>
-\showMemUsage
-%</showmemory>
-% \end{macrocode}
%
% \end{implementation}
% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/expl3/l3precom.dtx b/Master/texmf-dist/source/latex/expl3/l3precom.dtx
index 5ee345dc70c..8d238b8b01f 100644
--- a/Master/texmf-dist/source/latex/expl3/l3precom.dtx
+++ b/Master/texmf-dist/source/latex/expl3/l3precom.dtx
@@ -36,7 +36,7 @@
\RequirePackage{l3names}
%</driver|package>
%\fi
-\GetIdInfo$Id: l3precom.dtx 1793 2010-02-09 20:36:19Z joseph $
+\GetIdInfo$Id: l3precom.dtx 2223 2011-04-09 12:57:14Z will $
{L3 Experimental precompilation module}
%\iffalse
%<*driver>
@@ -428,12 +428,6 @@
% \end{macro}
%
%
-% Show token usage:
-% \begin{macrocode}
-%<*showmemory>
-\showMemUsage
-%</showmemory>
-% \end{macrocode}
%
% \end{implementation}
% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/expl3/l3prg.dtx b/Master/texmf-dist/source/latex/expl3/l3prg.dtx
index ad629cd6450..b9dcafa7f09 100644
--- a/Master/texmf-dist/source/latex/expl3/l3prg.dtx
+++ b/Master/texmf-dist/source/latex/expl3/l3prg.dtx
@@ -36,7 +36,7 @@
\RequirePackage{l3names}
%</driver|package>
%\fi
-\GetIdInfo$Id: l3prg.dtx 2178 2011-03-06 09:03:44Z mittelba $
+\GetIdInfo$Id: l3prg.dtx 2223 2011-04-09 12:57:14Z will $
{L3 Experimental control structures}
%\iffalse
%<*driver>
@@ -1958,11 +1958,6 @@
%</initex|package>
% \end{macrocode}
%
-% \begin{macrocode}
-%<*showmemory>
-\showMemUsage
-%</showmemory>
-% \end{macrocode}
%
% \end{implementation}
% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/expl3/l3prop.dtx b/Master/texmf-dist/source/latex/expl3/l3prop.dtx
index 13e938e8477..bd287f2e569 100644
--- a/Master/texmf-dist/source/latex/expl3/l3prop.dtx
+++ b/Master/texmf-dist/source/latex/expl3/l3prop.dtx
@@ -36,7 +36,7 @@
\RequirePackage{l3names}
%</driver|package>
%\fi
-\GetIdInfo$Id: l3prop.dtx 2087 2010-11-23 18:21:44Z joseph $
+\GetIdInfo$Id: l3prop.dtx 2223 2011-04-09 12:57:14Z will $
{L3 Experimental Property Lists}
%\iffalse
%<*driver>
@@ -858,12 +858,6 @@
%</initex|package>
% \end{macrocode}
%
-% Show token usage:
-% \begin{macrocode}
-%<*showmemory>
-%\showMemUsage
-%</showmemory>
-% \end{macrocode}
%
% \end{implementation}
% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/expl3/l3quark.dtx b/Master/texmf-dist/source/latex/expl3/l3quark.dtx
index eb1c092e172..26372d5209e 100644
--- a/Master/texmf-dist/source/latex/expl3/l3quark.dtx
+++ b/Master/texmf-dist/source/latex/expl3/l3quark.dtx
@@ -36,7 +36,7 @@
\RequirePackage{l3names}
%</driver|package>
%\fi
-\GetIdInfo$Id: l3quark.dtx 2172 2011-03-03 10:56:49Z will $
+\GetIdInfo$Id: l3quark.dtx 2234 2011-04-14 19:58:43Z joseph $
{L3 Experimental Quark Commands}
%\iffalse
%<*driver>
@@ -288,65 +288,92 @@
\quark_new:N\q_recursion_stop
% \end{macrocode}
% \end{variable}
-%
-% \begin{macro}{\quark_if_recursion_tail_stop:n,
-% \quark_if_recursion_tail_stop:N,
-% \quark_if_recursion_tail_stop:o}
+%
+% \begin{macro}{\quark_if_recursion_tail_stop:N}
% \UnitTested
-% When doing recursions it is easy to spend a lot of time testing if
-% we found the end marker. To avoid this, we use a recursion end
-% marker every time we do this kind of task. Also, if the recursion
-% end marker is found, we wrap things up and finish.
-% \begin{macrocode}
-\cs_new:Npn \quark_if_recursion_tail_stop:n #1 {
- \exp_after:wN\if_meaning:w
- \quark_if_recursion_tail_aux:w #1?\q_stop\q_recursion_tail\q_recursion_tail
- \exp_after:wN \use_none_delimit_by_q_recursion_stop:w
- \fi:
-}
-\cs_new:Npn \quark_if_recursion_tail_stop:N #1 {
- \if_meaning:w#1\q_recursion_tail
- \exp_after:wN \use_none_delimit_by_q_recursion_stop:w
- \fi:
-}
-\cs_generate_variant:Nn \quark_if_recursion_tail_stop:n {o}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\quark_if_recursion_tail_stop_do:nn,
-% \quark_if_recursion_tail_stop_do:Nn,
-% \quark_if_recursion_tail_stop_do:on}
+% \begin{macro}{\quark_if_recursion_tail_stop_do:Nn}
% \UnitTested
-% These functions are variants of the above that
-% inserts tokens into the input stream after a
-% recursion process is finalised.
+% 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
+% each time a recursion is set up. Thus if the marker is found everything
+% can be wrapper up and finished off. The simple case is when the test
+% can guarantee that only a single token is being tested. In this case,
+% there is just a dedicated copy of the standard quark test. Both a gobbling
+% version and one inserting end code are provided.
% \begin{macrocode}
-\cs_new:Npn \quark_if_recursion_tail_stop_do:nn #1#2 {
- \exp_after:wN\if_meaning:w
- \quark_if_recursion_tail_aux:w #1?\q_stop\q_recursion_tail\q_recursion_tail
- \exp_after:wN \use_i_delimit_by_q_recursion_stop:nw
- \else:
- \exp_after:wN\use_none:n
- \fi:
- {#2}
-}
-\cs_new:Npn \quark_if_recursion_tail_stop_do:Nn #1#2 {
- \if_meaning:w #1\q_recursion_tail
- \exp_after:wN \use_i_delimit_by_q_recursion_stop:nw
- \else:
- \exp_after:wN\use_none:n
- \fi:
- {#2}
-}
-\cs_generate_variant:Nn \quark_if_recursion_tail_stop_do:nn {on}
+\cs_new:Npn \quark_if_recursion_tail_stop:N #1
+ {
+ \tex_ifx:D #1 \q_recursion_tail
+ \exp_after:wN \use_none_delimit_by_q_recursion_stop:w
+ \tex_fi:D
+ }
+\cs_new:Npn \quark_if_recursion_tail_stop_do:Nn #1#2
+ {
+ \tex_ifx:D #1 \q_recursion_tail
+ \exp_after:wN \use_i_delimit_by_q_recursion_stop:nw
+ \tex_else:D
+ \exp_after:wN \use_none:n
+ \tex_fi:D
+ {#2}
+ }
% \end{macrocode}
% \end{macro}
-%
+% \end{macro}
+%
+% \begin{macro}
+% {\quark_if_recursion_tail_stop:n,\quark_if_recursion_tail_stop:o}
+% \UnitTested
+% \begin{macro}
+% {\quark_if_recursion_tail_stop_do:nn,\quark_if_recursion_tail_stop_do:on}
+% \UnitTested
% \begin{macro}[aux]{\quark_if_recursion_tail_aux:w}
+% The same idea applies when testing multiple tokens, but here a little more
+% care is needed. It is possible that |#1| might be something like
+% |{{{a}}}| or |{ab\iffalse}\fi|, which will therefore need to be tested
+% in a detokenized manner. The way that this is done is using
+% \cs{tex_ifcat:D}, with the idea being that this test will be \texttt{true}
+% provided the auxiliary function returns nothing at all. If the auxiliary
+% returns anything, it will be detokenized and so the test will be both
+% \texttt{false} and safe.
% \begin{macrocode}
-\cs_new:Npn \quark_if_recursion_tail_aux:w #1#2 \q_stop \q_recursion_tail {#1}
+\cs_new:Npn \quark_if_recursion_tail_stop:n #1
+ {
+ \tex_ifcat:D
+ A
+ \etex_detokenize:D \exp_after:wN
+ {
+ \quark_if_recursion_tail_aux:w #1 \q_recursion_stop
+ \q_recursion_tail \q_recursion_stop \q_stop
+ }
+ A
+ \exp_after:wN \use_none_delimit_by_q_recursion_stop:w
+ \tex_fi:D
+ }
+\cs_new:Npn \quark_if_recursion_tail_stop_do:nn #1#2
+ {
+ \tex_ifcat:D
+ A
+ \etex_detokenize:D \exp_after:wN
+ {
+ \quark_if_recursion_tail_aux:w #1 \q_recursion_stop
+ \q_recursion_tail \q_recursion_stop \q_stop
+ }
+ A
+ \exp_after:wN \use_i_delimit_by_q_recursion_stop:nw
+ \tex_else:D
+ \exp_after:wN \use_none:n
+ \tex_fi:D
+ {#2}
+ }
+\cs_new:Npn \quark_if_recursion_tail_aux:w
+ #1 \q_recursion_tail #2 \q_recursion_stop #3 \q_stop
+ { #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 }
% \end{macrocode}
% \end{macro}
+% \end{macro}
+% \end{macro}
%
% \begin{macro}[pTF]{\quark_if_no_value:N,\quark_if_no_value:n}
% \UnitTested
@@ -407,12 +434,6 @@
%
%
%
-% Show token usage:
-% \begin{macrocode}
-%<*showmemory>
-\showMemUsage
-%</showmemory>
-% \end{macrocode}
%
% \end{implementation}
% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/expl3/l3seq.dtx b/Master/texmf-dist/source/latex/expl3/l3seq.dtx
index f9d6f82e283..6e5c536616d 100644
--- a/Master/texmf-dist/source/latex/expl3/l3seq.dtx
+++ b/Master/texmf-dist/source/latex/expl3/l3seq.dtx
@@ -1,5 +1,7 @@
-% \iffalse
-%% File: l3seq.dtx Copyright (C) 1990-2010 LaTeX3 project
+% \iffalse meta-comment
+%
+%% File: l3seq.dtx Copyright (C) 1990-2011 by
+%% The LaTeX3 Project <latex-team@latex-project.org>
%%
%% It may be distributed and/or modified under the conditions of the
%% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -8,7 +10,7 @@
%%
%% http://www.latex-project.org/lppl.txt
%%
-%% This file is part of the ``expl3 bundle'' (The Work in LPPL)
+%% This file is part of the "expl3 bundle" (The Work in LPPL)
%% and all files in that bundle must be distributed together.
%%
%% The released version of this bundle is available from CTAN.
@@ -28,413 +30,607 @@
%% Snapshots taken from the repository represent work in progress and may
%% not work or may contain conflicting material! We therefore ask
%% people _not_ to put them into distributions, archives, etc. without
-%% prior consultation with the LaTeX Project Team.
+%% prior consultation with the LaTeX3 Project.
%%
%% -----------------------------------------------------------------------
%
%<*driver|package>
\RequirePackage{l3names}
+\GetIdInfo$Id: l3seq.dtx 2245 2011-04-21 19:45:31Z joseph $
+ {The LaTeX3 kernel: sequences and stacks}
%</driver|package>
-%\fi
-\GetIdInfo$Id: l3seq.dtx 1879 2010-03-29 17:48:38Z mittelba $
- {L3 Experimental sequences and stacks}
-%\iffalse
%<*driver>
-%\fi
-\ProvidesFile{\filename.\filenameext}
- [\filedate\space v\fileversion\space\filedescription]
-%\iffalse
\documentclass[full]{l3doc}
+\usepackage{csquotes}
\begin{document}
-\DocInput{\filename.\filenameext}
+ \DocInput{\jobname.dtx}
\end{document}
%</driver>
% \fi
%
+% \GetFileInfo{\jobname.sty}
+%
+% \title{^^A
+% \fileinfo
+% \thanks{This file describes v\fileversion, last revised \filedate.}^^A
+% }
+%
+% \author{^^A
+% The \LaTeX3 Project\thanks
+% {^^A
+% E-mail:
+% \href{mailto:latex-team@latex-project.org}
+% {latex-team@latex-project.org}^^A
+% }^^A
+% }
+%
+% \date{Released \filedate}
%
-% \title{The \textsf{l3seq} package\thanks{This file
-% has version number \fileversion, last
-% revised \filedate.}\\
-% Sequences}
-% \author{\Team}
-% \date{\filedate}
% \maketitle
%
% \begin{documentation}
%
-% \LaTeX3 implements a data type called `sequences'. These are special
-% token lists that can be accessed via special function on the `left'.
-% Appending tokens is possible at both ends. Appended token lists can be
-% accessed only as a union. The token lists that form the individual
-% items of a sequence might contain any tokens except two internal
-% functions that are used to structure sequences (see section internal
-% functions below). It is also possible to map functions on such
-% sequences so that they are executed for every item on the sequence.
-%
-% All functions that return items from a sequence in some \m{tl var.}~assume
-% that the \m{tl var.}~is local. See remarks below if you need a global
-% returned value.
-%
-% The defined functions are not orthogonal in the sense that every
-% possible variation possible is actually available. If you need a new
-% variant use the expansion functions described in the package
-% \texttt{l3expan} to build it.
-%
-% Adding items to the left of a sequence can currently be done with
-% either something like "\seq_put_left:Nn" or with a ``stack'' function
-% like "\seq_push:Nn" which has the same effect. Maybe one should
-% therefore remove the ``left'' functions totally.
-%
-% \section{Functions for creating/initialising sequences}
-%
-% \begin{function}{ \seq_new:N |
-% \seq_new:c }
-% \begin{syntax}
-% "\seq_new:N" <sequence>
-% \end{syntax}
-% Defines <sequence> to be a variable of type "seq".
-% \end{function}
-%
-% \begin{function}{ \seq_clear:N |
-% \seq_clear:c |
-% \seq_gclear:N |
-% \seq_gclear:c }
-% \begin{syntax}
-% "\seq_clear:N" <sequence>
-% \end{syntax}
-% These functions locally or globally clear <sequence>.
-% \end{function}
-%
-% \begin{function}{ \seq_clear_new:N |
-% \seq_clear_new:c |
-% \seq_gclear_new:N |
-% \seq_gclear_new:c }
-% \begin{syntax}
-% "\seq_clear_new:N" <sequence>
-% \end{syntax}
-% These functions locally or globally clear <sequence> if it exists or
-% otherwise allocates it.
-% \end{function}
-%
-% \begin{function}{ \seq_set_eq:NN |
-% \seq_set_eq:cN |
-% \seq_set_eq:Nc |
-% \seq_set_eq:cc }
-% \begin{syntax}
-% "\seq_set_eq:NN" <seq1> <seq2>
-% \end{syntax}
-% Function that locally makes <seq1> identical to <seq2>.
-% \end{function}
-%
-% \begin{function}{ \seq_gset_eq:NN |
-% \seq_gset_eq:cN |
-% \seq_gset_eq:Nc |
-% \seq_gset_eq:cc }
-% \begin{syntax}
-% "\seq_gset_eq:NN" <seq1> <seq2>
-% \end{syntax}
-% Function that globally makes <seq1> identical to <seq2>.
-% \end{function}
-%
-% \begin{function}{%
-% \seq_concat:NNN |
-% \seq_concat:ccc |
-% \seq_gconcat:NNN |
-% \seq_gconcat:ccc |
-% }
-% \begin{syntax}
-% "\seq_concat:NNN" <seq1> <seq2> <seq3>
-% "\seq_gconcat:NNN" <seq1> <seq2> <seq3>
-% \end{syntax}
-% Function that conatenates <seq2> and <seq3> and locally or globally assigns the
-% result to <seq1>.
-% \end{function}
-%
-% \section{Adding data to sequences}
-%
-% \begin{function}{%
-% \seq_put_left:Nn |
-% \seq_put_left:NV |
-% \seq_put_left:No |
-% \seq_put_left:Nx |
-% \seq_put_left:cn |
-% \seq_put_left:cV |
-% \seq_put_left:co |
+% \LaTeX3 implements a \enquote{sequence} data type, which contain
+% an ordered list of entries which may contain any \meta{balanced text}.
+% It is possible to map functions to sequences such that the function
+% is applied to every item in the sequence.
+%
+% Sequences are also used to implement stack functions in \LaTeX3. This
+% is achieved using a number of dedicated stack functions.
+%
+% \section{Creating and initialising sequences}
+%
+% \begin{function}{\seq_new:N, \seq_new:c}
+% \begin{syntax}
+% \cs{seq_new:N} \meta{sequence}
+% \end{syntax}
+% Creates a new \meta{sequence} or raises an error if the name is
+% already taken. The declaration is global. The \meta{sequence} will
+% initially contain no items.
+% \end{function}
+%
+% \begin{function}{\seq_clear:N, \seq_clear:c}
+% \begin{syntax}
+% \cs{seq_clear:N} \meta{sequence}
+% \end{syntax}
+% Clears all items from the \meta{sequence} within the scope of
+% the current \TeX{} group.
+% \end{function}
+%
+% \begin{function}{\seq_gclear:N, \seq_gclear:c}
+% \begin{syntax}
+% \cs{seq_gclear:N} \meta{sequence}
+% \end{syntax}
+% Clears all entries from the \meta{sequence} globally.
+% \end{function}
+%
+% \begin{function}{\seq_clear_new:N, \seq_clear_new:c}
+% \begin{syntax}
+% \cs{seq_clear_new:N} \meta{sequence}
+% \end{syntax}
+% If the \meta{sequence} already exists, clears it within the scope
+% of the current \TeX{} group. If the \meta{sequence} is not defined,
+% it will be created (using \cs{seq_new:N}). Thus the sequence is
+% guaranteed to be available and clear within the current \TeX{}
+% group. The \meta{sequence} will exist globally, but the content
+% outside of the current \TeX{} group is not specified.
+% \end{function}
+%
+% \begin{function}{\seq_gclear_new:N, \seq_gclear_new:c}
+% \begin{syntax}
+% \cs{seq_gclear_new:N} \meta{sequence}
+% \end{syntax}
+% If the \meta{sequence} already exists, clears it globally. If the
+% \meta{sequence} is not defined, it will be created (using
+% \cs{seq_new:N}). Thus the sequence is guaranteed to be available
+% and globally clear.
+% \end{function}
+%
+% \begin{function}
+% {\seq_set_eq:NN, \seq_set_eq:cN, \seq_set_eq:Nc, \seq_set_eq:cc}
+% \begin{syntax}
+% \cs{seq_set_eq:NN} \meta{sequence1} \meta{sequence2}
+% \end{syntax}
+% Sets the content of \meta{sequence1} equal to that of
+% \meta{sequence2}. This assignment is restricted to the current
+% \TeX{} group level.
+% \end{function}
+%
+% \begin{function}
+% {\seq_gset_eq:NN, \seq_gset_eq:cN, \seq_gset_eq:Nc, \seq_gset_eq:cc}
+% \begin{syntax}
+% \cs{seq_gset_eq:NN} \meta{sequence1} \meta{sequence2}
+% \end{syntax}
+% Sets the content of \meta{sequence1} equal to that of
+% \meta{sequence2}. This assignment is global and so is not
+% limited by the current \TeX{} group level.
+% \end{function}
+%
+% \begin{function}{\seq_concat:NNN, \seq_concat:ccc}
+% \begin{syntax}
+% \cs{seq_concat:NNN} \meta{sequence1} \meta{sequence2} \meta{sequence3}
+% \end{syntax}
+% Concatenates the content of \meta{sequence2} and \meta{sequence3}
+% together and saves the result in \meta{sequence1}. The items in
+% \meta{sequence2} will be placed at the left side of the new sequence.
+% This operation is local to the current \TeX{} group and will
+% remove any existing content in \meta{sequence1}.
+% \end{function}
+%
+% \begin{function}{\seq_gconcat:NNN, \seq_gconcat:ccc}
+% \begin{syntax}
+% \cs{seq_gconcat:NNN} \meta{sequence1} \meta{sequence2} \meta{sequence3}
+% \end{syntax}
+% Concatenates the content of \meta{sequence2} and \meta{sequence3}
+% together and saves the result in \meta{sequence1}. The items in
+% \meta{sequence2} will be placed at the left side of the new sequence.
+% This operation is global and will remove any existing content in
+% \meta{sequence1}.
+% \end{function}
+%
+% \section{Appending data to sequences}
+%
+% \begin{function}{
+% \seq_put_left:Nn, \seq_put_left:NV, \seq_put_left:Nv,
+% \seq_put_left:No, \seq_put_left:Nx,
+% \seq_put_left:cn, \seq_put_left:cV, \seq_put_left:cv,
+% \seq_put_left:co, \seq_put_left:cx
% }
-% \begin{syntax}
-% "\seq_put_left:Nn" <sequence> <token list>
-% \end{syntax}
-% Locally appends <token list> as a single item to the left
-% of <sequence>. <token list> might get expanded before
-% appending according to the variant.
-% \end{function}
-%
-% \begin{function}{%
-% \seq_put_right:Nn |
-% \seq_put_right:NV |
-% \seq_put_right:No |
-% \seq_put_right:Nx |
-% \seq_put_right:cn |
-% \seq_put_right:cV |
-% \seq_put_right:co |
+% \begin{syntax}
+% \cs{seq_put_left:Nn} \meta{sequence} \Arg{item}
+% \end{syntax}
+% Appends the \meta{item} to the left of the \meta{sequence}.
+% The assignment is restricted to the current \TeX{} group.
+% \end{function}
+%
+% \begin{function}{
+% \seq_gput_left:Nn, \seq_gput_left:NV, \seq_gput_left:Nv,
+% \seq_gput_left:No, \seq_gput_left:Nx,
+% \seq_gput_left:cn, \seq_gput_left:cV, \seq_gput_left:cv,
+% \seq_gput_left:co, \seq_gput_left:cx
% }
-% \begin{syntax}
-% "\seq_put_right:Nn" <sequence> <token list>
-% \end{syntax}
-% Locally appends <token list> as a single item to the right
-% of <sequence>. <token list> might get expanded before
-% appending according to the variant.
-% \end{function}
-%
-% \begin{function}{%
-% \seq_gput_left:Nn |
-% \seq_gput_left:NV |
-% \seq_gput_left:No |
-% \seq_gput_left:Nx |
-% \seq_gput_left:cn |
-% \seq_gput_left:cV |
-% \seq_gput_left:co |
+% \begin{syntax}
+% \cs{seq_gput_left:Nn} \meta{sequence} \Arg{item}
+% \end{syntax}
+% Appends the \meta{item} to the left of the \meta{sequence}.
+% The assignment is global.
+% \end{function}
+%
+% \begin{function}{
+% \seq_put_right:Nn, \seq_put_right:NV, \seq_put_right:Nv,
+% \seq_put_right:No, \seq_put_right:Nx,
+% \seq_put_right:cn, \seq_put_right:cV, \seq_put_right:cv,
+% \seq_put_right:co, \seq_put_right:cx
% }
-% \begin{syntax}
-% "\seq_gput_left:Nn" <sequence> <token list>
-% \end{syntax}
-% Globally appends <token list> as a single item to the left
-% of <sequence>.
-% \end{function}
-%
-% \begin{function}{%
-% \seq_gput_right:Nn |
-% \seq_gput_right:NV |
-% \seq_gput_right:No |
-% \seq_gput_right:Nx |
-% \seq_gput_right:cn |
-% \seq_gput_right:cV |
-% \seq_gput_right:co |
+% \begin{syntax}
+% \cs{seq_put_right:Nn} \meta{sequence} \Arg{item}
+% \end{syntax}
+% Appends the \meta{item} to the right of the \meta{sequence}.
+% The assignment is restricted to the current \TeX{} group.
+% \end{function}
+%
+% \begin{function}{
+% \seq_gput_right:Nn, \seq_gput_right:NV, \seq_gput_right:Nv,
+% \seq_gput_right:No, \seq_gput_right:Nx,
+% \seq_gput_right:cn, \seq_gput_right:cV, \seq_gput_right:cv,
+% \seq_gput_right:co, \seq_gput_right:cx
% }
-% \begin{syntax}
-% "\seq_gput_right:Nn" <sequence> <token list>
-% \end{syntax}
-% Globally appends <token list> as a single item to the right
-% of <sequence>.
+% \begin{syntax}
+% \cs{seq_gput_right:Nn} \meta{sequence} \Arg{item}
+% \end{syntax}
+% Appends the \meta{item} to the right of the \meta{sequence}.
+% The assignment is global.
% \end{function}
%
+% \section{Recovering items from sequences}
+%
+% Items can be recovered from either the left or the right of sequences.
+% For implementation reasons, the actions at the left of the sequence are
+% faster than those acting on the right. These functions all assign the
+% recovered material locally, \emph{i.e.}~setting the
+% \meta{token list variable} used with \cs{tl_set:Nn} and \emph{never}
+% \cs{tl_gset:Nn}.
+%
+% \begin{function}{\seq_get_left:NN, \seq_get_left:cN}
+% \begin{syntax}
+% \cs{seq_get_left:NN} \meta{sequence} \meta{token list variable}
+% \end{syntax}
+% Stores the left-most item from a \meta{sequence} in the
+% \meta{token list variable} without removing it from the
+% \meta{sequence}. The \meta{token list variable} is assigned locally.
+% If \meta{sequence} is empty an error will be raised.
+% \end{function}
%
-% \section{Working with sequences}
+% \begin{function}{\seq_get_right:NN, \seq_get_right:cN}
+% \begin{syntax}
+% \cs{seq_get_right:NN} \meta{sequence} \meta{token list variable}
+% \end{syntax}
+% Stores the right-most item from a \meta{sequence} in the
+% \meta{token list variable} without removing it from the
+% \meta{sequence}. The \meta{token list variable} is assigned locally.
+% If \meta{sequence} is empty an error will be raised.
+% \end{function}
%
-% \begin{function}{%
-% \seq_get:NN |
-% \seq_get:cN |
-% }
-% \begin{syntax}
-% "\seq_get:NN" <sequence> <tl var.>
-% \end{syntax}
-% Functions that locally assign the left-most item of <sequence> to the
-% token list variable <tl var.>. Item is not removed from <sequence>! If you
-% need a global return value you need to code something like this:
-% \begin{quote}
-% "\seq_get:NN" <sequence> "\l_tmpa_tl" \\
-% "\tl_gset_eq:NN" <global tl var.> "\l_tmpa_tl"
-% \end{quote}
-% But if this kind of construction is used often enough a separate
-% function should be provided.
-% \end{function}
-%
-%
-% \begin{function}{\seq_map_variable:NNn |
-% \seq_map_variable:cNn
-% }
-% \begin{syntax}
-% "\seq_map_variable:NNn" <sequence> <tl var.> \Arg{code using tl var.}
-% \end{syntax}
-% Every element in <sequence> is assigned to <tl var.> and then <code
-% using tl var.> is executed. The operation is not expandable which means
-% that it can't be used within write operations etc. However, this
-% function can be nested which the others can't.
-% \end{function}
-%
-% \begin{function}{ \seq_map_function:NN |
-% \seq_map_function:cN }
-% \begin{syntax}
-% "\seq_map_function:NN" <sequence> <function>
-% \end{syntax}
-% This function applies <function> (which must be a function with one
-% argument) to every item of <sequence>. <function> is not executed
-% within a sub-group so that side effects can be achieved locally. The
-% operation is not expandable which means that it can't be used within
-% write operations etc.
-%
-% In the current implementation the next functions are more efficient and
-% should be preferred.
-% \end{function}
-%
-% \begin{function}{\seq_map_inline:Nn |
-% \seq_map_inline:cn
-% }
-% \begin{syntax}
-% "\seq_map_inline:Nn" <sequence> \Arg{inline function}
-% \end{syntax}
-% Applies <inline function> (which should be the direct coding for a
-% function with one argument (i.e.\ use "#1" as the place holder for
-% this argument)) to every item of <sequence>. <inline function> is not
-% executed within a sub-group so that side effects can be achieved locally.
-% The operation is not expandable which means that it can't be used
-% within write operations etc.
-% \end{function}
-%
-% \begin{function}{ \seq_map_break: | \seq_map_break:n }
-% These functions are used to break out of a mapping function at the point
-% of execution. (Please do not put `|\q_stop|' inside a <seq> that uses
-% these functions.)
-% \end{function}
-%
-% \begin{function}{ \seq_show:N |
-% \seq_show:c }
-% \begin{syntax}
-% "\seq_show:N" <sequence>
-% \end{syntax}
-% Function that pauses the compilation and displays <seq> in the terminal
-% output and in the log file. (Usually used for diagnostic purposes.)
-% \end{function}
-%
-% \begin{function}{ \seq_display:N |
-% \seq_display:c }
-% \begin{syntax}
-% "\seq_display:N" <sequence>
-% \end{syntax}
-% As with "\seq_show:N" but pretty prints the output one line per element.
-% \end{function}
-%
-% \begin{function}{ \seq_remove_duplicates:N |
-% \seq_gremove_duplicates:N }
-% \begin{syntax}
-% "\seq_gremove_duplicates:N" <seq>
-% \end{syntax}
-% Function that removes any duplicate entries in <seq>.
-% \end{function}
-%
-% \section{Predicates and conditionals}
-%
-% \begin{function}{ \seq_if_empty_p:N / (EXP) |
-% \seq_if_empty_p:c / (EXP) }
-% \begin{syntax}
-% "\seq_if_empty_p:N" <sequence>
-% \end{syntax}
-% This predicate returns `true' if <sequence> is `empty' i.e., doesn't
-% contain any items. Note that this is `false' even if the <sequence> only
-% contains a single empty item.
-% \end{function}
-%
-% \begin{function}{ \seq_if_empty:N / (TF) |
-% \seq_if_empty:c / (TF) }
-% \begin{syntax}
-% "\seq_if_empty:NTF" <sequence> \Arg{true code} \Arg{false code}
-% \end{syntax}
-% Set of conditionals that test whether or not a particular <sequence>
-% is empty and if so executes either <true code> or <false code>.
-% \end{function}
-%
-% \begin{function}{ \seq_if_in:Nn / (TF) |
-% \seq_if_in:NV / (TF) |
-% \seq_if_in:cn / (TF) |
-% \seq_if_in:cV / (TF) |
-% \seq_if_in:co / (TF) |
-% \seq_if_in:cx / (TF) }
-% \begin{syntax}
-% "\seq_if_in:NnTF" <sequence> \Arg{item} \Arg{true code} \Arg{false code}
-% \end{syntax}
-% Functions that test if <item> is in <sequence>. Depending on the result
-% either <true code> or <false code> is executed.
-% \end{function}
-%
-% \section{Internal functions}
-%
-% \begin{function}{\seq_if_empty_err:N}
-% \begin{syntax}
-% "\seq_if_empty_err:N" <sequence>
-% \end{syntax}
-% Signals an \LaTeX3 error if <sequence> is empty.
-% \end{function}
-%
-% \begin{function}{\seq_pop_aux:nnNN}
-% \begin{syntax}
-% "\seq_pop_aux:nnNN" <assign1> <assign2> <sequence> <tl var.>
-% \end{syntax}
-% Function that assigns the left-most item of <sequence> to <tl var.> using
-% <assign1> and assigns the tail to <sequence> using <assign2>. This
-% function could be used to implement a global return function.
-% \end{function}
-%
-% \begin{function}{%
-% \seq_get_aux:w |
-% \seq_pop_aux:w |
-% \seq_put_aux:Nnn |
-% \seq_put_aux:w |
+% \begin{function}{\seq_pop_left:NN, \seq_pop_left:cN}
+% \begin{syntax}
+% \cs{seq_pop_left:NN} \meta{sequence} \meta{token list variable}
+% \end{syntax}
+% Pops the left-most item from a \meta{sequence} into the
+% \meta{token list variable}, \emph{i.e}.~removes the item from the
+% sequence and stores it in the \meta{token list variable}.
+% Both of the variables are assigned locally. If \meta{sequence} is
+% empty an error will be raised.
+% \end{function}
+%
+% \begin{function}{\seq_gpop_left:NN, \seq_gpop_left:cN}
+% \begin{syntax}
+% \cs{seq_gpop_left:NN} \meta{sequence} \meta{token list variable}
+% \end{syntax}
+% Pops the left-most item from a \meta{sequence} into the
+% \meta{token list variable}, \emph{i.e}.~removes the item from the
+% sequence and stores it in the \meta{token list variable}.
+% The \meta{sequence} is modified globally, while the assignment of
+% the \meta{token list variable} is local.
+% If \meta{sequence} is empty an error will be raised.
+% \end{function}
+%
+% \begin{function}{\seq_pop_right:NN, \seq_pop_right:cN}
+% \begin{syntax}
+% \cs{seq_pop_right:NN} \meta{sequence} \meta{token list variable}
+% \end{syntax}
+% Pops the right-most item from a \meta{sequence} into the
+% \meta{token list variable}, \emph{i.e}.~removes the item from the
+% sequence and storesitin in the \meta{token list variable}.
+% Both of the variables are assigned locally. If \meta{sequence} is
+% empty an error will be raised.
+% \end{function}
+%
+% \begin{function}{\seq_gpop_right:NN, \seq_gpop_right:cN}
+% \begin{syntax}
+% \cs{seq_gpop_right:NN} \meta{sequence} \meta{token list variable}
+% \end{syntax}
+% Pops the right-most item from a \meta{sequence} into the
+% \meta{token list variable}, \emph{i.e}.~removes the item from the
+% sequence and stores it in the \meta{token list variable}.
+% The \meta{sequence} is modified globally, while the assignment of
+% the \meta{token list variable} is local.
+% If \meta{sequence} is empty an error will be raised.
+% \end{function}
+%
+% \section{Modifying sequences}
+%
+% While sequences are normally used as ordered lists, it may be
+% necessary to modify the content. The functions here may be used
+% to update sequences, while retaining the order of the unaffected
+% entries.
+%
+% \begin{function}{\seq_remove_duplicates:N, \seq_remove_duplicates:c}
+% \begin{syntax}
+% \cs{seq_remove_duplicates:N} \meta{sequence}
+% \end{syntax}
+% Removes duplicate items from the \meta{sequence}, leaving
+% left most copy of each item in the \meta{sequence}. The \meta{item}
+% comparison takes place on a token basis, as for \cs{tl_if_eq:nn(TF)}.
+% The removal is local to the current \TeX{} group.
+% \begin{texnote}
+% This function iterates through every item in the \meta{sequence} and
+% does a comparison with the \meta{items} already checked. It is therefore
+% relatively slow with large sequences.
+% \end{texnote}
+% \end{function}
+%
+% \begin{function}{\seq_gremove_duplicates:N, \seq_gremove_duplicates:c}
+% \begin{syntax}
+% \cs{seq_gremove_duplicates:N} \meta{sequence}
+% \end{syntax}
+% Removes duplicate items from the \meta{sequence}, leaving
+% left most copy of each item in the \meta{sequence}. The \meta{item}
+% comparison takes place on a token basis, as for \cs{tl_if_eq:nn(TF)}.
+% The removal is applied globally.
+% \begin{texnote}
+% This function iterates through every item in the \meta{sequence} and
+% does a comparison with the \meta{items} already checked. It is therefore
+% relatively slow with large sequences.
+% \end{texnote}
+% \end{function}
+%
+% \begin{function}{\seq_remove_all:Nn, \seq_remove_all:cn}
+% \begin{syntax}
+% \cs{seq_remove_all:Nn} \meta{sequence} \Arg{item}
+% \end{syntax}
+% Removes every occurrence of \meta{item} from the \meta{sequence}.
+% The \meta{item} comparison takes place on a token basis, as for
+% \cs{tl_if_eq:nn(TF)}. The removal is local to the current \TeX{} group.
+% \end{function}
+%
+% \begin{function}{\seq_gremove_all:Nn, \seq_gremove_all:cn}
+% \begin{syntax}
+% \cs{seq_gremove_all:Nn} \meta{sequence} \Arg{item}
+% \end{syntax}
+% Removes each occurrence of \meta{item} from the \meta{sequence}.
+% The \meta{item} comparison takes place on a token basis, as for
+% \cs{tl_if_eq:nn(TF)}. The removal is applied globally.
+% \end{function}
+%
+% \subsection{Sequence conditionals}
+%
+% \begin{function}[EXP,pTF]{\seq_if_empty:N, \seq_if_empty:c}
+% \begin{syntax}
+% \cs{seq_if_empty_p:N} \meta{sequence}
+% \cs{seq_if_empty:NTF} \meta{sequence} \Arg{true code} \Arg{false code}
+% \end{syntax}
+% Tests if the \meta{sequence} is empty (containing no items). The
+% branching versions then leave either \meta{true code} or
+% \meta{false code} in the input stream, as appropriate to the truth of
+% the test and the variant of the function chosen. The logical truth of
+% the test is left in the input stream by the predicate version.
+% \end{function}
+%
+% \begin{function}[TF]{
+% \seq_if_in:Nn, \seq_if_in:NV, \seq_if_in:Nv, \seq_if_in:No, \seq_if_in:Nx,
+% \seq_if_in:cn, \seq_if_in:cV, \seq_if_in:cv, \seq_if_in:co, \seq_if_in:cx
% }
-% Functions used to implement put and get operations. They are not for
-% meant for direct use.
-% \end{function}
-%
-% \begin{function}{ \seq_elt:w |
-% \seq_elt_end: }
-% Functions (usually used as constants) that separates items within a
-% sequence. They might get special meaning during mapping operations and
-% are not supposed to show up as tokens within an item appended to a
-% sequence.
-% \end{function}
-%
-% \section{Functions for `Sequence Stacks'}
-%
-% Special sequences in \LaTeX3 are `stacks' with their usual operations
-% of `push', `pop', and `top'. They are internally implemented as
-% sequences and share some of the functions (like "\seq_new:N" etc.)
-%
-% \begin{function}{%
-% \seq_push:Nn |
-% \seq_push:NV |
-% \seq_push:No |
-% \seq_push:cn |
-% \seq_gpush:Nn |
-% \seq_gpush:NV |
-% \seq_gpush:No |
-% \seq_gpush:Nv |
-% \seq_gpush:cn |
+% \begin{syntax}
+% \cs{seq_if_in:NnTF} \meta{sequence} \Arg{item}
+% ~~\Arg{true code} \Arg{false code}
+% \end{syntax}
+% Tests if the \meta{item} is present in the \meta{sequence}.
+% Either the \meta{true code} or \meta{false code} is left in the input
+% stream, as appropriate to the truth of the test and the variant of the
+% function
+% chosen.
+% \end{function}
+%
+% \section{Mapping to sequences}
+%
+% \begin{function}[EXP]{\seq_map_function:NN, \seq_map_function:cN}
+% \begin{syntax}
+% \cs{seq_map_function:NN} \meta{sequence} \meta{function}
+% \end{syntax}
+% Applies \meta{function} to every \meta{item} stored in the
+% \meta{sequence}. The \meta{function} will receive one argument for
+% each iteration. The \meta{items} are returned from left to right.
+% The function \cs{seq_map_inline:Nn} is in general more efficient
+% than \cs{seq_map_function:NN}.
+% One mapping may be nested inside another.
+% \end{function}
+%
+% \begin{function}{\seq_map_inline:Nn, \seq_map_inline:cn}
+% \begin{syntax}
+% \cs{seq_map_inline:Nn} \meta{sequence} \Arg{inline function}
+% \end{syntax}
+% Applies \meta{inline function} to every \meta{item} stored
+% within the \meta{sequence}. The \meta{inline function} should
+% consist of code which will receive the \meta{item} as |#1|.
+% One in line mapping can be nested inside another. The \meta{items}
+% are returned from left to right.
+% \end{function}
+%
+% \begin{function}{
+% \seq_map_variable:NNn, \seq_map_variable:Ncn,
+% \seq_map_variable:cNn, \seq_map_variable:ccn
% }
-% \begin{syntax}
-% "\seq_push:Nn" <stack> \Arg{token list}
-% \end{syntax}
-% Locally or globally pushes <token list> as a single item onto the
-% <stack>.
-% \end{function}
-%
-% \begin{function}{%
-% \seq_pop:NN |
-% \seq_pop:cN |
-% \seq_gpop:NN |
-% \seq_gpop:cN |
+% \begin{syntax}
+% \cs{seq_map_variable:Nn} \meta{sequence}
+% ~~\meta{tl~var.} \Arg{function using tl~var.}
+% \end{syntax}
+% Stores each entry in the \meta{sequence} in turn in the
+% \meta{tl~var.}\ and applies the \meta{function using tl~var.}
+% The \meta{function} will usually consist of code making use of
+% the \meta{tl~var.}, but this is not enforced. One variable
+% mapping can be nested inside another. The \meta{items}
+% are returned from left to right. One variable mapping may be
+% nested inside another.
+% \end{function}
+%
+% \begin{function}[EXP]{\seq_map_break:}
+% \begin{syntax}
+% \cs{seq_map_break:}
+% \end{syntax}
+% Used to terminate a \cs{seq_map_\ldots} function before all
+% entries in the \meta{sequence} have been processed. This will
+% normally take place within a conditional statement, for example
+% \begin{verbatim}
+% \seq_map_inline:Nn \l_my_seq
+% {
+% \str_if_eq:nnTF { #1 } { bingo }
+% { \seq_map_break: }
+% {
+% % Do something useful
+% }
+% }
+% \end{verbatim}
+% Use outside of a \cs{seq_map_\ldots} scenario will lead low
+% level \TeX{} errors.
+% \begin{texnote}
+% When the mapping is broken, additional tokens may be inserted by the
+% internal macro \cs{seq_break_point:n} before further items are taken
+% from the input stream. This will depend on the design of the mapping
+% function.
+% \end{texnote}
+% \end{function}
+%
+% \begin{function}[EXP]{\seq_map_break:n}
+% \begin{syntax}
+% \cs{seq_map_break:n} \Arg{tokens}
+% \end{syntax}
+% Used to terminate a \cs{seq_map_\ldots} function before all
+% entries in the \meta{sequence} have been processed, inserting
+% the \meta{tokens} after the mapping has ended. This will
+% normally take place within a conditional statement, for example
+% \begin{verbatim}
+% \seq_map_inline:Nn \l_my_seq
+% {
+% \str_if_eq:nnTF { #1 } { bingo }
+% { \seq_map_break:n { <tokens> } }
+% {
+% % Do something useful
+% }
+% }
+% \end{verbatim}
+% Use outside of a \cs{seq_map_\ldots} scenario will lead low
+% level \TeX{} errors.
+% \begin{texnote}
+% When the mapping is broken, additional tokens may be inserted by the
+% internal macro \cs{seq_break_point:n} before the \meta{tokens} are
+% inserted into the input stream.
+% This will depend on the design of the mapping function.
+% \end{texnote}
+% \end{function}
+%
+% \subsection{Sequences as stacks}
+%
+% Sequences can be used as stacks, where data is pushed to and popped
+% from the top of the sequence. (The left of a sequence is the top, for
+% performance reasons.) The stack functions for sequences are not
+% intended to be mixed with the general ordered data functions detailed
+% in the previous section: a sequence should either be used as an
+% ordered data type or as a stack, but not in both ways.
+%
+% \begin{function}{\seq_get:NN, \seq_get:cN}
+% \begin{syntax}
+% \cs{seq_get:NN} \meta{sequence} \meta{token list variable}
+% \end{syntax}
+% Reads the top item from a \meta{sequence} into the
+% \meta{token list variable} without removing it from the
+% \meta{sequence}. The \meta{token list variable} is assigned locally.
+% If \meta{sequence} is empty an error will be raised.
+% \end{function}
+%
+% \begin{function}{\seq_pop:NN, \seq_pop:cN}
+% \begin{syntax}
+% \cs{seq_pop:NN} \meta{sequence} \meta{token list variable}
+% \end{syntax}
+% Pops the top item from a \meta{sequence} into the
+% \meta{token list variable}. Both of the variables are assigned
+% locally. If \meta{sequence} is empty an error will be raised.
+% \end{function}
+%
+% \begin{function}{\seq_gpop:NN, \seq_gpop:cN}
+% \begin{syntax}
+% \cs{seq_gpop:NN} \meta{sequence} \meta{token list variable}
+% \end{syntax}
+% Pops the top item from a \meta{sequence} into the
+% \meta{token list variable}. The \meta{sequence} is modified globally,
+% while the \meta{token list variable} is assigned locally. If
+% \meta{sequence} is empty the marker an error will be raised.
+% \end{function}
+%
+% \begin{function}{
+% \seq_push:Nn, \seq_push:NV, \seq_push:Nv, \seq_push:No, \seq_push:Nx,
+% \seq_push:cn, \seq_push:cV, \seq_push:cv, \seq_push:co, \seq_push:cx
% }
-% \begin{syntax}
-% "\seq_pop:NN" <stack> <tl var.>
-% \end{syntax}
-% Functions that assign the top item of <stack> to <tl var.>
-% and removes it from <stack>!
+% \begin{syntax}
+% \cs{seq_push:Nn} \meta{sequence} \Arg{item}
+% \end{syntax}
+% Adds the \Arg{item} to the top of the \meta{sequence}.
+% The assignment is restricted to the current \TeX{} group.
% \end{function}
%
-% \begin{function}{%
-% \seq_top:NN |
-% \seq_top:cN |
+% \begin{function}{
+% \seq_gpush:Nn, \seq_gpush:NV, \seq_gpush:Nv, \seq_gpush:No, \seq_gpush:Nx,
+% \seq_gpush:cn, \seq_gpush:cV, \seq_gpush:cv, \seq_gpush:co, \seq_gpush:cx
% }
-% \begin{syntax}
-% "\seq_top:NN" <stack> <tl var.>
-% \end{syntax}
-% Functions that locally assign the top item of <stack> to the <tl var.>.
-% Item is \emph{not} removed from <stack>!
+% \begin{syntax}
+% \cs{seq_gpush:Nn} \meta{sequence} \Arg{item}
+% \end{syntax}
+% Pushes the \meta{item} onto the end of the top of the
+% \meta{sequence}. The assignment is global.
+% \end{function}
+%
+% \section{Viewing sequences}
+%
+% \begin{function}{\seq_show:N, \seq_show:c}
+% \begin{syntax}
+% \cs{seq_show:N} \meta{sequence}
+% \end{syntax}
+% Displays the entries in the \meta{sequence} in the terminal.
% \end{function}
%
% \end{documentation}
%
% \begin{implementation}
%
-% \section{\pkg{l3seq} implementation}
+% \section{Internal sequence functions}
+%
+% \begin{function}{\seq_if_empty_err_break:N}
+% \begin{syntax}
+% \cs{seq_if_empty_err_break:N} \meta{sequence}
+% \end{syntax}
+% Tests if the \meta{sequence} is empty, and if so issues an error
+% message before skipping over any tokens up to \cs{seq_break_point:n}.
+% This function is used to avoid more serious errors which would
+% otherwise occur if some internal functions were applied to an
+% empty \meta{sequence}.
+% \end{function}
+%
+% \begin{function}[EXP]{\seq_item:n}
+% \begin{syntax}
+% \cs{seq_item:n} \meta{item}
+% \end{syntax}
+% The internal token used to begin each sequence entry. If expanded
+% outside of a mapping or manipulation function, an error will be
+% raised. The definition should always be set globally.
+% \end{function}
+%
+% \begin{function}{\seq_push_item_def:n, \seq_push_item_def:x}
+% \begin{syntax}
+% \cs{seq_push_item_def:n} \Arg{code}
+% \end{syntax}
+% Saves the definition of \cs{seq_item:n} and redefines it to
+% accept one parameter and expand to \meta{code}. This function
+% should always be balanced by use of \cs{seq_pop_item_def:}.
+% \end{function}
+%
+% \begin{function}{\seq_pop_item_def:}
+% \begin{syntax}
+% \cs{seq_pop_item_def:}
+% \end{syntax}
+% Restores the definition of \cs{seq_item:n} most recently saved by
+% \cs{seq_push_item_def:n}. This function should always be used in
+% a balanced pair with \cs{seq_push_item_def:n}.
+% \end{function}
+%
+% \begin{function}[EXP]{\seq_break:}
+% \begin{syntax}
+% \cs{seq_break:}
+% \end{syntax}
+% Used to terminate sequence functions by gobbling all tokens
+% up to \cs{seq_break_point:n}. This function is a copy of
+% \cs{seq_map_break:}, but is used in situations which are
+% not mappings.
+% \end{function}
+%
+% \begin{function}[EXP]{\seq_break:n}
+% \begin{syntax}
+% \cs{seq_break:n} \Arg{tokens}
+% \end{syntax}
+% Used to terminate sequence functions by gobbling all tokens
+% up to \cs{seq_break_point:n}, then inserting the \meta{tokens}
+% before continuing reading the input stream. This function is a copy
+% of \cs{seq_map_break:n}, but is used in situations which are
+% not mappings.
+% \end{function}
+%
+% \begin{function}[EXP]{\seq_break_point:n}
+% \begin{syntax}
+% \cs{seq_break_point:n} \meta{tokens}
+% \end{syntax}
+% Used to mark the end of a recursion or mapping: the functions
+% \cs{seq_map_break:} and \cs{seq_map_break:n} use this to break out
+% of the loop. After the loop ends the \meta{tokens} are inserted into
+% the input stream. This occurs even if the the break functions are
+% \emph{not} applied: \cs{seq_break_point:n} is functionally-equivalent
+% in these cases to \cs{use:n}.
+% \end{function}
+%
+% \section{Sequence implementation}
+%
+% \TestFiles{m3seq002,m3seq003}
+%
+% \begin{macrocode}
+%<*initex|package>
+% \end{macrocode}
%
% \begin{macrocode}
%<*package>
@@ -444,40 +640,53 @@
%</package>
% \end{macrocode}
%
-% A sequence is a control sequence whose top-level expansion is of the
-% form `|\seq_elt:w| \m{text$\sb1$} |\seq_elt_end:| \ldots{}
-% |\seq_elt:w| \meta{text$\sb{n}$} \ldots'. We use explicit delimiters
-% instead of braces around \m{text} to allow efficient searching for
-% an item in the sequence.
-%
-% \begin{macro}{\seq_elt:w}
-% \begin{macro}{\seq_elt_end:}
-% We allocate the delimiters and make them errors if executed.
+% A sequence is a control sequence whose top-level expansion is of
+% the form \enquote{\cs{seq_item:n} \marg{item$_1$}
+% \ldots \cs{seq_item:n} \marg{item$_n$}}. An earlier implementation
+% used the structure \enquote{\cs{seq_elt:w} \meta{item$_1$}
+% \cs{seq_elt_end:} \ldots \cs{seq_elt:w} \meta{item$_n$}
+% \cs{seq_elt_end:}}. This allows rapid searching using a delimited
+% function, but is not suitable for items containing |{|, |}| and |#|
+% tokens, and which also leads to the loss of surrounding braces
+% around items.
+%
+% \begin{macro}[int]{\seq_item:n}
+% The delimiter is always defined, but when used incorrectly simply
+% removes its argument and hits an undefined control sequence to
+% raise an error.
% \begin{macrocode}
-%<*initex|package>
-\cs_new:Npn \seq_elt:w {\ERROR}
-\cs_new:Npn \seq_elt_end: {\ERROR}
+\cs_new:Npn \seq_item:n
+ {
+ \seq_use_error:
+ \use_none:n
+ }
% \end{macrocode}
% \end{macro}
+%
+% \begin{macro}[aux]{\l_seq_tmpa_tl, \l_seq_tmpb_tl}
+% Scratch space for various internal uses.
+% \begin{macrocode}
+\tl_new:N \l_seq_tmpa_tl
+\tl_new:N \l_seq_tmpb_tl
+% \end{macrocode}
% \end{macro}
%
-% \subsection{Allocating and initialisation}
+% \subsection{Allocation and initialisation}
%
-% \begin{macro}{\seq_new:N}
-% \begin{macro}{\seq_new:c}
-% Sequences are implemented using token lists.
+% \begin{macro}{\seq_new:N,\seq_new:c}
+% \UnitTested
+% Internally, sequences are just token lists.
% \begin{macrocode}
\cs_new_eq:NN \seq_new:N \tl_new:N
\cs_new_eq:NN \seq_new:c \tl_new:c
% \end{macrocode}
% \end{macro}
-% \end{macro}
%
-% \begin{macro}{\seq_clear:N}
-% \begin{macro}{\seq_clear:c}
-% \begin{macro}{\seq_gclear:N}
-% \begin{macro}{\seq_gclear:c}
-% Clearing a sequence is the same as clearing a token list.
+% \begin{macro}{\seq_clear:N, \seq_clear:c}
+% \UnitTested
+% \begin{macro}{\seq_gclear:N, \seq_gclear:c}
+% \UnitTested
+% Clearing sequences is just the same as clearing token lists.
% \begin{macrocode}
\cs_new_eq:NN \seq_clear:N \tl_clear:N
\cs_new_eq:NN \seq_clear:c \tl_clear:c
@@ -486,14 +695,12 @@
% \end{macrocode}
% \end{macro}
% \end{macro}
-% \end{macro}
-% \end{macro}
%
-% \begin{macro}{\seq_clear_new:N}
-% \begin{macro}{\seq_clear_new:c}
-% \begin{macro}{\seq_gclear_new:N}
-% \begin{macro}{\seq_gclear_new:c}
-% Clearing a sequence is the same as clearing a token list.
+% \begin{macro}{\seq_clear_new:N, \seq_clear_new:c}
+% \UnitTested
+% \begin{macro}{\seq_gclear_new:N, \seq_gclear_new:c}
+% \UnitTested
+% Once again a simply copy from the token list functions.
% \begin{macrocode}
\cs_new_eq:NN \seq_clear_new:N \tl_clear_new:N
\cs_new_eq:NN \seq_clear_new:c \tl_clear_new:c
@@ -502,499 +709,683 @@
% \end{macrocode}
% \end{macro}
% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\seq_set_eq:NN}
-% \begin{macro}{\seq_set_eq:Nc}
-% \begin{macro}{\seq_set_eq:cN}
-% \begin{macro}{\seq_set_eq:cc}
-% We can set one "seq" equal to another.
-% \begin{macrocode}
-\cs_new_eq:NN \seq_set_eq:NN \cs_set_eq:NN
-\cs_new_eq:NN \seq_set_eq:cN \cs_set_eq:cN
-\cs_new_eq:NN \seq_set_eq:Nc \cs_set_eq:Nc
-\cs_new_eq:NN \seq_set_eq:cc \cs_set_eq:cc
+%
+% \begin{macro}{\seq_set_eq:NN, \seq_set_eq:cN, \seq_set_eq:Nc, \seq_set_eq:cc}
+% \UnitTested
+% \begin{macro}
+% {\seq_gset_eq:NN, \seq_gset_eq:cN, \seq_gset_eq:Nc, \seq_gset_eq:cc}
+% \UnitTested
+% Once again, these are simply copies from the token list functions.
+% \begin{macrocode}
+\cs_new_eq:NN \seq_set_eq:NN \tl_set_eq:NN
+\cs_new_eq:NN \seq_set_eq:Nc \tl_set_eq:Nc
+\cs_new_eq:NN \seq_set_eq:cN \tl_set_eq:cN
+\cs_new_eq:NN \seq_set_eq:cc \tl_set_eq:cc
+\cs_new_eq:NN \seq_gset_eq:NN \tl_gset_eq:NN
+\cs_new_eq:NN \seq_gset_eq:Nc \tl_gset_eq:Nc
+\cs_new_eq:NN \seq_gset_eq:cN \tl_gset_eq:cN
+\cs_new_eq:NN \seq_gset_eq:cc \tl_gset_eq:cc
% \end{macrocode}
% \end{macro}
% \end{macro}
-% \end{macro}
-% \end{macro}
%
-% \begin{macro}{\seq_gset_eq:NN}
-% \begin{macro}{\seq_gset_eq:cN}
-% \begin{macro}{\seq_gset_eq:Nc}
-% \begin{macro}{\seq_gset_eq:cc}
-% And of course globally which seems to be needed far more
-% often.\footnote{To save a bit of space these functions could be made
-% identical to those from the tl or clist module.}
+% \begin{macro}{\seq_concat:NNN, \seq_concat:ccc}
+% \UnitTested
+% \begin{macro}{\seq_gconcat:NNN, \seq_gconcat:ccc}
+% \UnitTested
+% Concatenating sequences is easy.
% \begin{macrocode}
-\cs_new_eq:NN \seq_gset_eq:NN \cs_gset_eq:NN
-\cs_new_eq:NN \seq_gset_eq:cN \cs_gset_eq:cN
-\cs_new_eq:NN \seq_gset_eq:Nc \cs_gset_eq:Nc
-\cs_new_eq:NN \seq_gset_eq:cc \cs_gset_eq:cc
+\cs_new_protected_nopar:Npn \seq_concat:NNN #1#2#3
+ { \tl_set:Nx #1 { \exp_not:o {#2} \exp_not:o {#3} } }
+\cs_new_protected_nopar:Npn \seq_gconcat:NNN #1#2#3
+ { \tl_gset:Nx #1 { \exp_not:o {#2} \exp_not:o {#3} } }
+\cs_generate_variant:Nn \seq_concat:NNN { ccc }
+\cs_generate_variant:Nn \seq_gconcat:NNN { ccc }
% \end{macrocode}
% \end{macro}
% \end{macro}
-% \end{macro}
-% \end{macro}
%
-% \begin{macro}{\seq_concat:NNN,\seq_concat:ccc}
-% |\seq_concat:NNN| \m{seq~1} \m{seq~2} \m{seq~3} will locally
-% assign \m{seq~1} the concatenation of \m{seq~2} and \m{seq~3}.
+% \subsection{Appending data to either end}
+%
+% \begin{macro}{
+% \seq_put_left:Nn, \seq_put_left:NV, \seq_put_left:Nv,
+% \seq_put_left:No, \seq_put_left:Nx,
+% \seq_put_left:cn, \seq_put_left:cV, \seq_put_left:cv,
+% \seq_put_left:co, \seq_put_left:cx
+% }
+% \UnitTested
+% \begin{macro}{
+% \seq_put_right:Nn, \seq_put_right:NV, \seq_put_right:Nv,
+% \seq_put_right:No, \seq_put_right:Nx,
+% \seq_put_right:cn, \seq_put_right:cV, \seq_put_right:cv,
+% \seq_put_right:co, \seq_put_right:cx
+% }
+% \UnitTested
+% The code here is just a wrapper for adding to token lists.
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \seq_concat:NNN #1#2#3 {
- \tl_set:Nx #1 { \exp_not:V #2 \exp_not:V #3 }
-}
-\cs_generate_variant:Nn \seq_concat:NNN {ccc}
+\cs_new_protected:Npn \seq_put_left:Nn #1#2
+ { \tl_put_left:Nn #1 { \seq_item:n {#2} } }
+\cs_new_protected:Npn \seq_put_right:Nn #1#2
+ { \tl_put_right:Nn #1 { \seq_item:n {#2} } }
+\cs_generate_variant:Nn \seq_put_left:Nn { NV , Nv , No , Nx }
+\cs_generate_variant:Nn \seq_put_left:Nn { c , cV , cv , co , cx }
+\cs_generate_variant:Nn \seq_put_right:Nn { NV , Nv , No , Nx }
+\cs_generate_variant:Nn \seq_put_right:Nn { c , cV , cv , co , cx }
% \end{macrocode}
% \end{macro}
+% \end{macro}
%
-% \begin{macro}{\seq_gconcat:NNN,\seq_gconcat:ccc}
-% |\seq_gconcat:NNN| \m{seq~1} \m{seq~2} \m{seq~3} will globally
-% assign \m{seq~1} the concatenation of \m{seq~2} and \m{seq~3}.
+% \begin{macro}{
+% \seq_gput_left:Nn, \seq_gput_left:NV, \seq_gput_left:Nv,
+% \seq_gput_left:No, \seq_gput_left:Nx,
+% \seq_gput_left:cn, \seq_gput_left:cV, \seq_gput_left:cv,
+% \seq_gput_left:co, \seq_gput_left:cx
+% }
+% \begin{macro}{
+% \seq_gput_right:Nn, \seq_gput_right:NV, \seq_gput_right:Nv,
+% \seq_gput_right:No, \seq_gput_right:Nx,
+% \seq_gput_right:cn, \seq_gput_right:cV,\seq_gput_right:cv,
+% \seq_gput_right:co, \seq_gput_right:cx
+% }
+% The same for global addition.
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \seq_gconcat:NNN #1#2#3 {
- \tl_gset:Nx #1 { \exp_not:V #2 \exp_not:V #3 }
-}
-\cs_generate_variant:Nn \seq_gconcat:NNN {ccc}
+\cs_new_protected:Npn \seq_gput_left:Nn #1#2
+ { \tl_gput_left:Nn #1 { \seq_item:n {#2} } }
+\cs_new_protected:Npn \seq_gput_right:Nn #1#2
+ { \tl_gput_right:Nn #1 { \seq_item:n {#2} } }
+\cs_generate_variant:Nn \seq_gput_left:Nn { NV , Nv , No , Nx }
+\cs_generate_variant:Nn \seq_gput_left:Nn { c , cV , cv , co , cx }
+\cs_generate_variant:Nn \seq_gput_right:Nn { NV , Nv , No , Nx }
+\cs_generate_variant:Nn \seq_gput_right:Nn { c , cV , cv , co , cx }
% \end{macrocode}
% \end{macro}
+% \end{macro}
%
-% \subsection{Predicates and conditionals}
+% \subsection{Breaking sequence functions}
%
-% \begin{macro}{\seq_if_empty_p:N,\seq_if_empty_p:c}
-% \begin{macro}[TF]{\seq_if_empty:N,\seq_if_empty:c}
-% A predicate which evaluates to |\c_true_bool| iff the sequence is empty.
+% \begin{macro}[int]{\seq_break:}
+% \begin{macro}[int]{\seq_break:n}
+% To break a function, the special token \cs{seq_break_point:n} is
+% used to find the end of the code. Any ending code is then inserted
+% before the return value of \cs{seq_map_break:n} is inserted.
% \begin{macrocode}
-\prg_new_eq_conditional:NNn \seq_if_empty:N \tl_if_empty:N {p,TF,T,F}
-\prg_new_eq_conditional:NNn \seq_if_empty:c \tl_if_empty:c {p,TF,T,F}
+\cs_new:Npn \seq_break: #1 \seq_break_point:n #2 {#2}
+\cs_new:Npn \seq_break:n #1#2 \seq_break_point:n #3 { #3 #1 }
% \end{macrocode}
% \end{macro}
% \end{macro}
%
-%
-% \begin{macro}{\seq_if_empty_err:N}
-% Signals an error if the sequence is empty.
+% \begin{macro}{\seq_map_break:}
+% \UnitTested
+% \begin{macro}{\seq_map_break:n}
+% \UnitTested
+% Semantically-logical copies of the break functions for use inside
+% mappings.
% \begin{macrocode}
-\cs_new_nopar:Npn \seq_if_empty_err:N #1 {
- \if_meaning:w #1 \c_empty_tl
+\cs_new_eq:NN \seq_map_break: \seq_break:
+\cs_new_eq:NN \seq_map_break:n \seq_break:n
% \end{macrocode}
-% As I said before, I don't think we need to provide checks for this
-% kind of error, since it is a severe internal macro package error
-% that can not be produced by the user directly. Can it? So the
-% next line of code should be probably removed.
-% (Will: I have no idea what this comment means.)
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[int]{\seq_break_point:n}
+% Normally, the marker token will not be executed, but if it is then
+% the end code is simply inserted.
% \begin{macrocode}
- \tl_clear:N \l_kernel_testa_tl % catch prefixes
- \msg_kernel_bug:x {Empty~sequence~`\token_to_str:N#1'}
- \fi:
-}
+\cs_new_eq:NN \seq_break_point:n \use:n
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[TF]{\seq_if_in:Nn,\seq_if_in:NV,\seq_if_in:cn,
-% \seq_if_in:cV,\seq_if_in:co,\seq_if_in:cx}
-% |\seq_if_in:NnTF| \m{seq}\m{item} \m{true~case} \m{false~case}
-% will check whether \m{item} is in \m{seq} and then either execute
-% the \m{true~case} or the \m{false~case}. \m{true~case} and
-% \m{false~case} may contain incomplete |\if_charcode:w|
-% statements.
-%
-% Note that |##2| in the definition below for "\seq_tmp:w" contains
-% exactly one token which we can compare with |\q_no_value|.
+% \begin{macro}[int]{\seq_if_empty_err_break:N}
+% A function to check that sequences really have some content. This
+% is optimised for speed, hence the direct primitive use.
% \begin{macrocode}
-\prg_new_protected_conditional:Nnn \seq_if_in:Nn {TF,T,F} {
- \cs_set:Npn \seq_tmp:w ##1 \seq_elt:w #2 \seq_elt_end: ##2##3 \q_stop {
- \if_meaning:w \q_no_value ##2
- \prg_return_false: \else: \prg_return_true: \fi:
+\cs_new_protected_nopar:Npn \seq_if_empty_err_break:N #1
+ {
+ \tex_ifx:D #1 \c_empty_tl
+ \msg_kernel_bug:x { Empty~sequence~\token_to_str:N #1 }
+ \exp_after:wN \seq_break:
+ \tex_fi:D
}
- \exp_after:wN \seq_tmp:w #1 \seq_elt:w #2 \seq_elt_end: \q_no_value \q_stop
-}
-% \end{macrocode}
-% \begin{macrocode}
-\cs_generate_variant:Nn \seq_if_in:NnTF { NV, cV, co, c, cx}
-\cs_generate_variant:Nn \seq_if_in:NnT { NV, cV, co, c, cx}
-\cs_generate_variant:Nn \seq_if_in:NnF { NV, cV, co, c, cx}
% \end{macrocode}
% \end{macro}
%
-% \subsection{Getting data out}
+% \subsection{Mapping to sequences}
%
-% \begin{macro}{\seq_get:NN}
-% \begin{macro}{\seq_get:cN}
-% \begin{macro}{\seq_get_aux:w}
-% |\seq_get:NN |\meta{sequence}\meta{cmd} defines \meta{cmd} to be the
-% left-most element of \meta{sequence}.
+% \begin{macro}{\seq_map_function:NN, \seq_map_function:cN}
+% \UnitTested
+% \begin{macro}[aux]{\seq_map_function_aux:NNn}
+% The idea here is to apply the code of |#2| to each item in the
+% sequence without altering the definition of \cs{seq_item:n}. This
+% is done as by noting that every odd token in the sequence must be
+% \cs{seq_item:n}, which can be gobbled by \cs{use_none:n}. At the end of
+% the loop, |#2| is instead |? \seq_map_break:|, which therefore breaks the
+% loop without needing to do a (relatively-expensive) quark test.
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \seq_get:NN #1 {
- \seq_if_empty_err:N #1
- \exp_after:wN \seq_get_aux:w #1 \q_stop
-}
-\cs_new_protected:Npn \seq_get_aux:w \seq_elt:w #1 \seq_elt_end: #2 \q_stop #3 {
- \tl_set:Nn #3 {#1}
-}
-\cs_generate_variant:Nn \seq_get:NN {c}
+\cs_new:Npn \seq_map_function:NN #1#2
+ {
+ \exp_after:wN \seq_map_function_aux:NNn \exp_after:wN #2 #1
+ { ? \seq_map_break: } { }
+ \seq_break_point:n { }
+ }
+\cs_new:Npn \seq_map_function_aux:NNn #1#2#3
+ {
+ \use_none:n #2
+ #1 {#3}
+ \seq_map_function_aux:NNn #1
+ }
+\cs_generate_variant:Nn \seq_map_function:NN { c }
% \end{macrocode}
% \end{macro}
% \end{macro}
-% \end{macro}
%
-% \begin{macro}{\seq_pop_aux:nnNN}
-% \begin{macro}{\seq_pop_aux:w}
-% |\seq_pop_aux:nnNN| \meta{def$\sb1$} \meta{def$\sb2$} \meta{sequence}
-% \meta{cmd} assigns the left_most element of \meta{sequence} to
-% \meta{cmd} using \meta{def$\sb2$}, and assigns the tail of
-% \meta{sequence} to \meta{sequence} using \meta{def$\sb1$}.
+% \begin{macro}[aux]{\g_seq_nesting_depth_int}
+% A counter to keep track of nested functions.
% \begin{macrocode}
-\cs_new_protected:Npn \seq_pop_aux:nnNN #1#2#3 {
- \seq_if_empty_err:N #3
- \exp_after:wN \seq_pop_aux:w #3 \q_stop #1#2#3
-}
-\cs_new_protected:Npn \seq_pop_aux:w
- \seq_elt:w #1 \seq_elt_end: #2\q_stop #3#4#5#6 {
- #3 #5 {#2}
- #4 #6 {#1}
-}
+\int_new:N \g_seq_nesting_depth_int
% \end{macrocode}
% \end{macro}
-% \end{macro}
%
-% \begin{macro}{\seq_show:N}
-% \begin{macro}{\seq_show:c}
+% \begin{macro}[int]{\seq_push_item_def:n, \seq_push_item_def:x}
+% \begin{macro}[aux]{\seq_push_item_def_aux:}
+% \begin{macro}[int]{\seq_pop_item_def:}
+% The definition of \cs{seq_item:n} needs to be saved and restored at
+% various points within the mapping and manipulation code. That is handled
+% here: as always, this approach uses global assignments.
% \begin{macrocode}
-\cs_new_eq:NN \seq_show:N \tl_show:N
-\cs_new_eq:NN \seq_show:c \tl_show:c
+\cs_new_protected:Npn \seq_push_item_def:n
+ {
+ \seq_push_item_def_aux:
+ \cs_gset:Npn \seq_item:n ##1
+ }
+\cs_new_protected:Npn \seq_push_item_def:x
+ {
+ \seq_push_item_def_aux:
+ \cs_gset:Npx \seq_item:n ##1
+ }
+\cs_new_protected:Npn \seq_push_item_def_aux:
+ {
+ \cs_gset_eq:cN { seq_item_ \int_use:N \g_seq_nesting_depth_int :n }
+ \seq_item:n
+ \int_gincr:N \g_seq_nesting_depth_int
+ }
+\cs_new_protected_nopar:Npn \seq_pop_item_def:
+ {
+ \int_gdecr:N \g_seq_nesting_depth_int
+ \cs_gset_eq:Nc \seq_item:n
+ { seq_item_ \int_use:N \g_seq_nesting_depth_int :n }
+ }
% \end{macrocode}
% \end{macro}
% \end{macro}
+% \end{macro}
%
-% \begin{macro}{\seq_display:N}
-% \begin{macro}{\seq_display:c}
+% \begin{macro}{\seq_map_inline:Nn, \seq_map_inline:cn}
+% \UnitTested
+% The idea here is that \cs{seq_item:n} is already \enquote{applied} to
+% each item in a sequence, and so an in-line mapping is just a case of
+% redefining \cs{seq_item:n}.
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \seq_display:N #1 {
- \iow_term:x { Sequence~\token_to_str:N #1~contains~
- the~elements~(without~outer~braces): }
- \toks_clear:N \l_tmpa_toks
- \seq_map_inline:Nn #1 {
- \toks_if_empty:NF \l_tmpa_toks {
- \toks_put_right:Nx \l_tmpa_toks {^^J>~}
- }
- \toks_put_right:Nx \l_tmpa_toks {
- \c_space_tl \iow_char:N \{ \exp_not:n {##1} \iow_char:N \}
- }
+\cs_new_protected:Npn \seq_map_inline:Nn #1#2
+ {
+ \seq_push_item_def:n {#2}
+ #1
+ \seq_break_point:n { \seq_pop_item_def: }
}
- \toks_show:N \l_tmpa_toks
-}
-\cs_generate_variant:Nn \seq_display:N {c}
+\cs_generate_variant:Nn \seq_map_inline:Nn { c }
% \end{macrocode}
% \end{macro}
+%
+% \begin{macro}{
+% \seq_map_variable:NNn,\seq_map_variable:Ncn,
+% \seq_map_variable:cNn,\seq_map_variable:ccn
+% }
+% \UnitTested
+% This is just a specialised version of the in-line mapping function,
+% using an \texttt{x}-type expansion for the code set up so that the
+% number of |#| tokens required is as expected.
+% \begin{macrocode}
+\cs_new_protected:Npn \seq_map_variable:NNn #1#2#3
+ {
+ \seq_push_item_def:x
+ {
+ \tl_set:Nn \exp_not:N #2 {##1}
+ \exp_not:n {#3}
+ }
+ #1
+ \seq_break_point:n { \seq_pop_item_def: }
+ }
+\cs_generate_variant:Nn \seq_map_variable:NNn { Nc }
+\cs_generate_variant:Nn \seq_map_variable:NNn { c , cc }
+% \end{macrocode}
% \end{macro}
%
+% \subsection{Sequence stacks}
%
-% \subsection{Putting data in}
+% The same functions as for sequences, but with the correct naming.
%
-% \begin{macro}{\seq_put_aux:Nnn}
-% \begin{macro}{\seq_put_aux:w}
-% |\seq_put_aux:Nnn| \meta{sequence} \meta{left} \meta{right} adds the
-% elements specified by \meta{left} to the left of \meta{sequence}, and
-% those specified by \meta{right} to the right.
+% \begin{macro}{
+% \seq_push:Nn, \seq_push:NV, \seq_push:Nv, \seq_push:No, \seq_push:Nx,
+% \seq_push:cn, \seq_push:cV, \seq_push:cV, \seq_push:co, \seq_push:cx
+% }
+% \UnitTested
+% \begin{macro}{
+% \seq_gpush:Nn, \seq_gpush:NV, \seq_gpush:Nv, \seq_gpush:No, \seq_gpush:Nx,
+% \seq_gpush:cn, \seq_gpush:cV, \seq_gpush:cv, \seq_gpush:co, \seq_gpush:cx
+% }
+% \UnitTested
+% Pushing to a sequence is the same as adding on the left.
% \begin{macrocode}
-\cs_new_protected:Npn \seq_put_aux:Nnn #1 {
- \exp_after:wN \seq_put_aux:w #1 \q_stop #1
-}
-\cs_new_protected:Npn \seq_put_aux:w #1\q_stop #2#3#4 { \tl_set:Nn #2 {#3#1#4} }
+\cs_new_eq:NN \seq_push:Nn \seq_put_left:Nn
+\cs_new_eq:NN \seq_push:NV \seq_put_left:NV
+\cs_new_eq:NN \seq_push:Nv \seq_put_left:Nv
+\cs_new_eq:NN \seq_push:No \seq_put_left:No
+\cs_new_eq:NN \seq_push:Nx \seq_put_left:Nx
+\cs_new_eq:NN \seq_push:cn \seq_put_left:cn
+\cs_new_eq:NN \seq_push:cV \seq_put_left:cV
+\cs_new_eq:NN \seq_push:cv \seq_put_left:cv
+\cs_new_eq:NN \seq_push:co \seq_put_left:co
+\cs_new_eq:NN \seq_push:cx \seq_put_left:cx
+\cs_new_eq:NN \seq_gpush:Nn \seq_gput_left:Nn
+\cs_new_eq:NN \seq_gpush:NV \seq_gput_left:NV
+\cs_new_eq:NN \seq_gpush:Nv \seq_gput_left:Nv
+\cs_new_eq:NN \seq_gpush:No \seq_gput_left:No
+\cs_new_eq:NN \seq_gpush:Nx \seq_gput_left:Nx
+\cs_new_eq:NN \seq_gpush:cn \seq_gput_left:cn
+\cs_new_eq:NN \seq_gpush:cV \seq_gput_left:cV
+\cs_new_eq:NN \seq_gpush:cv \seq_gput_left:cv
+\cs_new_eq:NN \seq_gpush:co \seq_gput_left:co
+\cs_new_eq:NN \seq_gpush:cx \seq_gput_left:cx
% \end{macrocode}
% \end{macro}
% \end{macro}
%
-% \begin{macro}{\seq_put_left:Nn}
-% \begin{macro}{\seq_put_left:NV}
-% \begin{macro}{\seq_put_left:No}
-% \begin{macro}{\seq_put_left:Nx}
-% \begin{macro}{\seq_put_left:cn}
-% \begin{macro}{\seq_put_left:cV}
-% \begin{macro}{\seq_put_left:co}
-% \begin{macro}{\seq_put_right:Nn}
-% \begin{macro}{\seq_put_right:No}
-% \begin{macro}{\seq_put_right:NV}
-% \begin{macro}{\seq_put_right:Nx}
-% \begin{macro}{\seq_put_right:cn}
-% \begin{macro}{\seq_put_right:cV}
-% \begin{macro}{\seq_put_right:co}
-% Here are the usual operations for adding to the left and right.
-% \begin{macrocode}
-\cs_new_protected:Npn \seq_put_left:Nn #1#2 {
- \seq_put_aux:Nnn #1 {\seq_elt:w #2\seq_elt_end:} {}
-}
-% \end{macrocode}
-% We can't put in a |\prg_do_nothing:| instead of |{}| above since this argument
-% is passed literally (and we would end up with many |\prg_do_nothing:|s inside
-% the sequences).
-% \begin{macrocode}
-\cs_generate_variant:Nn \seq_put_left:Nn {NV,No,Nx,c,cV,co}
-% \end{macrocode}
+% \begin{macro}{\seq_get_left:NN, \seq_get_left:cN}
+% \UnitTested
+% \begin{macro}[aux]{\seq_get_left_aux:Nw}
+% Getting an item from the left of a sequence is pretty easy: just
+% trim off the first item after removing the \cs{seq_item:n} at
+% the start.
% \begin{macrocode}
-\cs_new_protected:Npn \seq_put_right:Nn #1#2{
- \seq_put_aux:Nnn #1{}{\seq_elt:w #2\seq_elt_end:}}
-% \end{macrocode}
-% \begin{macrocode}
-\cs_generate_variant:Nn \seq_put_right:Nn {NV,No,Nx,c,cV,co}
+\cs_new_protected_nopar:Npn \seq_get_left:NN #1#2
+ {
+ \seq_if_empty_err_break:N #1
+ \exp_after:wN \seq_get_left_aux:Nw #1 \q_stop #2
+ \seq_break_point:n { }
+ }
+\cs_new_protected:Npn \seq_get_left_aux:Nw \seq_item:n #1#2 \q_stop #3
+ { \tl_set:Nn #3 {#1} }
+\cs_generate_variant:Nn \seq_get_left:NN { c }
% \end{macrocode}
% \end{macro}
% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
+%
+% \begin{macro}{\seq_pop_left:NN, \seq_pop_left:cN}
+% \UnitTested
+% \begin{macro}{\seq_gpop_left:NN, \seq_gpop_left:cN}
+% \UnitTested
+% \begin{macro}[aux]{\seq_pop_left_aux:NNN}
+% \begin{macro}[aux]{\seq_pop_left_aux:Nw}
+% The approach to popping an item is pretty similar to that to get
+% an item, with the only difference being that the sequence itself has
+% to be redefined. This makes it more sensible to use an auxiliary
+% function for the local and global cases.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \seq_pop_left:NN
+ { \seq_pop_left_aux:NNN \tl_set:Nn }
+\cs_new_protected_nopar:Npn \seq_gpop_left:NN
+ { \seq_pop_left_aux:NNN \tl_gset:Nn }
+\cs_new_protected_nopar:Npn \seq_pop_left_aux:NNN #1#2#3
+ {
+ \seq_if_empty_err_break:N #2
+ \exp_after:wN \seq_pop_left_aux:Nw #2 \q_stop #1#2#3
+ \seq_break_point:n { }
+ }
+\cs_new_protected:Npn \seq_pop_left_aux:Nw \seq_item:n #1#2 \q_stop #3#4#5
+ {
+ #3 #4 {#2}
+ \tl_set:Nn #5 {#1}
+ }
+\cs_generate_variant:Nn \seq_pop_left:NN { c }
+\cs_generate_variant:Nn \seq_gpop_left:NN { c }
+% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
-% \begin{macro}{\seq_gput_left:Nn}
-% \begin{macro}{\seq_gput_left:NV}
-% \begin{macro}{\seq_gput_left:No}
-% \begin{macro}{\seq_gput_left:Nx}
-% \begin{macro}{\seq_gput_left:cn}
-% \begin{macro}{\seq_gput_left:cV}
-% \begin{macro}{\seq_gput_left:co}
-% \begin{macro}{\seq_gput_right:Nn}
-% \begin{macro}{\seq_gput_right:NV}
-% \begin{macro}{\seq_gput_right:No}
-% \begin{macro}{\seq_gput_right:Nx}
-% \begin{macro}{\seq_gput_right:cn}
-% \begin{macro}{\seq_gput_right:cV}
-% \begin{macro}{\seq_gput_right:co}
-% \begin{macrocode}
-\cs_new_protected:Npn \seq_gput_left:Nn {
-%<*check>
- \pref_global_chk:
-%</check>
-%<*!check>
- \pref_global:D
-%</!check>
- \seq_put_left:Nn
-}
-% \end{macrocode}
+% \begin{macro}{\seq_get_right:NN, \seq_get_right:cN}
+% \UnitTested
+% \begin{macro}[aux]{\seq_get_right_aux:NN}
+% \begin{macro}[aux]{\seq_get_right_loop:nn}
+% The idea here is to remove the very first \cs{seq_item:n} from the
+% sequence, leaving a token list starting with the first braced entry.
+% Two arguments at a time are then grabbed: apart from the right-hand end of
+% the sequence, this will be a brace group followed by \cs{seq_item:n}. The
+% set up code means that these all disappear. At the end of the sequence,
+% the assignment is placed in front of the very last entry in the sequence,
+% before a tidying-up step takes place to remove the loop and reset the
+% meaning of \cs{seq_item:n}.
% \begin{macrocode}
-\cs_new_protected:Npn \seq_gput_right:Nn {
-%<*check>
- \pref_global_chk:
-%</check>
-%<*!check>
- \pref_global:D
-%</!check>
- \seq_put_right:Nn
+\cs_new_protected_nopar:Npn \seq_get_right:NN #1#2
+ {
+ \seq_if_empty_err_break:N #1
+ \seq_get_right_aux:NN #1#2
+ \seq_break_point:n { }
+ }
+\cs_new_protected_nopar:Npn \seq_get_right_aux:NN #1#2
+ {
+ \seq_push_item_def:n { }
+ \exp_after:wN \exp_after:wN \exp_after:wN \seq_get_right_loop:nn
+ \exp_after:wN \use_none:n #1
+ { \tl_set:Nn #2 }
+ { }
+ {
+ \seq_pop_item_def:
+ \seq_break:
+ }
}
+\cs_new:Npn \seq_get_right_loop:nn #1#2
+ {
+ #2 {#1}
+ \seq_get_right_loop:nn
+ }
+\cs_generate_variant:Nn \seq_get_right:NN { c }
% \end{macrocode}
-% \begin{macrocode}
-\cs_generate_variant:Nn \seq_gput_left:Nn {NV,No,Nx,c,cV,co}
-% \end{macrocode}
-% \begin{macrocode}
-\cs_generate_variant:Nn \seq_gput_right:Nn {NV,No,Nx,c,cV,co}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-%
-% \subsection{Mapping}
%
-% \begin{macro}{\seq_map_variable:NNn}
-% \begin{macro}{\seq_map_variable:cNn}
-% \begin{macro}[aux]{\seq_map_variable_aux:Nnw}
-% Nothing spectacular here.
+% \begin{macro}{\seq_pop_right:NN, \seq_pop_right:cN}
+% \UnitTested
+% \begin{macro}{\seq_gpop_right:NN, \seq_gpop_right:cN}
+% \UnitTested
+% \begin{macro}[aux]{\seq_get_right_aux:NNN, \seq_get_right_aux_ii:NNN}
+% The approach to popping from the right is a bit more involved, but does
+% use some of the same ideas as getting from the right. What is needed is a
+% \enquote{flexible length} way to set a token list variable. This is supplied
+% by the |{ \tex_iffalse:D } \tex_fi:D| \ldots |\tex_iffalse:D { \tex_fi:D }|
+% construct. Using an \texttt{x}-type expansion and a \enquote{non-expanding}
+% definition for \cs{seq_item:n}, the left-most $n - 1$ entries in a
+% sequence of $n$ items will be stored back in the sequence. That needs
+% a loop of unknown length, hence using the strange \cs{tex_iffalse:D}
+% way of including brackets. When the last item of the sequence is reached,
+% the closing bracket for the assignment is inserted, and |\tl_set:Nn #3|
+% is inserted in front of the final entry. This therefore does the pop
+% assignment, then a final loop clears up the code.
% \begin{macrocode}
-\cs_new_protected:Npn \seq_map_variable_aux:Nnw #1#2 \seq_elt:w #3 \seq_elt_end: {
- \tl_set:Nn #1 {#3}
- \quark_if_nil:NT #1 \seq_map_break:
- #2
- \seq_map_variable_aux:Nnw #1{#2}
-}
-\cs_new_protected:Npn \seq_map_variable:NNn #1#2#3 {
- \tl_set:Nn #2 {\seq_map_variable_aux:Nnw #2{#3}}
- \exp_after:wN #2 #1 \seq_elt:w \q_nil\seq_elt_end: \q_stop
-}
-\cs_generate_variant:Nn \seq_map_variable:NNn {c}
+\cs_new_protected_nopar:Npn \seq_pop_right:NN
+ { \seq_pop_right_aux:NNN \tl_set:Nx }
+\cs_new_protected_nopar:Npn \seq_gpop_right:NN
+ { \seq_pop_right_aux:NNN \tl_gset:Nx }
+\cs_new_protected_nopar:Npn \seq_pop_right_aux:NNN #1#2#3
+ {
+ \seq_if_empty_err_break:N #2
+ \seq_pop_right_aux_ii:NNN #1 #2 #3
+ \seq_break_point:n { }
+ }
+\cs_new_protected_nopar:Npn \seq_pop_right_aux_ii:NNN #1#2#3
+ {
+ \seq_push_item_def:n { \exp_not:n { \seq_item:n {##1} } }
+ #1 #2 { \tex_iffalse:D } \tex_fi:D
+ \exp_after:wN \exp_after:wN \exp_after:wN \seq_get_right_loop:nn
+ \exp_after:wN \use_none:n #2
+ {
+ \tex_iffalse:D { \tex_fi:D }
+ \tl_set:Nn #3
+ }
+ { }
+ {
+ \seq_pop_item_def:
+ \seq_break:
+ }
+ }
+\cs_generate_variant:Nn \seq_pop_right:NN { c }
+\cs_generate_variant:Nn \seq_gpop_right:NN { c }
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
-% \begin{macro}{\seq_map_break:}
-% \begin{macro}{\seq_map_break:n}
-% Terminate a mapping function at the point of execution. The latter
-% takes an argument to be executed after cleaning up the map.
+% \begin{macro}{\seq_get:NN, \seq_get:cN}
+% \UnitTested
+% \begin{macro}{\seq_pop:NN, \seq_pop:cN}
+% \UnitTested
+% \begin{macro}{\seq_gpop:NN, \seq_gpop:cN}
+% \UnitTested
+% In most cases, getting items from the stack does not need to specify
+% that this is from the left. So alias are provided.
% \begin{macrocode}
-\cs_new_eq:NN \seq_map_break: \use_none_delimit_by_q_stop:w
-\cs_new_eq:NN \seq_map_break:n \use_i_delimit_by_q_stop:nw
+\cs_new_eq:NN \seq_get:NN \seq_get_left:NN
+\cs_new_eq:NN \seq_get:cN \seq_get_left:cN
+\cs_new_eq:NN \seq_pop:NN \seq_pop_left:NN
+\cs_new_eq:NN \seq_pop:cN \seq_pop_left:cN
+\cs_new_eq:NN \seq_gpop:NN \seq_gpop_left:NN
+\cs_new_eq:NN \seq_gpop:cN \seq_gpop_left:cN
% \end{macrocode}
% \end{macro}
% \end{macro}
+% \end{macro}
+%
+% \subsection{Sequence conditionals}
%
-% \begin{macro}{\seq_map_function:NN}
-% \begin{macro}{\seq_map_function:cN}
-% |\seq_map_function:NN| \meta{sequence} \meta{cmd} applies \meta{cmd} to each
-% element of \meta{sequence}, from left to right. Since we don't have
-% braces, this implementation is not very efficient. It might be
-% better to say that \meta{cmd} must be a function with one argument
-% that is delimited by |\seq_elt_end:|.
+% \begin{macro}[pTF]{\seq_if_empty:N, \seq_if_empty:c}
+% \UnitTested
+% Simple copies from the token list variable material.
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \seq_map_function:NN #1#2 {
- \cs_set:Npn \seq_elt:w ##1 \seq_elt_end: {#2{##1}}
- #1 \use_none:n \q_stop
- \cs_set_eq:NN \seq_elt:w \ERROR
-}
-\cs_generate_variant:Nn \seq_map_function:NN {c}
+\prg_new_eq_conditional:NNn \seq_if_empty:N \tl_if_empty:N
+ { p , T , F , TF }
+\prg_new_eq_conditional:NNn \seq_if_empty:c \tl_if_empty:c
+ { p , T , F , TF }
% \end{macrocode}
% \end{macro}
-% \end{macro}
%
-% \begin{macro}{\seq_map_inline:Nn}
-% \begin{macro}{\seq_map_inline:cn}
-% When no braces are used, this version of mapping seems more
-% natural.
+% \begin{macro}[TF]{
+% \seq_if_in:Nn, \seq_if_in:NV, \seq_if_in:Nv, \seq_if_in:No, \seq_if_in:Nx,
+% \seq_if_in:cn, \seq_if_in:cV, \seq_if_in:cv, \seq_if_in:co, \seq_if_in:cx
+% }
+% \UnitTested
+% \begin{macro}[aux]{\seq_if_in_aux:}
+% The approach here is to define \cs{seq_item:n} to compare its
+% argument with the test sequence. If the two items are equal, the
+% mapping is terminated and \cs{prg_return_true:} is inserted. On the
+% other hand, if there is no match then the loop will break returning
+% \cs{prg_return_false:}. In either case, \cs{seq_break_point:n}
+% ensures that the group ends before the logical value is returned.
+% Everything is inside a group so that \cs{seq_item:n} is preserved
+% in nested situations.
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \seq_map_inline:Nn #1#2 {
- \cs_set:Npn \seq_elt:w ##1 \seq_elt_end: {#2}
- #1 \use_none:n \q_stop
- \cs_set_eq:NN \seq_elt:w \ERROR
-}
-\cs_generate_variant:Nn \seq_map_inline:Nn {c}
+\prg_new_protected_conditional:Npnn \seq_if_in:Nn #1#2
+ { T , F , TF }
+ {
+ \group_begin:
+ \tl_set:Nn \l_seq_tmpa_tl {#2}
+ \cs_set_protected:Npn \seq_item:n ##1
+ {
+ \tl_set:Nn \l_seq_tmpb_tl {##1}
+ \tex_ifx:D \l_seq_tmpa_tl \l_seq_tmpb_tl
+ \exp_after:wN \seq_if_in_aux:
+ \tex_fi:D
+ }
+ #1
+ \seq_break:n { \prg_return_false: }
+ \seq_break_point:n { \group_end: }
+ }
+\cs_new_nopar:Npn \seq_if_in_aux: { \seq_break:n { \prg_return_true: } }
+\cs_generate_variant:Nn \seq_if_in:NnT { NV , Nv , No , Nx }
+\cs_generate_variant:Nn \seq_if_in:NnT { c , cV , cv , co , cx }
+\cs_generate_variant:Nn \seq_if_in:NnF { NV , Nv , No , Nx }
+\cs_generate_variant:Nn \seq_if_in:NnF { c , cV , cv , co , cx }
+\cs_generate_variant:Nn \seq_if_in:NnTF { NV , Nv , No , Nx }
+\cs_generate_variant:Nn \seq_if_in:NnTF { c , cV , cv , co , cx }
% \end{macrocode}
% \end{macro}
% \end{macro}
%
-% \subsection{Manipulation}
+% \subsection{Modifying sequences}
%
-% \begin{macro}[aux]{\l_clist_remove_clist}
-% A common scratch space for the removal routines.
+% \begin{macro}[aux]{\l_seq_remove_seq}
+% An internal sequence for the removal routines.
% \begin{macrocode}
\seq_new:N \l_seq_remove_seq
% \end{macrocode}
-% \end{macro}
+% \end{macro}
%
-% \begin{macro}[aux]{\seq_remove_duplicates_aux:NN}
-% \begin{macro}[aux]{\seq_remove_duplicates_aux:n}
-% \begin{macro}{\seq_remove_duplicates:N}
-% \begin{macro}{\seq_gremove_duplicates:N}
-% Copied from "\clist_remove_duplicates".
+% \begin{macro}{\seq_remove_duplicates:N, \seq_remove_duplicates:c}
+% \UnitTested
+% \begin{macro}{\seq_gremove_duplicates:N, \seq_gremove_duplicates:c}
+% \UnitTested
+% \begin{macro}[aux]{\seq_remove_duplicates_aux:NN}
+% Removing duplicates means making a new list then copying it.
% \begin{macrocode}
-\cs_new_protected:Npn \seq_remove_duplicates_aux:NN #1#2 {
- \seq_clear:N \l_seq_remove_seq
- \seq_map_function:NN #2 \seq_remove_duplicates_aux:n
- #1 #2 \l_seq_remove_seq
-}
-\cs_new_protected:Npn \seq_remove_duplicates_aux:n #1 {
- \seq_if_in:NnF \l_seq_remove_seq {#1} {
- \seq_put_right:Nn \l_seq_remove_seq {#1}
+\cs_new_protected:Npn \seq_remove_duplicates:N
+ { \seq_remove_duplicates_aux:NN \seq_set_eq:NN }
+\cs_new_protected:Npn \seq_gremove_duplicates:N
+ { \seq_remove_duplicates_aux:NN \seq_gset_eq:NN }
+\cs_new_protected:Npn \seq_remove_duplicates_aux:NN #1#2
+ {
+ \seq_clear:N \l_seq_remove_seq
+ \seq_map_inline:Nn #2
+ {
+ \seq_if_in:NnF \l_seq_remove_seq {##1}
+ { \seq_put_right:Nn \l_seq_remove_seq {##1} }
+ }
+ #1 #2 \l_seq_remove_seq
}
-}
-% \end{macrocode}
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \seq_remove_duplicates:N {
- \seq_remove_duplicates_aux:NN \seq_set_eq:NN
-}
-\cs_new_protected_nopar:Npn \seq_gremove_duplicates:N {
- \seq_remove_duplicates_aux:NN \seq_gset_eq:NN
-}
+\cs_generate_variant:Nn \seq_remove_duplicates:N { c }
+\cs_generate_variant:Nn \seq_gremove_duplicates:N { c }
% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \subsection{Sequence stacks}
-%
-% \begin{macro}{\seq_push:Nn}
-% \begin{macro}{\seq_push:NV}
-% \begin{macro}{\seq_push:No}
-% \begin{macro}{\seq_push:cn}
-% \begin{macro}{\seq_pop:NN}
-% \begin{macro}{\seq_pop:cN}
-% Since sequences can be used as stacks, we ought to have both
-% `push' and `pop'. In most cases they are nothing more then new
-% names for old functions.
-% \begin{macrocode}
-\cs_new_eq:NN \seq_push:Nn \seq_put_left:Nn
-\cs_new_eq:NN \seq_push:NV \seq_put_left:NV
-\cs_new_eq:NN \seq_push:No \seq_put_left:No
-\cs_new_eq:NN \seq_push:cn \seq_put_left:cn
-\cs_new_protected_nopar:Npn \seq_pop:NN { \seq_pop_aux:nnNN \tl_set:Nn \tl_set:Nn }
-\cs_generate_variant:Nn \seq_pop:NN {c}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
-% \begin{macro}{\seq_gpush:Nn}
-% \begin{macro}{\seq_gpush:NV}
-% \begin{macro}{\seq_gpush:No}
-% \begin{macro}{\seq_gpush:cn}
-% \begin{macro}{\seq_gpush:Nv}
-% \begin{macro}{\seq_gpop:NN}
-% \begin{macro}{\seq_gpop:cN}
-% I don't agree with Denys that one needs only local stacks,
-% actually I believe that one will probably need the functions
-% here more often. In case of |\seq_gpop:NN| the value is
-% nevertheless returned locally.
+% \begin{macro}{\seq_remove_all:Nn, \seq_remove_all:cn}
+% \UnitTested
+% \begin{macro}{\seq_gremove_all:Nn, \seq_gremove_all:cn}
+% \UnitTested
+% \begin{macro}[aux]{\seq_remove_all_aux:NNn}
+% The idea of the code here is to avoid a relatively expensive addition of
+% items one at a time to an intermediate sequence.
+% The approach taken is therefore similar to
+% that in \cs{seq_pop_right_aux_ii:NNN}, using a \enquote{flexible}
+% \texttt{x}-type expansion to do most of the work. As \cs{tl_if_eq:nnT}
+% is not expandable, a two-part strategy is needed. First, the
+% \texttt{x}-type expansion uses \cs{str_if_eq:nnT} to find potential
+% matches. If one is found, the expansion is halted and the necessary
+% set up takes place to use the \cs{tl_if_eq:NNT} test. The \texttt{x}-type
+% is started again, including all of the items copied already. This will
+% happen repeatedly until the entire sequence has been scanned. The code
+% is set up to avoid needing and intermediate scratch list: the lead-off
+% \texttt{x}-type expansion (|#1 #2 {#2}|) will ensure that nothing is
+% lost.
% \begin{macrocode}
-\cs_new_eq:NN \seq_gpush:Nn \seq_gput_left:Nn
-\cs_new_protected_nopar:Npn \seq_gpop:NN { \seq_pop_aux:nnNN \tl_gset:Nn \tl_set:Nn }
-\cs_generate_variant:Nn \seq_gpush:Nn {NV,No,c,Nv}
-\cs_generate_variant:Nn \seq_gpop:NN {c}
+\cs_new_protected:Npn \seq_remove_all:Nn
+ { \seq_remove_all_aux:NNn \tl_set:Nx }
+\cs_new_protected:Npn \seq_gremove_all:Nn
+ { \seq_remove_all_aux:NNn \tl_gset:Nx }
+\cs_new_protected:Npn \seq_remove_all_aux:NNn #1#2#3
+ {
+ \seq_push_item_def:n
+ {
+ \str_if_eq:nnT {##1} {#3}
+ {
+ \tex_iffalse:D { \tex_fi:D }
+ \tl_set:Nn \l_seq_tmpb_tl {##1}
+ #1 #2
+ { \tex_iffalse:D } \tex_fi:D
+ \exp_not:o {#2}
+ \tl_if_eq:NNT \l_seq_tmpa_tl \l_seq_tmpb_tl
+ { \use_none:nn }
+ }
+ \exp_not:n { \seq_item:n {##1} }
+ }
+ \tl_set:Nn \l_seq_tmpa_tl {#3}
+ #1 #2 {#2}
+ \seq_pop_item_def:
+ }
+\cs_generate_variant:Nn \seq_remove_all:Nn { c }
+\cs_generate_variant:Nn \seq_gremove_all:Nn { c }
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
+%
+% \section{Viewing sequences}
+%
+% \begin{macro}[aux]{\l_seq_show_tl}
+% Used to store the material for display.
+% \begin{macrocode}
+\tl_new:N \l_seq_show_tl
+% \end{macrocode}
% \end{macro}
+%
+% \begin{macro}{\seq_show:N, \seq_show:c}
+% \UnitTested
+% \begin{macro}[aux]{\seq_show_aux:n}
+% \begin{macro}[aux]{\seq_show_aux:w}
+% The aim of the mapping here is to create a token list containing the
+% formatted sequence. The very first item needs the new line and \verb*|> |
+% removing, which is achieved using a \texttt{w}-type auxiliary. To avoid
+% a low-level \TeX{} error if there is an empty sequence, a simple test is
+% used to keep the output \enquote{clean}.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \seq_show:N #1
+ {
+ \seq_if_empty:NTF #1
+ {
+ \iow_term:x { Sequence~\token_to_str:N #1 \c_space_tl is~empty }
+ \tl_show:n { }
+ }
+ {
+ \iow_term:x
+ {
+ Sequence~\token_to_str:N #1 \c_space_tl
+ contains~the~items~(without~outer~braces):
+ }
+ \tl_set:Nx \l_seq_show_tl
+ { \seq_map_function:NN #1 \seq_show_aux:n }
+ \etex_showtokens:D \exp_after:wN \exp_after:wN \exp_after:wN
+ { \exp_after:wN \seq_show_aux:w \l_seq_show_tl }
+ }
+ }
+\cs_new:Npn \seq_show_aux:n #1
+ {
+ \iow_newline: > \c_space_tl \c_space_tl
+ \iow_char:N \{ \exp_not:n {#1} \iow_char:N \}
+ }
+\cs_new:Npn \seq_show_aux:w #1 > ~ { }
+\cs_generate_variant:Nn \seq_show:N { c }
+% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
-% \begin{macro}{\seq_top:NN}
-% \begin{macro}{\seq_top:cN}
-% Looking at the top element of the stack without removing it is
-% done with this operation.
+% \subsection{Depreciated interfaces}
+%
+% A few functions which are no longer documented: these were moved
+% here on or before 2011-04-20, and will be removed entirely by
+% 2011-07-20.
+%
+% \begin{macro}{\seq_top:NN, \seq_top:cN}
+% These are old stack functions.
% \begin{macrocode}
-\cs_new_eq:NN \seq_top:NN \seq_get:NN
-\cs_new_eq:NN \seq_top:cN \seq_get:cN
+\cs_new_eq:NN \seq_top:NN \seq_get_left:NN
+\cs_new_eq:NN \seq_top:cN \seq_get_left:cN
% \end{macrocode}
% \end{macro}
-% \end{macro}
-%
%
+% \begin{macro}{\seq_display:N, \seq_display:c}
+% An older name for \cs{seq_show:N}.
% \begin{macrocode}
-%</initex|package>
+\cs_new_eq:NN \seq_display:N \seq_show:N
+\cs_new_eq:NN \seq_display:c \seq_show:c
% \end{macrocode}
+% \end{macro}
%
-% Show token usage:
% \begin{macrocode}
-%<*showmemory>
-%\showMemUsage
-%</showmemory>
+%</initex|package>
% \end{macrocode}
%
% \end{implementation}
-% \PrintIndex
%
-% \endinput
+% \PrintIndex \ No newline at end of file
diff --git a/Master/texmf-dist/source/latex/expl3/l3tl.dtx b/Master/texmf-dist/source/latex/expl3/l3tl.dtx
index fe6ecd271f1..487578939f1 100644
--- a/Master/texmf-dist/source/latex/expl3/l3tl.dtx
+++ b/Master/texmf-dist/source/latex/expl3/l3tl.dtx
@@ -36,7 +36,7 @@
\RequirePackage{l3names}
%</driver|package>
%\fi
-\GetIdInfo$Id: l3tl.dtx 2184 2011-03-07 18:07:12Z joseph $
+\GetIdInfo$Id: l3tl.dtx 2223 2011-04-09 12:57:14Z will $
{L3 Experimental Token Lists}
%\iffalse
%<*driver>
@@ -828,13 +828,13 @@
% \end{macrocode}
% Otherwise any variable type is allowed.
% \begin{macrocode}
- \cs_gset_nopar:Npn #1{#2}
+ \tl_gset:Nn #1 {#2}
}
\cs_generate_variant:Nn \tl_new:Nn {cn}
\cs_new_protected:Npn \tl_new:Nx #1#2{
\chk_if_free_cs:N #1
%<check> \chk_var_or_const:N #1
- \cs_gset_nopar:Npx #1{#2}
+ \tl_gset:Nx #1 {#2}
}
\cs_new_protected_nopar:Npn \tl_new:N #1{\tl_new:Nn #1{}}
\cs_new_protected_nopar:Npn \tl_new:c #1{\tl_new:cn {#1}{}}
@@ -2134,137 +2134,7 @@
% \end{macro}
% \end{macro}
% \end{macro}
-%
-%\begin{macro}{\_tl_check_exists:N}
-% When used as a package, there is an option to be picky and to
-% check definitions exist. The message text for this is created later,
-% as the mechanism is not yet in place.
-% \begin{macrocode}
-%<*package>
-\tex_ifodd:D \@l@expl@check@declarations@bool \scan_stop:
- \cs_set_protected:Npn \_tl_check_exists:N #1
- {
- \cs_if_exist:NF #1
- {
- \msg_kernel_error:nnx { check } { non-declared-variable }
- { \token_to_str:N #1 }
- }
- }
- \cs_set_protected:Npn \tl_set:Nn #1#2
- {
- \_tl_check_exists:N #1
- \cs_set_nopar:Npx #1 { \exp_not:n {#2} }
- }
- \cs_set_protected:Npn \tl_set:Nx #1#2
- {
- \_tl_check_exists:N #1
- \cs_set_nopar:Npx #1 {#2}
- }
- \cs_set_protected:Npn \tl_gset:Nn #1#2
- {
- \_tl_check_exists:N #1
- \cs_gset_nopar:Npx #1 { \exp_not:n {#2} }
- }
- \cs_set_protected:Npn \tl_gset:Nx #1#2
- {
- \_tl_check_exists:N #1
- \cs_gset_nopar:Npx #1 {#2}
- }
- \cs_set_protected:Npn \tl_set_eq:NN #1#2
- {
- \_tl_check_exists:N #1
- \_tl_check_exists:N #2
- \cs_set_eq:NN #1 #2
- }
- \cs_set_protected:Npn \tl_gset_eq:NN #1#2
- {
- \_tl_check_exists:N #1
- \_tl_check_exists:N #2
- \cs_gset_eq:NN #1 #2
- }
- \cs_set_protected:Npn \tl_put_right:Nn #1#2 {
- \_tl_check_exists:N #1
- \cs_set_nopar:Npx #1 { \exp_not:o #1 \exp_not:n {#2} }
- }
- \cs_set_protected:Npn \tl_put_right:NV #1#2 {
- \_tl_check_exists:N #1
- \cs_set_nopar:Npx #1 { \exp_not:o #1 \exp_not:V #2 }
- }
- \cs_set_protected:Npn \tl_put_right:Nv #1#2 {
- \_tl_check_exists:N #1
- \cs_set_nopar:Npx #1 { \exp_not:o #1 \exp_not:v {#2} }
- }
- \cs_set_protected:Npn \tl_put_right:No #1#2 {
- \_tl_check_exists:N #1
- \cs_set_nopar:Npx #1 { \exp_not:o #1 \exp_not:o {#2} }
- }
- \cs_set_protected:Npn \tl_put_right:Nx #1#2 {
- \_tl_check_exists:N #1
- \cs_set_nopar:Npx #1 { \exp_not:o #1 #2 }
- }
- \cs_set_protected:Npn \tl_gput_right:Nn #1#2 {
- \_tl_check_exists:N #1
- \cs_gset_nopar:Npx #1 { \exp_not:o #1 \exp_not:n {#2} }
- }
- \cs_set_protected:Npn \tl_gput_right:NV #1#2 {
- \_tl_check_exists:N #1
- \cs_gset_nopar:Npx #1 { \exp_not:o #1 \exp_not:V #2 }
- }
- \cs_set_protected:Npn \tl_gput_right:Nv #1#2 {
- \_tl_check_exists:N #1
- \cs_gset_nopar:Npx #1 { \exp_not:o #1 \exp_not:v {#2} }
- }
- \cs_set_protected:Npn \tl_gput_right:Nx #1#2 {
- \_tl_check_exists:N #1
- \cs_gset_nopar:Npx #1 { \exp_not:o #1 #2 }
- }
- \cs_set_protected:Npn \tl_put_left:Nn #1#2 {
- \_tl_check_exists:N #1
- \cs_set_nopar:Npx #1 { \exp_not:n {#2} \exp_not:o #1 }
- }
- \cs_set_protected:Npn \tl_put_left:NV #1#2 {
- \_tl_check_exists:N #1
- \cs_set_nopar:Npx #1 { \exp_not:V #2 \exp_not:o #1 }
- }
- \cs_set_protected:Npn \tl_put_left:Nv #1#2 {
- \_tl_check_exists:N #1
- \cs_set_nopar:Npx #1 { \exp_not:v {#2} \exp_not:o #1 }
- }
- \cs_set_protected:Npn \tl_put_left:No #1#2 {
- \_tl_check_exists:N #1
- \cs_set_nopar:Npx #1 { \exp_not:o {#2} \exp_not:o #1 }
- }
- \cs_set_protected:Npn \tl_put_left:Nx #1#2 {
- \_tl_check_exists:N #1
- \cs_set_nopar:Npx #1 { #2 \exp_not:o #1 }
- }
- \cs_set_protected:Npn \tl_gput_left:Nn #1#2 {
- \_tl_check_exists:N #1
- \cs_gset_nopar:Npx #1 { \exp_not:n {#2} \exp_not:o #1 }
- }
- \cs_set_protected:Npn \tl_gput_left:NV #1#2 {
- \_tl_check_exists:N #1
- \cs_gset_nopar:Npx #1 { \exp_not:V #2 \exp_not:o #1 }
- }
- \cs_set_protected:Npn \tl_gput_left:Nv #1#2 {
- \_tl_check_exists:N #1
- \cs_gset_nopar:Npx #1 { \exp_not:v {#2} \exp_not:o #1 }
- }
- \cs_set_protected:Npn \tl_gput_left:Nx #1#2 {
- \_tl_check_exists:N #1
- \cs_gset_nopar:Npx #1 { #2 \exp_not:o #1 }
- }
-\tex_fi:D
-%</package>
-% \end{macrocode}
-%\end{macro}
%
-% Show token usage:
-% \begin{macrocode}
-%<*showmemory>
-\showMemUsage
-%</showmemory>
-% \end{macrocode}
%
% \end{implementation}
% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/expl3/l3token.dtx b/Master/texmf-dist/source/latex/expl3/l3token.dtx
index 9482c3865a0..b214b84b771 100644
--- a/Master/texmf-dist/source/latex/expl3/l3token.dtx
+++ b/Master/texmf-dist/source/latex/expl3/l3token.dtx
@@ -35,7 +35,7 @@
\RequirePackage{l3names}
%</driver|package>
%\fi
-\GetIdInfo$Id: l3token.dtx 2151 2011-02-16 06:58:12Z will $
+\GetIdInfo$Id: l3token.dtx 2223 2011-04-09 12:57:14Z will $
{L3 Experimental token investigation and manipulation}
%\iffalse
%<*driver>
@@ -1877,11 +1877,6 @@
%</initex|package>
% \end{macrocode}
%
-% \begin{macrocode}
-%<*showmemory>
-\showMemUsage
-%</showmemory>
-% \end{macrocode}
%
% \end{implementation}
% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/expl3/l3toks.dtx b/Master/texmf-dist/source/latex/expl3/l3toks.dtx
index 6b8e47df71c..1937da4752f 100644
--- a/Master/texmf-dist/source/latex/expl3/l3toks.dtx
+++ b/Master/texmf-dist/source/latex/expl3/l3toks.dtx
@@ -36,7 +36,7 @@
\RequirePackage{l3names}
%</driver|package>
%\fi
-\GetIdInfo$Id: l3toks.dtx 2037 2010-09-20 21:22:45Z joseph $
+\GetIdInfo$Id: l3toks.dtx 2223 2011-04-09 12:57:14Z will $
{L3 Experimental Token Registers}
%\iffalse
%<*driver>
@@ -799,12 +799,6 @@
%</initex|package>
% \end{macrocode}
%
-% Show token usage:
-% \begin{macrocode}
-%<*showmemory>
-\showMemUsage
-%</showmemory>
-% \end{macrocode}
%
% \end{implementation}
% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/expl3/l3xref.dtx b/Master/texmf-dist/source/latex/expl3/l3xref.dtx
index 5c84cce4d55..00245b085bb 100644
--- a/Master/texmf-dist/source/latex/expl3/l3xref.dtx
+++ b/Master/texmf-dist/source/latex/expl3/l3xref.dtx
@@ -36,7 +36,7 @@
\RequirePackage{l3names}
%</driver|package|testfile>
%\fi
-\GetIdInfo$Id: l3xref.dtx 2151 2011-02-16 06:58:12Z will $
+\GetIdInfo$Id: l3xref.dtx 2223 2011-04-09 12:57:14Z will $
{L3 Experimental cross referencing}
%\iffalse
%<*testfile>
@@ -315,11 +315,6 @@
%</initex|package>
% \end{macrocode}
%
-% \begin{macrocode}
-%<*showmemory>
-\showMemUsage
-%</showmemory>
-% \end{macrocode}
%
% \section{\pkg{l3xref} test file}
%