texlive[50036] Master/texmf-dist: l3kernel (16feb19)

commits+karl at tug.org commits+karl at tug.org
Sat Feb 16 23:39:34 CET 2019


Revision: 50036
          http://tug.org/svn/texlive?view=revision&revision=50036
Author:   karl
Date:     2019-02-16 23:39:34 +0100 (Sat, 16 Feb 2019)
Log Message:
-----------
l3kernel (16feb19)

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

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md	2019-02-16 22:39:34 UTC (rev 50036)
@@ -7,6 +7,31 @@
 
 ## [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 @@
 - 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

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/README.md	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/README.md	2019-02-16 22:39:34 UTC (rev 50036)
@@ -1,7 +1,7 @@
 LaTeX3 Programming Conventions
 ==============================
 
-Release 2019-01-28
+Release 2019-02-15
 
 Overview
 --------

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

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

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex	2019-02-16 22:39:34 UTC (rev 50036)
@@ -54,7 +54,7 @@
          {latex-team at latex-project.org}%
    }%
 }
-\date{Released 2019-01-28}
+\date{Released 2019-02-15}
 
 \pagenumbering{roman}
 \maketitle

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

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

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex	2019-02-16 22:39:34 UTC (rev 50036)
@@ -32,7 +32,7 @@
         {latex-team at latex-project.org}%
     }%
 }
-\date{Released 2019-01-28}
+\date{Released 2019-02-15}
 
 \begin{document}
 

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

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex	2019-02-16 22:39:34 UTC (rev 50036)
@@ -32,7 +32,7 @@
         {latex-team at latex-project.org}%
     }%
 }
-\date{Released 2019-01-28}
+\date{Released 2019-02-15}
 
 \newcommand{\TF}{\textit{(TF)}}
 

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

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex	2019-02-16 22:39:34 UTC (rev 50036)
@@ -32,7 +32,7 @@
         {latex-team at latex-project.org}%
     }%
 }
-\date{Released 2019-01-28}
+\date{Released 2019-02-15}
 
 \newcommand{\TF}{\textit{(TF)}}
 

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

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex	2019-02-16 22:39:34 UTC (rev 50036)
@@ -53,7 +53,7 @@
          {latex-team at latex-project.org}%
    }%
 }
-\date{Released 2019-01-28}
+\date{Released 2019-02-15}
 
 \pagenumbering{roman}
 \maketitle

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/source3body.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/source3body.tex	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/source3body.tex	2019-02-16 22:39:34 UTC (rev 50036)
@@ -134,10 +134,6 @@
 \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 @@
     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 @@
   \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 @@
 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 @@
 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.
 

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -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
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -140,7 +140,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
 %
 % \maketitle
 %
@@ -246,7 +246,8 @@
 %
 % \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}
@@ -253,7 +254,7 @@
 %   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

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -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,

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -79,7 +79,7 @@
 %
 % \title{The \cls{l3doc} class}
 % \author{\Team}
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
 % \maketitle
 % \tableofcontents
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -63,7 +63,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -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>

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -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}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3final.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3final.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3final.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
 % \maketitle
 %
 % \begin{documentation}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
 % \maketitle
 %
 % \begin{documentation}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -49,7 +49,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -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,13 +2123,18 @@
 %     \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
@@ -2046,30 +2141,46 @@
 %   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}
@@ -2076,6 +2187,7 @@
 % \end{macro}
 % \end{macro}
 % \end{macro}
+% \end{macro}
 %
 % \begin{macro}
 %   {
@@ -2082,84 +2194,101 @@
 %     \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,16 +2325,20 @@
 %   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: }
@@ -2213,18 +2345,18 @@
       { \@@_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
       {
-        \exp_not:o \l_keys_key_tl
-        \bool_if:NF \l_@@_no_value_bool
-          { = { \exp_not:o \l_keys_value_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
+      {
+        \@@_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,8 +2643,11 @@
 \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'. }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -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.

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -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}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx	2019-02-16 22:39:34 UTC (rev 50036)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-01-28}
+% \date{Released 2019-02-15}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex	2019-02-16 22:39:34 UTC (rev 50036)
@@ -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,118 +12511,171 @@
   { \__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
+\cs_new_protected:Npn \__keys_set_keyval:n #1
   {
-    \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
-  {
     \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: }
@@ -12575,18 +12682,18 @@
       { \__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
       {
-        \exp_not:o \l_keys_key_tl
-        \bool_if:NF \l__keys_no_value_bool
-          { = { \exp_not:o \l_keys_value_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
+      {
+        \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,7 +12949,7 @@
                 \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 }
                   }
               }
           }
@@ -12778,6 +12956,9 @@
       }
       { } { }
   }
+\__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

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex	2019-02-16 22:39:34 UTC (rev 50036)
@@ -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}%

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty	2019-02-16 22:39:34 UTC (rev 50036)
@@ -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}
   [%

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvipdfmx.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvipdfmx.def	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvipdfmx.def	2019-02-16 22:39:34 UTC (rev 50036)
@@ -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

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvips.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvips.def	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvips.def	2019-02-16 22:39:34 UTC (rev 50036)
@@ -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

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvisvgm.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvisvgm.def	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvisvgm.def	2019-02-16 22:39:34 UTC (rev 50036)
@@ -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

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def	2019-02-16 22:39:34 UTC (rev 50036)
@@ -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

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3xdvipdfmx.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3xdvipdfmx.def	2019-02-16 12:29:38 UTC (rev 50035)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3xdvipdfmx.def	2019-02-16 22:39:34 UTC (rev 50036)
@@ -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



More information about the tex-live-commits mailing list