texlive[44813] Master/texmf-dist: l3 (15jul17)

commits+karl at tug.org commits+karl at tug.org
Sat Jul 15 23:27:02 CEST 2017


Revision: 44813
          http://tug.org/svn/texlive?view=revision&revision=44813
Author:   karl
Date:     2017-07-15 23:27:01 +0200 (Sat, 15 Jul 2017)
Log Message:
-----------
l3 (15jul17)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/latex/l3experimental/README.md
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-convert.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-format.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/xcoffins/xcoffins.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/xgalley/l3galley.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/xgalley/xgalley.pdf
    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/l3docstrip.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3obsolete.txt
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/source3.pdf
    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/l3experimental/l3str/l3str-convert.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx
    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/l3experimental/l3str/l3str-convert.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty
    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

Added Paths:
-----------
    trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex
    trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3experimental/README.md	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/doc/latex/l3experimental/README.md	2017-07-15 21:27:01 UTC (rev 44813)
@@ -1,7 +1,7 @@
 Experimental LaTeX3 Concepts
 ============================
 
-Release 2017/05/29
+Release 2017/07/15
 
 Overview
 --------

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-convert.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-format.pdf
===================================================================
(Binary files differ)

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

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/xgalley/l3galley.pdf
===================================================================
(Binary files differ)

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

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/README.md	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/README.md	2017-07-15 21:27:01 UTC (rev 44813)
@@ -1,7 +1,7 @@
 LaTeX3 Programming Conventions
 ==============================
 
-Release 2017/05/29
+Release 2017/07/15
 
 Overview
 --------
@@ -30,8 +30,7 @@
 The `l3kernel` bundle requires the e-TeX extensions and additional functionality
 to support string comparisons, expandable character generation with arbitrary
 category codes (for Unicode engines) and PDF support primitives (where direct
-PDF generation is used). The bundle will therefore only work with the following
-engines:
+PDF generation is used). The bundle only works with the following engines:
 * pdfTeX v1.40 or later
 * XeTeX v0.9994 or later
 * LuaTeX v0.70 or later
@@ -38,7 +37,7 @@
 * e-(u)pTeX from mid-2012 onward
 
 pdfTeX v1.40 was released in 2007, and so any recent TeX distribution
-will support `l3kernel`. Both XeTeX and LuaTeX have developed more
+supports `l3kernel`. Both XeTeX and LuaTeX have developed more
 actively over the past few years, and for this reason only recent
 releases of these engines are supported.
 

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)

Added: trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex	2017-07-15 21:27:01 UTC (rev 44813)
@@ -0,0 +1,88 @@
+% \iffalse meta-comment
+%
+%% File: interfaces3.tex Copyright (C) 1990-2011 The LaTeX3 Project
+%%
+%% It may be distributed and/or modified under the conditions of the
+%% LaTeX Project Public License (LPPL), either version 1.3c of this
+%% license or (at your option) any later version.  The latest version
+%% of this license is in the file
+%%
+%%    http://www.latex-project.org/lppl.txt
+%%
+%% This file is part of the "l3kernel bundle" (The Work in LPPL)
+%% and all files in that bundle must be distributed together.
+%%
+%% The released version of this bundle is available from CTAN.
+%%
+%% -----------------------------------------------------------------------
+%%
+%% The development version of the bundle can be found at
+%%
+%%    http://www.latex-project.org/svnroot/experimental/trunk/
+%%
+%% for those people who are interested.
+%%
+%%%%%%%%%%%
+%% NOTE: %%
+%%%%%%%%%%%
+%%
+%%   Snapshots taken from the repository represent work in progress and may
+%%   not work or may contain conflicting material!  We therefore ask
+%%   people _not_ to put them into distributions, archives, etc. without
+%%   prior consultation with the LaTeX3 Project.
+%%
+%% -----------------------------------------------------------------------
+%
+% \fi
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% This document typesets the LaTeX3 interface descriptions a single document.
+% This produces quite a large file (more than 170 pages currently).
+%
+% There is also a full version of the sources (source3.tex) which additionally
+% also typesets the command implementations.
+%
+% Do not forget to generate the index (as explained on the terminal output
+% near the end of the run)!
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\documentclass{l3doc}
+\listfiles
+
+\begin{document}
+
+\title{The \LaTeX3 Interfaces}
+\author{%
+ The \LaTeX3 Project\thanks
+   {%
+     E-mail:
+       \href{mailto:latex-team at latex-project.org}
+         {latex-team at latex-project.org}%
+   }%
+}
+
+\pagenumbering{roman}
+\maketitle
+
+%
+% First load all modules and typeset the documentation parts
+%
+
+\input{source3body}    % all the individual modules
+
+\clearpage
+
+\begingroup
+  \def\endash{--}
+  \catcode`\-\active
+  \def-{\futurelet\temp\indexdash}
+  \def\indexdash{\ifx\temp-\endash\fi}
+  \DelayPrintIndex
+\endgroup
+
+\end{document}
+
+


Property changes on: trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3obsolete.txt
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/l3obsolete.txt	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3obsolete.txt	2017-07-15 21:27:01 UTC (rev 44813)
@@ -18,7 +18,16 @@
 \c_minus_one                      2018
 \box_resize:cnn                   2018
 \box_resize:Nnn                   2018
+\file_add_path:nN                 2018
+\file_list:                       2018
+\file_path_include:n              2018
+\file_path_remove:n               2018
+\g_file_current_name_tl           2018
 \ior_get_str:NN                   2017
+\ior_list_streams:                2018
+\ior_log_streams:                 2018
+\iow_list_streams:                2018
+\iow_log_streams:                 2018
 \sort_ordered:                    2018
 \sort_reversed:                   2018
 \tl_to_lowercase:n                2017

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

Added: trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex	2017-07-15 21:27:01 UTC (rev 44813)
@@ -0,0 +1,274 @@
+\iffalse meta-comment
+
+File l3styleguide.tex Copyright (C) 2011,2012,2015-2017 The LaTeX3 Project
+
+It may be distributed and/or modified under the conditions of the
+LaTeX Project Public License (LPPL), either version 1.3c of this
+license or (at your option) any later version.  The latest version
+of this license is in the file
+
+   http://www.latex-project.org/lppl.txt
+
+This file is part of the "l3kernel bundle" (The Work in LPPL)
+and all files in that bundle must be distributed together.
+
+The released version of this bundle is available from CTAN.
+
+\fi
+
+\documentclass{l3doc}
+
+
+\title{%
+  The \LaTeX3 kernel: style guide for code authors%
+}
+\author{%
+  The \LaTeX3 Project\thanks
+    {%
+      E-mail:
+      \href{mailto:latex-team at latex-project.org}%
+        {latex-team at latex-project.org}%
+    }%
+}
+\date{Released 2017/07/15}
+
+\begin{document}
+
+\maketitle
+
+\tableofcontents
+
+\section{Introduction}
+
+This document is intended as a style guide for authors of code and
+documentation for the \LaTeX3 kernel. It covers both aspects of coding
+style and the formatting of the sources. The aim of providing these
+guidelines is help ensure consistency of the code and sources from
+different authors. Experience suggests that in the long-term this helps
+with maintenance. There will of course be places where there are
+exceptions to these guidelines: common sense should always be
+applied!
+
+\section{Documentation style}
+
+\LaTeX3 source and documentation should be written using the document
+class \cls{l3doc} in \file{dtx} format. This class provides a number
+of logical mark up elements, which should be used where possible.
+In the main, this is standard \LaTeX{} practice, but there are a
+few points to highlight:
+\begin{itemize}
+  \item
+    Where possible, use \cs{cs} to mark up control sequences
+    rather than using a verbatim environment.
+  \item
+    Arguments which are given in braces should be marked using
+    \cs{Arg} when code-level functions are discussed, but using
+    \cs{marg} for document functions.
+  \item
+    The names \TeX{}, \LaTeX{}, \emph{etc}.\ use the normal logical mark
+    up followed by an empty group (|{}|), with the exception of |\LaTeX3|,
+    where the number should follow directly.
+  \item
+    Where in line verbatim text is used, it should be marked up
+    using the \verb=|...|= construct (\emph{i.e.}~vertical bars delimit
+    the verbatim text).
+  \item In line quotes should be marked up using the \cs{enquote}
+    function.
+  \item
+    Where numbers in the source have a mathematical meaning,
+    they should be included in math mode. Such in-line math mode
+    material should be marked up using |$...$| and  \emph{not}
+    |\(...\)|.
+\end{itemize}
+
+Line length in the source files should be under $80$
+characters where possible, as this helps keep everything on the screen
+when editing files. In the \file{dtx} format, documentation lines start
+with a \texttt{\%}, which is usually followed by a space to leave a
+\enquote{comment margin} at the start of each line.
+
+As with code indenting (see later), nested environments and arguments
+should be indented by (at least) two spaces to make the nature of the nesting
+clear. Thus for example a typical arrangement for the \env{function}
+environment might be
+\begin{verbatim*}
+\begin{function}{\seq_gclear:N, \seq_gclear:c}
+  \begin{syntax}
+    \cs{seq_gclear:N} \meta{sequence}
+  \end{syntax}
+  Clears all entries from the \meta{sequence} globally.
+\end{function}
+\end{verbatim*}
+The \enquote{outer} \verb*|% \begin{function}| should have the customary
+space after the |%| character at the start of the line.
+
+In general, a single \env{function}  or \env{macro} environment should be
+used for a group of closely-related functions, for example argument
+specification variants. In such cases, a comma-separated list should be
+used, as shown in the preceding example.
+
+\section{Format of the code itself}
+
+The requirement for fewer than $80$ characters per line applies to the code
+itself as well as the surrounding documentation. A number of the general
+style principles for \LaTeX3 code apply: these are described in the following
+paragraph and an example is then given.
+
+With the exception of simple runs of parameter (|{#1}|, |#1#2|,
+\emph{etc.}), everything should be divided up using spaces to make the code
+more readable. In general, these will be single spaces, but in some
+places it makes more sense to align parts of the code to emphasise
+similarity. (Tabs should not be used for introducing white space.)
+
+Each conceptually-separate step in a function should be on a separate
+line, to make the meaning clearer. Hence the \texttt{false} branch
+in the example uses two lines for the two auxiliary function uses.
+
+Within the definition, a two-space indent should be used to show each
+\enquote{level} of code. Thus in the example \cs{tl_if_empty:nTF} is
+indented by two spaces, but the two branches are indented by four
+spaces. Within the \texttt{false} branch, the need for multiple lines
+means that an additional two-space indent should be used to show that
+these lines are all part of the brace group.
+
+The result of these lay-out conventions is code which in general
+looks like the example:
+\begin{verbatim*}
+\cs_new:Npn \module_foo:nn #1#2
+  {
+    \tl_if_empty:nTF {#1}
+      { \module_foo_aux:n { X #2 } }
+      {
+        \module_foo_aux:nn {#1} {#2}
+        \module_foo_aux:n { #1 #2 }
+      }
+  }
+\end{verbatim*}
+
+\section{Code conventions}
+
+All code-level functions should be \enquote{long} if they accept any
+arguments, even if it seems \enquote{very unlikely} that a \cs{par} token
+will be passed. Thus \cs{cs_new_nopar:Npn} and so forth should only be used
+to create interfaces at the document level (where trapping \cs{par} tokens
+may be appropriate) or where comparison to other code known not to be
+\enquote{long} is required (\emph{e.g.}~when working with mixed
+\LaTeXe{}/\pkg{expl3} situations).
+
+The expandability of each function should be well-defined. Functions which
+cannot be fully expanded must be \texttt{protected}. This means that expandable
+functions must themselves only contain expandable material. Functions which
+use any non-expandable material must be defined using \cs{cs_new_protected:Npn}
+or similar.
+
+When using \cs{cs_generate_variant:Nn}, group related variants together
+to make the pattern clearer. A common example is variants of a function
+which has an \texttt{N}-type first argument:
+\begin{verbatim}
+  \cs_generate_variant:Nn \foo:Nn {     NV , No }
+  \cs_generate_variant:Nn \foo:Nn { c , cV , co }
+\end{verbatim}
+
+There may be cases where omitting braces from \texttt{o}-type arguments
+is desirable for performance reasons. This should only be done if the
+argument is a single token, thus for example
+\begin{verbatim}
+  \tl_set:No \l_some_tl \l_some_other_tl
+\end{verbatim}
+remains clear and can be used where appropriate.
+
+\section{Private and internal functions}
+
+Private functions (those starting \cs{__}) should not be used between modules.
+The only exception is where a \enquote{family} of modules share some
+\enquote{internal} methods: this happens most obviously in the kernel itself.
+Any internal functions or variables \emph{must} be documented in the same way
+as public ones.
+
+The \pkg{l3docstrip} method should be used for internal functions in a module.
+This requires a line
+\begin{quote}
+  \ttfamily
+  \%<@@=\meta{module}>
+\end{quote}
+at the start of the source (\texttt{.dtx}) file, with internal functions
+then written in the form
+\begin{verbatim}
+  \cs_new_protected:Npn \@@_function:nn #1#2
+    ...
+\end{verbatim}
+
+\subsection{Access from other modules}
+
+There may be cases where it is useful to use an internal function from
+a third-party module (this includes cases where you are the author of both
+but they are not part of the same \enquote{family}). In these cases, you should
+\emph{copy} the definition of the internal function to your code: this avoids
+relying on non-documented interfaces. At the same time, it is strongly
+encouraged that you discuss your requirements with the author of the
+code you need to access. The best long-term solution to these cases is for
+new documented interfaces to be added to the parent module.
+
+\subsection{Access to primitives}
+
+As \pkg{expl3} is still a developing system, there are places where direct
+access to engine primitives is required. These are all marked as
+\enquote{do not use} in the code and so require special handling. Where a
+programmer is sure that they need to use a primitive (for example where the
+team have not yet covered access to an area) then a local copy of the
+primitive should be made, for example
+\begin{verbatim}
+  \cs_new_eq:NN \__module_message:w \tex_message:D
+  % ...
+  \cs_new_protected:Npn \__module_fancy_msg:n #1
+    { \__module_message:w { *** #1 *** } }
+\end{verbatim}
+This approach makes it possible for the team and others to find such
+usage (by searching for the \texttt{:D} argument type) but avoids
+multiple uses in general code.
+
+At the same time, the team ask that these use cases are raised on the
+\texttt{LaTeX-L} mailing list. The team are keen to collect use cases for
+areas that have not yet been addressed and to provide new code where the
+required interfaces become clear.
+
+Programmers using primitives should be ready to make updates to their
+code as the team develop additional interfaces.
+
+\section{Auxiliary functions}
+
+In general, the team encourages the use of descriptive names in \LaTeX3 code.
+Thus many helper functions would have names which describe briefly what they do,
+rather than simply indicating that they are auxiliary to some higher-level
+function. However, there are places where one or more \texttt{aux} functions
+are required. Where possible, these should be differentiated by signature
+\begin{verbatim}
+  \cs_new_protected:Npn \@@_function:nn #1#2
+    {
+      ...
+    }
+  \cs_new_protected:Npn \@@_function_aux:nn #1#2
+    {
+      ...
+    }
+  \cs_new_protected:Npn \@@_function_aux:w #1#2 \q_stop
+    {
+      ...
+    }
+\end{verbatim}
+Where more than one auxiliary shares the same signature, the recommended naming
+scheme is \texttt{auxi}, \texttt{auxii} and so on.
+\begin{verbatim}
+  \cs_new_protected:Npn \@@_function_auxi:nn #1#2
+    {
+      ...
+    }
+  \cs_new_protected:Npn \@@_function_auxii:nn #1#2
+    {
+      ...
+    }
+\end{verbatim}
+The use of \texttt{aux_i}, \texttt{aux_ii}, \emph{etc.}\ is discouraged as this
+conflicts with the convention used by \cs{use_i:nn} and related functions.
+
+\end{document}


Property changes on: trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf
===================================================================
(Binary files differ)

Added: trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex	2017-07-15 21:27:01 UTC (rev 44813)
@@ -0,0 +1,101 @@
+\iffalse meta-comment
+
+File l3syntax-changes.tex Copyright (C) 2011-2012,2017 The LaTeX3 Project
+
+It may be distributed and/or modified under the conditions of the
+LaTeX Project Public License (LPPL), either version 1.3c of this
+license or (at your option) any later version.  The latest version
+of this license is in the file
+
+   http://www.latex-project.org/lppl.txt
+
+This file is part of the "l3kernel bundle" (The Work in LPPL)
+and all files in that bundle must be distributed together.
+
+The released version of this bundle is available from CTAN.
+
+\fi
+
+\documentclass{l3doc}
+
+
+\title{%
+  Syntax changes in \LaTeX3 functions%
+}
+\author{%
+  The \LaTeX3 Project\thanks
+    {%
+      E-mail:
+      \href{mailto:latex-team at latex-project.org}%
+        {latex-team at latex-project.org}%
+    }%
+}
+\date{Released 2017/07/15}
+
+\newcommand{\TF}{\textit{(TF)}}
+
+\begin{document}
+
+\maketitle
+
+This file lists functions whose syntax has changed after August 2011,
+with an approximate date.
+
+\section{August 2011}
+
+\begin{itemize}
+  \item \cs{tl_if_single:n\TF} recognized any non-zero number of
+    explicit spaces as \meta{true}, and did not ignore trailing spaces.
+    Now it is \meta{true} for
+    \[
+      \meta{optional spaces}
+      \meta{normal token or brace group}
+      \meta{optional spaces}.
+    \]
+  \item \cs{tl_reverse:n} stripped outer braces and lost unprotected spaces.
+    Now it keeps spaces, leaves unbraced single tokens unbraced, and
+    braced groups braced.
+  \item \cs{tl_trim_spaces:n} only removed one leading and trailing space.
+    Now removes recursively. Also, on the left it used to strip implicit
+    and explicit spaces with any character code. Now it strips only explicit
+    space characters $(32,10)$.
+\end{itemize}
+
+\section{September 2011}
+
+\begin{itemize}
+\item clist functions which receive an \texttt{n}-type comma list argument
+  now trim spaces from each item in the argument.
+\end{itemize}
+
+\section{June 2012}
+
+\begin{itemize}
+  \item Access to list functions now indexes from~$1$, not from~$0$.
+  This applies to multiple choices in the \pkg{l3keys} module and
+  the \cs{clist_item:Nn}, \cs{seq_item:Nn} and \cs{tl_item:Nn}
+  functions.
+  \item \cs{tl_trim_spaces:n} now requires a variable number of
+  expansions to fully expand, rather than exactly two.  Of course,
+  \texttt{x}-type expansion still correctly evaluates this function.
+\end{itemize}
+
+\section{July 2012}
+
+\begin{itemize}
+  \item The \cs{tl_if_head_eq_meaning:nN}, \cs{tl_if_head_eq_catcode:nN}
+    and \cs{tl_if_head_eq_charcode:nN} conditionals now never match when
+    their first argument is empty.
+\end{itemize}
+
+\section{August 2012}
+
+\begin{itemize}
+  \item \cs{lua_now:x} is now a standard \texttt{x}-type expansion of
+    \cs{lua_now:n}, which does no expansion. Engine-level expansion is moved
+    to \cs{lua_now_x:n}, reflecting the fact that this is non-standard in the
+    same way as for example \cs{str_if_eq_x:nn(TF)}.
+\end{itemize}
+
+
+\end{document}


Property changes on: trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/source3.pdf
===================================================================
(Binary files differ)

Added: trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex	2017-07-15 21:27:01 UTC (rev 44813)
@@ -0,0 +1,106 @@
+% \iffalse meta-comment
+%
+%% File: source3.tex Copyright (C) 1990-2011 The LaTeX3 Project
+%%
+%% It may be distributed and/or modified under the conditions of the
+%% LaTeX Project Public License (LPPL), either version 1.3c of this
+%% license or (at your option) any later version.  The latest version
+%% of this license is in the file
+%%
+%%    http://www.latex-project.org/lppl.txt
+%%
+%% This file is part of the "l3kernel bundle" (The Work in LPPL)
+%% and all files in that bundle must be distributed together.
+%%
+%% The released version of this bundle is available from CTAN.
+%%
+%% -----------------------------------------------------------------------
+%%
+%% The development version of the bundle can be found at
+%%
+%%    http://www.latex-project.org/svnroot/experimental/trunk/
+%%
+%% for those people who are interested.
+%%
+%%%%%%%%%%%
+%% NOTE: %%
+%%%%%%%%%%%
+%%
+%%   Snapshots taken from the repository represent work in progress and may
+%%   not work or may contain conflicting material!  We therefore ask
+%%   people _not_ to put them into distributions, archives, etc. without
+%%   prior consultation with the LaTeX3 Project.
+%%
+%% -----------------------------------------------------------------------
+%
+% \fi
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% This document typesets the LaTeX3 sources as a single document.
+% This produces quite a large file (more than 780 pages).
+%
+% There is also a shorter version (interface3.tex) that only typesets the
+% command % interface descriptions.
+%
+% Do not forget to generate the index (as explained on the terminal output
+% near the end of the run)!
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\documentclass{l3doc}
+\listfiles
+
+\begin{document}
+
+\title{The \LaTeX3 Sources}
+\author{%
+ The \LaTeX3 Project\thanks
+   {%
+     E-mail:
+       \href{mailto:latex-team at latex-project.org}
+         {latex-team at latex-project.org}%
+   }%
+}
+
+\pagenumbering{roman}
+\maketitle
+
+%
+% First load all modules and typeset the documentation parts
+%
+
+\input{source3body}    % all the individual modules
+
+%
+% Now reload all modules and typeset the implementation parts
+%
+
+\part{Implementation}
+
+\def\maketitle{}
+\EnableImplementation
+\DisableDocumentation
+\DocInputAgain
+
+\clearpage
+\pagestyle{headings}
+
+% Make TeX shut up.
+\hbadness=10000
+\newcount\hbadness
+\hfuzz=\maxdimen
+
+\PrintChanges
+\clearpage
+
+\begingroup
+  \def\endash{--}
+  \catcode`\-\active
+  \def-{\futurelet\temp\indexdash}
+  \def\indexdash{\ifx\temp-\endash\fi}
+
+  \DelayPrintIndex
+\endgroup
+
+\end{document}


Property changes on: trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/texmf-dist/doc/latex/l3packages/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3packages/README.md	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/doc/latex/l3packages/README.md	2017-07-15 21:27:01 UTC (rev 44813)
@@ -1,7 +1,7 @@
 LaTeX3 High-Level Concepts
 ==========================
 
-Release 2017/05/29
+Release 2017/07/15
 
 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/l3experimental/l3str/l3str-convert.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-convert.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-convert.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -47,7 +47,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -252,7 +252,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{l3str-convert}{2017/05/29}{}
+\ProvidesExplPackage{l3str-convert}{2017/07/15}{}
   {L3 Experimental string encoding conversions}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -47,7 +47,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -163,7 +163,7 @@
 %
 %    \begin{macrocode}
 %<*package>
-\ProvidesExplPackage{l3str-format}{2017/05/29}{}
+\ProvidesExplPackage{l3str-format}{2017/07/15}{}
   {L3 Experimental string formatting}
 \RequirePackage{l3str}
 %</package>

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -54,7 +54,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -673,7 +673,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xcoffins}{2017/05/29}{}
+\ProvidesExplPackage{xcoffins}{2017/07/15}{}
   {L3 Experimental design level coffins}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -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/05/29]
-%<package>\@ifpackagelater{expl3}{2017/05/29}
+\RequirePackage{expl3}[2017/07/15]
+%<package>\@ifpackagelater{expl3}{2017/07/15}
 %<package>  {}
 %<package>  {%
 %<package>    \PackageError{l3galley}{Support package l3kernel too old}
@@ -59,7 +59,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -685,7 +685,7 @@
 %
 %    \begin{macrocode}
 %<*package>
-\ProvidesExplPackage{l3galley}{2017/05/29}{}
+\ProvidesExplPackage{l3galley}{2017/07/15}{}
   {L3 Experimental galley code}
 %</package>
 %    \end{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -45,7 +45,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -732,7 +732,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xgalley}{2017/05/29}{}
+\ProvidesExplPackage{xgalley}{2017/07/15}{}
   {L3 Experimental galley}
 \RequirePackage{xparse,xtemplate,l3galley}
 %    \end{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -21,7 +21,7 @@
 % for those people who are interested.
 %
 %<*driver|generic|package>
-\def\ExplFileDate{2017/05/29}%
+\def\ExplFileDate{2017/07/15}%
 %</driver|generic|package>
 %<*driver>
 \documentclass[full]{l3doc}
@@ -49,7 +49,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -97,7 +97,7 @@
 % The \pkg{expl3} bundle provides this new programming interface for
 % \LaTeX{}. To make programming systematic, \LaTeX3 uses some very
 % different conventions to \LaTeXe{} or plain \TeX{}. As a result,
-% programmers starting with \LaTeX3 will need to become familiar with
+% programmers starting with \LaTeX3 need to become familiar with
 % the syntax of the new language.
 %
 % The next section shows where this language fits into a complete
@@ -239,11 +239,11 @@
 % \subsection{Formal naming syntax}
 %
 % We shall now look in more detail at the syntax of these names. A
-% function name in \LaTeX3 will have a name consisting of three parts:
+% function name in \LaTeX3 has a name consisting of three parts:
 % \begin{quote}
 %   |\|\meta{module}|_|\meta{description}|:|\meta{arg-spec}
 % \end{quote}
-% while a variable will have (up to) four distinct parts to its name:
+% while a variable has (up to) four distinct parts to its name:
 % \begin{quote}
 %   |\|\meta{scope}|_|\meta{module}|_|\meta{description}|_|\meta{type}
 % \end{quote}
@@ -262,7 +262,8 @@
 % as needed; the programmer can choose any unused name, consisting
 % of letters only, for a module. In general, the module name and module
 % prefix should be related: for example, the kernel module containing
-% \texttt{box} functions is called \texttt{l3box}.
+% \texttt{box} functions is called \texttt{l3box}.  Module names and
+% programmers' contact details are listed in \pkg{l3prefixes.csv}.
 %
 % The \emph{description} gives more detailed information about the
 % function or parameter, and provides a unique name for it.  It should
@@ -351,7 +352,7 @@
 %   \tl_new:N \l_@@_my_tl
 %   %    \end{macrocode}
 % \end{verbatim}
-% will be converted by \pkg{l3docstrip} to
+% is converted by \pkg{l3docstrip} to
 % \begin{verbatim}
 %   \cs_new:Npn \__foo_function:n #1
 %     ...
@@ -383,7 +384,7 @@
 % stack.\footnote{See \emph{The \TeX{}book}, p.\,301, for further
 % information.}
 %
-% The \meta{type} will be in the list of available
+% The \meta{type} is in the list of available
 % \emph{data-types};\footnote{Of course, if a totally new data type is
 % needed then this will not be the case. However, it is hoped that only
 % the kernel team will need to create new data types.} these include the
@@ -461,7 +462,7 @@
 %   behaviour}. The \LaTeX3 coding convention is that all variables must
 % be declared before use.
 %
-% The \pkg{expl3} package can be loaded with the |check-declarations|
+% The \pkg{expl3} package can be loaded with the \texttt{check-declarations}
 % option to verify that all variables are declared before use. This has
 % a performance implication and is therefore intended for testing during
 % development and not for use in production documents.
@@ -537,7 +538,7 @@
 % \begin{quote}
 %   \cs{seq_gpush:Nn} |\g_ior_file_name_seq| |\l_ior_curr_file_tl|
 % \end{quote}
-% we will not get the value of the variable pushed onto the stack,
+% we do not get the value of the variable pushed onto the stack,
 % only the variable name itself. Instead a suitable number of
 % \cs{exp_after:wN} would be necessary (together with extra braces) to
 % change the order of expansion,\footnote{\cs{exp_after:wN} is
@@ -588,7 +589,7 @@
 %     \end{quote}
 %     Remember that \texttt{c} arguments are \emph{fully expanded} by
 %     \TeX{} when creating csnames. This means that (a) the entire
-%     argument must be expandable and (b) any variables will be
+%     argument must be expandable and (b) any variables are
 %     converted to their content. So the preceding examples are also
 %     equivalent to
 %     \begin{quote}
@@ -629,7 +630,7 @@
 %     list.\\ Almost the same as the |x| type except here the token list
 %     is expanded fully until the first unexpandable token is found and
 %     the rest is left unchanged. Note that if this function finds a
-%     space at the beginning of the argument it will gobble it and not
+%     space at the beginning of the argument it gobbles it and does not
 %     expand the next token.
 % \end{description}
 %
@@ -691,21 +692,21 @@
 % within its second argument, according to our conventions.  Such a
 % function takes two normal \enquote{\texttt{n}} arguments and operates
 % on token lists: it might reasonably be named |\tl_test_in:nn|.  Thus
-% the variant function we need will be defined with the appropriate
-% argument types and its name will be |\tl_test_in:cV|.  Now this code
-% fragment will be simply:
+% the variant function we need would be defined with the appropriate
+% argument types and its name would be |\tl_test_in:cV|.  Now this code
+% fragment would be simply:
 % \begin{verbatim}
 %   \tl_test_in:cV { sym #3 } \group at list
 % \end{verbatim}
 % This code could be improved further by using a sequence |\l_group_seq|
 % rather than the bare token list |\group at list|.  Note that, in addition
-% to the lack of \tn{expandafter}, the space after the~|}| will be
+% to the lack of \tn{expandafter}, the space after the~|}| is
 % silently ignored since all white space is ignored in this programming
 % environment.
 %
 % \subsection{New functions from old}
 %
-% For many common functions the \LaTeX3 kernel will provide variants
+% For many common functions the \LaTeX3 kernel provides variants
 % with a range of argument forms, and similarly it is expected that
 % extension packages providing new functions will make them available in
 % all the commonly needed forms.
@@ -761,7 +762,7 @@
 %
 % This extension mechanism is written so that if the same new form of
 % some existing command is implemented by two extension packages then the
-% two definitions will be identical and thus no conflict will occur.
+% two definitions are identical and thus no conflict occurs.
 %
 % \section{The distribution}
 %
@@ -836,7 +837,7 @@
 %   }
 %   \explpkg{l3quark}{
 %     A \enquote{quark} is a command that is defined to expand to
-%     itself!  Therefore they must never be expanded as this will generate
+%     itself!  Therefore they must never be expanded as this would generate an
 %     infinite recursion; they do however have many uses, \emph{e.g.}~as
 %     special markers and delimiters within code.
 %   }
@@ -919,7 +920,7 @@
 % which are constructed using macros as the underlying storage system. The
 % \texttt{check-declarations} option enables checking for all variable
 % assignments, issuing an error if any variables are assigned without being
-% initialised.
+% initialised.  See also the function \cs{debug_check_declarations_on:}.
 %
 % \DescribeOption{log-functions}
 % The \texttt{log-functions} option is used to enable recording of every new
@@ -926,14 +927,23 @@
 % function name in the \texttt{.log} file. This is useful for debugging
 % purposes, as it means that there is a complete list of all functions
 % created by each module loaded (with the exceptions of a very small number
-% required by the bootstrap code for \LaTeX3).
+% required by the bootstrap code for \LaTeX3).  See also the function
+% \cs{debug_log_functions_on:}.
 %
+% \DescribeOption{enable-debug}
+% To allow more localized checking and logging than provided by
+% \texttt{check-declarations} and \texttt{log-functions}, \pkg{expl3}
+% provides a few \cs[no-index]{debug_\ldots{}} functions (described
+% elsewhere) that turn on the corresponding checks within a group.
+% These functions can only be used if \pkg{expl3} is loaded with the
+% \texttt{enable-debug} option.
+%
 % \DescribeOption{driver}
 % Selects the driver to be used for color, graphics and related operations that
 % are driver-dependent. Options available are
 % \begin{itemize}[font = \texttt]
 %   \item[auto] Let \LaTeX3 determine the correct driver. With DVI output, this
-%     will select the \texttt{dvips} back-end for \pdfTeX{} and \LuaTeX{}, and
+%     selects the \texttt{dvips} back-end for \pdfTeX{} and \LuaTeX{}, and
 %     \texttt{dvipdfmx} for \pTeX{} and \upTeX{}.  This is the standard setting.
 %   \item[latex2e] Use the \pkg{graphics} package to select the driver, rather
 %     than \LaTeX3 code.
@@ -952,17 +962,17 @@
 % \begin{verbatim}
 %   \input expl3-generic %
 % \end{verbatim}
-% This will enable the programming layer to work with the other formats.
+% This enables the programming layer to work with the other formats.
 % As no options are available loading in this way, the \enquote{native}
 % drivers are automatically used. If this \enquote{generic} loader is
-% used with \LaTeXe{} the code will automatically switch to the appropriate
+% used with \LaTeXe{} the code automatically switches to the appropriate
 % package route.
 %
 % After loading the programming layer using the generic interface, the
 % commands \cs{ExplSyntaxOn} and \cs{ExplSyntaxOff} and the code-level
-% functions and variables detailed in \pkg{interface3} will be available.
-% Note that other \LaTeXe{} packages \emph{using} \pkg{expl3} will not
-% be loadable: package loading is dependent on the \LaTeXe{} package-management
+% functions and variables detailed in \pkg{interface3} are available.
+% Note that other \LaTeXe{} packages \emph{using} \pkg{expl3} are not
+% loadable: package loading is dependent on the \LaTeXe{} package-management
 % mechanism.
 %
 % \section{Engine/primitive requirements}
@@ -1174,14 +1184,19 @@
 % \begin{variable}[int]
 %   {
 %     \l at expl@check at declarations@bool ,
-%     \l at expl@log at functions@bool
+%     \l at expl@log at functions@bool ,
+%     \l at expl@enable at debug@bool
 %   }
 % \begin{variable}[int]{\l at expl@options at clist}
-%   Options to be set up.
-%   These have to be done by hand as there is no \pkg{expl3} yet: the logging
-%   option is needed before loading \pkg{l3basics}! Only a minimal set of
-%   options are handled here: others are left for a proper key--value approach
-%   once the kernel is loaded.
+%   Options to be set up.  These have to be done by hand as there is no
+%   \pkg{expl3} yet: the logging option is needed before loading
+%   \pkg{l3basics}! Only a minimal set of options are handled here:
+%   others are left for a proper key--value approach once the kernel is
+%   loaded.  After processing the options we set the
+%   \texttt{enable-debug} boolean so that the options
+%   \texttt{check-declarations} and \texttt{log-functions} imply
+%   \texttt{enable-debug}: otherwise the necessary debugging code would
+%   not be set up properly.
 %    \begin{macrocode}
 \newcommand\expl at create@bool at option[2]%
   {%
@@ -1193,7 +1208,9 @@
   }
 \expl at create@bool at option{check-declarations}\l at expl@check at declarations@bool
 \expl at create@bool at option{log-functions}\l at expl@log at functions@bool
+\expl at create@bool at option{enable-debug}\l at expl@enable at debug@bool
 \let\expl at create@bool at option\@undefined
+\chardef\l at expl@enable at debug@bool=0 %
 \newcommand*\l at expl@options at clist{}
 \DeclareOption*
   {%
@@ -1207,6 +1224,12 @@
     \fi
   }
 \ProcessOptions\relax
+\ifodd\l at expl@check at declarations@bool
+  \chardef\l at expl@enable at debug@bool=1 %
+\fi
+\ifodd\l at expl@log at functions@bool
+  \chardef\l at expl@enable at debug@bool=1 %
+\fi
 %    \end{macrocode}
 % \end{variable}
 % \end{variable}
@@ -1238,7 +1261,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-%  Load the business end: this will leave \cs{expl3} syntax on.
+%  Load the business end: this leaves \cs{expl3} syntax on.
 %    \begin{macrocode}
 \input{expl3-code.tex}
 %    \end{macrocode}
@@ -1268,7 +1291,7 @@
 % \begin{variable}[int]{\l__expl_native_drivers_bool}
 %   With the code now loaded, options can be handled using a real key--value
 %   interpreter. The \enquote{faked} options are also included so that any
-%   erroneous input will be mopped up (\emph{e.g.}~\texttt{log-function =
+%   erroneous input is mopped up (\emph{e.g.}~\texttt{log-function =
 %   foo}). The checks on driver choice are set up here, so when actually
 %   the driver it's a straight forward operation.
 %    \begin{macrocode}
@@ -1509,6 +1532,11 @@
 %    \begin{macrocode}
 \tl_put_left:Nn \@pushfilename
   {
+    \exp_args:Nx \__file_input_push:n
+      {
+        \tl_to_str:N \@currname
+        \tl_to_str:N \@currext
+      }
     \tl_put_left:Nx \l__expl_status_stack_tl
       {
         \bool_if:NTF \l__kernel_expl_bool
@@ -1517,8 +1545,19 @@
       }
     \ExplSyntaxOff
   }
+\tl_put_right:Nn \@pushfilename { \@pushfilenameaux }
+%    \end{macrocode}
+%   This bit of trickery is needed to grab the name of the file being loaded
+%   so we can record it.
+%    \begin{macrocode}
+\cs_set_protected:Npn \@pushfilenameaux #1#2#3
+  {
+    \str_gset:Nn \g_file_curr_name_str {#3}
+    #1 #2 {#3}
+  }
 \tl_put_right:Nn \@popfilename
   {
+    \__file_input_pop:
     \tl_if_empty:NTF \l__expl_status_stack_tl
       { \ExplSyntaxOff }
       { \exp_after:wN \__expl_status_pop:w \l__expl_status_stack_tl \q_stop }
@@ -1572,7 +1611,7 @@
 %    \end{macrocode}
 % The \cs{relax} stops \cs{RequirePackage} from scanning for a date
 % argument.  Putting \tn{endinput} \emph{after} loading the package is
-% crucial, as otherwise \tn{endinput} will close the file
+% crucial, as otherwise \tn{endinput} would close the file
 % \file{expl3.sty} at the end of its first line: indeed, as long as
 % \file{expl3.sty} is open it is impossible to close the file
 % \file{expl3-generic.tex}.
@@ -1622,14 +1661,16 @@
 % \begin{variable}[int]
 %   {
 %     \l at expl@check at declarations@bool ,
-%     \l at expl@log at functions@bool
+%     \l at expl@log at functions@bool ,
+%     \l at expl@enable at debug@bool
 %   }
 %  In generic mode, there is no convenient option handling and so instead
 %  the two variables are defined to do nothing.
-%  appropriate value before input of the loader.
+%  Appropriate value before input of the loader.
 %    \begin{macrocode}
 \chardef \l at expl@check at declarations@bool = 0 %
 \chardef \l at expl@log at functions@bool = 0 %
+\chardef \l at expl@enable at debug@bool = 0 %
 %    \end{macrocode}
 % \end{variable}
 %
@@ -1652,7 +1693,7 @@
 % \end{macro}
 % \end{macro}
 %
-%  Load the business end: this will leave \cs{expl3} syntax on.
+%  Load the business end: this leaves \cs{expl3} syntax on.
 %    \begin{macrocode}
 \input expl3-code.tex %
 %    \end{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -98,11 +98,11 @@
 %   \end{syntax}
 %   Adds \meta{token} to the list of \meta{tokens} to be inserted
 %   when the current group level ends. The list of \meta{tokens} to be
-%   inserted will be empty at the beginning of a group: multiple
+%   inserted is empty at the beginning of a group: multiple
 %   applications of \cs{group_insert_after:N} may be used to build
 %   the inserted list one \meta{token} at a time. The current group
 %   level may be closed by a \cs{group_end:} function or by a token
-%   with category code $2$ (close-group). The later will be a ^^A{
+%   with category code $2$ (close-group), namely a ^^A{
 %   |}| if standard category codes apply.
 % \end{function}
 %
@@ -115,7 +115,7 @@
 % arguments absorbed by the function. In the following, \meta{code}
 % is therefore used as a shorthand for \enquote{replacement text}.
 %
-% Functions which are not \enquote{protected} will be fully expanded
+% Functions which are not \enquote{protected} are fully expanded
 % inside an \texttt{x} expansion. In contrast, \enquote{protected}
 % functions are not expanded within \texttt{x} expansions.
 %
@@ -124,7 +124,7 @@
 % Functions can be created with no requirement that they are declared
 % first (in contrast to variables, which must always be declared).
 % Declaring a function before setting up the code means that the name
-% chosen will be checked and an error raised if it is already in use.
+% chosen is checked and an error raised if it is already in use.
 % The name of a function can be checked at the point of definition using
 % the \cs[no-index]{cs_new\ldots} functions: this is recommended for all
 % functions which are defined for the first time.
@@ -136,17 +136,17 @@
 % \begin{description}
 %   \item[\texttt{new}]
 %     Create a new function with the \texttt{new} scope,
-%     such as \cs{cs_new:Npn}.  The definition is global and will result in
+%     such as \cs{cs_new:Npn}.  The definition is global and results in
 %     an error if it is already defined.
 %   \item[\texttt{set}]
 %     Create a new function with the \texttt{set} scope,
 %     such as \cs{cs_set:Npn}. The definition is restricted to the current
-%     \TeX{} group and will not result in an error if the function is already
+%     \TeX{} group and does not result in an error if the function is already
 %     defined.
 %   \item[\texttt{gset}]
 %     Create a new function with the \texttt{gset} scope,
 %     such as \cs{cs_gset:Npn}. The definition is global and
-%     will not result in an error if the function is already defined.
+%     does not result in an error if the function is already defined.
 % \end{description}
 %
 % Within each set of scope there are different ways to define a function.
@@ -193,7 +193,7 @@
 %   Creates \meta{function} to expand to \meta{code} as replacement text.
 %   Within the \meta{code}, the \meta{parameters} (|#1|, |#2|,
 %   \emph{etc.}) will be replaced by those absorbed by the function.
-%   The definition is global and an error will result if the
+%   The definition is global and an error results if the
 %   \meta{function} is already defined.
 % \end{function}
 %
@@ -210,7 +210,7 @@
 %   \emph{etc.}) will be replaced by those absorbed by the function.
 %   When the \meta{function} is used the \meta{parameters} absorbed
 %   cannot contain \cs{par} tokens. The definition is global and
-%   an error will result if the \meta{function} is already defined.
+%   an error results if the \meta{function} is already defined.
 % \end{function}
 %
 % \begin{function}
@@ -225,7 +225,7 @@
 %   Within the \meta{code}, the \meta{parameters} (|#1|, |#2|,
 %   \emph{etc.}) will be replaced by those absorbed by the function.
 %   The \meta{function} will not expand within an \texttt{x}-type
-%   argument. The definition is global and an error will result if the
+%   argument. The definition is global and an error results if the
 %   \meta{function} is already defined.
 % \end{function}
 %
@@ -243,7 +243,7 @@
 %   When the \meta{function} is used the \meta{parameters} absorbed
 %   cannot contain \cs{par} tokens. The \meta{function} will not
 %   expand within an \texttt{x}-type argument. The definition is global
-%   and an error will result if the \meta{function} is already defined.
+%   and an error results if the \meta{function} is already defined.
 % \end{function}
 %
 % \begin{function}{\cs_set:Npn, \cs_set:cpn, \cs_set:Npx, \cs_set:cpx}
@@ -388,7 +388,7 @@
 %   automatically from the function signature. These \meta{parameters}
 %   (|#1|, |#2|, \emph{etc.}) will be replaced by those absorbed by the
 %   function. The definition is global and
-%   an error will result if the \meta{function} is already defined.
+%   an error results if the \meta{function} is already defined.
 % \end{function}
 %
 % \begin{function}
@@ -405,7 +405,7 @@
 %   (|#1|, |#2|, \emph{etc.}) will be replaced by those absorbed by the
 %   function.  When the \meta{function} is used the \meta{parameters}
 %   absorbed cannot contain \cs{par} tokens. The definition is global and
-%   an error will result if the \meta{function} is already defined.
+%   an error results if the \meta{function} is already defined.
 % \end{function}
 %
 % \begin{function}
@@ -422,7 +422,7 @@
 %   (|#1|, |#2|, \emph{etc.}) will be replaced by those absorbed by the
 %   function. The \meta{function} will not expand within an \texttt{x}-type
 %   argument. The definition is global and
-%   an error will result if the \meta{function} is already defined.
+%   an error results if the \meta{function} is already defined.
 % \end{function}
 %
 % \begin{function}
@@ -440,7 +440,7 @@
 %   function.  When the \meta{function} is used the \meta{parameters}
 %   absorbed cannot contain \cs{par} tokens. The \meta{function} will not
 %   expand within an \texttt{x}-type argument. The definition is global and
-%   an error will result if the \meta{function} is already defined.
+%   an error results if the \meta{function} is already defined.
 % \end{function}
 %
 % \begin{function}
@@ -670,8 +670,7 @@
 %     \cs{cs_meaning:N} \meta{control sequence}
 %   \end{syntax}
 %   This function expands to the \emph{meaning} of the \meta{control sequence}
-%   control sequence. This will show the \meta{replacement text} for a
-%   macro.
+%   control sequence. For a macro, this includes the \meta{replacement text}.
 %   \begin{texnote}
 %     This is \TeX{}'s \tn{meaning} primitive.
 %     The \texttt{c} variant correctly reports undefined arguments.
@@ -710,8 +709,8 @@
 %   The content for \meta{control sequence name} may be literal
 %   material or from other expandable functions. The
 %   \meta{control sequence name} must, when fully expanded, consist
-%   of character tokens which are not active: typically, they will
-%   be of category code $10$ (space), $11$ (letter)
+%   of character tokens which are not active: typically
+%   of category code $10$ (space), $11$ (letter)
 %   or $12$ (other), or a mixture of these.
 % \end{function}
 %
@@ -752,8 +751,8 @@
 %   The content for \meta{control sequence name} may be literal
 %   material or from other expandable functions. The
 %   \meta{control sequence name} must, when fully expanded, consist
-%   of character tokens which are not active: typically, they will
-%   be of category code $10$ (space), $11$ (letter)
+%   of character tokens which are not active: typically
+%   of category code $10$ (space), $11$ (letter)
 %   or $12$ (other), or a mixture of these.
 %   \begin{texnote}
 %     These are the \TeX{} primitives \tn{csname} and \tn{endcsname}.
@@ -782,14 +781,14 @@
 %   \end{syntax}
 %   Converts the given \meta{control sequence} into a series of
 %   characters with category code $12$ (other), except spaces,
-%   of category code $10$. The sequence will \emph{not} include
-%   the current escape token, \emph{cf.}~\cs{token_to_str:N}.
+%   of category code $10$. The result does \emph{not} include
+%   the current escape token, contrarily to \cs{token_to_str:N}.
 %   Full expansion of this function requires exactly $2$ expansion
 %   steps, and so an \texttt{x}-type expansion, or two
-%   \texttt{o}-type expansions will be required to
+%   \texttt{o}-type expansions are required to
 %   convert the \meta{control sequence} to a sequence of characters
 %   in the input stream. In most cases, an \texttt{f}-expansion
-%   will be correct as well, but this loses a space at the start
+%   is correct as well, but this loses a space at the start
 %   of the result.
 % \end{function}
 %
@@ -796,8 +795,8 @@
 % \section{Using or removing tokens and arguments}
 %
 % Tokens in the input can be read and used or read and discarded.
-% If one or more tokens are wrapped in braces then in absorbing them
-% the outer set will be removed. At the same time, the category code
+% If one or more tokens are wrapped in braces then when absorbing them
+% the outer set is removed. At the same time, the category code
 % of each token is set when the token is read by a function (if it
 % is read more than once, the category code is determined by
 % the situation in force when first function absorbs the token).
@@ -809,21 +808,21 @@
 %     \cs{use:nnn}  \Arg{group_1} \Arg{group_2} \Arg{group_3}
 %     \cs{use:nnnn} \Arg{group_1} \Arg{group_2} \Arg{group_3} \Arg{group_4}
 %   \end{syntax}
-%   As illustrated, these functions will absorb between one and four
+%   As illustrated, these functions absorb between one and four
 %   arguments, as indicated by the argument specifier. The braces
-%   surrounding each argument will be removed leaving the remaining
-%   tokens in the input stream. The category code of these tokens will
-%   also be fixed by this process (if it has not already been by some
+%   surrounding each argument are removed and the remaining tokens are
+%   left in the input stream. The category code of these tokens is
+%   also fixed by this process (if it has not already been by some
 %   other absorption). All of these functions require only a single
 %   expansion to operate, so that one expansion of
 %   \begin{verbatim}
 %     \use:nn { abc } { { def } }
 %   \end{verbatim}
-%   will result in the input stream containing
+%   results in the input stream containing
 %   \begin{verbatim}
 %     abc { def }
 %   \end{verbatim}
-%   \emph{i.e.} only the outer braces will be removed.
+%   \emph{i.e.} only the outer braces are removed.
 % \end{function}
 %
 % \begin{function}[EXP]{\use_i:nn, \use_ii:nn}
@@ -836,7 +835,7 @@
 %   the first argument and leaves the content of the second argument in
 %   the input stream.
 %   The category code
-%   of these tokens will also be fixed (if it has not already been by
+%   of these tokens is also fixed (if it has not already been by
 %   some other absorption). A single expansion is needed for the
 %   functions to take effect.
 % \end{function}
@@ -851,7 +850,7 @@
 %   \cs{use_ii:nnn} and \cs{use_iii:nnn} work similarly, leaving the
 %   content of second or third arguments in the input stream, respectively.
 %   The category code
-%   of these tokens will also be fixed (if it has not already been by
+%   of these tokens is also fixed (if it has not already been by
 %   some other absorption). A single expansion is needed for the
 %   functions to take effect.
 % \end{function}
@@ -868,7 +867,7 @@
 %   \cs{use_ii:nnnn}, \cs{use_iii:nnnn} and \cs{use_iv:nnnn} work similarly,
 %   leaving the content of second, third or fourth arguments in the input
 %   stream, respectively. The category code
-%   of these tokens will also be fixed (if it has not already been by
+%   of these tokens is also fixed (if it has not already been by
 %   some other absorption). A single expansion is needed for the
 %   functions to take effect.
 % \end{function}
@@ -877,20 +876,20 @@
 %   \begin{syntax}
 %     \cs{use_i_ii:nnn} \Arg{arg_1} \Arg{arg_2} \Arg{arg_3}
 %   \end{syntax}
-%   This functions will absorb three arguments and leave the content of the
+%   This function absorbs three arguments and leaves the content of the
 %   first and second in the input stream. The category code of
-%   these tokens will also be fixed (if it has not already been by
+%   these tokens is also fixed (if it has not already been by
 %   some other absorption). A single expansion is needed for the
-%   functions to take effect. An example:
+%   function to take effect. An example:
 %   \begin{verbatim}
 %     \use_i_ii:nnn { abc } { { def } } { ghi }
 %   \end{verbatim}
-%   will result in the input stream containing
+%   results in the input stream containing
 %   \begin{verbatim}
 %     abc { def }
 %   \end{verbatim}
-%   \emph{i.e.} the outer braces will be removed and the third group
-%   will be removed.
+%   \emph{i.e.} the outer braces are removed and the third group
+%   is removed.
 % \end{function}
 %
 % \begin{function}[EXP]
@@ -974,17 +973,17 @@
 %     \begin{quote}
 %      |\cs_if_free:cTF {abc}| \Arg{true code} \Arg{false code}
 %     \end{quote}
-%     a function that will turn the first argument into a control sequence
+%     a function that turns the first argument into a control sequence
 %     (since it's marked as |c|) then checks whether this control sequence
-%     is still free and then depending on the result carry out the code in
+%     is still free and then depending on the result carries out the code in
 %     the second argument (true case) or in the third argument (false
 %     case).
 %
 %     These type of functions are known as \enquote{conditionals};
-%     whenever a |TF| function is defined it will usually be accompanied by
+%     whenever a |TF| function is defined it is usually accompanied by
 %     |T| and |F| functions as well. These are provided for convenience when
 %     the branch only needs to go a single way. Package writers are free to
-%     choose which types to define but the kernel definitions will always
+%     choose which types to define but the kernel definitions always
 %     provide all three versions.
 %
 %     Important to note is that these branching conditionals with \meta{true
@@ -993,7 +992,7 @@
 %     the input stream.
 %
 %     These conditional functions may or may not be fully expandable, but if
-%     they are expandable they will be accompanied by a \enquote{predicate}
+%     they are expandable they are accompanied by a \enquote{predicate}
 %     for the same test as described below.
 %
 %   \item[Predicates]
@@ -1016,8 +1015,8 @@
 %       \Arg{true code} \Arg{false code}
 %     \end{quote}
 %
-%     For each predicate defined, a \enquote{branching conditional} will
-%     also exist that behaves like a conditional described above.
+%     For each predicate defined, a \enquote{branching conditional}
+%     also exists that behaves like a conditional described above.
 %
 %   \item[Primitive conditionals]
 %      There is a third variety of conditional, which is the original
@@ -1052,7 +1051,7 @@
 %   \end{syntax}
 %   Tests whether the \meta{control sequence} is currently defined
 %   (whether as a function or another control sequence type). Any
-%   valid definition of \meta{control sequence} will evaluate as
+%   valid definition of \meta{control sequence} evaluates as
 %   \texttt{true}.
 % \end{function}
 %
@@ -1062,7 +1061,7 @@
 %     \cs{cs_if_free:NTF} \meta{control sequence} \Arg{true code} \Arg{false code}
 %   \end{syntax}
 %   Tests whether the \meta{control sequence} is currently free to
-%   be defined. This test will be \texttt{false} if the
+%   be defined. This test is \texttt{false} if the
 %   \meta{control sequence} currently exists (as defined by
 %   \cs{cs_if_exist:N}).
 % \end{function}
@@ -1071,13 +1070,13 @@
 %
 % The \eTeX{} engine itself provides many different conditionals. Some
 % expand whatever comes after them and others don't. Hence the names
-% for these underlying functions will often contain a |:w| part but
+% for these underlying functions often contains a |:w| part but
 % higher level functions are often available. See for instance
 % \cs{int_compare_p:nNn} which is a wrapper for \cs{if_int_compare:w}.
 %
 % Certain conditionals deal with specific data types like boxes and
 % fonts and are described there. The ones described below are either
-% the universal conditionals or deal with control sequences. We will
+% the universal conditionals or deal with control sequences. We
 % prefix primitive conditionals with |\if_|.
 %
 % \begin{function}[EXP]
@@ -1116,7 +1115,7 @@
 %     "\if:w" <token_1> <token_2> <true code> "\else:" <false code> "\fi:" \\
 %     "\if_catcode:w" <token_1> <token_2> <true code> "\else:" <false code> "\fi:"
 %   \end{syntax}
-%   These conditionals will expand any following tokens until two
+%   These conditionals expand any following tokens until two
 %   unexpandable tokens are left. If you wish to prevent this expansion,
 %   prefix the token in question with "\exp_not:N". "\if_catcode:w"
 %   tests if the category codes of the two tokens are the same whereas
@@ -1178,23 +1177,41 @@
 %   \texttt{check-declarations} is active.
 % \end{function}
 %
-% \begin{function}{\__chk_log:x}
+% \begin{function}{\__debug_log:x}
 %   \begin{syntax}
-%     \cs{__chk_log:x} \Arg{message text}
+%     \cs{__debug_log:x} \Arg{message text}
 %   \end{syntax}
-%   If the \texttt{log-functions} option is active, this function writes
-%   the \meta{message text} to the log file using \cs{iow_log:x}.
-%   Otherwise, the \meta{message text} is ignored using \cs{use_none:n}.
+%   Only defined when debugging is enabled (hence only in package mode
+%   with the right options).  If the \texttt{log-functions} option is
+%   active, this function writes the \meta{message text} to the log file
+%   using \cs{iow_log:x}.  Otherwise, the \meta{message text} is ignored
+%   using \cs{use_none:n}.
 % \end{function}
 %
-% \begin{function}{\__chk_suspend_log:, \__chk_resume_log:}
+% \begin{function}{\__debug_suspend_log:, \__debug_resume_log:}
 %   \begin{syntax}
-%     \cs{__chk_suspend_log:} \ldots{} \cs{__chk_log:x} \ldots{} \cs{__chk_resume_log:}
+%     \cs{__debug_suspend_log:} \ldots{} \cs{__debug_log:x} \ldots{} \cs{__debug_resume_log:}
 %   \end{syntax}
-%   Any \cs{__chk_log:x} command between \cs{__chk_suspend_log:} and
-%   \cs{__chk_resume_log:} is suppressed.  These commands can be nested.
+%   Any \cs{__debug_log:x} command between \cs{__debug_suspend_log:} and
+%   \cs{__debug_resume_log:} is suppressed.  These two commands can be
+%   nested and do nothing when debugging is disabled.
 % \end{function}
 %
+% \begin{function}{\__debug_patch:nnNw}
+%   \begin{syntax}
+%     \cs{__debug_patch:nnNw} \Arg{before} \Arg{after} \meta{definition} \ldots{}
+%   \end{syntax}
+%   If debugging is enabled (by one of few \pkg{expl3} options that
+%   imply \texttt{enable-debug}), adds the \meta{before} and
+%   \meta{after} tokens (which can involve |#1| and so on) in the
+%   \meta{definition} that follows.  Otherwise ignore the \meta{before}
+%   and \meta{after} code and perform the \meta{definition} with no
+%   patching.  The \meta{definition} must start with \cs{cs_new:Npn} or
+%   \cs{cs_set:Npn} or \cs{cs_gset:Npn} or \cs{prg_new_conditional:Npnn}
+%   or their protected counterparts.  Other cases could be added as
+%   needed.
+% \end{function}
+%
 % \begin{function}[EXP]{\__cs_count_signature:N, \__cs_count_signature:c}
 %   \begin{syntax}
 %     \cs{__cs_count_signature:N} \meta{function}
@@ -1216,7 +1233,7 @@
 %   \meta{processor} function in three parts: the \meta{name}, the
 %   \meta{signature} and a logic token indicating if a colon was found
 %   (to differentiate variables from function names). The \meta{name}
-%   will not include the escape character, and both the \meta{name} and
+%   does not include the escape character, and both the \meta{name} and
 %   \meta{signature} are made up of tokens with category code $12$
 %   (other). The \meta{processor} should be a function with argument
 %   specification \texttt{:nnN} (plus any trailing arguments needed).
@@ -1291,7 +1308,7 @@
 %
 % Having given all the \TeX{} primitives a consistent name, we need to
 % give sensible names to the ones we actually want to use.
-% These will be defined as needed in the appropriate modules, but
+% These will be defined as needed in the appropriate modules, but we
 % do a few now, just to get started.\footnote{This renaming gets expensive
 % in terms of csname usage, an alternative scheme would be to just use
 % the \cs[no-index]{tex_\ldots:D} name in the cases where no good alternative exists.}
@@ -1633,7 +1650,7 @@
 %   following the |:| in the name. Although we could define functions to
 %   remove ten arguments or more using separate calls of
 %   \cs{use_none:nnnnn}, this is very non-intuitive to the programmer
-%   who will assume that expanding such a function once will take care
+%   who will assume that expanding such a function once takes care
 %   of gobbling all the tokens in one go.
 %    \begin{macrocode}
 \cs_set:Npn \use_none:n         #1                 { }
@@ -1673,9 +1690,9 @@
 % interface.
 %
 % \begin{macro}[EXP]{\prg_return_true:, \prg_return_false:}
-%   The idea here is that \cs{exp:w} will expand fully any
-%   \cs{else:} and the \cs{fi:} that are waiting to be discarded,
-%   before reaching the \cs{exp_end:} which will leave the expansion null.
+%   The idea here is that \cs{exp:w} expands fully any
+%   \cs{else:} and \cs{fi:} that are waiting to be discarded,
+%   before reaching the \cs{exp_end:} which leaves an empty expansion.
 %   The code can then leave either the first or second argument in the
 %   input stream. This means that all of the branching code has to contain
 %   at least two tokens: see how the logical tests are actually implemented
@@ -1688,7 +1705,7 @@
 %    \end{macrocode}
 %   An extended state space could be implemented by including a more
 %   elaborate function in place of \cs{use_i:nn}/\cs{use_ii:nn}. Provided
-%   two arguments are absorbed then the code will work.
+%   two arguments are absorbed then the code would work.
 % \end{macro}
 %
 % \begin{macro}
@@ -1853,7 +1870,7 @@
 %   text (or empty), 6: replacement. Remember that the logic-returning
 %   functions expect two arguments to be present after \cs{exp_end:}:
 %   notice the construction of the different variants relies on this,
-%   and that the |TF| variant will be slightly faster than the |T|
+%   and that the |TF| and |F| variants will be slightly faster than the |T|
 %   version.  The |p| form is only valid for expandable tests, we check
 %   for that by making sure that the second argument is empty.
 %    \begin{macrocode}
@@ -2261,7 +2278,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \subsection{Defining and checking (new) functions}
+% \subsection{Checking and patching (new) functions}
 %
 %    We provide two kinds of functions that can be used to define
 %    control sequences. On the one hand we have functions that check
@@ -2269,63 +2286,10 @@
 %    |\..._new|. The second type of defining functions doesn't check
 %    if the argument is already defined.
 %
-%    Before we can define them, we need some auxiliary macros that
-%    allow us to generate error messages. The definitions here are
+%    Before we can define them, we need some auxiliary macros that allow
+%    us to generate error messages. The next few definitions here are
 %    only temporary, they will be redefined later on.
 %
-% \begin{macro}[documented-as=\iow_log:n]{\iow_log:x, \iow_term:x}
-%    We define a routine to write only to the log file. And a
-%    similar one for writing to both the log file and the terminal.
-%    These will be redefined later by \pkg{l3io}.
-%    \begin{macrocode}
-\cs_set_protected:Npn \iow_log:x
-  { \tex_immediate:D \tex_write:D -1 }
-\cs_set_protected:Npn \iow_term:x
-  { \tex_immediate:D \tex_write:D 16 }
-%    \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[int]{\__chk_log:x, \__chk_suspend_log:, \__chk_resume_log:}
-%   This function is used to write some information to the \texttt{log}
-%   file in case the |log-function| option is set.  Otherwise its
-%   argument is ignored.  Using this function rather than directly using
-%   \cs{iow_log:x} allows for \cs{__chk_suspend_log:} which disables
-%   such messages until the matching \cs{__chk_resume_log:}.  These two
-%   commands are used to improve the logging for complicated datatypes.
-%   They should come in pairs, which can be nested.  The function
-%   \cs{exp_not:o} is defined in \pkg{l3expan} later on but
-%   \cs{__chk_suspend_log:} and \cs{__chk_resume_log:} are not used
-%   before that point.
-%    \begin{macrocode}
-%<*initex>
-\cs_set_protected:Npn \__chk_log:x { \use_none:n }
-\cs_set_protected:Npn \__chk_suspend_log: { }
-\cs_set_protected:Npn \__chk_resume_log: { }
-%</initex>
-%<*package>
-\tex_ifodd:D \l at expl@log at functions@bool
-  \cs_set_protected:Npn \__chk_log:x { \iow_log:x }
-  \cs_set_protected:Npn \__chk_suspend_log:
-    {
-      \cs_set_protected:Npx \__chk_resume_log:
-        {
-          \cs_set_protected:Npn \__chk_resume_log:
-            { \exp_not:o { \__chk_resume_log: } }
-          \cs_set_protected:Npn \__chk_log:x
-            { \exp_not:o { \__chk_log:x } }
-        }
-      \cs_set_protected:Npn \__chk_log:x { \use_none:n }
-    }
-  \cs_set_protected:Npn \__chk_resume_log: { }
-\else:
-  \cs_set_protected:Npn \__chk_log:x { \use_none:n }
-  \cs_set_protected:Npn \__chk_suspend_log: { }
-  \cs_set_protected:Npn \__chk_resume_log: { }
-\fi:
-%</package>
-%    \end{macrocode}
-% \end{macro}
-%
 % \begin{macro}[int]
 %   {\__msg_kernel_error:nnxx, \__msg_kernel_error:nnx, \__msg_kernel_error:nn}
 %   If an internal error occurs before \LaTeX3 has loaded \pkg{l3msg} then
@@ -2362,6 +2326,142 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}[documented-as=\iow_log:n]{\iow_log:x, \iow_term:x}
+%    We define a routine to write only to the log file. And a
+%    similar one for writing to both the log file and the terminal.
+%    These will be redefined later by \pkg{l3io}.
+%    \begin{macrocode}
+\cs_set_protected:Npn \iow_log:x
+  { \tex_immediate:D \tex_write:D -1 }
+\cs_set_protected:Npn \iow_term:x
+  { \tex_immediate:D \tex_write:D 16 }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\debug_log_functions_on:, \debug_log_functions_off:}
+% \begin{macro}[int]{\__debug_log:x, \__debug_suspend_log:, \__debug_resume_log:}
+%   When debugging is not enabled at all (including in the format), the
+%   \cs[index=debug_log_functions_on:]{debug_log_functions_on/off:}
+%   functions simply produce errors, while \cs{__debug_suspend_log:} and
+%   \cs{__debug_resume_log:} do nothing.
+%    \begin{macrocode}
+\cs_set_protected:Npn \debug_log_functions_on:
+  {
+    \__msg_kernel_error:nnx { kernel } { enable-debug }
+      { \token_to_str:N \debug_log_functions_on: }
+  }
+\cs_set_protected:Npn \debug_log_functions_off:
+  {
+    \__msg_kernel_error:nnx { kernel } { enable-debug }
+      { \token_to_str:N \debug_log_functions_off: }
+  }
+\cs_set_protected:Npn \__debug_suspend_log: { }
+\cs_set_protected:Npn \__debug_resume_log: { }
+%    \end{macrocode}
+%   Otherwise, they set up \cs{__debug_log:x},
+%   \cs{__debug_suspend_log:}, and \cs{__debug_resume_log:} to have the
+%   following behaviour.  The function \cs{__debug_log:x} is used to
+%   write some information to the \texttt{log} file in case the
+%   \texttt{log-function} option is active and to otherwise ignore its
+%   argument.  Using this function rather than directly using
+%   \cs{iow_log:x} allows for \cs{__debug_suspend_log:} which disables
+%   such messages until the matching \cs{__debug_resume_log:}.  These
+%   two commands are used to improve the logging for datatypes with
+%   multiple parts (currently only coffins).  They should come in pairs,
+%   which can be nested.  The function \cs{exp_not:o} is defined in
+%   \pkg{l3expan} later on but \cs{__debug_suspend_log:} and
+%   \cs{__debug_resume_log:} are not used before that point.  Once
+%   everything is defined, turn logging on or off depending on what
+%   option was given.
+%    \begin{macrocode}
+%<*package>
+\tex_ifodd:D \l at expl@enable at debug@bool
+  \cs_set_protected:Npn \debug_log_functions_on:
+    {
+      \cs_set_protected:Npn \__debug_log:x { \iow_log:x }
+      \cs_set_protected:Npn \__debug_suspend_log:
+        {
+          \cs_set_protected:Npx \__debug_resume_log:
+            {
+              \cs_set_protected:Npn \__debug_resume_log:
+                { \exp_not:o { \__debug_resume_log: } }
+              \cs_set_protected:Npn \__debug_log:x
+                { \exp_not:o { \__debug_log:x } }
+            }
+          \cs_set_protected:Npn \__debug_log:x { \use_none:n }
+        }
+      \cs_set_protected:Npn \__debug_resume_log: { }
+    }
+  \cs_set_protected:Npn \debug_log_functions_off:
+    {
+      \cs_set_protected:Npn \__debug_log:x { \use_none:n }
+      \cs_set_protected:Npn \__debug_suspend_log: { }
+      \cs_set_protected:Npn \__debug_resume_log: { }
+    }
+  \tex_ifodd:D \l at expl@log at functions@bool
+    \debug_log_functions_on:
+  \else:
+    \debug_log_functions_off:
+  \fi:
+\fi:
+%</package>
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[int]{\__debug_patch:nnNw}
+% \begin{macro}[aux]
+%   {
+%     \__debug_patch_param:NNnnNnp,
+%     \__debug_patch_new:nnNNnn,
+%     \__debug_patch_new_conditional:nnNNnnn
+%   }
+%   When debugging is not enabled, \cs{__debug_patch:nnNw} throws the
+%   patch away.  Otherwise it can be followed by \cs{cs_new:Npn} or
+%   \cs{prg_new_conditional:Npnn} or their protected counterparts.  In
+%   each case, grab the name of the function to be defined and its
+%   parameters using \cs{__debug_patch_param:w} then insert tokens
+%   before and after the definition.  Of course for a conditional one
+%   should likely not insert anything after the code.
+%    \begin{macrocode}
+\cs_set_protected:Npn \__debug_patch:nnNw #1#2 { }
+%<*package>
+\tex_ifodd:D \l at expl@enable at debug@bool
+  \cs_set_protected:Npn \__debug_patch:nnNw #1#2#3
+    {
+      \tex_ifcase:D
+        \if_meaning:w #3 \cs_new_protected:Npn  1~ \fi:
+        \if_meaning:w #3 \cs_new:Npn            1~ \fi:
+        \if_meaning:w #3 \cs_set_protected:Npn  1~ \fi:
+        \if_meaning:w #3 \cs_set:Npn            1~ \fi:
+        \if_meaning:w #3 \cs_gset_protected:Npn 1~ \fi:
+        \if_meaning:w #3 \cs_gset:Npn           1~ \fi:
+        \if_meaning:w #3 \prg_new_protected_conditional:Npnn 2~ \fi:
+        \if_meaning:w #3 \prg_new_conditional:Npnn           2~ \fi:
+        \__msg_kernel_error:nnx { kernel } { debug-unpatchable }
+          { \token_to_str:N #3 }
+      \or:
+        \exp_after:wN \__debug_patch_param:NNnnNnp
+        \exp_after:wN \__debug_patch_new:nnNNnn
+      \else:
+        \exp_after:wN \__debug_patch_param:NNnnNnp
+        \exp_after:wN \__debug_patch_new_conditional:nnNNnnn
+      \fi:
+      \use_none:nn {#1} {#2} #3
+    }
+  \cs_set_protected:Npn \__debug_patch_param:NNnnNnp #1#2#3#4#5#6#7#
+    { #1 {#3} {#4} #5 #6 {#7} }
+  \cs_set_protected:Npn \__debug_patch_new:nnNNnn #1#2#3#4#5#6
+    { #3 #4 #5 { #1 #6 #2 } }
+  \cs_set_protected:Npn \__debug_patch_new_conditional:nnNNnnn
+      #1#2#3#4#5#6#7
+    { #3 #4 #5 {#6} { #1 #7 #2 } }
+\fi:
+%</package>
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
 % \begin{macro}[int]{\__chk_if_free_cs:N, \__chk_if_free_cs:c}
 %   This command is called by \cs{cs_new_nopar:Npn} and \cs{cs_new_eq:NN}
 %   \emph{etc.}\
@@ -2371,6 +2471,8 @@
 %   issued. We have to make sure we don't put the argument into the
 %   conditional processing since it may be an |\if...| type function!
 %    \begin{macrocode}
+\__debug_patch:nnNw { }
+  { \__debug_log:x { Defining~\token_to_str:N #1~ \msg_line_context: } }
 \cs_set_protected:Npn \__chk_if_free_cs:N #1
   {
     \cs_if_free:NF #1
@@ -2378,43 +2480,54 @@
         \__msg_kernel_error:nnxx { kernel } { command-already-defined }
           { \token_to_str:N #1 } { \token_to_meaning:N #1 }
       }
-}
-%<*package>
-\tex_ifodd:D \l at expl@log at functions@bool
-  \cs_set_protected:Npn \__chk_if_free_cs:N #1
-    {
-      \cs_if_free:NF #1
-        {
-          \__msg_kernel_error:nnxx { kernel } { command-already-defined }
-            { \token_to_str:N #1 } { \token_to_meaning:N #1 }
-        }
-      \__chk_log:x { Defining~\token_to_str:N #1~ \msg_line_context: }
-    }
-\fi:
-%</package>
+  }
 \cs_set_protected:Npn \__chk_if_free_cs:c
   { \exp_args:Nc \__chk_if_free_cs:N }
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}{\debug_check_declarations_on:, \debug_check_declarations_off:}
 % \begin{macro}[int]{\__chk_if_exist_var:N}
-%   Create the checking function for variable definitions when the option
-%   is set.
+%   When debugging is not active these two user functions produce an
+%   error.  Otherwise they set up \cs{__chk_if_exist_var:N}, a function
+%   which when \texttt{check-declarations} is active tests that a given
+%   variable is defined.
 %    \begin{macrocode}
+\cs_set_protected:Npn \debug_check_declarations_on:
+  {
+    \__msg_kernel_error:nnx { kernel } { enable-debug }
+      { \token_to_str:N \debug_check_declarations_on: }
+  }
+\cs_set_protected:Npn \debug_check_declarations_off:
+  {
+    \__msg_kernel_error:nnx { kernel } { enable-debug }
+      { \token_to_str:N \debug_check_declarations_off: }
+  }
 %<*package>
-\tex_ifodd:D \l at expl@check at declarations@bool
-  \cs_set_protected:Npn \__chk_if_exist_var:N #1
+\tex_ifodd:D \l at expl@enable at debug@bool
+  \cs_set_protected:Npn \debug_check_declarations_on:
     {
-      \cs_if_exist:NF #1
+      \cs_set_protected:Npn \__chk_if_exist_var:N ##1
         {
-          \__msg_kernel_error:nnx { check } { non-declared-variable }
-            { \token_to_str:N #1 }
+          \cs_if_exist:NF ##1
+            {
+              \__msg_kernel_error:nnx { check } { non-declared-variable }
+                { \token_to_str:N ##1 }
+            }
         }
     }
+  \cs_set_protected:Npn \debug_check_declarations_off:
+    { \cs_set_protected:Npn \__chk_if_exist_var:N ##1 { } }
+  \tex_ifodd:D \l at expl@check at declarations@bool
+    \debug_check_declarations_on:
+  \else:
+    \debug_check_declarations_off:
+  \fi:
 \fi:
 %</package>
 %    \end{macrocode}
 % \end{macro}
+% \end{macro}
 %
 % \begin{macro}[int]{\__chk_if_exist_cs:N, \__chk_if_exist_cs:c}
 %    This function issues an error message when the control sequence
@@ -2433,7 +2546,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \subsection{More new definitions}
+% \subsection{Defining new functions}
 %
 % \begin{macro}
 %   {
@@ -2478,8 +2591,8 @@
 %   stands for csname argument, see the expansion module). Global
 %   versions are also provided.
 %
-%   \cs{cs_set_nopar:cpn}\meta{string}\meta{rep-text} will turn \meta{string}
-%   into a csname and then assign \meta{rep-text} to it by using
+%   \cs{cs_set_nopar:cpn}\meta{string}\meta{rep-text} turns \meta{string}
+%   into a csname and then assigns \meta{rep-text} to it by using
 %   \cs{cs_set_nopar:Npn}.  This means that there might be a parameter
 %   string between the two arguments.
 %    \begin{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -24,10 +24,9 @@
 % \begin{macro}{\GetIdInfo}
 % \begin{macro}[aux]{\GetIdInfoAuxI, \GetIdInfoAuxII, \GetIdInfoAuxIII}
 %   The idea here is to extract out the information needed from a standard
-%   \textsc{svn} \texttt{Id} line, but without a line that will get
-%   changed when the file is checked in. Hence the fact that there is
-%   not a line which includes both a dollar sign and the \texttt{Id}
-%   keyword together!
+%   \textsc{svn} \texttt{Id} line, but to avoid a line that would get
+%   changed when the file is checked in. Hence the fact that none of the
+%   lines here include both a dollar sign and the \texttt{Id} keyword!
 %
 %   At this stage, no test has taken place for the \eTeX{} extensions, and
 %   so using \tn{protected} could give an error. To avoid that, it is used
@@ -80,7 +79,7 @@
 %   Here, |#1| is |Id|, |#2| is the file name, |#3| is the extension,
 %   |#4| is the version, |#5| is the check in date and |#6| is the check in
 %   time and user, plus some trailing spaces. If |#4| is the marker |-1| value
-%   then |#5| and |#6| will be empty.
+%   then |#5| and |#6| are empty.
 %    \begin{macrocode}
   \csname protected\endcsname\gdef\GetIdInfoAuxII$#1 #2.#3 #4 #5 #6$%
     {%
@@ -139,7 +138,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -282,7 +281,7 @@
       local t = { }
       for _,i in pairs(tex.extraprimitives("luatex")) do
         if string.match(i,"^U") then
-          if not string.match(i,"^Uchar$") then
+          if not string.match(i,"^Uchar$") then %$
             table.insert(t,i)
           end
         end
@@ -339,7 +338,7 @@
 %    \end{macrocode}
 %   As the user might be making a custom format, no assumption is made about
 %   matching package mode with only loading the \Lua{} code once. Instead, a
-%   query to \Lua{} will reveal what mode is in operation.
+%   query to \Lua{} reveals what mode is in operation.
 %    \begin{macrocode}
     \ifnum 0%
       \directlua{
@@ -579,7 +578,7 @@
 % \begin{macro}{\ExplSyntaxOff}
 %   Before changing any category codes, in package mode we need to save
 %   the situation before loading. Note the set up here means that once applied
-%   \cs{ExplSyntaxOff} will be a \enquote{do nothing} command until
+%   \cs{ExplSyntaxOff} becomes a \enquote{do nothing} command until
 %   \cs{ExplSyntaxOn} is used. For format mode, there is no need to save
 %   category codes so that step is skipped.
 %    \begin{macrocode}
@@ -629,7 +628,7 @@
 %  The idea here is that multiple \cs{ExplSyntaxOn} calls are not
 %  going to mess up category codes, and that multiple calls to
 %  \cs{ExplSyntaxOff} are also not wasting time. Applying
-%  \cs{ExplSyntaxOn} will alter the definition of \cs{ExplSyntaxOff}
+%  \cs{ExplSyntaxOn} alters the definition of \cs{ExplSyntaxOff}
 %  and so in package mode this function should not be used until after
 %  the end of the loading process!
 %    \begin{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -58,8 +58,8 @@
 %     \cs{box_new:N} \meta{box}
 %   \end{syntax}
 %   Creates a new \meta{box} or raises an error if the name is
-%   already taken. The declaration is global. The \meta{box} will
-%   initially be void.
+%   already taken. The declaration is global. The \meta{box} is
+%   initially void.
 % \end{function}
 %
 % \begin{function}{\box_clear:N, \box_clear:c, \box_gclear:N, \box_gclear:c}
@@ -274,7 +274,7 @@
 %   \end{syntax}
 %   Sets the \meta{box} equal to the last item (box) added to the current
 %   partial list, removing the item from the list at the same time. When
-%   applied to the main vertical list, the \meta{box} will always be void as
+%   applied to the main vertical list, the \meta{box} is always void as
 %   it is not possible to recover the last added item.
 % \end{function}
 %
@@ -338,7 +338,7 @@
 % \section{Boxes and color}
 %
 % All \LaTeX{}3 boxes are \enquote{color safe}: a color set inside the box
-% will not apply after the end of the box has occurred.
+% stops applying after the end of the box has occurred.
 %
 % \section{Horizontal mode boxes}
 %
@@ -393,8 +393,7 @@
 %     \cs{hbox_overlap_right:n} \Arg{contents}
 %   \end{syntax}
 %   Typesets the \meta{contents} into a horizontal box of zero width
-%   such that material will protrude to the right of the insertion
-%   point.
+%   such that material protrudes to the right of the insertion point.
 % \end{function}
 %
 % \begin{function}[updated = 2017-04-05]{\hbox_overlap_left:n}
@@ -402,8 +401,7 @@
 %     \cs{hbox_overlap_left:n} \Arg{contents}
 %   \end{syntax}
 %   Typesets the \meta{contents} into a horizontal box of zero width
-%   such that material will protrude to the left of the insertion
-%   point.
+%   such that material protrudes to the left of the insertion point.
 % \end{function}
 %
 % \begin{function}[updated = 2017-04-05]
@@ -423,6 +421,21 @@
 %   where the \meta{content} may not be a simple argument.
 % \end{function}
 %
+% \begin{function}[added = 2017-06-08]
+%   {
+%     \hbox_set_to_wd:Nnw,  \hbox_set_to_wd:cnw,
+%     \hbox_gset_to_wd:Nnw, \hbox_gset_to_wd:cnw
+%   }
+%   \begin{syntax}
+%     \cs{hbox_set_to_wd:Nnw} \meta{box} \Arg{dimexpr} \meta{contents} \cs{hbox_set_end:}
+%   \end{syntax}
+%   Typesets the \meta{contents} to the width given by the \meta{dimexpr}
+%   and then stores the result inside the \meta{box}. In contrast
+%   to \cs{hbox_set_to_wd:Nnn} this function does not absorb the argument
+%   when finding the \meta{content}, and so can be used in circumstances
+%   where the \meta{content} may not be a simple argument
+% \end{function}
+%
 % \begin{function}{\hbox_unpack:N, \hbox_unpack:c}
 %   \begin{syntax}
 %     \cs{hbox_unpack:N} \meta{box}
@@ -451,11 +464,11 @@
 % Vertical boxes inherit their baseline from their contents. The
 % standard case is that the baseline of the box is at the same position
 % as that of the last item added to the box. This means that the box
-% will have no depth unless the last item added to it had depth. As a
+% has no depth unless the last item added to it had depth. As a
 % result most vertical boxes have a large height value and small or
 % zero depth. The exception are |_top| boxes, where the reference point
 % is that of the first item added. These tend to have a large depth and
-% small height, although the latter will typically be non-zero.
+% small height, although the latter is typically non-zero.
 %
 % \begin{function}[updated = 2017-04-05]{\vbox:n}
 %   \begin{syntax}
@@ -471,7 +484,7 @@
 %   \end{syntax}
 %   Typesets the \meta{contents} into a vertical box of natural height
 %   and includes this box in the current list for typesetting. The
-%   baseline of the box will be equal to that of the \emph{first}
+%   baseline of the box is equal to that of the \emph{first}
 %   item added to the box.
 % \end{function}
 %
@@ -507,7 +520,7 @@
 %     \cs{vbox_set_top:Nn} \meta{box} \Arg{contents}
 %   \end{syntax}
 %   Typesets the \meta{contents} at natural height and then stores the
-%   result inside the \meta{box}. The baseline of the box will be equal
+%   result inside the \meta{box}. The baseline of the box is equal
 %   to that of the \emph{first} item added to the box.
 % \end{function}
 %
@@ -540,6 +553,22 @@
 %    where the \meta{content} may not be a simple argument.
 %  \end{function}
 %
+% \begin{function}[added = 2017-06-08]
+%   {
+%     \vbox_set_to_ht:Nnw,  \vbox_set_to_ht:cnw,
+%     \vbox_gset_to_ht:Nnw, \vbox_gset_to_ht:cnw
+%   }
+%   \begin{syntax}
+%     \cs{vbox_set_to_wd:Nnw} \meta{box} \Arg{dimexpr} \meta{contents} \cs{vbox_set_end:}
+%   \end{syntax}
+%   Typesets the \meta{contents} to the height given by the \meta{dimexpr}
+%   and then stores the result inside the \meta{box}. In contrast
+%   to \cs{vbox_set_to_ht:Nnn} this function does not absorb the argument
+%   when finding the \meta{content}, and so can be used in circumstances
+%   where the \meta{content} may not be a simple argument
+% \end{function}
+%
+%
 % \begin{function}[updated = 2011-10-22]{\vbox_set_split_to_ht:NNn}
 %   \begin{syntax}
 %      \cs{vbox_set_split_to_ht:NNn} \meta{box_1} \meta{box_2} \Arg{dimexpr}
@@ -591,13 +620,13 @@
 %   Resizes the \meta{box} to fit within the given \meta{x-size} (horizontally)
 %   and \meta{y-size} (vertically); both of the sizes are dimension
 %   expressions. The \meta{y-size} is the height only: it does not include any
-%   depth. The updated \meta{box} will be an |hbox|, irrespective of the nature
+%   depth. The updated \meta{box} is an |hbox|, irrespective of the nature
 %   of the \meta{box} before the resizing is applied. The final size of the
-%   \meta{box} will be the smaller of \Arg{x-size} and \Arg{y-size},
-%   \emph{i.e.}~the result will fit within the dimensions specified. Negative
-%   sizes will cause the material in the \meta{box} to be reversed in direction,
-%   but the reference point of the \meta{box} will be unchanged. Thus a negative
-%   \meta{y-size} will result in the \meta{box} having a depth dependent on the
+%   \meta{box} is the smaller of \Arg{x-size} and \Arg{y-size},
+%   \emph{i.e.}~the result fits within the dimensions specified. Negative
+%   sizes cause the material in the \meta{box} to be reversed in direction,
+%   but the reference point of the \meta{box} is unchanged. Thus a negative
+%   \meta{y-size} results in the \meta{box} having a depth dependent on the
 %   height of the original and \emph{vice versa}. The resizing applies within
 %   the current \TeX{} group level.
 % \end{function}
@@ -610,13 +639,13 @@
 %   Resizes the \meta{box} to fit within the given \meta{x-size} (horizontally)
 %   and \meta{y-size} (vertically); both of the sizes are dimension
 %   expressions. The \meta{y-size} is the total vertical size (height plus
-%   depth). The updated \meta{box} will be an |hbox|, irrespective of the nature
+%   depth). The updated \meta{box} is an |hbox|, irrespective of the nature
 %   of the \meta{box} before the resizing is applied. The final size of the
-%   \meta{box} will be the smaller of \Arg{x-size} and \Arg{y-size},
-%   \emph{i.e.}~the result will fit within the dimensions specified. Negative
-%   sizes will cause the material in the \meta{box} to be reversed in direction,
-%   but the reference point of the \meta{box} will be unchanged. Thus a negative
-%   \meta{y-size} will result in the \meta{box} having a depth dependent on the
+%   \meta{box} is the smaller of \Arg{x-size} and \Arg{y-size},
+%   \emph{i.e.}~the result fits within the dimensions specified. Negative
+%   sizes cause the material in the \meta{box} to be reversed in direction,
+%   but the reference point of the \meta{box} is unchanged. Thus a negative
+%   \meta{y-size} results in the \meta{box} having a depth dependent on the
 %   height of the original and \emph{vice versa}. The resizing applies within
 %   the current \TeX{} group level.
 % \end{function}
@@ -629,11 +658,11 @@
 %   Resizes the \meta{box} to \meta{y-size} (vertically), scaling the horizontal
 %   size by the same amount; \meta{y-size} is a dimension expression. The
 %   \meta{y-size} is the height only: it does not include any depth. The updated
-%   \meta{box} will be an |hbox|, irrespective of the nature of the \meta{box}
-%   before the resizing is applied. A negative \meta{y-size} will cause the
+%   \meta{box} is an |hbox|, irrespective of the nature of the \meta{box}
+%   before the resizing is applied. A negative \meta{y-size} causes the
 %   material in the \meta{box} to be reversed in direction, but the reference
-%   point of the \meta{box} will be unchanged. Thus a negative \meta{y-size}
-%   will result in the \meta{box} having a depth dependent on the height of the
+%   point of the \meta{box} is unchanged. Thus a negative \meta{y-size}
+%   results in the \meta{box} having a depth dependent on the height of the
 %   original and \emph{vice versa}. The resizing applies within the current
 %   \TeX{} group level.
 % \end{function}
@@ -646,11 +675,11 @@
 %   Resizes the \meta{box} to \meta{y-size} (vertically), scaling the horizontal
 %   size by the same amount; \meta{y-size} is a dimension expression. The
 %   \meta{y-size} is the total vertical size (height plus depth). The updated
-%   \meta{box} will be an |hbox|, irrespective of the nature of the \meta{box}
-%   before the resizing is applied. A negative \meta{y-size} will cause
+%   \meta{box} is an |hbox|, irrespective of the nature of the \meta{box}
+%   before the resizing is applied. A negative \meta{y-size} causes
 %   the material in the \meta{box} to be reversed in direction, but the
-%   reference point of the \meta{box} will be unchanged. Thus a negative
-%   \meta{y-size} will result in the \meta{box} having a depth dependent on the
+%   reference point of the \meta{box} is unchanged. Thus a negative
+%   \meta{y-size} results in the \meta{box} having a depth dependent on the
 %   height of the original and \emph{vice versa}. The resizing applies within
 %   the current \TeX{} group level.
 % \end{function}
@@ -661,11 +690,11 @@
 %   \end{syntax}
 %   Resizes the \meta{box} to \meta{x-size} (horizontally), scaling the vertical
 %   size by the same amount; \meta{x-size} is a dimension expression. The updated
-%   \meta{box} will be an |hbox|, irrespective of the nature of the \meta{box}
-%   before the resizing is applied. A negative \meta{x-size} will cause the
+%   \meta{box} is an |hbox|, irrespective of the nature of the \meta{box}
+%   before the resizing is applied. A negative \meta{x-size} causes the
 %   material in the \meta{box} to be reversed in direction, but the reference
-%   point of the \meta{box} will be unchanged. Thus a negative \meta{x-size}
-%   will result in the \meta{box} having a depth dependent on the height of the
+%   point of the \meta{box} is unchanged. Thus a negative \meta{x-size}
+%   results in the \meta{box} having a depth dependent on the height of the
 %   original and \emph{vice versa}. The resizing applies within the current
 %   \TeX{} group level.
 % \end{function}
@@ -678,10 +707,10 @@
 %   Resizes the \meta{box} to \meta{x-size} (horizontally) and \meta{y-size}
 %   (vertically): both of the sizes are dimension expressions. The
 %   \meta{y-size} is the height only and does not include any depth. The updated
-%   \meta{box} will be an |hbox|, irrespective of the nature of the \meta{box}
-%   before the resizing is applied. Negative sizes will cause the material in
+%   \meta{box} is an |hbox|, irrespective of the nature of the \meta{box}
+%   before the resizing is applied. Negative sizes cause the material in
 %   the \meta{box} to be reversed in direction, but the reference point of the
-%   \meta{box} will be unchanged. Thus a negative \meta{y-size} will result in
+%   \meta{box} is unchanged. Thus a negative \meta{y-size} results in
 %   the \meta{box} having a depth dependent on the height of the original and
 %   \emph{vice versa}. The resizing applies within the current \TeX{} group
 %   level.
@@ -695,10 +724,10 @@
 %   Resizes the \meta{box} to \meta{x-size} (horizontally) and \meta{y-size}
 %   (vertically): both of the sizes are dimension expressions. The
 %   \meta{y-size} is the total vertical size (height plus depth). The updated
-%   \meta{box} will be an |hbox|, irrespective of the nature of the \meta{box}
-%   before the resizing is applied. Negative sizes will cause the material in
+%   \meta{box} is an |hbox|, irrespective of the nature of the \meta{box}
+%   before the resizing is applied. Negative sizes cause the material in
 %   the \meta{box} to be reversed in direction, but the reference point of the
-%   \meta{box} will be unchanged. Thus a negative \meta{y-size} will result in
+%   \meta{box} is unchanged. Thus a negative \meta{y-size} results in
 %   the \meta{box} having a depth dependent on the height of the original and
 %   \emph{vice versa}. The resizing applies within the current \TeX{} group
 %   level.
@@ -709,9 +738,9 @@
 %     \cs{box_rotate:Nn} \meta{box} \Arg{angle}
 %   \end{syntax}
 %   Rotates the \meta{box} by \meta{angle} (in degrees) anti-clockwise about
-%   its reference point. The reference point of the updated box will be moved
+%   its reference point. The reference point of the updated box is moved
 %   horizontally such that it is at the left side of the smallest rectangle
-%   enclosing the rotated material. The updated \meta{box} will be an |hbox|,
+%   enclosing the rotated material. The updated \meta{box} is an |hbox|,
 %   irrespective of the nature of the \meta{box} before the rotation is applied.
 %   The rotation applies within the current \TeX{} group level.
 % \end{function}
@@ -722,11 +751,11 @@
 %   \end{syntax}
 %   Scales the \meta{box} by factors \meta{x-scale} and \meta{y-scale} in
 %   the horizontal and vertical directions, respectively (both scales are
-%   integer expressions). The updated \meta{box} will be an |hbox|, irrespective
+%   integer expressions). The updated \meta{box} is an |hbox|, irrespective
 %   of the nature of the \meta{box} before the scaling is applied. Negative
-%   scalings will cause the material in the \meta{box} to be reversed in
-%   direction, but the reference point of the \meta{box} will be unchanged.
-%   Thus a negative \meta{y-scale} will result in the \meta{box} having a depth
+%   scalings cause the material in the \meta{box} to be reversed in
+%   direction, but the reference point of the \meta{box} is unchanged.
+%   Thus a negative \meta{y-scale} results in the \meta{box} having a depth
 %   dependent on the height of the original and \emph{vice versa}. The resizing
 %   applies within the current \TeX{} group level.
 % \end{function}
@@ -1196,6 +1225,24 @@
 % \end{macro}
 % \end{macro}
 %
+% \begin{macro}{\hbox_set_to_wd:Nnw, \hbox_set_to_wd:cnw}
+% \begin{macro}{\hbox_gset_to_wd:Nnw, \hbox_gset_to_wd:cnw}
+%   Combining the above ideas.
+%    \begin{macrocode}
+\cs_new_protected:Npn \hbox_set_to_wd:Nnw #1#2
+  {
+    \tex_setbox:D #1 \tex_hbox:D to \__dim_eval:w #2 \__dim_eval_end:
+      \c_group_begin_token
+        \group_begin:
+  }
+\cs_new_protected:Npn \hbox_gset_to_wd:Nnw
+  { \tex_global:D \hbox_set_to_wd:Nnw }
+\cs_generate_variant:Nn \hbox_set_to_wd:Nnw  { c }
+\cs_generate_variant:Nn \hbox_gset_to_wd:Nnw { c }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
 %  \begin{macro}{\hbox_to_wd:nn}
 %  \begin{macro}{\hbox_to_zero:n}
 %  \testfile*
@@ -1358,6 +1405,24 @@
 % \end{macro}
 % \end{macro}
 %
+% \begin{macro}{\vbox_set_to_ht:Nnw, \vbox_set_to_ht:cnw}
+% \begin{macro}{\vbox_gset_to_ht:Nnw, \vbox_gset_to_ht:cnw}
+%   A combination of the above ideas.
+%    \begin{macrocode}
+\cs_new_protected:Npn \vbox_set_to_ht:Nnw #1#2
+  {
+    \tex_setbox:D #1 \tex_vbox:D to \__dim_eval:w #2 \__dim_eval_end:
+      \c_group_begin_token
+        \group_begin:
+  }
+\cs_new_protected:Npn \vbox_gset_to_ht:Nnw
+  { \tex_global:D \vbox_set_to_ht:Nnw }
+\cs_generate_variant:Nn \vbox_set_to_ht:Nnw  { c }
+\cs_generate_variant:Nn \vbox_gset_to_ht:Nnw { c }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
 % \begin{macro}{\vbox_unpack:N, \vbox_unpack:c}
 % \begin{macro}{\vbox_unpack_clear:N, \vbox_unpack_clear:c}
 % \testfile*
@@ -1457,8 +1522,8 @@
       }
   }
 %    \end{macrocode}
-%   The edges of the box are then recorded: the left edge will
-%   always be at zero. Rotation of the four edges then takes place: this is
+%   The edges of the box are then recorded: the left edge is
+%   always at zero. Rotation of the four edges then takes place: this is
 %   most efficiently done on a quadrant by quadrant basis.
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_rotate:N #1
@@ -1523,7 +1588,7 @@
 %   The position of the box edges are now known, but the box at this
 %   stage be misplaced relative to the current \TeX{} reference point. So the
 %   content of the box is moved such that the reference point of the
-%   rotated box will be in the same place as the original.
+%   rotated box is in the same place as the original.
 %    \begin{macrocode}
     \hbox_set:Nn \l_@@_internal_box { \box_use:N #1 }
     \hbox_set:Nn \l_@@_internal_box
@@ -1862,8 +1927,8 @@
 % \end{macro}
 %
 % \begin{macro}[aux]{\@@_resize_common:N}
-%   The main resize function places in input into a box which will start
-%   of with zero width, and includes the handles for engine rescaling.
+%   The main resize function places its input into a box which start
+%   off with zero width, and includes the handles for engine rescaling.
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_resize_common:N #1
   {
@@ -1917,7 +1982,7 @@
 %
 % \subsection{Deprecated functions}
 %
-% \begin{macro}{\box_resize:Nnn, \box_resize:cnn}
+% \begin{macro}[deprecated = 2018-12-31]{\box_resize:Nnn, \box_resize:cnn}
 %    \begin{macrocode}
 \cs_new_eq:NN \box_resize:Nnn \box_resize_to_wd_and_ht_plus_dp:Nnn
 \cs_new_eq:NN \box_resize:cnn \box_resize_to_wd_and_ht_plus_dp:cnn

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -82,6 +82,51 @@
 % into the kernel. However, real use sometimes leads to better ideas, so functions from this module are
 % \textbf{not necessarily stable} and we may have to adjust them!
 %
+% \section{Additions to \pkg{l3basics}}
+%
+% \begin{function}[added = 2017-07-14]
+%   {\debug_check_declarations_on:, \debug_check_declarations_off:}
+%   \begin{syntax}
+%     \cs{debug_check_declarations_on:}
+%     \cs{debug_check_declarations_off:}
+%   \end{syntax}
+%   Turn on and off within a group the code that checks that all
+%   \pkg{expl3} variables used were previously declared, as done
+%   globally by the \texttt{check-declarations} option.  This can only
+%   be used if \pkg{expl3} is loaded with one of the options
+%   \texttt{check-declarations}, \texttt{log-functions}, or
+%   \texttt{enable-debug}.
+% \end{function}
+%
+% \begin{function}[added = 2017-07-14]
+%   {\debug_log_functions_on:, \debug_log_functions_off:}
+%   \begin{syntax}
+%     \cs{debug_log_functions_on:}
+%     \cs{debug_log_functions_off:}
+%   \end{syntax}
+%   Turn on and off within a group the code that logs function
+%   definitions, as done globally by the \texttt{log-functions} option.
+%   This can only be used if \pkg{expl3} is loaded with one of the
+%   options \texttt{check-declarations}, \texttt{log-functions}, or
+%   \texttt{enable-debug}.
+% \end{function}
+%
+% \begin{function}[added = 2017-07-04]{\mode_leave_vertical:}
+%   \begin{syntax}
+%     \cs{mode_leave_vertical:}
+%   \end{syntax}
+%   Ensures that \TeX{} is not in vertical (inter-paragraph) mode. In
+%   horizontal or math mode this command has no effect, in vertical mode it
+%   switches to horizontal mode, and inserts a box of width
+%   \tn{parindent}, followed by the \tn{everypar} token list.
+%   \begin{texnote}
+%     This results in the contents of the \tn{everypar} token register being
+%     inserted, after \cs{mode_leave_vertical:} is complete. Notice that in
+%     contrast to the \LaTeXe{} \tn{leavevmode} approach, no box is used
+%     by the method implemented here.
+%   \end{texnote}
+% \end{function}
+%
 % \section{Additions to \pkg{l3box}}
 %
 % \subsection{Viewing part of a box}
@@ -91,11 +136,11 @@
 %     \cs{box_clip:N} \meta{box}
 %   \end{syntax}
 %   Clips the \meta{box} in the output so that only material inside the
-%   bounding box is displayed in the output. The updated \meta{box} will be an
+%   bounding box is displayed in the output. The updated \meta{box} is an
 %   hbox, irrespective of the nature of the \meta{box} before the clipping is
 %   applied. The clipping applies within the current \TeX{} group level.
 %
-%   \textbf{These functions require the \LaTeX3 native drivers: they will
+%   \textbf{These functions require the \LaTeX3 native drivers: they do
 %   not work with the \LaTeXe{} \pkg{graphics} drivers!}
 %
 %   \begin{texnote}
@@ -113,9 +158,9 @@
 %   Adjusts the bounding box of the \meta{box} \meta{left} is removed from
 %   the left-hand edge of the bounding box, \meta{right} from the right-hand
 %   edge and so fourth. All adjustments are \meta{dimension expressions}.
-%   Material output of the bounding box will still be displayed in the output
+%   Material outside of the bounding box is still displayed in the output
 %   unless \cs{box_clip:N} is subsequently applied.
-%   The updated \meta{box} will be an
+%   The updated \meta{box} is an
 %   hbox, irrespective of the nature of the \meta{box} before the trim
 %   operation is applied. The adjustment applies within the current \TeX{}
 %   group level. The behavior of the operation where the trims requested is
@@ -129,10 +174,10 @@
 %   Adjusts the bounding box of the \meta{box} such that it has lower-left
 %   co-ordinates (\meta{llx}, \meta{lly}) and upper-right co-ordinates
 %   (\meta{urx}, \meta{ury}). All four co-ordinate positions are
-%   \meta{dimension expressions}. Material output of the bounding box will
-%   still be displayed in the output unless \cs{box_clip:N} is
+%   \meta{dimension expressions}. Material outside of the bounding box is
+%   still displayed in the output unless \cs{box_clip:N} is
 %   subsequently applied.
-%   The updated \meta{box} will be an
+%   The updated \meta{box} is an
 %   hbox, irrespective of the nature of the \meta{box} before the viewport
 %   operation is applied. The adjustment applies within the current \TeX{}
 %   group level.
@@ -152,7 +197,7 @@
 %   \begin{texnote}
 %     The result is returned within the \tn{unexpanded}
 %     primitive (\cs{exp_not:n}), which means that the \meta{item}
-%     will not expand further when appearing in an \texttt{x}-type
+%     does not expand further when appearing in an \texttt{x}-type
 %     argument expansion.
 %   \end{texnote}
 % \end{function}
@@ -172,8 +217,8 @@
 %     \cs{coffin_rotate:Nn} \meta{coffin} \Arg{angle}
 %   \end{syntax}
 %   Rotates the \meta{coffin} by the given \meta{angle} (given in
-%   degrees counter-clockwise). This process will rotate both the
-%   coffin content and poles. Multiple rotations will not result in
+%   degrees counter-clockwise). This process rotates both the
+%   coffin content and poles. Multiple rotations do not result in
 %   the bounding box of the coffin growing unnecessarily.
 % \end{function}
 %
@@ -188,6 +233,46 @@
 %
 % \section{Additions to \pkg{l3file}}
 %
+% \begin{function}[added = 2017-07-11]{\file_get_mdfive_hash:nN}
+%   \begin{syntax}
+%     \cs{file_get_mdfive_hash:nN} \Arg{file name} \meta{str var}
+%   \end{syntax}
+%   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.
+%   Where the file is not found, the \meta{str var} will be empty.
+% \end{function}
+%
+% \begin{function}[added = 2017-07-09]{\file_get_size:nN}
+%   \begin{syntax}
+%     \cs{file_get_size:nN} \Arg{file name} \meta{str var}
+%   \end{syntax}
+%   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 size of the file in bytes.
+%   Where the file is not found, the \meta{str var} will be empty.
+%   \begin{texnote}
+%     The \XeTeX{} engine provides no way to implement this function.
+%   \end{texnote}
+% \end{function}
+%
+% \begin{function}[added = 2017-07-09]{\file_get_timestamp:nN}
+%   \begin{syntax}
+%     \cs{file_get_timestamp:nN} \Arg{file name} \meta{str var}
+%   \end{syntax}
+%   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 modification timestamp of
+%   the file in the form |D:|\meta{year}\meta{month}\meta{day}\meta{hour}^^A
+%   \meta{minute}\meta{second}\meta{offset}, where the latter may be |Z|
+%   (UTC) or \meta{plus-minus}\meta{hours}|'|\meta{minutes}|'|.
+%   Where the file is not found, the \meta{str var} will be empty.
+%   \begin{texnote}
+%     The \XeTeX{} engine provides no way to implement this function.
+%   \end{texnote}
+% \end{function}
+%
 % \begin{function}[TF, added = 2014-07-02]{\file_if_exist_input:n}
 %   \begin{syntax}
 %     \cs{file_if_exist_input:n} \Arg{file name}
@@ -195,20 +280,30 @@
 %   \end{syntax}
 %   Searches for \meta{file name} using the current \TeX{} search
 %   path and the additional paths controlled by
-%   \cs{file_path_include:n}). If found, inserts the \meta{true code} then
+%   \cs{file_path_include:n}. If found, inserts the \meta{true code} then
 %   reads in the file as additional \LaTeX{} source as described for
 %   \cs{file_input:n}. Note that \cs{file_if_exist_input:n} does not raise
 %   an error if the file is not found, in contrast to \cs{file_input:n}.
 % \end{function}
 %
-% \begin{function}[added = 2014-08-22]
-%   {\ior_log_streams:, \iow_log_streams:}
+% \begin{function}[added = 2017-07-07]{\file_input_stop:}
 %   \begin{syntax}
-%     \cs{ior_log_streams:}
-%     \cs{iow_log_streams:}
+%     \cs{file_input_stop:}
 %   \end{syntax}
-%   Writes in the log file a list of the file names associated with each
-%   open stream: intended for tracking down problems.
+%   Ends the reading of a file started by \cs{file_input:n} or similar before
+%   the end of the file is reached. Where the file reading is being terminated
+%   due to an error, \cs{msg_critical:nn(nn)} should be preferred.
+%   \begin{texnote}
+%     This function must be used on a line on its own: \TeX{} reads files
+%     line-by-line and so any additional tokens in the \enquote{current} line
+%     will still be read.
+%
+%     This is also true if the function is hidden inside another function
+%     (which will be the normal case), i.e., all tokens on the same line
+%     in the source file are still processed. Putting it on a line by itself
+%     in the definition doesn't help as it is the line where it is used that
+%     counts!
+%   \end{texnote}
 % \end{function}
 %
 % \section{Additions to \pkg{l3int}}
@@ -283,7 +378,7 @@
 %   \begin{verbatim}
 %     \prop_map_tokens:Nn \l_my_prop { \str_if_eq:nnT { mykey } }
 %   \end{verbatim}
-%   will expand to the value corresponding to \texttt{mykey}: for each
+%   expands to the value corresponding to \texttt{mykey}: for each
 %   pair in |\l_my_prop| the function \cs{str_if_eq:nnT} receives
 %   \texttt{mykey}, the \meta{key} and the \meta{value} as its three
 %   arguments.  For that specific task, \cs{prop_item:Nn} is faster.
@@ -301,7 +396,7 @@
 %   \begin{texnote}
 %     The result is returned within the \tn{unexpanded}
 %     primitive (\cs{exp_not:n}), which means that the \meta{value}
-%     will not expand further when appearing in an \texttt{x}-type
+%     does not expand further when appearing in an \texttt{x}-type
 %     argument expansion.
 %   \end{texnote}
 % \end{function}
@@ -318,9 +413,9 @@
 %   \end{syntax}
 %   Applies \meta{function} to every pair of items
 %   \meta{seq_1-item}--\meta{seq_2-item} from the two sequences, returning
-%   items from both sequences from left to right.   The \meta{function} will
-%   receive two \texttt{n}-type arguments for each iteration. The  mapping
-%   will terminate when
+%   items from both sequences from left to right.   The \meta{function}
+%   receives two \texttt{n}-type arguments for each iteration. The  mapping
+%   terminates when
 %   the end of either sequence is reached (\emph{i.e.}~whichever sequence has
 %   fewer items determines how many iterations
 %   occur).
@@ -331,13 +426,13 @@
 %     \cs{seq_set_filter:NNn} \meta{sequence_1} \meta{sequence_2} \Arg{inline boolexpr}
 %   \end{syntax}
 %   Evaluates the \meta{inline boolexpr} for every \meta{item} stored
-%   within the \meta{sequence_2}. The \meta{inline boolexpr} will
-%   receive the \meta{item} as |#1|. The sequence of all \meta{items}
+%   within the \meta{sequence_2}. The \meta{inline boolexpr}
+%   receives the \meta{item} as |#1|. The sequence of all \meta{items}
 %   for which the \meta{inline boolexpr} evaluated to \texttt{true}
 %   is assigned to \meta{sequence_1}.
 %   \begin{texnote}
 %     Contrarily to other mapping functions, \cs{seq_map_break:} cannot
-%     be used in this function, and will lead to low-level \TeX{} errors.
+%     be used in this function, and would lead to low-level \TeX{} errors.
 %   \end{texnote}
 % \end{function}
 %
@@ -355,7 +450,7 @@
 %   in \meta{inline function} should be expandable.
 %   \begin{texnote}
 %     Contrarily to other mapping functions, \cs{seq_map_break:} cannot
-%     be used in this function, and will lead to low-level \TeX{} errors.
+%     be used in this function, and would lead to low-level \TeX{} errors.
 %   \end{texnote}
 % \end{function}
 %
@@ -369,7 +464,7 @@
 %   \begin{texnote}
 %     The result is returned within the \tn{unexpanded}
 %     primitive (\cs{exp_not:n}), which means that the \meta{item}
-%     will not expand further when appearing in an \texttt{x}-type
+%     does not expand further when appearing in an \texttt{x}-type
 %     argument expansion.
 %   \end{texnote}
 % \end{function}
@@ -438,8 +533,8 @@
 %     \cs{sys_if_shell_p:}
 %     \cs{sys_if_shell:TF} \Arg{true code} \Arg{false code}
 %   \end{syntax}
-%   Performs a check for whether shell escape is enabled.  This will
-%   return true if either of restricted or unrestircted shell escape
+%   Performs a check for whether shell escape is enabled.  This
+%   returns true if either of restricted or unrestricted shell escape
 %   is enabled.
 % \end{function}
 %
@@ -458,7 +553,7 @@
 %     \cs{sys_if_shell_restricted:TF} \Arg{true code} \Arg{false code}
 %   \end{syntax}
 %   Performs a check for whether \emph{restricted} shell escape is
-%   enabled.  This will return false if unrestricted shell escape is
+%   enabled.  This returns false if unrestricted shell escape is
 %   enabled.  Unrestricted shell escape is not considered a superset
 %   of restricted shell escape in this case.  To find whether any
 %   shell escape is enabled use \cs{sys_if_shell:}.
@@ -495,8 +590,8 @@
 %     \cs{tl_reverse_tokens:n} \Arg{tokens}
 %   \end{syntax}
 %   This function, which works directly on \TeX{} tokens, reverses
-%   the order of the \meta{tokens}: the first will be the last and
-%   the last will become first. Spaces are preserved. The reversal
+%   the order of the \meta{tokens}: the first becomes the last and
+%   the last becomes first. Spaces are preserved. The reversal
 %   also operates within brace groups, but the braces themselves
 %   are not exchanged, as this would lead to an unbalanced token
 %   list. For instance, \cs{tl_reverse_tokens:n} |{a~{b()}}|
@@ -505,7 +600,7 @@
 %   \begin{texnote}
 %     The result is returned within the \tn{unexpanded}
 %     primitive (\cs{exp_not:n}), which means that the token
-%     list will not expand further when appearing in an \texttt{x}-type
+%     list does not expand further when appearing in an \texttt{x}-type
 %     argument expansion.
 %   \end{texnote}
 % \end{function}
@@ -534,7 +629,7 @@
 %   These functions are intended to be applied to input which may be
 %   regarded broadly as \enquote{text}. They traverse the \meta{tokens} and
 %   change the case of characters as discussed below. The character code of
-%   the characters replaced may be arbitrary: the replacement characters will
+%   the characters replaced may be arbitrary: the replacement characters
 %   have standard document-level category codes ($11$ for letters, $12$ for
 %   letter-like characters which can also be case-changed).  Begin-group and
 %   end-group characters in the \meta{tokens} are normalized and become |{|
@@ -547,16 +642,16 @@
 % \end{function}
 %
 % The functions perform expansion on the input in most cases. In particular,
-% input in the form of token lists or expandable functions will be expanded
+% input in the form of token lists or expandable functions is expanded
 % \emph{unless} it falls within one of the special handling classes described
 % below. This expansion approach means that in general the result of case
-% changing will match the \enquote{natural} outcome expected from a
+% changing matches the \enquote{natural} outcome expected from a
 % \enquote{functional} approach to case modification. For example
 % \begin{verbatim}
 %   \tl_set:Nn \l_tmpa_tl { hello }
 %   \tl_upper_case:n { \l_tmpa_tl \c_space_tl world }
 % \end{verbatim}
-% will produce
+% produces
 % \begin{verbatim}
 %   HELLO WORLD
 % \end{verbatim}
@@ -566,11 +661,11 @@
 % from the \pkg{etoolbox} package.
 %
 % \begin{variable}{\l_tl_case_change_math_tl}
-%   Case changing will not take place within math mode material so for example
+%   Case changing does not take place within math mode material so for example
 %   \begin{verbatim}
 %     \tl_upper_case:n { Some~text~$y = mx + c$~with~{Braces} }
 %   \end{verbatim}
-%   will become
+%   becomes
 %   \begin{verbatim}
 %     SOME TEXT $y = mx + c$ WITH {BRACES}
 %   \end{verbatim}
@@ -682,7 +777,7 @@
 %   engine treats input outside of this range as east Asian.
 %
 % Context-sensitive mappings are enabled: language-dependent cases are
-% discussed below. Context detection will expand input but treats any
+% discussed below. Context detection expands input but treats any
 % unexpandable control sequences as \enquote{failures} to match a context.
 %
 %   Language-sensitive conversions are enabled using the \meta{language}
@@ -755,7 +850,7 @@
 %   \begin{texnote}
 %     The result is returned within the \tn{unexpanded}
 %     primitive (\cs{exp_not:n}), which means that the \meta{item}
-%     will not expand further when appearing in an \texttt{x}-type
+%     does not expand further when appearing in an \texttt{x}-type
 %     argument expansion.
 %   \end{texnote}
 % \end{function}
@@ -778,7 +873,7 @@
 %     \iow_term:x { \tl_range:nnn { abcdef } { -2 } { -1 } }
 %     \iow_term:x { \tl_range:nnn { abcdef } { 0 } { -1 } }
 %   \end{verbatim}
-%   will print \texttt{{b}{c}{d}{e}}, \texttt{{c}{d}{e}{f}}, \texttt{{e}{f}}, and an empty
+%   prints \texttt{{b}{c}{d}{e}}, \texttt{{c}{d}{e}{f}}, \texttt{{e}{f}}, and an empty
 %   line to the terminal. The \meta{start index} must always be smaller than
 %   or equal to the \meta{end index}: if this is not the case then no output
 %   is generated. Thus
@@ -790,7 +885,7 @@
 %   \begin{texnote}
 %     The result is returned within the \tn{unexpanded}
 %     primitive (\cs{exp_not:n}), which means that the \meta{item}
-%     will not expand further when appearing in an \texttt{x}-type
+%     does not expand further when appearing in an \texttt{x}-type
 %     argument expansion.
 %   \end{texnote}
 % \end{function}
@@ -802,7 +897,7 @@
 %     \cs{peek_N_type:TF} \Arg{true code} \Arg{false code}
 %   \end{syntax}
 %   Tests if the next \meta{token} in the input stream can be safely
-%   grabbed as an \texttt{N}-type argument. The test will be \meta{false}
+%   grabbed as an \texttt{N}-type argument. The test is \meta{false}
 %   if the next \meta{token} is either an explicit or implicit
 %   begin-group or end-group token (with any character code), or
 %   an explicit or implicit space character (with character code $32$
@@ -810,9 +905,9 @@
 %   and \meta{true} in all other cases.
 %   Note that a \meta{true} result ensures that the next \meta{token} is
 %   a valid \texttt{N}-type argument. However, if the next \meta{token}
-%   is for instance \cs{c_space_token}, the test will take the
+%   is for instance \cs{c_space_token}, the test takes the
 %   \meta{false} branch, even though the next \meta{token} is in fact
-%   a valid \texttt{N}-type argument. The \meta{token} will be left
+%   a valid \texttt{N}-type argument. The \meta{token} is left
 %   in the input stream after the \meta{true code} or \meta{false code}
 %   (as appropriate to the result of the test).
 % \end{function}
@@ -827,6 +922,36 @@
 %<*initex|package>
 %    \end{macrocode}
 %
+% \subsection{Additions to \pkg{l3basics}}
+%
+% \begin{macro}{\mode_leave_vertical:}
+%   The approach here is different to that used by \LaTeXe{} or plain \TeX{},
+%   which unbox a void box to force horizontal mode. That inserts the
+%   \tn{everypar} tokens \emph{before} the re-inserted unboxing tokens. The
+%   approach here uses either the \tn{quitvmode} primitive or the equivalent
+%   protected macro. In vertical mode, the \tn{indent} primitive is inserted:
+%   this will switch to horizontal mode and insert \tn{everypar} tokens and
+%   nothing else. Unlike the \LaTeXe{} version, the availability of \eTeX{}
+%   means using a mode test can be done at for example the start of an
+%   \tn{halign}. The \tn{quitvmode} primitive essentially wraps the same
+%   code up at the engine level.
+%    \begin{macrocode}
+\cs_new_protected:Npx \mode_leave_vertical:
+  {
+    \cs_if_exist:NTF \pdftex_quitvmode:D
+      { \pdftex_quitvmode:D }
+      {
+        \exp_not:n
+          {
+            \if_mode_vertical:
+              \exp_after:wN \tex_indent:D
+            \fi:
+          }
+     }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
 % \subsection{Additions to \pkg{l3box}}
 %
 %    \begin{macrocode}
@@ -1355,7 +1480,7 @@
     \prop_map_inline:cn { l_@@_poles_ \__int_value:w #1 _prop }
       { \@@_scale_pole:Nnnnnn #1 {##1} ##2 }
 %    \end{macrocode}
-%   Negative $x$-scaling values will place the poles in the wrong
+%   Negative $x$-scaling values place the poles in the wrong
 %   location: this is corrected here.
 %    \begin{macrocode}
     \fp_compare:nNnT \l_@@_scale_x_fp < \c_zero_fp
@@ -1463,6 +1588,78 @@
 %<@@=file>
 %    \end{macrocode}
 %
+% \begin{macro}
+%   {\file_get_mdfive_hash:nN, \file_get_size:nN, \file_get_timestamp:nN}
+% \begin{macro}[aux]{\@@_get_details:nnN}
+%   These are all wrappers around the \pdfTeX{} primitives doing the same
+%   jobs: as we want consistent file paths to be found, they are all set up
+%   using \cs{file_get_full_name:nN} and so are non-expandable \texttt{get}
+%   functions. Much of the code is repetitive but we need to branch for
+%   \LuaTeX{} (emulation in Lua), for the slightly different syntax
+%   needed for \tn{pdftex_mdfivesum:D} and for the fact that primitive
+%   coverage varies in other engines.
+%    \begin{macrocode}
+\cs_new_protected:Npn \file_get_mdfive_hash:nN #1#2
+  { \@@_get_details:nnN {#1} { mdfivesum } {#2} }
+\cs_new_protected:Npn \file_get_size:nN #1#2
+  { \@@_get_details:nnN {#1} { size } {#2} }
+\cs_new_protected:Npn \file_get_timestamp:nN #1#2
+  { \@@_get_details:nnN {#1} { moddate } {#2} }
+\cs_new_protected:Npn \@@_get_details:nnN #1#2#3
+  {
+    \file_get_full_name:nN {#1} \l_@@_full_name_str
+    \str_set:Nx #3
+      {
+        \use:c { pdftex_file #2 :D } \exp_after:wN
+          { \l_@@_full_name_str }
+      }
+  }
+\cs_if_exist:NTF \luatex_directlua:D
+  {
+    \cs_set_protected:Npn \@@_get_details:nnN #1#2#3
+      {
+        \file_get_full_name:nN {#1} \l_@@_full_name_str
+        \str_set:Nx #3
+          {
+            \lua_now_x:n
+              {
+                l3kernel.file#2
+                  ( " \lua_escape_x:n { \l_@@_full_name_str } " )
+              }
+          }
+       }
+  }
+  {
+    \cs_set_protected:Npn \file_get_mdfive_hash:nN #1#2
+      {
+        \file_get_full_name:nN {#1} \l_@@_full_name_str
+        \tl_set:Nx #2
+          {
+            \pdftex_mdfivesum:D file \exp_after:wN
+              { \l_@@_full_name_str }
+          }
+      }
+    \cs_if_exist:NT \xetex_XeTeXversion:D
+      {
+        \cs_set_protected:Npn \@@_get_details:nnN #1#2#3
+          {
+            \tl_clear:N #3
+            \__msg_kernel_error:nnx
+              { kernel } { xetex-primitive-not-available }
+              { \exp_not:c { pdffile #2 } }
+          }
+      }
+  }
+\__msg_kernel_new:nnnn { kernel } { xetex-primitive-not-available }
+  { Primitive~\token_to_str:N #1 not~available }
+  {
+    XeTeX~does~not~currently~provide~functionality~equivalent~to~the~
+    \token_to_str:N #1 primitive.
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
 % \begin{macro}[TF]{\file_if_exist_input:n}
 %   Input of a file with a test for existence cannot be done the usual
 %   way as the tokens to insert are in an odd place.
@@ -1469,45 +1666,43 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \file_if_exist_input:n #1
   {
-    \file_if_exist:nT {#1}
-      { \@@_input:V \l_@@_internal_name_tl }
+    \file_get_full_name:nN {#1} \l__file_full_name_str
+    \str_if_empty:NF \l__file_full_name_str
+      { \@@_input:V \l__file_full_name_str }
   }
 \cs_new_protected:Npn \file_if_exist_input:nT #1#2
   {
-    \file_if_exist:nT {#1}
+    \file_get_full_name:nN {#1} \l__file_full_name_str
+    \str_if_empty:NF \l__file_full_name_str
       {
         #2
-        \@@_input:V \l_@@_internal_name_tl
+        \@@_input:V \l__file_full_name_str
       }
   }
-\cs_new_protected:Npn \file_if_exist_input:nF #1
+\cs_new_protected:Npn \file_if_exist_input:nF #1#2
   {
-    \file_if_exist:nTF {#1}
-      { \@@_input:V \l_@@_internal_name_tl }
+    \file_get_full_name:nN {#1} \l__file_full_name_str
+    \str_if_empty:NTF \l__file_full_name_str
+      {#2}
+      { \@@_input:V \l__file_full_name_str }
   }
-\cs_new_protected:Npn \file_if_exist_input:nTF #1#2
+\cs_new_protected:Npn \file_if_exist_input:nTF #1#2#3
   {
-    \file_if_exist:nTF {#1}
+    \file_get_full_name:nN {#1} \l__file_full_name_str
+    \str_if_empty:NTF \l__file_full_name_str
+      {#3}
       {
         #2
-        \@@_input:V \l_@@_internal_name_tl
+        \@@_input:V \l__file_full_name_str
       }
   }
 %    \end{macrocode}
 % \end{macro}
-% \begin{macro}{\ior_log_streams:}
-%   Redirect output of \cs{ior_list_streams:} to the log.
-%    \begin{macrocode}
-\cs_new_protected:Npn \ior_log_streams:
-  { \__msg_log_next: \ior_list_streams: }
-%    \end{macrocode}
-% \end{macro}
 %
-% \begin{macro}{\iow_log_streams:}
-%   Redirect output of \cs{iow_list_streams:} to the log.
+% \begin{macro}{\file_input_stop:}
+%   A simple rename.
 %    \begin{macrocode}
-\cs_new_protected:Npn \iow_log_streams:
-  { \__msg_log_next: \iow_list_streams: }
+\cs_new_protected:Npn \file_input_stop: { \tex_endinput:D }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -1761,10 +1956,10 @@
 %   usual |{ ? \__prg_break: } { }| to the end of each one.  This is
 %   most conveniently done in two steps using an auxiliary function.
 %   The mapping then throws away the first tokens of |#2| and |#5|,
-%   which for items in the sequences will both be \cs{s_@@}
-%   \cs{@@_item:n}.  The function to be mapped will then be applied to
+%   which for items in both sequences are \cs{s_@@}
+%   \cs{@@_item:n}.  The function to be mapped are then be applied to
 %   the two entries.  When the code hits the end of one of the
-%   sequences, the break material will stop the entire loop and tidy up.
+%   sequences, the break material stops the entire loop and tidy up.
 %   This avoids needing to find the count of the two sequences, or
 %   worrying about which is longer.
 %    \begin{macrocode}
@@ -1937,8 +2132,8 @@
 % \end{variable}
 %
 % \begin{macro}[EXP, pTF]{\sys_if_shell:}
-%   Performs a check for whether shell escape is enabled.  This will
-%   return true if either of restricted or unrestricted shell escape
+%   Performs a check for whether shell escape is enabled.  This
+%   returns true if either of restricted or unrestricted shell escape
 %   is enabled.
 %    \begin{macrocode}
 \prg_new_conditional:Nnn \sys_if_shell: { p , T , F , TF }
@@ -1969,7 +2164,7 @@
 %
 % \begin{macro}[EXP, pTF]{\sys_if_shell_unrestricted:}
 %   Performs a check for whether \emph{restricted} shell escape is
-%   enabled.  This will return false if unrestricted shell escape is
+%   enabled.  This returns false if unrestricted shell escape is
 %   enabled.  Unrestricted shell escape is not considered a superset
 %   of restricted shell escape in this case.  To find whether any
 %   shell escape is enabled use \cs{sys_if_shell:}.
@@ -2162,7 +2357,9 @@
 \cs_generate_variant:Nn \tl_gset_from_file:Nnn { c }
 \cs_new_protected:Npn \@@_set_from_file:NNnn #1#2#3#4
   {
-    \__file_if_exist:nT {#4}
+    \file_get_full_name:nN {#4} \l__file_full_name_str
+    \str_if_empty:NTF \l__file_full_name_str
+      { \__file_missing:n {#4} }
       {
         \group_begin:
           \exp_args:No \etex_everyeof:D
@@ -2170,7 +2367,7 @@
           #3 \scan_stop:
           \exp_after:wN \@@_from_file_do:w
           \exp_after:wN \prg_do_nothing:
-            \tex_input:D \l__file_internal_name_tl \scan_stop:
+            \tex_input:D \l__file_full_name_str \scan_stop:
         \exp_args:NNNo \group_end:
         #1 #2 \l_@@_internal_a_tl
       }
@@ -2204,13 +2401,15 @@
 \cs_generate_variant:Nn \tl_gset_from_file_x:Nnn { c }
 \cs_new_protected:Npn \@@_set_from_file_x:NNnn #1#2#3#4
   {
-    \__file_if_exist:nT {#4}
+    \file_get_full_name:nN {#4} \l__file_full_name_str
+    \str_if_empty:NTF \l__file_full_name_str
+      { \__file_missing:n {#4} }
       {
         \group_begin:
           \etex_everyeof:D { \exp_not:N }
           #3 \scan_stop:
           \tl_set:Nx \l_@@_internal_a_tl
-            { \tex_input:D \l__file_internal_name_tl \c_space_token }
+            { \tex_input:D \l__file_full_name_str \c_space_token }
         \exp_args:NNNo \group_end:
         #1 #2 \l_@@_internal_a_tl
       }
@@ -2237,16 +2436,14 @@
 % \begin{macro}[EXP]{\tl_lower_case:n, \tl_upper_case:n, \tl_mixed_case:n}
 % \begin{macro}[EXP]{\tl_lower_case:nn, \tl_upper_case:nn, \tl_mixed_case:nn}
 %   The user level functions here are all wrappers around the internal
-%   functions for case changing. Note that \cs{tl_mixed_case:nn} could be
-%   done without an internal, but this way the logic is slightly clearer as
-%   everything essentially follows the same path.
+%   functions for case changing.
 %    \begin{macrocode}
 \cs_new:Npn \tl_lower_case:n { \@@_change_case:nnn { lower } { } }
 \cs_new:Npn \tl_upper_case:n { \@@_change_case:nnn { upper } { } }
-\cs_new:Npn \tl_mixed_case:n { \@@_mixed_case:nn { } }
+\cs_new:Npn \tl_mixed_case:n { \@@_change_case:nnn { mixed } { } }
 \cs_new:Npn \tl_lower_case:nn { \@@_change_case:nnn { lower } }
 \cs_new:Npn \tl_upper_case:nn { \@@_change_case:nnn { upper } }
-\cs_new:Npn \tl_mixed_case:nn { \@@_mixed_case:nn }
+\cs_new:Npn \tl_mixed_case:nn { \@@_change_case:nnn { mixed } }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
@@ -2264,6 +2461,12 @@
 %   }
 % \begin{macro}[aux, EXP]{\@@_change_case_end:wn}
 % \begin{macro}[aux, EXP]{\@@_change_case_group:nwnn}
+% \begin{macro}[aux, EXP]
+%   {
+%     \@@_change_case_group_lower:nnnn ,
+%     \@@_change_case_group_upper:nnnn ,
+%     \@@_change_case_group_mixed:nnnn
+%   }
 % \begin{macro}[aux, EXP]{\@@_change_case_space:wnn}
 % \begin{macro}[aux, EXP]{\@@_change_case_N_type:Nwnn}
 % \begin{macro}[aux, EXP]{\@@_change_case_N_type:NNNnnn}
@@ -2273,17 +2476,29 @@
 % \begin{macro}[aux, EXP]{\@@_change_case_math_group:nwNNnn}
 % \begin{macro}[aux, EXP]{\@@_change_case_math_space:wNNnn}
 % \begin{macro}[aux, EXP]{\@@_change_case_N_type:Nnnn}
-% \begin{macro}[aux, EXP]{\@@_change_case_char:Nnn}
+% \begin{macro}[aux, EXP]
+%   {
+%     \@@_change_case_char_lower:Nnn ,
+%     \@@_change_case_char_upper:Nnn ,
+%     \@@_change_case_char_mixed:Nnn
+%   }
 % \begin{macro}[aux, EXP]{\@@_change_case_char:nN}
 % \begin{macro}[aux, EXP]
 %   {\@@_change_case_char_auxi:nN, \@@_change_case_char_auxii:nN}
+% \begin{macro}[aux, EXP]
+%   {
+%     \@@_change_case_char_mixed:N,
+%     \@@_change_case_char_lower:N,
+%     \@@_change_case_char_upper:N
+%   }
 % \begin{macro}[aux]
-%   {\@@_lookup_lower:N, \@@_lookup_upper:N, \@@_lookup_title:N}
+%   {\@@_lookup_mixed:N, \@@_lookup_lower:N, \@@_lookup_upper:N}
 % \begin{macro}[aux, EXP]{\@@_change_case_char_UTFviii:nNN}
 % \begin{macro}[aux, EXP]{\@@_change_case_char_UTFviii:nNNN}
 % \begin{macro}[aux, EXP]{\@@_change_case_char_UTFviii:nNNNN}
 % \begin{macro}[aux, EXP]{\@@_change_case_char_UTFviii:nn}
-% \begin{macro}[aux, EXP]{\@@_change_case_cs_letterlike:Nnn}
+% \begin{macro}[aux, EXP]{\@@_change_case_cs_letterlike:Nn}
+% \begin{macro}[aux, EXP]{\@@_change_case_cs_letterlike:NnN}
 % \begin{macro}[aux, EXP]{\@@_change_case_cs_accents:NN}
 % \begin{macro}[aux, EXP]{\@@_change_case_cs:N}
 % \begin{macro}[aux, EXP]{\@@_change_case_cs:NN}
@@ -2292,6 +2507,10 @@
 % \begin{macro}[aux, EXP]{\@@_change_case_if_expandable:NTF}
 % \begin{macro}[aux, EXP]{\@@_change_case_cs_expand:Nnw}
 % \begin{macro}[aux, EXP]{\@@_change_case_cs_expand:NN}
+% \begin{macro}[aux, EXP]{\@@_change_case_mixed_skip:N}
+% \begin{macro}[aux, EXP]{\@@_change_case_mixed_skip:NN}
+% \begin{macro}[aux, EXP]{\@@_change_case_mixed_skip_tidy:Nwn}
+% \begin{macro}[aux, EXP]{\@@_change_case_mixed_switch:w}
 %   The mechanism for the core conversion of case is based on the idea that
 %   we can use a loop to grab the entire token list plus a quark: the latter is
 %   used as an end marker and to avoid any brace stripping. Depending on the
@@ -2356,6 +2575,10 @@
 %    \begin{macrocode}
 \cs_new:Npn \@@_change_case_group:nwnn #1#2 \q_recursion_stop #3#4
   {
+    \use:c { @@_change_case_group_ #3 : nnnn } {#1} {#2} {#3} {#4}
+  }
+\cs_new:Npn \@@_change_case_group_lower:nnnn #1#2#3#4
+  {
     \@@_change_case_output:own
       {
         \exp_after:wN
@@ -2366,6 +2589,26 @@
       }
     \@@_change_case_loop:wnn #2 \q_recursion_stop {#3} {#4}
   }
+\cs_new_eq:NN \@@_change_case_group_upper:nnnn
+  \@@_change_case_group_lower:nnnn
+%    \end{macrocode}
+%  For the \enquote{mixed} case, a group is taken as forcing a switch to lower
+%  casing. That means we need a separate auxiliary. (Tracking whether we have
+%  found a first character inside a group and transferring the information out
+%  looks pretty horrible.)
+%    \begin{macrocode}
+\cs_new:Npn \@@_change_case_group_mixed:nnnn #1#2#3#4
+  {
+    \@@_change_case_output:own
+      {
+        \exp_after:wN
+          {
+            \exp:w
+            \@@_change_case_aux:nnn {#3} {#4} {#1}
+          }
+      }
+    \@@_change_case_loop:wnn #2 \q_recursion_stop { lower } {#4}
+  }
 \exp_last_unbraced:NNo \cs_new:Npn \@@_change_case_space:wnn \c_space_tl
   {
     \@@_change_case_output:nwn { ~ }
@@ -2397,8 +2640,8 @@
 %   be either the standard case-changing one or the mixed-case alternative,
 %   it is not hard-coded into the math loop but is rather passed as argument
 %   |#3| to \cs{@@_change_case_math:NNNnnn}. If no close-math token is found
-%   then the final clean-up will be forced (\emph{i.e.}~there is no assumption
-%   of \enquote{well-behaved} code in terms of math mode).
+%   then the final clean-up is forced (\emph{i.e.}~there is no assumption
+%   of \enquote{well-behaved} input in terms of math mode).
 %    \begin{macrocode}
 \cs_new:Npn \@@_change_case_N_type:NNNnnn #1#2#3
   {
@@ -2463,8 +2706,8 @@
 \cs_new:Npn \@@_change_case_N_type:Nnnn #1#2#3#4
   {
     \token_if_cs:NTF #1
-      { \@@_change_case_cs_letterlike:Nnn #1 {#3} { } }
-      { \@@_change_case_char:Nnn #1 {#3} {#4} }
+      { \@@_change_case_cs_letterlike:Nn #1 {#3} }
+      { \use:c { @@_change_case_char_ #3 :Nnn } #1 {#3} {#4} }
     \@@_change_case_loop:wnn #2 \q_recursion_stop {#3} {#4}
   }
 %    \end{macrocode}
@@ -2477,7 +2720,7 @@
 %   whereas the core lookup table does not and also guarantees an output so
 %   \texttt{f}-type expansion may be used to obtain the case-changed result.
 %    \begin{macrocode}
-\cs_new:Npn \@@_change_case_char:Nnn #1#2#3
+\cs_new:Npn \@@_change_case_char_lower:Nnn #1#2#3
   {
     \cs_if_exist_use:cF { @@_change_case_ #2 _ #3 :Nnw }
       { \use_ii:nn }
@@ -2487,7 +2730,25 @@
             { \@@_change_case_char:nN {#2} #1 }
         }
   }
+\cs_new_eq:NN \@@_change_case_char_upper:Nnn
+  \@@_change_case_char_lower:Nnn
 %    \end{macrocode}
+%   For mixed case, the code is somewhat different: there is a need to
+%   look up both mixed and upper case chars and we have to cover the
+%   situation where there is a character to skip over.
+%    \begin{macrocode}
+\cs_new:Npn \@@_change_case_char_mixed:Nnn #1#2#3
+  {
+    \@@_change_case_mixed_switch:w
+    \cs_if_exist_use:cF { @@_change_case_mixed_ #3 :Nnw }
+      {
+        \cs_if_exist_use:cF { @@_change_case_upper_ #3 :Nnw }
+          { \use_ii:nn }
+      }
+        #1
+        { \@@_change_case_mixed_skip:N #1 }
+  }
+%    \end{macrocode}
 %   For Unicode engines we can handle all characters directly. However, for
 %   the $8$-bit engines the aim is to deal with (a subset of) Unicode (UTF-8)
 %   input. They deal with that by making the upper half of the range active,
@@ -2517,14 +2778,37 @@
           { \@@_change_case_char_auxi:nN {#1} #2 }
        }
   }
+%    \end{macrocode}
+%   To allow for the special case of mixed case, we insert here a
+%   action-dependent auxiliary.
+%    \begin{macrocode}
 \cs_new:Npn \@@_change_case_char_auxi:nN #1#2
+  { \use:c { @@_change_case_char_ #1 :N  } #2 }
+\cs_new:Npn \@@_change_case_char_lower:N #1
   {
     \@@_change_case_output:fwn
       {
-        \cs_if_exist_use:cF { c__unicode_ #1 _ \token_to_str:N #2 _tl }
-          { \@@_change_case_char_auxii:nN {#1} #2 }
+        \cs_if_exist_use:cF { c__unicode_lower_ \token_to_str:N #1 _tl }
+          { \@@_change_case_char_auxii:nN { lower } #1 }
       }
   }
+\cs_new:Npn \@@_change_case_char_upper:N #1
+  {
+    \@@_change_case_output:fwn
+      {
+        \cs_if_exist_use:cF { c__unicode_upper_ \token_to_str:N #1 _tl }
+          { \@@_change_case_char_auxii:nN { upper } #1 }
+      }
+  }
+\cs_new:Npn \@@_change_case_char_mixed:N #1
+  {
+    \cs_if_exist:cTF { c__unicode_mixed_ \token_to_str:N #1 _tl }
+      {
+        \@@_change_case_output:fwn
+          { \tl_use:c { c__unicode_mixed_ \token_to_str:N #1 _tl } }
+      }
+      { \@@_change_case_char_upper:N #1 }
+  }
 \cs_if_exist:NTF \utex_char:D
   {
     \cs_new:Npn \@@_change_case_char_auxii:nN #1#2
@@ -2539,7 +2823,7 @@
       }
     \cs_new_protected:Npn \@@_lookup_lower:N #1 { \tex_lccode:D `#1 }
     \cs_new_protected:Npn \@@_lookup_upper:N #1 { \tex_uccode:D `#1 }
-    \cs_new_eq:NN \@@_lookup_title:N \@@_lookup_upper:N
+    \cs_new_eq:NN \@@_lookup_mixed:N \@@_lookup_upper:N
   }
   {
     \cs_new:Npn \@@_change_case_char_auxii:nN #1#2 { \exp_stop_f: #2 }
@@ -2565,11 +2849,20 @@
 %   ones to deal with. Letter-like control sequences are a simple look-up,
 %   while for accents the loop is much as done elsewhere. Notice that
 %   we have a no-op test to make sure there is no unexpected expansion of
-%   letter-like input. The third argument here is needed for mixed casing,
-%   where it if there is a hit there has to be a change-of-path.
+%   letter-like input. The split into two parts here allows us to insert
+%   the \enquote{switch} code for mixed casing.
 %    \begin{macrocode}
-\cs_new:Npn \@@_change_case_cs_letterlike:Nnn #1#2#3
+\cs_new:Npn \@@_change_case_cs_letterlike:Nn #1#2
   {
+    \str_if_eq:nnTF {#2} { mixed }
+      {
+        \@@_change_case_cs_letterlike:NnN #1 { upper }
+          \@@_change_case_mixed_switch:w
+      }
+      { \@@_change_case_cs_letterlike:NnN #1 {#2} \prg_do_nothing: }
+  }
+\cs_new:Npn \@@_change_case_cs_letterlike:NnN #1#2#3
+  {
     \cs_if_exist:cTF { c_@@_change_case_ #2 _ \token_to_str:N #1 _tl }
       {
         \@@_change_case_output:vwn
@@ -2650,10 +2943,10 @@
 %   When a control sequence is not on the exclude list the other test if
 %   to see if it is expandable. Once again, if there is a hit then the loop
 %   function is grabbed as part of the clean-up and reinserted before the
-%   now expanded material. The test for expandablity has to check for
+%   now expanded material. The test for expandability has to check for
 %   end-of-recursion as it is needed by the look-ahead code which might hit
 %   the end of the input. The test is done in two parts as \cs{bool_if:nTF}
-%   will choke if |#1| is |(|!
+%   would choke if |#1| was |(|!
 %    \begin{macrocode}
 \cs_new:Npn \@@_change_case_if_expandable:NTF #1
   {
@@ -2679,6 +2972,44 @@
 \cs_new:Npn \@@_change_case_cs_expand:NN #1#2
   { \exp_after:wN #2 #1 }
 %    \end{macrocode}
+%  For mixed case, there is an additional list of exceptions to deal with:
+%  once that is sorted, we can move on back to the main loop.
+%    \begin{macrocode}
+\cs_new:Npn \@@_change_case_mixed_skip:N #1
+  {
+    \exp_after:wN \@@_change_case_mixed_skip:NN
+      \exp_after:wN #1 \l_tl_mixed_case_ignore_tl
+      \q_recursion_tail \q_recursion_stop
+  }
+\cs_new:Npn \@@_change_case_mixed_skip:NN #1#2
+  {
+    \quark_if_recursion_tail_stop_do:nn {#2}
+      { \@@_change_case_char:nN { mixed } #1 }
+    \int_compare:nNnT { `#1 }  = { `#2 }
+      {
+        \use_i_delimit_by_q_recursion_stop:nw
+          {
+            \@@_change_case_output:nwn {#1}
+            \@@_change_case_mixed_skip_tidy:Nwn
+          }
+      }
+    \@@_change_case_mixed_skip:NN #1
+  }
+\cs_new:Npn \@@_change_case_mixed_skip_tidy:Nwn #1#2 \q_recursion_stop #3
+  {
+    \@@_change_case_loop:wnn #2 \q_recursion_stop { mixed }
+  }
+%    \end{macrocode}
+%   Needed to switch from mixed to lower casing when we have found a
+%   first character in the former mode.
+%    \begin{macrocode}
+\cs_new:Npn \@@_change_case_mixed_switch:w
+  #1 \@@_change_case_loop:wnn #2 \q_recursion_stop #3
+  {
+    #1
+    \@@_change_case_loop:wnn #2 \q_recursion_stop { lower }
+  }
+%    \end{macrocode}
 % \end{macro}
 % \end{macro}
 % \end{macro}
@@ -2711,6 +3042,13 @@
 % \end{macro}
 % \end{macro}
 % \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
 %
 % \begin{macro}[aux, EXP]{\@@_change_case_lower_sigma:Nnw}
 % \begin{macro}[aux, EXP]{\@@_change_case_lower_sigma:w}
@@ -3030,10 +3368,10 @@
 % \begin{macro}[EXP, aux]{\__unicode_codepoint_to_UTFviii_auxi:n}
 % \begin{macro}[EXP, aux]{\__unicode_codepoint_to_UTFviii_auxii:Nnn}
 % \begin{macro}[EXP, aux]{\__unicode_codepoint_to_UTFviii_auxiii:n}
-%   This code will convert a codepoint into the correct UTF-8 representation.
+%   This code converts a codepoint into the correct UTF-8 representation.
 %   As there are a variable number of octets, the result starts with the
 %   numeral |1|--|4| to indicate the nature of the returned value. Note that
-%   this code will cover the full range even though at this stage it is not
+%   this code covers the full range even though at this stage it is not
 %   required here. Also note that longer-term this is likely to need a public
 %   interface and/or moving to \pkg{l3str} (see experimental string
 %   conversions). In terms of the algorithm itself, see
@@ -3338,7 +3676,7 @@
           \group_end:
         }
       \@@_tmp:w { 00DF } { SS } { upper }
-      \@@_tmp:w { 00DF } { Ss } { title }
+      \@@_tmp:w { 00DF } { Ss } { mixed }
       \@@_tmp:w { 0131 } { I }  { upper }
     }
   \group_end:
@@ -3382,188 +3720,6 @@
 %    \end{macrocode}
 % \end{variable}
 %
-% \begin{macro}[aux, EXP]{\@@_mixed_case:nn}
-% \begin{macro}[aux, EXP]{\@@_mixed_case_aux:nn}
-% \begin{macro}[aux, EXP]{\@@_mixed_case_loop:wn}
-% \begin{macro}[aux, EXP]{\@@_mixed_case_group:nwn}
-% \begin{macro}[aux, EXP]{\@@_mixed_case_space:wn}
-% \begin{macro}[aux, EXP]{\@@_mixed_case_N_type:Nwn}
-% \begin{macro}[aux, EXP]{\@@_mixed_case_N_type:NNNnn}
-% \begin{macro}[aux, EXP]{\@@_mixed_case_N_type:Nnn}
-% \begin{macro}[aux, EXP]{\@@_mixed_case_letterlike:Nw}
-% \begin{macro}[aux, EXP]{\@@_mixed_case_char:N}
-% \begin{macro}[aux, EXP]{\@@_mixed_case_skip:N}
-% \begin{macro}[aux, EXP]{\@@_mixed_case_skip:NN}
-% \begin{macro}[aux, EXP]{\@@_mixed_case_skip_tidy:Nwn}
-% \begin{macro}[aux, EXP]{\@@_mixed_case_char:nN}
-%   Mixed (title) casing requires some custom handling of the case changing
-%   of the first letter in the input followed by a switch to the normal
-%   lower casing routine. That could be covered by passing a set of functions
-%   to generic routines, but at the cost of making the process rather opaque.
-%   Instead, the approach taken here is to use a dedicated set of functions
-%   which keep the different loop requirements clearly separate.
-%
-%   The main loop looks for the first \enquote{real} char in the input
-%   (skipping any pre-letter chars). Once one is found, it is case changed to
-%   upper case but first checking that there is not an entry in the exceptions
-%   list. Note that simply grabbing the first token in the input is no good
-%   here: it can't handle pre-letter tokens or any special treatment of the
-%   first letter found (\emph{e.g.}~words starting with \texttt{i} in
-%   Turkish). Spaces at the start of the input are passed through without
-%   counting as being the \enquote{start} of the first word, while a brace
-%   group is assumed to be contain the first char with everything after the
-%   brace therefore lower cased.
-%    \begin{macrocode}
-\cs_new:Npn \@@_mixed_case:nn #1#2
-  {
-    \etex_unexpanded:D \exp_after:wN
-      {
-        \exp:w
-        \@@_mixed_case_aux:nn {#1} {#2}
-      }
-  }
-\cs_new:Npn \@@_mixed_case_aux:nn #1#2
-  {
-    \group_align_safe_begin:
-    \@@_mixed_case_loop:wn
-      #2 \q_recursion_tail \q_recursion_stop {#1}
-    \@@_change_case_result:n { }
-  }
-\cs_new:Npn \@@_mixed_case_loop:wn #1 \q_recursion_stop
-  {
-    \tl_if_head_is_N_type:nTF {#1}
-      { \@@_mixed_case_N_type:Nwn }
-      {
-        \tl_if_head_is_group:nTF {#1}
-          { \@@_mixed_case_group:nwn }
-          { \@@_mixed_case_space:wn }
-      }
-    #1 \q_recursion_stop
-  }
-\cs_new:Npn \@@_mixed_case_group:nwn #1#2 \q_recursion_stop #3
-  {
-    \@@_change_case_output:own
-      {
-        \exp_after:wN
-          {
-            \exp:w
-            \@@_mixed_case_aux:nn {#3} {#1}
-          }
-      }
-    \@@_change_case_loop:wnn #2 \q_recursion_stop { lower } {#3}
-  }
-\exp_last_unbraced:NNo \cs_new:Npn \@@_mixed_case_space:wn \c_space_tl
-  {
-    \@@_change_case_output:nwn { ~ }
-    \@@_mixed_case_loop:wn
-  }
-\cs_new:Npn \@@_mixed_case_N_type:Nwn #1#2 \q_recursion_stop
-  {
-    \quark_if_recursion_tail_stop_do:Nn #1
-      { \@@_change_case_end:wn }
-    \exp_after:wN \@@_mixed_case_N_type:NNNnn
-      \exp_after:wN #1 \l_tl_case_change_math_tl
-      \q_recursion_tail ? \q_recursion_stop {#2}
-  }
-\cs_new:Npn \@@_mixed_case_N_type:NNNnn #1#2#3
-  {
-    \quark_if_recursion_tail_stop_do:Nn #2
-      { \@@_mixed_case_N_type:Nnn #1 }
-    \token_if_eq_meaning:NNTF #1 #2
-      {
-        \use_i_delimit_by_q_recursion_stop:nw
-          {
-            \@@_change_case_math:NNNnnn
-              #1 #3 \@@_mixed_case_loop:wn
-          }
-      }
-      { \@@_mixed_case_N_type:NNNnn #1 }
-  }
-%    \end{macrocode}
-%   The business end of the loop is here: there is first a need to deal
-%   with any control sequence cases before looking for characters to skip.
-%   If there is a hit for a letter-like control sequence, switch to lower
-%   casing.
-%    \begin{macrocode}
-\cs_new:Npn \@@_mixed_case_N_type:Nnn #1#2#3
-  {
-    \token_if_cs:NTF #1
-      {
-        \@@_change_case_cs_letterlike:Nnn #1 { upper }
-          { \@@_mixed_case_letterlike:Nw }
-        \@@_mixed_case_loop:wn #2 \q_recursion_stop {#3}
-      }
-      {
-        \@@_mixed_case_char:Nn #1 {#3}
-        \@@_change_case_loop:wnn #2 \q_recursion_stop { lower } {#3}
-      }
-  }
-\cs_new:Npn \@@_mixed_case_letterlike:Nw #1#2 \q_recursion_stop
-  { \@@_change_case_loop:wnn #2 \q_recursion_stop { lower } }
-%    \end{macrocode}
-%   As detailed above, handling a mixed case char means first looking for
-%   exceptions then treating as an upper cased letter, but with a list of
-%   tokens to skip over too.
-%    \begin{macrocode}
-\cs_new:Npn \@@_mixed_case_char:Nn #1#2
-  {
-    \cs_if_exist_use:cF { @@_change_case_mixed_ #2 :Nnw }
-      {
-        \cs_if_exist_use:cF { @@_change_case_upper_ #2 :Nnw }
-          { \use_ii:nn }
-      }
-        #1
-        { \@@_mixed_case_skip:N #1 }
-  }
-\cs_new:Npn \@@_mixed_case_skip:N #1
-  {
-    \exp_after:wN \@@_mixed_case_skip:NN
-      \exp_after:wN #1 \l_tl_mixed_case_ignore_tl
-      \q_recursion_tail \q_recursion_stop
-  }
-\cs_new:Npn \@@_mixed_case_skip:NN #1#2
-  {
-    \quark_if_recursion_tail_stop_do:nn {#2}
-      { \@@_mixed_case_char:N #1 }
-    \int_compare:nNnT { `#1 }  = { `#2 }
-      {
-        \use_i_delimit_by_q_recursion_stop:nw
-          {
-            \@@_change_case_output:nwn {#1}
-            \@@_mixed_case_skip_tidy:Nwn
-          }
-      }
-    \@@_mixed_case_skip:NN #1
-  }
-\cs_new:Npn \@@_mixed_case_skip_tidy:Nwn #1#2 \q_recursion_stop #3
-  {
-    \@@_mixed_case_loop:wn #2 \q_recursion_stop
-  }
-\cs_new:Npn \@@_mixed_case_char:N #1
-  {
-    \cs_if_exist:cTF { c__unicode_title_  #1 _tl }
-      {
-        \@@_change_case_output:fwn
-          { \tl_use:c { c__unicode_title_ #1 _tl } }
-      }
-      { \@@_change_case_char:nN { upper } #1 }
-  }
-%    \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
 % \begin{macro}[aux, EXP]{\@@_change_case_mixed_nl:Nnw}
 % \begin{macro}[aux, EXP]{\@@_change_case_mixed_nl:Nw}
 % \begin{macro}[aux, EXP]{\@@_change_case_mixed_nl:NNw}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -66,7 +66,7 @@
 %   \clist_put_right:Nn \l_my_clist { , ~ , , }
 %   \clist_if_empty:NTF \l_my_clist { true } { false }
 % \end{verbatim}
-% will leave \texttt{true} in the input stream. To include an item
+% leaves \texttt{true} in the input stream. To include an item
 % which contains a comma, or starts or ends with a space,
 % surround it with braces.  The sequence data type should be preferred
 % to comma lists if items are to contain |{|, |}|, or |#| (assuming the
@@ -79,8 +79,8 @@
 %     \cs{clist_new:N} \meta{comma list}
 %   \end{syntax}
 %   Creates a new \meta{comma list} or raises an error if the name is
-%   already taken. The declaration is global. The \meta{comma list} will
-%   initially contain no items.
+%   already taken. The declaration is global. The \meta{comma list}
+%   initially contains no items.
 % \end{function}
 %
 % \begin{function}[added = 2014-07-05]
@@ -93,7 +93,7 @@
 %   \end{syntax}
 %   Creates a new constant \meta{clist~var} or raises an error
 %   if the name is already taken. The value of the
-%   \meta{clist~var} will be set globally to the
+%   \meta{clist~var} is set globally to the
 %   \meta{comma list}.
 % \end{function}
 %
@@ -158,7 +158,7 @@
 %   \end{syntax}
 %   Concatenates the content of \meta{comma list_2} and \meta{comma list_3}
 %   together and saves the result in \meta{comma list_1}. The items in
-%   \meta{comma list_2} will be placed at the left side of the new comma list.
+%   \meta{comma list_2} are placed at the left side of the new comma list.
 % \end{function}
 %
 % \begin{function}[EXP, pTF, added=2012-03-03]
@@ -250,7 +250,7 @@
 %     This function iterates through every item in the \meta{comma list} and
 %     does a comparison with the \meta{items} already checked. It is therefore
 %     relatively slow with large comma lists.
-%     Furthermore, it will not work if any of the items in the
+%     Furthermore, it does not work if any of the items in the
 %     \meta{comma list} contains |{|, |}|, or |#|
 %     (assuming the usual \TeX{} category codes apply).
 %   \end{texnote}
@@ -292,7 +292,7 @@
 %   reverse order. Braces and spaces are preserved by this process.
 %   \begin{texnote}
 %     The result is returned within \tn{unexpanded}, which means that the
-%     comma list will not expand further when appearing in an
+%     comma list does not expand further when appearing in an
 %     \texttt{x}-type argument expansion.
 %   \end{texnote}
 % \end{function}
@@ -380,7 +380,7 @@
 %     \cs{clist_map_function:NN} \meta{comma list} \meta{function}
 %   \end{syntax}
 %   Applies \meta{function} to every \meta{item} stored in the
-%   \meta{comma list}. The \meta{function} will receive one argument for
+%   \meta{comma list}. The \meta{function} receives one argument for
 %   each iteration. The \meta{items} are returned from left to right.
 %   The function \cs{clist_map_inline:Nn} is in general more efficient
 %   than \cs{clist_map_function:NN}.
@@ -394,7 +394,7 @@
 %   \end{syntax}
 %   Applies \meta{inline function} to every \meta{item} stored
 %   within the \meta{comma list}. The \meta{inline function} should
-%   consist of code which will receive the \meta{item} as |#1|.
+%   consist of code which receives the \meta{item} as |#1|.
 %   One in line mapping can be nested inside another. The \meta{items}
 %   are returned from left to right.
 % \end{function}
@@ -406,7 +406,7 @@
 %   \end{syntax}
 %   Stores each entry in the \meta{comma list} 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{function} usually consists of code making use of
 %   the \meta{tl~var.}, but this is not enforced.  One variable
 %   mapping can be nested inside another. The \meta{items}
 %   are returned from left to right.
@@ -417,8 +417,8 @@
 %     \cs{clist_map_break:}
 %   \end{syntax}
 %   Used to terminate a |\clist_map_...| function before all
-%   entries in the \meta{comma list} have been processed. This will
-%   normally take place within a conditional statement, for example
+%   entries in the \meta{comma list} have been processed. This
+%   normally takes place within a conditional statement, for example
 %   \begin{verbatim}
 %     \clist_map_inline:Nn \l_my_clist
 %       {
@@ -429,12 +429,12 @@
 %           }
 %       }
 %   \end{verbatim}
-%   Use outside of a |\clist_map_...| scenario will lead to low
+%   Use outside of a |\clist_map_...| 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 further items are taken
-%     from the input stream. This will depend on the design of the mapping
+%     from the input stream. This depends on the design of the mapping
 %     function.
 %   \end{texnote}
 % \end{function}
@@ -445,8 +445,8 @@
 %   \end{syntax}
 %   Used to terminate a |\clist_map_...| function before all
 %   entries in the \meta{comma list} have been processed, inserting
-%   the \meta{tokens} after the mapping has ended. This will
-%   normally take place within a conditional statement, for example
+%   the \meta{tokens} after the mapping has ended. This
+%   normally takes place within a conditional statement, for example
 %   \begin{verbatim}
 %     \clist_map_inline:Nn \l_my_clist
 %       {
@@ -457,13 +457,13 @@
 %           }
 %       }
 %   \end{verbatim}
-%   Use outside of a |\clist_map_...| scenario will lead to low
+%   Use outside of a |\clist_map_...| 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 will depend on the design of the mapping function.
+%     This depends on the design of the mapping function.
 %   \end{texnote}
 % \end{function}
 %
@@ -474,7 +474,7 @@
 %   \end{syntax}
 %   Leaves the number of items in the \meta{comma list} in the input
 %   stream as an \meta{integer denotation}. The total number of items
-%   in a \meta{comma list} will include those which are duplicates,
+%   in a \meta{comma list} includes those which are duplicates,
 %   \emph{i.e.}~every item in a \meta{comma list} is unique.
 % \end{function}
 %
@@ -492,7 +492,7 @@
 %   the comma list has exactly two items, then they are placed in the input
 %   stream separated by the \meta{separator between two}.  If the comma
 %   list has a single item, it is placed in the input stream, and a comma
-%   list with no items produces no output.  An error will be raised if
+%   list with no items produces no output.  An error is raised if
 %   the variable does not exist or if it is invalid.
 %
 %   For example,
@@ -500,13 +500,13 @@
 %     \clist_set:Nn \l_tmpa_clist { a , b , , c , {de} , f }
 %     \clist_use:Nnnn \l_tmpa_clist { ~and~ } { ,~ } { ,~and~ }
 %   \end{verbatim}
-%   will insert \enquote{\texttt{a, b, c, de, and f}} in the input
+%   inserts \enquote{\texttt{a, b, c, de, and f}} in the input
 %   stream.  The first separator argument is not used in this case
 %   because the comma list has more than $2$ items.
 %   \begin{texnote}
 %     The result is returned within the \tn{unexpanded}
 %     primitive (\cs{exp_not:n}), which means that the \meta{items}
-%     will not expand further when appearing in an \texttt{x}-type
+%     do not expand further when appearing in an \texttt{x}-type
 %     argument expansion.
 %   \end{texnote}
 % \end{function}
@@ -518,7 +518,7 @@
 %   Places the contents of the \meta{clist~var} in the input stream,
 %   with the \meta{separator} between the items. If the comma
 %   list has a single item, it is placed in the input stream, and a comma
-%   list with no items produces no output.  An error will be raised if
+%   list with no items produces no output.  An error is raised if
 %   the variable does not exist or if it is invalid.
 %
 %   For example,
@@ -526,12 +526,12 @@
 %     \clist_set:Nn \l_tmpa_clist { a , b , , c , {de} , f }
 %     \clist_use:Nn \l_tmpa_clist { ~and~ }
 %   \end{verbatim}
-%   will insert \enquote{\texttt{a and b and c and de and f}} in the input
+%   inserts \enquote{\texttt{a and b and c and de and f}} in the input
 %   stream.
 %   \begin{texnote}
 %     The result is returned within the \tn{unexpanded}
 %     primitive (\cs{exp_not:n}), which means that the \meta{items}
-%     will not expand further when appearing in an \texttt{x}-type
+%     do not expand further when appearing in an \texttt{x}-type
 %     argument expansion.
 %   \end{texnote}
 % \end{function}
@@ -552,8 +552,8 @@
 %   Stores the left-most item from a \meta{comma list} in the
 %   \meta{token list variable} without removing it from the
 %   \meta{comma list}. The \meta{token list variable} is assigned locally.
-%   If the \meta{comma list} is empty the \meta{token list variable} will
-%   contain the marker value \cs{q_no_value}.
+%   If the \meta{comma list} is empty the \meta{token list variable}
+%   is set to the marker value \cs{q_no_value}.
 % \end{function}
 %
 % \begin{function}[TF, added = 2012-05-14]{\clist_get:NN, \clist_get:cN}
@@ -638,17 +638,17 @@
 %     \cs{clist_item:Nn} \meta{comma list} \Arg{integer expression}
 %   \end{syntax}
 %   Indexing items in the \meta{comma list} from~$1$ at the top (left), this
-%   function will evaluate the \meta{integer expression} and leave the
+%   function evaluates the \meta{integer expression} and leaves the
 %   appropriate item from the comma list in the input stream. If the
 %   \meta{integer expression} is negative, indexing occurs from the
 %   bottom (right) of the comma list. When the \meta{integer expression}
 %   is larger than the number of items in the \meta{comma list} (as
-%   calculated by \cs{clist_count:N}) then the function will expand to
+%   calculated by \cs{clist_count:N}) then the function expands to
 %   nothing.
 %   \begin{texnote}
 %     The result is returned within the \tn{unexpanded}
 %     primitive (\cs{exp_not:n}), which means that the \meta{item}
-%     will not expand further when appearing in an \texttt{x}-type
+%     does not expand further when appearing in an \texttt{x}-type
 %     argument expansion.
 %   \end{texnote}
 % \end{function}
@@ -1404,7 +1404,7 @@
 %   by blank spaces (besides, this particular variant of
 %   the emptiness test is optimized). If the item of the
 %   comma list is blank, grab the next one. As soon as one
-%   item is non-blank, exit: the second auxiliary will grab
+%   item is non-blank, exit: the second auxiliary grabs
 %   \cs{prg_return_false:} as |#2|, unless every item in
 %   the comma list was blank and the loop actually got broken
 %   by the trailing |\q_mark \prg_return_false:| item.

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -58,8 +58,8 @@
 %     \cs{coffin_new:N} \meta{coffin}
 %   \end{syntax}
 %   Creates a new \meta{coffin} or raises an error if the name is
-%   already taken. The declaration is global. The \meta{coffin} will
-%   initially be empty.
+%   already taken. The declaration is global. The \meta{coffin} is
+%   initially empty.
 % \end{function}
 %
 % \begin{function}[added = 2011-08-17]{\coffin_clear:N, \coffin_clear:c}
@@ -146,7 +146,7 @@
 %     ~~\Arg{pole} \Arg{offset}
 %   \end{syntax}
 %   Sets the \meta{pole} to run horizontally through the \meta{coffin}.
-%   The \meta{pole} will be located at the \meta{offset} from the
+%   The \meta{pole} is placed at the \meta{offset} from the
 %   bottom edge of the bounding box of the \meta{coffin}. The
 %   \meta{offset} should be given as a dimension expression.
 % \end{function}
@@ -157,7 +157,7 @@
 %     \cs{coffin_set_vertical_pole:Nnn} \meta{coffin} \Arg{pole} \Arg{offset}
 %   \end{syntax}
 %   Sets the \meta{pole} to run vertically through the \meta{coffin}.
-%   The \meta{pole} will be located at the \meta{offset} from the
+%   The \meta{pole} is placed at the \meta{offset} from the
 %   left-hand edge of the bounding box of the \meta{coffin}. The
 %   \meta{offset} should be given as a dimension expression.
 % \end{function}
@@ -201,7 +201,7 @@
 %   \end{syntax}
 %   This function joins <coffin_2> to <coffin_1> such that the bounding box
 %   of \meta{coffin_1} may expand. The new bounding
-%   box will cover the area containing the bounding boxes of the two
+%   box covers the area containing the bounding boxes of the two
 %   original coffins. The alignment is carried out by first calculating
 %   \meta{handle_1}, the point of intersection of \meta{coffin_1-pole_1} and
 %   \meta{coffin_1-pole_2}, and \meta{handle_2}, the point of intersection
@@ -265,7 +265,7 @@
 %   the \meta{poles} of the \meta{coffin} to give a set of
 %   \meta{handles}. It then prints the  \meta{coffin} at the current
 %   location in the source, with the  position of the \meta{handles}
-%   marked on the coffin. The \meta{handles} will be labelled as part
+%   marked on the coffin. The \meta{handles} are labelled as part
 %   of this process: the locations of the \meta{handles} and the labels
 %   are both printed in the \meta{color} specified.
 % \end{function}
@@ -278,7 +278,7 @@
 %   This function first calculates the \meta{handle} for the
 %   \meta{coffin} as defined by the intersection of \meta{pole_1} and
 %   \meta{pole_2}. It then marks the position of the \meta{handle}
-%   on the \meta{coffin}. The \meta{handle} will be labelled as part of
+%   on the \meta{coffin}. The \meta{handle} are labelled as part of
 %   this process: the location of the \meta{handle} and the label are
 %   both printed in the \meta{color} specified.
 % \end{function}
@@ -447,7 +447,7 @@
 % structures.
 %
 % \begin{macro}[EXP, pTF]{\coffin_if_exist:N, \coffin_if_exist:c}
-%   Several of the higher-level coffin functions will give multiple
+%   Several of the higher-level coffin functions would give multiple
 %   errors if the coffin does not exist. A cleaner way to handle this
 %   is provided here: both the box and the coffin structure are
 %   checked.
@@ -470,7 +470,7 @@
 % \end{macro}
 %
 % \begin{macro}{\@@_if_exist:NT}
-%   Several of the higher-level coffin functions will give multiple
+%   Several of the higher-level coffin functions would give multiple
 %   errors if the coffin does not exist. So a wrapper is provided to deal
 %   with this correctly, issuing an error on erroneous use.
 %    \begin{macrocode}
@@ -512,7 +512,7 @@
 \cs_new_protected:Npn \coffin_new:N #1
   {
     \box_new:N #1
-    \__chk_suspend_log:
+    \__debug_suspend_log:
     \prop_clear_new:c { l_@@_corners_ \__int_value:w #1 _prop }
     \prop_clear_new:c { l_@@_poles_   \__int_value:w #1 _prop }
     \prop_gset_eq:cN { l_@@_corners_ \__int_value:w #1 _prop }
@@ -519,7 +519,7 @@
       \c_@@_corners_prop
     \prop_gset_eq:cN { l_@@_poles_ \__int_value:w #1 _prop }
       \c_@@_poles_prop
-    \__chk_resume_log:
+    \__debug_resume_log:
   }
 \cs_generate_variant:Nn \coffin_new:N { c }
 %    \end{macrocode}
@@ -910,7 +910,7 @@
 %   the intersection depends on the directions of the poles, which are
 %   given by $d / c$ and $d' / c'$. However, if one of the poles
 %   is either horizontal or vertical then one or more of $c$, $d$,
-%   $c'$ and $d'$ will be zero and a special case is needed.
+%   $c'$ and $d'$ are zero and a special case is needed.
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_calculate_intersection:nnnnnnnn
   #1#2#3#4#5#6#7#8
@@ -918,7 +918,7 @@
     \dim_compare:nNnTF {#3} = { \c_zero_dim }
 %    \end{macrocode}
 %   The case where the first pole is vertical.  So the $x$-component
-%   of the interaction will be at $a$. There is then a test on the
+%   of the interaction is at $a$. There is then a test on the
 %   second pole: if it is also vertical then there is an error.
 %    \begin{macrocode}
       {
@@ -927,7 +927,7 @@
           { \bool_set_true:N \l_@@_error_bool }
 %    \end{macrocode}
 %   The second pole may still be horizontal, in which case the
-%   $y$-component of the intersection will be $b'$. If not,
+%   $y$-component of the intersection is $b'$. If not,
 %   \[
 %     y = \frac{d'}{c'} \left ( x - a' \right ) + b'
 %   \]
@@ -1078,7 +1078,7 @@
 %   }
 %   This command joins two coffins, using a horizontal and vertical pole
 %   from each coffin and making an offset between the two. The result
-%   is stored as the as a third coffin, which will have all of its handles
+%   is stored as the as a third coffin, which has all of its handles
 %   reset to standard values. First, the more basic alignment function is
 %   used to get things started.
 %    \begin{macrocode}
@@ -1090,7 +1090,7 @@
 %   Correct the placement of the reference point. If the $x$-offset
 %   is negative then the reference point of the second box is to the left
 %   of that of the first, which is corrected using a kern. On the right
-%   side the first box might stick out, which will show up if it is wider
+%   side the first box might stick out, which would show up if it is wider
 %   than the sum of the $x$-offset and the width of the second box.
 %   So a second kern may be needed.
 %    \begin{macrocode}
@@ -1115,7 +1115,7 @@
 %    \end{macrocode}
 %   The structures of the parent coffins are now transferred to the new
 %   coffin, which requires that the appropriate offsets are applied. That
-%   will then depend on whether any shift was needed.
+%   then depends on whether any shift was needed.
 %    \begin{macrocode}
     \dim_compare:nNnTF \l_@@_offset_x_dim < \c_zero_dim
       {
@@ -1192,7 +1192,7 @@
 %   storage area to be used for the second coffin. The `real' box
 %   offsets are then calculated, before using these to re-box the
 %   input coffins. The default poles are then set up, but the final result
-%   will depend on how the bounding box is being handled.
+%   depends on how the bounding box is being handled.
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_align:NnnNnnnnN #1#2#3#4#5#6#7#8#9
   {
@@ -1279,7 +1279,7 @@
 % \begin{macro}{\@@_update_vertical_poles:NNN}
 % \begin{macro}[aux]{\@@_update_T:nnnnnnnnN}
 % \begin{macro}[aux]{\@@_update_B:nnnnnnnnN}
-%   The \texttt{T} and \texttt{B} poles will need to be recalculated
+%   The \texttt{T} and \texttt{B} poles need to be recalculated
 %   after alignment. These functions find the larger absolute value for
 %   the poles, but this is of course only logical when the poles are
 %   horizontal.
@@ -1331,7 +1331,7 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \coffin_typeset:Nnnnn #1#2#3#4#5
   {
-    \hbox_unpack:N \c_empty_box
+    \mode_leave_vertical:
     \@@_align:NnnNnnnnN \c_empty_coffin { H } { l }
       #1 {#2} {#3} {#4} {#5} \l_@@_aligned_coffin
     \box_use:N \l_@@_aligned_coffin

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3color.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3color.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3color.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -70,12 +70,33 @@
 %   \begin{syntax}
 %     \cs{color_ensure_current:}
 %   \end{syntax}
-%   Ensures that material inside a box will use the foreground color
+%   Ensures that material inside a box uses the foreground color
 %   at the point where the box is set, rather than that in force when the
 %   box is used. This function should usually be used within a
 %   \cs{color_group_begin:} \ldots \cs{color_group_end:} group.
 % \end{function}
 %
+% \subsection{Internal functions}
+%
+% \begin{variable}[added = 2017-06-15]{\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:
+%   \begin{itemize}
+%     \item \texttt{gray \meta{gray}} Grayscale color with the \meta{gray}
+%       value running from $0$ (fully black) to $1$ (fully white)
+%     \item \texttt{cmyk \meta{cyan} \meta{magenta} \meta{yellow} \meta{black}}
+%     \item \texttt{rgb \meta{red} \meta{green} \meta{blue}}
+%   \end{itemize}
+%   Notice that the value are separated by spaces.
+%   \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.
+%   \end{texnote}
+% \end{variable}
+%
 % \end{documentation}
 %
 % \begin{implementation}
@@ -105,11 +126,23 @@
 %   current color \enquote{now}.
 %    \begin{macrocode}
 \cs_new_protected:Npn \color_ensure_current:
-  { \__driver_color_ensure_current: }
+  {
+    \__driver_color_ensure_current:
+    \group_insert_after:N \__driver_color_reset:
+  }
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{variable}{\l__color_current_tl}
+%   The current color: the format here is taken from \texttt{dvips} but it
+%   is easy enough to convert to \texttt{pdfmode} as required.
 %    \begin{macrocode}
+\tl_new:N \l__color_current_tl
+\tl_set:Nn \l__color_current_tl { gray~0 }
+%    \end{macrocode}
+% \end{variable}
+%
+%    \begin{macrocode}
 %</initex|package>
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -74,7 +74,7 @@
 %    \end{macrocode}
 %
 % \begin{macro}[aux]{\@@_error:Nnn}
-%   The \tn{outer} definition here ensures the command will not appear
+%   The \tn{outer} definition here ensures the command cannot appear
 %   in an argument.  Use this auxiliary on all commands that have been
 %   removed since 2015.
 %    \begin{macrocode}
@@ -145,6 +145,17 @@
     \@@_error:Nnn \c_minus_one { - 1 } { 2018-12-31 }
     \@@_error:Nnn \sort_ordered: { \sort_return_same: } { 2018-12-31 }
     \@@_error:Nnn \sort_reversed: { \sort_return_swapped: } { 2018-12-31 }
+    \@@_error:Nnn \g_file_current_name_tl { \g_file_curr_name_str } { 2018-12-31 }
+    \@@_error:Nnn \file_add_path:nN { \file_get_full_name:nN } { 2018-12-31 }
+    \@@_error:Nnn \file_path_include:n
+      { \seq_put_right:Nn \l_file_search_path_seq } { 2018-12-31 }
+    \@@_error:Nnn \file_path_remove:n
+      { \seq_remove_all:Nn \l_file_search_path_seq } { 2018-12-31 }
+    \@@_error:Nnn \file_list: { \file_log_list: } { 2018-12-31 }
+    \@@_error:Nnn \ior_list_streams: { \ior_show_list: } { 2018-12-31 }
+    \@@_error:Nnn \ior_log_streams: { \ior_log_list: } { 2018-12-31 }
+    \@@_error:Nnn \iow_list_streams: { \iow_show_list: } { 2018-12-31 }
+    \@@_error:Nnn \iow_log_streams: { \iow_log_list: } { 2018-12-31 }
     \cs_set_eq:NN \__fp_parse_round:Nw \__fp_parse_round_deprecation_error:Nw
     \cs_set_eq:NN \deprecation_error: \scan_stop:
   }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -70,7 +70,7 @@
 % This isn't included in the typeset documentation because it's a bit
 % ugly:
 %<*class>
-\ProvidesExplClass{l3doc}{2017/05/29}{}
+\ProvidesExplClass{l3doc}{2017/07/15}{}
   {L3 Experimental documentation class}
 %</class>
 % \fi
@@ -77,7 +77,7 @@
 %
 % \title{The \cls{l3doc} class}
 % \author{\Team}
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 % \maketitle
 % \tableofcontents
 %
@@ -96,7 +96,7 @@
 %   Use at own risk!}
 %
 % It is written as a \enquote{self-contained} docstrip file: executing
-% |latex l3doc.dtx| will generate the \file{l3doc.cls} file and typeset
+% |latex l3doc.dtx| generates the \file{l3doc.cls} file and typesets
 % this documentation; execute |tex l3doc.dtx| to only generate
 % \file{l3doc.cls}.
 %
@@ -233,7 +233,7 @@
 % Use |\begin{documentation}...\end{documentation}| around the
 % documentation, and |\begin{implementation}...\end{implementation}|
 % around the implementation.  The
-% \cs{EnableDocumentation}/\cs{EnableImplementation} will cause them to
+% \cs{EnableDocumentation}/\cs{EnableImplementation} causes them to
 % be typeset when the \file{.dtx} file is \cs{DocInput}; use
 % \cs{DisableDocumentation}/\cs{DisableImplementation} to omit the
 % contents of those environments.
@@ -259,7 +259,7 @@
 %   recommended.
 %
 %   These commands are aware of the |@@| \pkg{l3docstrip} syntax and
-%   will replace such instances correctly in the typeset documentation.
+%   replace such instances correctly in the typeset documentation.
 %   This only happens after a |%<@@=|\meta{module}|>| declaration.
 %
 %   Additionally, commands can be used in the argument of \cs{cs}.  For
@@ -269,10 +269,10 @@
 %   The \meta{options} are a key--value list which can contain the
 %   following keys:
 %   \begin{itemize}
-%     \item |index=|\meta{name}: the \meta{csname} will be indexed as if
+%     \item |index=|\meta{name}: the \meta{csname} is indexed as if
 %       one had written \cs{cs}\Arg{name}.
-%     \item |no-index|: the \meta{csname} will not be indexed.
-%     \item |module=|\meta{module}: the \meta{csname} will be indexed in
+%     \item |no-index|: the \meta{csname} is not indexed.
+%     \item |module=|\meta{module}: the \meta{csname} is indexed in
 %       the list of commands from the \meta{module}; the \meta{module}
 %       can in particular be |TeX| for \enquote{\TeX{} and \LaTeXe{}}
 %       commands, or empty for commands which should be placed in the
@@ -289,7 +289,7 @@
 %     \cs{tn} \oarg{options} \marg{csname}
 %   \end{syntax}
 %   Analoguous to \cs{cs} but intended for \enquote{traditional} \TeX{}
-%   or \LaTeXe{} commands; they will be indexed accordingly.  This is in
+%   or \LaTeXe{} commands; they are indexed accordingly.  This is in
 %   fact equivalent to \cs{cs} |[module=TeX, replace=false,|
 %   \meta{options}|]| \Arg{csname}.
 % \end{function}
@@ -415,22 +415,25 @@
 % necessary to highlight it as much and you also don't need to check it
 % for, say, having a test function and having a documentation chunk
 % earlier in a \env{function} environment.  In this case, write
-% |\begin{macro}[aux]| and it will be marked as such; its margin
-% call-out will be printed in grey.
+% |\begin{macro}[aux]| to mark it as such; its margin
+% call-out is then printed in grey.
 %
 % Similarly, an internal package function still requires documentation
-% but usually will not be documented for users to see; these can be
+% but usually is not documented for users to see; these can be
 % marked as such with |\begin{macro}[int]|.
 %
 % For documenting \pkg{expl3}-type conditionals, you may also pass this
 % environment a |TF| option (and omit it from the function name) to
 % denote that the function is provided with |T|, |F|, and |TF| suffixes.
-% A similar |pTF| option will print both |TF| and |_p| predicate forms.
+% A similar |pTF| option prints both |TF| and |_p| predicate forms.
+% An option |noTF| prints both the |TF| forms and a form with neither
+% |T| nor |F|, to document functions such as \cs[no-index]{prop_get:NN}
+% which also have conditional forms (\cs[no-index]{prop_get:NNTF}).
 %
 %
 % \DescribeMacro{\TestFiles}
 % \cs{TestFiles}\marg{list of files} is used to indicate which test
-% files are used for the current code; they will be printed in the
+% files are used for the current code; they are printed in the
 % documentation.
 %
 % \DescribeMacro{\UnitTested}
@@ -449,14 +452,14 @@
 % \DescribeMacro{\TestMissing}
 % If a function is missing a test, this may be flagged by writing (as
 % many times as needed) \cs{TestMissing} \marg{explanation of test
-%   required}.  These missing tests will be summarised in the listing
+%   required}.  These missing tests are summarised in the listing
 % printed at the end of the compilation run.
 %
 % \DescribeEnv{variable}
 % When documenting variable definitions, use the \env{variable}
-% environment instead.  It will, here, behave identically to the
+% environment instead.  Here it behaves identically to the
 % \env{macro} environment, except that if the class option |checktest|
-% is enabled, variables will not be required to have a test file.
+% is enabled, variables are not required to have a test file.
 %
 % \DescribeEnv{arguments}
 % Within a \env{macro} environment, you may use the \env{arguments}
@@ -749,9 +752,9 @@
 %   }
 %   When analyzing a control sequence found within a \env{macrocode}
 %   environment, \cs{l_@@_index_macro_tl} holds the control sequence
-%   (partially a string), \cs{l_@@_index_key_tl} holds what will be used
-%   as a sort key in the index, and \cs{l_@@_index_module_tl} is the
-%   subindex in which the control sequence will be listed.  Finally,
+%   (partially a string), \cs{l_@@_index_key_tl} holds the future
+%   sort key in the index, and \cs{l_@@_index_module_tl} is the
+%   subindex in which the control sequence should be listed.  Finally,
 %   \cs{l_@@_index_internal_bool} indicates when the control sequence is
 %   internal and should be indexed in a slightly different subindex.
 %    \begin{macrocode}
@@ -939,7 +942,7 @@
 %
 % \begin{macro}[int,TF]{\@@_if_almost_str:n}
 %   Used to test if the argument of |\cmd| or other macros to be indexed
-%   is almost a string or not: for instance this will be wrong if |#1|
+%   is almost a string or not: for instance this is \texttt{false} if |#1|
 %   contains |\meta{...}|.  The surprising |f|-expansion are there to
 %   cope with the case of |#1| starting with \cs{c_@@_backslash_tl}
 %   which should be expanded and considered to be \enquote{normal}.
@@ -2929,7 +2932,7 @@
     \@@_test_missing_aux:Nxn
       \g_@@_missing_tests_prop
       { \seq_use:Nn \l_@@_names_seq { , } }
-      { { \g_file_current_name_tl \iow_char:N \ (#1) } }
+      { { \g_file_curr_name_str \iow_char:N \ (#1) } }
   }
 \cs_new_protected:Npn \@@_test_missing_aux:Nnn #1#2#3
   {
@@ -3125,7 +3128,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% Here are some definitions for additional markup that will help to
+% Here are some definitions for additional markup that helps to
 % structure your documentation.
 %
 % \begin{environment}{danger}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -61,7 +61,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -95,8 +95,8 @@
 %
 % To extract the code using \pkg{l3docstrip}, the \enquote{guard} concept
 % used by \textsf{DocStrip} is extended by introduction of the syntax
-% \texttt{\%<@@=\meta{module}>}. The \meta{module} name will be used when the
-% code is extracted to replace the |@@|, so that
+% \texttt{\%<@@=\meta{module}>}. The \meta{module} name then replaces
+% the |@@| when the code is extracted, so that
 % \begin{verbatim}
 %   %<*package>
 %   %<@@=foo>
@@ -107,7 +107,7 @@
 %   \tl_new:N \l_@@_internal_tl
 %   %</package>
 % \end{verbatim}
-% will be extracted as
+% is extracted as
 % \begin{verbatim}
 %   \cs_new_protected:Npn \__foo_some_function:nn #1#2
 %      {
@@ -170,8 +170,8 @@
 %
 % \begin{macro}{\moduleOption}
 %   In the case where the line starts |%<@|: the defined syntax requires that
-%   this continues to |%<@@=|. At the moment, we assume that the syntax will
-%   be correct and |#1| here is the module name for substitution into any
+%   this continues to |%<@@=|. At the moment, we assume that the syntax is
+%   correct and |#1| here is the module name for substitution into any
 %   internal functions in the extracted material.
 %    \begin{macrocode}
 \def\moduleOption @@=#1>#2\endLine{%
@@ -186,7 +186,7 @@
 %   Here, we set up to do the search-and-replace when doing the extraction.
 %   The argument (|#1|) is the replacement text to use, or if empty an
 %   indicator that no replacement should be done. The search material is
-%   one of |__@@|, |_@@| or |@@|, done in order such that all three will end
+%   one of |__@@|, |_@@| or |@@|, done in order such that all three end
 %   up the same in the output. The string |@@@@| is hidden from these
 %   replacements by temporarily turning it into a pair of letters with
 %   different category codes, not produced by \pkg{docstrip}; this allows to

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -45,7 +45,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -81,7 +81,7 @@
 %     \cs{__driver_box_use_clip:N} \meta{box}
 %   \end{syntax}
 %   Inserts the content of the \meta{box} at the current insertion point
-%   such that any material outside of the bounding box will not be displayed
+%   such that any material outside of the bounding box is not displayed
 %   by the driver. The material in the \meta{box} is still placed in the
 %   output stream: the clipping takes place at a driver level.
 %
@@ -156,7 +156,7 @@
 %     \meta{content}
 %     \cs{__driver_draw_end:}
 %   \end{syntax}
-%   Defines a drawing environment. This will be a scope for the purposes of
+%   Defines a drawing environment. This is a scope for the purposes of
 %   the graphics state. Depending on the driver, other set up may or may not
 %   take place here. The natural size of the \meta{content} should be zero
 %   from the \TeX{} perspective: allowance for the size of the content must
@@ -186,7 +186,7 @@
 %     \cs{__driver_draw_move:nn} \Arg{x} \Arg{y}
 %   \end{syntax}
 %   Moves the current drawing reference point to (\meta{x}, \meta{y});
-%   any active transformation matrix will apply.
+%   any active transformation matrix applies.
 % \end{function}
 %
 % \begin{function}{\__driver_draw_lineto:nn}
@@ -194,7 +194,7 @@
 %     \cs{__driver_draw_lineto:nn} \Arg{x} \Arg{y}
 %   \end{syntax}
 %   Adds a path from the current drawing reference point to
-%   (\meta{x}, \meta{y}); any active transformation matrix will apply. Note
+%   (\meta{x}, \meta{y}); any active transformation matrix applies. Note
 %   that nothing is drawn until a fill or stroke operation is applied, and that
 %   the path may be discarded or used as a clip without appearing itself.
 % \end{function}
@@ -207,7 +207,7 @@
 %   Adds a Bezier curve path from the current drawing reference point to
 %   (\meta{x_3}, \meta{y_3}), using (\meta{x_1}, \meta{y_1}) and
 %   (\meta{x_2}, \meta{y_2}) as control points; any active transformation
-%   matrix will apply.  Note that nothing is drawn until a fill or stroke
+%   matrix applies.  Note that nothing is drawn until a fill or stroke
 %   operation is applied, and that the path may be discarded or used as a clip
 %   without appearing itself.
 % \end{function}
@@ -217,7 +217,7 @@
 %     \cs{__driver_draw_rectangle:nnnn} \Arg{x} \Arg{y} \Arg{width} \Arg{height}
 %   \end{syntax}
 %   Adds rectangular path from (\meta{x_1}, \meta{y_1}) of \meta{height}
-%   and \meta{width}; any active transformation matrix will apply.  Note that
+%   and \meta{width}; any active transformation matrix applies.  Note that
 %   nothing is drawn until a fill or stroke operation is applied, and that the
 %   path may be discarded or used as a clip without appearing itself.
 % \end{function}
@@ -239,8 +239,8 @@
 %     \meta{path construction}
 %     \cs{__driver_draw_stroke:}
 %   \end{syntax}
-%   Draws a line alone the current path, which will also be closed when
-%   \cs{__driver_draw_closestroke:} is used. The nature of the line drawn
+%   Draws a line along the current path, which is also closed by
+%   \cs{__driver_draw_closestroke:}. The nature of the line drawn
 %   is influenced by settings for
 %   \begin{itemize}
 %     \item Line thickness
@@ -259,8 +259,8 @@
 %     \cs{__driver_draw_fill:}
 %   \end{syntax}
 %   Fills the area surrounded by the current path: this will be closed prior
-%   to filling if it is not already. The \texttt{fillstroke} version will also
-%   stroke the path as described for \cs{__driver_draw_stroke:}. The fill is
+%   to filling if it is not already. The \texttt{fillstroke} version also
+%   strokes the path as described for \cs{__driver_draw_stroke:}. The fill is
 %   influenced by the setting for fill color (or the current color if no
 %   specific stroke color is set). The path may also be used for clipping.
 %   For paths which are self-intersecting or comprising multiple parts, the
@@ -325,7 +325,7 @@
 %   \texttt{3pt, 3pt}. An empty pattern yields a solid line.
 %
 %   The \meta{phase} specifies an offset at the start of the cycle. For
-%   example, with a pattern \texttt{3pt} a phase of \texttt{1pt} will mean
+%   example, with a pattern \texttt{3pt} a phase of \texttt{1pt} means
 %   that the output is $2$\,pt on, $3$\,pt off, $3$\,pt on, $3$\,pt on,
 %   \emph{etc.}
 % \end{function}
@@ -422,12 +422,12 @@
 %       \Arg{a} \Arg{b} \Arg{c} \Arg{d} \Arg{x} \Arg{y}
 %   \end{syntax}
 %   Inserts the \meta{box} as an hbox with the box reference point placed
-%   at ($x$, $y$). The transformation matrix $[a b c d]$ will be applied
+%   at ($x$, $y$). The transformation matrix $[a b c d]$ is applied
 %   to the box, allowing it to be in synchronisation with any scaling, rotation
 %   or skewing applying more generally. Note that \TeX{} material should not
-%   be inserted directly into a drawing as it will not be in the correct
-%   location. Also note that as for other drawing elements the box here will
-%   have no size from a \TeX{} perspective.
+%   be inserted directly into a drawing as it would not be in the correct
+%   location. Also note that as for other drawing elements the box here
+%   has no size from a \TeX{} perspective.
 % \end{function}
 %
 % \subsection{Coordinate system transformations}
@@ -438,7 +438,7 @@
 %       \Arg{x} \Arg{y}
 %   \end{syntax}
 %   Applies the transformation matrix $[a b c d]$ and offset vector
-%   ($x$, $y$) to the current graphic state. This will affect any subsequent
+%   ($x$, $y$) to the current graphic state. This affects any subsequent
 %   items in the same scope but not those already given.
 % \end{function}
 %
@@ -487,6 +487,752 @@
 %</package>
 %    \end{macrocode}
 %
+% The order of the driver code here is such that we get somewhat logical
+% outcomes in terms of code sharing whilst keeping things readable. (Trying to
+% mix all of the code by concept is almost unmanageable.) The key parts which
+% are shared are
+% \begin{itemize}
+%   \item Color support is either \texttt{dvips}-like or \texttt{pdfmode}-like.
+%   \item \texttt{pdfmode} and \texttt{(x)dvipdfmx} share drawing routines.
+%   \item \texttt{xdvipdfmx} is largely the same as \texttt{dvipdfmx} so
+%     takes most of the same code.
+% \end{itemize}
+%
+% \subsection{Color support}
+%
+% Whilst \texttt{(x)dvipdfmx} does have its own approach to color specials,
+% it is easier to use \texttt{dvips}-like ones for all cases except direct
+% PDF output. As such the color code is collected here in two blocks.
+%
+% \subsubsection{\texttt{dvips}-style}
+%
+%    \begin{macrocode}
+%<*dvisvgm|dvipdfmx|dvips|xdvipdfmx>
+%    \end{macrocode}
+%
+% \begin{macro}[aux]{\@@_color_pickup:}
+%   Allow for \LaTeXe{}.
+%    \begin{macrocode}
+%<*package>
+\AtBeginDocument
+  {
+    \@ifpackageloaded { color }
+      {
+        \cs_new_protected:Npn \@@_color_pickup:
+          { \tl_set_eq:NN \l__color_current_tl \current at color }
+      }
+      { \cs_new_protected:Npn \@@_color_pickup: { } }
+  }
+%</package>
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\@@_color_ensure_current:}
+% \begin{macro}[aux]{\@@_color_reset:}
+%   Directly set the color using the specials: no optimisation here.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_color_ensure_current:
+  {
+%<*package>
+    \@@_color_pickup:
+%</package>
+    \tex_special:D { color~push~\l__color_current_tl }
+  }
+\cs_new_protected:Npn \@@_color_reset:
+  { \tex_special:D { color~pop } }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%    \begin{macrocode}
+%</dvisvgm|dvipdfmx|dvips|xdvipdfmx>
+%    \end{macrocode}
+%
+% \subsubsection{\texttt{pdfmode}}
+%
+%    \begin{macrocode}
+%<*pdfmode>
+%    \end{macrocode}
+%
+% \begin{macro}[aux]{\@@_color_pickup:}
+% \begin{macro}[aux]{\@@_color_pickup_aux:}
+%   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
+%   we store our color data in \texttt{dvips} format.
+%    \begin{macrocode}
+%<*package>
+\AtBeginDocument
+  {
+    \@ifpackageloaded { color }
+      {
+        \cs_new_protected:Npn \@@_color_pickup:
+          {
+            \tl_set:Nx \l__color_current_tl
+              {
+                \exp_after:wN \@@_color_pickup_aux:w
+                  \current at color ~ 0 ~ 0 ~ 0 \q_stop
+              }
+          }
+        \cs_new:Npn \@@_color_pickup_aux:w #1 ~ #2 ~ #3 ~ #4 ~ #5 ~ #6 \q_stop
+          {
+            \str_if_eq:nnTF {#2} { g }
+              { gray ~ #1 }
+              {
+                \str_if_eq:nnTF {#4} { rg }
+                  { rgb ~ #1 ~ #2 ~ #3 }
+                  {
+                    \str_if_eq:nnTF {#5} { k }
+                      { cmyk ~ #1 ~ #2 ~ #3 ~ #4 }
+                      { gray ~ #1 }
+                  }
+              }
+          }
+      }
+      { \cs_new_protected:Npn \@@_color_pickup: { } }
+  }
+%</package>
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{variable}{\l_@@_color_stack_int}
+%   \pdfTeX{} and \LuaTeX{} have multiple stacks available, and to track
+%   which one is in use a variable is required.
+%    \begin{macrocode}
+\int_new:N \l_@@_color_stack_int
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[int]{\@@_color_ensure_current:}
+% \begin{macro}[aux, EXP]
+%   {
+%     \@@_color_convert:w, \@@_color_convert_gray:w,
+%     \@@_color_convert_cmyk:w, \@@_color_convert_rgb: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.
+%    \begin{macrocode}
+\cs_new_protected:Npx \@@_color_ensure_current:
+  {
+%<*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
+            \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
+  { #1 ~ g ~ #1 ~ G }
+\cs_new:Npn \@@_color_convert_cmyk:w #1 ~ #2 ~ #3 ~ #4 \q_stop
+  { #1 ~ #2 ~ #3 ~ rg ~ #1 ~ #2 ~ #3 ~ RG }
+\cs_new:Npn \@@_color_convert_rgb:w #1 ~ #2 ~ #3 ~ #4 ~ #5 \q_stop
+  { #1 ~ #2 ~ #3 ~ #4 ~ k ~ #1 ~ #2 ~ #3 ~ #4 ~ K }
+\cs_new_protected:Npx \@@_color_reset:
+  {
+    \cs_if_exist:NTF \luatex_pdfextension:D
+      { \luatex_pdfextension:D colorstack }
+      { \pdftex_pdfcolorstack:D }
+        \exp_not:N \l_@@_color_stack_int pop \scan_stop:
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%    \begin{macrocode}
+%</pdfmode>
+%    \end{macrocode}
+%
+% \subsection{\texttt{dvips} driver}
+%
+%    \begin{macrocode}
+%<*dvips>
+%    \end{macrocode}
+%
+% \subsubsection{Basics}
+%
+% \begin{macro}[int]{\@@_literal:n}
+%   In the case of \texttt{dvips} there is no build-in saving of the current
+%   position, and so some additional PostScript is required to set up the
+%   transformation matrix and also to restore it afterwards. Notice the use
+%   of the stack to save the current position \enquote{up front} and to
+%   move back to it at the end of the process.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_literal:n #1
+  {
+    \tex_special:D
+      {
+        ps:
+          currentpoint~
+          currentpoint~translate~
+          #1 ~
+          neg~exch~neg~exch~translate
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_scope_begin:, \@@_scope_end:}
+%   Scope saving/restoring is done directly with no need to worry about the
+%   transformation matrix. General scoping is only for the graphics stack so
+%   the lower-cost |gsave|/|grestore| pair are used.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_scope_begin:
+  { \tex_special:D { ps:gsave } }
+\cs_new_protected:Npn \@@_scope_end:
+  { \tex_special:D { ps:grestore } }
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsection{Driver-specific auxiliaries}
+%
+% \begin{macro}[int, EXP]{\@@_absolute_lengths:n}
+%   The \texttt{dvips} driver scales all absolute dimensions based
+%   on the output resolution selected and any \TeX{} magnification. Thus
+%   for any operation involving absolute lengths there is a correction to
+%   make. This is based on \texttt{normalscale} from \texttt{special.pro}
+%   but using the stack rather than a definition to save the current matrix.
+%    \begin{macrocode}
+\cs_new:Npn \@@_absolute_lengths:n #1
+  {
+     matrix~currentmatrix~
+     Resolution~72~div~VResolution~72~div~scale~
+     DVImag~dup~scale~
+     #1 ~
+     setmatrix
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Box operations}
+%
+% \begin{macro}{\@@_box_use_clip:N}
+%   Much the same idea as for the PDF mode version but with a slightly
+%   different syntax for creating the clip path. To avoid any scaling
+%   issues we need the absolute length auxiliary here.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_box_use_clip:N #1
+  {
+    \@@_scope_begin:
+    \@@_literal:n
+      {
+        \@@_absolute_lengths:n
+          {
+            0 ~
+            \dim_to_decimal_in_bp:n { \box_dp:N #1 } ~
+            \dim_to_decimal_in_bp:n { \box_wd:N #1 } ~
+            \dim_to_decimal_in_bp:n { -\box_ht:N #1 - \box_dp:N #1 } ~
+            rectclip
+          }
+      }
+    \hbox_overlap_right:n { \box_use:N #1 }
+    \@@_scope_end:
+    \skip_horizontal:n { \box_wd:N #1 }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_box_use_rotate:Nn}
+%   Rotating using \texttt{dvips} does not require that the box dimensions
+%   are altered and has a very convenient built-in operation. Zero rotation
+%   must be written as |0| not |-0| so there is a quick test.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_box_use_rotate:Nn #1#2
+  {
+    \@@_scope_begin:
+    \@@_literal:n
+      {
+        \fp_compare:nNnTF {#2} = \c_zero_fp
+          { 0 }
+          { \fp_eval:n { round ( -#2 , 5 ) } } ~
+        rotate
+      }
+   \box_use:N #1
+   \@@_scope_end:
+  }
+% \end{macro}
+%
+% \begin{macro}{\@@_box_use_scale:Nnn}
+%   The \texttt{dvips} driver once again has a dedicated operation we can
+%   use here.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_box_use_scale:Nnn #1#2#3
+  {
+    \@@_scope_begin:
+    \@@_literal:n
+      {
+        \fp_eval:n { round ( #2 , 5 ) } ~
+        \fp_eval:n { round ( #3 , 5 ) } ~
+        scale
+      }
+    \hbox_overlap_right:n { \box_use:N #1 }
+    \@@_scope_end:
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsection{Images}
+%
+% \begin{macro}[int]{\@@_image_getbb_eps:n}
+%   Simply use the generic function.
+%    \begin{macrocode}
+\cs_new_eq:NN \@@_image_getbb_eps:n \__image_read_bb:n
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\@@_image_include_eps:n}
+%  The special syntax is relatively clear here: remember we need PostScript
+%  sizes here.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_image_include_eps:n #1
+  {
+    \tex_special:D { PSfile = #1 }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsection{Drawing}
+%
+% \begin{macro}[aux]{\@@_draw_literal:n, \@@_draw_literal:x}
+%   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}
+\cs_new_protected:Npn \@@_draw_literal:n #1
+  { \tex_special:D { ps:: ~ #1 } }
+\cs_generate_variant:Nn \@@_draw_literal:n { x }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\@@_draw_begin:, \@@_draw_end:}
+%   The |ps::[begin]| special here deals with positioning but allows us to
+%   continue on to a matching |ps::[end]|: contrast with |ps:|, which positions
+%   but where we can't split material between separate calls. The
+%   |@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}
+\cs_new_protected:Npn \@@_draw_begin:
+  {
+    \tex_special:D { ps::[begin] }
+    \tex_special:D { ps::~save }
+    \tex_special:D { ps::~/l3x~currentpoint~/l3y~exch~def~def }
+    \tex_special:D { ps::~@beginspecial }
+  }
+\cs_new_protected:Npn \@@_draw_end:
+  {
+    \tex_special:D { ps::~@endspecial }
+    \tex_special:D { ps::~restore }
+    \tex_special:D { ps::[end] }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \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}
+\cs_new_protected:Npn \@@_draw_scope_begin:
+  { \@@_draw_literal:n { save } }
+\cs_new_protected:Npn \@@_draw_scope_end:
+  { \@@_draw_literal:n { restore } }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\@@_draw_moveto:nn, \@@_draw_lineto:nn}
+% \begin{macro}[int]{\@@_draw_rectangle:nnnn}
+% \begin{macro}[int]{\@@_draw_curveto:nnnnnn}
+%   Path creation operations mainly resolve directly to PostScript primitive
+%   steps, with 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. 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}
+\cs_new_protected:Npn \@@_draw_moveto:nn #1#2
+  {
+    \@@_draw_literal:x
+      { \dim_to_decimal_in_bp:n {#1} ~ \dim_to_decimal_in_bp:n {#2} ~ moveto }
+  }
+\cs_new_protected:Npn \@@_draw_lineto:nn #1#2
+  {
+    \@@_draw_literal:x
+      { \dim_to_decimal_in_bp:n {#1} ~ \dim_to_decimal_in_bp:n {#2} ~ lineto }
+  }
+\cs_new_protected:Npn \@@_draw_rectangle:nnnn #1#2#3#4
+  {
+     \@@_draw_literal:x
+       {
+         \dim_to_decimal_in_bp:n {#4} ~ \dim_to_decimal_in_bp:n {#3} ~
+         \dim_to_decimal_in_bp:n {#1} ~ \dim_to_decimal_in_bp:n {#2} ~
+         moveto~dup~0~rlineto~exch~0~exch~rlineto~neg~0~rlineto~closepath
+      }
+  }
+\cs_new_protected:Npn \@@_draw_curveto:nnnnnn #1#2#3#4#5#6
+  {
+    \@@_draw_literal:x
+      {
+        \dim_to_decimal_in_bp:n {#1} ~ \dim_to_decimal_in_bp:n {#2} ~
+        \dim_to_decimal_in_bp:n {#3} ~ \dim_to_decimal_in_bp:n {#4} ~
+        \dim_to_decimal_in_bp:n {#5} ~ \dim_to_decimal_in_bp:n {#6} ~
+        curveto
+      }
+ }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \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}
+\cs_new_protected:Npn \@@_draw_evenodd_rule:
+  { \bool_gset_true:N \g_@@_draw_eor_bool }
+\cs_new_protected:Npn \@@_draw_nonzero_rule:
+  { \bool_gset_false:N \g_@@_draw_eor_bool }
+\bool_new:N \g_@@_draw_eor_bool
+%    \end{macrocode}
+% \end{variable}
+% \end{macro}
+%
+% \begin{macro}[int]
+%   {
+%     \@@_draw_closepath:   ,
+%     \@@_draw_stroke:      ,
+%     \@@_draw_closestroke: ,
+%     \@@_draw_fill:        ,
+%     \@@_draw_fillstroke:  ,
+%     \@@_draw_clip:        ,
+%     \@@_draw_discardpath:
+%   }
+% \begin{variable}[aux]{\g_@@_draw_clip_bool}
+%   Unlike PDF, PostScript doesn't track separate colors for strokes and other
+%   elements. It is also desirable to have the |clip| keyword after a stroke or
+%   fill. To achieve those outcomes, there is some work to do. For color, if a
+%   stroke or fill color is defined it is used for the relevant operation, with
+%   a graphic scope inserted as required. That does mean that once such a color
+%   is set all further uses inside the same scope have to use scoping: see also
+%   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}
+\cs_new_protected:Npn \@@_draw_closepath:
+  { \@@_draw_literal:n { closepath } }
+\cs_new_protected:Npn \@@_draw_stroke:
+  {
+    \@@_draw_literal:n { currentdict~/l3sc~known~{gsave~l3sc}~if }
+    \@@_draw_literal:n { stroke }
+    \@@_draw_literal:n { currentdict~/l3sc~known~{grestore}~if }
+    \bool_if:NT \g_@@_draw_clip_bool
+      {
+        \@@_draw_literal:x
+          {
+            \bool_if:NT \g_@@_draw_eor_bool { eo }
+            clip
+          }
+      }
+    \@@_draw_literal:n { newpath }
+    \bool_gset_false:N \g_@@_draw_clip_bool
+  }
+\cs_new_protected:Npn \@@_draw_closestroke:
+  {
+    \@@_draw_closepath:
+    \@@_draw_stroke:
+  }
+\cs_new_protected:Npn \@@_draw_fill:
+  {
+    \@@_draw_literal:n { currentdict~/l3fc~known~{gsave~l3fc}~if }
+    \@@_draw_literal:x
+      {
+        \bool_if:NT \g_@@_draw_eor_bool { eo }
+        fill
+      }
+    \@@_draw_literal:n { currentdict~/l3fc~known~{grestore}~if }
+    \bool_if:NT \g_@@_draw_clip_bool
+      {
+        \@@_draw_literal:x
+          {
+            \bool_if:NT \g_@@_draw_eor_bool { eo }
+            clip
+          }
+      }
+    \@@_draw_literal:n { newpath }
+    \bool_gset_false:N \g_@@_draw_clip_bool
+  }
+\cs_new_protected:Npn \@@_draw_fillstroke:
+  {
+    \@@_draw_literal:n { currentdict~/l3fc~known~{gsave~l3fc}~if }
+    \@@_draw_literal:x
+      {
+        \bool_if:NT \g_@@_draw_eor_bool { eo }
+        fill
+      }
+    \@@_draw_literal:n { currentdict~/l3fc~known~{grestore}~if }
+    \@@_draw_literal:n { currentdict~/l3sc~known~{gsave~l3sc}~if }
+    \@@_draw_literal:n { stroke }
+    \@@_draw_literal:n { currentdict~/l3sc~known~{grestore}~if }
+    \bool_if:NT \g_@@_draw_clip_bool
+      {
+        \@@_draw_literal:x
+          {
+            \bool_if:NT \g_@@_draw_eor_bool { eo }
+            clip
+          }
+      }
+    \@@_draw_literal:n { newpath }
+    \bool_gset_false:N \g_@@_draw_clip_bool
+  }
+\cs_new_protected:Npn \@@_draw_clip:
+  { \bool_gset_true:N \g_@@_draw_clip_bool }
+\bool_new:N \g_@@_draw_clip_bool
+\cs_new_protected:Npn \@@_draw_discardpath:
+  {
+    \bool_if:NT \g_@@_draw_clip_bool
+      {
+        \@@_draw_literal:x
+          {
+            \bool_if:NT \g_@@_draw_eor_bool { eo }
+            clip
+          }
+      }
+    \@@_draw_literal:n { newpath }
+    \bool_gset_false:N \g_@@_draw_clip_bool
+  }
+%    \end{macrocode}
+% \end{variable}
+% \end{macro}
+%
+% \begin{macro}[int]{\@@_draw_dash:nn}
+% \begin{macro}[aux]{\@@_draw_dash:n}
+% \begin{macro}[int]{\@@_draw_linewidth:n}
+% \begin{macro}[int]{\@@_draw_miterlimit:n}
+% \begin{macro}[int]
+%   {
+%     \@@_draw_cap_butt:, \@@_draw_cap_round:, \@@_draw_cap_rectangle:,
+%     \@@_draw_join_miter:, \@@_draw_join_round:, \@@_draw_join_bevel:
+%   }
+%   Converting paths to output is again a case of mapping directly to
+%   PostScript operations.
+%     \begin{macrocode}
+\cs_new_protected:Npn \@@_draw_dash:nn #1#2
+  {
+    \@@_draw_literal:x
+      {
+        [ ~
+          \clist_map_function:nN {#1} \@@_draw_dash:n
+        ] ~
+        \dim_to_decimal_in_bp:n {#2} ~ setdash
+      }
+  }
+\cs_new:Npn \@@_draw_dash:n #1
+  { \dim_to_decimal_in_bp:n {#1} ~ }
+\cs_new_protected:Npn \@@_draw_linewidth:n #1
+  {
+    \@@_draw_literal:x
+      { \dim_to_decimal_in_bp:n {#1} ~ setlinewidth }
+  }
+\cs_new_protected:Npn \@@_draw_miterlimit:n #1
+  { \@@_draw_literal:x { \fp_eval:n {#1} ~ setmiterlimit } }
+\cs_new_protected:Npn \@@_draw_cap_butt:
+  { \@@_draw_literal:n { 0 ~ setlinecap } }
+\cs_new_protected:Npn \@@_draw_cap_round:
+  { \@@_draw_literal:n { 1 ~ setlinecap } }
+\cs_new_protected:Npn \@@_draw_cap_rectangle:
+  { \@@_draw_literal:n { 2 ~ setlinecap } }
+\cs_new_protected:Npn \@@_draw_join_miter:
+  { \@@_draw_literal:n { 0 ~ setlinejoin } }
+\cs_new_protected:Npn \@@_draw_join_round:
+  { \@@_draw_literal:n { 1 ~ setlinejoin } }
+\cs_new_protected:Npn \@@_draw_join_bevel:
+  { \@@_draw_literal:n { 2 ~ setlinejoin } }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[aux]{\_@@_draw_color_reset:}
+% \begin{macro}[int]
+%   {
+%     \@@_draw_color_cmyk:nnnn        ,
+%     \@@_draw_color_cmyk_fill:nnnn   ,
+%     \@@_draw_color_cmyk_stroke:nnnn
+%   }
+% \begin{macro}[int]
+%   {
+%     \@@_draw_color_gray:n        ,
+%     \@@_draw_color_gray_fill:n   ,
+%     \@@_draw_color_gray_stroke:n
+%   }
+% \begin{macro}[int]
+%   {
+%     \@@_draw_color_rgb:nnn        ,
+%     \@@_draw_color_rgb_fill:nnn   ,
+%     \@@_draw_color_rgb_stroke:nnn
+%   }
+%   To allow color to be defined for strokes and fills separately and to
+%   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}
+\cs_new_protected:Npn \@@_draw_color_reset:
+  {
+    \@@_draw_literal:n { currentdic~/l3fc~known~{ /l3fc~ { } ~def }~if }
+    \@@_draw_literal:n { currentdic~/l3sc~known~{ /l3sc~ { } ~def }~if }
+  }
+\cs_new_protected:Npn \@@_draw_color_cmyk:nnnn #1#2#3#4
+  {
+    \@@_draw_literal:x
+      {
+        \fp_eval:n {#1} ~ \fp_eval:n {#2} ~
+        \fp_eval:n {#3} ~ \fp_eval:n {#4} ~
+        setcmykcolor ~
+      }
+    \@@_draw_color_reset:
+  }
+\cs_new_protected:Npn \@@_draw_color_cmyk_fill:nnnn #1#2#3#4
+  {
+    \@@_draw_literal:x
+      {
+        /l3fc ~
+          {
+            \fp_eval:n {#1} ~ \fp_eval:n {#2} ~
+            \fp_eval:n {#3} ~ \fp_eval:n {#4} ~
+            setcmykcolor
+          } ~
+        def
+      }
+  }
+\cs_new_protected:Npn \@@_draw_color_cmyk_stroke:nnnn #1#2#3#4
+  {
+    \__driver_draw_literal:x
+      {
+        /l3sc ~
+          {
+            \fp_eval:n {#1} ~ \fp_eval:n {#2} ~
+            \fp_eval:n {#3} ~ \fp_eval:n {#4} ~
+            setcmykcolor
+          } ~
+        def
+      }
+  }
+\cs_new_protected:Npn \@@_draw_color_gray:n #1
+  {
+    \@@_draw_literal:x { fp_eval:n {#1} ~ setgray  }
+    \@@_draw_color_reset:
+  }
+\cs_new_protected:Npn \@@_draw_color_gray_fill:n #1
+  { \@@_draw_literal:x { /l3fc ~ { \fp_eval:n {#1} ~ setgray } ~ def } }
+\cs_new_protected:Npn \@@_draw_color_gray_stroke:n #1
+  { \@@_draw_literal:x { /l3sc ~ { \fp_eval:n {#1} ~ setgray } ~ def } }
+\cs_new_protected:Npn \@@_draw_color_rgb:nnn #1#2#3
+  {
+    \@@_draw_literal:x
+      {
+        \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} ~
+        setrgbcolor
+      }
+    \@@_draw_color_reset:
+  }
+\cs_new_protected:Npn \@@_draw_color_rgb_fill:nnn #1#2#3
+  {
+    \@@_draw_literal:x
+      {
+        /l3fc ~
+          {
+            \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} ~
+            setrgbcolor
+          } ~
+        def
+      }
+  }
+\cs_new_protected:Npn \@@_draw_color_rgb_stroke:nnn #1#2#3
+  {
+    \@@_draw_literal:x
+      {
+        /l3sc ~
+          {
+            \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} ~
+            setrgbcolor
+          } ~
+        def
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[int]{\@@_draw_transformcm:nnnnnn}
+%   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}
+\cs_new_protected:Npn \@@_draw_transformcm:nnnnnn #1#2#3#4#5#6
+  {
+    \@@_draw_literal:x
+      {
+        [
+          \fp_eval:n {#1} ~ \fp_eval:n {#2} ~
+          \fp_eval:n {#3} ~ \fp_eval:n {#4} ~
+          \dim_to_decimal_in_bp:n {#5} ~ \dim_to_decimal_in_bp:n {#6} ~
+        ] ~
+        concat
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\@@_draw_hbox:Nnnnnnn}
+%   Inside a picture |@beginspecial|/|@endspecial| are active, which is
+%   normally a good thing but means that the position and scaling would be off
+%   if the box was inserted directly. Instead, we need to reverse the effect of
+%   the (normally desirable) shift/scaling within the box. That requires
+%   knowing where the reference point for the drawing is: saved as |l3x|/|l3y|
+%   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}
+\cs_new_protected:Npn \@@_draw_hbox:Nnnnnnn #1#2#3#4#5#6#7
+  {
+    \@@_scope_begin:
+    \tex_special:D { ps::[end] }
+    \@@_draw_transformcm:nnnnnn {#2} {#3} {#4} {#5} {#6} {#7}
+    \tex_special:D { ps::~72~Resolution~div~72~VResolution~div~neg~scale }
+    \tex_special:D { ps::~magscale~{1~DVImag~div~dup~scale}~if }
+    \tex_special:D { ps::~l3x~neg~l3y~neg~translate }
+    \group_begin:
+      \box_set_wd:Nn #1 { 0pt }
+      \box_set_ht:Nn #1 { 0pt }
+      \box_set_dp:Nn #1 { 0pt }
+      \box_use:N #1
+    \group_end:
+    \tex_special:D { ps::[begin] }
+    \@@_scope_end:
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+%    \begin{macrocode}
+%</dvips>
+%    \end{macrocode}
+%
 % \subsection{\texttt{pdfmode} driver}
 %
 %    \begin{macrocode}
@@ -638,58 +1384,6 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \subsubsection{Color}
-%
-% \begin{variable}{\l_@@_color_current_tl}
-%   The current color in driver-dependent format: pick up the package-mode
-%   data if available.
-%    \begin{macrocode}
-\tl_new:N \l_@@_color_current_tl
-\tl_set:Nn \l_@@_color_current_tl { 0~g~0~G }
-%<*package>
-\AtBeginDocument
-  {
-    \@ifpackageloaded { color }
-      { \tl_set:Nn \l_@@_color_current_tl { \current at color } }
-      { }
-  }
-%</package>
-%    \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\l_@@_color_stack_int}
-%   \pdfTeX{} and \LuaTeX{} have multiple stacks available, and to track
-%   which one is in use a variable is required.
-%    \begin{macrocode}
-\int_new:N \l_@@_color_stack_int
-%    \end{macrocode}
-% \end{variable}
-%
-% \begin{macro}[int]{\@@_color_ensure_current:}
-% \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.
-%    \begin{macrocode}
-\cs_new_protected:Npx \@@_color_ensure_current:
-  {
-    \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 \l_@@_color_current_tl }
-    \group_insert_after:N \exp_not:N \@@_color_reset:
-  }
-\cs_new_protected:Npx \@@_color_reset:
-  {
-    \cs_if_exist:NTF \luatex_pdfextension:D
-      { \luatex_pdfextension:D colorstack }
-      { \pdftex_pdfcolorstack:D }
-        \exp_not:N \l_@@_color_stack_int pop \scan_stop:
-  }
-%    \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
 % \subsection{Images}
 %
 % \begin{variable}{\l_@@_image_attr_tl}
@@ -713,27 +1407,31 @@
 %   and vector images but keeping the common parts, there is a little work
 %   to do in terms of auxiliaries. The key here is to notice that we need
 %   two forms of the attributes: a \enquote{short} set to allow us to
-%   track for caching, and the full form to pass to the primitive. Note that
-%   in |pdftex.def| the short reference is stored to be used in the inclusion
-%   stage: may be required when there are more aspects to track.
+%   track for caching, and the full form to pass to the primitive.
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_image_getbb_jpg:n #1
   {
     \int_zero:N \l__image_page_int
+    \tl_clear:N \l__image_pagebox_tl
     \tl_set:Nx \l_@@_image_attr_tl
       {
+        \tl_if_empty:NF \l__image_decode_tl
+          { :D \l__image_decode_tl }
         \bool_if:NT \l__image_interpolate_bool
           { :I }
       }
+    \tl_clear:N \l_@@_image_attr_tl
     \@@_image_getbb_auxi:n {#1}
   }
 \cs_new_eq:NN \@@_image_getbb_png:n \@@_image_getbb_jpg:n
 \cs_new_protected:Npn \@@_image_getbb_pdf:n #1
   {
+    \tl_clear:N \l__image_decode_tl
     \bool_set_false:N \l__image_interpolate_bool
     \tl_set:Nx \l_@@_image_attr_tl
       {
-        \int_compare:nNnT \l__image_page_int > 0
+        : \l__image_pagebox_tl
+        \int_compare:nNnT \l__image_page_int > 1
           { :P \int_use:N \l__image_page_int }
       }
     \@@_image_getbb_auxi:n {#1}
@@ -740,12 +1438,14 @@
   }
 \cs_new_protected:Npn \@@_image_getbb_auxi:n #1
   {
-    \dim_if_exist:cTF { c__image_ #1 \l_@@_image_attr_tl _ht_dim }
+    \dim_zero:N \l__image_llx_dim
+    \dim_zero:N \l__image_lly_dim
+    \dim_if_exist:cTF { c__image_ #1 \l_@@_image_attr_tl _urx_dim }
       {
-        \dim_set_eq:Nc \l__image_ht_dim
-          { c__image_ #1 \l_@@_image_attr_tl _ht_dim }
-        \dim_set_eq:Nc \l__image_wd_dim
-          { c__image_ #1 \l_@@_image_attr_tl _wd_dim }
+        \dim_set_eq:Nc \l__image_urx_dim
+          { c__image_ #1 \l_@@_image_attr_tl _urx_dim }
+        \dim_set_eq:Nc \l__image_ury_dim
+          { c__image_ #1 \l_@@_image_attr_tl _ury_dim }
       }
       { \@@_image_getbb_auxii:n {#1} }
   }
@@ -752,25 +1452,39 @@
 %    \begin{macrocode}
 %   Measuring the image is done by boxing up: for PDF images we could
 %   use |\pdftex_pdfximagebbox:D|, but if doesn't work for other types.
+%   As the box always starts at $(0,0)$ there is no need to worry about
+%   the lower-left position.
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_image_getbb_auxii:n #1
   {
     \tex_immediate:D \pdftex_pdfximage:D
-      \bool_if:NT \l__image_interpolate_bool
-        { attr ~ { /Interpolate~true } }
+      \bool_lazy_or:nnT
+        { \l__image_interpolate_bool }
+        { ! \tl_if_empty_p:N \l__image_decode_tl }
+        {
+          attr ~
+            {
+              \tl_if_empty:NF \l__image_decode_tl
+                { /Decode~[ \l__image_decode_tl ] }
+              \bool_if:NT \l__image_interpolate_bool
+                { /Interpolate~true }
+            }
+        }
       \int_compare:nNnT \l__image_page_int > 0
         { page ~ \int_use:N \l__image_page_int }
+      \tl_if_empty:NF \l__image_pagebox_tl
+        { \l__image_pagebox_tl }
       {#1}
     \hbox_set:Nn \l__image_tmp_box
       { \pdftex_pdfrefximage:D \pdftex_pdflastximage:D }
-    \dim_set:Nn \l__image_ht_dim { \box_ht:N \l__image_tmp_box }
-    \dim_set:Nn \l__image_wd_dim { \box_wd:N \l__image_tmp_box }
+    \dim_set:Nn \l__image_urx_dim { \box_wd:N \l__image_tmp_box }
+    \dim_set:Nn \l__image_ury_dim { \box_ht:N \l__image_tmp_box }
     \int_const:cn { c__image_ #1 \l_@@_image_attr_tl _int }
       { \tex_the:D \pdftex_pdflastximage:D }
-    \dim_const:cn { c__image_ #1 \l_@@_image_attr_tl _ht_dim }
-      { \l__image_ht_dim }
-    \dim_const:cn { c__image_ #1 \l_@@_image_attr_tl _wd_dim }
-      { \l__image_wd_dim }
+    \dim_const:cn { c__image_ #1 \l_@@_image_attr_tl _urx_dim }
+      { \l__image_urx_dim }
+    \dim_const:cn { c__image_ #1 \l_@@_image_attr_tl _ury_dim }
+      { \l__image_ury_dim }
   }
 %    \end{macrocode}
 % \end{macro}
@@ -858,7 +1572,7 @@
 % \begin{macro}[int]{\@@_box_use_rotate:Nn}
 %   Rotating in \texttt{(x)}dvipdmfx can be implemented using either PDF or
 %   driver-specific code. The former approach however is not \enquote{aware}
-%   of the content of boxes: this means that any links embded will not be
+%   of the content of boxes: this means that any embedded links would not be
 %   adjusted by the rotation. As such, the driver-native approach is prefered:
 %   the code therefore is similar (though not identical) to the \texttt{dvips}
 %   version (notice the rotation angle here is positive). As for
@@ -899,39 +1613,6 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \subsubsection{Color}
-%
-% \begin{variable}{\l_@@_color_current_tl}
-%   The current color in driver-dependent format.
-%    \begin{macrocode}
-\tl_new:N \l_@@_color_current_tl
-\tl_set:Nn \l_@@_color_current_tl { [ 0 ] }
-%<*package>
-\AtBeginDocument
-  {
-    \@ifpackageloaded { color }
-      { \tl_set:Nn \l_@@_color_current_tl { \current at color } }
-      { }
-  }
-%</package>
-%    \end{macrocode}
-% \end{variable}
-%
-% \begin{macro}[int]{\@@_color_ensure_current:}
-% \begin{macro}[aux]{\@@_color_reset:}
-%   Directly set the color using the specials with optimisation support.
-%    \begin{macrocode}
-\cs_new_protected:Npn \@@_color_ensure_current:
-  {
-    \tex_special:D { pdf:bcolor~\l_@@_color_current_tl }
-    \group_insert_after:N \@@_color_reset:
-  }
-\cs_new_protected:Npn \@@_color_reset:
-  { \tex_special:D { pdf:ecolor } }
-%    \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
 % \subsection{Images}
 %
 % \begin{macro}[int]
@@ -947,12 +1628,14 @@
 \cs_new_protected:Npn \@@_image_getbb_jpg:n #1
   {
     \int_zero:N \l__image_page_int
+    \tl_clear:N \l__image_pagebox_tl
     \__image_extract_bb:n {#1}
   }
 \cs_new_eq:NN \@@_image_getbb_png:n \@@_image_getbb_jpg:n
 \cs_new_protected:Npn \@@_image_getbb_pdf:n #1
   {
-    \bool_set_false:N \l__image_interpolate_tl
+    \tl_clear:N \l__image_decode_tl
+    \bool_set_false:N \l__image_interpolate_bool
     \__image_extract_bb:n {#1}
   }
 %</dvipdfmx>
@@ -974,7 +1657,10 @@
 %  \begin{macro}[aux]{\@@_image_include_auxi:nn}
 %  \begin{macro}[aux]{\@@_image_include_auxii:nnn, \@@_image_include_auxii:xnn}
 %  \begin{macro}[aux]{\@@_image_include_auxiii:nn}
-%  The special syntax depends on the file type.
+%   The special syntax depends on the file type. There is a difference in
+%   how PDF images are best handled between |dvipdfmx| and |xdvipdfmx|: for
+%   the latter it is better to use the primitive route. The relevant code for
+%   that is included later in this file.
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_image_include_eps:n #1
   {
@@ -982,9 +1668,11 @@
   }
 \cs_new_protected:Npn \@@_image_include_jpg:n #1
   { \@@_image_include_auxi:nn {#1} { image } }
-\cs_new_eq:NN \@@_image_include_png:n \@@_image_include_png:n
+\cs_new_eq:NN \@@_image_include_png:n \@@_image_include_jpg:n
+%<*dvipdfmx>
 \cs_new_protected:Npn \@@_image_include_pdf:n #1
   { \@@_image_include_auxi:nn {#1} { epdf } }
+%</dvipdfmx>
 %    \end{macrocode}
 %   Image inclusion is set up to use the fact that each image is stored in
 %   the PDF as an XObject. This means that we can include repeated images
@@ -995,8 +1683,12 @@
   {
     \@@_image_include_auxii:xnn
       {
-        \int_compare:nNnT \l__image_page_int > 0
+        \tl_if_empty:NF \l__image_pagebox_tl
+          { : \l__image_pagebox_tl }
+        \int_compare:nNnT \l__image_page_int > 1
           { :P \int_use:N \l__image_page_int }
+        \tl_if_empty:NF \l__image_decode_tl
+          { :D \l__image_decode_tl }
         \bool_if:NT \l__image_interpolate_bool
            { :I }
       }
@@ -1012,6 +1704,12 @@
       { \@@_image_include_auxiii:nn {#2} {#1} {#3} }
   }
 \cs_generate_variant:Nn \@@_image_include_auxii:nnn { x }
+%    \end{macrocode}
+%  Inclusion using the specials is relatively straight-forward, but there
+%  is one wrinkle. To get the |pagebox| correct for PDF images in all cases,
+%  it is necessary to provide both that information and the |bbox| argument:
+%  odd things happen otherwise!
+%    \begin{macrocode}
 \cs_new_protected:Npn \@@_image_include_auxiii:nnn #1#2#3
   {
     \int_gincr:N \g_@@_image_int
@@ -1020,11 +1718,29 @@
       {
         pdf:#3~
         @image \int_use:c { c__image_ #1#2 _int }
-        \int_compare:nNnT \l__image_page_int > 0
+        \int_compare:nNnT \l__image_page_int > 1
           { page ~ \int_use:N \l__image_page_int \c_space_tl }
+        \tl_if_empty:NF \l__image_pagebox_tl
+          {
+            pagebox ~ \l__image_pagebox_tl \c_space_tl
+            bbox ~
+              \dim_to_decimal_in_bp:n \l__image_llx_dim \c_space_tl
+              \dim_to_decimal_in_bp:n \l__image_lly_dim \c_space_tl
+              \dim_to_decimal_in_bp:n \l__image_urx_dim \c_space_tl
+              \dim_to_decimal_in_bp:n \l__image_ury_dim \c_space_tl
+          }
         (#1)
-        \bool_if:NT \l__image_interpolate_bool
-          { <</Interpolate~true>> }
+        \bool_lazy_or:nnT
+          { \l__image_interpolate_bool }
+          { ! \tl_if_empty_p:N \l__imge_decode_tl }
+          {
+            <<
+              \tl_if_empty:NF \l__imge_decode_tl
+                { /Decode~[ \l__imge_decode_tl ] }
+              \bool_if:NT \l__image_interpolate_bool
+                { /Interpolate~true> }
+            >>
+          }
       }
   }
 %    \end{macrocode}
@@ -1043,41 +1759,6 @@
 %<*xdvipdfmx>
 %    \end{macrocode}
 %
-% \subsubsection{Color}
-%
-% \begin{macro}[int]{\@@_color_ensure_current:}
-% \begin{macro}[aux]{\@@_color_reset:}
-%   Older \LaTeXe{} drivers uses \texttt{dvips}-like specials so there has to
-%   be a change of set up if \pkg{color} is loaded and if the current color
-%   doesn't match the pattern expected for |dvipdfmx|.
-%    \begin{macrocode}
-%<*package>
-\AtBeginDocument
-  {
-    \@ifpackageloaded { color }
-      {
-        \cs_set_protected:Npn \@@_tmp:w #1 [ #2 ] #3 \q_stop
-          {
-            \tl_if_empty:nT {#2}
-              {
-                \cs_set_protected:Npn \@@_color_ensure_current:
-                  {
-                    \tex_special:D { color~push~\l_@@_color_current_tl }
-                    \group_insert_after:N \@@_color_reset:
-                  }
-                \cs_set_protected:Npn \@@_color_reset:
-                  { \tex_special:D { color~pop } }
-              }
-          }
-        \exp_after:wN \@@_tmp:w \current at color [ ] \q_stop
-      }
-      { }
-  }
-%</package>
-%    \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
 % \subsection{Images}
 %
 % \begin{macro}[int]
@@ -1085,52 +1766,101 @@
 % \begin{macro}[aux]{\@@_image_getbb_auxi:nN}
 % \begin{macro}[aux]{\@@_image_getbb_auxii:nnN, \@@_image_getbb_auxii:VnN}
 % \begin{macro}[aux]{\@@_image_getbb_auxiii:nNnn}
+% \begin{macro}[aux]{\@@_image_getbb_auxiv:nnNnn, \@@_image_getbb_auxiv:VnNnn}
+% \begin{macro}[aux]{\@@_image_getbb_auxv:nNnn, \@@_image_getbb_auxv:nNnn}
+% \begin{macro}[aux, EXP]{\@@_image_getbb_pagebox:w}
 %   For \texttt{xdvipdfmx}, there are two primitives that allow us to obtain
-%   the bounding box without needing \texttt{extractbb}.
+%   the bounding box without needing \texttt{extractbb}. The only complexity
+%   is passing the various minor variations to a common core process. The
+%   \XeTeX{} primitive omits the text |box| from the page box specification,
+%   so there is also some \enquote{trimming} to do here.
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_image_getbb_jpg:n #1
   {
     \int_zero:N \l__image_page_int
+    \tl_clear:N \l__image_pagebox_tl
     \@@_image_getbb_auxi:nN {#1} \xetex_picfile:D
   }
 \cs_new_eq:NN \@@_image_getbb_png:n \@@_image_getbb_jpg:n
 \cs_new_protected:Npn \@@_image_getbb_pdf:n #1
-  { \@@_image_getbb_auxi:nN {#1} \xetex_pdffile:D }
+  {
+    \tl_clear:N \l__image_decode_tl
+    \bool_set_false:N \l__image_interpolate_bool
+    \@@_image_getbb_auxi:nN {#1} \xetex_pdffile:D
+  }
 \cs_new_protected:Npn \@@_image_getbb_auxi:nN #1#2
   {
-    \int_compare:nNnTF \l__image_page_int > 0
+    \int_compare:nNnTF \l__image_page_int > 1
       { \@@_image_getbb_auxii:VnN \l__image_page_int {#1} #2  }
       { \@@_image_getbb_auxiii:nNnn {#1} #2 }
   }
 \cs_new_protected:Npn \@@_image_getbb_auxii:nnN #1#2#3
-  { \@@_image_getbb_auxiii:nNnn {#2} #3 { :P #1 } { page #1 } }
+  { \@@_image_getbb_aux:nNnn {#2} #3 { :P #1 } { page #1 } }
 \cs_generate_variant:Nn \@@_image_getbb_auxii:nnN { V }
 \cs_new_protected:Npn \@@_image_getbb_auxiii:nNnn #1#2#3#4
   {
-    \dim_if_exist:cTF { c__image_ #1#3 _ht_dim }
+    \tl_if_empty:NTF \l__image_pagebox_tl
+      { \@@_image_getbb_auxiv:VnNnn \l__image_pagebox_tl }
+      { \@@_image_getbb_auxv:nNnn }
+      {#1} #2 {#3} {#4}
+  }
+\cs_new_protected:Npn \@@_image_getbb_auxiv:nnNnn #1#2#3#4#5
+  {
+    \use:x
       {
-        \dim_set_eq:Nc \l__image_ht_dim { c__image_ #1#3 _ht_dim }
-        \dim_set_eq:Nc \l__image_wd_dim { c__image_ #1#3 _wd_dim }
+        \@@_image_getbb_auxv:nNnn {#2} #3 { : #1 #4 }
+          { #5 ~ \@@_image_getbb_pagebox:w #1 }
       }
+  }
+\cs_generate_variant:Nn \@@_image_getbb_auxiv:nnNnn { V }
+\cs_new_protected:Npn \@@_image_getbb_auxv:nNnn #1#2#3#4
+  {
+    \dim_zero:N \l__image_llx_dim
+    \dim_zero:N \l__image_lly_dim
+    \dim_if_exist:cTF { c__image_ #1#3 _urx_dim }
+      {
+        \dim_set_eq:Nc \l__image_urx_dim { c__image_ #1#3 _urx_dim }
+        \dim_set_eq:Nc \l__image_ury_dim { c__image_ #1#3 _ury_dim }
+      }
       { \@@_image_getbb_auxvi:nNnn {#1} #2 {#3} {#4} }
   }
 \cs_new_protected:Npn \@@_image_getbb_auxvi:nNnn #1#2#3#4
   {
     \hbox_set:Nn \l__image_tmp_box { #2 #1 ~ #4 }
-    \dim_set:Nn \l__image_ht_dim { \box_ht:N \l__image_tmp_box }
-    \dim_set:Nn \l__image_wd_dim { \box_wd:N \l__image_tmp_box }
-    \dim_const:cn { c__image_ #1#3 _ht_dim }
-      { \l__image_ht_dim }
-    \dim_const:cn { c__image_ #1#3 _wd_dim }
-      { \l__image_wd_dim }
+    \dim_set:Nn \l__image_utx_dim { \box_wd:N \l__image_tmp_box }
+    \dim_set:Nn \l__image_ury_dim { \box_ht:N \l__image_tmp_box }
+    \dim_const:cn { c__image_ #1#3 _urx_dim }
+      { \l__image_urx_dim }
+    \dim_const:cn { c__image_ #1#3 _ury_dim }
+      { \l__image_ury_dim }
   }
+\cs_new:Npn \@@_image_getbb_pagebox:w #1 box {#1}
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
 % \end{macro}
 % \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
 %
+% \begin{macro}[int]{\@@_image_include_pdf:n}
+%   For PDF images, properly supporting the |pagebox| concept in \XeTeX{}
+%   is best done using the |\xetex_pdffile:D| primitive. The syntax here
+%   is the same as for the image measurement part, although we know at this
+%   stage that there must be some valid setting for \cs{l__image_pagebox_tl}.
 %    \begin{macrocode}
+\cs_new_protected:Npn \@@_image_include_pdf:n #1
+  {
+    \xetex_pdffile:D "#1" ~
+      \int_compare:nNnT \l__image_page_int > 0
+        { page~ \int_use:N \l__image_page_int }
+      \@@_image_getbb_auxiv:VnNnn \l__image_pagebox_tl
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+%    \begin{macrocode}
 %</xdvipdfmx>
 %    \end{macrocode}
 %
@@ -1474,616 +2204,6 @@
 %</dvipdfmx|pdfmode|xdvipdfmx>
 %    \end{macrocode}
 %
-% \subsection{\texttt{dvips} driver}
-%
-%    \begin{macrocode}
-%<*dvips>
-%    \end{macrocode}
-%
-% \subsubsection{Basics}
-%
-% \begin{macro}[int]{\@@_literal:n}
-%   In the case of \texttt{dvips} there is no build-in saving of the current
-%   position, and so some additional PostScript is required to set up the
-%   transformation matrix and also to restore it afterwards. Notice the use
-%   of the stack to save the current position \enquote{up front} and to
-%   move back to it at the end of the process.
-%    \begin{macrocode}
-\cs_new_protected:Npn \@@_literal:n #1
-  {
-    \tex_special:D
-      {
-        ps:
-          currentpoint~
-          currentpoint~translate~
-          #1 ~
-          neg~exch~neg~exch~translate
-      }
-  }
-%    \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_scope_begin:, \@@_scope_end:}
-%   Scope saving/restoring is done directly with no need to worry about the
-%   transformation matrix. General scoping is only for the graphics stack so
-%   the lower-cost |gsave|/|grestore| pair are used.
-%    \begin{macrocode}
-\cs_new_protected:Npn \@@_scope_begin:
-  { \tex_special:D { ps:gsave } }
-\cs_new_protected:Npn \@@_scope_end:
-  { \tex_special:D { ps:grestore } }
-%    \end{macrocode}
-% \end{macro}
-%
-% \subsection{Driver-specific auxiliaries}
-%
-% \begin{macro}[int, EXP]{\@@_absolute_lengths:n}
-%   The \texttt{dvips} driver scales all absolute dimensions based
-%   on the output resolution selected and any \TeX{} magnification. Thus
-%   for any operation involving absolute lengths there is a correction to
-%   make. This is based on \texttt{normalscale} from \texttt{special.pro}
-%   but using the stack rather than a definition to save the current matrix.
-%    \begin{macrocode}
-\cs_new:Npn \@@_absolute_lengths:n #1
-  {
-     matrix~currentmatrix~
-     Resolution~72~div~VResolution~72~div~scale~
-     DVImag~dup~scale~
-     #1 ~
-     setmatrix
-  }
-%    \end{macrocode}
-% \end{macro}
-%
-% \subsubsection{Box operations}
-%
-% \begin{macro}{\@@_box_use_clip:N}
-%   Much the same idea as for the PDF mode version but with a slightly
-%   different syntax for creating the clip path. To avoid any scaling
-%   issues we need the absolute length auxiliary here.
-%    \begin{macrocode}
-\cs_new_protected:Npn \@@_box_use_clip:N #1
-  {
-    \@@_scope_begin:
-    \@@_literal:n
-      {
-        \@@_absolute_lengths:n
-          {
-            0 ~
-            \dim_to_decimal_in_bp:n { \box_dp:N #1 } ~
-            \dim_to_decimal_in_bp:n { \box_wd:N #1 } ~
-            \dim_to_decimal_in_bp:n { -\box_ht:N #1 - \box_dp:N #1 } ~
-            rectclip
-          }
-      }
-    \hbox_overlap_right:n { \box_use:N #1 }
-    \@@_scope_end:
-    \skip_horizontal:n { \box_wd:N #1 }
-  }
-%    \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_box_use_rotate:Nn}
-%   Rotating using \texttt{dvips} does not require that the box dimensions
-%   are altered and has a very convenient built-in operation. Zero rotation
-%   must be written as |0| not |-0| so there is a quick test.
-%    \begin{macrocode}
-\cs_new_protected:Npn \@@_box_use_rotate:Nn #1#2
-  {
-    \@@_scope_begin:
-    \@@_literal:n
-      {
-        \fp_compare:nNnTF {#2} = \c_zero_fp
-          { 0 }
-          { \fp_eval:n { round ( -#2 , 5 ) } } ~
-        rotate
-      }
-   \box_use:N #1
-   \@@_scope_end:
-  }
-% \end{macro}
-%
-% \begin{macro}{\@@_box_use_scale:Nnn}
-%   The \texttt{dvips} driver once again has a dedicated operation we can
-%   use here.
-%    \begin{macrocode}
-\cs_new_protected:Npn \@@_box_use_scale:Nnn #1#2#3
-  {
-    \@@_scope_begin:
-    \@@_literal:n
-      {
-        \fp_eval:n { round ( #2 , 5 ) } ~
-        \fp_eval:n { round ( #3 , 5 ) } ~
-        scale
-      }
-    \hbox_overlap_right:n { \box_use:N #1 }
-    \@@_scope_end:
-  }
-%    \end{macrocode}
-% \end{macro}
-%
-% \subsubsection{Color}
-%
-% \begin{variable}{\l_@@_color_current_tl}
-%   The current color in driver-dependent format.
-%    \begin{macrocode}
-\tl_new:N \l_@@_color_current_tl
-\tl_set:Nn \l_@@_color_current_tl { gray~0 }
-%<*package>
-\AtBeginDocument
-  {
-    \@ifpackageloaded { color }
-      { \tl_set:Nn \l_@@_color_current_tl { \current at color } }
-      { }
-  }
-%</package>
-%    \end{macrocode}
-% \end{variable}
-%
-% \begin{macro}[int]{\@@_color_ensure_current:}
-% \begin{macro}[aux]{\@@_color_reset:}
-%   Directly set the color using the specials: no optimisation here.
-%    \begin{macrocode}
-\cs_new_protected:Npn \@@_color_ensure_current:
-  {
-    \tex_special:D { color~push~\l_@@_color_current_tl }
-    \group_insert_after:N \@@_color_reset:
-  }
-\cs_new_protected:Npn \@@_color_reset:
-  { \tex_special:D { color~pop } }
-%    \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \subsection{Images}
-%
-% \begin{macro}[int]{\@@_image_getbb_eps:n}
-%   Simply use the generic function.
-%    \begin{macrocode}
-\cs_new_eq:NN \@@_image_getbb_eps:n \__image_read_bb:n
-%    \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[int]{\@@_image_include_eps:n}
-%  The special syntax is relatively clear here: remember we need PostScript
-%  sizes here.
-%    \begin{macrocode}
-\cs_new_protected:Npn \@@_image_include_eps:n #1
-  {
-    \tex_special:D { PSfile = #1 }
-  }
-%    \end{macrocode}
-% \end{macro}
-%
-% \subsection{Drawing}
-%
-% \begin{macro}[aux]{\@@_draw_literal:n, \@@_draw_literal:x}
-%   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}
-\cs_new_protected:Npn \@@_draw_literal:n #1
-  { \tex_special:D { ps:: ~ #1 } }
-\cs_generate_variant:Nn \@@_draw_literal:n { x }
-%    \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[int]{\@@_draw_begin:, \@@_draw_end:}
-%   The |ps::[begin]| special here deals with positioning but allows us to
-%   continue on to a matching |ps::[end]|: contrast with |ps:|, which positions
-%   but where we can't split material between separate calls. The
-%   |@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}
-\cs_new_protected:Npn \@@_draw_begin:
-  {
-    \tex_special:D { ps::[begin] }
-    \tex_special:D { ps::~save }
-    \tex_special:D { ps::~/l3x~currentpoint~/l3y~exch~def~def }
-    \tex_special:D { ps::~@beginspecial }
-  }
-\cs_new_protected:Npn \@@_draw_end:
-  {
-    \tex_special:D { ps::~@endspecial }
-    \tex_special:D { ps::~restore }
-    \tex_special:D { ps::[end] }
-  }
-%    \end{macrocode}
-% \end{macro}
-%
-% \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}
-\cs_new_protected:Npn \@@_draw_scope_begin:
-  { \@@_draw_literal:n { save } }
-\cs_new_protected:Npn \@@_draw_scope_end:
-  { \@@_draw_literal:n { restore } }
-%    \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[int]{\@@_draw_moveto:nn, \@@_draw_lineto:nn}
-% \begin{macro}[int]{\@@_draw_rectangle:nnnn}
-% \begin{macro}[int]{\@@_draw_curveto:nnnnnn}
-%   Path creation operations mainly resolve directly to PostScript primitive
-%   steps, with 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. 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}
-\cs_new_protected:Npn \@@_draw_moveto:nn #1#2
-  {
-    \@@_draw_literal:x
-      { \dim_to_decimal_in_bp:n {#1} ~ \dim_to_decimal_in_bp:n {#2} ~ moveto }
-  }
-\cs_new_protected:Npn \@@_draw_lineto:nn #1#2
-  {
-    \@@_draw_literal:x
-      { \dim_to_decimal_in_bp:n {#1} ~ \dim_to_decimal_in_bp:n {#2} ~ lineto }
-  }
-\cs_new_protected:Npn \@@_draw_rectangle:nnnn #1#2#3#4
-  {
-     \@@_draw_literal:x
-       {
-         \dim_to_decimal_in_bp:n {#4} ~ \dim_to_decimal_in_bp:n {#3} ~
-         \dim_to_decimal_in_bp:n {#1} ~ \dim_to_decimal_in_bp:n {#2} ~
-         moveto~dup~0~rlineto~exch~0~exch~rlineto~neg~0~rlineto~clospath
-      }
-  }
-\cs_new_protected:Npn \@@_draw_curveto:nnnnnn #1#2#3#4#5#6
-  {
-    \@@_draw_literal:x
-      {
-        \dim_to_decimal_in_bp:n {#1} ~ \dim_to_decimal_in_bp:n {#2} ~
-        \dim_to_decimal_in_bp:n {#3} ~ \dim_to_decimal_in_bp:n {#4} ~
-        \dim_to_decimal_in_bp:n {#5} ~ \dim_to_decimal_in_bp:n {#6} ~
-        curveto
-      }
- }
-%    \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \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}
-\cs_new_protected:Npn \@@_draw_evenodd_rule:
-  { \bool_gset_true:N \g_@@_draw_eor_bool }
-\cs_new_protected:Npn \@@_draw_nonzero_rule:
-  { \bool_gset_false:N \g_@@_draw_eor_bool }
-\bool_new:N \g_@@_draw_eor_bool
-%    \end{macrocode}
-% \end{variable}
-% \end{macro}
-%
-% \begin{macro}[int]
-%   {
-%     \@@_draw_closepath:   ,
-%     \@@_draw_stroke:      ,
-%     \@@_draw_closestroke: ,
-%     \@@_draw_fill:        ,
-%     \@@_draw_fillstroke:  ,
-%     \@@_draw_clip:        ,
-%     \@@_draw_discardpath:
-%   }
-% \begin{variable}[aux]{\g_@@_draw_clip_bool}
-%   Unlike PDF, PostScript doesn't track separate colors for strokes and other
-%   elements. It is also desirable to have the |clip| keyword after a stroke or
-%   fill. To achieve those outcomes, there is some work to do. For color, if a
-%   stroke or fill color is defined it is used for the relevant operation, with
-%   a graphic scope inserted as required. That does mean that once such a color
-%   is set all further uses inside the same scope have to use scoping: see also
-%   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}
-\cs_new_protected:Npn \@@_draw_closepath:
-  { \@@_draw_literal:n { closepath } }
-\cs_new_protected:Npn \@@_draw_stroke:
-  {
-    \@@_draw_literal:n { currentdict~/l3sc~known~{gsave~l3sc}~if }
-    \@@_draw_literal:n { stroke }
-    \@@_draw_literal:n { currentdict~/l3sc~known~{grestore}~if }
-    \bool_if:NT \g_@@_draw_clip_bool
-      {
-        \@@_draw_literal:x
-          {
-            \bool_if:NT \g_@@_draw_eor_bool { eo }
-            clip
-          }
-      }
-    \@@_draw_literal:n { newpath }
-    \bool_gset_false:N \g_@@_draw_clip_bool
-  }
-\cs_new_protected:Npn \@@_draw_closestroke:
-  {
-    \@@_draw_closepath:
-    \@@_draw_stroke:
-  }
-\cs_new_protected:Npn \@@_draw_fill:
-  {
-    \@@_draw_literal:n { currentdict~/l3fc~known~{gsave~l3fc}~if }
-    \@@_draw_literal:x
-      {
-        \bool_if:NT \g_@@_draw_eor_bool { eo }
-        fill
-      }
-    \@@_draw_literal:n { currentdict~/l3fc~known~{grestore}~if }
-    \bool_if:NT \g_@@_draw_clip_bool
-      {
-        \@@_draw_literal:x
-          {
-            \bool_if:NT \g_@@_draw_eor_bool { eo }
-            clip
-          }
-      }
-    \@@_draw_literal:n { newpath }
-    \bool_gset_false:N \g_@@_draw_clip_bool
-  }
-\cs_new_protected:Npn \@@_draw_fillstroke:
-  {
-    \@@_draw_literal:n { currentdict~/l3fc~known~{gsave~l3fc}~if }
-    \@@_draw_literal:x
-      {
-        \bool_if:NT \g_@@_draw_eor_bool { eo }
-        fill
-      }
-    \@@_draw_literal:n { currentdict~/l3fc~known~{grestore}~if }
-    \@@_draw_literal:n { currentdict~/l3sc~known~{gsave~l3sc}~if }
-    \@@_draw_literal:n { stroke }
-    \@@_draw_literal:n { currentdict~/l3sc~known~{grestore}~if }
-    \bool_if:NT \g_@@_draw_clip_bool
-      {
-        \@@_draw_literal:x
-          {
-            \bool_if:NT \g_@@_draw_eor_bool { eo }
-            clip
-          }
-      }
-    \@@_draw_literal:n { newpath }
-    \bool_gset_false:N \g_@@_draw_clip_bool
-  }
-\cs_new_protected:Npn \@@_draw_clip:
-  { \bool_gset_true:N \g_@@_draw_clip_bool }
-\bool_new:N \g_@@_draw_clip_bool
-\cs_new_protected:Npn \@@_draw_discardpath:
-  {
-    \bool_if:NT \g_@@_draw_clip_bool
-      {
-        \@@_draw_literal:x
-          {
-            \bool_if:NT \g_@@_draw_eor_bool { eo }
-            clip
-          }
-      }
-    \@@_draw_literal:n { newpath }
-    \bool_gset_false:N \g_@@_draw_clip_bool
-  }
-%    \end{macrocode}
-% \end{variable}
-% \end{macro}
-%
-% \begin{macro}[int]{\@@_draw_dash:nn}
-% \begin{macro}[aux]{\@@_draw_dash:n}
-% \begin{macro}[int]{\@@_draw_linewidth:n}
-% \begin{macro}[int]{\@@_draw_miterlimit:n}
-% \begin{macro}[int]
-%   {
-%     \@@_draw_cap_butt:, \@@_draw_cap_round:, \@@_draw_cap_rectangle:,
-%     \@@_draw_join_miter:, \@@_draw_join_round:, \@@_draw_join_bevel:
-%   }
-%   Converting paths to output is again a case of mapping directly to
-%   PostScript operations.
-%     \begin{macrocode}
-\cs_new_protected:Npn \@@_draw_dash:nn #1#2
-  {
-    \@@_draw_literal:x
-      {
-        [ ~
-          \clist_map_function:nN {#1} \@@_draw_dash:n
-        ] ~
-        \dim_to_decimal_in_bp:n {#2} ~ setdash
-      }
-  }
-\cs_new:Npn \@@_draw_dash:n #1
-  { \dim_to_decimal_in_bp:n {#1} ~ }
-\cs_new_protected:Npn \@@_draw_linewidth:n #1
-  {
-    \@@_draw_literal:x
-      { \dim_to_decimal_in_bp:n {#1} ~ setlinewidth }
-  }
-\cs_new_protected:Npn \@@_draw_miterlimit:n #1
-  { \@@_draw_literal:x { \fp_eval:n {#1} ~ setmiterlimit } }
-\cs_new_protected:Npn \@@_draw_cap_butt:
-  { \@@_draw_literal:n { 0 ~ setlinecap } }
-\cs_new_protected:Npn \@@_draw_cap_round:
-  { \@@_draw_literal:n { 1 ~ setlinecap } }
-\cs_new_protected:Npn \@@_draw_cap_rectangle:
-  { \@@_draw_literal:n { 2 ~ setlinecap } }
-\cs_new_protected:Npn \@@_draw_join_miter:
-  { \@@_draw_literal:n { 0 ~ setlinejoin } }
-\cs_new_protected:Npn \@@_draw_join_round:
-  { \@@_draw_literal:n { 1 ~ setlinejoin } }
-\cs_new_protected:Npn \@@_draw_join_bevel:
-  { \@@_draw_literal:n { 2 ~ setlinejoin } }
-%    \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}[aux]{\_@@_draw_color_reset:}
-% \begin{macro}[int]
-%   {
-%     \@@_draw_color_cmyk:nnnn        ,
-%     \@@_draw_color_cmyk_fill:nnnn   ,
-%     \@@_draw_color_cmyk_stroke:nnnn
-%   }
-% \begin{macro}[int]
-%   {
-%     \@@_draw_color_gray:n        ,
-%     \@@_draw_color_gray_fill:n   ,
-%     \@@_draw_color_gray_stroke:n
-%   }
-% \begin{macro}[int]
-%   {
-%     \@@_draw_color_rgb:nnn        ,
-%     \@@_draw_color_rgb_fill:nnn   ,
-%     \@@_draw_color_rgb_stroke:nnn
-%   }
-%   To allow color to be defined for strokes and fills separately and to
-%   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}
-\cs_new_protected:Npn \@@_draw_color_reset:
-  {
-    \@@_draw_literal:n { currentdic~/l3fc~known~{ /l3fc~ { } ~def }~if }
-    \@@_draw_literal:n { currentdic~/l3sc~known~{ /l3sc~ { } ~def }~if }
-  }
-\cs_new_protected:Npn \@@_draw_color_cmyk:nnnn #1#2#3#4
-  {
-    \@@_draw_literal:x
-      {
-        \fp_eval:n {#1} ~ \fp_eval:n {#2} ~
-        \fp_eval:n {#3} ~ \fp_eval:n {#4} ~
-        setcmykcolor ~
-      }
-    \@@_draw_color_reset:
-  }
-\cs_new_protected:Npn \@@_draw_color_cmyk_fill:nnnn #1#2#3#4
-  {
-    \@@_draw_literal:x
-      {
-        /l3fc ~
-          {
-            \fp_eval:n {#1} ~ \fp_eval:n {#2} ~
-            \fp_eval:n {#3} ~ \fp_eval:n {#4} ~
-            setcmykcolor
-          } ~
-        def
-      }
-  }
-\cs_new_protected:Npn \@@_draw_color_cmyk_stroke:nnnn #1#2#3#4
-  {
-    \__driver_draw_literal:x
-      {
-        /l3sc ~
-          {
-            \fp_eval:n {#1} ~ \fp_eval:n {#2} ~
-            \fp_eval:n {#3} ~ \fp_eval:n {#4} ~
-            setcmykcolor
-          } ~
-        def
-      }
-  }
-\cs_new_protected:Npn \@@_draw_color_gray:n #1
-  {
-    \@@_draw_literal:x { fp_eval:n {#1} ~ setgray  }
-    \@@_draw_color_reset:
-  }
-\cs_new_protected:Npn \@@_draw_color_gray_fill:n #1
-  { \@@_draw_literal:x { /l3fc ~ { \fp_eval:n {#1} ~ setgray } ~ def } }
-\cs_new_protected:Npn \@@_draw_color_gray_stroke:n #1
-  { \@@_draw_literal:x { /l3sc ~ { \fp_eval:n {#1} ~ setgray } ~ def } }
-\cs_new_protected:Npn \@@_draw_color_rgb:nnn #1#2#3
-  {
-    \@@_draw_literal:x
-      {
-        \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} ~
-        setrgbcolor
-      }
-    \@@_draw_color_reset:
-  }
-\cs_new_protected:Npn \@@_draw_color_rgb_fill:nnn #1#2#3
-  {
-    \@@_draw_literal:x
-      {
-        /l3fc ~
-          {
-            \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} ~
-            setrgbcolor
-          } ~
-        def
-      }
-  }
-\cs_new_protected:Npn \@@_draw_color_rgb_stroke:nnn #1#2#3
-  {
-    \@@_draw_literal:x
-      {
-        /l3sc ~
-          {
-            \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} ~
-            setrgbcolor
-          } ~
-        def
-      }
-  }
-%    \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}[int]{\@@_draw_transformcm:nnnnnn}
-%   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}
-\cs_new_protected:Npn \@@_draw_transformcm:nnnnnn #1#2#3#4#5#6
-  {
-    \@@_draw_literal:x
-      {
-        [
-          \fp_eval:n {#1} ~ \fp_eval:n {#2} ~
-          \fp_eval:n {#3} ~ \fp_eval:n {#4} ~
-          \dim_to_decimal_in_bp:n {#5} ~ \dim_to_decimal_in_bp:n {#6} ~
-        ] ~
-        concat
-      }
-  }
-%    \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[int]{\@@_draw_hbox:Nnnnnnn}
-%   Inside a picture |@beginspecial|/|@endspecial| are active, which is
-%   normally a good thing but means that the position and scaling will be off
-%   if the box is inserted directly. Instead, we need to reverse the effect of
-%   the (normally desirable) shift/scaling within the box. That requires
-%   knowing where the reference point for the drawing is: saved as |l3x|/|l3y|
-%   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}
-\cs_new_protected:Npn \@@_draw_hbox:Nnnnnnn #1#2#3#4#5#6#7
-  {
-    \@@_scope_begin:
-    \tex_special:D { ps::[end] }
-    \@@_draw_transformcm:nnnnnn {#2} {#3} {#4} {#5} {#6} {#7}
-    \tex_special:D { ps::~72~Resolution~div~72~VResolution~div~neg~scale }
-    \tex_special:D { ps::~magscale~{1~DVImag~div~dup~scale}~if }
-    \tex_special:D { ps::~l3x~neg~l3y~neg~translate }
-    \group_begin:
-      \box_set_wd:Nn #1 { 0pt }
-      \box_set_ht:Nn #1 { 0pt }
-      \box_set_dp:Nn #1 { 0pt }
-      \box_use:N #1
-    \group_end:
-    \tex_special:D { ps::[begin] }
-    \@@_scope_end:
-  }
-%    \end{macrocode}
-% \end{macro}
-%
-%    \begin{macrocode}
-%</dvips>
-%    \end{macrocode}
-%
 % \subsection{\texttt{dvisvgm} driver}
 %
 %    \begin{macrocode}
@@ -2253,36 +2373,37 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \subsubsection{Color}
+% \subsection{Images}
 %
-% \begin{variable}{\l_@@_color_current_tl}
-%   The current color in driver-dependent format: the same as for
-%   \texttt{dvips}.
+% \begin{macro}[int]{\@@_image_getbb_png:n, \@@_image_getbb_jpg:n}
+%   These can be included by extracting the bounding box data.
 %    \begin{macrocode}
-\tl_new:N \l_@@_color_current_tl
-\tl_set:Nn \l_@@_color_current_tl { gray~0 }
-%<*package>
-\AtBeginDocument
-  {
-    \@ifpackageloaded { color }
-      { \tl_set:Nn \l_@@_color_current_tl { \current at color } }
-      { }
-  }
-%</package>
+\cs_new_eq:NN \@@_image_getbb_png:n \__image_extract_bb:n
+\cs_new_eq:NN \@@_image_getbb_jpg:n \__image_extract_bb:n
 %    \end{macrocode}
-% \end{variable}
+% \end{macro}
 %
-% \begin{macro}[int]{\@@_color_ensure_current:}
-% \begin{macro}[aux]{\@@_color_reset:}
-%   Directly set the color: same as \texttt{dvips}.
+% \begin{macro}[int]{\@@_image_include_png:n, \@@_image_include_jpg:n}
+% \begin{macro}[aux]{\@@_image_include_bitmap_quote:w}
+%   The driver here has built-in support for basic image inclusion (see
+%   \texttt{dvisvgm.def} for a more complex approach, needed if clipping,
+%   \emph{etc.}, is covered at the image driver level). The only issue is
+%   that |#1| must be quote-corrected. The \texttt{dvisvgm:img} operation
+%   quotes the file name, but if it is already quoted (contains spaces)
+%   then we have an issue: we simply strip off any quotes as a result.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_color_ensure_current:
+\cs_new_protected:Npn \@@_image_include_png:n #1
   {
-    \tex_special:D { color~push~\l_@@_color_current_tl }
-    \group_insert_after:N \@@_color_reset:
+     \tex_special:D
+       {
+         dvisvgm:img~
+         \dim_to_decimal:n { \l__image_ury_dim } ~
+         \dim_to_decimal:n { \l__image_ury_dim } ~
+         \@@_image_include_bitmap_quote:w #1 " " \q_stop
+       }
   }
-\cs_new_protected:Npn \@@_color_reset:
-  { \tex_special:D { color~pop } }
+\cs_new_eq:NN \@@_image_include_jpg:n \@@_image_include_png:n
+\cs_new:Npn \@@_image_include_bitmap_quote:w #1 " #2 " #3 \q_stop { #1#2 }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
@@ -2361,7 +2482,7 @@
 %   Once again, some work is needed to get path constructs correct. Rather
 %   then write the values as they are given, the entire path needs to be
 %   collected up before being output in one go. For that we use a dedicated
-%   storage routine, which will add spaces as required. Since paths should
+%   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}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -68,7 +68,7 @@
 % |\exp_| module.  They all look alike, an example would be
 % \cs{exp_args:NNo}. This function has three arguments, the first and the
 % second are a single tokens, while the third argument should be given
-% in braces. Applying \cs{exp_args:NNo} will expand the content of third
+% in braces. Applying \cs{exp_args:NNo} expands the content of third
 % argument once before any expansion of the first and second arguments.
 % If \cs{seq_gpush:No} was not defined it could be coded in the following way:
 % \begin{verbatim}
@@ -118,24 +118,24 @@
 %   then used to define variants of the
 %   \meta{original argument specifier} where these are not already
 %   defined. For each \meta{variant} given, a function is created
-%   which will expand its arguments as detailed and pass them
+%   which expands its arguments as detailed and passes them
 %   to the \meta{parent control sequence}. So for example
 %   \begin{verbatim}
 %     \cs_set:Npn \foo:Nn #1#2 { code here }
 %     \cs_generate_variant:Nn \foo:Nn { c }
 %   \end{verbatim}
-%   will create a new function |\foo:cn| which will expand its first
-%   argument into a control sequence name and pass the result to
+%   creates a new function |\foo:cn| which expands its first
+%   argument into a control sequence name and passes the result to
 %   |\foo:Nn|. Similarly
 %   \begin{verbatim}
 %     \cs_generate_variant:Nn \foo:Nn { NV , cV }
 %   \end{verbatim}
-%   would generate the functions |\foo:NV| and |\foo:cV| in the same
+%   generates the functions |\foo:NV| and |\foo:cV| in the same
 %   way. The \cs{cs_generate_variant:Nn} function can only be applied if
 %   the \meta{parent control sequence} is already defined. Only |n|~and
 %   |N| arguments can be changed to other types. If the \meta{parent
 %   control sequence} is protected or if the \meta{variant} involves
-%   |x|~arguments, then the \meta{variant control sequence} will also be
+%   |x|~arguments, then the \meta{variant control sequence} is also
 %   protected.  The \meta{variant} is created globally, as is any
 %   \cs[no-index]{exp_args:N\meta{variant}} function needed to carry out the
 %   expansion.
@@ -157,12 +157,12 @@
 %   \item
 %     Arguments that need full expansion (\emph{i.e.}, are denoted
 %     with |x|) should be avoided if possible as they can not be
-%     processed expandably, \emph{i.e.}, functions of this type will
-%     not work correctly in arguments that are themselves subject to |x|
+%     processed expandably, \emph{i.e.}, functions of this type
+%     cannot work correctly in arguments that are themselves subject to |x|
 %     expansion.
 %   \item
 %     In general, unless in the last position, multi-token arguments
-%     |n|, |f|, and |o| will need special processing when more than
+%     |n|, |f|, and |o| need special processing when more than
 %     one argument is being expanded. This special processing is not fast.
 %     Therefore it is best to use the optimized functions, namely
 %     those that contain only |N|, |c|, |V|, and |v|, and, in the last
@@ -206,7 +206,7 @@
 % \begin{quote}
 %   |\example:f { \int_eval:n { 1 + 2 } , \int_eval:n { 3 + 4 } }|
 % \end{quote}
-% will result in the call |\example:n { 3 , \int_eval:n { 3 + 4 } }|
+% results in the call |\example:n { 3 , \int_eval:n { 3 + 4 } }|
 % while using |\example:x| instead results in |\example:n { 3 , 7 }|
 % at the cost of being protected.
 % If you use this type of expansion in conditional processing then
@@ -246,7 +246,7 @@
 %   the \meta{tokens}). The \meta{tokens} are expanded once, and the result
 %   is inserted in braces into the input stream \emph{after} reinsertion
 %   of the \meta{function}. Thus the \meta{function} may take more than
-%   one argument: all others will be left unchanged.
+%   one argument: all others are left unchanged.
 % \end{function}
 %
 % \begin{function}[EXP]{\exp_args:Nc, \exp_args:cc}
@@ -256,10 +256,10 @@
 %   This function absorbs two arguments (the \meta{function} name and
 %   the \meta{tokens}). The \meta{tokens} are expanded until only characters
 %   remain, and are then turned into a control sequence. (An internal error
-%   will occur if such a conversion is not possible). The result
+%   occurs if such a conversion is not possible). The result
 %   is inserted into the input stream \emph{after} reinsertion
 %   of the \meta{function}. Thus the \meta{function} may take more than
-%   one argument: all others will be left unchanged.
+%   one argument: all others are left unchanged.
 %
 %   The |:cc| variant constructs the \meta{function} name in the same
 %   manner as described for the \meta{tokens}.
@@ -273,7 +273,7 @@
 %   the \meta{variable}). The content of the \meta{variable} are recovered
 %   and placed inside braces into the input stream \emph{after} reinsertion
 %   of the \meta{function}. Thus the \meta{function} may take more than
-%   one argument: all others will be left unchanged.
+%   one argument: all others are left unchanged.
 % \end{function}
 %
 % \begin{function}[EXP]{\exp_args:Nv}
@@ -283,12 +283,12 @@
 %   This function absorbs two arguments (the \meta{function} name and
 %   the \meta{tokens}). The \meta{tokens} are expanded until only characters
 %   remain, and are then turned into a control sequence. (An internal error
-%   will occur if such a conversion is not possible). This control sequence
+%   occurs if such a conversion is not possible). This control sequence
 %   should
 %   be the name of a \meta{variable}.   The content of the \meta{variable} are
 %   recovered and placed inside braces into the input stream \emph{after}
 %   reinsertion of the \meta{function}. Thus the \meta{function} may take more
-%   than one argument: all others will be left unchanged.
+%   than one argument: all others are left unchanged.
 % \end{function}
 %
 % \begin{function}[EXP]{\exp_args:Nf}
@@ -300,7 +300,7 @@
 %   first non-expandable token or space is found, and the result
 %   is inserted in braces into the input stream \emph{after} reinsertion
 %   of the \meta{function}. Thus the \meta{function} may take more than
-%   one argument: all others will be left unchanged.
+%   one argument: all others are left unchanged.
 % \end{function}
 %
 % \begin{function}{\exp_args:Nx}
@@ -312,7 +312,7 @@
 %   second. The result is inserted in braces into the input stream
 %   \emph{after} reinsertion of the \meta{function}.
 %   Thus the \meta{function} may take more
-%   than one argument: all others will be left unchanged.
+%   than one argument: all others are left unchanged.
 % \end{function}
 %
 % \section{Manipulating two arguments}
@@ -499,10 +499,8 @@
 %     \cs{exp_after:wN} \meta{token_1} \meta{token_2}
 %   \end{syntax}
 %   Carries out a single expansion of \meta{token_2} (which may consume
-%   arguments) prior to the expansion
-%   of \meta{token_1}. If \meta{token_2} is a \TeX{} primitive, it will
-%   be executed rather than expanded, while if \meta{token_2} has not
-%   expansion (for example, if it is a character) then it will be left
+%   arguments) prior to the expansion of \meta{token_1}. If \meta{token_2} has
+%   no expansion (for example, if it is a character) then it is left
 %   unchanged. It is important to notice that \meta{token_1} may be
 %   \emph{any} single token, including group-opening and -closing
 %   tokens (|{| or |}| assuming normal \TeX{} category codes). Unless
@@ -519,7 +517,7 @@
 %
 % Despite the fact that the following functions are all about preventing
 % expansion, they're designed to be used in an expandable context and hence
-% are all marked as being `expandable' since they themselves will not appear
+% are all marked as being `expandable' since they themselves disappear
 % after the expansion has completed.
 %
 % \begin{function}[EXP]{\exp_not:N}
@@ -599,10 +597,10 @@
 %   \end{syntax}
 %   This function terminates an \texttt{f}-type expansion. Thus if
 %   a function |\foo_bar:f| starts an \texttt{f}-type expansion
-%   and all of \meta{tokens} are expandable \cs{exp_stop_f:} will
-%   terminate the expansion of tokens even if \meta{more tokens}
+%   and all of \meta{tokens} are expandable \cs{exp_stop_f:}
+%   terminates the expansion of tokens even if \meta{more tokens}
 %   are also expandable. The function itself is an implicit space
-%   token. Inside an \texttt{x}-type expansion, it will retain its
+%   token. Inside an \texttt{x}-type expansion, it retains its
 %   form, but when typeset it produces the underlying space (\verb*| |).
 % \end{function}
 %
@@ -619,8 +617,8 @@
 % Of course, deep down \TeX{} is using expansion as always and there
 % are cases where a programmer needs to control that expansion
 % directly; typical situations are basic data manipulation tools. This
-% section documents the functions for that level. You will find these
-% commands used throughout the kernel code, but we hope that outside
+% section documents the functions for that level. These
+% commands are used throughout the kernel code, but we hope that outside
 % the kernel there will be little need to resort to them. Instead the
 % argument manipulation methods document above should usually be sufficient.
 %
@@ -649,7 +647,7 @@
 %   prematurely and as a result \cs{exp_end:} will be misinterpreted
 %   later on.\footnotemark
 %
-%   In typical use cases the \cs{exp_end:} will be  hidden somewhere
+%   In typical use cases the \cs{exp_end:} is hidden somewhere
 %   in the replacement text of \meta{expandable-tokens} rather than
 %   being on the same expansion level than \cs{exp:w}, e.g., you may
 %   see code such as
@@ -672,11 +670,11 @@
 %     \cs{exp:w} \meta{expandable-tokens} \cs{exp_end_continue_f:w} \meta{further-tokens}
 %   \end{syntax}
 %   Expands \meta{expandable-tokens} until reaching \cs{exp_end_continue_f:w} at
-%   which point expansion continues as an f-type expansion expanding
+%   which point expansion continues as an \texttt{f}-type expansion expanding
 %   \meta{further-tokens} until an unexpandable token is encountered (or
-%   the f-type expansion is explicitly terminated by
-%   \cs{exp_stop_f:}). As with all f-type expansions a space ending
-%   the expansion will get removed.
+%   the \texttt{f}-type expansion is explicitly terminated by
+%   \cs{exp_stop_f:}). As with all \texttt{f}-type expansions a space ending
+%   the expansion gets removed.
 %
 %   The full expansion of \meta{expandable-tokens} has to be empty.
 %   If any token in \meta{expandable-tokens} or any token generated by
@@ -701,7 +699,7 @@
 %   \begin{quote}
 %     \cs{exp:w} \meta{expandable-tokens} \cs{exp_end:}
 %   \end{quote}
-%   can be alternatively achieved through an f-type expansion by using
+%   can be alternatively achieved through an \texttt{f}-type expansion by using
 %   \cs{exp_stop_f:}, i.e.
 %   \begin{quote}
 %     \cs{exp:w} \cs{exp_end_continue_f:w} \meta{expandable-tokens} \cs{exp_stop_f:}
@@ -728,7 +726,7 @@
 %   \meta{further-tokens} starts with a brace group then the braces
 %   are removed. If on the other hand it starts with space tokens then
 %   these space tokens are removed while searching for the
-%   argument. Thus such space tokens will not terminate the f-type expansion.
+%   argument. Thus such space tokens will not terminate the \texttt{f}-type expansion.
 % \end{function}
 %
 % \section{Internal functions and variables}
@@ -808,7 +806,7 @@
 %   argument manipulations and |#3| is the current result of the
 %   expansion chain.  This auxiliary function moves |#1| back after
 %   |#3| in the input stream and checks if any expansion is left to
-%   be done by calling |#2|. In by far the most cases we will require
+%   be done by calling |#2|. In by far the most cases we need
 %   to add a set of braces to the result of an argument manipulation
 %   so it is more effective to do it directly here. Actually, so far
 %   only the |c| of the final argument manipulation variants does not
@@ -916,7 +914,7 @@
 %   expects a single token whereas |v| like |c| creates a csname from
 %   its argument given in braces and then evaluates it as if it was a
 %   |V|. The \cs{exp:w} sets off an expansion
-%   similar to an |f| type expansion, which we will terminate using
+%   similar to an |f|-type expansion, which we terminate using
 %   \cs{exp_end:}. The argument is returned in braces.
 %    \begin{macrocode}
 \cs_new:Npn \::V #1 \::: #2#3
@@ -942,12 +940,12 @@
 %   register such as |\count|. For the \TeX{} registers we have to
 %   utilize a \tn{the} whereas for the macros we merely have to
 %   expand them once. The trick is to find out when to use
-%   \tn{the} and when not to. What we do here is try to find out
-%   whether the token will expand to something else when hit with
+%   \tn{the} and when not to. What we want here is to find out
+%   whether the token expands to something else when hit with
 %   \cs{exp_after:wN}. The technique is to compare the meaning of the
-%   register in question when it has been prefixed with \cs{exp_not:N}
-%   and the register itself. If it is a macro, the prefixed
-%   \cs{exp_not:N} will temporarily turn it into the primitive
+%   token in question when it has been prefixed with \cs{exp_not:N}
+%   and the token itself. If it is a macro, the prefixed
+%   \cs{exp_not:N} temporarily turns it into the primitive
 %   \cs{scan_stop:}.
 %    \begin{macrocode}
 \cs_new:Npn \@@_eval_register:N #1
@@ -1419,7 +1417,7 @@
 %    \end{macrocode}
 %    So to stop the expansion sequence in a controlled way all we need
 %    to provide is a constant integer zero as part of expanded tokens. As this is
-%    an integer constant it will immediately stop
+%    an integer constant it immediately stops
 %    \cs{tex_romannumerl:D}'s search for a number.
 %    \begin{macrocode}
 %\int_const:Nn \exp_end: { 0 }
@@ -1431,10 +1429,10 @@
 %    generated. Or if we do then the programmer made a mistake.)
 %
 %    If on the other hand we want to stop the initial expansion
-%    sequence but continue with an f-type expansion we provide the
+%    sequence but continue with an \texttt{f}-type expansion we provide the
 %    alphabetic constant |`^^@| that also represents |0| but this time
-%    \TeX's syntax for a \meta{number} will continue searching for an
-%    optional space (and it will continue expansion doing that) ---
+%    \TeX's syntax for a \meta{number} continues searching for an
+%    optional space (and it continues expansion doing that) ---
 %    see \TeX{}book page~269 for details.
 %    \begin{macrocode}
 \tex_catcode:D `\^^@=13
@@ -1612,7 +1610,7 @@
 %       signature} \cs{q_mark} \meta{errors} \cs{q_stop} \meta{base
 %       function} \meta{new function}.  If all went well, \meta{errors}
 %     is empty; otherwise, it is a kernel error message, followed by
-%     some clean-up code (\cs{use_none:nnnn}).
+%     some clean-up code (\cs{use_none:nnn}).
 %
 %     Note the space after |#3| and after the following brace group.
 %     Those are ignored by \TeX{} when fetching the last argument for
@@ -1737,7 +1735,7 @@
         \q_mark
         \__msg_kernel_error:nnxx { kernel } { variant-too-long }
           {#5} { \token_to_str:N #3 }
-        \use_none:nnnn
+        \use_none:nnn
         \q_stop
         #3
         #3
@@ -1752,7 +1750,7 @@
         \q_mark
         \__msg_kernel_error:nnxxxx { kernel } { invalid-variant }
           {#7} { \token_to_str:N #5 } {#1} {#2}
-        \use_none:nnnn
+        \use_none:nnn
         \q_stop
         #5
         #5
@@ -1783,17 +1781,30 @@
 % \end{macro}
 %
 % \begin{macro}[aux]{\@@_generate_variant:wwNN}
-%   If the variant form has already been defined, log its existence.
+%   If the variant form has already been defined, log its existence
+%   (provided \texttt{log-functions} is active).
 %   Otherwise, make sure that the |\exp_args:N #3| form is defined, and
 %   if it contains |x|, change \cs{@@_tmp:w} locally to
 %   \cs{cs_new_protected:Npx}.  Then define the variant by
 %   combining the |\exp_args:N #3| variant and the base function.
 %    \begin{macrocode}
+\__debug_patch:nnNw
+  {
+    \cs_if_free:NF #4
+      {
+        \__debug_log:x
+          {
+            Variant~\token_to_str:N #4~%
+            already~defined;~ not~ changing~ it~ \msg_line_context:
+          }
+      }
+  }
+  { }
 \cs_new_protected:Npn \@@_generate_variant:wwNN
     #1 \q_mark #2 \q_stop #3#4
   {
     #2
-    \cs_if_free:NTF #4
+    \cs_if_free:NT #4
       {
         \group_begin:
           \@@_generate_internal_variant:n {#1}
@@ -1800,13 +1811,6 @@
           \@@_tmp:w #4 { \exp_not:c { exp_args:N #1 } \exp_not:N #3 }
         \group_end:
       }
-      {
-        \__chk_log:x
-          {
-            Variant~\token_to_str:N #4~%
-            already~defined;~ not~ changing~ it~ \msg_line_context:
-          }
-      }
   }
 %    \end{macrocode}
 % \end{macro}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -23,7 +23,8 @@
 %<*driver>
 \documentclass[full]{l3doc}
 \begin{document}
-  \DocInput{\jobname.dtx}
+\DocInput{\jobname.dtx}
+\PrintIndex
 \end{document}
 %</driver>
 % \fi
@@ -41,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -52,8 +53,8 @@
 % others are used to work with files on a line by line basis and have prefix
 % \cs[no-index]{ior_\ldots} (reading) or \cs[no-index]{iow_\ldots} (writing).
 %
-% It is important to remember that when reading external files \TeX{} will
-% attempt to locate them both the operating system path and entries in the
+% It is important to remember that when reading external files \TeX{}
+% attempts to locate them 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.
@@ -60,22 +61,48 @@
 %
 % 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.  Any active characters (as
-% declared in \cs{l_char_active_seq}) will \emph{not} be expanded,
-% allowing the direct use of these in file names. File names will be quoted
+% full expansion be the desired file name.  Active characters (as
+% declared in \cs{l_char_active_seq}) are \emph{not} be 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.
 %
 % \section{File operation functions}
 %
-% \begin{variable}{\g_file_current_name_tl}
-%   Contains the name of the current \LaTeX{} file. This variable
-%   should not be modified: it is intended for information only. It
-%   will be equal to \cs{c_sys_jobname_str} at the start of a \LaTeX{}
-%   run and will be modified each time a file is read using
-%   \cs{file_input:n}.
+% \begin{variable}[added = 2017-06-21]
+%   {
+%     \g_file_curr_dir_str,
+%     \g_file_curr_name_str,
+%     \g_file_curr_ext_str
+%   }
+%   Contain the directory, name and extension of the current file. The
+%   directory is empty if the file was loaded without an explicit
+%   path (\emph{i.e.}~if it is in the \TeX{} search path), and does
+%   \emph{not} end in |/| other than the case that it is exactly equal
+%   to the root directory. The \meta{name} and \meta{ext} parts together
+%   make up the file name, thus the \meta{name} part may be thought of
+%   as the \enquote{job name} for the current file. Note that \TeX{} does
+%   not provide information on the \meta{ext} part for the main (top
+%   level) file and that this file always has an empty \meta{dir} component.
+%   Also, the \meta{name} here will be equal to \cs{c_sys_jobname_str},
+%   which may be different from the real file name (if set using
+%   |--jobname|, for example).
 % \end{variable}
 %
+% \begin{variable}[added = 2017-06-18]{\l_file_search_path_seq}
+%   Each entry is the path to a directory which should be searched when
+%   seeking a file. Each path can be relative or absolute, and should
+%   not include the trailing slash. The entries are not expanded when
+%   used so may contain active characters but should not feature any
+%   variable content. Spaces need not be quoted.
+%
+%   \begin{texnote}
+%     When working as a package in \LaTeXe{}, \pkg{expl3} will
+%     automatically append the current \tn{input at path} to the
+%     set of values from \cs{l_file_search_path_seq}.
+%   \end{texnote}
+% \end{variable}
+%
 % \begin{function}[TF, updated = 2012-02-10]{\file_if_exist:n}
 %   \begin{syntax}
 %     \cs{file_if_exist:nTF} \Arg{file name} \Arg{true code} \Arg{false code}
@@ -82,22 +109,49 @@
 %   \end{syntax}
 %   Searches for \meta{file name} using the current \TeX{} search
 %   path and the additional paths controlled by
-%   \cs{file_path_include:n}).
+%   \cs{l_file_search_path_seq}.
 % \end{function}
 %
-% \begin{function}[updated = 2012-02-10]{\file_add_path:nN}
+% \begin{function}[updated = 2017-06-26]
+%   {\file_get_full_name:nN, \file_get_full_name:VN}
 %   \begin{syntax}
-%     \cs{file_add_path:nN} \Arg{file name} \meta{tl var}
+%     \cs{file_get_full_name:nN} \Arg{file name} \meta{str var}
 %   \end{syntax}
 %   Searches for \meta{file name} in the path as detailed for
-%   \cs{file_if_exist:nTF}, and if found sets the \meta{tl var} the
+%   \cs{file_if_exist:nTF}, and if found sets the \meta{str var} the
 %   fully-qualified name of the file, \emph{i.e.}~the path and file name.
-%   If the file is not found then the \meta{tl var} will contain the
-%   marker \cs{q_no_value}.
+%   This includes an extension |.tex| when the given \meta{file name}
+%   has no extension but the file found has that extension.
+%   If the file is not found then the \meta{str var} is empty.
 % \end{function}
 %
-% \begin{function}[updated = 2012-02-17]{\file_input:n}
+% \begin{function}[added = 2017-06-23, updated = 2017-06-26]
+%   {\file_parse_full_name:nNNN}
 %   \begin{syntax}
+%     \cs{file_parse_full_name:nNNN} \Arg{full name} \meta{dir} \meta{name} \meta{ext}
+%   \end{syntax}
+%   Parses the \meta{full name} and splits it into three parts, each of
+%   which is returned by setting the appropriate local string variable:
+%   \begin{itemize}
+%     \item The \meta{dir}: everything up to the last |/| (path separator)
+%       in the \meta{file path}. As with system \texttt{PATH} variables
+%       and related functions, the \meta{dir} does \emph{not} include the
+%       trailing |/| unless it points to the root directory. If there is no path (only
+%       a file name), \meta{dir} is empty.
+%     \item The \meta{name}: everything after the last |/| up to the last |.|,
+%       where both of those characters are optional. The \meta{name} may
+%       contain multiple |.| characters. It is empty if \meta{full name}
+%       consists only of a directory name.
+%     \item The \meta{ext}: everything after the last |.| (including the dot).
+%       The \meta{ext} is empty if there is no |.| after the last |/|.
+%   \end{itemize}
+%   This function does not expand the \meta{full name} before turning it
+%   to a string.  It assume that the \meta{full name} either contains no
+%   quote (|"|) characters or is surrounded by a pair of quotes.
+% \end{function}
+%
+% \begin{function}[updated = 2017-06-26]{\file_input:n}
+%   \begin{syntax}
 %     \cs{file_input:n} \Arg{file name}
 %   \end{syntax}
 %   Searches for \meta{file name} in the path as detailed for
@@ -104,42 +158,23 @@
 %   \cs{file_if_exist:nTF}, and if found reads in the file as
 %   additional \LaTeX{} source. All files read are recorded
 %   for information and the file name stack is updated by this
-%   function. An error will be raised if the file is not found.
+%   function. An error is raised if the file is not found.
 % \end{function}
 %
-% \begin{function}[updated = 2012-07-04]{\file_path_include:n}
+% \begin{function}{\file_show_list:, \file_log_list:}
 %   \begin{syntax}
-%     \cs{file_path_include:n} \Arg{path}
+%     \cs{file_show_list:}
+%     \cs{file_log_list:}
 %   \end{syntax}
-%   Adds \meta{path} to the list of those used to search when reading
-%   files. The assignment is local.
-%   The \meta{path} is processed in the same way as a \meta{file name},
-%   \emph{i.e.}, with \texttt{x}-type expansion except active
-%   characters.
+%   These functions list all files loaded by \LaTeXe{} commands that
+%   populate \tn{@filelist} or by \cs{file_input:n}.  While
+%   \cs{file_show_list:} displays the list in the terminal,
+%   \cs{file_log_list:} outputs it to the log file only.
 % \end{function}
 %
-% \begin{function}[updated = 2012-07-04]{\file_path_remove:n}
-%   \begin{syntax}
-%     \cs{file_path_remove:n} \Arg{path}
-%   \end{syntax}
-%   Removes \meta{path} from the list of those used to search when reading
-%   files. The assignment is local.
-%   The \meta{path} is processed in the same way as a \meta{file name},
-%   \emph{i.e.}, with \texttt{x}-type expansion except active
-%   characters.
-% \end{function}
-%
-% \begin{function}{\file_list:}
-%   \begin{syntax}
-%     \cs{file_list:}
-%   \end{syntax}
-%   This function will list all files loaded using \cs{file_input:n}
-%   in the log file.
-% \end{function}
-%
 % \subsection{Input--output stream management}
 %
-% As \TeX{} is limited to $16$ input streams and $16$ output streams, direct
+% As \TeX{} engines have a limited number of input and output streams, direct
 % use of the streams by the programmer is not supported in \LaTeX3. Instead, an
 % internal pool of streams is maintained, and these are allocated and
 % deallocated as needed by other modules. As a result, the programmer should
@@ -172,6 +207,7 @@
 %   \meta{stream} is available for access immediately and will remain
 %   allocated to \meta{file name} until a \cs{ior_close:N} instruction
 %   is given or the \TeX{} run ends.
+%   If the file is not found, an error is raised.
 % \end{function}
 %
 % \begin{function}[added = 2013-01-12, TF]{\ior_open:Nn, \ior_open:cn}
@@ -197,7 +233,7 @@
 %   open it is closed before the new operation begins. The
 %   \meta{stream} is available for access immediately and will remain
 %   allocated to \meta{file name} until a \cs{iow_close:N} instruction
-%   is given or the \TeX{} run ends. Opening a file for writing will clear
+%   is given or the \TeX{} run ends. Opening a file for writing clears
 %   any existing content in the file (\emph{i.e.}~writing is \emph{not}
 %   additive).
 % \end{function}
@@ -213,13 +249,20 @@
 %   to other programmers.
 % \end{function}
 %
-% \begin{function}[updated = 2015-08-01]{\ior_list_streams:, \iow_list_streams:}
+% \begin{function}[added = 2017-06-27]
+%   {
+%     \ior_show_list:, \ior_log_list:,
+%     \iow_show_list:, \iow_log_list:
+%   }
 %   \begin{syntax}
-%     \cs{ior_list_streams:}
-%     \cs{iow_list_streams:}
+%     \cs{ior_show_list:}
+%     \cs{ior_log_list:}
+%     \cs{iow_show_list:}
+%     \cs{iow_log_list:}
 %   \end{syntax}
-%   Displays a list of the file names associated with each open
-%   stream: intended for tracking down problems.
+%   Display (to the terminal or log file) a list of the file names
+%   associated with each open (read or write) stream.  This is intended
+%   for tracking down problems.
 % \end{function}
 %
 % \subsection{Reading from files}
@@ -232,15 +275,15 @@
 %   and right braces are found) from the input \meta{stream} and stores
 %   the result locally in the \meta{token list} variable. If the
 %   \meta{stream} is not open, input is requested from the terminal.
-%   The material read from the \meta{stream} will be tokenized by \TeX{}
+%   The material read from the \meta{stream} is tokenized by \TeX{}
 %   according to the category codes and \tn{endlinechar} in force when
 %   the function is used.  Assuming normal settings, any lines which do
-%   not end in a comment character~|%| will have the line ending
+%   not end in a comment character~|%| have the line ending
 %   converted to a space, so for example input
 %   \begin{verbatim}
 %      a b  c
 %   \end{verbatim}
-%   will result in a token list \verb*|a b c |.  Any blank line is
+%   results in a token list \verb*|a b c |.  Any blank line is
 %   converted to the token \cs{par}. Therefore, blank lines can be
 %   skipped by using a test such as
 %   \begin{verbatim}
@@ -273,15 +316,15 @@
 %   The material is read from the \meta{stream} as a series of tokens with
 %   category code $12$ (other), with the exception of space
 %   characters which are given category code $10$ (space).
-%   Multiple whitespace characters are retained by this process.  It will
-%   always only read one line and any blank lines in the input
-%   will result in the \meta{token list variable} being empty. Unlike
+%   Multiple whitespace characters are retained by this process.  It
+%   always only reads one line and any blank lines in the input
+%   result in the \meta{token list variable} being empty. Unlike
 %   \cs{ior_get:NN}, line ends do not receive any special treatment. Thus
 %   input
 %   \begin{verbatim}
 %      a b  c
 %   \end{verbatim}
-%   will result in a token list |a b  c| with the letters |a|, |b|, and |c|
+%   results in a token list |a b  c| with the letters |a|, |b|, and |c|
 %   having category code~12.
 %   \begin{texnote}
 %     This protected macro is a wrapper around the \eTeX{} primitive
@@ -299,8 +342,8 @@
 %   Applies the \meta{inline function} to each set of \meta{lines}
 %   obtained by calling \cs{ior_get:NN} until reaching the end of the
 %   file.  \TeX{} ignores any trailing new-line marker from the file it
-%   reads.  The \meta{inline function} should consist of code which will
-%   receive the \meta{line} as |#1|.
+%   reads.  The \meta{inline function} should consist of code which
+%   receives the \meta{line} as |#1|.
 % \end{function}
 %
 % \begin{function}[added = 2012-02-11]{\ior_str_map_inline:Nn}
@@ -312,7 +355,7 @@
 %   as a series of tokens with category code $12$ (other), with the
 %   exception of space characters which are given category code $10$
 %   (space). The \meta{inline function} should consist of code which
-%   will receive the \meta{line} as |#1|.
+%   receives the \meta{line} as |#1|.
 %   Note that \TeX{} removes trailing space and tab characters
 %   (character codes 32 and 9) from every line upon input.  \TeX{} also
 %   ignores any trailing new-line marker from the file it reads.
@@ -323,8 +366,8 @@
 %     \cs{ior_map_break:}
 %   \end{syntax}
 %   Used to terminate a \cs[no-index]{ior_map_\ldots} function before all
-%   lines from the \meta{stream} have been processed. This will
-%   normally take place within a conditional statement, for example
+%   lines from the \meta{stream} have been processed. This
+%   normally takes place within a conditional statement, for example
 %   \begin{verbatim}
 %     \ior_map_inline:Nn \l_my_ior
 %       {
@@ -335,12 +378,12 @@
 %           }
 %       }
 %   \end{verbatim}
-%   Use outside of a \cs[no-index]{ior_map_\ldots} scenario will lead to low
+%   Use outside of a \cs[no-index]{ior_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 further items are taken
-%     from the input stream. This will depend on the design of the mapping
+%     from the input stream. This depends on the design of the mapping
 %     function.
 %   \end{texnote}
 % \end{function}
@@ -351,8 +394,8 @@
 %   \end{syntax}
 %   Used to terminate a \cs[no-index]{ior_map_\ldots} function before all
 %   lines in the \meta{stream} have been processed, inserting
-%   the \meta{tokens} after the mapping has ended. This will
-%   normally take place within a conditional statement, for example
+%   the \meta{tokens} after the mapping has ended. This
+%   normally takes place within a conditional statement, for example
 %   \begin{verbatim}
 %     \ior_map_inline:Nn \l_my_ior
 %       {
@@ -363,13 +406,13 @@
 %           }
 %       }
 %   \end{verbatim}
-%   Use outside of a \cs[no-index]{ior_map_\ldots} scenario will lead to low
+%   Use outside of a \cs[no-index]{ior_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 will depend on the design of the mapping function.
+%     This depends on the design of the mapping function.
 %   \end{texnote}
 % \end{function}
 %
@@ -379,7 +422,7 @@
 %    \cs{ior_if_eof:NTF} \meta{stream} \Arg{true code} \Arg{false code}
 %  \end{syntax}
 %  Tests if the end of a \meta{stream} has been reached during a reading
-%  operation. The test will also return a \texttt{true} value if
+%  operation. The test also returns a \texttt{true} value if
 %  the \meta{stream} is not open.
 %\end{function}
 %
@@ -410,7 +453,11 @@
 %   file immediately: it is a dedicated version of \cs{iow_now:Nn}.
 % \end{function}
 %
-% \begin{function}{\iow_shipout:Nn, \iow_shipout:Nx, \iow_shipout:cn, \iow_shipout:cx}
+% \begin{function}
+%   {
+%     \iow_shipout:Nn, \iow_shipout:Nx,
+%     \iow_shipout:cn, \iow_shipout:cx
+%   }
 %   \begin{syntax}
 %     \cs{iow_shipout:Nn} \meta{stream} \Arg{tokens}
 %   \end{syntax}
@@ -423,13 +470,17 @@
 %   \begin{texnote}
 %     When using \pkg{expl3} with a format other than \LaTeX{}, new line
 %     characters inserted using \cs{iow_newline:} or using the
-%     line-wrapping code \cs{iow_wrap:nnnN} will not be recognized in
+%     line-wrapping code \cs{iow_wrap:nnnN} are not recognized in
 %     the argument of \cs{iow_shipout:Nn}.  This may lead to the
-%     insertion of additionnal unwanted line-breaks.
+%     insertion of additional unwanted line-breaks.
 %   \end{texnote}
 % \end{function}
 %
-% \begin{function}[updated = 2012-09-08]{\iow_shipout_x:Nn, \iow_shipout_x:Nx, \iow_shipout_x:cn, \iow_shipout_x:cx}
+% \begin{function}[updated = 2012-09-08]
+%   {
+%     \iow_shipout_x:Nn, \iow_shipout_x:Nx,
+%     \iow_shipout_x:cn, \iow_shipout_x:cx
+%   }
 %   \begin{syntax}
 %     \cs{iow_shipout_x:Nn} \meta{stream} \Arg{tokens}
 %   \end{syntax}
@@ -443,9 +494,9 @@
 %     This is a wrapper around the \TeX{} primitive \tn{write}.
 %     When using \pkg{expl3} with a format other than \LaTeX{}, new line
 %     characters inserted using \cs{iow_newline:} or using the
-%     line-wrapping code \cs{iow_wrap:nnnN} will not be recognized in
+%     line-wrapping code \cs{iow_wrap:nnnN} are not recognized in
 %     the argument of \cs{iow_shipout:Nn}.  This may lead to the
-%     insertion of additionnal unwanted line-breaks.
+%     insertion of additional unwanted line-breaks.
 %   \end{texnote}
 % \end{function}
 %
@@ -472,8 +523,8 @@
 %   expansion (\emph{e.g.}~in the second argument of \cs{iow_now:Nn}).
 %   \begin{texnote}
 %     When using \pkg{expl3} with a format other than \LaTeX{}, the
-%     character inserted by \cs{iow_newline:} will not be recognized by
-%     \TeX{}, which may lead to the insertion of additionnal unwanted
+%     character inserted by \cs{iow_newline:} is not recognized by
+%     \TeX{}, which may lead to the insertion of additional unwanted
 %     line-breaks.  This issue only affects \cs{iow_shipout:Nn},
 %     \cs{iow_shipout_x:Nn} and direct uses of primitive operations.
 %   \end{texnote}
@@ -485,10 +536,10 @@
 %   \begin{syntax}
 %     \cs{iow_wrap:nnnN} \Arg{text} \Arg{run-on text} \Arg{set up} \meta{function}
 %   \end{syntax}
-%   This function will wrap the \meta{text} to a fixed number of
+%   This function wraps the \meta{text} to a fixed number of
 %   characters per line. At the start of each line which is wrapped,
-%   the \meta{run-on text} will be inserted.  The line character count
-%   targeted will be the value of \cs{l_iow_line_count_int} minus the
+%   the \meta{run-on text} is inserted.  The line character count
+%   targeted is the value of \cs{l_iow_line_count_int} minus the
 %   number of characters in the \meta{run-on text} for all lines except
 %   the first, for which the target number of characters is simply
 %   \cs{l_iow_line_count_int} since there is no run-on text.  The
@@ -512,12 +563,12 @@
 %   \cs{tl_to_str:n}, \cs{tl_to_str:N}, \emph{etc.}
 %
 %   The result of the wrapping operation is passed as a braced argument to the
-%   \meta{function}, which will typically be a wrapper around a write
+%   \meta{function}, which is typically a wrapper around a write
 %   operation. The output of \cs{iow_wrap:nnnN} (\emph{i.e.}~the argument
-%   passed to the \meta{function}) will consist of characters of category
+%   passed to the \meta{function}) consists of characters of category
 %   \enquote{other} (category code~12), with the exception of spaces which
-%   will have category \enquote{space} (category code~10). This means that the
-%   output will \emph{not} expand further when written to a file.
+%   have category \enquote{space} (category code~10). This means that the
+%   output does \emph{not} expand further when written to a file.
 %
 %   \begin{texnote}
 %     Internally, \cs{iow_wrap:nnnN} carries out an \texttt{x}-type expansion
@@ -534,7 +585,7 @@
 %     \cs{iow_indent:n} \Arg{text}
 %   \end{syntax}
 %   In the first argument of \cs{iow_wrap:nnnN} (for instance in messages),
-%   indents \meta{text} by four spaces. This function will not cause
+%   indents \meta{text} by four spaces. This function does not cause
 %   a line break, and only affects lines which start within the scope
 %   of the \meta{text}. In case the indented \meta{text} should appear
 %   on separate lines from the surrounding text, use |\\| to force
@@ -558,7 +609,7 @@
 %
 % \begin{variable}{\c_term_ior}
 %   Constant input stream for reading from the terminal. Reading from this
-%   stream using \cs{ior_get:NN} or similar will result in a prompt from
+%   stream using \cs{ior_get:NN} or similar results in a prompt from
 %   \TeX{} of the form
 %   \begin{verbatim}
 %     <tl>=
@@ -593,25 +644,41 @@
 %   Used to test for the existence of files when opening.
 % \end{variable}
 %
-% \begin{variable}{\l__file_internal_name_tl}
-%   Used to return the full name of a file for internal use. This is
-%   set by \cs{file_if_exist:nTF} and \cs{__file_if_exist:nT}, and
-%   the value may then be used to load a file directly provided no
-%   further operations intervene.
+% \begin{variable}{\l__file_base_name_str, \l__file_full_name_str}
+%   Used to store and transfer the file name (including extension)
+%   and (partial) file path whilst reading files. (The file base is the
+%   base name plus any preceding directory name.)
 % \end{variable}
 %
-% \begin{function}[added = 2012-02-09]{\__file_name_sanitize:nn}
+% \begin{function}[added = 2017-06-25]{\__file_missing:n}
 %   \begin{syntax}
-%     \cs{__file_name_sanitize:nn} \Arg{name} \Arg{tokens}
+%     \cs{__file_missing:n} \Arg{name}
 %   \end{syntax}
+%   Expands the \meta{name} as per \cs{__file_name_sanitize:nN} then
+%   produces an error message indicating that that file was not found.
+% \end{function}
+%
+% \begin{function}[added = 2017-06-19]{\__file_name_sanitize:nN}
+%   \begin{syntax}
+%     \cs{__file_name_sanitize:nN} \Arg{name} \meta{str var}
+%   \end{syntax}
 %   Exhaustively-expands the \meta{name} with the exception of any
 %   category \meta{active} (catcode~$13$) tokens, which are not expanded.
 %   The list of \meta{active} tokens is taken from \cs{l_char_active_seq}.
-%   The \meta{sanitized name} is then inserted (in braces) after the
-%   \meta{tokens}, which should further process the file name. If any
-%   spaces are found in the name after expansion, an error is raised.
+%   The \meta{str var} is then set to the \meta{sanitized name}.
 % \end{function}
 %
+% \begin{function}[added = 2017-06-19, updated = 2017-06-25]
+%   {\__file_name_quote:nN}
+%   \begin{syntax}
+%     \cs{__file_name_quote:nN} \Arg{name} \meta{str var}
+%   \end{syntax}
+%   Expands the \meta{name} (without special-casing active tokens), then
+%   sets the \meta{str var} to the \meta{name} quoted using |"| at each
+%   end if required by the presence of spaces in the \meta{name}. Any existing
+%   |"| tokens is removed and if their number is odd an error is raised.
+% \end{function}
+%
 % \subsection{Internal input--output functions}
 %
 % \begin{function}[added = 2012-01-23]{\__ior_open:Nn, \__ior_open:No}
@@ -625,7 +692,7 @@
 %   higher-level
 %   functions which have already fully expanded the \meta{file name} and which
 %   need to perform multiple open or close operations. See for example the
-%   implementation of \cs{file_add_path:nN},
+%   implementation of \cs{file_get_full_name:nN},
 % \end{function}
 %
 % \begin{function}[added = 2014-08-23]{\__iow_with:Nnn}
@@ -659,31 +726,64 @@
 %
 % \subsection{File operations}
 %
-% \begin{variable}{\g_file_current_name_tl}
+% \begin{variable}
+%   {
+%     \g_file_curr_dir_str ,
+%     \g_file_curr_ext_str ,
+%     \g_file_curr_name_str
+%   }
 %   The name of the current file should be available at all times.
 %   For the format the file name needs to be picked up at the start of the
-%   file. In \LaTeXe{} package mode the current file name is collected from
+%   run. In \LaTeXe{} package mode the current file name is collected from
 %   \tn{@currname}.
 %    \begin{macrocode}
-\tl_new:N \g_file_current_name_tl
+\str_new:N \g_file_curr_dir_str
+\str_new:N \g_file_curr_ext_str
+\str_new:N \g_file_curr_name_str
 %<*initex>
 \tex_everyjob:D \exp_after:wN
   {
     \tex_the:D \tex_everyjob:D
-    \tl_gset:Nx \g_file_current_name_tl { \tex_jobname:D }
+    \str_gset:Nx \g_file_curr_name_str { \tex_jobname:D }
   }
 %</initex>
 %<*package>
 \cs_if_exist:NT \@currname
-  { \tl_gset_eq:NN \g_file_current_name_tl \@currname }
+  { \str_gset_eq:NN \g_file_curr_name_str \@currname }
 %</package>
 %    \end{macrocode}
 % \end{variable}
 %
 % \begin{variable}{\g_@@_stack_seq}
-%   The input list of files is stored as a sequence stack.
+%   The input list of files is stored as a sequence stack. In package
+%   mode we can recover the information from the details held by
+%   \LaTeXe{} (we must be in the preamble and loaded using \tn{usepackage}
+%   or \tn{RequirePackage}). As \LaTeXe{} doesn't store directory and
+%   name separately, we stick to the same convention here.
 %    \begin{macrocode}
 \seq_new:N \g_@@_stack_seq
+%<*package>
+\group_begin:
+  \cs_set_protected:Npn \@@_tmp:w #1#2#3
+    {
+      \tl_if_blank:nTF {#1}
+        {
+          \cs_set:Npn \@@_tmp:w ##1 " ##2 " ##3 \q_stop { { } {##2} {  } }
+          \seq_gput_right:Nx \g_@@_stack_seq
+            {
+              \exp_after:wN \@@_tmp:w \tex_jobname:D
+                " \tex_jobname:D " \q_stop
+            }
+        }
+        {
+          \seq_gput_right:Nn \g_@@_stack_seq { { } {#1} {#2} }
+          \@@_tmp:w
+        }
+    }
+  \cs_if_exist:NT \@currnamestack
+    { \exp_after:wN \@@_tmp:w \@currnamestack }
+\group_end:
+%</package>
 %    \end{macrocode}
 % \end{variable}
 %
@@ -699,53 +799,55 @@
 \tex_everyjob:D \exp_after:wN
   {
     \tex_the:D \tex_everyjob:D
-    \seq_gput_right:NV \g_@@_record_seq \g_file_current_name_tl
+    \seq_gput_right:NV \g_@@_record_seq \g_file_curr_name_str
   }
 %</initex>
 %    \end{macrocode}
 % \end{variable}
 %
-% \begin{variable}{\l_@@_internal_tl}
-%   Used as a short-term scratch variable.  It may be possible to reuse
-%   \cs{l_@@_internal_name_tl} there.
+% \begin{variable}{\l_@@_tmp_tl}
+%   Used as a short-term scratch variable.
 %    \begin{macrocode}
-\tl_new:N \l_@@_internal_tl
+\tl_new:N \l_@@_tmp_tl
 %    \end{macrocode}
 % \end{variable}
 %
-% \begin{variable}{\l_@@_internal_name_tl}
-%   Used to return the fully-qualified name of a file.
+% \begin{variable}{\l__file_base_name_str, \l__file_full_name_str}
+%   For storing the basename and full path whilst passing data internally.
 %    \begin{macrocode}
-\tl_new:N \l_@@_internal_name_tl
+\str_new:N \l__file_base_name_str
+\str_new:N \l__file_full_name_str
 %    \end{macrocode}
 % \end{variable}
 %
-% \begin{variable}{\l_@@_search_path_seq}
-%   The current search path.
+% \begin{variable}{\l_@@_dir_str, \l_@@_ext_str, \l_@@_name_str}
+%   Used in parsing a path into parts: in contrast to the above, these are
+%   never used outside of the current module.
 %    \begin{macrocode}
-\seq_new:N \l_@@_search_path_seq
+\str_new:N \l_@@_dir_str
+\str_new:N \l_@@_ext_str
+\str_new:N \l_@@_name_str
 %    \end{macrocode}
 % \end{variable}
 %
-% \begin{variable}{\l_@@_saved_search_path_seq}
-%   The current search path has to be saved for package use.
+% \begin{variable}{\l_file_search_path_seq}
+%   The current search path.
 %    \begin{macrocode}
-%<*package>
-\seq_new:N \l_@@_saved_search_path_seq
-%</package>
+\seq_new:N \l_file_search_path_seq
 %    \end{macrocode}
 % \end{variable}
 %
-% \begin{variable}{\l_@@_internal_seq}
+% \begin{variable}{\l_@@_tmp_seq}
 %   Scratch space for comma list conversion in package mode.
 %    \begin{macrocode}
 %<*package>
-\seq_new:N \l_@@_internal_seq
+\seq_new:N \l_@@_tmp_seq
 %</package>
 %    \end{macrocode}
 % \end{variable}
 %
-% \begin{macro}[int]{\@@_name_sanitize:nn}
+% \begin{macro}[int]{\__file_name_sanitize:nN}
+% \begin{macro}[int]{\__file_name_quote:nN}
 % \begin{macro}[int, aux]{\@@_name_sanitize_aux:n}
 %   For converting a token list to a string where active characters are treated
 %   as strings from the start. The logic to the quoting normalisation is the
@@ -753,101 +855,91 @@
 %   assuming they balance strip all of them out before quoting the entire name
 %   if it contains spaces.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_name_sanitize:nn #1#2
+\cs_new_protected:Npn \__file_name_sanitize:nN #1#2
   {
     \group_begin:
       \seq_map_inline:Nn \l_char_active_seq
         {
-          \tl_set:Nx \l_@@_internal_tl { \iow_char:N ##1 }
-          \char_set_active_eq:NN ##1 \l_@@_internal_tl
+          \tl_set:Nx \l_@@_tmp_tl { \iow_char:N ##1 }
+          \char_set_active_eq:NN ##1 \l_@@_tmp_tl
         }
-      \tl_set:Nx \l_@@_internal_name_tl {#1}
-      \tl_set:Nx \l_@@_internal_name_tl
-        { \tl_to_str:N \l_@@_internal_name_tl }
-      \int_compare:nNnTF
-        {
-          \int_mod:nn
-            {
-              0 \tl_map_function:NN \l_@@_internal_name_tl
-                \@@_name_sanitize_aux:n
-            }
-            { 2 }
-        }
-        = 0
-        {
-          \tl_remove_all:Nn \l_@@_internal_name_tl { " }
-          \tl_if_in:NnT \l_@@_internal_name_tl { ~ }
-            {
-              \tl_set:Nx \l_@@_internal_name_tl
-                { " \exp_not:V \l_@@_internal_name_tl " }
-            }
-        }
-        {
-          \__msg_kernel_error:nnx
-            { kernel } { unbalanced-quote-in-filename }
-            { \l_@@_internal_name_tl }
-        }
-      \use:x
-        {
-          \group_end:
-          \exp_not:n {#2} { \l_@@_internal_name_tl }
-        }
+      \tl_set:Nx \l_@@_tmp_tl {#1}
+      \tl_set:Nx \l_@@_tmp_tl
+        { \tl_to_str:N \l_@@_tmp_tl }
+    \exp_args:NNNV \group_end:
+    \str_set:Nn #2 \l_@@_tmp_tl
   }
-\cs_new:Npn \@@_name_sanitize_aux:n #1
+\cs_new_protected:Npn \__file_name_quote:nN #1#2
+  {
+    \str_set:Nx #2 {#1}
+    \int_if_even:nF
+      { 0 \tl_map_function:NN #2 \@@_name_quote_aux:n }
+      {
+        \__msg_kernel_error:nnx
+          { kernel } { unbalanced-quote-in-filename } {#2}
+      }
+    \tl_remove_all:Nn #2 { " }
+    \tl_if_in:NnT #2 { ~ }
+      { \str_set:Nx #2 { " \exp_not:V #2 " } }
+  }
+\cs_new:Npn \@@_name_quote_aux:n #1
   { \token_if_eq_charcode:NNT #1 " { + 1 } }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
+% \end{macro}
 %
-% \begin{macro}{\file_add_path:nN}
-% \begin{macro}[aux]{\@@_add_path:nN, \@@_add_path_search:nN}
-%   The way to test if a file exists is to try to open it: if it does not
-%   exist then \TeX{} will report end-of-file. For files which are in the
-%   current directory, this is straight-forward.  For other locations, a
-%   search has to be made looking at each potential path in turn. The first
-%   location is of course treated as the correct one. If nothing is found,
-%   |#2| is returned empty.
+% \begin{macro}{\file_get_full_name:nN, \file_get_full_name:VN}
+% \begin{macro}[aux]{\@@_get_full_name_search:nN}
+%   The way to test if a file exists is to try to open it: if it does
+%   not exist then \TeX{} reports end-of-file. A search is made
+%   looking at each potential path in turn (starting from the current
+%   directory). The first location is of course treated as the correct
+%   one: this is done by jumping to \cs{__prg_break_point:}. If nothing
+%   is found, |#2| is returned empty. A special case when there is no
+%   extension is that once the first location is found we test the
+%   existence of the file with |.tex| extension in that directory, and
+%   if it exists we include the |.tex| extension in the result.
 %    \begin{macrocode}
-\cs_new_protected:Npn \file_add_path:nN #1
-  { \@@_name_sanitize:nn {#1} { \@@_add_path:nN } }
-\cs_new_protected:Npn \@@_add_path:nN #1#2
+\cs_new_protected:Npn \file_get_full_name:nN #1#2
   {
-    \__ior_open:Nn \g_@@_internal_ior {#1}
-    \ior_if_eof:NTF \g_@@_internal_ior
-      { \@@_add_path_search:nN {#1} #2 }
-      { \tl_set:Nn #2 {#1} }
-    \ior_close:N \g_@@_internal_ior
-  }
-\cs_new_protected:Npn \@@_add_path_search:nN #1#2
-  {
-    \tl_set:Nn #2 { \q_no_value  }
+    \__file_name_sanitize:nN {#1} \l__file_base_name_str
+    \@@_get_full_name_search:nN { } \use:n
+    \seq_map_inline:Nn \l_file_search_path_seq
+      { \@@_get_full_name_search:nN { ##1 / } \seq_map_break:n }
 %<*package>
     \cs_if_exist:NT \input at path
       {
-        \seq_set_eq:NN \l_@@_saved_search_path_seq
-          \l_@@_search_path_seq
-        \seq_set_split:NnV \l_@@_internal_seq { , } \input at path
-        \seq_concat:NNN \l_@@_search_path_seq
-          \l_@@_search_path_seq \l_@@_internal_seq
+        \tl_map_inline:Nn \input at path
+          { \@@_get_full_name_search:nN { ##1 } \tl_map_break:n }
       }
 %</package>
-    \seq_map_inline:Nn \l_@@_search_path_seq
+    \str_clear:N \l__file_full_name_str
+    \__prg_break_point:
+    \str_if_empty:NF \l__file_full_name_str
       {
-        \__ior_open:Nn \g_@@_internal_ior { ##1 #1 }
-        \ior_if_eof:NF \g_@@_internal_ior
+        \exp_args:NV \file_parse_full_name:nNNN \l__file_full_name_str
+          \l_@@_dir_str \l_@@_name_str \l_@@_ext_str
+        \str_if_empty:NT \l_@@_ext_str
           {
-            \tl_set:Nx #2 { ##1 #1 }
-            \seq_map_break:
+            \__ior_open:No \g_@@_internal_ior
+              { \l__file_full_name_str .tex }
+            \ior_if_eof:NF \g_@@_internal_ior
+              { \str_put_right:Nn \l__file_full_name_str { .tex } }
           }
       }
-%<*package>
-    \cs_if_exist:NT \input at path
-      {
-        \seq_set_eq:NN \l_@@_search_path_seq
-          \l_@@_saved_search_path_seq
-      }
-%</package>
+    \str_set_eq:NN #2 \l__file_full_name_str
+    \ior_close:N \g_@@_internal_ior
   }
+\cs_generate_variant:Nn \file_get_full_name:nN { V }
+\cs_new_protected:Npn \@@_get_full_name_search:nN #1#2
+  {
+    \__file_name_quote:nN
+      { \tl_to_str:n {#1} \l__file_base_name_str }
+      \l__file_full_name_str
+    \__ior_open:No \g_@@_internal_ior \l__file_full_name_str
+    \ior_if_eof:NF \g_@@_internal_ior { #2 { \__prg_break: } }
+  }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
@@ -854,14 +946,14 @@
 %
 % \begin{macro}[TF]{\file_if_exist:n}
 %   The test for the existence of a file is a wrapper around the function to
-%   add a path to a file. If the file was found, the path will contain
+%   add a path to a file. If the file was found, the path contains
 %   something, whereas if the file was not located then the return value
-%   will be \cs{q_no_value}.
+%   is empty.
 %    \begin{macrocode}
 \prg_new_protected_conditional:Npnn \file_if_exist:n #1 { T , F , TF }
   {
-    \file_add_path:nN {#1} \l_@@_internal_name_tl
-    \quark_if_no_value:NTF \l_@@_internal_name_tl
+    \file_get_full_name:nN {#1} \l__file_full_name_str
+    \str_if_empty:NTF \l__file_full_name_str
       { \prg_return_false: }
       { \prg_return_true: }
   }
@@ -868,10 +960,23 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}[int]{\__file_missing:n}
+%   An error message for a missing file, also used in \cs{ior_open:Nn}.
+%    \begin{macrocode}
+\cs_new_protected:Npn \__file_missing:n #1
+  {
+    \__file_name_sanitize:nN {#1} \l__file_base_name_str
+    \__msg_kernel_error:nnx { kernel } { file-not-found }
+      { \l__file_base_name_str }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
 % \begin{macro}{\file_input:n}
-% \begin{macro}[int]{\@@_if_exist:nT}
 % \begin{macro}[aux]{\@@_input:n, \@@_input:V}
-% \begin{macro}[aux]{\@@_input_aux:n, \@@_input_aux:o}
+% \begin{macro}[aux]{\@@_input_push:n}
+% \begin{macro}[aux]{\@@_input_pop:}
+% \begin{macro}[aux]{\@@_input_pop:nnn}
 %   Loading a file is done in a safe way, checking first that the file
 %   exists and loading only if it does.  Push the file name on the
 %   \cs{g_@@_stack_seq}, and add it to the file list, either
@@ -879,31 +984,13 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \file_input:n #1
   {
-    \@@_if_exist:nT {#1}
-      { \@@_input:V \l_@@_internal_name_tl }
+    \file_get_full_name:nN {#1} \l__file_full_name_str
+    \str_if_empty:NTF \l__file_full_name_str
+      { \__file_missing:n {#1} }
+      { \@@_input:V \l__file_full_name_str }
   }
-%    \end{macrocode}
-%   This code is spun out as a separate function to encapsulate the
-%   error message into a easy-to-reuse form.
-%    \begin{macrocode}
-\cs_new_protected:Npn \@@_if_exist:nT #1#2
-  {
-    \file_if_exist:nTF {#1}
-      {#2}
-      {
-        \@@_name_sanitize:nn {#1}
-          { \__msg_kernel_error:nnx { kernel } { file-not-found } }
-      }
-  }
 \cs_new_protected:Npn \@@_input:n #1
   {
-    \tl_if_in:nnTF {#1} { . }
-      { \@@_input_aux:n {#1} }
-      { \@@_input_aux:o { \tl_to_str:n { #1 . tex } } }
-  }
-\cs_generate_variant:Nn \@@_input:n { V }
-\cs_new_protected:Npn \@@_input_aux:n #1
-  {
 %<*initex>
     \seq_gput_right:Nn \g_@@_record_seq {#1}
 %</initex>
@@ -912,68 +999,140 @@
       { \@addtofilelist {#1} }
       { \seq_gput_right:Nn \g_@@_record_seq {#1} }
 %</package>
-    \seq_gpush:No \g_@@_stack_seq \g_file_current_name_tl
-    \tl_gset:Nn \g_file_current_name_tl {#1}
+    \@@_input_push:n {#1}
     \tex_input:D #1 \c_space_tl
-    \seq_gpop:NN \g_@@_stack_seq \l_@@_internal_tl
-    \tl_gset_eq:NN \g_file_current_name_tl \l_@@_internal_tl
+    \@@_input_pop:
   }
-\cs_generate_variant:Nn \@@_input_aux:n { o }
+\cs_generate_variant:Nn \@@_input:n { V }
 %    \end{macrocode}
+%   Keeping a track of the file data is easy enough: we store the separated
+%   parts so we do not need to parse them twice.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_input_push:n #1
+  {
+    \seq_gpush:Nx \g_@@_stack_seq
+      {
+        { \g_file_curr_dir_str }
+        { \g_file_curr_name_str }
+        { \g_file_curr_ext_str }
+      }
+    \file_parse_full_name:nNNN {#1}
+      \l_@@_dir_str \l_@@_name_str \l_@@_ext_str
+    \str_gset_eq:NN \g_file_curr_dir_str  \l_@@_dir_str
+    \str_gset_eq:NN \g_file_curr_name_str \l_@@_name_str
+    \str_gset_eq:NN \g_file_curr_ext_str  \l_@@_ext_str
+  }
+\cs_new_protected:Npn \@@_input_pop:
+  {
+    \seq_gpop:NN \g_@@_stack_seq \l_@@_tmp_tl
+    \exp_after:wN \@@_input_pop:nnn \l_@@_tmp_tl
+  }
+\cs_new_protected:Npn \@@_input_pop:nnn #1#2#3
+  {
+    \str_gset:Nn \g_file_curr_dir_str  {#1}
+    \str_gset:Nn \g_file_curr_name_str {#2}
+    \str_gset:Nn \g_file_curr_ext_str  {#3}
+  }
+%    \end{macrocode}
 % \end{macro}
 % \end{macro}
 % \end{macro}
 % \end{macro}
+% \end{macro}
 %
-% \begin{macro}{\file_path_include:n}
-% \begin{macro}{\file_path_remove:n}
-% \begin{macro}[aux]{\@@_path_include:n}
-%   Wrapper functions to manage the search path.
+% \begin{macro}{\file_parse_full_name:nNNN}
+% \begin{macro}[aux]
+%   {\@@_parse_full_name_auxi:w, \@@_parse_full_name_split:nNNNTF}
+%   Parsing starts by stripping off any surrounding quotes.  Then find
+%   the directory |#4| by splitting at the last~|/|.  (The auxiliary
+%   returns \texttt{true}/\texttt{false} depending on whether it found
+%   the delimiter.)  We correct for the case of a file in the root |/|,
+%   as in that case we wish to keep the trailing (and only) slash.  Then
+%   split the base name |#5| at the last dot.  If there was indeed a
+%   dot, |#5| contains the name and |#6| the extension without the dot,
+%   which we add back for convenience.  In the special case of no
+%   extension given, the auxiliary stored the name into |#6|, we just
+%   have to move it to |#5|.
 %    \begin{macrocode}
-\cs_new_protected:Npn \file_path_include:n #1
-  { \@@_name_sanitize:nn {#1} { \@@_path_include:n } }
-\cs_new_protected:Npn \@@_path_include:n #1
+\cs_new_protected:Npn \file_parse_full_name:nNNN #1#2#3#4
   {
-    \seq_if_in:NnF \l_@@_search_path_seq {#1}
-      { \seq_put_right:Nn \l_@@_search_path_seq {#1} }
+    \exp_after:wN \@@_parse_full_name_auxi:w
+      \tl_to_str:n { #1 " #1 " } \q_stop #2#3#4
   }
-\cs_new_protected:Npn \file_path_remove:n #1
+\cs_new_protected:Npn \@@_parse_full_name_auxi:w #1 " #2 " #3 \q_stop #4#5#6
   {
-    \@@_name_sanitize:nn {#1}
-      { \seq_remove_all:Nn \l_@@_search_path_seq }
+    \@@_parse_full_name_split:nNNNTF {#2} / #4 #5
+      { \str_if_empty:NT #4 { \str_set:Nn #4 { / } } }
+      { }
+    \exp_args:No \@@_parse_full_name_split:nNNNTF {#5} . #5 #6
+      { \str_put_left:Nn #6 { . } }
+      {
+        \str_set_eq:NN #5 #6
+        \str_clear:N #6
+      }
   }
+\cs_new_protected:Npn \@@_parse_full_name_split:nNNNTF #1#2#3#4
+  {
+    \cs_set_protected:Npn \@@_tmp:w ##1 ##2 #2 ##3 \q_stop
+      {
+        \tl_if_empty:nTF {##3}
+          {
+            \str_set:Nn #4 {##2}
+            \tl_if_empty:nTF {##1}
+              {
+                \str_clear:N #3
+                \use_ii:nn
+              }
+              {
+                \str_set:Nx #3 { \str_tail:n {##1} }
+                \use_i:nn
+              }
+          }
+          { \@@_tmp:w { ##1 #2 ##2 } ##3 \q_stop }
+      }
+    \@@_tmp:w { } #1 #2 \q_stop
+  }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
-% \end{macro}
 %
-% \begin{macro}{\file_list:}
+% \begin{macro}{\file_show_list:, \file_log_list:}
+% \begin{macro}[aux, EXP]{\@@_list_aux:n}
 %   A function to list all files used to the log, without duplicates.
 %   In package mode, if \cs{@filelist} is still defined, we need to take
-%   this list of file names into account
-%   (we capture it \cs{AtBeginDocument} into
-%   \cs{g_@@_record_seq}), turning each file name into a string.
+%   this list of file names into account (we capture it
+%   \cs{AtBeginDocument} into \cs{g_@@_record_seq}), turning it to a
+%   string (this does not affect the commas of this comma list).  The
+%   message system is a bit finnicky (it can only display results that
+%   start with |>~| and end with a dot) so that constrains the possible
+%   markup.  The advantage is that we get terminal and log outputs for
+%   free.
 %    \begin{macrocode}
-\cs_new_protected:Npn \file_list:
+\cs_new_protected:Npn \file_show_list:
   {
-    \seq_set_eq:NN \l_@@_internal_seq \g_@@_record_seq
+    \seq_clear:N \l_@@_tmp_seq
 %<*package>
     \clist_if_exist:NT \@filelist
       {
-        \clist_map_inline:Nn \@filelist
-          {
-            \seq_put_right:No \l_@@_internal_seq
-              { \tl_to_str:n {##1} }
-          }
+        \exp_args:NNx \seq_set_from_clist:Nn \l_@@_tmp_seq
+          { \tl_to_str:N \@filelist }
       }
 %</package>
-    \seq_remove_duplicates:N \l_@@_internal_seq
-    \iow_log:n { *~File~List~* }
-    \seq_map_inline:Nn \l_@@_internal_seq { \iow_log:n {##1} }
-    \iow_log:n { ************* }
+    \seq_concat:NNN \l_@@_tmp_seq \l_@@_tmp_seq \g_@@_record_seq
+    \seq_remove_duplicates:N \l_@@_tmp_seq
+    \__msg_show_wrap:n
+      {
+        >~File~List~< \\
+        \seq_map_function:NN \l_@@_tmp_seq \@@_list_aux:n
+        ............
+      }
   }
+\cs_new:Npn \@@_list_aux:n #1 { #1 \\ }
+\cs_new_protected:Npn \file_log_list:
+  { \__msg_log_next: \file_show_list: }
 %    \end{macrocode}
 % \end{macro}
+% \end{macro}
 %
 % When used as a package, there is a need to hold onto the standard file
 % list as well as the new one here.  File names recorded in
@@ -983,8 +1142,9 @@
 %<*package>
 \AtBeginDocument
   {
-    \clist_map_inline:Nn \@filelist
-      { \seq_gput_right:No \g_@@_record_seq { \tl_to_str:n {#1} } }
+    \exp_args:NNx \seq_set_from_clist:Nn \l_@@_tmp_seq
+      { \tl_to_str:N \@filelist }
+    \seq_gconcat:NNN \g_@@_record_seq \g_@@_record_seq \l_@@_tmp_seq
   }
 %</package>
 %    \end{macrocode}
@@ -1070,50 +1230,35 @@
 % \end{macro}
 %
 % \begin{macro}{\ior_open:Nn, \ior_open:cn}
-% \begin{macro}[aux]{\@@_open_aux:Nn}
-%   Opening an input stream requires a bit of pre-processing. The file name
-%   is sanitized to deal with active characters, before an auxiliary adds a
-%   path and checks that the file really exists. If those two tests pass, then
-%   pass the information on to the lower-level function which deals with
-%   streams.
+%   Use the conditional version, with an error if the file is not found.
 %    \begin{macrocode}
 \cs_new_protected:Npn \ior_open:Nn #1#2
-  { \__file_name_sanitize:nn {#2} { \@@_open_aux:Nn #1 } }
+  { \ior_open:NnF #1 {#2} { \__file_missing:n {#2} } }
 \cs_generate_variant:Nn \ior_open:Nn { c }
-\cs_new_protected:Npn \@@_open_aux:Nn #1#2
-  {
-    \file_add_path:nN {#2} \l__file_internal_name_tl
-    \quark_if_no_value:NTF \l__file_internal_name_tl
-      { \__msg_kernel_error:nnx { kernel } { file-not-found } {#2} }
-      { \@@_open:No #1 \l__file_internal_name_tl }
-  }
 %    \end{macrocode}
 % \end{macro}
-% \end{macro}
 %
 % \begin{macro}[TF]{\ior_open:Nn, \ior_open:cn}
-% \begin{macro}[aux]{\@@_open_aux:NnTF}
-%   Much the same idea for opening a read with a conditional, except the
-%   auxiliary function does not issue an error if the file is not found.
+%   An auxiliary searches for the file in the \TeX{}, \LaTeXe{} and
+%   \LaTeX3 paths.  Then pass the file found to the lower-level function
+%   which deals with streams.  The |full_name| is empty when the file is
+%   not found.
 %    \begin{macrocode}
 \prg_new_protected_conditional:Npnn \ior_open:Nn #1#2 { T , F , TF }
-  { \__file_name_sanitize:nn {#2} { \@@_open_aux:NnTF #1 } }
-\cs_generate_variant:Nn \ior_open:NnT  { c }
-\cs_generate_variant:Nn \ior_open:NnF  { c }
-\cs_generate_variant:Nn \ior_open:NnTF { c }
-\cs_new_protected:Npn \@@_open_aux:NnTF #1#2
   {
-    \file_add_path:nN {#2} \l__file_internal_name_tl
-    \quark_if_no_value:NTF \l__file_internal_name_tl
+    \file_get_full_name:nN {#2} \l__file_full_name_str
+    \str_if_empty:NTF \l__file_full_name_str
       { \prg_return_false: }
       {
-        \@@_open:No #1 \l__file_internal_name_tl
+        \@@_open:No #1 \l__file_full_name_str
         \prg_return_true:
       }
   }
+\cs_generate_variant:Nn \ior_open:NnT  { c }
+\cs_generate_variant:Nn \ior_open:NnF  { c }
+\cs_generate_variant:Nn \ior_open:NnTF { c }
 %    \end{macrocode}
 % \end{macro}
-% \end{macro}
 %
 % \begin{macro}[int]{\@@_new:N}
 %   In package mode, streams are reserved using \tn{newread} before they
@@ -1190,8 +1335,8 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\ior_list_streams:}
-% \begin{macro}[aux]{\@@_list_streams:Nn}
+% \begin{macro}{\ior_show_list:, \ior_log_list:}
+% \begin{macro}[aux]{\@@_list:Nn}
 %   Show the property lists, but with some \enquote{pretty printing}.
 %   See the \pkg{l3msg} module.  The first argument of the message is
 %   |ior| (as opposed to |iow|) and the second is empty if no read
@@ -1200,9 +1345,11 @@
 %   translating |ior|/|iow| to English.  The list of streams is
 %   formatted using \cs{__msg_show_item_unbraced:nn}.
 %    \begin{macrocode}
-\cs_new_protected:Npn \ior_list_streams:
-  { \@@_list_streams:Nn \g_@@_streams_prop { ior } }
-\cs_new_protected:Npn \@@_list_streams:Nn #1#2
+\cs_new_protected:Npn \ior_show_list:
+  { \@@_list:Nn \g_@@_streams_prop { ior } }
+\cs_new_protected:Npn \ior_log_list:
+  { \__msg_log_next: \ior_show_list: }
+\cs_new_protected:Npn \@@_list:Nn #1#2
   {
     \__msg_show_pre:nnxxxx { LaTeX / kernel } { show-streams }
       {#2} { \prop_if_empty:NF #1 { ? } } { } { }
@@ -1437,19 +1584,16 @@
 % \end{macro}
 %
 % \begin{macro}{\iow_open:Nn, \iow_open:cn}
-% \begin{macro}[int]{\@@_open:Nn}
-% \begin{macro}[aux]{\@@_open_stream:Nn}
+% \begin{macro}[aux]{\@@_open_stream:Nn, \@@_open_stream:NV}
 %   The same idea as for reading, but without the path and without the need
 %   to allow for a conditional version.
 %    \begin{macrocode}
 \cs_new_protected:Npn \iow_open:Nn #1#2
-  { \__file_name_sanitize:nn {#2} { \@@_open:Nn #1 } }
-\cs_generate_variant:Nn \iow_open:Nn { c }
-\cs_new_protected:Npn \@@_open:Nn #1#2
   {
+    \__file_name_sanitize:nN {#2} \l__file_base_name_str
     \iow_close:N #1
     \seq_gpop:NNTF \g_@@_streams_seq \l_@@_stream_tl
-      { \@@_open_stream:Nn #1 {#2} }
+      { \@@_open_stream:NV #1 \l__file_base_name_str }
 %<*initex>
       { \__msg_kernel_fatal:nn { kernel } { output-streams-exhausted } }
 %</initex>
@@ -1457,11 +1601,11 @@
       {
         \@@_new:N #1
         \tl_set:Nx \l_@@_stream_tl { \int_eval:n {#1} }
-        \@@_open_stream:Nn #1 {#2}
+        \@@_open_stream:NV #1 \l__file_base_name_str
       }
 %</package>
   }
-\cs_generate_variant:Nn \@@_open:Nn { No }
+\cs_generate_variant:Nn \iow_open:Nn { c }
 \cs_new_protected:Npn \@@_open_stream:Nn #1#2
   {
     \tex_global:D \tex_chardef:D #1 = \l_@@_stream_tl \scan_stop:
@@ -1468,10 +1612,10 @@
     \prop_gput:NVn \g_@@_streams_prop #1 {#2}
     \tex_immediate:D \tex_openout:D #1 #2 \scan_stop:
   }
+\cs_generate_variant:Nn \@@_open_stream:Nn { NV }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
-% \end{macro}
 %
 % \begin{macro}{\iow_close:N, \iow_close:c}
 %   Closing a stream is not quite the reverse of opening one. First,
@@ -1494,13 +1638,15 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\iow_list_streams:}
-% \begin{macro}{\@@_list_streams:Nn}
+% \begin{macro}{\iow_show_list:, \iow_log_list:}
+% \begin{macro}{\@@_list:Nn}
 %   Done as for input, but with a copy of the auxiliary so the name is correct.
 %    \begin{macrocode}
-\cs_new_protected:Npn \iow_list_streams:
-  { \@@_list_streams:Nn \g_@@_streams_prop { iow } }
-\cs_new_eq:NN \@@_list_streams:Nn \__ior_list_streams:Nn
+\cs_new_protected:Npn \iow_show_list:
+  { \@@_list:Nn \g_@@_streams_prop { iow } }
+\cs_new_protected:Npn \iow_log_list:
+  { \__msg_log_next: \iow_show_list: }
+\cs_new_eq:NN \@@_list:Nn \__ior_list:Nn
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
@@ -1745,7 +1891,7 @@
 %   valid and otherwise to \cs{@@_indent_error:n}.  The first places the
 %   instruction for increasing the indentation before its argument, and
 %   the instruction for unindenting afterwards.  The second produces an
-%   error expandably.  Note that there will be no forced line-break, so
+%   error expandably.  Note that there are no forced line-break, so
 %   the indentation only changes when the next line is started.
 %    \begin{macrocode}
 \cs_new_protected:Npn \iow_indent:n #1
@@ -1800,7 +1946,7 @@
 %   done, reset \cs{iow_indent:n} to its error definition: it only works
 %   in the first argument of \cs{iow_wrap:nnnN}.
 %    \begin{macrocode}
-%<*initex> 
+%<*initex>
       \tl_set:Nx \l_@@_wrap_tl {#1}
 %</initex>
 %<*package>
@@ -1817,7 +1963,7 @@
       \int_set:Nn \l_@@_line_target_int
         { \l_iow_line_count_int - \str_count:N \l_@@_newline_tl + 1 }
 %    \end{macrocode}
-%   There is then a loop over the input, which will store the wrapped
+%   There is then a loop over the input, which stores the wrapped
 %   result in \cs{l_@@_wrap_tl}.  After the loop, the resulting text is
 %   passed on to the function which has been given as a post-processor.
 %   The \cs{tl_to_str:N} step converts the \enquote{other} spaces back
@@ -1829,7 +1975,7 @@
     #4 { \tl_to_str:N \l_@@_wrap_tl }
   }
 %    \end{macrocode}
-%   As using the generic loader will mean that \cs{protected at edef} is
+%   As using the generic loader means that \cs{protected at edef} is
 %   not available, it's not placed directly in the wrap function but is set
 %   up as an auxiliary. In the generic loader this can then be redefined.
 %    \begin{macrocode}
@@ -1842,9 +1988,9 @@
 %
 % \begin{macro}[aux]{\@@_wrap_do:, \@@_wrap_start:w}
 %   Escape spaces.  Set up a few variables, in particular the initial
-%   value of \cs{l_@@_wrap_tl}: the space will stop the
+%   value of \cs{l_@@_wrap_tl}: the space stops the
 %   \texttt{f}-expansion of the main wrapping function and
-%   \cs{use_none:n} will remove a newline marker inserted by later code.
+%   \cs{use_none:n} removes a newline marker inserted by later code.
 %   The main loop consists of repeatedly calling the \texttt{chunk}
 %   auxiliary to wrap chunks delimited by (newline or indentation)
 %   markers.
@@ -2026,7 +2172,7 @@
 %   \texttt{break_first} auxiliary calls the \texttt{break_none}
 %   auxiliary.  In that case, if the current line is empty, the complete
 %   word (including |##4|, characters beyond what we had grabbed) is
-%   added to the line, making it over-long.  Otherwise, the word will be
+%   added to the line, making it over-long.  Otherwise, the word is
 %   used for the following line (and the last space of the line so far
 %   is removed because it was inserted due to the presence of a marker).
 %    \begin{macrocode}
@@ -2217,6 +2363,65 @@
 %
 % \subsection{Deprecated functions}
 %
+% \begin{variable}[deprecated = 2018-12-31]{\g_file_current_name_tl}
+%   For removal after 2018-12-31.
+%    \begin{macrocode}
+\tl_new:N \g_file_current_name_tl
+\tl_gset:Nn \g_file_current_name_tl { \g_file_curr_name_str }
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[deprecated = 2018-12-31]{\file_path_include:n}
+% \begin{macro}[deprecated = 2018-12-31]{\file_path_remove:n}
+% \begin{macro}[deprecated = 2018-12-31, aux]{\__file_path_include:n}
+%   Wrapper functions to manage the search path.
+%    \begin{macrocode}
+\cs_new_protected:Npn \file_path_include:n #1
+  {
+    \__msg_kernel_warning:nnxxx { kernel } { deprecated-command }
+      { 2018-12-31 }
+      { \token_to_str:N \file_path_include:n }
+      {
+        \token_to_str:N \seq_put_right:Nn \c_space_tl
+        \token_to_str:N \l_file_search_path_seq
+      }
+    \__file_name_sanitize:nN {#1} \l__file_full_name_str
+    \seq_if_in:NVF \l_file_search_path_seq \l__file_full_name_str
+      { \seq_put_right:NV \l_file_search_path_seq \l__file_full_name_str }
+  }
+\cs_new_protected:Npn \file_path_remove:n #1
+  {
+    \__msg_kernel_warning:nnxxx { kernel } { deprecated-command }
+      { 2018-12-31 }
+      { \token_to_str:N \file_path_remove:n }
+      {
+        \token_to_str:N \seq_remove_all:Nn \c_space_tl
+        \token_to_str:N \l_file_search_path_seq
+      }
+    \__file_name_sanitize:nN {#1} \l__file_full_name_str
+    \seq_remove_all:NV \l_file_search_path_seq \l__file_full_name_str
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[deprecated = 2018-12-31]{\file_add_path:nN}
+%   For removal after 2018-12-31.
+%    \begin{macrocode}
+\cs_new_protected:Npn \file_add_path:nN #1#2
+  {
+    \__msg_kernel_warning:nnxxx { kernel } { deprecated-command }
+      { 2018-12-31 }
+      { \token_to_str:N \file_add_path:nN }
+      { \token_to_str:N \file_get_full_name:nN }
+    \file_get_full_name:nN {#1} #2
+    \str_if_empty:NT #2
+      { \tl_set:Nn #2 { \q_no_value } }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
 % \begin{macro}[added = 2012-06-24, updated = 2012-07-31, deprecated=2017-12-31]{\ior_get_str:NN}
 %   For removal after 2017-12-31.
 %    \begin{macrocode}
@@ -2232,7 +2437,65 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}[deprecated = 2018-12-31]{\file_list:}
+%   Renamed to \cs{file_log_list:}.  For removal after 2018-12-31.
 %    \begin{macrocode}
+\cs_new_protected:Npn \file_list:
+  {
+    \__msg_kernel_warning:nnxxx { kernel } { deprecated-command }
+      { 2018-12-31 }
+      { \token_to_str:N \file_list: }
+      { \token_to_str:N \file_log_list: }
+    \cs_gset_eq:NN \file_list: \file_log_list:
+    \file_log_list:
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[added = 2014-08-22, updated = 2015-08-01, deprecated = 2018-12-31]
+%   {\ior_list_streams:, \ior_log_streams:, \iow_list_streams:, \iow_log_streams:}
+%   These got a more consistent naming.
+%    \begin{macrocode}
+\cs_new_protected:Npn \ior_list_streams:
+  {
+    \__msg_kernel_warning:nnxxx { kernel } { deprecated-command }
+      { 2018-12-31 }
+      { \token_to_str:N \ior_list_streams: }
+      { \token_to_str:N \ior_show_list: }
+    \cs_gset_eq:NN \ior_list_streams: \ior_show_list:
+    \ior_show_list:
+  }
+\cs_new_protected:Npn \ior_log_streams:
+  {
+    \__msg_kernel_warning:nnxxx { kernel } { deprecated-command }
+      { 2018-12-31 }
+      { \token_to_str:N \ior_log_streams: }
+      { \token_to_str:N \ior_log_list: }
+    \cs_gset_eq:NN \ior_log_streams: \ior_log_list:
+    \ior_log_list:
+  }
+\cs_new_protected:Npn \iow_list_streams:
+  {
+    \__msg_kernel_warning:nnxxx { kernel } { deprecated-command }
+      { 2018-12-31 }
+      { \token_to_str:N \iow_list_streams: }
+      { \token_to_str:N \iow_show_list: }
+    \cs_gset_eq:NN \iow_list_streams: \iow_show_list:
+    \iow_show_list:
+  }
+\cs_new_protected:Npn \iow_log_streams:
+  {
+    \__msg_kernel_warning:nnxxx { kernel } { deprecated-command }
+      { 2018-12-31 }
+      { \token_to_str:N \iow_log_streams: }
+      { \token_to_str:N \iow_log_list: }
+    \cs_gset_eq:NN \iow_log_streams: \iow_log_list:
+    \iow_log_list:
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+%    \begin{macrocode}
 %</initex|package>
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3final.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3final.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3final.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -63,7 +63,7 @@
 %
 % \subsection{Input encoding}
 %
-% The letters |a|--|z| and |A|--|Z| will be correct directly from Ini\TeX{}
+% The letters |a|--|z| and |A|--|Z| have the correct catcode directly from Ini\TeX{}
 % while for Unicode engines (almost) all characters to be treated as letters
 % are defined by the automatic data parsing. Thus the changes here are to 
 % deal with the additional cases.
@@ -92,7 +92,7 @@
 %
 % For non-Unicode engine we now need to convert from UTF-$8$ to $8$-bit
 % for pattern reading and document use. The set up here is copied from
-% the file |conv-utf8-ec.tex| maintained by \acro{tug} for hyphenation
+% the file |conv-utf8-ec.tex| maintained by \textsc{tug} for hyphenation
 % pattern use. As some of the relevant primitives have been moved and to
 % allow for self-contained code that is copied here with minor adjustments.
 % (The primitives have to be available at point of use not just at point of

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -84,7 +84,7 @@
 %   Creates a new flag with a name given by \meta{flag name}, or raises
 %   an error if the name is already taken. The \meta{flag name} may not
 %   contain spaces. The declaration is global, but flags are always
-%   local variables. The \meta{flag} will initially have zero height.
+%   local variables. The \meta{flag} initially has zero height.
 % \end{function}
 %
 % \begin{function}{\flag_clear:n}
@@ -193,8 +193,12 @@
 %   Undefine control sequences, starting from the |0| flag, upwards,
 %   until reaching an undefined control sequence.  We don't use
 %   \cs{cs_undefine:c} because that would act globally.
+%   When the option \texttt{check-declarations} is used, check for the
+%   function defined by \cs{flag_new:n}.
 %    \begin{macrocode}
-\cs_new_protected:Npn \flag_clear:n { \@@_clear:wn 0 ; }
+\__debug_patch:nnNw
+  { \exp_args:Nc \__chk_if_exist_var:N { flag~#1 } } { }
+\cs_new_protected:Npn \flag_clear:n #1 { \@@_clear:wn 0 ; {#1} }
 \cs_new_protected:Npn \@@_clear:wn #1 ; #2
   {
     \if_cs_exist:w flag~#2~#1 \cs_end:
@@ -235,6 +239,27 @@
 %
 % \subsection{Expandable flag commands}
 %
+% \begin{macro}[EXP,aux]{\@@_chk_exist:n}
+%   Analogue of \cs{__chk_if_exist_var:N} for flags, and with an
+%   expandable error.  We need to add checks by hand because flags are
+%   not implemented in terms of other variables.  Not all functions need
+%   to be patched since some are defined in terms of others.
+%    \begin{macrocode}
+%<*package>
+\tex_ifodd:D \l at expl@enable at debug@bool
+  \cs_new:Npn \@@_chk_exist:n #1
+    {
+      \flag_if_exist:nF {#1}
+        {
+          \__msg_kernel_expandable_error:nnn
+            { kernel } { bad-variable } { flag~#1~ }
+        }
+    }
+\fi:
+%</package>
+%    \end{macrocode}
+% \end{macro}
+%
 % \begin{macro}[EXP, pTF]{\flag_if_exist:n}
 %   A flag exist if the corresponding trap \cs[no-index]{flag \meta{flag
 %   name}:n} is defined.
@@ -250,6 +275,7 @@
 % \begin{macro}[EXP, pTF]{\flag_if_raised:n}
 %   Test if the flag has a non-zero height, by checking the |0| control sequence.
 %    \begin{macrocode}
+\__debug_patch:nnNw { \@@_chk_exist:n {#1} } { }
 \prg_new_conditional:Npnn \flag_if_raised:n #1 { p , T , F , TF }
   {
     \if_cs_exist:w flag~#1~0 \cs_end:
@@ -266,7 +292,8 @@
 %   Extract the value of the flag by going through all of the
 %   control sequences starting from |0|.
 %    \begin{macrocode}
-\cs_new:Npn \flag_height:n { \@@_height_loop:wn 0; }
+\__debug_patch:nnNw { \@@_chk_exist:n {#1} } { }
+\cs_new:Npn \flag_height:n #1 { \@@_height_loop:wn 0; {#1} }
 \cs_new:Npn \@@_height_loop:wn #1 ; #2
   {
     \if_cs_exist:w flag~#2~#1 \cs_end:
@@ -292,49 +319,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \subsection{Option check-declarations}
-%
-% \begin{macro}[EXP,aux]{\@@_chk_exist:n}
-%   In package mode, there is an option to check all variables used are
-%   defined.  Since flags are not implemented in terms of other
-%   variables, we need to add checks by hand.  Not all functions need to
-%   be patched because some are defined in terms of others.
 %    \begin{macrocode}
-%<*package>
-\tex_ifodd:D \l at expl@check at declarations@bool
-  \cs_set_protected:Npn \flag_clear:n #1
-    {
-      \exp_args:Nc \__chk_if_exist_var:N { flag~#1 }
-      \@@_clear:wn 0 ; {#1}
-    }
-  \cs_set:Npn \@@_chk_exist:n #1
-    {
-      \flag_if_exist:nF {#1}
-        {
-          \__msg_kernel_expandable_error:nnn
-            { kernel } { bad-variable } { flag~#1~ }
-        }
-    }
-  \cs_set:Npn \flag_height:n #1
-    {
-      \@@_chk_exist:n {#1}
-      \@@_height_loop:wn 0; {#1}
-    }
-  \prg_set_conditional:Npnn \flag_if_raised:n #1 { p , T , F , TF }
-    {
-      \@@_chk_exist:n {#1}
-      \if_cs_exist:w flag~#1~0 \cs_end:
-        \prg_return_true:
-      \else:
-        \prg_return_false:
-      \fi:
-    }
-\fi:
-%</package>
-%    \end{macrocode}
-% \end{macro}
-%
-%    \begin{macrocode}
 %</initex|package>
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 % \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-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -72,8 +72,8 @@
 % \end{quote}
 % Let us explain each piece separately.
 %
-% Internal floating point numbers will be used in expressions,
-% and in this context will be subject to \texttt{f}-expansion. They must
+% Internal floating point numbers are used in expressions,
+% and in this context are subject to \texttt{f}-expansion. They must
 % leave a recognizable mark after \texttt{f}-expansion, to prevent the
 % floating point number from being re-parsed. Thus, \cs{s_@@}
 % is simply another name for \tn{relax}.
@@ -483,7 +483,7 @@
 % \subsection{Packing digits}
 %
 % When a positive integer |#1| is known to be less than $10^8$, the
-% following trick will split it into two blocks of $4$ digits, padding
+% following trick splits it into two blocks of $4$ digits, padding
 % with zeros on the left.
 % \begin{verbatim}
 %   \cs_new:Npn \pack:NNNNNw #1 #2#3#4#5 #6; { {#2#3#4#5} {#6} }
@@ -520,14 +520,14 @@
 % which triggers the third computation.  The third computation's value
 % is $5\,0000\,0000 + 12345 \times 8899$, which has $9$ digits. Adding
 % $5\cdot 10^{8}$ to the product allowed us to know how many digits to
-% expect as long as the numbers to multiply are not too big; it will
-% also work to some extent with negative results.  The \texttt{pack}
+% expect as long as the numbers to multiply are not too big; it
+% also works to some extent with negative results.  The \texttt{pack}
 % function puts the last $4$ of those $9$ digits into a brace group,
 % moves the semi-colon delimiter, and inserts a |+|, which combines the
 % carry with the previous computation.  The shifts nicely combine into
 % $5\,0000\,0000 / 10^{4} + 4\,9995\,0000 = 5\,0000\,0000$.  As long as
 % the operands are in some range, the result of this second computation
-% will have $9$ digits.  The corresponding \texttt{pack} function,
+% has $9$ digits.  The corresponding \texttt{pack} function,
 % expanded after the result is computed, braces the last $4$ digits, and
 % leaves |+| \meta{5 digits} for the initial computation.  The
 % \enquote{leading shift} cancels the combination of the other shifts,
@@ -610,7 +610,7 @@
 %   \end{syntax}
 %   Grabs two sets of $4$ digits and places them before the semi-colon
 %   delimiter.  Putting several copies of this function before a
-%   semicolon will pack more digits since each will take the digits
+%   semicolon packs more digits since each takes the digits
 %   packed by the others in its first argument.
 %    \begin{macrocode}
 \cs_new:Npn \@@_pack_twice_four:wNNNNNNNN #1; #2#3#4#5 #6#7#8#9
@@ -624,8 +624,8 @@
 %   \end{syntax}
 %   Grabs one set of $8$ digits and places them before the semi-colon
 %   delimiter as a single group.  Putting several copies of this
-%   function before a semicolon will pack more digits since each will
-%   take the digits packed by the others in its first argument.
+%   function before a semicolon packs more digits since each
+%   takes the digits packed by the others in its first argument.
 %    \begin{macrocode}
 \cs_new:Npn \@@_pack_eight:wNNNNNNNN #1; #2#3#4#5 #6#7#8#9
   { #1 {#2#3#4#5#6#7#8#9} ; }
@@ -851,14 +851,14 @@
 %   \meta{junk}
 %   \meta{floating point}
 % \end{syntax}
-% In this example, the case $0$ will return the floating point
+% In this example, the case $0$ returns the floating point
 % \meta{fp~var}, expanding once after that floating point.  Case $1$
-% will do \meta{some computation} using the \meta{floating point}
+% does \meta{some computation} using the \meta{floating point}
 % (presumably compute the operation requested by the user in that
-% non-trivial case).  Case $2$ will return the \meta{floating point}
+% non-trivial case).  Case $2$ returns the \meta{floating point}
 % without modifying it, removing the \meta{junk} and expanding once
-% after.  Case $3$ will close the conditional, remove the \meta{junk}
-% and the \meta{floating point}, and expand \meta{something} next.  In
+% after.  Case $3$ closes the conditional, removes the \meta{junk}
+% and the \meta{floating point}, and expands \meta{something} next.  In
 % other cases, the \enquote{\meta{junk}} is expanded, performing some
 % other operation on the \meta{floating point}.  We provide similar
 % functions with two trailing \meta{floating points}.

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -614,7 +614,7 @@
 %   $10$, namely the first digit of $x$ is $1$, and all others vanish
 %   when subtracting $y$.  Then the \meta{rounding} |#3| and the
 %   \meta{final sign} |#4| control whether we get $1$ or $0.9999 9999
-%   9999 9999$.  In the usual round-to-nearest mode, we will get $1$
+%   9999 9999$.  In the usual round-to-nearest mode, we get $1$
 %   whenever the \meta{rounding} digit is less than or equal to $5$
 %   (remember that the \meta{rounding} digit is only equal to $5$ if
 %   there was no further non-zero digit).
@@ -922,7 +922,7 @@
 % \end{macro}
 %
 % \begin{macro}[aux, rEXP]{\@@_mul_significand_small_f:NNwwwN}
-%   In this branch, \meta{digit 1} is zero. Our result will thus be
+%   In this branch, \meta{digit 1} is zero. Our result is thus
 %   \meta{digits 2--17}, plus some rounding which depends on the digits
 %   $17$, $18$, and whether all subsequent digits are zero or not.
 %   The $8$ digits |1#3| are followed, after expansion of the
@@ -1038,7 +1038,7 @@
 % + 10^{-16} Q_{D} + \text{rounding}$.  Since the $Q_{i}$ are integers,
 % $B$, $C$, $D$, and~$E$ are all exact multiples of $10^{-16}$, in other
 % words, computing with $16$ digits after the decimal separator yields
-% exact results.  The problem will be overflow: in general $B$, $C$,
+% exact results.  The problem is the risk of overflow: in general $B$, $C$,
 % $D$, and $E$ may be greater than $1$.
 %
 % Unfortunately, things are not as easy as they seem.  In particular, we
@@ -1143,7 +1143,7 @@
 % All of those bounds are less than $2.147\cdot 10^{5}$, and we are thus
 % within \TeX{}'s bounds in all cases!
 %
-% We will later need to have a bound on the $Q_{i}$. Their definitions
+% We later need to have a bound on the $Q_{i}$. Their definitions
 % imply that $Q_{A} < 10^{9} A/y - 1/2 < 10^{5} A$ and similarly for the
 % other $Q_{i}$.  Thus, all of them are less than $177770$.
 %
@@ -1151,7 +1151,7 @@
 % \begin{equation*}
 %   A/Z = \sum_{i=1}^{4} \left(10^{-4i} Q_{i}\right) + 10^{-16} E/Z
 % \end{equation*}
-% exactly.  Furthermore, we know that the result will be in $[0.1,10)$,
+% exactly.  Furthermore, we know that the result is in $[0.1,10)$,
 % hence will be rounded to a multiple of $10^{-16}$ or of $10^{-15}$, so
 % we only need to know the integer part of $E/Z$, and a
 % \enquote{rounding} digit encoding the rest.  Equivalently, we need to
@@ -1194,7 +1194,7 @@
 %   Compute $10^{6} + Q_{A}$ (a $7$~digit number thanks to the shift),
 %   unbrace \meta{A_1} and \meta{A_2}, and prepare the
 %   \meta{continuation} arguments for $4$ consecutive calls to
-%   \cs{@@_div_significand_calc:wwnnnnnnn}.  Each of these calls will need
+%   \cs{@@_div_significand_calc:wwnnnnnnn}.  Each of these calls needs
 %   \meta{y} (|#1|), and it turns out that we need post-expansion there,
 %   hence the \cs{__int_value:w}.  Here, |#4| is six brace groups, which
 %   give the six first |n|-type arguments of the \texttt{calc} function.
@@ -1328,7 +1328,7 @@
 %       \meta{continuations} \meta{sign}
 %   \end{quote}
 %   Compute $Q_{B}$ by evaluating $\meta{B_1}\meta{B_2}0 / y - 1$.  The
-%   result will be output to the left, in an \cs{__int_eval:w} which we
+%   result is output to the left, in an \cs{__int_eval:w} which we
 %   start now.  Once that is evaluated (and the other $Q_{i}$ also,
 %   since later expansions are triggered by this one), a packing
 %   auxiliary takes care of placing the digits of $Q_{B}$ in an
@@ -1353,7 +1353,7 @@
 %       \Arg{Z_1} \Arg{Z_2} \Arg{Z_3} \Arg{Z_4} \meta{sign}
 %   \end{quote}
 %   We compute $P \simeq 2E/Z$ by rounding $2 E_{1} E_{2}/Z_{1}Z_{2}$.
-%   Note the first $0$, which multiplies $Q_{D}$ by $10$: we will later
+%   Note the first $0$, which multiplies $Q_{D}$ by $10$: we later
 %   add (roughly) $5\cdot P$, which amounts to adding $P/2 \simeq E/Z$
 %   to $Q_{D}$, the appropriate correction from a hypothetical $Q_{E}$.
 %    \begin{macrocode}
@@ -1692,7 +1692,7 @@
 %   < 3.2 \cdot 10^{-8} \,,
 %   \]
 %   and $\sqrt{a} - y = (a - y^2)/(\sqrt{a} + y) \leq 16 \cdot 10^{-8}$.
-%   Next, \cs{@@_sqrt_auxii_o:NnnnnnnnN} will be called several times to
+%   Next, \cs{@@_sqrt_auxii_o:NnnnnnnnN} is called several times to
 %   get closer and closer underestimates of~$\sqrt{a}$.  By
 %   construction, the underestimates~$y$ are always increasing, $a - y^2
 %   < 3.2 \cdot 10^{-8}$ for all.  Also, $y<1$.

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -69,7 +69,7 @@
 %   If |#1| ends with a $0$, the \texttt{loop} auxiliary takes that zero
 %   as an end-delimiter for its first argument, and the second argument
 %   is the same \texttt{loop} auxiliary.  Once the last trailing zero is
-%   reached, the second argument will be the \texttt{dot} auxiliary,
+%   reached, the second argument is the \texttt{dot} auxiliary,
 %   which removes a trailing dot if any.  We then clean-up with the
 %   \texttt{end} auxiliary, keeping only the number.
 %    \begin{macrocode}
@@ -355,7 +355,7 @@
 % \begin{macro}[aux, EXP]{\@@_to_int_dispatch:w}
 %   To convert to an integer, first round to $0$ places (to the nearest
 %   integer), then express the result as a decimal number: the
-%   definition of \cs{@@_to_decimal_dispatch:w} is such that there will be no
+%   definition of \cs{@@_to_decimal_dispatch:w} is such that there are no
 %   trailing dot nor zero.
 %    \begin{macrocode}
 \cs_new:Npn \@@_to_int_dispatch:w #1;

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -82,7 +82,7 @@
 %
 % \emph{The rest of this section is actually not in sync with the code.
 %   Or is the code not in sync with the section?  In the current code,
-%   $c\in [1,10]$ will be such that $0.7\leq ac < 1.4$.}
+%   $c\in [1,10]$ is such that $0.7\leq ac < 1.4$.}
 %
 % We are given a positive normal number, of the form $a\cdot 10^{b}$
 % with $a\in[0.1,1)$.  To compute its logarithm, we find a small integer
@@ -250,7 +250,7 @@
     {#1#2#3#4#5} {#6}
   }
 %    \end{macrocode}
-%   The Taylor series will be expressed in terms of
+%   The Taylor series to be used is expressed in terms of
 %   $t = (x-1)/(x+1) = 1 - 2/(x+1)$. We now compute the
 %   quotient with extended precision, reusing some code
 %   from \cs{@@_/_o:ww}. Note that $1+x$ is known exactly.
@@ -520,8 +520,7 @@
 %
 %   For now, $\ln(x)$ is given as $\cdot 10^0$. Unless both the exponent
 %   is $1$ and $c=1$, we shift to working in units of $\cdot 10^4$,
-%   since the final result will be at least $\ln(10/7) \simeq
-%   0.35$.
+%   since the final result is at least $\ln(10/7) \simeq 0.35$.
 %    \begin{macrocode}
 \cs_new:Npn \@@_ln_c:NwNw #1 #2; #3
   {
@@ -542,7 +541,7 @@
 %     \Arg{exponent}
 %   \end{quote}
 %   Compute \meta{exponent} times $\ln(10)$. Apart from the cases where
-%   \meta{exponent} is $0$ or $1$, the result will necessarily be at
+%   \meta{exponent} is $0$ or $1$, the result is necessarily at
 %   least $\ln(10) \simeq 2.3$ in magnitude. We can thus drop the least
 %   significant $4$ digits. In the case of a very large (positive or
 %   negative) exponent, we can (and we need to) drop $4$ additional
@@ -1157,7 +1156,7 @@
 %   undefined.  This is invalid, unless $|a|^b$ turns out to be $+0$ or
 %   \texttt{nan}, in which case we return that as $a^b$.  In particular,
 %   since the underflow detection occurs before \cs{@@_pow_neg:www} is
-%   called, |(-0.1)**(12345.67)| will give $+0$ rather than complaining
+%   called, |(-0.1)**(12345.67)| gives $+0$ rather than complaining
 %   that the sign is not defined.
 %    \begin{macrocode}
 \cs_new:Npn \@@_pow_neg:www \s_@@ \@@_chk:w #1#2; #3; #4;

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -180,8 +180,8 @@
 %   $10^{-24}$, and leaves \meta{continuation} \Arg{c_1} \ldots{}
 %   \Arg{c_6} |;| in the input stream, where each of the \meta{c_i} are
 %   blocks of $4$~digits, except \meta{c_1}, which is any \TeX{}
-%   integer.  Note that indices for \meta{b} start at~$0$: a second
-%   operand of |{0001}{0000}{0000}| will leave the first operand
+%   integer.  Note that indices for \meta{b} start at~$0$: for instance
+%   a second operand of |{0001}{0000}{0000}| leaves the first operand
 %   unchanged (rather than dividing it by $10^{4}$, as
 %   \cs{@@_fixed_mul:wwn} would).
 %    \begin{macrocode}
@@ -235,7 +235,7 @@
 %   The \texttt{ii} auxiliary receives $Q_{i}$, $n$, and $a_{i}$ as
 %   arguments.  It adds $Q_{i}$ to a surrounding integer expression, and
 %   starts a new one with the initial value $9999$, which ensures that
-%   the result of this expression will have $5$ digits.  The auxiliary
+%   the result of this expression has $5$ digits.  The auxiliary
 %   also computes $a_{i}-n\cdot Q_{i}$, placing the result in front of
 %   the $4$ digits of $a_{i+1}$.  The resulting $a'_{i+1} = 10^{4}
 %   (a_{i} - n \cdot Q_{i}) + a_{i+1}$ serves as the first argument for
@@ -450,7 +450,7 @@
 %   common parts of the three functions.
 %
 %   For definiteness, consider the task of computing $a\times b + c$.
-%   We will perform carries in
+%   We perform carries in
 %   \begin{align*}
 %     a \times b + c =
 %     & (a_{1} \cdot b_{1} + c_{1} c_{2})\cdot 10^{-8} \\
@@ -479,7 +479,7 @@
 %   first level, calls the \texttt{i} auxiliary with arguments described
 %   later, and adds a trailing ${} + c_{5}c_{6}$ |;|
 %   \Arg{continuation}~|;|.  The ${} + c_{5}c_{6}$ piece, which is
-%   omitted for \cs{@@_fixed_one_minus_mul:wwn}, will be taken in the
+%   omitted for \cs{@@_fixed_one_minus_mul:wwn}, is taken in the
 %   integer expression for the $10^{-24}$ level.
 %    \begin{macrocode}
 \cs_new:Npn \@@_fixed_mul_add:wwwn #1; #2; #3#4#5#6#7#8;
@@ -564,7 +564,7 @@
 %     & b_{1} + a_{4} \cdot b_{2} + a_{3} \cdot b_{3} + a_{2} \cdot b_{4} + a_{1} \\
 %     & b_{2} + a_{4} \cdot b_{3} + a_{3} \cdot b_{4} + a_{2} .
 %   \end{align*}
-%   Obviously, those expressions make no mathematical sense: we will
+%   Obviously, those expressions make no mathematical sense: we
 %   complete them with $a_{5} \cdot {}$ and ${} \cdot b_{5}$, and with
 %   $a_{6} \cdot b_{1} + a_{5} \cdot {}$ and ${} \cdot b_{5} + a_{1}
 %   \cdot b_{6}$, and of course with the trailing ${} + c_{5} c_{6}$.
@@ -626,8 +626,7 @@
 %   {\@@_ep_to_fixed_auxi:www, \@@_ep_to_fixed_auxii:nnnnnnnwn}
 %   Converts an extended-precision number with an exponent at most~$4$
 %   and a first block less than $10^{8}$ to a fixed point number whose
-%   first block will have $12$~digits, hopefully starting with many
-%   zeros.
+%   first block has $12$~digits, hopefully starting with many zeros.
 %    \begin{macrocode}
 \cs_new:Npn \@@_ep_to_fixed:wwn #1,#2
   {
@@ -779,7 +778,7 @@
 % $\meta{d_1}\cdots\meta{d_6}$, the condition translates to
 % $\meta{n_1},\meta{d_1}\in[1000,9999]$.
 %
-% We will first find an integer estimate $a \simeq 10^{8} / \meta{d}$ by
+% We first find an integer estimate $a \simeq 10^{8} / \meta{d}$ by
 % computing
 % \begin{align*}
 %   \alpha &= \eTeXfrac{10^{9}}{\meta{d_1}+1} \\
@@ -795,7 +794,7 @@
 % \meta{d}$, while when $\meta{d_2}=9999$ one gets $a =
 % 10^{3}\alpha-1250 \simeq 10^{12} / (\meta{d_1} + 1) \simeq 10^{8} /
 % \meta{d}$.  The shift by $1250$ helps to ensure that $a$ is an
-% underestimate of the correct value.  We will prove that
+% underestimate of the correct value.  We shall prove that
 % \[
 % 1 - 1.755\cdot 10^{-5} < \frac{\meta{d}a}{10^{8}} < 1 .
 % \]
@@ -812,8 +811,8 @@
 %
 % Let us prove the upper bound first (multiplied by $10^{15}$).  Note
 % that $10^{7} \meta{d} < 10^{3} \meta{d_1} + 10^{-1} (\meta{d_2} + 1)$,
-% and that \eTeX{}'s division $\eTeXfrac{\meta{d_2}}{10}$ will at most
-% underestimate $10^{-1}(\meta{d_2} + 1)$ by $0.5$, as can be checked
+% and that \eTeX{}'s division $\eTeXfrac{\meta{d_2}}{10}$ underestimates
+% $10^{-1}(\meta{d_2} + 1)$ by $0.5$ at most, as can be checked
 % for each possible last digit of \meta{d_2}.  Then,
 % \begin{align}
 %   10^{7} \meta{d}a
@@ -877,7 +876,7 @@
 % reached for one of the extreme values $[y/10]=0$ or $[y/10]=100$, and
 % we easily check the bound for those values.
 %
-% We have proven that the algorithm will give us a precise enough
+% We have proven that the algorithm gives us a precise enough
 % answer.  Incidentally, the upper bound that we derived tells us that
 % $a < 10^{8}/\meta{d} \leq 10^{9}$, hence we can compute $a$ safely as
 % a \TeX{} integer, and even add $10^{9}$ to it to ease grabbing of all
@@ -916,7 +915,7 @@
 %   }
 %   The \texttt{esti} function evaluates $\alpha=10^{9} / (\meta{d_1} +
 %   1)$, which is used twice in the expression for $a$, and combines the
-%   exponents |#1| and~|#4| (with a shift by~$1$ because we will compute
+%   exponents |#1| and~|#4| (with a shift by~$1$ because we later compute
 %   $\meta{n}/(10\meta{d})$.  Then the \texttt{estii} function evaluates
 %   $10^{9} + a$, and puts the exponent~|#2| after the
 %   continuation~|#7|: from there on we can forget exponents and focus
@@ -1008,8 +1007,8 @@
 % method: essentially $r \mapsto (r + 10^{8} / (x_{1} r)) / 2$, starting
 % from a guess that optimizes the number of steps before convergence.
 % In fact, just as there is a slight shift when computing divisions to
-% ensure that some inequalities hold, we will replace $10^{8}$ by a
-% slightly larger number which will ensure that $r^2 x \geq 10^{4}$.
+% ensure that some inequalities hold, we replace $10^{8}$ by a
+% slightly larger number which ensures that $r^2 x \geq 10^{4}$.
 % This also causes $r \in [101, 1003]$.  Another correction to the above
 % is that the input is actually normalized to $[0.1,1)$, and we use
 % either $10^{8}$ or $10^{9}$ in the Newton method, depending on the

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -315,8 +315,7 @@
 %   \cs{int_step_function:nnnN}.  There are two subtleties: we use the
 %   internal parser \cs{@@_parse:n} to avoid converting back and forth
 %   from the internal representation; and (due to rounding) even a
-%   non-zero step does not guarantee that the loop counter will
-%   increase.
+%   non-zero step does not guarantee that the loop counter increases.
 %    \begin{macrocode}
 \cs_new:Npn \fp_step_function:nnnN #1#2#3
   {
@@ -425,8 +424,9 @@
 %   numbers sequentially, keeping track of the largest (smallest) number
 %   found so far.  If numbers are equal (for instance~$\pm0$), the first
 %   is kept.  We append $-\infty$ ($\infty$), for the case of an empty
-%   array, currently impossible.  Since no number is smaller (larger)
-%   than that, it will never alter the maximum (minimum).  The weird
+%   array.  Since no number is smaller (larger) than that, this
+%   additional item only affects the maximum (minimum) in the case of
+%   |max()| and |min()| with no argument.  The weird
 %   fp-like trailing marker breaks the loop correctly: see the precise
 %   definition of \cs{@@_minmax_loop:Nww}.
 %    \begin{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -78,7 +78,7 @@
 %   \begin{texnote}
 %     Registers (integers, toks, etc.) are automatically unpacked,
 %     without requiring a function such as \cs{int_use:N}.  Invalid
-%     tokens remaining after \texttt{f}-expansion will lead to
+%     tokens remaining after \texttt{f}-expansion lead to
 %     unrecoverable low-level \TeX{} errors.
 %   \end{texnote}
 % \end{macro}
@@ -155,7 +155,7 @@
 % \cs{int_eval:n} does), and with this approach, expanding the next
 % unread token forces us to jump with \cs{exp_after:wN} over every value
 % computed earlier in the expression.  With this approach, the run-time
-% will grow at least quadratically in the length of the expression, if
+% grows at least quadratically in the length of the expression, if
 % not as its cube (inserting the \cs{exp_after:wN} is tricky and slow).
 %
 % A second option is to place those values at the end of the expression.
@@ -217,7 +217,7 @@
 % to do the calculation, and in the process to expand the following
 % once.  This is also true in our real application: all the functions of
 % the form \cs[no-index]{@@_\ldots_o:ww} expand what follows once.  This comes at the
-% cost of leaving tokens in the input stack, and we will need to be
+% cost of leaving tokens in the input stack, and we need to be
 % careful not to waste this memory.  All of our discussion above is nice
 % but simplistic, as operations should not simply be performed in the
 % order they appear.
@@ -232,8 +232,8 @@
 % reaching an operator which has lower precedence than the one which
 % called |\operand:w|.  This means that |\operand:w| must know what the
 % previous binary operator is, or rather, its precedence: we thus rename
-% it |\operand:Nw|.  Let us describe as an example how the calculation
-% |41-2^3*4+5| will be done.  Here, we abuse notations: the first
+% it |\operand:Nw|.  Let us describe as an example how we plan to do
+% the calculation |41-2^3*4+5|.  Here, we abuse notations: the first
 % argument of |\operand:Nw| should be an integer constant (\cs{c_@@_prec_plus_int},
 % \ldots{}) equal to the precedence of the given operator,
 % not directly the operator itself.
@@ -266,7 +266,7 @@
 % \end{itemize}
 % The procedure above stops short of performing all computations, but
 % adding a surrounding call to |\operand:Nw| with a very low precedence
-% ensures that all computations will be performed before |\operand:Nw|
+% ensures that all computations are performed before |\operand:Nw|
 % is done.  Adding a trailing marker with the same very low precedence
 % prevents the surrounding |\operand:Nw| from going beyond the marker.
 %
@@ -386,7 +386,7 @@
 % the \meta{precedence}, continuing the loop.
 %
 % We have introduced the most important functions here, and the next few
-% paragraphs will describe various subtleties.
+% paragraphs we describe various subtleties.
 %
 % \subsubsection{Prefix operators, parentheses, and functions}
 %
@@ -530,8 +530,8 @@
 % At all steps, we try to accept all category codes: when |#1|~is kept
 % to be used later, it is almost always converted to category code other
 % through \cs{token_to_str:N}.  More precisely, catcodes $\{3, 6, 7, 8,
-% 11, 12\}$ should work without trouble, but $\{1, 2, 4, 10, 13\}$ will
-% not work, and of course $\{0, 5, 9\}$ cannot become tokens.
+% 11, 12\}$ should work without trouble, but not $\{1, 2, 4, 10, 13\}$,
+% and of course $\{0, 5, 9\}$ cannot become tokens.
 %
 % Floating point expressions should behave as much as possible like
 % \eTeX{}-based integer expressions and dimension expressions.  In
@@ -541,7 +541,7 @@
 % restricted expandable functions can then be used in floating point
 % expressions just as they can be in other kinds of expressions.
 % Problematically, spaces stop \texttt{f}-expansion: for instance, the
-% macro~|\X| below will not be expanded if we simply perform
+% macro~|\X| below would not be expanded if we simply performed
 % \texttt{f}-expansion.
 % \begin{verbatim}
 %   \DeclareDocumentCommand {\test} {m} { \fp_eval:n {#1} }
@@ -548,15 +548,15 @@
 %   \ExplSyntaxOff
 %   \test { 1 + \X }
 % \end{verbatim}
-% Of course, spaces will not appear in a code setting, but may very
+% Of course, spaces typically do not appear in a code setting, but may very
 % easily come in document-level input, from which some expressions may
 % come.  To avoid this problem, at every step, we do essentially what
 % \cs{use:f} would do: take an argument, put it back in the input
 % stream, then \texttt{f}-expand it.  This is not a complete solution,
-% since a macro's expansion could contain leading spaces which will stop
+% since a macro's expansion could contain leading spaces which would stop
 % the \texttt{f}-expansion before further macro calls are performed.
 % However, in practice it should be enough: in particular, floating
-% point numbers will correctly be expanded to the underlying \cs{s_@@}
+% point numbers are correctly expanded to the underlying \cs{s_@@}
 % \ldots{} structure.  The \texttt{f}-expansion is performed by
 % \cs{@@_parse_expand:w}.
 %
@@ -722,7 +722,7 @@
 %   and |#2|~the first token of the operand.  We distinguish four cases:
 %   |#2|~is equal to \cs{scan_stop:} in meaning, |#2|~is a different
 %   control sequence, |#2|~is a digit, and |#2|~is something else (this
-%   last case will be split further).  Despite the earlier
+%   last case is split further later).  Despite the earlier
 %   \texttt{f}-expansion, |#2|~may still be expandable if it was
 %   protected by \cs{exp_not:N}, as may happen with the \LaTeXe{} command
 %   \tn{protect}.  Using a well placed \cs{reverse_if:N}, this case is
@@ -925,7 +925,7 @@
 %
 % \begin{macro}[aux, EXP]{\@@_parse_one_digit:NN}
 %   A digit marks the beginning of an explicit floating point number.
-%   Once the number is found, we will catch the case of overflow and
+%   Once the number is found, we catch the case of overflow and
 %   underflow with \cs{@@_sanitize:wN}, then
 %   \cs{@@_parse_infix_after_operand:NwN} expands \cs{@@_parse_infix:NN}
 %   after the number we find, to wrap the following infix operator as
@@ -1069,7 +1069,7 @@
 %
 % \subsubsection{Numbers: trimming leading zeros}
 %
-% Numbers will be parsed as follows: first we trim leading zeros, then
+% Numbers are parsed as follows: first we trim leading zeros, then
 % if the next character is a digit, start reading a significand $\geq 1$
 % with the set of functions |\__fp_parse_large|\ldots{}; if it is a
 % period, the significand is~$<1$; and otherwise it is zero.  In the
@@ -1150,8 +1150,8 @@
 %
 % \begin{macro}[aux, EXP]{\@@_parse_zero:}
 %   After reading a significand of~$0$, find any exponent, then put a
-%   sign of~|1| for \cs{@@_sanitize:wN}, which will remove everything
-%   and leave an exact zero.
+%   sign of~|1| for \cs{@@_sanitize:wN}, which removes everything
+%   and leaves an exact zero.
 %    \begin{macrocode}
 \cs_new:Npn \@@_parse_zero:
   {
@@ -1172,8 +1172,8 @@
 %   expanding) can only go up to $9$ digits.  Hence we grab digits in
 %   two steps of $8$ digits.  Since |#1| is a digit, read seven more
 %   digits using \cs{@@_parse_digits_vii:N}.  The \texttt{small_leading}
-%   auxiliary will leave those digits in the \cs{__int_value:w}, and
-%   grab some more, or stop if there are no more digits.  Then the
+%   auxiliary leaves those digits in the \cs{__int_value:w}, and
+%   grabs some more, or stops if there are no more digits.  Then the
 %   \texttt{pack_leading} auxiliary puts the various parts in the
 %   appropriate order for the processing further up.
 %    \begin{macrocode}
@@ -1471,7 +1471,7 @@
 %   {\@@_parse_small_round:NN, \@@_parse_round_after:wN}
 %   Here, |#1|~is the digit that we are currently rounding (we only care
 %   whether it is even or odd).  If |#2|~is not a digit, then fetch an
-%   exponent and expand to |;|\meta{exponent} only.  Otherwise, we will
+%   exponent and expand to |;|\meta{exponent} only.  Otherwise, we
 %   expand to |+0| or |+1|, then |;|\meta{exponent}.  To
 %   decide which, call \cs{@@_round_s:NNNw} to know whether to round up,
 %   giving it as arguments a sign~$0$ (all explicit numbers are
@@ -1842,7 +1842,7 @@
 % \begin{macro}[aux, EXP]
 %   {\@@_parse_prefix_(:Nw, \@@_parse_lparen_after:NwN}
 %   The left parenthesis is treated as a unary prefix operator because
-%   it appears in exactly the same settings.  Commas will be allowed if
+%   it appears in exactly the same settings.  Commas are allowed if
 %   the previous precedence is $16$ (function with multiple arguments).
 %   In this case, find an
 %   operand using the precedence~$1$; otherwise the precedence~$0$.
@@ -2028,7 +2028,7 @@
 % \begin{macro}[int, EXP]{\@@_parse:n}
 % \begin{macro}[aux, EXP]{\@@_parse_after:ww}
 %   Start an \cs{exp:w} expansion so that \cs{@@_parse:n} expands
-%   in two steps.  The \cs{@@_parse_operand:Nw} function will perform
+%   in two steps.  The \cs{@@_parse_operand:Nw} function performs
 %   computations until reaching an operation with precedence
 %   \cs{c_@@_prec_end_int} or less, namely, the end of the expression.  The
 %   marker \cs{s_@@_mark} indicates that the next token is an already
@@ -2654,7 +2654,7 @@
 %   is the role of \cs{@@_function_store:wwNwnn} and
 %   \cs{@@_function_store_end:wnnn}.  Then apply \cs{@@_parse:n} to the
 %   code~|#1| followed by a brace group with this token list.  This
-%   results in a floating point result, which will correctly be parsed
+%   results in a floating point result, which is then correctly parsed
 %   as the next operand of whatever was looking for one.  The trailing
 %   \cs{s_@@_mark} is used as a special infix operator to indicate that
 %   the next token has already gone through \cs{@@_parse_infix:NN}.

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -106,7 +106,7 @@
 %   setting~$n$ to (any multiple of) $2^{29}$ gives only even values.
 %   Thus it is only safe to call \cs{pdftex_uniformdeviate:D} with
 %   argument $2^{28}$.  This integer is also used in the implementation
-%   of \cs{int_rand:nn}.  We will also use variants of this number
+%   of \cs{int_rand:nn}.  We also use variants of this number
 %   rounded down to multiples of $10^4$ and $10^8$.
 %    \begin{macrocode}
 \cs_new:Npn \@@_rand_uniform:

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -89,7 +89,15 @@
 %     \@@_parse_round_deprecation_error:Nw
 %   }
 % \begin{macro}[aux, deprecated = 2017-12-31]{round+, round0, round-}
-%   This looks for |+|, |-|, |0| after |round|.  That syntax is deprecated.
+%   This looks for |+|, |-|, |0| after |round|.  That syntax was
+%   deprecated in 2013 but the system to tell users about deprecated
+%   syntax was not really available then, so we did not have anything
+%   set up.  When \pkg{l3doc} complains, remove the syntax by
+%   removing everything until the last \cs{fi:} in
+%   \cs{@@_parse_word_round:N} (and getting rid of the unused
+%   definitions of \cs{@@_parse_round:Nw} and
+%   \cs{@@_parse_round_deprecation_error:Nw} here and in
+%   \pkg{l3deprecation}, perhaps also of the |fp-deprecated| error).
 %    \begin{macrocode}
 \cs_new:Npn \@@_parse_word_round:N #1#2
   {
@@ -194,7 +202,7 @@
 %   correctly.  The result depends on the rounding mode.
 %
 %   It is very important that \meta{final sign} be the final sign of the
-%   result. Otherwise, the result will be incorrect in the case of
+%   result. Otherwise, the result would be incorrect in the case of
 %   rounding towards~$-\infty$ or towards~$+\infty$. Also recall that
 %   \meta{final sign} is~$0$ for positive, and~$2$ for negative.
 %
@@ -401,7 +409,7 @@
 %   The |trunc|, |ceil| and |floor| functions expect one or two
 %   arguments (the second is $0$ by default), and the |round| function
 %   also accepts a third argument (\texttt{nan} by default), which
-%   will change |#1| from \cs{@@_round_to_nearest:NNN} to one of its
+%   changes |#1| from \cs{@@_round_to_nearest:NNN} to one of its
 %   analogues.
 %    \begin{macrocode}
 \cs_new:Npn \@@_round_o:Nw #1#2 @

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 % \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-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -158,7 +158,7 @@
 %   an invalid operation exception with the appropriate function name.
 %   Otherwise, call the \texttt{trig} function to perform argument
 %   reduction and if necessary convert the reduced argument to radians.
-%   Then, \cs{@@_sin_series_o:NNwwww} will be called to compute the
+%   Then, \cs{@@_sin_series_o:NNwwww} is called to compute the
 %   Taylor series: this function receives a sign~|#3|, an initial octant
 %   of~$0$, and the function \cs{@@_ep_to_float_o:wwN} which converts the
 %   result of the series to a floating point directly rather than taking
@@ -187,7 +187,7 @@
 %   invalid operation exception.  The cosine of \nan{} is itself.
 %   Otherwise, the \texttt{trig} function reduces the argument to at
 %   most half a right-angle and converts if necessary to radians.  We
-%   will then call the same series as for sine, but using a positive
+%   then call the same series as for sine, but using a positive
 %   sign~|0| regardless of the sign of~$x$, and with an initial octant
 %   of~$2$, because $\cos(x) = + \sin(\pi/2 + \lvert x\rvert)$.
 %    \begin{macrocode}
@@ -382,7 +382,7 @@
 %   converts it to a fixed point number.  Some trailing digits may be
 %   lost in the conversion, so we keep the original floating point
 %   number around: when computing sine or tangent (or their inverses),
-%   the last step will be to multiply by the floating point number (as
+%   the last step is to multiply by the floating point number (as
 %   an extended-precision number) rather than the fixed point number.
 %   The period serves to end the integer expression for the octant.
 %    \begin{macrocode}
@@ -516,7 +516,7 @@
 % \begin{variable}[aux, EXP]{\@@_trig_inverse_two_pi:}
 %   This macro expands to |,,!| or~|,!| followed by $10112$~decimals of
 %   $10^{-16}/(2\pi)$.  The number of decimals we really need is the
-%   maximum exponent plus the number of digits we will need later,~$52$,
+%   maximum exponent plus the number of digits we later need,~$52$,
 %   plus~$12$ ($4-1$~groups of $4$~digits).  We store the decimals as a
 %   control sequence name, and convert it to a token list when required:
 %   strings take up less memory than their token list representation.
@@ -864,7 +864,7 @@
 %   \item the conversion function~|#1|;
 %   \item the final sign, which depends on the octant~|#3| and the
 %     sign~|#2|;
-%   \item the octant~|#3|, which will control the series we use;
+%   \item the octant~|#3|, which controls the series we use;
 %   \item the square |#4 * #4| of the argument as a fixed point number,
 %     computed with \cs{@@_fixed_mul:wwn};
 %   \item the number itself as an extended-precision number.
@@ -1046,7 +1046,7 @@
 % / x)$ is the angular coordinate of the point $(x, y)$.
 %
 % As for direct trigonometric functions, the first step in computing
-% $\operatorname{atan}(y, x)$ is argument reduction.  The sign of~$y$ will give that
+% $\operatorname{atan}(y, x)$ is argument reduction.  The sign of~$y$ gives that
 % of the result.  We distinguish eight regions where the point $(x,
 % \lvert y\rvert)$ can lie, of angular size roughly $\pi/8$,
 % characterized by their \enquote{octant}, between $0$ and~$7$ included.  In
@@ -1080,7 +1080,7 @@
 %   $\operatorname{atan}\frac{\lvert y\rvert}{x}
 %   = \pi-\operatorname{atan}\frac{\lvert y\rvert}{-x}$.
 % \end{itemize}
-% In the following, we will denote by~$z$ the ratio among
+% In the following, we denote by~$z$ the ratio among
 % $\lvert\frac{y}{x}\rvert$, $\lvert\frac{x}{y}\rvert$,
 % $\lvert\frac{x+y}{x-y}\rvert$, $\lvert\frac{x-y}{x+y}\rvert$ which
 % appears in the right-hand side above.
@@ -1171,8 +1171,8 @@
 %   \cs{@@_atan_combine_o:NwwwwwN}, with arguments the final sign~|#2|;
 %   the octant~|#3|; $\operatorname{atan} z/z=1$ as a fixed point number; $z=0$~as a
 %   fixed point number; and $z=0$~as an extended-precision number.
-%   Given the values we provide, $\operatorname{atan} z$ will be computed to be~$0$,
-%   and the result will be $[|#3|/2]\cdot\pi/4$ if the sign~|#5| of~$x$
+%   Given the values we provide, $\operatorname{atan} z$ is computed to be~$0$,
+%   and the result is $[|#3|/2]\cdot\pi/4$ if the sign~|#5| of~$x$
 %   is positive, and $[(7-|#3|)/2]\cdot\pi/4$ for negative~$x$, where
 %   the divisions are rounded up.
 %    \begin{macrocode}
@@ -1215,7 +1215,7 @@
 %   both as a fixed point number and as an extended-precision floating
 %   point number with a mantissa in $[0.01,1)$.  For now, we place |#1|
 %   as a first argument, and start an integer expression for the octant.
-%   The sign of $x$ does not affect what~$z$ will be, so we simply leave
+%   The sign of $x$ does not affect~$z$, so we simply leave
 %   a contribution to the octant: $\meta{octant} \to 7 - \meta{octant}$
 %   for negative~$x$.  Then we order $\lvert y\rvert$ and $\lvert
 %   x\rvert$ in a non-decreasing order: if $\lvert y\rvert > \lvert

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -47,7 +47,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -148,8 +148,8 @@
 %     \cs{fp_new:N} \meta{fp~var}
 %   \end{syntax}
 %   Creates a new \meta{fp~var} or raises an error if the name is
-%   already taken. The declaration is global. The \meta{fp~var} will
-%   initially be~$+0$.
+%   already taken. The declaration is global. The \meta{fp~var} is
+%   initially~$+0$.
 % \end{function}
 %
 % \begin{function}[updated = 2012-05-08, tested = m3fp001]
@@ -158,7 +158,7 @@
 %     \cs{fp_const:Nn} \meta{fp~var} \Arg{floating point expression}
 %   \end{syntax}
 %   Creates a new constant \meta{fp~var} or raises an error if the name
-%   is already taken. The \meta{fp~var} will be set globally equal to
+%   is already taken. The \meta{fp~var} is set globally equal to
 %   the result of evaluating the \meta{floating point expression}.
 % \end{function}
 %
@@ -319,7 +319,7 @@
 %   special values $\pm 0$, $\pm\infty$ and~\nan{} are rendered as
 %   |0|, |-0|, \texttt{inf}, \texttt{-inf}, and~\texttt{nan}
 %   respectively. Normal category codes apply and thus \texttt{inf} or
-%   \texttt{nan}, if produced, will be made up of letters.
+%   \texttt{nan}, if produced, are made up of letters.
 % \end{function}
 %
 % \begin{function}[EXP, updated = 2012-07-08]
@@ -428,8 +428,8 @@
 %   Places the \meta{code} in the input stream for \TeX{} to process,
 %   and then evaluates the relationship between the two \meta{floating
 %     point expressions} as described for \cs{fp_compare:nNnTF}.  If the
-%   test is \texttt{false} then the \meta{code} will be inserted into
-%   the input stream again and a loop will occur until the
+%   test is \texttt{false} then the \meta{code} is inserted into
+%   the input stream again and a loop occurs until the
 %   \meta{relation} is \texttt{true}.
 % \end{function}
 %
@@ -441,8 +441,8 @@
 %   Places the \meta{code} in the input stream for \TeX{} to process,
 %   and then evaluates the relationship between the two \meta{floating
 %     point expressions} as described for \cs{fp_compare:nNnTF}.  If the
-%   test is \texttt{true} then the \meta{code} will be inserted into the
-%   input stream again and a loop will occur until the \meta{relation}
+%   test is \texttt{true} then the \meta{code} is inserted into the
+%   input stream again and a loop occurs until the \meta{relation}
 %   is \texttt{false}.
 % \end{function}
 %
@@ -455,7 +455,7 @@
 %     expressions} as described for \cs{fp_compare:nNnTF}, and then
 %   places the \meta{code} in the input stream if the \meta{relation} is
 %   \texttt{false}.  After the \meta{code} has been processed by \TeX{}
-%   the test will be repeated, and a loop will occur until the test is
+%   the test is repeated, and a loop occurs until the test is
 %   \texttt{true}.
 % \end{function}
 %
@@ -468,7 +468,7 @@
 %     expressions} as described for \cs{fp_compare:nNnTF}, and then
 %   places the \meta{code} in the input stream if the \meta{relation} is
 %   \texttt{true}.  After the \meta{code} has been processed by \TeX{}
-%   the test will be repeated, and a loop will occur until the test is
+%   the test is repeated, and a loop occurs until the test is
 %   \texttt{false}.
 % \end{function}
 %
@@ -480,8 +480,8 @@
 %   Places the \meta{code} in the input stream for \TeX{} to process,
 %   and then evaluates the relationship between the two \meta{floating
 %     point expressions} as described for \cs{fp_compare:nTF}.  If the
-%   test is \texttt{false} then the \meta{code} will be inserted into
-%   the input stream again and a loop will occur until the
+%   test is \texttt{false} then the \meta{code} is inserted into
+%   the input stream again and a loop occurs until the
 %   \meta{relation} is \texttt{true}.
 % \end{function}
 %
@@ -493,8 +493,8 @@
 %   Places the \meta{code} in the input stream for \TeX{} to process,
 %   and then evaluates the relationship between the two \meta{floating
 %     point expressions} as described for \cs{fp_compare:nTF}.  If the
-%   test is \texttt{true} then the \meta{code} will be inserted into the
-%   input stream again and a loop will occur until the \meta{relation}
+%   test is \texttt{true} then the \meta{code} is inserted into the
+%   input stream again and a loop occurs until the \meta{relation}
 %   is \texttt{false}.
 % \end{function}
 %
@@ -507,7 +507,7 @@
 %     expressions} as described for \cs{fp_compare:nTF}, and then places
 %   the \meta{code} in the input stream if the \meta{relation} is
 %   \texttt{false}.  After the \meta{code} has been processed by \TeX{}
-%   the test will be repeated, and a loop will occur until the test is
+%   the test is repeated, and a loop occurs until the test is
 %   \texttt{true}.
 % \end{function}
 %
@@ -520,7 +520,7 @@
 %     expressions} as described for \cs{fp_compare:nTF}, and then places
 %   the \meta{code} in the input stream if the \meta{relation} is
 %   \texttt{true}.  After the \meta{code} has been processed by \TeX{}
-%   the test will be repeated, and a loop will occur until the test is
+%   the test is repeated, and a loop occurs until the test is
 %   \texttt{false}.
 % \end{function}
 %
@@ -789,7 +789,7 @@
 %   \item \texttt{inf} represents $+\infty$, and can be preceded by any
 %     \meta{sign}, yielding $\pm\infty$ as appropriate.
 %   \item \texttt{nan} represents a (quiet) non-number.  It can be
-%     preceded by any sign, but that will be ignored.
+%     preceded by any sign, but that sign is ignored.
 %   \item Any unrecognizable string triggers an error, and produces a
 %     \nan{}.
 % \end{itemize}
@@ -1005,13 +1005,13 @@
 %       multiple closest to $0$ is chosen (\enquote{ties to zero}),
 %       if $t$ is positive/negative the multiple closest to $\infty$/$-\infty$ is chosen
 %       (\enquote{ties towards positive/negative infinity}).
-%     \item |floor|, or the deprecated |round-|, yields the largest
+%     \item |floor| yields the largest
 %       multiple of~$10^{-n}$ smaller or equal to~$x$ (\enquote{round
 %         towards negative infinity});
-%     \item |ceil|, or the deprecated |round+|, yields the smallest
+%     \item |ceil| yields the smallest
 %       multiple of~$10^{-n}$ greater or equal to~$x$ (\enquote{round
 %         towards positive infinity});
-%     \item |trunc|, or the deprecated |round0|, yields a multiple
+%     \item |trunc| yields a multiple
 %       of~$10^{-n}$ with the same sign as~$x$ and with the largest
 %       absolute value less that that of~$x$ (\enquote{round towards
 %         zero}).

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -158,8 +158,8 @@
 %     \cs{int_new:N} \meta{integer}
 %   \end{syntax}
 %   Creates a new \meta{integer} or raises an error if the name is
-%   already taken. The declaration is global. The \meta{integer} will
-%   initially be equal to $0$.
+%   already taken. The declaration is global. The \meta{integer} is
+%   initially equal to $0$.
 % \end{function}
 %
 % \begin{function}[updated = 2011-10-22]{\int_const:Nn, \int_const:cn}
@@ -167,7 +167,7 @@
 %     \cs{int_const:Nn} \meta{integer} \Arg{integer expression}
 %   \end{syntax}
 %   Creates a new constant \meta{integer} or raises an error if the name
-%   is already taken. The value of the \meta{integer} will be set
+%   is already taken. The value of the \meta{integer} is set
 %   globally to the \meta{integer expression}.
 % \end{function}
 %
@@ -262,7 +262,7 @@
 %     \cs{int_use:N} \meta{integer}
 %   \end{syntax}
 %   Recovers the content of an \meta{integer} and places it directly
-%   in the input stream. An error will be raised if the variable does
+%   in the input stream. An error is raised if the variable does
 %   not exist or if it is invalid. Can be omitted in places where an
 %   \meta{integer} is required (such as in the first and third arguments
 %   of \cs{int_compare:nNnTF}).
@@ -350,7 +350,8 @@
 %   This function evaluates the \meta{test integer expression} and
 %   compares this in turn to each of the
 %   \meta{integer expression cases}. If the two are equal then the
-%   associated \meta{code} is left in the input stream. If any of 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
 %   input stream (after the code for the appropriate case), while if none
 %   match then the \meta{false code} is inserted. The function
@@ -366,7 +367,7 @@
 %       }
 %       { No idea! }
 %    \end{verbatim}
-%    will leave \enquote{\texttt{Medium}} in the input stream.
+%    leaves \enquote{\texttt{Medium}} in the input stream.
 % \end{function}
 %
 % \begin{function}[EXP,pTF]{\int_if_even:n, \int_if_odd:n}
@@ -389,8 +390,8 @@
 %   Places the \meta{code} in the input stream for \TeX{} to process, and
 %   then evaluates the relationship between the two
 %   \meta{integer expressions} as described for \cs{int_compare:nNnTF}.
-%   If the test is \texttt{false} then the \meta{code} will be inserted
-%   into the input stream again and a loop will occur until the
+%   If the test is \texttt{false} then the \meta{code} is inserted
+%   into the input stream again and a loop occurs until the
 %   \meta{relation} is \texttt{true}.
 % \end{function}
 %
@@ -401,8 +402,8 @@
 %   Places the \meta{code} in the input stream for \TeX{} to process, and
 %   then evaluates the relationship between the two
 %   \meta{integer expressions} as described for \cs{int_compare:nNnTF}.
-%   If the test is \texttt{true} then the \meta{code} will be inserted
-%   into the input stream again and a loop will occur until the
+%   If the test is \texttt{true} then the \meta{code} is inserted
+%   into the input stream again and a loop occurs until the
 %   \meta{relation} is \texttt{false}.
 % \end{function}
 %
@@ -414,7 +415,7 @@
 %   as described for \cs{int_compare:nNnTF}, and then places the
 %   \meta{code} in the input stream if the \meta{relation} is
 %   \texttt{false}. After the \meta{code} has been processed by \TeX{} the
-%   test will be repeated, and a loop will occur until the test is
+%   test is repeated, and a loop occurs until the test is
 %   \texttt{true}.
 % \end{function}
 %
@@ -426,7 +427,7 @@
 %   as described for \cs{int_compare:nNnTF}, and then places the
 %   \meta{code} in the input stream if the \meta{relation} is
 %   \texttt{true}. After the \meta{code} has been processed by \TeX{} the
-%   test will be repeated, and a loop will occur until the test is
+%   test is repeated, and a loop occurs until the test is
 %   \texttt{false}.
 % \end{function}
 %
@@ -437,8 +438,8 @@
 %   Places the \meta{code} in the input stream for \TeX{} to process, and
 %   then evaluates the \meta{integer relation}
 %   as described for \cs{int_compare:nTF}.
-%   If the test is \texttt{false} then the \meta{code} will be inserted
-%   into the input stream again and a loop will occur until the
+%   If the test is \texttt{false} then the \meta{code} is inserted
+%   into the input stream again and a loop occurs until the
 %   \meta{relation} is \texttt{true}.
 % \end{function}
 %
@@ -449,8 +450,8 @@
 %   Places the \meta{code} in the input stream for \TeX{} to process, and
 %   then evaluates the \meta{integer relation}
 %   as described for \cs{int_compare:nTF}.
-%   If the test is \texttt{true} then the \meta{code} will be inserted
-%   into the input stream again and a loop will occur until the
+%   If the test is \texttt{true} then the \meta{code} is inserted
+%   into the input stream again and a loop occurs until the
 %   \meta{relation} is \texttt{false}.
 % \end{function}
 %
@@ -462,7 +463,7 @@
 %   as described for \cs{int_compare:nTF}, and then places the
 %   \meta{code} in the input stream if the \meta{relation} is
 %   \texttt{false}. After the \meta{code} has been processed by \TeX{} the
-%   test will be repeated, and a loop will occur until the test is
+%   test is repeated, and a loop occurs until the test is
 %   \texttt{true}.
 % \end{function}
 %
@@ -474,7 +475,7 @@
 %   as described for \cs{int_compare:nTF}, and then places the
 %   \meta{code} in the input stream if the \meta{relation} is
 %   \texttt{true}. After the \meta{code} has been processed by \TeX{} the
-%   test will be repeated, and a loop will occur until the test is
+%   test is repeated, and a loop occurs until the test is
 %   \texttt{false}.
 % \end{function}
 %
@@ -586,8 +587,8 @@
 %     ~~\meta{value to symbol mapping}
 %   \end{syntax}
 %   This is the low-level function for conversion of an
-%   \meta{integer expression} into a symbolic form (which will often
-%   be letters). The \meta{total symbols} available should be given
+%   \meta{integer expression} into a symbolic form (often
+%   letters). The \meta{total symbols} available should be given
 %   as an integer expression. Values are actually converted to symbols
 %   according to the \meta{value to symbol mapping}. This should be given
 %   as \meta{total symbols} pairs of entries, a number and the
@@ -735,7 +736,7 @@
 %     numeral} is first converted to a string, with no expansion.  The
 %   \meta{roman numeral} may be in upper or lower case; if the numeral
 %   contains characters besides |mdclxvi| or |MDCLXVI| then the
-%   resulting value will be $-1$.  This is the inverse function of
+%   resulting value is $-1$.  This is the inverse function of
 %   \cs{int_to_roman:n} and \cs{int_to_Roman:n}.
 % \end{function}
 %
@@ -1317,7 +1318,7 @@
 % \UnitTested
 % \begin{macro}{\int_gset:Nn, \int_gset:cn}
 % \UnitTested
-%   As integers are register-based \TeX{} will issue an error
+%   As integers are register-based \TeX{} issues an error
 %   if they are not defined. Thus there is no need for the checking
 %   code seen with token list variables.
 %    \begin{macrocode}
@@ -1418,11 +1419,11 @@
 %   is at least one relation symbol.  We first let \TeX{} evaluate this
 %   left hand side of the (in)equality using \cs{@@_eval:w}.  Since the
 %   relation symbols |<|, |>|, |=| and |!| are not allowed in integer
-%   expressions, they will terminate it.  If the argument contains no
+%   expressions, they would terminate the expression.  If the argument contains no
 %   relation symbol, \cs{__prg_compare_error:} is expanded,
 %   inserting~|=| and itself after an error.  In all cases,
 %   \cs{@@_compare:w} receives as its argument an integer, a relation
-%   symbol, and some more tokens.  We then setup the loop, which will be
+%   symbol, and some more tokens.  We then setup the loop, which is
 %   ended by the two odd-looking items |e| and |{=nd_}|, with a trailing
 %   \cs{q_stop} used to grab the entire argument when necessary.
 %    \begin{macrocode}
@@ -1750,7 +1751,7 @@
 %   We put a \cs{__prg_break_point:Nn} so that \texttt{map_break}
 %   functions from other modules correctly decrement \cs{g__prg_map_int}
 %   before looking for their own break point.  The first argument is
-%   \cs{scan_stop:}, so no breaking function will recognize this break
+%   \cs{scan_stop:}, so that no breaking function recognizes this break
 %   point as its own.
 %    \begin{macrocode}
 \cs_new_protected:Npn \int_step_inline:nnnn
@@ -2093,7 +2094,7 @@
 % code $12$ (other). Usually, what is actually wanted is letters.
 % The approach here is to convert the output of the primitive into
 % letters using appropriate control sequence names. That keeps
-% everything expandable. The loop will be terminated by the conversion
+% everything expandable. The loop is terminated by the conversion
 % of the |Q|.
 %    \begin{macrocode}
 \cs_new:Npn \int_to_roman:n #1

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -86,7 +86,7 @@
 %     }
 % \end{verbatim}
 %
-% At a document level, \cs{keys_set:nn} will be used within a
+% At a document level, \cs{keys_set:nn} is used within a
 % document function, for example
 % \begin{verbatim}
 %   \DeclareDocumentCommand \MyModuleSetup { m }
@@ -102,7 +102,7 @@
 %
 % 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 will be discussed in
+% 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
@@ -114,7 +114,7 @@
 %       \l_mymodule_tmp_tl .code:n = code
 %     }
 % \end{verbatim}
-% will create a key called |\l_mymodule_tmp_tl|, and not one called
+% creates a key called |\l_mymodule_tmp_tl|, and not one called
 % \texttt{key}.
 %
 % \section{Creating keys}
@@ -154,9 +154,9 @@
 %
 % Key properties are applied in the reading order and so the ordering
 % is significant. Key properties which define \enquote{actions}, such
-% as |.code:n|, |.tl_set:N|, \emph{etc.}, will override one another.
+% as |.code:n|, |.tl_set:N|, \emph{etc.}, override one another.
 % Some other properties are mutually exclusive, notably |.value_required:n|
-% and |.value_forbidden:n|, and so will replace one another. However,
+% and |.value_forbidden:n|, and so they replace one another. However,
 % properties covering non-exclusive behaviours may be given in any order. Thus
 % for example the following definitions are equivalent.
 % \begin{verbatim}
@@ -172,7 +172,7 @@
 %     }
 % \end{verbatim}
 % Note that with the exception of the special |.undefine:| property, all
-% key properties will define the key within the current \TeX{} scope.
+% key properties define the key within the current \TeX{} scope.
 %
 % \begin{function}[updated = 2013-07-08]
 %   {.bool_set:N, .bool_set:c, .bool_gset:N, .bool_gset:c}
@@ -230,7 +230,7 @@
 %   Defines \meta{key} to set \meta{comma list variable} to \meta{value}.
 %   Spaces around commas and empty items will be stripped.
 %   If the variable does not exist, it
-%   will be created globally at the point that the key is set up.
+%   is created globally at the point that the key is set up.
 % \end{function}
 %
 % \begin{function}[updated = 2013-07-10]{.code:n}
@@ -240,7 +240,7 @@
 %   Stores the \meta{code} for execution when \meta{key} is used.
 %   The \meta{code} can include one parameter (|#1|), which will be the
 %   \meta{value} given for the \meta{key}. The \texttt{x}-type variant
-%   will expand \meta{code} at the point  where the \meta{key} is
+%   expands \meta{code} at the point  where the \meta{key} is
 %   created.
 % \end{function}
 %
@@ -268,7 +268,7 @@
 %   The default does not affect keys where values are required or
 %   forbidden. Thus a required value cannot be supplied by a default
 %   value, and giving a default value for a key which cannot take a value
-%   will not trigger an error.
+%   does not trigger an error.
 % \end{function}
 %
 % \begin{function}{.dim_set:N, .dim_set:c, .dim_gset:N, .dim_gset:c}
@@ -277,7 +277,7 @@
 %   \end{syntax}
 %   Defines \meta{key} to set \meta{dimension} to \meta{value} (which
 %   must a dimension expression).  If the variable does not exist, it
-%   will be created globally at the point that the key is set up.
+%   is created globally at the point that the key is set up.
 % \end{function}
 %
 % \begin{function}{.fp_set:N, .fp_set:c, .fp_gset:N, .fp_gset:c}
@@ -286,7 +286,7 @@
 %   \end{syntax}
 %   Defines \meta{key} to set \meta{floating point} to \meta{value}
 %   (which must a floating point expression).  If the variable does not exist,
-%   it will be created globally at the point that the key is set up.
+%   it is created globally at the point that the key is set up.
 % \end{function}
 %
 % \begin{function}[added = 2013-07-14]
@@ -304,7 +304,7 @@
 %     \meta{key} .inherit:n = \Arg{parents}
 %   \end{syntax}
 %   Specifies that the \meta{key} path should inherit the keys listed
-%   as \meta{parents}. For example, with setting
+%   as \meta{parents}. For example, after setting
 %   \begin{verbatim}
 %     \keys_define:n { foo } { test .code:n = \tl_show:n {#1} }
 %     \keys_define:n { } { bar .inherit:n = foo }
@@ -336,7 +336,7 @@
 %   \end{syntax}
 %   Defines \meta{key} to set \meta{integer} to \meta{value} (which
 %   must be an integer expression).  If the variable does not exist, it
-%   will be created globally at the point that the key is set up.
+%   is created globally at the point that the key is set up.
 % \end{function}
 %
 % \begin{function}[updated = 2013-07-10]{.meta:n}
@@ -389,7 +389,7 @@
 %   \end{syntax}
 %   Defines \meta{key} to set \meta{skip} to \meta{value} (which
 %   must be a skip expression). If the variable does not exist, it
-%   will be created globally at the point that the key is set up.
+%   is created globally at the point that the key is set up.
 % \end{function}
 %
 % \begin{function}{.tl_set:N, .tl_set:c, .tl_gset:N, .tl_gset:c}
@@ -397,7 +397,7 @@
 %     \meta{key} .tl_set:N = \meta{token list variable}
 %   \end{syntax}
 %   Defines \meta{key} to set \meta{token list variable} to \meta{value}.
-%   If the variable does not exist, it will be created globally
+%   If the variable does not exist, it is created globally
 %   at the point that the key is set up.
 % \end{function}
 %
@@ -408,7 +408,7 @@
 %   Defines \meta{key} to set \meta{token list variable} to \meta{value},
 %   which will be subjected to an \texttt{x}-type expansion
 %   (\emph{i.e.}~using \cs{tl_set:Nx}). If the variable does not exist,
-%   it will be created globally at the point that the key is set up.
+%   it is created globally at the point that the key is set up.
 % \end{function}
 %
 % \begin{function}[added = 2015-07-14]{.undefine:}
@@ -424,7 +424,7 @@
 %   \end{syntax}
 %   Specifies that \meta{key} cannot receive a \meta{value} when used.
 %   If a \meta{value} is given then an error will be issued. Setting
-%   the property \texttt{false} will cancel the restriction.
+%   the property \texttt{false} cancels the restriction.
 % \end{function}
 %
 % \begin{function}[added = 2015-07-14]{.value_required:n}
@@ -433,7 +433,7 @@
 %   \end{syntax}
 %   Specifies that \meta{key} must receive a \meta{value} when used.
 %   If a \meta{value} is not given then an error will be issued. Setting
-%   the property \texttt{false} will cancel the restriction.
+%   the property \texttt{false} cancels the restriction.
 % \end{function}
 %
 % \section{Sub-dividing keys}
@@ -456,7 +456,7 @@
 % used to represent keys internally. Both of the above code fragments
 % set the same key, which has full name \texttt{module/subgroup/key}.
 %
-% As will be illustrated in the next section, this subdivision is
+% As illustrated in the next section, this subdivision is
 % particularly relevant to making multiple choices.
 %
 % \section{Choice and multiple choice keys}
@@ -606,7 +606,7 @@
 %   \end{syntax}
 %   Parses the \meta{keyval list}, and sets those keys which are defined
 %   for \meta{module}. The behaviour on finding an unknown key can be set
-%   by defining a special \texttt{unknown} key: this will be illustrated
+%   by defining a special \texttt{unknown} key: this is illustrated
 %   later.
 % \end{function}
 %
@@ -634,18 +634,18 @@
 %   has path \texttt{mymodule/subset/key-a}. This information is stored in
 %   \cs{l_keys_path_tl}, and will have been processed by \cs{tl_to_str:n}.
 %
-%    The \emph{name} of the key is the part of the path after the last
-%    \texttt{/}, and thus is not unique. In the preceding examples, both keys
-%    have name \texttt{key-a} despite having different paths.  This information
-%    is stored in \cs{l_keys_key_tl}, and will have been processed by
-%    \cs{tl_to_str:n}.
+%   The \emph{name} of the key is the part of the path after the last
+%   \texttt{/}, and thus is not unique. In the preceding examples, both keys
+%   have name \texttt{key-a} despite having different paths.  This information
+%   is stored in \cs{l_keys_key_tl}, and will have been processed by
+%   \cs{tl_to_str:n}.
 % \end{variable}
 %
 % \section{Handling of unknown keys}
 % \label{sec:l3keys:unknown}
 %
-% If a key has not previously been defined (is unknown), \cs{keys_set:nn} will
-% look for a special \texttt{unknown} key for the same module, and if this is
+% If a key has not previously been defined (is unknown), \cs{keys_set:nn}
+% looks for a special \texttt{unknown} key for the same module, and if this is
 % not defined raises an error indicating that the key name was unknown. This
 % mechanism can be used for example to issue custom error texts.
 % \begin{verbatim}
@@ -671,7 +671,7 @@
 %   \cs{keys_set_known:nnN} function parses the \meta{keyval list}, and sets
 %   those keys which are defined for \meta{module}. Any keys which are unknown
 %   are not processed further by the parser.
-%   The key--value pairs for each \emph{unknown} key name will be
+%   The key--value pairs for each \emph{unknown} key name are
 %   stored in the \meta{tl} in a comma-separated form (\emph{i.e.}~an edited
 %   version of the \meta{keyval list}). The \cs{keys_set_known:nn} version
 %   skips this stage.
@@ -695,7 +695,7 @@
 %       key-four  .fp_set:N = \l_my_a_fp          ,
 %     }
 % \end{verbatim}
-% the use of \cs{keys_set:nn} will attempt to set all four keys. However, in
+% the use of \cs{keys_set:nn} attempts to set all four keys. However, in
 % some contexts it may only be sensible to set some keys, or to control the
 % order of setting. To do this, keys may be assigned to \emph{groups}:
 % arbitrary sets which are independent of the key tree. Thus modifying the
@@ -712,7 +712,7 @@
 %       key-four  .fp_set:N = \l_my_a_fp          ,
 %     }
 % \end{verbatim}
-% will assign \texttt{key-one} and \texttt{key-two} to group \texttt{first},
+% assigns \texttt{key-one} and \texttt{key-two} to group \texttt{first},
 % \texttt{key-three} to group \texttt{second}, while \texttt{key-four} is
 % not assigned to a group.
 %
@@ -730,11 +730,11 @@
 %   \begin{syntax}
 %     \cs{keys_set_filter:nnnN} \Arg{module} \Arg{groups} \Arg{keyval list} \meta{tl}
 %   \end{syntax}
-%   Actives key filtering in an \enquote{opt-out} sense: keys assigned to any
-%   of the \meta{groups} specified will be ignored. The \meta{groups} are
+%   Activates key filtering in an \enquote{opt-out} sense: keys assigned to any
+%   of the \meta{groups} specified are ignored. The \meta{groups} are
 %   given as a comma-separated list. Unknown keys are not assigned to any
-%   group and will thus always be set. The key--value pairs for each
-%   key which is filtered out will be stored in the \meta{tl} in a
+%   group and are thus always set. The key--value pairs for each
+%   key which is filtered out are stored in the \meta{tl} in a
 %   comma-separated form (\emph{i.e.}~an edited version of the \meta{keyval
 %   list}). The \cs{keys_set_filter:nnn} version skips this stage.
 %
@@ -750,10 +750,10 @@
 %   \begin{syntax}
 %     \cs{keys_set_groups:nnn} \Arg{module} \Arg{groups} \Arg{keyval list}
 %   \end{syntax}
-%   Actives key filtering in an \enquote{opt-in} sense: only keys assigned to
-%   one or more of the \meta{groups} specified will be set. The \meta{groups} are
+%   Activates key filtering in an \enquote{opt-in} sense: only keys assigned to
+%   one or more of the \meta{groups} specified are set. The \meta{groups} are
 %   given as a comma-separated list. Unknown keys are not assigned to any
-%   group and will thus never be set.
+%   group and are thus never set.
 % \end{function}
 %
 % \section{Utility functions for keys}
@@ -829,7 +829,7 @@
 % to category \enquote{other} (12) so that the parser does not \enquote{miss}
 % any due to category code changes. Spaces are removed from the ends
 % of the keys and values. Keys and values which are given in braces
-% will have exactly one set removed (after space trimming), thus
+% have exactly one set removed (after space trimming), thus
 % \begin{verbatim}
 %    key = {value here},
 % \end{verbatim}
@@ -848,15 +848,15 @@
 %   given).  \meta{function_1} should take one argument, while
 %   \meta{function_2} should absorb two arguments. After
 %   \cs{keyval_parse:NNn} has parsed the \meta{key--value list},
-%   \meta{function_1} will be used to process keys given with no value
-%   and \meta{function_2} will be used to process keys given with a
+%   \meta{function_1} is used to process keys given with no value
+%   and \meta{function_2} is used to process keys given with a
 %   value. The order of the \meta{keys} in the \meta{key--value list}
-%   will be preserved. Thus
+%   is preserved. Thus
 %   \begin{verbatim}
 %     \keyval_parse:NNn \function:n \function:nn
 %       { key1 = value1 , key2 = value2, key3 = , key4 }
 %   \end{verbatim}
-%   will be converted into an input stream
+%   is converted into an input stream
 %   \begin{verbatim}
 %     \function:nn { key1 } { value1 }
 %     \function:nn { key2 } { value2 }
@@ -1363,7 +1363,7 @@
 %   the function. If not, then a check to make sure there is no need for
 %   a value with the property. If there should be one then complain,
 %   otherwise execute it. There is no need to check for a |:| as if it
-%   is missing the earlier tests will have failed.
+%   was missing the earlier tests would have failed.
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_define_code:n #1
   {
@@ -1511,15 +1511,17 @@
 %
 % \begin{macro}[int]
 %   {\@@_cmd_set:nn, \@@_cmd_set:nx, \@@_cmd_set:Vn, \@@_cmd_set:Vo}
-%   Setting the code for a key first checks that the basic data structures
-%   exist, then saves the code.
+%   Setting the code for a key first logs if appropriate that we are
+%   defining a new key, then saves the code.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_cmd_set:nn #1#2
+\__debug_patch:nnNw
   {
     \cs_if_exist:cF { \c_@@_code_root_tl #1 }
-      { \__chk_log:x { Defining~key~#1~\msg_line_context: } }
-    \cs_set_protected:cpn { \c_@@_code_root_tl #1 } ##1 {#2}
+      { \__debug_log:x { Defining~key~#1~\msg_line_context: } }
   }
+  { }
+\cs_new_protected:Npn \@@_cmd_set:nn #1#2
+  { \cs_set_protected:cpn { \c_@@_code_root_tl #1 } ##1 {#2} }
 \cs_generate_variant:Nn \@@_cmd_set:nn { nx , Vn , Vo }
 %    \end{macrocode}
 % \end{macro}
@@ -1549,7 +1551,8 @@
 %   Assigning a key to one or more groups uses comma lists. As the list of
 %   groups only exists if there is anything to do, the setting is done using
 %   a scratch list. For the usual grouping reasons we use the low-level
-%   approach to undefining a list.
+%   approach to undefining a list.  We also use the low-level approach for
+%   the other case to avoid tripping up the |check-declarations| code.
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_groups_set:n #1
   {
@@ -1560,7 +1563,7 @@
           \tex_undefined:D
       }
       {
-        \clist_set_eq:cN { \c_@@_groups_root_tl \l_keys_path_tl }
+        \cs_set_eq:cN { \c_@@_groups_root_tl \l_keys_path_tl }
           \l_@@_groups_clist
       }
   }
@@ -1757,7 +1760,7 @@
 % \begin{macro}
 %   {.choices:nn, .choices:Vn, .choices:on, .choices:xn}
 %   For auto-generation of a series of mutually-exclusive choices.
-%   Here, |#1| will consist of two separate
+%   Here, |#1| consists of two separate
 %   arguments, hence the slightly odd-looking implementation.
 %    \begin{macrocode}
 \cs_new_protected:cpn { \c_@@_props_root_tl .choices:nn } #1
@@ -2368,7 +2371,7 @@
 % \begin{macro}[int, EXP]{\@@_choice_find:n}
 % \begin{macro}[int, EXP]{\@@_multichoice_find:n}
 %   Executing a choice has two parts. First, try the choice given, then
-%   if that fails call the unknown key. That will exist, as it is created
+%   if that fails call the unknown key. That always exists, as it is created
 %   when a choice is first made. So there is no need for any escape code.
 %   For multiple choices, the same code ends up used in a mapping.
 %    \begin{macrocode}
@@ -2456,7 +2459,7 @@
 %   (same message, but with a |t| or |f| argument, then build the
 %   control sequences which contain the code and other information
 %   about the key, call an intermediate auxiliary which constructs the
-%   code that will be displayed to the terminal, and finally conclude
+%   code to be displayed to the terminal, and finally conclude
 %   with \cs{__msg_show_wrap:n}.
 %    \begin{macrocode}
 \cs_new_protected:Npn \keys_show:nn #1#2

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -52,9 +52,9 @@
 % The \LuaTeX{} engine provides access to the \Lua{} programming language,
 % and with it access to the \enquote{internals} of \TeX{}. In order to use
 % this within the framework provided here, a family of functions is
-% available. When used with \pdfTeX{} or \XeTeX{} these will raise an
-% error: use \cs{sys_if_engine_luatex:T} to avoid this. Details of coding
-% the \LuaTeX{} engine are detailed in the \LuaTeX{} manual.
+% available. When used with \pdfTeX{} or \XeTeX{} these raise an
+% error: use \cs{sys_if_engine_luatex:T} to avoid this. Details on using
+% \Lua{} with the \LuaTeX{} engine are given in the \LuaTeX{} manual.
 %
 % \subsection{\TeX{} code interfaces}
 %
@@ -62,12 +62,12 @@
 %   \begin{syntax}
 %     \cs{lua_now:n} \Arg{token list}
 %   \end{syntax}
-%   The \meta{token list} is first tokenized by \TeX{}, which will include
+%   The \meta{token list} is first tokenized by \TeX{}, which includes
 %   converting line ends to spaces in the usual \TeX{} manner and which
 %   respects currently-applicable \TeX{} category codes. The resulting
 %   \meta{\Lua{} input} is passed to the \Lua{} interpreter for processing.
 %   Each \cs{lua_now:n} block is treated by \Lua{} as a separate chunk.
-%   The \Lua{} interpreter will execute the \meta{\Lua{} input} immediately,
+%   The \Lua{} interpreter executes the \meta{\Lua{} input} immediately,
 %   and in an expandable manner.
 %
 %   In the case of the \cs{lua_now_x:n} version the input is fully expanded
@@ -75,7 +75,7 @@
 %   fully expandable.
 %   \begin{texnote}
 %     \cs{lua_now_x:n} is a macro wrapper around \tn{directlua}: when
-%     \LuaTeX{} is in use two expansions will be required to yield the
+%     \LuaTeX{} is in use two expansions are required to yield the
 %     result of the \Lua{} code.
 %   \end{texnote}
 % \end{function}
@@ -84,7 +84,7 @@
 %   \begin{syntax}
 %     \cs{lua_shipout:n} \Arg{token list}
 %   \end{syntax}
-%   The \meta{token list} is first tokenized by \TeX{}, which will include
+%   The \meta{token list} is first tokenized by \TeX{}, which includes
 %   converting line ends to spaces in the usual \TeX{} manner and which
 %   respects currently-applicable \TeX{} category codes.  The resulting
 %   \meta{\Lua{} input} is passed to the \Lua{} interpreter when the
@@ -118,7 +118,7 @@
 %   fully expandable.
 %   \begin{texnote}
 %     \cs{lua_escape_x:n} is a macro wrapper around \tn{luaescapestring}:
-%     when \LuaTeX{} is in use two expansions will be required to yield the
+%     when \LuaTeX{} is in use two expansions are required to yield the
 %     result of the \Lua{} code.
 %   \end{texnote}
 % \end{function}
@@ -128,6 +128,41 @@
 % As well as interfaces for \TeX{}, there are a small number of Lua functions
 % provided here. Currently these are intended for internal use only.
 %
+% \begin{function}{l3kernel.charcat}
+%   \begin{syntax}
+%     \cs{l3kernel.charcat}|(|\meta{charcode}, \meta{catcode}|)|
+%   \end{syntax}
+%   Constructs a character of \meta{charcode} and \meta{catcode} and returns
+%   the result to \TeX{}.
+% \end{function}
+%
+% \begin{function}{l3kernel.filemdfivesum}
+%   \begin{syntax}
+%     \cs{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}.
+% \end{function}
+%
+% \begin{function}{l3kernel.filemoddate}
+%   \begin{syntax}
+%     \cs{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
+%   \meta{second}\meta{offset}, where the latter may be |Z| (UTC) or
+%   \meta{plus-minus}\meta{hours}|'|\meta{minutes}|'|. If the \meta{file} is
+%   not found, nothing is returned with \emph{no error raised}.
+% \end{function}
+%
+% \begin{function}{l3kernel.filesize}
+%   \begin{syntax}
+%     \cs{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}.
+% \end{function}
+%
 % \begin{function}{l3kernel.strcmp}
 %   \begin{syntax}
 %     \cs{l3kernel.strcmp}|(|\meta{str one}, \meta{str two}|)|
@@ -136,14 +171,6 @@
 %   if the two are identical.
 % \end{function}
 %
-% \begin{function}{l3kernel.charcat}
-%   \begin{syntax}
-%     \cs{l3kernel.charcat}|(|\meta{charcode}, \meta{catcode}|)|
-%   \end{syntax}
-%   Constructs a character of \meta{charcode} and \meta{catcode} and returns
-%   the result to \TeX{}.
-% \end{function}
-%
 % \end{documentation}
 %
 % \begin{implementation}
@@ -221,6 +248,9 @@
 %<*lua>
 %    \end{macrocode}
 %
+% Most of the emulation of \pdfTeX{} here is based heavily on Heiko Oberdiek's
+% \pkg{pdftexcmds} package.
+%
 % \begin{macro}[int]{l3kernel}
 %   Create a table for the kernel's own use.
 %    \begin{macrocode}
@@ -228,29 +258,47 @@
 %    \end{macrocode}
 % \end{macro}
 %
-%   Various local copies of standard functions: naming convention is to retain
-%   the full text but replace all |.| by |_|. 
+%   Local copies of global tables.
 %    \begin{macrocode}
-local tex_setcatcode    = tex.setcatcode
-local tex_sprint        = tex.sprint
-local tex_write         = tex.write
-local unicode_utf8_char = unicode.utf8.char
+local io      = io
+local kpse    = kpse
+local lfs     = lfs
+local math    = math
+local md5     = md5
+local os      = os
+local string  = string
+local tex     = tex
+local unicode = unicode
 %    \end{macrocode}
 %
-% \begin{macro}[int]{l3kernel.strcmp}
-%   String comparison which gives the same results as \pdfTeX{}'s
-%   \tn{pdfstrcmp}, although the ordering should likely not be relied upon!
+%   Local copies of standard functions.
 %    \begin{macrocode}
-local function strcmp (A, B)
-  if A == B then
-    tex_write("0")
-  elseif A < B then
-    tex_write("-1")
-  else
-    tex_write("1")
-  end
+local abs        = math.abs
+local byte       = string.byte
+local floor      = math.floor
+local format     = string.format
+local gsub       = string.gsub
+local kpse_find  = kpse.find_file
+local lfs_attr   = lfs.attributes
+local md5_sum    = md5.sum
+local open       = io.open
+local os_date    = os.date
+local setcatcode = tex.setcatcode
+local str_format = string.format
+local sprint     = tex.sprint
+local write      = tex.write
+local utf8_char  = unicode.utf8.char
+%    \end{macrocode}
+%
+% \begin{macro}[aux]{escapehex}
+%   An internal auxiliary to convert a string to the matching hex escape.
+%   This works on a byte basis: extension to handled UTF-8 input is
+%   covered in \pkg{pdftexcmds} but is not currently required here.
+%    \begin{macrocode}
+local function escapehex(str)
+  write((gsub(str, ".",
+    function (ch) return format("%02X", byte(ch)) end)))
 end
-l3kernel.strcmp = strcmp
 %    \end{macrocode}
 % \end{macro}
 %
@@ -261,14 +309,120 @@
 %   to match an eventual allocator.
 %    \begin{macrocode}
 local charcat_table = l3kernel.charcat_table or 1
-local function charcat (charcode, catcode)
-  tex_setcatcode(charcat_table, charcode, catcode)
-  tex_sprint(charcat_table, unicode_utf8_char(charcode))
+local function charcat(charcode, catcode)
+  setcatcode(charcat_table, charcode, catcode)
+  sprint(charcat_table, utf8_char(charcode))
 end
 l3kernel.charcat = charcat
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}[int]{l3kernel.filemdfivesum}
+%   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{}).
+%    \begin{macrocode}
+local function filemdfivesum(name)
+  local file =  kpse_find(name, "tex", true)
+  if file then
+    local f = open(file, "r")
+    if f then
+      local data = f:read("*a")
+      escapehex(md5_sum(data))
+      f:close()
+    end
+  end
+end
+l3kernel.filemdfivesum = filemdfivesum
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{l3kernel.filemoddate}
+%   See procedure \texttt{makepdftime} in \texttt{utils.c} of
+%   \pdfTeX{}.
+%    \begin{macrocode}
+local function filemoddate(name)
+  local file =  kpse_find(name, "tex", true)
+  if file then
+    local date = lfs_attr(file, "modification")
+    if date then
+      local d = os_date("*t", date)
+      if d.sec >= 60 then
+        d.sec = 59
+      end
+      local u = os_date("!*t", date)
+      local off = 60 * (d.hour - u.hour) + d.min - u.min
+      if d.year ~= u.year then
+        if d.year > u.year then
+          off = off + 1440
+        else
+          off = off - 1440
+        end
+      elseif d.yday ~= u.yday then
+        if d.yday > u.yday then
+          off = off + 1440
+        else
+          off = off - 1440
+        end
+      end
+      local timezone
+      if off == 0 then
+        timezone = "Z"
+      else
+        local hours = floor(off / 60)
+        local mins  = abs(off - hours * 60)
+        timezone = str_format("%+03d", hours)
+          .. "'" .. str_format("%02d", mins) .. "'"
+      end
+      write("D:"
+        .. str_format("%04d", d.year)
+        .. str_format("%02d", d.month)
+        .. str_format("%02d", d.day)
+        .. str_format("%02d", d.hour)
+        .. str_format("%02d", d.min)
+        .. str_format("%02d", d.sec)
+        .. timezone)
+    end
+  end
+end
+l3kernel.filemoddate = filemoddate
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{l3kernel.filesize}
+%   A simple disk lookup.
+%    \begin{macrocode}
+local function filesize(name)
+  local file =  kpse_find(name, "tex", true)
+  if file then
+    local size = lfs_attr(file, "size")
+    if size then
+      write(size)
+    end
+  end
+end
+l3kernel.filesize = filesize
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{l3kernel.strcmp}
+%   String comparison which gives the same results as \pdfTeX{}'s
+%   \tn{pdfstrcmp}, although the ordering should likely not be relied upon!
+%    \begin{macrocode}
+local function strcmp(A, B)
+  if A == B then
+    write("0")
+  elseif A < B then
+    write("-1")
+  else
+    write("1")
+  end
+end
+l3kernel.strcmp = strcmp
+%    \end{macrocode}
+% \end{macro}
+%
 % \subsection{Generic \Lua{} and font support}
 %
 %    \begin{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -72,9 +72,9 @@
 % \section{Creating new messages}
 %
 % All messages have to be created before they can be used.
-% The text of messages will automatically by wrapped to the length
+% The text of messages is automatically wrapped to the length
 % available in the console. As a result, formatting is only needed
-% where it will help to show meaning. In particular, |\\| may be
+% where it helps to show meaning. In particular, |\\| may be
 % used to force a new line and \verb*|\ | forces an explicit space.
 % Additionally, |\{|, |\#|, |\}|, |\%| and |\~| can be used to produce
 % the corresponding character.
@@ -87,8 +87,7 @@
 % \begin{verbatim}
 %   \msg_new:nnnn { mymodule } { submodule / message } ...
 % \end{verbatim}
-% will allow only those messages from the \texttt{submodule} to be filtered
-% out.
+% will allow to filter out specifically messages from the \texttt{submodule}.
 %
 % \begin{function}[updated = 2011-08-16]{\msg_new:nnnn, \msg_new:nnn}
 %   \begin{syntax}
@@ -95,12 +94,12 @@
 %     \cs{msg_new:nnnn} \Arg{module} \Arg{message} \Arg{text} \Arg{more text}
 %   \end{syntax}
 %   Creates a \meta{message} for a given \meta{module}.
-%   The message will be defined to first give \meta{text} and then
+%   The message is defined to first give \meta{text} and then
 %   \meta{more text} if the user requests it. If no \meta{more text} is
 %   available then a standard text is given instead. Within \meta{text}
 %   and \meta{more text} four parameters (|#1| to |#4|) can be used:
 %   these will be supplied at the time the message is
-%   used. An error will be raised if the \meta{message} already exists.
+%   used. An error is raised if the \meta{message} already exists.
 % \end{function}
 %
 % \begin{function}{\msg_set:nnnn, \msg_set:nnn, \msg_gset:nnnn, \msg_gset:nnn}
@@ -108,7 +107,7 @@
 %     \cs{msg_set:nnnn} \Arg{module} \Arg{message} \Arg{text} \Arg{more text}
 %   \end{syntax}
 %   Sets up the text for a \meta{message} for a given \meta{module}.
-%   The message will be defined to first give \meta{text} and then
+%   The message is defined to first give \meta{text} and then
 %   \meta{more text} if the user requests it. If no \meta{more text} is
 %   available then a standard text is given instead. Within \meta{text}
 %   and \meta{more text} four parameters (|#1| to |#4|) can be used:
@@ -232,9 +231,9 @@
 % Messages behave differently depending on the message class. In all cases,
 % the message may be issued supplying~$0$ to~$4$ arguments.  If the number of
 % arguments supplied here does not match the number in the definition of the
-% message, extra arguments will be ignored, or empty arguments added (of
-% course the sense of the message may be impaired). The four arguments will
-% be converted to strings before being added to the message text: the
+% message, extra arguments are ignored, or empty arguments added (of
+% course the sense of the message may be impaired). The four arguments are
+% converted to strings before being added to the message text: the
 % \texttt{x}-type variants should be used to expand material.
 %
 % \begin{function}[updated = 2012-08-11]
@@ -254,7 +253,7 @@
 %   \end{syntax}
 %   Issues \meta{module} error \meta{message}, passing \meta{arg one} to
 %   \meta{arg four} to the text-creating functions. After issuing a
-%   fatal error the \TeX{} run will halt.
+%   fatal error the \TeX{} run halts.
 % \end{function}
 %
 % \begin{function}[updated = 2012-08-11]
@@ -274,7 +273,7 @@
 %   \end{syntax}
 %   Issues \meta{module} error \meta{message}, passing \meta{arg one} to
 %   \meta{arg four} to the text-creating functions.  After issuing a
-%   critical error, \TeX{} will stop reading the current input file.
+%   critical error, \TeX{} stops reading the current input file.
 %   This may halt the \TeX{} run (if the current file is the main file)
 %   or may abort reading a sub-file.
 %   \begin{texnote}
@@ -300,9 +299,9 @@
 %     \cs{msg_error:nnnnnn} \Arg{module} \Arg{message} \Arg{arg one} \Arg{arg two} \Arg{arg three} \Arg{arg four}
 %   \end{syntax}
 %   Issues \meta{module} error \meta{message}, passing \meta{arg one} to
-%   \meta{arg four} to the text-creating functions.  The error will
-%   interrupt processing and issue the text at the terminal.  After user
-%   input, the run will continue.
+%   \meta{arg four} to the text-creating functions.  The error
+%   interrupts processing and issues the text at the terminal.  After user
+%   input, the run continues.
 % \end{function}
 %
 % \begin{function}[updated = 2012-08-11]
@@ -322,8 +321,8 @@
 %   \end{syntax}
 %   Issues \meta{module} warning \meta{message}, passing \meta{arg one}
 %   to \meta{arg four} to the text-creating functions. The warning text
-%   will be added to the log file and the terminal, but the \TeX{} run
-%   will not be interrupted.
+%   is added to the log file and the terminal, but the \TeX{} run
+%   is not interrupted.
 % \end{function}
 %
 % \begin{function}[updated = 2012-08-11]
@@ -343,7 +342,7 @@
 %   \end{syntax}
 %   Issues \meta{module} information \meta{message}, passing
 %   \meta{arg one} to \meta{arg four} to the text-creating functions.
-%   The information text will be added to the log file.
+%   The information text is added to the log file.
 % \end{function}
 %
 % \begin{function}[updated = 2012-08-11]
@@ -363,7 +362,7 @@
 %   \end{syntax}
 %   Issues \meta{module} information \meta{message}, passing
 %   \meta{arg one} to \meta{arg four} to the text-creating functions.
-%   The information text will be added to the log file: the output
+%   The information text is added to the log file: the output
 %   is briefer than \cs{msg_info:nnnnnn}.
 % \end{function}
 %
@@ -397,7 +396,7 @@
 % \begin{verbatim}
 %   \msg_error:nn { module } { my-message }
 % \end{verbatim}
-% when it is used. With no filtering, this will raise an error. However, we
+% when it is used. With no filtering, this raises an error. However, we
 % could alter the behaviour with
 % \begin{verbatim}
 %   \msg_redirect_class:nn { error } { warning }
@@ -417,7 +416,7 @@
 %
 % Multiple redirections are possible.  Redirections can be cancelled by
 % providing an empty argument for the target class.  Redirection to a
-% missing class will raise errors immediately.  Infinite loops are
+% missing class raises an error immediately.  Infinite loops are
 % prevented by eliminating the redirection starting from the target of
 % the redirection that caused the loop to appear.  Namely, if
 % redirections are requested as $A \to B$, $B \to C$ and $C \to A$ in
@@ -479,9 +478,9 @@
 %     ! <text>
 %     !...............................................
 %   \end{verbatim}
-%   where the \meta{text} will be wrapped to fit within the current
+%   where the \meta{text} is wrapped to fit within the current
 %   line length. The user may then request more information, at which
-%   stage the \meta{extra text} will be shown in the terminal in the
+%   stage the \meta{extra text} is shown in the terminal in the
 %   format
 %   \begin{verbatim}
 %     |'''''''''''''''''''''''''''''''''''''''''''''''
@@ -488,7 +487,7 @@
 %     |  <extra text>
 %     |...............................................
 %   \end{verbatim}
-%   where the \meta{extra text} will be wrapped within the current
+%   where the \meta{extra text} is wrapped within the current
 %   line length. Wrapping of both \meta{text} and \meta{more text} takes place
 %   using \cs{iow_wrap:nnnN}; the documentation for the latter should be
 %   consulted for full details.
@@ -504,7 +503,7 @@
 %     . <text>
 %     .................................................
 %   \end{verbatim}
-%   where the \meta{text} will be wrapped to fit within the current
+%   where the \meta{text} is wrapped to fit within the current
 %   line length.  Wrapping takes place using \cs{iow_wrap:nnnN}; the
 %   documentation for the latter should be consulted for full details.
 % \end{function}
@@ -520,7 +519,7 @@
 %     * <text>
 %     *************************************************
 %   \end{verbatim}
-%   where the \meta{text} will be wrapped to fit within the current
+%   where the \meta{text} is wrapped to fit within the current
 %   line length. Wrapping takes place using \cs{iow_wrap:nnnN}; the
 %   documentation for the latter should be consulted for full details.
 % \end{function}
@@ -537,12 +536,12 @@
 %     \cs{__msg_kernel_new:nnnn} \Arg{module} \Arg{message} \Arg{text} \Arg{more text}
 %   \end{syntax}
 %   Creates a kernel \meta{message} for a given \meta{module}.
-%   The message will be defined to first give \meta{text} and then
+%   The message is defined to first give \meta{text} and then
 %   \meta{more text} if the user requests it. If no \meta{more text} is
 %   available then a standard text is given instead. Within \meta{text}
 %   and \meta{more text} four parameters (|#1| to |#4|) can be used:
 %   these will be supplied and expanded at the time the message is used.
-%   An error will be raised if the \meta{message} already exists.
+%   An error is raised if the \meta{message} already exists.
 % \end{function}
 %
 % \begin{function}{\__msg_kernel_set:nnnn, \__msg_kernel_set:nnn}
@@ -550,7 +549,7 @@
 %     \cs{__msg_kernel_set:nnnn} \Arg{module} \Arg{message} \Arg{text} \Arg{more text}
 %   \end{syntax}
 %   Sets up the text for a kernel \meta{message} for a given \meta{module}.
-%   The message will be defined to first give \meta{text} and then
+%   The message is defined to first give \meta{text} and then
 %   \meta{more text} if the user requests it. If no \meta{more text} is
 %   available then a standard text is given instead. Within \meta{text}
 %   and \meta{more text} four parameters (|#1| to |#4|) can be used:
@@ -574,7 +573,7 @@
 %   \end{syntax}
 %   Issues kernel \meta{module} error \meta{message}, passing \meta{arg one}
 %   to \meta{arg four} to the text-creating functions. After issuing a
-%   fatal error the \TeX{} run will halt. Cannot be redirected.
+%   fatal error the \TeX{} run halts. Cannot be redirected.
 % \end{function}
 %
 % \begin{function}[updated = 2012-08-11]
@@ -594,9 +593,9 @@
 %   \end{syntax}
 %   Issues kernel \meta{module} error \meta{message}, passing \meta{arg one}
 %   to
-%   \meta{arg four} to the text-creating functions. The error will
-%   stop processing and issue the text at the terminal. After user input,
-%   the run will continue. Cannot be redirected.
+%   \meta{arg four} to the text-creating functions. The error
+%   stops processing and issues the text at the terminal. After user input,
+%   the run continues. Cannot be redirected.
 % \end{function}
 %
 % \begin{function}[updated = 2012-08-11]
@@ -617,8 +616,7 @@
 %   Issues kernel \meta{module} warning \meta{message}, passing
 %   \meta{arg one} to
 %   \meta{arg four} to the text-creating functions. The warning text
-%   will be added to the log file, but the \TeX{} run will not be
-%   interrupted.
+%   is added to the log file, but the \TeX{} run is not interrupted.
 % \end{function}
 %
 % \begin{function}[updated = 2012-08-11]
@@ -638,7 +636,7 @@
 %   \end{syntax}
 %   Issues kernel \meta{module} information \meta{message}, passing
 %   \meta{arg one} to \meta{arg four} to the text-creating functions.
-%   The information text will be added to the log file.
+%   The information text is added to the log file.
 % \end{function}
 %
 % \section{Expandable errors}
@@ -664,7 +662,7 @@
 %   \end{syntax}
 %   Issues an error, passing \meta{arg one} to \meta{arg four}
 %   to the text-creating functions. The resulting string must
-%   be shorter than a line, otherwise it will be cropped.
+%   be much shorter than a line, otherwise it is cropped.
 % \end{function}
 %
 % \begin{function}[EXP, added = 2011-08-11, updated = 2011-08-13]
@@ -738,8 +736,8 @@
 %   Shows or logs the \meta{expression} (turned into a string), an
 %   equal sign, and the result of applying the \meta{function} to the
 %   \Arg{expression}.  For instance, if the \meta{function} is
-%   \cs{int_eval:n} and the \meta{expression} is |1+2| then this will
-%   log |> 1+2=3.| The case where the \meta{function} is
+%   \cs{int_eval:n} and the \meta{expression} is |1+2| then this
+%   logs |> 1+2=3.| The case where the \meta{function} is
 %   \cs{tl_to_str:n} is special: then the string representation of the
 %   \meta{expression} is only logged once.
 % \end{function}
@@ -833,11 +831,10 @@
 %
 % \begin{macro}[aux]{\__chk_if_free_msg:nn}
 %   This auxiliary is similar to \cs{__chk_if_free_cs:N}, and is used when
-%   defining messages with \cs{msg_new:nnnn}. It could be inlined in
-%   \cs{msg_new:nnnn}, but the experimental \pkg{l3trace} module needs
-%   to disable this check when reloading a package with the extra
-%   tracing information.
+%   defining messages with \cs{msg_new:nnnn}.
 %    \begin{macrocode}
+\__debug_patch:nnNw { }
+  { \__debug_log:x { Defining~message~ #1 / #2 ~\msg_line_context: } }
 \cs_new_protected:Npn \__chk_if_free_msg:nn #1#2
   {
     \msg_if_exist:nnT {#1} {#2}
@@ -846,19 +843,6 @@
           {#1} {#2}
       }
   }
-%<*package>
-\if_bool:N \l at expl@log at functions@bool
-  \cs_gset_protected:Npn \__chk_if_free_msg:nn #1#2
-    {
-      \msg_if_exist:nnT {#1} {#2}
-        {
-          \@@_kernel_error:nnxx { kernel } { message-already-defined }
-            {#1} {#2}
-        }
-      \__chk_log:x { Defining~message~ #1 / #2 ~\msg_line_context: }
-    }
-\fi:
-%</package>
 %    \end{macrocode}
 % \end{macro}
 %
@@ -922,7 +906,7 @@
 \tl_const:Nn \c_@@_continue_text_tl
   { Type~<return>~to~continue }
 \tl_const:Nn \c_@@_critical_text_tl
-  { Reading~the~current~file~'\g_file_current_name_tl'~will~stop. }
+  { Reading~the~current~file~'\g_file_curr_name_str'~will~stop. }
 \tl_const:Nn \c_@@_fatal_text_tl
   { This~is~a~fatal~error:~LaTeX~will~abort. }
 \tl_const:Nn \c_@@_help_text_tl
@@ -1027,9 +1011,9 @@
 %   trailing closing braces are turned into spaces to hide them as well.
 %   The group in which we alter the definition of the active |!| is
 %   closed before producing the message: this ensures that tokens
-%   inserted by typing |I| in the command-line will be inserted after
+%   inserted by typing |I| in the command-line are inserted after
 %   the message is entirely cleaned up.
-
+%
 %   The \cs{__iow_with:Nnn} auxiliary, defined in \pkg{l3file}, expects
 %   an \meta{integer variable}, an integer \meta{value}, and some
 %   \meta{code}.  It runs the \meta{code} after ensuring that the
@@ -1489,7 +1473,7 @@
 %   applies then no further redirection is attempted.  Otherwise, split
 %   the message name into \texttt{module/submodule/message} (with an
 %   arbitrary number of slashes), and store |{/module/submodule}|,
-%   |{/module}| and |{}| into \cs{l_@@_hierarchy_seq}.  We will then
+%   |{/module}| and |{}| into \cs{l_@@_hierarchy_seq}.  We then
 %   map through this sequence, applying the most specific redirection.
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_use_redirect_name:n #1
@@ -1556,7 +1540,7 @@
 % \end{macro}
 %
 % \begin{macro}{\msg_redirect_name:nnn}
-%   Named message will always use the given class even if that class is
+%   Named message always use the given class even if that class is
 %   redirected further.  An empty target class cancels any existing
 %   redirection for that message.
 %    \begin{macrocode}
@@ -1928,21 +1912,6 @@
     LaTeX~has~been~asked~to~define~the~conditional~form~'#1'~of~
     the~function~'#2',~but~only~'TF',~'T',~'F',~and~'p'~forms~exist.
   }
-%<*package>
-\bool_if:NT \l at expl@check at declarations@bool
-  {
-    \@@_kernel_new:nnnn { check } { non-declared-variable }
-      { The~variable~#1~has~not~been~declared~\msg_line_context:. }
-      {
-        Checking~is~active,~and~you~have~tried~do~so~something~like: \\
-        \ \ \tl_set:Nn ~ #1 ~ \{ ~ ... ~ \} \\
-        without~first~having: \\
-        \ \ \tl_new:N ~ #1  \\
-        \\
-        LaTeX~will~create~the~variable~and~continue.
-      }
-  }
-%</package>
 \@@_kernel_new:nnnn { kernel } { scanmark-already-defined }
   { Scan~mark~#1~already~defined. }
   {
@@ -1975,6 +1944,52 @@
   }
 %    \end{macrocode}
 %
+% Some errors are only needed in package mode if debugging is enabled by
+% one of the options \texttt{enable-debug}, \texttt{check-declarations},
+% \texttt{log-functions}, or on the contrary if debugging is turned off.
+% In format mode the error is somewhat different.
+%    \begin{macrocode}
+%<*package>
+\bool_if:NTF \l at expl@enable at debug@bool
+  {
+    \@@_kernel_new:nnn { kernel } { debug-unpatchable }
+      { Only~some~definitions~can~be~patched;~'#3'~cannot. }
+    \@@_kernel_new:nnnn { check } { non-declared-variable }
+      { The~variable~#1~has~not~been~declared~\msg_line_context:. }
+      {
+        Checking~is~active,~and~you~have~tried~do~so~something~like: \\
+        \ \ \tl_set:Nn ~ #1 ~ \{ ~ ... ~ \} \\
+        without~first~having: \\
+        \ \ \tl_new:N ~ #1  \\
+        \\
+        LaTeX~will~create~the~variable~and~continue.
+      }
+  }
+  {
+    \@@_kernel_new:nnnn { kernel } { enable-debug }
+      { To~use~'#1'~load~expl3~with~the~'enable-debug'~option. }
+      {
+        The~function~'#1'~will~be~ignored~because~it~can~only~work~if~
+        some~internal~functions~in~expl3~have~been~appropriately~
+        defined.~This~only~happens~if~one~of~the~options~
+        'enable-debug',~'check-declarations'~or~'log-functions'~was~
+        given~when~loading~expl3.
+      }
+  }
+%</package>
+%<*initex>
+\@@_kernel_new:nnnn { kernel } { enable-debug }
+  { '#1'~cannot~be~used~in~format~mode. }
+  {
+    The~function~'#1'~will~be~ignored~because~it~can~only~work~if~
+    some~internal~functions~in~expl3~have~been~appropriately~
+    defined.~This~only~happens~in~package~mode~(and~only~if~one~of~
+    the~options~'enable-debug',~'check-declarations'~or~'log-functions'~
+    was~given~when~loading~expl3.
+  }
+%</initex>
+%    \end{macrocode}
+%
 % Some errors only appear in expandable settings,
 % hence don't need a \enquote{more-text} argument.
 %    \begin{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -628,6 +628,8 @@
   \__kernel_primitive:NN \pdfdraftmode                \pdftex_draftmode:D
   \__kernel_primitive:NN \pdfeachlinedepth            \pdftex_eachlinedepth:D
   \__kernel_primitive:NN \pdfeachlineheight           \pdftex_eachlineheight:D
+  \__kernel_primitive:NN \pdffilemoddate              \pdftex_filemoddate:D
+  \__kernel_primitive:NN \pdffilesize                 \pdftex_filesize:D
   \__kernel_primitive:NN \pdffirstlineheight          \pdftex_firstlineheight:D
   \__kernel_primitive:NN \pdffontexpand               \pdftex_fontexpand:D
   \__kernel_primitive:NN \pdffontsize                 \pdftex_fontsize:D
@@ -638,6 +640,7 @@
   \__kernel_primitive:NN \pdflastypos                 \pdftex_lastypos:D
   \__kernel_primitive:NN \pdfmapfile                  \pdftex_mapfile:D
   \__kernel_primitive:NN \pdfmapline                  \pdftex_mapline:D
+  \__kernel_primitive:NN \pdfmdfivesum                \pdftex_mdfivesum:D
   \__kernel_primitive:NN \pdfnoligatures              \pdftex_noligatures:D
   \__kernel_primitive:NN \pdfnormaldeviate            \pdftex_normaldeviate:D
   \__kernel_primitive:NN \pdfpageheight               \pdftex_pageheight:D
@@ -762,6 +765,7 @@
 % Primitives from \pdfTeX{} that \XeTeX{} renames: also helps with
 % \LuaTeX{}.
 %    \begin{macrocode}
+  \__kernel_primitive:NN \mdfivesum                   \pdftex_mdfivesum:D
   \__kernel_primitive:NN \ifprimitive                 \pdftex_ifprimitive:D
   \__kernel_primitive:NN \primitive                   \pdftex_primitive:D
   \__kernel_primitive:NN \shellescape                 \pdftex_shellescape:D
@@ -1112,7 +1116,7 @@
 \tex_endgroup:D
 %    \end{macrocode}
 %
-% \LaTeXe{} will have moved a few primitives, so these are sorted out.
+% \LaTeXe{} moves a few primitives, so these are sorted out.
 % A convenient test for \LaTeXe{} is the \cs{@@end} saved primitive.
 %    \begin{macrocode}
 %<*package>
@@ -1126,7 +1130,7 @@
   \tex_let:D \tex_underline:D            \@@underline
 %    \end{macrocode}
 % Some tidying up is needed for \tn[index=tracingfonts]{(pdf)tracingfonts}. Newer \LuaTeX{} has
-% this simply as \tn{tracingfonts}, but that will have been overwritten by
+% 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{}.
 % In the latter case, we leave \tn{@@tracingfonts} available: this might

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3oldmodules.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3oldmodules.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3oldmodules.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -42,7 +42,7 @@
 % }
 %
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -85,7 +85,7 @@
 %   \end{syntax}
 %   These functions create a family of conditionals using the same
 %   \Arg{code} to perform the test created. Those conditionals are
-%   expandable if \meta{code} is. The \texttt{new} versions will check
+%   expandable if \meta{code} is. The \texttt{new} versions check
 %   for existing definitions and perform assignments globally
 %   (\emph{cf.}~\cs{cs_new:Npn}) whereas the \texttt{set} versions do no
 %   check and perform assignments locally (\emph{cf.}~\cs{cs_set:Npn}).
@@ -105,9 +105,9 @@
 %   \end{syntax}
 %   These functions create a family of protected conditionals using the
 %   same \Arg{code} to perform the test created. The \meta{code} does
-%   not need to be expandable.  The \texttt{new} version will check for
+%   not need to be expandable.  The \texttt{new} version check for
 %   existing definitions and perform assignments globally
-%   (\emph{cf.}~\cs{cs_new:Npn}) whereas the \texttt{set} version will
+%   (\emph{cf.}~\cs{cs_new:Npn}) whereas the \texttt{set} version do
 %   not (\emph{cf.}~\cs{cs_set:Npn}). The conditionals created are
 %   depended on the comma-separated list of \meta{conditions}, which
 %   should be one or more of \texttt{T}, \texttt{F} and \texttt{TF} (not
@@ -174,8 +174,8 @@
 %     \cs{prg_new_eq_conditional:NNn} \cs[no-index]{\meta{name_1}:\meta{arg spec_1}} \cs[no-index]{\meta{name_2}:\meta{arg spec_2}} \Arg{conditions}
 %   \end{syntax}
 %   These functions copy a family of conditionals. The \texttt{new} version
-%   will check for existing definitions (\emph{cf.}~\cs{cs_new_eq:NN}) whereas
-%   the \texttt{set} version will not (\emph{cf.}~\cs{cs_set_eq:NN}). The
+%   checks for existing definitions (\emph{cf.}~\cs{cs_new_eq:NN}) whereas
+%   the \texttt{set} version does not (\emph{cf.}~\cs{cs_set_eq:NN}). The
 %   conditionals copied are depended on the comma-separated list of
 %   \meta{conditions}, which should be one or more of \texttt{p}, \texttt{T},
 %   \texttt{F} and \texttt{TF}.
@@ -217,8 +217,8 @@
 % both the boolean type and predicate functions.
 %
 % All conditional |\bool_| functions except assignments are expandable
-% and expect the input to also be fully expandable (which will generally
-% mean being constructed from predicate functions, possibly nested).
+% and expect the input to also be fully expandable (which generally
+% means being constructed from predicate functions and booleans, possibly nested).
 %
 % \begin{texnote}
 %   The \texttt{bool} data type is not implemented using the
@@ -234,7 +234,7 @@
 %   \end{syntax}
 %   Creates a new \meta{boolean} or raises an error if the
 %   name is already taken. The declaration is global. The
-%   \meta{boolean} will initially be \texttt{false}.
+%   \meta{boolean} is initially \texttt{false}.
 % \end{function}
 %
 % \begin{function}
@@ -429,7 +429,7 @@
 %   \texttt{true} and \texttt{false} if any of them is \texttt{false}.
 %   Contrarily to the infix operator |&&|, only the \meta{boolean
 %   expressions} which are needed to determine the result of
-%   \cs{bool_lazy_all:nTF} will be evaluated.  See also \cs{bool_lazy_and:nnTF}
+%   \cs{bool_lazy_all:nTF} are evaluated.  See also \cs{bool_lazy_and:nnTF}
 %   when there are only two \meta{boolean expressions}.
 % \end{function}
 %
@@ -440,8 +440,8 @@
 %   \end{syntax}
 %   Implements the \enquote{And} operation between two boolean
 %   expressions, hence is \texttt{true} if both are \texttt{true}.
-%   Contrarily to the infix operator |&&|, the \meta{boolexpr_2} will
-%   only be evaluated if it is needed to determine the result of
+%   Contrarily to the infix operator |&&|, the \meta{boolexpr_2} is only
+%   evaluated if it is needed to determine the result of
 %   \cs{bool_lazy_and:nnTF}.  See also \cs{bool_lazy_all:nTF} when there are more
 %   than two \meta{boolean expressions}.
 % \end{function}
@@ -456,7 +456,7 @@
 %   \texttt{true} and \texttt{false} if all of them are \texttt{false}.
 %   Contrarily to the infix operator \verb"||", only the \meta{boolean
 %   expressions} which are needed to determine the result of
-%   \cs{bool_lazy_any:nTF} will be evaluated.  See also \cs{bool_lazy_or:nnTF}
+%   \cs{bool_lazy_any:nTF} are evaluated.  See also \cs{bool_lazy_or:nnTF}
 %   when there are only two \meta{boolean expressions}.
 % \end{function}
 %
@@ -468,7 +468,7 @@
 %   Implements the \enquote{Or} operation between two boolean
 %   expressions, hence is \texttt{true} if either one is \texttt{true}.
 %   Contrarily to the infix operator \verb"||", the \meta{boolexpr_2}
-%   will only be evaluated if it is needed to determine the result of
+%   is only evaluated if it is needed to determine the result of
 %   \cs{bool_lazy_or:nnTF}.  See also \cs{bool_lazy_any:nTF} when there are more
 %   than two \meta{boolean expressions}.
 % \end{function}
@@ -500,8 +500,8 @@
 %   \end{syntax}
 %   Places the \meta{code} in the input stream for \TeX{} to process,
 %   and then checks the logical value of the \meta{boolean}.  If it is
-%   \texttt{false} then the \meta{code} will be inserted into the input
-%   stream again and the process will loop until the \meta{boolean} is
+%   \texttt{false} then the \meta{code} is inserted into the input
+%   stream again and the process loops until the \meta{boolean} is
 %   \texttt{true}.
 % \end{function}
 %
@@ -511,8 +511,8 @@
 %   \end{syntax}
 %   Places the \meta{code} in the input stream for \TeX{} to process,
 %   and then checks the logical value of the \meta{boolean}.  If it is
-%   \texttt{true} then the \meta{code} will be inserted into the input
-%   stream again and the process will loop until the \meta{boolean} is
+%   \texttt{true} then the \meta{code} is inserted into the input
+%   stream again and the process loops until the \meta{boolean} is
 %   \texttt{false}.
 % \end{function}
 %
@@ -523,7 +523,7 @@
 %   This function firsts checks the logical value of the \meta{boolean}.
 %   If it is \texttt{false} the \meta{code} is placed in the input stream
 %   and expanded. After the completion of the \meta{code} the truth
-%   of the \meta{boolean} is re-evaluated. The process will then loop
+%   of the \meta{boolean} is re-evaluated. The process then loops
 %   until the \meta{boolean} is \texttt{true}.
 % \end{function}
 %
@@ -534,7 +534,7 @@
 %   This function firsts checks the logical value of the \meta{boolean}.
 %   If it is \texttt{true} the \meta{code} is placed in the input stream
 %   and expanded. After the completion of the \meta{code} the truth
-%   of the \meta{boolean} is re-evaluated. The process will then loop
+%   of the \meta{boolean} is re-evaluated. The process then loops
 %   until the \meta{boolean} is \texttt{false}.
 % \end{function}
 %
@@ -545,8 +545,8 @@
 %   Places the \meta{code} in the input stream for \TeX{} to process,
 %   and then checks the logical value of the \meta{boolean expression}
 %   as described for \cs{bool_if:nTF}.  If it is \texttt{false} then the
-%   \meta{code} will be inserted into the input stream again and the
-%   process will loop until the \meta{boolean expression} evaluates to
+%   \meta{code} is inserted into the input stream again and the
+%   process loops until the \meta{boolean expression} evaluates to
 %   \texttt{true}.
 % \end{function}
 %
@@ -557,8 +557,8 @@
 %   Places the \meta{code} in the input stream for \TeX{} to process,
 %   and then checks the logical value of the \meta{boolean expression}
 %   as described for \cs{bool_if:nTF}.  If it is \texttt{true} then the
-%   \meta{code} will be inserted into the input stream again and the
-%   process will loop until the \meta{boolean expression} evaluates to
+%   \meta{code} is inserted into the input stream again and the
+%   process loops until the \meta{boolean expression} evaluates to
 %   \texttt{false}.
 % \end{function}
 %
@@ -570,8 +570,8 @@
 %   \meta{boolean expression} (as described for \cs{bool_if:nTF}).
 %   If it is \texttt{false} the \meta{code} is placed in the input stream
 %   and expanded. After the completion of the \meta{code} the truth
-%   of the \meta{boolean expression} is re-evaluated. The process will
-%   then loop until the \meta{boolean expression} is \texttt{true}.
+%   of the \meta{boolean expression} is re-evaluated. The process
+%   then loops until the \meta{boolean expression} is \texttt{true}.
 % \end{function}
 %
 % \begin{function}[rEXP, updated = 2012-07-08]{\bool_while_do:nn}
@@ -582,8 +582,8 @@
 %   \meta{boolean expression} (as described for \cs{bool_if:nTF}).
 %   If it is \texttt{true} the \meta{code} is placed in the input stream
 %   and expanded. After the completion of the \meta{code} the truth
-%   of the \meta{boolean expression} is re-evaluated. The process will
-%   then loop until the \meta{boolean expression} is \texttt{false}.
+%   of the \meta{boolean expression} is re-evaluated. The process
+%   then loops until the \meta{boolean expression} is \texttt{false}.
 % \end{function}
 %
 % \section{Producing multiple copies}
@@ -667,7 +667,7 @@
 %   \tn{halign}. This is necessary to allow grabbing of tokens
 %   for testing purposes, as \TeX{} uses group level to determine the
 %   effect of alignment tokens. Without the special grouping, the use of
-%   a function such as \cs{peek_after:Nw} will result in a forbidden
+%   a function such as \cs{peek_after:Nw} would result in a forbidden
 %   comparison of the internal \tn{endtemplate} token, yielding a
 %    fatal error. Each \cs{group_align_safe_begin:} must be matched by a
 %   \cs{group_align_safe_end:}, although this does not have to occur
@@ -711,7 +711,7 @@
 %
 % \begin{function}[EXP]{\__prg_break_point:}
 %   This copy of \cs{prg_do_nothing:} is used to mark the end of a fast
-%   short-term recursions: the function \cs{__prg_break:n} uses this to
+%   short-term recursion: the function \cs{__prg_break:n} uses this to
 %   break out of the loop.
 % \end{function}
 %
@@ -804,13 +804,20 @@
 %   }
 % \UnitTested
 %   Setting is already pretty easy.
+%   When \texttt{check-declarations} is active, the definitions are patched to
+%   make sure the boolean exists.  This is needed because booleans are
+%   not based on token lists nor on \TeX{} registers.
 %    \begin{macrocode}
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \bool_set_true:N #1
   { \cs_set_eq:NN #1 \c_true_bool }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \bool_set_false:N #1
   { \cs_set_eq:NN #1 \c_false_bool }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \bool_gset_true:N #1
   { \cs_gset_eq:NN #1 \c_true_bool }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \bool_gset_false:N #1
   { \cs_gset_eq:NN #1 \c_false_bool }
 \cs_generate_variant:Nn \bool_set_true:N   { c }
@@ -828,16 +835,14 @@
 %     \bool_gset_eq:Nc, \bool_gset_eq:cc
 %   }
 % \UnitTested
-%   The usual copy code.
+%   The usual copy code.  While it would be cleaner semantically to copy
+%   the \cs{cs_set_eq:NN} family of functions, we copy \cs{tl_set_eq:NN}
+%   because that has the correct checking code.
 %    \begin{macrocode}
-\cs_new_eq:NN \bool_set_eq:NN  \cs_set_eq:NN
-\cs_new_eq:NN \bool_set_eq:Nc  \cs_set_eq:Nc
-\cs_new_eq:NN \bool_set_eq:cN  \cs_set_eq:cN
-\cs_new_eq:NN \bool_set_eq:cc  \cs_set_eq:cc
-\cs_new_eq:NN \bool_gset_eq:NN \cs_gset_eq:NN
-\cs_new_eq:NN \bool_gset_eq:Nc \cs_gset_eq:Nc
-\cs_new_eq:NN \bool_gset_eq:cN \cs_gset_eq:cN
-\cs_new_eq:NN \bool_gset_eq:cc \cs_gset_eq:cc
+\cs_new_eq:NN \bool_set_eq:NN  \tl_set_eq:NN
+\cs_new_eq:NN \bool_gset_eq:NN \tl_gset_eq:NN
+\cs_generate_variant:Nn \bool_set_eq:NN { Nc, cN, cc }
+\cs_generate_variant:Nn \bool_gset_eq:NN { Nc, cN, cc }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -845,9 +850,12 @@
 % \begin{macro}{\bool_gset:Nn, \bool_gset:cn}
 %   This function evaluates a boolean expression and assigns the first
 %   argument the meaning \cs{c_true_bool} or \cs{c_false_bool}.
+%   Again, we include some checking code.
 %    \begin{macrocode}
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \bool_set:Nn #1#2
   { \tex_chardef:D #1 = \bool_if_p:n {#2} }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \bool_gset:Nn #1#2
   { \tex_global:D \tex_chardef:D #1 = \bool_if_p:n {#2} }
 \cs_generate_variant:Nn \bool_set:Nn  { c }
@@ -856,55 +864,6 @@
 % \end{macro}
 % \end{macro}
 %
-%  Booleans are not based on token lists but do need checking: this
-%  code complements similar material in \pkg{l3tl}.
-%    \begin{macrocode}
-%<*package>
-\if_bool:N \l at expl@check at declarations@bool
-  \cs_set_protected:Npn \bool_set_true:N #1
-    {
-      \__chk_if_exist_var:N #1
-      \cs_set_eq:NN #1 \c_true_bool
-    }
-  \cs_set_protected:Npn \bool_set_false:N #1
-    {
-      \__chk_if_exist_var:N #1
-      \cs_set_eq:NN #1 \c_false_bool
-    }
-  \cs_set_protected:Npn \bool_gset_true:N #1
-    {
-      \__chk_if_exist_var:N #1
-      \cs_gset_eq:NN #1 \c_true_bool
-    }
-  \cs_set_protected:Npn \bool_gset_false:N #1
-    {
-      \__chk_if_exist_var:N #1
-      \cs_gset_eq:NN #1 \c_false_bool
-    }
-  \cs_set_protected:Npn \bool_set_eq:NN  #1
-    {
-      \__chk_if_exist_var:N #1
-      \cs_set_eq:NN #1
-    }
-  \cs_set_protected:Npn \bool_gset_eq:NN  #1
-    {
-      \__chk_if_exist_var:N #1
-      \cs_gset_eq:NN #1
-    }
-  \cs_set_protected:Npn \bool_set:Nn #1#2
-    {
-      \__chk_if_exist_var:N #1
-      \tex_chardef:D #1 = \bool_if_p:n {#2}
-    }
-  \cs_set_protected:Npn \bool_gset:Nn #1#2
-    {
-      \__chk_if_exist_var:N #1
-      \tex_global:D \tex_chardef:D #1 = \bool_if_p:n {#2}
-    }
-\fi:
-%</package>
-%    \end{macrocode}
-%
 % \begin{macro}[pTF]{\bool_if:N, \bool_if:c}
 % \UnitTested
 %  Straight forward here. We could optimize here if we wanted to as
@@ -1052,7 +1011,7 @@
 %   }
 %   First issue a \cs{group_align_safe_begin:} as we are using |&&|
 %   as syntax shorthand for the And operation and we need to hide it for
-%   \TeX{}.  This will be closed at the end of the expression parsing
+%   \TeX{}.  This is closed at the end of the expression parsing
 %   (see |S| below).
 %
 %   Minimal (\enquote{short-circuit}) evaluation of boolean expressions
@@ -1061,7 +1020,7 @@
 %   parenthesis when \meta{false}|&&| is seen.  To avoid having separate
 %   functions for the two cases, we transform the boolean expression by
 %   doubling each parenthesis and adding parenthesis around each
-%   \verb"||".  This ensures that |&&| will bind tighter than \verb"||".
+%   \verb"||".  This ensures that |&&| binds tighter than \verb"||".
 %
 %   The replacement is done in three passes, for left and right
 %   parentheses and for \verb"||".  At each pass, the part of the
@@ -1068,7 +1027,7 @@
 %   expression that has been transformed is stored before \cs{q_nil},
 %   the rest lies until the first \cs{q_mark}, followed by an empty
 %   brace group.  A trailing marker ensures that the auxiliaries'
-%   delimited arguments will not run-away.  As long as the delimiter
+%   delimited arguments do not run-away.  As long as the delimiter
 %   matches inside the expression, material is moved before \cs{q_nil}
 %   and we continue.  Afterwards, the trailing marker is taken as a
 %   delimiter, |#4| is the next auxiliary, immediately followed by a new
@@ -1098,7 +1057,7 @@
 %
 % \begin{macro}[EXP, aux]{\@@_if_parse:NNNww}
 %   After removing extra tokens from the transformation phase, start
-%   evaluating.  At the end, we will need to finish the special
+%   evaluating.  At the end, we need to finish the special
 %   \texttt{align_safe} group before finally
 %   returning a \cs{c_true_bool} or \cs{c_false_bool} as there might
 %   otherwise be something left in front in the input stream. For this
@@ -1540,7 +1499,7 @@
 %   requires two steps of expansion.
 %
 %   This function has one flaw though: Since it constantly passes down
-%   ten copies of its previous argument it will severely affect the main
+%   ten copies of its previous argument it severely affects the main
 %   memory once you start demanding hundreds of thousands of copies. Now
 %   I don't think this is a real limitation for any ordinary use, and if
 %   necessary, it is possible to write \cs{prg_replicate:nn} |{1000}|
@@ -1665,9 +1624,9 @@
 %   whenever \tn{halign} or \tn{valign} work, [\ldots]} One problem relates
 %   to commands that internally issues a \tn{cr} but also peek ahead for
 %   the next character for use in, say, an optional argument. If the
-%   next token happens to be a |&| with category code~4 we will get some
+%   next token happens to be a |&| with category code~4 we get some
 %   sort of weird error message because the underlying
-%   \tn{futurelet} will store the token at the end of the alignment
+%   \tn{futurelet} stores the token at the end of the alignment
 %   template. This could be a |&|$_4$ giving a message like
 %   |! Misplaced \cr.| or even worse: it could be the \tn{endtemplate}
 %   token causing even more trouble! To solve this we have to open a

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -56,7 +56,7 @@
 %
 % Each entry in a property list must have a unique \meta{key}: if an entry is
 % added to a property list which already contains the \meta{key} then the new
-% entry will overwrite the existing one. The \meta{keys} are compared on a
+% entry overwrites the existing one. The \meta{keys} are compared on a
 % string basis, using the same method as \cs{str_if_eq:nn}.
 %
 % Property lists are intended for storing key-based information for use within
@@ -70,8 +70,8 @@
 %     \cs{prop_new:N} \meta{property list}
 %   \end{syntax}
 %   Creates a new \meta{property list} or raises an error if the name is
-%   already taken. The declaration is global. The \meta{property list} will
-%   initially contain no entries.
+%   already taken. The declaration is global. The \meta{property list}
+%   initially contains no entries.
 % \end{function}
 %
 % \begin{function}
@@ -162,8 +162,8 @@
 %   Recovers the \meta{value} stored with \meta{key} from the
 %   \meta{property list}, and places this in the \meta{token list
 %   variable}. If the \meta{key} is not found in the
-%   \meta{property list} then the \meta{token list variable} will
-%   contain the special marker \cs{q_no_value}. The \meta{token list
+%   \meta{property list} then the \meta{token list variable} is set
+%   to the special marker \cs{q_no_value}. The \meta{token list
 %     variable} is set within the current \TeX{} group. See also
 %   \cs{prop_get:NnNTF}.
 % \end{function}
@@ -176,8 +176,8 @@
 %   Recovers the \meta{value} stored with \meta{key} from the
 %   \meta{property list}, and places this in the \meta{token list
 %   variable}. If the \meta{key} is not found in the
-%   \meta{property list} then the \meta{token list variable} will
-%   contain the special marker \cs{q_no_value}. The \meta{key} and
+%   \meta{property list} then the \meta{token list variable} is set
+%   to the special marker \cs{q_no_value}. The \meta{key} and
 %   \meta{value} are then deleted from the property list. Both
 %   assignments are local.  See also \cs{prop_pop:NnNTF}.
 % \end{function}
@@ -190,8 +190,8 @@
 %   Recovers the \meta{value} stored with \meta{key} from the
 %   \meta{property list}, and places this in the \meta{token list
 %   variable}. If the \meta{key} is not found in the
-%   \meta{property list} then the \meta{token list variable} will
-%   contain the special marker \cs{q_no_value}. The \meta{key} and
+%   \meta{property list} then the \meta{token list variable} is set
+%   to the special marker \cs{q_no_value}. The \meta{key} and
 %   \meta{value} are then deleted from the property list.
 %   The \meta{property list} is modified globally, while the assignment of
 %   the \meta{token list variable} is local.  See also \cs{prop_gpop:NnNTF}.
@@ -209,7 +209,7 @@
 %     \cs{prop_get:NnN}.
 %     The result is returned within the \tn{unexpanded}
 %     primitive (\cs{exp_not:n}), which means that the \meta{value}
-%     will not expand further when appearing in an \texttt{x}-type
+%     does not expand further when appearing in an \texttt{x}-type
 %     argument expansion.
 %   \end{texnote}
 % \end{function}
@@ -335,7 +335,7 @@
 %     \cs{prop_map_function:NN} \meta{property list} \meta{function}
 %   \end{syntax}
 %   Applies \meta{function} to every \meta{entry} stored in the
-%   \meta{property list}. The \meta{function} will receive two argument for
+%   \meta{property list}. The \meta{function} receives two argument for
 %   each iteration: the \meta{key} and associated \meta{value}.
 %   The order in which \meta{entries} are returned is not defined and
 %   should not be relied upon.
@@ -348,7 +348,7 @@
 %   \end{syntax}
 %   Applies \meta{inline function} to every \meta{entry} stored
 %   within the \meta{property list}. The \meta{inline function} should
-%   consist of code which will receive the \meta{key} as |#1| and the
+%   consist of code which receives the \meta{key} as |#1| and the
 %   \meta{value} as |#2|.
 %   The order in which \meta{entries} are returned is not defined and
 %   should not be relied upon.
@@ -359,8 +359,8 @@
 %     \cs{prop_map_break:}
 %   \end{syntax}
 %   Used to terminate a \cs[no-index]{prop_map_\ldots} function before all
-%   entries in the \meta{property list} have been processed. This will
-%   normally take place within a conditional statement, for example
+%   entries in the \meta{property list} have been processed. This
+%   normally takes place within a conditional statement, for example
 %   \begin{verbatim}
 %     \prop_map_inline:Nn \l_my_prop
 %       {
@@ -371,7 +371,7 @@
 %           }
 %       }
 %   \end{verbatim}
-%   Use outside of a \cs[no-index]{prop_map_\ldots} scenario will lead to low
+%   Use outside of a \cs[no-index]{prop_map_\ldots} scenario leads to low
 %   level \TeX{} errors.
 % \end{function}
 %
@@ -381,8 +381,8 @@
 %   \end{syntax}
 %   Used to terminate a \cs[no-index]{prop_map_\ldots} function before all
 %   entries in the \meta{property list} have been processed, inserting
-%   the \meta{tokens} after the mapping has ended. This will
-%   normally take place within a conditional statement, for example
+%   the \meta{tokens} after the mapping has ended. This
+%   normally takes place within a conditional statement, for example
 %   \begin{verbatim}
 %     \prop_map_inline:Nn \l_my_prop
 %       {
@@ -393,7 +393,7 @@
 %           }
 %       }
 %   \end{verbatim}
-%   Use outside of a \cs[no-index]{prop_map_\ldots} scenario will lead to low
+%   Use outside of a \cs[no-index]{prop_map_\ldots} scenario leads to low
 %   level \TeX{} errors.
 % \end{function}
 %
@@ -448,7 +448,7 @@
 %   \end{syntax}
 %   The internal token used to begin each key--value pair in the
 %   property list.  If expanded outside of a mapping or manipulation
-%   function, an error will be raised.  The definition should always be
+%   function, an error is raised.  The definition should always be
 %   set globally.
 % \end{variable}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -102,8 +102,8 @@
 %     \cs{quark_new:N} \meta{quark}
 %   \end{syntax}
 %   Creates a new \meta{quark} which expands only to \meta{quark}.
-%   The \meta{quark} will be defined globally, and an error message
-%   will be raised if the name was already taken.
+%   The \meta{quark} is defined globally, and an error message
+%   is raised if the name was already taken.
 % \end{function}
 %
 % \begin{variable}{\q_stop}
@@ -262,7 +262,7 @@
 %
 %
 % Here's the definition of |\my_map_dbl:nn|.
-% First of all, define the function that will do the processing based on the
+% First of all, define the function that does the processing based on the
 % inline function argument |#2|.
 % Then initiate the recursion using an internal function.
 % The token list |#1| is terminated using \cs{q_recursion_tail}, with
@@ -294,7 +294,7 @@
 %  }
 %\end{verbatim}
 % Note that contrarily to \LaTeX3 built-in mapping functions, this
-% mapping function cannot be nested, since the second map will overwrite
+% mapping function cannot be nested, since the second map would overwrite
 % the definition of |\__my_map_dbl_fn:nn|.
 %
 %
@@ -317,7 +317,7 @@
 % \section{Scan marks}
 %
 % Scan marks are control sequences set equal to \cs{scan_stop:},
-% hence will never expand in an expansion context and will be (largely)
+% hence never expand in an expansion context and are (largely)
 % invisible if they are encountered in a typesetting context.
 %
 % Like quarks, they can be used as delimiters in weird functions
@@ -336,8 +336,8 @@
 %     \cs{__scan_new:N} \meta{scan mark}
 %   \end{syntax}
 %   Creates a new \meta{scan mark} which is set equal to \cs{scan_stop:}.
-%   The \meta{scan mark} will be defined globally, and an error message
-%   will be raised if the name was already taken by another scan mark.
+%   The \meta{scan mark} is defined globally, and an error message
+%   is raised if the name was already taken by another scan mark.
 % \end{function}
 %
 % \begin{variable}{\s__stop}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -70,15 +70,16 @@
 % \enquote{\texttt{This cat.}}, where the first
 % occurrence of \enquote{\texttt{at}} was replaced
 % by \enquote{\texttt{is}}. A more complicated example is
-% a pattern to add a comma at the end of each word:
+% a pattern to emphasize each word and add a comma after it:
 % \begin{verbatim}
-%   \regex_replace_all:nnN { \w+ } { \0 , } \l_my_tl
+%   \regex_replace_all:nnN { \w+ } { \c{emph}\cB\{ \0 \cE\} , } \l_my_tl
 % \end{verbatim}
-% The |\w| sequence represents any \enquote{word} character,
-% and |+| indicates that the |\w| sequence should be repeated
-% as many times as possible (at least once), hence matching a word in the
-% input token list. In the replacement text, |\0| denotes the full match
-% (here, a word).
+% The |\w| sequence represents any \enquote{word} character, and |+|
+% indicates that the |\w| sequence should be repeated as many times as
+% possible (at least once), hence matching a word in the input token
+% list. In the replacement text, |\0| denotes the full match (here, a
+% word).  The command |\emph| is inserted using |\c{emph}|, and its
+% argument |\0| is put between braces |\cB\{| and |\cE\}|.
 %
 % If a regular expression is to be used several times,
 % it can be compiled once, and stored in a regex
@@ -97,6 +98,55 @@
 %
 % \subsection{Syntax of regular expressions}
 %
+% We start with a few examples, and encourage the reader to apply
+% \cs{regex_show:n} to these regular expressions.
+% \begin{itemize}
+% \item |Cat| matches the word \enquote{Cat} capitalized in this way,
+%   but also matches the beginning of the word \enquote{Cattle}: use
+%   |\bCat\b| to match a complete word only.
+% \item |[abc]| matches one letter among \enquote{a}, \enquote{b},
+%   \enquote{c}; the pattern \verb"(a|b|c)" matches the same three
+%   possible letters (but see the discussion of submatches below).
+% \item |[A-Za-z]*| matches any number (due to the quantifier
+%   \verb"*") of Latin letters (not accented).
+% \item |\c{[A-Za-z]*}| matches a control sequence made of Latin
+%   letters.
+% \item |\_[^\_]*\_| matches an underscore, any number of characters
+%   other than underscore, and another underscore; it is equivalent to
+%   |\_.*?\_| where |.| matches arbitrary characters and the
+%   lazy quantifier |*?| means to match as few characters as
+%   possible, thus avoiding matching underscores.
+% \item |[+-]?\d+| matches an explicit integer with at most one
+%   sign.
+% \item \verb*"[+-\ ]*\d+\ *" matches an explicit integer with any
+%   number of $+$ and $-$ signs, with spaces allowed except within the
+%   mantissa, and sourrounded by spaces.
+% \item \verb*"[+-\ ]*(\d+|\d*\.\d+)\ *" matches an explict integer or
+%   decimal number; using \verb*"[.,]" instead of \verb*"\." would allow
+%   the comma as a decimal marker.
+% \item
+%   \verb*"[+-\ ]*(\d+|\d*\.\d+)\ *((?i)pt|in|[cem]m|ex|[bs]p|[dn]d|[pcn]c)\ *"
+%   matches an explicit dimension with any unit that \TeX{} knows, where
+%   \verb*"(?i)" means to treat lowercase and uppercase letters
+%   identically.
+% \item \verb*"[+-\ ]*((?i)nan|inf|(\d+|\d*\.\d+)(\ *e[+-\ ]*\d+)?)\ *"
+%   matches an explicit floating point number or the special values
+%   \verb*"nan" and \verb*"inf" (with signs).
+% \item \verb*"[+-\ ]*(\d+|\cC.)\ *" matches an explicit integer or
+%   control sequence (without checking whether it is an integer
+%   variable).
+% \item |\G.*?\K| at the beginning of a regular expression matches and
+%   discards (due to |\K|) everything between the end of the previous
+%   match (|\G|) and what is matched by the rest of the regular
+%   expression; this is useful in \cs{regex_replace_all:nnN} when the
+%   goal is to extract matches or submatches in a finer way than with
+%   \cs{regex_extract_all:nnN}.
+% \end{itemize}
+% While it is impossible for a regular expression to match only integer
+% expressions, \verb*"[+-\(]*\d+\)*([+-*/][+-\(]*\d+\)*)*" matches among
+% other things all valid integer expressions (made only with explicit
+% integers).  One should follow it with further testing.
+%
 % Most characters match exactly themselves,
 % with an arbitrary category code. Some characters are
 % special and must be escaped with a backslash (\emph{e.g.}, |\*|
@@ -114,7 +164,7 @@
 % \item spaces should always be escaped (even in character
 %   classes);
 % \item any other character may be escaped or not, without any
-%   effect: both versions will match exactly that character.
+%   effect: both versions match exactly that character.
 % \end{itemize}
 % Note that these rules play nicely with the fact that many
 % non-alphanumeric characters are difficult to input into \TeX{}
@@ -161,7 +211,7 @@
 %   \item[\\V] Any token not matched by |\v|.
 %   \item[\\W] Any token not matched by |\w|.
 % \end{l3regex-syntax}
-% Of those, |.|, |\D|, |\H|, |\N|, |\S|, |\V|, and |\W| will match arbitrary
+% Of those, |.|, |\D|, |\H|, |\N|, |\S|, |\V|, and |\W| match arbitrary
 % control sequences.
 %
 % Character classes match exactly one token in the subject.
@@ -208,7 +258,7 @@
 %     or two |\W| tokens (including the boundary).
 %   \item[\char`^ \textrm{or} \\A]
 %     Start of the subject token list.
-%   \item[\char`$\textrm{,} \\Z \textrm{or} \\z]
+%   \item[\char`$\textrm{,} \\Z \textrm{or} \\z] ^^A $
 %     End of the subject token list.
 %   \item[\\G] Start of the current match. This is only different from |^|
 %     in the case of multiple matches: for instance
@@ -225,7 +275,7 @@
 %   \item[(?:\ldots{})] Non-capturing group.
 %   \item[(?\char`|\ldots{})] Non-capturing group which resets
 %     the group number for capturing groups in each alternative.
-%     The following group will be numbered with the first unused
+%     The following group is numbered with the first unused
 %     group number.
 % \end{l3regex-syntax}
 %
@@ -335,12 +385,12 @@
 %
 % Most of the features described in regular expressions do not make
 % sense within the replacement text.  Backslash introduces various
-% special constructions:
+% special constructions, described further below:
 % \begin{itemize}
 %   \item |\0| is the whole match;
-%   \item |\1|, |\2|, \ldots{}, |\9| or |\g{|\meta{number}|}| are the
-%     submatches (empty if there are fewer than \meta{number} capturing
-%     groups);
+%   \item |\1| is the submatch that was matched by the first (capturing)
+%     group |(...)|; similarly for |\2|, \ldots{}, |\9| and
+%     |\g{|\meta{number}|}|;
 %   \item \verb*|\ | inserts a space (spaces are ignored when not
 %     escaped);
 %   \item |\a|, |\e|, |\f|, |\n|, |\r|, |\t|, |\xhh|, |\x{hhh}|
@@ -363,8 +413,15 @@
 % \end{verbatim}
 % results in \cs{l_my_tl} holding |H(ell--el)(o,--o) w(or--o)(ld--l)!|
 %
-% Submatches always keep the same category codes as in the original
-% token list.
+% The submatches are numbered according to the order in which the
+% opening parenthesis of capturing groups appear in the regular
+% expression to match.  The $n$-th submatch is empty if there are fewer
+% than $n$ capturing groups or for capturing groups that appear in
+% alternatives that were not used for the match.  In case a capturing
+% group matches several times during a match (due to quantifiers) only
+% the last match is used in the replacement text. Submatches always keep
+% the same category codes as in the original token list.
+%
 % The characters inserted by the replacement have category code $12$
 % (other) by default, with the exception of space characters.  Spaces
 % inserted through \verb*|\ | have category code $10$, while spaces
@@ -375,8 +432,9 @@
 % \item[\\cX(\ldots{})] Produces the characters \enquote{\ldots{}} with
 %   category~|X|, which must be one of |CBEMTPUDSLOA| as in regular
 %   expressions.  Parentheses are optional for a single character (which
-%   can be an escape sequence).  This can be nested, for instance
-%   |\cL(Hello\cS\ world)!|
+%   can be an escape sequence).  When nested, the innermost category
+%   code applies, for instance |\cL(Hello\cS\ world)!| gives this text
+%   with standard category codes.
 % \item[\\c\Arg{text}] Produces the control sequence with csname
 %   \meta{text}.  The \meta{text} may contain references to the
 %   submatches |\0|, |\1|, and so on, as in the example for |\u| below.
@@ -384,12 +442,11 @@
 %
 % The escape sequence |\u|\Arg{tl~var~name} allows to insert the
 % contents of the token list with name \meta{tl~var~name} directly into
-% the replacement, giving an easier control of category codes.
-% Within |\c{|\ldots{}|}| and |\u{|\ldots{}|}| constructions, the |\u|
-% and |\c|~escape sequences perform \cs{tl_to_str:v}, namely extract the
-% value of the control sequence and turn it into a string.
-%
-% Matches can be used within the arguments of |\c| and |\u|.  For
+% the replacement, giving an easier control of category codes.  When
+% nested in |\c{|\ldots{}|}| and |\u{|\ldots{}|}| constructions, the
+% |\u| and |\c|~escape sequences perform \cs{tl_to_str:v}, namely
+% extract the value of the control sequence and turn it into a string.
+% Matches can also be used within the arguments of |\c| and |\u|.  For
 % instance,
 % \begin{verbatim}
 %   \tl_set:Nn \l_my_one_tl { first }
@@ -415,7 +472,7 @@
 %   \end{syntax}
 %   Creates a new \meta{regex~var} or raises an error if the
 %   name is already taken. The declaration is global. The
-%   \meta{regex~var} will initially be such that it never matches.
+%   \meta{regex~var} is initially such that it never matches.
 % \end{function}
 %
 % \begin{function}[added = 2017-05-26]
@@ -432,7 +489,7 @@
 %   \end{verbatim}
 %   The assignment is local for \cs{regex_set:Nn} and global for
 %   \cs{regex_gset:Nn}. Use \cs{regex_const:Nn} for compiled expressions
-%   which will never change.
+%   which never change.
 % \end{function}
 %
 % \begin{function}[added = 2017-05-26]{\regex_show:n, \regex_show:N}
@@ -502,15 +559,15 @@
 %     \cs{regex_extract_once:nnN} \Arg{regex} \Arg{token list} \meta{seq~var}
 %     \cs{regex_extract_once:nnNTF} \Arg{regex} \Arg{token list} \meta{seq~var} \Arg{true code} \Arg{false code}
 %   \end{syntax}
-%   Finds the first match of the \meta{regular expression}
-%   in the \meta{token list}. If it exists, the match is stored
-%   as the zeroeth item of the \meta{seq~var}, and further
-%   items are the contents of capturing groups, in the order
-%   of their opening parenthesis. The \meta{seq~var}
-%   is assigned locally. If there is no match,
-%   the \meta{seq~var} is cleared.
-%   The testing versions insert the \meta{true code} into the input
-%   stream if a match was found, and the \meta{false code} otherwise.
+%   Finds the first match of the \meta{regular expression} in the
+%   \meta{token list}. If it exists, the match is stored as the first
+%   item of the \meta{seq~var}, and further items are the contents of
+%   capturing groups, in the order of their opening parenthesis. The
+%   \meta{seq~var} is assigned locally. If there is no match, the
+%   \meta{seq~var} is cleared.  The testing versions insert the
+%   \meta{true code} into the input stream if a match was found, and the
+%   \meta{false code} otherwise.
+%
 %   For instance, assume that you type
 %   \begin{verbatim}
 %     \regex_extract_once:nnNTF { \A(La)?TeX(!*)\Z } { LaTeX!!! } \l_foo_seq
@@ -517,11 +574,14 @@
 %       { true } { false }
 %   \end{verbatim}
 %   Then the regular expression (anchored at the start with |\A| and
-%   at the end with |\Z|) will match the whole token list. The first
+%   at the end with |\Z|) must match the whole token list. The first
 %   capturing group, |(La)?|, matches |La|, and the second capturing
-%   group, |(!*)|, matches |!!!|. Thus, |\l_foo_seq| will contain
+%   group, |(!*)|, matches |!!!|. Thus, |\l_foo_seq| contains as a result
 %   the items |{LaTeX!!!}|, |{La}|, and |{!!!}|, and the \texttt{true}
 %   branch is left in the input stream.
+%   Note that the $n$-th item of |\l_foo_seq|, as obtained using
+%   \cs{seq_item:Nn}, correspond to the submatch numbered $(n-1)$ in
+%   functions such as \cs{regex_replace_once:nnN}.
 % \end{function}
 %
 % \begin{function}[TF, added = 2017-05-26]
@@ -543,7 +603,7 @@
 %     \regex_extract_all:nnNTF { \w+ } { Hello,~world! } \l_foo_seq
 %       { true } { false }
 %   \end{verbatim}
-%   Then the regular expression will match twice, and the resulting
+%   Then the regular expression matches twice, the resulting
 %   sequence contains the two items |{Hello}| and |{world}|,
 %   and the \texttt{true} branch is left in the input stream.
 % \end{function}
@@ -607,8 +667,6 @@
 %
 % The following need to be done now.
 % \begin{itemize}
-%   \item Change user function names!
-%   \item Clean up the use of messages.
 %   \item Rewrite the documentation in a more ordered way, perhaps add a
 %     \textsc{bnf}?
 % \end{itemize}
@@ -615,7 +673,7 @@
 %
 % Additional error-checking to come.
 % \begin{itemize}
-%   \item Currently, |a{\x34}| is recognized as |a{4}|.
+%   \item Clean up the use of messages.
 %   \item Cleaner error reporting in the replacement phase.
 %   \item Add tracing information.
 %   \item Detect attempts to use back-references and other
@@ -623,7 +681,6 @@
 %   \item Test for the maximum register \cs{c_max_register_int}.
 %   \item Find out whether the fact that |\W| and friends match the
 %     end-marker leads to bugs. Possibly update \cs{__regex_item_reverse:n}.
-%   \item Enforce that |\cC| can only be followed by a match-all dot.
 %   \item The empty cs should be matched by |\c{}|, not by
 %     |\c{csname.?endcsname\s?}|.
 % \end{itemize}
@@ -679,13 +736,24 @@
 %   \item Unicode properties: |\p{..}| and |\P{..}|;
 %     |\X| which should match any \enquote{extended} Unicode sequence.
 %     This requires to manipulate a lot of data, probably using tree-boxes.
+%   \item Provide a syntax such as |\ur{l_my_regex}| to use an
+%     already-compiled regex in a more complicated regex.  This makes
+%     regexes more easily composable.
+%   \item Allowing |\u{l_my_tl}| in more places, for instance as the
+%     number of repetitions in a quantifier.
 % \end{itemize}
 %
 % The following features of \textsc{pcre} or Perl may or may not be
 % implemented.
 % \begin{itemize}
-%   \item |\ddd|, matching the character with octal code \texttt{ddd};
-%   \item Callout with |(?C...)|;
+%   \item Callout with |(?C...)| or other syntax: some internal code
+%     changes make that possible, and it can be useful for instance in
+%     the replacement code to stop a regex replacement when some marker
+%     has been found; this raises the question of a potential
+%     |\regex_break:| and then of playing well with \cs{tl_map_break:}
+%     called from within the code in a regex.  It also raises the
+%     question of nested calls to the regex machinery, which is a
+%     problem since \tn{fontdimen} are global.
 %   \item Conditional subpatterns (other than with a look-ahead or
 %     look-behind condition): this is non-regular, isn't it?
 %   \item Named subpatterns: \TeX{} programmers have lived so far
@@ -695,10 +763,9 @@
 % The following features of \textsc{pcre} or Perl will definitely not be
 % implemented.
 % \begin{itemize}
-%   \item |\cx|, similar to \TeX{}'s own |\^^x|;
-%   \item Comments: \TeX{} already has its own system for comments.
-%   \item |\Q...\E| escaping: this would require to read the argument
-%     verbatim, which is not in the scope of this module.
+%   \item Back-references: non-regular feature, this requires
+%     backtracking, which is prohibitively slow.
+%   \item Recursion: this is a non-regular feature.
 %   \item Atomic grouping, possessive quantifiers: those tools, mostly
 %     meant to fix catastrophic backtracking, are unnecessary in a
 %     non-backtracking algorithm, and difficult to implement.
@@ -705,11 +772,16 @@
 %   \item Subroutine calls: this syntactic sugar is difficult to include
 %     in a non-backtracking algorithm, in particular because the
 %     corresponding group should be treated as atomic.
-%   \item Recursion: this is a non-regular feature.
-%   \item Back-references: non-regular feature, this requires
-%     backtracking, which is prohibitively slow.
 %   \item Backtracking control verbs: intrinsically tied to
 %     backtracking.
+%   \item |\ddd|, matching the character with octal code \texttt{ddd}:
+%     we already have |\x{...}| and the syntax is confusingly close to
+%     what we could have used for backreferences (|\1|, |\2|, \ldots{}),
+%     making it harder to produce useful error message.
+%   \item |\cx|, similar to \TeX{}'s own |\^^x|.
+%   \item Comments: \TeX{} already has its own system for comments.
+%   \item |\Q...\E| escaping: this would require to read the argument
+%     verbatim, which is not in the scope of this module.
 %   \item |\C| single byte in UTF-8 mode: Xe\TeX{} and Lua\TeX{} serve
 %     us characters directly, and splitting those into bytes is tricky,
 %     encoding dependent, and most likely not useful anyways.
@@ -898,16 +970,16 @@
 % \end{macro}
 % \end{macro}
 %
-% \begin{macro}[int, rEXP]{\@@_current_cs_to_str:}
+% \begin{macro}[int, rEXP]{\@@_curr_cs_to_str:}
 %   Expands to the string representation of the token (known to be a
-%   control sequence) at the current position \cs{l_@@_current_pos_int}.
+%   control sequence) at the current position \cs{l_@@_curr_pos_int}.
 %   It should only be used in \texttt{x}-expansion to avoid losing a
 %   leading space.
 %    \begin{macrocode}
-\cs_new:Npn \@@_current_cs_to_str:
+\cs_new:Npn \@@_curr_cs_to_str:
   {
     \exp_after:wN \exp_after:wN \exp_after:wN \cs_to_str:N
-    \tex_the:D \tex_toks:D \l_@@_current_pos_int
+    \tex_the:D \tex_toks:D \l_@@_curr_pos_int
   }
 %    \end{macrocode}
 % \end{macro}
@@ -1028,7 +1100,7 @@
 % \begin{macro}[int]{\@@_item_reverse:n}
 %   This function makes showing regular expressions easier, and lets us
 %   define |\D| in terms of |\d| for instance. There is a subtlety: the
-%   end of the query is marked by $-2$, and will thus match |\D| and
+%   end of the query is marked by $-2$, and thus matches |\D| and
 %   other negated properties; this case is caught by another part of
 %   the code.
 %    \begin{macrocode}
@@ -1046,14 +1118,14 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_item_caseful_equal:n #1
   {
-    \if_int_compare:w #1 = \l_@@_current_char_int
+    \if_int_compare:w #1 = \l_@@_curr_char_int
       \exp_after:wN \@@_break_true:w
     \fi:
   }
 \cs_new_protected:Npn \@@_item_caseful_range:nn #1 #2
   {
-    \reverse_if:N \if_int_compare:w #1 > \l_@@_current_char_int
-      \reverse_if:N \if_int_compare:w #2 < \l_@@_current_char_int
+    \reverse_if:N \if_int_compare:w #1 > \l_@@_curr_char_int
+      \reverse_if:N \if_int_compare:w #2 < \l_@@_curr_char_int
         \exp_after:wN \exp_after:wN \exp_after:wN \@@_break_true:w
       \fi:
     \fi:
@@ -1070,7 +1142,7 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_item_caseless_equal:n #1
   {
-    \if_int_compare:w #1 = \l_@@_current_char_int
+    \if_int_compare:w #1 = \l_@@_curr_char_int
       \exp_after:wN \@@_break_true:w
     \fi:
     \if_int_compare:w \l_@@_case_changed_char_int = \c_max_int
@@ -1082,8 +1154,8 @@
   }
 \cs_new_protected:Npn \@@_item_caseless_range:nn #1 #2
   {
-    \reverse_if:N \if_int_compare:w #1 > \l_@@_current_char_int
-      \reverse_if:N \if_int_compare:w #2 < \l_@@_current_char_int
+    \reverse_if:N \if_int_compare:w #1 > \l_@@_curr_char_int
+      \reverse_if:N \if_int_compare:w #2 < \l_@@_curr_char_int
         \exp_after:wN \exp_after:wN \exp_after:wN \@@_break_true:w
       \fi:
     \fi:
@@ -1108,15 +1180,15 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_compute_case_changed_char:
   {
-    \int_set_eq:NN \l_@@_case_changed_char_int \l_@@_current_char_int
-    \if_int_compare:w \l_@@_current_char_int > `Z \exp_stop_f:
-      \if_int_compare:w \l_@@_current_char_int > `z \exp_stop_f: \else:
-        \if_int_compare:w \l_@@_current_char_int < `a \exp_stop_f: \else:
+    \int_set_eq:NN \l_@@_case_changed_char_int \l_@@_curr_char_int
+    \if_int_compare:w \l_@@_curr_char_int > `Z \exp_stop_f:
+      \if_int_compare:w \l_@@_curr_char_int > `z \exp_stop_f: \else:
+        \if_int_compare:w \l_@@_curr_char_int < `a \exp_stop_f: \else:
           \int_sub:Nn \l_@@_case_changed_char_int { \c_@@_ascii_lower_int }
         \fi:
       \fi:
     \else:
-      \if_int_compare:w \l_@@_current_char_int < `A \exp_stop_f: \else:
+      \if_int_compare:w \l_@@_curr_char_int < `A \exp_stop_f: \else:
         \int_add:Nn \l_@@_case_changed_char_int { \c_@@_ascii_lower_int }
       \fi:
     \fi:
@@ -1146,7 +1218,7 @@
 \cs_new_protected:Npn \@@_item_catcode:
   {
     "
-    \if_case:w \l_@@_current_catcode_int
+    \if_case:w \l_@@_curr_catcode_int
          1       \or: 4       \or: 10      \or: 40
     \or: 100     \or:         \or: 1000    \or: 4000
     \or: 10000   \or:         \or: 100000  \or: 400000
@@ -1173,8 +1245,8 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_item_exact:nn #1#2
   {
-    \if_int_compare:w #1 = \l_@@_current_catcode_int
-      \if_int_compare:w #2 = \l_@@_current_char_int
+    \if_int_compare:w #1 = \l_@@_curr_catcode_int
+      \if_int_compare:w #2 = \l_@@_curr_char_int
         \exp_after:wN \exp_after:wN \exp_after:wN \@@_break_true:w
       \fi:
     \fi:
@@ -1181,10 +1253,10 @@
   }
 \cs_new_protected:Npn \@@_item_exact_cs:n #1
   {
-    \int_compare:nNnTF \l_@@_current_catcode_int = 0
+    \int_compare:nNnTF \l_@@_curr_catcode_int = 0
       {
         \tl_set:Nx \l_@@_internal_a_tl
-          { \scan_stop: \@@_current_cs_to_str: \scan_stop: }
+          { \scan_stop: \@@_curr_cs_to_str: \scan_stop: }
         \tl_if_in:noTF { \scan_stop: #1 \scan_stop: } \l_@@_internal_a_tl
           { \@@_break_true:w } { }
       }
@@ -1205,10 +1277,10 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_item_cs:n #1
   {
-    \int_compare:nNnT \l_@@_current_catcode_int = 0
+    \int_compare:nNnT \l_@@_curr_catcode_int = 0
       {
         \group_begin:
-          \tl_set:Nx \l_@@_cs_name_tl { \@@_current_cs_to_str: }
+          \tl_set:Nx \l_@@_cs_name_tl { \@@_curr_cs_to_str: }
           \@@_single_match:
           \@@_disable_submatches:
           \@@_build_for_cs:n {#1}
@@ -1442,7 +1514,7 @@
 \cs_new:cpn { @@_escape_/break:w }
   {
     \if_false: { \fi: }
-    \__msg_kernel_error:nn { regex } { trailing-backslash }
+    \__msg_kernel_error:nn { kernel } { trailing-backslash }
     \exp_after:wN \use_none:n \exp_after:wN { \if_false: } \fi:
   }
 \cs_new:cpn { @@_escape_~:w } { }
@@ -1481,7 +1553,7 @@
       {
         \if_false: { \fi: }
         \__tl_build_one:o \l_@@_internal_b_tl
-        \__msg_kernel_error:nnx { regex } { x-overflow } {#1}
+        \__msg_kernel_error:nnx { kernel } { x-overflow } {#1}
         \tl_set:Nx \l_@@_internal_b_tl
           { \if_false: } \fi:
       }
@@ -1570,7 +1642,7 @@
   {
     \if_false: { \fi: }
     \__tl_build_one:o \l_@@_internal_b_tl
-    \__msg_kernel_error:nnx { regex } { x-missing-rbrace } {#1}
+    \__msg_kernel_error:nnx { kernel } { x-missing-rbrace } {#1}
     \tl_set:Nx \l_@@_internal_b_tl
       { \if_false: } \fi: \@@_escape_loop:N #1
   }
@@ -1987,7 +2059,7 @@
       \if_int_compare:w \l_@@_mode_int = \c_@@_class_mode_int
         \exp_after:wN \exp_after:wN \exp_after:wN \use:n
       \else:
-        \__msg_kernel_error:nn { regex } { c-bad-mode }
+        \__msg_kernel_error:nn { kernel } { c-bad-mode }
         \exp_after:wN \exp_after:wN \exp_after:wN \use_none:n
       \fi:
     \fi:
@@ -2036,13 +2108,13 @@
   {
       \@@_if_in_class:TF
         {
-          \__msg_kernel_error:nn { regex } { missing-rbrack }
+          \__msg_kernel_error:nn { kernel } { missing-rbrack }
           \use:c { @@_compile_]: }
           \prg_do_nothing: \prg_do_nothing:
         }
         { }
       \if_int_compare:w \l_@@_group_level_int > 0 \exp_stop_f:
-        \__msg_kernel_error:nnx { regex } { missing-rparen }
+        \__msg_kernel_error:nnx { kernel } { missing-rparen }
           { \int_use:N \l_@@_group_level_int }
         \prg_replicate:nn
           { \l_@@_group_level_int }
@@ -2093,10 +2165,10 @@
       \prg_do_nothing: \prg_do_nothing:
       \prg_do_nothing: \prg_do_nothing:
       \int_compare:nNnT \l_@@_mode_int = \c_@@_catcode_mode_int
-        { \__msg_kernel_error:nn { regex } { c-trailing } }
+        { \__msg_kernel_error:nn { kernel } { c-trailing } }
       \int_compare:nNnT \l_@@_mode_int < \c_@@_outer_mode_int
         {
-          \__msg_kernel_error:nn { regex } { c-missing-rbrace }
+          \__msg_kernel_error:nn { kernel } { c-missing-rbrace }
           \@@_compile_end_cs:
           \prg_do_nothing: \prg_do_nothing:
           \prg_do_nothing: \prg_do_nothing:
@@ -2203,7 +2275,7 @@
 \cs_new_protected:Npn \@@_compile_quantifier_abort:xNN #1#2#3
   {
     \@@_compile_quantifier_none:
-    \__msg_kernel_warning:nnxx { regex } { invalid-quantifier } {#1} {#3}
+    \__msg_kernel_warning:nnxx { kernel } { invalid-quantifier } {#1} {#3}
     \@@_compile_abort_tokens:x {#1}
     #2 #3
   }
@@ -2316,7 +2388,7 @@
       { #1 #2 } { \@@_compile_special:N \c_right_brace_str }
       {
         \if_int_compare:w \l_@@_internal_a_int > \l_@@_internal_b_int
-          \__msg_kernel_error:nnxx { regex } { backwards-quantifier }
+          \__msg_kernel_error:nnxx { kernel } { backwards-quantifier }
             { \int_use:N \l_@@_internal_a_int }
             { \int_use:N \l_@@_internal_b_int }
           \int_zero:N \l_@@_internal_b_int
@@ -2350,7 +2422,7 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_compile_raw_error:N #1
   {
-    \__msg_kernel_error:nnx { regex } { bad-escape } {#1}
+    \__msg_kernel_error:nnx { kernel } { bad-escape } {#1}
     \@@_compile_raw:N #1
   }
 %    \end{macrocode}
@@ -2409,7 +2481,7 @@
     \@@_if_end_range:NNTF #2 #3
       {
         \if_int_compare:w `#1 > `#3 \exp_stop_f:
-          \__msg_kernel_error:nnxx { regex } { range-backwards } {#1} {#3}
+          \__msg_kernel_error:nnxx { kernel } { range-backwards } {#1} {#3}
         \else:
           \__tl_build_one:x
             {
@@ -2423,7 +2495,7 @@
         \fi:
       }
       {
-        \__msg_kernel_warning:nnxx { regex } { range-missing-end }
+        \__msg_kernel_warning:nnxx { kernel } { range-missing-end }
           {#1} { \c_backslash_str #3 }
         \__tl_build_one:x
           {
@@ -2451,7 +2523,7 @@
   }
 \cs_new_protected:cpn { @@_prop_.: }
   {
-    \if_int_compare:w \l_@@_current_char_int > - 2 \exp_stop_f:
+    \if_int_compare:w \l_@@_curr_char_int > - 2 \exp_stop_f:
       \exp_after:wN \@@_break_true:w
     \fi:
   }
@@ -2613,7 +2685,7 @@
 % \end{macro}
 %
 % \begin{macro}[aux]{\@@_compile_class_normal:w}
-%   In the \enquote{normal} case, we will insert \cs{@@_class:NnnnN}
+%   In the \enquote{normal} case, we insert \cs{@@_class:NnnnN}
 %   \meta{boolean} in the compiled code. The \meta{boolean} is true for
 %   positive classes, and false for negative classes, characterized by a
 %   leading |^|. The auxiliary \cs{@@_compile_class:TFNN} also
@@ -2701,8 +2773,8 @@
         \str_case:nn { #2 }
           {
             : { \@@_compile_class_posix:NNNNw }
-            = { \__msg_kernel_warning:nnx { regex } { posix-unsupported } { = } }
-            . { \__msg_kernel_warning:nnx { regex } { posix-unsupported } { . } }
+            = { \__msg_kernel_warning:nnx { kernel } { posix-unsupported } { = } }
+            . { \__msg_kernel_warning:nnx { kernel } { posix-unsupported } { . } }
           }
       }
     \@@_compile_raw:N [ #1 #2
@@ -2741,7 +2813,7 @@
               }
           }
           {
-            \__msg_kernel_warning:nnx { regex } { posix-unknown }
+            \__msg_kernel_warning:nnx { kernel } { posix-unknown }
               { \l_@@_internal_a_tl }
             \@@_compile_abort_tokens:x
               {
@@ -2751,7 +2823,7 @@
           }
       }
       {
-        \__msg_kernel_error:nnxx { regex } { posix-missing-close }
+        \__msg_kernel_error:nnxx { kernel } { posix-missing-close }
           { [: \l_@@_internal_a_tl } { #2 #4 }
         \@@_compile_abort_tokens:x { [: \l_@@_internal_a_tl }
         #1 #2 #3 #4
@@ -2793,7 +2865,7 @@
       \__tl_build_one:o \l_@@_internal_regex
       \exp_after:wN \@@_compile_quantifier:w
     \else:
-      \__msg_kernel_warning:nn { regex } { extra-rparen }
+      \__msg_kernel_warning:nn { kernel } { extra-rparen }
       \exp_after:wN \@@_compile_raw:N \exp_after:wN )
     \fi:
   }
@@ -2817,7 +2889,7 @@
         \cs_if_exist_use:cF
           { @@_compile_special_group_\token_to_str:N #4 :w }
           {
-            \__msg_kernel_warning:nnx { regex } { special-group-unknown }
+            \__msg_kernel_warning:nnx { kernel } { special-group-unknown }
               { (? #4 }
             \@@_compile_group_begin:N \@@_group:nnnN
               \@@_compile_raw:N ? #3 #4
@@ -2860,8 +2932,7 @@
 % \begin{macro}[aux]{\@@_compile_special_group_::w}
 % \begin{macro}[aux]+\@@_compile_special_group_|:w+
 %   Non-capturing, and resetting groups are easy to take care of during
-%   compilation; for those groups, the harder parts will come when
-%   building.
+%   compilation; for those groups, the harder parts come when building.
 %    \begin{macrocode}
 \cs_new_protected:cpn { @@_compile_special_group_::w }
   { \@@_compile_group_begin:N \@@_group_no_capture:nnnN }
@@ -2885,7 +2956,7 @@
         \cs_set:Npn \@@_item_range:nn { \@@_item_caseless_range:nn }
       }
       {
-        \__msg_kernel_warning:nnx { regex } { unknown-option } { (?i #2 }
+        \__msg_kernel_warning:nnx { kernel } { unknown-option } { (?i #2 }
         \@@_compile_raw:N (
         \@@_compile_raw:N ?
         \@@_compile_raw:N i
@@ -2901,7 +2972,7 @@
         \cs_set:Npn \@@_item_range:nn { \@@_item_caseful_range:nn }
       }
       {
-        \__msg_kernel_warning:nnx { regex } { unknown-option } { (?-#2#4 }
+        \__msg_kernel_warning:nnx { kernel } { unknown-option } { (?-#2#4 }
         \@@_compile_raw:N (
         \@@_compile_raw:N ?
         \@@_compile_raw:N -
@@ -2934,11 +3005,12 @@
                 \else:
                   \c_@@_catcode_in_class_mode_int
                 \fi:
+            \token_if_eq_charcode:NNT C #2 { \@@_compile_c_C:NN }
           }
       }
       { \cs_if_exist_use:cF { @@_compile_c_#2:w } }
           {
-            \__msg_kernel_error:nnx { regex } { c-missing-category } {#2}
+            \__msg_kernel_error:nnx { kernel } { c-missing-category } {#2}
             #1 #2
           }
   }
@@ -2945,6 +3017,26 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}[aux]{\@@_compile_c_C:NN}
+%   If |\cC| is not followed by |.| or |(...)| then complain because
+%   that construction cannot match anything, except in cases like
+%   |\cC[\c{...}]|, where it has no effect.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_compile_c_C:NN #1#2
+  {
+    \token_if_eq_meaning:NNTF #1 \@@_compile_special:N
+      {
+        \token_if_eq_charcode:NNTF #2 .
+          { \use_none:n }
+          { \token_if_eq_charcode:NNF #2 ( } % )
+      }
+      { \use:n }
+    { \__msg_kernel_error:nnn { kernel } { c-C-invalid } {#2} }
+    #1 #2
+  }
+%    \end{macrocode}
+% \end{macro}
+%
 % \begin{macro}[aux]
 %   {
 %     \@@_compile_c_[:w,
@@ -2992,7 +3084,7 @@
           { \@@_compile_c_lbrack_end: }
       }
           {
-            \__msg_kernel_error:nnx { regex } { c-missing-rbrack } {#2}
+            \__msg_kernel_error:nnx { kernel } { c-missing-rbrack } {#2}
             \@@_compile_c_lbrack_end:
             #1 #2
           }
@@ -3121,8 +3213,8 @@
 %   catcode test. Otherwise, it must be followed by a left brace. We
 %   then collect the characters for the argument of |\u| within an
 %   \texttt{x}-expanding assignment. In principle we could just wait to
-%   encounter a right brace, but this is unsafe: if the right brace is
-%   missing, then we will reach the end-markers of the regex, and
+%   encounter a right brace, but this is unsafe: if the right brace was
+%   missing, then we would reach the end-markers of the regex, and
 %   continue, leading to obscure fatal errors. Instead, we only allow
 %   raw and special characters, and stop when encountering a special
 %   right brace, any escaped character, or the end-marker.
@@ -3138,7 +3230,7 @@
             \@@_compile_u_loop:NN
           }
           {
-            \__msg_kernel_error:nn { regex } { u-missing-lbrace }
+            \__msg_kernel_error:nn { kernel } { u-missing-lbrace }
             \@@_compile_raw:N u #1 #2
           }
       }
@@ -3156,7 +3248,7 @@
           }
           {
             \if_false: { \fi: }
-            \__msg_kernel_error:nnx { regex } { u-missing-rbrace } {#2}
+            \__msg_kernel_error:nnx { kernel } { u-missing-rbrace } {#2}
             \@@_compile_u_end:
             #1 #2
           }
@@ -3508,8 +3600,8 @@
 % \end{variable}
 %
 % \begin{variable}{\l_@@_capturing_group_int}
-%   \cs{l_@@_capturing_group_int} is the \textsc{id} number that will
-%   be assigned to a capturing group if one was opened now. This starts
+%   \cs{l_@@_capturing_group_int} is the next \textsc{id} number to
+%   be assigned to a capturing group. This starts
 %   at $0$ for the group enclosing the full regular expression, and
 %   groups are counted in the order of their left parenthesis, except
 %   when encountering \texttt{resetting} groups.
@@ -3548,8 +3640,8 @@
 % We strive to preserve the following properties while building.
 % \begin{itemize}
 %   \item The current capturing group is
-%     $\text{\texttt{capturing_group}}-1$, and if a group is opened now,
-%     it will be labelled \texttt{capturing_group}.
+%     $\text{\texttt{capturing_group}}-1$, and if a group opened now
+%     it would be labelled \texttt{capturing_group}.
 %   \item The last allocated state is $\text{\texttt{max_state}}-1$, so
 %     \texttt{max_state} is a free state.
 %   \item The \texttt{left_state} points to a state to the left of the
@@ -3564,7 +3656,7 @@
 %   The \texttt{n}-type function first compiles its argument. Reset some
 %   variables. Allocate two states, and put a wildcard in state $0$
 %   (transitions to state $1$ and $0$ state). Then build the regex
-%   within a (capturing) group, which will be numbered $0$ (current
+%   within a (capturing) group numbered $0$ (current
 %   value of \texttt{capturing_group}). Finally, if the match reaches the
 %   last state, it is successful.
 %    \begin{macrocode}
@@ -3610,7 +3702,7 @@
     \@@_pop_lr_states:
     \@@_toks_put_right:Nn \l_@@_right_state_int
       {
-        \if_int_compare:w \l_@@_current_pos_int = \l_@@_max_pos_int
+        \if_int_compare:w \l_@@_curr_pos_int = \l_@@_max_pos_int
           \exp_after:wN \@@_action_success:
         \fi:
       }
@@ -3821,7 +3913,7 @@
 %   building the group, so that the thread which skips the group does
 %   not also set the start-point of the submatch. After adding one more
 %   state, the \texttt{left_state} is the left end of the group, from
-%   which all branches will stem, and the \texttt{right_state} is the
+%   which all branches stem, and the \texttt{right_state} is the
 %   right end of the group, and all branches end their course in that
 %   state. We store those two integers to be queried for each branch, we
 %   build the \textsc{nfa} states for the contents |#2| of the group,
@@ -3974,7 +4066,7 @@
 % \begin{macro}[aux]{\@@_group_repeat_aux:n}
 %   Here we repeat \tn{toks} ranging from \texttt{left_state} to
 %   \texttt{max_state}, $|#1|>0$ times. First add a transition so that
-%   the copies will \enquote{chain} properly. Compute the shift
+%   the copies \enquote{chain} properly. Compute the shift
 %   \texttt{c} between the original copy and the last copy we
 %   want. Shift the \texttt{right_state} and \texttt{max_state} to their
 %   final values. We then want to perform \texttt{c} copy operations. At
@@ -4145,7 +4237,7 @@
   }
 \cs_new_protected:Npn \@@_anchor:N #1
   {
-    \if_int_compare:w #1 = \l_@@_current_pos_int
+    \if_int_compare:w #1 = \l_@@_curr_pos_int
       \exp_after:wN \@@_break_true:w
     \fi:
   }
@@ -4152,7 +4244,7 @@
 \cs_new_protected:Npn \@@_b_test:
   {
     \group_begin:
-      \int_set_eq:NN \l_@@_current_char_int \l_@@_last_char_int
+      \int_set_eq:NN \l_@@_curr_char_int \l_@@_last_char_int
       \@@_prop_w:
       \@@_break_point:TF
         { \group_end: \@@_item_reverse:n \@@_prop_w: }
@@ -4189,7 +4281,7 @@
 % transitions, the instruction at the new state of the \textsc{nfa} is
 % performed immediately.  When a transition consumes a character, the
 % new state is appended to a list of \enquote{active states}, stored in
-% \cs{g_@@_thread_state_intarray}: this thread will be active again when the next
+% \cs{g_@@_thread_state_intarray}: this thread is made active again when the next
 % token is read from the query.  At every step (for each token in the
 % query), we unpack that list of active states and the corresponding
 % submatch props, and empty those.
@@ -4196,8 +4288,8 @@
 %
 % If two paths through the \textsc{nfa} \enquote{collide} in the sense
 % that they reach the same state after reading a given token, then they
-% only differ in how they previously matched, and the future execution
-% will be identical for both. (Note that this would be wrong in the
+% only differ in how they previously matched, and any future execution
+% would be identical for both. (Note that this would be wrong in the
 % presence of back-references.) Hence, we only need to keep one of the
 % two threads: the thread with the highest priority. Our \textsc{nfa} is
 % built in such a way that higher priority actions always come before
@@ -4217,7 +4309,7 @@
 % We solve this by distinguishing \enquote{normal} free transitions
 % \cs{@@_action_free:n} from transitions
 % \cs{@@_action_free_group:n} which go back to the start of the
-% group. The former will keep threads unless they have been visited by a
+% group. The former keeps threads unless they have been visited by a
 % \enquote{completed} thread, while the latter kind of transition also
 % prevents going back to a state visited by the current thread.
 %
@@ -4227,7 +4319,7 @@
 %   {
 %     \l_@@_min_pos_int,
 %     \l_@@_max_pos_int,
-%     \l_@@_current_pos_int,
+%     \l_@@_curr_pos_int,
 %     \l_@@_start_pos_int,
 %     \l_@@_success_pos_int,
 %   }
@@ -4244,7 +4336,7 @@
 %    \begin{macrocode}
 \int_new:N \l_@@_min_pos_int
 \int_new:N \l_@@_max_pos_int
-\int_new:N \l_@@_current_pos_int
+\int_new:N \l_@@_curr_pos_int
 \int_new:N \l_@@_start_pos_int
 \int_new:N \l_@@_success_pos_int
 %    \end{macrocode}
@@ -4252,8 +4344,8 @@
 %
 % \begin{variable}
 %   {
-%     \l_@@_current_char_int,
-%     \l_@@_current_catcode_int,
+%     \l_@@_curr_char_int,
+%     \l_@@_curr_catcode_int,
 %     \l_@@_last_char_int,
 %     \l_@@_case_changed_char_int
 %   }
@@ -4265,25 +4357,25 @@
 %   \texttt{current_char} variable is also used in various other phases
 %   to hold a character code.
 %    \begin{macrocode}
-\int_new:N \l_@@_current_char_int
-\int_new:N \l_@@_current_catcode_int
+\int_new:N \l_@@_curr_char_int
+\int_new:N \l_@@_curr_catcode_int
 \int_new:N \l_@@_last_char_int
 \int_new:N \l_@@_case_changed_char_int
 %    \end{macrocode}
 % \end{variable}
 %
-% \begin{variable}{\l_@@_current_state_int}
+% \begin{variable}{\l_@@_curr_state_int}
 %   For every character in the token list, each of the active states is
-%   considered in turn.  The variable \cs{l_@@_current_state_int}
+%   considered in turn.  The variable \cs{l_@@_curr_state_int}
 %   holds the state of the \textsc{nfa} which is currently considered:
 %   transitions are then given as shifts relative to the current state.
 %    \begin{macrocode}
-\int_new:N \l_@@_current_state_int
+\int_new:N \l_@@_curr_state_int
 %    \end{macrocode}
 % \end{variable}
 %
 % \begin{variable}
-%   {\l_@@_current_submatches_prop, \l_@@_success_submatches_prop}
+%   {\l_@@_curr_submatches_prop, \l_@@_success_submatches_prop}
 %   The submatches for the thread which is currently active are stored
 %   in the \texttt{current_submatches} property list variable. This
 %   property list is stored by \cs{@@_action_cost:n} into the
@@ -4291,9 +4383,9 @@
 %   retrieved when matching at the next position. When a thread
 %   succeeds, this property list is copied to
 %   \cs{l_@@_success_submatches_prop}: only the last successful thread
-%   will remain there.
+%   remains there.
 %    \begin{macrocode}
-\prop_new:N \l_@@_current_submatches_prop
+\prop_new:N \l_@@_curr_submatches_prop
 \prop_new:N \l_@@_success_submatches_prop
 %    \end{macrocode}
 % \end{variable}
@@ -4334,7 +4426,7 @@
 % \begin{variable}{\g_@@_state_active_intarray, \g_@@_thread_state_intarray}
 %   \cs{g_@@_state_active_intarray} stores the last \meta{step} in which
 %   each \meta{state} was active.  \cs{g_@@_thread_state_intarray} stores
-%   threads that will be considered in the next step, more precisely the
+%   threads to be considered in the next step, more precisely the
 %   states in which these threads are.
 %    \begin{macrocode}
 \__intarray_new:Nn \g_@@_state_active_intarray { 65536 }
@@ -4415,12 +4507,12 @@
 %<trace>    \trace_push:nnx { regex } { 1 } { @@_match }
 %<trace>    \trace:nnx { regex } { 1 } { analyzing~query~token~list }
     \int_zero:N \l_@@_balance_int
-    \int_set:Nn \l_@@_current_pos_int { 2 * \l_@@_max_state_int }
+    \int_set:Nn \l_@@_curr_pos_int { 2 * \l_@@_max_state_int }
     \@@_query_set:nnn { } { -1 } { -2 }
-    \int_set_eq:NN \l_@@_min_pos_int \l_@@_current_pos_int
+    \int_set_eq:NN \l_@@_min_pos_int \l_@@_curr_pos_int
     \__tl_analysis_map_inline:nn {#1}
       { \@@_query_set:nnn {##1} {"##2} {##3} }
-    \int_set_eq:NN \l_@@_max_pos_int \l_@@_current_pos_int
+    \int_set_eq:NN \l_@@_max_pos_int \l_@@_curr_pos_int
     \@@_query_set:nnn { } { -1 } { -2 }
 %<trace>    \trace:nnx { regex } { 1 } { initializing }
     \bool_gset_false:N \g_@@_success_bool
@@ -4449,8 +4541,8 @@
 %   successful, and has no submatches yet; clear the array of active
 %   threads, and put the starting state $0$ in it. We are then almost
 %   ready to read our first token in the query, but we actually start
-%   one position earlier than the start, and \texttt{get} that token, so
-%   that the \texttt{last_char} will be set properly for word
+%   one position earlier than the start, and \texttt{get} that token, to
+%   set \texttt{last_char} properly for word
 %   boundaries. Then call \cs{@@_match_loop:}, which runs through the
 %   query until the end or until a successful match breaks early.
 %    \begin{macrocode}
@@ -4458,16 +4550,16 @@
   {
     \if_meaning:w \c_true_bool \l_@@_empty_success_bool
       \cs_set:Npn \@@_if_two_empty_matches:F
-        { \int_compare:nNnF \l_@@_start_pos_int = \l_@@_current_pos_int }
+        { \int_compare:nNnF \l_@@_start_pos_int = \l_@@_curr_pos_int }
     \else:
       \cs_set_eq:NN \@@_if_two_empty_matches:F \use:n
     \fi:
     \int_set_eq:NN \l_@@_start_pos_int \l_@@_success_pos_int
     \bool_set_false:N \l_@@_match_success_bool
-    \prop_clear:N \l_@@_current_submatches_prop
+    \prop_clear:N \l_@@_curr_submatches_prop
     \int_set_eq:NN \l_@@_max_active_int \l_@@_min_active_int
     \@@_store_state:n { \l_@@_min_state_int }
-    \int_set:Nn \l_@@_current_pos_int
+    \int_set:Nn \l_@@_curr_pos_int
       { \l_@@_start_pos_int - 1 }
     \@@_query_get:
     \@@_match_loop:
@@ -4518,8 +4610,8 @@
 \cs_new_protected:Npn \@@_match_loop:
   {
     \int_add:Nn \l_@@_step_int { 2 }
-    \int_incr:N \l_@@_current_pos_int
-    \int_set_eq:NN \l_@@_last_char_int \l_@@_current_char_int
+    \int_incr:N \l_@@_curr_pos_int
+    \int_set_eq:NN \l_@@_last_char_int \l_@@_curr_char_int
     \int_set_eq:NN \l_@@_case_changed_char_int \c_max_int
     \@@_query_get:
     \use:x
@@ -4534,7 +4626,7 @@
     \__prg_break_point:
     \bool_set_false:N \l_@@_fresh_thread_bool %^^A was arg of break_point:n
     \if_int_compare:w \l_@@_max_active_int > \l_@@_min_active_int
-      \if_int_compare:w \l_@@_current_pos_int < \l_@@_max_pos_int
+      \if_int_compare:w \l_@@_curr_pos_int < \l_@@_max_pos_int
         \exp_after:wN \exp_after:wN \exp_after:wN \@@_match_loop:
       \fi:
     \fi:
@@ -4559,13 +4651,13 @@
 \cs_new_protected:Npn \@@_query_set:nnn #1#2#3
   {
     \__intarray_gset_fast:Nnn \g_@@_charcode_intarray
-      { \l_@@_current_pos_int } {#3}
+      { \l_@@_curr_pos_int } {#3}
     \__intarray_gset_fast:Nnn \g_@@_catcode_intarray
-      { \l_@@_current_pos_int } {#2}
+      { \l_@@_curr_pos_int } {#2}
     \__intarray_gset_fast:Nnn \g_@@_balance_intarray
-      { \l_@@_current_pos_int } { \l_@@_balance_int }
-    \@@_toks_set:Nn \l_@@_current_pos_int {#1}
-    \int_incr:N \l_@@_current_pos_int
+      { \l_@@_curr_pos_int } { \l_@@_balance_int }
+    \@@_toks_set:Nn \l_@@_curr_pos_int {#1}
+    \int_incr:N \l_@@_curr_pos_int
     \if_case:w #2 \exp_stop_f:
     \or: \int_incr:N \l_@@_balance_int
     \or: \int_decr:N \l_@@_balance_int
@@ -4580,12 +4672,12 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_query_get:
   {
-    \l_@@_current_char_int
+    \l_@@_curr_char_int
       = \__intarray_item_fast:Nn \g_@@_charcode_intarray
-          { \l_@@_current_pos_int } \scan_stop:
-    \l_@@_current_catcode_int
+          { \l_@@_curr_pos_int } \scan_stop:
+    \l_@@_curr_catcode_int
       = \__intarray_item_fast:Nn \g_@@_catcode_intarray
-          { \l_@@_current_pos_int } \scan_stop:
+          { \l_@@_curr_pos_int } \scan_stop:
   }
 %    \end{macrocode}
 % \end{macro}
@@ -4603,13 +4695,13 @@
 \cs_new_protected:Npn \@@_use_state:
   {
 %<*trace>
-    \trace:nnx { regex } { 2 } { state~\int_use:N \l_@@_current_state_int }
+    \trace:nnx { regex } { 2 } { state~\int_use:N \l_@@_curr_state_int }
 %</trace>
     \__intarray_gset_fast:Nnn \g_@@_state_active_intarray
-      { \l_@@_current_state_int } { \l_@@_step_int }
-    \@@_toks_use:w \l_@@_current_state_int
+      { \l_@@_curr_state_int } { \l_@@_step_int }
+    \@@_toks_use:w \l_@@_curr_state_int
     \__intarray_gset_fast:Nnn \g_@@_state_active_intarray
-      { \l_@@_current_state_int } { \l_@@_step_int + 1 }
+      { \l_@@_curr_state_int } { \l_@@_step_int + 1 }
   }
 %    \end{macrocode}
 % \end{macro}
@@ -4622,12 +4714,12 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_use_state_and_submatches:nn #1 #2
   {
-    \int_set:Nn \l_@@_current_state_int {#1}
+    \int_set:Nn \l_@@_curr_state_int {#1}
     \if_int_compare:w
         \__intarray_item_fast:Nn \g_@@_state_active_intarray
-          { \l_@@_current_state_int }
+          { \l_@@_curr_state_int }
                       < \l_@@_step_int
-      \tl_set:Nn \l_@@_current_submatches_prop {#2}
+      \tl_set:Nn \l_@@_curr_submatches_prop {#2}
       \exp_after:wN \@@_use_state:
     \fi:
     \scan_stop:
@@ -4661,12 +4753,12 @@
 %   state has not already been used at this position. If not, store
 %   submatches in the new state, and insert the instructions for that
 %   state in the input stream.  Then restore the old value of
-%   \cs{l_@@_current_state_int} and of the current submatches.  The
+%   \cs{l_@@_curr_state_int} and of the current submatches.  The
 %   two types of free transitions differ by how they test that the state
 %   has not been encountered yet: the \texttt{group} version is
 %   stricter, and will not use a state if it was used earlier in the
 %   current thread, hence forcefully breaking the loop, while the
-%   \enquote{normal} version will revisit a state when within the thread
+%   \enquote{normal} version will revisit a state even within the thread
 %   itself.
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_action_free:n
@@ -4677,20 +4769,20 @@
   {
     \use:x
       {
-        \int_add:Nn \l_@@_current_state_int {#2}
+        \int_add:Nn \l_@@_curr_state_int {#2}
         \exp_not:n
           {
             \if_int_compare:w
                 \__intarray_item_fast:Nn \g_@@_state_active_intarray
-                  { \l_@@_current_state_int }
+                  { \l_@@_curr_state_int }
                 #1
               \exp_after:wN \@@_use_state:
             \fi:
           }
-        \int_set:Nn \l_@@_current_state_int
-          { \int_use:N \l_@@_current_state_int }
-        \tl_set:Nn \exp_not:N \l_@@_current_submatches_prop
-          { \exp_not:o \l_@@_current_submatches_prop }
+        \int_set:Nn \l_@@_curr_state_int
+          { \int_use:N \l_@@_curr_state_int }
+        \tl_set:Nn \exp_not:N \l_@@_curr_submatches_prop
+          { \exp_not:o \l_@@_curr_submatches_prop }
       }
   }
 %    \end{macrocode}
@@ -4706,7 +4798,7 @@
 \cs_new_protected:Npn \@@_action_cost:n #1
   {
     \exp_args:No \@@_store_state:n
-      { \__int_value:w \__int_eval:w \l_@@_current_state_int + #1 }
+      { \__int_value:w \__int_eval:w \l_@@_curr_state_int + #1 }
   }
 %    \end{macrocode}
 % \end{macro}
@@ -4727,7 +4819,7 @@
 \cs_new_protected:Npn \@@_store_submatches:
   {
     \@@_toks_set:No \l_@@_max_active_int
-      { \l_@@_current_submatches_prop }
+      { \l_@@_curr_submatches_prop }
   }
 %    \end{macrocode}
 % \end{macro}
@@ -4753,8 +4845,8 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_action_submatch:n #1
   {
-    \prop_put:Nno \l_@@_current_submatches_prop {#1}
-      { \int_use:N \l_@@_current_pos_int }
+    \prop_put:Nno \l_@@_curr_submatches_prop {#1}
+      { \int_use:N \l_@@_curr_pos_int }
   }
 %    \end{macrocode}
 % \end{macro}
@@ -4776,9 +4868,9 @@
         \bool_set_true:N \l_@@_match_success_bool
         \bool_set_eq:NN \l_@@_empty_success_bool
           \l_@@_fresh_thread_bool
-        \int_set_eq:NN \l_@@_success_pos_int \l_@@_current_pos_int
+        \int_set_eq:NN \l_@@_success_pos_int \l_@@_curr_pos_int
         \prop_set_eq:NN \l_@@_success_submatches_prop
-          \l_@@_current_submatches_prop
+          \l_@@_curr_submatches_prop
         \__prg_break:
       }
   }
@@ -4844,7 +4936,7 @@
 %   replacement text. Hence concatenating the result of this function
 %   with all possible arguments (one call for each match), as well as
 %   the range from the end of the last match to the end of the string,
-%   will produce the fully replaced token list. The initialization does
+%   produces the fully replaced token list. The initialization does
 %   not matter, but (as an example) we set it as for an empty replacement.
 %    \begin{macrocode}
 \cs_new:Npn \@@_replacement_do_one_match:n #1
@@ -4879,7 +4971,7 @@
 %   exclusive. The function \cs{@@_query_range:nn} \Arg{min}
 %   \Arg{max} unpacks registers from the position \meta{min} to the
 %   position $\meta{max}-1$ included. Once this is expanded, a second
-%   \texttt{x}-expansion will result in the actual tokens from the
+%   \texttt{x}-expansion results in the actual tokens from the
 %   query. That second expansion is only done by user functions at the
 %   very end of their operation, after checking (and correcting) the
 %   brace balance first.
@@ -4956,7 +5048,7 @@
 %   The replacement text is built incrementally by abusing \tn{toks}
 %   within a group (see \pkg{l3tl-build}). We keep track in
 %   \cs{l_@@_balance_int} of the balance of explicit begin- and
-%   end-group tokens and \cs{l_@@_balance_tl} will consist of some
+%   end-group tokens and we store in \cs{l_@@_balance_tl} some
 %   code to compute the brace balance from submatches (see its
 %   description). Detect unescaped right braces, and escaped characters,
 %   with trailing \cs{prg_do_nothing:} because some of the later
@@ -4984,7 +5076,7 @@
         {#1}
       \prg_do_nothing: \prg_do_nothing:
       \if_int_compare:w \l_@@_replacement_csnames_int > 0 \exp_stop_f:
-        \__msg_kernel_error:nnx { regex } { replacement-missing-rbrace }
+        \__msg_kernel_error:nnx { kernel } { replacement-missing-rbrace }
           { \int_use:N \l_@@_replacement_csnames_int }
         \__tl_build_one:x
           { \prg_replicate:nn \l_@@_replacement_csnames_int \cs_end: }
@@ -4991,7 +5083,7 @@
       \fi:
       \seq_if_empty:NF \l_@@_replacement_category_seq
         {
-          \__msg_kernel_error:nnx { regex } { replacement-missing-rparen }
+          \__msg_kernel_error:nnx { kernel } { replacement-missing-rparen }
             { \seq_count:N \l_@@_replacement_category_seq }
           \seq_clear:N \l_@@_replacement_category_seq
         }
@@ -5076,7 +5168,7 @@
 %   submatch number is larger than the number of capturing groups.
 %   Unless the submatch appears inside a |\c{...}| or |\u{...}|
 %   construction, it must be taken into account in the brace balance.
-%   Here, |##1| will receive a pointer to the $0$-th submatch for a
+%   Later on, |##1| will be replaced by a pointer to the $0$-th submatch for a
 %   given match.  We cannot use \cs{int_eval:n} because it is
 %   expandable, and would be expanded too early (short of adding
 %   \cs{exp_not:N}, making the code messy again).
@@ -5163,7 +5255,7 @@
 % \end{macro}
 %
 % \begin{macro}[aux]{\@@_replacement_cu_aux:Nw}
-%   Start a control sequence with \cs{cs:w}, which will be protected
+%   Start a control sequence with \cs{cs:w}, protected
 %   from expansion by |#1| (either \cs{@@_replacement_exp_not:N} or
 %   \cs{exp_not:V}), or turned to a string by \cs{tl_to_str:V} if inside
 %   another csname construction |\c| or |\u|.  We use \cs{tl_to_str:V}
@@ -5226,12 +5318,12 @@
 \cs_new_protected:Npn \@@_replacement_cat:NNN #1#2#3
   {
     \token_if_eq_meaning:NNTF \prg_do_nothing: #3
-      { \__msg_kernel_error:nn { regex } { replacement-catcode-end } }
+      { \__msg_kernel_error:nn { kernel } { replacement-catcode-end } }
       {
         \int_compare:nNnTF { \l_@@_replacement_csnames_int } > 0
           {
             \__msg_kernel_error:nnnn
-              { regex } { replacement-catcode-in-cs } {#1} {#3}
+              { kernel } { replacement-catcode-in-cs } {#1} {#3}
             #2 #3
           }
           {
@@ -5241,7 +5333,19 @@
                   \l_@@_replacement_category_tl
                 \tl_set:Nn \l_@@_replacement_category_tl {#1}
               }
-              { \use:c { @@_replacement_c_#1:w } #2 #3 }
+              {
+                \token_if_eq_meaning:NNT #2 \@@_replacement_escaped:N
+                  {
+                    \@@_char_if_alphanumeric:NTF #3
+                      {
+                        \__msg_kernel_error:nnnn
+                          { kernel } { replacement-catcode-escaped }
+                          {#1} {#3}
+                      }
+                      { }
+                  }
+                \use:c { @@_replacement_c_#1:w } #2 #3
+              }
           }
       }
   }
@@ -5248,7 +5352,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% We will need to change the category code of the null character many
+% We now need to change the category code of the null character many
 % times, hence work in a group. The catcode-specific macros below are
 % defined in alphabetical order; if you are trying to understand the
 % code, start from the end of the alphabet as those categories are
@@ -5396,7 +5500,7 @@
   \cs_new_protected:Npn \@@_replacement_c_S:w #1#2
     {
       \if_int_compare:w `#2 = 0 \exp_stop_f:
-        \__msg_kernel_error:nn { regex } { replacement-null-space }
+        \__msg_kernel_error:nn { kernel } { replacement-null-space }
       \fi:
       \tex_lccode:D `\ = `#2 \scan_stop:
       \tex_lowercase:D { \__tl_build_one:n {~} }
@@ -5439,7 +5543,7 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_replacement_error:NNN #1#2#3
   {
-    \__msg_kernel_error:nnx { regex } { replacement-#1 } {#3}
+    \__msg_kernel_error:nnx { kernel } { replacement-#1 } {#3}
     #2 #3
   }
 %    \end{macrocode}
@@ -5733,7 +5837,7 @@
         }
       #1
       \@@_match:n {#2}
-%<assert>\assert_int:n { \l_@@_current_pos_int = \l_@@_max_pos_int }
+%<assert>\assert_int:n { \l_@@_curr_pos_int = \l_@@_max_pos_int }
       \__intarray_gset_fast:Nnn \g_@@_submatch_prev_intarray
         { \l_@@_submatch_int } { 0 }
       \__intarray_gset_fast:Nnn \g_@@_submatch_end_intarray
@@ -5781,7 +5885,7 @@
         { \flag_height:n { @@_begin } + \flag_height:n { @@_end } }
         = 0
         {
-          \__msg_kernel_error:nnxxx { regex } { result-unbalanced }
+          \__msg_kernel_error:nnxxx { kernel } { result-unbalanced }
             { splitting~or~extracting~submatches }
             { \flag_height:n { @@_end } }
             { \flag_height:n { @@_begin } }
@@ -5972,7 +6076,7 @@
   {
     \if_int_compare:w \l_@@_balance_int = 0 \exp_stop_f:
     \else:
-      \__msg_kernel_error:nnxxx { regex } { result-unbalanced }
+      \__msg_kernel_error:nnxxx { kernel } { result-unbalanced }
         { replacing }
         { \int_max:nn { - \l_@@_balance_int } { 0 } }
         { \int_max:nn { \l_@@_balance_int } { 0 } }
@@ -6003,13 +6107,13 @@
 %
 % Messages for the preparsing phase.
 %    \begin{macrocode}
-\__msg_kernel_new:nnnn { regex } { trailing-backslash }
+\__msg_kernel_new:nnnn { kernel } { trailing-backslash }
   { Trailing~escape~character~'\iow_char:N\\'. }
   {
     A~regular~expression~or~its~replacement~text~ends~with~
     the~escape~character~'\iow_char:N\\'.~It~will~be~ignored.
   }
-\__msg_kernel_new:nnnn { regex } { x-missing-rbrace }
+\__msg_kernel_new:nnnn { kernel } { x-missing-rbrace }
   { Missing~closing~brace~in~'\iow_char:N\\x'~hexadecimal~sequence. }
   {
     You~wrote~something~like~
@@ -6016,7 +6120,7 @@
     '\iow_char:N\\x\{...#1'.~
     The~closing~brace~is~missing.
   }
-\__msg_kernel_new:nnnn { regex } { x-overflow }
+\__msg_kernel_new:nnnn { kernel } { x-overflow }
   { Character~code~'#1'~too~large~in~'\iow_char:N\\x'~hexadecimal~sequence. }
   {
     You~wrote~something~like~
@@ -6028,7 +6132,7 @@
 %
 % Invalid quantifier.
 %    \begin{macrocode}
-\__msg_kernel_new:nnnn { regex } { invalid-quantifier }
+\__msg_kernel_new:nnnn { kernel } { invalid-quantifier }
   { Braced~quantifier~'#1'~may~not~be~followed~by~'#2'. }
   {
     The~character~'#2'~is~invalid~in~the~braced~quantifier~'#1'.~
@@ -6040,13 +6144,13 @@
 % Messages for missing or extra closing brackets and parentheses, with
 % some fancy singular/plural handling for the case of parentheses.
 %    \begin{macrocode}
-\__msg_kernel_new:nnnn { regex } { missing-rbrack }
+\__msg_kernel_new:nnnn { kernel } { missing-rbrack }
   { Missing~right~bracket~inserted~in~regular~expression. }
   {
     LaTeX~was~given~a~regular~expression~where~a~character~class~
     was~started~with~'[',~but~the~matching~']'~is~missing.
   }
-\__msg_kernel_new:nnnn { regex } { missing-rparen }
+\__msg_kernel_new:nnnn { kernel } { missing-rparen }
   {
     Missing~right~
     \int_compare:nTF { #1 = 1 } { parenthesis } { parentheses } ~
@@ -6056,7 +6160,7 @@
     LaTeX~was~given~a~regular~expression~with~\int_eval:n {#1} ~
     more~left~parentheses~than~right~parentheses.
   }
-\__msg_kernel_new:nnnn { regex } { extra-rparen }
+\__msg_kernel_new:nnnn { kernel } { extra-rparen }
   { Extra~right~parenthesis~ignored~in~regular~expression. }
   {
     LaTeX~came~across~a~closing~parenthesis~when~no~submatch~group~
@@ -6066,7 +6170,7 @@
 %
 % Some escaped alphanumerics are not allowed everywhere.
 %    \begin{macrocode}
-\__msg_kernel_new:nnnn { regex } { bad-escape }
+\__msg_kernel_new:nnnn { kernel } { bad-escape }
   {
     Invalid~escape~'\iow_char:N\\#1'~
     \@@_if_in_cs:TF { within~a~control~sequence. }
@@ -6094,7 +6198,7 @@
 %
 % Range errors.
 %    \begin{macrocode}
-\__msg_kernel_new:nnnn { regex } { range-missing-end }
+\__msg_kernel_new:nnnn { kernel } { range-missing-end }
   { Invalid~end-point~for~range~'#1-#2'~in~character~class. }
   {
     The~end-point~'#2'~of~the~range~'#1-#2'~may~not~serve~as~an~
@@ -6101,7 +6205,7 @@
     end-point~for~a~range:~alphanumeric~characters~should~not~be~
     escaped,~and~non-alphanumeric~characters~should~be~escaped.
   }
-\__msg_kernel_new:nnnn { regex } { range-backwards }
+\__msg_kernel_new:nnnn { kernel } { range-backwards }
   { Range~'[#1-#2]'~out~of~order~in~character~class. }
   {
     In~ranges~of~characters~'[x-y]'~appearing~in~character~classes,~
@@ -6113,7 +6217,7 @@
 %
 % Errors related to |\c| and |\u|.
 %    \begin{macrocode}
-\__msg_kernel_new:nnnn { regex } { c-bad-mode }
+\__msg_kernel_new:nnnn { kernel } { c-bad-mode }
   { Invalid~nested~'\iow_char:N\\c'~escape~in~regular~expression. }
   {
     The~'\iow_char:N\\c'~escape~cannot~be~used~within~
@@ -6120,7 +6224,14 @@
     a~control~sequence~test~'\iow_char:N\\c{...}'.~
     To~combine~several~category~tests,~use~'\iow_char:N\\c[...]'.
   }
-\__msg_kernel_new:nnnn { regex } { c-missing-rbrace }
+\__msg_kernel_new:nnnn { kernel } { c-C-invalid }
+  { '\iow_char:N\\cC'~should~be~followed~by~'.'~or~'(',~not~'#1'. }
+  {
+    The~'\iow_char:N\\cC'~construction~restricts~the~next~item~to~be~a~
+    control~sequence~or~the~next~group~to~be~made~of~control~sequences.~
+    It~only~makes~sense~to~follow~it~by~'.'~or~by~a~group.
+  }
+\__msg_kernel_new:nnnn { kernel } { c-missing-rbrace }
   { Missing~right~brace~inserted~for~'\iow_char:N\\c'~escape. }
   {
     LaTeX~was~given~a~regular~expression~where~a~
@@ -6127,13 +6238,13 @@
     '\iow_char:N\\c\iow_char:N\{...'~construction~was~not~ended~
     with~a~closing~brace~'\iow_char:N\}'.
   }
-\__msg_kernel_new:nnnn { regex } { c-missing-rbrack }
+\__msg_kernel_new:nnnn { kernel } { c-missing-rbrack }
   { Missing~right~bracket~inserted~for~'\iow_char:N\\c'~escape. }
   {
     A~construction~'\iow_char:N\\c[...'~appears~in~a~
     regular~expression,~but~the~closing~']'~is~not~present.
   }
-\__msg_kernel_new:nnnn { regex } { c-missing-category }
+\__msg_kernel_new:nnnn { kernel } { c-missing-category }
   { Invalid~character~'#1'~following~'\iow_char:N\\c'~escape. }
   {
     In~regular~expressions,~the~'\iow_char:N\\c'~escape~sequence~
@@ -6141,19 +6252,19 @@
     capital~letter~representing~a~character~category,~namely~
     one~of~'ABCDELMOPSTU'.
   }
-\__msg_kernel_new:nnnn { regex } { c-trailing }
+\__msg_kernel_new:nnnn { kernel } { c-trailing }
   { Trailing~category~code~escape~'\iow_char:N\\c'... }
   {
     A~regular~expression~ends~with~'\iow_char:N\\c'~followed~
     by~a~letter.~It~will~be~ignored.
   }
-\__msg_kernel_new:nnnn { regex } { u-missing-lbrace }
+\__msg_kernel_new:nnnn { kernel } { u-missing-lbrace }
   { Missing~left~brace~following~'\iow_char:N\\u'~escape. }
   {
     The~'\iow_char:N\\u'~escape~sequence~must~be~followed~by~
     a~brace~group~with~the~name~of~the~variable~to~use.
   }
-\__msg_kernel_new:nnnn { regex } { u-missing-rbrace }
+\__msg_kernel_new:nnnn { kernel } { u-missing-rbrace }
   { Missing~right~brace~inserted~for~'\iow_char:N\\u'~escape. }
   {
     LaTeX~
@@ -6166,7 +6277,7 @@
 %
 % Errors when encountering the \textsc{posix} syntax |[:...:]|.
 %    \begin{macrocode}
-\__msg_kernel_new:nnnn { regex } { posix-unsupported }
+\__msg_kernel_new:nnnn { kernel } { posix-unsupported }
   { POSIX~collating~element~'[#1 ~ #1]'~not~supported. }
   {
     The~'[.foo.]'~and~'[=bar=]'~syntaxes~have~a~special~meaning~
@@ -6173,7 +6284,7 @@
     in~POSIX~regular~expressions.~This~is~not~supported~by~LaTeX.~
     Maybe~you~forgot~to~escape~a~left~bracket~in~a~character~class?
   }
-\__msg_kernel_new:nnnn { regex } { posix-unknown }
+\__msg_kernel_new:nnnn { kernel } { posix-unknown }
   { POSIX~class~'[:#1:]'~unknown. }
   {
     '[:#1:]'~is~not~among~the~known~POSIX~classes~
@@ -6182,7 +6293,7 @@
     '[:print:]',~'[:punct:]',~'[:space:]',~'[:upper:]',~
     '[:word:]',~and~'[:xdigit:]'.
   }
-\__msg_kernel_new:nnnn { regex } { posix-missing-close }
+\__msg_kernel_new:nnnn { kernel } { posix-missing-close }
   { Missing~closing~':]'~for~POSIX~class. }
   { The~POSIX~syntax~'#1'~must~be~followed~by~':]',~not~'#2'. }
 %    \end{macrocode}
@@ -6191,7 +6302,7 @@
 % with an unbalanced token list, which we must re-balance by adding
 % begin-group or end-group character tokens.
 %    \begin{macrocode}
-\__msg_kernel_new:nnnn { regex } { result-unbalanced }
+\__msg_kernel_new:nnnn { kernel } { result-unbalanced }
   { Missing~brace~inserted~when~#1. }
   {
     LaTeX~was~asked~to~do~some~regular~expression~operation,~
@@ -6203,13 +6314,13 @@
 %
 % Error message for unknown options.
 %    \begin{macrocode}
-\__msg_kernel_new:nnnn { regex } { unknown-option }
+\__msg_kernel_new:nnnn { kernel } { unknown-option }
   { Unknown~option~'#1'~for~regular~expressions. }
   {
     The~only~available~option~is~'case-insensitive',~toggled~by~
     '(?i)'~and~'(?-i)'.
   }
-\__msg_kernel_new:nnnn { regex } { special-group-unknown }
+\__msg_kernel_new:nnnn { kernel } { special-group-unknown }
   { Unknown~special~group~'#1~...'~in~a~regular~expression. }
   {
     The~only~valid~constructions~starting~with~'(?'~are~
@@ -6219,7 +6330,7 @@
 %
 % Errors in the replacement text.
 %    \begin{macrocode}
-\__msg_kernel_new:nnnn { regex } { replacement-c }
+\__msg_kernel_new:nnnn { kernel } { replacement-c }
   { Misused~'\iow_char:N\\c'~command~in~a~replacement~text. }
   {
     In~a~replacement~text,~the~'\iow_char:N\\c'~escape~sequence~
@@ -6226,7 +6337,7 @@
     can~be~followed~by~one~of~the~letters~'ABCDELMOPSTU'~
     or~a~brace~group,~not~by~'#1'.
   }
-\__msg_kernel_new:nnnn { regex } { replacement-u }
+\__msg_kernel_new:nnnn { kernel } { replacement-u }
   { Misused~'\iow_char:N\\u'~command~in~a~replacement~text. }
   {
     In~a~replacement~text,~the~'\iow_char:N\\u'~escape~sequence~
@@ -6233,7 +6344,7 @@
     must~be~~followed~by~a~brace~group~holding~the~name~of~the~
     variable~to~use.
   }
-\__msg_kernel_new:nnnn { regex } { replacement-g }
+\__msg_kernel_new:nnnn { kernel } { replacement-g }
   {
     Missing~brace~for~the~'\iow_char:N\\g'~construction~
     in~a~replacement~text.
@@ -6243,7 +6354,7 @@
     submatches~are~represented~either~as~'\iow_char:N \\g{dd..d}',~
     or~'\\d',~where~'d'~are~single~digits.~Here,~a~brace~is~missing.
   }
-\__msg_kernel_new:nnnn { regex } { replacement-catcode-end }
+\__msg_kernel_new:nnnn { kernel } { replacement-catcode-end }
   {
     Missing~character~for~the~'\iow_char:N\\c<category><character>'~
     construction~in~a~replacement~text.
@@ -6254,8 +6365,18 @@
     the~character~category.~Then,~a~character~must~follow.~LaTeX~
     reached~the~end~of~the~replacement~when~looking~for~that.
   }
-\__msg_kernel_new:nnnn { regex } { replacement-catcode-in-cs }
+\__msg_kernel_new:nnnn { kernel } { replacement-catcode-escaped }
   {
+    Escaped~letter~or~digit~after~category~code~in~replacement~text.
+  }
+  {
+    In~a~replacement~text,~the~'\iow_char:N\\c'~escape~sequence~
+    can~be~followed~by~one~of~the~letters~'ABCDELMOPSTU'~representing~
+    the~character~category.~Then,~a~character~must~follow,~not~
+    '\iow_char:N\\#2'.
+  }
+\__msg_kernel_new:nnnn { kernel } { replacement-catcode-in-cs }
+  {
     Category~code~'\iow_char:N\\c#1#3'~ignored~inside~
     '\iow_char:N\\c\{...\}'~in~a~replacement~text.
   }
@@ -6264,7 +6385,7 @@
     '\iow_char:N\\c\{...\}'~are~ignored~when~building~the~control~
     sequence~name.
   }
-\__msg_kernel_new:nnnn { regex } { replacement-null-space }
+\__msg_kernel_new:nnnn { kernel } { replacement-null-space }
   { TeX~cannot~build~a~space~token~with~character~code~0. }
   {
     You~asked~for~a~character~token~with~category~space,~
@@ -6273,13 +6394,13 @@
     This~specific~case~is~impossible~and~will~be~replaced~
     by~a~normal~space.
   }
-\__msg_kernel_new:nnnn { regex } { replacement-missing-rbrace }
+\__msg_kernel_new:nnnn { kernel } { replacement-missing-rbrace }
   { Missing~right~brace~inserted~in~replacement~text. }
   {
     There~ \int_compare:nTF { #1 = 1 } { was } { were } ~ #1~
     missing~right~\int_compare:nTF { #1 = 1 } { brace } { braces } .
   }
-\__msg_kernel_new:nnnn { regex } { replacement-missing-rparen }
+\__msg_kernel_new:nnnn { kernel } { replacement-missing-rparen }
   { Missing~right~parenthesis~inserted~in~replacement~text. }
   {
     There~ \int_compare:nTF { #1 = 1 } { was } { were } ~ #1~

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -62,8 +62,8 @@
 %     \cs{seq_new:N} \meta{sequence}
 %   \end{syntax}
 %   Creates a new \meta{sequence} or raises an error if the name is
-%   already taken. The declaration is global. The \meta{sequence} will
-%   initially contain no items.
+%   already taken. The declaration is global. The \meta{sequence}
+%   initially contains no items.
 % \end{function}
 %
 % \begin{function}{\seq_clear:N, \seq_clear:c, \seq_gclear:N, \seq_gclear:c}
@@ -141,7 +141,7 @@
 %   \end{syntax}
 %   Concatenates the content of \meta{sequence_2} and \meta{sequence_3}
 %   together and saves the result in \meta{sequence_1}. The items in
-%   \meta{sequence_2} will be placed at the left side of the new sequence.
+%   \meta{sequence_2} are placed at the left side of the new sequence.
 % \end{function}
 %
 % \begin{function}[EXP, pTF, added=2012-03-03]
@@ -204,8 +204,8 @@
 %   Stores the left-most item from a \meta{sequence} in the
 %   \meta{token list variable} without removing it from the
 %   \meta{sequence}. The \meta{token list variable} is assigned locally.
-%   If \meta{sequence} is empty the \meta{token list variable} will
-%   contain the special marker \cs{q_no_value}.
+%   If \meta{sequence} is empty the \meta{token list variable}
+%   is set to the special marker \cs{q_no_value}.
 % \end{function}
 %
 % \begin{function}[updated = 2012-05-19]{\seq_get_right:NN, \seq_get_right:cN}
@@ -215,8 +215,8 @@
 %   Stores the right-most item from a \meta{sequence} in the
 %   \meta{token list variable} without removing it from the
 %   \meta{sequence}. The \meta{token list variable} is assigned locally.
-%   If \meta{sequence} is empty the \meta{token list variable} will
-%   contain the special marker \cs{q_no_value}.
+%   If \meta{sequence} is empty the \meta{token list variable}
+%   is set to the special marker \cs{q_no_value}.
 % \end{function}
 %
 % \begin{function}[updated = 2012-05-14]{\seq_pop_left:NN, \seq_pop_left:cN}
@@ -227,8 +227,8 @@
 %   \meta{token list variable}, \emph{i.e.}~removes the item from the
 %   sequence and stores it in the \meta{token list variable}.
 %   Both of the variables are assigned locally. If \meta{sequence} is
-%   empty the \meta{token list variable} will
-%   contain the special marker \cs{q_no_value}.
+%   empty the \meta{token list variable} is set to
+%   the special marker \cs{q_no_value}.
 % \end{function}
 %
 % \begin{function}[updated = 2012-05-14]{\seq_gpop_left:NN, \seq_gpop_left:cN}
@@ -240,8 +240,8 @@
 %   sequence and stores it in the \meta{token list variable}.
 %   The \meta{sequence} is modified globally, while the assignment of
 %   the \meta{token list variable} is local.
-%   If \meta{sequence} is empty the \meta{token list variable} will
-%   contain the special marker \cs{q_no_value}.
+%   If \meta{sequence} is empty the \meta{token list variable} is set to
+%   the special marker \cs{q_no_value}.
 % \end{function}
 %
 % \begin{function}[updated = 2012-05-19]{\seq_pop_right:NN, \seq_pop_right:cN}
@@ -252,8 +252,8 @@
 %   \meta{token list variable}, \emph{i.e.}~removes the item from the
 %   sequence and stores it in the \meta{token list variable}.
 %   Both of the variables are assigned locally. If \meta{sequence} is
-%   empty the \meta{token list variable} will
-%   contain the special marker \cs{q_no_value}.
+%   empty the \meta{token list variable} is set to
+%   the special marker \cs{q_no_value}.
 % \end{function}
 %
 % \begin{function}[updated = 2012-05-19]{\seq_gpop_right:NN, \seq_gpop_right:cN}
@@ -265,8 +265,8 @@
 %   sequence and stores it in the \meta{token list variable}.
 %   The \meta{sequence} is modified globally, while the assignment of
 %   the \meta{token list variable} is local.
-%   If \meta{sequence} is empty the \meta{token list variable} will
-%   contain the special marker \cs{q_no_value}.
+%   If \meta{sequence} is empty the \meta{token list variable} is set to
+%   the special marker \cs{q_no_value}.
 % \end{function}
 %
 % \begin{function}[added = 2014-07-17, EXP]{\seq_item:Nn, \seq_item:cn}
@@ -274,17 +274,17 @@
 %     \cs{seq_item:Nn} \meta{sequence} \Arg{integer expression}
 %   \end{syntax}
 %   Indexing items in the \meta{sequence} from~$1$ at the top (left), this
-%   function will evaluate the \meta{integer expression} and leave the
+%   function evaluates the \meta{integer expression} and leaves the
 %   appropriate item from the sequence in the input stream. If the
 %   \meta{integer expression} is negative, indexing occurs from the
-%   bottom (right) of the sequence. When the \meta{integer expression}
+%   bottom (right) of the sequence. If the \meta{integer expression}
 %   is larger than the number of items in the \meta{sequence} (as
-%   calculated by \cs{seq_count:N}) then the function will expand to
+%   calculated by \cs{seq_count:N}) then the function expands to
 %   nothing.
 %   \begin{texnote}
 %     The result is returned within the \tn{unexpanded}
 %     primitive (\cs{exp_not:n}), which means that the \meta{item}
-%     will not expand further when appearing in an \texttt{x}-type
+%     does not expand further when appearing in an \texttt{x}-type
 %     argument expansion.
 %   \end{texnote}
 % \end{function}
@@ -515,8 +515,8 @@
 %     \cs{seq_map_break:}
 %   \end{syntax}
 %   Used to terminate a \cs[no-index]{seq_map_\ldots} function before all
-%   entries in the \meta{sequence} have been processed. This will
-%   normally take place within a conditional statement, for example
+%   entries in the \meta{sequence} have been processed. This
+%   normally takes place within a conditional statement, for example
 %   \begin{verbatim}
 %     \seq_map_inline:Nn \l_my_seq
 %       {
@@ -527,12 +527,12 @@
 %           }
 %       }
 %   \end{verbatim}
-%   Use outside of a \cs[no-index]{seq_map_\ldots} scenario will lead to low
+%   Use outside of a \cs[no-index]{seq_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 further items are taken
-%     from the input stream. This will depend on the design of the mapping
+%     from the input stream. This depends on the design of the mapping
 %     function.
 %   \end{texnote}
 % \end{function}
@@ -543,8 +543,8 @@
 %   \end{syntax}
 %   Used to terminate a \cs[no-index]{seq_map_\ldots} function before all
 %   entries in the \meta{sequence} have been processed, inserting
-%   the \meta{tokens} after the mapping has ended. This will
-%   normally take place within a conditional statement, for example
+%   the \meta{tokens} after the mapping has ended. This
+%   normally takes place within a conditional statement, for example
 %   \begin{verbatim}
 %     \seq_map_inline:Nn \l_my_seq
 %       {
@@ -555,13 +555,13 @@
 %           }
 %       }
 %   \end{verbatim}
-%   Use outside of a \cs[no-index]{seq_map_\ldots} scenario will lead to low
+%   Use outside of a \cs[no-index]{seq_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 will depend on the design of the mapping function.
+%     This depends on the design of the mapping function.
 %   \end{texnote}
 % \end{function}
 %
@@ -571,7 +571,7 @@
 %   \end{syntax}
 %   Leaves the number of items in the \meta{sequence} in the input
 %   stream as an \meta{integer denotation}. The total number of items
-%   in a \meta{sequence} will include those which are empty and duplicates,
+%   in a \meta{sequence} includes those which are empty and duplicates,
 %   \emph{i.e.}~every item in a \meta{sequence} is unique.
 % \end{function}
 %
@@ -589,7 +589,7 @@
 %   sequence has exactly two items, then they are placed in the input stream
 %   separated by the \meta{separator between two}.  If the sequence has
 %   a single item, it is placed in the input stream, and an empty sequence
-%   produces no output.  An error will be raised if the variable does
+%   produces no output.  An error is raised if the variable does
 %   not exist or if it is invalid.
 %
 %   For example,
@@ -597,13 +597,13 @@
 %     \seq_set_split:Nnn \l_tmpa_seq { | } { a | b | c | {de} | f }
 %     \seq_use:Nnnn \l_tmpa_seq { ~and~ } { ,~ } { ,~and~ }
 %   \end{verbatim}
-%   will insert \enquote{\texttt{a, b, c, de, and f}} in the input
+%   inserts \enquote{\texttt{a, b, c, de, and f}} in the input
 %   stream.  The first separator argument is not used in this case
 %   because the sequence has more than $2$ items.
 %   \begin{texnote}
 %     The result is returned within the \tn{unexpanded}
 %     primitive (\cs{exp_not:n}), which means that the \meta{items}
-%     will not expand further when appearing in an \texttt{x}-type
+%     do not expand further when appearing in an \texttt{x}-type
 %     argument expansion.
 %   \end{texnote}
 % \end{function}
@@ -615,7 +615,7 @@
 %   Places the contents of the \meta{seq~var} in the input stream, with
 %   the \meta{separator} between the items.  If the sequence has
 %   a single item, it is placed in the input stream with no \meta{separator},
-%   and an empty sequence produces no output.  An error will be raised if
+%   and an empty sequence produces no output.  An error is raised if
 %   the variable does not exist or if it is invalid.
 %
 %   For example,
@@ -623,12 +623,12 @@
 %     \seq_set_split:Nnn \l_tmpa_seq { | } { a | b | c | {de} | f }
 %     \seq_use:Nn \l_tmpa_seq { ~and~ }
 %   \end{verbatim}
-%   will insert \enquote{\texttt{a and b and c and de and f}} in the input
+%   inserts \enquote{\texttt{a and b and c and de and f}} in the input
 %   stream.
 %   \begin{texnote}
 %     The result is returned within the \tn{unexpanded}
 %     primitive (\cs{exp_not:n}), which means that the \meta{items}
-%     will not expand further when appearing in an \texttt{x}-type
+%     do not expand further when appearing in an \texttt{x}-type
 %     argument expansion.
 %   \end{texnote}
 % \end{function}
@@ -649,8 +649,8 @@
 %   Reads the top item from a \meta{sequence} into the
 %   \meta{token list variable} without removing it from the
 %   \meta{sequence}. The \meta{token list variable} is assigned locally.
-%   If \meta{sequence} is empty the \meta{token list variable} will
-%   contain the special marker \cs{q_no_value}.
+%   If \meta{sequence} is empty the \meta{token list variable} is set to
+%   the special marker \cs{q_no_value}.
 % \end{function}
 %
 % \begin{function}[updated = 2012-05-14]{\seq_pop:NN, \seq_pop:cN}
@@ -659,8 +659,8 @@
 %   \end{syntax}
 %   Pops the top item from a \meta{sequence} into the
 %   \meta{token list variable}. Both of the variables are assigned
-%   locally. If \meta{sequence} is empty the \meta{token list variable} will
-%   contain the special marker \cs{q_no_value}.
+%   locally. If \meta{sequence} is empty the \meta{token list variable}
+%   is set to the special marker \cs{q_no_value}.
 % \end{function}
 %
 % \begin{function}[updated = 2012-05-14]{\seq_gpop:NN, \seq_gpop:cN}
@@ -670,8 +670,8 @@
 %   Pops the top item from a \meta{sequence} into the
 %   \meta{token list variable}. The \meta{sequence} is modified globally,
 %   while the \meta{token list variable} is assigned locally. If
-%   \meta{sequence} is empty the \meta{token list variable} will
-%   contain the special marker \cs{q_no_value}.
+%   \meta{sequence} is empty the \meta{token list variable} is set to
+%   the special marker \cs{q_no_value}.
 % \end{function}
 %
 % \begin{function}[TF, added = 2012-05-14, updated = 2012-05-19]{\seq_get:NN, \seq_get:cN}
@@ -869,7 +869,7 @@
 %     \cs{__seq_item:n} \Arg{item}
 %   \end{syntax}
 %   The internal token used to begin each sequence entry. If expanded
-%   outside of a mapping or manipulation function, an error will be
+%   outside of a mapping or manipulation function, an error is
 %   raised. The definition should always be set globally.
 % \end{function}
 %
@@ -1304,11 +1304,10 @@
 %   \texttt{x}-type expansion uses \cs{str_if_eq:nnT} to find potential
 %   matches. If one is found, the expansion is halted and the necessary
 %   set up takes place to use the \cs{tl_if_eq:NNT} test. The \texttt{x}-type
-%   is started again, including all of the items copied already. This will
-%   happen repeatedly until the entire sequence has been scanned. The code
+%   is started again, including all of the items copied already. This
+%   happens repeatedly until the entire sequence has been scanned. The code
 %   is set up to avoid needing and intermediate scratch list: the lead-off
-%   \texttt{x}-type expansion (|#1 #2 {#2}|) will ensure that nothing is
-%   lost.
+%   \texttt{x}-type expansion (|#1 #2 {#2}|) ensures that nothing is lost.
 %    \begin{macrocode}
 \cs_new_protected:Npn \seq_remove_all:Nn
   { \@@_remove_all_aux:NNn \tl_set:Nx }
@@ -1436,7 +1435,7 @@
 %   argument with the test sequence. If the two items are equal, the
 %   mapping is terminated and \cs{group_end:} \cs{prg_return_true:}
 %   is inserted after skipping over the rest of the recursion. On the
-%   other hand, if there is no match then the loop will break returning
+%   other hand, if there is no match then the loop breaks, returning
 %   \cs{prg_return_false:}.
 %   Everything is inside a group so that \cs{@@_item:n} is preserved
 %   in nested situations.
@@ -1591,7 +1590,7 @@
 %   supplied by the |{ \if_false: } \fi:| \ldots
 %   |\if_false: { \fi: }| construct. Using an \texttt{x}-type
 %   expansion and a \enquote{non-expanding} definition for \cs{@@_item:n},
-%   the left-most $n - 1$ entries in a sequence of $n$ items will be stored
+%   the left-most $n - 1$ entries in a sequence of $n$ items are stored
 %   back in the sequence. That needs a loop of unknown length, hence using the
 %   strange \cs{if_false:} way of including braces. When the last item
 %   of the sequence is reached, the closing brace for the assignment is
@@ -1687,7 +1686,7 @@
 % \begin{macro}[aux]{\@@_item:wNn, \@@_item:nN, \@@_item:nnn}
 %   The idea here is to find the offset of the item from the left, then use
 %   a loop to grab the correct item. If the resulting offset is too large,
-%   then the stop code |{ ? \__prg_break: } { }| will be used by the auxiliary,
+%   then the stop code |{ ? \__prg_break: } { }| is used by the auxiliary,
 %   terminating the loop and returning nothing at all.
 %    \begin{macrocode}
 \cs_new:Npn \seq_item:Nn #1

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -66,7 +66,7 @@
 %   \end{syntax}
 %   Creates a new \meta{dimension} or raises an error if the name is
 %   already taken. The declaration is global. The \meta{dimension}
-%   will initially be equal to $0$\,pt.
+%   is initially equal to $0$\,pt.
 % \end{function}
 %
 % \begin{function}[added = 2012-03-05]{\dim_const:Nn, \dim_const:cn}
@@ -74,7 +74,7 @@
 %     \cs{dim_const:Nn} \meta{dimension} \Arg{dimension expression}
 %   \end{syntax}
 %   Creates a new constant \meta{dimension} or raises an error if the
-%   name is already taken. The value of the \meta{dimension} will be set
+%   name is already taken. The value of the \meta{dimension} is set
 %   globally to the \meta{dimension expression}.
 % \end{function}
 %
@@ -185,7 +185,7 @@
 %     \tl_set:Nx \l_my_tl { \dim_ratio:nn { 5 pt } { 10 pt } }
 %     \tl_show:N \l_my_tl
 %   \end{verbatim}
-%   will display |327680/655360| on the terminal.
+%   displays |327680/655360| on the terminal.
 % \end{function}
 %
 % \section{Dimension expression conditionals}
@@ -267,7 +267,8 @@
 %   This function evaluates the \meta{test dimension expression} and
 %   compares this in turn to each of the
 %   \meta{dimension expression cases}. If the two are equal then the
-%   associated \meta{code} is left in the input stream. If any of 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
 %   input stream (after the code for the appropriate case), while if none
 %   match then the \meta{false code} is inserted. The function
@@ -284,7 +285,7 @@
 %       }
 %       { No idea! }
 %    \end{verbatim}
-%    will leave \enquote{\texttt{Medium}} in the input stream.
+%    leaves \enquote{\texttt{Medium}} in the input stream.
 % \end{function}
 %
 % \section{Dimension expression loops}
@@ -296,8 +297,8 @@
 %   Places the \meta{code} in the input stream for \TeX{} to process, and
 %   then evaluates the relationship between the two
 %   \meta{dimension expressions} as described for \cs{dim_compare:nNnTF}.
-%   If the test is \texttt{false} then the \meta{code} will be inserted
-%   into the input stream again and a loop will occur until the
+%   If the test is \texttt{false} then the \meta{code} is inserted
+%   into the input stream again and a loop occurs until the
 %   \meta{relation} is \texttt{true}.
 % \end{function}
 %
@@ -308,8 +309,8 @@
 %   Places the \meta{code} in the input stream for \TeX{} to process, and
 %   then evaluates the relationship between the two
 %   \meta{dimension expressions} as described for \cs{dim_compare:nNnTF}.
-%   If the test is \texttt{true} then the \meta{code} will be inserted
-%   into the input stream again and a loop will occur until the
+%   If the test is \texttt{true} then the \meta{code} is inserted
+%   into the input stream again and a loop occurs until the
 %   \meta{relation} is \texttt{false}.
 % \end{function}
 %
@@ -321,7 +322,7 @@
 %   as described for \cs{dim_compare:nNnTF}, and then places the
 %   \meta{code} in the input stream if the \meta{relation} is
 %   \texttt{false}. After the \meta{code} has been processed by \TeX{} the
-%   test will be repeated, and a loop will occur until the test is
+%   test is repeated, and a loop occurs until the test is
 %   \texttt{true}.
 % \end{function}
 %
@@ -333,7 +334,7 @@
 %   as described for \cs{dim_compare:nNnTF}, and then places the
 %   \meta{code} in the input stream if the \meta{relation} is
 %   \texttt{true}. After the \meta{code} has been processed by \TeX{} the
-%   test will be repeated, and a loop will occur until the test is
+%   test is repeated, and a loop occurs until the test is
 %   \texttt{false}.
 % \end{function}
 %
@@ -344,8 +345,8 @@
 %   Places the \meta{code} in the input stream for \TeX{} to process, and
 %   then evaluates the \meta{dimension relation}
 %   as described for \cs{dim_compare:nTF}.
-%   If the test is \texttt{false} then the \meta{code} will be inserted
-%   into the input stream again and a loop will occur until the
+%   If the test is \texttt{false} then the \meta{code} is inserted
+%   into the input stream again and a loop occurs until the
 %   \meta{relation} is \texttt{true}.
 % \end{function}
 %
@@ -356,8 +357,8 @@
 %   Places the \meta{code} in the input stream for \TeX{} to process, and
 %   then evaluates the \meta{dimension relation}
 %   as described for \cs{dim_compare:nTF}.
-%   If the test is \texttt{true} then the \meta{code} will be inserted
-%   into the input stream again and a loop will occur until the
+%   If the test is \texttt{true} then the \meta{code} is inserted
+%   into the input stream again and a loop occurs until the
 %   \meta{relation} is \texttt{false}.
 % \end{function}
 %
@@ -369,7 +370,7 @@
 %   as described for \cs{dim_compare:nTF}, and then places the
 %   \meta{code} in the input stream if the \meta{relation} is
 %   \texttt{false}. After the \meta{code} has been processed by \TeX{} the
-%   test will be repeated, and a loop will occur until the test is
+%   test is repeated, and a loop occurs until the test is
 %   \texttt{true}.
 % \end{function}
 %
@@ -381,7 +382,7 @@
 %   as described for \cs{dim_compare:nTF}, and then places the
 %   \meta{code} in the input stream if the \meta{relation} is
 %   \texttt{true}. After the \meta{code} has been processed by \TeX{} the
-%   test will be repeated, and a loop will occur until the test is
+%   test is repeated, and a loop occurs until the test is
 %   \texttt{false}.
 % \end{function}
 %
@@ -396,8 +397,8 @@
 %   to their content (without requiring \cs{dim_use:N}/\cs{tl_use:N})
 %   and applying the standard mathematical rules. The result of the
 %   calculation is left in the input stream as a
-%   \meta{dimension denotation} after two expansions. This will be
-%   expressed in points (\texttt{pt}), and will require suitable
+%   \meta{dimension denotation} after two expansions. This is
+%   expressed in points (\texttt{pt}), and requires suitable
 %   termination if used in a \TeX{}-style assignment as it is \emph{not}
 %   an \meta{internal dimension}.
 % \end{function}
@@ -407,7 +408,7 @@
 %     \cs{dim_use:N} \meta{dimension}
 %   \end{syntax}
 %   Recovers the content of a \meta{dimension} and places it directly
-%   in the input stream. An error will be raised if the variable does
+%   in the input stream. An error is raised if the variable does
 %   not exist or if it is invalid. Can be omitted in places where a
 %   \meta{dimension} is required (such as in the argument of
 %   \cs{dim_eval:n}).
@@ -459,7 +460,7 @@
 %   \end{syntax}
 %   Evaluates the \meta{dimension expression}, and leaves the result,
 %   expressed in scaled points (\texttt{sp}) in the input stream, with \emph{no
-%   units}.  The result will necessarily be an integer.
+%   units}.  The result is necessarily an integer.
 % \end{function}
 %
 % \begin{function}[added = 2014-07-15, EXP]
@@ -497,7 +498,7 @@
 %   the \meta{dimexpr} in \texttt{pt}.  Since dimension expressions are
 %   evaluated much faster than their floating point equivalent,
 %   \cs{dim_to_fp:n} can be used to speed up parts of a computation
-%   where a low precision is acceptable.
+%   where a low precision and a smaller range are acceptable.
 % \end{function}
 %
 % \section{Viewing \texttt{dim} variables}
@@ -568,7 +569,7 @@
 %   \end{syntax}
 %   Creates a new \meta{skip} or raises an error if the name is
 %   already taken. The declaration is global. The \meta{skip}
-%   will initially be equal to $0$\,pt.
+%   is initially equal to $0$\,pt.
 % \end{function}
 %
 % \begin{function}[added = 2012-03-05]{\skip_const:Nn, \skip_const:cn}
@@ -576,7 +577,7 @@
 %     \cs{skip_const:Nn} \meta{skip} \Arg{skip expression}
 %   \end{syntax}
 %   Creates a new constant \meta{skip} or raises an error if the
-%   name is already taken. The value of the \meta{skip} will be set
+%   name is already taken. The value of the \meta{skip} is set
 %   globally to the \meta{skip expression}.
 % \end{function}
 %
@@ -685,8 +686,8 @@
 %   to their content (without requiring \cs{skip_use:N}/\cs{tl_use:N})
 %   and applying the standard mathematical rules. The result of the
 %   calculation is left in the input stream as a \meta{glue denotation}
-%   after two expansions. This will be expressed in points (\texttt{pt}),
-%   and will require suitable termination if used in a \TeX{}-style
+%   after two expansions. This is expressed in points (\texttt{pt}),
+%   and requires suitable termination if used in a \TeX{}-style
 %   assignment as it is \emph{not} an \meta{internal glue}.
 % \end{function}
 %
@@ -695,7 +696,7 @@
 %     \cs{skip_use:N} \meta{skip}
 %   \end{syntax}
 %   Recovers the content of a \meta{skip} and places it directly
-%   in the input stream. An error will be raised if the variable does
+%   in the input stream. An error is raised if the variable does
 %   not exist or if it is invalid. Can be omitted in places where a
 %   \meta{dimension} is required (such as in the argument of
 %   \cs{skip_eval:n}).
@@ -798,7 +799,7 @@
 %   \end{syntax}
 %   Creates a new \meta{muskip} or raises an error if the name is
 %   already taken. The declaration is global. The \meta{muskip}
-%   will initially be equal to $0$\,mu.
+%   is initially equal to $0$\,mu.
 % \end{function}
 %
 % \begin{function}[added = 2012-03-05]{\muskip_const:Nn, \muskip_const:cn}
@@ -806,7 +807,7 @@
 %     \cs{muskip_const:Nn} \meta{muskip} \Arg{muskip expression}
 %   \end{syntax}
 %   Creates a new constant \meta{muskip} or raises an error if the
-%   name is already taken. The value of the \meta{muskip} will be set
+%   name is already taken. The value of the \meta{muskip} is set
 %   globally to the \meta{muskip expression}.
 % \end{function}
 %
@@ -897,8 +898,8 @@
 %   to their content (without requiring \cs{muskip_use:N}/\cs{tl_use:N})
 %   and applying the standard mathematical rules. The result of the
 %   calculation is left in the input stream as a \meta{muglue denotation}
-%   after two expansions. This will be expressed in \texttt{mu},
-%   and will require suitable termination if used in a \TeX{}-style
+%   after two expansions. This is expressed in \texttt{mu},
+%   and requires suitable termination if used in a \TeX{}-style
 %   assignment as it is \emph{not} an \meta{internal muglue}.
 % \end{function}
 %
@@ -907,7 +908,7 @@
 %     \cs{muskip_use:N} \meta{muskip}
 %   \end{syntax}
 %   Recovers the content of a \meta{skip} and places it directly
-%   in the input stream. An error will be raised if the variable does
+%   in the input stream. An error is raised if the variable does
 %   not exist or if it is invalid. Can be omitted in places where a
 %   \meta{dimension} is required (such as in the argument of
 %   \cs{muskip_eval:n}).
@@ -1208,7 +1209,7 @@
 %
 % \begin{macro}{\dim_ratio:nn}
 % \begin{macro}[aux]{\@@_ratio:n}
-%   With dimension expressions, something like |10 pt * ( 5 pt / 10 pt )| will
+%   With dimension expressions, something like |10 pt * ( 5 pt / 10 pt )| does
 %   not work. Instead, the ratio part needs to be converted to an integer
 %   expression. Using \cs{__int_value:w} forces everything into |sp|, avoiding
 %   any decimal parts.
@@ -1216,7 +1217,7 @@
 \cs_new:Npn \dim_ratio:nn #1#2
   { \@@_ratio:n {#1} / \@@_ratio:n {#2} }
 \cs_new:Npn \@@_ratio:n #1
-  { \__int_value:w \@@_eval:w #1 \@@_eval_end: }
+  { \__int_value:w \@@_eval:w (#1) \@@_eval_end: }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -63,7 +63,7 @@
 %         { \sort_return_same: }
 %     }
 % \end{verbatim}
-% will result in \cs{l_foo_clist} holding the values
+% results in \cs{l_foo_clist} holding the values
 % |{ -2 , 01 , +1 , 3 , 5 }| sorted in non-decreasing order.
 %
 % The code defining the comparison should call
@@ -73,10 +73,10 @@
 % the order of this pair of items should not be changed.
 %
 % For instance, a \meta{comparison code} consisting only
-% of \cs{sort_return_same:} with no test will yield a trivial
+% of \cs{sort_return_same:} with no test yields a trivial
 % sort: the final order is identical to the original order.
 % Conversely, using a \meta{comparison code} consisting only
-% of \cs{sort_return_swapped:} will reverse the list (in a fairly
+% of \cs{sort_return_swapped:} reverses the list (in a fairly
 % inefficient way).
 %
 % \begin{texnote}
@@ -116,7 +116,7 @@
 %   \cs{l_@@_min_int} to $\cs{l_@@_top_int}-1$.  While reading the
 %   sequence in memory, we check that \cs{l_@@_top_int} remains at most
 %   \cs{l_@@_max_int}, precomputed by \cs{@@_compute_range:}.  That
-%   bound is such that the merge sort will only use \tn{toks} registers
+%   bound is such that the merge sort only uses \tn{toks} registers
 %   less than \cs{l_@@_true_max_int}, namely those that have not been
 %   allocated for use in other code: the user's comparison code could
 %   alter these.
@@ -489,7 +489,7 @@
 %   pair of blocks). If shifting by one block to the right we reach
 %   the end of the list, then this pass has ended: the end of the
 %   list is sorted already. Otherwise, store the result of that shift in $A$,
-%   which will index the first block starting from the top end.
+%   which indexes the first block starting from the top end.
 %   Then locate the end-point (maximum) of the second block: shift
 %   \texttt{end} upwards by one more block, but keeping it
 %   $\leq\texttt{top}$. Copy this upper block of \tn{toks}
@@ -585,7 +585,7 @@
 \cs_new_protected:Npn \@@_return_mark:N #1 { }
 \cs_new_protected:Npn \@@_return_none_error:
   {
-    \__msg_kernel_error:nnxx { sort } { return-none }
+    \__msg_kernel_error:nnxx { kernel } { return-none }
       { \tex_the:D \tex_toks:D \l_@@_A_int }
       { \tex_the:D \tex_toks:D \l_@@_C_int }
     \@@_return_same:
@@ -592,7 +592,7 @@
   }
 \cs_new_protected:Npn \@@_return_two_error:w
     #1 \@@_return_none_error:
-  { \__msg_kernel_error:nn { sort } { return-two } }
+  { \__msg_kernel_error:nn { kernel } { return-two } }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
@@ -710,7 +710,7 @@
 %
 % In the simple version of the code, \cs{@@:nnNnn} is called
 % \(O(n\ln n)\) times on average (the number of comparisons required by
-% the quicksort algorithm).  Hence most of our focus will be on
+% the quicksort algorithm).  Hence most of our focus is on
 % optimizing that function.
 %
 % The first speed up is to avoid testing for the end of the list at
@@ -830,7 +830,7 @@
 %   when~|#4| contains \cs{__prg_break_point:}, then the
 %   \texttt{prepare_end} auxiliary finds the prepared token list
 %   as~|#4|.  The scene is then set up for \cs{@@_quick_split:NnNn},
-%   which will sort the prepared list and perform the post action placed
+%   which sorts the prepared list and perform the post action placed
 %   after \cs{q_mark}, namely removing the trailing \cs{s__stop} and
 %   \cs{q_stop} and leaving \cs{exp_stop_f:} to stop
 %   \texttt{f}-expansion.
@@ -1013,12 +1013,12 @@
   { \cs_set_eq:NN \toksdef \@@_disabled_toksdef:n }
 \cs_new_protected:Npn \@@_disabled_toksdef:n #1
   {
-    \__msg_kernel_error:nnx { sort } { toksdef }
+    \__msg_kernel_error:nnx { kernel } { toksdef }
       { \token_to_str:N #1 }
     \@@_error:
     \tex_toksdef:D #1
   }
-\__msg_kernel_new:nnnn { sort } { toksdef }
+\__msg_kernel_new:nnnn { kernel } { toksdef }
   { Allocation~of~\iow_char:N\\toks~registers~impossible~while~sorting. }
   {
     The~comparison~code~used~for~sorting~a~list~has~attempted~to~
@@ -1037,13 +1037,13 @@
 \cs_new_protected:Npn \@@_too_long_error:NNw #1#2 \fi:
   {
     \fi:
-    \__msg_kernel_error:nnxxx { sort } { too-large }
+    \__msg_kernel_error:nnxxx { kernel } { too-large }
       { \token_to_str:N #2 }
       { \int_eval:n { \l_@@_true_max_int - \l_@@_min_int } }
       { \int_eval:n { \l_@@_top_int - \l_@@_min_int } }
     #1 \@@_error:
   }
-\__msg_kernel_new:nnnn { sort } { too-large }
+\__msg_kernel_new:nnnn { kernel } { too-large }
   { The~list~#1~is~too~long~to~be~sorted~by~TeX. }
   {
     TeX~has~#2~toks~registers~still~available:~
@@ -1054,7 +1054,7 @@
 % \end{macro}
 %
 %    \begin{macrocode}
-\__msg_kernel_new:nnnn { sort } { return-none }
+\__msg_kernel_new:nnnn { kernel } { return-none }
   { The~comparison~code~did~not~return. }
   {
     When~sorting~a~list,~the~code~to~compare~items~#1~and~#2~
@@ -1063,7 +1063,7 @@
     \iow_char:N\\sort_return_swapped: .~
     Exactly~one~of~these~should~be~called.
   }
-\__msg_kernel_new:nnnn { sort } { return-two }
+\__msg_kernel_new:nnnn { kernel } { return-two }
   { The~comparison~code~returned~multiple~times. }
   {
     When~sorting~a~list,~the~code~to~compare~items~called~

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -57,7 +57,7 @@
 % which have category code $12$ (\enquote{other}) with the exception of
 % space characters which have category code $10$ (\enquote{space}). Thus
 % at a technical level, a \TeX{} string is a token list with the appropriate
-% category codes. In this documentation, these will simply be referred to as
+% category codes. In this documentation, these are simply referred to as
 % strings.
 %
 % String variables are simply specialised token lists, but by convention
@@ -66,15 +66,22 @@
 % spaces, which have category code $10$ (blank space).  All the
 % functions in this module which accept a token list argument first
 % convert it to a string using \cs{tl_to_str:n} for internal processing,
-% and will not treat a token list or the corresponding string
+% and do not treat a token list or the corresponding string
 % representation differently.
 %
+% As a string is a subset of the more general token list, it is sometimes unclear
+% when one should be used over the other.
+% Use a string variable for data that isn’t primarily intended for typesetting
+% and for which a level of protection from unwanted expansion is suitable.
+% 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) will generate strings from the appropriate
+% \cs{token_to_str:N} (and variants) generate strings from the appropriate
 % input: these are documented in \pkg{l3basics}, \pkg{l3tl} and \pkg{l3token},
 % respectively.
 %
@@ -97,8 +104,8 @@
 %     \cs{str_new:N} \meta{str~var}
 %   \end{syntax}
 %   Creates a new \meta{str~var} or raises an error if the name is
-%   already taken.  The declaration is global.  The \meta{str~var} will
-%   initially be empty.
+%   already taken.  The declaration is global.  The \meta{str~var} is
+%   initially empty.
 % \end{function}
 %
 % \begin{function}[added = 2015-09-18]
@@ -107,7 +114,7 @@
 %     \cs{str_const:Nn} \meta{str~var} \Arg{token list}
 %   \end{syntax}
 %   Creates a new constant \meta{str~var} or raises an error if the name
-%   is already taken.  The value of the \meta{str~var} will be set
+%   is already taken.  The value of the \meta{str~var} is set
 %   globally to the \meta{token list}, converted to a string.
 % \end{function}
 %
@@ -200,7 +207,7 @@
 % \begin{function}[EXP,pTF, added = 2015-09-18]
 %   {\str_if_empty:N, \str_if_empty:c}
 %   \begin{syntax}
-%     \cs{sr_if_empty_p:N} \meta{str~var}
+%     \cs{str_if_empty_p:N} \meta{str~var}
 %     \cs{str_if_empty:NTF} \meta{str~var} \Arg{true code} \Arg{false code}
 %   \end{syntax}
 %   Tests if the \meta{string variable} is entirely empty
@@ -264,8 +271,8 @@
 %   \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
-%   \cs{str_if_eq:nnTF} then the
-%   associated \meta{code} is left in the input stream. If any of the
+%   \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
 %   input stream (after the code for the appropriate case), while if none
 %   match then the \meta{false code} is inserted. The function
@@ -288,7 +295,8 @@
 %   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
 %   full expansions are equal (as described for \cs{str_if_eq:nnTF} then the
-%   associated \meta{code} is left in the input stream.  If any of 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
 %   input stream (after the code for the appropriate case), while if none
 %   match then the \meta{false code} is inserted. The function
@@ -306,7 +314,7 @@
 %     \cs{str_use:N} \meta{str~var}
 %   \end{syntax}
 %   Recovers the content of a \meta{str~var} and places it
-%   directly in the input stream. An error will be raised if the variable
+%   directly in the input stream. An error is raised if the variable
 %   does not exist or if it is invalid. Note that it is possible to use
 %   a \meta{str} directly without an accessor function.
 % \end{function}
@@ -361,7 +369,7 @@
 %   character, and leaves the remaining characters (if any) in the input
 %   stream, with category codes $12$ and $10$ (for spaces).  The
 %   functions differ in the case where the first character is a space:
-%   \cs{str_tail:N} and \cs{str_tail:n} will trim only that space, while
+%   \cs{str_tail:N} and \cs{str_tail:n} only trim that space, while
 %   \cs{str_tail_ignore_spaces:n} removes the first non-space character
 %   and any space before it.  If the \meta{token list} is empty (or
 %   blank in the case of the \texttt{_ignore_spaces} variant), then
@@ -405,7 +413,7 @@
 %     \iow_term:x { \str_range:nnn { abcdef } { -2 } { -1 } }
 %     \iow_term:x { \str_range:nnn { abcdef } { 0 } { -1 } }
 %   \end{verbatim}
-%   will print \texttt{bcde}, \texttt{cdef}, \texttt{ef}, and an empty
+%   prints \texttt{bcde}, \texttt{cdef}, \texttt{ef}, and an empty
 %   line to the terminal. The \meta{start index} must always be smaller than
 %   or equal to the \meta{end index}: if this is not the case then no output
 %   is generated. Thus
@@ -470,7 +478,7 @@
 %     As with all \pkg{expl3} functions, the input supported by
 %     \cs{str_fold_case:n} is \emph{engine-native} characters which are or
 %     interoperate with \textsc{utf-8}. As such, when used with \pdfTeX{}
-%     \emph{only} the Latin alphabet characters A--Z will be case-folded
+%     \emph{only} the Latin alphabet characters A--Z are case-folded
 %     (\emph{i.e.}~the \textsc{ascii} range which coincides with
 %     \textsc{utf-8}). Full \textsc{utf-8} support is available with both
 %     \XeTeX{} and \LuaTeX{}, subject only to the fact that \XeTeX{} in
@@ -514,7 +522,7 @@
 %     As with all \pkg{expl3} functions, the input supported by
 %     \cs{str_fold_case:n} is \emph{engine-native} characters which are or
 %     interoperate with \textsc{utf-8}. As such, when used with \pdfTeX{}
-%     \emph{only} the Latin alphabet characters A--Z will be case-folded
+%     \emph{only} the Latin alphabet characters A--Z are case-folded
 %     (\emph{i.e.}~the \textsc{ascii} range which coincides with
 %     \textsc{utf-8}). Full \textsc{utf-8} support is available with both
 %     \XeTeX{} and \LuaTeX{}, subject only to the fact that \XeTeX{} in
@@ -765,7 +773,7 @@
 %   spaces are not skipped for ease-of-input. The need to detokenize and force
 %   expansion of input arises from the case where a |#| token is used in the
 %   input, \emph{e.g.}~|\__str_if_eq_x:nn {#} { \tl_to_str:n {#} }|, which
-%   otherwise will fail as \cs{luatex_luaescapestring:D} does not double
+%   otherwise would fail as \cs{luatex_luaescapestring:D} does not double
 %   such tokens.
 %    \begin{macrocode}
 \cs_new:Npn \@@_if_eq_x:nn #1#2 { \pdftex_strcmp:D {#1} {#2} }
@@ -1203,7 +1211,7 @@
 %   trick again, so that the $8$ first arguments of
 %   \cs{@@_collect_end:nnnnnnnnw} are some \cs{or:}, followed by an
 %   \cs{fi:}, followed by |#1| characters from the input stream. Simply
-%   leaving this in the input stream will close the conditional properly
+%   leaving this in the input stream closes the conditional properly
 %   and the \cs{or:} disappear.
 %    \begin{macrocode}
 \cs_new:Npn \@@_collect_delimit_by_q_stop:w #1;
@@ -1613,7 +1621,7 @@
 % Set up to read each file. As they use C-style comments, there is a need to
 % deal with |#|. At the same time, spaces are important so they need to be
 % picked up as they are important. Beyond that, the current category code
-% scheme works fine. With no I/O loop available, hard-code one that will work
+% scheme works fine. With no I/O loop available, hard-code one that works
 % quickly.
 %    \begin{macrocode}
   \cs_set_protected:Npn \@@_map_inline:n #1
@@ -1664,8 +1672,8 @@
     }
 %    \end{macrocode}
 % Storing each exception is always done in the same way: create a constant
-% token list which expands to exactly the mapping. These will have the
-% category codes \enquote{now} (so should be letters) but will be detokenized
+% token list which expands to exactly the mapping. These have the
+% category codes \enquote{now} (so should be letters) but are later detokenized
 % for string use.
 %    \begin{macrocode}
   \cs_set_protected:Npn \@@_store:nnnnn #1#2#3#4#5
@@ -1680,7 +1688,7 @@
     }
 %    \end{macrocode}   
 % Parse the main Unicode data file for title case exceptions (the one-to-one
-% lower and upper case mappings it contains will all be covered by the \TeX{}
+% lower and upper case mappings it contains are all be covered by the \TeX{}
 % data).
 %    \begin{macrocode}
   \cs_set_protected:Npn \@@_parse_auxi:w
@@ -1694,7 +1702,7 @@
           \if_int_compare:w \__str_if_eq_x:nn { #5 ~ } {#7} = 0 \exp_stop_f:
           \else:
             \tl_const:cx
-              { c_@@_title_ \utex_char:D "#1 _tl }
+              { c_@@_mixed_ \utex_char:D "#1 _tl }
               { \utex_char:D "#7 }
           \fi:
         }
@@ -1734,7 +1742,7 @@
       \use:n { \@@_parse_auxii:w #1 ~ upper ~ #4 ~ } ~ \q_stop
       \if_int_compare:w \__str_if_eq_x:nn {#3} {#4} = 0 \exp_stop_f:
       \else:
-        \use:n { \@@_parse_auxii:w #1 ~ title ~ #3 ~ } ~ \q_stop
+        \use:n { \@@_parse_auxii:w #1 ~ mixed ~ #3 ~ } ~ \q_stop
       \fi:
     }
   \cs_set_protected:Npn \@@_parse_auxii:w #1 ~ #2 ~ #3 ~ #4 ~ #5 \q_stop

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -98,7 +98,7 @@
 % \end{function}
 %
 % \begin{variable}[added = 2015-09-19]{\c_sys_engine_str}
-%   The current engine given as a lower case string: will be one of
+%   The current engine given as a lower case string: one of
 %   |luatex|, |pdftex|, |ptex|, |uptex| or |xetex|.
 % \end{variable}
 %
@@ -113,7 +113,7 @@
 %     \cs{sys_if_output_dvi:TF} \Arg{true code} \Arg{false code}
 %   \end{syntax}
 %   Conditionals which give the current output mode the \TeX{} run is
-%   operating in. This will always be one of two outcomes, DVI mode or
+%   operating in. This is always one of two outcomes, DVI mode or
 %   PDF mode. The two sets of conditionals are thus complementary and
 %   are both provided to allow the programmer to emphasise the most
 %   appropriate case.
@@ -120,7 +120,7 @@
 % \end{function}
 %
 % \begin{variable}[added = 2015-09-19]{\c_sys_output_str}
-%   The current output mode given as a lower case string: will be one of
+%   The current output mode given as a lower case string: one of
 %   |dvi| or |pdf|.
 % \end{variable}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -344,7 +344,7 @@
 % \end{itemize}
 % The only tokens which are not valid \texttt{N}-type arguments are true
 % begin-group characters, true end-group characters, and true spaces.
-% We will detect those characters by scanning ahead with \tn{futurelet},
+% We detect those characters by scanning ahead with \tn{futurelet},
 % then distinguishing true characters from control sequences set equal
 % to them using the \tn{string} representation.
 %
@@ -351,7 +351,7 @@
 % The second pass is a simple exercise in expandable loops.
 %
 % \begin{macro}[int]{\@@:n}
-%   Everything is done within a group, and all definitions will be
+%   Everything is done within a group, and all definitions are
 %   local. We use \cs{group_align_safe_begin/end:} to avoid problems in
 %   case \cs{@@:n} is used within an alignment and its argument
 %   contains alignment tab tokens.
@@ -442,7 +442,7 @@
 % \end{itemize}
 % Our first tool is \tn{futurelet}. This cannot distinguish
 % case $8$ from $1$ or $2$, nor case $9$ from $3$ or $4$,
-% nor case $10$ from case $5$. Those cases will be distinguished
+% nor case $10$ from case $5$. Those cases are later distinguished
 % by applying the \tn{string} primitive to the following token,
 % after possibly changing the escape character to ensure that
 % a control sequence's string representation cannot be mistaken
@@ -631,7 +631,7 @@
 %   \item 1 begin-group character.
 %   \end{itemize}
 %   We need to distinguish further the case of a space character
-%   (code $32$) from other character codes, because those will
+%   (code $32$) from other character codes, because those
 %   behave differently in the second pass. Namely, after testing
 %   the \tn{lccode} of $0$ (which holds the present character code)
 %   we change the cases above to
@@ -722,8 +722,8 @@
 % \begin{macro}[int]{\@@_b:n}
 % \begin{macro}[int, EXP]{\@@_b_loop:w}
 %   Start the loop with the index $0$. No need for an end-marker:
-%   the loop will stop by itself when the last index is read.
-%   We will repeatedly oscillate between reading long stretches
+%   the loop stops by itself when the last index is read.
+%   We repeatedly oscillate between reading long stretches
 %   of normal tokens, and reading special tokens.
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_b:n #1

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -92,7 +92,7 @@
 %   \end{syntax}
 %   Creates a new \meta{tl~var} or raises an error if the
 %   name is already taken. The declaration is global. The
-%   \meta{tl~var} will initially be empty.
+%   \meta{tl~var} is initially empty.
 % \end{function}
 %
 % \begin{function}{\tl_const:Nn, \tl_const:Nx, \tl_const:cn, \tl_const:cx}
@@ -101,8 +101,7 @@
 %   \end{syntax}
 %   Creates a new constant \meta{tl~var} or raises an error
 %   if the name is already taken. The value of the
-%   \meta{tl~var} will be set globally to the
-%   \meta{token list}.
+%   \meta{tl~var} is set globally to the \meta{token list}.
 % \end{function}
 %
 % \begin{function}{\tl_clear:N, \tl_clear:c, \tl_gclear:N, \tl_gclear:c}
@@ -144,7 +143,7 @@
 %   \end{syntax}
 %   Concatenates the content of \meta{tl~var_2} and \meta{tl~var_3}
 %   together and saves the result in \meta{tl~var_1}. The \meta{tl~var_2}
-%   will be placed at the left side of the new token list.
+%   is placed at the left side of the new token list.
 % \end{function}
 %
 % \begin{function}[EXP, pTF, added=2012-03-03]{\tl_if_exist:N, \tl_if_exist:c}
@@ -273,7 +272,7 @@
 %     \cs{tl_set:Nn} \cs{l_tmpa_tl} |{abbccd}|
 %     \cs{tl_remove_all:Nn} \cs{l_tmpa_tl} |{bc}|
 %   \end{quote}
-%   will result in \cs{l_tmpa_tl} containing \texttt{abcd}.
+%   results in \cs{l_tmpa_tl} containing \texttt{abcd}.
 % \end{function}
 %
 % \section{Reassigning token list category codes}
@@ -299,7 +298,7 @@
 %   Sets \meta{tl~var} to contain \meta{tokens}, applying the category
 %   code r\'{e}gime specified in the \meta{setup} before carrying out
 %   the assignment. (Category codes applied to tokens not explicitly covered
-%   by the \meta{setup} will be those in force at the point of use of
+%   by the \meta{setup} are those in force at the point of use of
 %   \cs{tl_set_rescan:Nnn}.)
 %   This allows the \meta{tl~var} to contain material
 %   with category codes other than those that apply when \meta{tokens}
@@ -329,7 +328,7 @@
 %   Rescans \meta{tokens} applying the category code r\'{e}gime
 %   specified in the \meta{setup}, and leaves the resulting tokens in
 %   the input stream. (Category codes applied to tokens not explicitly covered
-%   by the \meta{setup} will be those in force at the point of use of
+%   by the \meta{setup} are those in force at the point of use of
 %   \cs{tl_rescan:nn}.)
 %   The \meta{setup} is run within a group and may
 %   contain any valid input, although only changes in category codes
@@ -475,7 +474,7 @@
 %   with each of the \meta{token list variable cases}. If the two
 %   are equal (as described for \cs{tl_if_eq:NNTF})
 %   then the associated \meta{code} is left in the input
-%   stream. If any of the
+%   stream and other cases are discarded. If any of the
 %   cases are matched, the \meta{true code} is also inserted into the
 %   input stream (after the code for the appropriate case), while if none
 %   match then the \meta{false code} is inserted. The function
@@ -491,7 +490,7 @@
 %     \cs{tl_map_function:NN} \meta{tl~var} \meta{function}
 %   \end{syntax}
 %   Applies \meta{function} to every \meta{item} in the \meta{tl~var}.
-%   The \meta{function} will receive one argument for each iteration.
+%   The \meta{function} receives one argument for each iteration.
 %   This may be a number of tokens if the \meta{item} was stored within
 %   braces. Hence the \meta{function} should anticipate receiving
 %   \texttt{n}-type arguments. See also \cs{tl_map_function:nN}.
@@ -502,7 +501,7 @@
 %     \cs{tl_map_function:nN} \meta{token list} \meta{function}
 %   \end{syntax}
 %   Applies \meta{function} to every \meta{item} in the \meta{token list},
-%   The \meta{function} will receive one argument for each iteration.
+%   The \meta{function} receives one argument for each iteration.
 %   This may be a number of tokens if the \meta{item} was stored within
 %   braces. Hence the \meta{function} should anticipate receiving
 %   \texttt{n}-type arguments. See also \cs{tl_map_function:NN}.
@@ -515,7 +514,7 @@
 %   \end{syntax}
 %   Applies the \meta{inline function} to every \meta{item} stored within the
 %   \meta{tl~var}. The \meta{inline function} should consist of code which
-%   will receive the \meta{item} as |#1|. One in line mapping can be nested
+%   receives the \meta{item} as |#1|. One in line mapping can be nested
 %   inside another. See also \cs{tl_map_function:NN}.
 % \end{function}
 %
@@ -525,7 +524,7 @@
 %   \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
-%   will receive the \meta{item} as |#1|. One in line mapping can be nested
+%   receives the \meta{item} as |#1|. One in line mapping can be nested
 %   inside another. See also \cs{tl_map_function:nN}.
 % \end{function}
 %
@@ -536,7 +535,7 @@
 %   \end{syntax}
 %   Applies the \meta{function} to every \meta{item} stored
 %   within the \meta{tl~var}. The \meta{function} should consist of code
-%   which will receive the \meta{item} stored in the \meta{variable}.
+%   which receives the \meta{item} stored in the \meta{variable}.
 %   One variable mapping can be nested inside another. See also
 %   \cs{tl_map_inline:Nn}.
 % \end{function}
@@ -547,7 +546,7 @@
 %   \end{syntax}
 %   Applies the \meta{function} to every \meta{item} stored
 %   within the \meta{token list}. The \meta{function} should consist of code
-%   which will receive the \meta{item} stored in the \meta{variable}.
+%   which receives the \meta{item} stored in the \meta{variable}.
 %   One variable mapping can be nested inside another. See also
 %   \cs{tl_map_inline:nn}.
 % \end{function}
@@ -558,7 +557,7 @@
 %   \end{syntax}
 %   Used to terminate a \cs[no-index]{tl_map_\ldots} function before all
 %   entries in the \meta{token list variable} have been processed. This
-%   will normally take place within a conditional statement, for example
+%   normally takes place within a conditional statement, for example
 %   \begin{verbatim}
 %     \tl_map_inline:Nn \l_my_tl
 %       {
@@ -567,13 +566,13 @@
 %       }
 %   \end{verbatim}
 %   See also \cs{tl_map_break:n}.
-%   Use outside of a \cs[no-index]{tl_map_\ldots} scenario will lead to low
+%   Use outside of a \cs[no-index]{tl_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 will depend on the design of the mapping function.
+%     This depends on the design of the mapping function.
 %   \end{texnote}
 % \end{function}
 %
@@ -583,8 +582,8 @@
 %   \end{syntax}
 %   Used to terminate a \cs[no-index]{tl_map_\ldots} function before all
 %   entries in the \meta{token list variable} have been processed, inserting
-%   the \meta{tokens} after the mapping has ended. This will
-%   normally take place within a conditional statement, for example
+%   the \meta{tokens} after the mapping has ended. This
+%   normally takes place within a conditional statement, for example
 %   \begin{verbatim}
 %     \tl_map_inline:Nn \l_my_tl
 %       {
@@ -593,13 +592,13 @@
 %         % Do something useful
 %       }
 %   \end{verbatim}
-%   Use outside of a \cs[no-index]{tl_map_\ldots} scenario will lead to low
+%   Use outside of a \cs[no-index]{tl_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 will depend on the design of the mapping function.
+%     This depends on the design of the mapping function.
 %   \end{texnote}
 % \end{function}
 %
@@ -657,7 +656,7 @@
 %     \cs{tl_use:N} \meta{tl~var}
 %   \end{syntax}
 %   Recovers the content of a \meta{tl~var} and places it
-%   directly in the input stream. An error will be raised if the variable
+%   directly in the input stream. An error is raised if the variable
 %   does not exist or if it is invalid. Note that it is possible to use
 %   a \meta{tl~var} directly without an accessor function.
 % \end{function}
@@ -671,8 +670,8 @@
 %   \end{syntax}
 %   Counts the number of \meta{items} in \meta{tokens} and leaves this
 %   information in the input stream. Unbraced tokens count as one
-%   element as do each token group (|{|\ldots|}|). This process will
-%   ignore any unprotected spaces within \meta{tokens}. See also
+%   element as do each token group (|{|\ldots|}|). This process
+%   ignores any unprotected spaces within \meta{tokens}. See also
 %   \cs{tl_count:N}. This function requires three expansions,
 %   giving an \meta{integer denotation}.
 % \end{function}
@@ -684,7 +683,7 @@
 %   Counts the number of token groups in the \meta{tl~var}
 %   and leaves this information in the input stream. Unbraced tokens
 %   count as one element as do each token group (|{|\ldots|}|). This
-%   process will ignore any unprotected spaces within the \meta{tl~var}.
+%   process ignores any unprotected spaces within the \meta{tl~var}.
 %   See also \cs{tl_count:n}. This function requires three expansions,
 %   giving an \meta{integer denotation}.
 % \end{function}
@@ -697,7 +696,7 @@
 %   Reverses the order of the \meta{items} in the \meta{token list},
 %   so that \meta{item_1}\meta{item_2}\meta{item_3} \ldots \meta{item_n}
 %   becomes \meta{item_n}\ldots \meta{item_3}\meta{item_2}\meta{item_1}.
-%   This process will preserve unprotected space within the
+%   This process preserves unprotected space within the
 %   \meta{token list}. Tokens are not reversed within braced token
 %   groups, which keep their outer set of braces.
 %   In situations where performance is important,
@@ -705,7 +704,7 @@
 %   See also \cs{tl_reverse:N}.
 %   \begin{texnote}
 %     The result is returned within \tn{unexpanded}, which means that the token
-%     list will not expand further when appearing in an \texttt{x}-type
+%     list does not expand further when appearing in an \texttt{x}-type
 %     argument expansion.
 %   \end{texnote}
 % \end{function}
@@ -718,7 +717,7 @@
 %   Reverses the order of the \meta{items} stored in \meta{tl~var}, so
 %   that \meta{item_1}\meta{item_2}\meta{item_3} \ldots \meta{item_n}
 %   becomes \meta{item_n}\ldots \meta{item_3}\meta{item_2}\meta{item_1}.
-%   This process will preserve unprotected spaces within the
+%   This process preserves unprotected spaces within the
 %   \meta{token list variable}. Braced token groups are copied without
 %   reversing the order of tokens, but keep the outer set of braces.
 %   See also \cs{tl_reverse:n}, and, for improved performance,
@@ -732,7 +731,7 @@
 %   Reverses the order of the \meta{items} stored in \meta{tl~var},
 %   so that \Arg{item_1}\Arg{item_2}\Arg{item_3} \ldots \Arg{item_n}
 %   becomes \Arg{item_n} \ldots{} \Arg{item_3}\Arg{item_2}\Arg{item_1}.
-%   This process will remove any unprotected space within the
+%   This process removes any unprotected space within the
 %   \meta{token list}. Braced token groups are copied without
 %   reversing the order of tokens, and keep the outer set of braces.
 %   Items which are initially not braced are copied with braces in
@@ -740,7 +739,7 @@
 %   consider the slower function \cs{tl_reverse:n}.
 %   \begin{texnote}
 %     The result is returned within \tn{unexpanded}, which means that the token
-%     list will not expand further when appearing in an \texttt{x}-type
+%     list does not expand further when appearing in an \texttt{x}-type
 %     argument expansion.
 %   \end{texnote}
 % \end{function}
@@ -756,7 +755,7 @@
 %   stream.
 %   \begin{texnote}
 %     The result is returned within \tn{unexpanded}, which means that the token
-%     list will not expand further when appearing in an \texttt{x}-type
+%     list does not expand further when appearing in an \texttt{x}-type
 %     argument expansion.
 %   \end{texnote}
 % \end{function}
@@ -799,7 +798,7 @@
 %   described in Section~\ref{sec:l3sort:mech}.
 %   \begin{texnote}
 %     The result is returned within \cs{exp_not:n}, which means that the
-%     token list will not expand further when appearing in an
+%     token list does not expand further when appearing in an
 %     \texttt{x}-type argument expansion.
 %   \end{texnote}
 % \end{function}
@@ -826,18 +825,18 @@
 %   \begin{verbatim}
 %     \tl_head:n { ~ abc }
 %   \end{verbatim}
-%   will both leave |a| in the input stream. If the \enquote{head} is a
-%   brace group, rather than a single token, the braces will be removed, and
+%   both leave |a| in the input stream. If the \enquote{head} is a
+%   brace group, rather than a single token, the braces are removed, and
 %   so
 %   \begin{verbatim}
 %     \tl_head:n { ~ { ~ ab } c }
 %   \end{verbatim}
 %   yields \verb*| ab|.
-%   A blank \meta{token list} (see \cs{tl_if_blank:nTF}) will result in
+%   A blank \meta{token list} (see \cs{tl_if_blank:nTF}) results in
 %   \cs{tl_head:n} leaving nothing in the input stream.
 %   \begin{texnote}
 %     The result is returned within \cs{exp_not:n}, which means that the token
-%     list will not expand further when appearing in an \texttt{x}-type
+%     list does not expand further when appearing in an \texttt{x}-type
 %     argument expansion.
 %   \end{texnote}
 % \end{function}
@@ -852,7 +851,7 @@
 %   (explicit tokens with character code~$32$ and category code~$10$)
 %   are discarded.
 %   A blank \meta{token list} (which consists only of space characters)
-%   will result in a low-level \TeX{} error, which may be avoided by the
+%   results in a low-level \TeX{} error, which may be avoided by the
 %   inclusion of an empty group in the input (as shown), without the need
 %   for an explicit test. Alternatively, \cs{tl_if_blank:nF} may be used to
 %   avoid using the function with a \enquote{blank} argument.
@@ -877,12 +876,12 @@
 %   \begin{verbatim}
 %     \tl_tail:n { ~ a ~ {bc} d }
 %   \end{verbatim}
-%   will both leave \verb*| {bc}d| in the input stream.  A blank
-%   \meta{token list} (see \cs{tl_if_blank:nTF}) will result
+%   both leave \verb*| {bc}d| in the input stream.  A blank
+%   \meta{token list} (see \cs{tl_if_blank:nTF}) results
 %   in \cs{tl_tail:n} leaving nothing in the input stream.
 %   \begin{texnote}
 %     The result is returned within \cs{exp_not:n}, which means that the
-%     token list will not expand further when appearing in an \texttt{x}-type
+%     token list does not expand further when appearing in an \texttt{x}-type
 %     argument expansion.
 %   \end{texnote}
 % \end{function}
@@ -895,7 +894,7 @@
 %   \end{syntax}
 %   Tests if the first \meta{token} in the \meta{token list} has the
 %   same category code as the \meta{test token}.  In the case where the
-%   \meta{token list} is empty, the test will always be \texttt{false}.
+%   \meta{token list} is empty, the test is always \texttt{false}.
 % \end{function}
 %
 % \begin{function}[updated = 2012-07-09, EXP, pTF]
@@ -907,7 +906,7 @@
 %   \end{syntax}
 %   Tests if the first \meta{token} in the \meta{token list} has the
 %   same character code as the \meta{test token}.  In the case where the
-%   \meta{token list} is empty, the test will always be \texttt{false}.
+%   \meta{token list} is empty, the test is always \texttt{false}.
 % \end{function}
 %
 % \begin{function}[updated = 2012-07-09, EXP, pTF]{\tl_if_head_eq_meaning:nN}
@@ -918,7 +917,7 @@
 %   \end{syntax}
 %   Tests if the first \meta{token} in the \meta{token list} has the
 %   same meaning as the \meta{test token}.  In the case where
-%   \meta{token list} is empty, the test will always be \texttt{false}.
+%   \meta{token list} is empty, the test is always \texttt{false}.
 % \end{function}
 %
 % \begin{function}[added = 2012-07-08, EXP, pTF]{\tl_if_head_is_group:n}
@@ -976,7 +975,7 @@
 %     \cs{tl_item:nn} \Arg{token list} \Arg{integer expression}
 %   \end{syntax}
 %   Indexing items in the \meta{token list} from~$1$ on the left, this
-%   function will evaluate the \meta{integer expression} and leave the
+%   function evaluates the \meta{integer expression} and leaves the
 %   appropriate item from the \meta{token list} in the input stream.
 %   If the \meta{integer expression} is negative, indexing occurs from
 %   the right of the token list, starting at $-1$ for the right-most item.
@@ -984,7 +983,7 @@
 %   \begin{texnote}
 %     The result is returned within the \tn{unexpanded}
 %     primitive (\cs{exp_not:n}), which means that the \meta{item}
-%     will not expand further when appearing in an \texttt{x}-type
+%     does not expand further when appearing in an \texttt{x}-type
 %     argument expansion.
 %   \end{texnote}
 % \end{function}
@@ -1126,7 +1125,7 @@
 % \begin{macro}{\tl_clear:N, \tl_clear:c}
 % \begin{macro}{\tl_gclear:N, \tl_gclear:c}
 %   Clearing a token list variable means setting it to an empty value.
-%   Error checking will be sorted out by the parent function.
+%   Error checking is sorted out by the parent function.
 %    \begin{macrocode}
 \cs_new_protected:Npn \tl_clear:N  #1
   { \tl_set_eq:NN #1 \c_empty_tl }
@@ -1141,7 +1140,7 @@
 % \begin{macro}{\tl_clear_new:N, \tl_clear_new:c}
 % \begin{macro}{\tl_gclear_new:N, \tl_gclear_new:c}
 %   Clearing a token list variable means setting it to an empty value.
-%   Error checking will be sorted out by the parent function.
+%   Error checking is sorted out by the parent function.
 %    \begin{macrocode}
 \cs_new_protected:Npn \tl_clear_new:N  #1
   { \tl_if_exist:NTF #1 { \tl_clear:N #1 } { \tl_new:N #1 } }
@@ -1155,16 +1154,28 @@
 %
 % \begin{macro}{\tl_set_eq:NN, \tl_set_eq:Nc, \tl_set_eq:cN, \tl_set_eq:cc}
 % \begin{macro}{\tl_gset_eq:NN, \tl_gset_eq:Nc, \tl_gset_eq:cN, \tl_gset_eq:cc}
-%   For setting token list variables equal to each other.
+%   For setting token list variables equal to each other.  When checking
+%   is turned on, make sure both variables exist.
 %    \begin{macrocode}
-\cs_new_eq:NN \tl_set_eq:NN  \cs_set_eq:NN
-\cs_new_eq:NN \tl_set_eq:cN  \cs_set_eq:cN
-\cs_new_eq:NN \tl_set_eq:Nc  \cs_set_eq:Nc
-\cs_new_eq:NN \tl_set_eq:cc  \cs_set_eq:cc
-\cs_new_eq:NN \tl_gset_eq:NN \cs_gset_eq:NN
-\cs_new_eq:NN \tl_gset_eq:cN \cs_gset_eq:cN
-\cs_new_eq:NN \tl_gset_eq:Nc \cs_gset_eq:Nc
-\cs_new_eq:NN \tl_gset_eq:cc \cs_gset_eq:cc
+\tex_ifodd:D \l at expl@enable at debug@bool
+  \cs_new_protected:Npn \tl_set_eq:NN #1#2
+    {
+      \__chk_if_exist_var:N #1
+      \__chk_if_exist_var:N #2
+      \cs_set_eq:NN #1 #2
+    }
+  \cs_new_protected:Npn \tl_gset_eq:NN #1#2
+    {
+      \__chk_if_exist_var:N #1
+      \__chk_if_exist_var:N #2
+      \cs_gset_eq:NN #1 #2
+    }
+\else:
+  \cs_new_eq:NN \tl_set_eq:NN  \cs_set_eq:NN
+  \cs_new_eq:NN \tl_gset_eq:NN \cs_gset_eq:NN
+\fi:
+\cs_generate_variant:Nn \tl_set_eq:NN { cN, Nc, cc }
+\cs_generate_variant:Nn \tl_gset_eq:NN { cN, Nc, cc }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
@@ -1171,10 +1182,26 @@
 %
 % \begin{macro}{\tl_concat:NNN, \tl_concat:ccc}
 % \begin{macro}{\tl_gconcat:NNN, \tl_gconcat:ccc}
-%   Concatenating token lists is easy.
+%   Concatenating token lists is easy.  When checking is turned on, all
+%   three arguments must be checked: a token list |#2| or |#3| equal to
+%   \cs{scan_stop:} would lead to problems later on.
 %    \begin{macrocode}
+\__debug_patch:nnNw
+  {
+    \__chk_if_exist_var:N #1
+    \__chk_if_exist_var:N #2
+    \__chk_if_exist_var:N #3
+  }
+  { }
 \cs_new_protected:Npn \tl_concat:NNN #1#2#3
   { \tl_set:Nx #1 { \exp_not:o {#2} \exp_not:o {#3} } }
+\__debug_patch:nnNw
+  {
+    \__chk_if_exist_var:N #1
+    \__chk_if_exist_var:N #2
+    \__chk_if_exist_var:N #3
+  }
+  { }
 \cs_new_protected:Npn \tl_gconcat:NNN #1#2#3
   { \tl_gset:Nx #1 { \exp_not:o {#2} \exp_not:o {#3} } }
 \cs_generate_variant:Nn \tl_concat:NNN  { ccc }
@@ -1224,18 +1251,26 @@
 %   By using \cs{exp_not:n} token list variables can contain |#| tokens,
 %   which makes the token list registers provided by \TeX{}
 %   more or less redundant. The \cs{tl_set:No} version is done
-%   \enquote{by hand} as it is used quite a lot.
+%   \enquote{by hand} as it is used quite a lot.  Each definition is
+%   prefixed by a call to \cs{__debug_patch:nnNw} which adds an
+%   existence check to the definition.
 %    \begin{macrocode}
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \tl_set:Nn #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:n {#2} } }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \tl_set:No #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:o {#2} } }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \tl_set:Nx #1#2
   { \cs_set_nopar:Npx #1 {#2} }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \tl_gset:Nn #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:n {#2} } }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \tl_gset:No #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:o {#2} } }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \tl_gset:Nx #1#2
   { \cs_gset_nopar:Npx #1 {#2} }
 \cs_generate_variant:Nn \tl_set:Nn  {         NV , Nv , Nf }
@@ -1260,20 +1295,28 @@
 %   }
 % Adding to the left is done directly to gain a little performance.
 %    \begin{macrocode}
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \tl_put_left:Nn #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:n {#2} \exp_not:o #1 } }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \tl_put_left:NV #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:V #2 \exp_not:o #1 } }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \tl_put_left:No #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:o {#2} \exp_not:o #1 } }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \tl_put_left:Nx #1#2
   { \cs_set_nopar:Npx #1 { #2 \exp_not:o #1 } }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \tl_gput_left:Nn #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:n {#2} \exp_not:o #1 } }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \tl_gput_left:NV #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:V #2 \exp_not:o #1 } }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \tl_gput_left:No #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:o {#2} \exp_not:o #1 } }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \tl_gput_left:Nx #1#2
   { \cs_gset_nopar:Npx #1 { #2 \exp_not:o {#1} } }
 \cs_generate_variant:Nn \tl_put_left:Nn  { c }
@@ -1302,20 +1345,28 @@
 %   }
 % The same on the right.
 %    \begin{macrocode}
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \tl_put_right:Nn #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:o #1 \exp_not:n {#2} } }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \tl_put_right:NV #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:o #1 \exp_not:V #2 } }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \tl_put_right:No #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:o #1 \exp_not:o {#2} } }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \tl_put_right:Nx #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:o #1 #2 } }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \tl_gput_right:Nn #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:o #1 \exp_not:n {#2} } }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \tl_gput_right:NV #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:o #1 \exp_not:V #2 } }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \tl_gput_right:No #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:o #1 \exp_not:o {#2} } }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \tl_gput_right:Nx #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:o {#1} #2 } }
 \cs_generate_variant:Nn \tl_put_right:Nn  { c }
@@ -1330,85 +1381,6 @@
 % \end{macro}
 % \end{macro}
 %
-%   When used as a package, there is an option to be picky and to
-%   check definitions exist. This part of the process is done now, so that
-%   variable types based on |tl| (for example |clist|, |seq| and |prop|) will
-%   inherit the appropriate definitions.
-%   No \cs[no-index]{tl_map_\ldots} yet as the mechanisms are not fully in place. Thus
-%   instead do a more low level set up for a mapping, as in \pkg{l3basics}.
-%    \begin{macrocode}
-%<*package>
-\tex_ifodd:D \l at expl@check at declarations@bool
-  \cs_set_protected:Npn \__cs_tmp:w #1
-    {
-      \if_meaning:w \q_recursion_tail #1
-        \exp_after:wN \use_none_delimit_by_q_recursion_stop:w
-      \fi:
-      \use:x
-        {
-          \cs_set_protected:Npn #1 \exp_not:n { ##1 ##2 }
-            {
-              \__chk_if_exist_var:N \exp_not:n {##1}
-              \exp_not:o { #1 {##1} {##2} }
-            }
-        }
-      \__cs_tmp:w
-    }
-  \__cs_tmp:w
-    \tl_set:Nn  \tl_set:No  \tl_set:Nx
-    \tl_gset:Nn \tl_gset:No \tl_gset:Nx
-    \tl_put_left:Nn   \tl_put_left:NV
-    \tl_put_left:No   \tl_put_left:Nx
-    \tl_gput_left:Nn  \tl_gput_left:NV
-    \tl_gput_left:No  \tl_gput_left:Nx
-    \tl_put_right:Nn  \tl_put_right:NV
-    \tl_put_right:No  \tl_put_right:Nx
-    \tl_gput_right:Nn \tl_gput_right:NV
-    \tl_gput_right:No \tl_gput_right:Nx
-    \q_recursion_tail \q_recursion_stop
-%</package>
-%    \end{macrocode}
-%   The two \texttt{set_eq} functions are done by hand as the internals there
-%   are a bit different.
-%    \begin{macrocode}
-%<*package>
-  \cs_set_protected:Npn \tl_set_eq:NN #1#2
-    {
-      \__chk_if_exist_var:N #1
-      \__chk_if_exist_var:N #2
-      \cs_set_eq:NN #1 #2
-    }
-  \cs_set_protected:Npn \tl_gset_eq:NN #1#2
-    {
-      \__chk_if_exist_var:N #1
-      \__chk_if_exist_var:N #2
-      \cs_gset_eq:NN #1 #2
-    }
-%</package>
-%    \end{macrocode}
-%   There is also a need to check all three arguments of the
-%   \texttt{concat} functions: a token list |#2| or |#3| equal to
-%   \cs{scan_stop:} would lead to problems later on.
-%    \begin{macrocode}
-%<*package>
-  \cs_set_protected:Npn \tl_concat:NNN #1#2#3
-    {
-      \__chk_if_exist_var:N #1
-      \__chk_if_exist_var:N #2
-      \__chk_if_exist_var:N #3
-      \tl_set:Nx #1 { \exp_not:o {#2} \exp_not:o {#3} }
-    }
-  \cs_set_protected:Npn \tl_gconcat:NNN #1#2#3
-    {
-      \__chk_if_exist_var:N #1
-      \__chk_if_exist_var:N #2
-      \__chk_if_exist_var:N #3
-      \tl_gset:Nx #1 { \exp_not:o {#2} \exp_not:o {#3} }
-    }
-\tex_fi:D
-%</package>
-%    \end{macrocode}
-%
 % \subsection{Reassigning token list category codes}
 %
 % \begin{variable}{\c_@@_rescan_marker_tl}
@@ -1452,7 +1424,7 @@
 %   The standard solution is to use an \texttt{x}-expanding assignment
 %   and set \tn{everyeof} to \cs{exp_not:N} to suppress the error at
 %   the end of the file.  Since the rescanned tokens should not be
-%   expanded, they will be taken as a delimited argument of an
+%   expanded, they are taken as a delimited argument of an
 %   auxiliary which wraps them in \cs{exp_not:n} (in fact
 %   \cs{exp_not:o}, as there is a \cs{prg_do_nothing:} to avoid losing
 %   braces).  The delimiter cannot appear within the rescanned token
@@ -1536,8 +1508,8 @@
 %   ignored at the beginning of lines, and spaces and tabs (character
 %   code $32$ and $9$) are ignored at the end of lines.
 %
-%   For a single line, no \tn{endlinechar} should be added, so it will
-%   be set to $-1$, and spaces should not be removed.
+%   For a single line, no \tn{endlinechar} should be added, so it is
+%   set to $-1$, and spaces should not be removed.
 %
 %   Trailing spaces and tabs are a difficult matter, as \TeX{} removes
 %   these at a very low level.  The only way to preserve them is to
@@ -1681,7 +1653,7 @@
 %     \@@_replace_wrap:w,
 %   }
 %   To implement the actual replacement auxiliary
-%   \cs{@@_replace_auxii:nNNNnn} we will need a \meta{delimiter} with
+%   \cs{@@_replace_auxii:nNNNnn} we need a \meta{delimiter} with
 %   the following properties:
 %   \begin{itemize}
 %     \item all occurrences of the \meta{pattern}~|#6| in
@@ -1715,7 +1687,7 @@
 %   at most $O(n^{3/2})$.  Bear in mind that these upper bounds are
 %   reached only in very contrived scenarios: we include the case
 %   \enquote{\meta{A}} in the list of delimiters to try, so that the
-%   \meta{delimiter} will simply be \cs{q_mark} in the most common
+%   \meta{delimiter} is simply \cs{q_mark} in the most common
 %   situation where neither the \meta{token list} nor the \meta{pattern}
 %   contains \cs{q_mark}.
 %
@@ -1920,7 +1892,7 @@
 % \end{macro}
 %
 % \begin{macro}[pTF]{\tl_if_empty:n, \tl_if_empty:V}
-%   Convert the argument to a string: this will be empty if and only if
+%   Convert the argument to a string: this is empty if and only if
 %   the argument is.  Then |\if_meaning:w \q_nil ... \q_nil| is
 %   \texttt{true} if and only if the string |...| is empty.
 %   It could be tempting to use |\if_meaning:w \q_nil #1 \q_nil| directly.
@@ -2082,10 +2054,10 @@
 %   there are no odd category codes.  An earlier version would compare
 %   the result to a single~|?| using string comparison, but the Lua call
 %   is slow in \LuaTeX{}.  Instead, \cs{@@_if_single:nnw} picks the
-%   second token in front of it.  If |#1| is empty, this token will be
+%   second token in front of it.  If |#1| is empty, this token is
 %   the trailing~|?| and the catcode test yields \texttt{false}.  If
-%   |#1| has a single item, the token will be~|^| and the catcode test
-%   yields \texttt{true}.  Otherwise, it will be one of the characters
+%   |#1| has a single item, the token is~|^| and the catcode test
+%   yields \texttt{true}.  Otherwise, it is one of the characters
 %   resulting from \cs{tl_to_str:n}, and the catcode test yields
 %   \texttt{false}.  Note that \cs{if_catcode:w} takes care of the
 %   expansions, and that \cs{tl_to_str:n} (the \tn{detokenize}
@@ -2115,7 +2087,7 @@
 %   using a known number of expansion steps (two), and without
 %   needing to use an explicit \enquote{end of recursion} marker.
 %   That is achieved by using the test input as the final case,
-%   as this will always be true. The trick is then to tidy up
+%   as this is always true. The trick is then to tidy up
 %   the output such that the appropriate case code plus either
 %   the \texttt{true} or \texttt{false} branch code is inserted.
 %    \begin{macrocode}
@@ -2153,14 +2125,14 @@
 \cs_generate_variant:Nn \tl_case:NnTF { c }
 %    \end{macrocode}
 %   To tidy up the recursion, there are two outcomes. If there was a hit to
-%   one of the cases searched for, then |#1| will be the code to insert,
-%   |#2| will be the \emph{next} case to check on and |#3| will be all of
-%   the rest of the cases code. That means that |#4| will be the \texttt{true}
-%   branch code, and |#5| will be tidy up the spare \cs{q_mark} and the
+%   one of the cases searched for, then |#1| is the code to insert,
+%   |#2| is the \emph{next} case to check on and |#3| is all of
+%   the rest of the cases code. That means that |#4| is the \texttt{true}
+%   branch code, and |#5| tidies up the spare \cs{q_mark} and the
 %   \texttt{false} branch. On the other hand, if none of the cases matched
 %   then we arrive here using the \enquote{termination} case of comparing
-%   the search with itself. That means that |#1| will be empty, |#2| will be
-%   the first \cs{q_mark} and so |#4| will be the \texttt{false} code (the
+%   the search with itself. That means that |#1| is empty, |#2| is
+%   the first \cs{q_mark} and so |#4| is the \texttt{false} code (the
 %   \texttt{true} code is mopped up by |#3|).
 %    \begin{macrocode}
 \cs_new:Npn \__prg_case_end:nw #1#2#3 \q_mark #4#5 \q_stop
@@ -2180,7 +2152,7 @@
 % \begin{macro}[aux]{\@@_map_function:Nn}
 %   Expandable loop macro for token lists. These have the advantage of not
 %   needing to test if the argument is empty, because if it is, the stop
-%   marker will be read immediately and the loop terminated.
+%   marker is read immediately and the loop terminated.
 %    \begin{macrocode}
 \cs_new:Npn \tl_map_function:nN #1#2
   {
@@ -2284,7 +2256,7 @@
 % \end{macro}
 %
 % \begin{macro}{\tl_use:N, \tl_use:c}
-% Token lists which are simply not defined will give a clear \TeX{}
+% Token lists which are simply not defined give a clear \TeX{}
 % error here. No such luck for ones equal to \cs{scan_stop:} so
 % instead a test is made and if there is an issue an error is forced.
 %    \begin{macrocode}
@@ -2365,10 +2337,10 @@
 %   Trimming spaces from around the input is deferred to an internal
 %   function whose first argument is the token list to trim, augmented
 %   by an initial \cs{q_mark}, and whose second argument is a
-%   \meta{continuation}, which will receive as a braced argument
+%   \meta{continuation}, which receives as a braced argument
 %   \cs{use_none:n} \cs{q_mark} \meta{trimmed token list}.  In the case
 %   at hand, we take \cs{exp_not:o} as our continuation, so that space
-%   trimming will behave correctly within an \texttt{x}-type expansion.
+%   trimming behaves correctly within an \texttt{x}-type expansion.
 %    \begin{macrocode}
 \cs_new:Npn \tl_trim_spaces:n #1
   { \@@_trim_spaces:nn { \q_mark #1 } \exp_not:o }
@@ -2606,7 +2578,7 @@
 % \begin{macro}[aux]{\@@_head_auxi:nw, \@@_head_auxii:n}
 % \begin{macro}{\tl_head:w}
 % \begin{macro}{\tl_tail:N, \tl_tail:n, \tl_tail:V, \tl_tail:v, \tl_tail:f}
-%   Finding the head of a token list expandably will always strip braces, which
+%   Finding the head of a token list expandably always strips braces, which
 %   is fine as this is consistent with for example mapping to a list. The
 %   empty brace groups in \cs{tl_head:n} ensure that a blank argument gives an
 %   empty result. The result is returned within the \tn{unexpanded} primitive.
@@ -2643,7 +2615,7 @@
 \cs_new:Npn \tl_head:w #1#2 \q_stop {#1}
 \cs_new:Npn \tl_head:N { \exp_args:No \tl_head:n }
 %    \end{macrocode}
-%   To corrected leave the tail of a token list, it's important \emph{not} to
+%   To correctly leave the tail of a token list, it's important \emph{not} to
 %   absorb any of the tail part as an argument. For example, the simple
 %   definition
 %   \begin{verbatim}
@@ -2650,7 +2622,7 @@
 %     \cs_new:Npn \tl_tail:n #1 { \tl_tail:w #1 \q_stop }
 %     \cs_new:Npn \tl_tail:w #1#2 \q_stop
 %   \end{verbatim}
-%   will give the wrong result for |\tl_tail:n { a { bc } }| (the braces will
+%   would give the wrong result for |\tl_tail:n { a { bc } }| (the braces would
 %   be stripped). Thus the only safe way to proceed is to first check that
 %   there is an item to grab (\emph{i.e.}~that the argument is not blank) and
 %   assuming there is to dispose of the first item.  As with \cs{tl_head:n},
@@ -2695,8 +2667,8 @@
 %   token lists to the \texttt{true} branch of this test).  In those
 %   cases, the first token is a character, and since we only care about
 %   its character code, we can use \cs{str_head:n} to access it (this
-%   works even if it is a space character).  An empty argument will
-%   result in \cs{tl_head:w} leaving two tokens: |?| which is taken in
+%   works even if it is a space character).  An empty argument
+%   results in \cs{tl_head:w} leaving two tokens: |?| which is taken in
 %   the \cs{if_charcode:w} test, and \cs{use_none:nn}, which ensures
 %   that \cs{prg_return_false:} is returned regardless of whether the
 %   charcode test was \texttt{true} or \texttt{false}.

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -57,11 +57,11 @@
 % comes to document commands) is looking ahead in the token stream to
 % see if a certain character is present and maybe even remove it or
 % disregard other tokens while scanning. This module provides
-% functions for both and as such will have two primary function
+% functions for both and as such has two primary function
 % categories: |\token_| for anything that deals with tokens and
 % |\peek_| for looking ahead in the token stream.
 %
-% Most functions we will describe here can be used on control sequences,
+% Most functions we describe here can be used on control sequences,
 % as those are tokens as well.
 %
 % It is important to distinguish two aspects of a token: its
@@ -78,7 +78,7 @@
 % character code.  They have the same meaning hence behave identically
 % in many situations.  However, \TeX{} distinguishes them when searching
 % for a delimited argument.  Namely, the example function
-% |\show_until_if:w| defined below will take everything until \cs{if:w}
+% |\show_until_if:w| defined below takes everything until \cs{if:w}
 % as an argument, despite the presence of other copies of \cs{if:w}
 % under different names.
 % \begin{verbatim}
@@ -139,7 +139,7 @@
 %     \item $11$ (letter)
 %     \item $12$ (other)
 %   \end{itemize}
-%   and other values will raise an error.
+%   and other values raise an error.
 %
 %   The \meta{charcode} may be any one valid for the engine in use. Note
 %   however that for \XeTeX{} releases prior to 0.99992 only the 8-bit
@@ -243,7 +243,7 @@
 %     \cs{char_set_lccode:nn} \Arg{intexpr_1} \Arg{intexpr_2}
 %   \end{syntax}
 %   Sets up the behaviour of the \meta{character} when
-%   found inside \cs{tl_to_lowercase:n}, such that \meta{character_1}
+%   found inside \cs{tl_lower_case:n}, such that \meta{character_1}
 %   will be converted into \meta{character_2}. The two \meta{characters}
 %   may be specified using an \meta{integer expression} for the character code
 %   concerned. This may include the \TeX{} |`|\meta{character}
@@ -280,7 +280,7 @@
 %     \cs{char_set_uccode:nn} \Arg{intexpr_1} \Arg{intexpr_2}
 %   \end{syntax}
 %   Sets up the behaviour of the \meta{character} when
-%   found inside \cs{tl_to_uppercase:n}, such that \meta{character_1}
+%   found inside \cs{tl_upper_case:n}, such that \meta{character_1}
 %   will be converted into \meta{character_2}. The two \meta{characters}
 %   may be specified using an \meta{integer expression} for the character code
 %   concerned. This may include the \TeX{} |`|\meta{character}
@@ -396,7 +396,7 @@
 %     \cs{token_new:Nn} \meta{token_1} \Arg{token_2}
 %   \end{syntax}
 %   Defines \meta{token_1} to globally be a snapshot of \meta{token_2}.
-%   This will be an implicit representation of \meta{token_2}.
+%   This is an implicit representation of \meta{token_2}.
 % \end{function}
 %
 % \begin{variable}
@@ -439,9 +439,9 @@
 %   \end{syntax}
 %   Inserts the current meaning of the \meta{token} into the input
 %   stream as a series of characters of category code $12$ (other).
-%   This will be the primitive \TeX{} description of the \meta{token},
+%   This is the primitive \TeX{} description of the \meta{token},
 %   thus for example both functions defined by \cs{cs_set_nopar:Npn}
-%   and token list variables defined using \cs{tl_new:N} will be described
+%   and token list variables defined using \cs{tl_new:N} are described
 %   as |macro|s.
 %   \begin{texnote}
 %     This is the \TeX{} primitive \tn{meaning}.
@@ -453,8 +453,8 @@
 %     \cs{token_to_str:N} \meta{token}
 %   \end{syntax}
 %   Converts the given \meta{token} into a series of characters with
-%   category code $12$ (other). The current escape character will be
-%   the first character in the sequence, although this will also have
+%   category code $12$ (other). If the \meta{token} is a control
+%   sequence, this will start with the current escape character with
 %   category code $12$ (the escape character is part of the
 %   \meta{token}). This function requires only a single expansion.
 %   \begin{texnote}
@@ -630,8 +630,8 @@
 %     \cs{token_if_protected_macro_p:N} \meta{token} \\
 %     \cs{token_if_protected_macro:NTF} \meta{token} \Arg{true code} \Arg{false code}
 %   \end{syntax}
-%   Tests if the \meta{token} is a protected macro: a macro which
-%   is both protected and long will return logical \texttt{false}.
+%   Tests if the \meta{token} is a protected macro: for a macro which
+%   is both protected and long this returns \texttt{false}.
 % \end{function}
 %
 % \begin{function}[EXP,pTF, updated=2012-01-20]{\token_if_protected_long_macro:N}
@@ -650,7 +650,7 @@
 %   Tests if the \meta{token} is defined to be a chardef.
 %   \begin{texnote}
 %     Booleans, boxes and small integer constants are implemented as
-%     chardefs.
+%     \tn{chardef}s.
 %   \end{texnote}
 % \end{function}
 %
@@ -678,7 +678,7 @@
 %   Tests if the \meta{token} is defined to be a integer register.
 %   \begin{texnote}
 %     Constant integers may be implemented as integer registers,
-%     chardefs, or mathchardefs depending on their value.
+%     \tn{chardef}s, or \tn{mathchardef}s depending on their value.
 %   \end{texnote}
 % \end{function}
 %
@@ -730,7 +730,7 @@
 %   \end{syntax}
 %   Locally sets the test variable \cs{l_peek_token} equal to \meta{token}
 %   (as an implicit token, \emph{not} as a token list), and then
-%   expands the \meta{function}. The \meta{token} will remain in
+%   expands the \meta{function}. The \meta{token} remains in
 %   the input stream as the next item after the \meta{function}.
 %   The \meta{token} here may be \verb*| |, |{| or |}| (assuming
 %   normal \TeX{} category codes), \emph{i.e.}~it is not necessarily the
@@ -743,7 +743,7 @@
 %   \end{syntax}
 %   Globally sets the test variable \cs{g_peek_token} equal to \meta{token}
 %   (as an implicit token, \emph{not} as a token list), and then
-%   expands the \meta{function}. The \meta{token} will remain in
+%   expands the \meta{function}. The \meta{token} remains in
 %   the input stream as the next item after the \meta{function}.
 %   The \meta{token} here may be \verb*| |, |{| or |}| (assuming
 %   normal \TeX{} category codes), \emph{i.e.}~it is not necessarily the
@@ -767,7 +767,7 @@
 %   Tests if the next \meta{token} in the input stream has the same
 %   category code as the \meta{test token} (as defined by the test
 %   \cs{token_if_eq_catcode:NNTF}). Spaces are respected by the test
-%   and the \meta{token} will be left in the input stream after
+%   and the \meta{token} is left in the input stream after
 %   the \meta{true code} or \meta{false code} (as appropriate to the
 %   result of the test).
 % \end{function}
@@ -780,7 +780,7 @@
 %   same category code as the \meta{test token} (as defined by the test
 %   \cs{token_if_eq_catcode:NNTF}).  Explicit and implicit space tokens
 %   (with character code 32 and category code 10) are ignored and
-%   removed by the test and the \meta{token} will be left in the input
+%   removed by the test and the \meta{token} is left in the input
 %   stream after the \meta{true code} or \meta{false code} (as
 %   appropriate to the result of the test).
 % \end{function}
@@ -792,8 +792,8 @@
 %   Tests if the next \meta{token} in the input stream has the same
 %   category code as the \meta{test token} (as defined by the test
 %   \cs{token_if_eq_catcode:NNTF}). Spaces are respected by the test
-%   and the \meta{token} will be removed from the input stream if the
-%   test is true. The function will then place either the
+%   and the \meta{token} is removed from the input stream if the
+%   test is true. The function then places either the
 %   \meta{true code} or \meta{false code} in the input stream (as
 %   appropriate to the result of the test).
 % \end{function}
@@ -807,8 +807,8 @@
 %   same category code as the \meta{test token} (as defined by the test
 %   \cs{token_if_eq_catcode:NNTF}).  Explicit and implicit space tokens
 %   (with character code 32 and category code 10) are ignored and
-%   removed by the test and the \meta{token} will be removed from the
-%   input stream if the test is true. The function will then place
+%   removed by the test and the \meta{token} is removed from the
+%   input stream if the test is true. The function then places
 %   either the \meta{true code} or \meta{false code} in the input stream
 %   (as appropriate to the result of the test).
 % \end{function}
@@ -820,7 +820,7 @@
 %   Tests if the next \meta{token} in the input stream has the same
 %   character code as the \meta{test token} (as defined by the test
 %   \cs{token_if_eq_charcode:NNTF}). Spaces are respected by the test
-%   and the \meta{token} will be left in the input stream after
+%   and the \meta{token} is left in the input stream after
 %   the \meta{true code} or \meta{false code} (as appropriate to the
 %   result of the test).
 % \end{function}
@@ -833,7 +833,7 @@
 %   same character code as the \meta{test token} (as defined by the test
 %   \cs{token_if_eq_charcode:NNTF}).  Explicit and implicit space tokens
 %   (with character code 32 and category code 10) are ignored and removed by
-%   the test and the \meta{token} will be left in the input stream after
+%   the test and the \meta{token} is left in the input stream after
 %   the \meta{true code} or \meta{false code} (as appropriate to the
 %   result of the test).
 % \end{function}
@@ -845,8 +845,8 @@
 %   Tests if the next \meta{token} in the input stream has the same
 %   character code as the \meta{test token} (as defined by the test
 %   \cs{token_if_eq_charcode:NNTF}). Spaces are respected by the test
-%   and the \meta{token} will be removed from the input stream if the
-%   test is true. The function will then place either the
+%   and the \meta{token} is removed from the input stream if the
+%   test is true. The function then places either the
 %   \meta{true code} or \meta{false code} in the input stream (as
 %   appropriate to the result of the test).
 % \end{function}
@@ -861,8 +861,8 @@
 %   same character code as the \meta{test token} (as defined by the test
 %   \cs{token_if_eq_charcode:NNTF}).  Explicit and implicit space tokens
 %   (with character code 32 and category code 10) are ignored and
-%   removed by the test and the \meta{token} will be removed from the
-%   input stream if the test is true. The function will then place
+%   removed by the test and the \meta{token} is removed from the
+%   input stream if the test is true. The function then places
 %   either the \meta{true code} or \meta{false code} in the input stream
 %   (as appropriate to the result of the test).
 % \end{function}
@@ -874,7 +874,7 @@
 %   Tests if the next \meta{token} in the input stream has the same
 %   meaning as the \meta{test token} (as defined by the test
 %   \cs{token_if_eq_meaning:NNTF}). Spaces are respected by the test
-%   and the \meta{token} will be left in the input stream after
+%   and the \meta{token} is left in the input stream after
 %   the \meta{true code} or \meta{false code} (as appropriate to the
 %   result of the test).
 % \end{function}
@@ -887,7 +887,7 @@
 %   same meaning as the \meta{test token} (as defined by the test
 %   \cs{token_if_eq_meaning:NNTF}).  Explicit and implicit space tokens
 %   (with character code 32 and category code 10) are ignored and
-%   removed by the test and the \meta{token} will be left in the input
+%   removed by the test and the \meta{token} is left in the input
 %   stream after the \meta{true code} or \meta{false code} (as
 %   appropriate to the result of the test).
 % \end{function}
@@ -899,8 +899,8 @@
 %   Tests if the next \meta{token} in the input stream has the same
 %   meaning as the \meta{test token} (as defined by the test
 %   \cs{token_if_eq_meaning:NNTF}). Spaces are respected by the test
-%   and the \meta{token} will be removed from the input stream if the
-%   test is true. The function will then place either the
+%   and the \meta{token} is removed from the input stream if the
+%   test is true. The function then places either the
 %   \meta{true code} or \meta{false code} in the input stream (as
 %   appropriate to the result of the test).
 % \end{function}
@@ -915,8 +915,8 @@
 %   same meaning as the \meta{test token} (as defined by the test
 %   \cs{token_if_eq_meaning:NNTF}).  Explicit and implicit space tokens
 %   (with character code 32 and category code 10) are ignored and
-%   removed by the test and the \meta{token} will be removed from the
-%   input stream if the test is true. The function will then place
+%   removed by the test and the \meta{token} is removed from the
+%   input stream if the test is true. The function then places
 %   either the \meta{true code} or \meta{false code} in the input stream
 %   (as appropriate to the result of the test).
 % \end{function}
@@ -932,7 +932,7 @@
 %   \begin{syntax}
 %     \cs{token_get_arg_spec:N} \meta{token}
 %   \end{syntax}
-%   If the \meta{token} is a macro, this function will leave
+%   If the \meta{token} is a macro, this function leaves
 %   the primitive \TeX{} argument specification in input stream as
 %   a string of tokens of category code $12$ (with spaces having category
 %   code $10$). Thus for example for a token \cs{next} defined by
@@ -939,11 +939,11 @@
 %   \begin{verbatim}
 %     \cs_set:Npn \next #1#2 { x #1 y #2 }
 %   \end{verbatim}
-%   will leave |#1#2| in the input stream. If the \meta{token} is
-%   not a macro then \cs{scan_stop:} will be left in the input stream.
+%   leaves |#1#2| in the input stream. If the \meta{token} is
+%   not a macro then \cs{scan_stop:} is left in the input stream.
 %   \begin{texnote}
 %     If the arg~spec. contains the string |->|, then the |spec| function
-%     will produce incorrect results.
+%     produces incorrect results.
 %   \end{texnote}
 % \end{function}
 %
@@ -951,7 +951,7 @@
 %   \begin{syntax}
 %     \cs{token_get_replacement_spec:N} \meta{token}
 %   \end{syntax}
-%   If the \meta{token} is a macro, this function will leave
+%   If the \meta{token} is a macro, this function leaves
 %   the replacement text in input stream as
 %   a string of tokens of category code $12$ (with spaces having category
 %   code $10$). Thus for example for a token \cs{next} defined by
@@ -958,11 +958,11 @@
 %   \begin{verbatim}
 %     \cs_set:Npn \next #1#2 { x #1~y #2 }
 %   \end{verbatim}
-%   will leave \verb|x#1 y#2| in the input stream. If the \meta{token} is
-%   not a macro then \cs{scan_stop:} will be left in the input stream.
+%   leaves \verb|x#1 y#2| in the input stream. If the \meta{token} is
+%   not a macro then \cs{scan_stop:} is left in the input stream.
 %   \begin{texnote}
 %     If the arg~spec. contains the string |->|, then the |spec| function
-%     will produce incorrect results.
+%     produces incorrect results.
 %   \end{texnote}
 % \end{function}
 %
@@ -970,7 +970,7 @@
 %   \begin{syntax}
 %     \cs{token_get_prefix_spec:N} \meta{token}
 %   \end{syntax}
-%   If the \meta{token} is a macro, this function will leave
+%   If the \meta{token} is a macro, this function leaves
 %   the \TeX{} prefixes applicable in input stream as
 %   a string of tokens of category code $12$ (with spaces having category
 %   code $10$). Thus for example for a token \cs{next} defined by
@@ -977,8 +977,8 @@
 %   \begin{verbatim}
 %     \cs_set:Npn \next #1#2 { x #1~y #2 }
 %   \end{verbatim}
-%   will leave |\long| in the input stream. If the \meta{token} is
-%   not a macro then \cs{scan_stop:} will be left in the input stream
+%   leaves |\long| in the input stream. If the \meta{token} is
+%   not a macro then \cs{scan_stop:} is left in the input stream
 % \end{function}
 %
 % \section{Description of all possible tokens}
@@ -1011,7 +1011,7 @@
 % There are also a few internal tokens.  The following list may be
 % incomplete in some engines.
 % \begin{itemize}
-%   \item Expanding \tn{the}\th{font} results in a token that looks
+%   \item Expanding \tn{the}\tn{font} results in a token that looks
 %     identical to the command that was used to select the current font
 %     (such as \tn{tenrm}) but it differs from it in shape.
 %   \item A \enquote{frozen} |\relax|, which differs from the primitive in
@@ -1030,7 +1030,7 @@
 % \end{itemize}
 %
 % The meaning of a (non-active) character token is fixed by its category
-% code (and character code) and cannot be changed.  We will call these
+% code (and character code) and cannot be changed.  We call these
 % tokens \emph{explicit} character tokens.  Category codes that a
 % character token can have are listed below by giving a sample output of
 % the \TeX{} primitive \tn{meaning}, together with their \LaTeX3 names
@@ -1055,7 +1055,7 @@
 %
 % The meaning of a control sequence or active character can be identical
 % to that of any character token listed above (with any character code),
-% and we will call such tokens \emph{implicit} character tokens.  The
+% and we call such tokens \emph{implicit} character tokens.  The
 % meaning is otherwise in the following list:
 % \begin{itemize}
 %   \item a macro, used in \LaTeX3 for most functions and some variables
@@ -1499,9 +1499,9 @@
       \char_set_catcode_math_toggle:n { 0 }
       \tl_put_right:Nn \l_@@_tmp_tl { \or: ^^@ }
 %    \end{macrocode}
-%   As \TeX{} will be very unhappy if if finds an alignment character inside
+%   As \TeX{} is very unhappy if if finds an alignment character inside
 %   a primitive \tn{halign} even when skipping false branches, some precautions
-%   are required. \TeX{} will be happy if the token is hidden inside
+%   are required. \TeX{} is happy if the token is hidden inside
 %   \tn{unexpanded} (which needs to be the primitive). The expansion chain here
 %   is required so that the conditional gets cleaned up correctly (other code
 %   assumes there is exactly one token to skip during the clean-up).
@@ -1715,7 +1715,7 @@
 %   avoid an error message: within a group we prevent
 %   \cs{c_parameter_token} from behaving like a macro parameter character.
 %   The definitions of \cs{prg_new_conditional:Npnn} are global, so they
-%   will remain after the group.
+%   remain after the group.
 %    \begin{macrocode}
 \group_begin:
 \cs_set_eq:NN \c_parameter_token \scan_stop:
@@ -1838,7 +1838,7 @@
 %
 % \begin{macro}[pTF]{\token_if_macro:N}
 % \begin{macro}[aux]{\@@_if_macro_p:w}
-%   When a token is a macro, \cs{token_to_meaning:N} will always output
+%   When a token is a macro, \cs{token_to_meaning:N} always outputs
 %   something like |\long macro:#1->#1| so we could naively check to
 %   see if the meaning contains |->|. However, this can fail the five
 %   \tn[no-index]{...mark} primitives, whose meaning has the form
@@ -1901,8 +1901,8 @@
 % \end{macro}
 %
 % \begin{macro}[pTF]{\token_if_expandable:N}
-%   Check if token is expandable. We use the fact that \TeX{} will
-%   temporarily convert \cs{exp_not:N} \meta{token} into \cs{scan_stop:}
+%   Check if token is expandable. We use the fact that \TeX{}
+%   temporarily converts \cs{exp_not:N} \meta{token} into \cs{scan_stop:}
 %   if \meta{token} is expandable.  An \texttt{undefined} token is not
 %   considered as expandable.  No problem nesting the conditionals,
 %   since the third |#1| is only skipped if it is non-expandable (hence
@@ -1938,7 +1938,7 @@
 %   argument begins with a particular string.  Each auxiliary takes an
 %   argument delimited by a string, a second one delimited by
 %   \cs{q_stop}, and returns the first one and its delimiter.
-%   This result will eventually be compared to another string.
+%   This result is eventually compared to another string.
 %    \begin{macrocode}
 \group_begin:
 \cs_set_protected:Npn \@@_tmp:w #1
@@ -2088,7 +2088,7 @@
 %
 %   We start by removing the two first (non-space) characters from
 %   the meaning. This removes the escape character (which may be
-%   inexistent depending on \tn{endlinechar}), and takes care
+%   nonexistent depending on \tn{endlinechar}), and takes care
 %   of three of the exceptions: \tn{space}, \tn{italiccorr}
 %   and \tn{hyphen}, whose meaning is at most two characters.
 %   This leaves a string terminated by some |:|, and \cs{q_stop}.
@@ -2336,7 +2336,7 @@
 %   The catcode and charcode tests are very similar, and in order to use
 %   the same auxiliaries we do something a little bit odd, firing
 %   \cs{if_catcode:w} and \cs{if_charcode:w} before finding the operands
-%   for those tests, which will only be given in the |auxii:N| and
+%   for those tests, which are only given in the |auxii:N| and
 %   |auxiii:| auxiliaries.  For our purposes, three kinds of tokens may
 %   follow the peeking function:
 %   \begin{itemize}

Modified: trunk/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -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/05/29]
-%<package>\@ifpackagelater{expl3}{2017/05/29}
+\RequirePackage{expl3}[2017/07/15]
+%<package>\@ifpackagelater{expl3}{2017/07/15}
 %<package>  {}
 %<package>  {%
 %<package>    \PackageError{l3keys2e}{Support package l3kernel too old}
@@ -60,7 +60,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -131,7 +131,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{l3keys2e}{2017/05/29}{}
+\ProvidesExplPackage{l3keys2e}{2017/07/15}{}
   {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-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -23,16 +23,16 @@
 %<*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/05/29]
-%<package>\@ifpackagelater{expl3}{2017/05/29}
+\RequirePackage{expl3}[2017/07/15]
+%<package>\@ifpackagelater{expl3}{2017/07/15}
 %<package>  {}
 %<package>  {%
-%<package>    \PackageError{xfpu}{Support package l3kernel too old}
+%<package>    \PackageError{xfp}{Support package l3kernel too old}
 %<package>      {%
 %<package>        Please install an up to date version of l3kernel\MessageBreak
 %<package>        using your TeX package manager or from CTAN.\MessageBreak
 %<package>        \MessageBreak
-%<package>        Loading xfpu will abort!%
+%<package>        Loading xfp will abort!%
 %<package>      }%
 %<package>    \endinput
 %<package>  }
@@ -62,7 +62,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -120,7 +120,7 @@
 %   \item Constants: \texttt{pi}, \texttt{deg} (one degree in radians).
 %   \item Dimensions, automatically expressed in points, \emph{e.g.},
 %     \texttt{pc} is~$12$.
-%   \item Automatic conversion (no need for \cs{number} of
+%   \item Automatic conversion (no need for \cs{number}) of
 %     integer, dimension, and skip variables to floating points,
 %     expressing dimensions in points and ignoring the stretch and
 %     shrink components of skips.
@@ -136,7 +136,7 @@
 %
 % \begin{implementation}
 %
-% \section{\pkg{xfpu} implementation}
+% \section{\pkg{xfp} implementation}
 %
 %    \begin{macrocode}
 %<*package>
@@ -143,7 +143,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xfp}{2017/05/29}{}
+\ProvidesExplPackage{xfp}{2017/07/15}{}
   {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-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -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/05/29]
-%<package>\@ifpackagelater{expl3}{2017/05/29}
+\RequirePackage{expl3}[2017/07/15]
+%<package>\@ifpackagelater{expl3}{2017/07/15}
 %<package>  {}
 %<package>  {%
 %<package>    \PackageError{xfrac}{Support package l3kernel too old}
@@ -63,7 +63,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -533,7 +533,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xfrac}{2017/05/29}{}
+\ProvidesExplPackage{xfrac}{2017/07/15}{}
   {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-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -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/05/29]
-%<package>\@ifpackagelater{expl3}{2017/05/29}
+\RequirePackage{expl3}[2017/07/15]
+%<package>\@ifpackagelater{expl3}{2017/07/15}
 %<package>  {}
 %<package>  {%
 %<package>    \PackageError{xparse}{Support package l3kernel too old}
@@ -67,7 +67,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -776,7 +776,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xparse}{2017/05/29}{}
+\ProvidesExplPackage{xparse}{2017/07/15}{}
   {L3 Experimental document command parser}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx	2017-07-15 21:27:01 UTC (rev 44813)
@@ -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/05/29]
-%<package>\@ifpackagelater{expl3}{2017/05/29}
+\RequirePackage{expl3}[2017/07/15]
+%<package>\@ifpackagelater{expl3}{2017/07/15}
 %<package>  {}
 %<package>  {%
 %<package>    \PackageError{xtemplate}{Support package l3kernel too old}
@@ -63,7 +63,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
 %
 % \maketitle
 %
@@ -682,7 +682,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xtemplate}{2017/05/29}{}
+\ProvidesExplPackage{xtemplate}{2017/07/15}{}
   {L3 Experimental prototype document functions}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-convert.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-convert.sty	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-convert.sty	2017-07-15 21:27:01 UTC (rev 44813)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3str-convert.dtx Copyright (C) 2013-2017 The LaTeX3 Project
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3str-convert}{2017/05/29}{}
+\ProvidesExplPackage{l3str-convert}{2017/07/15}{}
   {L3 Experimental string encoding conversions}
 \cs_if_exist:NF \use_ii_i:nn
   { \cs_new:Npn \use_ii_i:nn #1#2 { #2 #1 } }

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty	2017-07-15 21:27:01 UTC (rev 44813)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3str-format.dtx Copyright (C) 2012-2013,2015-2017 The LaTeX3 Project
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3str-format}{2017/05/29}{}
+\ProvidesExplPackage{l3str-format}{2017/07/15}{}
   {L3 Experimental string formatting}
 \RequirePackage{l3str}
 \cs_generate_variant:Nn \use:nn { nf }

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty	2017-07-15 21:27:01 UTC (rev 44813)
@@ -20,7 +20,7 @@
 %% 
 %% File: xcoffins.dtx Copyright(C) 2010-2012,2014,2016,2017 The LaTeX3 Project
 \RequirePackage{xparse}
-\ProvidesExplPackage{xcoffins}{2017/05/29}{}
+\ProvidesExplPackage{xcoffins}{2017/07/15}{}
   {L3 Experimental design level coffins}
 \keys_define:nn { coffin }
   {

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty	2017-07-15 21:27:01 UTC (rev 44813)
@@ -20,8 +20,8 @@
 %% 
 %% File: l3galley.dtx Copyright (C) 1999-2001, 2004-2009 Frank Mittelbach
 %%                              (C) 2010-2017 The LaTeX3 Project
-\RequirePackage{expl3}[2017/05/29]
-\@ifpackagelater{expl3}{2017/05/29}
+\RequirePackage{expl3}[2017/07/15]
+\@ifpackagelater{expl3}{2017/07/15}
   {}
   {%
     \PackageError{l3galley}{Support package l3kernel too old}
@@ -33,7 +33,7 @@
       }%
     \endinput
   }
-\ProvidesExplPackage{l3galley}{2017/05/29}{}
+\ProvidesExplPackage{l3galley}{2017/07/15}{}
   {L3 Experimental galley code}
 \int_new:N \l__galley_tmp_int
 \seq_new:N \g__galley_tmpa_seq

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty	2017-07-15 21:27:01 UTC (rev 44813)
@@ -21,7 +21,7 @@
 %% File: xgalley.dtx Copyright (C) 1999-2001, 2004-2009 Frank Mittelbach
 %%                             (C) 2010-2012,2014,2016-2017 The LaTeX3 Project
 \RequirePackage{xparse}
-\ProvidesExplPackage{xgalley}{2017/05/29}{}
+\ProvidesExplPackage{xgalley}{2017/07/15}{}
   {L3 Experimental galley}
 \RequirePackage{xparse,xtemplate,l3galley}
 \clist_new:N \l__galley_tmpa_clist

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex	2017-07-15 21:27:01 UTC (rev 44813)
@@ -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/05/29}%
+\def\ExplFileDate{2017/07/15}%
 \begingroup
   \def\next{\endgroup}%
   \expandafter\ifx\csname PackageError\endcsname\relax
@@ -187,7 +187,7 @@
       local t = { }
       for _,i in pairs(tex.extraprimitives("luatex")) do
         if string.match(i,"^U") then
-          if not string.match(i,"^Uchar$") then
+          if not string.match(i,"^Uchar$") then %$
             table.insert(t,i)
           end
         end
@@ -826,6 +826,8 @@
   \__kernel_primitive:NN \pdfdraftmode                \pdftex_draftmode:D
   \__kernel_primitive:NN \pdfeachlinedepth            \pdftex_eachlinedepth:D
   \__kernel_primitive:NN \pdfeachlineheight           \pdftex_eachlineheight:D
+  \__kernel_primitive:NN \pdffilemoddate              \pdftex_filemoddate:D
+  \__kernel_primitive:NN \pdffilesize                 \pdftex_filesize:D
   \__kernel_primitive:NN \pdffirstlineheight          \pdftex_firstlineheight:D
   \__kernel_primitive:NN \pdffontexpand               \pdftex_fontexpand:D
   \__kernel_primitive:NN \pdffontsize                 \pdftex_fontsize:D
@@ -836,6 +838,7 @@
   \__kernel_primitive:NN \pdflastypos                 \pdftex_lastypos:D
   \__kernel_primitive:NN \pdfmapfile                  \pdftex_mapfile:D
   \__kernel_primitive:NN \pdfmapline                  \pdftex_mapline:D
+  \__kernel_primitive:NN \pdfmdfivesum                \pdftex_mdfivesum:D
   \__kernel_primitive:NN \pdfnoligatures              \pdftex_noligatures:D
   \__kernel_primitive:NN \pdfnormaldeviate            \pdftex_normaldeviate:D
   \__kernel_primitive:NN \pdfpageheight               \pdftex_pageheight:D
@@ -925,6 +928,7 @@
   \__kernel_primitive:NN \XeTeXvariationname          \xetex_variationname:D
   \__kernel_primitive:NN \XeTeXrevision               \xetex_XeTeXrevision:D
   \__kernel_primitive:NN \XeTeXversion                \xetex_XeTeXversion:D
+  \__kernel_primitive:NN \mdfivesum                   \pdftex_mdfivesum:D
   \__kernel_primitive:NN \ifprimitive                 \pdftex_ifprimitive:D
   \__kernel_primitive:NN \primitive                   \pdftex_primitive:D
   \__kernel_primitive:NN \shellescape                 \pdftex_shellescape:D
@@ -1755,29 +1759,6 @@
   { \cs_if_exist:cTF {#1} { \use:c {#1} #2 } { } }
 \cs_set:Npn \cs_if_exist_use:c #1
   { \cs_if_exist:cTF {#1} { \use:c {#1} } { } }
-\cs_set_protected:Npn \iow_log:x
-  { \tex_immediate:D \tex_write:D -1 }
-\cs_set_protected:Npn \iow_term:x
-  { \tex_immediate:D \tex_write:D 16 }
-\tex_ifodd:D \l at expl@log at functions@bool
-  \cs_set_protected:Npn \__chk_log:x { \iow_log:x }
-  \cs_set_protected:Npn \__chk_suspend_log:
-    {
-      \cs_set_protected:Npx \__chk_resume_log:
-        {
-          \cs_set_protected:Npn \__chk_resume_log:
-            { \exp_not:o { \__chk_resume_log: } }
-          \cs_set_protected:Npn \__chk_log:x
-            { \exp_not:o { \__chk_log:x } }
-        }
-      \cs_set_protected:Npn \__chk_log:x { \use_none:n }
-    }
-  \cs_set_protected:Npn \__chk_resume_log: { }
-\else:
-  \cs_set_protected:Npn \__chk_log:x { \use_none:n }
-  \cs_set_protected:Npn \__chk_suspend_log: { }
-  \cs_set_protected:Npn \__chk_resume_log: { }
-\fi:
 \cs_set_protected:Npn \__msg_kernel_error:nnxx #1#2#3#4
   {
     \tex_newlinechar:D = `\^^J \tex_relax:D
@@ -1797,6 +1778,85 @@
   { \__msg_kernel_error:nnxx {#1} {#2} { } { } }
 \cs_set:Npn \msg_line_context:
   { on~line~ \tex_the:D \tex_inputlineno:D }
+\cs_set_protected:Npn \iow_log:x
+  { \tex_immediate:D \tex_write:D -1 }
+\cs_set_protected:Npn \iow_term:x
+  { \tex_immediate:D \tex_write:D 16 }
+\cs_set_protected:Npn \debug_log_functions_on:
+  {
+    \__msg_kernel_error:nnx { kernel } { enable-debug }
+      { \token_to_str:N \debug_log_functions_on: }
+  }
+\cs_set_protected:Npn \debug_log_functions_off:
+  {
+    \__msg_kernel_error:nnx { kernel } { enable-debug }
+      { \token_to_str:N \debug_log_functions_off: }
+  }
+\cs_set_protected:Npn \__debug_suspend_log: { }
+\cs_set_protected:Npn \__debug_resume_log: { }
+\tex_ifodd:D \l at expl@enable at debug@bool
+  \cs_set_protected:Npn \debug_log_functions_on:
+    {
+      \cs_set_protected:Npn \__debug_log:x { \iow_log:x }
+      \cs_set_protected:Npn \__debug_suspend_log:
+        {
+          \cs_set_protected:Npx \__debug_resume_log:
+            {
+              \cs_set_protected:Npn \__debug_resume_log:
+                { \exp_not:o { \__debug_resume_log: } }
+              \cs_set_protected:Npn \__debug_log:x
+                { \exp_not:o { \__debug_log:x } }
+            }
+          \cs_set_protected:Npn \__debug_log:x { \use_none:n }
+        }
+      \cs_set_protected:Npn \__debug_resume_log: { }
+    }
+  \cs_set_protected:Npn \debug_log_functions_off:
+    {
+      \cs_set_protected:Npn \__debug_log:x { \use_none:n }
+      \cs_set_protected:Npn \__debug_suspend_log: { }
+      \cs_set_protected:Npn \__debug_resume_log: { }
+    }
+  \tex_ifodd:D \l at expl@log at functions@bool
+    \debug_log_functions_on:
+  \else:
+    \debug_log_functions_off:
+  \fi:
+\fi:
+\cs_set_protected:Npn \__debug_patch:nnNw #1#2 { }
+\tex_ifodd:D \l at expl@enable at debug@bool
+  \cs_set_protected:Npn \__debug_patch:nnNw #1#2#3
+    {
+      \tex_ifcase:D
+        \if_meaning:w #3 \cs_new_protected:Npn  1~ \fi:
+        \if_meaning:w #3 \cs_new:Npn            1~ \fi:
+        \if_meaning:w #3 \cs_set_protected:Npn  1~ \fi:
+        \if_meaning:w #3 \cs_set:Npn            1~ \fi:
+        \if_meaning:w #3 \cs_gset_protected:Npn 1~ \fi:
+        \if_meaning:w #3 \cs_gset:Npn           1~ \fi:
+        \if_meaning:w #3 \prg_new_protected_conditional:Npnn 2~ \fi:
+        \if_meaning:w #3 \prg_new_conditional:Npnn           2~ \fi:
+        \__msg_kernel_error:nnx { kernel } { debug-unpatchable }
+          { \token_to_str:N #3 }
+      \or:
+        \exp_after:wN \__debug_patch_param:NNnnNnp
+        \exp_after:wN \__debug_patch_new:nnNNnn
+      \else:
+        \exp_after:wN \__debug_patch_param:NNnnNnp
+        \exp_after:wN \__debug_patch_new_conditional:nnNNnnn
+      \fi:
+      \use_none:nn {#1} {#2} #3
+    }
+  \cs_set_protected:Npn \__debug_patch_param:NNnnNnp #1#2#3#4#5#6#7#
+    { #1 {#3} {#4} #5 #6 {#7} }
+  \cs_set_protected:Npn \__debug_patch_new:nnNNnn #1#2#3#4#5#6
+    { #3 #4 #5 { #1 #6 #2 } }
+  \cs_set_protected:Npn \__debug_patch_new_conditional:nnNNnnn
+      #1#2#3#4#5#6#7
+    { #3 #4 #5 {#6} { #1 #7 #2 } }
+\fi:
+\__debug_patch:nnNw { }
+  { \__debug_log:x { Defining~\token_to_str:N #1~ \msg_line_context: } }
 \cs_set_protected:Npn \__chk_if_free_cs:N #1
   {
     \cs_if_free:NF #1
@@ -1804,29 +1864,38 @@
         \__msg_kernel_error:nnxx { kernel } { command-already-defined }
           { \token_to_str:N #1 } { \token_to_meaning:N #1 }
       }
-}
-\tex_ifodd:D \l at expl@log at functions@bool
-  \cs_set_protected:Npn \__chk_if_free_cs:N #1
-    {
-      \cs_if_free:NF #1
-        {
-          \__msg_kernel_error:nnxx { kernel } { command-already-defined }
-            { \token_to_str:N #1 } { \token_to_meaning:N #1 }
-        }
-      \__chk_log:x { Defining~\token_to_str:N #1~ \msg_line_context: }
-    }
-\fi:
+  }
 \cs_set_protected:Npn \__chk_if_free_cs:c
   { \exp_args:Nc \__chk_if_free_cs:N }
-\tex_ifodd:D \l at expl@check at declarations@bool
-  \cs_set_protected:Npn \__chk_if_exist_var:N #1
+\cs_set_protected:Npn \debug_check_declarations_on:
+  {
+    \__msg_kernel_error:nnx { kernel } { enable-debug }
+      { \token_to_str:N \debug_check_declarations_on: }
+  }
+\cs_set_protected:Npn \debug_check_declarations_off:
+  {
+    \__msg_kernel_error:nnx { kernel } { enable-debug }
+      { \token_to_str:N \debug_check_declarations_off: }
+  }
+\tex_ifodd:D \l at expl@enable at debug@bool
+  \cs_set_protected:Npn \debug_check_declarations_on:
     {
-      \cs_if_exist:NF #1
+      \cs_set_protected:Npn \__chk_if_exist_var:N ##1
         {
-          \__msg_kernel_error:nnx { check } { non-declared-variable }
-            { \token_to_str:N #1 }
+          \cs_if_exist:NF ##1
+            {
+              \__msg_kernel_error:nnx { check } { non-declared-variable }
+                { \token_to_str:N ##1 }
+            }
         }
     }
+  \cs_set_protected:Npn \debug_check_declarations_off:
+    { \cs_set_protected:Npn \__chk_if_exist_var:N ##1 { } }
+  \tex_ifodd:D \l at expl@check at declarations@bool
+    \debug_check_declarations_on:
+  \else:
+    \debug_check_declarations_off:
+  \fi:
 \fi:
 \cs_set_protected:Npn \__chk_if_exist_cs:N #1
   {
@@ -2474,7 +2543,7 @@
         \q_mark
         \__msg_kernel_error:nnxx { kernel } { variant-too-long }
           {#5} { \token_to_str:N #3 }
-        \use_none:nnnn
+        \use_none:nnn
         \q_stop
         #3
         #3
@@ -2489,7 +2558,7 @@
         \q_mark
         \__msg_kernel_error:nnxxxx { kernel } { invalid-variant }
           {#7} { \token_to_str:N #5 } {#1} {#2}
-        \use_none:nnnn
+        \use_none:nnn
         \q_stop
         #5
         #5
@@ -2507,11 +2576,23 @@
       \fi:
     \fi:
   }
+\__debug_patch:nnNw
+  {
+    \cs_if_free:NF #4
+      {
+        \__debug_log:x
+          {
+            Variant~\token_to_str:N #4~%
+            already~defined;~ not~ changing~ it~ \msg_line_context:
+          }
+      }
+  }
+  { }
 \cs_new_protected:Npn \__cs_generate_variant:wwNN
     #1 \q_mark #2 \q_stop #3#4
   {
     #2
-    \cs_if_free:NTF #4
+    \cs_if_free:NT #4
       {
         \group_begin:
           \__cs_generate_internal_variant:n {#1}
@@ -2518,13 +2599,6 @@
           \__cs_tmp:w #4 { \exp_not:c { exp_args:N #1 } \exp_not:N #3 }
         \group_end:
       }
-      {
-        \__chk_log:x
-          {
-            Variant~\token_to_str:N #4~%
-            already~defined;~ not~ changing~ it~ \msg_line_context:
-          }
-      }
   }
 \cs_new_protected:Npx \__cs_generate_internal_variant:n #1
   {
@@ -2588,16 +2662,41 @@
   { \tl_if_exist:NTF #1 { \tl_gclear:N #1 } { \tl_new:N #1 } }
 \cs_generate_variant:Nn \tl_clear_new:N  { c }
 \cs_generate_variant:Nn \tl_gclear_new:N { c }
-\cs_new_eq:NN \tl_set_eq:NN  \cs_set_eq:NN
-\cs_new_eq:NN \tl_set_eq:cN  \cs_set_eq:cN
-\cs_new_eq:NN \tl_set_eq:Nc  \cs_set_eq:Nc
-\cs_new_eq:NN \tl_set_eq:cc  \cs_set_eq:cc
-\cs_new_eq:NN \tl_gset_eq:NN \cs_gset_eq:NN
-\cs_new_eq:NN \tl_gset_eq:cN \cs_gset_eq:cN
-\cs_new_eq:NN \tl_gset_eq:Nc \cs_gset_eq:Nc
-\cs_new_eq:NN \tl_gset_eq:cc \cs_gset_eq:cc
+\tex_ifodd:D \l at expl@enable at debug@bool
+  \cs_new_protected:Npn \tl_set_eq:NN #1#2
+    {
+      \__chk_if_exist_var:N #1
+      \__chk_if_exist_var:N #2
+      \cs_set_eq:NN #1 #2
+    }
+  \cs_new_protected:Npn \tl_gset_eq:NN #1#2
+    {
+      \__chk_if_exist_var:N #1
+      \__chk_if_exist_var:N #2
+      \cs_gset_eq:NN #1 #2
+    }
+\else:
+  \cs_new_eq:NN \tl_set_eq:NN  \cs_set_eq:NN
+  \cs_new_eq:NN \tl_gset_eq:NN \cs_gset_eq:NN
+\fi:
+\cs_generate_variant:Nn \tl_set_eq:NN { cN, Nc, cc }
+\cs_generate_variant:Nn \tl_gset_eq:NN { cN, Nc, cc }
+\__debug_patch:nnNw
+  {
+    \__chk_if_exist_var:N #1
+    \__chk_if_exist_var:N #2
+    \__chk_if_exist_var:N #3
+  }
+  { }
 \cs_new_protected:Npn \tl_concat:NNN #1#2#3
   { \tl_set:Nx #1 { \exp_not:o {#2} \exp_not:o {#3} } }
+\__debug_patch:nnNw
+  {
+    \__chk_if_exist_var:N #1
+    \__chk_if_exist_var:N #2
+    \__chk_if_exist_var:N #3
+  }
+  { }
 \cs_new_protected:Npn \tl_gconcat:NNN #1#2#3
   { \tl_gset:Nx #1 { \exp_not:o {#2} \exp_not:o {#3} } }
 \cs_generate_variant:Nn \tl_concat:NNN  { ccc }
@@ -2606,16 +2705,22 @@
 \prg_new_eq_conditional:NNn \tl_if_exist:c \cs_if_exist:c { TF , T , F , p }
 \tl_const:Nn \c_empty_tl { }
 \tl_const:Nn \c_space_tl { ~ }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \tl_set:Nn #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:n {#2} } }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \tl_set:No #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:o {#2} } }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \tl_set:Nx #1#2
   { \cs_set_nopar:Npx #1 {#2} }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \tl_gset:Nn #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:n {#2} } }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \tl_gset:No #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:o {#2} } }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \tl_gset:Nx #1#2
   { \cs_gset_nopar:Npx #1 {#2} }
 \cs_generate_variant:Nn \tl_set:Nn  {         NV , Nv , Nf }
@@ -2624,20 +2729,28 @@
 \cs_generate_variant:Nn \tl_gset:Nn {         NV , Nv , Nf }
 \cs_generate_variant:Nn \tl_gset:Nx { c }
 \cs_generate_variant:Nn \tl_gset:Nn { c, co , cV , cv , cf }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \tl_put_left:Nn #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:n {#2} \exp_not:o #1 } }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \tl_put_left:NV #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:V #2 \exp_not:o #1 } }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \tl_put_left:No #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:o {#2} \exp_not:o #1 } }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \tl_put_left:Nx #1#2
   { \cs_set_nopar:Npx #1 { #2 \exp_not:o #1 } }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \tl_gput_left:Nn #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:n {#2} \exp_not:o #1 } }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \tl_gput_left:NV #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:V #2 \exp_not:o #1 } }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \tl_gput_left:No #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:o {#2} \exp_not:o #1 } }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \tl_gput_left:Nx #1#2
   { \cs_gset_nopar:Npx #1 { #2 \exp_not:o {#1} } }
 \cs_generate_variant:Nn \tl_put_left:Nn  { c }
@@ -2648,20 +2761,28 @@
 \cs_generate_variant:Nn \tl_gput_left:NV { c }
 \cs_generate_variant:Nn \tl_gput_left:No { c }
 \cs_generate_variant:Nn \tl_gput_left:Nx { c }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \tl_put_right:Nn #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:o #1 \exp_not:n {#2} } }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \tl_put_right:NV #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:o #1 \exp_not:V #2 } }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \tl_put_right:No #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:o #1 \exp_not:o {#2} } }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \tl_put_right:Nx #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:o #1 #2 } }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \tl_gput_right:Nn #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:o #1 \exp_not:n {#2} } }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \tl_gput_right:NV #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:o #1 \exp_not:V #2 } }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \tl_gput_right:No #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:o #1 \exp_not:o {#2} } }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \tl_gput_right:Nx #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:o {#1} #2 } }
 \cs_generate_variant:Nn \tl_put_right:Nn  { c }
@@ -2672,61 +2793,6 @@
 \cs_generate_variant:Nn \tl_gput_right:NV { c }
 \cs_generate_variant:Nn \tl_gput_right:No { c }
 \cs_generate_variant:Nn \tl_gput_right:Nx { c }
-\tex_ifodd:D \l at expl@check at declarations@bool
-  \cs_set_protected:Npn \__cs_tmp:w #1
-    {
-      \if_meaning:w \q_recursion_tail #1
-        \exp_after:wN \use_none_delimit_by_q_recursion_stop:w
-      \fi:
-      \use:x
-        {
-          \cs_set_protected:Npn #1 \exp_not:n { ##1 ##2 }
-            {
-              \__chk_if_exist_var:N \exp_not:n {##1}
-              \exp_not:o { #1 {##1} {##2} }
-            }
-        }
-      \__cs_tmp:w
-    }
-  \__cs_tmp:w
-    \tl_set:Nn  \tl_set:No  \tl_set:Nx
-    \tl_gset:Nn \tl_gset:No \tl_gset:Nx
-    \tl_put_left:Nn   \tl_put_left:NV
-    \tl_put_left:No   \tl_put_left:Nx
-    \tl_gput_left:Nn  \tl_gput_left:NV
-    \tl_gput_left:No  \tl_gput_left:Nx
-    \tl_put_right:Nn  \tl_put_right:NV
-    \tl_put_right:No  \tl_put_right:Nx
-    \tl_gput_right:Nn \tl_gput_right:NV
-    \tl_gput_right:No \tl_gput_right:Nx
-    \q_recursion_tail \q_recursion_stop
-  \cs_set_protected:Npn \tl_set_eq:NN #1#2
-    {
-      \__chk_if_exist_var:N #1
-      \__chk_if_exist_var:N #2
-      \cs_set_eq:NN #1 #2
-    }
-  \cs_set_protected:Npn \tl_gset_eq:NN #1#2
-    {
-      \__chk_if_exist_var:N #1
-      \__chk_if_exist_var:N #2
-      \cs_gset_eq:NN #1 #2
-    }
-  \cs_set_protected:Npn \tl_concat:NNN #1#2#3
-    {
-      \__chk_if_exist_var:N #1
-      \__chk_if_exist_var:N #2
-      \__chk_if_exist_var:N #3
-      \tl_set:Nx #1 { \exp_not:o {#2} \exp_not:o {#3} }
-    }
-  \cs_set_protected:Npn \tl_gconcat:NNN #1#2#3
-    {
-      \__chk_if_exist_var:N #1
-      \__chk_if_exist_var:N #2
-      \__chk_if_exist_var:N #3
-      \tl_gset:Nx #1 { \exp_not:o {#2} \exp_not:o {#3} }
-    }
-\tex_fi:D
 \tl_const:Nx \c__tl_rescan_marker_tl { : \token_to_str:N : }
 \cs_new_protected:Npn \tl_set_rescan:Nnn
   { \__tl_set_rescan:NNnn \tl_set:Nn }
@@ -4051,7 +4117,7 @@
           \if_int_compare:w \__str_if_eq_x:nn { #5 ~ } {#7} = 0 \exp_stop_f:
           \else:
             \tl_const:cx
-              { c__unicode_title_ \utex_char:D "#1 _tl }
+              { c__unicode_mixed_ \utex_char:D "#1 _tl }
               { \utex_char:D "#7 }
           \fi:
         }
@@ -4081,7 +4147,7 @@
       \use:n { \__unicode_parse_auxii:w #1 ~ upper ~ #4 ~ } ~ \q_stop
       \if_int_compare:w \__str_if_eq_x:nn {#3} {#4} = 0 \exp_stop_f:
       \else:
-        \use:n { \__unicode_parse_auxii:w #1 ~ title ~ #3 ~ } ~ \q_stop
+        \use:n { \__unicode_parse_auxii:w #1 ~ mixed ~ #3 ~ } ~ \q_stop
       \fi:
     }
   \cs_set_protected:Npn \__unicode_parse_auxii:w #1 ~ #2 ~ #3 ~ #4 ~ #5 \q_stop
@@ -5494,7 +5560,9 @@
     \cs_new:cpn { flag~#1 } ##1 ;
       { \exp_after:wN \use_none:n \cs:w flag~#1~##1 \cs_end: }
   }
-\cs_new_protected:Npn \flag_clear:n { \__flag_clear:wn 0 ; }
+\__debug_patch:nnNw
+  { \exp_args:Nc \__chk_if_exist_var:N { flag~#1 } } { }
+\cs_new_protected:Npn \flag_clear:n #1 { \__flag_clear:wn 0 ; {#1} }
 \cs_new_protected:Npn \__flag_clear:wn #1 ; #2
   {
     \if_cs_exist:w flag~#2~#1 \cs_end:
@@ -5515,11 +5583,22 @@
   }
 \cs_new_protected:Npn \flag_log:n
   { \__msg_log_next: \flag_show:n }
+\tex_ifodd:D \l at expl@enable at debug@bool
+  \cs_new:Npn \__flag_chk_exist:n #1
+    {
+      \flag_if_exist:nF {#1}
+        {
+          \__msg_kernel_expandable_error:nnn
+            { kernel } { bad-variable } { flag~#1~ }
+        }
+    }
+\fi:
 \prg_new_conditional:Npnn \flag_if_exist:n #1 { p , T , F , TF }
   {
     \cs_if_exist:cTF { flag~#1 }
       { \prg_return_true: } { \prg_return_false: }
   }
+\__debug_patch:nnNw { \__flag_chk_exist:n {#1} } { }
 \prg_new_conditional:Npnn \flag_if_raised:n #1 { p , T , F , TF }
   {
     \if_cs_exist:w flag~#1~0 \cs_end:
@@ -5528,7 +5607,8 @@
       \prg_return_false:
     \fi:
   }
-\cs_new:Npn \flag_height:n { \__flag_height_loop:wn 0; }
+\__debug_patch:nnNw { \__flag_chk_exist:n {#1} } { }
+\cs_new:Npn \flag_height:n #1 { \__flag_height_loop:wn 0; {#1} }
 \cs_new:Npn \__flag_height_loop:wn #1 ; #2
   {
     \if_cs_exist:w flag~#2~#1 \cs_end:
@@ -5544,35 +5624,6 @@
     \cs:w flag~#1 \exp_after:wN \cs_end:
     \__int_value:w \flag_height:n {#1} ;
   }
-\tex_ifodd:D \l at expl@check at declarations@bool
-  \cs_set_protected:Npn \flag_clear:n #1
-    {
-      \exp_args:Nc \__chk_if_exist_var:N { flag~#1 }
-      \__flag_clear:wn 0 ; {#1}
-    }
-  \cs_set:Npn \__flag_chk_exist:n #1
-    {
-      \flag_if_exist:nF {#1}
-        {
-          \__msg_kernel_expandable_error:nnn
-            { kernel } { bad-variable } { flag~#1~ }
-        }
-    }
-  \cs_set:Npn \flag_height:n #1
-    {
-      \__flag_chk_exist:n {#1}
-      \__flag_height_loop:wn 0; {#1}
-    }
-  \prg_set_conditional:Npnn \flag_if_raised:n #1 { p , T , F , TF }
-    {
-      \__flag_chk_exist:n {#1}
-      \if_cs_exist:w flag~#1~0 \cs_end:
-        \prg_return_true:
-      \else:
-        \prg_return_false:
-      \fi:
-    }
-\fi:
 %% File: l3quark.dtx Copyright (C) 1990-2017 The LaTeX3 Project
 \cs_new_protected:Npn \quark_new:N #1 { \tl_const:Nn #1 {#1} }
 \quark_new:N \q_nil
@@ -5685,12 +5736,16 @@
 \cs_new_eq:NN \if_predicate:w \tex_ifodd:D
 \cs_new_protected:Npn \bool_new:N #1 { \cs_new_eq:NN #1 \c_false_bool }
 \cs_generate_variant:Nn \bool_new:N { c }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \bool_set_true:N #1
   { \cs_set_eq:NN #1 \c_true_bool }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \bool_set_false:N #1
   { \cs_set_eq:NN #1 \c_false_bool }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \bool_gset_true:N #1
   { \cs_gset_eq:NN #1 \c_true_bool }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \bool_gset_false:N #1
   { \cs_gset_eq:NN #1 \c_false_bool }
 \cs_generate_variant:Nn \bool_set_true:N   { c }
@@ -5697,62 +5752,18 @@
 \cs_generate_variant:Nn \bool_set_false:N  { c }
 \cs_generate_variant:Nn \bool_gset_true:N  { c }
 \cs_generate_variant:Nn \bool_gset_false:N { c }
-\cs_new_eq:NN \bool_set_eq:NN  \cs_set_eq:NN
-\cs_new_eq:NN \bool_set_eq:Nc  \cs_set_eq:Nc
-\cs_new_eq:NN \bool_set_eq:cN  \cs_set_eq:cN
-\cs_new_eq:NN \bool_set_eq:cc  \cs_set_eq:cc
-\cs_new_eq:NN \bool_gset_eq:NN \cs_gset_eq:NN
-\cs_new_eq:NN \bool_gset_eq:Nc \cs_gset_eq:Nc
-\cs_new_eq:NN \bool_gset_eq:cN \cs_gset_eq:cN
-\cs_new_eq:NN \bool_gset_eq:cc \cs_gset_eq:cc
+\cs_new_eq:NN \bool_set_eq:NN  \tl_set_eq:NN
+\cs_new_eq:NN \bool_gset_eq:NN \tl_gset_eq:NN
+\cs_generate_variant:Nn \bool_set_eq:NN { Nc, cN, cc }
+\cs_generate_variant:Nn \bool_gset_eq:NN { Nc, cN, cc }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \bool_set:Nn #1#2
   { \tex_chardef:D #1 = \bool_if_p:n {#2} }
+\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
 \cs_new_protected:Npn \bool_gset:Nn #1#2
   { \tex_global:D \tex_chardef:D #1 = \bool_if_p:n {#2} }
 \cs_generate_variant:Nn \bool_set:Nn  { c }
 \cs_generate_variant:Nn \bool_gset:Nn { c }
-\if_bool:N \l at expl@check at declarations@bool
-  \cs_set_protected:Npn \bool_set_true:N #1
-    {
-      \__chk_if_exist_var:N #1
-      \cs_set_eq:NN #1 \c_true_bool
-    }
-  \cs_set_protected:Npn \bool_set_false:N #1
-    {
-      \__chk_if_exist_var:N #1
-      \cs_set_eq:NN #1 \c_false_bool
-    }
-  \cs_set_protected:Npn \bool_gset_true:N #1
-    {
-      \__chk_if_exist_var:N #1
-      \cs_gset_eq:NN #1 \c_true_bool
-    }
-  \cs_set_protected:Npn \bool_gset_false:N #1
-    {
-      \__chk_if_exist_var:N #1
-      \cs_gset_eq:NN #1 \c_false_bool
-    }
-  \cs_set_protected:Npn \bool_set_eq:NN  #1
-    {
-      \__chk_if_exist_var:N #1
-      \cs_set_eq:NN #1
-    }
-  \cs_set_protected:Npn \bool_gset_eq:NN  #1
-    {
-      \__chk_if_exist_var:N #1
-      \cs_gset_eq:NN #1
-    }
-  \cs_set_protected:Npn \bool_set:Nn #1#2
-    {
-      \__chk_if_exist_var:N #1
-      \tex_chardef:D #1 = \bool_if_p:n {#2}
-    }
-  \cs_set_protected:Npn \bool_gset:Nn #1#2
-    {
-      \__chk_if_exist_var:N #1
-      \tex_global:D \tex_chardef:D #1 = \bool_if_p:n {#2}
-    }
-\fi:
 \prg_new_conditional:Npnn \bool_if:N #1 { p , T , F , TF }
   {
     \if_meaning:w \c_true_bool #1
@@ -7569,6 +7580,8 @@
     \cs_if_exist:cTF { \c__msg_text_prefix_tl #1 / #2 }
       { \prg_return_true: } { \prg_return_false: }
   }
+\__debug_patch:nnNw { }
+  { \__debug_log:x { Defining~message~ #1 / #2 ~\msg_line_context: } }
 \cs_new_protected:Npn \__chk_if_free_msg:nn #1#2
   {
     \msg_if_exist:nnT {#1} {#2}
@@ -7577,17 +7590,6 @@
           {#1} {#2}
       }
   }
-\if_bool:N \l at expl@log at functions@bool
-  \cs_gset_protected:Npn \__chk_if_free_msg:nn #1#2
-    {
-      \msg_if_exist:nnT {#1} {#2}
-        {
-          \__msg_kernel_error:nnxx { kernel } { message-already-defined }
-            {#1} {#2}
-        }
-      \__chk_log:x { Defining~message~ #1 / #2 ~\msg_line_context: }
-    }
-\fi:
 \cs_new_protected:Npn \msg_new:nnnn #1#2
   {
     \__chk_if_free_msg:nn {#1} {#2}
@@ -7621,7 +7623,7 @@
 \tl_const:Nn \c__msg_continue_text_tl
   { Type~<return>~to~continue }
 \tl_const:Nn \c__msg_critical_text_tl
-  { Reading~the~current~file~'\g_file_current_name_tl'~will~stop. }
+  { Reading~the~current~file~'\g_file_curr_name_str'~will~stop. }
 \tl_const:Nn \c__msg_fatal_text_tl
   { This~is~a~fatal~error:~LaTeX~will~abort. }
 \tl_const:Nn \c__msg_help_text_tl
@@ -7678,7 +7680,6 @@
         |...............................................
       }
   }
-
 \group_begin:
   \char_set_lccode:nn {`\{} {`\ }
   \char_set_lccode:nn {`\}} {`\ }
@@ -8183,19 +8184,6 @@
     LaTeX~has~been~asked~to~define~the~conditional~form~'#1'~of~
     the~function~'#2',~but~only~'TF',~'T',~'F',~and~'p'~forms~exist.
   }
-\bool_if:NT \l at expl@check at declarations@bool
-  {
-    \__msg_kernel_new:nnnn { check } { non-declared-variable }
-      { The~variable~#1~has~not~been~declared~\msg_line_context:. }
-      {
-        Checking~is~active,~and~you~have~tried~do~so~something~like: \\
-        \ \ \tl_set:Nn ~ #1 ~ \{ ~ ... ~ \} \\
-        without~first~having: \\
-        \ \ \tl_new:N ~ #1  \\
-        \\
-        LaTeX~will~create~the~variable~and~continue.
-      }
-  }
 \__msg_kernel_new:nnnn { kernel } { scanmark-already-defined }
   { Scan~mark~#1~already~defined. }
   {
@@ -8226,6 +8214,32 @@
     with~a~signature~starting~with~'#1',~but~cannot~change~an~argument~
     from~type~'#3'~to~type~'#4'.
   }
+\bool_if:NTF \l at expl@enable at debug@bool
+  {
+    \__msg_kernel_new:nnn { kernel } { debug-unpatchable }
+      { Only~some~definitions~can~be~patched;~'#3'~cannot. }
+    \__msg_kernel_new:nnnn { check } { non-declared-variable }
+      { The~variable~#1~has~not~been~declared~\msg_line_context:. }
+      {
+        Checking~is~active,~and~you~have~tried~do~so~something~like: \\
+        \ \ \tl_set:Nn ~ #1 ~ \{ ~ ... ~ \} \\
+        without~first~having: \\
+        \ \ \tl_new:N ~ #1  \\
+        \\
+        LaTeX~will~create~the~variable~and~continue.
+      }
+  }
+  {
+    \__msg_kernel_new:nnnn { kernel } { enable-debug }
+      { To~use~'#1'~load~expl3~with~the~'enable-debug'~option. }
+      {
+        The~function~'#1'~will~be~ignored~because~it~can~only~work~if~
+        some~internal~functions~in~expl3~have~been~appropriately~
+        defined.~This~only~happens~if~one~of~the~options~
+        'enable-debug',~'check-declarations'~or~'log-functions'~was~
+        given~when~loading~expl3.
+      }
+  }
 \__msg_kernel_new:nnn { kernel } { bad-variable }
   { Erroneous~variable~#1 used! }
 \__msg_kernel_new:nnn { kernel } { misused-sequence }
@@ -8403,166 +8417,225 @@
     \ \ => \ \ \tl_to_str:n {#2}
   }
 %% File: l3file.dtx Copyright (C) 1990-2017 The LaTeX3 Project
-\tl_new:N \g_file_current_name_tl
+\str_new:N \g_file_curr_dir_str
+\str_new:N \g_file_curr_ext_str
+\str_new:N \g_file_curr_name_str
 \cs_if_exist:NT \@currname
-  { \tl_gset_eq:NN \g_file_current_name_tl \@currname }
+  { \str_gset_eq:NN \g_file_curr_name_str \@currname }
 \seq_new:N \g__file_stack_seq
-\seq_new:N \g__file_record_seq
-\tl_new:N \l__file_internal_tl
-\tl_new:N \l__file_internal_name_tl
-\seq_new:N \l__file_search_path_seq
-\seq_new:N \l__file_saved_search_path_seq
-\seq_new:N \l__file_internal_seq
-\cs_new_protected:Npn \__file_name_sanitize:nn #1#2
-  {
-    \group_begin:
-      \seq_map_inline:Nn \l_char_active_seq
+\group_begin:
+  \cs_set_protected:Npn \__file_tmp:w #1#2#3
+    {
+      \tl_if_blank:nTF {#1}
         {
-          \tl_set:Nx \l__file_internal_tl { \iow_char:N ##1 }
-          \char_set_active_eq:NN ##1 \l__file_internal_tl
-        }
-      \tl_set:Nx \l__file_internal_name_tl {#1}
-      \tl_set:Nx \l__file_internal_name_tl
-        { \tl_to_str:N \l__file_internal_name_tl }
-      \int_compare:nNnTF
-        {
-          \int_mod:nn
+          \cs_set:Npn \__file_tmp:w ##1 " ##2 " ##3 \q_stop { { } {##2} {  } }
+          \seq_gput_right:Nx \g__file_stack_seq
             {
-              0 \tl_map_function:NN \l__file_internal_name_tl
-                \__file_name_sanitize_aux:n
+              \exp_after:wN \__file_tmp:w \tex_jobname:D
+                " \tex_jobname:D " \q_stop
             }
-            { 2 }
         }
-        = 0
         {
-          \tl_remove_all:Nn \l__file_internal_name_tl { " }
-          \tl_if_in:NnT \l__file_internal_name_tl { ~ }
-            {
-              \tl_set:Nx \l__file_internal_name_tl
-                { " \exp_not:V \l__file_internal_name_tl " }
-            }
+          \seq_gput_right:Nn \g__file_stack_seq { { } {#1} {#2} }
+          \__file_tmp:w
         }
+    }
+  \cs_if_exist:NT \@currnamestack
+    { \exp_after:wN \__file_tmp:w \@currnamestack }
+\group_end:
+\seq_new:N \g__file_record_seq
+\tl_new:N \l__file_tmp_tl
+\str_new:N \l__file_base_name_str
+\str_new:N \l__file_full_name_str
+\str_new:N \l__file_dir_str
+\str_new:N \l__file_ext_str
+\str_new:N \l__file_name_str
+\seq_new:N \l_file_search_path_seq
+\seq_new:N \l__file_tmp_seq
+\cs_new_protected:Npn \__file_name_sanitize:nN #1#2
+  {
+    \group_begin:
+      \seq_map_inline:Nn \l_char_active_seq
         {
-          \__msg_kernel_error:nnx
-            { kernel } { unbalanced-quote-in-filename }
-            { \l__file_internal_name_tl }
+          \tl_set:Nx \l__file_tmp_tl { \iow_char:N ##1 }
+          \char_set_active_eq:NN ##1 \l__file_tmp_tl
         }
-      \use:x
-        {
-          \group_end:
-          \exp_not:n {#2} { \l__file_internal_name_tl }
-        }
+      \tl_set:Nx \l__file_tmp_tl {#1}
+      \tl_set:Nx \l__file_tmp_tl
+        { \tl_to_str:N \l__file_tmp_tl }
+    \exp_args:NNNV \group_end:
+    \str_set:Nn #2 \l__file_tmp_tl
   }
-\cs_new:Npn \__file_name_sanitize_aux:n #1
-  { \token_if_eq_charcode:NNT #1 " { + 1 } }
-\cs_new_protected:Npn \file_add_path:nN #1
-  { \__file_name_sanitize:nn {#1} { \__file_add_path:nN } }
-\cs_new_protected:Npn \__file_add_path:nN #1#2
+\cs_new_protected:Npn \__file_name_quote:nN #1#2
   {
-    \__ior_open:Nn \g__file_internal_ior {#1}
-    \ior_if_eof:NTF \g__file_internal_ior
-      { \__file_add_path_search:nN {#1} #2 }
-      { \tl_set:Nn #2 {#1} }
-    \ior_close:N \g__file_internal_ior
+    \str_set:Nx #2 {#1}
+    \int_if_even:nF
+      { 0 \tl_map_function:NN #2 \__file_name_quote_aux:n }
+      {
+        \__msg_kernel_error:nnx
+          { kernel } { unbalanced-quote-in-filename } {#2}
+      }
+    \tl_remove_all:Nn #2 { " }
+    \tl_if_in:NnT #2 { ~ }
+      { \str_set:Nx #2 { " \exp_not:V #2 " } }
   }
-\cs_new_protected:Npn \__file_add_path_search:nN #1#2
+\cs_new:Npn \__file_name_quote_aux:n #1
+  { \token_if_eq_charcode:NNT #1 " { + 1 } }
+\cs_new_protected:Npn \file_get_full_name:nN #1#2
   {
-    \tl_set:Nn #2 { \q_no_value  }
+    \__file_name_sanitize:nN {#1} \l__file_base_name_str
+    \__file_get_full_name_search:nN { } \use:n
+    \seq_map_inline:Nn \l_file_search_path_seq
+      { \__file_get_full_name_search:nN { ##1 / } \seq_map_break:n }
     \cs_if_exist:NT \input at path
       {
-        \seq_set_eq:NN \l__file_saved_search_path_seq
-          \l__file_search_path_seq
-        \seq_set_split:NnV \l__file_internal_seq { , } \input at path
-        \seq_concat:NNN \l__file_search_path_seq
-          \l__file_search_path_seq \l__file_internal_seq
+        \tl_map_inline:Nn \input at path
+          { \__file_get_full_name_search:nN { ##1 } \tl_map_break:n }
       }
-    \seq_map_inline:Nn \l__file_search_path_seq
+    \str_clear:N \l__file_full_name_str
+    \__prg_break_point:
+    \str_if_empty:NF \l__file_full_name_str
       {
-        \__ior_open:Nn \g__file_internal_ior { ##1 #1 }
-        \ior_if_eof:NF \g__file_internal_ior
+        \exp_args:NV \file_parse_full_name:nNNN \l__file_full_name_str
+          \l__file_dir_str \l__file_name_str \l__file_ext_str
+        \str_if_empty:NT \l__file_ext_str
           {
-            \tl_set:Nx #2 { ##1 #1 }
-            \seq_map_break:
+            \__ior_open:No \g__file_internal_ior
+              { \l__file_full_name_str .tex }
+            \ior_if_eof:NF \g__file_internal_ior
+              { \str_put_right:Nn \l__file_full_name_str { .tex } }
           }
       }
-    \cs_if_exist:NT \input at path
-      {
-        \seq_set_eq:NN \l__file_search_path_seq
-          \l__file_saved_search_path_seq
-      }
+    \str_set_eq:NN #2 \l__file_full_name_str
+    \ior_close:N \g__file_internal_ior
   }
+\cs_generate_variant:Nn \file_get_full_name:nN { V }
+\cs_new_protected:Npn \__file_get_full_name_search:nN #1#2
+  {
+    \__file_name_quote:nN
+      { \tl_to_str:n {#1} \l__file_base_name_str }
+      \l__file_full_name_str
+    \__ior_open:No \g__file_internal_ior \l__file_full_name_str
+    \ior_if_eof:NF \g__file_internal_ior { #2 { \__prg_break: } }
+  }
 \prg_new_protected_conditional:Npnn \file_if_exist:n #1 { T , F , TF }
   {
-    \file_add_path:nN {#1} \l__file_internal_name_tl
-    \quark_if_no_value:NTF \l__file_internal_name_tl
+    \file_get_full_name:nN {#1} \l__file_full_name_str
+    \str_if_empty:NTF \l__file_full_name_str
       { \prg_return_false: }
       { \prg_return_true: }
   }
-\cs_new_protected:Npn \file_input:n #1
+\cs_new_protected:Npn \__file_missing:n #1
   {
-    \__file_if_exist:nT {#1}
-      { \__file_input:V \l__file_internal_name_tl }
+    \__file_name_sanitize:nN {#1} \l__file_base_name_str
+    \__msg_kernel_error:nnx { kernel } { file-not-found }
+      { \l__file_base_name_str }
   }
-\cs_new_protected:Npn \__file_if_exist:nT #1#2
+\cs_new_protected:Npn \file_input:n #1
   {
-    \file_if_exist:nTF {#1}
-      {#2}
-      {
-        \__file_name_sanitize:nn {#1}
-          { \__msg_kernel_error:nnx { kernel } { file-not-found } }
-      }
+    \file_get_full_name:nN {#1} \l__file_full_name_str
+    \str_if_empty:NTF \l__file_full_name_str
+      { \__file_missing:n {#1} }
+      { \__file_input:V \l__file_full_name_str }
   }
 \cs_new_protected:Npn \__file_input:n #1
   {
-    \tl_if_in:nnTF {#1} { . }
-      { \__file_input_aux:n {#1} }
-      { \__file_input_aux:o { \tl_to_str:n { #1 . tex } } }
-  }
-\cs_generate_variant:Nn \__file_input:n { V }
-\cs_new_protected:Npn \__file_input_aux:n #1
-  {
     \clist_if_exist:NTF \@filelist
       { \@addtofilelist {#1} }
       { \seq_gput_right:Nn \g__file_record_seq {#1} }
-    \seq_gpush:No \g__file_stack_seq \g_file_current_name_tl
-    \tl_gset:Nn \g_file_current_name_tl {#1}
+    \__file_input_push:n {#1}
     \tex_input:D #1 \c_space_tl
-    \seq_gpop:NN \g__file_stack_seq \l__file_internal_tl
-    \tl_gset_eq:NN \g_file_current_name_tl \l__file_internal_tl
+    \__file_input_pop:
   }
-\cs_generate_variant:Nn \__file_input_aux:n { o }
-\cs_new_protected:Npn \file_path_include:n #1
-  { \__file_name_sanitize:nn {#1} { \__file_path_include:n } }
-\cs_new_protected:Npn \__file_path_include:n #1
+\cs_generate_variant:Nn \__file_input:n { V }
+\cs_new_protected:Npn \__file_input_push:n #1
   {
-    \seq_if_in:NnF \l__file_search_path_seq {#1}
-      { \seq_put_right:Nn \l__file_search_path_seq {#1} }
+    \seq_gpush:Nx \g__file_stack_seq
+      {
+        { \g_file_curr_dir_str }
+        { \g_file_curr_name_str }
+        { \g_file_curr_ext_str }
+      }
+    \file_parse_full_name:nNNN {#1}
+      \l__file_dir_str \l__file_name_str \l__file_ext_str
+    \str_gset_eq:NN \g_file_curr_dir_str  \l__file_dir_str
+    \str_gset_eq:NN \g_file_curr_name_str \l__file_name_str
+    \str_gset_eq:NN \g_file_curr_ext_str  \l__file_ext_str
   }
-\cs_new_protected:Npn \file_path_remove:n #1
+\cs_new_protected:Npn \__file_input_pop:
   {
-    \__file_name_sanitize:nn {#1}
-      { \seq_remove_all:Nn \l__file_search_path_seq }
+    \seq_gpop:NN \g__file_stack_seq \l__file_tmp_tl
+    \exp_after:wN \__file_input_pop:nnn \l__file_tmp_tl
   }
-\cs_new_protected:Npn \file_list:
+\cs_new_protected:Npn \__file_input_pop:nnn #1#2#3
   {
-    \seq_set_eq:NN \l__file_internal_seq \g__file_record_seq
-    \clist_if_exist:NT \@filelist
+    \str_gset:Nn \g_file_curr_dir_str  {#1}
+    \str_gset:Nn \g_file_curr_name_str {#2}
+    \str_gset:Nn \g_file_curr_ext_str  {#3}
+  }
+\cs_new_protected:Npn \file_parse_full_name:nNNN #1#2#3#4
+  {
+    \exp_after:wN \__file_parse_full_name_auxi:w
+      \tl_to_str:n { #1 " #1 " } \q_stop #2#3#4
+  }
+\cs_new_protected:Npn \__file_parse_full_name_auxi:w #1 " #2 " #3 \q_stop #4#5#6
+  {
+    \__file_parse_full_name_split:nNNNTF {#2} / #4 #5
+      { \str_if_empty:NT #4 { \str_set:Nn #4 { / } } }
+      { }
+    \exp_args:No \__file_parse_full_name_split:nNNNTF {#5} . #5 #6
+      { \str_put_left:Nn #6 { . } }
       {
-        \clist_map_inline:Nn \@filelist
+        \str_set_eq:NN #5 #6
+        \str_clear:N #6
+      }
+  }
+\cs_new_protected:Npn \__file_parse_full_name_split:nNNNTF #1#2#3#4
+  {
+    \cs_set_protected:Npn \__file_tmp:w ##1 ##2 #2 ##3 \q_stop
+      {
+        \tl_if_empty:nTF {##3}
           {
-            \seq_put_right:No \l__file_internal_seq
-              { \tl_to_str:n {##1} }
+            \str_set:Nn #4 {##2}
+            \tl_if_empty:nTF {##1}
+              {
+                \str_clear:N #3
+                \use_ii:nn
+              }
+              {
+                \str_set:Nx #3 { \str_tail:n {##1} }
+                \use_i:nn
+              }
           }
+          { \__file_tmp:w { ##1 #2 ##2 } ##3 \q_stop }
       }
-    \seq_remove_duplicates:N \l__file_internal_seq
-    \iow_log:n { *~File~List~* }
-    \seq_map_inline:Nn \l__file_internal_seq { \iow_log:n {##1} }
-    \iow_log:n { ************* }
+    \__file_tmp:w { } #1 #2 \q_stop
   }
+\cs_new_protected:Npn \file_show_list:
+  {
+    \seq_clear:N \l__file_tmp_seq
+    \clist_if_exist:NT \@filelist
+      {
+        \exp_args:NNx \seq_set_from_clist:Nn \l__file_tmp_seq
+          { \tl_to_str:N \@filelist }
+      }
+    \seq_concat:NNN \l__file_tmp_seq \l__file_tmp_seq \g__file_record_seq
+    \seq_remove_duplicates:N \l__file_tmp_seq
+    \__msg_show_wrap:n
+      {
+        >~File~List~< \\
+        \seq_map_function:NN \l__file_tmp_seq \__file_list_aux:n
+        ............
+      }
+  }
+\cs_new:Npn \__file_list_aux:n #1 { #1 \\ }
+\cs_new_protected:Npn \file_log_list:
+  { \__msg_log_next: \file_show_list: }
 \AtBeginDocument
   {
-    \clist_map_inline:Nn \@filelist
-      { \seq_gput_right:No \g__file_record_seq { \tl_to_str:n {#1} } }
+    \exp_args:NNx \seq_set_from_clist:Nn \l__file_tmp_seq
+      { \tl_to_str:N \@filelist }
+    \seq_gconcat:NNN \g__file_record_seq \g__file_record_seq \l__file_tmp_seq
   }
 \int_const:Nn \c_term_ior { 16 }
 \seq_new:N \g__ior_streams_seq
@@ -8585,30 +8658,21 @@
 \cs_new_protected:Npn \ior_new:N #1 { \cs_new_eq:NN #1 \c_term_ior }
 \cs_generate_variant:Nn \ior_new:N { c }
 \cs_new_protected:Npn \ior_open:Nn #1#2
-  { \__file_name_sanitize:nn {#2} { \__ior_open_aux:Nn #1 } }
+  { \ior_open:NnF #1 {#2} { \__file_missing:n {#2} } }
 \cs_generate_variant:Nn \ior_open:Nn { c }
-\cs_new_protected:Npn \__ior_open_aux:Nn #1#2
-  {
-    \file_add_path:nN {#2} \l__file_internal_name_tl
-    \quark_if_no_value:NTF \l__file_internal_name_tl
-      { \__msg_kernel_error:nnx { kernel } { file-not-found } {#2} }
-      { \__ior_open:No #1 \l__file_internal_name_tl }
-  }
 \prg_new_protected_conditional:Npnn \ior_open:Nn #1#2 { T , F , TF }
-  { \__file_name_sanitize:nn {#2} { \__ior_open_aux:NnTF #1 } }
-\cs_generate_variant:Nn \ior_open:NnT  { c }
-\cs_generate_variant:Nn \ior_open:NnF  { c }
-\cs_generate_variant:Nn \ior_open:NnTF { c }
-\cs_new_protected:Npn \__ior_open_aux:NnTF #1#2
   {
-    \file_add_path:nN {#2} \l__file_internal_name_tl
-    \quark_if_no_value:NTF \l__file_internal_name_tl
+    \file_get_full_name:nN {#2} \l__file_full_name_str
+    \str_if_empty:NTF \l__file_full_name_str
       { \prg_return_false: }
       {
-        \__ior_open:No #1 \l__file_internal_name_tl
+        \__ior_open:No #1 \l__file_full_name_str
         \prg_return_true:
       }
   }
+\cs_generate_variant:Nn \ior_open:NnT  { c }
+\cs_generate_variant:Nn \ior_open:NnF  { c }
+\cs_generate_variant:Nn \ior_open:NnTF { c }
 \exp_args:NNf \cs_new_protected:Npn \__ior_new:N
   { \exp_args:NNc \exp_after:wN \exp_stop_f: { newread } }
 \cs_new_protected:Npn \__ior_open:Nn #1#2
@@ -8641,9 +8705,11 @@
       }
   }
 \cs_generate_variant:Nn \ior_close:N { c }
-\cs_new_protected:Npn \ior_list_streams:
-  { \__ior_list_streams:Nn \g__ior_streams_prop { ior } }
-\cs_new_protected:Npn \__ior_list_streams:Nn #1#2
+\cs_new_protected:Npn \ior_show_list:
+  { \__ior_list:Nn \g__ior_streams_prop { ior } }
+\cs_new_protected:Npn \ior_log_list:
+  { \__msg_log_next: \ior_show_list: }
+\cs_new_protected:Npn \__ior_list:Nn #1#2
   {
     \__msg_show_pre:nnxxxx { LaTeX / kernel } { show-streams }
       {#2} { \prop_if_empty:NF #1 { ? } } { } { }
@@ -8743,20 +8809,18 @@
 \exp_args:NNf \cs_new_protected:Npn \__iow_new:N
   { \exp_args:NNc \exp_after:wN \exp_stop_f: { newwrite } }
 \cs_new_protected:Npn \iow_open:Nn #1#2
-  { \__file_name_sanitize:nn {#2} { \__iow_open:Nn #1 } }
-\cs_generate_variant:Nn \iow_open:Nn { c }
-\cs_new_protected:Npn \__iow_open:Nn #1#2
   {
+    \__file_name_sanitize:nN {#2} \l__file_base_name_str
     \iow_close:N #1
     \seq_gpop:NNTF \g__iow_streams_seq \l__iow_stream_tl
-      { \__iow_open_stream:Nn #1 {#2} }
+      { \__iow_open_stream:NV #1 \l__file_base_name_str }
       {
         \__iow_new:N #1
         \tl_set:Nx \l__iow_stream_tl { \int_eval:n {#1} }
-        \__iow_open_stream:Nn #1 {#2}
+        \__iow_open_stream:NV #1 \l__file_base_name_str
       }
   }
-\cs_generate_variant:Nn \__iow_open:Nn { No }
+\cs_generate_variant:Nn \iow_open:Nn { c }
 \cs_new_protected:Npn \__iow_open_stream:Nn #1#2
   {
     \tex_global:D \tex_chardef:D #1 = \l__iow_stream_tl \scan_stop:
@@ -8763,6 +8827,7 @@
     \prop_gput:NVn \g__iow_streams_prop #1 {#2}
     \tex_immediate:D \tex_openout:D #1 #2 \scan_stop:
   }
+\cs_generate_variant:Nn \__iow_open_stream:Nn { NV }
 \cs_new_protected:Npn \iow_close:N #1
   {
     \int_compare:nT { - \c_log_iow < #1 < \c_term_iow }
@@ -8775,9 +8840,11 @@
       }
   }
 \cs_generate_variant:Nn \iow_close:N { c }
-\cs_new_protected:Npn \iow_list_streams:
-  { \__iow_list_streams:Nn \g__iow_streams_prop { iow } }
-\cs_new_eq:NN \__iow_list_streams:Nn \__ior_list_streams:Nn
+\cs_new_protected:Npn \iow_show_list:
+  { \__iow_list:Nn \g__iow_streams_prop { iow } }
+\cs_new_protected:Npn \iow_log_list:
+  { \__msg_log_next: \iow_show_list: }
+\cs_new_eq:NN \__iow_list:Nn \__ior_list:Nn
 \cs_new_protected:Npn \iow_shipout_x:Nn #1#2
   { \tex_write:D #1 {#2} }
 \cs_generate_variant:Nn \iow_shipout_x:Nn { c, Nx, cx }
@@ -9118,6 +9185,43 @@
     which~will~be~wrapped~using~#1.~
     It~was~called~with~argument~'#3'.
   }
+\tl_new:N \g_file_current_name_tl
+\tl_gset:Nn \g_file_current_name_tl { \g_file_curr_name_str }
+\cs_new_protected:Npn \file_path_include:n #1
+  {
+    \__msg_kernel_warning:nnxxx { kernel } { deprecated-command }
+      { 2018-12-31 }
+      { \token_to_str:N \file_path_include:n }
+      {
+        \token_to_str:N \seq_put_right:Nn \c_space_tl
+        \token_to_str:N \l_file_search_path_seq
+      }
+    \__file_name_sanitize:nN {#1} \l__file_full_name_str
+    \seq_if_in:NVF \l_file_search_path_seq \l__file_full_name_str
+      { \seq_put_right:NV \l_file_search_path_seq \l__file_full_name_str }
+  }
+\cs_new_protected:Npn \file_path_remove:n #1
+  {
+    \__msg_kernel_warning:nnxxx { kernel } { deprecated-command }
+      { 2018-12-31 }
+      { \token_to_str:N \file_path_remove:n }
+      {
+        \token_to_str:N \seq_remove_all:Nn \c_space_tl
+        \token_to_str:N \l_file_search_path_seq
+      }
+    \__file_name_sanitize:nN {#1} \l__file_full_name_str
+    \seq_remove_all:NV \l_file_search_path_seq \l__file_full_name_str
+  }
+\cs_new_protected:Npn \file_add_path:nN #1#2
+  {
+    \__msg_kernel_warning:nnxxx { kernel } { deprecated-command }
+      { 2018-12-31 }
+      { \token_to_str:N \file_add_path:nN }
+      { \token_to_str:N \file_get_full_name:nN }
+    \file_get_full_name:nN {#1} #2
+    \str_if_empty:NT #2
+      { \tl_set:Nn #2 { \q_no_value } }
+  }
 \cs_new_protected:Npn \ior_get_str:NN
   {
     \__msg_kernel_warning:nnxxx { kernel } { deprecated-command }
@@ -9127,6 +9231,51 @@
     \cs_gset_eq:NN \ior_get_str:NN \ior_str_get:NN
     \ior_str_get:NN
   }
+\cs_new_protected:Npn \file_list:
+  {
+    \__msg_kernel_warning:nnxxx { kernel } { deprecated-command }
+      { 2018-12-31 }
+      { \token_to_str:N \file_list: }
+      { \token_to_str:N \file_log_list: }
+    \cs_gset_eq:NN \file_list: \file_log_list:
+    \file_log_list:
+  }
+\cs_new_protected:Npn \ior_list_streams:
+  {
+    \__msg_kernel_warning:nnxxx { kernel } { deprecated-command }
+      { 2018-12-31 }
+      { \token_to_str:N \ior_list_streams: }
+      { \token_to_str:N \ior_show_list: }
+    \cs_gset_eq:NN \ior_list_streams: \ior_show_list:
+    \ior_show_list:
+  }
+\cs_new_protected:Npn \ior_log_streams:
+  {
+    \__msg_kernel_warning:nnxxx { kernel } { deprecated-command }
+      { 2018-12-31 }
+      { \token_to_str:N \ior_log_streams: }
+      { \token_to_str:N \ior_log_list: }
+    \cs_gset_eq:NN \ior_log_streams: \ior_log_list:
+    \ior_log_list:
+  }
+\cs_new_protected:Npn \iow_list_streams:
+  {
+    \__msg_kernel_warning:nnxxx { kernel } { deprecated-command }
+      { 2018-12-31 }
+      { \token_to_str:N \iow_list_streams: }
+      { \token_to_str:N \iow_show_list: }
+    \cs_gset_eq:NN \iow_list_streams: \iow_show_list:
+    \iow_show_list:
+  }
+\cs_new_protected:Npn \iow_log_streams:
+  {
+    \__msg_kernel_warning:nnxxx { kernel } { deprecated-command }
+      { 2018-12-31 }
+      { \token_to_str:N \iow_log_streams: }
+      { \token_to_str:N \iow_log_list: }
+    \cs_gset_eq:NN \iow_log_streams: \iow_log_list:
+    \iow_log_list:
+  }
 %% File: l3skip.dtx Copyright (C) 2004-2011 Frank Mittelbach, The LaTeX3 Project
 %%                            (C) 2012-2017 The LaTeX3 Project
 \cs_new_eq:NN \if_dim:w      \tex_ifdim:D
@@ -9213,7 +9362,7 @@
 \cs_new:Npn \dim_ratio:nn #1#2
   { \__dim_ratio:n {#1} / \__dim_ratio:n {#2} }
 \cs_new:Npn \__dim_ratio:n #1
-  { \__int_value:w \__dim_eval:w #1 \__dim_eval_end: }
+  { \__int_value:w \__dim_eval:w (#1) \__dim_eval_end: }
 \prg_new_conditional:Npnn \dim_compare:nNn #1#2#3 { p , T , F , TF }
   {
     \if_dim:w \__dim_eval:w #1 #2 \__dim_eval:w #3 \__dim_eval_end:
@@ -9873,12 +10022,14 @@
           }
       }
   }
-\cs_new_protected:Npn \__keys_cmd_set:nn #1#2
+\__debug_patch:nnNw
   {
     \cs_if_exist:cF { \c__keys_code_root_tl #1 }
-      { \__chk_log:x { Defining~key~#1~\msg_line_context: } }
-    \cs_set_protected:cpn { \c__keys_code_root_tl #1 } ##1 {#2}
+      { \__debug_log:x { Defining~key~#1~\msg_line_context: } }
   }
+  { }
+\cs_new_protected:Npn \__keys_cmd_set:nn #1#2
+  { \cs_set_protected:cpn { \c__keys_code_root_tl #1 } ##1 {#2} }
 \cs_generate_variant:Nn \__keys_cmd_set:nn { nx , Vn , Vo }
 \cs_new_protected:Npn \__keys_default_set:n #1
   {
@@ -9903,7 +10054,7 @@
           \tex_undefined:D
       }
       {
-        \clist_set_eq:cN { \c__keys_groups_root_tl \l_keys_path_tl }
+        \cs_set_eq:cN { \c__keys_groups_root_tl \l_keys_path_tl }
           \l__keys_groups_clist
       }
   }
@@ -16159,7 +16310,7 @@
 \cs_new_protected:Npn \__sort_return_mark:N #1 { }
 \cs_new_protected:Npn \__sort_return_none_error:
   {
-    \__msg_kernel_error:nnxx { sort } { return-none }
+    \__msg_kernel_error:nnxx { kernel } { return-none }
       { \tex_the:D \tex_toks:D \l__sort_A_int }
       { \tex_the:D \tex_toks:D \l__sort_C_int }
     \__sort_return_same:
@@ -16166,7 +16317,7 @@
   }
 \cs_new_protected:Npn \__sort_return_two_error:w
     #1 \__sort_return_none_error:
-  { \__msg_kernel_error:nn { sort } { return-two } }
+  { \__msg_kernel_error:nn { kernel } { return-two } }
 \cs_new_protected:Npn \__sort_return_same:
   {
     \tex_toks:D \l__sort_B_int \tex_toks:D \l__sort_C_int
@@ -16288,12 +16439,12 @@
   { \cs_set_eq:NN \toksdef \__sort_disabled_toksdef:n }
 \cs_new_protected:Npn \__sort_disabled_toksdef:n #1
   {
-    \__msg_kernel_error:nnx { sort } { toksdef }
+    \__msg_kernel_error:nnx { kernel } { toksdef }
       { \token_to_str:N #1 }
     \__sort_error:
     \tex_toksdef:D #1
   }
-\__msg_kernel_new:nnnn { sort } { toksdef }
+\__msg_kernel_new:nnnn { kernel } { toksdef }
   { Allocation~of~\iow_char:N\\toks~registers~impossible~while~sorting. }
   {
     The~comparison~code~used~for~sorting~a~list~has~attempted~to~
@@ -16303,13 +16454,13 @@
 \cs_new_protected:Npn \__sort_too_long_error:NNw #1#2 \fi:
   {
     \fi:
-    \__msg_kernel_error:nnxxx { sort } { too-large }
+    \__msg_kernel_error:nnxxx { kernel } { too-large }
       { \token_to_str:N #2 }
       { \int_eval:n { \l__sort_true_max_int - \l__sort_min_int } }
       { \int_eval:n { \l__sort_top_int - \l__sort_min_int } }
     #1 \__sort_error:
   }
-\__msg_kernel_new:nnnn { sort } { too-large }
+\__msg_kernel_new:nnnn { kernel } { too-large }
   { The~list~#1~is~too~long~to~be~sorted~by~TeX. }
   {
     TeX~has~#2~toks~registers~still~available:~
@@ -16316,7 +16467,7 @@
     this~only~allows~to~sort~with~up~to~#3~
     items.~All~extra~items~will~be~deleted.
   }
-\__msg_kernel_new:nnnn { sort } { return-none }
+\__msg_kernel_new:nnnn { kernel } { return-none }
   { The~comparison~code~did~not~return. }
   {
     When~sorting~a~list,~the~code~to~compare~items~#1~and~#2~
@@ -16325,7 +16476,7 @@
     \iow_char:N\\sort_return_swapped: .~
     Exactly~one~of~these~should~be~called.
   }
-\__msg_kernel_new:nnnn { sort } { return-two }
+\__msg_kernel_new:nnnn { kernel } { return-two }
   { The~comparison~code~returned~multiple~times. }
   {
     When~sorting~a~list,~the~code~to~compare~items~called~
@@ -16870,10 +17021,10 @@
   }
 \cs_new_protected:Npn \__regex_toks_put_right:Nn #1#2
   { \tex_toks:D #1 \exp_after:wN { \tex_the:D \tex_toks:D #1 #2 } }
-\cs_new:Npn \__regex_current_cs_to_str:
+\cs_new:Npn \__regex_curr_cs_to_str:
   {
     \exp_after:wN \exp_after:wN \exp_after:wN \cs_to_str:N
-    \tex_the:D \tex_toks:D \l__regex_current_pos_int
+    \tex_the:D \tex_toks:D \l__regex_curr_pos_int
   }
 \cs_new:Npn \__regex_tmp:w { }
 \tl_new:N   \l__regex_internal_a_tl
@@ -16908,14 +17059,14 @@
   }
 \cs_new_protected:Npn \__regex_item_caseful_equal:n #1
   {
-    \if_int_compare:w #1 = \l__regex_current_char_int
+    \if_int_compare:w #1 = \l__regex_curr_char_int
       \exp_after:wN \__regex_break_true:w
     \fi:
   }
 \cs_new_protected:Npn \__regex_item_caseful_range:nn #1 #2
   {
-    \reverse_if:N \if_int_compare:w #1 > \l__regex_current_char_int
-      \reverse_if:N \if_int_compare:w #2 < \l__regex_current_char_int
+    \reverse_if:N \if_int_compare:w #1 > \l__regex_curr_char_int
+      \reverse_if:N \if_int_compare:w #2 < \l__regex_curr_char_int
         \exp_after:wN \exp_after:wN \exp_after:wN \__regex_break_true:w
       \fi:
     \fi:
@@ -16922,7 +17073,7 @@
   }
 \cs_new_protected:Npn \__regex_item_caseless_equal:n #1
   {
-    \if_int_compare:w #1 = \l__regex_current_char_int
+    \if_int_compare:w #1 = \l__regex_curr_char_int
       \exp_after:wN \__regex_break_true:w
     \fi:
     \if_int_compare:w \l__regex_case_changed_char_int = \c_max_int
@@ -16934,8 +17085,8 @@
   }
 \cs_new_protected:Npn \__regex_item_caseless_range:nn #1 #2
   {
-    \reverse_if:N \if_int_compare:w #1 > \l__regex_current_char_int
-      \reverse_if:N \if_int_compare:w #2 < \l__regex_current_char_int
+    \reverse_if:N \if_int_compare:w #1 > \l__regex_curr_char_int
+      \reverse_if:N \if_int_compare:w #2 < \l__regex_curr_char_int
         \exp_after:wN \exp_after:wN \exp_after:wN \__regex_break_true:w
       \fi:
     \fi:
@@ -16950,15 +17101,15 @@
   }
 \cs_new_protected:Npn \__regex_compute_case_changed_char:
   {
-    \int_set_eq:NN \l__regex_case_changed_char_int \l__regex_current_char_int
-    \if_int_compare:w \l__regex_current_char_int > `Z \exp_stop_f:
-      \if_int_compare:w \l__regex_current_char_int > `z \exp_stop_f: \else:
-        \if_int_compare:w \l__regex_current_char_int < `a \exp_stop_f: \else:
+    \int_set_eq:NN \l__regex_case_changed_char_int \l__regex_curr_char_int
+    \if_int_compare:w \l__regex_curr_char_int > `Z \exp_stop_f:
+      \if_int_compare:w \l__regex_curr_char_int > `z \exp_stop_f: \else:
+        \if_int_compare:w \l__regex_curr_char_int < `a \exp_stop_f: \else:
           \int_sub:Nn \l__regex_case_changed_char_int { \c__regex_ascii_lower_int }
         \fi:
       \fi:
     \else:
-      \if_int_compare:w \l__regex_current_char_int < `A \exp_stop_f: \else:
+      \if_int_compare:w \l__regex_curr_char_int < `A \exp_stop_f: \else:
         \int_add:Nn \l__regex_case_changed_char_int { \c__regex_ascii_lower_int }
       \fi:
     \fi:
@@ -16968,7 +17119,7 @@
 \cs_new_protected:Npn \__regex_item_catcode:
   {
     "
-    \if_case:w \l__regex_current_catcode_int
+    \if_case:w \l__regex_curr_catcode_int
          1       \or: 4       \or: 10      \or: 40
     \or: 100     \or:         \or: 1000    \or: 4000
     \or: 10000   \or:         \or: 100000  \or: 400000
@@ -16987,8 +17138,8 @@
   { \__regex_item_catcode:nT {#1} { \__regex_item_reverse:n {#2} } }
 \cs_new_protected:Npn \__regex_item_exact:nn #1#2
   {
-    \if_int_compare:w #1 = \l__regex_current_catcode_int
-      \if_int_compare:w #2 = \l__regex_current_char_int
+    \if_int_compare:w #1 = \l__regex_curr_catcode_int
+      \if_int_compare:w #2 = \l__regex_curr_char_int
         \exp_after:wN \exp_after:wN \exp_after:wN \__regex_break_true:w
       \fi:
     \fi:
@@ -16995,10 +17146,10 @@
   }
 \cs_new_protected:Npn \__regex_item_exact_cs:n #1
   {
-    \int_compare:nNnTF \l__regex_current_catcode_int = 0
+    \int_compare:nNnTF \l__regex_curr_catcode_int = 0
       {
         \tl_set:Nx \l__regex_internal_a_tl
-          { \scan_stop: \__regex_current_cs_to_str: \scan_stop: }
+          { \scan_stop: \__regex_curr_cs_to_str: \scan_stop: }
         \tl_if_in:noTF { \scan_stop: #1 \scan_stop: } \l__regex_internal_a_tl
           { \__regex_break_true:w } { }
       }
@@ -17006,10 +17157,10 @@
   }
 \cs_new_protected:Npn \__regex_item_cs:n #1
   {
-    \int_compare:nNnT \l__regex_current_catcode_int = 0
+    \int_compare:nNnT \l__regex_curr_catcode_int = 0
       {
         \group_begin:
-          \tl_set:Nx \l__regex_cs_name_tl { \__regex_current_cs_to_str: }
+          \tl_set:Nx \l__regex_cs_name_tl { \__regex_curr_cs_to_str: }
           \__regex_single_match:
           \__regex_disable_submatches:
           \__regex_build_for_cs:n {#1}
@@ -17134,7 +17285,7 @@
 \cs_new:cpn { __regex_escape_/break:w }
   {
     \if_false: { \fi: }
-    \__msg_kernel_error:nn { regex } { trailing-backslash }
+    \__msg_kernel_error:nn { kernel } { trailing-backslash }
     \exp_after:wN \use_none:n \exp_after:wN { \if_false: } \fi:
   }
 \cs_new:cpn { __regex_escape_~:w } { }
@@ -17161,7 +17312,7 @@
       {
         \if_false: { \fi: }
         \__tl_build_one:o \l__regex_internal_b_tl
-        \__msg_kernel_error:nnx { regex } { x-overflow } {#1}
+        \__msg_kernel_error:nnx { kernel } { x-overflow } {#1}
         \tl_set:Nx \l__regex_internal_b_tl
           { \if_false: } \fi:
       }
@@ -17225,7 +17376,7 @@
   {
     \if_false: { \fi: }
     \__tl_build_one:o \l__regex_internal_b_tl
-    \__msg_kernel_error:nnx { regex } { x-missing-rbrace } {#1}
+    \__msg_kernel_error:nnx { kernel } { x-missing-rbrace } {#1}
     \tl_set:Nx \l__regex_internal_b_tl
       { \if_false: } \fi: \__regex_escape_loop:N #1
   }
@@ -17390,7 +17541,7 @@
       \if_int_compare:w \l__regex_mode_int = \c__regex_class_mode_int
         \exp_after:wN \exp_after:wN \exp_after:wN \use:n
       \else:
-        \__msg_kernel_error:nn { regex } { c-bad-mode }
+        \__msg_kernel_error:nn { kernel } { c-bad-mode }
         \exp_after:wN \exp_after:wN \exp_after:wN \use_none:n
       \fi:
     \fi:
@@ -17419,13 +17570,13 @@
   {
       \__regex_if_in_class:TF
         {
-          \__msg_kernel_error:nn { regex } { missing-rbrack }
+          \__msg_kernel_error:nn { kernel } { missing-rbrack }
           \use:c { __regex_compile_]: }
           \prg_do_nothing: \prg_do_nothing:
         }
         { }
       \if_int_compare:w \l__regex_group_level_int > 0 \exp_stop_f:
-        \__msg_kernel_error:nnx { regex } { missing-rparen }
+        \__msg_kernel_error:nnx { kernel } { missing-rparen }
           { \int_use:N \l__regex_group_level_int }
         \prg_replicate:nn
           { \l__regex_group_level_int }
@@ -17461,10 +17612,10 @@
       \prg_do_nothing: \prg_do_nothing:
       \prg_do_nothing: \prg_do_nothing:
       \int_compare:nNnT \l__regex_mode_int = \c__regex_catcode_mode_int
-        { \__msg_kernel_error:nn { regex } { c-trailing } }
+        { \__msg_kernel_error:nn { kernel } { c-trailing } }
       \int_compare:nNnT \l__regex_mode_int < \c__regex_outer_mode_int
         {
-          \__msg_kernel_error:nn { regex } { c-missing-rbrace }
+          \__msg_kernel_error:nn { kernel } { c-missing-rbrace }
           \__regex_compile_end_cs:
           \prg_do_nothing: \prg_do_nothing:
           \prg_do_nothing: \prg_do_nothing:
@@ -17524,7 +17675,7 @@
 \cs_new_protected:Npn \__regex_compile_quantifier_abort:xNN #1#2#3
   {
     \__regex_compile_quantifier_none:
-    \__msg_kernel_warning:nnxx { regex } { invalid-quantifier } {#1} {#3}
+    \__msg_kernel_warning:nnxx { kernel } { invalid-quantifier } {#1} {#3}
     \__regex_compile_abort_tokens:x {#1}
     #2 #3
   }
@@ -17591,7 +17742,7 @@
       { #1 #2 } { \__regex_compile_special:N \c_right_brace_str }
       {
         \if_int_compare:w \l__regex_internal_a_int > \l__regex_internal_b_int
-          \__msg_kernel_error:nnxx { regex } { backwards-quantifier }
+          \__msg_kernel_error:nnxx { kernel } { backwards-quantifier }
             { \int_use:N \l__regex_internal_a_int }
             { \int_use:N \l__regex_internal_b_int }
           \int_zero:N \l__regex_internal_b_int
@@ -17614,7 +17765,7 @@
   }
 \cs_new_protected:Npn \__regex_compile_raw_error:N #1
   {
-    \__msg_kernel_error:nnx { regex } { bad-escape } {#1}
+    \__msg_kernel_error:nnx { kernel } { bad-escape } {#1}
     \__regex_compile_raw:N #1
   }
 \cs_new_protected:Npn \__regex_compile_raw:N #1#2#3
@@ -17656,7 +17807,7 @@
     \__regex_if_end_range:NNTF #2 #3
       {
         \if_int_compare:w `#1 > `#3 \exp_stop_f:
-          \__msg_kernel_error:nnxx { regex } { range-backwards } {#1} {#3}
+          \__msg_kernel_error:nnxx { kernel } { range-backwards } {#1} {#3}
         \else:
           \__tl_build_one:x
             {
@@ -17670,7 +17821,7 @@
         \fi:
       }
       {
-        \__msg_kernel_warning:nnxx { regex } { range-missing-end }
+        \__msg_kernel_warning:nnxx { kernel } { range-missing-end }
           {#1} { \c_backslash_str #3 }
         \__tl_build_one:x
           {
@@ -17688,7 +17839,7 @@
   }
 \cs_new_protected:cpn { __regex_prop_.: }
   {
-    \if_int_compare:w \l__regex_current_char_int > - 2 \exp_stop_f:
+    \if_int_compare:w \l__regex_curr_char_int > - 2 \exp_stop_f:
       \exp_after:wN \__regex_break_true:w
     \fi:
   }
@@ -17822,8 +17973,8 @@
         \str_case:nn { #2 }
           {
             : { \__regex_compile_class_posix:NNNNw }
-            = { \__msg_kernel_warning:nnx { regex } { posix-unsupported } { = } }
-            . { \__msg_kernel_warning:nnx { regex } { posix-unsupported } { . } }
+            = { \__msg_kernel_warning:nnx { kernel } { posix-unsupported } { = } }
+            . { \__msg_kernel_warning:nnx { kernel } { posix-unsupported } { . } }
           }
       }
     \__regex_compile_raw:N [ #1 #2
@@ -17862,7 +18013,7 @@
               }
           }
           {
-            \__msg_kernel_warning:nnx { regex } { posix-unknown }
+            \__msg_kernel_warning:nnx { kernel } { posix-unknown }
               { \l__regex_internal_a_tl }
             \__regex_compile_abort_tokens:x
               {
@@ -17872,7 +18023,7 @@
           }
       }
       {
-        \__msg_kernel_error:nnxx { regex } { posix-missing-close }
+        \__msg_kernel_error:nnxx { kernel } { posix-missing-close }
           { [: \l__regex_internal_a_tl } { #2 #4 }
         \__regex_compile_abort_tokens:x { [: \l__regex_internal_a_tl }
         #1 #2 #3 #4
@@ -17896,7 +18047,7 @@
       \__tl_build_one:o \l__regex_internal_regex
       \exp_after:wN \__regex_compile_quantifier:w
     \else:
-      \__msg_kernel_warning:nn { regex } { extra-rparen }
+      \__msg_kernel_warning:nn { kernel } { extra-rparen }
       \exp_after:wN \__regex_compile_raw:N \exp_after:wN )
     \fi:
   }
@@ -17912,7 +18063,7 @@
         \cs_if_exist_use:cF
           { __regex_compile_special_group_\token_to_str:N #4 :w }
           {
-            \__msg_kernel_warning:nnx { regex } { special-group-unknown }
+            \__msg_kernel_warning:nnx { kernel } { special-group-unknown }
               { (? #4 }
             \__regex_compile_group_begin:N \__regex_group:nnnN
               \__regex_compile_raw:N ? #3 #4
@@ -17948,7 +18099,7 @@
         \cs_set:Npn \__regex_item_range:nn { \__regex_item_caseless_range:nn }
       }
       {
-        \__msg_kernel_warning:nnx { regex } { unknown-option } { (?i #2 }
+        \__msg_kernel_warning:nnx { kernel } { unknown-option } { (?i #2 }
         \__regex_compile_raw:N (
         \__regex_compile_raw:N ?
         \__regex_compile_raw:N i
@@ -17964,7 +18115,7 @@
         \cs_set:Npn \__regex_item_range:nn { \__regex_item_caseful_range:nn }
       }
       {
-        \__msg_kernel_warning:nnx { regex } { unknown-option } { (?-#2#4 }
+        \__msg_kernel_warning:nnx { kernel } { unknown-option } { (?-#2#4 }
         \__regex_compile_raw:N (
         \__regex_compile_raw:N ?
         \__regex_compile_raw:N -
@@ -17986,14 +18137,27 @@
                 \else:
                   \c__regex_catcode_in_class_mode_int
                 \fi:
+            \token_if_eq_charcode:NNT C #2 { \__regex_compile_c_C:NN }
           }
       }
       { \cs_if_exist_use:cF { __regex_compile_c_#2:w } }
           {
-            \__msg_kernel_error:nnx { regex } { c-missing-category } {#2}
+            \__msg_kernel_error:nnx { kernel } { c-missing-category } {#2}
             #1 #2
           }
   }
+\cs_new_protected:Npn \__regex_compile_c_C:NN #1#2
+  {
+    \token_if_eq_meaning:NNTF #1 \__regex_compile_special:N
+      {
+        \token_if_eq_charcode:NNTF #2 .
+          { \use_none:n }
+          { \token_if_eq_charcode:NNF #2 ( } % )
+      }
+      { \use:n }
+    { \__msg_kernel_error:nnn { kernel } { c-C-invalid } {#2} }
+    #1 #2
+  }
 \cs_new_protected:cpn { __regex_compile_c_[:w } #1#2
   {
     \l__regex_mode_int
@@ -18030,7 +18194,7 @@
           { \__regex_compile_c_lbrack_end: }
       }
           {
-            \__msg_kernel_error:nnx { regex } { c-missing-rbrack } {#2}
+            \__msg_kernel_error:nnx { kernel } { c-missing-rbrack } {#2}
             \__regex_compile_c_lbrack_end:
             #1 #2
           }
@@ -18132,7 +18296,7 @@
             \__regex_compile_u_loop:NN
           }
           {
-            \__msg_kernel_error:nn { regex } { u-missing-lbrace }
+            \__msg_kernel_error:nn { kernel } { u-missing-lbrace }
             \__regex_compile_raw:N u #1 #2
           }
       }
@@ -18150,7 +18314,7 @@
           }
           {
             \if_false: { \fi: }
-            \__msg_kernel_error:nnx { regex } { u-missing-rbrace } {#2}
+            \__msg_kernel_error:nnx { kernel } { u-missing-rbrace } {#2}
             \__regex_compile_u_end:
             #1 #2
           }
@@ -18395,7 +18559,7 @@
     \__regex_pop_lr_states:
     \__regex_toks_put_right:Nn \l__regex_right_state_int
       {
-        \if_int_compare:w \l__regex_current_pos_int = \l__regex_max_pos_int
+        \if_int_compare:w \l__regex_curr_pos_int = \l__regex_max_pos_int
           \exp_after:wN \__regex_action_success:
         \fi:
       }
@@ -18676,7 +18840,7 @@
   }
 \cs_new_protected:Npn \__regex_anchor:N #1
   {
-    \if_int_compare:w #1 = \l__regex_current_pos_int
+    \if_int_compare:w #1 = \l__regex_curr_pos_int
       \exp_after:wN \__regex_break_true:w
     \fi:
   }
@@ -18683,7 +18847,7 @@
 \cs_new_protected:Npn \__regex_b_test:
   {
     \group_begin:
-      \int_set_eq:NN \l__regex_current_char_int \l__regex_last_char_int
+      \int_set_eq:NN \l__regex_curr_char_int \l__regex_last_char_int
       \__regex_prop_w:
       \__regex_break_point:TF
         { \group_end: \__regex_item_reverse:n \__regex_prop_w: }
@@ -18703,15 +18867,15 @@
   }
 \int_new:N \l__regex_min_pos_int
 \int_new:N \l__regex_max_pos_int
-\int_new:N \l__regex_current_pos_int
+\int_new:N \l__regex_curr_pos_int
 \int_new:N \l__regex_start_pos_int
 \int_new:N \l__regex_success_pos_int
-\int_new:N \l__regex_current_char_int
-\int_new:N \l__regex_current_catcode_int
+\int_new:N \l__regex_curr_char_int
+\int_new:N \l__regex_curr_catcode_int
 \int_new:N \l__regex_last_char_int
 \int_new:N \l__regex_case_changed_char_int
-\int_new:N \l__regex_current_state_int
-\prop_new:N \l__regex_current_submatches_prop
+\int_new:N \l__regex_curr_state_int
+\prop_new:N \l__regex_curr_submatches_prop
 \prop_new:N \l__regex_success_submatches_prop
 \int_new:N \l__regex_step_int
 \int_new:N \l__regex_min_active_int
@@ -18728,12 +18892,12 @@
 \cs_new_protected:Npn \__regex_match:n #1
   {
     \int_zero:N \l__regex_balance_int
-    \int_set:Nn \l__regex_current_pos_int { 2 * \l__regex_max_state_int }
+    \int_set:Nn \l__regex_curr_pos_int { 2 * \l__regex_max_state_int }
     \__regex_query_set:nnn { } { -1 } { -2 }
-    \int_set_eq:NN \l__regex_min_pos_int \l__regex_current_pos_int
+    \int_set_eq:NN \l__regex_min_pos_int \l__regex_curr_pos_int
     \__tl_analysis_map_inline:nn {#1}
       { \__regex_query_set:nnn {##1} {"##2} {##3} }
-    \int_set_eq:NN \l__regex_max_pos_int \l__regex_current_pos_int
+    \int_set_eq:NN \l__regex_max_pos_int \l__regex_curr_pos_int
     \__regex_query_set:nnn { } { -1 } { -2 }
     \bool_gset_false:N \g__regex_success_bool
     \int_step_inline:nnnn
@@ -18752,16 +18916,16 @@
   {
     \if_meaning:w \c_true_bool \l__regex_empty_success_bool
       \cs_set:Npn \__regex_if_two_empty_matches:F
-        { \int_compare:nNnF \l__regex_start_pos_int = \l__regex_current_pos_int }
+        { \int_compare:nNnF \l__regex_start_pos_int = \l__regex_curr_pos_int }
     \else:
       \cs_set_eq:NN \__regex_if_two_empty_matches:F \use:n
     \fi:
     \int_set_eq:NN \l__regex_start_pos_int \l__regex_success_pos_int
     \bool_set_false:N \l__regex_match_success_bool
-    \prop_clear:N \l__regex_current_submatches_prop
+    \prop_clear:N \l__regex_curr_submatches_prop
     \int_set_eq:NN \l__regex_max_active_int \l__regex_min_active_int
     \__regex_store_state:n { \l__regex_min_state_int }
-    \int_set:Nn \l__regex_current_pos_int
+    \int_set:Nn \l__regex_curr_pos_int
       { \l__regex_start_pos_int - 1 }
     \__regex_query_get:
     \__regex_match_loop:
@@ -18786,8 +18950,8 @@
 \cs_new_protected:Npn \__regex_match_loop:
   {
     \int_add:Nn \l__regex_step_int { 2 }
-    \int_incr:N \l__regex_current_pos_int
-    \int_set_eq:NN \l__regex_last_char_int \l__regex_current_char_int
+    \int_incr:N \l__regex_curr_pos_int
+    \int_set_eq:NN \l__regex_last_char_int \l__regex_curr_char_int
     \int_set_eq:NN \l__regex_case_changed_char_int \c_max_int
     \__regex_query_get:
     \use:x
@@ -18802,7 +18966,7 @@
     \__prg_break_point:
     \bool_set_false:N \l__regex_fresh_thread_bool %^^A was arg of break_point:n
     \if_int_compare:w \l__regex_max_active_int > \l__regex_min_active_int
-      \if_int_compare:w \l__regex_current_pos_int < \l__regex_max_pos_int
+      \if_int_compare:w \l__regex_curr_pos_int < \l__regex_max_pos_int
         \exp_after:wN \exp_after:wN \exp_after:wN \__regex_match_loop:
       \fi:
     \fi:
@@ -18816,13 +18980,13 @@
 \cs_new_protected:Npn \__regex_query_set:nnn #1#2#3
   {
     \__intarray_gset_fast:Nnn \g__regex_charcode_intarray
-      { \l__regex_current_pos_int } {#3}
+      { \l__regex_curr_pos_int } {#3}
     \__intarray_gset_fast:Nnn \g__regex_catcode_intarray
-      { \l__regex_current_pos_int } {#2}
+      { \l__regex_curr_pos_int } {#2}
     \__intarray_gset_fast:Nnn \g__regex_balance_intarray
-      { \l__regex_current_pos_int } { \l__regex_balance_int }
-    \__regex_toks_set:Nn \l__regex_current_pos_int {#1}
-    \int_incr:N \l__regex_current_pos_int
+      { \l__regex_curr_pos_int } { \l__regex_balance_int }
+    \__regex_toks_set:Nn \l__regex_curr_pos_int {#1}
+    \int_incr:N \l__regex_curr_pos_int
     \if_case:w #2 \exp_stop_f:
     \or: \int_incr:N \l__regex_balance_int
     \or: \int_decr:N \l__regex_balance_int
@@ -18830,29 +18994,29 @@
   }
 \cs_new_protected:Npn \__regex_query_get:
   {
-    \l__regex_current_char_int
+    \l__regex_curr_char_int
       = \__intarray_item_fast:Nn \g__regex_charcode_intarray
-          { \l__regex_current_pos_int } \scan_stop:
-    \l__regex_current_catcode_int
+          { \l__regex_curr_pos_int } \scan_stop:
+    \l__regex_curr_catcode_int
       = \__intarray_item_fast:Nn \g__regex_catcode_intarray
-          { \l__regex_current_pos_int } \scan_stop:
+          { \l__regex_curr_pos_int } \scan_stop:
   }
 \cs_new_protected:Npn \__regex_use_state:
   {
     \__intarray_gset_fast:Nnn \g__regex_state_active_intarray
-      { \l__regex_current_state_int } { \l__regex_step_int }
-    \__regex_toks_use:w \l__regex_current_state_int
+      { \l__regex_curr_state_int } { \l__regex_step_int }
+    \__regex_toks_use:w \l__regex_curr_state_int
     \__intarray_gset_fast:Nnn \g__regex_state_active_intarray
-      { \l__regex_current_state_int } { \l__regex_step_int + 1 }
+      { \l__regex_curr_state_int } { \l__regex_step_int + 1 }
   }
 \cs_new_protected:Npn \__regex_use_state_and_submatches:nn #1 #2
   {
-    \int_set:Nn \l__regex_current_state_int {#1}
+    \int_set:Nn \l__regex_curr_state_int {#1}
     \if_int_compare:w
         \__intarray_item_fast:Nn \g__regex_state_active_intarray
-          { \l__regex_current_state_int }
+          { \l__regex_curr_state_int }
                       < \l__regex_step_int
-      \tl_set:Nn \l__regex_current_submatches_prop {#2}
+      \tl_set:Nn \l__regex_curr_submatches_prop {#2}
       \exp_after:wN \__regex_use_state:
     \fi:
     \scan_stop:
@@ -18872,26 +19036,26 @@
   {
     \use:x
       {
-        \int_add:Nn \l__regex_current_state_int {#2}
+        \int_add:Nn \l__regex_curr_state_int {#2}
         \exp_not:n
           {
             \if_int_compare:w
                 \__intarray_item_fast:Nn \g__regex_state_active_intarray
-                  { \l__regex_current_state_int }
+                  { \l__regex_curr_state_int }
                 #1
               \exp_after:wN \__regex_use_state:
             \fi:
           }
-        \int_set:Nn \l__regex_current_state_int
-          { \int_use:N \l__regex_current_state_int }
-        \tl_set:Nn \exp_not:N \l__regex_current_submatches_prop
-          { \exp_not:o \l__regex_current_submatches_prop }
+        \int_set:Nn \l__regex_curr_state_int
+          { \int_use:N \l__regex_curr_state_int }
+        \tl_set:Nn \exp_not:N \l__regex_curr_submatches_prop
+          { \exp_not:o \l__regex_curr_submatches_prop }
       }
   }
 \cs_new_protected:Npn \__regex_action_cost:n #1
   {
     \exp_args:No \__regex_store_state:n
-      { \__int_value:w \__int_eval:w \l__regex_current_state_int + #1 }
+      { \__int_value:w \__int_eval:w \l__regex_curr_state_int + #1 }
   }
 \cs_new_protected:Npn \__regex_store_state:n #1
   {
@@ -18903,7 +19067,7 @@
 \cs_new_protected:Npn \__regex_store_submatches:
   {
     \__regex_toks_set:No \l__regex_max_active_int
-      { \l__regex_current_submatches_prop }
+      { \l__regex_curr_submatches_prop }
   }
 \cs_new_protected:Npn \__regex_disable_submatches:
   {
@@ -18912,8 +19076,8 @@
   }
 \cs_new_protected:Npn \__regex_action_submatch:n #1
   {
-    \prop_put:Nno \l__regex_current_submatches_prop {#1}
-      { \int_use:N \l__regex_current_pos_int }
+    \prop_put:Nno \l__regex_curr_submatches_prop {#1}
+      { \int_use:N \l__regex_curr_pos_int }
   }
 \cs_new_protected:Npn \__regex_action_success:
   {
@@ -18922,9 +19086,9 @@
         \bool_set_true:N \l__regex_match_success_bool
         \bool_set_eq:NN \l__regex_empty_success_bool
           \l__regex_fresh_thread_bool
-        \int_set_eq:NN \l__regex_success_pos_int \l__regex_current_pos_int
+        \int_set_eq:NN \l__regex_success_pos_int \l__regex_curr_pos_int
         \prop_set_eq:NN \l__regex_success_submatches_prop
-          \l__regex_current_submatches_prop
+          \l__regex_curr_submatches_prop
         \__prg_break:
       }
   }
@@ -19003,7 +19167,7 @@
         {#1}
       \prg_do_nothing: \prg_do_nothing:
       \if_int_compare:w \l__regex_replacement_csnames_int > 0 \exp_stop_f:
-        \__msg_kernel_error:nnx { regex } { replacement-missing-rbrace }
+        \__msg_kernel_error:nnx { kernel } { replacement-missing-rbrace }
           { \int_use:N \l__regex_replacement_csnames_int }
         \__tl_build_one:x
           { \prg_replicate:nn \l__regex_replacement_csnames_int \cs_end: }
@@ -19010,7 +19174,7 @@
       \fi:
       \seq_if_empty:NF \l__regex_replacement_category_seq
         {
-          \__msg_kernel_error:nnx { regex } { replacement-missing-rparen }
+          \__msg_kernel_error:nnx { kernel } { replacement-missing-rparen }
             { \seq_count:N \l__regex_replacement_category_seq }
           \seq_clear:N \l__regex_replacement_category_seq
         }
@@ -19145,12 +19309,12 @@
 \cs_new_protected:Npn \__regex_replacement_cat:NNN #1#2#3
   {
     \token_if_eq_meaning:NNTF \prg_do_nothing: #3
-      { \__msg_kernel_error:nn { regex } { replacement-catcode-end } }
+      { \__msg_kernel_error:nn { kernel } { replacement-catcode-end } }
       {
         \int_compare:nNnTF { \l__regex_replacement_csnames_int } > 0
           {
             \__msg_kernel_error:nnnn
-              { regex } { replacement-catcode-in-cs } {#1} {#3}
+              { kernel } { replacement-catcode-in-cs } {#1} {#3}
             #2 #3
           }
           {
@@ -19160,7 +19324,19 @@
                   \l__regex_replacement_category_tl
                 \tl_set:Nn \l__regex_replacement_category_tl {#1}
               }
-              { \use:c { __regex_replacement_c_#1:w } #2 #3 }
+              {
+                \token_if_eq_meaning:NNT #2 \__regex_replacement_escaped:N
+                  {
+                    \__regex_char_if_alphanumeric:NTF #3
+                      {
+                        \__msg_kernel_error:nnnn
+                          { kernel } { replacement-catcode-escaped }
+                          {#1} {#3}
+                      }
+                      { }
+                  }
+                \use:c { __regex_replacement_c_#1:w } #2 #3
+              }
           }
       }
   }
@@ -19214,7 +19390,7 @@
   \cs_new_protected:Npn \__regex_replacement_c_S:w #1#2
     {
       \if_int_compare:w `#2 = 0 \exp_stop_f:
-        \__msg_kernel_error:nn { regex } { replacement-null-space }
+        \__msg_kernel_error:nn { kernel } { replacement-null-space }
       \fi:
       \tex_lccode:D `\ = `#2 \scan_stop:
       \tex_lowercase:D { \__tl_build_one:n {~} }
@@ -19228,7 +19404,7 @@
 \group_end:
 \cs_new_protected:Npn \__regex_replacement_error:NNN #1#2#3
   {
-    \__msg_kernel_error:nnx { regex } { replacement-#1 } {#3}
+    \__msg_kernel_error:nnx { kernel } { replacement-#1 } {#3}
     #2 #3
   }
 \cs_new_protected:Npn \regex_new:N #1
@@ -19399,7 +19575,7 @@
         { \flag_height:n { __regex_begin } + \flag_height:n { __regex_end } }
         = 0
         {
-          \__msg_kernel_error:nnxxx { regex } { result-unbalanced }
+          \__msg_kernel_error:nnxxx { kernel } { result-unbalanced }
             { splitting~or~extracting~submatches }
             { \flag_height:n { __regex_end } }
             { \flag_height:n { __regex_begin } }
@@ -19522,7 +19698,7 @@
   {
     \if_int_compare:w \l__regex_balance_int = 0 \exp_stop_f:
     \else:
-      \__msg_kernel_error:nnxxx { regex } { result-unbalanced }
+      \__msg_kernel_error:nnxxx { kernel } { result-unbalanced }
         { replacing }
         { \int_max:nn { - \l__regex_balance_int } { 0 } }
         { \int_max:nn { \l__regex_balance_int } { 0 } }
@@ -19544,13 +19720,13 @@
           }
       }
   }
-\__msg_kernel_new:nnnn { regex } { trailing-backslash }
+\__msg_kernel_new:nnnn { kernel } { trailing-backslash }
   { Trailing~escape~character~'\iow_char:N\\'. }
   {
     A~regular~expression~or~its~replacement~text~ends~with~
     the~escape~character~'\iow_char:N\\'.~It~will~be~ignored.
   }
-\__msg_kernel_new:nnnn { regex } { x-missing-rbrace }
+\__msg_kernel_new:nnnn { kernel } { x-missing-rbrace }
   { Missing~closing~brace~in~'\iow_char:N\\x'~hexadecimal~sequence. }
   {
     You~wrote~something~like~
@@ -19557,7 +19733,7 @@
     '\iow_char:N\\x\{...#1'.~
     The~closing~brace~is~missing.
   }
-\__msg_kernel_new:nnnn { regex } { x-overflow }
+\__msg_kernel_new:nnnn { kernel } { x-overflow }
   { Character~code~'#1'~too~large~in~'\iow_char:N\\x'~hexadecimal~sequence. }
   {
     You~wrote~something~like~
@@ -19565,7 +19741,7 @@
     The~character~code~#1~is~larger~than~
     the~maximum~value~\int_use:N \c_max_char_int.
   }
-\__msg_kernel_new:nnnn { regex } { invalid-quantifier }
+\__msg_kernel_new:nnnn { kernel } { invalid-quantifier }
   { Braced~quantifier~'#1'~may~not~be~followed~by~'#2'. }
   {
     The~character~'#2'~is~invalid~in~the~braced~quantifier~'#1'.~
@@ -19572,13 +19748,13 @@
     The~only~valid~quantifiers~are~'*',~'?',~'+',~'{<int>}',~
     '{<min>,}'~and~'{<min>,<max>}',~optionally~followed~by~'?'.
   }
-\__msg_kernel_new:nnnn { regex } { missing-rbrack }
+\__msg_kernel_new:nnnn { kernel } { missing-rbrack }
   { Missing~right~bracket~inserted~in~regular~expression. }
   {
     LaTeX~was~given~a~regular~expression~where~a~character~class~
     was~started~with~'[',~but~the~matching~']'~is~missing.
   }
-\__msg_kernel_new:nnnn { regex } { missing-rparen }
+\__msg_kernel_new:nnnn { kernel } { missing-rparen }
   {
     Missing~right~
     \int_compare:nTF { #1 = 1 } { parenthesis } { parentheses } ~
@@ -19588,13 +19764,13 @@
     LaTeX~was~given~a~regular~expression~with~\int_eval:n {#1} ~
     more~left~parentheses~than~right~parentheses.
   }
-\__msg_kernel_new:nnnn { regex } { extra-rparen }
+\__msg_kernel_new:nnnn { kernel } { extra-rparen }
   { Extra~right~parenthesis~ignored~in~regular~expression. }
   {
     LaTeX~came~across~a~closing~parenthesis~when~no~submatch~group~
     was~open.~The~parenthesis~will~be~ignored.
   }
-\__msg_kernel_new:nnnn { regex } { bad-escape }
+\__msg_kernel_new:nnnn { kernel } { bad-escape }
   {
     Invalid~escape~'\iow_char:N\\#1'~
     \__regex_if_in_cs:TF { within~a~control~sequence. }
@@ -19618,7 +19794,7 @@
         because~it~does~not~match~exactly~one~character.
       }
   }
-\__msg_kernel_new:nnnn { regex } { range-missing-end }
+\__msg_kernel_new:nnnn { kernel } { range-missing-end }
   { Invalid~end-point~for~range~'#1-#2'~in~character~class. }
   {
     The~end-point~'#2'~of~the~range~'#1-#2'~may~not~serve~as~an~
@@ -19625,7 +19801,7 @@
     end-point~for~a~range:~alphanumeric~characters~should~not~be~
     escaped,~and~non-alphanumeric~characters~should~be~escaped.
   }
-\__msg_kernel_new:nnnn { regex } { range-backwards }
+\__msg_kernel_new:nnnn { kernel } { range-backwards }
   { Range~'[#1-#2]'~out~of~order~in~character~class. }
   {
     In~ranges~of~characters~'[x-y]'~appearing~in~character~classes,~
@@ -19633,7 +19809,7 @@
     Here,~'#1'~has~character~code~\int_eval:n {`#1},~while~
     '#2'~has~character~code~\int_eval:n {`#2}.
   }
-\__msg_kernel_new:nnnn { regex } { c-bad-mode }
+\__msg_kernel_new:nnnn { kernel } { c-bad-mode }
   { Invalid~nested~'\iow_char:N\\c'~escape~in~regular~expression. }
   {
     The~'\iow_char:N\\c'~escape~cannot~be~used~within~
@@ -19640,7 +19816,14 @@
     a~control~sequence~test~'\iow_char:N\\c{...}'.~
     To~combine~several~category~tests,~use~'\iow_char:N\\c[...]'.
   }
-\__msg_kernel_new:nnnn { regex } { c-missing-rbrace }
+\__msg_kernel_new:nnnn { kernel } { c-C-invalid }
+  { '\iow_char:N\\cC'~should~be~followed~by~'.'~or~'(',~not~'#1'. }
+  {
+    The~'\iow_char:N\\cC'~construction~restricts~the~next~item~to~be~a~
+    control~sequence~or~the~next~group~to~be~made~of~control~sequences.~
+    It~only~makes~sense~to~follow~it~by~'.'~or~by~a~group.
+  }
+\__msg_kernel_new:nnnn { kernel } { c-missing-rbrace }
   { Missing~right~brace~inserted~for~'\iow_char:N\\c'~escape. }
   {
     LaTeX~was~given~a~regular~expression~where~a~
@@ -19647,13 +19830,13 @@
     '\iow_char:N\\c\iow_char:N\{...'~construction~was~not~ended~
     with~a~closing~brace~'\iow_char:N\}'.
   }
-\__msg_kernel_new:nnnn { regex } { c-missing-rbrack }
+\__msg_kernel_new:nnnn { kernel } { c-missing-rbrack }
   { Missing~right~bracket~inserted~for~'\iow_char:N\\c'~escape. }
   {
     A~construction~'\iow_char:N\\c[...'~appears~in~a~
     regular~expression,~but~the~closing~']'~is~not~present.
   }
-\__msg_kernel_new:nnnn { regex } { c-missing-category }
+\__msg_kernel_new:nnnn { kernel } { c-missing-category }
   { Invalid~character~'#1'~following~'\iow_char:N\\c'~escape. }
   {
     In~regular~expressions,~the~'\iow_char:N\\c'~escape~sequence~
@@ -19661,19 +19844,19 @@
     capital~letter~representing~a~character~category,~namely~
     one~of~'ABCDELMOPSTU'.
   }
-\__msg_kernel_new:nnnn { regex } { c-trailing }
+\__msg_kernel_new:nnnn { kernel } { c-trailing }
   { Trailing~category~code~escape~'\iow_char:N\\c'... }
   {
     A~regular~expression~ends~with~'\iow_char:N\\c'~followed~
     by~a~letter.~It~will~be~ignored.
   }
-\__msg_kernel_new:nnnn { regex } { u-missing-lbrace }
+\__msg_kernel_new:nnnn { kernel } { u-missing-lbrace }
   { Missing~left~brace~following~'\iow_char:N\\u'~escape. }
   {
     The~'\iow_char:N\\u'~escape~sequence~must~be~followed~by~
     a~brace~group~with~the~name~of~the~variable~to~use.
   }
-\__msg_kernel_new:nnnn { regex } { u-missing-rbrace }
+\__msg_kernel_new:nnnn { kernel } { u-missing-rbrace }
   { Missing~right~brace~inserted~for~'\iow_char:N\\u'~escape. }
   {
     LaTeX~
@@ -19682,7 +19865,7 @@
       { encountered~an~escaped~alphanumeric~character '\iow_char:N\\#2'~ }
     when~parsing~the~argument~of~an~'\iow_char:N\\u\iow_char:N\{...\}'~escape.
   }
-\__msg_kernel_new:nnnn { regex } { posix-unsupported }
+\__msg_kernel_new:nnnn { kernel } { posix-unsupported }
   { POSIX~collating~element~'[#1 ~ #1]'~not~supported. }
   {
     The~'[.foo.]'~and~'[=bar=]'~syntaxes~have~a~special~meaning~
@@ -19689,7 +19872,7 @@
     in~POSIX~regular~expressions.~This~is~not~supported~by~LaTeX.~
     Maybe~you~forgot~to~escape~a~left~bracket~in~a~character~class?
   }
-\__msg_kernel_new:nnnn { regex } { posix-unknown }
+\__msg_kernel_new:nnnn { kernel } { posix-unknown }
   { POSIX~class~'[:#1:]'~unknown. }
   {
     '[:#1:]'~is~not~among~the~known~POSIX~classes~
@@ -19698,10 +19881,10 @@
     '[:print:]',~'[:punct:]',~'[:space:]',~'[:upper:]',~
     '[:word:]',~and~'[:xdigit:]'.
   }
-\__msg_kernel_new:nnnn { regex } { posix-missing-close }
+\__msg_kernel_new:nnnn { kernel } { posix-missing-close }
   { Missing~closing~':]'~for~POSIX~class. }
   { The~POSIX~syntax~'#1'~must~be~followed~by~':]',~not~'#2'. }
-\__msg_kernel_new:nnnn { regex } { result-unbalanced }
+\__msg_kernel_new:nnnn { kernel } { result-unbalanced }
   { Missing~brace~inserted~when~#1. }
   {
     LaTeX~was~asked~to~do~some~regular~expression~operation,~
@@ -19709,19 +19892,19 @@
     of~begin-group~and~end-group~tokens.~Braces~were~inserted:~
     #2~left,~#3~right.
   }
-\__msg_kernel_new:nnnn { regex } { unknown-option }
+\__msg_kernel_new:nnnn { kernel } { unknown-option }
   { Unknown~option~'#1'~for~regular~expressions. }
   {
     The~only~available~option~is~'case-insensitive',~toggled~by~
     '(?i)'~and~'(?-i)'.
   }
-\__msg_kernel_new:nnnn { regex } { special-group-unknown }
+\__msg_kernel_new:nnnn { kernel } { special-group-unknown }
   { Unknown~special~group~'#1~...'~in~a~regular~expression. }
   {
     The~only~valid~constructions~starting~with~'(?'~are~
     '(?:~...~)',~'(?|~...~)',~'(?i)',~and~'(?-i)'.
   }
-\__msg_kernel_new:nnnn { regex } { replacement-c }
+\__msg_kernel_new:nnnn { kernel } { replacement-c }
   { Misused~'\iow_char:N\\c'~command~in~a~replacement~text. }
   {
     In~a~replacement~text,~the~'\iow_char:N\\c'~escape~sequence~
@@ -19728,7 +19911,7 @@
     can~be~followed~by~one~of~the~letters~'ABCDELMOPSTU'~
     or~a~brace~group,~not~by~'#1'.
   }
-\__msg_kernel_new:nnnn { regex } { replacement-u }
+\__msg_kernel_new:nnnn { kernel } { replacement-u }
   { Misused~'\iow_char:N\\u'~command~in~a~replacement~text. }
   {
     In~a~replacement~text,~the~'\iow_char:N\\u'~escape~sequence~
@@ -19735,7 +19918,7 @@
     must~be~~followed~by~a~brace~group~holding~the~name~of~the~
     variable~to~use.
   }
-\__msg_kernel_new:nnnn { regex } { replacement-g }
+\__msg_kernel_new:nnnn { kernel } { replacement-g }
   {
     Missing~brace~for~the~'\iow_char:N\\g'~construction~
     in~a~replacement~text.
@@ -19745,7 +19928,7 @@
     submatches~are~represented~either~as~'\iow_char:N \\g{dd..d}',~
     or~'\\d',~where~'d'~are~single~digits.~Here,~a~brace~is~missing.
   }
-\__msg_kernel_new:nnnn { regex } { replacement-catcode-end }
+\__msg_kernel_new:nnnn { kernel } { replacement-catcode-end }
   {
     Missing~character~for~the~'\iow_char:N\\c<category><character>'~
     construction~in~a~replacement~text.
@@ -19756,8 +19939,18 @@
     the~character~category.~Then,~a~character~must~follow.~LaTeX~
     reached~the~end~of~the~replacement~when~looking~for~that.
   }
-\__msg_kernel_new:nnnn { regex } { replacement-catcode-in-cs }
+\__msg_kernel_new:nnnn { kernel } { replacement-catcode-escaped }
   {
+    Escaped~letter~or~digit~after~category~code~in~replacement~text.
+  }
+  {
+    In~a~replacement~text,~the~'\iow_char:N\\c'~escape~sequence~
+    can~be~followed~by~one~of~the~letters~'ABCDELMOPSTU'~representing~
+    the~character~category.~Then,~a~character~must~follow,~not~
+    '\iow_char:N\\#2'.
+  }
+\__msg_kernel_new:nnnn { kernel } { replacement-catcode-in-cs }
+  {
     Category~code~'\iow_char:N\\c#1#3'~ignored~inside~
     '\iow_char:N\\c\{...\}'~in~a~replacement~text.
   }
@@ -19766,7 +19959,7 @@
     '\iow_char:N\\c\{...\}'~are~ignored~when~building~the~control~
     sequence~name.
   }
-\__msg_kernel_new:nnnn { regex } { replacement-null-space }
+\__msg_kernel_new:nnnn { kernel } { replacement-null-space }
   { TeX~cannot~build~a~space~token~with~character~code~0. }
   {
     You~asked~for~a~character~token~with~category~space,~
@@ -19775,13 +19968,13 @@
     This~specific~case~is~impossible~and~will~be~replaced~
     by~a~normal~space.
   }
-\__msg_kernel_new:nnnn { regex } { replacement-missing-rbrace }
+\__msg_kernel_new:nnnn { kernel } { replacement-missing-rbrace }
   { Missing~right~brace~inserted~in~replacement~text. }
   {
     There~ \int_compare:nTF { #1 = 1 } { was } { were } ~ #1~
     missing~right~\int_compare:nTF { #1 = 1 } { brace } { braces } .
   }
-\__msg_kernel_new:nnnn { regex } { replacement-missing-rparen }
+\__msg_kernel_new:nnnn { kernel } { replacement-missing-rparen }
   { Missing~right~parenthesis~inserted~in~replacement~text. }
   {
     There~ \int_compare:nTF { #1 = 1 } { was } { were } ~ #1~
@@ -19965,6 +20158,16 @@
     \c_group_end_token
   }
 \cs_new_eq:NN \hbox_gset_end: \hbox_set_end:
+\cs_new_protected:Npn \hbox_set_to_wd:Nnw #1#2
+  {
+    \tex_setbox:D #1 \tex_hbox:D to \__dim_eval:w #2 \__dim_eval_end:
+      \c_group_begin_token
+        \group_begin:
+  }
+\cs_new_protected:Npn \hbox_gset_to_wd:Nnw
+  { \tex_global:D \hbox_set_to_wd:Nnw }
+\cs_generate_variant:Nn \hbox_set_to_wd:Nnw  { c }
+\cs_generate_variant:Nn \hbox_gset_to_wd:Nnw { c }
 \cs_new_protected:Npn \hbox_to_wd:nn #1#2
    {
      \tex_hbox:D to \__dim_eval:w #1 \__dim_eval_end:
@@ -20037,6 +20240,16 @@
     \c_group_end_token
   }
 \cs_new_eq:NN \vbox_gset_end: \vbox_set_end:
+\cs_new_protected:Npn \vbox_set_to_ht:Nnw #1#2
+  {
+    \tex_setbox:D #1 \tex_vbox:D to \__dim_eval:w #2 \__dim_eval_end:
+      \c_group_begin_token
+        \group_begin:
+  }
+\cs_new_protected:Npn \vbox_gset_to_ht:Nnw
+  { \tex_global:D \vbox_set_to_ht:Nnw }
+\cs_generate_variant:Nn \vbox_set_to_ht:Nnw  { c }
+\cs_generate_variant:Nn \vbox_gset_to_ht:Nnw { c }
 \cs_new_eq:NN \vbox_unpack:N \tex_unvcopy:D
 \cs_new_eq:NN \vbox_unpack_clear:N \tex_unvbox:D
 \cs_generate_variant:Nn \vbox_unpack:N { c }
@@ -20411,7 +20624,7 @@
 \cs_new_protected:Npn \coffin_new:N #1
   {
     \box_new:N #1
-    \__chk_suspend_log:
+    \__debug_suspend_log:
     \prop_clear_new:c { l__coffin_corners_ \__int_value:w #1 _prop }
     \prop_clear_new:c { l__coffin_poles_   \__int_value:w #1 _prop }
     \prop_gset_eq:cN { l__coffin_corners_ \__int_value:w #1 _prop }
@@ -20418,7 +20631,7 @@
       \c__coffin_corners_prop
     \prop_gset_eq:cN { l__coffin_poles_ \__int_value:w #1 _prop }
       \c__coffin_poles_prop
-    \__chk_resume_log:
+    \__debug_resume_log:
   }
 \cs_generate_variant:Nn \coffin_new:N { c }
 \cs_new_protected:Npn \hcoffin_set:Nn #1#2
@@ -20898,7 +21111,7 @@
   }
 \cs_new_protected:Npn \coffin_typeset:Nnnnn #1#2#3#4#5
   {
-    \hbox_unpack:N \c_empty_box
+    \mode_leave_vertical:
     \__coffin_align:NnnNnnnnN \c_empty_coffin { H } { l }
       #1 {#2} {#3} {#4} {#5} \l__coffin_aligned_coffin
     \box_use:N \l__coffin_aligned_coffin
@@ -21151,7 +21364,12 @@
     \group_end:
   }
 \cs_new_protected:Npn \color_ensure_current:
-  { \__driver_color_ensure_current: }
+  {
+    \__driver_color_ensure_current:
+    \group_insert_after:N \__driver_color_reset:
+  }
+\tl_new:N \l__color_current_tl
+\tl_set:Nn \l__color_current_tl { gray~0 }
 %% File: l3sys.dtx Copyright (C) 2015-2017 The LaTeX3 Project
 \str_const:Nx \c_sys_jobname_str { \tex_jobname:D }
 \int_const:Nn \c_sys_minute_int
@@ -21290,10 +21508,34 @@
     \__deprecation_error:Nnn \c_minus_one { - 1 } { 2018-12-31 }
     \__deprecation_error:Nnn \sort_ordered: { \sort_return_same: } { 2018-12-31 }
     \__deprecation_error:Nnn \sort_reversed: { \sort_return_swapped: } { 2018-12-31 }
+    \__deprecation_error:Nnn \g_file_current_name_tl { \g_file_curr_name_str } { 2018-12-31 }
+    \__deprecation_error:Nnn \file_add_path:nN { \file_get_full_name:nN } { 2018-12-31 }
+    \__deprecation_error:Nnn \file_path_include:n
+      { \seq_put_right:Nn \l_file_search_path_seq } { 2018-12-31 }
+    \__deprecation_error:Nnn \file_path_remove:n
+      { \seq_remove_all:Nn \l_file_search_path_seq } { 2018-12-31 }
+    \__deprecation_error:Nnn \file_list: { \file_log_list: } { 2018-12-31 }
+    \__deprecation_error:Nnn \ior_list_streams: { \ior_show_list: } { 2018-12-31 }
+    \__deprecation_error:Nnn \ior_log_streams: { \ior_log_list: } { 2018-12-31 }
+    \__deprecation_error:Nnn \iow_list_streams: { \iow_show_list: } { 2018-12-31 }
+    \__deprecation_error:Nnn \iow_log_streams: { \iow_log_list: } { 2018-12-31 }
     \cs_set_eq:NN \__fp_parse_round:Nw \__fp_parse_round_deprecation_error:Nw
     \cs_set_eq:NN \deprecation_error: \scan_stop:
   }
 %% File: l3candidates.dtx Copyright (C) 2012-2017 The LaTeX3 Project
+\cs_new_protected:Npx \mode_leave_vertical:
+  {
+    \cs_if_exist:NTF \pdftex_quitvmode:D
+      { \pdftex_quitvmode:D }
+      {
+        \exp_not:n
+          {
+            \if_mode_vertical:
+              \exp_after:wN \tex_indent:D
+            \fi:
+          }
+     }
+  }
 \cs_new_protected:Npn \box_clip:N #1
   { \hbox_set:Nn #1 { \__driver_box_use_clip:N #1 } }
 \cs_generate_variant:Nn \box_clip:N { c }
@@ -21632,36 +21874,96 @@
         {#5} {#6}
       }
   }
+\cs_new_protected:Npn \file_get_mdfive_hash:nN #1#2
+  { \__file_get_details:nnN {#1} { mdfivesum } {#2} }
+\cs_new_protected:Npn \file_get_size:nN #1#2
+  { \__file_get_details:nnN {#1} { size } {#2} }
+\cs_new_protected:Npn \file_get_timestamp:nN #1#2
+  { \__file_get_details:nnN {#1} { moddate } {#2} }
+\cs_new_protected:Npn \__file_get_details:nnN #1#2#3
+  {
+    \file_get_full_name:nN {#1} \l__file_full_name_str
+    \str_set:Nx #3
+      {
+        \use:c { pdftex_file #2 :D } \exp_after:wN
+          { \l__file_full_name_str }
+      }
+  }
+\cs_if_exist:NTF \luatex_directlua:D
+  {
+    \cs_set_protected:Npn \__file_get_details:nnN #1#2#3
+      {
+        \file_get_full_name:nN {#1} \l__file_full_name_str
+        \str_set:Nx #3
+          {
+            \lua_now_x:n
+              {
+                l3kernel.file#2
+                  ( " \lua_escape_x:n { \l__file_full_name_str } " )
+              }
+          }
+       }
+  }
+  {
+    \cs_set_protected:Npn \file_get_mdfive_hash:nN #1#2
+      {
+        \file_get_full_name:nN {#1} \l__file_full_name_str
+        \tl_set:Nx #2
+          {
+            \pdftex_mdfivesum:D file \exp_after:wN
+              { \l__file_full_name_str }
+          }
+      }
+    \cs_if_exist:NT \xetex_XeTeXversion:D
+      {
+        \cs_set_protected:Npn \__file_get_details:nnN #1#2#3
+          {
+            \tl_clear:N #3
+            \__msg_kernel_error:nnx
+              { kernel } { xetex-primitive-not-available }
+              { \exp_not:c { pdffile #2 } }
+          }
+      }
+  }
+\__msg_kernel_new:nnnn { kernel } { xetex-primitive-not-available }
+  { Primitive~\token_to_str:N #1 not~available }
+  {
+    XeTeX~does~not~currently~provide~functionality~equivalent~to~the~
+    \token_to_str:N #1 primitive.
+  }
 \cs_new_protected:Npn \file_if_exist_input:n #1
   {
-    \file_if_exist:nT {#1}
-      { \__file_input:V \l__file_internal_name_tl }
+    \file_get_full_name:nN {#1} \l__file_full_name_str
+    \str_if_empty:NF \l__file_full_name_str
+      { \__file_input:V \l__file_full_name_str }
   }
 \cs_new_protected:Npn \file_if_exist_input:nT #1#2
   {
-    \file_if_exist:nT {#1}
+    \file_get_full_name:nN {#1} \l__file_full_name_str
+    \str_if_empty:NF \l__file_full_name_str
       {
         #2
-        \__file_input:V \l__file_internal_name_tl
+        \__file_input:V \l__file_full_name_str
       }
   }
-\cs_new_protected:Npn \file_if_exist_input:nF #1
+\cs_new_protected:Npn \file_if_exist_input:nF #1#2
   {
-    \file_if_exist:nTF {#1}
-      { \__file_input:V \l__file_internal_name_tl }
+    \file_get_full_name:nN {#1} \l__file_full_name_str
+    \str_if_empty:NTF \l__file_full_name_str
+      {#2}
+      { \__file_input:V \l__file_full_name_str }
   }
-\cs_new_protected:Npn \file_if_exist_input:nTF #1#2
+\cs_new_protected:Npn \file_if_exist_input:nTF #1#2#3
   {
-    \file_if_exist:nTF {#1}
+    \file_get_full_name:nN {#1} \l__file_full_name_str
+    \str_if_empty:NTF \l__file_full_name_str
+      {#3}
       {
         #2
-        \__file_input:V \l__file_internal_name_tl
+        \__file_input:V \l__file_full_name_str
       }
   }
-\cs_new_protected:Npn \ior_log_streams:
-  { \__msg_log_next: \ior_list_streams: }
-\cs_new_protected:Npn \iow_log_streams:
-  { \__msg_log_next: \iow_list_streams: }
+\cs_new_protected:Npn \file_input_stop: { \tex_endinput:D }
 \cs_if_exist:NTF \pdftex_uniformdeviate:D
   {
     \cs_new:Npn \int_rand:nn #1#2
@@ -21998,7 +22300,9 @@
 \cs_generate_variant:Nn \tl_gset_from_file:Nnn { c }
 \cs_new_protected:Npn \__tl_set_from_file:NNnn #1#2#3#4
   {
-    \__file_if_exist:nT {#4}
+    \file_get_full_name:nN {#4} \l__file_full_name_str
+    \str_if_empty:NTF \l__file_full_name_str
+      { \__file_missing:n {#4} }
       {
         \group_begin:
           \exp_args:No \etex_everyeof:D
@@ -22006,7 +22310,7 @@
           #3 \scan_stop:
           \exp_after:wN \__tl_from_file_do:w
           \exp_after:wN \prg_do_nothing:
-            \tex_input:D \l__file_internal_name_tl \scan_stop:
+            \tex_input:D \l__file_full_name_str \scan_stop:
         \exp_args:NNNo \group_end:
         #1 #2 \l__tl_internal_a_tl
       }
@@ -22023,13 +22327,15 @@
 \cs_generate_variant:Nn \tl_gset_from_file_x:Nnn { c }
 \cs_new_protected:Npn \__tl_set_from_file_x:NNnn #1#2#3#4
   {
-    \__file_if_exist:nT {#4}
+    \file_get_full_name:nN {#4} \l__file_full_name_str
+    \str_if_empty:NTF \l__file_full_name_str
+      { \__file_missing:n {#4} }
       {
         \group_begin:
           \etex_everyeof:D { \exp_not:N }
           #3 \scan_stop:
           \tl_set:Nx \l__tl_internal_a_tl
-            { \tex_input:D \l__file_internal_name_tl \c_space_token }
+            { \tex_input:D \l__file_full_name_str \c_space_token }
         \exp_args:NNNo \group_end:
         #1 #2 \l__tl_internal_a_tl
       }
@@ -22037,10 +22343,10 @@
 \cs_generate_variant:Nn \tl_if_head_eq_catcode:nNTF { o }
 \cs_new:Npn \tl_lower_case:n { \__tl_change_case:nnn { lower } { } }
 \cs_new:Npn \tl_upper_case:n { \__tl_change_case:nnn { upper } { } }
-\cs_new:Npn \tl_mixed_case:n { \__tl_mixed_case:nn { } }
+\cs_new:Npn \tl_mixed_case:n { \__tl_change_case:nnn { mixed } { } }
 \cs_new:Npn \tl_lower_case:nn { \__tl_change_case:nnn { lower } }
 \cs_new:Npn \tl_upper_case:nn { \__tl_change_case:nnn { upper } }
-\cs_new:Npn \tl_mixed_case:nn { \__tl_mixed_case:nn }
+\cs_new:Npn \tl_mixed_case:nn { \__tl_change_case:nnn { mixed } }
 \cs_new:Npn \__tl_change_case:nnn #1#2#3
   {
     \etex_unexpanded:D \exp_after:wN
@@ -22078,6 +22384,10 @@
   }
 \cs_new:Npn \__tl_change_case_group:nwnn #1#2 \q_recursion_stop #3#4
   {
+    \use:c { __tl_change_case_group_ #3 : nnnn } {#1} {#2} {#3} {#4}
+  }
+\cs_new:Npn \__tl_change_case_group_lower:nnnn #1#2#3#4
+  {
     \__tl_change_case_output:own
       {
         \exp_after:wN
@@ -22088,6 +22398,20 @@
       }
     \__tl_change_case_loop:wnn #2 \q_recursion_stop {#3} {#4}
   }
+\cs_new_eq:NN \__tl_change_case_group_upper:nnnn
+  \__tl_change_case_group_lower:nnnn
+\cs_new:Npn \__tl_change_case_group_mixed:nnnn #1#2#3#4
+  {
+    \__tl_change_case_output:own
+      {
+        \exp_after:wN
+          {
+            \exp:w
+            \__tl_change_case_aux:nnn {#3} {#4} {#1}
+          }
+      }
+    \__tl_change_case_loop:wnn #2 \q_recursion_stop { lower } {#4}
+  }
 \exp_last_unbraced:NNo \cs_new:Npn \__tl_change_case_space:wnn \c_space_tl
   {
     \__tl_change_case_output:nwn { ~ }
@@ -22156,11 +22480,11 @@
 \cs_new:Npn \__tl_change_case_N_type:Nnnn #1#2#3#4
   {
     \token_if_cs:NTF #1
-      { \__tl_change_case_cs_letterlike:Nnn #1 {#3} { } }
-      { \__tl_change_case_char:Nnn #1 {#3} {#4} }
+      { \__tl_change_case_cs_letterlike:Nn #1 {#3} }
+      { \use:c { __tl_change_case_char_ #3 :Nnn } #1 {#3} {#4} }
     \__tl_change_case_loop:wnn #2 \q_recursion_stop {#3} {#4}
   }
-\cs_new:Npn \__tl_change_case_char:Nnn #1#2#3
+\cs_new:Npn \__tl_change_case_char_lower:Nnn #1#2#3
   {
     \cs_if_exist_use:cF { __tl_change_case_ #2 _ #3 :Nnw }
       { \use_ii:nn }
@@ -22170,6 +22494,19 @@
             { \__tl_change_case_char:nN {#2} #1 }
         }
   }
+\cs_new_eq:NN \__tl_change_case_char_upper:Nnn
+  \__tl_change_case_char_lower:Nnn
+\cs_new:Npn \__tl_change_case_char_mixed:Nnn #1#2#3
+  {
+    \__tl_change_case_mixed_switch:w
+    \cs_if_exist_use:cF { __tl_change_case_mixed_ #3 :Nnw }
+      {
+        \cs_if_exist_use:cF { __tl_change_case_upper_ #3 :Nnw }
+          { \use_ii:nn }
+      }
+        #1
+        { \__tl_change_case_mixed_skip:N #1 }
+  }
 \cs_if_exist:NTF \utex_char:D
   {
     \cs_new:Npn \__tl_change_case_char:nN #1#2
@@ -22192,13 +22529,32 @@
        }
   }
 \cs_new:Npn \__tl_change_case_char_auxi:nN #1#2
+  { \use:c { __tl_change_case_char_ #1 :N  } #2 }
+\cs_new:Npn \__tl_change_case_char_lower:N #1
   {
     \__tl_change_case_output:fwn
       {
-        \cs_if_exist_use:cF { c__unicode_ #1 _ \token_to_str:N #2 _tl }
-          { \__tl_change_case_char_auxii:nN {#1} #2 }
+        \cs_if_exist_use:cF { c__unicode_lower_ \token_to_str:N #1 _tl }
+          { \__tl_change_case_char_auxii:nN { lower } #1 }
       }
   }
+\cs_new:Npn \__tl_change_case_char_upper:N #1
+  {
+    \__tl_change_case_output:fwn
+      {
+        \cs_if_exist_use:cF { c__unicode_upper_ \token_to_str:N #1 _tl }
+          { \__tl_change_case_char_auxii:nN { upper } #1 }
+      }
+  }
+\cs_new:Npn \__tl_change_case_char_mixed:N #1
+  {
+    \cs_if_exist:cTF { c__unicode_mixed_ \token_to_str:N #1 _tl }
+      {
+        \__tl_change_case_output:fwn
+          { \tl_use:c { c__unicode_mixed_ \token_to_str:N #1 _tl } }
+      }
+      { \__tl_change_case_char_upper:N #1 }
+  }
 \cs_if_exist:NTF \utex_char:D
   {
     \cs_new:Npn \__tl_change_case_char_auxii:nN #1#2
@@ -22213,7 +22569,7 @@
       }
     \cs_new_protected:Npn \__tl_lookup_lower:N #1 { \tex_lccode:D `#1 }
     \cs_new_protected:Npn \__tl_lookup_upper:N #1 { \tex_uccode:D `#1 }
-    \cs_new_eq:NN \__tl_lookup_title:N \__tl_lookup_upper:N
+    \cs_new_eq:NN \__tl_lookup_mixed:N \__tl_lookup_upper:N
   }
   {
     \cs_new:Npn \__tl_change_case_char_auxii:nN #1#2 { \exp_stop_f: #2 }
@@ -22234,8 +22590,17 @@
         #3
       }
   }
-\cs_new:Npn \__tl_change_case_cs_letterlike:Nnn #1#2#3
+\cs_new:Npn \__tl_change_case_cs_letterlike:Nn #1#2
   {
+    \str_if_eq:nnTF {#2} { mixed }
+      {
+        \__tl_change_case_cs_letterlike:NnN #1 { upper }
+          \__tl_change_case_mixed_switch:w
+      }
+      { \__tl_change_case_cs_letterlike:NnN #1 {#2} \prg_do_nothing: }
+  }
+\cs_new:Npn \__tl_change_case_cs_letterlike:NnN #1#2#3
+  {
     \cs_if_exist:cTF { c__tl_change_case_ #2 _ \token_to_str:N #1 _tl }
       {
         \__tl_change_case_output:vwn
@@ -22322,6 +22687,36 @@
   }
 \cs_new:Npn \__tl_change_case_cs_expand:NN #1#2
   { \exp_after:wN #2 #1 }
+\cs_new:Npn \__tl_change_case_mixed_skip:N #1
+  {
+    \exp_after:wN \__tl_change_case_mixed_skip:NN
+      \exp_after:wN #1 \l_tl_mixed_case_ignore_tl
+      \q_recursion_tail \q_recursion_stop
+  }
+\cs_new:Npn \__tl_change_case_mixed_skip:NN #1#2
+  {
+    \quark_if_recursion_tail_stop_do:nn {#2}
+      { \__tl_change_case_char:nN { mixed } #1 }
+    \int_compare:nNnT { `#1 }  = { `#2 }
+      {
+        \use_i_delimit_by_q_recursion_stop:nw
+          {
+            \__tl_change_case_output:nwn {#1}
+            \__tl_change_case_mixed_skip_tidy:Nwn
+          }
+      }
+    \__tl_change_case_mixed_skip:NN #1
+  }
+\cs_new:Npn \__tl_change_case_mixed_skip_tidy:Nwn #1#2 \q_recursion_stop #3
+  {
+    \__tl_change_case_loop:wnn #2 \q_recursion_stop { mixed }
+  }
+\cs_new:Npn \__tl_change_case_mixed_switch:w
+  #1 \__tl_change_case_loop:wnn #2 \q_recursion_stop #3
+  {
+    #1
+    \__tl_change_case_loop:wnn #2 \q_recursion_stop { lower }
+  }
 \cs_new:Npn \__tl_change_case_lower_sigma:Nnw #1#2#3#4 \q_recursion_stop
   {
     \int_compare:nNnTF { `#1 } = { "03A3 }
@@ -22795,7 +23190,7 @@
           \group_end:
         }
       \__tl_tmp:w { 00DF } { SS } { upper }
-      \__tl_tmp:w { 00DF } { Ss } { title }
+      \__tl_tmp:w { 00DF } { Ss } { mixed }
       \__tl_tmp:w { 0131 } { I }  { upper }
     }
   \group_end:
@@ -22827,129 +23222,6 @@
 \tl_new:N \l_tl_case_change_accents_tl
 \tl_set:Nn \l_tl_case_change_accents_tl
   { \" \' \. \^ \` \~ \c \H \k \r \t \u \v }
-\cs_new:Npn \__tl_mixed_case:nn #1#2
-  {
-    \etex_unexpanded:D \exp_after:wN
-      {
-        \exp:w
-        \__tl_mixed_case_aux:nn {#1} {#2}
-      }
-  }
-\cs_new:Npn \__tl_mixed_case_aux:nn #1#2
-  {
-    \group_align_safe_begin:
-    \__tl_mixed_case_loop:wn
-      #2 \q_recursion_tail \q_recursion_stop {#1}
-    \__tl_change_case_result:n { }
-  }
-\cs_new:Npn \__tl_mixed_case_loop:wn #1 \q_recursion_stop
-  {
-    \tl_if_head_is_N_type:nTF {#1}
-      { \__tl_mixed_case_N_type:Nwn }
-      {
-        \tl_if_head_is_group:nTF {#1}
-          { \__tl_mixed_case_group:nwn }
-          { \__tl_mixed_case_space:wn }
-      }
-    #1 \q_recursion_stop
-  }
-\cs_new:Npn \__tl_mixed_case_group:nwn #1#2 \q_recursion_stop #3
-  {
-    \__tl_change_case_output:own
-      {
-        \exp_after:wN
-          {
-            \exp:w
-            \__tl_mixed_case_aux:nn {#3} {#1}
-          }
-      }
-    \__tl_change_case_loop:wnn #2 \q_recursion_stop { lower } {#3}
-  }
-\exp_last_unbraced:NNo \cs_new:Npn \__tl_mixed_case_space:wn \c_space_tl
-  {
-    \__tl_change_case_output:nwn { ~ }
-    \__tl_mixed_case_loop:wn
-  }
-\cs_new:Npn \__tl_mixed_case_N_type:Nwn #1#2 \q_recursion_stop
-  {
-    \quark_if_recursion_tail_stop_do:Nn #1
-      { \__tl_change_case_end:wn }
-    \exp_after:wN \__tl_mixed_case_N_type:NNNnn
-      \exp_after:wN #1 \l_tl_case_change_math_tl
-      \q_recursion_tail ? \q_recursion_stop {#2}
-  }
-\cs_new:Npn \__tl_mixed_case_N_type:NNNnn #1#2#3
-  {
-    \quark_if_recursion_tail_stop_do:Nn #2
-      { \__tl_mixed_case_N_type:Nnn #1 }
-    \token_if_eq_meaning:NNTF #1 #2
-      {
-        \use_i_delimit_by_q_recursion_stop:nw
-          {
-            \__tl_change_case_math:NNNnnn
-              #1 #3 \__tl_mixed_case_loop:wn
-          }
-      }
-      { \__tl_mixed_case_N_type:NNNnn #1 }
-  }
-\cs_new:Npn \__tl_mixed_case_N_type:Nnn #1#2#3
-  {
-    \token_if_cs:NTF #1
-      {
-        \__tl_change_case_cs_letterlike:Nnn #1 { upper }
-          { \__tl_mixed_case_letterlike:Nw }
-        \__tl_mixed_case_loop:wn #2 \q_recursion_stop {#3}
-      }
-      {
-        \__tl_mixed_case_char:Nn #1 {#3}
-        \__tl_change_case_loop:wnn #2 \q_recursion_stop { lower } {#3}
-      }
-  }
-\cs_new:Npn \__tl_mixed_case_letterlike:Nw #1#2 \q_recursion_stop
-  { \__tl_change_case_loop:wnn #2 \q_recursion_stop { lower } }
-\cs_new:Npn \__tl_mixed_case_char:Nn #1#2
-  {
-    \cs_if_exist_use:cF { __tl_change_case_mixed_ #2 :Nnw }
-      {
-        \cs_if_exist_use:cF { __tl_change_case_upper_ #2 :Nnw }
-          { \use_ii:nn }
-      }
-        #1
-        { \__tl_mixed_case_skip:N #1 }
-  }
-\cs_new:Npn \__tl_mixed_case_skip:N #1
-  {
-    \exp_after:wN \__tl_mixed_case_skip:NN
-      \exp_after:wN #1 \l_tl_mixed_case_ignore_tl
-      \q_recursion_tail \q_recursion_stop
-  }
-\cs_new:Npn \__tl_mixed_case_skip:NN #1#2
-  {
-    \quark_if_recursion_tail_stop_do:nn {#2}
-      { \__tl_mixed_case_char:N #1 }
-    \int_compare:nNnT { `#1 }  = { `#2 }
-      {
-        \use_i_delimit_by_q_recursion_stop:nw
-          {
-            \__tl_change_case_output:nwn {#1}
-            \__tl_mixed_case_skip_tidy:Nwn
-          }
-      }
-    \__tl_mixed_case_skip:NN #1
-  }
-\cs_new:Npn \__tl_mixed_case_skip_tidy:Nwn #1#2 \q_recursion_stop #3
-  {
-    \__tl_mixed_case_loop:wn #2 \q_recursion_stop
-  }
-\cs_new:Npn \__tl_mixed_case_char:N #1
-  {
-    \cs_if_exist:cTF { c__unicode_title_  #1 _tl }
-      {
-        \__tl_change_case_output:fwn
-          { \tl_use:c { c__unicode_title_ #1 _tl } }
-      }
-      { \__tl_change_case_char:nN { upper } #1 }
-  }
 \cs_new:Npn \__tl_change_case_mixed_nl:Nnw #1
   {
     \bool_lazy_or:nnTF

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex	2017-07-15 21:27:01 UTC (rev 44813)
@@ -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/05/29}%
+\def\ExplFileDate{2017/07/15}%
 \let\ExplLoaderFileDate\ExplFileDate
 \begingroup
   \def\tempa{LaTeX2e}%
@@ -59,6 +59,7 @@
 \catcode64=11 %
 \chardef \l at expl@check at declarations@bool = 0 %
 \chardef \l at expl@log at functions@bool = 0 %
+\chardef \l at expl@enable at debug@bool = 0 %
 \let\expl at AtBeginDocument\AtBeginDocument
 \def\AtBeginDocument#1{}%
 \expandafter\def\expandafter\l at expl@tidy at tl\expandafter

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.lua
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.lua	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.lua	2017-07-15 21:27:01 UTC (rev 44813)
@@ -20,23 +20,114 @@
 -- 
 -- File: l3luatex.dtx Copyright (C) 2010-2017 The LaTeX3 Project
 l3kernel = l3kernel or { }
-local tex_setcatcode    = tex.setcatcode
-local tex_sprint        = tex.sprint
-local tex_write         = tex.write
-local unicode_utf8_char = unicode.utf8.char
-local function strcmp (A, B)
+local io      = io
+local kpse    = kpse
+local lfs     = lfs
+local math    = math
+local md5     = md5
+local os      = os
+local string  = string
+local tex     = tex
+local unicode = unicode
+local abs        = math.abs
+local byte       = string.byte
+local floor      = math.floor
+local format     = string.format
+local gsub       = string.gsub
+local kpse_find  = kpse.find_file
+local lfs_attr   = lfs.attributes
+local md5_sum    = md5.sum
+local open       = io.open
+local os_date    = os.date
+local setcatcode = tex.setcatcode
+local str_format = string.format
+local sprint     = tex.sprint
+local write      = tex.write
+local utf8_char  = unicode.utf8.char
+local function escapehex(str)
+  write((gsub(str, ".",
+    function (ch) return format("%02X", byte(ch)) end)))
+end
+local charcat_table = l3kernel.charcat_table or 1
+local function charcat(charcode, catcode)
+  setcatcode(charcat_table, charcode, catcode)
+  sprint(charcat_table, utf8_char(charcode))
+end
+l3kernel.charcat = charcat
+local function filemdfivesum(name)
+  local file =  kpse_find(name, "tex", true)
+  if file then
+    local f = open(file, "r")
+    if f then
+      local data = f:read("*a")
+      escapehex(md5_sum(data))
+      f:close()
+    end
+  end
+end
+l3kernel.filemdfivesum = filemdfivesum
+local function filemoddate(name)
+  local file =  kpse_find(name, "tex", true)
+  if file then
+    local date = lfs_attr(file, "modification")
+    if date then
+      local d = os_date("*t", date)
+      if d.sec >= 60 then
+        d.sec = 59
+      end
+      local u = os_date("!*t", date)
+      local off = 60 * (d.hour - u.hour) + d.min - u.min
+      if d.year ~= u.year then
+        if d.year > u.year then
+          off = off + 1440
+        else
+          off = off - 1440
+        end
+      elseif d.yday ~= u.yday then
+        if d.yday > u.yday then
+          off = off + 1440
+        else
+          off = off - 1440
+        end
+      end
+      local timezone
+      if off == 0 then
+        timezone = "Z"
+      else
+        local hours = floor(off / 60)
+        local mins  = abs(off - hours * 60)
+        timezone = str_format("%+03d", hours)
+          .. "'" .. str_format("%02d", mins) .. "'"
+      end
+      write("D:"
+        .. str_format("%04d", d.year)
+        .. str_format("%02d", d.month)
+        .. str_format("%02d", d.day)
+        .. str_format("%02d", d.hour)
+        .. str_format("%02d", d.min)
+        .. str_format("%02d", d.sec)
+        .. timezone)
+    end
+  end
+end
+l3kernel.filemoddate = filemoddate
+local function filesize(name)
+  local file =  kpse_find(name, "tex", true)
+  if file then
+    local size = lfs_attr(file, "size")
+    if size then
+      write(size)
+    end
+  end
+end
+l3kernel.filesize = filesize
+local function strcmp(A, B)
   if A == B then
-    tex_write("0")
+    write("0")
   elseif A < B then
-    tex_write("-1")
+    write("-1")
   else
-    tex_write("1")
+    write("1")
   end
 end
 l3kernel.strcmp = strcmp
-local charcat_table = l3kernel.charcat_table or 1
-local function charcat (charcode, catcode)
-  tex_setcatcode(charcat_table, charcode, catcode)
-  tex_sprint(charcat_table, unicode_utf8_char(charcode))
-end
-l3kernel.charcat = charcat

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty	2017-07-15 21:27:01 UTC (rev 44813)
@@ -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/05/29}%
+\def\ExplFileDate{2017/07/15}%
 \let\ExplLoaderFileDate\ExplFileDate
 \ProvidesPackage{expl3}
   [%
@@ -36,7 +36,9 @@
   }
 \expl at create@bool at option{check-declarations}\l at expl@check at declarations@bool
 \expl at create@bool at option{log-functions}\l at expl@log at functions@bool
+\expl at create@bool at option{enable-debug}\l at expl@enable at debug@bool
 \let\expl at create@bool at option\@undefined
+\chardef\l at expl@enable at debug@bool=0 %
 \newcommand*\l at expl@options at clist{}
 \DeclareOption*
   {%
@@ -50,6 +52,12 @@
     \fi
   }
 \ProcessOptions\relax
+\ifodd\l at expl@check at declarations@bool
+  \chardef\l at expl@enable at debug@bool=1 %
+\fi
+\ifodd\l at expl@log at functions@bool
+  \chardef\l at expl@enable at debug@bool=1 %
+\fi
 \protected\def\ProvidesExplPackage#1#2#3#4%
   {%
     \ProvidesPackage{#1}[#2 \ifx\relax#3\relax\else v#3\space\fi #4]%
@@ -275,6 +283,11 @@
   }
 \tl_put_left:Nn \@pushfilename
   {
+    \exp_args:Nx \__file_input_push:n
+      {
+        \tl_to_str:N \@currname
+        \tl_to_str:N \@currext
+      }
     \tl_put_left:Nx \l__expl_status_stack_tl
       {
         \bool_if:NTF \l__kernel_expl_bool
@@ -283,8 +296,15 @@
       }
     \ExplSyntaxOff
   }
+\tl_put_right:Nn \@pushfilename { \@pushfilenameaux }
+\cs_set_protected:Npn \@pushfilenameaux #1#2#3
+  {
+    \str_gset:Nn \g_file_curr_name_str {#3}
+    #1 #2 {#3}
+  }
 \tl_put_right:Nn \@popfilename
   {
+    \__file_input_pop:
     \tl_if_empty:NTF \l__expl_status_stack_tl
       { \ExplSyntaxOff }
       { \exp_after:wN \__expl_status_pop:w \l__expl_status_stack_tl \q_stop }

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls	2017-07-15 21:27:01 UTC (rev 44813)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3doc.dtx Copyright (C) 1990-2017 The LaTeX3 project
 \RequirePackage{expl3,xparse,calc}
-\ProvidesExplClass{l3doc}{2017/05/29}{}
+\ProvidesExplClass{l3doc}{2017/07/15}{}
   {L3 Experimental documentation class}
 \clist_new:N \g_docinput_clist
 \seq_new:N \g_doc_functions_seq
@@ -1354,7 +1354,7 @@
     \__codedoc_test_missing_aux:Nxn
       \g__codedoc_missing_tests_prop
       { \seq_use:Nn \l__codedoc_names_seq { , } }
-      { { \g_file_current_name_tl \iow_char:N \ (#1) } }
+      { { \g_file_curr_name_str \iow_char:N \ (#1) } }
   }
 \cs_new_protected:Npn \__codedoc_test_missing_aux:Nnn #1#2#3
   {

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvipdfmx.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvipdfmx.def	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvipdfmx.def	2017-07-15 21:27:01 UTC (rev 44813)
@@ -22,6 +22,22 @@
 \ProvidesExplFile
   {l3dvidpfmx.def}{2017/03/18}{}
   {L3 Experimental driver: dvipdfmx}
+\AtBeginDocument
+  {
+    \@ifpackageloaded { color }
+      {
+        \cs_new_protected:Npn \__driver_color_pickup:
+          { \tl_set_eq:NN \l__color_current_tl \current at color }
+      }
+      { \cs_new_protected:Npn \__driver_color_pickup: { } }
+  }
+\cs_new_protected:Npn \__driver_color_ensure_current:
+  {
+    \__driver_color_pickup:
+    \tex_special:D { color~push~\l__color_current_tl }
+  }
+\cs_new_protected:Npn \__driver_color_reset:
+  { \tex_special:D { color~pop } }
 \cs_new_protected:Npn \__driver_literal:n #1
   { \tex_special:D { pdf:literal~ #1 } }
 \cs_new_protected:Npn \__driver_scope_begin:
@@ -68,31 +84,18 @@
     \hbox_overlap_right:n { \box_use:N #1 }
     \__driver_scope_end:
   }
-\tl_new:N \l__driver_color_current_tl
-\tl_set:Nn \l__driver_color_current_tl { [ 0 ] }
-\AtBeginDocument
-  {
-    \@ifpackageloaded { color }
-      { \tl_set:Nn \l__driver_color_current_tl { \current at color } }
-      { }
-  }
-\cs_new_protected:Npn \__driver_color_ensure_current:
-  {
-    \tex_special:D { pdf:bcolor~\l__driver_color_current_tl }
-    \group_insert_after:N \__driver_color_reset:
-  }
-\cs_new_protected:Npn \__driver_color_reset:
-  { \tex_special:D { pdf:ecolor } }
 \cs_new_eq:NN \__driver_image_getbb_eps:n \__image_read_bb:n
 \cs_new_protected:Npn \__driver_image_getbb_jpg:n #1
   {
     \int_zero:N \l__image_page_int
+    \tl_clear:N \l__image_pagebox_tl
     \__image_extract_bb:n {#1}
   }
 \cs_new_eq:NN \__driver_image_getbb_png:n \__driver_image_getbb_jpg:n
 \cs_new_protected:Npn \__driver_image_getbb_pdf:n #1
   {
-    \bool_set_false:N \l__image_interpolate_tl
+    \tl_clear:N \l__image_decode_tl
+    \bool_set_false:N \l__image_interpolate_bool
     \__image_extract_bb:n {#1}
   }
 \int_new:N \g__driver_image_int
@@ -102,7 +105,7 @@
   }
 \cs_new_protected:Npn \__driver_image_include_jpg:n #1
   { \__driver_image_include_auxi:nn {#1} { image } }
-\cs_new_eq:NN \__driver_image_include_png:n \__driver_image_include_png:n
+\cs_new_eq:NN \__driver_image_include_png:n \__driver_image_include_jpg:n
 \cs_new_protected:Npn \__driver_image_include_pdf:n #1
   { \__driver_image_include_auxi:nn {#1} { epdf } }
 \cs_new_protected:Npn \__driver_image_include_auxi:nn #1#2
@@ -109,8 +112,12 @@
   {
     \__driver_image_include_auxii:xnn
       {
-        \int_compare:nNnT \l__image_page_int > 0
+        \tl_if_empty:NF \l__image_pagebox_tl
+          { : \l__image_pagebox_tl }
+        \int_compare:nNnT \l__image_page_int > 1
           { :P \int_use:N \l__image_page_int }
+        \tl_if_empty:NF \l__image_decode_tl
+          { :D \l__image_decode_tl }
         \bool_if:NT \l__image_interpolate_bool
            { :I }
       }
@@ -134,11 +141,29 @@
       {
         pdf:#3~
         @image \int_use:c { c__image_ #1#2 _int }
-        \int_compare:nNnT \l__image_page_int > 0
+        \int_compare:nNnT \l__image_page_int > 1
           { page ~ \int_use:N \l__image_page_int \c_space_tl }
+        \tl_if_empty:NF \l__image_pagebox_tl
+          {
+            pagebox ~ \l__image_pagebox_tl \c_space_tl
+            bbox ~
+              \dim_to_decimal_in_bp:n \l__image_llx_dim \c_space_tl
+              \dim_to_decimal_in_bp:n \l__image_lly_dim \c_space_tl
+              \dim_to_decimal_in_bp:n \l__image_urx_dim \c_space_tl
+              \dim_to_decimal_in_bp:n \l__image_ury_dim \c_space_tl
+          }
         (#1)
-        \bool_if:NT \l__image_interpolate_bool
-          { <</Interpolate~true>> }
+        \bool_lazy_or:nnT
+          { \l__image_interpolate_bool }
+          { ! \tl_if_empty_p:N \l__imge_decode_tl }
+          {
+            <<
+              \tl_if_empty:NF \l__imge_decode_tl
+                { /Decode~[ \l__imge_decode_tl ] }
+              \bool_if:NT \l__image_interpolate_bool
+                { /Interpolate~true> }
+            >>
+          }
       }
   }
 \cs_new_eq:NN \__driver_draw_literal:n \__driver_literal:n

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvips.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvips.def	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvips.def	2017-07-15 21:27:01 UTC (rev 44813)
@@ -22,6 +22,22 @@
 \ProvidesExplFile
   {l3dvips.def}{2017/03/18}{}
   {L3 Experimental driver: dvips}
+\AtBeginDocument
+  {
+    \@ifpackageloaded { color }
+      {
+        \cs_new_protected:Npn \__driver_color_pickup:
+          { \tl_set_eq:NN \l__color_current_tl \current at color }
+      }
+      { \cs_new_protected:Npn \__driver_color_pickup: { } }
+  }
+\cs_new_protected:Npn \__driver_color_ensure_current:
+  {
+    \__driver_color_pickup:
+    \tex_special:D { color~push~\l__color_current_tl }
+  }
+\cs_new_protected:Npn \__driver_color_reset:
+  { \tex_special:D { color~pop } }
 \cs_new_protected:Npn \__driver_literal:n #1
   {
     \tex_special:D
@@ -88,21 +104,6 @@
     \hbox_overlap_right:n { \box_use:N #1 }
     \__driver_scope_end:
   }
-\tl_new:N \l__driver_color_current_tl
-\tl_set:Nn \l__driver_color_current_tl { gray~0 }
-\AtBeginDocument
-  {
-    \@ifpackageloaded { color }
-      { \tl_set:Nn \l__driver_color_current_tl { \current at color } }
-      { }
-  }
-\cs_new_protected:Npn \__driver_color_ensure_current:
-  {
-    \tex_special:D { color~push~\l__driver_color_current_tl }
-    \group_insert_after:N \__driver_color_reset:
-  }
-\cs_new_protected:Npn \__driver_color_reset:
-  { \tex_special:D { color~pop } }
 \cs_new_eq:NN \__driver_image_getbb_eps:n \__image_read_bb:n
 \cs_new_protected:Npn \__driver_image_include_eps:n #1
   {
@@ -144,7 +145,7 @@
        {
          \dim_to_decimal_in_bp:n {#4} ~ \dim_to_decimal_in_bp:n {#3} ~
          \dim_to_decimal_in_bp:n {#1} ~ \dim_to_decimal_in_bp:n {#2} ~
-         moveto~dup~0~rlineto~exch~0~exch~rlineto~neg~0~rlineto~clospath
+         moveto~dup~0~rlineto~exch~0~exch~rlineto~neg~0~rlineto~closepath
       }
   }
 \cs_new_protected:Npn \__driver_draw_curveto:nnnnnn #1#2#3#4#5#6

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvisvgm.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvisvgm.def	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvisvgm.def	2017-07-15 21:27:01 UTC (rev 44813)
@@ -22,6 +22,22 @@
 \ProvidesExplFile
   {l3dvisvgm.def}{2017/03/18}{}
   {L3 Experimental driver: dvisvgm}
+\AtBeginDocument
+  {
+    \@ifpackageloaded { color }
+      {
+        \cs_new_protected:Npn \__driver_color_pickup:
+          { \tl_set_eq:NN \l__color_current_tl \current at color }
+      }
+      { \cs_new_protected:Npn \__driver_color_pickup: { } }
+  }
+\cs_new_protected:Npn \__driver_color_ensure_current:
+  {
+    \__driver_color_pickup:
+    \tex_special:D { color~push~\l__color_current_tl }
+  }
+\cs_new_protected:Npn \__driver_color_reset:
+  { \tex_special:D { color~pop } }
 \cs_new_protected:Npn \__driver_literal:n #1
   { \tex_special:D { dvisvgm:raw~ #1 { ?nl } } }
 \cs_new_protected:Npn \__driver_scope_begin:
@@ -113,21 +129,20 @@
     \hbox_overlap_right:n { \box_use:N #1 }
     \__driver_scope_end:
   }
-\tl_new:N \l__driver_color_current_tl
-\tl_set:Nn \l__driver_color_current_tl { gray~0 }
-\AtBeginDocument
+\cs_new_eq:NN \__driver_image_getbb_png:n \__image_extract_bb:n
+\cs_new_eq:NN \__driver_image_getbb_jpg:n \__image_extract_bb:n
+\cs_new_protected:Npn \__driver_image_include_png:n #1
   {
-    \@ifpackageloaded { color }
-      { \tl_set:Nn \l__driver_color_current_tl { \current at color } }
-      { }
+     \tex_special:D
+       {
+         dvisvgm:img~
+         \dim_to_decimal:n { \l__image_ury_dim } ~
+         \dim_to_decimal:n { \l__image_ury_dim } ~
+         \__driver_image_include_bitmap_quote:w #1 " " \q_stop
+       }
   }
-\cs_new_protected:Npn \__driver_color_ensure_current:
-  {
-    \tex_special:D { color~push~\l__driver_color_current_tl }
-    \group_insert_after:N \__driver_color_reset:
-  }
-\cs_new_protected:Npn \__driver_color_reset:
-  { \tex_special:D { color~pop } }
+\cs_new_eq:NN \__driver_image_include_jpg:n \__driver_image_include_png:n
+\cs_new:Npn \__driver_image_include_bitmap_quote:w #1 " #2 " #3 \q_stop { #1#2 }
 \cs_new_eq:NN \__driver_draw_literal:n \__driver_literal:n
 \cs_generate_variant:Nn \__driver_draw_literal:n { x }
 \cs_new_protected:Npn \__driver_draw_begin:

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def	2017-07-15 21:27:01 UTC (rev 44813)
@@ -22,6 +22,66 @@
 \ProvidesExplFile
   {l3pdfmode.def}{2017/03/18}{}
   {L3 Experimental driver: PDF mode}
+\AtBeginDocument
+  {
+    \@ifpackageloaded { color }
+      {
+        \cs_new_protected:Npn \__driver_color_pickup:
+          {
+            \tl_set:Nx \l__color_current_tl
+              {
+                \exp_after:wN \__driver_color_pickup_aux:w
+                  \current at color ~ 0 ~ 0 ~ 0 \q_stop
+              }
+          }
+        \cs_new:Npn \__driver_color_pickup_aux:w #1 ~ #2 ~ #3 ~ #4 ~ #5 ~ #6 \q_stop
+          {
+            \str_if_eq:nnTF {#2} { g }
+              { gray ~ #1 }
+              {
+                \str_if_eq:nnTF {#4} { rg }
+                  { rgb ~ #1 ~ #2 ~ #3 }
+                  {
+                    \str_if_eq:nnTF {#5} { k }
+                      { cmyk ~ #1 ~ #2 ~ #3 ~ #4 }
+                      { gray ~ #1 }
+                  }
+              }
+          }
+      }
+      { \cs_new_protected:Npn \__driver_color_pickup: { } }
+  }
+\int_new:N \l__driver_color_stack_int
+\cs_new_protected:Npx \__driver_color_ensure_current:
+  {
+    \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
+            \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
+  { #1 ~ g ~ #1 ~ G }
+\cs_new:Npn \__driver_color_convert_cmyk:w #1 ~ #2 ~ #3 ~ #4 \q_stop
+  { #1 ~ #2 ~ #3 ~ rg ~ #1 ~ #2 ~ #3 ~ RG }
+\cs_new:Npn \__driver_color_convert_rgb:w #1 ~ #2 ~ #3 ~ #4 ~ #5 \q_stop
+  { #1 ~ #2 ~ #3 ~ #4 ~ k ~ #1 ~ #2 ~ #3 ~ #4 ~ K }
+\cs_new_protected:Npx \__driver_color_reset:
+  {
+    \cs_if_exist:NTF \luatex_pdfextension:D
+      { \luatex_pdfextension:D colorstack }
+      { \pdftex_pdfcolorstack:D }
+        \exp_not:N \l__driver_color_stack_int pop \scan_stop:
+  }
 \cs_new_protected:Npx \__driver_literal:n #1
   {
     \cs_if_exist:NTF \luatex_pdfextension:D
@@ -101,49 +161,30 @@
     \hbox_overlap_right:n { \box_use:N #1 }
     \__driver_scope_end:
   }
-\tl_new:N \l__driver_color_current_tl
-\tl_set:Nn \l__driver_color_current_tl { 0~g~0~G }
-\AtBeginDocument
-  {
-    \@ifpackageloaded { color }
-      { \tl_set:Nn \l__driver_color_current_tl { \current at color } }
-      { }
-  }
-\int_new:N \l__driver_color_stack_int
-\cs_new_protected:Npx \__driver_color_ensure_current:
-  {
-    \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 \l__driver_color_current_tl }
-    \group_insert_after:N \exp_not:N \__driver_color_reset:
-  }
-\cs_new_protected:Npx \__driver_color_reset:
-  {
-    \cs_if_exist:NTF \luatex_pdfextension:D
-      { \luatex_pdfextension:D colorstack }
-      { \pdftex_pdfcolorstack:D }
-        \exp_not:N \l__driver_color_stack_int pop \scan_stop:
-  }
 \tl_new:N \l__driver_image_attr_tl
 \cs_new_protected:Npn \__driver_image_getbb_jpg:n #1
   {
     \int_zero:N \l__image_page_int
+    \tl_clear:N \l__image_pagebox_tl
     \tl_set:Nx \l__driver_image_attr_tl
       {
+        \tl_if_empty:NF \l__image_decode_tl
+          { :D \l__image_decode_tl }
         \bool_if:NT \l__image_interpolate_bool
           { :I }
       }
+    \tl_clear:N \l__driver_image_attr_tl
     \__driver_image_getbb_auxi:n {#1}
   }
 \cs_new_eq:NN \__driver_image_getbb_png:n \__driver_image_getbb_jpg:n
 \cs_new_protected:Npn \__driver_image_getbb_pdf:n #1
   {
+    \tl_clear:N \l__image_decode_tl
     \bool_set_false:N \l__image_interpolate_bool
     \tl_set:Nx \l__driver_image_attr_tl
       {
-        \int_compare:nNnT \l__image_page_int > 0
+        : \l__image_pagebox_tl
+        \int_compare:nNnT \l__image_page_int > 1
           { :P \int_use:N \l__image_page_int }
       }
     \__driver_image_getbb_auxi:n {#1}
@@ -150,12 +191,14 @@
   }
 \cs_new_protected:Npn \__driver_image_getbb_auxi:n #1
   {
-    \dim_if_exist:cTF { c__image_ #1 \l__driver_image_attr_tl _ht_dim }
+    \dim_zero:N \l__image_llx_dim
+    \dim_zero:N \l__image_lly_dim
+    \dim_if_exist:cTF { c__image_ #1 \l__driver_image_attr_tl _urx_dim }
       {
-        \dim_set_eq:Nc \l__image_ht_dim
-          { c__image_ #1 \l__driver_image_attr_tl _ht_dim }
-        \dim_set_eq:Nc \l__image_wd_dim
-          { c__image_ #1 \l__driver_image_attr_tl _wd_dim }
+        \dim_set_eq:Nc \l__image_urx_dim
+          { c__image_ #1 \l__driver_image_attr_tl _urx_dim }
+        \dim_set_eq:Nc \l__image_ury_dim
+          { c__image_ #1 \l__driver_image_attr_tl _ury_dim }
       }
       { \__driver_image_getbb_auxii:n {#1} }
   }
@@ -162,21 +205,33 @@
 \cs_new_protected:Npn \__driver_image_getbb_auxii:n #1
   {
     \tex_immediate:D \pdftex_pdfximage:D
-      \bool_if:NT \l__image_interpolate_bool
-        { attr ~ { /Interpolate~true } }
+      \bool_lazy_or:nnT
+        { \l__image_interpolate_bool }
+        { ! \tl_if_empty_p:N \l__image_decode_tl }
+        {
+          attr ~
+            {
+              \tl_if_empty:NF \l__image_decode_tl
+                { /Decode~[ \l__image_decode_tl ] }
+              \bool_if:NT \l__image_interpolate_bool
+                { /Interpolate~true }
+            }
+        }
       \int_compare:nNnT \l__image_page_int > 0
         { page ~ \int_use:N \l__image_page_int }
+      \tl_if_empty:NF \l__image_pagebox_tl
+        { \l__image_pagebox_tl }
       {#1}
     \hbox_set:Nn \l__image_tmp_box
       { \pdftex_pdfrefximage:D \pdftex_pdflastximage:D }
-    \dim_set:Nn \l__image_ht_dim { \box_ht:N \l__image_tmp_box }
-    \dim_set:Nn \l__image_wd_dim { \box_wd:N \l__image_tmp_box }
+    \dim_set:Nn \l__image_urx_dim { \box_wd:N \l__image_tmp_box }
+    \dim_set:Nn \l__image_ury_dim { \box_ht:N \l__image_tmp_box }
     \int_const:cn { c__image_ #1 \l__driver_image_attr_tl _int }
       { \tex_the:D \pdftex_pdflastximage:D }
-    \dim_const:cn { c__image_ #1 \l__driver_image_attr_tl _ht_dim }
-      { \l__image_ht_dim }
-    \dim_const:cn { c__image_ #1 \l__driver_image_attr_tl _wd_dim }
-      { \l__image_wd_dim }
+    \dim_const:cn { c__image_ #1 \l__driver_image_attr_tl _urx_dim }
+      { \l__image_urx_dim }
+    \dim_const:cn { c__image_ #1 \l__driver_image_attr_tl _ury_dim }
+      { \l__image_ury_dim }
   }
 \cs_new_protected:Npn \__driver_image_include_jpg:n #1
   {

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3xdvipdfmx.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3xdvipdfmx.def	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3xdvipdfmx.def	2017-07-15 21:27:01 UTC (rev 44813)
@@ -22,6 +22,22 @@
 \ProvidesExplFile
   {l3xdvidpfmx.def}{2017/03/18}{}
   {L3 Experimental driver: xdvipdfmx}
+\AtBeginDocument
+  {
+    \@ifpackageloaded { color }
+      {
+        \cs_new_protected:Npn \__driver_color_pickup:
+          { \tl_set_eq:NN \l__color_current_tl \current at color }
+      }
+      { \cs_new_protected:Npn \__driver_color_pickup: { } }
+  }
+\cs_new_protected:Npn \__driver_color_ensure_current:
+  {
+    \__driver_color_pickup:
+    \tex_special:D { color~push~\l__color_current_tl }
+  }
+\cs_new_protected:Npn \__driver_color_reset:
+  { \tex_special:D { color~pop } }
 \cs_new_protected:Npn \__driver_literal:n #1
   { \tex_special:D { pdf:literal~ #1 } }
 \cs_new_protected:Npn \__driver_scope_begin:
@@ -68,21 +84,6 @@
     \hbox_overlap_right:n { \box_use:N #1 }
     \__driver_scope_end:
   }
-\tl_new:N \l__driver_color_current_tl
-\tl_set:Nn \l__driver_color_current_tl { [ 0 ] }
-\AtBeginDocument
-  {
-    \@ifpackageloaded { color }
-      { \tl_set:Nn \l__driver_color_current_tl { \current at color } }
-      { }
-  }
-\cs_new_protected:Npn \__driver_color_ensure_current:
-  {
-    \tex_special:D { pdf:bcolor~\l__driver_color_current_tl }
-    \group_insert_after:N \__driver_color_reset:
-  }
-\cs_new_protected:Npn \__driver_color_reset:
-  { \tex_special:D { pdf:ecolor } }
 \cs_new_eq:NN \__driver_image_getbb_eps:n \__image_read_bb:n
 \int_new:N \g__driver_image_int
 \cs_new_protected:Npn \__driver_image_include_eps:n #1
@@ -91,15 +92,17 @@
   }
 \cs_new_protected:Npn \__driver_image_include_jpg:n #1
   { \__driver_image_include_auxi:nn {#1} { image } }
-\cs_new_eq:NN \__driver_image_include_png:n \__driver_image_include_png:n
-\cs_new_protected:Npn \__driver_image_include_pdf:n #1
-  { \__driver_image_include_auxi:nn {#1} { epdf } }
+\cs_new_eq:NN \__driver_image_include_png:n \__driver_image_include_jpg:n
 \cs_new_protected:Npn \__driver_image_include_auxi:nn #1#2
   {
     \__driver_image_include_auxii:xnn
       {
-        \int_compare:nNnT \l__image_page_int > 0
+        \tl_if_empty:NF \l__image_pagebox_tl
+          { : \l__image_pagebox_tl }
+        \int_compare:nNnT \l__image_page_int > 1
           { :P \int_use:N \l__image_page_int }
+        \tl_if_empty:NF \l__image_decode_tl
+          { :D \l__image_decode_tl }
         \bool_if:NT \l__image_interpolate_bool
            { :I }
       }
@@ -123,70 +126,98 @@
       {
         pdf:#3~
         @image \int_use:c { c__image_ #1#2 _int }
-        \int_compare:nNnT \l__image_page_int > 0
+        \int_compare:nNnT \l__image_page_int > 1
           { page ~ \int_use:N \l__image_page_int \c_space_tl }
+        \tl_if_empty:NF \l__image_pagebox_tl
+          {
+            pagebox ~ \l__image_pagebox_tl \c_space_tl
+            bbox ~
+              \dim_to_decimal_in_bp:n \l__image_llx_dim \c_space_tl
+              \dim_to_decimal_in_bp:n \l__image_lly_dim \c_space_tl
+              \dim_to_decimal_in_bp:n \l__image_urx_dim \c_space_tl
+              \dim_to_decimal_in_bp:n \l__image_ury_dim \c_space_tl
+          }
         (#1)
-        \bool_if:NT \l__image_interpolate_bool
-          { <</Interpolate~true>> }
-      }
-  }
-\AtBeginDocument
-  {
-    \@ifpackageloaded { color }
-      {
-        \cs_set_protected:Npn \__driver_tmp:w #1 [ #2 ] #3 \q_stop
+        \bool_lazy_or:nnT
+          { \l__image_interpolate_bool }
+          { ! \tl_if_empty_p:N \l__imge_decode_tl }
           {
-            \tl_if_empty:nT {#2}
-              {
-                \cs_set_protected:Npn \__driver_color_ensure_current:
-                  {
-                    \tex_special:D { color~push~\l__driver_color_current_tl }
-                    \group_insert_after:N \__driver_color_reset:
-                  }
-                \cs_set_protected:Npn \__driver_color_reset:
-                  { \tex_special:D { color~pop } }
-              }
+            <<
+              \tl_if_empty:NF \l__imge_decode_tl
+                { /Decode~[ \l__imge_decode_tl ] }
+              \bool_if:NT \l__image_interpolate_bool
+                { /Interpolate~true> }
+            >>
           }
-        \exp_after:wN \__driver_tmp:w \current at color [ ] \q_stop
       }
-      { }
   }
 \cs_new_protected:Npn \__driver_image_getbb_jpg:n #1
   {
     \int_zero:N \l__image_page_int
+    \tl_clear:N \l__image_pagebox_tl
     \__driver_image_getbb_auxi:nN {#1} \xetex_picfile:D
   }
 \cs_new_eq:NN \__driver_image_getbb_png:n \__driver_image_getbb_jpg:n
 \cs_new_protected:Npn \__driver_image_getbb_pdf:n #1
-  { \__driver_image_getbb_auxi:nN {#1} \xetex_pdffile:D }
+  {
+    \tl_clear:N \l__image_decode_tl
+    \bool_set_false:N \l__image_interpolate_bool
+    \__driver_image_getbb_auxi:nN {#1} \xetex_pdffile:D
+  }
 \cs_new_protected:Npn \__driver_image_getbb_auxi:nN #1#2
   {
-    \int_compare:nNnTF \l__image_page_int > 0
+    \int_compare:nNnTF \l__image_page_int > 1
       { \__driver_image_getbb_auxii:VnN \l__image_page_int {#1} #2  }
       { \__driver_image_getbb_auxiii:nNnn {#1} #2 }
   }
 \cs_new_protected:Npn \__driver_image_getbb_auxii:nnN #1#2#3
-  { \__driver_image_getbb_auxiii:nNnn {#2} #3 { :P #1 } { page #1 } }
+  { \__driver_image_getbb_aux:nNnn {#2} #3 { :P #1 } { page #1 } }
 \cs_generate_variant:Nn \__driver_image_getbb_auxii:nnN { V }
 \cs_new_protected:Npn \__driver_image_getbb_auxiii:nNnn #1#2#3#4
   {
-    \dim_if_exist:cTF { c__image_ #1#3 _ht_dim }
+    \tl_if_empty:NTF \l__image_pagebox_tl
+      { \__driver_image_getbb_auxiv:VnNnn \l__image_pagebox_tl }
+      { \__driver_image_getbb_auxv:nNnn }
+      {#1} #2 {#3} {#4}
+  }
+\cs_new_protected:Npn \__driver_image_getbb_auxiv:nnNnn #1#2#3#4#5
+  {
+    \use:x
       {
-        \dim_set_eq:Nc \l__image_ht_dim { c__image_ #1#3 _ht_dim }
-        \dim_set_eq:Nc \l__image_wd_dim { c__image_ #1#3 _wd_dim }
+        \__driver_image_getbb_auxv:nNnn {#2} #3 { : #1 #4 }
+          { #5 ~ \__driver_image_getbb_pagebox:w #1 }
       }
+  }
+\cs_generate_variant:Nn \__driver_image_getbb_auxiv:nnNnn { V }
+\cs_new_protected:Npn \__driver_image_getbb_auxv:nNnn #1#2#3#4
+  {
+    \dim_zero:N \l__image_llx_dim
+    \dim_zero:N \l__image_lly_dim
+    \dim_if_exist:cTF { c__image_ #1#3 _urx_dim }
+      {
+        \dim_set_eq:Nc \l__image_urx_dim { c__image_ #1#3 _urx_dim }
+        \dim_set_eq:Nc \l__image_ury_dim { c__image_ #1#3 _ury_dim }
+      }
       { \__driver_image_getbb_auxvi:nNnn {#1} #2 {#3} {#4} }
   }
 \cs_new_protected:Npn \__driver_image_getbb_auxvi:nNnn #1#2#3#4
   {
     \hbox_set:Nn \l__image_tmp_box { #2 #1 ~ #4 }
-    \dim_set:Nn \l__image_ht_dim { \box_ht:N \l__image_tmp_box }
-    \dim_set:Nn \l__image_wd_dim { \box_wd:N \l__image_tmp_box }
-    \dim_const:cn { c__image_ #1#3 _ht_dim }
-      { \l__image_ht_dim }
-    \dim_const:cn { c__image_ #1#3 _wd_dim }
-      { \l__image_wd_dim }
+    \dim_set:Nn \l__image_utx_dim { \box_wd:N \l__image_tmp_box }
+    \dim_set:Nn \l__image_ury_dim { \box_ht:N \l__image_tmp_box }
+    \dim_const:cn { c__image_ #1#3 _urx_dim }
+      { \l__image_urx_dim }
+    \dim_const:cn { c__image_ #1#3 _ury_dim }
+      { \l__image_ury_dim }
   }
+\cs_new:Npn \__driver_image_getbb_pagebox:w #1 box {#1}
+\cs_new_protected:Npn \__driver_image_include_pdf:n #1
+  {
+    \xetex_pdffile:D "#1" ~
+      \int_compare:nNnT \l__image_page_int > 0
+        { page~ \int_use:N \l__image_page_int }
+      \__driver_image_getbb_auxiv:VnNnn \l__image_pagebox_tl
+  }
 \cs_new_eq:NN \__driver_draw_literal:n \__driver_literal:n
 \cs_generate_variant:Nn \__driver_draw_literal:n { x }
 \cs_new_protected:Npn \__driver_draw_begin:

Modified: trunk/Master/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty	2017-07-15 21:27:01 UTC (rev 44813)
@@ -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/05/29]
-\@ifpackagelater{expl3}{2017/05/29}
+\RequirePackage{expl3}[2017/07/15]
+\@ifpackagelater{expl3}{2017/07/15}
   {}
   {%
     \PackageError{l3keys2e}{Support package l3kernel too old}
@@ -32,7 +32,7 @@
       }%
     \endinput
   }
-\ProvidesExplPackage{l3keys2e}{2017/05/29}{}
+\ProvidesExplPackage{l3keys2e}{2017/07/15}{}
   {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-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/tex/latex/l3packages/xfp/xfp.sty	2017-07-15 21:27:01 UTC (rev 44813)
@@ -19,21 +19,21 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: xfp.dtx (C) Copyright 2017 The LaTeX3 Project
-\RequirePackage{expl3}[2017/05/29]
-\@ifpackagelater{expl3}{2017/05/29}
+\RequirePackage{expl3}[2017/07/15]
+\@ifpackagelater{expl3}{2017/07/15}
   {}
   {%
-    \PackageError{xfpu}{Support package l3kernel too old}
+    \PackageError{xfp}{Support package l3kernel too old}
       {%
         Please install an up to date version of l3kernel\MessageBreak
         using your TeX package manager or from CTAN.\MessageBreak
         \MessageBreak
-        Loading xfpu will abort!%
+        Loading xfp will abort!%
       }%
     \endinput
   }
 \RequirePackage{xparse}
-\ProvidesExplPackage{xfp}{2017/05/29}{}
+\ProvidesExplPackage{xfp}{2017/07/15}{}
   {L3 Floating point unit}
 \NewExpandableDocumentCommand \fpeval { m } { \fp_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-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/tex/latex/l3packages/xfrac/xfrac.sty	2017-07-15 21:27:01 UTC (rev 44813)
@@ -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/05/29]
-\@ifpackagelater{expl3}{2017/05/29}
+\RequirePackage{expl3}[2017/07/15]
+\@ifpackagelater{expl3}{2017/07/15}
   {}
   {%
     \PackageError{xfrac}{Support package l3kernel too old}
@@ -34,7 +34,7 @@
     \endinput
   }
 \RequirePackage{amstext,graphicx,l3keys2e,textcomp,xparse,xtemplate}
-\ProvidesExplPackage{xfrac}{2017/05/29}{}
+\ProvidesExplPackage{xfrac}{2017/07/15}{}
   {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-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/tex/latex/l3packages/xparse/xparse.sty	2017-07-15 21:27:01 UTC (rev 44813)
@@ -23,8 +23,8 @@
 %%                  (C) Copyright 2004-2008 Frank Mittelbach,
 %%                      The LaTeX3 Project
 %%                  (C) Copyright 2009-2017 The LaTeX3 Project
-\RequirePackage{expl3}[2017/05/29]
-\@ifpackagelater{expl3}{2017/05/29}
+\RequirePackage{expl3}[2017/07/15]
+\@ifpackagelater{expl3}{2017/07/15}
   {}
   {%
     \PackageError{xparse}{Support package l3kernel too old}
@@ -36,7 +36,7 @@
       }%
     \endinput
   }
-\ProvidesExplPackage{xparse}{2017/05/29}{}
+\ProvidesExplPackage{xparse}{2017/07/15}{}
   {L3 Experimental document command parser}
 \tl_const:Nx \c__xparse_no_value_tl
   { \char_generate:nn { `\- } { 11 } NoValue- }

Modified: trunk/Master/texmf-dist/tex/latex/l3packages/xtemplate/xtemplate.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3packages/xtemplate/xtemplate.sty	2017-07-15 21:26:18 UTC (rev 44812)
+++ trunk/Master/texmf-dist/tex/latex/l3packages/xtemplate/xtemplate.sty	2017-07-15 21:27:01 UTC (rev 44813)
@@ -23,8 +23,8 @@
 %%                     (C) Copyright 2004-2010 Frank Mittelbach,
 %%                         The LaTeX3 Project
 %%                     (C) Copyright 2011-2016 The LaTeX3 Project
-\RequirePackage{expl3}[2017/05/29]
-\@ifpackagelater{expl3}{2017/05/29}
+\RequirePackage{expl3}[2017/07/15]
+\@ifpackagelater{expl3}{2017/07/15}
   {}
   {%
     \PackageError{xtemplate}{Support package l3kernel too old}
@@ -36,7 +36,7 @@
       }%
     \endinput
   }
-\ProvidesExplPackage{xtemplate}{2017/05/29}{}
+\ProvidesExplPackage{xtemplate}{2017/07/15}{}
   {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