summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2017-11-14 21:07:53 +0000
committerKarl Berry <karl@freefriends.org>2017-11-14 21:07:53 +0000
commit8c82df0007c957004cc2268b49ccf3ceca914f58 (patch)
treeae29044a1727ceb31a488437f43cde1a31e6e007 /Master/texmf-dist/source
parent4bd2a337b834181c967e774caddf57b3f747e127 (diff)
l3 (14nov17)
git-svn-id: svn://tug.org/texlive/trunk@45802 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source')
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/expl3.dtx6
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3basics.dtx10
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3box.dtx6
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx8
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3clist.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3color.dtx40
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3doc.dtx240
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx227
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3expan.dtx6
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3file.dtx8
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3final.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3flag.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx6
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp.dtx4
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3int.dtx4
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3keys.dtx20
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx23
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3msg.dtx6
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3names.dtx45
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3oldmodules.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3prg.dtx4
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3prop.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3quark.dtx10
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3regex.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3seq.dtx5
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3skip.dtx4
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3sort.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3str.dtx448
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3sys.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3tl.dtx86
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3token.dtx4
-rw-r--r--Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx8
-rw-r--r--Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx8
-rw-r--r--Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx8
-rw-r--r--Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx99
-rw-r--r--Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx8
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}
%