texlive[45802] Master/texmf-dist: l3 (14nov17)

commits+karl at tug.org commits+karl at tug.org
Tue Nov 14 22:07:54 CET 2017


Revision: 45802
          http://tug.org/svn/texlive?view=revision&revision=45802
Author:   karl
Date:     2017-11-14 22:07:53 +0100 (Tue, 14 Nov 2017)
Log Message:
-----------
l3 (14nov17)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/latex/l3kernel/README.md
    trunk/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex
    trunk/Master/texmf-dist/doc/latex/l3kernel/source3.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex
    trunk/Master/texmf-dist/doc/latex/l3packages/README.md
    trunk/Master/texmf-dist/doc/latex/l3packages/l3keys2e/l3keys2e.pdf
    trunk/Master/texmf-dist/doc/latex/l3packages/xfp/xfp.pdf
    trunk/Master/texmf-dist/doc/latex/l3packages/xfrac/xfrac.pdf
    trunk/Master/texmf-dist/doc/latex/l3packages/xparse/xparse.pdf
    trunk/Master/texmf-dist/doc/latex/l3packages/xtemplate/xtemplate.pdf
    trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3color.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3final.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3oldmodules.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx
    trunk/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx
    trunk/Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx
    trunk/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx
    trunk/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx
    trunk/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx
    trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex
    trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex
    trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.lua
    trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvipdfmx.def
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvips.def
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvisvgm.def
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3xdvipdfmx.def
    trunk/Master/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty
    trunk/Master/texmf-dist/tex/latex/l3packages/xfp/xfp.sty
    trunk/Master/texmf-dist/tex/latex/l3packages/xfrac/xfrac.sty
    trunk/Master/texmf-dist/tex/latex/l3packages/xparse/xparse.sty
    trunk/Master/texmf-dist/tex/latex/l3packages/xtemplate/xtemplate.sty

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/README.md	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/README.md	2017-11-14 21:07:53 UTC (rev 45802)
@@ -1,7 +1,7 @@
 LaTeX3 Programming Conventions
 ==============================
 
-Release 2017/09/18
+Release 2017/11/14
 
 Overview
 --------

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

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

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex	2017-11-14 21:07:53 UTC (rev 45802)
@@ -63,7 +63,7 @@
          {latex-team at latex-project.org}%
    }%
 }
-\date{Released 2017/09/18}
+\date{Released 2017/11/14}
 
 \pagenumbering{roman}
 \maketitle

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

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

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex	2017-11-14 21:07:53 UTC (rev 45802)
@@ -30,7 +30,7 @@
         {latex-team at latex-project.org}%
     }%
 }
-\date{Released 2017/09/18}
+\date{Released 2017/11/14}
 
 \begin{document}
 

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

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex	2017-11-14 21:07:53 UTC (rev 45802)
@@ -30,7 +30,7 @@
         {latex-team at latex-project.org}%
     }%
 }
-\date{Released 2017/09/18}
+\date{Released 2017/11/14}
 
 \newcommand{\TF}{\textit{(TF)}}
 

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

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex	2017-11-14 21:07:53 UTC (rev 45802)
@@ -62,7 +62,7 @@
          {latex-team at latex-project.org}%
    }%
 }
-\date{Released 2017/09/18}
+\date{Released 2017/11/14}
 
 \pagenumbering{roman}
 \maketitle

Modified: trunk/Master/texmf-dist/doc/latex/l3packages/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3packages/README.md	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/doc/latex/l3packages/README.md	2017-11-14 21:07:53 UTC (rev 45802)
@@ -1,7 +1,7 @@
 LaTeX3 High-Level Concepts
 ==========================
 
-Release 2017/09/18
+Release 2017/11/14
 
 Overview
 --------

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

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

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

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

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

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -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

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/09/18}
+% \date{Released 2017/11/14}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -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

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -138,7 +138,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/09/18}
+% \date{Released 2017/11/14}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -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}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -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}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/09/18}
+% \date{Released 2017/11/14}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/09/18}
+% \date{Released 2017/11/14}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3color.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3color.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3color.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/09/18}
+% \date{Released 2017/11/14}
 %
 % \maketitle
 %
@@ -78,11 +78,12 @@
 %
 % \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)
@@ -89,11 +90,22 @@
 %     \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,7 +139,10 @@
 %    \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}
@@ -134,8 +149,11 @@
 % \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 }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/09/18}
+% \date{Released 2017/11/14}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -70,7 +70,7 @@
 % 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
@@ -77,7 +77,7 @@
 %
 % \title{The \cls{l3doc} class}
 % \author{\Team}
-% \date{Released 2017/09/18}
+% \date{Released 2017/11/14}
 % \maketitle
 % \tableofcontents
 %
@@ -1911,7 +1911,7 @@
           { \l_@@_index_key_tl }
           { \l_@@_index_macro_tl }
           { \l_@@_index_module_tl }
-          { }
+          { usage }
           \l_@@_index_internal_bool
       }
   }
@@ -3877,7 +3877,19 @@
 %    \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 @@
       }
           {#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 @@
         hdclindex{\the\c at 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 @@
   }
 %    \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 @@
 %
 % \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 @@
 %        \file{gind.ist} is used instead.
 %
 %    \begin{macrocode}
-%<*docist>
 actual '='
 quote '!'
 level '>'
@@ -4301,199 +4326,12 @@
 % 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}
 %
 % \PrintIndex

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -61,7 +61,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/09/18}
+% \date{Released 2017/11/14}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -45,7 +45,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/09/18}
+% \date{Released 2017/11/14}
 %
 % \maketitle
 %
@@ -123,18 +123,26 @@
 %
 % \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 at color} and stores it in the low-level format used by \pkg{expl3}
+%   in the \meta{tl}.
+% \end{function}
+%
 % \section{Drawing}
 %
 % The drawing functions provided here are \emph{highly} experimental. They
