summaryrefslogtreecommitdiff
path: root/Master
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2017-07-15 21:27:01 +0000
committerKarl Berry <karl@freefriends.org>2017-07-15 21:27:01 +0000
commitb1ce47fe4d0e1f06d1b019c3c6eb5f1b0ecd5e14 (patch)
tree58362abe4b603bb5f6db898b9b835bc8af730b3e /Master
parent03b8dcfa3435f0265dfad4fd09aaab8f4ff9c617 (diff)
l3 (15jul17)
git-svn-id: svn://tug.org/texlive/trunk@44813 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master')
-rw-r--r--Master/texmf-dist/doc/latex/l3experimental/README.md2
-rw-r--r--Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-convert.pdfbin438535 -> 438329 bytes
-rw-r--r--Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-format.pdfbin374969 -> 374749 bytes
-rw-r--r--Master/texmf-dist/doc/latex/l3experimental/xcoffins/xcoffins.pdfbin377050 -> 376845 bytes
-rw-r--r--Master/texmf-dist/doc/latex/l3experimental/xgalley/l3galley.pdfbin390002 -> 389802 bytes
-rw-r--r--Master/texmf-dist/doc/latex/l3experimental/xgalley/xgalley.pdfbin286158 -> 285960 bytes
-rw-r--r--Master/texmf-dist/doc/latex/l3kernel/README.md7
-rw-r--r--Master/texmf-dist/doc/latex/l3kernel/expl3.pdfbin583930 -> 543160 bytes
-rw-r--r--Master/texmf-dist/doc/latex/l3kernel/interface3.pdfbin1619924 -> 1422799 bytes
-rw-r--r--Master/texmf-dist/doc/latex/l3kernel/interface3.tex88
-rw-r--r--Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdfbin263769 -> 263548 bytes
-rw-r--r--Master/texmf-dist/doc/latex/l3kernel/l3obsolete.txt9
-rw-r--r--Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdfbin275656 -> 275400 bytes
-rw-r--r--Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex274
-rw-r--r--Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdfbin215934 -> 215681 bytes
-rw-r--r--Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex101
-rw-r--r--Master/texmf-dist/doc/latex/l3kernel/source3.pdfbin5211679 -> 3332254 bytes
-rw-r--r--Master/texmf-dist/doc/latex/l3kernel/source3.tex106
-rw-r--r--Master/texmf-dist/doc/latex/l3packages/README.md2
-rw-r--r--Master/texmf-dist/doc/latex/l3packages/l3keys2e/l3keys2e.pdfbin328314 -> 328058 bytes
-rw-r--r--Master/texmf-dist/doc/latex/l3packages/xfp/xfp.pdfbin299098 -> 298873 bytes
-rw-r--r--Master/texmf-dist/doc/latex/l3packages/xfrac/xfrac.pdfbin477139 -> 476935 bytes
-rw-r--r--Master/texmf-dist/doc/latex/l3packages/xparse/xparse.pdfbin475642 -> 475427 bytes
-rw-r--r--Master/texmf-dist/doc/latex/l3packages/xtemplate/xtemplate.pdfbin421394 -> 421188 bytes
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3str/l3str-convert.dtx4
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx4
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx4
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx8
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx4
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/expl3.dtx119
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3basics.dtx417
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx19
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3box.dtx175
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx726
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3clist.dtx64
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx42
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3color.dtx39
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx15
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3doc.dtx49
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx14
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx1739
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3expan.dtx122
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3file.dtx891
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3final.dtx6
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3flag.dtx77
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx30
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx20
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx6
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx13
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx33
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx10
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx50
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx4
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx16
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx22
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp.dtx42
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3int.dtx55
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3keys.dtx111
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx230
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3msg.dtx169
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3names.dtx10
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3oldmodules.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3prg.dtx149
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3prop.dtx40
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3quark.dtx16
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3regex.dtx565
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3seq.dtx97
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3skip.dtx71
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3sort.dtx32
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3str.dtx56
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3sys.dtx8
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx14
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3tl.dtx298
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3token.dtx118
-rw-r--r--Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx8
-rw-r--r--Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx16
-rw-r--r--Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx8
-rw-r--r--Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx8
-rw-r--r--Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx8
-rw-r--r--Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-convert.sty2
-rw-r--r--Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty2
-rw-r--r--Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty2
-rw-r--r--Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty6
-rw-r--r--Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty2
-rw-r--r--Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex1594
-rw-r--r--Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex3
-rw-r--r--Master/texmf-dist/tex/latex/l3kernel/expl3.lua119
-rw-r--r--Master/texmf-dist/tex/latex/l3kernel/expl3.sty22
-rw-r--r--Master/texmf-dist/tex/latex/l3kernel/l3doc.cls4
-rw-r--r--Master/texmf-dist/tex/latex/l3kernel/l3dvipdfmx.def67
-rw-r--r--Master/texmf-dist/tex/latex/l3kernel/l3dvips.def33
-rw-r--r--Master/texmf-dist/tex/latex/l3kernel/l3dvisvgm.def41
-rw-r--r--Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def133
-rw-r--r--Master/texmf-dist/tex/latex/l3kernel/l3xdvipdfmx.def137
-rw-r--r--Master/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty6
-rw-r--r--Master/texmf-dist/tex/latex/l3packages/xfp/xfp.sty10
-rw-r--r--Master/texmf-dist/tex/latex/l3packages/xfrac/xfrac.sty6
-rw-r--r--Master/texmf-dist/tex/latex/l3packages/xparse/xparse.sty6
-rw-r--r--Master/texmf-dist/tex/latex/l3packages/xtemplate/xtemplate.sty6
104 files changed, 5899 insertions, 3774 deletions
diff --git a/Master/texmf-dist/doc/latex/l3experimental/README.md b/Master/texmf-dist/doc/latex/l3experimental/README.md
index ccac875f177..81a36e7abea 100644
--- a/Master/texmf-dist/doc/latex/l3experimental/README.md
+++ b/Master/texmf-dist/doc/latex/l3experimental/README.md
@@ -1,7 +1,7 @@
Experimental LaTeX3 Concepts
============================
-Release 2017/05/29
+Release 2017/07/15
Overview
--------
diff --git a/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-convert.pdf b/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-convert.pdf
index 0ff1e19524b..a34ab877ee5 100644
--- a/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-convert.pdf
+++ b/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-convert.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-format.pdf b/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-format.pdf
index a84ed19f4fc..6fa85398db8 100644
--- a/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-format.pdf
+++ b/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-format.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/l3experimental/xcoffins/xcoffins.pdf b/Master/texmf-dist/doc/latex/l3experimental/xcoffins/xcoffins.pdf
index b0474719904..439eb182dfb 100644
--- a/Master/texmf-dist/doc/latex/l3experimental/xcoffins/xcoffins.pdf
+++ b/Master/texmf-dist/doc/latex/l3experimental/xcoffins/xcoffins.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/l3experimental/xgalley/l3galley.pdf b/Master/texmf-dist/doc/latex/l3experimental/xgalley/l3galley.pdf
index 4f6675280b8..d3636444b4f 100644
--- a/Master/texmf-dist/doc/latex/l3experimental/xgalley/l3galley.pdf
+++ b/Master/texmf-dist/doc/latex/l3experimental/xgalley/l3galley.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/l3experimental/xgalley/xgalley.pdf b/Master/texmf-dist/doc/latex/l3experimental/xgalley/xgalley.pdf
index 1b9b2c657dc..42baade9067 100644
--- a/Master/texmf-dist/doc/latex/l3experimental/xgalley/xgalley.pdf
+++ b/Master/texmf-dist/doc/latex/l3experimental/xgalley/xgalley.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/l3kernel/README.md b/Master/texmf-dist/doc/latex/l3kernel/README.md
index 1e941253eee..bd25e8d24f7 100644
--- a/Master/texmf-dist/doc/latex/l3kernel/README.md
+++ b/Master/texmf-dist/doc/latex/l3kernel/README.md
@@ -1,7 +1,7 @@
LaTeX3 Programming Conventions
==============================
-Release 2017/05/29
+Release 2017/07/15
Overview
--------
@@ -30,15 +30,14 @@ Requirements
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
* 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.
diff --git a/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf b/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf
index 374371230f6..b68a5d86840 100644
--- a/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf
+++ b/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf b/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf
index 18de9660f4d..a94745436db 100644
--- a/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf
+++ b/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/l3kernel/interface3.tex b/Master/texmf-dist/doc/latex/l3kernel/interface3.tex
new file mode 100644
index 00000000000..d71383d0c9f
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/l3kernel/interface3.tex
@@ -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@latex-project.org}
+ {latex-team@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}
+
+
diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf
index 0dd679911d9..365f3beb8a4 100644
--- a/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf
+++ b/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3obsolete.txt b/Master/texmf-dist/doc/latex/l3kernel/l3obsolete.txt
index 5d8e254af51..981f95f5303 100644
--- a/Master/texmf-dist/doc/latex/l3kernel/l3obsolete.txt
+++ b/Master/texmf-dist/doc/latex/l3kernel/l3obsolete.txt
@@ -18,7 +18,16 @@ Function Expires end
\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
diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf
index 0a9b12ea552..a28e2302945 100644
--- a/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf
+++ b/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex b/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex
new file mode 100644
index 00000000000..49f32251b4a
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex
@@ -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@latex-project.org}%
+ {latex-team@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}
diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf
index 878e47efdf5..0caa11d028d 100644
--- a/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf
+++ b/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex b/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex
new file mode 100644
index 00000000000..3e93fa0704f
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex
@@ -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@latex-project.org}%
+ {latex-team@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}
diff --git a/Master/texmf-dist/doc/latex/l3kernel/source3.pdf b/Master/texmf-dist/doc/latex/l3kernel/source3.pdf
index ac3ebd9ad71..75cfec6429d 100644
--- a/Master/texmf-dist/doc/latex/l3kernel/source3.pdf
+++ b/Master/texmf-dist/doc/latex/l3kernel/source3.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/l3kernel/source3.tex b/Master/texmf-dist/doc/latex/l3kernel/source3.tex
new file mode 100644
index 00000000000..3a97669a2c5
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/l3kernel/source3.tex
@@ -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@latex-project.org}
+ {latex-team@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}
diff --git a/Master/texmf-dist/doc/latex/l3packages/README.md b/Master/texmf-dist/doc/latex/l3packages/README.md
index 4a157fa5454..27bdaf3c5ef 100644
--- a/Master/texmf-dist/doc/latex/l3packages/README.md
+++ b/Master/texmf-dist/doc/latex/l3packages/README.md
@@ -1,7 +1,7 @@
LaTeX3 High-Level Concepts
==========================
-Release 2017/05/29
+Release 2017/07/15
Overview
--------
diff --git a/Master/texmf-dist/doc/latex/l3packages/l3keys2e/l3keys2e.pdf b/Master/texmf-dist/doc/latex/l3packages/l3keys2e/l3keys2e.pdf
index 31796912bb4..f9bb3681534 100644
--- a/Master/texmf-dist/doc/latex/l3packages/l3keys2e/l3keys2e.pdf
+++ b/Master/texmf-dist/doc/latex/l3packages/l3keys2e/l3keys2e.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/l3packages/xfp/xfp.pdf b/Master/texmf-dist/doc/latex/l3packages/xfp/xfp.pdf
index b8f1965546a..1722e823e6f 100644
--- a/Master/texmf-dist/doc/latex/l3packages/xfp/xfp.pdf
+++ b/Master/texmf-dist/doc/latex/l3packages/xfp/xfp.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/l3packages/xfrac/xfrac.pdf b/Master/texmf-dist/doc/latex/l3packages/xfrac/xfrac.pdf
index f253fe27bd6..0cca078e3af 100644
--- a/Master/texmf-dist/doc/latex/l3packages/xfrac/xfrac.pdf
+++ b/Master/texmf-dist/doc/latex/l3packages/xfrac/xfrac.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/l3packages/xparse/xparse.pdf b/Master/texmf-dist/doc/latex/l3packages/xparse/xparse.pdf
index ee5762fe637..e0c26f86b2f 100644
--- a/Master/texmf-dist/doc/latex/l3packages/xparse/xparse.pdf
+++ b/Master/texmf-dist/doc/latex/l3packages/xparse/xparse.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/l3packages/xtemplate/xtemplate.pdf b/Master/texmf-dist/doc/latex/l3packages/xtemplate/xtemplate.pdf
index d62d369132e..d038dd6763e 100644
--- a/Master/texmf-dist/doc/latex/l3packages/xtemplate/xtemplate.pdf
+++ b/Master/texmf-dist/doc/latex/l3packages/xtemplate/xtemplate.pdf
Binary files differ
diff --git a/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-convert.dtx b/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-convert.dtx
index 5d0300e6f4b..66fdbfa57ad 100644
--- a/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-convert.dtx
+++ b/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-convert.dtx
@@ -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}
%
diff --git a/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx b/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx
index 56111fade54..f2fa9a21e75 100644
--- a/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx
+++ b/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx
@@ -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>
diff --git a/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx b/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx
index 7f57f213d87..c7d7306c484 100644
--- a/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx
+++ b/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx
@@ -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}
%
diff --git a/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx b/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx
index b030677562f..1ce666677fb 100644
--- a/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx
+++ b/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx
@@ -24,8 +24,8 @@
%<*driver|package>
% The version of expl3 required is tested as early as possible, as
% some really old versions do not define \ProvidesExplPackage.
-\RequirePackage{expl3}[2017/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}
diff --git a/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx b/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx
index 23a75e2c37d..8a5209af0fd 100644
--- a/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx
+++ b/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx
@@ -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}
diff --git a/Master/texmf-dist/source/latex/l3kernel/expl3.dtx b/Master/texmf-dist/source/latex/l3kernel/expl3.dtx
index cc7493c71e3..8af4d9ce93f 100644
--- a/Master/texmf-dist/source/latex/l3kernel/expl3.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/expl3.dtx
@@ -21,7 +21,7 @@
% for those people who are interested.
%
%<*driver|generic|package>
-\def\ExplFileDate{2017/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@list
% \end{verbatim}
% This code could be improved further by using a sequence |\l_group_seq|
% rather than the bare token list |\group@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,21 +920,30 @@
% 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
% 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@expl@check@declarations@bool ,
-% \l@expl@log@functions@bool
+% \l@expl@log@functions@bool ,
+% \l@expl@enable@debug@bool
% }
% \begin{variable}[int]{\l@expl@options@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@create@bool@option[2]%
{%
@@ -1193,7 +1208,9 @@
}
\expl@create@bool@option{check-declarations}\l@expl@check@declarations@bool
\expl@create@bool@option{log-functions}\l@expl@log@functions@bool
+\expl@create@bool@option{enable-debug}\l@expl@enable@debug@bool
\let\expl@create@bool@option\@undefined
+\chardef\l@expl@enable@debug@bool=0 %
\newcommand*\l@expl@options@clist{}
\DeclareOption*
{%
@@ -1207,6 +1224,12 @@
\fi
}
\ProcessOptions\relax
+\ifodd\l@expl@check@declarations@bool
+ \chardef\l@expl@enable@debug@bool=1 %
+\fi
+\ifodd\l@expl@log@functions@bool
+ \chardef\l@expl@enable@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@expl@check@declarations@bool ,
-% \l@expl@log@functions@bool
+% \l@expl@log@functions@bool ,
+% \l@expl@enable@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@expl@check@declarations@bool = 0 %
\chardef \l@expl@log@functions@bool = 0 %
+\chardef \l@expl@enable@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}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx b/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx
index 989cd514177..35abf3765d7 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx b/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx
index f37f4bcc4b4..260e328e5c8 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2017/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,22 +781,22 @@
% \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}
%
% \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,21 +1177,39 @@
% \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}
@@ -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@expl@log@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@expl@enable@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@expl@log@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@expl@enable@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@expl@log@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@expl@check@declarations@bool
- \cs_set_protected:Npn \__chk_if_exist_var:N #1
+\tex_ifodd:D \l@expl@enable@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@expl@check@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}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx b/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx
index 11032c534dd..161ac10180d 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx
@@ -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}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3box.dtx b/Master/texmf-dist/source/latex/l3kernel/l3box.dtx
index 5bc3bd3c2ce..7b27571dee6 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3box.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3box.dtx
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2017/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
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx b/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx
index aeb2ce1469b..e8f04f06024 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx
@@ -42,7 +42,7 @@
% }^^A
% }
%
-% \date{Released 2017/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,51 +1588,121 @@
%<@@=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.
% \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,6 +2730,24 @@
{ \@@_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)
@@ -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_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_ #1 _ \token_to_str:N #2 _tl }
- { \@@_change_case_char_auxii:nN {#1} #2 }
+ \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,10 +2849,19 @@
% 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 }
{
@@ -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,51 @@
\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}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
@@ -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}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx b/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx
index 3ae99922226..52e656a701d 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2017/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.
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx b/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx
index c571516ea79..9e37e602bf8 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2017/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,14 +512,14 @@
\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 }
\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
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3color.dtx b/Master/texmf-dist/source/latex/l3kernel/l3color.dtx
index 7201aac2abc..6fca2d5caf0 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3color.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3color.dtx
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2017/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,10 +126,22 @@
% 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}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx b/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx
index 4b6f1c28f3a..b8a7f5fdee2 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2017/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:
}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx b/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx
index 489a6a68f93..08ae366efed 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx
@@ -70,14 +70,14 @@ and all files in that bundle must be distributed together.
% This isn't included in the typeset documentation because it's a bit
% ugly:
%<*class>
-\ProvidesExplClass{l3doc}{2017/05/29}{}
+\ProvidesExplClass{l3doc}{2017/07/15}{}
{L3 Experimental documentation class}
%</class>
% \fi
%
% \title{The \cls{l3doc} class}
% \author{\Team}
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
% \maketitle
% \tableofcontents
%
@@ -96,7 +96,7 @@ and all files in that bundle must be distributed together.
% 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 @@ and all files in that bundle must be distributed together.
% 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 @@ and all files in that bundle must be distributed together.
% 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 @@ and all files in that bundle must be distributed together.
% 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 @@ and all files in that bundle must be distributed together.
% \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 @@ and all files in that bundle must be distributed together.
% 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 @@ and all files in that bundle must be distributed together.
% \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 @@ and all files in that bundle must be distributed together.
% }
% 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 @@ and all files in that bundle must be distributed together.
%
% \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 @@ and all files in that bundle must be distributed together.
\@@_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 @@ and all files in that bundle must be distributed together.
% \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}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx b/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx
index dd8b978269a..73912b764a1 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx
@@ -61,7 +61,7 @@
% }^^A
% }
%
-% \date{Released 2017/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
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx b/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx
index 68bb90ec8cc..c6ecb231a2f 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx
@@ -45,7 +45,7 @@
% }^^A
% }
%
-% \date{Released 2017/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@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@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@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,64 +1407,84 @@
% 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}
}
\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} }
}
% \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@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@color [ ] \q_stop
- }
- { }
- }
-%</package>
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
% \subsection{Images}
%
% \begin{macro}[int]
@@ -1085,50 +1766,99 @@
% \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
+ {
+ \@@_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_ht_dim { c__image_ #1#3 _ht_dim }
- \dim_set_eq:Nc \l__image_wd_dim { c__image_ #1#3 _wd_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>
@@ -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@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@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}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx b/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx
index ae03bfb7cb8..c5c7a073aaa 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2017/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,30 +1781,36 @@
% \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}
\@@_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}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3file.dtx b/Master/texmf-dist/source/latex/l3kernel/l3file.dtx
index a3ceb04d1cf..8f6235bca9c 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3file.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3file.dtx
@@ -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,28 +53,54 @@
% 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.
%
% 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@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}
@@ -82,21 +109,48 @@
% \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}
@@ -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.
-% \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.
+% 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}
%
% \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,23 +644,39 @@
% 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}
@@ -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,100 +855,90 @@
% 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_@@_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 { \iow_char:N ##1 }
+ \char_set_active_eq:NN ##1 \l_@@_tmp_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@path
{
- \seq_set_eq:NN \l_@@_saved_search_path_seq
- \l_@@_search_path_seq
- \seq_set_split:NnV \l_@@_internal_seq { , } \input@path
- \seq_concat:NNN \l_@@_search_path_seq
- \l_@@_search_path_seq \l_@@_internal_seq
+ \tl_map_inline:Nn \input@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@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}
@@ -854,24 +946,37 @@
%
% \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: }
}
% \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 }
- }
-% \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 } }
- }
+ \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 }
}
\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: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}
}
-\cs_generate_variant:Nn \@@_input_aux:n { o }
% \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,21 +1601,21 @@
{
\@@_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:
\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@edef} is
+% As using the generic loader means that \cs{protected@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,6 +2437,64 @@
% \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}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3final.dtx b/Master/texmf-dist/source/latex/l3kernel/l3final.dtx
index d49b33d33da..1a09fdf2ec4 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3final.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3final.dtx
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2017/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
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx b/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx
index 8c12450f32a..2923b1cbe62 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2017/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@expl@enable@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,48 +319,6 @@
% \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@expl@check@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}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx
index af396801a00..de23e977006 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx
@@ -38,7 +38,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
% \maketitle
%
% \begin{documentation}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx
index 58c67b9cf57..eadf3479acc 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2017/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}.
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx
index 8a8e233edc5..ae6a2ad07b0 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx
@@ -38,7 +38,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2017/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$.
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx
index ae0c958d999..bde140cea7e 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2017/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;
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx
index 521bdae30e6..b0731d99868 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx
@@ -38,7 +38,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2017/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;
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx
index 286d320973c..1144d72e0ac 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx
@@ -38,7 +38,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2017/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
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx
index ff54b840a59..af6f55373a7 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx
@@ -38,7 +38,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2017/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}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx
index b0abdd5abac..f83cd642d62 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx
@@ -38,7 +38,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2017/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,22 +541,22 @@
% 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} }
% \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}.
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx
index ebe0d53cb5c..ec0829787e3 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx
@@ -38,7 +38,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2017/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:
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx
index 8b88920c57e..ccc13714253 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2017/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 @
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx
index 9a3a94ffc53..df5477dc2cd 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx
@@ -38,7 +38,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
% \maketitle
%
% \begin{documentation}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx
index d5c48436db4..4ff2e34c2bd 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx
@@ -38,7 +38,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2017/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
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx
index 6eb6e2b68e1..2293af64152 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx
@@ -47,7 +47,7 @@
% }^^A
% }
%
-% \date{Released 2017/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}).
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3int.dtx b/Master/texmf-dist/source/latex/l3kernel/l3int.dtx
index d5b6eb60ace..fba1893a993 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3int.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3int.dtx
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2017/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
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx b/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx
index e64ee21f1bb..c8da27656d9 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx
@@ -42,7 +42,7 @@
% }^^A
% }
%
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx b/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx
index 2b1deb80434..6f4847fd0d2 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2017/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
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx b/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx
index b83cc86cde1..80ec22a2e2a 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2017/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,14 +128,6 @@
% 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.strcmp}
-% \begin{syntax}
-% \cs{l3kernel.strcmp}|(|\meta{str one}, \meta{str two}|)|
-% \end{syntax}
-% Compares the two strings and returns |0| to \TeX{}
-% if the two are identical.
-% \end{function}
-%
% \begin{function}{l3kernel.charcat}
% \begin{syntax}
% \cs{l3kernel.charcat}|(|\meta{charcode}, \meta{catcode}|)|
@@ -144,6 +136,41 @@
% 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}|)|
+% \end{syntax}
+% Compares the two strings and returns |0| to \TeX{}
+% if the two are identical.
+% \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 @@ l3kernel = l3kernel or { }
% \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 @@ l3kernel.strcmp = strcmp
% 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}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx b/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx
index 8e6a6525406..d71000c896d 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2017/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,20 +87,19 @@
% \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}
% \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,16 +478,16 @@
% ! <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}
% |'''''''''''''''''''''''''''''''''''''''''''''''
% | <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@expl@log@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@expl@check@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@expl@enable@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}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3names.dtx b/Master/texmf-dist/source/latex/l3kernel/l3names.dtx
index 805700f73c8..3ade94184a8 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3names.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3names.dtx
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2017/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
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3oldmodules.dtx b/Master/texmf-dist/source/latex/l3kernel/l3oldmodules.dtx
index a8750f614c2..2340345b14a 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3oldmodules.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3oldmodules.dtx
@@ -42,7 +42,7 @@
% }
%
%
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx b/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx
index b74c712d0a4..b54376773d6 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2017/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@expl@check@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,14 +1020,14 @@
% 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
% 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
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx b/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx
index 5545dbec4b0..2d3ecc3bbd2 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2017/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}
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx b/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx
index 86be080ee8a..6b5f79741c3 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2017/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}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx b/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx
index fd57d6736cb..625907bf5a0 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2017/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,26 +559,29 @@
% \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
% { 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,15 +667,13 @@
%
% 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}
%
% 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,21 +763,25 @@
% 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.
% \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,18 +1245,18 @@
% \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:
}
\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,17 +3005,38 @@
\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
}
}
% \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,14 +4237,14 @@
}
\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:
}
\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,15 +4281,15 @@
% 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.
%
% 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,14 +5076,14 @@
{#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: }
\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,14 +5333,26 @@
\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
+ }
}
}
}
% \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,20 +6107,20 @@
%
% 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~
'\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,14 +6198,14 @@
%
% 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~
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,27 +6217,34 @@
%
% 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~
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~
'\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,14 +6277,14 @@
%
% 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~
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,21 +6330,21 @@
%
% 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~
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~
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,7 +6365,17 @@
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~
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx b/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx
index 3af96d7ad28..9d724ec4715 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2017/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
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx b/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx
index e43dd6320b6..8f2e175ecaa 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx
@@ -42,7 +42,7 @@
% }^^A
% }
%
-% \date{Released 2017/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}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx b/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx
index 009d228859e..98e256c3b29 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2017/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,14 +585,14 @@
\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:
}
\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~
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3str.dtx b/Master/texmf-dist/source/latex/l3kernel/l3str.dtx
index 3739bc8a766..1642d85a1ee 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3str.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3str.dtx
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2017/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
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx b/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx
index c21509d6f1d..559a20d56df 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2017/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,14 +113,14 @@
% \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.
% \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}
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx b/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx
index d427b756056..d5ca22491ab 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx
@@ -42,7 +42,7 @@
% }^^A
% }
%
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
%
% \maketitle
%
@@ -344,14 +344,14 @@
% \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.
%
% 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
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx b/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx
index 268c8616a55..06882053001 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx
@@ -42,7 +42,7 @@
% }^^A
% }
%
-% \date{Released 2017/05/29}
+% \date{Released 2017/07/15}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx b/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx
index e0124c53a60..82d13e8cb54 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2017/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,26 +1154,54 @@
%
% \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@expl@enable@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}
%
% \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@expl@check@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,14 +2615,14 @@
\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}
% \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}.
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3token.dtx b/Master/texmf-dist/source/latex/l3kernel/l3token.dtx
index 3d9f02a2b1c..ecbc69d46b4 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3token.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3token.dtx
@@ -41,7 +41,7 @@
% }^^A
% }
%
-% \date{Released 2017/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,18 +932,18 @@
% \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
% \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,18 +951,18 @@
% \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
% \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,15 +970,15 @@
% \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
% \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}
diff --git a/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx b/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx
index fcc6c4e6dfd..7d93a5cad0e 100644
--- a/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx
+++ b/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx
@@ -23,8 +23,8 @@
%<*driver|package>
% The version of expl3 required is tested as early as possible, as
% some really old versions do not define \ProvidesExplPackage.
-\RequirePackage{expl3}[2017/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}
%
diff --git a/Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx b/Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx
index dd3477874f9..f5af0b21774 100644
--- a/Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx
+++ b/Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx
@@ -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,14 +136,14 @@
%
% \begin{implementation}
%
-% \section{\pkg{xfpu} implementation}
+% \section{\pkg{xfp} implementation}
%
% \begin{macrocode}
%<*package>
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{xfp}{2017/05/29}{}
+\ProvidesExplPackage{xfp}{2017/07/15}{}
{L3 Floating point unit}
% \end{macrocode}
%
diff --git a/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx b/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx
index cfdfc5d5e9f..289e1932800 100644
--- a/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx
+++ b/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx
@@ -24,8 +24,8 @@
%<*driver|package>
% The version of expl3 required is tested as early as possible, as
% some really old versions do not define \ProvidesExplPackage.
-\RequirePackage{expl3}[2017/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}
%
diff --git a/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx b/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx
index 98e99bfbd88..9f43230d35c 100644
--- a/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx
+++ b/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx
@@ -27,8 +27,8 @@
%<*driver|package>
% The version of expl3 required is tested as early as possible, as
% some really old versions do not define \ProvidesExplPackage.
-\RequirePackage{expl3}[2017/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}
%
diff --git a/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx b/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx
index 3ceba577192..6e02cb5befd 100644
--- a/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx
+++ b/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx
@@ -27,8 +27,8 @@
%<*driver|package>
% The version of expl3 required is tested as early as possible, as
% some really old versions do not define \ProvidesExplPackage.
-\RequirePackage{expl3}[2017/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}
%
diff --git a/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-convert.sty b/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-convert.sty
index 934457dae78..e6eea5f4b15 100644
--- a/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-convert.sty
+++ b/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-convert.sty
@@ -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 } }
diff --git a/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty b/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty
index b638c905b0a..fa88bb5ca45 100644
--- a/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty
+++ b/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty
@@ -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 }
diff --git a/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty b/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty
index 4158ff85dbd..bc90583cfa7 100644
--- a/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty
+++ b/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty
@@ -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 }
{
diff --git a/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty b/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty
index 9f687c7e4f5..d436dff2ad9 100644
--- a/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty
+++ b/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty
@@ -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
diff --git a/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty b/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty
index 53ce196568a..033fd58bc4f 100644
--- a/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty
+++ b/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty
@@ -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
diff --git a/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex b/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex
index ed3ba7dd47d..6bf8dcf4de8 100644
--- a/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex
+++ b/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex
@@ -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@expl@log@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@expl@enable@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@expl@log@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@expl@enable@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@expl@log@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@expl@check@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@expl@enable@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@expl@check@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,24 +2576,29 @@
\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}
\__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@expl@enable@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@expl@check@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@expl@enable@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@expl@check@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,74 +5736,34 @@
\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 }
\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@expl@check@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@expl@log@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@expl@check@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@expl@enable@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
- {
- \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
- {
- 0 \tl_map_function:NN \l__file_internal_name_tl
- \__file_name_sanitize_aux:n
- }
- { 2 }
- }
- = 0
+\group_begin:
+ \cs_set_protected:Npn \__file_tmp:w #1#2#3
+ {
+ \tl_if_blank:nTF {#1}
{
- \tl_remove_all:Nn \l__file_internal_name_tl { " }
- \tl_if_in:NnT \l__file_internal_name_tl { ~ }
+ \cs_set:Npn \__file_tmp:w ##1 " ##2 " ##3 \q_stop { { } {##2} { } }
+ \seq_gput_right:Nx \g__file_stack_seq
{
- \tl_set:Nx \l__file_internal_name_tl
- { " \exp_not:V \l__file_internal_name_tl " }
+ \exp_after:wN \__file_tmp:w \tex_jobname:D
+ " \tex_jobname:D " \q_stop
}
}
{
- \__msg_kernel_error:nnx
- { kernel } { unbalanced-quote-in-filename }
- { \l__file_internal_name_tl }
+ \seq_gput_right:Nn \g__file_stack_seq { { } {#1} {#2} }
+ \__file_tmp:w
}
- \use:x
+ }
+ \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
{
- \group_end:
- \exp_not:n {#2} { \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
}
+ \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
- {
- \__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
+\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 \__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@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@path
- \seq_concat:NNN \l__file_search_path_seq
- \l__file_search_path_seq \l__file_internal_seq
+ \tl_map_inline:Nn \input@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@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 { . } }
+ {
+ \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
{
- \clist_map_inline:Nn \@filelist
+ \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 }
+ }
+ \__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
+ ............
}
- \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 { ************* }
}
+\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,26 +8809,25 @@
\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:
\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,14 +16310,14 @@
\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:
}
\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,20 +16454,20 @@
\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:~
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,21 +17059,21 @@
}
\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:
}
\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,18 +17138,18 @@
{ \__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:
}
\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,14 +18840,14 @@
}
\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:
}
\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,14 +19167,14 @@
{#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: }
\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,20 +19720,20 @@
}
}
}
-\__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~
'\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,20 +19741,20 @@
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'.~
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,14 +19794,14 @@
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~
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,27 +19809,34 @@
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~
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~
'\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,14 +19865,14 @@
{ 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~
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,33 +19892,33 @@
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~
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~
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,7 +19939,17 @@
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,14 +20624,14 @@
\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 }
\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_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_ #1 _ \token_to_str:N #2 _tl }
- { \__tl_change_case_char_auxii:nN {#1} #2 }
+ \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,7 +22590,16 @@
#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 }
{
@@ -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
diff --git a/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex b/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex
index 2dfdc116f31..7dcf18f679b 100644
--- a/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex
+++ b/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex
@@ -19,7 +19,7 @@
%% and all files in that bundle must be distributed together.
%%
%% File: expl3.dtx Copyright (C) 1990-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@expl@check@declarations@bool = 0 %
\chardef \l@expl@log@functions@bool = 0 %
+\chardef \l@expl@enable@debug@bool = 0 %
\let\expl@AtBeginDocument\AtBeginDocument
\def\AtBeginDocument#1{}%
\expandafter\def\expandafter\l@expl@tidy@tl\expandafter
diff --git a/Master/texmf-dist/tex/latex/l3kernel/expl3.lua b/Master/texmf-dist/tex/latex/l3kernel/expl3.lua
index 1da6f623d37..ca496b495c9 100644
--- a/Master/texmf-dist/tex/latex/l3kernel/expl3.lua
+++ b/Master/texmf-dist/tex/latex/l3kernel/expl3.lua
@@ -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
diff --git a/Master/texmf-dist/tex/latex/l3kernel/expl3.sty b/Master/texmf-dist/tex/latex/l3kernel/expl3.sty
index 10791bf2dc1..2ca397563e7 100644
--- a/Master/texmf-dist/tex/latex/l3kernel/expl3.sty
+++ b/Master/texmf-dist/tex/latex/l3kernel/expl3.sty
@@ -19,7 +19,7 @@
%% and all files in that bundle must be distributed together.
%%
%% File: expl3.dtx Copyright (C) 1990-2017 The LaTeX3 Project
-\def\ExplFileDate{2017/05/29}%
+\def\ExplFileDate{2017/07/15}%
\let\ExplLoaderFileDate\ExplFileDate
\ProvidesPackage{expl3}
[%
@@ -36,7 +36,9 @@
}
\expl@create@bool@option{check-declarations}\l@expl@check@declarations@bool
\expl@create@bool@option{log-functions}\l@expl@log@functions@bool
+\expl@create@bool@option{enable-debug}\l@expl@enable@debug@bool
\let\expl@create@bool@option\@undefined
+\chardef\l@expl@enable@debug@bool=0 %
\newcommand*\l@expl@options@clist{}
\DeclareOption*
{%
@@ -50,6 +52,12 @@
\fi
}
\ProcessOptions\relax
+\ifodd\l@expl@check@declarations@bool
+ \chardef\l@expl@enable@debug@bool=1 %
+\fi
+\ifodd\l@expl@log@functions@bool
+ \chardef\l@expl@enable@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 }
diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls b/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls
index 557e1346c97..40e5be8e70b 100644
--- a/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls
+++ b/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls
@@ -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
{
diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3dvipdfmx.def b/Master/texmf-dist/tex/latex/l3kernel/l3dvipdfmx.def
index 7d8c5b96f9e..60886d1f6c7 100644
--- a/Master/texmf-dist/tex/latex/l3kernel/l3dvipdfmx.def
+++ b/Master/texmf-dist/tex/latex/l3kernel/l3dvipdfmx.def
@@ -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@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@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,15 +105,19 @@
}
\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
{
\__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
diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3dvips.def b/Master/texmf-dist/tex/latex/l3kernel/l3dvips.def
index 07063fdcd2c..727fbcbd454 100644
--- a/Master/texmf-dist/tex/latex/l3kernel/l3dvips.def
+++ b/Master/texmf-dist/tex/latex/l3kernel/l3dvips.def
@@ -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@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@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
diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3dvisvgm.def b/Master/texmf-dist/tex/latex/l3kernel/l3dvisvgm.def
index 4bae05e91df..f9bf990c499 100644
--- a/Master/texmf-dist/tex/latex/l3kernel/l3dvisvgm.def
+++ b/Master/texmf-dist/tex/latex/l3kernel/l3dvisvgm.def
@@ -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@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@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:
diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def b/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def
index a8db92d73d0..5e1fe69f6fe 100644
--- a/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def
+++ b/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def
@@ -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@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,82 +161,77 @@
\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@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}
}
\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} }
}
\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
{
diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3xdvipdfmx.def b/Master/texmf-dist/tex/latex/l3kernel/l3xdvipdfmx.def
index 4046489e12e..f66bc633b4c 100644
--- a/Master/texmf-dist/tex/latex/l3kernel/l3xdvipdfmx.def
+++ b/Master/texmf-dist/tex/latex/l3kernel/l3xdvipdfmx.def
@@ -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@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@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,69 +126,97 @@
{
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@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 }
diff --git a/Master/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty b/Master/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty
index 29ecea0a4ec..be5cd42c8e2 100644
--- a/Master/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty
+++ b/Master/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty
@@ -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 }
diff --git a/Master/texmf-dist/tex/latex/l3packages/xfp/xfp.sty b/Master/texmf-dist/tex/latex/l3packages/xfp/xfp.sty
index 1dcf5f17d85..99294202e51 100644
--- a/Master/texmf-dist/tex/latex/l3packages/xfp/xfp.sty
+++ b/Master/texmf-dist/tex/latex/l3packages/xfp/xfp.sty
@@ -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} }
%%
diff --git a/Master/texmf-dist/tex/latex/l3packages/xfrac/xfrac.sty b/Master/texmf-dist/tex/latex/l3packages/xfrac/xfrac.sty
index 96892e13abe..4fae096efc7 100644
--- a/Master/texmf-dist/tex/latex/l3packages/xfrac/xfrac.sty
+++ b/Master/texmf-dist/tex/latex/l3packages/xfrac/xfrac.sty
@@ -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 }
{
diff --git a/Master/texmf-dist/tex/latex/l3packages/xparse/xparse.sty b/Master/texmf-dist/tex/latex/l3packages/xparse/xparse.sty
index 0616a2d2023..b7ecc485e91 100644
--- a/Master/texmf-dist/tex/latex/l3packages/xparse/xparse.sty
+++ b/Master/texmf-dist/tex/latex/l3packages/xparse/xparse.sty
@@ -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- }
diff --git a/Master/texmf-dist/tex/latex/l3packages/xtemplate/xtemplate.sty b/Master/texmf-dist/tex/latex/l3packages/xtemplate/xtemplate.sty
index ee436a00226..f20705ea335 100644
--- a/Master/texmf-dist/tex/latex/l3packages/xtemplate/xtemplate.sty
+++ b/Master/texmf-dist/tex/latex/l3packages/xtemplate/xtemplate.sty
@@ -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~>~ }