summaryrefslogtreecommitdiff
path: root/Master/texmf-dist
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2019-02-16 22:39:34 +0000
committerKarl Berry <karl@freefriends.org>2019-02-16 22:39:34 +0000
commit0d6184fa42ed741f956e55a1c6e7d48ab0cac9d8 (patch)
tree683bec4b5fa84f1f9b84aaf0d4fdf8db2be83728 /Master/texmf-dist
parentf3d6932fe4c7946fdb0582306715b251bf561f7e (diff)
l3kernel (16feb19)
git-svn-id: svn://tug.org/texlive/trunk@50036 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist')
-rw-r--r--Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md29
-rw-r--r--Master/texmf-dist/doc/latex/l3kernel/README.md2
-rw-r--r--Master/texmf-dist/doc/latex/l3kernel/expl3.pdfbin585638 -> 585673 bytes
-rw-r--r--Master/texmf-dist/doc/latex/l3kernel/interface3.pdfbin1553882 -> 1556695 bytes
-rw-r--r--Master/texmf-dist/doc/latex/l3kernel/interface3.tex2
-rw-r--r--Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdfbin263475 -> 263564 bytes
-rw-r--r--Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdfbin280265 -> 280304 bytes
-rw-r--r--Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex2
-rw-r--r--Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdfbin228008 -> 228031 bytes
-rw-r--r--Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex2
-rw-r--r--Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.pdfbin186792 -> 186814 bytes
-rw-r--r--Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex2
-rw-r--r--Master/texmf-dist/doc/latex/l3kernel/source3.pdfbin5673002 -> 5692276 bytes
-rw-r--r--Master/texmf-dist/doc/latex/l3kernel/source3.tex2
-rw-r--r--Master/texmf-dist/doc/latex/l3kernel/source3body.tex56
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/expl3.dtx4
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3basics.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3box.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx11
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3clist.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx5
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3doc.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx12
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3expan.dtx4
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3file.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3final.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3flag.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3int.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3keys.dtx479
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3msg.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3names.dtx31
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3prg.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3prop.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3quark.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3regex.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3seq.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3skip.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3sort.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3str.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3sys.dtx15
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3tl.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3token.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx2
-rw-r--r--Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex379
-rw-r--r--Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex2
-rw-r--r--Master/texmf-dist/tex/latex/l3kernel/expl3.sty2
-rw-r--r--Master/texmf-dist/tex/latex/l3kernel/l3dvipdfmx.def2
-rw-r--r--Master/texmf-dist/tex/latex/l3kernel/l3dvips.def2
-rw-r--r--Master/texmf-dist/tex/latex/l3kernel/l3dvisvgm.def2
-rw-r--r--Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def2
-rw-r--r--Master/texmf-dist/tex/latex/l3kernel/l3xdvipdfmx.def2
74 files changed, 809 insertions, 328 deletions
diff --git a/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md b/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md
index 542ba4d4775..156321c2af9 100644
--- a/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md
+++ b/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md
@@ -7,6 +7,31 @@ this project uses date-based 'snapshot' version identifiers.
## [Unreleased]
+## [2019-02-15]
+
+### Changed
+
+- Defensive code for redefinition of `\time`, `\day`, `\month` and `\year`
+
+### Fixed
+
+- Resetting of key inheritance (see #535)
+- Issue in deprecated command `\tl_set_from_file:Nnn`
+ (see https://tex.stackexchange.com/q/474813/)
+
+## [2019-02-03]
+
+### Added
+
+- Support for return of whole path by \cs{keys_set_known:nnN}-like
+ function \cs{keys_set_known:nnnN} (see #508)
+- `.prop_(g)put:N` key property (see #444)
+
+### Fixed
+
+- Handling of nested key setting when filtering, _etc._ (see #526)
+- Inheritance of default values (see #504)
+
## [2019-01-28]
### Added
@@ -273,7 +298,9 @@ this project uses date-based 'snapshot' version identifiers.
- Step func­tions have been added for dim vari­ables,
e.g. `\dim_step_in­line:nnnn`
-[Unreleased]: https://github.com/latex3/latex3/compare/2019-01-28...HEAD
+[Unreleased]: https://github.com/latex3/latex3/compare/2019-02-15...HEAD
+[2019-02-15]: https://github.com/latex3/latex3/compare/2019-02-03...2019-02-15
+[2019-02-03]: https://github.com/latex3/latex3/compare/2019-01-28...2019-02-03
[2019-01-28]: https://github.com/latex3/latex3/compare/2019-01-13...2019-01-28
[2019-01-13]: https://github.com/latex3/latex3/compare/2019-01-12...2019-01-13
[2019-01-12]: https://github.com/latex3/latex3/compare/2019-01-01...2019-01-12
diff --git a/Master/texmf-dist/doc/latex/l3kernel/README.md b/Master/texmf-dist/doc/latex/l3kernel/README.md
index e2922689838..facab4dfd7d 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 2019-01-28
+Release 2019-02-15
Overview
--------
diff --git a/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf b/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf
index 998675cf11e..376b01def49 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 7a806df027a..5da530e5ff1 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
index b0e86ea5451..83ae543ff3c 100644
--- a/Master/texmf-dist/doc/latex/l3kernel/interface3.tex
+++ b/Master/texmf-dist/doc/latex/l3kernel/interface3.tex
@@ -54,7 +54,7 @@ for those people who are interested.
{latex-team@latex-project.org}%
}%
}
-\date{Released 2019-01-28}
+\date{Released 2019-02-15}
\pagenumbering{roman}
\maketitle
diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf
index 3c4d4a5f5d6..8fd8fa988cf 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/l3styleguide.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf
index 80e8ec14c51..43daecc9045 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
index 5f1af43ab76..fc232cb4282 100644
--- a/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex
+++ b/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex
@@ -32,7 +32,7 @@ The released version of this bundle is available from CTAN.
{latex-team@latex-project.org}%
}%
}
-\date{Released 2019-01-28}
+\date{Released 2019-02-15}
\begin{document}
diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf
index fc133822c87..cc5f0ee5307 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
index e615c89d3fe..9b801740f0f 100644
--- a/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex
+++ b/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex
@@ -32,7 +32,7 @@ The released version of this bundle is available from CTAN.
{latex-team@latex-project.org}%
}%
}
-\date{Released 2019-01-28}
+\date{Released 2019-02-15}
\newcommand{\TF}{\textit{(TF)}}
diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.pdf
index 663636f1a91..a2a947862c7 100644
--- a/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.pdf
+++ b/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex b/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex
index 7d08ce163f9..0cd8d9f92d3 100644
--- a/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex
+++ b/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex
@@ -32,7 +32,7 @@ The released version of this bundle is available from CTAN.
{latex-team@latex-project.org}%
}%
}
-\date{Released 2019-01-28}
+\date{Released 2019-02-15}
\newcommand{\TF}{\textit{(TF)}}
diff --git a/Master/texmf-dist/doc/latex/l3kernel/source3.pdf b/Master/texmf-dist/doc/latex/l3kernel/source3.pdf
index 6203aa958a4..1d1af41d8cd 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
index 774aa0b1d65..f14e2d14a9b 100644
--- a/Master/texmf-dist/doc/latex/l3kernel/source3.tex
+++ b/Master/texmf-dist/doc/latex/l3kernel/source3.tex
@@ -53,7 +53,7 @@ for those people who are interested.
{latex-team@latex-project.org}%
}%
}
-\date{Released 2019-01-28}
+\date{Released 2019-02-15}
\pagenumbering{roman}
\maketitle
diff --git a/Master/texmf-dist/doc/latex/l3kernel/source3body.tex b/Master/texmf-dist/doc/latex/l3kernel/source3body.tex
index 2776b79af65..51f95429a75 100644
--- a/Master/texmf-dist/doc/latex/l3kernel/source3body.tex
+++ b/Master/texmf-dist/doc/latex/l3kernel/source3body.tex
@@ -134,10 +134,6 @@ take no arguments, this will be blank and the function name will end
\texttt{:}. Most functions take one or more arguments, and use the
following argument specifiers:
\begin{description}
- \item[\texttt{D}] The \texttt{D} specifier means \emph{do not use}.
- All of the \TeX{} primitives are initially \cs{let} to a \texttt{D}
- name, and some are then given a second name. Only the kernel
- team should use anything with a \texttt{D} specifier!
\item[\texttt{N} and \texttt{n}] These mean \emph{no manipulation},
of a single token for \texttt{N} and of a set of tokens given in
braces for \texttt{n}. Both pass the argument through exactly as
@@ -163,8 +159,13 @@ following argument specifiers:
expansion}: every token in the argument is fully expanded until only
unexpandable ones remain. The \TeX{} \tn{edef} primitive carries out
this type of expansion. Functions which feature an \texttt{x}-type
- argument are in general \emph{not} expandable, unless specifically
- noted.
+ argument are \emph{not} expandable.
+ \item[\texttt{e}] The \texttt{e} specifier is in many respects
+ identical to \texttt{x}, but with a very different implementation.
+ Functions which feature an \texttt{e}-type argument may be
+ expandable. The drawback is that \texttt{e} is extremely slow
+ (often more than $200$ times slower) in older engines, more
+ precisely in non-\LuaTeX{} engines older than 2019.
\item[\texttt{f}] The \texttt{f} specifier stands for \emph{full
expansion}, and in contrast to \texttt{x} stops at the first
non-expandable item (reading the argument from left to right) without
@@ -188,7 +189,11 @@ following argument specifiers:
\item[\texttt{w}] Finally, there is the \texttt{w} specifier for
\emph{weird} arguments. This covers everything else, but mainly
applies to delimited values (where the argument must be terminated
- by some arbitrary string).
+ by some specified string).
+ \item[\texttt{D}] The \texttt{D} specifier means \emph{do not use}.
+ All of the \TeX{} primitives are initially \cs{let} to a \texttt{D}
+ name, and some are then given a second name. Only the kernel
+ team should use anything with a \texttt{D} specifier!
\end{description}
Notice that the argument specifier describes how the argument is
processed prior to being passed to the underlying function. For example,
@@ -215,22 +220,35 @@ function, typically starting with the module\footnote{The module names are
and then a descriptive part.
Variables end with a short identifier to show the variable type:
\begin{description}
- \item[\texttt{bool}] Either true or false.
- \item[\texttt{box}] Box register.
\item[\texttt{clist}] Comma separated list.
- \item[\texttt{coffin}] a \enquote{box with handles} --- a higher-level data
- type for carrying out |box| alignment operations.
\item[\texttt{dim}] \enquote{Rigid} lengths.
- \item[\texttt{fp}] floating-point values;
+ \item[\texttt{fp}] Floating-point values;
\item[\texttt{int}] Integer-valued count register.
- \item[\texttt{prop}] Property list.
- \item[\texttt{seq}] \enquote{Sequence}: a data-type used to implement lists
- (with access at both ends) and stacks.
+ \item[\texttt{muskip}] \enquote{Rubber} lengths for use in
+ mathematics.
+ \item[\texttt{seq}] \enquote{Sequence}: a data-type used to implement
+ lists (with access at both ends) and stacks.
\item[\texttt{skip}] \enquote{Rubber} lengths.
- \item[\texttt{stream}] An input or output stream (for reading from or
- writing to, respectively).
+ \item[\texttt{str}] String variables: contain character data.
\item[\texttt{tl}] Token list variables: placeholder for a token list.
\end{description}
+Applying \texttt{V}-type or \texttt{v}-type expansion to variables of
+one of the above types is supported, while it is not supported for the
+following variable types:
+\begin{description}
+ \item[\texttt{bool}] Either true or false.
+ \item[\texttt{box}] Box register.
+ \item[\texttt{coffin}] A \enquote{box with handles} --- a higher-level
+ data type for carrying out \texttt{box} alignment operations.
+ \item[\texttt{flag}] Integer that can be incremented expandably.
+ \item[\texttt{fparray}] Fixed-size array of floating point values.
+ \item[\texttt{intarray}] Fixed-size array of integers.
+ \item[\texttt{ior}/\texttt{iow}] An input or output stream, for
+ reading from or writing to, respectively.
+ \item[\texttt{prop}] Property list: analogue of dictionary or
+ associative arrays in other languages.
+ \item[\texttt{regex}] Regular expression.
+\end{description}
\subsection{Terminological inexactitude}
@@ -242,7 +260,9 @@ is a macro processor, and functions are simply macros that may or may not take
arguments and expand to their replacement text. Many of the common variables
are \emph{also} macros, and if placed into the input stream will simply expand
to their definition as well~--- a \enquote{function} with no arguments and a
-\enquote{token list variable} are in truth one and the same. On the other
+\enquote{token list variable} are almost the same.\footnote{\TeX{}nically,
+functions with no arguments are \tn{long} while token list variables are not.}
+On the other
hand, some \enquote{variables} are actually registers that must be
initialised and their values set and retrieved with specific functions.
diff --git a/Master/texmf-dist/source/latex/l3kernel/expl3.dtx b/Master/texmf-dist/source/latex/l3kernel/expl3.dtx
index be3e7eeb1c5..3d261943684 100644
--- a/Master/texmf-dist/source/latex/l3kernel/expl3.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/expl3.dtx
@@ -23,7 +23,7 @@
% for those people who are interested.
%
%<*driver|generic|package>
-\def\ExplFileDate{2019-01-28}%
+\def\ExplFileDate{2019-02-15}%
%</driver|generic|package>
%<*driver>
\documentclass[full]{l3doc}
@@ -51,7 +51,7 @@
% }^^A
% }
%
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx b/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx
index ea5a6332307..c7464dce77b 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx b/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx
index cb60f38390d..7730ede1e34 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx b/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx
index 5a6eb3ba7f8..053c73124ba 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx
@@ -140,7 +140,7 @@
% }^^A
% }
%
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3box.dtx b/Master/texmf-dist/source/latex/l3kernel/l3box.dtx
index 747d32fc7b3..e2a4222c916 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3box.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3box.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx b/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx
index 54892ac54e5..e0a2b218088 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
%
% \maketitle
%
@@ -246,14 +246,15 @@
%
% \section{Additions to \pkg{l3expan}}
%
-% \begin{function}[added = 2018-04-04]{\exp_args_generate:n}
+% \begin{function}[added = 2018-04-04, updated = 2019-02-08]
+% {\exp_args_generate:n}
% \begin{syntax}
% \cs{exp_args_generate:n} \Arg{variant argument specifiers}
% \end{syntax}
% Defines \cs[no-index]{exp_args:N\meta{variant}} functions for each
% \meta{variant} given in the comma list \Arg{variant argument
% specifiers}. Each \meta{variant} should consist of the letters |N|,
-% |c|, |n|, |V|, |v|, |o|, |f|, |x|, |p| and the resulting function is
+% |c|, |n|, |V|, |v|, |o|, |f|, |e|, |x|, |p| and the resulting function is
% protected if the letter |x| appears in the \meta{variant}. This is
% only useful for cases where \cs{cs_generate_variant:Nn} is not
% applicable.
@@ -2344,7 +2345,7 @@
% \end{macrocode}
% \end{macro}
%
-% \subsection{Additions to \pkg{l3msg}}
+% \subsection{Additions to \pkg{l3int}}
%
% \begin{macrocode}
%<@@=int>
@@ -3302,7 +3303,7 @@
% \begin{macrocode}
\__kernel_patch_deprecation:nnNNpn { 2020-12-31 } { \file_get:nnN }
\cs_new_protected:Npn \tl_set_from_file:Nnn #1#2#3
- { \file_get:nnN {#2} {#3} #1 }
+ { \file_get:nnN {#3} {#2} #1 }
\cs_generate_variant:Nn \tl_set_from_file:Nnn { c }
\__kernel_patch_deprecation:nnNNpn { 2020-12-31 } { \file_get:nnN }
\cs_new_protected:Npn \tl_gset_from_file:Nnn #1#2#3
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx b/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx
index 6a74eb43eb4..0fa08188cd9 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx b/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx
index 38f13a49dcb..88ae571c742 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
%
% \maketitle
%
@@ -100,9 +100,6 @@
%
% \section{Setting coffin content and poles}
%
-% All coffin functions create and manipulate coffins locally within the
-% current \TeX\ group level.
-%
% \begin{function}[added = 2011-08-17, updated = 2011-09-03]
% {
% \hcoffin_set:Nn, \hcoffin_set:cn,
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx b/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx
index 99cb6c24eec..738be5b26d6 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx b/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx
index bfbdb25504c..23cf8f317f2 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx b/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx
index 38c0c4cd8d5..8cc7655d4dd 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx
@@ -79,7 +79,7 @@ and all files in that bundle must be distributed together.
%
% \title{The \cls{l3doc} class}
% \author{\Team}
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
% \maketitle
% \tableofcontents
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx b/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx
index 5db66040359..cdb9ece1da4 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx
@@ -63,7 +63,7 @@
% }^^A
% }
%
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx b/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx
index fe7ad30190f..05df8c01b28 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
%
% \maketitle
%
@@ -556,23 +556,23 @@
%<*package>
\ProvidesExplFile
%<*dvipdfmx>
- {l3dvipdfmx.def}{2019-01-28}{}
+ {l3dvipdfmx.def}{2019-02-15}{}
{L3 Experimental driver: dvipdfmx}
%</dvipdfmx>
%<*dvips>
- {l3dvips.def}{2019-01-28}{}
+ {l3dvips.def}{2019-02-15}{}
{L3 Experimental driver: dvips}
%</dvips>
%<*dvisvgm>
- {l3dvisvgm.def}{2019-01-28}{}
+ {l3dvisvgm.def}{2019-02-15}{}
{L3 Experimental driver: dvisvgm}
%</dvisvgm>
%<*pdfmode>
- {l3pdfmode.def}{2019-01-28}{}
+ {l3pdfmode.def}{2019-02-15}{}
{L3 Experimental driver: PDF mode}
%</pdfmode>
%<*xdvipdfmx>
- {l3xdvipdfmx.def}{2019-01-28}{}
+ {l3xdvipdfmx.def}{2019-02-15}{}
{L3 Experimental driver: xdvipdfmx}
%</xdvipdfmx>
%</package>
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx b/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx
index 4204f1550cd..dd4d70f59d6 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
%
% \maketitle
%
@@ -2682,7 +2682,7 @@
{
\str_map_inline:nn {##1}
{
- \str_if_in:nnF { NnpcofVvx } {####1}
+ \str_if_in:nnF { NnpcofeVvx } {####1}
{
\__kernel_msg_error:nnnn { kernel } { invalid-exp-args }
{####1} {##1}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3file.dtx b/Master/texmf-dist/source/latex/l3kernel/l3file.dtx
index 1fc35e1cd1b..a8262e75962 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3file.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3file.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3final.dtx b/Master/texmf-dist/source/latex/l3kernel/l3final.dtx
index e4b3dde8316..9c385192b53 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3final.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3final.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx b/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx
index 92a45411152..3c5e3486276 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx
index 2c413701ff2..6e726d7f1c6 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-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 f5ec47bbcf0..1a93847d1ce 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx
index 03532ae67a4..77123e92b61 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx
index 02e606b3918..b7a76f0ce8c 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx
index a16a429fb15..1827c24b804 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx
index b34abc8ec6e..63632006068 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx
index becc0e704cf..956680401fb 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx
index 547cd0c73dc..1b2e99e6347 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx
index 4ee82b86820..fd7689c8baf 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx
index 1e70adf9a74..41ae37c9e0c 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx
index 1d24bb9969a..64999b90a29 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-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 8f88bb22468..19986a962cf 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx
index 0790877d877..82797003afb 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx
@@ -49,7 +49,7 @@
% }^^A
% }
%
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx
index db31916ae19..2052e2010d2 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3int.dtx b/Master/texmf-dist/source/latex/l3kernel/l3int.dtx
index 7814b278243..947a91fa8ab 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3int.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3int.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx b/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx
index 81c3ec6251e..43074d8f92b 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx b/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx
index a2e12741b58..7499ddd923f 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx b/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx
index 9fdcda9e6aa..062880a45c4 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
%
% \maketitle
%
@@ -382,6 +382,17 @@
% Choices are discussed in detail in section~\ref{sec:l3keys:choice}.
% \end{function}
%
+% \begin{function}[added = 2019-01-31]
+% {.prop_put:N, .prop_put:c, .prop_gput:N, .prop_gput:c}
+% \begin{syntax}
+% \meta{key} .prop_put:N = \meta{property list}
+% \end{syntax}
+% Defines \meta{key} to put the \meta{value} onto the \meta{property list}
+% stored under the \meta{key}.
+% If the variable does not exist, it
+% is created globally at the point that the key is set up.
+% \end{function}
+%
% \begin{function}{.skip_set:N, .skip_set:c, .skip_gset:N, .skip_gset:c}
% \begin{syntax}
% \meta{key} .skip_set:N = \meta{skip}
@@ -442,7 +453,7 @@
% them into several sub-groups for a given module. This can be achieved
% either by adding a sub-division to the module name:
% \begin{verbatim}
-% \keys_define:nn { module / subgroup }
+% \keys_define:nn { mymodule / subgroup }
% { key .code:n = code }
% \end{verbatim}
% or to the key name:
@@ -453,7 +464,7 @@
% As illustrated, the best choice of token for sub-dividing keys in
% this way is |/|. This is because of the method that is
% used to represent keys internally. Both of the above code fragments
-% set the same key, which has full name \texttt{module/subgroup/key}.
+% set the same key, which has full name \texttt{mymodule/subgroup/key}.
%
% As illustrated in the next section, this subdivision is
% particularly relevant to making multiple choices.
@@ -655,28 +666,31 @@
% }
% \end{verbatim}
%
-% \begin{function}[added = 2011-08-23, updated = 2017-05-27]
+% \begin{function}[added = 2011-08-23, updated = 2019-01-29]
% {
+% \keys_set_known:nn, \keys_set_known:nV,
+% \keys_set_known:nv, \keys_set_known:no,
% \keys_set_known:nnN, \keys_set_known:nVN,
% \keys_set_known:nvN, \keys_set_known:noN,
-% \keys_set_known:nn, \keys_set_known:nV,
-% \keys_set_known:nv, \keys_set_known:no
+% \keys_set_known:nnnN, \keys_set_known:nVnN,
+% \keys_set_known:nvnN, \keys_set_known:nonN
% }
% \begin{syntax}
+% \cs{keys_set_known:nn} \Arg{module} \Arg{keyval list}
% \cs{keys_set_known:nnN} \Arg{module} \Arg{keyval list} \meta{tl}
+% \cs{keys_set_known:nnnN} \Arg{module} \Arg{keyval list} \Arg{root} \meta{tl}
% \end{syntax}
-% In some cases, the desired behavior is to simply ignore unknown keys,
-% collecting up information on these for later processing. The
-% \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 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.
-%
-% Use of \cs{keys_set_known:nnN} can be nested, with the correct residual
-% \meta{keyval list} returned at each stage.
+% These functions set keys which are known for the \meta{module}, and
+% simply ignore other keys. The \cs{keys_set_known:nn} 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. In addition, \cs{keys_set_known:nnN} stores the key--value
+% pairs in the \meta{tl} in comma-separated form (\emph{i.e.}~an edited
+% version of the \meta{keyval list}). When a \meta{root} is given
+% (\cs{keys_set_known:nnnN}), the key--value entries are returned
+% relative to this point in the key tree. When it is absent, only the
+% key name and value are provided. The correct list is returned by
+% nested calls.
% \end{function}
%
% \section{Selective key setting}
@@ -719,15 +733,19 @@
% groups to be made \enquote{active}, or by marking one or more groups to
% be ignored in key setting.
%
-% \begin{function}[added = 2013-07-14, updated = 2017-05-27]
+% \begin{function}[added = 2013-07-14, updated = 2019-01-29]
% {
+% \keys_set_filter:nnn, \keys_set_filter:nnV,
+% \keys_set_filter:nnv, \keys_set_filter:nno,
% \keys_set_filter:nnnN, \keys_set_filter:nnVN,
% \keys_set_filter:nnvN, \keys_set_filter:nnoN,
-% \keys_set_filter:nnn, \keys_set_filter:nnV,
-% \keys_set_filter:nnv, \keys_set_filter:nno
+% \keys_set_filter:nnnnN, \keys_set_filter:nnVnN,
+% \keys_set_filter:nnvnN, \keys_set_filter:nnonN,
% }
% \begin{syntax}
+% \cs{keys_set_filter:nnn} \Arg{module} \Arg{groups} \Arg{keyval list}
% \cs{keys_set_filter:nnnN} \Arg{module} \Arg{groups} \Arg{keyval list} \meta{tl}
+% \cs{keys_set_filter:nnnnN} \Arg{module} \Arg{groups} \Arg{keyval list} \meta{root} \meta{tl}
% \end{syntax}
% Activates key filtering in an \enquote{opt-out} sense: keys assigned to any
% of the \meta{groups} specified are ignored. The \meta{groups} are
@@ -738,7 +756,10 @@
% list}). The \cs{keys_set_filter:nnn} version skips this stage.
%
% Use of \cs{keys_set_filter:nnnN} can be nested, with the correct residual
-% \meta{keyval list} returned at each stage.
+% \meta{keyval list} returned at each stage. In the version which takes
+% a \meta{root} argument, the key list is returned relative to that point
+% in the key tree. In the cases without a \meta{root} argument, only
+% the key names and values are returned.
% \end{function}
%
% \begin{function}[added = 2013-07-14, updated = 2017-05-27]
@@ -1215,6 +1236,14 @@
% \end{macrocode}
% \end{variable}
%
+% \begin{variable}{\l_@@_relative_tl}
+% The relative path for passing keys back to the user.
+% \begin{macrocode}
+\tl_new:N \l_@@_relative_tl
+\tl_set:Nn \l_@@_relative_tl { \q_no_value }
+% \end{macrocode}
+% \end{variable}
+%
% \begin{variable}{\l_@@_property_tl}
% The \enquote{property} begin set for a key at definition time is
% stored here.
@@ -1254,10 +1283,12 @@
% \end{macrocode}
% \end{variable}
%
-% \begin{variable}{\l_@@_tmp_bool}
+% \begin{variable}{\l_@@_tmp_bool, \l_@@_tmpa_tl, \l_@@_tmpb_tl}
% Scratch space.
% \begin{macrocode}
\bool_new:N \l_@@_tmp_bool
+\tl_new:N \l_@@_tmpa_tl
+\tl_new:N \l_@@_tmpb_tl
% \end{macrocode}
% \end{variable}
%
@@ -1274,7 +1305,7 @@
{ \@@_define:onn \l_@@_module_tl }
\cs_new_protected:Npn \@@_define:nnn #1#2#3
{
- \tl_set:Nx \l_@@_module_tl { \@@_remove_spaces:n {#2} }
+ \tl_set:Nx \l_@@_module_tl { \@@_trim_spaces:n {#2} }
\keyval_parse:NNn \@@_define:n \@@_define:nn {#3}
\tl_set:Nn \l_@@_module_tl {#1}
}
@@ -1327,7 +1358,7 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_property_find:n #1
{
- \tl_set:Nx \l_@@_property_tl { \@@_remove_spaces:n {#1} }
+ \tl_set:Nx \l_@@_property_tl { \@@_trim_spaces:n {#1} }
\exp_after:wN \@@_property_find:w \l_@@_property_tl . .
\q_stop {#1}
}
@@ -1509,7 +1540,7 @@
{
\int_incr:N \l_keys_choice_int
\@@_cmd_set:nx
- { \l_keys_path_tl / \@@_remove_spaces:n {##1} }
+ { \l_keys_path_tl / \@@_trim_spaces:n {##1} }
{
\tl_set:Nn \exp_not:N \l_keys_choice_tl {##1}
\int_set:Nn \exp_not:N \l_keys_choice_int
@@ -1552,7 +1583,7 @@
\tex_undefined:D
}
{
- \cs_set:cpx
+ \cs_set_nopar:cpx
{ \c_@@_default_root_tl \l_keys_path_tl }
{ \exp_not:n {#1} }
}
@@ -1623,6 +1654,28 @@
% \end{macro}
% \end{macro}
%
+% \begin{macro}{\@@_prop_put:Nn, \@@_prop_put:cn}
+% Much the same as other variables, but needs a dedicated auxiliary.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_prop_put:Nn #1#2
+ {
+ \prop_if_exist:NF #1 { \prop_new:N #1 }
+ \exp_after:wN \@@_find_key_module:NNw
+ \exp_after:wN \l_@@_tmpa_tl
+ \exp_after:wN \l_@@_tmpb_tl
+ \l_keys_path_tl / \q_stop
+ \@@_cmd_set:nx { \l_keys_path_tl }
+ {
+ \exp_not:c { prop_ #2 put:Nnn }
+ \exp_not:N #1
+ { \l_@@_tmpb_tl }
+ \exp_not:n { {##1} }
+ }
+ }
+\cs_generate_variant:Nn \@@_prop_put:Nn { c }
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\@@_undefine:}
% Undefining a key has to be done without \cs{cs_undefine:c} as that
% function acts globally.
@@ -1944,6 +1997,20 @@
% \end{macro}
% \end{macro}
%
+% \begin{macro}{.prop_put:N, .prop_put:c, .prop_gput:N, .prop_gput:c}
+% Setting a variable is very easy: just pass the data along.
+% \begin{macrocode}
+\cs_new_protected:cpn { \c_@@_props_root_tl .prop_put:N } #1
+ { \@@_prop_put:Nn #1 { } }
+\cs_new_protected:cpn { \c_@@_props_root_tl .prop_put:c } #1
+ { \@@_prop_put:cn {#1} { } }
+\cs_new_protected:cpn { \c_@@_props_root_tl .prop_gput:N } #1
+ { \@@_prop_put:Nn #1 { g } }
+\cs_new_protected:cpn { \c_@@_props_root_tl .prop_gput:c } #1
+ { \@@_prop_put:cn {#1} { g } }
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{.skip_set:N, .skip_set:c}
% \begin{macro}{.skip_gset:N, .skip_gset:c}
% Setting a variable is very easy: just pass the data along.
@@ -2010,20 +2077,43 @@
%
% \subsection{Setting keys}
%
-% \begin{macro}{\keys_set:nn, \keys_set:nV, \keys_set:nv, \keys_set:no}
-% \begin{macro}{\@@_set:nnn, \@@_set:onn}
-% A simple wrapper again.
+% \begin{macro}
+% {
+% \keys_set:nn, \keys_set:nV, \keys_set:nv, \keys_set:no,
+% \@@_set:nn
+% }
+% \begin{macro}{\@@_set:nnn}
+% A simple wrapper allowing for nesting.
% \begin{macrocode}
-\cs_new_protected:Npn \keys_set:nn
- { \@@_set:onn { \l_@@_module_tl } }
+\cs_new_protected:Npn \keys_set:nn #1#2
+ {
+ \use:x
+ {
+ \bool_set_false:N \exp_not:N \l_@@_only_known_bool
+ \bool_set_false:N \exp_not:N \l_@@_filtered_bool
+ \bool_set_false:N \exp_not:N \l_@@_selective_bool
+ \tl_set:Nn \exp_not:N \l_@@_relative_tl
+ { \exp_not:N \q_no_value }
+ \@@_set:nn \exp_not:n { {#1} {#2} }
+ \bool_if:NT \l_@@_only_known_bool
+ { \bool_set_true:N \exp_not:N \l_@@_only_known_bool }
+ \bool_if:NT \l_@@_filtered_bool
+ { \bool_set_true:N \exp_not:N \l_@@_filtered_bool }
+ \bool_if:NT \l_@@_selective_bool
+ { \bool_set_true:N \exp_not:N \l_@@_selective_bool }
+ \tl_set:Nn \exp_not:N \l_@@_relative_tl
+ { \exp_not:o \l_@@_relative_tl }
+ }
+ }
+\cs_generate_variant:Nn \keys_set:nn { nV , nv , no }
+\cs_new_protected:Npn \@@_set:nn #1#2
+ { \exp_args:No \@@_set:nnn \l_@@_module_tl {#1} {#2} }
\cs_new_protected:Npn \@@_set:nnn #1#2#3
{
- \tl_set:Nx \l_@@_module_tl { \@@_remove_spaces:n {#2} }
- \keyval_parse:NNn \@@_set:n \@@_set:nn {#3}
+ \tl_set:Nx \l_@@_module_tl { \@@_trim_spaces:n {#2} }
+ \keyval_parse:NNn \@@_set_keyval:n \@@_set_keyval:nn {#3}
\tl_set:Nn \l_@@_module_tl {#1}
}
-\cs_generate_variant:Nn \keys_set:nn { nV , nv , no }
-\cs_generate_variant:Nn \@@_set:nnn { o }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -2033,133 +2123,172 @@
% \keys_set_known:nnN, \keys_set_known:nVN,
% \keys_set_known:nvN, \keys_set_known:noN
% }
-% \begin{macro}{\@@_set_known:nnnN, \@@_set_known:onnN}
+% \begin{macro}
+% {
+% \keys_set_known:nnnN, \keys_set_known:nVnN,
+% \keys_set_known:nvnN, \keys_set_known:nonN
+% }
+% \begin{macro}{\@@_set_known:nnnnN}
% \begin{macro}
% {
% \keys_set_known:nn, \keys_set_known:nV,
% \keys_set_known:nv, \keys_set_known:no
% }
-% \begin{macro}{\@@_keys_set_known:nn}
+% \begin{macro}{\@@_set_known:nnn}
% Setting known keys simply means setting the appropriate flag, then
% running the standard code. To allow for nested setting, any existing
% value of \cs{l_@@_unused_clist} is saved on the stack and reset
% afterwards. Note that for speed/simplicity reasons we use a \texttt{tl}
% operation to set the \texttt{clist} here!
% \begin{macrocode}
-\cs_new_protected:Npn \keys_set_known:nnN
- { \@@_set_known:onnN \l_@@_unused_clist }
+\cs_new_protected:Npn \keys_set_known:nnN #1#2#3
+ {
+ \exp_args:No \@@_set_known:nnnnN
+ \l_@@_unused_clist { \q_no_value } {#1} {#2} #3
+ }
\cs_generate_variant:Nn \keys_set_known:nnN { nV , nv , no }
-\cs_new_protected:Npn \@@_set_known:nnnN #1#2#3#4
+\cs_new_protected:Npn \keys_set_known:nnnN #1#2#3#4
+ {
+ \exp_args:No \@@_set_known:nnnnN
+ \l_@@_unused_clist {#3} {#1} {#2} #4
+ }
+\cs_generate_variant:Nn \keys_set_known:nnnN { nV , nv , no }
+\cs_new_protected:Npn \@@_set_known:nnnnN #1#2#3#4#5
{
\clist_clear:N \l_@@_unused_clist
- \keys_set_known:nn {#2} {#3}
- \tl_set:Nx #4 { \exp_not:o { \l_@@_unused_clist } }
+ \@@_set_known:nnn {#2} {#3} {#4}
+ \tl_set:Nx #5 { \exp_not:o { \l_@@_unused_clist } }
\tl_set:Nn \l_@@_unused_clist {#1}
}
-\cs_generate_variant:Nn \@@_set_known:nnnN { o }
\cs_new_protected:Npn \keys_set_known:nn #1#2
- {
- \bool_if:NTF \l_@@_only_known_bool
- { \keys_set:nn }
- { \@@_set_known:nn }
- {#1} {#2}
- }
+ { \@@_set_known:nnn { \q_no_value } {#1} {#2} }
\cs_generate_variant:Nn \keys_set_known:nn { nV , nv , no }
-\cs_new_protected:Npn \@@_set_known:nn #1#2
+\cs_new_protected:Npn \@@_set_known:nnn #1#2#3
{
- \bool_set_true:N \l_@@_only_known_bool
- \keys_set:nn {#1} {#2}
- \bool_set_false:N \l_@@_only_known_bool
+ \use:x
+ {
+ \bool_set_true:N \exp_not:N \l_@@_only_known_bool
+ \bool_set_false:N \exp_not:N \l_@@_filtered_bool
+ \bool_set_false:N \exp_not:N \l_@@_selective_bool
+ \tl_set:Nn \exp_not:N \l_@@_relative_tl { \exp_not:n {#1} }
+ \@@_set:nn \exp_not:n { {#2} {#3} }
+ \bool_if:NF \l_@@_only_known_bool
+ { \bool_set_false:N \exp_not:N \l_@@_only_known_bool }
+ \bool_if:NT \l_@@_filtered_bool
+ { \bool_set_true:N \exp_not:N \l_@@_filtered_bool }
+ \bool_if:NT \l_@@_selective_bool
+ { \bool_set_true:N \exp_not:N \l_@@_selective_bool }
+ \tl_set:Nn \exp_not:N \l_@@_relative_tl
+ { \exp_not:o \l_@@_relative_tl }
+ }
}
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
+% \end{macro}
%
% \begin{macro}
% {
% \keys_set_filter:nnnN, \keys_set_filter:nnVN, \keys_set_filter:nnvN,
% \keys_set_filter:nnoN
% }
-% \begin{macro}{\@@_set_filter:nnnnN, \@@_set_filter:onnnN}
+% \begin{macro}
+% {
+% \keys_set_filter:nnnnN, \keys_set_filter:nnVnN,
+% \keys_set_filter:nnvnN, \keys_set_filter:nnonN
+% }
+% \begin{macro}{\@@_set_filter:nnnnnN}
% \begin{macro}
% {
% \keys_set_filter:nnn, \keys_set_filter:nnV, \keys_set_filter:nnv,
% \keys_set_filter:nno
% }
-% \begin{macro}{\@@_set_filter:nnn}
+% \begin{macro}{\@@_set_filter:nnnn}
% \begin{macro}
% {
% \keys_set_groups:nnn, \keys_set_groups:nnV, \keys_set_groups:nnv,
% \keys_set_groups:nno
% }
-% \begin{macro}{\@@_set_groups:nnn}
% \begin{macro}{\@@_set_selective:nnn}
-% \begin{macro}{\@@_set_selective:nnnn, \@@_set_selective:onnn}
-% \begin{macro}{\@@_set_selective:nn}
+% \begin{macro}{\@@_set_selective:nnnn}
% The idea of setting keys in a selective manner again uses flags
% wrapped around the basic code. The comments on \cs{keys_set_known:nnN}
% also apply here. We have a bit more shuffling to do to keep everything
% nestable.
% \begin{macrocode}
-\cs_new_protected:Npn \keys_set_filter:nnnN
- { \@@_set_filter:onnnN \l_@@_unused_clist }
+\cs_new_protected:Npn \keys_set_filter:nnnN #1#2#3#4
+ {
+ \exp_args:No \@@_set_filter:nnnnnN
+ \l_@@_unused_clist
+ { \q_no_value } {#1} {#2} {#3} #4
+ }
\cs_generate_variant:Nn \keys_set_filter:nnnN { nnV , nnv , nno }
-\cs_new_protected:Npn \@@_set_filter:nnnnN #1#2#3#4#5
+\cs_new_protected:Npn \keys_set_filter:nnnnN #1#2#3#4#5
+ {
+ \exp_args:No \@@_set_filter:nnnnnN
+ \l_@@_unused_clist {#4} {#1} {#2} {#3} #5
+ }
+\cs_generate_variant:Nn \keys_set_filter:nnnnN { nnV , nnv , nno }
+\cs_new_protected:Npn \@@_set_filter:nnnnnN #1#2#3#4#5#6
{
\clist_clear:N \l_@@_unused_clist
- \keys_set_filter:nnn {#2} {#3} {#4}
- \tl_set:Nx #5 { \exp_not:o { \l_@@_unused_clist } }
+ \@@_set_filter:nnnn {#2} {#3} {#4} {#5}
+ \tl_set:Nx #6 { \exp_not:o { \l_@@_unused_clist } }
\tl_set:Nn \l_@@_unused_clist {#1}
}
-\cs_generate_variant:Nn \@@_set_filter:nnnnN { o }
\cs_new_protected:Npn \keys_set_filter:nnn #1#2#3
- {
- \bool_if:NTF \l_@@_filtered_bool
- { \@@_set_selective:nnn }
- { \@@_set_filter:nnn }
- {#1} {#2} {#3}
- }
+ {\@@_set_filter:nnnn { \q_no_value } {#1} {#2} {#3} }
\cs_generate_variant:Nn \keys_set_filter:nnn { nnV , nnv , nno }
-\cs_new_protected:Npn \@@_set_filter:nnn #1#2#3
+\cs_new_protected:Npn \@@_set_filter:nnnn #1#2#3#4
{
- \bool_set_true:N \l_@@_filtered_bool
- \@@_set_selective:nnn {#1} {#2} {#3}
- \bool_set_false:N \l_@@_filtered_bool
+ \use:x
+ {
+ \bool_set_false:N \exp_not:N \l_@@_only_known_bool
+ \bool_set_true:N \exp_not:N \l_@@_filtered_bool
+ \bool_set_true:N \exp_not:N \l_@@_selective_bool
+ \tl_set:Nn \exp_not:N \l_@@_relative_tl { \exp_not:n {#1} }
+ \@@_set_selective:nnn \exp_not:n { {#2} {#3} {#4} }
+ \bool_if:NT \l_@@_only_known_bool
+ { \bool_set_true:N \exp_not:N \l_@@_only_known_bool }
+ \bool_if:NF \l_@@_filtered_bool
+ { \bool_set_false:N \exp_not:N \l_@@_filtered_bool }
+ \bool_if:NF \l_@@_selective_bool
+ { \bool_set_false:N \exp_not:N \l_@@_selective_bool }
+ \tl_set:Nn \exp_not:N \l_@@_relative_tl
+ { \exp_not:o \l_@@_relative_tl }
+ }
}
\cs_new_protected:Npn \keys_set_groups:nnn #1#2#3
{
- \bool_if:NTF \l_@@_filtered_bool
- { \@@_set_groups:nnn }
- { \@@_set_selective:nnn }
- {#1} {#2} {#3}
+ \use:x
+ {
+ \bool_set_false:N \exp_not:N \l_@@_only_known_bool
+ \bool_set_false:N \exp_not:N \l_@@_filtered_bool
+ \bool_set_true:N \exp_not:N \l_@@_selective_bool
+ \tl_set:Nn \exp_not:N \l_@@_relative_tl
+ { \exp_not:N \q_no_value }
+ \@@_set_selective:nnn \exp_not:n { {#1} {#2} {#3} }
+ \bool_if:NT \l_@@_only_known_bool
+ { \bool_set_true:N \exp_not:N \l_@@_only_known_bool }
+ \bool_if:NF \l_@@_filtered_bool
+ { \bool_set_true:N \exp_not:N \l_@@_filtered_bool }
+ \bool_if:NF \l_@@_selective_bool
+ { \bool_set_false:N \exp_not:N \l_@@_selective_bool }
+ \tl_set:Nn \exp_not:N \l_@@_relative_tl
+ { \exp_not:o \l_@@_relative_tl }
+ }
}
\cs_generate_variant:Nn \keys_set_groups:nnn { nnV , nnv , nno }
-\cs_new_protected:Npn \@@_set_groups:nnn #1#2#3
- {
- \bool_set_false:N \l_@@_filtered_bool
- \@@_set_selective:nnn {#1} {#2} {#3}
- \bool_set_true:N \l_@@_filtered_bool
- }
\cs_new_protected:Npn \@@_set_selective:nnn
- { \@@_set_selective:onnn \l_@@_selective_seq }
+ { \exp_args:No \@@_set_selective:nnnn \l_@@_selective_seq }
\cs_new_protected:Npn \@@_set_selective:nnnn #1#2#3#4
{
\seq_set_from_clist:Nn \l_@@_selective_seq {#3}
- \bool_if:NTF \l_@@_selective_bool
- { \keys_set:nn }
- { \@@_set_selective:nn }
- {#2} {#4}
+ \@@_set:nn {#2} {#4}
\tl_set:Nn \l_@@_selective_seq {#1}
}
-\cs_generate_variant:Nn \@@_set_selective:nnnn { o }
-\cs_new_protected:Npn \@@_set_selective:nn #1#2
- {
- \bool_set_true:N \l_@@_selective_bool
- \keys_set:nn {#1} {#2}
- \bool_set_false:N \l_@@_selective_bool
- }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -2169,26 +2298,25 @@
% \end{macro}
% \end{macro}
% \end{macro}
-% \end{macro}
%
-% \begin{macro}{\@@_set:n, \@@_set:nn}
-% \begin{macro}{\@@_set_aux:nnn, \@@_set_aux:onn}
-% \begin{macro}{\@@_find_key_module:w}
-% \begin{macro}{\@@_set_aux:, \@@_set_selective:}
+% \begin{macro}{\@@_set_keyval:n, \@@_set_keyval:nn}
+% \begin{macro}{\@@_set_keyval:nnn, \@@_set_keyval:onn}
+% \begin{macro}{\@@_find_key_module:NNw}
+% \begin{macro}{\@@_set_selective:}
% A shared system once again. First, set the current path and add a
% default if needed. There are then checks to see if the a value is
% required or forbidden. If everything passes, move on to execute the
% code.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_set:n #1
+\cs_new_protected:Npn \@@_set_keyval:n #1
{
\bool_set_true:N \l_@@_no_value_bool
- \@@_set_aux:onn \l_@@_module_tl {#1} { }
+ \@@_set_keyval:onn \l_@@_module_tl {#1} { }
}
-\cs_new_protected:Npn \@@_set:nn #1#2
+\cs_new_protected:Npn \@@_set_keyval:nn #1#2
{
\bool_set_false:N \l_@@_no_value_bool
- \@@_set_aux:onn \l_@@_module_tl {#1} {#2}
+ \@@_set_keyval:onn \l_@@_module_tl {#1} {#2}
}
% \end{macrocode}
% The key path here can be fully defined, after which there is a search
@@ -2197,34 +2325,38 @@
% that happens on a per-key basis, we use the stack approach to restore
% the module name without a group.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_set_aux:nnn #1#2#3
+\cs_new_protected:Npn \@@_set_keyval:nnn #1#2#3
{
\tl_set:Nx \l_keys_path_tl
{
\tl_if_blank:nF {#1}
{ #1 / }
- \@@_remove_spaces:n {#2}
+ \@@_trim_spaces:n {#2}
}
\tl_clear:N \l_@@_module_tl
- \exp_after:wN \@@_find_key_module:w \l_keys_path_tl / \q_stop
+ \tl_clear:N \l_@@_inherit_tl
+ \exp_after:wN \@@_find_key_module:NNw
+ \exp_after:wN \l_@@_module_tl
+ \exp_after:wN \l_keys_key_tl
+ \l_keys_path_tl / \q_stop
\@@_value_or_default:n {#3}
\bool_if:NTF \l_@@_selective_bool
{ \@@_set_selective: }
{ \@@_execute: }
\tl_set:Nn \l_@@_module_tl {#1}
}
-\cs_generate_variant:Nn \@@_set_aux:nnn { o }
-\cs_new_protected:Npn \@@_find_key_module:w #1 / #2 \q_stop
+\cs_generate_variant:Nn \@@_set_keyval:nnn { o }
+\cs_new_protected:Npn \@@_find_key_module:NNw #1#2#3 / #4 \q_stop
{
- \tl_if_blank:nTF {#2}
- { \tl_set:Nn \l_keys_key_tl {#1} }
+ \tl_if_blank:nTF {#4}
+ { \tl_set:Nn #2 {#3} }
{
- \tl_put_right:Nx \l_@@_module_tl
+ \tl_put_right:Nx #1
{
- \tl_if_empty:NF \l_@@_module_tl { / }
- #1
+ \tl_if_empty:NF #1 { / }
+ #3
}
- \@@_find_key_module:w #2 \q_stop
+ \@@_find_key_module:NNw #1#2 #4 \q_stop
}
}
% \end{macrocode}
@@ -2286,6 +2418,7 @@
% \end{macro}
%
% \begin{macro}{\@@_value_or_default:n}
+% \begin{macro}{\@@_default_inherit:}
% If a value is given, return it as |#1|, otherwise send a default if
% available.
% \begin{macrocode}
@@ -2299,16 +2432,37 @@
\l_keys_value_tl
{ \c_@@_default_root_tl \l_keys_path_tl }
}
- { \tl_clear:N \l_keys_value_tl }
+ {
+ \tl_clear:N \l_keys_value_tl
+ \cs_if_exist:cT
+ { \c_@@_inherit_root_tl \@@_parent:o \l_keys_path_tl }
+ { \@@_default_inherit: }
+ }
}
{ \tl_set:Nn \l_keys_value_tl {#1} }
}
+\cs_new_protected:Npn \@@_default_inherit:
+ {
+ \clist_map_inline:cn
+ { \c_@@_inherit_root_tl \@@_parent:o \l_keys_path_tl }
+ {
+ \cs_if_exist:cT
+ { \c_@@_default_root_tl ##1 / \l_keys_key_tl }
+ {
+ \tl_set_eq:Nc
+ \l_keys_value_tl
+ { \c_@@_default_root_tl ##1 / \l_keys_key_tl }
+ \clist_map_break:
+ }
+ }
+ }
% \end{macrocode}
% \end{macro}
+% \end{macro}
%
% \begin{macro}{\@@_execute:, \@@_execute_inherit:, \@@_execute_unknown:}
% \begin{macro}[EXP]{\@@_execute:nn}
-% \begin{macro}{\@@_store_unused:}
+% \begin{macro}{\@@_store_unused:,\@@_store_unused_aux:}
% Actually executing a key is done in two parts. First, look for the
% key itself, then look for the \texttt{unknown} key with the same
% path. If both of these fail, complain. What exactly happens if a key
@@ -2378,15 +2532,70 @@
}
{#2}
}
+% \end{macrocode}
+% When there is no relative path, things here are easy: just save the key
+% name and value. When we are working with a relative path, first we
+% need to turn it into a string: that can't happen earlier as we need
+% to store |\q_no_value|. Then, use a standard delimited approach to fish
+% out the partial path.
+% \begin{macrocode}
\cs_new_protected:Npn \@@_store_unused:
{
- \clist_put_right:Nx \l_@@_unused_clist
+ \quark_if_no_value:NTF \l_@@_relative_tl
+ {
+ \clist_put_right:Nx \l_@@_unused_clist
+ {
+ \exp_not:o \l_keys_key_tl
+ \bool_if:NF \l_@@_no_value_bool
+ { = { \exp_not:o \l_keys_value_tl } }
+ }
+ }
+ {
+ \tl_if_empty:NTF \l_@@_relative_tl
+ {
+ \clist_put_right:Nx \l_@@_unused_clist
+ {
+ \exp_not:o \l_keys_path_tl
+ \bool_if:NF \l_@@_no_value_bool
+ { = { \exp_not:o \l_keys_value_tl } }
+ }
+ }
+ { \@@_store_unused_aux: }
+ }
+ }
+\cs_new_protected:Npn \@@_store_unused_aux:
+ {
+ \tl_set:Nx \l_@@_relative_tl
+ { \exp_args:No \@@_trim_spaces:n \l_@@_relative_tl }
+ \use:x
+ {
+ \cs_set_protected:Npn \@@_store_unused:w
+ ####1 \l_@@_relative_tl /
+ ####2 \l_@@_relative_tl /
+ ####3 \exp_not:N \q_stop
+ }
+ {
+ \tl_if_blank:nF {##1}
+ {
+ \__kernel_msg_error:nnxx { kernel } { bad-relative-key-path }
+ \l_keys_path_tl
+ \l_@@_relative_tl
+ }
+ \clist_put_right:Nx \l_@@_unused_clist
+ {
+ \exp_not:n {##2}
+ \bool_if:NF \l_@@_no_value_bool
+ { = { \exp_not:o \l_keys_value_tl } }
+ }
+ }
+ \use:x
{
- \exp_not:o \l_keys_key_tl
- \bool_if:NF \l_@@_no_value_bool
- { = { \exp_not:o \l_keys_value_tl } }
+ \@@_store_unused:w \l_keys_path_tl
+ \l_@@_relative_tl / \l_@@_relative_tl /
+ \exp_not:N \q_stop
}
}
+\cs_new_protected:Npn \@@_store_unused:w { }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -2411,8 +2620,8 @@
}
\cs_new:Npn \@@_choice_find:nn #1#2
{
- \cs_if_exist:cTF { \c_@@_code_root_tl #1 / \@@_remove_spaces:n {#2} }
- { \use:c { \c_@@_code_root_tl #1 / \@@_remove_spaces:n {#2} } {#2} }
+ \cs_if_exist:cTF { \c_@@_code_root_tl #1 / \@@_trim_spaces:n {#2} }
+ { \use:c { \c_@@_code_root_tl #1 / \@@_trim_spaces:n {#2} } {#2} }
{ \use:c { \c_@@_code_root_tl #1 / unknown } {#2} }
}
\cs_new:Npn \@@_multichoice_find:n #1
@@ -2434,7 +2643,10 @@
\cs_new:Npn \@@_parent:w #1 / #2 / #3 \q_stop #4
{
\tl_if_blank:nTF {#2}
- { \use_none:n #4 }
+ {
+ \tl_if_blank:nF {#4}
+ { \use_none:n #4 }
+ }
{
\@@_parent:w #2 / #3 \q_stop { #4 / #1 }
}
@@ -2443,10 +2655,10 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}[EXP]{\@@_remove_spaces:n}
+% \begin{macro}[EXP]{\@@_trim_spaces:n}
% Used in a few places so worth handling as a dedicated function.
% \begin{macrocode}
-\cs_new:Npn \@@_remove_spaces:n #1
+\cs_new:Npn \@@_trim_spaces:n #1
{ \tl_trim_spaces:o { \tl_to_str:n {#1} } }
% \end{macrocode}
% \end{macro}
@@ -2457,7 +2669,7 @@
\prg_new_conditional:Npnn \keys_if_exist:nn #1#2 { p , T , F , TF }
{
\cs_if_exist:cTF
- { \c_@@_code_root_tl \@@_remove_spaces:n { #1 / #2 } }
+ { \c_@@_code_root_tl \@@_trim_spaces:n { #1 / #2 } }
{ \prg_return_true: }
{ \prg_return_false: }
}
@@ -2471,7 +2683,7 @@
{ p , T , F , TF }
{
\cs_if_exist:cTF
- { \c_@@_code_root_tl \@@_remove_spaces:n { #1 / #2 / #3 } }
+ { \c_@@_code_root_tl \@@_trim_spaces:n { #1 / #2 / #3 } }
{ \prg_return_true: }
{ \prg_return_false: }
}
@@ -2488,7 +2700,7 @@
\cs_new_protected:Npn \@@_show:Nnn #1#2#3
{
#1 { LaTeX / kernel } { show-key }
- { \@@_remove_spaces:n { #2 / #3 } }
+ { \@@_trim_spaces:n { #2 / #3 } }
{
\keys_if_exist:nnT {#2} {#3}
{
@@ -2497,7 +2709,7 @@
\exp_args:Nc \token_get_replacement_spec:N
{
\c_@@_code_root_tl
- \@@_remove_spaces:n { #2 / #3 }
+ \@@_trim_spaces:n { #2 / #3 }
}
}
}
@@ -2511,6 +2723,9 @@
%
% For when there is a need to complain.
% \begin{macrocode}
+\__kernel_msg_new:nnnn { kernel } { bad-relative-key-path }
+ { The~key~'#1'~is~not~inside~the~'#2'~path. }
+ { The~key~'#1'~cannot~be~expressed~relative~to~path~'#2'. }
\__kernel_msg_new:nnnn { kernel } { boolean-values-only }
{ Key~'#1'~accepts~boolean~values~only. }
{ The~key~'#1'~only~accepts~the~values~'true'~and~'false'. }
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx b/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx
index 7c371f2e616..a9a52583115 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx b/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx
index fe4010b94aa..72bfd68be88 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3names.dtx b/Master/texmf-dist/source/latex/l3kernel/l3names.dtx
index 6ea1dc27c8f..07c5a4e47a0 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3names.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3names.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
%
% \maketitle
%
@@ -1326,6 +1326,35 @@
\tex_fi:D
%</package>
% \end{macrocode}
+% A few packages do unfortunate things to date-related primitives.
+% \begin{macrocode}
+\tex_begingroup:D
+ \tex_edef:D \l_tmpa_tl { \tex_meaning:D \tex_time:D }
+ \tex_edef:D \l_tmpb_tl { \tex_string:D \time }
+ \tex_ifx:D \l_tmpa_tl \l_tmpb_tl
+ \tex_else:D
+ \tex_global:D \tex_let:D \tex_time:D \tex_undefined:D
+ \tex_fi:D
+ \tex_edef:D \l_tmpa_tl { \tex_meaning:D \tex_day:D }
+ \tex_edef:D \l_tmpb_tl { \tex_string:D \day }
+ \tex_ifx:D \l_tmpa_tl \l_tmpb_tl
+ \tex_else:D
+ \tex_global:D \tex_let:D \tex_day:D \tex_undefined:D
+ \tex_fi:D
+ \tex_edef:D \l_tmpa_tl { \tex_meaning:D \tex_month:D }
+ \tex_edef:D \l_tmpb_tl { \tex_string:D \month }
+ \tex_ifx:D \l_tmpa_tl \l_tmpb_tl
+ \tex_else:D
+ \tex_global:D \tex_let:D \tex_month:D \tex_undefined:D
+ \tex_fi:D
+ \tex_edef:D \l_tmpa_tl { \tex_meaning:D \tex_year:D }
+ \tex_edef:D \l_tmpb_tl { \tex_string:D \year }
+ \tex_ifx:D \l_tmpa_tl \l_tmpb_tl
+ \tex_else:D
+ \tex_global:D \tex_let:D \tex_year:D \tex_undefined:D
+ \tex_fi:D
+\tex_endgroup:D
+% \end{macrocode}
% Up to v0.80, \LuaTeX{} defines the \pdfTeX{} version data: rather
% confusing. Removing them means that \cs{tex_pdftexversion:D} is
% a marker for \pdfTeX{} alone: useful in engine-dependent code later.
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx b/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx
index c6135bc2728..c216c6dba78 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx b/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx
index 86e901ddb51..b3f70773c4c 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx b/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx
index 3e98198cce3..c3c45583597 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx b/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx
index b5d27a75f3d..5fab54fbcc7 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx b/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx
index 77fb5b94654..75b815fcd2e 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx b/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx
index 31a92b553d9..12876daaa36 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx b/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx
index aa3d23116aa..a41b30fda8a 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3str.dtx b/Master/texmf-dist/source/latex/l3kernel/l3str.dtx
index 5d3cb07f29e..028c89dce77 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3str.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3str.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx b/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx
index ffd7594fc27..c1d0fa59975 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
%
% \maketitle
%
@@ -170,8 +170,9 @@
% \c_sys_month_int,
% \c_sys_year_int,
% }
-% Copies of the information provided by \TeX{}
+% Copies of the information provided by \TeX{}.
% \begin{macrocode}
+%<*initex>
\int_const:Nn \c_sys_minute_int
{ \int_mod:nn { \tex_time:D } { 60 } }
\int_const:Nn \c_sys_hour_int
@@ -179,6 +180,16 @@
\int_const:Nn \c_sys_day_int { \tex_day:D }
\int_const:Nn \c_sys_month_int { \tex_month:D }
\int_const:Nn \c_sys_year_int { \tex_year:D }
+%</initex>
+%<*package>
+\int_const:Nn \c_sys_minute_int
+ { \int_mod:nn { \tex_primitive:D \time } { 60 } }
+\int_const:Nn \c_sys_hour_int
+ { \int_div_truncate:nn { \tex_primitive:D \time } { 60 } }
+\int_const:Nn \c_sys_day_int { \tex_primitive:D \day }
+\int_const:Nn \c_sys_month_int { \tex_primitive:D \month }
+\int_const:Nn \c_sys_year_int { \tex_primitive:D \year }
+%</package>
% \end{macrocode}
% \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 29c9ce4f67c..7938652595f 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx b/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx
index f10e5b74fdf..1c8867340c2 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3token.dtx b/Master/texmf-dist/source/latex/l3kernel/l3token.dtx
index 3725929968d..f3338550ffb 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3token.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3token.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx b/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx
index e7f145d469b..333caddbc60 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
%
% \maketitle
%
diff --git a/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex b/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex
index 736147cc2ef..b8e24f7b71a 100644
--- a/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex
+++ b/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex
@@ -63,7 +63,7 @@
%% and all files in that bundle must be distributed together.
%%
%% File: expl3.dtx
-\def\ExplFileDate{2019-01-28}%
+\def\ExplFileDate{2019-02-15}%
\begingroup
\def\next{\endgroup}%
\expandafter\ifx\csname PackageError\endcsname\relax
@@ -1445,6 +1445,32 @@
\tex_let:D \tex_mapfile:D \tex_undefined:D
\tex_let:D \tex_mapline:D \tex_undefined:D
\tex_fi:D
+\tex_begingroup:D
+ \tex_edef:D \l_tmpa_tl { \tex_meaning:D \tex_time:D }
+ \tex_edef:D \l_tmpb_tl { \tex_string:D \time }
+ \tex_ifx:D \l_tmpa_tl \l_tmpb_tl
+ \tex_else:D
+ \tex_global:D \tex_let:D \tex_time:D \tex_undefined:D
+ \tex_fi:D
+ \tex_edef:D \l_tmpa_tl { \tex_meaning:D \tex_day:D }
+ \tex_edef:D \l_tmpb_tl { \tex_string:D \day }
+ \tex_ifx:D \l_tmpa_tl \l_tmpb_tl
+ \tex_else:D
+ \tex_global:D \tex_let:D \tex_day:D \tex_undefined:D
+ \tex_fi:D
+ \tex_edef:D \l_tmpa_tl { \tex_meaning:D \tex_month:D }
+ \tex_edef:D \l_tmpb_tl { \tex_string:D \month }
+ \tex_ifx:D \l_tmpa_tl \l_tmpb_tl
+ \tex_else:D
+ \tex_global:D \tex_let:D \tex_month:D \tex_undefined:D
+ \tex_fi:D
+ \tex_edef:D \l_tmpa_tl { \tex_meaning:D \tex_year:D }
+ \tex_edef:D \l_tmpb_tl { \tex_string:D \year }
+ \tex_ifx:D \l_tmpa_tl \l_tmpb_tl
+ \tex_else:D
+ \tex_global:D \tex_let:D \tex_year:D \tex_undefined:D
+ \tex_fi:D
+\tex_endgroup:D
\tex_ifdefined:D \tex_luatexversion:D
\tex_let:D \tex_pdftexbanner:D \tex_undefined:D
\tex_let:D \tex_pdftexrevision:D \tex_undefined:D
@@ -4075,7 +4101,7 @@
{
\str_map_inline:nn {##1}
{
- \str_if_in:nnF { NnpcofVvx } {####1}
+ \str_if_in:nnF { NnpcofeVvx } {####1}
{
\__kernel_msg_error:nnnn { kernel } { invalid-exp-args }
{####1} {##1}
@@ -7705,12 +7731,12 @@
%% File: l3sys.dtx
\str_const:Nx \c_sys_jobname_str { \tex_jobname:D }
\int_const:Nn \c_sys_minute_int
- { \int_mod:nn { \tex_time:D } { 60 } }
+ { \int_mod:nn { \tex_primitive:D \time } { 60 } }
\int_const:Nn \c_sys_hour_int
- { \int_div_truncate:nn { \tex_time:D } { 60 } }
-\int_const:Nn \c_sys_day_int { \tex_day:D }
-\int_const:Nn \c_sys_month_int { \tex_month:D }
-\int_const:Nn \c_sys_year_int { \tex_year:D }
+ { \int_div_truncate:nn { \tex_primitive:D \time } { 60 } }
+\int_const:Nn \c_sys_day_int { \tex_primitive:D \day }
+\int_const:Nn \c_sys_month_int { \tex_primitive:D \month }
+\int_const:Nn \c_sys_year_int { \tex_primitive:D \year }
\cs_new_protected:Npn \__sys_const:nn #1#2
{
\bool_if:nTF {#2}
@@ -12027,6 +12053,8 @@
\bool_new:N \l__keys_only_known_bool
\tl_new:N \l_keys_path_tl
\tl_new:N \l__keys_inherit_tl
+\tl_new:N \l__keys_relative_tl
+\tl_set:Nn \l__keys_relative_tl { \q_no_value }
\tl_new:N \l__keys_property_tl
\bool_new:N \l__keys_selective_bool
\bool_new:N \l__keys_filtered_bool
@@ -12034,11 +12062,13 @@
\tl_new:N \l__keys_unused_clist
\tl_new:N \l_keys_value_tl
\bool_new:N \l__keys_tmp_bool
+\tl_new:N \l__keys_tmpa_tl
+\tl_new:N \l__keys_tmpb_tl
\cs_new_protected:Npn \keys_define:nn
{ \__keys_define:onn \l__keys_module_tl }
\cs_new_protected:Npn \__keys_define:nnn #1#2#3
{
- \tl_set:Nx \l__keys_module_tl { \__keys_remove_spaces:n {#2} }
+ \tl_set:Nx \l__keys_module_tl { \__keys_trim_spaces:n {#2} }
\keyval_parse:NNn \__keys_define:n \__keys_define:nn {#3}
\tl_set:Nn \l__keys_module_tl {#1}
}
@@ -12068,7 +12098,7 @@
}
\cs_new_protected:Npn \__keys_property_find:n #1
{
- \tl_set:Nx \l__keys_property_tl { \__keys_remove_spaces:n {#1} }
+ \tl_set:Nx \l__keys_property_tl { \__keys_trim_spaces:n {#1} }
\exp_after:wN \__keys_property_find:w \l__keys_property_tl . .
\q_stop {#1}
}
@@ -12201,7 +12231,7 @@
{
\int_incr:N \l_keys_choice_int
\__keys_cmd_set:nx
- { \l_keys_path_tl / \__keys_remove_spaces:n {##1} }
+ { \l_keys_path_tl / \__keys_trim_spaces:n {##1} }
{
\tl_set:Nn \exp_not:N \l_keys_choice_tl {##1}
\int_set:Nn \exp_not:N \l_keys_choice_int
@@ -12228,7 +12258,7 @@
\tex_undefined:D
}
{
- \cs_set:cpx
+ \cs_set_nopar:cpx
{ \c__keys_default_root_tl \l_keys_path_tl }
{ \exp_not:n {#1} }
}
@@ -12265,6 +12295,22 @@
}
\cs_new_protected:Npn \__keys_meta_make:nn #1#2
{ \__keys_cmd_set:Vn \l_keys_path_tl { \keys_set:nn {#1} {#2} } }
+\cs_new_protected:Npn \__keys_prop_put:Nn #1#2
+ {
+ \prop_if_exist:NF #1 { \prop_new:N #1 }
+ \exp_after:wN \__keys_find_key_module:NNw
+ \exp_after:wN \l__keys_tmpa_tl
+ \exp_after:wN \l__keys_tmpb_tl
+ \l_keys_path_tl / \q_stop
+ \__keys_cmd_set:nx { \l_keys_path_tl }
+ {
+ \exp_not:c { prop_ #2 put:Nnn }
+ \exp_not:N #1
+ { \l__keys_tmpb_tl }
+ \exp_not:n { {##1} }
+ }
+ }
+\cs_generate_variant:Nn \__keys_prop_put:Nn { c }
\cs_new_protected:Npn \__keys_undefine:
{
\clist_map_inline:nn
@@ -12427,6 +12473,14 @@
{ \exp_args:No \__keys_multichoices_make:nn #1 }
\cs_new_protected:cpn { \c__keys_props_root_tl .multichoices:xn } #1
{ \exp_args:Nx \__keys_multichoices_make:nn #1 }
+\cs_new_protected:cpn { \c__keys_props_root_tl .prop_put:N } #1
+ { \__keys_prop_put:Nn #1 { } }
+\cs_new_protected:cpn { \c__keys_props_root_tl .prop_put:c } #1
+ { \__keys_prop_put:cn {#1} { } }
+\cs_new_protected:cpn { \c__keys_props_root_tl .prop_gput:N } #1
+ { \__keys_prop_put:Nn #1 { g } }
+\cs_new_protected:cpn { \c__keys_props_root_tl .prop_gput:c } #1
+ { \__keys_prop_put:cn {#1} { g } }
\cs_new_protected:cpn { \c__keys_props_root_tl .skip_set:N } #1
{ \__keys_variable_set:NnnN #1 { skip } { } n }
\cs_new_protected:cpn { \c__keys_props_root_tl .skip_set:c } #1
@@ -12457,136 +12511,189 @@
{ \__keys_value_requirement:nn { forbidden } {#1} }
\cs_new_protected:cpn { \c__keys_props_root_tl .value_required:n } #1
{ \__keys_value_requirement:nn { required } {#1} }
-\cs_new_protected:Npn \keys_set:nn
- { \__keys_set:onn { \l__keys_module_tl } }
+\cs_new_protected:Npn \keys_set:nn #1#2
+ {
+ \use:x
+ {
+ \bool_set_false:N \exp_not:N \l__keys_only_known_bool
+ \bool_set_false:N \exp_not:N \l__keys_filtered_bool
+ \bool_set_false:N \exp_not:N \l__keys_selective_bool
+ \tl_set:Nn \exp_not:N \l__keys_relative_tl
+ { \exp_not:N \q_no_value }
+ \__keys_set:nn \exp_not:n { {#1} {#2} }
+ \bool_if:NT \l__keys_only_known_bool
+ { \bool_set_true:N \exp_not:N \l__keys_only_known_bool }
+ \bool_if:NT \l__keys_filtered_bool
+ { \bool_set_true:N \exp_not:N \l__keys_filtered_bool }
+ \bool_if:NT \l__keys_selective_bool
+ { \bool_set_true:N \exp_not:N \l__keys_selective_bool }
+ \tl_set:Nn \exp_not:N \l__keys_relative_tl
+ { \exp_not:o \l__keys_relative_tl }
+ }
+ }
+\cs_generate_variant:Nn \keys_set:nn { nV , nv , no }
+\cs_new_protected:Npn \__keys_set:nn #1#2
+ { \exp_args:No \__keys_set:nnn \l__keys_module_tl {#1} {#2} }
\cs_new_protected:Npn \__keys_set:nnn #1#2#3
{
- \tl_set:Nx \l__keys_module_tl { \__keys_remove_spaces:n {#2} }
- \keyval_parse:NNn \__keys_set:n \__keys_set:nn {#3}
+ \tl_set:Nx \l__keys_module_tl { \__keys_trim_spaces:n {#2} }
+ \keyval_parse:NNn \__keys_set_keyval:n \__keys_set_keyval:nn {#3}
\tl_set:Nn \l__keys_module_tl {#1}
}
-\cs_generate_variant:Nn \keys_set:nn { nV , nv , no }
-\cs_generate_variant:Nn \__keys_set:nnn { o }
-\cs_new_protected:Npn \keys_set_known:nnN
- { \__keys_set_known:onnN \l__keys_unused_clist }
+\cs_new_protected:Npn \keys_set_known:nnN #1#2#3
+ {
+ \exp_args:No \__keys_set_known:nnnnN
+ \l__keys_unused_clist { \q_no_value } {#1} {#2} #3
+ }
\cs_generate_variant:Nn \keys_set_known:nnN { nV , nv , no }
-\cs_new_protected:Npn \__keys_set_known:nnnN #1#2#3#4
+\cs_new_protected:Npn \keys_set_known:nnnN #1#2#3#4
+ {
+ \exp_args:No \__keys_set_known:nnnnN
+ \l__keys_unused_clist {#3} {#1} {#2} #4
+ }
+\cs_generate_variant:Nn \keys_set_known:nnnN { nV , nv , no }
+\cs_new_protected:Npn \__keys_set_known:nnnnN #1#2#3#4#5
{
\clist_clear:N \l__keys_unused_clist
- \keys_set_known:nn {#2} {#3}
- \tl_set:Nx #4 { \exp_not:o { \l__keys_unused_clist } }
+ \__keys_set_known:nnn {#2} {#3} {#4}
+ \tl_set:Nx #5 { \exp_not:o { \l__keys_unused_clist } }
\tl_set:Nn \l__keys_unused_clist {#1}
}
-\cs_generate_variant:Nn \__keys_set_known:nnnN { o }
\cs_new_protected:Npn \keys_set_known:nn #1#2
+ { \__keys_set_known:nnn { \q_no_value } {#1} {#2} }
+\cs_generate_variant:Nn \keys_set_known:nn { nV , nv , no }
+\cs_new_protected:Npn \__keys_set_known:nnn #1#2#3
{
- \bool_if:NTF \l__keys_only_known_bool
- { \keys_set:nn }
- { \__keys_set_known:nn }
- {#1} {#2}
+ \use:x
+ {
+ \bool_set_true:N \exp_not:N \l__keys_only_known_bool
+ \bool_set_false:N \exp_not:N \l__keys_filtered_bool
+ \bool_set_false:N \exp_not:N \l__keys_selective_bool
+ \tl_set:Nn \exp_not:N \l__keys_relative_tl { \exp_not:n {#1} }
+ \__keys_set:nn \exp_not:n { {#2} {#3} }
+ \bool_if:NF \l__keys_only_known_bool
+ { \bool_set_false:N \exp_not:N \l__keys_only_known_bool }
+ \bool_if:NT \l__keys_filtered_bool
+ { \bool_set_true:N \exp_not:N \l__keys_filtered_bool }
+ \bool_if:NT \l__keys_selective_bool
+ { \bool_set_true:N \exp_not:N \l__keys_selective_bool }
+ \tl_set:Nn \exp_not:N \l__keys_relative_tl
+ { \exp_not:o \l__keys_relative_tl }
+ }
}
-\cs_generate_variant:Nn \keys_set_known:nn { nV , nv , no }
-\cs_new_protected:Npn \__keys_set_known:nn #1#2
+\cs_new_protected:Npn \keys_set_filter:nnnN #1#2#3#4
{
- \bool_set_true:N \l__keys_only_known_bool
- \keys_set:nn {#1} {#2}
- \bool_set_false:N \l__keys_only_known_bool
+ \exp_args:No \__keys_set_filter:nnnnnN
+ \l__keys_unused_clist
+ { \q_no_value } {#1} {#2} {#3} #4
}
-\cs_new_protected:Npn \keys_set_filter:nnnN
- { \__keys_set_filter:onnnN \l__keys_unused_clist }
\cs_generate_variant:Nn \keys_set_filter:nnnN { nnV , nnv , nno }
-\cs_new_protected:Npn \__keys_set_filter:nnnnN #1#2#3#4#5
+\cs_new_protected:Npn \keys_set_filter:nnnnN #1#2#3#4#5
+ {
+ \exp_args:No \__keys_set_filter:nnnnnN
+ \l__keys_unused_clist {#4} {#1} {#2} {#3} #5
+ }
+\cs_generate_variant:Nn \keys_set_filter:nnnnN { nnV , nnv , nno }
+\cs_new_protected:Npn \__keys_set_filter:nnnnnN #1#2#3#4#5#6
{
\clist_clear:N \l__keys_unused_clist
- \keys_set_filter:nnn {#2} {#3} {#4}
- \tl_set:Nx #5 { \exp_not:o { \l__keys_unused_clist } }
+ \__keys_set_filter:nnnn {#2} {#3} {#4} {#5}
+ \tl_set:Nx #6 { \exp_not:o { \l__keys_unused_clist } }
\tl_set:Nn \l__keys_unused_clist {#1}
}
-\cs_generate_variant:Nn \__keys_set_filter:nnnnN { o }
\cs_new_protected:Npn \keys_set_filter:nnn #1#2#3
- {
- \bool_if:NTF \l__keys_filtered_bool
- { \__keys_set_selective:nnn }
- { \__keys_set_filter:nnn }
- {#1} {#2} {#3}
- }
+ {\__keys_set_filter:nnnn { \q_no_value } {#1} {#2} {#3} }
\cs_generate_variant:Nn \keys_set_filter:nnn { nnV , nnv , nno }
-\cs_new_protected:Npn \__keys_set_filter:nnn #1#2#3
+\cs_new_protected:Npn \__keys_set_filter:nnnn #1#2#3#4
{
- \bool_set_true:N \l__keys_filtered_bool
- \__keys_set_selective:nnn {#1} {#2} {#3}
- \bool_set_false:N \l__keys_filtered_bool
+ \use:x
+ {
+ \bool_set_false:N \exp_not:N \l__keys_only_known_bool
+ \bool_set_true:N \exp_not:N \l__keys_filtered_bool
+ \bool_set_true:N \exp_not:N \l__keys_selective_bool
+ \tl_set:Nn \exp_not:N \l__keys_relative_tl { \exp_not:n {#1} }
+ \__keys_set_selective:nnn \exp_not:n { {#2} {#3} {#4} }
+ \bool_if:NT \l__keys_only_known_bool
+ { \bool_set_true:N \exp_not:N \l__keys_only_known_bool }
+ \bool_if:NF \l__keys_filtered_bool
+ { \bool_set_false:N \exp_not:N \l__keys_filtered_bool }
+ \bool_if:NF \l__keys_selective_bool
+ { \bool_set_false:N \exp_not:N \l__keys_selective_bool }
+ \tl_set:Nn \exp_not:N \l__keys_relative_tl
+ { \exp_not:o \l__keys_relative_tl }
+ }
}
\cs_new_protected:Npn \keys_set_groups:nnn #1#2#3
{
- \bool_if:NTF \l__keys_filtered_bool
- { \__keys_set_groups:nnn }
- { \__keys_set_selective:nnn }
- {#1} {#2} {#3}
+ \use:x
+ {
+ \bool_set_false:N \exp_not:N \l__keys_only_known_bool
+ \bool_set_false:N \exp_not:N \l__keys_filtered_bool
+ \bool_set_true:N \exp_not:N \l__keys_selective_bool
+ \tl_set:Nn \exp_not:N \l__keys_relative_tl
+ { \exp_not:N \q_no_value }
+ \__keys_set_selective:nnn \exp_not:n { {#1} {#2} {#3} }
+ \bool_if:NT \l__keys_only_known_bool
+ { \bool_set_true:N \exp_not:N \l__keys_only_known_bool }
+ \bool_if:NF \l__keys_filtered_bool
+ { \bool_set_true:N \exp_not:N \l__keys_filtered_bool }
+ \bool_if:NF \l__keys_selective_bool
+ { \bool_set_false:N \exp_not:N \l__keys_selective_bool }
+ \tl_set:Nn \exp_not:N \l__keys_relative_tl
+ { \exp_not:o \l__keys_relative_tl }
+ }
}
\cs_generate_variant:Nn \keys_set_groups:nnn { nnV , nnv , nno }
-\cs_new_protected:Npn \__keys_set_groups:nnn #1#2#3
- {
- \bool_set_false:N \l__keys_filtered_bool
- \__keys_set_selective:nnn {#1} {#2} {#3}
- \bool_set_true:N \l__keys_filtered_bool
- }
\cs_new_protected:Npn \__keys_set_selective:nnn
- { \__keys_set_selective:onnn \l__keys_selective_seq }
+ { \exp_args:No \__keys_set_selective:nnnn \l__keys_selective_seq }
\cs_new_protected:Npn \__keys_set_selective:nnnn #1#2#3#4
{
\seq_set_from_clist:Nn \l__keys_selective_seq {#3}
- \bool_if:NTF \l__keys_selective_bool
- { \keys_set:nn }
- { \__keys_set_selective:nn }
- {#2} {#4}
+ \__keys_set:nn {#2} {#4}
\tl_set:Nn \l__keys_selective_seq {#1}
}
-\cs_generate_variant:Nn \__keys_set_selective:nnnn { o }
-\cs_new_protected:Npn \__keys_set_selective:nn #1#2
- {
- \bool_set_true:N \l__keys_selective_bool
- \keys_set:nn {#1} {#2}
- \bool_set_false:N \l__keys_selective_bool
- }
-\cs_new_protected:Npn \__keys_set:n #1
+\cs_new_protected:Npn \__keys_set_keyval:n #1
{
\bool_set_true:N \l__keys_no_value_bool
- \__keys_set_aux:onn \l__keys_module_tl {#1} { }
+ \__keys_set_keyval:onn \l__keys_module_tl {#1} { }
}
-\cs_new_protected:Npn \__keys_set:nn #1#2
+\cs_new_protected:Npn \__keys_set_keyval:nn #1#2
{
\bool_set_false:N \l__keys_no_value_bool
- \__keys_set_aux:onn \l__keys_module_tl {#1} {#2}
+ \__keys_set_keyval:onn \l__keys_module_tl {#1} {#2}
}
-\cs_new_protected:Npn \__keys_set_aux:nnn #1#2#3
+\cs_new_protected:Npn \__keys_set_keyval:nnn #1#2#3
{
\tl_set:Nx \l_keys_path_tl
{
\tl_if_blank:nF {#1}
{ #1 / }
- \__keys_remove_spaces:n {#2}
+ \__keys_trim_spaces:n {#2}
}
\tl_clear:N \l__keys_module_tl
- \exp_after:wN \__keys_find_key_module:w \l_keys_path_tl / \q_stop
+ \tl_clear:N \l__keys_inherit_tl
+ \exp_after:wN \__keys_find_key_module:NNw
+ \exp_after:wN \l__keys_module_tl
+ \exp_after:wN \l_keys_key_tl
+ \l_keys_path_tl / \q_stop
\__keys_value_or_default:n {#3}
\bool_if:NTF \l__keys_selective_bool
{ \__keys_set_selective: }
{ \__keys_execute: }
\tl_set:Nn \l__keys_module_tl {#1}
}
-\cs_generate_variant:Nn \__keys_set_aux:nnn { o }
-\cs_new_protected:Npn \__keys_find_key_module:w #1 / #2 \q_stop
+\cs_generate_variant:Nn \__keys_set_keyval:nnn { o }
+\cs_new_protected:Npn \__keys_find_key_module:NNw #1#2#3 / #4 \q_stop
{
- \tl_if_blank:nTF {#2}
- { \tl_set:Nn \l_keys_key_tl {#1} }
+ \tl_if_blank:nTF {#4}
+ { \tl_set:Nn #2 {#3} }
{
- \tl_put_right:Nx \l__keys_module_tl
+ \tl_put_right:Nx #1
{
- \tl_if_empty:NF \l__keys_module_tl { / }
- #1
+ \tl_if_empty:NF #1 { / }
+ #3
}
- \__keys_find_key_module:w #2 \q_stop
+ \__keys_find_key_module:NNw #1#2 #4 \q_stop
}
}
\cs_new_protected:Npn \__keys_set_selective:
@@ -12639,10 +12746,30 @@
\l_keys_value_tl
{ \c__keys_default_root_tl \l_keys_path_tl }
}
- { \tl_clear:N \l_keys_value_tl }
+ {
+ \tl_clear:N \l_keys_value_tl
+ \cs_if_exist:cT
+ { \c__keys_inherit_root_tl \__keys_parent:o \l_keys_path_tl }
+ { \__keys_default_inherit: }
+ }
}
{ \tl_set:Nn \l_keys_value_tl {#1} }
}
+\cs_new_protected:Npn \__keys_default_inherit:
+ {
+ \clist_map_inline:cn
+ { \c__keys_inherit_root_tl \__keys_parent:o \l_keys_path_tl }
+ {
+ \cs_if_exist:cT
+ { \c__keys_default_root_tl ##1 / \l_keys_key_tl }
+ {
+ \tl_set_eq:Nc
+ \l_keys_value_tl
+ { \c__keys_default_root_tl ##1 / \l_keys_key_tl }
+ \clist_map_break:
+ }
+ }
+ }
\cs_new_protected:Npn \__keys_execute:
{
\cs_if_exist:cTF { \c__keys_code_root_tl \l_keys_path_tl }
@@ -12703,13 +12830,61 @@
}
\cs_new_protected:Npn \__keys_store_unused:
{
- \clist_put_right:Nx \l__keys_unused_clist
+ \quark_if_no_value:NTF \l__keys_relative_tl
+ {
+ \clist_put_right:Nx \l__keys_unused_clist
+ {
+ \exp_not:o \l_keys_key_tl
+ \bool_if:NF \l__keys_no_value_bool
+ { = { \exp_not:o \l_keys_value_tl } }
+ }
+ }
+ {
+ \tl_if_empty:NTF \l__keys_relative_tl
+ {
+ \clist_put_right:Nx \l__keys_unused_clist
+ {
+ \exp_not:o \l_keys_path_tl
+ \bool_if:NF \l__keys_no_value_bool
+ { = { \exp_not:o \l_keys_value_tl } }
+ }
+ }
+ { \__keys_store_unused_aux: }
+ }
+ }
+\cs_new_protected:Npn \__keys_store_unused_aux:
+ {
+ \tl_set:Nx \l__keys_relative_tl
+ { \exp_args:No \__keys_trim_spaces:n \l__keys_relative_tl }
+ \use:x
{
- \exp_not:o \l_keys_key_tl
- \bool_if:NF \l__keys_no_value_bool
- { = { \exp_not:o \l_keys_value_tl } }
+ \cs_set_protected:Npn \__keys_store_unused:w
+ ####1 \l__keys_relative_tl /
+ ####2 \l__keys_relative_tl /
+ ####3 \exp_not:N \q_stop
+ }
+ {
+ \tl_if_blank:nF {##1}
+ {
+ \__kernel_msg_error:nnxx { kernel } { bad-relative-key-path }
+ \l_keys_path_tl
+ \l__keys_relative_tl
+ }
+ \clist_put_right:Nx \l__keys_unused_clist
+ {
+ \exp_not:n {##2}
+ \bool_if:NF \l__keys_no_value_bool
+ { = { \exp_not:o \l_keys_value_tl } }
+ }
+ }
+ \use:x
+ {
+ \__keys_store_unused:w \l_keys_path_tl
+ \l__keys_relative_tl / \l__keys_relative_tl /
+ \exp_not:N \q_stop
}
}
+\cs_new_protected:Npn \__keys_store_unused:w { }
\cs_new:Npn \__keys_choice_find:n #1
{
\tl_if_empty:NTF \l__keys_inherit_tl
@@ -12721,8 +12896,8 @@
}
\cs_new:Npn \__keys_choice_find:nn #1#2
{
- \cs_if_exist:cTF { \c__keys_code_root_tl #1 / \__keys_remove_spaces:n {#2} }
- { \use:c { \c__keys_code_root_tl #1 / \__keys_remove_spaces:n {#2} } {#2} }
+ \cs_if_exist:cTF { \c__keys_code_root_tl #1 / \__keys_trim_spaces:n {#2} }
+ { \use:c { \c__keys_code_root_tl #1 / \__keys_trim_spaces:n {#2} } {#2} }
{ \use:c { \c__keys_code_root_tl #1 / unknown } {#2} }
}
\cs_new:Npn \__keys_multichoice_find:n #1
@@ -12733,17 +12908,20 @@
\cs_new:Npn \__keys_parent:w #1 / #2 / #3 \q_stop #4
{
\tl_if_blank:nTF {#2}
- { \use_none:n #4 }
+ {
+ \tl_if_blank:nF {#4}
+ { \use_none:n #4 }
+ }
{
\__keys_parent:w #2 / #3 \q_stop { #4 / #1 }
}
}
-\cs_new:Npn \__keys_remove_spaces:n #1
+\cs_new:Npn \__keys_trim_spaces:n #1
{ \tl_trim_spaces:o { \tl_to_str:n {#1} } }
\prg_new_conditional:Npnn \keys_if_exist:nn #1#2 { p , T , F , TF }
{
\cs_if_exist:cTF
- { \c__keys_code_root_tl \__keys_remove_spaces:n { #1 / #2 } }
+ { \c__keys_code_root_tl \__keys_trim_spaces:n { #1 / #2 } }
{ \prg_return_true: }
{ \prg_return_false: }
}
@@ -12751,7 +12929,7 @@
{ p , T , F , TF }
{
\cs_if_exist:cTF
- { \c__keys_code_root_tl \__keys_remove_spaces:n { #1 / #2 / #3 } }
+ { \c__keys_code_root_tl \__keys_trim_spaces:n { #1 / #2 / #3 } }
{ \prg_return_true: }
{ \prg_return_false: }
}
@@ -12762,7 +12940,7 @@
\cs_new_protected:Npn \__keys_show:Nnn #1#2#3
{
#1 { LaTeX / kernel } { show-key }
- { \__keys_remove_spaces:n { #2 / #3 } }
+ { \__keys_trim_spaces:n { #2 / #3 } }
{
\keys_if_exist:nnT {#2} {#3}
{
@@ -12771,13 +12949,16 @@
\exp_args:Nc \token_get_replacement_spec:N
{
\c__keys_code_root_tl
- \__keys_remove_spaces:n { #2 / #3 }
+ \__keys_trim_spaces:n { #2 / #3 }
}
}
}
}
{ } { }
}
+\__kernel_msg_new:nnnn { kernel } { bad-relative-key-path }
+ { The~key~'#1'~is~not~inside~the~'#2'~path. }
+ { The~key~'#1'~cannot~be~expressed~relative~to~path~'#2'. }
\__kernel_msg_new:nnnn { kernel } { boolean-values-only }
{ Key~'#1'~accepts~boolean~values~only. }
{ The~key~'#1'~only~accepts~the~values~'true'~and~'false'. }
@@ -26319,7 +26500,7 @@
{ 2 + \tl_count_tokens:n {#2} + }
\__kernel_patch_deprecation:nnNNpn { 2020-12-31 } { \file_get:nnN }
\cs_new_protected:Npn \tl_set_from_file:Nnn #1#2#3
- { \file_get:nnN {#2} {#3} #1 }
+ { \file_get:nnN {#3} {#2} #1 }
\cs_generate_variant:Nn \tl_set_from_file:Nnn { c }
\__kernel_patch_deprecation:nnNNpn { 2020-12-31 } { \file_get:nnN }
\cs_new_protected:Npn \tl_gset_from_file:Nnn #1#2#3
diff --git a/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex b/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex
index a261d8479a9..e7d654d6a8a 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
-\def\ExplFileDate{2019-01-28}%
+\def\ExplFileDate{2019-02-15}%
\let\ExplLoaderFileDate\ExplFileDate
\begingroup
\def\tempa{LaTeX2e}%
diff --git a/Master/texmf-dist/tex/latex/l3kernel/expl3.sty b/Master/texmf-dist/tex/latex/l3kernel/expl3.sty
index e99ddd19f45..d769fe86182 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
-\def\ExplFileDate{2019-01-28}%
+\def\ExplFileDate{2019-02-15}%
\let\ExplLoaderFileDate\ExplFileDate
\ProvidesPackage{expl3}
[%
diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3dvipdfmx.def b/Master/texmf-dist/tex/latex/l3kernel/l3dvipdfmx.def
index bf2801a5f87..9c6af22ed72 100644
--- a/Master/texmf-dist/tex/latex/l3kernel/l3dvipdfmx.def
+++ b/Master/texmf-dist/tex/latex/l3kernel/l3dvipdfmx.def
@@ -20,7 +20,7 @@
%%
%% File: l3drivers.dtx
\ProvidesExplFile
- {l3dvipdfmx.def}{2019-01-28}{}
+ {l3dvipdfmx.def}{2019-02-15}{}
{L3 Experimental driver: dvipdfmx}
\cs_new_eq:NN \__driver_literal:e \tex_special:D
\cs_new_protected:Npn \__driver_literal:n #1
diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3dvips.def b/Master/texmf-dist/tex/latex/l3kernel/l3dvips.def
index 4a5360acf1d..dd10a02d9f9 100644
--- a/Master/texmf-dist/tex/latex/l3kernel/l3dvips.def
+++ b/Master/texmf-dist/tex/latex/l3kernel/l3dvips.def
@@ -20,7 +20,7 @@
%%
%% File: l3drivers.dtx
\ProvidesExplFile
- {l3dvips.def}{2019-01-28}{}
+ {l3dvips.def}{2019-02-15}{}
{L3 Experimental driver: dvips}
\cs_new_eq:NN \__driver_literal:e \tex_special:D
\cs_new_protected:Npn \__driver_literal:n #1
diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3dvisvgm.def b/Master/texmf-dist/tex/latex/l3kernel/l3dvisvgm.def
index 3de26c06f55..b6abca2dd71 100644
--- a/Master/texmf-dist/tex/latex/l3kernel/l3dvisvgm.def
+++ b/Master/texmf-dist/tex/latex/l3kernel/l3dvisvgm.def
@@ -20,7 +20,7 @@
%%
%% File: l3drivers.dtx
\ProvidesExplFile
- {l3dvisvgm.def}{2019-01-28}{}
+ {l3dvisvgm.def}{2019-02-15}{}
{L3 Experimental driver: dvisvgm}
\cs_new_eq:NN \__driver_literal:e \tex_special:D
\cs_new_protected:Npn \__driver_literal:n #1
diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def b/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def
index b450be1a246..997a498f6f6 100644
--- a/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def
+++ b/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def
@@ -20,7 +20,7 @@
%%
%% File: l3drivers.dtx
\ProvidesExplFile
- {l3pdfmode.def}{2019-01-28}{}
+ {l3pdfmode.def}{2019-02-15}{}
{L3 Experimental driver: PDF mode}
\cs_new_eq:NN \__driver_literal:e \tex_special:D
\cs_new_protected:Npn \__driver_literal:n #1
diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3xdvipdfmx.def b/Master/texmf-dist/tex/latex/l3kernel/l3xdvipdfmx.def
index 2c554d054f4..2684228d0c7 100644
--- a/Master/texmf-dist/tex/latex/l3kernel/l3xdvipdfmx.def
+++ b/Master/texmf-dist/tex/latex/l3kernel/l3xdvipdfmx.def
@@ -20,7 +20,7 @@
%%
%% File: l3drivers.dtx
\ProvidesExplFile
- {l3xdvipdfmx.def}{2019-01-28}{}
+ {l3xdvipdfmx.def}{2019-02-15}{}
{L3 Experimental driver: xdvipdfmx}
\cs_new_eq:NN \__driver_literal:e \tex_special:D
\cs_new_protected:Npn \__driver_literal:n #1