@@ -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 at color } }
+        \cs_set_protected:Npn \@@_color_pickup:N #1
+          {
+            \exp_args:NV \tl_if_head_is_space:nTF \current at color
+              {
+                \tl_set:Nx #1
+                   {
+                     spot ~
+                     \exp_after:wN \use:n \current at color \c_space_tl 1
+                   }
+              }
+              { \exp_after:wN \@@_color_pickup_aux:w \current at 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 at color } ~ 0 ~ 0 ~ 0 \q_stop
+              { \current at 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:

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -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

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -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}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3final.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3final.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3final.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/09/18}
+% \date{Released 2017/11/14}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/09/18}
+% \date{Released 2017/11/14}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2017/09/18}
+% \date{Released 2017/11/14}
 % \maketitle
 %
 % \begin{documentation}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -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

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2017/09/18}
+% \date{Released 2017/11/14}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/09/18}
+% \date{Released 2017/11/14}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2017/09/18}
+% \date{Released 2017/11/14}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2017/09/18}
+% \date{Released 2017/11/14}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2017/09/18}
+% \date{Released 2017/11/14}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2017/09/18}
+% \date{Released 2017/11/14}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2017/09/18}
+% \date{Released 2017/11/14}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/09/18}
+% \date{Released 2017/11/14}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2017/09/18}
+% \date{Released 2017/11/14}
 % \maketitle
 %
 % \begin{documentation}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2017/09/18}
+% \date{Released 2017/11/14}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -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

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -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

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/09/18}
+% \date{Released 2017/11/14}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -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 at 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.

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -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 @@
 %   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))

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -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}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -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 at shipout
+        \dup at shipout
+        \GPTorg at shipout
+        \LL at shipout
+        \mem at oldshipout
+        \opem at shipout
+        \pgfpages at originalshipout
+        \pr at shipout
+        \Shipout
+        \verso at 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{}.

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3oldmodules.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3oldmodules.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3oldmodules.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -42,7 +42,7 @@
 % }
 %
 %
-% \date{Released 2017/09/18}
+% \date{Released 2017/11/14}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -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

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/09/18}
+% \date{Released 2017/11/14}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -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.
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/09/18}
+% \date{Released 2017/11/14}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -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}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -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}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/09/18}
+% \date{Released 2017/11/14}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -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,

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/09/18}
+% \date{Released 2017/11/14}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/09/18}
+% \date{Released 2017/11/14}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/09/18}
+% \date{Released 2017/11/14}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -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

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -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}

Modified: trunk/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -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}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -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}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -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}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -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,7 +3212,7 @@
           { \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 }
@@ -3229,7 +3219,7 @@
           { \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}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx	2017-11-14 21:07:53 UTC (rev 45802)
@@ -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}
 %

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex	2017-11-14 21:07:53 UTC (rev 45802)
@@ -62,7 +62,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx Copyright (C) 1990-2017 The LaTeX3 Project
-\def\ExplFileDate{2017/09/18}%
+\def\ExplFileDate{2017/11/14}%
 \begingroup
   \def\next{\endgroup}%
   \expandafter\ifx\csname PackageError\endcsname\relax
@@ -1247,6 +1247,36 @@
   \tex_let:D \tex_input:D                \@@input
   \tex_let:D \tex_italiccorrection:D     \@@italiccorr
   \tex_let:D \tex_underline:D            \@@underline
+  \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 at shipout
+        \dup at shipout
+        \GPTorg at shipout
+        \LL at shipout
+        \mem at oldshipout
+        \opem at shipout
+        \pgfpages at originalshipout
+        \pr at shipout
+        \Shipout
+        \verso at 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
   \tex_let:D \pdftex_tracingfonts:D \tex_undefined:D
   \etex_ifdefined:D \pdftracingfonts
     \tex_let:D \pdftex_tracingfonts:D \pdftracingfonts
@@ -2800,6 +2830,15 @@
 \prg_new_eq_conditional:NNn \tl_if_exist:N \cs_if_exist:N { TF , T , F , p }
 \prg_new_eq_conditional:NNn \tl_if_exist:c \cs_if_exist:c { TF , T , F , p }
 \tl_const:Nn \c_empty_tl { }
+\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- }
+  }
 \tl_const:Nn \c_space_tl { ~ }
 \__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \tl_set:Nn #1#2
@@ -3164,6 +3203,23 @@
 \cs_generate_variant:Nn \tl_if_in:nnT  { V , o , no }
 \cs_generate_variant:Nn \tl_if_in:nnF  { V , o , no }
 \cs_generate_variant:Nn \tl_if_in:nnTF { V , o , no }
+\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 \__tl_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 \__tl_if_novalue:w ##1 \c_novalue_tl
+      {##1}
+  }
 \cs_new:Npn \tl_if_single_p:N { \exp_args:No \tl_if_single_p:n }
 \cs_new:Npn \tl_if_single:NT  { \exp_args:No \tl_if_single:nT  }
 \cs_new:Npn \tl_if_single:NF  { \exp_args:No \tl_if_single:nF  }
