texlive[46085] Master/texmf-dist: l3 (17dec17)

commits+karl at tug.org commits+karl at tug.org
Mon Dec 18 00:16:52 CET 2017


Revision: 46085
          http://tug.org/svn/texlive?view=revision&revision=46085
Author:   karl
Date:     2017-12-18 00:16:51 +0100 (Mon, 18 Dec 2017)
Log Message:
-----------
l3 (17dec17)

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/l3packages/README.md
    trunk/Master/texmf-dist/doc/latex/l3packages/l3keys2e/l3keys2e.pdf
    trunk/Master/texmf-dist/doc/latex/l3packages/xfp/xfp.pdf
    trunk/Master/texmf-dist/doc/latex/l3packages/xfrac/xfrac.pdf
    trunk/Master/texmf-dist/doc/latex/l3packages/xparse/xparse.pdf
    trunk/Master/texmf-dist/doc/latex/l3packages/xtemplate/xtemplate.pdf
    trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-convert.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3color.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3final.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3oldmodules.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx
    trunk/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx
    trunk/Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx
    trunk/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx
    trunk/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx
    trunk/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-convert.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty
    trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex
    trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex
    trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvipdfmx.def
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvips.def
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvisvgm.def
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3xdvipdfmx.def
    trunk/Master/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty
    trunk/Master/texmf-dist/tex/latex/l3packages/xfp/xfp.sty
    trunk/Master/texmf-dist/tex/latex/l3packages/xfrac/xfrac.sty
    trunk/Master/texmf-dist/tex/latex/l3packages/xparse/xparse.sty
    trunk/Master/texmf-dist/tex/latex/l3packages/xtemplate/xtemplate.sty

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3experimental/README.md	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/doc/latex/l3experimental/README.md	2017-12-17 23:16:51 UTC (rev 46085)
@@ -1,7 +1,7 @@
 Experimental LaTeX3 Concepts
 ============================
 
-Release 2017/12/05
+Release 2017/12/16
 
 Overview
 --------

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

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

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

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

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

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

Modified: trunk/Master/texmf-dist/doc/latex/l3packages/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3packages/README.md	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/doc/latex/l3packages/README.md	2017-12-17 23:16:51 UTC (rev 46085)
@@ -1,7 +1,7 @@
 LaTeX3 High-Level Concepts
 ==========================
 
-Release 2017/12/05
+Release 2017/12/16
 
 Overview
 --------

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

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

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

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

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

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-convert.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-convert.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-convert.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -47,7 +47,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %
@@ -252,7 +252,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{l3str-convert}{2017/12/05}{}
+\ProvidesExplPackage{l3str-convert}{2017/12/16}{}
   {L3 Experimental string encoding conversions}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -47,7 +47,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %
@@ -163,7 +163,7 @@
 %
 %    \begin{macrocode}
 %<*package>
