texlive[46720] Master/texmf-dist: l3 (22feb18)

commits+karl at tug.org commits+karl at tug.org
Fri Feb 23 22:54:15 CET 2018


Revision: 46720
          http://tug.org/svn/texlive?view=revision&revision=46720
Author:   karl
Date:     2018-02-23 22:54:14 +0100 (Fri, 23 Feb 2018)
Log Message:
-----------
l3 (22feb18)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/latex/l3experimental/README.md
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-convert.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-format.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/xcoffins/xcoffins.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/xgalley/l3galley.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/xgalley/xgalley.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/README.md
    trunk/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex
    trunk/Master/texmf-dist/doc/latex/l3kernel/source3.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex
    trunk/Master/texmf-dist/doc/latex/l3kernel/source3body.tex
    trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-convert.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3.ins
    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/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/l3format.ins
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3oldmodules.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-convert.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-enc-utf16.def
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-enc-utf32.def
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-enc-utf8.def
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-esc-hex.def
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-esc-name.def
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-esc-string.def
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-esc-url.def
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty
    trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex
    trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex
    trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3basics.sty
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3bootstrap.sty
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3box.sty
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3candidates.sty
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3clist.sty
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3coffins.sty
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3docstrip.tex
    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/l3expan.sty
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3file.sty
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3fp.sty
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3int.sty
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3keys.sty
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3msg.sty
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3names.sty
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3prg.sty
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3prop.sty
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3quark.sty
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3regex.sty
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3seq.sty
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3skip.sty
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3sort.sty
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3str.sty
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3tl-analysis.sty
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3tl-build.sty
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3tl.sty
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3token.sty
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3xdvipdfmx.def

Added Paths:
-----------
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3color/
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3color/l3color.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3draw/
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw-code.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw-code.tex
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw.pdf
    trunk/Master/texmf-dist/source/latex/l3experimental/l3color/
    trunk/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.ins
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.ins
    trunk/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3color/
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3color/l3color.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3draw/
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty

Removed Paths:
-------------
    trunk/Master/texmf-dist/source/latex/l3kernel/l3color.dtx
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3color.sty

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3experimental/README.md	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/doc/latex/l3experimental/README.md	2018-02-23 21:54:14 UTC (rev 46720)
@@ -1,7 +1,7 @@
 Experimental LaTeX3 Concepts
 ============================
 
-Release 2017/12/16
+Release 2018/02/21
 
 Overview
 --------
@@ -21,10 +21,27 @@
 
 Currently included in the CTAN release of l3experimental are the following
 bundles:
+* `l3color`
+* `l3draw`
 * `l3str`
 * `xcoffins`
 * `xgalley`
 
+`l3color`
+---------
+
+This module provides support for setting colors using a range of color models.
+It also allows the construction of 'color expressions', in which multiple colors
+are mixed together at the macro level. There is also support for spot colors:
+the latter is highly experimental.
+
+`l3draw`
+--------
+
+This module provides a code-level interface for constructing drawings. The
+interfaces are heavily inspired by the `pgf` layer of the widely-used
+TikZ system.
+
 `l3str`
 -------
 
@@ -111,6 +128,6 @@
 
 -----
 
-<p>Copyright (C) 1998-2011,2015-2017 The LaTeX3 Project <br />
+<p>Copyright (C) 1998-2011,2015-2018 The LaTeX3 Project <br />
 <a href="http://latex-project.org/">http://latex-project.org/</a> <br />
 All rights reserved.</p>

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

Index: trunk/Master/texmf-dist/doc/latex/l3experimental/l3color/l3color.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3experimental/l3color/l3color.pdf	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/doc/latex/l3experimental/l3color/l3color.pdf	2018-02-23 21:54:14 UTC (rev 46720)

Property changes on: trunk/Master/texmf-dist/doc/latex/l3experimental/l3color/l3color.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw-code.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw-code.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw-code.pdf	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw-code.pdf	2018-02-23 21:54:14 UTC (rev 46720)

Property changes on: trunk/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw-code.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw-code.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw-code.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw-code.tex	2018-02-23 21:54:14 UTC (rev 46720)
@@ -0,0 +1,63 @@
+\iffalse meta-comment
+
+ File: l3draw-code.tex Copyright (C) 2018 The LaTeX3 Project
+
+ It may be distributed and/or modified under the conditions of the
+ LaTeX Project Public License (LPPL), either version 1.3c of this
+ license or (at your option) any later version.  The latest version
+ of this license is in the file
+
+    https://www.latex-project.org/lppl.txt
+
+ This file is part of the "l3experimental bundle" (The Work in LPPL)
+ and all files in that bundle must be distributed together.
+
+ The released version of this bundle is available from CTAN.
+
+ -----------------------------------------------------------------------
+
+ The development version of the bundle can be found at
+
+    https://github.com/latex3/latex3
+
+ for those people who are interested.
+
+\fi
+
+\documentclass{l3doc}
+
+\begin{document}
+
+\makeatletter
+\let\DelayPrintIndex\PrintIndex
+\let\PrintIndex\@empty
+\makeatother
+
+\DisableImplementation
+
+\DocInput{l3draw.dtx}
+
+\ExplSyntaxOn
+\clist_gput_right:Nn \g_docinput_clist
+  {
+    l3draw-paths.dtx      ,
+    l3draw-points.dtx     ,
+    l3draw-scopes.dtx     ,
+    l3draw-softpath.dtx   ,
+    l3draw-state.dtx      ,
+    l3draw-transforms.dtx
+  }
+\ExplSyntaxOff
+
+\part{Implementation}
+
+\def\maketitle{}
+\EnableImplementation
+\DisableDocumentation
+\DocInputAgain
+
+\clearpage
+
+\DelayPrintIndex
+
+\end{document}


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

Index: trunk/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw.pdf	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw.pdf	2018-02-23 21:54:14 UTC (rev 46720)

Property changes on: trunk/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-convert.pdf
===================================================================
(Binary files differ)

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

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

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

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

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/README.md	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/README.md	2018-02-23 21:54:14 UTC (rev 46720)
@@ -1,7 +1,7 @@
 LaTeX3 Programming Conventions
 ==============================
 
-Release 2017/12/16
+Release 2018/02/21
 
 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	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex	2018-02-23 21:54:14 UTC (rev 46720)
@@ -52,7 +52,7 @@
          {latex-team at latex-project.org}%
    }%
 }
-\date{Released 2017/12/16}
+\date{Released 2018/02/21}
 
 \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	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex	2018-02-23 21:54:14 UTC (rev 46720)
@@ -30,7 +30,7 @@
         {latex-team at latex-project.org}%
     }%
 }
-\date{Released 2017/12/16}
+\date{Released 2018/02/21}
 
 \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	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex	2018-02-23 21:54:14 UTC (rev 46720)
@@ -30,7 +30,7 @@
         {latex-team at latex-project.org}%
     }%
 }
-\date{Released 2017/12/16}
+\date{Released 2018/02/21}
 
 \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	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex	2018-02-23 21:54:14 UTC (rev 46720)
@@ -51,7 +51,7 @@
          {latex-team at latex-project.org}%
    }%
 }
-\date{Released 2017/12/16}
+\date{Released 2018/02/21}
 
 \pagenumbering{roman}
 \maketitle

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/source3body.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/source3body.tex	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/source3body.tex	2018-02-23 21:54:14 UTC (rev 46720)
@@ -1,6 +1,6 @@
 % \iffalse meta-comment
 %
-%% File: source3body.tex Copyright (C) 1990-2012,2014-2017 The LaTeX3 Project
+%% File: source3body.tex Copyright (C) 1990-2012,2014-2018 The LaTeX3 Project
 %%
 %% It may be distributed and/or modified under the conditions of the
 %% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -430,6 +430,7 @@
     l3fp-traps.dtx ,
     l3fp-round.dtx ,
     l3fp-parse.dtx ,
+    l3fp-assign.dtx ,
     l3fp-logic.dtx ,
     l3fp-basics.dtx ,
     l3fp-extended.dtx ,
@@ -437,7 +438,6 @@
     l3fp-trig.dtx ,
     l3fp-convert.dtx ,
     l3fp-random.dtx ,
-    l3fp-assign.dtx ,
   }
 \ExplSyntaxOff
 
@@ -447,7 +447,7 @@
 \DocInput{l3regex.dtx}
 \DocInput{l3box.dtx}
 \DocInput{l3coffins.dtx}
-\DocInput{l3color.dtx}
+\DocInput{l3color-base.dtx}
 \DocInput{l3sys.dtx}
 \DocInput{l3deprecation.dtx}
 \DocInput{l3candidates.dtx}

Added: trunk/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.dtx	                        (rev 0)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -0,0 +1,876 @@
+% \iffalse meta-comment
+%
+%% File: l3color.dtx Copyright(C) 2017-2018 The LaTeX3 Project
+%
+% It may be distributed and/or modified under the conditions of the
+% LaTeX Project Public License (LPPL), either version 1.3c of this
+% license or (at your option) any later version.  The latest version
+% of this license is in the file
+%
+%    http://www.latex-project.org/lppl.txt
+%
+% This file is part of the "l3experimental bundle" (The Work in LPPL)
+% and all files in that bundle must be distributed together.
+%
+% -----------------------------------------------------------------------
+%
+% The development version of the bundle can be found at
+%
+%    https://github.com/latex3/latex3
+%
+% for those people who are interested.
+%
+%<*driver|package>
+\RequirePackage{expl3}
+%</driver|package>
+%<*driver>
+\documentclass[full]{l3doc}
+\begin{document}
+  \DocInput{\jobname.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \title{^^A
+%   The \textsf{l3color} package\\ Experimental color support^^A
+% }
+%
+% \author{^^A
+%  The \LaTeX3 Project\thanks
+%    {^^A
+%      E-mail:
+%        \href{mailto:latex-team at latex-project.org}
+%          {latex-team at latex-project.org}^^A
+%    }^^A
+% }
+%
+% \date{Released 2018/02/21}
+%
+% \maketitle
+%
+% \begin{documentation}
+%
+% \section{Color models}
+%
+% A color \emph{model} is a way to represent sets of colors. Different models
+% are particularly suitable for different output methods, \emph{e.g.}~screen
+% or print. Parameter-based models can describe a very large number of unique
+% colors, and have a varying number of \emph{axes} which define a color
+% space. In contrast, various proprietary models are available which define
+% \emph{spot} colors.
+%
+% The models supported here are
+% \begin{itemize}
+%   \item \texttt{gray} Grayscale color, with a single axis running from
+%     $0$ (fully black) to $1$ (fully white)
+%   \item \texttt{rgb} Red-green-blue color, with three axes, one for each of
+%     the components
+%   \item \texttt{cmyk} Cyan-magenta-yellow-black color, with four axes, one for
+%     each of the components
+%   \item \texttt{spot} Spot color, with one value, the name of the color
+%     (see \url{https://helpx.adobe.com/indesign/using/spot-process-colors.html}
+%     for details of the use of spot colors in print)
+% \end{itemize}
+%
+% Additional models may be created to allow mixing of spot colors
+% with each other or with those from other models. See
+% Section~\ref{l3color:sec:spot} for more detail of spot color support.
+%
+% When color is selected by model, the \meta{values} given are specified as
+% a comma-separated list. The length of the list will therefore be determined
+% by the detail of the model involved.
+%
+% Color models (and interconversion) are complex, and more details are given
+% in the manual to the \LaTeXe{} \pkg{xcolor} package and in the
+% \emph{PostScript Language Reference Manual}, published by Addison--Wesley.
+%
+% \section{Color expressions}
+%
+% In addition to allowing specification of color by model and values,
+% \pkg{l3color} also supports color expressions. These are created
+% by combining one or more color names, with the amount of each specified
+% as a percentage. The latter is given between |!| symbols in the expression.
+% Thus for example
+% \begin{verbatim}
+%   red!50!green
+% \end{verbatim}
+% is a mixture of $50\,\%$ red and $50\,\%$ green. A trailing percentage is
+% interpreted as implicitly followed by |white|, and so 
+% \begin{verbatim}
+%   red!25
+% \end{verbatim}
+% specifies $25\,\%$ red mixed with $75\,\%$ white.
+%
+% Where the models for the mixed colors are different, the model of the first
+% color is used. Thus
+% \begin{verbatim}
+%   red!50!cyan
+% \end{verbatim}
+% will result in a color specification using the |rgb| model, made up of
+% $50\,\%$ red and  $50\,\%$ of cyan \emph{expressed in \texttt{rgb}}. As color
+% model interconversion is not exact.
+%
+% The one exception to the above is where the first model in an expression is
+% |gray|. In this case, the order of mixing is \enquote{swapped} internally, so
+% that for example
+% \begin{verbatim}
+%   black!50!red
+% \end{verbatim}
+% has the same result as
+% \begin{verbatim}
+%   red!50!black
+% \end{verbatim}
+% (the predefined colors |black| and |white| use the |gray| model).
+%
+% Where more than two colors are mixed in an expression, evaluation takes place
+% in a stepwise fashion. Thus in
+% \begin{verbatim}
+%   cyan!50!magenta!10!yellow
+% \end{verbatim}
+% the sub-expression
+% \begin{verbatim}
+%   cyan!50!magenta
+% \end{verbatim}
+% is first evaluated to give an intermediate color specification, before
+% the second step
+% \begin{verbatim}
+%   <intermediate>!10!yellow
+% \end{verbatim}
+% where |<intermediate>| represents this transitory calculated value.
+%
+% Within a color expression, |.| may be used to represent the color active
+% for typesetting (the current color). This allows for example
+% \begin{verbatim}
+%   .!50
+% \end{verbatim}
+% to mean a mixture of $50\,\%$ of current color with white.
+%
+% (Color expressions supported here are a subset of those provided by
+% the \LaTeXe{} \pkg{xcolor} package. At present, only such features as are
+% clearly useful have been added here.)
+%
+% \section{Named colors}
+%
+% Color names are stored in a single namespace, which makes them accessible
+% as part of color expressions. Whilst they are not reserved in a technical
+% sense, the names |black|, |white|, |red|, |green|, |blue|, |cyan|, |magenta|
+% and |yellow| have special meaning and should not be redefined. Color names
+% should be made up of letters, numbers and spaces only: other characters are
+% reserved for use in color expressions. In particular, |.| represents the
+% current color at the start of a color expression.
+%
+% \begin{function}{\color_set:nn}
+%   \begin{syntax}
+%     \cs{color_set:nn} \Arg{name} \Arg{color expression}
+%   \end{syntax}
+%   Evaluates the \meta{color expression} and stores the resulting
+%   color specification as the \meta{name}.
+% \end{function}
+%
+% \begin{function}{\color_set:nnn}
+%   \begin{syntax}
+%     \cs{color_set:nnn} \Arg{name} \Arg{model} \Arg{value(s)}
+%   \end{syntax}
+%   Stores the color specification equivalent to the \meta{model} and
+%   \meta{values} as the \meta{name}.
+% \end{function}
+%
+% \begin{function}{\color_set_eq:nn}
+%   \begin{syntax}
+%     \cs{color_set_eq:nn} \Arg{name1} \Arg{name2}
+%   \end{syntax}
+%   Copies the color specification in \meta{name2} to \meta{name1}. The
+%   special name |.| may be used to represent the current color, allowing
+%   it to be saved to a name.
+% \end{function}
+%
+% \begin{function}{\color_show:n}
+%   \begin{syntax}
+%     \cs{color_show:n} \Arg{name}
+%   \end{syntax}
+%   Displays the color specification stored in the \meta{name} on the
+%   terminal
+% \end{function}
+%
+% \section{Selecting colors}
+%
+% \begin{function}{\color_select:n}
+%   \begin{syntax}
+%     \cs{color_select:n} \Arg{color expression}
+%   \end{syntax}
+%   Parses the \meta{color expression} and then activates the resulting
+%   color specification for typeset material.
+% \end{function}
+%
+% \begin{function}{\color_select:nn}
+%   \begin{syntax}
+%     \cs{color_select:nn} \Arg{model} \Arg{value(s)}
+%   \end{syntax}
+%   Activates the color specification equivalent to the \meta{model} and
+%   \meta{value(s)} for typeset material.
+% \end{function}
+%
+% \begin{variable}{\l_color_fixed_model_tl}
+%   When this is set to a non-empty value, colors will be converted to
+%   the specified model when they are selected. Note that included images
+%   and similar are not influenced by this setting.
+% \end{variable}
+%
+% \section{Core color representation}
+%
+% To allow data to be handled internally, \pkg{l3color} uses a simple
+% representation of color, based on that used by the \pkg{dvips} program.
+% This is a token list made up of the model name followed by one or more
+% data entries, each separated by a \emph{space}. The valid forms are thus
+% \begin{itemize}
+%   \item \texttt{gray \meta{gray}} Grayscale color with the \meta{gray}
+%     value running from $0$ (fully black) to $1$ (fully white)
+%   \item \texttt{cmyk \meta{cyan} \meta{magenta} \meta{yellow} \meta{black}},
+%     each of which falls in the range $[0,1]$
+%   \item \texttt{rgb \meta{red} \meta{green} \meta{blue}},
+%     each of which falls in the range $[0,1]$
+%   \item \texttt{spot \meta{name} \meta{tint}} A pre-defined spot color,
+%     where the \meta{name} should be a pre-defined string color name and the
+%     \meta{tint} should be in the range $[0,1]$.
+% \end{itemize}
+%
+% This core representation is produced when parsing color expressions.
+% 
+% \begin{function}{\color_parse:nN}
+%   \begin{syntax}
+%     \cs{color_parse:nN} \Arg{color expression} \Arg{tl}
+%   \end{syntax}
+%   Parses the \meta{color expression} as described above, and sets the
+%   \meta{tl} the the equivalent \meta{core color representation}.
+% \end{function}
+%
+% \section{Spot colors}
+% \label{l3color:sec:spot}
+%
+% \end{documentation}
+%
+% \begin{implementation}
+%
+% \section{\pkg{l3color} Implementation}
+%
+%    \begin{macrocode}
+%<*initex|package>
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+%<@@=color>
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+%<*package>
+\ProvidesExplPackage{l3color}{2018/02/21}{}
+  {L3 Experimental color support}
+%</package>
+%    \end{macrocode}
+%
+% \subsection{Predefined color names}
+%
+% The ability to predefine colors with a name is a key part of this module and
+% means there has to be a method for storing the results. At first sight, it
+% seems natural to follow the usual \pkg{expl3} model and create a
+% \texttt{color} variable type for the process. That would then allow both
+% local and global colors, constant colors and the like. However, these names
+% need to be accessible in some form at the user level, for selection of colors
+% either simply by name or as part of a more complex expression. This does not
+% require that the full name is exposed but does require that they can be
+% looked up in a predictable way. As such, it is more useful to expose just the
+% color names as part of the interface, with the result that only local color
+% names can be created. (This is also seen for example in key creation in
+% \pkg{l3keys}.) As a result, color names are declarative (no \texttt{new}
+% functions).
+%
+% Since there is no need to manipulate colors \emph{en masse}, each is stored
+% in a separate token list variable, rather than the alternative of using a
+% single property list for all names.
+%
+% \subsection{Setup}
+%
+% \begin{variable}{\l_@@_tmp_tl}
+%    \begin{macrocode}
+\tl_new:N \l_@@_tmp_tl
+%    \end{macrocode}
+% \end{variable}
+%
+% \subsection{Utility functions}
+%
+% \begin{macro}[int, TF, EXP]{\@@_if_defined:n}
+%   A simple wrapper to avoid needing to have the lookup repeated in too many
+%   places.
+%    \begin{macrocode}
+\prg_new_conditional:Npnn \@@_if_defined:n #1 { T, F, TF }
+  {
+    \tl_if_exist:cTF { l_@@_named_ #1 _tl }
+      \prg_return_true:
+      \prg_return_false:
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_extract:nNN, \@@_extract:VNN}
+% \begin{macro}{\@@_extract:NNw}
+%   Split the model and color from a named color, and store the two. No test
+%   for the existence of the color: that is assumed to be the case (this
+%   is internal only). Somewhat \enquote{old-fashioned} but should be quite
+%   fast.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_extract:nNN #1#2#3
+  {
+    \exp_after:wN \exp_after:wN \exp_after:wN
+      \@@_extract:NNw
+      \exp_after:wN \exp_after:wN \exp_after:wN #2
+      \exp_after:wN \exp_after:wN \exp_after:wN #3
+        \cs:w l_@@_named_ #1 _tl \cs_end: \q_stop
+  }
+\cs_generate_variant:Nn \@@_extract:nNN { V }
+\cs_new_protected:Npn \@@_extract:NNw #1#2 #3 ~ #4 \q_stop
+  {
+    \tl_set:Nn #1 {#3}
+    \tl_set:Nn #2 {#4}
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Model conversion}
+%
+% \begin{macro}{\@@_convert:nnN, \@@_convert:VVN}
+% \begin{macro}{\@@_convert:nnnN}
+% \begin{macro}[aux, EXP]
+%   {
+%     \@@_convert_gray_rgb:w
+%     \@@_convert_gray_cmyk:w
+%     \@@_convert_cmyk_gray:w
+%     \@@_convert_cmyk_rgb:w
+%     \@@_convert_rgb_gray:w
+%     \@@_convert_rgb_cmyk:w
+%   }
+%  \begin{macro}[aux, EXP]{\@@_convert_rgb_cmyk:nnnn}
+%    Model conversion is carried out using standard formulae, as described in
+%    the manual for \pkg{xcolor} (see also the \emph{PostScript Language
+%    Reference Manual}).
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_convert:nnN #1#2#3
+  { \@@_convert:nnVN {#1} {#2} #3 #3 }
+\cs_generate_variant:Nn \@@_convert:nnN { VV }
+\cs_new_protected:Npn \@@_convert:nnnN #1#2#3#4
+  {
+    \str_if_eq_x:nnT {#1} { spot } % TO DO!!!
+      { }
+    \tl_set:Nx #4
+      { \use:c { @@_convert_ #1 _ #2 :w } #3 ~ 0 ~ 0 ~ 0 \q_stop }
+  }
+\cs_generate_variant:Nn \@@_convert:nnnN { nnV }
+\cs_new:Npn \@@_convert_gray_rgb:w #1 ~ #2 \q_stop
+  { #1 ~ #1 ~ #1 }
+\cs_new:Npn \@@_convert_gray_cmyk:w #1 ~ #2 \q_stop
+  { 0 ~ 0 ~ 0 ~ \fp_eval:n { 1 - #1 } }
+%    \end{macrocode}
+%   These rather odd values are based on \textsc{ntsc} television: the set are
+%   used for the |cmyk| conversion.
+%    \begin{macrocode}
+\cs_new:Npn \@@_convert_rgb_gray:w #1 ~ #2 ~ #3 ~ #4 \q_stop
+  { \fp_eval:n { 0.3 * #1 + 0.59 * #2 + 0.11 * #3 } }
+%    \end{macrocode}
+%   The conversion from |rgb| to |cmyk| is the most complex: a two-step
+%   procedure which requires \emph{black generation} and \emph{undercolor
+%   removal} functions. The PostScript reference describes them as
+%   device-dependent, but following \pkg{xcolor} we assume they are linear.
+%   Moreover, as the likelihood of anyone using a non-unitary matrix here is
+%   tiny, we simplify and treat those two concepts as no-ops.
+%    \begin{macrocode}
+\cs_new:Npn \@@_convert_rgb_cmyk:w #1 ~ #2 ~ #3 ~ #4 \q_stop
+  {
+    \exp_args:Nf \@@_convert_rgb_cmyk:nnnn
+      { \fp_eval:n { min ( 1 - #1 , 1 - #2 , 1 - #3 ) } } {#1} {#2} {#3}
+  }
+\cs_new:Npn \@@_convert_rgb_cmyk:nnnn #1#2#3#4
+  {
+    \fp_eval:n { min ( 1 , max ( 0 , 1 - #2 - #1 ) ) } \c_space_tl
+    \fp_eval:n { min ( 1 , max ( 0 , 1 - #3 - #1 ) ) } \c_space_tl
+    \fp_eval:n { min ( 1 , max ( 0 , 1 - #4 - #1 ) ) } \c_space_tl
+    #1
+  }
+\cs_new:Npn \@@_convert_cmyk_gray:w #1 ~ #2 ~ #3 ~ #4 ~ #5 \q_stop
+  { \fp_eval:n { 1 - min ( 1 , 0.3 * #1 + 0.59 * #2 + 0.11 * #3 + #4 ) } }
+\cs_new:Npn \@@_convert_cmyk_rgb:w #1 ~ #2 ~ #3 ~ #4 ~ #5 \q_stop
+  {
+    \fp_eval:n { 1 - min ( 1 , #1 + #4 ) } \c_space_tl
+    \fp_eval:n { 1 - min ( 1 , #2 + #4 ) } \c_space_tl
+    \fp_eval:n { 1 - min ( 1 , #3 + #4 ) }
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Color expressions}
+%
+% \begin{variable}
+%   {\l_@@_model_tl, \l_@@_value_tl, \l_@@_next_model_tl, \l_@@_next_value_tl}
+%   Working space to store the color data whilst doing calculations: keeping
+%   it on the stack is attractive but gets tricky (return is non-trivial).
+%    \begin{macrocode}
+\tl_new:N \l_@@_model_tl
+\tl_new:N \l_@@_value_tl
+\tl_new:N \l_@@_next_model_tl
+\tl_new:N \l_@@_next_value_tl
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}{\color_parse:nN}
+% \begin{macro}{\@@_parse:nN}
+% \begin{macro}{\@@_parse:Nw}
+% \begin{macro}{\@@_parse_loop_init:Nnn}
+% \begin{macro}{\@@_parse_loop:w}
+% \begin{macro}{\@@_parse_loop:nn}
+% \begin{macro}{\@@_parse_break:w}
+% \begin{macro}{\@@_parse_end:}
+% \begin{macro}[aux, EXP]{\@@_parse_mix:Nnnn, \@@_parse_mix:NVVn}
+% \begin{macro}[aux, EXP]{\@@_parse_mix:nNnn}
+% \begin{macro}[aux, EXP]
+%   {
+%     \@@_parse_mix_gray:nw ,
+%     \@@_parse_mix_rgb:nw  ,
+%     \@@_parse_mix_cmyk:nw
+%   }
+%   The main function for parsing color expressions removes actives but
+%   otherwise expands, then starts working through the expression itself.
+%   At the end, we apply the payload.
+%    \begin{macrocode}
+\cs_new_protected:Npn \color_parse:nN #1#2
+  {
+    \group_begin:
+      \seq_map_inline:Nn \l_char_active_seq
+        {
+          \tl_set:Nx \l_@@_tmp_tl { \cs_to_str:N ##1 }
+          \char_set_active_eq:NN ##1 \l_@@_tmp_tl
+        }
+      \tl_set:Nx \l_@@_tmp_tl {#1}
+    \exp_args:NNV \group_end:
+    \@@_parse:nN \l_@@_tmp_tl #2
+  }
+%    \end{macrocode}
+%   Before going to all of the effort of parsing an expression, these two
+%   precursor functions look for a pre-defined name, either on its own or
+%   with a trailing |!| (which is the same thing).
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_parse:nN #1#2
+  {
+    \tl_if_exist:cTF { l_@@_named_ #1 _tl }
+      { \tl_set_eq:Nc #2 { l_@@_named_ #1 _tl } }
+      { \@@_parse:Nw #2#1 ! \q_stop }
+  }
+\cs_new_protected:Npn \@@_parse:Nw #1#2 ! #3 \q_stop
+  {
+    \@@_if_defined:nTF {#2}
+      {
+        \tl_if_blank:nTF {#3}
+          { \tl_set_eq:Nc #1 { l_@@_named_ #2 _tl } }
+          { \@@_parse_loop_init:Nnn #1 {#2} {#3} }
+      }
+      {
+        \__kernel_msg_error:nnn { color } { unknown-color } {#3}
+        \tl_set_eq:NN \l_@@_current_tl \l_@@_named_black_tl
+      }
+  }
+%    \end{macrocode}
+%   Once we establish that a full parse is needed, the next job is to get the
+%   detail of the first color. That will determine the model we use for the
+%   calculation: splitting here makes checking that a bit easier.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_parse_loop_init:Nnn #1#2#3
+  {
+    \group_begin:
+      \@@_extract:nNN {#2} \l_@@_model_tl \l_@@_value_tl
+      \@@_parse_loop:w #3 ! ! ! ! \q_stop
+      \tl_set:Nx \l_@@_tmp_tl
+        { \l_@@_model_tl \c_space_tl \l_@@_value_tl }
+    \exp_args:NNNV \group_end:
+    \tl_set:Nn #1 \l_@@_tmp_tl
+  }
+%    \end{macrocode}
+%   This is the loop proper: there can be an open-ended set of colors to parse,
+%   separated by |!| tokens. There are a few cases to look out for. At the end
+%   of the expression and with we find a mix of $100$ then we simply skip the
+%   next color entirely (we can't stop the loop as there might be a further
+%   valid color to mix in). On the other hand, if we get a mix of $0$ then
+%   drop everything so far and start again. There is also a trailing
+%   |white| to \enquote{read in} if the final explicit data is a mix.
+%   Those conditions are separate from actually looping, which is therefore
+%   sorted out by checking if we have further data to process: in contrast
+%   to \pkg{xcolor}, we don't allow |!!| so the test can be simplified.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_parse_loop:w #1 ! #2 ! #3 ! #4 ! #5 \q_stop
+  {
+    \bool_lazy_or:nnF
+      { \tl_if_blank_p:n {#1} }
+      { \int_compare_p:nNn {#1} = { 100 } }
+      {
+        \int_compare:nNnTF {#1} = { 0 }
+          {
+            \tl_if_blank:nTF {#2}
+              { \@@_extract:nNN { white } }
+              { \@@_extract:nNN {#2} }
+                \l_@@_model_tl \l_@@_value_tl
+          }
+          {
+            \use:x
+              {
+                \@@_parse_loop:nn {#1}
+                  { \tl_if_blank:nTF {#2} { white } {#2} }
+              }
+          }
+      }
+    \tl_if_blank:nF {#3}
+      { \@@_parse_loop:w #3 ! #4 ! #5 \q_stop }
+    \@@_parse_end:
+  }
+%    \end{macrocode}
+%   The \enquote{payload} of calculation in the loop first. If the model for
+%   the upcoming color is different from that of the existing (partial) color,
+%   convert the model. For |gray| the two are flipped round so that the outcome
+%   is something with \enquote{real} color. We are then in a position to do the
+%   actual calculation itself. The two auxiliaries here give us a way to break
+%   the loop should an invalid name be found.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_parse_loop:nn #1#2
+  {
+    \@@_if_defined:nTF {#2}
+      {
+        \@@_extract:nNN {#2} \l_@@_next_model_tl \l_@@_next_value_tl
+        \tl_if_eq:NNF \l_@@_model_tl \l_@@_next_model_tl
+          {
+            \str_if_eq_x:nnT { \l_@@_model_tl } { gray }
+              {
+                \use:x
+                  {
+                    \tl_set:Nn \exp_not:N \l_@@_model_tl
+                      { \l_@@_next_model_tl }
+                    \tl_set:Nn \exp_not:N \l_@@_value_tl
+                      { \l_@@_next_value_tl }
+                    \tl_set:Nn \exp_not:N \l_next_@@_model_tl
+                      { \l_@@_model_tl }
+                    \tl_set:Nn \exp_not:N \l_next_@@_value_tl
+                      { \l_@@_value_tl }
+                  }
+              }
+            \@@_convert:VVN
+              \l_@@_next_model_tl
+              \l_@@_model_tl
+              \l_@@_next_value_tl
+          }
+        \tl_set:Nx \l_@@_value_tl
+          {
+            \@@_parse_mix:NVVn
+              \l_@@_model_tl \l_@@_value_tl \l_@@_next_value_tl {#1}
+          }
+      }
+      {
+        \__kernel_msg_error:nnn { color } { unknown-color } {#2}
+        \@@_extract:nNN { black } \l_@@_model_tl \l_@@_value_tl
+        \@@_parse_break:w
+      }
+  }
+\cs_new_protected:Npn \@@_parse_break:w #1 \@@_parse_end: { }
+\cs_new_protected:Npn \@@_parse_end: { }
+%    \end{macrocode}
+%   Do the vector arithmetic: mainly a question of shuffling input, along
+%   with one pre-calculation to keep down the use of division.
+%    \begin{macrocode}
+\cs_new:Npn \@@_parse_mix:Nnnn #1#2#3#4
+  {
+    \exp_args:Nf \@@_parse_mix:nNnn
+      { \fp_eval:n { #4 / 100 } }
+      #1 {#2} {#3}
+  }
+\cs_generate_variant:Nn \@@_parse_mix:Nnnn { NVV }
+\cs_new:Npn \@@_parse_mix:nNnn #1#2#3#4
+  {
+    \use:c { @@_parse_mix_ #2 :nw } {#1}
+      #3 \q_mark #4 \q_stop
+  }
+\cs_new:Npn \@@_parse_mix_gray:nw #1#2 \q_mark #3 \q_stop
+  { \fp_eval:n { #2 * #1 + #3 * ( 1 - #1 ) } }
+\cs_new:Npn \@@_parse_mix_rgb:nw
+  #1#2 ~ #3 ~ #4 \q_mark #5 ~ #6 ~ #7 \q_stop
+  {
+    \fp_eval:n { #2 * #1 + #5 * ( 1 - #1 ) } \c_space_tl
+    \fp_eval:n { #3 * #1 + #6 * ( 1 - #1 ) } \c_space_tl
+    \fp_eval:n { #4 * #1 + #7 * ( 1 - #1 ) }
+  }
+\cs_new:Npn \@@_parse_mix_cmyk:nw
+  #1#2 ~ #3 ~ #4 ~ #5 \q_mark #6 ~ #7 ~ #8 ~ #9 \q_stop
+  {
+    \fp_eval:n { #2 * #1 + #6 * ( 1 - #1 ) } \c_space_tl
+    \fp_eval:n { #3 * #1 + #7 * ( 1 - #1 ) } \c_space_tl
+    \fp_eval:n { #4 * #1 + #8 * ( 1 - #1 ) } \c_space_tl
+    \fp_eval:n { #5 * #1 + #9 * ( 1 - #1 ) }
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[EXP]
+%   {\@@_parse_gray:w, \@@_parse_rgb:w, \@@_parse_cmyk:w, \@@_parse_spot:w}
+% \begin{macro}[EXP]{\@@_parse_spot_aux:w}
+%   Turn the input into internal form.
+%    \begin{macrocode}
+\cs_new:Npn \@@_parse_gray:w #1 , #2 \q_stop {#1}
+\cs_new:Npn \@@_parse_rgb:w #1 , #2 , #3 , #4 \q_stop { #1 ~ #2 ~ #3 }
+\cs_new:Npn \@@_parse_cmyk:w #1 , #2 , #3 , #4 , #5 \q_stop
+  { #1 ~ #2 ~ #3 ~ #4 }
+\cs_new:Npn \@@_parse_spot:w #1 , #2 \q_stop
+  { \@@_parse_spot_aux:w #1 ! 100 ! \q_stop }
+\cs_new:Npn \@@_parse_spot_aux:w #1 ! #2 ! #3 \q_stop
+  { #1 ~ \fp_eval:n { #2 / 100 } }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Selecting colors (and color models)}
+%
+% \begin{variable}{\l_color_fixed_model_tl}
+%   For selecting a single fixed model.
+%    \begin{macrocode}
+\tl_new:N \l_color_fixed_model_tl
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}{\@@_select:}
+% \begin{macro}{\@@_finalise:N}
+% \begin{macro}{\@@_finalise:w}
+%   A driver-neutral location for \enquote{last minute} manipulations before
+%   handing off to the driver code.  We set the special |.| syntax here: this
+%   will therefore always be available. The finalisation is separate from the
+%   main function so it can also be applied to \emph{e.g.}~page color.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_select:
+  {
+    \@@_finalise:N \l_@@_current_tl
+    \tl_set_eq:cN { l_@@_named_ . _tl } \l_@@_current_tl
+    \@@_select:V \l_@@_current_tl
+  }
+\cs_new_protected:Npn \@@_finalise:N #1
+  {
+    \tl_if_empty:NF \l_color_fixed_model_tl
+      {
+        \exp_after:wN \@@_finalise:w #1 \q_stop
+        \tl_if_eq:NNF \l_@@_model_tl \l_color_fixed_model_tl
+          {
+            \@@_convert:VVN \l_@@_model_tl \l_color_fixed_model_tl
+              \l_@@_value_tl
+          }
+        \tl_set:Nx #1
+          { \l_color_fixed_model_tl \c_space_tl \l_@@_value_tl }
+      }
+  }
+\cs_new_protected:Npn \@@_finalise:w #1 ~ #2 \q_stop
+  {
+    \tl_set:Nn \l_@@_model_tl {#1}
+    \tl_set:Nn \l_@@_value_tl {#2}
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\color_select:n}
+% \begin{macro}{\color_select:nn}
+%   Parse the input expressions then get the driver to actually activate
+%   them.
+%    \begin{macrocode}
+\cs_new_protected:Npn \color_select:n #1
+  {
+    \color_parse:nN {#1} \l_@@_current_tl
+    \@@_select:
+  }
+\cs_new_protected:Npn \color_select:nn #1#2
+  {
+    \@@_direct:nnN {#1} {#2} \l_@@_current_tl
+    \@@_select:
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Direct model use}
+%
+% \begin{macro}{\@@_direct:nnN}
+%   Directly set a color based on a model/value combination.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_direct:nnN #1#2#3
+  {
+    \cs_if_exist:cTF { @@_parse_ #1 :w }
+      {
+        \tl_set:Nx #3
+          { #1 ~ \use:c {  @@_parse_ #1 :w } #2 , 0 , 0 , 0 , 0 \q_stop }
+      }
+      {
+        \__kernel_msg_error:nnn { color } { invalid-model } {#1}
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsection{Defining named colors}
+%
+% \begin{variable}{\l_@@_named_tl}
+%   Space to store the detail of the named color.
+%    \begin{macrocode}
+\tl_new:N \l_@@_named_tl
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}{\@@_store:Nn}
+%   Store the named color unless it has an invalid name.
+%     \begin{macrocode}
+\cs_new_protected:Npn \@@_store:Nn #1#2
+  {
+    \str_if_eq:nnF {#2} { . }
+      {
+        \tl_clear_new:c { l_@@_named_ #2 _tl }
+        \tl_set_eq:cN { l_@@_named_ #2 _tl } #1
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\color_set:nn}
+% \begin{macro}{\color_set:nnn}
+% \begin{macro}{\color_set_eq:nn}
+%   Defining named colors has to include a step to force creation of the
+%   underlying token list to avoid errors when checking is enabled.
+%    \begin{macrocode}
+\cs_new_protected:Npn \color_set:nn #1#2
+  {
+    \color_parse:nN {#2} \l_@@_named_tl
+    \@@_store:Nn \l_@@_named_tl {#1}
+  }
+\cs_new_protected:Npn \color_set:nnn #1#2#3
+  {
+    \@@_direct:nnN {#2} {#3} \l_@@_named_tl
+    \@@_store:Nn \l_@@_named_tl {#1}
+  }
+\cs_new_protected:Npn \color_set_eq:nn #1#2
+  {
+    \@@_if_defined:nTF {#2}
+      {
+        \tl_clear_new:c { l_@@_named_ #1 _tl }
+        \str_if_eq:nnTF {#2} { . }
+          { \tl_set_eq:cN { l_@@_named_ #1 _tl } \l_@@_current_tl }
+          { \tl_set_eq:cc { l_@@_named_ #1 _tl } { l_@@_named_ #2 _tl } }
+      }
+      {
+        \__kernel_msg_error:nnn { color } { unknown-color } {#2}
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% A small set of colors are always defined.
+% \begin{macrocode}
+\color_set:nnn { black } { gray } { 0 }
+\color_set:nnn { white } { gray } { 1 }
+\color_set:nnn { cyan }    { cmyk } { 1 , 0 , 0 , 0 }
+\color_set:nnn { magenta } { cmyk } { 0 , 1 , 0 , 0 }
+\color_set:nnn { yellow }  { cmyk } { 0 , 0 , 1 , 0 }
+\color_set:nnn { red }   { rgb } { 1 , 0 , 0 }
+\color_set:nnn { green } { rgb } { 0 , 1 , 0 }
+\color_set:nnn { blue }  { rgb } { 0 , 0 , 1 }
+% \end{macrocode}
+%
+% \begin{variable}{\l_@@_named_._tl}
+%   A special named color: this is always defined though not fixed in
+%   definition.
+%    \begin{macrocode}
+\tl_new:c { l_@@_named_._tl }
+%    \end{macrocode}
+% \end{variable}
+%
+% \subsection{Diagnostics}
+%
+% \begin{macro}{\color_show:n}
+% \begin{macro}{\@@_show:w}
+% \begin{macro}{\@@_show_gray:w, \@@_show_rgb:w, \@@_show_cmyk:w}
+%   Extract the information about a color and format for the user: the approach
+%   is similar to the keys module here.
+%    \begin{macrocode}
+\cs_new_protected:Npn \color_show:n #1
+  {
+    \msg_show:nnxxxx { LaTeX / color } { show }
+      {#1}
+      {
+        \@@_if_defined:nTF {#1}
+          { \exp_last_unbraced:Nv \@@_show:w { l_@@_named_ #1 _tl } \q_stop }
+          { }
+      }
+      { }
+      { }
+  }
+\cs_new:Npn \@@_show:w #1 ~ #2 \q_stop
+  {
+    \msg_show_item_unbraced:nn { model } {#1}
+    \exp_args:Nnf \msg_show_item_unbraced:nn { value }
+      { \use:c { @@_show_ #1 :w } #2 \q_stop }
+  }
+\cs_new:Npn \@@_show_gray:w #1 \q_stop { #1 }
+\cs_new:Npn \@@_show_rgb:w #1 ~ #2 ~ #3 \q_stop { #1 ,~ #2 ,~ #3 }
+\cs_new:Npn \@@_show_cmyk:w #1 ~ #2 ~ #3 ~ #4 \q_stop { #1 ,~ #2 ,~ #3 ,~ #4 }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Messages}
+%
+% \begin{macrocode}
+\__kernel_msg_new:nnnn { color } { invalid-model }
+  { Invalid~color~model~'#1'. }
+  {
+    LaTeX~has~been~asked~to~use~a~color~model~called~'#1',~
+    but~this~model~is~not~set~up.
+  }
+\__kernel_msg_new:nnnn { color } { unknown-color }
+  { Unknown~color~'#1'. }
+  {
+    LaTeX~has~been~asked~to~use~a~color~named~'#1',~
+    but~this~has~never~been~defined.
+  }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\__kernel_msg_new:nnn { color } { show }
+  {
+    The~color~#1~
+    \tl_if_empty:nTF {#2}
+      { is~undefined. }
+      { has~the~properties: #2 }
+  }
+% \end{macrocode}
+%
+%    \begin{macrocode}
+%</initex|package>
+%    \end{macrocode}
+%
+% \end{implementation}
+%
+% \PrintIndex


Property changes on: trunk/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.dtx
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.ins
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.ins	                        (rev 0)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.ins	2018-02-23 21:54:14 UTC (rev 46720)
@@ -0,0 +1,56 @@
+\iffalse meta-comment
+
+File l3color.ins Copyright (C) 2017-2018 The LaTeX3 Project
+
+It may be distributed and/or modified under the conditions of the
+LaTeX Project Public License (LPPL), either version 1.3c of this
+license or (at your option) any later version.  The latest version
+of this license is in the file
+
+   http://www.latex-project.org/lppl.txt
+
+This file is part of the "l3experimental bundle" (The Work in LPPL)
+and all files in that bundle must be distributed together.
+
+-----------------------------------------------------------------------
+
+The development version of the bundle can be found at
+
+   https://github.com/latex3/latex3
+
+for those people who are interested.
+
+-----------------------------------------------------------------------
+
+Any modification of this file should ensure that the copyright and
+license information is placed in the derived files.
+
+\fi
+
+\input l3docstrip.tex
+\askforoverwritefalse
+
+\preamble
+
+Copyright (C) 2017-2018 The LaTeX3 Project
+
+It may be distributed and/or modified under the conditions of
+the LaTeX Project Public License (LPPL), either version 1.3c of
+this license or (at your option) any later version.  The latest
+version of this license is in the file:
+
+   http://www.latex-project.org/lppl.txt
+
+This file is part of the "l3experimental bundle" (The Work in LPPL)
+and all files in that bundle must be distributed together.
+
+\endpreamble
+% stop docstrip adding \endinput
+\postamble
+\endpostamble
+
+\keepsilent
+
+\generate{\file{l3color.sty}{\from{l3color.dtx}{package}}}
+
+\endbatchfile

Added: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx	                        (rev 0)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -0,0 +1,901 @@
+% \iffalse meta-comment
+%
+%% File: l3draw-paths.dtx Copyright(C) 2018 The LaTeX3 Project
+%
+% It may be distributed and/or modified under the conditions of the
+% LaTeX Project Public License (LPPL), either version 1.3c of this
+% license or (at your option) any later version.  The latest version
+% of this license is in the file
+%
+%    http://www.latex-project.org/lppl.txt
+%
+% This file is part of the "l3experimental bundle" (The Work in LPPL)
+% and all files in that bundle must be distributed together.
+%
+% -----------------------------------------------------------------------
+%
+% The development version of the bundle can be found at
+%
+%    https://github.com/latex3/latex3
+%
+% for those people who are interested.
+%
+%<*driver>
+\RequirePackage{expl3}
+\documentclass[full]{l3doc}
+\begin{document}
+  \DocInput{\jobname.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \title{^^A
+%   The \pkg{l3draw-paths} package\\ Drawing paths^^A
+% }
+%
+% \author{^^A
+%  The \LaTeX3 Project\thanks
+%    {^^A
+%      E-mail:
+%        \href{mailto:latex-team at latex-project.org}
+%          {latex-team at latex-project.org}^^A
+%    }^^A
+% }
+%
+% \date{Released 2018/02/21}
+%
+% \maketitle
+%
+% \begin{implementation}
+%
+% \section{\pkg{l3draw-paths} implementation}
+%
+%    \begin{macrocode}
+%<*initex|package>
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+%<@@=draw>
+%    \end{macrocode}
+%
+% This sub-module covers more-or-less the same ideas as
+% \texttt{pgfcorepathconstruct.code.tex}, though using the expandable FPU
+% means that the implementation often varies. At present, equivalents of the
+% following are currently absent:
+% \begin{itemize}
+%   \item \cs{pgfpatharcto}, \cs{pgfpatharctoprecomputed}: These are
+%     extremely specialised and are very complex in implementation. If the
+%     functionality is required, it is likely that it will be set up from
+%     scratch here.
+%   \item \cs{pgfpathparabola}: Seems to be unused other than defining
+%     a Ti\emph{k}Z interface, which itself is then not used further.
+%   \item \cs{pgfpathsine}, \cs{pgfpathcosine}: Need to see exactly how
+%     these need to work, in particular whether a wider input range is
+%     needed and what approximation to make.
+%    \item \cs{pgfpathcurvebetweentime}, \cs{pgfpathcurvebetweentimecontinue}:
+%      These don't seem to be used at all.
+% \end{itemize}
+%
+% \begin{variable}
+%   {\l_@@_path_tmp_tl, \l_@@_path_tmpa_fp, \l_@@_path_tmpb_fp}
+%   Scratch space.
+%    \begin{macrocode}
+\tl_new:N \l_@@_path_tmp_tl
+\fp_new:N \l_@@_path_tmpa_fp
+\fp_new:N \l_@@_path_tmpb_fp
+%    \end{macrocode}
+% \end{variable}
+%
+% \subsection{Tracking paths}
+%
+% \begin{variable}{\g_@@_path_lastx_dim, \g_@@_path_lasty_dim}
+%   The last point visited on a path.
+%    \begin{macrocode}
+\dim_new:N \g_@@_path_lastx_dim
+\dim_new:N \g_@@_path_lasty_dim
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}
+%   {
+%     \g_@@_path_xmax_dim,
+%     \g_@@_path_xmin_dim,
+%     \g_@@_path_ymax_dim,
+%     \g_@@_path_ymin_dim
+%   }
+%   The limiting size of a path.
+%    \begin{macrocode}
+\dim_new:N \g_@@_path_xmax_dim
+\dim_new:N \g_@@_path_xmin_dim
+\dim_new:N \g_@@_path_ymax_dim
+\dim_new:N \g_@@_path_ymin_dim
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}{\@@_path_update_limits:nn}
+% \begin{macro}{\@@_path_reset_limits:}
+%   Track the limits of a path and (perhaps) of the picture as a whole.
+%   (At present the latter is always true: that will change as more complex
+%   functionality is added.)
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_path_update_limits:nn #1#2
+  {
+    \dim_gset:Nn \g_@@_path_xmax_dim
+      { \dim_max:nn \g_@@_path_xmax_dim {#1} }
+    \dim_gset:Nn \g_@@_path_xmin_dim
+      { \dim_min:nn \g_@@_path_xmin_dim {#1} }
+    \dim_gset:Nn \g_@@_path_ymax_dim
+      { \dim_max:nn \g_@@_path_ymax_dim {#2} }
+    \dim_gset:Nn \g_@@_path_ymin_dim
+      { \dim_min:nn \g_@@_path_ymin_dim {#2} }
+    \bool_if:NT \l_@@_update_bb_bool
+      {
+        \dim_gset:Nn \g_@@_xmax_dim
+          { \dim_max:nn \g_@@_xmax_dim {#1} }
+        \dim_gset:Nn \g_@@_xmin_dim
+          { \dim_min:nn \g_@@_xmin_dim {#1} }
+        \dim_gset:Nn \g_@@_ymax_dim
+          { \dim_max:nn \g_@@_ymax_dim {#2} }
+        \dim_gset:Nn \g_@@_ymin_dim
+          { \dim_min:nn \g_@@_ymin_dim {#2} }
+      }
+  }
+\cs_new_protected:Npn \@@_path_reset_limits:
+  {
+    \dim_gset:Nn \g_@@_path_xmax_dim { -\c_max_dim }
+    \dim_gset:Nn \g_@@_path_xmin_dim {  \c_max_dim }
+    \dim_gset:Nn \g_@@_path_ymax_dim { -\c_max_dim }
+    \dim_gset:Nn \g_@@_path_ymin_dim {  \c_max_dim }
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@@_path_update_last:nn}
+%   A simple auxiliary to avoid repetition.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_path_update_last:nn #1#2
+  {
+    \dim_gset:Nn \g_@@_path_lastx_dim {#1}
+    \dim_gset:Nn \g_@@_path_lasty_dim {#2}
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsection{Corner arcs}
+%
+% At the level of path \emph{construction}, rounded corners are handled
+% by inserting a marker into the path: that is then picked up once the
+% full path is constructed. Thus we need to set up the appropriate
+% data structures here, such that this can be applied every time it is
+% relevant.
+%
+% \begin{variable}{\l_@@_corner_xarc_dim, \l_@@_corner_yarc_dim}
+%   The two arcs in use.
+%    \begin{macrocode}
+\dim_new:N \l_@@_corner_xarc_dim
+\dim_new:N \l_@@_corner_yarc_dim
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\l_@@_corner_arc_bool}
+%   A flag to speed up the repeated checks.
+%    \begin{macrocode}
+\bool_new:N \l_@@_corner_arc_bool
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}{\draw_path_corner_arc:n}
+% \begin{macro}{\@@_path_corner_arc:nn}
+%   Calculate the arcs, check they are non-zero.
+%    \begin{macrocode}
+\cs_new_protected:Npn \draw_path_corner_arc:n #1
+  {
+    \@@_point_process:nn { \@@_path_corner_arc:nn } {#1}
+  }
+\cs_new_protected:Npn \@@_path_corner_arc:nn #1#2
+  {
+    \dim_set:Nn \l_@@_corner_xarc_dim {#1}
+    \dim_set:Nn \l_@@_corner_yarc_dim {#2}
+    \bool_lazy_and:nnTF
+      { \dim_compare_p:nNn \l_@@_corner_xarc_dim = { 0pt } }
+      { \dim_compare_p:nNn \l_@@_corner_yarc_dim = { 0pt } }
+      { \bool_set_false:N \l_@@_corner_arc_bool }
+      { \bool_set_true:N \l_@@_corner_arc_bool }
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@@_path_mark_corner:}
+%   Mark up corners for arc post-processing.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_path_mark_corner:
+  {
+    \bool_if:NT \l_@@_corner_arc_bool
+      {
+        \@@_softpath_roundpoint:VV
+          \l_@@_corner_xarc_dim
+          \l_@@_corner_yarc_dim
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsection{Basic path constructions}
+%
+% \begin{macro}{\draw_path_moveto:n, \draw_path_lineto:n}
+% \begin{macro}{\@@_path_moveto:nn, \@@_path_lineto:nn}
+% \begin{macro}{\draw_path_curveto:nnn}
+% \begin{macro}{\@@_path_curveto:nnnnnn}
+%   At present, stick to purely linear transformation support and skip the
+%   soft path business: that will likely need to be revisited later.
+%    \begin{macrocode}
+\cs_new_protected:Npn \draw_path_moveto:n #1
+  {
+    \@@_point_process:nn
+      { \@@_path_moveto:nn }
+      { \draw_point_transform:n {#1} }
+  }
+\cs_new_protected:Npn \@@_path_moveto:nn #1#2
+  {
+     \@@_path_update_limits:nn {#1} {#2}
+     \@@_softpath_moveto:nn {#1} {#2}
+     \@@_path_update_last:nn {#1} {#2}
+  }
+\cs_new_protected:Npn \draw_path_lineto:n #1
+  {
+    \@@_point_process:nn
+      { \@@_path_lineto:nn }
+      { \draw_point_transform:n {#1} }
+  }
+\cs_new_protected:Npn \@@_path_lineto:nn #1#2
+  {
+     \@@_path_mark_corner:
+     \@@_path_update_limits:nn {#1} {#2}
+     \@@_softpath_lineto:nn {#1} {#2}
+     \@@_path_update_last:nn {#1} {#2}
+  }
+\cs_new_protected:Npn \draw_path_curveto:nnn #1#2#3
+  {
+    \@@_point_process:nnn
+      {
+        \@@_point_process:nn
+          {
+            \@@_path_mark_corner:
+            \@@_path_curveto:nnnnnn
+          }
+          { \draw_point_transform:n {#1} }
+      }
+      { \draw_point_transform:n {#2} }
+      { \draw_point_transform:n {#3} }
+  }
+\cs_new_protected:Npn \@@_path_curveto:nnnnnn #1#2#3#4#5#6
+  {
+     \@@_path_update_limits:nn {#1} {#2}
+     \@@_path_update_limits:nn {#3} {#4}
+     \@@_path_update_limits:nn {#5} {#6}
+     \@@_softpath_curveto:nnnnnn {#1} {#2} {#3} {#4} {#5} {#6}
+     \@@_path_update_last:nn {#5} {#6}
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\draw_path_close:}
+%   A simple wrapper.
+%    \begin{macrocode}
+\cs_new_protected:Npn \draw_path_close:
+  {
+    \@@_path_mark_corner:
+    \@@_softpath_closepath:
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsection{Computed curves}
+%
+% More complex operations need some calculations. To assist with those, various
+% constants are pre-defined.
+%
+% \begin{macro}{\draw_path_curveto:nn}
+% \begin{macro}{\@@_path_curveto:nnnn}
+% \begin{variable}{\c_@@_path_curveto_a_fp, \c_@@_path_curveto_b_fp}
+%   A quadratic curve with one control point $(x_{\mathrm{c}},
+%   y_{\mathrm{c}})$. The two required control points are then
+%   \[
+%     x_{1} = \frac{1}{3}x_{\mathrm{s}} + \frac{2}{3}x_{\mathrm{c}}
+%     \quad
+%     y_{1} = \frac{1}{3}y_{\mathrm{s}} + \frac{2}{3}y_{\mathrm{c}}
+%   \]
+%   and
+%   \[
+%     x_{2} = \frac{1}{3}x_{\mathrm{e}} + \frac{2}{3}x_{\mathrm{c}}
+%     \quad
+%     x_{2} = \frac{1}{3}y_{\mathrm{e}} + \frac{2}{3}y_{\mathrm{c}}
+%   \]
+%   using the start (last) point $(x_{\mathrm{s}}, y_{\mathrm{s}})$
+%   and the end point $(x_{\mathrm{s}}, y_{\mathrm{s}})$.
+%    \begin{macrocode}
+\cs_new_protected:Npn \draw_path_curveto:nn #1#2
+  {
+    \@@_point_process:nnn
+      { \@@_path_curveto:nnnn }
+      { \draw_point_transform:n {#1} }
+      { \draw_point_transform:n {#2} }
+  }
+\cs_new_protected:Npn \@@_path_curveto:nnnn #1#2#3#4
+  {
+    \fp_set:Nn \l_@@_path_tmpa_fp { \c_@@_path_curveto_b_fp * #1 }
+    \fp_set:Nn \l_@@_path_tmpb_fp { \c_@@_path_curveto_b_fp * #2 }
+    \use:x
+      {
+         \@@_path_mark_corner:
+         \@@_path_curveto:nnnnnn
+           {
+             \fp_to_dim:n
+               {
+                   \c_@@_path_curveto_a_fp * \g_@@_path_lastx_dim
+                 + \l_@@_path_tmpa_fp
+               }
+           }
+           {
+             \fp_to_dim:n
+               {
+                   \c_@@_path_curveto_a_fp * \g_@@_path_lasty_dim
+                 + \l_@@_path_tmpb_fp
+               }
+           }
+           {
+             \fp_to_dim:n
+               { \c_@@_path_curveto_a_fp * #3 + \l_@@_path_tmpa_fp }
+           }
+           {
+             \fp_to_dim:n
+               { \c_@@_path_curveto_a_fp * #4 + \l_@@_path_tmpb_fp }
+           }
+           {#3}
+           {#4}
+      }
+  }
+\fp_const:Nn \c_@@_path_curveto_a_fp { 1 / 3 }
+\fp_const:Nn \c_@@_path_curveto_b_fp { 2 / 3 }
+%    \end{macrocode}
+% \end{variable}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\draw_path_arc:nnn}
+% \begin{macro}{\draw_path_arc:nnnn}
+% \begin{macro}{\@@_path_arc:nnnn}
+% \begin{macro}{\@@_path_arc:nnNnn}
+% \begin{macro}
+%   {
+%     \@@_path_arc_auxi:nnnnNnn,
+%     \@@_path_arc_auxi:fnnnNnn,
+%     \@@_path_arc_auxi:fnfnNnn
+%   }
+% \begin{macro}{\@@_path_arc_auxii:nnnNnnnn}
+% \begin{macro}{\@@_path_arc_auxiii:nn}
+% \begin{macro}{\@@_path_arc_auxiv:nnnn}
+% \begin{macro}{\@@_path_arc_auxv:nn, \@@_path_arc_auxvi:nn}
+% \begin{macro}{\@@_path_arc_add:nnnn}
+% \begin{variable}{\l_@@_path_arc_delta_fp, \l_@@_path_arc_start_fp}
+% \begin{variable}{\c_@@_path_arc_90_fp,\c_@@_path_arc_60_fp}
+%   Drawing an arc means dividing the total curve required into sections:
+%   using Bézier curves we can cover at most $90^{\circ}$ at once. To allow
+%   for later manipulations, we aim to have roughly equal last segments to
+%   the line, with the split set at a final part of $115^{\circ}$.
+%    \begin{macrocode}
+\cs_new_protected:Npn \draw_path_arc:nnn #1#2#3
+  { \draw_path_arc:nnnn {#1} {#2} {#3} {#3} }
+\cs_new_protected:Npn \draw_path_arc:nnnn #1#2#3#4
+  {
+    \use:x
+      {
+        \@@_path_arc:nnnn
+          { \fp_eval:n {#1} }
+          { \fp_eval:n {#2} }
+          { \fp_to_dim:n {#3} }
+          { \fp_to_dim:n {#4} }
+       }
+  }
+\cs_new_protected:Npn \@@_path_arc:nnnn #1#2#3#4
+  {
+    \fp_compare:nNnTF {#1} > {#2}
+      { \@@_path_arc:nnNnn {#1} {#2} - {#3} {#4} }
+      { \@@_path_arc:nnNnn {#1} {#2} + {#3} {#4} }
+  }
+\cs_new_protected:Npn \@@_path_arc:nnNnn #1#2#3#4#5
+  {
+    \fp_set:Nn \l_@@_path_arc_start_fp {#1}
+    \fp_set:Nn \l_@@_path_arc_delta_fp { abs( #1 - #2 ) }
+    \fp_while_do:nNnn { \l_@@_path_arc_delta_fp } > { 90 }
+      {
+        \fp_compare:nNnTF \l_@@_path_arc_delta_fp > { 115 }
+          {
+            \@@_path_arc_auxi:ffnnNnn
+              { \fp_to_decimal:N \l_@@_path_arc_start_fp }
+              { \fp_eval:n { \l_@@_path_arc_start_fp #3 90 } }
+              { 90 } {#2}
+              #3 {#4} {#5}
+          }
+          {
+            \@@_path_arc_auxi:ffnnNnn
+              { \fp_to_decimal:N \l_@@_path_arc_start_fp }
+              { \fp_eval:n { \l_@@_path_arc_start_fp #3 60 } }
+              { 60 } {#2}
+              #3 {#4} {#5}
+          }
+      }
+    \@@_path_mark_corner:
+    \@@_path_arc_auxi:fnfnNnn
+      { \fp_to_decimal:N \l_@@_path_arc_start_fp }
+      {#2}
+      { \fp_eval:n { abs( \l_@@_path_arc_start_fp - #2 ) } }
+      {#2}
+      #3 {#4} {#5}
+  }
+%    \end{macrocode}
+%  The auxiliary is responsible for calculating the required points.
+%  The \enquote{magic} number required to determine the length of the
+%  control vectors is well-established for a right-angle:
+%  $\frac{4}{3}(\sqrt{2} - 1) = 0.552\,284\,75$. For other cases, we follow
+%  the calculation used by \pkg{pgf} but with the second common case of
+%  $60^{\circ}$ pre-calculated for speed.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_path_arc_auxi:nnnnNnn #1#2#3#4#5#6#7
+  {
+    \use:x
+      {
+        \@@_path_arc_auxii:nnnNnnnn
+          {#1} {#2} {#4} #5 {#6} {#7}
+          {
+            \fp_to_dim:n
+              {
+                \cs_if_exist_use:cF
+                  { c_@@_path_arc_ #3 _fp }
+                  { 4/3 * tand( 0.25 * #3 ) }
+                  * #6
+              }
+          }
+          {
+            \fp_to_dim:n
+              {
+                \cs_if_exist_use:cF
+                  { c_@@_path_arc_ #3 _fp }
+                  { 4/3 * tand( 0.25 * #3 ) }
+                  * #7
+              }
+          }
+      }
+  }
+\cs_generate_variant:Nn \@@_path_arc_auxi:nnnnNnn { fnf , ff }
+%    \end{macrocode}
+%   We can now calculate the required points. As everything here is
+%   non-expandable, that is best done by using \texttt{x}-type expansion
+%   to build up the tokens. The three points are calculated out-of-order,
+%   since finding the second control point needs the position of the end
+%   point. Once the points are found, fire-off the fundamental path
+%   operation and update the record of where we are up to. The final
+%   point has to be
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_path_arc_auxii:nnnNnnnn #1#2#3#4#5#6#7#8
+  {
+    \tl_clear:N \l_@@_path_tmp_tl
+    \@@_point_process:nn
+      { \@@_path_arc_auxiii:nn }
+      {
+        \@@_point_transform_noshift:n
+          { \draw_point_polar:nnn { #1 #4 90 } {#7} {#8} }
+      }
+    \@@_point_process:nn
+      {
+        \@@_point_process:nn
+          { \@@_path_arc_auxiv:nnnn }
+          {
+            \draw_point_transform:n
+              { \draw_point_polar:nnn {#1} {#5} {#6} }
+          }
+      }
+      {
+        \draw_point_transform:n
+          { \draw_point_polar:nnn {#2} {#5} {#6} }
+      }
+    \@@_point_process:nn
+      { \@@_path_arc_auxv:nn }
+      {
+        \@@_point_transform_noshift:n
+          { \draw_point_polar:nnn { #2 #4 -90 } {#7} {#8} }
+      }
+    \exp_after:wN \@@_path_curveto:nnnnnn \l_@@_path_tmp_tl
+    \fp_set:Nn \l_@@_path_arc_delta_fp { abs ( #2 - #3 ) }
+    \fp_set:Nn \l_@@_path_arc_start_fp {#2}
+  }
+%    \end{macrocode}
+%   The first control point.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_path_arc_auxiii:nn #1#2
+  {
+    \@@_path_arc_aux_add:nn
+      { \g_@@_path_lastx_dim + #1 }
+      { \g_@@_path_lasty_dim + #2 }
+  }
+%    \end{macrocode}
+%   The end point: simple arithmetic.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_path_arc_auxiv:nnnn #1#2#3#4
+  {
+    \@@_path_arc_aux_add:nn
+      { \g_@@_path_lastx_dim - #1 + #3 }
+      { \g_@@_path_lasty_dim - #2 + #4 }
+  }
+%    \end{macrocode}
+%   The second control point: extract the last point, do some
+%   rearrangement and record.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_path_arc_auxv:nn #1#2
+  {
+    \exp_after:wN \@@_path_arc_auxvi:nn
+      \l_@@_path_tmp_tl {#1} {#2}
+  }
+\cs_new_protected:Npn \@@_path_arc_auxvi:nn #1#2#3#4#5#6
+  {
+    \tl_set:Nn \l_@@_path_tmp_tl { {#1} {#2} }
+    \@@_path_arc_aux_add:nn
+      { #5 + #3 }
+      { #6 + #4 }
+    \tl_put_right:Nn \l_@@_path_tmp_tl { {#3} {#4} }
+  }
+\cs_new_protected:Npn \@@_path_arc_aux_add:nn #1#2
+  {
+    \tl_put_right:Nx \l_@@_path_tmp_tl
+      { { \fp_to_dim:n {#1} } { \fp_to_dim:n {#2} } }
+  }
+\fp_new:N \l_@@_path_arc_delta_fp
+\fp_new:N \l_@@_path_arc_start_fp
+\fp_const:cn { c_@@_path_arc_90_fp } { 4/3 * (sqrt(2) - 1) }
+\fp_const:cn { c_@@_path_arc_60_fp } { 4/3 * tand(15) }
+%    \end{macrocode}
+% \end{variable}
+% \end{variable}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\draw_path_arc_axes:nnnn}
+%   A simple wrapper.
+%    \begin{macrocode}
+\cs_new_protected:Npn \draw_path_arc_axes:nnnn #1#2#3#4
+  {
+    \draw_transform_triangle:nnn { 0cm , 0cm } {#3} {#4}
+    \draw_path_arc:nnn {#1} {#2} { 1pt }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\draw_path_ellipse:nnn}
+% \begin{macro}{\@@_path_ellipse:nnnnnn}
+% \begin{macro}[EXP]
+%   {
+%     \@@_path_ellipse_arci:nnnnnn   ,
+%     \@@_path_ellipse_arcii:nnnnnn  ,
+%     \@@_path_ellipse_arciii:nnnnnn ,
+%     \@@_path_ellipse_arciv:nnnnnn
+%   }
+%  \begin{variable}{\c_@@_path_ellipse_fp}
+%   Drawing an ellipse is an optimised version of drawing an arc, in particular
+%   reusing the same constant. We need to deal with the ellipse in four parts
+%   and also deal with moving to the right place, closing it and ending up
+%   back at the center. That is handled on a per-arc basis, each in a
+%   separate auxiliary for readability.
+%    \begin{macrocode}
+\cs_new_protected:Npn \draw_path_ellipse:nnn #1#2#3
+  {
+    \@@_point_process:nnn
+      {
+        \@@_point_process:nn
+          { \@@_path_ellipse:nnnnnn }
+          { \draw_point_transform:n {#1} }
+      }
+      { \@@_point_transform_noshift:n {#2} }
+      { \@@_point_transform_noshift:n {#3} }
+  }
+\cs_new_protected:Npn \@@_path_ellipse:nnnnnn #1#2#3#4#5#6
+  {
+    \use:x
+      {
+        \@@_path_moveto:nn
+          { \fp_to_dim:n { #1 + #3 } } { \fp_to_dim:n { #2 + #4 } }
+        \@@_path_ellipse_arci:nnnnnn   {#1} {#2} {#3} {#4} {#5} {#6}
+        \@@_path_ellipse_arcii:nnnnnn  {#1} {#2} {#3} {#4} {#5} {#6}
+        \@@_path_ellipse_arciii:nnnnnn {#1} {#2} {#3} {#4} {#5} {#6}
+        \@@_path_ellipse_arciv:nnnnnn  {#1} {#2} {#3} {#4} {#5} {#6}
+      }
+    \@@_softpath_closepath:
+    \@@_path_moveto:nn {#1} {#2}
+  }
+\cs_new:Npn \@@_path_ellipse_arci:nnnnnn #1#2#3#4#5#6
+  {
+    \@@_path_curveto:nnnnnn
+      { \fp_to_dim:n { #1 + #3 + #5 * \c_@@_path_ellipse_fp } }
+      { \fp_to_dim:n { #2 + #4 + #6 * \c_@@_path_ellipse_fp } }
+      { \fp_to_dim:n { #1 + #3 * \c_@@_path_ellipse_fp + #5 } }
+      { \fp_to_dim:n { #2 + #4 * \c_@@_path_ellipse_fp + #6 } }
+      { \fp_to_dim:n { #1 + #5 } }
+      { \fp_to_dim:n { #2 + #6 } }
+  }
+\cs_new:Npn \@@_path_ellipse_arcii:nnnnnn #1#2#3#4#5#6
+  {
+    \@@_path_curveto:nnnnnn
+      { \fp_to_dim:n { #1 - #3 * \c_@@_path_ellipse_fp + #5 } }
+      { \fp_to_dim:n { #2 - #4 * \c_@@_path_ellipse_fp + #6 } }
+      { \fp_to_dim:n { #1 - #3 + #5 * \c_@@_path_ellipse_fp } }
+      { \fp_to_dim:n { #2 - #4 + #6 * \c_@@_path_ellipse_fp } }
+      { \fp_to_dim:n { #1 - #3 } }
+      { \fp_to_dim:n { #2 - #4 } }
+  }
+\cs_new:Npn \@@_path_ellipse_arciii:nnnnnn #1#2#3#4#5#6
+  {
+    \@@_path_curveto:nnnnnn
+      { \fp_to_dim:n { #1 - #3 - #5 * \c_@@_path_ellipse_fp } }
+      { \fp_to_dim:n { #2 - #4 - #6 * \c_@@_path_ellipse_fp } }
+      { \fp_to_dim:n { #1 - #3 * \c_@@_path_ellipse_fp - #5 } }
+      { \fp_to_dim:n { #2 - #4 * \c_@@_path_ellipse_fp - #6 } }
+      { \fp_to_dim:n { #1 - #5 } }
+      { \fp_to_dim:n { #2 - #6 } }
+  }
+\cs_new:Npn \@@_path_ellipse_arciv:nnnnnn #1#2#3#4#5#6
+  {
+    \@@_path_curveto:nnnnnn
+      { \fp_to_dim:n { #1 + #3 * \c_@@_path_ellipse_fp - #5 } }
+      { \fp_to_dim:n { #2 + #4 * \c_@@_path_ellipse_fp - #6 } }
+      { \fp_to_dim:n { #1 + #3 - #5 * \c_@@_path_ellipse_fp } }
+      { \fp_to_dim:n { #2 + #4 - #6 * \c_@@_path_ellipse_fp } }
+      { \fp_to_dim:n { #1 + #3 } }
+      { \fp_to_dim:n { #2 + #4 } }
+  }
+\fp_const:Nn \c_@@_path_ellipse_fp { \fp_use:c { c_@@_path_arc_90_fp } }
+%    \end{macrocode}
+% \end{variable}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\draw_path_circle:nn}
+%   A shortcut.
+%    \begin{macrocode}
+\cs_new_protected:Npn \draw_path_circle:nn #1#2
+  { \draw_path_ellipse:nnn {#1} { #2 , 0pt } { 0pt , #2 } }
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsection{Rectangles}
+%
+% \begin{macro}{\draw_path_rectangle:nn}
+% \begin{macro}{\@@_path_rectangle:nnnn, \@@_path_rectangle_rounded:nnnn}
+%   Building a rectangle can be a single operation, or for rounded versions will
+%   involve step-by-step construction.
+%    \begin{macrocode}
+\cs_new_protected:Npn \draw_path_rectangle:nn #1#2
+  {
+    \@@_point_process:nnn
+      {
+        \bool_if:NTF \l_@@_corner_arc_bool
+          { \@@_path_rectangle_rounded:nnnn }
+          { \@@_path_rectangle:nnnn }
+      }
+      { \draw_point_transform:n {#1} }
+      {#2}
+  }
+\cs_new_protected:Npn \@@_path_rectangle:nnnn #1#2#3#4
+  {
+    \@@_path_update_limits:nn {#1} {#2}
+    \@@_path_update_limits:nn { #1 + #3 } { #2 + #4 }
+    \@@_softpath_rectangle:nnnn {#1} {#2} {#3} {#4}
+    \@@_path_update_last:nn {#1} {#2}
+  }
+\cs_new_protected:Npn \@@_path_rectangle_rounded:nnnn #1#2#3#4
+  {
+    \draw_path_moveto:n { #1 + #3 , #2 + #4 }
+    \draw_path_lineto:n { #1 , #2 + #4 }
+    \draw_path_lineto:n { #1 , #2 }
+    \draw_path_lineto:n { #1 + #3 , #2 }
+    \draw_path_close:
+    \draw_path_moveto:n { #1 , #2 }
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\draw_path_rectangle_corners:nn}
+% \begin{macro}{\@@_path_rectangle_corners:nnnn}
+%   Another shortcut wrapper.
+%    \begin{macrocode}
+\cs_new_protected:Npn \draw_path_rectangle_corners:nn #1#2
+  {
+    \@@_point_process:nnn
+      { \@@_path_rectangle_corners:nnnnn {#1} }
+      {#1} {#2}
+  }
+\cs_new_protected:Npn \@@_path_rectangle_corners:nnnnn #1#2#3#4#5
+  { \draw_path_rectangle:nn {#1} { #4 - #2 , #5 - #3 } }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Grids}
+%
+% \begin{macro}{\draw_path_grid:nnnn}
+% \begin{macro}{\@@_path_grid:nnnnnn}
+%   A simple set of loops.
+%    \begin{macrocode}
+\cs_new_protected:Npn \draw_path_grid:nnnn #1#2#3#4
+  {
+    \@@_point_process:nnn
+      { \@@_path_grid:nnnnnn {#1} {#2} }
+      {#3} {#4}
+  }
+\cs_new_protected:Npn \@@_path_grid:nnnnnn #1#2#3#4#5#6
+  {
+    \dim_step_inline:nnnn
+      {#3} { \dim_compare:nNnF {#3} < {#5} { - } \dim_abs:n {#1} } {#5}
+      {
+        \draw_path_moveto:n { ##1 , #4 }
+        \draw_path_lineto:n { ##1 , #6 }
+      }
+    \dim_step_inline:nnnn
+      {#4} { \dim_compare:nNnF {#4} < {#6} { - } \dim_abs:n {#2} } {#6}
+      {
+        \draw_path_moveto:n { #3 , ##1 }
+        \draw_path_lineto:n { #5 , ##1 }
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Using paths}
+%
+% \begin{variable}
+%   {
+%     \l_@@_path_use_clip_bool  ,
+%     \l_@@_path_use_fill_bool  ,
+%     \l_@@_path_use_stroke_bool
+%   }
+%   Actions to pass to the driver.
+%    \begin{macrocode}
+\bool_new:N \l_@@_path_use_clip_bool
+\bool_new:N \l_@@_path_use_fill_bool
+\bool_new:N \l_@@_path_use_stroke_bool
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\l_@@_path_use_bb_bool, \l_@@_path_use_clear_bool}
+%   Actions handled at the macro layer.
+%    \begin{macrocode}
+\bool_new:N \l_@@_path_use_bb_bool
+\bool_new:N \l_@@_path_use_clear_bool
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}{\draw_path_use:n, \draw_path_use_clear:n}
+% \begin{macro}{\@@_path_use:n}
+% \begin{macro}{\@@_path_use_action_draw:}
+% \begin{macro}{\@@_path_use_stroke_bb:}  
+% \begin{macro}{\@@_path_use_stroke_bb_aux:NnN}
+%   There are a range of actions which can apply to a path: they are handled
+%   in a single function which can carry out several of them. The first step
+%   is to deal with the special case of clearing the path.
+%    \begin{macrocode}
+\cs_new_protected:Npn \draw_path_use:n #1
+  {
+    \tl_if_blank:nF {#1}
+      { \@@_path_use:n {#1} }
+  }
+\cs_new_protected:Npn \draw_path_use_clear:n #1
+  {
+    \bool_lazy_or:nnTF
+      { \tl_if_blank_p:n {#1} }
+      { \str_if_eq_p:nn {#1} { clear } }
+      {
+        \@@_softpath_clear:
+        \@@_path_reset_limits:
+      }
+      { \@@_path_use:n { #1 , clear } }
+   }
+%    \end{macrocode}
+%   Map over the actions and set up the data: mainly just booleans,
+%   but with the possibility to cover more complex cases. The business end
+%   of the function is a series of checks on the various flags, then
+%   taking the appropriate action(s).
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_path_use:n #1
+  {
+    \bool_set_false:N \l_@@_path_use_clip_bool
+    \bool_set_false:N \l_@@_path_use_fill_bool
+    \bool_set_false:N \l_@@_path_use_stroke_bool
+    \clist_map_inline:nn {#1}
+      {
+        \cs_if_exist:cTF { l_@@_path_use_ ##1 _ bool }
+          { \bool_set_true:c { l_@@_path_use_ ##1 _ bool } }
+          {
+            \cs_if_exist_use:cF { @@_path_use_action_ ##1 : }
+              { \ERROR }
+          }
+      }
+    \bool_lazy_and:nnT
+      { \l_@@_update_bb_bool }
+      { \l_@@_path_use_stroke_bool }
+      { \@@_path_use_stroke_bb: }
+    \bool_if:NTF \l_@@_path_use_clear_bool
+      { \@@_softpath_use_clear: }
+      { \@@_softpath_use: }
+    \bool_if:NT \l_@@_path_use_clip_bool
+      { \driver_draw_clip: }
+    \bool_lazy_or:nnT
+      { \l_@@_path_use_fill_bool }
+      { \l_@@_path_use_stroke_bool }
+      {
+        \use:c
+          {
+            driver_draw_
+            \bool_if:NT \l_@@_path_use_fill_bool { fill }
+            \bool_if:NT \l_@@_path_use_stroke_bool { stroke }
+            :
+          }
+      }
+  }
+\cs_new_protected:Npn \@@_path_use_action_draw:
+  {
+    \bool_set_true:N \l_@@_path_use_stroke_bool
+  }
+%    \end{macrocode}
+%   Where the path is relevant to size and is stroked, we need to allow for
+%   the part which overlaps the edge of the bounding box.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_path_use_stroke_bb:
+  {
+    \@@_path_use_stroke_bb_aux:NnN x { max } +
+    \@@_path_use_stroke_bb_aux:NnN y { max } +
+    \@@_path_use_stroke_bb_aux:NnN x { min } -
+    \@@_path_use_stroke_bb_aux:NnN y { min } -
+  }
+\cs_new_protected:Npn \@@_path_use_stroke_bb_aux:NnN #1#2#3
+  {
+    \dim_compare:nNnF { \dim_use:c { g_@@_ #1#2 _dim } } = { #3 -\c_max_dim }
+      {
+        \dim_gset:cn { g_@@_ #1#2 _dim }
+          {
+            \use:c { dim_ #2 :nn }
+              { \dim_use:c { g_@@_ #1#2 _dim } }
+              {
+                  \dim_use:c { g_@@_path_ #1#2 _dim }
+                #3 0.5 \g_@@_linewidth_dim
+              } 
+          }
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%    \begin{macrocode}
+%</initex|package>
+%    \end{macrocode}
+%
+% \end{implementation}
+%
+% \PrintIndex


Property changes on: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx	                        (rev 0)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -0,0 +1,960 @@
+% \iffalse meta-comment
+%
+%% File: l3draw-points.dtx Copyright(C) 2018 The LaTeX3 Project
+%
+% It may be distributed and/or modified under the conditions of the
+% LaTeX Project Public License (LPPL), either version 1.3c of this
+% license or (at your option) any later version.  The latest version
+% of this license is in the file
+%
+%    http://www.latex-project.org/lppl.txt
+%
+% This file is part of the "l3experimental bundle" (The Work in LPPL)
+% and all files in that bundle must be distributed together.
+%
+% -----------------------------------------------------------------------
+%
+% The development version of the bundle can be found at
+%
+%    https://github.com/latex3/latex3
+%
+% for those people who are interested.
+%
+%<*driver>
+\RequirePackage{expl3}
+\documentclass[full]{l3doc}
+\begin{document}
+  \DocInput{\jobname.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \title{^^A
+%   The \pkg{l3draw-points} package\\ Calculating points^^A
+% }
+%
+% \author{^^A
+%  The \LaTeX3 Project\thanks
+%    {^^A
+%      E-mail:
+%        \href{mailto:latex-team at latex-project.org}
+%          {latex-team at latex-project.org}^^A
+%    }^^A
+% }
+%
+% \date{Released 2018/02/21}
+%
+% \maketitle
+%
+% \begin{implementation}
+%
+% \section{\pkg{l3draw-points} implementation}
+%
+%    \begin{macrocode}
+%<*initex|package>
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+%<@@=draw>
+%    \end{macrocode}
+%
+% This sub-module covers more-or-less the same ideas as
+% \texttt{pgfcorepoints.code.tex}, though the approach taken to returning
+% values is different: point expressions here are processed by expansion
+% and return a co-ordinate pair in the form |{|\meta{x}|}{|\meta{y}|}|.
+% Equivalents of following \pkg{pgf} functions are deliberately omitted:
+% \begin{itemize}
+%   \item \cs{pgfpointorigin}: Can be given explicitly as |{0pt}{0pt}|.
+%   \item \cs{pgfextractx}, \cs{pgfextracty}: Available by applying
+%     \cs{use_i:nn}/\cs{use_ii:nn} or similar to the \texttt{x}-type
+%     expansion of a point expression.
+%    \item \cs{pgfgetlastxy}: Unused in the entire \pkg{pgf} core, may be
+%      emulated by \texttt{x}-type expansion of a point expression, then using
+%      the result.
+% \end{itemize}
+% In addition, equivalents of the following \emph{may} be added in future but
+% are currently absent:
+% \begin{itemize}
+%   \item \cs{pgfpointcylindrical}, \cs{pgfpointspherical}: The usefulness
+%     of these commands is not currently clear.
+%   \item \cs{pgfpointborderrectangle}, \cs{pgfpointborderellipse}: To be
+%     revisited once the semantics and use cases are clear.
+%   \item \cs{pgfqpoint}, \cs{pgfqpointscale}, \cs{pgfqpointpolar},
+%     \cs{pgfqpointxy}, \cs{pgfqpointxyz}: The expandable approach taken in
+%     the code here, along with the absolute requirement for \eTeX{}, means
+%     it is likely many use cases for these commands may be covered in other
+%     ways. This may be revisited as higher-level structures are constructed.
+% \end{itemize}
+%
+% \subsection{Support functions}
+%
+% \begin{macro}[EXP]{\@@_point_process:nn}
+% \begin{macro}[EXP]{\@@_point_process_auxi:nn, \@@_point_process_auxi:fn}
+% \begin{macro}[EXP]{\@@_point_process_auxii:nw}
+% \begin{macro}[EXP]{\@@_point_process:nnn}
+% \begin{macro}[EXP]{\@@_point_process_auxiii:nnn, \@@_point_process_auxiii:ffn}
+% \begin{macro}[EXP]{\@@_point_process_auxiv:nw}
+%   Execute whatever code is passed to extract the $x$ and $y$ co-ordinates.
+%   The first argument here should itself absorb two arguments. There is
+%   also a version to deal with two co-ordinates: common enough to justify a
+%   separate function.
+%    \begin{macrocode}
+\cs_new:Npn \@@_point_process:nn #1#2
+  {
+    \@@_point_process_auxi:fn
+      { \@@_point_to_dim:n {#2} }
+      {#1}
+  }
+\cs_new:Npn \@@_point_process_auxi:nn #1#2
+  { \@@_point_process_auxii:nw {#2} #1 \q_stop }
+\cs_generate_variant:Nn \@@_point_process_auxi:nn { f }
+\cs_new:Npn \@@_point_process_auxii:nw #1 #2 , #3 \q_stop
+  { #1 {#2} {#3} }
+\cs_new:Npn \@@_point_process:nnn #1#2#3
+  {
+    \@@_point_process_auxiii:ffn
+      { \@@_point_to_dim:n {#2} }
+      { \@@_point_to_dim:n {#3} }
+      {#1}
+  }
+\cs_new:Npn \@@_point_process_auxiii:nnn #1#2#3
+  { \@@_point_process_auxiv:nw {#3} #1 \q_mark #2 \q_stop }
+\cs_generate_variant:Nn \@@_point_process_auxiii:nnn { ff }
+\cs_new:Npn \@@_point_process_auxiv:nw #1 #2 , #3 \q_mark #4 , #5 \q_stop
+  { #1 {#2} {#3} {#4} {#5} }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\@@_point_to_dim:n}
+% \begin{macro}[EXP]{\@@_point_to_dim_aux:n, \@@_point_to_dim_aux:f}
+% \begin{macro}[EXP]{\@@_point_to_dim_aux:w} 
+%   Co-ordinates are always returned as two dimensions. 
+%    \begin{macrocode} 
+\cs_new:Npn \@@_point_to_dim:n #1 
+  { \@@_point_to_dim_aux:f { \fp_eval:n {#1} } }
+\cs_new:Npn \@@_point_to_dim_aux:n #1 
+  { \@@_point_to_dim_aux:w #1 }
+\cs_generate_variant:Nn \@@_point_to_dim_aux:n { f }
+\cs_new:Npn \@@_point_to_dim_aux:w ( #1 , ~ #2 ) { #1pt , #2pt }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Co-ordinates}	
+%
+% The most basic way of giving points is as simple $(x,y)$ co-ordinates.
+%
+% \begin{macro}[EXP]{\draw_point:nn}
+%   Simply turn the given values into dimensions.
+%    \begin{macrocode}
+\cs_new:Npn \draw_point:nn #1#2
+  { \@@_point_to_dim:n { #1 , #2 } }
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsection{Polar co-ordinates}
+%
+% \begin{macro}[EXP]{\draw_point_polar:nn}
+% \begin{macro}[EXP]{\draw_point_polar:nnn}
+% \begin{macro}[EXP]{\@@_draw_polar:nnn, \@@_draw_polar:fnn}
+%   Polar co-ordinates may have either one or two lengths, so there is a need
+%   to do a simple split before the calculation. As the angle gets used twice,
+%   save on any expression evaluation there and force expansion.
+%    \begin{macrocode}
+\cs_new:Npn \draw_point_polar:nn #1#2
+  { \draw_point_polar:nnn {#1} {#2} {#2} }
+\cs_new:Npn \draw_point_polar:nnn #1#2#3
+  { \@@_draw_polar:fnn { \fp_eval:n {#1} } {#2} {#3} }
+\cs_new:Npn \@@_draw_polar:nnn #1#2#3
+  { \@@_point_to_dim:n { cosd(#1) * (#2) , sind(#1) * (#3) } }
+\cs_generate_variant:Nn \@@_draw_polar:nnn { f }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Point expression arithmetic}
+%
+% These functions all take point expressions as arguments.
+%
+% \begin{macro}[EXP]
+%   {\draw_point_add:nn, \draw_point_diff:nn, \draw_point_scale:nn}
+%   Simple mathematics.
+%    \begin{macrocode}
+\cs_new:Npn \draw_point_add:nn #1#2
+  { \@@_point_to_dim:n { (#1) + (#2) } }
+\cs_new:Npn \draw_point_diff:nn #1#2
+  { \@@_point_to_dim:n { (#2) - (#1) } }
+\cs_new:Npn \draw_point_scale:nn #1#2
+  { \@@_point_to_dim:n { #1 * (#2) } }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\draw_point_unit_vector:n}
+% \begin{macro}[EXP]{\@@_point_unit_vector:nn}
+%   Only a single point expression so the expansion is done here. The
+%   outcome is the normalised vector from $(0,0)$ in the direction of
+%   the point, \emph{i.e.}
+%   \[
+%     P_{x} = \frac{x}{\sqrt{x^{2} + y^{2}}} \quad
+%     P_{y} = \frac{y}{\sqrt{x^{2} + y^{2}}}
+%   \]
+%    \begin{macrocode}
+\cs_new:Npn \draw_point_unit_vector:n #1
+  { \@@_point_process:nn { \@@_point_unit_vector:nn } {#1} }
+\cs_new:Npn \@@_point_unit_vector:nn #1#2
+  {
+    \@@_point_to_dim:n
+      { ( #1 , #2 ) / (sqrt(#1 * #1 + #2 * #2)) }
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Intersection calculations}
+%
+% \begin{macro}[EXP]{\draw_point_intersect_lines:nnnn}
+% \begin{macro}[EXP]{\@@_point_intersect_lines:nnnnnn}
+% \begin{macro}[EXP]{\@@_point_intersect_lines:nnnnnnnn}
+% \begin{macro}[EXP]
+%   {\@@_point_intersect_lines_aux:nnnnnn, \@@_point_intersect_lines_aux:ffffff}
+%    The intersection point~$P$ between a line joining points $(x_{1}, y_{1})$
+%    and $(x_{2}, y_{2})$ with a second line joining points $(x_{3}, y_{3})$
+%    and $(x_{4}, y_{4})$ can be calculated using the formulae
+%    \[
+%      P_{x} =
+%          \frac{(x_{1}y_{2} - y_{1}x_{2})(x_{3} - x_{4})
+%            - (x_{3}y_{4} - y_{3}x_{4})(x_{1} - x_{2})}
+%          {(x_{1} - x_{2})(y_{3} - y_{4}) - (y_{1} - y_{2})(x_{3} - x_{4})}
+%    \]
+%    and
+%    \[
+%      P_{y} =
+%          \frac{(x_{1}y_{2} - y_{1}x_{2})(y_{3} - y_{5})
+%          - (x_{3}y_{4} - y_{3}x_{4})(y_{1} - y_{2})}
+%          {(x_{1} - x_{2})(y_{3} - y_{4}) - (y_{1} - y_{2})(x_{3} - x_{4})} 
+%    \]
+%    The work therefore comes down to expanding the incoming data, then
+%    pre-calculating as many parts as possible before the final work to find
+%    the intersection. (Expansion and argument re-ordering is much less work
+%    than additional floating point calculations.)
+%    \begin{macrocode}
+\cs_new:Npn \draw_point_intersect_lines:nnnn #1#2#3#4
+  {
+    \@@_point_process:nnn
+      {
+        \@@_point_process:nnn
+          { \@@_point_intersect_lines:nnnnnnnn } {#3} {#4}
+      }
+      {#1} {#2}
+  }
+%    \end{macrocode}
+%   At this stage we have all of the information we need, fully expanded:
+%   \begin{enumerate}[label = \#\arabic*, font = \ttfamily]
+%     \item $x_{3}$
+%     \item $y_{3}$
+%     \item $x_{4}$
+%     \item $y_{4}$
+%     \item $x_{1}$
+%     \item $y_{1}$
+%     \item $x_{2}$
+%     \item $y_{2}$
+%   \end{enumerate}
+%   so now just have to do all of the calculation.
+%    \begin{macrocode}
+\cs_new:Npn \@@_point_intersect_lines:nnnnnnnn #1#2#3#4#5#6#7#8
+  {
+    \@@_point_intersect_lines_aux:ffffff
+      { \fp_eval:n { #1 * #4 - #2 * #3 } }
+      { \fp_eval:n { #5 * #8 - #6 * #7 } }
+      { \fp_eval:n { #1 - #3 } }
+      { \fp_eval:n { #5 - #7 } }
+      { \fp_eval:n { #2 - #4 } }
+      { \fp_eval:n { #6 - #8 } }
+  }
+\cs_new:Npn \@@_point_intersect_lines_aux:nnnnnn #1#2#3#4#5#6
+  {
+    \@@_point_to_dim:n
+      {
+        ( #2 * #3 - #1 * #4 , #2 * #5 - #1 * #6 )
+          / ( #4 * #5 - #6 * #3 )
+      }
+  }
+\cs_generate_variant:Nn \@@_point_intersect_lines_aux:nnnnnn { ffffff }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\draw_point_intersect_circles:nnnnn}
+% \begin{macro}[EXP]{\@@_point_intersect_circles_auxi:nnnnnnn}
+% \begin{macro}[EXP]
+%   {
+%     \@@_point_intersect_circles_auxii:nnnnnnn,
+%     \@@_point_intersect_circles_auxii:ffnnnnn,
+%     \@@_point_intersect_circles_auxiii:nnnnnnn,
+%     \@@_point_intersect_circles_auxiii:ffnnnnn
+%   }
+%  \begin{macro}[EXP]
+%    {
+%      \@@_point_intersect_circles_auxiv:nnnnnnnn,
+%      \@@_point_intersect_circles_auxiv:fnnnnnnn
+%    }
+%  \begin{macro}[EXP]
+%    {
+%      \@@_point_intersect_circles_auxv:nnnnnnnnn,
+%      \@@_point_intersect_circles_auxv:ffnnnnnnn
+%    }
+%  \begin{macro}[EXP]
+%    {
+%      \@@_point_intersect_circles_auxvi:nnnnnnnn,
+%      \@@_point_intersect_circles_auxvi:fnnnnnnn
+%    }
+% \begin{macro}[EXP]
+%   {
+%     \@@_point_intersect_circles_auxvii:nnnnnnn,
+%     \@@_point_intersect_circles_auxvii:fffnnnn
+%   }
+%   Another long expansion chain to get the values in the right places.
+%   We have two circles, the first with center $(a, b)$ and radius~$r$,
+%   the second with center $(c, d)$ and radius~$s$. We use the intermediate
+%   values
+%   \begin{align*}
+%     e &= c - a \\
+%     f &= d - b \\
+%     p &= \sqrt{e^{2} + f^{2}} \\
+%     k &= \frac{p^{2} + r^{2} - s^{2}}{2p}
+%   \end{align*}
+%   in either
+%   \begin{align*}
+%     P_{x} &= a + \frac{ek}{p} + \frac{f}{p}\sqrt{r^{2} - k^{2}} \\
+%     P_{y} &= b + \frac{fk}{p} - \frac{e}{p}\sqrt{r^{2} - k^{2}}
+%   \end{align*}
+%   or
+%   \begin{align*}
+%     P_{x} &= a + \frac{ek}{p} - \frac{f}{p}\sqrt{r^{2} - k^{2}} \\
+%     P_{y} &= b + \frac{fk}{p} + \frac{e}{p}\sqrt{r^{2} - k^{2}}
+%   \end{align*}
+%   depending on which solution is required. The rest of the work is simply
+%   forcing the appropriate expansion and shuffling arguments.
+%    \begin{macrocode}
+\cs_new:Npn \draw_point_intersect_circles:nnnnn #1#2#3#4#5
+  {
+    \@@_point_process:nnn
+      { \@@_point_intersect_circles_auxi:nnnnnnn {#2} {#4} {#5} }
+      {#1} {#3}
+  }
+\cs_new:Npn \@@_point_intersect_circles_auxi:nnnnnnn #1#2#3#4#5#6#7
+  {
+    \@@_point_intersect_circles_auxii:ffnnnnn
+      { \fp_eval:n {#1} } { \fp_eval:n {#2} } {#4} {#5} {#6} {#7} {#3}
+  }
+%    \end{macrocode}
+%   At this stage we have all of the information we need, fully expanded:
+%   \begin{enumerate}[label = \#\arabic*, font = \ttfamily]
+%     \item $r$
+%     \item $s$
+%     \item $a$
+%     \item $b$
+%     \item $c$
+%     \item $d$
+%     \item $n$
+%   \end{enumerate}
+%   Once we evaluate $e$ and $f$, the co-ordinate $(c,d)$ is no longer
+%   required: handy as we will need various intermediate values in the
+%   following.
+%    \begin{macrocode}
+\cs_new:Npn \@@_point_intersect_circles_auxii:nnnnnnn #1#2#3#4#5#6#7
+  {
+    \@@_point_intersect_circles_auxiii:ffnnnnn
+      { \fp_eval:n { #5 - #3 } }
+      { \fp_eval:n { #6 - #4 } }
+      {#1} {#2} {#3} {#4} {#7}
+  }
+\cs_generate_variant:Nn \@@_point_intersect_circles_auxii:nnnnnnn { ff }
+\cs_new:Npn \@@_point_intersect_circles_auxiii:nnnnnnn #1#2#3#4#5#6#7
+  {
+    \@@_point_intersect_circles_auxiv:fnnnnnnn
+      { \fp_eval:n { sqrt( #1 * #1 + #2 * #2 ) } }
+      {#1} {#2} {#3} {#4} {#5} {#6} {#7}
+  }
+\cs_generate_variant:Nn \@@_point_intersect_circles_auxiii:nnnnnnn { ff }
+%    \end{macrocode}
+%   We now have $p$: we pre-calculate $1/p$ as it is needed a few times and
+%   is relatively expensive. We also need $r^{2}$ twice so deal with that
+%   here too.
+%    \begin{macrocode}
+\cs_new:Npn \@@_point_intersect_circles_auxiv:nnnnnnnn #1#2#3#4#5#6#7#8
+  {
+    \@@_point_intersect_circles_auxv:ffnnnnnnn
+      { \fp_eval:n { 1 / #1 } }
+      { \fp_eval:n { #4 * #4 } }
+      {#1} {#2} {#3} {#5} {#6} {#7} {#8}
+  }
+\cs_generate_variant:Nn \@@_point_intersect_circles_auxiv:nnnnnnnn { f }
+\cs_new:Npn \@@_point_intersect_circles_auxv:nnnnnnnnn #1#2#3#4#5#6#7#8#9
+  {
+    \@@_point_intersect_circles_auxvi:fnnnnnnn
+      { \fp_eval:n { 0.5 * #1 * ( #2 + #3 * #3 - #6 * #6 ) } }
+      {#1} {#2} {#4} {#5} {#7} {#8} {#9}
+  }
+\cs_generate_variant:Nn \@@_point_intersect_circles_auxv:nnnnnnnnn { ff }
+%    \end{macrocode}
+%   We now have all of the intermediate values we require, with one division
+%   carried out up-front to avoid doing this expensive step twice:
+%   \begin{enumerate}[label = \#\arabic*, font = \ttfamily]
+%     \item $k$
+%     \item $1/p$
+%     \item $r^{2}$
+%     \item $e$
+%     \item $f$
+%     \item $a$
+%     \item $b$
+%     \item $n$
+%   \end{enumerate}
+%   There are some final pre-calculations, $k/p$,
+%   $\frac{\sqrt{r^{2} - k^{2}}}{p}$ and the usage of $n$, then we
+%   can yield a result.
+%    \begin{macrocode}
+\cs_new:Npn \@@_point_intersect_circles_auxvi:nnnnnnnn #1#2#3#4#5#6#7#8
+  {
+    \@@_point_intersect_circles_auxvii:fffnnnn
+      { \fp_eval:n { #1 * #2 } }
+      { \int_if_odd:nTF {#8} { 1 } { -1 } }
+      { \fp_eval:n { sqrt ( #3 - #1 * #1 ) * #2 } }
+      {#4} {#5} {#6} {#7}
+  }
+\cs_generate_variant:Nn \@@_point_intersect_circles_auxvi:nnnnnnnn { f }
+\cs_new:Npn \@@_point_intersect_circles_auxvii:nnnnnnn #1#2#3#4#5#6#7
+  {
+    \@@_point_to_dim:n
+      { #6 + #4 * #1 + #2 * #3 * #5 , #7 + #5 * #1 + -1 * #2 * #3 * #4 }
+  }
+\cs_generate_variant:Nn \@@_point_intersect_circles_auxvii:nnnnnnn { fff }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Interpolation on a line (vector) or arc}
+%
+% \begin{macro}[EXP]{\draw_point_interpolate_line:nnn}
+% \begin{macro}[EXP]
+%   {
+%     \@@_point_interpolate_line_aux:nnnnn,
+%     \@@_point_interpolate_line_aux:fnnnn,
+%   }
+% \begin{macro}[EXP]
+%   {
+%     \@@_point_interpolate_line_aux:nnnnnn,
+%     \@@_point_interpolate_line_aux:fnnnnn,
+%   }
+%   Simple maths after expansion.
+%    \begin{macrocode}
+\cs_new:Npn \draw_point_interpolate_line:nnn #1#2#3
+  {
+    \@@_point_process:nnn
+      { \@@_point_interpolate_line_aux:fnnnn { \fp_eval:n {#1} } }
+      {#2} {#3}
+  }
+\cs_new:Npn \@@_point_interpolate_line_aux:nnnnn #1#2#3#4#5
+  {
+    \@@_point_interpolate_line_aux:fnnnnn { \fp_eval:n { 1 - #1 } }
+      {#1} {#2} {#3} {#4} {#5}
+  }
+\cs_generate_variant:Nn \@@_point_interpolate_line_aux:nnnnn { f }
+\cs_new:Npn \@@_point_interpolate_line_aux:nnnnnn #1#2#3#4#5#6
+  { \@@_point_to_dim:n { #2 * #3 + #1 * #5 , #2 * #4 + #1 * #6 } }
+\cs_generate_variant:Nn \@@_point_interpolate_line_aux:nnnnnn { f }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\draw_point_interpolate_distance:nnn}
+% \begin{macro}[EXP]{\@@_point_interpolate_distance:nnnnn}
+% \begin{macro}[EXP]
+%   {
+%     \@@_point_interpolate_distance_aux:nnnnnnn,
+%     \@@_point_interpolate_distance_aux:nnnnnnn,
+%   }
+% \begin{macro}[EXP]
+%   {
+%     \@@_point_interpolate_distance_aux:nnnnnn,
+%     \@@_point_interpolate_distance_aux:fnnnnn,
+%   }
+%   Same idea but using the normalised length to obtain the scale factor.
+%    \begin{macrocode}
+\cs_new:Npn \draw_point_interpolate_distance:nnn #1#2#3
+  {
+    \@@_point_process:nnn
+      { \@@_point_interpolate_distance:nnnnn {#1} }
+      {#2} {#3}
+  }
+\cs_new:Npn \@@_point_interpolate_distance:nnnnn #1#2#3#4#5
+  {
+    \@@_point_interpolate_distance_aux:nnnnnnn
+      { \fp_eval:n { #4 - #2 } }
+      { \fp_eval:n { #5 - #3 } }
+      {#2} {#3} {#4} {#5} {#1}
+  }
+\cs_new:Npn \@@_point_interpolate_distance_aux:nnnnnnn #1#2#3#4#5#6#7
+  {
+    \@@_point_interpolate_distance_aux:fnnnn
+      { \fp_eval:n { (#7) / (sqrt ( #1 * #1 + #2 * #2 )) } }
+      {#3} {#4} {#5} {#6}
+  }
+\cs_generate_variant:Nn \@@_point_interpolate_distance_aux:nnnnnnn { ff }
+\cs_new:Npn \@@_point_interpolate_distance_aux:nnnnn #1#2#3#4#5
+  { \@@_point_to_dim:n { #2 + #1 * #4 , #3 + #1 * #5 } }
+\cs_generate_variant:Nn \@@_point_interpolate_distance_aux:nnnnn { f }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\draw_point_interpolate_arcaxes:nnnnnn}
+% \begin{macro}[EXP]{\@@_point_interpolate_arcaxes_auxi:nnnnnnnnn}
+% \begin{macro}[EXP]
+%   {
+%     \@@_point_interpolate_arcaxes_auxii:nnnnnnnnn,
+%     \@@_point_interpolate_arcaxes_auxii:fnnnnnnnn
+%   }
+% \begin{macro}[EXP]
+%   {
+%     \@@_point_interpolate_arcaxes_auxiii:nnnnnnn,
+%     \@@_point_interpolate_arcaxes_auxiii:fnnnnnn
+%   }
+% \begin{macro}[EXP]
+%   {
+%     \@@_point_interpolate_arcaxes_auxiv:nnnnnnnn,
+%     \@@_point_interpolate_arcaxes_auxiv:ffnnnnnn
+%   }
+%   Finding a point on an ellipse arc is relatively easy: find the correct
+%   angle between the two given, use the sine and cosine of that angle,
+%   apply to the axes. We just have to work a bit with the co-ordinate
+%   expansion.
+%    \begin{macrocode}
+\cs_new:Npn \draw_point_interpolate_arcaxes:nnnnnn #1#2#3#4#5#6
+  {
+    \@@_point_process:nnn
+      {
+        \@@_point_process:nn
+          { \@@_point_interpolate_arcaxes_auxi:nnnnnnnnn {#1} {#5} {#6} }
+          {#4}
+      }
+      {#2} {#3}
+  }
+\cs_new:Npn \@@_point_interpolate_arcaxes_auxi:nnnnnnnnn #1#2#3#4#5#6#7#8#9
+  {
+    \@@_point_interpolate_arcaxes_auxii:fnnnnnnnn
+      { \fp_eval:n {#1} } {#2} {#3} {#6} {#7} {#8} {#9} {#4} {#5}
+  }
+%    \end{macrocode}
+%   At this stage, the three co-ordinate pairs are fully expanded but somewhat
+%   re-ordered:
+%   \begin{enumerate}[label = \#\arabic*, font = \ttfamily]
+%     \item $p$
+%     \item $\theta_{1}$
+%     \item $\theta_{2}$
+%     \item $x_{c}$
+%     \item $y_{c}$
+%     \item $x_{a1}$
+%     \item $y_{a1}$
+%     \item $x_{a2}$
+%     \item $y_{a2}$
+%   \end{enumerate}
+%   We are now in a position to find the target angle, and from that
+%   the sine and cosine required.
+%    \begin{macrocode}
+\cs_new:Npn \@@_point_interpolate_arcaxes_auxii:nnnnnnnnn #1#2#3#4#5#6#7#8#9
+  {
+    \@@_point_interpolate_arcaxes_auxiii:fnnnnnn
+      { \fp_eval:n { #1 * (#3) + ( 1 - #1 ) * (#2) } }
+      {#4} {#5} {#6} {#7} {#8} {#9}
+  }
+\cs_generate_variant:Nn \@@_point_interpolate_arcaxes_auxii:nnnnnnnnn { f }
+\cs_new:Npn \@@_point_interpolate_arcaxes_auxiii:nnnnnnn #1#2#3#4#5#6#7
+  {
+    \@@_point_interpolate_arcaxes_auxiv:ffnnnnnn
+      { \fp_eval:n { cosd (#1) } }
+      { \fp_eval:n { sind (#1) } }
+      {#2} {#3} {#4} {#5} {#6} {#7}
+  }
+\cs_generate_variant:Nn \@@_point_interpolate_arcaxes_auxiii:nnnnnnn { f }
+\cs_new:Npn \@@_point_interpolate_arcaxes_auxiv:nnnnnnnn #1#2#3#4#5#6#7#8
+  {
+    \@@_point_to_dim:n
+      { #3 + #1 * #5 + #2 * #7 , #4 + #1 * #6 + #2 * #8 }
+  }
+\cs_generate_variant:Nn \@@_point_interpolate_arcaxes_auxiv:nnnnnnnn { ff }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\draw_point_interpolate_curve:nnnnn}
+% \begin{macro}[EXP]{\draw_point_interpolate_curve_auxi:nnnnnnnnn}
+% \begin{macro}[EXP]
+%   {
+%     \draw_point_interpolate_curve_auxii:nnnnnnnnn,
+%     \draw_point_interpolate_curve_auxii:fnnnnnnnn,
+%   }
+% \begin{macro}[EXP]
+%   {
+%     \draw_point_interpolate_curve_auxiii:nnnnnn,
+%     \draw_point_interpolate_curve_auxiii:fnnnnn,
+%   }
+% \begin{macro}[EXP]{\draw_point_interpolate_curve_auxiv:nnnnnn}
+% \begin{macro}[EXP]
+%   {
+%     \draw_point_interpolate_curve_auxv:nnw,
+%     \draw_point_interpolate_curve_auxv:ffw,
+%   }
+% \begin{macro}[EXP]{\draw_point_interpolate_curve_auxvi:n}
+% \begin{macro}[EXP]{\draw_point_interpolate_curve_auxvii:nnnnnnnn}
+% \begin{macro}[EXP]
+%   {
+%     \draw_point_interpolate_curve_auxviii:nnnnnn,
+%     \draw_point_interpolate_curve_auxviii:ffnnnn,
+%   }
+%   Here we start with a proportion of the curve ($p$) and four points
+%   \begin{enumerate}
+%     \item The initial point $(x_{1},y_{1})$
+%     \item The first control point $(x_{2},y_{2})$
+%     \item The second control point $(x_{3},y_{3})$
+%     \item The final point $(x_{4},y_{4})$
+%   \end{enumerate}
+%   The first phase is to expand out all of these values.
+%    \begin{macrocode}
+\cs_new:Npn \draw_point_interpolate_curve:nnnnnn #1#2#3#4#5
+  {
+    \@@_point_process:nnn
+      {
+        \@@_point_process:nnn
+          { \@@_point_interpolate_curve_auxi:nnnnnnnnn {#1} }
+          {#4} {#5}
+      }
+      {#2} {#3}
+  }
+\cs_new:Npn \@@_point_interpolate_curve_auxi:nnnnnnnnn #1#2#3#4#5#6#7#8#9
+  {
+    \@@_point_interpolate_curve_auxii:fnnnnnnnn
+      { \fp_eval:n {#1} }
+      {#6} {#7} {#8} {#9} {#2} {#3} {#4} {#5}
+  }
+%    \end{macrocode}
+%   At this stage, everything is fully expanded and back in the input order.
+%   The approach to finding the required point is iterative. We carry out
+%   three phases. In phase one, we need all of the input co-ordinates
+%   \begin{align*}
+%     x_{1}' &= (1 - p)x_{1} + px_{2} \\
+%     y_{1}' &= (1 - p)y_{1} + py_{2} \\
+%     x_{2}' &= (1 - p)x_{2} + px_{3} \\
+%     y_{2}' &= (1 - p)y_{2} + py_{3} \\
+%     x_{3}' &= (1 - p)x_{3} + px_{4} \\
+%     y_{3}' &= (1 - p)y_{3} + py_{4}
+%   \end{align*}
+%   In the second stage, we can drop the final point
+%   \begin{align*}
+%     x_{1}'' &= (1 - p)x_{1}' + px_{2}' \\
+%     y_{1}'' &= (1 - p)y_{1}' + py_{2}' \\
+%     x_{2}'' &= (1 - p)x_{2}' + px_{3}' \\
+%     y_{2}'' &= (1 - p)y_{2}' + py_{3}'
+%   \end{align*}
+%   and for the final stage only need one set of calculations
+%   \begin{align*}
+%     P_{x} &= (1 - p)x_{1}'' + px_{2}'' \\
+%     P_{y} &= (1 - p)y_{1}'' + py_{2}''
+%   \end{align*}
+%   Of course, this does mean a lot of calculations and expansion!
+%    \begin{macrocode}
+\cs_new:Npn \@@_point_interpolate_curve_auxii:nnnnnnnnn
+  #1#2#3#4#5#6#7#8#9
+  {
+    \@@_point_interpolate_curve_auxiii:fnnnnn
+      { \fp_eval:n { 1 - #1 } }
+      {#1}
+      { {#2} {#3} } { {#4} {#5} } { {#6} {#7} } { {#8} {#9} }
+  }
+\cs_generate_variant:Nn \@@_point_interpolate_curve_auxii:nnnnnnnnn { f }
+%    \begin{macrocode}
+%   We need to do the first cycle, but haven't got enough arguments to keep
+%   everything in play at once. So her ewe use a but of argument re-ordering
+%   and a single auxiliary to get the job done. 
+%    \begin{macrocode}
+\cs_new:Npn \@@_point_interpolate_curve_auxiii:nnnnnn #1#2#3#4#5#6
+  {
+    \@@_point_interpolate_curve_auxiv:nnnnnn {#1} {#2} #3 #4
+    \@@_point_interpolate_curve_auxiv:nnnnnn {#1} {#2} #4 #5
+    \@@_point_interpolate_curve_auxiv:nnnnnn {#1} {#2} #5 #6
+    \prg_do_nothing:
+    \@@_point_interpolate_curve_auxvi:n { {#1} {#2} }
+  }
+\cs_generate_variant:Nn \@@_point_interpolate_curve_auxiii:nnnnnn { f }
+\cs_new:Npn \@@_point_interpolate_curve_auxiv:nnnnnn #1#2#3#4#5#6
+  {
+    \@@_point_interpolate_curve_auxv:ffw
+      { \fp_eval:n { #1 * #3 + #2 * #5 } }
+      { \fp_eval:n { #1 * #4 + #2 * #6 } }
+  }
+\cs_new:Npn \@@_point_interpolate_curve_auxv:nnw
+  #1#2#3 \prg_do_nothing: #4#5
+  {
+    #3
+    \prg_do_nothing:
+    #4 { #5 {#1} {#2} }
+  }
+\cs_generate_variant:Nn \@@_point_interpolate_curve_auxv:nnw { ff }
+%    \begin{macrocode}
+%   Get the arguments back into the right places and to the second and
+%   third cycles directly.
+%    \begin{macrocode}
+\cs_new:Npn \@@_point_interpolate_curve_auxvi:n #1
+  { \@@_point_interpolate_curve_auxvii:nnnnnnnn #1 }
+\cs_new:Npn \@@_point_interpolate_curve_auxvii:nnnnnnnn #1#2#3#4#5#6#7#8
+  {
+    \@@_point_interpolate_curve_auxviii:ffffnn
+      { \fp_eval:n { #1 * #5 + #2 * #3 } }
+      { \fp_eval:n { #1 * #6 + #2 * #4 } }
+      { \fp_eval:n { #1 * #7 + #2 * #5 } }
+      { \fp_eval:n { #1 * #8 + #2 * #6 } }
+      {#1} {#2}
+  }
+\cs_new:Npn \@@_point_interpolate_curve_auxviii:nnnnnn #1#2#3#4#5#6
+  {
+    \@@_point_to_dim:n
+      { #5 * #3 + #6 * #1 , #5 * #4 + #6 * #2 }
+  }
+\cs_generate_variant:Nn \@@_point_interpolate_curve_auxviii:nnnnnn { ffff }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Vector support}
+%
+% As well as co-ordinates relative to the drawing 
+%
+% \begin{variable}
+%   {
+%     \l_@@_xvec_x_dim,
+%     \l_@@_xvec_y_dim,
+%     \l_@@_yvec_x_dim,
+%     \l_@@_yvec_y_dim,
+%     \l_@@_zvec_x_dim,
+%     \l_@@_zvec_y_dim
+%   }
+%   Base vectors to map to the underlying two-dimensional drawing space.
+%    \begin{macrocode}
+\dim_new:N \l_@@_xvec_x_dim
+\dim_new:N \l_@@_xvec_y_dim
+\dim_new:N \l_@@_yvec_x_dim
+\dim_new:N \l_@@_yvec_y_dim
+\dim_new:N \l_@@_zvec_x_dim
+\dim_new:N \l_@@_zvec_y_dim
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}{\draw_xvec:n, \draw_yvec:n, \draw_zvec:n}
+% \begin{macro}{\@@_vec:nn}
+% \begin{macro}{\@@_vec:nnn}
+%   Calculate the underlying position and store it.
+%    \begin{macrocode}
+\cs_new_protected:Npn \draw_xvec:n #1
+  { \@@_vec:nn { x } {#1} }
+\cs_new_protected:Npn \draw_yvec:n #1
+  { \@@_vec:nn { y } {#1} }
+\cs_new_protected:Npn \draw_zvec:n #1
+  { \@@_vec:nn { z } {#1} }
+\cs_new_protected:Npn \@@_vec:nn #1#2
+  {
+    \@@_point_process:nn { \@@_vec:nnn {#1} } {#2}
+  }
+\cs_new_protected:Npn \@@_vec:nnn #1#2#3
+  {
+    \dim_set:cn { l_@@_ #1 vec_x_dim } {#2}
+    \dim_set:cn { l_@@_ #1 vec_y_dim } {#3}
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% Initialise the vectors.
+%    \begin{macrocode}
+\draw_xvec:n { 1cm , 0cm }
+\draw_yvec:n { 0cm , 1cm }
+\draw_zvec:n { -0.385cm , -0.385cm }
+%    \end{macrocode}
+%
+% \begin{macro}[EXP]{\draw_point_vec:nn}
+% \begin{macro}[EXP]{\@@_point_vec:nn, \@@_point_vec:ff}
+% \begin{macro}[EXP]{\draw_point_vec:nnn}
+% \begin{macro}[EXP]{\@@_point_vec:nnn, \@@_point_vec:fff}
+%   Force a single evaluation of each factor, then use these to work out the
+%   underlying point.
+%    \begin{macrocode}
+\cs_new:Npn \draw_point_vec:nn #1#2
+  { \@@_point_vec:ff { \fp_eval:n {#1} } { \fp_eval:n {#2} } }
+\cs_new:Npn \@@_point_vec:nn #1#2
+  {
+    \@@_point_to_dim:n
+      {
+        #1 * \l_@@_xvec_x_dim + #2 * \l_@@_yvec_x_dim ,
+        #1 * \l_@@_xvec_y_dim + #2 * \l_@@_yvec_y_dim
+      }
+  }
+\cs_generate_variant:Nn \@@_point_vec:nn { ff }
+\cs_new:Npn \draw_point_vec:nnn #1#2#3
+  {
+    \@@_point_vec:fff
+      { \fp_eval:n {#1} } { \fp_eval:n {#2} } { \fp_eval:n {#3} }
+  }
+\cs_new:Npn \@@_point_vec:nnn #1#2#3
+  {
+    \@@_point_to_dim:n
+      {
+             #1 * \l_@@_xvec_x_dim
+           + #2 * \l_@@_yvec_x_dim
+           + #3 * \l_@@_zvec_x_dim
+        ,
+            #1 * \l_@@_xvec_y_dim
+          + #2 * \l_@@_yvec_y_dim
+          + #3 * \l_@@_zvec_y_dim
+    }
+  }
+\cs_generate_variant:Nn \@@_point_vec:nnn { fff }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\draw_point_vec_polar:nn}
+% \begin{macro}[EXP]{\draw_point_vec_polar:nnn}
+% \begin{macro}[EXP]{\@@_point_vec_polar:nnn, \@@_point_vec_polar:fnn}
+%   Much the same as the core polar approach.
+%    \begin{macrocode}
+\cs_new:Npn \draw_point_vec_polar:nn #1#2
+  { \draw_point_vec_polar:nnn {#1} {#2} {#2} }
+\cs_new:Npn \draw_point_vec_polar:nnn #1#2#3
+  { \@@_draw_vec_polar:fnn { \fp_eval:n {#1} } {#2} {#3} }
+\cs_new:Npn \@@_draw_vec_polar:nnn #1#2#3
+  {
+    \@@_point_to_dim:n
+      {
+        cosd(#1) * (#2) * \l_@@_xvec_x_dim ,
+        sind(#1) * (#3) * \l_@@_yvec_y_dim
+     }
+  }
+\cs_generate_variant:Nn \@@_draw_vec_polar:nnn { f }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Transformations}
+%
+% \begin{macro}[EXP]{\draw_point_transform:n}
+% \begin{macro}[EXP]{\@@_point_transform:nn}
+%   Applies a transformation matrix to a point: see \texttt{l3draw-transforms}
+%   for the business end. Where possible, we avoid the relatively expensive
+%   multiplication step.
+%    \begin{macrocode}
+\cs_new:Npn \draw_point_transform:n #1
+  {
+    \@@_point_process:nn
+      { \@@_point_transform:nn } {#1}
+  }
+\cs_new:Npn \@@_point_transform:nn #1#2
+  {
+    \bool_if:NTF \l_@@_transformcm_active_bool
+      {
+        \@@_point_to_dim:n
+          {
+            (
+                \l_@@_transformcm_aa_fp * #1
+              + \l_@@_transformcm_ba_fp * #2
+              + \l_@@_transformcm_xshift_dim
+            )
+            ,
+            (
+                \l_@@_transformcm_ab_fp * #1
+              + \l_@@_transformcm_bb_fp * #2
+              + \l_@@_transformcm_yshift_dim
+            )
+        }
+      }
+      {
+        \@@_point_to_dim:n
+          {
+              (#1, #2)
+            + ( \l_@@_transformcm_xshift_dim ,
+                \l_@@_transformcm_yshift_dim )
+          }
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\@@_point_transform_noshift:n}
+% \begin{macro}[EXP]{\@@_point_transform_noshift:nn}
+%   A version with no shift: used for internal purposes.
+%    \begin{macrocode}
+\cs_new:Npn \@@_point_transform_noshift:n #1
+  {
+    \@@_point_process:nn
+      { \@@_point_transform_noshift:nn } {#1}
+  }
+\cs_new:Npn \@@_point_transform_noshift:nn #1#2
+  {
+    \bool_if:NTF \l_@@_transformcm_active_bool
+      {
+        \@@_point_to_dim:n
+          {
+            (
+                \l_@@_transformcm_aa_fp * #1
+              + \l_@@_transformcm_ba_fp * #2
+            )
+            ,
+            (
+                \l_@@_transformcm_ab_fp * #1
+              + \l_@@_transformcm_bb_fp * #2
+            )
+        }
+      }
+      { \@@_point_to_dim:n { (#1, #2) } }
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%    \begin{macrocode}
+%</initex|package>
+%    \end{macrocode}
+%
+% \end{implementation}
+%
+% \PrintIndex


Property changes on: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx	                        (rev 0)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -0,0 +1,141 @@
+% \iffalse meta-comment
+%
+%% File: l3draw-scopes.dtx Copyright(C) 2018 The LaTeX3 Project
+%
+% It may be distributed and/or modified under the conditions of the
+% LaTeX Project Public License (LPPL), either version 1.3c of this
+% license or (at your option) any later version.  The latest version
+% of this license is in the file
+%
+%    http://www.latex-project.org/lppl.txt
+%
+% This file is part of the "l3experimental bundle" (The Work in LPPL)
+% and all files in that bundle must be distributed together.
+%
+% -----------------------------------------------------------------------
+%
+% The development version of the bundle can be found at
+%
+%    https://github.com/latex3/latex3
+%
+% for those people who are interested.
+%
+%<*driver>
+\RequirePackage{expl3}
+\documentclass[full]{l3doc}
+\begin{document}
+  \DocInput{\jobname.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \title{^^A
+%   The \pkg{l3draw} package\\ Drawing scopes^^A
+% }
+%
+% \author{^^A
+%  The \LaTeX3 Project\thanks
+%    {^^A
+%      E-mail:
+%        \href{mailto:latex-team at latex-project.org}
+%          {latex-team at latex-project.org}^^A
+%    }^^A
+% }
+%
+% \date{Released 2018/02/21}
+%
+% \maketitle
+%
+% \begin{implementation}
+%
+% \section{\pkg{l3draw-scopes} implementation}
+%
+%    \begin{macrocode}
+%<*initex|package>
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+%<@@=draw>
+%    \end{macrocode}
+%
+% \subsection{Drawing environment}
+%
+% \begin{variable}
+%   {\g_@@_xmax_dim, \g_@@_xmin_dim, \g_@@_ymax_dim, \g_@@_ymin_dim}
+%   Used to track the overall (official) size of the image created: may
+%   not actually be the natural size of the content.
+%    \begin{macrocode}
+\dim_new:N \g_@@_xmax_dim
+\dim_new:N \g_@@_xmin_dim
+\dim_new:N \g_@@_ymax_dim
+\dim_new:N \g_@@_ymin_dim
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\l_@@_update_bb_bool}
+%   Flag to indicate that a path (or similar) should update the bounding box
+%   of the drawing.
+%    \begin{macrocode}
+\bool_new:N \l_@@_update_bb_bool
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\l_@@_main_box}
+%   Box for setting the drawing.
+%    \begin{macrocode}
+\box_new:N \l_@@_main_box
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}{\draw_begin:, \draw_end:}
+%   Drawings are created by setting them into a box, then adjusting the box
+%   before inserting into the surroundings. At present the content is simply
+%   collected then dumped: work will be required to manipulate the size as
+%   this data becomes more defined. It may be that a coffin construct is
+%   better here in the longer term: that may become clearer as the code is
+%   completed. Another obvious question is whether/where vertical mode should
+%   be ended (\emph{i.e.}~should this behave like a raw |\vbox| or like
+%   a coffin). In contrast to \pkg{pgf}, we use a vertical box here: material
+%   between explicit instructions should not be present anyway. (Consider
+%   adding an |\everypar| hook as done for the \LaTeXe{} preamble.)
+%    \begin{macrocode}
+\cs_new_protected:Npn \draw_begin:
+  {
+    \vbox_set:Nw \l_@@_main_box
+      \driver_draw_begin:
+      \dim_gset:Nn \g_@@_xmax_dim { -\c_max_dim }
+      \dim_gset:Nn \g_@@_xmin_dim {  \c_max_dim }
+      \dim_gset:Nn \g_@@_ymax_dim { -\c_max_dim }
+      \dim_gset:Nn \g_@@_ymin_dim {  \c_max_dim }
+      \bool_set_true:N \l_@@_update_bb_bool
+      \draw_transform_reset:
+      \draw_linewidth:n { \l_draw_default_linewidth_dim }
+  }
+\cs_new_protected:Npn \draw_end:
+  {
+      \driver_draw_end:
+    \vbox_set_end:
+    \hbox_set:Nn \l_@@_main_box
+      {
+        \skip_horizontal:n { -\g_@@_xmin_dim }
+        \box_move_down:nn { \g_@@_ymin_dim }
+          { \box_use_drop:N \l_@@_main_box }
+      }
+    \box_set_ht:Nn \l_@@_main_box
+      { \g_@@_ymax_dim - \g_@@_ymin_dim }
+    \box_set_dp:Nn \l_@@_main_box { 0pt }
+    \box_set_wd:Nn \l_@@_main_box
+      { \g_@@_xmax_dim - \g_@@_xmin_dim }
+    \mode_leave_vertical:
+    \box_use_drop:N \l_@@_main_box
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+%    \begin{macrocode}
+%</initex|package>
+%    \end{macrocode}
+%
+% \end{implementation}
+%
+% \PrintIndex


Property changes on: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx	                        (rev 0)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -0,0 +1,323 @@
+% \iffalse meta-comment
+%
+%% File: l3draw-softpath.dtx Copyright(C) 2018 The LaTeX3 Project
+%
+% It may be distributed and/or modified under the conditions of the
+% LaTeX Project Public License (LPPL), either version 1.3c of this
+% license or (at your option) any later version.  The latest version
+% of this license is in the file
+%
+%    http://www.latex-project.org/lppl.txt
+%
+% This file is part of the "l3experimental bundle" (The Work in LPPL)
+% and all files in that bundle must be distributed together.
+%
+% -----------------------------------------------------------------------
+%
+% The development version of the bundle can be found at
+%
+%    https://github.com/latex3/latex3
+%
+% for those people who are interested.
+%
+%<*driver>
+\RequirePackage{expl3}
+\documentclass[full]{l3doc}
+\begin{document}
+  \DocInput{\jobname.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \title{^^A
+%   The \pkg{l3draw-softpath} package\\ Soft paths^^A
+% }
+%
+% \author{^^A
+%  The \LaTeX3 Project\thanks
+%    {^^A
+%      E-mail:
+%        \href{mailto:latex-team at latex-project.org}
+%          {latex-team at latex-project.org}^^A
+%    }^^A
+% }
+%
+% \date{Released 2018/02/21}
+%
+% \maketitle
+%
+% \begin{implementation}
+%
+% \section{\pkg{l3draw-softpath} implementation}
+%
+%    \begin{macrocode}
+%<*initex|package>
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+%<@@=draw>
+%    \end{macrocode}
+%
+% There are two linked aims in the code here. The most significant is to
+% provide a way to modify paths, for example to shorten the ends or round
+% the corners.  This means that the path cannot be written piecemeal as
+% specials, but rather needs to be held in macros. The second aspect that
+% follows from this is performance: simply adding to a single macro a piece
+% at a time will have poor performance as the list gets long. Paths need to
+% be global (as specials are), so we cannot use \pkg{l3tl-build} or a similar
+% approach. Instead, we use the same idea as \pkg{pgf}: use a series of buffer
+% macros such that in most cases we don't add tokens to the main list. This
+% will get slow only for \emph{enormous} paths.
+%
+% Each marker (operation) token takes two arguments, which makes processing
+% more straight-forward. As such, some operations have dummy arguments, whilst
+% others have to be split over several tokens. As the code here is at a low
+% level, all dimension arguments are assumed to be explicit and fully-expanded.
+%
+% \begin{variable}
+%   {
+%     \g_@@_softpath_main_tl     ,
+%     \g_@@_softpath_buffer_a_tl ,
+%     \g_@@_softpath_buffer_b_tl
+%   }
+%   The soft path itself.
+%    \begin{macrocode}
+\tl_new:N \g_@@_softpath_main_tl
+\tl_new:N \g_@@_softpath_buffer_a_tl
+\tl_new:N \g_@@_softpath_buffer_b_tl
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}
+%   {
+%     \g_@@_softpath_buffer_a_int ,
+%     \g_@@_softpath_buffer_b_int
+%   }
+%   Tracking data.
+%    \begin{macrocode}
+\int_new:N \g_@@_softpath_buffer_a_int
+\int_new:N \g_@@_softpath_buffer_b_int
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}{\@@_softpath_add:n, \@@_softpath_add:x}
+% \begin{macro}{\@@_softpath_concat:n}
+% \begin{macro}{\@@_softpath_reset_buffers:}
+%   The softpath itself is quite simple. We use three token lists to hold the
+%   data: two buffers of limited length, and the main list of arbitrary size.
+%   Most of the time this will mean that we don't add to the full list, so
+%   performance will be acceptable.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_softpath_add:n #1
+  {
+    \int_compare:nNnTF \g_@@_softpath_buffer_a_int < { 40 }
+      {
+        \int_gincr:N \g_@@_softpath_buffer_a_int
+        \tl_gput_right:Nn \g_@@_softpath_buffer_a_tl {#1}
+      }
+      {
+        \int_compare:nNnTF \g_@@_softpath_buffer_b_int < { 40 }
+          {
+            \int_gincr:N \g_@@_softpath_buffer_b_int
+            \tl_gset:Nx \g_@@_softpath_buffer_b_tl
+              {
+                \exp_not:V \g_@@_softpath_buffer_b_tl
+                \exp_not:V \g_@@_softpath_buffer_a_tl
+                \exp_not:n {#1}
+              }
+            \int_gzero:N \g_@@_softpath_buffer_a_int
+            \tl_gclear:N \g_@@_softpath_buffer_a_tl
+          }
+          { \@@_softpath_concat:n {#1} }
+      }
+  }
+\cs_generate_variant:Nn \@@_softpath_add:n { x }
+\cs_new_protected:Npn \@@_softpath_concat:n #1
+  {
+    \tl_gset:Nx \g_@@_softpath_main_tl
+      {
+        \exp_not:V \g_@@_softpath_main_tl
+        \exp_not:V \g_@@_softpath_buffer_b_tl
+        \exp_not:V \g_@@_softpath_buffer_a_tl
+        \exp_not:n {#1}
+      }
+    \@@_softpath_reset_buffers:
+  }
+\cs_new_protected:Npn \@@_softpath_reset_buffers:
+  {
+    \int_gzero:N \g_@@_softpath_buffer_a_int
+    \tl_gclear:N \g_@@_softpath_buffer_a_tl
+    \int_gzero:N \g_@@_softpath_buffer_b_int
+    \tl_gclear:N \g_@@_softpath_buffer_b_tl
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@@_softpath_get:N, \@@_softpath_set_eq:N}
+%   Save and restore functions.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_softpath_get:N #1
+  {
+    \@@_softpath_concat:n { }
+    \tl_set_eq:NN #1 \g_@@_softpath_main_tl
+  }
+\cs_new_protected:Npn \@@_softpath_set_eq:N #1
+  {
+    \tl_gset_eq:NN \g_@@_softpath_main_tl #1
+    \@@_softpath_reset_buffers:
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}
+%   {\@@_softpath_use:, \@@_softpath_clear:, \@@_softpath_use_clear:}
+%   Using and clearing is trivial.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_softpath_use:
+  {
+    \g_@@_softpath_main_tl
+    \g_@@_softpath_buffer_b_tl
+    \g_@@_softpath_buffer_a_tl
+  }
+\cs_new_protected:Npn \@@_softpath_clear:
+  {
+    \tl_gclear:N \g_@@_softpath_main_tl
+    \tl_gclear:N \g_@@_softpath_buffer_a_tl
+    \tl_gclear:N \g_@@_softpath_buffer_b_tl
+  }
+\cs_new_protected:Npn \@@_softpath_use_clear:
+  {
+    \@@_softpath_use:
+    \@@_softpath_clear:
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{variable}{\g_@@_softpath_lastx_dim, \g_@@_softpath_lasty_dim}
+%   For tracking the end of the path (to close it).
+%    \begin{macrocode}
+\dim_new:N \g_@@_softpath_lastx_dim
+\dim_new:N \g_@@_softpath_lasty_dim
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\g_@@_softpath_move_bool}
+%   Track if moving a point should update the close position.
+%    \begin{macrocode}
+\bool_new:N \g_@@_softpath_move_bool
+\bool_gset_true:N \g_@@_softpath_move_bool
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}{\@@_softpath_curveto:nnnnnn}
+% \begin{macro}
+%   {
+%     \@@_softpath_lineto:nn,
+%     \@@_softpath_moveto:nn
+%   }
+% \begin{macro}{\@@_softpath_rectangle:nnnn}
+% \begin{macro}{\@@_softpath_roundpoint:nn, \@@_softpath_roundpoint:VV}
+%   The various parts of a path expressed as the appropriate soft path
+%   functions.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_softpath_closepath:
+  {
+    \@@_softpath_add:x
+      {
+        \@@_softpath_close_op:nn
+          { \dim_use:N \g_@@_softpath_lastx_dim }
+          { \dim_use:N \g_@@_softpath_lasty_dim }
+      }
+  }
+\cs_new_protected:Npn \@@_softpath_curveto:nnnnnn #1#2#3#4#5#6
+  {
+    \@@_softpath_add:n
+      {
+        \@@_softpath_curveto_opi:nn {#1} {#2}
+        \@@_softpath_curveto_opii:nn {#3} {#4}
+        \@@_softpath_curveto_opiii:nn {#5} {#6}
+      }
+  }
+\cs_new_protected:Npn \@@_softpath_lineto:nn #1#2
+  {
+    \@@_softpath_add:n
+      { \@@_softpath_lineto_op:nn {#1} {#2} }
+  }
+\cs_new_protected:Npn \@@_softpath_moveto:nn #1#2
+  {
+    \@@_softpath_add:n
+      { \@@_softpath_moveto_op:nn {#1} {#2} }
+    \bool_if:NT \g_@@_softpath_move_bool
+      {
+        \dim_gset:Nn \g_@@_softpath_lastx_dim {#1}
+        \dim_gset:Nn \g_@@_softpath_lasty_dim {#2}
+      }
+  }
+\cs_new_protected:Npn \@@_softpath_rectangle:nnnn #1#2#3#4
+  {
+    \@@_softpath_add:n
+      {
+        \@@_softpath_rectangle_opi:nn {#1} {#2}
+        \@@_softpath_rectangle_opii:nn {#3} {#4}
+      }
+  }
+\cs_new_protected:Npn \@@_softpath_roundpoint:nn #1#2
+  {
+    \@@_softpath_add:n
+      { \@@_softpath_roundpoint_op:nn {#1} {#2} }
+  }
+\cs_generate_variant:Nn \@@_softpath_roundpoint:nn { VV }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}
+%   {
+%     \@@_softpath_close_op:nn      ,
+%     \@@_softpath_curveto_opi:nn   ,
+%     \@@_softpath_curveto_opii:nn  ,
+%     \@@_softpath_curveto_opiii:nn ,
+%     \@@_softpath_lineto_op:nn     ,
+%     \@@_softpath_moveto_op:nn     ,
+%     \@@_softpath_roundpoint_op:nn ,
+%     \@@_softpath_rectangle_opi:nn ,
+%     \@@_softpath_rectangle_opii:nn
+%   }
+% \begin{macro}{\@@_softpath_curveto_opi:nnNnnNnn}
+% \begin{macro}{\@@_softpath_rectangle_opi:nnNnn}
+%   The markers for operations: all the top-level ones take two arguments.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_softpath_close_op:nn #1#2
+  { \driver_draw_closepath: }
+\cs_new_protected:Npn \@@_softpath_curveto_opi:nn #1#2 
+  { \@@_softpath_curveto_opi:nnNnnNnn {#1} {#2} }
+\cs_new_protected:Npn \@@_softpath_curveto_opi:nnNnnNnn #1#2#3#4#5#6#7#8
+  { \driver_draw_curveto:nnnnnn {#1} {#2} {#4} {#5} {#7} {#8} }
+\cs_new_protected:Npn \@@_softpath_curveto_opii:nn #1#2 { }
+\cs_new_protected:Npn \@@_softpath_curveto_opiii:nn #1#2 { }
+\cs_new_protected:Npn \@@_softpath_lineto_op:nn #1#2
+  { \driver_draw_lineto:nn {#1} {#2} }
+\cs_new_protected:Npn \@@_softpath_moveto_op:nn #1#2
+  { \driver_draw_moveto:nn {#1} {#2} }
+\cs_new_protected:Npn \@@_softpath_roundpoint_op:nn #1#2 { }
+\cs_new_protected:Npn \@@_softpath_rectangle_opi:nn #1#2 
+  { \@@_softpath_rectangle_opi:nnNnn {#1} {#2} }
+\cs_new_protected:Npn \@@_softpath_rectangle_opi:nnNnn #1#2#3#4#5
+  { \driver_draw_rectangle:nnnn {#1} {#2} {#4} {#5} }
+  \cs_new_protected:Npn \@@_softpath_rectangle_opii:nn #1#2 { }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%    \begin{macrocode}
+%</initex|package>
+%    \end{macrocode}
+%
+% \end{implementation}
+%
+% \PrintIndex


Property changes on: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx	                        (rev 0)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -0,0 +1,193 @@
+% \iffalse meta-comment
+%
+%% File: l3draw-state.dtx Copyright(C) 2018 The LaTeX3 Project
+%
+% It may be distributed and/or modified under the conditions of the
+% LaTeX Project Public License (LPPL), either version 1.3c of this
+% license or (at your option) any later version.  The latest version
+% of this license is in the file
+%
+%    http://www.latex-project.org/lppl.txt
+%
+% This file is part of the "l3experimental bundle" (The Work in LPPL)
+% and all files in that bundle must be distributed together.
+%
+% -----------------------------------------------------------------------
+%
+% The development version of the bundle can be found at
+%
+%    https://github.com/latex3/latex3
+%
+% for those people who are interested.
+%
+%<*driver>
+\RequirePackage{expl3}
+\documentclass[full]{l3doc}
+\begin{document}
+  \DocInput{\jobname.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \title{^^A
+%   The \pkg{l3draw-state} package\\ Drawing graphics state^^A
+% }
+%
+% \author{^^A
+%  The \LaTeX3 Project\thanks
+%    {^^A
+%      E-mail:
+%        \href{mailto:latex-team at latex-project.org}
+%          {latex-team at latex-project.org}^^A
+%    }^^A
+% }
+%
+% \date{Released 2018/02/21}
+%
+% \maketitle
+%
+% \begin{implementation}
+%
+% \section{\pkg{l3draw-state} implementation}
+%
+%    \begin{macrocode}
+%<*initex|package>
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+%<@@=draw>
+%    \end{macrocode}
+%
+% \begin{variable}{\g_@@_linewidth_dim, \g_@@_inner_linewidth_dim}
+%   Linewidth for strokes: global as the scope for this relies on the graphics
+%   state. The inner line width is used for places where two lines are used.
+%    \begin{macrocode}
+\dim_new:N \g_@@_linewidth_dim
+\dim_new:N \g_@@_inner_linewidth_dim
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\l_draw_default_linewidth_dim}
+%   A default: this is used at the start of every drawing.
+%    \begin{macrocode}
+\dim_new:N \l_draw_default_linewidth_dim
+\dim_set:Nn \l_draw_default_linewidth_dim { 0.4pt }
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}{\draw_linewidth:n, \draw_inner_linewidth:n}
+%   Set the linewidth: we need a wrapper as this has to pass to the driver
+%   layer. The inner version is handled at the macro layer but is given a
+%   consistent interface here.
+%    \begin{macrocode}
+\cs_new_protected:Npn \draw_linewidth:n #1
+  {
+    \dim_gset:Nn \g_@@_linewidth_dim { \fp_to_dim:n {#1} }
+    \driver_draw_linewidth:n \g_@@_linewidth_dim
+  }
+\cs_new_protected:Npn \draw_inner_linewidth:n #1
+  { \dim_gset:Nn \g_@@_inner_linewidth_dim { \fp_to_dim:n {#1} }  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\draw_miterlimit:n}
+%   Pass through to the driver layer.
+%    \begin{macrocode}
+\cs_new_protected:Npn \draw_miterlimit:n #1
+  { \driver_draw_miterlimit:n { \fp_to_dim:n {#1} } }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}
+%   {
+%     \draw_cap_butt:, \draw_cap_rectangle:, \draw_cap_round:,
+%     \draw_evenodd_rule:, \draw_nonzero_rule:,
+%     \draw_join_bevel:, \draw_join_miter:, \draw_join_round:
+%   }
+%   All straight wrappers.
+%    \begin{macrocode}
+\cs_new_protected:Npn \draw_cap_butt: { \driver_draw_cap_butt: }
+\cs_new_protected:Npn \draw_cap_rectangle: { \driver_draw_cap_rectangle: }
+\cs_new_protected:Npn \draw_cap_round: { \driver_draw_cap_round: }
+\cs_new_protected:Npn \draw_evenodd_rule: { \driver_draw_evenodd_rule: }
+\cs_new_protected:Npn \draw_nonzero_rule: { \driver_draw_nonzero_rule: }
+\cs_new_protected:Npn \draw_join_bevel: { \driver_draw_join_bevel: }
+\cs_new_protected:Npn \draw_join_miter: { \driver_draw_join_miter: }
+\cs_new_protected:Npn \draw_join_round: { \driver_draw_join_round: }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{variable}{\l_@@_color_tmp_tl}
+%   Scratch space.
+%    \begin{macrocode}
+\tl_new:N \l_@@_color_tmp_tl
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\g_@@_fill_color_tl, \g_@@_stroke_color_tl}
+%   For tracking.
+%    \begin{macrocode}
+\tl_new:N \g_@@_fill_color_tl
+\tl_new:N \g_@@_stroke_color_tl
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}{\draw_color:n, \draw_color_fill:n, \draw_color_stroke:n}
+% \begin{macro}{\@@_color:nn}
+% \begin{macro}{\@@_color_aux:nn, \@@_color_aux:Vn}
+% \begin{macro}{\@@_color:nw}
+% \begin{macro}
+%   {
+%     \@@_select_cmyk:nw, \@@_select_gray:nw,
+%     \@@_select_rgb:nw, \@@_split_select:nw
+%   }
+%   Much the same as for core color support but calling the relevant
+%   driver-level function.
+%    \begin{macrocode}
+\cs_new_protected:Npn \draw_color:n #1
+  { \@@_color:nn { } {#1} }
+\cs_new_protected:Npn \draw_color_fill:n #1
+  { \@@_color:nn { fill } {#1} }
+\cs_new_protected:Npn \draw_color_stroke:n #1
+  { \@@_color:nn { stroke } {#1} }
+\cs_new_protected:Npn \@@_color:nn #1#2
+  {
+    \color_parse:nN {#2} \l_@@_color_tmp_tl
+    \tl_if_blank:nTF {#1}
+      {
+        \tl_gset_eq:NN \g_@@_fill_color_tl \l_@@_color_tmp_tl
+        \tl_gset_eq:NN \g_@@_stroke_color_tl \l_@@_color_tmp_tl
+        \@@_color_aux:Vn \l_@@_color_tmp_tl { color }
+      }
+      {
+        \tl_gset_eq:cN { g_@@_ #1 _color_tl } \l_@@_color_tmp_tl
+        \@@_color_aux:Vn \l_@@_color_tmp_tl { #1 }
+      }
+  }
+\cs_new_protected:Npn \@@_color_aux:nn #1#2
+  { \@@_color:nw {#2} #1 \q_stop }
+\cs_generate_variant:Nn \@@_color_aux:nn { V }
+\cs_new_protected:Npn \@@_color:nw #1#2 ~ #3 \q_stop
+  { \use:c { @@_color_ #2 :nw } {#1} #3 \q_stop }
+\cs_new_protected:Npn \@@_color_cmyk:nw #1#2 ~ #3 ~ #4 ~ #5 \q_stop
+  { \use:c { driver_draw_ #1 _cmyk:nnnn } {#2} {#3} {#4} {#5} }
+\cs_new_protected:Npn \@@_color_gray:nw #1#2 \q_stop
+  { \use:c { driver_draw_ #1 _gray:n } {#2} }
+\cs_new_protected:Npn \@@_color_rgb:nw #1#2 ~ #3 ~ #4 \q_stop
+  { \use:c { driver_draw_ #1 _rgb:nnn } {#2} {#3} {#4} }
+\cs_new_protected:Npn \@@_color_spot:nw #1#2 ~ #3 \q_stop
+  { \use:c { driver_draw_ #1 _spot:nn } {#2} {#3} }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%    \begin{macrocode}
+%</initex|package>
+%    \end{macrocode}
+%
+% \end{implementation}
+%
+% \PrintIndex


Property changes on: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx	                        (rev 0)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -0,0 +1,286 @@
+% \iffalse meta-comment
+%
+%% File: l3draw-transforms.dtx Copyright(C) 2018 The LaTeX3 Project
+%
+% It may be distributed and/or modified under the conditions of the
+% LaTeX Project Public License (LPPL), either version 1.3c of this
+% license or (at your option) any later version.  The latest version
+% of this license is in the file
+%
+%    http://www.latex-project.org/lppl.txt
+%
+% This file is part of the "l3experimental bundle" (The Work in LPPL)
+% and all files in that bundle must be distributed together.
+%
+% -----------------------------------------------------------------------
+%
+% The development version of the bundle can be found at
+%
+%    https://github.com/latex3/latex3
+%
+% for those people who are interested.
+%
+%<*driver>
+\RequirePackage{expl3}
+\documentclass[full]{l3doc}
+\begin{document}
+  \DocInput{\jobname.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \title{^^A
+%   The \pkg{l3draw-transforms} package\\ Transformations^^A
+% }
+%
+% \author{^^A
+%  The \LaTeX3 Project\thanks
+%    {^^A
+%      E-mail:
+%        \href{mailto:latex-team at latex-project.org}
+%          {latex-team at latex-project.org}^^A
+%    }^^A
+% }
+%
+% \date{Released 2018/02/21}
+%
+% \maketitle
+%
+% \begin{implementation}
+%
+% \section{\pkg{l3draw-transforms} implementation}
+%
+%    \begin{macrocode}
+%<*initex|package>
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+%<@@=draw>
+%    \end{macrocode}
+%
+% \begin{variable}{\l_@@_transformcm_active_bool}
+%   An internal flag to avoid redundant calculations.
+%    \begin{macrocode}
+\bool_new:N \l_@@_transformcm_active_bool
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}
+%   {
+%     \l_@@_transformcm_aa_fp, \l_@@_transformcm_ab_fp,
+%     \l_@@_transformcm_ba_fp, \l_@@_transformcm_aa_fp,
+%     \l_@@_transformcm_xshift_dim,
+%     \l_@@_transformcm_yshift_dim
+%   }
+%   The active matrix itself.
+%    \begin{macrocode}
+\fp_new:N \l_@@_transformcm_aa_fp
+\fp_new:N \l_@@_transformcm_ab_fp
+\fp_new:N \l_@@_transformcm_ba_fp
+\fp_new:N \l_@@_transformcm_bb_fp
+\dim_new:N \l_@@_transformcm_xshift_dim
+\dim_new:N \l_@@_transformcm_yshift_dim
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}{\draw_transform_reset:}
+%   Fast resetting.
+%    \begin{macrocode}
+\cs_new_protected:Npn \draw_transform_reset:
+  {
+    \fp_set:Nn \l_@@_transformcm_aa_fp { 1}
+    \fp_zero:N \l_@@_transformcm_ab_fp
+    \fp_zero:N \l_@@_transformcm_ba_fp
+    \fp_set:Nn \l_@@_transformcm_bb_fp { 1 }
+    \dim_zero:N \l_@@_transformcm_xshift_dim
+    \dim_zero:N \l_@@_transformcm_yshift_dim
+  }
+\draw_transform_reset:
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\draw_transform:nnnnn}
+% \begin{macro}{\@@_transform:nnnnnnn}
+%   Setting the transform matrix is straight-forward, with just a bit
+%   of expansion to sort out. With the mechanism active, the identity
+%   matrix is set.
+%    \begin{macrocode}
+\cs_new_protected:Npn \draw_transform:nnnnn #1#2#3#4#5
+  {
+    \@@_point_process:nn
+      { \@@_transform:nnnnnnn {#1} {#2} {#3} {#4} }
+      {#5}
+  }
+\cs_new_protected:Npn \@@_transform:nnnnnnn #1#2#3#4#5#6
+  {
+    \fp_set:Nn \l_@@_transformcm_aa_fp {#1}
+    \fp_set:Nn \l_@@_transformcm_ab_fp {#2}
+    \fp_set:Nn \l_@@_transformcm_ba_fp {#3}
+    \fp_set:Nn \l_@@_transformcm_bb_fp {#4}
+    \dim_set:Nn \l_@@_transformcm_xshift_dim {#5}
+    \dim_set:Nn \l_@@_transformcm_yshift_dim {#6}
+    \bool_lazy_all:nTF
+      {
+        { \fp_compare_p:nNn \l_@@_transformcm_aa_fp = \c_one_fp }
+        { \fp_compare_p:nNn \l_@@_transformcm_ab_fp = \c_zero_fp }
+        { \fp_compare_p:nNn \l_@@_transformcm_ba_fp = \c_zero_fp }
+        { \fp_compare_p:nNn \l_@@_transformcm_bb_fp = \c_one_fp }
+      }
+      { \bool_set_false:N \l_@@_transformcm_active_bool }
+      { \bool_set_true:N \l_@@_transformcm_active_bool }
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\draw_transform_concat:nnnnn}
+% \begin{macro}{\@@_transform_concat:nnnnnn}
+% \begin{macro}{\@@_transform_concat_aux:nnnnnn}
+%   Much the same story for adding to an existing matrix. The part that is more
+%   complex is the calculations required: everything gets passed back to
+%   \cs{@@_transform_set:nnnnnn}, with pre-expansion just in case there are
+%   \emph{e.g}~random values. The final step is \texttt{x}-type expanded as
+%   otherwise later values affect earlier ones.
+%    \begin{macrocode}
+\cs_new_protected:Npn \draw_transform_concat:nnnnn #1#2#3#4#5
+  {
+    \@@_point_process:nn
+      { \@@_transform_concat:nnnnnn {#1} {#2} {#3} {#4} }
+      {#5}
+  }
+\cs_new_protected:Npn \@@_transform_concat:nnnnnn #1#2#3#4#5#6
+  {
+    \use:x
+      {
+        \@@_transform_concat_aux:nnnnnn
+          { \fp_eval:n {#1} }
+          { \fp_eval:n {#2} }
+          { \fp_eval:n {#3} }
+          { \fp_eval:n {#4} }
+          {#5}
+          {#6}
+      }
+  }
+\cs_new_protected:Npn \@@_transform_concat_aux:nnnnnn #1#2#3#4#5#6
+  {
+    \use:x
+      {
+        \@@_transform:nnnnnnn
+          { #1 * \l_@@_transformcm_aa_fp + #2 * \l_@@_transformcm_ba_fp }
+          { #1 * \l_@@_transformcm_ab_fp + #2 * \l_@@_transformcm_bb_fp }
+          { #3 * \l_@@_transformcm_aa_fp + #4 * \l_@@_transformcm_ba_fp }
+          { #3 * \l_@@_transformcm_ab_fp + #4 * \l_@@_transformcm_bb_fp }
+          {
+            \fp_to_dim:n
+              {
+                  \l_@@_transformcm_xshift_dim
+                + \l_@@_transformcm_aa_fp * #5
+                + \l_@@_transformcm_ba_fp * #6
+              }
+          }
+          {
+            \fp_to_dim:n
+              {
+                  \l_@@_transformcm_yshift_dim
+                + \l_@@_transformcm_ab_fp * #5
+                + \l_@@_transformcm_bb_fp * #6
+              }
+          }
+        }
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\draw_transform_invert:}
+% \begin{macro}{\@@_transform_invert:n, \@@_transform_invert:f}
+%   Standard mathematics: calculate the inverse matrix and use that, then
+%   undo the shifts.
+%    \begin{macrocode}
+\cs_new_protected:Npn \draw_transform_invert:
+  {
+    \bool_if:NT \l_@@_transformcm_active_bool
+      {
+        \@@_transform_invert:f
+          {
+            \fp_eval:n
+              { 
+                1 /
+                  (
+                      \l_@@_transformcm_aa_fp * \l_@@_transformcm_bb_fp
+                    - \l_@@_transformcm_ab_fp * \l_@@_transformcm_ba_fp
+                  )
+              }
+          }
+      }
+    \dim_set:Nn \l_@@_transformcm_xshift_dim
+      {
+        \fp_to_dim:n
+          {
+            -\l_@@_transformcm_xshift_dim * \l_@@_transformcm_aa_fp
+            -\l_@@_transformcm_yshift_dim * \l_@@_transformcm_ba_fp
+          }
+      }
+    \dim_set:Nn \l_@@_transformcm_yshift_dim
+      {
+        \fp_to_dim:n
+          {
+            -\l_@@_transformcm_xshift_dim * \l_@@_transformcm_ab_fp
+            -\l_@@_transformcm_yshift_dim * \l_@@_transformcm_bb_fp
+          }
+      }
+  }
+\cs_new_protected:Npn \@@_transform_invert:n #1
+  {
+    \fp_set:Nn \l_@@_transformcm_aa_fp
+      { \l_@@_transformcm_bb_fp * #1 }
+    \fp_set:Nn \l_@@_transformcm_ab_fp
+      { -\l_@@_transformcm_ab_fp * #1 }
+    \fp_set:Nn \l_@@_transformcm_ba_fp
+      { -\l_@@_transformcm_ba_fp * #1 }
+    \fp_set:Nn \l_@@_transformcm_bb_fp
+      { \l_@@_transformcm_aa_fp * #1 }
+  }
+\cs_generate_variant:Nn \@@_transform_invert:n { f }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\draw_transform_triangle:nnn}
+%   Simple maths to move the canvas origin to |#1| and the two axes to
+%   |#2| and |#3|.
+%    \begin{macrocode}
+\cs_new_protected:Npn \draw_transform_triangle:nnn #1#2#3
+  {
+    \@@_point_process:nnn
+      {
+        \@@_point_process:nn
+          { \@@_tranform_triangle:nnnnnn }
+          {#1}
+      }
+      {#2} {#3}
+  }
+\cs_new_protected:Npn \@@_tranform_triangle:nnnnnn #1#2#3#4#5#6
+  {
+    \use:x
+      {
+        \@@_transform:nnnnnnn
+          { #3 - #1 }
+          { #4 - #2 }
+          { #5 - #1 }
+          { #6 - #2 }
+          {#1}
+          {#2}
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+%    \begin{macrocode}
+%</initex|package>
+%    \end{macrocode}
+%
+% \end{implementation}
+%
+% \PrintIndex


Property changes on: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx	                        (rev 0)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -0,0 +1,575 @@
+% \iffalse meta-comment
+%
+%% File: l3draw.dtx Copyright(C) 2018 The LaTeX3 Project
+%
+% It may be distributed and/or modified under the conditions of the
+% LaTeX Project Public License (LPPL), either version 1.3c of this
+% license or (at your option) any later version.  The latest version
+% of this license is in the file
+%
+%    http://www.latex-project.org/lppl.txt
+%
+% This file is part of the "l3experimental bundle" (The Work in LPPL)
+% and all files in that bundle must be distributed together.
+%
+% -----------------------------------------------------------------------
+%
+% The development version of the bundle can be found at
+%
+%    https://github.com/latex3/latex3
+%
+% for those people who are interested.
+%
+%<*driver|package>
+\RequirePackage{expl3}
+%</driver|package>
+%<*driver>
+\documentclass[full]{l3doc}
+\begin{document}
+  \DocInput{\jobname.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \title{^^A
+%   The \pkg{l3draw} package\\ Core drawing support^^A
+% }
+%
+% \author{^^A
+%  The \LaTeX3 Project\thanks
+%    {^^A
+%      E-mail:
+%        \href{mailto:latex-team at latex-project.org}
+%          {latex-team at latex-project.org}^^A
+%    }^^A
+% }
+%
+% \date{Released 2018/02/21}
+%
+% \maketitle
+%
+% \begin{documentation}
+%
+% \section{\pkg{l3draw} documentation}
+%
+% The \pkg{l3draw} package provides a set of tools for creating (vector)
+% drawings in \pkg{expl3}. It is heavily inspired by the \pkg{pgf} layer of
+% the Ti\textit{k}Z system, with many of the interfaces having the same form.
+% However, the code provided here is build entirely on core \pkg{expl3} ideas
+% and uses the \LaTeX3 FPU for numerical support.
+%
+% Numerical expressions in \pkg{l3draw} are handled as floating point
+% expressions, unless otherwise noted. This means that they may contain or
+% omit explicit units. Where units are omitted, they will automatically be
+% taken as given in (\TeX{}) points.
+%
+% The code here is \emph{highly} experimental.
+%
+% \subsection{Drawings}
+%
+% \begin{function}{\draw_begin:, \draw_end:}
+%   \begin{syntax}
+%     \cs{draw_begin:}
+%     ...
+%     \cs{draw_end:}
+%   \end{syntax}
+%   Each drawing should be created within a \cs{draw_begin:}/\cs{draw_end:}
+%   function pair. The \texttt{begin} function sets up a number of key
+%   data structures for the rest of the functions here: unless otherwise
+%   specified, use of |\draw_...| functions outside of this
+%   \enquote{environment} is \emph{not supported}.
+%
+%   The drawing created within the environment will be inserted into
+%   the typesetting stream by the \cs{draw_end:} function, which will
+%   switch out of vertical mode if required.
+% \end{function}
+%
+% \subsection{Graphics state}
+%
+% Within the drawing environment, a number of functions control how drawings
+% will appear. Note that these all apply \emph{globally}, though some are
+% rest at the start of each drawing (\cs{draw_begin:}).
+%
+% \begin{function}{\g_draw_linewidth_default_dim}
+%   The default value of the linewidth for stokes, set at the start
+%   of every drawing (\cs{draw_begin:}).
+% \end{function}
+%
+% \begin{function}{\draw_linewidth:n, \draw_inner_linewidth:n}
+%   \begin{syntax}
+%     \cs{draw_linewidth:n} \Arg{width}
+%   \end{syntax}
+%   Sets the width to be used for stroking to the \meta{width} (an 
+%   \meta{fp expr}).
+% \end{function}
+%
+% \begin{function}{\draw_nonzero_rule:, \draw_evenodd_rule:}
+%   \begin{syntax}
+%     \cs{draw_nonzero_rule:}
+%   \end{syntax}
+%   Active either the non-zero winding number or the even-odd rule,
+%   respectively, for determining what is inside a fill or clip area.
+%   For technical reasons, these command are not influenced by scoping
+%   and apply on an ongoing basis.
+% \end{function}
+%
+% \begin{function}
+%   {
+%     \draw_cap_butt:      ,
+%     \draw_cap_rectangle: ,
+%     \draw_cap_round:
+%   }
+%   \begin{syntax}
+%     \cs{draw_cap_butt:}
+%   \end{syntax}
+%   Sets the style of terminal stroke position to one of butt, rectangle or
+%   round.
+% \end{function}
+%
+% \begin{function}
+%   {
+%     \draw_join_bevel: ,
+%     \draw_join_miter: ,
+%     \draw_join_round:
+%   }
+%   \begin{syntax}
+%     \cs{draw_cap_butt:}
+%   \end{syntax}
+%   Sets the style of stroke joins to one of bevel, miter or round.
+% \end{function}
+%
+% \begin{function}{\draw_miterlimit:n}
+%   \begin{syntax}
+%     \cs{draw_miterlimit:n} \Arg{limit}
+%   \end{syntax}
+%   Sets the miter \meta{limit} of lines joined as a miter, as described in the
+%   PDF and PostScript manuals. The \meta{limit} is an \meta{fp expr}.
+% \end{function}
+%
+% \subsection{Points}
+%
+% Functions supporting the calculation of points (co-ordinates) are expandable
+% and may be used outside of the drawing environment. When used in this
+% way, they all yield a co-ordinate tuple, for example
+% \begin{verbatim}
+%   \tl_set:Nx \l_tmpa_tl { \draw_point:nn { 1 } { 2 } }
+%   \tl_show:N \l_tmpa_tl
+% \end{verbatim}
+% gives
+% \begin{verbatim}
+%   > \l_tmpa_tl=1pt,2pt.
+%   <recently read> }
+% \end{verbatim}
+%
+% This output form is then suitable as \emph{input} for subsequent point
+% calculations, \emph{i.e.}~where a \meta{point} is required it may be
+% given as a tuple. This \emph{may} include units and surrounding
+% parentheses, for example
+% \begin{verbatim}
+%   1,2
+%   (1,2)
+%   1cm,3pt
+%   (1pt,2cm)
+%   2 * sind(30), 2^4in
+% \end{verbatim}
+% are all valid input forms. Notice that each part of the tuple may itself
+% be a float point expression.
+%
+% Point co-ordinates are relative to the canvas axes, but can be transformed
+% by \cs{draw_point_transform:n}. These manipulation is applied by many
+% higher-level functions, for example path construction, and allows parts of
+% a drawing to be rotated, scaled or skewed. This occurs before writing any
+% data to the driver, and so such manipulations are tracked by the drawing
+% mechanisms. See \cs{driver_draw_transformcm:nnnnnn} for driver-level
+% manipulation of the canvas axes themselves.
+%
+% Notice that in contrast to \pkg{pgf} it is possible to give the positions
+% of points \emph{directly}.
+%
+% \subsubsection{Basic point functions}
+%
+% \begin{function}[EXP]{\draw_point:nn}
+%   \begin{syntax}
+%     \cs{draw_point:nn} \Arg{x} \Arg{y}
+%   \end{syntax}
+%   Gives the co-ordinates of the point at \meta{x} and \meta{y}, both of
+%   which are \meta{fp expr}.
+% \end{function}
+%
+% \begin{function}[EXP]{\draw_point_polar:nn, \draw_point_polar:nnn}
+%   \begin{syntax}
+%     \cs{draw_point_polar:nn} \Arg{angle} \Arg{radius}
+%     \cs{draw_point_polar:nnn} \Arg{angle} \Arg{radius-a} \Arg{radius-b}
+%   \end{syntax}
+%   Gives the co-ordinates of the point at \meta{angle} (an \meta{fp expr} in
+%   \emph{degrees}) and \meta{radius}. The three-argument version accepts
+%   two radii of different lengths.
+%   
+%   Note the interface here is somewhat different from that in \pkg{pgf}:
+%   the one- and two-radii versions in \pkg{l3draw} use separate functions,
+%   whilst in \pkg{pgf} they use the same function and a keyword.
+% \end{function}
+%
+% \begin{function}[EXP]{\draw_point_add:nn}
+%   \begin{syntax}
+%     \cs{draw_point_add:nn} \Arg{point1} \Arg{point2}
+%   \end{syntax}
+%   Adds \meta{point1} to \meta{point2}.
+% \end{function}
+%
+% \begin{function}[EXP]{\draw_point_diff:nn}
+%   \begin{syntax}
+%     \cs{draw_point_diff:nn} \Arg{point1} \Arg{point2}
+%   \end{syntax}
+%   Subtracts \meta{point1} from \meta{point2}.
+% \end{function}
+%
+% \begin{function}[EXP]{\draw_point_scale:nn}
+%   \begin{syntax}
+%     \cs{draw_point_scale:nn} \Arg{scale} \Arg{point}
+%   \end{syntax}
+%   Scales the \meta{point} by the \meta{scale} (an \meta{fp expr}).
+% \end{function}
+%
+% \begin{function}[EXP]{\draw_point_unit_vector:n}
+%   \begin{syntax}
+%     \cs{draw_point_unit_vector:n} \Arg{point}
+%   \end{syntax}
+%   Expands to the co-ordinates of a unit vector joining the \meta{point}
+%   with the origin.
+% \end{function}
+%
+% \begin{function}[EXP]{\draw_point_transform:n}
+%   \begin{syntax}
+%     \cs{draw_point_transform:n} \Arg{point}
+%   \end{syntax}
+%   Evaluates the position of the \meta{point} subject to the current
+%   transformation matrix. This operation is applied automatically by
+%   most higher-level functions (\emph{e.g.}~path manipulations).
+% \end{function}
+%
+% \subsubsection{Points on a vector basis}
+%
+% As well as giving explicit values, it is possible to describe points
+% in terms of underlying direction vectors. The latter are initially
+% co-incident with the standard Cartesian axes, but may be altered by
+% the user.
+%
+% \begin{function}{\draw_xvec_set:n, \draw_yvec_set:n, \draw_zvec_set:n}
+%   \begin{syntax}
+%     \cs{draw_xvec_set:n} \Arg{point}
+%   \end{syntax}
+%   Defines the appropriate base vector to point toward the \meta{point}
+%   on the canvas. The standard settings for the $x$- and $y$-vectors are
+%   $1\,\mathrm{cm}$ along the relevant canvas axis, whilst for the
+%   $z$-vector an appropriate direction is taken.
+% \end{function}
+%
+% \begin{function}[EXP]{\draw_point_vec:nn, \draw_point_vec:nnn}
+%   \begin{syntax}
+%     \cs{draw_point_vec:nn} \Arg{xscale} \Arg{yscale}
+%     \cs{draw_point_vec:nnn} \Arg{xscale} \Arg{yscale} \Arg{zscale}
+%   \end{syntax}
+%   Expands to the co-ordinate of the point at \meta{xscale} times the
+%   $x$-vector and \meta{yscale} times the $y$-vector. The three-argument
+%   version extends this to include the $z$-vector.
+% \end{function}
+%
+% \begin{function}[EXP]{\draw_point_vec_polar:nn, \draw_point_vec_polar:nnn}
+%   \begin{syntax}
+%     \cs{draw_point_vec_polar:nn} \Arg{angle} \Arg{radius}
+%     \cs{draw_point_vec_polar:nnn} \Arg{angle} \Arg{radius-a} \Arg{radius-b}
+%   \end{syntax}
+%   Gives the co-ordinates of the point at \meta{angle} (an \meta{fp expr} in
+%   \emph{degrees}) and \meta{radius}, relative to the prevailing
+%   $x$- and $y$-vectors. The three-argument version accepts two radii of
+%   different lengths.
+%   
+%   Note the interface here is somewhat different from that in \pkg{pgf}:
+%   the one- and two-radii versions in \pkg{l3draw} use separate functions,
+%   whilst in \pkg{pgf} they use the same function and a keyword.
+% \end{function}
+%
+% \subsubsection{Intersections}
+%
+% \begin{function}[EXP]{\draw_point_intersect_lines:nnnn}
+%   \begin{syntax}
+%     \cs{draw_point_intersect_lines:nnnn} \Arg{point1} \Arg{point2} \Arg{point3} \Arg{point4}
+%   \end{syntax}
+%   Evaluates the point at the intersection of one line, joining
+%   \meta{point1} and \meta{point2}, and a second line joining \meta{point3}
+%   and \meta{point4}. If the lines do not intersect, or are coincident, and
+%   error will occur.
+% \end{function}
+%
+% \begin{function}[EXP]{\draw_point_intersect_circles:nnnn}
+%   \begin{syntax}
+%     \cs{draw_point_intersect_circles:nnnnn}
+%       \Arg{center1} \Arg{radius1} \Arg{center2} \Arg{radius2} \Arg{root}
+%   \end{syntax}
+%   Evaluates the point at the intersection of one circle with
+%   \meta{center1} and \meta{radius1}, and a second circle with \meta{center2}
+%   and \meta{radius2}. If the circles do not intersect, or are coincident, and
+%   error will occur.
+%
+%   Note the interface here has a different argument ordering from that in
+%   \pkg{pgf}, which has the two centers then the two radii.
+% \end{function}
+%
+% \subsubsection{Interpolations}
+%
+% \begin{function}[EXP]{\draw_point_interpolate_line:nnn}
+%   \begin{syntax}
+%     \cs{draw_point_interpolate_line:nnn} \Arg{part} \Arg{point1} \Arg{point2}
+%   \end{syntax}
+%   Expands to the point which is \meta{part} way along the line joining
+%   \meta{point1} and \meta{point2}. The \meta{part} may be an interpolation or
+%   an extrapolation, and is a floating point value expressing a percentage
+%   along the line, \emph{e.g.}~a value of \texttt{0.5} would be half-way
+%   between the two points.
+% \end{function}
+%
+% \begin{function}[EXP]{\draw_point_interpolate_distance:nnn}
+%   \begin{syntax}
+%     \cs{draw_point_interpolate_distance:nnn} \Arg{distance} \Arg{point expr1} \Arg{point expr2}
+%   \end{syntax}
+%   Expands to the point which is \meta{distance} way along the line joining
+%   \meta{point1} and \meta{point2}. The \meta{distance} may be an interpolation
+%   or an extrapolation.
+% \end{function}
+%
+% \begin{function}[EXP]{\draw_point_interpolate_curve:nnnnnn}
+%   \begin{syntax}
+%     \cs{draw_point_interpolate_curve:nnnnnn} \Arg{part}
+%       \Arg{start} \Arg{control1} \Arg{control2} \Arg{end}
+%   \end{syntax}
+%   Expands to the point which is \meta{part} way along the curve between
+%   \meta{start} and \meta{end} and defined by \meta{control1} and
+%   \meta{control2}. The \meta{part} may be an interpolation or
+%   an extrapolation, and is a floating point value expressing a percentage
+%   along the curve, \emph{e.g.}~a value of \texttt{0.5} would be half-way
+%   along the curve.
+% \end{function}
+%
+% \subsection{Paths}
+%
+% Paths are constructed by combining one or more operations before applying
+% one or more actions. Thus until a path is \enquote{used}, it may be
+% manipulated or indeed discarded entirely. Only one path is active at
+% any one time, and the path is \emph{not} affected by \TeX{} grouping.
+%
+% \begin{function}{\draw_path_corner_arc:n}
+%   \begin{syntax}
+%     \cs{draw_path_corner_arc:n} \Arg{length}
+%   \end{syntax}
+%   Sets the degree of rounding applied to corners in a path: if the
+%   \meta{length} is \texttt{0pt} then no rounding applies. The value of the
+%   \meta{length} is local to the current \TeX{} group. \emph{At present,
+%   corner arcs are not activated in the code.}
+% \end{function}
+%
+% \begin{function}{\draw_path_moveto:n}
+%   \begin{syntax}
+%     \cs{draw_path_moveto:n} \Arg{point}
+%   \end{syntax}
+%   Moves the reference point of the path to the \meta{point}, but will
+%   not join this to any previous point.
+% \end{function}
+%
+% \begin{function}{\draw_path_lineto:n}
+%   \begin{syntax}
+%     \cs{draw_path_lineto:n} \Arg{point}
+%   \end{syntax}
+%   Joins the current path to the \meta{point} with a straight line.
+% \end{function}
+%
+% \begin{function}{\draw_path_curveto:nnn}
+%   \begin{syntax}
+%     \cs{draw_path_curveto:nnn} \Arg{control1} \Arg{control2} \Arg{end}
+%   \end{syntax}
+%   Joins the current path to the \meta{end} with a curved line defined by
+%   cubic Bézier points \meta{control1} and \meta{control2}.
+% \end{function}
+%
+% \begin{function}{\draw_path_curveto:nn}
+%   \begin{syntax}
+%     \cs{draw_path_curveto:nn} \Arg{control} \Arg{end}
+%   \end{syntax}
+%   Joins the current path to the \meta{end} with a curved line defined by
+%   quadratic Bézier point \meta{control}.
+% \end{function}
+%
+% \begin{function}{\draw_path_arc:nnn, \draw_path_arc:nnnn}
+%   \begin{syntax}
+%     \cs{draw_path_arc:nnn} \Arg{angle1} \Arg{angle2} \Arg{radius}
+%     \cs{draw_path_arc:nnnn} \Arg{angle1} \Arg{angle2} \Arg{radius-a} \Arg{radius-b}
+%   \end{syntax}
+%   Joins the current path with an arc between \meta{angle1} and \meta{angle2}
+%   and of \meta{radius}. The four-argument version accepts two radii of
+%   different lengths.
+%
+%   Note the interface here has a different argument ordering from that in
+%   \pkg{pgf}, which has the two centers then the two radii.
+% \end{function}
+%
+% \begin{function}{\draw_path_arc_axes:nnnn}
+%   \begin{syntax}
+%     \cs{draw_path_arc_axes:nnn} \Arg{angle1} \Arg{angle2} \Arg{vector1} \Arg{vector2}
+%   \end{syntax}
+%   Appends the portion of an ellipse from \meta{angle1} to \meta{angle2} of an
+%   ellipse with axes along \meta{vector1} and \meta{vector2} to the current path. 
+% \end{function}
+%
+% \begin{function}{\draw_path_ellipse:nnnn}
+%   \begin{syntax}
+%     \cs{draw_path_ellipse:nnn} \Arg{center} \Arg{vector1} \Arg{vector2}
+%   \end{syntax}
+%   Appends an ellipse at \meta{center} with axes along \meta{vector1} and
+%   \meta{vector2} to the current path. 
+% \end{function}
+%
+% \begin{function}{\draw_path_circle:nn}
+%   \begin{syntax}
+%     \cs{draw_path_circle:nn} \Arg{center} \Arg{radius}
+%   \end{syntax}
+%   Appends a circle of \meta{radius} at \meta{center} to the current path. 
+% \end{function}
+%
+% \begin{function}{\draw_path_rectangle:nn, \draw_path_rectangle_corners:nn}
+%   \begin{syntax}
+%     \cs{draw_path_rectangle:nn} \Arg{lower-left} \Arg{displacement}
+%     \cs{draw_path_rectangle_corners:nn} \Arg{lower-left} \Arg{top-right}
+%   \end{syntax}
+%   Appends a rectangle starting at \meta{lower-left} to the current path,
+%   with the size of the rectangle determined either by a \meta{displacement}
+%   or the position of the \meta{top-right}.
+% \end{function}
+%
+% \begin{function}{\draw_path_grid:nnnn}
+%   \begin{syntax}
+%     \cs{draw_path_grid:nnnn} \Arg{xspace} \Arg{yspace} \Arg{lower-left} \Arg{upper-right}
+%   \end{syntax}
+%   Constructs a grid of \meta{xspace} and \meta{yspace} from the
+%   \meta{lower-left} to the \meta{upper-right}, and appends this to the
+%   current path.
+% \end{function}
+%
+% \begin{function}{\draw_path_close:}
+%   \begin{syntax}
+%     \cs{draw_path_close:}
+%   \end{syntax}
+%   Closes the current part of the path by appending a straight line from
+%   the current point to the starting point of the path.
+% \end{function}
+%
+% \begin{function}{\draw_path_use:n, \draw_path_use_clear:n}
+%   \begin{syntax}
+%     \cs{draw_path_use:n} \Arg{action(s)}
+%   \end{syntax}
+%   Inserts the current path, carrying out one ore more possible \meta{actions}
+%   (a comma list):
+%   \begin{itemize}
+%     \item \texttt{clear} Resets the path to empty
+%     \item \texttt{clip} Clips any content outside of the path
+%     \item \texttt{draw}
+%     \item \texttt{fill} Fills the interior of the path with the current
+%       file color
+%     \item \texttt{stroke} Draws a line along the current path
+%   \end{itemize}
+% \end{function}
+%
+% \subsection{Color}
+%
+% \begin{function}{\draw_color:n, \draw_fill:n, \draw_stroke:n}
+%   \begin{syntax}
+%     \cs{draw_color:n} \Arg{color expression}
+%   \end{syntax}
+%   Evaluates the \meta{color expression} as described for \pkg{l3color}.
+% \end{function}
+%
+% \subsection{Transformations}
+%
+% Points are normally used unchanged relative to the canvas axes. This can
+% be modified by applying a transformation matrix. The canvas axes themselves
+% may be adjusted using \cs{driver_draw_transformcm:nnnnnn}: note that this
+% is transparent to the drawing code so is not tracked.
+%
+% \begin{function}{\draw_transform_reset:}
+%   \begin{syntax}
+%     \cs{draw_transform_reset:}
+%   \end{syntax}
+%   Resets the matrix to the identity.
+% \end{function}
+%
+% \begin{function}{\draw_transform_concat:nnnnn}
+%   \begin{syntax}
+%     \cs{draw_transform_concat:nnnnn}
+%       \Arg{a} \Arg{b} \Arg{c} \Arg{d} \Arg{vector}
+%   \end{syntax}
+%   Appends the given transformation to the currently-active one. The
+%   transformation is made up of a matrix \meta{a}, \meta{b}, \meta{c} and
+%   \meta{d}, and a shift by the \meta{vector}.
+% \end{function}
+%
+% \begin{function}{\draw_transform:nnnnn}
+%   \begin{syntax}
+%     \cs{draw_transform:nnnnn}
+%       \Arg{a} \Arg{b} \Arg{c} \Arg{d} \Arg{vector}
+%   \end{syntax}
+%   Applies the transformation matrix specified, over-writing any existing
+%   matrix. The transformation is made up of a matrix \meta{a}, \meta{b},
+%   \meta{c} and \meta{d}, and a shift by the \meta{vector}.
+% \end{function}
+%
+% \begin{function}{\draw_transform_triangle:nnn}
+%   \begin{syntax}
+%     \cs{draw_transform_triangle:nnn}
+%       \Arg{origin} \Arg{point1} \Arg{point2}
+%   \end{syntax}
+%   Applies a transformation such that the co-ordinates $(0, 0)$, $(1, 0)$
+%   and $(0, 1)$ are given by the \meta{origin}, \meta{point1} and
+%   \meta{point2}, respectively.
+% \end{function}
+%
+% \begin{function}{\draw_transform_invert:}
+%   \begin{syntax}
+%     \cs{draw_transform_invert:}
+%   \end{syntax}
+%   Inverts the current transformation matrix and reverses the current
+%   shift vector.
+% \end{function}
+%
+% \end{documentation}
+%
+% \begin{implementation}
+%
+% \section{\pkg{l3draw} implementation}
+%
+%    \begin{macrocode}
+%<*initex|package>
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+%<@@=draw>
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+%<*package>
+\ProvidesExplPackage{l3draw}{2018/02/21}{}
+  {L3 Experimental core drawing support}
+%</package>
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\RequirePackage { l3color }
+%    \end{macrocode}
+%
+% Everything else is in the sub-files!
+%
+%    \begin{macrocode}
+%</initex|package>
+%    \end{macrocode}
+%
+% \end{implementation}
+%
+% \PrintIndex


Property changes on: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.ins
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.ins	                        (rev 0)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.ins	2018-02-23 21:54:14 UTC (rev 46720)
@@ -0,0 +1,66 @@
+\iffalse meta-comment
+
+File l3draw.ins Copyright (C) 2018 The LaTeX3 Project
+
+It may be distributed and/or modified under the conditions of the
+LaTeX Project Public License (LPPL), either version 1.3c of this
+license or (at your option) any later version.  The latest version
+of this license is in the file
+
+   http://www.latex-project.org/lppl.txt
+
+This file is part of the "l3experimental bundle" (The Work in LPPL)
+and all files in that bundle must be distributed together.
+
+-----------------------------------------------------------------------
+
+The development version of the bundle can be found at
+
+   https://github.com/latex3/latex3
+
+for those people who are interested.
+
+-----------------------------------------------------------------------
+
+Any modification of this file should ensure that the copyright and
+license information is placed in the derived files.
+
+\fi
+
+\input l3docstrip.tex
+\askforoverwritefalse
+
+\preamble
+
+Copyright (C) 2018 The LaTeX3 Project
+
+It may be distributed and/or modified under the conditions of
+the LaTeX Project Public License (LPPL), either version 1.3c of
+this license or (at your option) any later version.  The latest
+version of this license is in the file:
+
+   http://www.latex-project.org/lppl.txt
+
+This file is part of the "l3experimental bundle" (The Work in LPPL)
+and all files in that bundle must be distributed together.
+
+\endpreamble
+% stop docstrip adding \endinput
+\postamble
+\endpostamble
+
+\keepsilent
+
+\generate{\file{l3draw.sty}
+  {
+    \from{l3draw.dtx}            {package}
+    \from{l3draw-paths.dtx}      {package}
+    \from{l3draw-points.dtx}     {package}
+    \from{l3draw-scopes.dtx}     {package}
+    \from{l3draw-softpath.dtx}   {package}
+    \from{l3draw-state.dtx}      {package}
+    \from{l3draw-transforms.dtx} {package}
+  }
+}
+
+\endbatchfile

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-convert.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-convert.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-convert.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -47,7 +47,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %
@@ -252,7 +252,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{l3str-convert}{2017/12/16}{}
+\ProvidesExplPackage{l3str-convert}{2018/02/21}{}
   {L3 Experimental string encoding conversions}
 %    \end{macrocode}
 %
@@ -617,7 +617,7 @@
 \cs_new_protected:Npn \@@_if_flag_error:nnx #1
   {
     \flag_if_raised:nTF {#1}
-      { \__msg_kernel_error:nnx { str } }
+      { \__kernel_msg_error:nnx { str } }
       { \use_none:nn }
   }
 \cs_new_protected:Npn \@@_if_flag_no_error:nnx #1#2#3
@@ -761,7 +761,7 @@
   {
     \if_meaning:w #1 #5
       \tl_if_empty:nF {#3}
-        { \__msg_kernel_error:nnx { str } { native-escaping } {#3} }
+        { \__kernel_msg_error:nnx { str } { native-escaping } {#3} }
       #1
     \else:
       #4 #2 #1
@@ -833,7 +833,7 @@
               }
               {
                 \tl_clear:N \l_@@_internal_tl
-                \__msg_kernel_error:nnxx { str } { unknown-#2 } {#4} {#1}
+                \__kernel_msg_error:nnxx { str } { unknown-#2 } {#4} {#1}
               }
           }
         \cs_if_exist:cF { @@_convert_#3_#1: }
@@ -1073,7 +1073,7 @@
             \@@_output_byte:n {#1}
           \fi:
         }
-      \__msg_kernel_new:nnnn { str } { pdfTeX-native-overflow }
+      \__kernel_msg_new:nnnn { str } { pdfTeX-native-overflow }
         { Character~code~too~large~for~pdfTeX. }
         {
           The~pdfTeX~engine~only~supports~8-bit~characters:~
@@ -1303,11 +1303,11 @@
 % General messages, and messages for the encodings and escapings loaded
 % by default (\enquote{native}, and \enquote{bytes}).
 %    \begin{macrocode}
-\__msg_kernel_new:nnn { str } { unknown-esc }
+\__kernel_msg_new:nnn { str } { unknown-esc }
   { Escaping~scheme~'#1'~(filtered:~'#2')~unknown. }
-\__msg_kernel_new:nnn { str } { unknown-enc }
+\__kernel_msg_new:nnn { str } { unknown-enc }
   { Encoding~scheme~'#1'~(filtered:~'#2')~unknown. }
-\__msg_kernel_new:nnnn { str } { native-escaping }
+\__kernel_msg_new:nnnn { str } { native-escaping }
   { The~'native'~encoding~scheme~does~not~support~any~escaping. }
   {
     Since~native~strings~do~not~consist~in~bytes,~
@@ -1314,7 +1314,7 @@
     none~of~the~escaping~methods~make~sense.~
     The~specified~escaping,~'#1',~will be ignored.
   }
-\__msg_kernel_new:nnn { str } { file-not-found }
+\__kernel_msg_new:nnn { str } { file-not-found }
   { File~'l3str-#1.def'~not~found. }
 %    \end{macrocode}
 %
@@ -1330,7 +1330,7 @@
     \sys_if_engine_xetex_p:
   }
   {
-    \__msg_kernel_new:nnnn { str } { non-byte }
+    \__kernel_msg_new:nnnn { str } { non-byte }
       { String~invalid~in~escaping~'#1':~it~may~only~contain~bytes. }
       {
         Some~characters~in~the~string~you~asked~to~convert~are~not~
@@ -1348,13 +1348,13 @@
 %
 % Those messages are used when converting to and from 8-bit encodings.
 %    \begin{macrocode}
-\__msg_kernel_new:nnnn { str } { decode-8-bit }
+\__kernel_msg_new:nnnn { str } { decode-8-bit }
   { Invalid~string~in~encoding~'#1'. }
   {
     LaTeX~came~across~a~byte~which~is~not~defined~to~represent~
     any~character~in~the~encoding~'#1'.
   }
-\__msg_kernel_new:nnnn { str } { encode-8-bit }
+\__kernel_msg_new:nnnn { str } { encode-8-bit }
   { Unicode~string~cannot~be~converted~to~encoding~'#1'. }
   {
     The~encoding~'#1'~only~contains~a~subset~of~all~Unicode~characters.~
@@ -1435,7 +1435,7 @@
         \@@_unescape_hex_auxii:N
       }
   }
-\__msg_kernel_new:nnnn { str } { unescape-hex }
+\__kernel_msg_new:nnnn { str } { unescape-hex }
   { String~invalid~in~escaping~'hex':~only~hexadecimal~digits~allowed. }
   {
     Some~characters~in~the~string~you~asked~to~convert~are~not~
@@ -1512,7 +1512,7 @@
         \@@_output_end:
         \use_i:nnn #3 ##2##3
       }
-    \__msg_kernel_new:nnnn { str } { unescape-#2 }
+    \__kernel_msg_new:nnnn { str } { unescape-#2 }
       { String~invalid~in~escaping~'#2'. }
       {
         LaTeX~came~across~the~escape~character~'#1'~not~followed~by~
@@ -1641,7 +1641,7 @@
       \if_charcode:w ^^J #2 \else: ^^J \fi:
       \@@_unescape_string_newlines:wN #2
     }
-  \__msg_kernel_new:nnnn { str } { unescape-string }
+  \__kernel_msg_new:nnnn { str } { unescape-string }
     { String~invalid~in~escaping~'string'. }
     {
       LaTeX~came~across~an~escape~character~'\c_backslash_str'~
@@ -1920,7 +1920,7 @@
 \flag_clear_new:n { str_extra }
 \flag_clear_new:n { str_overlong }
 \flag_clear_new:n { str_overflow }
-\__msg_kernel_new:nnnn { str } { utf8-decode }
+\__kernel_msg_new:nnnn { str } { utf8-decode }
   {
     Invalid~UTF-8~string: \exp_last_unbraced:Nf \use_none:n
     \@@_if_flag_times:nT { str_missing }  { ,~missing~continuation~byte }
@@ -2237,7 +2237,7 @@
   \flag_clear_new:n { str_missing }
   \flag_clear_new:n { str_extra }
   \flag_clear_new:n { str_end }
-  \__msg_kernel_new:nnnn { str } { utf16-encode }
+  \__kernel_msg_new:nnnn { str } { utf16-encode }
     { Unicode~string~cannot~be~expressed~in~UTF-16:~surrogate. }
     {
       Surrogate~code~points~(in~the~range~[U+D800,~U+DFFF])~
@@ -2244,7 +2244,7 @@
       can~be~expressed~in~the~UTF-8~and~UTF-32~encodings,~
       but~not~in~the~UTF-16~encoding.
     }
-  \__msg_kernel_new:nnnn { str } { utf16-decode }
+  \__kernel_msg_new:nnnn { str } { utf16-decode }
     {
       Invalid~UTF-16~string: \exp_last_unbraced:Nf \use_none:n
       \@@_if_flag_times:nT { str_missing }  { ,~missing~trail~surrogate }
@@ -2536,7 +2536,7 @@
 %    \begin{macrocode}
   \flag_clear_new:n { str_overflow }
   \flag_clear_new:n { str_end }
-  \__msg_kernel_new:nnnn { str } { utf32-decode }
+  \__kernel_msg_new:nnnn { str } { utf32-decode }
     {
       Invalid~UTF-32~string: \exp_last_unbraced:Nf \use_none:n
       \@@_if_flag_times:nT { str_overflow } { ,~code~point~too~large }

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -47,7 +47,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %
@@ -163,7 +163,7 @@
 %
 %    \begin{macrocode}
 %<*package>
-\ProvidesExplPackage{l3str-format}{2017/12/16}{}
+\ProvidesExplPackage{l3str-format}{2018/02/21}{}
   {L3 Experimental string formatting}
 %</package>
 %    \end{macrocode}
@@ -304,7 +304,7 @@
 \cs_new:Npn \@@_parse_end:nwn #1 #2 \s__stop \s__stop #3
   {
     \tl_if_empty:nF {#2}
-      { \__msg_kernel_expandable_error:nnn { str } { invalid-format } {#3} }
+      { \__kernel_msg_expandable_error:nnn { str } { invalid-format } {#3} }
     #1
   }
 %    \end{macrocode}
@@ -464,7 +464,7 @@
   {
     \token_if_eq_charcode:NNTF #2 =
       {
-        \__msg_kernel_expandable_error:nnnn
+        \__kernel_msg_expandable_error:nnnn
           { str } { invalid-align-format } {#2} {tl}
         \@@_put:nw { #1 < }
       }
@@ -475,7 +475,7 @@
       }
     \token_if_eq_charcode:NNF #3 ?
       {
-        \__msg_kernel_expandable_error:nnnn
+        \__kernel_msg_expandable_error:nnnn
           { str } { invalid-sign-format } {#3} {tl}
       }
     \@@_put:nw { {#4} }
@@ -486,7 +486,7 @@
       {
         \token_if_eq_charcode:NNF #6 ?
           {
-            \__msg_kernel_expandable_error:nnnn
+            \__kernel_msg_expandable_error:nnnn
               { str } { invalid-style-format } {#6} {tl}
           }
       }
@@ -640,7 +640,7 @@
     \@@_put:nw { {#4} }
     \tl_if_empty:nF {#5}
       {
-        \__msg_kernel_expandable_error:nnnn
+        \__kernel_msg_expandable_error:nnnn
           { str } { invalid-precision-format } {#5} {int}
       }
     \str_case:nnF {#6}
@@ -652,7 +652,7 @@
         { X } { \@@_int:NwnnNNn \int_to_Hex:n }
       }
       {
-        \__msg_kernel_expandable_error:nnnn
+        \__kernel_msg_expandable_error:nnnn
           { str } { invalid-style-format } {#6} { int }
         \@@_int:NwnnNNn \use:n
       }
@@ -762,7 +762,7 @@
         { ? } { \@@_fp:wnnnNNw \@@_fp_g:wn }
       }
       {
-        \__msg_kernel_expandable_error:nnnn
+        \__kernel_msg_expandable_error:nnnn
           { str } { invalid-style-format } {#6} { fp }
         \@@_fp:wnnnNNw \@@_fp_g:wn
       }
@@ -927,15 +927,15 @@
 % All of the messages are produced expandably, so there is no need for
 % an extra-text.
 %    \begin{macrocode}
-\__msg_kernel_new:nnn { str } { invalid-format }
+\__kernel_msg_new:nnn { str } { invalid-format }
   { Invalid~format~'#1'. }
-\__msg_kernel_new:nnn { str } { invalid-align-format }
+\__kernel_msg_new:nnn { str } { invalid-align-format }
   { Invalid~alignment~'#1'~for~type~'#2'. }
-\__msg_kernel_new:nnn { str } { invalid-sign-format }
+\__kernel_msg_new:nnn { str } { invalid-sign-format }
   { Invalid~sign~'#1'~for~type~'#2'. }
-\__msg_kernel_new:nnn { str } { invalid-precision-format }
+\__kernel_msg_new:nnn { str } { invalid-precision-format }
   { Invalid~precision~'#1'~for~type~'#2'. }
-\__msg_kernel_new:nnn { str } { invalid-style-format }
+\__kernel_msg_new:nnn { str } { invalid-style-format }
   { Invalid~style~'#1'~for~type~'#2'. }
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -54,7 +54,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %
@@ -673,7 +673,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xcoffins}{2017/12/16}{}
+\ProvidesExplPackage{xcoffins}{2018/02/21}{}
   {L3 Experimental design level coffins}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -24,8 +24,8 @@
 %<*driver|package>
 % The version of expl3 required is tested as early as possible, as
 % some really old versions do not define \ProvidesExplPackage.
-\RequirePackage{expl3}[2017/12/16]
-%<package>\@ifpackagelater{expl3}{2017/12/16}
+\RequirePackage{expl3}[2018/02/21]
+%<package>\@ifpackagelater{expl3}{2018/02/21}
 %<package>  {}
 %<package>  {%
 %<package>    \PackageError{l3galley}{Support package l3kernel too old}
@@ -59,7 +59,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %
@@ -685,7 +685,7 @@
 %
 %    \begin{macrocode}
 %<*package>
-\ProvidesExplPackage{l3galley}{2017/12/16}{}
+\ProvidesExplPackage{l3galley}{2018/02/21}{}
   {L3 Experimental galley code}
 %</package>
 %    \end{macrocode}
@@ -2157,7 +2157,7 @@
 \cs_new_protected:Npn \galley_break_line:Nn #1#2
   {
     \mode_if_vertical:TF
-      { \__msg_kernel_error:nn { galley } { no-line-to-end } }
+      { \__kernel_msg_error:nn { galley } { no-line-to-end } }
       {
         \tex_unskip:D
         \bool_if:NF #1
@@ -2490,7 +2490,7 @@
 % \subsection{Messages}
 %
 %    \begin{macrocode}
-\__msg_kernel_new:nnn { galley } { no-line-to-end }
+\__kernel_msg_new:nnn { galley } { no-line-to-end }
   { There's~no~line~here~to~end. }
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -45,7 +45,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %
@@ -732,7 +732,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xgalley}{2017/12/16}{}
+\ProvidesExplPackage{xgalley}{2018/02/21}{}
   {L3 Experimental galley}
 \RequirePackage{xparse,xtemplate,l3galley}
 %    \end{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -21,7 +21,7 @@
 % for those people who are interested.
 %
 %<*driver|generic|package>
-\def\ExplFileDate{2017/12/16}%
+\def\ExplFileDate{2018/02/21}%
 %</driver|generic|package>
 %<*driver>
 \documentclass[full]{l3doc}
@@ -49,7 +49,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %
@@ -1297,7 +1297,7 @@
 %   foo}). The checks on driver choice are set up here, so when actually
 %   the driver it's a straight forward operation.
 %    \begin{macrocode}
-\__msg_kernel_new:nnnn { expl } { wrong-driver }
+\__kernel_msg_new:nnnn { expl } { wrong-driver }
   { Driver~request~inconsistent~with~engine:~using~'#2'~driver. }
   {
     You~have~requested~driver~'#1',~but~this~is~not~suitable~for~use~with~the~
@@ -1331,7 +1331,7 @@
         \tl_set:Nn \l__expl_driver_tl { dvipdfmx }
         \sys_if_engine_xetex:TF
           {
-            \__msg_kernel_error:nnnn { expl } { wrong-driver }
+            \__kernel_msg_error:nnnn { expl } { wrong-driver }
               { dvipdfmx } { xdvipdfmx }
             \tl_set:Nn \l__expl_driver_tl { xdvipdfmx }
           }
@@ -1338,7 +1338,7 @@
           {
             \sys_if_output_pdf:T
               {
-                \__msg_kernel_error:nnnn { expl } { wrong-driver }
+                \__kernel_msg_error:nnnn { expl } { wrong-driver }
                   { dvipdfmx } { pdfmode }
                 \tl_set:Nn \l__expl_driver_tl { pdfmode }
               }
@@ -1349,7 +1349,7 @@
         \tl_set:Nn \l__expl_driver_tl { dvips }
         \sys_if_engine_xetex:TF
           {
-            \__msg_kernel_error:nnnn { expl } { wrong-driver }
+            \__kernel_msg_error:nnnn { expl } { wrong-driver }
               { dvips } { xdvipdfmx }
             \tl_set:Nn \l__expl_driver_tl { xdvipdfmx }
           }
@@ -1356,7 +1356,7 @@
           {
             \sys_if_output_pdf:T
               {
-                \__msg_kernel_error:nnnn { expl } { wrong-driver }
+                \__kernel_msg_error:nnnn { expl } { wrong-driver }
                   { dvips } { pdfmode }
                 \tl_set:Nn \l__expl_driver_tl { pdfmode }
               }
@@ -1367,7 +1367,7 @@
         \tl_set:Nn \l__expl_driver_tl { dvisvgm }
         \sys_if_engine_xetex:TF
           {
-            \__msg_kernel_error:nnnn { expl } { wrong-driver }
+            \__kernel_msg_error:nnnn { expl } { wrong-driver }
               { dvips } { xdvipdfmx }
             \tl_set:Nn \l__expl_driver_tl { xdvipdfmx }
           }
@@ -1374,7 +1374,7 @@
           {
             \sys_if_output_pdf:T
               {
-                \__msg_kernel_error:nnnn { expl } { wrong-driver }
+                \__kernel_msg_error:nnnn { expl } { wrong-driver }
                   { dvips } { pdfmode }
                 \tl_set:Nn \l__expl_driver_tl { pdfmode }
               }
@@ -1387,7 +1387,7 @@
         \tl_set:Nn \l__expl_driver_tl { pdfmode }
         \sys_if_engine_xetex:TF
           {
-            \__msg_kernel_error:nnnn { expl } { wrong-driver }
+            \__kernel_msg_error:nnnn { expl } { wrong-driver }
               { pdfmode } { xdvipdfmx }
             \tl_set:Nn \l__expl_driver_tl { xdvipdfmx }
           }
@@ -1394,7 +1394,7 @@
           {
             \sys_if_output_pdf:F
               {
-                \__msg_kernel_error:nnnn { expl } { wrong-driver }
+                \__kernel_msg_error:nnnn { expl } { wrong-driver }
                   { pdfmode } { dvips }
                 \tl_set:Nn \l__expl_driver_tl { dvips }
               }
@@ -1407,12 +1407,12 @@
           {
             \sys_if_output_pdf:TF
               {
-                \__msg_kernel_error:nnnn { expl } { wrong-driver }
+                \__kernel_msg_error:nnnn { expl } { wrong-driver }
                   { xdvipdfmx } { pdfmode }
                 \tl_set:Nn \l__expl_driver_tl { pdfmode }
               }
               {
-                \__msg_kernel_error:nnnn { expl } { wrong-driver }
+                \__kernel_msg_error:nnnn { expl } { wrong-driver }
                   { xdvipdfmx } { dvips }
                 \tl_set:Nn \l__expl_driver_tl { dvips }
               }
@@ -1454,7 +1454,7 @@
 \str_if_eq:VnTF \l__expl_driver_tl { latex2e }
   {
     \tl_gput_left:Nn \@begindocumenthook { \RequirePackage { graphics } }
-    \__msg_kernel_new:nnnn { box } { clipping-not-available }
+    \__kernel_msg_new:nnnn { box } { clipping-not-available }
       { Box~clipping~not~available. }
       {
         The~\box_clip:N~function~is~only~available~when~loading~expl3~
@@ -1463,7 +1463,7 @@
     \cs_set_protected:Npn \box_clip:N #1
       {
         \hbox_set:Nn #1 { \box_use:N #1 }
-        \__msg_kernel_error:nn { box } { clipping-not-available }
+        \__kernel_msg_error:nn { box } { clipping-not-available }
       }
     \cs_set_protected:Npn \box_rotate:Nn #1#2
       { \hbox_set:Nn #1 { \rotatebox {#2} { \box_use:N #1 } } }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3.ins
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3.ins	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3.ins	2018-02-23 21:54:14 UTC (rev 46720)
@@ -1,6 +1,6 @@
 \iffalse meta-comment
 
-File l3.ins Copyright (C) 2011,2012,2014-2017 The LaTeX3 Project
+File l3.ins Copyright (C) 2011,2012,2014-2018 The LaTeX3 Project
 
 It may be distributed and/or modified under the conditions of the
 LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -33,7 +33,7 @@
 
 \preamble
 
-Copyright (C) 1990-2017 The LaTeX3 Project
+Copyright (C) 1990-2018 The LaTeX3 Project
 
 It may be distributed and/or modified under the conditions of
 the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -83,6 +83,7 @@
         \from{l3fp-traps.dtx}   {package}
         \from{l3fp-round.dtx}   {package}
         \from{l3fp-parse.dtx}   {package}
+        \from{l3fp-assign.dtx}  {package}
         \from{l3fp-logic.dtx}   {package}
         \from{l3fp-basics.dtx}  {package}
         \from{l3fp-extended.dtx}{package}
@@ -90,7 +91,6 @@
         \from{l3fp-trig.dtx}    {package}
         \from{l3fp-convert.dtx} {package}
         \from{l3fp-random.dtx}  {package}
-        \from{l3fp-assign.dtx}  {package}
         \from{l3sort.dtx}       {package}
         \from{l3tl-build.dtx}   {package}
         \from{l3tl-analysis.dtx}{package}
@@ -97,7 +97,7 @@
         \from{l3regex.dtx}      {package}
         \from{l3box.dtx}        {package}
         \from{l3coffins.dtx}    {package}
-        \from{l3color.dtx}      {package}
+        \from{l3color-base.dtx} {package}
         \from{l3sys.dtx}        {package}
         \from{l3deprecation.dtx}{package}
         \from{l3candidates.dtx} {package}
@@ -131,7 +131,6 @@
 \generate{\file{l3candidates.sty} {\from{l3oldmodules.dtx}       {l3candidates,oldmodules}}}
 \generate{\file{l3clist.sty}      {\from{l3oldmodules.dtx}       {l3clist,oldmodules}}}
 \generate{\file{l3coffins.sty}    {\from{l3oldmodules.dtx}       {l3coffins,oldmodules}}}
-\generate{\file{l3color.sty}      {\from{l3oldmodules.dtx}       {l3color,oldmodules}}}
 \generate{\file{l3expan.sty}      {\from{l3oldmodules.dtx}       {l3expan,oldmodules}}}
 \generate{\file{l3file.sty}       {\from{l3oldmodules.dtx}       {l3file,oldmodules}}}
 \generate{\file{l3fp.sty}         {\from{l3oldmodules.dtx}       {l3fp,oldmodules}}}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %
@@ -175,7 +175,7 @@
             \int_use:c { g_@@_ #1 _int }
           }
       }
-      { \__msg_kernel_fatal:nnx { kernel } { out-of-registers } {#1} }
+      { \__kernel_msg_fatal:nnx { kernel } { out-of-registers } {#1} }
   }
 %    \end{macrocode}
 % \end{macro}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -1,6 +1,6 @@
 % \iffalse meta-comment
 %
-%% File: l3basics.dtx Copyright (C) 1990-2017 The LaTeX3 project
+%% File: l3basics.dtx Copyright (C) 1990-2018 The LaTeX3 project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %
@@ -737,6 +737,7 @@
 %     \cs{cs_if_exist_use:NTF} \meta{control sequence} \Arg{true code} \Arg{false code}
 %   \end{syntax}
 %   Tests whether the \meta{control sequence} is currently defined
+%   according to the conditional \cs{cs_if_exist:NTF}
 %   (whether as a function or another control sequence type), and if it
 %   is inserts the  \meta{control sequence} into the input stream followed
 %   by the \meta{true code}.  Otherwise the \meta{false code} is used.
@@ -1051,8 +1052,8 @@
 %   \end{syntax}
 %   Tests whether the \meta{control sequence} is currently defined
 %   (whether as a function or another control sequence type). Any
-%   valid definition of \meta{control sequence} evaluates as
-%   \texttt{true}.
+%   definition of \meta{control sequence} other than \tn{relax}
+%   evaluates as \texttt{true}.
 % \end{function}
 %
 % \begin{function}[EXP,pTF]{\cs_if_free:N, \cs_if_free:c}
@@ -1212,9 +1213,9 @@
 %   normally (spaces, characters with category other).
 % \end{function}
 %
-% \begin{function}{\__debug:TF}
+% \begin{function}{\__kernel_debug:TF}
 %   \begin{syntax}
-%     \cs{__debug:TF} \Arg{true code} \Arg{false code}
+%     \cs{__kernel_debug:TF} \Arg{true code} \Arg{false code}
 %   \end{syntax}
 %   Runs the \meta{true code} if debugging is enabled, namely only in
 %   \LaTeXe{} package mode with one of the options
@@ -1224,9 +1225,9 @@
 %   conditional.
 % \end{function}
 %
-% \begin{function}{\__debug_chk_cs_exist:N, \__debug_chk_cs_exist:c}
+% \begin{function}{\__kernel_chk_cs_exist:N, \__kernel_chk_cs_exist:c}
 %   \begin{syntax}
-%     \cs{__debug_chk_cs_exist:N} \meta{cs}
+%     \cs{__kernel_chk_cs_exist:N} \meta{cs}
 %   \end{syntax}
 %   This function is only created if debugging is enabled.  It checks
 %   that \meta{cs} exists according to the criteria for
@@ -1233,9 +1234,9 @@
 %   \cs{cs_if_exist_p:N}, and if not raises a kernel-level error.
 % \end{function}
 %
-% \begin{function}{\__debug_chk_expr:nNnN}
+% \begin{function}{\__kernel_chk_expr:nNnN}
 %   \begin{syntax}
-%     \cs{__debug_chk_expr:nNnN} \Arg{expr} \meta{eval} \Arg{convert} \meta{caller}
+%     \cs{__kernel_chk_expr:nNnN} \Arg{expr} \meta{eval} \Arg{convert} \meta{caller}
 %   \end{syntax}
 %   This function is only created if debugging is enabled.  By default
 %   it is equivalent to \cs{use_i:nnnn}.  When expression checking is
@@ -1250,9 +1251,9 @@
 %   purposes.
 % \end{function}
 %
-% \begin{function}{\__debug_chk_var_exist:N}
+% \begin{function}{\__kernel_chk_var_exist:N}
 %   \begin{syntax}
-%     \cs{__debug_chk_var_exist:N} \meta{var}
+%     \cs{__kernel_chk_var_exist:N} \meta{var}
 %   \end{syntax}
 %   This function is only created if debugging is enabled.  It checks
 %   that \meta{var} is defined according to the criteria for
@@ -1259,9 +1260,9 @@
 %   \cs{cs_if_exist_p:N}, and if not raises a kernel-level error.
 % \end{function}
 %
-% \begin{function}{\__debug_chk_var_scope:NN}
+% \begin{function}{\__kernel_chk_var_scope:NN}
 %   \begin{syntax}
-%     \cs{__debug_chk_var_scope:NN} \meta{scope} \meta{var}
+%     \cs{__kernel_chk_var_scope:NN} \meta{scope} \meta{var}
 %   \end{syntax}
 %   Checks the \meta{var} has the correct \meta{scope}, and if not
 %   raises a kernel-level error.  This function is only created if
@@ -1276,19 +1277,19 @@
 %   different scopes a kernel error will result.
 % \end{function}
 %
-% \begin{function}{\__debug_chk_var_local:N, \__debug_chk_var_global:N}
+% \begin{function}{\__kernel_chk_var_local:N, \__kernel_chk_var_global:N}
 %   \begin{syntax}
-%     \cs{__debug_chk_var_local:N} \meta{var}
-%     \cs{__debug_chk_var_global:N} \meta{var}
+%     \cs{__kernel_chk_var_local:N} \meta{var}
+%     \cs{__kernel_chk_var_global:N} \meta{var}
 %   \end{syntax}
-%   Applies \cs{__debug_chk_var_exist:N} \meta{var}, then
-%   \cs{__debug_chk_var_scope:NN} \meta{scope} \meta{var}, where
+%   Applies \cs{__kernel_chk_var_exist:N} \meta{var}, then
+%   \cs{__kernel_chk_var_scope:NN} \meta{scope} \meta{var}, where
 %   \meta{scope} is |l| or~|g|.
 % \end{function}
 %
-% \begin{function}{\__debug_log:x}
+% \begin{function}{\__kernel_debug_log:x}
 %   \begin{syntax}
-%     \cs{__debug_log:x} \Arg{message text}
+%     \cs{__kernel_debug_log:x} \Arg{message text}
 %   \end{syntax}
 %   If the \texttt{log-functions} option is active, this function writes
 %   the \meta{message text} to the log file using \cs{iow_log:x}.
@@ -1296,9 +1297,9 @@
 %   This function is only created if debugging is enabled.
 % \end{function}
 %
-% \begin{function}{\__debug_patch:nnNNpn}
+% \begin{function}{\__kernel_patch:nnNNpn}
 %   \begin{syntax}
-%     \cs{__debug_patch:nnNNpn} \Arg{before} \Arg{after}
+%     \cs{__kernel_patch:nnNNpn} \Arg{before} \Arg{after}
 %     \meta{definition} \meta{function} \meta{parameters} \Arg{code}
 %   \end{syntax}
 %   If debugging is not enabled, this function ignores the \meta{before}
@@ -1311,12 +1312,12 @@
 %   needed.
 % \end{function}
 %
-% \begin{function}{\__debug_patch_conditional:nNNpnn}
+% \begin{function}{\__kernel_patch_conditional:nNNpnn}
 %   \begin{syntax}
-%     \cs{__debug_patch_conditional:nNNpnn} \Arg{before}
+%     \cs{__kernel_patch_conditional:nNNpnn} \Arg{before}
 %     \meta{definition} \meta{conditional} \meta{parameters} \Arg{type} \Arg{code}
 %   \end{syntax}
-%   Similar to \cs{__debug_patch:nnNNpn} for conditionals, namely
+%   Similar to \cs{__kernel_patch:nnNNpn} for conditionals, namely
 %   \meta{definition} must be \cs{prg_new_conditional:Npnn} or its
 %   \texttt{_protected} counterpart.  There is no \meta{after} code
 %   because that would interfere with the action of the conditional.
@@ -1323,12 +1324,12 @@
 % \end{function}
 %
 % \begin{function}
-%   {\__debug_patch_args:nNNpn, \__debug_patch_conditional_args:nNNpnn}
+%   {\__kernel_patch_args:nNNpn, \__kernel_patch_conditional_args:nNNpnn}
 %   \begin{syntax}
-%     \cs{__debug_patch_args:nNNpn} \Arg{arguments}
+%     \cs{__kernel_patch_args:nNNpn} \Arg{arguments}
 %     \meta{definition} \meta{function} \meta{parameters} \Arg{code}
 %   \end{syntax}
-%   Like \cs{__debug_patch:nnNNpn}, this tweaks the following
+%   Like \cs{__kernel_patch:nnNNpn}, this tweaks the following
 %   definition, but from the \enquote{inside out} (and if debugging is
 %   not enabled, the \meta{arguments} are ignored).  It replaces |#1|,
 %   |#2| and so on in the \meta{code} of the definition as indicated by
@@ -1338,25 +1339,25 @@
 %   front of the \meta{arguments} is used instead of the \meta{code}
 %   when defining the actual function.  For instance,
 %   \begin{quote}
-%     \cs{__debug_patch_args:nNNpn} |{ { (#1) } }| \\
+%     \cs{__kernel_patch_args:nNNpn} |{ { (#1) } }| \\
 %     \cs{cs_new:Npn} \cs{int_eval:n} |#1| \\
 %     ~~|{ \__int_value:w \__int_eval:w #1 \__int_eval_end: }|
 %   \end{quote}
 %   would replace |#1| by |(#1)| in the definition of \cs{int_eval:n} when
 %   debugging is enabled.  This fails if the \meta{code} contains~|##|.
-%   The \cs{__debug_patch_conditional_args:nNNpnn} function is for use
+%   The \cs{__kernel_patch_conditional_args:nNNpnn} function is for use
 %   before \cs{prg_new_conditional:Npnn} or its \texttt{_protected}
 %   counterpart.
 % \end{function}
 %
 % \begin{function}
-%   {\__debug_patch_args:nnnNNpn, \__debug_patch_conditional_args:nnnNNpnn}
+%   {\__kernel_patch_args:nnnNNpn, \__kernel_patch_conditional_args:nnnNNpnn}
 %   \begin{syntax}
-%     \cs{__debug_patch_args:nnnNNpn} \Arg{before} \Arg{after} \Arg{arguments}
+%     \cs{__kernel_patch_args:nnnNNpn} \Arg{before} \Arg{after} \Arg{arguments}
 %     \meta{definition} \meta{function} \meta{parameters} \Arg{code}
 %   \end{syntax}
-%   A combination of \cs{__debug_patch:nnNNpn} and
-%   \cs{__debug_patch_args:nNNpn}.
+%   A combination of \cs{__kernel_patch:nnNNpn} and
+%   \cs{__kernel_patch_args:nNNpn}.
 % \end{function}
 %
 % \begin{function}{\__kernel_check_defined:NT}
@@ -1781,7 +1782,7 @@
 %<@@=debug>
 %    \end{macrocode}
 %
-% \begin{macro}{\@@:TF}
+% \begin{macro}{\__kernel_debug:TF}
 %   A more meaningful test of whether debugging is enabled than messing
 %   up with guards.  We can also more easily change the logic in one
 %   place then.  At present, debugging is disabled in the format and in
@@ -1789,10 +1790,10 @@
 %   options \texttt{enable-debug}, \texttt{log-functions} or
 %   \texttt{check-declarations} was given.
 %    \begin{macrocode}
-\cs_set_protected:Npn \@@:TF #1#2 {#2}
+\cs_set_protected:Npn \__kernel_debug:TF #1#2 {#2}
 %<*package>
 \tex_ifodd:D \l at expl@enable at debug@bool
-  \cs_set_protected:Npn \@@:TF #1#2 {#1}
+  \cs_set_protected:Npn \__kernel_debug:TF #1#2 {#1}
 \fi:
 %</package>
 %    \end{macrocode}
@@ -1801,14 +1802,14 @@
 % \begin{macro}{\debug_on:n, \debug_off:n}
 %   
 %    \begin{macrocode}
-\@@:TF
+\__kernel_debug:TF
   {
     \cs_set_protected:Npn \debug_on:n #1
       {
         \exp_args:No \clist_map_inline:nn { \tl_to_str:n {#1} }
           {
-            \cs_if_exist_use:cF { @@_##1_on: }
-              { \__msg_kernel_error:nnn { kernel } { debug } {##1} }
+            \cs_if_exist_use:cF { __debug_##1_on: }
+              { \__kernel_msg_error:nnn { kernel } { debug } {##1} }
           }
       }
     \cs_set_protected:Npn \debug_off:n #1
@@ -1815,8 +1816,8 @@
       {
         \exp_args:No \clist_map_inline:nn { \tl_to_str:n {#1} }
           {
-            \cs_if_exist_use:cF { @@_##1_off: }
-              { \__msg_kernel_error:nnn { kernel } { debug } {##1} }
+            \cs_if_exist_use:cF { __debug_##1_off: }
+              { \__kernel_msg_error:nnn { kernel } { debug } {##1} }
           }
       }
   }
@@ -1823,12 +1824,12 @@
   {
     \cs_set_protected:Npn \debug_on:n #1
       {
-        \__msg_kernel_error:nnx { kernel } { enable-debug }
+        \__kernel_msg_error:nnx { kernel } { enable-debug }
           { \tl_to_str:n { \debug_on:n {#1} } }
       }
     \cs_set_protected:Npn \debug_off:n #1
       {
-        \__msg_kernel_error:nnx { kernel } { enable-debug }
+        \__kernel_msg_error:nnx { kernel } { enable-debug }
           { \tl_to_str:n { \debug_off:n {#1} } }
       }
   }
@@ -1836,32 +1837,32 @@
 % \end{macro}
 %
 % \begin{macro}{\debug_suspend:, \debug_resume:}
-% \begin{macro}{\@@_suspended:T}
-% \begin{macro}{\l_@@_suspended_tl}
+% \begin{macro}{\__debug_suspended:T}
+% \begin{macro}{\l__debug_suspended_tl}
 %   Suspend and resume locally all debug-related errors and logging
 %   except deprecation errors.  The \cs{debug_suspend:} and \cs{debug_resume:}
 %   pairs can be nested.  We keep track of nesting in a token list
 %   containing a number of periods.  At first begin with the
-%   \enquote{non-suspended} version of \cs{@@_suspended:T}.
+%   \enquote{non-suspended} version of \cs{__debug_suspended:T}.
 %    \begin{macrocode}
-\@@:TF
+\__kernel_debug:TF
   {
-    \cs_set_nopar:Npn \l_@@_suspended_tl { }
+    \cs_set_nopar:Npn \l__debug_suspended_tl { }
     \cs_set_protected:Npn \debug_suspend:
       {
-        \tl_put_right:Nn \l_@@_suspended_tl { . }
-        \cs_set_eq:NN \@@_suspended:T \use:n
+        \tl_put_right:Nn \l__debug_suspended_tl { . }
+        \cs_set_eq:NN \__debug_suspended:T \use:n
       }
     \cs_set_protected:Npn \debug_resume:
       {
-        \tl_set:Nx \l_@@_suspended_tl
-          { \tl_tail:N \l_@@_suspended_tl }
-        \tl_if_empty:NT \l_@@_suspended_tl
+        \tl_set:Nx \l__debug_suspended_tl
+          { \tl_tail:N \l__debug_suspended_tl }
+        \tl_if_empty:NT \l__debug_suspended_tl
           {
-            \cs_set_eq:NN \@@_suspended:T \use_none:n
+            \cs_set_eq:NN \__debug_suspended:T \use_none:n
           }
       }
-    \cs_set:Npn \@@_suspended:T #1 { }
+    \cs_set:Npn \__debug_suspended:T #1 { }
   }
   {
     \cs_set_protected:Npn \debug_suspend: { }
@@ -1873,76 +1874,76 @@
 % \end{macro}
 %
 % \begin{macro}
-%   {\@@_check-declarations_on:, \@@_check-declarations_off:}
-% \begin{macro}{\@@_chk_var_exist:N}
-% \begin{macro}{\@@_chk_cs_exist:N, \@@_chk_cs_exist:c}
-% \begin{macro}{\@@_chk_var_local:N, \@@_chk_var_global:N}
-% \begin{macro}{\@@_chk_var_scope:NN}
+%   {\__debug_check-declarations_on:, \__debug_check-declarations_off:}
+% \begin{macro}{\__kernel_chk_var_exist:N}
+% \begin{macro}{\__kernel_chk_cs_exist:N, \__kernel_chk_cs_exist:c}
+% \begin{macro}{\__kernel_chk_var_local:N, \__kernel_chk_var_global:N}
+% \begin{macro}{\__kernel_chk_var_scope:NN}
 %   When debugging is enabled these two functions set up functions that
 %   test their argument (when \texttt{check-declarations} is active)
 %   \begin{itemize}
-%     \item \cs{@@_chk_var_exist:N} and \cs{@@_chk_cs_exist:N}, two
+%     \item \cs{__kernel_chk_var_exist:N} and \cs{__kernel_chk_cs_exist:N}, two
 %       functions that test that their argument is defined;
-%     \item \cs{@@_chk_var_scope:NN} that checks that its argument |#2|
+%     \item \cs{__kernel_chk_var_scope:NN} that checks that its argument |#2|
 %       has scope |#1|.
-%     \item \cs{@@_chk_var_local:N} and \cs{@@_chk_var_global:N} that
+%     \item \cs{__kernel_chk_var_local:N} and \cs{__kernel_chk_var_global:N} that
 %       perform both checks.
 %   \end{itemize}
 %    \begin{macrocode}
-\@@:TF
+\__kernel_debug:TF
   {
-    \exp_args:Nc \cs_set_protected:Npn { @@_check-declarations_on: }
+    \exp_args:Nc \cs_set_protected:Npn { __debug_check-declarations_on: }
       {
-        \cs_set_protected:Npn \@@_chk_var_exist:N ##1
+        \cs_set_protected:Npn \__kernel_chk_var_exist:N ##1
           {
-            \@@_suspended:T \use_none:nnn
+            \__debug_suspended:T \use_none:nnn
             \cs_if_exist:NF ##1
               {
-                \__msg_kernel_error:nnx { kernel } { non-declared-variable }
+                \__kernel_msg_error:nnx { kernel } { non-declared-variable }
                   { \token_to_str:N ##1 }
               }
           }
-        \cs_set_protected:Npn \@@_chk_cs_exist:N ##1
+        \cs_set_protected:Npn \__kernel_chk_cs_exist:N ##1
           {
-            \@@_suspended:T \use_none:nnn
+            \__debug_suspended:T \use_none:nnn
             \cs_if_exist:NF ##1
               {
-                \__msg_kernel_error:nnx { kernel } { command-not-defined }
+                \__kernel_msg_error:nnx { kernel } { command-not-defined }
                   { \token_to_str:N ##1 }
               }
           }
-        \cs_set_protected:Npn \@@_chk_var_scope:NN
+        \cs_set_protected:Npn \__kernel_chk_var_scope:NN
           {
-            \@@_suspended:T \use_none:nnn
-            \@@_chk_var_scope_aux:NN
+            \__debug_suspended:T \use_none:nnn
+            \__debug_chk_var_scope_aux:NN
           }
-        \cs_set_protected:Npn \@@_chk_var_local:N ##1
+        \cs_set_protected:Npn \__kernel_chk_var_local:N ##1
           {
-            \@@_suspended:T \use_none:nnnnn
-            \@@_chk_var_exist:N ##1
-            \@@_chk_var_scope_aux:NN l ##1
+            \__debug_suspended:T \use_none:nnnnn
+            \__kernel_chk_var_exist:N ##1
+            \__debug_chk_var_scope_aux:NN l ##1
           }
-        \cs_set_protected:Npn \@@_chk_var_global:N ##1
+        \cs_set_protected:Npn \__kernel_chk_var_global:N ##1
           {
-            \@@_suspended:T \use_none:nnnnn
-            \@@_chk_var_exist:N ##1
-            \@@_chk_var_scope_aux:NN g ##1
+            \__debug_suspended:T \use_none:nnnnn
+            \__kernel_chk_var_exist:N ##1
+            \__debug_chk_var_scope_aux:NN g ##1
           }
       }
-    \exp_args:Nc \cs_set_protected:Npn { @@_check-declarations_off: }
+    \exp_args:Nc \cs_set_protected:Npn { __debug_check-declarations_off: }
       {
-        \cs_set_protected:Npn \@@_chk_var_exist:N ##1 { }
-        \cs_set_protected:Npn \@@_chk_cs_exist:N ##1 { }
-        \cs_set_protected:Npn \@@_chk_var_local:N ##1 { }
-        \cs_set_protected:Npn \@@_chk_var_global:N ##1 { }
-        \cs_set_protected:Npn \@@_chk_var_scope:NN ##1##2 { }
+        \cs_set_protected:Npn \__kernel_chk_var_exist:N ##1 { }
+        \cs_set_protected:Npn \__kernel_chk_cs_exist:N ##1 { }
+        \cs_set_protected:Npn \__kernel_chk_var_local:N ##1 { }
+        \cs_set_protected:Npn \__kernel_chk_var_global:N ##1 { }
+        \cs_set_protected:Npn \__kernel_chk_var_scope:NN ##1##2 { }
       }
-    \cs_set_protected:Npn \@@_chk_cs_exist:c
-      { \exp_args:Nc \@@_chk_cs_exist:N }
+    \cs_set_protected:Npn \__kernel_chk_cs_exist:c
+      { \exp_args:Nc \__kernel_chk_cs_exist:N }
     \tex_ifodd:D \l at expl@check at declarations@bool
-      \use:c { @@_check-declarations_on: }
+      \use:c { __debug_check-declarations_on: }
     \else:
-      \use:c { @@_check-declarations_off: }
+      \use:c { __debug_check-declarations_off: }
     \fi:
   }
   { }
@@ -1953,13 +1954,13 @@
 % \end{macro}
 % \end{macro}
 %
-% \begin{macro}{\@@_chk_var_scope_aux:NN}
-% \begin{macro}{\@@_chk_var_scope_aux:Nn}
-% \begin{macro}{\@@_chk_var_scope_aux:NNn}
+% \begin{macro}{\__debug_chk_var_scope_aux:NN}
+% \begin{macro}{\__debug_chk_var_scope_aux:Nn}
+% \begin{macro}{\__debug_chk_var_scope_aux:NNn}
 %   First check whether the name of the variable |#2| starts with
 %   \meta{letter}|_|.  If it does then pass that letter, the
 %   \meta{scope}, and the variable name to
-%   \cs{@@_chk_var_scope_aux:NNn}.  That function compares the two
+%   \cs{__debug_chk_var_scope_aux:NNn}.  That function compares the two
 %   letters and triggers an error if they differ (the \cs{scan_stop:}
 %   case is not reachable here).  If the second character was not |_|
 %   then pass the same data to the same auxiliary, except for its first
@@ -1969,23 +1970,23 @@
 %   letter \meta{scope} according to what the first assignment to the
 %   given variable was.
 %    \begin{macrocode}
-\@@:TF
+\__kernel_debug:TF
   {
-    \cs_set_protected:Npn \@@_chk_var_scope_aux:NN #1#2
-      { \exp_args:NNf \@@_chk_var_scope_aux:Nn #1 { \cs_to_str:N #2 } }
-    \cs_set_protected:Npn \@@_chk_var_scope_aux:Nn #1#2
+    \cs_set_protected:Npn \__debug_chk_var_scope_aux:NN #1#2
+      { \exp_args:NNf \__debug_chk_var_scope_aux:Nn #1 { \cs_to_str:N #2 } }
+    \cs_set_protected:Npn \__debug_chk_var_scope_aux:Nn #1#2
       {
         \if:w _ \use_i:nn \use_i_delimit_by_q_stop:nw #2 ? ? \q_stop
-          \exp_after:wN \@@_chk_var_scope_aux:NNn
+          \exp_after:wN \__debug_chk_var_scope_aux:NNn
             \use_i_delimit_by_q_stop:nw #2 ? \q_stop
             #1 {#2}
         \else:
-          \exp_args:Nc \@@_chk_var_scope_aux:NNn
-            { @@_chk_/ #2 }
+          \exp_args:Nc \__debug_chk_var_scope_aux:NNn
+            { __debug_chk_/ #2 }
             #1 {#2}
         \fi:
       }
-    \cs_set_protected:Npn \@@_chk_var_scope_aux:NNn #1#2#3
+    \cs_set_protected:Npn \__debug_chk_var_scope_aux:NNn #1#2#3
       {
         \if:w #1 #2
         \else:
@@ -1992,7 +1993,7 @@
           \if:w #1 \scan_stop:
             \cs_gset_nopar:Npn #1 {#2}
           \else:
-            \__msg_kernel_error:nnxxx { kernel } { local-global }
+            \__kernel_msg_error:nnxxx { kernel } { local-global }
               {#1} {#2} { \iow_char:N \\ #3 }
           \fi:
         \fi:
@@ -2005,11 +2006,11 @@
 % \end{macro}
 %
 % \begin{macro}
-%   {\@@_check-expressions_on:, \@@_check-expressions_off:}
-% \begin{macro}{\@@_chk_expr:nNnN}
-% \begin{macro}{\@@_chk_expr_aux:nNnN}
+%   {\__debug_check-expressions_on:, \__debug_check-expressions_off:}
+% \begin{macro}{\__kernel_chk_expr:nNnN}
+% \begin{macro}{\__debug_chk_expr_aux:nNnN}
 %   When debugging is enabled these two functions set
-%   \cs{@@_chk_expr:nNnN} to test or not whether the given
+%   \cs{__kernel_chk_expr:nNnN} to test or not whether the given
 %   expression is valid.  The idea is to evaluate the expression within
 %   a brace group (to catch trailing \cs{use_none:nn} or similar), then
 %   test that the result is what we expect.  This is done by turning it
@@ -2027,22 +2028,22 @@
 %   |1+2\relax+3| would incorrectly be accepted as a valid integer
 %   expression.
 %    \begin{macrocode}
-\@@:TF
+\__kernel_debug:TF
   {
-    \exp_args:Nc \cs_set_protected:Npn { @@_check-expressions_on: }
+    \exp_args:Nc \cs_set_protected:Npn { __debug_check-expressions_on: }
       {
-        \cs_set:Npn \@@_chk_expr:nNnN ##1##2
+        \cs_set:Npn \__kernel_chk_expr:nNnN ##1##2
           {
-            \@@_suspended:T { ##1 \use_none:nnnnnnn }
-            \exp_after:wN \@@_chk_expr_aux:nNnN
+            \__debug_suspended:T { ##1 \use_none:nnnnnnn }
+            \exp_after:wN \__debug_chk_expr_aux:nNnN
             \exp_after:wN { \tex_the:D ##2 ##1 \tex_relax:D }
             ##2
           }
       }
-    \exp_args:Nc \cs_set_protected:Npn { @@_check-expressions_off: }
-      { \cs_set:Npn \@@_chk_expr:nNnN ##1##2##3##4 {##1} }
-    \use:c { @@_check-expressions_off: }
-    \cs_set:Npn \@@_chk_expr_aux:nNnN #1#2#3#4
+    \exp_args:Nc \cs_set_protected:Npn { __debug_check-expressions_off: }
+      { \cs_set:Npn \__kernel_chk_expr:nNnN ##1##2##3##4 {##1} }
+    \use:c { __debug_check-expressions_off: }
+    \cs_set:Npn \__debug_chk_expr_aux:nNnN #1#2#3#4
       {
         \tl_if_empty:oF
           {
@@ -2051,7 +2052,7 @@
             \__int_value:w #3 #2 #1 \tex_relax:D
           }
           {
-            \__msg_kernel_expandable_error:nnnn
+            \__kernel_msg_expandable_error:nnnn
               { kernel } { expr } {#4} {#1}
           }
         #1
@@ -2063,10 +2064,10 @@
 % \end{macro}
 % \end{macro}
 %
-% \begin{macro}{\@@_log-functions_on:, \@@_log-functions_off:}
-% \begin{macro}{\@@_log:x}
+% \begin{macro}{\__debug_log-functions_on:, \__debug_log-functions_off:}
+% \begin{macro}{\__kernel_debug_log:x}
 %   These two functions (corresponding to the \pkg{expl3} option
-%   \texttt{log-functions}) control whether \cs{@@_log:x} writes to the
+%   \texttt{log-functions}) control whether \cs{__kernel_debug_log:x} writes to the
 %   log file or not.  Since \cs{iow_log:x} does not yet have its final
 %   definition we do not use \cs{cs_set_eq:NN} (not defined yet anyway).
 %   Once everything is defined, turn logging on or off depending on what
@@ -2073,19 +2074,19 @@
 %   option was given.  When debugging is not enabled, simply produce an
 %   error.
 %    \begin{macrocode}
-\@@:TF
+\__kernel_debug:TF
   {
-    \exp_args:Nc \cs_set_protected:Npn { @@_log-functions_on: }
+    \exp_args:Nc \cs_set_protected:Npn { __debug_log-functions_on: }
       {
-        \cs_set_protected:Npn \@@_log:x
-          { \@@_suspended:T \use_none:nn \iow_log:x }
+        \cs_set_protected:Npn \__kernel_debug_log:x
+          { \__debug_suspended:T \use_none:nn \iow_log:x }
       }
-    \exp_args:Nc \cs_set_protected:Npn { @@_log-functions_off: }
-      { \cs_set_protected:Npn \@@_log:x { \use_none:n } }
+    \exp_args:Nc \cs_set_protected:Npn { __debug_log-functions_off: }
+      { \cs_set_protected:Npn \__kernel_debug_log:x { \use_none:n } }
     \tex_ifodd:D \l at expl@log at functions@bool
-      \use:c { @@_log-functions_on: }
+      \use:c { __debug_log-functions_on: }
     \else:
-      \use:c { @@_log-functions_off: }
+      \use:c { __debug_log-functions_off: }
     \fi:
   }
   { }
@@ -2093,33 +2094,42 @@
 % \end{macro}
 % \end{macro}
 %
-% \begin{macro}{\@@_deprecation_on:, \@@_deprecation_off:}
-% \begin{variable}{\g_@@_deprecation_on_tl, \g_@@_deprecation_off_tl}
+% \begin{macro}{\__debug_deprecation_on:, \__debug_deprecation_off:}
+% \begin{macro}{\__kernel_deprecation_code:nn}
+% \begin{variable}{\g__debug_deprecation_on_tl, \g__debug_deprecation_off_tl}
 %   Some commands were more recently deprecated and not yet removed;
 %   only make these into errors if the user requests it.  This relies on
 %   two token lists, mostly filled up by calls to
-%   \cs{@@_deprecation:nnNNpn} in each module.
+%   \cs{__kernel_patch_deprecation:nnNNpn} in each module.
 %    \begin{macrocode}
-\@@:TF
+\__kernel_debug:TF
   {
-    \cs_set_protected:Npn \@@_deprecation_on:
-      { \g_@@_deprecation_on_tl }
-    \cs_set_protected:Npn \@@_deprecation_off:
-      { \g_@@_deprecation_off_tl }
-    \cs_set_nopar:Npn \g_@@_deprecation_on_tl { }
-    \cs_set_nopar:Npn \g_@@_deprecation_off_tl { }
+    \cs_set_protected:Npn \__debug_deprecation_on:
+      { \g__debug_deprecation_on_tl }
+    \cs_set_protected:Npn \__debug_deprecation_off:
+      { \g__debug_deprecation_off_tl }
+    \cs_set_nopar:Npn \g__debug_deprecation_on_tl { }
+    \cs_set_nopar:Npn \g__debug_deprecation_off_tl { }
+    \cs_set_protected:Npn \__kernel_deprecation_code:nn #1#2
+      {
+        \tl_gput_right:Nn \g__debug_deprecation_on_tl {#1}
+        \tl_gput_right:Nn \g__debug_deprecation_off_tl {#2}
+      }
   }
-  { }
+  {
+    \cs_set_protected:Npn \__kernel_deprecation_code:nn #1#2 { }
+  }
 %    \end{macrocode}
 % \end{variable}
 % \end{macro}
+% \end{macro}
 %
-% \begin{macro}{\@@_deprecation:nnNNpn}
-% \begin{macro}{\@@_deprecation_aux:nnNnn}
+% \begin{macro}{\__kernel_patch_deprecation:nnNNpn}
+% \begin{macro}{\__debug_deprecation_aux:nnNnn}
 %   Grab a definition (at present, must be \cs{cs_new_protected:Npn}).
-%   Add to \cs{g_@@_deprecation_on_tl} some code that makes the
+%   Add to \cs{g__debug_deprecation_on_tl} some code that makes the
 %   defined macro |#3| outer (and defines it as an error).  Add to
-%   \cs{g_@@_deprecation_off_tl} the definition itself.  In both
+%   \cs{g__debug_deprecation_off_tl} the definition itself.  In both
 %   cases we undefine the token with \cs{tex_let:D} to avoid taking a
 %   potentially outer macro as the argument of some \pkg{expl3}
 %   function.  Finally define the macro itself to produce a warning then
@@ -2127,28 +2137,28 @@
 %   together with the \texttt{x}-expanding assignment and \cs{exp_not:n}
 %   this gives a convenient way of storing the macro's definition in
 %   itself in order to only produce the warning once for each macro.
-%   If debugging is disabled, \cs{@@_deprecation:nnNNpn} lets the
+%   If debugging is disabled, \cs{__kernel_patch_deprecation:nnNNpn} lets the
 %   definition happen.
 %    \begin{macrocode}
-\@@:TF
+\__kernel_debug:TF
   {
-    \cs_set_protected:Npn \@@_deprecation:nnNNpn #1#2#3#4#5#
+    \cs_set_protected:Npn \__kernel_patch_deprecation:nnNNpn #1#2#3#4#5#
       {
         \if_meaning:w \cs_new_protected:Npn #3
         \else:
-          \__msg_kernel_error:nnx { kernel } { debug-unpatchable }
+          \__kernel_msg_error:nnx { kernel } { debug-unpatchable }
             { \token_to_str:N #3 ~(for~deprecation) }
         \fi:
-        \@@_deprecation_aux:nnNnn {#1} {#2} #4 {#5}
+        \__debug_deprecation_aux:nnNnn {#1} {#2} #4 {#5}
       }
-    \cs_set_protected:Npn \@@_deprecation_aux:nnNnn #1#2#3#4#5
+    \cs_set_protected:Npn \__debug_deprecation_aux:nnNnn #1#2#3#4#5
       {
-        \tl_gput_right:Nn \g_@@_deprecation_on_tl
+        \tl_gput_right:Nn \g__debug_deprecation_on_tl
           {
             \tex_let:D #3 \scan_stop:
             \__deprecation_error:Nnn #3 {#2} {#1}
           }
-        \tl_gput_right:Nn \g_@@_deprecation_off_tl
+        \tl_gput_right:Nn \g__debug_deprecation_off_tl
           {
             \tex_let:D #3 \scan_stop:
             \cs_set_protected:Npn #3 #4 {#5}
@@ -2155,7 +2165,7 @@
           }
         \cs_new_protected:Npx #3
           {
-            \exp_not:N \__msg_kernel_warning:nnxxx
+            \exp_not:N \__kernel_msg_warning:nnxxx
               { kernel } { deprecated-command }
               {#1} { \token_to_str:N #3 } { \tl_to_str:n {#2} }
             \exp_not:n { \cs_gset_protected:Npn #3 #4 {#5} }
@@ -2163,36 +2173,36 @@
           }
       }
   }
-  { \cs_set_protected:Npn \@@_deprecation:nnNNpn #1#2 { } }
+  { \cs_set_protected:Npn \__kernel_patch_deprecation:nnNNpn #1#2 { } }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
 %
 % \begin{macro}
-%   {\@@_patch:nnNNpn, \@@_patch_conditional:nNNpnn}
+%   {\__kernel_patch:nnNNpn, \__kernel_patch_conditional:nNNpnn}
 % \begin{macro}
-%   {\@@_patch_aux:nnnn, \@@_patch_auxii:nnnn}
-%   When debugging is not enabled, \cs{@@_patch:nnNNpn} and
-%   \cs{@@_patch_conditional:nNNpnn} throw the patch away.
+%   {\__debug_patch_aux:nnnn, \__debug_patch_auxii:nnnn}
+%   When debugging is not enabled, \cs{__kernel_patch:nnNNpn} and
+%   \cs{__kernel_patch_conditional:nNNpnn} throw the patch away.
 %   Otherwise they can be followed by \cs{cs_new:Npn} (or similar), and
 %   \cs{prg_new_conditional:Npnn} (or similar), respectively.  In each
 %   case, grab the name of the function to be defined and its parameters
 %   then insert tokens before and/or after the definition.
 %    \begin{macrocode}
-\@@:TF
+\__kernel_debug:TF
   {
-    \cs_set_protected:Npn \@@_patch:nnNNpn #1#2#3#4#5#
-      { \@@_patch_aux:nnnn {#1} {#2} { #3 #4 #5 } }
-    \cs_set_protected:Npn \@@_patch_conditional:nNNpnn #1#2#3#4#
-      { \@@_patch_auxii:nnnn {#1} { #2 #3 #4 } }
-    \cs_set_protected:Npn \@@_patch_aux:nnnn #1#2#3#4
+    \cs_set_protected:Npn \__kernel_patch:nnNNpn #1#2#3#4#5#
+      { \__debug_patch_aux:nnnn {#1} {#2} { #3 #4 #5 } }
+    \cs_set_protected:Npn \__kernel_patch_conditional:nNNpnn #1#2#3#4#
+      { \__debug_patch_auxii:nnnn {#1} { #2 #3 #4 } }
+    \cs_set_protected:Npn \__debug_patch_aux:nnnn #1#2#3#4
       { #3 { #1 #4 #2 } }
-    \cs_set_protected:Npn \@@_patch_auxii:nnnn #1#2#3#4
+    \cs_set_protected:Npn \__debug_patch_auxii:nnnn #1#2#3#4
       { #2 {#3} { #1 #4 } }
   }
   {
-    \cs_set_protected:Npn \@@_patch:nnNNpn #1#2 { }
-    \cs_set_protected:Npn \@@_patch_conditional:nNNpnn #1 { }
+    \cs_set_protected:Npn \__kernel_patch:nnNNpn #1#2 { }
+    \cs_set_protected:Npn \__kernel_patch_conditional:nNNpnn #1 { }
   }
 %    \end{macrocode}
 % \end{macro}
@@ -2199,17 +2209,17 @@
 % \end{macro}
 %
 % \begin{macro}
-%   {\@@_patch_args:nNNpn, \@@_patch_conditional_args:nNNpnn}
+%   {\__kernel_patch_args:nNNpn, \__kernel_patch_conditional_args:nNNpnn}
 % \begin{macro}
-%   {\@@_patch_args:nnnNNpn, \@@_patch_conditional_args:nnnNNpnn}
+%   {\__kernel_patch_args:nnnNNpn, \__kernel_patch_conditional_args:nnnNNpnn}
 % \begin{macro}
 %   {
-%     \@@_tmp:w,
-%     \@@_patch_args_aux:nnnNNnn,
-%     \@@_patch_args_aux:nnnNNnnn,
-%     \@@_patch_args_aux:nnnn
+%     \__debug_tmp:w,
+%     \__debug_patch_args_aux:nnnNNnn,
+%     \__debug_patch_args_aux:nnnNNnnn,
+%     \__debug_patch_args_aux:nnnn
 %   }
-%   See \cs{@@_patch:nnNNpn}.  The first argument is something like
+%   See \cs{__kernel_patch:nnNNpn}.  The first argument is something like
 %   |{#1}{(#2)}|.  Define a temporary macro using the \meta{parameters}
 %   and \meta{code} of the definition that follows, then expand that
 %   temporary macro in front of the first argument to obtain new
@@ -2216,34 +2226,34 @@
 %   \meta{code}.  Then perform the definition as if that new \meta{code}
 %   was directly typed in the file.
 %    \begin{macrocode}
-\cs_set_protected:Npn \@@_patch_args:nNNpn
-  { \@@_patch_args:nnnNNpn { } { } }
-\cs_set_protected:Npn \@@_patch_conditional_args:nNNpnn
-  { \@@_patch_conditional_args:nnnNNpnn { } { } }
-\@@:TF
+\cs_set_protected:Npn \__kernel_patch_args:nNNpn
+  { \__kernel_patch_args:nnnNNpn { } { } }
+\cs_set_protected:Npn \__kernel_patch_conditional_args:nNNpnn
+  { \__kernel_patch_conditional_args:nnnNNpnn { } { } }
+\__kernel_debug:TF
   {
-    \cs_set_protected:Npn \@@_patch_args:nnnNNpn #1#2#3#4#5#6#
-      { \@@_patch_args_aux:nnnNNnn {#1} {#2} {#3} #4 #5 {#6} }
-    \cs_set_protected:Npn \@@_patch_conditional_args:nnnNNpnn #1#2#3#4#5#6#
-      { \@@_patch_args_aux:nnnNNnnn {#1} {#2} {#3} #4 #5 {#6} }
-    \cs_set_protected:Npn \@@_patch_args_aux:nnnNNnn #1#2#3#4#5#6#7
+    \cs_set_protected:Npn \__kernel_patch_args:nnnNNpn #1#2#3#4#5#6#
+      { \__debug_patch_args_aux:nnnNNnn {#1} {#2} {#3} #4 #5 {#6} }
+    \cs_set_protected:Npn \__kernel_patch_conditional_args:nnnNNpnn #1#2#3#4#5#6#
+      { \__debug_patch_args_aux:nnnNNnnn {#1} {#2} {#3} #4 #5 {#6} }
+    \cs_set_protected:Npn \__debug_patch_args_aux:nnnNNnn #1#2#3#4#5#6#7
       {
-        \cs_set:Npn \@@_tmp:w #6 {#7}
-        \exp_after:wN \@@_patch_args_aux:nnnn \exp_after:wN
-          { \@@_tmp:w #3 } { #4 #5 #6 } {#1} {#2}
+        \cs_set:Npn \__debug_tmp:w #6 {#7}
+        \exp_after:wN \__debug_patch_args_aux:nnnn \exp_after:wN
+          { \__debug_tmp:w #3 } { #4 #5 #6 } {#1} {#2}
       }
-    \cs_set_protected:Npn \@@_patch_args_aux:nnnNNnnn #1#2#3#4#5#6#7#8
+    \cs_set_protected:Npn \__debug_patch_args_aux:nnnNNnnn #1#2#3#4#5#6#7#8
       {
-        \cs_set:Npn \@@_tmp:w #6 {#8}
-        \exp_after:wN \@@_patch_args_aux:nnnn \exp_after:wN
-          { \@@_tmp:w #3 } { #4 #5 #6 {#7} } {#1} {#2}
+        \cs_set:Npn \__debug_tmp:w #6 {#8}
+        \exp_after:wN \__debug_patch_args_aux:nnnn \exp_after:wN
+          { \__debug_tmp:w #3 } { #4 #5 #6 {#7} } {#1} {#2}
       }
-    \cs_set_protected:Npn \@@_patch_args_aux:nnnn #1#2#3#4
+    \cs_set_protected:Npn \__debug_patch_args_aux:nnnn #1#2#3#4
       { #2 { #3 #1 #4 } }
   }
   {
-    \cs_set_protected:Npn \@@_patch_args:nnnNNpn #1#2#3 { }
-    \cs_set_protected:Npn \@@_patch_conditional_args:nnnNNpnn #1#2#3 { }
+    \cs_set_protected:Npn \__kernel_patch_args:nnnNNpn #1#2#3 { }
+    \cs_set_protected:Npn \__kernel_patch_conditional_args:nnnNNpnn #1#2#3 { }
   }
 %    \end{macrocode}
 % \end{macro}
@@ -2376,7 +2386,7 @@
       { \@@_generate_conditional:nnNnnnnn {#1} {#2} #3 {#4} {#5} }
       { \tl_count:n {#2} }
       {
-        \__msg_kernel_error:nnxx { kernel } { bad-number-of-arguments }
+        \__kernel_msg_error:nnxx { kernel } { bad-number-of-arguments }
           { \token_to_str:c { #1 : #2 } }
           { \tl_count:n {#2} }
         \use_none:nn
@@ -2405,7 +2415,7 @@
 \cs_set_protected:Npn \@@_generate_conditional:nnNnnnnn #1#2#3#4#5#6#7#8
   {
     \if_meaning:w \c_false_bool #3
-      \__msg_kernel_error:nnx { kernel } { missing-colon }
+      \__kernel_msg_error:nnx { kernel } { missing-colon }
         { \token_to_str:c {#1} }
       \exp_after:wN \use_none:nn
     \fi:
@@ -2434,7 +2444,7 @@
     \use:c { @@_generate_ #7 _form:wnnnnnn }
         \tl_if_empty:nF {#7}
           {
-            \__msg_kernel_error:nnxx
+            \__kernel_msg_error:nnxx
               { kernel } { conditional-form-unknown }
               {#7} { \token_to_str:c { #3 : #4 } }
           }
@@ -2476,7 +2486,7 @@
           { #7 \exp_end: \c_true_bool \c_false_bool }
       }
       {
-        \__msg_kernel_error:nnx { kernel } { protected-predicate }
+        \__kernel_msg_error:nnx { kernel } { protected-predicate }
           { \token_to_str:c { #4 _p: #5 } }
       }
   }
@@ -2556,12 +2566,12 @@
 \cs_set_protected:Npn \@@_set_eq_conditional:nnNnnNNw #1#2#3#4#5#6
   {
     \if_meaning:w \c_false_bool #3
-      \__msg_kernel_error:nnx { kernel } { missing-colon }
+      \__kernel_msg_error:nnx { kernel } { missing-colon }
         { \token_to_str:c {#1} }
       \exp_after:wN \use_none_delimit_by_q_recursion_stop:w
     \fi:
     \if_meaning:w \c_false_bool #6
-      \__msg_kernel_error:nnx { kernel } { missing-colon }
+      \__kernel_msg_error:nnx { kernel } { missing-colon }
         { \token_to_str:c {#4} }
       \exp_after:wN \use_none_delimit_by_q_recursion_stop:w
     \fi:
@@ -2575,7 +2585,7 @@
     \use:c { @@_set_eq_conditional_ #6 _form:wNnnnn }
         \tl_if_empty:nF {#6}
           {
-            \__msg_kernel_error:nnxx
+            \__kernel_msg_error:nnxx
               { kernel } { conditional-form-unknown }
               {#6} { \token_to_str:c { #1 : #2 } }
           }
@@ -2584,20 +2594,20 @@
       #5 {#1} {#2} {#3} {#4}
     \@@_set_eq_conditional_loop:nnnnNw {#1} {#2} {#3} {#4} #5
   }
-\__debug_patch:nnNNpn
-  { \__debug_chk_cs_exist:c { #5 _p : #6    } } { }
+\__kernel_patch:nnNNpn
+  { \__kernel_chk_cs_exist:c { #5 _p : #6    } } { }
 \cs_set:Npn \@@_set_eq_conditional_p_form:wNnnnn #1 \q_stop #2#3#4#5#6
   { #2 { #3 _p : #4    }    { #5 _p : #6    } }
-\__debug_patch:nnNNpn
-  { \__debug_chk_cs_exist:c { #5    : #6 TF } } { }
+\__kernel_patch:nnNNpn
+  { \__kernel_chk_cs_exist:c { #5    : #6 TF } } { }
 \cs_set:Npn \@@_set_eq_conditional_TF_form:wNnnnn #1 \q_stop #2#3#4#5#6
   { #2 { #3    : #4 TF }    { #5    : #6 TF } }
-\__debug_patch:nnNNpn
-  { \__debug_chk_cs_exist:c { #5    : #6 T  } } { }
+\__kernel_patch:nnNNpn
+  { \__kernel_chk_cs_exist:c { #5    : #6 T  } } { }
 \cs_set:Npn \@@_set_eq_conditional_T_form:wNnnnn #1 \q_stop #2#3#4#5#6
   { #2 { #3    : #4 T  }    { #5    : #6 T  } }
-\__debug_patch:nnNNpn
-  { \__debug_chk_cs_exist:c { #5    : #6  F } } { }
+\__kernel_patch:nnNNpn
+  { \__kernel_chk_cs_exist:c { #5    : #6  F } } { }
 \cs_set:Npn \@@_set_eq_conditional_F_form:wNnnnn #1 \q_stop #2#3#4#5#6
   { #2 { #3    : #4  F }    { #5    : #6  F } }
 %    \end{macrocode}
@@ -2880,7 +2890,7 @@
 %    only temporary, they will be redefined later on.
 %
 % \begin{macro}
-%   {\__msg_kernel_error:nnxx, \__msg_kernel_error:nnx, \__msg_kernel_error:nn}
+%   {\__kernel_msg_error:nnxx, \__kernel_msg_error:nnx, \__kernel_msg_error:nn}
 %   If an internal error occurs before \LaTeX3 has loaded \pkg{l3msg} then
 %   the code should issue a usable if terse error message and halt. This
 %   can only happen if a coding error is made by the team, so this is
@@ -2887,7 +2897,7 @@
 %   a reasonable response.  Setting the \tn{newlinechar} is needed, to
 %   turn |^^J| into a proper line break in plain \TeX{}.
 %    \begin{macrocode}
-\cs_set_protected:Npn \__msg_kernel_error:nnxx #1#2#3#4
+\cs_set_protected:Npn \__kernel_msg_error:nnxx #1#2#3#4
   {
     \tex_newlinechar:D = `\^^J \tex_relax:D
     \tex_errmessage:D
@@ -2900,10 +2910,10 @@
       }
     \tex_end:D
   }
-\cs_set_protected:Npn \__msg_kernel_error:nnx #1#2#3
-  { \__msg_kernel_error:nnxx {#1} {#2} {#3} { } }
-\cs_set_protected:Npn \__msg_kernel_error:nn #1#2
-  { \__msg_kernel_error:nnxx {#1} {#2} { } { } }
+\cs_set_protected:Npn \__kernel_msg_error:nnx #1#2#3
+  { \__kernel_msg_error:nnxx {#1} {#2} {#3} { } }
+\cs_set_protected:Npn \__kernel_msg_error:nn #1#2
+  { \__kernel_msg_error:nnxx {#1} {#2} { } { } }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -2936,13 +2946,13 @@
 %   issued. We have to make sure we don't put the argument into the
 %   conditional processing since it may be an |\if...| type function!
 %    \begin{macrocode}
-\__debug_patch:nnNNpn { }
-  { \__debug_log:x { Defining~\token_to_str:N #1~ \msg_line_context: } }
+\__kernel_patch:nnNNpn { }
+  { \__kernel_debug_log:x { Defining~\token_to_str:N #1~ \msg_line_context: } }
 \cs_set_protected:Npn \__chk_if_free_cs:N #1
   {
     \cs_if_free:NF #1
       {
-        \__msg_kernel_error:nnxx { kernel } { command-already-defined }
+        \__kernel_msg_error:nnxx { kernel } { command-already-defined }
           { \token_to_str:N #1 } { \token_to_meaning:N #1 }
       }
   }
@@ -3238,7 +3248,7 @@
   {
     \@@_parm_from_arg_count:nnF { \use:nnn #2 #1 } {#3}
       {
-        \__msg_kernel_error:nnxx { kernel } { bad-number-of-arguments }
+        \__kernel_msg_error:nnxx { kernel } { bad-number-of-arguments }
           { \token_to_str:N #1 } { \int_eval:n {#3} }
         \use_none:n
       }
@@ -3314,7 +3324,7 @@
         \str_if_eq_x:nnF { }
           { \tl_map_function:nN {#2} \@@_generate_from_signature:n }
           {
-            \__msg_kernel_error:nnx { kernel } { non-base-function }
+            \__kernel_msg_error:nnx { kernel } { non-base-function }
               { \token_to_str:N #5 }
           }
         \cs_generate_from_arg_count:NNnn
@@ -3321,7 +3331,7 @@
           #5 #4 { \tl_count:n {#2} } {#6}
       }
       {
-        \__msg_kernel_error:nnx { kernel } { missing-colon }
+        \__kernel_msg_error:nnx { kernel } { missing-colon }
           { \token_to_str:N #5 }
       }
   }
@@ -3452,7 +3462,7 @@
     \cs_if_exist:NTF #1
       {#2}
       {
-        \__msg_kernel_error:nnx { kernel } { variable-not-defined }
+        \__kernel_msg_error:nnx { kernel } { variable-not-defined }
           { \token_to_str:N #1 }
       }
   }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -138,7 +138,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %
@@ -562,12 +562,6 @@
     \global\lccode23 = 23 %
   \endgroup
 \fi
-%    \end{macrocode}
-% In all cases it makes sense to set up |-| to map to itself: this allows
-% hyphenation of the rest of a word following it (suggested by
-% Lars Helstr\"om).
-%    \begin{macrocode}
-\global\lccode`\- = `\- %
 %</initex>
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -1,6 +1,6 @@
 % \iffalse meta-comment
 %
-%% File: l3box.dtx Copyright (C) 2005-2017 The LaTeX3 Project
+%% File: l3box.dtx Copyright (C) 2005-2018 The LaTeX3 Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %
@@ -901,10 +901,10 @@
 % \testfile*
 %   Assigning the contents of a box to be another box.
 %    \begin{macrocode}
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \box_set_eq:NN #1#2
   { \tex_setbox:D #1 \tex_copy:D #2 }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \box_gset_eq:NN #1#2
   { \tex_global:D \tex_setbox:D #1 \tex_copy:D #2 }
 \cs_generate_variant:Nn \box_set_eq:NN  { c , Nc , cc }
@@ -928,10 +928,10 @@
 %    Assigning the contents of a box to be another box.
 %    This clears the second box globally (that's how \TeX{} does it).
 %    \begin{macrocode}
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \box_set_eq_clear:NN #1#2
   { \tex_setbox:D #1 \tex_box:D #2 }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \box_gset_eq_clear:NN #1#2
   { \tex_global:D \tex_setbox:D #1 \tex_box:D #2 }
 \cs_generate_variant:Nn \box_set_eq_clear:NN  { c , Nc , cc }
@@ -1078,10 +1078,10 @@
 % \testfile*
 %    Set a box to the previous box.
 %    \begin{macrocode}
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \box_set_to_last:N #1
   { \tex_setbox:D #1 \tex_lastbox:D }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \box_gset_to_last:N #1
   { \tex_global:D \tex_setbox:D #1 \tex_lastbox:D }
 \cs_generate_variant:Nn \box_set_to_last:N  { c }
@@ -1175,7 +1175,7 @@
         \group_end:
       }
       {
-        \__msg_kernel_error:nnx { kernel } { variable-not-defined }
+        \__kernel_msg_error:nnx { kernel } { variable-not-defined }
           { \token_to_str:N #2 }
       }
   }
@@ -1198,10 +1198,10 @@
 % \begin{macro}{\hbox_gset:Nn, \hbox_gset:cn}
 % \testfile*
 %    \begin{macrocode}
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \hbox_set:Nn #1#2
   { \tex_setbox:D #1 \tex_hbox:D { \group_begin: #2 \group_end: } }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \hbox_gset:Nn #1#2
   { \tex_global:D \tex_setbox:D #1 \tex_hbox:D { \group_begin: #2 \group_end: } }
 \cs_generate_variant:Nn \hbox_set:Nn { c }
@@ -1216,13 +1216,13 @@
 %   Storing material in a horizontal box with a specified width.
 %   Again, put the dimension expression in parentheses when debugging.
 %    \begin{macrocode}
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \hbox_set_to_wd:Nnn #1#2#3
   {
     \tex_setbox:D #1 \tex_hbox:D to \__dim_eval:n {#2}
       { \group_begin: #3 \group_end: }
   }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \hbox_gset_to_wd:Nnn #1#2#3
   {
     \tex_global:D \tex_setbox:D #1 \tex_hbox:D to \__dim_eval:n {#2}
@@ -1241,7 +1241,7 @@
 %    Storing material in a horizontal box. This type is useful in
 %    environment definitions.
 %    \begin{macrocode}
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \hbox_set:Nw  #1
   {
     \tex_setbox:D #1 \tex_hbox:D
@@ -1248,7 +1248,7 @@
       \c_group_begin_token
         \group_begin:
   }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \hbox_gset:Nw  #1
   {
     \tex_global:D \tex_setbox:D #1 \tex_hbox:D
@@ -1272,7 +1272,7 @@
 % \begin{macro}{\hbox_gset_to_wd:Nnw, \hbox_gset_to_wd:cnw}
 %   Combining the above ideas.
 %    \begin{macrocode}
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \hbox_set_to_wd:Nnw #1#2
   {
     \tex_setbox:D #1 \tex_hbox:D to \__dim_eval:n {#2}
@@ -1279,7 +1279,7 @@
       \c_group_begin_token
         \group_begin:
   }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \hbox_gset_to_wd:Nnw #1#2
   {
     \tex_global:D \tex_setbox:D #1 \tex_hbox:D to \__dim_eval:n {#2}
@@ -1376,13 +1376,13 @@
 % \testfile*
 %   Storing material in a vertical box with a natural height.
 %    \begin{macrocode}
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \vbox_set:Nn #1#2
   {
     \tex_setbox:D #1 \tex_vbox:D
       { \group_begin: #2 \par \group_end: }
   }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \vbox_gset:Nn #1#2
   {
     \tex_global:D \tex_setbox:D #1 \tex_vbox:D
@@ -1400,13 +1400,13 @@
 %   Storing material in a vertical box with a natural height and reference
 %   point at the baseline of the first object in the box.
 %    \begin{macrocode}
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \vbox_set_top:Nn #1#2
   {
     \tex_setbox:D #1 \tex_vtop:D
       { \group_begin: #2 \par \group_end: }
   }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \vbox_gset_top:Nn #1#2
   {
     \tex_global:D \tex_setbox:D #1 \tex_vtop:D
@@ -1423,13 +1423,13 @@
 %  \testfile*
 %  Storing material in a vertical box with a specified height.
 %    \begin{macrocode}
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \vbox_set_to_ht:Nnn #1#2#3
   {
     \tex_setbox:D #1 \tex_vbox:D to \__dim_eval:n {#2}
       { \group_begin: #3 \par \group_end: }
   }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \vbox_gset_to_ht:Nnn #1#2#3
   {
     \tex_global:D \tex_setbox:D #1 \tex_vbox:D to \__dim_eval:n {#2}
@@ -1448,7 +1448,7 @@
 %   Storing material in a vertical box. This type is useful in
 %   environment definitions.
 %    \begin{macrocode}
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \vbox_set:Nw #1
   {
     \tex_setbox:D #1 \tex_vbox:D
@@ -1455,7 +1455,7 @@
       \c_group_begin_token
         \group_begin:
   }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \vbox_gset:Nw #1
   {
     \tex_global:D \tex_setbox:D #1 \tex_vbox:D
@@ -1480,7 +1480,7 @@
 % \begin{macro}{\vbox_gset_to_ht:Nnw, \vbox_gset_to_ht:cnw}
 %   A combination of the above ideas.
 %    \begin{macrocode}
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \vbox_set_to_ht:Nnw #1#2
   {
     \tex_setbox:D #1 \tex_vbox:D to \__dim_eval:n {#2}
@@ -1487,7 +1487,7 @@
       \c_group_begin_token
         \group_begin:
   }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \vbox_gset_to_ht:Nnw #1#2
   {
     \tex_global:D \tex_setbox:D #1 \tex_vbox:D to \__dim_eval:n {#2}
@@ -1517,7 +1517,7 @@
 % \testfile*
 %   Splitting a vertical box in two.
 %    \begin{macrocode}
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \vbox_set_split_to_ht:NNn #1#2#3
   { \tex_setbox:D #1 \tex_vsplit:D #2 to \__dim_eval:n {#3} }
 %    \end{macrocode}
@@ -2063,19 +2063,19 @@
 % \begin{macro}[deprecated = 2018-12-31]{\box_resize:Nnn, \box_resize:cnn}
 % \begin{macro}[deprecated = 2018-12-31]{\box_use_clear:N, \box_use_clear:c}
 %    \begin{macrocode}
-\__debug_deprecation:nnNNpn
+\__kernel_patch_deprecation:nnNNpn
   { 2018-12-31 } { \box_resize_to_wd_and_ht_plus_dp:Nnn }
 \cs_new_protected:Npn \box_resize:Nnn
   { \box_resize_to_wd_and_ht_plus_dp:Nnn }
-\__debug_deprecation:nnNNpn
+\__kernel_patch_deprecation:nnNNpn
   { 2018-12-31 } { \box_resize_to_wd_and_ht_plus_dp:cnn }
 \cs_new_protected:Npn \box_resize:cnn
   { \box_resize_to_wd_and_ht_plus_dp:cnn }
-\__debug_deprecation:nnNNpn
-  { 2018-12-31 } { \box_use_clear:N }
+\__kernel_patch_deprecation:nnNNpn
+  { 2018-12-31 } { \box_use_drop:N }
 \cs_new_protected:Npn \box_use_clear:N { \box_use_drop:N }
-\__debug_deprecation:nnNNpn
-  { 2018-12-31 } { \box_use_clear:c }
+\__kernel_patch_deprecation:nnNNpn
+  { 2018-12-31 } { \box_use_drop:c }
 \cs_new_protected:Npn \box_use_clear:c { \box_use_drop:c }
 %    \end{macrocode}
 % \end{macro}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -1,6 +1,6 @@
 % \iffalse meta-comment
 %
-%% File: l3candidates.dtx Copyright (C) 2012-2017 The LaTeX3 Project
+%% File: l3candidates.dtx Copyright (C) 2012-2018 The LaTeX3 Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %
@@ -1825,13 +1825,13 @@
         \cs_set_protected:Npn \@@_get_details:nnN #1#2#3
           {
             \tl_clear:N #3
-            \__msg_kernel_error:nnx
+            \__kernel_msg_error:nnx
               { kernel } { xetex-primitive-not-available }
               { \exp_not:c { pdffile #2 } }
           }
       }
   }
-\__msg_kernel_new:nnnn { kernel } { xetex-primitive-not-available }
+\__kernel_msg_new:nnnn { kernel } { xetex-primitive-not-available }
   { Primitive~\token_to_str:N #1 not~available }
   {
     XeTeX~does~not~currently~provide~functionality~equivalent~to~the~
@@ -1865,7 +1865,7 @@
 % \begin{macro}[deprecated = 2017-12-31]{\file_if_exist_input:nT, \file_if_exist_input:nTF}
 %   For removal after 2017-12-31.
 %    \begin{macrocode}
-\__debug_deprecation:nnNNpn { 2017-12-31 }
+\__kernel_patch_deprecation:nnNNpn { 2017-12-31 }
   { \file_if_exist:nTF and~ \file_input:n }
 \cs_new_protected:Npn \file_if_exist_input:nTF #1#2#3
   {
@@ -1873,7 +1873,7 @@
     \str_if_empty:NTF \l_@@_full_name_str
       {#3} { #2 \@@_input:V \l_@@_full_name_str }
   }
-\__debug_deprecation:nnNNpn { 2017-12-31 }
+\__kernel_patch_deprecation:nnNNpn { 2017-12-31 }
   { \file_if_exist:nT and~ \file_input:n }
 \cs_new_protected:Npn \file_if_exist_input:nT #1#2
   {
@@ -1918,10 +1918,10 @@
 %    \begin{macrocode}
 \cs_if_exist:NTF \pdftex_uniformdeviate:D
   {
-    \__debug_patch_args:nNNpn
+    \__kernel_patch_args:nNNpn
       {
-        { \__debug_chk_expr:nNnN {#1} \@@_eval:w { } \int_rand:nn }
-        { \__debug_chk_expr:nNnN {#2} \@@_eval:w { } \int_rand:nn }
+        { \__kernel_chk_expr:nNnN {#1} \@@_eval:w { } \int_rand:nn }
+        { \__kernel_chk_expr:nNnN {#2} \@@_eval:w { } \int_rand:nn }
       }
     \cs_new:Npn \int_rand:nn #1#2
       {
@@ -1933,7 +1933,7 @@
       {
         \int_compare:nNnTF {#1} > {#2}
           {
-            \__msg_kernel_expandable_error:nnnn
+            \__kernel_msg_expandable_error:nnnn
               { kernel } { backward-range } {#1} {#2}
             \@@_rand:ww #2; #1;
           }
@@ -1968,7 +1968,7 @@
   {
     \cs_new:Npn \int_rand:nn #1#2
       {
-        \__msg_kernel_expandable_error:nn { kernel } { fp-no-random }
+        \__kernel_msg_expandable_error:nn { kernel } { fp-no-random }
         \int_eval:n {#1}
       }
   }
@@ -1980,7 +1980,7 @@
 %    \begin{macrocode}
 \cs_if_exist:NT \pdftex_uniformdeviate:D
   {
-    \__msg_kernel_new:nnn { kernel } { backward-range }
+    \__kernel_msg_new:nnn { kernel } { backward-range }
       { Bounds~ordered~backwards~in~\int_rand:nn {#1}~{#2}. }
   }
 %    \end{macrocode}
@@ -2094,7 +2094,7 @@
 % \begin{macro}[added = 2017-11-28]{\bool_const:Nn, \bool_const:cn}
 %   A merger between \cs{tl_const:Nn} and \cs{bool_set:Nn}.
 %    \begin{macrocode}
-\__debug_patch:nnNNpn { \__debug_chk_var_scope:NN c #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_scope:NN c #1 } { }
 \cs_new_protected:Npn \bool_const:Nn #1#2
   {
     \__chk_if_free_cs:N #1

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %
@@ -1696,7 +1696,7 @@
           }
       }
       {
-        \__msg_kernel_expandable_error:nnn
+        \__kernel_msg_expandable_error:nnn
           { kernel } { bad-variable } {#1}
       }
   }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %
@@ -479,7 +479,7 @@
     \coffin_if_exist:NTF #1
       { #2 }
       {
-        \__msg_kernel_error:nnx { kernel } { unknown-coffin }
+        \__kernel_msg_error:nnx { kernel } { unknown-coffin }
           { \token_to_str:N #1 }
       }
   }
@@ -735,7 +735,7 @@
     \prop_get:cnNF
       { l_@@_poles_ \__int_value:w #1 _prop } {#2} #3
       {
-        \__msg_kernel_error:nnxx { kernel } { unknown-coffin-pole }
+        \__kernel_msg_error:nnxx { kernel } { unknown-coffin-pole }
           {#2} { \token_to_str:N #1 }
         \tl_set:Nn #3 { { 0pt } { 0pt } { 0pt } { 0pt } }
       }
@@ -901,7 +901,7 @@
         \l_@@_pole_a_tl \l_@@_pole_b_tl
     \bool_if:NT \l_@@_error_bool
       {
-        \__msg_kernel_error:nn { kernel } { no-pole-intersection }
+        \__kernel_msg_error:nn { kernel } { no-pole-intersection }
         \dim_zero:N \l_@@_x_dim
         \dim_zero:N \l_@@_y_dim
       }
@@ -1695,7 +1695,7 @@
 % \subsection{Messages}
 %
 %    \begin{macrocode}
-\__msg_kernel_new:nnnn { kernel } { no-pole-intersection }
+\__kernel_msg_new:nnnn { kernel } { no-pole-intersection }
   { No~intersection~between~coffin~poles. }
   {
     \c__msg_coding_error_text_tl
@@ -1703,10 +1703,10 @@
     but~they~do~not~have~a~unique~meeting~point:~
     the~value~(0~pt,~0~pt)~will~be~used.
   }
-\__msg_kernel_new:nnnn { kernel } { unknown-coffin }
+\__kernel_msg_new:nnnn { kernel } { unknown-coffin }
   { Unknown~coffin~'#1'. }
   { The~coffin~'#1'~was~never~defined. }
-\__msg_kernel_new:nnnn { kernel } { unknown-coffin-pole }
+\__kernel_msg_new:nnnn { kernel } { unknown-coffin-pole }
   { Pole~'#1'~unknown~for~coffin~'#2'. }
   {
     \c__msg_coding_error_text_tl
@@ -1713,7 +1713,7 @@
     LaTeX~was~asked~to~find~a~typesetting~pole~for~a~coffin,~
     but~either~the~coffin~does~not~exist~or~the~pole~name~is~wrong.
   }
-\__msg_kernel_new:nnn { kernel } { show-coffin }
+\__kernel_msg_new:nnn { kernel } { show-coffin }
   {
     Size~of~coffin~#1 : #2 \\
     Poles~of~coffin~#1 : #3 .

Added: trunk/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx	                        (rev 0)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -0,0 +1,199 @@
+% \iffalse meta-comment
+%
+%% File: l3color-base.dtx Copyright(C) 2011,2012,2014,2016-2018 The LaTeX3 Project
+%
+% It may be distributed and/or modified under the conditions of the
+% LaTeX Project Public License (LPPL), either version 1.3c of this
+% license or (at your option) any later version.  The latest version
+% of this license is in the file
+%
+%    https://www.latex-project.org/lppl.txt
+%
+% This file is part of the "l3kernel bundle" (The Work in LPPL)
+% and all files in that bundle must be distributed together.
+%
+% -----------------------------------------------------------------------
+%
+% The development version of the bundle can be found at
+%
+%    https://github.com/latex3/latex3
+%
+% for those people who are interested.
+%
+%<*driver>
+\documentclass[full,kernel]{l3doc}
+\begin{document}
+  \DocInput{\jobname.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \title{^^A
+%   The \textsf{l3color-base} package\\ Color support^^A
+% }
+%
+% \author{^^A
+%  The \LaTeX3 Project\thanks
+%    {^^A
+%      E-mail:
+%        \href{mailto:latex-team at latex-project.org}
+%          {latex-team at latex-project.org}^^A
+%    }^^A
+% }
+%
+% \date{Released 2018/02/21}
+%
+% \maketitle
+%
+% \begin{documentation}
+%
+% This module provides support for color in \LaTeX3{}. At present, the
+% material here is mainly intended to support a small number of low-level
+% requirements in other \pkg{l3kernel} modules.
+%
+% \section{Color in boxes}
+%
+% Controlling the color of text in boxes requires a small number of control
+% functions, so that the boxed material uses the color at the point where
+% it is set, rather than where it is used.
+%
+% \begin{function}[added = 2011-09-03]{\color_group_begin:, \color_group_end:}
+%   \begin{syntax}
+%     \cs{color_group_begin:}
+%       \ldots
+%     \cs{color_group_end:}
+%   \end{syntax}
+%   Creates a color group: one used to \enquote{trap} color settings.
+% \end{function}
+%
+% \begin{function}[added = 2011-09-03]{\color_ensure_current:}
+%   \begin{syntax}
+%     \cs{color_ensure_current:}
+%   \end{syntax}
+%   Ensures that material inside a box uses the foreground color
+%   at the point where the box is set, rather than that in force when the
+%   box is used. This function should usually be used within a
+%   \cs{color_group_begin:} \ldots \cs{color_group_end:} group.
+% \end{function}
+%
+% \subsection{Internal functions}
+%
+% \begin{variable}[added = 2017-06-15, updated = 2017-10-02]
+%   {\l_@@_current_tl}
+%   The color currently active for foreground (text, \emph{etc.}) material.
+%   This is stored in the form of a color model followed by one or more
+%   values. There are four pre-defined models, three of which take numerical
+%   values in the range $[0,1]$:
+%   \begin{itemize}
+%     \item \texttt{gray \meta{gray}} Grayscale color with the \meta{gray}
+%       value running from $0$ (fully black) to $1$ (fully white)
+%     \item \texttt{cmyk \meta{cyan} \meta{magenta} \meta{yellow} \meta{black}}
+%     \item \texttt{rgb \meta{red} \meta{green} \meta{blue}}
+%   \end{itemize}
+%   Notice that the value are separated by spaces. There is a fourth pre-defined
+%   model using a string value and a numerical one:
+%   \begin{itemize}
+%     \item \texttt{spot \meta{name} \meta{tint}} A pre-defined spot color,
+%       where the \meta{name} should be a pre-defined string color name and the
+%       \meta{tint} should be in the range $[0,1]$.
+%   \end{itemize}
+%
+%   Additional models may be created to allow mixing of spot colors. The
+%   number of data entries these require will depend on the number of
+%   colors to be mixed.
+%   \begin{texnote}
+%     The content of \cs{l_@@_current_tl} is space-separated as
+%     this allows it to be used directly in specials in many common cases.
+%     This internal representation is close to that used by the \texttt{dvips}
+%     program.
+%   \end{texnote}
+% \end{variable}
+%
+% \end{documentation}
+%
+% \begin{implementation}
+%
+% \section{\pkg{l3color-base} Implementation}
+%
+%    \begin{macrocode}
+%<*initex|package>
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+%<@@=color>
+%    \end{macrocode}
+%
+% \begin{macro}{\color_group_begin:, \color_group_end:}
+%   Grouping for color is almost the same as using the basic \cs{group_begin:}
+%   and \cs{group_end:} functions.  However, in vertical mode the end-of-group
+%   needs a \tn{par}, which in horizontal mode does nothing.
+%    \begin{macrocode}
+\cs_new_eq:NN \color_group_begin: \group_begin:
+\cs_new_protected:Npn \color_group_end:
+  {
+      \par
+    \group_end:
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\color_ensure_current:}
+%   A driver-independent wrapper for setting the foreground color to the
+%   current color \enquote{now}.
+%    \begin{macrocode}
+\cs_new_protected:Npn \color_ensure_current:
+  {
+%<*package>
+    \driver_color_pickup:N \l_@@_current_tl
+%</package>
+    \@@_select:V \l_@@_current_tl
+    \group_insert_after:N \driver_color_reset:
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_select:n, \@@_select:V}
+% \begin{macro}{\@@_select:w}
+% \begin{macro}
+%   {\@@_select_cmyk:w, \@@_select_gray:w, \@@_select_rgb:w, \@@_select_spot:w}
+%    Take an internal color specification and pass it to the driver. This code
+%    is needed to ensure the current color but will also be used by the
+%    higher-level experimental material.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_select:n #1
+  {  \@@_select:w #1 \q_stop }
+\cs_generate_variant:Nn \@@_select:n { V }
+\cs_new_protected:Npn \@@_select:w #1 ~ #2 \q_stop
+  { \use:c { @@_select_ #1 :w } #2 \q_stop }
+\cs_new_protected:Npn \@@_select_cmyk:w #1 ~ #2 ~ #3 ~ #4 \q_stop
+  { \driver_color_cmyk:nnnn {#1} {#2} {#3} {#4} }
+\cs_new_protected:Npn \@@_select_gray:w #1 \q_stop
+  { \driver_color_gray:n {#1} }
+\cs_new_protected:Npn \@@_select_rgb:w #1 ~ #2 ~ #3 \q_stop
+  { \driver_color_rgb:nnn {#1} {#2} {#3} }
+\cs_new_protected:Npn \@@_select_spot:w #1 ~ #2 \q_stop
+  { \driver_color_spot:nn {#1} {#2} }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{variable}{\l_@@_current_tl}
+%   As the setting data is used only
+%   for specials, and those are always space-separated, it makes most sense to
+%   hold the internal information in that form. Any splitting is done by a
+%   delimited function but often the entire \texttt{tl} can be used as-is:
+%   see \texttt{l3drivers.dtx}.
+%    \begin{macrocode}
+\tl_new:N \l_@@_current_tl
+\tl_set:Nn \l_@@_current_tl { gray~0 }
+%    \end{macrocode}
+% \end{variable}
+%
+%    \begin{macrocode}
+%</initex|package>
+%    \end{macrocode}
+%
+% \end{implementation}
+%
+% \PrintIndex


Property changes on: trunk/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Deleted: trunk/Master/texmf-dist/source/latex/l3kernel/l3color.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3color.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3color.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -1,169 +0,0 @@
-% \iffalse meta-comment
-%
-%% File: l3color.dtx Copyright(C) 2011,2012,2014,2016,2017 The LaTeX3 Project
-%
-% It may be distributed and/or modified under the conditions of the
-% LaTeX Project Public License (LPPL), either version 1.3c of this
-% license or (at your option) any later version.  The latest version
-% of this license is in the file
-%
-%    https://www.latex-project.org/lppl.txt
-%
-% This file is part of the "l3kernel bundle" (The Work in LPPL)
-% and all files in that bundle must be distributed together.
-%
-% -----------------------------------------------------------------------
-%
-% The development version of the bundle can be found at
-%
-%    https://github.com/latex3/latex3
-%
-% for those people who are interested.
-%
-%<*driver>
-\documentclass[full,kernel]{l3doc}
-\begin{document}
-  \DocInput{\jobname.dtx}
-\end{document}
-%</driver>
-% \fi
-%
-% \title{^^A
-%   The \textsf{l3color} package\\ Color support^^A
-% }
-%
-% \author{^^A
-%  The \LaTeX3 Project\thanks
-%    {^^A
-%      E-mail:
-%        \href{mailto:latex-team at latex-project.org}
-%          {latex-team at latex-project.org}^^A
-%    }^^A
-% }
-%
-% \date{Released 2017/12/16}
-%
-% \maketitle
-%
-% \begin{documentation}
-%
-% This module provides support for color in \LaTeX3{}. At present, the
-% material here is mainly intended to support a small number of low-level
-% requirements in other \pkg{l3kernel} modules.
-%
-% \section{Color in boxes}
-%
-% Controlling the color of text in boxes requires a small number of control
-% functions, so that the boxed material uses the color at the point where
-% it is set, rather than where it is used.
-%
-% \begin{function}[added = 2011-09-03]{\color_group_begin:, \color_group_end:}
-%   \begin{syntax}
-%     \cs{color_group_begin:}
-%       \ldots
-%     \cs{color_group_end:}
-%   \end{syntax}
-%   Creates a color group: one used to \enquote{trap} color settings.
-% \end{function}
-%
-% \begin{function}[added = 2011-09-03]{\color_ensure_current:}
-%   \begin{syntax}
-%     \cs{color_ensure_current:}
-%   \end{syntax}
-%   Ensures that material inside a box uses the foreground color
-%   at the point where the box is set, rather than that in force when the
-%   box is used. This function should usually be used within a
-%   \cs{color_group_begin:} \ldots \cs{color_group_end:} group.
-% \end{function}
-%
-% \subsection{Internal functions}
-%
-% \begin{variable}[added = 2017-06-15, updated = 2017-10-02]
-%   {\l__color_current_tl}
-%   The color currently active for foreground (text, \emph{etc.}) material.
-%   This is stored in the form of a color model followed by one or more
-%   values. There are four pre-defined models, three of which take numerical
-%   values in the range $[0,1]$:
-%   \begin{itemize}
-%     \item \texttt{gray \meta{gray}} Grayscale color with the \meta{gray}
-%       value running from $0$ (fully black) to $1$ (fully white)
-%     \item \texttt{cmyk \meta{cyan} \meta{magenta} \meta{yellow} \meta{black}}
-%     \item \texttt{rgb \meta{red} \meta{green} \meta{blue}}
-%   \end{itemize}
-%   Notice that the value are separated by spaces. There is a fourth pre-defined
-%   model using a string value and a numerical one:
-%   \begin{itemize}
-%     \item \texttt{spot \meta{name} \meta{tint}} A pre-defined spot color,
-%       where the \meta{name} should be a pre-defined string color name and the
-%       \meta{tint} should be in the range $[0,1]$.
-%   \end{itemize}
-%
-%   Additional models may be created to allow mixing of spot colors. The
-%   number of data entries these require will depend on the number of
-%   colors to be mixed.
-%   \begin{texnote}
-%     The content of \cs{l__color_current_tl} is space-separated as
-%     this allows it to be used directly in specials in many common cases.
-%     This internal representation is close to that used by the \texttt{dvips}
-%     program.
-%   \end{texnote}
-% \end{variable}
-%
-% \end{documentation}
-%
-% \begin{implementation}
-%
-% \section{\pkg{l3color} Implementation}
-%
-%    \begin{macrocode}
-%<*initex|package>
-%    \end{macrocode}
-%
-% \begin{macro}{\color_group_begin:, \color_group_end:}
-%   Grouping for color is almost the same as using the basic \cs{group_begin:}
-%   and \cs{group_end:} functions.  However, in vertical mode the end-of-group
-%   needs a \tn{par}, which in horizontal mode does nothing.
-%    \begin{macrocode}
-\cs_new_eq:NN \color_group_begin: \group_begin:
-\cs_new_protected:Npn \color_group_end:
-  {
-      \par
-    \group_end:
-  }
-%    \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\color_ensure_current:}
-%   A driver-independent wrapper for setting the foreground color to the
-%   current color \enquote{now}.
-%    \begin{macrocode}
-\cs_new_protected:Npn \color_ensure_current:
-  {
-%<*package>
-    \__driver_color_pickup:N \l__color_current_tl
-%</package>
-    \__driver_color_select:V \l__color_current_tl
-    \group_insert_after:N \__driver_color_reset:
-  }
-%    \end{macrocode}
-% \end{macro}
-%
-% \begin{variable}{\l__color_current_tl}
-%   As the setting data is used only
-%   for specials, and those are always space-separated, it makes most sense to
-%   hold the internal information in that form. Any splitting is done by a
-%   delimited function but often the entire \texttt{tl} can be used as-is:
-%   see \texttt{l3drivers.dtx}.
-%    \begin{macrocode}
-\tl_new:N \l__color_current_tl
-\tl_set:Nn \l__color_current_tl { gray~0 }
-%    \end{macrocode}
-% \end{variable}
-%
-%    \begin{macrocode}
-%</initex|package>
-%    \end{macrocode}
-%
-% \end{implementation}
-%
-% \PrintIndex

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -1,6 +1,6 @@
 % \iffalse meta-comment
 %
-%% File: l3deprecation.dtx (C) Copyright 2017 The LaTeX3 Project
+%% File: l3deprecation.dtx (C) Copyright 2017-2018 The LaTeX3 Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %
@@ -75,10 +75,10 @@
   {
     \etex_protected:D \tex_outer:D \tex_edef:D #1
       {
-        \exp_not:N \__msg_kernel_expandable_error:nnnnn
+        \exp_not:N \__kernel_msg_expandable_error:nnnnn
           { kernel } { deprecated-command }
           { \tl_to_str:n {#3} } { \token_to_str:N #1 } { \tl_to_str:n {#2} }
-        \exp_not:N \__msg_kernel_error:nnxxx
+        \exp_not:N \__kernel_msg_error:nnxxx
           { kernel } { deprecated-command }
           { \tl_to_str:n {#3} } { \token_to_str:N #1 } { \tl_to_str:n {#2} }
       }
@@ -120,20 +120,15 @@
 % This is left-over from \pkg{l3expan}.  It cannot be done there because
 % \pkg{l3tl} is not loaded at that time.
 %    \begin{macrocode}
-\__debug:TF
+\__kernel_deprecation_code:nn
   {
-    \tl_gput_right:Nn \g__debug_deprecation_on_tl
-      {
-        \cs_set_protected:Npn \__cs_generate_variant_loop_warning:nnxxxx
-          { \__msg_kernel_error:nnxxxx }
-      }
-    \tl_gput_right:Nn \g__debug_deprecation_off_tl
-      {
-        \cs_set_protected:Npn \__cs_generate_variant_loop_warning:nnxxxx
-          { \__msg_kernel_warning:nnxxxx }
-      }
+    \cs_set_protected:Npn \__cs_generate_variant_loop_warning:nnxxxx
+      { \__kernel_msg_error:nnxxxx }
   }
-  { }
+  {
+    \cs_set_protected:Npn \__cs_generate_variant_loop_warning:nnxxxx
+      { \__kernel_msg_warning:nnxxxx }
+  }
 %    \end{macrocode}
 %
 %    \begin{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -1,6 +1,6 @@
 % \iffalse meta-comment
 %
-%% File: l3doc.dtx Copyright (C) 1990-2017 The LaTeX3 project
+%% File: l3doc.dtx Copyright (C) 1990-2018 The LaTeX3 project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -70,7 +70,7 @@
 % This isn't included in the typeset documentation because it's a bit
 % ugly:
 %<*class>
-\ProvidesExplClass{l3doc}{2017/12/16}{}
+\ProvidesExplClass{l3doc}{2018/02/21}{}
   {L3 Experimental documentation class}
 %</class>
 % \fi
@@ -77,7 +77,7 @@
 %
 % \title{The \cls{l3doc} class}
 % \author{\Team}
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 % \maketitle
 % \tableofcontents
 %
@@ -949,7 +949,7 @@
 \cs_generate_variant:Nn \tl_if_head_eq_charcode:nNT  { o }
 \cs_generate_variant:Nn \tl_if_head_eq_charcode:nNF  { o }
 \cs_generate_variant:Nn \tl_if_head_eq_meaning:nNF  { V }
-\cs_generate_variant:Nn \tl_if_in:nnTF { no }
+\cs_generate_variant:Nn \tl_if_in:nnTF { no , oo }
 \cs_generate_variant:Nn \tl_if_in:NnTF { No }
 \cs_generate_variant:Nn \tl_if_in:NnT  { No }
 \cs_generate_variant:Nn \tl_if_in:NnF  { No }
@@ -995,6 +995,22 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}[TF]{\@@_str_if_begin:nn, \@@_str_if_begin:oo}
+%   True if the first string starts with the second.
+%    \begin{macrocode}
+\prg_new_protected_conditional:Npnn \@@_str_if_begin:nn #1#2 { TF , T , F }
+  {
+    \tl_if_in:ooTF
+      { \exp_after:wN \scan_stop: \tl_to_str:n {#1} }
+      { \exp_after:wN \scan_stop: \tl_to_str:n {#2} }
+      { \prg_return_true: }
+      { \prg_return_false: }
+  }
+\prg_generate_conditional_variant:Nnn \@@_str_if_begin:nn
+  { oo } { TF , T , F }
+%    \end{macrocode}
+% \end{macro}
+%
 % \begin{macro}{\@@_replace_at_at:N}
 % \begin{macro}{\@@_replace_at_at_aux:Nn}
 %   The goal is to replace |@@| by the current module name.  We take
@@ -1035,14 +1051,16 @@
 % \end{macro}
 % \end{macro}
 %
-% \begin{macro}{\@@_detect_internals:N}
+% \begin{macro}{\@@_detect_internals:N, \@@_if_detect_internals_ok:NF}
 %   After splitting at each |__| and removing the leading item from the
 %   sequence (since it does not follow |__|), remove everything after
 %   any space or end-of-line to get a good approximation of the control
-%   sequence (for the warning message), then remove anything after any
-%   |_| or |:| (with either catcode) to get the module name.  If that
-%   name is not empty and differs from the current |@@| name then
-%   complain.
+%   sequence (for the warning message).  Then check if that starts with
+%   something allowed: |@@| module name and |:| or |_|, or if the
+%   relevant boolean is set |kernel_| (it seems safe to assume we will
+%   not define a |\__kernel:...| command).  For the message itself
+%   remove anything after any |_| or |:| (with either catcode) to get a
+%   guess of the module name.
 %    \begin{macrocode}
 \group_begin:
   \char_set_catcode_active:N \^^M
@@ -1057,32 +1075,38 @@
           \@@_trim_right:No \l_@@_detect_internals_tl
             \c_catcode_active_space_tl
           \@@_trim_right:Nn \l_@@_detect_internals_tl ^^M
-          \tl_set_eq:NN \l_@@_detect_internals_cs_tl \l_@@_detect_internals_tl
-          \@@_trim_right:Nn \l_@@_detect_internals_tl _
-          \@@_trim_right:Nn \l_@@_detect_internals_tl :
-          \@@_trim_right:No \l_@@_detect_internals_tl { \token_to_str:N : }
-          \tl_if_empty:NF \l_@@_detect_internals_tl
+          \@@_if_detect_internals_ok:NF \l_@@_detect_internals_tl
             {
-              \str_if_eq:NNF \l_@@_detect_internals_tl \g_@@_module_name_tl
-                {
-                  \bool_lazy_and:nnF
-                    { \g_@@_kernel_bool }
-                    {
-                      \str_if_eq_x_p:nn
-                        { \tl_to_str:N \l_@@_detect_internals_tl }
-                        { kernel }
-                    }
-                    {
-                      \msg_warning:nnxxx { l3doc } { foreign-internal }
-                        { \tl_to_str:N \l_@@_detect_internals_cs_tl }
-                        { \tl_to_str:N \l_@@_detect_internals_tl }
-                        { \tl_to_str:N \g_@@_module_name_tl }
-                    }
-                }
+              \tl_set_eq:NN \l_@@_detect_internals_cs_tl \l_@@_detect_internals_tl
+              \@@_trim_right:Nn \l_@@_detect_internals_tl _
+              \@@_trim_right:Nn \l_@@_detect_internals_tl :
+              \@@_trim_right:No \l_@@_detect_internals_tl { \token_to_str:N : }
+              \msg_warning:nnxxx { l3doc } { foreign-internal }
+                { \tl_to_str:N \l_@@_detect_internals_cs_tl }
+                { \tl_to_str:N \l_@@_detect_internals_tl }
+                { \tl_to_str:N \g_@@_module_name_tl }
             }
         }
     }
 \group_end:
+\prg_new_protected_conditional:Npnn \@@_if_detect_internals_ok:N #1 { F }
+  {
+    \@@_str_if_begin:ooTF {#1} { \g_@@_module_name_tl _ }
+      { \prg_return_true: }
+      {
+        \@@_str_if_begin:ooTF {#1} { \g_@@_module_name_tl : }
+          { \prg_return_true: }
+          {
+            \bool_if:NTF \g_@@_kernel_bool
+              {
+                \@@_str_if_begin:ooTF {#1} { kernel _ }
+                  { \prg_return_true: }
+                  { \prg_return_false: }
+              }
+              { \prg_return_false: }
+          }
+      }
+  }
 %    \end{macrocode}
 % \end{macro}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -61,7 +61,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -22,10 +22,6 @@
 %
 %<*driver>
 \documentclass[full,kernel]{l3doc}
-%</driver>
-%<*driver|package>
-%</driver|package>
-%<*driver>
 \begin{document}
   \DocInput{\jobname.dtx}
 \end{document}
@@ -45,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %
@@ -126,21 +122,51 @@
 %
 % \section{Color support}
 %
-% \begin{function}[added = 2017-10-25]
-%   {\__driver_color_select:n, \__driver_color_select:V}
+% \begin{function}[added = 2018-02-20]{\driver_color_cmyk:nnnn}
 %   \begin{syntax}
-%     \cs{__driver_color_select:n} \Arg{color}
+%     \cs{driver_color_cmyk:nnnn} \Arg{cyan} \Arg{magenta} \Arg{yellow}
+%       \Arg{black}
 %   \end{syntax}
-%   Selects the \meta{color} (which is given in low-level format: a
-%   \meta{model} followed by a space and one or more space-separated
-%   axes).
+%   Sets the color to the CMYK values specified, all of which are
+%   fp denotations in the range $0$ and $1$. For drawing colors, see
+%   \cs{driver_draw_color_cmyk:nnnn}, \emph{etc.}
 % \end{function}
 %
-% \begin{function}[added = 2017-10-25]
-%   {\__driver_color_pickup:N}
+% \begin{function}[added = 2018-02-20]{\driver_color_gray:n}
 %   \begin{syntax}
-%     \cs{__driver_color_pickup:N} \meta{tl}
+%     \cs{driver_color_gray:n} \Arg{gray}
 %   \end{syntax}
+%   Sets the color to the grayscale value specified, which is
+%   fp denotations in the range $0$ and $1$. For drawing colors, see
+%   \cs{driver_draw_color_gray:n}, \emph{etc.}
+% \end{function}
+%
+% \begin{function}[added = 2018-02-20]{\driver_color_rgb:nnn}
+%   \begin{syntax}
+%     \cs{driver_color_rgb:nnn} \Arg{red} \Arg{green} \Arg{blue}
+%   \end{syntax}
+%   Sets the color to the RGB values specified, all of which are
+%   fp denotations in the range $0$ and $1$. For drawing colors, see
+%   \cs{driver_draw_color_rgb:nnn}, \emph{etc.}
+% \end{function}
+%
+% \begin{function}[added = 2018-02-20]{\driver_color_reset:}
+%   \begin{syntax}
+%     \cs{driver_color_reset:}
+%   \end{syntax}
+%   Resets the active color to that before a call to
+%   \cs{driver_color_\meta{model}:n(nnn)}. This function should be inserted
+%   after the \TeX{} group setting a color, \emph{i.e.}~normally
+%   \begin{verbatim}
+%     % Use of \driver_color_rgb:nnn, etc.
+%     \group_insert_after:N \driver_color_reset:
+%   \end{verbatim}
+% \end{function}
+%
+% \begin{function}[added = 2018-02-20]{\driver_color_pickup:N}
+%   \begin{syntax}
+%     \cs{driver_color_pickup:N} \meta{tl}
+%   \end{syntax}
 %   In \LaTeXe{} package mode, collects data on the current color from
 %   \tn{current at color} and stores it in the low-level format used by \pkg{expl3}
 %   in the \meta{tl}.
@@ -383,11 +409,11 @@
 %     \driver_draw_stroke_cmyk:nnnn
 %   }
 %   \begin{syntax}
-%     \cs{driver_draw_color_cmyk:nnnn} \Arg{cyan} \Arg{magneta} \Arg{yellow}
+%     \cs{driver_draw_color_cmyk:nnnn} \Arg{cyan} \Arg{magenta} \Arg{yellow}
 %       \Arg{black}
 %   \end{syntax}
 %   Sets the color for drawing to the CMYK values specified, all of which are
-%   fp expressions which should evaluate to between $0$ and $1$. The
+%   fp denotations in the range $0$ and $1$. The
 %   \texttt{fill} and \texttt{stroke} versions set only the color for those
 %   operations. Note that the general setting is more efficient with some
 %   drivers so should in most cases be preferred.
@@ -403,7 +429,7 @@
 %     \cs{driver_draw_color_gray:n} \Arg{gray}
 %   \end{syntax}
 %   Sets the color for drawing to the grayscale value specified, which is
-%   fp expressions which should evaluate to between $0$ and $1$. The
+%   fp denotations in the range $0$ and $1$. The
 %   \texttt{fill} and \texttt{stroke} versions set only the color for those
 %   operations. Note that the general setting is more efficient with some
 %   drivers so should in most cases be preferred.
@@ -419,7 +445,7 @@
 %     \cs{driver_draw_color_rgb:nnn} \Arg{red} \Arg{green} \Arg{blue}
 %   \end{syntax}
 %   Sets the color for drawing to the RGB values specified, all of which are
-%   fp expressions which should evaluate to between $0$ and $1$. The
+%   fp denotations in the range $0$ and $1$. The
 %   \texttt{fill} and \texttt{stroke} versions set only the color for those
 %   operations. Note that the general setting is more efficient with some
 %   drivers so should in most cases be preferred.
@@ -521,18 +547,19 @@
 %<*dvisvgm|dvipdfmx|dvips|xdvipdfmx>
 %    \end{macrocode}
 %
-% \begin{macro}{\@@_color_pickup:N}
+% \begin{macro}{\driver_color_pickup:N}
+% \begin{macro}{\@@_color_pickup:w}
 %   Allow for \LaTeXe{} color. Here, the possible input values are limited:
 %   \texttt{dvips}-style colors can mainly be taken as-is with the exception
 %   spot ones (here we need a model and a tint).
 %    \begin{macrocode}
 %<*package>
-\cs_new_protected:Npn \@@_color_pickup:N #1 { }
+\cs_new_protected:Npn \driver_color_pickup:N #1 { }
 \AtBeginDocument
   {
     \@ifpackageloaded { color }
       {
-        \cs_set_protected:Npn \@@_color_pickup:N #1
+        \cs_set_protected:Npn \driver_color_pickup:N #1
           {
             \exp_args:NV \tl_if_head_is_space:nTF \current at color
               {
@@ -542,9 +569,9 @@
                      \exp_after:wN \use:n \current at color \c_space_tl 1
                    }
               }
-              { \exp_after:wN \@@_color_pickup_aux:w \current at color \q_stop #1 }
+              { \exp_after:wN \@@_color_pickup:w \current at color \q_stop #1 }
           }
-        \cs_new_protected:Npn \@@_color_pickup_aux:w #1 ~ #2 \q_stop #3
+        \cs_new_protected:Npn \@@_color_pickup:w #1 ~ #2 \q_stop #3
           { \tl_set:Nn #3 { #1 ~ #2 } }
       }
       { }
@@ -552,36 +579,27 @@
 %</package>
 %    \end{macrocode}
 % \end{macro}
+% \end{macro}
 %
-% \begin{macro}{\@@_color_select:n, \@@_color_select:V}
-% \begin{macro}[EXP]{\@@_convert_model:w}
-% \begin{macro}[EXP]{\@@_color_convert_spot:}
-% \begin{macro}[EXP]{\@@_color_convert_spot:w}
-% \begin{macro}{\@@_color_reset:}
-%   Mainly no conversation but a little work with \texttt{spot} colors as they
-%   can't have a tint level here! The easy route of just picking up
-%   \texttt{spot} as a model won't work as there could be additional models
-%   created for mixing named colors. (They would not be supported at the moment,
-%   but still need to be handled.)
+% \begin{macro}{\driver_color_cmyk:nnnn}
+% \begin{macro}{\driver_color_gray:n}
+% \begin{macro}{\driver_color_rgb:nnn}
+% \begin{macro}{\driver_color_spot:nn}
+% \begin{macro}{\@@_color_select:n}
+% \begin{macro}{\driver_color_reset:}
+%   Simply dump the data.
 %    \begin{macrocode}
+\cs_new_protected:Npn \driver_color_cmyk:nnnn #1#2#3#4
+  { \@@_color_select:n { cmyk~ #1 ~ #2 ~ #3 ~ #4 } }
+\cs_new_protected:Npn \driver_color_gray:n #1
+  { \@@_color_select:n { gray~ #1 } }
+\cs_new_protected:Npn \driver_color_rgb:nnn #1#2#3
+  { \@@_color_select:n { rgb~ #1 ~ #2 ~ #3 } }
+\cs_new_protected:Npn \driver_color_spot:nn #1#2
+  { \@@_color_select:n { color~push~\c_space_tl #1 } }
 \cs_new_protected:Npn \@@_color_select:n #1
-  {
-    \tex_special:D
-      {
-        color~push~
-        \cs_if_exist_use:cF
-          { @@_color_convert_ \@@_convert_model:w #1 \q_stop :n }
-          { \use:n }
-            {#1}
-      }
-  }
-\cs_generate_variant:Nn \@@_color_select:n { V }
-\cs_new:Npn \@@_convert_model:w #1 ~ #2 \q_stop {#1}
-\cs_new:Npn \@@_color_convert_spot:n #1
-  { \@@_color_convert_spot:w #1 \q_stop }
-\cs_new:Npn \@@_color_convert_spot:w #1 ~ #2 ~ #3 \q_stop
-  { \c_space_tl #2 }
-\cs_new_protected:Npn \@@_color_reset:
+  { \tex_special:D { color~push~ #1 } }
+\cs_new_protected:Npn \driver_color_reset:
   { \tex_special:D { color~pop } }
 %    \end{macrocode}
 % \end{macro}
@@ -589,6 +607,7 @@
 % \end{macro}
 % \end{macro}
 % \end{macro}
+% \end{macro}
 %
 %    \begin{macrocode}
 %</dvisvgm|dvipdfmx|dvips|xdvipdfmx>
@@ -600,27 +619,27 @@
 %<*pdfmode>
 %    \end{macrocode}
 %
-% \begin{macro}{\@@_color_pickup:N}
-% \begin{macro}{\@@_color_pickup_aux:w}
+% \begin{macro}{\driver_color_pickup:N}
+% \begin{macro}{\@@_color_pickup:w}
 %   The current color in driver-dependent format: pick up the package-mode
 %   data if available. We end up converting back and forward in this route as
 %   we store our color data in \texttt{dvips} format.
 %   The \tn{current at color} needs to be \texttt{x}-expanded before
-%   \cs{@@_color_pickup_aux:w} breaks it apart, because for instance
+%   \cs{@@_color_pickup:w} breaks it apart, because for instance
 %   \pkg{xcolor} sets it to be instructions to generate a colour
 %    \begin{macrocode}
 %<*package>
-\cs_new_protected:Npn \@@_color_pickup:N #1 { }
+\cs_new_protected:Npn \driver_color_pickup:N #1 { }
 \AtBeginDocument
   {
     \@ifpackageloaded { color }
       {
-        \cs_set_protected:Npn \@@_color_pickup:N #1
+        \cs_set_protected:Npn \driver_color_pickup:N #1
           {
-            \exp_last_unbraced:Nx \@@_color_pickup_aux:w
+            \exp_last_unbraced:Nx \@@_color_pickup:w
               { \current at color } ~ 0 ~ 0 ~ 0 \q_stop #1
           }
-        \cs_new_protected:Npn \@@_color_pickup_aux:w
+        \cs_new_protected:Npn \@@_color_pickup:w
           #1 ~ #2 ~ #3 ~ #4 ~ #5 ~ #6 \q_stop #7
           {
             \str_if_eq:nnTF {#2} { g }
@@ -659,48 +678,31 @@
 %    \end{macrocode}
 % \end{variable}
 %
-% \begin{macro}{\@@_color_select:n, \@@_color_select:V}
-% \begin{macro}[EXP]{\@@_color_convert:w}
-% \begin{macro}[EXP]
-%   {
-%     \@@_color_convert_gray:w ,
-%     \@@_color_convert_cmyk:w ,
-%     \@@_color_convert_rgb:w  ,
-%     \@@_color_convert_spot:w
-%   }
-% \begin{macro}{\@@_color_reset:}
-%   There is a dedicated primitive/primitive interface for setting colors.
-%   As with scoping, this approach is not suitable for cached operations.
-%   Most of the conversions are trivial but the need to cover spot colors
-%   makes life slightly more interesting.
+% \begin{macro}{\driver_color_cmyk:nnnn}
+% \begin{macro}{\driver_color_gray:n}
+% \begin{macro}{\driver_color_rgb:nnn}
+% \begin{macro}{\driver_color_spot:nn}
+% \begin{macro}{\@@_color_select:n}
+% \begin{macro}{\driver_color_reset:}
+%   Simply dump the data, but allowing for \LuaTeX{}.
 %    \begin{macrocode}
+\cs_new_protected:Npn \driver_color_cmyk:nnnn #1#2#3#4
+  { \@@_color_select:n { #1 ~ #2 ~ #3 ~ #4 ~ k ~ #1 ~ #2 ~ #3 ~ #4 ~ K } }
+\cs_new_protected:Npn \driver_color_gray:n #1
+  { \@@_color_select:n { #1 ~ g ~ #1 ~ G } }
+\cs_new_protected:Npn \driver_color_rgb:nnn #1#2#3
+  { \@@_color_select:n { #1 ~ #2 ~ #3 ~ rg ~ #1 ~ #2 ~ #3 ~ RG } }
+\cs_new_protected:Npn \driver_color_spot:nn #1#2
+  { \@@_color_select:n { /#1 ~ cs ~ /#1 ~ CS ~ #2 ~ sc ~ #2 ~ SC } }
 \cs_new_protected:Npx \@@_color_select:n #1
   {
     \cs_if_exist:NTF \luatex_pdfextension:D
       { \luatex_pdfextension:D colorstack }
       { \pdftex_pdfcolorstack:D }
-        \exp_not:N \l_@@_color_stack_int push
-          {
-            \exp_not:N \@@_color_convert:w
-            #1
-            \exp_not:N \q_stop
-          }
+        \exp_not:N \l_@@_color_stack_int push {#1}
   }
-\cs_generate_variant:Nn \@@_color_select:n { V }
-\cs_new:Npn \@@_color_convert:w #1 ~ #2 \q_stop
-  { \use:c { @@_color_convert_ #1 :w } #2 \q_stop }
-\cs_new:Npn \@@_color_convert_gray:w #1 \q_stop
-  { #1 ~ g ~ #1 ~ G }
-\cs_new:Npn \@@_color_convert_cmyk:w #1 \q_stop
-  { #1 ~ k ~ #1 ~ K }
-\cs_new:Npn \@@_color_convert_rgb:w #1 \q_stop
-  { #1 ~ rg ~ #1 ~ RG }
-\cs_new:Npn \@@_color_convert_spot:w #1 ~ #2 \q_stop
+\cs_new_protected:Npx \driver_color_reset:
   {
-    /#1 ~ cs ~ /#1 ~ CS ~ #2 ~ sc ~ #2 ~ SC
-  }
-\cs_new_protected:Npx \@@_color_reset:
-  {
     \cs_if_exist:NTF \luatex_pdfextension:D
       { \luatex_pdfextension:D colorstack }
       { \pdftex_pdfcolorstack:D }
@@ -711,6 +713,8 @@
 % \end{macro}
 % \end{macro}
 % \end{macro}
+% \end{macro}
+% \end{macro}
 %
 %    \begin{macrocode}
 %</pdfmode>
@@ -1107,7 +1111,7 @@
       { \dim_to_decimal_in_bp:n {#1} ~ setlinewidth }
   }
 \cs_new_protected:Npn \driver_draw_miterlimit:n #1
-  { \@@_draw_literal:x { \fp_eval:n {#1} ~ setmiterlimit } }
+  { \@@_draw_literal:n { #1 ~ setmiterlimit } }
 \cs_new_protected:Npn \driver_draw_cap_butt:
   { \@@_draw_literal:n { 0 ~ setlinecap } }
 \cs_new_protected:Npn \driver_draw_cap_round:
@@ -1158,81 +1162,42 @@
   }
 \cs_new_protected:Npn \driver_draw_color_cmyk:nnnn #1#2#3#4
   {
-    \@@_draw_literal:x
-      {
-        \fp_eval:n {#1} ~ \fp_eval:n {#2} ~
-        \fp_eval:n {#3} ~ \fp_eval:n {#4} ~
-        setcmykcolor ~
-      }
+    \@@_draw_literal:n { #1 ~ #2 ~ #3 ~ #4 ~ setcmykcolor }
     \@@_draw_color_reset:
   }
 \cs_new_protected:Npn \driver_draw_fill_cmyk:nnnn #1#2#3#4
   {
-    \@@_draw_literal:x
-      {
-        /l3fc ~
-          {
-            \fp_eval:n {#1} ~ \fp_eval:n {#2} ~
-            \fp_eval:n {#3} ~ \fp_eval:n {#4} ~
-            setcmykcolor
-          } ~
-        def
-      }
+    \@@_draw_literal:n
+      { /l3fc ~ { #1 ~ #2 ~ #3 ~ #4 ~ setcmykcolor ~ } ~ def }
   }
 \cs_new_protected:Npn \driver_draw_stroke_cmyk:nnnn #1#2#3#4
   {
-    \@@_draw_literal:x
-      {
-        /l3sc ~
-          {
-            \fp_eval:n {#1} ~ \fp_eval:n {#2} ~
-            \fp_eval:n {#3} ~ \fp_eval:n {#4} ~
-            setcmykcolor
-          } ~
-        def
-      }
+    \@@_draw_literal:n
+      { /l3sc ~ { #1 ~ #2 ~ #3 ~ #4 ~ setcmykcolor ~ } ~ def }
   }
 \cs_new_protected:Npn \driver_draw_color_gray:n #1
   {
-    \@@_draw_literal:x { fp_eval:n {#1} ~ setgray  }
+    \@@_draw_literal:n { #1 ~ setgray  }
     \@@_draw_color_reset:
   }
 \cs_new_protected:Npn \driver_draw_fill_gray:n #1
-  { \@@_draw_literal:x { /l3fc ~ { \fp_eval:n {#1} ~ setgray } ~ def } }
+  { \@@_draw_literal:n { /l3fc ~ { #1 ~ setgray } ~ def } }
 \cs_new_protected:Npn \driver_draw_stroke_gray:n #1
-  { \@@_draw_literal:x { /l3sc ~ { \fp_eval:n {#1} ~ setgray } ~ def } }
+  { \@@_draw_literal:n { /l3sc ~ { #1 ~ setgray } ~ def } }
 \cs_new_protected:Npn \driver_draw_color_rgb:nnn #1#2#3
   {
-    \@@_draw_literal:x
-      {
-        \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} ~
-        setrgbcolor
-      }
+    \@@_draw_literal:n { #1 ~ #2 ~ #3 ~ setrgbcolor }
     \@@_draw_color_reset:
   }
 \cs_new_protected:Npn \driver_draw_fill_rgb:nnn #1#2#3
   {
-    \@@_draw_literal:x
-      {
-        /l3fc ~
-          {
-            \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} ~
-            setrgbcolor
-          } ~
-        def
-      }
+    \@@_draw_literal:n
+      { /l3fc ~ { #1 ~ #2 ~ #3 ~ setrgbcolor } ~ def }
   }
 \cs_new_protected:Npn \driver_draw_stroke_rgb:nnn #1#2#3
   {
-    \@@_draw_literal:x
-      {
-        /l3sc ~
-          {
-            \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} ~
-            setrgbcolor
-          } ~
-        def
-      }
+    \@@_draw_literal:n
+      { /l3sc ~ { #1 ~ #2 ~ #3 ~ setrgbcolor } ~ def }
   }
 %    \end{macrocode}
 % \end{macro}
@@ -1250,8 +1215,7 @@
     \@@_draw_literal:x
       {
         [
-          \fp_eval:n {#1} ~ \fp_eval:n {#2} ~
-          \fp_eval:n {#3} ~ \fp_eval:n {#4} ~
+          #1 ~ #2 ~ #3 ~ #4 ~
           \dim_to_decimal_in_bp:n {#5} ~ \dim_to_decimal_in_bp:n {#6} ~
         ] ~
         concat
@@ -2067,7 +2031,7 @@
       { \dim_to_decimal_in_bp:n {#1} ~ w }
   }
 \cs_new_protected:Npn \driver_draw_miterlimit:n #1
-  { \@@_draw_literal:x { \fp_eval:n {#1} ~ M } }
+  { \@@_draw_literal:x { #1 ~ M } }
 \cs_new_protected:Npn \driver_draw_cap_butt:
   { \@@_draw_literal:n { 0 ~ J } }
 \cs_new_protected:Npn \driver_draw_cap_round:
@@ -2093,7 +2057,6 @@
 %     \driver_draw_fill_cmyk:nnnn   ,
 %     \driver_draw_stroke_cmyk:nnnn
 %   }
-% \begin{macro}{\@@_draw_color_cmyk_aux:nnnn}
 % \begin{macro}
 %   {
 %     \driver_draw_color_gray:n        ,
@@ -2100,7 +2063,6 @@
 %     \driver_draw_fill_gray:n   ,
 %     \driver_draw_stroke_gray:n
 %   }
-% \begin{macro}{\@@_draw_color_gray_aux:n}
 % \begin{macro}
 %   {
 %     \driver_draw_color_rgb:nnn        ,
@@ -2107,89 +2069,39 @@
 %     \driver_draw_fill_rgb:nnn   ,
 %     \driver_draw_stroke_rgb:nnn
 %   }
-% \begin{macro}{\@@_draw_color_rgb_aux:nnn}
 %   Yet more fast conversion, all using the FPU to allow for expressions
 %   in numerical input.
 %    \begin{macrocode}
 \cs_new_protected:Npn \driver_draw_color_cmyk:nnnn #1#2#3#4
   {
-    \use:x
-      {
-        \@@_draw_color_cmyk_aux:nnnn
-          { \fp_eval:n {#1} }
-          { \fp_eval:n {#2} }
-          { \fp_eval:n {#3} }
-          { \fp_eval:n {#4} }
-      }
-  }
-\cs_new_protected:Npn \@@_draw_color_cmyk_aux:nnnn #1#2#3#4
-  {
     \@@_draw_literal:n
       { #1 ~ #2 ~ #3 ~ #4 ~ k ~ #1 ~ #2 ~ #3 ~ #4 ~ K }
   }
 \cs_new_protected:Npn \driver_draw_fill_cmyk:nnnn #1#2#3#4
   {
-    \@@_draw_literal:x
-      {
-        \fp_eval:n {#1} ~ \fp_eval:n {#2} ~
-        \fp_eval:n {#3} ~ \fp_eval:n {#4} ~
-        k
-      }
+    \@@_draw_literal:n { #1 ~ #2 ~ #3 ~ #4 ~ k }
   }
 \cs_new_protected:Npn \driver_draw_stroke_cmyk:nnnn #1#2#3#4
-  {
-    \@@_draw_literal:x
-      {
-        \fp_eval:n {#1} ~ \fp_eval:n {#2} ~
-        \fp_eval:n {#3} ~ \fp_eval:n {#4} ~
-        K
-      }
-  }
+  { \@@_draw_literal:n { #1 ~ #2 ~ #3 ~ #4 ~ K } }
 \cs_new_protected:Npn \driver_draw_color_gray:n #1
-  {
-    \use:x
-      { \@@_draw_color_gray_aux:n { \fp_eval:n {#1} } }
-  }
-\cs_new_protected:Npn \@@_draw_color_gray_aux:n #1
-  {
-    \@@_draw_literal:n { #1 ~ g ~ #1 ~ G }
-  }
+  { \@@_draw_literal:n { #1 ~ g ~ #1 ~ G } }
 \cs_new_protected:Npn \driver_draw_fill_gray:n #1
-  { \@@_draw_literal:x { \fp_eval:n {#1} ~ g } }
+  { \@@_draw_literal:n { #1 ~ g } }
 \cs_new_protected:Npn \driver_draw_stroke_gray:n #1
-  { \@@_draw_literal:x { \fp_eval:n {#1} ~ G } }
+  { \@@_draw_literal:n { #1 ~ G } }
 \cs_new_protected:Npn \driver_draw_color_rgb:nnn #1#2#3
   {
-    \use:x
-      {
-        \@@_draw_color_rgb_aux:nnn
-          { \fp_eval:n {#1} }
-          { \fp_eval:n {#2} }
-          { \fp_eval:n {#3} }
-      }
-  }
-\cs_new_protected:Npn \@@_draw_color_rgb_aux:nnn #1#2#3
-  {
     \@@_draw_literal:n
       { #1 ~ #2 ~ #3 ~ rg ~ #1 ~ #2 ~ #3 ~ RG }
   }
 \cs_new_protected:Npn \driver_draw_fill_rgb:nnn #1#2#3
-  {
-    \@@_draw_literal:x
-      { \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} ~ rg }
-  }
+  { \@@_draw_literal:n { #1 ~ #2 ~ #3 ~ rg } }
 \cs_new_protected:Npn \driver_draw_stroke_rgb:nnn #1#2#3
-  {
-    \@@_draw_literal:x
-      { \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} ~ RG }
-  }
+  { \@@_draw_literal:n { #1 ~ #2 ~ #3 ~ RG } }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
 % \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
 %
 % \begin{macro}{\driver_draw_transformcm:nnnnnn}
 %   The first four arguments here are floats (the affine matrix), the last
@@ -2200,8 +2112,7 @@
   {
     \@@_draw_literal:x
       {
-        \fp_eval:n {#1} ~ \fp_eval:n {#2} ~
-        \fp_eval:n {#3} ~ \fp_eval:n {#4} ~
+        #1 ~ #2 ~ #3 ~ #4 ~
         \dim_to_decimal_in_bp:n {#5} ~ \dim_to_decimal_in_bp:n {#6} ~
         cm
       }
@@ -2717,7 +2628,7 @@
 \cs_new_protected:Npn \driver_draw_linewidth:n #1
   { \@@_draw_scope:x { stroke-width=" \dim_to_decimal:n {#1} " } }
 \cs_new_protected:Npn \driver_draw_miterlimit:n #1
-  { \@@_draw_scope:x { stroke-miterlimit=" \fp_eval:n {#1} " } }
+  { \@@_draw_scope:x { stroke-miterlimit=" #1 " } }
 \cs_new_protected:Npn \driver_draw_cap_butt:
   { \@@_draw_scope:n { stroke-linecap="butt" } }
 \cs_new_protected:Npn \driver_draw_cap_round:

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -1,6 +1,6 @@
 % \iffalse meta-comment
 %
-%% File: l3expan.dtx Copyright (C) 1990-2017 The LaTeX3 project
+%% File: l3expan.dtx Copyright (C) 1990-2018 The LaTeX3 project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %
@@ -1064,7 +1064,7 @@
   {
       \fi:
     \fi:
-    \__msg_kernel_expandable_error:nnn { kernel } { bad-variable } {#2}
+    \__kernel_msg_expandable_error:nnn { kernel } { bad-variable } {#2}
     \exp_end:
   }
 %    \end{macrocode}
@@ -1527,7 +1527,7 @@
 %    error.
 %    \begin{macrocode}
   \cs_new:Npn ^^@
-    { \__msg_kernel_expandable_error:nn { kernel } { bad-exp-end-f } }
+    { \__kernel_msg_expandable_error:nn { kernel } { bad-exp-end-f } }
 %    \end{macrocode}
 %   The same but grabbing an argument to remove spaces and braces.
 %    \begin{macrocode}
@@ -1561,7 +1561,7 @@
 %   iterate through the comma list of variant argument specifiers, which
 %   we first convert to a string: the reason is explained later.
 %    \begin{macrocode}
-\__debug_patch:nnNNpn { \__debug_chk_cs_exist:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_cs_exist:N #1 } { }
 \cs_new_protected:Npn \cs_generate_variant:Nn #1#2
   {
     \@@_generate_variant:N #1
@@ -1642,7 +1642,7 @@
 \cs_new_protected:Npn \@@_generate_variant:nnNN #1#2#3#4
   {
     \if_meaning:w \c_false_bool #3
-      \__msg_kernel_error:nnx { kernel } { missing-colon }
+      \__kernel_msg_error:nnx { kernel } { missing-colon }
         { \token_to_str:c {#1} }
       \exp_after:wN \use_none_delimit_by_q_recursion_stop:w
     \fi:
@@ -1849,7 +1849,7 @@
     \exp_not:n
       {
         \q_mark
-        \__msg_kernel_error:nnxx { kernel } { variant-too-long }
+        \__kernel_msg_error:nnxx { kernel } { variant-too-long }
           {#5} { \token_to_str:N #3 }
         \use_none:nnn
         \q_stop
@@ -1864,7 +1864,7 @@
     \exp_not:n
       {
         \q_mark
-        \__msg_kernel_error:nnxxxx { kernel } { invalid-variant }
+        \__kernel_msg_error:nnxxxx { kernel } { invalid-variant }
           {#7} { \token_to_str:N #5 } {#1} {#2}
         \use_none:nnn
         \q_stop
@@ -1877,12 +1877,13 @@
     #3 \q_stop #4 #5 {#6} {#7}
     \exp_not:n
       {
-        \@@_generate_variant_loop_warning:nnxxxx { kernel } { invalid-variant }
+        \@@_generate_variant_loop_warning:nnxxxx
+          { kernel } { deprecated-variant }
           {#7} { \token_to_str:N #5 } {#1} {#2}
       }
   }
 \cs_new_protected:Npn \@@_generate_variant_loop_warning:nnxxxx
-  { \__msg_kernel_warning:nnxxxx }
+  { \__kernel_msg_warning:nnxxxx }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -1915,11 +1916,11 @@
 %   \cs{cs_new_protected:Npx}.  Then define the variant by
 %   combining the |\exp_args:N #3| variant and the base function.
 %    \begin{macrocode}
-\__debug_patch:nnNNpn
+\__kernel_patch:nnNNpn
   {
     \cs_if_free:NF #4
       {
-        \__debug_log:x
+        \__kernel_debug_log:x
           {
             Variant~\token_to_str:N #4~%
             already~defined;~ not~ changing~ it~ \msg_line_context:
@@ -2012,7 +2013,7 @@
 \cs_new_protected:Npn \@@_generate_variant:nnNnn #1#2#3#4#5
   {
     \if_meaning:w \c_false_bool #3
-      \__msg_kernel_error:nnx { kernel } { missing-colon }
+      \__kernel_msg_error:nnx { kernel } { missing-colon }
         { \token_to_str:c {#1} }
       \use_i_delimit_by_q_stop:nw
     \fi:
@@ -2032,7 +2033,7 @@
       \cs_if_exist_use:cTF { @@_generate_variant_#1_form:nnn }
         { {#3} {#4} {#5} }
         {
-          \__msg_kernel_error:nnxx
+          \__kernel_msg_error:nnxx
             { kernel } { conditional-form-unknown }
             {#1} { \token_to_str:c { #3 : #4 } }
         }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -1,6 +1,6 @@
 % \iffalse meta-comment
 %
-%% File: l3file.dtx Copyright (C) 1990-2017 The LaTeX3 Project
+%% File: l3file.dtx Copyright (C) 1990-2018 The LaTeX3 Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %
@@ -884,7 +884,7 @@
     \int_if_even:nF
       { 0 \tl_map_function:NN #2 \@@_name_quote_aux:n }
       {
-        \__msg_kernel_error:nnx
+        \__kernel_msg_error:nnx
           { kernel } { unbalanced-quote-in-filename } {#2}
       }
     \tl_remove_all:Nn #2 { " }
@@ -975,7 +975,7 @@
 \cs_new_protected:Npn \__file_missing:n #1
   {
     \__file_name_sanitize:nN {#1} \l__file_base_name_str
-    \__msg_kernel_error:nnx { kernel } { file-not-found }
+    \__kernel_msg_error:nnx { kernel } { file-not-found }
       { \l__file_base_name_str }
   }
 %    \end{macrocode}
@@ -1299,7 +1299,7 @@
     \seq_gpop:NNTF \g_@@_streams_seq \l_@@_stream_tl
       { \@@_open_stream:Nn #1 {#2} }
 %<*initex>
-      { \__msg_kernel_fatal:nn { kernel } { input-streams-exhausted } }
+      { \__kernel_msg_fatal:nn { kernel } { input-streams-exhausted } }
 %</initex>
 %<*package>
       {
@@ -1611,7 +1611,7 @@
     \seq_gpop:NNTF \g_@@_streams_seq \l_@@_stream_tl
       { \@@_open_stream:NV #1 \l__file_base_name_str }
 %<*initex>
-      { \__msg_kernel_fatal:nn { kernel } { output-streams-exhausted } }
+      { \__kernel_msg_fatal:nn { kernel } { output-streams-exhausted } }
 %</initex>
 %<*package>
       {
@@ -1912,7 +1912,7 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \iow_indent:n #1
   {
-    \__msg_kernel_error:nnnnn { kernel } { iow-indent }
+    \__kernel_msg_error:nnnnn { kernel } { iow-indent }
       { \iow_wrap:nnnN } { \iow_indent:n } {#1}
     #1
   }
@@ -1924,7 +1924,7 @@
   }
 \cs_new:Npn \@@_indent_error:n #1
   {
-    \__msg_kernel_expandable_error:nnnnn { kernel } { iow-indent }
+    \__kernel_msg_expandable_error:nnnnn { kernel } { iow-indent }
       { \iow_wrap:nnnN } { \iow_indent:n } {#1}
     #1
   }
@@ -2346,19 +2346,19 @@
 % \subsection{Messages}
 %
 %    \begin{macrocode}
-\__msg_kernel_new:nnnn { kernel } { file-not-found }
+\__kernel_msg_new:nnnn { kernel } { file-not-found }
   { File~'#1'~not~found. }
   {
     The~requested~file~could~not~be~found~in~the~current~directory,~
     in~the~TeX~search~path~or~in~the~LaTeX~search~path.
   }
-\__msg_kernel_new:nnn { kernel } { file-list }
+\__kernel_msg_new:nnn { kernel } { file-list }
   {
     >~File~List~<
     #1 \\
     .............
   }
-\__msg_kernel_new:nnnn { kernel } { input-streams-exhausted }
+\__kernel_msg_new:nnnn { kernel } { input-streams-exhausted }
   { Input~streams~exhausted }
   {
     TeX~can~only~open~up~to~16~input~streams~at~one~time.\\
@@ -2365,7 +2365,7 @@
     All~16~are~currently~in~use,~and~something~wanted~to~open~
     another~one.
   }
-\__msg_kernel_new:nnnn { kernel } { output-streams-exhausted }
+\__kernel_msg_new:nnnn { kernel } { output-streams-exhausted }
   { Output~streams~exhausted }
   {
     TeX~can~only~open~up~to~16~output~streams~at~one~time.\\
@@ -2372,12 +2372,12 @@
     All~16~are~currently~in~use,~and~something~wanted~to~open~
     another~one.
   }
-\__msg_kernel_new:nnnn { kernel } { unbalanced-quote-in-filename }
+\__kernel_msg_new:nnnn { kernel } { unbalanced-quote-in-filename }
   { Unbalanced~quotes~in~file~name~'#1'. }
   {
     File~names~must~contain~balanced~numbers~of~quotes~(").
   }
-\__msg_kernel_new:nnnn { kernel } { iow-indent }
+\__kernel_msg_new:nnnn { kernel } { iow-indent }
   { Only~#1 (arg~1)~allows~#2 }
   {
     The~command~#2 can~only~be~used~in~messages~
@@ -2397,17 +2397,12 @@
 %    \begin{macrocode}
 \tl_new:N \g_file_current_name_tl
 \tl_gset:Nn \g_file_current_name_tl { \g_file_curr_name_str }
-\__debug:TF
+\__kernel_deprecation_code:nn
   {
-    \tl_gput_right:Nn \g__debug_deprecation_on_tl
-      {
-        \__deprecation_error:Nnn \g_file_current_name_tl
-          { \g_file_curr_name_str } { 2018-12-31 }
-      }
-    \tl_gput_right:Nn \g__debug_deprecation_off_tl
-      { \tex_def:D \g_file_current_name_tl { \g_file_curr_name_str } }
+    \__deprecation_error:Nnn \g_file_current_name_tl
+      { \g_file_curr_name_str } { 2018-12-31 }
   }
-  { }
+  { \tex_def:D \g_file_current_name_tl { \g_file_curr_name_str } }
 %    \end{macrocode}
 % \end{variable}
 %
@@ -2415,7 +2410,7 @@
 % \begin{macro}[deprecated = 2018-12-31]{\file_path_remove:n}
 %   Wrapper functions to manage the search path.
 %    \begin{macrocode}
-\__debug_deprecation:nnNNpn { 2018-12-31 }
+\__kernel_patch_deprecation:nnNNpn { 2018-12-31 }
   { \seq_put_right:Nn \l_file_search_path_seq }
 \cs_new_protected:Npn \file_path_include:n #1
   {
@@ -2423,7 +2418,7 @@
     \seq_if_in:NVF \l_file_search_path_seq \l__file_full_name_str
       { \seq_put_right:NV \l_file_search_path_seq \l__file_full_name_str }
   }
-\__debug_deprecation:nnNNpn { 2018-12-31 }
+\__kernel_patch_deprecation:nnNNpn { 2018-12-31 }
   { \seq_remove_all:Nn \l_file_search_path_seq }
 \cs_new_protected:Npn \file_path_remove:n #1
   {
@@ -2437,7 +2432,7 @@
 % \begin{macro}[deprecated = 2018-12-31]{\file_add_path:nN}
 %   For removal after 2018-12-31.
 %    \begin{macrocode}
-\__debug_deprecation:nnNNpn { 2018-12-31 } { \file_get_full_name:nN }
+\__kernel_patch_deprecation:nnNNpn { 2018-12-31 } { \file_get_full_name:nN }
 \cs_new_protected:Npn \file_add_path:nN #1#2
   {
     \file_get_full_name:nN {#1} #2
@@ -2450,7 +2445,7 @@
 % \begin{macro}[added = 2012-06-24, updated = 2012-07-31, deprecated=2017-12-31]{\ior_get_str:NN}
 %   For removal after 2017-12-31.
 %    \begin{macrocode}
-\__debug_deprecation:nnNNpn { 2017-12-31 } { \ior_str_get:NN }
+\__kernel_patch_deprecation:nnNNpn { 2017-12-31 } { \ior_str_get:NN }
 \cs_new_protected:Npn \ior_get_str:NN      { \ior_str_get:NN }
 %    \end{macrocode}
 % \end{macro}
@@ -2458,7 +2453,7 @@
 % \begin{macro}[deprecated = 2018-12-31]{\file_list:}
 %   Renamed to \cs{file_log_list:}.  For removal after 2018-12-31.
 %    \begin{macrocode}
-\__debug_deprecation:nnNNpn { 2018-12-31 } { \file_log_list: }
+\__kernel_patch_deprecation:nnNNpn { 2018-12-31 } { \file_log_list: }
 \cs_new_protected:Npn \file_list:          { \file_log_list: }
 %    \end{macrocode}
 % \end{macro}
@@ -2467,13 +2462,13 @@
 %   {\ior_list_streams:, \ior_log_streams:, \iow_list_streams:, \iow_log_streams:}
 %   These got a more consistent naming.
 %    \begin{macrocode}
-\__debug_deprecation:nnNNpn { 2018-12-31 } { \ior_show_list: }
+\__kernel_patch_deprecation:nnNNpn { 2018-12-31 } { \ior_show_list: }
 \cs_new_protected:Npn \ior_list_streams:   { \ior_show_list: }
-\__debug_deprecation:nnNNpn { 2018-12-31 } { \ior_log_list: }
+\__kernel_patch_deprecation:nnNNpn { 2018-12-31 } { \ior_log_list: }
 \cs_new_protected:Npn \ior_log_streams:    { \ior_log_list: }
-\__debug_deprecation:nnNNpn { 2018-12-31 } { \iow_show_list: }
+\__kernel_patch_deprecation:nnNNpn { 2018-12-31 } { \iow_show_list: }
 \cs_new_protected:Npn \iow_list_streams:   { \iow_show_list: }
-\__debug_deprecation:nnNNpn { 2018-12-31 } { \iow_log_list: }
+\__kernel_patch_deprecation:nnNNpn { 2018-12-31 } { \iow_log_list: }
 \cs_new_protected:Npn \iow_log_streams:    { \iow_log_list: }
 %    \end{macrocode}
 % \end{macro}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3final.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3final.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3final.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %
@@ -175,7 +175,7 @@
         \if_meaning:w #1 ^^b3 ^^bc \else: % ij - U+0133 - ij
         \if_meaning:w #1 ^^ba ^^a8 \else: % ĺ - U+013A - lacute
         \if_meaning:w #1 ^^be ^^a9 \else: % ľ - U+013E - lcaron
-          \__msg_kernel_expandable_error:nn { kernel } { encoding-failure }
+          \__kernel_msg_expandable_error:nn { kernel } { encoding-failure }
         \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi:
       }
     \cs_new:cpn { __char_active_C5:N } #1
@@ -197,7 +197,7 @@
         \if_meaning:w #1 ^^ba ^^b9 \else: % ź - U+017A - zacute
         \if_meaning:w #1 ^^bc ^^bb \else: % ż - U+017C - zdotaccent
         \if_meaning:w #1 ^^be ^^ba \else: % ž - U+017E - zcaron
-          \__msg_kernel_expandable_error:nn { kernel } { encoding-failure }
+          \__kernel_msg_expandable_error:nn { kernel } { encoding-failure }
         \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi:
         \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi:
       }
@@ -206,7 +206,7 @@
         \if_meaning:w #1 ^^99 ^^b3 \else: % ș - U+0219 - scommaaccent
         \if_meaning:w #1 ^^9b ^^b5 \else: % ț - U+021B - tcommaaccent
         \if_meaning:w #1 ^^b7 ^^1a \else: % ȷ - U+0237 - dotlessj
-          \__msg_kernel_expandable_error:nn { kernel } { encoding-failure }
+          \__kernel_msg_expandable_error:nn { kernel } { encoding-failure }
         \fi: \fi: \fi:
       }
 %    \end{macrocode}
@@ -221,7 +221,7 @@
         \seq_put_right:Nx \l_char_active_seq
           { \exp_not:c { \char_generate:nn { "#1 } { 12 } } }
       }
-    \__msg_kernel_new:nnn { kernel } { encoding-failure }
+    \__kernel_msg_new:nnn { kernel } { encoding-failure }
       { Unknown~UTF-8~char }
 %    \end{macrocode}
 % All of the chars are lower case so give them the correct \tn{lccode}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -1,6 +1,6 @@
 % \iffalse meta-comment
 %
-%% File: l3flag.dtx Copyright (C) 2011-2017 The LaTeX3 Project
+%% File: l3flag.dtx Copyright (C) 2011-2018 The LaTeX3 Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %
@@ -64,7 +64,7 @@
 % It must expand to character tokens only, with no spaces.
 %
 % A typical use case of flags would be to keep track of whether an
-% exceptional condition has occured during expandable processing, and
+% exceptional condition has occurred during expandable processing, and
 % produce a meaningful (non-expandable) message after the end of the
 % expandable processing.  This is exemplified by \pkg{l3str-convert},
 % which for performance reasons performs conversions of individual
@@ -196,8 +196,8 @@
 %   When the option \texttt{check-declarations} is used, check for the
 %   function defined by \cs{flag_new:n}.
 %    \begin{macrocode}
-\__debug_patch:nnNNpn
-  { \exp_args:Nc \__debug_chk_var_exist:N { flag~#1 } } { }
+\__kernel_patch:nnNNpn
+  { \exp_args:Nc \__kernel_chk_var_exist:N { flag~#1 } } { }
 \cs_new_protected:Npn \flag_clear:n #1 { \@@_clear:wn 0 ; {#1} }
 \cs_new_protected:Npn \@@_clear:wn #1 ; #2
   {
@@ -243,7 +243,7 @@
 % \subsection{Expandable flag commands}
 %
 % \begin{macro}[EXP]{\@@_chk_exist:n}
-%   Analogue of \cs{__debug_chk_var_exist:N} for flags, and with an
+%   Analogue of \cs{__kernel_chk_var_exist:N} for flags, and with an
 %   expandable error.  We need to add checks by hand because flags are
 %   not implemented in terms of other variables.  Not all functions need
 %   to be patched since some are defined in terms of others.
@@ -254,7 +254,7 @@
     {
       \flag_if_exist:nF {#1}
         {
-          \__msg_kernel_expandable_error:nnn
+          \__kernel_msg_expandable_error:nnn
             { kernel } { bad-variable } { flag~#1~ }
         }
     }
@@ -278,7 +278,7 @@
 % \begin{macro}[EXP, pTF]{\flag_if_raised:n}
 %   Test if the flag has a non-zero height, by checking the |0| control sequence.
 %    \begin{macrocode}
-\__debug_patch_conditional:nNNpnn { \@@_chk_exist:n {#1} }
+\__kernel_patch_conditional:nNNpnn { \@@_chk_exist:n {#1} }
 \prg_new_conditional:Npnn \flag_if_raised:n #1 { p , T , F , TF }
   {
     \if_cs_exist:w flag~#1~0 \cs_end:
@@ -295,7 +295,7 @@
 %   Extract the value of the flag by going through all of the
 %   control sequences starting from |0|.
 %    \begin{macrocode}
-\__debug_patch:nnNNpn { \@@_chk_exist:n {#1} } { }
+\__kernel_patch:nnNNpn { \@@_chk_exist:n {#1} } { }
 \cs_new:Npn \flag_height:n #1 { \@@_height_loop:wn 0; {#1} }
 \cs_new:Npn \@@_height_loop:wn #1 ; #2
   {

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3format.ins
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3format.ins	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3format.ins	2018-02-23 21:54:14 UTC (rev 46720)
@@ -1,6 +1,6 @@
 \iffalse meta-comment
 
-File l3format.ins Copyright (C) 2011,2012,2014-2017 The LaTeX3 Project
+File l3format.ins Copyright (C) 2011,2012,2014-2018 The LaTeX3 Project
 
 It may be distributed and/or modified under the conditions of the
 LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -33,7 +33,7 @@
 
 \preamble
 
-Copyright (C) 1990-2017 The LaTeX3 Project
+Copyright (C) 1990-2018 The LaTeX3 Project
 
 It may be distributed and/or modified under the conditions of
 the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -83,6 +83,7 @@
         \from{l3fp-traps.dtx}   {initex}
         \from{l3fp-round.dtx}   {initex}
         \from{l3fp-parse.dtx}   {initex}
+        \from{l3fp-assign.dtx}  {initex}
         \from{l3fp-logic.dtx}   {initex}
         \from{l3fp-basics.dtx}  {initex}
         \from{l3fp-extended.dtx}{initex}
@@ -90,7 +91,6 @@
         \from{l3fp-trig.dtx}    {initex}
         \from{l3fp-convert.dtx} {initex}
         \from{l3fp-random.dtx}  {initex}
-        \from{l3fp-assign.dtx}  {initex}
         \from{l3sort.dtx}       {initex}
         \from{l3tl-build.dtx}   {initex}
         \from{l3tl-analysis.dtx}{initex}
@@ -97,7 +97,7 @@
         \from{l3regex.dtx}      {initex}
         \from{l3box.dtx}        {initex}
         \from{l3coffins.dtx}    {initex}
-        \from{l3color.dtx}      {initex}
+        \from{l3color-base.dtx} {initex}
         \from{l3sys.dtx}        {initex}
         \from{l3deprecation.dtx}{initex}
         \from{l3candidates.dtx} {initex}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 % \maketitle
 %
 % \begin{documentation}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -1,6 +1,6 @@
 % \iffalse meta-comment
 %
-%% File: l3fp-aux.dtx Copyright(C) 2011-2017 The LaTeX3 Project
+%% File: l3fp-aux.dtx Copyright(C) 2011-2018 The LaTeX3 Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %
@@ -203,6 +203,17 @@
 %
 % \subsection{Constants, and structure of floating points}
 %
+% \begin{macro}{\@@_misused:n}
+%   This receives a floating point object (floating point number or
+%   tuple) and generates an error stating that it was misused.  This is
+%   called when for instance an |fp| variable is left in the input
+%   stream and its contents reach \TeX{}'s stomach.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_misused:n #1
+  { \__kernel_msg_error:nnx { kernel } { misused-fp } { \fp_to_tl:n {#1} } }
+%    \end{macrocode}
+% \end{macro}
+%
 % \begin{macro}{\s_@@, \@@_chk:w}
 %   Floating points numbers all start with \cs{s_@@} \cs{@@_chk:w},
 %   where \cs{s_@@} is equal to the \TeX{} primitive \tn{relax}, and
@@ -214,10 +225,7 @@
 %    \begin{macrocode}
 \__scan_new:N \s_@@
 \cs_new_protected:Npn \@@_chk:w #1 ;
-  {
-    \__msg_kernel_error:nnx { kernel } { misused-fp }
-      { \fp_to_tl:n { \s_@@ \@@_chk:w #1 ; } }
-  }
+  { \@@_misused:n { \s_@@ \@@_chk:w #1 ; } }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -385,10 +393,9 @@
 %     \cs{@@_exp_after_f:nw} \Arg{tokens} \meta{floating point}
 %   \end{syntax}
 %   Places \meta{tokens} (empty in the case of \cs{@@_exp_after_o:w})
-%   between the \meta{floating point} and the \meta{more tokens}, then
-%   hits those tokens with either \texttt{o}-expansion (one
-%   \cs{exp_after:wN}) or \texttt{f}-expansion, and leaves the floating
-%   point number unchanged.
+%   between the \meta{floating point} and the following tokens, then
+%   hits those tokens with \texttt{o} or \texttt{f}-expansion, and
+%   leaves the floating point number unchanged.
 %
 %   We first distinguish normal floating points, which have a significand,
 %   from the much simpler special floating points.
@@ -459,21 +466,164 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[EXP]{\@@_exp_after_array_f:w}
+% \subsection{Other floating point types}
+%
+% \begin{macro}{\s_@@_tuple, \@@_tuple_chk:w}
+% \begin{variable}{\c_@@_empty_tuple_fp}
+%   Floating point tuples take the form \cs{s_@@_tuple}
+%   \cs{@@_tuple_chk:w} |{| \meta{fp 1} \meta{fp 2} \dots |}| |;| where
+%   each \meta{fp} is a floating point number or tuple, hence ends with
+%   |;| itself.  When a tuple is typeset, \cs{@@_tuple_chk:w} produces
+%   an error, just like usual floating point numbers.
+%   Tuples may have zero or one element.
+%    \begin{macrocode}
+\__scan_new:N \s_@@_tuple
+\cs_new_protected:Npn \@@_tuple_chk:w #1 ;
+  { \@@_misused:n { \s_@@_tuple \@@_tuple_chk:w #1 ; } }
+\tl_const:Nn \c_@@_empty_tuple_fp
+  { \s_@@_tuple \@@_tuple_chk:w { } ; }
+%    \end{macrocode}
+% \end{variable}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\@@_tuple_count:w, \@@_array_count:n}
+% \begin{macro}[EXP]{\@@_tuple_count_loop:Nw}
+%   Count the number of items in a tuple of floating points by counting
+%   semicolons.  The technique is very similar to \cs{tl_count:n}, but
+%   with the loop built-in.  Checking for the end of the loop is done
+%   with the |\use_none:n #1| construction.
+%    \begin{macrocode}
+\cs_new:Npn \@@_array_count:n #1
+  { \@@_tuple_count:w \s_@@_tuple \@@_tuple_chk:w {#1} ; }
+\cs_new:Npn \@@_tuple_count:w \s_@@_tuple \@@_tuple_chk:w #1 ;
+  {
+    \__int_value:w \__int_eval:w 0
+      \@@_tuple_count_loop:Nw #1 { ? \__prg_break: } ;
+      \__prg_break_point:
+    \__int_eval_end:
+  }
+\cs_new:Npn \@@_tuple_count_loop:Nw #1#2;
+  { \use_none:n #1 + 1 \@@_tuple_count_loop:Nw }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\@@_if_type_fp:NTwFw}
+%   Used as \cs{@@_if_type_fp:NTwFw} \meta{marker} \Arg{true code}
+%   \cs{s__fp} \Arg{false code} \cs{q_stop}, this test whether the
+%   \meta{marker} is \cs{s_@@} or not and runs the appropriate
+%   \meta{code}.  The very unusual syntax is for optimization purposes
+%   as that function is used for all floating point operations.
+%    \begin{macrocode}
+\cs_new:Npn \@@_if_type_fp:NTwFw #1 \s_@@ #2 #3 \q_stop {#2}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\@@_array_if_all_fp:nTF, \@@_array_if_all_fp_loop:w}
+%   True if all items are floating point numbers.  Used for |min|.
+%    \begin{macrocode}
+\cs_new:Npn \@@_array_if_all_fp:nTF #1
+  {
+    \@@_array_if_all_fp_loop:w #1 { \s_@@ \__prg_break: } ;
+    \__prg_break_point: \use_i:nn
+  }
+\cs_new:Npn \@@_array_if_all_fp_loop:w #1#2 ;
+  {
+    \@@_if_type_fp:NTwFw
+      #1 \@@_array_if_all_fp_loop:w
+      \s_@@ { \__prg_break:n \use_iii:nnn }
+      \q_stop
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[EXP]
+%   {\@@_type_from_scan:N, \@@_type_from_scan_other:N, \@@_type_from_scan:w}
+%   Used as \cs{@@_type_from_scan:N} \meta{token}.
+%   Grabs the pieces of the stringified \meta{token} which lies after
+%   the first |s__fp|.  If the \meta{token} does not contain that
+%   string, the result is |_?|.
+%    \begin{macrocode}
+\cs_new:Npn \@@_type_from_scan:N #1
+  {
+    \@@_if_type_fp:NTwFw
+      #1 { }
+      \s_@@ { \@@_type_from_scan_other:N #1 }
+      \q_stop
+  }
+\cs_new:Npx \@@_type_from_scan_other:N #1
+  {
+    \exp_not:N \exp_after:wN \exp_not:N \@@_type_from_scan:w
+    \exp_not:N \token_to_str:N #1 \exp_not:N \q_mark
+      \tl_to_str:n { s_@@ _? } \exp_not:N \q_mark \exp_not:N \q_stop
+  }
+\use:x
+  {
+    \cs_new:Npn \exp_not:N \@@_type_from_scan:w
+      ##1 \tl_to_str:n { s_@@ } ##2 \exp_not:N \q_mark ##3 \exp_not:N \q_stop
+      {##2}
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\@@_change_func_type:NNN}
+% \begin{macro}[EXP]{\@@_change_func_type_aux:w, \@@_change_func_type_chk:NNN}
+%   Arguments are \meta{type marker} \meta{function} \meta{recovery}.
+%   This gives the function obtained by placing the type after |@@|.  If
+%   the function is not defined then \meta{recovery} \meta{function} is
+%   used instead; however that test is not run when the \meta{type
+%   marker} is \cs{s_@@}.
+%    \begin{macrocode}
+\cs_new:Npn \@@_change_func_type:NNN #1#2#3
+  {
+    \@@_if_type_fp:NTwFw
+      #1 #2
+      \s_@@
+        {
+          \exp_after:wN \@@_change_func_type_chk:NNN
+          \cs:w
+            @@ \@@_type_from_scan_other:N #1
+            \exp_after:wN \@@_change_func_type_aux:w \token_to_str:N #2
+          \cs_end:
+          #2 #3
+        }
+      \q_stop
+  }
+\exp_last_unbraced:NNNNo
+  \cs_new:Npn \@@_change_func_type_aux:w #1 { \tl_to_str:n { @@ } } { }
+\cs_new:Npn \@@_change_func_type_chk:NNN #1#2#3
+  {
+    \if_meaning:w \scan_stop: #1
+      \exp_after:wN #3 \exp_after:wN #2
+    \else:
+      \exp_after:wN #1
+    \fi:
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\@@_exp_after_any_f:Nnw, \@@_exp_after_any_f:nw}
 % \begin{macro}[EXP]{\@@_exp_after_stop_f:nw}
-%   \begin{syntax}
-%     \cs{@@_exp_after_array_f:w}
-%       \meta{fp_1} |;|
-%       \ldots{}
-%       \meta{fp_n} |;|
-%       \cs{s_@@_stop}
-%   \end{syntax}
+%   The |Nnw| function simply dispatches to the appropriate
+%   \cs[no-index]{@@_exp_after\ldots{}_f:nw} with \enquote{\ldots{}}
+%   (either empty or |_|\meta{type}) extracted from |#1|, which should
+%   start with |\s__fp|.  If it doesn't start with |\s__fp| the function
+%   \cs{@@_exp_after_?_f:nw} defined in \pkg{l3fp-parse} gives an error;
+%   another special \meta{type} is |stop|, useful for loops, see below.
+%   The |nw| function has an important optimization for floating points
+%   numbers; it also fetches its type marker |#2| from the floating
+%   point.
 %    \begin{macrocode}
-\cs_new:Npn \@@_exp_after_array_f:w #1
+\cs_new:Npn \@@_exp_after_any_f:Nnw #1
+  { \cs:w @@_exp_after \@@_type_from_scan_other:N #1 _f:nw \cs_end: }
+\cs_new:Npn \@@_exp_after_any_f:nw #1#2
   {
-    \cs:w @@_exp_after \@@_type_from_scan:N #1 _f:nw \cs_end:
-      { \@@_exp_after_array_f:w }
-    #1
+    \@@_if_type_fp:NTwFw
+      #2 \@@_exp_after_f:nw
+      \s_@@ { \@@_exp_after_any_f:Nnw #2 }
+      \q_stop
+    {#1} #2
   }
 \cs_new_eq:NN \@@_exp_after_stop_f:nw \use_none:nn
 %    \end{macrocode}
@@ -480,6 +630,34 @@
 % \end{macro}
 % \end{macro}
 %
+% \begin{macro}[EXP]{\@@_exp_after_tuple_f:nw, \@@_exp_after_array_f:w}
+%   The loop works by using the |n| argument of
+%   \cs{@@_exp_after_any_f:nw} to place the loop macro after the next
+%   item in the tuple and expand it.
+%   \begin{quote}
+%     \cs{@@_exp_after_array_f:w}\\
+%       \meta{fp_1} |;|\\
+%       \ldots{}\\
+%       \meta{fp_n} |;|\\
+%       \cs{s_@@_stop}
+%   \end{quote}
+%    \begin{macrocode}
+\cs_new:Npn \@@_exp_after_tuple_f:nw #1 \s_@@_tuple \@@_tuple_chk:w #2 ;
+  {
+    \exp_after:wN \s_@@_tuple
+    \exp_after:wN \@@_tuple_chk:w
+    \exp_after:wN {
+      \exp:w \exp_end_continue_f:w
+      \@@_exp_after_array_f:w #2 \s_@@_stop
+    \exp_after:wN }
+    \exp_after:wN ;
+    \exp:w \exp_end_continue_f:w #1
+  }
+\cs_new:Npn \@@_exp_after_array_f:w
+  { \@@_exp_after_any_f:nw { \@@_exp_after_array_f:w } }
+%    \end{macrocode}
+% \end{macro}
+%
 % \subsection{Packing digits}
 %
 % When a positive integer |#1| is known to be less than $10^8$, the
@@ -1011,28 +1189,6 @@
 % \end{macro}
 % \end{macro}
 %
-% \subsection{Length of a floating point array}
-%
-% \begin{macro}[EXP]{\@@_array_count:n}
-% \begin{macro}[EXP]{\@@_array_count_loop:Nw}
-%   Count the number of items in an array of floating points.  The
-%   technique is very similar to \cs{tl_count:n}, but with the loop
-%   built-in.  Checking for the end of the loop is done with the
-%   |\use_none:n #1| construction.
-%    \begin{macrocode}
-\cs_new:Npn \@@_array_count:n #1
-  {
-    \__int_value:w \__int_eval:w 0
-      \@@_array_count_loop:Nw #1 { ? \__prg_break: } ;
-      \__prg_break_point:
-    \__int_eval_end:
-  }
-\cs_new:Npn \@@_array_count_loop:Nw #1#2;
-  { \use_none:n #1 + 1 \@@_array_count_loop:Nw }
-%    \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
 % \subsection{\texttt{x}-like expansion expandably}
 %
 % \begin{macro}[EXP]{\@@_expand:n}
@@ -1064,16 +1220,30 @@
 % \end{macro}
 % \end{macro}
 %
+% \subsection{Name of a function from its \pkg{l3fp-parse} name}
+%
+% \begin{macro}[EXP]{\@@_func_to_name:N, \@@_func_to_name_aux:w}
+%   The goal is to convert for instance \cs{@@_sin_o:w} to |sin|.
+%   This is used in error messages hence does not need to be fast.
+%    \begin{macrocode}
+\cs_new:Npn \@@_func_to_name:N #1
+  { \exp_last_unbraced:Nf \@@_func_to_name_aux:w { \cs_to_str:N #1 } X }
+\cs_set_protected:Npn \@@_tmp:w #1 #2
+  { \cs_new:Npn \@@_func_to_name_aux:w ##1 #1 ##2 #2 ##3 X {##2} }
+\exp_args:Nff \@@_tmp:w { \tl_to_str:n { @@_ } } { \tl_to_str:n { _o: } }
+%    \end{macrocode}
+% \end{macro}
+%
 % \subsection{Messages}
 %
 % Using a floating point directly is an error.
 %    \begin{macrocode}
-\__msg_kernel_new:nnnn { kernel } { misused-fp }
+\__kernel_msg_new:nnnn { kernel } { misused-fp }
   { A~floating~point~with~value~'#1'~was~misused. }
   {
     To~obtain~the~value~of~a~floating~point~variable,~use~
     '\token_to_str:N \fp_to_decimal:N',~
-    '\token_to_str:N \fp_to_scientific:N',~or~other~
+    '\token_to_str:N \fp_to_tl:N',~or~other~
     conversion~functions.
   }
 %    \end{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -1,6 +1,6 @@
 % \iffalse meta-comment
 %
-%% File: l3fp-basics.dtx Copyright (C) 2011-2014,2016,2017 The LaTeX3 Project
+%% File: l3fp-basics.dtx Copyright (C) 2011-2014,2016-2018 The LaTeX3 Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %
@@ -2068,7 +2068,75 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \subsection{Operations on tuples}
+%
+% \begin{macro}[EXP]{\@@_tuple_set_sign_o:w}
+% \begin{macro}[EXP]{\@@_tuple_set_sign_aux_o:Nnw, \@@_tuple_set_sign_aux_o:w}
+%   Two cases: |abs(|\meta{tuple}|)| for which |#1| is $0$ (invalid for
+%   tuples) and |-|\meta{tuple} for which |#1| is $2$.  In that case,
+%   map over all items in the tuple an auxiliary that dispatches to the
+%   type-appropriate sign-flipping function.
 %    \begin{macrocode}
+\cs_new:Npn \@@_tuple_set_sign_o:w #1
+  {
+    \if_meaning:w 2 #1
+      \exp_after:wN \@@_tuple_set_sign_aux_o:Nnw
+    \fi:
+    \@@_invalid_operation_o:nw { abs }
+  }
+\cs_new:Npn \@@_tuple_set_sign_aux_o:Nnw #1#2#3 @
+  { \@@_tuple_map_o:nw \@@_tuple_set_sign_aux_o:w #3 }
+\cs_new:Npn \@@_tuple_set_sign_aux_o:w #1#2 ;
+  {
+    \@@_change_func_type:NNN #1 \@@_set_sign_o:w
+      \@@_parse_apply_unary_error:NNw
+    2 #1 #2 ; @
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\@@_*_tuple_o:ww, \@@_tuple_*_o:ww, \@@_tuple_/_o:ww}
+%   For \meta{number}|*|\meta{tuple} and \meta{tuple}|*|\meta{number}
+%   and \meta{tuple}|/|\meta{number}, loop through the \meta{tuple} some
+%   code that multiplies or divides by the appropriate \meta{number}.
+%   Importantly we need to dispatch according to the type, and we make
+%   sure to apply the operator in the correct order.
+%    \begin{macrocode}
+\cs_new:cpn { @@_*_tuple_o:ww } #1 ;
+  { \@@_tuple_map_o:nw { \@@_binary_type_o:Nww * #1 ; } }
+\cs_new:cpn { @@_tuple_*_o:ww } #1 ; #2 ;
+  { \@@_tuple_map_o:nw { \@@_binary_rev_type_o:Nww * #2 ; } #1 ; }
+\cs_new:cpn { @@_tuple_/_o:ww } #1 ; #2 ;
+  { \@@_tuple_map_o:nw { \@@_binary_rev_type_o:Nww / #2 ; } #1 ; }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\@@_tuple_+_tuple_o:ww, \@@_tuple_-_tuple_o:ww}
+%   Check the two tuples have the same number of items and map through
+%   these a helper that dispatches appropriately depending on the types.
+%   This means |(1,2)+((1,1),2)| gives |(nan,4)|.
+%    \begin{macrocode}
+\cs_set_protected:Npn \@@_tmp:w #1
+  {
+    \cs_new:cpn { @@_tuple_#1_tuple_o:ww }
+        \s_@@_tuple \@@_tuple_chk:w ##1 ;
+        \s_@@_tuple \@@_tuple_chk:w ##2 ;
+      {
+        \int_compare:nNnTF
+          { \@@_array_count:n {##1} } = { \@@_array_count:n {##2} }
+          { \@@_tuple_mapthread_o:nww { \@@_binary_type_o:Nww #1 } }
+          { \@@_invalid_operation_o:nww #1 }
+        \s_@@_tuple \@@_tuple_chk:w {##1} ;
+        \s_@@_tuple \@@_tuple_chk:w {##2} ;
+      }
+  }
+\@@_tmp:w +
+\@@_tmp:w -
+%    \end{macrocode}
+% \end{macro}
+%
+%    \begin{macrocode}
 %</initex|package>
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -1,6 +1,6 @@
 % \iffalse meta-comment
 %
-%% File: l3fp-convert.dtx Copyright(C) 2011-2017 The LaTeX3 Project
+%% File: l3fp-convert.dtx Copyright(C) 2011-2018 The LaTeX3 Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %
@@ -61,6 +61,39 @@
 %<@@=fp>
 %    \end{macrocode}
 %
+% \subsection{Dealing with tuples}
+%
+% \begin{macro}[EXP]
+%   {\@@_tuple_convert:Nw, \@@_tuple_convert_loop:nNw, \@@_tuple_convert_end:w}
+%   The first argument is for instance \cs{@@_to_tl_dispatch:w}, which
+%   converts any floating point object to the appropriate
+%   representation.  We loop through all items, putting |,~| between all
+%   of them and making sure to remove the leading |,~|.
+%    \begin{macrocode}
+\cs_new:Npn \@@_tuple_convert:Nw #1 \s_@@_tuple \@@_tuple_chk:w #2 ;
+  {
+    \int_case:nnF { \@@_array_count:n {#2} }
+      {
+        { 0 } { ( ) }
+        { 1 } { \@@_tuple_convert_end:w @ { #1 #2 , } }
+      }
+      {
+        \@@_tuple_convert_loop:nNw { } #1
+          #2 { ? \@@_tuple_convert_end:w } ;
+          @ { \use_none:nn }
+      }
+  }
+\cs_new:Npn \@@_tuple_convert_loop:nNw #1#2#3#4; #5 @ #6
+  {
+    \use_none:n #3
+    \exp_args:Nf \@@_tuple_convert_loop:nNw { #2 #3#4 ; } #2 #5
+      @ { #6 , ~ #1 }
+  }
+\cs_new:Npn \@@_tuple_convert_end:w #1 @ #2
+  { \exp_after:wN ( \exp:w \exp_end_continue_f:w #2 ) }
+%    \end{macrocode}
+% \end{macro}
+%
 % \subsection{Trimming trailing zeros}
 %
 % \begin{macro}[EXP]{\@@_trim_zeros:w}
@@ -104,8 +137,28 @@
 % \end{macro}
 %
 % \begin{macro}[EXP]
+%   {\@@_to_scientific_dispatch:w, \@@_to_scientific_recover:w, \@@_tuple_to_scientific:w}
+%   We allow tuples.
+%    \begin{macrocode}
+\cs_new:Npn \@@_to_scientific_dispatch:w #1
+  {
+    \@@_change_func_type:NNN
+      #1 \@@_to_scientific:w \@@_to_scientific_recover:w
+    #1
+  }
+\cs_new:Npn \@@_to_scientific_recover:w #1 #2 ;
+  {
+    \@@_error:nffn { fp-unknown-type } { \tl_to_str:n { #2 ; } } { } { }
+    nan
+  }
+\cs_new:Npn \@@_tuple_to_scientific:w
+  { \@@_tuple_convert:Nw \@@_to_scientific_dispatch:w }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[EXP]
 %   {
-%     \@@_to_scientific_dispatch:w,
+%     \@@_to_scientific:w,
 %     \@@_to_scientific_normal:wnnnnn,
 %     \@@_to_scientific_normal:wNw
 %   }
@@ -122,7 +175,7 @@
 %   second step grab the first digit (previously hidden in braces) to
 %   order the various parts correctly.
 %    \begin{macrocode}
-\cs_new:Npn \@@_to_scientific_dispatch:w \s_@@ \@@_chk:w #1#2
+\cs_new:Npn \@@_to_scientific:w \s_@@ \@@_chk:w #1#2
   {
     \if_meaning:w 2 #2 \exp_after:wN - \exp:w \exp_end_continue_f:w \fi:
     \if_case:w #1 \exp_stop_f:
@@ -178,13 +231,33 @@
 % \end{macro}
 %
 % \begin{macro}[EXP]
+%   {\@@_to_decimal_dispatch:w, \@@_to_decimal_recover:w, \@@_tuple_to_decimal:w}
+%   We allow tuples.
+%    \begin{macrocode}
+\cs_new:Npn \@@_to_decimal_dispatch:w #1
+  {
+    \@@_change_func_type:NNN
+      #1 \@@_to_decimal:w \@@_to_decimal_recover:w
+    #1
+  }
+\cs_new:Npn \@@_to_decimal_recover:w #1 #2 ;
+  {
+    \@@_error:nffn { fp-unknown-type } { \tl_to_str:n { #2 ; } } { } { }
+    nan
+  }
+\cs_new:Npn \@@_tuple_to_decimal:w
+  { \@@_tuple_convert:Nw \@@_to_decimal_dispatch:w }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[EXP]
 %   {
-%     \@@_to_decimal_dispatch:w,
+%     \@@_to_decimal:w,
 %     \@@_to_decimal_normal:wnnnnn,
 %     \@@_to_decimal_large:Nnnw,
 %     \@@_to_decimal_huge:wnnnn,
 %   }
-%   The structure is similar to \cs{@@_to_scientific_dispatch:w}.
+%   The structure is similar to \cs{@@_to_scientific:w}.
 %   Insert |-| for
 %   negative numbers.  Zero gives $0$, $\pm\infty$ and \nan{} yield an
 %   \enquote{invalid operation} exception; note that $\pm\infty$
@@ -198,7 +271,7 @@
 %   non-positive, the result should be $0.\meta{zeros}\meta{digits}$,
 %   trimmed.
 %    \begin{macrocode}
-\cs_new:Npn \@@_to_decimal_dispatch:w \s_@@ \@@_chk:w #1#2
+\cs_new:Npn \@@_to_decimal:w \s_@@ \@@_chk:w #1#2
   {
     \if_meaning:w 2 #2 \exp_after:wN - \exp:w \exp_end_continue_f:w \fi:
     \if_case:w #1 \exp_stop_f:
@@ -275,9 +348,24 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}[EXP]{\@@_to_tl_dispatch:w, \@@_to_tl_recover:w, \@@_tuple_to_tl:w}
+%   We allow tuples.
+%    \begin{macrocode}
+\cs_new:Npn \@@_to_tl_dispatch:w #1
+  { \@@_change_func_type:NNN #1 \@@_to_tl:w \@@_to_tl_recover:w #1 }
+\cs_new:Npn \@@_to_tl_recover:w #1 #2 ;
+  {
+    \@@_error:nffn { fp-unknown-type } { \tl_to_str:n { #2 ; } } { } { }
+    nan
+  }
+\cs_new:Npn \@@_tuple_to_tl:w
+  { \@@_tuple_convert:Nw \@@_to_tl_dispatch:w }
+%    \end{macrocode}
+% \end{macro}
+%
 % \begin{macro}[EXP]
 %   {
-%     \@@_to_tl_dispatch:w, \@@_to_tl_normal:nnnnn,
+%     \@@_to_tl:w, \@@_to_tl_normal:nnnnn,
 %     \@@_to_tl_scientific:wnnnnn, \@@_to_tl_scientific:wNw
 %   }
 %   A structure similar to \cs{@@_to_scientific_dispatch:w} and
@@ -286,7 +374,7 @@
 %   in decimal notation if the exponent is in the range $[-2,16]$, and
 %   otherwise use scientific notation.
 %    \begin{macrocode}
-\cs_new:Npn \@@_to_tl_dispatch:w \s_@@ \@@_chk:w #1#2
+\cs_new:Npn \@@_to_tl:w \s_@@ \@@_chk:w #1#2
   {
     \if_meaning:w 2 #2 \exp_after:wN - \exp:w \exp_end_continue_f:w \fi:
     \if_case:w #1 \exp_stop_f:
@@ -327,20 +415,40 @@
 % \subsection{Convert to dimension or integer}
 %
 % \begin{macro}[EXP]{\fp_to_dim:N, \fp_to_dim:c, \fp_to_dim:n}
-%   These three public functions rely on \cs{fp_to_decimal:n}
-%   internally.
+% \begin{macro}[EXP]{\@@_to_dim_dispatch:w, \@@_to_dim_recover:w, \@@_to_dim:w}
+%   All three public variants are based on the same
+%   \cs{@@_to_dim_dispatch:w} after evaluating their argument to an
+%   internal floating point.
+%   We only allow floating point numbers, not tuples.
 %    \begin{macrocode}
 \cs_new:Npn \fp_to_dim:N #1
-  { \fp_to_decimal:N #1 pt }
+  { \exp_after:wN \@@_to_dim_dispatch:w #1 }
 \cs_generate_variant:Nn \fp_to_dim:N { c }
-\cs_new:Npn \fp_to_dim:n #1
-  { \fp_to_decimal:n {#1} pt }
+\cs_new:Npn \fp_to_dim:n
+  {
+    \exp_after:wN \@@_to_dim_dispatch:w
+    \exp:w \exp_end_continue_f:w \@@_parse:n
+  }
+\cs_new:Npn \@@_to_dim_dispatch:w #1#2 ;
+  {
+    \@@_change_func_type:NNN #1 \@@_to_dim:w \@@_to_dim_recover:w
+    #1 #2 ;
+  }
+\cs_new:Npn \@@_to_dim_recover:w #1
+  { \@@_invalid_operation:nnw { 0pt } { fp_to_dim } }
+\cs_new:Npn \@@_to_dim:w #1 ; { \@@_to_decimal:w #1 ; pt }
 %    \end{macrocode}
 % \end{macro}
+% \end{macro}
 %
 % \begin{macro}[EXP]{\fp_to_int:N, \fp_to_int:c, \fp_to_int:n}
-%   These three public functions evaluate their argument, then pass it
-%   to \cs{fp_to_int_dispatch:w}.
+% \begin{macro}[EXP]{\@@_to_int_dispatch:w, \@@_to_int_recover:w}
+%   For the most part identical to \cs{fp_to_dim:N} but without |pt|,
+%   and where \cs{@@_to_int:w} does more work.
+%   To convert to an integer, first round to $0$ places (to the nearest
+%   integer), then express the result as a decimal number: the
+%   definition of \cs{@@_to_decimal_dispatch:w} is such that there are no
+%   trailing dot nor zero.
 %    \begin{macrocode}
 \cs_new:Npn \fp_to_int:N #1 { \exp_after:wN \@@_to_int_dispatch:w #1 }
 \cs_generate_variant:Nn \fp_to_int:N { c }
@@ -349,22 +457,21 @@
     \exp_after:wN \@@_to_int_dispatch:w
     \exp:w \exp_end_continue_f:w \@@_parse:n
   }
-%    \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[EXP]{\@@_to_int_dispatch:w}
-%   To convert to an integer, first round to $0$ places (to the nearest
-%   integer), then express the result as a decimal number: the
-%   definition of \cs{@@_to_decimal_dispatch:w} is such that there are no
-%   trailing dot nor zero.
-%    \begin{macrocode}
-\cs_new:Npn \@@_to_int_dispatch:w #1;
+\cs_new:Npn \@@_to_int_dispatch:w #1#2 ;
   {
-    \exp_after:wN \@@_to_decimal_dispatch:w \exp:w \exp_end_continue_f:w
+    \@@_change_func_type:NNN #1 \@@_to_int:w \@@_to_int_recover:w
+    #1 #2 ;
+  }
+\cs_new:Npn \@@_to_int_recover:w #1
+  { \@@_invalid_operation:nnw { 0 } { fp_to_int } }
+\cs_new:Npn \@@_to_int:w #1;
+  {
+    \exp_after:wN \@@_to_decimal:w \exp:w \exp_end_continue_f:w
     \@@_round:Nwn \@@_round_to_nearest:NNN #1; { 0 }
   }
 %    \end{macrocode}
 % \end{macro}
+% \end{macro}
 %
 % \subsection{Convert from a dimension}
 %
@@ -390,7 +497,7 @@
 %   performed by \cs{@@_mul_npos_o:Nww}, and cancelled by
 %   \cs{prg_do_nothing:} here.
 %    \begin{macrocode}
-\__debug_patch_args:nNNpn { { (#1) } }
+\__kernel_patch_args:nNNpn { { (#1) } }
 \cs_new:Npn \dim_to_fp:n #1
   {
     \exp_after:wN \@@_from_dim_test:ww

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -1,6 +1,6 @@
 % \iffalse meta-comment
 %
-%% File: l3fp-logic.dtx Copyright (C) 2011-2017 The LaTeX3 Project
+%% File: l3fp-logic.dtx Copyright (C) 2011-2018 The LaTeX3 Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %
@@ -344,7 +344,7 @@
       }
       {
         \token_if_eq_meaning:NNTF #2 0
-          { \__msg_kernel_expandable_error:nnn { kernel } { zero-step } {#6} }
+          { \__kernel_msg_expandable_error:nnn { kernel } { zero-step } {#6} }
           {
             \@@_error:nnfn { fp-bad-step } { }
               { \fp_to_tl:n { \s_@@ \@@_chk:w #2#3#4 ; } } {#6}
@@ -410,15 +410,16 @@
 % \end{macro}
 %
 %    \begin{macrocode}
-\__msg_kernel_new:nnn { kernel } { fp-bad-step }
+\__kernel_msg_new:nnn { kernel } { fp-bad-step }
   { Invalid~step~size~#2~in~step~function~#3. }
-\__msg_kernel_new:nnn { kernel } { fp-tiny-step }
+\__kernel_msg_new:nnn { kernel } { fp-tiny-step }
   { Tiny~step~size~(#1+#2=#1)~in~step~function~#3. }
 %    \end{macrocode}
 %
 % \subsection{Extrema}
 %
-% \begin{macro}[EXP]{\@@_minmax_o:Nw}
+% \begin{macro}[EXP]{\@@_minmax_o:Nw, \@@_minmax_aux_o:Nw}
+%   First check all operands are floating point numbers.
 %   The argument~|#1| is $2$~to find the maximum of an array~|#2| of
 %   floating point numbers, and $0$~to find the minimum.  We read
 %   numbers sequentially, keeping track of the largest (smallest) number
@@ -430,8 +431,14 @@
 %   fp-like trailing marker breaks the loop correctly: see the precise
 %   definition of \cs{@@_minmax_loop:Nww}.
 %    \begin{macrocode}
-\cs_new:Npn \@@_minmax_o:Nw #1#2 @
+\cs_new:Npn \@@_minmax_o:Nw #1
   {
+    \@@_parse_function_all_fp_o:fnw
+      { \token_if_eq_meaning:NNTF 0 #1 { min } { max } }
+      { \@@_minmax_aux_o:Nw #1 }
+  }
+\cs_new:Npn \@@_minmax_aux_o:Nw #1#2 @
+  {
     \if_meaning:w 0 #1
       \exp_after:wN \@@_minmax_loop:Nww \exp_after:wN +
     \else:
@@ -581,7 +588,7 @@
         \@@_parse_operand:Nw \c_@@_prec_colon_int
         \@@_parse_expand:w
     \else:
-      \__msg_kernel_expandable_error:nnnn
+      \__kernel_msg_expandable_error:nnnn
         { kernel } { fp-missing } { : } { ~for~?: }
       \exp_after:wN \@@_parse_continue:NwN
       \exp_after:wN #1

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -1,6 +1,6 @@
 % \iffalse meta-comment
 %
-%% File: l3fp-parse.dtx Copyright (C) 2011-2017 The LaTeX3 Project
+%% File: l3fp-parse.dtx Copyright (C) 2011-2018 The LaTeX3 Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -28,7 +28,7 @@
 %</driver>
 % \fi
 %
-% \title{The \textsf{l3fp-parse} package
+% \title{The \textsf{l3fp-parse} package\\
 %   Floating point expression parsing}
 % \author{^^A
 %  The \LaTeX3 Project\thanks
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %
@@ -65,12 +65,17 @@
 % (almost) right the first time.  Let us first describe our goal, then
 % discuss the design precisely before writing any code.
 %
+% In this file at least, a \meta{floating point object} is a floating
+% point number or tuple.  This can be extended to anything that starts
+% with \cs{s_@@} or \cs{s_@@_\meta{type}} and ends with |;| with some
+% internal structure that depends on the \meta{type}.
+%
 % \begin{macro}[EXP]{\@@_parse:n}
 %   \begin{syntax}
 %     \cs{@@_parse:n} \Arg{fpexpr}
 %   \end{syntax}
 %   Evaluates the \meta{floating point expression} and leaves the result
-%   in the input stream as an internal floating point number.  This
+%   in the input stream as a floating point object.  This
 %   function forms the basis of almost all public \pkg{l3fp} functions.
 %   During evaluation, each token is fully \texttt{f}-expanded.
 %
@@ -83,33 +88,8 @@
 %   \end{texnote}
 % \end{macro}
 %
-% Floating point expressions are composed of numbers, given in various
-% forms, infix operators, such as |+|, |**|, or~|,| (which joins two
-% numbers into a list), and prefix operators, such as the unary~|-|,
-% functions, or opening parentheses.  Here is a list of precedences
-% which control the order of evaluation (some distinctions are
-% irrelevant for the order of evaluation, but serve as signals), from
-% the tightest binding to the loosest binding.
-% \begin{itemize}
-% \item[16] Function calls with multiple arguments.
-% \item[15] Function calls expecting exactly one argument.
-% \item[13/14] Binary |**| and~|^| (right to left).
-% \item[12] Unary |+|, |-|, |!| (right to left).
-% \item[10] Binary |*|, |/|, and juxtaposition (implicit~|*|).
-% \item[9] Binary |+| and~|-|.
-% \item[7] Comparisons.
-% \item[6] Logical \texttt{and}, denoted by~|&&|.
-% \item[5] Logical \texttt{or}, denoted by~\verb*+||+.
-% \item[4] Ternary operator |?:|, piece~|?|.
-% \item[3] Ternary operator |?:|, piece~|:|.
-% \item[2] Commas, and parentheses accepting commas.
-% \item[1] Parentheses expecting exactly one argument.
-% \item[0] Start and end of the expression.
-% \end{itemize}
-%
 % \begin{variable}
 %   {
-%     \c_@@_prec_funcii_int,
 %     \c_@@_prec_func_int,
 %     \c_@@_prec_hatii_int,
 %     \c_@@_prec_hat_int,
@@ -122,12 +102,33 @@
 %     \c_@@_prec_quest_int,
 %     \c_@@_prec_colon_int,
 %     \c_@@_prec_comma_int,
-%     \c_@@_prec_paren_int,
+%     \c_@@_prec_tuple_int,
 %     \c_@@_prec_end_int,
 %   }
+%   Floating point expressions are composed of numbers, given in various
+%   forms, infix operators, such as |+|, |**|, or~|,| (which joins two
+%   numbers into a list), and prefix operators, such as the unary~|-|,
+%   functions, or opening parentheses.  Here is a list of precedences
+%   which control the order of evaluation (some distinctions are
+%   irrelevant for the order of evaluation, but serve as signals), from
+%   the tightest binding to the loosest binding.
+%   \begin{itemize}
+%     \item[16] Function calls.
+%     \item[13/14] Binary |**| and~|^| (right to left).
+%     \item[12] Unary |+|, |-|, |!| (right to left).
+%     \item[10] Binary |*|, |/|, and juxtaposition (implicit~|*|).
+%     \item[9] Binary |+| and~|-|.
+%     \item[7] Comparisons.
+%     \item[6] Logical \texttt{and}, denoted by~|&&|.
+%     \item[5] Logical \texttt{or}, denoted by~\verb*+||+.
+%     \item[4] Ternary operator |?:|, piece~|?|.
+%     \item[3] Ternary operator |?:|, piece~|:|.
+%     \item[2] Commas.
+%     \item[1] Place where a comma is allowed and generates a tuple.
+%     \item[0] Start and end of the expression.
+%   \end{itemize}
 %    \begin{macrocode}
-\int_const:Nn \c_@@_prec_funcii_int { 16 }
-\int_const:Nn \c_@@_prec_func_int   { 15 }
+\int_const:Nn \c_@@_prec_func_int   { 16 }
 \int_const:Nn \c_@@_prec_hatii_int  { 14 }
 \int_const:Nn \c_@@_prec_hat_int    { 13 }
 \int_const:Nn \c_@@_prec_not_int    { 12 }
@@ -139,7 +140,7 @@
 \int_const:Nn \c_@@_prec_quest_int  { 4 }
 \int_const:Nn \c_@@_prec_colon_int  { 3 }
 \int_const:Nn \c_@@_prec_comma_int  { 2 }
-\int_const:Nn \c_@@_prec_paren_int  { 1 }
+\int_const:Nn \c_@@_prec_tuple_int  { 1 }
 \int_const:Nn \c_@@_prec_end_int    { 0 }
 %    \end{macrocode}
 % \end{variable}
@@ -168,7 +169,7 @@
 % which appear when computing a parenthesized expression near the
 % closing parenthesis.  This still lets us expand tokens as we go, and
 % avoids performance problems as long as there are enough parentheses.
-% However, it would be much better to avoid requiring the closing
+% However, it would be better to avoid requiring the closing
 % parenthesis to be present as soon as the corresponding opening
 % parenthesis is read: the closing parenthesis may still be hidden in a
 % macro yet to be expanded.
@@ -232,10 +233,11 @@
 % called |\operand:w|.  This means that |\operand:w| must know what the
 % previous binary operator is, or rather, its precedence: we thus rename
 % it |\operand:Nw|.  Let us describe as an example how we plan to do
-% the calculation |41-2^3*4+5|.  Here, we abuse notations: the first
-% argument of |\operand:Nw| should be an integer constant (\cs{c_@@_prec_plus_int},
-% \ldots{}) equal to the precedence of the given operator,
-% not directly the operator itself.
+% the calculation |41-2^3*4+5|.  More precisely we describe how to
+% perform the first operation in this expression.  Here, we abuse
+% notations: the first argument of |\operand:Nw| should be an integer
+% constant (\cs{c_@@_prec_plus_int}, \ldots{}) equal to the precedence
+% of the given operator, not directly the operator itself.
 % \begin{itemize}
 %   \item Clean up~|41| and find~|-|.  We call |\operand:Nw|~|-| to find
 %     the second operand.
@@ -247,16 +249,16 @@
 %   \item Compare the precedences of |^| and~|*|.  Since the former is
 %     higher, |\operand:Nw|~|^| has found the second operand of the
 %     exponentiation, which is computed: $2^{3} = 8$.
-%   \item We now have |41+8*4+5|, and |\operand:Nw|~|-| is still
+%   \item We now have |41-8*4+5|, and |\operand:Nw|~|-| is still
 %     looking for a second operand for the subtraction.  Is it~$8$?
 %   \item Compare the precedences of |-| and~|*|.  Since the latter is
 %     higher, we are not done with~$8$.  Call |\operand:Nw|~|*| to find
 %     the second operand of the multiplication.
-%   \item Clean up~|4|, and find~|-|.
-%   \item Compare the precedences of |*| and~|-|.  Since the former is
+%   \item Clean up~|4|, and find~|+|.
+%   \item Compare the precedences of |*| and~|+|.  Since the former is
 %     higher, |\operand:Nw|~|*| has found the second operand of the
 %     multiplication, which is computed: $8*4 = 32$.
-%   \item We now have |41+32+5|, and |\operand:Nw|~|-| is still looking
+%   \item We now have |41-32+5|, and |\operand:Nw|~|-| is still looking
 %     for a second operand for the subtraction.  Is it~$32$?
 %   \item Compare the precedences of |-| and~|+|.  Since they are equal,
 %     |\operand:Nw|~|-| has found the second operand for the
@@ -289,10 +291,10 @@
 % of this function is that it reads one \meta{number}, performing no
 % computation, and finds the following binary \meta{operator}.  Then it
 % expands to
-% \begin{syntax}
-%   \meta{number}
+% \begin{quote}
+%   \meta{number}\\
 %   |  \__fp_parse_infix_|\meta{operator}|:N| \meta{precedence}
-% \end{syntax}
+% \end{quote}
 % expanding the \texttt{infix} auxiliary before leaving the above in the
 % input stream.
 %
@@ -638,29 +640,6 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[EXP]{\@@_type_from_scan:N, \@@_type_from_scan:w}
-%   \begin{syntax}
-%     \cs{@@_type_from_scan:N} \meta{token}
-%   \end{syntax}
-%   Grabs the pieces of the stringified \meta{token} which lies after
-%   the first |s__fp|.  If the \meta{token} does not contain that
-%   string, the result is |_?|.
-%    \begin{macrocode}
-\cs_new:Npx \@@_type_from_scan:N #1
-  {
-    \exp_not:N \exp_after:wN \exp_not:N \@@_type_from_scan:w
-    \exp_not:N \token_to_str:N #1 \exp_not:N \q_mark
-      \tl_to_str:n { s_@@ _? } \exp_not:N \q_mark \exp_not:N \q_stop
-  }
-\use:x
-  {
-    \cs_new:Npn \exp_not:N \@@_type_from_scan:w
-      ##1 \tl_to_str:n { s_@@ } ##2 \exp_not:N \q_mark ##3 \exp_not:N \q_stop
-      {##2}
-  }
-%    \end{macrocode}
-% \end{macro}
-%
 % \begin{macro}[rEXP]
 %   {
 %     \@@_parse_digits_vii:N  ,
@@ -761,8 +740,7 @@
 %     \@@_exp_after_?_f:nw
 %   }
 %   This function receives a \meta{precedence} and a control sequence
-%   equal to \cs{scan_stop:} in meaning.  There are three cases,
-%   dispatched using \cs{@@_type_from_scan:N}.
+%   equal to \cs{scan_stop:} in meaning.  There are three cases.
 %   \begin{itemize}
 %     \item \cs{s_@@} starts a floating point number, and we call
 %       \cs{@@_exp_after_f:nw}, which |f|-expands after the floating
@@ -785,23 +763,35 @@
 %   because \tn{protect} is often \cs{scan_stop:} hence \enquote{does
 %   not exist}.
 %    \begin{macrocode}
-\cs_new:Npn \@@_parse_one_fp:NN #1#2
+\cs_new:Npn \@@_parse_one_fp:NN #1
   {
-    \cs:w @@_exp_after \@@_type_from_scan:N #2 _f:nw \cs_end:
+    \@@_exp_after_any_f:nw
       {
         \exp_after:wN \@@_parse_infix:NN
         \exp_after:wN #1 \exp:w \@@_parse_expand:w
       }
-    #2
   }
 \cs_new:Npn \@@_exp_after_mark_f:nw #1
   {
-    \__msg_kernel_expandable_error:nn { kernel } { fp-early-end }
-    \exp_after:wN \c_nan_fp \exp:w \exp_end_continue_f:w #1
+    \int_case:nnF { \exp_after:wN \use_i:nnn \use_none:nnn #1 }
+      {
+        \c_@@_prec_comma_int { }
+        \c_@@_prec_tuple_int { }
+        \c_@@_prec_end_int
+          {
+            \exp_after:wN \c_@@_empty_tuple_fp
+            \exp:w \exp_end_continue_f:w
+          }
+      }
+      {
+        \__kernel_msg_expandable_error:nn { kernel } { fp-early-end }
+        \exp_after:wN \c_nan_fp \exp:w \exp_end_continue_f:w
+      }
+    #1
   }
 \cs_new:cpn { @@_exp_after_?_f:nw } #1#2
   {
-    \__msg_kernel_expandable_error:nnn { kernel } { bad-variable } {#2}
+    \__kernel_msg_expandable_error:nnn { kernel } { bad-variable } {#2}
     \exp_after:wN \c_nan_fp \exp:w \exp_end_continue_f:w #1
   }
 %<*package>
@@ -815,9 +805,9 @@
             \str_if_eq:nnTF {##2} { \protect }
               {
                 \cs_if_eq:NNTF ##2 #1 { \use_i:nn } { \use:n }
-                { \__msg_kernel_expandable_error:nnn { kernel } { fp-robust-cmd } }
+                { \__kernel_msg_expandable_error:nnn { kernel } { fp-robust-cmd } }
               }
-              { \__msg_kernel_expandable_error:nnn { kernel } { bad-variable } {##2} }
+              { \__kernel_msg_expandable_error:nnn { kernel } { bad-variable } {##2} }
           }
       }
   }
@@ -996,7 +986,7 @@
       {
         \cs_if_exist_use:cF { @@_parse_caseless_ \str_fold_case:n {#2} :N }
           {
-            \__msg_kernel_expandable_error:nnn
+            \__kernel_msg_expandable_error:nnn
               { kernel } { unknown-fp-word } {#2}
             \exp_after:wN \c_nan_fp \exp:w \exp_end_continue_f:w
             \@@_parse_infix:NN
@@ -1051,13 +1041,13 @@
   {
     \cs_if_exist:cTF { @@_parse_infix_ \token_to_str:N #1 :N }
       {
-        \__msg_kernel_expandable_error:nnn
+        \__kernel_msg_expandable_error:nnn
           { kernel } { fp-missing-number } {#1}
         \exp_after:wN \c_nan_fp \exp:w \exp_end_continue_f:w
         \@@_parse_infix:NN #3 #1
       }
       {
-        \__msg_kernel_expandable_error:nnn
+        \__kernel_msg_expandable_error:nnn
           { kernel } { fp-unknown-symbol } {#1}
         \@@_parse_one:Nw #3
       }
@@ -1729,12 +1719,12 @@
             \__str_if_eq_x:nn { \s_@@ } { \exp_not:N #1 }
             = 0 \exp_stop_f:
           0
-          \__msg_kernel_expandable_error:nnn
+          \__kernel_msg_expandable_error:nnn
             { kernel } { fp-after-e } { floating~point~ }
           \prg_return_true:
         \else:
           0
-          \__msg_kernel_expandable_error:nnn
+          \__kernel_msg_expandable_error:nnn
             { kernel } { bad-variable } {#1}
           \prg_return_false:
         \fi:
@@ -1745,7 +1735,7 @@
           \__int_value:w #1
         \else:
           0
-          \__msg_kernel_expandable_error:nnn
+          \__kernel_msg_expandable_error:nnn
             { kernel } { fp-after-e } { dimension~#1 }
         \fi:
         \prg_return_false:
@@ -1752,7 +1742,7 @@
       \fi:
     \else:
       0
-      \__msg_kernel_expandable_error:nnn
+      \__kernel_msg_expandable_error:nnn
         { kernel } { fp-missing } { exponent }
       \prg_return_true:
     \fi:
@@ -1771,7 +1761,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[EXP]{\@@_parse_apply_unary:NNNwN}
+% \begin{macro}[EXP]{\@@_parse_apply_function:NNNwN}
 %   Here, |#1| is a precedence, |#2| is some extra data used by some
 %   functions, |#3| is \emph{e.g.}, \cs{@@_sin_o:w}, and expands once
 %   after the calculation, |#4| is the operand, and |#5| is a
@@ -1778,16 +1768,64 @@
 %   \cs[no-index]{@@_parse_infix_\ldots{}:N} function.  We feed the data~|#2|, and the
 %   argument~|#4|, to the function~|#3|, which expands
 %   \cs{exp:w} thus the \texttt{infix} function~|#5|.
+%    \begin{macrocode}
+\cs_new:Npn \@@_parse_apply_function:NNNwN #1#2#3#4@#5
+  {
+    #3 #2 #4 @
+    \exp:w \exp_end_continue_f:w #5 #1
+  }
+%    \end{macrocode}
+% \end{macro}
 %
-%   This is redefined in \pkg{l3fp-extras}.
+% \begin{macro}[EXP]{\@@_parse_apply_unary:NNNwN}
+% \begin{macro}[EXP]{\@@_parse_apply_unary_chk:NwNw, \@@_parse_apply_unary_chk:nNNNw}
+% \begin{macro}[EXP]{\@@_parse_apply_unary_type:NNN, \@@_parse_apply_unary_error:NNw}
+%   In contrast to \cs{@@_parse_apply_function:NNNwN}, this checks that
+%   the operand |#4| is a single argument (namely there is a single
+%   |;|).  We use the fact that any floating point starts with a
+%   \enquote{safe} token like \cs{s_@@}.  If there is no argument
+%   produce the |fp-no-arg| error; if there are at least two produce
+%   |fp-multi-arg|.  For the error message extract the mathematical
+%   function name (such as |sin|) from the \pkg{expl3} function that
+%   computes it, such as \cs{@@_sin_o:w}.
+%
+%   In addition, since there is a single argument we can dispatch on
+%   type and check that the resulting function exists.  This catches
+%   things like |sin((1,2))| where it does not make sense to take the
+%   sine of a tuple.
 %    \begin{macrocode}
 \cs_new:Npn \@@_parse_apply_unary:NNNwN #1#2#3#4@#5
   {
+    \@@_parse_apply_unary_chk:NwNw #4 @ ; . \q_stop
+    \@@_parse_apply_unary_type:NNN
     #3 #2 #4 @
     \exp:w \exp_end_continue_f:w #5 #1
   }
+\cs_new:Npn \@@_parse_apply_unary_chk:NwNw #1#2 ; #3#4 \q_stop
+  {
+    \if_meaning:w @ #3 \else:
+      \token_if_eq_meaning:NNTF . #3
+        { \@@_parse_apply_unary_chk:nNNNNw { no } }
+        { \@@_parse_apply_unary_chk:nNNNNw { multi } }
+    \fi:
+  }
+\cs_new:Npn \@@_parse_apply_unary_chk:nNNNNw #1#2#3#4#5#6 @
+  {
+    #2
+    \@@_error:nffn { fp-#1-arg } { \@@_func_to_name:N #4 } { } { }
+    \exp_after:wN #4 \exp_after:wN #5 \c_nan_fp @
+  }
+\cs_new:Npn \@@_parse_apply_unary_type:NNN #1#2#3
+  {
+    \@@_change_func_type:NNN #3 #1 \@@_parse_apply_unary_error:NNw
+    #2 #3
+  }
+\cs_new:Npn \@@_parse_apply_unary_error:NNw #1#2#3 @
+  { \@@_invalid_operation_o:fw { \@@_func_to_name:N #1 } #3 }
 %    \end{macrocode}
 % \end{macro}
+% \end{macro}
+% \end{macro}
 %
 % \begin{macro}[EXP]{\@@_parse_prefix_-:Nw, \@@_parse_prefix_!:Nw}
 %   The unary~|-| and boolean not are harder: we parse the operand using
@@ -1840,13 +1878,15 @@
 % \begin{macro}[EXP]
 %   {\@@_parse_prefix_(:Nw, \@@_parse_lparen_after:NwN}
 %   The left parenthesis is treated as a unary prefix operator because
-%   it appears in exactly the same settings.  Commas are allowed if
-%   the previous precedence is $16$ (function with multiple arguments).
-%   In this case, find an
-%   operand using the precedence~$1$; otherwise the precedence~$0$.
+%   it appears in exactly the same settings.  If the previous precedence
+%   is \cs{c_@@_prec_func_int} we are parsing arguments of a function
+%   and commas should not build tuples; otherwise commas should build
+%   tuples.  We distinguish these cases by precedence:
+%   \cs{c_@@_prec_comma_int} for the case of arguments,
+%   \cs{c_@@_prec_tuple_int} for the case of tuples.
 %   Once the operand is found, the \texttt{lparen_after} auxiliary makes
 %   sure that there was a closing parenthesis (otherwise it complains),
-%   and leaves in the input stream the array it found as an operand,
+%   and leaves in the input stream an operand,
 %   fetching the following infix operator.
 %    \begin{macrocode}
 \cs_new:cpn { @@_parse_prefix_(:Nw } #1
@@ -1854,10 +1894,10 @@
     \exp_after:wN \@@_parse_lparen_after:NwN
     \exp_after:wN #1
     \exp:w
-    \if_int_compare:w #1 = \c_@@_prec_funcii_int
+    \if_int_compare:w #1 = \c_@@_prec_func_int
       \@@_parse_operand:Nw \c_@@_prec_comma_int
     \else:
-      \@@_parse_operand:Nw \c_@@_prec_paren_int
+      \@@_parse_operand:Nw \c_@@_prec_tuple_int
     \fi:
     \@@_parse_expand:w
   }
@@ -1874,8 +1914,9 @@
         \exp_not:N \@@_parse_expand:w
       }
       {
-        \exp_not:N \__msg_kernel_expandable_error:nnn
+        \exp_not:N \__kernel_msg_expandable_error:nnn
           { kernel } { fp-missing } { ) }
+        \exp_not:N \tl_if_empty:nT {#2} \exp_not:N \c_@@_empty_tuple_fp
         #2 @
         \exp_not:N \use_none:n #3
       }
@@ -1884,18 +1925,23 @@
 % \end{macro}
 %
 % \begin{macro}[EXP]{\@@_parse_prefix_):Nw}
-%   The right parenthesis can appear as unary prefixes when arguments of
-%   a multi-argument function end with a comma, or when there is no
-%   argument, as in |max(1,2,)| or in |rand()|.  In single-argument
-%   functions (precedence~$0$ rather than~$1$) forbid this.
+%   The right parenthesis can appear as a prefix in two similar cases:
+%   in an empty tuple or tuple ending with a comma, or in an empty
+%   argument list or argument list ending with a comma, such as in
+%   |max(1,2,)| or in |rand()|.
 %    \begin{macrocode}
 \cs_new:cpn { @@_parse_prefix_):Nw } #1
   {
     \if_int_compare:w #1 = \c_@@_prec_comma_int
     \else:
-      \__msg_kernel_expandable_error:nnn
-        { kernel } { fp-missing-number } { ) }
-      \exp_after:wN \c_nan_fp \exp:w \exp_end_continue_f:w
+      \if_int_compare:w #1 = \c_@@_prec_tuple_int
+        \exp_after:wN \c_@@_empty_tuple_fp \exp:w
+      \else:
+        \__kernel_msg_expandable_error:nnn
+          { kernel } { fp-missing-number } { ) }
+        \exp_after:wN \c_nan_fp \exp:w
+      \fi:
+      \exp_end_continue_f:w
     \fi:
     \@@_parse_infix:NN #1 )
   }
@@ -2011,12 +2057,12 @@
   }
 \cs_new:Npn \@@_parse_function:NNN #1#2#3
   {
-    \exp_after:wN \@@_parse_apply_unary:NNNwN
+    \exp_after:wN \@@_parse_apply_function:NNNwN
     \exp_after:wN #3
     \exp_after:wN #2
     \exp_after:wN #1
     \exp:w
-    \@@_parse_operand:Nw \c_@@_prec_funcii_int \@@_parse_expand:w
+    \@@_parse_operand:Nw \c_@@_prec_func_int \@@_parse_expand:w
   }
 %    \end{macrocode}
 % \end{macro}
@@ -2086,22 +2132,83 @@
 % \end{macro}
 %
 % \begin{macro}[EXP]{\@@_parse_apply_binary:NwNwN}
+% \begin{macro}[EXP]
+%   {\@@_parse_apply_binary_chk:NN, \@@_parse_apply_binary_error:NNN}
 %   Receives \meta{precedence} \meta{operand_1} |@| \meta{operation}
 %   \meta{operand_2} |@| \meta{infix command}.  Builds the appropriate
-%   call to the \meta{operation}~|#3|.
+%   call to the \meta{operation}~|#3|, dispatching on both types.
+%   If the resulting control sequence does not exist, the operation is
+%   not allowed.
 %
 %   This is redefined in \pkg{l3fp-extras}.
 %    \begin{macrocode}
-\cs_new:Npn \@@_parse_apply_binary:NwNwN #1 #2@ #3 #4@ #5
+\cs_new:Npn \@@_parse_apply_binary:NwNwN #1 #2#3@ #4 #5#6@ #7
   {
     \exp_after:wN \@@_parse_continue:NwN
     \exp_after:wN #1
-    \exp:w \exp_end_continue_f:w \cs:w @@_#3_o:ww \cs_end: #2 #4
-    \exp:w \exp_end_continue_f:w #5 #1
+    \exp:w \exp_end_continue_f:w
+      \exp_after:wN \@@_parse_apply_binary_chk:NN
+        \cs:w
+          @@
+          \@@_type_from_scan:N #2
+          _#4
+          \@@_type_from_scan:N #5
+          _o:ww
+        \cs_end:
+        #4
+      #2#3 #5#6
+    \exp:w \exp_end_continue_f:w #7 #1
   }
+\cs_new:Npn \@@_parse_apply_binary_chk:NN #1#2
+  {
+    \if_meaning:w \scan_stop: #1
+      \@@_parse_apply_binary_error:NNN #2
+    \fi:
+    #1
+  }
+\cs_new:Npn \@@_parse_apply_binary_error:NNN #1#2#3
+  {
+    #2
+    \@@_invalid_operation_o:Nww #1
+  }
 %    \end{macrocode}
 % \end{macro}
+% \end{macro}
 %
+% \begin{macro}[EXP]{\@@_binary_type_o:Nww, \@@_binary_rev_type_o:Nww}
+%   Applies the operator |#1| to its two arguments, dispatching
+%   according to their types, and expands once after the result.
+%   The |rev| version swaps its arguments before doing this.
+%    \begin{macrocode}
+\cs_new:Npn \@@_binary_type_o:Nww #1 #2#3 ; #4
+  {
+    \exp_after:wN \@@_parse_apply_binary_chk:NN
+      \cs:w
+        @@
+        \@@_type_from_scan:N #2
+        _ #1
+        \@@_type_from_scan:N #4
+        _o:ww
+      \cs_end:
+      #1
+    #2 #3 ; #4
+  }
+\cs_new:Npn \@@_binary_rev_type_o:Nww #1 #2#3 ; #4#5 ;
+  {
+    \exp_after:wN \@@_parse_apply_binary_chk:NN
+      \cs:w
+        @@
+        \@@_type_from_scan:N #4
+        _ #1
+        \@@_type_from_scan:N #2
+        _o:ww
+      \cs_end:
+      #1
+    #4 #5 ; #2 #3 ;
+  }
+%    \end{macrocode}
+% \end{macro}
+%
 % \subsection{Infix operators}
 %
 % \begin{macro}[EXP]{\@@_parse_infix_after_operand:NwN}
@@ -2111,40 +2218,40 @@
     \@@_exp_after_f:nw { \@@_parse_infix:NN #1 }
     #2;
   }
-  \cs_new:Npn \@@_parse_infix:NN #1 #2
-    {
-      \if_catcode:w \scan_stop: \exp_not:N #2
-        \if_int_compare:w
-            \__str_if_eq_x:nn { \s_@@_mark } { \exp_not:N #2 }
-            = 0 \exp_stop_f:
-          \exp_after:wN \exp_after:wN
-          \exp_after:wN \@@_parse_infix_mark:NNN
-        \else:
-          \exp_after:wN \exp_after:wN
-          \exp_after:wN \@@_parse_infix_juxtapose:N
-        \fi:
+\cs_new:Npn \@@_parse_infix:NN #1 #2
+  {
+    \if_catcode:w \scan_stop: \exp_not:N #2
+      \if_int_compare:w
+          \__str_if_eq_x:nn { \s_@@_mark } { \exp_not:N #2 }
+          = 0 \exp_stop_f:
+        \exp_after:wN \exp_after:wN
+        \exp_after:wN \@@_parse_infix_mark:NNN
       \else:
-        \if_int_compare:w
-            \__int_eval:w
-              ( `#2 \if_int_compare:w `#2 > `Z - 32 \fi: ) / 26
-            = 3 \exp_stop_f:
-          \exp_after:wN \exp_after:wN
-          \exp_after:wN \@@_parse_infix_juxtapose:N
-        \else:
-          \exp_after:wN \@@_parse_infix_check:NNN
-          \cs:w
-            @@_parse_infix_ \token_to_str:N #2 :N
-            \exp_after:wN \exp_after:wN \exp_after:wN
-          \cs_end:
-        \fi:
+        \exp_after:wN \exp_after:wN
+        \exp_after:wN \@@_parse_infix_mul:N
       \fi:
-      #1
-      #2
-    }
+    \else:
+      \if_int_compare:w
+          \__int_eval:w
+            ( `#2 \if_int_compare:w `#2 > `Z - 32 \fi: ) / 26
+          = 3 \exp_stop_f:
+        \exp_after:wN \exp_after:wN
+        \exp_after:wN \@@_parse_infix_mul:N
+      \else:
+        \exp_after:wN \@@_parse_infix_check:NNN
+        \cs:w
+          @@_parse_infix_ \token_to_str:N #2 :N
+          \exp_after:wN \exp_after:wN \exp_after:wN
+        \cs_end:
+      \fi:
+    \fi:
+    #1
+    #2
+  }
 \cs_new:Npx \@@_parse_infix_check:NNN #1#2#3
   {
     \exp_not:N \if_meaning:w \scan_stop: #1
-      \exp_not:N \__msg_kernel_expandable_error:nnn
+      \exp_not:N \__kernel_msg_expandable_error:nnn
         { kernel } { fp-missing } { * }
       \exp_not:N \exp_after:wN
       \exp_not:c { @@_parse_infix_*:N }
@@ -2185,21 +2292,21 @@
 % \begin{macro}[EXP]+\@@_parse_infix_):N+
 %   This is very similar to \cs{@@_parse_infix_end:N}, complaining about
 %   an extra closing parenthesis if the previous operator was the
-%   beginning of the expression.
+%   beginning of the expression, with precedence \cs{c_@@_prec_end_int}.
 %    \begin{macrocode}
 \cs_set_protected:Npn \@@_tmp:w #1
   {
     \cs_new:Npn #1 ##1
       {
-        \if_int_compare:w ##1 < \c_@@_prec_paren_int
-          \__msg_kernel_expandable_error:nnn { kernel } { fp-extra } { ) }
+        \if_int_compare:w ##1 > \c_@@_prec_end_int
+          \exp_after:wN @
+          \exp_after:wN \use_none:n
+          \exp_after:wN #1
+        \else:
+          \__kernel_msg_expandable_error:nnn { kernel } { fp-extra } { ) }
           \exp_after:wN \@@_parse_infix:NN
           \exp_after:wN ##1
           \exp:w \exp_after:wN \@@_parse_expand:w
-        \else:
-          \exp_after:wN @
-          \exp_after:wN \use_none:n
-          \exp_after:wN #1
         \fi:
       }
   }
@@ -2208,10 +2315,17 @@
 % \end{macro}
 %
 % \begin{macro}[verb, EXP]{\__fp_parse_infix_,:N}
-% \begin{macro}[EXP]{\@@_parse_infix_comma:w, \@@_parse_infix_comma_error:w}
-% \begin{macro}[verb, EXP]{\__fp_,_o:ww}
-%   \cs{@@_,_o:ww} is a complicated way of replacing any number of
-%   floating point arguments by \texttt{nan}.
+% \begin{macro}[EXP]{\@@_parse_infix_comma:w, \@@_parse_apply_comma:NwNwN}
+%   As for other infix operations, if the previous operations has higher
+%   precedence the comma waits.  Otherwise we call
+%   \cs{@@_parse_operand:Nw} to read more comma-delimited arguments that
+%   \cs{@@_parse_infix_comma:w} simply concatenates into a |@|-delimited
+%   array.  The first comma in a tuple that is not a function argument
+%   is distinguished: in that case call \cs{@@_parse_apply_comma:NwNwN}
+%   whose job is to convert the first item of the tuple and an array of
+%   the remaining items into a tuple.  In contrast to
+%   \cs{@@_parse_apply_binary:NwNwN} this function's operands are not
+%   single-object arrays.
 %    \begin{macrocode}
 \cs_set_protected:Npn \@@_tmp:w #1
   {
@@ -2223,10 +2337,15 @@
           \exp_after:wN #1
         \else:
           \if_int_compare:w ##1 < \c_@@_prec_comma_int
-            \@@_parse_infix_comma_error:w
+            \exp_after:wN @
+            \exp_after:wN \@@_parse_apply_comma:NwNwN
+            \exp_after:wN ,
+            \exp:w
+          \else:
+            \exp_after:wN \@@_parse_infix_comma:w
+            \exp:w
           \fi:
-          \exp_after:wN \@@_parse_infix_comma:w
-          \exp:w \@@_parse_operand:Nw \c_@@_prec_comma_int
+          \@@_parse_operand:Nw \c_@@_prec_comma_int
           \exp_after:wN \@@_parse_expand:w
         \fi:
       }
@@ -2234,32 +2353,18 @@
 \exp_args:Nc \@@_tmp:w { @@_parse_infix_,:N }
 \cs_new:Npn \@@_parse_infix_comma:w #1 @
   { #1 @ \use_none:n }
-\cs_new:Npn \@@_parse_infix_comma_error:w #1 \exp:w
+\cs_new:Npn \@@_parse_apply_comma:NwNwN #1 #2@ #3 #4@ #5
   {
-    \fi:
-    \__msg_kernel_expandable_error:nn { kernel } { fp-extra-comma }
-    \exp_after:wN @
-    \exp_after:wN \@@_parse_apply_binary:NwNwN
-    \exp_after:wN ,
-    \exp:w
+    \exp_after:wN \@@_parse_continue:NwN
+    \exp_after:wN #1
+    \exp:w \exp_end_continue_f:w
+    \@@_exp_after_tuple_f:nw { }
+      \s_@@_tuple \@@_tuple_chk:w { #2 #4 } ;
+    #5 #1
   }
-\cs_set_protected:Npn \@@_tmp:w #1
-  {
-    \cs_new:Npn #1 ##1
-      {
-        \if_meaning:w \s_@@ ##1
-          \exp_after:wN \@@_use_i_until_s:nw
-          \exp_after:wN #1
-        \fi:
-        \exp_after:wN \c_nan_fp
-        ##1
-      }
-  }
-\exp_args:Nc \@@_tmp:w { @@_,_o:ww }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
-% \end{macro}
 %
 % \subsubsection{Usual infix operators}
 %
@@ -2318,51 +2423,13 @@
 % \begin{macro}[EXP]+\@@_parse_infix_(:N+
 %   When an opening parenthesis appears where we expect an infix
 %   operator, we compute the product of the previous operand and the
-%   contents of the parentheses using \cs{@@_parse_infix_juxtapose:N}.
+%   contents of the parentheses using \cs{@@_parse_infix_mul:N}.
 %    \begin{macrocode}
 \cs_new:cpn { @@_parse_infix_(:N } #1
-  { \@@_parse_infix_juxtapose:N #1 ( }
+  { \@@_parse_infix_mul:N #1 ( }
 %    \end{macrocode}
 % \end{macro}
 %
-% ^^A todo: can |...(1,2,3)pt| really occur?  If not, simplify.
-% \begin{macro}[EXP]
-%   {\@@_parse_infix_juxtapose:N, \@@_parse_apply_juxtapose:NwwN}
-%   Juxtaposition follows the same scheme as other binary operations,
-%   but calls \cs{@@_parse_apply_juxtapose:NwwN} rather than directly
-%   calling \cs{@@_parse_apply_binary:NwNwN}.  This lets us catch errors
-%   such as |...(1,2,3)pt| where one operand of the juxtaposition is not
-%   a single number: both |#3| and~|#5| of the \texttt{apply} auxiliary
-%   must be empty.
-%    \begin{macrocode}
-\cs_new:Npn \@@_parse_infix_juxtapose:N #1
-  {
-    \if_int_compare:w #1 < \c_@@_prec_times_int
-      \exp_after:wN @
-      \exp_after:wN \@@_parse_apply_juxtapose:NwwN
-      \exp:w
-      \@@_parse_operand:Nw \c_@@_prec_times_int
-      \exp_after:wN \@@_parse_expand:w
-    \else:
-      \exp_after:wN @
-      \exp_after:wN \use_none:n
-      \exp_after:wN \@@_parse_infix_juxtapose:N
-    \fi:
-  }
-\cs_new:Npn \@@_parse_apply_juxtapose:NwwN #1 #2;#3@ #4;#5@
-  {
-    \if_catcode:w ^ \tl_to_str:n { #3 #5 } ^
-    \else:
-      \@@_error:nffn { fp-invalid-ii }
-        { \@@_array_to_clist:n { #2; #3 } }
-        { \@@_array_to_clist:n { #4; #5 } }
-        { }
-    \fi:
-    \@@_parse_apply_binary:NwNwN #1 #2;@ * #4;@
-  }
-%    \end{macrocode}
-% \end{macro}
-%
 % \subsubsection{Multi-character cases}
 %
 % \begin{macro}[EXP]{\@@_parse_infix_*:N}
@@ -2436,7 +2503,7 @@
 \exp_args:Nc \@@_tmp:w { @@_parse_infix_::N }
   \@@_ternary_auxii:NwwN \c_@@_prec_colon_int
   {
-    \__msg_kernel_expandable_error:nnnn
+    \__kernel_msg_expandable_error:nnnn
       { kernel } { fp-missing } { ? } { ~for~?: }
   }
 %    \end{macrocode}
@@ -2477,7 +2544,7 @@
   }
 \cs_new:Npn \@@_parse_excl_error:
   {
-    \__msg_kernel_expandable_error:nnnn
+    \__kernel_msg_expandable_error:nnnn
       { kernel } { fp-missing } { = } { ~after~!. }
   }
 \cs_new:Npn \@@_parse_compare:NNNNNNN #1
@@ -2570,6 +2637,142 @@
 % \end{macro}
 % \end{macro}
 %
+% \subsection{Tools for functions}
+%
+% \begin{macro}[EXP]{\@@_parse_function_all_fp_o:fnw}
+%   Followed by \Arg{function name} \Arg{code} \meta{float array} |@|
+%   this checks all floats are floating point numbers (no tuples).
+%    \begin{macrocode}
+\cs_new:Npn \@@_parse_function_all_fp_o:fnw #1#2#3 @
+  {
+    \@@_array_if_all_fp:nTF {#3}
+      { #2 #3 @ }
+      {
+        \@@_error:nffn { fp-bad-args }
+          {#1}
+          { \fp_to_tl:n { \s_@@_tuple \@@_tuple_chk:w {#3} ; } }
+          { }
+        \exp_after:wN \c_nan_fp
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\@@_parse_function_one_two:nnw}
+% \begin{macro}[EXP]
+%   {
+%     \@@_parse_function_one_two_error_o:w,
+%     \@@_parse_function_one_two_aux:nnw,
+%     \@@_parse_function_one_two_auxii:nnw
+%   }
+%   This is followed by \Arg{function name} \Arg{code} \meta{float
+%   array} |@|.  It checks that the \meta{float array} consists of one
+%   or two floating point numbers (not tuples), then leaves the
+%   \meta{code} (if there is one float) or its tail (if there are two
+%   floats) followed by the \meta{float array}.  The \meta{code} should
+%   start with a single token such as \cs{@@_atan_default:w} that deals
+%   with the single-float case.
+%
+%   The first \cs{@@_if_type_fp:NTwFw} test catches the case of no
+%   argument and the case of a tuple argument.  The next one
+%   distinguishes the case of a single argument (no error, just add
+%   \cs{c_one_fp}) from a tuple second argument.  Finally check there is
+%   no further argument.
+%    \begin{macrocode}
+\cs_new:Npn \@@_parse_function_one_two:nnw #1#2#3
+  {
+    \@@_if_type_fp:NTwFw
+      #3 { } \s_@@ \@@_parse_function_one_two_error_o:w \q_stop
+    \@@_parse_function_one_two_aux:nnw {#1} {#2} #3
+  }
+\cs_new:Npn \@@_parse_function_one_two_error_o:w #1#2#3#4 @
+  {
+    \@@_error:nffn { fp-bad-args }
+      {#2}
+      { \fp_to_tl:n { \s_@@_tuple \@@_tuple_chk:w {#4} ; } }
+      { }
+    \exp_after:wN \c_nan_fp
+  }
+\cs_new:Npn \@@_parse_function_one_two_aux:nnw #1#2 #3; #4
+  {
+    \@@_if_type_fp:NTwFw
+      #4 { }
+      \s_@@
+      {
+        \if_meaning:w @ #4
+          \exp_after:wN \use_iv:nnnn
+        \fi:
+        \@@_parse_function_one_two_error_o:w
+      }
+      \q_stop
+    \@@_parse_function_one_two_auxii:nnw {#1} {#2} #3; #4
+  }
+\cs_new:Npn \@@_parse_function_one_two_auxii:nnw #1#2#3; #4; #5
+  {
+    \if_meaning:w @ #5 \else:
+      \exp_after:wN \@@_parse_function_one_two_error_o:w
+    \fi:
+    \use_ii:nn {#1} { \use_none:n #2 } #3; #4; #5
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\@@_tuple_map_o:nw, \@@_tuple_map_loop_o:nw}
+%   Apply |#1| to all items in the following tuple and expand once
+%   afterwards.  The code |#1| should itself expand once after its
+%   result.
+%    \begin{macrocode}
+\cs_new:Npn \@@_tuple_map_o:nw #1 \s_@@_tuple \@@_tuple_chk:w #2 ;
+  {
+    \exp_after:wN \s_@@_tuple
+    \exp_after:wN \@@_tuple_chk:w
+    \exp_after:wN {
+      \exp:w \exp_end_continue_f:w
+      \@@_tuple_map_loop_o:nw {#1} #2
+        { \s_@@ \__prg_break: } ;
+      \__prg_break_point:
+    \exp_after:wN } \exp_after:wN ;
+  }
+\cs_new:Npn \@@_tuple_map_loop_o:nw #1#2#3 ;
+  {
+    \use_none:n #2
+    #1 #2 #3 ;
+    \exp:w \exp_end_continue_f:w
+    \@@_tuple_map_loop_o:nw {#1}
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\@@_tuple_mapthread_o:nww, \@@_tuple_mapthread_loop_o:nw}
+%   Apply |#1| to pairs of items in the two following tuples and expand once
+%   afterwards.
+%    \begin{macrocode}
+\cs_new:Npn \@@_tuple_mapthread_o:nww #1
+    \s_@@_tuple \@@_tuple_chk:w #2 ;
+    \s_@@_tuple \@@_tuple_chk:w #3 ;
+  {
+    \exp_after:wN \s_@@_tuple
+    \exp_after:wN \@@_tuple_chk:w
+    \exp_after:wN {
+      \exp:w \exp_end_continue_f:w
+      \@@_tuple_mapthread_loop_o:nw {#1}
+        #2 { \s_@@ \__prg_break: } ; @
+        #3 { \s_@@ \__prg_break: } ;
+      \__prg_break_point:
+    \exp_after:wN } \exp_after:wN ;
+  }
+\cs_new:Npn \@@_tuple_mapthread_loop_o:nw #1#2#3 ; #4 @ #5#6 ;
+  {
+    \use_none:n #2
+    \use_none:n #5
+    #1 #2 #3 ; #5 #6 ;
+    \exp:w \exp_end_continue_f:w
+    \@@_tuple_mapthread_loop_o:nw {#1} #4 @
+  }
+%    \end{macrocode}
+% \end{macro}
+%
 % \subsection{Candidate: defining new \pkg{l3fp} functions}
 %
 % \begin{macro}[EXP]{\fp_function:Nw}
@@ -2582,7 +2785,7 @@
     \exp_after:wN \@@_function_apply:nw
     \exp_after:wN #1
     \exp:w
-      \@@_parse_operand:Nw \c_@@_prec_funcii_int \@@_parse_expand:w
+      \@@_parse_operand:Nw \c_@@_prec_func_int \@@_parse_expand:w
   }
 %    \end{macrocode}
 % \end{macro}
@@ -2618,7 +2821,7 @@
             \__int_value:w #3 \exp_after:wN ; \exp_after:wN
           }
         \exp:w
-          \@@_parse_operand:Nw \c_@@_prec_funcii_int \@@_parse_expand:w
+          \@@_parse_operand:Nw \c_@@_prec_func_int \@@_parse_expand:w
       }
     \cs_new:Npn #2 #4 {#5}
   }
@@ -2628,7 +2831,7 @@
     \int_compare:nNnTF { \tl_count:n {#3} } = {#2}
       { #1 #3 }
       {
-        \__msg_kernel_expandable_error:nnnnn
+        \__kernel_msg_expandable_error:nnnnn
           { kernel } { fp-num-args } { #1() } {#2} {#2}
         \c_nan_fp
       }
@@ -2682,30 +2885,36 @@
 % \subsection{Messages}
 %
 %    \begin{macrocode}
-\__msg_kernel_new:nnn { kernel } { fp-deprecated }
+\__kernel_msg_new:nnn { kernel } { fp-deprecated }
   { '#1'~deprecated;~use~'#2' }
-\__msg_kernel_new:nnn { kernel } { unknown-fp-word }
+\__kernel_msg_new:nnn { kernel } { unknown-fp-word }
   { Unknown~fp~word~#1. }
-\__msg_kernel_new:nnn { kernel } { fp-missing }
+\__kernel_msg_new:nnn { kernel } { fp-missing }
   { Missing~#1~inserted #2. }
-\__msg_kernel_new:nnn { kernel } { fp-extra }
+\__kernel_msg_new:nnn { kernel } { fp-extra }
   { Extra~#1~ignored. }
-\__msg_kernel_new:nnn { kernel } { fp-early-end }
+\__kernel_msg_new:nnn { kernel } { fp-early-end }
   { Premature~end~in~fp~expression. }
-\__msg_kernel_new:nnn { kernel } { fp-after-e }
+\__kernel_msg_new:nnn { kernel } { fp-after-e }
   { Cannot~use~#1 after~'e'. }
-\__msg_kernel_new:nnn { kernel } { fp-missing-number }
+\__kernel_msg_new:nnn { kernel } { fp-missing-number }
   { Missing~number~before~'#1'. }
-\__msg_kernel_new:nnn { kernel } { fp-unknown-symbol }
+\__kernel_msg_new:nnn { kernel } { fp-unknown-symbol }
   { Unknown~symbol~#1~ignored. }
-\__msg_kernel_new:nnn { kernel } { fp-extra-comma }
-  { Unexpected~comma:~extra~arguments~ignored. }
-\__msg_kernel_new:nnn { kernel } { fp-num-args }
+\__kernel_msg_new:nnn { kernel } { fp-extra-comma }
+  { Unexpected~comma~turned~to~nan~result. }
+\__kernel_msg_new:nnn { kernel } { fp-no-arg }
+  { #1~got~no~argument;~used~nan. }
+\__kernel_msg_new:nnn { kernel } { fp-multi-arg }
+  { #1~got~more~than~one~argument;~used~nan. }
+\__kernel_msg_new:nnn { kernel } { fp-num-args }
   { #1~expects~between~#2~and~#3~arguments. }
+\__kernel_msg_new:nnn { kernel } { fp-bad-args }
+  { Arguments~in~#1#2~are~invalid. }
 %<*package>
 \cs_if_exist:cT { @unexpandable at protect }
   {
-    \__msg_kernel_new:nnn { kernel } { fp-robust-cmd }
+    \__kernel_msg_new:nnn { kernel } { fp-robust-cmd }
       { Robust~command~#1 invalid~in~fp~expression! }
   }
 %</package>

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -1,6 +1,6 @@
 % \iffalse meta-comment
 %
-%% File: l3fp-random.dtx Copyright (C) 2016,2017 The LaTeX3 Project
+%% File: l3fp-random.dtx Copyright (C) 2016-2018 The LaTeX3 Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %
@@ -79,11 +79,11 @@
 %    \begin{macrocode}
 \cs_if_exist:NF \pdftex_uniformdeviate:D
   {
-    \__msg_kernel_new:nnn { kernel } { fp-no-random }
+    \__kernel_msg_new:nnn { kernel } { fp-no-random }
       { Random~numbers~unavailable }
     \cs_new:Npn \@@_rand_o:Nw ? #1 @
       {
-        \__msg_kernel_expandable_error:nn { kernel } { fp-no-random }
+        \__kernel_msg_expandable_error:nn { kernel } { fp-no-random }
         \exp_after:wN \c_nan_fp
       }
     \cs_new_eq:NN \@@_randint_o:Nw \@@_rand_o:Nw
@@ -197,7 +197,7 @@
     \tl_if_empty:nTF {#1}
       { \@@_rand_o: }
       {
-        \__msg_kernel_expandable_error:nnnnn
+        \__kernel_msg_expandable_error:nnnnn
           { kernel } { fp-num-args } { rand() } { 0 } { 0 }
         \exp_after:wN \c_nan_fp
       }
@@ -213,8 +213,9 @@
 % \begin{macro}[EXP]{\@@_randint_o:Nw}
 % \begin{macro}[EXP]
 %   {
+%     \@@_randint_default:w,
 %     \@@_randint_badarg:w,
-%     \@@_randint_e:w,
+%     \@@_randint_o:w,
 %     \@@_randint_e:wnn,
 %     \@@_randint_e:wwNnn,
 %     \@@_randint_e:wwwNnn,
@@ -243,19 +244,13 @@
 %     bound.  The result is compared to the upper bound and the process
 %     repeats if needed.
 %    \begin{macrocode}
-\cs_new:Npn \@@_randint_o:Nw ? #1 @
+\cs_new:Npn \@@_randint_o:Nw ?
   {
-    \if_case:w
-      \__int_eval:w \@@_array_count:n {#1} - 1 \__int_eval_end:
-         \exp_after:wN \@@_randint_e:w \c_one_fp #1
-    \or: \@@_randint_e:w #1
-    \else:
-      \__msg_kernel_expandable_error:nnnnn
-        { kernel } { fp-num-args } { randint() } { 1 } { 2 }
-      \exp_after:wN \c_nan_fp \exp:w
-    \fi:
-    \exp_after:wN \exp_end:
+    \@@_parse_function_one_two:nnw
+      { randint }
+      { \@@_randint_default:w \@@_randint_o:w }
   }
+\cs_new:Npn \@@_randint_default:w #1 { \exp_after:wN #1 \c_one_fp }
 \cs_new:Npn \@@_randint_badarg:w \s_@@ \@@_chk:w #1#2#3;
   {
     \@@_int:wTF \s_@@ \@@_chk:w #1#2#3;
@@ -269,7 +264,7 @@
       }
       { 1 \exp_stop_f: }
   }
-\cs_new:Npn \@@_randint_e:w #1; #2;
+\cs_new:Npn \@@_randint_o:w #1; #2; @
   {
     \if_case:w
         \@@_randint_badarg:w #1;
@@ -282,6 +277,7 @@
         { randint } { \@@_array_to_clist:n { #1; #2; } }
       \exp:w
     \fi:
+    \exp_after:wN \exp_end:
   }
 \cs_new:Npn \@@_randint_e:wnn #1;
   {

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -1,6 +1,6 @@
 % \iffalse meta-comment
 %
-%% File: l3fp-round.dtx Copyright(C) 2011-2017 The LaTeX3 Project
+%% File: l3fp-round.dtx Copyright(C) 2011-2018 The LaTeX3 Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %
@@ -116,14 +116,13 @@
       \@@_round_o:Nw \@@_round_to_nearest:NNN #1
     #2
   }
-\__debug:TF
+\__kernel_debug:TF
   {
-    \tl_gput_right:Nn \g__debug_deprecation_on_tl
+    \__kernel_deprecation_code:nn
       {
         \cs_set_eq:NN \@@_parse_round:Nw
           \@@_parse_round_deprecation_error:Nw
       }
-    \tl_gput_right:Nn \g__debug_deprecation_off_tl
       {
         \cs_set_eq:NN \@@_parse_round:Nw
           \@@_parse_round_no_error:Nw
@@ -423,7 +422,8 @@
 %
 % ^^A todo: This macro is intermingled with l3fp-parse.
 % ^^A todo: Add explanations.
-% \begin{macro}[EXP]{\@@_round_o:Nw}
+% \begin{macro}[EXP]{\@@_round_o:Nw, \@@_round_aux_o:Nw}
+%   First check that all arguments are floating point numbers.
 %   The |trunc|, |ceil| and |floor| functions expect one or two
 %   arguments (the second is $0$ by default), and the |round| function
 %   also accepts a third argument (\texttt{nan} by default), which
@@ -430,8 +430,14 @@
 %   changes |#1| from \cs{@@_round_to_nearest:NNN} to one of its
 %   analogues.
 %    \begin{macrocode}
-\cs_new:Npn \@@_round_o:Nw #1#2 @
+\cs_new:Npn \@@_round_o:Nw #1
   {
+    \@@_parse_function_all_fp_o:fnw
+      { \@@_round_name_from_cs:N #1 }
+      { \@@_round_aux_o:Nw #1 }
+  }
+\cs_new:Npn \@@_round_aux_o:Nw #1#2 @
+  {
     \if_case:w
       \__int_eval:w \@@_array_count:n {#2} \__int_eval_end:
          \@@_round_no_arg_o:Nw #1 \exp:w

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 % \maketitle
 %
 % \begin{documentation}
@@ -125,11 +125,11 @@
           { invalid_operation , division_by_zero , overflow , underflow }
           {#1}
           {
-            \__msg_kernel_error:nnxx { kernel }
+            \__kernel_msg_error:nnxx { kernel }
               { unknown-fpu-trap-type } {#1} {#2}
           }
           {
-            \__msg_kernel_error:nnx
+            \__kernel_msg_error:nnx
               { kernel } { unknown-fpu-exception } {#1}
           }
       }
@@ -336,7 +336,7 @@
 % \begin{macro}[EXP]{\@@_error:nnnn, \@@_error:nnfn, \@@_error:nffn}
 %    \begin{macrocode}
 \cs_new:Npn \@@_error:nnnn
-  { \__msg_kernel_expandable_error:nnnnn { kernel } }
+  { \__kernel_msg_expandable_error:nnnnn { kernel } }
 \cs_generate_variant:Nn \@@_error:nnnn { nnf, nff }
 %    \end{macrocode}
 % \end{macro}
@@ -345,7 +345,7 @@
 %
 % Some messages.
 %    \begin{macrocode}
-\__msg_kernel_new:nnnn { kernel } { unknown-fpu-exception }
+\__kernel_msg_new:nnnn { kernel } { unknown-fpu-exception }
   {
     The~FPU~exception~'#1'~is~not~known:~
     that~trap~will~never~be~triggered.
@@ -360,7 +360,7 @@
         * ~ underflow
       }
   }
-\__msg_kernel_new:nnnn { kernel } { unknown-fpu-trap-type }
+\__kernel_msg_new:nnnn { kernel } { unknown-fpu-trap-type }
   { The~FPU~trap~type~'#2'~is~not~known. }
   {
     The~trap~type~must~be~one~of \\
@@ -371,18 +371,20 @@
         * ~ none
       }
   }
-\__msg_kernel_new:nnn { kernel } { fp-flow }
+\__kernel_msg_new:nnn { kernel } { fp-flow }
   { An ~ #3 ~ occurred. }
-\__msg_kernel_new:nnn { kernel } { fp-flow-to }
+\__kernel_msg_new:nnn { kernel } { fp-flow-to }
   { #1 ~ #3 ed ~ to ~ #2 . }
-\__msg_kernel_new:nnn { kernel } { fp-zero-div }
+\__kernel_msg_new:nnn { kernel } { fp-zero-div }
   { Division~by~zero~in~ #1 (#2) }
-\__msg_kernel_new:nnn { kernel } { fp-zero-div-ii }
+\__kernel_msg_new:nnn { kernel } { fp-zero-div-ii }
   { Division~by~zero~in~ (#1) #3 (#2) }
-\__msg_kernel_new:nnn { kernel } { fp-invalid }
+\__kernel_msg_new:nnn { kernel } { fp-invalid }
   { Invalid~operation~ #1 (#2) }
-\__msg_kernel_new:nnn { kernel } { fp-invalid-ii }
+\__kernel_msg_new:nnn { kernel } { fp-invalid-ii }
   { Invalid~operation~ (#1) #3 (#2) }
+\__kernel_msg_new:nnn { kernel } { fp-unknown-type }
+  { Unknown~type~for~'#1' }
 %    \end{macrocode}
 %
 %    \begin{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -1,6 +1,6 @@
 % \iffalse meta-comment
 %
-%% File: l3fp-trig.dtx Copyright (C) 2011-2017 The LaTeX3 Project
+%% File: l3fp-trig.dtx Copyright (C) 2011-2018 The LaTeX3 Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %
@@ -1087,44 +1087,34 @@
 %
 % \subsubsection{Arctangent and arccotangent}
 %
-% \begin{macro}[EXP]{\@@_atan_o:Nw, \@@_acot_o:Nw}
-% \begin{macro}[EXP]{\@@_atan_dispatch_o:NNnNw}
+% \begin{macro}[EXP]{\@@_atan_o:Nw, \@@_acot_o:Nw, \@@_atan_default:w}
 %   The parsing step manipulates \texttt{atan} and \texttt{acot} like
 %   \texttt{min} and \texttt{max}, reading in an array of operands, but
 %   also leaves \cs{use_i:nn} or \cs{use_ii:nn} depending on whether the
-%   result should be given in radians or in degrees.  Here, we dispatch
-%   according to the number of arguments.  The one-argument versions of
-%   arctangent and arccotangent are special cases of the two-argument
-%   ones: $\operatorname{atan}(y) = \operatorname{atan}(y, 1) = \operatorname{acot}(1, y)$ and
-%   $\operatorname{acot}(x) = \operatorname{atan}(1, x) = \operatorname{acot}(x, 1)$.
+%   result should be given in radians or in degrees.  The helper
+%   \cs{@@_parse_function_one_two:nnw} checks that the operand is one or
+%   two floating point numbers (not tuples) and leaves its second
+%   argument or its tail accordingly (its first argument is used for
+%   error messages).  More precisely if we are given a single floating
+%   point number \cs{@@_atan_default:w} places \cs{c_one_fp} (expanded)
+%   after it; otherwise \cs{@@_atan_default:w} is omitted by
+%   \cs{@@_parse_function_one_two:nnw}.
 %    \begin{macrocode}
-\cs_new:Npn \@@_atan_o:Nw
+\cs_new:Npn \@@_atan_o:Nw #1
   {
-    \@@_atan_dispatch_o:NNnNw
-      \@@_acotii_o:Nww \@@_atanii_o:Nww { atan }
+    \@@_parse_function_one_two:nnw
+      { #1 { atan } { atand } }
+      { \@@_atan_default:w \@@_atanii_o:Nww #1 }
   }
-\cs_new:Npn \@@_acot_o:Nw
+\cs_new:Npn \@@_acot_o:Nw #1
   {
-    \@@_atan_dispatch_o:NNnNw
-      \@@_atanii_o:Nww \@@_acotii_o:Nww { acot }
+    \@@_parse_function_one_two:nnw
+      { #1 { acot } { acotd } }
+      { \@@_atan_default:w \@@_acotii_o:Nww #1 }
   }
-\cs_new:Npn \@@_atan_dispatch_o:NNnNw #1#2#3#4#5@
-  {
-    \if_case:w
-      \__int_eval:w \@@_array_count:n {#5} - 1 \__int_eval_end:
-         \exp_after:wN #1 \exp_after:wN #4 \c_one_fp #5
-         \exp:w
-    \or: #2 #4 #5 \exp:w
-    \else:
-      \__msg_kernel_expandable_error:nnnnn
-        { kernel } { fp-num-args } { #3() } { 1 } { 2 }
-      \exp_after:wN \c_nan_fp \exp:w
-    \fi:
-    \exp_after:wN \exp_end:
-  }
+\cs_new:Npx \@@_atan_default:w #1#2#3 @ { #1 #2 #3 \c_one_fp @ }
 %    \end{macrocode}
 % \end{macro}
-% \end{macro}
 %
 % \begin{macro}[EXP]{\@@_atanii_o:Nww, \@@_acotii_o:Nww}
 %   If either operand is \texttt{nan}, we return it.  If both are
@@ -1139,7 +1129,7 @@
 %   \cs{@@_acotii_o:ww} simply reverses its two arguments.
 %    \begin{macrocode}
 \cs_new:Npn \@@_atanii_o:Nww
-    #1 \s_@@ \@@_chk:w #2#3#4; \s_@@ \@@_chk:w #5
+    #1 \s_@@ \@@_chk:w #2#3#4; \s_@@ \@@_chk:w #5 #6 @
   {
     \if_meaning:w 3 #2 \@@_case_return_i_o:ww \fi:
     \if_meaning:w 3 #5 \@@_case_return_ii_o:ww \fi:
@@ -1156,7 +1146,7 @@
     \fi:
     \@@_atan_normal_o:NNnwNnw #1
     \s_@@ \@@_chk:w #2#3#4;
-    \s_@@ \@@_chk:w #5
+    \s_@@ \@@_chk:w #5 #6
   }
 \cs_new:Npn \@@_acotii_o:Nww #1#2; #3;
   { \@@_atanii_o:Nww #1#3; #2; }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -47,7 +47,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %
@@ -408,7 +408,7 @@
 %   an optional leading~|!| (which negates the \meta{relation}), with
 %   the restriction that the \meta{relation} may not start with~|?|, as
 %   this symbol has a different meaning (in combination with~|:|) within
-%   floatin point expressions.  The comparison $x$~\meta{relation}~$y$
+%   floating point expressions.  The comparison $x$~\meta{relation}~$y$
 %   is then \texttt{true} if the \meta{relation} does not start with~|!|
 %   and the actual relation (|<|, |=|, |>|, or~|?|) between $x$ and~$y$
 %   appears within the \meta{relation}, or on the contrary if the
@@ -884,7 +884,7 @@
 %   Each \meta{relation} consists of a non-empty string of |<|, |=|,
 %   |>|, and~|?|, optionally preceded by~|!|, and may not start
 %   with~|?|.  This evaluates to $+1$ if all comparisons
-%   \meta{operand_i} \meta{relation_j} \meta{operand_{i+1}} are true, and
+%   \meta{operand_i} \meta{relation_i} \meta{operand_{i+1}} are true, and
 %   $+0$ otherwise.  All \meta{operands} are evaluated in all cases.
 %   See \cs{fp_compare:nTF} for details.
 % \end{function}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -1,6 +1,6 @@
 % \iffalse meta-comment
 %
-%% File: l3int.dtx Copyright (C) 1990-2017 The LaTeX3 Project
+%% File: l3int.dtx Copyright (C) 1990-2018 The LaTeX3 Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %
@@ -1035,8 +1035,8 @@
 %   or directly in the input stream.
 %   When debugging, use parentheses to catch early termination.
 %    \begin{macrocode}
-\__debug_patch_args:nNNpn
-  { { \__debug_chk_expr:nNnN {#1} \@@_eval:w { } \int_eval:n } }
+\__kernel_patch_args:nNNpn
+  { { \__kernel_chk_expr:nNnN {#1} \@@_eval:w { } \int_eval:n } }
 \cs_new:Npn \int_eval:n #1
   { \@@_value:w \@@_eval:w #1 \@@_eval_end: }
 %    \end{macrocode}
@@ -1047,8 +1047,8 @@
 %   so as to produce an internal integer rather than expanding into
 %   characters.  This is for use in other modules.
 %    \begin{macrocode}
-\__debug_patch_args:nNNpn
-  { { \__debug_chk_expr:nNnN {#1} \@@_eval:w { } \@@_eval:n } }
+\__kernel_patch_args:nNNpn
+  { { \__kernel_chk_expr:nNnN {#1} \@@_eval:w { } \@@_eval:n } }
 \cs_new:Npn \@@_eval:n #1 { \@@_eval:w #1 \@@_eval_end: }
 %    \end{macrocode}
 % \end{macro}
@@ -1065,8 +1065,8 @@
 %   evaluation.  The absolute value is obtained by removing a leading
 %   sign if any.  All three functions expand in two steps.
 %    \begin{macrocode}
-\__debug_patch_args:nNNpn
-  { { \__debug_chk_expr:nNnN {#1} \@@_eval:w { } \int_abs:n } }
+\__kernel_patch_args:nNNpn
+  { { \__kernel_chk_expr:nNnN {#1} \@@_eval:w { } \int_abs:n } }
 \cs_new:Npn \int_abs:n #1
   {
     \@@_value:w \exp_after:wN \@@_abs:N
@@ -1075,10 +1075,10 @@
   }
 \cs_new:Npn \@@_abs:N #1
   { \if_meaning:w - #1 \else: \exp_after:wN #1 \fi: }
-\__debug_patch_args:nNNpn
+\__kernel_patch_args:nNNpn
   {
-    { \__debug_chk_expr:nNnN {#1} \@@_eval:w { } \int_max:nn }
-    { \__debug_chk_expr:nNnN {#2} \@@_eval:w { } \int_max:nn }
+    { \__kernel_chk_expr:nNnN {#1} \@@_eval:w { } \int_max:nn }
+    { \__kernel_chk_expr:nNnN {#2} \@@_eval:w { } \int_max:nn }
   }
 \cs_set:Npn \int_max:nn #1#2
   {
@@ -1088,10 +1088,10 @@
       >
     \exp_stop_f:
   }
-\__debug_patch_args:nNNpn
+\__kernel_patch_args:nNNpn
   {
-    { \__debug_chk_expr:nNnN {#1} \@@_eval:w { } \int_min:nn }
-    { \__debug_chk_expr:nNnN {#2} \@@_eval:w { } \int_min:nn }
+    { \__kernel_chk_expr:nNnN {#1} \@@_eval:w { } \int_min:nn }
+    { \__kernel_chk_expr:nNnN {#2} \@@_eval:w { } \int_min:nn }
   }
 \cs_set:Npn \int_min:nn #1#2
   {
@@ -1137,10 +1137,10 @@
 %   truncating behaviour that we want. The details are thanks to Heiko
 %   Oberdiek: getting things right in all cases is not so easy.
 %    \begin{macrocode}
-\__debug_patch_args:nNNpn
+\__kernel_patch_args:nNNpn
   {
-    { \__debug_chk_expr:nNnN {#1} \@@_eval:w { } \int_div_truncate:nn }
-    { \__debug_chk_expr:nNnN {#2} \@@_eval:w { } \int_div_truncate:nn }
+    { \__kernel_chk_expr:nNnN {#1} \@@_eval:w { } \int_div_truncate:nn }
+    { \__kernel_chk_expr:nNnN {#2} \@@_eval:w { } \int_div_truncate:nn }
   }
 \cs_new:Npn \int_div_truncate:nn #1#2
   {
@@ -1171,10 +1171,10 @@
 %    \end{macrocode}
 %   Finally there's the modulus operation.
 %    \begin{macrocode}
-\__debug_patch_args:nNNpn
+\__kernel_patch_args:nNNpn
   {
-    { \__debug_chk_expr:nNnN {#1} \@@_eval:w { } \int_mod:nn }
-    { \__debug_chk_expr:nNnN {#2} \@@_eval:w { } \int_mod:nn }
+    { \__kernel_chk_expr:nNnN {#1} \@@_eval:w { } \int_mod:nn }
+    { \__kernel_chk_expr:nNnN {#2} \@@_eval:w { } \int_mod:nn }
   }
 \cs_new:Npn \int_mod:nn #1#2
   {
@@ -1224,10 +1224,10 @@
 %   We cannot use \cs{int_gset:Nn} because (when |check-declarations| is
 %   enabled) this runs some checks that constants would fail.
 %    \begin{macrocode}
-\__debug_patch_args:nnnNNpn
-  { \__debug_chk_var_scope:NN c #1 }
+\__kernel_patch_args:nnnNNpn
+  { \__kernel_chk_var_scope:NN c #1 }
   { }
-  { {#1} { \__debug_chk_expr:nNnN {#2} \@@_eval:w { } \int_const:Nn } }
+  { {#1} { \__kernel_chk_expr:nNnN {#2} \@@_eval:w { } \int_const:Nn } }
 \cs_new_protected:Npn \int_const:Nn #1#2
   {
     \int_compare:nNnTF {#2} < \c_zero
@@ -1273,9 +1273,9 @@
 % \UnitTested
 %   Functions that reset an \meta{integer} register to zero.
 %    \begin{macrocode}
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \int_zero:N  #1 { #1 = \c_zero }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \int_gzero:N #1 { \tex_global:D #1 = \c_zero }
 \cs_generate_variant:Nn \int_zero:N  { c }
 \cs_generate_variant:Nn \int_gzero:N { c }
@@ -1305,10 +1305,10 @@
 %   another.  Check that assigned integer is local/global.  No need to
 %   check that the other one is defined as \TeX{} does it for us.
 %    \begin{macrocode}
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \int_set_eq:NN #1#2 { #1 = #2 }
 \cs_generate_variant:Nn \int_set_eq:NN { c , Nc , cc }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \int_gset_eq:NN #1#2 { \tex_global:D #1 = #2 }
 \cs_generate_variant:Nn \int_gset_eq:NN { c , Nc , cc }
 %    \end{macrocode}
@@ -1335,10 +1335,10 @@
 %    \begin{macrocode}
 \cs_set_protected:Npn \@@_tmp:w #1#2#3
   {
-    \__debug_patch_args:nnnNNpn
+    \__kernel_patch_args:nnnNNpn
       { #1 ##1 }
       { }
-      { {##1} { \__debug_chk_expr:nNnN {##2} \@@_eval:w { } #3 } }
+      { {##1} { \__kernel_chk_expr:nNnN {##2} \@@_eval:w { } #3 } }
     #2 #3
   }
 %    \end{macrocode}
@@ -1356,16 +1356,16 @@
 %    assigned variable is correctly local/global and wraps the
 %    expression in some checking code.
 %    \begin{macrocode}
-\@@_tmp:w \__debug_chk_var_local:N
+\@@_tmp:w \__kernel_chk_var_local:N
 \cs_new_protected:Npn \int_add:Nn #1#2
   { \tex_advance:D #1 by \@@_eval:w #2 \@@_eval_end: }
-\@@_tmp:w \__debug_chk_var_local:N
+\@@_tmp:w \__kernel_chk_var_local:N
 \cs_new_protected:Npn \int_sub:Nn #1#2
   { \tex_advance:D #1 by - \@@_eval:w #2 \@@_eval_end: }
-\@@_tmp:w \__debug_chk_var_global:N
+\@@_tmp:w \__kernel_chk_var_global:N
 \cs_new_protected:Npn \int_gadd:Nn #1#2
   { \tex_global:D \tex_advance:D #1 by \@@_eval:w #2 \@@_eval_end: }
-\@@_tmp:w \__debug_chk_var_global:N
+\@@_tmp:w \__kernel_chk_var_global:N
 \cs_new_protected:Npn \int_gsub:Nn #1#2
   { \tex_global:D \tex_advance:D #1 by - \@@_eval:w #2 \@@_eval_end: }
 \cs_generate_variant:Nn \int_add:Nn  { c }
@@ -1389,16 +1389,16 @@
 %   Incrementing and decrementing of integer registers is done with
 %   the following functions.
 %    \begin{macrocode}
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \int_incr:N #1
   { \tex_advance:D #1 \c_one }
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \int_decr:N #1
   { \tex_advance:D #1 - \c_one }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \int_gincr:N #1
   { \tex_global:D \tex_advance:D #1 \c_one }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \int_gdecr:N #1
   { \tex_global:D \tex_advance:D #1 - \c_one }
 \cs_generate_variant:Nn \int_incr:N  { c }
@@ -1420,10 +1420,10 @@
 %   existence as for token list variables.  However, the code that
 %   checks whether the assignment is local or global is still needed.
 %    \begin{macrocode}
-\@@_tmp:w \__debug_chk_var_local:N
+\@@_tmp:w \__kernel_chk_var_local:N
 \cs_new_protected:Npn \int_set:Nn #1#2
   { #1 ~ \@@_eval:w #2 \@@_eval_end: }
-\@@_tmp:w \__debug_chk_var_global:N
+\@@_tmp:w \__kernel_chk_var_global:N
 \cs_new_protected:Npn \int_gset:Nn #1#2
   { \tex_global:D #1 ~ \@@_eval:w #2 \@@_eval_end: }
 \cs_generate_variant:Nn \int_set:Nn  { c }
@@ -1474,7 +1474,7 @@
   {
     { }
     \c_zero \fi:
-    \__msg_kernel_expandable_error:nnn
+    \__kernel_msg_expandable_error:nnn
       { kernel } { unknown-comparison } {#1}
     \prg_return_false:
   }
@@ -1627,11 +1627,11 @@
 % \UnitTested
 % More efficient but less natural in typing.
 %    \begin{macrocode}
-\__debug_patch_conditional_args:nNNpnn
+\__kernel_patch_conditional_args:nNNpnn
   {
-    { \__debug_chk_expr:nNnN {#1} \@@_eval:w { } \int_compare:nNn }
+    { \__kernel_chk_expr:nNnN {#1} \@@_eval:w { } \int_compare:nNn }
     { \@@_eval_end: #2 }
-    { \__debug_chk_expr:nNnN {#3} \@@_eval:w { } \int_compare:nNn }
+    { \__kernel_chk_expr:nNnN {#3} \@@_eval:w { } \int_compare:nNn }
   }
 \prg_new_conditional:Npnn \int_compare:nNn #1#2#3 { p , T , F , TF }
   {
@@ -1691,8 +1691,8 @@
 % \UnitTested
 %   A predicate function.
 %    \begin{macrocode}
-\__debug_patch_conditional_args:nNNpnn
-  { { \__debug_chk_expr:nNnN {#1} \@@_eval:w { } \int_if_odd:n } }
+\__kernel_patch_conditional_args:nNNpnn
+  { { \__kernel_chk_expr:nNnN {#1} \@@_eval:w { } \int_if_odd:n } }
 \prg_new_conditional:Npnn \int_if_odd:n #1 { p , T , F , TF}
   {
     \if_int_odd:w \@@_eval:w #1 \@@_eval_end:
@@ -1701,8 +1701,8 @@
       \prg_return_false:
     \fi:
   }
-\__debug_patch_conditional_args:nNNpnn
-  { { \__debug_chk_expr:nNnN {#1} \@@_eval:w { } \int_if_even:n } }
+\__kernel_patch_conditional_args:nNNpnn
+  { { \__kernel_chk_expr:nNnN {#1} \@@_eval:w { } \int_if_even:n } }
 \prg_new_conditional:Npnn \int_if_even:n #1 { p , T , F , TF}
   {
     \if_int_odd:w \@@_eval:w #1 \@@_eval_end:
@@ -1818,11 +1818,11 @@
 %   step size of zero before checking the sign, but we optimize for the
 %   most frequent case (positive step).
 %    \begin{macrocode}
-\__debug_patch_args:nNNpn
+\__kernel_patch_args:nNNpn
   {
-    { \__debug_chk_expr:nNnN {#1} \@@_eval:w { } \int_step_function:nnnN }
-    { \__debug_chk_expr:nNnN {#2} \@@_eval:w { } \int_step_function:nnnN }
-    { \__debug_chk_expr:nNnN {#3} \@@_eval:w { } \int_step_function:nnnN }
+    { \__kernel_chk_expr:nNnN {#1} \@@_eval:w { } \int_step_function:nnnN }
+    { \__kernel_chk_expr:nNnN {#2} \@@_eval:w { } \int_step_function:nnnN }
+    { \__kernel_chk_expr:nNnN {#3} \@@_eval:w { } \int_step_function:nnnN }
   }
 \cs_new:Npn \int_step_function:nnnN #1#2#3
   {
@@ -1838,7 +1838,7 @@
       {
         \int_compare:nNnTF {#2} = \c_zero
           {
-            \__msg_kernel_expandable_error:nnn { kernel } { zero-step } {#4}
+            \__kernel_msg_expandable_error:nnn { kernel } { zero-step } {#4}
             \use_none:nnnn
           }
           { \@@_step:NnnnN < }
@@ -2593,14 +2593,9 @@
 %<package>\cs_gset_eq:NN \c__deprecation_minus_one \m at ne
 %<initex>\int_const:Nn \c__deprecation_minus_one { -1 }
 \cs_new_eq:NN \c_minus_one \c__deprecation_minus_one
-\__debug:TF
-  {
-    \tl_gput_right:Nn \g__debug_deprecation_on_tl
-      { \__deprecation_error:Nnn \c_minus_one { -1 } { 2018-12-31 } }
-    \tl_gput_right:Nn \g__debug_deprecation_off_tl
-      { \tex_let:D \c_minus_one \c__deprecation_minus_one }
-  }
-  { }
+\__kernel_deprecation_code:nn
+  { \__deprecation_error:Nnn \c_minus_one { -1 } { 2018-12-31 } }
+  { \tex_let:D \c_minus_one \c__deprecation_minus_one }
 %    \end{macrocode}
 % \end{variable}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %
@@ -184,7 +184,7 @@
         \int_compare:nTF { - \c_max_dim <= \int_abs:n {#3} <= \c_max_dim }
           { \@@_gset_fast:Nnn #1 {#2} {#3} }
           {
-            \__msg_kernel_error:nnxxxx { kernel } { overflow }
+            \__kernel_msg_error:nnxxxx { kernel } { overflow }
               { \token_to_str:N #1 } {#2} {#3}
               { \int_compare:nNnT {#3} < 0 { - } \__int_value:w \c_max_dim }
             \@@_gset_fast:Nnn #1 {#2}
@@ -192,7 +192,7 @@
           }
       }
       {
-        \__msg_kernel_error:nnxxx { kernel } { out-of-bounds }
+        \__kernel_msg_error:nnxxx { kernel } { out-of-bounds }
           { \token_to_str:N #1 } {#2} { \@@_count:N #1 }
       }
   }
@@ -213,7 +213,7 @@
     \int_compare:nTF { 1 <= #2 <= \@@_count:N #1 }
       { \@@_item_fast:Nn #1 {#2} }
       {
-        \__msg_kernel_expandable_error:nnnnn { kernel } { out-of-bounds }
+        \__kernel_msg_expandable_error:nnnnn { kernel } { out-of-bounds }
           { \token_to_str:N #1 } {#2} { \@@_count:N #1 }
         0
       }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -1,6 +1,6 @@
 % \iffalse meta-comment
 %
-%% File: l3keys.dtx Copyright (C) 2006-2017 The LaTeX3 Project
+%% File: l3keys.dtx Copyright (C) 2006-2018 The LaTeX3 Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %
@@ -1064,7 +1064,7 @@
           }
       \else:
         \cs_set:Npn \@@_action:
-          { \__msg_kernel_error:nn { kernel } { misplaced-equals-sign } }
+          { \__kernel_msg_error:nn { kernel } { misplaced-equals-sign } }
       \fi:
     \fi:
     \@@_action:
@@ -1079,7 +1079,7 @@
   }
 \cs_new:Npn \@@_action: { }
 \cs_new_protected:Npn \@@_empty_key:
-  { \__msg_kernel_error:nn { kernel } { misplaced-equals-sign } }
+  { \__kernel_msg_error:nn { kernel } { misplaced-equals-sign } }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
@@ -1105,7 +1105,7 @@
 %
 % One message for the low level parsing system.
 %    \begin{macrocode}
-\__msg_kernel_new:nnnn { kernel } { misplaced-equals-sign }
+\__kernel_msg_new:nnnn { kernel } { misplaced-equals-sign }
   { Misplaced~equals~sign~in~key-value~input~\msg_line_number: }
   {
     LaTeX~is~attempting~to~parse~some~key-value~input~but~found~
@@ -1295,7 +1295,7 @@
       {
          \tl_if_empty:NF \l_@@_property_tl
            {
-             \__msg_kernel_error:nnxx { kernel } { property-unknown }
+             \__kernel_msg_error:nnxx { kernel } { property-unknown }
               { \l_@@_property_tl } { \l_keys_path_tl }
            }
       }
@@ -1321,7 +1321,7 @@
     \tl_if_blank:nTF {#3}
       {
         \tl_clear:N \l_@@_property_tl
-        \__msg_kernel_error:nnn { kernel } { key-no-property } {#4}
+        \__kernel_msg_error:nnn { kernel } { key-no-property } {#4}
       }
       {
         \str_if_eq:nnTF {#3} { . }
@@ -1372,7 +1372,7 @@
           \l_@@_property_tl \q_stop
           { \use:c { \c_@@_props_root_tl \l_@@_property_tl } }
           {
-            \__msg_kernel_error:nnxx { kernel }
+            \__kernel_msg_error:nnxx { kernel }
               { property-requires-value } { \l_@@_property_tl }
               { \l_keys_path_tl }
             }
@@ -1406,7 +1406,7 @@
       { \exp_not:c { bool_ #2 set_false:N } \exp_not:N #1 }
     \@@_cmd_set:nn { \l_keys_path_tl / unknown }
       {
-        \__msg_kernel_error:nnx { kernel } { boolean-values-only }
+        \__kernel_msg_error:nnx { kernel } { boolean-values-only }
           { \l_keys_key_tl }
       }
     \@@_default_set:n { true }
@@ -1428,7 +1428,7 @@
       { \exp_not:c { bool_ #2 set_true:N } \exp_not:N #1 }
     \@@_cmd_set:nn { \l_keys_path_tl / unknown }
       {
-        \__msg_kernel_error:nnx { kernel } { boolean-values-only }
+        \__kernel_msg_error:nnx { kernel } { boolean-values-only }
           { \l_keys_key_tl }
       }
     \@@_default_set:n { true }
@@ -1457,7 +1457,7 @@
           { \exp_not:v { \c_@@_type_root_tl \@@_parent:o \l_keys_path_tl } }
           { choice }
           {
-            \__msg_kernel_error:nnxx { kernel } { nested-choice-key }
+            \__kernel_msg_error:nnxx { kernel } { nested-choice-key }
               { \l_keys_path_tl } { \@@_parent:o \l_keys_path_tl }
           }
           { \@@_choice_make_aux:N #1 }
@@ -1470,7 +1470,7 @@
     \@@_cmd_set:nn { \l_keys_path_tl } { #1 {##1} }
     \@@_cmd_set:nn { \l_keys_path_tl / unknown }
       {
-        \__msg_kernel_error:nnxx { kernel } { key-choice-unknown }
+        \__kernel_msg_error:nnxx { kernel } { key-choice-unknown }
           { \l_keys_path_tl } {##1}
       }
   }
@@ -1513,10 +1513,10 @@
 %   Setting the code for a key first logs if appropriate that we are
 %   defining a new key, then saves the code.
 %    \begin{macrocode}
-\__debug_patch:nnNNpn
+\__kernel_patch:nnNNpn
   {
     \cs_if_exist:cF { \c_@@_code_root_tl #1 }
-      { \__debug_log:x { Defining~key~#1~\msg_line_context: } }
+      { \__kernel_debug_log:x { Defining~key~#1~\msg_line_context: } }
   }
   { }
 \cs_new_protected:Npn \@@_cmd_set:nn #1#2
@@ -1658,7 +1658,7 @@
           }
       }
       {
-        \__msg_kernel_error:nnx { kernel } { property-boolean-values-only }
+        \__kernel_msg_error:nnx { kernel } { property-boolean-values-only }
           { .value_ #1 :n }
       }
   }
@@ -1666,7 +1666,7 @@
   {
     \bool_if:NF \l_@@_no_value_bool
       {
-        \__msg_kernel_error:nnxx { kernel } { value-forbidden }
+        \__kernel_msg_error:nnxx { kernel } { value-forbidden }
           { \l_keys_path_tl } { \l_keys_value_tl }
         \@@_validate_cleanup:w
       }
@@ -1675,7 +1675,7 @@
   {
     \bool_if:NT \l_@@_no_value_bool
       {
-        \__msg_kernel_error:nnx { kernel } { value-required }
+        \__kernel_msg_error:nnx { kernel } { value-required }
           { \l_keys_path_tl }
         \@@_validate_cleanup:w
       }
@@ -2338,7 +2338,7 @@
                   \exp_after:wN \cs_end: \exp_after:wN { \l_keys_value_tl }
               }
               {
-                \__msg_kernel_error:nnxx { kernel } { key-unknown }
+                \__kernel_msg_error:nnxx { kernel } { key-unknown }
                   { \l_keys_path_tl } { \l_@@_module_tl }
               }
           }
@@ -2471,16 +2471,16 @@
 %
 % For when there is a need to complain.
 %    \begin{macrocode}
-\__msg_kernel_new:nnnn { kernel } { boolean-values-only }
+\__kernel_msg_new:nnnn { kernel } { boolean-values-only }
   { Key~'#1'~accepts~boolean~values~only. }
   { The~key~'#1'~only~accepts~the~values~'true'~and~'false'. }
-\__msg_kernel_new:nnnn { kernel } { key-choice-unknown }
+\__kernel_msg_new:nnnn { kernel } { key-choice-unknown }
   { Key~'#1'~accepts~only~a~fixed~set~of~choices. }
   {
     The~key~'#1'~only~accepts~predefined~values,~
     and~'#2'~is~not~one~of~these.
   }
-\__msg_kernel_new:nnnn { kernel } { key-no-property }
+\__kernel_msg_new:nnnn { kernel } { key-no-property }
   { No~property~given~in~definition~of~key~'#1'. }
   {
     \c__msg_coding_error_text_tl
@@ -2489,25 +2489,25 @@
     \iow_indent:n { #1 .<property> } \\ \\
     LaTeX~did~not~find~a~'.'~to~indicate~the~start~of~a~property.
   }
-\__msg_kernel_new:nnnn { kernel } { key-unknown }
+\__kernel_msg_new:nnnn { kernel } { key-unknown }
   { The~key~'#1'~is~unknown~and~is~being~ignored. }
   {
     The~module~'#2'~does~not~have~a~key~called~'#1'.\\
     Check~that~you~have~spelled~the~key~name~correctly.
   }
-\__msg_kernel_new:nnnn { kernel } { nested-choice-key }
+\__kernel_msg_new:nnnn { kernel } { nested-choice-key }
   { Attempt~to~define~'#1'~as~a~nested~choice~key. }
   {
     The~key~'#1'~cannot~be~defined~as~a~choice~as~the~parent~key~'#2'~is~
     itself~a~choice.
   }
-\__msg_kernel_new:nnnn { kernel } { property-boolean-values-only }
+\__kernel_msg_new:nnnn { kernel } { property-boolean-values-only }
   { The~property~'#1'~accepts~boolean~values~only. }
   {
     \c__msg_coding_error_text_tl
     The~property~'#1'~only~accepts~the~values~'true'~and~'false'.
   }
-\__msg_kernel_new:nnnn { kernel } { property-requires-value }
+\__kernel_msg_new:nnnn { kernel } { property-requires-value }
   { The~property~'#1'~requires~a~value. }
   {
     \c__msg_coding_error_text_tl
@@ -2514,7 +2514,7 @@
     LaTeX~was~asked~to~set~property~'#1'~for~key~'#2'.\\
     No~value~was~given~for~the~property,~and~one~is~required.
   }
-\__msg_kernel_new:nnnn { kernel } { property-unknown }
+\__kernel_msg_new:nnnn { kernel } { property-unknown }
   { The~key~property~'#1'~is~unknown. }
   {
     \c__msg_coding_error_text_tl
@@ -2521,19 +2521,19 @@
     LaTeX~has~been~asked~to~set~the~property~'#1'~for~key~'#2':~
     this~property~is~not~defined.
   }
-\__msg_kernel_new:nnnn { kernel } { value-forbidden }
+\__kernel_msg_new:nnnn { kernel } { value-forbidden }
   { The~key~'#1'~does~not~take~a~value. }
   {
     The~key~'#1'~should~be~given~without~a~value.\\
     The~value~'#2'~was~present:~the~key~will~be~ignored.
   }
-\__msg_kernel_new:nnnn { kernel } { value-required }
+\__kernel_msg_new:nnnn { kernel } { value-required }
   { The~key~'#1'~requires~a~value. }
   {
     The~key~'#1'~must~have~a~value.\\
     No~value~was~present:~the~key~will~be~ignored.
   }
-\__msg_kernel_new:nnn { kernel } { show-key }
+\__kernel_msg_new:nnn { kernel } { show-key }
   {
     The~key~#1~
     \tl_if_empty:nTF {#2}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %
@@ -210,7 +210,7 @@
       {
         \cs_set:Npn #1 ##1
           {
-            \__msg_kernel_expandable_error:nnn
+            \__kernel_msg_expandable_error:nnn
               { kernel } { luatex-required } { #1 }
           }
       }
@@ -219,7 +219,7 @@
       {
         \cs_set_protected:Npn #1 ##1
           {
-            \__msg_kernel_error:nnn
+            \__kernel_msg_error:nnn
               { kernel } { luatex-required } { #1 }
           }
       }
@@ -232,7 +232,7 @@
 % \subsection{Messages}
 %
 %    \begin{macrocode}
-\__msg_kernel_new:nnnn { kernel } { luatex-required }
+\__kernel_msg_new:nnnn { kernel } { luatex-required }
   { LuaTeX~engine~not~in~use!~Ignoring~#1. }
   {
     The~feature~you~are~using~is~only~available~

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -1,6 +1,6 @@
 % \iffalse meta-comment
 %
-%% File: l3msg.dtx Copyright (C) 2009-2017 The LaTeX3 Project
+%% File: l3msg.dtx Copyright (C) 2009-2018 The LaTeX3 Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %
@@ -530,10 +530,10 @@
 % but have their own functions. This allows some text to be pre-defined,
 % and also ensures that serious errors can be handled properly.
 %
-% \begin{function}[updated = 2011-08-16]
-%   {\__msg_kernel_new:nnnn, \__msg_kernel_new:nnn}
+% \begin{function}[added = 2017-12-17]
+%   {\__kernel_msg_new:nnnn, \__kernel_msg_new:nnn}
 %   \begin{syntax}
-%     \cs{__msg_kernel_new:nnnn} \Arg{module} \Arg{message} \Arg{text} \Arg{more text}
+%     \cs{__kernel_msg_new:nnnn} \Arg{module} \Arg{message} \Arg{text} \Arg{more text}
 %   \end{syntax}
 %   Creates a kernel \meta{message} for a given \meta{module}.
 %   The message is defined to first give \meta{text} and then
@@ -544,9 +544,10 @@
 %   An error is raised if the \meta{message} already exists.
 % \end{function}
 %
-% \begin{function}{\__msg_kernel_set:nnnn, \__msg_kernel_set:nnn}
+% \begin{function}[added = 2017-12-17]
+%   {\__kernel_msg_set:nnnn, \__kernel_msg_set:nnn}
 %   \begin{syntax}
-%     \cs{__msg_kernel_set:nnnn} \Arg{module} \Arg{message} \Arg{text} \Arg{more text}
+%     \cs{__kernel_msg_set:nnnn} \Arg{module} \Arg{message} \Arg{text} \Arg{more text}
 %   \end{syntax}
 %   Sets up the text for a kernel \meta{message} for a given \meta{module}.
 %   The message is defined to first give \meta{text} and then
@@ -556,20 +557,20 @@
 %   these will be supplied and expanded at the time the message is used.
 % \end{function}
 %
-% \begin{function}[updated = 2012-08-11]
+% \begin{function}[added = 2017-12-17]
 %   {
-%     \__msg_kernel_fatal:nnnnnn ,
-%     \__msg_kernel_fatal:nnnnn  ,
-%     \__msg_kernel_fatal:nnnn   ,
-%     \__msg_kernel_fatal:nnn    ,
-%     \__msg_kernel_fatal:nn     ,
-%     \__msg_kernel_fatal:nnxxxx ,
-%     \__msg_kernel_fatal:nnxxx  ,
-%     \__msg_kernel_fatal:nnxx   ,
-%     \__msg_kernel_fatal:nnx
+%     \__kernel_msg_fatal:nnnnnn ,
+%     \__kernel_msg_fatal:nnnnn  ,
+%     \__kernel_msg_fatal:nnnn   ,
+%     \__kernel_msg_fatal:nnn    ,
+%     \__kernel_msg_fatal:nn     ,
+%     \__kernel_msg_fatal:nnxxxx ,
+%     \__kernel_msg_fatal:nnxxx  ,
+%     \__kernel_msg_fatal:nnxx   ,
+%     \__kernel_msg_fatal:nnx
 %   }
 %   \begin{syntax}
-%     \cs{__msg_kernel_fatal:nnnnnn} \Arg{module} \Arg{message} \Arg{arg one} \Arg{arg two} \Arg{arg three} \Arg{arg four}
+%     \cs{__kernel_msg_fatal:nnnnnn} \Arg{module} \Arg{message} \Arg{arg one} \Arg{arg two} \Arg{arg three} \Arg{arg four}
 %   \end{syntax}
 %   Issues kernel \meta{module} error \meta{message}, passing \meta{arg one}
 %   to \meta{arg four} to the text-creating functions. After issuing a
@@ -576,20 +577,20 @@
 %   fatal error the \TeX{} run halts. Cannot be redirected.
 % \end{function}
 %
-% \begin{function}[updated = 2012-08-11]
+% \begin{function}[added = 2017-12-17]
 %   {
-%     \__msg_kernel_error:nnnnnn ,
-%     \__msg_kernel_error:nnnnn  ,
-%     \__msg_kernel_error:nnnn   ,
-%     \__msg_kernel_error:nnn    ,
-%     \__msg_kernel_error:nn     ,
-%     \__msg_kernel_error:nnxxxx ,
-%     \__msg_kernel_error:nnxxx  ,
-%     \__msg_kernel_error:nnxx   ,
-%     \__msg_kernel_error:nnx
+%     \__kernel_msg_error:nnnnnn ,
+%     \__kernel_msg_error:nnnnn  ,
+%     \__kernel_msg_error:nnnn   ,
+%     \__kernel_msg_error:nnn    ,
+%     \__kernel_msg_error:nn     ,
+%     \__kernel_msg_error:nnxxxx ,
+%     \__kernel_msg_error:nnxxx  ,
+%     \__kernel_msg_error:nnxx   ,
+%     \__kernel_msg_error:nnx
 %   }
 %   \begin{syntax}
-%     \cs{__msg_kernel_error:nnnnnn} \Arg{module} \Arg{message} \Arg{arg one} \Arg{arg two} \Arg{arg three} \Arg{arg four}
+%     \cs{__kernel_msg_error:nnnnnn} \Arg{module} \Arg{message} \Arg{arg one} \Arg{arg two} \Arg{arg three} \Arg{arg four}
 %   \end{syntax}
 %   Issues kernel \meta{module} error \meta{message}, passing \meta{arg one}
 %   to
@@ -598,20 +599,20 @@
 %   the run continues. Cannot be redirected.
 % \end{function}
 %
-% \begin{function}[updated = 2012-08-11]
+% \begin{function}[added = 2017-12-17]
 %   {
-%     \__msg_kernel_warning:nnnnnn ,
-%     \__msg_kernel_warning:nnnnn  ,
-%     \__msg_kernel_warning:nnnn   ,
-%     \__msg_kernel_warning:nnn    ,
-%     \__msg_kernel_warning:nn     ,
-%     \__msg_kernel_warning:nnxxxx ,
-%     \__msg_kernel_warning:nnxxx  ,
-%     \__msg_kernel_warning:nnxx   ,
-%     \__msg_kernel_warning:nnx
+%     \__kernel_msg_warning:nnnnnn ,
+%     \__kernel_msg_warning:nnnnn  ,
+%     \__kernel_msg_warning:nnnn   ,
+%     \__kernel_msg_warning:nnn    ,
+%     \__kernel_msg_warning:nn     ,
+%     \__kernel_msg_warning:nnxxxx ,
+%     \__kernel_msg_warning:nnxxx  ,
+%     \__kernel_msg_warning:nnxx   ,
+%     \__kernel_msg_warning:nnx
 %   }
 %   \begin{syntax}
-%     \cs{__msg_kernel_warning:nnnnnn} \Arg{module} \Arg{message} \Arg{arg one} \Arg{arg two} \Arg{arg three} \Arg{arg four}
+%     \cs{__kernel_msg_warning:nnnnnn} \Arg{module} \Arg{message} \Arg{arg one} \Arg{arg two} \Arg{arg three} \Arg{arg four}
 %   \end{syntax}
 %   Issues kernel \meta{module} warning \meta{message}, passing
 %   \meta{arg one} to
@@ -619,20 +620,20 @@
 %   is added to the log file, but the \TeX{} run is not interrupted.
 % \end{function}
 %
-% \begin{function}[updated = 2012-08-11]
+% \begin{function}[added = 2017-12-17]
 %   {
-%     \__msg_kernel_info:nnnnnn ,
-%     \__msg_kernel_info:nnnnn  ,
-%     \__msg_kernel_info:nnnn   ,
-%     \__msg_kernel_info:nnn    ,
-%     \__msg_kernel_info:nn     ,
-%     \__msg_kernel_info:nnxxxx ,
-%     \__msg_kernel_info:nnxxx  ,
-%     \__msg_kernel_info:nnxx   ,
-%     \__msg_kernel_info:nnx
+%     \__kernel_msg_info:nnnnnn ,
+%     \__kernel_msg_info:nnnnn  ,
+%     \__kernel_msg_info:nnnn   ,
+%     \__kernel_msg_info:nnn    ,
+%     \__kernel_msg_info:nn     ,
+%     \__kernel_msg_info:nnxxxx ,
+%     \__kernel_msg_info:nnxxx  ,
+%     \__kernel_msg_info:nnxx   ,
+%     \__kernel_msg_info:nnx
 %   }
 %   \begin{syntax}
-%     \cs{__msg_kernel_info:nnnnnn} \Arg{module} \Arg{message} \Arg{arg one} \Arg{arg two} \Arg{arg three} \Arg{arg four}
+%     \cs{__kernel_msg_info:nnnnnn} \Arg{module} \Arg{message} \Arg{arg one} \Arg{arg two} \Arg{arg three} \Arg{arg four}
 %   \end{syntax}
 %   Issues kernel \meta{module} information \meta{message}, passing
 %   \meta{arg one} to \meta{arg four} to the text-creating functions.
@@ -649,16 +650,16 @@
 % message text and arguments are not expanded, and messages should be
 % very short.
 %
-% \begin{function}[EXP, added = 2011-11-23]
+% \begin{function}[EXP, added = 2017-12-17]
 %   {
-%     \__msg_kernel_expandable_error:nnnnnn,
-%     \__msg_kernel_expandable_error:nnnnn,
-%     \__msg_kernel_expandable_error:nnnn,
-%     \__msg_kernel_expandable_error:nnn,
-%     \__msg_kernel_expandable_error:nn
+%     \__kernel_msg_expandable_error:nnnnnn,
+%     \__kernel_msg_expandable_error:nnnnn,
+%     \__kernel_msg_expandable_error:nnnn,
+%     \__kernel_msg_expandable_error:nnn,
+%     \__kernel_msg_expandable_error:nn
 %   }
 %   \begin{syntax}
-%     \cs{__msg_kernel_expandable_error:nnnnnn} \Arg{module} \Arg{message} \Arg{arg one} \Arg{arg two} \Arg{arg three} \Arg{arg four}
+%     \cs{__kernel_msg_expandable_error:nnnnnn} \Arg{module} \Arg{message} \Arg{arg one} \Arg{arg two} \Arg{arg three} \Arg{arg four}
 %   \end{syntax}
 %   Issues an error, passing \meta{arg one} to \meta{arg four}
 %   to the text-creating functions. The resulting string must
@@ -750,13 +751,13 @@
 %   This auxiliary is similar to \cs{__chk_if_free_cs:N}, and is used when
 %   defining messages with \cs{msg_new:nnnn}.
 %    \begin{macrocode}
-\__debug_patch:nnNNpn { }
-  { \__debug_log:x { Defining~message~ #1 / #2 ~\msg_line_context: } }
+\__kernel_patch:nnNNpn { }
+  { \__kernel_debug_log:x { Defining~message~ #1 / #2 ~\msg_line_context: } }
 \cs_new_protected:Npn \__chk_if_free_msg:nn #1#2
   {
     \msg_if_exist:nnT {#1} {#2}
       {
-        \@@_kernel_error:nnxx { kernel } { message-already-defined }
+        \__kernel_msg_error:nnxx { kernel } { message-already-defined }
           {#1} {#2}
       }
   }
@@ -1378,7 +1379,7 @@
 \cs_new:Npn \@@_class_chk_exist:nT #1
   {
     \cs_if_free:cTF { @@_ #1 _code:nnnnnn }
-      { \@@_kernel_error:nnx { kernel } { message-class-unknown } {#1} }
+      { \__kernel_msg_error:nnx { kernel } { message-class-unknown } {#1} }
   }
 %    \end{macrocode}
 % \end{macro}
@@ -1444,7 +1445,7 @@
             \@@_use_redirect_name:n { #2 / #3 }
           }
       }
-      { \@@_kernel_error:nnxx { kernel } { message-unknown } {#2} {#3} }
+      { \__kernel_msg_error:nnxx { kernel } { message-unknown } {#2} {#3} }
   }
 \cs_new_protected:Npn \@@_use_code: { }
 %    \end{macrocode}
@@ -1592,7 +1593,7 @@
             \tl_if_eq:NNTF \l_@@_class_tl \l_@@_current_class_tl
               {
                 \prop_put:cnn { l_@@_redirect_ #2 _prop } {#3} {#2}
-                \@@_kernel_warning:nnxxxx
+                \__kernel_msg_warning:nnxxxx
                   { kernel } { message-redirect-loop }
                   { \seq_item:Nn \l_@@_class_loop_seq { 1 } }
                   { \seq_item:Nn \l_@@_class_loop_seq { 2 } }
@@ -1616,19 +1617,19 @@
 %
 % \subsection{Kernel-specific functions}
 %
-% \begin{macro}{\@@_kernel_new:nnnn, \@@_kernel_new:nnn}
-% \begin{macro}{\@@_kernel_set:nnnn, \@@_kernel_set:nnn}
+% \begin{macro}{\__kernel_msg_new:nnnn, \__kernel_msg_new:nnn}
+% \begin{macro}{\__kernel_msg_set:nnnn, \__kernel_msg_set:nnn}
 %   The kernel needs some messages of its own. These are created using
 %   pre-built functions. Two functions are provided: one more general
 %   and one which only has the short text part.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_kernel_new:nnnn #1#2
+\cs_new_protected:Npn \__kernel_msg_new:nnnn #1#2
   { \msg_new:nnnn { LaTeX } { #1 / #2 } }
-\cs_new_protected:Npn \@@_kernel_new:nnn #1#2
+\cs_new_protected:Npn \__kernel_msg_new:nnn #1#2
   { \msg_new:nnn { LaTeX } { #1 / #2 } }
-\cs_new_protected:Npn \@@_kernel_set:nnnn #1#2
+\cs_new_protected:Npn \__kernel_msg_set:nnnn #1#2
   { \msg_set:nnnn { LaTeX } { #1 / #2 } }
-\cs_new_protected:Npn \@@_kernel_set:nnn #1#2
+\cs_new_protected:Npn \__kernel_msg_set:nnn #1#2
   { \msg_set:nnn { LaTeX } { #1 / #2 } }
 %    \end{macrocode}
 % \end{macro}
@@ -1644,10 +1645,10 @@
 %    \begin{macrocode}
 \group_begin:
   \cs_set_protected:Npn \@@_kernel_class_new:nN #1
-    { \@@_kernel_class_new_aux:nN { kernel_ #1 } }
+    { \@@_kernel_class_new_aux:nN { __kernel_msg_ #1 } }
   \cs_set_protected:Npn \@@_kernel_class_new_aux:nN #1#2
     {
-      \cs_new_protected:cpn { @@_ #1 :nnnnnn } ##1##2##3##4##5##6
+      \cs_new_protected:cpn { #1 :nnnnnn } ##1##2##3##4##5##6
         {
           \use:x
             {
@@ -1656,29 +1657,29 @@
                 { \tl_to_str:n {##5} } { \tl_to_str:n {##6} }
             }
         }
-      \cs_new_protected:cpx { @@_ #1 :nnnnn } ##1##2##3##4##5
-        { \exp_not:c { @@_ #1 :nnnnnn } {##1} {##2} {##3} {##4} {##5} { } }
-      \cs_new_protected:cpx { @@_ #1 :nnnn } ##1##2##3##4
-        { \exp_not:c { @@_ #1 :nnnnnn } {##1} {##2} {##3} {##4} { } { } }
-      \cs_new_protected:cpx { @@_ #1 :nnn } ##1##2##3
-        { \exp_not:c { @@_ #1 :nnnnnn } {##1} {##2} {##3} { } { } { } }
-      \cs_new_protected:cpx { @@_ #1 :nn } ##1##2
-        { \exp_not:c { @@_ #1 :nnnnnn } {##1} {##2} { } { } { } { } }
-      \cs_new_protected:cpx { @@_ #1 :nnxxxx } ##1##2##3##4##5##6
+      \cs_new_protected:cpx { #1 :nnnnn } ##1##2##3##4##5
+        { \exp_not:c { #1 :nnnnnn } {##1} {##2} {##3} {##4} {##5} { } }
+      \cs_new_protected:cpx { #1 :nnnn } ##1##2##3##4
+        { \exp_not:c { #1 :nnnnnn } {##1} {##2} {##3} {##4} { } { } }
+      \cs_new_protected:cpx { #1 :nnn } ##1##2##3
+        { \exp_not:c { #1 :nnnnnn } {##1} {##2} {##3} { } { } { } }
+      \cs_new_protected:cpx { #1 :nn } ##1##2
+        { \exp_not:c { #1 :nnnnnn } {##1} {##2} { } { } { } { } }
+      \cs_new_protected:cpx { #1 :nnxxxx } ##1##2##3##4##5##6
         {
           \use:x
             {
               \exp_not:N \exp_not:n
-                { \exp_not:c { @@_ #1 :nnnnnn } {##1} {##2} }
+                { \exp_not:c { #1 :nnnnnn } {##1} {##2} }
                 {##3} {##4} {##5} {##6}
             }
         }
-      \cs_new_protected:cpx { @@_ #1 :nnxxx } ##1##2##3##4##5
-        { \exp_not:c { @@_ #1 :nnxxxx } {##1} {##2} {##3} {##4} {##5} { } }
-      \cs_new_protected:cpx { @@_ #1 :nnxx } ##1##2##3##4
-        { \exp_not:c { @@_ #1 :nnxxxx } {##1} {##2} {##3} {##4} { } { } }
-      \cs_new_protected:cpx { @@_ #1 :nnx } ##1##2##3
-        { \exp_not:c { @@_ #1 :nnxxxx } {##1} {##2} {##3} { } { } { } }
+      \cs_new_protected:cpx { #1 :nnxxx } ##1##2##3##4##5
+        { \exp_not:c { #1 :nnxxxx } {##1} {##2} {##3} {##4} {##5} { } }
+      \cs_new_protected:cpx { #1 :nnxx } ##1##2##3##4
+        { \exp_not:c { #1 :nnxxxx } {##1} {##2} {##3} {##4} { } { } }
+      \cs_new_protected:cpx { #1 :nnx } ##1##2##3
+        { \exp_not:c { #1 :nnxxxx } {##1} {##2} {##3} { } { } { } }
     }
 %    \end{macrocode}
 % \end{macro}
@@ -1686,24 +1687,24 @@
 %
 % \begin{macro}
 %   {
-%     \@@_kernel_fatal:nnnnnn ,
-%     \@@_kernel_fatal:nnnnn  ,
-%     \@@_kernel_fatal:nnnn   ,
-%     \@@_kernel_fatal:nnn    ,
-%     \@@_kernel_fatal:nn     ,
-%     \@@_kernel_fatal:nnxxxx ,
-%     \@@_kernel_fatal:nnxxx  ,
-%     \@@_kernel_fatal:nnxx   ,
-%     \@@_kernel_fatal:nnx    ,
-%     \@@_kernel_error:nnnnnn ,
-%     \@@_kernel_error:nnnnn  ,
-%     \@@_kernel_error:nnnn   ,
-%     \@@_kernel_error:nnn    ,
-%     \@@_kernel_error:nn     ,
-%     \@@_kernel_error:nnxxxx ,
-%     \@@_kernel_error:nnxxx  ,
-%     \@@_kernel_error:nnxx   ,
-%     \@@_kernel_error:nnx
+%     \__kernel_msg_fatal:nnnnnn ,
+%     \__kernel_msg_fatal:nnnnn  ,
+%     \__kernel_msg_fatal:nnnn   ,
+%     \__kernel_msg_fatal:nnn    ,
+%     \__kernel_msg_fatal:nn     ,
+%     \__kernel_msg_fatal:nnxxxx ,
+%     \__kernel_msg_fatal:nnxxx  ,
+%     \__kernel_msg_fatal:nnxx   ,
+%     \__kernel_msg_fatal:nnx    ,
+%     \__kernel_msg_error:nnnnnn ,
+%     \__kernel_msg_error:nnnnn  ,
+%     \__kernel_msg_error:nnnn   ,
+%     \__kernel_msg_error:nnn    ,
+%     \__kernel_msg_error:nn     ,
+%     \__kernel_msg_error:nnxxxx ,
+%     \__kernel_msg_error:nnxxx  ,
+%     \__kernel_msg_error:nnxx   ,
+%     \__kernel_msg_error:nnx
 %   }
 %   Neither fatal kernel errors nor kernel errors can be redirected.  We
 %   directly use the code for (non-kernel) fatal errors and errors,
@@ -1712,9 +1713,9 @@
 %   errors.
 %    \begin{macrocode}
   \@@_kernel_class_new:nN { fatal } \@@_fatal_code:nnnnnn
-  \cs_undefine:N \@@_kernel_error:nnxx
-  \cs_undefine:N \@@_kernel_error:nnx
-  \cs_undefine:N \@@_kernel_error:nn
+  \cs_undefine:N \__kernel_msg_error:nnxx
+  \cs_undefine:N \__kernel_msg_error:nnx
+  \cs_undefine:N \__kernel_msg_error:nn
   \@@_kernel_class_new:nN { error } \@@_error_code:nnnnnn
 %    \end{macrocode}
 % \end{macro}
@@ -1721,24 +1722,24 @@
 %
 % \begin{macro}
 %   {
-%     \@@_kernel_warning:nnnnnn ,
-%     \@@_kernel_warning:nnnnn  ,
-%     \@@_kernel_warning:nnnn   ,
-%     \@@_kernel_warning:nnn    ,
-%     \@@_kernel_warning:nn     ,
-%     \@@_kernel_warning:nnxxxx ,
-%     \@@_kernel_warning:nnxxx  ,
-%     \@@_kernel_warning:nnxx   ,
-%     \@@_kernel_warning:nnx    ,
-%     \@@_kernel_info:nnnnnn    ,
-%     \@@_kernel_info:nnnnn     ,
-%     \@@_kernel_info:nnnn      ,
-%     \@@_kernel_info:nnn       ,
-%     \@@_kernel_info:nn        ,
-%     \@@_kernel_info:nnxxxx    ,
-%     \@@_kernel_info:nnxxx     ,
-%     \@@_kernel_info:nnxx      ,
-%     \@@_kernel_info:nnx
+%     \__kernel_msg_warning:nnnnnn ,
+%     \__kernel_msg_warning:nnnnn  ,
+%     \__kernel_msg_warning:nnnn   ,
+%     \__kernel_msg_warning:nnn    ,
+%     \__kernel_msg_warning:nn     ,
+%     \__kernel_msg_warning:nnxxxx ,
+%     \__kernel_msg_warning:nnxxx  ,
+%     \__kernel_msg_warning:nnxx   ,
+%     \__kernel_msg_warning:nnx    ,
+%     \__kernel_msg_info:nnnnnn    ,
+%     \__kernel_msg_info:nnnnn     ,
+%     \__kernel_msg_info:nnnn      ,
+%     \__kernel_msg_info:nnn       ,
+%     \__kernel_msg_info:nn        ,
+%     \__kernel_msg_info:nnxxxx    ,
+%     \__kernel_msg_info:nnxxx     ,
+%     \__kernel_msg_info:nnxx      ,
+%     \__kernel_msg_info:nnx
 %   }
 %   Kernel messages which can be redirected simply use the machinery for
 %   normal messages, with the module name \enquote{\LaTeX{}}.
@@ -1756,7 +1757,7 @@
 % Error messages needed to actually implement the message system
 % itself.
 %    \begin{macrocode}
-\@@_kernel_new:nnnn { kernel } { message-already-defined }
+\__kernel_msg_new:nnnn { kernel } { message-already-defined }
   { Message~'#2'~for~module~'#1'~already~defined. }
   {
     \c_@@_coding_error_text_tl
@@ -1764,7 +1765,7 @@
     by~the~module~'#1':~this~message~already~exists.
     \c_@@_return_text_tl
   }
-\@@_kernel_new:nnnn { kernel } { message-unknown }
+\__kernel_msg_new:nnnn { kernel } { message-unknown }
   { Unknown~message~'#2'~for~module~'#1'. }
   {
     \c_@@_coding_error_text_tl
@@ -1772,7 +1773,7 @@
     by~the~module~'#1':~this~message~does~not~exist.
     \c_@@_return_text_tl
   }
-\@@_kernel_new:nnnn { kernel } { message-class-unknown }
+\__kernel_msg_new:nnnn { kernel } { message-class-unknown }
   { Unknown~message~class~'#1'. }
   {
     LaTeX~has~been~asked~to~redirect~messages~to~a~class~'#1':\\
@@ -1779,7 +1780,7 @@
     this~was~never~defined.
     \c_@@_return_text_tl
   }
-\@@_kernel_new:nnnn { kernel } { message-redirect-loop }
+\__kernel_msg_new:nnnn { kernel } { message-redirect-loop }
   {
     Message~redirection~loop~caused~by~ {#1} ~=>~ {#2}
     \tl_if_empty:nF {#3} { ~for~module~' \use_none:n #3 ' } .
@@ -1794,7 +1795,7 @@
 %
 % Messages for earlier kernel modules.
 %    \begin{macrocode}
-\@@_kernel_new:nnnn { kernel } { bad-number-of-arguments }
+\__kernel_msg_new:nnnn { kernel } { bad-number-of-arguments }
   { Function~'#1'~cannot~be~defined~with~#2~arguments. }
   {
     \c_@@_coding_error_text_tl
@@ -1802,17 +1803,17 @@
     #2~arguments.~
     TeX~allows~between~0~and~9~arguments~for~a~single~function.
   }
-\@@_kernel_new:nnn { kernel } { char-active }
+\__kernel_msg_new:nnn { kernel } { char-active }
   { Cannot~generate~active~chars. }
-\@@_kernel_new:nnn { kernel } { char-invalid-catcode }
+\__kernel_msg_new:nnn { kernel } { char-invalid-catcode }
   { Invalid~catcode~for~char~generation. }
-\@@_kernel_new:nnn { kernel } { char-null-space }
+\__kernel_msg_new:nnn { kernel } { char-null-space }
   { Cannot~generate~null~char~as~a~space. }
-\@@_kernel_new:nnn { kernel } { char-out-of-range }
+\__kernel_msg_new:nnn { kernel } { char-out-of-range }
   { Charcode~requested~out~of~engine~range. }
-\@@_kernel_new:nnn { kernel } { char-space }
+\__kernel_msg_new:nnn { kernel } { char-space }
   { Cannot~generate~space~chars. }
-\@@_kernel_new:nnnn { kernel } { command-already-defined }
+\__kernel_msg_new:nnnn { kernel } { command-already-defined }
   { Control~sequence~#1~already~defined. }
   {
     \c_@@_coding_error_text_tl
@@ -1821,7 +1822,7 @@
     The~current~meaning~is:\\
     \ \ #2
   }
-\@@_kernel_new:nnnn { kernel } { command-not-defined }
+\__kernel_msg_new:nnnn { kernel } { command-not-defined }
   { Control~sequence~#1~undefined. }
   {
     \c_@@_coding_error_text_tl
@@ -1828,12 +1829,12 @@
     LaTeX~has~been~asked~to~use~a~control~sequence~'#1':\\
     this~has~not~been~defined~yet.
   }
-\@@_kernel_new:nnn { kernel } { deprecated-command }
+\__kernel_msg_new:nnn { kernel } { deprecated-command }
   {
     The~deprecated~command~'#2'~has~been~or~will~be~removed~on~#1.
     \tl_if_empty:nF {#3} { ~Use~instead~'#3'. }
   }
-\@@_kernel_new:nnnn { kernel } { empty-search-pattern }
+\__kernel_msg_new:nnnn { kernel } { empty-search-pattern }
   { Empty~search~pattern. }
   {
     \c_@@_coding_error_text_tl
@@ -1840,7 +1841,7 @@
     LaTeX~has~been~asked~to~replace~an~empty~pattern~by~'#1':~that~
     would~lead~to~an~infinite~loop!
   }
-\@@_kernel_new:nnnn { kernel } { out-of-registers }
+\__kernel_msg_new:nnnn { kernel } { out-of-registers }
   { No~room~for~a~new~#1. }
   {
     TeX~only~supports~\int_use:N \c_max_register_int \ %
@@ -1847,7 +1848,7 @@
     of~each~type.~All~the~#1~registers~have~been~used.~
     This~run~will~be~aborted~now.
   }
-\@@_kernel_new:nnnn { kernel } { non-base-function }
+\__kernel_msg_new:nnnn { kernel } { non-base-function }
   { Function~'#1'~is~not~a~base~function }
   {
     \c_@@_coding_error_text_tl
@@ -1856,7 +1857,7 @@
     To~define~variants~use~\iow_char:N\\cs_generate_variant:Nn~
     and~to~define~other~functions~use~\iow_char:N\\cs_new:Npn.
   }
-\@@_kernel_new:nnnn { kernel } { missing-colon }
+\__kernel_msg_new:nnnn { kernel } { missing-colon }
   { Function~'#1'~contains~no~':'. }
   {
     \c_@@_coding_error_text_tl
@@ -1865,19 +1866,19 @@
     needed~when~defining~conditionals~or~variants,~or~when~building~a~
     parameter~text~from~the~number~of~arguments~of~the~function.
   }
-\@@_kernel_new:nnnn { kernel } { overflow }
+\__kernel_msg_new:nnnn { kernel } { overflow }
   { Integers~larger~than~2^{30}-1~cannot~be~stored~in~arrays. }
   {
     An~attempt~was~made~to~store~#3~at~position~#2~in~the~array~'#1'.~
     The~largest~allowed~value~#4~will~be~used~instead.
   }
-\@@_kernel_new:nnnn { kernel } { out-of-bounds }
+\__kernel_msg_new:nnnn { kernel } { out-of-bounds }
   { Access~to~an~entry~beyond~an~array's~bounds. }
   {
     An~attempt~was~made~to~access~or~store~data~at~position~#2~of~the~
     array~'#1',~but~this~array~has~entries~at~positions~from~1~to~#3.
   }
-\@@_kernel_new:nnnn { kernel } { protected-predicate }
+\__kernel_msg_new:nnnn { kernel } { protected-predicate }
   { Predicate~'#1'~must~be~expandable. }
   {
     \c_@@_coding_error_text_tl
@@ -1884,7 +1885,7 @@
     LaTeX~has~been~asked~to~define~'#1'~as~a~protected~predicate.~
     Only~expandable~tests~can~have~a~predicate~version.
   }
-\@@_kernel_new:nnnn { kernel } { conditional-form-unknown }
+\__kernel_msg_new:nnnn { kernel } { conditional-form-unknown }
   { Conditional~form~'#1'~for~function~'#2'~unknown. }
   {
     \c_@@_coding_error_text_tl
@@ -1891,7 +1892,7 @@
     LaTeX~has~been~asked~to~define~the~conditional~form~'#1'~of~
     the~function~'#2',~but~only~'TF',~'T',~'F',~and~'p'~forms~exist.
   }
-\@@_kernel_new:nnnn { kernel } { scanmark-already-defined }
+\__kernel_msg_new:nnnn { kernel } { scanmark-already-defined }
   { Scan~mark~#1~already~defined. }
   {
     \c_@@_coding_error_text_tl
@@ -1898,7 +1899,7 @@
     LaTeX~has~been~asked~to~create~a~new~scan~mark~'#1'~
     but~this~name~has~already~been~used~for~a~scan~mark.
   }
-\@@_kernel_new:nnnn { kernel } { variable-not-defined }
+\__kernel_msg_new:nnnn { kernel } { variable-not-defined }
   { Variable~#1~undefined. }
   {
     \c_@@_coding_error_text_tl
@@ -1905,7 +1906,7 @@
     LaTeX~has~been~asked~to~show~a~variable~#1,~but~this~has~not~
     been~defined~yet.
   }
-\@@_kernel_new:nnnn { kernel } { variant-too-long }
+\__kernel_msg_new:nnnn { kernel } { variant-too-long }
   { Variant~form~'#1'~longer~than~base~signature~of~'#2'. }
   {
     \c_@@_coding_error_text_tl
@@ -1913,7 +1914,7 @@
     with~a~signature~starting~with~'#1',~but~that~is~longer~than~
     the~signature~(part~after~the~colon)~of~'#2'.
   }
-\@@_kernel_new:nnnn { kernel } { invalid-variant }
+\__kernel_msg_new:nnnn { kernel } { invalid-variant }
   { Variant~form~'#1'~invalid~for~base~form~'#2'. }
   {
     \c_@@_coding_error_text_tl
@@ -1921,6 +1922,17 @@
     with~a~signature~starting~with~'#1',~but~cannot~change~an~argument~
     from~type~'#3'~to~type~'#4'.
   }
+\__kernel_msg_new:nnn { kernel } { deprecated-variant }
+  {
+    Variant~form~'#1'~deprecated~for~base~form~'#2'.~
+    One~should~not~change~an~argument~from~type~'#3'~to~type~'#4'
+    \str_case:nnF {#3}
+      {
+        { n } { :~use~a~'\token_if_eq_charcode:NNTF #4 c v V'~variant? }
+        { N } { :~base~form~only~accepts~a~single~token~argument. }
+        {#4} { :~base~form~is~already~a~variant. }
+      } { . }
+  }
 %    \end{macrocode}
 %
 % Some errors are only needed in package mode if debugging is enabled by
@@ -1931,7 +1943,7 @@
 %<*package>
 \bool_if:NTF \l at expl@enable at debug@bool
   {
-    \@@_kernel_new:nnnn { kernel } { debug }
+    \__kernel_msg_new:nnnn { kernel } { debug }
       { The~debugging~option~'#1'~does~not~exist~\msg_line_context:. }
       {
         The~functions~'\iow_char:N\\debug_on:n'~and~
@@ -1938,8 +1950,8 @@
         '\iow_char:N\\debug_off:n'~only~accept~the~arguments~
         'check-declarations',~'deprecation',~'log-functions',~not~'#1'.
       }
-    \@@_kernel_new:nnn { kernel } { expr } { '#2'~in~#1 }
-    \@@_kernel_new:nnnn { kernel } { local-global }
+    \__kernel_msg_new:nnn { kernel } { expr } { '#2'~in~#1 }
+    \__kernel_msg_new:nnnn { kernel } { local-global }
       { Inconsistent~local/global~assignment }
       {
         \c_@@_coding_error_text_tl
@@ -1948,7 +1960,7 @@
         \if:w l #1 local \else: \if:w g #1 global \else: constant \fi: \fi: \
         variable~'#3'.
       }
-    \@@_kernel_new:nnnn { kernel } { non-declared-variable }
+    \__kernel_msg_new:nnnn { kernel } { non-declared-variable }
       { The~variable~#1~has~not~been~declared~\msg_line_context:. }
       {
         Checking~is~active,~and~you~have~tried~do~so~something~like: \\
@@ -1960,7 +1972,7 @@
       }
   }
   {
-    \@@_kernel_new:nnnn { kernel } { enable-debug }
+    \__kernel_msg_new:nnnn { kernel } { enable-debug }
       { To~use~'#1'~load~expl3~with~the~'enable-debug'~option. }
       {
         The~function~'#1'~will~be~ignored~because~it~can~only~work~if~
@@ -1972,7 +1984,7 @@
   }
 %</package>
 %<*initex>
-\@@_kernel_new:nnnn { kernel } { enable-debug }
+\__kernel_msg_new:nnnn { kernel } { enable-debug }
   { '#1'~cannot~be~used~in~format~mode. }
   {
     The~function~'#1'~will~be~ignored~because~it~can~only~work~if~
@@ -1987,27 +1999,27 @@
 % Some errors only appear in expandable settings,
 % hence don't need a \enquote{more-text} argument.
 %    \begin{macrocode}
-\@@_kernel_new:nnn { kernel } { bad-exp-end-f }
+\__kernel_msg_new:nnn { kernel } { bad-exp-end-f }
   { Misused~\exp_end_continue_f:w or~:nw }
-\@@_kernel_new:nnn { kernel } { bad-variable }
+\__kernel_msg_new:nnn { kernel } { bad-variable }
   { Erroneous~variable~#1 used! }
-\@@_kernel_new:nnn { kernel } { misused-sequence }
+\__kernel_msg_new:nnn { kernel } { misused-sequence }
   { A~sequence~was~misused. }
-\@@_kernel_new:nnn { kernel } { misused-prop }
+\__kernel_msg_new:nnn { kernel } { misused-prop }
   { A~property~list~was~misused. }
-\@@_kernel_new:nnn { kernel } { negative-replication }
+\__kernel_msg_new:nnn { kernel } { negative-replication }
   { Negative~argument~for~\prg_replicate:nn. }
-\@@_kernel_new:nnn { kernel } { prop-keyval }
+\__kernel_msg_new:nnn { kernel } { prop-keyval }
   { Missing/extra~'='~in~'#1'~(in~'..._keyval:Nn') }
-\@@_kernel_new:nnn { kernel } { unknown-comparison }
+\__kernel_msg_new:nnn { kernel } { unknown-comparison }
   { Relation~'#1'~unknown:~use~=,~<,~>,~==,~!=,~<=,~>=. }
-\@@_kernel_new:nnn { kernel } { zero-step }
+\__kernel_msg_new:nnn { kernel } { zero-step }
   { Zero~step~size~for~step~function~#1. }
 %    \end{macrocode}
 %
 % Messages used by the \enquote{\texttt{show}} functions.
 %    \begin{macrocode}
-\@@_kernel_new:nnn { kernel } { show-clist }
+\__kernel_msg_new:nnn { kernel } { show-clist }
   {
     The~comma~list~ \tl_if_empty:nF {#1} { #1 ~ }
     \tl_if_empty:nTF {#2}
@@ -2014,7 +2026,7 @@
       { is~empty \\>~ . }
       { contains~the~items~(without~outer~braces): #2 . }
   }
-\@@_kernel_new:nnn { kernel } { show-prop }
+\__kernel_msg_new:nnn { kernel } { show-prop }
   {
     The~property~list~#1~
     \tl_if_empty:nTF {#2}
@@ -2021,7 +2033,7 @@
       { is~empty \\>~ . }
       { contains~the~pairs~(without~outer~braces): #2 . }
   }
-\@@_kernel_new:nnn { kernel } { show-seq }
+\__kernel_msg_new:nnn { kernel } { show-seq }
   {
     The~sequence~#1~
     \tl_if_empty:nTF {#2}
@@ -2028,7 +2040,7 @@
       { is~empty \\>~ . }
       { contains~the~items~(without~outer~braces): #2 . }
   }
-\@@_kernel_new:nnn { kernel } { show-streams }
+\__kernel_msg_new:nnn { kernel } { show-streams }
   {
     \tl_if_empty:nTF {#2} { No~ } { The~following~ }
     \str_case:nn {#1}
@@ -2087,11 +2099,11 @@
 %
 % \begin{macro}
 %   {
-%     \@@_kernel_expandable_error:nnnnnn,
-%     \@@_kernel_expandable_error:nnnnn,
-%     \@@_kernel_expandable_error:nnnn,
-%     \@@_kernel_expandable_error:nnn,
-%     \@@_kernel_expandable_error:nn
+%     \__kernel_msg_expandable_error:nnnnnn,
+%     \__kernel_msg_expandable_error:nnnnn,
+%     \__kernel_msg_expandable_error:nnnn,
+%     \__kernel_msg_expandable_error:nnn,
+%     \__kernel_msg_expandable_error:nn
 %   }
 %   The command built from the csname
 %   |\c_@@_text_prefix_tl LaTeX / #1 / #2|
@@ -2098,7 +2110,7 @@
 %   takes four arguments and builds the error text, which is fed to
 %   \cs{@@_expandable_error:n}.
 %    \begin{macrocode}
-\cs_new:Npn \@@_kernel_expandable_error:nnnnnn #1#2#3#4#5#6
+\cs_new:Npn \__kernel_msg_expandable_error:nnnnnn #1#2#3#4#5#6
   {
     \exp_args:Nf \@@_expandable_error:n
       {
@@ -2107,24 +2119,24 @@
           {#3} {#4} {#5} {#6}
       }
   }
-\cs_new:Npn \@@_kernel_expandable_error:nnnnn #1#2#3#4#5
+\cs_new:Npn \__kernel_msg_expandable_error:nnnnn #1#2#3#4#5
   {
-    \@@_kernel_expandable_error:nnnnnn
+    \__kernel_msg_expandable_error:nnnnnn
       {#1} {#2} {#3} {#4} {#5} { }
   }
-\cs_new:Npn \@@_kernel_expandable_error:nnnn #1#2#3#4
+\cs_new:Npn \__kernel_msg_expandable_error:nnnn #1#2#3#4
   {
-    \@@_kernel_expandable_error:nnnnnn
+    \__kernel_msg_expandable_error:nnnnnn
       {#1} {#2} {#3} {#4} { } { }
   }
-\cs_new:Npn \@@_kernel_expandable_error:nnn #1#2#3
+\cs_new:Npn \__kernel_msg_expandable_error:nnn #1#2#3
   {
-    \@@_kernel_expandable_error:nnnnnn
+    \__kernel_msg_expandable_error:nnnnnn
       {#1} {#2} {#3} { } { } { }
   }
-\cs_new:Npn \@@_kernel_expandable_error:nn #1#2
+\cs_new:Npn \__kernel_msg_expandable_error:nn #1#2
   {
-    \@@_kernel_expandable_error:nnnnnn
+    \__kernel_msg_expandable_error:nnnnnn
       {#1} {#2} { } { } { } { }
   }
 %    \end{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -1,6 +1,6 @@
 % \iffalse meta-comment
 %
-%% File: l3names.dtx Copyright (C) 1990-2017 The LaTeX3 project
+%% File: l3names.dtx Copyright (C) 1990-2018 The LaTeX3 project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %
@@ -779,8 +779,11 @@
   \@@_primitive:NN \aligntab                    \luatex_aligntab:D
   \@@_primitive:NN \attribute                   \luatex_attribute:D
   \@@_primitive:NN \attributedef                \luatex_attributedef:D
+  \@@_primitive:NN \automaticdiscretionary      \luatex_automaticdiscretionary:D
+  \@@_primitive:NN \automatichyphenmode         \luatex_automatichyphenmode:D
   \@@_primitive:NN \automatichyphenpenalty      \luatex_automatichyphenpenalty:D
   \@@_primitive:NN \begincsname                 \luatex_begincsname:D
+  \@@_primitive:NN \breakafterdirmode           \luatex_breakafterdirmode:D
   \@@_primitive:NN \catcodetable                \luatex_catcodetable:D
   \@@_primitive:NN \clearmarks                  \luatex_clearmarks:D
   \@@_primitive:NN \crampeddisplaystyle         \luatex_crampeddisplaystyle:D
@@ -795,6 +798,7 @@
   \@@_primitive:NN \etokspre                    \luatex_etokspre:D
   \@@_primitive:NN \explicithyphenpenalty       \luatex_explicithyphenpenalty:D
   \@@_primitive:NN \expanded                    \luatex_expanded:D
+  \@@_primitive:NN \explicitdiscretionary       \luatex_explicitdiscretionary:D
   \@@_primitive:NN \firstvalidlanguage          \luatex_firstvalidlanguage:D
   \@@_primitive:NN \fontid                      \luatex_fontid:D
   \@@_primitive:NN \formatname                  \luatex_formatname:D
@@ -811,15 +815,17 @@
   \@@_primitive:NN \luaescapestring             \luatex_luaescapestring:D
   \@@_primitive:NN \luafunction                 \luatex_luafunction:D
   \@@_primitive:NN \luatexbanner                \luatex_luatexbanner:D
-  \@@_primitive:NN \luatexdatestamp             \luatex_luatexdatestamp:D
   \@@_primitive:NN \luatexrevision              \luatex_luatexrevision:D
   \@@_primitive:NN \luatexversion               \luatex_luatexversion:D
+  \@@_primitive:NN \mathdelimitersmode          \luatex_mathdelimitersmode:D
   \@@_primitive:NN \mathdisplayskipmode         \luatex_mathdisplayskipmode:D
   \@@_primitive:NN \matheqnogapstep             \luatex_matheqnogapstep:D
   \@@_primitive:NN \mathnolimitsmode            \luatex_mathnolimitsmode:D
   \@@_primitive:NN \mathoption                  \luatex_mathoption:D
+  \@@_primitive:NN \mathpenaltiesmode           \luatex_mathpenaltiesmode:D
   \@@_primitive:NN \mathrulesfam                \luatex_mathrulesfam:D
   \@@_primitive:NN \mathscriptsmode             \luatex_mathscriptsmode:D
+  \@@_primitive:NN \mathscriptboxmode           \luatex_mathscriptboxmode:D
   \@@_primitive:NN \mathstyle                   \luatex_mathstyle:D
   \@@_primitive:NN \mathsurroundmode            \luatex_mathsurroundmode:D
   \@@_primitive:NN \mathsurroundskip            \luatex_mathsurroundskip:D
@@ -838,9 +844,11 @@
   \@@_primitive:NN \pdfvariable                 \luatex_pdfvariable:D
   \@@_primitive:NN \postexhyphenchar            \luatex_postexhyphenchar:D
   \@@_primitive:NN \posthyphenchar              \luatex_posthyphenchar:D
+  \@@_primitive:NN \prebinoppenalty             \luatex_prebinoppenalty:D
   \@@_primitive:NN \predisplaygapfactor         \luatex_predisplaygapfactor:D
   \@@_primitive:NN \preexhyphenchar             \luatex_preexhyphenchar:D
   \@@_primitive:NN \prehyphenchar               \luatex_prehyphenchar:D
+  \@@_primitive:NN \prerelpenalty               \luatex_prerelpenalty:D
   \@@_primitive:NN \savecatcodetable            \luatex_savecatcodetable:D
   \@@_primitive:NN \scantextokens               \luatex_scantextokens:D
   \@@_primitive:NN \setfontid                   \luatex_setfontid:D
@@ -849,6 +857,7 @@
   \@@_primitive:NN \suppresslongerror           \luatex_suppresslongerror:D
   \@@_primitive:NN \suppressmathparerror        \luatex_suppressmathparerror:D
   \@@_primitive:NN \suppressoutererror          \luatex_suppressoutererror:D
+  \@@_primitive:NN \suppressprimitiveerror      \luatex_suppressprimitiveerror:D
   \@@_primitive:NN \toksapp                     \luatex_toksapp:D
   \@@_primitive:NN \tokspre                     \luatex_tokspre:D
   \@@_primitive:NN \tpack                       \luatex_tpack:D
@@ -1043,6 +1052,8 @@
   \@@_primitive:NN \Umathunderbarvgap           \utex_underbarvgap:D
   \@@_primitive:NN \Umathunderdelimiterbgap     \utex_underdelimiterbgap:D
   \@@_primitive:NN \Umathunderdelimitervgap     \utex_underdelimitervgap:D
+  \@@_primitive:NN \Unosubscript                \utex_Unosubscript:D
+  \@@_primitive:NN \Unosuperscript              \utex_Unosuperscript:D
   \@@_primitive:NN \Uoverdelimiter              \utex_overdelimiter:D
   \@@_primitive:NN \Uradical                    \utex_radical:D
   \@@_primitive:NN \Uroot                       \utex_root:D

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3oldmodules.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3oldmodules.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3oldmodules.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -1,6 +1,6 @@
 % \iffalse meta-comment
 %
-%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project
+%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -42,7 +42,7 @@
 % }
 %
 %
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %
@@ -92,7 +92,6 @@
 %<l3candidates>{l3candidates}
 %<l3clist>{l3clist}
 %<l3coffins>{l3coffins}
-%<l3color>{l3color}
 %<l3expan>{l3expan}
 %<l3file>{l3file}
 %<l3fp>{l3fp}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -1,6 +1,6 @@
 % \iffalse meta-comment
 %
-%% File: l3prg.dtx Copyright (C) 2005-2017 The LaTeX3 Project
+%% File: l3prg.dtx Copyright (C) 2005-2018 The LaTeX3 Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %
@@ -811,16 +811,16 @@
 %   make sure the boolean exists.  This is needed because booleans are
 %   not based on token lists nor on \TeX{} registers.
 %    \begin{macrocode}
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \bool_set_true:N #1
   { \cs_set_eq:NN #1 \c_true_bool }
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \bool_set_false:N #1
   { \cs_set_eq:NN #1 \c_false_bool }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \bool_gset_true:N #1
   { \cs_gset_eq:NN #1 \c_true_bool }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \bool_gset_false:N #1
   { \cs_gset_eq:NN #1 \c_false_bool }
 \cs_generate_variant:Nn \bool_set_true:N   { c }
@@ -855,10 +855,10 @@
 %   argument the meaning \cs{c_true_bool} or \cs{c_false_bool}.
 %   Again, we include some checking code.
 %    \begin{macrocode}
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \bool_set:Nn #1#2
   { \tex_chardef:D #1 = \bool_if_p:n {#2} }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \bool_gset:Nn #1#2
   { \tex_global:D \tex_chardef:D #1 = \bool_if_p:n {#2} }
 \cs_generate_variant:Nn \bool_set:Nn  { c }
@@ -1425,7 +1425,7 @@
 \cs_new:cpn { @@_replicate_first_-:n } #1
   {
     \exp_end:
-    \__msg_kernel_expandable_error:nn { kernel } { negative-replication }
+    \__kernel_msg_expandable_error:nn { kernel } { negative-replication }
   }
 \cs_new:cpn { @@_replicate_first_0:n } #1 { \exp_end: }
 \cs_new:cpn { @@_replicate_first_1:n } #1 { \exp_end: #1 }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %
@@ -535,7 +535,7 @@
 %   error and removes its argument.
 %    \begin{macrocode}
 \cs_new:Npn \@@_pair:wn #1 \s_@@ #2
-  { \__msg_kernel_expandable_error:nn { kernel } { misused-prop } }
+  { \__kernel_msg_expandable_error:nn { kernel } { misused-prop } }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -694,7 +694,7 @@
             \s_@@ { \exp_not:n {#1} }
           }
           {
-            \exp_args:Nnno \__msg_kernel_expandable_error:nnn
+            \exp_args:Nnno \__kernel_msg_expandable_error:nnn
               { kernel } { prop-keyval } {#4}
           }
       }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -1,6 +1,6 @@
 % \iffalse meta-comment
 %
-%% File: l3quark.dtx Copyright (C) 1990-2017 The LaTeX3 Project
+%% File: l3quark.dtx Copyright (C) 1990-2018 The LaTeX3 Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %
@@ -375,7 +375,7 @@
 % \UnitTested
 %    Allocate a new quark.
 %    \begin{macrocode}
-\__debug_patch:nnNNpn { \__debug_chk_var_scope:NN q #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_scope:NN q #1 } { }
 \cs_new_protected:Npn \quark_new:N #1
   {
     \__chk_if_free_cs:N #1
@@ -599,7 +599,7 @@
   {
     \tl_if_in:NnTF \g_@@_marks_tl { #1 }
       {
-        \__msg_kernel_error:nnx { kernel } { scanmark-already-defined }
+        \__kernel_msg_error:nnx { kernel } { scanmark-already-defined }
           { \token_to_str:N #1 }
       }
       {

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -1,6 +1,6 @@
 % \iffalse meta-comment
 %
-%% File: l3regex.dtx Copyright (C) 2011-2017 The LaTeX3 Project
+%% File: l3regex.dtx Copyright (C) 2011-2018 The LaTeX3 Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %
@@ -120,8 +120,8 @@
 %   sign.
 % \item \verb*"[+\-\ ]*\d+\ *" matches an explicit integer with any
 %   number of $+$ and $-$ signs, with spaces allowed except within the
-%   mantissa, and sourrounded by spaces.
-% \item \verb*"[+\-\ ]*(\d+|\d*\.\d+)\ *" matches an explict integer or
+%   mantissa, and surrounded by spaces.
+% \item \verb*"[+\-\ ]*(\d+|\d*\.\d+)\ *" matches an explicit integer or
 %   decimal number; using \verb*"[.,]" instead of \verb*"\." would allow
 %   the comma as a decimal marker.
 % \item
@@ -537,7 +537,7 @@
 %   equal to the number of times
 %   \meta{regular expression} appears in \meta{token list}.
 %   The search starts by finding the left-most longest match,
-%   respecting greedy and ungreedy operators. Then the search
+%   respecting greedy and lazy (non-greedy) operators. Then the search
 %   starts again from the character following the last character
 %   of the previous match, until reaching the end of the token list.
 %   Infinite loops are prevented in the case where the regular expression
@@ -1457,11 +1457,11 @@
 %   \cs{__tl_build_one:o} by a single call to \cs{__tl_build_one:x}, because
 %   the \texttt{x}-expanding assignment may be interrupted by |\x|.
 %    \begin{macrocode}
-\__debug_patch:nnNNpn
+\__kernel_patch:nnNNpn
   {
-    \__debug_trace_push:nnN { regex } { 1 } \@@_escape_use:nnnn
+    \@@_trace_push:nnN { regex } { 1 } \@@_escape_use:nnnn
     \__tl_build:Nw \l_@@_internal_a_tl
-      \__tl_build_one:n { \__debug_trace_pop:nnN { regex } { 1 } \@@_escape_use:nnnn }
+      \__tl_build_one:n { \@@_trace_pop:nnN { regex } { 1 } \@@_escape_use:nnnn }
       \use_none:nn
   }
   { }
@@ -1536,7 +1536,7 @@
 \cs_new:cpn { @@_escape_/break:w }
   {
     \if_false: { \fi: }
-    \__msg_kernel_error:nn { kernel } { trailing-backslash }
+    \__kernel_msg_error:nn { kernel } { trailing-backslash }
     \exp_after:wN \use_none:n \exp_after:wN { \if_false: } \fi:
   }
 \cs_new:cpn { @@_escape_~:w } { }
@@ -1575,7 +1575,7 @@
       {
         \if_false: { \fi: }
         \__tl_build_one:o \l_@@_internal_b_tl
-        \__msg_kernel_error:nnx { kernel } { x-overflow } {#1}
+        \__kernel_msg_error:nnx { kernel } { x-overflow } {#1}
         \tl_set:Nx \l_@@_internal_b_tl
           { \if_false: } \fi:
       }
@@ -1664,7 +1664,7 @@
   {
     \if_false: { \fi: }
     \__tl_build_one:o \l_@@_internal_b_tl
-    \__msg_kernel_error:nnx { kernel } { x-missing-rbrace } {#1}
+    \__kernel_msg_error:nnx { kernel } { x-missing-rbrace } {#1}
     \tl_set:Nx \l_@@_internal_b_tl
       { \if_false: } \fi: \@@_escape_loop:N #1
   }
@@ -2080,7 +2080,7 @@
       \if_int_compare:w \l_@@_mode_int = \c_@@_class_mode_int
         \exp_after:wN \exp_after:wN \exp_after:wN \use:n
       \else:
-        \__msg_kernel_error:nn { kernel } { c-bad-mode }
+        \__kernel_msg_error:nn { kernel } { c-bad-mode }
         \exp_after:wN \exp_after:wN \exp_after:wN \use_none:n
       \fi:
     \fi:
@@ -2129,13 +2129,13 @@
   {
       \@@_if_in_class:TF
         {
-          \__msg_kernel_error:nn { kernel } { missing-rbrack }
+          \__kernel_msg_error:nn { kernel } { missing-rbrack }
           \use:c { @@_compile_]: }
           \prg_do_nothing: \prg_do_nothing:
         }
         { }
       \if_int_compare:w \l_@@_group_level_int > 0 \exp_stop_f:
-        \__msg_kernel_error:nnx { kernel } { missing-rparen }
+        \__kernel_msg_error:nnx { kernel } { missing-rparen }
           { \int_use:N \l_@@_group_level_int }
         \prg_replicate:nn
           { \l_@@_group_level_int }
@@ -2186,10 +2186,10 @@
       \prg_do_nothing: \prg_do_nothing:
       \prg_do_nothing: \prg_do_nothing:
       \int_compare:nNnT \l_@@_mode_int = \c_@@_catcode_mode_int
-        { \__msg_kernel_error:nn { kernel } { c-trailing } }
+        { \__kernel_msg_error:nn { kernel } { c-trailing } }
       \int_compare:nNnT \l_@@_mode_int < \c_@@_outer_mode_int
         {
-          \__msg_kernel_error:nn { kernel } { c-missing-rbrace }
+          \__kernel_msg_error:nn { kernel } { c-missing-rbrace }
           \@@_compile_end_cs:
           \prg_do_nothing: \prg_do_nothing:
           \prg_do_nothing: \prg_do_nothing:
@@ -2296,7 +2296,7 @@
 \cs_new_protected:Npn \@@_compile_quantifier_abort:xNN #1#2#3
   {
     \@@_compile_quantifier_none:
-    \__msg_kernel_warning:nnxx { kernel } { invalid-quantifier } {#1} {#3}
+    \__kernel_msg_warning:nnxx { kernel } { invalid-quantifier } {#1} {#3}
     \@@_compile_abort_tokens:x {#1}
     #2 #3
   }
@@ -2409,7 +2409,7 @@
       { #1 #2 } { \@@_compile_special:N \c_right_brace_str }
       {
         \if_int_compare:w \l_@@_internal_a_int > \l_@@_internal_b_int
-          \__msg_kernel_error:nnxx { kernel } { backwards-quantifier }
+          \__kernel_msg_error:nnxx { kernel } { backwards-quantifier }
             { \int_use:N \l_@@_internal_a_int }
             { \int_use:N \l_@@_internal_b_int }
           \int_zero:N \l_@@_internal_b_int
@@ -2443,7 +2443,7 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_compile_raw_error:N #1
   {
-    \__msg_kernel_error:nnx { kernel } { bad-escape } {#1}
+    \__kernel_msg_error:nnx { kernel } { bad-escape } {#1}
     \@@_compile_raw:N #1
   }
 %    \end{macrocode}
@@ -2502,7 +2502,7 @@
     \@@_if_end_range:NNTF #2 #3
       {
         \if_int_compare:w `#1 > `#3 \exp_stop_f:
-          \__msg_kernel_error:nnxx { kernel } { range-backwards } {#1} {#3}
+          \__kernel_msg_error:nnxx { kernel } { range-backwards } {#1} {#3}
         \else:
           \__tl_build_one:x
             {
@@ -2516,7 +2516,7 @@
         \fi:
       }
       {
-        \__msg_kernel_warning:nnxx { kernel } { range-missing-end }
+        \__kernel_msg_warning:nnxx { kernel } { range-missing-end }
           {#1} { \c_backslash_str #3 }
         \__tl_build_one:x
           {
@@ -2794,8 +2794,8 @@
         \str_case:nn { #2 }
           {
             : { \@@_compile_class_posix:NNNNw }
-            = { \__msg_kernel_warning:nnx { kernel } { posix-unsupported } { = } }
-            . { \__msg_kernel_warning:nnx { kernel } { posix-unsupported } { . } }
+            = { \__kernel_msg_warning:nnx { kernel } { posix-unsupported } { = } }
+            . { \__kernel_msg_warning:nnx { kernel } { posix-unsupported } { . } }
           }
       }
     \@@_compile_raw:N [ #1 #2
@@ -2834,7 +2834,7 @@
               }
           }
           {
-            \__msg_kernel_warning:nnx { kernel } { posix-unknown }
+            \__kernel_msg_warning:nnx { kernel } { posix-unknown }
               { \l_@@_internal_a_tl }
             \@@_compile_abort_tokens:x
               {
@@ -2844,7 +2844,7 @@
           }
       }
       {
-        \__msg_kernel_error:nnxx { kernel } { posix-missing-close }
+        \__kernel_msg_error:nnxx { kernel } { posix-missing-close }
           { [: \l_@@_internal_a_tl } { #2 #4 }
         \@@_compile_abort_tokens:x { [: \l_@@_internal_a_tl }
         #1 #2 #3 #4
@@ -2886,7 +2886,7 @@
       \__tl_build_one:o \l_@@_internal_regex
       \exp_after:wN \@@_compile_quantifier:w
     \else:
-      \__msg_kernel_warning:nn { kernel } { extra-rparen }
+      \__kernel_msg_warning:nn { kernel } { extra-rparen }
       \exp_after:wN \@@_compile_raw:N \exp_after:wN )
     \fi:
   }
@@ -2910,7 +2910,7 @@
         \cs_if_exist_use:cF
           { @@_compile_special_group_\token_to_str:N #4 :w }
           {
-            \__msg_kernel_warning:nnx { kernel } { special-group-unknown }
+            \__kernel_msg_warning:nnx { kernel } { special-group-unknown }
               { (? #4 }
             \@@_compile_group_begin:N \@@_group:nnnN
               \@@_compile_raw:N ? #3 #4
@@ -2977,7 +2977,7 @@
         \cs_set:Npn \@@_item_range:nn { \@@_item_caseless_range:nn }
       }
       {
-        \__msg_kernel_warning:nnx { kernel } { unknown-option } { (?i #2 }
+        \__kernel_msg_warning:nnx { kernel } { unknown-option } { (?i #2 }
         \@@_compile_raw:N (
         \@@_compile_raw:N ?
         \@@_compile_raw:N i
@@ -2993,7 +2993,7 @@
         \cs_set:Npn \@@_item_range:nn { \@@_item_caseful_range:nn }
       }
       {
-        \__msg_kernel_warning:nnx { kernel } { unknown-option } { (?-#2#4 }
+        \__kernel_msg_warning:nnx { kernel } { unknown-option } { (?-#2#4 }
         \@@_compile_raw:N (
         \@@_compile_raw:N ?
         \@@_compile_raw:N -
@@ -3031,7 +3031,7 @@
       }
       { \cs_if_exist_use:cF { @@_compile_c_#2:w } }
           {
-            \__msg_kernel_error:nnx { kernel } { c-missing-category } {#2}
+            \__kernel_msg_error:nnx { kernel } { c-missing-category } {#2}
             #1 #2
           }
   }
@@ -3052,7 +3052,7 @@
           { \token_if_eq_charcode:NNF #2 ( } % )
       }
       { \use:n }
-    { \__msg_kernel_error:nnn { kernel } { c-C-invalid } {#2} }
+    { \__kernel_msg_error:nnn { kernel } { c-C-invalid } {#2} }
     #1 #2
   }
 %    \end{macrocode}
@@ -3105,7 +3105,7 @@
           { \@@_compile_c_lbrack_end: }
       }
           {
-            \__msg_kernel_error:nnx { kernel } { c-missing-rbrack } {#2}
+            \__kernel_msg_error:nnx { kernel } { c-missing-rbrack } {#2}
             \@@_compile_c_lbrack_end:
             #1 #2
           }
@@ -3251,7 +3251,7 @@
             \@@_compile_u_loop:NN
           }
           {
-            \__msg_kernel_error:nn { kernel } { u-missing-lbrace }
+            \__kernel_msg_error:nn { kernel } { u-missing-lbrace }
             \@@_compile_raw:N u #1 #2
           }
       }
@@ -3269,7 +3269,7 @@
           }
           {
             \if_false: { \fi: }
-            \__msg_kernel_error:nnx { kernel } { u-missing-rbrace } {#2}
+            \__kernel_msg_error:nnx { kernel } { u-missing-rbrace } {#2}
             \@@_compile_u_end:
             #1 #2
           }
@@ -3685,11 +3685,11 @@
     \@@_compile:n {#1}
     \@@_build:N \l_@@_internal_regex
   }
-\__debug_patch:nnNNpn
-  { \__debug_trace_push:nnN { regex } { 1 } \@@_build:N }
+\__kernel_patch:nnNNpn
+  { \@@_trace_push:nnN { regex } { 1 } \@@_build:N }
   {
     \@@_trace_states:n { 2 }
-    \__debug_trace_pop:nnN { regex } { 1 } \@@_build:N
+    \@@_trace_pop:nnN { regex } { 1 } \@@_build:N
   }
 \cs_new_protected:Npn \@@_build:N #1
   {
@@ -3714,11 +3714,11 @@
 %   work properly at the outer level, we need to put the appropriate
 %   \texttt{left} and \texttt{right} states in their sequence.
 %    \begin{macrocode}
-\__debug_patch:nnNNpn
-  { \__debug_trace_push:nnN { regex } { 1 } \@@_build_for_cs:n }
+\__kernel_patch:nnNNpn
+  { \@@_trace_push:nnN { regex } { 1 } \@@_build_for_cs:n }
   {
     \@@_trace_states:n { 2 }
-    \__debug_trace_pop:nnN { regex } { 1 } \@@_build_for_cs:n
+    \@@_trace_pop:nnN { regex } { 1 } \@@_build_for_cs:n
   }
 \cs_new_protected:Npn \@@_build_for_cs:n #1
   {
@@ -3786,9 +3786,9 @@
 %   \texttt{right} state is the new empty state, and the \texttt{left}
 %   state points to the previously \enquote{current} state.
 %    \begin{macrocode}
-\__debug_patch:nnNNpn
+\__kernel_patch:nnNNpn
   {
-    \__debug_trace:nnx { regex } { 2 }
+    \@@_trace:nnx { regex } { 2 }
       {
         regex~new~state~
         L=\int_use:N \l_@@_left_state_int ~ -> ~
@@ -3952,9 +3952,9 @@
 %   auxiliaries expects \texttt{left_state} and \texttt{right_state} to
 %   be set properly.
 %    \begin{macrocode}
-\__debug_patch:nnNNpn
-  { \__debug_trace_push:nnN { regex } { 1 } \@@_group_aux:nnnnN }
-  { \__debug_trace_pop:nnN { regex } { 1 } \@@_group_aux:nnnnN }
+\__kernel_patch:nnNNpn
+  { \@@_trace_push:nnN { regex } { 1 } \@@_group_aux:nnnnN }
+  { \@@_trace_pop:nnN { regex } { 1 } \@@_group_aux:nnnnN }
 \cs_new_protected:Npn \@@_group_aux:nnnnN #1#2#3#4#5
   {
       \if_int_compare:w #3 = 0 \exp_stop_f:
@@ -4035,9 +4035,9 @@
 %   the group. The left and right states of the group are extracted from
 %   the relevant sequences.
 %    \begin{macrocode}
-\__debug_patch:nnNNpn
-  { \__debug_trace_push:nnN { regex } { 1 } \@@_branch:n }
-  { \__debug_trace_pop:nnN { regex } { 1 } \@@_branch:n }
+\__kernel_patch:nnNNpn
+  { \@@_trace_push:nnN { regex } { 1 } \@@_branch:n }
+  { \@@_trace_pop:nnN { regex } { 1 } \@@_branch:n }
 \cs_new_protected:Npn \@@_branch:n #1
   {
     \@@_build_new_state:
@@ -4533,12 +4533,12 @@
 %   smothering an empty match at the start). Once all this is set up, we
 %   are ready for the ride. Find the first match.
 %    \begin{macrocode}
-\__debug_patch:nnNNpn
+\__kernel_patch:nnNNpn
   {
-    \__debug_trace_push:nnN { regex } { 1 } \@@_match:n
-    \__debug_trace:nnx { regex } { 1 } { analyzing~query~token~list }
+    \@@_trace_push:nnN { regex } { 1 } \@@_match:n
+    \@@_trace:nnx { regex } { 1 } { analyzing~query~token~list }
   }
-  { \__debug_trace_pop:nnN { regex } { 1 } \@@_match:n }
+  { \@@_trace_pop:nnN { regex } { 1 } \@@_match:n }
 \cs_new_protected:Npn \@@_match:n #1
   {
     \int_zero:N \l_@@_balance_int
@@ -4552,8 +4552,8 @@
     \@@_match_init:
     \@@_match_once:
   }
-\__debug_patch:nnNNpn
-  { \__debug_trace:nnx { regex } { 1 } { initializing } }
+\__kernel_patch:nnNNpn
+  { \@@_trace:nnx { regex } { 1 } { initializing } }
   { }
 \cs_new_protected:Npn \@@_match_init:
   {
@@ -4733,8 +4733,8 @@
 %   state is marked as $\texttt{step}+1$: any thread hitting it at that
 %   point will be terminated.
 %    \begin{macrocode}
-\__debug_patch:nnNNpn
-  { \__debug_trace:nnx { regex } { 2 } { state~\int_use:N \l_@@_curr_state_int } }
+\__kernel_patch:nnNNpn
+  { \@@_trace:nnx { regex } { 2 } { state~\int_use:N \l_@@_curr_state_int } }
   { }
 \cs_new_protected:Npn \@@_use_state:
   {
@@ -5098,9 +5098,9 @@
 %   parsed, make sure that there is no open csname. Finally, define the
 %   \texttt{balance_one_match} and \texttt{do_one_match} functions.
 %    \begin{macrocode}
-\__debug_patch:nnNNpn
-  { \__debug_trace_push:nnN { regex } { 1 } \@@_replacement:n }
-  { \__debug_trace_pop:nnN { regex } { 1 } \@@_replacement:n }
+\__kernel_patch:nnNNpn
+  { \@@_trace_push:nnN { regex } { 1 } \@@_replacement:n }
+  { \@@_trace_pop:nnN { regex } { 1 } \@@_replacement:n }
 \cs_new_protected:Npn \@@_replacement:n #1
   {
     \__tl_build:Nw \l_@@_internal_a_tl
@@ -5120,7 +5120,7 @@
         {#1}
       \prg_do_nothing: \prg_do_nothing:
       \if_int_compare:w \l_@@_replacement_csnames_int > 0 \exp_stop_f:
-        \__msg_kernel_error:nnx { kernel } { replacement-missing-rbrace }
+        \__kernel_msg_error:nnx { kernel } { replacement-missing-rbrace }
           { \int_use:N \l_@@_replacement_csnames_int }
         \__tl_build_one:x
           { \prg_replicate:nn \l_@@_replacement_csnames_int \cs_end: }
@@ -5127,7 +5127,7 @@
       \fi:
       \seq_if_empty:NF \l_@@_replacement_category_seq
         {
-          \__msg_kernel_error:nnx { kernel } { replacement-missing-rparen }
+          \__kernel_msg_error:nnx { kernel } { replacement-missing-rparen }
             { \seq_count:N \l_@@_replacement_category_seq }
           \seq_clear:N \l_@@_replacement_category_seq
         }
@@ -5361,11 +5361,11 @@
 \cs_new_protected:Npn \@@_replacement_cat:NNN #1#2#3
   {
     \token_if_eq_meaning:NNTF \prg_do_nothing: #3
-      { \__msg_kernel_error:nn { kernel } { replacement-catcode-end } }
+      { \__kernel_msg_error:nn { kernel } { replacement-catcode-end } }
       {
         \int_compare:nNnTF { \l_@@_replacement_csnames_int } > 0
           {
-            \__msg_kernel_error:nnnn
+            \__kernel_msg_error:nnnn
               { kernel } { replacement-catcode-in-cs } {#1} {#3}
             #2 #3
           }
@@ -5381,7 +5381,7 @@
                   {
                     \@@_char_if_alphanumeric:NTF #3
                       {
-                        \__msg_kernel_error:nnnn
+                        \__kernel_msg_error:nnnn
                           { kernel } { replacement-catcode-escaped }
                           {#1} {#3}
                       }
@@ -5543,7 +5543,7 @@
   \cs_new_protected:Npn \@@_replacement_c_S:w #1#2
     {
       \if_int_compare:w `#2 = 0 \exp_stop_f:
-        \__msg_kernel_error:nn { kernel } { replacement-null-space }
+        \__kernel_msg_error:nn { kernel } { replacement-null-space }
       \fi:
       \tex_lccode:D `\ = `#2 \scan_stop:
       \tex_lowercase:D { \__tl_build_one:n {~} }
@@ -5586,7 +5586,7 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_replacement_error:NNN #1#2#3
   {
-    \__msg_kernel_error:nnx { kernel } { replacement-#1 } {#3}
+    \__kernel_msg_error:nnx { kernel } { replacement-#1 } {#3}
     #2 #3
   }
 %    \end{macrocode}
@@ -5948,7 +5948,7 @@
         { \flag_height:n { @@_begin } + \flag_height:n { @@_end } }
         = 0
         {
-          \__msg_kernel_error:nnxxx { kernel } { result-unbalanced }
+          \__kernel_msg_error:nnxxx { kernel } { result-unbalanced }
             { splitting~or~extracting~submatches }
             { \flag_height:n { @@_end } }
             { \flag_height:n { @@_begin } }
@@ -6139,7 +6139,7 @@
   {
     \if_int_compare:w \l_@@_balance_int = 0 \exp_stop_f:
     \else:
-      \__msg_kernel_error:nnxxx { kernel } { result-unbalanced }
+      \__kernel_msg_error:nnxxx { kernel } { result-unbalanced }
         { replacing }
         { \int_max:nn { - \l_@@_balance_int } { 0 } }
         { \int_max:nn { \l_@@_balance_int } { 0 } }
@@ -6170,13 +6170,13 @@
 %
 % Messages for the preparsing phase.
 %    \begin{macrocode}
-\__msg_kernel_new:nnnn { kernel } { trailing-backslash }
+\__kernel_msg_new:nnnn { kernel } { trailing-backslash }
   { Trailing~escape~character~'\iow_char:N\\'. }
   {
     A~regular~expression~or~its~replacement~text~ends~with~
     the~escape~character~'\iow_char:N\\'.~It~will~be~ignored.
   }
-\__msg_kernel_new:nnnn { kernel } { x-missing-rbrace }
+\__kernel_msg_new:nnnn { kernel } { x-missing-rbrace }
   { Missing~closing~brace~in~'\iow_char:N\\x'~hexadecimal~sequence. }
   {
     You~wrote~something~like~
@@ -6183,7 +6183,7 @@
     '\iow_char:N\\x\{...#1'.~
     The~closing~brace~is~missing.
   }
-\__msg_kernel_new:nnnn { kernel } { x-overflow }
+\__kernel_msg_new:nnnn { kernel } { x-overflow }
   { Character~code~'#1'~too~large~in~'\iow_char:N\\x'~hexadecimal~sequence. }
   {
     You~wrote~something~like~
@@ -6195,7 +6195,7 @@
 %
 % Invalid quantifier.
 %    \begin{macrocode}
-\__msg_kernel_new:nnnn { kernel } { invalid-quantifier }
+\__kernel_msg_new:nnnn { kernel } { invalid-quantifier }
   { Braced~quantifier~'#1'~may~not~be~followed~by~'#2'. }
   {
     The~character~'#2'~is~invalid~in~the~braced~quantifier~'#1'.~
@@ -6207,13 +6207,13 @@
 % Messages for missing or extra closing brackets and parentheses, with
 % some fancy singular/plural handling for the case of parentheses.
 %    \begin{macrocode}
-\__msg_kernel_new:nnnn { kernel } { missing-rbrack }
+\__kernel_msg_new:nnnn { kernel } { missing-rbrack }
   { Missing~right~bracket~inserted~in~regular~expression. }
   {
     LaTeX~was~given~a~regular~expression~where~a~character~class~
     was~started~with~'[',~but~the~matching~']'~is~missing.
   }
-\__msg_kernel_new:nnnn { kernel } { missing-rparen }
+\__kernel_msg_new:nnnn { kernel } { missing-rparen }
   {
     Missing~right~
     \int_compare:nTF { #1 = 1 } { parenthesis } { parentheses } ~
@@ -6223,7 +6223,7 @@
     LaTeX~was~given~a~regular~expression~with~\int_eval:n {#1} ~
     more~left~parentheses~than~right~parentheses.
   }
-\__msg_kernel_new:nnnn { kernel } { extra-rparen }
+\__kernel_msg_new:nnnn { kernel } { extra-rparen }
   { Extra~right~parenthesis~ignored~in~regular~expression. }
   {
     LaTeX~came~across~a~closing~parenthesis~when~no~submatch~group~
@@ -6233,7 +6233,7 @@
 %
 % Some escaped alphanumerics are not allowed everywhere.
 %    \begin{macrocode}
-\__msg_kernel_new:nnnn { kernel } { bad-escape }
+\__kernel_msg_new:nnnn { kernel } { bad-escape }
   {
     Invalid~escape~'\iow_char:N\\#1'~
     \@@_if_in_cs:TF { within~a~control~sequence. }
@@ -6261,7 +6261,7 @@
 %
 % Range errors.
 %    \begin{macrocode}
-\__msg_kernel_new:nnnn { kernel } { range-missing-end }
+\__kernel_msg_new:nnnn { kernel } { range-missing-end }
   { Invalid~end-point~for~range~'#1-#2'~in~character~class. }
   {
     The~end-point~'#2'~of~the~range~'#1-#2'~may~not~serve~as~an~
@@ -6268,7 +6268,7 @@
     end-point~for~a~range:~alphanumeric~characters~should~not~be~
     escaped,~and~non-alphanumeric~characters~should~be~escaped.
   }
-\__msg_kernel_new:nnnn { kernel } { range-backwards }
+\__kernel_msg_new:nnnn { kernel } { range-backwards }
   { Range~'[#1-#2]'~out~of~order~in~character~class. }
   {
     In~ranges~of~characters~'[x-y]'~appearing~in~character~classes,~
@@ -6280,7 +6280,7 @@
 %
 % Errors related to |\c| and |\u|.
 %    \begin{macrocode}
-\__msg_kernel_new:nnnn { kernel } { c-bad-mode }
+\__kernel_msg_new:nnnn { kernel } { c-bad-mode }
   { Invalid~nested~'\iow_char:N\\c'~escape~in~regular~expression. }
   {
     The~'\iow_char:N\\c'~escape~cannot~be~used~within~
@@ -6287,7 +6287,7 @@
     a~control~sequence~test~'\iow_char:N\\c{...}'.~
     To~combine~several~category~tests,~use~'\iow_char:N\\c[...]'.
   }
-\__msg_kernel_new:nnnn { kernel } { c-C-invalid }
+\__kernel_msg_new:nnnn { kernel } { c-C-invalid }
   { '\iow_char:N\\cC'~should~be~followed~by~'.'~or~'(',~not~'#1'. }
   {
     The~'\iow_char:N\\cC'~construction~restricts~the~next~item~to~be~a~
@@ -6294,7 +6294,7 @@
     control~sequence~or~the~next~group~to~be~made~of~control~sequences.~
     It~only~makes~sense~to~follow~it~by~'.'~or~by~a~group.
   }
-\__msg_kernel_new:nnnn { kernel } { c-missing-rbrace }
+\__kernel_msg_new:nnnn { kernel } { c-missing-rbrace }
   { Missing~right~brace~inserted~for~'\iow_char:N\\c'~escape. }
   {
     LaTeX~was~given~a~regular~expression~where~a~
@@ -6301,13 +6301,13 @@
     '\iow_char:N\\c\iow_char:N\{...'~construction~was~not~ended~
     with~a~closing~brace~'\iow_char:N\}'.
   }
-\__msg_kernel_new:nnnn { kernel } { c-missing-rbrack }
+\__kernel_msg_new:nnnn { kernel } { c-missing-rbrack }
   { Missing~right~bracket~inserted~for~'\iow_char:N\\c'~escape. }
   {
     A~construction~'\iow_char:N\\c[...'~appears~in~a~
     regular~expression,~but~the~closing~']'~is~not~present.
   }
-\__msg_kernel_new:nnnn { kernel } { c-missing-category }
+\__kernel_msg_new:nnnn { kernel } { c-missing-category }
   { Invalid~character~'#1'~following~'\iow_char:N\\c'~escape. }
   {
     In~regular~expressions,~the~'\iow_char:N\\c'~escape~sequence~
@@ -6315,19 +6315,19 @@
     capital~letter~representing~a~character~category,~namely~
     one~of~'ABCDELMOPSTU'.
   }
-\__msg_kernel_new:nnnn { kernel } { c-trailing }
+\__kernel_msg_new:nnnn { kernel } { c-trailing }
   { Trailing~category~code~escape~'\iow_char:N\\c'... }
   {
     A~regular~expression~ends~with~'\iow_char:N\\c'~followed~
     by~a~letter.~It~will~be~ignored.
   }
-\__msg_kernel_new:nnnn { kernel } { u-missing-lbrace }
+\__kernel_msg_new:nnnn { kernel } { u-missing-lbrace }
   { Missing~left~brace~following~'\iow_char:N\\u'~escape. }
   {
     The~'\iow_char:N\\u'~escape~sequence~must~be~followed~by~
     a~brace~group~with~the~name~of~the~variable~to~use.
   }
-\__msg_kernel_new:nnnn { kernel } { u-missing-rbrace }
+\__kernel_msg_new:nnnn { kernel } { u-missing-rbrace }
   { Missing~right~brace~inserted~for~'\iow_char:N\\u'~escape. }
   {
     LaTeX~
@@ -6340,7 +6340,7 @@
 %
 % Errors when encountering the \textsc{posix} syntax |[:...:]|.
 %    \begin{macrocode}
-\__msg_kernel_new:nnnn { kernel } { posix-unsupported }
+\__kernel_msg_new:nnnn { kernel } { posix-unsupported }
   { POSIX~collating~element~'[#1 ~ #1]'~not~supported. }
   {
     The~'[.foo.]'~and~'[=bar=]'~syntaxes~have~a~special~meaning~
@@ -6347,7 +6347,7 @@
     in~POSIX~regular~expressions.~This~is~not~supported~by~LaTeX.~
     Maybe~you~forgot~to~escape~a~left~bracket~in~a~character~class?
   }
-\__msg_kernel_new:nnnn { kernel } { posix-unknown }
+\__kernel_msg_new:nnnn { kernel } { posix-unknown }
   { POSIX~class~'[:#1:]'~unknown. }
   {
     '[:#1:]'~is~not~among~the~known~POSIX~classes~
@@ -6356,7 +6356,7 @@
     '[:print:]',~'[:punct:]',~'[:space:]',~'[:upper:]',~
     '[:word:]',~and~'[:xdigit:]'.
   }
-\__msg_kernel_new:nnnn { kernel } { posix-missing-close }
+\__kernel_msg_new:nnnn { kernel } { posix-missing-close }
   { Missing~closing~':]'~for~POSIX~class. }
   { The~POSIX~syntax~'#1'~must~be~followed~by~':]',~not~'#2'. }
 %    \end{macrocode}
@@ -6365,7 +6365,7 @@
 % with an unbalanced token list, which we must re-balance by adding
 % begin-group or end-group character tokens.
 %    \begin{macrocode}
-\__msg_kernel_new:nnnn { kernel } { result-unbalanced }
+\__kernel_msg_new:nnnn { kernel } { result-unbalanced }
   { Missing~brace~inserted~when~#1. }
   {
     LaTeX~was~asked~to~do~some~regular~expression~operation,~
@@ -6377,13 +6377,13 @@
 %
 % Error message for unknown options.
 %    \begin{macrocode}
-\__msg_kernel_new:nnnn { kernel } { unknown-option }
+\__kernel_msg_new:nnnn { kernel } { unknown-option }
   { Unknown~option~'#1'~for~regular~expressions. }
   {
     The~only~available~option~is~'case-insensitive',~toggled~by~
     '(?i)'~and~'(?-i)'.
   }
-\__msg_kernel_new:nnnn { kernel } { special-group-unknown }
+\__kernel_msg_new:nnnn { kernel } { special-group-unknown }
   { Unknown~special~group~'#1~...'~in~a~regular~expression. }
   {
     The~only~valid~constructions~starting~with~'(?'~are~
@@ -6393,7 +6393,7 @@
 %
 % Errors in the replacement text.
 %    \begin{macrocode}
-\__msg_kernel_new:nnnn { kernel } { replacement-c }
+\__kernel_msg_new:nnnn { kernel } { replacement-c }
   { Misused~'\iow_char:N\\c'~command~in~a~replacement~text. }
   {
     In~a~replacement~text,~the~'\iow_char:N\\c'~escape~sequence~
@@ -6400,7 +6400,7 @@
     can~be~followed~by~one~of~the~letters~'ABCDELMOPSTU'~
     or~a~brace~group,~not~by~'#1'.
   }
-\__msg_kernel_new:nnnn { kernel } { replacement-u }
+\__kernel_msg_new:nnnn { kernel } { replacement-u }
   { Misused~'\iow_char:N\\u'~command~in~a~replacement~text. }
   {
     In~a~replacement~text,~the~'\iow_char:N\\u'~escape~sequence~
@@ -6407,7 +6407,7 @@
     must~be~~followed~by~a~brace~group~holding~the~name~of~the~
     variable~to~use.
   }
-\__msg_kernel_new:nnnn { kernel } { replacement-g }
+\__kernel_msg_new:nnnn { kernel } { replacement-g }
   {
     Missing~brace~for~the~'\iow_char:N\\g'~construction~
     in~a~replacement~text.
@@ -6417,7 +6417,7 @@
     submatches~are~represented~either~as~'\iow_char:N \\g{dd..d}',~
     or~'\\d',~where~'d'~are~single~digits.~Here,~a~brace~is~missing.
   }
-\__msg_kernel_new:nnnn { kernel } { replacement-catcode-end }
+\__kernel_msg_new:nnnn { kernel } { replacement-catcode-end }
   {
     Missing~character~for~the~'\iow_char:N\\c<category><character>'~
     construction~in~a~replacement~text.
@@ -6428,7 +6428,7 @@
     the~character~category.~Then,~a~character~must~follow.~LaTeX~
     reached~the~end~of~the~replacement~when~looking~for~that.
   }
-\__msg_kernel_new:nnnn { kernel } { replacement-catcode-escaped }
+\__kernel_msg_new:nnnn { kernel } { replacement-catcode-escaped }
   {
     Escaped~letter~or~digit~after~category~code~in~replacement~text.
   }
@@ -6438,7 +6438,7 @@
     the~character~category.~Then,~a~character~must~follow,~not~
     '\iow_char:N\\#2'.
   }
-\__msg_kernel_new:nnnn { kernel } { replacement-catcode-in-cs }
+\__kernel_msg_new:nnnn { kernel } { replacement-catcode-in-cs }
   {
     Category~code~'\iow_char:N\\c#1#3'~ignored~inside~
     '\iow_char:N\\c\{...\}'~in~a~replacement~text.
@@ -6448,7 +6448,7 @@
     '\iow_char:N\\c\{...\}'~are~ignored~when~building~the~control~
     sequence~name.
   }
-\__msg_kernel_new:nnnn { kernel } { replacement-null-space }
+\__kernel_msg_new:nnnn { kernel } { replacement-null-space }
   { TeX~cannot~build~a~space~token~with~character~code~0. }
   {
     You~asked~for~a~character~token~with~category~space,~
@@ -6457,13 +6457,13 @@
     This~specific~case~is~impossible~and~will~be~replaced~
     by~a~normal~space.
   }
-\__msg_kernel_new:nnnn { kernel } { replacement-missing-rbrace }
+\__kernel_msg_new:nnnn { kernel } { replacement-missing-rbrace }
   { Missing~right~brace~inserted~in~replacement~text. }
   {
     There~ \int_compare:nTF { #1 = 1 } { was } { were } ~ #1~
     missing~right~\int_compare:nTF { #1 = 1 } { brace } { braces } .
   }
-\__msg_kernel_new:nnnn { kernel } { replacement-missing-rparen }
+\__kernel_msg_new:nnnn { kernel } { replacement-missing-rparen }
   { Missing~right~parenthesis~inserted~in~replacement~text. }
   {
     There~ \int_compare:nTF { #1 = 1 } { was } { were } ~ #1~
@@ -6473,7 +6473,7 @@
 %
 % Used when showing a regex.
 %    \begin{macrocode}
-\__msg_kernel_new:nnn { kernel } { show-regex }
+\__kernel_msg_new:nnn { kernel } { show-regex }
   {
     >~Compiled~regex~
     \tl_if_empty:nTF {#1} { variable~ #2 } { {#1} } :
@@ -6513,21 +6513,21 @@
 % be merged.
 %
 % \begin{macro}
-%   {\__debug_trace_push:nnN, \__debug_trace_pop:nnN, \__debug_trace:nnx}
+%   {\@@_trace_push:nnN, \@@_trace_pop:nnN, \@@_trace:nnx}
 %   Here |#1| is the module name (\texttt{regex}) and |#2| is
 %   typically~1.  If the module's current tracing level is less than
 %   |#2| show nothing, otherwise write |#3| to the terminal.
 %    \begin{macrocode}
-\__debug:TF
+\__kernel_debug:TF
   {
-    \cs_new_protected:Npn \__debug_trace_push:nnN #1#2#3
-      { \__debug_trace:nnx {#1} {#2} { entering~ \token_to_str:N #3 } }
-    \cs_new_protected:Npn \__debug_trace_pop:nnN #1#2#3
-      { \__debug_trace:nnx {#1} {#2} { leaving~ \token_to_str:N #3 } }
-    \cs_new_protected:Npn \__debug_trace:nnx #1#2#3
+    \cs_new_protected:Npn \@@_trace_push:nnN #1#2#3
+      { \@@_trace:nnx {#1} {#2} { entering~ \token_to_str:N #3 } }
+    \cs_new_protected:Npn \@@_trace_pop:nnN #1#2#3
+      { \@@_trace:nnx {#1} {#2} { leaving~ \token_to_str:N #3 } }
+    \cs_new_protected:Npn \@@_trace:nnx #1#2#3
       {
         \int_compare:nNnF
-          { \int_use:c { g__debug_trace_#1_int } } < {#2}
+          { \int_use:c { g_@@_trace_#1_int } } < {#2}
           { \iow_term:x { Trace:~#3 } }
       }
   }
@@ -6535,10 +6535,10 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{variable}{\g__debug_trace_regex_int}
+% \begin{variable}{\g_@@_trace_regex_int}
 %   No tracing when that is zero.
 %    \begin{macrocode}
-\int_new:N \g__debug_trace_regex_int
+\int_new:N \g_@@_trace_regex_int
 %    \end{macrocode}
 % \end{variable}
 %
@@ -6547,7 +6547,7 @@
 %   stored in \tn{toks} from $0$ to \cs{l_@@_max_state_int}
 %   (excluded).
 %    \begin{macrocode}
-\__debug:TF
+\__kernel_debug:TF
   {
     \cs_new_protected:Npn \@@_trace_states:n #1
       {
@@ -6556,7 +6556,7 @@
           { 1 }
           { \l_@@_max_state_int - 1 }
           {
-            \__debug_trace:nnx { regex } {#1}
+            \@@_trace:nnx { regex } {#1}
               { \iow_char:N \\toks ##1 = { \@@_toks_use:w ##1 } }
           }
       }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %
@@ -735,7 +735,7 @@
 % implement sets, one should be careful not to rely on the order of
 % items in the sequence representing the set.
 %
-% Sets should not contain several occurences of a given item.  To make
+% Sets should not contain several occurrences of a given item.  To make
 % sure that a \meta{sequence variable} only has distinct items, use
 % \cs{seq_remove_duplicates:N} \meta{sequence variable}.  This function
 % is relatively slow, and to avoid performance issues one should only
@@ -926,7 +926,7 @@
 %    \begin{macrocode}
 \cs_new:Npn \@@_item:n
   {
-    \__msg_kernel_expandable_error:nn { kernel } { misused-sequence }
+    \__kernel_msg_expandable_error:nn { kernel } { misused-sequence }
     \use_none:n
   }
 %    \end{macrocode}
@@ -1871,7 +1871,7 @@
           }
       }
       {
-        \__msg_kernel_expandable_error:nnn
+        \__kernel_msg_expandable_error:nnn
           { kernel } { bad-variable } {#1}
       }
   }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -1,7 +1,7 @@
 % \iffalse meta-comment
 %
 %% File: l3skip.dtx Copyright (C) 2004-2011 Frank Mittelbach, The LaTeX3 Project
-%%                            (C) 2012-2017 The LaTeX3 Project
+%%                            (C) 2012-2018 The LaTeX3 Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %
@@ -386,6 +386,54 @@
 %   \texttt{false}.
 % \end{function}
 %
+% \section{Dimension step functions}
+%
+% \begin{function}[added = 2018-02-18, rEXP]
+%   {\dim_step_function:nnnN}
+%   \begin{syntax}
+%     \cs{dim_step_function:nnnN} \Arg{initial value} \Arg{step} \Arg{final value} \meta{function}
+%   \end{syntax}
+%   This function first evaluates the \meta{initial value}, \meta{step}
+%   and \meta{final value}, all of which should be dimension expressions.
+%   The \meta{function} is then placed in front of each \meta{value}
+%   from the \meta{initial value} to the \meta{final value} in turn
+%   (using \meta{step} between each \meta{value}).  The \meta{step} must
+%   be non-zero.  If the \meta{step} is positive, the loop stops when
+%   the \meta{value} becomes larger than the \meta{final value}.  If the
+%   \meta{step} is negative, the loop stops when the \meta{value}
+%   becomes smaller than the \meta{final value}.  The \meta{function}
+%   should absorb one argument.
+% \end{function}
+%
+% \begin{function}[added = 2018-02-18]
+%   {\dim_step_inline:nnnn}
+%   \begin{syntax}
+%     \cs{dim_step_inline:nnnn} \Arg{initial value} \Arg{step} \Arg{final value} \Arg{code}
+%   \end{syntax}
+%   This function first evaluates the \meta{initial value}, \meta{step}
+%   and \meta{final value}, all of which should be dimension expressions.
+%   Then for each \meta{value} from the \meta{initial value} to the
+%   \meta{final value} in turn (using \meta{step} between each
+%   \meta{value}), the \meta{code} is inserted into the input stream
+%   with |#1| replaced by the current \meta{value}.  Thus the
+%   \meta{code} should define a function of one argument~(|#1|).
+% \end{function}
+%
+% \begin{function}[added = 2018-02-18]
+%   {\dim_step_variable:nnnNn}
+%   \begin{syntax}
+%     \cs{dim_step_variable:nnnNn} \\
+%     ~~\Arg{initial value} \Arg{step} \Arg{final value} \meta{tl~var} \Arg{code}
+%   \end{syntax}
+%   This function first evaluates the \meta{initial value}, \meta{step}
+%   and \meta{final value}, all of which should be dimension expressions.
+%   Then for each \meta{value} from the \meta{initial value} to the
+%   \meta{final value} in turn (using \meta{step} between each
+%   \meta{value}), the \meta{code} is inserted into the input stream,
+%   with the \meta{tl~var} defined as the current \meta{value}.  Thus
+%   the \meta{code} should make use of the \meta{tl~var}.
+% \end{function}
+%
 % \section{Using \texttt{dim} expressions and variables}
 %
 % \begin{function}[updated = 2011-10-22, EXP]{\dim_eval:n}
@@ -1074,7 +1122,7 @@
 %   \cs{dim_eval:n} to avoid needing a debugging patch that wraps the
 %   expression in checking code.
 %    \begin{macrocode}
-\__debug_patch:nnNNpn { \__debug_chk_var_scope:NN c #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_scope:NN c #1 } { }
 \cs_new_protected:Npn \dim_const:Nn #1#2
   {
     \dim_new:N #1
@@ -1090,9 +1138,9 @@
 %   case where the variable passed is incorrectly a skip (for example a
 %   \LaTeXe{} length).
 %    \begin{macrocode}
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \dim_zero:N #1 { #1 \c_zero_skip }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \dim_gzero:N #1
   { \tex_global:D #1 \c_zero_skip }
 \cs_generate_variant:Nn \dim_zero:N  { c }
@@ -1134,10 +1182,10 @@
 %    \begin{macrocode}
 \cs_set_protected:Npn \@@_tmp:w #1#2#3
   {
-    \__debug_patch_args:nnnNNpn
+    \__kernel_patch_args:nnnNNpn
       { #1 ##1 }
       { }
-      { {##1} { \__debug_chk_expr:nNnN {##2} \@@_eval:w { } #3 } }
+      { {##1} { \__kernel_chk_expr:nNnN {##2} \@@_eval:w { } #3 } }
     #2 #3
   }
 %    \end{macrocode}
@@ -1150,10 +1198,10 @@
 %   where the variable passed is a skip (for example a \LaTeXe{}
 %   length).
 %    \begin{macrocode}
-\@@_tmp:w \__debug_chk_var_local:N
+\@@_tmp:w \__kernel_chk_var_local:N
 \cs_new_protected:Npn \dim_set:Nn #1#2
   { #1 ~ \@@_eval:w #2 \@@_eval_end: \scan_stop: }
-\@@_tmp:w \__debug_chk_var_global:N
+\@@_tmp:w \__kernel_chk_var_global:N
 \cs_new_protected:Npn \dim_gset:Nn #1#2
   { \tex_global:D #1 ~ \@@_eval:w #2 \@@_eval_end: \scan_stop: }
 \cs_generate_variant:Nn \dim_set:Nn  { c }
@@ -1168,11 +1216,11 @@
 %   All straightforward, with a \cs{scan_stop:} to deal with the case
 %   where |#1| is (incorrectly) a skip.
 %    \begin{macrocode}
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \dim_set_eq:NN #1#2
   { #1 = #2 \scan_stop: }
 \cs_generate_variant:Nn \dim_set_eq:NN { c , Nc , cc }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \dim_gset_eq:NN #1#2
   { \tex_global:D #1 = #2 \scan_stop: }
 \cs_generate_variant:Nn \dim_gset_eq:NN { c , Nc , cc }
@@ -1191,18 +1239,18 @@
 %   the local versions.  The debugging code is inserted by
 %   \cs{@@_tmp:w}.
 %    \begin{macrocode}
-\@@_tmp:w \__debug_chk_var_local:N
+\@@_tmp:w \__kernel_chk_var_local:N
 \cs_new_protected:Npn \dim_add:Nn #1#2
   { \tex_advance:D #1 by \@@_eval:w #2 \@@_eval_end: \scan_stop: }
-\@@_tmp:w \__debug_chk_var_global:N
+\@@_tmp:w \__kernel_chk_var_global:N
 \cs_new_protected:Npn \dim_gadd:Nn #1#2
   { \tex_global:D \tex_advance:D #1 by \@@_eval:w #2 \@@_eval_end: \scan_stop: }
 \cs_generate_variant:Nn \dim_add:Nn  { c }
 \cs_generate_variant:Nn \dim_gadd:Nn { c }
-\@@_tmp:w \__debug_chk_var_local:N
+\@@_tmp:w \__kernel_chk_var_local:N
 \cs_new_protected:Npn \dim_sub:Nn #1#2
   { \tex_advance:D #1 by - \@@_eval:w #2 \@@_eval_end: \scan_stop: }
-\@@_tmp:w \__debug_chk_var_global:N
+\@@_tmp:w \__kernel_chk_var_global:N
 \cs_new_protected:Npn \dim_gsub:Nn #1#2
   { \tex_global:D \tex_advance:D #1 by - \@@_eval:w #2 \@@_eval_end: \scan_stop: }
 \cs_generate_variant:Nn \dim_sub:Nn  { c }
@@ -1226,8 +1274,8 @@
 %   Functions for $\min$, $\max$, and absolute value with only one evaluation.
 %   The absolute value is evaluated by removing a leading~|-| if present.
 %    \begin{macrocode}
-\__debug_patch_args:nNNpn
-  { { \__debug_chk_expr:nNnN {#1} \@@_eval:w { } \dim_abs:n } }
+\__kernel_patch_args:nNNpn
+  { { \__kernel_chk_expr:nNnN {#1} \@@_eval:w { } \dim_abs:n } }
 \cs_new:Npn \dim_abs:n #1
   {
     \exp_after:wN \@@_abs:N
@@ -1235,10 +1283,10 @@
   }
 \cs_new:Npn \@@_abs:N #1
   { \if_meaning:w - #1 \else: \exp_after:wN #1 \fi: }
-\__debug_patch_args:nNNpn
+\__kernel_patch_args:nNNpn
   {
-    { \__debug_chk_expr:nNnN {#1} \@@_eval:w { } \dim_max:nn }
-    { \__debug_chk_expr:nNnN {#2} \@@_eval:w { } \dim_max:nn }
+    { \__kernel_chk_expr:nNnN {#1} \@@_eval:w { } \dim_max:nn }
+    { \__kernel_chk_expr:nNnN {#2} \@@_eval:w { } \dim_max:nn }
   }
 \cs_new:Npn \dim_max:nn #1#2
   {
@@ -1248,10 +1296,10 @@
       >
     \@@_eval_end:
   }
-\__debug_patch_args:nNNpn
+\__kernel_patch_args:nNNpn
   {
-    { \__debug_chk_expr:nNnN {#1} \@@_eval:w { } \dim_min:nn }
-    { \__debug_chk_expr:nNnN {#2} \@@_eval:w { } \dim_min:nn }
+    { \__kernel_chk_expr:nNnN {#1} \@@_eval:w { } \dim_min:nn }
+    { \__kernel_chk_expr:nNnN {#2} \@@_eval:w { } \dim_min:nn }
   }
 \cs_new:Npn \dim_min:nn #1#2
   {
@@ -1296,11 +1344,11 @@
 % \begin{macro}[pTF, EXP]{\dim_compare:nNn}
 %   Simple comparison.
 %    \begin{macrocode}
-\__debug_patch_conditional_args:nNNpnn
+\__kernel_patch_conditional_args:nNNpnn
   {
-    { \__debug_chk_expr:nNnN {#1} \@@_eval:w { } \dim_compare:nNn }
+    { \__kernel_chk_expr:nNnN {#1} \@@_eval:w { } \dim_compare:nNn }
     { \@@_eval_end: #2 }
-    { \__debug_chk_expr:nNnN {#3} \@@_eval:w { } \dim_compare:nNn }
+    { \__kernel_chk_expr:nNnN {#3} \@@_eval:w { } \dim_compare:nNn }
   }
 \prg_new_conditional:Npnn \dim_compare:nNn #1#2#3 { p , T , F , TF }
   {
@@ -1494,13 +1542,106 @@
 % \end{macro}
 % \end{macro}
 %
+% \subsection{Dimension step functions}
+%
+% \begin{macro}{\dim_step_function:nnnN}
+% \begin{macro}{\@@_step:wwwN, \@@_step:NnnnN}
+%   Before all else, evaluate the initial value, step, and final value.
+%   Repeating a function by steps first needs a check on the direction
+%   of the steps. After that, do the function for the start value then
+%   step and loop around. It would be more symmetrical to test for a
+%   step size of zero before checking the sign, but we optimize for the
+%   most frequent case (positive step).
+%    \begin{macrocode}
+\__kernel_patch_args:nNNpn
+  {
+    { \__kernel_chk_expr:nNnN {#1} \@@_eval:w { } \dim_step_function:nnnN }
+    { \__kernel_chk_expr:nNnN {#2} \@@_eval:w { } \dim_step_function:nnnN }
+    { \__kernel_chk_expr:nNnN {#3} \@@_eval:w { } \dim_step_function:nnnN }
+  }
+\cs_new:Npn \dim_step_function:nnnN #1#2#3
+  {
+    \exp_after:wN \@@_step:wwwN
+    \tex_the:D \@@_eval:w #1 \exp_after:wN ;
+    \tex_the:D \@@_eval:w #2 \exp_after:wN ;
+    \tex_the:D \@@_eval:w #3 ;
+  }
+\cs_new:Npn \@@_step:wwwN #1; #2; #3; #4
+  {
+    \dim_compare:nNnTF {#2} > \c_zero_dim
+      { \@@_step:NnnnN > }
+      {
+        \dim_compare:nNnTF {#2} = \c_zero_dim
+          {
+            \__kernel_msg_expandable_error:nnn { kernel } { zero-step } {#4}
+            \use_none:nnnn
+          }
+          { \@@_step:NnnnN < }
+      }
+      {#1} {#2} {#3} #4
+  }
+\cs_new:Npn \@@_step:NnnnN #1#2#3#4#5
+  {
+    \dim_compare:nNnF {#2} #1 {#4}
+      {
+        #5 {#2}
+        \exp_args:NNf \@@_step:NnnnN
+          #1 { \dim_eval:n { #2 + #3 } } {#3} {#4} #5
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\dim_step_inline:nnnn}
+% \begin{macro}{\dim_step_variable:nnnNn}
+% \begin{macro}{\@@_step:NNnnnn}
+%   The approach here is to build a function, with a global integer
+%   required to make the nesting safe (as seen in other in line
+%   functions), and map that function using \cs{dim_step_function:nnnN}.
+%   We put a \cs{__prg_break_point:Nn} so that \texttt{map_break}
+%   functions from other modules correctly decrement \cs{g__prg_map_int}
+%   before looking for their own break point.  The first argument is
+%   \cs{scan_stop:}, so that no breaking function recognizes this break
+%   point as its own.
+%    \begin{macrocode}
+\cs_new_protected:Npn \dim_step_inline:nnnn
+  {
+    \int_gincr:N \g__prg_map_int
+    \exp_args:NNc \@@_step:NNnnnn
+      \cs_gset_protected:Npn
+      { __prg_map_ \int_use:N \g__prg_map_int :w }
+  }
+\cs_new_protected:Npn \dim_step_variable:nnnNn #1#2#3#4#5
+  {
+    \int_gincr:N \g__prg_map_int
+    \exp_args:NNc \@@_step:NNnnnn
+      \cs_gset_protected:Npx
+      { __prg_map_ \int_use:N \g__prg_map_int :w }
+      {#1}{#2}{#3}
+      {
+        \tl_set:Nn \exp_not:N #4 {##1}
+        \exp_not:n {#5}
+      }
+  }
+\cs_new_protected:Npn \@@_step:NNnnnn #1#2#3#4#5#6
+  {
+    #1 #2 ##1 {#6}
+    \dim_step_function:nnnN {#3} {#4} {#5} #2
+    \__prg_break_point:Nn \scan_stop: { \int_gdecr:N \g__prg_map_int }
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
 % \subsection{Using \texttt{dim} expressions and variables}
 %
 % \begin{macro}{\dim_eval:n}
 %   Evaluating a dimension expression expandably.
 %    \begin{macrocode}
-\__debug_patch_args:nNNpn
-  { { \__debug_chk_expr:nNnN {#1} \@@_eval:w { } \dim_eval:n } }
+\__kernel_patch_args:nNNpn
+  { { \__kernel_chk_expr:nNnN {#1} \@@_eval:w { } \dim_eval:n } }
 \cs_new:Npn \dim_eval:n #1
   { \dim_use:N \@@_eval:w #1 \@@_eval_end: }
 %    \end{macrocode}
@@ -1512,8 +1653,8 @@
 %   difference with \cs{dim_eval:n} is the lack of \cs{dim_use:N}, to
 %   produce an internal dimension rather than expand it into characters.
 %    \begin{macrocode}
-\__debug_patch_args:nNNpn
-  { { \__debug_chk_expr:nNnN {#1} \@@_eval:w { } \@@_eval:n } }
+\__kernel_patch_args:nNNpn
+  { { \__kernel_chk_expr:nNnN {#1} \@@_eval:w { } \@@_eval:n } }
 \cs_new:Npn \@@_eval:n #1 { \@@_eval:w #1 \@@_eval_end: }
 %    \end{macrocode}
 % \end{macro}
@@ -1539,8 +1680,8 @@
 %   terminating early and leaving extra tokens lying around.  This is
 %   used a lot by low-level manipulations.
 %    \begin{macrocode}
-\__debug_patch_args:nNNpn
-  { { \__debug_chk_expr:nNnN {#1} \@@_eval:w { } \dim_to_decimal:n } }
+\__kernel_patch_args:nNNpn
+  { { \__kernel_chk_expr:nNnN {#1} \@@_eval:w { } \dim_to_decimal:n } }
 \cs_new:Npn \dim_to_decimal:n #1
   {
     \exp_after:wN
@@ -1575,8 +1716,8 @@
 %   Another hard-coded conversion: this one is necessary to avoid things going
 %   off-scale.
 %    \begin{macrocode}
-\__debug_patch_args:nNNpn
-  { { \__debug_chk_expr:nNnN {#1} \@@_eval:w { } \dim_to_decimal_in_sp:n } }
+\__kernel_patch_args:nNNpn
+  { { \__kernel_chk_expr:nNnN {#1} \@@_eval:w { } \dim_to_decimal_in_sp:n } }
 \cs_new:Npn \dim_to_decimal_in_sp:n #1
   { \int_eval:n { \@@_eval:w #1 \@@_eval_end: } }
 %    \end{macrocode}
@@ -1677,7 +1818,7 @@
 %   even for constants.  See \cs{dim_const:Nn} for why we cannot use
 %   \cs{skip_gset:Nn}.
 %    \begin{macrocode}
-\__debug_patch:nnNNpn { \__debug_chk_var_scope:NN c #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_scope:NN c #1 } { }
 \cs_new_protected:Npn \skip_const:Nn #1#2
   {
     \skip_new:N #1
@@ -1691,9 +1832,9 @@
 % \begin{macro}{\skip_gzero:N, \skip_gzero:c}
 %   Reset the register to zero.
 %    \begin{macrocode}
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \skip_zero:N #1 { #1 \c_zero_skip }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \skip_gzero:N #1 { \tex_global:D #1 \c_zero_skip }
 \cs_generate_variant:Nn \skip_zero:N  { c }
 \cs_generate_variant:Nn \skip_gzero:N { c }
@@ -1733,10 +1874,10 @@
 %    \begin{macrocode}
 \cs_set_protected:Npn \@@_tmp:w #1#2#3
   {
-    \__debug_patch_args:nnnNNpn
+    \__kernel_patch_args:nnnNNpn
       { #1 ##1 }
       { }
-      { {##1} { \__debug_chk_expr:nNnN {##2} \etex_glueexpr:D { } #3 } }
+      { {##1} { \__kernel_chk_expr:nNnN {##2} \etex_glueexpr:D { } #3 } }
     #2 #3
   }
 %    \end{macrocode}
@@ -1745,10 +1886,10 @@
 % \begin{macro}{\skip_gset:Nn, \skip_gset:cn}
 %   Much the same as for dimensions.
 %    \begin{macrocode}
-\@@_tmp:w \__debug_chk_var_local:N
+\@@_tmp:w \__kernel_chk_var_local:N
 \cs_new_protected:Npn \skip_set:Nn #1#2
   { #1 ~ \etex_glueexpr:D #2 \scan_stop: }
-\@@_tmp:w \__debug_chk_var_global:N
+\@@_tmp:w \__kernel_chk_var_global:N
 \cs_new_protected:Npn \skip_gset:Nn #1#2
   { \tex_global:D #1 ~ \etex_glueexpr:D #2 \scan_stop: }
 \cs_generate_variant:Nn \skip_set:Nn  { c }
@@ -1777,18 +1918,18 @@
 % \begin{macro}{\skip_gsub:Nn, \skip_gsub:cn}
 %   Using |by| here deals with the (incorrect) case |\skip123|.
 %    \begin{macrocode}
-\@@_tmp:w \__debug_chk_var_local:N
+\@@_tmp:w \__kernel_chk_var_local:N
 \cs_new_protected:Npn \skip_add:Nn #1#2
   { \tex_advance:D #1 by \etex_glueexpr:D #2 \scan_stop: }
-\@@_tmp:w \__debug_chk_var_global:N
+\@@_tmp:w \__kernel_chk_var_global:N
 \cs_new_protected:Npn \skip_gadd:Nn #1#2
   { \tex_global:D \tex_advance:D #1 by \etex_glueexpr:D #2 \scan_stop: }
 \cs_generate_variant:Nn \skip_add:Nn  { c }
 \cs_generate_variant:Nn \skip_gadd:Nn { c }
-\@@_tmp:w \__debug_chk_var_local:N
+\@@_tmp:w \__kernel_chk_var_local:N
 \cs_new_protected:Npn \skip_sub:Nn #1#2
   { \tex_advance:D #1 by - \etex_glueexpr:D #2 \scan_stop: }
-\@@_tmp:w \__debug_chk_var_global:N
+\@@_tmp:w \__kernel_chk_var_global:N
 \cs_new_protected:Npn \skip_gsub:Nn #1#2
   { \tex_global:D \tex_advance:D #1 by - \etex_glueexpr:D #2 \scan_stop: }
 \cs_generate_variant:Nn \skip_sub:Nn  { c }
@@ -1830,10 +1971,10 @@
 %    \begin{macrocode}
 \cs_set_protected:Npn \@@_tmp:w #1
   {
-    \__debug_patch_conditional_args:nNNpnn
+    \__kernel_patch_conditional_args:nNNpnn
       {
         {
-          \__debug_chk_expr:nNnN
+          \__kernel_chk_expr:nNnN
             {##1} \etex_glueexpr:D { } \skip_if_finite:n
         }
       }
@@ -1855,8 +1996,8 @@
 % \begin{macro}{\skip_eval:n}
 %   Evaluating a skip expression expandably.
 %    \begin{macrocode}
-\__debug_patch_args:nNNpn
-  { { \__debug_chk_expr:nNnN {#1} \etex_glueexpr:D { } \skip_eval:n } }
+\__kernel_patch_args:nNNpn
+  { { \__kernel_chk_expr:nNnN {#1} \etex_glueexpr:D { } \skip_eval:n } }
 \cs_new:Npn \skip_eval:n #1
   { \skip_use:N \etex_glueexpr:D #1 \scan_stop: }
 %    \end{macrocode}
@@ -1878,13 +2019,13 @@
 %    Inserting skips.
 %    \begin{macrocode}
 \cs_new_eq:NN  \skip_horizontal:N \tex_hskip:D
-\__debug_patch_args:nNNpn
-  { { \__debug_chk_expr:nNnN {#1} \etex_glueexpr:D { } \skip_horizontal:n } }
+\__kernel_patch_args:nNNpn
+  { { \__kernel_chk_expr:nNnN {#1} \etex_glueexpr:D { } \skip_horizontal:n } }
 \cs_new:Npn \skip_horizontal:n #1
   { \skip_horizontal:N \etex_glueexpr:D #1 \scan_stop: }
 \cs_new_eq:NN  \skip_vertical:N \tex_vskip:D
-\__debug_patch_args:nNNpn
-  { { \__debug_chk_expr:nNnN {#1} \etex_glueexpr:D { } \skip_vertical:n } }
+\__kernel_patch_args:nNNpn
+  { { \__kernel_chk_expr:nNnN {#1} \etex_glueexpr:D { } \skip_vertical:n } }
 \cs_new:Npn \skip_vertical:n #1
   { \skip_vertical:N \etex_glueexpr:D #1 \scan_stop: }
 \cs_generate_variant:Nn \skip_horizontal:N { c }
@@ -1967,7 +2108,7 @@
 % \begin{macro}{\muskip_const:Nn, \muskip_const:cn}
 %   See \cs{skip_const:Nn}.
 %    \begin{macrocode}
-\__debug_patch:nnNNpn { \__debug_chk_var_scope:NN c #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_scope:NN c #1 } { }
 \cs_new_protected:Npn \muskip_const:Nn #1#2
   {
     \muskip_new:N #1
@@ -1981,10 +2122,10 @@
 % \begin{macro}{\muskip_gzero:N, \muskip_gzero:c}
 %   Reset the register to zero.
 %    \begin{macrocode}
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \muskip_zero:N #1
   { #1 \c_zero_muskip }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \muskip_gzero:N #1
   { \tex_global:D #1 \c_zero_muskip }
 \cs_generate_variant:Nn \muskip_zero:N  { c }
@@ -2025,13 +2166,13 @@
 %    \begin{macrocode}
 \cs_set_protected:Npn \@@_tmp:w #1#2#3
   {
-    \__debug_patch_args:nnnNNpn
+    \__kernel_patch_args:nnnNNpn
       { #1 ##1 }
       { }
       {
         {##1}
         {
-          \__debug_chk_expr:nNnN {##2}
+          \__kernel_chk_expr:nNnN {##2}
             \etex_muexpr:D { \etex_mutoglue:D } #3
         }
       }
@@ -2043,10 +2184,10 @@
 % \begin{macro}{\muskip_gset:Nn, \muskip_gset:cn}
 %   This should be pretty familiar.
 %    \begin{macrocode}
-\@@_tmp:w \__debug_chk_var_local:N
+\@@_tmp:w \__kernel_chk_var_local:N
 \cs_new_protected:Npn \muskip_set:Nn #1#2
   { #1 ~ \etex_muexpr:D #2 \scan_stop: }
-\@@_tmp:w \__debug_chk_var_global:N
+\@@_tmp:w \__kernel_chk_var_global:N
 \cs_new_protected:Npn \muskip_gset:Nn #1#2
   { \tex_global:D #1 ~ \etex_muexpr:D #2 \scan_stop: }
 \cs_generate_variant:Nn \muskip_set:Nn  { c }
@@ -2067,10 +2208,10 @@
 %   }
 %   All straightforward.
 %    \begin{macrocode}
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \muskip_set_eq:NN #1#2 { #1 = #2 }
 \cs_generate_variant:Nn \muskip_set_eq:NN { c , Nc , cc }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \muskip_gset_eq:NN #1#2 { \tex_global:D #1 = #2 }
 \cs_generate_variant:Nn \muskip_gset_eq:NN { c , Nc , cc }
 %    \end{macrocode}
@@ -2083,18 +2224,18 @@
 % \begin{macro}{\muskip_gsub:Nn, \muskip_gsub:cn}
 %   Using |by| here deals with the (incorrect) case |\muskip123|.
 %    \begin{macrocode}
-\@@_tmp:w \__debug_chk_var_local:N
+\@@_tmp:w \__kernel_chk_var_local:N
 \cs_new_protected:Npn \muskip_add:Nn #1#2
   { \tex_advance:D #1 by \etex_muexpr:D #2 \scan_stop: }
-\@@_tmp:w \__debug_chk_var_global:N
+\@@_tmp:w \__kernel_chk_var_global:N
 \cs_new_protected:Npn \muskip_gadd:Nn #1#2
   { \tex_global:D \tex_advance:D #1 by \etex_muexpr:D #2 \scan_stop: }
 \cs_generate_variant:Nn \muskip_add:Nn  { c }
 \cs_generate_variant:Nn \muskip_gadd:Nn { c }
-\@@_tmp:w \__debug_chk_var_local:N
+\@@_tmp:w \__kernel_chk_var_local:N
 \cs_new_protected:Npn \muskip_sub:Nn #1#2
   { \tex_advance:D #1 by - \etex_muexpr:D #2 \scan_stop: }
-\@@_tmp:w \__debug_chk_var_global:N
+\@@_tmp:w \__kernel_chk_var_global:N
 \cs_new_protected:Npn \muskip_gsub:Nn #1#2
   { \tex_global:D \tex_advance:D #1 by - \etex_muexpr:D #2 \scan_stop: }
 \cs_generate_variant:Nn \muskip_sub:Nn  { c }
@@ -2110,10 +2251,10 @@
 % \begin{macro}{\muskip_eval:n}
 %   Evaluating a muskip expression expandably.
 %    \begin{macrocode}
-\__debug_patch_args:nNNpn
+\__kernel_patch_args:nNNpn
   {
     {
-      \__debug_chk_expr:nNnN {#1} \etex_muexpr:D
+      \__kernel_chk_expr:nNnN {#1} \etex_muexpr:D
         { \etex_mutoglue:D } \muskip_eval:n
     }
   }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -1,6 +1,6 @@
 % \iffalse
 %
-%% File l3sort.dtx (C) Copyright 2012-2017 The LaTeX3 Project
+%% File l3sort.dtx (C) Copyright 2012-2018 The LaTeX3 Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %
@@ -585,7 +585,7 @@
 \cs_new_protected:Npn \@@_return_mark:N #1 { }
 \cs_new_protected:Npn \@@_return_none_error:
   {
-    \__msg_kernel_error:nnxx { kernel } { return-none }
+    \__kernel_msg_error:nnxx { kernel } { return-none }
       { \tex_the:D \tex_toks:D \l_@@_A_int }
       { \tex_the:D \tex_toks:D \l_@@_C_int }
     \@@_return_same:
@@ -592,7 +592,7 @@
   }
 \cs_new_protected:Npn \@@_return_two_error:w
     #1 \@@_return_none_error:
-  { \__msg_kernel_error:nn { kernel } { return-two } }
+  { \__kernel_msg_error:nn { kernel } { return-two } }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
@@ -1013,12 +1013,12 @@
   { \cs_set_eq:NN \toksdef \@@_disabled_toksdef:n }
 \cs_new_protected:Npn \@@_disabled_toksdef:n #1
   {
-    \__msg_kernel_error:nnx { kernel } { toksdef }
+    \__kernel_msg_error:nnx { kernel } { toksdef }
       { \token_to_str:N #1 }
     \@@_error:
     \tex_toksdef:D #1
   }
-\__msg_kernel_new:nnnn { kernel } { toksdef }
+\__kernel_msg_new:nnnn { kernel } { toksdef }
   { Allocation~of~\iow_char:N\\toks~registers~impossible~while~sorting. }
   {
     The~comparison~code~used~for~sorting~a~list~has~attempted~to~
@@ -1037,13 +1037,13 @@
 \cs_new_protected:Npn \@@_too_long_error:NNw #1#2 \fi:
   {
     \fi:
-    \__msg_kernel_error:nnxxx { kernel } { too-large }
+    \__kernel_msg_error:nnxxx { kernel } { too-large }
       { \token_to_str:N #2 }
       { \int_eval:n { \l_@@_true_max_int - \l_@@_min_int } }
       { \int_eval:n { \l_@@_top_int - \l_@@_min_int } }
     #1 \@@_error:
   }
-\__msg_kernel_new:nnnn { kernel } { too-large }
+\__kernel_msg_new:nnnn { kernel } { too-large }
   { The~list~#1~is~too~long~to~be~sorted~by~TeX. }
   {
     TeX~has~#2~toks~registers~still~available:~
@@ -1054,7 +1054,7 @@
 % \end{macro}
 %
 %    \begin{macrocode}
-\__msg_kernel_new:nnnn { kernel } { return-none }
+\__kernel_msg_new:nnnn { kernel } { return-none }
   { The~comparison~code~did~not~return. }
   {
     When~sorting~a~list,~the~code~to~compare~items~#1~and~#2~
@@ -1063,7 +1063,7 @@
     \iow_char:N\\sort_return_swapped: .~
     Exactly~one~of~these~should~be~called.
   }
-\__msg_kernel_new:nnnn { kernel } { return-two }
+\__kernel_msg_new:nnnn { kernel } { return-two }
   { The~comparison~code~returned~multiple~times. }
   {
     When~sorting~a~list,~the~code~to~compare~items~called~
@@ -1078,9 +1078,9 @@
 % \begin{macro}[deprecated = 2018-12-31]{\sort_ordered:, \sort_reversed:}
 %   These functions were renamed for consistency.
 %    \begin{macrocode}
-\__debug_deprecation:nnNNpn { 2018-12-31 } { \sort_return_same: }
+\__kernel_patch_deprecation:nnNNpn { 2018-12-31 } { \sort_return_same: }
 \cs_new_protected:Npn \sort_ordered: { \sort_return_same: }
-\__debug_deprecation:nnNNpn { 2018-12-31 } { \sort_return_swapped: }
+\__kernel_patch_deprecation:nnNNpn { 2018-12-31 } { \sort_return_swapped: }
 \cs_new_protected:Npn \sort_reversed: { \sort_return_swapped: }
 %    \end{macrocode}
 % \end{macro}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -1,6 +1,6 @@
 % \iffalse meta-comment
 %
-%% File: l3str.dtx Copyright (C) 2011-2017 The LaTeX3 Project
+%% File: l3str.dtx Copyright (C) 2011-2018 The LaTeX3 Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %
@@ -1012,7 +1012,7 @@
   {
     \tl_if_empty:nTF {#4}
       {
-        \__msg_kernel_error:nnx { kernel } { empty-search-pattern } {#5}
+        \__kernel_msg_error:nnx { kernel } { empty-search-pattern } {#5}
       }
       {
         \use:x
@@ -1496,7 +1496,7 @@
   }
 \cs_new:Npn \str_item_ignore_spaces:nn #1
   { \exp_args:No \@@_item:nn { \tl_to_str:n {#1} } }
-\__debug_patch_args:nNNpn { {#1} { \__int_eval:n {#2} } }
+\__kernel_patch_args:nNNpn { {#1} { \__int_eval:n {#2} } }
 \cs_new:Npn \@@_item:nn #1#2
   {
     \exp_after:wN \@@_item:w
@@ -1593,7 +1593,7 @@
   }
 \cs_new:Npn \str_range_ignore_spaces:nnn #1
   { \exp_args:No \@@_range:nnn { \tl_to_str:n {#1} } }
-\__debug_patch_args:nNNpn
+\__kernel_patch_args:nNNpn
   { {#1} { \__int_eval:n {#2} } { \__int_eval:n {#3} } }
 \cs_new:Npn \@@_range:nnn #1#2#3
   {

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %
@@ -1078,7 +1078,7 @@
 % \end{variable}
 %
 %    \begin{macrocode}
-\__msg_kernel_new:nnn { kernel } { show-tl-analysis }
+\__kernel_msg_new:nnn { kernel } { show-tl-analysis }
   {
     The~token~list~ \tl_if_empty:nF {#1} { #1 ~ }
     \tl_if_empty:nTF {#2}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -1,6 +1,6 @@
 % \iffalse meta-comment
 %
-%% File: l3tl.dtx Copyright (C) 1990-2017 The LaTeX3 Project
+%% File: l3tl.dtx Copyright (C) 1990-2018 The LaTeX3 Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %
@@ -988,7 +988,7 @@
 %   appropriate item from the \meta{token list} in the input stream.
 %   If the \meta{integer expression} is negative, indexing occurs from
 %   the right of the token list, starting at $-1$ for the right-most item.
-%   If the index is out of bounds, then thr function expands to nothing.
+%   If the index is out of bounds, then the function expands to nothing.
 %   \begin{texnote}
 %     The result is returned within the \tn{unexpanded}
 %     primitive (\cs{exp_not:n}), which means that the \meta{item}
@@ -1131,13 +1131,13 @@
 % \begin{macro}{\tl_const:Nn, \tl_const:Nx, \tl_const:cn, \tl_const:cx}
 %   Constants are also easy to generate.
 %    \begin{macrocode}
-\__debug_patch:nnNNpn { \__debug_chk_var_scope:NN c #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_scope:NN c #1 } { }
 \cs_new_protected:Npn \tl_const:Nn #1#2
   {
     \__chk_if_free_cs:N #1
     \cs_gset_nopar:Npx #1 { \exp_not:n {#2} }
   }
-\__debug_patch:nnNNpn { \__debug_chk_var_scope:NN c #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_scope:NN c #1 } { }
 \cs_new_protected:Npn \tl_const:Nx #1#2
   {
     \__chk_if_free_cs:N #1
@@ -1186,14 +1186,14 @@
 \tex_ifodd:D \l at expl@enable at debug@bool
   \cs_new_protected:Npn \tl_set_eq:NN #1#2
     {
-      \__debug_chk_var_local:N #1
-      \__debug_chk_var_exist:N #2
+      \__kernel_chk_var_local:N #1
+      \__kernel_chk_var_exist:N #2
       \cs_set_eq:NN #1 #2
     }
   \cs_new_protected:Npn \tl_gset_eq:NN #1#2
     {
-      \__debug_chk_var_global:N #1
-      \__debug_chk_var_exist:N #2
+      \__kernel_chk_var_global:N #1
+      \__kernel_chk_var_exist:N #2
       \cs_gset_eq:NN #1 #2
     }
 \else:
@@ -1212,18 +1212,18 @@
 %   three arguments must be checked: a token list |#2| or |#3| equal to
 %   \cs{scan_stop:} would lead to problems later on.
 %    \begin{macrocode}
-\__debug_patch:nnNNpn
+\__kernel_patch:nnNNpn
   {
-    \__debug_chk_var_exist:N #2
-    \__debug_chk_var_exist:N #3
+    \__kernel_chk_var_exist:N #2
+    \__kernel_chk_var_exist:N #3
   }
   { }
 \cs_new_protected:Npn \tl_concat:NNN #1#2#3
   { \tl_set:Nx #1 { \exp_not:o {#2} \exp_not:o {#3} } }
-\__debug_patch:nnNNpn
+\__kernel_patch:nnNNpn
   {
-    \__debug_chk_var_exist:N #2
-    \__debug_chk_var_exist:N #3
+    \__kernel_chk_var_exist:N #2
+    \__kernel_chk_var_exist:N #3
   }
   { }
 \cs_new_protected:Npn \tl_gconcat:NNN #1#2#3
@@ -1292,25 +1292,25 @@
 %   which makes the token list registers provided by \TeX{}
 %   more or less redundant. The \cs{tl_set:No} version is done
 %   \enquote{by hand} as it is used quite a lot.  Each definition is
-%   prefixed by a call to \cs{__debug_patch:nnNNpn} which adds an
+%   prefixed by a call to \cs{__kernel_patch:nnNNpn} which adds an
 %   existence check to the definition.
 %    \begin{macrocode}
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \tl_set:Nn #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:n {#2} } }
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \tl_set:No #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:o {#2} } }
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \tl_set:Nx #1#2
   { \cs_set_nopar:Npx #1 {#2} }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \tl_gset:Nn #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:n {#2} } }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \tl_gset:No #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:o {#2} } }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \tl_gset:Nx #1#2
   { \cs_gset_nopar:Npx #1 {#2} }
 \cs_generate_variant:Nn \tl_set:Nn  {         NV , Nv , Nf }
@@ -1335,28 +1335,28 @@
 %   }
 % Adding to the left is done directly to gain a little performance.
 %    \begin{macrocode}
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \tl_put_left:Nn #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:n {#2} \exp_not:o #1 } }
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \tl_put_left:NV #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:V #2 \exp_not:o #1 } }
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \tl_put_left:No #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:o {#2} \exp_not:o #1 } }
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \tl_put_left:Nx #1#2
   { \cs_set_nopar:Npx #1 { #2 \exp_not:o #1 } }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \tl_gput_left:Nn #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:n {#2} \exp_not:o #1 } }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \tl_gput_left:NV #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:V #2 \exp_not:o #1 } }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \tl_gput_left:No #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:o {#2} \exp_not:o #1 } }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \tl_gput_left:Nx #1#2
   { \cs_gset_nopar:Npx #1 { #2 \exp_not:o {#1} } }
 \cs_generate_variant:Nn \tl_put_left:Nn  { c }
@@ -1385,28 +1385,28 @@
 %   }
 % The same on the right.
 %    \begin{macrocode}
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \tl_put_right:Nn #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:o #1 \exp_not:n {#2} } }
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \tl_put_right:NV #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:o #1 \exp_not:V #2 } }
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \tl_put_right:No #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:o #1 \exp_not:o {#2} } }
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \tl_put_right:Nx #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:o #1 #2 } }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \tl_gput_right:Nn #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:o #1 \exp_not:n {#2} } }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \tl_gput_right:NV #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:o #1 \exp_not:V #2 } }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \tl_gput_right:No #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:o #1 \exp_not:o {#2} } }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \tl_gput_right:Nx #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:o {#1} #2 } }
 \cs_generate_variant:Nn \tl_put_right:Nn  { c }
@@ -1757,7 +1757,7 @@
   {
     \tl_if_empty:nTF {#6}
       {
-        \__msg_kernel_error:nnx { kernel } { empty-search-pattern }
+        \__kernel_msg_error:nnx { kernel } { empty-search-pattern }
           { \tl_to_str:n {#7} }
       }
       {
@@ -2316,7 +2316,7 @@
   {
     \tl_if_exist:NTF #1 {#1}
       {
-        \__msg_kernel_expandable_error:nnn
+        \__kernel_msg_expandable_error:nnn
           { kernel } { bad-variable } {#1}
       }
   }
@@ -3041,9 +3041,9 @@
 % \begin{macro}[deprecated=2017-12-31]{\tl_to_lowercase:n, \tl_to_uppercase:n}
 %   For removal after 2017-12-31.
 %    \begin{macrocode}
-\__debug_deprecation:nnNNpn { 2017-12-31 } { \tex_lowercase:D }
+\__kernel_patch_deprecation:nnNNpn { 2017-12-31 } { \tex_lowercase:D }
 \cs_new_protected:Npn \tl_to_lowercase:n #1 { \tex_lowercase:D {#1} }
-\__debug_deprecation:nnNNpn { 2017-12-31 } { \tex_uppercase:D }
+\__kernel_patch_deprecation:nnNNpn { 2017-12-31 } { \tex_uppercase:D }
 \cs_new_protected:Npn \tl_to_uppercase:n #1 { \tex_uppercase:D {#1} }
 %    \end{macrocode}
 % \end{macro}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx	2018-02-23 21:54:14 UTC (rev 46720)
@@ -1,6 +1,6 @@
 % \iffalse meta-comment
 %
-%% File: l3token.dtx Copyright (C) 2005-2017 The LaTeX3 Project
+%% File: l3token.dtx Copyright (C) 2005-2018 The LaTeX3 Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -12,6 +12,7 @@
 % This file is part of the "l3kernel bundle" (The Work in LPPL)
 % and all files in that bundle must be distributed together.
 %
+%=[]
 % -----------------------------------------------------------------------
 %
 % The development version of the bundle can be found at
@@ -41,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/16}
+% \date{Released 2018/02/21}
 %
 % \maketitle
 %
@@ -701,7 +702,7 @@
 %     \cs{token_if_toks_register:NTF} \meta{token} \Arg{true code} \Arg{false code}
 %   \end{syntax}
 %   Tests if the \meta{token} is defined to be a toks register
-%   (not used by\LaTeX3).
+%   (not used by \LaTeX3).
 % \end{function}
 %
 % \begin{function}[updated = 2011-05-23, EXP,pTF]{\token_if_primitive:N}
@@ -1367,7 +1368,7 @@
 %   the interface layer, turn the two arguments into integers up-front so
 %   this is only done once.
 %    \begin{macrocode}
-\__debug_patch_args:nNNpn { { \__int_eval:n {#1} } { \__int_eval:n {#2} } }
+\__kernel_patch_args:nNNpn { { \__int_eval:n {#1} } { \__int_eval:n {#2} } }
 \cs_new:Npn \char_generate:nn #1#2
   {
     \exp:w \exp_after:wN \@@_generate_aux:w
@@ -1393,13 +1394,13 @@
 \cs_new:Npn \@@_generate_aux:w #1 ; #2 ;
   {
     \if_int_compare:w #2 = 13 \exp_stop_f:
-      \__msg_kernel_expandable_error:nn { kernel } { char-active }
+      \__kernel_msg_expandable_error:nn { kernel } { char-active }
     \else:
       \if_int_compare:w #2 = 10 \exp_stop_f:
         \if_int_compare:w #1 =  0 \exp_stop_f:
-          \__msg_kernel_expandable_error:nn { kernel } { char-null-space }
+          \__kernel_msg_expandable_error:nn { kernel } { char-null-space }
         \else:
-          \__msg_kernel_expandable_error:nn { kernel } { char-space }
+          \__kernel_msg_expandable_error:nn { kernel } { char-space }
         \fi:
       \else:
         \if_int_odd:w 0
@@ -1407,13 +1408,13 @@
             \if_int_compare:w #2 = 5  \exp_stop_f: 1 \fi:
             \if_int_compare:w #2 = 9  \exp_stop_f: 1 \fi:
             \if_int_compare:w #2 > 13 \exp_stop_f: 1 \fi: \exp_stop_f:
-          \__msg_kernel_expandable_error:nn { kernel }
+          \__kernel_msg_expandable_error:nn { kernel }
             { char-invalid-catcode }
         \else:
           \if_int_odd:w 0
             \if_int_compare:w #1 < 0 \exp_stop_f: 1 \fi:
             \if_int_compare:w #1 > \c_@@_max_int 1 \fi: \exp_stop_f:
-            \__msg_kernel_expandable_error:nn { kernel }
+            \__kernel_msg_expandable_error:nn { kernel }
               { char-out-of-range }
           \else:
             \@@_generate_aux:nnw {#1} {#2}
@@ -2556,7 +2557,7 @@
 % \begin{macro}[deprecated=2018-12-31]{\token_new:Nn}
 %   For removal after 2018-12-31.
 %    \begin{macrocode}
-\__debug_deprecation:nnNNpn { 2018-12-31 } { \cs_new_eq:NN }
+\__kernel_patch_deprecation:nnNNpn { 2018-12-31 } { \cs_new_eq:NN }
 \cs_new_protected:Npn \token_new:Nn #1#2 { \cs_new_eq:NN #1 #2 }
 %    \end{macrocode}
 % \end{macro}

Added: trunk/Master/texmf-dist/tex/latex/l3experimental/l3color/l3color.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3color/l3color.sty	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3color/l3color.sty	2018-02-23 21:54:14 UTC (rev 46720)
@@ -0,0 +1,360 @@
+%%
+%% This is file `l3color.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% l3color.dtx  (with options: `package')
+%% 
+%% Copyright (C) 2017-2018 The LaTeX3 Project
+%% 
+%% It may be distributed and/or modified under the conditions of
+%% the LaTeX Project Public License (LPPL), either version 1.3c of
+%% this license or (at your option) any later version.  The latest
+%% version of this license is in the file:
+%% 
+%%    http://www.latex-project.org/lppl.txt
+%% 
+%% This file is part of the "l3experimental bundle" (The Work in LPPL)
+%% and all files in that bundle must be distributed together.
+%% 
+%% File: l3color.dtx Copyright(C) 2017-2018 The LaTeX3 Project
+\RequirePackage{expl3}
+\ProvidesExplPackage{l3color}{2018/02/21}{}
+  {L3 Experimental color support}
+\tl_new:N \l__color_tmp_tl
+\prg_new_conditional:Npnn \__color_if_defined:n #1 { T, F, TF }
+  {
+    \tl_if_exist:cTF { l__color_named_ #1 _tl }
+      \prg_return_true:
+      \prg_return_false:
+  }
+\cs_new_protected:Npn \__color_extract:nNN #1#2#3
+  {
+    \exp_after:wN \exp_after:wN \exp_after:wN
+      \__color_extract:NNw
+      \exp_after:wN \exp_after:wN \exp_after:wN #2
+      \exp_after:wN \exp_after:wN \exp_after:wN #3
+        \cs:w l__color_named_ #1 _tl \cs_end: \q_stop
+  }
+\cs_generate_variant:Nn \__color_extract:nNN { V }
+\cs_new_protected:Npn \__color_extract:NNw #1#2 #3 ~ #4 \q_stop
+  {
+    \tl_set:Nn #1 {#3}
+    \tl_set:Nn #2 {#4}
+  }
+\cs_new_protected:Npn \__color_convert:nnN #1#2#3
+  { \__color_convert:nnVN {#1} {#2} #3 #3 }
+\cs_generate_variant:Nn \__color_convert:nnN { VV }
+\cs_new_protected:Npn \__color_convert:nnnN #1#2#3#4
+  {
+    \str_if_eq_x:nnT {#1} { spot } % TO DO!!!
+      { }
+    \tl_set:Nx #4
+      { \use:c { __color_convert_ #1 _ #2 :w } #3 ~ 0 ~ 0 ~ 0 \q_stop }
+  }
+\cs_generate_variant:Nn \__color_convert:nnnN { nnV }
+\cs_new:Npn \__color_convert_gray_rgb:w #1 ~ #2 \q_stop
+  { #1 ~ #1 ~ #1 }
+\cs_new:Npn \__color_convert_gray_cmyk:w #1 ~ #2 \q_stop
+  { 0 ~ 0 ~ 0 ~ \fp_eval:n { 1 - #1 } }
+\cs_new:Npn \__color_convert_rgb_gray:w #1 ~ #2 ~ #3 ~ #4 \q_stop
+  { \fp_eval:n { 0.3 * #1 + 0.59 * #2 + 0.11 * #3 } }
+\cs_new:Npn \__color_convert_rgb_cmyk:w #1 ~ #2 ~ #3 ~ #4 \q_stop
+  {
+    \exp_args:Nf \__color_convert_rgb_cmyk:nnnn
+      { \fp_eval:n { min ( 1 - #1 , 1 - #2 , 1 - #3 ) } } {#1} {#2} {#3}
+  }
+\cs_new:Npn \__color_convert_rgb_cmyk:nnnn #1#2#3#4
+  {
+    \fp_eval:n { min ( 1 , max ( 0 , 1 - #2 - #1 ) ) } \c_space_tl
+    \fp_eval:n { min ( 1 , max ( 0 , 1 - #3 - #1 ) ) } \c_space_tl
+    \fp_eval:n { min ( 1 , max ( 0 , 1 - #4 - #1 ) ) } \c_space_tl
+    #1
+  }
+\cs_new:Npn \__color_convert_cmyk_gray:w #1 ~ #2 ~ #3 ~ #4 ~ #5 \q_stop
+  { \fp_eval:n { 1 - min ( 1 , 0.3 * #1 + 0.59 * #2 + 0.11 * #3 + #4 ) } }
+\cs_new:Npn \__color_convert_cmyk_rgb:w #1 ~ #2 ~ #3 ~ #4 ~ #5 \q_stop
+  {
+    \fp_eval:n { 1 - min ( 1 , #1 + #4 ) } \c_space_tl
+    \fp_eval:n { 1 - min ( 1 , #2 + #4 ) } \c_space_tl
+    \fp_eval:n { 1 - min ( 1 , #3 + #4 ) }
+  }
+\tl_new:N \l__color_model_tl
+\tl_new:N \l__color_value_tl
+\tl_new:N \l__color_next_model_tl
+\tl_new:N \l__color_next_value_tl
+\cs_new_protected:Npn \color_parse:nN #1#2
+  {
+    \group_begin:
+      \seq_map_inline:Nn \l_char_active_seq
+        {
+          \tl_set:Nx \l__color_tmp_tl { \cs_to_str:N ##1 }
+          \char_set_active_eq:NN ##1 \l__color_tmp_tl
+        }
+      \tl_set:Nx \l__color_tmp_tl {#1}
+    \exp_args:NNV \group_end:
+    \__color_parse:nN \l__color_tmp_tl #2
+  }
+\cs_new_protected:Npn \__color_parse:nN #1#2
+  {
+    \tl_if_exist:cTF { l__color_named_ #1 _tl }
+      { \tl_set_eq:Nc #2 { l__color_named_ #1 _tl } }
+      { \__color_parse:Nw #2#1 ! \q_stop }
+  }
+\cs_new_protected:Npn \__color_parse:Nw #1#2 ! #3 \q_stop
+  {
+    \__color_if_defined:nTF {#2}
+      {
+        \tl_if_blank:nTF {#3}
+          { \tl_set_eq:Nc #1 { l__color_named_ #2 _tl } }
+          { \__color_parse_loop_init:Nnn #1 {#2} {#3} }
+      }
+      {
+        \__kernel_msg_error:nnn { color } { unknown-color } {#3}
+        \tl_set_eq:NN \l__color_current_tl \l__color_named_black_tl
+      }
+  }
+\cs_new_protected:Npn \__color_parse_loop_init:Nnn #1#2#3
+  {
+    \group_begin:
+      \__color_extract:nNN {#2} \l__color_model_tl \l__color_value_tl
+      \__color_parse_loop:w #3 ! ! ! ! \q_stop
+      \tl_set:Nx \l__color_tmp_tl
+        { \l__color_model_tl \c_space_tl \l__color_value_tl }
+    \exp_args:NNNV \group_end:
+    \tl_set:Nn #1 \l__color_tmp_tl
+  }
+\cs_new_protected:Npn \__color_parse_loop:w #1 ! #2 ! #3 ! #4 ! #5 \q_stop
+  {
+    \bool_lazy_or:nnF
+      { \tl_if_blank_p:n {#1} }
+      { \int_compare_p:nNn {#1} = { 100 } }
+      {
+        \int_compare:nNnTF {#1} = { 0 }
+          {
+            \tl_if_blank:nTF {#2}
+              { \__color_extract:nNN { white } }
+              { \__color_extract:nNN {#2} }
+                \l__color_model_tl \l__color_value_tl
+          }
+          {
+            \use:x
+              {
+                \__color_parse_loop:nn {#1}
+                  { \tl_if_blank:nTF {#2} { white } {#2} }
+              }
+          }
+      }
+    \tl_if_blank:nF {#3}
+      { \__color_parse_loop:w #3 ! #4 ! #5 \q_stop }
+    \__color_parse_end:
+  }
+\cs_new_protected:Npn \__color_parse_loop:nn #1#2
+  {
+    \__color_if_defined:nTF {#2}
+      {
+        \__color_extract:nNN {#2} \l__color_next_model_tl \l__color_next_value_tl
+        \tl_if_eq:NNF \l__color_model_tl \l__color_next_model_tl
+          {
+            \str_if_eq_x:nnT { \l__color_model_tl } { gray }
+              {
+                \use:x
+                  {
+                    \tl_set:Nn \exp_not:N \l__color_model_tl
+                      { \l__color_next_model_tl }
+                    \tl_set:Nn \exp_not:N \l__color_value_tl
+                      { \l__color_next_value_tl }
+                    \tl_set:Nn \exp_not:N \l_next__color_model_tl
+                      { \l__color_model_tl }
+                    \tl_set:Nn \exp_not:N \l_next__color_value_tl
+                      { \l__color_value_tl }
+                  }
+              }
+            \__color_convert:VVN
+              \l__color_next_model_tl
+              \l__color_model_tl
+              \l__color_next_value_tl
+          }
+        \tl_set:Nx \l__color_value_tl
+          {
+            \__color_parse_mix:NVVn
+              \l__color_model_tl \l__color_value_tl \l__color_next_value_tl {#1}
+          }
+      }
+      {
+        \__kernel_msg_error:nnn { color } { unknown-color } {#2}
+        \__color_extract:nNN { black } \l__color_model_tl \l__color_value_tl
+        \__color_parse_break:w
+      }
+  }
+\cs_new_protected:Npn \__color_parse_break:w #1 \__color_parse_end: { }
+\cs_new_protected:Npn \__color_parse_end: { }
+\cs_new:Npn \__color_parse_mix:Nnnn #1#2#3#4
+  {
+    \exp_args:Nf \__color_parse_mix:nNnn
+      { \fp_eval:n { #4 / 100 } }
+      #1 {#2} {#3}
+  }
+\cs_generate_variant:Nn \__color_parse_mix:Nnnn { NVV }
+\cs_new:Npn \__color_parse_mix:nNnn #1#2#3#4
+  {
+    \use:c { __color_parse_mix_ #2 :nw } {#1}
+      #3 \q_mark #4 \q_stop
+  }
+\cs_new:Npn \__color_parse_mix_gray:nw #1#2 \q_mark #3 \q_stop
+  { \fp_eval:n { #2 * #1 + #3 * ( 1 - #1 ) } }
+\cs_new:Npn \__color_parse_mix_rgb:nw
+  #1#2 ~ #3 ~ #4 \q_mark #5 ~ #6 ~ #7 \q_stop
+  {
+    \fp_eval:n { #2 * #1 + #5 * ( 1 - #1 ) } \c_space_tl
+    \fp_eval:n { #3 * #1 + #6 * ( 1 - #1 ) } \c_space_tl
+    \fp_eval:n { #4 * #1 + #7 * ( 1 - #1 ) }
+  }
+\cs_new:Npn \__color_parse_mix_cmyk:nw
+  #1#2 ~ #3 ~ #4 ~ #5 \q_mark #6 ~ #7 ~ #8 ~ #9 \q_stop
+  {
+    \fp_eval:n { #2 * #1 + #6 * ( 1 - #1 ) } \c_space_tl
+    \fp_eval:n { #3 * #1 + #7 * ( 1 - #1 ) } \c_space_tl
+    \fp_eval:n { #4 * #1 + #8 * ( 1 - #1 ) } \c_space_tl
+    \fp_eval:n { #5 * #1 + #9 * ( 1 - #1 ) }
+  }
+\cs_new:Npn \__color_parse_gray:w #1 , #2 \q_stop {#1}
+\cs_new:Npn \__color_parse_rgb:w #1 , #2 , #3 , #4 \q_stop { #1 ~ #2 ~ #3 }
+\cs_new:Npn \__color_parse_cmyk:w #1 , #2 , #3 , #4 , #5 \q_stop
+  { #1 ~ #2 ~ #3 ~ #4 }
+\cs_new:Npn \__color_parse_spot:w #1 , #2 \q_stop
+  { \__color_parse_spot_aux:w #1 ! 100 ! \q_stop }
+\cs_new:Npn \__color_parse_spot_aux:w #1 ! #2 ! #3 \q_stop
+  { #1 ~ \fp_eval:n { #2 / 100 } }
+\tl_new:N \l_color_fixed_model_tl
+\cs_new_protected:Npn \__color_select:
+  {
+    \__color_finalise:N \l__color_current_tl
+    \tl_set_eq:cN { l__color_named_ . _tl } \l__color_current_tl
+    \__color_select:V \l__color_current_tl
+  }
+\cs_new_protected:Npn \__color_finalise:N #1
+  {
+    \tl_if_empty:NF \l_color_fixed_model_tl
+      {
+        \exp_after:wN \__color_finalise:w #1 \q_stop
+        \tl_if_eq:NNF \l__color_model_tl \l_color_fixed_model_tl
+          {
+            \__color_convert:VVN \l__color_model_tl \l_color_fixed_model_tl
+              \l__color_value_tl
+          }
+        \tl_set:Nx #1
+          { \l_color_fixed_model_tl \c_space_tl \l__color_value_tl }
+      }
+  }
+\cs_new_protected:Npn \__color_finalise:w #1 ~ #2 \q_stop
+  {
+    \tl_set:Nn \l__color_model_tl {#1}
+    \tl_set:Nn \l__color_value_tl {#2}
+  }
+\cs_new_protected:Npn \color_select:n #1
+  {
+    \color_parse:nN {#1} \l__color_current_tl
+    \__color_select:
+  }
+\cs_new_protected:Npn \color_select:nn #1#2
+  {
+    \__color_direct:nnN {#1} {#2} \l__color_current_tl
+    \__color_select:
+  }
+\cs_new_protected:Npn \__color_direct:nnN #1#2#3
+  {
+    \cs_if_exist:cTF { __color_parse_ #1 :w }
+      {
+        \tl_set:Nx #3
+          { #1 ~ \use:c {  __color_parse_ #1 :w } #2 , 0 , 0 , 0 , 0 \q_stop }
+      }
+      {
+        \__kernel_msg_error:nnn { color } { invalid-model } {#1}
+      }
+  }
+\tl_new:N \l__color_named_tl
+\cs_new_protected:Npn \__color_store:Nn #1#2
+  {
+    \str_if_eq:nnF {#2} { . }
+      {
+        \tl_clear_new:c { l__color_named_ #2 _tl }
+        \tl_set_eq:cN { l__color_named_ #2 _tl } #1
+      }
+  }
+\cs_new_protected:Npn \color_set:nn #1#2
+  {
+    \color_parse:nN {#2} \l__color_named_tl
+    \__color_store:Nn \l__color_named_tl {#1}
+  }
+\cs_new_protected:Npn \color_set:nnn #1#2#3
+  {
+    \__color_direct:nnN {#2} {#3} \l__color_named_tl
+    \__color_store:Nn \l__color_named_tl {#1}
+  }
+\cs_new_protected:Npn \color_set_eq:nn #1#2
+  {
+    \__color_if_defined:nTF {#2}
+      {
+        \tl_clear_new:c { l__color_named_ #1 _tl }
+        \str_if_eq:nnTF {#2} { . }
+          { \tl_set_eq:cN { l__color_named_ #1 _tl } \l__color_current_tl }
+          { \tl_set_eq:cc { l__color_named_ #1 _tl } { l__color_named_ #2 _tl } }
+      }
+      {
+        \__kernel_msg_error:nnn { color } { unknown-color } {#2}
+      }
+  }
+\color_set:nnn { black } { gray } { 0 }
+\color_set:nnn { white } { gray } { 1 }
+\color_set:nnn { cyan }    { cmyk } { 1 , 0 , 0 , 0 }
+\color_set:nnn { magenta } { cmyk } { 0 , 1 , 0 , 0 }
+\color_set:nnn { yellow }  { cmyk } { 0 , 0 , 1 , 0 }
+\color_set:nnn { red }   { rgb } { 1 , 0 , 0 }
+\color_set:nnn { green } { rgb } { 0 , 1 , 0 }
+\color_set:nnn { blue }  { rgb } { 0 , 0 , 1 }
+\tl_new:c { l__color_named_._tl }
+\cs_new_protected:Npn \color_show:n #1
+  {
+    \msg_show:nnxxxx { LaTeX / color } { show }
+      {#1}
+      {
+        \__color_if_defined:nTF {#1}
+          { \exp_last_unbraced:Nv \__color_show:w { l__color_named_ #1 _tl } \q_stop }
+          { }
+      }
+      { }
+      { }
+  }
+\cs_new:Npn \__color_show:w #1 ~ #2 \q_stop
+  {
+    \msg_show_item_unbraced:nn { model } {#1}
+    \exp_args:Nnf \msg_show_item_unbraced:nn { value }
+      { \use:c { __color_show_ #1 :w } #2 \q_stop }
+  }
+\cs_new:Npn \__color_show_gray:w #1 \q_stop { #1 }
+\cs_new:Npn \__color_show_rgb:w #1 ~ #2 ~ #3 \q_stop { #1 ,~ #2 ,~ #3 }
+\cs_new:Npn \__color_show_cmyk:w #1 ~ #2 ~ #3 ~ #4 \q_stop { #1 ,~ #2 ,~ #3 ,~ #4 }
+\__kernel_msg_new:nnnn { color } { invalid-model }
+  { Invalid~color~model~'#1'. }
+  {
+    LaTeX~has~been~asked~to~use~a~color~model~called~'#1',~
+    but~this~model~is~not~set~up.
+  }
+\__kernel_msg_new:nnnn { color } { unknown-color }
+  { Unknown~color~'#1'. }
+  {
+    LaTeX~has~been~asked~to~use~a~color~named~'#1',~
+    but~this~has~never~been~defined.
+  }
+\__kernel_msg_new:nnn { color } { show }
+  {
+    The~color~#1~
+    \tl_if_empty:nTF {#2}
+      { is~undefined. }
+      { has~the~properties: #2 }
+  }
+%% 
+%%
+%% End of file `l3color.sty'.


Property changes on: trunk/Master/texmf-dist/tex/latex/l3experimental/l3color/l3color.sty
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty	2018-02-23 21:54:14 UTC (rev 46720)
@@ -0,0 +1,1347 @@
+%%
+%% This is file `l3draw.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% l3draw.dtx  (with options: `package')
+%% l3draw-paths.dtx  (with options: `package')
+%% l3draw-points.dtx  (with options: `package')
+%% l3draw-scopes.dtx  (with options: `package')
+%% l3draw-softpath.dtx  (with options: `package')
+%% l3draw-state.dtx  (with options: `package')
+%% l3draw-transforms.dtx  (with options: `package')
+%% 
+%% Copyright (C) 2018 The LaTeX3 Project
+%% 
+%% It may be distributed and/or modified under the conditions of
+%% the LaTeX Project Public License (LPPL), either version 1.3c of
+%% this license or (at your option) any later version.  The latest
+%% version of this license is in the file:
+%% 
+%%    http://www.latex-project.org/lppl.txt
+%% 
+%% This file is part of the "l3experimental bundle" (The Work in LPPL)
+%% and all files in that bundle must be distributed together.
+%% 
+%% File: l3draw.dtx Copyright(C) 2018 The LaTeX3 Project
+\RequirePackage{expl3}
+\ProvidesExplPackage{l3draw}{2018/02/21}{}
+  {L3 Experimental core drawing support}
+\RequirePackage { l3color }
+%% File: l3draw-paths.dtx Copyright(C) 2018 The LaTeX3 Project
+\tl_new:N \l__draw_path_tmp_tl
+\fp_new:N \l__draw_path_tmpa_fp
+\fp_new:N \l__draw_path_tmpb_fp
+\dim_new:N \g__draw_path_lastx_dim
+\dim_new:N \g__draw_path_lasty_dim
+\dim_new:N \g__draw_path_xmax_dim
+\dim_new:N \g__draw_path_xmin_dim
+\dim_new:N \g__draw_path_ymax_dim
+\dim_new:N \g__draw_path_ymin_dim
+\cs_new_protected:Npn \__draw_path_update_limits:nn #1#2
+  {
+    \dim_gset:Nn \g__draw_path_xmax_dim
+      { \dim_max:nn \g__draw_path_xmax_dim {#1} }
+    \dim_gset:Nn \g__draw_path_xmin_dim
+      { \dim_min:nn \g__draw_path_xmin_dim {#1} }
+    \dim_gset:Nn \g__draw_path_ymax_dim
+      { \dim_max:nn \g__draw_path_ymax_dim {#2} }
+    \dim_gset:Nn \g__draw_path_ymin_dim
+      { \dim_min:nn \g__draw_path_ymin_dim {#2} }
+    \bool_if:NT \l__draw_update_bb_bool
+      {
+        \dim_gset:Nn \g__draw_xmax_dim
+          { \dim_max:nn \g__draw_xmax_dim {#1} }
+        \dim_gset:Nn \g__draw_xmin_dim
+          { \dim_min:nn \g__draw_xmin_dim {#1} }
+        \dim_gset:Nn \g__draw_ymax_dim
+          { \dim_max:nn \g__draw_ymax_dim {#2} }
+        \dim_gset:Nn \g__draw_ymin_dim
+          { \dim_min:nn \g__draw_ymin_dim {#2} }
+      }
+  }
+\cs_new_protected:Npn \__draw_path_reset_limits:
+  {
+    \dim_gset:Nn \g__draw_path_xmax_dim { -\c_max_dim }
+    \dim_gset:Nn \g__draw_path_xmin_dim {  \c_max_dim }
+    \dim_gset:Nn \g__draw_path_ymax_dim { -\c_max_dim }
+    \dim_gset:Nn \g__draw_path_ymin_dim {  \c_max_dim }
+  }
+\cs_new_protected:Npn \__draw_path_update_last:nn #1#2
+  {
+    \dim_gset:Nn \g__draw_path_lastx_dim {#1}
+    \dim_gset:Nn \g__draw_path_lasty_dim {#2}
+  }
+\dim_new:N \l__draw_corner_xarc_dim
+\dim_new:N \l__draw_corner_yarc_dim
+\bool_new:N \l__draw_corner_arc_bool
+\cs_new_protected:Npn \draw_path_corner_arc:n #1
+  {
+    \__draw_point_process:nn { \__draw_path_corner_arc:nn } {#1}
+  }
+\cs_new_protected:Npn \__draw_path_corner_arc:nn #1#2
+  {
+    \dim_set:Nn \l__draw_corner_xarc_dim {#1}
+    \dim_set:Nn \l__draw_corner_yarc_dim {#2}
+    \bool_lazy_and:nnTF
+      { \dim_compare_p:nNn \l__draw_corner_xarc_dim = { 0pt } }
+      { \dim_compare_p:nNn \l__draw_corner_yarc_dim = { 0pt } }
+      { \bool_set_false:N \l__draw_corner_arc_bool }
+      { \bool_set_true:N \l__draw_corner_arc_bool }
+  }
+\cs_new_protected:Npn \__draw_path_mark_corner:
+  {
+    \bool_if:NT \l__draw_corner_arc_bool
+      {
+        \__draw_softpath_roundpoint:VV
+          \l__draw_corner_xarc_dim
+          \l__draw_corner_yarc_dim
+      }
+  }
+\cs_new_protected:Npn \draw_path_moveto:n #1
+  {
+    \__draw_point_process:nn
+      { \__draw_path_moveto:nn }
+      { \draw_point_transform:n {#1} }
+  }
+\cs_new_protected:Npn \__draw_path_moveto:nn #1#2
+  {
+     \__draw_path_update_limits:nn {#1} {#2}
+     \__draw_softpath_moveto:nn {#1} {#2}
+     \__draw_path_update_last:nn {#1} {#2}
+  }
+\cs_new_protected:Npn \draw_path_lineto:n #1
+  {
+    \__draw_point_process:nn
+      { \__draw_path_lineto:nn }
+      { \draw_point_transform:n {#1} }
+  }
+\cs_new_protected:Npn \__draw_path_lineto:nn #1#2
+  {
+     \__draw_path_mark_corner:
+     \__draw_path_update_limits:nn {#1} {#2}
+     \__draw_softpath_lineto:nn {#1} {#2}
+     \__draw_path_update_last:nn {#1} {#2}
+  }
+\cs_new_protected:Npn \draw_path_curveto:nnn #1#2#3
+  {
+    \__draw_point_process:nnn
+      {
+        \__draw_point_process:nn
+          {
+            \__draw_path_mark_corner:
+            \__draw_path_curveto:nnnnnn
+          }
+          { \draw_point_transform:n {#1} }
+      }
+      { \draw_point_transform:n {#2} }
+      { \draw_point_transform:n {#3} }
+  }
+\cs_new_protected:Npn \__draw_path_curveto:nnnnnn #1#2#3#4#5#6
+  {
+     \__draw_path_update_limits:nn {#1} {#2}
+     \__draw_path_update_limits:nn {#3} {#4}
+     \__draw_path_update_limits:nn {#5} {#6}
+     \__draw_softpath_curveto:nnnnnn {#1} {#2} {#3} {#4} {#5} {#6}
+     \__draw_path_update_last:nn {#5} {#6}
+  }
+\cs_new_protected:Npn \draw_path_close:
+  {
+    \__draw_path_mark_corner:
+    \__draw_softpath_closepath:
+  }
+\cs_new_protected:Npn \draw_path_curveto:nn #1#2
+  {
+    \__draw_point_process:nnn
+      { \__draw_path_curveto:nnnn }
+      { \draw_point_transform:n {#1} }
+      { \draw_point_transform:n {#2} }
+  }
+\cs_new_protected:Npn \__draw_path_curveto:nnnn #1#2#3#4
+  {
+    \fp_set:Nn \l__draw_path_tmpa_fp { \c__draw_path_curveto_b_fp * #1 }
+    \fp_set:Nn \l__draw_path_tmpb_fp { \c__draw_path_curveto_b_fp * #2 }
+    \use:x
+      {
+         \__draw_path_mark_corner:
+         \__draw_path_curveto:nnnnnn
+           {
+             \fp_to_dim:n
+               {
+                   \c__draw_path_curveto_a_fp * \g__draw_path_lastx_dim
+                 + \l__draw_path_tmpa_fp
+               }
+           }
+           {
+             \fp_to_dim:n
+               {
+                   \c__draw_path_curveto_a_fp * \g__draw_path_lasty_dim
+                 + \l__draw_path_tmpb_fp
+               }
+           }
+           {
+             \fp_to_dim:n
+               { \c__draw_path_curveto_a_fp * #3 + \l__draw_path_tmpa_fp }
+           }
+           {
+             \fp_to_dim:n
+               { \c__draw_path_curveto_a_fp * #4 + \l__draw_path_tmpb_fp }
+           }
+           {#3}
+           {#4}
+      }
+  }
+\fp_const:Nn \c__draw_path_curveto_a_fp { 1 / 3 }
+\fp_const:Nn \c__draw_path_curveto_b_fp { 2 / 3 }
+\cs_new_protected:Npn \draw_path_arc:nnn #1#2#3
+  { \draw_path_arc:nnnn {#1} {#2} {#3} {#3} }
+\cs_new_protected:Npn \draw_path_arc:nnnn #1#2#3#4
+  {
+    \use:x
+      {
+        \__draw_path_arc:nnnn
+          { \fp_eval:n {#1} }
+          { \fp_eval:n {#2} }
+          { \fp_to_dim:n {#3} }
+          { \fp_to_dim:n {#4} }
+       }
+  }
+\cs_new_protected:Npn \__draw_path_arc:nnnn #1#2#3#4
+  {
+    \fp_compare:nNnTF {#1} > {#2}
+      { \__draw_path_arc:nnNnn {#1} {#2} - {#3} {#4} }
+      { \__draw_path_arc:nnNnn {#1} {#2} + {#3} {#4} }
+  }
+\cs_new_protected:Npn \__draw_path_arc:nnNnn #1#2#3#4#5
+  {
+    \fp_set:Nn \l__draw_path_arc_start_fp {#1}
+    \fp_set:Nn \l__draw_path_arc_delta_fp { abs( #1 - #2 ) }
+    \fp_while_do:nNnn { \l__draw_path_arc_delta_fp } > { 90 }
+      {
+        \fp_compare:nNnTF \l__draw_path_arc_delta_fp > { 115 }
+          {
+            \__draw_path_arc_auxi:ffnnNnn
+              { \fp_to_decimal:N \l__draw_path_arc_start_fp }
+              { \fp_eval:n { \l__draw_path_arc_start_fp #3 90 } }
+              { 90 } {#2}
+              #3 {#4} {#5}
+          }
+          {
+            \__draw_path_arc_auxi:ffnnNnn
+              { \fp_to_decimal:N \l__draw_path_arc_start_fp }
+              { \fp_eval:n { \l__draw_path_arc_start_fp #3 60 } }
+              { 60 } {#2}
+              #3 {#4} {#5}
+          }
+      }
+    \__draw_path_mark_corner:
+    \__draw_path_arc_auxi:fnfnNnn
+      { \fp_to_decimal:N \l__draw_path_arc_start_fp }
+      {#2}
+      { \fp_eval:n { abs( \l__draw_path_arc_start_fp - #2 ) } }
+      {#2}
+      #3 {#4} {#5}
+  }
+\cs_new_protected:Npn \__draw_path_arc_auxi:nnnnNnn #1#2#3#4#5#6#7
+  {
+    \use:x
+      {
+        \__draw_path_arc_auxii:nnnNnnnn
+          {#1} {#2} {#4} #5 {#6} {#7}
+          {
+            \fp_to_dim:n
+              {
+                \cs_if_exist_use:cF
+                  { c__draw_path_arc_ #3 _fp }
+                  { 4/3 * tand( 0.25 * #3 ) }
+                  * #6
+              }
+          }
+          {
+            \fp_to_dim:n
+              {
+                \cs_if_exist_use:cF
+                  { c__draw_path_arc_ #3 _fp }
+                  { 4/3 * tand( 0.25 * #3 ) }
+                  * #7
+              }
+          }
+      }
+  }
+\cs_generate_variant:Nn \__draw_path_arc_auxi:nnnnNnn { fnf , ff }
+\cs_new_protected:Npn \__draw_path_arc_auxii:nnnNnnnn #1#2#3#4#5#6#7#8
+  {
+    \tl_clear:N \l__draw_path_tmp_tl
+    \__draw_point_process:nn
+      { \__draw_path_arc_auxiii:nn }
+      {
+        \__draw_point_transform_noshift:n
+          { \draw_point_polar:nnn { #1 #4 90 } {#7} {#8} }
+      }
+    \__draw_point_process:nn
+      {
+        \__draw_point_process:nn
+          { \__draw_path_arc_auxiv:nnnn }
+          {
+            \draw_point_transform:n
+              { \draw_point_polar:nnn {#1} {#5} {#6} }
+          }
+      }
+      {
+        \draw_point_transform:n
+          { \draw_point_polar:nnn {#2} {#5} {#6} }
+      }
+    \__draw_point_process:nn
+      { \__draw_path_arc_auxv:nn }
+      {
+        \__draw_point_transform_noshift:n
+          { \draw_point_polar:nnn { #2 #4 -90 } {#7} {#8} }
+      }
+    \exp_after:wN \__draw_path_curveto:nnnnnn \l__draw_path_tmp_tl
+    \fp_set:Nn \l__draw_path_arc_delta_fp { abs ( #2 - #3 ) }
+    \fp_set:Nn \l__draw_path_arc_start_fp {#2}
+  }
+\cs_new_protected:Npn \__draw_path_arc_auxiii:nn #1#2
+  {
+    \__draw_path_arc_aux_add:nn
+      { \g__draw_path_lastx_dim + #1 }
+      { \g__draw_path_lasty_dim + #2 }
+  }
+\cs_new_protected:Npn \__draw_path_arc_auxiv:nnnn #1#2#3#4
+  {
+    \__draw_path_arc_aux_add:nn
+      { \g__draw_path_lastx_dim - #1 + #3 }
+      { \g__draw_path_lasty_dim - #2 + #4 }
+  }
+\cs_new_protected:Npn \__draw_path_arc_auxv:nn #1#2
+  {
+    \exp_after:wN \__draw_path_arc_auxvi:nn
+      \l__draw_path_tmp_tl {#1} {#2}
+  }
+\cs_new_protected:Npn \__draw_path_arc_auxvi:nn #1#2#3#4#5#6
+  {
+    \tl_set:Nn \l__draw_path_tmp_tl { {#1} {#2} }
+    \__draw_path_arc_aux_add:nn
+      { #5 + #3 }
+      { #6 + #4 }
+    \tl_put_right:Nn \l__draw_path_tmp_tl { {#3} {#4} }
+  }
+\cs_new_protected:Npn \__draw_path_arc_aux_add:nn #1#2
+  {
+    \tl_put_right:Nx \l__draw_path_tmp_tl
+      { { \fp_to_dim:n {#1} } { \fp_to_dim:n {#2} } }
+  }
+\fp_new:N \l__draw_path_arc_delta_fp
+\fp_new:N \l__draw_path_arc_start_fp
+\fp_const:cn { c__draw_path_arc_90_fp } { 4/3 * (sqrt(2) - 1) }
+\fp_const:cn { c__draw_path_arc_60_fp } { 4/3 * tand(15) }
+\cs_new_protected:Npn \draw_path_arc_axes:nnnn #1#2#3#4
+  {
+    \draw_transform_triangle:nnn { 0cm , 0cm } {#3} {#4}
+    \draw_path_arc:nnn {#1} {#2} { 1pt }
+  }
+\cs_new_protected:Npn \draw_path_ellipse:nnn #1#2#3
+  {
+    \__draw_point_process:nnn
+      {
+        \__draw_point_process:nn
+          { \__draw_path_ellipse:nnnnnn }
+          { \draw_point_transform:n {#1} }
+      }
+      { \__draw_point_transform_noshift:n {#2} }
+      { \__draw_point_transform_noshift:n {#3} }
+  }
+\cs_new_protected:Npn \__draw_path_ellipse:nnnnnn #1#2#3#4#5#6
+  {
+    \use:x
+      {
+        \__draw_path_moveto:nn
+          { \fp_to_dim:n { #1 + #3 } } { \fp_to_dim:n { #2 + #4 } }
+        \__draw_path_ellipse_arci:nnnnnn   {#1} {#2} {#3} {#4} {#5} {#6}
+        \__draw_path_ellipse_arcii:nnnnnn  {#1} {#2} {#3} {#4} {#5} {#6}
+        \__draw_path_ellipse_arciii:nnnnnn {#1} {#2} {#3} {#4} {#5} {#6}
+        \__draw_path_ellipse_arciv:nnnnnn  {#1} {#2} {#3} {#4} {#5} {#6}
+      }
+    \__draw_softpath_closepath:
+    \__draw_path_moveto:nn {#1} {#2}
+  }
+\cs_new:Npn \__draw_path_ellipse_arci:nnnnnn #1#2#3#4#5#6
+  {
+    \__draw_path_curveto:nnnnnn
+      { \fp_to_dim:n { #1 + #3 + #5 * \c__draw_path_ellipse_fp } }
+      { \fp_to_dim:n { #2 + #4 + #6 * \c__draw_path_ellipse_fp } }
+      { \fp_to_dim:n { #1 + #3 * \c__draw_path_ellipse_fp + #5 } }
+      { \fp_to_dim:n { #2 + #4 * \c__draw_path_ellipse_fp + #6 } }
+      { \fp_to_dim:n { #1 + #5 } }
+      { \fp_to_dim:n { #2 + #6 } }
+  }
+\cs_new:Npn \__draw_path_ellipse_arcii:nnnnnn #1#2#3#4#5#6
+  {
+    \__draw_path_curveto:nnnnnn
+      { \fp_to_dim:n { #1 - #3 * \c__draw_path_ellipse_fp + #5 } }
+      { \fp_to_dim:n { #2 - #4 * \c__draw_path_ellipse_fp + #6 } }
+      { \fp_to_dim:n { #1 - #3 + #5 * \c__draw_path_ellipse_fp } }
+      { \fp_to_dim:n { #2 - #4 + #6 * \c__draw_path_ellipse_fp } }
+      { \fp_to_dim:n { #1 - #3 } }
+      { \fp_to_dim:n { #2 - #4 } }
+  }
+\cs_new:Npn \__draw_path_ellipse_arciii:nnnnnn #1#2#3#4#5#6
+  {
+    \__draw_path_curveto:nnnnnn
+      { \fp_to_dim:n { #1 - #3 - #5 * \c__draw_path_ellipse_fp } }
+      { \fp_to_dim:n { #2 - #4 - #6 * \c__draw_path_ellipse_fp } }
+      { \fp_to_dim:n { #1 - #3 * \c__draw_path_ellipse_fp - #5 } }
+      { \fp_to_dim:n { #2 - #4 * \c__draw_path_ellipse_fp - #6 } }
+      { \fp_to_dim:n { #1 - #5 } }
+      { \fp_to_dim:n { #2 - #6 } }
+  }
+\cs_new:Npn \__draw_path_ellipse_arciv:nnnnnn #1#2#3#4#5#6
+  {
+    \__draw_path_curveto:nnnnnn
+      { \fp_to_dim:n { #1 + #3 * \c__draw_path_ellipse_fp - #5 } }
+      { \fp_to_dim:n { #2 + #4 * \c__draw_path_ellipse_fp - #6 } }
+      { \fp_to_dim:n { #1 + #3 - #5 * \c__draw_path_ellipse_fp } }
+      { \fp_to_dim:n { #2 + #4 - #6 * \c__draw_path_ellipse_fp } }
+      { \fp_to_dim:n { #1 + #3 } }
+      { \fp_to_dim:n { #2 + #4 } }
+  }
+\fp_const:Nn \c__draw_path_ellipse_fp { \fp_use:c { c__draw_path_arc_90_fp } }
+\cs_new_protected:Npn \draw_path_circle:nn #1#2
+  { \draw_path_ellipse:nnn {#1} { #2 , 0pt } { 0pt , #2 } }
+\cs_new_protected:Npn \draw_path_rectangle:nn #1#2
+  {
+    \__draw_point_process:nnn
+      {
+        \bool_if:NTF \l__draw_corner_arc_bool
+          { \__draw_path_rectangle_rounded:nnnn }
+          { \__draw_path_rectangle:nnnn }
+      }
+      { \draw_point_transform:n {#1} }
+      {#2}
+  }
+\cs_new_protected:Npn \__draw_path_rectangle:nnnn #1#2#3#4
+  {
+    \__draw_path_update_limits:nn {#1} {#2}
+    \__draw_path_update_limits:nn { #1 + #3 } { #2 + #4 }
+    \__draw_softpath_rectangle:nnnn {#1} {#2} {#3} {#4}
+    \__draw_path_update_last:nn {#1} {#2}
+  }
+\cs_new_protected:Npn \__draw_path_rectangle_rounded:nnnn #1#2#3#4
+  {
+    \draw_path_moveto:n { #1 + #3 , #2 + #4 }
+    \draw_path_lineto:n { #1 , #2 + #4 }
+    \draw_path_lineto:n { #1 , #2 }
+    \draw_path_lineto:n { #1 + #3 , #2 }
+    \draw_path_close:
+    \draw_path_moveto:n { #1 , #2 }
+  }
+\cs_new_protected:Npn \draw_path_rectangle_corners:nn #1#2
+  {
+    \__draw_point_process:nnn
+      { \__draw_path_rectangle_corners:nnnnn {#1} }
+      {#1} {#2}
+  }
+\cs_new_protected:Npn \__draw_path_rectangle_corners:nnnnn #1#2#3#4#5
+  { \draw_path_rectangle:nn {#1} { #4 - #2 , #5 - #3 } }
+\cs_new_protected:Npn \draw_path_grid:nnnn #1#2#3#4
+  {
+    \__draw_point_process:nnn
+      { \__draw_path_grid:nnnnnn {#1} {#2} }
+      {#3} {#4}
+  }
+\cs_new_protected:Npn \__draw_path_grid:nnnnnn #1#2#3#4#5#6
+  {
+    \dim_step_inline:nnnn
+      {#3} { \dim_compare:nNnF {#3} < {#5} { - } \dim_abs:n {#1} } {#5}
+      {
+        \draw_path_moveto:n { ##1 , #4 }
+        \draw_path_lineto:n { ##1 , #6 }
+      }
+    \dim_step_inline:nnnn
+      {#4} { \dim_compare:nNnF {#4} < {#6} { - } \dim_abs:n {#2} } {#6}
+      {
+        \draw_path_moveto:n { #3 , ##1 }
+        \draw_path_lineto:n { #5 , ##1 }
+      }
+  }
+\bool_new:N \l__draw_path_use_clip_bool
+\bool_new:N \l__draw_path_use_fill_bool
+\bool_new:N \l__draw_path_use_stroke_bool
+\bool_new:N \l__draw_path_use_bb_bool
+\bool_new:N \l__draw_path_use_clear_bool
+\cs_new_protected:Npn \draw_path_use:n #1
+  {
+    \tl_if_blank:nF {#1}
+      { \__draw_path_use:n {#1} }
+  }
+\cs_new_protected:Npn \draw_path_use_clear:n #1
+  {
+    \bool_lazy_or:nnTF
+      { \tl_if_blank_p:n {#1} }
+      { \str_if_eq_p:nn {#1} { clear } }
+      {
+        \__draw_softpath_clear:
+        \__draw_path_reset_limits:
+      }
+      { \__draw_path_use:n { #1 , clear } }
+   }
+\cs_new_protected:Npn \__draw_path_use:n #1
+  {
+    \bool_set_false:N \l__draw_path_use_clip_bool
+    \bool_set_false:N \l__draw_path_use_fill_bool
+    \bool_set_false:N \l__draw_path_use_stroke_bool
+    \clist_map_inline:nn {#1}
+      {
+        \cs_if_exist:cTF { l__draw_path_use_ ##1 _ bool }
+          { \bool_set_true:c { l__draw_path_use_ ##1 _ bool } }
+          {
+            \cs_if_exist_use:cF { __draw_path_use_action_ ##1 : }
+              { \ERROR }
+          }
+      }
+    \bool_lazy_and:nnT
+      { \l__draw_update_bb_bool }
+      { \l__draw_path_use_stroke_bool }
+      { \__draw_path_use_stroke_bb: }
+    \bool_if:NTF \l__draw_path_use_clear_bool
+      { \__draw_softpath_use_clear: }
+      { \__draw_softpath_use: }
+    \bool_if:NT \l__draw_path_use_clip_bool
+      { \driver_draw_clip: }
+    \bool_lazy_or:nnT
+      { \l__draw_path_use_fill_bool }
+      { \l__draw_path_use_stroke_bool }
+      {
+        \use:c
+          {
+            driver_draw_
+            \bool_if:NT \l__draw_path_use_fill_bool { fill }
+            \bool_if:NT \l__draw_path_use_stroke_bool { stroke }
+            :
+          }
+      }
+  }
+\cs_new_protected:Npn \__draw_path_use_action_draw:
+  {
+    \bool_set_true:N \l__draw_path_use_stroke_bool
+  }
+\cs_new_protected:Npn \__draw_path_use_stroke_bb:
+  {
+    \__draw_path_use_stroke_bb_aux:NnN x { max } +
+    \__draw_path_use_stroke_bb_aux:NnN y { max } +
+    \__draw_path_use_stroke_bb_aux:NnN x { min } -
+    \__draw_path_use_stroke_bb_aux:NnN y { min } -
+  }
+\cs_new_protected:Npn \__draw_path_use_stroke_bb_aux:NnN #1#2#3
+  {
+    \dim_compare:nNnF { \dim_use:c { g__draw_ #1#2 _dim } } = { #3 -\c_max_dim }
+      {
+        \dim_gset:cn { g__draw_ #1#2 _dim }
+          {
+            \use:c { dim_ #2 :nn }
+              { \dim_use:c { g__draw_ #1#2 _dim } }
+              {
+                  \dim_use:c { g__draw_path_ #1#2 _dim }
+                #3 0.5 \g__draw_linewidth_dim
+              }
+          }
+      }
+  }
+%% File: l3draw-points.dtx Copyright(C) 2018 The LaTeX3 Project
+\cs_new:Npn \__draw_point_process:nn #1#2
+  {
+    \__draw_point_process_auxi:fn
+      { \__draw_point_to_dim:n {#2} }
+      {#1}
+  }
+\cs_new:Npn \__draw_point_process_auxi:nn #1#2
+  { \__draw_point_process_auxii:nw {#2} #1 \q_stop }
+\cs_generate_variant:Nn \__draw_point_process_auxi:nn { f }
+\cs_new:Npn \__draw_point_process_auxii:nw #1 #2 , #3 \q_stop
+  { #1 {#2} {#3} }
+\cs_new:Npn \__draw_point_process:nnn #1#2#3
+  {
+    \__draw_point_process_auxiii:ffn
+      { \__draw_point_to_dim:n {#2} }
+      { \__draw_point_to_dim:n {#3} }
+      {#1}
+  }
+\cs_new:Npn \__draw_point_process_auxiii:nnn #1#2#3
+  { \__draw_point_process_auxiv:nw {#3} #1 \q_mark #2 \q_stop }
+\cs_generate_variant:Nn \__draw_point_process_auxiii:nnn { ff }
+\cs_new:Npn \__draw_point_process_auxiv:nw #1 #2 , #3 \q_mark #4 , #5 \q_stop
+  { #1 {#2} {#3} {#4} {#5} }
+\cs_new:Npn \__draw_point_to_dim:n #1
+  { \__draw_point_to_dim_aux:f { \fp_eval:n {#1} } }
+\cs_new:Npn \__draw_point_to_dim_aux:n #1
+  { \__draw_point_to_dim_aux:w #1 }
+\cs_generate_variant:Nn \__draw_point_to_dim_aux:n { f }
+\cs_new:Npn \__draw_point_to_dim_aux:w ( #1 , ~ #2 ) { #1pt , #2pt }
+\cs_new:Npn \draw_point:nn #1#2
+  { \__draw_point_to_dim:n { #1 , #2 } }
+\cs_new:Npn \draw_point_polar:nn #1#2
+  { \draw_point_polar:nnn {#1} {#2} {#2} }
+\cs_new:Npn \draw_point_polar:nnn #1#2#3
+  { \__draw_draw_polar:fnn { \fp_eval:n {#1} } {#2} {#3} }
+\cs_new:Npn \__draw_draw_polar:nnn #1#2#3
+  { \__draw_point_to_dim:n { cosd(#1) * (#2) , sind(#1) * (#3) } }
+\cs_generate_variant:Nn \__draw_draw_polar:nnn { f }
+\cs_new:Npn \draw_point_add:nn #1#2
+  { \__draw_point_to_dim:n { (#1) + (#2) } }
+\cs_new:Npn \draw_point_diff:nn #1#2
+  { \__draw_point_to_dim:n { (#2) - (#1) } }
+\cs_new:Npn \draw_point_scale:nn #1#2
+  { \__draw_point_to_dim:n { #1 * (#2) } }
+\cs_new:Npn \draw_point_unit_vector:n #1
+  { \__draw_point_process:nn { \__draw_point_unit_vector:nn } {#1} }
+\cs_new:Npn \__draw_point_unit_vector:nn #1#2
+  {
+    \__draw_point_to_dim:n
+      { ( #1 , #2 ) / (sqrt(#1 * #1 + #2 * #2)) }
+  }
+\cs_new:Npn \draw_point_intersect_lines:nnnn #1#2#3#4
+  {
+    \__draw_point_process:nnn
+      {
+        \__draw_point_process:nnn
+          { \__draw_point_intersect_lines:nnnnnnnn } {#3} {#4}
+      }
+      {#1} {#2}
+  }
+\cs_new:Npn \__draw_point_intersect_lines:nnnnnnnn #1#2#3#4#5#6#7#8
+  {
+    \__draw_point_intersect_lines_aux:ffffff
+      { \fp_eval:n { #1 * #4 - #2 * #3 } }
+      { \fp_eval:n { #5 * #8 - #6 * #7 } }
+      { \fp_eval:n { #1 - #3 } }
+      { \fp_eval:n { #5 - #7 } }
+      { \fp_eval:n { #2 - #4 } }
+      { \fp_eval:n { #6 - #8 } }
+  }
+\cs_new:Npn \__draw_point_intersect_lines_aux:nnnnnn #1#2#3#4#5#6
+  {
+    \__draw_point_to_dim:n
+      {
+        ( #2 * #3 - #1 * #4 , #2 * #5 - #1 * #6 )
+          / ( #4 * #5 - #6 * #3 )
+      }
+  }
+\cs_generate_variant:Nn \__draw_point_intersect_lines_aux:nnnnnn { ffffff }
+\cs_new:Npn \draw_point_intersect_circles:nnnnn #1#2#3#4#5
+  {
+    \__draw_point_process:nnn
+      { \__draw_point_intersect_circles_auxi:nnnnnnn {#2} {#4} {#5} }
+      {#1} {#3}
+  }
+\cs_new:Npn \__draw_point_intersect_circles_auxi:nnnnnnn #1#2#3#4#5#6#7
+  {
+    \__draw_point_intersect_circles_auxii:ffnnnnn
+      { \fp_eval:n {#1} } { \fp_eval:n {#2} } {#4} {#5} {#6} {#7} {#3}
+  }
+\cs_new:Npn \__draw_point_intersect_circles_auxii:nnnnnnn #1#2#3#4#5#6#7
+  {
+    \__draw_point_intersect_circles_auxiii:ffnnnnn
+      { \fp_eval:n { #5 - #3 } }
+      { \fp_eval:n { #6 - #4 } }
+      {#1} {#2} {#3} {#4} {#7}
+  }
+\cs_generate_variant:Nn \__draw_point_intersect_circles_auxii:nnnnnnn { ff }
+\cs_new:Npn \__draw_point_intersect_circles_auxiii:nnnnnnn #1#2#3#4#5#6#7
+  {
+    \__draw_point_intersect_circles_auxiv:fnnnnnnn
+      { \fp_eval:n { sqrt( #1 * #1 + #2 * #2 ) } }
+      {#1} {#2} {#3} {#4} {#5} {#6} {#7}
+  }
+\cs_generate_variant:Nn \__draw_point_intersect_circles_auxiii:nnnnnnn { ff }
+\cs_new:Npn \__draw_point_intersect_circles_auxiv:nnnnnnnn #1#2#3#4#5#6#7#8
+  {
+    \__draw_point_intersect_circles_auxv:ffnnnnnnn
+      { \fp_eval:n { 1 / #1 } }
+      { \fp_eval:n { #4 * #4 } }
+      {#1} {#2} {#3} {#5} {#6} {#7} {#8}
+  }
+\cs_generate_variant:Nn \__draw_point_intersect_circles_auxiv:nnnnnnnn { f }
+\cs_new:Npn \__draw_point_intersect_circles_auxv:nnnnnnnnn #1#2#3#4#5#6#7#8#9
+  {
+    \__draw_point_intersect_circles_auxvi:fnnnnnnn
+      { \fp_eval:n { 0.5 * #1 * ( #2 + #3 * #3 - #6 * #6 ) } }
+      {#1} {#2} {#4} {#5} {#7} {#8} {#9}
+  }
+\cs_generate_variant:Nn \__draw_point_intersect_circles_auxv:nnnnnnnnn { ff }
+\cs_new:Npn \__draw_point_intersect_circles_auxvi:nnnnnnnn #1#2#3#4#5#6#7#8
+  {
+    \__draw_point_intersect_circles_auxvii:fffnnnn
+      { \fp_eval:n { #1 * #2 } }
+      { \int_if_odd:nTF {#8} { 1 } { -1 } }
+      { \fp_eval:n { sqrt ( #3 - #1 * #1 ) * #2 } }
+      {#4} {#5} {#6} {#7}
+  }
+\cs_generate_variant:Nn \__draw_point_intersect_circles_auxvi:nnnnnnnn { f }
+\cs_new:Npn \__draw_point_intersect_circles_auxvii:nnnnnnn #1#2#3#4#5#6#7
+  {
+    \__draw_point_to_dim:n
+      { #6 + #4 * #1 + #2 * #3 * #5 , #7 + #5 * #1 + -1 * #2 * #3 * #4 }
+  }
+\cs_generate_variant:Nn \__draw_point_intersect_circles_auxvii:nnnnnnn { fff }
+\cs_new:Npn \draw_point_interpolate_line:nnn #1#2#3
+  {
+    \__draw_point_process:nnn
+      { \__draw_point_interpolate_line_aux:fnnnn { \fp_eval:n {#1} } }
+      {#2} {#3}
+  }
+\cs_new:Npn \__draw_point_interpolate_line_aux:nnnnn #1#2#3#4#5
+  {
+    \__draw_point_interpolate_line_aux:fnnnnn { \fp_eval:n { 1 - #1 } }
+      {#1} {#2} {#3} {#4} {#5}
+  }
+\cs_generate_variant:Nn \__draw_point_interpolate_line_aux:nnnnn { f }
+\cs_new:Npn \__draw_point_interpolate_line_aux:nnnnnn #1#2#3#4#5#6
+  { \__draw_point_to_dim:n { #2 * #3 + #1 * #5 , #2 * #4 + #1 * #6 } }
+\cs_generate_variant:Nn \__draw_point_interpolate_line_aux:nnnnnn { f }
+\cs_new:Npn \draw_point_interpolate_distance:nnn #1#2#3
+  {
+    \__draw_point_process:nnn
+      { \__draw_point_interpolate_distance:nnnnn {#1} }
+      {#2} {#3}
+  }
+\cs_new:Npn \__draw_point_interpolate_distance:nnnnn #1#2#3#4#5
+  {
+    \__draw_point_interpolate_distance_aux:nnnnnnn
+      { \fp_eval:n { #4 - #2 } }
+      { \fp_eval:n { #5 - #3 } }
+      {#2} {#3} {#4} {#5} {#1}
+  }
+\cs_new:Npn \__draw_point_interpolate_distance_aux:nnnnnnn #1#2#3#4#5#6#7
+  {
+    \__draw_point_interpolate_distance_aux:fnnnn
+      { \fp_eval:n { (#7) / (sqrt ( #1 * #1 + #2 * #2 )) } }
+      {#3} {#4} {#5} {#6}
+  }
+\cs_generate_variant:Nn \__draw_point_interpolate_distance_aux:nnnnnnn { ff }
+\cs_new:Npn \__draw_point_interpolate_distance_aux:nnnnn #1#2#3#4#5
+  { \__draw_point_to_dim:n { #2 + #1 * #4 , #3 + #1 * #5 } }
+\cs_generate_variant:Nn \__draw_point_interpolate_distance_aux:nnnnn { f }
+\cs_new:Npn \draw_point_interpolate_arcaxes:nnnnnn #1#2#3#4#5#6
+  {
+    \__draw_point_process:nnn
+      {
+        \__draw_point_process:nn
+          { \__draw_point_interpolate_arcaxes_auxi:nnnnnnnnn {#1} {#5} {#6} }
+          {#4}
+      }
+      {#2} {#3}
+  }
+\cs_new:Npn \__draw_point_interpolate_arcaxes_auxi:nnnnnnnnn #1#2#3#4#5#6#7#8#9
+  {
+    \__draw_point_interpolate_arcaxes_auxii:fnnnnnnnn
+      { \fp_eval:n {#1} } {#2} {#3} {#6} {#7} {#8} {#9} {#4} {#5}
+  }
+\cs_new:Npn \__draw_point_interpolate_arcaxes_auxii:nnnnnnnnn #1#2#3#4#5#6#7#8#9
+  {
+    \__draw_point_interpolate_arcaxes_auxiii:fnnnnnn
+      { \fp_eval:n { #1 * (#3) + ( 1 - #1 ) * (#2) } }
+      {#4} {#5} {#6} {#7} {#8} {#9}
+  }
+\cs_generate_variant:Nn \__draw_point_interpolate_arcaxes_auxii:nnnnnnnnn { f }
+\cs_new:Npn \__draw_point_interpolate_arcaxes_auxiii:nnnnnnn #1#2#3#4#5#6#7
+  {
+    \__draw_point_interpolate_arcaxes_auxiv:ffnnnnnn
+      { \fp_eval:n { cosd (#1) } }
+      { \fp_eval:n { sind (#1) } }
+      {#2} {#3} {#4} {#5} {#6} {#7}
+  }
+\cs_generate_variant:Nn \__draw_point_interpolate_arcaxes_auxiii:nnnnnnn { f }
+\cs_new:Npn \__draw_point_interpolate_arcaxes_auxiv:nnnnnnnn #1#2#3#4#5#6#7#8
+  {
+    \__draw_point_to_dim:n
+      { #3 + #1 * #5 + #2 * #7 , #4 + #1 * #6 + #2 * #8 }
+  }
+\cs_generate_variant:Nn \__draw_point_interpolate_arcaxes_auxiv:nnnnnnnn { ff }
+\cs_new:Npn \draw_point_interpolate_curve:nnnnnn #1#2#3#4#5
+  {
+    \__draw_point_process:nnn
+      {
+        \__draw_point_process:nnn
+          { \__draw_point_interpolate_curve_auxi:nnnnnnnnn {#1} }
+          {#4} {#5}
+      }
+      {#2} {#3}
+  }
+\cs_new:Npn \__draw_point_interpolate_curve_auxi:nnnnnnnnn #1#2#3#4#5#6#7#8#9
+  {
+    \__draw_point_interpolate_curve_auxii:fnnnnnnnn
+      { \fp_eval:n {#1} }
+      {#6} {#7} {#8} {#9} {#2} {#3} {#4} {#5}
+  }
+\cs_new:Npn \__draw_point_interpolate_curve_auxii:nnnnnnnnn
+  #1#2#3#4#5#6#7#8#9
+  {
+    \__draw_point_interpolate_curve_auxiii:fnnnnn
+      { \fp_eval:n { 1 - #1 } }
+      {#1}
+      { {#2} {#3} } { {#4} {#5} } { {#6} {#7} } { {#8} {#9} }
+  }
+\cs_generate_variant:Nn \__draw_point_interpolate_curve_auxii:nnnnnnnnn { f }
+\cs_new:Npn \__draw_point_interpolate_curve_auxiii:nnnnnn #1#2#3#4#5#6
+  {
+    \__draw_point_interpolate_curve_auxiv:nnnnnn {#1} {#2} #3 #4
+    \__draw_point_interpolate_curve_auxiv:nnnnnn {#1} {#2} #4 #5
+    \__draw_point_interpolate_curve_auxiv:nnnnnn {#1} {#2} #5 #6
+    \prg_do_nothing:
+    \__draw_point_interpolate_curve_auxvi:n { {#1} {#2} }
+  }
+\cs_generate_variant:Nn \__draw_point_interpolate_curve_auxiii:nnnnnn { f }
+\cs_new:Npn \__draw_point_interpolate_curve_auxiv:nnnnnn #1#2#3#4#5#6
+  {
+    \__draw_point_interpolate_curve_auxv:ffw
+      { \fp_eval:n { #1 * #3 + #2 * #5 } }
+      { \fp_eval:n { #1 * #4 + #2 * #6 } }
+  }
+\cs_new:Npn \__draw_point_interpolate_curve_auxv:nnw
+  #1#2#3 \prg_do_nothing: #4#5
+  {
+    #3
+    \prg_do_nothing:
+    #4 { #5 {#1} {#2} }
+  }
+\cs_generate_variant:Nn \__draw_point_interpolate_curve_auxv:nnw { ff }
+\cs_new:Npn \__draw_point_interpolate_curve_auxvi:n #1
+  { \__draw_point_interpolate_curve_auxvii:nnnnnnnn #1 }
+\cs_new:Npn \__draw_point_interpolate_curve_auxvii:nnnnnnnn #1#2#3#4#5#6#7#8
+  {
+    \__draw_point_interpolate_curve_auxviii:ffffnn
+      { \fp_eval:n { #1 * #5 + #2 * #3 } }
+      { \fp_eval:n { #1 * #6 + #2 * #4 } }
+      { \fp_eval:n { #1 * #7 + #2 * #5 } }
+      { \fp_eval:n { #1 * #8 + #2 * #6 } }
+      {#1} {#2}
+  }
+\cs_new:Npn \__draw_point_interpolate_curve_auxviii:nnnnnn #1#2#3#4#5#6
+  {
+    \__draw_point_to_dim:n
+      { #5 * #3 + #6 * #1 , #5 * #4 + #6 * #2 }
+  }
+\cs_generate_variant:Nn \__draw_point_interpolate_curve_auxviii:nnnnnn { ffff }
+\dim_new:N \l__draw_xvec_x_dim
+\dim_new:N \l__draw_xvec_y_dim
+\dim_new:N \l__draw_yvec_x_dim
+\dim_new:N \l__draw_yvec_y_dim
+\dim_new:N \l__draw_zvec_x_dim
+\dim_new:N \l__draw_zvec_y_dim
+\cs_new_protected:Npn \draw_xvec:n #1
+  { \__draw_vec:nn { x } {#1} }
+\cs_new_protected:Npn \draw_yvec:n #1
+  { \__draw_vec:nn { y } {#1} }
+\cs_new_protected:Npn \draw_zvec:n #1
+  { \__draw_vec:nn { z } {#1} }
+\cs_new_protected:Npn \__draw_vec:nn #1#2
+  {
+    \__draw_point_process:nn { \__draw_vec:nnn {#1} } {#2}
+  }
+\cs_new_protected:Npn \__draw_vec:nnn #1#2#3
+  {
+    \dim_set:cn { l__draw_ #1 vec_x_dim } {#2}
+    \dim_set:cn { l__draw_ #1 vec_y_dim } {#3}
+  }
+\draw_xvec:n { 1cm , 0cm }
+\draw_yvec:n { 0cm , 1cm }
+\draw_zvec:n { -0.385cm , -0.385cm }
+\cs_new:Npn \draw_point_vec:nn #1#2
+  { \__draw_point_vec:ff { \fp_eval:n {#1} } { \fp_eval:n {#2} } }
+\cs_new:Npn \__draw_point_vec:nn #1#2
+  {
+    \__draw_point_to_dim:n
+      {
+        #1 * \l__draw_xvec_x_dim + #2 * \l__draw_yvec_x_dim ,
+        #1 * \l__draw_xvec_y_dim + #2 * \l__draw_yvec_y_dim
+      }
+  }
+\cs_generate_variant:Nn \__draw_point_vec:nn { ff }
+\cs_new:Npn \draw_point_vec:nnn #1#2#3
+  {
+    \__draw_point_vec:fff
+      { \fp_eval:n {#1} } { \fp_eval:n {#2} } { \fp_eval:n {#3} }
+  }
+\cs_new:Npn \__draw_point_vec:nnn #1#2#3
+  {
+    \__draw_point_to_dim:n
+      {
+             #1 * \l__draw_xvec_x_dim
+           + #2 * \l__draw_yvec_x_dim
+           + #3 * \l__draw_zvec_x_dim
+        ,
+            #1 * \l__draw_xvec_y_dim
+          + #2 * \l__draw_yvec_y_dim
+          + #3 * \l__draw_zvec_y_dim
+    }
+  }
+\cs_generate_variant:Nn \__draw_point_vec:nnn { fff }
+\cs_new:Npn \draw_point_vec_polar:nn #1#2
+  { \draw_point_vec_polar:nnn {#1} {#2} {#2} }
+\cs_new:Npn \draw_point_vec_polar:nnn #1#2#3
+  { \__draw_draw_vec_polar:fnn { \fp_eval:n {#1} } {#2} {#3} }
+\cs_new:Npn \__draw_draw_vec_polar:nnn #1#2#3
+  {
+    \__draw_point_to_dim:n
+      {
+        cosd(#1) * (#2) * \l__draw_xvec_x_dim ,
+        sind(#1) * (#3) * \l__draw_yvec_y_dim
+     }
+  }
+\cs_generate_variant:Nn \__draw_draw_vec_polar:nnn { f }
+\cs_new:Npn \draw_point_transform:n #1
+  {
+    \__draw_point_process:nn
+      { \__draw_point_transform:nn } {#1}
+  }
+\cs_new:Npn \__draw_point_transform:nn #1#2
+  {
+    \bool_if:NTF \l__draw_transformcm_active_bool
+      {
+        \__draw_point_to_dim:n
+          {
+            (
+                \l__draw_transformcm_aa_fp * #1
+              + \l__draw_transformcm_ba_fp * #2
+              + \l__draw_transformcm_xshift_dim
+            )
+            ,
+            (
+                \l__draw_transformcm_ab_fp * #1
+              + \l__draw_transformcm_bb_fp * #2
+              + \l__draw_transformcm_yshift_dim
+            )
+        }
+      }
+      {
+        \__draw_point_to_dim:n
+          {
+              (#1, #2)
+            + ( \l__draw_transformcm_xshift_dim ,
+                \l__draw_transformcm_yshift_dim )
+          }
+      }
+  }
+\cs_new:Npn \__draw_point_transform_noshift:n #1
+  {
+    \__draw_point_process:nn
+      { \__draw_point_transform_noshift:nn } {#1}
+  }
+\cs_new:Npn \__draw_point_transform_noshift:nn #1#2
+  {
+    \bool_if:NTF \l__draw_transformcm_active_bool
+      {
+        \__draw_point_to_dim:n
+          {
+            (
+                \l__draw_transformcm_aa_fp * #1
+              + \l__draw_transformcm_ba_fp * #2
+            )
+            ,
+            (
+                \l__draw_transformcm_ab_fp * #1
+              + \l__draw_transformcm_bb_fp * #2
+            )
+        }
+      }
+      { \__draw_point_to_dim:n { (#1, #2) } }
+  }
+%% File: l3draw-scopes.dtx Copyright(C) 2018 The LaTeX3 Project
+\dim_new:N \g__draw_xmax_dim
+\dim_new:N \g__draw_xmin_dim
+\dim_new:N \g__draw_ymax_dim
+\dim_new:N \g__draw_ymin_dim
+\bool_new:N \l__draw_update_bb_bool
+\box_new:N \l__draw_main_box
+\cs_new_protected:Npn \draw_begin:
+  {
+    \vbox_set:Nw \l__draw_main_box
+      \driver_draw_begin:
+      \dim_gset:Nn \g__draw_xmax_dim { -\c_max_dim }
+      \dim_gset:Nn \g__draw_xmin_dim {  \c_max_dim }
+      \dim_gset:Nn \g__draw_ymax_dim { -\c_max_dim }
+      \dim_gset:Nn \g__draw_ymin_dim {  \c_max_dim }
+      \bool_set_true:N \l__draw_update_bb_bool
+      \draw_transform_reset:
+      \draw_linewidth:n { \l_draw_default_linewidth_dim }
+  }
+\cs_new_protected:Npn \draw_end:
+  {
+      \driver_draw_end:
+    \vbox_set_end:
+    \hbox_set:Nn \l__draw_main_box
+      {
+        \skip_horizontal:n { -\g__draw_xmin_dim }
+        \box_move_down:nn { \g__draw_ymin_dim }
+          { \box_use_drop:N \l__draw_main_box }
+      }
+    \box_set_ht:Nn \l__draw_main_box
+      { \g__draw_ymax_dim - \g__draw_ymin_dim }
+    \box_set_dp:Nn \l__draw_main_box { 0pt }
+    \box_set_wd:Nn \l__draw_main_box
+      { \g__draw_xmax_dim - \g__draw_xmin_dim }
+    \mode_leave_vertical:
+    \box_use_drop:N \l__draw_main_box
+  }
+%% File: l3draw-softpath.dtx Copyright(C) 2018 The LaTeX3 Project
+\tl_new:N \g__draw_softpath_main_tl
+\tl_new:N \g__draw_softpath_buffer_a_tl
+\tl_new:N \g__draw_softpath_buffer_b_tl
+\int_new:N \g__draw_softpath_buffer_a_int
+\int_new:N \g__draw_softpath_buffer_b_int
+\cs_new_protected:Npn \__draw_softpath_add:n #1
+  {
+    \int_compare:nNnTF \g__draw_softpath_buffer_a_int < { 40 }
+      {
+        \int_gincr:N \g__draw_softpath_buffer_a_int
+        \tl_gput_right:Nn \g__draw_softpath_buffer_a_tl {#1}
+      }
+      {
+        \int_compare:nNnTF \g__draw_softpath_buffer_b_int < { 40 }
+          {
+            \int_gincr:N \g__draw_softpath_buffer_b_int
+            \tl_gset:Nx \g__draw_softpath_buffer_b_tl
+              {
+                \exp_not:V \g__draw_softpath_buffer_b_tl
+                \exp_not:V \g__draw_softpath_buffer_a_tl
+                \exp_not:n {#1}
+              }
+            \int_gzero:N \g__draw_softpath_buffer_a_int
+            \tl_gclear:N \g__draw_softpath_buffer_a_tl
+          }
+          { \__draw_softpath_concat:n {#1} }
+      }
+  }
+\cs_generate_variant:Nn \__draw_softpath_add:n { x }
+\cs_new_protected:Npn \__draw_softpath_concat:n #1
+  {
+    \tl_gset:Nx \g__draw_softpath_main_tl
+      {
+        \exp_not:V \g__draw_softpath_main_tl
+        \exp_not:V \g__draw_softpath_buffer_b_tl
+        \exp_not:V \g__draw_softpath_buffer_a_tl
+        \exp_not:n {#1}
+      }
+    \__draw_softpath_reset_buffers:
+  }
+\cs_new_protected:Npn \__draw_softpath_reset_buffers:
+  {
+    \int_gzero:N \g__draw_softpath_buffer_a_int
+    \tl_gclear:N \g__draw_softpath_buffer_a_tl
+    \int_gzero:N \g__draw_softpath_buffer_b_int
+    \tl_gclear:N \g__draw_softpath_buffer_b_tl
+  }
+\cs_new_protected:Npn \__draw_softpath_get:N #1
+  {
+    \__draw_softpath_concat:n { }
+    \tl_set_eq:NN #1 \g__draw_softpath_main_tl
+  }
+\cs_new_protected:Npn \__draw_softpath_set_eq:N #1
+  {
+    \tl_gset_eq:NN \g__draw_softpath_main_tl #1
+    \__draw_softpath_reset_buffers:
+  }
+\cs_new_protected:Npn \__draw_softpath_use:
+  {
+    \g__draw_softpath_main_tl
+    \g__draw_softpath_buffer_b_tl
+    \g__draw_softpath_buffer_a_tl
+  }
+\cs_new_protected:Npn \__draw_softpath_clear:
+  {
+    \tl_gclear:N \g__draw_softpath_main_tl
+    \tl_gclear:N \g__draw_softpath_buffer_a_tl
+    \tl_gclear:N \g__draw_softpath_buffer_b_tl
+  }
+\cs_new_protected:Npn \__draw_softpath_use_clear:
+  {
+    \__draw_softpath_use:
+    \__draw_softpath_clear:
+  }
+\dim_new:N \g__draw_softpath_lastx_dim
+\dim_new:N \g__draw_softpath_lasty_dim
+\bool_new:N \g__draw_softpath_move_bool
+\bool_gset_true:N \g__draw_softpath_move_bool
+\cs_new_protected:Npn \__draw_softpath_closepath:
+  {
+    \__draw_softpath_add:x
+      {
+        \__draw_softpath_close_op:nn
+          { \dim_use:N \g__draw_softpath_lastx_dim }
+          { \dim_use:N \g__draw_softpath_lasty_dim }
+      }
+  }
+\cs_new_protected:Npn \__draw_softpath_curveto:nnnnnn #1#2#3#4#5#6
+  {
+    \__draw_softpath_add:n
+      {
+        \__draw_softpath_curveto_opi:nn {#1} {#2}
+        \__draw_softpath_curveto_opii:nn {#3} {#4}
+        \__draw_softpath_curveto_opiii:nn {#5} {#6}
+      }
+  }
+\cs_new_protected:Npn \__draw_softpath_lineto:nn #1#2
+  {
+    \__draw_softpath_add:n
+      { \__draw_softpath_lineto_op:nn {#1} {#2} }
+  }
+\cs_new_protected:Npn \__draw_softpath_moveto:nn #1#2
+  {
+    \__draw_softpath_add:n
+      { \__draw_softpath_moveto_op:nn {#1} {#2} }
+    \bool_if:NT \g__draw_softpath_move_bool
+      {
+        \dim_gset:Nn \g__draw_softpath_lastx_dim {#1}
+        \dim_gset:Nn \g__draw_softpath_lasty_dim {#2}
+      }
+  }
+\cs_new_protected:Npn \__draw_softpath_rectangle:nnnn #1#2#3#4
+  {
+    \__draw_softpath_add:n
+      {
+        \__draw_softpath_rectangle_opi:nn {#1} {#2}
+        \__draw_softpath_rectangle_opii:nn {#3} {#4}
+      }
+  }
+\cs_new_protected:Npn \__draw_softpath_roundpoint:nn #1#2
+  {
+    \__draw_softpath_add:n
+      { \__draw_softpath_roundpoint_op:nn {#1} {#2} }
+  }
+\cs_generate_variant:Nn \__draw_softpath_roundpoint:nn { VV }
+\cs_new_protected:Npn \__draw_softpath_close_op:nn #1#2
+  { \driver_draw_closepath: }
+\cs_new_protected:Npn \__draw_softpath_curveto_opi:nn #1#2
+  { \__draw_softpath_curveto_opi:nnNnnNnn {#1} {#2} }
+\cs_new_protected:Npn \__draw_softpath_curveto_opi:nnNnnNnn #1#2#3#4#5#6#7#8
+  { \driver_draw_curveto:nnnnnn {#1} {#2} {#4} {#5} {#7} {#8} }
+\cs_new_protected:Npn \__draw_softpath_curveto_opii:nn #1#2 { }
+\cs_new_protected:Npn \__draw_softpath_curveto_opiii:nn #1#2 { }
+\cs_new_protected:Npn \__draw_softpath_lineto_op:nn #1#2
+  { \driver_draw_lineto:nn {#1} {#2} }
+\cs_new_protected:Npn \__draw_softpath_moveto_op:nn #1#2
+  { \driver_draw_moveto:nn {#1} {#2} }
+\cs_new_protected:Npn \__draw_softpath_roundpoint_op:nn #1#2 { }
+\cs_new_protected:Npn \__draw_softpath_rectangle_opi:nn #1#2
+  { \__draw_softpath_rectangle_opi:nnNnn {#1} {#2} }
+\cs_new_protected:Npn \__draw_softpath_rectangle_opi:nnNnn #1#2#3#4#5
+  { \driver_draw_rectangle:nnnn {#1} {#2} {#4} {#5} }
+  \cs_new_protected:Npn \__draw_softpath_rectangle_opii:nn #1#2 { }
+%% File: l3draw-state.dtx Copyright(C) 2018 The LaTeX3 Project
+\dim_new:N \g__draw_linewidth_dim
+\dim_new:N \g__draw_inner_linewidth_dim
+\dim_new:N \l_draw_default_linewidth_dim
+\dim_set:Nn \l_draw_default_linewidth_dim { 0.4pt }
+\cs_new_protected:Npn \draw_linewidth:n #1
+  {
+    \dim_gset:Nn \g__draw_linewidth_dim { \fp_to_dim:n {#1} }
+    \driver_draw_linewidth:n \g__draw_linewidth_dim
+  }
+\cs_new_protected:Npn \draw_inner_linewidth:n #1
+  { \dim_gset:Nn \g__draw_inner_linewidth_dim { \fp_to_dim:n {#1} }  }
+\cs_new_protected:Npn \draw_miterlimit:n #1
+  { \driver_draw_miterlimit:n { \fp_to_dim:n {#1} } }
+\cs_new_protected:Npn \draw_cap_butt: { \driver_draw_cap_butt: }
+\cs_new_protected:Npn \draw_cap_rectangle: { \driver_draw_cap_rectangle: }
+\cs_new_protected:Npn \draw_cap_round: { \driver_draw_cap_round: }
+\cs_new_protected:Npn \draw_evenodd_rule: { \driver_draw_evenodd_rule: }
+\cs_new_protected:Npn \draw_nonzero_rule: { \driver_draw_nonzero_rule: }
+\cs_new_protected:Npn \draw_join_bevel: { \driver_draw_join_bevel: }
+\cs_new_protected:Npn \draw_join_miter: { \driver_draw_join_miter: }
+\cs_new_protected:Npn \draw_join_round: { \driver_draw_join_round: }
+\tl_new:N \l__draw_color_tmp_tl
+\tl_new:N \g__draw_fill_color_tl
+\tl_new:N \g__draw_stroke_color_tl
+\cs_new_protected:Npn \draw_color:n #1
+  { \__draw_color:nn { } {#1} }
+\cs_new_protected:Npn \draw_color_fill:n #1
+  { \__draw_color:nn { fill } {#1} }
+\cs_new_protected:Npn \draw_color_stroke:n #1
+  { \__draw_color:nn { stroke } {#1} }
+\cs_new_protected:Npn \__draw_color:nn #1#2
+  {
+    \color_parse:nN {#2} \l__draw_color_tmp_tl
+    \tl_if_blank:nTF {#1}
+      {
+        \tl_gset_eq:NN \g__draw_fill_color_tl \l__draw_color_tmp_tl
+        \tl_gset_eq:NN \g__draw_stroke_color_tl \l__draw_color_tmp_tl
+        \__draw_color_aux:Vn \l__draw_color_tmp_tl { color }
+      }
+      {
+        \tl_gset_eq:cN { g__draw_ #1 _color_tl } \l__draw_color_tmp_tl
+        \__draw_color_aux:Vn \l__draw_color_tmp_tl { #1 }
+      }
+  }
+\cs_new_protected:Npn \__draw_color_aux:nn #1#2
+  { \__draw_color:nw {#2} #1 \q_stop }
+\cs_generate_variant:Nn \__draw_color_aux:nn { V }
+\cs_new_protected:Npn \__draw_color:nw #1#2 ~ #3 \q_stop
+  { \use:c { __draw_color_ #2 :nw } {#1} #3 \q_stop }
+\cs_new_protected:Npn \__draw_color_cmyk:nw #1#2 ~ #3 ~ #4 ~ #5 \q_stop
+  { \use:c { driver_draw_ #1 _cmyk:nnnn } {#2} {#3} {#4} {#5} }
+\cs_new_protected:Npn \__draw_color_gray:nw #1#2 \q_stop
+  { \use:c { driver_draw_ #1 _gray:n } {#2} }
+\cs_new_protected:Npn \__draw_color_rgb:nw #1#2 ~ #3 ~ #4 \q_stop
+  { \use:c { driver_draw_ #1 _rgb:nnn } {#2} {#3} {#4} }
+\cs_new_protected:Npn \__draw_color_spot:nw #1#2 ~ #3 \q_stop
+  { \use:c { driver_draw_ #1 _spot:nn } {#2} {#3} }
+%% File: l3draw-transforms.dtx Copyright(C) 2018 The LaTeX3 Project
+\bool_new:N \l__draw_transformcm_active_bool
+\fp_new:N \l__draw_transformcm_aa_fp
+\fp_new:N \l__draw_transformcm_ab_fp
+\fp_new:N \l__draw_transformcm_ba_fp
+\fp_new:N \l__draw_transformcm_bb_fp
+\dim_new:N \l__draw_transformcm_xshift_dim
+\dim_new:N \l__draw_transformcm_yshift_dim
+\cs_new_protected:Npn \draw_transform_reset:
+  {
+    \fp_set:Nn \l__draw_transformcm_aa_fp { 1}
+    \fp_zero:N \l__draw_transformcm_ab_fp
+    \fp_zero:N \l__draw_transformcm_ba_fp
+    \fp_set:Nn \l__draw_transformcm_bb_fp { 1 }
+    \dim_zero:N \l__draw_transformcm_xshift_dim
+    \dim_zero:N \l__draw_transformcm_yshift_dim
+  }
+\draw_transform_reset:
+\cs_new_protected:Npn \draw_transform:nnnnn #1#2#3#4#5
+  {
+    \__draw_point_process:nn
+      { \__draw_transform:nnnnnnn {#1} {#2} {#3} {#4} }
+      {#5}
+  }
+\cs_new_protected:Npn \__draw_transform:nnnnnnn #1#2#3#4#5#6
+  {
+    \fp_set:Nn \l__draw_transformcm_aa_fp {#1}
+    \fp_set:Nn \l__draw_transformcm_ab_fp {#2}
+    \fp_set:Nn \l__draw_transformcm_ba_fp {#3}
+    \fp_set:Nn \l__draw_transformcm_bb_fp {#4}
+    \dim_set:Nn \l__draw_transformcm_xshift_dim {#5}
+    \dim_set:Nn \l__draw_transformcm_yshift_dim {#6}
+    \bool_lazy_all:nTF
+      {
+        { \fp_compare_p:nNn \l__draw_transformcm_aa_fp = \c_one_fp }
+        { \fp_compare_p:nNn \l__draw_transformcm_ab_fp = \c_zero_fp }
+        { \fp_compare_p:nNn \l__draw_transformcm_ba_fp = \c_zero_fp }
+        { \fp_compare_p:nNn \l__draw_transformcm_bb_fp = \c_one_fp }
+      }
+      { \bool_set_false:N \l__draw_transformcm_active_bool }
+      { \bool_set_true:N \l__draw_transformcm_active_bool }
+  }
+\cs_new_protected:Npn \draw_transform_concat:nnnnn #1#2#3#4#5
+  {
+    \__draw_point_process:nn
+      { \__draw_transform_concat:nnnnnn {#1} {#2} {#3} {#4} }
+      {#5}
+  }
+\cs_new_protected:Npn \__draw_transform_concat:nnnnnn #1#2#3#4#5#6
+  {
+    \use:x
+      {
+        \__draw_transform_concat_aux:nnnnnn
+          { \fp_eval:n {#1} }
+          { \fp_eval:n {#2} }
+          { \fp_eval:n {#3} }
+          { \fp_eval:n {#4} }
+          {#5}
+          {#6}
+      }
+  }
+\cs_new_protected:Npn \__draw_transform_concat_aux:nnnnnn #1#2#3#4#5#6
+  {
+    \use:x
+      {
+        \__draw_transform:nnnnnnn
+          { #1 * \l__draw_transformcm_aa_fp + #2 * \l__draw_transformcm_ba_fp }
+          { #1 * \l__draw_transformcm_ab_fp + #2 * \l__draw_transformcm_bb_fp }
+          { #3 * \l__draw_transformcm_aa_fp + #4 * \l__draw_transformcm_ba_fp }
+          { #3 * \l__draw_transformcm_ab_fp + #4 * \l__draw_transformcm_bb_fp }
+          {
+            \fp_to_dim:n
+              {
+                  \l__draw_transformcm_xshift_dim
+                + \l__draw_transformcm_aa_fp * #5
+                + \l__draw_transformcm_ba_fp * #6
+              }
+          }
+          {
+            \fp_to_dim:n
+              {
+                  \l__draw_transformcm_yshift_dim
+                + \l__draw_transformcm_ab_fp * #5
+                + \l__draw_transformcm_bb_fp * #6
+              }
+          }
+        }
+  }
+\cs_new_protected:Npn \draw_transform_invert:
+  {
+    \bool_if:NT \l__draw_transformcm_active_bool
+      {
+        \__draw_transform_invert:f
+          {
+            \fp_eval:n
+              {
+                1 /
+                  (
+                      \l__draw_transformcm_aa_fp * \l__draw_transformcm_bb_fp
+                    - \l__draw_transformcm_ab_fp * \l__draw_transformcm_ba_fp
+                  )
+              }
+          }
+      }
+    \dim_set:Nn \l__draw_transformcm_xshift_dim
+      {
+        \fp_to_dim:n
+          {
+            -\l__draw_transformcm_xshift_dim * \l__draw_transformcm_aa_fp
+            -\l__draw_transformcm_yshift_dim * \l__draw_transformcm_ba_fp
+          }
+      }
+    \dim_set:Nn \l__draw_transformcm_yshift_dim
+      {
+        \fp_to_dim:n
+          {
+            -\l__draw_transformcm_xshift_dim * \l__draw_transformcm_ab_fp
+            -\l__draw_transformcm_yshift_dim * \l__draw_transformcm_bb_fp
+          }
+      }
+  }
+\cs_new_protected:Npn \__draw_transform_invert:n #1
+  {
+    \fp_set:Nn \l__draw_transformcm_aa_fp
+      { \l__draw_transformcm_bb_fp * #1 }
+    \fp_set:Nn \l__draw_transformcm_ab_fp
+      { -\l__draw_transformcm_ab_fp * #1 }
+    \fp_set:Nn \l__draw_transformcm_ba_fp
+      { -\l__draw_transformcm_ba_fp * #1 }
+    \fp_set:Nn \l__draw_transformcm_bb_fp
+      { \l__draw_transformcm_aa_fp * #1 }
+  }
+\cs_generate_variant:Nn \__draw_transform_invert:n { f }
+\cs_new_protected:Npn \draw_transform_triangle:nnn #1#2#3
+  {
+    \__draw_point_process:nnn
+      {
+        \__draw_point_process:nn
+          { \__draw_tranform_triangle:nnnnnn }
+          {#1}
+      }
+      {#2} {#3}
+  }
+\cs_new_protected:Npn \__draw_tranform_triangle:nnnnnn #1#2#3#4#5#6
+  {
+    \use:x
+      {
+        \__draw_transform:nnnnnnn
+          { #3 - #1 }
+          { #4 - #2 }
+          { #5 - #1 }
+          { #6 - #2 }
+          {#1}
+          {#2}
+      }
+  }
+%% 
+%%
+%% End of file `l3draw.sty'.


Property changes on: trunk/Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-convert.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-convert.sty	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-convert.sty	2018-02-23 21:54:14 UTC (rev 46720)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3str-convert.dtx Copyright (C) 2013-2017 The LaTeX3 Project
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3str-convert}{2017/12/16}{}
+\ProvidesExplPackage{l3str-convert}{2018/02/21}{}
   {L3 Experimental string encoding conversions}
 \cs_if_exist:NF \use_ii_i:nn
   { \cs_new:Npn \use_ii_i:nn #1#2 { #2 #1 } }
@@ -181,7 +181,7 @@
 \cs_new_protected:Npn \__str_if_flag_error:nnx #1
   {
     \flag_if_raised:nTF {#1}
-      { \__msg_kernel_error:nnx { str } }
+      { \__kernel_msg_error:nnx { str } }
       { \use_none:nn }
   }
 \cs_new_protected:Npn \__str_if_flag_no_error:nnx #1#2#3
@@ -240,7 +240,7 @@
   {
     \if_meaning:w #1 #5
       \tl_if_empty:nF {#3}
-        { \__msg_kernel_error:nnx { str } { native-escaping } {#3} }
+        { \__kernel_msg_error:nnx { str } { native-escaping } {#3} }
       #1
     \else:
       #4 #2 #1
@@ -272,7 +272,7 @@
               }
               {
                 \tl_clear:N \l__str_internal_tl
-                \__msg_kernel_error:nnxx { str } { unknown-#2 } {#4} {#1}
+                \__kernel_msg_error:nnxx { str } { unknown-#2 } {#4} {#1}
               }
           }
         \cs_if_exist:cF { __str_convert_#3_#1: }
@@ -414,7 +414,7 @@
             \__str_output_byte:n {#1}
           \fi:
         }
-      \__msg_kernel_new:nnnn { str } { pdfTeX-native-overflow }
+      \__kernel_msg_new:nnnn { str } { pdfTeX-native-overflow }
         { Character~code~too~large~for~pdfTeX. }
         {
           The~pdfTeX~engine~only~supports~8-bit~characters:~
@@ -541,11 +541,11 @@
       \__str_output_byte:n {#1}
     \fi:
   }
-\__msg_kernel_new:nnn { str } { unknown-esc }
+\__kernel_msg_new:nnn { str } { unknown-esc }
   { Escaping~scheme~'#1'~(filtered:~'#2')~unknown. }
-\__msg_kernel_new:nnn { str } { unknown-enc }
+\__kernel_msg_new:nnn { str } { unknown-enc }
   { Encoding~scheme~'#1'~(filtered:~'#2')~unknown. }
-\__msg_kernel_new:nnnn { str } { native-escaping }
+\__kernel_msg_new:nnnn { str } { native-escaping }
   { The~'native'~encoding~scheme~does~not~support~any~escaping. }
   {
     Since~native~strings~do~not~consist~in~bytes,~
@@ -552,7 +552,7 @@
     none~of~the~escaping~methods~make~sense.~
     The~specified~escaping,~'#1',~will be ignored.
   }
-\__msg_kernel_new:nnn { str } { file-not-found }
+\__kernel_msg_new:nnn { str } { file-not-found }
   { File~'l3str-#1.def'~not~found. }
 \bool_lazy_any:nT
   {
@@ -560,7 +560,7 @@
     \sys_if_engine_xetex_p:
   }
   {
-    \__msg_kernel_new:nnnn { str } { non-byte }
+    \__kernel_msg_new:nnnn { str } { non-byte }
       { String~invalid~in~escaping~'#1':~it~may~only~contain~bytes. }
       {
         Some~characters~in~the~string~you~asked~to~convert~are~not~
@@ -574,13 +574,13 @@
           }
       }
   }
-\__msg_kernel_new:nnnn { str } { decode-8-bit }
+\__kernel_msg_new:nnnn { str } { decode-8-bit }
   { Invalid~string~in~encoding~'#1'. }
   {
     LaTeX~came~across~a~byte~which~is~not~defined~to~represent~
     any~character~in~the~encoding~'#1'.
   }
-\__msg_kernel_new:nnnn { str } { encode-8-bit }
+\__kernel_msg_new:nnnn { str } { encode-8-bit }
   { Unicode~string~cannot~be~converted~to~encoding~'#1'. }
   {
     The~encoding~'#1'~only~contains~a~subset~of~all~Unicode~characters.~

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-enc-utf16.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-enc-utf16.def	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-enc-utf16.def	2018-02-23 21:54:14 UTC (rev 46720)
@@ -59,7 +59,7 @@
   \flag_clear_new:n { str_missing }
   \flag_clear_new:n { str_extra }
   \flag_clear_new:n { str_end }
-  \__msg_kernel_new:nnnn { str } { utf16-encode }
+  \__kernel_msg_new:nnnn { str } { utf16-encode }
     { Unicode~string~cannot~be~expressed~in~UTF-16:~surrogate. }
     {
       Surrogate~code~points~(in~the~range~[U+D800,~U+DFFF])~
@@ -66,7 +66,7 @@
       can~be~expressed~in~the~UTF-8~and~UTF-32~encodings,~
       but~not~in~the~UTF-16~encoding.
     }
-  \__msg_kernel_new:nnnn { str } { utf16-decode }
+  \__kernel_msg_new:nnnn { str } { utf16-decode }
     {
       Invalid~UTF-16~string: \exp_last_unbraced:Nf \use_none:n
       \__str_if_flag_times:nT { str_missing }  { ,~missing~trail~surrogate }

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-enc-utf32.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-enc-utf32.def	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-enc-utf32.def	2018-02-23 21:54:14 UTC (rev 46720)
@@ -56,7 +56,7 @@
     }
   \flag_clear_new:n { str_overflow }
   \flag_clear_new:n { str_end }
-  \__msg_kernel_new:nnnn { str } { utf32-decode }
+  \__kernel_msg_new:nnnn { str } { utf32-decode }
     {
       Invalid~UTF-32~string: \exp_last_unbraced:Nf \use_none:n
       \__str_if_flag_times:nT { str_overflow } { ,~code~point~too~large }

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-enc-utf8.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-enc-utf8.def	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-enc-utf8.def	2018-02-23 21:54:14 UTC (rev 46720)
@@ -45,7 +45,7 @@
 \flag_clear_new:n { str_extra }
 \flag_clear_new:n { str_overlong }
 \flag_clear_new:n { str_overflow }
-\__msg_kernel_new:nnnn { str } { utf8-decode }
+\__kernel_msg_new:nnnn { str } { utf8-decode }
   {
     Invalid~UTF-8~string: \exp_last_unbraced:Nf \use_none:n
     \__str_if_flag_times:nT { str_missing }  { ,~missing~continuation~byte }

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-esc-hex.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-esc-hex.def	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-esc-hex.def	2018-02-23 21:54:14 UTC (rev 46720)
@@ -59,7 +59,7 @@
         \__str_unescape_hex_auxii:N
       }
   }
-\__msg_kernel_new:nnnn { str } { unescape-hex }
+\__kernel_msg_new:nnnn { str } { unescape-hex }
   { String~invalid~in~escaping~'hex':~only~hexadecimal~digits~allowed. }
   {
     Some~characters~in~the~string~you~asked~to~convert~are~not~

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-esc-name.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-esc-name.def	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-esc-name.def	2018-02-23 21:54:14 UTC (rev 46720)
@@ -58,7 +58,7 @@
         \__str_output_end:
         \use_i:nnn #3 ##2##3
       }
-    \__msg_kernel_new:nnnn { str } { unescape-#2 }
+    \__kernel_msg_new:nnnn { str } { unescape-#2 }
       { String~invalid~in~escaping~'#2'. }
       {
         LaTeX~came~across~the~escape~character~'#1'~not~followed~by~

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-esc-string.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-esc-string.def	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-esc-string.def	2018-02-23 21:54:14 UTC (rev 46720)
@@ -98,7 +98,7 @@
       \if_charcode:w ^^J #2 \else: ^^J \fi:
       \__str_unescape_string_newlines:wN #2
     }
-  \__msg_kernel_new:nnnn { str } { unescape-string }
+  \__kernel_msg_new:nnnn { str } { unescape-string }
     { String~invalid~in~escaping~'string'. }
     {
       LaTeX~came~across~an~escape~character~'\c_backslash_str'~

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-esc-url.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-esc-url.def	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-esc-url.def	2018-02-23 21:54:14 UTC (rev 46720)
@@ -58,7 +58,7 @@
         \__str_output_end:
         \use_i:nnn #3 ##2##3
       }
-    \__msg_kernel_new:nnnn { str } { unescape-#2 }
+    \__kernel_msg_new:nnnn { str } { unescape-#2 }
       { String~invalid~in~escaping~'#2'. }
       {
         LaTeX~came~across~the~escape~character~'#1'~not~followed~by~

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty	2018-02-23 21:54:14 UTC (rev 46720)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3str-format.dtx Copyright (C) 2012-2017 The LaTeX3 Project
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3str-format}{2017/12/16}{}
+\ProvidesExplPackage{l3str-format}{2018/02/21}{}
   {L3 Experimental string formatting}
 \cs_generate_variant:Nn \use:nn { nf }
 \cs_generate_variant:Nn \use:nnn { fnf }
@@ -101,7 +101,7 @@
 \cs_new:Npn \__str_format_parse_end:nwn #1 #2 \s__stop \s__stop #3
   {
     \tl_if_empty:nF {#2}
-      { \__msg_kernel_expandable_error:nnn { str } { invalid-format } {#3} }
+      { \__kernel_msg_expandable_error:nnn { str } { invalid-format } {#3} }
     #1
   }
 \cs_new:cpn { __str_format_align_<:nnnN } #1#2#3#4
@@ -168,7 +168,7 @@
   {
     \token_if_eq_charcode:NNTF #2 =
       {
-        \__msg_kernel_expandable_error:nnnn
+        \__kernel_msg_expandable_error:nnnn
           { str } { invalid-align-format } {#2} {tl}
         \__str_format_put:nw { #1 < }
       }
@@ -179,7 +179,7 @@
       }
     \token_if_eq_charcode:NNF #3 ?
       {
-        \__msg_kernel_expandable_error:nnnn
+        \__kernel_msg_expandable_error:nnnn
           { str } { invalid-sign-format } {#3} {tl}
       }
     \__str_format_put:nw { {#4} }
@@ -190,7 +190,7 @@
       {
         \token_if_eq_charcode:NNF #6 ?
           {
-            \__msg_kernel_expandable_error:nnnn
+            \__kernel_msg_expandable_error:nnnn
               { str } { invalid-style-format } {#6} {tl}
           }
       }
@@ -259,7 +259,7 @@
     \__str_format_put:nw { {#4} }
     \tl_if_empty:nF {#5}
       {
-        \__msg_kernel_expandable_error:nnnn
+        \__kernel_msg_expandable_error:nnnn
           { str } { invalid-precision-format } {#5} {int}
       }
     \str_case:nnF {#6}
@@ -271,7 +271,7 @@
         { X } { \__str_format_int:NwnnNNn \int_to_Hex:n }
       }
       {
-        \__msg_kernel_expandable_error:nnnn
+        \__kernel_msg_expandable_error:nnnn
           { str } { invalid-style-format } {#6} { int }
         \__str_format_int:NwnnNNn \use:n
       }
@@ -324,7 +324,7 @@
         { ? } { \__str_format_fp:wnnnNNw \__str_format_fp_g:wn }
       }
       {
-        \__msg_kernel_expandable_error:nnnn
+        \__kernel_msg_expandable_error:nnnn
           { str } { invalid-style-format } {#6} { fp }
         \__str_format_fp:wnnnNNw \__str_format_fp_g:wn
       }
@@ -427,15 +427,15 @@
     \exp:w \exp_end_continue_f:w \fp_to_scientific:n
   }
 \cs_new:Npn \__str_format_fp_trim:w #1 e { \__fp_trim_zeros:w #1 ; e }
-\__msg_kernel_new:nnn { str } { invalid-format }
+\__kernel_msg_new:nnn { str } { invalid-format }
   { Invalid~format~'#1'. }
-\__msg_kernel_new:nnn { str } { invalid-align-format }
+\__kernel_msg_new:nnn { str } { invalid-align-format }
   { Invalid~alignment~'#1'~for~type~'#2'. }
-\__msg_kernel_new:nnn { str } { invalid-sign-format }
+\__kernel_msg_new:nnn { str } { invalid-sign-format }
   { Invalid~sign~'#1'~for~type~'#2'. }
-\__msg_kernel_new:nnn { str } { invalid-precision-format }
+\__kernel_msg_new:nnn { str } { invalid-precision-format }
   { Invalid~precision~'#1'~for~type~'#2'. }
-\__msg_kernel_new:nnn { str } { invalid-style-format }
+\__kernel_msg_new:nnn { str } { invalid-style-format }
   { Invalid~style~'#1'~for~type~'#2'. }
 %% 
 %%

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty	2018-02-23 21:54:14 UTC (rev 46720)
@@ -20,7 +20,7 @@
 %% 
 %% File: xcoffins.dtx Copyright(C) 2010-2012,2014,2016,2017 The LaTeX3 Project
 \RequirePackage{xparse}
-\ProvidesExplPackage{xcoffins}{2017/12/16}{}
+\ProvidesExplPackage{xcoffins}{2018/02/21}{}
   {L3 Experimental design level coffins}
 \keys_define:nn { coffin }
   {

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty	2018-02-23 21:54:14 UTC (rev 46720)
@@ -20,8 +20,8 @@
 %% 
 %% File: l3galley.dtx Copyright (C) 1999-2001, 2004-2009 Frank Mittelbach
 %%                              (C) 2010-2017 The LaTeX3 Project
-\RequirePackage{expl3}[2017/12/16]
-\@ifpackagelater{expl3}{2017/12/16}
+\RequirePackage{expl3}[2018/02/21]
+\@ifpackagelater{expl3}{2018/02/21}
   {}
   {%
     \PackageError{l3galley}{Support package l3kernel too old}
@@ -33,7 +33,7 @@
       }%
     \endinput
   }
-\ProvidesExplPackage{l3galley}{2017/12/16}{}
+\ProvidesExplPackage{l3galley}{2018/02/21}{}
   {L3 Experimental galley code}
 \int_new:N \l__galley_tmp_int
 \seq_new:N \g__galley_tmpa_seq
@@ -705,7 +705,7 @@
 \cs_new_protected:Npn \galley_break_line:Nn #1#2
   {
     \mode_if_vertical:TF
-      { \__msg_kernel_error:nn { galley } { no-line-to-end } }
+      { \__kernel_msg_error:nn { galley } { no-line-to-end } }
       {
         \tex_unskip:D
         \bool_if:NF #1
@@ -881,7 +881,7 @@
   { \__int_value:w \etex_widowpenalties:D \__int_eval:n {#1} , }
 \cs_new_protected:Npn \galley_interline_penalty:
   { \__int_value:w \etex_interlinepenalties:D \etex_interlinepenalties:D 0 \exp_stop_f: }
-\__msg_kernel_new:nnn { galley } { no-line-to-end }
+\__kernel_msg_new:nnn { galley } { no-line-to-end }
   { There's~no~line~here~to~end. }
 \cs_set:Npn \clearpage
   {

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty	2018-02-23 21:54:14 UTC (rev 46720)
@@ -21,7 +21,7 @@
 %% File: xgalley.dtx Copyright (C) 1999-2001, 2004-2009 Frank Mittelbach
 %%                             (C) 2010-2012,2014,2016-2017 The LaTeX3 Project
 \RequirePackage{xparse}
-\ProvidesExplPackage{xgalley}{2017/12/16}{}
+\ProvidesExplPackage{xgalley}{2018/02/21}{}
   {L3 Experimental galley}
 \RequirePackage{xparse,xtemplate,l3galley}
 \clist_new:N \l__galley_tmpa_clist

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex	2018-02-23 21:54:14 UTC (rev 46720)
@@ -29,6 +29,7 @@
 %% l3fp-traps.dtx  (with options: `package')
 %% l3fp-round.dtx  (with options: `package')
 %% l3fp-parse.dtx  (with options: `package')
+%% l3fp-assign.dtx  (with options: `package')
 %% l3fp-logic.dtx  (with options: `package')
 %% l3fp-basics.dtx  (with options: `package')
 %% l3fp-extended.dtx  (with options: `package')
@@ -36,7 +37,6 @@
 %% l3fp-trig.dtx  (with options: `package')
 %% l3fp-convert.dtx  (with options: `package')
 %% l3fp-random.dtx  (with options: `package')
-%% l3fp-assign.dtx  (with options: `package')
 %% l3sort.dtx  (with options: `package')
 %% l3tl-build.dtx  (with options: `package')
 %% l3tl-analysis.dtx  (with options: `package')
@@ -43,13 +43,13 @@
 %% l3regex.dtx  (with options: `package')
 %% l3box.dtx  (with options: `package')
 %% l3coffins.dtx  (with options: `package')
-%% l3color.dtx  (with options: `package')
+%% l3color-base.dtx  (with options: `package')
 %% l3sys.dtx  (with options: `package')
 %% l3deprecation.dtx  (with options: `package')
 %% l3candidates.dtx  (with options: `package')
 %% l3luatex.dtx  (with options: `package,tex')
 %% 
-%% Copyright (C) 1990-2017 The LaTeX3 Project
+%% Copyright (C) 1990-2018 The LaTeX3 Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -62,7 +62,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx Copyright (C) 1990-2017 The LaTeX3 Project
-\def\ExplFileDate{2017/12/16}%
+\def\ExplFileDate{2018/02/21}%
 \begingroup
   \def\next{\endgroup}%
   \expandafter\ifx\csname PackageError\endcsname\relax
@@ -352,7 +352,7 @@
     \tex_endlinechar:D = 32 \scan_stop:
     \bool_set_true:N \l__kernel_expl_bool
   }
-%% File: l3names.dtx Copyright (C) 1990-2017 The LaTeX3 project
+%% File: l3names.dtx Copyright (C) 1990-2018 The LaTeX3 project
 \let \tex_global:D \global
 \let \tex_let:D    \let
 \begingroup
@@ -936,8 +936,11 @@
   \__kernel_primitive:NN \aligntab                    \luatex_aligntab:D
   \__kernel_primitive:NN \attribute                   \luatex_attribute:D
   \__kernel_primitive:NN \attributedef                \luatex_attributedef:D
+  \__kernel_primitive:NN \automaticdiscretionary      \luatex_automaticdiscretionary:D
+  \__kernel_primitive:NN \automatichyphenmode         \luatex_automatichyphenmode:D
   \__kernel_primitive:NN \automatichyphenpenalty      \luatex_automatichyphenpenalty:D
   \__kernel_primitive:NN \begincsname                 \luatex_begincsname:D
+  \__kernel_primitive:NN \breakafterdirmode           \luatex_breakafterdirmode:D
   \__kernel_primitive:NN \catcodetable                \luatex_catcodetable:D
   \__kernel_primitive:NN \clearmarks                  \luatex_clearmarks:D
   \__kernel_primitive:NN \crampeddisplaystyle         \luatex_crampeddisplaystyle:D
@@ -952,6 +955,7 @@
   \__kernel_primitive:NN \etokspre                    \luatex_etokspre:D
   \__kernel_primitive:NN \explicithyphenpenalty       \luatex_explicithyphenpenalty:D
   \__kernel_primitive:NN \expanded                    \luatex_expanded:D
+  \__kernel_primitive:NN \explicitdiscretionary       \luatex_explicitdiscretionary:D
   \__kernel_primitive:NN \firstvalidlanguage          \luatex_firstvalidlanguage:D
   \__kernel_primitive:NN \fontid                      \luatex_fontid:D
   \__kernel_primitive:NN \formatname                  \luatex_formatname:D
@@ -968,15 +972,17 @@
   \__kernel_primitive:NN \luaescapestring             \luatex_luaescapestring:D
   \__kernel_primitive:NN \luafunction                 \luatex_luafunction:D
   \__kernel_primitive:NN \luatexbanner                \luatex_luatexbanner:D
-  \__kernel_primitive:NN \luatexdatestamp             \luatex_luatexdatestamp:D
   \__kernel_primitive:NN \luatexrevision              \luatex_luatexrevision:D
   \__kernel_primitive:NN \luatexversion               \luatex_luatexversion:D
+  \__kernel_primitive:NN \mathdelimitersmode          \luatex_mathdelimitersmode:D
   \__kernel_primitive:NN \mathdisplayskipmode         \luatex_mathdisplayskipmode:D
   \__kernel_primitive:NN \matheqnogapstep             \luatex_matheqnogapstep:D
   \__kernel_primitive:NN \mathnolimitsmode            \luatex_mathnolimitsmode:D
   \__kernel_primitive:NN \mathoption                  \luatex_mathoption:D
+  \__kernel_primitive:NN \mathpenaltiesmode           \luatex_mathpenaltiesmode:D
   \__kernel_primitive:NN \mathrulesfam                \luatex_mathrulesfam:D
   \__kernel_primitive:NN \mathscriptsmode             \luatex_mathscriptsmode:D
+  \__kernel_primitive:NN \mathscriptboxmode           \luatex_mathscriptboxmode:D
   \__kernel_primitive:NN \mathstyle                   \luatex_mathstyle:D
   \__kernel_primitive:NN \mathsurroundmode            \luatex_mathsurroundmode:D
   \__kernel_primitive:NN \mathsurroundskip            \luatex_mathsurroundskip:D
@@ -995,9 +1001,11 @@
   \__kernel_primitive:NN \pdfvariable                 \luatex_pdfvariable:D
   \__kernel_primitive:NN \postexhyphenchar            \luatex_postexhyphenchar:D
   \__kernel_primitive:NN \posthyphenchar              \luatex_posthyphenchar:D
+  \__kernel_primitive:NN \prebinoppenalty             \luatex_prebinoppenalty:D
   \__kernel_primitive:NN \predisplaygapfactor         \luatex_predisplaygapfactor:D
   \__kernel_primitive:NN \preexhyphenchar             \luatex_preexhyphenchar:D
   \__kernel_primitive:NN \prehyphenchar               \luatex_prehyphenchar:D
+  \__kernel_primitive:NN \prerelpenalty               \luatex_prerelpenalty:D
   \__kernel_primitive:NN \savecatcodetable            \luatex_savecatcodetable:D
   \__kernel_primitive:NN \scantextokens               \luatex_scantextokens:D
   \__kernel_primitive:NN \setfontid                   \luatex_setfontid:D
@@ -1006,6 +1014,7 @@
   \__kernel_primitive:NN \suppresslongerror           \luatex_suppresslongerror:D
   \__kernel_primitive:NN \suppressmathparerror        \luatex_suppressmathparerror:D
   \__kernel_primitive:NN \suppressoutererror          \luatex_suppressoutererror:D
+  \__kernel_primitive:NN \suppressprimitiveerror      \luatex_suppressprimitiveerror:D
   \__kernel_primitive:NN \toksapp                     \luatex_toksapp:D
   \__kernel_primitive:NN \tokspre                     \luatex_tokspre:D
   \__kernel_primitive:NN \tpack                       \luatex_tpack:D
@@ -1182,6 +1191,8 @@
   \__kernel_primitive:NN \Umathunderbarvgap           \utex_underbarvgap:D
   \__kernel_primitive:NN \Umathunderdelimiterbgap     \utex_underdelimiterbgap:D
   \__kernel_primitive:NN \Umathunderdelimitervgap     \utex_underdelimitervgap:D
+  \__kernel_primitive:NN \Unosubscript                \utex_Unosubscript:D
+  \__kernel_primitive:NN \Unosuperscript              \utex_Unosuperscript:D
   \__kernel_primitive:NN \Uoverdelimiter              \utex_overdelimiter:D
   \__kernel_primitive:NN \Uradical                    \utex_radical:D
   \__kernel_primitive:NN \Uroot                       \utex_root:D
@@ -1390,7 +1401,7 @@
   \tex_let:D \tex_middle:D \normalmiddle
   \tex_let:D \tex_right:D  \normalright
 \tex_fi:D
-%% File: l3basics.dtx Copyright (C) 1990-2017 The LaTeX3 project
+%% File: l3basics.dtx Copyright (C) 1990-2018 The LaTeX3 project
 \tex_let:D \if_true:           \tex_iftrue:D
 \tex_let:D \if_false:          \tex_iffalse:D
 \tex_let:D \or:                \tex_or:D
@@ -1510,11 +1521,11 @@
 \cs_set:Npn \use_none:nnnnnnn   #1#2#3#4#5#6#7     { }
 \cs_set:Npn \use_none:nnnnnnnn  #1#2#3#4#5#6#7#8   { }
 \cs_set:Npn \use_none:nnnnnnnnn #1#2#3#4#5#6#7#8#9 { }
-\cs_set_protected:Npn \__debug:TF #1#2 {#2}
+\cs_set_protected:Npn \__kernel_debug:TF #1#2 {#2}
 \tex_ifodd:D \l at expl@enable at debug@bool
-  \cs_set_protected:Npn \__debug:TF #1#2 {#1}
+  \cs_set_protected:Npn \__kernel_debug:TF #1#2 {#1}
 \fi:
-\__debug:TF
+\__kernel_debug:TF
   {
     \cs_set_protected:Npn \debug_on:n #1
       {
@@ -1521,7 +1532,7 @@
         \exp_args:No \clist_map_inline:nn { \tl_to_str:n {#1} }
           {
             \cs_if_exist_use:cF { __debug_##1_on: }
-              { \__msg_kernel_error:nnn { kernel } { debug } {##1} }
+              { \__kernel_msg_error:nnn { kernel } { debug } {##1} }
           }
       }
     \cs_set_protected:Npn \debug_off:n #1
@@ -1529,7 +1540,7 @@
         \exp_args:No \clist_map_inline:nn { \tl_to_str:n {#1} }
           {
             \cs_if_exist_use:cF { __debug_##1_off: }
-              { \__msg_kernel_error:nnn { kernel } { debug } {##1} }
+              { \__kernel_msg_error:nnn { kernel } { debug } {##1} }
           }
       }
   }
@@ -1536,16 +1547,16 @@
   {
     \cs_set_protected:Npn \debug_on:n #1
       {
-        \__msg_kernel_error:nnx { kernel } { enable-debug }
+        \__kernel_msg_error:nnx { kernel } { enable-debug }
           { \tl_to_str:n { \debug_on:n {#1} } }
       }
     \cs_set_protected:Npn \debug_off:n #1
       {
-        \__msg_kernel_error:nnx { kernel } { enable-debug }
+        \__kernel_msg_error:nnx { kernel } { enable-debug }
           { \tl_to_str:n { \debug_off:n {#1} } }
       }
   }
-\__debug:TF
+\__kernel_debug:TF
   {
     \cs_set_nopar:Npn \l__debug_suspended_tl { }
     \cs_set_protected:Npn \debug_suspend:
@@ -1568,56 +1579,56 @@
     \cs_set_protected:Npn \debug_suspend: { }
     \cs_set_protected:Npn \debug_resume: { }
   }
-\__debug:TF
+\__kernel_debug:TF
   {
     \exp_args:Nc \cs_set_protected:Npn { __debug_check-declarations_on: }
       {
-        \cs_set_protected:Npn \__debug_chk_var_exist:N ##1
+        \cs_set_protected:Npn \__kernel_chk_var_exist:N ##1
           {
             \__debug_suspended:T \use_none:nnn
             \cs_if_exist:NF ##1
               {
-                \__msg_kernel_error:nnx { kernel } { non-declared-variable }
+                \__kernel_msg_error:nnx { kernel } { non-declared-variable }
                   { \token_to_str:N ##1 }
               }
           }
-        \cs_set_protected:Npn \__debug_chk_cs_exist:N ##1
+        \cs_set_protected:Npn \__kernel_chk_cs_exist:N ##1
           {
             \__debug_suspended:T \use_none:nnn
             \cs_if_exist:NF ##1
               {
-                \__msg_kernel_error:nnx { kernel } { command-not-defined }
+                \__kernel_msg_error:nnx { kernel } { command-not-defined }
                   { \token_to_str:N ##1 }
               }
           }
-        \cs_set_protected:Npn \__debug_chk_var_scope:NN
+        \cs_set_protected:Npn \__kernel_chk_var_scope:NN
           {
             \__debug_suspended:T \use_none:nnn
             \__debug_chk_var_scope_aux:NN
           }
-        \cs_set_protected:Npn \__debug_chk_var_local:N ##1
+        \cs_set_protected:Npn \__kernel_chk_var_local:N ##1
           {
             \__debug_suspended:T \use_none:nnnnn
-            \__debug_chk_var_exist:N ##1
+            \__kernel_chk_var_exist:N ##1
             \__debug_chk_var_scope_aux:NN l ##1
           }
-        \cs_set_protected:Npn \__debug_chk_var_global:N ##1
+        \cs_set_protected:Npn \__kernel_chk_var_global:N ##1
           {
             \__debug_suspended:T \use_none:nnnnn
-            \__debug_chk_var_exist:N ##1
+            \__kernel_chk_var_exist:N ##1
             \__debug_chk_var_scope_aux:NN g ##1
           }
       }
     \exp_args:Nc \cs_set_protected:Npn { __debug_check-declarations_off: }
       {
-        \cs_set_protected:Npn \__debug_chk_var_exist:N ##1 { }
-        \cs_set_protected:Npn \__debug_chk_cs_exist:N ##1 { }
-        \cs_set_protected:Npn \__debug_chk_var_local:N ##1 { }
-        \cs_set_protected:Npn \__debug_chk_var_global:N ##1 { }
-        \cs_set_protected:Npn \__debug_chk_var_scope:NN ##1##2 { }
+        \cs_set_protected:Npn \__kernel_chk_var_exist:N ##1 { }
+        \cs_set_protected:Npn \__kernel_chk_cs_exist:N ##1 { }
+        \cs_set_protected:Npn \__kernel_chk_var_local:N ##1 { }
+        \cs_set_protected:Npn \__kernel_chk_var_global:N ##1 { }
+        \cs_set_protected:Npn \__kernel_chk_var_scope:NN ##1##2 { }
       }
-    \cs_set_protected:Npn \__debug_chk_cs_exist:c
-      { \exp_args:Nc \__debug_chk_cs_exist:N }
+    \cs_set_protected:Npn \__kernel_chk_cs_exist:c
+      { \exp_args:Nc \__kernel_chk_cs_exist:N }
     \tex_ifodd:D \l at expl@check at declarations@bool
       \use:c { __debug_check-declarations_on: }
     \else:
@@ -1625,7 +1636,7 @@
     \fi:
   }
   { }
-\__debug:TF
+\__kernel_debug:TF
   {
     \cs_set_protected:Npn \__debug_chk_var_scope_aux:NN #1#2
       { \exp_args:NNf \__debug_chk_var_scope_aux:Nn #1 { \cs_to_str:N #2 } }
@@ -1648,7 +1659,7 @@
           \if:w #1 \scan_stop:
             \cs_gset_nopar:Npn #1 {#2}
           \else:
-            \__msg_kernel_error:nnxxx { kernel } { local-global }
+            \__kernel_msg_error:nnxxx { kernel } { local-global }
               {#1} {#2} { \iow_char:N \\ #3 }
           \fi:
         \fi:
@@ -1655,11 +1666,11 @@
       }
   }
   { }
-\__debug:TF
+\__kernel_debug:TF
   {
     \exp_args:Nc \cs_set_protected:Npn { __debug_check-expressions_on: }
       {
-        \cs_set:Npn \__debug_chk_expr:nNnN ##1##2
+        \cs_set:Npn \__kernel_chk_expr:nNnN ##1##2
           {
             \__debug_suspended:T { ##1 \use_none:nnnnnnn }
             \exp_after:wN \__debug_chk_expr_aux:nNnN
@@ -1668,7 +1679,7 @@
           }
       }
     \exp_args:Nc \cs_set_protected:Npn { __debug_check-expressions_off: }
-      { \cs_set:Npn \__debug_chk_expr:nNnN ##1##2##3##4 {##1} }
+      { \cs_set:Npn \__kernel_chk_expr:nNnN ##1##2##3##4 {##1} }
     \use:c { __debug_check-expressions_off: }
     \cs_set:Npn \__debug_chk_expr_aux:nNnN #1#2#3#4
       {
@@ -1679,7 +1690,7 @@
             \__int_value:w #3 #2 #1 \tex_relax:D
           }
           {
-            \__msg_kernel_expandable_error:nnnn
+            \__kernel_msg_expandable_error:nnnn
               { kernel } { expr } {#4} {#1}
           }
         #1
@@ -1686,15 +1697,15 @@
       }
   }
   { }
-\__debug:TF
+\__kernel_debug:TF
   {
     \exp_args:Nc \cs_set_protected:Npn { __debug_log-functions_on: }
       {
-        \cs_set_protected:Npn \__debug_log:x
+        \cs_set_protected:Npn \__kernel_debug_log:x
           { \__debug_suspended:T \use_none:nn \iow_log:x }
       }
     \exp_args:Nc \cs_set_protected:Npn { __debug_log-functions_off: }
-      { \cs_set_protected:Npn \__debug_log:x { \use_none:n } }
+      { \cs_set_protected:Npn \__kernel_debug_log:x { \use_none:n } }
     \tex_ifodd:D \l at expl@log at functions@bool
       \use:c { __debug_log-functions_on: }
     \else:
@@ -1702,7 +1713,7 @@
     \fi:
   }
   { }
-\__debug:TF
+\__kernel_debug:TF
   {
     \cs_set_protected:Npn \__debug_deprecation_on:
       { \g__debug_deprecation_on_tl }
@@ -1710,15 +1721,22 @@
       { \g__debug_deprecation_off_tl }
     \cs_set_nopar:Npn \g__debug_deprecation_on_tl { }
     \cs_set_nopar:Npn \g__debug_deprecation_off_tl { }
+    \cs_set_protected:Npn \__kernel_deprecation_code:nn #1#2
+      {
+        \tl_gput_right:Nn \g__debug_deprecation_on_tl {#1}
+        \tl_gput_right:Nn \g__debug_deprecation_off_tl {#2}
+      }
   }
-  { }
-\__debug:TF
   {
-    \cs_set_protected:Npn \__debug_deprecation:nnNNpn #1#2#3#4#5#
+    \cs_set_protected:Npn \__kernel_deprecation_code:nn #1#2 { }
+  }
+\__kernel_debug:TF
+  {
+    \cs_set_protected:Npn \__kernel_patch_deprecation:nnNNpn #1#2#3#4#5#
       {
         \if_meaning:w \cs_new_protected:Npn #3
         \else:
-          \__msg_kernel_error:nnx { kernel } { debug-unpatchable }
+          \__kernel_msg_error:nnx { kernel } { debug-unpatchable }
             { \token_to_str:N #3 ~(for~deprecation) }
         \fi:
         \__debug_deprecation_aux:nnNnn {#1} {#2} #4 {#5}
@@ -1737,7 +1755,7 @@
           }
         \cs_new_protected:Npx #3
           {
-            \exp_not:N \__msg_kernel_warning:nnxxx
+            \exp_not:N \__kernel_msg_warning:nnxxx
               { kernel } { deprecated-command }
               {#1} { \token_to_str:N #3 } { \tl_to_str:n {#2} }
             \exp_not:n { \cs_gset_protected:Npn #3 #4 {#5} }
@@ -1745,12 +1763,12 @@
           }
       }
   }
-  { \cs_set_protected:Npn \__debug_deprecation:nnNNpn #1#2 { } }
-\__debug:TF
+  { \cs_set_protected:Npn \__kernel_patch_deprecation:nnNNpn #1#2 { } }
+\__kernel_debug:TF
   {
-    \cs_set_protected:Npn \__debug_patch:nnNNpn #1#2#3#4#5#
+    \cs_set_protected:Npn \__kernel_patch:nnNNpn #1#2#3#4#5#
       { \__debug_patch_aux:nnnn {#1} {#2} { #3 #4 #5 } }
-    \cs_set_protected:Npn \__debug_patch_conditional:nNNpnn #1#2#3#4#
+    \cs_set_protected:Npn \__kernel_patch_conditional:nNNpnn #1#2#3#4#
       { \__debug_patch_auxii:nnnn {#1} { #2 #3 #4 } }
     \cs_set_protected:Npn \__debug_patch_aux:nnnn #1#2#3#4
       { #3 { #1 #4 #2 } }
@@ -1758,18 +1776,18 @@
       { #2 {#3} { #1 #4 } }
   }
   {
-    \cs_set_protected:Npn \__debug_patch:nnNNpn #1#2 { }
-    \cs_set_protected:Npn \__debug_patch_conditional:nNNpnn #1 { }
+    \cs_set_protected:Npn \__kernel_patch:nnNNpn #1#2 { }
+    \cs_set_protected:Npn \__kernel_patch_conditional:nNNpnn #1 { }
   }
-\cs_set_protected:Npn \__debug_patch_args:nNNpn
-  { \__debug_patch_args:nnnNNpn { } { } }
-\cs_set_protected:Npn \__debug_patch_conditional_args:nNNpnn
-  { \__debug_patch_conditional_args:nnnNNpnn { } { } }
-\__debug:TF
+\cs_set_protected:Npn \__kernel_patch_args:nNNpn
+  { \__kernel_patch_args:nnnNNpn { } { } }
+\cs_set_protected:Npn \__kernel_patch_conditional_args:nNNpnn
+  { \__kernel_patch_conditional_args:nnnNNpnn { } { } }
+\__kernel_debug:TF
   {
-    \cs_set_protected:Npn \__debug_patch_args:nnnNNpn #1#2#3#4#5#6#
+    \cs_set_protected:Npn \__kernel_patch_args:nnnNNpn #1#2#3#4#5#6#
       { \__debug_patch_args_aux:nnnNNnn {#1} {#2} {#3} #4 #5 {#6} }
-    \cs_set_protected:Npn \__debug_patch_conditional_args:nnnNNpnn #1#2#3#4#5#6#
+    \cs_set_protected:Npn \__kernel_patch_conditional_args:nnnNNpnn #1#2#3#4#5#6#
       { \__debug_patch_args_aux:nnnNNnnn {#1} {#2} {#3} #4 #5 {#6} }
     \cs_set_protected:Npn \__debug_patch_args_aux:nnnNNnn #1#2#3#4#5#6#7
       {
@@ -1787,8 +1805,8 @@
       { #2 { #3 #1 #4 } }
   }
   {
-    \cs_set_protected:Npn \__debug_patch_args:nnnNNpn #1#2#3 { }
-    \cs_set_protected:Npn \__debug_patch_conditional_args:nnnNNpnn #1#2#3 { }
+    \cs_set_protected:Npn \__kernel_patch_args:nnnNNpn #1#2#3 { }
+    \cs_set_protected:Npn \__kernel_patch_conditional_args:nnnNNpnn #1#2#3 { }
   }
 \cs_set:Npn \prg_return_true:
   { \exp_after:wN \use_i:nn  \exp:w }
@@ -1826,7 +1844,7 @@
       { \__prg_generate_conditional:nnNnnnnn {#1} {#2} #3 {#4} {#5} }
       { \tl_count:n {#2} }
       {
-        \__msg_kernel_error:nnxx { kernel } { bad-number-of-arguments }
+        \__kernel_msg_error:nnxx { kernel } { bad-number-of-arguments }
           { \token_to_str:c { #1 : #2 } }
           { \tl_count:n {#2} }
         \use_none:nn
@@ -1835,7 +1853,7 @@
 \cs_set_protected:Npn \__prg_generate_conditional:nnNnnnnn #1#2#3#4#5#6#7#8
   {
     \if_meaning:w \c_false_bool #3
-      \__msg_kernel_error:nnx { kernel } { missing-colon }
+      \__kernel_msg_error:nnx { kernel } { missing-colon }
         { \token_to_str:c {#1} }
       \exp_after:wN \use_none:nn
     \fi:
@@ -1855,7 +1873,7 @@
     \use:c { __prg_generate_ #7 _form:wnnnnnn }
         \tl_if_empty:nF {#7}
           {
-            \__msg_kernel_error:nnxx
+            \__kernel_msg_error:nnxx
               { kernel } { conditional-form-unknown }
               {#7} { \token_to_str:c { #3 : #4 } }
           }
@@ -1877,7 +1895,7 @@
           { #7 \exp_end: \c_true_bool \c_false_bool }
       }
       {
-        \__msg_kernel_error:nnx { kernel } { protected-predicate }
+        \__kernel_msg_error:nnx { kernel } { protected-predicate }
           { \token_to_str:c { #4 _p: #5 } }
       }
   }
@@ -1918,12 +1936,12 @@
 \cs_set_protected:Npn \__prg_set_eq_conditional:nnNnnNNw #1#2#3#4#5#6
   {
     \if_meaning:w \c_false_bool #3
-      \__msg_kernel_error:nnx { kernel } { missing-colon }
+      \__kernel_msg_error:nnx { kernel } { missing-colon }
         { \token_to_str:c {#1} }
       \exp_after:wN \use_none_delimit_by_q_recursion_stop:w
     \fi:
     \if_meaning:w \c_false_bool #6
-      \__msg_kernel_error:nnx { kernel } { missing-colon }
+      \__kernel_msg_error:nnx { kernel } { missing-colon }
         { \token_to_str:c {#4} }
       \exp_after:wN \use_none_delimit_by_q_recursion_stop:w
     \fi:
@@ -1937,7 +1955,7 @@
     \use:c { __prg_set_eq_conditional_ #6 _form:wNnnnn }
         \tl_if_empty:nF {#6}
           {
-            \__msg_kernel_error:nnxx
+            \__kernel_msg_error:nnxx
               { kernel } { conditional-form-unknown }
               {#6} { \token_to_str:c { #1 : #2 } }
           }
@@ -1946,20 +1964,20 @@
       #5 {#1} {#2} {#3} {#4}
     \__prg_set_eq_conditional_loop:nnnnNw {#1} {#2} {#3} {#4} #5
   }
-\__debug_patch:nnNNpn
-  { \__debug_chk_cs_exist:c { #5 _p : #6    } } { }
+\__kernel_patch:nnNNpn
+  { \__kernel_chk_cs_exist:c { #5 _p : #6    } } { }
 \cs_set:Npn \__prg_set_eq_conditional_p_form:wNnnnn #1 \q_stop #2#3#4#5#6
   { #2 { #3 _p : #4    }    { #5 _p : #6    } }
-\__debug_patch:nnNNpn
-  { \__debug_chk_cs_exist:c { #5    : #6 TF } } { }
+\__kernel_patch:nnNNpn
+  { \__kernel_chk_cs_exist:c { #5    : #6 TF } } { }
 \cs_set:Npn \__prg_set_eq_conditional_TF_form:wNnnnn #1 \q_stop #2#3#4#5#6
   { #2 { #3    : #4 TF }    { #5    : #6 TF } }
-\__debug_patch:nnNNpn
-  { \__debug_chk_cs_exist:c { #5    : #6 T  } } { }
+\__kernel_patch:nnNNpn
+  { \__kernel_chk_cs_exist:c { #5    : #6 T  } } { }
 \cs_set:Npn \__prg_set_eq_conditional_T_form:wNnnnn #1 \q_stop #2#3#4#5#6
   { #2 { #3    : #4 T  }    { #5    : #6 T  } }
-\__debug_patch:nnNNpn
-  { \__debug_chk_cs_exist:c { #5    : #6  F } } { }
+\__kernel_patch:nnNNpn
+  { \__kernel_chk_cs_exist:c { #5    : #6  F } } { }
 \cs_set:Npn \__prg_set_eq_conditional_F_form:wNnnnn #1 \q_stop #2#3#4#5#6
   { #2 { #3    : #4  F }    { #5    : #6  F } }
 \tex_chardef:D \c_true_bool  = 1 ~
@@ -2065,7 +2083,7 @@
   { \cs_if_exist:cTF {#1} { \use:c {#1} #2 } { } }
 \cs_set:Npn \cs_if_exist_use:c #1
   { \cs_if_exist:cTF {#1} { \use:c {#1} } { } }
-\cs_set_protected:Npn \__msg_kernel_error:nnxx #1#2#3#4
+\cs_set_protected:Npn \__kernel_msg_error:nnxx #1#2#3#4
   {
     \tex_newlinechar:D = `\^^J \tex_relax:D
     \tex_errmessage:D
@@ -2078,10 +2096,10 @@
       }
     \tex_end:D
   }
-\cs_set_protected:Npn \__msg_kernel_error:nnx #1#2#3
-  { \__msg_kernel_error:nnxx {#1} {#2} {#3} { } }
-\cs_set_protected:Npn \__msg_kernel_error:nn #1#2
-  { \__msg_kernel_error:nnxx {#1} {#2} { } { } }
+\cs_set_protected:Npn \__kernel_msg_error:nnx #1#2#3
+  { \__kernel_msg_error:nnxx {#1} {#2} {#3} { } }
+\cs_set_protected:Npn \__kernel_msg_error:nn #1#2
+  { \__kernel_msg_error:nnxx {#1} {#2} { } { } }
 \cs_set:Npn \msg_line_context:
   { on~line~ \tex_the:D \tex_inputlineno:D }
 \cs_set_protected:Npn \iow_log:x
@@ -2088,13 +2106,13 @@
   { \tex_immediate:D \tex_write:D -1 }
 \cs_set_protected:Npn \iow_term:x
   { \tex_immediate:D \tex_write:D 16 }
-\__debug_patch:nnNNpn { }
-  { \__debug_log:x { Defining~\token_to_str:N #1~ \msg_line_context: } }
+\__kernel_patch:nnNNpn { }
+  { \__kernel_debug_log:x { Defining~\token_to_str:N #1~ \msg_line_context: } }
 \cs_set_protected:Npn \__chk_if_free_cs:N #1
   {
     \cs_if_free:NF #1
       {
-        \__msg_kernel_error:nnxx { kernel } { command-already-defined }
+        \__kernel_msg_error:nnxx { kernel } { command-already-defined }
           { \token_to_str:N #1 } { \token_to_meaning:N #1 }
       }
   }
@@ -2215,7 +2233,7 @@
   {
     \__cs_parm_from_arg_count:nnF { \use:nnn #2 #1 } {#3}
       {
-        \__msg_kernel_error:nnxx { kernel } { bad-number-of-arguments }
+        \__kernel_msg_error:nnxx { kernel } { bad-number-of-arguments }
           { \token_to_str:N #1 } { \int_eval:n {#3} }
         \use_none:n
       }
@@ -2245,7 +2263,7 @@
         \str_if_eq_x:nnF { }
           { \tl_map_function:nN {#2} \__cs_generate_from_signature:n }
           {
-            \__msg_kernel_error:nnx { kernel } { non-base-function }
+            \__kernel_msg_error:nnx { kernel } { non-base-function }
               { \token_to_str:N #5 }
           }
         \cs_generate_from_arg_count:NNnn
@@ -2252,7 +2270,7 @@
           #5 #4 { \tl_count:n {#2} } {#6}
       }
       {
-        \__msg_kernel_error:nnx { kernel } { missing-colon }
+        \__kernel_msg_error:nnx { kernel } { missing-colon }
           { \token_to_str:N #5 }
       }
   }
@@ -2339,7 +2357,7 @@
     \cs_if_exist:NTF #1
       {#2}
       {
-        \__msg_kernel_error:nnx { kernel } { variable-not-defined }
+        \__kernel_msg_error:nnx { kernel } { variable-not-defined }
           { \token_to_str:N #1 }
       }
   }
@@ -2388,7 +2406,7 @@
 \cs_new_eq:NN \__prg_break_point: \prg_do_nothing:
 \cs_new:Npn \__prg_break: #1 \__prg_break_point: { }
 \cs_new:Npn \__prg_break:n #1#2 \__prg_break_point: {#1}
-%% File: l3expan.dtx Copyright (C) 1990-2017 The LaTeX3 project
+%% File: l3expan.dtx Copyright (C) 1990-2018 The LaTeX3 project
 \cs_new:Npn \__exp_arg_next:nnn #1#2#3 { #2 \::: { #3 {#1} } }
 \cs_new:Npn \__exp_arg_next:Nnn #1#2#3 { #2 \::: { #3 #1 } }
 \cs_new:Npn \::: #1 {#1}
@@ -2440,7 +2458,7 @@
   {
       \fi:
     \fi:
-    \__msg_kernel_expandable_error:nnn { kernel } { bad-variable } {#2}
+    \__kernel_msg_expandable_error:nnn { kernel } { bad-variable } {#2}
     \exp_end:
   }
 \cs_new:Npn \exp_args:NNc #1#2#3
@@ -2674,10 +2692,10 @@
   \tex_catcode:D `\^^@ = 13
   \cs_new_protected:Npn \exp_end_continue_f:w { `^^@ }
   \cs_new:Npn ^^@
-    { \__msg_kernel_expandable_error:nn { kernel } { bad-exp-end-f } }
+    { \__kernel_msg_expandable_error:nn { kernel } { bad-exp-end-f } }
   \cs_new:Npn \exp_end_continue_f:nw #1 { `^^@ #1 }
 \group_end:
-\__debug_patch:nnNNpn { \__debug_chk_cs_exist:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_cs_exist:N #1 } { }
 \cs_new_protected:Npn \cs_generate_variant:Nn #1#2
   {
     \__cs_generate_variant:N #1
@@ -2715,7 +2733,7 @@
 \cs_new_protected:Npn \__cs_generate_variant:nnNN #1#2#3#4
   {
     \if_meaning:w \c_false_bool #3
-      \__msg_kernel_error:nnx { kernel } { missing-colon }
+      \__kernel_msg_error:nnx { kernel } { missing-colon }
         { \token_to_str:c {#1} }
       \exp_after:wN \use_none_delimit_by_q_recursion_stop:w
     \fi:
@@ -2799,7 +2817,7 @@
     \exp_not:n
       {
         \q_mark
-        \__msg_kernel_error:nnxx { kernel } { variant-too-long }
+        \__kernel_msg_error:nnxx { kernel } { variant-too-long }
           {#5} { \token_to_str:N #3 }
         \use_none:nnn
         \q_stop
@@ -2814,7 +2832,7 @@
     \exp_not:n
       {
         \q_mark
-        \__msg_kernel_error:nnxxxx { kernel } { invalid-variant }
+        \__kernel_msg_error:nnxxxx { kernel } { invalid-variant }
           {#7} { \token_to_str:N #5 } {#1} {#2}
         \use_none:nnn
         \q_stop
@@ -2827,12 +2845,13 @@
     #3 \q_stop #4 #5 {#6} {#7}
     \exp_not:n
       {
-        \__cs_generate_variant_loop_warning:nnxxxx { kernel } { invalid-variant }
+        \__cs_generate_variant_loop_warning:nnxxxx
+          { kernel } { deprecated-variant }
           {#7} { \token_to_str:N #5 } {#1} {#2}
       }
   }
 \cs_new_protected:Npn \__cs_generate_variant_loop_warning:nnxxxx
-  { \__msg_kernel_warning:nnxxxx }
+  { \__kernel_msg_warning:nnxxxx }
 \cs_new:Npn \__cs_generate_variant_same:N #1
   {
     \if:w N #1 N \else:
@@ -2844,11 +2863,11 @@
       \fi:
     \fi:
   }
-\__debug_patch:nnNNpn
+\__kernel_patch:nnNNpn
   {
     \cs_if_free:NF #4
       {
-        \__debug_log:x
+        \__kernel_debug_log:x
           {
             Variant~\token_to_str:N #4~%
             already~defined;~ not~ changing~ it~ \msg_line_context:
@@ -2904,7 +2923,7 @@
 \cs_new_protected:Npn \__cs_generate_variant:nnNnn #1#2#3#4#5
   {
     \if_meaning:w \c_false_bool #3
-      \__msg_kernel_error:nnx { kernel } { missing-colon }
+      \__kernel_msg_error:nnx { kernel } { missing-colon }
         { \token_to_str:c {#1} }
       \use_i_delimit_by_q_stop:nw
     \fi:
@@ -2924,7 +2943,7 @@
       \cs_if_exist_use:cTF { __cs_generate_variant_#1_form:nnn }
         { {#3} {#4} {#5} }
         {
-          \__msg_kernel_error:nnxx
+          \__kernel_msg_error:nnxx
             { kernel } { conditional-form-unknown }
             {#1} { \token_to_str:c { #3 : #4 } }
         }
@@ -2939,7 +2958,7 @@
   { \cs_generate_variant:cn { #1 : #2 F } }
 \cs_new_protected:Npn \__cs_generate_variant_TF_form:nnn #1#2
   { \cs_generate_variant:cn { #1 : #2 TF } }
-%% File: l3tl.dtx Copyright (C) 1990-2017 The LaTeX3 Project
+%% File: l3tl.dtx Copyright (C) 1990-2018 The LaTeX3 Project
 \cs_new_protected:Npn \tl_new:N #1
   {
     \__chk_if_free_cs:N #1
@@ -2946,13 +2965,13 @@
     \cs_gset_eq:NN #1 \c_empty_tl
   }
 \cs_generate_variant:Nn \tl_new:N { c }
-\__debug_patch:nnNNpn { \__debug_chk_var_scope:NN c #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_scope:NN c #1 } { }
 \cs_new_protected:Npn \tl_const:Nn #1#2
   {
     \__chk_if_free_cs:N #1
     \cs_gset_nopar:Npx #1 { \exp_not:n {#2} }
   }
-\__debug_patch:nnNNpn { \__debug_chk_var_scope:NN c #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_scope:NN c #1 } { }
 \cs_new_protected:Npn \tl_const:Nx #1#2
   {
     \__chk_if_free_cs:N #1
@@ -2975,14 +2994,14 @@
 \tex_ifodd:D \l at expl@enable at debug@bool
   \cs_new_protected:Npn \tl_set_eq:NN #1#2
     {
-      \__debug_chk_var_local:N #1
-      \__debug_chk_var_exist:N #2
+      \__kernel_chk_var_local:N #1
+      \__kernel_chk_var_exist:N #2
       \cs_set_eq:NN #1 #2
     }
   \cs_new_protected:Npn \tl_gset_eq:NN #1#2
     {
-      \__debug_chk_var_global:N #1
-      \__debug_chk_var_exist:N #2
+      \__kernel_chk_var_global:N #1
+      \__kernel_chk_var_exist:N #2
       \cs_gset_eq:NN #1 #2
     }
 \else:
@@ -2991,18 +3010,18 @@
 \fi:
 \cs_generate_variant:Nn \tl_set_eq:NN { cN, Nc, cc }
 \cs_generate_variant:Nn \tl_gset_eq:NN { cN, Nc, cc }
-\__debug_patch:nnNNpn
+\__kernel_patch:nnNNpn
   {
-    \__debug_chk_var_exist:N #2
-    \__debug_chk_var_exist:N #3
+    \__kernel_chk_var_exist:N #2
+    \__kernel_chk_var_exist:N #3
   }
   { }
 \cs_new_protected:Npn \tl_concat:NNN #1#2#3
   { \tl_set:Nx #1 { \exp_not:o {#2} \exp_not:o {#3} } }
-\__debug_patch:nnNNpn
+\__kernel_patch:nnNNpn
   {
-    \__debug_chk_var_exist:N #2
-    \__debug_chk_var_exist:N #3
+    \__kernel_chk_var_exist:N #2
+    \__kernel_chk_var_exist:N #3
   }
   { }
 \cs_new_protected:Npn \tl_gconcat:NNN #1#2#3
@@ -3022,22 +3041,22 @@
     \tl_const:Nn \c_novalue_tl { ANoValue- }
   }
 \tl_const:Nn \c_space_tl { ~ }
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \tl_set:Nn #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:n {#2} } }
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \tl_set:No #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:o {#2} } }
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \tl_set:Nx #1#2
   { \cs_set_nopar:Npx #1 {#2} }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \tl_gset:Nn #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:n {#2} } }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \tl_gset:No #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:o {#2} } }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \tl_gset:Nx #1#2
   { \cs_gset_nopar:Npx #1 {#2} }
 \cs_generate_variant:Nn \tl_set:Nn  {         NV , Nv , Nf }
@@ -3046,28 +3065,28 @@
 \cs_generate_variant:Nn \tl_gset:Nn {         NV , Nv , Nf }
 \cs_generate_variant:Nn \tl_gset:Nx { c }
 \cs_generate_variant:Nn \tl_gset:Nn { c, co , cV , cv , cf }
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \tl_put_left:Nn #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:n {#2} \exp_not:o #1 } }
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \tl_put_left:NV #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:V #2 \exp_not:o #1 } }
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \tl_put_left:No #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:o {#2} \exp_not:o #1 } }
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \tl_put_left:Nx #1#2
   { \cs_set_nopar:Npx #1 { #2 \exp_not:o #1 } }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \tl_gput_left:Nn #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:n {#2} \exp_not:o #1 } }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \tl_gput_left:NV #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:V #2 \exp_not:o #1 } }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \tl_gput_left:No #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:o {#2} \exp_not:o #1 } }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \tl_gput_left:Nx #1#2
   { \cs_gset_nopar:Npx #1 { #2 \exp_not:o {#1} } }
 \cs_generate_variant:Nn \tl_put_left:Nn  { c }
@@ -3078,28 +3097,28 @@
 \cs_generate_variant:Nn \tl_gput_left:NV { c }
 \cs_generate_variant:Nn \tl_gput_left:No { c }
 \cs_generate_variant:Nn \tl_gput_left:Nx { c }
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \tl_put_right:Nn #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:o #1 \exp_not:n {#2} } }
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \tl_put_right:NV #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:o #1 \exp_not:V #2 } }
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \tl_put_right:No #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:o #1 \exp_not:o {#2} } }
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \tl_put_right:Nx #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:o #1 #2 } }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \tl_gput_right:Nn #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:o #1 \exp_not:n {#2} } }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \tl_gput_right:NV #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:o #1 \exp_not:V #2 } }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \tl_gput_right:No #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:o #1 \exp_not:o {#2} } }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \tl_gput_right:Nx #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:o {#1} #2 } }
 \cs_generate_variant:Nn \tl_put_right:Nn  { c }
@@ -3230,7 +3249,7 @@
   {
     \tl_if_empty:nTF {#6}
       {
-        \__msg_kernel_error:nnx { kernel } { empty-search-pattern }
+        \__kernel_msg_error:nnx { kernel } { empty-search-pattern }
           { \tl_to_str:n {#7} }
       }
       {
@@ -3490,7 +3509,7 @@
   {
     \tl_if_exist:NTF #1 {#1}
       {
-        \__msg_kernel_expandable_error:nnn
+        \__kernel_msg_expandable_error:nnn
           { kernel } { bad-variable } {#1}
       }
   }
@@ -3840,11 +3859,11 @@
 \tl_new:N \g_tmpb_tl
 \tl_new:N \l_tmpa_tl
 \tl_new:N \l_tmpb_tl
-\__debug_deprecation:nnNNpn { 2017-12-31 } { \tex_lowercase:D }
+\__kernel_patch_deprecation:nnNNpn { 2017-12-31 } { \tex_lowercase:D }
 \cs_new_protected:Npn \tl_to_lowercase:n #1 { \tex_lowercase:D {#1} }
-\__debug_deprecation:nnNNpn { 2017-12-31 } { \tex_uppercase:D }
+\__kernel_patch_deprecation:nnNNpn { 2017-12-31 } { \tex_uppercase:D }
 \cs_new_protected:Npn \tl_to_uppercase:n #1 { \tex_uppercase:D {#1} }
-%% File: l3str.dtx Copyright (C) 2011-2017 The LaTeX3 Project
+%% File: l3str.dtx Copyright (C) 2011-2018 The LaTeX3 Project
 \group_begin:
   \cs_set_protected:Npn \__str_tmp:n #1
     {
@@ -3909,7 +3928,7 @@
   {
     \tl_if_empty:nTF {#4}
       {
-        \__msg_kernel_error:nnx { kernel } { empty-search-pattern } {#5}
+        \__kernel_msg_error:nnx { kernel } { empty-search-pattern } {#5}
       }
       {
         \use:x
@@ -4198,7 +4217,7 @@
   }
 \cs_new:Npn \str_item_ignore_spaces:nn #1
   { \exp_args:No \__str_item:nn { \tl_to_str:n {#1} } }
-\__debug_patch_args:nNNpn { {#1} { \__int_eval:n {#2} } }
+\__kernel_patch_args:nNNpn { {#1} { \__int_eval:n {#2} } }
 \cs_new:Npn \__str_item:nn #1#2
   {
     \exp_after:wN \__str_item:w
@@ -4257,7 +4276,7 @@
   }
 \cs_new:Npn \str_range_ignore_spaces:nnn #1
   { \exp_args:No \__str_range:nnn { \tl_to_str:n {#1} } }
-\__debug_patch_args:nNNpn
+\__kernel_patch_args:nNNpn
   { {#1} { \__int_eval:n {#2} } { \__int_eval:n {#3} } }
 \cs_new:Npn \__str_range:nnn #1#2#3
   {
@@ -4624,7 +4643,7 @@
 %% File: l3seq.dtx Copyright (C) 1990-2017 The LaTeX3 Project
 \cs_new:Npn \__seq_item:n
   {
-    \__msg_kernel_expandable_error:nn { kernel } { misused-sequence }
+    \__kernel_msg_expandable_error:nn { kernel } { misused-sequence }
     \use_none:n
   }
 \tl_new:N \l__seq_internal_a_tl
@@ -5070,7 +5089,7 @@
           }
       }
       {
-        \__msg_kernel_expandable_error:nnn
+        \__kernel_msg_expandable_error:nnn
           { kernel } { bad-variable } {#1}
       }
   }
@@ -5139,21 +5158,21 @@
 \seq_new:N \l_tmpb_seq
 \seq_new:N \g_tmpa_seq
 \seq_new:N \g_tmpb_seq
-%% File: l3int.dtx Copyright (C) 1990-2017 The LaTeX3 Project
+%% File: l3int.dtx Copyright (C) 1990-2018 The LaTeX3 Project
 \cs_new_eq:NN \__int_value:w      \tex_number:D
 \cs_new_eq:NN \__int_eval:w       \etex_numexpr:D
 \cs_new_eq:NN \__int_eval_end:    \tex_relax:D
 \cs_new_eq:NN \if_int_odd:w     \tex_ifodd:D
 \cs_new_eq:NN \if_case:w        \tex_ifcase:D
-\__debug_patch_args:nNNpn
-  { { \__debug_chk_expr:nNnN {#1} \__int_eval:w { } \int_eval:n } }
+\__kernel_patch_args:nNNpn
+  { { \__kernel_chk_expr:nNnN {#1} \__int_eval:w { } \int_eval:n } }
 \cs_new:Npn \int_eval:n #1
   { \__int_value:w \__int_eval:w #1 \__int_eval_end: }
-\__debug_patch_args:nNNpn
-  { { \__debug_chk_expr:nNnN {#1} \__int_eval:w { } \__int_eval:n } }
+\__kernel_patch_args:nNNpn
+  { { \__kernel_chk_expr:nNnN {#1} \__int_eval:w { } \__int_eval:n } }
 \cs_new:Npn \__int_eval:n #1 { \__int_eval:w #1 \__int_eval_end: }
-\__debug_patch_args:nNNpn
-  { { \__debug_chk_expr:nNnN {#1} \__int_eval:w { } \int_abs:n } }
+\__kernel_patch_args:nNNpn
+  { { \__kernel_chk_expr:nNnN {#1} \__int_eval:w { } \int_abs:n } }
 \cs_new:Npn \int_abs:n #1
   {
     \__int_value:w \exp_after:wN \__int_abs:N
@@ -5162,10 +5181,10 @@
   }
 \cs_new:Npn \__int_abs:N #1
   { \if_meaning:w - #1 \else: \exp_after:wN #1 \fi: }
-\__debug_patch_args:nNNpn
+\__kernel_patch_args:nNNpn
   {
-    { \__debug_chk_expr:nNnN {#1} \__int_eval:w { } \int_max:nn }
-    { \__debug_chk_expr:nNnN {#2} \__int_eval:w { } \int_max:nn }
+    { \__kernel_chk_expr:nNnN {#1} \__int_eval:w { } \int_max:nn }
+    { \__kernel_chk_expr:nNnN {#2} \__int_eval:w { } \int_max:nn }
   }
 \cs_set:Npn \int_max:nn #1#2
   {
@@ -5175,10 +5194,10 @@
       >
     \exp_stop_f:
   }
-\__debug_patch_args:nNNpn
+\__kernel_patch_args:nNNpn
   {
-    { \__debug_chk_expr:nNnN {#1} \__int_eval:w { } \int_min:nn }
-    { \__debug_chk_expr:nNnN {#2} \__int_eval:w { } \int_min:nn }
+    { \__kernel_chk_expr:nNnN {#1} \__int_eval:w { } \int_min:nn }
+    { \__kernel_chk_expr:nNnN {#2} \__int_eval:w { } \int_min:nn }
   }
 \cs_set:Npn \int_min:nn #1#2
   {
@@ -5196,10 +5215,10 @@
       #2
     \fi:
   }
-\__debug_patch_args:nNNpn
+\__kernel_patch_args:nNNpn
   {
-    { \__debug_chk_expr:nNnN {#1} \__int_eval:w { } \int_div_truncate:nn }
-    { \__debug_chk_expr:nNnN {#2} \__int_eval:w { } \int_div_truncate:nn }
+    { \__kernel_chk_expr:nNnN {#1} \__int_eval:w { } \int_div_truncate:nn }
+    { \__kernel_chk_expr:nNnN {#2} \__int_eval:w { } \int_div_truncate:nn }
   }
 \cs_new:Npn \int_div_truncate:nn #1#2
   {
@@ -5224,10 +5243,10 @@
   }
 \cs_new:Npn \int_div_round:nn #1#2
   { \__int_value:w \__int_eval:w ( #1 ) / ( #2 ) \__int_eval_end: }
-\__debug_patch_args:nNNpn
+\__kernel_patch_args:nNNpn
   {
-    { \__debug_chk_expr:nNnN {#1} \__int_eval:w { } \int_mod:nn }
-    { \__debug_chk_expr:nNnN {#2} \__int_eval:w { } \int_mod:nn }
+    { \__kernel_chk_expr:nNnN {#1} \__int_eval:w { } \int_mod:nn }
+    { \__kernel_chk_expr:nNnN {#2} \__int_eval:w { } \int_mod:nn }
   }
 \cs_new:Npn \int_mod:nn #1#2
   {
@@ -5244,10 +5263,10 @@
     \cs:w newcount \cs_end: #1
   }
 \cs_generate_variant:Nn \int_new:N { c }
-\__debug_patch_args:nnnNNpn
-  { \__debug_chk_var_scope:NN c #1 }
+\__kernel_patch_args:nnnNNpn
+  { \__kernel_chk_var_scope:NN c #1 }
   { }
-  { {#1} { \__debug_chk_expr:nNnN {#2} \__int_eval:w { } \int_const:Nn } }
+  { {#1} { \__kernel_chk_expr:nNnN {#2} \__int_eval:w { } \int_const:Nn } }
 \cs_new_protected:Npn \int_const:Nn #1#2
   {
     \int_compare:nNnTF {#2} < \c_zero
@@ -5282,9 +5301,9 @@
   \cs_new_eq:NN \__int_constdef:Nw \tex_mathchardef:D
   \tex_mathchardef:D \c__max_constdef_int 32767 ~
 \fi:
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \int_zero:N  #1 { #1 = \c_zero }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \int_gzero:N #1 { \tex_global:D #1 = \c_zero }
 \cs_generate_variant:Nn \int_zero:N  { c }
 \cs_generate_variant:Nn \int_gzero:N { c }
@@ -5294,10 +5313,10 @@
   { \int_if_exist:NTF #1 { \int_gzero:N #1 } { \int_new:N #1 } }
 \cs_generate_variant:Nn \int_zero_new:N  { c }
 \cs_generate_variant:Nn \int_gzero_new:N { c }
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \int_set_eq:NN #1#2 { #1 = #2 }
 \cs_generate_variant:Nn \int_set_eq:NN { c , Nc , cc }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \int_gset_eq:NN #1#2 { \tex_global:D #1 = #2 }
 \cs_generate_variant:Nn \int_gset_eq:NN { c , Nc , cc }
 \prg_new_eq_conditional:NNn \int_if_exist:N \cs_if_exist:N
@@ -5306,22 +5325,22 @@
   { TF , T , F , p }
 \cs_set_protected:Npn \__int_tmp:w #1#2#3
   {
-    \__debug_patch_args:nnnNNpn
+    \__kernel_patch_args:nnnNNpn
       { #1 ##1 }
       { }
-      { {##1} { \__debug_chk_expr:nNnN {##2} \__int_eval:w { } #3 } }
+      { {##1} { \__kernel_chk_expr:nNnN {##2} \__int_eval:w { } #3 } }
     #2 #3
   }
-\__int_tmp:w \__debug_chk_var_local:N
+\__int_tmp:w \__kernel_chk_var_local:N
 \cs_new_protected:Npn \int_add:Nn #1#2
   { \tex_advance:D #1 by \__int_eval:w #2 \__int_eval_end: }
-\__int_tmp:w \__debug_chk_var_local:N
+\__int_tmp:w \__kernel_chk_var_local:N
 \cs_new_protected:Npn \int_sub:Nn #1#2
   { \tex_advance:D #1 by - \__int_eval:w #2 \__int_eval_end: }
-\__int_tmp:w \__debug_chk_var_global:N
+\__int_tmp:w \__kernel_chk_var_global:N
 \cs_new_protected:Npn \int_gadd:Nn #1#2
   { \tex_global:D \tex_advance:D #1 by \__int_eval:w #2 \__int_eval_end: }
-\__int_tmp:w \__debug_chk_var_global:N
+\__int_tmp:w \__kernel_chk_var_global:N
 \cs_new_protected:Npn \int_gsub:Nn #1#2
   { \tex_global:D \tex_advance:D #1 by - \__int_eval:w #2 \__int_eval_end: }
 \cs_generate_variant:Nn \int_add:Nn  { c }
@@ -5328,16 +5347,16 @@
 \cs_generate_variant:Nn \int_gadd:Nn { c }
 \cs_generate_variant:Nn \int_sub:Nn  { c }
 \cs_generate_variant:Nn \int_gsub:Nn { c }
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \int_incr:N #1
   { \tex_advance:D #1 \c_one }
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \int_decr:N #1
   { \tex_advance:D #1 - \c_one }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \int_gincr:N #1
   { \tex_global:D \tex_advance:D #1 \c_one }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \int_gdecr:N #1
   { \tex_global:D \tex_advance:D #1 - \c_one }
 \cs_generate_variant:Nn \int_incr:N  { c }
@@ -5344,10 +5363,10 @@
 \cs_generate_variant:Nn \int_decr:N  { c }
 \cs_generate_variant:Nn \int_gincr:N { c }
 \cs_generate_variant:Nn \int_gdecr:N { c }
-\__int_tmp:w \__debug_chk_var_local:N
+\__int_tmp:w \__kernel_chk_var_local:N
 \cs_new_protected:Npn \int_set:Nn #1#2
   { #1 ~ \__int_eval:w #2 \__int_eval_end: }
-\__int_tmp:w \__debug_chk_var_global:N
+\__int_tmp:w \__kernel_chk_var_global:N
 \cs_new_protected:Npn \int_gset:Nn #1#2
   { \tex_global:D #1 ~ \__int_eval:w #2 \__int_eval_end: }
 \cs_generate_variant:Nn \int_set:Nn  { c }
@@ -5365,7 +5384,7 @@
   {
     { }
     \c_zero \fi:
-    \__msg_kernel_expandable_error:nnn
+    \__kernel_msg_expandable_error:nnn
       { kernel } { unknown-comparison } {#1}
     \prg_return_false:
   }
@@ -5422,11 +5441,11 @@
   { \__int_compare:nnN { \if_int_compare:w } {#3} > }
 \cs_new:cpn { __int_compare_>=:NNw } #1#2#3 >=
   { \__int_compare:nnN { \if_int_compare:w } {#3} < }
-\__debug_patch_conditional_args:nNNpnn
+\__kernel_patch_conditional_args:nNNpnn
   {
-    { \__debug_chk_expr:nNnN {#1} \__int_eval:w { } \int_compare:nNn }
+    { \__kernel_chk_expr:nNnN {#1} \__int_eval:w { } \int_compare:nNn }
     { \__int_eval_end: #2 }
-    { \__debug_chk_expr:nNnN {#3} \__int_eval:w { } \int_compare:nNn }
+    { \__kernel_chk_expr:nNnN {#3} \__int_eval:w { } \int_compare:nNn }
   }
 \prg_new_conditional:Npnn \int_compare:nNn #1#2#3 { p , T , F , TF }
   {
@@ -5465,8 +5484,8 @@
       { \__int_case:nw {#1} }
   }
 \cs_new_eq:NN \__int_case_end:nw \__prg_case_end:nw
-\__debug_patch_conditional_args:nNNpnn
-  { { \__debug_chk_expr:nNnN {#1} \__int_eval:w { } \int_if_odd:n } }
+\__kernel_patch_conditional_args:nNNpnn
+  { { \__kernel_chk_expr:nNnN {#1} \__int_eval:w { } \int_if_odd:n } }
 \prg_new_conditional:Npnn \int_if_odd:n #1 { p , T , F , TF}
   {
     \if_int_odd:w \__int_eval:w #1 \__int_eval_end:
@@ -5475,8 +5494,8 @@
       \prg_return_false:
     \fi:
   }
-\__debug_patch_conditional_args:nNNpnn
-  { { \__debug_chk_expr:nNnN {#1} \__int_eval:w { } \int_if_even:n } }
+\__kernel_patch_conditional_args:nNNpnn
+  { { \__kernel_chk_expr:nNnN {#1} \__int_eval:w { } \int_if_even:n } }
 \prg_new_conditional:Npnn \int_if_even:n #1 { p , T , F , TF}
   {
     \if_int_odd:w \__int_eval:w #1 \__int_eval_end:
@@ -5541,11 +5560,11 @@
     \int_compare:nNnF {#1} #2 {#3}
       { \int_do_until:nNnn {#1} #2 {#3} {#4} }
   }
-\__debug_patch_args:nNNpn
+\__kernel_patch_args:nNNpn
   {
-    { \__debug_chk_expr:nNnN {#1} \__int_eval:w { } \int_step_function:nnnN }
-    { \__debug_chk_expr:nNnN {#2} \__int_eval:w { } \int_step_function:nnnN }
-    { \__debug_chk_expr:nNnN {#3} \__int_eval:w { } \int_step_function:nnnN }
+    { \__kernel_chk_expr:nNnN {#1} \__int_eval:w { } \int_step_function:nnnN }
+    { \__kernel_chk_expr:nNnN {#2} \__int_eval:w { } \int_step_function:nnnN }
+    { \__kernel_chk_expr:nNnN {#3} \__int_eval:w { } \int_step_function:nnnN }
   }
 \cs_new:Npn \int_step_function:nnnN #1#2#3
   {
@@ -5561,7 +5580,7 @@
       {
         \int_compare:nNnTF {#2} = \c_zero
           {
-            \__msg_kernel_expandable_error:nnn { kernel } { zero-step } {#4}
+            \__kernel_msg_expandable_error:nnn { kernel } { zero-step } {#4}
             \use_none:nnnn
           }
           { \__int_step:NnnnN < }
@@ -6005,14 +6024,9 @@
 \int_new:N \g_tmpb_int
 \cs_gset_eq:NN \c__deprecation_minus_one \m at ne
 \cs_new_eq:NN \c_minus_one \c__deprecation_minus_one
-\__debug:TF
-  {
-    \tl_gput_right:Nn \g__debug_deprecation_on_tl
-      { \__deprecation_error:Nnn \c_minus_one { -1 } { 2018-12-31 } }
-    \tl_gput_right:Nn \g__debug_deprecation_off_tl
-      { \tex_let:D \c_minus_one \c__deprecation_minus_one }
-  }
-  { }
+\__kernel_deprecation_code:nn
+  { \__deprecation_error:Nnn \c_minus_one { -1 } { 2018-12-31 } }
+  { \tex_let:D \c_minus_one \c__deprecation_minus_one }
 %% File: l3intarray.dtx Copyright (C) 2017 The LaTeX3 Project
 \int_new:N \g__intarray_font_int
 \cs_new_protected:Npn \__intarray_new:Nn #1#2
@@ -6041,7 +6055,7 @@
         \int_compare:nTF { - \c_max_dim <= \int_abs:n {#3} <= \c_max_dim }
           { \__intarray_gset_fast:Nnn #1 {#2} {#3} }
           {
-            \__msg_kernel_error:nnxxxx { kernel } { overflow }
+            \__kernel_msg_error:nnxxxx { kernel } { overflow }
               { \token_to_str:N #1 } {#2} {#3}
               { \int_compare:nNnT {#3} < 0 { - } \__int_value:w \c_max_dim }
             \__intarray_gset_fast:Nnn #1 {#2}
@@ -6049,7 +6063,7 @@
           }
       }
       {
-        \__msg_kernel_error:nnxxx { kernel } { out-of-bounds }
+        \__kernel_msg_error:nnxxx { kernel } { out-of-bounds }
           { \token_to_str:N #1 } {#2} { \__intarray_count:N #1 }
       }
   }
@@ -6062,19 +6076,19 @@
     \int_compare:nTF { 1 <= #2 <= \__intarray_count:N #1 }
       { \__intarray_item_fast:Nn #1 {#2} }
       {
-        \__msg_kernel_expandable_error:nnnnn { kernel } { out-of-bounds }
+        \__kernel_msg_expandable_error:nnnnn { kernel } { out-of-bounds }
           { \token_to_str:N #1 } {#2} { \__intarray_count:N #1 }
         0
       }
   }
-%% File: l3flag.dtx Copyright (C) 2011-2017 The LaTeX3 Project
+%% File: l3flag.dtx Copyright (C) 2011-2018 The LaTeX3 Project
 \cs_new_protected:Npn \flag_new:n #1
   {
     \cs_new:cpn { flag~#1 } ##1 ;
       { \exp_after:wN \use_none:n \cs:w flag~#1~##1 \cs_end: }
   }
-\__debug_patch:nnNNpn
-  { \exp_args:Nc \__debug_chk_var_exist:N { flag~#1 } } { }
+\__kernel_patch:nnNNpn
+  { \exp_args:Nc \__kernel_chk_var_exist:N { flag~#1 } } { }
 \cs_new_protected:Npn \flag_clear:n #1 { \__flag_clear:wn 0 ; {#1} }
 \cs_new_protected:Npn \__flag_clear:wn #1 ; #2
   {
@@ -6104,7 +6118,7 @@
     {
       \flag_if_exist:nF {#1}
         {
-          \__msg_kernel_expandable_error:nnn
+          \__kernel_msg_expandable_error:nnn
             { kernel } { bad-variable } { flag~#1~ }
         }
     }
@@ -6114,7 +6128,7 @@
     \cs_if_exist:cTF { flag~#1 }
       { \prg_return_true: } { \prg_return_false: }
   }
-\__debug_patch_conditional:nNNpnn { \__flag_chk_exist:n {#1} }
+\__kernel_patch_conditional:nNNpnn { \__flag_chk_exist:n {#1} }
 \prg_new_conditional:Npnn \flag_if_raised:n #1 { p , T , F , TF }
   {
     \if_cs_exist:w flag~#1~0 \cs_end:
@@ -6123,7 +6137,7 @@
       \prg_return_false:
     \fi:
   }
-\__debug_patch:nnNNpn { \__flag_chk_exist:n {#1} } { }
+\__kernel_patch:nnNNpn { \__flag_chk_exist:n {#1} } { }
 \cs_new:Npn \flag_height:n #1 { \__flag_height_loop:wn 0; {#1} }
 \cs_new:Npn \__flag_height_loop:wn #1 ; #2
   {
@@ -6140,8 +6154,8 @@
     \cs:w flag~#1 \exp_after:wN \cs_end:
     \__int_value:w \flag_height:n {#1} ;
   }
-%% File: l3quark.dtx Copyright (C) 1990-2017 The LaTeX3 Project
-\__debug_patch:nnNNpn { \__debug_chk_var_scope:NN q #1 } { }
+%% File: l3quark.dtx Copyright (C) 1990-2018 The LaTeX3 Project
+\__kernel_patch:nnNNpn { \__kernel_chk_var_scope:NN q #1 } { }
 \cs_new_protected:Npn \quark_new:N #1
   {
     \__chk_if_free_cs:N #1
@@ -6237,7 +6251,7 @@
   {
     \tl_if_in:NnTF \g__scan_marks_tl { #1 }
       {
-        \__msg_kernel_error:nnx { kernel } { scanmark-already-defined }
+        \__kernel_msg_error:nnx { kernel } { scanmark-already-defined }
           { \token_to_str:N #1 }
       }
       {
@@ -6248,21 +6262,21 @@
 \__scan_new:N \s__stop
 \cs_new:Npn \__use_none_delimit_by_s__stop:w #1 \s__stop { }
 \__scan_new:N \s__seq
-%% File: l3prg.dtx Copyright (C) 2005-2017 The LaTeX3 Project
+%% File: l3prg.dtx Copyright (C) 2005-2018 The LaTeX3 Project
 \cs_new_eq:NN \if_bool:N      \tex_ifodd:D
 \cs_new_eq:NN \if_predicate:w \tex_ifodd:D
 \cs_new_protected:Npn \bool_new:N #1 { \cs_new_eq:NN #1 \c_false_bool }
 \cs_generate_variant:Nn \bool_new:N { c }
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \bool_set_true:N #1
   { \cs_set_eq:NN #1 \c_true_bool }
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \bool_set_false:N #1
   { \cs_set_eq:NN #1 \c_false_bool }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \bool_gset_true:N #1
   { \cs_gset_eq:NN #1 \c_true_bool }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \bool_gset_false:N #1
   { \cs_gset_eq:NN #1 \c_false_bool }
 \cs_generate_variant:Nn \bool_set_true:N   { c }
@@ -6273,10 +6287,10 @@
 \cs_new_eq:NN \bool_gset_eq:NN \tl_gset_eq:NN
 \cs_generate_variant:Nn \bool_set_eq:NN { Nc, cN, cc }
 \cs_generate_variant:Nn \bool_gset_eq:NN { Nc, cN, cc }
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \bool_set:Nn #1#2
   { \tex_chardef:D #1 = \bool_if_p:n {#2} }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \bool_gset:Nn #1#2
   { \tex_global:D \tex_chardef:D #1 = \bool_if_p:n {#2} }
 \cs_generate_variant:Nn \bool_set:Nn  { c }
@@ -6478,7 +6492,7 @@
 \cs_new:cpn { __prg_replicate_first_-:n } #1
   {
     \exp_end:
-    \__msg_kernel_expandable_error:nn { kernel } { negative-replication }
+    \__kernel_msg_expandable_error:nn { kernel } { negative-replication }
   }
 \cs_new:cpn { __prg_replicate_first_0:n } #1 { \exp_end: }
 \cs_new:cpn { __prg_replicate_first_1:n } #1 { \exp_end: #1 }
@@ -6940,7 +6954,7 @@
           }
       }
       {
-        \__msg_kernel_expandable_error:nnn
+        \__kernel_msg_expandable_error:nnn
           { kernel } { bad-variable } {#1}
       }
   }
@@ -7040,7 +7054,7 @@
 \clist_new:N \l_tmpb_clist
 \clist_new:N \g_tmpa_clist
 \clist_new:N \g_tmpb_clist
-%% File: l3token.dtx Copyright (C) 2005-2017 The LaTeX3 Project
+%% File: l3token.dtx Copyright (C) 2005-2018 The LaTeX3 Project
 \cs_new_protected:Npn \char_set_catcode:nn #1#2
   { \tex_catcode:D \__int_eval:n {#1} = \__int_eval:n {#2} }
 \cs_new:Npn \char_value_catcode:n #1
@@ -7161,7 +7175,7 @@
 \cs_generate_variant:Nn \char_gset_active_eq:NN { Nc }
 \cs_generate_variant:Nn \char_set_active_eq:nN  { nc }
 \cs_generate_variant:Nn \char_gset_active_eq:nN { nc }
-\__debug_patch_args:nNNpn { { \__int_eval:n {#1} } { \__int_eval:n {#2} } }
+\__kernel_patch_args:nNNpn { { \__int_eval:n {#1} } { \__int_eval:n {#2} } }
 \cs_new:Npn \char_generate:nn #1#2
   {
     \exp:w \exp_after:wN \__char_generate_aux:w
@@ -7177,13 +7191,13 @@
 \cs_new:Npn \__char_generate_aux:w #1 ; #2 ;
   {
     \if_int_compare:w #2 = 13 \exp_stop_f:
-      \__msg_kernel_expandable_error:nn { kernel } { char-active }
+      \__kernel_msg_expandable_error:nn { kernel } { char-active }
     \else:
       \if_int_compare:w #2 = 10 \exp_stop_f:
         \if_int_compare:w #1 =  0 \exp_stop_f:
-          \__msg_kernel_expandable_error:nn { kernel } { char-null-space }
+          \__kernel_msg_expandable_error:nn { kernel } { char-null-space }
         \else:
-          \__msg_kernel_expandable_error:nn { kernel } { char-space }
+          \__kernel_msg_expandable_error:nn { kernel } { char-space }
         \fi:
       \else:
         \if_int_odd:w 0
@@ -7191,13 +7205,13 @@
             \if_int_compare:w #2 = 5  \exp_stop_f: 1 \fi:
             \if_int_compare:w #2 = 9  \exp_stop_f: 1 \fi:
             \if_int_compare:w #2 > 13 \exp_stop_f: 1 \fi: \exp_stop_f:
-          \__msg_kernel_expandable_error:nn { kernel }
+          \__kernel_msg_expandable_error:nn { kernel }
             { char-invalid-catcode }
         \else:
           \if_int_odd:w 0
             \if_int_compare:w #1 < 0 \exp_stop_f: 1 \fi:
             \if_int_compare:w #1 > \c__char_max_int 1 \fi: \exp_stop_f:
-            \__msg_kernel_expandable_error:nn { kernel }
+            \__kernel_msg_expandable_error:nn { kernel }
               { char-out-of-range }
           \else:
             \__char_generate_aux:nnw {#1} {#2}
@@ -7749,12 +7763,12 @@
       }
       { \scan_stop: }
   }
-\__debug_deprecation:nnNNpn { 2018-12-31 } { \cs_new_eq:NN }
+\__kernel_patch_deprecation:nnNNpn { 2018-12-31 } { \cs_new_eq:NN }
 \cs_new_protected:Npn \token_new:Nn #1#2 { \cs_new_eq:NN #1 #2 }
 %% File: l3prop.dtx Copyright (C) 1990-2017 The LaTeX3 Project
 \__scan_new:N \s__prop
 \cs_new:Npn \__prop_pair:wn #1 \s__prop #2
-  { \__msg_kernel_expandable_error:nn { kernel } { misused-prop } }
+  { \__kernel_msg_expandable_error:nn { kernel } { misused-prop } }
 \tl_new:N \l__prop_internal_tl
 \tl_const:Nn \c_empty_prop { \s__prop }
 \cs_new_protected:Npn \prop_new:N #1
@@ -7829,7 +7843,7 @@
             \s__prop { \exp_not:n {#1} }
           }
           {
-            \exp_args:Nnno \__msg_kernel_expandable_error:nnn
+            \exp_args:Nnno \__kernel_msg_expandable_error:nnn
               { kernel } { prop-keyval } {#4}
           }
       }
@@ -8058,7 +8072,7 @@
           { } { }
       }
   }
-%% File: l3msg.dtx Copyright (C) 2009-2017 The LaTeX3 Project
+%% File: l3msg.dtx Copyright (C) 2009-2018 The LaTeX3 Project
 \tl_new:N \l__msg_internal_tl
 \bool_new:N \l__msg_line_context_bool
 \tl_const:Nn \c__msg_text_prefix_tl      { msg~text~>~ }
@@ -8068,13 +8082,13 @@
     \cs_if_exist:cTF { \c__msg_text_prefix_tl #1 / #2 }
       { \prg_return_true: } { \prg_return_false: }
   }
-\__debug_patch:nnNNpn { }
-  { \__debug_log:x { Defining~message~ #1 / #2 ~\msg_line_context: } }
+\__kernel_patch:nnNNpn { }
+  { \__kernel_debug_log:x { Defining~message~ #1 / #2 ~\msg_line_context: } }
 \cs_new_protected:Npn \__chk_if_free_msg:nn #1#2
   {
     \msg_if_exist:nnT {#1} {#2}
       {
-        \__msg_kernel_error:nnxx { kernel } { message-already-defined }
+        \__kernel_msg_error:nnxx { kernel } { message-already-defined }
           {#1} {#2}
       }
   }
@@ -8392,7 +8406,7 @@
 \cs_new:Npn \__msg_class_chk_exist:nT #1
   {
     \cs_if_free:cTF { __msg_ #1 _code:nnnnnn }
-      { \__msg_kernel_error:nnx { kernel } { message-class-unknown } {#1} }
+      { \__kernel_msg_error:nnx { kernel } { message-class-unknown } {#1} }
   }
 \tl_new:N \l__msg_class_tl
 \tl_new:N \l__msg_current_class_tl
@@ -8417,7 +8431,7 @@
             \__msg_use_redirect_name:n { #2 / #3 }
           }
       }
-      { \__msg_kernel_error:nnxx { kernel } { message-unknown } {#2} {#3} }
+      { \__kernel_msg_error:nnxx { kernel } { message-unknown } {#2} {#3} }
   }
 \cs_new_protected:Npn \__msg_use_code: { }
 \cs_new_protected:Npn \__msg_use_redirect_name:n #1
@@ -8504,7 +8518,7 @@
             \tl_if_eq:NNTF \l__msg_class_tl \l__msg_current_class_tl
               {
                 \prop_put:cnn { l__msg_redirect_ #2 _prop } {#3} {#2}
-                \__msg_kernel_warning:nnxxxx
+                \__kernel_msg_warning:nnxxxx
                   { kernel } { message-redirect-loop }
                   { \seq_item:Nn \l__msg_class_loop_seq { 1 } }
                   { \seq_item:Nn \l__msg_class_loop_seq { 2 } }
@@ -8521,20 +8535,20 @@
   }
 \cs_generate_variant:Nn \__msg_redirect_loop_chk:nnn { o }
 \cs_new:Npn \__msg_redirect_loop_list:n #1 { {#1} ~ => ~ }
-\cs_new_protected:Npn \__msg_kernel_new:nnnn #1#2
+\cs_new_protected:Npn \__kernel_msg_new:nnnn #1#2
   { \msg_new:nnnn { LaTeX } { #1 / #2 } }
-\cs_new_protected:Npn \__msg_kernel_new:nnn #1#2
+\cs_new_protected:Npn \__kernel_msg_new:nnn #1#2
   { \msg_new:nnn { LaTeX } { #1 / #2 } }
-\cs_new_protected:Npn \__msg_kernel_set:nnnn #1#2
+\cs_new_protected:Npn \__kernel_msg_set:nnnn #1#2
   { \msg_set:nnnn { LaTeX } { #1 / #2 } }
-\cs_new_protected:Npn \__msg_kernel_set:nnn #1#2
+\cs_new_protected:Npn \__kernel_msg_set:nnn #1#2
   { \msg_set:nnn { LaTeX } { #1 / #2 } }
 \group_begin:
   \cs_set_protected:Npn \__msg_kernel_class_new:nN #1
-    { \__msg_kernel_class_new_aux:nN { kernel_ #1 } }
+    { \__msg_kernel_class_new_aux:nN { __kernel_msg_ #1 } }
   \cs_set_protected:Npn \__msg_kernel_class_new_aux:nN #1#2
     {
-      \cs_new_protected:cpn { __msg_ #1 :nnnnnn } ##1##2##3##4##5##6
+      \cs_new_protected:cpn { #1 :nnnnnn } ##1##2##3##4##5##6
         {
           \use:x
             {
@@ -8543,39 +8557,39 @@
                 { \tl_to_str:n {##5} } { \tl_to_str:n {##6} }
             }
         }
-      \cs_new_protected:cpx { __msg_ #1 :nnnnn } ##1##2##3##4##5
-        { \exp_not:c { __msg_ #1 :nnnnnn } {##1} {##2} {##3} {##4} {##5} { } }
-      \cs_new_protected:cpx { __msg_ #1 :nnnn } ##1##2##3##4
-        { \exp_not:c { __msg_ #1 :nnnnnn } {##1} {##2} {##3} {##4} { } { } }
-      \cs_new_protected:cpx { __msg_ #1 :nnn } ##1##2##3
-        { \exp_not:c { __msg_ #1 :nnnnnn } {##1} {##2} {##3} { } { } { } }
-      \cs_new_protected:cpx { __msg_ #1 :nn } ##1##2
-        { \exp_not:c { __msg_ #1 :nnnnnn } {##1} {##2} { } { } { } { } }
-      \cs_new_protected:cpx { __msg_ #1 :nnxxxx } ##1##2##3##4##5##6
+      \cs_new_protected:cpx { #1 :nnnnn } ##1##2##3##4##5
+        { \exp_not:c { #1 :nnnnnn } {##1} {##2} {##3} {##4} {##5} { } }
+      \cs_new_protected:cpx { #1 :nnnn } ##1##2##3##4
+        { \exp_not:c { #1 :nnnnnn } {##1} {##2} {##3} {##4} { } { } }
+      \cs_new_protected:cpx { #1 :nnn } ##1##2##3
+        { \exp_not:c { #1 :nnnnnn } {##1} {##2} {##3} { } { } { } }
+      \cs_new_protected:cpx { #1 :nn } ##1##2
+        { \exp_not:c { #1 :nnnnnn } {##1} {##2} { } { } { } { } }
+      \cs_new_protected:cpx { #1 :nnxxxx } ##1##2##3##4##5##6
         {
           \use:x
             {
               \exp_not:N \exp_not:n
-                { \exp_not:c { __msg_ #1 :nnnnnn } {##1} {##2} }
+                { \exp_not:c { #1 :nnnnnn } {##1} {##2} }
                 {##3} {##4} {##5} {##6}
             }
         }
-      \cs_new_protected:cpx { __msg_ #1 :nnxxx } ##1##2##3##4##5
-        { \exp_not:c { __msg_ #1 :nnxxxx } {##1} {##2} {##3} {##4} {##5} { } }
-      \cs_new_protected:cpx { __msg_ #1 :nnxx } ##1##2##3##4
-        { \exp_not:c { __msg_ #1 :nnxxxx } {##1} {##2} {##3} {##4} { } { } }
-      \cs_new_protected:cpx { __msg_ #1 :nnx } ##1##2##3
-        { \exp_not:c { __msg_ #1 :nnxxxx } {##1} {##2} {##3} { } { } { } }
+      \cs_new_protected:cpx { #1 :nnxxx } ##1##2##3##4##5
+        { \exp_not:c { #1 :nnxxxx } {##1} {##2} {##3} {##4} {##5} { } }
+      \cs_new_protected:cpx { #1 :nnxx } ##1##2##3##4
+        { \exp_not:c { #1 :nnxxxx } {##1} {##2} {##3} {##4} { } { } }
+      \cs_new_protected:cpx { #1 :nnx } ##1##2##3
+        { \exp_not:c { #1 :nnxxxx } {##1} {##2} {##3} { } { } { } }
     }
   \__msg_kernel_class_new:nN { fatal } \__msg_fatal_code:nnnnnn
-  \cs_undefine:N \__msg_kernel_error:nnxx
-  \cs_undefine:N \__msg_kernel_error:nnx
-  \cs_undefine:N \__msg_kernel_error:nn
+  \cs_undefine:N \__kernel_msg_error:nnxx
+  \cs_undefine:N \__kernel_msg_error:nnx
+  \cs_undefine:N \__kernel_msg_error:nn
   \__msg_kernel_class_new:nN { error } \__msg_error_code:nnnnnn
   \__msg_kernel_class_new:nN { warning } \msg_warning:nnxxxx
   \__msg_kernel_class_new:nN { info } \msg_info:nnxxxx
 \group_end:
-\__msg_kernel_new:nnnn { kernel } { message-already-defined }
+\__kernel_msg_new:nnnn { kernel } { message-already-defined }
   { Message~'#2'~for~module~'#1'~already~defined. }
   {
     \c__msg_coding_error_text_tl
@@ -8583,7 +8597,7 @@
     by~the~module~'#1':~this~message~already~exists.
     \c__msg_return_text_tl
   }
-\__msg_kernel_new:nnnn { kernel } { message-unknown }
+\__kernel_msg_new:nnnn { kernel } { message-unknown }
   { Unknown~message~'#2'~for~module~'#1'. }
   {
     \c__msg_coding_error_text_tl
@@ -8591,7 +8605,7 @@
     by~the~module~'#1':~this~message~does~not~exist.
     \c__msg_return_text_tl
   }
-\__msg_kernel_new:nnnn { kernel } { message-class-unknown }
+\__kernel_msg_new:nnnn { kernel } { message-class-unknown }
   { Unknown~message~class~'#1'. }
   {
     LaTeX~has~been~asked~to~redirect~messages~to~a~class~'#1':\\
@@ -8598,7 +8612,7 @@
     this~was~never~defined.
     \c__msg_return_text_tl
   }
-\__msg_kernel_new:nnnn { kernel } { message-redirect-loop }
+\__kernel_msg_new:nnnn { kernel } { message-redirect-loop }
   {
     Message~redirection~loop~caused~by~ {#1} ~=>~ {#2}
     \tl_if_empty:nF {#3} { ~for~module~' \use_none:n #3 ' } .
@@ -8609,7 +8623,7 @@
     created~an~infinite~loop\\\\
     \iow_indent:n { #4 \\\\ }
   }
-\__msg_kernel_new:nnnn { kernel } { bad-number-of-arguments }
+\__kernel_msg_new:nnnn { kernel } { bad-number-of-arguments }
   { Function~'#1'~cannot~be~defined~with~#2~arguments. }
   {
     \c__msg_coding_error_text_tl
@@ -8617,17 +8631,17 @@
     #2~arguments.~
     TeX~allows~between~0~and~9~arguments~for~a~single~function.
   }
-\__msg_kernel_new:nnn { kernel } { char-active }
+\__kernel_msg_new:nnn { kernel } { char-active }
   { Cannot~generate~active~chars. }
-\__msg_kernel_new:nnn { kernel } { char-invalid-catcode }
+\__kernel_msg_new:nnn { kernel } { char-invalid-catcode }
   { Invalid~catcode~for~char~generation. }
-\__msg_kernel_new:nnn { kernel } { char-null-space }
+\__kernel_msg_new:nnn { kernel } { char-null-space }
   { Cannot~generate~null~char~as~a~space. }
-\__msg_kernel_new:nnn { kernel } { char-out-of-range }
+\__kernel_msg_new:nnn { kernel } { char-out-of-range }
   { Charcode~requested~out~of~engine~range. }
-\__msg_kernel_new:nnn { kernel } { char-space }
+\__kernel_msg_new:nnn { kernel } { char-space }
   { Cannot~generate~space~chars. }
-\__msg_kernel_new:nnnn { kernel } { command-already-defined }
+\__kernel_msg_new:nnnn { kernel } { command-already-defined }
   { Control~sequence~#1~already~defined. }
   {
     \c__msg_coding_error_text_tl
@@ -8636,7 +8650,7 @@
     The~current~meaning~is:\\
     \ \ #2
   }
-\__msg_kernel_new:nnnn { kernel } { command-not-defined }
+\__kernel_msg_new:nnnn { kernel } { command-not-defined }
   { Control~sequence~#1~undefined. }
   {
     \c__msg_coding_error_text_tl
@@ -8643,12 +8657,12 @@
     LaTeX~has~been~asked~to~use~a~control~sequence~'#1':\\
     this~has~not~been~defined~yet.
   }
-\__msg_kernel_new:nnn { kernel } { deprecated-command }
+\__kernel_msg_new:nnn { kernel } { deprecated-command }
   {
     The~deprecated~command~'#2'~has~been~or~will~be~removed~on~#1.
     \tl_if_empty:nF {#3} { ~Use~instead~'#3'. }
   }
-\__msg_kernel_new:nnnn { kernel } { empty-search-pattern }
+\__kernel_msg_new:nnnn { kernel } { empty-search-pattern }
   { Empty~search~pattern. }
   {
     \c__msg_coding_error_text_tl
@@ -8655,7 +8669,7 @@
     LaTeX~has~been~asked~to~replace~an~empty~pattern~by~'#1':~that~
     would~lead~to~an~infinite~loop!
   }
-\__msg_kernel_new:nnnn { kernel } { out-of-registers }
+\__kernel_msg_new:nnnn { kernel } { out-of-registers }
   { No~room~for~a~new~#1. }
   {
     TeX~only~supports~\int_use:N \c_max_register_int \ %
@@ -8662,7 +8676,7 @@
     of~each~type.~All~the~#1~registers~have~been~used.~
     This~run~will~be~aborted~now.
   }
-\__msg_kernel_new:nnnn { kernel } { non-base-function }
+\__kernel_msg_new:nnnn { kernel } { non-base-function }
   { Function~'#1'~is~not~a~base~function }
   {
     \c__msg_coding_error_text_tl
@@ -8671,7 +8685,7 @@
     To~define~variants~use~\iow_char:N\\cs_generate_variant:Nn~
     and~to~define~other~functions~use~\iow_char:N\\cs_new:Npn.
   }
-\__msg_kernel_new:nnnn { kernel } { missing-colon }
+\__kernel_msg_new:nnnn { kernel } { missing-colon }
   { Function~'#1'~contains~no~':'. }
   {
     \c__msg_coding_error_text_tl
@@ -8680,19 +8694,19 @@
     needed~when~defining~conditionals~or~variants,~or~when~building~a~
     parameter~text~from~the~number~of~arguments~of~the~function.
   }
-\__msg_kernel_new:nnnn { kernel } { overflow }
+\__kernel_msg_new:nnnn { kernel } { overflow }
   { Integers~larger~than~2^{30}-1~cannot~be~stored~in~arrays. }
   {
     An~attempt~was~made~to~store~#3~at~position~#2~in~the~array~'#1'.~
     The~largest~allowed~value~#4~will~be~used~instead.
   }
-\__msg_kernel_new:nnnn { kernel } { out-of-bounds }
+\__kernel_msg_new:nnnn { kernel } { out-of-bounds }
   { Access~to~an~entry~beyond~an~array's~bounds. }
   {
     An~attempt~was~made~to~access~or~store~data~at~position~#2~of~the~
     array~'#1',~but~this~array~has~entries~at~positions~from~1~to~#3.
   }
-\__msg_kernel_new:nnnn { kernel } { protected-predicate }
+\__kernel_msg_new:nnnn { kernel } { protected-predicate }
   { Predicate~'#1'~must~be~expandable. }
   {
     \c__msg_coding_error_text_tl
@@ -8699,7 +8713,7 @@
     LaTeX~has~been~asked~to~define~'#1'~as~a~protected~predicate.~
     Only~expandable~tests~can~have~a~predicate~version.
   }
-\__msg_kernel_new:nnnn { kernel } { conditional-form-unknown }
+\__kernel_msg_new:nnnn { kernel } { conditional-form-unknown }
   { Conditional~form~'#1'~for~function~'#2'~unknown. }
   {
     \c__msg_coding_error_text_tl
@@ -8706,7 +8720,7 @@
     LaTeX~has~been~asked~to~define~the~conditional~form~'#1'~of~
     the~function~'#2',~but~only~'TF',~'T',~'F',~and~'p'~forms~exist.
   }
-\__msg_kernel_new:nnnn { kernel } { scanmark-already-defined }
+\__kernel_msg_new:nnnn { kernel } { scanmark-already-defined }
   { Scan~mark~#1~already~defined. }
   {
     \c__msg_coding_error_text_tl
@@ -8713,7 +8727,7 @@
     LaTeX~has~been~asked~to~create~a~new~scan~mark~'#1'~
     but~this~name~has~already~been~used~for~a~scan~mark.
   }
-\__msg_kernel_new:nnnn { kernel } { variable-not-defined }
+\__kernel_msg_new:nnnn { kernel } { variable-not-defined }
   { Variable~#1~undefined. }
   {
     \c__msg_coding_error_text_tl
@@ -8720,7 +8734,7 @@
     LaTeX~has~been~asked~to~show~a~variable~#1,~but~this~has~not~
     been~defined~yet.
   }
-\__msg_kernel_new:nnnn { kernel } { variant-too-long }
+\__kernel_msg_new:nnnn { kernel } { variant-too-long }
   { Variant~form~'#1'~longer~than~base~signature~of~'#2'. }
   {
     \c__msg_coding_error_text_tl
@@ -8728,7 +8742,7 @@
     with~a~signature~starting~with~'#1',~but~that~is~longer~than~
     the~signature~(part~after~the~colon)~of~'#2'.
   }
-\__msg_kernel_new:nnnn { kernel } { invalid-variant }
+\__kernel_msg_new:nnnn { kernel } { invalid-variant }
   { Variant~form~'#1'~invalid~for~base~form~'#2'. }
   {
     \c__msg_coding_error_text_tl
@@ -8736,9 +8750,20 @@
     with~a~signature~starting~with~'#1',~but~cannot~change~an~argument~
     from~type~'#3'~to~type~'#4'.
   }
+\__kernel_msg_new:nnn { kernel } { deprecated-variant }
+  {
+    Variant~form~'#1'~deprecated~for~base~form~'#2'.~
+    One~should~not~change~an~argument~from~type~'#3'~to~type~'#4'
+    \str_case:nnF {#3}
+      {
+        { n } { :~use~a~'\token_if_eq_charcode:NNTF #4 c v V'~variant? }
+        { N } { :~base~form~only~accepts~a~single~token~argument. }
+        {#4} { :~base~form~is~already~a~variant. }
+      } { . }
+  }
 \bool_if:NTF \l at expl@enable at debug@bool
   {
-    \__msg_kernel_new:nnnn { kernel } { debug }
+    \__kernel_msg_new:nnnn { kernel } { debug }
       { The~debugging~option~'#1'~does~not~exist~\msg_line_context:. }
       {
         The~functions~'\iow_char:N\\debug_on:n'~and~
@@ -8745,8 +8770,8 @@
         '\iow_char:N\\debug_off:n'~only~accept~the~arguments~
         'check-declarations',~'deprecation',~'log-functions',~not~'#1'.
       }
-    \__msg_kernel_new:nnn { kernel } { expr } { '#2'~in~#1 }
-    \__msg_kernel_new:nnnn { kernel } { local-global }
+    \__kernel_msg_new:nnn { kernel } { expr } { '#2'~in~#1 }
+    \__kernel_msg_new:nnnn { kernel } { local-global }
       { Inconsistent~local/global~assignment }
       {
         \c__msg_coding_error_text_tl
@@ -8755,7 +8780,7 @@
         \if:w l #1 local \else: \if:w g #1 global \else: constant \fi: \fi: \
         variable~'#3'.
       }
-    \__msg_kernel_new:nnnn { kernel } { non-declared-variable }
+    \__kernel_msg_new:nnnn { kernel } { non-declared-variable }
       { The~variable~#1~has~not~been~declared~\msg_line_context:. }
       {
         Checking~is~active,~and~you~have~tried~do~so~something~like: \\
@@ -8767,7 +8792,7 @@
       }
   }
   {
-    \__msg_kernel_new:nnnn { kernel } { enable-debug }
+    \__kernel_msg_new:nnnn { kernel } { enable-debug }
       { To~use~'#1'~load~expl3~with~the~'enable-debug'~option. }
       {
         The~function~'#1'~will~be~ignored~because~it~can~only~work~if~
@@ -8777,23 +8802,23 @@
         given~when~loading~expl3.
       }
   }
-\__msg_kernel_new:nnn { kernel } { bad-exp-end-f }
+\__kernel_msg_new:nnn { kernel } { bad-exp-end-f }
   { Misused~\exp_end_continue_f:w or~:nw }
-\__msg_kernel_new:nnn { kernel } { bad-variable }
+\__kernel_msg_new:nnn { kernel } { bad-variable }
   { Erroneous~variable~#1 used! }
-\__msg_kernel_new:nnn { kernel } { misused-sequence }
+\__kernel_msg_new:nnn { kernel } { misused-sequence }
   { A~sequence~was~misused. }
-\__msg_kernel_new:nnn { kernel } { misused-prop }
+\__kernel_msg_new:nnn { kernel } { misused-prop }
   { A~property~list~was~misused. }
-\__msg_kernel_new:nnn { kernel } { negative-replication }
+\__kernel_msg_new:nnn { kernel } { negative-replication }
   { Negative~argument~for~\prg_replicate:nn. }
-\__msg_kernel_new:nnn { kernel } { prop-keyval }
+\__kernel_msg_new:nnn { kernel } { prop-keyval }
   { Missing/extra~'='~in~'#1'~(in~'..._keyval:Nn') }
-\__msg_kernel_new:nnn { kernel } { unknown-comparison }
+\__kernel_msg_new:nnn { kernel } { unknown-comparison }
   { Relation~'#1'~unknown:~use~=,~<,~>,~==,~!=,~<=,~>=. }
-\__msg_kernel_new:nnn { kernel } { zero-step }
+\__kernel_msg_new:nnn { kernel } { zero-step }
   { Zero~step~size~for~step~function~#1. }
-\__msg_kernel_new:nnn { kernel } { show-clist }
+\__kernel_msg_new:nnn { kernel } { show-clist }
   {
     The~comma~list~ \tl_if_empty:nF {#1} { #1 ~ }
     \tl_if_empty:nTF {#2}
@@ -8800,7 +8825,7 @@
       { is~empty \\>~ . }
       { contains~the~items~(without~outer~braces): #2 . }
   }
-\__msg_kernel_new:nnn { kernel } { show-prop }
+\__kernel_msg_new:nnn { kernel } { show-prop }
   {
     The~property~list~#1~
     \tl_if_empty:nTF {#2}
@@ -8807,7 +8832,7 @@
       { is~empty \\>~ . }
       { contains~the~pairs~(without~outer~braces): #2 . }
   }
-\__msg_kernel_new:nnn { kernel } { show-seq }
+\__kernel_msg_new:nnn { kernel } { show-seq }
   {
     The~sequence~#1~
     \tl_if_empty:nTF {#2}
@@ -8814,7 +8839,7 @@
       { is~empty \\>~ . }
       { contains~the~items~(without~outer~braces): #2 . }
   }
-\__msg_kernel_new:nnn { kernel } { show-streams }
+\__kernel_msg_new:nnn { kernel } { show-streams }
   {
     \tl_if_empty:nTF {#2} { No~ } { The~following~ }
     \str_case:nn {#1}
@@ -8842,7 +8867,7 @@
 \exp_args:Ncx \__msg_tmp:w { LaTeX3~error: }
   { \char_generate:nn { `\  } { 7 } }
 \group_end:
-\cs_new:Npn \__msg_kernel_expandable_error:nnnnnn #1#2#3#4#5#6
+\cs_new:Npn \__kernel_msg_expandable_error:nnnnnn #1#2#3#4#5#6
   {
     \exp_args:Nf \__msg_expandable_error:n
       {
@@ -8851,27 +8876,27 @@
           {#3} {#4} {#5} {#6}
       }
   }
-\cs_new:Npn \__msg_kernel_expandable_error:nnnnn #1#2#3#4#5
+\cs_new:Npn \__kernel_msg_expandable_error:nnnnn #1#2#3#4#5
   {
-    \__msg_kernel_expandable_error:nnnnnn
+    \__kernel_msg_expandable_error:nnnnnn
       {#1} {#2} {#3} {#4} {#5} { }
   }
-\cs_new:Npn \__msg_kernel_expandable_error:nnnn #1#2#3#4
+\cs_new:Npn \__kernel_msg_expandable_error:nnnn #1#2#3#4
   {
-    \__msg_kernel_expandable_error:nnnnnn
+    \__kernel_msg_expandable_error:nnnnnn
       {#1} {#2} {#3} {#4} { } { }
   }
-\cs_new:Npn \__msg_kernel_expandable_error:nnn #1#2#3
+\cs_new:Npn \__kernel_msg_expandable_error:nnn #1#2#3
   {
-    \__msg_kernel_expandable_error:nnnnnn
+    \__kernel_msg_expandable_error:nnnnnn
       {#1} {#2} {#3} { } { } { }
   }
-\cs_new:Npn \__msg_kernel_expandable_error:nn #1#2
+\cs_new:Npn \__kernel_msg_expandable_error:nn #1#2
   {
-    \__msg_kernel_expandable_error:nnnnnn
+    \__kernel_msg_expandable_error:nnnnnn
       {#1} {#2} { } { } { } { }
   }
-%% File: l3file.dtx Copyright (C) 1990-2017 The LaTeX3 Project
+%% File: l3file.dtx Copyright (C) 1990-2018 The LaTeX3 Project
 \str_new:N \g_file_curr_dir_str
 \str_new:N \g_file_curr_ext_str
 \str_new:N \g_file_curr_name_str
@@ -8927,7 +8952,7 @@
     \int_if_even:nF
       { 0 \tl_map_function:NN #2 \__file_name_quote_aux:n }
       {
-        \__msg_kernel_error:nnx
+        \__kernel_msg_error:nnx
           { kernel } { unbalanced-quote-in-filename } {#2}
       }
     \tl_remove_all:Nn #2 { " }
@@ -8983,7 +9008,7 @@
 \cs_new_protected:Npn \__file_missing:n #1
   {
     \__file_name_sanitize:nN {#1} \l__file_base_name_str
-    \__msg_kernel_error:nnx { kernel } { file-not-found }
+    \__kernel_msg_error:nnx { kernel } { file-not-found }
       { \l__file_base_name_str }
   }
 \cs_new_protected:Npn \file_input:n #1
@@ -9375,7 +9400,7 @@
   }
 \cs_new_protected:Npn \iow_indent:n #1
   {
-    \__msg_kernel_error:nnnnn { kernel } { iow-indent }
+    \__kernel_msg_error:nnnnn { kernel } { iow-indent }
       { \iow_wrap:nnnN } { \iow_indent:n } {#1}
     #1
   }
@@ -9387,7 +9412,7 @@
   }
 \cs_new:Npn \__iow_indent_error:n #1
   {
-    \__msg_kernel_expandable_error:nnnnn { kernel } { iow-indent }
+    \__kernel_msg_expandable_error:nnnnn { kernel } { iow-indent }
       { \iow_wrap:nnnN } { \iow_indent:n } {#1}
     #1
   }
@@ -9627,19 +9652,19 @@
     \cs_new:Npn \__iow_wrap_trim:w ##1 #1 \q_stop {##1}
   }
 \exp_args:NV \__iow_tmp:w \c_catcode_other_space_tl
-\__msg_kernel_new:nnnn { kernel } { file-not-found }
+\__kernel_msg_new:nnnn { kernel } { file-not-found }
   { File~'#1'~not~found. }
   {
     The~requested~file~could~not~be~found~in~the~current~directory,~
     in~the~TeX~search~path~or~in~the~LaTeX~search~path.
   }
-\__msg_kernel_new:nnn { kernel } { file-list }
+\__kernel_msg_new:nnn { kernel } { file-list }
   {
     >~File~List~<
     #1 \\
     .............
   }
-\__msg_kernel_new:nnnn { kernel } { input-streams-exhausted }
+\__kernel_msg_new:nnnn { kernel } { input-streams-exhausted }
   { Input~streams~exhausted }
   {
     TeX~can~only~open~up~to~16~input~streams~at~one~time.\\
@@ -9646,7 +9671,7 @@
     All~16~are~currently~in~use,~and~something~wanted~to~open~
     another~one.
   }
-\__msg_kernel_new:nnnn { kernel } { output-streams-exhausted }
+\__kernel_msg_new:nnnn { kernel } { output-streams-exhausted }
   { Output~streams~exhausted }
   {
     TeX~can~only~open~up~to~16~output~streams~at~one~time.\\
@@ -9653,12 +9678,12 @@
     All~16~are~currently~in~use,~and~something~wanted~to~open~
     another~one.
   }
-\__msg_kernel_new:nnnn { kernel } { unbalanced-quote-in-filename }
+\__kernel_msg_new:nnnn { kernel } { unbalanced-quote-in-filename }
   { Unbalanced~quotes~in~file~name~'#1'. }
   {
     File~names~must~contain~balanced~numbers~of~quotes~(").
   }
-\__msg_kernel_new:nnnn { kernel } { iow-indent }
+\__kernel_msg_new:nnnn { kernel } { iow-indent }
   { Only~#1 (arg~1)~allows~#2 }
   {
     The~command~#2 can~only~be~used~in~messages~
@@ -9667,18 +9692,13 @@
   }
 \tl_new:N \g_file_current_name_tl
 \tl_gset:Nn \g_file_current_name_tl { \g_file_curr_name_str }
-\__debug:TF
+\__kernel_deprecation_code:nn
   {
-    \tl_gput_right:Nn \g__debug_deprecation_on_tl
-      {
-        \__deprecation_error:Nnn \g_file_current_name_tl
-          { \g_file_curr_name_str } { 2018-12-31 }
-      }
-    \tl_gput_right:Nn \g__debug_deprecation_off_tl
-      { \tex_def:D \g_file_current_name_tl { \g_file_curr_name_str } }
+    \__deprecation_error:Nnn \g_file_current_name_tl
+      { \g_file_curr_name_str } { 2018-12-31 }
   }
-  { }
-\__debug_deprecation:nnNNpn { 2018-12-31 }
+  { \tex_def:D \g_file_current_name_tl { \g_file_curr_name_str } }
+\__kernel_patch_deprecation:nnNNpn { 2018-12-31 }
   { \seq_put_right:Nn \l_file_search_path_seq }
 \cs_new_protected:Npn \file_path_include:n #1
   {
@@ -9686,7 +9706,7 @@
     \seq_if_in:NVF \l_file_search_path_seq \l__file_full_name_str
       { \seq_put_right:NV \l_file_search_path_seq \l__file_full_name_str }
   }
-\__debug_deprecation:nnNNpn { 2018-12-31 }
+\__kernel_patch_deprecation:nnNNpn { 2018-12-31 }
   { \seq_remove_all:Nn \l_file_search_path_seq }
 \cs_new_protected:Npn \file_path_remove:n #1
   {
@@ -9693,7 +9713,7 @@
     \__file_name_sanitize:nN {#1} \l__file_full_name_str
     \seq_remove_all:NV \l_file_search_path_seq \l__file_full_name_str
   }
-\__debug_deprecation:nnNNpn { 2018-12-31 } { \file_get_full_name:nN }
+\__kernel_patch_deprecation:nnNNpn { 2018-12-31 } { \file_get_full_name:nN }
 \cs_new_protected:Npn \file_add_path:nN #1#2
   {
     \file_get_full_name:nN {#1} #2
@@ -9700,20 +9720,20 @@
     \str_if_empty:NT #2
       { \tl_set:Nn #2 { \q_no_value } }
   }
-\__debug_deprecation:nnNNpn { 2017-12-31 } { \ior_str_get:NN }
+\__kernel_patch_deprecation:nnNNpn { 2017-12-31 } { \ior_str_get:NN }
 \cs_new_protected:Npn \ior_get_str:NN      { \ior_str_get:NN }
-\__debug_deprecation:nnNNpn { 2018-12-31 } { \file_log_list: }
+\__kernel_patch_deprecation:nnNNpn { 2018-12-31 } { \file_log_list: }
 \cs_new_protected:Npn \file_list:          { \file_log_list: }
-\__debug_deprecation:nnNNpn { 2018-12-31 } { \ior_show_list: }
+\__kernel_patch_deprecation:nnNNpn { 2018-12-31 } { \ior_show_list: }
 \cs_new_protected:Npn \ior_list_streams:   { \ior_show_list: }
-\__debug_deprecation:nnNNpn { 2018-12-31 } { \ior_log_list: }
+\__kernel_patch_deprecation:nnNNpn { 2018-12-31 } { \ior_log_list: }
 \cs_new_protected:Npn \ior_log_streams:    { \ior_log_list: }
-\__debug_deprecation:nnNNpn { 2018-12-31 } { \iow_show_list: }
+\__kernel_patch_deprecation:nnNNpn { 2018-12-31 } { \iow_show_list: }
 \cs_new_protected:Npn \iow_list_streams:   { \iow_show_list: }
-\__debug_deprecation:nnNNpn { 2018-12-31 } { \iow_log_list: }
+\__kernel_patch_deprecation:nnNNpn { 2018-12-31 } { \iow_log_list: }
 \cs_new_protected:Npn \iow_log_streams:    { \iow_log_list: }
 %% File: l3skip.dtx Copyright (C) 2004-2011 Frank Mittelbach, The LaTeX3 Project
-%%                            (C) 2012-2017 The LaTeX3 Project
+%%                            (C) 2012-2018 The LaTeX3 Project
 \cs_new_eq:NN \if_dim:w      \tex_ifdim:D
 \cs_new_eq:NN \__dim_eval:w      \etex_dimexpr:D
 \cs_new_eq:NN \__dim_eval_end:   \tex_relax:D
@@ -9723,7 +9743,7 @@
     \cs:w newdimen \cs_end: #1
   }
 \cs_generate_variant:Nn \dim_new:N { c }
-\__debug_patch:nnNNpn { \__debug_chk_var_scope:NN c #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_scope:NN c #1 } { }
 \cs_new_protected:Npn \dim_const:Nn #1#2
   {
     \dim_new:N #1
@@ -9730,9 +9750,9 @@
     \tex_global:D #1 ~ \dim_eval:n {#2} \scan_stop:
   }
 \cs_generate_variant:Nn \dim_const:Nn { c }
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \dim_zero:N #1 { #1 \c_zero_skip }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \dim_gzero:N #1
   { \tex_global:D #1 \c_zero_skip }
 \cs_generate_variant:Nn \dim_zero:N  { c }
@@ -9749,46 +9769,46 @@
   { TF , T , F , p }
 \cs_set_protected:Npn \__dim_tmp:w #1#2#3
   {
-    \__debug_patch_args:nnnNNpn
+    \__kernel_patch_args:nnnNNpn
       { #1 ##1 }
       { }
-      { {##1} { \__debug_chk_expr:nNnN {##2} \__dim_eval:w { } #3 } }
+      { {##1} { \__kernel_chk_expr:nNnN {##2} \__dim_eval:w { } #3 } }
     #2 #3
   }
-\__dim_tmp:w \__debug_chk_var_local:N
+\__dim_tmp:w \__kernel_chk_var_local:N
 \cs_new_protected:Npn \dim_set:Nn #1#2
   { #1 ~ \__dim_eval:w #2 \__dim_eval_end: \scan_stop: }
-\__dim_tmp:w \__debug_chk_var_global:N
+\__dim_tmp:w \__kernel_chk_var_global:N
 \cs_new_protected:Npn \dim_gset:Nn #1#2
   { \tex_global:D #1 ~ \__dim_eval:w #2 \__dim_eval_end: \scan_stop: }
 \cs_generate_variant:Nn \dim_set:Nn  { c }
 \cs_generate_variant:Nn \dim_gset:Nn { c }
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \dim_set_eq:NN #1#2
   { #1 = #2 \scan_stop: }
 \cs_generate_variant:Nn \dim_set_eq:NN { c , Nc , cc }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \dim_gset_eq:NN #1#2
   { \tex_global:D #1 = #2 \scan_stop: }
 \cs_generate_variant:Nn \dim_gset_eq:NN { c , Nc , cc }
-\__dim_tmp:w \__debug_chk_var_local:N
+\__dim_tmp:w \__kernel_chk_var_local:N
 \cs_new_protected:Npn \dim_add:Nn #1#2
   { \tex_advance:D #1 by \__dim_eval:w #2 \__dim_eval_end: \scan_stop: }
-\__dim_tmp:w \__debug_chk_var_global:N
+\__dim_tmp:w \__kernel_chk_var_global:N
 \cs_new_protected:Npn \dim_gadd:Nn #1#2
   { \tex_global:D \tex_advance:D #1 by \__dim_eval:w #2 \__dim_eval_end: \scan_stop: }
 \cs_generate_variant:Nn \dim_add:Nn  { c }
 \cs_generate_variant:Nn \dim_gadd:Nn { c }
-\__dim_tmp:w \__debug_chk_var_local:N
+\__dim_tmp:w \__kernel_chk_var_local:N
 \cs_new_protected:Npn \dim_sub:Nn #1#2
   { \tex_advance:D #1 by - \__dim_eval:w #2 \__dim_eval_end: \scan_stop: }
-\__dim_tmp:w \__debug_chk_var_global:N
+\__dim_tmp:w \__kernel_chk_var_global:N
 \cs_new_protected:Npn \dim_gsub:Nn #1#2
   { \tex_global:D \tex_advance:D #1 by - \__dim_eval:w #2 \__dim_eval_end: \scan_stop: }
 \cs_generate_variant:Nn \dim_sub:Nn  { c }
 \cs_generate_variant:Nn \dim_gsub:Nn { c }
-\__debug_patch_args:nNNpn
-  { { \__debug_chk_expr:nNnN {#1} \__dim_eval:w { } \dim_abs:n } }
+\__kernel_patch_args:nNNpn
+  { { \__kernel_chk_expr:nNnN {#1} \__dim_eval:w { } \dim_abs:n } }
 \cs_new:Npn \dim_abs:n #1
   {
     \exp_after:wN \__dim_abs:N
@@ -9796,10 +9816,10 @@
   }
 \cs_new:Npn \__dim_abs:N #1
   { \if_meaning:w - #1 \else: \exp_after:wN #1 \fi: }
-\__debug_patch_args:nNNpn
+\__kernel_patch_args:nNNpn
   {
-    { \__debug_chk_expr:nNnN {#1} \__dim_eval:w { } \dim_max:nn }
-    { \__debug_chk_expr:nNnN {#2} \__dim_eval:w { } \dim_max:nn }
+    { \__kernel_chk_expr:nNnN {#1} \__dim_eval:w { } \dim_max:nn }
+    { \__kernel_chk_expr:nNnN {#2} \__dim_eval:w { } \dim_max:nn }
   }
 \cs_new:Npn \dim_max:nn #1#2
   {
@@ -9809,10 +9829,10 @@
       >
     \__dim_eval_end:
   }
-\__debug_patch_args:nNNpn
+\__kernel_patch_args:nNNpn
   {
-    { \__debug_chk_expr:nNnN {#1} \__dim_eval:w { } \dim_min:nn }
-    { \__debug_chk_expr:nNnN {#2} \__dim_eval:w { } \dim_min:nn }
+    { \__kernel_chk_expr:nNnN {#1} \__dim_eval:w { } \dim_min:nn }
+    { \__kernel_chk_expr:nNnN {#2} \__dim_eval:w { } \dim_min:nn }
   }
 \cs_new:Npn \dim_min:nn #1#2
   {
@@ -9834,11 +9854,11 @@
   { \__dim_ratio:n {#1} / \__dim_ratio:n {#2} }
 \cs_new:Npn \__dim_ratio:n #1
   { \__int_value:w \__dim_eval:w (#1) \__dim_eval_end: }
-\__debug_patch_conditional_args:nNNpnn
+\__kernel_patch_conditional_args:nNNpnn
   {
-    { \__debug_chk_expr:nNnN {#1} \__dim_eval:w { } \dim_compare:nNn }
+    { \__kernel_chk_expr:nNnN {#1} \__dim_eval:w { } \dim_compare:nNn }
     { \__dim_eval_end: #2 }
-    { \__debug_chk_expr:nNnN {#3} \__dim_eval:w { } \dim_compare:nNn }
+    { \__kernel_chk_expr:nNnN {#3} \__dim_eval:w { } \dim_compare:nNn }
   }
 \prg_new_conditional:Npnn \dim_compare:nNn #1#2#3 { p , T , F , TF }
   {
@@ -9964,17 +9984,78 @@
     \dim_compare:nNnF {#1} #2 {#3}
       { \dim_do_until:nNnn {#1} #2 {#3} {#4} }
   }
-\__debug_patch_args:nNNpn
-  { { \__debug_chk_expr:nNnN {#1} \__dim_eval:w { } \dim_eval:n } }
+\__kernel_patch_args:nNNpn
+  {
+    { \__kernel_chk_expr:nNnN {#1} \__dim_eval:w { } \dim_step_function:nnnN }
+    { \__kernel_chk_expr:nNnN {#2} \__dim_eval:w { } \dim_step_function:nnnN }
+    { \__kernel_chk_expr:nNnN {#3} \__dim_eval:w { } \dim_step_function:nnnN }
+  }
+\cs_new:Npn \dim_step_function:nnnN #1#2#3
+  {
+    \exp_after:wN \__dim_step:wwwN
+    \tex_the:D \__dim_eval:w #1 \exp_after:wN ;
+    \tex_the:D \__dim_eval:w #2 \exp_after:wN ;
+    \tex_the:D \__dim_eval:w #3 ;
+  }
+\cs_new:Npn \__dim_step:wwwN #1; #2; #3; #4
+  {
+    \dim_compare:nNnTF {#2} > \c_zero_dim
+      { \__dim_step:NnnnN > }
+      {
+        \dim_compare:nNnTF {#2} = \c_zero_dim
+          {
+            \__kernel_msg_expandable_error:nnn { kernel } { zero-step } {#4}
+            \use_none:nnnn
+          }
+          { \__dim_step:NnnnN < }
+      }
+      {#1} {#2} {#3} #4
+  }
+\cs_new:Npn \__dim_step:NnnnN #1#2#3#4#5
+  {
+    \dim_compare:nNnF {#2} #1 {#4}
+      {
+        #5 {#2}
+        \exp_args:NNf \__dim_step:NnnnN
+          #1 { \dim_eval:n { #2 + #3 } } {#3} {#4} #5
+      }
+  }
+\cs_new_protected:Npn \dim_step_inline:nnnn
+  {
+    \int_gincr:N \g__prg_map_int
+    \exp_args:NNc \__dim_step:NNnnnn
+      \cs_gset_protected:Npn
+      { __prg_map_ \int_use:N \g__prg_map_int :w }
+  }
+\cs_new_protected:Npn \dim_step_variable:nnnNn #1#2#3#4#5
+  {
+    \int_gincr:N \g__prg_map_int
+    \exp_args:NNc \__dim_step:NNnnnn
+      \cs_gset_protected:Npx
+      { __prg_map_ \int_use:N \g__prg_map_int :w }
+      {#1}{#2}{#3}
+      {
+        \tl_set:Nn \exp_not:N #4 {##1}
+        \exp_not:n {#5}
+      }
+  }
+\cs_new_protected:Npn \__dim_step:NNnnnn #1#2#3#4#5#6
+  {
+    #1 #2 ##1 {#6}
+    \dim_step_function:nnnN {#3} {#4} {#5} #2
+    \__prg_break_point:Nn \scan_stop: { \int_gdecr:N \g__prg_map_int }
+  }
+\__kernel_patch_args:nNNpn
+  { { \__kernel_chk_expr:nNnN {#1} \__dim_eval:w { } \dim_eval:n } }
 \cs_new:Npn \dim_eval:n #1
   { \dim_use:N \__dim_eval:w #1 \__dim_eval_end: }
-\__debug_patch_args:nNNpn
-  { { \__debug_chk_expr:nNnN {#1} \__dim_eval:w { } \__dim_eval:n } }
+\__kernel_patch_args:nNNpn
+  { { \__kernel_chk_expr:nNnN {#1} \__dim_eval:w { } \__dim_eval:n } }
 \cs_new:Npn \__dim_eval:n #1 { \__dim_eval:w #1 \__dim_eval_end: }
 \cs_new_eq:NN \dim_use:N \tex_the:D
 \cs_new:Npn \dim_use:c #1 { \tex_the:D \cs:w #1 \cs_end: }
-\__debug_patch_args:nNNpn
-  { { \__debug_chk_expr:nNnN {#1} \__dim_eval:w { } \dim_to_decimal:n } }
+\__kernel_patch_args:nNNpn
+  { { \__kernel_chk_expr:nNnN {#1} \__dim_eval:w { } \dim_to_decimal:n } }
 \cs_new:Npn \dim_to_decimal:n #1
   {
     \exp_after:wN
@@ -9992,8 +10073,8 @@
       }
 \cs_new:Npn \dim_to_decimal_in_bp:n #1
   { \dim_to_decimal:n { ( #1 ) * 800 / 803 } }
-\__debug_patch_args:nNNpn
-  { { \__debug_chk_expr:nNnN {#1} \__dim_eval:w { } \dim_to_decimal_in_sp:n } }
+\__kernel_patch_args:nNNpn
+  { { \__kernel_chk_expr:nNnN {#1} \__dim_eval:w { } \dim_to_decimal_in_sp:n } }
 \cs_new:Npn \dim_to_decimal_in_sp:n #1
   { \int_eval:n { \__dim_eval:w #1 \__dim_eval_end: } }
 \cs_new:Npn \dim_to_decimal_in_unit:nn #1#2
@@ -10024,7 +10105,7 @@
     \cs:w newskip \cs_end: #1
   }
 \cs_generate_variant:Nn \skip_new:N { c }
-\__debug_patch:nnNNpn { \__debug_chk_var_scope:NN c #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_scope:NN c #1 } { }
 \cs_new_protected:Npn \skip_const:Nn #1#2
   {
     \skip_new:N #1
@@ -10031,9 +10112,9 @@
     \tex_global:D #1 ~ \skip_eval:n {#2} \scan_stop:
   }
 \cs_generate_variant:Nn \skip_const:Nn { c }
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \skip_zero:N #1 { #1 \c_zero_skip }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \skip_gzero:N #1 { \tex_global:D #1 \c_zero_skip }
 \cs_generate_variant:Nn \skip_zero:N  { c }
 \cs_generate_variant:Nn \skip_gzero:N { c }
@@ -10049,16 +10130,16 @@
   { TF , T , F , p }
 \cs_set_protected:Npn \__dim_tmp:w #1#2#3
   {
-    \__debug_patch_args:nnnNNpn
+    \__kernel_patch_args:nnnNNpn
       { #1 ##1 }
       { }
-      { {##1} { \__debug_chk_expr:nNnN {##2} \etex_glueexpr:D { } #3 } }
+      { {##1} { \__kernel_chk_expr:nNnN {##2} \etex_glueexpr:D { } #3 } }
     #2 #3
   }
-\__dim_tmp:w \__debug_chk_var_local:N
+\__dim_tmp:w \__kernel_chk_var_local:N
 \cs_new_protected:Npn \skip_set:Nn #1#2
   { #1 ~ \etex_glueexpr:D #2 \scan_stop: }
-\__dim_tmp:w \__debug_chk_var_global:N
+\__dim_tmp:w \__kernel_chk_var_global:N
 \cs_new_protected:Npn \skip_gset:Nn #1#2
   { \tex_global:D #1 ~ \etex_glueexpr:D #2 \scan_stop: }
 \cs_generate_variant:Nn \skip_set:Nn  { c }
@@ -10067,18 +10148,18 @@
 \cs_generate_variant:Nn \skip_set_eq:NN { c , Nc , cc }
 \cs_new_protected:Npn \skip_gset_eq:NN #1#2 { \tex_global:D #1 = #2 }
 \cs_generate_variant:Nn \skip_gset_eq:NN { c , Nc , cc }
-\__dim_tmp:w \__debug_chk_var_local:N
+\__dim_tmp:w \__kernel_chk_var_local:N
 \cs_new_protected:Npn \skip_add:Nn #1#2
   { \tex_advance:D #1 by \etex_glueexpr:D #2 \scan_stop: }
-\__dim_tmp:w \__debug_chk_var_global:N
+\__dim_tmp:w \__kernel_chk_var_global:N
 \cs_new_protected:Npn \skip_gadd:Nn #1#2
   { \tex_global:D \tex_advance:D #1 by \etex_glueexpr:D #2 \scan_stop: }
 \cs_generate_variant:Nn \skip_add:Nn  { c }
 \cs_generate_variant:Nn \skip_gadd:Nn { c }
-\__dim_tmp:w \__debug_chk_var_local:N
+\__dim_tmp:w \__kernel_chk_var_local:N
 \cs_new_protected:Npn \skip_sub:Nn #1#2
   { \tex_advance:D #1 by - \etex_glueexpr:D #2 \scan_stop: }
-\__dim_tmp:w \__debug_chk_var_global:N
+\__dim_tmp:w \__kernel_chk_var_global:N
 \cs_new_protected:Npn \skip_gsub:Nn #1#2
   { \tex_global:D \tex_advance:D #1 by - \etex_glueexpr:D #2 \scan_stop: }
 \cs_generate_variant:Nn \skip_sub:Nn  { c }
@@ -10095,10 +10176,10 @@
   }
 \cs_set_protected:Npn \__dim_tmp:w #1
   {
-    \__debug_patch_conditional_args:nNNpnn
+    \__kernel_patch_conditional_args:nNNpnn
       {
         {
-          \__debug_chk_expr:nNnN
+          \__kernel_chk_expr:nNnN
             {##1} \etex_glueexpr:D { } \skip_if_finite:n
         }
       }
@@ -10111,20 +10192,20 @@
     \cs_new:Npn \__skip_if_finite:wwNw ##1 #1 ##2 ; ##3 ##4 \q_stop {##3}
   }
 \exp_args:No \__dim_tmp:w { \tl_to_str:n { fil } }
-\__debug_patch_args:nNNpn
-  { { \__debug_chk_expr:nNnN {#1} \etex_glueexpr:D { } \skip_eval:n } }
+\__kernel_patch_args:nNNpn
+  { { \__kernel_chk_expr:nNnN {#1} \etex_glueexpr:D { } \skip_eval:n } }
 \cs_new:Npn \skip_eval:n #1
   { \skip_use:N \etex_glueexpr:D #1 \scan_stop: }
 \cs_new_eq:NN \skip_use:N \tex_the:D
 \cs_new:Npn \skip_use:c #1 { \tex_the:D \cs:w #1 \cs_end: }
 \cs_new_eq:NN  \skip_horizontal:N \tex_hskip:D
-\__debug_patch_args:nNNpn
-  { { \__debug_chk_expr:nNnN {#1} \etex_glueexpr:D { } \skip_horizontal:n } }
+\__kernel_patch_args:nNNpn
+  { { \__kernel_chk_expr:nNnN {#1} \etex_glueexpr:D { } \skip_horizontal:n } }
 \cs_new:Npn \skip_horizontal:n #1
   { \skip_horizontal:N \etex_glueexpr:D #1 \scan_stop: }
 \cs_new_eq:NN  \skip_vertical:N \tex_vskip:D
-\__debug_patch_args:nNNpn
-  { { \__debug_chk_expr:nNnN {#1} \etex_glueexpr:D { } \skip_vertical:n } }
+\__kernel_patch_args:nNNpn
+  { { \__kernel_chk_expr:nNnN {#1} \etex_glueexpr:D { } \skip_vertical:n } }
 \cs_new:Npn \skip_vertical:n #1
   { \skip_vertical:N \etex_glueexpr:D #1 \scan_stop: }
 \cs_generate_variant:Nn \skip_horizontal:N { c }
@@ -10149,7 +10230,7 @@
     \cs:w newmuskip \cs_end: #1
   }
 \cs_generate_variant:Nn \muskip_new:N { c }
-\__debug_patch:nnNNpn { \__debug_chk_var_scope:NN c #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_scope:NN c #1 } { }
 \cs_new_protected:Npn \muskip_const:Nn #1#2
   {
     \muskip_new:N #1
@@ -10156,10 +10237,10 @@
     \tex_global:D #1 ~ \muskip_eval:n {#2} \scan_stop:
   }
 \cs_generate_variant:Nn \muskip_const:Nn { c }
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \muskip_zero:N #1
   { #1 \c_zero_muskip }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \muskip_gzero:N #1
   { \tex_global:D #1 \c_zero_muskip }
 \cs_generate_variant:Nn \muskip_zero:N  { c }
@@ -10176,52 +10257,52 @@
   { TF , T , F , p }
 \cs_set_protected:Npn \__dim_tmp:w #1#2#3
   {
-    \__debug_patch_args:nnnNNpn
+    \__kernel_patch_args:nnnNNpn
       { #1 ##1 }
       { }
       {
         {##1}
         {
-          \__debug_chk_expr:nNnN {##2}
+          \__kernel_chk_expr:nNnN {##2}
             \etex_muexpr:D { \etex_mutoglue:D } #3
         }
       }
     #2 #3
   }
-\__dim_tmp:w \__debug_chk_var_local:N
+\__dim_tmp:w \__kernel_chk_var_local:N
 \cs_new_protected:Npn \muskip_set:Nn #1#2
   { #1 ~ \etex_muexpr:D #2 \scan_stop: }
-\__dim_tmp:w \__debug_chk_var_global:N
+\__dim_tmp:w \__kernel_chk_var_global:N
 \cs_new_protected:Npn \muskip_gset:Nn #1#2
   { \tex_global:D #1 ~ \etex_muexpr:D #2 \scan_stop: }
 \cs_generate_variant:Nn \muskip_set:Nn  { c }
 \cs_generate_variant:Nn \muskip_gset:Nn { c }
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \muskip_set_eq:NN #1#2 { #1 = #2 }
 \cs_generate_variant:Nn \muskip_set_eq:NN { c , Nc , cc }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \muskip_gset_eq:NN #1#2 { \tex_global:D #1 = #2 }
 \cs_generate_variant:Nn \muskip_gset_eq:NN { c , Nc , cc }
-\__dim_tmp:w \__debug_chk_var_local:N
+\__dim_tmp:w \__kernel_chk_var_local:N
 \cs_new_protected:Npn \muskip_add:Nn #1#2
   { \tex_advance:D #1 by \etex_muexpr:D #2 \scan_stop: }
-\__dim_tmp:w \__debug_chk_var_global:N
+\__dim_tmp:w \__kernel_chk_var_global:N
 \cs_new_protected:Npn \muskip_gadd:Nn #1#2
   { \tex_global:D \tex_advance:D #1 by \etex_muexpr:D #2 \scan_stop: }
 \cs_generate_variant:Nn \muskip_add:Nn  { c }
 \cs_generate_variant:Nn \muskip_gadd:Nn { c }
-\__dim_tmp:w \__debug_chk_var_local:N
+\__dim_tmp:w \__kernel_chk_var_local:N
 \cs_new_protected:Npn \muskip_sub:Nn #1#2
   { \tex_advance:D #1 by - \etex_muexpr:D #2 \scan_stop: }
-\__dim_tmp:w \__debug_chk_var_global:N
+\__dim_tmp:w \__kernel_chk_var_global:N
 \cs_new_protected:Npn \muskip_gsub:Nn #1#2
   { \tex_global:D \tex_advance:D #1 by - \etex_muexpr:D #2 \scan_stop: }
 \cs_generate_variant:Nn \muskip_sub:Nn  { c }
 \cs_generate_variant:Nn \muskip_gsub:Nn { c }
-\__debug_patch_args:nNNpn
+\__kernel_patch_args:nNNpn
   {
     {
-      \__debug_chk_expr:nNnN {#1} \etex_muexpr:D
+      \__kernel_chk_expr:nNnN {#1} \etex_muexpr:D
         { \etex_mutoglue:D } \muskip_eval:n
     }
   }
@@ -10243,7 +10324,7 @@
 \muskip_new:N \l_tmpb_muskip
 \muskip_new:N \g_tmpa_muskip
 \muskip_new:N \g_tmpb_muskip
-%% File: l3keys.dtx Copyright (C) 2006-2017 The LaTeX3 Project
+%% File: l3keys.dtx Copyright (C) 2006-2018 The LaTeX3 Project
 \tl_new:N \l__keyval_key_tl
 \tl_new:N \l__keyval_value_tl
 \tl_new:N \l__keyval_sanitise_tl
@@ -10346,7 +10427,7 @@
           }
       \else:
         \cs_set:Npn \__keyval_action:
-          { \__msg_kernel_error:nn { kernel } { misplaced-equals-sign } }
+          { \__kernel_msg_error:nn { kernel } { misplaced-equals-sign } }
       \fi:
     \fi:
     \__keyval_action:
@@ -10361,13 +10442,13 @@
   }
 \cs_new:Npn \__keyval_action: { }
 \cs_new_protected:Npn \__keyval_empty_key:
-  { \__msg_kernel_error:nn { kernel } { misplaced-equals-sign } }
+  { \__kernel_msg_error:nn { kernel } { misplaced-equals-sign } }
 \cs_new_protected:Npn \__keyval_def:Nn #1#2
   { \tl_set:Nx #1 { \__tl_trim_spaces:nn {#2} \__keyval_def_aux:n } }
 \cs_new:Npn \__keyval_def_aux:n #1
   { \exp_after:wN \__keyval_def_aux:w #1 \q_stop }
 \cs_new:Npn \__keyval_def_aux:w #1 \q_stop { \exp_not:n {#1} }
-\__msg_kernel_new:nnnn { kernel } { misplaced-equals-sign }
+\__kernel_msg_new:nnnn { kernel } { misplaced-equals-sign }
   { Misplaced~equals~sign~in~key-value~input~\msg_line_number: }
   {
     LaTeX~is~attempting~to~parse~some~key-value~input~but~found~
@@ -10422,7 +10503,7 @@
       {
          \tl_if_empty:NF \l__keys_property_tl
            {
-             \__msg_kernel_error:nnxx { kernel } { property-unknown }
+             \__kernel_msg_error:nnxx { kernel } { property-unknown }
               { \l__keys_property_tl } { \l_keys_path_tl }
            }
       }
@@ -10437,7 +10518,7 @@
     \tl_if_blank:nTF {#3}
       {
         \tl_clear:N \l__keys_property_tl
-        \__msg_kernel_error:nnn { kernel } { key-no-property } {#4}
+        \__kernel_msg_error:nnn { kernel } { key-no-property } {#4}
       }
       {
         \str_if_eq:nnTF {#3} { . }
@@ -10476,7 +10557,7 @@
           \l__keys_property_tl \q_stop
           { \use:c { \c__keys_props_root_tl \l__keys_property_tl } }
           {
-            \__msg_kernel_error:nnxx { kernel }
+            \__kernel_msg_error:nnxx { kernel }
               { property-requires-value } { \l__keys_property_tl }
               { \l_keys_path_tl }
             }
@@ -10499,7 +10580,7 @@
       { \exp_not:c { bool_ #2 set_false:N } \exp_not:N #1 }
     \__keys_cmd_set:nn { \l_keys_path_tl / unknown }
       {
-        \__msg_kernel_error:nnx { kernel } { boolean-values-only }
+        \__kernel_msg_error:nnx { kernel } { boolean-values-only }
           { \l_keys_key_tl }
       }
     \__keys_default_set:n { true }
@@ -10515,7 +10596,7 @@
       { \exp_not:c { bool_ #2 set_true:N } \exp_not:N #1 }
     \__keys_cmd_set:nn { \l_keys_path_tl / unknown }
       {
-        \__msg_kernel_error:nnx { kernel } { boolean-values-only }
+        \__kernel_msg_error:nnx { kernel } { boolean-values-only }
           { \l_keys_key_tl }
       }
     \__keys_default_set:n { true }
@@ -10534,7 +10615,7 @@
           { \exp_not:v { \c__keys_type_root_tl \__keys_parent:o \l_keys_path_tl } }
           { choice }
           {
-            \__msg_kernel_error:nnxx { kernel } { nested-choice-key }
+            \__kernel_msg_error:nnxx { kernel } { nested-choice-key }
               { \l_keys_path_tl } { \__keys_parent:o \l_keys_path_tl }
           }
           { \__keys_choice_make_aux:N #1 }
@@ -10547,7 +10628,7 @@
     \__keys_cmd_set:nn { \l_keys_path_tl } { #1 {##1} }
     \__keys_cmd_set:nn { \l_keys_path_tl / unknown }
       {
-        \__msg_kernel_error:nnxx { kernel } { key-choice-unknown }
+        \__kernel_msg_error:nnxx { kernel } { key-choice-unknown }
           { \l_keys_path_tl } {##1}
       }
   }
@@ -10571,10 +10652,10 @@
           }
       }
   }
-\__debug_patch:nnNNpn
+\__kernel_patch:nnNNpn
   {
     \cs_if_exist:cF { \c__keys_code_root_tl #1 }
-      { \__debug_log:x { Defining~key~#1~\msg_line_context: } }
+      { \__kernel_debug_log:x { Defining~key~#1~\msg_line_context: } }
   }
   { }
 \cs_new_protected:Npn \__keys_cmd_set:nn #1#2
@@ -10659,7 +10740,7 @@
           }
       }
       {
-        \__msg_kernel_error:nnx { kernel } { property-boolean-values-only }
+        \__kernel_msg_error:nnx { kernel } { property-boolean-values-only }
           { .value_ #1 :n }
       }
   }
@@ -10667,7 +10748,7 @@
   {
     \bool_if:NF \l__keys_no_value_bool
       {
-        \__msg_kernel_error:nnxx { kernel } { value-forbidden }
+        \__kernel_msg_error:nnxx { kernel } { value-forbidden }
           { \l_keys_path_tl } { \l_keys_value_tl }
         \__keys_validate_cleanup:w
       }
@@ -10676,7 +10757,7 @@
   {
     \bool_if:NT \l__keys_no_value_bool
       {
-        \__msg_kernel_error:nnx { kernel } { value-required }
+        \__kernel_msg_error:nnx { kernel } { value-required }
           { \l_keys_path_tl }
         \__keys_validate_cleanup:w
       }
@@ -11041,7 +11122,7 @@
                   \exp_after:wN \cs_end: \exp_after:wN { \l_keys_value_tl }
               }
               {
-                \__msg_kernel_error:nnxx { kernel } { key-unknown }
+                \__kernel_msg_error:nnxx { kernel } { key-unknown }
                   { \l_keys_path_tl } { \l__keys_module_tl }
               }
           }
@@ -11120,16 +11201,16 @@
       }
       { } { }
   }
-\__msg_kernel_new:nnnn { kernel } { boolean-values-only }
+\__kernel_msg_new:nnnn { kernel } { boolean-values-only }
   { Key~'#1'~accepts~boolean~values~only. }
   { The~key~'#1'~only~accepts~the~values~'true'~and~'false'. }
-\__msg_kernel_new:nnnn { kernel } { key-choice-unknown }
+\__kernel_msg_new:nnnn { kernel } { key-choice-unknown }
   { Key~'#1'~accepts~only~a~fixed~set~of~choices. }
   {
     The~key~'#1'~only~accepts~predefined~values,~
     and~'#2'~is~not~one~of~these.
   }
-\__msg_kernel_new:nnnn { kernel } { key-no-property }
+\__kernel_msg_new:nnnn { kernel } { key-no-property }
   { No~property~given~in~definition~of~key~'#1'. }
   {
     \c__msg_coding_error_text_tl
@@ -11138,25 +11219,25 @@
     \iow_indent:n { #1 .<property> } \\ \\
     LaTeX~did~not~find~a~'.'~to~indicate~the~start~of~a~property.
   }
-\__msg_kernel_new:nnnn { kernel } { key-unknown }
+\__kernel_msg_new:nnnn { kernel } { key-unknown }
   { The~key~'#1'~is~unknown~and~is~being~ignored. }
   {
     The~module~'#2'~does~not~have~a~key~called~'#1'.\\
     Check~that~you~have~spelled~the~key~name~correctly.
   }
-\__msg_kernel_new:nnnn { kernel } { nested-choice-key }
+\__kernel_msg_new:nnnn { kernel } { nested-choice-key }
   { Attempt~to~define~'#1'~as~a~nested~choice~key. }
   {
     The~key~'#1'~cannot~be~defined~as~a~choice~as~the~parent~key~'#2'~is~
     itself~a~choice.
   }
-\__msg_kernel_new:nnnn { kernel } { property-boolean-values-only }
+\__kernel_msg_new:nnnn { kernel } { property-boolean-values-only }
   { The~property~'#1'~accepts~boolean~values~only. }
   {
     \c__msg_coding_error_text_tl
     The~property~'#1'~only~accepts~the~values~'true'~and~'false'.
   }
-\__msg_kernel_new:nnnn { kernel } { property-requires-value }
+\__kernel_msg_new:nnnn { kernel } { property-requires-value }
   { The~property~'#1'~requires~a~value. }
   {
     \c__msg_coding_error_text_tl
@@ -11163,7 +11244,7 @@
     LaTeX~was~asked~to~set~property~'#1'~for~key~'#2'.\\
     No~value~was~given~for~the~property,~and~one~is~required.
   }
-\__msg_kernel_new:nnnn { kernel } { property-unknown }
+\__kernel_msg_new:nnnn { kernel } { property-unknown }
   { The~key~property~'#1'~is~unknown. }
   {
     \c__msg_coding_error_text_tl
@@ -11170,19 +11251,19 @@
     LaTeX~has~been~asked~to~set~the~property~'#1'~for~key~'#2':~
     this~property~is~not~defined.
   }
-\__msg_kernel_new:nnnn { kernel } { value-forbidden }
+\__kernel_msg_new:nnnn { kernel } { value-forbidden }
   { The~key~'#1'~does~not~take~a~value. }
   {
     The~key~'#1'~should~be~given~without~a~value.\\
     The~value~'#2'~was~present:~the~key~will~be~ignored.
   }
-\__msg_kernel_new:nnnn { kernel } { value-required }
+\__kernel_msg_new:nnnn { kernel } { value-required }
   { The~key~'#1'~requires~a~value. }
   {
     The~key~'#1'~must~have~a~value.\\
     No~value~was~present:~the~key~will~be~ignored.
   }
-\__msg_kernel_new:nnn { kernel } { show-key }
+\__kernel_msg_new:nnn { kernel } { show-key }
   {
     The~key~#1~
     \tl_if_empty:nTF {#2}
@@ -11190,7 +11271,7 @@
       { has~the~properties: #2 . }
   }
 %% File: l3fp.dtx Copyright (C) 2011-2017 The LaTeX3 Project
-%% File: l3fp-aux.dtx Copyright(C) 2011-2017 The LaTeX3 Project
+%% File: l3fp-aux.dtx Copyright(C) 2011-2018 The LaTeX3 Project
 \cs_new:Npn \__fp_use_none_stop_f:n #1 { \exp_stop_f: }
 \cs_new:Npn \__fp_use_s:n #1 { #1; }
 \cs_new:Npn \__fp_use_s:nn #1#2 { #1#2; }
@@ -11201,12 +11282,11 @@
 \cs_new:Npn \__fp_rrot:www #1; #2; #3; { #2; #3; #1; }
 \cs_new:Npn \__fp_use_i:ww #1; #2; { #1; }
 \cs_new:Npn \__fp_use_i:www #1; #2; #3; { #1; }
+\cs_new_protected:Npn \__fp_misused:n #1
+  { \__kernel_msg_error:nnx { kernel } { misused-fp } { \fp_to_tl:n {#1} } }
 \__scan_new:N \s__fp
 \cs_new_protected:Npn \__fp_chk:w #1 ;
-  {
-    \__msg_kernel_error:nnx { kernel } { misused-fp }
-      { \fp_to_tl:n { \s__fp \__fp_chk:w #1 ; } }
-  }
+  { \__fp_misused:n { \s__fp \__fp_chk:w #1 ; } }
 \__scan_new:N \s__fp_mark
 \__scan_new:N \s__fp_stop
 \__scan_new:N \s__fp_invalid
@@ -11305,13 +11385,103 @@
 \cs_new:Npn \__fp_exp_after_normal:Nwwwww
     #1 #2; 1 #3 ; 1 #4 ; 1 #5 ; 1 #6 ;
   { \s__fp \__fp_chk:w 1 #1 {#2} {#3} {#4} {#5} {#6} ; }
-\cs_new:Npn \__fp_exp_after_array_f:w #1
+\__scan_new:N \s__fp_tuple
+\cs_new_protected:Npn \__fp_tuple_chk:w #1 ;
+  { \__fp_misused:n { \s__fp_tuple \__fp_tuple_chk:w #1 ; } }
+\tl_const:Nn \c__fp_empty_tuple_fp
+  { \s__fp_tuple \__fp_tuple_chk:w { } ; }
+\cs_new:Npn \__fp_array_count:n #1
+  { \__fp_tuple_count:w \s__fp_tuple \__fp_tuple_chk:w {#1} ; }
+\cs_new:Npn \__fp_tuple_count:w \s__fp_tuple \__fp_tuple_chk:w #1 ;
   {
-    \cs:w __fp_exp_after \__fp_type_from_scan:N #1 _f:nw \cs_end:
-      { \__fp_exp_after_array_f:w }
-    #1
+    \__int_value:w \__int_eval:w 0
+      \__fp_tuple_count_loop:Nw #1 { ? \__prg_break: } ;
+      \__prg_break_point:
+    \__int_eval_end:
   }
+\cs_new:Npn \__fp_tuple_count_loop:Nw #1#2;
+  { \use_none:n #1 + 1 \__fp_tuple_count_loop:Nw }
+\cs_new:Npn \__fp_if_type_fp:NTwFw #1 \s__fp #2 #3 \q_stop {#2}
+\cs_new:Npn \__fp_array_if_all_fp:nTF #1
+  {
+    \__fp_array_if_all_fp_loop:w #1 { \s__fp \__prg_break: } ;
+    \__prg_break_point: \use_i:nn
+  }
+\cs_new:Npn \__fp_array_if_all_fp_loop:w #1#2 ;
+  {
+    \__fp_if_type_fp:NTwFw
+      #1 \__fp_array_if_all_fp_loop:w
+      \s__fp { \__prg_break:n \use_iii:nnn }
+      \q_stop
+  }
+\cs_new:Npn \__fp_type_from_scan:N #1
+  {
+    \__fp_if_type_fp:NTwFw
+      #1 { }
+      \s__fp { \__fp_type_from_scan_other:N #1 }
+      \q_stop
+  }
+\cs_new:Npx \__fp_type_from_scan_other:N #1
+  {
+    \exp_not:N \exp_after:wN \exp_not:N \__fp_type_from_scan:w
+    \exp_not:N \token_to_str:N #1 \exp_not:N \q_mark
+      \tl_to_str:n { s__fp _? } \exp_not:N \q_mark \exp_not:N \q_stop
+  }
+\use:x
+  {
+    \cs_new:Npn \exp_not:N \__fp_type_from_scan:w
+      ##1 \tl_to_str:n { s__fp } ##2 \exp_not:N \q_mark ##3 \exp_not:N \q_stop
+      {##2}
+  }
+\cs_new:Npn \__fp_change_func_type:NNN #1#2#3
+  {
+    \__fp_if_type_fp:NTwFw
+      #1 #2
+      \s__fp
+        {
+          \exp_after:wN \__fp_change_func_type_chk:NNN
+          \cs:w
+            __fp \__fp_type_from_scan_other:N #1
+            \exp_after:wN \__fp_change_func_type_aux:w \token_to_str:N #2
+          \cs_end:
+          #2 #3
+        }
+      \q_stop
+  }
+\exp_last_unbraced:NNNNo
+  \cs_new:Npn \__fp_change_func_type_aux:w #1 { \tl_to_str:n { __fp } } { }
+\cs_new:Npn \__fp_change_func_type_chk:NNN #1#2#3
+  {
+    \if_meaning:w \scan_stop: #1
+      \exp_after:wN #3 \exp_after:wN #2
+    \else:
+      \exp_after:wN #1
+    \fi:
+  }
+\cs_new:Npn \__fp_exp_after_any_f:Nnw #1
+  { \cs:w __fp_exp_after \__fp_type_from_scan_other:N #1 _f:nw \cs_end: }
+\cs_new:Npn \__fp_exp_after_any_f:nw #1#2
+  {
+    \__fp_if_type_fp:NTwFw
+      #2 \__fp_exp_after_f:nw
+      \s__fp { \__fp_exp_after_any_f:Nnw #2 }
+      \q_stop
+    {#1} #2
+  }
 \cs_new_eq:NN \__fp_exp_after_stop_f:nw \use_none:nn
+\cs_new:Npn \__fp_exp_after_tuple_f:nw #1 \s__fp_tuple \__fp_tuple_chk:w #2 ;
+  {
+    \exp_after:wN \s__fp_tuple
+    \exp_after:wN \__fp_tuple_chk:w
+    \exp_after:wN {
+      \exp:w \exp_end_continue_f:w
+      \__fp_exp_after_array_f:w #2 \s__fp_stop
+    \exp_after:wN }
+    \exp_after:wN ;
+    \exp:w \exp_end_continue_f:w #1
+  }
+\cs_new:Npn \__fp_exp_after_array_f:w
+  { \__fp_exp_after_any_f:nw { \__fp_exp_after_array_f:w } }
 \int_const:Nn \c__fp_leading_shift_int  { - 5 0000 }
 \int_const:Nn \c__fp_middle_shift_int   { 5 0000 *  9999 }
 \int_const:Nn \c__fp_trailing_shift_int { 5 0000 * 10000 }
@@ -11462,15 +11632,6 @@
       \exp_after:wN \use_ii:nn
     \fi:
   }
-\cs_new:Npn \__fp_array_count:n #1
-  {
-    \__int_value:w \__int_eval:w 0
-      \__fp_array_count_loop:Nw #1 { ? \__prg_break: } ;
-      \__prg_break_point:
-    \__int_eval_end:
-  }
-\cs_new:Npn \__fp_array_count_loop:Nw #1#2;
-  { \use_none:n #1 + 1 \__fp_array_count_loop:Nw }
 \cs_new:Npn \__fp_expand:n #1
   {
     \__fp_expand_loop:nwnN { }
@@ -11484,12 +11645,17 @@
     #2
     \s__fp_mark { #3 #1 } #4
   }
-\__msg_kernel_new:nnnn { kernel } { misused-fp }
+\cs_new:Npn \__fp_func_to_name:N #1
+  { \exp_last_unbraced:Nf \__fp_func_to_name_aux:w { \cs_to_str:N #1 } X }
+\cs_set_protected:Npn \__fp_tmp:w #1 #2
+  { \cs_new:Npn \__fp_func_to_name_aux:w ##1 #1 ##2 #2 ##3 X {##2} }
+\exp_args:Nff \__fp_tmp:w { \tl_to_str:n { __fp_ } } { \tl_to_str:n { _o: } }
+\__kernel_msg_new:nnnn { kernel } { misused-fp }
   { A~floating~point~with~value~'#1'~was~misused. }
   {
     To~obtain~the~value~of~a~floating~point~variable,~use~
     '\token_to_str:N \fp_to_decimal:N',~
-    '\token_to_str:N \fp_to_scientific:N',~or~other~
+    '\token_to_str:N \fp_to_tl:N',~or~other~
     conversion~functions.
   }
 %% File: l3fp-traps.dtx Copyright (C) 2011-2014,2016,2017 The LaTeX3 Project
@@ -11505,11 +11671,11 @@
           { invalid_operation , division_by_zero , overflow , underflow }
           {#1}
           {
-            \__msg_kernel_error:nnxx { kernel }
+            \__kernel_msg_error:nnxx { kernel }
               { unknown-fpu-trap-type } {#1} {#2}
           }
           {
-            \__msg_kernel_error:nnx
+            \__kernel_msg_error:nnx
               { kernel } { unknown-fpu-exception } {#1}
           }
       }
@@ -11620,9 +11786,9 @@
   { \__fp_invalid_operation:nnw { \exp_after:wN \c_nan_fp } }
 \cs_generate_variant:Nn \__fp_invalid_operation_o:nw { f }
 \cs_new:Npn \__fp_error:nnnn
-  { \__msg_kernel_expandable_error:nnnnn { kernel } }
+  { \__kernel_msg_expandable_error:nnnnn { kernel } }
 \cs_generate_variant:Nn \__fp_error:nnnn { nnf, nff }
-\__msg_kernel_new:nnnn { kernel } { unknown-fpu-exception }
+\__kernel_msg_new:nnnn { kernel } { unknown-fpu-exception }
   {
     The~FPU~exception~'#1'~is~not~known:~
     that~trap~will~never~be~triggered.
@@ -11637,7 +11803,7 @@
         * ~ underflow
       }
   }
-\__msg_kernel_new:nnnn { kernel } { unknown-fpu-trap-type }
+\__kernel_msg_new:nnnn { kernel } { unknown-fpu-trap-type }
   { The~FPU~trap~type~'#2'~is~not~known. }
   {
     The~trap~type~must~be~one~of \\
@@ -11648,19 +11814,21 @@
         * ~ none
       }
   }
-\__msg_kernel_new:nnn { kernel } { fp-flow }
+\__kernel_msg_new:nnn { kernel } { fp-flow }
   { An ~ #3 ~ occurred. }
-\__msg_kernel_new:nnn { kernel } { fp-flow-to }
+\__kernel_msg_new:nnn { kernel } { fp-flow-to }
   { #1 ~ #3 ed ~ to ~ #2 . }
-\__msg_kernel_new:nnn { kernel } { fp-zero-div }
+\__kernel_msg_new:nnn { kernel } { fp-zero-div }
   { Division~by~zero~in~ #1 (#2) }
-\__msg_kernel_new:nnn { kernel } { fp-zero-div-ii }
+\__kernel_msg_new:nnn { kernel } { fp-zero-div-ii }
   { Division~by~zero~in~ (#1) #3 (#2) }
-\__msg_kernel_new:nnn { kernel } { fp-invalid }
+\__kernel_msg_new:nnn { kernel } { fp-invalid }
   { Invalid~operation~ #1 (#2) }
-\__msg_kernel_new:nnn { kernel } { fp-invalid-ii }
+\__kernel_msg_new:nnn { kernel } { fp-invalid-ii }
   { Invalid~operation~ (#1) #3 (#2) }
-%% File: l3fp-round.dtx Copyright(C) 2011-2017 The LaTeX3 Project
+\__kernel_msg_new:nnn { kernel } { fp-unknown-type }
+  { Unknown~type~for~'#1' }
+%% File: l3fp-round.dtx Copyright(C) 2011-2018 The LaTeX3 Project
 \cs_new:Npn \__fp_parse_word_trunc:N
   { \__fp_parse_function:NNN \__fp_round_o:Nw \__fp_round_to_zero:NNN }
 \cs_new:Npn \__fp_parse_word_floor:N
@@ -11684,14 +11852,13 @@
       \__fp_round_o:Nw \__fp_round_to_nearest:NNN #1
     #2
   }
-\__debug:TF
+\__kernel_debug:TF
   {
-    \tl_gput_right:Nn \g__debug_deprecation_on_tl
+    \__kernel_deprecation_code:nn
       {
         \cs_set_eq:NN \__fp_parse_round:Nw
           \__fp_parse_round_deprecation_error:Nw
       }
-    \tl_gput_right:Nn \g__debug_deprecation_off_tl
       {
         \cs_set_eq:NN \__fp_parse_round:Nw
           \__fp_parse_round_no_error:Nw
@@ -11830,8 +11997,14 @@
   }
 \cs_new_eq:NN \__fp_round_to_nearest_pinf_neg:NNN \__fp_round_to_nearest_ninf:NNN
 \cs_new_eq:NN \__fp_round_neg:NNN \__fp_round_to_nearest_neg:NNN
-\cs_new:Npn \__fp_round_o:Nw #1#2 @
+\cs_new:Npn \__fp_round_o:Nw #1
   {
+    \__fp_parse_function_all_fp_o:fnw
+      { \__fp_round_name_from_cs:N #1 }
+      { \__fp_round_aux_o:Nw #1 }
+  }
+\cs_new:Npn \__fp_round_aux_o:Nw #1#2 @
+  {
     \if_case:w
       \__int_eval:w \__fp_array_count:n {#2} \__int_eval_end:
          \__fp_round_no_arg_o:Nw #1 \exp:w
@@ -11969,9 +12142,8 @@
     \exp_after:wN \__fp_exp_after_o:w \exp:w \exp_end_continue_f:w
     \__fp_sanitize:Nw #1#2; {1000}{0000}{0000}{0000};
   }
-%% File: l3fp-parse.dtx Copyright (C) 2011-2017 The LaTeX3 Project
-\int_const:Nn \c__fp_prec_funcii_int { 16 }
-\int_const:Nn \c__fp_prec_func_int   { 15 }
+%% File: l3fp-parse.dtx Copyright (C) 2011-2018 The LaTeX3 Project
+\int_const:Nn \c__fp_prec_func_int   { 16 }
 \int_const:Nn \c__fp_prec_hatii_int  { 14 }
 \int_const:Nn \c__fp_prec_hat_int    { 13 }
 \int_const:Nn \c__fp_prec_not_int    { 12 }
@@ -11983,23 +12155,11 @@
 \int_const:Nn \c__fp_prec_quest_int  { 4 }
 \int_const:Nn \c__fp_prec_colon_int  { 3 }
 \int_const:Nn \c__fp_prec_comma_int  { 2 }
-\int_const:Nn \c__fp_prec_paren_int  { 1 }
+\int_const:Nn \c__fp_prec_tuple_int  { 1 }
 \int_const:Nn \c__fp_prec_end_int    { 0 }
 \cs_new:Npn \__fp_parse_expand:w #1 { \exp_end_continue_f:w #1 }
 \cs_new:Npn \__fp_parse_return_semicolon:w
     #1 \fi: \__fp_parse_expand:w { \fi: ; #1 }
-\cs_new:Npx \__fp_type_from_scan:N #1
-  {
-    \exp_not:N \exp_after:wN \exp_not:N \__fp_type_from_scan:w
-    \exp_not:N \token_to_str:N #1 \exp_not:N \q_mark
-      \tl_to_str:n { s__fp _? } \exp_not:N \q_mark \exp_not:N \q_stop
-  }
-\use:x
-  {
-    \cs_new:Npn \exp_not:N \__fp_type_from_scan:w
-      ##1 \tl_to_str:n { s__fp } ##2 \exp_not:N \q_mark ##3 \exp_not:N \q_stop
-      {##2}
-  }
 \cs_set_protected:Npn \__fp_tmp:w #1 #2 #3
   {
     \cs_new:cpn { __fp_parse_digits_ #1 :N } ##1
@@ -12044,23 +12204,35 @@
     \fi:
     #1 #2
   }
-\cs_new:Npn \__fp_parse_one_fp:NN #1#2
+\cs_new:Npn \__fp_parse_one_fp:NN #1
   {
-    \cs:w __fp_exp_after \__fp_type_from_scan:N #2 _f:nw \cs_end:
+    \__fp_exp_after_any_f:nw
       {
         \exp_after:wN \__fp_parse_infix:NN
         \exp_after:wN #1 \exp:w \__fp_parse_expand:w
       }
-    #2
   }
 \cs_new:Npn \__fp_exp_after_mark_f:nw #1
   {
-    \__msg_kernel_expandable_error:nn { kernel } { fp-early-end }
-    \exp_after:wN \c_nan_fp \exp:w \exp_end_continue_f:w #1
+    \int_case:nnF { \exp_after:wN \use_i:nnn \use_none:nnn #1 }
+      {
+        \c__fp_prec_comma_int { }
+        \c__fp_prec_tuple_int { }
+        \c__fp_prec_end_int
+          {
+            \exp_after:wN \c__fp_empty_tuple_fp
+            \exp:w \exp_end_continue_f:w
+          }
+      }
+      {
+        \__kernel_msg_expandable_error:nn { kernel } { fp-early-end }
+        \exp_after:wN \c_nan_fp \exp:w \exp_end_continue_f:w
+      }
+    #1
   }
 \cs_new:cpn { __fp_exp_after_?_f:nw } #1#2
   {
-    \__msg_kernel_expandable_error:nnn { kernel } { bad-variable } {#2}
+    \__kernel_msg_expandable_error:nnn { kernel } { bad-variable } {#2}
     \exp_after:wN \c_nan_fp \exp:w \exp_end_continue_f:w #1
   }
 \cs_set_protected:Npn \__fp_tmp:w #1
@@ -12073,9 +12245,9 @@
             \str_if_eq:nnTF {##2} { \protect }
               {
                 \cs_if_eq:NNTF ##2 #1 { \use_i:nn } { \use:n }
-                { \__msg_kernel_expandable_error:nnn { kernel } { fp-robust-cmd } }
+                { \__kernel_msg_expandable_error:nnn { kernel } { fp-robust-cmd } }
               }
-              { \__msg_kernel_expandable_error:nnn { kernel } { bad-variable } {##2} }
+              { \__kernel_msg_expandable_error:nnn { kernel } { bad-variable } {##2} }
           }
       }
   }
@@ -12174,7 +12346,7 @@
       {
         \cs_if_exist_use:cF { __fp_parse_caseless_ \str_fold_case:n {#2} :N }
           {
-            \__msg_kernel_expandable_error:nnn
+            \__kernel_msg_expandable_error:nnn
               { kernel } { unknown-fp-word } {#2}
             \exp_after:wN \c_nan_fp \exp:w \exp_end_continue_f:w
             \__fp_parse_infix:NN
@@ -12213,13 +12385,13 @@
   {
     \cs_if_exist:cTF { __fp_parse_infix_ \token_to_str:N #1 :N }
       {
-        \__msg_kernel_expandable_error:nnn
+        \__kernel_msg_expandable_error:nnn
           { kernel } { fp-missing-number } {#1}
         \exp_after:wN \c_nan_fp \exp:w \exp_end_continue_f:w
         \__fp_parse_infix:NN #3 #1
       }
       {
-        \__msg_kernel_expandable_error:nnn
+        \__kernel_msg_expandable_error:nnn
           { kernel } { fp-unknown-symbol } {#1}
         \__fp_parse_one:Nw #3
       }
@@ -12556,12 +12728,12 @@
             \__str_if_eq_x:nn { \s__fp } { \exp_not:N #1 }
             = 0 \exp_stop_f:
           0
-          \__msg_kernel_expandable_error:nnn
+          \__kernel_msg_expandable_error:nnn
             { kernel } { fp-after-e } { floating~point~ }
           \prg_return_true:
         \else:
           0
-          \__msg_kernel_expandable_error:nnn
+          \__kernel_msg_expandable_error:nnn
             { kernel } { bad-variable } {#1}
           \prg_return_false:
         \fi:
@@ -12572,7 +12744,7 @@
           \__int_value:w #1
         \else:
           0
-          \__msg_kernel_expandable_error:nnn
+          \__kernel_msg_expandable_error:nnn
             { kernel } { fp-after-e } { dimension~#1 }
         \fi:
         \prg_return_false:
@@ -12579,17 +12751,45 @@
       \fi:
     \else:
       0
-      \__msg_kernel_expandable_error:nnn
+      \__kernel_msg_expandable_error:nnn
         { kernel } { fp-missing } { exponent }
       \prg_return_true:
     \fi:
   }
 \cs_new_eq:cN { __fp_parse_prefix_+:Nw } \__fp_parse_one:Nw
+\cs_new:Npn \__fp_parse_apply_function:NNNwN #1#2#3#4@#5
+  {
+    #3 #2 #4 @
+    \exp:w \exp_end_continue_f:w #5 #1
+  }
 \cs_new:Npn \__fp_parse_apply_unary:NNNwN #1#2#3#4@#5
   {
+    \__fp_parse_apply_unary_chk:NwNw #4 @ ; . \q_stop
+    \__fp_parse_apply_unary_type:NNN
     #3 #2 #4 @
     \exp:w \exp_end_continue_f:w #5 #1
   }
+\cs_new:Npn \__fp_parse_apply_unary_chk:NwNw #1#2 ; #3#4 \q_stop
+  {
+    \if_meaning:w @ #3 \else:
+      \token_if_eq_meaning:NNTF . #3
+        { \__fp_parse_apply_unary_chk:nNNNNw { no } }
+        { \__fp_parse_apply_unary_chk:nNNNNw { multi } }
+    \fi:
+  }
+\cs_new:Npn \__fp_parse_apply_unary_chk:nNNNNw #1#2#3#4#5#6 @
+  {
+    #2
+    \__fp_error:nffn { fp-#1-arg } { \__fp_func_to_name:N #4 } { } { }
+    \exp_after:wN #4 \exp_after:wN #5 \c_nan_fp @
+  }
+\cs_new:Npn \__fp_parse_apply_unary_type:NNN #1#2#3
+  {
+    \__fp_change_func_type:NNN #3 #1 \__fp_parse_apply_unary_error:NNw
+    #2 #3
+  }
+\cs_new:Npn \__fp_parse_apply_unary_error:NNw #1#2#3 @
+  { \__fp_invalid_operation_o:fw { \__fp_func_to_name:N #1 } #3 }
 \cs_set_protected:Npn \__fp_tmp:w #1#2#3#4
   {
     \cs_new:cpn { __fp_parse_prefix_ #1 :Nw } ##1
@@ -12622,10 +12822,10 @@
     \exp_after:wN \__fp_parse_lparen_after:NwN
     \exp_after:wN #1
     \exp:w
-    \if_int_compare:w #1 = \c__fp_prec_funcii_int
+    \if_int_compare:w #1 = \c__fp_prec_func_int
       \__fp_parse_operand:Nw \c__fp_prec_comma_int
     \else:
-      \__fp_parse_operand:Nw \c__fp_prec_paren_int
+      \__fp_parse_operand:Nw \c__fp_prec_tuple_int
     \fi:
     \__fp_parse_expand:w
   }
@@ -12642,8 +12842,9 @@
         \exp_not:N \__fp_parse_expand:w
       }
       {
-        \exp_not:N \__msg_kernel_expandable_error:nnn
+        \exp_not:N \__kernel_msg_expandable_error:nnn
           { kernel } { fp-missing } { ) }
+        \exp_not:N \tl_if_empty:nT {#2} \exp_not:N \c__fp_empty_tuple_fp
         #2 @
         \exp_not:N \use_none:n #3
       }
@@ -12652,9 +12853,14 @@
   {
     \if_int_compare:w #1 = \c__fp_prec_comma_int
     \else:
-      \__msg_kernel_expandable_error:nnn
-        { kernel } { fp-missing-number } { ) }
-      \exp_after:wN \c_nan_fp \exp:w \exp_end_continue_f:w
+      \if_int_compare:w #1 = \c__fp_prec_tuple_int
+        \exp_after:wN \c__fp_empty_tuple_fp \exp:w
+      \else:
+        \__kernel_msg_expandable_error:nnn
+          { kernel } { fp-missing-number } { ) }
+        \exp_after:wN \c_nan_fp \exp:w
+      \fi:
+      \exp_end_continue_f:w
     \fi:
     \__fp_parse_infix:NN #1 )
   }
@@ -12712,12 +12918,12 @@
   }
 \cs_new:Npn \__fp_parse_function:NNN #1#2#3
   {
-    \exp_after:wN \__fp_parse_apply_unary:NNNwN
+    \exp_after:wN \__fp_parse_apply_function:NNNwN
     \exp_after:wN #3
     \exp_after:wN #2
     \exp_after:wN #1
     \exp:w
-    \__fp_parse_operand:Nw \c__fp_prec_funcii_int \__fp_parse_expand:w
+    \__fp_parse_operand:Nw \c__fp_prec_func_int \__fp_parse_expand:w
   }
 \cs_new:Npn \__fp_parse:n #1
   {
@@ -12749,52 +12955,100 @@
     \exp:w
   }
 \cs_new:Npn \__fp_parse_continue:NwN #1 #2 @ #3 { #3 #1 #2 @ }
-\cs_new:Npn \__fp_parse_apply_binary:NwNwN #1 #2@ #3 #4@ #5
+\cs_new:Npn \__fp_parse_apply_binary:NwNwN #1 #2#3@ #4 #5#6@ #7
   {
     \exp_after:wN \__fp_parse_continue:NwN
     \exp_after:wN #1
-    \exp:w \exp_end_continue_f:w \cs:w __fp_#3_o:ww \cs_end: #2 #4
-    \exp:w \exp_end_continue_f:w #5 #1
+    \exp:w \exp_end_continue_f:w
+      \exp_after:wN \__fp_parse_apply_binary_chk:NN
+        \cs:w
+          __fp
+          \__fp_type_from_scan:N #2
+          _#4
+          \__fp_type_from_scan:N #5
+          _o:ww
+        \cs_end:
+        #4
+      #2#3 #5#6
+    \exp:w \exp_end_continue_f:w #7 #1
   }
+\cs_new:Npn \__fp_parse_apply_binary_chk:NN #1#2
+  {
+    \if_meaning:w \scan_stop: #1
+      \__fp_parse_apply_binary_error:NNN #2
+    \fi:
+    #1
+  }
+\cs_new:Npn \__fp_parse_apply_binary_error:NNN #1#2#3
+  {
+    #2
+    \__fp_invalid_operation_o:Nww #1
+  }
+\cs_new:Npn \__fp_binary_type_o:Nww #1 #2#3 ; #4
+  {
+    \exp_after:wN \__fp_parse_apply_binary_chk:NN
+      \cs:w
+        __fp
+        \__fp_type_from_scan:N #2
+        _ #1
+        \__fp_type_from_scan:N #4
+        _o:ww
+      \cs_end:
+      #1
+    #2 #3 ; #4
+  }
+\cs_new:Npn \__fp_binary_rev_type_o:Nww #1 #2#3 ; #4#5 ;
+  {
+    \exp_after:wN \__fp_parse_apply_binary_chk:NN
+      \cs:w
+        __fp
+        \__fp_type_from_scan:N #4
+        _ #1
+        \__fp_type_from_scan:N #2
+        _o:ww
+      \cs_end:
+      #1
+    #4 #5 ; #2 #3 ;
+  }
 \cs_new:Npn \__fp_parse_infix_after_operand:NwN #1 #2;
   {
     \__fp_exp_after_f:nw { \__fp_parse_infix:NN #1 }
     #2;
   }
-  \cs_new:Npn \__fp_parse_infix:NN #1 #2
-    {
-      \if_catcode:w \scan_stop: \exp_not:N #2
-        \if_int_compare:w
-            \__str_if_eq_x:nn { \s__fp_mark } { \exp_not:N #2 }
-            = 0 \exp_stop_f:
-          \exp_after:wN \exp_after:wN
-          \exp_after:wN \__fp_parse_infix_mark:NNN
-        \else:
-          \exp_after:wN \exp_after:wN
-          \exp_after:wN \__fp_parse_infix_juxtapose:N
-        \fi:
+\cs_new:Npn \__fp_parse_infix:NN #1 #2
+  {
+    \if_catcode:w \scan_stop: \exp_not:N #2
+      \if_int_compare:w
+          \__str_if_eq_x:nn { \s__fp_mark } { \exp_not:N #2 }
+          = 0 \exp_stop_f:
+        \exp_after:wN \exp_after:wN
+        \exp_after:wN \__fp_parse_infix_mark:NNN
       \else:
-        \if_int_compare:w
-            \__int_eval:w
-              ( `#2 \if_int_compare:w `#2 > `Z - 32 \fi: ) / 26
-            = 3 \exp_stop_f:
-          \exp_after:wN \exp_after:wN
-          \exp_after:wN \__fp_parse_infix_juxtapose:N
-        \else:
-          \exp_after:wN \__fp_parse_infix_check:NNN
-          \cs:w
-            __fp_parse_infix_ \token_to_str:N #2 :N
-            \exp_after:wN \exp_after:wN \exp_after:wN
-          \cs_end:
-        \fi:
+        \exp_after:wN \exp_after:wN
+        \exp_after:wN \__fp_parse_infix_mul:N
       \fi:
-      #1
-      #2
-    }
+    \else:
+      \if_int_compare:w
+          \__int_eval:w
+            ( `#2 \if_int_compare:w `#2 > `Z - 32 \fi: ) / 26
+          = 3 \exp_stop_f:
+        \exp_after:wN \exp_after:wN
+        \exp_after:wN \__fp_parse_infix_mul:N
+      \else:
+        \exp_after:wN \__fp_parse_infix_check:NNN
+        \cs:w
+          __fp_parse_infix_ \token_to_str:N #2 :N
+          \exp_after:wN \exp_after:wN \exp_after:wN
+        \cs_end:
+      \fi:
+    \fi:
+    #1
+    #2
+  }
 \cs_new:Npx \__fp_parse_infix_check:NNN #1#2#3
   {
     \exp_not:N \if_meaning:w \scan_stop: #1
-      \exp_not:N \__msg_kernel_expandable_error:nnn
+      \exp_not:N \__kernel_msg_expandable_error:nnn
         { kernel } { fp-missing } { * }
       \exp_not:N \exp_after:wN
       \exp_not:c { __fp_parse_infix_*:N }
@@ -12815,15 +13069,15 @@
   {
     \cs_new:Npn #1 ##1
       {
-        \if_int_compare:w ##1 < \c__fp_prec_paren_int
-          \__msg_kernel_expandable_error:nnn { kernel } { fp-extra } { ) }
+        \if_int_compare:w ##1 > \c__fp_prec_end_int
+          \exp_after:wN @
+          \exp_after:wN \use_none:n
+          \exp_after:wN #1
+        \else:
+          \__kernel_msg_expandable_error:nnn { kernel } { fp-extra } { ) }
           \exp_after:wN \__fp_parse_infix:NN
           \exp_after:wN ##1
           \exp:w \exp_after:wN \__fp_parse_expand:w
-        \else:
-          \exp_after:wN @
-          \exp_after:wN \use_none:n
-          \exp_after:wN #1
         \fi:
       }
   }
@@ -12838,10 +13092,15 @@
           \exp_after:wN #1
         \else:
           \if_int_compare:w ##1 < \c__fp_prec_comma_int
-            \__fp_parse_infix_comma_error:w
+            \exp_after:wN @
+            \exp_after:wN \__fp_parse_apply_comma:NwNwN
+            \exp_after:wN ,
+            \exp:w
+          \else:
+            \exp_after:wN \__fp_parse_infix_comma:w
+            \exp:w
           \fi:
-          \exp_after:wN \__fp_parse_infix_comma:w
-          \exp:w \__fp_parse_operand:Nw \c__fp_prec_comma_int
+          \__fp_parse_operand:Nw \c__fp_prec_comma_int
           \exp_after:wN \__fp_parse_expand:w
         \fi:
       }
@@ -12849,28 +13108,15 @@
 \exp_args:Nc \__fp_tmp:w { __fp_parse_infix_,:N }
 \cs_new:Npn \__fp_parse_infix_comma:w #1 @
   { #1 @ \use_none:n }
-\cs_new:Npn \__fp_parse_infix_comma_error:w #1 \exp:w
+\cs_new:Npn \__fp_parse_apply_comma:NwNwN #1 #2@ #3 #4@ #5
   {
-    \fi:
-    \__msg_kernel_expandable_error:nn { kernel } { fp-extra-comma }
-    \exp_after:wN @
-    \exp_after:wN \__fp_parse_apply_binary:NwNwN
-    \exp_after:wN ,
-    \exp:w
+    \exp_after:wN \__fp_parse_continue:NwN
+    \exp_after:wN #1
+    \exp:w \exp_end_continue_f:w
+    \__fp_exp_after_tuple_f:nw { }
+      \s__fp_tuple \__fp_tuple_chk:w { #2 #4 } ;
+    #5 #1
   }
-\cs_set_protected:Npn \__fp_tmp:w #1
-  {
-    \cs_new:Npn #1 ##1
-      {
-        \if_meaning:w \s__fp ##1
-          \exp_after:wN \__fp_use_i_until_s:nw
-          \exp_after:wN #1
-        \fi:
-        \exp_after:wN \c_nan_fp
-        ##1
-      }
-  }
-\exp_args:Nc \__fp_tmp:w { __fp_,_o:ww }
 \cs_set_protected:Npn \__fp_tmp:w #1#2#3#4
   {
     \cs_new:Npn #1 ##1
@@ -12904,32 +13150,7 @@
 \exp_args:Nc \__fp_tmp:w { __fp_parse_infix_or:N }  |
   \c__fp_prec_or_int    \c__fp_prec_or_int
 \cs_new:cpn { __fp_parse_infix_(:N } #1
-  { \__fp_parse_infix_juxtapose:N #1 ( }
-\cs_new:Npn \__fp_parse_infix_juxtapose:N #1
-  {
-    \if_int_compare:w #1 < \c__fp_prec_times_int
-      \exp_after:wN @
-      \exp_after:wN \__fp_parse_apply_juxtapose:NwwN
-      \exp:w
-      \__fp_parse_operand:Nw \c__fp_prec_times_int
-      \exp_after:wN \__fp_parse_expand:w
-    \else:
-      \exp_after:wN @
-      \exp_after:wN \use_none:n
-      \exp_after:wN \__fp_parse_infix_juxtapose:N
-    \fi:
-  }
-\cs_new:Npn \__fp_parse_apply_juxtapose:NwwN #1 #2;#3@ #4;#5@
-  {
-    \if_catcode:w ^ \tl_to_str:n { #3 #5 } ^
-    \else:
-      \__fp_error:nffn { fp-invalid-ii }
-        { \__fp_array_to_clist:n { #2; #3 } }
-        { \__fp_array_to_clist:n { #4; #5 } }
-        { }
-    \fi:
-    \__fp_parse_apply_binary:NwNwN #1 #2;@ * #4;@
-  }
+  { \__fp_parse_infix_mul:N #1 ( }
 \cs_set_protected:Npn \__fp_tmp:w #1
   {
     \cs_new:cpn { __fp_parse_infix_*:N } ##1##2
@@ -12985,7 +13206,7 @@
 \exp_args:Nc \__fp_tmp:w { __fp_parse_infix_::N }
   \__fp_ternary_auxii:NwwN \c__fp_prec_colon_int
   {
-    \__msg_kernel_expandable_error:nnnn
+    \__kernel_msg_expandable_error:nnnn
       { kernel } { fp-missing } { ? } { ~for~?: }
   }
 \cs_new:cpn { __fp_parse_infix_<:N } #1
@@ -13006,7 +13227,7 @@
   }
 \cs_new:Npn \__fp_parse_excl_error:
   {
-    \__msg_kernel_expandable_error:nnnn
+    \__kernel_msg_expandable_error:nnnn
       { kernel } { fp-missing } { = } { ~after~!. }
   }
 \cs_new:Npn \__fp_parse_compare:NNNNNNN #1
@@ -13095,12 +13316,99 @@
   }
 \cs_new:Npn \__fp_parse_continue_compare:NNwNN #1#2 #3@ #4#5
   { #4 #2 #3@ #1 }
+\cs_new:Npn \__fp_parse_function_all_fp_o:fnw #1#2#3 @
+  {
+    \__fp_array_if_all_fp:nTF {#3}
+      { #2 #3 @ }
+      {
+        \__fp_error:nffn { fp-bad-args }
+          {#1}
+          { \fp_to_tl:n { \s__fp_tuple \__fp_tuple_chk:w {#3} ; } }
+          { }
+        \exp_after:wN \c_nan_fp
+      }
+  }
+\cs_new:Npn \__fp_parse_function_one_two:nnw #1#2#3
+  {
+    \__fp_if_type_fp:NTwFw
+      #3 { } \s__fp \__fp_parse_function_one_two_error_o:w \q_stop
+    \__fp_parse_function_one_two_aux:nnw {#1} {#2} #3
+  }
+\cs_new:Npn \__fp_parse_function_one_two_error_o:w #1#2#3#4 @
+  {
+    \__fp_error:nffn { fp-bad-args }
+      {#2}
+      { \fp_to_tl:n { \s__fp_tuple \__fp_tuple_chk:w {#4} ; } }
+      { }
+    \exp_after:wN \c_nan_fp
+  }
+\cs_new:Npn \__fp_parse_function_one_two_aux:nnw #1#2 #3; #4
+  {
+    \__fp_if_type_fp:NTwFw
+      #4 { }
+      \s__fp
+      {
+        \if_meaning:w @ #4
+          \exp_after:wN \use_iv:nnnn
+        \fi:
+        \__fp_parse_function_one_two_error_o:w
+      }
+      \q_stop
+    \__fp_parse_function_one_two_auxii:nnw {#1} {#2} #3; #4
+  }
+\cs_new:Npn \__fp_parse_function_one_two_auxii:nnw #1#2#3; #4; #5
+  {
+    \if_meaning:w @ #5 \else:
+      \exp_after:wN \__fp_parse_function_one_two_error_o:w
+    \fi:
+    \use_ii:nn {#1} { \use_none:n #2 } #3; #4; #5
+  }
+\cs_new:Npn \__fp_tuple_map_o:nw #1 \s__fp_tuple \__fp_tuple_chk:w #2 ;
+  {
+    \exp_after:wN \s__fp_tuple
+    \exp_after:wN \__fp_tuple_chk:w
+    \exp_after:wN {
+      \exp:w \exp_end_continue_f:w
+      \__fp_tuple_map_loop_o:nw {#1} #2
+        { \s__fp \__prg_break: } ;
+      \__prg_break_point:
+    \exp_after:wN } \exp_after:wN ;
+  }
+\cs_new:Npn \__fp_tuple_map_loop_o:nw #1#2#3 ;
+  {
+    \use_none:n #2
+    #1 #2 #3 ;
+    \exp:w \exp_end_continue_f:w
+    \__fp_tuple_map_loop_o:nw {#1}
+  }
+\cs_new:Npn \__fp_tuple_mapthread_o:nww #1
+    \s__fp_tuple \__fp_tuple_chk:w #2 ;
+    \s__fp_tuple \__fp_tuple_chk:w #3 ;
+  {
+    \exp_after:wN \s__fp_tuple
+    \exp_after:wN \__fp_tuple_chk:w
+    \exp_after:wN {
+      \exp:w \exp_end_continue_f:w
+      \__fp_tuple_mapthread_loop_o:nw {#1}
+        #2 { \s__fp \__prg_break: } ; @
+        #3 { \s__fp \__prg_break: } ;
+      \__prg_break_point:
+    \exp_after:wN } \exp_after:wN ;
+  }
+\cs_new:Npn \__fp_tuple_mapthread_loop_o:nw #1#2#3 ; #4 @ #5#6 ;
+  {
+    \use_none:n #2
+    \use_none:n #5
+    #1 #2 #3 ; #5 #6 ;
+    \exp:w \exp_end_continue_f:w
+    \__fp_tuple_mapthread_loop_o:nw {#1} #4 @
+  }
 \cs_new:Npn \fp_function:Nw #1
   {
     \exp_after:wN \__fp_function_apply:nw
     \exp_after:wN #1
     \exp:w
-      \__fp_parse_operand:Nw \c__fp_prec_funcii_int \__fp_parse_expand:w
+      \__fp_parse_operand:Nw \c__fp_prec_func_int \__fp_parse_expand:w
   }
 \cs_new_protected:Npn \fp_new_function:Npn #1#2#
   {
@@ -13120,7 +13428,7 @@
             \__int_value:w #3 \exp_after:wN ; \exp_after:wN
           }
         \exp:w
-          \__fp_parse_operand:Nw \c__fp_prec_funcii_int \__fp_parse_expand:w
+          \__fp_parse_operand:Nw \c__fp_prec_func_int \__fp_parse_expand:w
       }
     \cs_new:Npn #2 #4 {#5}
   }
@@ -13130,7 +13438,7 @@
     \int_compare:nNnTF { \tl_count:n {#3} } = {#2}
       { #1 #3 }
       {
-        \__msg_kernel_expandable_error:nnnnn
+        \__kernel_msg_expandable_error:nnnnn
           { kernel } { fp-num-args } { #1() } {#2} {#2}
         \c_nan_fp
       }
@@ -13152,32 +13460,96 @@
 \cs_new:Npn \__fp_function_store_end:wnnn
     #1 \s__fp_stop #2#3#4
   { #4 {#2} }
-\__msg_kernel_new:nnn { kernel } { fp-deprecated }
+\__kernel_msg_new:nnn { kernel } { fp-deprecated }
   { '#1'~deprecated;~use~'#2' }
-\__msg_kernel_new:nnn { kernel } { unknown-fp-word }
+\__kernel_msg_new:nnn { kernel } { unknown-fp-word }
   { Unknown~fp~word~#1. }
-\__msg_kernel_new:nnn { kernel } { fp-missing }
+\__kernel_msg_new:nnn { kernel } { fp-missing }
   { Missing~#1~inserted #2. }
-\__msg_kernel_new:nnn { kernel } { fp-extra }
+\__kernel_msg_new:nnn { kernel } { fp-extra }
   { Extra~#1~ignored. }
-\__msg_kernel_new:nnn { kernel } { fp-early-end }
+\__kernel_msg_new:nnn { kernel } { fp-early-end }
   { Premature~end~in~fp~expression. }
-\__msg_kernel_new:nnn { kernel } { fp-after-e }
+\__kernel_msg_new:nnn { kernel } { fp-after-e }
   { Cannot~use~#1 after~'e'. }
-\__msg_kernel_new:nnn { kernel } { fp-missing-number }
+\__kernel_msg_new:nnn { kernel } { fp-missing-number }
   { Missing~number~before~'#1'. }
-\__msg_kernel_new:nnn { kernel } { fp-unknown-symbol }
+\__kernel_msg_new:nnn { kernel } { fp-unknown-symbol }
   { Unknown~symbol~#1~ignored. }
-\__msg_kernel_new:nnn { kernel } { fp-extra-comma }
-  { Unexpected~comma:~extra~arguments~ignored. }
-\__msg_kernel_new:nnn { kernel } { fp-num-args }
+\__kernel_msg_new:nnn { kernel } { fp-extra-comma }
+  { Unexpected~comma~turned~to~nan~result. }
+\__kernel_msg_new:nnn { kernel } { fp-no-arg }
+  { #1~got~no~argument;~used~nan. }
+\__kernel_msg_new:nnn { kernel } { fp-multi-arg }
+  { #1~got~more~than~one~argument;~used~nan. }
+\__kernel_msg_new:nnn { kernel } { fp-num-args }
   { #1~expects~between~#2~and~#3~arguments. }
+\__kernel_msg_new:nnn { kernel } { fp-bad-args }
+  { Arguments~in~#1#2~are~invalid. }
 \cs_if_exist:cT { @unexpandable at protect }
   {
-    \__msg_kernel_new:nnn { kernel } { fp-robust-cmd }
+    \__kernel_msg_new:nnn { kernel } { fp-robust-cmd }
       { Robust~command~#1 invalid~in~fp~expression! }
   }
-%% File: l3fp-logic.dtx Copyright (C) 2011-2017 The LaTeX3 Project
+%% File: l3fp-assign.dtx Copyright (C) 2011-2017 The LaTeX3 project
+\cs_new_protected:Npn \fp_new:N #1
+  { \cs_new_eq:NN #1 \c_zero_fp }
+\cs_generate_variant:Nn \fp_new:N {c}
+\cs_new_protected:Npn \fp_set:Nn   #1#2
+  { \tl_set:Nx #1 { \exp_not:f { \__fp_parse:n {#2} } } }
+\cs_new_protected:Npn \fp_gset:Nn  #1#2
+  { \tl_gset:Nx #1 { \exp_not:f { \__fp_parse:n {#2} } } }
+\cs_new_protected:Npn \fp_const:Nn #1#2
+  { \tl_const:Nx #1 { \exp_not:f { \__fp_parse:n {#2} } } }
+\cs_generate_variant:Nn \fp_set:Nn {c}
+\cs_generate_variant:Nn \fp_gset:Nn {c}
+\cs_generate_variant:Nn \fp_const:Nn {c}
+\cs_new_eq:NN \fp_set_eq:NN  \tl_set_eq:NN
+\cs_new_eq:NN \fp_gset_eq:NN \tl_gset_eq:NN
+\cs_generate_variant:Nn \fp_set_eq:NN  { c , Nc , cc }
+\cs_generate_variant:Nn \fp_gset_eq:NN { c , Nc , cc }
+\cs_new_protected:Npn \fp_zero:N #1 { \fp_set_eq:NN #1 \c_zero_fp }
+\cs_new_protected:Npn \fp_gzero:N #1 { \fp_gset_eq:NN #1 \c_zero_fp }
+\cs_generate_variant:Nn \fp_zero:N  { c }
+\cs_generate_variant:Nn \fp_gzero:N { c }
+\cs_new_protected:Npn \fp_zero_new:N #1
+  { \fp_if_exist:NTF #1 { \fp_zero:N #1 } { \fp_new:N #1 } }
+\cs_new_protected:Npn \fp_gzero_new:N #1
+  { \fp_if_exist:NTF #1 { \fp_gzero:N #1 } { \fp_new:N #1 } }
+\cs_generate_variant:Nn \fp_zero_new:N  { c }
+\cs_generate_variant:Nn \fp_gzero_new:N { c }
+\cs_new_protected:Npn \fp_add:Nn  { \__fp_add:NNNn \fp_set:Nn  + }
+\cs_new_protected:Npn \fp_gadd:Nn { \__fp_add:NNNn \fp_gset:Nn + }
+\cs_new_protected:Npn \fp_sub:Nn  { \__fp_add:NNNn \fp_set:Nn  - }
+\cs_new_protected:Npn \fp_gsub:Nn { \__fp_add:NNNn \fp_gset:Nn - }
+\cs_new_protected:Npn \__fp_add:NNNn #1#2#3#4
+  { #1 #3 { #3 #2 \__fp_parse:n {#4} } }
+\cs_generate_variant:Nn \fp_add:Nn  { c }
+\cs_generate_variant:Nn \fp_gadd:Nn { c }
+\cs_generate_variant:Nn \fp_sub:Nn  { c }
+\cs_generate_variant:Nn \fp_gsub:Nn { c }
+\cs_new_protected:Npn \fp_show:N { \__fp_show:NN \tl_show:n }
+\cs_generate_variant:Nn \fp_show:N { c }
+\cs_new_protected:Npn \fp_log:N { \__fp_show:NN \tl_log:n }
+\cs_generate_variant:Nn \fp_log:N { c }
+\cs_new_protected:Npn \__fp_show:NN #1#2
+  {
+    \__kernel_check_defined:NT #2
+      { \exp_args:Nx #1 { \token_to_str:N #2 = \fp_to_tl:N #2 } }
+  }
+\cs_new_protected:Npn \fp_show:n
+  { \msg_show_eval:Nn \fp_to_tl:n }
+\cs_new_protected:Npn \fp_log:n
+  { \msg_log_eval:Nn \fp_to_tl:n }
+\fp_const:Nn \c_e_fp          { 2.718 2818 2845 9045 }
+\fp_const:Nn \c_one_fp        { 1 }
+\fp_const:Nn \c_pi_fp         { 3.141 5926 5358 9793 }
+\fp_const:Nn \c_one_degree_fp { 0.0 1745 3292 5199 4330 }
+\fp_new:N \l_tmpa_fp
+\fp_new:N \l_tmpb_fp
+\fp_new:N \g_tmpa_fp
+\fp_new:N \g_tmpb_fp
+%% File: l3fp-logic.dtx Copyright (C) 2011-2018 The LaTeX3 Project
 \cs_new:Npn \__fp_parse_word_max:N
   { \__fp_parse_function:NNN \__fp_minmax_o:Nw 2 }
 \cs_new:Npn \__fp_parse_word_min:N
@@ -13335,7 +13707,7 @@
       }
       {
         \token_if_eq_meaning:NNTF #2 0
-          { \__msg_kernel_expandable_error:nnn { kernel } { zero-step } {#6} }
+          { \__kernel_msg_expandable_error:nnn { kernel } { zero-step } {#6} }
           {
             \__fp_error:nnfn { fp-bad-step } { }
               { \fp_to_tl:n { \s__fp \__fp_chk:w #2#3#4 ; } } {#6}
@@ -13386,12 +13758,18 @@
     \fp_step_function:nnnN {#3} {#4} {#5} #2
     \__prg_break_point:Nn \scan_stop: { \int_gdecr:N \g__prg_map_int }
   }
-\__msg_kernel_new:nnn { kernel } { fp-bad-step }
+\__kernel_msg_new:nnn { kernel } { fp-bad-step }
   { Invalid~step~size~#2~in~step~function~#3. }
-\__msg_kernel_new:nnn { kernel } { fp-tiny-step }
+\__kernel_msg_new:nnn { kernel } { fp-tiny-step }
   { Tiny~step~size~(#1+#2=#1)~in~step~function~#3. }
-\cs_new:Npn \__fp_minmax_o:Nw #1#2 @
+\cs_new:Npn \__fp_minmax_o:Nw #1
   {
+    \__fp_parse_function_all_fp_o:fnw
+      { \token_if_eq_meaning:NNTF 0 #1 { min } { max } }
+      { \__fp_minmax_aux_o:Nw #1 }
+  }
+\cs_new:Npn \__fp_minmax_aux_o:Nw #1#2 @
+  {
     \if_meaning:w 0 #1
       \exp_after:wN \__fp_minmax_loop:Nww \exp_after:wN +
     \else:
@@ -13467,7 +13845,7 @@
         \__fp_parse_operand:Nw \c__fp_prec_colon_int
         \__fp_parse_expand:w
     \else:
-      \__msg_kernel_expandable_error:nnnn
+      \__kernel_msg_expandable_error:nnnn
         { kernel } { fp-missing } { : } { ~for~?: }
       \exp_after:wN \__fp_parse_continue:NwN
       \exp_after:wN #1
@@ -13507,7 +13885,7 @@
     \__fp_exp_after_array_f:w #3 \s__fp_stop
     #4 #1
   }
-%% File: l3fp-basics.dtx Copyright (C) 2011-2014,2016,2017 The LaTeX3 Project
+%% File: l3fp-basics.dtx Copyright (C) 2011-2014,2016-2018 The LaTeX3 Project
 \cs_new:Npn \__fp_parse_word_abs:N
   { \__fp_parse_unary_function:NNN \__fp_set_sign_o:w 0 }
 \cs_new:Npn \__fp_parse_word_sign:N
@@ -14269,6 +14647,43 @@
       \if_case:w #3 \exp_stop_f: #1 \or: 1 \or: 0 \fi: \exp_stop_f:
     #4;
   }
+\cs_new:Npn \__fp_tuple_set_sign_o:w #1
+  {
+    \if_meaning:w 2 #1
+      \exp_after:wN \__fp_tuple_set_sign_aux_o:Nnw
+    \fi:
+    \__fp_invalid_operation_o:nw { abs }
+  }
+\cs_new:Npn \__fp_tuple_set_sign_aux_o:Nnw #1#2#3 @
+  { \__fp_tuple_map_o:nw \__fp_tuple_set_sign_aux_o:w #3 }
+\cs_new:Npn \__fp_tuple_set_sign_aux_o:w #1#2 ;
+  {
+    \__fp_change_func_type:NNN #1 \__fp_set_sign_o:w
+      \__fp_parse_apply_unary_error:NNw
+    2 #1 #2 ; @
+  }
+\cs_new:cpn { __fp_*_tuple_o:ww } #1 ;
+  { \__fp_tuple_map_o:nw { \__fp_binary_type_o:Nww * #1 ; } }
+\cs_new:cpn { __fp_tuple_*_o:ww } #1 ; #2 ;
+  { \__fp_tuple_map_o:nw { \__fp_binary_rev_type_o:Nww * #2 ; } #1 ; }
+\cs_new:cpn { __fp_tuple_/_o:ww } #1 ; #2 ;
+  { \__fp_tuple_map_o:nw { \__fp_binary_rev_type_o:Nww / #2 ; } #1 ; }
+\cs_set_protected:Npn \__fp_tmp:w #1
+  {
+    \cs_new:cpn { __fp_tuple_#1_tuple_o:ww }
+        \s__fp_tuple \__fp_tuple_chk:w ##1 ;
+        \s__fp_tuple \__fp_tuple_chk:w ##2 ;
+      {
+        \int_compare:nNnTF
+          { \__fp_array_count:n {##1} } = { \__fp_array_count:n {##2} }
+          { \__fp_tuple_mapthread_o:nww { \__fp_binary_type_o:Nww #1 } }
+          { \__fp_invalid_operation_o:nww #1 }
+        \s__fp_tuple \__fp_tuple_chk:w {##1} ;
+        \s__fp_tuple \__fp_tuple_chk:w {##2} ;
+      }
+  }
+\__fp_tmp:w +
+\__fp_tmp:w -
 %% File: l3fp-extended.dtx Copyright (C) 2011-2017 The LaTeX3 Project
 \tl_const:Nn \c__fp_one_fixed_tl
   { {10000} {0000} {0000} {0000} {0000} {0000} ; }
@@ -15379,7 +15794,7 @@
       1
     \fi:
   }
-%% File: l3fp-trig.dtx Copyright (C) 2011-2017 The LaTeX3 Project
+%% File: l3fp-trig.dtx Copyright (C) 2011-2018 The LaTeX3 Project
 \tl_map_inline:nn
   {
     {acos} {acsc} {asec} {asin}
@@ -15912,32 +16327,21 @@
     }
     #1
   }
-\cs_new:Npn \__fp_atan_o:Nw
+\cs_new:Npn \__fp_atan_o:Nw #1
   {
-    \__fp_atan_dispatch_o:NNnNw
-      \__fp_acotii_o:Nww \__fp_atanii_o:Nww { atan }
+    \__fp_parse_function_one_two:nnw
+      { #1 { atan } { atand } }
+      { \__fp_atan_default:w \__fp_atanii_o:Nww #1 }
   }
-\cs_new:Npn \__fp_acot_o:Nw
+\cs_new:Npn \__fp_acot_o:Nw #1
   {
-    \__fp_atan_dispatch_o:NNnNw
-      \__fp_atanii_o:Nww \__fp_acotii_o:Nww { acot }
+    \__fp_parse_function_one_two:nnw
+      { #1 { acot } { acotd } }
+      { \__fp_atan_default:w \__fp_acotii_o:Nww #1 }
   }
-\cs_new:Npn \__fp_atan_dispatch_o:NNnNw #1#2#3#4#5@
-  {
-    \if_case:w
-      \__int_eval:w \__fp_array_count:n {#5} - 1 \__int_eval_end:
-         \exp_after:wN #1 \exp_after:wN #4 \c_one_fp #5
-         \exp:w
-    \or: #2 #4 #5 \exp:w
-    \else:
-      \__msg_kernel_expandable_error:nnnnn
-        { kernel } { fp-num-args } { #3() } { 1 } { 2 }
-      \exp_after:wN \c_nan_fp \exp:w
-    \fi:
-    \exp_after:wN \exp_end:
-  }
+\cs_new:Npx \__fp_atan_default:w #1#2#3 @ { #1 #2 #3 \c_one_fp @ }
 \cs_new:Npn \__fp_atanii_o:Nww
-    #1 \s__fp \__fp_chk:w #2#3#4; \s__fp \__fp_chk:w #5
+    #1 \s__fp \__fp_chk:w #2#3#4; \s__fp \__fp_chk:w #5 #6 @
   {
     \if_meaning:w 3 #2 \__fp_case_return_i_o:ww \fi:
     \if_meaning:w 3 #5 \__fp_case_return_ii_o:ww \fi:
@@ -15954,7 +16358,7 @@
     \fi:
     \__fp_atan_normal_o:NNnwNnw #1
     \s__fp \__fp_chk:w #2#3#4;
-    \s__fp \__fp_chk:w #5
+    \s__fp \__fp_chk:w #5 #6
   }
 \cs_new:Npn \__fp_acotii_o:Nww #1#2; #3;
   { \__fp_atanii_o:Nww #1#3; #2; }
@@ -16185,7 +16589,28 @@
         { \__fp_asin_auxi_o:NnNww #1 {#3} #4 }
       }
   }
-%% File: l3fp-convert.dtx Copyright(C) 2011-2017 The LaTeX3 Project
+%% File: l3fp-convert.dtx Copyright(C) 2011-2018 The LaTeX3 Project
+\cs_new:Npn \__fp_tuple_convert:Nw #1 \s__fp_tuple \__fp_tuple_chk:w #2 ;
+  {
+    \int_case:nnF { \__fp_array_count:n {#2} }
+      {
+        { 0 } { ( ) }
+        { 1 } { \__fp_tuple_convert_end:w @ { #1 #2 , } }
+      }
+      {
+        \__fp_tuple_convert_loop:nNw { } #1
+          #2 { ? \__fp_tuple_convert_end:w } ;
+          @ { \use_none:nn }
+      }
+  }
+\cs_new:Npn \__fp_tuple_convert_loop:nNw #1#2#3#4; #5 @ #6
+  {
+    \use_none:n #3
+    \exp_args:Nf \__fp_tuple_convert_loop:nNw { #2 #3#4 ; } #2 #5
+      @ { #6 , ~ #1 }
+  }
+\cs_new:Npn \__fp_tuple_convert_end:w #1 @ #2
+  { \exp_after:wN ( \exp:w \exp_end_continue_f:w #2 ) }
 \cs_new:Npn \__fp_trim_zeros:w #1 ;
   {
     \__fp_trim_zeros_loop:w #1
@@ -16202,8 +16627,21 @@
     \exp_after:wN \__fp_to_scientific_dispatch:w
     \exp:w \exp_end_continue_f:w \__fp_parse:n
   }
-\cs_new:Npn \__fp_to_scientific_dispatch:w \s__fp \__fp_chk:w #1#2
+\cs_new:Npn \__fp_to_scientific_dispatch:w #1
   {
+    \__fp_change_func_type:NNN
+      #1 \__fp_to_scientific:w \__fp_to_scientific_recover:w
+    #1
+  }
+\cs_new:Npn \__fp_to_scientific_recover:w #1 #2 ;
+  {
+    \__fp_error:nffn { fp-unknown-type } { \tl_to_str:n { #2 ; } } { } { }
+    nan
+  }
+\cs_new:Npn \__fp_tuple_to_scientific:w
+  { \__fp_tuple_convert:Nw \__fp_to_scientific_dispatch:w }
+\cs_new:Npn \__fp_to_scientific:w \s__fp \__fp_chk:w #1#2
+  {
     \if_meaning:w 2 #2 \exp_after:wN - \exp:w \exp_end_continue_f:w \fi:
     \if_case:w #1 \exp_stop_f:
          \__fp_case_return:nw { 0.000000000000000e0 }
@@ -16243,8 +16681,21 @@
     \exp_after:wN \__fp_to_decimal_dispatch:w
     \exp:w \exp_end_continue_f:w \__fp_parse:n
   }
-\cs_new:Npn \__fp_to_decimal_dispatch:w \s__fp \__fp_chk:w #1#2
+\cs_new:Npn \__fp_to_decimal_dispatch:w #1
   {
+    \__fp_change_func_type:NNN
+      #1 \__fp_to_decimal:w \__fp_to_decimal_recover:w
+    #1
+  }
+\cs_new:Npn \__fp_to_decimal_recover:w #1 #2 ;
+  {
+    \__fp_error:nffn { fp-unknown-type } { \tl_to_str:n { #2 ; } } { } { }
+    nan
+  }
+\cs_new:Npn \__fp_tuple_to_decimal:w
+  { \__fp_tuple_convert:Nw \__fp_to_decimal_dispatch:w }
+\cs_new:Npn \__fp_to_decimal:w \s__fp \__fp_chk:w #1#2
+  {
     \if_meaning:w 2 #2 \exp_after:wN - \exp:w \exp_end_continue_f:w \fi:
     \if_case:w #1 \exp_stop_f:
          \__fp_case_return:nw { 0 }
@@ -16308,8 +16759,17 @@
     \exp_after:wN \__fp_to_tl_dispatch:w
     \exp:w \exp_end_continue_f:w \__fp_parse:n
   }
-\cs_new:Npn \__fp_to_tl_dispatch:w \s__fp \__fp_chk:w #1#2
+\cs_new:Npn \__fp_to_tl_dispatch:w #1
+  { \__fp_change_func_type:NNN #1 \__fp_to_tl:w \__fp_to_tl_recover:w #1 }
+\cs_new:Npn \__fp_to_tl_recover:w #1 #2 ;
   {
+    \__fp_error:nffn { fp-unknown-type } { \tl_to_str:n { #2 ; } } { } { }
+    nan
+  }
+\cs_new:Npn \__fp_tuple_to_tl:w
+  { \__fp_tuple_convert:Nw \__fp_to_tl_dispatch:w }
+\cs_new:Npn \__fp_to_tl:w \s__fp \__fp_chk:w #1#2
+  {
     \if_meaning:w 2 #2 \exp_after:wN - \exp:w \exp_end_continue_f:w \fi:
     \if_case:w #1 \exp_stop_f:
            \__fp_case_return:nw { 0 }
@@ -16337,10 +16797,21 @@
 \cs_new:Npn \__fp_to_tl_scientific:wNw #1 ; #2#3;
   { \__fp_trim_zeros:w #2.#3 ; #1 }
 \cs_new:Npn \fp_to_dim:N #1
-  { \fp_to_decimal:N #1 pt }
+  { \exp_after:wN \__fp_to_dim_dispatch:w #1 }
 \cs_generate_variant:Nn \fp_to_dim:N { c }
-\cs_new:Npn \fp_to_dim:n #1
-  { \fp_to_decimal:n {#1} pt }
+\cs_new:Npn \fp_to_dim:n
+  {
+    \exp_after:wN \__fp_to_dim_dispatch:w
+    \exp:w \exp_end_continue_f:w \__fp_parse:n
+  }
+\cs_new:Npn \__fp_to_dim_dispatch:w #1#2 ;
+  {
+    \__fp_change_func_type:NNN #1 \__fp_to_dim:w \__fp_to_dim_recover:w
+    #1 #2 ;
+  }
+\cs_new:Npn \__fp_to_dim_recover:w #1
+  { \__fp_invalid_operation:nnw { 0pt } { fp_to_dim } }
+\cs_new:Npn \__fp_to_dim:w #1 ; { \__fp_to_decimal:w #1 ; pt }
 \cs_new:Npn \fp_to_int:N #1 { \exp_after:wN \__fp_to_int_dispatch:w #1 }
 \cs_generate_variant:Nn \fp_to_int:N { c }
 \cs_new:Npn \fp_to_int:n
@@ -16348,12 +16819,19 @@
     \exp_after:wN \__fp_to_int_dispatch:w
     \exp:w \exp_end_continue_f:w \__fp_parse:n
   }
-\cs_new:Npn \__fp_to_int_dispatch:w #1;
+\cs_new:Npn \__fp_to_int_dispatch:w #1#2 ;
   {
-    \exp_after:wN \__fp_to_decimal_dispatch:w \exp:w \exp_end_continue_f:w
+    \__fp_change_func_type:NNN #1 \__fp_to_int:w \__fp_to_int_recover:w
+    #1 #2 ;
+  }
+\cs_new:Npn \__fp_to_int_recover:w #1
+  { \__fp_invalid_operation:nnw { 0 } { fp_to_int } }
+\cs_new:Npn \__fp_to_int:w #1;
+  {
+    \exp_after:wN \__fp_to_decimal:w \exp:w \exp_end_continue_f:w
     \__fp_round:Nwn \__fp_round_to_nearest:NNN #1; { 0 }
   }
-\__debug_patch_args:nNNpn { { (#1) } }
+\__kernel_patch_args:nNNpn { { (#1) } }
 \cs_new:Npn \dim_to_fp:n #1
   {
     \exp_after:wN \__fp_from_dim_test:ww
@@ -16423,7 +16901,7 @@
                  }
     \exp_not:N \__fp_array_to_clist_loop:Nw
   }
-%% File: l3fp-random.dtx Copyright (C) 2016,2017 The LaTeX3 Project
+%% File: l3fp-random.dtx Copyright (C) 2016-2018 The LaTeX3 Project
 \cs_new:Npn \__fp_parse_word_rand:N
   { \__fp_parse_function:NNN \__fp_rand_o:Nw ? }
 \cs_new:Npn \__fp_parse_word_randint:N
@@ -16430,11 +16908,11 @@
   { \__fp_parse_function:NNN \__fp_randint_o:Nw ? }
 \cs_if_exist:NF \pdftex_uniformdeviate:D
   {
-    \__msg_kernel_new:nnn { kernel } { fp-no-random }
+    \__kernel_msg_new:nnn { kernel } { fp-no-random }
       { Random~numbers~unavailable }
     \cs_new:Npn \__fp_rand_o:Nw ? #1 @
       {
-        \__msg_kernel_expandable_error:nn { kernel } { fp-no-random }
+        \__kernel_msg_expandable_error:nn { kernel } { fp-no-random }
         \exp_after:wN \c_nan_fp
       }
     \cs_new_eq:NN \__fp_randint_o:Nw \__fp_rand_o:Nw
@@ -16495,7 +16973,7 @@
     \tl_if_empty:nTF {#1}
       { \__fp_rand_o: }
       {
-        \__msg_kernel_expandable_error:nnnnn
+        \__kernel_msg_expandable_error:nnnnn
           { kernel } { fp-num-args } { rand() } { 0 } { 0 }
         \exp_after:wN \c_nan_fp
       }
@@ -16502,19 +16980,13 @@
   }
 \cs_new:Npn \__fp_rand_o:
   { \__fp_parse_o:n { . \__fp_rand_myriads:n { xxxx } } }
-\cs_new:Npn \__fp_randint_o:Nw ? #1 @
+\cs_new:Npn \__fp_randint_o:Nw ?
   {
-    \if_case:w
-      \__int_eval:w \__fp_array_count:n {#1} - 1 \__int_eval_end:
-         \exp_after:wN \__fp_randint_e:w \c_one_fp #1
-    \or: \__fp_randint_e:w #1
-    \else:
-      \__msg_kernel_expandable_error:nnnnn
-        { kernel } { fp-num-args } { randint() } { 1 } { 2 }
-      \exp_after:wN \c_nan_fp \exp:w
-    \fi:
-    \exp_after:wN \exp_end:
+    \__fp_parse_function_one_two:nnw
+      { randint }
+      { \__fp_randint_default:w \__fp_randint_o:w }
   }
+\cs_new:Npn \__fp_randint_default:w #1 { \exp_after:wN #1 \c_one_fp }
 \cs_new:Npn \__fp_randint_badarg:w \s__fp \__fp_chk:w #1#2#3;
   {
     \__fp_int:wTF \s__fp \__fp_chk:w #1#2#3;
@@ -16528,7 +17000,7 @@
       }
       { 1 \exp_stop_f: }
   }
-\cs_new:Npn \__fp_randint_e:w #1; #2;
+\cs_new:Npn \__fp_randint_o:w #1; #2; @
   {
     \if_case:w
         \__fp_randint_badarg:w #1;
@@ -16541,6 +17013,7 @@
         { randint } { \__fp_array_to_clist:n { #1; #2; } }
       \exp:w
     \fi:
+    \exp_after:wN \exp_end:
   }
 \cs_new:Npn \__fp_randint_e:wnn #1;
   {
@@ -16585,65 +17058,7 @@
       { \__fp_exp_after_o:w #1 ; \exp:w }
   }
   }
-%% File: l3fp-assign.dtx Copyright (C) 2011-2017 The LaTeX3 project
-\cs_new_protected:Npn \fp_new:N #1
-  { \cs_new_eq:NN #1 \c_zero_fp }
-\cs_generate_variant:Nn \fp_new:N {c}
-\cs_new_protected:Npn \fp_set:Nn   #1#2
-  { \tl_set:Nx #1 { \exp_not:f { \__fp_parse:n {#2} } } }
-\cs_new_protected:Npn \fp_gset:Nn  #1#2
-  { \tl_gset:Nx #1 { \exp_not:f { \__fp_parse:n {#2} } } }
-\cs_new_protected:Npn \fp_const:Nn #1#2
-  { \tl_const:Nx #1 { \exp_not:f { \__fp_parse:n {#2} } } }
-\cs_generate_variant:Nn \fp_set:Nn {c}
-\cs_generate_variant:Nn \fp_gset:Nn {c}
-\cs_generate_variant:Nn \fp_const:Nn {c}
-\cs_new_eq:NN \fp_set_eq:NN  \tl_set_eq:NN
-\cs_new_eq:NN \fp_gset_eq:NN \tl_gset_eq:NN
-\cs_generate_variant:Nn \fp_set_eq:NN  { c , Nc , cc }
-\cs_generate_variant:Nn \fp_gset_eq:NN { c , Nc , cc }
-\cs_new_protected:Npn \fp_zero:N #1 { \fp_set_eq:NN #1 \c_zero_fp }
-\cs_new_protected:Npn \fp_gzero:N #1 { \fp_gset_eq:NN #1 \c_zero_fp }
-\cs_generate_variant:Nn \fp_zero:N  { c }
-\cs_generate_variant:Nn \fp_gzero:N { c }
-\cs_new_protected:Npn \fp_zero_new:N #1
-  { \fp_if_exist:NTF #1 { \fp_zero:N #1 } { \fp_new:N #1 } }
-\cs_new_protected:Npn \fp_gzero_new:N #1
-  { \fp_if_exist:NTF #1 { \fp_gzero:N #1 } { \fp_new:N #1 } }
-\cs_generate_variant:Nn \fp_zero_new:N  { c }
-\cs_generate_variant:Nn \fp_gzero_new:N { c }
-\cs_new_protected:Npn \fp_add:Nn  { \__fp_add:NNNn \fp_set:Nn  + }
-\cs_new_protected:Npn \fp_gadd:Nn { \__fp_add:NNNn \fp_gset:Nn + }
-\cs_new_protected:Npn \fp_sub:Nn  { \__fp_add:NNNn \fp_set:Nn  - }
-\cs_new_protected:Npn \fp_gsub:Nn { \__fp_add:NNNn \fp_gset:Nn - }
-\cs_new_protected:Npn \__fp_add:NNNn #1#2#3#4
-  { #1 #3 { #3 #2 \__fp_parse:n {#4} } }
-\cs_generate_variant:Nn \fp_add:Nn  { c }
-\cs_generate_variant:Nn \fp_gadd:Nn { c }
-\cs_generate_variant:Nn \fp_sub:Nn  { c }
-\cs_generate_variant:Nn \fp_gsub:Nn { c }
-\cs_new_protected:Npn \fp_show:N { \__fp_show:NN \tl_show:n }
-\cs_generate_variant:Nn \fp_show:N { c }
-\cs_new_protected:Npn \fp_log:N { \__fp_show:NN \tl_log:n }
-\cs_generate_variant:Nn \fp_log:N { c }
-\cs_new_protected:Npn \__fp_show:NN #1#2
-  {
-    \__kernel_check_defined:NT #2
-      { \exp_args:Nx #1 { \token_to_str:N #2 = \fp_to_tl:N #2 } }
-  }
-\cs_new_protected:Npn \fp_show:n
-  { \msg_show_eval:Nn \fp_to_tl:n }
-\cs_new_protected:Npn \fp_log:n
-  { \msg_log_eval:Nn \fp_to_tl:n }
-\fp_const:Nn \c_e_fp          { 2.718 2818 2845 9045 }
-\fp_const:Nn \c_one_fp        { 1 }
-\fp_const:Nn \c_pi_fp         { 3.141 5926 5358 9793 }
-\fp_const:Nn \c_one_degree_fp { 0.0 1745 3292 5199 4330 }
-\fp_new:N \l_tmpa_fp
-\fp_new:N \l_tmpb_fp
-\fp_new:N \g_tmpa_fp
-\fp_new:N \g_tmpb_fp
-%% File l3sort.dtx (C) Copyright 2012-2017 The LaTeX3 Project
+%% File l3sort.dtx (C) Copyright 2012-2018 The LaTeX3 Project
 \int_new:N \l__sort_length_int
 \int_new:N \l__sort_min_int
 \int_new:N \l__sort_top_int
@@ -16864,7 +17279,7 @@
 \cs_new_protected:Npn \__sort_return_mark:N #1 { }
 \cs_new_protected:Npn \__sort_return_none_error:
   {
-    \__msg_kernel_error:nnxx { kernel } { return-none }
+    \__kernel_msg_error:nnxx { kernel } { return-none }
       { \tex_the:D \tex_toks:D \l__sort_A_int }
       { \tex_the:D \tex_toks:D \l__sort_C_int }
     \__sort_return_same:
@@ -16871,7 +17286,7 @@
   }
 \cs_new_protected:Npn \__sort_return_two_error:w
     #1 \__sort_return_none_error:
-  { \__msg_kernel_error:nn { kernel } { return-two } }
+  { \__kernel_msg_error:nn { kernel } { return-two } }
 \cs_new_protected:Npn \__sort_return_same:
   {
     \tex_toks:D \l__sort_B_int \tex_toks:D \l__sort_C_int
@@ -16993,12 +17408,12 @@
   { \cs_set_eq:NN \toksdef \__sort_disabled_toksdef:n }
 \cs_new_protected:Npn \__sort_disabled_toksdef:n #1
   {
-    \__msg_kernel_error:nnx { kernel } { toksdef }
+    \__kernel_msg_error:nnx { kernel } { toksdef }
       { \token_to_str:N #1 }
     \__sort_error:
     \tex_toksdef:D #1
   }
-\__msg_kernel_new:nnnn { kernel } { toksdef }
+\__kernel_msg_new:nnnn { kernel } { toksdef }
   { Allocation~of~\iow_char:N\\toks~registers~impossible~while~sorting. }
   {
     The~comparison~code~used~for~sorting~a~list~has~attempted~to~
@@ -17008,13 +17423,13 @@
 \cs_new_protected:Npn \__sort_too_long_error:NNw #1#2 \fi:
   {
     \fi:
-    \__msg_kernel_error:nnxxx { kernel } { too-large }
+    \__kernel_msg_error:nnxxx { kernel } { too-large }
       { \token_to_str:N #2 }
       { \int_eval:n { \l__sort_true_max_int - \l__sort_min_int } }
       { \int_eval:n { \l__sort_top_int - \l__sort_min_int } }
     #1 \__sort_error:
   }
-\__msg_kernel_new:nnnn { kernel } { too-large }
+\__kernel_msg_new:nnnn { kernel } { too-large }
   { The~list~#1~is~too~long~to~be~sorted~by~TeX. }
   {
     TeX~has~#2~toks~registers~still~available:~
@@ -17021,7 +17436,7 @@
     this~only~allows~to~sort~with~up~to~#3~
     items.~All~extra~items~will~be~deleted.
   }
-\__msg_kernel_new:nnnn { kernel } { return-none }
+\__kernel_msg_new:nnnn { kernel } { return-none }
   { The~comparison~code~did~not~return. }
   {
     When~sorting~a~list,~the~code~to~compare~items~#1~and~#2~
@@ -17030,7 +17445,7 @@
     \iow_char:N\\sort_return_swapped: .~
     Exactly~one~of~these~should~be~called.
   }
-\__msg_kernel_new:nnnn { kernel } { return-two }
+\__kernel_msg_new:nnnn { kernel } { return-two }
   { The~comparison~code~returned~multiple~times. }
   {
     When~sorting~a~list,~the~code~to~compare~items~called~
@@ -17038,9 +17453,9 @@
     \iow_char:N\\sort_return_swapped: ~multiple~times.~
     Exactly~one~of~these~should~be~called.
   }
-\__debug_deprecation:nnNNpn { 2018-12-31 } { \sort_return_same: }
+\__kernel_patch_deprecation:nnNNpn { 2018-12-31 } { \sort_return_same: }
 \cs_new_protected:Npn \sort_ordered: { \sort_return_same: }
-\__debug_deprecation:nnNNpn { 2018-12-31 } { \sort_return_swapped: }
+\__kernel_patch_deprecation:nnNNpn { 2018-12-31 } { \sort_return_swapped: }
 \cs_new_protected:Npn \sort_reversed: { \sort_return_swapped: }
 %% File: l3tl-build.dtx Copyright (C) 2011-2017 The LaTeX3 Project
 \int_new:N \l__tl_build_start_index_int
@@ -17519,7 +17934,7 @@
 \cs_generate_variant:Nn \__tl_analysis_show_long_aux:nnnn { oof }
 \tl_const:Nx \c__tl_analysis_show_etc_str % (
   { \token_to_str:N \ETC.) }
-\__msg_kernel_new:nnn { kernel } { show-tl-analysis }
+\__kernel_msg_new:nnn { kernel } { show-tl-analysis }
   {
     The~token~list~ \tl_if_empty:nF {#1} { #1 ~ }
     \tl_if_empty:nTF {#2}
@@ -17526,7 +17941,7 @@
       { is~empty }
       { contains~the~tokens: #2 }
   }
-%% File: l3regex.dtx Copyright (C) 2011-2017 The LaTeX3 Project
+%% File: l3regex.dtx Copyright (C) 2011-2018 The LaTeX3 Project
 \cs_new_protected:Npn \__regex_standard_escapechar:
   { \int_set:Nn \tex_escapechar:D { `\\ } }
 \cs_new:Npn \__regex_toks_use:w { \tex_the:D \tex_toks:D }
@@ -17785,11 +18200,11 @@
     \__regex_item_caseful_range:nn { `A } { `F }
     \__regex_item_caseful_range:nn { `a } { `f }
   }
-\__debug_patch:nnNNpn
+\__kernel_patch:nnNNpn
   {
-    \__debug_trace_push:nnN { regex } { 1 } \__regex_escape_use:nnnn
+    \__regex_trace_push:nnN { regex } { 1 } \__regex_escape_use:nnnn
     \__tl_build:Nw \l__regex_internal_a_tl
-      \__tl_build_one:n { \__debug_trace_pop:nnN { regex } { 1 } \__regex_escape_use:nnnn }
+      \__tl_build_one:n { \__regex_trace_pop:nnN { regex } { 1 } \__regex_escape_use:nnnn }
       \use_none:nn
   }
   { }
@@ -17830,7 +18245,7 @@
 \cs_new:cpn { __regex_escape_/break:w }
   {
     \if_false: { \fi: }
-    \__msg_kernel_error:nn { kernel } { trailing-backslash }
+    \__kernel_msg_error:nn { kernel } { trailing-backslash }
     \exp_after:wN \use_none:n \exp_after:wN { \if_false: } \fi:
   }
 \cs_new:cpn { __regex_escape_~:w } { }
@@ -17857,7 +18272,7 @@
       {
         \if_false: { \fi: }
         \__tl_build_one:o \l__regex_internal_b_tl
-        \__msg_kernel_error:nnx { kernel } { x-overflow } {#1}
+        \__kernel_msg_error:nnx { kernel } { x-overflow } {#1}
         \tl_set:Nx \l__regex_internal_b_tl
           { \if_false: } \fi:
       }
@@ -17921,7 +18336,7 @@
   {
     \if_false: { \fi: }
     \__tl_build_one:o \l__regex_internal_b_tl
-    \__msg_kernel_error:nnx { kernel } { x-missing-rbrace } {#1}
+    \__kernel_msg_error:nnx { kernel } { x-missing-rbrace } {#1}
     \tl_set:Nx \l__regex_internal_b_tl
       { \if_false: } \fi: \__regex_escape_loop:N #1
   }
@@ -18085,7 +18500,7 @@
       \if_int_compare:w \l__regex_mode_int = \c__regex_class_mode_int
         \exp_after:wN \exp_after:wN \exp_after:wN \use:n
       \else:
-        \__msg_kernel_error:nn { kernel } { c-bad-mode }
+        \__kernel_msg_error:nn { kernel } { c-bad-mode }
         \exp_after:wN \exp_after:wN \exp_after:wN \use_none:n
       \fi:
     \fi:
@@ -18114,13 +18529,13 @@
   {
       \__regex_if_in_class:TF
         {
-          \__msg_kernel_error:nn { kernel } { missing-rbrack }
+          \__kernel_msg_error:nn { kernel } { missing-rbrack }
           \use:c { __regex_compile_]: }
           \prg_do_nothing: \prg_do_nothing:
         }
         { }
       \if_int_compare:w \l__regex_group_level_int > 0 \exp_stop_f:
-        \__msg_kernel_error:nnx { kernel } { missing-rparen }
+        \__kernel_msg_error:nnx { kernel } { missing-rparen }
           { \int_use:N \l__regex_group_level_int }
         \prg_replicate:nn
           { \l__regex_group_level_int }
@@ -18156,10 +18571,10 @@
       \prg_do_nothing: \prg_do_nothing:
       \prg_do_nothing: \prg_do_nothing:
       \int_compare:nNnT \l__regex_mode_int = \c__regex_catcode_mode_int
-        { \__msg_kernel_error:nn { kernel } { c-trailing } }
+        { \__kernel_msg_error:nn { kernel } { c-trailing } }
       \int_compare:nNnT \l__regex_mode_int < \c__regex_outer_mode_int
         {
-          \__msg_kernel_error:nn { kernel } { c-missing-rbrace }
+          \__kernel_msg_error:nn { kernel } { c-missing-rbrace }
           \__regex_compile_end_cs:
           \prg_do_nothing: \prg_do_nothing:
           \prg_do_nothing: \prg_do_nothing:
@@ -18219,7 +18634,7 @@
 \cs_new_protected:Npn \__regex_compile_quantifier_abort:xNN #1#2#3
   {
     \__regex_compile_quantifier_none:
-    \__msg_kernel_warning:nnxx { kernel } { invalid-quantifier } {#1} {#3}
+    \__kernel_msg_warning:nnxx { kernel } { invalid-quantifier } {#1} {#3}
     \__regex_compile_abort_tokens:x {#1}
     #2 #3
   }
@@ -18286,7 +18701,7 @@
       { #1 #2 } { \__regex_compile_special:N \c_right_brace_str }
       {
         \if_int_compare:w \l__regex_internal_a_int > \l__regex_internal_b_int
-          \__msg_kernel_error:nnxx { kernel } { backwards-quantifier }
+          \__kernel_msg_error:nnxx { kernel } { backwards-quantifier }
             { \int_use:N \l__regex_internal_a_int }
             { \int_use:N \l__regex_internal_b_int }
           \int_zero:N \l__regex_internal_b_int
@@ -18309,7 +18724,7 @@
   }
 \cs_new_protected:Npn \__regex_compile_raw_error:N #1
   {
-    \__msg_kernel_error:nnx { kernel } { bad-escape } {#1}
+    \__kernel_msg_error:nnx { kernel } { bad-escape } {#1}
     \__regex_compile_raw:N #1
   }
 \cs_new_protected:Npn \__regex_compile_raw:N #1#2#3
@@ -18351,7 +18766,7 @@
     \__regex_if_end_range:NNTF #2 #3
       {
         \if_int_compare:w `#1 > `#3 \exp_stop_f:
-          \__msg_kernel_error:nnxx { kernel } { range-backwards } {#1} {#3}
+          \__kernel_msg_error:nnxx { kernel } { range-backwards } {#1} {#3}
         \else:
           \__tl_build_one:x
             {
@@ -18365,7 +18780,7 @@
         \fi:
       }
       {
-        \__msg_kernel_warning:nnxx { kernel } { range-missing-end }
+        \__kernel_msg_warning:nnxx { kernel } { range-missing-end }
           {#1} { \c_backslash_str #3 }
         \__tl_build_one:x
           {
@@ -18517,8 +18932,8 @@
         \str_case:nn { #2 }
           {
             : { \__regex_compile_class_posix:NNNNw }
-            = { \__msg_kernel_warning:nnx { kernel } { posix-unsupported } { = } }
-            . { \__msg_kernel_warning:nnx { kernel } { posix-unsupported } { . } }
+            = { \__kernel_msg_warning:nnx { kernel } { posix-unsupported } { = } }
+            . { \__kernel_msg_warning:nnx { kernel } { posix-unsupported } { . } }
           }
       }
     \__regex_compile_raw:N [ #1 #2
@@ -18557,7 +18972,7 @@
               }
           }
           {
-            \__msg_kernel_warning:nnx { kernel } { posix-unknown }
+            \__kernel_msg_warning:nnx { kernel } { posix-unknown }
               { \l__regex_internal_a_tl }
             \__regex_compile_abort_tokens:x
               {
@@ -18567,7 +18982,7 @@
           }
       }
       {
-        \__msg_kernel_error:nnxx { kernel } { posix-missing-close }
+        \__kernel_msg_error:nnxx { kernel } { posix-missing-close }
           { [: \l__regex_internal_a_tl } { #2 #4 }
         \__regex_compile_abort_tokens:x { [: \l__regex_internal_a_tl }
         #1 #2 #3 #4
@@ -18591,7 +19006,7 @@
       \__tl_build_one:o \l__regex_internal_regex
       \exp_after:wN \__regex_compile_quantifier:w
     \else:
-      \__msg_kernel_warning:nn { kernel } { extra-rparen }
+      \__kernel_msg_warning:nn { kernel } { extra-rparen }
       \exp_after:wN \__regex_compile_raw:N \exp_after:wN )
     \fi:
   }
@@ -18607,7 +19022,7 @@
         \cs_if_exist_use:cF
           { __regex_compile_special_group_\token_to_str:N #4 :w }
           {
-            \__msg_kernel_warning:nnx { kernel } { special-group-unknown }
+            \__kernel_msg_warning:nnx { kernel } { special-group-unknown }
               { (? #4 }
             \__regex_compile_group_begin:N \__regex_group:nnnN
               \__regex_compile_raw:N ? #3 #4
@@ -18643,7 +19058,7 @@
         \cs_set:Npn \__regex_item_range:nn { \__regex_item_caseless_range:nn }
       }
       {
-        \__msg_kernel_warning:nnx { kernel } { unknown-option } { (?i #2 }
+        \__kernel_msg_warning:nnx { kernel } { unknown-option } { (?i #2 }
         \__regex_compile_raw:N (
         \__regex_compile_raw:N ?
         \__regex_compile_raw:N i
@@ -18659,7 +19074,7 @@
         \cs_set:Npn \__regex_item_range:nn { \__regex_item_caseful_range:nn }
       }
       {
-        \__msg_kernel_warning:nnx { kernel } { unknown-option } { (?-#2#4 }
+        \__kernel_msg_warning:nnx { kernel } { unknown-option } { (?-#2#4 }
         \__regex_compile_raw:N (
         \__regex_compile_raw:N ?
         \__regex_compile_raw:N -
@@ -18686,7 +19101,7 @@
       }
       { \cs_if_exist_use:cF { __regex_compile_c_#2:w } }
           {
-            \__msg_kernel_error:nnx { kernel } { c-missing-category } {#2}
+            \__kernel_msg_error:nnx { kernel } { c-missing-category } {#2}
             #1 #2
           }
   }
@@ -18699,7 +19114,7 @@
           { \token_if_eq_charcode:NNF #2 ( } % )
       }
       { \use:n }
-    { \__msg_kernel_error:nnn { kernel } { c-C-invalid } {#2} }
+    { \__kernel_msg_error:nnn { kernel } { c-C-invalid } {#2} }
     #1 #2
   }
 \cs_new_protected:cpn { __regex_compile_c_[:w } #1#2
@@ -18738,7 +19153,7 @@
           { \__regex_compile_c_lbrack_end: }
       }
           {
-            \__msg_kernel_error:nnx { kernel } { c-missing-rbrack } {#2}
+            \__kernel_msg_error:nnx { kernel } { c-missing-rbrack } {#2}
             \__regex_compile_c_lbrack_end:
             #1 #2
           }
@@ -18840,7 +19255,7 @@
             \__regex_compile_u_loop:NN
           }
           {
-            \__msg_kernel_error:nn { kernel } { u-missing-lbrace }
+            \__kernel_msg_error:nn { kernel } { u-missing-lbrace }
             \__regex_compile_raw:N u #1 #2
           }
       }
@@ -18858,7 +19273,7 @@
           }
           {
             \if_false: { \fi: }
-            \__msg_kernel_error:nnx { kernel } { u-missing-rbrace } {#2}
+            \__kernel_msg_error:nnx { kernel } { u-missing-rbrace } {#2}
             \__regex_compile_u_end:
             #1 #2
           }
@@ -19078,11 +19493,11 @@
     \__regex_compile:n {#1}
     \__regex_build:N \l__regex_internal_regex
   }
-\__debug_patch:nnNNpn
-  { \__debug_trace_push:nnN { regex } { 1 } \__regex_build:N }
+\__kernel_patch:nnNNpn
+  { \__regex_trace_push:nnN { regex } { 1 } \__regex_build:N }
   {
     \__regex_trace_states:n { 2 }
-    \__debug_trace_pop:nnN { regex } { 1 } \__regex_build:N
+    \__regex_trace_pop:nnN { regex } { 1 } \__regex_build:N
   }
 \cs_new_protected:Npn \__regex_build:N #1
   {
@@ -19097,11 +19512,11 @@
     \__regex_toks_put_right:Nn \l__regex_right_state_int
       { \__regex_action_success: }
   }
-\__debug_patch:nnNNpn
-  { \__debug_trace_push:nnN { regex } { 1 } \__regex_build_for_cs:n }
+\__kernel_patch:nnNNpn
+  { \__regex_trace_push:nnN { regex } { 1 } \__regex_build_for_cs:n }
   {
     \__regex_trace_states:n { 2 }
-    \__debug_trace_pop:nnN { regex } { 1 } \__regex_build_for_cs:n
+    \__regex_trace_pop:nnN { regex } { 1 } \__regex_build_for_cs:n
   }
 \cs_new_protected:Npn \__regex_build_for_cs:n #1
   {
@@ -19136,9 +19551,9 @@
   { \__regex_toks_put_left:Nx  #2 { #1 { \int_eval:n { #3 - #2 } } } }
 \cs_new_protected:Npn \__regex_build_transition_right:nNn #1#2#3
   { \__regex_toks_put_right:Nx #2 { #1 { \int_eval:n { #3 - #2 } } } }
-\__debug_patch:nnNNpn
+\__kernel_patch:nnNNpn
   {
-    \__debug_trace:nnx { regex } { 2 }
+    \__regex_trace:nnx { regex } { 2 }
       {
         regex~new~state~
         L=\int_use:N \l__regex_left_state_int ~ -> ~
@@ -19220,9 +19635,9 @@
           \__regex_tests_action_cost:n \l__regex_right_state_int
       }
   }
-\__debug_patch:nnNNpn
-  { \__debug_trace_push:nnN { regex } { 1 } \__regex_group_aux:nnnnN }
-  { \__debug_trace_pop:nnN { regex } { 1 } \__regex_group_aux:nnnnN }
+\__kernel_patch:nnNNpn
+  { \__regex_trace_push:nnN { regex } { 1 } \__regex_group_aux:nnnnN }
+  { \__regex_trace_pop:nnN { regex } { 1 } \__regex_group_aux:nnnnN }
 \cs_new_protected:Npn \__regex_group_aux:nnnnN #1#2#3#4#5
   {
       \if_int_compare:w #3 = 0 \exp_stop_f:
@@ -19272,9 +19687,9 @@
       { \int_max:nn {#1} { \l__regex_capturing_group_int } }
       {#2}
   }
-\__debug_patch:nnNNpn
-  { \__debug_trace_push:nnN { regex } { 1 } \__regex_branch:n }
-  { \__debug_trace_pop:nnN { regex } { 1 } \__regex_branch:n }
+\__kernel_patch:nnNNpn
+  { \__regex_trace_push:nnN { regex } { 1 } \__regex_branch:n }
+  { \__regex_trace_pop:nnN { regex } { 1 } \__regex_branch:n }
 \cs_new_protected:Npn \__regex_branch:n #1
   {
     \__regex_build_new_state:
@@ -19461,12 +19876,12 @@
 \bool_new:N \g__regex_success_bool
 \bool_new:N \l__regex_saved_success_bool
 \bool_new:N \l__regex_match_success_bool
-\__debug_patch:nnNNpn
+\__kernel_patch:nnNNpn
   {
-    \__debug_trace_push:nnN { regex } { 1 } \__regex_match:n
-    \__debug_trace:nnx { regex } { 1 } { analyzing~query~token~list }
+    \__regex_trace_push:nnN { regex } { 1 } \__regex_match:n
+    \__regex_trace:nnx { regex } { 1 } { analyzing~query~token~list }
   }
-  { \__debug_trace_pop:nnN { regex } { 1 } \__regex_match:n }
+  { \__regex_trace_pop:nnN { regex } { 1 } \__regex_match:n }
 \cs_new_protected:Npn \__regex_match:n #1
   {
     \int_zero:N \l__regex_balance_int
@@ -19480,8 +19895,8 @@
     \__regex_match_init:
     \__regex_match_once:
   }
-\__debug_patch:nnNNpn
-  { \__debug_trace:nnx { regex } { 1 } { initializing } }
+\__kernel_patch:nnNNpn
+  { \__regex_trace:nnx { regex } { 1 } { initializing } }
   { }
 \cs_new_protected:Npn \__regex_match_init:
   {
@@ -19586,8 +20001,8 @@
       = \__intarray_item_fast:Nn \g__regex_catcode_intarray
           { \l__regex_curr_pos_int } \scan_stop:
   }
-\__debug_patch:nnNNpn
-  { \__debug_trace:nnx { regex } { 2 } { state~\int_use:N \l__regex_curr_state_int } }
+\__kernel_patch:nnNNpn
+  { \__regex_trace:nnx { regex } { 2 } { state~\int_use:N \l__regex_curr_state_int } }
   { }
 \cs_new_protected:Npn \__regex_use_state:
   {
@@ -19737,9 +20152,9 @@
         }
      }
   }
-\__debug_patch:nnNNpn
-  { \__debug_trace_push:nnN { regex } { 1 } \__regex_replacement:n }
-  { \__debug_trace_pop:nnN { regex } { 1 } \__regex_replacement:n }
+\__kernel_patch:nnNNpn
+  { \__regex_trace_push:nnN { regex } { 1 } \__regex_replacement:n }
+  { \__regex_trace_pop:nnN { regex } { 1 } \__regex_replacement:n }
 \cs_new_protected:Npn \__regex_replacement:n #1
   {
     \__tl_build:Nw \l__regex_internal_a_tl
@@ -19759,7 +20174,7 @@
         {#1}
       \prg_do_nothing: \prg_do_nothing:
       \if_int_compare:w \l__regex_replacement_csnames_int > 0 \exp_stop_f:
-        \__msg_kernel_error:nnx { kernel } { replacement-missing-rbrace }
+        \__kernel_msg_error:nnx { kernel } { replacement-missing-rbrace }
           { \int_use:N \l__regex_replacement_csnames_int }
         \__tl_build_one:x
           { \prg_replicate:nn \l__regex_replacement_csnames_int \cs_end: }
@@ -19766,7 +20181,7 @@
       \fi:
       \seq_if_empty:NF \l__regex_replacement_category_seq
         {
-          \__msg_kernel_error:nnx { kernel } { replacement-missing-rparen }
+          \__kernel_msg_error:nnx { kernel } { replacement-missing-rparen }
             { \seq_count:N \l__regex_replacement_category_seq }
           \seq_clear:N \l__regex_replacement_category_seq
         }
@@ -19901,11 +20316,11 @@
 \cs_new_protected:Npn \__regex_replacement_cat:NNN #1#2#3
   {
     \token_if_eq_meaning:NNTF \prg_do_nothing: #3
-      { \__msg_kernel_error:nn { kernel } { replacement-catcode-end } }
+      { \__kernel_msg_error:nn { kernel } { replacement-catcode-end } }
       {
         \int_compare:nNnTF { \l__regex_replacement_csnames_int } > 0
           {
-            \__msg_kernel_error:nnnn
+            \__kernel_msg_error:nnnn
               { kernel } { replacement-catcode-in-cs } {#1} {#3}
             #2 #3
           }
@@ -19921,7 +20336,7 @@
                   {
                     \__regex_char_if_alphanumeric:NTF #3
                       {
-                        \__msg_kernel_error:nnnn
+                        \__kernel_msg_error:nnnn
                           { kernel } { replacement-catcode-escaped }
                           {#1} {#3}
                       }
@@ -19982,7 +20397,7 @@
   \cs_new_protected:Npn \__regex_replacement_c_S:w #1#2
     {
       \if_int_compare:w `#2 = 0 \exp_stop_f:
-        \__msg_kernel_error:nn { kernel } { replacement-null-space }
+        \__kernel_msg_error:nn { kernel } { replacement-null-space }
       \fi:
       \tex_lccode:D `\ = `#2 \scan_stop:
       \tex_lowercase:D { \__tl_build_one:n {~} }
@@ -19996,7 +20411,7 @@
 \group_end:
 \cs_new_protected:Npn \__regex_replacement_error:NNN #1#2#3
   {
-    \__msg_kernel_error:nnx { kernel } { replacement-#1 } {#3}
+    \__kernel_msg_error:nnx { kernel } { replacement-#1 } {#3}
     #2 #3
   }
 \cs_new_protected:Npn \regex_new:N #1
@@ -20181,7 +20596,7 @@
         { \flag_height:n { __regex_begin } + \flag_height:n { __regex_end } }
         = 0
         {
-          \__msg_kernel_error:nnxxx { kernel } { result-unbalanced }
+          \__kernel_msg_error:nnxxx { kernel } { result-unbalanced }
             { splitting~or~extracting~submatches }
             { \flag_height:n { __regex_end } }
             { \flag_height:n { __regex_begin } }
@@ -20304,7 +20719,7 @@
   {
     \if_int_compare:w \l__regex_balance_int = 0 \exp_stop_f:
     \else:
-      \__msg_kernel_error:nnxxx { kernel } { result-unbalanced }
+      \__kernel_msg_error:nnxxx { kernel } { result-unbalanced }
         { replacing }
         { \int_max:nn { - \l__regex_balance_int } { 0 } }
         { \int_max:nn { \l__regex_balance_int } { 0 } }
@@ -20326,13 +20741,13 @@
           }
       }
   }
-\__msg_kernel_new:nnnn { kernel } { trailing-backslash }
+\__kernel_msg_new:nnnn { kernel } { trailing-backslash }
   { Trailing~escape~character~'\iow_char:N\\'. }
   {
     A~regular~expression~or~its~replacement~text~ends~with~
     the~escape~character~'\iow_char:N\\'.~It~will~be~ignored.
   }
-\__msg_kernel_new:nnnn { kernel } { x-missing-rbrace }
+\__kernel_msg_new:nnnn { kernel } { x-missing-rbrace }
   { Missing~closing~brace~in~'\iow_char:N\\x'~hexadecimal~sequence. }
   {
     You~wrote~something~like~
@@ -20339,7 +20754,7 @@
     '\iow_char:N\\x\{...#1'.~
     The~closing~brace~is~missing.
   }
-\__msg_kernel_new:nnnn { kernel } { x-overflow }
+\__kernel_msg_new:nnnn { kernel } { x-overflow }
   { Character~code~'#1'~too~large~in~'\iow_char:N\\x'~hexadecimal~sequence. }
   {
     You~wrote~something~like~
@@ -20347,7 +20762,7 @@
     The~character~code~#1~is~larger~than~
     the~maximum~value~\int_use:N \c_max_char_int.
   }
-\__msg_kernel_new:nnnn { kernel } { invalid-quantifier }
+\__kernel_msg_new:nnnn { kernel } { invalid-quantifier }
   { Braced~quantifier~'#1'~may~not~be~followed~by~'#2'. }
   {
     The~character~'#2'~is~invalid~in~the~braced~quantifier~'#1'.~
@@ -20354,13 +20769,13 @@
     The~only~valid~quantifiers~are~'*',~'?',~'+',~'{<int>}',~
     '{<min>,}'~and~'{<min>,<max>}',~optionally~followed~by~'?'.
   }
-\__msg_kernel_new:nnnn { kernel } { missing-rbrack }
+\__kernel_msg_new:nnnn { kernel } { missing-rbrack }
   { Missing~right~bracket~inserted~in~regular~expression. }
   {
     LaTeX~was~given~a~regular~expression~where~a~character~class~
     was~started~with~'[',~but~the~matching~']'~is~missing.
   }
-\__msg_kernel_new:nnnn { kernel } { missing-rparen }
+\__kernel_msg_new:nnnn { kernel } { missing-rparen }
   {
     Missing~right~
     \int_compare:nTF { #1 = 1 } { parenthesis } { parentheses } ~
@@ -20370,13 +20785,13 @@
     LaTeX~was~given~a~regular~expression~with~\int_eval:n {#1} ~
     more~left~parentheses~than~right~parentheses.
   }
-\__msg_kernel_new:nnnn { kernel } { extra-rparen }
+\__kernel_msg_new:nnnn { kernel } { extra-rparen }
   { Extra~right~parenthesis~ignored~in~regular~expression. }
   {
     LaTeX~came~across~a~closing~parenthesis~when~no~submatch~group~
     was~open.~The~parenthesis~will~be~ignored.
   }
-\__msg_kernel_new:nnnn { kernel } { bad-escape }
+\__kernel_msg_new:nnnn { kernel } { bad-escape }
   {
     Invalid~escape~'\iow_char:N\\#1'~
     \__regex_if_in_cs:TF { within~a~control~sequence. }
@@ -20400,7 +20815,7 @@
         because~it~does~not~match~exactly~one~character.
       }
   }
-\__msg_kernel_new:nnnn { kernel } { range-missing-end }
+\__kernel_msg_new:nnnn { kernel } { range-missing-end }
   { Invalid~end-point~for~range~'#1-#2'~in~character~class. }
   {
     The~end-point~'#2'~of~the~range~'#1-#2'~may~not~serve~as~an~
@@ -20407,7 +20822,7 @@
     end-point~for~a~range:~alphanumeric~characters~should~not~be~
     escaped,~and~non-alphanumeric~characters~should~be~escaped.
   }
-\__msg_kernel_new:nnnn { kernel } { range-backwards }
+\__kernel_msg_new:nnnn { kernel } { range-backwards }
   { Range~'[#1-#2]'~out~of~order~in~character~class. }
   {
     In~ranges~of~characters~'[x-y]'~appearing~in~character~classes,~
@@ -20415,7 +20830,7 @@
     Here,~'#1'~has~character~code~\int_eval:n {`#1},~while~
     '#2'~has~character~code~\int_eval:n {`#2}.
   }
-\__msg_kernel_new:nnnn { kernel } { c-bad-mode }
+\__kernel_msg_new:nnnn { kernel } { c-bad-mode }
   { Invalid~nested~'\iow_char:N\\c'~escape~in~regular~expression. }
   {
     The~'\iow_char:N\\c'~escape~cannot~be~used~within~
@@ -20422,7 +20837,7 @@
     a~control~sequence~test~'\iow_char:N\\c{...}'.~
     To~combine~several~category~tests,~use~'\iow_char:N\\c[...]'.
   }
-\__msg_kernel_new:nnnn { kernel } { c-C-invalid }
+\__kernel_msg_new:nnnn { kernel } { c-C-invalid }
   { '\iow_char:N\\cC'~should~be~followed~by~'.'~or~'(',~not~'#1'. }
   {
     The~'\iow_char:N\\cC'~construction~restricts~the~next~item~to~be~a~
@@ -20429,7 +20844,7 @@
     control~sequence~or~the~next~group~to~be~made~of~control~sequences.~
     It~only~makes~sense~to~follow~it~by~'.'~or~by~a~group.
   }
-\__msg_kernel_new:nnnn { kernel } { c-missing-rbrace }
+\__kernel_msg_new:nnnn { kernel } { c-missing-rbrace }
   { Missing~right~brace~inserted~for~'\iow_char:N\\c'~escape. }
   {
     LaTeX~was~given~a~regular~expression~where~a~
@@ -20436,13 +20851,13 @@
     '\iow_char:N\\c\iow_char:N\{...'~construction~was~not~ended~
     with~a~closing~brace~'\iow_char:N\}'.
   }
-\__msg_kernel_new:nnnn { kernel } { c-missing-rbrack }
+\__kernel_msg_new:nnnn { kernel } { c-missing-rbrack }
   { Missing~right~bracket~inserted~for~'\iow_char:N\\c'~escape. }
   {
     A~construction~'\iow_char:N\\c[...'~appears~in~a~
     regular~expression,~but~the~closing~']'~is~not~present.
   }
-\__msg_kernel_new:nnnn { kernel } { c-missing-category }
+\__kernel_msg_new:nnnn { kernel } { c-missing-category }
   { Invalid~character~'#1'~following~'\iow_char:N\\c'~escape. }
   {
     In~regular~expressions,~the~'\iow_char:N\\c'~escape~sequence~
@@ -20450,19 +20865,19 @@
     capital~letter~representing~a~character~category,~namely~
     one~of~'ABCDELMOPSTU'.
   }
-\__msg_kernel_new:nnnn { kernel } { c-trailing }
+\__kernel_msg_new:nnnn { kernel } { c-trailing }
   { Trailing~category~code~escape~'\iow_char:N\\c'... }
   {
     A~regular~expression~ends~with~'\iow_char:N\\c'~followed~
     by~a~letter.~It~will~be~ignored.
   }
-\__msg_kernel_new:nnnn { kernel } { u-missing-lbrace }
+\__kernel_msg_new:nnnn { kernel } { u-missing-lbrace }
   { Missing~left~brace~following~'\iow_char:N\\u'~escape. }
   {
     The~'\iow_char:N\\u'~escape~sequence~must~be~followed~by~
     a~brace~group~with~the~name~of~the~variable~to~use.
   }
-\__msg_kernel_new:nnnn { kernel } { u-missing-rbrace }
+\__kernel_msg_new:nnnn { kernel } { u-missing-rbrace }
   { Missing~right~brace~inserted~for~'\iow_char:N\\u'~escape. }
   {
     LaTeX~
@@ -20471,7 +20886,7 @@
       { encountered~an~escaped~alphanumeric~character '\iow_char:N\\#2'~ }
     when~parsing~the~argument~of~an~'\iow_char:N\\u\iow_char:N\{...\}'~escape.
   }
-\__msg_kernel_new:nnnn { kernel } { posix-unsupported }
+\__kernel_msg_new:nnnn { kernel } { posix-unsupported }
   { POSIX~collating~element~'[#1 ~ #1]'~not~supported. }
   {
     The~'[.foo.]'~and~'[=bar=]'~syntaxes~have~a~special~meaning~
@@ -20478,7 +20893,7 @@
     in~POSIX~regular~expressions.~This~is~not~supported~by~LaTeX.~
     Maybe~you~forgot~to~escape~a~left~bracket~in~a~character~class?
   }
-\__msg_kernel_new:nnnn { kernel } { posix-unknown }
+\__kernel_msg_new:nnnn { kernel } { posix-unknown }
   { POSIX~class~'[:#1:]'~unknown. }
   {
     '[:#1:]'~is~not~among~the~known~POSIX~classes~
@@ -20487,10 +20902,10 @@
     '[:print:]',~'[:punct:]',~'[:space:]',~'[:upper:]',~
     '[:word:]',~and~'[:xdigit:]'.
   }
-\__msg_kernel_new:nnnn { kernel } { posix-missing-close }
+\__kernel_msg_new:nnnn { kernel } { posix-missing-close }
   { Missing~closing~':]'~for~POSIX~class. }
   { The~POSIX~syntax~'#1'~must~be~followed~by~':]',~not~'#2'. }
-\__msg_kernel_new:nnnn { kernel } { result-unbalanced }
+\__kernel_msg_new:nnnn { kernel } { result-unbalanced }
   { Missing~brace~inserted~when~#1. }
   {
     LaTeX~was~asked~to~do~some~regular~expression~operation,~
@@ -20498,19 +20913,19 @@
     of~begin-group~and~end-group~tokens.~Braces~were~inserted:~
     #2~left,~#3~right.
   }
-\__msg_kernel_new:nnnn { kernel } { unknown-option }
+\__kernel_msg_new:nnnn { kernel } { unknown-option }
   { Unknown~option~'#1'~for~regular~expressions. }
   {
     The~only~available~option~is~'case-insensitive',~toggled~by~
     '(?i)'~and~'(?-i)'.
   }
-\__msg_kernel_new:nnnn { kernel } { special-group-unknown }
+\__kernel_msg_new:nnnn { kernel } { special-group-unknown }
   { Unknown~special~group~'#1~...'~in~a~regular~expression. }
   {
     The~only~valid~constructions~starting~with~'(?'~are~
     '(?:~...~)',~'(?|~...~)',~'(?i)',~and~'(?-i)'.
   }
-\__msg_kernel_new:nnnn { kernel } { replacement-c }
+\__kernel_msg_new:nnnn { kernel } { replacement-c }
   { Misused~'\iow_char:N\\c'~command~in~a~replacement~text. }
   {
     In~a~replacement~text,~the~'\iow_char:N\\c'~escape~sequence~
@@ -20517,7 +20932,7 @@
     can~be~followed~by~one~of~the~letters~'ABCDELMOPSTU'~
     or~a~brace~group,~not~by~'#1'.
   }
-\__msg_kernel_new:nnnn { kernel } { replacement-u }
+\__kernel_msg_new:nnnn { kernel } { replacement-u }
   { Misused~'\iow_char:N\\u'~command~in~a~replacement~text. }
   {
     In~a~replacement~text,~the~'\iow_char:N\\u'~escape~sequence~
@@ -20524,7 +20939,7 @@
     must~be~~followed~by~a~brace~group~holding~the~name~of~the~
     variable~to~use.
   }
-\__msg_kernel_new:nnnn { kernel } { replacement-g }
+\__kernel_msg_new:nnnn { kernel } { replacement-g }
   {
     Missing~brace~for~the~'\iow_char:N\\g'~construction~
     in~a~replacement~text.
@@ -20534,7 +20949,7 @@
     submatches~are~represented~either~as~'\iow_char:N \\g{dd..d}',~
     or~'\\d',~where~'d'~are~single~digits.~Here,~a~brace~is~missing.
   }
-\__msg_kernel_new:nnnn { kernel } { replacement-catcode-end }
+\__kernel_msg_new:nnnn { kernel } { replacement-catcode-end }
   {
     Missing~character~for~the~'\iow_char:N\\c<category><character>'~
     construction~in~a~replacement~text.
@@ -20545,7 +20960,7 @@
     the~character~category.~Then,~a~character~must~follow.~LaTeX~
     reached~the~end~of~the~replacement~when~looking~for~that.
   }
-\__msg_kernel_new:nnnn { kernel } { replacement-catcode-escaped }
+\__kernel_msg_new:nnnn { kernel } { replacement-catcode-escaped }
   {
     Escaped~letter~or~digit~after~category~code~in~replacement~text.
   }
@@ -20555,7 +20970,7 @@
     the~character~category.~Then,~a~character~must~follow,~not~
     '\iow_char:N\\#2'.
   }
-\__msg_kernel_new:nnnn { kernel } { replacement-catcode-in-cs }
+\__kernel_msg_new:nnnn { kernel } { replacement-catcode-in-cs }
   {
     Category~code~'\iow_char:N\\c#1#3'~ignored~inside~
     '\iow_char:N\\c\{...\}'~in~a~replacement~text.
@@ -20565,7 +20980,7 @@
     '\iow_char:N\\c\{...\}'~are~ignored~when~building~the~control~
     sequence~name.
   }
-\__msg_kernel_new:nnnn { kernel } { replacement-null-space }
+\__kernel_msg_new:nnnn { kernel } { replacement-null-space }
   { TeX~cannot~build~a~space~token~with~character~code~0. }
   {
     You~asked~for~a~character~token~with~category~space,~
@@ -20574,19 +20989,19 @@
     This~specific~case~is~impossible~and~will~be~replaced~
     by~a~normal~space.
   }
-\__msg_kernel_new:nnnn { kernel } { replacement-missing-rbrace }
+\__kernel_msg_new:nnnn { kernel } { replacement-missing-rbrace }
   { Missing~right~brace~inserted~in~replacement~text. }
   {
     There~ \int_compare:nTF { #1 = 1 } { was } { were } ~ #1~
     missing~right~\int_compare:nTF { #1 = 1 } { brace } { braces } .
   }
-\__msg_kernel_new:nnnn { kernel } { replacement-missing-rparen }
+\__kernel_msg_new:nnnn { kernel } { replacement-missing-rparen }
   { Missing~right~parenthesis~inserted~in~replacement~text. }
   {
     There~ \int_compare:nTF { #1 = 1 } { was } { were } ~ #1~
     missing~right~\int_compare:nTF { #1 = 1 } { parenthesis } { parentheses } .
   }
-\__msg_kernel_new:nnn { kernel } { show-regex }
+\__kernel_msg_new:nnn { kernel } { show-regex }
   {
     >~Compiled~regex~
     \tl_if_empty:nTF {#1} { variable~ #2 } { {#1} } :
@@ -20608,22 +21023,22 @@
           }
       }
   }
-\__debug:TF
+\__kernel_debug:TF
   {
-    \cs_new_protected:Npn \__debug_trace_push:nnN #1#2#3
-      { \__debug_trace:nnx {#1} {#2} { entering~ \token_to_str:N #3 } }
-    \cs_new_protected:Npn \__debug_trace_pop:nnN #1#2#3
-      { \__debug_trace:nnx {#1} {#2} { leaving~ \token_to_str:N #3 } }
-    \cs_new_protected:Npn \__debug_trace:nnx #1#2#3
+    \cs_new_protected:Npn \__regex_trace_push:nnN #1#2#3
+      { \__regex_trace:nnx {#1} {#2} { entering~ \token_to_str:N #3 } }
+    \cs_new_protected:Npn \__regex_trace_pop:nnN #1#2#3
+      { \__regex_trace:nnx {#1} {#2} { leaving~ \token_to_str:N #3 } }
+    \cs_new_protected:Npn \__regex_trace:nnx #1#2#3
       {
         \int_compare:nNnF
-          { \int_use:c { g__debug_trace_#1_int } } < {#2}
+          { \int_use:c { g__regex_trace_#1_int } } < {#2}
           { \iow_term:x { Trace:~#3 } }
       }
   }
   { }
-\int_new:N \g__debug_trace_regex_int
-\__debug:TF
+\int_new:N \g__regex_trace_regex_int
+\__kernel_debug:TF
   {
     \cs_new_protected:Npn \__regex_trace_states:n #1
       {
@@ -20632,13 +21047,13 @@
           { 1 }
           { \l__regex_max_state_int - 1 }
           {
-            \__debug_trace:nnx { regex } {#1}
+            \__regex_trace:nnx { regex } {#1}
               { \iow_char:N \\toks ##1 = { \__regex_toks_use:w ##1 } }
           }
       }
   }
   { }
-%% File: l3box.dtx Copyright (C) 2005-2017 The LaTeX3 Project
+%% File: l3box.dtx Copyright (C) 2005-2018 The LaTeX3 Project
 \cs_new_protected:Npn \box_new:N #1
   {
     \__chk_if_free_cs:N #1
@@ -20657,18 +21072,18 @@
   { \box_if_exist:NTF #1 { \box_gclear:N #1 } { \box_new:N #1 } }
 \cs_generate_variant:Nn \box_clear_new:N  { c }
 \cs_generate_variant:Nn \box_gclear_new:N { c }
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \box_set_eq:NN #1#2
   { \tex_setbox:D #1 \tex_copy:D #2 }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \box_gset_eq:NN #1#2
   { \tex_global:D \tex_setbox:D #1 \tex_copy:D #2 }
 \cs_generate_variant:Nn \box_set_eq:NN  { c , Nc , cc }
 \cs_generate_variant:Nn \box_gset_eq:NN { c , Nc , cc }
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \box_set_eq_clear:NN #1#2
   { \tex_setbox:D #1 \tex_box:D #2 }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \box_gset_eq_clear:NN #1#2
   { \tex_global:D \tex_setbox:D #1 \tex_box:D #2 }
 \cs_generate_variant:Nn \box_set_eq_clear:NN  { c , Nc , cc }
@@ -20719,10 +21134,10 @@
   { \if_box_empty:N #1 \prg_return_true: \else: \prg_return_false: \fi: }
 \prg_generate_conditional_variant:Nnn \box_if_empty:N
   { c } { p , T , F , TF }
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \box_set_to_last:N #1
   { \tex_setbox:D #1 \tex_lastbox:D }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \box_gset_to_last:N #1
   { \tex_global:D \tex_setbox:D #1 \tex_lastbox:D }
 \cs_generate_variant:Nn \box_set_to_last:N  { c }
@@ -20763,7 +21178,7 @@
         \group_end:
       }
       {
-        \__msg_kernel_error:nnx { kernel } { variable-not-defined }
+        \__kernel_msg_error:nnx { kernel } { variable-not-defined }
           { \token_to_str:N #2 }
       }
   }
@@ -20770,21 +21185,21 @@
 \cs_generate_variant:Nn \__box_show:NNnn { NNff }
 \cs_new_protected:Npn \hbox:n #1
   { \tex_hbox:D \scan_stop: { \group_begin: #1 \group_end: } }
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \hbox_set:Nn #1#2
   { \tex_setbox:D #1 \tex_hbox:D { \group_begin: #2 \group_end: } }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \hbox_gset:Nn #1#2
   { \tex_global:D \tex_setbox:D #1 \tex_hbox:D { \group_begin: #2 \group_end: } }
 \cs_generate_variant:Nn \hbox_set:Nn { c }
 \cs_generate_variant:Nn \hbox_gset:Nn { c }
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \hbox_set_to_wd:Nnn #1#2#3
   {
     \tex_setbox:D #1 \tex_hbox:D to \__dim_eval:n {#2}
       { \group_begin: #3 \group_end: }
   }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \hbox_gset_to_wd:Nnn #1#2#3
   {
     \tex_global:D \tex_setbox:D #1 \tex_hbox:D to \__dim_eval:n {#2}
@@ -20792,7 +21207,7 @@
   }
 \cs_generate_variant:Nn \hbox_set_to_wd:Nnn { c }
 \cs_generate_variant:Nn \hbox_gset_to_wd:Nnn { c }
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \hbox_set:Nw  #1
   {
     \tex_setbox:D #1 \tex_hbox:D
@@ -20799,7 +21214,7 @@
       \c_group_begin_token
         \group_begin:
   }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \hbox_gset:Nw  #1
   {
     \tex_global:D \tex_setbox:D #1 \tex_hbox:D
@@ -20814,7 +21229,7 @@
     \c_group_end_token
   }
 \cs_new_eq:NN \hbox_gset_end: \hbox_set_end:
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \hbox_set_to_wd:Nnw #1#2
   {
     \tex_setbox:D #1 \tex_hbox:D to \__dim_eval:n {#2}
@@ -20821,7 +21236,7 @@
       \c_group_begin_token
         \group_begin:
   }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \hbox_gset_to_wd:Nnw #1#2
   {
     \tex_global:D \tex_setbox:D #1 \tex_hbox:D to \__dim_eval:n {#2}
@@ -20859,13 +21274,13 @@
     \tex_vbox:D to \c_zero_dim
       { \group_begin: #1 \par \group_end: }
   }
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \vbox_set:Nn #1#2
   {
     \tex_setbox:D #1 \tex_vbox:D
       { \group_begin: #2 \par \group_end: }
   }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \vbox_gset:Nn #1#2
   {
     \tex_global:D \tex_setbox:D #1 \tex_vbox:D
@@ -20873,13 +21288,13 @@
   }
 \cs_generate_variant:Nn \vbox_set:Nn  { c }
 \cs_generate_variant:Nn \vbox_gset:Nn { c }
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \vbox_set_top:Nn #1#2
   {
     \tex_setbox:D #1 \tex_vtop:D
       { \group_begin: #2 \par \group_end: }
   }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \vbox_gset_top:Nn #1#2
   {
     \tex_global:D \tex_setbox:D #1 \tex_vtop:D
@@ -20887,13 +21302,13 @@
   }
 \cs_generate_variant:Nn \vbox_set_top:Nn { c }
 \cs_generate_variant:Nn \vbox_gset_top:Nn { c }
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \vbox_set_to_ht:Nnn #1#2#3
   {
     \tex_setbox:D #1 \tex_vbox:D to \__dim_eval:n {#2}
       { \group_begin: #3 \par \group_end: }
   }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \vbox_gset_to_ht:Nnn #1#2#3
   {
     \tex_global:D \tex_setbox:D #1 \tex_vbox:D to \__dim_eval:n {#2}
@@ -20901,7 +21316,7 @@
   }
 \cs_generate_variant:Nn \vbox_set_to_ht:Nnn  { c }
 \cs_generate_variant:Nn \vbox_gset_to_ht:Nnn { c }
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \vbox_set:Nw #1
   {
     \tex_setbox:D #1 \tex_vbox:D
@@ -20908,7 +21323,7 @@
       \c_group_begin_token
         \group_begin:
   }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \vbox_gset:Nw #1
   {
     \tex_global:D \tex_setbox:D #1 \tex_vbox:D
@@ -20924,7 +21339,7 @@
     \c_group_end_token
   }
 \cs_new_eq:NN \vbox_gset_end: \vbox_set_end:
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \vbox_set_to_ht:Nnw #1#2
   {
     \tex_setbox:D #1 \tex_vbox:D to \__dim_eval:n {#2}
@@ -20931,7 +21346,7 @@
       \c_group_begin_token
         \group_begin:
   }
-\__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \vbox_gset_to_ht:Nnw #1#2
   {
     \tex_global:D \tex_setbox:D #1 \tex_vbox:D to \__dim_eval:n {#2}
@@ -20944,7 +21359,7 @@
 \cs_new_eq:NN \vbox_unpack_clear:N \tex_unvbox:D
 \cs_generate_variant:Nn \vbox_unpack:N { c }
 \cs_generate_variant:Nn \vbox_unpack_clear:N { c }
-\__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \vbox_set_split_to_ht:NNn #1#2#3
   { \tex_setbox:D #1 \tex_vsplit:D #2 to \__dim_eval:n {#3} }
 \fp_new:N \l__box_angle_fp
@@ -21246,19 +21661,19 @@
           }
       }
   }
-\__debug_deprecation:nnNNpn
+\__kernel_patch_deprecation:nnNNpn
   { 2018-12-31 } { \box_resize_to_wd_and_ht_plus_dp:Nnn }
 \cs_new_protected:Npn \box_resize:Nnn
   { \box_resize_to_wd_and_ht_plus_dp:Nnn }
-\__debug_deprecation:nnNNpn
+\__kernel_patch_deprecation:nnNNpn
   { 2018-12-31 } { \box_resize_to_wd_and_ht_plus_dp:cnn }
 \cs_new_protected:Npn \box_resize:cnn
   { \box_resize_to_wd_and_ht_plus_dp:cnn }
-\__debug_deprecation:nnNNpn
-  { 2018-12-31 } { \box_use_clear:N }
+\__kernel_patch_deprecation:nnNNpn
+  { 2018-12-31 } { \box_use_drop:N }
 \cs_new_protected:Npn \box_use_clear:N { \box_use_drop:N }
-\__debug_deprecation:nnNNpn
-  { 2018-12-31 } { \box_use_clear:c }
+\__kernel_patch_deprecation:nnNNpn
+  { 2018-12-31 } { \box_use_drop:c }
 \cs_new_protected:Npn \box_use_clear:c { \box_use_drop:c }
 %% File: l3coffins.dtx Copyright(C) 2010-2017 The LaTeX3 Project
 \box_new:N \l__coffin_internal_box
@@ -21311,7 +21726,7 @@
     \coffin_if_exist:NTF #1
       { #2 }
       {
-        \__msg_kernel_error:nnx { kernel } { unknown-coffin }
+        \__kernel_msg_error:nnx { kernel } { unknown-coffin }
           { \token_to_str:N #1 }
       }
   }
@@ -21456,7 +21871,7 @@
     \prop_get:cnNF
       { l__coffin_poles_ \__int_value:w #1 _prop } {#2} #3
       {
-        \__msg_kernel_error:nnxx { kernel } { unknown-coffin-pole }
+        \__kernel_msg_error:nnxx { kernel } { unknown-coffin-pole }
           {#2} { \token_to_str:N #1 }
         \tl_set:Nn #3 { { 0pt } { 0pt } { 0pt } { 0pt } }
       }
@@ -21564,7 +21979,7 @@
         \l__coffin_pole_a_tl \l__coffin_pole_b_tl
     \bool_if:NT \l__coffin_error_bool
       {
-        \__msg_kernel_error:nn { kernel } { no-pole-intersection }
+        \__kernel_msg_error:nn { kernel } { no-pole-intersection }
         \dim_zero:N \l__coffin_x_dim
         \dim_zero:N \l__coffin_y_dim
       }
@@ -22039,7 +22454,7 @@
           { }
       }
   }
-\__msg_kernel_new:nnnn { kernel } { no-pole-intersection }
+\__kernel_msg_new:nnnn { kernel } { no-pole-intersection }
   { No~intersection~between~coffin~poles. }
   {
     \c__msg_coding_error_text_tl
@@ -22047,10 +22462,10 @@
     but~they~do~not~have~a~unique~meeting~point:~
     the~value~(0~pt,~0~pt)~will~be~used.
   }
-\__msg_kernel_new:nnnn { kernel } { unknown-coffin }
+\__kernel_msg_new:nnnn { kernel } { unknown-coffin }
   { Unknown~coffin~'#1'. }
   { The~coffin~'#1'~was~never~defined. }
-\__msg_kernel_new:nnnn { kernel } { unknown-coffin-pole }
+\__kernel_msg_new:nnnn { kernel } { unknown-coffin-pole }
   { Pole~'#1'~unknown~for~coffin~'#2'. }
   {
     \c__msg_coding_error_text_tl
@@ -22057,12 +22472,12 @@
     LaTeX~was~asked~to~find~a~typesetting~pole~for~a~coffin,~
     but~either~the~coffin~does~not~exist~or~the~pole~name~is~wrong.
   }
-\__msg_kernel_new:nnn { kernel } { show-coffin }
+\__kernel_msg_new:nnn { kernel } { show-coffin }
   {
     Size~of~coffin~#1 : #2 \\
     Poles~of~coffin~#1 : #3 .
   }
-%% File: l3color.dtx Copyright(C) 2011,2012,2014,2016,2017 The LaTeX3 Project
+%% File: l3color-base.dtx Copyright(C) 2011,2012,2014,2016-2018 The LaTeX3 Project
 \cs_new_eq:NN \color_group_begin: \group_begin:
 \cs_new_protected:Npn \color_group_end:
   {
@@ -22071,10 +22486,23 @@
   }
 \cs_new_protected:Npn \color_ensure_current:
   {
-    \__driver_color_pickup:N \l__color_current_tl
-    \__driver_color_select:V \l__color_current_tl
-    \group_insert_after:N \__driver_color_reset:
+    \driver_color_pickup:N \l__color_current_tl
+    \__color_select:V \l__color_current_tl
+    \group_insert_after:N \driver_color_reset:
   }
+\cs_new_protected:Npn \__color_select:n #1
+  {  \__color_select:w #1 \q_stop }
+\cs_generate_variant:Nn \__color_select:n { V }
+\cs_new_protected:Npn \__color_select:w #1 ~ #2 \q_stop
+  { \use:c { __color_select_ #1 :w } #2 \q_stop }
+\cs_new_protected:Npn \__color_select_cmyk:w #1 ~ #2 ~ #3 ~ #4 \q_stop
+  { \driver_color_cmyk:nnnn {#1} {#2} {#3} {#4} }
+\cs_new_protected:Npn \__color_select_gray:w #1 \q_stop
+  { \driver_color_gray:n {#1} }
+\cs_new_protected:Npn \__color_select_rgb:w #1 ~ #2 ~ #3 \q_stop
+  { \driver_color_rgb:nnn {#1} {#2} {#3} }
+\cs_new_protected:Npn \__color_select_spot:w #1 ~ #2 \q_stop
+  { \driver_color_spot:nn {#1} {#2} }
 \tl_new:N \l__color_current_tl
 \tl_set:Nn \l__color_current_tl { gray~0 }
 %% File: l3sys.dtx Copyright (C) 2015-2017 The LaTeX3 Project
@@ -22161,15 +22589,15 @@
     \cs_new_eq:NN \sys_if_output_pdf_p: \c_false_bool
     \str_const:Nn \c_sys_output_str { dvi }
   }
-%% File: l3deprecation.dtx (C) Copyright 2017 The LaTeX3 Project
+%% File: l3deprecation.dtx (C) Copyright 2017-2018 The LaTeX3 Project
 \cs_new_protected:Npn \__deprecation_error:Nnn #1#2#3
   {
     \etex_protected:D \tex_outer:D \tex_edef:D #1
       {
-        \exp_not:N \__msg_kernel_expandable_error:nnnnn
+        \exp_not:N \__kernel_msg_expandable_error:nnnnn
           { kernel } { deprecated-command }
           { \tl_to_str:n {#3} } { \token_to_str:N #1 } { \tl_to_str:n {#2} }
-        \exp_not:N \__msg_kernel_error:nnxxx
+        \exp_not:N \__kernel_msg_error:nnxxx
           { kernel } { deprecated-command }
           { \tl_to_str:n {#3} } { \token_to_str:N #1 } { \tl_to_str:n {#2} }
       }
@@ -22205,21 +22633,16 @@
 \__deprecation_error:Nnn \xetex_if_engine:F { \sys_if_engine_xetex:F } { 2017-01-01 }
 \__deprecation_error:Nnn \xetex_if_engine:T { \sys_if_engine_xetex:T } { 2017-01-01 }
 \__deprecation_error:Nnn \xetex_if_engine:TF { \sys_if_engine_xetex:TF } { 2017-01-01 }
-\__debug:TF
+\__kernel_deprecation_code:nn
   {
-    \tl_gput_right:Nn \g__debug_deprecation_on_tl
-      {
-        \cs_set_protected:Npn \__cs_generate_variant_loop_warning:nnxxxx
-          { \__msg_kernel_error:nnxxxx }
-      }
-    \tl_gput_right:Nn \g__debug_deprecation_off_tl
-      {
-        \cs_set_protected:Npn \__cs_generate_variant_loop_warning:nnxxxx
-          { \__msg_kernel_warning:nnxxxx }
-      }
+    \cs_set_protected:Npn \__cs_generate_variant_loop_warning:nnxxxx
+      { \__kernel_msg_error:nnxxxx }
   }
-  { }
-%% File: l3candidates.dtx Copyright (C) 2012-2017 The LaTeX3 Project
+  {
+    \cs_set_protected:Npn \__cs_generate_variant_loop_warning:nnxxxx
+      { \__kernel_msg_warning:nnxxxx }
+  }
+%% File: l3candidates.dtx Copyright (C) 2012-2018 The LaTeX3 Project
 \cs_new_protected:Npx \mode_leave_vertical:
   {
     \cs_if_exist:NTF \pdftex_quitvmode:D
@@ -22615,13 +23038,13 @@
         \cs_set_protected:Npn \__file_get_details:nnN #1#2#3
           {
             \tl_clear:N #3
-            \__msg_kernel_error:nnx
+            \__kernel_msg_error:nnx
               { kernel } { xetex-primitive-not-available }
               { \exp_not:c { pdffile #2 } }
           }
       }
   }
-\__msg_kernel_new:nnnn { kernel } { xetex-primitive-not-available }
+\__kernel_msg_new:nnnn { kernel } { xetex-primitive-not-available }
   { Primitive~\token_to_str:N #1 not~available }
   {
     XeTeX~does~not~currently~provide~functionality~equivalent~to~the~
@@ -22640,7 +23063,7 @@
       {#2}
       { \__file_input:V \l__file_full_name_str }
   }
-\__debug_deprecation:nnNNpn { 2017-12-31 }
+\__kernel_patch_deprecation:nnNNpn { 2017-12-31 }
   { \file_if_exist:nTF and~ \file_input:n }
 \cs_new_protected:Npn \file_if_exist_input:nTF #1#2#3
   {
@@ -22648,7 +23071,7 @@
     \str_if_empty:NTF \l__file_full_name_str
       {#3} { #2 \__file_input:V \l__file_full_name_str }
   }
-\__debug_deprecation:nnNNpn { 2017-12-31 }
+\__kernel_patch_deprecation:nnNNpn { 2017-12-31 }
   { \file_if_exist:nT and~ \file_input:n }
 \cs_new_protected:Npn \file_if_exist_input:nT #1#2
   {
@@ -22659,10 +23082,10 @@
 \cs_new_protected:Npn \file_input_stop: { \tex_endinput:D }
 \cs_if_exist:NTF \pdftex_uniformdeviate:D
   {
-    \__debug_patch_args:nNNpn
+    \__kernel_patch_args:nNNpn
       {
-        { \__debug_chk_expr:nNnN {#1} \__int_eval:w { } \int_rand:nn }
-        { \__debug_chk_expr:nNnN {#2} \__int_eval:w { } \int_rand:nn }
+        { \__kernel_chk_expr:nNnN {#1} \__int_eval:w { } \int_rand:nn }
+        { \__kernel_chk_expr:nNnN {#2} \__int_eval:w { } \int_rand:nn }
       }
     \cs_new:Npn \int_rand:nn #1#2
       {
@@ -22674,7 +23097,7 @@
       {
         \int_compare:nNnTF {#1} > {#2}
           {
-            \__msg_kernel_expandable_error:nnnn
+            \__kernel_msg_expandable_error:nnnn
               { kernel } { backward-range } {#1} {#2}
             \__int_rand:ww #2; #1;
           }
@@ -22709,13 +23132,13 @@
   {
     \cs_new:Npn \int_rand:nn #1#2
       {
-        \__msg_kernel_expandable_error:nn { kernel } { fp-no-random }
+        \__kernel_msg_expandable_error:nn { kernel } { fp-no-random }
         \int_eval:n {#1}
       }
   }
 \cs_if_exist:NT \pdftex_uniformdeviate:D
   {
-    \__msg_kernel_new:nnn { kernel } { backward-range }
+    \__kernel_msg_new:nnn { kernel } { backward-range }
       { Bounds~ordered~backwards~in~\int_rand:nn {#1}~{#2}. }
   }
 \cs_new:Npn \msg_expandable_error:nnnnnn #1#2#3#4#5#6
@@ -22768,7 +23191,7 @@
     \use:nn { ~ } { ~ } => \use:nn { ~ } { ~ }
     \exp_not:N \tl_to_str:n {#2}
   }
-\__debug_patch:nnNNpn { \__debug_chk_var_scope:NN c #1 } { }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_scope:NN c #1 } { }
 \cs_new_protected:Npn \bool_const:Nn #1#2
   {
     \__chk_if_free_cs:N #1
@@ -24200,7 +24623,7 @@
       {
         \cs_set:Npn #1 ##1
           {
-            \__msg_kernel_expandable_error:nnn
+            \__kernel_msg_expandable_error:nnn
               { kernel } { luatex-required } { #1 }
           }
       }
@@ -24209,12 +24632,12 @@
       {
         \cs_set_protected:Npn #1 ##1
           {
-            \__msg_kernel_error:nnn
+            \__kernel_msg_error:nnn
               { kernel } { luatex-required } { #1 }
           }
       }
   }
-\__msg_kernel_new:nnnn { kernel } { luatex-required }
+\__kernel_msg_new:nnnn { kernel } { luatex-required }
   { LuaTeX~engine~not~in~use!~Ignoring~#1. }
   {
     The~feature~you~are~using~is~only~available~

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex	2018-02-23 21:54:14 UTC (rev 46720)
@@ -6,7 +6,7 @@
 %%
 %% expl3.dtx  (with options: `generic,loader')
 %% 
-%% Copyright (C) 1990-2017 The LaTeX3 Project
+%% Copyright (C) 1990-2018 The LaTeX3 Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx Copyright (C) 1990-2017 The LaTeX3 Project
-\def\ExplFileDate{2017/12/16}%
+\def\ExplFileDate{2018/02/21}%
 \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	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty	2018-02-23 21:54:14 UTC (rev 46720)
@@ -6,7 +6,7 @@
 %%
 %% expl3.dtx  (with options: `package,loader')
 %% 
-%% Copyright (C) 1990-2017 The LaTeX3 Project
+%% Copyright (C) 1990-2018 The LaTeX3 Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx Copyright (C) 1990-2017 The LaTeX3 Project
-\def\ExplFileDate{2017/12/16}%
+\def\ExplFileDate{2018/02/21}%
 \let\ExplLoaderFileDate\ExplFileDate
 \ProvidesPackage{expl3}
   [%
@@ -83,7 +83,7 @@
     \cs_if_exist:NF \color
       { \DeclareRobustCommand \color [2] [ ] { } }
   }
-\__msg_kernel_new:nnnn { expl } { wrong-driver }
+\__kernel_msg_new:nnnn { expl } { wrong-driver }
   { Driver~request~inconsistent~with~engine:~using~'#2'~driver. }
   {
     You~have~requested~driver~'#1',~but~this~is~not~suitable~for~use~with~the~
@@ -117,7 +117,7 @@
         \tl_set:Nn \l__expl_driver_tl { dvipdfmx }
         \sys_if_engine_xetex:TF
           {
-            \__msg_kernel_error:nnnn { expl } { wrong-driver }
+            \__kernel_msg_error:nnnn { expl } { wrong-driver }
               { dvipdfmx } { xdvipdfmx }
             \tl_set:Nn \l__expl_driver_tl { xdvipdfmx }
           }
@@ -124,7 +124,7 @@
           {
             \sys_if_output_pdf:T
               {
-                \__msg_kernel_error:nnnn { expl } { wrong-driver }
+                \__kernel_msg_error:nnnn { expl } { wrong-driver }
                   { dvipdfmx } { pdfmode }
                 \tl_set:Nn \l__expl_driver_tl { pdfmode }
               }
@@ -135,7 +135,7 @@
         \tl_set:Nn \l__expl_driver_tl { dvips }
         \sys_if_engine_xetex:TF
           {
-            \__msg_kernel_error:nnnn { expl } { wrong-driver }
+            \__kernel_msg_error:nnnn { expl } { wrong-driver }
               { dvips } { xdvipdfmx }
             \tl_set:Nn \l__expl_driver_tl { xdvipdfmx }
           }
@@ -142,7 +142,7 @@
           {
             \sys_if_output_pdf:T
               {
-                \__msg_kernel_error:nnnn { expl } { wrong-driver }
+                \__kernel_msg_error:nnnn { expl } { wrong-driver }
                   { dvips } { pdfmode }
                 \tl_set:Nn \l__expl_driver_tl { pdfmode }
               }
@@ -153,7 +153,7 @@
         \tl_set:Nn \l__expl_driver_tl { dvisvgm }
         \sys_if_engine_xetex:TF
           {
-            \__msg_kernel_error:nnnn { expl } { wrong-driver }
+            \__kernel_msg_error:nnnn { expl } { wrong-driver }
               { dvips } { xdvipdfmx }
             \tl_set:Nn \l__expl_driver_tl { xdvipdfmx }
           }
@@ -160,7 +160,7 @@
           {
             \sys_if_output_pdf:T
               {
-                \__msg_kernel_error:nnnn { expl } { wrong-driver }
+                \__kernel_msg_error:nnnn { expl } { wrong-driver }
                   { dvips } { pdfmode }
                 \tl_set:Nn \l__expl_driver_tl { pdfmode }
               }
@@ -173,7 +173,7 @@
         \tl_set:Nn \l__expl_driver_tl { pdfmode }
         \sys_if_engine_xetex:TF
           {
-            \__msg_kernel_error:nnnn { expl } { wrong-driver }
+            \__kernel_msg_error:nnnn { expl } { wrong-driver }
               { pdfmode } { xdvipdfmx }
             \tl_set:Nn \l__expl_driver_tl { xdvipdfmx }
           }
@@ -180,7 +180,7 @@
           {
             \sys_if_output_pdf:F
               {
-                \__msg_kernel_error:nnnn { expl } { wrong-driver }
+                \__kernel_msg_error:nnnn { expl } { wrong-driver }
                   { pdfmode } { dvips }
                 \tl_set:Nn \l__expl_driver_tl { dvips }
               }
@@ -193,12 +193,12 @@
           {
             \sys_if_output_pdf:TF
               {
-                \__msg_kernel_error:nnnn { expl } { wrong-driver }
+                \__kernel_msg_error:nnnn { expl } { wrong-driver }
                   { xdvipdfmx } { pdfmode }
                 \tl_set:Nn \l__expl_driver_tl { pdfmode }
               }
               {
-                \__msg_kernel_error:nnnn { expl } { wrong-driver }
+                \__kernel_msg_error:nnnn { expl } { wrong-driver }
                   { xdvipdfmx } { dvips }
                 \tl_set:Nn \l__expl_driver_tl { dvips }
               }
@@ -219,7 +219,7 @@
 \str_if_eq:VnTF \l__expl_driver_tl { latex2e }
   {
     \tl_gput_left:Nn \@begindocumenthook { \RequirePackage { graphics } }
-    \__msg_kernel_new:nnnn { box } { clipping-not-available }
+    \__kernel_msg_new:nnnn { box } { clipping-not-available }
       { Box~clipping~not~available. }
       {
         The~\box_clip:N~function~is~only~available~when~loading~expl3~
@@ -228,7 +228,7 @@
     \cs_set_protected:Npn \box_clip:N #1
       {
         \hbox_set:Nn #1 { \box_use:N #1 }
-        \__msg_kernel_error:nn { box } { clipping-not-available }
+        \__kernel_msg_error:nn { box } { clipping-not-available }
       }
     \cs_set_protected:Npn \box_rotate:Nn #1#2
       { \hbox_set:Nn #1 { \rotatebox {#2} { \box_use:N #1 } } }

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3basics.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3basics.sty	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3basics.sty	2018-02-23 21:54:14 UTC (rev 46720)
@@ -6,7 +6,7 @@
 %%
 %% l3oldmodules.dtx  (with options: `l3basics,oldmodules')
 %% 
-%% Copyright (C) 1990-2017 The LaTeX3 Project
+%% Copyright (C) 1990-2018 The LaTeX3 Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -18,7 +18,7 @@
 %% This file is part of the "l3kernel bundle" (The Work in LPPL)
 %% and all files in that bundle must be distributed together.
 %% 
-%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project
+%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project
 \def\old at liii@module at name
 {l3basics}
 \ProvidesPackage\old at liii@module at name

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3bootstrap.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3bootstrap.sty	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3bootstrap.sty	2018-02-23 21:54:14 UTC (rev 46720)
@@ -6,7 +6,7 @@
 %%
 %% l3oldmodules.dtx  (with options: `l3bootstrap,oldmodules')
 %% 
-%% Copyright (C) 1990-2017 The LaTeX3 Project
+%% Copyright (C) 1990-2018 The LaTeX3 Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -18,7 +18,7 @@
 %% This file is part of the "l3kernel bundle" (The Work in LPPL)
 %% and all files in that bundle must be distributed together.
 %% 
-%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project
+%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project
 \def\old at liii@module at name
 {l3bootstrap}
 \ProvidesPackage\old at liii@module at name

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3box.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3box.sty	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3box.sty	2018-02-23 21:54:14 UTC (rev 46720)
@@ -6,7 +6,7 @@
 %%
 %% l3oldmodules.dtx  (with options: `l3box,oldmodules')
 %% 
-%% Copyright (C) 1990-2017 The LaTeX3 Project
+%% Copyright (C) 1990-2018 The LaTeX3 Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -18,7 +18,7 @@
 %% This file is part of the "l3kernel bundle" (The Work in LPPL)
 %% and all files in that bundle must be distributed together.
 %% 
-%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project
+%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project
 \def\old at liii@module at name
 {l3box}
 \ProvidesPackage\old at liii@module at name

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3candidates.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3candidates.sty	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3candidates.sty	2018-02-23 21:54:14 UTC (rev 46720)
@@ -6,7 +6,7 @@
 %%
 %% l3oldmodules.dtx  (with options: `l3candidates,oldmodules')
 %% 
-%% Copyright (C) 1990-2017 The LaTeX3 Project
+%% Copyright (C) 1990-2018 The LaTeX3 Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -18,7 +18,7 @@
 %% This file is part of the "l3kernel bundle" (The Work in LPPL)
 %% and all files in that bundle must be distributed together.
 %% 
-%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project
+%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project
 \def\old at liii@module at name
 {l3candidates}
 \ProvidesPackage\old at liii@module at name

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3clist.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3clist.sty	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3clist.sty	2018-02-23 21:54:14 UTC (rev 46720)
@@ -6,7 +6,7 @@
 %%
 %% l3oldmodules.dtx  (with options: `l3clist,oldmodules')
 %% 
-%% Copyright (C) 1990-2017 The LaTeX3 Project
+%% Copyright (C) 1990-2018 The LaTeX3 Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -18,7 +18,7 @@
 %% This file is part of the "l3kernel bundle" (The Work in LPPL)
 %% and all files in that bundle must be distributed together.
 %% 
-%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project
+%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project
 \def\old at liii@module at name
 {l3clist}
 \ProvidesPackage\old at liii@module at name

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3coffins.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3coffins.sty	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3coffins.sty	2018-02-23 21:54:14 UTC (rev 46720)
@@ -6,7 +6,7 @@
 %%
 %% l3oldmodules.dtx  (with options: `l3coffins,oldmodules')
 %% 
-%% Copyright (C) 1990-2017 The LaTeX3 Project
+%% Copyright (C) 1990-2018 The LaTeX3 Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -18,7 +18,7 @@
 %% This file is part of the "l3kernel bundle" (The Work in LPPL)
 %% and all files in that bundle must be distributed together.
 %% 
-%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project
+%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project
 \def\old at liii@module at name
 {l3coffins}
 \ProvidesPackage\old at liii@module at name

Deleted: trunk/Master/texmf-dist/tex/latex/l3kernel/l3color.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3color.sty	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3color.sty	2018-02-23 21:54:14 UTC (rev 46720)
@@ -1,50 +0,0 @@
-%%
-%% This is file `l3color.sty',
-%% generated with the docstrip utility.
-%%
-%% The original source files were:
-%%
-%% l3oldmodules.dtx  (with options: `l3color,oldmodules')
-%% 
-%% Copyright (C) 1990-2017 The LaTeX3 Project
-%% 
-%% It may be distributed and/or modified under the conditions of
-%% the LaTeX Project Public License (LPPL), either version 1.3c of
-%% this license or (at your option) any later version.  The latest
-%% version of this license is in the file:
-%% 
-%%    https://www.latex-project.org/lppl.txt
-%% 
-%% This file is part of the "l3kernel bundle" (The Work in LPPL)
-%% and all files in that bundle must be distributed together.
-%% 
-%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project
-\def\old at liii@module at name
-{l3color}
-\ProvidesPackage\old at liii@module at name
-  [%
-    2017/03/18 Obsolete L3 package
-  ]
-\typeout{*****************************************************************}
-\typeout{** }
-\typeout{** Package \old at liii@module at name\space is obsolete and has been removed!}
-\typeout{** }
-\typeout{** Its functionality is now only provided as part of the expl3 package.}
-\typeout{** }
-\typeout{** After showing you an error message you can hit <return> we will continue}
-\typeout{** for now by loading expl3 for you. However, the old packages will be}
-\typeout{** removed entirely at the end of 2017.}
-\typeout{** }
-\typeout{** Therefore, please replace '\string\usepackage{\old at liii@module at name}'}
-\typeout{** with '\string\usepackage{expl3}' in your documents as soon as possible.}
-\typeout{** }
-\typeout{*******************************************************************}
-\PackageError
-  \old at liii@module at name{This package is obsolete ---
-   use 'expl3' instead}
-  \@ehc
-\RequirePackage{expl3}
-
-%% 
-%%
-%% End of file `l3color.sty'.

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls	2018-02-23 21:54:14 UTC (rev 46720)
@@ -6,7 +6,7 @@
 %%
 %% l3doc.dtx  (with options: `class')
 %% 
-%% Copyright (C) 1990-2017 The LaTeX3 Project
+%% Copyright (C) 1990-2018 The LaTeX3 Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -18,9 +18,9 @@
 %% This file is part of the "l3kernel bundle" (The Work in LPPL)
 %% and all files in that bundle must be distributed together.
 %% 
-%% File: l3doc.dtx Copyright (C) 1990-2017 The LaTeX3 project
+%% File: l3doc.dtx Copyright (C) 1990-2018 The LaTeX3 project
 \RequirePackage{expl3,xparse,calc}
-\ProvidesExplClass{l3doc}{2017/12/16}{}
+\ProvidesExplClass{l3doc}{2018/02/21}{}
   {L3 Experimental documentation class}
 \clist_new:N \g_docinput_clist
 \seq_new:N \g_doc_functions_seq
@@ -110,7 +110,7 @@
 \cs_generate_variant:Nn \tl_if_head_eq_charcode:nNT  { o }
 \cs_generate_variant:Nn \tl_if_head_eq_charcode:nNF  { o }
 \cs_generate_variant:Nn \tl_if_head_eq_meaning:nNF  { V }
-\cs_generate_variant:Nn \tl_if_in:nnTF { no }
+\cs_generate_variant:Nn \tl_if_in:nnTF { no , oo }
 \cs_generate_variant:Nn \tl_if_in:NnTF { No }
 \cs_generate_variant:Nn \tl_if_in:NnT  { No }
 \cs_generate_variant:Nn \tl_if_in:NnF  { No }
@@ -136,6 +136,16 @@
     \tl_set:Nx #1 { \exp_after:wN \__codedoc_tmp:w #1 #2 \q_stop }
   }
 \cs_generate_variant:Nn \__codedoc_trim_right:Nn { No }
+\prg_new_protected_conditional:Npnn \__codedoc_str_if_begin:nn #1#2 { TF , T , F }
+  {
+    \tl_if_in:ooTF
+      { \exp_after:wN \scan_stop: \tl_to_str:n {#1} }
+      { \exp_after:wN \scan_stop: \tl_to_str:n {#2} }
+      { \prg_return_true: }
+      { \prg_return_false: }
+  }
+\prg_generate_conditional_variant:Nnn \__codedoc_str_if_begin:nn
+  { oo } { TF , T , F }
 \cs_new_protected:Npn \__codedoc_replace_at_at:N #1
   {
     \bool_if:NT \l__codedoc_in_implementation_bool
@@ -172,32 +182,38 @@
           \__codedoc_trim_right:No \l__codedoc_detect_internals_tl
             \c_catcode_active_space_tl
           \__codedoc_trim_right:Nn \l__codedoc_detect_internals_tl ^^M
-          \tl_set_eq:NN \l__codedoc_detect_internals_cs_tl \l__codedoc_detect_internals_tl
-          \__codedoc_trim_right:Nn \l__codedoc_detect_internals_tl _
-          \__codedoc_trim_right:Nn \l__codedoc_detect_internals_tl :
-          \__codedoc_trim_right:No \l__codedoc_detect_internals_tl { \token_to_str:N : }
-          \tl_if_empty:NF \l__codedoc_detect_internals_tl
+          \__codedoc_if_detect_internals_ok:NF \l__codedoc_detect_internals_tl
             {
-              \str_if_eq:NNF \l__codedoc_detect_internals_tl \g__codedoc_module_name_tl
-                {
-                  \bool_lazy_and:nnF
-                    { \g__codedoc_kernel_bool }
-                    {
-                      \str_if_eq_x_p:nn
-                        { \tl_to_str:N \l__codedoc_detect_internals_tl }
-                        { kernel }
-                    }
-                    {
-                      \msg_warning:nnxxx { l3doc } { foreign-internal }
-                        { \tl_to_str:N \l__codedoc_detect_internals_cs_tl }
-                        { \tl_to_str:N \l__codedoc_detect_internals_tl }
-                        { \tl_to_str:N \g__codedoc_module_name_tl }
-                    }
-                }
+              \tl_set_eq:NN \l__codedoc_detect_internals_cs_tl \l__codedoc_detect_internals_tl
+              \__codedoc_trim_right:Nn \l__codedoc_detect_internals_tl _
+              \__codedoc_trim_right:Nn \l__codedoc_detect_internals_tl :
+              \__codedoc_trim_right:No \l__codedoc_detect_internals_tl { \token_to_str:N : }
+              \msg_warning:nnxxx { l3doc } { foreign-internal }
+                { \tl_to_str:N \l__codedoc_detect_internals_cs_tl }
+                { \tl_to_str:N \l__codedoc_detect_internals_tl }
+                { \tl_to_str:N \g__codedoc_module_name_tl }
             }
         }
     }
 \group_end:
+\prg_new_protected_conditional:Npnn \__codedoc_if_detect_internals_ok:N #1 { F }
+  {
+    \__codedoc_str_if_begin:ooTF {#1} { \g__codedoc_module_name_tl _ }
+      { \prg_return_true: }
+      {
+        \__codedoc_str_if_begin:ooTF {#1} { \g__codedoc_module_name_tl : }
+          { \prg_return_true: }
+          {
+            \bool_if:NTF \g__codedoc_kernel_bool
+              {
+                \__codedoc_str_if_begin:ooTF {#1} { kernel _ }
+                  { \prg_return_true: }
+                  { \prg_return_false: }
+              }
+              { \prg_return_false: }
+          }
+      }
+  }
 \cs_new:Npn \__codedoc_signature_base_form:n #1
   { \__codedoc_signature_base_form_aux:n #1 \q_stop }
 \cs_new:Npn \__codedoc_signature_base_form_aux:n #1

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3docstrip.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3docstrip.tex	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3docstrip.tex	2018-02-23 21:54:14 UTC (rev 46720)
@@ -6,7 +6,7 @@
 %%
 %% l3docstrip.dtx  (with options: `program')
 %% 
-%% Copyright (C) 1990-2017 The LaTeX3 Project
+%% Copyright (C) 1990-2018 The LaTeX3 Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvipdfmx.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvipdfmx.def	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvipdfmx.def	2018-02-23 21:54:14 UTC (rev 46720)
@@ -6,7 +6,7 @@
 %%
 %% l3drivers.dtx  (with options: `package,dvipdfmx')
 %% 
-%% Copyright (C) 1990-2017 The LaTeX3 Project
+%% Copyright (C) 1990-2018 The LaTeX3 Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -22,12 +22,12 @@
 \ProvidesExplFile
   {l3dvidpfmx.def}{2017/03/18}{}
   {L3 Experimental driver: dvipdfmx}
-\cs_new_protected:Npn \__driver_color_pickup:N #1 { }
+\cs_new_protected:Npn \driver_color_pickup:N #1 { }
 \AtBeginDocument
   {
     \@ifpackageloaded { color }
       {
-        \cs_set_protected:Npn \__driver_color_pickup:N #1
+        \cs_set_protected:Npn \driver_color_pickup:N #1
           {
             \exp_args:NV \tl_if_head_is_space:nTF \current at color
               {
@@ -37,31 +37,24 @@
                      \exp_after:wN \use:n \current at color \c_space_tl 1
                    }
               }
-              { \exp_after:wN \__driver_color_pickup_aux:w \current at color \q_stop #1 }
+              { \exp_after:wN \__driver_color_pickup:w \current at color \q_stop #1 }
           }
-        \cs_new_protected:Npn \__driver_color_pickup_aux:w #1 ~ #2 \q_stop #3
+        \cs_new_protected:Npn \__driver_color_pickup:w #1 ~ #2 \q_stop #3
           { \tl_set:Nn #3 { #1 ~ #2 } }
       }
       { }
   }
+\cs_new_protected:Npn \driver_color_cmyk:nnnn #1#2#3#4
+  { \__driver_color_select:n { cmyk~ #1 ~ #2 ~ #3 ~ #4 } }
+\cs_new_protected:Npn \driver_color_gray:n #1
+  { \__driver_color_select:n { gray~ #1 } }
+\cs_new_protected:Npn \driver_color_rgb:nnn #1#2#3
+  { \__driver_color_select:n { rgb~ #1 ~ #2 ~ #3 } }
+\cs_new_protected:Npn \driver_color_spot:nn #1#2
+  { \__driver_color_select:n { color~push~\c_space_tl #1 } }
 \cs_new_protected:Npn \__driver_color_select:n #1
-  {
-    \tex_special:D
-      {
-        color~push~
-        \cs_if_exist_use:cF
-          { __driver_color_convert_ \__driver_convert_model:w #1 \q_stop :n }
-          { \use:n }
-            {#1}
-      }
-  }
-\cs_generate_variant:Nn \__driver_color_select:n { V }
-\cs_new:Npn \__driver_convert_model:w #1 ~ #2 \q_stop {#1}
-\cs_new:Npn \__driver_color_convert_spot:n #1
-  { \__driver_color_convert_spot:w #1 \q_stop }
-\cs_new:Npn \__driver_color_convert_spot:w #1 ~ #2 ~ #3 \q_stop
-  { \c_space_tl #2 }
-\cs_new_protected:Npn \__driver_color_reset:
+  { \tex_special:D { color~push~ #1 } }
+\cs_new_protected:Npn \driver_color_reset:
   { \tex_special:D { color~pop } }
 \cs_new_protected:Npn \__driver_literal:n #1
   { \tex_special:D { pdf:literal~ #1 } }
@@ -276,7 +269,7 @@
       { \dim_to_decimal_in_bp:n {#1} ~ w }
   }
 \cs_new_protected:Npn \driver_draw_miterlimit:n #1
-  { \__driver_draw_literal:x { \fp_eval:n {#1} ~ M } }
+  { \__driver_draw_literal:x { #1 ~ M } }
 \cs_new_protected:Npn \driver_draw_cap_butt:
   { \__driver_draw_literal:n { 0 ~ J } }
 \cs_new_protected:Npn \driver_draw_cap_round:
@@ -291,82 +284,35 @@
   { \__driver_draw_literal:n { 2 ~ j } }
 \cs_new_protected:Npn \driver_draw_color_cmyk:nnnn #1#2#3#4
   {
-    \use:x
-      {
-        \__driver_draw_color_cmyk_aux:nnnn
-          { \fp_eval:n {#1} }
-          { \fp_eval:n {#2} }
-          { \fp_eval:n {#3} }
-          { \fp_eval:n {#4} }
-      }
-  }
-\cs_new_protected:Npn \__driver_draw_color_cmyk_aux:nnnn #1#2#3#4
-  {
     \__driver_draw_literal:n
       { #1 ~ #2 ~ #3 ~ #4 ~ k ~ #1 ~ #2 ~ #3 ~ #4 ~ K }
   }
 \cs_new_protected:Npn \driver_draw_fill_cmyk:nnnn #1#2#3#4
   {
-    \__driver_draw_literal:x
-      {
-        \fp_eval:n {#1} ~ \fp_eval:n {#2} ~
-        \fp_eval:n {#3} ~ \fp_eval:n {#4} ~
-        k
-      }
+    \__driver_draw_literal:n { #1 ~ #2 ~ #3 ~ #4 ~ k }
   }
 \cs_new_protected:Npn \driver_draw_stroke_cmyk:nnnn #1#2#3#4
-  {
-    \__driver_draw_literal:x
-      {
-        \fp_eval:n {#1} ~ \fp_eval:n {#2} ~
-        \fp_eval:n {#3} ~ \fp_eval:n {#4} ~
-        K
-      }
-  }
+  { \__driver_draw_literal:n { #1 ~ #2 ~ #3 ~ #4 ~ K } }
 \cs_new_protected:Npn \driver_draw_color_gray:n #1
-  {
-    \use:x
-      { \__driver_draw_color_gray_aux:n { \fp_eval:n {#1} } }
-  }
-\cs_new_protected:Npn \__driver_draw_color_gray_aux:n #1
-  {
-    \__driver_draw_literal:n { #1 ~ g ~ #1 ~ G }
-  }
+  { \__driver_draw_literal:n { #1 ~ g ~ #1 ~ G } }
 \cs_new_protected:Npn \driver_draw_fill_gray:n #1
-  { \__driver_draw_literal:x { \fp_eval:n {#1} ~ g } }
+  { \__driver_draw_literal:n { #1 ~ g } }
 \cs_new_protected:Npn \driver_draw_stroke_gray:n #1
-  { \__driver_draw_literal:x { \fp_eval:n {#1} ~ G } }
+  { \__driver_draw_literal:n { #1 ~ G } }
 \cs_new_protected:Npn \driver_draw_color_rgb:nnn #1#2#3
   {
-    \use:x
-      {
-        \__driver_draw_color_rgb_aux:nnn
-          { \fp_eval:n {#1} }
-          { \fp_eval:n {#2} }
-          { \fp_eval:n {#3} }
-      }
-  }
-\cs_new_protected:Npn \__driver_draw_color_rgb_aux:nnn #1#2#3
-  {
     \__driver_draw_literal:n
       { #1 ~ #2 ~ #3 ~ rg ~ #1 ~ #2 ~ #3 ~ RG }
   }
 \cs_new_protected:Npn \driver_draw_fill_rgb:nnn #1#2#3
-  {
-    \__driver_draw_literal:x
-      { \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} ~ rg }
-  }
+  { \__driver_draw_literal:n { #1 ~ #2 ~ #3 ~ rg } }
 \cs_new_protected:Npn \driver_draw_stroke_rgb:nnn #1#2#3
-  {
-    \__driver_draw_literal:x
-      { \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} ~ RG }
-  }
+  { \__driver_draw_literal:n { #1 ~ #2 ~ #3 ~ RG } }
 \cs_new_protected:Npn \driver_draw_transformcm:nnnnnn #1#2#3#4#5#6
   {
     \__driver_draw_literal:x
       {
-        \fp_eval:n {#1} ~ \fp_eval:n {#2} ~
-        \fp_eval:n {#3} ~ \fp_eval:n {#4} ~
+        #1 ~ #2 ~ #3 ~ #4 ~
         \dim_to_decimal_in_bp:n {#5} ~ \dim_to_decimal_in_bp:n {#6} ~
         cm
       }

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvips.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvips.def	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvips.def	2018-02-23 21:54:14 UTC (rev 46720)
@@ -6,7 +6,7 @@
 %%
 %% l3drivers.dtx  (with options: `package,dvips')
 %% 
-%% Copyright (C) 1990-2017 The LaTeX3 Project
+%% Copyright (C) 1990-2018 The LaTeX3 Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -22,12 +22,12 @@
 \ProvidesExplFile
   {l3dvips.def}{2017/03/18}{}
   {L3 Experimental driver: dvips}
-\cs_new_protected:Npn \__driver_color_pickup:N #1 { }
+\cs_new_protected:Npn \driver_color_pickup:N #1 { }
 \AtBeginDocument
   {
     \@ifpackageloaded { color }
       {
-        \cs_set_protected:Npn \__driver_color_pickup:N #1
+        \cs_set_protected:Npn \driver_color_pickup:N #1
           {
             \exp_args:NV \tl_if_head_is_space:nTF \current at color
               {
@@ -37,31 +37,24 @@
                      \exp_after:wN \use:n \current at color \c_space_tl 1
                    }
               }
-              { \exp_after:wN \__driver_color_pickup_aux:w \current at color \q_stop #1 }
+              { \exp_after:wN \__driver_color_pickup:w \current at color \q_stop #1 }
           }
-        \cs_new_protected:Npn \__driver_color_pickup_aux:w #1 ~ #2 \q_stop #3
+        \cs_new_protected:Npn \__driver_color_pickup:w #1 ~ #2 \q_stop #3
           { \tl_set:Nn #3 { #1 ~ #2 } }
       }
       { }
   }
+\cs_new_protected:Npn \driver_color_cmyk:nnnn #1#2#3#4
+  { \__driver_color_select:n { cmyk~ #1 ~ #2 ~ #3 ~ #4 } }
+\cs_new_protected:Npn \driver_color_gray:n #1
+  { \__driver_color_select:n { gray~ #1 } }
+\cs_new_protected:Npn \driver_color_rgb:nnn #1#2#3
+  { \__driver_color_select:n { rgb~ #1 ~ #2 ~ #3 } }
+\cs_new_protected:Npn \driver_color_spot:nn #1#2
+  { \__driver_color_select:n { color~push~\c_space_tl #1 } }
 \cs_new_protected:Npn \__driver_color_select:n #1
-  {
-    \tex_special:D
-      {
-        color~push~
-        \cs_if_exist_use:cF
-          { __driver_color_convert_ \__driver_convert_model:w #1 \q_stop :n }
-          { \use:n }
-            {#1}
-      }
-  }
-\cs_generate_variant:Nn \__driver_color_select:n { V }
-\cs_new:Npn \__driver_convert_model:w #1 ~ #2 \q_stop {#1}
-\cs_new:Npn \__driver_color_convert_spot:n #1
-  { \__driver_color_convert_spot:w #1 \q_stop }
-\cs_new:Npn \__driver_color_convert_spot:w #1 ~ #2 ~ #3 \q_stop
-  { \c_space_tl #2 }
-\cs_new_protected:Npn \__driver_color_reset:
+  { \tex_special:D { color~push~ #1 } }
+\cs_new_protected:Npn \driver_color_reset:
   { \tex_special:D { color~pop } }
 \cs_new_protected:Npn \__driver_literal:n #1
   {
@@ -288,7 +281,7 @@
       { \dim_to_decimal_in_bp:n {#1} ~ setlinewidth }
   }
 \cs_new_protected:Npn \driver_draw_miterlimit:n #1
-  { \__driver_draw_literal:x { \fp_eval:n {#1} ~ setmiterlimit } }
+  { \__driver_draw_literal:n { #1 ~ setmiterlimit } }
 \cs_new_protected:Npn \driver_draw_cap_butt:
   { \__driver_draw_literal:n { 0 ~ setlinecap } }
 \cs_new_protected:Npn \driver_draw_cap_round:
@@ -308,81 +301,42 @@
   }
 \cs_new_protected:Npn \driver_draw_color_cmyk:nnnn #1#2#3#4
   {
-    \__driver_draw_literal:x
-      {
-        \fp_eval:n {#1} ~ \fp_eval:n {#2} ~
-        \fp_eval:n {#3} ~ \fp_eval:n {#4} ~
-        setcmykcolor ~
-      }
+    \__driver_draw_literal:n { #1 ~ #2 ~ #3 ~ #4 ~ setcmykcolor }
     \__driver_draw_color_reset:
   }
 \cs_new_protected:Npn \driver_draw_fill_cmyk:nnnn #1#2#3#4
   {
-    \__driver_draw_literal:x
-      {
-        /l3fc ~
-          {
-            \fp_eval:n {#1} ~ \fp_eval:n {#2} ~
-            \fp_eval:n {#3} ~ \fp_eval:n {#4} ~
-            setcmykcolor
-          } ~
-        def
-      }
+    \__driver_draw_literal:n
+      { /l3fc ~ { #1 ~ #2 ~ #3 ~ #4 ~ setcmykcolor ~ } ~ def }
   }
 \cs_new_protected:Npn \driver_draw_stroke_cmyk:nnnn #1#2#3#4
   {
-    \__driver_draw_literal:x
-      {
-        /l3sc ~
-          {
-            \fp_eval:n {#1} ~ \fp_eval:n {#2} ~
-            \fp_eval:n {#3} ~ \fp_eval:n {#4} ~
-            setcmykcolor
-          } ~
-        def
-      }
+    \__driver_draw_literal:n
+      { /l3sc ~ { #1 ~ #2 ~ #3 ~ #4 ~ setcmykcolor ~ } ~ def }
   }
 \cs_new_protected:Npn \driver_draw_color_gray:n #1
   {
-    \__driver_draw_literal:x { fp_eval:n {#1} ~ setgray  }
+    \__driver_draw_literal:n { #1 ~ setgray  }
     \__driver_draw_color_reset:
   }
 \cs_new_protected:Npn \driver_draw_fill_gray:n #1
-  { \__driver_draw_literal:x { /l3fc ~ { \fp_eval:n {#1} ~ setgray } ~ def } }
+  { \__driver_draw_literal:n { /l3fc ~ { #1 ~ setgray } ~ def } }
 \cs_new_protected:Npn \driver_draw_stroke_gray:n #1
-  { \__driver_draw_literal:x { /l3sc ~ { \fp_eval:n {#1} ~ setgray } ~ def } }
+  { \__driver_draw_literal:n { /l3sc ~ { #1 ~ setgray } ~ def } }
 \cs_new_protected:Npn \driver_draw_color_rgb:nnn #1#2#3
   {
-    \__driver_draw_literal:x
-      {
-        \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} ~
-        setrgbcolor
-      }
+    \__driver_draw_literal:n { #1 ~ #2 ~ #3 ~ setrgbcolor }
     \__driver_draw_color_reset:
   }
 \cs_new_protected:Npn \driver_draw_fill_rgb:nnn #1#2#3
   {
-    \__driver_draw_literal:x
-      {
-        /l3fc ~
-          {
-            \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} ~
-            setrgbcolor
-          } ~
-        def
-      }
+    \__driver_draw_literal:n
+      { /l3fc ~ { #1 ~ #2 ~ #3 ~ setrgbcolor } ~ def }
   }
 \cs_new_protected:Npn \driver_draw_stroke_rgb:nnn #1#2#3
   {
-    \__driver_draw_literal:x
-      {
-        /l3sc ~
-          {
-            \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} ~
-            setrgbcolor
-          } ~
-        def
-      }
+    \__driver_draw_literal:n
+      { /l3sc ~ { #1 ~ #2 ~ #3 ~ setrgbcolor } ~ def }
   }
 \cs_new_protected:Npn \driver_draw_transformcm:nnnnnn #1#2#3#4#5#6
   {
@@ -389,8 +343,7 @@
     \__driver_draw_literal:x
       {
         [
-          \fp_eval:n {#1} ~ \fp_eval:n {#2} ~
-          \fp_eval:n {#3} ~ \fp_eval:n {#4} ~
+          #1 ~ #2 ~ #3 ~ #4 ~
           \dim_to_decimal_in_bp:n {#5} ~ \dim_to_decimal_in_bp:n {#6} ~
         ] ~
         concat

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvisvgm.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvisvgm.def	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvisvgm.def	2018-02-23 21:54:14 UTC (rev 46720)
@@ -6,7 +6,7 @@
 %%
 %% l3drivers.dtx  (with options: `package,dvisvgm')
 %% 
-%% Copyright (C) 1990-2017 The LaTeX3 Project
+%% Copyright (C) 1990-2018 The LaTeX3 Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -22,12 +22,12 @@
 \ProvidesExplFile
   {l3dvisvgm.def}{2017/03/18}{}
   {L3 Experimental driver: dvisvgm}
-\cs_new_protected:Npn \__driver_color_pickup:N #1 { }
+\cs_new_protected:Npn \driver_color_pickup:N #1 { }
 \AtBeginDocument
   {
     \@ifpackageloaded { color }
       {
-        \cs_set_protected:Npn \__driver_color_pickup:N #1
+        \cs_set_protected:Npn \driver_color_pickup:N #1
           {
             \exp_args:NV \tl_if_head_is_space:nTF \current at color
               {
@@ -37,31 +37,24 @@
                      \exp_after:wN \use:n \current at color \c_space_tl 1
                    }
               }
-              { \exp_after:wN \__driver_color_pickup_aux:w \current at color \q_stop #1 }
+              { \exp_after:wN \__driver_color_pickup:w \current at color \q_stop #1 }
           }
-        \cs_new_protected:Npn \__driver_color_pickup_aux:w #1 ~ #2 \q_stop #3
+        \cs_new_protected:Npn \__driver_color_pickup:w #1 ~ #2 \q_stop #3
           { \tl_set:Nn #3 { #1 ~ #2 } }
       }
       { }
   }
+\cs_new_protected:Npn \driver_color_cmyk:nnnn #1#2#3#4
+  { \__driver_color_select:n { cmyk~ #1 ~ #2 ~ #3 ~ #4 } }
+\cs_new_protected:Npn \driver_color_gray:n #1
+  { \__driver_color_select:n { gray~ #1 } }
+\cs_new_protected:Npn \driver_color_rgb:nnn #1#2#3
+  { \__driver_color_select:n { rgb~ #1 ~ #2 ~ #3 } }
+\cs_new_protected:Npn \driver_color_spot:nn #1#2
+  { \__driver_color_select:n { color~push~\c_space_tl #1 } }
 \cs_new_protected:Npn \__driver_color_select:n #1
-  {
-    \tex_special:D
-      {
-        color~push~
-        \cs_if_exist_use:cF
-          { __driver_color_convert_ \__driver_convert_model:w #1 \q_stop :n }
-          { \use:n }
-            {#1}
-      }
-  }
-\cs_generate_variant:Nn \__driver_color_select:n { V }
-\cs_new:Npn \__driver_convert_model:w #1 ~ #2 \q_stop {#1}
-\cs_new:Npn \__driver_color_convert_spot:n #1
-  { \__driver_color_convert_spot:w #1 \q_stop }
-\cs_new:Npn \__driver_color_convert_spot:w #1 ~ #2 ~ #3 \q_stop
-  { \c_space_tl #2 }
-\cs_new_protected:Npn \__driver_color_reset:
+  { \tex_special:D { color~push~ #1 } }
+\cs_new_protected:Npn \driver_color_reset:
   { \tex_special:D { color~pop } }
 \cs_new_protected:Npn \__driver_literal:n #1
   { \tex_special:D { dvisvgm:raw~ #1 { ?nl } } }
@@ -343,7 +336,7 @@
 \cs_new_protected:Npn \driver_draw_linewidth:n #1
   { \__driver_draw_scope:x { stroke-width=" \dim_to_decimal:n {#1} " } }
 \cs_new_protected:Npn \driver_draw_miterlimit:n #1
-  { \__driver_draw_scope:x { stroke-miterlimit=" \fp_eval:n {#1} " } }
+  { \__driver_draw_scope:x { stroke-miterlimit=" #1 " } }
 \cs_new_protected:Npn \driver_draw_cap_butt:
   { \__driver_draw_scope:n { stroke-linecap="butt" } }
 \cs_new_protected:Npn \driver_draw_cap_round:

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3expan.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3expan.sty	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3expan.sty	2018-02-23 21:54:14 UTC (rev 46720)
@@ -6,7 +6,7 @@
 %%
 %% l3oldmodules.dtx  (with options: `l3expan,oldmodules')
 %% 
-%% Copyright (C) 1990-2017 The LaTeX3 Project
+%% Copyright (C) 1990-2018 The LaTeX3 Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -18,7 +18,7 @@
 %% This file is part of the "l3kernel bundle" (The Work in LPPL)
 %% and all files in that bundle must be distributed together.
 %% 
-%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project
+%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project
 \def\old at liii@module at name
 {l3expan}
 \ProvidesPackage\old at liii@module at name

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3file.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3file.sty	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3file.sty	2018-02-23 21:54:14 UTC (rev 46720)
@@ -6,7 +6,7 @@
 %%
 %% l3oldmodules.dtx  (with options: `l3file,oldmodules')
 %% 
-%% Copyright (C) 1990-2017 The LaTeX3 Project
+%% Copyright (C) 1990-2018 The LaTeX3 Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -18,7 +18,7 @@
 %% This file is part of the "l3kernel bundle" (The Work in LPPL)
 %% and all files in that bundle must be distributed together.
 %% 
-%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project
+%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project
 \def\old at liii@module at name
 {l3file}
 \ProvidesPackage\old at liii@module at name

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3fp.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3fp.sty	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3fp.sty	2018-02-23 21:54:14 UTC (rev 46720)
@@ -6,7 +6,7 @@
 %%
 %% l3oldmodules.dtx  (with options: `l3fp,oldmodules')
 %% 
-%% Copyright (C) 1990-2017 The LaTeX3 Project
+%% Copyright (C) 1990-2018 The LaTeX3 Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -18,7 +18,7 @@
 %% This file is part of the "l3kernel bundle" (The Work in LPPL)
 %% and all files in that bundle must be distributed together.
 %% 
-%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project
+%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project
 \def\old at liii@module at name
 {l3fp}
 \ProvidesPackage\old at liii@module at name

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3int.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3int.sty	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3int.sty	2018-02-23 21:54:14 UTC (rev 46720)
@@ -6,7 +6,7 @@
 %%
 %% l3oldmodules.dtx  (with options: `l3int,oldmodules')
 %% 
-%% Copyright (C) 1990-2017 The LaTeX3 Project
+%% Copyright (C) 1990-2018 The LaTeX3 Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -18,7 +18,7 @@
 %% This file is part of the "l3kernel bundle" (The Work in LPPL)
 %% and all files in that bundle must be distributed together.
 %% 
-%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project
+%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project
 \def\old at liii@module at name
 {l3int}
 \ProvidesPackage\old at liii@module at name

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3keys.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3keys.sty	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3keys.sty	2018-02-23 21:54:14 UTC (rev 46720)
@@ -6,7 +6,7 @@
 %%
 %% l3oldmodules.dtx  (with options: `l3keys,oldmodules')
 %% 
-%% Copyright (C) 1990-2017 The LaTeX3 Project
+%% Copyright (C) 1990-2018 The LaTeX3 Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -18,7 +18,7 @@
 %% This file is part of the "l3kernel bundle" (The Work in LPPL)
 %% and all files in that bundle must be distributed together.
 %% 
-%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project
+%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project
 \def\old at liii@module at name
 {l3keys}
 \ProvidesPackage\old at liii@module at name

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3msg.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3msg.sty	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3msg.sty	2018-02-23 21:54:14 UTC (rev 46720)
@@ -6,7 +6,7 @@
 %%
 %% l3oldmodules.dtx  (with options: `l3msg,oldmodules')
 %% 
-%% Copyright (C) 1990-2017 The LaTeX3 Project
+%% Copyright (C) 1990-2018 The LaTeX3 Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -18,7 +18,7 @@
 %% This file is part of the "l3kernel bundle" (The Work in LPPL)
 %% and all files in that bundle must be distributed together.
 %% 
-%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project
+%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project
 \def\old at liii@module at name
 {l3msg}
 \ProvidesPackage\old at liii@module at name

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3names.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3names.sty	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3names.sty	2018-02-23 21:54:14 UTC (rev 46720)
@@ -6,7 +6,7 @@
 %%
 %% l3oldmodules.dtx  (with options: `l3names,oldmodules')
 %% 
-%% Copyright (C) 1990-2017 The LaTeX3 Project
+%% Copyright (C) 1990-2018 The LaTeX3 Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -18,7 +18,7 @@
 %% This file is part of the "l3kernel bundle" (The Work in LPPL)
 %% and all files in that bundle must be distributed together.
 %% 
-%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project
+%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project
 \def\old at liii@module at name
 {l3names}
 \ProvidesPackage\old at liii@module at name

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def	2018-02-23 21:54:14 UTC (rev 46720)
@@ -6,7 +6,7 @@
 %%
 %% l3drivers.dtx  (with options: `package,pdfmode')
 %% 
-%% Copyright (C) 1990-2017 The LaTeX3 Project
+%% Copyright (C) 1990-2018 The LaTeX3 Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -22,17 +22,17 @@
 \ProvidesExplFile
   {l3pdfmode.def}{2017/03/18}{}
   {L3 Experimental driver: PDF mode}
-\cs_new_protected:Npn \__driver_color_pickup:N #1 { }
+\cs_new_protected:Npn \driver_color_pickup:N #1 { }
 \AtBeginDocument
   {
     \@ifpackageloaded { color }
       {
-        \cs_set_protected:Npn \__driver_color_pickup:N #1
+        \cs_set_protected:Npn \driver_color_pickup:N #1
           {
-            \exp_last_unbraced:Nx \__driver_color_pickup_aux:w
+            \exp_last_unbraced:Nx \__driver_color_pickup:w
               { \current at color } ~ 0 ~ 0 ~ 0 \q_stop #1
           }
-        \cs_new_protected:Npn \__driver_color_pickup_aux:w
+        \cs_new_protected:Npn \__driver_color_pickup:w
           #1 ~ #2 ~ #3 ~ #4 ~ #5 ~ #6 \q_stop #7
           {
             \str_if_eq:nnTF {#2} { g }
@@ -59,33 +59,23 @@
       { }
   }
 \int_new:N \l__driver_color_stack_int
+\cs_new_protected:Npn \driver_color_cmyk:nnnn #1#2#3#4
+  { \__driver_color_select:n { #1 ~ #2 ~ #3 ~ #4 ~ k ~ #1 ~ #2 ~ #3 ~ #4 ~ K } }
+\cs_new_protected:Npn \driver_color_gray:n #1
+  { \__driver_color_select:n { #1 ~ g ~ #1 ~ G } }
+\cs_new_protected:Npn \driver_color_rgb:nnn #1#2#3
+  { \__driver_color_select:n { #1 ~ #2 ~ #3 ~ rg ~ #1 ~ #2 ~ #3 ~ RG } }
+\cs_new_protected:Npn \driver_color_spot:nn #1#2
+  { \__driver_color_select:n { /#1 ~ cs ~ /#1 ~ CS ~ #2 ~ sc ~ #2 ~ SC } }
 \cs_new_protected:Npx \__driver_color_select:n #1
   {
     \cs_if_exist:NTF \luatex_pdfextension:D
       { \luatex_pdfextension:D colorstack }
       { \pdftex_pdfcolorstack:D }
-        \exp_not:N \l__driver_color_stack_int push
-          {
-            \exp_not:N \__driver_color_convert:w
-            #1
-            \exp_not:N \q_stop
-          }
+        \exp_not:N \l__driver_color_stack_int push {#1}
   }
-\cs_generate_variant:Nn \__driver_color_select:n { V }
-\cs_new:Npn \__driver_color_convert:w #1 ~ #2 \q_stop
-  { \use:c { __driver_color_convert_ #1 :w } #2 \q_stop }
-\cs_new:Npn \__driver_color_convert_gray:w #1 \q_stop
-  { #1 ~ g ~ #1 ~ G }
-\cs_new:Npn \__driver_color_convert_cmyk:w #1 \q_stop
-  { #1 ~ k ~ #1 ~ K }
-\cs_new:Npn \__driver_color_convert_rgb:w #1 \q_stop
-  { #1 ~ rg ~ #1 ~ RG }
-\cs_new:Npn \__driver_color_convert_spot:w #1 ~ #2 \q_stop
+\cs_new_protected:Npx \driver_color_reset:
   {
-    /#1 ~ cs ~ /#1 ~ CS ~ #2 ~ sc ~ #2 ~ SC
-  }
-\cs_new_protected:Npx \__driver_color_reset:
-  {
     \cs_if_exist:NTF \luatex_pdfextension:D
       { \luatex_pdfextension:D colorstack }
       { \pdftex_pdfcolorstack:D }
@@ -323,7 +313,7 @@
       { \dim_to_decimal_in_bp:n {#1} ~ w }
   }
 \cs_new_protected:Npn \driver_draw_miterlimit:n #1
-  { \__driver_draw_literal:x { \fp_eval:n {#1} ~ M } }
+  { \__driver_draw_literal:x { #1 ~ M } }
 \cs_new_protected:Npn \driver_draw_cap_butt:
   { \__driver_draw_literal:n { 0 ~ J } }
 \cs_new_protected:Npn \driver_draw_cap_round:
@@ -338,82 +328,35 @@
   { \__driver_draw_literal:n { 2 ~ j } }
 \cs_new_protected:Npn \driver_draw_color_cmyk:nnnn #1#2#3#4
   {
-    \use:x
-      {
-        \__driver_draw_color_cmyk_aux:nnnn
-          { \fp_eval:n {#1} }
-          { \fp_eval:n {#2} }
-          { \fp_eval:n {#3} }
-          { \fp_eval:n {#4} }
-      }
-  }
-\cs_new_protected:Npn \__driver_draw_color_cmyk_aux:nnnn #1#2#3#4
-  {
     \__driver_draw_literal:n
       { #1 ~ #2 ~ #3 ~ #4 ~ k ~ #1 ~ #2 ~ #3 ~ #4 ~ K }
   }
 \cs_new_protected:Npn \driver_draw_fill_cmyk:nnnn #1#2#3#4
   {
-    \__driver_draw_literal:x
-      {
-        \fp_eval:n {#1} ~ \fp_eval:n {#2} ~
-        \fp_eval:n {#3} ~ \fp_eval:n {#4} ~
-        k
-      }
+    \__driver_draw_literal:n { #1 ~ #2 ~ #3 ~ #4 ~ k }
   }
 \cs_new_protected:Npn \driver_draw_stroke_cmyk:nnnn #1#2#3#4
-  {
-    \__driver_draw_literal:x
-      {
-        \fp_eval:n {#1} ~ \fp_eval:n {#2} ~
-        \fp_eval:n {#3} ~ \fp_eval:n {#4} ~
-        K
-      }
-  }
+  { \__driver_draw_literal:n { #1 ~ #2 ~ #3 ~ #4 ~ K } }
 \cs_new_protected:Npn \driver_draw_color_gray:n #1
-  {
-    \use:x
-      { \__driver_draw_color_gray_aux:n { \fp_eval:n {#1} } }
-  }
-\cs_new_protected:Npn \__driver_draw_color_gray_aux:n #1
-  {
-    \__driver_draw_literal:n { #1 ~ g ~ #1 ~ G }
-  }
+  { \__driver_draw_literal:n { #1 ~ g ~ #1 ~ G } }
 \cs_new_protected:Npn \driver_draw_fill_gray:n #1
-  { \__driver_draw_literal:x { \fp_eval:n {#1} ~ g } }
+  { \__driver_draw_literal:n { #1 ~ g } }
 \cs_new_protected:Npn \driver_draw_stroke_gray:n #1
-  { \__driver_draw_literal:x { \fp_eval:n {#1} ~ G } }
+  { \__driver_draw_literal:n { #1 ~ G } }
 \cs_new_protected:Npn \driver_draw_color_rgb:nnn #1#2#3
   {
-    \use:x
-      {
-        \__driver_draw_color_rgb_aux:nnn
-          { \fp_eval:n {#1} }
-          { \fp_eval:n {#2} }
-          { \fp_eval:n {#3} }
-      }
-  }
-\cs_new_protected:Npn \__driver_draw_color_rgb_aux:nnn #1#2#3
-  {
     \__driver_draw_literal:n
       { #1 ~ #2 ~ #3 ~ rg ~ #1 ~ #2 ~ #3 ~ RG }
   }
 \cs_new_protected:Npn \driver_draw_fill_rgb:nnn #1#2#3
-  {
-    \__driver_draw_literal:x
-      { \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} ~ rg }
-  }
+  { \__driver_draw_literal:n { #1 ~ #2 ~ #3 ~ rg } }
 \cs_new_protected:Npn \driver_draw_stroke_rgb:nnn #1#2#3
-  {
-    \__driver_draw_literal:x
-      { \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} ~ RG }
-  }
+  { \__driver_draw_literal:n { #1 ~ #2 ~ #3 ~ RG } }
 \cs_new_protected:Npn \driver_draw_transformcm:nnnnnn #1#2#3#4#5#6
   {
     \__driver_draw_literal:x
       {
-        \fp_eval:n {#1} ~ \fp_eval:n {#2} ~
-        \fp_eval:n {#3} ~ \fp_eval:n {#4} ~
+        #1 ~ #2 ~ #3 ~ #4 ~
         \dim_to_decimal_in_bp:n {#5} ~ \dim_to_decimal_in_bp:n {#6} ~
         cm
       }

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3prg.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3prg.sty	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3prg.sty	2018-02-23 21:54:14 UTC (rev 46720)
@@ -6,7 +6,7 @@
 %%
 %% l3oldmodules.dtx  (with options: `l3prg,oldmodules')
 %% 
-%% Copyright (C) 1990-2017 The LaTeX3 Project
+%% Copyright (C) 1990-2018 The LaTeX3 Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -18,7 +18,7 @@
 %% This file is part of the "l3kernel bundle" (The Work in LPPL)
 %% and all files in that bundle must be distributed together.
 %% 
-%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project
+%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project
 \def\old at liii@module at name
 {l3prg}
 \ProvidesPackage\old at liii@module at name

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3prop.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3prop.sty	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3prop.sty	2018-02-23 21:54:14 UTC (rev 46720)
@@ -6,7 +6,7 @@
 %%
 %% l3oldmodules.dtx  (with options: `l3prop,oldmodules')
 %% 
-%% Copyright (C) 1990-2017 The LaTeX3 Project
+%% Copyright (C) 1990-2018 The LaTeX3 Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -18,7 +18,7 @@
 %% This file is part of the "l3kernel bundle" (The Work in LPPL)
 %% and all files in that bundle must be distributed together.
 %% 
-%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project
+%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project
 \def\old at liii@module at name
 {l3prop}
 \ProvidesPackage\old at liii@module at name

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3quark.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3quark.sty	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3quark.sty	2018-02-23 21:54:14 UTC (rev 46720)
@@ -6,7 +6,7 @@
 %%
 %% l3oldmodules.dtx  (with options: `l3quark,oldmodules')
 %% 
-%% Copyright (C) 1990-2017 The LaTeX3 Project
+%% Copyright (C) 1990-2018 The LaTeX3 Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -18,7 +18,7 @@
 %% This file is part of the "l3kernel bundle" (The Work in LPPL)
 %% and all files in that bundle must be distributed together.
 %% 
-%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project
+%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project
 \def\old at liii@module at name
 {l3quark}
 \ProvidesPackage\old at liii@module at name

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3regex.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3regex.sty	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3regex.sty	2018-02-23 21:54:14 UTC (rev 46720)
@@ -6,7 +6,7 @@
 %%
 %% l3oldmodules.dtx  (with options: `l3regex,oldmodules')
 %% 
-%% Copyright (C) 1990-2017 The LaTeX3 Project
+%% Copyright (C) 1990-2018 The LaTeX3 Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -18,7 +18,7 @@
 %% This file is part of the "l3kernel bundle" (The Work in LPPL)
 %% and all files in that bundle must be distributed together.
 %% 
-%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project
+%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project
 \def\old at liii@module at name
 {l3regex}
 \ProvidesPackage\old at liii@module at name

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3seq.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3seq.sty	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3seq.sty	2018-02-23 21:54:14 UTC (rev 46720)
@@ -6,7 +6,7 @@
 %%
 %% l3oldmodules.dtx  (with options: `l3seq,oldmodules')
 %% 
-%% Copyright (C) 1990-2017 The LaTeX3 Project
+%% Copyright (C) 1990-2018 The LaTeX3 Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -18,7 +18,7 @@
 %% This file is part of the "l3kernel bundle" (The Work in LPPL)
 %% and all files in that bundle must be distributed together.
 %% 
-%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project
+%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project
 \def\old at liii@module at name
 {l3seq}
 \ProvidesPackage\old at liii@module at name

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3skip.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3skip.sty	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3skip.sty	2018-02-23 21:54:14 UTC (rev 46720)
@@ -6,7 +6,7 @@
 %%
 %% l3oldmodules.dtx  (with options: `l3skip,oldmodules')
 %% 
-%% Copyright (C) 1990-2017 The LaTeX3 Project
+%% Copyright (C) 1990-2018 The LaTeX3 Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -18,7 +18,7 @@
 %% This file is part of the "l3kernel bundle" (The Work in LPPL)
 %% and all files in that bundle must be distributed together.
 %% 
-%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project
+%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project
 \def\old at liii@module at name
 {l3skip}
 \ProvidesPackage\old at liii@module at name

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3sort.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3sort.sty	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3sort.sty	2018-02-23 21:54:14 UTC (rev 46720)
@@ -6,7 +6,7 @@
 %%
 %% l3oldmodules.dtx  (with options: `l3sort,oldmodules')
 %% 
-%% Copyright (C) 1990-2017 The LaTeX3 Project
+%% Copyright (C) 1990-2018 The LaTeX3 Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -18,7 +18,7 @@
 %% This file is part of the "l3kernel bundle" (The Work in LPPL)
 %% and all files in that bundle must be distributed together.
 %% 
-%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project
+%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project
 \def\old at liii@module at name
 {l3sort}
 \ProvidesPackage\old at liii@module at name

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3str.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3str.sty	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3str.sty	2018-02-23 21:54:14 UTC (rev 46720)
@@ -6,7 +6,7 @@
 %%
 %% l3oldmodules.dtx  (with options: `l3str,oldmodules')
 %% 
-%% Copyright (C) 1990-2017 The LaTeX3 Project
+%% Copyright (C) 1990-2018 The LaTeX3 Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -18,7 +18,7 @@
 %% This file is part of the "l3kernel bundle" (The Work in LPPL)
 %% and all files in that bundle must be distributed together.
 %% 
-%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project
+%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project
 \def\old at liii@module at name
 {l3str}
 \ProvidesPackage\old at liii@module at name

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3tl-analysis.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3tl-analysis.sty	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3tl-analysis.sty	2018-02-23 21:54:14 UTC (rev 46720)
@@ -6,7 +6,7 @@
 %%
 %% l3oldmodules.dtx  (with options: `l3tl-analysis,oldmodules')
 %% 
-%% Copyright (C) 1990-2017 The LaTeX3 Project
+%% Copyright (C) 1990-2018 The LaTeX3 Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -18,7 +18,7 @@
 %% This file is part of the "l3kernel bundle" (The Work in LPPL)
 %% and all files in that bundle must be distributed together.
 %% 
-%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project
+%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project
 \def\old at liii@module at name
 {l3tl-analysis}
 \ProvidesPackage\old at liii@module at name

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3tl-build.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3tl-build.sty	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3tl-build.sty	2018-02-23 21:54:14 UTC (rev 46720)
@@ -6,7 +6,7 @@
 %%
 %% l3oldmodules.dtx  (with options: `l3tl-build,oldmodules')
 %% 
-%% Copyright (C) 1990-2017 The LaTeX3 Project
+%% Copyright (C) 1990-2018 The LaTeX3 Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -18,7 +18,7 @@
 %% This file is part of the "l3kernel bundle" (The Work in LPPL)
 %% and all files in that bundle must be distributed together.
 %% 
-%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project
+%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project
 \def\old at liii@module at name
 {l3tl-build}
 \ProvidesPackage\old at liii@module at name

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3tl.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3tl.sty	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3tl.sty	2018-02-23 21:54:14 UTC (rev 46720)
@@ -6,7 +6,7 @@
 %%
 %% l3oldmodules.dtx  (with options: `l3tl,oldmodules')
 %% 
-%% Copyright (C) 1990-2017 The LaTeX3 Project
+%% Copyright (C) 1990-2018 The LaTeX3 Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -18,7 +18,7 @@
 %% This file is part of the "l3kernel bundle" (The Work in LPPL)
 %% and all files in that bundle must be distributed together.
 %% 
-%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project
+%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project
 \def\old at liii@module at name
 {l3tl}
 \ProvidesPackage\old at liii@module at name

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3token.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3token.sty	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3token.sty	2018-02-23 21:54:14 UTC (rev 46720)
@@ -6,7 +6,7 @@
 %%
 %% l3oldmodules.dtx  (with options: `l3token,oldmodules')
 %% 
-%% Copyright (C) 1990-2017 The LaTeX3 Project
+%% Copyright (C) 1990-2018 The LaTeX3 Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -18,7 +18,7 @@
 %% This file is part of the "l3kernel bundle" (The Work in LPPL)
 %% and all files in that bundle must be distributed together.
 %% 
-%% File: l3oldmodules.dtx Copyright (C) 2014-2017 The LaTeX3 Project
+%% File: l3oldmodules.dtx Copyright (C) 2014-2018 The LaTeX3 Project
 \def\old at liii@module at name
 {l3token}
 \ProvidesPackage\old at liii@module at name

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3xdvipdfmx.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3xdvipdfmx.def	2018-02-23 19:30:01 UTC (rev 46719)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3xdvipdfmx.def	2018-02-23 21:54:14 UTC (rev 46720)
@@ -6,7 +6,7 @@
 %%
 %% l3drivers.dtx  (with options: `package,xdvipdfmx')
 %% 
-%% Copyright (C) 1990-2017 The LaTeX3 Project
+%% Copyright (C) 1990-2018 The LaTeX3 Project
 %% 
 %% It may be distributed and/or modified under the conditions of
 %% the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -22,12 +22,12 @@
 \ProvidesExplFile
   {l3xdvidpfmx.def}{2017/03/18}{}
   {L3 Experimental driver: xdvipdfmx}
-\cs_new_protected:Npn \__driver_color_pickup:N #1 { }
+\cs_new_protected:Npn \driver_color_pickup:N #1 { }
 \AtBeginDocument
   {
     \@ifpackageloaded { color }
       {
-        \cs_set_protected:Npn \__driver_color_pickup:N #1
+        \cs_set_protected:Npn \driver_color_pickup:N #1
           {
             \exp_args:NV \tl_if_head_is_space:nTF \current at color
               {
@@ -37,31 +37,24 @@
                      \exp_after:wN \use:n \current at color \c_space_tl 1
                    }
               }
-              { \exp_after:wN \__driver_color_pickup_aux:w \current at color \q_stop #1 }
+              { \exp_after:wN \__driver_color_pickup:w \current at color \q_stop #1 }
           }
-        \cs_new_protected:Npn \__driver_color_pickup_aux:w #1 ~ #2 \q_stop #3
+        \cs_new_protected:Npn \__driver_color_pickup:w #1 ~ #2 \q_stop #3
           { \tl_set:Nn #3 { #1 ~ #2 } }
       }
       { }
   }
+\cs_new_protected:Npn \driver_color_cmyk:nnnn #1#2#3#4
+  { \__driver_color_select:n { cmyk~ #1 ~ #2 ~ #3 ~ #4 } }
+\cs_new_protected:Npn \driver_color_gray:n #1
+  { \__driver_color_select:n { gray~ #1 } }
+\cs_new_protected:Npn \driver_color_rgb:nnn #1#2#3
+  { \__driver_color_select:n { rgb~ #1 ~ #2 ~ #3 } }
+\cs_new_protected:Npn \driver_color_spot:nn #1#2
+  { \__driver_color_select:n { color~push~\c_space_tl #1 } }
 \cs_new_protected:Npn \__driver_color_select:n #1
-  {
-    \tex_special:D
-      {
-        color~push~
-        \cs_if_exist_use:cF
-          { __driver_color_convert_ \__driver_convert_model:w #1 \q_stop :n }
-          { \use:n }
-            {#1}
-      }
-  }
-\cs_generate_variant:Nn \__driver_color_select:n { V }
-\cs_new:Npn \__driver_convert_model:w #1 ~ #2 \q_stop {#1}
-\cs_new:Npn \__driver_color_convert_spot:n #1
-  { \__driver_color_convert_spot:w #1 \q_stop }
-\cs_new:Npn \__driver_color_convert_spot:w #1 ~ #2 ~ #3 \q_stop
-  { \c_space_tl #2 }
-\cs_new_protected:Npn \__driver_color_reset:
+  { \tex_special:D { color~push~ #1 } }
+\cs_new_protected:Npn \driver_color_reset:
   { \tex_special:D { color~pop } }
 \cs_new_protected:Npn \__driver_literal:n #1
   { \tex_special:D { pdf:literal~ #1 } }
@@ -319,7 +312,7 @@
       { \dim_to_decimal_in_bp:n {#1} ~ w }
   }
 \cs_new_protected:Npn \driver_draw_miterlimit:n #1
-  { \__driver_draw_literal:x { \fp_eval:n {#1} ~ M } }
+  { \__driver_draw_literal:x { #1 ~ M } }
 \cs_new_protected:Npn \driver_draw_cap_butt:
   { \__driver_draw_literal:n { 0 ~ J } }
 \cs_new_protected:Npn \driver_draw_cap_round:
@@ -334,82 +327,35 @@
   { \__driver_draw_literal:n { 2 ~ j } }
 \cs_new_protected:Npn \driver_draw_color_cmyk:nnnn #1#2#3#4
   {
-    \use:x
-      {
-        \__driver_draw_color_cmyk_aux:nnnn
-          { \fp_eval:n {#1} }
-          { \fp_eval:n {#2} }
-          { \fp_eval:n {#3} }
-          { \fp_eval:n {#4} }
-      }
-  }
-\cs_new_protected:Npn \__driver_draw_color_cmyk_aux:nnnn #1#2#3#4
-  {
     \__driver_draw_literal:n
       { #1 ~ #2 ~ #3 ~ #4 ~ k ~ #1 ~ #2 ~ #3 ~ #4 ~ K }
   }
 \cs_new_protected:Npn \driver_draw_fill_cmyk:nnnn #1#2#3#4
   {
-    \__driver_draw_literal:x
-      {
-        \fp_eval:n {#1} ~ \fp_eval:n {#2} ~
-        \fp_eval:n {#3} ~ \fp_eval:n {#4} ~
-        k
-      }
+    \__driver_draw_literal:n { #1 ~ #2 ~ #3 ~ #4 ~ k }
   }
 \cs_new_protected:Npn \driver_draw_stroke_cmyk:nnnn #1#2#3#4
-  {
-    \__driver_draw_literal:x
-      {
-        \fp_eval:n {#1} ~ \fp_eval:n {#2} ~
-        \fp_eval:n {#3} ~ \fp_eval:n {#4} ~
-        K
-      }
-  }
+  { \__driver_draw_literal:n { #1 ~ #2 ~ #3 ~ #4 ~ K } }
 \cs_new_protected:Npn \driver_draw_color_gray:n #1
-  {
-    \use:x
-      { \__driver_draw_color_gray_aux:n { \fp_eval:n {#1} } }
-  }
-\cs_new_protected:Npn \__driver_draw_color_gray_aux:n #1
-  {
-    \__driver_draw_literal:n { #1 ~ g ~ #1 ~ G }
-  }
+  { \__driver_draw_literal:n { #1 ~ g ~ #1 ~ G } }
 \cs_new_protected:Npn \driver_draw_fill_gray:n #1
-  { \__driver_draw_literal:x { \fp_eval:n {#1} ~ g } }
+  { \__driver_draw_literal:n { #1 ~ g } }
 \cs_new_protected:Npn \driver_draw_stroke_gray:n #1
-  { \__driver_draw_literal:x { \fp_eval:n {#1} ~ G } }
+  { \__driver_draw_literal:n { #1 ~ G } }
 \cs_new_protected:Npn \driver_draw_color_rgb:nnn #1#2#3
   {
-    \use:x
-      {
-        \__driver_draw_color_rgb_aux:nnn
-          { \fp_eval:n {#1} }
-          { \fp_eval:n {#2} }
-          { \fp_eval:n {#3} }
-      }
-  }
-\cs_new_protected:Npn \__driver_draw_color_rgb_aux:nnn #1#2#3
-  {
     \__driver_draw_literal:n
       { #1 ~ #2 ~ #3 ~ rg ~ #1 ~ #2 ~ #3 ~ RG }
   }
 \cs_new_protected:Npn \driver_draw_fill_rgb:nnn #1#2#3
-  {
-    \__driver_draw_literal:x
-      { \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} ~ rg }
-  }
+  { \__driver_draw_literal:n { #1 ~ #2 ~ #3 ~ rg } }
 \cs_new_protected:Npn \driver_draw_stroke_rgb:nnn #1#2#3
-  {
-    \__driver_draw_literal:x
-      { \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} ~ RG }
-  }
+  { \__driver_draw_literal:n { #1 ~ #2 ~ #3 ~ RG } }
 \cs_new_protected:Npn \driver_draw_transformcm:nnnnnn #1#2#3#4#5#6
   {
     \__driver_draw_literal:x
       {
-        \fp_eval:n {#1} ~ \fp_eval:n {#2} ~
-        \fp_eval:n {#3} ~ \fp_eval:n {#4} ~
+        #1 ~ #2 ~ #3 ~ #4 ~
         \dim_to_decimal_in_bp:n {#5} ~ \dim_to_decimal_in_bp:n {#6} ~
         cm
       }



More information about the tex-live-commits mailing list