@@ -3303,6 +3359,7 @@
   { \exp_not:o { \use_none:nn #2 } }
 \cs_new:Npn \tl_trim_spaces:n #1
   { \__tl_trim_spaces:nn { \q_mark #1 } \exp_not:o }
+\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
@@ -3633,6 +3690,10 @@
 \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 }
 \group_begin:
   \cs_set_protected:Npn \__str_tmp:n #1
     {
@@ -3654,6 +3715,58 @@
     { gput_right }
     { }
 \group_end:
+\cs_new_protected:Npn \str_replace_once:Nnn
+  { \__str_replace:NNNnn \prg_do_nothing: \tl_set:Nx  }
+\cs_new_protected:Npn \str_greplace_once:Nnn
+  { \__str_replace:NNNnn \prg_do_nothing: \tl_gset:Nx }
+\cs_new_protected:Npn \str_replace_all:Nnn
+  { \__str_replace:NNNnn \__str_replace_next:w \tl_set:Nx  }
+\cs_new_protected:Npn \str_greplace_all:Nnn
+  { \__str_replace:NNNnn \__str_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 \__str_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 { \__str_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 \__str_replace_aux:NNNnnn #1#2#3#4#5#6
+  {
+    \cs_set:Npn \__str_replace_next:w ##1 #5 { ##1 #6 #1 }
+    #2 #3
+      {
+        \__str_replace_next:w
+        #4
+        \use_none_delimit_by_q_stop:w
+        #5
+        \q_stop
+      }
+  }
+\cs_new_eq:NN \__str_replace_next:w ?
+\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 }
+\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 }
 \prg_new_eq_conditional:NNn \str_if_exist:N \tl_if_exist:N { p , T , F , TF }
 \prg_new_eq_conditional:NNn \str_if_exist:c \tl_if_exist:c { p , T , F , TF }
 \prg_new_eq_conditional:NNn \str_if_empty:N \tl_if_empty:N { p , T , F , TF }
@@ -3717,6 +3830,21 @@
 \cs_generate_variant:Nn \str_if_eq:NNF  { c , Nc , cc }
 \cs_generate_variant:Nn \str_if_eq:NNTF { c , Nc , cc }
 \cs_generate_variant:Nn \str_if_eq_p:NN { c , Nc , cc }
+\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: }
+  }
 \cs_new:Npn \str_case:nn #1#2
   {
     \exp:w
@@ -3778,6 +3906,54 @@
       { \__str_case_x:nw {#1} }
   }
 \cs_new_eq:NN \__str_case_end:nw \__prg_case_end:nw
+\cs_new:Npn \str_map_function:nN #1#2
+  {
+    \exp_after:wN \__str_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 \__str_map_function:Nn #1#2
+  {
+    \__quark_if_recursion_tail_break:nN {#2} \str_map_break:
+    #1 {#2} \__str_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 \__str_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
+  {
+    \__str_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 \__str_map_variable:Nnn #1#2#3
+  {
+    \str_set:Nn #1 {#3}
+    \__quark_if_recursion_tail_break:NN #1 \str_map_break:
+    \use:n {#2}
+    \__str_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: }
 \cs_new:Npn \__str_to_other:n #1
   {
     \exp_after:wN \__str_to_other_loop:w
@@ -3785,7 +3961,7 @@
   }
 \group_begin:
 \tex_lccode:D `\* = `\  %
-\tex_lccode:D `\A = `\A
+\tex_lccode:D `\A = `\A %
 \tex_lowercase:D
   {
     \group_end:
@@ -3808,7 +3984,7 @@
   }
 \group_begin:
 \tex_lccode:D `\* = `\  %
-\tex_lccode:D `\A = `\A
+\tex_lccode:D `\A = `\A %
 \tex_lowercase:D
   {
     \group_end:
@@ -10691,12 +10867,7 @@
       }
   }
 \cs_new:Npn \__keys_remove_spaces:n #1
-  {
-    \exp_after:wN \__keys_remove_spaces:w \tl_to_str:n {#1}
-    \use_none:nn ? ~
-  }
-\cs_new:Npn \__keys_remove_spaces:w #1 ~
-  { #1 \__keys_remove_spaces:w }
+  { \tl_trim_spaces:o { \tl_to_str:n {#1} } }
 \prg_new_conditional:Npnn \keys_if_exist:nn #1#2 { p , T , F , TF }
   {
     \cs_if_exist:cTF
@@ -21659,7 +21830,8 @@
   }
 \cs_new_protected:Npn \color_ensure_current:
   {
-    \__driver_color_ensure_current:
+    \__driver_color_pickup:N \l__color_current_tl
+    \__driver_color_select:V \l__color_current_tl
     \group_insert_after:N \__driver_color_reset:
   }
 \tl_new:N \l__color_current_tl

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex	2017-11-14 21:07:53 UTC (rev 45802)
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx Copyright (C) 1990-2017 The LaTeX3 Project
-\def\ExplFileDate{2017/09/18}%
+\def\ExplFileDate{2017/11/14}%
 \let\ExplLoaderFileDate\ExplFileDate
 \begingroup
   \def\tempa{LaTeX2e}%

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.lua
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.lua	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.lua	2017-11-14 21:07:53 UTC (rev 45802)
@@ -57,7 +57,7 @@
 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))

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty	2017-11-14 21:07:53 UTC (rev 45802)
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx Copyright (C) 1990-2017 The LaTeX3 Project
-\def\ExplFileDate{2017/09/18}%
+\def\ExplFileDate{2017/11/14}%
 \let\ExplLoaderFileDate\ExplFileDate
 \ProvidesPackage{expl3}
   [%

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls	2017-11-14 21:07:53 UTC (rev 45802)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3doc.dtx Copyright (C) 1990-2017 The LaTeX3 project
 \RequirePackage{expl3,xparse,calc}
-\ProvidesExplClass{l3doc}{2017/09/18}{}
+\ProvidesExplClass{l3doc}{2017/11/14}{}
   {L3 Experimental documentation class}
 \clist_new:N \g_docinput_clist
 \seq_new:N \g_doc_functions_seq
@@ -678,7 +678,7 @@
           { \l__codedoc_index_key_tl }
           { \l__codedoc_index_macro_tl }
           { \l__codedoc_index_module_tl }
-          { }
+          { usage }
           \l__codedoc_index_internal_bool
       }
   }

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvipdfmx.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvipdfmx.def	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvipdfmx.def	2017-11-14 21:07:53 UTC (rev 45802)
@@ -22,20 +22,45 @@
 \ProvidesExplFile
   {l3dvidpfmx.def}{2017/03/18}{}
   {L3 Experimental driver: dvipdfmx}
+\cs_new_protected:Npn \__driver_color_pickup:N #1 { }
 \AtBeginDocument
   {
     \@ifpackageloaded { color }
       {
-        \cs_new_protected:Npn \__driver_color_pickup:
-          { \tl_set:Nx \l__color_current_tl { \current at color } }
+        \cs_set_protected:Npn \__driver_color_pickup:N #1
+          {
+            \exp_args:NV \tl_if_head_is_space:nTF \current at color
+              {
+                \tl_set:Nx #1
+                   {
+                     spot ~
+                     \exp_after:wN \use:n \current at color \c_space_tl 1
+                   }
+              }
+              { \exp_after:wN \__driver_color_pickup_aux:w \current at color \q_stop #1 }
+          }
+        \cs_new_protected:Npn \__driver_color_pickup_aux:w #1 ~ #2 \q_stop #3
+          { \tl_set:Nn #3 { #1 ~ #2 } }
       }
-      { \cs_new_protected:Npn \__driver_color_pickup: { } }
+      { }
   }
-\cs_new_protected:Npn \__driver_color_ensure_current:
+\cs_new_protected:Npn \__driver_color_select:n #1
   {
-    \__driver_color_pickup:
-    \tex_special:D { color~push~\l__color_current_tl }
+    \tex_special:D
+      {
+        color~push~
+        \cs_if_exist_use:cF
+          { __driver_color_convert_ \__driver_convert_model:w #1 \q_stop :n }
+          { \use:n }
+            {#1}
+      }
   }
+\cs_generate_variant:Nn \__driver_color_select:n { V }
+\cs_new:Npn \__driver_convert_model:w #1 ~ #2 \q_stop {#1}
+\cs_new:Npn \__driver_color_convert_spot:n #1
+  { \__driver_color_convert_spot:w #1 \q_stop }
+\cs_new:Npn \__driver_color_convert_spot:w #1 ~ #2 ~ #3 \q_stop
+  { \c_space_tl #2 }
 \cs_new_protected:Npn \__driver_color_reset:
   { \tex_special:D { color~pop } }
 \cs_new_protected:Npn \__driver_literal:n #1

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvips.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvips.def	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvips.def	2017-11-14 21:07:53 UTC (rev 45802)
@@ -22,20 +22,45 @@
 \ProvidesExplFile
   {l3dvips.def}{2017/03/18}{}
   {L3 Experimental driver: dvips}
+\cs_new_protected:Npn \__driver_color_pickup:N #1 { }
 \AtBeginDocument
   {
     \@ifpackageloaded { color }
       {
-        \cs_new_protected:Npn \__driver_color_pickup:
-          { \tl_set:Nx \l__color_current_tl { \current at color } }
+        \cs_set_protected:Npn \__driver_color_pickup:N #1
+          {
+            \exp_args:NV \tl_if_head_is_space:nTF \current at color
+              {
+                \tl_set:Nx #1
+                   {
+                     spot ~
+                     \exp_after:wN \use:n \current at color \c_space_tl 1
+                   }
+              }
+              { \exp_after:wN \__driver_color_pickup_aux:w \current at color \q_stop #1 }
+          }
+        \cs_new_protected:Npn \__driver_color_pickup_aux:w #1 ~ #2 \q_stop #3
+          { \tl_set:Nn #3 { #1 ~ #2 } }
       }
-      { \cs_new_protected:Npn \__driver_color_pickup: { } }
+      { }
   }
-\cs_new_protected:Npn \__driver_color_ensure_current:
+\cs_new_protected:Npn \__driver_color_select:n #1
   {
-    \__driver_color_pickup:
-    \tex_special:D { color~push~\l__color_current_tl }
+    \tex_special:D
+      {
+        color~push~
+        \cs_if_exist_use:cF
+          { __driver_color_convert_ \__driver_convert_model:w #1 \q_stop :n }
+          { \use:n }
+            {#1}
+      }
   }
+\cs_generate_variant:Nn \__driver_color_select:n { V }
+\cs_new:Npn \__driver_convert_model:w #1 ~ #2 \q_stop {#1}
+\cs_new:Npn \__driver_color_convert_spot:n #1
+  { \__driver_color_convert_spot:w #1 \q_stop }
+\cs_new:Npn \__driver_color_convert_spot:w #1 ~ #2 ~ #3 \q_stop
+  { \c_space_tl #2 }
 \cs_new_protected:Npn \__driver_color_reset:
   { \tex_special:D { color~pop } }
 \cs_new_protected:Npn \__driver_literal:n #1

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvisvgm.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvisvgm.def	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvisvgm.def	2017-11-14 21:07:53 UTC (rev 45802)
@@ -22,20 +22,45 @@
 \ProvidesExplFile
   {l3dvisvgm.def}{2017/03/18}{}
   {L3 Experimental driver: dvisvgm}
+\cs_new_protected:Npn \__driver_color_pickup:N #1 { }
 \AtBeginDocument
   {
     \@ifpackageloaded { color }
       {
-        \cs_new_protected:Npn \__driver_color_pickup:
-          { \tl_set:Nx \l__color_current_tl { \current at color } }
+        \cs_set_protected:Npn \__driver_color_pickup:N #1
+          {
+            \exp_args:NV \tl_if_head_is_space:nTF \current at color
+              {
+                \tl_set:Nx #1
+                   {
+                     spot ~
+                     \exp_after:wN \use:n \current at color \c_space_tl 1
+                   }
+              }
+              { \exp_after:wN \__driver_color_pickup_aux:w \current at color \q_stop #1 }
+          }
+        \cs_new_protected:Npn \__driver_color_pickup_aux:w #1 ~ #2 \q_stop #3
+          { \tl_set:Nn #3 { #1 ~ #2 } }
       }
-      { \cs_new_protected:Npn \__driver_color_pickup: { } }
+      { }
   }
-\cs_new_protected:Npn \__driver_color_ensure_current:
+\cs_new_protected:Npn \__driver_color_select:n #1
   {
-    \__driver_color_pickup:
-    \tex_special:D { color~push~\l__color_current_tl }
+    \tex_special:D
+      {
+        color~push~
+        \cs_if_exist_use:cF
+          { __driver_color_convert_ \__driver_convert_model:w #1 \q_stop :n }
+          { \use:n }
+            {#1}
+      }
   }
+\cs_generate_variant:Nn \__driver_color_select:n { V }
+\cs_new:Npn \__driver_convert_model:w #1 ~ #2 \q_stop {#1}
+\cs_new:Npn \__driver_color_convert_spot:n #1
+  { \__driver_color_convert_spot:w #1 \q_stop }
+\cs_new:Npn \__driver_color_convert_spot:w #1 ~ #2 ~ #3 \q_stop
+  { \c_space_tl #2 }
 \cs_new_protected:Npn \__driver_color_reset:
   { \tex_special:D { color~pop } }
 \cs_new_protected:Npn \__driver_literal:n #1

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def	2017-11-14 21:07:53 UTC (rev 45802)
@@ -22,59 +22,68 @@
 \ProvidesExplFile
   {l3pdfmode.def}{2017/03/18}{}
   {L3 Experimental driver: PDF mode}
+\cs_new_protected:Npn \__driver_color_pickup:N #1 { }
 \AtBeginDocument
   {
     \@ifpackageloaded { color }
       {
-        \cs_new_protected:Npn \__driver_color_pickup:
+        \cs_set_protected:Npn \__driver_color_pickup:N #1
           {
             \exp_last_unbraced:Nx \__driver_color_pickup_aux:w
-              { \current at color } ~ 0 ~ 0 ~ 0 \q_stop
+              { \current at color } ~ 0 ~ 0 ~ 0 \q_stop #1
           }
-        \cs_new:Npn \__driver_color_pickup_aux:w #1 ~ #2 ~ #3 ~ #4 ~ #5 ~ #6 \q_stop
+        \cs_new_protected:Npn \__driver_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 \__driver_color_pickup: { } }
+      { }
   }
 \int_new:N \l__driver_color_stack_int
-\cs_new_protected:Npx \__driver_color_ensure_current:
+\cs_new_protected:Npx \__driver_color_select:n #1
   {
-    \exp_not:N \__driver_color_pickup:
     \cs_if_exist:NTF \luatex_pdfextension:D
       { \luatex_pdfextension:D colorstack }
       { \pdftex_pdfcolorstack:D }
         \exp_not:N \l__driver_color_stack_int push
           {
-            \exp_not:N \exp_after:wN
             \exp_not:N \__driver_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 \__driver_color_convert:w #1 ~
-  { \use:c { __driver_color_convert_ #1 :w } }
-\cs_new:Npn \__driver_color_convert_gray:w #1 ~ #2 \q_stop
+\cs_generate_variant:Nn \__driver_color_select:n { V }
+\cs_new:Npn \__driver_color_convert:w #1 ~ #2 \q_stop
+  { \use:c { __driver_color_convert_ #1 :w } #2 \q_stop }
+\cs_new:Npn \__driver_color_convert_gray:w #1 \q_stop
   { #1 ~ g ~ #1 ~ G }
-\cs_new:Npn \__driver_color_convert_cmyk:w #1 ~ #2 ~ #3 ~ #4 ~#5 \q_stop
-  { #1 ~ #2 ~ #3 ~ #4 ~ k ~ #1 ~ #2 ~ #3 ~ #4 ~ K }
-\cs_new:Npn \__driver_color_convert_rgb:w #1 ~ #2 ~ #3 ~ #4 \q_stop
-  { #1 ~ #2 ~ #3 ~ rg ~ #1 ~ #2 ~ #3 ~ RG }
+\cs_new:Npn \__driver_color_convert_cmyk:w #1 \q_stop
+  { #1 ~ k ~ #1 ~ K }
+\cs_new:Npn \__driver_color_convert_rgb:w #1 \q_stop
+  { #1 ~ rg ~ #1 ~ RG }
+\cs_new:Npn \__driver_color_convert_spot:w #1 ~ #2 \q_stop
+  {
+    /#1 ~ cs ~ /#1 ~ CS ~ #2 ~ sc ~ #2 ~ SC
+  }
 \cs_new_protected:Npx \__driver_color_reset:
   {
     \cs_if_exist:NTF \luatex_pdfextension:D

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3xdvipdfmx.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3xdvipdfmx.def	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3xdvipdfmx.def	2017-11-14 21:07:53 UTC (rev 45802)
@@ -22,20 +22,45 @@
 \ProvidesExplFile
   {l3xdvidpfmx.def}{2017/03/18}{}
   {L3 Experimental driver: xdvipdfmx}
+\cs_new_protected:Npn \__driver_color_pickup:N #1 { }
 \AtBeginDocument
   {
     \@ifpackageloaded { color }
       {
-        \cs_new_protected:Npn \__driver_color_pickup:
-          { \tl_set:Nx \l__color_current_tl { \current at color } }
+        \cs_set_protected:Npn \__driver_color_pickup:N #1
+          {
+            \exp_args:NV \tl_if_head_is_space:nTF \current at color
+              {
+                \tl_set:Nx #1
+                   {
+                     spot ~
+                     \exp_after:wN \use:n \current at color \c_space_tl 1
+                   }
+              }
+              { \exp_after:wN \__driver_color_pickup_aux:w \current at color \q_stop #1 }
+          }
+        \cs_new_protected:Npn \__driver_color_pickup_aux:w #1 ~ #2 \q_stop #3
+          { \tl_set:Nn #3 { #1 ~ #2 } }
       }
-      { \cs_new_protected:Npn \__driver_color_pickup: { } }
+      { }
   }
-\cs_new_protected:Npn \__driver_color_ensure_current:
+\cs_new_protected:Npn \__driver_color_select:n #1
   {
-    \__driver_color_pickup:
-    \tex_special:D { color~push~\l__color_current_tl }
+    \tex_special:D
+      {
+        color~push~
+        \cs_if_exist_use:cF
+          { __driver_color_convert_ \__driver_convert_model:w #1 \q_stop :n }
+          { \use:n }
+            {#1}
+      }
   }
+\cs_generate_variant:Nn \__driver_color_select:n { V }
+\cs_new:Npn \__driver_convert_model:w #1 ~ #2 \q_stop {#1}
+\cs_new:Npn \__driver_color_convert_spot:n #1
+  { \__driver_color_convert_spot:w #1 \q_stop }
+\cs_new:Npn \__driver_color_convert_spot:w #1 ~ #2 ~ #3 \q_stop
+  { \c_space_tl #2 }
 \cs_new_protected:Npn \__driver_color_reset:
   { \tex_special:D { color~pop } }
 \cs_new_protected:Npn \__driver_literal:n #1

Modified: trunk/Master/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty	2017-11-14 21:07:53 UTC (rev 45802)
@@ -19,8 +19,8 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: l3keys2e.dtx (C) Copyright 2009,2011-2017 The LaTeX3 Project
-\RequirePackage{expl3}[2017/09/18]
-\@ifpackagelater{expl3}{2017/09/18}
+\RequirePackage{expl3}[2017/11/14]
+\@ifpackagelater{expl3}{2017/11/14}
   {}
   {%
     \PackageError{l3keys2e}{Support package l3kernel too old}
@@ -32,7 +32,7 @@
       }%
     \endinput
   }
-\ProvidesExplPackage{l3keys2e}{2017/09/18}{}
+\ProvidesExplPackage{l3keys2e}{2017/11/14}{}
   {LaTeX2e option processing using LaTeX3 keys}
 \cs_generate_variant:Nn \clist_put_right:Nn { Nv }
 \cs_generate_variant:Nn \keys_if_exist:nnT  { nx }

Modified: trunk/Master/texmf-dist/tex/latex/l3packages/xfp/xfp.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3packages/xfp/xfp.sty	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/tex/latex/l3packages/xfp/xfp.sty	2017-11-14 21:07:53 UTC (rev 45802)
@@ -19,8 +19,8 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: xfp.dtx (C) Copyright 2017 The LaTeX3 Project
-\RequirePackage{expl3}[2017/09/18]
-\@ifpackagelater{expl3}{2017/09/18}
+\RequirePackage{expl3}[2017/11/14]
+\@ifpackagelater{expl3}{2017/11/14}
   {}
   {%
     \PackageError{xfp}{Support package l3kernel too old}
@@ -33,7 +33,7 @@
     \endinput
   }
 \RequirePackage{xparse}
-\ProvidesExplPackage{xfp}{2017/09/18}{}
+\ProvidesExplPackage{xfp}{2017/11/14}{}
   {L3 Floating point unit}
 \NewExpandableDocumentCommand \fpeval { m } { \fp_eval:n {#1} }
 \NewExpandableDocumentCommand \inteval { m } { \int_eval:n {#1} }

Modified: trunk/Master/texmf-dist/tex/latex/l3packages/xfrac/xfrac.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3packages/xfrac/xfrac.sty	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/tex/latex/l3packages/xfrac/xfrac.sty	2017-11-14 21:07:53 UTC (rev 45802)
@@ -20,8 +20,8 @@
 %% 
 %% File: xfrac.dtx Copyright (C) 2004, 2008-2010 Morten Hoegholm
 %%                           (C) 2011,2012,2014-2017 The LaTeX3 Project
-\RequirePackage{expl3}[2017/09/18]
-\@ifpackagelater{expl3}{2017/09/18}
+\RequirePackage{expl3}[2017/11/14]
+\@ifpackagelater{expl3}{2017/11/14}
   {}
   {%
     \PackageError{xfrac}{Support package l3kernel too old}
@@ -34,7 +34,7 @@
     \endinput
   }
 \RequirePackage{amstext,graphicx,l3keys2e,textcomp,xparse,xtemplate}
-\ProvidesExplPackage{xfrac}{2017/09/18}{}
+\ProvidesExplPackage{xfrac}{2017/11/14}{}
   {L3 Experimental split-level fractions}
 \keys_define:nn { xfrac }
   {

Modified: trunk/Master/texmf-dist/tex/latex/l3packages/xparse/xparse.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3packages/xparse/xparse.sty	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/tex/latex/l3packages/xparse/xparse.sty	2017-11-14 21:07:53 UTC (rev 45802)
@@ -23,8 +23,8 @@
 %%                  (C) Copyright 2004-2008 Frank Mittelbach,
 %%                      The LaTeX3 Project
 %%                  (C) Copyright 2009-2017 The LaTeX3 Project
-\RequirePackage{expl3}[2017/09/18]
-\@ifpackagelater{expl3}{2017/09/18}
+\RequirePackage{expl3}[2017/11/14]
+\@ifpackagelater{expl3}{2017/11/14}
   {}
   {%
     \PackageError{xparse}{Support package l3kernel too old}
@@ -36,10 +36,8 @@
       }%
     \endinput
   }
-\ProvidesExplPackage{xparse}{2017/09/18}{}
+\ProvidesExplPackage{xparse}{2017/11/14}{}
   {L3 Experimental document command parser}
-\tl_const:Nx \c__xparse_no_value_tl
-  { \char_generate:nn { `\- } { 11 } NoValue- }
 \tl_new:N \l__xparse_arg_spec_tl
 \tl_new:N \l__xparse_args_tl
 \tl_new:N \l__xparse_args_i_tl
@@ -290,7 +288,7 @@
         {
           \exp_not:N \exp_not:n
             {
-              \__xparse_if_no_value:nTF {#2}
+              \tl_if_novalue:nTF {#2}
                 { \exp_not:o {#3} }
                 { \exp_not:n { ## #1 } }
             }
@@ -309,7 +307,7 @@
 \cs_new_protected:Npn \__xparse_args_process_loop:nn #1#2
   {
     \tl_set:Nn \ProcessedArgument {#1}
-    \__xparse_if_no_value:nF {#1}
+    \tl_if_novalue:nF {#1}
       { \tl_map_function:nN {#2} \__xparse_args_process_aux:n }
     \tl_put_right:No \l__xparse_args_ii_tl
       { \exp_after:wN { \ProcessedArgument } }
@@ -349,7 +347,7 @@
   }
 \cs_new:Npn \__xparse_end_expandable_defaults:nnw #1#2
   {
-    \__xparse_if_no_value:nTF {#2}
+    \tl_if_novalue:nTF {#2}
       { \exp_args:No \__xparse_end_expandable_defaults:nw {#1} }
       { \__xparse_end_expandable_defaults:nw {#2} }
   }
@@ -425,7 +423,7 @@
     \cs_new_protected:Npn \__xparse_normalize_type_s:w
       { \__xparse_normalize_type_t:w * }
   }
-\exp_args:No \__xparse_tmp:w { \c__xparse_no_value_tl }
+\exp_args:No \__xparse_tmp:w { \c_novalue_tl }
 \cs_new_protected:cpn { __xparse_normalize_type_>:w } #1#2
   {
     \quark_if_recursion_tail_stop_do:nn {#2} { \__xparse_bad_arg_spec:wn }
@@ -733,7 +731,7 @@
 \cs_new_protected:Npn \__xparse_add_type_v:w
   {
     \__xparse_flush_m_args:
-    \exp_args:No \__xparse_add_default:n \c__xparse_no_value_tl
+    \exp_args:No \__xparse_add_default:n \c_novalue_tl
     \__xparse_add_grabber_mandatory:N v
     \__xparse_prepare_signature:N
   }
@@ -782,7 +780,7 @@
   }
 \cs_new_protected:Npn \__xparse_add_default:n #1
   {
-    \__xparse_if_no_value:nTF {#1}
+    \tl_if_novalue:nTF {#1}
       { \__xparse_add_default: }
       {
         \int_incr:N \l__xparse_current_arg_int
@@ -793,7 +791,7 @@
 \cs_new_protected:Npn \__xparse_add_default:
   {
     \int_incr:N \l__xparse_current_arg_int
-    \tl_put_right:Nn \l__xparse_defaults_tl { \c__xparse_no_value_tl }
+    \tl_put_right:Nn \l__xparse_defaults_tl { \c_novalue_tl }
   }
 \cs_new_protected:Npn \__xparse_add_default_E:nn #1#2
   {
@@ -854,7 +852,7 @@
         { \exp_not:o \l__xparse_tmpb_tl }
         {
           \prg_replicate:nn { \tl_count:n {#1} }
-            { { \c__xparse_no_value_tl } }
+            { { \c_novalue_tl } }
         }
       }
     \__xparse_prepare_signature:N
@@ -952,7 +950,7 @@
     \__xparse_grab_D_aux:NNnN #1#2 {#3} #4
     \use:c { peek_meaning_remove #5 :NTF } #1
       { \__xparse_grab_D_call:Nw #1 }
-      { \__xparse_add_arg:o \c__xparse_no_value_tl }
+      { \__xparse_add_arg:o \c_novalue_tl }
   }
 \cs_new_protected:Npn \__xparse_grab_D_aux:NNnN #1#2#3#4
   {
@@ -1061,7 +1059,7 @@
         \tl_map_inline:nn {#1}
           {
             \prop_get:NnNF \l__xparse_tmp_prop {####1} \l__xparse_tmpb_tl
-              { \tl_set_eq:NN \l__xparse_tmpb_tl \c__xparse_no_value_tl }
+              { \tl_set_eq:NN \l__xparse_tmpb_tl \c_novalue_tl }
             \tl_put_right:Nx \l__xparse_args_tl
               { { \exp_not:V \l__xparse_tmpb_tl } }
           }
@@ -1100,7 +1098,7 @@
       { \__xparse_add_arg:n {##1} }
     \use:c { peek_meaning #3 :NTF } \c_group_begin_token
       { \l__xparse_fn_tl }
-      { \__xparse_add_arg:o \c__xparse_no_value_tl }
+      { \__xparse_add_arg:o \c_novalue_tl }
   }
 \cs_new_protected:Npn \__xparse_grab_l:w #1 \__xparse_run_code:
   { \__xparse_grab_l_aux:nN {#1} \cs_set_protected_nopar:Npn }
@@ -1199,7 +1197,7 @@
         \__msg_kernel_error:nnxx { xparse } { missing-required }
           { \exp_after:wN \token_to_str:N \l__xparse_fn_tl }
           { \token_to_str:N #1 }
-        \__xparse_add_arg:o \c__xparse_no_value_tl
+        \__xparse_add_arg:o \c_novalue_tl
       }
   }
 \cs_new_protected:Npn \__xparse_grab_t:w
@@ -1356,7 +1354,7 @@
           { \exp_after:wN \token_to_str:N \l__xparse_fn_tl }
           { \tl_to_str:N \l__xparse_v_arg_tl }
           { \tl_to_str:n {#1} }
-        \__xparse_add_arg:o \c__xparse_no_value_tl
+        \__xparse_add_arg:o \c_novalue_tl
       }
       {
         \__msg_kernel_error:nnxxx { xparse } { verbatim-tokenized }
@@ -1363,7 +1361,7 @@
           { \exp_after:wN \token_to_str:N \l__xparse_fn_tl }
           { \tl_to_str:N \l__xparse_v_arg_tl }
           { \tl_to_str:n {#1} }
-        \__xparse_add_arg:o \c__xparse_no_value_tl
+        \__xparse_add_arg:o \c_novalue_tl
       }
   }
 \cs_new_protected:Npn \__xparse_grab_v_aux_put:N #1
@@ -1403,7 +1401,7 @@
           { ##4 {#1} \q__xparse ##5 ##6 {##7} }
       }
   }
-\exp_args:No \__xparse_tmp:w { \c__xparse_no_value_tl }
+\exp_args:No \__xparse_tmp:w { \c_novalue_tl }
 \cs_new:Npn \__xparse_expandable_grab_D:NNNwNNnnn #1#2#3#4 \q__xparse #5#6#7#8#9
   {
     \exp_args:Nof \__xparse_expandable_grab_D:nnNNNwNN
@@ -1455,7 +1453,7 @@
           { ##3 {#1} \q__xparse ##4 ##5 {##6} }
       }
   }
-\exp_args:No \__xparse_tmp:w { \c__xparse_no_value_tl }
+\exp_args:No \__xparse_tmp:w { \c_novalue_tl }
 \cs_new:Npn \__xparse_expandable_grab_D_alt:NNwn #1#2#3 \q__xparse #4
   {
     \tl_if_blank:oTF { \use_none:n #4 }
@@ -1487,7 +1485,7 @@
     \quark_if_nil:NTF #4
       { \__xparse_expandable_grab_E_end:nnw {#1} {#3} }
       {
-        \__xparse_if_no_value:nTF {#8}
+        \tl_if_novalue:nTF {#8}
           { \str_if_eq:onTF { #4 { } #1 #5 } {#5} }
           { \use_ii:nn }
             { \__xparse_expandable_grab_E_find:w { #2 #4 #5 #6 } {#3} ~ }
@@ -1535,7 +1533,7 @@
           }
       }
   }
-\exp_args:No \__xparse_tmp:w { \c__xparse_no_value_tl }
+\exp_args:No \__xparse_tmp:w { \c_novalue_tl }
 \cs_new:Npn \__xparse_expandable_grab_R_alt:w #1 \q__xparse #2#3
   { #2 { \__xparse_expandable_grab_R_alt_aux:NNnwNn #1 \q__xparse #2#3 } }
 \cs_set_protected:Npn \__xparse_tmp:w #1
@@ -1561,7 +1559,7 @@
           }
       }
   }
-\exp_args:No \__xparse_tmp:w { \c__xparse_no_value_tl }
+\exp_args:No \__xparse_tmp:w { \c_novalue_tl }
 \cs_new:Npn \__xparse_expandable_grab_t:w #1 \q__xparse #2#3
   { #2 { \__xparse_expandable_grab_t_aux:NNwn #1 \q__xparse #2 #3 } }
 \cs_new:Npn \__xparse_expandable_grab_t_aux:NNwn #1#2#3 \q__xparse #4#5#6
@@ -1644,7 +1642,7 @@
             \tl_put_right:Nx \ProcessedArgument
               {
                 \prg_replicate:nn { #2 + 1 - (#1) }
-                  { { \exp_not:V \c__xparse_no_value_tl } }
+                  { { \exp_not:V \c_novalue_tl } }
               }
           }
       }
@@ -1718,23 +1716,6 @@
       { \tl_show:N \ArgumentSpecification }
       { \__xparse_get_arg_spec_error:n {#1} }
   }
-\use:x
-  {
-    \prg_new_conditional:Npnn \exp_not:N \__xparse_if_no_value:n ##1
-      { T ,  F , TF }
-      {
-        \exp_not:N \str_if_eq:onTF
-          {
-            \exp_not:N \__xparse_if_value_aux:w ? ##1 { }
-              \c__xparse_no_value_tl
-          }
-          { ? { } \c__xparse_no_value_tl }
-          { \exp_not:N \prg_return_true: }
-          { \exp_not:N \prg_return_false: }
-      }
-    \cs_new:Npn \exp_not:N \__xparse_if_value_aux:w ##1 \c__xparse_no_value_tl
-      {##1}
-  }
 \cs_new_protected:Npn \__xparse_check_definable:nNT #1
   { \exp_args:Nx \__xparse_check_definable_aux:nN { \tl_trim_spaces:n {#1} } }
 \group_begin:
@@ -2131,12 +2112,12 @@
 \cs_new_eq:NN \IfBooleanTF \bool_if:NTF
 \cs_new_eq:NN \IfBooleanT  \bool_if:NT
 \cs_new_eq:NN \IfBooleanF  \bool_if:NF
-\cs_new_eq:NN \IfNoValueF  \__xparse_if_no_value:nF
-\cs_new_eq:NN \IfNoValueT  \__xparse_if_no_value:nT
-\cs_new_eq:NN \IfNoValueTF \__xparse_if_no_value:nTF
-\cs_new:Npn \IfValueF { \__xparse_if_no_value:nT }
-\cs_new:Npn \IfValueT { \__xparse_if_no_value:nF }
-\cs_new:Npn \IfValueTF #1#2#3 { \__xparse_if_no_value:nTF {#1} {#3} {#2} }
+\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
+\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} }
 \tl_new:N \ProcessedArgument
 \cs_new_eq:NN \ReverseBoolean \__xparse_bool_reverse:N
 \cs_new_eq:NN \SplitArgument  \__xparse_split_argument:nnn

Modified: trunk/Master/texmf-dist/tex/latex/l3packages/xtemplate/xtemplate.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3packages/xtemplate/xtemplate.sty	2017-11-14 21:06:53 UTC (rev 45801)
+++ trunk/Master/texmf-dist/tex/latex/l3packages/xtemplate/xtemplate.sty	2017-11-14 21:07:53 UTC (rev 45802)
@@ -23,8 +23,8 @@
 %%                     (C) Copyright 2004-2010 Frank Mittelbach,
 %%                         The LaTeX3 Project
 %%                     (C) Copyright 2011-2016 The LaTeX3 Project
-\RequirePackage{expl3}[2017/09/18]
-\@ifpackagelater{expl3}{2017/09/18}
+\RequirePackage{expl3}[2017/11/14]
+\@ifpackagelater{expl3}{2017/11/14}
   {}
   {%
     \PackageError{xtemplate}{Support package l3kernel too old}
@@ -36,7 +36,7 @@
       }%
     \endinput
   }
-\ProvidesExplPackage{xtemplate}{2017/09/18}{}
+\ProvidesExplPackage{xtemplate}{2017/11/14}{}
   {L3 Experimental prototype document functions}
 \tl_const:Nn \c__xtemplate_code_root_tl      { template~code~>~ }
 \tl_const:Nn \c__xtemplate_defaults_root_tl  { template~defaults~>~ }



More information about the tex-live-commits mailing list