-\ProvidesExplPackage{l3str-format}{2017/12/05}{}
+\ProvidesExplPackage{l3str-format}{2017/12/16}{}
   {L3 Experimental string formatting}
 %</package>
 %    \end{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -54,7 +54,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %
@@ -673,7 +673,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xcoffins}{2017/12/05}{}
+\ProvidesExplPackage{xcoffins}{2017/12/16}{}
   {L3 Experimental design level coffins}
 %    \end{macrocode}
 %

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

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -45,7 +45,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %
@@ -732,7 +732,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xgalley}{2017/12/05}{}
+\ProvidesExplPackage{xgalley}{2017/12/16}{}
   {L3 Experimental galley}
 \RequirePackage{xparse,xtemplate,l3galley}
 %    \end{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -21,7 +21,7 @@
 % for those people who are interested.
 %
 %<*driver|generic|package>
-\def\ExplFileDate{2017/12/05}%
+\def\ExplFileDate{2017/12/16}%
 %</driver|generic|package>
 %<*driver>
 \documentclass[full]{l3doc}
@@ -49,7 +49,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -138,7 +138,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %
@@ -637,7 +637,7 @@
 % handled by modifying boxes. These transformations are described here.
 %
 % \begin{function}[added = 2017-04-04]
-%   {\box_autosize_to_wd_and_ht:Nnn, \box_autosize_to_wd_and_ht:Nnn}
+%   {\box_autosize_to_wd_and_ht:Nnn, \box_autosize_to_wd_and_ht:cnn}
 %   \begin{syntax}
 %     \cs{box_autosize_to_wd_and_ht:Nnn} \meta{box} \Arg{x-size} \Arg{y-size}
 %   \end{syntax}
@@ -656,7 +656,7 @@
 % \end{function}
 %
 % \begin{function}[added = 2017-04-04]
-%   {\box_autosize_to_wd_and_ht_plus_dp:Nnn, \box_autosize_to_wd_and_ht_plus_dp:Nnn}
+%   {\box_autosize_to_wd_and_ht_plus_dp:Nnn, \box_autosize_to_wd_and_ht_plus_dp:cnn}
 %   \begin{syntax}
 %     \cs{box_autosize_to_wd_and_ht_plus_dp:Nnn} \meta{box} \Arg{x-size} \Arg{y-size}
 %   \end{syntax}
@@ -1051,14 +1051,10 @@
   { \if_hbox:N #1 \prg_return_true: \else: \prg_return_false: \fi: }
 \prg_new_conditional:Npnn \box_if_vertical:N #1 { p , T , F , TF }
   { \if_vbox:N #1 \prg_return_true: \else: \prg_return_false: \fi: }
-\cs_generate_variant:Nn \box_if_horizontal_p:N { c }
-\cs_generate_variant:Nn \box_if_horizontal:NT  { c }
-\cs_generate_variant:Nn \box_if_horizontal:NF  { c }
-\cs_generate_variant:Nn \box_if_horizontal:NTF { c }
-\cs_generate_variant:Nn \box_if_vertical_p:N { c }
-\cs_generate_variant:Nn \box_if_vertical:NT  { c }
-\cs_generate_variant:Nn \box_if_vertical:NF  { c }
-\cs_generate_variant:Nn \box_if_vertical:NTF { c }
+\prg_generate_conditional_variant:Nnn \box_if_horizontal:N
+  { c } { p , T , F , TF }
+\prg_generate_conditional_variant:Nnn \box_if_vertical:N
+  { c } { p , T , F , TF }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
@@ -1069,10 +1065,8 @@
 %    \begin{macrocode}
 \prg_new_conditional:Npnn \box_if_empty:N #1 { p , T , F , TF }
   { \if_box_empty:N #1 \prg_return_true: \else: \prg_return_false: \fi: }
-\cs_generate_variant:Nn \box_if_empty_p:N { c }
-\cs_generate_variant:Nn \box_if_empty:NT  { c }
-\cs_generate_variant:Nn \box_if_empty:NF  { c }
-\cs_generate_variant:Nn \box_if_empty:NTF { c }
+\prg_generate_conditional_variant:Nnn \box_if_empty:N
+  { c } { p , T , F , TF }
 %    \end{macrocode}
 %  \end{macro}
 %  \end{macro}
@@ -1680,7 +1674,7 @@
         \tex_kern:D -\l_@@_left_new_dim
         \hbox:n
           {
-            \__driver_box_use_rotate:Nn
+            \driver_box_use_rotate:Nn
               \l_@@_internal_box
               \l_@@_angle_fp
           }
@@ -1980,8 +1974,8 @@
 %   {
 %     \box_autosize_to_wd_and_ht:Nnn         ,
 %     \box_autosize_to_wd_and_ht:cnn         ,
-%     \box_autosize_to_wd_and_ht_plus_dp:cnn ,
-%     \box_autosize_to_wd_and_ht_plus_dp:Nnn
+%     \box_autosize_to_wd_and_ht_plus_dp:Nnn ,
+%     \box_autosize_to_wd_and_ht_plus_dp:cnn
 %   }
 % \begin{macro}{\@@_autosize:Nnnn}
 %   Although autosizing a box uses dimensions, it has more in common in
@@ -2018,7 +2012,7 @@
   {
     \hbox_set:Nn \l_@@_internal_box
       {
-        \__driver_box_use_scale:Nnn
+        \driver_box_use_scale:Nnn
           #1
           \l_@@_scale_x_fp
           \l_@@_scale_y_fp

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %
@@ -240,6 +240,21 @@
 %   respectively. The two scale factors should be given as real numbers.
 % \end{function}
 %
+% \section{Additions to \pkg{l3expan}}
+%
+% \begin{function}[added = 2017-12-12]{\prg_generate_conditional_variant:Nnn}
+%   \begin{syntax}
+%     \cs{prg_generate_conditional_variant:Nnn} \cs[no-index]{\meta{name}:\meta{arg spec}} \Arg{variant argument specifiers} \Arg{condition specifiers}
+%   \end{syntax}
+%   Defines argument-specifier variants of conditionals.  This is
+%   equivalent to running \cs{cs_generate_variant:Nn} \meta{conditional}
+%   \Arg{variant argument specifiers} on each \meta{conditional}
+%   described by the \meta{condition specifiers}.  These base-form
+%   \meta{conditionals} are obtained from the \meta{name} and \meta{arg
+%   spec} as described for \cs{prg_new_conditional:Npnn}, and they
+%   should be defined.
+% \end{function}
+%
 % \section{Additions to \pkg{l3file}}
 %
 % \begin{function}[added = 2017-07-11]{\file_get_mdfive_hash:nN}
@@ -1125,13 +1140,13 @@
 %<@@=box>
 %    \end{macrocode}
 %
-% \subsection{Viewing part of a box}
+% \subsubsection{Viewing part of a box}
 %
 % \begin{macro}{\box_clip:N, \box_clip:c}
 %   A wrapper around the driver-dependent code.
 %    \begin{macrocode}
 \cs_new_protected:Npn \box_clip:N #1
-  { \hbox_set:Nn #1 { \__driver_box_use_clip:N #1 } }
+  { \hbox_set:Nn #1 { \driver_box_use_clip:N #1 } }
 \cs_generate_variant:Nn \box_clip:N { c }
 %    \end{macrocode}
 % \end{macro}
@@ -1295,7 +1310,7 @@
 %<@@=coffin>
 %    \end{macrocode}
 %
-% \subsection{Rotating coffins}
+% \subsubsection{Rotating coffins}
 %
 % \begin{variable}{\l_@@_sin_fp}
 % \begin{variable}{\l_@@_cos_fp}
@@ -1590,7 +1605,7 @@
 % \end{macro}
 % \end{macro}
 %
-% \subsection{Resizing coffins}
+% \subsubsection{Resizing coffins}
 %
 % \begin{variable}{\l_@@_scale_x_fp}
 % \begin{variable}{\l_@@_scale_y_fp}
@@ -2226,8 +2241,7 @@
     #1 {#3} {#6}
     \@@_mapthread_function:Nnnwnn #1 #4 \q_stop
   }
-\cs_generate_variant:Nn \seq_mapthread_function:NNN {     Nc }
-\cs_generate_variant:Nn \seq_mapthread_function:NNN { c , cc }
+\cs_generate_variant:Nn \seq_mapthread_function:NNN { Nc , c , cc }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
@@ -2418,7 +2432,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[EXP, pTF]{\sys_if_shell_unrestricted:}
+% \begin{macro}[EXP, pTF]{\sys_if_shell_restricted:}
 %   Performs a check for whether \emph{restricted} shell escape is
 %   enabled.  This returns false if unrestricted shell escape is
 %   enabled.  Unrestricted shell escape is not considered a superset

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %
@@ -1155,9 +1155,7 @@
       \prg_return_true:
     \fi:
   }
-\cs_generate_variant:Nn \clist_get:NNT  { c }
-\cs_generate_variant:Nn \clist_get:NNF  { c }
-\cs_generate_variant:Nn \clist_get:NNTF { c }
+\prg_generate_conditional_variant:Nnn \clist_get:NN { c } { T , F , TF }
 \prg_new_protected_conditional:Npnn \clist_pop:NN #1#2 { T , F , TF }
   { \@@_pop_TF:NNN \tl_set:Nx #1 #2 }
 \prg_new_protected_conditional:Npnn \clist_gpop:NN #1#2 { T , F , TF }
@@ -1171,12 +1169,8 @@
       \prg_return_true:
     \fi:
   }
-\cs_generate_variant:Nn \clist_pop:NNT   { c }
-\cs_generate_variant:Nn \clist_pop:NNF   { c }
-\cs_generate_variant:Nn \clist_pop:NNTF  { c }
-\cs_generate_variant:Nn \clist_gpop:NNT  { c }
-\cs_generate_variant:Nn \clist_gpop:NNF  { c }
-\cs_generate_variant:Nn \clist_gpop:NNTF { c }
+\prg_generate_conditional_variant:Nnn \clist_pop:NN { c } { T , F , TF }
+\prg_generate_conditional_variant:Nnn \clist_gpop:NN { c } { T , F , TF }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
@@ -1452,15 +1446,10 @@
       { \@@_tmp:w ,#1, {} {} ,#2, }
       { \prg_return_false: } { \prg_return_true: }
   }
-\cs_generate_variant:Nn \clist_if_in:NnT  {     NV , No }
-\cs_generate_variant:Nn \clist_if_in:NnT  { c , cV , co }
-\cs_generate_variant:Nn \clist_if_in:NnF  {     NV , No }
-\cs_generate_variant:Nn \clist_if_in:NnF  { c , cV , co }
-\cs_generate_variant:Nn \clist_if_in:NnTF {     NV , No }
-\cs_generate_variant:Nn \clist_if_in:NnTF { c , cV , co }
-\cs_generate_variant:Nn \clist_if_in:nnT  {     nV , no }
-\cs_generate_variant:Nn \clist_if_in:nnF  {     nV , no }
-\cs_generate_variant:Nn \clist_if_in:nnTF {     nV , no }
+\prg_generate_conditional_variant:Nnn \clist_if_in:Nn
+  { NV , No , c , cV , co } { T , F , TF }
+\prg_generate_conditional_variant:Nnn \clist_if_in:nn
+  { nV , no } { T , F , TF }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %
@@ -464,10 +464,8 @@
       }
       { \prg_return_false: }
   }
-\cs_generate_variant:Nn \coffin_if_exist_p:N { c }
-\cs_generate_variant:Nn \coffin_if_exist:NT  { c }
-\cs_generate_variant:Nn \coffin_if_exist:NF  { c }
-\cs_generate_variant:Nn \coffin_if_exist:NTF { c }
+\prg_generate_conditional_variant:Nnn \coffin_if_exist:N
+  { c } { p , T , F , TF }
 %    \end{macrocode}
 % \end{macro}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3color.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3color.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3color.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -70,7 +70,7 @@
 % This isn't included in the typeset documentation because it's a bit
 % ugly:
 %<*class>
-\ProvidesExplClass{l3doc}{2017/12/05}{}
+\ProvidesExplClass{l3doc}{2017/12/16}{}
   {L3 Experimental documentation class}
 %</class>
 % \fi
@@ -77,7 +77,7 @@
 %
 % \title{The \cls{l3doc} class}
 % \author{\Team}
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 % \maketitle
 % \tableofcontents
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -61,7 +61,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -45,7 +45,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %
@@ -69,56 +69,59 @@
 %   \item \texttt{xdvipdfmx}: The driver used by \XeTeX{}.
 % \end{itemize}
 %
-% The code here is all very low-level, and should not in general be used
-% outside of the kernel. It is also important to note that many of the
-% functions here are closely tied to the immediate level \enquote{up},
-% and they must be used in the correct contexts.
+% This module provides code closely tied to the exact driver in use: broadly,
+% the functions here are implemented entirely independently for each case.
+% As such, they often rely on higher-level code to provide necessary but
+% shared operations. For example, in box rotation and scaling the functions
+% here do no correct the final size of the box: this will always be required
+% and thus is handled in the \pkg{box} module.
 %
+% Several of the operations here are low-level, and so may be used only in
+% restricted contexts. Some also require understanding of PostScript/PDF
+% concepts to be used corrected as they take \enquote{raw} arguments, similar
+% in format to those used by the underlying driver.
+%
+% The functions in this module should be regarded as experimental with
+% the following exceptions:
+% \begin{itemize}
+%   \item \dots
+% \end{itemize}
+%
 % \section{Box clipping}
 %
-% \begin{function}[added = 2011-11-11]{\__driver_box_use_clip:N}
+% \begin{function}[added = 2017-12-13]{\driver_box_use_clip:N}
 %   \begin{syntax}
-%     \cs{__driver_box_use_clip:N} \meta{box}
+%     \cs{driver_box_use_clip:N} \meta{box}
 %   \end{syntax}
 %   Inserts the content of the \meta{box} at the current insertion point
 %   such that any material outside of the bounding box is not displayed
 %   by the driver. The material in the \meta{box} is still placed in the
 %   output stream: the clipping takes place at a driver level.
-%
-%   This function should only be used within a surrounding horizontal
-%   box construct.
 % \end{function}
 %
 % \section{Box rotation and scaling}
 %
-% \begin{function}[added = 2016-05-12]{\__driver_box_use_rotate:Nn}
+% \begin{function}[added = 2017-12-13]{\driver_box_use_rotate:Nn}
 %   \begin{syntax}
-%     \cs{__driver_box_use_rotate:Nn} \meta{box} \Arg{angle}
+%     \cs{driver_box_use_rotate:Nn} \meta{box} \Arg{angle}
 %   \end{syntax}
 %   Inserts the content of the \meta{box} at the current insertion point
 %   rotated by the \meta{angle} (expressed in degrees). The material is
-%   inserted with no apparent height or width, and is rotated such the
-%   the \TeX{} reference point of the box is the center of rotation and
-%   remains the reference point after rotation. It is the responsibility of
-%   the code using this function to adjust the apparent size of the box to
-%   be correct at the \TeX{} side.
-%
-%   This function should only be used within a surrounding horizontal
-%   box construct.
+%   rotated such the the \TeX{} reference point of the box is the center of
+%   rotation and remains the reference point after rotation. It is the
+%   responsibility of the code using this function to adjust the apparent
+%   size of the inserted material.
 % \end{function}
 %
-% \begin{function}[added = 2016-05-12]{\__driver_box_use_scale:Nnn}
+% \begin{function}[added = 2017-12-13]{\driver_box_use_scale:Nnn}
 %   \begin{syntax}
-%     \cs{__driver_box_use_scale:Nnn} \meta{box} \Arg{x-scale} \Arg{y-scale}
+%     \cs{driver_box_use_scale:Nnn} \meta{box} \Arg{x-scale} \Arg{y-scale}
 %   \end{syntax}
 %   Inserts the content of the \meta{box} at the current insertion point
-%   scale by the \meta{x-scale} and \meta{y-scale}. The material is
-%   inserted with no apparent height or width. It is the responsibility of
-%   the code using this function to adjust the apparent size of the box to
-%   be correct at the \TeX{} side.
-%
-%   This function should only be used within a surrounding horizontal
-%   box construct.
+%   scale by the \meta{x-scale} and \meta{y-scale}. The reference point
+%   of the material will be unchanged. It is the responsibility of the
+%   code using this function to adjust the apparent size of the inserted
+%   material.
 % \end{function}
 %
 % \section{Color support}
@@ -158,11 +161,11 @@
 % graphic creation.
 %
 % \begin{function}
-%   { \__driver_draw_begin:,  \__driver_draw_end:}
+%   {\driver_draw_begin:, \driver_draw_end:}
 %   \begin{syntax}
-%     \cs{__driver_draw_begin:}
+%     \cs{driver_draw_begin:}
 %     \meta{content}
-%     \cs{__driver_draw_end:}
+%     \cs{driver_draw_end:}
 %   \end{syntax}
 %   Defines a drawing environment. This is a scope for the purposes of
 %   the graphics state. Depending on the driver, other set up may or may not
@@ -173,11 +176,11 @@
 % \end{function}
 %
 % \begin{function}
-%   {\__driver_draw_scope_begin:,  \__driver_draw_scope_end:}
+%   {\driver_draw_scope_begin:, \driver_draw_scope_end:}
 %   \begin{syntax}
-%     \cs{__driver_draw_scope_begin:}
+%     \cs{driver_draw_scope_begin:}
 %     \meta{content}
-%     \cs{__driver_draw_scope_end:}
+%     \cs{driver_draw_scope_end:}
 %   \end{syntax}
 %   Defines a scope for drawing settings and so on. Changes to the graphic
 %   state and concepts such as color or linewidth are localised to a scope.
@@ -189,17 +192,17 @@
 %
 % \subsection{Path construction}
 %
-% \begin{function}{\__driver_draw_moveto:nn}
+% \begin{function}{\driver_draw_moveto:nn}
 %   \begin{syntax}
-%     \cs{__driver_draw_move:nn} \Arg{x} \Arg{y}
+%     \cs{driver_draw_move:nn} \Arg{x} \Arg{y}
 %   \end{syntax}
 %   Moves the current drawing reference point to (\meta{x}, \meta{y});
 %   any active transformation matrix applies.
 % \end{function}
 %
-% \begin{function}{\__driver_draw_lineto:nn}
+% \begin{function}{\driver_draw_lineto:nn}
 %   \begin{syntax}
-%     \cs{__driver_draw_lineto:nn} \Arg{x} \Arg{y}
+%     \cs{driver_draw_lineto:nn} \Arg{x} \Arg{y}
 %   \end{syntax}
 %   Adds a path from the current drawing reference point to
 %   (\meta{x}, \meta{y}); any active transformation matrix applies. Note
@@ -207,9 +210,9 @@
 %   the path may be discarded or used as a clip without appearing itself.
 % \end{function}
 %
-% \begin{function}{\__driver_draw_curveto:nnnnnn}
+% \begin{function}{\driver_draw_curveto:nnnnnn}
 %   \begin{syntax}
-%     \cs{__driver_draw_curveto:nnnnnn} \Arg{x_1} \Arg{y_1}
+%     \cs{driver_draw_curveto:nnnnnn} \Arg{x_1} \Arg{y_1}
 %       \Arg{x_2} \Arg{y_2} \Arg{x_3} \Arg{y_3}
 %   \end{syntax}
 %   Adds a Bezier curve path from the current drawing reference point to
@@ -220,9 +223,9 @@
 %   without appearing itself.
 % \end{function}
 %
-% \begin{function}{\__driver_draw_rectangle:nnnn}
+% \begin{function}{\driver_draw_rectangle:nnnn}
 %   \begin{syntax}
-%     \cs{__driver_draw_rectangle:nnnn} \Arg{x} \Arg{y} \Arg{width} \Arg{height}
+%     \cs{driver_draw_rectangle:nnnn} \Arg{x} \Arg{y} \Arg{width} \Arg{height}
 %   \end{syntax}
 %   Adds rectangular path from (\meta{x_1}, \meta{y_1}) of \meta{height}
 %   and \meta{width}; any active transformation matrix applies.  Note that
@@ -230,9 +233,9 @@
 %   path may be discarded or used as a clip without appearing itself.
 % \end{function}
 %
-% \begin{function}{\__driver_draw_closepath:}
+% \begin{function}{\driver_draw_closepath:}
 %   \begin{syntax}
-%     \cs{__driver_draw_closepath:}
+%     \cs{driver_draw_closepath:}
 %   \end{syntax}
 %   Closes an existing path, adding a line from the current point to the
 %   start of path. Note that nothing is drawn until a fill or stroke
@@ -242,13 +245,13 @@
 %
 % \subsection{Stroking and filling}
 %
-% \begin{function}{\__driver_draw_stroke:, \__driver_draw_closestroke:}
+% \begin{function}{\driver_draw_stroke:, \driver_draw_closestroke:}
 %   \begin{syntax}
 %     \meta{path construction}
-%     \cs{__driver_draw_stroke:}
+%     \cs{driver_draw_stroke:}
 %   \end{syntax}
 %   Draws a line along the current path, which is also closed by
-%   \cs{__driver_draw_closestroke:}. The nature of the line drawn
+%   \cs{driver_draw_closestroke:}. The nature of the line drawn
 %   is influenced by settings for
 %   \begin{itemize}
 %     \item Line thickness
@@ -261,14 +264,14 @@
 %   The path may also be used for clipping.
 % \end{function}
 %
-% \begin{function}{\__driver_draw_fill:, \__driver_draw_fillstroke:}
+% \begin{function}{\driver_draw_fill:, \driver_draw_fillstroke:}
 %   \begin{syntax}
 %     \meta{path construction}
-%     \cs{__driver_draw_fill:}
+%     \cs{driver_draw_fill:}
 %   \end{syntax}
 %   Fills the area surrounded by the current path: this will be closed prior
 %   to filling if it is not already. The \texttt{fillstroke} version also
-%   strokes the path as described for \cs{__driver_draw_stroke:}. The fill is
+%   strokes the path as described for \cs{driver_draw_stroke:}. The fill is
 %   influenced by the setting for fill color (or the current color if no
 %   specific stroke color is set). The path may also be used for clipping.
 %   For paths which are self-intersecting or comprising multiple parts, the
@@ -276,9 +279,9 @@
 %   winding number rule unless the even-odd rule is active.
 % \end{function}
 %
-% \begin{function}{\__driver_draw_nonzero_rule:, \__driver_draw_evenodd_rule:}
+% \begin{function}{\driver_draw_nonzero_rule:, \driver_draw_evenodd_rule:}
 %   \begin{syntax}
-%     \cs{__driver_draw_nonzero_rule:}
+%     \cs{driver_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.
@@ -286,10 +289,10 @@
 %   and apply on an ongoing basis.
 % \end{function}
 %
-% \begin{function}{\__driver_draw_clip:}
+% \begin{function}{\driver_draw_clip:}
 %   \begin{syntax}
 %     \meta{path construction}
-%     \cs{__driver_draw_clip:}
+%     \cs{driver_draw_clip:}
 %   \end{syntax}
 %   Indicates that the current path should be used for clipping, such that
 %   any subsequent material outside of the path (but within the current
@@ -299,10 +302,10 @@
 %   path as shown.
 % \end{function}
 %
-% \begin{function}{\__driver_draw_discardpath:}
+% \begin{function}{\driver_draw_discardpath:}
 %   \begin{syntax}
 %     \meta{path construction}
-%     \cs{__driver_draw_discardpath:}
+%     \cs{driver_draw_discardpath:}
 %   \end{syntax}
 %   Discards the current path without stroking or filling. This is primarily
 %   useful for paths constructed purely for clipping, as this alone does not
@@ -311,16 +314,16 @@
 %
 % \subsection{Stroke options}
 %
-% \begin{function}{\__driver_draw_linewidth:n}
+% \begin{function}{\driver_draw_linewidth:n}
 %   \begin{syntax}
-%     \cs{__driver_draw_linewidth:n} \Arg{dimexpr}
+%     \cs{driver_draw_linewidth:n} \Arg{dimexpr}
 %   \end{syntax}
 %   Sets the width to be used for stroking to \meta{dimexpr}.
 % \end{function}
 %
-% \begin{function}{\__driver_draw_dash:nn}
+% \begin{function}{\driver_draw_cap_dash:nn}
 %   \begin{syntax}
-%     \cs{__driver_draw_dash:nn} \Arg{dash pattern} \Arg{phase}
+%     \cs{driver_draw_dash:nn} \Arg{dash pattern} \Arg{phase}
 %   \end{syntax}
 %   Sets the pattern of dashing to be used when stroking a line. The
 %   \meta{dash pattern} should be a comma-separated list of dimension
@@ -340,12 +343,12 @@
 %
 % \begin{function}
 %   {
-%     \__driver_draw_cap_butt:      ,
-%     \__driver_draw_cap_rectangle: ,
-%     \__driver_draw_cap_round:
+%     \driver_draw_cap_butt:      ,
+%     \driver_draw_cap_rectangle: ,
+%     \driver_draw_cap_round:
 %   }
 %   \begin{syntax}
-%     \cs{__driver_draw_cap_butt:}
+%     \cs{driver_draw_cap_butt:}
 %   \end{syntax}
 %   Sets the style of terminal stroke position to one of butt, rectangle or
 %   round.
@@ -353,19 +356,19 @@
 %
 % \begin{function}
 %   {
-%     \__driver_draw_join_bevel:      ,
-%     \__driver_draw_join_miter: ,
-%     \__driver_draw_join_round:
+%     \driver_draw_join_bevel: ,
+%     \driver_draw_join_miter: ,
+%     \driver_draw_join_round:
 %   }
 %   \begin{syntax}
-%     \cs{__driver_draw_cap_butt:}
+%     \cs{driver_draw_cap_butt:}
 %   \end{syntax}
 %   Sets the style of stroke joins to one of bevel, miter or round.
 % \end{function}
 %
-% \begin{function}{\__driver_draw_miterlimit:n}
+% \begin{function}{\driver_draw_miterlimit:n}
 %   \begin{syntax}
-%     \cs{__driver_draw_miterlimit:n} \Arg{dimexpr}
+%     \cs{driver_draw_miterlimit:n} \Arg{dimexpr}
 %   \end{syntax}
 %   Sets the miter limit of lines joined as a miter, as described in the
 %   PDF and PostScript manuals.
@@ -375,12 +378,12 @@
 %
 % \begin{function}
 %   {
-%     \__driver_draw_color_cmyk:nnnn ,
-%     \__driver_draw_color_cmyk_fill:nnnn ,
-%     \__driver_draw_color_cmyk_stroke:nnnn
+%     \driver_draw_color_cmyk:nnnn ,
+%     \driver_draw_fill_cmyk:nnnn ,
+%     \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{magneta} \Arg{yellow}
 %       \Arg{black}
 %   \end{syntax}
 %   Sets the color for drawing to the CMYK values specified, all of which are
@@ -392,12 +395,12 @@
 %
 % \begin{function}
 %   {
-%     \__driver_draw_color_gray:n ,
-%     \__driver_draw_color_gray_fill:n ,
-%     \__driver_draw_color_gray_stroke:n
+%     \driver_draw_color_gray:n ,
+%     \driver_draw_fill_gray:n ,
+%     \driver_draw_stroke_gray:n
 %   }
 %   \begin{syntax}
-%     \cs{__driver_draw_color_gray:n} \Arg{gray}
+%     \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
@@ -408,12 +411,12 @@
 %
 % \begin{function}
 %   {
-%     \__driver_draw_color_rgb:nnn ,
-%     \__driver_draw_color_rgb_fill:nnn ,
-%     \__driver_draw_color_rgb_stroke:nnn
+%     \driver_draw_color_rgb:nnn ,
+%     \driver_draw_fill_rgb:nnn ,
+%     \driver_draw_stroke_rgb:nnn
 %   }
 %   \begin{syntax}
-%     \cs{__driver_draw_color_rgb:nnn} \Arg{red} \Arg{green} \Arg{blue}
+%     \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
@@ -424,9 +427,9 @@
 %
 % \subsection{Inserting \TeX{} material}
 %
-% \begin{function}{\__driver_draw_hbox:Nnnnnnn}
+% \begin{function}{\driver_draw_hbox:Nnnnnnn}
 %   \begin{syntax}
-%     \cs{__driver_draw_hbox:Nnnnnnn} \meta{box}
+%     \cs{driver_draw_hbox:Nnnnnnn} \meta{box}
 %       \Arg{a} \Arg{b} \Arg{c} \Arg{d} \Arg{x} \Arg{y}
 %   \end{syntax}
 %   Inserts the \meta{box} as an hbox with the box reference point placed
@@ -440,9 +443,9 @@
 %
 % \subsection{Coordinate system transformations}
 %
-% \begin{function}{\__driver_draw_transformcm:nnnnnn}
+% \begin{function}{\driver_draw_transformcm:nnnnnn}
 %   \begin{syntax}
-%     \cs{__driver_draw_transformcm:nnnnnn} \Arg{a} \Arg{b} \Arg{c} \Arg{d}
+%     \cs{driver_draw_transformcm:nnnnnn} \Arg{a} \Arg{b} \Arg{c} \Arg{d}
 %       \Arg{x} \Arg{y}
 %   \end{syntax}
 %   Applies the transformation matrix $[a b c d]$ and offset vector
@@ -776,12 +779,12 @@
 %
 % \subsubsection{Box operations}
 %
-% \begin{macro}{\@@_box_use_clip:N}
+% \begin{macro}{\driver_box_use_clip:N}
 %   Much the same idea as for the PDF mode version but with a slightly
 %   different syntax for creating the clip path. To avoid any scaling
 %   issues we need the absolute length auxiliary here.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_box_use_clip:N #1
+\cs_new_protected:Npn \driver_box_use_clip:N #1
   {
     \@@_scope_begin:
     \@@_literal:n
@@ -802,12 +805,12 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\@@_box_use_rotate:Nn}
+% \begin{macro}{\driver_box_use_rotate:Nn}
 %   Rotating using \texttt{dvips} does not require that the box dimensions
 %   are altered and has a very convenient built-in operation. Zero rotation
 %   must be written as |0| not |-0| so there is a quick test.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_box_use_rotate:Nn #1#2
+\cs_new_protected:Npn \driver_box_use_rotate:Nn #1#2
   {
     \@@_scope_begin:
     \@@_literal:n
@@ -823,11 +826,11 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\@@_box_use_scale:Nnn}
+% \begin{macro}{\driver_box_use_scale:Nnn}
 %   The \texttt{dvips} driver once again has a dedicated operation we can
 %   use here.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_box_use_scale:Nnn #1#2#3
+\cs_new_protected:Npn \driver_box_use_scale:Nnn #1#2#3
   {
     \@@_scope_begin:
     \@@_literal:n
@@ -847,7 +850,7 @@
 % \begin{macro}{\@@_image_getbb_eps:n}
 %   Simply use the generic function.
 %    \begin{macrocode}
-\cs_new_eq:NN \@@_image_getbb_eps:n \__image_read_bb:n
+\cs_new_eq:NN \@@_image_getbb_eps:n \image_read_bb:n
 %    \end{macrocode}
 % \end{macro}
 %
@@ -875,7 +878,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\@@_draw_begin:, \@@_draw_end:}
+% \begin{macro}{\driver_draw_begin:, \driver_draw_end:}
 %   The |ps::[begin]| special here deals with positioning but allows us to
 %   continue on to a matching |ps::[end]|: contrast with |ps:|, which positions
 %   but where we can't split material between separate calls. The
@@ -883,7 +886,7 @@
 %   scale and $y$-axis direction. The reference point at the start of the box
 %   is saved (as |l3x|/|l3y|) as it is needed when inserting various items.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_draw_begin:
+\cs_new_protected:Npn \driver_draw_begin:
   {
     \tex_special:D { ps::[begin] }
     \tex_special:D { ps::~save }
@@ -890,7 +893,7 @@
     \tex_special:D { ps::~/l3x~currentpoint~/l3y~exch~def~def }
     \tex_special:D { ps::~@beginspecial }
   }
-\cs_new_protected:Npn \@@_draw_end:
+\cs_new_protected:Npn \driver_draw_end:
   {
     \tex_special:D { ps::~@endspecial }
     \tex_special:D { ps::~restore }
@@ -899,20 +902,20 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\@@_draw_scope_begin:, \@@_draw_scope_end:}
+% \begin{macro}{\driver_draw_scope_begin:, \driver_draw_scope_end:}
 %   Scope here may need to contain saved definitions, so the entire memory
 %   rather than just the graphic state has to be sent to the stack.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_draw_scope_begin:
+\cs_new_protected:Npn \driver_draw_scope_begin:
   { \@@_draw_literal:n { save } }
-\cs_new_protected:Npn \@@_draw_scope_end:
+\cs_new_protected:Npn \driver_draw_scope_end:
   { \@@_draw_literal:n { restore } }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\@@_draw_moveto:nn, \@@_draw_lineto:nn}
-% \begin{macro}{\@@_draw_rectangle:nnnn}
-% \begin{macro}{\@@_draw_curveto:nnnnnn}
+% \begin{macro}{\driver_draw_moveto:nn, \driver_draw_lineto:nn}
+% \begin{macro}{\driver_draw_rectangle:nnnn}
+% \begin{macro}{\driver_draw_curveto:nnnnnn}
 %   Path creation operations mainly resolve directly to PostScript primitive
 %   steps, with only the need to convert to \texttt{bp}. Notice that
 %   \texttt{x}-type expansion is included here to ensure that any variable
@@ -920,17 +923,17 @@
 %   no native rectangular path command (without also clipping, filling or
 %   stroking), so that task is done using a small amount of PostScript.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_draw_moveto:nn #1#2
+\cs_new_protected:Npn \driver_draw_moveto:nn #1#2
   {
     \@@_draw_literal:x
       { \dim_to_decimal_in_bp:n {#1} ~ \dim_to_decimal_in_bp:n {#2} ~ moveto }
   }
-\cs_new_protected:Npn \@@_draw_lineto:nn #1#2
+\cs_new_protected:Npn \driver_draw_lineto:nn #1#2
   {
     \@@_draw_literal:x
       { \dim_to_decimal_in_bp:n {#1} ~ \dim_to_decimal_in_bp:n {#2} ~ lineto }
   }
-\cs_new_protected:Npn \@@_draw_rectangle:nnnn #1#2#3#4
+\cs_new_protected:Npn \driver_draw_rectangle:nnnn #1#2#3#4
   {
      \@@_draw_literal:x
        {
@@ -939,7 +942,7 @@
          moveto~dup~0~rlineto~exch~0~exch~rlineto~neg~0~rlineto~closepath
       }
   }
-\cs_new_protected:Npn \@@_draw_curveto:nnnnnn #1#2#3#4#5#6
+\cs_new_protected:Npn \driver_draw_curveto:nnnnnn #1#2#3#4#5#6
   {
     \@@_draw_literal:x
       {
@@ -954,13 +957,13 @@
 % \end{macro}
 % \end{macro}
 %
-% \begin{macro}{\@@_draw_evenodd_rule:, \@@_draw_nonzero_rule:}
+% \begin{macro}{\driver_draw_evenodd_rule:, \driver_draw_nonzero_rule:}
 % \begin{variable}{\g_@@_draw_eor_bool}
 %    The even-odd rule here can be implemented as a simply switch.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_draw_evenodd_rule:
+\cs_new_protected:Npn \driver_draw_evenodd_rule:
   { \bool_gset_true:N \g_@@_draw_eor_bool }
-\cs_new_protected:Npn \@@_draw_nonzero_rule:
+\cs_new_protected:Npn \driver_draw_nonzero_rule:
   { \bool_gset_false:N \g_@@_draw_eor_bool }
 \bool_new:N \g_@@_draw_eor_bool
 %    \end{macrocode}
@@ -969,13 +972,13 @@
 %
 % \begin{macro}
 %   {
-%     \@@_draw_closepath:   ,
-%     \@@_draw_stroke:      ,
-%     \@@_draw_closestroke: ,
-%     \@@_draw_fill:        ,
-%     \@@_draw_fillstroke:  ,
-%     \@@_draw_clip:        ,
-%     \@@_draw_discardpath:
+%     \driver_draw_closepath:   ,
+%     \driver_draw_stroke:      ,
+%     \driver_draw_closestroke: ,
+%     \driver_draw_fill:        ,
+%     \driver_draw_fillstroke:  ,
+%     \driver_draw_clip:        ,
+%     \driver_draw_discardpath:
 %   }
 % \begin{variable}{\g_@@_draw_clip_bool}
 %   Unlike PDF, PostScript doesn't track separate colors for strokes and other
@@ -988,9 +991,9 @@
 %   using a \TeX{} switch. All of the operations end with a new path instruction
 %   as they do not terminate (again in contrast to PDF).
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_draw_closepath:
+\cs_new_protected:Npn \driver_draw_closepath:
   { \@@_draw_literal:n { closepath } }
-\cs_new_protected:Npn \@@_draw_stroke:
+\cs_new_protected:Npn \driver_draw_stroke:
   {
     \@@_draw_literal:n { currentdict~/l3sc~known~{gsave~l3sc}~if }
     \@@_draw_literal:n { stroke }
@@ -1006,12 +1009,12 @@
     \@@_draw_literal:n { newpath }
     \bool_gset_false:N \g_@@_draw_clip_bool
   }
-\cs_new_protected:Npn \@@_draw_closestroke:
+\cs_new_protected:Npn \driver_draw_closestroke:
   {
-    \@@_draw_closepath:
-    \@@_draw_stroke:
+    \driver_draw_closepath:
+    \driver_draw_stroke:
   }
-\cs_new_protected:Npn \@@_draw_fill:
+\cs_new_protected:Npn \driver_draw_fill:
   {
     \@@_draw_literal:n { currentdict~/l3fc~known~{gsave~l3fc}~if }
     \@@_draw_literal:x
@@ -1031,7 +1034,7 @@
     \@@_draw_literal:n { newpath }
     \bool_gset_false:N \g_@@_draw_clip_bool
   }
-\cs_new_protected:Npn \@@_draw_fillstroke:
+\cs_new_protected:Npn \driver_draw_fillstroke:
   {
     \@@_draw_literal:n { currentdict~/l3fc~known~{gsave~l3fc}~if }
     \@@_draw_literal:x
@@ -1054,10 +1057,10 @@
     \@@_draw_literal:n { newpath }
     \bool_gset_false:N \g_@@_draw_clip_bool
   }
-\cs_new_protected:Npn \@@_draw_clip:
+\cs_new_protected:Npn \driver_draw_clip:
   { \bool_gset_true:N \g_@@_draw_clip_bool }
 \bool_new:N \g_@@_draw_clip_bool
-\cs_new_protected:Npn \@@_draw_discardpath:
+\cs_new_protected:Npn \driver_draw_discardpath:
   {
     \bool_if:NT \g_@@_draw_clip_bool
       {
@@ -1074,19 +1077,19 @@
 % \end{variable}
 % \end{macro}
 %
-% \begin{macro}{\@@_draw_dash:nn}
+% \begin{macro}{\driver_draw_cap_dash:nn}
 % \begin{macro}{\@@_draw_dash:n}
-% \begin{macro}{\@@_draw_linewidth:n}
-% \begin{macro}{\@@_draw_miterlimit:n}
+% \begin{macro}{\driver_draw_linewidth:n}
+% \begin{macro}{\driver_draw_miterlimit:n}
 % \begin{macro}
 %   {
-%     \@@_draw_cap_butt:, \@@_draw_cap_round:, \@@_draw_cap_rectangle:,
-%     \@@_draw_join_miter:, \@@_draw_join_round:, \@@_draw_join_bevel:
+%     \driver_draw_cap_butt:, \driver_draw_cap_round:, \driver_draw_cap_rectangle:,
+%     \driver_draw_join_miter:, \driver_draw_join_round:, \driver_draw_join_bevel:
 %   }
 %   Converting paths to output is again a case of mapping directly to
 %   PostScript operations.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_draw_dash:nn #1#2
+\cs_new_protected:Npn \driver_draw_cap_dash:nn #1#2
   {
     \@@_draw_literal:x
       {
@@ -1098,24 +1101,24 @@
   }
 \cs_new:Npn \@@_draw_dash:n #1
   { \dim_to_decimal_in_bp:n {#1} ~ }
-\cs_new_protected:Npn \@@_draw_linewidth:n #1
+\cs_new_protected:Npn \driver_draw_linewidth:n #1
   {
     \@@_draw_literal:x
       { \dim_to_decimal_in_bp:n {#1} ~ setlinewidth }
   }
-\cs_new_protected:Npn \@@_draw_miterlimit:n #1
+\cs_new_protected:Npn \driver_draw_miterlimit:n #1
   { \@@_draw_literal:x { \fp_eval:n {#1} ~ setmiterlimit } }
-\cs_new_protected:Npn \@@_draw_cap_butt:
+\cs_new_protected:Npn \driver_draw_cap_butt:
   { \@@_draw_literal:n { 0 ~ setlinecap } }
-\cs_new_protected:Npn \@@_draw_cap_round:
+\cs_new_protected:Npn \driver_draw_cap_round:
   { \@@_draw_literal:n { 1 ~ setlinecap } }
-\cs_new_protected:Npn \@@_draw_cap_rectangle:
+\cs_new_protected:Npn \driver_draw_cap_rectangle:
   { \@@_draw_literal:n { 2 ~ setlinecap } }
-\cs_new_protected:Npn \@@_draw_join_miter:
+\cs_new_protected:Npn \driver_draw_join_miter:
   { \@@_draw_literal:n { 0 ~ setlinejoin } }
-\cs_new_protected:Npn \@@_draw_join_round:
+\cs_new_protected:Npn \driver_draw_join_round:
   { \@@_draw_literal:n { 1 ~ setlinejoin } }
-\cs_new_protected:Npn \@@_draw_join_bevel:
+\cs_new_protected:Npn \driver_draw_join_bevel:
   { \@@_draw_literal:n { 2 ~ setlinejoin } }
 %    \end{macrocode}
 % \end{macro}
@@ -1127,21 +1130,21 @@
 % \begin{macro}{\_@@_draw_color_reset:}
 % \begin{macro}
 %   {
-%     \@@_draw_color_cmyk:nnnn        ,
-%     \@@_draw_color_cmyk_fill:nnnn   ,
-%     \@@_draw_color_cmyk_stroke:nnnn
+%     \driver_draw_color_cmyk:nnnn        ,
+%     \driver_draw_fill_cmyk:nnnn   ,
+%     \driver_draw_stroke_cmyk:nnnn
 %   }
 % \begin{macro}
 %   {
-%     \@@_draw_color_gray:n        ,
-%     \@@_draw_color_gray_fill:n   ,
-%     \@@_draw_color_gray_stroke:n
+%     \driver_draw_color_gray:n        ,
+%     \driver_draw_fill_gray:n   ,
+%     \driver_draw_stroke_gray:n
 %   }
 % \begin{macro}
 %   {
-%     \@@_draw_color_rgb:nnn        ,
-%     \@@_draw_color_rgb_fill:nnn   ,
-%     \@@_draw_color_rgb_stroke:nnn
+%     \driver_draw_color_rgb:nnn        ,
+%     \driver_draw_fill_rgb:nnn   ,
+%     \driver_draw_stroke_rgb:nnn
 %   }
 %   To allow color to be defined for strokes and fills separately and to
 %   respect scoping, the data needs to be stored at the PostScript level.
@@ -1153,7 +1156,7 @@
     \@@_draw_literal:n { currentdic~/l3fc~known~{ /l3fc~ { } ~def }~if }
     \@@_draw_literal:n { currentdic~/l3sc~known~{ /l3sc~ { } ~def }~if }
   }
-\cs_new_protected:Npn \@@_draw_color_cmyk:nnnn #1#2#3#4
+\cs_new_protected:Npn \driver_draw_color_cmyk:nnnn #1#2#3#4
   {
     \@@_draw_literal:x
       {
@@ -1163,7 +1166,7 @@
       }
     \@@_draw_color_reset:
   }
-\cs_new_protected:Npn \@@_draw_color_cmyk_fill:nnnn #1#2#3#4
+\cs_new_protected:Npn \driver_draw_fill_cmyk:nnnn #1#2#3#4
   {
     \@@_draw_literal:x
       {
@@ -1176,9 +1179,9 @@
         def
       }
   }
-\cs_new_protected:Npn \@@_draw_color_cmyk_stroke:nnnn #1#2#3#4
+\cs_new_protected:Npn \driver_draw_stroke_cmyk:nnnn #1#2#3#4
   {
-    \__driver_draw_literal:x
+    \@@_draw_literal:x
       {
         /l3sc ~
           {
@@ -1189,16 +1192,16 @@
         def
       }
   }
-\cs_new_protected:Npn \@@_draw_color_gray:n #1
+\cs_new_protected:Npn \driver_draw_color_gray:n #1
   {
     \@@_draw_literal:x { fp_eval:n {#1} ~ setgray  }
     \@@_draw_color_reset:
   }
-\cs_new_protected:Npn \@@_draw_color_gray_fill:n #1
+\cs_new_protected:Npn \driver_draw_fill_gray:n #1
   { \@@_draw_literal:x { /l3fc ~ { \fp_eval:n {#1} ~ setgray } ~ def } }
-\cs_new_protected:Npn \@@_draw_color_gray_stroke:n #1
+\cs_new_protected:Npn \driver_draw_stroke_gray:n #1
   { \@@_draw_literal:x { /l3sc ~ { \fp_eval:n {#1} ~ setgray } ~ def } }
-\cs_new_protected:Npn \@@_draw_color_rgb:nnn #1#2#3
+\cs_new_protected:Npn \driver_draw_color_rgb:nnn #1#2#3
   {
     \@@_draw_literal:x
       {
@@ -1207,7 +1210,7 @@
       }
     \@@_draw_color_reset:
   }
-\cs_new_protected:Npn \@@_draw_color_rgb_fill:nnn #1#2#3
+\cs_new_protected:Npn \driver_draw_fill_rgb:nnn #1#2#3
   {
     \@@_draw_literal:x
       {
@@ -1219,7 +1222,7 @@
         def
       }
   }
-\cs_new_protected:Npn \@@_draw_color_rgb_stroke:nnn #1#2#3
+\cs_new_protected:Npn \driver_draw_stroke_rgb:nnn #1#2#3
   {
     \@@_draw_literal:x
       {
@@ -1237,12 +1240,12 @@
 % \end{macro}
 % \end{macro}
 %
-% \begin{macro}{\@@_draw_transformcm:nnnnnn}
+% \begin{macro}{\driver_draw_transformcm:nnnnnn}
 %   The first four arguments here are floats (the affine matrix), the last
 %   two are a displacement vector. Once again, force evaluation to allow for
 %   caching.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_draw_transformcm:nnnnnn #1#2#3#4#5#6
+\cs_new_protected:Npn \driver_draw_transformcm:nnnnnn #1#2#3#4#5#6
   {
     \@@_draw_literal:x
       {
@@ -1257,7 +1260,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\@@_draw_hbox:Nnnnnnn}
+% \begin{macro}{\driver_draw_hbox:Nnnnnnn}
 %   Inside a picture |@beginspecial|/|@endspecial| are active, which is
 %   normally a good thing but means that the position and scaling would be off
 %   if the box was inserted directly. Instead, we need to reverse the effect of
@@ -1267,11 +1270,11 @@
 %   drawing origin so has to be done purely in driver code not using \TeX{}
 %   offsets.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_draw_hbox:Nnnnnnn #1#2#3#4#5#6#7
+\cs_new_protected:Npn \driver_draw_hbox:Nnnnnnn #1#2#3#4#5#6#7
   {
     \@@_scope_begin:
     \tex_special:D { ps::[end] }
-    \@@_draw_transformcm:nnnnnn {#2} {#3} {#4} {#5} {#6} {#7}
+    \driver_draw_transformcm:nnnnnn {#2} {#3} {#4} {#5} {#6} {#7}
     \tex_special:D { ps::~72~Resolution~div~72~VResolution~div~neg~scale }
     \tex_special:D { ps::~magscale~{1~DVImag~div~dup~scale}~if }
     \tex_special:D { ps::~l3x~neg~l3y~neg~translate }
@@ -1355,7 +1358,7 @@
 %
 % \subsubsection{Box operations}
 %
-% \begin{macro}{\@@_box_use_clip:N}
+% \begin{macro}{\driver_box_use_clip:N}
 %   The general method is to save the current location, define a clipping path
 %   equivalent to the bounding box, then insert the content at the current
 %   position and in a zero width box. The \enquote{real} width is then made up
@@ -1364,7 +1367,7 @@
 %   as much code as possible and uses the same conversions (and so same
 %   rounding errors) in all cases.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_box_use_clip:N #1
+\cs_new_protected:Npn \driver_box_use_clip:N #1
   {
     \@@_scope_begin:
     \@@_literal:n
@@ -1382,7 +1385,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\@@_box_use_rotate:Nn}
+% \begin{macro}{\driver_box_use_rotate:Nn}
 % \begin{variable}{\l_@@_cos_fp, \l_@@_sin_fp}
 %   Rotations are set using an affine transformation matrix which therefore
 %   requires sine/cosine values not the angle itself. We store the rounded
@@ -1391,7 +1394,7 @@
 %   with problematic display programs.  Note that numbers are compared to~$0$
 %   after rounding.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_box_use_rotate:Nn #1#2
+\cs_new_protected:Npn \driver_box_use_rotate:Nn #1#2
   {
     \@@_scope_begin:
     \box_set_wd:Nn #1 { 0pt }
@@ -1421,11 +1424,11 @@
 % \end{variable}
 % \end{macro}
 %
-% \begin{macro}{\@@_box_use_scale:Nnn}
+% \begin{macro}{\driver_box_use_scale:Nnn}
 %   The same idea as for rotation but without the complexity of signs and
 %   cosines.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_box_use_scale:Nnn #1#2#3
+\cs_new_protected:Npn \driver_box_use_scale:Nnn #1#2#3
   {
     \@@_scope_begin:
     \@@_matrix:n
@@ -1467,13 +1470,13 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_image_getbb_jpg:n #1
   {
-    \int_zero:N \l__image_page_int
-    \tl_clear:N \l__image_pagebox_tl
+    \int_zero:N \l_image_page_int
+    \tl_clear:N \l_image_pagebox_tl
     \tl_set:Nx \l_@@_image_attr_tl
       {
-        \tl_if_empty:NF \l__image_decode_tl
-          { :D \l__image_decode_tl }
-        \bool_if:NT \l__image_interpolate_bool
+        \tl_if_empty:NF \l_image_decode_tl
+          { :D \l_image_decodearray_tl }
+        \bool_if:NT \l_image_interpolate_bool
           { :I }
       }
     \tl_clear:N \l_@@_image_attr_tl
@@ -1482,27 +1485,19 @@
 \cs_new_eq:NN \@@_image_getbb_png:n \@@_image_getbb_jpg:n
 \cs_new_protected:Npn \@@_image_getbb_pdf:n #1
   {
-    \tl_clear:N \l__image_decode_tl
-    \bool_set_false:N \l__image_interpolate_bool
+    \tl_clear:N \l_image_decode_tl
+    \bool_set_false:N \l_image_interpolate_bool
     \tl_set:Nx \l_@@_image_attr_tl
       {
-        : \l__image_pagebox_tl
-        \int_compare:nNnT \l__image_page_int > 1
-          { :P \int_use:N \l__image_page_int }
+        : \l_image_pagebox_tl
+        \int_compare:nNnT \l_image_page_int > 1
+          { :P \int_use:N \l_image_page_int }
       }
     \@@_image_getbb_auxi:n {#1}
   }
 \cs_new_protected:Npn \@@_image_getbb_auxi:n #1
   {
-    \dim_zero:N \l__image_llx_dim
-    \dim_zero:N \l__image_lly_dim
-    \dim_if_exist:cTF { c__image_ #1 \l_@@_image_attr_tl _urx_dim }
-      {
-        \dim_set_eq:Nc \l__image_urx_dim
-          { c__image_ #1 \l_@@_image_attr_tl _urx_dim }
-        \dim_set_eq:Nc \l__image_ury_dim
-          { c__image_ #1 \l_@@_image_attr_tl _ury_dim }
-      }
+    \image_bb_restore:xF { #1 \l_@@_image_attr_tl }
       { \@@_image_getbb_auxii:n {#1} }
   }
 %    \begin{macrocode}
@@ -1515,32 +1510,29 @@
   {
     \tex_immediate:D \pdftex_pdfximage:D
       \bool_lazy_or:nnT
-        { \l__image_interpolate_bool }
-        { ! \tl_if_empty_p:N \l__image_decode_tl }
+        { \l_image_interpolate_bool }
+        { ! \tl_if_empty_p:N \l_image_decodearray_tl }
         {
           attr ~
             {
-              \tl_if_empty:NF \l__image_decode_tl
-                { /Decode~[ \l__image_decode_tl ] }
-              \bool_if:NT \l__image_interpolate_bool
+              \tl_if_empty:NF \l_image_decode_tl
+                { /Decode~[ \l_image_decodearray_tl ] }
+              \bool_if:NT \l_image_interpolate_bool
                 { /Interpolate~true }
             }
         }
-      \int_compare:nNnT \l__image_page_int > 0
-        { page ~ \int_use:N \l__image_page_int }
-      \tl_if_empty:NF \l__image_pagebox_tl
-        { \l__image_pagebox_tl }
+      \int_compare:nNnT \l_image_page_int > 0
+        { page ~ \int_use:N \l_image_page_int }
+      \tl_if_empty:NF \l_image_pagebox_tl
+        { \l_image_pagebox_tl }
       {#1}
-    \hbox_set:Nn \l__image_tmp_box
+    \hbox_set:Nn \l_@@_tmp_box
       { \pdftex_pdfrefximage:D \pdftex_pdflastximage:D }
-    \dim_set:Nn \l__image_urx_dim { \box_wd:N \l__image_tmp_box }
-    \dim_set:Nn \l__image_ury_dim { \box_ht:N \l__image_tmp_box }
-    \int_const:cn { c__image_ #1 \l_@@_image_attr_tl _int }
+    \dim_set:Nn \l_image_urx_dim { \box_wd:N \l_@@_tmp_box }
+    \dim_set:Nn \l_image_ury_dim { \box_ht:N \l_@@_tmp_box }
+    \int_const:cn { c_@@_image_ #1 \l_@@_image_attr_tl _int }
       { \tex_the:D \pdftex_pdflastximage:D }
-    \dim_const:cn { c__image_ #1 \l_@@_image_attr_tl _urx_dim }
-      { \l__image_urx_dim }
-    \dim_const:cn { c__image_ #1 \l_@@_image_attr_tl _ury_dim }
-      { \l__image_ury_dim }
+    \image_bb_save:x { #1 \l_@@_image_attr_tl }
   }
 %    \end{macrocode}
 % \end{macro}
@@ -1555,7 +1547,7 @@
 \cs_new_protected:Npn \@@_image_include_jpg:n #1
   {
     \pdftex_pdfrefximage:D
-      \int_use:c { c__image_ #1 \l_@@_image_attr_tl _int }
+      \int_use:c { c_@@_image_ #1 \l_@@_image_attr_tl _int }
   }
 \cs_new_eq:NN \@@_image_include_pdf:n \@@_image_include_jpg:n
 \cs_new_eq:NN \@@_image_include_png:n \@@_image_include_jpg:n
@@ -1603,11 +1595,11 @@
 %
 % \subsubsection{Box operations}
 %
-% \begin{macro}{\@@_box_use_clip:N}
-%   The code here is idential to that for \texttt{pdfmode}: unlike rotation and
+% \begin{macro}{\driver_box_use_clip:N}
+%   The code here is identical to that for \texttt{pdfmode}: unlike rotation and
 %   scaling, there is no higher-level support in the driver for clipping.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_box_use_clip:N #1
+\cs_new_protected:Npn \driver_box_use_clip:N #1
   {
     \@@_scope_begin:
     \@@_literal:n
@@ -1625,7 +1617,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\@@_box_use_rotate:Nn}
+% \begin{macro}{\driver_box_use_rotate:Nn}
 %   Rotating in \texttt{(x)}dvipdmfx can be implemented using either PDF or
 %   driver-specific code. The former approach however is not \enquote{aware}
 %   of the content of boxes: this means that any embedded links would not be
@@ -1634,7 +1626,7 @@
 %   version (notice the rotation angle here is positive). As for
 %   \texttt{dvips}, zero rotation is written as |0| not |-0|.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_box_use_rotate:Nn #1#2
+\cs_new_protected:Npn \driver_box_use_rotate:Nn #1#2
   {
     \@@_scope_begin:
     \tex_special:D
@@ -1650,11 +1642,11 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\@@_box_use_scale:Nnn}
+% \begin{macro}{\driver_box_use_scale:Nnn}
 %   Much the same idea for scaling: use the higher-level driver operation to allow
 %   for box content.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_box_use_scale:Nnn #1#2#3
+\cs_new_protected:Npn \driver_box_use_scale:Nnn #1#2#3
   {
     \@@_scope_begin:
     \tex_special:D
@@ -1679,20 +1671,20 @@
 %   Simply use the generic functions: only for \texttt{dvipdfmx} in the
 %   extraction cases.
 %    \begin{macrocode}
-\cs_new_eq:NN \@@_image_getbb_eps:n \__image_read_bb:n
+\cs_new_eq:NN \@@_image_getbb_eps:n \image_read_bb:n
 %<*dvipdfmx>
 \cs_new_protected:Npn \@@_image_getbb_jpg:n #1
   {
-    \int_zero:N \l__image_page_int
-    \tl_clear:N \l__image_pagebox_tl
-    \__image_extract_bb:n {#1}
+    \int_zero:N \l_image_page_int
+    \tl_clear:N \l_image_pagebox_tl
+    \image_extract_bb:n {#1}
   }
 \cs_new_eq:NN \@@_image_getbb_png:n \@@_image_getbb_jpg:n
 \cs_new_protected:Npn \@@_image_getbb_pdf:n #1
   {
-    \tl_clear:N \l__image_decode_tl
-    \bool_set_false:N \l__image_interpolate_bool
-    \__image_extract_bb:n {#1}
+    \tl_clear:N \l_image_decode_tl
+    \bool_set_false:N \l_image_interpolate_bool
+    \image_extract_bb:n {#1}
   }
 %</dvipdfmx>
 %    \end{macrocode}
@@ -1739,13 +1731,13 @@
   {
     \@@_image_include_auxii:xnn
       {
-        \tl_if_empty:NF \l__image_pagebox_tl
-          { : \l__image_pagebox_tl }
-        \int_compare:nNnT \l__image_page_int > 1
-          { :P \int_use:N \l__image_page_int }
-        \tl_if_empty:NF \l__image_decode_tl
-          { :D \l__image_decode_tl }
-        \bool_if:NT \l__image_interpolate_bool
+        \tl_if_empty:NF \l_image_pagebox_tl
+          { : \l_image_pagebox_tl }
+        \int_compare:nNnT \l_image_page_int > 1
+          { :P \int_use:N \l_image_page_int }
+        \tl_if_empty:NF \l_image_decode_tl
+          { :D \l_image_decodearray_tl }
+        \bool_if:NT \l_image_interpolate_bool
            { :I }
       }
       {#1} {#2}
@@ -1752,10 +1744,10 @@
   }
 \cs_new_protected:Npn \@@_image_include_auxii:nnn #1#2#3
   {
-    \int_if_exist:cTF { c__image_ #2#1 _int }
+    \int_if_exist:cTF { c_@@_image_ #2#1 _int }
       {
         \tex_special:D
-          { pdf:usexobj~@image \int_use:c { c__image_ #2#1 _int } }
+          { pdf:usexobj~@image \int_use:c { c_@@_image_ #2#1 _int } }
       }
       { \@@_image_include_auxiii:nn {#2} {#1} {#3} }
   }
@@ -1769,31 +1761,31 @@
 \cs_new_protected:Npn \@@_image_include_auxiii:nnn #1#2#3
   {
     \int_gincr:N \g_@@_image_int
-    \int_const:cn { c__image_ #1#2 _int } { \g_@@_image_int }
+    \int_const:cn { c_@@_image_ #1#2 _int } { \g_@@_image_int }
     \tex_special:D
       {
         pdf:#3~
-        @image \int_use:c { c__image_ #1#2 _int }
-        \int_compare:nNnT \l__image_page_int > 1
-          { page ~ \int_use:N \l__image_page_int \c_space_tl }
-        \tl_if_empty:NF \l__image_pagebox_tl
+        @image \int_use:c { c_@@_image_ #1#2 _int }
+        \int_compare:nNnT \l_image_page_int > 1
+          { page ~ \int_use:N \l_image_page_int \c_space_tl }
+        \tl_if_empty:NF \l_image_pagebox_tl
           {
-            pagebox ~ \l__image_pagebox_tl \c_space_tl
+            pagebox ~ \l_image_pagebox_tl \c_space_tl
             bbox ~
-              \dim_to_decimal_in_bp:n \l__image_llx_dim \c_space_tl
-              \dim_to_decimal_in_bp:n \l__image_lly_dim \c_space_tl
-              \dim_to_decimal_in_bp:n \l__image_urx_dim \c_space_tl
-              \dim_to_decimal_in_bp:n \l__image_ury_dim \c_space_tl
+              \dim_to_decimal_in_bp:n \l_image_llx_dim \c_space_tl
+              \dim_to_decimal_in_bp:n \l_image_lly_dim \c_space_tl
+              \dim_to_decimal_in_bp:n \l_image_urx_dim \c_space_tl
+              \dim_to_decimal_in_bp:n \l_image_ury_dim \c_space_tl
           }
         (#1)
         \bool_lazy_or:nnT
-          { \l__image_interpolate_bool }
-          { ! \tl_if_empty_p:N \l__image_decode_tl }
+          { \l_image_interpolate_bool }
+          { ! \tl_if_empty_p:N \l_image_decodearray_tl }
           {
             <<
-              \tl_if_empty:NF \l__image_decode_tl
-                { /Decode~[ \l__image_decode_tl ] }
-              \bool_if:NT \l__image_interpolate_bool
+              \tl_if_empty:NF \l_image_decode_tl
+                { /Decode~[ \l_image_decodearray_tl ] }
+              \bool_if:NT \l_image_interpolate_bool
                 { /Interpolate~true> }
             >>
           }
@@ -1833,21 +1825,21 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_image_getbb_jpg:n #1
   {
-    \int_zero:N \l__image_page_int
-    \tl_clear:N \l__image_pagebox_tl
+    \int_zero:N \l_image_page_int
+    \tl_clear:N \l_image_pagebox_tl
     \@@_image_getbb_auxi:nN {#1} \xetex_picfile:D
   }
 \cs_new_eq:NN \@@_image_getbb_png:n \@@_image_getbb_jpg:n
 \cs_new_protected:Npn \@@_image_getbb_pdf:n #1
   {
-    \tl_clear:N \l__image_decode_tl
-    \bool_set_false:N \l__image_interpolate_bool
+    \tl_clear:N \l_image_decode_tl
+    \bool_set_false:N \l_image_interpolate_bool
     \@@_image_getbb_auxi:nN {#1} \xetex_pdffile:D
   }
 \cs_new_protected:Npn \@@_image_getbb_auxi:nN #1#2
   {
-    \int_compare:nNnTF \l__image_page_int > 1
-      { \@@_image_getbb_auxii:VnN \l__image_page_int {#1} #2  }
+    \int_compare:nNnTF \l_image_page_int > 1
+      { \@@_image_getbb_auxii:VnN \l_image_page_int {#1} #2  }
       { \@@_image_getbb_auxiii:nNnn {#1} #2 }
   }
 \cs_new_protected:Npn \@@_image_getbb_auxii:nnN #1#2#3
@@ -1855,8 +1847,8 @@
 \cs_generate_variant:Nn \@@_image_getbb_auxii:nnN { V }
 \cs_new_protected:Npn \@@_image_getbb_auxiii:nNnn #1#2#3#4
   {
-    \tl_if_empty:NTF \l__image_pagebox_tl
-      { \@@_image_getbb_auxiv:VnNnn \l__image_pagebox_tl }
+    \tl_if_empty:NTF \l_image_pagebox_tl
+      { \@@_image_getbb_auxiv:VnNnn \l_image_pagebox_tl }
       { \@@_image_getbb_auxv:nNnn }
       {#1} #2 {#3} {#4}
   }
@@ -1871,24 +1863,15 @@
 \cs_generate_variant:Nn \@@_image_getbb_auxiv:nnNnn { V }
 \cs_new_protected:Npn \@@_image_getbb_auxv:nNnn #1#2#3#4
   {
-    \dim_zero:N \l__image_llx_dim
-    \dim_zero:N \l__image_lly_dim
-    \dim_if_exist:cTF { c__image_ #1#3 _urx_dim }
-      {
-        \dim_set_eq:Nc \l__image_urx_dim { c__image_ #1#3 _urx_dim }
-        \dim_set_eq:Nc \l__image_ury_dim { c__image_ #1#3 _ury_dim }
-      }
+    \image_bb_restore:nF {#1#3}
       { \@@_image_getbb_auxvi:nNnn {#1} #2 {#3} {#4} }
   }
 \cs_new_protected:Npn \@@_image_getbb_auxvi:nNnn #1#2#3#4
   {
-    \hbox_set:Nn \l__image_tmp_box { #2 #1 ~ #4 }
-    \dim_set:Nn \l__image_utx_dim { \box_wd:N \l__image_tmp_box }
-    \dim_set:Nn \l__image_ury_dim { \box_ht:N \l__image_tmp_box }
-    \dim_const:cn { c__image_ #1#3 _urx_dim }
-      { \l__image_urx_dim }
-    \dim_const:cn { c__image_ #1#3 _ury_dim }
-      { \l__image_ury_dim }
+    \hbox_set:Nn \l_@@_tmp_box { #2 #1 ~ #4 }
+    \dim_set:Nn \l_image_utx_dim { \box_wd:N \l_@@_tmp_box }
+    \dim_set:Nn \l_image_ury_dim { \box_ht:N \l_@@_tmp_box }
+    \image_bb_save:n {#1#3}
   }
 \cs_new:Npn \@@_image_getbb_pagebox:w #1 box {#1}
 %    \end{macrocode}
@@ -1904,14 +1887,14 @@
 %   For PDF images, properly supporting the |pagebox| concept in \XeTeX{}
 %   is best done using the |\xetex_pdffile:D| primitive. The syntax here
 %   is the same as for the image measurement part, although we know at this
-%   stage that there must be some valid setting for \cs{l__image_pagebox_tl}.
+%   stage that there must be some valid setting for \cs{l_image_pagebox_tl}.
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_image_include_pdf:n #1
   {
     \xetex_pdffile:D "#1" ~
-      \int_compare:nNnT \l__image_page_int > 0
-        { page~ \int_use:N \l__image_page_int }
-      \@@_image_getbb_auxiv:VnNnn \l__image_pagebox_tl
+      \int_compare:nNnT \l_image_page_int > 0
+        { page~ \int_use:N \l_image_page_int }
+      \@@_image_getbb_auxiv:VnNnn \l_image_pagebox_tl
   }
 %    \end{macrocode}
 % \end{macro}
@@ -1939,46 +1922,46 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\@@_draw_begin:, \@@_draw_end:}
+% \begin{macro}{\driver_draw_begin:, \driver_draw_end:}
 %   No special requirements here, so simply set up a drawing scope.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_draw_begin:
-  { \@@_draw_scope_begin: }
-\cs_new_protected:Npn \@@_draw_end:
-  { \@@_draw_scope_end: }
+\cs_new_protected:Npn \driver_draw_begin:
+  { \driver_draw_scope_begin: }
+\cs_new_protected:Npn \driver_draw_end:
+  { \driver_draw_scope_end: }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\@@_draw_scope_begin:, \@@_draw_scope_end:}
+% \begin{macro}{\driver_draw_scope_begin:, \driver_draw_scope_end:}
 %   In contrast to a general scope, a drawing scope is always done using
 %   the PDF operators so is the same for all relevant drivers.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_draw_scope_begin:
+\cs_new_protected:Npn \driver_draw_scope_begin:
   { \@@_draw_literal:n { q } }
-\cs_new_protected:Npn \@@_draw_scope_end:
+\cs_new_protected:Npn \driver_draw_scope_end:
   { \@@_draw_literal:n { Q } }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\@@_draw_moveto:nn, \@@_draw_lineto:nn}
-% \begin{macro}{\@@_draw_curveto:nnnnnn}
-% \begin{macro}{\@@_draw_rectangle:nnnn}
+% \begin{macro}{\driver_draw_moveto:nn, \driver_draw_lineto:nn}
+% \begin{macro}{\driver_draw_curveto:nnnnnn}
+% \begin{macro}{\driver_draw_rectangle:nnnn}
 %   Path creation operations all resolve directly to PDF primitive steps, with
 %   only the need to convert to \texttt{bp}. Notice that \texttt{x}-type
 %   expansion is included here to ensure that any variable values are
 %   forced to literals before any possible caching.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_draw_moveto:nn #1#2
+\cs_new_protected:Npn \driver_draw_moveto:nn #1#2
   {
     \@@_draw_literal:x
       { \dim_to_decimal_in_bp:n {#1} ~ \dim_to_decimal_in_bp:n {#2} ~ m }
   }
-\cs_new_protected:Npn \@@_draw_lineto:nn #1#2
+\cs_new_protected:Npn \driver_draw_lineto:nn #1#2
   {
     \@@_draw_literal:x
       { \dim_to_decimal_in_bp:n {#1} ~ \dim_to_decimal_in_bp:n {#2} ~ l }
   }
-\cs_new_protected:Npn \@@_draw_curveto:nnnnnn #1#2#3#4#5#6
+\cs_new_protected:Npn \driver_draw_curveto:nnnnnn #1#2#3#4#5#6
   {
     \@@_draw_literal:x
       {
@@ -1988,7 +1971,7 @@
         c
       }
  }
-\cs_new_protected:Npn \@@_draw_rectangle:nnnn #1#2#3#4
+\cs_new_protected:Npn \driver_draw_rectangle:nnnn #1#2#3#4
   {
      \@@_draw_literal:x
       {
@@ -2002,13 +1985,13 @@
 % \end{macro}
 % \end{macro}
 %
-% \begin{macro}{\@@_draw_evenodd_rule:, \@@_draw_nonzero_rule:}
+% \begin{macro}{\driver_draw_evenodd_rule:, \driver_draw_nonzero_rule:}
 % \begin{variable}{\g_@@_draw_eor_bool}
 %    The even-odd rule here can be implemented as a simply switch.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_draw_evenodd_rule:
+\cs_new_protected:Npn \driver_draw_evenodd_rule:
   { \bool_gset_true:N \g_@@_draw_eor_bool }
-\cs_new_protected:Npn \@@_draw_nonzero_rule:
+\cs_new_protected:Npn \driver_draw_nonzero_rule:
   { \bool_gset_false:N \g_@@_draw_eor_bool }
 \bool_new:N \g_@@_draw_eor_bool
 %    \end{macrocode}
@@ -2017,56 +2000,56 @@
 %
 % \begin{macro}
 %   {
-%     \@@_draw_closepath:   ,
-%     \@@_draw_stroke:      ,
-%     \@@_draw_closestroke: ,
-%     \@@_draw_fill:        ,
-%     \@@_draw_fillstroke:  ,
-%     \@@_draw_clip:        ,
-%     \@@_draw_discardpath:
+%     \driver_draw_closepath:   ,
+%     \driver_draw_stroke:      ,
+%     \driver_draw_closestroke: ,
+%     \driver_draw_fill:        ,
+%     \driver_draw_fillstroke:  ,
+%     \driver_draw_clip:        ,
+%     \driver_draw_discardpath:
 %   }
 %   Converting paths to output is again a case of mapping directly to
 %   PDF operations.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_draw_closepath:
+\cs_new_protected:Npn \driver_draw_closepath:
   { \@@_draw_literal:n { h } }
-\cs_new_protected:Npn \@@_draw_stroke:
+\cs_new_protected:Npn \driver_draw_stroke:
   { \@@_draw_literal:n { S } }
-\cs_new_protected:Npn \@@_draw_closestroke:
+\cs_new_protected:Npn \driver_draw_closestroke:
   { \@@_draw_literal:n { s } }
-\cs_new_protected:Npn \@@_draw_fill:
+\cs_new_protected:Npn \driver_draw_fill:
   {
     \@@_draw_literal:x
       { f \bool_if:NT \g_@@_draw_eor_bool * }
   }
-\cs_new_protected:Npn \@@_draw_fillstroke:
+\cs_new_protected:Npn \driver_draw_fillstroke:
   {
     \@@_draw_literal:x
       { B \bool_if:NT \g_@@_draw_eor_bool * }
   }
-\cs_new_protected:Npn \@@_draw_clip:
+\cs_new_protected:Npn \driver_draw_clip:
   {
     \@@_draw_literal:x
       { W \bool_if:NT \g_@@_draw_eor_bool * }
   }
-\cs_new_protected:Npn \@@_draw_discardpath:
+\cs_new_protected:Npn \driver_draw_discardpath:
   { \@@_draw_literal:n { n } }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\@@_draw_dash:nn}
+% \begin{macro}{\driver_draw_cap_dash:nn}
 % \begin{macro}{\@@_draw_dash:n}
-% \begin{macro}{\@@_draw_linewidth:n}
-% \begin{macro}{\@@_draw_miterlimit:n}
+% \begin{macro}{\driver_draw_linewidth:n}
+% \begin{macro}{\driver_draw_miterlimit:n}
 % \begin{macro}
 %   {
-%     \@@_draw_cap_butt:, \@@_draw_cap_round:, \@@_draw_cap_rectangle:,
-%     \@@_draw_join_miter:, \@@_draw_join_round:, \@@_draw_join_bevel:
+%     \driver_draw_cap_butt:, \driver_draw_cap_round:, \driver_draw_cap_rectangle:,
+%     \driver_draw_join_miter:, \driver_draw_join_round:, \driver_draw_join_bevel:
 %   }
 %   Converting paths to output is again a case of mapping directly to
 %   PDF operations.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_draw_dash:nn #1#2
+\cs_new_protected:Npn \driver_draw_cap_dash:nn #1#2
   {
     \@@_draw_literal:x
       {
@@ -2078,24 +2061,24 @@
   }
 \cs_new:Npn \@@_draw_dash:n #1
   { \dim_to_decimal_in_bp:n {#1} ~ }
-\cs_new_protected:Npn \@@_draw_linewidth:n #1
+\cs_new_protected:Npn \driver_draw_linewidth:n #1
   {
     \@@_draw_literal:x
       { \dim_to_decimal_in_bp:n {#1} ~ w }
   }
-\cs_new_protected:Npn \@@_draw_miterlimit:n #1
+\cs_new_protected:Npn \driver_draw_miterlimit:n #1
   { \@@_draw_literal:x { \fp_eval:n {#1} ~ M } }
-\cs_new_protected:Npn \@@_draw_cap_butt:
+\cs_new_protected:Npn \driver_draw_cap_butt:
   { \@@_draw_literal:n { 0 ~ J } }
-\cs_new_protected:Npn \@@_draw_cap_round:
+\cs_new_protected:Npn \driver_draw_cap_round:
   { \@@_draw_literal:n { 1 ~ J } }
-\cs_new_protected:Npn \@@_draw_cap_rectangle:
+\cs_new_protected:Npn \driver_draw_cap_rectangle:
   { \@@_draw_literal:n { 2 ~ J } }
-\cs_new_protected:Npn \@@_draw_join_miter:
+\cs_new_protected:Npn \driver_draw_join_miter:
   { \@@_draw_literal:n { 0 ~ j } }
-\cs_new_protected:Npn \@@_draw_join_round:
+\cs_new_protected:Npn \driver_draw_join_round:
   { \@@_draw_literal:n { 1 ~ j } }
-\cs_new_protected:Npn \@@_draw_join_bevel:
+\cs_new_protected:Npn \driver_draw_join_bevel:
   { \@@_draw_literal:n { 2 ~ j } }
 %    \end{macrocode}
 % \end{macro}
@@ -2106,29 +2089,29 @@
 %
 % \begin{macro}
 %   {
-%     \@@_draw_color_cmyk:nnnn        ,
-%     \@@_draw_color_cmyk_fill:nnnn   ,
-%     \@@_draw_color_cmyk_stroke:nnnn
+%     \driver_draw_color_cmyk:nnnn        ,
+%     \driver_draw_fill_cmyk:nnnn   ,
+%     \driver_draw_stroke_cmyk:nnnn
 %   }
 % \begin{macro}{\@@_draw_color_cmyk_aux:nnnn}
 % \begin{macro}
 %   {
-%     \@@_draw_color_gray:n        ,
-%     \@@_draw_color_gray_fill:n   ,
-%     \@@_draw_color_gray_stroke:n
+%     \driver_draw_color_gray:n        ,
+%     \driver_draw_fill_gray:n   ,
+%     \driver_draw_stroke_gray:n
 %   }
 % \begin{macro}{\@@_draw_color_gray_aux:n}
 % \begin{macro}
 %   {
-%     \@@_draw_color_rgb:nnn        ,
-%     \@@_draw_color_rgb_fill:nnn   ,
-%     \@@_draw_color_rgb_stroke:nnn
+%     \driver_draw_color_rgb:nnn        ,
+%     \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 \@@_draw_color_cmyk:nnnn #1#2#3#4
+\cs_new_protected:Npn \driver_draw_color_cmyk:nnnn #1#2#3#4
   {
     \use:x
       {
@@ -2144,7 +2127,7 @@
     \@@_draw_literal:n
       { #1 ~ #2 ~ #3 ~ #4 ~ k ~ #1 ~ #2 ~ #3 ~ #4 ~ K }
   }
-\cs_new_protected:Npn \@@_draw_color_cmyk_fill:nnnn #1#2#3#4
+\cs_new_protected:Npn \driver_draw_fill_cmyk:nnnn #1#2#3#4
   {
     \@@_draw_literal:x
       {
@@ -2153,7 +2136,7 @@
         k
       }
   }
-\cs_new_protected:Npn \@@_draw_color_cmyk_stroke:nnnn #1#2#3#4
+\cs_new_protected:Npn \driver_draw_stroke_cmyk:nnnn #1#2#3#4
   {
     \@@_draw_literal:x
       {
@@ -2162,7 +2145,7 @@
         K
       }
   }
-\cs_new_protected:Npn \@@_draw_color_gray:n #1
+\cs_new_protected:Npn \driver_draw_color_gray:n #1
   {
     \use:x
       { \@@_draw_color_gray_aux:n { \fp_eval:n {#1} } }
@@ -2171,11 +2154,11 @@
   {
     \@@_draw_literal:n { #1 ~ g ~ #1 ~ G }
   }
-\cs_new_protected:Npn \@@_draw_color_gray_fill:n #1
+\cs_new_protected:Npn \driver_draw_fill_gray:n #1
   { \@@_draw_literal:x { \fp_eval:n {#1} ~ g } }
-\cs_new_protected:Npn \@@_draw_color_gray_stroke:n #1
+\cs_new_protected:Npn \driver_draw_stroke_gray:n #1
   { \@@_draw_literal:x { \fp_eval:n {#1} ~ G } }
-\cs_new_protected:Npn \@@_draw_color_rgb:nnn #1#2#3
+\cs_new_protected:Npn \driver_draw_color_rgb:nnn #1#2#3
   {
     \use:x
       {
@@ -2190,12 +2173,12 @@
     \@@_draw_literal:n
       { #1 ~ #2 ~ #3 ~ rg ~ #1 ~ #2 ~ #3 ~ RG }
   }
-\cs_new_protected:Npn \@@_draw_color_rgb_fill:nnn #1#2#3
+\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 }
   }
-\cs_new_protected:Npn \@@_draw_color_rgb_stroke:nnn #1#2#3
+\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 }
@@ -2208,12 +2191,12 @@
 % \end{macro}
 % \end{macro}
 %
-% \begin{macro}{\@@_draw_transformcm:nnnnnn}
+% \begin{macro}{\driver_draw_transformcm:nnnnnn}
 %   The first four arguments here are floats (the affine matrix), the last
 %   two are a displacement vector. Once again, force evaluation to allow for
 %   caching.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_draw_transformcm:nnnnnn #1#2#3#4#5#6
+\cs_new_protected:Npn \driver_draw_transformcm:nnnnnn #1#2#3#4#5#6
   {
     \@@_draw_literal:x
       {
@@ -2226,7 +2209,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\@@_draw_hbox:Nnnnnnn}
+% \begin{macro}{\driver_draw_hbox:Nnnnnnn}
 % \begin{variable}{\l_@@_tmp_box}
 %   Inserting a \TeX{} box transformed to the requested position and using
 %   the current matrix is done using a mixture of \TeX{} and low-level
@@ -2235,13 +2218,13 @@
 %   operation can never be cached, the scope is set directly not using the
 %   \texttt{draw} version.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_draw_hbox:Nnnnnnn #1#2#3#4#5#6#7
+\cs_new_protected:Npn \driver_draw_hbox:Nnnnnnn #1#2#3#4#5#6#7
   {
     \hbox_set:Nn \l_@@_tmp_box
       {
         \tex_kern:D \__dim_eval:n {#6}
         \@@_scope_begin:
-        \@@_draw_transformcm:nnnnnn {#2} {#3} {#4} {#5}
+        \driver_draw_transformcm:nnnnnn {#2} {#3} {#4} {#5}
           { 0pt } { 0pt }
         \box_move_up:nn {#7} { \box_use:N #1 }
         \@@_scope_end:
@@ -2306,7 +2289,7 @@
 %
 % \subsubsection{Box operations}
 %
-% \begin{macro}{\@@_box_use_clip:N}
+% \begin{macro}{\driver_box_use_clip:N}
 % \begin{variable}{\g_@@_clip_path_int}
 %   Clipping in SVG is more involved than with other drivers. The first issue
 %   is that the clipping path must be defined separately from where it is used,
@@ -2317,7 +2300,7 @@
 %   up and down using scopes to allow for the depth of the \TeX{} box and
 %   keep the reference point the same!
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_box_use_clip:N #1
+\cs_new_protected:Npn \driver_box_use_clip:N #1
   {
     \int_gincr:N \g_@@_clip_path_int
     \@@_literal:n
@@ -2381,12 +2364,12 @@
 % \end{variable}
 % \end{macro}
 %
-% \begin{macro}{\@@_box_use_rotate:Nn}
+% \begin{macro}{\driver_box_use_rotate:Nn}
 %   Rotation has a dedicated operation which includes a centre-of-rotation
 %   optional pair. That can be picked up from the driver syntax, so there is
 %   no need to worry about the transformation matrix.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_box_use_rotate:Nn #1#2
+\cs_new_protected:Npn \driver_box_use_rotate:Nn #1#2
   {
     \@@_scope_begin:n
       {
@@ -2402,12 +2385,12 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\@@_box_use_scale:Nnn}
+% \begin{macro}{\driver_box_use_scale:Nnn}
 %   In contrast to rotation, we have to account for the current position in this
 %   case. That is done using a couple of translations in addition to the scaling
 %   (which is therefore done backward with a flip).
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_box_use_scale:Nnn #1#2#3
+\cs_new_protected:Npn \driver_box_use_scale:Nnn #1#2#3
   {
     \@@_scope_begin:n
       {
@@ -2434,8 +2417,8 @@
 % \begin{macro}{\@@_image_getbb_png:n, \@@_image_getbb_jpg:n}
 %   These can be included by extracting the bounding box data.
 %    \begin{macrocode}
-\cs_new_eq:NN \@@_image_getbb_png:n \__image_extract_bb:n
-\cs_new_eq:NN \@@_image_getbb_jpg:n \__image_extract_bb:n
+\cs_new_eq:NN \@@_image_getbb_png:n \image_extract_bb:n
+\cs_new_eq:NN \@@_image_getbb_jpg:n \image_extract_bb:n
 %    \end{macrocode}
 % \end{macro}
 %
@@ -2453,8 +2436,8 @@
      \tex_special:D
        {
          dvisvgm:img~
-         \dim_to_decimal:n { \l__image_ury_dim } ~
-         \dim_to_decimal:n { \l__image_ury_dim } ~
+         \dim_to_decimal:n { \l_image_ury_dim } ~
+         \dim_to_decimal:n { \l_image_ury_dim } ~
          \@@_image_include_bitmap_quote:w #1 " " \q_stop
        }
   }
@@ -2474,21 +2457,21 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\@@_draw_begin:, \@@_draw_end:}
+% \begin{macro}{\driver_draw_begin:, \driver_draw_end:}
 %   A drawing needs to be set up such that the co-ordinate system is
 %   translated. That is done inside a scope, which as described below
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_draw_begin:
+\cs_new_protected:Npn \driver_draw_begin:
   {
-    \@@_draw_scope_begin:
+    \driver_draw_scope_begin:
     \@@_draw_scope:n { transform="translate({?x},{?y})~scale(1,-1)" }
   }
-\cs_new_protected:Npn \@@_draw_end:
-  { \@@_draw_scope_end: }
+\cs_new_protected:Npn \driver_draw_end:
+  { \driver_draw_scope_end: }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\@@_draw_scope_begin:, \@@_draw_scope_end:}
+% \begin{macro}{\driver_draw_scope_begin:, \driver_draw_scope_end:}
 % \begin{macro}{\@@_draw_scope:n, \@@_draw_scope:x}
 % \begin{variable}{\g_@@_draw_scope_int, \l_@@_draw_scope_int}
 %   Several settings that with other drivers are \enquote{stand alone} have
@@ -2499,7 +2482,7 @@
 %   used to save the value between scopes. The result is that no direct action
 %   is needed when creating a scope.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_draw_scope_begin:
+\cs_new_protected:Npn \driver_draw_scope_begin:
   {
     \int_set_eq:NN
       \l_@@_draw_scope_int
@@ -2507,7 +2490,7 @@
     \group_begin:
       \int_gzero:N \g_@@_draw_scope_int
   }
-\cs_new_protected:Npn \@@_draw_scope_end:
+\cs_new_protected:Npn \driver_draw_scope_end:
   {
       \prg_replicate:nn
         { \g_@@_draw_scope_int }
@@ -2530,9 +2513,9 @@
 % \end{macro}
 % \end{macro}
 %
-% \begin{macro}{\@@_draw_moveto:nn, \@@_draw_lineto:nn}
-% \begin{macro}{\@@_draw_rectangle:nnnn}
-% \begin{macro}{\@@_draw_curveto:nnnnnn}
+% \begin{macro}{\driver_draw_moveto:nn, \driver_draw_lineto:nn}
+% \begin{macro}{\driver_draw_rectangle:nnnn}
+% \begin{macro}{\driver_draw_curveto:nnnnnn}
 % \begin{macro}{\@@_draw_add_to_path:n}
 % \begin{variable}{\g_@@_draw_path_tl}
 %   Once again, some work is needed to get path constructs correct. Rather
@@ -2542,17 +2525,17 @@
 %   be fully expanded there is no need to worry about the internal
 %   \texttt{x}-type expansion.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_draw_moveto:nn #1#2
+\cs_new_protected:Npn \driver_draw_moveto:nn #1#2
   {
     \@@_draw_add_to_path:n
       { M ~ \dim_to_decimal:n {#1} ~ \dim_to_decimal:n {#2} }
   }
-\cs_new_protected:Npn \@@_draw_lineto:nn #1#2
+\cs_new_protected:Npn \driver_draw_lineto:nn #1#2
   {
     \@@_draw_add_to_path:n
       { L ~ \dim_to_decimal:n {#1} ~ \dim_to_decimal:n {#2} }
   }
-\cs_new_protected:Npn \@@_draw_rectangle:nnnn #1#2#3#4
+\cs_new_protected:Npn \driver_draw_rectangle:nnnn #1#2#3#4
   {
     \@@_draw_add_to_path:n
       {
@@ -2563,7 +2546,7 @@
         Z
       }
   }
-\cs_new_protected:Npn \@@_draw_curveto:nnnnnn #1#2#3#4#5#6
+\cs_new_protected:Npn \driver_draw_curveto:nnnnnn #1#2#3#4#5#6
   {
     \@@_draw_add_to_path:n
       {
@@ -2590,12 +2573,12 @@
 % \end{macro}
 % \end{macro}
 %
-% \begin{macro}{\@@_draw_evenodd_rule:, \@@_draw_nonzero_rule:}
+% \begin{macro}{\driver_draw_evenodd_rule:, \driver_draw_nonzero_rule:}
 %   The fill rules here have to be handled as scopes.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_draw_evenodd_rule:
+\cs_new_protected:Npn \driver_draw_evenodd_rule:
   { \@@_draw_scope:n { fill-rule="evenodd" } }
-\cs_new_protected:Npn \@@_draw_nonzero_rule:
+\cs_new_protected:Npn \driver_draw_nonzero_rule:
   { \@@_draw_scope:n { fill-rule="nonzero" } }
 %    \end{macrocode}
 % \end{macro}
@@ -2603,13 +2586,13 @@
 % \begin{macro}{\@@_draw_path:n}
 % \begin{macro}
 %   {
-%     \@@_draw_closepath:   ,
-%     \@@_draw_stroke:      ,
-%     \@@_draw_closestroke: ,
-%     \@@_draw_fill:        ,
-%     \@@_draw_fillstroke:  ,
-%     \@@_draw_clip:        ,
-%     \@@_draw_discardpath:
+%     \driver_draw_closepath:   ,
+%     \driver_draw_stroke:      ,
+%     \driver_draw_closestroke: ,
+%     \driver_draw_fill:        ,
+%     \driver_draw_fillstroke:  ,
+%     \driver_draw_clip:        ,
+%     \driver_draw_discardpath:
 %   }
 % \begin{variable}{\g_@@_draw_clip_bool}
 % \begin{variable}{\g_@@_draw_path_int}
@@ -2619,7 +2602,7 @@
 %   for path drawing: not essential but avoids constructing them twice.
 %   Discarding a path needs a separate function as it's not quite the same.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_draw_closepath:
+\cs_new_protected:Npn \driver_draw_closepath:
   { \@@_draw_add_to_path:n { Z } }
 \cs_new_protected:Npn \@@_draw_path:n #1
   {
@@ -2652,21 +2635,21 @@
     \bool_gset_false:N \g_@@_draw_clip_bool
   }
 \int_new:N \g_@@_path_int
-\cs_new_protected:Npn \@@_draw_stroke:
+\cs_new_protected:Npn \driver_draw_stroke:
   { \@@_draw_path:n { style="fill:none" } }
-\cs_new_protected:Npn \@@_draw_closestroke:
+\cs_new_protected:Npn \driver_draw_closestroke:
   {
-    \@@_draw_closepath:
-    \@@_draw_stroke:
+    \driver_draw_closepath:
+    \driver_draw_stroke:
   }
-\cs_new_protected:Npn \@@_draw_fill:
+\cs_new_protected:Npn \driver_draw_fill:
   { \@@_draw_path:n { style="stroke:none" } }
-\cs_new_protected:Npn \@@_draw_fillstroke:
+\cs_new_protected:Npn \driver_draw_fillstroke:
   { \@@_draw_path:n { } }
-\cs_new_protected:Npn \@@_draw_clip:
+\cs_new_protected:Npn \driver_draw_clip:
   { \bool_gset_true:N \g_@@_draw_clip_bool }
 \bool_new:N \g_@@_draw_clip_bool
-\cs_new_protected:Npn \@@_draw_discardpath:
+\cs_new_protected:Npn \driver_draw_discardpath:
   {
     \bool_if:NT \g_@@_draw_clip_bool
       {
@@ -2693,21 +2676,21 @@
 % \end{macro}
 % \end{macro}
 %
-% \begin{macro}{\@@_draw_dash:nn}
+% \begin{macro}{\driver_draw_cap_dash:nn}
 % \begin{macro}{\@@_draw_dash:n}
 % \begin{macro}{\@@_draw_dash_aux:nn}
-% \begin{macro}{\@@_draw_linewidth:n}
-% \begin{macro}{\@@_draw_miterlimit:n}
+% \begin{macro}{\driver_draw_linewidth:n}
+% \begin{macro}{\driver_draw_miterlimit:n}
 % \begin{macro}
 %   {
-%     \@@_draw_cap_butt:, \@@_draw_cap_round:, \@@_draw_cap_rectangle:,
-%     \@@_draw_join_miter:, \@@_draw_join_round:, \@@_draw_join_bevel:
+%     \driver_draw_cap_butt:, \driver_draw_cap_round:, \driver_draw_cap_rectangle:,
+%     \driver_draw_join_miter:, \driver_draw_join_round:, \driver_draw_join_bevel:
 %   }
 %   All of these ideas are properties of scopes in SVG. The only slight
 %   complexity is converting the dash array properly (doing any required
 %   maths).
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_draw_dash:nn #1#2
+\cs_new_protected:Npn \driver_draw_cap_dash:nn #1#2
   {
     \use:x
       {
@@ -2731,21 +2714,21 @@
           stroke-offset=" #2 "
       }
   }
-\cs_new_protected:Npn \@@_draw_linewidth:n #1
+\cs_new_protected:Npn \driver_draw_linewidth:n #1
   { \@@_draw_scope:x { stroke-width=" \dim_to_decimal:n {#1} " } }
-\cs_new_protected:Npn \@@_draw_miterlimit:n #1
+\cs_new_protected:Npn \driver_draw_miterlimit:n #1
   { \@@_draw_scope:x { stroke-miterlimit=" \fp_eval:n {#1} " } }
-\cs_new_protected:Npn \@@_draw_cap_butt:
+\cs_new_protected:Npn \driver_draw_cap_butt:
   { \@@_draw_scope:n { stroke-linecap="butt" } }
-\cs_new_protected:Npn \@@_draw_cap_round:
+\cs_new_protected:Npn \driver_draw_cap_round:
   { \@@_draw_scope:n { stroke-linecap="round" } }
-\cs_new_protected:Npn \@@_draw_cap_rectangle:
+\cs_new_protected:Npn \driver_draw_cap_rectangle:
   { \@@_draw_scope:n { stroke-linecap="square" } }
-\cs_new_protected:Npn \@@_draw_join_miter:
+\cs_new_protected:Npn \driver_draw_join_miter:
   { \@@_draw_scope:n { stroke-linejoin="miter" } }
-\cs_new_protected:Npn \@@_draw_join_round:
+\cs_new_protected:Npn \driver_draw_join_round:
   { \@@_draw_scope:n { stroke-linejoin="round" } }
-\cs_new_protected:Npn \@@_draw_join_bevel:
+\cs_new_protected:Npn \driver_draw_join_bevel:
   { \@@_draw_scope:n { stroke-linejoin="bevel" } }
 %    \end{macrocode}
 % \end{macro}
@@ -2757,21 +2740,21 @@
 %
 % \begin{macro}
 %   {
-%     \@@_draw_color_cmyk:nnnn        ,
-%     \@@_draw_color_cmyk_fill:nnnn   ,
-%     \@@_draw_color_cmyk_stroke:nnnn
+%     \driver_draw_color_cmyk:nnnn        ,
+%     \driver_draw_fill_cmyk:nnnn   ,
+%     \driver_draw_stroke_cmyk:nnnn
 %   }
 % \begin{macro}
 %   {
-%     \@@_draw_color_gray:n        ,
-%     \@@_draw_color_gray_fill:n   ,
-%     \@@_draw_color_gray_stroke:n
+%     \driver_draw_color_gray:n        ,
+%     \driver_draw_fill_gray:n   ,
+%     \driver_draw_stroke_gray:n
 %   }
 % \begin{macro}
 %   {
-%     \@@_draw_color_rgb:nnn        ,
-%     \@@_draw_color_rgb_fill:nnn   ,
-%     \@@_draw_color_rgb_stroke:nnn
+%     \driver_draw_color_rgb:nnn        ,
+%     \driver_draw_fill_rgb:nnn   ,
+%     \driver_draw_stroke_rgb:nnn
 %   }
 %   SVG only works with RGB colors, so there is some conversion to
 %   do. The values also need to be given as percentages, which means a
@@ -2788,11 +2771,11 @@
       }
       #1 #2
   }
-\cs_new_protected:Npn \@@_draw_color_cmyk:nnnn
+\cs_new_protected:Npn \driver_draw_color_cmyk:nnnn
   { \@@_draw_color_cmyk_aux:NNnnnnn \c_true_bool \c_true_bool }
-\cs_new_protected:Npn \@@_draw_color_cmyk_fill:nnnn
+\cs_new_protected:Npn \driver_draw_fill_cmyk:nnnn
   { \@@_draw_color_cmyk_aux:NNnnnnn \c_false_bool \c_true_bool }
-\cs_new_protected:Npn \@@_draw_color_cmyk_stroke:nnnn
+\cs_new_protected:Npn \driver_draw_stroke_cmyk:nnnn
   { \@@_draw_color_cmyk_aux:NNnnnnn \c_true_bool \c_false_bool }
 \cs_new_protected:Npn \@@_draw_color_gray_aux:NNn #1#2#3
   {
@@ -2806,11 +2789,11 @@
 \cs_new_protected:Npn \@@_draw_color_gray_aux:nNN #1
   { \@@_draw_color_rgb_auxii:nnnNN {#1} {#1} {#1} }
 \cs_generate_variant:Nn \@@_draw_color_gray_aux:nNN { x }
-\cs_new_protected:Npn \@@_draw_color_gray:n
+\cs_new_protected:Npn \driver_draw_color_gray:n
   { \@@_draw_color_gray_aux:NNn \c_true_bool \c_true_bool }
-\cs_new_protected:Npn \@@_draw_color_gray_fill:n
+\cs_new_protected:Npn \driver_draw_fill_gray:n
   { \@@_draw_color_gray_aux:NNn \c_false_bool \c_true_bool }
-\cs_new_protected:Npn \@@_draw_color_gray_stroke:n
+\cs_new_protected:Npn \driver_draw_stroke_gray:n
   { \@@_draw_color_gray_aux:NNn \c_true_bool \c_false_bool }
 \cs_new_protected:Npn \@@_draw_color_rgb_auxi:NNnnn #1#2#3#4#5
   {
@@ -2854,11 +2837,11 @@
           }
       }
   }
-\cs_new_protected:Npn \@@_draw_color_rgb:nnn
+\cs_new_protected:Npn \driver_draw_color_rgb:nnn
   { \@@_draw_color_rgb_auxi:NNnnn \c_true_bool \c_true_bool }
-\cs_new_protected:Npn \@@_draw_color_rgb_fill:nnn
+\cs_new_protected:Npn \driver_draw_fill_rgb:nnn
   { \@@_draw_color_rgb_auxi:NNnnn \c_false_bool \c_true_bool }
-\cs_new_protected:Npn \@@_draw_color_rgb_stroke:nnn
+\cs_new_protected:Npn \driver_draw_stroke_rgb:nnn
   { \@@_draw_color_rgb_auxi:NNnnn \c_true_bool \c_false_bool }
 %    \end{macrocode}
 % \end{macro}
@@ -2865,12 +2848,12 @@
 % \end{macro}
 % \end{macro}
 %
-% \begin{macro}{\@@_draw_transformcm:nnnnnn}
+% \begin{macro}{\driver_draw_transformcm:nnnnnn}
 %   The first four arguments here are floats (the affine matrix), the last
 %   two are a displacement vector. Once again, force evaluation to allow for
 %   caching.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_draw_transformcm:nnnnnn #1#2#3#4#5#6
+\cs_new_protected:Npn \driver_draw_transformcm:nnnnnn #1#2#3#4#5#6
   {
     \@@_draw_scope:x
       {
@@ -2888,15 +2871,15 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\@@_draw_hbox:Nnnnnnn}
+% \begin{macro}{\driver_draw_hbox:Nnnnnnn}
 %   No special savings can be made here: simply displace the box inside
 %   a scope. As there is nothing to re-box, just make the box passed of
 %   zero size.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_draw_hbox:Nnnnnnn #1#2#3#4#5#6#7
+\cs_new_protected:Npn \driver_draw_hbox:Nnnnnnn #1#2#3#4#5#6#7
   {
     \@@_scope_begin:
-    \@@_draw_transformcm:nnnnnn {#2} {#3} {#4} {#5} {#6} {#7}
+    \driver_draw_transformcm:nnnnnn {#2} {#3} {#4} {#5} {#6} {#7}
     \@@_literal:n
       {
         < g~

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %
@@ -120,7 +120,8 @@
 %   denote primitives that should not be used directly.
 % \end{itemize}
 %
-% \begin{function}[updated = 2017-11-28]{\cs_generate_variant:Nn}
+% \begin{function}[updated = 2017-11-28]
+%   {\cs_generate_variant:Nn, \cs_generate_variant:cn}
 %   \begin{syntax}
 %     \cs{cs_generate_variant:Nn} \meta{parent control sequence} \Arg{variant argument specifiers}
 %   \end{syntax}
@@ -1546,7 +1547,7 @@
 %<@@=cs>
 %    \end{macrocode}
 %
-% \begin{macro}{\cs_generate_variant:Nn}
+% \begin{macro}{\cs_generate_variant:Nn, \cs_generate_variant:cn}
 %   \begin{arguments}
 %     \item Base form of a function; \emph{e.g.},~\cs{tl_set:Nn}
 %     \item One or more variant argument specifiers; e.g., |{Nx,c,cx}|
@@ -1570,6 +1571,8 @@
     \exp_after:wN #1
     \tl_to_str:n {#2} , \scan_stop: , \q_recursion_stop
   }
+\cs_new_protected:Npn \cs_generate_variant:cn
+  { \exp_args:Nc \cs_generate_variant:Nn }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -1992,7 +1995,62 @@
 % \end{macro}
 % \end{macro}
 %
+% \begin{macro}
+%   {
+%     \prg_generate_conditional_variant:Nnn,
+%     \@@_generate_variant:nnNnn,
+%     \@@_generate_variant:w,
+%     \@@_generate_variant:n,
+%     \@@_generate_variant_p_form:nnn,
+%     \@@_generate_variant_T_form:nnn,
+%     \@@_generate_variant_F_form:nnn,
+%     \@@_generate_variant_TF_form:nnn,
+%   }
 %    \begin{macrocode}
+\cs_new_protected:Npn \prg_generate_conditional_variant:Nnn #1
+  { \__cs_split_function:NN #1 \@@_generate_variant:nnNnn }
+\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 }
+        { \token_to_str:c {#1} }
+      \use_i_delimit_by_q_stop:nw
+    \fi:
+    \exp_after:wN \@@_generate_variant:w
+    \tl_to_str:n {#5} , \scan_stop: , \q_recursion_stop
+    \use_none_delimit_by_q_stop:w \q_mark {#1} {#2} {#4} \q_stop
+  }
+\cs_new_protected:Npn \@@_generate_variant:w
+    #1 , #2 \q_mark #3#4#5
+  {
+    \if_meaning:w \scan_stop: #1 \scan_stop:
+      \if_meaning:w \q_nil #1 \q_nil
+        \use_i:nnn
+      \fi:
+      \exp_after:wN \use_none_delimit_by_q_recursion_stop:w
+    \else:
+      \cs_if_exist_use:cTF { @@_generate_variant_#1_form:nnn }
+        { {#3} {#4} {#5} }
+        {
+          \__msg_kernel_error:nnxx
+            { kernel } { conditional-form-unknown }
+            {#1} { \token_to_str:c { #3 : #4 } }
+        }
+    \fi:
+    \@@_generate_variant:w #2 \q_mark {#3} {#4} {#5}
+  }
+\cs_new_protected:Npn \@@_generate_variant_p_form:nnn #1#2
+  { \cs_generate_variant:cn { #1 _p : #2 } }
+\cs_new_protected:Npn \@@_generate_variant_T_form:nnn #1#2
+  { \cs_generate_variant:cn { #1 : #2 T } }
+\cs_new_protected:Npn \@@_generate_variant_F_form:nnn #1#2
+  { \cs_generate_variant:cn { #1 : #2 F } }
+\cs_new_protected:Npn \@@_generate_variant_TF_form:nnn #1#2
+  { \cs_generate_variant:cn { #1 : #2 TF } }
+%    \end{macrocode}
+% \end{macro}
+%
+%    \begin{macrocode}
 %</initex|package>
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %
@@ -600,7 +600,7 @@
 %   and MiK\TeX{} systems.
 % \end{variable}
 %
-% \subsection{Constant input--output streams}
+% \subsection{Constant input--output streams, and variables}
 %
 % \begin{variable}{\c_term_ior}
 %   Constant input stream for reading from the terminal. Reading from this
@@ -611,11 +611,25 @@
 %   \end{verbatim}
 % \end{variable}
 %
+% \begin{variable}[added = 2017-12-11]{\g_tmpa_ior, \g_tmpb_ior}
+%   Scratch input stream for global use. These are never used by
+%   the kernel code, and so are safe for use with any \LaTeX3-defined
+%   function. However, they may be overwritten by other non-kernel
+%   code and so should only be used for short-term storage.
+% \end{variable}
+%
 % \begin{variable}{\c_log_iow, \c_term_iow}
 %   Constant output streams for writing to the log and to the terminal
 %   (plus the log), respectively.
 % \end{variable}
 %
+% \begin{variable}[added = 2017-12-11]{\g_tmpa_iow, \g_tmpb_iow}
+%   Scratch output stream for global use. These are never used by
+%   the kernel code, and so are safe for use with any \LaTeX3-defined
+%   function. However, they may be overwritten by other non-kernel
+%   code and so should only be used for short-term storage.
+% \end{variable}
+%
 % \subsection{Primitive conditionals}
 %
 % \begin{function}[EXP]{\if_eof:w}
@@ -1216,6 +1230,14 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{variable}{\g_tmpa_ior, \g_tmpb_ior}
+%   The usual scratch space.
+%    \begin{macrocode}
+\ior_new:N \g_tmpa_ior
+\ior_new:N \g_tmpb_ior
+%    \end{macrocode}
+% \end{variable}
+%
 % \begin{macro}{\ior_open:Nn, \ior_open:cn}
 %   Use the conditional version, with an error if the file is not found.
 %    \begin{macrocode}
@@ -1241,9 +1263,7 @@
         \prg_return_true:
       }
   }
-\cs_generate_variant:Nn \ior_open:NnT  { c }
-\cs_generate_variant:Nn \ior_open:NnF  { c }
-\cs_generate_variant:Nn \ior_open:NnTF { c }
+\prg_generate_conditional_variant:Nnn \ior_open:Nn { c } { T , F , TF }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -1560,6 +1580,14 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{variable}{\g_tmpa_iow, \g_tmpb_iow}
+%   The usual scratch space.
+%    \begin{macrocode}
+\iow_new:N \g_tmpa_iow
+\iow_new:N \g_tmpb_iow
+%    \end{macrocode}
+% \end{variable}
+%
 % \begin{macro}{\@@_new:N}
 %   As for read streams, copy \tn{newwrite} in package mode, making sure
 %   that it is not \tn{outer}.

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3final.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3final.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3final.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 % \maketitle
 %
 % \begin{documentation}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 % \maketitle
 %
 % \begin{documentation}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -47,7 +47,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %
@@ -1307,12 +1307,10 @@
 %    \begin{macrocode}
 \__debug_patch:nnNNpn { \__debug_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 }
-\cs_generate_variant:Nn \int_set_eq:NN { Nc , cc }
+\cs_generate_variant:Nn \int_set_eq:NN { c , Nc , cc }
 \__debug_patch:nnNNpn { \__debug_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 }
-\cs_generate_variant:Nn \int_gset_eq:NN { Nc , cc }
+\cs_generate_variant:Nn \int_gset_eq:NN { c , Nc , cc }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3oldmodules.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3oldmodules.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3oldmodules.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -42,7 +42,7 @@
 % }
 %
 %
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %
@@ -880,10 +880,7 @@
       \prg_return_false:
     \fi:
   }
-\cs_generate_variant:Nn \bool_if_p:N { c }
-\cs_generate_variant:Nn \bool_if:NT  { c }
-\cs_generate_variant:Nn \bool_if:NF  { c }
-\cs_generate_variant:Nn \bool_if:NTF { c }
+\prg_generate_conditional_variant:Nnn \bool_if:N { c } { p , T , F , TF }
 %    \end{macrocode}
 % \end{macro}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %
@@ -894,12 +894,8 @@
       }
       { \prg_return_false: }
   }
-\cs_generate_variant:Nn \prop_pop:NnNT   { c }
-\cs_generate_variant:Nn \prop_pop:NnNF   { c }
-\cs_generate_variant:Nn \prop_pop:NnNTF  { c }
-\cs_generate_variant:Nn \prop_gpop:NnNT  { c }
-\cs_generate_variant:Nn \prop_gpop:NnNF  { c }
-\cs_generate_variant:Nn \prop_gpop:NnNTF { c }
+\prg_generate_conditional_variant:Nnn \prop_pop:NnN { c } { T , F , TF }
+\prg_generate_conditional_variant:Nnn \prop_gpop:NnN { c } { T , F , TF }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -1009,10 +1005,8 @@
     \tl_if_eq:NNTF #1 \c_empty_prop
       \prg_return_true: \prg_return_false:
   }
-\cs_generate_variant:Nn \prop_if_empty_p:N { c }
-\cs_generate_variant:Nn \prop_if_empty:NT { c }
-\cs_generate_variant:Nn \prop_if_empty:NF { c }
-\cs_generate_variant:Nn \prop_if_empty:NTF { c }
+\prg_generate_conditional_variant:Nnn \prop_if_empty:N
+  { c } { p , T , F , TF }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -1073,14 +1067,8 @@
     \fi:
     \__prg_break:
   }
-\cs_generate_variant:Nn \prop_if_in_p:Nn {     NV , No }
-\cs_generate_variant:Nn \prop_if_in_p:Nn { c , cV , co }
-\cs_generate_variant:Nn \prop_if_in:NnT  {     NV , No }
-\cs_generate_variant:Nn \prop_if_in:NnT  { c , cV , co }
-\cs_generate_variant:Nn \prop_if_in:NnF  {     NV , No }
-\cs_generate_variant:Nn \prop_if_in:NnF  { c , cV , co }
-\cs_generate_variant:Nn \prop_if_in:NnTF {     NV , No }
-\cs_generate_variant:Nn \prop_if_in:NnTF { c , cV , co }
+\prg_generate_conditional_variant:Nnn \prop_if_in:Nn
+  { NV , No , c , cV , co } { p , T , F , TF }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
@@ -1105,12 +1093,8 @@
       }
       { \prg_return_false: }
   }
-\cs_generate_variant:Nn \prop_get:NnNT  {     NV , No }
-\cs_generate_variant:Nn \prop_get:NnNF  {     NV , No }
-\cs_generate_variant:Nn \prop_get:NnNTF {     NV , No }
-\cs_generate_variant:Nn \prop_get:NnNT  { c , cV , co }
-\cs_generate_variant:Nn \prop_get:NnNF  { c , cV , co }
-\cs_generate_variant:Nn \prop_get:NnNTF { c , cV , co }
+\prg_generate_conditional_variant:Nnn \prop_get:NnN
+  { NV , No , c , cV , co } { T , F , TF }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -1143,8 +1127,7 @@
     #1 {#3} {#4}
     \@@_map_function:Nwwn #1
   }
-\cs_generate_variant:Nn \prop_map_function:NN {     Nc }
-\cs_generate_variant:Nn \prop_map_function:NN { c , cc }
+\cs_generate_variant:Nn \prop_map_function:NN { Nc , c , cc }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %
@@ -522,10 +522,8 @@
       \prg_return_false:
     \fi:
   }
-\cs_generate_variant:Nn \quark_if_no_value_p:N { c }
-\cs_generate_variant:Nn \quark_if_no_value:NT  { c }
-\cs_generate_variant:Nn \quark_if_no_value:NF  { c }
-\cs_generate_variant:Nn \quark_if_no_value:NTF { c }
+\prg_generate_conditional_variant:Nnn \quark_if_no_value:N
+  { c } { p , T , F , TF }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
@@ -562,10 +560,8 @@
       { \@@_if_no_value:w {} #1 {} ? ! \q_no_value ? ? ! }
   }
 \cs_new:Npn \@@_if_no_value:w #1 \q_no_value #2 ? #3 ? ! { #1 #2 }
-\cs_generate_variant:Nn \quark_if_nil_p:n { V , o }
-\cs_generate_variant:Nn \quark_if_nil:nTF { V , o }
-\cs_generate_variant:Nn \quark_if_nil:nT  { V , o }
-\cs_generate_variant:Nn \quark_if_nil:nF  { V , o }
+\prg_generate_conditional_variant:Nnn \quark_if_nil:n
+  { V , o } { p , TF , T , F }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %
@@ -118,21 +118,21 @@
 %   possible, thus avoiding matching underscores.
 % \item |[+-]?\d+| matches an explicit integer with at most one
 %   sign.
-% \item \verb*"[+-\ ]*\d+\ *" matches an explicit integer with any
+% \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
+% \item \verb*"[+\-\ ]*(\d+|\d*\.\d+)\ *" matches an explict integer or
 %   decimal number; using \verb*"[.,]" instead of \verb*"\." would allow
 %   the comma as a decimal marker.
 % \item
-%   \verb*"[+-\ ]*(\d+|\d*\.\d+)\ *((?i)pt|in|[cem]m|ex|[bs]p|[dn]d|[pcn]c)\ *"
-%   matches an explicit dimension with any unit that \TeX{} knows, where
+%   \verb*"[+\-\ ]*(\d+|\d*\.\d+)\ *((?i)pt|in|[cem]m|ex|[bs]p|[dn]d|[pcn]c)\ *"
+%   \allowbreak matches an explicit dimension with any unit that \TeX{} knows, where
 %   \verb*"(?i)" means to treat lowercase and uppercase letters
 %   identically.
-% \item \verb*"[+-\ ]*((?i)nan|inf|(\d+|\d*\.\d+)(\ *e[+-\ ]*\d+)?)\ *"
+% \item \verb*"[+\-\ ]*((?i)nan|inf|(\d+|\d*\.\d+)(\ *e[+-\ ]*\d+)?)\ *"
 %   matches an explicit floating point number or the special values
-%   \verb*"nan" and \verb*"inf" (with signs).
-% \item \verb*"[+-\ ]*(\d+|\cC.)\ *" matches an explicit integer or
+%   \verb*"nan" and \verb*"inf" (with signs and spaces allowed).
+% \item \verb*"[+\-\ ]*(\d+|\cC.)\ *" matches an explicit integer or
 %   control sequence (without checking whether it is an integer
 %   variable).
 % \item |\G.*?\K| at the beginning of a regular expression matches and
@@ -143,7 +143,7 @@
 %   \cs{regex_extract_all:nnN}.
 % \end{itemize}
 % While it is impossible for a regular expression to match only integer
-% expressions, \verb*"[+-\(]*\d+\)*([+-*/][+-\(]*\d+\)*)*" matches among
+% expressions, \verb*"[+\-\(]*\d+\)*([+\-*/][+\-\(]*\d+\)*)*" matches among
 % other things all valid integer expressions (made only with explicit
 % integers).  One should follow it with further testing.
 %
@@ -663,6 +663,22 @@
 %   locally to \meta{tl~var}.
 % \end{function}
 %
+% \subsection{Constants and variables}
+%
+% \begin{variable}[added = 2017-12-11]{\l_tmpa_regex, \l_tmpb_regex}
+%   Scratch regex for local assignment. These are never used by
+%   the kernel code, and so are safe for use with any \LaTeX3-defined
+%   function. However, they may be overwritten by other non-kernel
+%   code and so should only be used for short-term storage.
+% \end{variable}
+%
+% \begin{variable}[added = 2017-12-11]{\g_tmpa_regex, \g_tmpb_regex}
+%   Scratch regex for global assignment. These are never used by
+%   the kernel code, and so are safe for use with any \LaTeX3-defined
+%   function. However, they may be overwritten by other non-kernel
+%   code and so should only be used for short-term storage.
+% \end{variable}
+%
 % \subsection{Bugs, misfeatures, future work, and other possibilities}
 %
 % The following need to be done now.
@@ -5587,6 +5603,16 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{variable}{\l_tmpa_regex, \l_tmpb_regex, \g_tmpa_regex, \g_tmpb_regex}
+%   The usual scratch space.
+%    \begin{macrocode}
+\regex_new:N \l_tmpa_regex
+\regex_new:N \l_tmpb_regex
+\regex_new:N \g_tmpa_regex
+\regex_new:N \g_tmpb_regex
+%    \end{macrocode}
+% \end{variable}
+%
 % \begin{macro}{\regex_set:Nn, \regex_gset:Nn, \regex_const:Nn}
 %   Compile, then store the result in the user variable with the
 %   appropriate assignment function.

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %
@@ -1415,10 +1415,8 @@
       \prg_return_false:
     \fi:
   }
-\cs_generate_variant:Nn \seq_if_empty_p:N { c }
-\cs_generate_variant:Nn \seq_if_empty:NT { c }
-\cs_generate_variant:Nn \seq_if_empty:NF { c }
-\cs_generate_variant:Nn \seq_if_empty:NTF { c }
+\prg_generate_conditional_variant:Nnn \seq_if_empty:N
+  { c } { p , T , F , TF }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -1457,12 +1455,8 @@
   }
 \cs_new:Npn \@@_if_in:
   { \__prg_break:n { \group_end: \prg_return_true: } }
-\cs_generate_variant:Nn \seq_if_in:NnT  {     NV , Nv , No , Nx }
-\cs_generate_variant:Nn \seq_if_in:NnT  { c , cV , cv , co , cx }
-\cs_generate_variant:Nn \seq_if_in:NnF  {     NV , Nv , No , Nx }
-\cs_generate_variant:Nn \seq_if_in:NnF  { c , cV , cv , co , cx }
-\cs_generate_variant:Nn \seq_if_in:NnTF {     NV , Nv , No , Nx }
-\cs_generate_variant:Nn \seq_if_in:NnTF { c , cV , cv , co , cx }
+\prg_generate_conditional_variant:Nnn \seq_if_in:Nn
+  { NV , Nv , No , Nx , c , cV , cv , co , cx } { T , F , TF }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
@@ -1638,12 +1632,10 @@
   { \@@_pop_TF:NNNN \prg_do_nothing: \seq_get_left:NN #1#2 }
 \prg_new_protected_conditional:Npnn \seq_get_right:NN #1#2 { T , F , TF }
   { \@@_pop_TF:NNNN \prg_do_nothing: \seq_get_right:NN #1#2 }
-\cs_generate_variant:Nn \seq_get_left:NNT   { c }
-\cs_generate_variant:Nn \seq_get_left:NNF   { c }
-\cs_generate_variant:Nn \seq_get_left:NNTF  { c }
-\cs_generate_variant:Nn \seq_get_right:NNT  { c }
-\cs_generate_variant:Nn \seq_get_right:NNF  { c }
-\cs_generate_variant:Nn \seq_get_right:NNTF { c }
+\prg_generate_conditional_variant:Nnn \seq_get_left:NN
+  { c } { T , F , TF }
+\prg_generate_conditional_variant:Nnn \seq_get_right:NN
+  { c } { T , F , TF }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
@@ -1662,18 +1654,10 @@
   { \@@_pop_TF:NNNN \@@_pop_right:NNN \tl_set:Nx #1 #2 }
 \prg_new_protected_conditional:Npnn \seq_gpop_right:NN #1#2 { T , F , TF }
   { \@@_pop_TF:NNNN \@@_pop_right:NNN \tl_gset:Nx #1 #2 }
-\cs_generate_variant:Nn \seq_pop_left:NNT    { c }
-\cs_generate_variant:Nn \seq_pop_left:NNF    { c }
-\cs_generate_variant:Nn \seq_pop_left:NNTF   { c }
-\cs_generate_variant:Nn \seq_gpop_left:NNT   { c }
-\cs_generate_variant:Nn \seq_gpop_left:NNF   { c }
-\cs_generate_variant:Nn \seq_gpop_left:NNTF  { c }
-\cs_generate_variant:Nn \seq_pop_right:NNT   { c }
-\cs_generate_variant:Nn \seq_pop_right:NNF   { c }
-\cs_generate_variant:Nn \seq_pop_right:NNTF  { c }
-\cs_generate_variant:Nn \seq_gpop_right:NNT  { c }
-\cs_generate_variant:Nn \seq_gpop_right:NNF  { c }
-\cs_generate_variant:Nn \seq_gpop_right:NNTF { c }
+\prg_generate_conditional_variant:Nnn \seq_pop_left:NN { c } { T , F , TF }
+\prg_generate_conditional_variant:Nnn \seq_gpop_left:NN { c } { T , F , TF }
+\prg_generate_conditional_variant:Nnn \seq_pop_right:NN { c } { T , F , TF }
+\prg_generate_conditional_variant:Nnn \seq_gpop_right:NN { c } { T , F , TF }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %
@@ -1171,13 +1171,11 @@
 \__debug_patch:nnNNpn { \__debug_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 }
-\cs_generate_variant:Nn \dim_set_eq:NN { Nc , cc }
+\cs_generate_variant:Nn \dim_set_eq:NN { c , Nc , cc }
 \__debug_patch:nnNNpn { \__debug_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 }
-\cs_generate_variant:Nn \dim_gset_eq:NN { Nc , cc }
+\cs_generate_variant:Nn \dim_gset_eq:NN { c , Nc , cc }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
@@ -1766,11 +1764,9 @@
 %   All straightforward.
 %    \begin{macrocode}
 \cs_new_protected:Npn \skip_set_eq:NN #1#2 { #1 = #2 }
-\cs_generate_variant:Nn \skip_set_eq:NN {       c }
-\cs_generate_variant:Nn \skip_set_eq:NN { Nc , cc }
+\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 }
-\cs_generate_variant:Nn \skip_gset_eq:NN { Nc , cc }
+\cs_generate_variant:Nn \skip_gset_eq:NN { c , Nc , cc }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
@@ -2073,12 +2069,10 @@
 %    \begin{macrocode}
 \__debug_patch:nnNNpn { \__debug_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 }
-\cs_generate_variant:Nn \muskip_set_eq:NN { Nc , cc }
+\cs_generate_variant:Nn \muskip_set_eq:NN { c , Nc , cc }
 \__debug_patch:nnNNpn { \__debug_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 }
-\cs_generate_variant:Nn \muskip_gset_eq:NN { Nc , cc }
+\cs_generate_variant:Nn \muskip_gset_eq:NN { c , Nc , cc }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %
@@ -1163,14 +1163,8 @@
       = 0 \exp_stop_f:
       \prg_return_true: \else: \prg_return_false: \fi:
   }
-\cs_generate_variant:Nn \str_if_eq_p:nn {  V ,  o }
-\cs_generate_variant:Nn \str_if_eq_p:nn { nV , no , VV }
-\cs_generate_variant:Nn \str_if_eq:nnT  {  V ,  o }
-\cs_generate_variant:Nn \str_if_eq:nnT  { nV , no , VV }
-\cs_generate_variant:Nn \str_if_eq:nnF  {  V ,  o }
-\cs_generate_variant:Nn \str_if_eq:nnF  { nV , no , VV }
-\cs_generate_variant:Nn \str_if_eq:nnTF {  V ,  o }
-\cs_generate_variant:Nn \str_if_eq:nnTF { nV , no , VV }
+\prg_generate_conditional_variant:Nnn \str_if_eq:nn
+  { V , o , nV , no , VV } { p , T , F , TF }
 \prg_new_conditional:Npnn \str_if_eq_x:nn #1#2 { p , T , F , TF }
   {
     \if_int_compare:w \@@_if_eq_x:nn {#1} {#2} = 0 \exp_stop_f:
@@ -1189,14 +1183,12 @@
     \if_int_compare:w \@@_if_eq_x:nn { \tl_to_str:N #1 } { \tl_to_str:N #2 }
       = 0 \exp_stop_f: \prg_return_true: \else: \prg_return_false: \fi:
   }
-\cs_generate_variant:Nn \str_if_eq:NNT  { c , Nc , cc }
-\cs_generate_variant:Nn \str_if_eq:NNF  { c , Nc , cc }
-\cs_generate_variant:Nn \str_if_eq:NNTF { c , Nc , cc }
-\cs_generate_variant:Nn \str_if_eq_p:NN { c , Nc , cc }
+\prg_generate_conditional_variant:Nnn \str_if_eq:NN
+  { c , Nc , cc } { T , F , TF , p }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[TF]{\str_if_in:Nn, \str_if_in:cn \str_if_in:nn}
+% \begin{macro}[TF]{\str_if_in:Nn, \str_if_in:cn, \str_if_in:nn}
 %   Everything here needs to be detokenized but beyond that it is a
 %   simple token list test.  It would be faster to fine-tune the |T|,
 %   |F|, |TF| variants by calling the appropriate variant of
@@ -1208,9 +1200,8 @@
       { \tl_if_in:nnTF { \tl_to_str:N #1 } { \tl_to_str:n {#2} } }
       { \prg_return_true: } { \prg_return_false: }
   }
-\cs_generate_variant:Nn \str_if_in:NnT { c }
-\cs_generate_variant:Nn \str_if_in:NnF  { c }
-\cs_generate_variant:Nn \str_if_in:NnTF { c }
+\prg_generate_conditional_variant:Nnn \str_if_in:Nn
+  { c } { T , F , TF }
 \prg_new_protected_conditional:Npnn \str_if_in:nn #1#2 { T , F , TF }
   {
     \use:x
@@ -1251,9 +1242,8 @@
 \cs_new:Npn \@@_case:nnTF #1#2#3#4
   { \@@_case:nw {#1} #2 {#1} { } \q_mark {#3} \q_mark {#4} \q_stop }
 \cs_generate_variant:Nn \str_case:nn   { o , nV , nv }
-\cs_generate_variant:Nn \str_case:nnT  { o , nV , nv }
-\cs_generate_variant:Nn \str_case:nnF  { o , nV , nv }
-\cs_generate_variant:Nn \str_case:nnTF { o , nV , nv }
+\prg_generate_conditional_variant:Nnn \str_case:nn
+  { o , nV , nv } { T , F , TF }
 \cs_new:Npn \@@_case:nw #1#2#3
   {
     \str_if_eq:nnTF {#1} {#2}
@@ -1297,8 +1287,11 @@
 % \subsection{Mapping to strings}
 %
 % \begin{macro}[rEXP]{\str_map_function:NN, \str_map_function:cN}
+% \begin{macro}[rEXP]{\str_map_function:nN}
 % \begin{macro}{\str_map_inline:Nn, \str_map_inline:cn}
+% \begin{macro}{\str_map_inline:nn}
 % \begin{macro}{\str_map_variable:NNn, \str_map_variable:cNn}
+% \begin{macro}{\str_map_variable:nNn}
 % \begin{macro}{\str_map_break:}
 % \begin{macro}{\str_map_break:n}
 % \begin{macro}[rEXP]{\@@_map_function:w, \@@_map_function:Nn}
@@ -1395,6 +1388,9 @@
 % \end{macro}
 % \end{macro}
 % \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
 %
 % \subsection{Accessing specific characters in a string}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %
@@ -1900,14 +1900,8 @@
 %    \begin{macrocode}
 \prg_new_conditional:Npnn \tl_if_blank:n #1 { p , T , F , TF }
   { \@@_if_empty_return:o { \use_none:n #1 ? } }
-\cs_generate_variant:Nn \tl_if_blank_p:n { V }
-\cs_generate_variant:Nn \tl_if_blank:nT  { V }
-\cs_generate_variant:Nn \tl_if_blank:nF  { V }
-\cs_generate_variant:Nn \tl_if_blank:nTF { V }
-\cs_generate_variant:Nn \tl_if_blank_p:n { o }
-\cs_generate_variant:Nn \tl_if_blank:nT  { o }
-\cs_generate_variant:Nn \tl_if_blank:nF  { o }
-\cs_generate_variant:Nn \tl_if_blank:nTF { o }
+\prg_generate_conditional_variant:Nnn \tl_if_blank:n
+  { V , o } { p , T , F , TF }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
@@ -1924,10 +1918,8 @@
       \prg_return_false:
     \fi:
   }
-\cs_generate_variant:Nn \tl_if_empty_p:N { c }
-\cs_generate_variant:Nn \tl_if_empty:NT  { c }
-\cs_generate_variant:Nn \tl_if_empty:NF  { c }
-\cs_generate_variant:Nn \tl_if_empty:NTF { c }
+\prg_generate_conditional_variant:Nnn \tl_if_empty:N
+  { c } { p , T , F , TF }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -1954,10 +1946,8 @@
       \prg_return_false:
     \fi:
   }
-\cs_generate_variant:Nn \tl_if_empty_p:n { V }
-\cs_generate_variant:Nn \tl_if_empty:nTF { V }
-\cs_generate_variant:Nn \tl_if_empty:nT  { V }
-\cs_generate_variant:Nn \tl_if_empty:nF  { V }
+\prg_generate_conditional_variant:Nnn \tl_if_empty:n
+  { V } { p , TF , T , F }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -2000,10 +1990,8 @@
       \prg_return_false:
     \fi:
   }
-\cs_generate_variant:Nn \tl_if_eq_p:NN { Nc , c , cc }
-\cs_generate_variant:Nn \tl_if_eq:NNTF { Nc , c , cc }
-\cs_generate_variant:Nn \tl_if_eq:NNT  { Nc , c , cc }
-\cs_generate_variant:Nn \tl_if_eq:NNF  { Nc , c , cc }
+\prg_generate_conditional_variant:Nnn \tl_if_eq:NN
+  { Nc , c , cc } { p , TF , T , F }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -2037,9 +2025,8 @@
 \cs_new_protected:Npn \tl_if_in:NnT  { \exp_args:No \tl_if_in:nnT  }
 \cs_new_protected:Npn \tl_if_in:NnF  { \exp_args:No \tl_if_in:nnF  }
 \cs_new_protected:Npn \tl_if_in:NnTF { \exp_args:No \tl_if_in:nnTF }
-\cs_generate_variant:Nn \tl_if_in:NnT { c }
-\cs_generate_variant:Nn \tl_if_in:NnF  { c }
-\cs_generate_variant:Nn \tl_if_in:NnTF { c }
+\prg_generate_conditional_variant:Nnn \tl_if_in:Nn
+  { c } { T , F , TF }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -2069,13 +2056,12 @@
       { \prg_return_false: } { \prg_return_true: }
     \if_false: } \fi:
   }
-\cs_generate_variant:Nn \tl_if_in:nnT  { V , o , no }
-\cs_generate_variant:Nn \tl_if_in:nnF  { V , o , no }
-\cs_generate_variant:Nn \tl_if_in:nnTF { V , o , no }
+\prg_generate_conditional_variant:Nnn \tl_if_in:nn
+  { V , o , no } { T , F , TF }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[TF, EXP]{\tl_if_novalue:n}
+% \begin{macro}[pTF, EXP]{\tl_if_novalue:n}
 % \begin{macro}[EXP]{\@@_if_novalue:w}
 %   Tests for |-NoValue-|: this is similar to \cs{tl_if_in:nn} but set
 %   up to be expandable and to check the value exactly.  The question
@@ -2084,7 +2070,7 @@
 \use:x
   {
     \prg_new_conditional:Npnn \exp_not:N \tl_if_novalue:n ##1
-      { T ,  F , TF }
+      { p , T ,  F , TF }
       {
         \exp_not:N \str_if_eq:onTF
           {
@@ -2187,9 +2173,8 @@
       { \@@_case:Nw #1 }
   }
 \cs_generate_variant:Nn \tl_case:Nn   { c }
-\cs_generate_variant:Nn \tl_case:NnT  { c }
-\cs_generate_variant:Nn \tl_case:NnF  { c }
-\cs_generate_variant:Nn \tl_case:NnTF { c }
+\prg_generate_conditional_variant:Nnn \tl_case:Nn
+  { c } { T , F , TF }
 %    \end{macrocode}
 %   To tidy up the recursion, there are two outcomes. If there was a hit to
 %   one of the cases searched for, then |#1| is the code to insert,
@@ -2756,10 +2741,8 @@
       \prg_return_false:
     \fi:
   }
-\cs_generate_variant:Nn \tl_if_head_eq_charcode_p:nN { f }
-\cs_generate_variant:Nn \tl_if_head_eq_charcode:nNTF { f }
-\cs_generate_variant:Nn \tl_if_head_eq_charcode:nNT  { f }
-\cs_generate_variant:Nn \tl_if_head_eq_charcode:nNF  { f }
+\prg_generate_conditional_variant:Nnn \tl_if_head_eq_charcode:nN
+  { f } { p , TF , T , F }
 %    \end{macrocode}
 %   For \cs{tl_if_head_eq_catcode:nN}, again we detect special cases
 %   with a \cs{tl_if_head_is_N_type:n}.  Then we need to test if the

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -23,8 +23,8 @@
 %<*driver|package>
 % The version of expl3 required is tested as early as possible, as
 % some really old versions do not define \ProvidesExplPackage.
-\RequirePackage{expl3}[2017/12/05]
-%<package>\@ifpackagelater{expl3}{2017/12/05}
+\RequirePackage{expl3}[2017/12/16]
+%<package>\@ifpackagelater{expl3}{2017/12/16}
 %<package>  {}
 %<package>  {%
 %<package>    \PackageError{l3keys2e}{Support package l3kernel too old}
@@ -60,7 +60,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %
@@ -131,7 +131,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{l3keys2e}{2017/12/05}{}
+\ProvidesExplPackage{l3keys2e}{2017/12/16}{}
   {LaTeX2e option processing using LaTeX3 keys}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -23,8 +23,8 @@
 %<*driver|package>
 % The version of expl3 required is tested as early as possible, as
 % some really old versions do not define \ProvidesExplPackage.
-\RequirePackage{expl3}[2017/12/05]
-%<package>\@ifpackagelater{expl3}{2017/12/05}
+\RequirePackage{expl3}[2017/12/16]
+%<package>\@ifpackagelater{expl3}{2017/12/16}
 %<package>  {}
 %<package>  {%
 %<package>    \PackageError{xfp}{Support package l3kernel too old}
@@ -62,7 +62,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %
@@ -159,7 +159,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xfp}{2017/12/05}{}
+\ProvidesExplPackage{xfp}{2017/12/16}{}
   {L3 Floating point unit}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -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/05]
-%<package>\@ifpackagelater{expl3}{2017/12/05}
+\RequirePackage{expl3}[2017/12/16]
+%<package>\@ifpackagelater{expl3}{2017/12/16}
 %<package>  {}
 %<package>  {%
 %<package>    \PackageError{xfrac}{Support package l3kernel too old}
@@ -63,7 +63,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %
@@ -533,7 +533,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xfrac}{2017/12/05}{}
+\ProvidesExplPackage{xfrac}{2017/12/16}{}
   {L3 Experimental split-level fractions}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -27,8 +27,8 @@
 %<*driver|package>
 % The version of expl3 required is tested as early as possible, as
 % some really old versions do not define \ProvidesExplPackage.
-\RequirePackage{expl3}[2017/12/05]
-%<package>\@ifpackagelater{expl3}{2017/12/05}
+\RequirePackage{expl3}[2017/12/16]
+%<package>\@ifpackagelater{expl3}{2017/12/16}
 %<package>  {}
 %<package>  {%
 %<package>    \PackageError{xparse}{Support package l3kernel too old}
@@ -67,7 +67,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %
@@ -520,7 +520,7 @@
 %
 % \begin{function}[EXP]{\IfBooleanT, \IfBooleanF, \IfBooleanTF}
 %   \begin{syntax}
-%     \cs{IfBooleanTF} \meta{argument} \Arg{true code} \Arg{false code}
+%     \cs{IfBooleanTF} \Arg{argument} \Arg{true code} \Arg{false code}
 %   \end{syntax}
 %   Used to test if \meta{argument} (|#1|, |#2|, \emph{etc.}) is
 %   \cs{BooleanTrue} or \cs{BooleanFalse}. For example
@@ -527,7 +527,7 @@
 %   \begin{verbatim}
 %     \NewDocumentCommand \foo { s m }
 %       {
-%         \IfBooleanTF #1
+%         \IfBooleanTF {#1}
 %           { \DoSomethingWithStar {#2} }
 %           { \DoSomethingWithoutStar {#2} }
 %       }
@@ -776,7 +776,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xparse}{2017/12/05}{}
+\ProvidesExplPackage{xparse}{2017/12/16}{}
   {L3 Experimental document command parser}
 %    \end{macrocode}
 %
@@ -4042,6 +4042,13 @@
     (or~no~arguments~at~all).~You~cannot~have~a~terminal~optional~
     argument~with~expandable~commands.
   }
+\__msg_kernel_new:nnnn { xparse } { if-boolean }
+  { Invalid~use~\iow_char:N\\IfBooleanTF~{#1} }
+  {
+    \c__msg_coding_error_text_tl
+    The~first~argument~of~\iow_char:N\\IfBoolean(TF/T/F)~must~be~
+    a~boolean~argument~obtained~from~parsing~'s'~or~'t'~arguments.
+  }
 \__msg_kernel_new:nnnn { xparse } { inconsistent-long }
   { Inconsistent~long~arguments~for~expandable~command~'#1'. }
   {
@@ -4377,9 +4384,19 @@
 %   normal \cs{c_true_bool} and \cs{c_false_bool}, so testing for them is
 %   done with the \cs{bool_if:NTF} functions from \textsf{l3prg}.
 %    \begin{macrocode}
-\cs_new_eq:NN \IfBooleanTF \bool_if:NTF
-\cs_new_eq:NN \IfBooleanT  \bool_if:NT
-\cs_new_eq:NN \IfBooleanF  \bool_if:NF
+\cs_new:Npn \IfBooleanTF #1
+  {
+    \bool_lazy_and:nnTF
+      { \tl_if_single_p:n {#1} }
+      { \tl_if_single_token_p:n #1 }
+      { \bool_if:NTF #1 }
+      {
+        \__msg_kernel_error:nnn { xparse } { if-boolean } {#1}
+        \use_ii:nn
+      }
+  }
+\cs_new:Npn \IfBooleanT #1#2 { \IfBooleanTF {#1} {#2} { } }
+\cs_new:Npn \IfBooleanF #1 { \IfBooleanTF {#1} { } }
 %    \end{macrocode}
 % \end{macro}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx	2017-12-17 23:16:51 UTC (rev 46085)
@@ -27,8 +27,8 @@
 %<*driver|package>
 % The version of expl3 required is tested as early as possible, as
 % some really old versions do not define \ProvidesExplPackage.
-\RequirePackage{expl3}[2017/12/05]
-%<package>\@ifpackagelater{expl3}{2017/12/05}
+\RequirePackage{expl3}[2017/12/16]
+%<package>\@ifpackagelater{expl3}{2017/12/16}
 %<package>  {}
 %<package>  {%
 %<package>    \PackageError{xtemplate}{Support package l3kernel too old}
@@ -63,7 +63,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/12/05}
+% \date{Released 2017/12/16}
 %
 % \maketitle
 %
@@ -682,7 +682,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xtemplate}{2017/12/05}{}
+\ProvidesExplPackage{xtemplate}{2017/12/16}{}
   {L3 Experimental prototype document functions}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-convert.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-convert.sty	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-convert.sty	2017-12-17 23:16:51 UTC (rev 46085)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3str-convert.dtx Copyright (C) 2013-2017 The LaTeX3 Project
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3str-convert}{2017/12/05}{}
+\ProvidesExplPackage{l3str-convert}{2017/12/16}{}
   {L3 Experimental string encoding conversions}
 \cs_if_exist:NF \use_ii_i:nn
   { \cs_new:Npn \use_ii_i:nn #1#2 { #2 #1 } }

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty	2017-12-17 23:16:51 UTC (rev 46085)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3str-format.dtx Copyright (C) 2012-2017 The LaTeX3 Project
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3str-format}{2017/12/05}{}
+\ProvidesExplPackage{l3str-format}{2017/12/16}{}
   {L3 Experimental string formatting}
 \cs_generate_variant:Nn \use:nn { nf }
 \cs_generate_variant:Nn \use:nnn { fnf }

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty	2017-12-17 23:16:51 UTC (rev 46085)
@@ -20,7 +20,7 @@
 %% 
 %% File: xcoffins.dtx Copyright(C) 2010-2012,2014,2016,2017 The LaTeX3 Project
 \RequirePackage{xparse}
-\ProvidesExplPackage{xcoffins}{2017/12/05}{}
+\ProvidesExplPackage{xcoffins}{2017/12/16}{}
   {L3 Experimental design level coffins}
 \keys_define:nn { coffin }
   {

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty	2017-12-17 23:16:51 UTC (rev 46085)
@@ -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/05]
-\@ifpackagelater{expl3}{2017/12/05}
+\RequirePackage{expl3}[2017/12/16]
+\@ifpackagelater{expl3}{2017/12/16}
   {}
   {%
     \PackageError{l3galley}{Support package l3kernel too old}
@@ -33,7 +33,7 @@
       }%
     \endinput
   }
-\ProvidesExplPackage{l3galley}{2017/12/05}{}
+\ProvidesExplPackage{l3galley}{2017/12/16}{}
   {L3 Experimental galley code}
 \int_new:N \l__galley_tmp_int
 \seq_new:N \g__galley_tmpa_seq

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty	2017-12-17 23:16:51 UTC (rev 46085)
@@ -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/05}{}
+\ProvidesExplPackage{xgalley}{2017/12/16}{}
   {L3 Experimental galley}
 \RequirePackage{xparse,xtemplate,l3galley}
 \clist_new:N \l__galley_tmpa_clist

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex	2017-12-17 23:16:51 UTC (rev 46085)
@@ -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/05}%
+\def\ExplFileDate{2017/12/16}%
 \begingroup
   \def\next{\endgroup}%
   \expandafter\ifx\csname PackageError\endcsname\relax
@@ -2687,6 +2687,8 @@
     \exp_after:wN #1
     \tl_to_str:n {#2} , \scan_stop: , \q_recursion_stop
   }
+\cs_new_protected:Npn \cs_generate_variant:cn
+  { \exp_args:Nc \cs_generate_variant:Nn }
 \cs_new_protected:Npx \__cs_generate_variant:N #1
   {
     \exp_not:N \exp_after:wN \exp_not:N \if_meaning:w
@@ -2897,6 +2899,46 @@
     \exp_after:wN \exp_not:N \cs:w :: #1 \cs_end:
     \__cs_generate_internal_variant_loop:n
   }
+\cs_new_protected:Npn \prg_generate_conditional_variant:Nnn #1
+  { \__cs_split_function:NN #1 \__cs_generate_variant:nnNnn }
+\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 }
+        { \token_to_str:c {#1} }
+      \use_i_delimit_by_q_stop:nw
+    \fi:
+    \exp_after:wN \__cs_generate_variant:w
+    \tl_to_str:n {#5} , \scan_stop: , \q_recursion_stop
+    \use_none_delimit_by_q_stop:w \q_mark {#1} {#2} {#4} \q_stop
+  }
+\cs_new_protected:Npn \__cs_generate_variant:w
+    #1 , #2 \q_mark #3#4#5
+  {
+    \if_meaning:w \scan_stop: #1 \scan_stop:
+      \if_meaning:w \q_nil #1 \q_nil
+        \use_i:nnn
+      \fi:
+      \exp_after:wN \use_none_delimit_by_q_recursion_stop:w
+    \else:
+      \cs_if_exist_use:cTF { __cs_generate_variant_#1_form:nnn }
+        { {#3} {#4} {#5} }
+        {
+          \__msg_kernel_error:nnxx
+            { kernel } { conditional-form-unknown }
+            {#1} { \token_to_str:c { #3 : #4 } }
+        }
+    \fi:
+    \__cs_generate_variant:w #2 \q_mark {#3} {#4} {#5}
+  }
+\cs_new_protected:Npn \__cs_generate_variant_p_form:nnn #1#2
+  { \cs_generate_variant:cn { #1 _p : #2 } }
+\cs_new_protected:Npn \__cs_generate_variant_T_form:nnn #1#2
+  { \cs_generate_variant:cn { #1 : #2 T } }
+\cs_new_protected:Npn \__cs_generate_variant_F_form:nnn #1#2
+  { \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
 \cs_new_protected:Npn \tl_new:N #1
   {
@@ -3255,14 +3297,8 @@
 \cs_generate_variant:Nn \tl_gremove_all:Nn { c }
 \prg_new_conditional:Npnn \tl_if_blank:n #1 { p , T , F , TF }
   { \__tl_if_empty_return:o { \use_none:n #1 ? } }
-\cs_generate_variant:Nn \tl_if_blank_p:n { V }
-\cs_generate_variant:Nn \tl_if_blank:nT  { V }
-\cs_generate_variant:Nn \tl_if_blank:nF  { V }
-\cs_generate_variant:Nn \tl_if_blank:nTF { V }
-\cs_generate_variant:Nn \tl_if_blank_p:n { o }
-\cs_generate_variant:Nn \tl_if_blank:nT  { o }
-\cs_generate_variant:Nn \tl_if_blank:nF  { o }
-\cs_generate_variant:Nn \tl_if_blank:nTF { o }
+\prg_generate_conditional_variant:Nnn \tl_if_blank:n
+  { V , o } { p , T , F , TF }
 \prg_new_conditional:Npnn \tl_if_empty:N #1 { p , T , F , TF }
   {
     \if_meaning:w #1 \c_empty_tl
@@ -3271,10 +3307,8 @@
       \prg_return_false:
     \fi:
   }
-\cs_generate_variant:Nn \tl_if_empty_p:N { c }
-\cs_generate_variant:Nn \tl_if_empty:NT  { c }
-\cs_generate_variant:Nn \tl_if_empty:NF  { c }
-\cs_generate_variant:Nn \tl_if_empty:NTF { c }
+\prg_generate_conditional_variant:Nnn \tl_if_empty:N
+  { c } { p , T , F , TF }
 \prg_new_conditional:Npnn \tl_if_empty:n #1 { p , TF , T , F }
   {
     \exp_after:wN \if_meaning:w \exp_after:wN \q_nil
@@ -3284,10 +3318,8 @@
       \prg_return_false:
     \fi:
   }
-\cs_generate_variant:Nn \tl_if_empty_p:n { V }
-\cs_generate_variant:Nn \tl_if_empty:nTF { V }
-\cs_generate_variant:Nn \tl_if_empty:nT  { V }
-\cs_generate_variant:Nn \tl_if_empty:nF  { V }
+\prg_generate_conditional_variant:Nnn \tl_if_empty:n
+  { V } { p , TF , T , F }
 \cs_new:Npn \__tl_if_empty_return:o #1
   {
     \exp_after:wN \if_meaning:w \exp_after:wN \q_nil
@@ -3307,10 +3339,8 @@
       \prg_return_false:
     \fi:
   }
-\cs_generate_variant:Nn \tl_if_eq_p:NN { Nc , c , cc }
-\cs_generate_variant:Nn \tl_if_eq:NNTF { Nc , c , cc }
-\cs_generate_variant:Nn \tl_if_eq:NNT  { Nc , c , cc }
-\cs_generate_variant:Nn \tl_if_eq:NNF  { Nc , c , cc }
+\prg_generate_conditional_variant:Nnn \tl_if_eq:NN
+  { Nc , c , cc } { p , TF , T , F }
 \prg_new_protected_conditional:Npnn \tl_if_eq:nn #1#2 { T , F ,  TF }
   {
     \group_begin:
@@ -3329,9 +3359,8 @@
 \cs_new_protected:Npn \tl_if_in:NnT  { \exp_args:No \tl_if_in:nnT  }
 \cs_new_protected:Npn \tl_if_in:NnF  { \exp_args:No \tl_if_in:nnF  }
 \cs_new_protected:Npn \tl_if_in:NnTF { \exp_args:No \tl_if_in:nnTF }
-\cs_generate_variant:Nn \tl_if_in:NnT { c }
-\cs_generate_variant:Nn \tl_if_in:NnF  { c }
-\cs_generate_variant:Nn \tl_if_in:NnTF { c }
+\prg_generate_conditional_variant:Nnn \tl_if_in:Nn
+  { c } { T , F , TF }
 \prg_new_protected_conditional:Npnn \tl_if_in:nn #1#2 { T  , F , TF }
   {
     \if_false: { \fi:
@@ -3340,13 +3369,12 @@
       { \prg_return_false: } { \prg_return_true: }
     \if_false: } \fi:
   }
-\cs_generate_variant:Nn \tl_if_in:nnT  { V , o , no }
-\cs_generate_variant:Nn \tl_if_in:nnF  { V , o , no }
-\cs_generate_variant:Nn \tl_if_in:nnTF { V , o , no }
+\prg_generate_conditional_variant:Nnn \tl_if_in:nn
+  { V , o , no } { T , F , TF }
 \use:x
   {
     \prg_new_conditional:Npnn \exp_not:N \tl_if_novalue:n ##1
-      { T ,  F , TF }
+      { p , T ,  F , TF }
       {
         \exp_not:N \str_if_eq:onTF
           {
@@ -3403,9 +3431,8 @@
       { \__tl_case:Nw #1 }
   }
 \cs_generate_variant:Nn \tl_case:Nn   { c }
-\cs_generate_variant:Nn \tl_case:NnT  { c }
-\cs_generate_variant:Nn \tl_case:NnF  { c }
-\cs_generate_variant:Nn \tl_case:NnTF { c }
+\prg_generate_conditional_variant:Nnn \tl_case:Nn
+  { c } { T , F , TF }
 \cs_new:Npn \__prg_case_end:nw #1#2#3 \q_mark #4#5 \q_stop
   { \exp_end: #1 #4 }
 \cs_new_eq:NN \__tl_case_end:nw \__prg_case_end:nw
@@ -3664,10 +3691,8 @@
       \prg_return_false:
     \fi:
   }
-\cs_generate_variant:Nn \tl_if_head_eq_charcode_p:nN { f }
-\cs_generate_variant:Nn \tl_if_head_eq_charcode:nNTF { f }
-\cs_generate_variant:Nn \tl_if_head_eq_charcode:nNT  { f }
-\cs_generate_variant:Nn \tl_if_head_eq_charcode:nNF  { f }
+\prg_generate_conditional_variant:Nnn \tl_if_head_eq_charcode:nN
+  { f } { p , TF , T , F }
 \prg_new_conditional:Npnn \tl_if_head_eq_catcode:nN #1 #2 { p , T , F , TF }
   {
     \if_catcode:w
@@ -3961,14 +3986,8 @@
       = 0 \exp_stop_f:
       \prg_return_true: \else: \prg_return_false: \fi:
   }
-\cs_generate_variant:Nn \str_if_eq_p:nn {  V ,  o }
-\cs_generate_variant:Nn \str_if_eq_p:nn { nV , no , VV }
-\cs_generate_variant:Nn \str_if_eq:nnT  {  V ,  o }
-\cs_generate_variant:Nn \str_if_eq:nnT  { nV , no , VV }
-\cs_generate_variant:Nn \str_if_eq:nnF  {  V ,  o }
-\cs_generate_variant:Nn \str_if_eq:nnF  { nV , no , VV }
-\cs_generate_variant:Nn \str_if_eq:nnTF {  V ,  o }
-\cs_generate_variant:Nn \str_if_eq:nnTF { nV , no , VV }
+\prg_generate_conditional_variant:Nnn \str_if_eq:nn
+  { V , o , nV , no , VV } { p , T , F , TF }
 \prg_new_conditional:Npnn \str_if_eq_x:nn #1#2 { p , T , F , TF }
   {
     \if_int_compare:w \__str_if_eq_x:nn {#1} {#2} = 0 \exp_stop_f:
@@ -3979,10 +3998,8 @@
     \if_int_compare:w \__str_if_eq_x:nn { \tl_to_str:N #1 } { \tl_to_str:N #2 }
       = 0 \exp_stop_f: \prg_return_true: \else: \prg_return_false: \fi:
   }
-\cs_generate_variant:Nn \str_if_eq:NNT  { c , Nc , cc }
-\cs_generate_variant:Nn \str_if_eq:NNF  { c , Nc , cc }
-\cs_generate_variant:Nn \str_if_eq:NNTF { c , Nc , cc }
-\cs_generate_variant:Nn \str_if_eq_p:NN { c , Nc , cc }
+\prg_generate_conditional_variant:Nnn \str_if_eq:NN
+  { c , Nc , cc } { T , F , TF , p }
 \prg_new_protected_conditional:Npnn \str_if_in:Nn #1#2 { T , F , TF }
   {
     \use:x
@@ -3989,9 +4006,8 @@
       { \tl_if_in:nnTF { \tl_to_str:N #1 } { \tl_to_str:n {#2} } }
       { \prg_return_true: } { \prg_return_false: }
   }
-\cs_generate_variant:Nn \str_if_in:NnT { c }
-\cs_generate_variant:Nn \str_if_in:NnF  { c }
-\cs_generate_variant:Nn \str_if_in:NnTF { c }
+\prg_generate_conditional_variant:Nnn \str_if_in:Nn
+  { c } { T , F , TF }
 \prg_new_protected_conditional:Npnn \str_if_in:nn #1#2 { T , F , TF }
   {
     \use:x
@@ -4021,9 +4037,8 @@
 \cs_new:Npn \__str_case:nnTF #1#2#3#4
   { \__str_case:nw {#1} #2 {#1} { } \q_mark {#3} \q_mark {#4} \q_stop }
 \cs_generate_variant:Nn \str_case:nn   { o , nV , nv }
-\cs_generate_variant:Nn \str_case:nnT  { o , nV , nv }
-\cs_generate_variant:Nn \str_case:nnF  { o , nV , nv }
-\cs_generate_variant:Nn \str_case:nnTF { o , nV , nv }
+\prg_generate_conditional_variant:Nnn \str_case:nn
+  { o , nV , nv } { T , F , TF }
 \cs_new:Npn \__str_case:nw #1#2#3
   {
     \str_if_eq:nnTF {#1} {#2}
@@ -4814,10 +4829,8 @@
       \prg_return_false:
     \fi:
   }
-\cs_generate_variant:Nn \seq_if_empty_p:N { c }
-\cs_generate_variant:Nn \seq_if_empty:NT { c }
-\cs_generate_variant:Nn \seq_if_empty:NF { c }
-\cs_generate_variant:Nn \seq_if_empty:NTF { c }
+\prg_generate_conditional_variant:Nnn \seq_if_empty:N
+  { c } { p , T , F , TF }
 \prg_new_protected_conditional:Npnn \seq_if_in:Nn #1#2
   { T , F , TF }
   {
@@ -4837,12 +4850,8 @@
   }
 \cs_new:Npn \__seq_if_in:
   { \__prg_break:n { \group_end: \prg_return_true: } }
-\cs_generate_variant:Nn \seq_if_in:NnT  {     NV , Nv , No , Nx }
-\cs_generate_variant:Nn \seq_if_in:NnT  { c , cV , cv , co , cx }
-\cs_generate_variant:Nn \seq_if_in:NnF  {     NV , Nv , No , Nx }
-\cs_generate_variant:Nn \seq_if_in:NnF  { c , cV , cv , co , cx }
-\cs_generate_variant:Nn \seq_if_in:NnTF {     NV , Nv , No , Nx }
-\cs_generate_variant:Nn \seq_if_in:NnTF { c , cV , cv , co , cx }
+\prg_generate_conditional_variant:Nnn \seq_if_in:Nn
+  { NV , Nv , No , Nx , c , cV , cv , co , cx } { T , F , TF }
 \cs_new_protected:Npn \__seq_pop:NNNN #1#2#3#4
   {
     \if_meaning:w #3 \c_empty_seq
@@ -4932,12 +4941,10 @@
   { \__seq_pop_TF:NNNN \prg_do_nothing: \seq_get_left:NN #1#2 }
 \prg_new_protected_conditional:Npnn \seq_get_right:NN #1#2 { T , F , TF }
   { \__seq_pop_TF:NNNN \prg_do_nothing: \seq_get_right:NN #1#2 }
-\cs_generate_variant:Nn \seq_get_left:NNT   { c }
-\cs_generate_variant:Nn \seq_get_left:NNF   { c }
-\cs_generate_variant:Nn \seq_get_left:NNTF  { c }
-\cs_generate_variant:Nn \seq_get_right:NNT  { c }
-\cs_generate_variant:Nn \seq_get_right:NNF  { c }
-\cs_generate_variant:Nn \seq_get_right:NNTF { c }
+\prg_generate_conditional_variant:Nnn \seq_get_left:NN
+  { c } { T , F , TF }
+\prg_generate_conditional_variant:Nnn \seq_get_right:NN
+  { c } { T , F , TF }
 \prg_new_protected_conditional:Npnn \seq_pop_left:NN #1#2 { T , F , TF }
   { \__seq_pop_TF:NNNN \__seq_pop_left:NNN \tl_set:Nn #1 #2 }
 \prg_new_protected_conditional:Npnn \seq_gpop_left:NN #1#2 { T , F , TF }
@@ -4946,18 +4953,10 @@
   { \__seq_pop_TF:NNNN \__seq_pop_right:NNN \tl_set:Nx #1 #2 }
 \prg_new_protected_conditional:Npnn \seq_gpop_right:NN #1#2 { T , F , TF }
   { \__seq_pop_TF:NNNN \__seq_pop_right:NNN \tl_gset:Nx #1 #2 }
-\cs_generate_variant:Nn \seq_pop_left:NNT    { c }
-\cs_generate_variant:Nn \seq_pop_left:NNF    { c }
-\cs_generate_variant:Nn \seq_pop_left:NNTF   { c }
-\cs_generate_variant:Nn \seq_gpop_left:NNT   { c }
-\cs_generate_variant:Nn \seq_gpop_left:NNF   { c }
-\cs_generate_variant:Nn \seq_gpop_left:NNTF  { c }
-\cs_generate_variant:Nn \seq_pop_right:NNT   { c }
-\cs_generate_variant:Nn \seq_pop_right:NNF   { c }
-\cs_generate_variant:Nn \seq_pop_right:NNTF  { c }
-\cs_generate_variant:Nn \seq_gpop_right:NNT  { c }
-\cs_generate_variant:Nn \seq_gpop_right:NNF  { c }
-\cs_generate_variant:Nn \seq_gpop_right:NNTF { c }
+\prg_generate_conditional_variant:Nnn \seq_pop_left:NN { c } { T , F , TF }
+\prg_generate_conditional_variant:Nnn \seq_gpop_left:NN { c } { T , F , TF }
+\prg_generate_conditional_variant:Nnn \seq_pop_right:NN { c } { T , F , TF }
+\prg_generate_conditional_variant:Nnn \seq_gpop_right:NN { c } { T , F , TF }
 \cs_new:Npn \seq_item:Nn #1
   { \exp_after:wN \__seq_item:wNn #1 \q_stop #1 }
 \cs_new:Npn \__seq_item:wNn \s__seq #1 \q_stop #2#3
@@ -5297,12 +5296,10 @@
 \cs_generate_variant:Nn \int_gzero_new:N { c }
 \__debug_patch:nnNNpn { \__debug_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 }
-\cs_generate_variant:Nn \int_set_eq:NN { Nc , cc }
+\cs_generate_variant:Nn \int_set_eq:NN { c , Nc , cc }
 \__debug_patch:nnNNpn { \__debug_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 }
-\cs_generate_variant:Nn \int_gset_eq:NN { Nc , cc }
+\cs_generate_variant:Nn \int_gset_eq:NN { c , Nc , cc }
 \prg_new_eq_conditional:NNn \int_if_exist:N \cs_if_exist:N
   { TF , T , F , p }
 \prg_new_eq_conditional:NNn \int_if_exist:c \cs_if_exist:c
@@ -6217,10 +6214,8 @@
       \prg_return_false:
     \fi:
   }
-\cs_generate_variant:Nn \quark_if_no_value_p:N { c }
-\cs_generate_variant:Nn \quark_if_no_value:NT  { c }
-\cs_generate_variant:Nn \quark_if_no_value:NF  { c }
-\cs_generate_variant:Nn \quark_if_no_value:NTF { c }
+\prg_generate_conditional_variant:Nnn \quark_if_no_value:N
+  { c } { p , T , F , TF }
 \prg_new_conditional:Npnn \quark_if_nil:n #1 { p, T , F , TF }
   {
     \__tl_if_empty_return:o
@@ -6233,10 +6228,8 @@
       { \__quark_if_no_value:w {} #1 {} ? ! \q_no_value ? ? ! }
   }
 \cs_new:Npn \__quark_if_no_value:w #1 \q_no_value #2 ? #3 ? ! { #1 #2 }
-\cs_generate_variant:Nn \quark_if_nil_p:n { V , o }
-\cs_generate_variant:Nn \quark_if_nil:nTF { V , o }
-\cs_generate_variant:Nn \quark_if_nil:nT  { V , o }
-\cs_generate_variant:Nn \quark_if_nil:nF  { V , o }
+\prg_generate_conditional_variant:Nnn \quark_if_nil:n
+  { V , o } { p , TF , T , F }
 \quark_new:N \q__tl_act_mark
 \quark_new:N \q__tl_act_stop
 \tl_new:N \g__scan_marks_tl
@@ -6296,10 +6289,7 @@
       \prg_return_false:
     \fi:
   }
-\cs_generate_variant:Nn \bool_if_p:N { c }
-\cs_generate_variant:Nn \bool_if:NT  { c }
-\cs_generate_variant:Nn \bool_if:NF  { c }
-\cs_generate_variant:Nn \bool_if:NTF { c }
+\prg_generate_conditional_variant:Nnn \bool_if:N { c } { p , T , F , TF }
 \cs_new_protected:Npn \bool_show:n
   { \msg_show_eval:Nn \__bool_to_str:n }
 \cs_new_protected:Npn \bool_log:n
@@ -6692,9 +6682,7 @@
       \prg_return_true:
     \fi:
   }
-\cs_generate_variant:Nn \clist_get:NNT  { c }
-\cs_generate_variant:Nn \clist_get:NNF  { c }
-\cs_generate_variant:Nn \clist_get:NNTF { c }
+\prg_generate_conditional_variant:Nnn \clist_get:NN { c } { T , F , TF }
 \prg_new_protected_conditional:Npnn \clist_pop:NN #1#2 { T , F , TF }
   { \__clist_pop_TF:NNN \tl_set:Nx #1 #2 }
 \prg_new_protected_conditional:Npnn \clist_gpop:NN #1#2 { T , F , TF }
@@ -6708,12 +6696,8 @@
       \prg_return_true:
     \fi:
   }
-\cs_generate_variant:Nn \clist_pop:NNT   { c }
-\cs_generate_variant:Nn \clist_pop:NNF   { c }
-\cs_generate_variant:Nn \clist_pop:NNTF  { c }
-\cs_generate_variant:Nn \clist_gpop:NNT  { c }
-\cs_generate_variant:Nn \clist_gpop:NNF  { c }
-\cs_generate_variant:Nn \clist_gpop:NNTF { c }
+\prg_generate_conditional_variant:Nnn \clist_pop:NN { c } { T , F , TF }
+\prg_generate_conditional_variant:Nnn \clist_gpop:NN { c } { T , F , TF }
 \cs_new_eq:NN \clist_push:Nn  \clist_put_left:Nn
 \cs_new_eq:NN \clist_push:NV  \clist_put_left:NV
 \cs_new_eq:NN \clist_push:No  \clist_put_left:No
@@ -6830,15 +6814,10 @@
       { \__clist_tmp:w ,#1, {} {} ,#2, }
       { \prg_return_false: } { \prg_return_true: }
   }
-\cs_generate_variant:Nn \clist_if_in:NnT  {     NV , No }
-\cs_generate_variant:Nn \clist_if_in:NnT  { c , cV , co }
-\cs_generate_variant:Nn \clist_if_in:NnF  {     NV , No }
-\cs_generate_variant:Nn \clist_if_in:NnF  { c , cV , co }
-\cs_generate_variant:Nn \clist_if_in:NnTF {     NV , No }
-\cs_generate_variant:Nn \clist_if_in:NnTF { c , cV , co }
-\cs_generate_variant:Nn \clist_if_in:nnT  {     nV , no }
-\cs_generate_variant:Nn \clist_if_in:nnF  {     nV , no }
-\cs_generate_variant:Nn \clist_if_in:nnTF {     nV , no }
+\prg_generate_conditional_variant:Nnn \clist_if_in:Nn
+  { NV , No , c , cV , co } { T , F , TF }
+\prg_generate_conditional_variant:Nnn \clist_if_in:nn
+  { nV , no } { T , F , TF }
 \cs_new:Npn \clist_map_function:NN #1#2
   {
     \clist_if_empty:NF #1
@@ -7945,12 +7924,8 @@
       }
       { \prg_return_false: }
   }
-\cs_generate_variant:Nn \prop_pop:NnNT   { c }
-\cs_generate_variant:Nn \prop_pop:NnNF   { c }
-\cs_generate_variant:Nn \prop_pop:NnNTF  { c }
-\cs_generate_variant:Nn \prop_gpop:NnNT  { c }
-\cs_generate_variant:Nn \prop_gpop:NnNF  { c }
-\cs_generate_variant:Nn \prop_gpop:NnNTF { c }
+\prg_generate_conditional_variant:Nnn \prop_pop:NnN { c } { T , F , TF }
+\prg_generate_conditional_variant:Nnn \prop_gpop:NnN { c } { T , F , TF }
 \cs_new_protected:Npn \prop_put:Nnn  { \__prop_put:NNnn \tl_set:Nx }
 \cs_new_protected:Npn \prop_gput:Nnn { \__prop_put:NNnn \tl_gset:Nx }
 \cs_new_protected:Npn \__prop_put:NNnn #1#2#3#4
@@ -7998,10 +7973,8 @@
     \tl_if_eq:NNTF #1 \c_empty_prop
       \prg_return_true: \prg_return_false:
   }
-\cs_generate_variant:Nn \prop_if_empty_p:N { c }
-\cs_generate_variant:Nn \prop_if_empty:NT { c }
-\cs_generate_variant:Nn \prop_if_empty:NF { c }
-\cs_generate_variant:Nn \prop_if_empty:NTF { c }
+\prg_generate_conditional_variant:Nnn \prop_if_empty:N
+  { c } { p , T , F , TF }
 \prg_new_conditional:Npnn \prop_if_in:Nn #1#2 { p , T , F , TF }
   {
     \exp_last_unbraced:Noo \__prop_if_in:nwwn { \tl_to_str:n {#2} } #1
@@ -8024,14 +7997,8 @@
     \fi:
     \__prg_break:
   }
-\cs_generate_variant:Nn \prop_if_in_p:Nn {     NV , No }
-\cs_generate_variant:Nn \prop_if_in_p:Nn { c , cV , co }
-\cs_generate_variant:Nn \prop_if_in:NnT  {     NV , No }
-\cs_generate_variant:Nn \prop_if_in:NnT  { c , cV , co }
-\cs_generate_variant:Nn \prop_if_in:NnF  {     NV , No }
-\cs_generate_variant:Nn \prop_if_in:NnF  { c , cV , co }
-\cs_generate_variant:Nn \prop_if_in:NnTF {     NV , No }
-\cs_generate_variant:Nn \prop_if_in:NnTF { c , cV , co }
+\prg_generate_conditional_variant:Nnn \prop_if_in:Nn
+  { NV , No , c , cV , co } { p , T , F , TF }
 \prg_new_protected_conditional:Npnn \prop_get:NnN #1#2#3 { T , F , TF }
   {
     \__prop_split:NnTF #1 {#2}
@@ -8041,12 +8008,8 @@
       }
       { \prg_return_false: }
   }
-\cs_generate_variant:Nn \prop_get:NnNT  {     NV , No }
-\cs_generate_variant:Nn \prop_get:NnNF  {     NV , No }
-\cs_generate_variant:Nn \prop_get:NnNTF {     NV , No }
-\cs_generate_variant:Nn \prop_get:NnNT  { c , cV , co }
-\cs_generate_variant:Nn \prop_get:NnNF  { c , cV , co }
-\cs_generate_variant:Nn \prop_get:NnNTF { c , cV , co }
+\prg_generate_conditional_variant:Nnn \prop_get:NnN
+  { NV , No , c , cV , co } { T , F , TF }
 \cs_new:Npn \prop_map_function:NN #1#2
   {
     \exp_last_unbraced:NNo \__prop_map_function:Nwwn #2 #1
@@ -8061,8 +8024,7 @@
     #1 {#3} {#4}
     \__prop_map_function:Nwwn #1
   }
-\cs_generate_variant:Nn \prop_map_function:NN {     Nc }
-\cs_generate_variant:Nn \prop_map_function:NN { c , cc }
+\cs_generate_variant:Nn \prop_map_function:NN { Nc , c , cc }
 \cs_new_protected:Npn \prop_map_inline:Nn #1#2
   {
     \cs_gset_eq:cN
@@ -9146,6 +9108,8 @@
   }
 \cs_new_protected:Npn \ior_new:N #1 { \cs_new_eq:NN #1 \c_term_ior }
 \cs_generate_variant:Nn \ior_new:N { c }
+\ior_new:N \g_tmpa_ior
+\ior_new:N \g_tmpb_ior
 \cs_new_protected:Npn \ior_open:Nn #1#2
   { \ior_open:NnF #1 {#2} { \__file_missing:n {#2} } }
 \cs_generate_variant:Nn \ior_open:Nn { c }
@@ -9159,9 +9123,7 @@
         \prg_return_true:
       }
   }
-\cs_generate_variant:Nn \ior_open:NnT  { c }
-\cs_generate_variant:Nn \ior_open:NnF  { c }
-\cs_generate_variant:Nn \ior_open:NnTF { c }
+\prg_generate_conditional_variant:Nnn \ior_open:Nn { c } { T , F , TF }
 \exp_args:NNf \cs_new_protected:Npn \__ior_new:N
   { \exp_args:NNc \exp_after:wN \exp_stop_f: { newread } }
 \cs_new_protected:Npn \__ior_open:Nn #1#2
@@ -9296,6 +9258,8 @@
   }
 \cs_new_protected:Npn \iow_new:N #1 { \cs_new_eq:NN #1 \c_term_iow }
 \cs_generate_variant:Nn \iow_new:N { c }
+\iow_new:N \g_tmpa_iow
+\iow_new:N \g_tmpb_iow
 \exp_args:NNf \cs_new_protected:Npn \__iow_new:N
   { \exp_args:NNc \exp_after:wN \exp_stop_f: { newwrite } }
 \cs_new_protected:Npn \iow_open:Nn #1#2
@@ -9802,13 +9766,11 @@
 \__debug_patch:nnNNpn { \__debug_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 }
-\cs_generate_variant:Nn \dim_set_eq:NN { Nc , cc }
+\cs_generate_variant:Nn \dim_set_eq:NN { c , Nc , cc }
 \__debug_patch:nnNNpn { \__debug_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 }
-\cs_generate_variant:Nn \dim_gset_eq:NN { Nc , cc }
+\cs_generate_variant:Nn \dim_gset_eq:NN { c , Nc , cc }
 \__dim_tmp:w \__debug_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: }
@@ -10102,11 +10064,9 @@
 \cs_generate_variant:Nn \skip_set:Nn  { c }
 \cs_generate_variant:Nn \skip_gset:Nn { c }
 \cs_new_protected:Npn \skip_set_eq:NN #1#2 { #1 = #2 }
-\cs_generate_variant:Nn \skip_set_eq:NN {       c }
-\cs_generate_variant:Nn \skip_set_eq:NN { Nc , cc }
+\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 }
-\cs_generate_variant:Nn \skip_gset_eq:NN { Nc , cc }
+\cs_generate_variant:Nn \skip_gset_eq:NN { c , Nc , cc }
 \__dim_tmp:w \__debug_chk_var_local:N
 \cs_new_protected:Npn \skip_add:Nn #1#2
   { \tex_advance:D #1 by \etex_glueexpr:D #2 \scan_stop: }
@@ -10238,12 +10198,10 @@
 \cs_generate_variant:Nn \muskip_gset:Nn { c }
 \__debug_patch:nnNNpn { \__debug_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 }
-\cs_generate_variant:Nn \muskip_set_eq:NN { Nc , cc }
+\cs_generate_variant:Nn \muskip_set_eq:NN { c , Nc , cc }
 \__debug_patch:nnNNpn { \__debug_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 }
-\cs_generate_variant:Nn \muskip_gset_eq:NN { Nc , cc }
+\cs_generate_variant:Nn \muskip_gset_eq:NN { c , Nc , cc }
 \__dim_tmp:w \__debug_chk_var_local:N
 \cs_new_protected:Npn \muskip_add:Nn #1#2
   { \tex_advance:D #1 by \etex_muexpr:D #2 \scan_stop: }
@@ -20043,6 +20001,10 @@
   }
 \cs_new_protected:Npn \regex_new:N #1
   { \cs_new_eq:NN #1 \c__regex_no_match_regex }
+\regex_new:N \l_tmpa_regex
+\regex_new:N \l_tmpb_regex
+\regex_new:N \g_tmpa_regex
+\regex_new:N \g_tmpb_regex
 \cs_new_protected:Npn \regex_set:Nn #1#2
   {
     \__regex_compile:n {#2}
@@ -20749,20 +20711,14 @@
   { \if_hbox:N #1 \prg_return_true: \else: \prg_return_false: \fi: }
 \prg_new_conditional:Npnn \box_if_vertical:N #1 { p , T , F , TF }
   { \if_vbox:N #1 \prg_return_true: \else: \prg_return_false: \fi: }
-\cs_generate_variant:Nn \box_if_horizontal_p:N { c }
-\cs_generate_variant:Nn \box_if_horizontal:NT  { c }
-\cs_generate_variant:Nn \box_if_horizontal:NF  { c }
-\cs_generate_variant:Nn \box_if_horizontal:NTF { c }
-\cs_generate_variant:Nn \box_if_vertical_p:N { c }
-\cs_generate_variant:Nn \box_if_vertical:NT  { c }
-\cs_generate_variant:Nn \box_if_vertical:NF  { c }
-\cs_generate_variant:Nn \box_if_vertical:NTF { c }
+\prg_generate_conditional_variant:Nnn \box_if_horizontal:N
+  { c } { p , T , F , TF }
+\prg_generate_conditional_variant:Nnn \box_if_vertical:N
+  { c } { p , T , F , TF }
 \prg_new_conditional:Npnn \box_if_empty:N #1 { p , T , F , TF }
   { \if_box_empty:N #1 \prg_return_true: \else: \prg_return_false: \fi: }
-\cs_generate_variant:Nn \box_if_empty_p:N { c }
-\cs_generate_variant:Nn \box_if_empty:NT  { c }
-\cs_generate_variant:Nn \box_if_empty:NF  { c }
-\cs_generate_variant:Nn \box_if_empty:NTF { c }
+\prg_generate_conditional_variant:Nnn \box_if_empty:N
+  { c } { p , T , F , TF }
 \__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \box_set_to_last:N #1
   { \tex_setbox:D #1 \tex_lastbox:D }
@@ -21036,7 +20992,7 @@
         \tex_kern:D -\l__box_left_new_dim
         \hbox:n
           {
-            \__driver_box_use_rotate:Nn
+            \driver_box_use_rotate:Nn
               \l__box_internal_box
               \l__box_angle_fp
           }
@@ -21257,7 +21213,7 @@
   {
     \hbox_set:Nn \l__box_internal_box
       {
-        \__driver_box_use_scale:Nnn
+        \driver_box_use_scale:Nnn
           #1
           \l__box_scale_x_fp
           \l__box_scale_y_fp
@@ -21348,10 +21304,8 @@
       }
       { \prg_return_false: }
   }
-\cs_generate_variant:Nn \coffin_if_exist_p:N { c }
-\cs_generate_variant:Nn \coffin_if_exist:NT  { c }
-\cs_generate_variant:Nn \coffin_if_exist:NF  { c }
-\cs_generate_variant:Nn \coffin_if_exist:NTF { c }
+\prg_generate_conditional_variant:Nnn \coffin_if_exist:N
+  { c } { p , T , F , TF }
 \cs_new_protected:Npn \__coffin_if_exist:NT #1#2
   {
     \coffin_if_exist:NTF #1
@@ -22280,7 +22234,7 @@
      }
   }
 \cs_new_protected:Npn \box_clip:N #1
-  { \hbox_set:Nn #1 { \__driver_box_use_clip:N #1 } }
+  { \hbox_set:Nn #1 { \driver_box_use_clip:N #1 } }
 \cs_generate_variant:Nn \box_clip:N { c }
 \cs_new_protected:Npn \box_trim:Nnnnn #1#2#3#4#5
   {
@@ -22886,8 +22840,7 @@
     #1 {#3} {#6}
     \__seq_mapthread_function:Nnnwnn #1 #4 \q_stop
   }
-\cs_generate_variant:Nn \seq_mapthread_function:NNN {     Nc }
-\cs_generate_variant:Nn \seq_mapthread_function:NNN { c , cc }
+\cs_generate_variant:Nn \seq_mapthread_function:NNN { Nc , c , cc }
 \cs_new_protected:Npn \seq_set_filter:NNn
   { \__seq_set_filter:NNNn \tl_set:Nx }
 \cs_new_protected:Npn \seq_gset_filter:NNn

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex	2017-12-17 23:16:51 UTC (rev 46085)
@@ -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/05}%
+\def\ExplFileDate{2017/12/16}%
 \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	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty	2017-12-17 23:16:51 UTC (rev 46085)
@@ -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/05}%
+\def\ExplFileDate{2017/12/16}%
 \let\ExplLoaderFileDate\ExplFileDate
 \ProvidesPackage{expl3}
   [%

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls	2017-12-17 23:16:51 UTC (rev 46085)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3doc.dtx Copyright (C) 1990-2017 The LaTeX3 project
 \RequirePackage{expl3,xparse,calc}
-\ProvidesExplClass{l3doc}{2017/12/05}{}
+\ProvidesExplClass{l3doc}{2017/12/16}{}
   {L3 Experimental documentation class}
 \clist_new:N \g_docinput_clist
 \seq_new:N \g_doc_functions_seq

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvipdfmx.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvipdfmx.def	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvipdfmx.def	2017-12-17 23:16:51 UTC (rev 46085)
@@ -69,7 +69,7 @@
   { \tex_special:D { x:gsave } }
 \cs_new_protected:Npn \__driver_scope_end:
   { \tex_special:D { x:grestore } }
-\cs_new_protected:Npn \__driver_box_use_clip:N #1
+\cs_new_protected:Npn \driver_box_use_clip:N #1
   {
     \__driver_scope_begin:
     \__driver_literal:n
@@ -84,7 +84,7 @@
     \__driver_scope_end:
     \skip_horizontal:n { \box_wd:N #1 }
   }
-\cs_new_protected:Npn \__driver_box_use_rotate:Nn #1#2
+\cs_new_protected:Npn \driver_box_use_rotate:Nn #1#2
   {
     \__driver_scope_begin:
     \tex_special:D
@@ -97,7 +97,7 @@
     \box_use:N #1
     \__driver_scope_end:
   }
-\cs_new_protected:Npn \__driver_box_use_scale:Nnn #1#2#3
+\cs_new_protected:Npn \driver_box_use_scale:Nnn #1#2#3
   {
     \__driver_scope_begin:
     \tex_special:D
@@ -109,19 +109,19 @@
     \hbox_overlap_right:n { \box_use:N #1 }
     \__driver_scope_end:
   }
-\cs_new_eq:NN \__driver_image_getbb_eps:n \__image_read_bb:n
+\cs_new_eq:NN \__driver_image_getbb_eps:n \image_read_bb:n
 \cs_new_protected:Npn \__driver_image_getbb_jpg:n #1
   {
-    \int_zero:N \l__image_page_int
-    \tl_clear:N \l__image_pagebox_tl
-    \__image_extract_bb:n {#1}
+    \int_zero:N \l_image_page_int
+    \tl_clear:N \l_image_pagebox_tl
+    \image_extract_bb:n {#1}
   }
 \cs_new_eq:NN \__driver_image_getbb_png:n \__driver_image_getbb_jpg:n
 \cs_new_protected:Npn \__driver_image_getbb_pdf:n #1
   {
-    \tl_clear:N \l__image_decode_tl
-    \bool_set_false:N \l__image_interpolate_bool
-    \__image_extract_bb:n {#1}
+    \tl_clear:N \l_image_decode_tl
+    \bool_set_false:N \l_image_interpolate_bool
+    \image_extract_bb:n {#1}
   }
 \int_new:N \g__driver_image_int
 \cs_new_protected:Npn \__driver_image_include_eps:n #1
@@ -137,13 +137,13 @@
   {
     \__driver_image_include_auxii:xnn
       {
-        \tl_if_empty:NF \l__image_pagebox_tl
-          { : \l__image_pagebox_tl }
-        \int_compare:nNnT \l__image_page_int > 1
-          { :P \int_use:N \l__image_page_int }
-        \tl_if_empty:NF \l__image_decode_tl
-          { :D \l__image_decode_tl }
-        \bool_if:NT \l__image_interpolate_bool
+        \tl_if_empty:NF \l_image_pagebox_tl
+          { : \l_image_pagebox_tl }
+        \int_compare:nNnT \l_image_page_int > 1
+          { :P \int_use:N \l_image_page_int }
+        \tl_if_empty:NF \l_image_decode_tl
+          { :D \l_image_decodearray_tl }
+        \bool_if:NT \l_image_interpolate_bool
            { :I }
       }
       {#1} {#2}
@@ -150,10 +150,10 @@
   }
 \cs_new_protected:Npn \__driver_image_include_auxii:nnn #1#2#3
   {
-    \int_if_exist:cTF { c__image_ #2#1 _int }
+    \int_if_exist:cTF { c__driver_image_ #2#1 _int }
       {
         \tex_special:D
-          { pdf:usexobj~@image \int_use:c { c__image_ #2#1 _int } }
+          { pdf:usexobj~@image \int_use:c { c__driver_image_ #2#1 _int } }
       }
       { \__driver_image_include_auxiii:nn {#2} {#1} {#3} }
   }
@@ -161,31 +161,31 @@
 \cs_new_protected:Npn \__driver_image_include_auxiii:nnn #1#2#3
   {
     \int_gincr:N \g__driver_image_int
-    \int_const:cn { c__image_ #1#2 _int } { \g__driver_image_int }
+    \int_const:cn { c__driver_image_ #1#2 _int } { \g__driver_image_int }
     \tex_special:D
       {
         pdf:#3~
-        @image \int_use:c { c__image_ #1#2 _int }
-        \int_compare:nNnT \l__image_page_int > 1
-          { page ~ \int_use:N \l__image_page_int \c_space_tl }
-        \tl_if_empty:NF \l__image_pagebox_tl
+        @image \int_use:c { c__driver_image_ #1#2 _int }
+        \int_compare:nNnT \l_image_page_int > 1
+          { page ~ \int_use:N \l_image_page_int \c_space_tl }
+        \tl_if_empty:NF \l_image_pagebox_tl
           {
-            pagebox ~ \l__image_pagebox_tl \c_space_tl
+            pagebox ~ \l_image_pagebox_tl \c_space_tl
             bbox ~
-              \dim_to_decimal_in_bp:n \l__image_llx_dim \c_space_tl
-              \dim_to_decimal_in_bp:n \l__image_lly_dim \c_space_tl
-              \dim_to_decimal_in_bp:n \l__image_urx_dim \c_space_tl
-              \dim_to_decimal_in_bp:n \l__image_ury_dim \c_space_tl
+              \dim_to_decimal_in_bp:n \l_image_llx_dim \c_space_tl
+              \dim_to_decimal_in_bp:n \l_image_lly_dim \c_space_tl
+              \dim_to_decimal_in_bp:n \l_image_urx_dim \c_space_tl
+              \dim_to_decimal_in_bp:n \l_image_ury_dim \c_space_tl
           }
         (#1)
         \bool_lazy_or:nnT
-          { \l__image_interpolate_bool }
-          { ! \tl_if_empty_p:N \l__image_decode_tl }
+          { \l_image_interpolate_bool }
+          { ! \tl_if_empty_p:N \l_image_decodearray_tl }
           {
             <<
-              \tl_if_empty:NF \l__image_decode_tl
-                { /Decode~[ \l__image_decode_tl ] }
-              \bool_if:NT \l__image_interpolate_bool
+              \tl_if_empty:NF \l_image_decode_tl
+                { /Decode~[ \l_image_decodearray_tl ] }
+              \bool_if:NT \l_image_interpolate_bool
                 { /Interpolate~true> }
             >>
           }
@@ -193,25 +193,25 @@
   }
 \cs_new_eq:NN \__driver_draw_literal:n \__driver_literal:n
 \cs_generate_variant:Nn \__driver_draw_literal:n { x }
-\cs_new_protected:Npn \__driver_draw_begin:
-  { \__driver_draw_scope_begin: }
-\cs_new_protected:Npn \__driver_draw_end:
-  { \__driver_draw_scope_end: }
-\cs_new_protected:Npn \__driver_draw_scope_begin:
+\cs_new_protected:Npn \driver_draw_begin:
+  { \driver_draw_scope_begin: }
+\cs_new_protected:Npn \driver_draw_end:
+  { \driver_draw_scope_end: }
+\cs_new_protected:Npn \driver_draw_scope_begin:
   { \__driver_draw_literal:n { q } }
-\cs_new_protected:Npn \__driver_draw_scope_end:
+\cs_new_protected:Npn \driver_draw_scope_end:
   { \__driver_draw_literal:n { Q } }
-\cs_new_protected:Npn \__driver_draw_moveto:nn #1#2
+\cs_new_protected:Npn \driver_draw_moveto:nn #1#2
   {
     \__driver_draw_literal:x
       { \dim_to_decimal_in_bp:n {#1} ~ \dim_to_decimal_in_bp:n {#2} ~ m }
   }
-\cs_new_protected:Npn \__driver_draw_lineto:nn #1#2
+\cs_new_protected:Npn \driver_draw_lineto:nn #1#2
   {
     \__driver_draw_literal:x
       { \dim_to_decimal_in_bp:n {#1} ~ \dim_to_decimal_in_bp:n {#2} ~ l }
   }
-\cs_new_protected:Npn \__driver_draw_curveto:nnnnnn #1#2#3#4#5#6
+\cs_new_protected:Npn \driver_draw_curveto:nnnnnn #1#2#3#4#5#6
   {
     \__driver_draw_literal:x
       {
@@ -221,7 +221,7 @@
         c
       }
  }
-\cs_new_protected:Npn \__driver_draw_rectangle:nnnn #1#2#3#4
+\cs_new_protected:Npn \driver_draw_rectangle:nnnn #1#2#3#4
   {
      \__driver_draw_literal:x
       {
@@ -230,35 +230,35 @@
         re
       }
   }
-\cs_new_protected:Npn \__driver_draw_evenodd_rule:
+\cs_new_protected:Npn \driver_draw_evenodd_rule:
   { \bool_gset_true:N \g__driver_draw_eor_bool }
-\cs_new_protected:Npn \__driver_draw_nonzero_rule:
+\cs_new_protected:Npn \driver_draw_nonzero_rule:
   { \bool_gset_false:N \g__driver_draw_eor_bool }
 \bool_new:N \g__driver_draw_eor_bool
-\cs_new_protected:Npn \__driver_draw_closepath:
+\cs_new_protected:Npn \driver_draw_closepath:
   { \__driver_draw_literal:n { h } }
-\cs_new_protected:Npn \__driver_draw_stroke:
+\cs_new_protected:Npn \driver_draw_stroke:
   { \__driver_draw_literal:n { S } }
-\cs_new_protected:Npn \__driver_draw_closestroke:
+\cs_new_protected:Npn \driver_draw_closestroke:
   { \__driver_draw_literal:n { s } }
-\cs_new_protected:Npn \__driver_draw_fill:
+\cs_new_protected:Npn \driver_draw_fill:
   {
     \__driver_draw_literal:x
       { f \bool_if:NT \g__driver_draw_eor_bool * }
   }
-\cs_new_protected:Npn \__driver_draw_fillstroke:
+\cs_new_protected:Npn \driver_draw_fillstroke:
   {
     \__driver_draw_literal:x
       { B \bool_if:NT \g__driver_draw_eor_bool * }
   }
-\cs_new_protected:Npn \__driver_draw_clip:
+\cs_new_protected:Npn \driver_draw_clip:
   {
     \__driver_draw_literal:x
       { W \bool_if:NT \g__driver_draw_eor_bool * }
   }
-\cs_new_protected:Npn \__driver_draw_discardpath:
+\cs_new_protected:Npn \driver_draw_discardpath:
   { \__driver_draw_literal:n { n } }
-\cs_new_protected:Npn \__driver_draw_dash:nn #1#2
+\cs_new_protected:Npn \driver_draw_cap_dash:nn #1#2
   {
     \__driver_draw_literal:x
       {
@@ -270,26 +270,26 @@
   }
 \cs_new:Npn \__driver_draw_dash:n #1
   { \dim_to_decimal_in_bp:n {#1} ~ }
-\cs_new_protected:Npn \__driver_draw_linewidth:n #1
+\cs_new_protected:Npn \driver_draw_linewidth:n #1
   {
     \__driver_draw_literal:x
       { \dim_to_decimal_in_bp:n {#1} ~ w }
   }
-\cs_new_protected:Npn \__driver_draw_miterlimit:n #1
+\cs_new_protected:Npn \driver_draw_miterlimit:n #1
   { \__driver_draw_literal:x { \fp_eval:n {#1} ~ M } }
-\cs_new_protected:Npn \__driver_draw_cap_butt:
+\cs_new_protected:Npn \driver_draw_cap_butt:
   { \__driver_draw_literal:n { 0 ~ J } }
-\cs_new_protected:Npn \__driver_draw_cap_round:
+\cs_new_protected:Npn \driver_draw_cap_round:
   { \__driver_draw_literal:n { 1 ~ J } }
-\cs_new_protected:Npn \__driver_draw_cap_rectangle:
+\cs_new_protected:Npn \driver_draw_cap_rectangle:
   { \__driver_draw_literal:n { 2 ~ J } }
-\cs_new_protected:Npn \__driver_draw_join_miter:
+\cs_new_protected:Npn \driver_draw_join_miter:
   { \__driver_draw_literal:n { 0 ~ j } }
-\cs_new_protected:Npn \__driver_draw_join_round:
+\cs_new_protected:Npn \driver_draw_join_round:
   { \__driver_draw_literal:n { 1 ~ j } }
-\cs_new_protected:Npn \__driver_draw_join_bevel:
+\cs_new_protected:Npn \driver_draw_join_bevel:
   { \__driver_draw_literal:n { 2 ~ j } }
-\cs_new_protected:Npn \__driver_draw_color_cmyk:nnnn #1#2#3#4
+\cs_new_protected:Npn \driver_draw_color_cmyk:nnnn #1#2#3#4
   {
     \use:x
       {
@@ -305,7 +305,7 @@
     \__driver_draw_literal:n
       { #1 ~ #2 ~ #3 ~ #4 ~ k ~ #1 ~ #2 ~ #3 ~ #4 ~ K }
   }
-\cs_new_protected:Npn \__driver_draw_color_cmyk_fill:nnnn #1#2#3#4
+\cs_new_protected:Npn \driver_draw_fill_cmyk:nnnn #1#2#3#4
   {
     \__driver_draw_literal:x
       {
@@ -314,7 +314,7 @@
         k
       }
   }
-\cs_new_protected:Npn \__driver_draw_color_cmyk_stroke:nnnn #1#2#3#4
+\cs_new_protected:Npn \driver_draw_stroke_cmyk:nnnn #1#2#3#4
   {
     \__driver_draw_literal:x
       {
@@ -323,7 +323,7 @@
         K
       }
   }
-\cs_new_protected:Npn \__driver_draw_color_gray:n #1
+\cs_new_protected:Npn \driver_draw_color_gray:n #1
   {
     \use:x
       { \__driver_draw_color_gray_aux:n { \fp_eval:n {#1} } }
@@ -332,11 +332,11 @@
   {
     \__driver_draw_literal:n { #1 ~ g ~ #1 ~ G }
   }
-\cs_new_protected:Npn \__driver_draw_color_gray_fill:n #1
+\cs_new_protected:Npn \driver_draw_fill_gray:n #1
   { \__driver_draw_literal:x { \fp_eval:n {#1} ~ g } }
-\cs_new_protected:Npn \__driver_draw_color_gray_stroke:n #1
+\cs_new_protected:Npn \driver_draw_stroke_gray:n #1
   { \__driver_draw_literal:x { \fp_eval:n {#1} ~ G } }
-\cs_new_protected:Npn \__driver_draw_color_rgb:nnn #1#2#3
+\cs_new_protected:Npn \driver_draw_color_rgb:nnn #1#2#3
   {
     \use:x
       {
@@ -351,17 +351,17 @@
     \__driver_draw_literal:n
       { #1 ~ #2 ~ #3 ~ rg ~ #1 ~ #2 ~ #3 ~ RG }
   }
-\cs_new_protected:Npn \__driver_draw_color_rgb_fill:nnn #1#2#3
+\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 }
   }
-\cs_new_protected:Npn \__driver_draw_color_rgb_stroke:nnn #1#2#3
+\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 }
   }
-\cs_new_protected:Npn \__driver_draw_transformcm:nnnnnn #1#2#3#4#5#6
+\cs_new_protected:Npn \driver_draw_transformcm:nnnnnn #1#2#3#4#5#6
   {
     \__driver_draw_literal:x
       {
@@ -371,13 +371,13 @@
         cm
       }
   }
-\cs_new_protected:Npn \__driver_draw_hbox:Nnnnnnn #1#2#3#4#5#6#7
+\cs_new_protected:Npn \driver_draw_hbox:Nnnnnnn #1#2#3#4#5#6#7
   {
     \hbox_set:Nn \l__driver_tmp_box
       {
         \tex_kern:D \__dim_eval:n {#6}
         \__driver_scope_begin:
-        \__driver_draw_transformcm:nnnnnn {#2} {#3} {#4} {#5}
+        \driver_draw_transformcm:nnnnnn {#2} {#3} {#4} {#5}
           { 0pt } { 0pt }
         \box_move_up:nn {#7} { \box_use:N #1 }
         \__driver_scope_end:

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvips.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvips.def	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvips.def	2017-12-17 23:16:51 UTC (rev 46085)
@@ -86,7 +86,7 @@
      #1 ~
      setmatrix
   }
-\cs_new_protected:Npn \__driver_box_use_clip:N #1
+\cs_new_protected:Npn \driver_box_use_clip:N #1
   {
     \__driver_scope_begin:
     \__driver_literal:n
@@ -104,7 +104,7 @@
     \__driver_scope_end:
     \skip_horizontal:n { \box_wd:N #1 }
   }
-\cs_new_protected:Npn \__driver_box_use_rotate:Nn #1#2
+\cs_new_protected:Npn \driver_box_use_rotate:Nn #1#2
   {
     \__driver_scope_begin:
     \__driver_literal:n
@@ -117,7 +117,7 @@
    \box_use:N #1
    \__driver_scope_end:
   }
-\cs_new_protected:Npn \__driver_box_use_scale:Nnn #1#2#3
+\cs_new_protected:Npn \driver_box_use_scale:Nnn #1#2#3
   {
     \__driver_scope_begin:
     \__driver_literal:n
@@ -129,7 +129,7 @@
     \hbox_overlap_right:n { \box_use:N #1 }
     \__driver_scope_end:
   }
-\cs_new_eq:NN \__driver_image_getbb_eps:n \__image_read_bb:n
+\cs_new_eq:NN \__driver_image_getbb_eps:n \image_read_bb:n
 \cs_new_protected:Npn \__driver_image_include_eps:n #1
   {
     \tex_special:D { PSfile = #1 }
@@ -137,7 +137,7 @@
 \cs_new_protected:Npn \__driver_draw_literal:n #1
   { \tex_special:D { ps:: ~ #1 } }
 \cs_generate_variant:Nn \__driver_draw_literal:n { x }
-\cs_new_protected:Npn \__driver_draw_begin:
+\cs_new_protected:Npn \driver_draw_begin:
   {
     \tex_special:D { ps::[begin] }
     \tex_special:D { ps::~save }
@@ -144,27 +144,27 @@
     \tex_special:D { ps::~/l3x~currentpoint~/l3y~exch~def~def }
     \tex_special:D { ps::~@beginspecial }
   }
-\cs_new_protected:Npn \__driver_draw_end:
+\cs_new_protected:Npn \driver_draw_end:
   {
     \tex_special:D { ps::~@endspecial }
     \tex_special:D { ps::~restore }
     \tex_special:D { ps::[end] }
   }
-\cs_new_protected:Npn \__driver_draw_scope_begin:
+\cs_new_protected:Npn \driver_draw_scope_begin:
   { \__driver_draw_literal:n { save } }
-\cs_new_protected:Npn \__driver_draw_scope_end:
+\cs_new_protected:Npn \driver_draw_scope_end:
   { \__driver_draw_literal:n { restore } }
-\cs_new_protected:Npn \__driver_draw_moveto:nn #1#2
+\cs_new_protected:Npn \driver_draw_moveto:nn #1#2
   {
     \__driver_draw_literal:x
       { \dim_to_decimal_in_bp:n {#1} ~ \dim_to_decimal_in_bp:n {#2} ~ moveto }
   }
-\cs_new_protected:Npn \__driver_draw_lineto:nn #1#2
+\cs_new_protected:Npn \driver_draw_lineto:nn #1#2
   {
     \__driver_draw_literal:x
       { \dim_to_decimal_in_bp:n {#1} ~ \dim_to_decimal_in_bp:n {#2} ~ lineto }
   }
-\cs_new_protected:Npn \__driver_draw_rectangle:nnnn #1#2#3#4
+\cs_new_protected:Npn \driver_draw_rectangle:nnnn #1#2#3#4
   {
      \__driver_draw_literal:x
        {
@@ -173,7 +173,7 @@
          moveto~dup~0~rlineto~exch~0~exch~rlineto~neg~0~rlineto~closepath
       }
   }
-\cs_new_protected:Npn \__driver_draw_curveto:nnnnnn #1#2#3#4#5#6
+\cs_new_protected:Npn \driver_draw_curveto:nnnnnn #1#2#3#4#5#6
   {
     \__driver_draw_literal:x
       {
@@ -183,14 +183,14 @@
         curveto
       }
  }
-\cs_new_protected:Npn \__driver_draw_evenodd_rule:
+\cs_new_protected:Npn \driver_draw_evenodd_rule:
   { \bool_gset_true:N \g__driver_draw_eor_bool }
-\cs_new_protected:Npn \__driver_draw_nonzero_rule:
+\cs_new_protected:Npn \driver_draw_nonzero_rule:
   { \bool_gset_false:N \g__driver_draw_eor_bool }
 \bool_new:N \g__driver_draw_eor_bool
-\cs_new_protected:Npn \__driver_draw_closepath:
+\cs_new_protected:Npn \driver_draw_closepath:
   { \__driver_draw_literal:n { closepath } }
-\cs_new_protected:Npn \__driver_draw_stroke:
+\cs_new_protected:Npn \driver_draw_stroke:
   {
     \__driver_draw_literal:n { currentdict~/l3sc~known~{gsave~l3sc}~if }
     \__driver_draw_literal:n { stroke }
@@ -206,12 +206,12 @@
     \__driver_draw_literal:n { newpath }
     \bool_gset_false:N \g__driver_draw_clip_bool
   }
-\cs_new_protected:Npn \__driver_draw_closestroke:
+\cs_new_protected:Npn \driver_draw_closestroke:
   {
-    \__driver_draw_closepath:
-    \__driver_draw_stroke:
+    \driver_draw_closepath:
+    \driver_draw_stroke:
   }
-\cs_new_protected:Npn \__driver_draw_fill:
+\cs_new_protected:Npn \driver_draw_fill:
   {
     \__driver_draw_literal:n { currentdict~/l3fc~known~{gsave~l3fc}~if }
     \__driver_draw_literal:x
@@ -231,7 +231,7 @@
     \__driver_draw_literal:n { newpath }
     \bool_gset_false:N \g__driver_draw_clip_bool
   }
-\cs_new_protected:Npn \__driver_draw_fillstroke:
+\cs_new_protected:Npn \driver_draw_fillstroke:
   {
     \__driver_draw_literal:n { currentdict~/l3fc~known~{gsave~l3fc}~if }
     \__driver_draw_literal:x
@@ -254,10 +254,10 @@
     \__driver_draw_literal:n { newpath }
     \bool_gset_false:N \g__driver_draw_clip_bool
   }
-\cs_new_protected:Npn \__driver_draw_clip:
+\cs_new_protected:Npn \driver_draw_clip:
   { \bool_gset_true:N \g__driver_draw_clip_bool }
 \bool_new:N \g__driver_draw_clip_bool
-\cs_new_protected:Npn \__driver_draw_discardpath:
+\cs_new_protected:Npn \driver_draw_discardpath:
   {
     \bool_if:NT \g__driver_draw_clip_bool
       {
@@ -270,7 +270,7 @@
     \__driver_draw_literal:n { newpath }
     \bool_gset_false:N \g__driver_draw_clip_bool
   }
-\cs_new_protected:Npn \__driver_draw_dash:nn #1#2
+\cs_new_protected:Npn \driver_draw_cap_dash:nn #1#2
   {
     \__driver_draw_literal:x
       {
@@ -282,24 +282,24 @@
   }
 \cs_new:Npn \__driver_draw_dash:n #1
   { \dim_to_decimal_in_bp:n {#1} ~ }
-\cs_new_protected:Npn \__driver_draw_linewidth:n #1
+\cs_new_protected:Npn \driver_draw_linewidth:n #1
   {
     \__driver_draw_literal:x
       { \dim_to_decimal_in_bp:n {#1} ~ setlinewidth }
   }
-\cs_new_protected:Npn \__driver_draw_miterlimit:n #1
+\cs_new_protected:Npn \driver_draw_miterlimit:n #1
   { \__driver_draw_literal:x { \fp_eval:n {#1} ~ setmiterlimit } }
-\cs_new_protected:Npn \__driver_draw_cap_butt:
+\cs_new_protected:Npn \driver_draw_cap_butt:
   { \__driver_draw_literal:n { 0 ~ setlinecap } }
-\cs_new_protected:Npn \__driver_draw_cap_round:
+\cs_new_protected:Npn \driver_draw_cap_round:
   { \__driver_draw_literal:n { 1 ~ setlinecap } }
-\cs_new_protected:Npn \__driver_draw_cap_rectangle:
+\cs_new_protected:Npn \driver_draw_cap_rectangle:
   { \__driver_draw_literal:n { 2 ~ setlinecap } }
-\cs_new_protected:Npn \__driver_draw_join_miter:
+\cs_new_protected:Npn \driver_draw_join_miter:
   { \__driver_draw_literal:n { 0 ~ setlinejoin } }
-\cs_new_protected:Npn \__driver_draw_join_round:
+\cs_new_protected:Npn \driver_draw_join_round:
   { \__driver_draw_literal:n { 1 ~ setlinejoin } }
-\cs_new_protected:Npn \__driver_draw_join_bevel:
+\cs_new_protected:Npn \driver_draw_join_bevel:
   { \__driver_draw_literal:n { 2 ~ setlinejoin } }
 \cs_new_protected:Npn \__driver_draw_color_reset:
   {
@@ -306,7 +306,7 @@
     \__driver_draw_literal:n { currentdic~/l3fc~known~{ /l3fc~ { } ~def }~if }
     \__driver_draw_literal:n { currentdic~/l3sc~known~{ /l3sc~ { } ~def }~if }
   }
-\cs_new_protected:Npn \__driver_draw_color_cmyk:nnnn #1#2#3#4
+\cs_new_protected:Npn \driver_draw_color_cmyk:nnnn #1#2#3#4
   {
     \__driver_draw_literal:x
       {
@@ -316,7 +316,7 @@
       }
     \__driver_draw_color_reset:
   }
-\cs_new_protected:Npn \__driver_draw_color_cmyk_fill:nnnn #1#2#3#4
+\cs_new_protected:Npn \driver_draw_fill_cmyk:nnnn #1#2#3#4
   {
     \__driver_draw_literal:x
       {
@@ -329,7 +329,7 @@
         def
       }
   }
-\cs_new_protected:Npn \__driver_draw_color_cmyk_stroke:nnnn #1#2#3#4
+\cs_new_protected:Npn \driver_draw_stroke_cmyk:nnnn #1#2#3#4
   {
     \__driver_draw_literal:x
       {
@@ -342,16 +342,16 @@
         def
       }
   }
-\cs_new_protected:Npn \__driver_draw_color_gray:n #1
+\cs_new_protected:Npn \driver_draw_color_gray:n #1
   {
     \__driver_draw_literal:x { fp_eval:n {#1} ~ setgray  }
     \__driver_draw_color_reset:
   }
-\cs_new_protected:Npn \__driver_draw_color_gray_fill:n #1
+\cs_new_protected:Npn \driver_draw_fill_gray:n #1
   { \__driver_draw_literal:x { /l3fc ~ { \fp_eval:n {#1} ~ setgray } ~ def } }
-\cs_new_protected:Npn \__driver_draw_color_gray_stroke:n #1
+\cs_new_protected:Npn \driver_draw_stroke_gray:n #1
   { \__driver_draw_literal:x { /l3sc ~ { \fp_eval:n {#1} ~ setgray } ~ def } }
-\cs_new_protected:Npn \__driver_draw_color_rgb:nnn #1#2#3
+\cs_new_protected:Npn \driver_draw_color_rgb:nnn #1#2#3
   {
     \__driver_draw_literal:x
       {
@@ -360,7 +360,7 @@
       }
     \__driver_draw_color_reset:
   }
-\cs_new_protected:Npn \__driver_draw_color_rgb_fill:nnn #1#2#3
+\cs_new_protected:Npn \driver_draw_fill_rgb:nnn #1#2#3
   {
     \__driver_draw_literal:x
       {
@@ -372,7 +372,7 @@
         def
       }
   }
-\cs_new_protected:Npn \__driver_draw_color_rgb_stroke:nnn #1#2#3
+\cs_new_protected:Npn \driver_draw_stroke_rgb:nnn #1#2#3
   {
     \__driver_draw_literal:x
       {
@@ -384,7 +384,7 @@
         def
       }
   }
-\cs_new_protected:Npn \__driver_draw_transformcm:nnnnnn #1#2#3#4#5#6
+\cs_new_protected:Npn \driver_draw_transformcm:nnnnnn #1#2#3#4#5#6
   {
     \__driver_draw_literal:x
       {
@@ -396,11 +396,11 @@
         concat
       }
   }
-\cs_new_protected:Npn \__driver_draw_hbox:Nnnnnnn #1#2#3#4#5#6#7
+\cs_new_protected:Npn \driver_draw_hbox:Nnnnnnn #1#2#3#4#5#6#7
   {
     \__driver_scope_begin:
     \tex_special:D { ps::[end] }
-    \__driver_draw_transformcm:nnnnnn {#2} {#3} {#4} {#5} {#6} {#7}
+    \driver_draw_transformcm:nnnnnn {#2} {#3} {#4} {#5} {#6} {#7}
     \tex_special:D { ps::~72~Resolution~div~72~VResolution~div~neg~scale }
     \tex_special:D { ps::~magscale~{1~DVImag~div~dup~scale}~if }
     \tex_special:D { ps::~l3x~neg~l3y~neg~translate }

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvisvgm.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvisvgm.def	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvisvgm.def	2017-12-17 23:16:51 UTC (rev 46085)
@@ -71,7 +71,7 @@
   { \__driver_literal:n { </g> } }
 \cs_new_protected:Npn \__driver_scope_begin:n #1
   { \__driver_literal:n { <g~ #1 > } }
-\cs_new_protected:Npn \__driver_box_use_clip:N #1
+\cs_new_protected:Npn \driver_box_use_clip:N #1
   {
     \int_gincr:N \g__driver_clip_path_int
     \__driver_literal:n
@@ -122,7 +122,7 @@
     \__driver_scope_end:
   }
 \int_new:N \g__driver_clip_path_int
-\cs_new_protected:Npn \__driver_box_use_rotate:Nn #1#2
+\cs_new_protected:Npn \driver_box_use_rotate:Nn #1#2
   {
     \__driver_scope_begin:n
       {
@@ -135,7 +135,7 @@
     \box_use:N #1
     \__driver_scope_end:
   }
-\cs_new_protected:Npn \__driver_box_use_scale:Nnn #1#2#3
+\cs_new_protected:Npn \driver_box_use_scale:Nnn #1#2#3
   {
     \__driver_scope_begin:n
       {
@@ -154,15 +154,15 @@
     \hbox_overlap_right:n { \box_use:N #1 }
     \__driver_scope_end:
   }
-\cs_new_eq:NN \__driver_image_getbb_png:n \__image_extract_bb:n
-\cs_new_eq:NN \__driver_image_getbb_jpg:n \__image_extract_bb:n
+\cs_new_eq:NN \__driver_image_getbb_png:n \image_extract_bb:n
+\cs_new_eq:NN \__driver_image_getbb_jpg:n \image_extract_bb:n
 \cs_new_protected:Npn \__driver_image_include_png:n #1
   {
      \tex_special:D
        {
          dvisvgm:img~
-         \dim_to_decimal:n { \l__image_ury_dim } ~
-         \dim_to_decimal:n { \l__image_ury_dim } ~
+         \dim_to_decimal:n { \l_image_ury_dim } ~
+         \dim_to_decimal:n { \l_image_ury_dim } ~
          \__driver_image_include_bitmap_quote:w #1 " " \q_stop
        }
   }
@@ -170,14 +170,14 @@
 \cs_new:Npn \__driver_image_include_bitmap_quote:w #1 " #2 " #3 \q_stop { #1#2 }
 \cs_new_eq:NN \__driver_draw_literal:n \__driver_literal:n
 \cs_generate_variant:Nn \__driver_draw_literal:n { x }
-\cs_new_protected:Npn \__driver_draw_begin:
+\cs_new_protected:Npn \driver_draw_begin:
   {
-    \__driver_draw_scope_begin:
+    \driver_draw_scope_begin:
     \__driver_draw_scope:n { transform="translate({?x},{?y})~scale(1,-1)" }
   }
-\cs_new_protected:Npn \__driver_draw_end:
-  { \__driver_draw_scope_end: }
-\cs_new_protected:Npn \__driver_draw_scope_begin:
+\cs_new_protected:Npn \driver_draw_end:
+  { \driver_draw_scope_end: }
+\cs_new_protected:Npn \driver_draw_scope_begin:
   {
     \int_set_eq:NN
       \l__driver_draw_scope_int
@@ -185,7 +185,7 @@
     \group_begin:
       \int_gzero:N \g__driver_draw_scope_int
   }
-\cs_new_protected:Npn \__driver_draw_scope_end:
+\cs_new_protected:Npn \driver_draw_scope_end:
   {
       \prg_replicate:nn
         { \g__driver_draw_scope_int }
@@ -203,17 +203,17 @@
 \cs_generate_variant:Nn \__driver_draw_scope:n { x }
 \int_new:N \g__driver_draw_scope_int
 \int_new:N \l__driver_draw_scope_int
-\cs_new_protected:Npn \__driver_draw_moveto:nn #1#2
+\cs_new_protected:Npn \driver_draw_moveto:nn #1#2
   {
     \__driver_draw_add_to_path:n
       { M ~ \dim_to_decimal:n {#1} ~ \dim_to_decimal:n {#2} }
   }
-\cs_new_protected:Npn \__driver_draw_lineto:nn #1#2
+\cs_new_protected:Npn \driver_draw_lineto:nn #1#2
   {
     \__driver_draw_add_to_path:n
       { L ~ \dim_to_decimal:n {#1} ~ \dim_to_decimal:n {#2} }
   }
-\cs_new_protected:Npn \__driver_draw_rectangle:nnnn #1#2#3#4
+\cs_new_protected:Npn \driver_draw_rectangle:nnnn #1#2#3#4
   {
     \__driver_draw_add_to_path:n
       {
@@ -224,7 +224,7 @@
         Z
       }
   }
-\cs_new_protected:Npn \__driver_draw_curveto:nnnnnn #1#2#3#4#5#6
+\cs_new_protected:Npn \driver_draw_curveto:nnnnnn #1#2#3#4#5#6
   {
     \__driver_draw_add_to_path:n
       {
@@ -244,11 +244,11 @@
       }
   }
 \tl_new:N \g__driver_draw_path_tl
-\cs_new_protected:Npn \__driver_draw_evenodd_rule:
+\cs_new_protected:Npn \driver_draw_evenodd_rule:
   { \__driver_draw_scope:n { fill-rule="evenodd" } }
-\cs_new_protected:Npn \__driver_draw_nonzero_rule:
+\cs_new_protected:Npn \driver_draw_nonzero_rule:
   { \__driver_draw_scope:n { fill-rule="nonzero" } }
-\cs_new_protected:Npn \__driver_draw_closepath:
+\cs_new_protected:Npn \driver_draw_closepath:
   { \__driver_draw_add_to_path:n { Z } }
 \cs_new_protected:Npn \__driver_draw_path:n #1
   {
@@ -281,21 +281,21 @@
     \bool_gset_false:N \g__driver_draw_clip_bool
   }
 \int_new:N \g__driver_path_int
-\cs_new_protected:Npn \__driver_draw_stroke:
+\cs_new_protected:Npn \driver_draw_stroke:
   { \__driver_draw_path:n { style="fill:none" } }
-\cs_new_protected:Npn \__driver_draw_closestroke:
+\cs_new_protected:Npn \driver_draw_closestroke:
   {
-    \__driver_draw_closepath:
-    \__driver_draw_stroke:
+    \driver_draw_closepath:
+    \driver_draw_stroke:
   }
-\cs_new_protected:Npn \__driver_draw_fill:
+\cs_new_protected:Npn \driver_draw_fill:
   { \__driver_draw_path:n { style="stroke:none" } }
-\cs_new_protected:Npn \__driver_draw_fillstroke:
+\cs_new_protected:Npn \driver_draw_fillstroke:
   { \__driver_draw_path:n { } }
-\cs_new_protected:Npn \__driver_draw_clip:
+\cs_new_protected:Npn \driver_draw_clip:
   { \bool_gset_true:N \g__driver_draw_clip_bool }
 \bool_new:N \g__driver_draw_clip_bool
-\cs_new_protected:Npn \__driver_draw_discardpath:
+\cs_new_protected:Npn \driver_draw_discardpath:
   {
     \bool_if:NT \g__driver_draw_clip_bool
       {
@@ -316,7 +316,7 @@
     \tl_gclear:N \g__driver_draw_path_tl
     \bool_gset_false:N \g__driver_draw_clip_bool
   }
-\cs_new_protected:Npn \__driver_draw_dash:nn #1#2
+\cs_new_protected:Npn \driver_draw_cap_dash:nn #1#2
   {
     \use:x
       {
@@ -340,21 +340,21 @@
           stroke-offset=" #2 "
       }
   }
-\cs_new_protected:Npn \__driver_draw_linewidth:n #1
+\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
+\cs_new_protected:Npn \driver_draw_miterlimit:n #1
   { \__driver_draw_scope:x { stroke-miterlimit=" \fp_eval:n {#1} " } }
-\cs_new_protected:Npn \__driver_draw_cap_butt:
+\cs_new_protected:Npn \driver_draw_cap_butt:
   { \__driver_draw_scope:n { stroke-linecap="butt" } }
-\cs_new_protected:Npn \__driver_draw_cap_round:
+\cs_new_protected:Npn \driver_draw_cap_round:
   { \__driver_draw_scope:n { stroke-linecap="round" } }
-\cs_new_protected:Npn \__driver_draw_cap_rectangle:
+\cs_new_protected:Npn \driver_draw_cap_rectangle:
   { \__driver_draw_scope:n { stroke-linecap="square" } }
-\cs_new_protected:Npn \__driver_draw_join_miter:
+\cs_new_protected:Npn \driver_draw_join_miter:
   { \__driver_draw_scope:n { stroke-linejoin="miter" } }
-\cs_new_protected:Npn \__driver_draw_join_round:
+\cs_new_protected:Npn \driver_draw_join_round:
   { \__driver_draw_scope:n { stroke-linejoin="round" } }
-\cs_new_protected:Npn \__driver_draw_join_bevel:
+\cs_new_protected:Npn \driver_draw_join_bevel:
   { \__driver_draw_scope:n { stroke-linejoin="bevel" } }
 \cs_new_protected:Npn \__driver_draw_color_cmyk_aux:NNnnnnn #1#2#3#4#5#6
   {
@@ -367,11 +367,11 @@
       }
       #1 #2
   }
-\cs_new_protected:Npn \__driver_draw_color_cmyk:nnnn
+\cs_new_protected:Npn \driver_draw_color_cmyk:nnnn
   { \__driver_draw_color_cmyk_aux:NNnnnnn \c_true_bool \c_true_bool }
-\cs_new_protected:Npn \__driver_draw_color_cmyk_fill:nnnn
+\cs_new_protected:Npn \driver_draw_fill_cmyk:nnnn
   { \__driver_draw_color_cmyk_aux:NNnnnnn \c_false_bool \c_true_bool }
-\cs_new_protected:Npn \__driver_draw_color_cmyk_stroke:nnnn
+\cs_new_protected:Npn \driver_draw_stroke_cmyk:nnnn
   { \__driver_draw_color_cmyk_aux:NNnnnnn \c_true_bool \c_false_bool }
 \cs_new_protected:Npn \__driver_draw_color_gray_aux:NNn #1#2#3
   {
@@ -385,11 +385,11 @@
 \cs_new_protected:Npn \__driver_draw_color_gray_aux:nNN #1
   { \__driver_draw_color_rgb_auxii:nnnNN {#1} {#1} {#1} }
 \cs_generate_variant:Nn \__driver_draw_color_gray_aux:nNN { x }
-\cs_new_protected:Npn \__driver_draw_color_gray:n
+\cs_new_protected:Npn \driver_draw_color_gray:n
   { \__driver_draw_color_gray_aux:NNn \c_true_bool \c_true_bool }
-\cs_new_protected:Npn \__driver_draw_color_gray_fill:n
+\cs_new_protected:Npn \driver_draw_fill_gray:n
   { \__driver_draw_color_gray_aux:NNn \c_false_bool \c_true_bool }
-\cs_new_protected:Npn \__driver_draw_color_gray_stroke:n
+\cs_new_protected:Npn \driver_draw_stroke_gray:n
   { \__driver_draw_color_gray_aux:NNn \c_true_bool \c_false_bool }
 \cs_new_protected:Npn \__driver_draw_color_rgb_auxi:NNnnn #1#2#3#4#5
   {
@@ -433,13 +433,13 @@
           }
       }
   }
-\cs_new_protected:Npn \__driver_draw_color_rgb:nnn
+\cs_new_protected:Npn \driver_draw_color_rgb:nnn
   { \__driver_draw_color_rgb_auxi:NNnnn \c_true_bool \c_true_bool }
-\cs_new_protected:Npn \__driver_draw_color_rgb_fill:nnn
+\cs_new_protected:Npn \driver_draw_fill_rgb:nnn
   { \__driver_draw_color_rgb_auxi:NNnnn \c_false_bool \c_true_bool }
-\cs_new_protected:Npn \__driver_draw_color_rgb_stroke:nnn
+\cs_new_protected:Npn \driver_draw_stroke_rgb:nnn
   { \__driver_draw_color_rgb_auxi:NNnnn \c_true_bool \c_false_bool }
-\cs_new_protected:Npn \__driver_draw_transformcm:nnnnnn #1#2#3#4#5#6
+\cs_new_protected:Npn \driver_draw_transformcm:nnnnnn #1#2#3#4#5#6
   {
     \__driver_draw_scope:x
       {
@@ -454,10 +454,10 @@
          "
       }
   }
-\cs_new_protected:Npn \__driver_draw_hbox:Nnnnnnn #1#2#3#4#5#6#7
+\cs_new_protected:Npn \driver_draw_hbox:Nnnnnnn #1#2#3#4#5#6#7
   {
     \__driver_scope_begin:
-    \__driver_draw_transformcm:nnnnnn {#2} {#3} {#4} {#5} {#6} {#7}
+    \driver_draw_transformcm:nnnnnn {#2} {#3} {#4} {#5} {#6} {#7}
     \__driver_literal:n
       {
         < g~

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def	2017-12-17 23:16:51 UTC (rev 46085)
@@ -117,7 +117,7 @@
       { \pdftex_pdfsetmatrix:D }
         {#1}
   }
-\cs_new_protected:Npn \__driver_box_use_clip:N #1
+\cs_new_protected:Npn \driver_box_use_clip:N #1
   {
     \__driver_scope_begin:
     \__driver_literal:n
@@ -132,7 +132,7 @@
     \__driver_scope_end:
     \skip_horizontal:n { \box_wd:N #1 }
   }
-\cs_new_protected:Npn \__driver_box_use_rotate:Nn #1#2
+\cs_new_protected:Npn \driver_box_use_rotate:Nn #1#2
   {
     \__driver_scope_begin:
     \box_set_wd:Nn #1 { 0pt }
@@ -158,7 +158,7 @@
   }
 \fp_new:N \l__driver_cos_fp
 \fp_new:N \l__driver_sin_fp
-\cs_new_protected:Npn \__driver_box_use_scale:Nnn #1#2#3
+\cs_new_protected:Npn \driver_box_use_scale:Nnn #1#2#3
   {
     \__driver_scope_begin:
     \__driver_matrix:n
@@ -173,13 +173,13 @@
 \tl_new:N \l__driver_image_attr_tl
 \cs_new_protected:Npn \__driver_image_getbb_jpg:n #1
   {
-    \int_zero:N \l__image_page_int
-    \tl_clear:N \l__image_pagebox_tl
+    \int_zero:N \l_image_page_int
+    \tl_clear:N \l_image_pagebox_tl
     \tl_set:Nx \l__driver_image_attr_tl
       {
-        \tl_if_empty:NF \l__image_decode_tl
-          { :D \l__image_decode_tl }
-        \bool_if:NT \l__image_interpolate_bool
+        \tl_if_empty:NF \l_image_decode_tl
+          { :D \l_image_decodearray_tl }
+        \bool_if:NT \l_image_interpolate_bool
           { :I }
       }
     \tl_clear:N \l__driver_image_attr_tl
@@ -188,27 +188,19 @@
 \cs_new_eq:NN \__driver_image_getbb_png:n \__driver_image_getbb_jpg:n
 \cs_new_protected:Npn \__driver_image_getbb_pdf:n #1
   {
-    \tl_clear:N \l__image_decode_tl
-    \bool_set_false:N \l__image_interpolate_bool
+    \tl_clear:N \l_image_decode_tl
+    \bool_set_false:N \l_image_interpolate_bool
     \tl_set:Nx \l__driver_image_attr_tl
       {
-        : \l__image_pagebox_tl
-        \int_compare:nNnT \l__image_page_int > 1
-          { :P \int_use:N \l__image_page_int }
+        : \l_image_pagebox_tl
+        \int_compare:nNnT \l_image_page_int > 1
+          { :P \int_use:N \l_image_page_int }
       }
     \__driver_image_getbb_auxi:n {#1}
   }
 \cs_new_protected:Npn \__driver_image_getbb_auxi:n #1
   {
-    \dim_zero:N \l__image_llx_dim
-    \dim_zero:N \l__image_lly_dim
-    \dim_if_exist:cTF { c__image_ #1 \l__driver_image_attr_tl _urx_dim }
-      {
-        \dim_set_eq:Nc \l__image_urx_dim
-          { c__image_ #1 \l__driver_image_attr_tl _urx_dim }
-        \dim_set_eq:Nc \l__image_ury_dim
-          { c__image_ #1 \l__driver_image_attr_tl _ury_dim }
-      }
+    \image_bb_restore:xF { #1 \l__driver_image_attr_tl }
       { \__driver_image_getbb_auxii:n {#1} }
   }
 \cs_new_protected:Npn \__driver_image_getbb_auxii:n #1
@@ -215,61 +207,58 @@
   {
     \tex_immediate:D \pdftex_pdfximage:D
       \bool_lazy_or:nnT
-        { \l__image_interpolate_bool }
-        { ! \tl_if_empty_p:N \l__image_decode_tl }
+        { \l_image_interpolate_bool }
+        { ! \tl_if_empty_p:N \l_image_decodearray_tl }
         {
           attr ~
             {
-              \tl_if_empty:NF \l__image_decode_tl
-                { /Decode~[ \l__image_decode_tl ] }
-              \bool_if:NT \l__image_interpolate_bool
+              \tl_if_empty:NF \l_image_decode_tl
+                { /Decode~[ \l_image_decodearray_tl ] }
+              \bool_if:NT \l_image_interpolate_bool
                 { /Interpolate~true }
             }
         }
-      \int_compare:nNnT \l__image_page_int > 0
-        { page ~ \int_use:N \l__image_page_int }
-      \tl_if_empty:NF \l__image_pagebox_tl
-        { \l__image_pagebox_tl }
+      \int_compare:nNnT \l_image_page_int > 0
+        { page ~ \int_use:N \l_image_page_int }
+      \tl_if_empty:NF \l_image_pagebox_tl
+        { \l_image_pagebox_tl }
       {#1}
-    \hbox_set:Nn \l__image_tmp_box
+    \hbox_set:Nn \l__driver_tmp_box
       { \pdftex_pdfrefximage:D \pdftex_pdflastximage:D }
-    \dim_set:Nn \l__image_urx_dim { \box_wd:N \l__image_tmp_box }
-    \dim_set:Nn \l__image_ury_dim { \box_ht:N \l__image_tmp_box }
-    \int_const:cn { c__image_ #1 \l__driver_image_attr_tl _int }
+    \dim_set:Nn \l_image_urx_dim { \box_wd:N \l__driver_tmp_box }
+    \dim_set:Nn \l_image_ury_dim { \box_ht:N \l__driver_tmp_box }
+    \int_const:cn { c__driver_image_ #1 \l__driver_image_attr_tl _int }
       { \tex_the:D \pdftex_pdflastximage:D }
-    \dim_const:cn { c__image_ #1 \l__driver_image_attr_tl _urx_dim }
-      { \l__image_urx_dim }
-    \dim_const:cn { c__image_ #1 \l__driver_image_attr_tl _ury_dim }
-      { \l__image_ury_dim }
+    \image_bb_save:x { #1 \l__driver_image_attr_tl }
   }
 \cs_new_protected:Npn \__driver_image_include_jpg:n #1
   {
     \pdftex_pdfrefximage:D
-      \int_use:c { c__image_ #1 \l__driver_image_attr_tl _int }
+      \int_use:c { c__driver_image_ #1 \l__driver_image_attr_tl _int }
   }
 \cs_new_eq:NN \__driver_image_include_pdf:n \__driver_image_include_jpg:n
 \cs_new_eq:NN \__driver_image_include_png:n \__driver_image_include_jpg:n
 \cs_new_eq:NN \__driver_draw_literal:n \__driver_literal:n
 \cs_generate_variant:Nn \__driver_draw_literal:n { x }
-\cs_new_protected:Npn \__driver_draw_begin:
-  { \__driver_draw_scope_begin: }
-\cs_new_protected:Npn \__driver_draw_end:
-  { \__driver_draw_scope_end: }
-\cs_new_protected:Npn \__driver_draw_scope_begin:
+\cs_new_protected:Npn \driver_draw_begin:
+  { \driver_draw_scope_begin: }
+\cs_new_protected:Npn \driver_draw_end:
+  { \driver_draw_scope_end: }
+\cs_new_protected:Npn \driver_draw_scope_begin:
   { \__driver_draw_literal:n { q } }
-\cs_new_protected:Npn \__driver_draw_scope_end:
+\cs_new_protected:Npn \driver_draw_scope_end:
   { \__driver_draw_literal:n { Q } }
-\cs_new_protected:Npn \__driver_draw_moveto:nn #1#2
+\cs_new_protected:Npn \driver_draw_moveto:nn #1#2
   {
     \__driver_draw_literal:x
       { \dim_to_decimal_in_bp:n {#1} ~ \dim_to_decimal_in_bp:n {#2} ~ m }
   }
-\cs_new_protected:Npn \__driver_draw_lineto:nn #1#2
+\cs_new_protected:Npn \driver_draw_lineto:nn #1#2
   {
     \__driver_draw_literal:x
       { \dim_to_decimal_in_bp:n {#1} ~ \dim_to_decimal_in_bp:n {#2} ~ l }
   }
-\cs_new_protected:Npn \__driver_draw_curveto:nnnnnn #1#2#3#4#5#6
+\cs_new_protected:Npn \driver_draw_curveto:nnnnnn #1#2#3#4#5#6
   {
     \__driver_draw_literal:x
       {
@@ -279,7 +268,7 @@
         c
       }
  }
-\cs_new_protected:Npn \__driver_draw_rectangle:nnnn #1#2#3#4
+\cs_new_protected:Npn \driver_draw_rectangle:nnnn #1#2#3#4
   {
      \__driver_draw_literal:x
       {
@@ -288,35 +277,35 @@
         re
       }
   }
-\cs_new_protected:Npn \__driver_draw_evenodd_rule:
+\cs_new_protected:Npn \driver_draw_evenodd_rule:
   { \bool_gset_true:N \g__driver_draw_eor_bool }
-\cs_new_protected:Npn \__driver_draw_nonzero_rule:
+\cs_new_protected:Npn \driver_draw_nonzero_rule:
   { \bool_gset_false:N \g__driver_draw_eor_bool }
 \bool_new:N \g__driver_draw_eor_bool
-\cs_new_protected:Npn \__driver_draw_closepath:
+\cs_new_protected:Npn \driver_draw_closepath:
   { \__driver_draw_literal:n { h } }
-\cs_new_protected:Npn \__driver_draw_stroke:
+\cs_new_protected:Npn \driver_draw_stroke:
   { \__driver_draw_literal:n { S } }
-\cs_new_protected:Npn \__driver_draw_closestroke:
+\cs_new_protected:Npn \driver_draw_closestroke:
   { \__driver_draw_literal:n { s } }
-\cs_new_protected:Npn \__driver_draw_fill:
+\cs_new_protected:Npn \driver_draw_fill:
   {
     \__driver_draw_literal:x
       { f \bool_if:NT \g__driver_draw_eor_bool * }
   }
-\cs_new_protected:Npn \__driver_draw_fillstroke:
+\cs_new_protected:Npn \driver_draw_fillstroke:
   {
     \__driver_draw_literal:x
       { B \bool_if:NT \g__driver_draw_eor_bool * }
   }
-\cs_new_protected:Npn \__driver_draw_clip:
+\cs_new_protected:Npn \driver_draw_clip:
   {
     \__driver_draw_literal:x
       { W \bool_if:NT \g__driver_draw_eor_bool * }
   }
-\cs_new_protected:Npn \__driver_draw_discardpath:
+\cs_new_protected:Npn \driver_draw_discardpath:
   { \__driver_draw_literal:n { n } }
-\cs_new_protected:Npn \__driver_draw_dash:nn #1#2
+\cs_new_protected:Npn \driver_draw_cap_dash:nn #1#2
   {
     \__driver_draw_literal:x
       {
@@ -328,26 +317,26 @@
   }
 \cs_new:Npn \__driver_draw_dash:n #1
   { \dim_to_decimal_in_bp:n {#1} ~ }
-\cs_new_protected:Npn \__driver_draw_linewidth:n #1
+\cs_new_protected:Npn \driver_draw_linewidth:n #1
   {
     \__driver_draw_literal:x
       { \dim_to_decimal_in_bp:n {#1} ~ w }
   }
-\cs_new_protected:Npn \__driver_draw_miterlimit:n #1
+\cs_new_protected:Npn \driver_draw_miterlimit:n #1
   { \__driver_draw_literal:x { \fp_eval:n {#1} ~ M } }
-\cs_new_protected:Npn \__driver_draw_cap_butt:
+\cs_new_protected:Npn \driver_draw_cap_butt:
   { \__driver_draw_literal:n { 0 ~ J } }
-\cs_new_protected:Npn \__driver_draw_cap_round:
+\cs_new_protected:Npn \driver_draw_cap_round:
   { \__driver_draw_literal:n { 1 ~ J } }
-\cs_new_protected:Npn \__driver_draw_cap_rectangle:
+\cs_new_protected:Npn \driver_draw_cap_rectangle:
   { \__driver_draw_literal:n { 2 ~ J } }
-\cs_new_protected:Npn \__driver_draw_join_miter:
+\cs_new_protected:Npn \driver_draw_join_miter:
   { \__driver_draw_literal:n { 0 ~ j } }
-\cs_new_protected:Npn \__driver_draw_join_round:
+\cs_new_protected:Npn \driver_draw_join_round:
   { \__driver_draw_literal:n { 1 ~ j } }
-\cs_new_protected:Npn \__driver_draw_join_bevel:
+\cs_new_protected:Npn \driver_draw_join_bevel:
   { \__driver_draw_literal:n { 2 ~ j } }
-\cs_new_protected:Npn \__driver_draw_color_cmyk:nnnn #1#2#3#4
+\cs_new_protected:Npn \driver_draw_color_cmyk:nnnn #1#2#3#4
   {
     \use:x
       {
@@ -363,7 +352,7 @@
     \__driver_draw_literal:n
       { #1 ~ #2 ~ #3 ~ #4 ~ k ~ #1 ~ #2 ~ #3 ~ #4 ~ K }
   }
-\cs_new_protected:Npn \__driver_draw_color_cmyk_fill:nnnn #1#2#3#4
+\cs_new_protected:Npn \driver_draw_fill_cmyk:nnnn #1#2#3#4
   {
     \__driver_draw_literal:x
       {
@@ -372,7 +361,7 @@
         k
       }
   }
-\cs_new_protected:Npn \__driver_draw_color_cmyk_stroke:nnnn #1#2#3#4
+\cs_new_protected:Npn \driver_draw_stroke_cmyk:nnnn #1#2#3#4
   {
     \__driver_draw_literal:x
       {
@@ -381,7 +370,7 @@
         K
       }
   }
-\cs_new_protected:Npn \__driver_draw_color_gray:n #1
+\cs_new_protected:Npn \driver_draw_color_gray:n #1
   {
     \use:x
       { \__driver_draw_color_gray_aux:n { \fp_eval:n {#1} } }
@@ -390,11 +379,11 @@
   {
     \__driver_draw_literal:n { #1 ~ g ~ #1 ~ G }
   }
-\cs_new_protected:Npn \__driver_draw_color_gray_fill:n #1
+\cs_new_protected:Npn \driver_draw_fill_gray:n #1
   { \__driver_draw_literal:x { \fp_eval:n {#1} ~ g } }
-\cs_new_protected:Npn \__driver_draw_color_gray_stroke:n #1
+\cs_new_protected:Npn \driver_draw_stroke_gray:n #1
   { \__driver_draw_literal:x { \fp_eval:n {#1} ~ G } }
-\cs_new_protected:Npn \__driver_draw_color_rgb:nnn #1#2#3
+\cs_new_protected:Npn \driver_draw_color_rgb:nnn #1#2#3
   {
     \use:x
       {
@@ -409,17 +398,17 @@
     \__driver_draw_literal:n
       { #1 ~ #2 ~ #3 ~ rg ~ #1 ~ #2 ~ #3 ~ RG }
   }
-\cs_new_protected:Npn \__driver_draw_color_rgb_fill:nnn #1#2#3
+\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 }
   }
-\cs_new_protected:Npn \__driver_draw_color_rgb_stroke:nnn #1#2#3
+\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 }
   }
-\cs_new_protected:Npn \__driver_draw_transformcm:nnnnnn #1#2#3#4#5#6
+\cs_new_protected:Npn \driver_draw_transformcm:nnnnnn #1#2#3#4#5#6
   {
     \__driver_draw_literal:x
       {
@@ -429,13 +418,13 @@
         cm
       }
   }
-\cs_new_protected:Npn \__driver_draw_hbox:Nnnnnnn #1#2#3#4#5#6#7
+\cs_new_protected:Npn \driver_draw_hbox:Nnnnnnn #1#2#3#4#5#6#7
   {
     \hbox_set:Nn \l__driver_tmp_box
       {
         \tex_kern:D \__dim_eval:n {#6}
         \__driver_scope_begin:
-        \__driver_draw_transformcm:nnnnnn {#2} {#3} {#4} {#5}
+        \driver_draw_transformcm:nnnnnn {#2} {#3} {#4} {#5}
           { 0pt } { 0pt }
         \box_move_up:nn {#7} { \box_use:N #1 }
         \__driver_scope_end:

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3xdvipdfmx.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3xdvipdfmx.def	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3xdvipdfmx.def	2017-12-17 23:16:51 UTC (rev 46085)
@@ -69,7 +69,7 @@
   { \tex_special:D { x:gsave } }
 \cs_new_protected:Npn \__driver_scope_end:
   { \tex_special:D { x:grestore } }
-\cs_new_protected:Npn \__driver_box_use_clip:N #1
+\cs_new_protected:Npn \driver_box_use_clip:N #1
   {
     \__driver_scope_begin:
     \__driver_literal:n
@@ -84,7 +84,7 @@
     \__driver_scope_end:
     \skip_horizontal:n { \box_wd:N #1 }
   }
-\cs_new_protected:Npn \__driver_box_use_rotate:Nn #1#2
+\cs_new_protected:Npn \driver_box_use_rotate:Nn #1#2
   {
     \__driver_scope_begin:
     \tex_special:D
@@ -97,7 +97,7 @@
     \box_use:N #1
     \__driver_scope_end:
   }
-\cs_new_protected:Npn \__driver_box_use_scale:Nnn #1#2#3
+\cs_new_protected:Npn \driver_box_use_scale:Nnn #1#2#3
   {
     \__driver_scope_begin:
     \tex_special:D
@@ -109,7 +109,7 @@
     \hbox_overlap_right:n { \box_use:N #1 }
     \__driver_scope_end:
   }
-\cs_new_eq:NN \__driver_image_getbb_eps:n \__image_read_bb:n
+\cs_new_eq:NN \__driver_image_getbb_eps:n \image_read_bb:n
 \int_new:N \g__driver_image_int
 \cs_new_protected:Npn \__driver_image_include_eps:n #1
   {
@@ -122,13 +122,13 @@
   {
     \__driver_image_include_auxii:xnn
       {
-        \tl_if_empty:NF \l__image_pagebox_tl
-          { : \l__image_pagebox_tl }
-        \int_compare:nNnT \l__image_page_int > 1
-          { :P \int_use:N \l__image_page_int }
-        \tl_if_empty:NF \l__image_decode_tl
-          { :D \l__image_decode_tl }
-        \bool_if:NT \l__image_interpolate_bool
+        \tl_if_empty:NF \l_image_pagebox_tl
+          { : \l_image_pagebox_tl }
+        \int_compare:nNnT \l_image_page_int > 1
+          { :P \int_use:N \l_image_page_int }
+        \tl_if_empty:NF \l_image_decode_tl
+          { :D \l_image_decodearray_tl }
+        \bool_if:NT \l_image_interpolate_bool
            { :I }
       }
       {#1} {#2}
@@ -135,10 +135,10 @@
   }
 \cs_new_protected:Npn \__driver_image_include_auxii:nnn #1#2#3
   {
-    \int_if_exist:cTF { c__image_ #2#1 _int }
+    \int_if_exist:cTF { c__driver_image_ #2#1 _int }
       {
         \tex_special:D
-          { pdf:usexobj~@image \int_use:c { c__image_ #2#1 _int } }
+          { pdf:usexobj~@image \int_use:c { c__driver_image_ #2#1 _int } }
       }
       { \__driver_image_include_auxiii:nn {#2} {#1} {#3} }
   }
@@ -146,31 +146,31 @@
 \cs_new_protected:Npn \__driver_image_include_auxiii:nnn #1#2#3
   {
     \int_gincr:N \g__driver_image_int
-    \int_const:cn { c__image_ #1#2 _int } { \g__driver_image_int }
+    \int_const:cn { c__driver_image_ #1#2 _int } { \g__driver_image_int }
     \tex_special:D
       {
         pdf:#3~
-        @image \int_use:c { c__image_ #1#2 _int }
-        \int_compare:nNnT \l__image_page_int > 1
-          { page ~ \int_use:N \l__image_page_int \c_space_tl }
-        \tl_if_empty:NF \l__image_pagebox_tl
+        @image \int_use:c { c__driver_image_ #1#2 _int }
+        \int_compare:nNnT \l_image_page_int > 1
+          { page ~ \int_use:N \l_image_page_int \c_space_tl }
+        \tl_if_empty:NF \l_image_pagebox_tl
           {
-            pagebox ~ \l__image_pagebox_tl \c_space_tl
+            pagebox ~ \l_image_pagebox_tl \c_space_tl
             bbox ~
-              \dim_to_decimal_in_bp:n \l__image_llx_dim \c_space_tl
-              \dim_to_decimal_in_bp:n \l__image_lly_dim \c_space_tl
-              \dim_to_decimal_in_bp:n \l__image_urx_dim \c_space_tl
-              \dim_to_decimal_in_bp:n \l__image_ury_dim \c_space_tl
+              \dim_to_decimal_in_bp:n \l_image_llx_dim \c_space_tl
+              \dim_to_decimal_in_bp:n \l_image_lly_dim \c_space_tl
+              \dim_to_decimal_in_bp:n \l_image_urx_dim \c_space_tl
+              \dim_to_decimal_in_bp:n \l_image_ury_dim \c_space_tl
           }
         (#1)
         \bool_lazy_or:nnT
-          { \l__image_interpolate_bool }
-          { ! \tl_if_empty_p:N \l__image_decode_tl }
+          { \l_image_interpolate_bool }
+          { ! \tl_if_empty_p:N \l_image_decodearray_tl }
           {
             <<
-              \tl_if_empty:NF \l__image_decode_tl
-                { /Decode~[ \l__image_decode_tl ] }
-              \bool_if:NT \l__image_interpolate_bool
+              \tl_if_empty:NF \l_image_decode_tl
+                { /Decode~[ \l_image_decodearray_tl ] }
+              \bool_if:NT \l_image_interpolate_bool
                 { /Interpolate~true> }
             >>
           }
@@ -178,21 +178,21 @@
   }
 \cs_new_protected:Npn \__driver_image_getbb_jpg:n #1
   {
-    \int_zero:N \l__image_page_int
-    \tl_clear:N \l__image_pagebox_tl
+    \int_zero:N \l_image_page_int
+    \tl_clear:N \l_image_pagebox_tl
     \__driver_image_getbb_auxi:nN {#1} \xetex_picfile:D
   }
 \cs_new_eq:NN \__driver_image_getbb_png:n \__driver_image_getbb_jpg:n
 \cs_new_protected:Npn \__driver_image_getbb_pdf:n #1
   {
-    \tl_clear:N \l__image_decode_tl
-    \bool_set_false:N \l__image_interpolate_bool
+    \tl_clear:N \l_image_decode_tl
+    \bool_set_false:N \l_image_interpolate_bool
     \__driver_image_getbb_auxi:nN {#1} \xetex_pdffile:D
   }
 \cs_new_protected:Npn \__driver_image_getbb_auxi:nN #1#2
   {
-    \int_compare:nNnTF \l__image_page_int > 1
-      { \__driver_image_getbb_auxii:VnN \l__image_page_int {#1} #2  }
+    \int_compare:nNnTF \l_image_page_int > 1
+      { \__driver_image_getbb_auxii:VnN \l_image_page_int {#1} #2  }
       { \__driver_image_getbb_auxiii:nNnn {#1} #2 }
   }
 \cs_new_protected:Npn \__driver_image_getbb_auxii:nnN #1#2#3
@@ -200,8 +200,8 @@
 \cs_generate_variant:Nn \__driver_image_getbb_auxii:nnN { V }
 \cs_new_protected:Npn \__driver_image_getbb_auxiii:nNnn #1#2#3#4
   {
-    \tl_if_empty:NTF \l__image_pagebox_tl
-      { \__driver_image_getbb_auxiv:VnNnn \l__image_pagebox_tl }
+    \tl_if_empty:NTF \l_image_pagebox_tl
+      { \__driver_image_getbb_auxiv:VnNnn \l_image_pagebox_tl }
       { \__driver_image_getbb_auxv:nNnn }
       {#1} #2 {#3} {#4}
   }
@@ -216,54 +216,45 @@
 \cs_generate_variant:Nn \__driver_image_getbb_auxiv:nnNnn { V }
 \cs_new_protected:Npn \__driver_image_getbb_auxv:nNnn #1#2#3#4
   {
-    \dim_zero:N \l__image_llx_dim
-    \dim_zero:N \l__image_lly_dim
-    \dim_if_exist:cTF { c__image_ #1#3 _urx_dim }
-      {
-        \dim_set_eq:Nc \l__image_urx_dim { c__image_ #1#3 _urx_dim }
-        \dim_set_eq:Nc \l__image_ury_dim { c__image_ #1#3 _ury_dim }
-      }
+    \image_bb_restore:nF {#1#3}
       { \__driver_image_getbb_auxvi:nNnn {#1} #2 {#3} {#4} }
   }
 \cs_new_protected:Npn \__driver_image_getbb_auxvi:nNnn #1#2#3#4
   {
-    \hbox_set:Nn \l__image_tmp_box { #2 #1 ~ #4 }
-    \dim_set:Nn \l__image_utx_dim { \box_wd:N \l__image_tmp_box }
-    \dim_set:Nn \l__image_ury_dim { \box_ht:N \l__image_tmp_box }
-    \dim_const:cn { c__image_ #1#3 _urx_dim }
-      { \l__image_urx_dim }
-    \dim_const:cn { c__image_ #1#3 _ury_dim }
-      { \l__image_ury_dim }
+    \hbox_set:Nn \l__driver_tmp_box { #2 #1 ~ #4 }
+    \dim_set:Nn \l_image_utx_dim { \box_wd:N \l__driver_tmp_box }
+    \dim_set:Nn \l_image_ury_dim { \box_ht:N \l__driver_tmp_box }
+    \image_bb_save:n {#1#3}
   }
 \cs_new:Npn \__driver_image_getbb_pagebox:w #1 box {#1}
 \cs_new_protected:Npn \__driver_image_include_pdf:n #1
   {
     \xetex_pdffile:D "#1" ~
-      \int_compare:nNnT \l__image_page_int > 0
-        { page~ \int_use:N \l__image_page_int }
-      \__driver_image_getbb_auxiv:VnNnn \l__image_pagebox_tl
+      \int_compare:nNnT \l_image_page_int > 0
+        { page~ \int_use:N \l_image_page_int }
+      \__driver_image_getbb_auxiv:VnNnn \l_image_pagebox_tl
   }
 \cs_new_eq:NN \__driver_draw_literal:n \__driver_literal:n
 \cs_generate_variant:Nn \__driver_draw_literal:n { x }
-\cs_new_protected:Npn \__driver_draw_begin:
-  { \__driver_draw_scope_begin: }
-\cs_new_protected:Npn \__driver_draw_end:
-  { \__driver_draw_scope_end: }
-\cs_new_protected:Npn \__driver_draw_scope_begin:
+\cs_new_protected:Npn \driver_draw_begin:
+  { \driver_draw_scope_begin: }
+\cs_new_protected:Npn \driver_draw_end:
+  { \driver_draw_scope_end: }
+\cs_new_protected:Npn \driver_draw_scope_begin:
   { \__driver_draw_literal:n { q } }
-\cs_new_protected:Npn \__driver_draw_scope_end:
+\cs_new_protected:Npn \driver_draw_scope_end:
   { \__driver_draw_literal:n { Q } }
-\cs_new_protected:Npn \__driver_draw_moveto:nn #1#2
+\cs_new_protected:Npn \driver_draw_moveto:nn #1#2
   {
     \__driver_draw_literal:x
       { \dim_to_decimal_in_bp:n {#1} ~ \dim_to_decimal_in_bp:n {#2} ~ m }
   }
-\cs_new_protected:Npn \__driver_draw_lineto:nn #1#2
+\cs_new_protected:Npn \driver_draw_lineto:nn #1#2
   {
     \__driver_draw_literal:x
       { \dim_to_decimal_in_bp:n {#1} ~ \dim_to_decimal_in_bp:n {#2} ~ l }
   }
-\cs_new_protected:Npn \__driver_draw_curveto:nnnnnn #1#2#3#4#5#6
+\cs_new_protected:Npn \driver_draw_curveto:nnnnnn #1#2#3#4#5#6
   {
     \__driver_draw_literal:x
       {
@@ -273,7 +264,7 @@
         c
       }
  }
-\cs_new_protected:Npn \__driver_draw_rectangle:nnnn #1#2#3#4
+\cs_new_protected:Npn \driver_draw_rectangle:nnnn #1#2#3#4
   {
      \__driver_draw_literal:x
       {
@@ -282,35 +273,35 @@
         re
       }
   }
-\cs_new_protected:Npn \__driver_draw_evenodd_rule:
+\cs_new_protected:Npn \driver_draw_evenodd_rule:
   { \bool_gset_true:N \g__driver_draw_eor_bool }
-\cs_new_protected:Npn \__driver_draw_nonzero_rule:
+\cs_new_protected:Npn \driver_draw_nonzero_rule:
   { \bool_gset_false:N \g__driver_draw_eor_bool }
 \bool_new:N \g__driver_draw_eor_bool
-\cs_new_protected:Npn \__driver_draw_closepath:
+\cs_new_protected:Npn \driver_draw_closepath:
   { \__driver_draw_literal:n { h } }
-\cs_new_protected:Npn \__driver_draw_stroke:
+\cs_new_protected:Npn \driver_draw_stroke:
   { \__driver_draw_literal:n { S } }
-\cs_new_protected:Npn \__driver_draw_closestroke:
+\cs_new_protected:Npn \driver_draw_closestroke:
   { \__driver_draw_literal:n { s } }
-\cs_new_protected:Npn \__driver_draw_fill:
+\cs_new_protected:Npn \driver_draw_fill:
   {
     \__driver_draw_literal:x
       { f \bool_if:NT \g__driver_draw_eor_bool * }
   }
-\cs_new_protected:Npn \__driver_draw_fillstroke:
+\cs_new_protected:Npn \driver_draw_fillstroke:
   {
     \__driver_draw_literal:x
       { B \bool_if:NT \g__driver_draw_eor_bool * }
   }
-\cs_new_protected:Npn \__driver_draw_clip:
+\cs_new_protected:Npn \driver_draw_clip:
   {
     \__driver_draw_literal:x
       { W \bool_if:NT \g__driver_draw_eor_bool * }
   }
-\cs_new_protected:Npn \__driver_draw_discardpath:
+\cs_new_protected:Npn \driver_draw_discardpath:
   { \__driver_draw_literal:n { n } }
-\cs_new_protected:Npn \__driver_draw_dash:nn #1#2
+\cs_new_protected:Npn \driver_draw_cap_dash:nn #1#2
   {
     \__driver_draw_literal:x
       {
@@ -322,26 +313,26 @@
   }
 \cs_new:Npn \__driver_draw_dash:n #1
   { \dim_to_decimal_in_bp:n {#1} ~ }
-\cs_new_protected:Npn \__driver_draw_linewidth:n #1
+\cs_new_protected:Npn \driver_draw_linewidth:n #1
   {
     \__driver_draw_literal:x
       { \dim_to_decimal_in_bp:n {#1} ~ w }
   }
-\cs_new_protected:Npn \__driver_draw_miterlimit:n #1
+\cs_new_protected:Npn \driver_draw_miterlimit:n #1
   { \__driver_draw_literal:x { \fp_eval:n {#1} ~ M } }
-\cs_new_protected:Npn \__driver_draw_cap_butt:
+\cs_new_protected:Npn \driver_draw_cap_butt:
   { \__driver_draw_literal:n { 0 ~ J } }
-\cs_new_protected:Npn \__driver_draw_cap_round:
+\cs_new_protected:Npn \driver_draw_cap_round:
   { \__driver_draw_literal:n { 1 ~ J } }
-\cs_new_protected:Npn \__driver_draw_cap_rectangle:
+\cs_new_protected:Npn \driver_draw_cap_rectangle:
   { \__driver_draw_literal:n { 2 ~ J } }
-\cs_new_protected:Npn \__driver_draw_join_miter:
+\cs_new_protected:Npn \driver_draw_join_miter:
   { \__driver_draw_literal:n { 0 ~ j } }
-\cs_new_protected:Npn \__driver_draw_join_round:
+\cs_new_protected:Npn \driver_draw_join_round:
   { \__driver_draw_literal:n { 1 ~ j } }
-\cs_new_protected:Npn \__driver_draw_join_bevel:
+\cs_new_protected:Npn \driver_draw_join_bevel:
   { \__driver_draw_literal:n { 2 ~ j } }
-\cs_new_protected:Npn \__driver_draw_color_cmyk:nnnn #1#2#3#4
+\cs_new_protected:Npn \driver_draw_color_cmyk:nnnn #1#2#3#4
   {
     \use:x
       {
@@ -357,7 +348,7 @@
     \__driver_draw_literal:n
       { #1 ~ #2 ~ #3 ~ #4 ~ k ~ #1 ~ #2 ~ #3 ~ #4 ~ K }
   }
-\cs_new_protected:Npn \__driver_draw_color_cmyk_fill:nnnn #1#2#3#4
+\cs_new_protected:Npn \driver_draw_fill_cmyk:nnnn #1#2#3#4
   {
     \__driver_draw_literal:x
       {
@@ -366,7 +357,7 @@
         k
       }
   }
-\cs_new_protected:Npn \__driver_draw_color_cmyk_stroke:nnnn #1#2#3#4
+\cs_new_protected:Npn \driver_draw_stroke_cmyk:nnnn #1#2#3#4
   {
     \__driver_draw_literal:x
       {
@@ -375,7 +366,7 @@
         K
       }
   }
-\cs_new_protected:Npn \__driver_draw_color_gray:n #1
+\cs_new_protected:Npn \driver_draw_color_gray:n #1
   {
     \use:x
       { \__driver_draw_color_gray_aux:n { \fp_eval:n {#1} } }
@@ -384,11 +375,11 @@
   {
     \__driver_draw_literal:n { #1 ~ g ~ #1 ~ G }
   }
-\cs_new_protected:Npn \__driver_draw_color_gray_fill:n #1
+\cs_new_protected:Npn \driver_draw_fill_gray:n #1
   { \__driver_draw_literal:x { \fp_eval:n {#1} ~ g } }
-\cs_new_protected:Npn \__driver_draw_color_gray_stroke:n #1
+\cs_new_protected:Npn \driver_draw_stroke_gray:n #1
   { \__driver_draw_literal:x { \fp_eval:n {#1} ~ G } }
-\cs_new_protected:Npn \__driver_draw_color_rgb:nnn #1#2#3
+\cs_new_protected:Npn \driver_draw_color_rgb:nnn #1#2#3
   {
     \use:x
       {
@@ -403,17 +394,17 @@
     \__driver_draw_literal:n
       { #1 ~ #2 ~ #3 ~ rg ~ #1 ~ #2 ~ #3 ~ RG }
   }
-\cs_new_protected:Npn \__driver_draw_color_rgb_fill:nnn #1#2#3
+\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 }
   }
-\cs_new_protected:Npn \__driver_draw_color_rgb_stroke:nnn #1#2#3
+\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 }
   }
-\cs_new_protected:Npn \__driver_draw_transformcm:nnnnnn #1#2#3#4#5#6
+\cs_new_protected:Npn \driver_draw_transformcm:nnnnnn #1#2#3#4#5#6
   {
     \__driver_draw_literal:x
       {
@@ -423,13 +414,13 @@
         cm
       }
   }
-\cs_new_protected:Npn \__driver_draw_hbox:Nnnnnnn #1#2#3#4#5#6#7
+\cs_new_protected:Npn \driver_draw_hbox:Nnnnnnn #1#2#3#4#5#6#7
   {
     \hbox_set:Nn \l__driver_tmp_box
       {
         \tex_kern:D \__dim_eval:n {#6}
         \__driver_scope_begin:
-        \__driver_draw_transformcm:nnnnnn {#2} {#3} {#4} {#5}
+        \driver_draw_transformcm:nnnnnn {#2} {#3} {#4} {#5}
           { 0pt } { 0pt }
         \box_move_up:nn {#7} { \box_use:N #1 }
         \__driver_scope_end:

Modified: trunk/Master/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty	2017-12-17 23:16:51 UTC (rev 46085)
@@ -19,8 +19,8 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: l3keys2e.dtx (C) Copyright 2009,2011-2017 The LaTeX3 Project
-\RequirePackage{expl3}[2017/12/05]
-\@ifpackagelater{expl3}{2017/12/05}
+\RequirePackage{expl3}[2017/12/16]
+\@ifpackagelater{expl3}{2017/12/16}
   {}
   {%
     \PackageError{l3keys2e}{Support package l3kernel too old}
@@ -32,7 +32,7 @@
       }%
     \endinput
   }
-\ProvidesExplPackage{l3keys2e}{2017/12/05}{}
+\ProvidesExplPackage{l3keys2e}{2017/12/16}{}
   {LaTeX2e option processing using LaTeX3 keys}
 \cs_generate_variant:Nn \clist_put_right:Nn { Nv }
 \cs_generate_variant:Nn \keys_if_exist:nnT  { nx }

Modified: trunk/Master/texmf-dist/tex/latex/l3packages/xfp/xfp.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3packages/xfp/xfp.sty	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/tex/latex/l3packages/xfp/xfp.sty	2017-12-17 23:16:51 UTC (rev 46085)
@@ -19,8 +19,8 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: xfp.dtx (C) Copyright 2017 The LaTeX3 Project
-\RequirePackage{expl3}[2017/12/05]
-\@ifpackagelater{expl3}{2017/12/05}
+\RequirePackage{expl3}[2017/12/16]
+\@ifpackagelater{expl3}{2017/12/16}
   {}
   {%
     \PackageError{xfp}{Support package l3kernel too old}
@@ -33,7 +33,7 @@
     \endinput
   }
 \RequirePackage{xparse}
-\ProvidesExplPackage{xfp}{2017/12/05}{}
+\ProvidesExplPackage{xfp}{2017/12/16}{}
   {L3 Floating point unit}
 \NewExpandableDocumentCommand \fpeval { m } { \fp_eval:n {#1} }
 \NewExpandableDocumentCommand \inteval { m } { \int_eval:n {#1} }

Modified: trunk/Master/texmf-dist/tex/latex/l3packages/xfrac/xfrac.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3packages/xfrac/xfrac.sty	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/tex/latex/l3packages/xfrac/xfrac.sty	2017-12-17 23:16:51 UTC (rev 46085)
@@ -20,8 +20,8 @@
 %% 
 %% File: xfrac.dtx Copyright (C) 2004, 2008-2010 Morten Hoegholm
 %%                           (C) 2011,2012,2014-2017 The LaTeX3 Project
-\RequirePackage{expl3}[2017/12/05]
-\@ifpackagelater{expl3}{2017/12/05}
+\RequirePackage{expl3}[2017/12/16]
+\@ifpackagelater{expl3}{2017/12/16}
   {}
   {%
     \PackageError{xfrac}{Support package l3kernel too old}
@@ -34,7 +34,7 @@
     \endinput
   }
 \RequirePackage{amstext,graphicx,l3keys2e,textcomp,xparse,xtemplate}
-\ProvidesExplPackage{xfrac}{2017/12/05}{}
+\ProvidesExplPackage{xfrac}{2017/12/16}{}
   {L3 Experimental split-level fractions}
 \keys_define:nn { xfrac }
   {

Modified: trunk/Master/texmf-dist/tex/latex/l3packages/xparse/xparse.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3packages/xparse/xparse.sty	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/tex/latex/l3packages/xparse/xparse.sty	2017-12-17 23:16:51 UTC (rev 46085)
@@ -23,8 +23,8 @@
 %%                  (C) Copyright 2004-2008 Frank Mittelbach,
 %%                      The LaTeX3 Project
 %%                  (C) Copyright 2009-2017 The LaTeX3 Project
-\RequirePackage{expl3}[2017/12/05]
-\@ifpackagelater{expl3}{2017/12/05}
+\RequirePackage{expl3}[2017/12/16]
+\@ifpackagelater{expl3}{2017/12/16}
   {}
   {%
     \PackageError{xparse}{Support package l3kernel too old}
@@ -36,7 +36,7 @@
       }%
     \endinput
   }
-\ProvidesExplPackage{xparse}{2017/12/05}{}
+\ProvidesExplPackage{xparse}{2017/12/16}{}
   {L3 Experimental document command parser}
 \tl_new:N \l__xparse_arg_spec_tl
 \tl_new:N \l__xparse_args_tl
@@ -1837,6 +1837,13 @@
     (or~no~arguments~at~all).~You~cannot~have~a~terminal~optional~
     argument~with~expandable~commands.
   }
+\__msg_kernel_new:nnnn { xparse } { if-boolean }
+  { Invalid~use~\iow_char:N\\IfBooleanTF~{#1} }
+  {
+    \c__msg_coding_error_text_tl
+    The~first~argument~of~\iow_char:N\\IfBoolean(TF/T/F)~must~be~
+    a~boolean~argument~obtained~from~parsing~'s'~or~'t'~arguments.
+  }
 \__msg_kernel_new:nnnn { xparse } { inconsistent-long }
   { Inconsistent~long~arguments~for~expandable~command~'#1'. }
   {
@@ -2109,9 +2116,19 @@
     \__xparse_check_definable:nNT {#1} \DeclareExpandableDocumentCommand
       { \__xparse_declare_expandable_cmd:Nnn #1 {#2} {#3} }
   }
-\cs_new_eq:NN \IfBooleanTF \bool_if:NTF
-\cs_new_eq:NN \IfBooleanT  \bool_if:NT
-\cs_new_eq:NN \IfBooleanF  \bool_if:NF
+\cs_new:Npn \IfBooleanTF #1
+  {
+    \bool_lazy_and:nnTF
+      { \tl_if_single_p:n {#1} }
+      { \tl_if_single_token_p:n #1 }
+      { \bool_if:NTF #1 }
+      {
+        \__msg_kernel_error:nnn { xparse } { if-boolean } {#1}
+        \use_ii:nn
+      }
+  }
+\cs_new:Npn \IfBooleanT #1#2 { \IfBooleanTF {#1} {#2} { } }
+\cs_new:Npn \IfBooleanF #1 { \IfBooleanTF {#1} { } }
 \cs_new_eq:NN \IfNoValueF  \tl_if_novalue:nF
 \cs_new_eq:NN \IfNoValueT  \tl_if_novalue:nT
 \cs_new_eq:NN \IfNoValueTF \tl_if_novalue:nTF

Modified: trunk/Master/texmf-dist/tex/latex/l3packages/xtemplate/xtemplate.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3packages/xtemplate/xtemplate.sty	2017-12-17 23:12:18 UTC (rev 46084)
+++ trunk/Master/texmf-dist/tex/latex/l3packages/xtemplate/xtemplate.sty	2017-12-17 23:16:51 UTC (rev 46085)
@@ -23,8 +23,8 @@
 %%                     (C) Copyright 2004-2010 Frank Mittelbach,
 %%                         The LaTeX3 Project
 %%                     (C) Copyright 2011-2017 The LaTeX3 Project
-\RequirePackage{expl3}[2017/12/05]
-\@ifpackagelater{expl3}{2017/12/05}
+\RequirePackage{expl3}[2017/12/16]
+\@ifpackagelater{expl3}{2017/12/16}
   {}
   {%
     \PackageError{xtemplate}{Support package l3kernel too old}
@@ -36,7 +36,7 @@
       }%
     \endinput
   }
-\ProvidesExplPackage{xtemplate}{2017/12/05}{}
+\ProvidesExplPackage{xtemplate}{2017/12/16}{}
   {L3 Experimental prototype document functions}
 \tl_const:Nn \c__xtemplate_code_root_tl      { template~code~>~ }
 \tl_const:Nn \c__xtemplate_defaults_root_tl  { template~defaults~>~ }



More information about the tex-live-commits mailing list