diff options
author | Karl Berry <karl@freefriends.org> | 2018-06-15 21:10:33 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2018-06-15 21:10:33 +0000 |
commit | 59957bdeedffe4b1c7e2727afd9dcd4b60851a90 (patch) | |
tree | 6271bbef4d4656a157bb4b4b7363f0402ad2fcb0 /Master | |
parent | df818138a81e60aa4f59b5558202aa5217062165 (diff) |
l3kernel (15jun18)
git-svn-id: svn://tug.org/texlive/trunk@48022 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master')
72 files changed, 961 insertions, 135 deletions
diff --git a/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md b/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md index 4a6f5c6ef75..002fbfee61b 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md +++ b/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md @@ -7,6 +7,11 @@ this project uses date-based 'snapshot' version identifiers. ## [Unreleased] +## [2018-06-14] + +### Added +- Support for `e`-type argument using `\expanded` or macro emulation + ## [2018-06-01] ### Added @@ -105,8 +110,9 @@ this project uses date-based 'snapshot' version identifiers. - Step functions have been added for dim variables, e.g. `\dim_step_inline:nnnn` -[Unreleased]: https://github.com/latex3/latex3/compare/2018-05-13...HEAD -[2018-06-0`]: https://github.com/latex3/latex3/compare/2018-05-13...2018-06-01 +[Unreleased]: https://github.com/latex3/latex3/compare/2018-06-14...HEAD +[2018-06-01]: https://github.com/latex3/latex3/compare/2018-06-01...2018-06-14 +[2018-06-01]: https://github.com/latex3/latex3/compare/2018-05-13...2018-06-01 [2018-05-13]: https://github.com/latex3/latex3/compare/2018-05-12...2018-05-13 [2018-05-12]: https://github.com/latex3/latex3/compare/2018-04-30...2018-05-12 [2018-04-30]: https://github.com/latex3/latex3/compare/2018-03-05...2018-04-30 diff --git a/Master/texmf-dist/doc/latex/l3kernel/README.md b/Master/texmf-dist/doc/latex/l3kernel/README.md index 2db5b249aa1..91f8125d4cd 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/README.md +++ b/Master/texmf-dist/doc/latex/l3kernel/README.md @@ -1,7 +1,7 @@ LaTeX3 Programming Conventions ============================== -Release 2018-06-01 +Release 2018-06-14 Overview -------- diff --git a/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf b/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf Binary files differindex 2b8588bde6a..17c5518c8be 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf b/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf Binary files differindex 220190c68c4..3fc0de93a37 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/interface3.tex b/Master/texmf-dist/doc/latex/l3kernel/interface3.tex index 0ef20c22ee0..448805aabe7 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/interface3.tex +++ b/Master/texmf-dist/doc/latex/l3kernel/interface3.tex @@ -52,7 +52,7 @@ {latex-team@latex-project.org}% }% } -\date{Released 2018-06-01} +\date{Released 2018-06-14} \pagenumbering{roman} \maketitle diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf Binary files differindex 7c56645dd09..7758775d500 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf Binary files differindex 53dac567422..bdf47e1f3af 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex b/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex index 131e5a623c7..0e0d8ff54fa 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex +++ b/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex @@ -30,7 +30,7 @@ The released version of this bundle is available from CTAN. {latex-team@latex-project.org}% }% } -\date{Released 2018-06-01} +\date{Released 2018-06-14} \begin{document} diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf Binary files differindex f4c275db02f..819c02fe482 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex b/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex index 1eacdec0dc7..281575ff7b0 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex +++ b/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex @@ -30,7 +30,7 @@ The released version of this bundle is available from CTAN. {latex-team@latex-project.org}% }% } -\date{Released 2018-06-01} +\date{Released 2018-06-14} \newcommand{\TF}{\textit{(TF)}} diff --git a/Master/texmf-dist/doc/latex/l3kernel/source3.pdf b/Master/texmf-dist/doc/latex/l3kernel/source3.pdf Binary files differindex cf4abfbafe4..21661ecef0b 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/source3.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/source3.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/source3.tex b/Master/texmf-dist/doc/latex/l3kernel/source3.tex index db07c579b7e..308681f810d 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/source3.tex +++ b/Master/texmf-dist/doc/latex/l3kernel/source3.tex @@ -51,7 +51,7 @@ {latex-team@latex-project.org}% }% } -\date{Released 2018-06-01} +\date{Released 2018-06-14} \pagenumbering{roman} \maketitle diff --git a/Master/texmf-dist/source/latex/l3kernel/expl3.dtx b/Master/texmf-dist/source/latex/l3kernel/expl3.dtx index be64b2ab58b..72f276c7c6c 100644 --- a/Master/texmf-dist/source/latex/l3kernel/expl3.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/expl3.dtx @@ -21,7 +21,7 @@ % for those people who are interested. % %<*driver|generic|package> -\def\ExplFileDate{2018-06-01}% +\def\ExplFileDate{2018-06-14}% %</driver|generic|package> %<*driver> \documentclass[full]{l3doc} @@ -49,7 +49,7 @@ % }^^A % } % -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx b/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx index c1d284d51c0..a92680e7e71 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx @@ -41,7 +41,7 @@ % }^^A % } % -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx b/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx index ad726c8786d..c5581d46850 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx @@ -41,7 +41,7 @@ % }^^A % } % -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx b/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx index 5692468b9d2..0d69acb9600 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx @@ -138,7 +138,7 @@ % }^^A % } % -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3box.dtx b/Master/texmf-dist/source/latex/l3kernel/l3box.dtx index fcb5ea22eff..d9e6e44abe6 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3box.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3box.dtx @@ -41,7 +41,7 @@ % }^^A % } % -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx b/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx index 0ab572e458c..58c53afecc0 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx @@ -42,7 +42,7 @@ % }^^A % } % -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx b/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx index 779fcb52cb6..85f9dcc0f5a 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx b/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx index 1229eba8ec2..b43b944ae69 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx @@ -41,7 +41,7 @@ % }^^A % } % -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx b/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx index 1ff0f5d4624..0dea8a8f8ee 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx @@ -41,7 +41,7 @@ % }^^A % } % -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx b/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx index 6c7e7cab31d..bdfc64fb87d 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx @@ -41,7 +41,7 @@ % }^^A % } % -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx b/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx index 6880b082a90..d8346b81541 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx @@ -77,7 +77,7 @@ and all files in that bundle must be distributed together. % % \title{The \cls{l3doc} class} % \author{\Team} -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % \maketitle % \tableofcontents % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx b/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx index c313c5177a6..632d72902ea 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx @@ -61,7 +61,7 @@ % }^^A % } % -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx b/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx index b454235cb98..52987355f9f 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx @@ -41,7 +41,7 @@ % }^^A % } % -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % % \maketitle % @@ -481,23 +481,23 @@ %<*package> \ProvidesExplFile %<*dvipdfmx> - {l3dvidpfmx.def}{2018-06-01}{} + {l3dvidpfmx.def}{2018-06-14}{} {L3 Experimental driver: dvipdfmx} %</dvipdfmx> %<*dvips> - {l3dvips.def}{2018-06-01}{} + {l3dvips.def}{2018-06-14}{} {L3 Experimental driver: dvips} %</dvips> %<*dvisvgm> - {l3dvisvgm.def}{2018-06-01}{} + {l3dvisvgm.def}{2018-06-14}{} {L3 Experimental driver: dvisvgm} %</dvisvgm> %<*pdfmode> - {l3pdfmode.def}{2018-06-01}{} + {l3pdfmode.def}{2018-06-14}{} {L3 Experimental driver: PDF mode} %</pdfmode> %<*xdvipdfmx> - {l3xdvidpfmx.def}{2018-06-01}{} + {l3xdvidpfmx.def}{2018-06-14}{} {L3 Experimental driver: xdvipdfmx} %</xdvipdfmx> %</package> diff --git a/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx b/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx index d671fed7af8..0352ce35604 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx @@ -41,7 +41,7 @@ % }^^A % } % -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % % \maketitle % @@ -64,8 +64,8 @@ % when writing new functions or when applying a kernel function in a % situation that we haven't thought of before. % -% Internally preprocessing of arguments is done with functions from the -% |\exp_| module. They all look alike, an example would be +% Internally preprocessing of arguments is done with functions of the form +% \cs[no-index]{exp_\ldots{}}. They all look alike, an example would be % \cs{exp_args:NNo}. This function has three arguments, the first and the % second are a single tokens, while the third argument should be given % in braces. Applying \cs{exp_args:NNo} expands the content of third @@ -111,8 +111,8 @@ % as an |n|-type argument, namely a braced multiple-token argument: % |V|~extracts the value of a variable, |v|~extracts the value from % the name of a variable, |n|~uses the argument as it is, |o|~expands -% once, |f|~expands fully the front of the token list, |x|~expands fully all -% tokens at the price of being non-expandable. +% once, |f|~expands fully the front of the token list, |e| and +% |x|~expand fully all tokens (differences are explained later). % \item A few odd argument types remain: |T|~and |F|~for conditional % processing, otherwise identical to |n|-type arguments, % |p|~for the parameter text @@ -148,8 +148,8 @@ % generates the functions |\foo:NV| and |\foo:cV| in the same % way. The \cs{cs_generate_variant:Nn} function can only be applied if % the \meta{parent control sequence} is already defined. If the \meta{parent -% control sequence} is protected or if the \meta{variant} involves -% |x|~arguments, then the \meta{variant control sequence} is also +% control sequence} is protected or if the \meta{variant} involves any +% |x|~argument, then the \meta{variant control sequence} is also % protected. The \meta{variant} is created globally, as is any % \cs[no-index]{exp_args:N\meta{variant}} function needed to carry out the % expansion. @@ -158,7 +158,7 @@ % allowed changes are % \begin{itemize} % \item |c|~variant of an |N|~parent; -% \item |o|, |V|, |v|, |f|, or~|x| variant of an |n|~parent; +% \item |o|, |V|, |v|, |f|, |e|, or~|x| variant of an |n|~parent; % \item |N|, |n|, |T|, |F|, or |p| argument unchanged. % \end{itemize} % This means the \meta{parent} of a \meta{variant} form is always @@ -167,7 +167,7 @@ % \cs{tl_count:N}. % % For backward compatibility it is currently possible to make |n|, -% |o|, |V|, |v|, |f|, or |x|-type variants of an |N|-type argument or +% |o|, |V|, |v|, |f|, |e|, or |x|-type variants of an |N|-type argument or % |N| or |c|-type variants of an |n|-type argument. Both are % deprecated. The first because passing more than one token to an % |N|-type argument will typically break the parent function's code. @@ -180,36 +180,6 @@ % % \section{Introducing the variants} % -% It is usually best to follow the following guidelines when defining -% new functions that are supposed to come with variant forms. -% \begin{itemize} -% \item -% Arguments that need full expansion (\emph{i.e.}, are denoted -% with |x|) should be avoided if possible as they can not be -% processed expandably, \emph{i.e.}, functions of this type -% cannot work correctly in arguments that are themselves subject to |x| -% expansion. -% \end{itemize} -% When speed is essential (for functions that do very little work and -% are used numerous times in a document) the following applies because -% internal functions for argument expansion come in two flavours, some -% faster than others. -% \begin{itemize} -% \item -% Arguments that might need expansion should come first in the list of -% arguments. -% \item -% Arguments that should consist of single tokens |N|, |c|, |V|, or -% |v| should come first among these. -% \item -% Arguments that appear after the first multi-token argument |n|, |f| -% or |o| require slightly slower special processing to be expanded. -% Therefore it is best to use the optimized functions, -% namely those that contain only |N|, |c|, |V|, and |v|, and, in the -% last position, |o|, |f|, with possible trailing |N| or |n| or |T| -% or |F|, which are not expanded. -% \end{itemize} -% % The |V| type returns the value of a register, which can be one of % |tl|, |clist|, |int|, |skip|, |dim|, |muskip|, or built-in \TeX{} % registers. The |v| type is the same except it first creates a @@ -223,6 +193,22 @@ % specific expansion steps are needed, such as when using delimited % arguments, should the lower-level functions with |o| specifiers be employed. % +% The |e| type expands all tokens fully, starting from the first. More +% precisely the expansion is identical to that of \TeX{}'s \tn{message} +% (in particular |#| needs not be doubled). It was added in May 2018. +% In recent enough engines (starting around 2019) it relies on the +% primitive \tn{expanded} hence is fast. In older engines it is very +% much slower. As a result it should only be used in performance +% critical code if typical users will have a recent installation of the +% \TeX{} ecosystem. +% +% The |x| type expands all tokens fully, starting from the first. In +% contrast to |e|, all macro parameter characters |#| must be doubled, +% and omitting this leads to low-level errors. In addition this type of +% expansion is not expandable, namely functions that have |x| in their +% signature do not themselves expand when appearing inside |x| or |e| +% expansion. +% % The |f| type is so special that it deserves an example. It is % typically used in contexts where only expandable commands are allowed. % Then |x|-expansion cannot be used, and |f|-expansion provides an @@ -251,12 +237,13 @@ % \begin{quote} % |\example:n { 3 , \int_eval:n { 3 + 4 } }| % \end{quote} -% while using |\example:x| instead results in +% while using |\example:x| or |\example:e| instead results in % \begin{quote} % |\example:n { 3 , 7 }| % \end{quote} -% at the cost of being protected. -% If you use this type of expansion in conditional processing then +% at the cost of being protected (for |x| type) or very much slower in +% old engines (for |e| type). +% If you use |f| type expansion in conditional processing then % you should stick to using |TF| type functions only as the expansion % does not finish any |\if... \fi:| itself! % @@ -280,6 +267,50 @@ % leave |\g_tmpb_tl| unchanged: |{| is the first token in the % argument and is non-expandable. % +% It is usually best to keep the following in mind when using variant +% forms. +% \begin{itemize} +% \item +% Variants with |x|-type arguments (that are fully expanded before +% being passed to the |n|-type base function) are never expandable +% even when the base function is. Such variants cannot work +% correctly in arguments that are themselves subject to expansion. +% Consider using |f| or |e| expansion. +% \item +% In contrast, |e|~expansion (full expansion, almost like~|x| except +% for the treatment of~|#|) does not prevent variants from being +% expandable (if the base function is). The drawback is that +% |e|~expansion is very much slower in old engines (before 2019). +% Consider using |f|~expansion if that type of expansion is +% sufficient to perform the required expansion, or |x|~expansion if +% the variant will not itself need to be expandable. +% \item +% Finally |f|~expansion only expands the front of the token list, +% stopping at the first non-expandable token. This may fail to +% fully expand the argument. +% \end{itemize} +% +% When speed is essential (for functions that do very little work and +% whose variants are used numerous times in a document) the following +% considerations apply because internal functions for argument expansion +% come in two flavours, some faster than others. +% \begin{itemize} +% \item +% Arguments that might need expansion should come first in the list +% of arguments. +% \item +% Arguments that should consist of single tokens |N|, |c|, |V|, or +% |v| should come first among these. +% \item +% Arguments that appear after the first multi-token argument |n|, +% |f|, |e|, or |o| require slightly slower special processing to be +% expanded. Therefore it is best to use the optimized functions, +% namely those that contain only |N|, |c|, |V|, and |v|, and, in the +% last position, |o|, |f|, |e|, with possible trailing |N| or |n| or +% |T| or |F|, which are not expanded. Any |x|-type argument causes +% slightly slower processing. +% \end{itemize} +% % \section{Manipulating the first argument} % % These functions are described in detail: expansion of multiple tokens follows @@ -350,6 +381,25 @@ % \end{texnote} % \end{function} % +% \begin{function}[EXP, added = 2018-05-15]{\exp_args:Ne} +% \begin{syntax} +% \cs{exp_args:Ne} \meta{function} \Arg{tokens} +% \end{syntax} +% This function absorbs two arguments (the \meta{function} name and +% the \meta{tokens}) and exhaustively expands the \meta{tokens}. +% The result is inserted in braces into the input stream +% \emph{after} reinsertion of the \meta{function}. +% Thus the \meta{function} may take more +% than one argument: all others are left unchanged. +% \begin{texnote} +% This relies on the \tn{expanded} primitive when available (in +% \LuaTeX{} and starting around 2019 in other engines). Otherwise +% it uses some fall-back code that is very much slower. As a result +% it should only be used in performance-critical code if typical +% users have a recent installation of the \TeX{} ecosystem. +% \end{texnote} +% \end{function} +% % \begin{function}[EXP]{\exp_args:Nf} % \begin{syntax} % \cs{exp_args:Nf} \meta{function} \Arg{tokens} @@ -377,12 +427,13 @@ % % \section{Manipulating two arguments} % -% \begin{function}[EXP] +% \begin{function}[EXP, updated = 2018-05-15] % { % \exp_args:NNc, % \exp_args:NNo, % \exp_args:NNV, % \exp_args:NNv, +% \exp_args:NNe, % \exp_args:NNf, % \exp_args:Ncc, % \exp_args:Nco, @@ -400,12 +451,13 @@ % by the expansion of the second and third arguments. % \end{function} % -% \begin{function}[EXP, updated = 2012-01-14] +% \begin{function}[EXP, updated = 2018-05-15] % { % \exp_args:Nnc, % \exp_args:Nno, % \exp_args:NnV, % \exp_args:Nnv, +% \exp_args:Nne, % \exp_args:Nnf, % \exp_args:Noc, % \exp_args:Noo, @@ -514,11 +566,12 @@ % % \section{Unbraced expansion} % -% \begin{function}[EXP, updated = 2012-02-12] +% \begin{function}[EXP, updated = 2018-05-15] % { % \exp_last_unbraced:No, % \exp_last_unbraced:NV, % \exp_last_unbraced:Nv, +% \exp_last_unbraced:Ne, % \exp_last_unbraced:Nf, % \exp_last_unbraced:NNo, % \exp_last_unbraced:NNV, @@ -605,7 +658,7 @@ % \end{syntax} % Prevents expansion of the \meta{token} in a context where it would % otherwise be expanded, for example an |x|-type argument or the first -% token in an |o| or |f| argument. +% token in an |o| or |e| or |f| argument. % \begin{texnote} % This is the \TeX{} \tn{noexpand} primitive. It only prevents % expansion. At the beginning of an |f|-type argument, a space @@ -638,7 +691,7 @@ % \begin{syntax} % \cs{exp_not:n} \Arg{tokens} % \end{syntax} -% Prevents expansion of the \meta{tokens} in an |x|-type argument. In +% Prevents expansion of the \meta{tokens} in an |e| or |x|-type argument. In % all other cases the \meta{tokens} continue to be expanded, for % example in the input stream or in other types of arguments such as % \texttt{c}, \texttt{f}, \texttt{v}. The argument of \cs{exp_not:n} @@ -647,7 +700,9 @@ % This is the \eTeX{} \tn{unexpanded} primitive. In an % |x|-expanding definition (\cs{cs_new:Npx}), \cs{exp_not:n}~|{#1}| % is equivalent to |##1| rather than to~|#1|, namely it inserts the -% two characters |#| and~|1|. +% two characters |#| and~|1|. In an |e|-type argument +% \cs{exp_not:n}~|{#}| is equivalent to |#|, namely it inserts the +% character~|#|. % \end{texnote} % \end{function} % @@ -685,6 +740,16 @@ % \end{texnote} % \end{function} % +% \begin{function}[EXP]{\exp_not:e} +% \begin{syntax} +% \cs{exp_not:e} \Arg{tokens} +% \end{syntax} +% Expands \meta{tokens} exhaustively, then protects the result of the +% expansion (including any tokens which were not expanded) from +% further expansion in |e| or |x|-type arguments using \cs{exp_not:n}. +% This is very rarely useful but is provided for consistency. +% \end{function} +% % \begin{function}[EXP]{\exp_not:f} % \begin{syntax} % \cs{exp_not:f} \Arg{tokens} @@ -841,7 +906,7 @@ % % \section{Internal functions} % -% \begin{function}{\::n, \::N, \::p, \::c, \::o, \::f, \::x, \::v, \::V, \:::} +% \begin{function}{\::n, \::N, \::p, \::c, \::o, \::e, \::f, \::x, \::v, \::V, \:::} % \begin{syntax} % |\cs_new:Npn \exp_args:Ncof { \::c \::o \::f \::: }| % \end{syntax} @@ -851,7 +916,7 @@ % \end{function} % % \begin{function} -% {\::o_unbraced, \::f_unbraced, \::x_unbraced, \::v_unbraced, \::V_unbraced} +% {\::o_unbraced, \::e_unbraced, \::f_unbraced, \::x_unbraced, \::v_unbraced, \::V_unbraced} % \begin{syntax} % |\cs_new:Npn \exp_last_unbraced:Nno { \::n \::o_unbraced \::: }| % \end{syntax} @@ -986,6 +1051,22 @@ % \end{macrocode} % \end{macro} % +% \begin{macro}[EXP]{\::e} +% With the \tn{expanded} primitive available, just expand. Otherwise +% defer to \cs{exp_args:Ne} implemented later. +% \begin{macrocode} +\cs_if_exist:NTF \tex_expanded:D + { + \cs_new:Npn \::e #1 \::: #2#3 + { \tex_expanded:D { \exp_not:n { #1 \::: } { \exp_not:n {#2} {#3} } } } + } + { + \cs_new:Npn \::e #1 \::: #2#3 + { \exp_args:Ne \@@_arg_next:nnn {#3} {#1} {#2} } + } +% \end{macrocode} +% \end{macro} +% % \begin{macro}[EXP]{\::f} % \begin{macro}{\exp_stop_f:} % This function is used to expand a token list until the first @@ -1169,6 +1250,25 @@ % \end{macro} % \end{macro} % +% \begin{macro}[EXP]{\exp_args:Ne} +% When the \tn{expanded} primitive is available, use it. Otherwise +% use \cs{@@_e:nn}, defined later, to fully expand tokens. +% \begin{macrocode} +\cs_if_exist:NTF \tex_expanded:D + { + \cs_new:Npn \exp_args:Ne #1#2 + { \exp_after:wN #1 \tex_expanded:D { {#2} } } + } + { + \cs_new:Npn \exp_args:Ne #1#2 + { + \exp_after:wN #1 \exp_after:wN + { \exp:w \@@_e:nn {#2} { } } + } + } +% \end{macrocode} +% \end{macro} +% % \begin{macro}[EXP]{\exp_args:Nf, \exp_args:NV, \exp_args:Nv} % \begin{macrocode} \cs_new:Npn \exp_args:Nf #1#2 @@ -1188,7 +1288,7 @@ % % \begin{macro}[EXP] % { -% \exp_args:NNV, \exp_args:NNv, \exp_args:NNf, +% \exp_args:NNV, \exp_args:NNv, \exp_args:NNe, \exp_args:NNf, % \exp_args:Nco, \exp_args:NcV, \exp_args:Ncv, \exp_args:Ncf, % \exp_args:NVV, % } @@ -1209,6 +1309,16 @@ \exp_after:wN #2 \exp_after:wN { \exp:w \@@_eval_register:c {#3} } } +\cs_if_exist:NTF \tex_expanded:D + { + \cs_new:Npn \exp_args:NNe #1#2#3 + { + \exp_after:wN #1 + \exp_after:wN #2 + \tex_expanded:D { {#3} } + } + } + { \cs_new:Npn \exp_args:NNe { \::N \::e \::: } } \cs_new:Npn \exp_args:NNf #1#2#3 { \exp_after:wN #1 @@ -1302,7 +1412,7 @@ % % \begin{macro}[EXP] % { -% \exp_args:Nnc, \exp_args:Nno, \exp_args:NnV, \exp_args:Nnv, \exp_args:Nnf, +% \exp_args:Nnc, \exp_args:Nno, \exp_args:NnV, \exp_args:Nnv, \exp_args:Nne, \exp_args:Nnf, % \exp_args:Noc, \exp_args:Noo, \exp_args:Nof, % \exp_args:NVo, \exp_args:Nfo, \exp_args:Nff, % } @@ -1318,6 +1428,7 @@ \cs_new:Npn \exp_args:Nno { \::n \::o \::: } \cs_new:Npn \exp_args:NnV { \::n \::V \::: } \cs_new:Npn \exp_args:Nnv { \::n \::v \::: } +\cs_new:Npn \exp_args:Nne { \::n \::e \::: } \cs_new:Npn \exp_args:Nnf { \::n \::f \::: } \cs_new:Npn \exp_args:Noc { \::o \::c \::: } \cs_new:Npn \exp_args:Noo { \::o \::o \::: } @@ -1384,6 +1495,7 @@ % \begin{macro}[EXP]{\::o_unbraced} % \begin{macro}[EXP]{\::V_unbraced} % \begin{macro}[EXP]{\::v_unbraced} +% \begin{macro}[EXP]{\::e_unbraced} % \begin{macro}[EXP]{\::f_unbraced} % \begin{macro}[EXP]{\::x_unbraced} % There are a few places where the last argument needs to be available @@ -1402,6 +1514,15 @@ \exp_after:wN \@@_arg_last_unbraced:nn \exp_after:wN { \exp:w \@@_eval_register:c {#2} } {#1} } +\cs_if_exist:NTF \tex_expanded:D + { + \cs_new:Npn \::e_unbraced \::: #1#2 + { \tex_expanded:D { \exp_not:n {#1} #2 } } + } + { + \cs_new:Npn \::e_unbraced \::: #1#2 + { \exp:w \@@_e:nn {#2} {#1} } + } \cs_new:Npn \::f_unbraced \::: #1#2 { \exp_after:wN \@@_arg_last_unbraced:nn @@ -1419,6 +1540,7 @@ % \end{macro} % \end{macro} % \end{macro} +% \end{macro} % % \begin{macro}[EXP] % { @@ -1450,6 +1572,12 @@ { \exp_after:wN #1 \exp:w \@@_eval_register:N #2 } \cs_new:Npn \exp_last_unbraced:Nv #1#2 { \exp_after:wN #1 \exp:w \@@_eval_register:c {#2} } +\cs_if_exist:NTF \tex_expanded:D + { + \cs_new:Npn \exp_last_unbraced:Ne #1#2 + { \exp_after:wN #1 \tex_expanded:D {#2} } + } + { \cs_new:Npn \exp_last_unbraced:Ne { \::e_unbraced \::: } } \cs_new:Npn \exp_last_unbraced:Nf #1#2 { \exp_after:wN #1 \exp:w \exp_end_continue_f:w #2 } \cs_new:Npn \exp_last_unbraced:NNo #1#2#3 @@ -1539,16 +1667,26 @@ % % \begin{macro}[EXP]{\exp_not:c} % \begin{macro}[EXP]{\exp_not:o} +% \begin{macro}[EXP]{\exp_not:e} % \begin{macro}[EXP]{\exp_not:f} % \begin{macro}[EXP]{\exp_not:V} % \begin{macro}[EXP]{\exp_not:v} % All these except \cs{exp_not:c} call the kernel-internal -% \cs{__kernel_exp_not:w} namely \tn{etex_unexpanded:D}. +% \cs{__kernel_exp_not:w} namely \tn{tex_unexpanded:D}. % \begin{macrocode} \cs_new:Npn \exp_not:c #1 { \exp_after:wN \exp_not:N \cs:w #1 \cs_end: } \cs_new:Npn \exp_not:o #1 { \__kernel_exp_not:w \exp_after:wN {#1} } +\cs_if_exist:NTF \tex_expanded:D + { + \cs_new:Npn \exp_not:e #1 + { \__kernel_exp_not:w \tex_expanded:D { {#1} } } + } + { + \cs_new:Npn \exp_not:e + { \__kernel_exp_not:w \exp_args:Ne \prg_do_nothing: } + } \cs_new:Npn \exp_not:f #1 - { \tex_unexpanded:D \exp_after:wN { \exp:w \exp_end_continue_f:w #1 } } + { \__kernel_exp_not:w \exp_after:wN { \exp:w \exp_end_continue_f:w #1 } } \cs_new:Npn \exp_not:V #1 { \__kernel_exp_not:w \exp_after:wN @@ -1565,6 +1703,7 @@ % \end{macro} % \end{macro} % \end{macro} +% \end{macro} % % \subsection{Controlled expansion} % @@ -1632,6 +1771,385 @@ % \end{macro} % % +% \subsection{Emulating \texttt{e}-type expansion} +% +% When the \tn{expanded} primitive is available it is used to implement +% \texttt{e}-type expansion; otherwise we emulate it. +% +% \begin{macrocode} +\cs_if_exist:NF \tex_expanded:D + { +% \end{macrocode} +% +% \begin{macro}[EXP]{\@@_e:nn} +% Repeatedly expand tokens, keeping track of fully-expanded tokens in +% the second argument to \cs{@@_e:nn}; this function eventually +% calls \cs{@@_e_end:nn} to leave \cs{exp_end:} in the input +% stream, followed by the result of the expansion. There are many +% special cases: spaces, brace groups, \tn{noexpand}, \tn{unexpanded}, +% \tn{the}, \tn{primitive}. +% \begin{macrocode} + \cs_new:Npn \@@_e:nn #1 + { + \if_false: { \fi: + \tl_if_head_is_N_type:nTF {#1} + { \@@_e:N } + { + \tl_if_head_is_group:nTF {#1} + { \@@_e_group:n } + { + \tl_if_empty:nTF {#1} + { \exp_after:wN \@@_e_end:nn } + { \exp_after:wN \@@_e_space:nn } + \exp_after:wN { \if_false: } \fi: + } + } + #1 + } + } + \cs_new:Npn \@@_e_end:nn #1#2 { \exp_end: #2 } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[EXP]{\@@_e_space:nn} +% For an explicit space character, remove it by \texttt{f}-expansion +% and put it in the (future) output. +% \begin{macrocode} + \cs_new:Npn \@@_e_space:nn #1#2 + { \exp_args:Nf \@@_e:nn {#1} { #2 ~ } } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[EXP]{\@@_e_group:n, \@@_e_put:nn, \@@_e_put:nnn} +% For a group, expand its contents, wrap it in two pairs of braces, +% and call \cs{@@_e_put:nn}. This function places the first item (the +% double-brace wrapped result) into the output. Importantly, +% \cs{tl_head:n} works even if the input contains quarks. +% \begin{macrocode} + \cs_new:Npn \@@_e_group:n #1 + { + \exp_after:wN \@@_e_put:nn + \exp_after:wN { \exp_after:wN { \exp_after:wN { + \exp:w \if_false: } \fi: \@@_e:nn {#1} { } } } + } + \cs_new:Npn \@@_e_put:nn #1 + { + \exp_args:NNo \exp_args:No \@@_e_put:nnn + { \tl_head:n {#1} } {#1} + } + \cs_new:Npn \@@_e_put:nnn #1#2#3 + { \exp_args:No \@@_e:nn { \use_none:n #2 } { #3 #1 } } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[EXP]{\@@_e:N} +% For an \texttt{N}-type token, call \cs{@@_e:Nnn} with arguments the +% \meta{first token}, the remaining tokens to expand and what's +% already been expanded. If the \meta{first token} is non-expandable, +% including \tn{protected} (\tn{long} or not) macros, it is put in the +% result by \cs{@@_e_protected:Nnn}. The four special primitives +% \tn{unexpanded}, \tn{noexpand}, \tn{the}, \tn{primitive} are +% detected; otherwise the token is expanded by +% \cs{@@_e_expandable:Nnn}. +% \begin{macrocode} + \cs_new:Npn \@@_e:N #1 + { + \exp_after:wN \@@_e:Nnn + \exp_after:wN #1 + \exp_after:wN { \if_false: } \fi: + } + \cs_new:Npn \@@_e:Nnn #1 + { + \if_case:w + \exp_after:wN \if_meaning:w \exp_not:N #1 #1 1 ~ \fi: + \token_if_protected_macro:NT #1 { 1 ~ } + \token_if_protected_long_macro:NT #1 { 1 ~ } + \if_meaning:w \exp_not:n #1 2 ~ \fi: + \if_meaning:w \exp_not:N #1 3 ~ \fi: + \if_meaning:w \tex_the:D #1 4 ~ \fi: + \if_meaning:w \tex_primitive:D #1 5 ~ \fi: + 0 ~ + \exp_after:wN \@@_e_expandable:Nnn + \or: \exp_after:wN \@@_e_protected:Nnn + \or: \exp_after:wN \@@_e_unexpanded:Nnn + \or: \exp_after:wN \@@_e_noexpand:Nnn + \or: \exp_after:wN \@@_e_the:Nnn + \or: \exp_after:wN \@@_e_primitive:Nnn + \fi: + #1 + } + \cs_new:Npn \@@_e_protected:Nnn #1#2#3 + { \@@_e:nn {#2} { #3 #1 } } + \cs_new:Npn \@@_e_expandable:Nnn #1#2 + { \exp_args:No \@@_e:nn { #1 #2 } } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[EXP]{\@@_e_primitive:Nnn} +% Quite rare. Will be implemented later. +% \begin{macrocode} + \cs_new:Npn \@@_e_primitive:Nnn #1 + { + \__kernel_msg_expandable_error:nnn { kernel } { e-type } + { \primitive not~implemented } + \@@_e:nn + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[EXP]{\@@_e_noexpand:Nnn} +% The \tn{noexpand} primitive has no effect when followed by a token +% that is not \texttt{N}-type; otherwise \cs{@@_e_put:nn} can grab the +% next token and put it in the result unchanged. +% \begin{macrocode} + \cs_new:Npn \@@_e_noexpand:Nnn #1#2 + { + \tl_if_head_is_N_type:nTF {#2} + { \@@_e_put:nn } { \@@_e:nn } {#2} + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[EXP] +% { +% \@@_e_unexpanded:Nnn, \@@_e_unexpanded:nn, +% \@@_e_unexpanded:nN, \@@_e_unexpanded:N +% } +% The \tn{unexpanded} primitive expands and ignores any space, +% \cs{scan_stop:}, or token affected by \cs{exp_not:N}, then expects a +% brace group. Since we only support brace-balanced token lists it is +% impossible to support the case where the argument of \tn{unexpanded} +% starts with an implicit brace. Even though we want to expand and +% ignore spaces we cannot blindly \texttt{f}-expand because tokens +% affected by \cs{exp_not:N} should discarded without being expanded +% further. +% +% As usual distinguish four cases: brace group (the normal case, where +% we just put the item in the result), space (just \texttt{f}-expand +% to remove the space), empty (an error), or \texttt{N}-type +% \meta{token}. In the last case call \cs{@@_e_unexpanded:nN} +% triggered by an \texttt{f}-expansion. Having a non-expandable +% \meta{token} after \tn{unexpanded} is an error (we recover by +% passing |{}| to \tn{unexpanded}; this is different from \TeX{} +% because the error recovery of \tn{unexpanded} changes the balance of +% braces), unless that \meta{token} is \cs{scan_stop:} or a space +% (recall that we don't implement the case of an implicit begin-group +% token). An expandable \meta{token} is instead expanded, unless it +% is \tn{noexpand}. That primitive can be followed by an expandable +% \texttt{N}-type token, to be removed, by a non-expandable one, kept +% (and later causing an error), by a space, removed by +% \texttt{f}-expansion, or by a brace group or nothing (later causing +% an error). +% \begin{macrocode} + \cs_new:Npn \@@_e_unexpanded:Nnn #1 { \@@_e_unexpanded:nn } + \cs_new:Npn \@@_e_unexpanded:nn #1 + { + \tl_if_head_is_N_type:nTF {#1} + { + \exp_args:Nf \@@_e_unexpanded:nn + { \@@_e_unexpanded:nN {#1} #1 } + } + { + \tl_if_head_is_group:nTF {#1} + { \@@_e_put:nn } + { + \tl_if_empty:nTF {#1} + { + \__kernel_msg_expandable_error:nnn + { kernel } { e-type } + { \unexpanded missing~brace } + \@@_e_end:nn + } + { \exp_args:Nf \@@_e_unexpanded:nn } + } + {#1} + } + } + \cs_new:Npn \@@_e_unexpanded:nN #1#2 + { + \exp_after:wN \if_meaning:w \exp_not:N #2 #2 + \exp_after:wN \use_i:nn + \else: + \exp_after:wN \use_ii:nn + \fi: + { + \token_if_eq_catcode:NNTF #2 \c_space_token + { \exp_stop_f: } + { + \token_if_eq_meaning:NNTF #2 \scan_stop: + { \exp_stop_f: } + { + \__kernel_msg_expandable_error:nnn + { kernel } { e-type } + { \unexpanded missing~brace } + { } + } + } + } + { + \token_if_eq_meaning:NNTF #2 \exp_not:N + { + \exp_args:No \tl_if_head_is_N_type:nT { \use_none:n #1 } + { \@@_e_unexpanded:N } + } + { \exp_after:wN \exp_stop_f: #2 } + } + } + \cs_new:Npn \@@_e_unexpanded:N #1 + { + \exp_after:wN \if_meaning:w \exp_not:N #1 #1 \else: + \exp_after:wN \use_i:nn + \fi: + \exp_stop_f: #1 + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[EXP]{\@@_e_the:Nnn, \@@_e_the:N, \@@_e_the_toks_reg:N} +% Finally implement \tn{the}. Followed by anything other than an +% \texttt{N}-type \meta{token} this causes an error (we just let +% \TeX{} make one), otherwise we test the \meta{token}. If the +% \meta{token} is expandable, expand it. Otherwise it could be any +% kind of register, or things like \tn{numexpr}, so there is no way to +% deal with all cases. Thankfully, only \tn{toks} data needs to be +% protected from expansion since everything else gives a string of +% characters. If the \meta{token} is \tn{toks} we find a number and +% unpack using the |the_toks| functions. If it is a token register we +% unpack it in a brace group and call \cs{@@_e_put:nn} to move it to +% the result. Otherwise we unpack and continue expanding (useless but +% safe) since it is basically impossible to have a handle on where the +% result of \tn{the} ends. +% \begin{macrocode} + \cs_new:Npn \@@_e_the:Nnn #1#2 + { + \tl_if_head_is_N_type:nTF {#2} + { \if_false: { \fi: \@@_e_the:N #2 } } + { \exp_args:No \@@_e:nn { \tex_the:D #2 } } + } + \cs_new:Npn \@@_e_the:N #1 + { + \exp_after:wN \if_meaning:w \exp_not:N #1 #1 + \exp_after:wN \use_i:nn + \else: + \exp_after:wN \use_ii:nn + \fi: + { + \if_meaning:w \tex_toks:D #1 + \exp_after:wN \@@_e_the_toks:wnn \int_value:w + \exp_after:wN \@@_e_the_toks:n + \exp_after:wN { \int_value:w \if_false: } \fi: + \else: + \@@_e_if_toks_register:NTF #1 + { \exp_after:wN \@@_e_the_toks_reg:N } + { + \exp_after:wN \@@_e:nn \exp_after:wN { + \tex_the:D \if_false: } \fi: + } + \exp_after:wN #1 + \fi: + } + { + \exp_after:wN \@@_e_the:Nnn \exp_after:wN ? + \exp_after:wN { \exp:w \if_false: } \fi: + \exp_after:wN \exp_end: #1 + } + } + \cs_new:Npn \@@_e_the_toks_reg:N #1 + { + \exp_after:wN \@@_e_put:nn \exp_after:wN { + \exp_after:wN { + \tex_the:D \if_false: } \fi: #1 } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[EXP]{\@@_e_the_toks:wnn, \@@_e_the_toks:n, \@@_e_the_toks:N} +% The calling function has applied \cs{int_value:w} so we collect +% digits with \cs{@@_e_the_toks:n} (which gets the token list as an +% argument) and \cs{@@_e_the_toks:N} (which gets the first token in +% case it is \texttt{N}-type). The digits are themselves collected +% into an \cs{int_value:w} argument to \cs{@@_e_the_toks:wnn}. Then +% that function unpacks the \tn{toks}\meta{number} into the result. +% We include |?| because \cs{@@_e_put:nnn} removes one item from its +% second argument. Note that our approach is rather crude: in cases +% like |\the\toks12~34| the first \cs{int_value:w} removes the space +% and we will incorrectly unpack the |\the\toks1234|. +% \begin{macrocode} + \cs_new:Npn \@@_e_the_toks:wnn #1; #2 + { + \exp_args:No \@@_e_put:nnn + { \tex_the:D \tex_toks:D #1 } { ? #2 } + } + \cs_new:Npn \@@_e_the_toks:n #1 + { + \tl_if_head_is_N_type:nTF {#1} + { \exp_after:wN \@@_e_the_toks:N \if_false: { \fi: #1 } } + { ; {#1} } + } + \cs_new:Npn \@@_e_the_toks:N #1 + { + \if_int_compare:w 10 < 9 \token_to_str:N #1 \exp_stop_f: + \exp_after:wN \use_i:nn + \else: + \exp_after:wN \use_ii:nn + \fi: + { + #1 + \exp_after:wN \@@_e_the_toks:n + } + { \exp_after:wN ; } + \exp_after:wN { \if_false: } \fi: + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[EXP]{\@@_e_if_toks_register:NTF} +% We need to detect both \tn{toks} registers like \tn{toks@} (in +% \LaTeXe{}) and parameters such as \tn{everypar}, as the result of +% unpacking the register should not expand further. The list of +% parameters is finite so we just use a \cs{cs_if_exist:cTF} test to +% look up in a table. Registers are found by +% \cs{token_if_toks_register:NTF} by inspecting the meaning. We abuse +% \cs{cs_to_str:N}'s ability to remove a leading escape character +% whatever it is. +% \begin{macrocode} + \prg_new_conditional:Npnn \@@_e_if_toks_register:N #1 { TF } + { + \token_if_toks_register:NTF #1 { \prg_return_true: } + { + \cs_if_exist:cTF + { + @@_e_the_ + \exp_after:wN \cs_to_str:N + \token_to_meaning:N #1 + : + } { \prg_return_true: } { \prg_return_false: } + } + } + \cs_new_eq:NN \@@_e_the_XeTeXinterchartoks: ? + \cs_new_eq:NN \@@_e_the_errhelp: ? + \cs_new_eq:NN \@@_e_the_everycr: ? + \cs_new_eq:NN \@@_e_the_everydisplay: ? + \cs_new_eq:NN \@@_e_the_everyeof: ? + \cs_new_eq:NN \@@_e_the_everyhbox: ? + \cs_new_eq:NN \@@_e_the_everyjob: ? + \cs_new_eq:NN \@@_e_the_everymath: ? + \cs_new_eq:NN \@@_e_the_everypar: ? + \cs_new_eq:NN \@@_e_the_everyvbox: ? + \cs_new_eq:NN \@@_e_the_output: ? + \cs_new_eq:NN \@@_e_the_pdfpageattr: ? + \cs_new_eq:NN \@@_e_the_pdfpageresources: ? + \cs_new_eq:NN \@@_e_the_pdfpagesattr: ? + \cs_new_eq:NN \@@_e_the_pdfpkmode: ? +% \end{macrocode} +% \end{macro} +% +% We are done emulating \texttt{e}-type argument expansion when +% \tn{expanded} is unavailable. +% \begin{macrocode} + } +% \end{macrocode} +% % % \subsection{Defining function variants} % @@ -1915,10 +2433,12 @@ \if:w V #1 n \else: \if:w v #1 n \else: \if:w f #1 n \else: - \if:w x #1 n \else: - \if:w n #1 n \else: - \if:w N #1 N \else: - \scan_stop: + \if:w e #1 n \else: + \if:w x #1 n \else: + \if:w n #1 n \else: + \if:w N #1 N \else: + \scan_stop: + \fi: \fi: \fi: \fi: diff --git a/Master/texmf-dist/source/latex/l3kernel/l3file.dtx b/Master/texmf-dist/source/latex/l3kernel/l3file.dtx index 701b635e6db..724bdfeb3d0 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3file.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3file.dtx @@ -42,7 +42,7 @@ % }^^A % } % -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3final.dtx b/Master/texmf-dist/source/latex/l3kernel/l3final.dtx index cdeecd07dc7..b8dd58c15cc 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3final.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3final.dtx @@ -41,7 +41,7 @@ % }^^A % } % -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx b/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx index 3b7d5a780f8..0f41b396bba 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx @@ -41,7 +41,7 @@ % }^^A % } % -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx index ab541156bbb..84debbf16d5 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx @@ -38,7 +38,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % \maketitle % % \begin{documentation} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx index 1f114b7f9a7..639e1261738 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx @@ -41,7 +41,7 @@ % }^^A % } % -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx index 5311215b551..c57242901d4 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx @@ -38,7 +38,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx index e9dbb7040f2..2e4af3817a8 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx @@ -41,7 +41,7 @@ % }^^A % } % -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx index e354136cfff..b07da9d6fd5 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx @@ -38,7 +38,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx index cbcabca22a8..c6bb0534d92 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx @@ -38,7 +38,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx index 386c0d6122e..bd7bbf096c6 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx @@ -38,7 +38,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx index c508bed6c4d..aca31d7b51b 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx @@ -38,7 +38,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx index 78650efab3d..76472fd51bf 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx @@ -38,7 +38,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx index e505701fe10..7b49f5b1f88 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx @@ -41,7 +41,7 @@ % }^^A % } % -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx index 9adcbbd4701..ecf482fd402 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx @@ -38,7 +38,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % \maketitle % % \begin{documentation} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx index 9b7cdf8104a..df678477317 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx @@ -38,7 +38,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx index 89b267c364a..b4e2bfa1c00 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx @@ -47,7 +47,7 @@ % }^^A % } % -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx index d88c7681cd3..345cdbe8df0 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx @@ -42,7 +42,7 @@ % }^^A % } % -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3int.dtx b/Master/texmf-dist/source/latex/l3kernel/l3int.dtx index 05369608f1d..80bf9afd7f7 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3int.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3int.dtx @@ -41,7 +41,7 @@ % }^^A % } % -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx b/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx index e7ae1fa9046..75f4bb46740 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx @@ -42,7 +42,7 @@ % }^^A % } % -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx b/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx index 50a2bfbec7d..f1e28968315 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx @@ -41,7 +41,7 @@ % }^^A % } % -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx b/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx index 23e2131d8cd..f711bf5cbdb 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx @@ -41,7 +41,7 @@ % }^^A % } % -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx b/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx index 6bf84cbac57..87a535ce163 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx @@ -41,7 +41,7 @@ % }^^A % } % -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx b/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx index 6f33a637c14..1bfa2be1700 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx @@ -41,7 +41,7 @@ % }^^A % } % -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % % \maketitle % @@ -1902,6 +1902,11 @@ { Relation~'#1'~unknown:~use~=,~<,~>,~==,~!=,~<=,~>=. } \__kernel_msg_new:nnn { kernel } { zero-step } { Zero~step~size~for~step~function~#1. } +\cs_if_exist:NF \tex_expanded:D + { + \__kernel_msg_new:nnn { kernel } { e-type } + { #1 ~ in~e-type~argument } + } % \end{macrocode} % % Messages used by the \enquote{\texttt{show}} functions. diff --git a/Master/texmf-dist/source/latex/l3kernel/l3names.dtx b/Master/texmf-dist/source/latex/l3kernel/l3names.dtx index cf0e2ba8685..39ecba1694f 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3names.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3names.dtx @@ -41,7 +41,7 @@ % }^^A % } % -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3oldmodules.dtx b/Master/texmf-dist/source/latex/l3kernel/l3oldmodules.dtx index 00f50d83814..43815ad5e19 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3oldmodules.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3oldmodules.dtx @@ -42,7 +42,7 @@ % } % % -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx b/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx index 7e786a3b4a6..ed55b5052be 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx @@ -41,7 +41,7 @@ % }^^A % } % -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx b/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx index 78c0ddb1a06..f31874d7fe4 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx @@ -41,7 +41,7 @@ % }^^A % } % -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx b/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx index 626a83ea7f7..727c0e9974c 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx @@ -41,7 +41,7 @@ % }^^A % } % -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx b/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx index 7dfe735d06e..02ffddf2116 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx @@ -41,7 +41,7 @@ % }^^A % } % -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx b/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx index 33aab822992..1c9eac77cba 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx @@ -41,7 +41,7 @@ % }^^A % } % -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx b/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx index d4a3d41c5e9..8069b0dc57b 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx @@ -42,7 +42,7 @@ % }^^A % } % -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx b/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx index 117d1515d81..5cce081b462 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx @@ -41,7 +41,7 @@ % }^^A % } % -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3str.dtx b/Master/texmf-dist/source/latex/l3kernel/l3str.dtx index 566e626069e..56e01c67d4e 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3str.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3str.dtx @@ -41,7 +41,7 @@ % }^^A % } % -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx b/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx index 229edfd7bf6..35e352edb99 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx @@ -41,7 +41,7 @@ % }^^A % } % -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx b/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx index 8f69f9741c1..c365620f54b 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx @@ -42,7 +42,7 @@ % }^^A % } % -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx b/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx index 51b612e03e9..863cc92a668 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx @@ -41,7 +41,7 @@ % }^^A % } % -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3token.dtx b/Master/texmf-dist/source/latex/l3kernel/l3token.dtx index e3ed9a7080b..7fe05c7f502 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3token.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3token.dtx @@ -41,7 +41,7 @@ % }^^A % } % -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx b/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx index 354d0b6ab60..e45aaec2a1f 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx @@ -41,7 +41,7 @@ % }^^A % } % -% \date{Released 2018-06-01} +% \date{Released 2018-06-14} % % \maketitle % diff --git a/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex b/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex index 6cf7cdc6578..b07a1cf252b 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex +++ b/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex @@ -63,7 +63,7 @@ %% and all files in that bundle must be distributed together. %% %% File: expl3.dtx Copyright (C) 1990-2018 The LaTeX3 Project -\def\ExplFileDate{2018-06-01}% +\def\ExplFileDate{2018-06-14}% \begingroup \def\next{\endgroup}% \expandafter\ifx\csname PackageError\endcsname\relax @@ -3175,6 +3175,15 @@ { \exp_after:wN \__exp_arg_next:Nnn \cs:w #3 \cs_end: {#1} {#2} } \cs_new:Npn \::o #1 \::: #2#3 { \exp_after:wN \__exp_arg_next:nnn \exp_after:wN {#3} {#1} {#2} } +\cs_if_exist:NTF \tex_expanded:D + { + \cs_new:Npn \::e #1 \::: #2#3 + { \tex_expanded:D { \exp_not:n { #1 \::: } { \exp_not:n {#2} {#3} } } } + } + { + \cs_new:Npn \::e #1 \::: #2#3 + { \exp_args:Ne \__exp_arg_next:nnn {#3} {#1} {#2} } + } \cs_new:Npn \::f #1 \::: #2#3 { \exp_after:wN \__exp_arg_next:nnn @@ -3236,6 +3245,18 @@ { \exp_after:wN #1 \exp_after:wN #2 \exp_after:wN {#3} } \cs_new:Npn \exp_args:NNNo #1#2#3#4 { \exp_after:wN #1 \exp_after:wN#2 \exp_after:wN #3 \exp_after:wN {#4} } +\cs_if_exist:NTF \tex_expanded:D + { + \cs_new:Npn \exp_args:Ne #1#2 + { \exp_after:wN #1 \tex_expanded:D { {#2} } } + } + { + \cs_new:Npn \exp_args:Ne #1#2 + { + \exp_after:wN #1 \exp_after:wN + { \exp:w \__exp_e:nn {#2} { } } + } + } \cs_new:Npn \exp_args:Nf #1#2 { \exp_after:wN #1 \exp_after:wN { \exp:w \exp_end_continue_f:w #2 } } \cs_new:Npn \exp_args:Nv #1#2 @@ -3260,6 +3281,16 @@ \exp_after:wN #2 \exp_after:wN { \exp:w \__exp_eval_register:c {#3} } } +\cs_if_exist:NTF \tex_expanded:D + { + \cs_new:Npn \exp_args:NNe #1#2#3 + { + \exp_after:wN #1 + \exp_after:wN #2 + \tex_expanded:D { {#3} } + } + } + { \cs_new:Npn \exp_args:NNe { \::N \::e \::: } } \cs_new:Npn \exp_args:NNf #1#2#3 { \exp_after:wN #1 @@ -3330,6 +3361,7 @@ \cs_new:Npn \exp_args:Nno { \::n \::o \::: } \cs_new:Npn \exp_args:NnV { \::n \::V \::: } \cs_new:Npn \exp_args:Nnv { \::n \::v \::: } +\cs_new:Npn \exp_args:Nne { \::n \::e \::: } \cs_new:Npn \exp_args:Nnf { \::n \::f \::: } \cs_new:Npn \exp_args:Noc { \::o \::c \::: } \cs_new:Npn \exp_args:Noo { \::o \::o \::: } @@ -3380,6 +3412,15 @@ \exp_after:wN \__exp_arg_last_unbraced:nn \exp_after:wN { \exp:w \__exp_eval_register:c {#2} } {#1} } +\cs_if_exist:NTF \tex_expanded:D + { + \cs_new:Npn \::e_unbraced \::: #1#2 + { \tex_expanded:D { \exp_not:n {#1} #2 } } + } + { + \cs_new:Npn \::e_unbraced \::: #1#2 + { \exp:w \__exp_e:nn {#2} {#1} } + } \cs_new:Npn \::f_unbraced \::: #1#2 { \exp_after:wN \__exp_arg_last_unbraced:nn @@ -3395,6 +3436,12 @@ { \exp_after:wN #1 \exp:w \__exp_eval_register:N #2 } \cs_new:Npn \exp_last_unbraced:Nv #1#2 { \exp_after:wN #1 \exp:w \__exp_eval_register:c {#2} } +\cs_if_exist:NTF \tex_expanded:D + { + \cs_new:Npn \exp_last_unbraced:Ne #1#2 + { \exp_after:wN #1 \tex_expanded:D {#2} } + } + { \cs_new:Npn \exp_last_unbraced:Ne { \::e_unbraced \::: } } \cs_new:Npn \exp_last_unbraced:Nf #1#2 { \exp_after:wN #1 \exp:w \exp_end_continue_f:w #2 } \cs_new:Npn \exp_last_unbraced:NNo #1#2#3 @@ -3457,8 +3504,17 @@ \cs_new_eq:NN \__kernel_exp_not:w \tex_unexpanded:D \cs_new:Npn \exp_not:c #1 { \exp_after:wN \exp_not:N \cs:w #1 \cs_end: } \cs_new:Npn \exp_not:o #1 { \__kernel_exp_not:w \exp_after:wN {#1} } +\cs_if_exist:NTF \tex_expanded:D + { + \cs_new:Npn \exp_not:e #1 + { \__kernel_exp_not:w \tex_expanded:D { {#1} } } + } + { + \cs_new:Npn \exp_not:e + { \__kernel_exp_not:w \exp_args:Ne \prg_do_nothing: } + } \cs_new:Npn \exp_not:f #1 - { \tex_unexpanded:D \exp_after:wN { \exp:w \exp_end_continue_f:w #1 } } + { \__kernel_exp_not:w \exp_after:wN { \exp:w \exp_end_continue_f:w #1 } } \cs_new:Npn \exp_not:V #1 { \__kernel_exp_not:w \exp_after:wN @@ -3479,6 +3535,238 @@ \fi: \cs_new:Npn \exp_end_continue_f:nw #1 { `^^@ #1 } \group_end: +\cs_if_exist:NF \tex_expanded:D + { + \cs_new:Npn \__exp_e:nn #1 + { + \if_false: { \fi: + \tl_if_head_is_N_type:nTF {#1} + { \__exp_e:N } + { + \tl_if_head_is_group:nTF {#1} + { \__exp_e_group:n } + { + \tl_if_empty:nTF {#1} + { \exp_after:wN \__exp_e_end:nn } + { \exp_after:wN \__exp_e_space:nn } + \exp_after:wN { \if_false: } \fi: + } + } + #1 + } + } + \cs_new:Npn \__exp_e_end:nn #1#2 { \exp_end: #2 } + \cs_new:Npn \__exp_e_space:nn #1#2 + { \exp_args:Nf \__exp_e:nn {#1} { #2 ~ } } + \cs_new:Npn \__exp_e_group:n #1 + { + \exp_after:wN \__exp_e_put:nn + \exp_after:wN { \exp_after:wN { \exp_after:wN { + \exp:w \if_false: } \fi: \__exp_e:nn {#1} { } } } + } + \cs_new:Npn \__exp_e_put:nn #1 + { + \exp_args:NNo \exp_args:No \__exp_e_put:nnn + { \tl_head:n {#1} } {#1} + } + \cs_new:Npn \__exp_e_put:nnn #1#2#3 + { \exp_args:No \__exp_e:nn { \use_none:n #2 } { #3 #1 } } + \cs_new:Npn \__exp_e:N #1 + { + \exp_after:wN \__exp_e:Nnn + \exp_after:wN #1 + \exp_after:wN { \if_false: } \fi: + } + \cs_new:Npn \__exp_e:Nnn #1 + { + \if_case:w + \exp_after:wN \if_meaning:w \exp_not:N #1 #1 1 ~ \fi: + \token_if_protected_macro:NT #1 { 1 ~ } + \token_if_protected_long_macro:NT #1 { 1 ~ } + \if_meaning:w \exp_not:n #1 2 ~ \fi: + \if_meaning:w \exp_not:N #1 3 ~ \fi: + \if_meaning:w \tex_the:D #1 4 ~ \fi: + \if_meaning:w \tex_primitive:D #1 5 ~ \fi: + 0 ~ + \exp_after:wN \__exp_e_expandable:Nnn + \or: \exp_after:wN \__exp_e_protected:Nnn + \or: \exp_after:wN \__exp_e_unexpanded:Nnn + \or: \exp_after:wN \__exp_e_noexpand:Nnn + \or: \exp_after:wN \__exp_e_the:Nnn + \or: \exp_after:wN \__exp_e_primitive:Nnn + \fi: + #1 + } + \cs_new:Npn \__exp_e_protected:Nnn #1#2#3 + { \__exp_e:nn {#2} { #3 #1 } } + \cs_new:Npn \__exp_e_expandable:Nnn #1#2 + { \exp_args:No \__exp_e:nn { #1 #2 } } + \cs_new:Npn \__exp_e_primitive:Nnn #1 + { + \__kernel_msg_expandable_error:nnn { kernel } { e-type } + { \primitive not~implemented } + \__exp_e:nn + } + \cs_new:Npn \__exp_e_noexpand:Nnn #1#2 + { + \tl_if_head_is_N_type:nTF {#2} + { \__exp_e_put:nn } { \__exp_e:nn } {#2} + } + \cs_new:Npn \__exp_e_unexpanded:Nnn #1 { \__exp_e_unexpanded:nn } + \cs_new:Npn \__exp_e_unexpanded:nn #1 + { + \tl_if_head_is_N_type:nTF {#1} + { + \exp_args:Nf \__exp_e_unexpanded:nn + { \__exp_e_unexpanded:nN {#1} #1 } + } + { + \tl_if_head_is_group:nTF {#1} + { \__exp_e_put:nn } + { + \tl_if_empty:nTF {#1} + { + \__kernel_msg_expandable_error:nnn + { kernel } { e-type } + { \unexpanded missing~brace } + \__exp_e_end:nn + } + { \exp_args:Nf \__exp_e_unexpanded:nn } + } + {#1} + } + } + \cs_new:Npn \__exp_e_unexpanded:nN #1#2 + { + \exp_after:wN \if_meaning:w \exp_not:N #2 #2 + \exp_after:wN \use_i:nn + \else: + \exp_after:wN \use_ii:nn + \fi: + { + \token_if_eq_catcode:NNTF #2 \c_space_token + { \exp_stop_f: } + { + \token_if_eq_meaning:NNTF #2 \scan_stop: + { \exp_stop_f: } + { + \__kernel_msg_expandable_error:nnn + { kernel } { e-type } + { \unexpanded missing~brace } + { } + } + } + } + { + \token_if_eq_meaning:NNTF #2 \exp_not:N + { + \exp_args:No \tl_if_head_is_N_type:nT { \use_none:n #1 } + { \__exp_e_unexpanded:N } + } + { \exp_after:wN \exp_stop_f: #2 } + } + } + \cs_new:Npn \__exp_e_unexpanded:N #1 + { + \exp_after:wN \if_meaning:w \exp_not:N #1 #1 \else: + \exp_after:wN \use_i:nn + \fi: + \exp_stop_f: #1 + } + \cs_new:Npn \__exp_e_the:Nnn #1#2 + { + \tl_if_head_is_N_type:nTF {#2} + { \if_false: { \fi: \__exp_e_the:N #2 } } + { \exp_args:No \__exp_e:nn { \tex_the:D #2 } } + } + \cs_new:Npn \__exp_e_the:N #1 + { + \exp_after:wN \if_meaning:w \exp_not:N #1 #1 + \exp_after:wN \use_i:nn + \else: + \exp_after:wN \use_ii:nn + \fi: + { + \if_meaning:w \tex_toks:D #1 + \exp_after:wN \__exp_e_the_toks:wnn \int_value:w + \exp_after:wN \__exp_e_the_toks:n + \exp_after:wN { \int_value:w \if_false: } \fi: + \else: + \__exp_e_if_toks_register:NTF #1 + { \exp_after:wN \__exp_e_the_toks_reg:N } + { + \exp_after:wN \__exp_e:nn \exp_after:wN { + \tex_the:D \if_false: } \fi: + } + \exp_after:wN #1 + \fi: + } + { + \exp_after:wN \__exp_e_the:Nnn \exp_after:wN ? + \exp_after:wN { \exp:w \if_false: } \fi: + \exp_after:wN \exp_end: #1 + } + } + \cs_new:Npn \__exp_e_the_toks_reg:N #1 + { + \exp_after:wN \__exp_e_put:nn \exp_after:wN { + \exp_after:wN { + \tex_the:D \if_false: } \fi: #1 } + } + \cs_new:Npn \__exp_e_the_toks:wnn #1; #2 + { + \exp_args:No \__exp_e_put:nnn + { \tex_the:D \tex_toks:D #1 } { ? #2 } + } + \cs_new:Npn \__exp_e_the_toks:n #1 + { + \tl_if_head_is_N_type:nTF {#1} + { \exp_after:wN \__exp_e_the_toks:N \if_false: { \fi: #1 } } + { ; {#1} } + } + \cs_new:Npn \__exp_e_the_toks:N #1 + { + \if_int_compare:w 10 < 9 \token_to_str:N #1 \exp_stop_f: + \exp_after:wN \use_i:nn + \else: + \exp_after:wN \use_ii:nn + \fi: + { + #1 + \exp_after:wN \__exp_e_the_toks:n + } + { \exp_after:wN ; } + \exp_after:wN { \if_false: } \fi: + } + \prg_new_conditional:Npnn \__exp_e_if_toks_register:N #1 { TF } + { + \token_if_toks_register:NTF #1 { \prg_return_true: } + { + \cs_if_exist:cTF + { + __exp_e_the_ + \exp_after:wN \cs_to_str:N + \token_to_meaning:N #1 + : + } { \prg_return_true: } { \prg_return_false: } + } + } + \cs_new_eq:NN \__exp_e_the_XeTeXinterchartoks: ? + \cs_new_eq:NN \__exp_e_the_errhelp: ? + \cs_new_eq:NN \__exp_e_the_everycr: ? + \cs_new_eq:NN \__exp_e_the_everydisplay: ? + \cs_new_eq:NN \__exp_e_the_everyeof: ? + \cs_new_eq:NN \__exp_e_the_everyhbox: ? + \cs_new_eq:NN \__exp_e_the_everyjob: ? + \cs_new_eq:NN \__exp_e_the_everymath: ? + \cs_new_eq:NN \__exp_e_the_everypar: ? + \cs_new_eq:NN \__exp_e_the_everyvbox: ? + \cs_new_eq:NN \__exp_e_the_output: ? + \cs_new_eq:NN \__exp_e_the_pdfpageattr: ? + \cs_new_eq:NN \__exp_e_the_pdfpageresources: ? + \cs_new_eq:NN \__exp_e_the_pdfpagesattr: ? + \cs_new_eq:NN \__exp_e_the_pdfpkmode: ? + } \__kernel_patch:nnNNpn { \__kernel_chk_cs_exist:N #1 } { } \cs_new_protected:Npn \cs_generate_variant:Nn #1#2 { @@ -3575,10 +3863,12 @@ \if:w V #1 n \else: \if:w v #1 n \else: \if:w f #1 n \else: - \if:w x #1 n \else: - \if:w n #1 n \else: - \if:w N #1 N \else: - \scan_stop: + \if:w e #1 n \else: + \if:w x #1 n \else: + \if:w n #1 n \else: + \if:w N #1 N \else: + \scan_stop: + \fi: \fi: \fi: \fi: @@ -9731,6 +10021,11 @@ { Relation~'#1'~unknown:~use~=,~<,~>,~==,~!=,~<=,~>=. } \__kernel_msg_new:nnn { kernel } { zero-step } { Zero~step~size~for~step~function~#1. } +\cs_if_exist:NF \tex_expanded:D + { + \__kernel_msg_new:nnn { kernel } { e-type } + { #1 ~ in~e-type~argument } + } \__kernel_msg_new:nnn { kernel } { show-clist } { The~comma~list~ \tl_if_empty:nF {#1} { #1 ~ } diff --git a/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex b/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex index 251bd130847..0a797cade44 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex +++ b/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex @@ -19,7 +19,7 @@ %% and all files in that bundle must be distributed together. %% %% File: expl3.dtx Copyright (C) 1990-2018 The LaTeX3 Project -\def\ExplFileDate{2018-06-01}% +\def\ExplFileDate{2018-06-14}% \let\ExplLoaderFileDate\ExplFileDate \begingroup \def\tempa{LaTeX2e}% diff --git a/Master/texmf-dist/tex/latex/l3kernel/expl3.sty b/Master/texmf-dist/tex/latex/l3kernel/expl3.sty index 31091110395..8c35b008653 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/expl3.sty +++ b/Master/texmf-dist/tex/latex/l3kernel/expl3.sty @@ -19,7 +19,7 @@ %% and all files in that bundle must be distributed together. %% %% File: expl3.dtx Copyright (C) 1990-2018 The LaTeX3 Project -\def\ExplFileDate{2018-06-01}% +\def\ExplFileDate{2018-06-14}% \let\ExplLoaderFileDate\ExplFileDate \ProvidesPackage{expl3} [% diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3dvipdfmx.def b/Master/texmf-dist/tex/latex/l3kernel/l3dvipdfmx.def index b37fd053f39..dfb4dec6f0d 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3dvipdfmx.def +++ b/Master/texmf-dist/tex/latex/l3kernel/l3dvipdfmx.def @@ -20,7 +20,7 @@ %% %% File: l3drivers.dtx Copyright(C) 2011-2018 The LaTeX3 Project \ProvidesExplFile - {l3dvidpfmx.def}{2018-06-01}{} + {l3dvidpfmx.def}{2018-06-14}{} {L3 Experimental driver: dvipdfmx} \cs_new_eq:NN \__driver_literal_x:n \tex_special:D \cs_new_protected:Npn \__driver_literal:n #1 diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3dvips.def b/Master/texmf-dist/tex/latex/l3kernel/l3dvips.def index 73a8992041b..7a13c44ddee 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3dvips.def +++ b/Master/texmf-dist/tex/latex/l3kernel/l3dvips.def @@ -20,7 +20,7 @@ %% %% File: l3drivers.dtx Copyright(C) 2011-2018 The LaTeX3 Project \ProvidesExplFile - {l3dvips.def}{2018-06-01}{} + {l3dvips.def}{2018-06-14}{} {L3 Experimental driver: dvips} \cs_new_eq:NN \__driver_literal_x:n \tex_special:D \cs_new_protected:Npn \__driver_literal:n #1 diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3dvisvgm.def b/Master/texmf-dist/tex/latex/l3kernel/l3dvisvgm.def index bcb954e19e0..d11ba6a2554 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3dvisvgm.def +++ b/Master/texmf-dist/tex/latex/l3kernel/l3dvisvgm.def @@ -20,7 +20,7 @@ %% %% File: l3drivers.dtx Copyright(C) 2011-2018 The LaTeX3 Project \ProvidesExplFile - {l3dvisvgm.def}{2018-06-01}{} + {l3dvisvgm.def}{2018-06-14}{} {L3 Experimental driver: dvisvgm} \cs_new_eq:NN \__driver_literal_x:n \tex_special:D \cs_new_protected:Npn \__driver_literal:n #1 diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def b/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def index 6ae1a5b72ef..f1ed2af34f8 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def +++ b/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def @@ -20,7 +20,7 @@ %% %% File: l3drivers.dtx Copyright(C) 2011-2018 The LaTeX3 Project \ProvidesExplFile - {l3pdfmode.def}{2018-06-01}{} + {l3pdfmode.def}{2018-06-14}{} {L3 Experimental driver: PDF mode} \cs_new_eq:NN \__driver_literal_x:n \tex_special:D \cs_new_protected:Npn \__driver_literal:n #1 diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3xdvipdfmx.def b/Master/texmf-dist/tex/latex/l3kernel/l3xdvipdfmx.def index ed60301fdd7..f73a321a40f 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3xdvipdfmx.def +++ b/Master/texmf-dist/tex/latex/l3kernel/l3xdvipdfmx.def @@ -20,7 +20,7 @@ %% %% File: l3drivers.dtx Copyright(C) 2011-2018 The LaTeX3 Project \ProvidesExplFile - {l3xdvidpfmx.def}{2018-06-01}{} + {l3xdvidpfmx.def}{2018-06-14}{} {L3 Experimental driver: xdvipdfmx} \cs_new_eq:NN \__driver_literal_x:n \tex_special:D \cs_new_protected:Npn \__driver_literal:n #1 |