diff options
author | Karl Berry <karl@freefriends.org> | 2017-11-14 21:07:53 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2017-11-14 21:07:53 +0000 |
commit | 8c82df0007c957004cc2268b49ccf3ceca914f58 (patch) | |
tree | ae29044a1727ceb31a488437f43cde1a31e6e007 /Master/texmf-dist/source | |
parent | 4bd2a337b834181c967e774caddf57b3f747e127 (diff) |
l3 (14nov17)
git-svn-id: svn://tug.org/texlive/trunk@45802 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source')
55 files changed, 899 insertions, 506 deletions
diff --git a/Master/texmf-dist/source/latex/l3kernel/expl3.dtx b/Master/texmf-dist/source/latex/l3kernel/expl3.dtx index d25bc734518..886bb3c1d65 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{2017/09/18}% +\def\ExplFileDate{2017/11/14}% %</driver|generic|package> %<*driver> \documentclass[full]{l3doc} @@ -49,7 +49,7 @@ % }^^A % } % -% \date{Released 2017/09/18} +% \date{Released 2017/11/14} % % \maketitle % @@ -436,7 +436,7 @@ % % \subsubsection{Variables: guidance} % -% Both comma lists and sequences both have similar characteristics. +% Both comma lists and sequences have similar characteristics. % They both use special delimiters to mark out one entry from the % next, and are both accessible at both ends. In general, it is % easier to create comma lists `by hand' as they can be typed diff --git a/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx b/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx index d2f9c6e42de..26ab6128f1e 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 2017/09/18} +% \date{Released 2017/11/14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx b/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx index 7afc9938780..078db9864a7 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 2017/09/18} +% \date{Released 2017/11/14} % % \maketitle % @@ -590,7 +590,7 @@ % \cs_generate_from_arg_count:Ncnn % } % \begin{syntax} -% \cs{cs_generate_from_arg_count:NNnn} \meta{function} \meta{creator} \meta{number} \meta{code} +% \cs{cs_generate_from_arg_count:NNnn} \meta{function} \meta{creator} \Arg{number} \Arg{code} % \end{syntax} % Uses the \meta{creator} function (which should have signature % |Npn|, for example \cs{cs_new:Npn}) to define a \meta{function} @@ -1036,8 +1036,8 @@ % % \begin{function}[EXP,pTF]{\cs_if_eq:NN} % \begin{syntax} -% \cs{cs_if_eq_p:NN} \Arg{cs_1} \Arg{cs_2} -% \cs{cs_if_eq:NNTF} \Arg{cs_1} \Arg{cs_2} \Arg{true code} \Arg{false code} +% \cs{cs_if_eq_p:NN} \meta{cs_1} \meta{cs_2} +% \cs{cs_if_eq:NNTF} \meta{cs_1} \meta{cs_2} \Arg{true code} \Arg{false code} % \end{syntax} % Compares the definition of two \meta{control sequences} and % is logically \texttt{true} if they are the same, \emph{i.e.}~if they have exactly @@ -1295,7 +1295,7 @@ % % \begin{function}{\__debug_patch_conditional:nNNpnn} % \begin{syntax} -% \cs{__debug_patch_conditional:nNNpn} \Arg{before} +% \cs{__debug_patch_conditional:nNNpnn} \Arg{before} % \meta{definition} \meta{conditional} \meta{parameters} \Arg{type} \Arg{code} % \end{syntax} % Similar to \cs{__debug_patch:nnNNpn} for conditionals, namely diff --git a/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx b/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx index f0ed38dd901..cbe2fa0b9bf 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 2017/09/18} +% \date{Released 2017/11/14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3box.dtx b/Master/texmf-dist/source/latex/l3kernel/l3box.dtx index d864dc55b4c..74ed05fa0d5 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 2017/09/18} +% \date{Released 2017/11/14} % % \maketitle % @@ -336,7 +336,7 @@ % % \begin{function}[added = 2012-05-11]{\box_show:Nnn, \box_show:cnn} % \begin{syntax} -% \cs{box_show:Nnn} \meta{box} \meta{intexpr_1} \meta{intexpr_2} +% \cs{box_show:Nnn} \meta{box} \Arg{intexpr_1} \Arg{intexpr_2} % \end{syntax} % Display the contents of \meta{box} in the terminal, showing the first % \meta{intexpr_1} items of the box, and descending into \meta{intexpr_2} @@ -352,7 +352,7 @@ % % \begin{function}[added = 2012-05-11]{\box_log:Nnn, \box_log:cnn} % \begin{syntax} -% \cs{box_log:Nnn} \meta{box} \meta{intexpr_1} \meta{intexpr_2} +% \cs{box_log:Nnn} \meta{box} \Arg{intexpr_1} \Arg{intexpr_2} % \end{syntax} % Writes the contents of \meta{box} to the log, showing the first % \meta{intexpr_1} items of the box, and descending into \meta{intexpr_2} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx b/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx index 69e62bdd4f6..2ddf658d7a5 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 2017/09/18} +% \date{Released 2017/11/14} % % \maketitle % @@ -236,7 +236,11 @@ % Searches for \meta{file name} using the current \TeX{} search % path and the additional paths controlled by \cs{file_path_include:n}. % If found, sets the \meta{str var} to the MD5 sum generated from the -% content of the file. +% content of the file. The file is read as bytes, which means that in +% contrast to most \TeX{} behaviour there will be a difference in result +% depending on the line endings used in text files. The same file will +% produce the same result between different engines: the algorithm used +% is the same in all cases. % Where the file is not found, the \meta{str var} will be empty. % \end{function} % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx b/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx index ba3b678a69d..ed70ce187a6 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 2017/09/18} +% \date{Released 2017/11/14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx b/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx index e54553b75b9..e312125842a 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 2017/09/18} +% \date{Released 2017/11/14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3color.dtx b/Master/texmf-dist/source/latex/l3kernel/l3color.dtx index 607189ea12a..b384337ea8f 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3color.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3color.dtx @@ -41,7 +41,7 @@ % }^^A % } % -% \date{Released 2017/09/18} +% \date{Released 2017/11/14} % % \maketitle % @@ -78,22 +78,34 @@ % % \subsection{Internal functions} % -% \begin{variable}[added = 2017-06-15]{\l__color_current_tl} +% \begin{variable}[added = 2017-06-15, updated = 2017-10-02] +% {\l__color_current_tl} % The color currently active for foreground (text, \emph{etc.}) material. % This is stored in the form of a color model followed by one or more -% values in the range $[0,1]$: these determine the color. The model and -% applicable data format must be one of the following: +% values. There are four pre-defined models, three of which take numerical +% values in the range $[0,1]$: % \begin{itemize} % \item \texttt{gray \meta{gray}} Grayscale color with the \meta{gray} % value running from $0$ (fully black) to $1$ (fully white) % \item \texttt{cmyk \meta{cyan} \meta{magenta} \meta{yellow} \meta{black}} % \item \texttt{rgb \meta{red} \meta{green} \meta{blue}} % \end{itemize} -% Notice that the value are separated by spaces. +% Notice that the value are separated by spaces. There is a fourth pre-defined +% model using a string value and a numerical one: +% \begin{itemize} +% \item \texttt{spot \meta{name} \meta{tint}} A pre-defined spot color, +% where the \meta{name} should be a pre-defined string color name and the +% \meta{tint} should be in the range $[0,1]$. +% \end{itemize} +% +% Additional models may be created to allow mixing of spot colors. The +% number of data entries these require will depend on the number of +% colors to be mixed. % \begin{texnote} -% This format is the native one for \texttt{dvips} color specials: -% other drivers are expected to convert to their own format when -% writing color data to output. +% The content of \cs{l__color_current_tl} is space-separated as +% this allows it to be used directly in specials in many common cases. +% This internal representation is close to that used by the \texttt{dvips} +% program. % \end{texnote} % \end{variable} % @@ -127,15 +139,21 @@ % \begin{macrocode} \cs_new_protected:Npn \color_ensure_current: { - \__driver_color_ensure_current: +%<*package> + \__driver_color_pickup:N \l__color_current_tl +%</package> + \__driver_color_select:V \l__color_current_tl \group_insert_after:N \__driver_color_reset: } % \end{macrocode} % \end{macro} % % \begin{variable}{\l__color_current_tl} -% The current color: the format here is taken from \texttt{dvips} but it -% is easy enough to convert to \texttt{pdfmode} as required. +% As the setting data is used only +% for specials, and those are always space-separated, it makes most sense to +% hold the internal information in that form. Any splitting is done by a +% delimited function but often the entire \texttt{tl} can be used as-is: +% see \texttt{l3drivers.dtx}. % \begin{macrocode} \tl_new:N \l__color_current_tl \tl_set:Nn \l__color_current_tl { gray~0 } diff --git a/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx b/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx index d4bec2770ee..e93078b3a8a 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 2017/09/18} +% \date{Released 2017/11/14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx b/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx index 7bf43aa7933..2f02cd2c37a 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx @@ -70,14 +70,14 @@ and all files in that bundle must be distributed together. % This isn't included in the typeset documentation because it's a bit % ugly: %<*class> -\ProvidesExplClass{l3doc}{2017/09/18}{} +\ProvidesExplClass{l3doc}{2017/11/14}{} {L3 Experimental documentation class} %</class> % \fi % % \title{The \cls{l3doc} class} % \author{\Team} -% \date{Released 2017/09/18} +% \date{Released 2017/11/14} % \maketitle % \tableofcontents % @@ -1911,7 +1911,7 @@ and all files in that bundle must be distributed together. { \l_@@_index_key_tl } { \l_@@_index_macro_tl } { \l_@@_index_module_tl } - { } + { usage } \l_@@_index_internal_bool } } @@ -3877,7 +3877,19 @@ and all files in that bundle must be distributed together. % \begin{macrocode} \tl_new:N \l_@@_index_escaped_macro_tl \tl_new:N \l_@@_index_escaped_key_tl +% \end{macrocode} +% +% \begin{macrocode} \cs_new_protected:Npn \@@_special_index_module:nnnnN #1#2#3#4#5 +% \end{macrocode} +% \begin{arguments} +% \item key +% \item macro +% \item module +% \item index `type' (\texttt{main}/\texttt{usage}/\emph{etc.}) +% \item boolean whether internal command +% \end{arguments} +% \begin{macrocode} { \use:x { @@ -3899,8 +3911,24 @@ and all files in that bundle must be distributed together. } {#4} } +% \end{macrocode} +% +% \begin{macrocode} \cs_generate_variant:Nn \@@_special_index_module:nnnnN { ooo } +% \end{macrocode} +% +% \begin{macrocode} \cs_new_protected:Npn \@@_special_index_aux:nnnnnn #1#2#3#4#5#6 +% \end{macrocode} +% \begin{arguments} +% \item key +% \item macro +% \item index subheading string +% \item index subheading text +% \item index subheading suffix (appended to both arg 3 and 4) +% \item index `type' (\texttt{main}/\texttt{usage}/\emph{etc.}) +% \end{arguments} +% \begin{macrocode} { \tl_set:Nn \l_@@_index_escaped_key_tl {#1} \@@_quote_special_char:N \l_@@_index_escaped_key_tl @@ -3928,6 +3956,9 @@ and all files in that bundle must be distributed together. hdclindex{\the\c@HD@hypercount}{#6} } } +% \end{macrocode} +% +% \begin{macrocode} \cs_new_protected:Npn \@@_special_index_set:Nn #1#2 { \tl_set:Nx #1 { \tl_to_str:n {#2} } @@ -4227,15 +4258,6 @@ and all files in that bundle must be distributed together. } % \end{macrocode} % -% \subsection{Text extras} -% -% \begin{macrocode} -\DeclareDocumentCommand \ie { } { \emph{i.e.} } -\DeclareDocumentCommand \eg { } { \emph{e.g.} } -\DeclareDocumentCommand \Ie { } { \emph{I.e.} } -\DeclareDocumentCommand \Eg { } { \emph{E.g.} } -% \end{macrocode} -% % \subsection{Math extras} % % For \pkg{l3fp}. @@ -4265,6 +4287,10 @@ and all files in that bundle must be distributed together. % % \subsection{Makeindex configuration} % +% \begin{macrocode} +%<*docist> +% \end{macrocode} +% % The makeindex style \file{l3doc.ist} is used in place of the usual % \file{gind.ist} to ensure that |I| is used in the sequence |I J K| not % |I II II|, which would be the default makeindex behaviour. @@ -4275,7 +4301,6 @@ and all files in that bundle must be distributed together. % \file{gind.ist} is used instead. % % \begin{macrocode} -%<*docist> actual '=' quote '!' level '>' @@ -4301,198 +4326,11 @@ headings_flag 1 % and just for source3: % Remove R so I is treated in sequence I J K not I II III page_precedence "rnaA" -%</docist> % \end{macrocode} % -% \section{Testing} -% -% \begin{function}{foo} -% \begin{syntax} -% |\foo| \meta{something_n} \Arg{something_1} -% \end{syntax} -% Does \meta{something_1} with \meta{something_n} -% \end{function} -% -% \begin{function}{.bool_set:N} -% blah -% \end{function} -% -% \begin{variable} -% { -% \c_alignment_token, -% } -% \end{variable} -% -% \begin{function}[added=2011-09-06]{\example_foo:N, \example_foo:c} -% \begin{syntax} -% |\example_foo:N| <arg_1> -% |\example_foo:c| \Arg{arg_1} -% \end{syntax} -% <0123456789> -% \end{function} -% -% \begin{function}[added=2011-09-06] -% {\foo, \fooo:, \foooo:n, \foooo:x, \fooooo:n, \fooooo:c, \fooooo:x} -% \begin{syntax} -% |\example_foo:N| \meta{arg_1} -% \end{syntax} -% \meta{0123456789} -% \end{function} -% -% \begin{function}[TF]{\foo:N, \foo_if:c} -% Test. -% \end{function} -% \begin{function}[TF,EXP]{\foo:N, \foo_if:c} -% Test. -% \end{function} -% -% \begin{function}[added=2011-09-06,EXP]{\fffoo:N} -% Test. -% \end{function} -% \begin{function}[added=2011-09-06,updated=2011-09-07,EXP]{\fffoo:N} -% Test. -% \end{function} -% \begin{function}[updated=2011-09-06,EXP]{\fffoo:N} -% Test. -% \end{function} -% \begin{function}[TF]{\ffffoo:N} -% Test. -% \end{function} -% \begin{function}[pTF]{\ffoo:N} -% \lipsum[6] -% \end{function} -% \begin{function}[pTF]{\ffoo:N, \ffoo:c, \ffoo:V} -% \lipsum[6] -% \end{function} -% \begin{function}[pTF]{\ffoo:N, \ffoo:c} -% \lipsum[6] -% \end{function} -% -% -% \begin{function}[TF]{\ffffoo_with_very_very_very_long_name:N} -% \lipsum[1] -% \end{function} -% -% \begin{function}[TF] -% { -% \ffffoo_with_very_very_very_long_name:N, -% \ffffoo_with_very_very_very_long_name:c, -% \ffffoo_with_very_very_very_long_name:V -% } -% \lipsum[1] -% \end{function} -% -% \begin{function}[TF] -% { -% \ffffoo_with_very_very_very_long_name:N, -% \ffffoo_with_very_very_very_long_name:c, -% \ffffoo_with_very_very_very_long_name:V -% } -% \begin{syntax} -% this is how you use it -% \end{syntax} -% \lipsum[1] -% \end{function} -% -% \begin{function}[TF] -% { -% \ffffoo_with_very_very_very_long_name:N, -% \ffffoo_with_very_very_very_long_name:V -% } -% \begin{syntax} -% this is how you use it -% \end{syntax} -% \lipsum[1] -% \end{function} -% -% \bigskip\bigskip -% -% \begin{macro}[aux]{\foo_aux:} -% Testing the \enquote{aux} option. -% \end{macro} -% -% \begin{macro}[TF]{\foo_if:c} -% Testing the \enquote{TF} option. -% \end{macro} -% \begin{macro}[TF]{\foo_if:c, \fooo_if:n} -% Testing the \enquote{TF} option. -% \end{macro} -% -% \begin{macro}[pTF]{ \foo_if:d } -% Testing the \enquote{pTF} option. -% \end{macro} -% -% \begin{macro}[internal]{\test_internal:} -% Testing the \enquote{internal} option. -% \end{macro} -% -% \bigskip\bigskip -% -% \begin{macro}{\aaaa_bbbb_cccc_dddd_eeee_ffff_gggg_hhhh} -% Long macro names need to be printed in a shorter font. % \begin{macrocode} +%</docist> % \end{macrocode} -% \end{macro} -% -% \begin{function}{\::N} -% This is (no longer) weird. -% \end{function} -% -% \begin{macro}{\::N} -% This is (no longer) weird. -% \end{macro} -% -% \begin{function}[EXP]{\foo}\end{function} -% \begin{function}[rEXP]{\foo}\end{function} -% -% Here is some verbatim text: -% \begin{verbatim} -% a & B # c -% \end{verbatim} -% without overriding this with \pkg{fancyvrb} there would be extraneous -% whitespace. -% -% \begin{macro} -% { -% \c_zero, -% \c_one, -% \c_two, -% \c_three, -% \c_four, -% \c_five, -% \c_six, -% \c_seven, -% \c_eight, -% \c_nine, -% \c_ten, -% \c_eleven, -% \c_sixteen, -% \c_thirty_two, -% \c_hundred_one, -% \c_two_hundred_fifty_five, -% \c_two_hundred_fifty_six, -% \c_thousand, -% \c_ten_thousand, -% \c_ten_thousand_one -% } -% \begin{arguments} -% \item name -% \item parameters -% \end{arguments} -% Another test. -% \end{macro} -% -% -% \subsection{Macros} -% \raggedright -% \ExplSyntaxOn -% \seq_map_inline:Nn \g_doc_macros_seq { \texttt{\enquote{#1}} \quad } -% \ExplSyntaxOff -% -% \subsection{Functions} -% \ExplSyntaxOn -% \seq_map_inline:Nn \g_doc_functions_seq { \texttt{\enquote{#1}} \quad } -% \ExplSyntaxOff % % \end{implementation} % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx b/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx index 4a0838811a6..9cdfc7bb0bc 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 2017/09/18} +% \date{Released 2017/11/14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx b/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx index 0ec3f3bd451..7c8e43143c5 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx @@ -45,7 +45,7 @@ % }^^A % } % -% \date{Released 2017/09/18} +% \date{Released 2017/11/14} % % \maketitle % @@ -123,16 +123,24 @@ % % \section{Color support} % -% \begin{function}[added = 2011-09-03, updated = 2012-05-18] -% {\__driver_color_ensure_current:} +% \begin{function}[added = 2017-10-25] +% {\__driver_color_select:n, \__driver_color_select:V} % \begin{syntax} -% \cs{__driver_color_ensure_current:} +% \cs{__driver_color_select:n} \Arg{color} % \end{syntax} -% Ensures that the color used to typeset material is that which was -% set when the material was placed in a box. This function is therefore -% required inside any \enquote{color safe} box to ensure that the box may -% be inserted in a location where the foreground color has been altered, -% while preserving the color used in the box. +% Selects the \meta{color} (which is given in low-level format: a +% \meta{model} followed by a space and one or more space-separated +% axes). +% \end{function} +% +% \begin{function}[added = 2017-10-25] +% {\__driver_color_pickup:N} +% \begin{syntax} +% \cs{__driver_color_pickup:N} \meta{tl} +% \end{syntax} +% In \LaTeXe{} package mode, collects data on the current color from +% \tn{current@color} and stores it in the low-level format used by \pkg{expl3} +% in the \meta{tl}. % \end{function} % % \section{Drawing} @@ -405,7 +413,7 @@ % \__driver_draw_color_rgb_stroke:nnn % } % \begin{syntax} -% \cs{__driver_draw_color_gray:n} \Arg{red} \Arg{green} \Arg{blue} +% \cs{__driver_draw_color_rgb:nnn} \Arg{red} \Arg{green} \Arg{blue} % \end{syntax} % Sets the color for drawing to the RGB values specified, all of which are % fp expressions which should evaluate to between $0$ and $1$. The @@ -510,39 +518,74 @@ %<*dvisvgm|dvipdfmx|dvips|xdvipdfmx> % \end{macrocode} % -% \begin{macro}[aux]{\@@_color_pickup:} -% Allow for \LaTeXe{}. +% \begin{macro}[int]{\@@_color_pickup:N} +% Allow for \LaTeXe{} color. Here, the possible input values are limited: +% \texttt{dvips}-style colors can mainly be taken as-is with the exception +% spot ones (here we need a model and a tint). % \begin{macrocode} %<*package> +\cs_new_protected:Npn \@@_color_pickup:N #1 { } \AtBeginDocument { \@ifpackageloaded { color } { - \cs_new_protected:Npn \@@_color_pickup: - { \tl_set:Nx \l__color_current_tl { \current@color } } + \cs_set_protected:Npn \@@_color_pickup:N #1 + { + \exp_args:NV \tl_if_head_is_space:nTF \current@color + { + \tl_set:Nx #1 + { + spot ~ + \exp_after:wN \use:n \current@color \c_space_tl 1 + } + } + { \exp_after:wN \@@_color_pickup_aux:w \current@color \q_stop #1 } + } + \cs_new_protected:Npn \@@_color_pickup_aux:w #1 ~ #2 \q_stop #3 + { \tl_set:Nn #3 { #1 ~ #2 } } } - { \cs_new_protected:Npn \@@_color_pickup: { } } + { } } %</package> % \end{macrocode} % \end{macro} % -% \begin{macro}[int]{\@@_color_ensure_current:} +% \begin{macro}[int]{\@@_color_select:n, \@@_color_select:V} +% \begin{macro}[aux, EXP]{\@@_convert_model:w} +% \begin{macro}[aux, EXP]{\@@_color_convert_spot:} +% \begin{macro}[aux, EXP]{\@@_color_convert_spot:w} % \begin{macro}[aux]{\@@_color_reset:} -% Directly set the color using the specials: no optimisation here. +% Mainly no conversation but a little work with \texttt{spot} colors as they +% can't have a tint level here! The easy route of just picking up +% \texttt{spot} as a model won't work as there could be additional models +% created for mixing named colors. (They would not be supported at the moment, +% but still need to be handled.) % \begin{macrocode} -\cs_new_protected:Npn \@@_color_ensure_current: +\cs_new_protected:Npn \@@_color_select:n #1 { -%<*package> - \@@_color_pickup: -%</package> - \tex_special:D { color~push~\l__color_current_tl } + \tex_special:D + { + color~push~ + \cs_if_exist_use:cF + { @@_color_convert_ \@@_convert_model:w #1 \q_stop :n } + { \use:n } + {#1} + } } +\cs_generate_variant:Nn \@@_color_select:n { V } +\cs_new:Npn \@@_convert_model:w #1 ~ #2 \q_stop {#1} +\cs_new:Npn \@@_color_convert_spot:n #1 + { \@@_color_convert_spot:w #1 \q_stop } +\cs_new:Npn \@@_color_convert_spot:w #1 ~ #2 ~ #3 \q_stop + { \c_space_tl #2 } \cs_new_protected:Npn \@@_color_reset: { \tex_special:D { color~pop } } % \end{macrocode} % \end{macro} % \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} % % \begin{macrocode} %</dvisvgm|dvipdfmx|dvips|xdvipdfmx> @@ -554,7 +597,7 @@ %<*pdfmode> % \end{macrocode} % -% \begin{macro}[aux]{\@@_color_pickup:} +% \begin{macro}[aux]{\@@_color_pickup:N} % \begin{macro}[aux]{\@@_color_pickup_aux:w} % The current color in driver-dependent format: pick up the package-mode % data if available. We end up converting back and forward in this route as @@ -564,34 +607,41 @@ % \pkg{xcolor} sets it to be instructions to generate a colour % \begin{macrocode} %<*package> +\cs_new_protected:Npn \@@_color_pickup:N #1 { } \AtBeginDocument { \@ifpackageloaded { color } { - \cs_new_protected:Npn \@@_color_pickup: + \cs_set_protected:Npn \@@_color_pickup:N #1 { \exp_last_unbraced:Nx \@@_color_pickup_aux:w - { \current@color } ~ 0 ~ 0 ~ 0 \q_stop + { \current@color } ~ 0 ~ 0 ~ 0 \q_stop #1 } - \cs_new:Npn \@@_color_pickup_aux:w #1 ~ #2 ~ #3 ~ #4 ~ #5 ~ #6 \q_stop + \cs_new_protected:Npn \@@_color_pickup_aux:w + #1 ~ #2 ~ #3 ~ #4 ~ #5 ~ #6 \q_stop #7 { - \tl_set:Nx \l__color_current_tl + \str_if_eq:nnTF {#2} { g } + { \tl_set:Nn #7 { gray ~ #1 } } { - \str_if_eq:nnTF {#2} { g } - { gray ~ #1 } + \str_if_eq:nnTF {#4} { rg } + { \tl_set:Nn #7 { rgb ~ #1 ~ #2 ~ #3 } } { - \str_if_eq:nnTF {#4} { rg } - { rgb ~ #1 ~ #2 ~ #3 } - { - \str_if_eq:nnTF {#5} { k } - { cmyk ~ #1 ~ #2 ~ #3 ~ #4 } - { gray ~ #1 } - } + \str_if_eq:nnTF {#5} { k } + { \tl_set:Nn #7 { cmyk ~ #1 ~ #2 ~ #3 ~ #4 } } + { + \str_if_eq:nnTF {#2} { cs } + { + \tl_set:Nx #7 { spot ~ \use_none:n #1 ~ #5 } + } + { + \tl_set:Nn #7 { gray ~ 0 } + } + } } } } } - { \cs_new_protected:Npn \@@_color_pickup: { } } + { } } %</package> % \end{macrocode} @@ -606,43 +656,46 @@ % \end{macrocode} % \end{variable} % -% \begin{macro}[int]{\@@_color_ensure_current:} +% \begin{macro}[int]{\@@_color_select:n, \@@_color_select:V} +% \begin{macro}[aux, EXP]{\@@_color_convert:w} % \begin{macro}[aux, EXP] % { -% \@@_color_convert:w, \@@_color_convert_gray:w, -% \@@_color_convert_cmyk:w, \@@_color_convert_rgb:w +% \@@_color_convert_gray:w , +% \@@_color_convert_cmyk:w , +% \@@_color_convert_rgb:w , +% \@@_color_convert_spot:w % } % \begin{macro}[aux]{\@@_color_reset:} % There is a dedicated primitive/primitive interface for setting colors. % As with scoping, this approach is not suitable for cached operations. -% Since we are using the \texttt{dvips} format to store color, there is a -% bit of work to correctly place it in the output. +% Most of the conversions are trivial but the need to cover spot colors +% makes life slightly more interesting. % \begin{macrocode} -\cs_new_protected:Npx \@@_color_ensure_current: +\cs_new_protected:Npx \@@_color_select:n #1 { -%<*package> - \exp_not:N \@@_color_pickup: -%</package> \cs_if_exist:NTF \luatex_pdfextension:D { \luatex_pdfextension:D colorstack } { \pdftex_pdfcolorstack:D } \exp_not:N \l_@@_color_stack_int push { - \exp_not:N \exp_after:wN \exp_not:N \@@_color_convert:w - \exp_not:N \l__color_current_tl - \c_space_tl 0 ~ 0 ~ 0 + #1 \exp_not:N \q_stop } } -\cs_new:Npn \@@_color_convert:w #1 ~ - { \use:c { @@_color_convert_ #1 :w } } -\cs_new:Npn \@@_color_convert_gray:w #1 ~ #2 \q_stop +\cs_generate_variant:Nn \@@_color_select:n { V } +\cs_new:Npn \@@_color_convert:w #1 ~ #2 \q_stop + { \use:c { @@_color_convert_ #1 :w } #2 \q_stop } +\cs_new:Npn \@@_color_convert_gray:w #1 \q_stop { #1 ~ g ~ #1 ~ G } -\cs_new:Npn \@@_color_convert_cmyk:w #1 ~ #2 ~ #3 ~ #4 ~#5 \q_stop - { #1 ~ #2 ~ #3 ~ #4 ~ k ~ #1 ~ #2 ~ #3 ~ #4 ~ K } -\cs_new:Npn \@@_color_convert_rgb:w #1 ~ #2 ~ #3 ~ #4 \q_stop - { #1 ~ #2 ~ #3 ~ rg ~ #1 ~ #2 ~ #3 ~ RG } +\cs_new:Npn \@@_color_convert_cmyk:w #1 \q_stop + { #1 ~ k ~ #1 ~ K } +\cs_new:Npn \@@_color_convert_rgb:w #1 \q_stop + { #1 ~ rg ~ #1 ~ RG } +\cs_new:Npn \@@_color_convert_spot:w #1 ~ #2 \q_stop + { + /#1 ~ cs ~ /#1 ~ CS ~ #2 ~ sc ~ #2 ~ SC + } \cs_new_protected:Npx \@@_color_reset: { \cs_if_exist:NTF \luatex_pdfextension:D @@ -654,6 +707,7 @@ % \end{macro} % \end{macro} % \end{macro} +% \end{macro} % % \begin{macrocode} %</pdfmode> @@ -766,6 +820,7 @@ \box_use:N #1 \@@_scope_end: } +% \end{macrocode} % \end{macro} % % \begin{macro}{\@@_box_use_scale:Nnn} @@ -813,7 +868,7 @@ % Literals with no positioning (using |ps:| each one is positioned but % cut off from everything else, so no good for the stepwise approach needed % here). -% \begin{macrocode} +% \begin{macrocode} \cs_new_protected:Npn \@@_draw_literal:n #1 { \tex_special:D { ps:: ~ #1 } } \cs_generate_variant:Nn \@@_draw_literal:n { x } @@ -827,7 +882,7 @@ % |@beginspecial|/|@endspecial| pair are from |special.pro| and correct the % scale and $y$-axis direction. The reference point at the start of the box % is saved (as |l3x|/|l3y|) as it is needed when inserting various items. -% \begin{macrocode} +% \begin{macrocode} \cs_new_protected:Npn \@@_draw_begin: { \tex_special:D { ps::[begin] } @@ -847,7 +902,7 @@ % \begin{macro}[int]{\@@_draw_scope_begin:, \@@_draw_scope_end:} % Scope here may need to contain saved definitions, so the entire memory % rather than just the graphic state has to be sent to the stack. -% \begin{macrocode} +% \begin{macrocode} \cs_new_protected:Npn \@@_draw_scope_begin: { \@@_draw_literal:n { save } } \cs_new_protected:Npn \@@_draw_scope_end: @@ -864,7 +919,7 @@ % values are forced to literals before any possible caching. There is % no native rectangular path command (without also clipping, filling or % stroking), so that task is done using a small amount of PostScript. -% \begin{macrocode} +% \begin{macrocode} \cs_new_protected:Npn \@@_draw_moveto:nn #1#2 { \@@_draw_literal:x @@ -902,7 +957,7 @@ % \begin{macro}[int]{\@@_draw_evenodd_rule:, \@@_draw_nonzero_rule:} % \begin{variable}[aux]{\g_@@_draw_eor_bool} % The even-odd rule here can be implemented as a simply switch. -% \begin{macrocode} +% \begin{macrocode} \cs_new_protected:Npn \@@_draw_evenodd_rule: { \bool_gset_true:N \g_@@_draw_eor_bool } \cs_new_protected:Npn \@@_draw_nonzero_rule: @@ -932,7 +987,7 @@ % the color set up functions. For clipping, the required ordering is achieved % using a \TeX{} switch. All of the operations end with a new path instruction % as they do not terminate (again in contrast to PDF). -% \begin{macrocode} +% \begin{macrocode} \cs_new_protected:Npn \@@_draw_closepath: { \@@_draw_literal:n { closepath } } \cs_new_protected:Npn \@@_draw_stroke: @@ -1030,7 +1085,7 @@ % } % Converting paths to output is again a case of mapping directly to % PostScript operations. -% \begin{macrocode} +% \begin{macrocode} \cs_new_protected:Npn \@@_draw_dash:nn #1#2 { \@@_draw_literal:x @@ -1092,7 +1147,7 @@ % respect scoping, the data needs to be stored at the PostScript level. % We cannot undefine (local) fill/stroke colors once set up but we can % set them blank to improve performance slightly. -% \begin{macrocode} +% \begin{macrocode} \cs_new_protected:Npn \@@_draw_color_reset: { \@@_draw_literal:n { currentdic~/l3fc~known~{ /l3fc~ { } ~def }~if } @@ -1186,7 +1241,7 @@ % The first four arguments here are floats (the affine matrix), the last % two are a displacement vector. Once again, force evaluation to allow for % caching. -% \begin{macrocode} +% \begin{macrocode} \cs_new_protected:Npn \@@_draw_transformcm:nnnnnn #1#2#3#4#5#6 { \@@_draw_literal:x @@ -1211,7 +1266,7 @@ % at the start of the picture. Transformation here is relative to the % drawing origin so has to be done purely in driver code not using \TeX{} % offsets. -% \begin{macrocode} +% \begin{macrocode} \cs_new_protected:Npn \@@_draw_hbox:Nnnnnnn #1#2#3#4#5#6#7 { \@@_scope_begin: @@ -1878,7 +1933,7 @@ % % \begin{macro}[aux]{\@@_draw_literal:n, \@@_draw_literal:x} % Pass data through using a dedicated interface. -% \begin{macrocode} +% \begin{macrocode} \cs_new_eq:NN \@@_draw_literal:n \@@_literal:n \cs_generate_variant:Nn \@@_draw_literal:n { x } % \end{macrocode} @@ -1886,7 +1941,7 @@ % % \begin{macro}[int]{\@@_draw_begin:, \@@_draw_end:} % No special requirements here, so simply set up a drawing scope. -% \begin{macrocode} +% \begin{macrocode} \cs_new_protected:Npn \@@_draw_begin: { \@@_draw_scope_begin: } \cs_new_protected:Npn \@@_draw_end: @@ -1897,7 +1952,7 @@ % \begin{macro}[int]{\@@_draw_scope_begin:, \@@_draw_scope_end:} % In contrast to a general scope, a drawing scope is always done using % the PDF operators so is the same for all relevant drivers. -% \begin{macrocode} +% \begin{macrocode} \cs_new_protected:Npn \@@_draw_scope_begin: { \@@_draw_literal:n { q } } \cs_new_protected:Npn \@@_draw_scope_end: @@ -1912,7 +1967,7 @@ % only the need to convert to \texttt{bp}. Notice that \texttt{x}-type % expansion is included here to ensure that any variable values are % forced to literals before any possible caching. -% \begin{macrocode} +% \begin{macrocode} \cs_new_protected:Npn \@@_draw_moveto:nn #1#2 { \@@_draw_literal:x @@ -1950,7 +2005,7 @@ % \begin{macro}[int]{\@@_draw_evenodd_rule:, \@@_draw_nonzero_rule:} % \begin{variable}[int]{\g_@@_draw_eor_bool} % The even-odd rule here can be implemented as a simply switch. -% \begin{macrocode} +% \begin{macrocode} \cs_new_protected:Npn \@@_draw_evenodd_rule: { \bool_gset_true:N \g_@@_draw_eor_bool } \cs_new_protected:Npn \@@_draw_nonzero_rule: @@ -1972,7 +2027,7 @@ % } % Converting paths to output is again a case of mapping directly to % PDF operations. -% \begin{macrocode} +% \begin{macrocode} \cs_new_protected:Npn \@@_draw_closepath: { \@@_draw_literal:n { h } } \cs_new_protected:Npn \@@_draw_stroke: @@ -2010,7 +2065,7 @@ % } % Converting paths to output is again a case of mapping directly to % PDF operations. -% \begin{macrocode} +% \begin{macrocode} \cs_new_protected:Npn \@@_draw_dash:nn #1#2 { \@@_draw_literal:x @@ -2072,7 +2127,7 @@ % \begin{macro}[aux]{\@@_draw_color_rgb_aux:nnn} % Yet more fast conversion, all using the FPU to allow for expressions % in numerical input. -% \begin{macrocode} +% \begin{macrocode} \cs_new_protected:Npn \@@_draw_color_cmyk:nnnn #1#2#3#4 { \use:x @@ -2157,7 +2212,7 @@ % The first four arguments here are floats (the affine matrix), the last % two are a displacement vector. Once again, force evaluation to allow for % caching. -% \begin{macrocode} +% \begin{macrocode} \cs_new_protected:Npn \@@_draw_transformcm:nnnnnn #1#2#3#4#5#6 { \@@_draw_literal:x @@ -2179,7 +2234,7 @@ % skew/scaling component needs to be done using the matrix operation. As this % operation can never be cached, the scope is set directly not using the % \texttt{draw} version. -% \begin{macrocode} +% \begin{macrocode} \cs_new_protected:Npn \@@_draw_hbox:Nnnnnnn #1#2#3#4#5#6#7 { \hbox_set:Nn \l_@@_tmp_box @@ -2413,7 +2468,7 @@ % % \begin{macro}[aux]{\@@_draw_literal:n, \@@_draw_literal:x} % The same as the more general literal call. -% \begin{macrocode} +% \begin{macrocode} \cs_new_eq:NN \@@_draw_literal:n \@@_literal:n \cs_generate_variant:Nn \@@_draw_literal:n { x } % \end{macrocode} @@ -2422,7 +2477,7 @@ % \begin{macro}[int]{\@@_draw_begin:, \@@_draw_end:} % A drawing needs to be set up such that the co-ordinate system is % translated. That is done inside a scope, which as described below -% \begin{macrocode} +% \begin{macrocode} \cs_new_protected:Npn \@@_draw_begin: { \@@_draw_scope_begin: @@ -2443,7 +2498,7 @@ % each graphics scope we use a global variable to do the work, with a group % used to save the value between scopes. The result is that no direct action % is needed when creating a scope. -% \begin{macrocode} +% \begin{macrocode} \cs_new_protected:Npn \@@_draw_scope_begin: { \int_set_eq:NN @@ -2486,7 +2541,7 @@ % storage routine, which adds spaces as required. Since paths should % be fully expanded there is no need to worry about the internal % \texttt{x}-type expansion. -% \begin{macrocode} +% \begin{macrocode} \cs_new_protected:Npn \@@_draw_moveto:nn #1#2 { \@@_draw_add_to_path:n @@ -2537,7 +2592,7 @@ % % \begin{macro}[int]{\@@_draw_evenodd_rule:, \@@_draw_nonzero_rule:} % The fill rules here have to be handled as scopes. -% \begin{macrocode} +% \begin{macrocode} \cs_new_protected:Npn \@@_draw_evenodd_rule: { \@@_draw_scope:n { fill-rule="evenodd" } } \cs_new_protected:Npn \@@_draw_nonzero_rule: @@ -2563,7 +2618,7 @@ % auxiliary which deals with the bits and pieces. Clipping paths are reused % for path drawing: not essential but avoids constructing them twice. % Discarding a path needs a separate function as it's not quite the same. -% \begin{macrocode} +% \begin{macrocode} \cs_new_protected:Npn \@@_draw_closepath: { \@@_draw_add_to_path:n { Z } } \cs_new_protected:Npn \@@_draw_path:n #1 @@ -2651,7 +2706,7 @@ % All of these ideas are properties of scopes in SVG. The only slight % complexity is converting the dash array properly (doing any required % maths). -% \begin{macrocode} +% \begin{macrocode} \cs_new_protected:Npn \@@_draw_dash:nn #1#2 { \use:x @@ -2721,7 +2776,7 @@ % SVG only works with RGB colors, so there is some conversion to % do. The values also need to be given as percentages, which means a % little more maths. -% \begin{macrocode} +% \begin{macrocode} \cs_new_protected:Npn \@@_draw_color_cmyk_aux:NNnnnnn #1#2#3#4#5#6 { \use:x @@ -2814,7 +2869,7 @@ % The first four arguments here are floats (the affine matrix), the last % two are a displacement vector. Once again, force evaluation to allow for % caching. -% \begin{macrocode} +% \begin{macrocode} \cs_new_protected:Npn \@@_draw_transformcm:nnnnnn #1#2#3#4#5#6 { \@@_draw_scope:x @@ -2837,7 +2892,7 @@ % No special savings can be made here: simply displace the box inside % a scope. As there is nothing to re-box, just make the box passed of % zero size. -% \begin{macrocode} +% \begin{macrocode} \cs_new_protected:Npn \@@_draw_hbox:Nnnnnnn #1#2#3#4#5#6#7 { \@@_scope_begin: diff --git a/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx b/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx index e827abfe9fb..249309ab8cf 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 2017/09/18} +% \date{Released 2017/11/14} % % \maketitle % @@ -475,7 +475,7 @@ % \exp_last_unbraced:NnNo % } % \begin{syntax} -% \cs{exp_last_unbraced:Nno} \meta{token} \meta{tokens_1} \meta{tokens_2} +% \cs{exp_last_unbraced:Nno} \meta{token} \Arg{tokens_1} \Arg{tokens_2} % \end{syntax} % These functions absorb the number of arguments given by their % specification, carry out the expansion @@ -503,7 +503,7 @@ % % \begin{function}[EXP]{\exp_last_two_unbraced:Noo} % \begin{syntax} -% \cs{exp_last_two_unbraced:Noo} \meta{token} \meta{tokens_1} \Arg{tokens_2} +% \cs{exp_last_two_unbraced:Noo} \meta{token} \Arg{tokens_1} \Arg{tokens_2} % \end{syntax} % This function absorbs three arguments and expand the second and third % once. The first argument of the function is then the next item on the diff --git a/Master/texmf-dist/source/latex/l3kernel/l3file.dtx b/Master/texmf-dist/source/latex/l3kernel/l3file.dtx index 0e77624c53e..d7d94f5cf3a 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 2017/09/18} +% \date{Released 2017/11/14} % % \maketitle % @@ -54,7 +54,7 @@ % \cs[no-index]{ior_\ldots} (reading) or \cs[no-index]{iow_\ldots} (writing). % % It is important to remember that when reading external files \TeX{} -% attempts to locate them both the operating system path and entries in the +% attempts to locate them 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. @@ -62,7 +62,7 @@ % For functions which expect a \meta{file name} argument, this argument % may contain both literal items and expandable content, which should on % full expansion be the desired file name. Active characters (as -% declared in \cs{l_char_active_seq}) are \emph{not} be expanded, +% declared in \cs{l_char_active_seq}) are \emph{not} expanded, % allowing the direct use of these in file names. File names are quoted % using |"| tokens if they contain spaces: as a result, |"| tokens are % \emph{not} permitted in file names. @@ -348,7 +348,7 @@ % % \begin{function}[added = 2012-02-11]{\ior_str_map_inline:Nn} % \begin{syntax} -% \cs{ior_str_map_inline:Nn} \Arg{stream} \Arg{inline function} +% \cs{ior_str_map_inline:Nn} \meta{stream} \Arg{inline function} % \end{syntax} % Applies the \meta{inline function} to every \meta{line} % in the \meta{stream}. The material is read from the \meta{stream} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3final.dtx b/Master/texmf-dist/source/latex/l3kernel/l3final.dtx index 68cbf77b5f1..c426117e160 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 2017/09/18} +% \date{Released 2017/11/14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx b/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx index 4bc2f1f4743..effd406c020 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 2017/09/18} +% \date{Released 2017/11/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 274d2f750b6..9c3252e5a39 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 2017/09/18} +% \date{Released 2017/11/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 2ea5e64ce04..87a64248736 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 2017/09/18} +% \date{Released 2017/11/14} % % \maketitle % @@ -689,7 +689,7 @@ % ^^A begin[todo] % \begin{macro}[int, EXP]{\@@_decimate:nNnnnn} % \begin{syntax} -% \cs{@@_decimate:nNnnnn} \Arg{shift} \Arg{f_1} +% \cs{@@_decimate:nNnnnn} \Arg{shift} \meta{f_1} % ~~\Arg{X_1} \Arg{X_2} \Arg{X_3} \Arg{X_4} % \end{syntax} % Each \meta{X_i} consists in $4$ digits exactly, @@ -764,7 +764,7 @@ % \@@_decimate_auxxv:Nnnnn, \@@_decimate_auxxvi:Nnnnn % } % \begin{syntax} -% \cs{\@@_decimate_auxi:Nnnnn} \meta{f_1} \Arg{X_1} \Arg{X_2} \Arg{X_3} \Arg{X_4} +% \cs{@@_decimate_auxi:Nnnnn} \meta{f_1} \Arg{X_1} \Arg{X_2} \Arg{X_3} \Arg{X_4} % \end{syntax} % Shifting happens in two steps: compute the \meta{rounding} digit, % and repack digits into two blocks of $8$. The sixteen functions diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx index 10cf0931ff1..60a4e2a60e4 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 2017/09/18} +% \date{Released 2017/11/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 78d31ec345e..d6bfaf24b98 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 2017/09/18} +% \date{Released 2017/11/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 e348db5a2f1..ca4f32809f2 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 2017/09/18} +% \date{Released 2017/11/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 7164feefe1e..044133c8932 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 2017/09/18} +% \date{Released 2017/11/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 c29dd3dc182..5938ae067db 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 2017/09/18} +% \date{Released 2017/11/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 bbc9101c4b6..2a1d9fb0ddf 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 2017/09/18} +% \date{Released 2017/11/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 2497c281e3c..266d4c40cac 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 2017/09/18} +% \date{Released 2017/11/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 a8717cdb21c..a5992f64041 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 2017/09/18} +% \date{Released 2017/11/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 301b665bc18..2a9fe63993d 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 2017/09/18} +% \date{Released 2017/11/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 8e01ee8fe91..32b3340cabe 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 2017/09/18} +% \date{Released 2017/11/14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx index dd852a596d8..ce110047e1b 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 2017/09/18} +% \date{Released 2017/11/14} % % \maketitle % @@ -854,7 +854,7 @@ % % \begin{function}[tested = m3fp-logic002]{||} % \begin{syntax} -% \cs{fp_eval:n} \{ \meta{operand_1} \texttt{||} \meta{operand_2} \} +% \cs{fp_eval:n} \{ \meta{operand_1} \verb"||" \meta{operand_2} \} % \end{syntax} % If \meta{operand_1} is true (non-zero), use that value, otherwise the % value of \meta{operand_2}. Both \meta{operands} are evaluated in all diff --git a/Master/texmf-dist/source/latex/l3kernel/l3int.dtx b/Master/texmf-dist/source/latex/l3kernel/l3int.dtx index 96ee0d939f1..db696612204 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 2017/09/18} +% \date{Released 2017/11/14} % % \maketitle % @@ -584,7 +584,7 @@ % \begin{syntax} % \cs{int_to_symbols:nnn} % ~~\Arg{integer expression} \Arg{total symbols} -% ~~\meta{value to symbol mapping} +% ~~\Arg{value to symbol mapping} % \end{syntax} % This is the low-level function for conversion of an % \meta{integer expression} into a symbolic form (often diff --git a/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx b/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx index 0117e34f979..ffb9ff10ed4 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 2017/09/18} +% \date{Released 2017/11/14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx b/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx index 5d3fa1a6cef..aee66866591 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 2017/09/18} +% \date{Released 2017/11/14} % % \maketitle % @@ -101,8 +101,7 @@ % \end{verbatim} % % Key names may contain any tokens, as they are handled internally -% using \cs{tl_to_str:n}; spaces are \emph{ignored} in key names. -% As discussed in +% using \cs{tl_to_str:n}. As discussed in % section~\ref{sec:l3keys:subdivision}, it is suggested that the character % |/| is reserved for sub-division of keys into logical % groups. Functions and variables are \emph{not} expanded when creating @@ -2408,23 +2407,12 @@ % \end{macro} % % \begin{macro}[EXP, int]{\@@_remove_spaces:n} -% \begin{macro}[EXP, aux]{\@@_remove_spaces:w} -% Removes all spaces from the input which is detokenized as a result. -% This function has the same effect as \tn{zap@space} in \LaTeXe{} -% after applying \cs{tl_to_str:n}. It is set up to be fast as the -% use case here is tightly defined. The~|?| is only there to allow -% for a space after \cs{use_none:nn} responsible for ending the loop. +% Used in a few places so worth handling as a dedicated function. % \begin{macrocode} \cs_new:Npn \@@_remove_spaces:n #1 - { - \exp_after:wN \@@_remove_spaces:w \tl_to_str:n {#1} - \use_none:nn ? ~ - } -\cs_new:Npn \@@_remove_spaces:w #1 ~ - { #1 \@@_remove_spaces:w } + { \tl_trim_spaces:o { \tl_to_str:n {#1} } } % \end{macrocode} % \end{macro} -% \end{macro} % % \begin{macro}[EXP,pTF]{\keys_if_exist:nn} % A utility for others to see if a key exists. diff --git a/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx b/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx index 9841a478ea6..2da757dfc0b 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 2017/09/18} +% \date{Released 2017/11/14} % % \maketitle % @@ -130,7 +130,7 @@ % % \begin{function}{l3kernel.charcat} % \begin{syntax} -% \cs{l3kernel.charcat}|(|\meta{charcode}, \meta{catcode}|)| +% |l3kernel.charcat||(|\meta{charcode}, \meta{catcode}|)| % \end{syntax} % Constructs a character of \meta{charcode} and \meta{catcode} and returns % the result to \TeX{}. @@ -138,15 +138,17 @@ % % \begin{function}{l3kernel.filemdfivesum} % \begin{syntax} -% \cs{l3kernel.filemdfivesum}|(|\meta{file}|)| +% |l3kernel.filemdfivesum||(|\meta{file}|)| % \end{syntax} -% Returns the of the MD5 sum of the file contents read as bytes. If the -% \meta{file} is not found, nothing is returned with \emph{no error raised}. +% Returns the of the MD5 sum of the file contents read as bytes; note that +% the result will depend on the nature of the line endings used in the file, +% in contrast to normal \TeX{} behaviour. If the \meta{file} is not found, +% nothing is returned with \emph{no error raised}. % \end{function} % % \begin{function}{l3kernel.filemoddate} % \begin{syntax} -% \cs{l3kernel.filemoddate}|(|\meta{file}|)| +% |l3kernel.filemoddate||(|\meta{file}|)| % \end{syntax} % Returns the of the date/time of last modification of the \meta{file} in the % format |D:|\meta{year}\meta{month}\meta{day}\meta{hour}\meta{minute}^^A @@ -157,7 +159,7 @@ % % \begin{function}{l3kernel.filesize} % \begin{syntax} -% \cs{l3kernel.filesize}|(|\meta{file}|)| +% |l3kernel.filesize||(|\meta{file}|)| % \end{syntax} % Returns the size of the \meta{file} in bytes. If the \meta{file} is not % found, nothing is returned with \emph{no error raised}. @@ -165,7 +167,7 @@ % % \begin{function}{l3kernel.strcmp} % \begin{syntax} -% \cs{l3kernel.strcmp}|(|\meta{str one}, \meta{str two}|)| +% |l3kernel.strcmp||(|\meta{str one}, \meta{str two}|)| % \end{syntax} % Compares the two strings and returns |0| to \TeX{} % if the two are identical. @@ -321,12 +323,13 @@ l3kernel.charcat = charcat % Read an entire file and hash it: the hash function itself is a built-in. % As Lua is byte-based there is no work needed here in terms of UTF-8 % (see \pkg{pdftexcmds} and how it handles strings that have passed through -% \LuaTeX{}). +% \LuaTeX{}). The file is read in binary mode so that no line ending +% normalisation occurs. % \begin{macrocode} local function filemdfivesum(name) local file = kpse_find(name, "tex", true) if file then - local f = open(file, "r") + local f = open(file, "rb") if f then local data = f:read("*a") escapehex(md5_sum(data)) diff --git a/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx b/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx index 25333097495..073980e325f 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 2017/09/18} +% \date{Released 2017/11/14} % % \maketitle % @@ -755,8 +755,8 @@ % \begin{function}[updated = 2012-09-09] % {\__msg_show_item:n, \__msg_show_item:nn, \__msg_show_item_unbraced:nn} % \begin{syntax} -% \cs{__msg_show_item:n} \meta{item} -% \cs{__msg_show_item:nn} \meta{item-key} \meta{item-value} +% \cs{__msg_show_item:n} \Arg{item} +% \cs{__msg_show_item:nn} \Arg{item-key} \Arg{item-value} % \end{syntax} % Auxiliary functions used within the last argument of % \cs{__msg_show_variable:NNNnn} or \cs{__msg_show_wrap:n} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3names.dtx b/Master/texmf-dist/source/latex/l3kernel/l3names.dtx index 751b4dea1b2..cc937640a20 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 2017/09/18} +% \date{Released 2017/11/14} % % \maketitle % @@ -1130,7 +1130,48 @@ \tex_let:D \tex_italiccorrection:D \@@@@italiccorr \tex_let:D \tex_underline:D \@@@@underline % \end{macrocode} -% Some tidying up is needed for \tn[index=tracingfonts]{(pdf)tracingfonts}. Newer \LuaTeX{} has +% The \tn{shipout} primitive is particularly tricky as a number of packages +% want to hook in here. First, we see if a sufficiently-new kernel has saved +% a copy: if it has, just use that. Otherwise, we need to check each of the +% possible packages/classes that might move it: here, we are looking for those +% which do \emph{not} delay action to the \tn{AtBeginDocument} hook. (We +% cannot use \tn{primitive} a (u)\pTeX{} doesn't offer it and as that doesn't +% allow us to make a direct copy of the primitive \emph{itself}.) As we know +% that \LaTeXe{} is in use, we use it's \tn{@tfor} loop here. +% \begin{macrocode} + \etex_ifdefined:D \@@@@shipout + \tex_let:D \tex_shipout:D \@@@@shipout + \tex_fi:D + \tex_begingroup:D + \tex_edef:D \l_tmpa_tl { \tex_string:D \shipout } + \tex_edef:D \l_tmpb_tl { \tex_meaning:D \shipout } + \tex_ifx:D \l_tmpa_tl \l_tmpb_tl + \tex_else:D + \tex_expandafter:D \@tfor \tex_expandafter:D \@tempa \tex_string:D := + \CROP@shipout + \dup@shipout + \GPTorg@shipout + \LL@shipout + \mem@oldshipout + \opem@shipout + \pgfpages@originalshipout + \pr@shipout + \Shipout + \verso@orig@shipout + \do + { + \tex_edef:D \l_tmpb_tl + { \tex_expandafter:D \tex_meaning:D \@tempa } + \tex_ifx:D \l_tmpa_tl \l_tmpb_tl + \tex_global:D \tex_expandafter:D \tex_let:D + \tex_expandafter:D \tex_shipout:D \@tempa + \tex_fi:D + } + \tex_fi:D + \tex_endgroup:D +% \end{macrocode} +% Some tidying up is needed for \tn[index=tracingfonts]{(pdf)tracingfonts}. +% Newer \LuaTeX{} has % this simply as \tn{tracingfonts}, but that is overwritten by % the \LaTeXe{} kernel. So any spurious definition has to be removed, then % the real version saved either from the \pdfTeX{} name or from \LuaTeX{}. diff --git a/Master/texmf-dist/source/latex/l3kernel/l3oldmodules.dtx b/Master/texmf-dist/source/latex/l3kernel/l3oldmodules.dtx index 1fd750dd607..75527766bf7 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 2017/09/18} +% \date{Released 2017/11/14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx b/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx index e1b4e52caf2..642c030015c 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 2017/09/18} +% \date{Released 2017/11/14} % % \maketitle % @@ -679,7 +679,7 @@ % % \begin{function}[EXP]{\__prg_break_point:Nn} % \begin{syntax} -% \cs{__prg_break_point:Nn} \cs[no-index]{\meta{type}_map_break:} \meta{tokens} +% \cs{__prg_break_point:Nn} \cs[no-index]{\meta{type}_map_break:} \Arg{tokens} % \end{syntax} % Used to mark the end of a recursion or mapping: the functions % \cs[no-index]{\meta{type}_map_break:} and \cs[no-index]{\meta{type}_map_break:n} use diff --git a/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx b/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx index ea39fcc4b58..0a25ed683c7 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 2017/09/18} +% \date{Released 2017/11/14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx b/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx index e6332836e3a..a62bd7ec8ea 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 2017/09/18} +% \date{Released 2017/11/14} % % \maketitle % @@ -61,8 +61,8 @@ % therefore \emph{never} be executed directly in the code. % This would result in an endless loop! % -% They are meant to be used as delimiter in weird functions, with the most -% command use case as the `stop token' (\emph{i.e.}~\cs{q_stop}). +% They are meant to be used as delimiter in weird functions, the most +% common use case being the `stop token' (\emph{i.e.}~\cs{q_stop}). % For example, when writing a macro to parse a user-defined date % \begin{verbatim} % \date_parse:n {19/June/1981} @@ -120,7 +120,7 @@ % % \begin{variable}{\q_nil} % Quark to mark a null value in structured variables or functions. Used -% as an end delimiter when this may itself may need to be tested +% as an end delimiter when this may itself need to be tested % (in contrast to \cs{q_stop}, which is only ever used as a delimiter). % \end{variable} % @@ -134,7 +134,7 @@ % \section{Quark tests} % % The method used to define quarks means that the single token (\texttt{N}) -% tests are faster than the multi-token (\texttt{n}) tests. The later +% tests are faster than the multi-token (\texttt{n}) tests. The latter % should therefore only be used when the argument can definitely take % more than a single token. % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx b/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx index e499957216a..1d9b421c8d3 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 2017/09/18} +% \date{Released 2017/11/14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx b/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx index 6d8a0d0acdd..694f7d4c2ee 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 2017/09/18} +% \date{Released 2017/11/14} % % \maketitle % @@ -505,7 +505,8 @@ % 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 +% the \meta{tl~var.}, but this is not enforced. The assignments to +% \meta{tl~var.} are local, and one variable % mapping can be nested inside another. The \meta{items} % are returned from left to right. % \end{function} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx b/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx index 9d810aa9872..bc7f26ed868 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 2017/09/18} +% \date{Released 2017/11/14} % % \maketitle % @@ -655,7 +655,7 @@ % \begin{function}[EXP,pTF]{\skip_if_eq:nn} % \begin{syntax} % \cs{skip_if_eq_p:nn} \Arg{skipexpr_1} \Arg{skipexpr_2} -% \cs{dim_compare:nTF} +% \cs{skip_if_eq:nnTF} % ~~\Arg{skipexpr_1} \Arg{skipexpr_2} % ~~\Arg{true code} \Arg{false code} % \end{syntax} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx b/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx index 7b4c334f8a1..592046c0619 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 2017/09/18} +% \date{Released 2017/11/14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3str.dtx b/Master/texmf-dist/source/latex/l3kernel/l3str.dtx index 6b29004467d..5823e3c5c8e 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 2017/09/18} +% \date{Released 2017/11/14} % % \maketitle % @@ -76,10 +76,6 @@ % This data type simplifies comparison of variables since there are no concerns % about expansion of their contents. % -% Note that as string variables are a special case of token list variables -% the coverage of \cs[no-index]{str_\ldots{}:N} functions is somewhat smaller than -% \cs[no-index]{tl_\ldots{}:N}. -% % The functions \cs{cs_to_str:N}, \cs{tl_to_str:n}, \cs{tl_to_str:N} and % \cs{token_to_str:N} (and variants) generate strings from the appropriate % input: these are documented in \pkg{l3basics}, \pkg{l3tl} and \pkg{l3token}, @@ -148,6 +144,19 @@ % \meta{str~var_2}. % \end{function} % +% \begin{function}[added = 2017-10-08] +% { +% \str_concat:NNN, \str_concat:ccc, +% \str_gconcat:NNN, \str_gconcat:ccc +% } +% \begin{syntax} +% \cs{str_concat:NNN} \meta{str~var_1} \meta{str~var_2} \meta{str~var_3} +% \end{syntax} +% Concatenates the content of \meta{str~var_2} and \meta{str~var_3} +% together and saves the result in \meta{str~var_1}. The \meta{str~var_2} +% is placed at the left side of the new string variable. +% \end{function} +% % \section{Adding data to string variables} % % \begin{function}[added = 2015-09-18] @@ -192,6 +201,72 @@ % var} are not automatically converted to a string. % \end{function} % +% \subsection{Modifying string variables} +% +% \begin{function}[added = 2017-10-08] +% { +% \str_replace_once:Nnn, \str_replace_once:cnn, +% \str_greplace_once:Nnn, \str_greplace_once:cnn +% } +% \begin{syntax} +% \cs{str_replace_once:Nnn} \meta{str~var} \Arg{old} \Arg{new} +% \end{syntax} +% Converts the \meta{old} and \meta{new} token lists to strings, then +% replaces the first (leftmost) occurrence of \meta{old string} in the +% \meta{str~var} with \meta{new string}. +% \end{function} +% +% \begin{function}[added = 2017-10-08] +% { +% \str_replace_all:Nnn, \str_replace_all:cnn, +% \str_greplace_all:Nnn, \str_greplace_all:cnn +% } +% \begin{syntax} +% \cs{str_replace_all:Nnn} \meta{str~var} \Arg{old} \Arg{new} +% \end{syntax} +% Converts the \meta{old} and \meta{new} token lists to strings, then +% replaces all occurrences of \meta{old string} in the +% \meta{str~var} with \meta{new string}. +% As this function +% operates from left to right, the pattern \meta{old string} +% may remain after the replacement (see \cs{str_remove_all:Nn} +% for an example). +% \end{function} +% +% \begin{function}[added = 2017-10-08] +% { +% \str_remove_once:Nn, \str_remove_once:cn, +% \str_gremove_once:Nn, \str_gremove_once:cn +% } +% \begin{syntax} +% \cs{str_remove_once:Nn} \meta{str~var} \Arg{token list} +% \end{syntax} +% Converts the \meta{token list} to a \meta{string} then +% removes the first (leftmost) occurrence of \meta{string} from the +% \meta{str~var}. +% \end{function} +% +% \begin{function}[added = 2017-10-08] +% { +% \str_remove_all:Nn, \str_remove_all:cn, +% \str_gremove_all:Nn, \str_gremove_all:cn +% } +% \begin{syntax} +% \cs{str_remove_all:Nn} \meta{str~var} \Arg{token list} +% \end{syntax} +% Converts the \meta{token list} to a \meta{string} then +% removes all occurrences of \meta{string} from the +% \meta{str~var}. +% As this function +% operates from left to right, the pattern \meta{string} +% may remain after the removal, for instance, +% \begin{quote} +% \cs{str_set:Nn} \cs{l_tmpa_str} |{abbccd}| +% \cs{str_remove_all:Nn} \cs{l_tmpa_str} |{bc}| +% \end{quote} +% results in \cs{l_tmpa_str} containing \texttt{abcd}. +% \end{function} +% % \subsection{String conditionals} % % \begin{function}[EXP, pTF, added = 2015-09-18] @@ -221,7 +296,8 @@ % \cs{str_if_eq:NNTF} \meta{str~var_1} \meta{str~var_2} \Arg{true code} \Arg{false code} % \end{syntax} % Compares the content of two \meta{str variables} and -% is logically \texttt{true} if the two contain the same characters. +% is logically \texttt{true} if the two contain the same characters +% in the same order. % \end{function} % % \begin{function}[EXP,pTF] @@ -234,7 +310,8 @@ % \cs{str_if_eq:nnTF} \Arg{tl_1} \Arg{tl_2} \Arg{true code} \Arg{false code} % \end{syntax} % Compares the two \meta{token lists} on a character by character -% basis, and is \texttt{true} if the two lists contain the same +% basis (namely after converting them to strings), +% and is \texttt{true} if the two \meta{strings} contain the same % characters in the same order. Thus for example % \begin{verbatim} % \str_if_eq_p:no { abc } { \tl_to_str:n { abc } } @@ -247,8 +324,9 @@ % \cs{str_if_eq_x_p:nn} \Arg{tl_1} \Arg{tl_2} % \cs{str_if_eq_x:nnTF} \Arg{tl_1} \Arg{tl_2} \Arg{true code} \Arg{false code} % \end{syntax} -% Compares the full expansion of two \meta{token lists} on a character by -% character basis, and is \texttt{true} if the two lists contain the same +% Fully expands the two \meta{token lists} and converts them to \meta{strings}, then +% compares these on a character by character basis: +% it is \texttt{true} if the two \meta{strings} contain the same % characters in the same order. Thus for example % \begin{verbatim} % \str_if_eq_x_p:nn { abc } { \tl_to_str:n { abc } } @@ -256,6 +334,23 @@ % is logically \texttt{true}. % \end{function} % +% \begin{function}[TF, added = 2017-10-08]{\str_if_in:Nn, \str_if_in:cn} +% \begin{syntax} +% \cs{str_if_in:NnTF} \meta{str~var} \Arg{token list} \Arg{true code} \Arg{false code} +% \end{syntax} +% Converts the \meta{token list} to a \meta{string} and +% tests if that \meta{string} is found in the content of the +% \meta{str~var}. +% \end{function} +% +% \begin{function}[TF, added = 2017-10-08]{\str_if_in:nn} +% \begin{syntax} +% \cs{str_if_in:nnTF} \meta{tl_1} \Arg{tl_2} \Arg{true code} \Arg{false code} +% \end{syntax} +% Converts both \meta{token lists} to \meta{strings} and +% tests whether \meta{string_2} is found inside \meta{string_1}. +% \end{function} +% % \begin{function}[added = 2013-07-24, updated = 2015-02-28, EXP, noTF] % {\str_case:nn, \str_case:on, \str_case:nV, \str_case:nv} % \begin{syntax} @@ -269,8 +364,9 @@ % ~~\Arg{true code} % ~~\Arg{false code} % \end{syntax} -% This function compares the \meta{test string} in turn with each -% of the \meta{string cases}. If the two are equal (as described for +% Compares the \meta{test string} in turn with each +% of the \meta{string cases} (all token lists are converted to strings). +% If the two are equal (as described for % \cs{str_if_eq:nnTF}) then the associated \meta{code} is left in the % input stream and other cases are discarded. If any of the % cases are matched, the \meta{true code} is also inserted into the @@ -292,8 +388,9 @@ % ~~\Arg{true code} % ~~\Arg{false code} % \end{syntax} -% This function compares the full expansion of the \meta{test string} -% in turn with the full expansion of the \meta{string cases}. If the two +% Compares the full expansion of the \meta{test string} +% in turn with the full expansion of the \meta{string cases} +% (all token lists are converted to strings). If the two % full expansions are equal (as described for \cs{str_if_eq:nnTF}) then the % associated \meta{code} is left in the input stream % and other cases are discarded. If any of the @@ -307,6 +404,126 @@ % not be used within this string. % \end{function} % +% \section{Mapping to strings} +% +% \begin{function}[added = 2017-10-08, rEXP] +% {\str_map_function:NN, \str_map_function:cN} +% \begin{syntax} +% \cs{str_map_function:NN} \meta{str~var} \meta{function} +% \end{syntax} +% Applies \meta{function} to every \meta{character} in the \meta{str~var}. +% See also \cs{str_map_function:nN}. +% \end{function} +% +% \begin{function}[added = 2017-10-08, rEXP] +% {\str_map_function:nN} +% \begin{syntax} +% \cs{str_map_function:nN} \Arg{token list} \meta{function} +% \end{syntax} +% Converts the \meta{token list} to a \meta{string} then +% applies \meta{function} to every \meta{character} in the \meta{string}. +% See also \cs{str_map_function:NN}. +% \end{function} +% +% \begin{function}[added = 2017-10-08] +% {\str_map_inline:Nn, \str_map_inline:cn} +% \begin{syntax} +% \cs{str_map_inline:Nn} \meta{str~var} \Arg{inline function} +% \end{syntax} +% Applies the \meta{inline function} to every \meta{character} in the +% \meta{str~var}. The \meta{inline function} should consist of code which +% receives the \meta{character} as |#1|. One in line mapping can be nested +% inside another. See also \cs{str_map_function:NN}. +% \end{function} +% +% \begin{function}[added = 2017-10-08] +% {\str_map_inline:nn} +% \begin{syntax} +% \cs{str_map_inline:nn} \Arg{token list} \Arg{inline function} +% \end{syntax} +% Converts the \meta{token list} to a \meta{string} then +% applies the \meta{inline function} to every \meta{character} in the +% \meta{string}. The \meta{inline function} should consist of code which +% receives the \meta{character} as |#1|. One in line mapping can be nested +% inside another. See also \cs{str_map_function:NN}. +% \end{function} +% +% \begin{function}[added = 2017-10-08] +% {\str_map_variable:NNn, \str_map_variable:cNn} +% \begin{syntax} +% \cs{str_map_variable:NNn} \meta{str~var} \meta{variable} \Arg{function} +% \end{syntax} +% Applies the \meta{function} to every \meta{character} in +% the \meta{str~var}. The \meta{function} should consist of code +% which receives the \meta{character} stored in the \meta{variable}. +% One variable mapping can be nested inside another. See also +% \cs{str_map_inline:Nn}. +% \end{function} +% +% \begin{function}[added = 2017-10-08] +% {\str_map_variable:nNn} +% \begin{syntax} +% \cs{str_map_variable:nNn} \Arg{token list} \meta{variable} \Arg{function} +% \end{syntax} +% Converts the \meta{token list} to a \meta{string} then +% applies the \meta{function} to every \meta{character} in the \meta{string}. +% The \meta{function} should consist of code +% which receives the \meta{character} stored in the \meta{variable}. +% One variable mapping can be nested inside another. See also +% \cs{str_map_inline:Nn}. +% \end{function} +% +% \begin{function}[added = 2017-10-08, rEXP]{\str_map_break:} +% \begin{syntax} +% \cs{str_map_break:} +% \end{syntax} +% Used to terminate a \cs[no-index]{str_map_\ldots} function before all +% characters in the \meta{string} have been processed. This +% normally takes place within a conditional statement, for example +% \begin{verbatim} +% \str_map_inline:Nn \l_my_str +% { +% \str_if_eq:nnT { #1 } { bingo } { \str_map_break: } +% % Do something useful +% } +% \end{verbatim} +% See also \cs{str_map_break:n}. +% Use outside of a \cs[no-index]{str_map_\ldots} scenario leads to low +% level \TeX{} errors. +% \begin{texnote} +% When the mapping is broken, additional tokens may be inserted by the +% internal macro \cs{__prg_break_point:Nn} before continuing with the +% code that follows the loop. +% This depends on the design of the mapping function. +% \end{texnote} +% \end{function} +% +% \begin{function}[added = 2017-10-08, rEXP]{\str_map_break:n} +% \begin{syntax} +% \cs{str_map_break:n} \Arg{tokens} +% \end{syntax} +% Used to terminate a \cs[no-index]{str_map_\ldots} function before all +% characters in the \meta{string} have been processed, inserting +% the \meta{tokens} after the mapping has ended. This +% normally takes place within a conditional statement, for example +% \begin{verbatim} +% \str_map_inline:Nn \l_my_str +% { +% \str_if_eq:nnT { #1 } { bingo } +% { \str_map_break:n { <tokens> } } +% % Do something useful +% } +% \end{verbatim} +% Use outside of a \cs[no-index]{str_map_\ldots} scenario leads to low +% level \TeX{} errors. +% \begin{texnote} +% When the mapping is broken, additional tokens may be inserted by the +% internal macro \cs{__prg_break_point:Nn} before the \meta{tokens} are +% inserted into the input stream. +% This depends on the design of the mapping function. +% \end{texnote} +% \end{function} +% % \section{Working with the content of strings} % % \begin{function}[EXP, added = 2015-09-18]{\str_use:N, \str_use:c} @@ -465,7 +682,7 @@ % These functions should \emph{not} be used for % \begin{itemize} % \item Caseless comparisons: use \cs{str_fold_case:n} for this -% situation (case folding is district from lower casing). +% situation (case folding is distinct from lower casing). % \item Case changing text for typesetting: see the % \cs[index=tl_lower_case:n]{tl_lower_case:n(n)}, % \cs[index=tl_upper_case:n]{tl_upper_case:n(n)} and @@ -672,6 +889,8 @@ % \str_set_eq:NN, \str_set_eq:cN, \str_set_eq:Nc, \str_set_eq:cc, % \str_gset_eq:NN, \str_gset_eq:cN, \str_gset_eq:Nc, \str_gset_eq:cc % } +% \begin{macro} +% {\str_concat:NNN, \str_concat:ccc, \str_gconcat:NNN, \str_gconcat:ccc} % A string is simply a token list. The full mapping system isn't set up % yet so do things by hand. % \begin{macrocode} @@ -698,9 +917,14 @@ \cs_new_eq:NN \str_gset_eq:NN \tl_gset_eq:NN \cs_generate_variant:Nn \str_set_eq:NN { c , Nc , cc } \cs_generate_variant:Nn \str_gset_eq:NN { c , Nc , cc } +\cs_new_eq:NN \str_concat:NNN \tl_concat:NNN +\cs_new_eq:NN \str_gconcat:NNN \tl_gconcat:NNN +\cs_generate_variant:Nn \str_concat:NNN { ccc } +\cs_generate_variant:Nn \str_gconcat:NNN { ccc } % \end{macrocode} % \end{macro} % \end{macro} +% \end{macro} % % \begin{macro} % { @@ -745,6 +969,103 @@ % \end{macrocode} % \end{macro} % +% \subsection{Modifying string variables} +% +% \begin{macro} +% { +% \str_replace_all:Nnn, \str_replace_all:cnn, +% \str_greplace_all:Nnn, \str_greplace_all:cnn, +% \str_replace_once:Nnn, \str_replace_once:cnn, +% \str_greplace_once:Nnn, \str_greplace_once:cnn +% } +% \begin{macro}[aux]{\@@_replace:NNNnn} +% \begin{macro}[aux]{\@@_replace_aux:NNNnnn} +% \begin{macro}[aux]{\@@_replace_next:w} +% Start by applying \cs{tl_to_str:n} to convert the old and new token +% lists to strings, and also apply \cs{tl_to_str:N} to avoid any +% issues if we are fed a token list variable. Then the code is a much +% simplified version of the token list code because neither the +% delimiter nor the replacement can contain macro parameters or +% braces. The delimiter \cs{q_mark} cannot appear in the string to +% edit so it is used in all cases. Some |x|-expansion is unnecessary. +% There is no need to avoid losing braces nor to protect against +% expansion. The ending code is much simplified and does not need to +% hide in braces. +% \begin{macrocode} +\cs_new_protected:Npn \str_replace_once:Nnn + { \@@_replace:NNNnn \prg_do_nothing: \tl_set:Nx } +\cs_new_protected:Npn \str_greplace_once:Nnn + { \@@_replace:NNNnn \prg_do_nothing: \tl_gset:Nx } +\cs_new_protected:Npn \str_replace_all:Nnn + { \@@_replace:NNNnn \@@_replace_next:w \tl_set:Nx } +\cs_new_protected:Npn \str_greplace_all:Nnn + { \@@_replace:NNNnn \@@_replace_next:w \tl_gset:Nx } +\cs_generate_variant:Nn \str_replace_once:Nnn { c } +\cs_generate_variant:Nn \str_greplace_once:Nnn { c } +\cs_generate_variant:Nn \str_replace_all:Nnn { c } +\cs_generate_variant:Nn \str_greplace_all:Nnn { c } +\cs_new_protected:Npn \@@_replace:NNNnn #1#2#3#4#5 + { + \tl_if_empty:nTF {#4} + { + \__msg_kernel_error:nnx { kernel } { empty-search-pattern } {#5} + } + { + \use:x + { + \exp_not:n { \@@_replace_aux:NNNnnn #1 #2 #3 } + { \tl_to_str:N #3 } + { \tl_to_str:n {#4} } { \tl_to_str:n {#5} } + } + } + } +\cs_new_protected:Npn \@@_replace_aux:NNNnnn #1#2#3#4#5#6 + { + \cs_set:Npn \@@_replace_next:w ##1 #5 { ##1 #6 #1 } + #2 #3 + { + \@@_replace_next:w + #4 + \use_none_delimit_by_q_stop:w + #5 + \q_stop + } + } +\cs_new_eq:NN \@@_replace_next:w ? +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\str_remove_once:Nn, \str_remove_once:cn} +% \begin{macro}{\str_gremove_once:Nn, \str_gremove_once:cn} +% Removal is just a special case of replacement. +% \begin{macrocode} +\cs_new_protected:Npn \str_remove_once:Nn #1#2 + { \str_replace_once:Nnn #1 {#2} { } } +\cs_new_protected:Npn \str_gremove_once:Nn #1#2 + { \str_greplace_once:Nnn #1 {#2} { } } +\cs_generate_variant:Nn \str_remove_once:Nn { c } +\cs_generate_variant:Nn \str_gremove_once:Nn { c } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\str_remove_all:Nn, \str_remove_all:cn} +% \begin{macro}{\str_gremove_all:Nn, \str_gremove_all:cn} +% Removal is just a special case of replacement. +% \begin{macrocode} +\cs_new_protected:Npn \str_remove_all:Nn #1#2 + { \str_replace_all:Nnn #1 {#2} { } } +\cs_new_protected:Npn \str_gremove_all:Nn #1#2 + { \str_greplace_all:Nnn #1 {#2} { } } +\cs_generate_variant:Nn \str_remove_all:Nn { c } +\cs_generate_variant:Nn \str_gremove_all:Nn { c } +% \end{macrocode} +% \end{macro} +% \end{macro} +% % \subsection{String comparisons} % % \begin{macro}[pTF, EXP] @@ -871,6 +1192,30 @@ % \end{macrocode} % \end{macro} % +% \begin{macro}[TF]{\str_if_in:Nn, \str_if_in:cn \str_if_in:nn} +% Everything here needs to be detokenized but beyond that it is a +% simple token list test. It would be faster to fine-tune the |T|, +% |F|, |TF| variants by calling the appropriate variant of +% \cs{tl_if_in:nnTF} directly but that takes more code. +% \begin{macrocode} +\prg_new_protected_conditional:Npnn \str_if_in:Nn #1#2 { T , F , TF } + { + \use:x + { \tl_if_in:nnTF { \tl_to_str:N #1 } { \tl_to_str:n {#2} } } + { \prg_return_true: } { \prg_return_false: } + } +\cs_generate_variant:Nn \str_if_in:NnT { c } +\cs_generate_variant:Nn \str_if_in:NnF { c } +\cs_generate_variant:Nn \str_if_in:NnTF { c } +\prg_new_protected_conditional:Npnn \str_if_in:nn #1#2 { T , F , TF } + { + \use:x + { \tl_if_in:nnTF { \tl_to_str:n {#1} } { \tl_to_str:n {#2} } } + { \prg_return_true: } { \prg_return_false: } + } +% \end{macrocode} +% \end{macro} +% % \begin{macro}[EXP, noTF] % {\str_case:nn, \str_case:on, \str_case:nV, \str_case:nv, \str_case_x:nn} % \begin{macro}[EXP, aux]{\@@_case:nnTF, \@@_case_x:nnTF} @@ -945,6 +1290,71 @@ % \end{macro} % \end{macro} % +% \subsection{Mapping to strings} +% +% \begin{macro}[rEXP]{\str_map_function:NN, \str_map_function:cN} +% \begin{macro}{\str_map_inline:Nn, \str_map_inline:cn} +% \begin{macro}{\str_map_variable:NNn, \str_map_variable:cNn} +% \begin{macro}{\str_map_break:} +% \begin{macro}{\str_map_break:n} +% Slightly awkward as we need to ensure detokenization: beyond that +% just the usual token list mappings. +% \begin{macrocode} +\cs_new:Npn \str_map_function:nN #1#2 + { + \exp_after:wN \@@_map_function:Nn \exp_after:wN #2 + \etex_detokenize:n {#1} + \q_recursion_tail + \__prg_break_point:Nn \str_map_break: { } + } +\cs_new:Npn \str_map_function:NN + { \exp_args:No \str_map_function:nN } +\cs_new:Npn \@@_map_function:Nn #1#2 + { + \__quark_if_recursion_tail_break:nN {#2} \str_map_break: + #1 {#2} \@@_map_function:Nn #1 + } +\cs_generate_variant:Nn \str_map_function:NN { c } +\cs_new_protected:Npn \str_map_inline:nn #1#2 + { + \int_gincr:N \g__prg_map_int + \cs_gset_protected:cpn + { __prg_map_ \int_use:N \g__prg_map_int :w } ##1 {#2} + \exp_args:Nc \@@_map_function:Nn + { __prg_map_ \int_use:N \g__prg_map_int :w } + #1 \q_recursion_tail + \__prg_break_point:Nn \str_map_break: { \int_gdecr:N \g__prg_map_int } + } +\cs_new_protected:Npn \str_map_inline:Nn + { \exp_args:No \str_map_inline:nn } +\cs_generate_variant:Nn \str_map_inline:Nn { c } +\cs_new_protected:Npn \str_map_variable:nNn #1#2#3 + { + \@@_map_variable:Nnn #2 {#3} #1 + \q_recursion_tail + \__prg_break_point:Nn \str_map_break: { } + } +\cs_new_protected:Npn \str_map_variable:NNn + { \exp_args:No \str_map_variable:nNn } +\cs_new_protected:Npn \@@_map_variable:Nnn #1#2#3 + { + \str_set:Nn #1 {#3} + \__quark_if_recursion_tail_break:NN #1 \str_map_break: + \use:n {#2} + \@@_map_variable:Nnn #1 {#2} + } +\cs_generate_variant:Nn \str_map_variable:NNn { c } +\cs_new:Npn \str_map_break: + { \__prg_map_break:Nn \str_map_break: { } } +\cs_new:Npn \str_map_break:n + { \__prg_map_break:Nn \str_map_break: } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% % \subsection{Accessing specific characters in a string} % % \begin{macro}[EXP, int]{\@@_to_other:n} @@ -965,7 +1375,7 @@ } \group_begin: \tex_lccode:D `\* = `\ % -\tex_lccode:D `\A = `\A +\tex_lccode:D `\A = `\A % \tex_lowercase:D { \group_end: @@ -998,7 +1408,7 @@ } \group_begin: \tex_lccode:D `\* = `\ % -\tex_lccode:D `\A = `\A +\tex_lccode:D `\A = `\A % \tex_lowercase:D { \group_end: @@ -1632,7 +2042,7 @@ \tex_catcode:D `\# = 12 \scan_stop: \tex_catcode:D `\ = 10 \scan_stop: \tex_openin:D \g_@@_data_ior = #1 \scan_stop: - \cs_if_exist:NT \utex_char:D + \cs_if_exist:NT \utex_char:D { \@@_map_loop: } \tex_closein:D \g_@@_data_ior \group_end: @@ -1688,7 +2098,7 @@ { \utex_char:D "#5 } } } -% \end{macrocode} +% \end{macrocode} % Parse the main Unicode data file for title case exceptions (the one-to-one % lower and upper case mappings it contains are all be covered by the \TeX{} % data). @@ -1710,7 +2120,7 @@ } } \@@_map_inline:n { UnicodeData.txt } -% \end{macrocode} +% \end{macrocode} % The set up for case folding is in two parts. For the basic (core) mappings, % folding is the same as lower casing in most positions so only store % the differences. For the more complex foldings, always store the result, diff --git a/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx b/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx index 9cc690459ff..46ee4aabd32 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 2017/09/18} +% \date{Released 2017/11/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 18fccde9344..19c6466cb82 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 2017/09/18} +% \date{Released 2017/11/14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx b/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx index 4208ba085be..3a0ad3d7ad1 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx @@ -42,7 +42,7 @@ % }^^A % } % -% \date{Released 2017/09/18} +% \date{Released 2017/11/14} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx b/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx index 4613e18fda0..5da866311bb 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 2017/09/18} +% \date{Released 2017/11/14} % % \maketitle % @@ -59,9 +59,9 @@ % \begin{verbatim} % \foo:N \l_some_tl % \end{verbatim} -% In both cases, functions are available to test an manipulate the lists +% In both cases, functions are available to test and manipulate the lists % of tokens, and these have the module prefix \texttt{tl}. -% In many cases, function which can be applied to token list variables +% In many cases, functions which can be applied to token list variables % are paired with similar functions for application to explicit lists % of tokens: the two \enquote{views} of a token list are therefore collected % together here. @@ -433,6 +433,17 @@ % (begin-group) or $2$ (end-group), and tokens with category code $6$). % \end{function} % +% \begin{function}[added = 2017-11-14, EXP,pTF]{\tl_if_novalue:n} +% \begin{syntax} +% \cs{tl_if_novalue_p:n} \Arg{token list} +% \cs{tl_if_novalue:nTF} \Arg{token list} \Arg{true code} \Arg{false code} +% \end{syntax} +% Tests if the \meta{token list} is exactly equal to the special +% \cs{c_novalue_tl} marker. This function is indented to allow construction +% of flexible document interface structures in which missing optional +% arguments are detected. +% \end{function} +% % \begin{function}[updated = 2011-08-13, EXP,pTF] % {\tl_if_single:N, \tl_if_single:c} % \begin{syntax} @@ -498,7 +509,7 @@ % % \begin{function}[updated = 2012-06-29, rEXP]{\tl_map_function:nN} % \begin{syntax} -% \cs{tl_map_function:nN} \meta{token list} \meta{function} +% \cs{tl_map_function:nN} \Arg{token list} \meta{function} % \end{syntax} % Applies \meta{function} to every \meta{item} in the \meta{token list}, % The \meta{function} receives one argument for each iteration. @@ -520,7 +531,7 @@ % % \begin{function}[updated = 2012-06-29]{\tl_map_inline:nn} % \begin{syntax} -% \cs{tl_map_inline:nn} \meta{token list} \Arg{inline function} +% \cs{tl_map_inline:nn} \Arg{token list} \Arg{inline function} % \end{syntax} % Applies the \meta{inline function} to every \meta{item} stored within the % \meta{token list}. The \meta{inline function} should consist of code which @@ -542,7 +553,7 @@ % % \begin{function}[updated = 2012-06-29]{\tl_map_variable:nNn} % \begin{syntax} -% \cs{tl_map_variable:nNn} \meta{token list} \meta{variable} \Arg{function} +% \cs{tl_map_variable:nNn} \Arg{token list} \meta{variable} \Arg{function} % \end{syntax} % Applies the \meta{function} to every \meta{item} stored % within the \meta{token list}. The \meta{function} should consist of code @@ -1003,7 +1014,7 @@ % % \begin{function}[updated = 2015-08-07]{\tl_show:n} % \begin{syntax} -% \cs{tl_show:n} \meta{token list} +% \cs{tl_show:n} \Arg{token list} % \end{syntax} % Displays the \meta{token list} on the terminal. % \begin{texnote} @@ -1034,6 +1045,21 @@ % Constant that is always empty. % \end{variable} % +% \begin{variable}[added = 2017-11-14]{\c_novalue_tl} +% A marker for the absence of an argument. This constant |tl| can safely +% be typeset (\emph{cf.}~|\q_nil|), with the result being |-NoValue-|. +% It is important to note that \cs{c_novalue_tl} is constructed such that it +% will \emph{not} match the simple text input |-NoValue-|, \emph{i.e.} +% that +% \begin{verbatim} +% \tl_if_eq:VnTF \c_novalue_tl { -NoValue- } +% \end{verbatim} +% is logically \texttt{false}. The \cs{c_novalue_tl} marker is intended for +% use in creating document-level interfaces, where it serves as an indicator +% that an (optional) argument was omitted. In particular, it is distinct +% from a simple empty |tl|. +% \end{variable} +% % \begin{variable}{\c_space_tl} % An explicit space character contained in a token list (compare this with % \cs{c_space_token}). For use where an explicit space is required. @@ -1227,6 +1253,22 @@ % \end{macrocode} % \end{variable} % +% \begin{variable}{\c_novalue_tl} +% A special marker: as we don't have |\char_generate:nn| yet, has to be +% created the old-fashioned way. +% \begin{macrocode} +\group_begin: +\tex_lccode:D `A = `- +\tex_lccode:D `N = `N +\tex_lccode:D `V = `V +\tex_lowercase:D + { + \group_end: + \tl_const:Nn \c_novalue_tl { ANoValue- } + } +% \end{macrocode} +% \end{variable} +% % \begin{variable}{\c_space_tl} % A space as a token list (as opposed to as a character). % \begin{macrocode} @@ -2035,6 +2077,33 @@ % \end{macrocode} % \end{macro} % +% \begin{macro}[TF, EXP]{\tl_if_novalue:n} +% \begin{macro}[EXP, aux]{\@@_if_novalue:w} +% Tests for |-NoValue-|: this is similar to \cs{tl_if_in:nn} but set +% up to be expandable and to check the value exactly. The question +% mark prevents the auxiliary from losing braces. +% \begin{macrocode} +\use:x + { + \prg_new_conditional:Npnn \exp_not:N \tl_if_novalue:n ##1 + { T , F , TF } + { + \exp_not:N \str_if_eq:onTF + { + \exp_not:N \@@_if_novalue:w ? ##1 { } + \c_novalue_tl + } + { ? { } \c_novalue_tl } + { \exp_not:N \prg_return_true: } + { \exp_not:N \prg_return_false: } + } + \cs_new:Npn \exp_not:N \@@_if_novalue:w ##1 \c_novalue_tl + {##1} + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% % \begin{macro}[EXP,pTF]{\tl_if_single:N} % Expand the token list and feed it to \cs{tl_if_single:n}. % \begin{macrocode} @@ -2328,7 +2397,7 @@ % \end{macro} % \end{macro} % -% \begin{macro}{\tl_trim_spaces:n} +% \begin{macro}{\tl_trim_spaces:n, \tl_trim_spaces:o} % \begin{macro} % { % \tl_trim_spaces:N, \tl_trim_spaces:c, @@ -2344,6 +2413,7 @@ % \begin{macrocode} \cs_new:Npn \tl_trim_spaces:n #1 { \@@_trim_spaces:nn { \q_mark #1 } \exp_not:o } +\cs_generate_variant:Nn \tl_trim_spaces:n { o } \cs_new_protected:Npn \tl_trim_spaces:N #1 { \tl_set:Nx #1 { \exp_args:No \tl_trim_spaces:n {#1} } } \cs_new_protected:Npn \tl_gtrim_spaces:N #1 diff --git a/Master/texmf-dist/source/latex/l3kernel/l3token.dtx b/Master/texmf-dist/source/latex/l3kernel/l3token.dtx index 55f5805e538..34c03120b63 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 2017/09/18} +% \date{Released 2017/11/14} % % \maketitle % @@ -930,7 +930,7 @@ % % These functions decompose \TeX{} macros into their constituent % parts: if the \meta{token} passed is not a macro then no decomposition -% can occur. In the later case, all three functions leave \cs{scan_stop:} +% can occur. In the latter case, all three functions leave \cs{scan_stop:} % in the input stream. % % \begin{function}[EXP]{\token_get_arg_spec:N} diff --git a/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx b/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx index 3c7709fe63b..98796da20e7 100644 --- a/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx +++ b/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx @@ -23,8 +23,8 @@ %<*driver|package> % The version of expl3 required is tested as early as possible, as % some really old versions do not define \ProvidesExplPackage. -\RequirePackage{expl3}[2017/09/18] -%<package>\@ifpackagelater{expl3}{2017/09/18} +\RequirePackage{expl3}[2017/11/14] +%<package>\@ifpackagelater{expl3}{2017/11/14} %<package> {} %<package> {% %<package> \PackageError{l3keys2e}{Support package l3kernel too old} @@ -60,7 +60,7 @@ % }^^A % } % -% \date{Released 2017/09/18} +% \date{Released 2017/11/14} % % \maketitle % @@ -131,7 +131,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{l3keys2e}{2017/09/18}{} +\ProvidesExplPackage{l3keys2e}{2017/11/14}{} {LaTeX2e option processing using LaTeX3 keys} % \end{macrocode} % diff --git a/Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx b/Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx index 7d0787fefa6..3da5aa06b24 100644 --- a/Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx +++ b/Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx @@ -23,8 +23,8 @@ %<*driver|package> % The version of expl3 required is tested as early as possible, as % some really old versions do not define \ProvidesExplPackage. -\RequirePackage{expl3}[2017/09/18] -%<package>\@ifpackagelater{expl3}{2017/09/18} +\RequirePackage{expl3}[2017/11/14] +%<package>\@ifpackagelater{expl3}{2017/11/14} %<package> {} %<package> {% %<package> \PackageError{xfp}{Support package l3kernel too old} @@ -62,7 +62,7 @@ % }^^A % } % -% \date{Released 2017/09/18} +% \date{Released 2017/11/14} % % \maketitle % @@ -159,7 +159,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{xfp}{2017/09/18}{} +\ProvidesExplPackage{xfp}{2017/11/14}{} {L3 Floating point unit} % \end{macrocode} % diff --git a/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx b/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx index b448459147d..f93ccd152a8 100644 --- a/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx +++ b/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx @@ -24,8 +24,8 @@ %<*driver|package> % The version of expl3 required is tested as early as possible, as % some really old versions do not define \ProvidesExplPackage. -\RequirePackage{expl3}[2017/09/18] -%<package>\@ifpackagelater{expl3}{2017/09/18} +\RequirePackage{expl3}[2017/11/14] +%<package>\@ifpackagelater{expl3}{2017/11/14} %<package> {} %<package> {% %<package> \PackageError{xfrac}{Support package l3kernel too old} @@ -63,7 +63,7 @@ % }^^A % } % -% \date{Released 2017/09/18} +% \date{Released 2017/11/14} % % \maketitle % @@ -533,7 +533,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{xfrac}{2017/09/18}{} +\ProvidesExplPackage{xfrac}{2017/11/14}{} {L3 Experimental split-level fractions} % \end{macrocode} % diff --git a/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx b/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx index 30b8ff8abd8..3727f843911 100644 --- a/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx +++ b/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx @@ -27,8 +27,8 @@ %<*driver|package> % The version of expl3 required is tested as early as possible, as % some really old versions do not define \ProvidesExplPackage. -\RequirePackage{expl3}[2017/09/18] -%<package>\@ifpackagelater{expl3}{2017/09/18} +\RequirePackage{expl3}[2017/11/14] +%<package>\@ifpackagelater{expl3}{2017/11/14} %<package> {} %<package> {% %<package> \PackageError{xparse}{Support package l3kernel too old} @@ -67,7 +67,7 @@ % }^^A % } % -% \date{Released 2017/09/18} +% \date{Released 2017/11/14} % % \maketitle % @@ -776,22 +776,12 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{xparse}{2017/09/18}{} +\ProvidesExplPackage{xparse}{2017/11/14}{} {L3 Experimental document command parser} % \end{macrocode} % % \subsection{Variables and constants} % -% \begin{variable}{\c_@@_no_value_tl} -% A special \enquote{awkward} token list: it contains two |-|~tokens with -% different category codes. This is used as the marker for nothing being -% returned when no optional argument is given. -% \begin{macrocode} -\tl_const:Nx \c_@@_no_value_tl - { \char_generate:nn { `\- } { 11 } NoValue- } -% \end{macrocode} -% \end{variable} -% % \begin{variable}{\c_@@_special_chars_seq} % In \IniTeX{} mode, we store special characters in a sequence. % Maybe |$| or |&| will have to be added later. @@ -1357,7 +1347,7 @@ { \exp_not:N \exp_not:n { - \@@_if_no_value:nTF {#2} + \tl_if_novalue:nTF {#2} { \exp_not:o {#3} } { \exp_not:n { ## #1 } } } @@ -1388,7 +1378,7 @@ \cs_new_protected:Npn \@@_args_process_loop:nn #1#2 { \tl_set:Nn \ProcessedArgument {#1} - \@@_if_no_value:nF {#1} + \tl_if_novalue:nF {#1} { \tl_map_function:nN {#2} \@@_args_process_aux:n } \tl_put_right:No \l_@@_args_ii_tl { \exp_after:wN { \ProcessedArgument } } @@ -1461,7 +1451,7 @@ } \cs_new:Npn \@@_end_expandable_defaults:nnw #1#2 { - \@@_if_no_value:nTF {#2} + \tl_if_novalue:nTF {#2} { \exp_args:No \@@_end_expandable_defaults:nw {#1} } { \@@_end_expandable_defaults:nw {#2} } } @@ -1617,7 +1607,7 @@ \cs_new_protected:Npn \@@_normalize_type_s:w { \@@_normalize_type_t:w * } } -\exp_args:No \@@_tmp:w { \c_@@_no_value_tl } +\exp_args:No \@@_tmp:w { \c_novalue_tl } % \end{macrocode} % \end{macro} % @@ -2145,7 +2135,7 @@ \cs_new_protected:Npn \@@_add_type_v:w { \@@_flush_m_args: - \exp_args:No \@@_add_default:n \c_@@_no_value_tl + \exp_args:No \@@_add_default:n \c_novalue_tl \@@_add_grabber_mandatory:N v \@@_prepare_signature:N } @@ -2222,16 +2212,16 @@ % \begin{macro}{\@@_add_default:n, \@@_add_default:, \@@_add_default_E:nn} % Store the default value of an argument, or rather code that gives % that default value (it may involve other arguments). This is -% \cs{c_@@_no_value_tl} for arguments with no actual default or with +% \cs{c_novalue_tl} for arguments with no actual default or with % default |-NoValue-|; and (in a brace group) \cs{prg_do_nothing:} % followed by a default value for others. For \texttt{E}-type -% arguments, pad the defaults |#2| with some \cs{c_@@_no_value_tl} +% arguments, pad the defaults |#2| with some \cs{c_novalue_tl} % until there are as many as embellishments~|#1|. These functions are % also used when defining expandable commands. % \begin{macrocode} \cs_new_protected:Npn \@@_add_default:n #1 { - \@@_if_no_value:nTF {#1} + \tl_if_novalue:nTF {#1} { \@@_add_default: } { \int_incr:N \l_@@_current_arg_int @@ -2242,7 +2232,7 @@ \cs_new_protected:Npn \@@_add_default: { \int_incr:N \l_@@_current_arg_int - \tl_put_right:Nn \l_@@_defaults_tl { \c_@@_no_value_tl } + \tl_put_right:Nn \l_@@_defaults_tl { \c_novalue_tl } } \cs_new_protected:Npn \@@_add_default_E:nn #1#2 { @@ -2350,7 +2340,7 @@ { \exp_not:o \l_@@_tmpb_tl } { \prg_replicate:nn { \tl_count:n {#1} } - { { \c_@@_no_value_tl } } + { { \c_novalue_tl } } } } \@@_prepare_signature:N @@ -2544,7 +2534,7 @@ \@@_grab_D_aux:NNnN #1#2 {#3} #4 \use:c { peek_meaning_remove #5 :NTF } #1 { \@@_grab_D_call:Nw #1 } - { \@@_add_arg:o \c_@@_no_value_tl } + { \@@_add_arg:o \c_novalue_tl } } % \end{macrocode} % Inside the \enquote{standard} grabber, there is a test to see if the @@ -2729,7 +2719,7 @@ \tl_map_inline:nn {#1} { \prop_get:NnNF \l_@@_tmp_prop {####1} \l_@@_tmpb_tl - { \tl_set_eq:NN \l_@@_tmpb_tl \c_@@_no_value_tl } + { \tl_set_eq:NN \l_@@_tmpb_tl \c_novalue_tl } \tl_put_right:Nx \l_@@_args_tl { { \exp_not:V \l_@@_tmpb_tl } } } @@ -2782,7 +2772,7 @@ { \@@_add_arg:n {##1} } \use:c { peek_meaning #3 :NTF } \c_group_begin_token { \l_@@_fn_tl } - { \@@_add_arg:o \c_@@_no_value_tl } + { \@@_add_arg:o \c_novalue_tl } } % \end{macrocode} % \end{macro} @@ -2939,7 +2929,7 @@ \__msg_kernel_error:nnxx { xparse } { missing-required } { \exp_after:wN \token_to_str:N \l_@@_fn_tl } { \token_to_str:N #1 } - \@@_add_arg:o \c_@@_no_value_tl + \@@_add_arg:o \c_novalue_tl } } % \end{macrocode} @@ -3222,14 +3212,14 @@ { \exp_after:wN \token_to_str:N \l_@@_fn_tl } { \tl_to_str:N \l_@@_v_arg_tl } { \tl_to_str:n {#1} } - \@@_add_arg:o \c_@@_no_value_tl + \@@_add_arg:o \c_novalue_tl } { \__msg_kernel_error:nnxxx { xparse } { verbatim-tokenized } { \exp_after:wN \token_to_str:N \l_@@_fn_tl } { \tl_to_str:N \l_@@_v_arg_tl } { \tl_to_str:n {#1} } - \@@_add_arg:o \c_@@_no_value_tl + \@@_add_arg:o \c_novalue_tl } } % \end{macrocode} @@ -3354,7 +3344,7 @@ { ##4 {#1} \q_@@ ##5 ##6 {##7} } } } -\exp_args:No \@@_tmp:w { \c_@@_no_value_tl } +\exp_args:No \@@_tmp:w { \c_novalue_tl } % \end{macrocode} % At this stage, |#7| is \cs{q_nil} \Arg{piece 1} \meta{more for piece 1}, % and we want to concatenate all that, removing \cs{q_nil}, and keeping the @@ -3440,7 +3430,7 @@ { ##3 {#1} \q_@@ ##4 ##5 {##6} } } } -\exp_args:No \@@_tmp:w { \c_@@_no_value_tl } +\exp_args:No \@@_tmp:w { \c_novalue_tl } \cs_new:Npn \@@_expandable_grab_D_alt:NNwn #1#2#3 \q_@@ #4 { \tl_if_blank:oTF { \use_none:n #4 } @@ -3510,7 +3500,7 @@ \quark_if_nil:NTF #4 { \@@_expandable_grab_E_end:nnw {#1} {#3} } { - \@@_if_no_value:nTF {#8} + \tl_if_novalue:nTF {#8} { \str_if_eq:onTF { #4 { } #1 #5 } {#5} } { \use_ii:nn } { \@@_expandable_grab_E_find:w { #2 #4 #5 #6 } {#3} ~ } @@ -3582,7 +3572,7 @@ } } } -\exp_args:No \@@_tmp:w { \c_@@_no_value_tl } +\exp_args:No \@@_tmp:w { \c_novalue_tl } % \end{macrocode} % \end{macro} % \end{macro} @@ -3618,7 +3608,7 @@ } } } -\exp_args:No \@@_tmp:w { \c_@@_no_value_tl } +\exp_args:No \@@_tmp:w { \c_novalue_tl } % \end{macrocode} % \end{macro} % \end{macro} @@ -3760,7 +3750,7 @@ \tl_put_right:Nx \ProcessedArgument { \prg_replicate:nn { #2 + 1 - (#1) } - { { \exp_not:V \c_@@_no_value_tl } } + { { \exp_not:V \c_novalue_tl } } } } } @@ -3887,31 +3877,6 @@ % % \subsection{Utilities} % -% \begin{macro}[TF]{\@@_if_no_value:n} -% Tests for |-NoValue-|: this is similar to \cs{tl_if_in:nn} but set -% up to be expandable and to check the value exactly. The question -% mark prevents the auxiliary from losing braces. -% \begin{macrocode} -\use:x - { - \prg_new_conditional:Npnn \exp_not:N \@@_if_no_value:n ##1 - { T , F , TF } - { - \exp_not:N \str_if_eq:onTF - { - \exp_not:N \@@_if_value_aux:w ? ##1 { } - \c_@@_no_value_tl - } - { ? { } \c_@@_no_value_tl } - { \exp_not:N \prg_return_true: } - { \exp_not:N \prg_return_false: } - } - \cs_new:Npn \exp_not:N \@@_if_value_aux:w ##1 \c_@@_no_value_tl - {##1} - } -% \end{macrocode} -% \end{macro} -% % \begin{macro}{\@@_check_definable:nNT, \@@_check_definable_aux:nN} % Check that a token list is appropriate as a first argument of % \cs{NewDocumentCommand} and similar functions and otherwise @@ -4421,17 +4386,17 @@ % \begin{macro}{\IfNoValueT, \IfNoValueF, \IfNoValueTF} % Simple re-naming. % \begin{macrocode} -\cs_new_eq:NN \IfNoValueF \@@_if_no_value:nF -\cs_new_eq:NN \IfNoValueT \@@_if_no_value:nT -\cs_new_eq:NN \IfNoValueTF \@@_if_no_value:nTF +\cs_new_eq:NN \IfNoValueF \tl_if_novalue:nF +\cs_new_eq:NN \IfNoValueT \tl_if_novalue:nT +\cs_new_eq:NN \IfNoValueTF \tl_if_novalue:nTF % \end{macrocode} % \end{macro} % \begin{macro}{\IfValueT, \IfValueF, \IfValueTF} % Inverted logic. % \begin{macrocode} -\cs_new:Npn \IfValueF { \@@_if_no_value:nT } -\cs_new:Npn \IfValueT { \@@_if_no_value:nF } -\cs_new:Npn \IfValueTF #1#2#3 { \@@_if_no_value:nTF {#1} {#3} {#2} } +\cs_new:Npn \IfValueF { \tl_if_novalue:nT } +\cs_new:Npn \IfValueT { \tl_if_novalue:nF } +\cs_new:Npn \IfValueTF #1#2#3 { \tl_if_novalue:nTF {#1} {#3} {#2} } % \end{macrocode} % \end{macro} % diff --git a/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx b/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx index c2ce2a86593..3119370847e 100644 --- a/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx +++ b/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx @@ -27,8 +27,8 @@ %<*driver|package> % The version of expl3 required is tested as early as possible, as % some really old versions do not define \ProvidesExplPackage. -\RequirePackage{expl3}[2017/09/18] -%<package>\@ifpackagelater{expl3}{2017/09/18} +\RequirePackage{expl3}[2017/11/14] +%<package>\@ifpackagelater{expl3}{2017/11/14} %<package> {} %<package> {% %<package> \PackageError{xtemplate}{Support package l3kernel too old} @@ -63,7 +63,7 @@ % }^^A % } % -% \date{Released 2017/09/18} +% \date{Released 2017/11/14} % % \maketitle % @@ -682,7 +682,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{xtemplate}{2017/09/18}{} +\ProvidesExplPackage{xtemplate}{2017/11/14}{} {L3 Experimental prototype document functions} % \end{macrocode} % |