texlive[44864] Master/texmf-dist: l3 (21jul17)

commits+karl at tug.org commits+karl at tug.org
Sat Jul 22 00:02:53 CEST 2017


Revision: 44864
          http://tug.org/svn/texlive?view=revision&revision=44864
Author:   karl
Date:     2017-07-22 00:02:53 +0200 (Sat, 22 Jul 2017)
Log Message:
-----------
l3 (21jul17)

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/l3obsolete.txt
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex
    trunk/Master/texmf-dist/doc/latex/l3kernel/source3.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex
    trunk/Master/texmf-dist/doc/latex/l3kernel/source3body.tex
    trunk/Master/texmf-dist/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/l3.ins
    trunk/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/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/l3pdfmode.def
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3sort.sty
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3tl-analysis.sty
    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

Added Paths:
-----------
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3tl-build.sty

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3experimental/README.md	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/doc/latex/l3experimental/README.md	2017-07-21 22:02:53 UTC (rev 44864)
@@ -1,7 +1,7 @@
 Experimental LaTeX3 Concepts
 ============================
 
-Release 2017/07/15
+Release 2017/07/19
 
 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-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/README.md	2017-07-21 22:02:53 UTC (rev 44864)
@@ -1,7 +1,7 @@
 LaTeX3 Programming Conventions
 ==============================
 
-Release 2017/07/15
+Release 2017/07/19
 
 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-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex	2017-07-21 22:02:53 UTC (rev 44864)
@@ -63,6 +63,7 @@
          {latex-team at latex-project.org}%
    }%
 }
+\date{Released 2017/07/19}
 
 \pagenumbering{roman}
 \maketitle

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

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3obsolete.txt
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/l3obsolete.txt	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3obsolete.txt	2017-07-21 22:02:53 UTC (rev 44864)
@@ -19,6 +19,8 @@
 \box_resize:cnn                   2018
 \box_resize:Nnn                   2018
 \file_add_path:nN                 2018
+\file_if_exist_input:nT           2017
+\file_if_exist_input:nTF          2017
 \file_list:                       2018
 \file_path_include:n              2018
 \file_path_remove:n               2018

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-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex	2017-07-21 22:02:53 UTC (rev 44864)
@@ -30,7 +30,7 @@
         {latex-team at latex-project.org}%
     }%
 }
-\date{Released 2017/07/15}
+\date{Released 2017/07/19}
 
 \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-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex	2017-07-21 22:02:53 UTC (rev 44864)
@@ -30,7 +30,7 @@
         {latex-team at latex-project.org}%
     }%
 }
-\date{Released 2017/07/15}
+\date{Released 2017/07/19}
 
 \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-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex	2017-07-21 22:02:53 UTC (rev 44864)
@@ -62,6 +62,7 @@
          {latex-team at latex-project.org}%
    }%
 }
+\date{Released 2017/07/19}
 
 \pagenumbering{roman}
 \maketitle

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/source3body.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/source3body.tex	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/source3body.tex	2017-07-21 22:02:53 UTC (rev 44864)
@@ -453,8 +453,8 @@
 \ExplSyntaxOff
 
 \DocInput{l3sort.dtx}
+\DocInput{l3tl-build.dtx}
 \DocInput{l3tl-analysis.dtx}
-\DocInput{l3tl-build.dtx}
 \DocInput{l3regex.dtx}
 \DocInput{l3box.dtx}
 \DocInput{l3coffins.dtx}

Modified: trunk/Master/texmf-dist/doc/latex/l3packages/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3packages/README.md	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/doc/latex/l3packages/README.md	2017-07-21 22:02:53 UTC (rev 44864)
@@ -1,7 +1,7 @@
 LaTeX3 High-Level Concepts
 ==========================
 
-Release 2017/07/15
+Release 2017/07/19
 
 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-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-convert.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -47,7 +47,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %
@@ -252,7 +252,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{l3str-convert}{2017/07/15}{}
+\ProvidesExplPackage{l3str-convert}{2017/07/19}{}
   {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-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -47,7 +47,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %
@@ -163,7 +163,7 @@
 %
 %    \begin{macrocode}
 %<*package>
-\ProvidesExplPackage{l3str-format}{2017/07/15}{}
+\ProvidesExplPackage{l3str-format}{2017/07/19}{}
   {L3 Experimental string formatting}
 \RequirePackage{l3str}
 %</package>

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -54,7 +54,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %
@@ -673,7 +673,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xcoffins}{2017/07/15}{}
+\ProvidesExplPackage{xcoffins}{2017/07/19}{}
   {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-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -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/07/15]
-%<package>\@ifpackagelater{expl3}{2017/07/15}
+\RequirePackage{expl3}[2017/07/19]
+%<package>\@ifpackagelater{expl3}{2017/07/19}
 %<package>  {}
 %<package>  {%
 %<package>    \PackageError{l3galley}{Support package l3kernel too old}
@@ -59,7 +59,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %
@@ -685,7 +685,7 @@
 %
 %    \begin{macrocode}
 %<*package>
-\ProvidesExplPackage{l3galley}{2017/07/15}{}
+\ProvidesExplPackage{l3galley}{2017/07/19}{}
   {L3 Experimental galley code}
 %</package>
 %    \end{macrocode}
@@ -2018,7 +2018,7 @@
       {
         \dim_compare:nNnT
           { \etex_glueexpr:D \g_@@_interpar_vspace_user_tl } 
-            < { \etex_glueexpr:D #1 \scan_stop: }
+            < { \etex_glueexpr:D (#1) \scan_stop: }
           { \galley_vspace_set_single:n {#1} }
       }
   }
@@ -2310,6 +2310,7 @@
 %   generic build system is invoked (in case the
 %   \cs{etex_interlinepenalties:D} has accidentally been cleared).
 %    \begin{macrocode}
+\__debug_patch_args:nNNpn { { (#1) } }
 \cs_new_protected:Npn \galley_interline_penalty_set:n #1
   {
     \int_compare:nNnTF { \etex_interlinepenalties:D 0 } = 0

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -45,7 +45,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %
@@ -732,7 +732,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xgalley}{2017/07/15}{}
+\ProvidesExplPackage{xgalley}{2017/07/19}{}
   {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-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -21,7 +21,7 @@
 % for those people who are interested.
 %
 %<*driver|generic|package>
-\def\ExplFileDate{2017/07/15}%
+\def\ExplFileDate{2017/07/19}%
 %</driver|generic|package>
 %<*driver>
 \documentclass[full]{l3doc}
@@ -49,7 +49,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %
@@ -1465,6 +1465,7 @@
       }
     \cs_set_protected:Npn \box_rotate:Nn #1#2
       { \hbox_set:Nn #1 { \rotatebox {#2} { \box_use:N #1 } } }
+    \__debug_patch_args:nNNpn { {#1} { (#2) } { (#3) } }
     \cs_set_protected:Npn \box_resize_to_wd_and_ht_plus_dp:Nnn #1#2#3
       {
         \hbox_set:Nn #1
@@ -1475,6 +1476,7 @@
               { \box_use:N #1 }
           }
       }
+    \__debug_patch_args:nNNpn { {#1} { (#2) } }
     \cs_set_protected:Npn \box_resize_to_ht_plus_dp:Nn #1#2
       {
         \hbox_set:Nn #1
@@ -1483,6 +1485,7 @@
               { \box_use:N #1 }
           }
       }
+    \__debug_patch_args:nNNpn { {#1} { (#2) } }
     \cs_set_protected:Npn \box_resize_to_wd:Nn #1#2
       {
         \hbox_set:Nn #1
@@ -1707,14 +1710,6 @@
 \fi
 %    \end{macrocode}
 %
-% \begin{macro}{\__iow_wrap_set:Nx}
-%   Without \LaTeXe{} there is no \cs{protected at edef} so the more risky
-%   direct use of \cs{tl_set:Nx} is required.
-%    \begin{macrocode}
-\cs_set_eq:NN \__iow_wrap_set:Nx \tl_set:Nx
-%    \end{macrocode}
-% \end{macro}
-%
 % For driver loading in generic mode, there are no options: pick the most
 % appropriate case! To allow this loading to take place a temporary
 % definition of \cs{ProvidesExplFile} is provided

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3.ins
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3.ins	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3.ins	2017-07-21 22:02:53 UTC (rev 44864)
@@ -149,6 +149,7 @@
 \generate{\file{l3str.sty}        {\from{l3oldmodules.dtx}       {l3str,oldmodules}}}
 \generate{\file{l3tl.sty}         {\from{l3oldmodules.dtx}       {l3tl,oldmodules}}}
 \generate{\file{l3tl-analysis.sty}{\from{l3oldmodules.dtx}       {l3tl-analysis,oldmodules}}}
+\generate{\file{l3tl-build.sty}   {\from{l3oldmodules.dtx}       {l3tl-build,oldmodules}}}
 \generate{\file{l3token.sty}      {\from{l3oldmodules.dtx}       {l3token,oldmodules}}}
 
 % Lua code

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %
@@ -1149,15 +1149,6 @@
 %
 % \section{Internal kernel functions}
 %
-% \begin{function}{\__chk_if_exist_cs:N, \__chk_if_exist_cs:c}
-%   \begin{syntax}
-%     \cs{__chk_if_exist_cs:N} \meta{cs}
-%   \end{syntax}
-%   This function checks that \meta{cs} exists according to the
-%   criteria for \cs{cs_if_exist_p:N}, and if not raises a kernel-level
-%   error.
-% \end{function}
-%
 % \begin{function}{\__chk_if_free_cs:N, \__chk_if_free_cs:c}
 %   \begin{syntax}
 %     \cs{__chk_if_free_cs:N} \meta{cs}
@@ -1167,51 +1158,6 @@
 %   error.
 % \end{function}
 %
-% \begin{function}{\__chk_if_exist_var:N}
-%   \begin{syntax}
-%     \cs{__chk_if_exist_var:N} \meta{var}
-%   \end{syntax}
-%   This function checks that \meta{var} is defined according to the
-%   criteria for \cs{cs_if_free_p:N}, and if not raises a kernel-level
-%   error. This function is only created if the package option
-%   \texttt{check-declarations} is active.
-% \end{function}
-%
-% \begin{function}{\__debug_log:x}
-%   \begin{syntax}
-%     \cs{__debug_log:x} \Arg{message text}
-%   \end{syntax}
-%   Only defined when debugging is enabled (hence only in package mode
-%   with the right options).  If the \texttt{log-functions} option is
-%   active, this function writes the \meta{message text} to the log file
-%   using \cs{iow_log:x}.  Otherwise, the \meta{message text} is ignored
-%   using \cs{use_none:n}.
-% \end{function}
-%
-% \begin{function}{\__debug_suspend_log:, \__debug_resume_log:}
-%   \begin{syntax}
-%     \cs{__debug_suspend_log:} \ldots{} \cs{__debug_log:x} \ldots{} \cs{__debug_resume_log:}
-%   \end{syntax}
-%   Any \cs{__debug_log:x} command between \cs{__debug_suspend_log:} and
-%   \cs{__debug_resume_log:} is suppressed.  These two commands can be
-%   nested and do nothing when debugging is disabled.
-% \end{function}
-%
-% \begin{function}{\__debug_patch:nnNw}
-%   \begin{syntax}
-%     \cs{__debug_patch:nnNw} \Arg{before} \Arg{after} \meta{definition} \ldots{}
-%   \end{syntax}
-%   If debugging is enabled (by one of few \pkg{expl3} options that
-%   imply \texttt{enable-debug}), adds the \meta{before} and
-%   \meta{after} tokens (which can involve |#1| and so on) in the
-%   \meta{definition} that follows.  Otherwise ignore the \meta{before}
-%   and \meta{after} code and perform the \meta{definition} with no
-%   patching.  The \meta{definition} must start with \cs{cs_new:Npn} or
-%   \cs{cs_set:Npn} or \cs{cs_gset:Npn} or \cs{prg_new_conditional:Npnn}
-%   or their protected counterparts.  Other cases could be added as
-%   needed.
-% \end{function}
-%
 % \begin{function}[EXP]{\__cs_count_signature:N, \__cs_count_signature:c}
 %   \begin{syntax}
 %     \cs{__cs_count_signature:N} \meta{function}
@@ -1266,6 +1212,108 @@
 %   normally (spaces, characters with category other).
 % \end{function}
 %
+% \begin{function}{\__debug:TF}
+%   \begin{syntax}
+%     \cs{__debug:TF} \Arg{true code} \Arg{false code}
+%   \end{syntax}
+%   Runs the \meta{true code} if debugging is enabled, namely only in
+%   \LaTeXe{} package mode with one of the options
+%   \texttt{check-declarations}, \texttt{enable-debug}, or
+%   \texttt{log-functions}.  Otherwise runs the \meta{false code}.  The
+%   |T| and |F| variants are not provided for this low-level
+%   conditional.
+% \end{function}
+%
+% \begin{function}{\__debug_chk_cs_exist:N, \__debug_chk_cs_exist:c}
+%   \begin{syntax}
+%     \cs{__debug_chk_cs_exist:N} \meta{cs}
+%   \end{syntax}
+%   This function is only created if debugging is enabled.  It checks
+%   that \meta{cs} exists according to the criteria for
+%   \cs{cs_if_exist_p:N}, and if not raises a kernel-level error.
+% \end{function}
+%
+% \begin{function}{\__debug_chk_var_exist:N}
+%   \begin{syntax}
+%     \cs{__debug_chk_var_exist:N} \meta{var}
+%   \end{syntax}
+%   This function is only created if debugging is enabled.  It checks
+%   that \meta{var} is defined according to the criteria for
+%   \cs{cs_if_exist_p:N}, and if not raises a kernel-level error.
+% \end{function}
+%
+% \begin{function}{\__debug_log:x}
+%   \begin{syntax}
+%     \cs{__debug_log:x} \Arg{message text}
+%   \end{syntax}
+%   If the \texttt{log-functions} option is active, this function writes
+%   the \meta{message text} to the log file using \cs{iow_log:x}.
+%   Otherwise, the \meta{message text} is ignored using \cs{use_none:n}.
+%   This function is only created if debugging is enabled.
+% \end{function}
+%
+% \begin{function}{\__debug_suspend_log:, \__debug_resume_log:}
+%   \begin{syntax}
+%     \cs{__debug_suspend_log:} \ldots{} \cs{__debug_log:x} \ldots{} \cs{__debug_resume_log:}
+%   \end{syntax}
+%   Any \cs{__debug_log:x} command between \cs{__debug_suspend_log:} and
+%   \cs{__debug_resume_log:} is suppressed.  These two commands can be
+%   nested.  These functions are only created if debugging is enabled.
+% \end{function}
+%
+% \begin{function}{\__debug_patch:nnNNpn}
+%   \begin{syntax}
+%     \cs{__debug_patch:nnNNpn} \Arg{before} \Arg{after}
+%     \meta{definition} \meta{function} \meta{parameters} \Arg{code}
+%   \end{syntax}
+%   If debugging is not enabled, this function ignores the \meta{before}
+%   and \meta{after} code and performs the \meta{definition} with no
+%   patching.  Otherwise it replaces \meta{code} by \meta{before}
+%   \meta{code} \meta{after} (which can involve |#1| and so on) in the
+%   \meta{definition} that follows.  The \meta{definition} must start
+%   with \cs{cs_new:Npn} or \cs{cs_set:Npn} or \cs{cs_gset:Npn} or their
+%   \texttt{_protected} counterparts.  Other cases can be added as
+%   needed.
+% \end{function}
+%
+% \begin{function}{\__debug_patch_conditional:nNNpnn}
+%   \begin{syntax}
+%     \cs{__debug_patch_conditional:nNNpn} \Arg{before}
+%     \meta{definition} \meta{conditional} \meta{parameters} \Arg{type} \Arg{code}
+%   \end{syntax}
+%   Similar to \cs{__debug_patch:nnNNpn} for conditionals, namely
+%   \meta{definition} must be \cs{prg_new_conditional:Npnn} or its
+%   \texttt{_protected} counterpart.  There is no \meta{after} code
+%   because that would interfere with the action of the conditional.
+% \end{function}
+%
+% \begin{function}
+%   {\__debug_patch_args:nNNpn, \__debug_patch_conditional_args:nNNpnn}
+%   \begin{syntax}
+%     \cs{__debug_patch_args:nNNpn} \Arg{arguments}
+%     \meta{definition} \meta{function} \meta{parameters} \Arg{code}
+%   \end{syntax}
+%   Like \cs{__debug_patch:nnNNpn}, this tweaks the following
+%   definition, but from the \enquote{inside out} (and if debugging is
+%   not enabled, the \meta{arguments} are ignored).  It replaces |#1|,
+%   |#2| and so on in the \meta{code} of the definition as indicated by
+%   the \meta{arguments}.  More precisely, a temporary function is
+%   defined using the \meta{definition} with the \meta{parameters} and
+%   \meta{code}, then the result of expanding that function once in
+%   front of the \meta{arguments} is used instead of the \meta{code}
+%   when defining the actual function.  For instance,
+%   \begin{quote}
+%     \cs{__debug_patch_args:nNNpn} |{ { (#1) } }| \\
+%     \cs{cs_new:Npn} \cs{int_eval:n} |#1| \\
+%     ~~|{ \__int_value:w \__int_eval:w #1 \__int_eval_end: }|
+%   \end{quote}
+%   replaces |#1| by |(#1)| in the definition of \cs{int_eval:n} when
+%   debugging is enabled.  This fails if the \meta{code} contains~|##|.
+%   The \cs{__debug_patch_conditional_args:nNNpnn} function is for use
+%   before \cs{prg_new_conditional:Npnn} or its \texttt{_protected}
+%   counterpart.
+% \end{function}
+%
 % \begin{function}{\__kernel_register_show:N, \__kernel_register_show:c}
 %   \begin{syntax}
 %     \cs{__kernel_register_show:N} \meta{register}
@@ -1665,6 +1713,313 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \subsection{Debugging and patching later definitions}
+%
+% \begin{macro}[int]{\__debug:TF}
+%   A more meaningful test of whether debugging is enabled than messing
+%   up with guards.  We can also more easily change the logic in one
+%   place then.  At present, debugging is disabled in the format and in
+%   generic mode, while in \LaTeXe{} mode it is enabled if one of the
+%   options \texttt{enable-debug}, \texttt{log-functions} or
+%   \texttt{check-declarations} was given.
+%    \begin{macrocode}
+\cs_set_protected:Npn \__debug:TF #1#2 {#2}
+%<*package>
+\tex_ifodd:D \l at expl@enable at debug@bool
+  \cs_set_protected:Npn \__debug:TF #1#2 {#1}
+\fi:
+%</package>
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\debug_on:n, \debug_off:n}
+%   
+%    \begin{macrocode}
+\__debug:TF
+  {
+    \cs_set_protected:Npn \debug_on:n #1
+      {
+        \exp_args:No \clist_map_inline:nn { \tl_to_str:n {#1} }
+          {
+            \cs_if_exist_use:cF { __debug_##1_on: }
+              { \__msg_kernel_error:nnn { kernel } { debug } {##1} }
+          }
+      }
+    \cs_set_protected:Npn \debug_off:n #1
+      {
+        \exp_args:No \clist_map_inline:nn { \tl_to_str:n {#1} }
+          {
+            \cs_if_exist_use:cF { __debug_##1_off: }
+              { \__msg_kernel_error:nnn { kernel } { debug } {##1} }
+          }
+      }
+  }
+  {
+    \cs_set_protected:Npn \debug_on:n #1
+      {
+        \__msg_kernel_error:nnx { kernel } { enable-debug }
+          { \tl_to_str:n { \debug_on:n {#1} } }
+      }
+    \cs_set_protected:Npn \debug_off:n #1
+      {
+        \__msg_kernel_error:nnx { kernel } { enable-debug }
+          { \tl_to_str:n { \debug_off:n {#1} } }
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[aux]
+%   {\__debug_check-declarations_on:, \__debug_check-declarations_off:}
+% \begin{macro}[int]{\__debug_chk_var_exist:N}
+% \begin{macro}[int]{\__debug_chk_cs_exist:N, \__debug_chk_cs_exist:c}
+%   When debugging is not active these two functions produce an
+%   error.  Otherwise they set up \cs{__debug_chk_var_exist:N} and
+%   \cs{__debug_chk_cs_exist:N}, two functions that test (when
+%   \texttt{check-declarations} is active) that their argument is
+%   defined.
+%    \begin{macrocode}
+\__debug:TF
+  {
+    \exp_args:Nc \cs_set_protected:Npn { __debug_check-declarations_on: }
+      {
+        \cs_set_protected:Npn \__debug_chk_var_exist:N ##1
+          {
+            \cs_if_exist:NF ##1
+              {
+                \__msg_kernel_error:nnx { kernel } { non-declared-variable }
+                  { \token_to_str:N ##1 }
+              }
+          }
+        \cs_set_protected:Npn \__debug_chk_cs_exist:N ##1
+          {
+            \cs_if_exist:NF ##1
+              {
+                \__msg_kernel_error:nnx { kernel } { command-not-defined }
+                  { \token_to_str:N ##1 }
+              }
+          }
+      }
+    \exp_args:Nc \cs_set_protected:Npn { __debug_check-declarations_off: }
+      {
+        \cs_set_protected:Npn \__debug_chk_var_exist:N ##1 { }
+        \cs_set_protected:Npn \__debug_chk_cs_exist:N ##1 { }
+      }
+    \cs_set_protected:Npn \__debug_chk_cs_exist:c
+      { \exp_args:Nc \__debug_chk_cs_exist:N }
+    \tex_ifodd:D \l at expl@check at declarations@bool
+      \use:c { __debug_check-declarations_on: }
+    \else:
+      \use:c { __debug_check-declarations_off: }
+    \fi:
+  }
+  { }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[aux]{\__debug_log-functions_on:, \__debug_log-functions_off:}
+% \begin{macro}[int]{\__debug_log:x, \__debug_suspend_log:, \__debug_resume_log:}
+%   These two functions
+%   (corresponding to the \pkg{expl3} option \texttt{log-functions})
+%   control whether \cs{__debug_log:x} writes to the log file or not.
+%   Since \cs{iow_log:x} does not yet have its final definition we do
+%   not use \cs{cs_set_eq:NN} (not defined yet anyway).  The
+%   \cs{__debug_suspend_log:} function disables \cs{__debug_log:x} until
+%   the matching \cs{__debug_resume_log:}.  These two commands are used
+%   to improve the logging for datatypes with multiple parts, currently
+%   only coffins.  They should come in pairs, which can be nested (this
+%   complicates the code here and is currently unused).  The function
+%   \cs{exp_not:o} is defined in \pkg{l3expan} later on but
+%   \cs{__debug_suspend_log:} and \cs{__debug_resume_log:} are not used
+%   before that point.  Once everything is defined, turn logging on or
+%   off depending on what option was given.
+%   When debugging is not enabled, simply produce an error.
+%    \begin{macrocode}
+\__debug:TF
+  {
+    \exp_args:Nc \cs_set_protected:Npn { __debug_log-functions_on: }
+      {
+        \cs_set_protected:Npn \__debug_log:x { \iow_log:x }
+        \cs_set_protected:Npn \__debug_suspend_log:
+          {
+            \cs_set_protected:Npx \__debug_resume_log:
+              {
+                \cs_set_protected:Npn \__debug_resume_log:
+                  { \exp_not:o { \__debug_resume_log: } }
+                \cs_set_protected:Npn \__debug_log:x
+                  { \exp_not:o { \__debug_log:x } }
+              }
+            \cs_set_protected:Npn \__debug_log:x { \use_none:n }
+          }
+        \cs_set_protected:Npn \__debug_resume_log: { }
+      }
+    \exp_args:Nc \cs_set_protected:Npn { __debug_log-functions_off: }
+      {
+        \cs_set_protected:Npn \__debug_log:x { \use_none:n }
+        \cs_set_protected:Npn \__debug_suspend_log: { }
+        \cs_set_protected:Npn \__debug_resume_log: { }
+      }
+    \tex_ifodd:D \l at expl@log at functions@bool
+      \use:c { __debug_log-functions_on: }
+    \else:
+      \use:c { __debug_log-functions_off: }
+    \fi:
+  }
+  { }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\__debug_deprecation_on:, \__debug_deprecation_off:}
+% \begin{variable}{\g__debug_deprecation_on_tl, \g__debug_deprecation_off_tl}
+%   Some commands were more recently deprecated and not yet removed;
+%   only make these into errors if the user requests it.  This relies on
+%   two token lists, filled up by calls to
+%   \cs{__debug_deprecation:nnNNpn} in each module.
+%    \begin{macrocode}
+\__debug:TF
+  {
+    \cs_set_protected:Npn \__debug_deprecation_on:
+      { \g__debug_deprecation_on_tl }
+    \cs_set_protected:Npn \__debug_deprecation_off:
+      { \g__debug_deprecation_off_tl }
+    \cs_set_nopar:Npn \g__debug_deprecation_on_tl { }
+    \cs_set_nopar:Npn \g__debug_deprecation_off_tl { }
+  }
+  { }
+%    \end{macrocode}
+% \end{variable}
+% \end{macro}
+%
+% \begin{macro}[int]{\__debug_deprecation:nnNNpn}
+% \begin{macro}[aux]{\__debug_deprecation_aux:nnNnn}
+%   Grab a definition (at present, must be \cs{cs_new_protected:Npn}).
+%   Add to \cs{g__debug_deprecation_on_tl} some code that makes the
+%   defined macro |#3| outer (and defines it as an error).  Add to
+%   \cs{g__debug_deprecation_off_tl} the definition itself.  In both
+%   cases we undefine the token with \cs{tex_let:D} to avoid taking a
+%   potentially outer macro as the argument of some \pkg{expl3}
+%   function.  Finally define the macro itself to produce a warning then
+%   redefine and call itself.  The macro initially takes no parameters:
+%   together with the \texttt{x}-expanding assignment and \cs{exp_not:n}
+%   this gives a convenient way of storing the macro's definition in
+%   itself in order to only produce the warning once for each macro.
+%   If debugging is disabled, \cs{__debug_deprecation:nnNNpn} lets the
+%   definition happen.
+%    \begin{macrocode}
+\__debug:TF
+  {
+    \cs_set_protected:Npn \__debug_deprecation:nnNNpn #1#2#3#4#5#
+      {
+        \if_meaning:w \cs_new_protected:Npn #3
+        \else:
+          \__msg_kernel_error:nnx { kernel } { debug-unpatchable }
+            { \token_to_str:N #3 ~(for~deprecation) }
+        \fi:
+        \__debug_deprecation_aux:nnNnn {#1} {#2} #4 {#5}
+      }
+    \cs_set_protected:Npn \__debug_deprecation_aux:nnNnn #1#2#3#4#5
+      {
+        \tl_gput_right:Nn \g__debug_deprecation_on_tl
+          {
+            \tex_let:D #3 \scan_stop:
+            \__deprecation_error:Nnn #3 {#2} {#1}
+          }
+        \tl_gput_right:Nn \g__debug_deprecation_off_tl
+          {
+            \tex_let:D #3 \scan_stop:
+            \cs_set_protected:Npn #3 #4 {#5}
+          }
+        \cs_new_protected:Npx #3
+          {
+            \exp_not:N \__msg_kernel_warning:nnxxx
+              { kernel } { deprecated-command }
+              {#1} { \token_to_str:N #3 } { \tl_to_str:n {#2} }
+            \exp_not:n { \cs_gset_protected:Npn #3 #4 {#5} }
+            \exp_not:N #3
+          }
+      }
+  }
+  { \cs_set_protected:Npn \__debug_deprecation:nnNNpn #1#2 { } }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[int]
+%   {\__debug_patch:nnNNpn, \__debug_patch_conditional:nNNpnn}
+% \begin{macro}[aux]
+%   {\__debug_patch_aux:nnNNnn, \__debug_patch_aux:nNNnnn}
+%   When debugging is not enabled, \cs{__debug_patch:nnNNpn} and
+%   \cs{__debug_patch_conditional:nNNpnn} throw the patch away.
+%   Otherwise they can be followed by \cs{cs_new:Npn} (or similar), and
+%   \cs{prg_new_conditional:Npnn} (or similar), respectively.  In each
+%   case, grab the name of the function to be defined and its parameters
+%   then insert tokens before and/or after the definition.
+%    \begin{macrocode}
+\__debug:TF
+  {
+    \cs_set_protected:Npn \__debug_patch:nnNNpn #1#2#3#4#5#
+      { \__debug_patch_aux:nnNNnn {#1} {#2} #3 #4 {#5} }
+    \cs_set_protected:Npn \__debug_patch_conditional:nNNpnn #1#2#3#4#
+      { \__debug_patch_aux:nNNnnn {#1} #2 #3 {#4} }
+    \cs_set_protected:Npn \__debug_patch_aux:nnNNnn #1#2#3#4#5#6
+      { #3 #4 #5 { #1 #6 #2 } }
+    \cs_set_protected:Npn \__debug_patch_aux:nNNnnn #1#2#3#4#5#6
+      { #2 #3 #4 {#5} { #1 #6 } }
+  }
+  {
+    \cs_set_protected:Npn \__debug_patch:nnNNpn #1#2 { }
+    \cs_set_protected:Npn \__debug_patch_conditional:nNNpnn #1 { }
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[int]
+%   {\__debug_patch_args:nNNpn, \__debug_patch_conditional_args:nNNpnn}
+% \begin{macro}[aux]
+%   {
+%     \__debug_tmp:w,
+%     \__debug_patch_args_aux:nNNnn,
+%     \__debug_patch_args_aux:nNNnnn
+%   }
+%   See \cs{__debug_patch:nnNNpn}.  The first argument is something like
+%   |{#1}{(#2)}|.  Define a temporary macro using the \meta{parameters}
+%   and \meta{code} of the definition that follows, then expand that
+%   temporary macro in front of the first argument to obtain new
+%   \meta{code}.  Then perform the definition as if that new \meta{code}
+%   was directly typed in the file.  To make it easy to expand in the
+%   definition, treat it as a \enquote{pre}-code to an empty definition.
+%    \begin{macrocode}
+\__debug:TF
+  {
+    \cs_set_protected:Npn \__debug_patch_args:nNNpn #1#2#3#4#
+      { \__debug_patch_args_aux:nNNnn {#1} #2 #3 {#4} }
+    \cs_set_protected:Npn \__debug_patch_conditional_args:nNNpnn #1#2#3#4#
+      { \__debug_patch_args_aux:nNNnnn {#1} #2 #3 {#4} }
+    \cs_set_protected:Npn \__debug_patch_args_aux:nNNnn #1#2#3#4#5
+      {
+        \cs_set:Npn \__debug_tmp:w #4 {#5}
+        \exp_after:wN \__debug_patch_aux:nnNNnn \exp_after:wN
+          { \__debug_tmp:w #1 } { } #2 #3 {#4} { }
+      }
+    \cs_set_protected:Npn \__debug_patch_args_aux:nNNnnn #1#2#3#4#5#6
+      {
+        \cs_set:Npn \__debug_tmp:w #4 {#6}
+        \exp_after:wN \__debug_patch_aux:nNNnnn \exp_after:wN
+          { \__debug_tmp:w #1 } #2 #3 {#4} {#5} { }
+      }
+  }
+  {
+    \cs_set_protected:Npn \__debug_patch_args:nNNpn #1 { }
+    \cs_set_protected:Npn \__debug_patch_conditional_args:nNNpnn #1 { }
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
 % \subsection{Conditional processing and definitions}
 %
 % Underneath any predicate function (|_p|) or other conditional forms
@@ -1995,26 +2350,22 @@
       #5 {#1} {#2} {#3} {#4}
     \__prg_set_eq_conditional_loop:nnnnNw {#1} {#2} {#3} {#4} #5
   }
+\__debug_patch:nnNNpn
+  { \__debug_chk_cs_exist:c { #5 _p : #6    } } { }
 \cs_set:Npn \__prg_set_eq_conditional_p_form:wNnnnn #1 \q_stop #2#3#4#5#6
-  {
-    \__chk_if_exist_cs:c { #5 _p : #6    }
-    #2 { #3 _p : #4    } { #5 _p : #6    }
-  }
+  { #2 { #3 _p : #4    }    { #5 _p : #6    } }
+\__debug_patch:nnNNpn
+  { \__debug_chk_cs_exist:c { #5    : #6 TF } } { }
 \cs_set:Npn \__prg_set_eq_conditional_TF_form:wNnnnn #1 \q_stop #2#3#4#5#6
-  {
-    \__chk_if_exist_cs:c { #5    : #6 TF }
-    #2 { #3    : #4 TF } { #5    : #6 TF }
-  }
+  { #2 { #3    : #4 TF }    { #5    : #6 TF } }
+\__debug_patch:nnNNpn
+  { \__debug_chk_cs_exist:c { #5    : #6 T  } } { }
 \cs_set:Npn \__prg_set_eq_conditional_T_form:wNnnnn #1 \q_stop #2#3#4#5#6
-  {
-    \__chk_if_exist_cs:c { #5    : #6 T  }
-    #2 { #3    : #4 T  } { #5    : #6 T  }
-  }
+  { #2 { #3    : #4 T  }    { #5    : #6 T  } }
+\__debug_patch:nnNNpn
+  { \__debug_chk_cs_exist:c { #5    : #6  F } } { }
 \cs_set:Npn \__prg_set_eq_conditional_F_form:wNnnnn #1 \q_stop #2#3#4#5#6
-  {
-    \__chk_if_exist_cs:c { #5    : #6  F }
-    #2 { #3    : #4  F } { #5    : #6  F }
-  }
+  { #2 { #3    : #4  F }    { #5    : #6  F } }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
@@ -2278,7 +2629,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \subsection{Checking and patching (new) functions}
+% \subsection{Preliminaries for new functions}
 %
 %    We provide two kinds of functions that can be used to define
 %    control sequences. On the one hand we have functions that check
@@ -2338,130 +2689,6 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\debug_log_functions_on:, \debug_log_functions_off:}
-% \begin{macro}[int]{\__debug_log:x, \__debug_suspend_log:, \__debug_resume_log:}
-%   When debugging is not enabled at all (including in the format), the
-%   \cs[index=debug_log_functions_on:]{debug_log_functions_on/off:}
-%   functions simply produce errors, while \cs{__debug_suspend_log:} and
-%   \cs{__debug_resume_log:} do nothing.
-%    \begin{macrocode}
-\cs_set_protected:Npn \debug_log_functions_on:
-  {
-    \__msg_kernel_error:nnx { kernel } { enable-debug }
-      { \token_to_str:N \debug_log_functions_on: }
-  }
-\cs_set_protected:Npn \debug_log_functions_off:
-  {
-    \__msg_kernel_error:nnx { kernel } { enable-debug }
-      { \token_to_str:N \debug_log_functions_off: }
-  }
-\cs_set_protected:Npn \__debug_suspend_log: { }
-\cs_set_protected:Npn \__debug_resume_log: { }
-%    \end{macrocode}
-%   Otherwise, they set up \cs{__debug_log:x},
-%   \cs{__debug_suspend_log:}, and \cs{__debug_resume_log:} to have the
-%   following behaviour.  The function \cs{__debug_log:x} is used to
-%   write some information to the \texttt{log} file in case the
-%   \texttt{log-function} option is active and to otherwise ignore its
-%   argument.  Using this function rather than directly using
-%   \cs{iow_log:x} allows for \cs{__debug_suspend_log:} which disables
-%   such messages until the matching \cs{__debug_resume_log:}.  These
-%   two commands are used to improve the logging for datatypes with
-%   multiple parts (currently only coffins).  They should come in pairs,
-%   which can be nested.  The function \cs{exp_not:o} is defined in
-%   \pkg{l3expan} later on but \cs{__debug_suspend_log:} and
-%   \cs{__debug_resume_log:} are not used before that point.  Once
-%   everything is defined, turn logging on or off depending on what
-%   option was given.
-%    \begin{macrocode}
-%<*package>
-\tex_ifodd:D \l at expl@enable at debug@bool
-  \cs_set_protected:Npn \debug_log_functions_on:
-    {
-      \cs_set_protected:Npn \__debug_log:x { \iow_log:x }
-      \cs_set_protected:Npn \__debug_suspend_log:
-        {
-          \cs_set_protected:Npx \__debug_resume_log:
-            {
-              \cs_set_protected:Npn \__debug_resume_log:
-                { \exp_not:o { \__debug_resume_log: } }
-              \cs_set_protected:Npn \__debug_log:x
-                { \exp_not:o { \__debug_log:x } }
-            }
-          \cs_set_protected:Npn \__debug_log:x { \use_none:n }
-        }
-      \cs_set_protected:Npn \__debug_resume_log: { }
-    }
-  \cs_set_protected:Npn \debug_log_functions_off:
-    {
-      \cs_set_protected:Npn \__debug_log:x { \use_none:n }
-      \cs_set_protected:Npn \__debug_suspend_log: { }
-      \cs_set_protected:Npn \__debug_resume_log: { }
-    }
-  \tex_ifodd:D \l at expl@log at functions@bool
-    \debug_log_functions_on:
-  \else:
-    \debug_log_functions_off:
-  \fi:
-\fi:
-%</package>
-%    \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}[int]{\__debug_patch:nnNw}
-% \begin{macro}[aux]
-%   {
-%     \__debug_patch_param:NNnnNnp,
-%     \__debug_patch_new:nnNNnn,
-%     \__debug_patch_new_conditional:nnNNnnn
-%   }
-%   When debugging is not enabled, \cs{__debug_patch:nnNw} throws the
-%   patch away.  Otherwise it can be followed by \cs{cs_new:Npn} or
-%   \cs{prg_new_conditional:Npnn} or their protected counterparts.  In
-%   each case, grab the name of the function to be defined and its
-%   parameters using \cs{__debug_patch_param:w} then insert tokens
-%   before and after the definition.  Of course for a conditional one
-%   should likely not insert anything after the code.
-%    \begin{macrocode}
-\cs_set_protected:Npn \__debug_patch:nnNw #1#2 { }
-%<*package>
-\tex_ifodd:D \l at expl@enable at debug@bool
-  \cs_set_protected:Npn \__debug_patch:nnNw #1#2#3
-    {
-      \tex_ifcase:D
-        \if_meaning:w #3 \cs_new_protected:Npn  1~ \fi:
-        \if_meaning:w #3 \cs_new:Npn            1~ \fi:
-        \if_meaning:w #3 \cs_set_protected:Npn  1~ \fi:
-        \if_meaning:w #3 \cs_set:Npn            1~ \fi:
-        \if_meaning:w #3 \cs_gset_protected:Npn 1~ \fi:
-        \if_meaning:w #3 \cs_gset:Npn           1~ \fi:
-        \if_meaning:w #3 \prg_new_protected_conditional:Npnn 2~ \fi:
-        \if_meaning:w #3 \prg_new_conditional:Npnn           2~ \fi:
-        \__msg_kernel_error:nnx { kernel } { debug-unpatchable }
-          { \token_to_str:N #3 }
-      \or:
-        \exp_after:wN \__debug_patch_param:NNnnNnp
-        \exp_after:wN \__debug_patch_new:nnNNnn
-      \else:
-        \exp_after:wN \__debug_patch_param:NNnnNnp
-        \exp_after:wN \__debug_patch_new_conditional:nnNNnnn
-      \fi:
-      \use_none:nn {#1} {#2} #3
-    }
-  \cs_set_protected:Npn \__debug_patch_param:NNnnNnp #1#2#3#4#5#6#7#
-    { #1 {#3} {#4} #5 #6 {#7} }
-  \cs_set_protected:Npn \__debug_patch_new:nnNNnn #1#2#3#4#5#6
-    { #3 #4 #5 { #1 #6 #2 } }
-  \cs_set_protected:Npn \__debug_patch_new_conditional:nnNNnnn
-      #1#2#3#4#5#6#7
-    { #3 #4 #5 {#6} { #1 #7 #2 } }
-\fi:
-%</package>
-%    \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
 % \begin{macro}[int]{\__chk_if_free_cs:N, \__chk_if_free_cs:c}
 %   This command is called by \cs{cs_new_nopar:Npn} and \cs{cs_new_eq:NN}
 %   \emph{etc.}\
@@ -2471,7 +2698,7 @@
 %   issued. We have to make sure we don't put the argument into the
 %   conditional processing since it may be an |\if...| type function!
 %    \begin{macrocode}
-\__debug_patch:nnNw { }
+\__debug_patch:nnNNpn { }
   { \__debug_log:x { Defining~\token_to_str:N #1~ \msg_line_context: } }
 \cs_set_protected:Npn \__chk_if_free_cs:N #1
   {
@@ -2486,66 +2713,6 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\debug_check_declarations_on:, \debug_check_declarations_off:}
-% \begin{macro}[int]{\__chk_if_exist_var:N}
-%   When debugging is not active these two user functions produce an
-%   error.  Otherwise they set up \cs{__chk_if_exist_var:N}, a function
-%   which when \texttt{check-declarations} is active tests that a given
-%   variable is defined.
-%    \begin{macrocode}
-\cs_set_protected:Npn \debug_check_declarations_on:
-  {
-    \__msg_kernel_error:nnx { kernel } { enable-debug }
-      { \token_to_str:N \debug_check_declarations_on: }
-  }
-\cs_set_protected:Npn \debug_check_declarations_off:
-  {
-    \__msg_kernel_error:nnx { kernel } { enable-debug }
-      { \token_to_str:N \debug_check_declarations_off: }
-  }
-%<*package>
-\tex_ifodd:D \l at expl@enable at debug@bool
-  \cs_set_protected:Npn \debug_check_declarations_on:
-    {
-      \cs_set_protected:Npn \__chk_if_exist_var:N ##1
-        {
-          \cs_if_exist:NF ##1
-            {
-              \__msg_kernel_error:nnx { check } { non-declared-variable }
-                { \token_to_str:N ##1 }
-            }
-        }
-    }
-  \cs_set_protected:Npn \debug_check_declarations_off:
-    { \cs_set_protected:Npn \__chk_if_exist_var:N ##1 { } }
-  \tex_ifodd:D \l at expl@check at declarations@bool
-    \debug_check_declarations_on:
-  \else:
-    \debug_check_declarations_off:
-  \fi:
-\fi:
-%</package>
-%    \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}[int]{\__chk_if_exist_cs:N, \__chk_if_exist_cs:c}
-%    This function issues an error message when the control sequence
-%    in its argument does not exist.
-%    \begin{macrocode}
-\cs_set_protected:Npn \__chk_if_exist_cs:N #1
-  {
-    \cs_if_exist:NF #1
-      {
-        \__msg_kernel_error:nnx { kernel } { command-not-defined }
-          { \token_to_str:N #1 }
-      }
-  }
-\cs_set_protected:Npn \__chk_if_exist_cs:c
-  { \exp_args:Nc \__chk_if_exist_cs:N }
-%    \end{macrocode}
-% \end{macro}
-%
 % \subsection{Defining new functions}
 %
 % \begin{macro}
@@ -2745,7 +2912,7 @@
     \exp_args:Nx \__cs_parm_from_arg_count_test:nnF
       {
         \exp_after:wN \exp_not:n
-        \if_case:w \__int_eval:w #2 \__int_eval_end:
+        \if_case:w \__int_eval:w (#2) \__int_eval_end:
              { }
         \or: { ##1 }
         \or: { ##1##2 }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -138,7 +138,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %
@@ -536,22 +536,22 @@
 %   \meta{dimexpr} and then stores the result inside the \meta{box}.
 % \end{function}
 %
-% \begin{function}[updated = 2017-04-058]
-%  {
-%    \vbox_set:Nw, \vbox_set:cw,
-%    \vbox_set_end:,
-%    \vbox_gset:Nw, \vbox_gset:cw,
-%    \vbox_gset_end:
-%  }
-%    \begin{syntax}
-%      \cs{vbox_set:Nw} \meta{box} \meta{contents} \cs{vbox_set_end:}
-%    \end{syntax}
-%    Typesets the \meta{contents} at natural height and then stores the
-%    result inside the \meta{box}. In contrast
-%    to \cs{vbox_set:Nn} this function does not absorb the argument
-%    when finding the \meta{content}, and so can be used in circumstances
-%    where the \meta{content} may not be a simple argument.
-%  \end{function}
+% \begin{function}[updated = 2017-04-05]
+%   {
+%     \vbox_set:Nw, \vbox_set:cw,
+%     \vbox_set_end:,
+%     \vbox_gset:Nw, \vbox_gset:cw,
+%     \vbox_gset_end:
+%   }
+%   \begin{syntax}
+%     \cs{vbox_set:Nw} \meta{box} \meta{contents} \cs{vbox_set_end:}
+%   \end{syntax}
+%   Typesets the \meta{contents} at natural height and then stores the
+%   result inside the \meta{box}. In contrast
+%   to \cs{vbox_set:Nn} this function does not absorb the argument
+%   when finding the \meta{content}, and so can be used in circumstances
+%   where the \meta{content} may not be a simple argument.
+% \end{function}
 %
 % \begin{function}[added = 2017-06-08]
 %   {
@@ -944,13 +944,18 @@
 % \begin{macro}{\box_set_ht:Nn, \box_set_ht:cn}
 % \begin{macro}{\box_set_dp:Nn, \box_set_dp:cn}
 % \begin{macro}{\box_set_wd:Nn, \box_set_wd:cn}
-%   Measuring is easy: all primitive work. These primitives are not
+%   Setting the size is easy: all primitive work. These primitives are not
 %   expandable, so the derived functions are not either.
+%   When debugging, the dimension expression |#2| is surrounded by
+%   parentheses to catch early termination.
 %    \begin{macrocode}
+\__debug_patch_args:nNNpn { {#1} { (#2) } }
 \cs_new_protected:Npn \box_set_dp:Nn #1#2
   { \box_dp:N #1 \__dim_eval:w #2 \__dim_eval_end: }
+\__debug_patch_args:nNNpn { {#1} { (#2) } }
 \cs_new_protected:Npn \box_set_ht:Nn #1#2
   { \box_ht:N #1 \__dim_eval:w #2 \__dim_eval_end: }
+\__debug_patch_args:nNNpn { {#1} { (#2) } }
 \cs_new_protected:Npn \box_set_wd:Nn #1#2
   { \box_wd:N #1 \__dim_eval:w #2 \__dim_eval_end: }
 \cs_generate_variant:Nn \box_set_ht:Nn { c }
@@ -980,13 +985,19 @@
 % \begin{macro}{\box_move_up:nn, \box_move_down:nn}
 % \testfile*
 %   Move box material in different directions.
+%   When debugging, the dimension expression |#1| is surrounded by
+%   parentheses to catch early termination.
 %    \begin{macrocode}
+\__debug_patch_args:nNNpn { { (#1) } {#2} }
 \cs_new_protected:Npn \box_move_left:nn #1#2
   { \tex_moveleft:D \__dim_eval:w #1 \__dim_eval_end: #2 }
+\__debug_patch_args:nNNpn { { (#1) } {#2} }
 \cs_new_protected:Npn \box_move_right:nn #1#2
   { \tex_moveright:D \__dim_eval:w #1 \__dim_eval_end: #2 }
+\__debug_patch_args:nNNpn { { (#1) } {#2} }
 \cs_new_protected:Npn \box_move_up:nn #1#2
   { \tex_raise:D \__dim_eval:w #1 \__dim_eval_end: #2 }
+\__debug_patch_args:nNNpn { { (#1) } {#2} }
 \cs_new_protected:Npn \box_move_down:nn #1#2
   { \tex_lower:D \__dim_eval:w #1 \__dim_eval_end: #2 }
 %    \end{macrocode}
@@ -1183,7 +1194,9 @@
 % \begin{macro}{\hbox_gset_to_wd:Nnn, \hbox_gset_to_wd:cnn}
 % \testfile*
 %   Storing material in a horizontal box with a specified width.
+%   Again, put the dimension expression in parentheses when debugging.
 %    \begin{macrocode}
+\__debug_patch_args:nNNpn { {#1} { (#2) } {#3} }
 \cs_new_protected:Npn \hbox_set_to_wd:Nnn #1#2#3
   {
     \tex_setbox:D #1 \tex_hbox:D to \__dim_eval:w #2 \__dim_eval_end:
@@ -1229,6 +1242,7 @@
 % \begin{macro}{\hbox_gset_to_wd:Nnw, \hbox_gset_to_wd:cnw}
 %   Combining the above ideas.
 %    \begin{macrocode}
+\__debug_patch_args:nNNpn { {#1} { (#2) } }
 \cs_new_protected:Npn \hbox_set_to_wd:Nnw #1#2
   {
     \tex_setbox:D #1 \tex_hbox:D to \__dim_eval:w #2 \__dim_eval_end:
@@ -1248,6 +1262,7 @@
 %  \testfile*
 %   Put a horizontal box directly into the input stream.
 %    \begin{macrocode}
+\__debug_patch_args:nNNpn { { (#1) } {#2} }
 \cs_new_protected:Npn \hbox_to_wd:nn #1#2
    {
      \tex_hbox:D to \__dim_eval:w #1 \__dim_eval_end:
@@ -1308,6 +1323,7 @@
 % \testfile*
 %   Put a vertical box directly into the input stream.
 %    \begin{macrocode}
+\__debug_patch_args:nNNpn { { (#1) } {#2} }
 \cs_new_protected:Npn \vbox_to_ht:nn #1#2
   {
     \tex_vbox:D to \__dim_eval:w #1 \__dim_eval_end:
@@ -1363,6 +1379,7 @@
 %  \testfile*
 %  Storing material in a vertical box with a specified height.
 %    \begin{macrocode}
+\__debug_patch_args:nNNpn { {#1} { (#2) } {#3} }
 \cs_new_protected:Npn \vbox_set_to_ht:Nnn #1#2#3
   {
     \tex_setbox:D #1 \tex_vbox:D to \__dim_eval:w #2 \__dim_eval_end:
@@ -1409,6 +1426,7 @@
 % \begin{macro}{\vbox_gset_to_ht:Nnw, \vbox_gset_to_ht:cnw}
 %   A combination of the above ideas.
 %    \begin{macrocode}
+\__debug_patch_args:nNNpn { {#1} { (#2) } }
 \cs_new_protected:Npn \vbox_set_to_ht:Nnw #1#2
   {
     \tex_setbox:D #1 \tex_vbox:D to \__dim_eval:w #2 \__dim_eval_end:
@@ -1440,6 +1458,7 @@
 % \testfile*
 %   Splitting a vertical box in two.
 %    \begin{macrocode}
+\__debug_patch_args:nNNpn { {#1} {#2} { (#3) } }
 \cs_new_protected:Npn \vbox_set_split_to_ht:NNn #1#2#3
   { \tex_setbox:D #1 \tex_vsplit:D #2 to \__dim_eval:w #3 \__dim_eval_end: }
 %    \end{macrocode}
@@ -1984,8 +2003,14 @@
 %
 % \begin{macro}[deprecated = 2018-12-31]{\box_resize:Nnn, \box_resize:cnn}
 %    \begin{macrocode}
-\cs_new_eq:NN \box_resize:Nnn \box_resize_to_wd_and_ht_plus_dp:Nnn
-\cs_new_eq:NN \box_resize:cnn \box_resize_to_wd_and_ht_plus_dp:cnn
+\__debug_deprecation:nnNNpn
+  { 2018-12-31 } { \box_resize_to_wd_and_ht_plus_dp:Nnn }
+\cs_new_protected:Npn \box_resize:Nnn
+  { \box_resize_to_wd_and_ht_plus_dp:Nnn }
+\__debug_deprecation:nnNNpn
+  { 2018-12-31 } { \box_resize_to_wd_and_ht_plus_dp:cnn }
+\cs_new_protected:Npn \box_resize:cnn
+  { \box_resize_to_wd_and_ht_plus_dp:cnn }
 %    \end{macrocode}
 % \end{macro}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %
@@ -84,33 +84,27 @@
 %
 % \section{Additions to \pkg{l3basics}}
 %
-% \begin{function}[added = 2017-07-14]
-%   {\debug_check_declarations_on:, \debug_check_declarations_off:}
+% \begin{function}[added = 2017-07-16]{\debug_on:n, \debug_off:n}
 %   \begin{syntax}
-%     \cs{debug_check_declarations_on:}
-%     \cs{debug_check_declarations_off:}
+%     \cs{debug_on:n} |{| \meta{comma-separated list} |}|
+%     \cs{debug_off:n} |{| \meta{comma-separated list} |}|
 %   \end{syntax}
-%   Turn on and off within a group the code that checks that all
-%   \pkg{expl3} variables used were previously declared, as done
-%   globally by the \texttt{check-declarations} option.  This can only
-%   be used if \pkg{expl3} is loaded with one of the options
-%   \texttt{check-declarations}, \texttt{log-functions}, or
-%   \texttt{enable-debug}.
+%   Turn on and off within a group various debugging code, some of which
+%   is also available as \pkg{expl3} load-time options.  The items that
+%   can be used in the \meta{list} are
+%   \begin{itemize}
+%     \item \texttt{check-declarations} that checks all \pkg{expl3}
+%       variables used were previously declared;
+%     \item \texttt{deprecation} that makes soon-to-be-deprecated commands produce errors;
+%     \item \texttt{log-functions} that logs function definitions;
+%   \end{itemize}
+%   Providing these as switches rather than options allows testing code
+%   even if it relies on other packages: load all other packages, call
+%   \cs{debug_on:n}, and load the code that one is interested in
+%   testing.  These functions can only be used in \LaTeXe{} package mode
+%   loaded with \texttt{enable-debug} or another option implying it.
 % \end{function}
 %
-% \begin{function}[added = 2017-07-14]
-%   {\debug_log_functions_on:, \debug_log_functions_off:}
-%   \begin{syntax}
-%     \cs{debug_log_functions_on:}
-%     \cs{debug_log_functions_off:}
-%   \end{syntax}
-%   Turn on and off within a group the code that logs function
-%   definitions, as done globally by the \texttt{log-functions} option.
-%   This can only be used if \pkg{expl3} is loaded with one of the
-%   options \texttt{check-declarations}, \texttt{log-functions}, or
-%   \texttt{enable-debug}.
-% \end{function}
-%
 % \begin{function}[added = 2017-07-04]{\mode_leave_vertical:}
 %   \begin{syntax}
 %     \cs{mode_leave_vertical:}
@@ -273,16 +267,17 @@
 %   \end{texnote}
 % \end{function}
 %
-% \begin{function}[TF, added = 2014-07-02]{\file_if_exist_input:n}
+% \begin{function}[added = 2014-07-02]{\file_if_exist_input:n, \file_if_exist_input:nF}
 %   \begin{syntax}
 %     \cs{file_if_exist_input:n} \Arg{file name}
-%     \cs{file_if_exist_input:nTF} \Arg{file name} \Arg{true code} \Arg{false code}
+%     \cs{file_if_exist_input:nF} \Arg{file name} \Arg{false code}
 %   \end{syntax}
 %   Searches for \meta{file name} using the current \TeX{} search
 %   path and the additional paths controlled by
-%   \cs{file_path_include:n}. If found, inserts the \meta{true code} then
+%   \cs{file_path_include:n}. If found then
 %   reads in the file as additional \LaTeX{} source as described for
-%   \cs{file_input:n}. Note that \cs{file_if_exist_input:n} does not raise
+%   \cs{file_input:n}, otherwise inserts the \meta{false code}.
+%   Note that these functions do not raise
 %   an error if the file is not found, in contrast to \cs{file_input:n}.
 % \end{function}
 %
@@ -855,33 +850,35 @@
 %   \end{texnote}
 % \end{function}
 %
-% \begin{function}[EXP, added = 2017-02-17]
-%   {\tl_range:Nnn, \tl_range:cnn, \tl_range:nnn}
+% \begin{function}[EXP, added = 2017-02-17, updated = 2017-07-15]{\tl_range:nnn}
 %   \begin{syntax}
 %     \cs{tl_range:Nnn} \meta{tl~var} \Arg{start index} \Arg{end index}
 %     \cs{tl_range:nnn} \Arg{token list} \Arg{start index} \Arg{end index}
 %   \end{syntax}
 %   Leaves in the input stream the items from the \meta{start index} to the
-%   \meta{end index} inclusive.  Positive \meta{indices} are counted
+%   \meta{end index} inclusive.  Spaces and braces are preserved between
+%   the items returned (but never at either end of the list).  Positive
+%   \meta{indices} are counted
 %   from the start of the \meta{token list}, $1$~being the first item, and
 %   negative \meta{indices} are counted from the end of the token list,
 %   $-1$~being the last item.  If either of \meta{start index} or
 %   \meta{end index} is~$0$, the result is empty.  For instance,
 %   \begin{verbatim}
-%     \iow_term:x { \tl_range:nnn { abcdef } { 2 } { 5 } }
-%     \iow_term:x { \tl_range:nnn { abcdef } { -4 } { -1 } }
-%     \iow_term:x { \tl_range:nnn { abcdef } { -2 } { -1 } }
-%     \iow_term:x { \tl_range:nnn { abcdef } { 0 } { -1 } }
+%     \iow_term:x { \tl_range:nnn { abcd~{e{}}f } { 2 } { 5 } }
+%     \iow_term:x { \tl_range:nnn { abcd~{e{}}f } { -4 } { -1 } }
+%     \iow_term:x { \tl_range:nnn { abcd~{e{}}f } { -2 } { -1 } }
+%     \iow_term:x { \tl_range:nnn { abcd~{e{}}f } { 0 } { -1 } }
 %   \end{verbatim}
-%   prints \texttt{{b}{c}{d}{e}}, \texttt{{c}{d}{e}{f}}, \texttt{{e}{f}}, and an empty
+%   prints \verb*|bcd {e{}}|, \verb*|cd {e{}}f|, \verb*|{e{}}f| and an empty
 %   line to the terminal. The \meta{start index} must always be smaller than
 %   or equal to the \meta{end index}: if this is not the case then no output
 %   is generated. Thus
 %   \begin{verbatim}
-%     \iow_term:x { \tl_range:nnn { abcdef } { 5 } { 2 } }
-%     \iow_term:x { \tl_range:nnn { abcdef } { -1 } { -4 } }
+%     \iow_term:x { \tl_range:nnn { abcd~{e{}}f } { 5 } { 2 } }
+%     \iow_term:x { \tl_range:nnn { abcd~{e{}}f } { -1 } { -4 } }
 %   \end{verbatim}
-%   both yield empty token lists.
+%   both yield empty token lists.  For improved performance, see
+%   \cs{tl_range_braced:nnn} and \cs{tl_range_unbraced:nnn}.
 %   \begin{texnote}
 %     The result is returned within the \tn{unexpanded}
 %     primitive (\cs{exp_not:n}), which means that the \meta{item}
@@ -890,8 +887,54 @@
 %   \end{texnote}
 % \end{function}
 %
-% \section{Additions to \pkg{l3tokens}}
+% \begin{function}[EXP, added = 2017-07-15]
+%   {
+%     \tl_range_braced:Nnn, \tl_range_braced:cnn, \tl_range_braced:nnn,
+%     \tl_range_unbraced:Nnn, \tl_range_unbraced:cnn, \tl_range_unbraced:nnn
+%   }
+%   \begin{syntax}
+%     \cs{tl_range_braced:Nnn} \meta{tl~var} \Arg{start index} \Arg{end index}
+%     \cs{tl_range_braced:nnn} \Arg{token list} \Arg{start index} \Arg{end index}
+%     \cs{tl_range_unbraced:Nnn} \meta{tl~var} \Arg{start index} \Arg{end index}
+%     \cs{tl_range_unbraced:nnn} \Arg{token list} \Arg{start index} \Arg{end index}
+%   \end{syntax}
+%   Leaves in the input stream the items from the \meta{start index} to
+%   the \meta{end index} inclusive, using the same indexing as
+%   \cs{tl_range:nnn}.  Spaces are ignored.  Regardless of whether items
+%   appear with or without braces in the \meta{token list}, the
+%   \cs{tl_range_braced:nnn} function wraps each item in braces, while
+%   \cs{tl_range_unbraced:nnn} does not (overall it removes an outer set
+%   of braces).  For instance,
+%   \begin{verbatim}
+%     \iow_term:x { \tl_range_braced:nnn { abcd~{e{}}f } { 2 } { 5 } }
+%     \iow_term:x { \tl_range_braced:nnn { abcd~{e{}}f } { -4 } { -1 } }
+%     \iow_term:x { \tl_range_braced:nnn { abcd~{e{}}f } { -2 } { -1 } }
+%     \iow_term:x { \tl_range_braced:nnn { abcd~{e{}}f } { 0 } { -1 } }
+%   \end{verbatim}
+%   prints \verb*|{b}{c}{d}{e{}}|, \verb*|{c}{d}{e{}}{f}|, \verb*|{e{}}{f}|, and an empty
+%   line to the terminal, while
+%   \begin{verbatim}
+%     \iow_term:x { \tl_range_unbraced:nnn { abcd~{e{}}f } { 2 } { 5 } }
+%     \iow_term:x { \tl_range_unbraced:nnn { abcd~{e{}}f } { -4 } { -1 } }
+%     \iow_term:x { \tl_range_unbraced:nnn { abcd~{e{}}f } { -2 } { -1 } }
+%     \iow_term:x { \tl_range_unbraced:nnn { abcd~{e{}}f } { 0 } { -1 } }
+%   \end{verbatim}
+%   prints \verb*|bcde{}|, \verb*|cde{}f|, \verb*|e{}f|, and an empty
+%   line to the terminal.  Because braces are removed, the result of
+%   \cs{tl_range_unbraced:nnn} may have a different number of items as
+%   for \cs{tl_range:nnn} or \cs{tl_range_braced:nnn}.  In cases where
+%   preserving spaces is important, consider the slower function
+%   \cs{tl_range:nnn}.
+%   \begin{texnote}
+%     The result is returned within the \tn{unexpanded}
+%     primitive (\cs{exp_not:n}), which means that the \meta{item}
+%     does not expand further when appearing in an \texttt{x}-type
+%     argument expansion.
+%   \end{texnote}
+% \end{function}
 %
+% \section{Additions to \pkg{l3token}}
+%
 % \begin{function}[TF, updated = 2012-12-20]{\peek_N_type:}
 %   \begin{syntax}
 %     \cs{peek_N_type:TF} \Arg{true code} \Arg{false code}
@@ -973,6 +1016,7 @@
 %   Trimming from the left- and right-hand edges of the box is easy: kern the
 %   appropriate parts off each side.
 %    \begin{macrocode}
+\__debug_patch_args:nNNpn { {#1} { (#2) } {#3} { (#4) } {#5} }
 \cs_new_protected:Npn \box_trim:Nnnnn #1#2#3#4#5
   {
     \hbox_set:Nn \l_@@_internal_box
@@ -1002,7 +1046,7 @@
       {
         \hbox_set:Nn \l_@@_internal_box
           {
-            \box_move_down:nn { #3 - \box_dp:N #1 }
+            \box_move_down:nn { (#3) - \box_dp:N #1 }
               { \box_use:N \l_@@_internal_box }
           }
         \box_set_dp:Nn \l_@@_internal_box \c_zero_dim
@@ -1023,7 +1067,7 @@
       {
         \hbox_set:Nn \l_@@_internal_box
           {
-            \box_move_up:nn { #5 - \box_ht:N \l_@@_internal_box }
+            \box_move_up:nn { (#5) - \box_ht:N \l_@@_internal_box }
               { \box_use:N \l_@@_internal_box }
           }
         \box_set_ht:Nn \l_@@_internal_box \c_zero_dim
@@ -1039,6 +1083,7 @@
 %   dimensions. As a result, there are some things to watch out for in the
 %   vertical direction.
 %    \begin{macrocode}
+\__debug_patch_args:nNNpn { {#1} { (#2) } {#3} { (#4) } {#5} }
 \cs_new_protected:Npn \box_viewport:Nnnnn #1#2#3#4#5
   {
     \hbox_set:Nn \l_@@_internal_box
@@ -1070,7 +1115,7 @@
           }
         \box_set_ht:Nn \l_@@_internal_box
           {
-            #5
+            (#5)
             \dim_compare:nNnT {#3} > \c_zero_dim
               { - (#3) }
           }
@@ -1574,7 +1619,7 @@
   {
     \prop_put:cnx { l_@@_poles_ \__int_value:w #1 _prop } {#2}
       {
-        { \dim_eval:n #3 + \box_wd:N #1 } {#4}
+        { \dim_eval:n { #3 + \box_wd:N #1 } } {#4}
         {#5} {#6}
       }
   }
@@ -1660,9 +1705,10 @@
 % \end{macro}
 % \end{macro}
 %
-% \begin{macro}[TF]{\file_if_exist_input:n}
-%   Input of a file with a test for existence cannot be done the usual
-%   way as the tokens to insert are in an odd place.
+% \begin{macro}{\file_if_exist_input:n, \file_if_exist_input:nF}
+%   Input of a file with a test for existence.  We do not define the |T|
+%   or |TF| variants because the most useful place to place the
+%   \meta{true code} would be inconsistent with other conditionals.
 %    \begin{macrocode}
 \cs_new_protected:Npn \file_if_exist_input:n #1
   {
@@ -1670,15 +1716,6 @@
     \str_if_empty:NF \l__file_full_name_str
       { \@@_input:V \l__file_full_name_str }
   }
-\cs_new_protected:Npn \file_if_exist_input:nT #1#2
-  {
-    \file_get_full_name:nN {#1} \l__file_full_name_str
-    \str_if_empty:NF \l__file_full_name_str
-      {
-        #2
-        \@@_input:V \l__file_full_name_str
-      }
-  }
 \cs_new_protected:Npn \file_if_exist_input:nF #1#2
   {
     \file_get_full_name:nN {#1} \l__file_full_name_str
@@ -1686,16 +1723,28 @@
       {#2}
       { \@@_input:V \l__file_full_name_str }
   }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[deprecated = 2017-12-31]{\file_if_exist_input:nT, \file_if_exist_input:nTF}
+%   For removal after 2017-12-31.
+%    \begin{macrocode}
+\__debug_deprecation:nnNNpn { 2017-12-31 }
+  { \file_if_exist:nTF and~ \file_input:n }
 \cs_new_protected:Npn \file_if_exist_input:nTF #1#2#3
   {
     \file_get_full_name:nN {#1} \l__file_full_name_str
     \str_if_empty:NTF \l__file_full_name_str
-      {#3}
-      {
-        #2
-        \@@_input:V \l__file_full_name_str
-      }
+      {#3} { #2 \@@_input:V \l__file_full_name_str }
   }
+\__debug_deprecation:nnNNpn { 2017-12-31 }
+  { \file_if_exist:nT and~ \file_input:n }
+\cs_new_protected:Npn \file_if_exist_input:nT #1#2
+  {
+    \file_get_full_name:nN {#1} \l__file_full_name_str
+    \str_if_empty:NF \l__file_full_name_str
+      { #2 \@@_input:V \l__file_full_name_str }
+  }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -1733,6 +1782,7 @@
 %    \begin{macrocode}
 \cs_if_exist:NTF \pdftex_uniformdeviate:D
   {
+    \__debug_patch_args:nNNpn { { (#1) } { (#2) } }
     \cs_new:Npn \int_rand:nn #1#2
       {
         \exp_after:wN \@@_rand:ww
@@ -2107,6 +2157,7 @@
 % \begin{macro}{\sys_gset_rand_seed:n}
 %   The primitive always assigns the seed globally.
 %    \begin{macrocode}
+\__debug_patch_args:nNNpn { { (#1) } }
 \cs_new_protected:Npn \sys_gset_rand_seed:n #1
   { \pdftex_setrandomseed:D \__int_eval:w #1 \__int_eval_end: }
 %    \end{macrocode}
@@ -3825,37 +3876,68 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% Some preliminary code is needed for the \cs{tl_range:nnn} family of functions.
+%
 % \begin{macro}{\tl_range:Nnn, \tl_range:cnn, \tl_range:nnn}
+% \begin{macro}{\tl_range_braced:Nnn, \tl_range_braced:cnn, \tl_range_braced:nnn}
+% \begin{macro}
+%   {\tl_range_unbraced:Nnn, \tl_range_unbraced:cnn, \tl_range_unbraced:nnn}
 % \begin{macro}[aux]
-%   {\@@_range:nnnw, \@@_range:nnw, \@@_range_normalize:nn, \@@_range_collect:w, \@@_range_skip:w}
+%   {
+%     \@@_range:Nnnn, \@@_range:nnnNn, \@@_range:nnNn, \@@_range_skip:w,
+%     \@@_range_braced:w, \@@_range_collect_braced:w,
+%     \@@_range_unbraced:w, \@@_range_collect_unbraced:w,
+%     \@@_range:w, \@@_range_skip_spaces:n, \@@_range_collect:nn,
+%     \@@_range_collect:ff, \@@_range_collect_space:nw,
+%     \@@_range_collect_N:nN, \@@_range_collect_group:nN,
+%   }
 %   To avoid checking for the end of the token list at every step, start
 %   by counting the number $l$ of items and \enquote{normalizing} the
 %   bounds, namely clamping them to the interval $[0,l]$ and dealing
-%   with negative indices.  More precisely, \cs{@@_range:nnw} receives
-%   the number of items to skip at the beginning of the token list, and
-%   the index of the last item to keep.  If nothing should be kept,
-%   leave |{}|: this stops the \texttt{f}-expansion of \cs{tl_head:f}
-%   and that function produces an empty result.  Otherwise, repeatedly
-%   call \cs{@@_range_skip:w} to delete |#1| items from the input stream
-%   (the extra brace group avoids an off-by-one mistake), then
-%   repeatedly call \cs{@@_range_collect:w} to store in its second
-%   argument the items to be kept.  Eventually, the result is a brace
-%   group followed by the rest of the token list, and \cs{tl_head:f}
-%   cleans up and gives the result in \cs{exp_not:n}.
+%   with negative indices.  More precisely, \cs{@@_range_items:nnNn}
+%   receives the number of items to skip at the beginning of the token
+%   list, the index of the last item to keep, a function among
+%   \cs{@@_range:w}, \cs{@@_range_braced:w}, \cs{@@_range_unbraced:w},
+%   and the token list itself.  If nothing should be kept, leave |{}|:
+%   this stops the \texttt{f}-expansion of \cs{tl_head:f} and that
+%   function produces an empty result.  Otherwise, repeatedly call
+%   \cs{@@_range_skip:w} to delete |#1| items from the input stream (the
+%   extra brace group avoids an off-by-one shift).  For the braced
+%   version \cs{@@_range_braced:w} sets up
+%   \cs{@@_range_collect_braced:w} which stores items one by one in an
+%   argument after the semicolon.  The unbraced version is almost
+%   identical.  The version preserving braces and spaces starts by
+%   deleting spaces before the argument to avoid collecting them, and
+%   sets up \cs{@@_range_collect:nn} with a first argument of the form
+%   |{| \Arg{collected} \meta{tokens} |}|, whose head is the collected
+%   tokens and whose tail is what remains of the original token list.
+%   This form makes it easier to move tokens to the \meta{collected}
+%   tokens.  Depending on the first token of the tail, either just move
+%   it (if it is a space) or also decrement the number of items left to
+%   find.  Eventually, the result is a brace group followed by the rest
+%   of the token list, and \cs{tl_head:f} cleans up and gives the result
+%   in \cs{exp_not:n}.
 %    \begin{macrocode}
 \cs_new:Npn \tl_range:Nnn { \exp_args:No \tl_range:nnn }
 \cs_generate_variant:Nn \tl_range:Nnn { c }
-\cs_new:Npn \tl_range:nnn #1#2#3
+\cs_new:Npn \tl_range:nnn { \@@_range:Nnnn \@@_range:w }
+\cs_new:Npn \tl_range_braced:Nnn { \exp_args:No \tl_range_braced:nnn }
+\cs_generate_variant:Nn \tl_range_braced:Nnn { c }
+\cs_new:Npn \tl_range_braced:nnn { \@@_range:Nnnn \@@_range_braced:w }
+\cs_new:Npn \tl_range_unbraced:Nnn { \exp_args:No \tl_range_unbraced:nnn }
+\cs_generate_variant:Nn \tl_range_unbraced:Nnn { c }
+\cs_new:Npn \tl_range_unbraced:nnn { \@@_range:Nnnn \@@_range_unbraced:w }
+\cs_new:Npn \@@_range:Nnnn #1#2#3#4
   {
     \tl_head:f
       {
-        \exp_args:Nf \@@_range:nnnw { \tl_count:n {#1} } {#2} {#3}
-        #1
+        \exp_args:Nf \@@_range:nnnNn
+          { \tl_count:n {#2} } {#3} {#4} #1 {#2}
       }
   }
-\cs_new:Npn \@@_range:nnnw #1#2#3
+\cs_new:Npn \@@_range:nnnNn #1#2#3
   {
-    \exp_args:Nff \@@_range:nnw
+    \exp_args:Nff \@@_range:nnNn
       {
         \exp_args:Nf \@@_range_normalize:nn
           { \int_eval:n { #2 - 1 } } {#1}
@@ -3865,15 +3947,14 @@
           { \int_eval:n {#3} } {#1}
       }
   }
-\cs_new:Npn \@@_range:nnw #1#2
+\cs_new:Npn \@@_range:nnNn #1#2#3#4
   {
     \if_int_compare:w #2 > #1 \exp_stop_f: \else:
       \exp_after:wN { \exp_after:wN }
     \fi:
-    \exp_after:wN \@@_range_collect:w
+    \exp_after:wN #3
     \__int_value:w \__int_eval:w #2 - #1 \exp_after:wN ;
-    \exp_after:wN { \exp_after:wN }
-    \exp:w \@@_range_skip:w #1 ; { }
+    \exp_after:wN { \exp:w \@@_range_skip:w #1 ; { } #4 }
   }
 \cs_new:Npn \@@_range_skip:w #1 ; #2
   {
@@ -3884,17 +3965,70 @@
       \exp_after:wN \exp_end:
     \fi:
   }
-\cs_new:Npn \@@_range_collect:w #1 ; #2#3
+\cs_new:Npn \@@_range_braced:w #1 ; #2
+  { \@@_range_collect_braced:w #1 ; { } #2 }
+\cs_new:Npn \@@_range_unbraced:w #1 ; #2
+  { \@@_range_collect_unbraced:w #1 ; { } #2 }
+\cs_new:Npn \@@_range_collect_braced:w #1 ; #2#3
   {
     \if_int_compare:w #1 > 1 \exp_stop_f:
-      \exp_after:wN \@@_range_collect:w
+      \exp_after:wN \@@_range_collect_braced:w
       \__int_value:w \__int_eval:w #1 - 1 \exp_after:wN ;
     \fi:
     { #2 {#3} }
   }
+\cs_new:Npn \@@_range_collect_unbraced:w #1 ; #2#3
+  {
+    \if_int_compare:w #1 > 1 \exp_stop_f:
+      \exp_after:wN \@@_range_collect_unbraced:w
+      \__int_value:w \__int_eval:w #1 - 1 \exp_after:wN ;
+    \fi:
+    { #2 #3 }
+  }
+\cs_new:Npn \@@_range:w #1 ; #2
+  {
+    \exp_args:Nf \@@_range_collect:nn
+      { \@@_range_skip_spaces:n {#2} } {#1}
+  }
+\cs_new:Npn \@@_range_skip_spaces:n #1
+  {
+    \tl_if_head_is_space:nTF {#1}
+      { \exp_args:Nf \@@_range_skip_spaces:n {#1} }
+      { { } #1 }
+  }
+\cs_new:Npn \@@_range_collect:nn #1#2
+  {
+    \int_compare:nNnTF {#2} = 0
+      {#1}
+      {
+        \exp_args:No \tl_if_head_is_space:nTF { \use_none:n #1 }
+          {
+            \exp_args:Nf \@@_range_collect:nn
+              { \@@_range_collect_space:nw #1 }
+              {#2}
+          }
+          {
+            \@@_range_collect:ff
+              {
+                \exp_args:No \tl_if_head_is_N_type:nTF { \use_none:n #1 }
+                  { \@@_range_collect_N:nN }
+                  { \@@_range_collect_group:nn }
+                #1
+              }
+              { \int_eval:n { #2 - 1 } }
+          }
+      }
+  }
+\cs_new:Npn \@@_range_collect_space:nw #1 ~ { { #1 ~ } }
+\cs_new:Npn \@@_range_collect_N:nN #1#2 { { #1 #2 } }
+\cs_new:Npn \@@_range_collect_group:nn #1#2 { { #1 {#2} } }
+\cs_generate_variant:Nn \@@_range_collect:nn { ff }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
+% \end{macro}
+% \end{macro}
+%
 % \begin{macro}[EXP, aux]{\@@_range_normalize:nn}
 %   This function converts an \meta{index} argument into an explicit
 %   position in the token list (a result of $0$ denoting \enquote{out of
@@ -3924,7 +4058,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \subsection{Additions to \pkg{l3tokens}}
+% \subsection{Additions to \pkg{l3token}}
 %
 %    \begin{macrocode}
 %<@@=peek>

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %
@@ -507,20 +507,38 @@
 %   data structures. These are created globally, as there is a need to
 %   avoid any strange effects if the coffin is created inside a group.
 %   This means that the usual rule about \cs[no-index]{l_\ldots} variables has
-%   to be broken.
+%   to be broken.  The \cs{__debug_suspend_log:} and
+%   \cs{__debug_resume_log:} functions prevent \cs{prop_clear_new:c}
+%   from writing useless information to the log file; however they only
+%   exist if debugging is enabled.
 %    \begin{macrocode}
-\cs_new_protected:Npn \coffin_new:N #1
+\__debug:TF
   {
-    \box_new:N #1
-    \__debug_suspend_log:
-    \prop_clear_new:c { l_@@_corners_ \__int_value:w #1 _prop }
-    \prop_clear_new:c { l_@@_poles_   \__int_value:w #1 _prop }
-    \prop_gset_eq:cN { l_@@_corners_ \__int_value:w #1 _prop }
-      \c_@@_corners_prop
-    \prop_gset_eq:cN { l_@@_poles_ \__int_value:w #1 _prop }
-      \c_@@_poles_prop
-    \__debug_resume_log:
+    \cs_new_protected:Npn \coffin_new:N #1
+      {
+        \box_new:N #1
+        \__debug_suspend_log:
+        \prop_clear_new:c { l_@@_corners_ \__int_value:w #1 _prop }
+        \prop_clear_new:c { l_@@_poles_   \__int_value:w #1 _prop }
+        \prop_gset_eq:cN { l_@@_corners_ \__int_value:w #1 _prop }
+          \c_@@_corners_prop
+        \prop_gset_eq:cN { l_@@_poles_ \__int_value:w #1 _prop }
+          \c_@@_poles_prop
+        \__debug_resume_log:
+      }
   }
+  {
+    \cs_new_protected:Npn \coffin_new:N #1
+      {
+        \box_new:N #1
+        \prop_clear_new:c { l_@@_corners_ \__int_value:w #1 _prop }
+        \prop_clear_new:c { l_@@_poles_   \__int_value:w #1 _prop }
+        \prop_gset_eq:cN { l_@@_corners_ \__int_value:w #1 _prop }
+          \c_@@_corners_prop
+        \prop_gset_eq:cN { l_@@_poles_ \__int_value:w #1 _prop }
+          \c_@@_poles_prop
+      }
+  }
 \cs_generate_variant:Nn \coffin_new:N { c }
 %    \end{macrocode}
 % \end{macro}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3color.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3color.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3color.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %
@@ -52,13 +52,6 @@
 % A few commands have had to be deprecated over the years.  This module
 % defines deprecated and deleted commands to produce an error.
 %
-% \begin{macro}{\deprecation_error:}
-%   \begin{syntax}
-%     \cs{deprecation_error:}
-%   \end{syntax}
-%   Defines commands that will soon become deprecated to produce errors.
-% \end{macro}
-%
 % \end{documentation}
 %
 % \begin{implementation}
@@ -124,45 +117,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\deprecation_error:}
-%   Some commands were more recently deprecated and not yet removed;
-%   only make these into errors if the user requests it.  This allows
-%   testing code even if it relies on other packages: load all other
-%   packages, call \cs{deprecation_error:}, and load the code that one is
-%   interested in testing.
-%
-%   One of the deprecated syntaxes is within floating point expressions;
-%   to keep related code in the same place we define in \pkg{l3fp-parse}
-%   a version of \cs{__fp_parse_round:Nw} producing an error.
 %    \begin{macrocode}
-\cs_new_protected:Npn \deprecation_error:
-  {
-    \@@_error:Nnn \tl_to_lowercase:n { } { 2017-12-31 }
-    \@@_error:Nnn \tl_to_uppercase:n { } { 2017-12-31 }
-    \@@_error:Nnn \ior_get_str:NN { \ior_str_get:NN } { 2017-12-31 }
-    \@@_error:Nnn \box_resize:Nnn { \box_resize_to_wd_and_ht_plus_dp:Nnn } { 2018-12-31 }
-    \@@_error:Nnn \box_resize:cnn { \box_resize_to_wd_and_ht_plus_dp:cnn } { 2018-12-31 }
-    \@@_error:Nnn \c_minus_one { - 1 } { 2018-12-31 }
-    \@@_error:Nnn \sort_ordered: { \sort_return_same: } { 2018-12-31 }
-    \@@_error:Nnn \sort_reversed: { \sort_return_swapped: } { 2018-12-31 }
-    \@@_error:Nnn \g_file_current_name_tl { \g_file_curr_name_str } { 2018-12-31 }
-    \@@_error:Nnn \file_add_path:nN { \file_get_full_name:nN } { 2018-12-31 }
-    \@@_error:Nnn \file_path_include:n
-      { \seq_put_right:Nn \l_file_search_path_seq } { 2018-12-31 }
-    \@@_error:Nnn \file_path_remove:n
-      { \seq_remove_all:Nn \l_file_search_path_seq } { 2018-12-31 }
-    \@@_error:Nnn \file_list: { \file_log_list: } { 2018-12-31 }
-    \@@_error:Nnn \ior_list_streams: { \ior_show_list: } { 2018-12-31 }
-    \@@_error:Nnn \ior_log_streams: { \ior_log_list: } { 2018-12-31 }
-    \@@_error:Nnn \iow_list_streams: { \iow_show_list: } { 2018-12-31 }
-    \@@_error:Nnn \iow_log_streams: { \iow_log_list: } { 2018-12-31 }
-    \cs_set_eq:NN \__fp_parse_round:Nw \__fp_parse_round_deprecation_error:Nw
-    \cs_set_eq:NN \deprecation_error: \scan_stop:
-  }
-%    \end{macrocode}
-% \end{macro}
-%
-%    \begin{macrocode}
 %</initex|package>
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -70,7 +70,7 @@
 % This isn't included in the typeset documentation because it's a bit
 % ugly:
 %<*class>
-\ProvidesExplClass{l3doc}{2017/07/15}{}
+\ProvidesExplClass{l3doc}{2017/07/19}{}
   {L3 Experimental documentation class}
 %</class>
 % \fi
@@ -77,7 +77,7 @@
 %
 % \title{The \cls{l3doc} class}
 % \author{\Team}
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 % \maketitle
 % \tableofcontents
 %
@@ -594,6 +594,15 @@
 %    \end{macrocode}
 % \end{variable}
 %
+% \begin{variable}[int]{\l_@@_in_function_bool}
+%   True when inside a \texttt{function} or \texttt{variable}
+%   environment.  Used by the \texttt{syntax} environment to determine
+%   its behaviour.
+%    \begin{macrocode}
+\bool_new:N \l_@@_in_function_bool
+%    \end{macrocode}
+% \end{variable}
+%
 % \begin{variable}[int]{\l_@@_long_name_bool, \l_@@_trial_width_dim}
 %   The boolean \cs{l_@@_long_name_bool} is \texttt{true} if the width
 %   \cs{l_@@_trial_width_dim} of the coffin \cs{l_@@_functions_coffin}
@@ -1225,6 +1234,16 @@
   { The~deprecated~function(s)~'#1'~should~have~been~removed~on~#2. }
 \msg_new:nnn { l3doc } { date-format }
   { The~date~'#1'~should~be~given~in~YYYY-MM-DD~format. }
+\msg_new:nnn { l3doc } { syntax-nested-function }
+  {
+    The~'syntax'~environment~should~be~used~in~the~
+    innermost~'function'~environment.
+  }
+\msg_new:nnn { l3doc } { multiple-syntax }
+  {
+    The~'syntax'~environment~should~only~be~used~once~in~
+    a~'function'~environment.
+  }
 %    \end{macrocode}
 %
 % \subsection{Options and configuration}
@@ -2146,14 +2165,18 @@
 %    \end{macrocode}
 %
 % \begin{macro}[aux]{\@@_date_set:Nn}
-%   Minimal check that the date is not given in the YYYY/MM/DD format.
-%   Eventually we should check the input more carefully.
+%   Normalize the date into the format \texttt{YYYY-MM-DD}; more
+%   precisely month and day are allowed to be single digits.
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_date_set:Nn #1#2
   {
-    \tl_if_in:nnT {#2} { / }
-      { \msg_error:nnn { l3doc } { date-format } {#2} }
     \tl_set:Nn #1 {#2}
+    \regex_replace_once:nnNF
+      { \A(\d\d\d\d)[-/](\d\d?)[-/](\d\d?)\Z } { \1-\2-\3 } #1
+      {
+        \msg_error:nnn { l3doc } { date-format } {#2}
+        \tl_set:Nn #1 { 1970-01-01 }
+      }
   }
 %    \end{macrocode}
 % \end{macro}
@@ -2167,10 +2190,13 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_deprecated_on:n #1
   {
-    \@@_date_compare:nNnT {#1} < { \tex_year:D - \tex_month:D - \tex_day:D }
+    \@@_date_set:Nn \l_@@_tmpa_tl {#1}
+    \exp_args:No \@@_date_compare:nNnT
+      { \l_@@_tmpa_tl } < { \tex_year:D - \tex_month:D - \tex_day:D }
       {
         \msg_error:nnxx { l3doc } { deprecated-function }
-          { \tl_to_str:N \l_@@_macro_argument_tl } {#1}
+          { \tl_to_str:N \l_@@_macro_argument_tl }
+          { \l_@@_tmpa_tl }
       }
     \bool_set_true:N \l_@@_macro_internal_bool
   }
@@ -2236,33 +2262,42 @@
 % \end{macro}
 %
 % \begin{macro}[aux]{\@@_function_init:}
-%   Allow |<...>| to be used as markup for |\meta{...}|.  Clear various
-%   variables.
+%   Complain if \texttt{function} environments are nested.  Clear
+%   various variables.
 %    \begin{macrocode}
-\group_begin:
-  \char_set_catcode_active:N \<
-  \cs_new_protected:Npn \@@_function_init:
-    {
-      \coffin_clear:N \l_@@_descr_coffin
-      \box_gclear:N \g_@@_syntax_box
-      \coffin_clear:N \l_@@_syntax_coffin
-      \coffin_clear:N \l_@@_functions_coffin
-      \bool_set_false:N \l_@@_macro_TF_bool
-      \bool_set_false:N \l_@@_macro_pTF_bool
-      \bool_set_false:N \l_@@_macro_noTF_bool
-      \bool_set_false:N \l_@@_macro_EXP_bool
-      \bool_set_false:N \l_@@_macro_rEXP_bool
-      \bool_set_false:N \l_@@_no_label_bool
-      \bool_set_false:N \l_@@_names_verb_bool
-      \clist_clear:N \l_@@_function_label_clist
-      \tl_set:Nn \l_@@_override_module_tl { \q_no_value }
-      \char_set_catcode_active:N \<
-      \cs_set_protected_nopar:Npn < ##1 > { \meta {##1} }
+\cs_new_protected:Npn \@@_function_init:
+  {
+    \box_if_empty:NF \g_@@_syntax_box
+      { \msg_error:nn { l3doc } { syntax-nested-function } }
+    \coffin_clear:N \l_@@_descr_coffin
+    \box_gclear:N \g_@@_syntax_box
+    \coffin_clear:N \l_@@_syntax_coffin
+    \coffin_clear:N \l_@@_functions_coffin
+    \bool_set_false:N \l_@@_macro_TF_bool
+    \bool_set_false:N \l_@@_macro_pTF_bool
+    \bool_set_false:N \l_@@_macro_noTF_bool
+    \bool_set_false:N \l_@@_macro_EXP_bool
+    \bool_set_false:N \l_@@_macro_rEXP_bool
+    \bool_set_false:N \l_@@_no_label_bool
+    \bool_set_false:N \l_@@_names_verb_bool
+    \bool_set_true:N \l_@@_in_function_bool
+    \clist_clear:N \l_@@_function_label_clist
+    \tl_set:Nn \l_@@_override_module_tl { \q_no_value }
+    \char_set_active_eq:NN \< \@@_shorthand_meta:
+    \char_set_catcode_active:N \<
   }
-\group_end:
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}[aux]{\@@_shorthand_meta:, \@@_shorthand_meta:w}
+%   Allow |<...>| to be used as markup for |\meta{...}|.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_shorthand_meta:
+  { \mode_if_math:TF { < } { \@@_shorthand_meta:w } }
+\cs_new_protected_nopar:Npn \@@_shorthand_meta:w #1 > { \meta {#1} }
+%    \end{macrocode}
+% \end{macro}
+%
 % \begin{macro}[aux]{\@@_function_reset:}
 %   Clear some variables.
 %    \begin{macrocode}
@@ -2320,7 +2355,7 @@
 \cs_new_protected:Npn \@@_function_assemble:
   {
     \hcoffin_set:Nn  \l_@@_syntax_coffin
-      { \box_use:N \g_@@_syntax_box }
+      { \box_use_clear:N \g_@@_syntax_box }
     \bool_if:NTF \l_@@_long_name_bool
       {
         \coffin_join:NnnNnnnn
@@ -2505,6 +2540,8 @@
 \dim_new:N \l_@@_syntax_dim
 \cs_new_protected:Npn \@@_syntax:w
   {
+    \box_if_empty:NF \g_@@_syntax_box
+      { \msg_error:nn { l3doc } { multiple-syntax } }
     \dim_set:Nn \l_@@_syntax_dim
       {
         \textwidth
@@ -2527,6 +2564,13 @@
       \end{tabular}
       \arrayrulecolor{black}
     \hbox_gset_end:
+    \bool_if:NF \l_@@_in_function_bool
+      {
+        \begin{quote}
+          \mode_leave_vertical:
+          \box_use_clear:N \g_@@_syntax_box
+        \end{quote}
+      }
   }
 %    \end{macrocode}
 % \end{macro}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -61,7 +61,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -45,7 +45,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %
@@ -99,7 +99,7 @@
 %   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 responsibly of
+%   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.
 %
@@ -113,7 +113,7 @@
 %   \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 responsibly of
+%   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.
 %
@@ -569,8 +569,9 @@
           {
             \tl_set:Nx \l__color_current_tl
               {
-                \exp_after:wN \@@_color_pickup_aux:w
-                  \current at color ~ 0 ~ 0 ~ 0 \q_stop
+                \exp_after:wN \exp_after:wN\exp_after:wN
+                  \@@_color_pickup_aux:w \exp_after:wN
+                  \current at color \c_space_tl 0 ~ 0 ~ 0 \q_stop
               }
           }
         \cs_new:Npn \@@_color_pickup_aux:w #1 ~ #2 ~ #3 ~ #4 ~ #5 ~ #6 \q_stop
@@ -636,10 +637,10 @@
   { \use:c { @@_color_convert_ #1 :w } }
 \cs_new:Npn \@@_color_convert_gray:w #1 ~ #2 \q_stop
   { #1 ~ g ~ #1 ~ G }
-\cs_new:Npn \@@_color_convert_cmyk:w #1 ~ #2 ~ #3 ~ #4 \q_stop
+\cs_new:Npn \@@_color_convert_cmyk:w #1 ~ #2 ~ #3 ~ #4 ~#5 \q_stop
+  { #1 ~ #2 ~ #3 ~ #4 ~ k ~ #1 ~ #2 ~ #3 ~ #4 ~ K }
+\cs_new:Npn \@@_color_convert_rgb:w #1 ~ #2 ~ #3 ~ #4 \q_stop
   { #1 ~ #2 ~ #3 ~ rg ~ #1 ~ #2 ~ #3 ~ RG }
-\cs_new:Npn \@@_color_convert_rgb:w #1 ~ #2 ~ #3 ~ #4 ~ #5 \q_stop
-  { #1 ~ #2 ~ #3 ~ #4 ~ k ~ #1 ~ #2 ~ #3 ~ #4 ~ K }
 \cs_new_protected:Npx \@@_color_reset:
   {
     \cs_if_exist:NTF \luatex_pdfextension:D

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %
@@ -102,10 +102,23 @@
 % \section{Methods for defining variants}
 % \label{sec:l3expan:variants-method}
 %
-% ^^A Bruno: Should we put a table of variant types (N, c, n, V, v, o, f, x) for reference here?
+% We recall the set of available argument specifiers.
+% \begin{itemize}
+% \item |N|~is used for single-token arguments while |c|~constructs a
+%   control sequence from its name and passes it to a parent function as
+%   an |N|-type argument.
+% \item Many argument types extract or expand some tokens and provide it
+%   as an |n|-type argument, namely a braced multiple-token argument:
+%   |V|~extracts the value of a variable, |v|~extracts the value from
+%   the name of a variable, |n|~uses the argument as it is, |o|~expands
+%   once, |f|~expands fully the first token, |x|~expands fully all
+%   tokens at the price of being non-expandable.
+% \item A few odd argument types remain: |T|~and |F|~for conditional
+%   processing, otherwise identical to~|n|, |p|~for the parameter text
+%   in definitions, |w|~for arguments with a specific syntax, and |D|~to
+%   denote primitives that should not be used directly.
+% \end{itemize}
 %
-% ^^A Bruno: Should \cs_generate_variant:Nn \foo:n { c } and \foo:N { o } really be ok?
-%
 % \begin{function}[updated = 2015-08-06]{\cs_generate_variant:Nn}
 %   \begin{syntax}
 %     \cs{cs_generate_variant:Nn} \meta{parent control sequence} \Arg{variant argument specifiers}
@@ -139,6 +152,11 @@
 %   protected.  The \meta{variant} is created globally, as is any
 %   \cs[no-index]{exp_args:N\meta{variant}} function needed to carry out the
 %   expansion.
+%
+%   While \cs{cs_generate_variant:Nn} |\foo:N { o }| is currently
+%   allowed, one must know that it will break if the result of the
+%   expansion is more than one token or if |\foo:N| requires its
+%   argument not to be braced.
 % \end{function}
 %
 % \section{Introducing the variants}
@@ -1476,9 +1494,9 @@
 %   iterate through the comma list of variant argument specifiers, which
 %   we first convert to a string: the reason is explained later.
 %    \begin{macrocode}
+\__debug_patch:nnNNpn { \__debug_chk_cs_exist:N #1 } { }
 \cs_new_protected:Npn \cs_generate_variant:Nn #1#2
   {
-    \__chk_if_exist_cs:N #1
     \@@_generate_variant:N #1
     \exp_after:wN \@@_split_function:NN
     \exp_after:wN #1
@@ -1788,7 +1806,7 @@
 %   \cs{cs_new_protected:Npx}.  Then define the variant by
 %   combining the |\exp_args:N #3| variant and the base function.
 %    \begin{macrocode}
-\__debug_patch:nnNw
+\__debug_patch:nnNNpn
   {
     \cs_if_free:NF #4
       {

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %
@@ -532,7 +532,7 @@
 %
 % \subsection{Wrapping lines in output}
 %
-% \begin{function}[added = 2012-06-28, updated = 2015-08-05]{\iow_wrap:nnnN}
+% \begin{function}[added = 2012-06-28, updated = 2017-07-17]{\iow_wrap:nnnN}
 %   \begin{syntax}
 %     \cs{iow_wrap:nnnN} \Arg{text} \Arg{run-on text} \Arg{set up} \meta{function}
 %   \end{syntax}
@@ -1205,10 +1205,10 @@
   { 1 }
   {
     \cs_if_exist:NTF \normalend
-      { \tex_count:D 38 \scan_stop: }
+      { \tex_count:D 38 ~ }
       {
-        \tex_count:D 16 \scan_stop:
-          \cs_if_exist:NT \loccount { - 1 }
+        \tex_count:D 16 ~ %
+        \cs_if_exist:NT \loccount { - 1 }
       }
   }
   {
@@ -1548,10 +1548,10 @@
   { 1 }
   {
     \cs_if_exist:NTF \normalend
-      { \tex_count:D 39 \scan_stop: }
+      { \tex_count:D 39 ~ }
       {
-        \tex_count:D 17 \scan_stop:
-          \cs_if_exist:NT \loccount { - 1 }
+        \tex_count:D 17 ~
+        \cs_if_exist:NT \loccount { - 1 }
       }
   }
   {
@@ -1918,7 +1918,6 @@
 % \end{macro}
 %
 % \begin{macro}{\iow_wrap:nnnN}
-% \begin{macro}[aux]{\@@_wrap_set:Nx}
 %   The main wrapping function works as follows.  First give |\\|,
 %   \verb*|\ | and other formatting commands the correct definition for
 %   messages and perform the given setup~|#3|.  The definition of
@@ -1942,16 +1941,14 @@
       #3
 %    \end{macrocode}
 %   Then fully-expand the input: in package mode, the expansion uses
-%   \LaTeXe{}'s \cs{protected} mechanism.  As soon as the expansion is
-%   done, reset \cs{iow_indent:n} to its error definition: it only works
-%   in the first argument of \cs{iow_wrap:nnnN}.
+%   \LaTeXe{}'s \tn{protect} mechanism in the same way as \tn{typeout}.
+%   In generic mode this setting is useless but harmless.  As soon as
+%   the expansion is done, reset \cs{iow_indent:n} to its error
+%   definition: it only works in the first argument of
+%   \cs{iow_wrap:nnnN}.
 %    \begin{macrocode}
-%<*initex>
+%<package>      \cs_set_eq:NN \protect \token_to_str:N
       \tl_set:Nx \l_@@_wrap_tl {#1}
-%</initex>
-%<*package>
-      \@@_wrap_set:Nx \l_@@_wrap_tl {#1}
-%</package>
       \cs_set_eq:NN \iow_indent:n \@@_indent_error:n
 %    \end{macrocode}
 %   Afterwards, set the newline marker (two assignments to fully expand,
@@ -1975,16 +1972,7 @@
     #4 { \tl_to_str:N \l_@@_wrap_tl }
   }
 %    \end{macrocode}
-%   As using the generic loader means that \cs{protected at edef} is
-%   not available, it's not placed directly in the wrap function but is set
-%   up as an auxiliary. In the generic loader this can then be redefined.
-%    \begin{macrocode}
-%<*package>
-\cs_new_eq:NN \@@_wrap_set:Nx \protected at edef
-%</package>
-%    \end{macrocode}
 % \end{macro}
-% \end{macro}
 %
 % \begin{macro}[aux]{\@@_wrap_do:, \@@_wrap_start:w}
 %   Escape spaces.  Set up a few variables, in particular the initial
@@ -2365,39 +2353,43 @@
 %
 % \begin{variable}[deprecated = 2018-12-31]{\g_file_current_name_tl}
 %   For removal after 2018-12-31.
+%   Contrarily to most other deprecated commands this is expandable
+%   so we need to put code by hand in two token lists.  We use
+%   \cs{tex_def:D} directly because \cs{g_file_current_name_tl} is made
+%   outer by \cs{debug_deprecation_on:}.
 %    \begin{macrocode}
 \tl_new:N \g_file_current_name_tl
 \tl_gset:Nn \g_file_current_name_tl { \g_file_curr_name_str }
+\__debug:TF
+  {
+    \tl_gput_right:Nn \g__debug_deprecation_on_tl
+      {
+        \__deprecation_error:Nnn \g_file_current_name_tl
+          { \g_file_curr_name_str } { 2018-12-31 }
+      }
+    \tl_gput_right:Nn \g__debug_deprecation_off_tl
+      { \tex_def:D \g_file_current_name_tl { \g_file_curr_name_str } }
+  }
+  { }
 %    \end{macrocode}
 % \end{variable}
 %
 % \begin{macro}[deprecated = 2018-12-31]{\file_path_include:n}
 % \begin{macro}[deprecated = 2018-12-31]{\file_path_remove:n}
-% \begin{macro}[deprecated = 2018-12-31, aux]{\__file_path_include:n}
 %   Wrapper functions to manage the search path.
 %    \begin{macrocode}
+\__debug_deprecation:nnNNpn { 2018-12-31 }
+  { \seq_put_right:Nn \l_file_search_path_seq }
 \cs_new_protected:Npn \file_path_include:n #1
   {
-    \__msg_kernel_warning:nnxxx { kernel } { deprecated-command }
-      { 2018-12-31 }
-      { \token_to_str:N \file_path_include:n }
-      {
-        \token_to_str:N \seq_put_right:Nn \c_space_tl
-        \token_to_str:N \l_file_search_path_seq
-      }
     \__file_name_sanitize:nN {#1} \l__file_full_name_str
     \seq_if_in:NVF \l_file_search_path_seq \l__file_full_name_str
       { \seq_put_right:NV \l_file_search_path_seq \l__file_full_name_str }
   }
+\__debug_deprecation:nnNNpn { 2018-12-31 }
+  { \seq_remove_all:Nn \l_file_search_path_seq }
 \cs_new_protected:Npn \file_path_remove:n #1
   {
-    \__msg_kernel_warning:nnxxx { kernel } { deprecated-command }
-      { 2018-12-31 }
-      { \token_to_str:N \file_path_remove:n }
-      {
-        \token_to_str:N \seq_remove_all:Nn \c_space_tl
-        \token_to_str:N \l_file_search_path_seq
-      }
     \__file_name_sanitize:nN {#1} \l__file_full_name_str
     \seq_remove_all:NV \l_file_search_path_seq \l__file_full_name_str
   }
@@ -2404,17 +2396,13 @@
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
-% \end{macro}
 %
 % \begin{macro}[deprecated = 2018-12-31]{\file_add_path:nN}
 %   For removal after 2018-12-31.
 %    \begin{macrocode}
+\__debug_deprecation:nnNNpn { 2018-12-31 } { \file_get_full_name:nN }
 \cs_new_protected:Npn \file_add_path:nN #1#2
   {
-    \__msg_kernel_warning:nnxxx { kernel } { deprecated-command }
-      { 2018-12-31 }
-      { \token_to_str:N \file_add_path:nN }
-      { \token_to_str:N \file_get_full_name:nN }
     \file_get_full_name:nN {#1} #2
     \str_if_empty:NT #2
       { \tl_set:Nn #2 { \q_no_value } }
@@ -2425,15 +2413,8 @@
 % \begin{macro}[added = 2012-06-24, updated = 2012-07-31, deprecated=2017-12-31]{\ior_get_str:NN}
 %   For removal after 2017-12-31.
 %    \begin{macrocode}
-\cs_new_protected:Npn \ior_get_str:NN
-  {
-    \__msg_kernel_warning:nnxxx { kernel } { deprecated-command }
-      { 2017-12-31 }
-      { \token_to_str:N \ior_get_str:NN }
-      { \token_to_str:N \ior_str_get:NN }
-    \cs_gset_eq:NN \ior_get_str:NN \ior_str_get:NN
-    \ior_str_get:NN
-  }
+\__debug_deprecation:nnNNpn { 2017-12-31 } { \ior_str_get:NN }
+\cs_new_protected:Npn \ior_get_str:NN      { \ior_str_get:NN }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -2440,15 +2421,8 @@
 % \begin{macro}[deprecated = 2018-12-31]{\file_list:}
 %   Renamed to \cs{file_log_list:}.  For removal after 2018-12-31.
 %    \begin{macrocode}
-\cs_new_protected:Npn \file_list:
-  {
-    \__msg_kernel_warning:nnxxx { kernel } { deprecated-command }
-      { 2018-12-31 }
-      { \token_to_str:N \file_list: }
-      { \token_to_str:N \file_log_list: }
-    \cs_gset_eq:NN \file_list: \file_log_list:
-    \file_log_list:
-  }
+\__debug_deprecation:nnNNpn { 2018-12-31 } { \file_log_list: }
+\cs_new_protected:Npn \file_list:          { \file_log_list: }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -2456,42 +2430,14 @@
 %   {\ior_list_streams:, \ior_log_streams:, \iow_list_streams:, \iow_log_streams:}
 %   These got a more consistent naming.
 %    \begin{macrocode}
-\cs_new_protected:Npn \ior_list_streams:
-  {
-    \__msg_kernel_warning:nnxxx { kernel } { deprecated-command }
-      { 2018-12-31 }
-      { \token_to_str:N \ior_list_streams: }
-      { \token_to_str:N \ior_show_list: }
-    \cs_gset_eq:NN \ior_list_streams: \ior_show_list:
-    \ior_show_list:
-  }
-\cs_new_protected:Npn \ior_log_streams:
-  {
-    \__msg_kernel_warning:nnxxx { kernel } { deprecated-command }
-      { 2018-12-31 }
-      { \token_to_str:N \ior_log_streams: }
-      { \token_to_str:N \ior_log_list: }
-    \cs_gset_eq:NN \ior_log_streams: \ior_log_list:
-    \ior_log_list:
-  }
-\cs_new_protected:Npn \iow_list_streams:
-  {
-    \__msg_kernel_warning:nnxxx { kernel } { deprecated-command }
-      { 2018-12-31 }
-      { \token_to_str:N \iow_list_streams: }
-      { \token_to_str:N \iow_show_list: }
-    \cs_gset_eq:NN \iow_list_streams: \iow_show_list:
-    \iow_show_list:
-  }
-\cs_new_protected:Npn \iow_log_streams:
-  {
-    \__msg_kernel_warning:nnxxx { kernel } { deprecated-command }
-      { 2018-12-31 }
-      { \token_to_str:N \iow_log_streams: }
-      { \token_to_str:N \iow_log_list: }
-    \cs_gset_eq:NN \iow_log_streams: \iow_log_list:
-    \iow_log_list:
-  }
+\__debug_deprecation:nnNNpn { 2018-12-31 } { \ior_show_list: }
+\cs_new_protected:Npn \ior_list_streams:   { \ior_show_list: }
+\__debug_deprecation:nnNNpn { 2018-12-31 } { \ior_log_list: }
+\cs_new_protected:Npn \ior_log_streams:    { \ior_log_list: }
+\__debug_deprecation:nnNNpn { 2018-12-31 } { \iow_show_list: }
+\cs_new_protected:Npn \iow_list_streams:   { \iow_show_list: }
+\__debug_deprecation:nnNNpn { 2018-12-31 } { \iow_log_list: }
+\cs_new_protected:Npn \iow_log_streams:    { \iow_log_list: }
 %    \end{macrocode}
 % \end{macro}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3final.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3final.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3final.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %
@@ -196,8 +196,8 @@
 %   When the option \texttt{check-declarations} is used, check for the
 %   function defined by \cs{flag_new:n}.
 %    \begin{macrocode}
-\__debug_patch:nnNw
-  { \exp_args:Nc \__chk_if_exist_var:N { flag~#1 } } { }
+\__debug_patch:nnNNpn
+  { \exp_args:Nc \__debug_chk_var_exist:N { flag~#1 } } { }
 \cs_new_protected:Npn \flag_clear:n #1 { \@@_clear:wn 0 ; {#1} }
 \cs_new_protected:Npn \@@_clear:wn #1 ; #2
   {
@@ -240,7 +240,7 @@
 % \subsection{Expandable flag commands}
 %
 % \begin{macro}[EXP,aux]{\@@_chk_exist:n}
-%   Analogue of \cs{__chk_if_exist_var:N} for flags, and with an
+%   Analogue of \cs{__debug_chk_var_exist:N} for flags, and with an
 %   expandable error.  We need to add checks by hand because flags are
 %   not implemented in terms of other variables.  Not all functions need
 %   to be patched since some are defined in terms of others.
@@ -275,7 +275,7 @@
 % \begin{macro}[EXP, pTF]{\flag_if_raised:n}
 %   Test if the flag has a non-zero height, by checking the |0| control sequence.
 %    \begin{macrocode}
-\__debug_patch:nnNw { \@@_chk_exist:n {#1} } { }
+\__debug_patch_conditional:nNNpnn { \@@_chk_exist:n {#1} }
 \prg_new_conditional:Npnn \flag_if_raised:n #1 { p , T , F , TF }
   {
     \if_cs_exist:w flag~#1~0 \cs_end:
@@ -292,7 +292,7 @@
 %   Extract the value of the flag by going through all of the
 %   control sequences starting from |0|.
 %    \begin{macrocode}
-\__debug_patch:nnNw { \@@_chk_exist:n {#1} } { }
+\__debug_patch:nnNNpn { \@@_chk_exist:n {#1} } { }
 \cs_new:Npn \flag_height:n #1 { \@@_height_loop:wn 0; {#1} }
 \cs_new:Npn \@@_height_loop:wn #1 ; #2
   {

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 % \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-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %
@@ -390,6 +390,7 @@
 %   performed by \cs{@@_mul_npos_o:Nww}, and cancelled by
 %   \cs{prg_do_nothing:} here.
 %    \begin{macrocode}
+\__debug_patch_args:nNNpn { { (#1) } }
 \cs_new:Npn \dim_to_fp:n #1
   {
     \exp_after:wN \@@_from_dim_test:ww

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %
@@ -191,15 +191,13 @@
 % \end{macro}
 %
 % \begin{macro}[aux, EXP]{\@@_ln_significand:NNNNnnnN}
-%   \begin{quote}
-%     \cs{@@_ln_significand:NNNNnnnN} \meta{X_1} \Arg{X_2} \Arg{X_3}
-%     \Arg{X_4} \meta{continuation}
-%   \end{quote}
+%   \begin{syntax}
+%     \cs{@@_ln_significand:NNNNnnnN} \meta{X_1} \Arg{X_2} \Arg{X_3} \Arg{X_4} \meta{continuation}
+%   \end{syntax}
 %   This function expands to
-%   \begin{quote}
-%     \meta{continuation} \Arg{Y_1} \Arg{Y_2} \Arg{Y_3} \Arg{Y_4}
-%     \Arg{Y_5} \Arg{Y_6} |;|
-%   \end{quote}
+%   \begin{syntax}
+%     \meta{continuation} \Arg{Y_1} \Arg{Y_2} \Arg{Y_3} \Arg{Y_4} \Arg{Y_5} \Arg{Y_6} |;|
+%   \end{syntax}
 %   where $Y = - \ln(X)$ as an extended fixed point.
 %    \begin{macrocode}
 \cs_new:Npn \@@_ln_significand:NNNNnnnN #1#2#3#4
@@ -316,10 +314,9 @@
 %   a faithful rounding).
 %   ^^A todo: doc
 %
-%   \begin{quote}
-%     \cs{@@_ln_x_iv:wnnnnnnnn}
-%     \meta{1 or 2} \meta{8d} |;| \Arg{4d} \Arg{4d} \meta{fixed-tl}
-%   \end{quote}
+%   \begin{syntax}
+%     \cs{@@_ln_x_iv:wnnnnnnnn} \meta{1 or 2} \meta{8d} |;| \Arg{4d} \Arg{4d} \meta{fixed-tl}
+%   \end{syntax}
 %   The number is $x$. Compute $y$ by adding 1 to the five first digits.
 %    \begin{macrocode}
 \cs_new:Npn \@@_ln_x_iv:wnnnnnnnn #1; #2#3#4#5 #6#7#8#9
@@ -357,7 +354,7 @@
 %   We now have essentially
 %   ^^A todo: determine error on $Q_{6}$ (probably $6.7$),
 %   ^^A todo: conclude the final result is off by $<10^{-23}$
-%   \begin{quote}
+%   \begin{syntax}
 %     \cs{@@_ln_div_after:Nw} \meta{fixed tl}
 %     \cs{@@_div_significand_pack:NNN} $10^6 + Q_{1}$
 %     \cs{@@_div_significand_pack:NNN} $10^6 + Q_{2}$
@@ -366,7 +363,7 @@
 %     \cs{@@_div_significand_pack:NNN} $10^6 + Q_{5}$
 %     \cs{@@_div_significand_pack:NNN} $10^6 + Q_{6}$ |;|
 %     \meta{exponent} |;| \meta{continuation}
-%   \end{quote}
+%   \end{syntax}
 %   where \meta{fixed tl} holds the logarithm of a number
 %   in $[1,10]$, and \meta{exponent} is
 %   the exponent. Also, the expansion is done backwards. Then
@@ -373,9 +370,10 @@
 %   \cs{@@_div_significand_pack:NNN} puts things in the
 %   correct order to add the $Q_{i}$ together and put semicolons
 %   between each piece. Once those have been expanded, we get
-%   \begin{quote}
-%     \cs{@@_ln_div_after:Nw} \meta{fixed-tl} \meta{1d} |;| \meta{4d} |;| \meta{4d} |;| \meta{4d} |;| \meta{4d} |;| \meta{4d} |;| \meta{4d} |;| \meta{exponent} |;|
-%   \end{quote}
+%   \begin{syntax}
+%     \cs{@@_ln_div_after:Nw} \meta{fixed-tl} \meta{1d} |;| \meta{4d} |;| \meta{4d} |;|
+%     ~~\meta{4d} |;| \meta{4d} |;| \meta{4d} |;| \meta{4d} |;| \meta{exponent} |;|
+%   \end{syntax}
 %   ^^A todo: redoc.
 %   Just as with division, we know that the first two digits
 %   are |1| and |0| because of bounds on the final result of
@@ -407,9 +405,11 @@
   }
 %    \end{macrocode}
 %
-%   \begin{quote}
-%     \cs{@@_ln_t_large:NNw} \meta{sign}\meta{fixed tl}  \meta{t_1}|;| \meta{t_2} |;| \meta{t_3}|;| \meta{t_4}|;| \meta{t_5} |;| \meta{t_6}|;| \meta{exponent} |;| \meta{continuation}
-%   \end{quote}
+%   \begin{syntax}
+%     \cs{@@_ln_t_large:NNw} \meta{sign} \meta{fixed tl}
+%     ~~\meta{t_1}|;| \meta{t_2} |;| \meta{t_3}|;| \meta{t_4}|;| \meta{t_5} |;| \meta{t_6}|;|
+%     ~~\meta{exponent} |;| \meta{continuation}
+%   \end{syntax}
 %   Compute the square $|t|^2$, and keep $|t|$ at the end with its
 %   sign. We know that $|t|<0.1765$, so every piece has at most $4$
 %   digits. However, since we were not careful in \cs{@@_ln_t_small:w},
@@ -455,13 +455,13 @@
 %
 % \begin{macro}{\@@_ln_Taylor:wwNw}
 %   Denoting $T=t^2$, we get
-%   \begin{quote}
+%   \begin{syntax}
 %     \cs{@@_ln_Taylor:wwNw}
-%     \Arg{T_1} \Arg{T_2} \Arg{T_3} \Arg{T_4} \Arg{T_5} \Arg{T_6} |;| |;|
-%     \Arg{(2t)_1} \Arg{(2t)_2} \Arg{(2t)_3} \Arg{(2t)_4} \Arg{(2t)_5} \Arg{(2t)_6} |;|
-%     |{| \cs{@@_ln_c:NwNw} \meta{sign} |}|
-%     \meta{fixed tl} \meta{exponent} |;| \meta{continuation}
-%   \end{quote}
+%     ~~\Arg{T_1} \Arg{T_2} \Arg{T_3} \Arg{T_4} \Arg{T_5} \Arg{T_6} |;| |;|
+%     ~~\Arg{(2t)_1} \Arg{(2t)_2} \Arg{(2t)_3} \Arg{(2t)_4} \Arg{(2t)_5} \Arg{(2t)_6} |;|
+%     ~~|{| \cs{@@_ln_c:NwNw} \meta{sign} |}|
+%     ~~\meta{fixed tl} \meta{exponent} |;| \meta{continuation}
+%   \end{syntax}
 %   And we want to compute
 %   \[
 %   \ln\left(\frac{1+t}{1-t}\right)
@@ -508,11 +508,11 @@
 % \end{macro}
 %
 % \begin{macro}{\@@_ln_c:NwNw}
-%   \begin{quote}
+%   \begin{syntax}
 %     \cs{@@_ln_c:NwNw} \meta{sign}
-%     \Arg{r_1} \Arg{r_2} \Arg{r_3} \Arg{r_4} \Arg{r_5} \Arg{r_6} |;|
-%     \meta{fixed tl} \meta{exponent} |;| \meta{continuation}
-%   \end{quote}
+%     ~~\Arg{r_1} \Arg{r_2} \Arg{r_3} \Arg{r_4} \Arg{r_5} \Arg{r_6} |;|
+%     ~~\meta{fixed tl} \meta{exponent} |;| \meta{continuation}
+%   \end{syntax}
 %   We are now reduced to finding $\ln(c)$ and $\meta{exponent}\ln(10)$
 %   in a table, and adding it to the mixture. The first step is to
 %   get $\ln(c) - \ln(x) = - \ln(a)$, then we get $|b|\ln(10)$ and add
@@ -535,11 +535,11 @@
 % \end{macro}
 %
 % \begin{macro}{\@@_ln_exponent:wn}
-%   \begin{quote}\raggedright
+%   \begin{syntax}
 %     \cs{@@_ln_exponent:wn}
-%     \Arg{s_1} \Arg{s_2} \Arg{s_3} \Arg{s_4} \Arg{s_5} \Arg{s_6} |;|
-%     \Arg{exponent}
-%   \end{quote}
+%     ~~\Arg{s_1} \Arg{s_2} \Arg{s_3} \Arg{s_4} \Arg{s_5} \Arg{s_6} |;|
+%     ~~\Arg{exponent}
+%   \end{syntax}
 %   Compute \meta{exponent} times $\ln(10)$. Apart from the cases where
 %   \meta{exponent} is $0$ or $1$, the result is necessarily at
 %   least $\ln(10) \simeq 2.3$ in magnitude. We can thus drop the least

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %
@@ -181,11 +181,10 @@
 % be values of registers.  Assume that one number, say, $12345$, has
 % already been found, and that we want to parse the next number. The
 % current status of the code may look as follows.
-% \begin{quote}\ttfamily
-%   \cs{exp_after:wN} |\add:ww|
-%   \cs{__int_value:w} 12345 \cs{exp_after:wN} ; \newline
+% \begin{syntax}
+%   \cs{exp_after:wN} |\add:ww| \cs{__int_value:w} 12345 \cs{exp_after:wN} ;
 %   \cs{exp:w} |\operand:w| \meta{stuff}
-% \end{quote}
+% \end{syntax}
 % One step of expansion expands \cs{exp_after:wN}, which triggers the
 % primitive \cs{__int_value:w}, which reads the five digits we have
 % already found, |12345|.  This integer is unfinished, causing the
@@ -194,10 +193,10 @@
 % what follows and make a number out of it, then leave \cs{exp_end:}, the
 % number, and a semicolon in the input stream.  Once |\operand:w| is
 % done expanding, we obtain essentially
-% \begin{quote}\ttfamily
-%   \cs{exp_after:wN} |\add:ww| \cs{__int_value:w} 12345 ; \newline
+% \begin{syntax}
+%   \cs{exp_after:wN} |\add:ww| \cs{__int_value:w} 12345 ;
 %   \cs{exp:w} \cs{exp_end:} 333444 ;
-% \end{quote}
+% \end{syntax}
 % where in fact \cs{exp_after:wN} has already been expanded,
 % \cs{__int_value:w} has already seen |12345|, and
 % \cs{exp:w} is still looking for a number.  It finds
@@ -204,9 +203,9 @@
 % \cs{exp_end:}, hence expands to nothing.  Now, \cs{__int_value:w} sees
 % the \texttt{;}, which cannot be part of a number.  The expansion
 % stops, and we are left with
-% \begin{quote}\ttfamily
+% \begin{syntax}
 %   |\add:ww| 12345 ; 333444 ;
-% \end{quote}
+% \end{syntax}
 % which can safely perform the addition by grabbing two arguments
 % delimited by~|;|.
 %
@@ -290,10 +289,10 @@
 % of this function is that it reads one \meta{number}, performing no
 % computation, and finds the following binary \meta{operator}.  Then it
 % expands to
-% \begin{quote}
-%   \meta{number} \newline
-%   ~~|\__fp_parse_infix_|\meta{operator}|:N| \meta{precedence}
-% \end{quote}
+% \begin{syntax}
+%   \meta{number}
+%   |  \__fp_parse_infix_|\meta{operator}|:N| \meta{precedence}
+% \end{syntax}
 % expanding the \texttt{infix} auxiliary before leaving the above in the
 % input stream.
 %
@@ -310,17 +309,17 @@
 % auxiliary for the following \meta{operator}, to know whether to
 % perform the computation of the \meta{operator}.  If it should not be
 % performed, the \texttt{infix} auxiliary expands to
-% \begin{quote}
+% \begin{syntax}
 %   |@| \cs{use_none:n} |\__fp_parse_infix_|\meta{operator}|:N|
-% \end{quote}
+% \end{syntax}
 % and otherwise it calls \cs{@@_parse_operand:Nw} with the precedence of
 % the \meta{operator} to find its second operand \meta{number_2} and the
 % next \meta{operator_2}, and expands to
-% \begin{quote}
-%   |@| \cs{@@_parse_apply_binary:NwNwN} \newline
-%   ~~~~\meta{operator} \meta{number_2} \newline
+% \begin{syntax}
+%   |@| \cs{@@_parse_apply_binary:NwNwN}
+%   ~~~~\meta{operator} \meta{number_2}
 %   |@| |\__fp_parse_infix_|\meta{operator_2}|:N|
-% \end{quote}
+% \end{syntax}
 % The \texttt{infix} function is responsible for comparing precedences,
 % but cannot directly call the computation functions, because the first
 % operand \meta{number} is before the \texttt{infix} function in the
@@ -329,57 +328,57 @@
 %
 % A definition of \cs{@@_parse_operand:Nw} \meta{precedence} with some
 % of the expansion control removed is
-% \begin{quote}
-%   \cs{exp_after:wN} \cs{@@_parse_continue:NwN} \newline
-%   \cs{exp_after:wN} \meta{precedence} \newline
-%   \cs{exp:w} \cs{exp_end_continue_f:w} \newline
+% \begin{syntax}
+%   \cs{exp_after:wN} \cs{@@_parse_continue:NwN}
+%   \cs{exp_after:wN} \meta{precedence}
+%   \cs{exp:w} \cs{exp_end_continue_f:w}
 %   ~~\cs{@@_parse_one:Nw} \meta{precedence}
-% \end{quote}
+% \end{syntax}
 % This expands \cs{@@_parse_one:Nw} \meta{precedence} completely, which
 % finds a number, wraps the next \meta{operator} into an \texttt{infix}
 % function, feeds this function the \meta{precedence}, and expands it,
 % yielding either
-% \begin{quote}
-%   \cs{@@_parse_continue:NwN} \meta{precedence} \newline
-%   \meta{number} |@| \newline
+% \begin{syntax}
+%   \cs{@@_parse_continue:NwN} \meta{precedence}
+%   \meta{number} |@|
 %   \cs{use_none:n} |\__fp_parse_infix_|\meta{operator}|:N|
-% \end{quote}
+% \end{syntax}
 % or
-% \begin{quote}
-%   \cs{@@_parse_continue:NwN} \meta{precedence} \newline
-%   \meta{number} |@| \newline
-%   \cs{@@_parse_apply_binary:NwNwN} \newline
-%   ~~\meta{operator} \meta{number_2} \newline
+% \begin{syntax}
+%   \cs{@@_parse_continue:NwN} \meta{precedence}
+%   \meta{number} |@|
+%   \cs{@@_parse_apply_binary:NwNwN}
+%   ~~\meta{operator} \meta{number_2}
 %   |@| |\__fp_parse_infix_|\meta{operator_2}|:N|
-% \end{quote}
+% \end{syntax}
 % The definition of \cs{@@_parse_continue:NwN} is then very simple:
-% \begin{verbatim}
-%   \cs_new:Npn \__fp_parse_continue:NwN #1#2@#3 { #3 #1 #2 @ }
-% \end{verbatim}
+% \begin{syntax}
+%   |\cs_new:Npn \__fp_parse_continue:NwN #1#2@#3 { #3 #1 #2 @ }|
+% \end{syntax}
 % In the first case, |#3|~is \cs{use_none:n}, yielding
-% \begin{quote}
-%   \cs{use_none:n} \meta{precedence} \meta{number} |@| \newline
+% \begin{syntax}
+%   \cs{use_none:n} \meta{precedence} \meta{number} |@|
 %   |\__fp_parse_infix_|\meta{operator}|:N|
-% \end{quote}
+% \end{syntax}
 % then \meta{number} |@| |\__fp_parse_infix_|\meta{operator}|:N|.  In
 % the second case, |#3|~is \cs{@@_parse_apply_binary:NwNwN}, whose role
 % is to compute \meta{number} \meta{operator} \meta{number_2} and to
 % prepare for the next comparison of precedences: first we get
-% \begin{quote}
-%   \cs{@@_parse_apply_binary:NwNwN} \newline
-%   ~~\meta{precedence} \meta{number} |@| \newline
-%   ~~\meta{operator} \meta{number_2} \newline
+% \begin{syntax}
+%   \cs{@@_parse_apply_binary:NwNwN}
+%   ~~\meta{precedence} \meta{number} |@|
+%   ~~\meta{operator} \meta{number_2}
 %   |@| |\__fp_parse_infix_|\meta{operator_2}|:N|
-% \end{quote}
+% \end{syntax}
 % then
-% \begin{quote}
-%   \cs{exp_after:wN} \cs{@@_parse_continue:NwN} \newline
-%   \cs{exp_after:wN} \meta{precedence} \newline
-%   \cs{exp:w} \cs{exp_end_continue_f:w} \newline
-%   |\__fp_|\meta{operator}|_o:ww| \meta{number} \meta{number_2} \newline
-%   \cs{exp:w} \cs{exp_end_continue_f:w} \newline
+% \begin{syntax}
+%   \cs{exp_after:wN} \cs{@@_parse_continue:NwN}
+%   \cs{exp_after:wN} \meta{precedence}
+%   \cs{exp:w} \cs{exp_end_continue_f:w}
+%   |\__fp_|\meta{operator}|_o:ww| \meta{number} \meta{number_2}
+%   \cs{exp:w} \cs{exp_end_continue_f:w}
 %   |\__fp_parse_infix_|\meta{operator_2}|:N| \meta{precedence}
-% \end{quote}
+% \end{syntax}
 % where |\__fp_|\meta{operator}|_o:ww| computes \meta{number}
 % \meta{operator} \meta{number_2} and expands after the result, thus
 % triggers the comparison of the precedence of the \meta{operator_2} and
@@ -679,9 +678,9 @@
 %   functions read tokens one by one, and output digits into the input
 %   stream, until meeting a non-digit, or up to a number of digits equal
 %   to their index.  The full expansion is
-%   \begin{quote}
+%   \begin{syntax}
 %     \meta{digits} |;| \meta{filling 0} |;| \meta{length}
-%   \end{quote}
+%   \end{syntax}
 %   where \meta{filling 0} is a string of zeros such that \meta{digits}
 %   \meta{filling 0} has the length given by the index of the function,
 %   and \meta{length} is the number of zeros in the \meta{filling 0}
@@ -1574,11 +1573,11 @@
 %
 % Expansion is a little bit tricky here, in part because we accept input
 % where multiplication is implicit.
-% \begin{verbatim}
-%   \@@_parse:n { 3.2 erf(0.1) }
-%   \@@_parse:n { 3.2 e\l_my_int }
-%   \@@_parse:n { 3.2 \c_pi_fp }
-% \end{verbatim}
+% \begin{syntax}
+%   \cs{@@_parse:n} |{ 3.2 erf(0.1) }|
+%   \cs{@@_parse:n} |{ 3.2 e\l_my_int }|
+%   \cs{@@_parse:n} |{ 3.2 \c_pi_fp }|
+% \end{syntax}
 % The first case indicates that just looking one character ahead for an
 % \enquote{\texttt{e}} is not enough, since we would mistake the
 % function \texttt{erf} for an exponent of \enquote{\texttt{rf}}.  An

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %
@@ -86,6 +86,7 @@
 % \begin{macro}[aux, EXP]
 %   {
 %     \@@_parse_word_round:N, \@@_parse_round:Nw,
+%     \@@_parse_round_no_error:Nw,
 %     \@@_parse_round_deprecation_error:Nw
 %   }
 % \begin{macro}[aux, deprecated = 2017-12-31]{round+, round0, round-}
@@ -95,9 +96,8 @@
 %   set up.  When \pkg{l3doc} complains, remove the syntax by
 %   removing everything until the last \cs{fi:} in
 %   \cs{@@_parse_word_round:N} (and getting rid of the unused
-%   definitions of \cs{@@_parse_round:Nw} and
-%   \cs{@@_parse_round_deprecation_error:Nw} here and in
-%   \pkg{l3deprecation}, perhaps also of the |fp-deprecated| error).
+%   definitions of \cs{@@_parse_round:Nw} and so on, as well as the
+%   |fp-deprecated| error in \pkg{l3fp-parse}).
 %    \begin{macrocode}
 \cs_new:Npn \@@_parse_word_round:N #1#2
   {
@@ -116,18 +116,36 @@
       \@@_round_o:Nw \@@_round_to_nearest:NNN #1
     #2
   }
-\cs_new:Npn \@@_parse_round:Nw
-    #1 #2 \@@_round_to_nearest:NNN #3#4 { #2 #1 #3 }
-\cs_new:Npn \@@_parse_round_deprecation_error:Nw
-    #1 #2 \@@_round_to_nearest:NNN #3#4
+\__debug:TF
   {
-    \@@_error:nnfn { fp-deprecated } { round#4() }
+    \tl_gput_right:Nn \g__debug_deprecation_on_tl
       {
-        \str_case:nn {#2}
-          { { + } { ceil } { 0 } { trunc } { - } { floor } }
-      } { }
-    #2 #1 #3
+        \cs_set_eq:NN \@@_parse_round:Nw
+          \@@_parse_round_deprecation_error:Nw
+      }
+    \tl_gput_right:Nn \g__debug_deprecation_off_tl
+      {
+        \cs_set_eq:NN \@@_parse_round:Nw
+          \@@_parse_round_no_error:Nw
+      }
+    \cs_new:Npn \@@_parse_round_deprecation_error:Nw
+        #1 #2 \@@_round_to_nearest:NNN #3#4
+      {
+        \@@_error:nnfn { fp-deprecated } { round#4() }
+          {
+            \str_case:nn {#2}
+              { { + } { ceil } { 0 } { trunc } { - } { floor } }
+          } { }
+        #2 #1 #3
+      }
+    \cs_new:Npn \@@_parse_round_no_error:Nw
+        #1 #2 \@@_round_to_nearest:NNN #3#4 { #2 #1 #3 }
+    \cs_new_eq:NN \@@_parse_round:Nw \@@_parse_round_no_error:Nw
   }
+  {
+    \cs_new:Npn \@@_parse_round:Nw
+        #1 #2 \@@_round_to_nearest:NNN #3#4 { #2 #1 #3 }
+  }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 % \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-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -47,7 +47,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %
@@ -1008,7 +1008,9 @@
 % \begin{macro}{\int_eval:n}
 %   Wrapper for \cs{@@_eval:w}: can be used in an integer expression
 %   or directly in the input stream.
+%   When debugging, use parentheses to catch early termination.
 %    \begin{macrocode}
+\__debug_patch_args:nNNpn { { (#1) } }
 \cs_new:Npn \int_eval:n #1
   { \@@_value:w \@@_eval:w #1 \@@_eval_end: }
 %    \end{macrocode}
@@ -1026,6 +1028,7 @@
 %   evaluation.  The absolute value is obtained by removing a leading
 %   sign if any.  All three functions expand in two steps.
 %    \begin{macrocode}
+\__debug_patch_args:nNNpn { { (#1) } }
 \cs_new:Npn \int_abs:n #1
   {
     \@@_value:w \exp_after:wN \@@_abs:N
@@ -1034,6 +1037,7 @@
   }
 \cs_new:Npn \@@_abs:N #1
   { \if_meaning:w - #1 \else: \exp_after:wN #1 \fi: }
+\__debug_patch_args:nNNpn { { (#1) } { (#2) } }
 \cs_set:Npn \int_max:nn #1#2
   {
     \@@_value:w \exp_after:wN \@@_maxmin:wwN
@@ -1042,6 +1046,7 @@
       >
     \exp_stop_f:
   }
+\__debug_patch_args:nNNpn { { (#1) } { (#2) } }
 \cs_set:Npn \int_min:nn #1#2
   {
     \@@_value:w \exp_after:wN \@@_maxmin:wwN
@@ -1086,6 +1091,7 @@
 %   truncating behaviour that we want. The details are thanks to Heiko
 %   Oberdiek: getting things right in all cases is not so easy.
 %    \begin{macrocode}
+\__debug_patch_args:nNNpn { { (#1) } { (#2) } }
 \cs_new:Npn \int_div_truncate:nn #1#2
   {
     \@@_value:w \@@_eval:w
@@ -1115,6 +1121,7 @@
 %    \end{macrocode}
 %   Finally there's the modulus operation.
 %    \begin{macrocode}
+\__debug_patch_args:nNNpn { { (#1) } { (#2) } }
 \cs_new:Npn \int_mod:nn #1#2
   {
     \@@_value:w \@@_eval:w \exp_after:wN \@@_mod:ww
@@ -1177,7 +1184,7 @@
           {
             \__chk_if_free_cs:N #1
             \tex_global:D \@@_constdef:Nw #1 =
-              \@@_eval:w #2 \@@_eval_end:
+              \@@_eval:w (#2) \@@_eval_end:
           }
       }
   }
@@ -1267,8 +1274,10 @@
 % \UnitTested
 %    Adding and subtracting to and from a counter \ldots
 %    \begin{macrocode}
+\__debug_patch_args:nNNpn { {#1} { (#2) } }
 \cs_new_protected:Npn \int_add:Nn #1#2
   { \tex_advance:D #1 by \@@_eval:w #2 \@@_eval_end: }
+\__debug_patch_args:nNNpn { {#1} { (#2) } }
 \cs_new_protected:Npn \int_sub:Nn #1#2
   { \tex_advance:D #1 by - \@@_eval:w #2 \@@_eval_end: }
 \cs_new_protected:Npn \int_gadd:Nn
@@ -1322,6 +1331,7 @@
 %   if they are not defined. Thus there is no need for the checking
 %   code seen with token list variables.
 %    \begin{macrocode}
+\__debug_patch_args:nNNpn { {#1} { (#2) } }
 \cs_new_protected:Npn \int_set:Nn #1#2
   { #1 ~ \@@_eval:w #2 \@@_eval_end: }
 \cs_new_protected:Npn \int_gset:Nn { \tex_global:D \int_set:Nn }
@@ -1526,6 +1536,7 @@
 % \UnitTested
 % More efficient but less natural in typing.
 %    \begin{macrocode}
+\__debug_patch_conditional_args:nNNpnn { { (#1) \@@_eval_end: } {#2} { (#3) } }
 \prg_new_conditional:Npnn \int_compare:nNn #1#2#3 { p , T , F , TF }
   {
     \if_int_compare:w \@@_eval:w #1 #2 \@@_eval:w #3 \@@_eval_end:
@@ -1584,6 +1595,7 @@
 % \UnitTested
 %   A predicate function.
 %    \begin{macrocode}
+\__debug_patch_conditional_args:nNNpnn { { (#1) } }
 \prg_new_conditional:Npnn \int_if_odd:n #1 { p , T , F , TF}
   {
     \if_int_odd:w \@@_eval:w #1 \@@_eval_end:
@@ -1592,6 +1604,7 @@
       \prg_return_false:
     \fi:
   }
+\__debug_patch_conditional_args:nNNpnn { { (#1) } }
 \prg_new_conditional:Npnn \int_if_even:n #1 { p , T , F , TF}
   {
     \if_int_odd:w \@@_eval:w #1 \@@_eval_end:
@@ -1707,6 +1720,7 @@
 %   step size of zero before checking the sign, but we optimize for the
 %   most frequent case (positive step).
 %    \begin{macrocode}
+\__debug_patch_args:nNNpn { { (#1) } { (#2) } { (#3) } }
 \cs_new:Npn \int_step_function:nnnN #1#2#3
   {
     \exp_after:wN \@@_step:wwwN
@@ -2466,13 +2480,24 @@
 % \begin{variable}[deprecated = 2018-12-31]{\c_minus_one}
 %   The actual allocation mechanism is in \pkg{l3alloc}; it requires
 %   \cs{c_one} to be defined.  In package mode, reuse \tn{m at ne}.
+%   We also store in two global token lists some code for
+%   \cs{debug_deprecation_on:} and \cs{debug_deprecation_off:}.  For the
+%   latter, we need to locally set \cs{c_minus_one} back to the constant
+%   hence use a private name.  We use \cs{tex_let:D} directly because
+%   \cs{c_minus_one} (as all deprecated commands) is made outer by
+%   \cs{debug_deprecation_on:}.
 %    \begin{macrocode}
-%<*package>
-\cs_new_eq:NN \c_minus_one \m at ne
-%</package>
-%<*initex>
-\int_const:Nn \c_minus_one { -1 }
-%</initex>
+%<package>\cs_gset_eq:NN \c__deprecation_minus_one \m at ne
+%<initex>\int_const:Nn \c__deprecation_minus_one { -1 }
+\cs_new_eq:NN \c_minus_one \c__deprecation_minus_one
+\__debug:TF
+  {
+    \tl_gput_right:Nn \g__debug_deprecation_on_tl
+      { \__deprecation_error:Nnn \c_minus_one { -1 } { 2018-12-31 } }
+    \tl_gput_right:Nn \g__debug_deprecation_off_tl
+      { \tex_let:D \c_minus_one \c__deprecation_minus_one }
+  }
+  { }
 %    \end{macrocode}
 % \end{variable}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %
@@ -1514,7 +1514,7 @@
 %   Setting the code for a key first logs if appropriate that we are
 %   defining a new key, then saves the code.
 %    \begin{macrocode}
-\__debug_patch:nnNw
+\__debug_patch:nnNNpn
   {
     \cs_if_exist:cF { \c_@@_code_root_tl #1 }
       { \__debug_log:x { Defining~key~#1~\msg_line_context: } }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %
@@ -833,7 +833,7 @@
 %   This auxiliary is similar to \cs{__chk_if_free_cs:N}, and is used when
 %   defining messages with \cs{msg_new:nnnn}.
 %    \begin{macrocode}
-\__debug_patch:nnNw { }
+\__debug_patch:nnNNpn { }
   { \__debug_log:x { Defining~message~ #1 / #2 ~\msg_line_context: } }
 \cs_new_protected:Npn \__chk_if_free_msg:nn #1#2
   {
@@ -1952,9 +1952,14 @@
 %<*package>
 \bool_if:NTF \l at expl@enable at debug@bool
   {
-    \@@_kernel_new:nnn { kernel } { debug-unpatchable }
-      { Only~some~definitions~can~be~patched;~'#3'~cannot. }
-    \@@_kernel_new:nnnn { check } { non-declared-variable }
+    \@@_kernel_new:nnnn { kernel } { debug }
+      { The~debugging~option~'#1'~does~not~exist~\msg_line_context:. }
+      {
+        The~functions~'\iow_char:N\\debug_on:n'~and~
+        '\iow_char:N\\debug_off:n'~only~accept~the~arguments~
+        'check-declarations',~'deprecation',~'log-functions',~not~'#1'.
+      }
+    \@@_kernel_new:nnnn { kernel } { non-declared-variable }
       { The~variable~#1~has~not~been~declared~\msg_line_context:. }
       {
         Checking~is~active,~and~you~have~tried~do~so~something~like: \\

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3oldmodules.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3oldmodules.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3oldmodules.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -42,7 +42,7 @@
 % }
 %
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %
@@ -110,6 +110,7 @@
 %<l3str>{l3str}
 %<l3tl>{l3tl}
 %<l3tl-analysis>{l3tl-analysis}
+%<l3tl-build>{l3tl-build}
 %<l3token>{l3token}
 %    \end{macrocode}
 %
@@ -129,20 +130,20 @@
 \typeout{** }
 \typeout{** Its functionality is now only provided as part of the expl3 package.}
 \typeout{** }
-%<!l3regex|l3sort|l3tl-analysis>\typeout{** After showing you an error message you can hit <return> we will continue}
-%<!l3regex|l3sort|l3tl-analysis>\typeout{** for now by loading expl3 for you. However, the old packages will be}
-%<!l3regex|l3sort|l3tl-analysis>\typeout{** removed entirely at the end of 2017.}
-%<l3regex|l3sort|l3tl-analysis>\typeout{** The old packages will be removed entirely at the end of 2018.}
+%<!l3regex&!l3sort&!l3tl-analysis&!l3tl-build>\typeout{** After showing you an error message you can hit <return> we will continue}
+%<!l3regex&!l3sort&!l3tl-analysis&!l3tl-build>\typeout{** for now by loading expl3 for you. However, the old packages will be}
+%<!l3regex&!l3sort&!l3tl-analysis&!l3tl-build>\typeout{** removed entirely at the end of 2017.}
+%<l3regex|l3sort|l3tl-analysis|l3tl-build>\typeout{** The old packages will be removed entirely at the end of 2018.}
 \typeout{** }
 \typeout{** Therefore, please replace '\string\usepackage{\old at liii@module at name}'}
 \typeout{** with '\string\usepackage{expl3}' in your documents as soon as possible.}
 \typeout{** }
 \typeout{*******************************************************************}
-%<!l3regex|l3sort|l3tl-analysis>\PackageError
-%<l3regex|l3sort|l3tl-analysis>\PackageWarning
+%<!l3regex&!l3sort&!l3tl-analysis&!l3tl-build>\PackageError
+%<l3regex|l3sort|l3tl-analysis|l3tl-build>\PackageWarning
   \old at liii@module at name{This package is obsolete ---
    use 'expl3' instead}
-%<!l3regex|l3sort|l3tl-analysis>  \@ehc
+%<!l3regex&!l3sort&!l3tl-analysis&!l3tl-build>  \@ehc
 %    \end{macrocode}
 %    Finally load \texttt{expl3} so that the user can continue for now.
 %    \begin{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %
@@ -270,7 +270,7 @@
 %   Sets \meta{boolean_1} to the current value of \meta{boolean_2}.
 % \end{function}
 %
-% \begin{function}[updated = 2012-07-08]
+% \begin{function}[updated = 2017-07-15]
 %   {\bool_set:Nn, \bool_set:cn, \bool_gset:Nn, \bool_gset:cn}
 %   \begin{syntax}
 %     \cs{bool_set:Nn} \meta{boolean} \Arg{boolexpr}
@@ -296,7 +296,7 @@
 %   Displays the logical truth of the \meta{boolean} on the terminal.
 % \end{function}
 %
-% \begin{function}[added = 2012-02-09, updated = 2015-08-07]{\bool_show:n}
+% \begin{function}[added = 2012-02-09, updated = 2017-07-15]{\bool_show:n}
 %   \begin{syntax}
 %     \cs{bool_show:n} \Arg{boolean expression}
 %   \end{syntax}
@@ -311,7 +311,7 @@
 %   Writes the logical truth of the \meta{boolean} in the log file.
 % \end{function}
 %
-% \begin{function}[added = 2014-08-22, updated = 2015-08-07]{\bool_log:n}
+% \begin{function}[added = 2014-08-22, updated = 2017-07-15]{\bool_log:n}
 %   \begin{syntax}
 %     \cs{bool_log:n} \Arg{boolean expression}
 %   \end{syntax}
@@ -354,8 +354,7 @@
 % \meta{true} or \meta{false}. It supports the logical operations And,
 % Or and Not as the well-known infix operators |&&| and \verb"||" and prefix~|!|
 % with their usual precedences (namely, |&&| binds more tightly than
-% \verb"||"). In
-% addition to this, parentheses can be used to isolate
+% \verb"||"). In addition to this, parentheses can be used to isolate
 % sub-expressions. For example,
 % \begin{verbatim}
 %     \int_compare_p:n { 1 = 1 } &&
@@ -368,10 +367,8 @@
 % \end{verbatim}
 % is a valid boolean expression.
 %
-% At present, the infix operators |&&| and \verb"||" perform lazy
-% evaluation, but this will change in the near future.
 % Contrarily to some other programming languages, the operators |&&| and
-% \verb"||" will evaluate both operands in all cases, even when the first
+% \verb"||" evaluate both operands in all cases, even when the first
 % operand is enough to determine the result.  This \enquote{eager}
 % evaluation should be contrasted with the \enquote{lazy} evaluation of
 % \cs[no-index]{bool_lazy_\ldots{}} functions.
@@ -378,8 +375,14 @@
 %
 % \begin{texnote}
 %   The eager evaluation of boolean expressions is unfortunately
-%   necessary.  Indeed, a lazy parser can get confused if |&&| and
-%   \verb"||" appear as (unbraced) arguments of some predicates.
+%   necessary in \TeX{}.  Indeed, a lazy parser can get confused if |&&|
+%   or \verb"||" or parentheses appear as (unbraced) arguments of some
+%   predicates.  For instance, the innocuous-looking expression below
+%   would break (in a lazy parser) if |#1| were a closing parenthesis
+%   and \cs[no-index]{l_tmpa_bool} were \texttt{true}.
+%   \begin{verbatim}
+%     ( \l_tmpa_bool || \token_if_eq_meaning_p:NN X #1 )
+%   \end{verbatim}
 % \end{texnote}
 %
 % Minimal (lazy) evaluation can be obtained using the conditionals
@@ -405,7 +408,7 @@
 % line is expanded because its logical value is needed to determine the
 % result of \cs{bool_lazy_and_p:nn}.
 %
-% \begin{function}[EXP, pTF, updated = 2012-07-08]{\bool_if:n}
+% \begin{function}[EXP, pTF, updated = 2017-07-15]{\bool_if:n}
 %   \begin{syntax}
 %     \cs{bool_if_p:n} \Arg{boolean expression}
 %     \cs{bool_if:nTF} \Arg{boolean expression} \Arg{true code} \Arg{false code}
@@ -418,8 +421,8 @@
 %   |!| (\enquote{Not}) and parentheses.  The logical Not applies to
 %   the next predicate or group.
 % \end{function}
-%   
-% \begin{function}[EXP, pTF, added = 2015-11-15]{\bool_lazy_all:n}
+%
+% \begin{function}[EXP, pTF, added = 2015-11-15, updated = 2017-07-15]{\bool_lazy_all:n}
 %   \begin{syntax}
 %     \cs{bool_lazy_all_p:n} \{ \Arg{boolexpr_1} \Arg{boolexpr_2} $\cdots$ \Arg{boolexpr_N} \}
 %     \cs{bool_lazy_all:nTF} \{ \Arg{boolexpr_1} \Arg{boolexpr_2} $\cdots$ \Arg{boolexpr_N} \} \Arg{true code} \Arg{false code}
@@ -433,7 +436,7 @@
 %   when there are only two \meta{boolean expressions}.
 % \end{function}
 %
-% \begin{function}[EXP, pTF, added = 2015-11-15]{\bool_lazy_and:nn}
+% \begin{function}[EXP, pTF, added = 2015-11-15, updated = 2017-07-15]{\bool_lazy_and:nn}
 %   \begin{syntax}
 %     \cs{bool_lazy_and_p:nn} \Arg{boolexpr_1} \Arg{boolexpr_2}
 %     \cs{bool_lazy_and:nnTF} \Arg{boolexpr_1} \Arg{boolexpr_2} \Arg{true code} \Arg{false code}
@@ -446,7 +449,7 @@
 %   than two \meta{boolean expressions}.
 % \end{function}
 %
-% \begin{function}[EXP, pTF, added = 2015-11-15]{\bool_lazy_any:n}
+% \begin{function}[EXP, pTF, added = 2015-11-15, updated = 2017-07-15]{\bool_lazy_any:n}
 %   \begin{syntax}
 %     \cs{bool_lazy_any_p:n} \{ \Arg{boolexpr_1} \Arg{boolexpr_2} $\cdots$ \Arg{boolexpr_N} \}
 %     \cs{bool_lazy_any:nTF} \{ \Arg{boolexpr_1} \Arg{boolexpr_2} $\cdots$ \Arg{boolexpr_N} \} \Arg{true code} \Arg{false code}
@@ -460,7 +463,7 @@
 %   when there are only two \meta{boolean expressions}.
 % \end{function}
 %
-% \begin{function}[EXP, pTF, added = 2015-11-15]{\bool_lazy_or:nn}
+% \begin{function}[EXP, pTF, added = 2015-11-15, updated = 2017-07-15]{\bool_lazy_or:nn}
 %   \begin{syntax}
 %     \cs{bool_lazy_or_p:nn} \Arg{boolexpr_1} \Arg{boolexpr_2}
 %     \cs{bool_lazy_or:nnTF} \Arg{boolexpr_1} \Arg{boolexpr_2} \Arg{true code} \Arg{false code}
@@ -473,7 +476,7 @@
 %   than two \meta{boolean expressions}.
 % \end{function}
 %
-% \begin{function}[EXP, updated = 2012-07-08]{\bool_not_p:n}
+% \begin{function}[EXP, updated = 2017-07-15]{\bool_not_p:n}
 %   \begin{syntax}
 %      \cs{bool_not_p:n} \Arg{boolean expression}
 %   \end{syntax}
@@ -481,7 +484,7 @@
 %   expression.
 % \end{function}
 %
-% \begin{function}[EXP, updated = 2012-07-08]{\bool_xor_p:nn}
+% \begin{function}[EXP, updated = 2017-07-15]{\bool_xor_p:nn}
 %   \begin{syntax}
 %     \cs{bool_xor_p:nn} \Arg{boolexpr_1} \Arg{boolexpr_2}
 %   \end{syntax}
@@ -538,7 +541,7 @@
 %   until the \meta{boolean} is \texttt{false}.
 % \end{function}
 %
-% \begin{function}[rEXP, updated = 2012-07-08]{\bool_do_until:nn}
+% \begin{function}[rEXP, updated = 2017-07-15]{\bool_do_until:nn}
 %   \begin{syntax}
 %     \cs{bool_do_until:nn} \Arg{boolean expression} \Arg{code}
 %   \end{syntax}
@@ -550,7 +553,7 @@
 %   \texttt{true}.
 % \end{function}
 %
-% \begin{function}[rEXP, updated = 2012-07-08]{\bool_do_while:nn}
+% \begin{function}[rEXP, updated = 2017-07-15]{\bool_do_while:nn}
 %   \begin{syntax}
 %     \cs{bool_do_while:nn} \Arg{boolean expression} \Arg{code}
 %   \end{syntax}
@@ -562,7 +565,7 @@
 %   \texttt{false}.
 % \end{function}
 %
-% \begin{function}[rEXP, updated = 2012-07-08]{\bool_until_do:nn}
+% \begin{function}[rEXP, updated = 2017-07-15]{\bool_until_do:nn}
 %   \begin{syntax}
 %     \cs{bool_until_do:nn} \Arg{boolean expression} \Arg{code}
 %   \end{syntax}
@@ -574,7 +577,7 @@
 %   then loops until the \meta{boolean expression} is \texttt{true}.
 % \end{function}
 %
-% \begin{function}[rEXP, updated = 2012-07-08]{\bool_while_do:nn}
+% \begin{function}[rEXP, updated = 2017-07-15]{\bool_while_do:nn}
 %   \begin{syntax}
 %     \cs{bool_while_do:nn} \Arg{boolean expression} \Arg{code}
 %   \end{syntax}
@@ -808,16 +811,16 @@
 %   make sure the boolean exists.  This is needed because booleans are
 %   not based on token lists nor on \TeX{} registers.
 %    \begin{macrocode}
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \bool_set_true:N #1
   { \cs_set_eq:NN #1 \c_true_bool }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \bool_set_false:N #1
   { \cs_set_eq:NN #1 \c_false_bool }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \bool_gset_true:N #1
   { \cs_gset_eq:NN #1 \c_true_bool }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \bool_gset_false:N #1
   { \cs_gset_eq:NN #1 \c_false_bool }
 \cs_generate_variant:Nn \bool_set_true:N   { c }
@@ -852,10 +855,10 @@
 %   argument the meaning \cs{c_true_bool} or \cs{c_false_bool}.
 %   Again, we include some checking code.
 %    \begin{macrocode}
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \bool_set:Nn #1#2
   { \tex_chardef:D #1 = \bool_if_p:n {#2} }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \bool_gset:Nn #1#2
   { \tex_global:D \tex_chardef:D #1 = \bool_if_p:n {#2} }
 \cs_generate_variant:Nn \bool_set:Nn  { c }
@@ -871,7 +874,7 @@
 %    \begin{macrocode}
 \prg_new_conditional:Npnn \bool_if:N #1 { p , T , F , TF }
   {
-    \if_meaning:w \c_true_bool #1
+    \if_bool:N #1
       \prg_return_true:
     \else:
       \prg_return_false:
@@ -942,7 +945,8 @@
 %   input syntax somewhat similar to the one found in other programming
 %   languages with |(| and |)| for grouping, |!| for logical
 %   \enquote{Not}, |&&| for logical \enquote{And} and \verb"||" for
-%   logical \enquote{Or}.  We shall use the terms Not, And, Or, Open and
+%   logical \enquote{Or}.  However, they perform eager evaluation.
+%   We shall use the terms Not, And, Or, Open and
 %   Close for these operations.
 %
 %   Any expression is terminated by a Close operation. Evaluation
@@ -951,9 +955,8 @@
 %   \begin{itemize}
 %     \item If an Open is seen, start evaluating a new expression using
 %       the Eval function and call GetNext again.
-%     \item If a Not is seen, remove the |!| and call a GetNotNext
-%       function, which eventually reverses the logic compared to
-%       GetNext.
+%     \item If a Not is seen, remove the |!| and call a GetNext
+%       function with the logic reversed.
 %     \item If none of the above, reinsert the token found (this is
 %       supposed to be a predicate function) in front of an Eval
 %       function, which evaluates it to the boolean value \meta{true} or
@@ -968,11 +971,11 @@
 %       seen, continue with GetNext to examine truth value of next
 %       boolean (sub-)expression.
 %     \item[\meta{false}And] Current truth value is false, logical And
-%       seen, stop evaluating the predicates within this sub-expression
-%       and break to the nearest Close. Then return \meta{false}.
-%     \item[\meta{true}Or] Current truth value is true, logical Or
-%       seen, stop evaluating the predicates within this sub-expression
-%       and break to the nearest Close. Then return \meta{true}.
+%       seen, stop using the values of predicates within this
+%       sub-expression until the next Close. Then return \meta{false}.
+%     \item[\meta{true}Or] Current truth value is true, logical Or seen,
+%       stop using the values of predicates within this sub-expression
+%       until the nearest Close. Then return \meta{true}.
 %     \item[\meta{false}Or] Current truth value is false, logical Or
 %       seen, continue with GetNext to examine truth value of next
 %       boolean (sub-)expression.
@@ -981,15 +984,6 @@
 %     \item[\meta{false}Close] Current truth value is false, Close
 %       seen, return \meta{false}.
 %   \end{description}
-%   We introduce an additional Stop operation with the same
-%   semantics as the Close operation.
-%   \begin{description}
-%     \item[\meta{true}Stop] Current truth value is true, return
-%       \meta{true}.
-%     \item[\meta{false}Stop] Current truth value is false, return
-%       \meta{false}.
-%   \end{description}
-%   The reasons for this follow below.
 %    \begin{macrocode}
 \prg_new_conditional:Npnn \bool_if:n #1 { T , F , TF }
   {
@@ -1003,82 +997,40 @@
 % \end{macro}
 %
 % \begin{macro}[EXP]{\bool_if_p:n}
-% \begin{macro}[EXP, aux]
-%   {
-%     \@@_if_left_parentheses:wwwn ,
-%     \@@_if_right_parentheses:wwwn ,
-%     \@@_if_or:wwwn
-%   }
-%   First issue a \cs{group_align_safe_begin:} as we are using |&&|
-%   as syntax shorthand for the And operation and we need to hide it for
-%   \TeX{}.  This is closed at the end of the expression parsing
-%   (see |S| below).
-%
-%   Minimal (\enquote{short-circuit}) evaluation of boolean expressions
-%   requires skipping to the end of the current parenthesized group when
-%   \meta{true}\verb"||" is seen, but to the next \verb"||" or closing
-%   parenthesis when \meta{false}|&&| is seen.  To avoid having separate
-%   functions for the two cases, we transform the boolean expression by
-%   doubling each parenthesis and adding parenthesis around each
-%   \verb"||".  This ensures that |&&| binds tighter than \verb"||".
-%
-%   The replacement is done in three passes, for left and right
-%   parentheses and for \verb"||".  At each pass, the part of the
-%   expression that has been transformed is stored before \cs{q_nil},
-%   the rest lies until the first \cs{q_mark}, followed by an empty
-%   brace group.  A trailing marker ensures that the auxiliaries'
-%   delimited arguments do not run-away.  As long as the delimiter
-%   matches inside the expression, material is moved before \cs{q_nil}
-%   and we continue.  Afterwards, the trailing marker is taken as a
-%   delimiter, |#4| is the next auxiliary, immediately followed by a new
-%   \cs{q_nil} delimiter, which indicates that nothing has been treated
-%   at this pass.  The last step calls \cs{@@_if_parse:NNNww} which
-%   cleans up and triggers the evaluation of the expression itself.
+%   First issue a \cs{group_align_safe_begin:} as we are using |&&| as
+%   syntax shorthand for the And operation and we need to hide it for
+%   \TeX{}.  This group is closed after \cs{@@_get_next:NN} returns
+%   \cs{c_true_bool} or \cs{c_false_bool}.  That function requires the
+%   trailing parenthesis to know where the expression ends.
 %    \begin{macrocode}
 \cs_new:Npn \bool_if_p:n #1
   {
     \group_align_safe_begin:
-    \@@_if_left_parentheses:wwwn \q_nil
-      #1 \q_mark { }
-      (  \q_mark { \@@_if_right_parentheses:wwwn \q_nil }
-      )  \q_mark { \@@_if_or:wwwn \q_nil }
-      || \q_mark \@@_if_parse:NNNww
-    \q_stop
+    \exp_after:wN
+    \group_align_safe_end:
+    \exp:w \exp_end_continue_f:w % (
+    \@@_get_next:NN \use_i:nnnn #1 )
   }
-\cs_new:Npn \@@_if_left_parentheses:wwwn #1 \q_nil #2 ( #3 \q_mark #4
-  { #4 \@@_if_left_parentheses:wwwn #1 #2 (( \q_nil #3 \q_mark {#4} }
-\cs_new:Npn \@@_if_right_parentheses:wwwn #1 \q_nil #2 ) #3 \q_mark #4
-  { #4 \@@_if_right_parentheses:wwwn #1 #2 )) \q_nil #3 \q_mark {#4} }
-\cs_new:Npn \@@_if_or:wwwn #1 \q_nil #2 || #3 \q_mark #4
-  { #4 \@@_if_or:wwwn #1 #2 )||( \q_nil #3 \q_mark {#4} }
 %    \end{macrocode}
 % \end{macro}
-% \end{macro}
 %
-% \begin{macro}[EXP, aux]{\@@_if_parse:NNNww}
-%   After removing extra tokens from the transformation phase, start
-%   evaluating.  At the end, we need to finish the special
-%   \texttt{align_safe} group before finally
-%   returning a \cs{c_true_bool} or \cs{c_false_bool} as there might
-%   otherwise be something left in front in the input stream. For this
-%   we call the Stop operation, denoted simply by a |S| following the
-%   last Close operation.
-%    \begin{macrocode}
-\cs_new:Npn \@@_if_parse:NNNww #1#2#3#4 \q_mark #5 \q_stop
-  {
-    \__bool_get_next:NN \use_i:nn (( #4 )) S
-  }
-%    \end{macrocode}
-% \end{macro}
-%
 % \begin{macro}[aux]{\@@_get_next:NN}
-%   The GetNext operation.  This is a switch: if what follows is neither
-%   |!| nor |(|, we assume it is a predicate.  The first argument is
-%   \cs{use_ii:nn} if the logic must eventually be reversed (after a
-%   |!|), otherwise it is \cs{use_i:nn}.  This function eventually
-%   expand to the truth value \cs{c_true_bool} or \cs{c_false_bool} of
-%   the expression which follows until the next unmatched closing
-%   parenthesis.
+%   The GetNext operation.  Its first argument is \cs{use_i:nnnn},
+%   \cs{use_ii:nnnn}, \cs{use_iii:nnnn}, or \cs{use_iv:nnnn} (we call
+%   these \enquote{states}).  In the first state, this function
+%   eventually expand to the truth value \cs{c_true_bool} or
+%   \cs{c_false_bool} of the expression which follows until the next
+%   unmatched closing parenthesis.  For instance
+%   \enquote{\cs{@@_get_next:NN} \cs{use_i:nnnn} \cs{c_true_bool}
+%   \texttt{\&\&} \cs{c_true_bool} \texttt{)}} (including the closing
+%   parenthesis) expands to \cs{c_true_bool}.  In the second state
+%   (after a |!|) the logic is reversed.  We call these two states
+%   \enquote{normal} and the next two \enquote{skipping}.  In the third
+%   state (after \cs{c_true_bool}\verb"||") it always returns
+%   \cs{c_true_bool}.  In the fourth state (after \cs{c_false_bool}|&&|)
+%   it always returns \cs{c_false_bool} and also stops when encountering
+%   \verb"||", not only parentheses.  This code itself is a switch: if
+%   what follows is neither |!| nor |(|, we assume it is a predicate.
 %    \begin{macrocode}
 \cs_new:Npn \@@_get_next:NN #1#2
   {
@@ -1094,23 +1046,31 @@
 % \end{macro}
 %
 % \begin{macro}[aux]{\@@_!:Nw}
-%   The Not operation reverses the logic: discard the |!| token and call
-%   the GetNext operation with its first argument reversed.
+%   The Not operation reverses the logic: it discards the |!|~token and
+%   calls the GetNext operation with the appropriate first argument.
+%   Namely the first and second states are interchanged, but after
+%   \cs{c_true_bool}\verb"||" or \cs{c_false_bool}|&&| the |!|~is
+%   ignored.
 %    \begin{macrocode}
 \cs_new:cpn { @@_!:Nw } #1#2
-  { \exp_after:wN \@@_get_next:NN #1 \use_ii:nn \use_i:nn }
+  {
+    \exp_after:wN \@@_get_next:NN
+    #1 \use_ii:nnnn \use_i:nnnn \use_iii:nnnn \use_iv:nnnn
+  }
 %    \end{macrocode}
 % \end{macro}
 %
 % \begin{macro}[aux]{\@@_(:Nw}
-%   The Open operation starts a sub-expression after discarding the
-%   token.  This is done by calling GetNext, with a post-processing step
-%   which looks for And, Or or Close afterwards.
+%   The Open operation starts a sub-expression after discarding the open
+%   parenthesis.  This is done by calling GetNext (which eventually
+%   discards the corresponding closing parenthesis), with a
+%   post-processing step which looks for And, Or or Close after the
+%   group.
 %    \begin{macrocode}
 \cs_new:cpn { @@_(:Nw } #1#2
   {
     \exp_after:wN \@@_choose:NNN \exp_after:wN #1
-    \__int_value:w \@@_get_next:NN \use_i:nn
+    \__int_value:w \@@_get_next:NN \use_i:nnnn
   }
 %    \end{macrocode}
 % \end{macro}
@@ -1118,8 +1078,8 @@
 % \begin{macro}[aux]{\@@_p:Nw}
 %   If what follows GetNext is neither |!| nor |(|, evaluate the
 %   predicate using the primitive \cs{__int_value:w}.  The canonical
-%   true and false values have numerical values $1$ and $0$
-%   respectively.  Look for And, Or or Close afterwards.
+%   \texttt{true} and \texttt{false} values have numerical values $1$
+%   and $0$ respectively.  Look for And, Or or Close afterwards.
 %    \begin{macrocode}
 \cs_new:cpn { @@_p:Nw } #1
   { \exp_after:wN \@@_choose:NNN \exp_after:wN #1 \__int_value:w }
@@ -1127,152 +1087,66 @@
 % \end{macro}
 %
 % \begin{macro}[aux]{\@@_choose:NNN}
-%   Branching the eight-way switch.  The arguments are 1: \cs{use_i:nn}
-%   or \cs{use_ii:nn}, 2: $0$ or $1$ encoding the current truth value,
-%   3: the next operation, And, Or, Close or Stop.  If |#1| is
-%   \cs{use_ii:nn}, the logic of |#2| must be reversed.
+% \begin{macro}[aux]+\@@_)_0:+
+% \begin{macro}[aux]+\@@_)_1:+
+% \begin{macro}[aux]+\@@_)_2:+
+% \begin{macro}[aux]+\@@_&_0:+
+% \begin{macro}[aux]+\@@_&_1:+
+% \begin{macro}[aux]+\@@_&_2:+
+% \begin{macro}[aux]+\@@_|_0:+
+% \begin{macro}[aux]+\@@_|_1:+
+% \begin{macro}[aux]+\@@_|_2:+
+%   The arguments are |#1|: a function such as \cs{use_i:nnnn}, |#2|:
+%   $0$ or $1$ encoding the current truth value, |#3|: the next
+%   operation, And, Or or Close.  We distinguish three cases according
+%   to a combination of |#1| and |#2|.  Case~2 is when |#1| is
+%   \cs{use_iii:nnnn} (state~3), namely after
+%   \cs{c_true_bool}~\verb"||".  Case~1 is when |#1| is \cs{use_i:nnnn}
+%   and |#2| is \texttt{true} or when |#1| is \cs{use_ii:nnnn} and |#2|
+%   is \texttt{false}, for instance for |!|\cs{c_false_bool}.  Case~0
+%   includes the same with \texttt{true}/\texttt{false} interchanged and
+%   the case where |#1| is \cs{use_iv:nnnn} namely after
+%   \cs{c_false_bool}~|&&|.
+%
+%   When seeing~|)| the current subexpression is done, leave the
+%   appropriate boolean.  When seeing~|&| in case~0 go into state~4,
+%   equivalent to having seen \cs{c_false_bool}~|&&|.  In case~1, namely
+%   when the argument is \texttt{true} and we are in a normal state
+%   continue in the normal state~1.  In case~2, namely when skipping
+%   alternatives in an Or, continue in the same state.  When
+%   seeing~\verb"|" in case~0, continue in a normal state; in particular
+%   stop skipping for \cs{c_false_bool}~|&&| because that binds more
+%   tightly than~\verb"||".  In the other two cases start skipping for
+%   \cs{c_true_bool}~\verb"||".
 %    \begin{macrocode}
 \cs_new:Npn \@@_choose:NNN #1#2#3
   {
     \use:c
       {
-        @@_ #3 _
-        #1 #2 { \if_meaning:w 0 #2 1 \else: 0 \fi: }
-        :w
+        @@_ \token_to_str:N #3 _
+        #1 #2 { \if_meaning:w 0 #2 1 \else: 0 \fi: } 2 0 :
       }
   }
+\cs_new:cpn { @@_)_0: } { \c_false_bool }
+\cs_new:cpn { @@_)_1: } { \c_true_bool }
+\cs_new:cpn { @@_)_2: } { \c_true_bool }
+\cs_new:cpn { @@_&_0: } & { \@@_get_next:NN \use_iv:nnnn }
+\cs_new:cpn { @@_&_1: } & { \@@_get_next:NN \use_i:nnnn }
+\cs_new:cpn { @@_&_2: } & { \@@_get_next:NN \use_iii:nnnn }
+\cs_new:cpn { @@_|_0: } | { \@@_get_next:NN \use_i:nnnn }
+\cs_new:cpn { @@_|_1: } | { \@@_get_next:NN \use_iii:nnnn }
+\cs_new:cpn { @@_|_2: } | { \@@_get_next:NN \use_iii:nnnn }
 %    \end{macrocode}
 % \end{macro}
-%
-% \begin{macro}[aux]
-%   {
-%     \@@_)_0:w,
-%     \@@_)_1:w,
-%     \@@_S_0:w,
-%     \@@_S_1:w,
-%   }
-%   Closing a group is just about returning the result. The Stop
-%   operation is similar except it closes the special alignment group
-%   before returning the boolean.
-%    \begin{macrocode}
-\cs_new:cpn { @@_)_0:w } { \c_false_bool }
-\cs_new:cpn { @@_)_1:w } { \c_true_bool }
-\cs_new:cpn { @@_S_0:w } { \group_align_safe_end: \c_false_bool }
-\cs_new:cpn { @@_S_1:w } { \group_align_safe_end: \c_true_bool }
-%    \end{macrocode}
 % \end{macro}
-%
-% \begin{macro}[aux]+\@@_&_1:w+
-% \begin{macro}[aux]+\@@_|_0:w+
-%   Two cases where we simply continue scanning.  We must remove the
-%   second |&| or \verb"|".
-%    \begin{macrocode}
-\cs_new:cpn { @@_&_1:w } & { \@@_get_next:NN \use_i:nn }
-\cs_new:cpn { @@_|_0:w } | { \@@_get_next:NN \use_i:nn }
-%    \end{macrocode}
 % \end{macro}
 % \end{macro}
-%
-% \begin{macro}[aux]+\@@_&_0:w+
-% \begin{macro}[aux]+\@@_|_1:w+
-% \begin{macro}[aux]
-%   {
-%     \@@_eval_skip_to_end_auxi:Nw,
-%     \@@_eval_skip_to_end_auxii:Nw,
-%     \@@_eval_skip_to_end_auxiii:Nw
-%   }
-%   When the truth value has already been decided, we have to throw away
-%   the remainder of the current group as we are doing minimal
-%   evaluation. This is slightly tricky as there are no braces so we
-%   have to play match the |()| manually.
-%    \begin{macrocode}
-\cs_new:cpn { @@_&_0:w } &
-  { \@@_eval_skip_to_end_auxi:Nw \c_false_bool }
-\cs_new:cpn { @@_|_1:w } |
-  { \@@_eval_skip_to_end_auxi:Nw \c_true_bool }
-%    \end{macrocode}
-%   There is always at least one |)| waiting, namely the outer
-%   one. However, we are facing the problem that there may be more than
-%   one that need to be finished off and we have to detect the correct
-%   number of them. Here is a complicated example showing how this is
-%   done. After evaluating the following, we realize we must skip
-%   everything after the first And. Note the extra Close at the end.
-%   \begin{quote}
-%     |\c_false_bool  && ((abc) && xyz) && ((xyz) && (def)))|
-%   \end{quote}
-%   First read up to the first Close. This gives us the list we first
-%   read up until the first right parenthesis so we are looking at the
-%   token list
-%   \begin{quote}
-%     |((abc|
-%   \end{quote}
-%   This contains two Open markers so we must remove two groups. Since
-%   no evaluation of the contents is to be carried out, it doesn't
-%   matter how we remove the groups as long as we wind up with the
-%   correct result. We therefore first remove a |()| pair and what
-%   preceded the Open -- but leave the contents as it may contain Open
-%   tokens itself -- leaving
-%   \begin{quote}
-%     |(abc && xyz) && ((xyz) && (def)))|
-%   \end{quote}
-%   Another round of this gives us
-%   \begin{quote}
-%     |(abc && xyz|
-%   \end{quote}
-%   which still contains an Open so we remove another |()| pair, giving us
-%   \begin{quote}
-%     |abc && xyz && ((xyz) && (def)))|
-%   \end{quote}
-%   Again we read up to a Close and again find Open tokens:
-%   \begin{quote}
-%     |abc && xyz && ((xyz|
-%   \end{quote}
-%   Further reduction gives us
-%   \begin{quote}
-%     |(xyz && (def)))|
-%   \end{quote}
-%   and then
-%   \begin{quote}
-%     |(xyz && (def|
-%   \end{quote}
-%   with reduction to
-%   \begin{quote}
-%     |xyz && (def))|
-%   \end{quote}
-%   and ultimately we arrive at no Open tokens being skipped and we can
-%   finally close the group nicely.
-%    \begin{macrocode}
-%% (
-\cs_new:Npn \@@_eval_skip_to_end_auxi:Nw #1#2 )
-  {
-    \@@_eval_skip_to_end_auxii:Nw #1#2 ( % )
-    \q_no_value \q_stop
-    {#2}
-  }
-%    \end{macrocode}
-%   If no right parenthesis, then |#3| is no_value and we are done, return
-%   the boolean |#1|.  If there is, we need to grab a |()| pair and then
-%   recurse
-%    \begin{macrocode}
-\cs_new:Npn \@@_eval_skip_to_end_auxii:Nw #1#2 ( #3#4 \q_stop #5 % )
-  {
-    \quark_if_no_value:NTF #3
-    {#1}
-    { \@@_eval_skip_to_end_auxiii:Nw #1 #5 }
-  }
-%    \end{macrocode}
-%   Keep the boolean, throw away anything up to the |(| as it is
-%   irrelevant, remove a |()| pair but remember to reinsert |#3| as it may
-%   contain |(| tokens!
-%    \begin{macrocode}
-\cs_new:Npn \@@_eval_skip_to_end_auxiii:Nw #1#2 ( #3 )
-  { % (
-    \@@_eval_skip_to_end_auxi:Nw #1#3 )
-  }
-%    \end{macrocode}
 % \end{macro}
 % \end{macro}
 % \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
 %
 % \begin{macro}[pTF]{\bool_lazy_all:n}
 % \begin{macro}[aux]{\@@_lazy_all:n}
@@ -1510,6 +1384,7 @@
 %   pool. Also, it is considerably slower than what we use here so the
 %   few extra csnames are well spent I would say.
 %    \begin{macrocode}
+\__debug_patch_args:nNNpn { { (#1) } }
 \cs_new:Npn \prg_replicate:nn #1
   {
     \exp:w

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %
@@ -1441,9 +1441,16 @@
 %   \cs{__tl_build_one:o} by a single call to \cs{__tl_build_one:x}, because
 %   the \texttt{x}-expanding assignment may be interrupted by |\x|.
 %    \begin{macrocode}
+\__debug_patch:nnNNpn
+  {
+    \__debug_trace_push:nnN { regex } { 1 } \@@_escape_use:nnnn
+    \__tl_build:Nw \l_@@_internal_a_tl
+      \__tl_build_one:n { \__debug_trace_pop:nnN { regex } { 1 } \@@_escape_use:nnnn }
+      \use_none:nn
+  }
+  { }
 \cs_new_protected:Npn \@@_escape_use:nnnn #1#2#3#4
   {
-%<trace>    \trace_push:nnn { regex } { 1 } { @@_escape_use:nnnn }
     \__tl_build:Nw \l_@@_internal_a_tl
       \cs_set:Npn \@@_escape_unescaped:N ##1 { #1 }
       \cs_set:Npn \@@_escape_escaped:N ##1 { #2 }
@@ -1457,7 +1464,6 @@
         }
       \__tl_build_one:o \l_@@_internal_b_tl
     \__tl_build_end:
-%<trace>    \trace_pop:nnn { regex } { 1 } { @@_escape_use:nnnn }
     \l_@@_internal_a_tl
   }
 %    \end{macrocode}
@@ -3665,9 +3671,14 @@
     \@@_compile:n {#1}
     \@@_build:N \l_@@_internal_regex
   }
+\__debug_patch:nnNNpn
+  { \__debug_trace_push:nnN { regex } { 1 } \@@_build:N }
+  {
+    \@@_trace_states:n { 2 }
+    \__debug_trace_pop:nnN { regex } { 1 } \@@_build:N
+  }
 \cs_new_protected:Npn \@@_build:N #1
   {
-%<trace>    \trace_push:nnn { regex } { 1 } { @@_build }
     \@@_standard_escapechar:
     \int_zero:N \l_@@_capturing_group_int
     \int_set_eq:NN \l_@@_max_state_int \l_@@_min_state_int
@@ -3678,8 +3689,6 @@
     \@@_group:nnnN {#1} { 1 } { 0 } \c_false_bool
     \@@_toks_put_right:Nn \l_@@_right_state_int
       { \@@_action_success: }
-%<trace>    \@@_trace_states:n { 2 }
-%<trace>    \trace_pop:nnn { regex } { 1 } { @@_build }
   }
 %    \end{macrocode}
 % \end{macro}
@@ -3691,9 +3700,14 @@
 %   work properly at the outer level, we need to put the appropriate
 %   \texttt{left} and \texttt{right} states in their sequence.
 %    \begin{macrocode}
+\__debug_patch:nnNNpn
+  { \__debug_trace_push:nnN { regex } { 1 } \@@_build_for_cs:n }
+  {
+    \@@_trace_states:n { 2 }
+    \__debug_trace_pop:nnN { regex } { 1 } \@@_build_for_cs:n
+  }
 \cs_new_protected:Npn \@@_build_for_cs:n #1
   {
-%<trace>    \trace_push:nnn { regex } { 1 } { @@_build_for_cs }
     \int_set_eq:NN \l_@@_max_state_int \l_@@_min_state_int
     \@@_build_new_state:
     \@@_build_new_state:
@@ -3706,8 +3720,6 @@
           \exp_after:wN \@@_action_success:
         \fi:
       }
-%<trace>    \@@_trace_states:n { 2 }
-%<trace>    \trace_pop:nnn { regex } { 1 } { @@_build_for_cs }
   }
 %    \end{macrocode}
 % \end{macro}
@@ -3760,10 +3772,9 @@
 %   \texttt{right} state is the new empty state, and the \texttt{left}
 %   state points to the previously \enquote{current} state.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_build_new_state:
+\__debug_patch:nnNNpn
   {
-%<*trace>
-    \trace:nnx { regex } { 2 }
+    \__debug_trace:nnx { regex } { 2 }
       {
         regex~new~state~
         L=\int_use:N \l_@@_left_state_int ~ -> ~
@@ -3771,7 +3782,10 @@
         M=\int_use:N \l_@@_max_state_int ~ -> ~
         \int_eval:n { \l_@@_max_state_int + 1 }
       }
-%</trace>
+  }
+  { }
+\cs_new_protected:Npn \@@_build_new_state:
+  {
     \@@_toks_clear:N \l_@@_max_state_int
     \int_set_eq:NN \l_@@_left_state_int \l_@@_right_state_int
     \int_set_eq:NN \l_@@_right_state_int \l_@@_max_state_int
@@ -3924,9 +3938,11 @@
 %   auxiliaries expects \texttt{left_state} and \texttt{right_state} to
 %   be set properly.
 %    \begin{macrocode}
+\__debug_patch:nnNNpn
+  { \__debug_trace_push:nnN { regex } { 1 } \@@_group_aux:nnnnN }
+  { \__debug_trace_pop:nnN { regex } { 1 } \@@_group_aux:nnnnN }
 \cs_new_protected:Npn \@@_group_aux:nnnnN #1#2#3#4#5
   {
-%<trace>        \trace_push:nnn { regex } { 1 } { @@_group }
       \if_int_compare:w #3 = 0 \exp_stop_f:
         \@@_build_new_state:
 %<assert>\assert_int:n { \l_@@_max_state_int = \l_@@_right_state_int + 1 }
@@ -3942,7 +3958,6 @@
       \or:   \@@_group_repeat:nnN  {#1} {#3}      #5
       \else: \@@_group_repeat:nnnN {#1} {#3} {#4} #5
       \fi:
-%<trace>       \trace_pop:nnn { regex } { 1 } { @@_group }
   }
 %    \end{macrocode}
 % \end{macro}
@@ -4006,9 +4021,11 @@
 %   the group. The left and right states of the group are extracted from
 %   the relevant sequences.
 %    \begin{macrocode}
+\__debug_patch:nnNNpn
+  { \__debug_trace_push:nnN { regex } { 1 } \@@_branch:n }
+  { \__debug_trace_pop:nnN { regex } { 1 } \@@_branch:n }
 \cs_new_protected:Npn \@@_branch:n #1
   {
-%<trace>    \trace_push:nnn { regex } { 1 } { @@_branch }
     \@@_build_new_state:
     \seq_get:NN \l_@@_left_state_seq \l_@@_internal_a_tl
     \int_set:Nn \l_@@_left_state_int \l_@@_internal_a_tl
@@ -4018,7 +4035,6 @@
     \seq_get:NN \l_@@_right_state_seq \l_@@_internal_a_tl
     \@@_build_transition_right:nNn \@@_action_free:n
       \l_@@_right_state_int \l_@@_internal_a_tl
-%<trace>    \trace_pop:nnn { regex } { 1 } { @@_branch }
   }
 %    \end{macrocode}
 % \end{macro}
@@ -4492,6 +4508,7 @@
 % \subsubsection{Matching: framework}
 %
 % \begin{macro}[int]{\@@_match:n}
+% \begin{macro}[aux]{\@@_match_init:}
 %   First store the query into \tn{toks} registers and arrays (see
 %   \cs{@@_query_set:nnn}). Then initialize the variables that should
 %   be set once for each user function (even for multiple
@@ -4502,10 +4519,14 @@
 %   smothering an empty match at the start). Once all this is set up, we
 %   are ready for the ride. Find the first match.
 %    \begin{macrocode}
+\__debug_patch:nnNNpn
+  {
+    \__debug_trace_push:nnN { regex } { 1 } \@@_match:n
+    \__debug_trace:nnx { regex } { 1 } { analyzing~query~token~list }
+  }
+  { \__debug_trace_pop:nnN { regex } { 1 } \@@_match:n }
 \cs_new_protected:Npn \@@_match:n #1
   {
-%<trace>    \trace_push:nnx { regex } { 1 } { @@_match }
-%<trace>    \trace:nnx { regex } { 1 } { analyzing~query~token~list }
     \int_zero:N \l_@@_balance_int
     \int_set:Nn \l_@@_curr_pos_int { 2 * \l_@@_max_state_int }
     \@@_query_set:nnn { } { -1 } { -2 }
@@ -4514,7 +4535,14 @@
       { \@@_query_set:nnn {##1} {"##2} {##3} }
     \int_set_eq:NN \l_@@_max_pos_int \l_@@_curr_pos_int
     \@@_query_set:nnn { } { -1 } { -2 }
-%<trace>    \trace:nnx { regex } { 1 } { initializing }
+    \@@_match_init:
+    \@@_match_once:
+  }
+\__debug_patch:nnNNpn
+  { \__debug_trace:nnx { regex } { 1 } { initializing } }
+  { }
+\cs_new_protected:Npn \@@_match_init:
+  {
     \bool_gset_false:N \g_@@_success_bool
     \int_step_inline:nnnn
       \l_@@_min_state_int { 1 } { \l_@@_max_state_int - 1 }
@@ -4526,11 +4554,10 @@
       { 2 * \l_@@_max_state_int }
     \int_set_eq:NN \l_@@_submatch_int \l_@@_min_submatch_int
     \bool_set_false:N \l_@@_empty_success_bool
-    \@@_match_once:
-%<trace>    \trace_pop:nnx { regex } { 1 } { @@_match }
   }
 %    \end{macrocode}
 % \end{macro}
+% \end{macro}
 %
 % \begin{macro}[int]{\@@_match_once:}
 %   This function finds one match, then does some action defined by the
@@ -4692,11 +4719,11 @@
 %   state is marked as $\texttt{step}+1$: any thread hitting it at that
 %   point will be terminated.
 %    \begin{macrocode}
+\__debug_patch:nnNNpn
+  { \__debug_trace:nnx { regex } { 2 } { state~\int_use:N \l_@@_curr_state_int } }
+  { }
 \cs_new_protected:Npn \@@_use_state:
   {
-%<*trace>
-    \trace:nnx { regex } { 2 } { state~\int_use:N \l_@@_curr_state_int }
-%</trace>
     \__intarray_gset_fast:Nnn \g_@@_state_active_intarray
       { \l_@@_curr_state_int } { \l_@@_step_int }
     \@@_toks_use:w \l_@@_curr_state_int
@@ -5056,9 +5083,11 @@
 %   parsed, make sure that there is no open csname. Finally, define the
 %   \texttt{balance_one_match} and \texttt{do_one_match} functions.
 %    \begin{macrocode}
+\__debug_patch:nnNNpn
+  { \__debug_trace_push:nnN { regex } { 1 } \@@_replacement:n }
+  { \__debug_trace_pop:nnN { regex } { 1 } \@@_replacement:n }
 \cs_new_protected:Npn \@@_replacement:n #1
   {
-%<trace>    \trace_push:nnn { regex } { 1 } { @@_replacement:n }
     \__tl_build:Nw \l_@@_internal_a_tl
       \int_zero:N \l_@@_balance_int
       \tl_clear:N \l_@@_balance_tl
@@ -5095,7 +5124,6 @@
         }
     \__tl_build_end:
     \exp_args:No \@@_replacement_aux:n \l_@@_internal_a_tl
-%<trace>    \trace_pop:nnn { regex } { 1 } { @@_replacement:n }
   }
 \cs_new_protected:Npn \@@_replacement_aux:n #1
   {
@@ -6435,27 +6463,60 @@
 %
 % \subsection{Code for tracing}
 %
-% The tracing code is still very experimental, and is meant to be used
-% with the \pkg{l3trace} package, currently in \texttt{l3trial}.
+% There is a more extensive implementation of tracing in the l3trial
+% package \pkg{l3trace}.  Function names are a bit different but could
+% be merged.
 %
+% \begin{macro}[int]
+%   {\__debug_trace_push:nnN, \__debug_trace_pop:nnN, \__debug_trace:nnx}
+%   Here |#1| is the module name (\texttt{regex}) and |#2| is
+%   typically~1.  If the module's current tracing level is less than
+%   |#2| show nothing, otherwise write |#3| to the terminal.
+%    \begin{macrocode}
+\__debug:TF
+  {
+    \cs_new_protected:Npn \__debug_trace_push:nnN #1#2#3
+      { \__debug_trace:nnx {#1} {#2} { entering~ \token_to_str:N #3 } }
+    \cs_new_protected:Npn \__debug_trace_pop:nnN #1#2#3
+      { \__debug_trace:nnx {#1} {#2} { leaving~ \token_to_str:N #3 } }
+    \cs_new_protected:Npn \__debug_trace:nnx #1#2#3
+      {
+        \int_compare:nNnF
+          { \int_use:c { g__debug_trace_#1_int } } < {#2}
+          { \iow_term:x { Trace:~#3 } }
+      }
+  }
+  { }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{variable}{\g__debug_trace_regex_int}
+%   No tracing when that is zero.
+%    \begin{macrocode}
+\int_new:N \g__debug_trace_regex_int
+%    \end{macrocode}
+% \end{variable}
+%
 % \begin{macro}[int]{\@@_trace_states:n}
 %   This function lists the contents of all states of the \textsc{nfa},
 %   stored in \tn{toks} from $0$ to \cs{l_@@_max_state_int}
 %   (excluded).
 %    \begin{macrocode}
-%<*trace>
-\cs_new_protected:Npn \@@_trace_states:n #1
+\__debug:TF
   {
-    \int_step_inline:nnnn
-      \l_@@_min_state_int
-      { 1 }
-      { \l_@@_max_state_int - 1 }
+    \cs_new_protected:Npn \@@_trace_states:n #1
       {
-        \trace:nnx { regex } { #1 }
-          { \iow_char:N \\toks ##1 = { \@@_toks_use:w ##1 } }
+        \int_step_inline:nnnn
+          \l_@@_min_state_int
+          { 1 }
+          { \l_@@_max_state_int - 1 }
+          {
+            \__debug_trace:nnx { regex } {#1}
+              { \iow_char:N \\toks ##1 = { \@@_toks_use:w ##1 } }
+          }
       }
   }
-%</trace>
+  { }
 %    \end{macrocode}
 % \end{macro}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %
@@ -1110,6 +1110,7 @@
 % \begin{macro}{\dim_gset:Nn, \dim_gset:cn}
 %   Setting dimensions is easy enough.
 %    \begin{macrocode}
+\__debug_patch_args:nNNpn { {#1} { (#2) } }
 \cs_new_protected:Npn \dim_set:Nn #1#2
   { #1 ~ \@@_eval:w #2 \@@_eval_end: }
 \cs_new_protected:Npn \dim_gset:Nn { \tex_global:D \dim_set:Nn }
@@ -1140,11 +1141,13 @@
 % \begin{macro}{\dim_gsub:Nn, \dim_gsub:cn}
 %   Using |by| here deals with the (incorrect) case |\dimen123|.
 %    \begin{macrocode}
+\__debug_patch_args:nNNpn { {#1} { (#2) } }
 \cs_new_protected:Npn \dim_add:Nn #1#2
   { \tex_advance:D #1 by \@@_eval:w #2 \@@_eval_end: }
 \cs_new_protected:Npn \dim_gadd:Nn { \tex_global:D \dim_add:Nn }
 \cs_generate_variant:Nn \dim_add:Nn  { c }
 \cs_generate_variant:Nn \dim_gadd:Nn { c }
+\__debug_patch_args:nNNpn { {#1} { (#2) } }
 \cs_new_protected:Npn \dim_sub:Nn #1#2
   { \tex_advance:D #1 by - \@@_eval:w #2 \@@_eval_end: }
 \cs_new_protected:Npn \dim_gsub:Nn { \tex_global:D \dim_sub:Nn }
@@ -1169,6 +1172,7 @@
 %   Functions for $\min$, $\max$, and absolute value with only one evaluation.
 %   The absolute value is evaluated by removing a leading~|-| if present.
 %    \begin{macrocode}
+\__debug_patch_args:nNNpn { { (#1) } }
 \cs_new:Npn \dim_abs:n #1
   {
     \exp_after:wN \@@_abs:N
@@ -1176,6 +1180,7 @@
   }
 \cs_new:Npn \@@_abs:N #1
   { \if_meaning:w - #1 \else: \exp_after:wN #1 \fi: }
+\__debug_patch_args:nNNpn { { (#1) } { (#2) } }
 \cs_new:Npn \dim_max:nn #1#2
   {
     \dim_use:N \@@_eval:w \exp_after:wN \@@_maxmin:wwN
@@ -1184,6 +1189,7 @@
       >
     \@@_eval_end:
   }
+\__debug_patch_args:nNNpn { { (#1) } { (#2) } }
 \cs_new:Npn \dim_min:nn #1#2
   {
     \dim_use:N \@@_eval:w \exp_after:wN \@@_maxmin:wwN
@@ -1227,6 +1233,7 @@
 % \begin{macro}[pTF, EXP]{\dim_compare:nNn}
 %   Simple comparison.
 %    \begin{macrocode}
+\__debug_patch_conditional_args:nNNpnn { { (#1) \@@_eval_end: } {#2} { (#3) } }
 \prg_new_conditional:Npnn \dim_compare:nNn #1#2#3 { p , T , F , TF }
   {
     \if_dim:w \@@_eval:w #1 #2 \@@_eval:w #3 \@@_eval_end:
@@ -1426,6 +1433,7 @@
 % \begin{macro}{\dim_eval:n}
 %   Evaluating a dimension expression expandably.
 %    \begin{macrocode}
+\__debug_patch_args:nNNpn { { (#1) } }
 \cs_new:Npn \dim_eval:n #1
   { \dim_use:N \@@_eval:w #1 \@@_eval_end: }
 %    \end{macrocode}
@@ -1447,15 +1455,16 @@
 % \begin{macro}[EXP, aux]{\@@_to_decimal:w}
 %   A function which comes up often enough to deserve a place in the
 %   kernel.  Evaluate the dimension expression~|#1| then remove the
-%   trailing \texttt{pt}.  The argument is put in parentheses as this
-%   prevents the dimension expression from terminating early and leaving
-%   extra tokens lying around.  This is used a lot by low-level
-%   manipulations.
+%   trailing \texttt{pt}.  When debugging is enabled, the argument is
+%   put in parentheses as this prevents the dimension expression from
+%   terminating early and leaving extra tokens lying around.  This is
+%   used a lot by low-level manipulations.
 %    \begin{macrocode}
+\__debug_patch_args:nNNpn { { (#1) } }
 \cs_new:Npn \dim_to_decimal:n #1
   {
     \exp_after:wN
-      \@@_to_decimal:w \dim_use:N \@@_eval:w (#1) \@@_eval_end:
+      \@@_to_decimal:w \dim_use:N \@@_eval:w #1 \@@_eval_end:
   }
 \use:x
   {
@@ -1486,6 +1495,7 @@
 %   Another hard-coded conversion: this one is necessary to avoid things going
 %   off-scale.
 %    \begin{macrocode}
+\__debug_patch_args:nNNpn { { (#1) } }
 \cs_new:Npn \dim_to_decimal_in_sp:n #1
   { \int_eval:n { \@@_eval:w #1 \@@_eval_end: } }
 %    \end{macrocode}
@@ -1635,6 +1645,7 @@
 % \begin{macro}{\skip_gset:Nn, \skip_gset:cn}
 %   Much the same as for dimensions.
 %    \begin{macrocode}
+\__debug_patch_args:nNNpn { {#1} { (#2) } }
 \cs_new_protected:Npn \skip_set:Nn #1#2
   { #1 ~ \etex_glueexpr:D #2 \scan_stop: }
 \cs_new_protected:Npn \skip_gset:Nn { \tex_global:D \skip_set:Nn }
@@ -1666,11 +1677,13 @@
 % \begin{macro}{\skip_gsub:Nn, \skip_gsub:cn}
 %   Using |by| here deals with the (incorrect) case |\skip123|.
 %    \begin{macrocode}
+\__debug_patch_args:nNNpn { {#1} { (#2) } }
 \cs_new_protected:Npn \skip_add:Nn #1#2
   { \tex_advance:D #1 by \etex_glueexpr:D #2 \scan_stop: }
 \cs_new_protected:Npn \skip_gadd:Nn { \tex_global:D \skip_add:Nn }
 \cs_generate_variant:Nn \skip_add:Nn  { c }
 \cs_generate_variant:Nn \skip_gadd:Nn { c }
+\__debug_patch_args:nNNpn { {#1} { (#2) } }
 \cs_new_protected:Npn \skip_sub:Nn #1#2
   { \tex_advance:D #1 by - \etex_glueexpr:D #2 \scan_stop: }
 \cs_new_protected:Npn \skip_gsub:Nn { \tex_global:D \skip_sub:Nn }
@@ -1713,6 +1726,7 @@
 %    \begin{macrocode}
 \cs_set_protected:Npn \__cs_tmp:w #1
   {
+    \__debug_patch_conditional_args:nNNpnn { { (##1) } }
     \prg_new_conditional:Npnn \skip_if_finite:n ##1 { p , T , F , TF }
       {
         \exp_after:wN \__skip_if_finite:wwNw
@@ -1731,6 +1745,7 @@
 % \begin{macro}{\skip_eval:n}
 %   Evaluating a skip expression expandably.
 %    \begin{macrocode}
+\__debug_patch_args:nNNpn { { (#1) } }
 \cs_new:Npn \skip_eval:n #1
   { \skip_use:N \etex_glueexpr:D #1 \scan_stop: }
 %    \end{macrocode}
@@ -1752,9 +1767,11 @@
 %    Inserting skips.
 %    \begin{macrocode}
 \cs_new_eq:NN  \skip_horizontal:N \tex_hskip:D
+\__debug_patch_args:nNNpn { { (#1) } }
 \cs_new:Npn \skip_horizontal:n #1
   { \skip_horizontal:N \etex_glueexpr:D #1 \scan_stop: }
 \cs_new_eq:NN  \skip_vertical:N \tex_vskip:D
+\__debug_patch_args:nNNpn { { (#1) } }
 \cs_new:Npn \skip_vertical:n #1
   { \skip_vertical:N \etex_glueexpr:D #1 \scan_stop: }
 \cs_generate_variant:Nn \skip_horizontal:N { c }
@@ -1892,6 +1909,7 @@
 % \begin{macro}{\muskip_gset:Nn, \muskip_gset:cn}
 %   This should be pretty familiar.
 %    \begin{macrocode}
+\__debug_patch_args:nNNpn { {#1} { (#2) } }
 \cs_new_protected:Npn \muskip_set:Nn #1#2
   { #1 ~ \etex_muexpr:D #2 \scan_stop: }
 \cs_new_protected:Npn \muskip_gset:Nn { \tex_global:D \muskip_set:Nn }
@@ -1929,11 +1947,13 @@
 % \begin{macro}{\muskip_gsub:Nn, \muskip_gsub:cn}
 %   Using |by| here deals with the (incorrect) case |\muskip123|.
 %    \begin{macrocode}
+\__debug_patch_args:nNNpn { {#1} { (#2) } }
 \cs_new_protected:Npn \muskip_add:Nn #1#2
   { \tex_advance:D #1 by \etex_muexpr:D #2 \scan_stop: }
 \cs_new_protected:Npn \muskip_gadd:Nn { \tex_global:D \muskip_add:Nn }
 \cs_generate_variant:Nn \muskip_add:Nn  { c }
 \cs_generate_variant:Nn \muskip_gadd:Nn { c }
+\__debug_patch_args:nNNpn { {#1} { (#2) } }
 \cs_new_protected:Npn \muskip_sub:Nn #1#2
   { \tex_advance:D #1 by - \etex_muexpr:D #2 \scan_stop: }
 \cs_new_protected:Npn \muskip_gsub:Nn { \tex_global:D \muskip_sub:Nn }
@@ -1950,6 +1970,7 @@
 % \begin{macro}{\muskip_eval:n}
 %   Evaluating a muskip expression expandably.
 %    \begin{macrocode}
+\__debug_patch_args:nNNpn { { (#1) } }
 \cs_new:Npn \muskip_eval:n #1
   { \muskip_use:N \etex_muexpr:D #1 \scan_stop: }
 %    \end{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %
@@ -1078,24 +1078,10 @@
 % \begin{macro}[deprecated = 2018-12-31]{\sort_ordered:, \sort_reversed:}
 %   These functions were renamed for consistency.
 %    \begin{macrocode}
-\cs_new_protected:Npn \sort_ordered:
-  {
-    \__msg_kernel_warning:nnxxx { kernel } { deprecated-command }
-      { 2018-12-31 }
-      { \token_to_str:N \sort_ordered: }
-      { \token_to_str:N \sort_return_same: }
-    \cs_gset_eq:NN \sort_ordered: \sort_return_same:
-    \sort_return_same:
-  }
-\cs_new_protected:Npn \sort_reversed:
-  {
-    \__msg_kernel_warning:nnxxx { kernel } { deprecated-command }
-      { 2018-12-31 }
-      { \token_to_str:N \sort_reversed: }
-      { \token_to_str:N \sort_return_swapped: }
-    \cs_gset_eq:NN \sort_reversed: \sort_return_swapped:
-    \sort_return_swapped:
-  }
+\__debug_deprecation:nnNNpn { 2018-12-31 } { \sort_return_same: }
+\cs_new_protected:Npn \sort_ordered: { \sort_return_same: }
+\__debug_deprecation:nnNNpn { 2018-12-31 } { \sort_return_swapped: }
+\cs_new_protected:Npn \sort_reversed: { \sort_return_swapped: }
 %    \end{macrocode}
 % \end{macro}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %
@@ -271,7 +271,7 @@
 %   \end{syntax}
 %   This function compares the \meta{test string} in turn with each
 %   of the \meta{string cases}. If the two are equal (as described for
-%   \cs{str_if_eq:nnTF} then the associated \meta{code} is left in the
+%   \cs{str_if_eq:nnTF}) then the associated \meta{code} is left in the
 %   input stream and other cases are discarded. If any of the
 %   cases are matched, the \meta{true code} is also inserted into the
 %   input stream (after the code for the appropriate case), while if none
@@ -280,7 +280,7 @@
 %   available.
 % \end{function}
 %
-% \begin{function}[added = 2013-07-24, EXP, TF]{\str_case_x:nn}
+% \begin{function}[added = 2013-07-24, EXP, noTF]{\str_case_x:nn}
 %   \begin{syntax}
 %     \cs{str_case_x:nnTF} \Arg{test string} \\
 %     ~~|{| \\
@@ -294,7 +294,7 @@
 %   \end{syntax}
 %   This function compares the full expansion of the \meta{test string}
 %   in turn with the full expansion of the \meta{string cases}. If the two
-%   full expansions are equal (as described for \cs{str_if_eq:nnTF} then the
+%   full expansions are equal (as described for \cs{str_if_eq:nnTF}) then the
 %   associated \meta{code} is left in the input stream
 %   and other cases are discarded.  If any of the
 %   cases are matched, the \meta{true code} is also inserted into the
@@ -1049,6 +1049,7 @@
   }
 \cs_new:Npn \str_item_ignore_spaces:nn #1
   { \exp_args:No \@@_item:nn { \tl_to_str:n {#1} } }
+\__debug_patch_args:nNNpn { {#1} { (#2) } }
 \cs_new:Npn \@@_item:nn #1#2
   {
     \exp_after:wN \@@_item:w
@@ -1145,6 +1146,7 @@
   }
 \cs_new:Npn \str_range_ignore_spaces:nnn #1
   { \exp_args:No \@@_range:nnn { \tl_to_str:n {#1} } }
+\__debug_patch_args:nNNpn { {#1} { (#2) } { (#3) } }
 \cs_new:Npn \@@_range:nnn #1#2#3
   {
     \exp_after:wN \@@_range:w

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %
@@ -313,12 +313,8 @@
 % The whole process takes linear time, because we avoid building the
 % result one item at a time.
 %
-% To ease the difficult first pass, we first do some setup with
-% \cs{@@_setup:n}. Active characters set equal to non-active
-% characters cause trouble, so we disable all active characters by
-% setting them equal to \texttt{undefined} locally. We also set there
-% the escape character to be printable (backslash, but this later
-% oscillates between slash and backslash): this makes it possible to
+% We make the escape character printable (backslash, but this later
+% oscillates between slash and backslash): this allows us to
 % distinguish characters from control sequences.
 %
 % A token has two characteristics: its \tn{meaning}, and what it looks
@@ -339,7 +335,7 @@
 %   \item a non-active character, in which case its meaning is
 %     automatically that associated to its character code and category
 %     code, we call it \enquote{true} character;
-%   \item an active character (we eliminate those in the setup step);
+%   \item an active character;
 %   \item a control sequence.
 % \end{itemize}
 % The only tokens which are not valid \texttt{N}-type arguments are true
@@ -360,7 +356,6 @@
   {
     \group_begin:
       \group_align_safe_begin:
-        \@@_setup:n {#1}
         \@@_a:n {#1}
         \@@_b:n {#1}
       \group_align_safe_end:
@@ -369,54 +364,36 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \subsection{Setup}
+% \subsection{Disabling active characters}
 %
-% \begin{macro}[int]{\@@_setup:n}
-% \begin{macro}[aux]{\@@_disable_loop:N}
-%   Active characters can cause problems later on in the processing,
-%   so the first step is to disable them, by setting them to
-%   \texttt{undefined}. Since Unicode contains too many characters
-%   to loop over all of them, we instead loop over the input token
-%   list as a string: any active character in the token list
-%   must appear in its string representation. The string is shortened
-%   a little by making the escape character unprintable. The active
-%   space must be disabled separately (the loop skips over it otherwise),
-%   and we end the loop by feeding an odd non-\texttt{N}-type argument
-%   to the looping macro.  For \pTeX{} and \upTeX{} we skip characters
-%   beyond $[0,255]$ because \tn{lccode} only allows those values.
+% \begin{macro}[aux]{\@@_disable:n}
+%   Active characters can cause problems later on in the processing, so
+%   we provide a way to disable them, by setting them to
+%   \texttt{undefined}. Since Unicode contains too many characters to
+%   loop over all of them, we instead do this whenever we encounter a
+%   character.  For \pTeX{} and \upTeX{} we skip characters beyond
+%   $[0,255]$ because \tn{lccode} only allows those values.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_setup:n #1
-  {
-    \int_set:Nn \tex_escapechar:D { -1 }
-    \exp_after:wN \@@_disable_loop:N
-      \tl_to_str:n {#1} { ~ } { ? \__prg_break: }
-    \__prg_break_point:
-    \scan_stop:
-  }
 \group_begin:
   \char_set_catcode_active:N \^^@
-  \cs_new_protected:Npn \@@_disable_loop:N #1
+  \cs_new_protected:Npn \@@_disable:n #1
     {
-      \tex_lccode:D 0 = `#1 ~
+      \tex_lccode:D 0 = #1 \exp_stop_f:
       \tex_lowercase:D { \tex_let:D ^^@ } \tex_undefined:D
-      \@@_disable_loop:N
     }
   \cs_if_exist:NT \ptex_kanjiskip:D
     {
-      \cs_gset_protected:Npn \@@_disable_loop:N #1
+      \cs_gset_protected:Npn \@@_disable:n #1
         {
-          \use_none:n #1 \scan_stop:
-          \if_int_compare:w 256 > `#1 \exp_stop_f:
-            \tex_lccode:D 0 = `#1 ~
+          \if_int_compare:w 256 > #1 \exp_stop_f:
+            \tex_lccode:D 0 = #1 \exp_stop_f:
             \tex_lowercase:D { \tex_let:D ^^@ } \tex_undefined:D
           \fi:
-          \@@_disable_loop:N
         }
     }
 \group_end:
 %    \end{macrocode}
 % \end{macro}
-% \end{macro}
 %
 % \subsection{First pass}
 %
@@ -425,7 +402,7 @@
 % Also, we wish to store some representation of each special token
 % in a \tn{toks} register.
 %
-% After the setup step, we have $11$ types of tokens:
+% We have $11$ types of tokens:
 % \begin{itemize}
 % \item[1.] a true non-space begin-group character;
 % \item[2.] a true space begin-group character;
@@ -432,7 +409,7 @@
 % \item[3.] a true non-space end-group character;
 % \item[4.] a true space end-group character;
 % \item[5.] a true space blank space character;
-% \item[6.] an undefined active character;
+% \item[6.] an active character;
 % \item[7.] any other true character;
 % \item[8.] a control sequence equal to a begin-group token (category code $1$);
 % \item[9.] a control sequence equal to an end-group token (category code $2$);
@@ -463,6 +440,7 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_a:n #1
   {
+    \@@_disable:n { 32 }
     \int_set:Nn \tex_escapechar:D { 92 }
     \int_zero:N \l_@@_normal_int
     \int_zero:N \l_@@_index_int
@@ -484,7 +462,7 @@
 % \begin{macro}[int]{\@@_a_type:w}
 %   At this point, \cs{l_@@_token} holds the meaning
 %   of the following token. We store in \cs{l_@@_type_int}
-%   the meaning of the token ahead:
+%   information about the meaning of the token ahead:
 %   \begin{itemize}
 %   \item 0 space token;
 %   \item 1 begin-group token;
@@ -528,17 +506,18 @@
 % \begin{macro}[int]{\@@_a_space:w}
 % \begin{macro}[aux]{\@@_a_space_test:w}
 %   In this branch, the following token's meaning is a blank space.
-%   Apply \tn{string} to that token: if it is a control sequence
-%   the result starts with the escape character; otherwise it is
-%   a true blank space, whose string representation is also a blank space.
-%   We test for that in \cs{@@_a_space_test:w},
-%   after grabbing as \cs{l_@@_char_token} the first character
-%   of the string representation.
+%   Apply \tn{string} to that token: a true blank space gives a space, a
+%   control sequence gives a result starting with the escape character,
+%   an active character gives something else than a space since we
+%   disabled the space.  We grab as \cs{l_@@_char_token} the first
+%   character of the string representation then test it in
+%   \cs{@@_a_space_test:w}.
 %   Also, since \cs{@@_a_store:} expects the special token to be
 %   stored in the relevant \tn{toks} register, we do that. The extra
 %   \cs{exp_not:n} is unnecessary of course, but it makes the treatment
 %   of all tokens more homogeneous.
 %   If we discover that the next token was actually a control sequence
+%   or an active character
 %   instead of a true space, then we step the counter of normal tokens.
 %   We now have in front of us the whole string representation of
 %   the control sequence, including potential spaces; those will appear
@@ -569,29 +548,29 @@
 % \end{macro}
 %
 % \begin{macro}[int]{\@@_a_bgroup:w, \@@_a_egroup:w}
-% \begin{macro}[aux]{\@@_a_group:nw}
-% \begin{macro}[aux]{\@@_a_group_test:w}
-%   The token might be either a true character token with
-%   catcode $1$ or $2$, or it could be a control sequence.
-%   The only tricky case is if the character code happens
-%   to be equal to the escape character: then we change
-%   the escape character from backslash to solidus or back,
-%   so that the string representation of the true character
-%   and of a control sequence set equal to it start differently.
-%   Then probe what the first character of that string
-%   representation is: this is the place where we need
-%   \cs{l_@@_char_token} to be a separate control
-%   sequence from \cs{l_@@_token}, to compare them.
+% \begin{macro}[aux]
+%   {\@@_a_group:nw, \@@_a_group_aux:w, \@@_a_group_auxii:w, \@@_a_group_test:w}
+%   The token is most likely a true character token with catcode $1$ or
+%   $2$, but it might be a control sequence, or an active character.
+%   Optimizing for the first case, we store in a toks register some code
+%   that expands to that token.  Since we will turn what follows into
+%   a string, we make sure the escape character is different from the
+%   current character code (by switching between solidus and backslash).
+%   To detect the special case of an active character let to the catcode
+%   $1$ or~$2$ character with the same character code, we disable the
+%   active character with that character code and re-test: if the
+%   following token has become undefined we can in fact safely grab it.
+%   We are finally ready to turn what follows to a string and test it.
+%   This is one place where we need \cs{l_@@_char_token} to be a
+%   separate control sequence from \cs{l_@@_token}, to compare them.
 %    \begin{macrocode}
 \group_begin:
-  \char_set_catcode_group_begin:N \^^@
-  \char_set_catcode_group_end:N \^^E
+  \char_set_catcode_group_begin:N \^^@ % {
   \cs_new_protected:Npn \@@_a_bgroup:w
-    { \@@_a_group:nw { \exp_after:wN ^^@ \if_false: ^^E \fi: } }
-  \char_set_catcode_group_begin:N \^^B
+    { \@@_a_group:nw { \exp_after:wN ^^@ \if_false: } \fi: } }
   \char_set_catcode_group_end:N \^^@
   \cs_new_protected:Npn \@@_a_egroup:w
-    { \@@_a_group:nw { \if_false: ^^B \fi: ^^@ } }
+    { \@@_a_group:nw { \if_false: { \fi: ^^@ } } % }
 \group_end:
 \cs_new_protected:Npn \@@_a_group:nw #1
   {
@@ -600,6 +579,19 @@
     \if_int_compare:w \tex_lccode:D 0 = \tex_escapechar:D
       \int_set:Nn \tex_escapechar:D { 139 - \tex_escapechar:D }
     \fi:
+    \@@_disable:n { \tex_lccode:D 0 }
+    \tex_futurelet:D \l_@@_token \@@_a_group_aux:w
+  }
+\cs_new_protected:Npn \@@_a_group_aux:w
+  {
+    \if_meaning:w \l_@@_token \tex_undefined:D
+      \exp_after:wN \@@_a_safe:N
+    \else:
+      \exp_after:wN \@@_a_group_auxii:w
+    \fi:
+  }
+\cs_new_protected:Npn \@@_a_group_auxii:w
+  {
     \tex_afterassignment:D \@@_a_group_test:w
     \exp_after:wN \cs_set_eq:NN
     \exp_after:wN \l_@@_char_token
@@ -617,7 +609,6 @@
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
-% \end{macro}
 %
 % \begin{macro}[int]{\@@_a_store:}
 %   This function is called each time we meet a special token;
@@ -643,17 +634,17 @@
 %   \item 2 space begin-group character.
 %   \end{itemize}
 %   This has the property that non-space characters correspond to odd
-%   values of \cs{l_@@_type_int}.
-%   The number of normal tokens, and the type of special token,
-%   are packed into a \tn{skip} register.
-%   Finally, we check whether we reached the last closing brace, in which
-%   case we stop by disabling the looping function (locally).
+%   values of \cs{l_@@_type_int}.  The number of normal tokens until
+%   here and the type of special token are packed into a \tn{skip}
+%   register.  Finally, we check whether we reached the last closing
+%   brace, in which case we stop by disabling the looping function
+%   (locally).
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_a_store:
   {
     \tex_advance:D \l_@@_nesting_int \l_@@_type_int
     \if_int_compare:w \tex_lccode:D 0 = `\ \exp_stop_f:
-      \tex_multiply:D \l_@@_type_int 2 \exp_stop_f:
+      \tex_advance:D \l_@@_type_int \l_@@_type_int
     \fi:
     \tex_skip:D \l_@@_index_int
       = \l_@@_normal_int sp plus \l_@@_type_int sp \scan_stop:
@@ -669,11 +660,11 @@
 % \begin{macro}[int]{\@@_a_safe:N}
 % \begin{macro}[aux]{\@@_a_cs:ww}
 %   This should be the simplest case: since the upcoming token is safe,
-%   we can simply grab it in a second pass. However, other branches of
-%   the code must pass their tokens through \tn{string}, hence we do it
-%   here as well, with some optimizations. If the token is a single
+%   we can simply grab it in a second pass. If the token is a single
 %   character (including space), the \cs{if_charcode:w} test yields
-%   true, and we simply count one \enquote{normal} token. On the other
+%   true; we disable a potentially active character (that could
+%   otherwise masquerade as the true character in the next pass) and we
+%   count one \enquote{normal} token. On the other
 %   hand, if the token is a control sequence, we should replace it by
 %   its string representation for compatibility with other code
 %   branches. Instead of slowly looping through the characters with
@@ -692,10 +683,15 @@
         \scan_stop:
         \exp_after:wN \use_none:n \token_to_str:N #1 \prg_do_nothing:
         \scan_stop:
-      \int_incr:N \l_@@_normal_int
+      \exp_after:wN \use_i:nn
     \else:
-      \@@_cs_space_count:NN \@@_a_cs:ww #1
+      \exp_after:wN \use_ii:nn
     \fi:
+      {
+        \@@_disable:n { `#1 }
+        \int_incr:N \l_@@_normal_int
+      }
+      { \@@_cs_space_count:NN \@@_a_cs:ww #1 }
     \@@_a_loop:w
   }
 \cs_new_protected:Npn \@@_a_cs:ww #1; #2;
@@ -704,10 +700,10 @@
       \tex_skip:D \l_@@_index_int
         = \__int_eval:w \l_@@_normal_int + 1 sp \scan_stop:
       \tex_advance:D \l_@@_index_int #1 \exp_stop_f:
-      \l_@@_normal_int #2 \exp_stop_f:
     \else:
-      \tex_advance:D \l_@@_normal_int #2 \exp_stop_f:
+      \tex_advance:D
     \fi:
+    \l_@@_normal_int #2 \exp_stop_f:
   }
 %    \end{macrocode}
 % \end{macro}
@@ -753,8 +749,9 @@
 %   character to a printable value). In both cases, we leave
 %   \cs{exp_not:n} \Arg{token} \cs{s__tl} in the input stream
 %   (after \texttt{x}-expansion). Here, \cs{exp_not:n} is used
-%   rather than \cs{exp_not:N} because |#3| could be \cs{s__tl},
-%   hence must be hidden behind braces in the result.
+%   rather than \cs{exp_not:N} because |#3| could be
+%   a macro parameter character or could be \cs{s__tl}
+%   (which must be hidden behind braces in the result).
 %    \begin{macrocode}
 \cs_new:Npn \@@_b_normals:ww #1;
   {
@@ -861,7 +858,7 @@
       \fi:
       \tex_the:D \tex_toks:D #1 \s__tl
       \if_case:w \etex_gluestretch:D \tex_skip:D #1 \exp_stop_f:
-             A
+             \token_to_str:N A
       \or:   1
       \or:   1
       \else: 2

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %
@@ -1160,14 +1160,14 @@
 \tex_ifodd:D \l at expl@enable at debug@bool
   \cs_new_protected:Npn \tl_set_eq:NN #1#2
     {
-      \__chk_if_exist_var:N #1
-      \__chk_if_exist_var:N #2
+      \__debug_chk_var_exist:N #1
+      \__debug_chk_var_exist:N #2
       \cs_set_eq:NN #1 #2
     }
   \cs_new_protected:Npn \tl_gset_eq:NN #1#2
     {
-      \__chk_if_exist_var:N #1
-      \__chk_if_exist_var:N #2
+      \__debug_chk_var_exist:N #1
+      \__debug_chk_var_exist:N #2
       \cs_gset_eq:NN #1 #2
     }
 \else:
@@ -1186,20 +1186,20 @@
 %   three arguments must be checked: a token list |#2| or |#3| equal to
 %   \cs{scan_stop:} would lead to problems later on.
 %    \begin{macrocode}
-\__debug_patch:nnNw
+\__debug_patch:nnNNpn
   {
-    \__chk_if_exist_var:N #1
-    \__chk_if_exist_var:N #2
-    \__chk_if_exist_var:N #3
+    \__debug_chk_var_exist:N #1
+    \__debug_chk_var_exist:N #2
+    \__debug_chk_var_exist:N #3
   }
   { }
 \cs_new_protected:Npn \tl_concat:NNN #1#2#3
   { \tl_set:Nx #1 { \exp_not:o {#2} \exp_not:o {#3} } }
-\__debug_patch:nnNw
+\__debug_patch:nnNNpn
   {
-    \__chk_if_exist_var:N #1
-    \__chk_if_exist_var:N #2
-    \__chk_if_exist_var:N #3
+    \__debug_chk_var_exist:N #1
+    \__debug_chk_var_exist:N #2
+    \__debug_chk_var_exist:N #3
   }
   { }
 \cs_new_protected:Npn \tl_gconcat:NNN #1#2#3
@@ -1252,25 +1252,25 @@
 %   which makes the token list registers provided by \TeX{}
 %   more or less redundant. The \cs{tl_set:No} version is done
 %   \enquote{by hand} as it is used quite a lot.  Each definition is
-%   prefixed by a call to \cs{__debug_patch:nnNw} which adds an
+%   prefixed by a call to \cs{__debug_patch:nnNNpn} which adds an
 %   existence check to the definition.
 %    \begin{macrocode}
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \tl_set:Nn #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:n {#2} } }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \tl_set:No #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:o {#2} } }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \tl_set:Nx #1#2
   { \cs_set_nopar:Npx #1 {#2} }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \tl_gset:Nn #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:n {#2} } }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \tl_gset:No #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:o {#2} } }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \tl_gset:Nx #1#2
   { \cs_gset_nopar:Npx #1 {#2} }
 \cs_generate_variant:Nn \tl_set:Nn  {         NV , Nv , Nf }
@@ -1295,28 +1295,28 @@
 %   }
 % Adding to the left is done directly to gain a little performance.
 %    \begin{macrocode}
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \tl_put_left:Nn #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:n {#2} \exp_not:o #1 } }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \tl_put_left:NV #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:V #2 \exp_not:o #1 } }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \tl_put_left:No #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:o {#2} \exp_not:o #1 } }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \tl_put_left:Nx #1#2
   { \cs_set_nopar:Npx #1 { #2 \exp_not:o #1 } }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \tl_gput_left:Nn #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:n {#2} \exp_not:o #1 } }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \tl_gput_left:NV #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:V #2 \exp_not:o #1 } }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \tl_gput_left:No #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:o {#2} \exp_not:o #1 } }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \tl_gput_left:Nx #1#2
   { \cs_gset_nopar:Npx #1 { #2 \exp_not:o {#1} } }
 \cs_generate_variant:Nn \tl_put_left:Nn  { c }
@@ -1345,28 +1345,28 @@
 %   }
 % The same on the right.
 %    \begin{macrocode}
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \tl_put_right:Nn #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:o #1 \exp_not:n {#2} } }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \tl_put_right:NV #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:o #1 \exp_not:V #2 } }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \tl_put_right:No #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:o #1 \exp_not:o {#2} } }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \tl_put_right:Nx #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:o #1 #2 } }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \tl_gput_right:Nn #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:o #1 \exp_not:n {#2} } }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \tl_gput_right:NV #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:o #1 \exp_not:V #2 } }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \tl_gput_right:No #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:o #1 \exp_not:o {#2} } }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \tl_gput_right:Nx #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:o {#1} #2 } }
 \cs_generate_variant:Nn \tl_put_right:Nn  { c }
@@ -2964,24 +2964,10 @@
 % \begin{macro}[deprecated=2017-12-31]{\tl_to_lowercase:n, \tl_to_uppercase:n}
 %   For removal after 2017-12-31.
 %    \begin{macrocode}
-\cs_new_protected:Npn \tl_to_lowercase:n #1
-  {
-    \__msg_kernel_warning:nnxxx { kernel } { deprecated-command }
-      { 2017-12-31 }
-      { \token_to_str:N \tl_to_lowercase:n }
-      { }
-    \cs_gset_eq:NN \tl_to_lowercase:n \tex_lowercase:D
-    \tex_lowercase:D {#1}
-  }
-\cs_new_protected:Npn \tl_to_uppercase:n #1
-  {
-    \__msg_kernel_warning:nnxxx { kernel } { deprecated-command }
-      { 2017-12-31 }
-      { \token_to_str:N \tl_to_uppercase:n }
-      { }
-    \cs_gset_eq:NN \tl_to_uppercase:n \tex_uppercase:D
-    \tex_uppercase:D {#1}
-  }
+\__debug_deprecation:nnNNpn { 2017-12-31 } { \tex_lowercase:D }
+\cs_new_protected:Npn \tl_to_lowercase:n #1 { \tex_lowercase:D {#1} }
+\__debug_deprecation:nnNNpn { 2017-12-31 } { \tex_uppercase:D }
+\cs_new_protected:Npn \tl_to_uppercase:n #1 { \tex_uppercase:D {#1} }
 %    \end{macrocode}
 % \end{macro}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %
@@ -1107,7 +1107,7 @@
 %   \cs{char_generate:nn} but omits various sanity tests. In particular, this
 %   means it is used in certain places where engine variations need to be
 %   accounted for by the kernel.  The \meta{catcode} must give an explicit
-%   integer after a single expansion.
+%   integer when expanded (and must not absorb a space for instance).
 % \end{function}
 %
 % \end{documentation}
@@ -1131,13 +1131,15 @@
 % \begin{macro}{\char_show_value_catcode:n}
 %   Simple wrappers around the primitives.
 %    \begin{macrocode}
+\__debug_patch_args:nNNpn { { (#1) } { (#2) } }
 \cs_new_protected:Npn \char_set_catcode:nn #1#2
   {
     \tex_catcode:D \__int_eval:w #1 \__int_eval_end:
       = \__int_eval:w #2 \__int_eval_end:
-   }
+  }
+\__debug_patch_args:nNNpn { { (#1) } }
 \cs_new:Npn \char_value_catcode:n #1
-  { \tex_the:D \tex_catcode:D \__int_eval:w #1\__int_eval_end: }
+  { \tex_the:D \tex_catcode:D \__int_eval:w #1 \__int_eval_end: }
 \cs_new_protected:Npn \char_show_value_catcode:n #1
   { \__msg_show_wrap:n { > ~ \char_value_catcode:n {#1} } }
 %    \end{macrocode}
@@ -1269,40 +1271,48 @@
 % \begin{macro}{\char_show_value_sfcode:n}
 %   Pretty repetitive, but necessary!
 %    \begin{macrocode}
+\__debug_patch_args:nNNpn { { (#1) } { (#2) } }
 \cs_new_protected:Npn \char_set_mathcode:nn #1#2
   {
     \tex_mathcode:D \__int_eval:w #1 \__int_eval_end:
     = \__int_eval:w #2 \__int_eval_end:
   }
+\__debug_patch_args:nNNpn { { (#1) } }
 \cs_new:Npn \char_value_mathcode:n #1
-  { \tex_the:D \tex_mathcode:D \__int_eval:w #1\__int_eval_end: }
+  { \tex_the:D \tex_mathcode:D \__int_eval:w #1 \__int_eval_end: }
 \cs_new_protected:Npn \char_show_value_mathcode:n #1
   { \__msg_show_wrap:n { > ~ \char_value_mathcode:n {#1} } }
+\__debug_patch_args:nNNpn { { (#1) } { (#2) } }
 \cs_new_protected:Npn \char_set_lccode:nn #1#2
   {
     \tex_lccode:D \__int_eval:w #1 \__int_eval_end:
     = \__int_eval:w #2 \__int_eval_end:
   }
+\__debug_patch_args:nNNpn { { (#1) } }
 \cs_new:Npn \char_value_lccode:n #1
-  { \tex_the:D \tex_lccode:D \__int_eval:w #1\__int_eval_end: }
+  { \tex_the:D \tex_lccode:D \__int_eval:w #1 \__int_eval_end: }
 \cs_new_protected:Npn \char_show_value_lccode:n #1
   { \__msg_show_wrap:n { > ~ \char_value_lccode:n {#1} } }
+\__debug_patch_args:nNNpn { { (#1) } { (#2) } }
 \cs_new_protected:Npn \char_set_uccode:nn #1#2
   {
     \tex_uccode:D \__int_eval:w #1 \__int_eval_end:
     = \__int_eval:w #2 \__int_eval_end:
   }
+\__debug_patch_args:nNNpn { { (#1) } }
 \cs_new:Npn \char_value_uccode:n #1
-  { \tex_the:D \tex_uccode:D \__int_eval:w #1\__int_eval_end: }
+  { \tex_the:D \tex_uccode:D \__int_eval:w #1 \__int_eval_end: }
 \cs_new_protected:Npn \char_show_value_uccode:n #1
   { \__msg_show_wrap:n { > ~ \char_value_uccode:n {#1} } }
+\__debug_patch_args:nNNpn { { (#1) } { (#2) } }
 \cs_new_protected:Npn \char_set_sfcode:nn #1#2
   {
     \tex_sfcode:D \__int_eval:w #1 \__int_eval_end:
     = \__int_eval:w #2 \__int_eval_end:
   }
+\__debug_patch_args:nNNpn { { (#1) } }
 \cs_new:Npn \char_value_sfcode:n #1
-  { \tex_the:D \tex_sfcode:D \__int_eval:w #1\__int_eval_end: }
+  { \tex_the:D \tex_sfcode:D \__int_eval:w #1 \__int_eval_end: }
 \cs_new_protected:Npn \char_show_value_sfcode:n #1
   { \__msg_show_wrap:n { > ~ \char_value_sfcode:n {#1} } }
 %    \end{macrocode}
@@ -1385,6 +1395,7 @@
 %   the interface layer, turn the two arguments into integers up-front so
 %   this is only done once.
 %    \begin{macrocode}
+\__debug_patch_args:nNNpn { { (#1) } { (#2) } }
 \cs_new:Npn \char_generate:nn #1#2
   {
     \exp:w \exp_after:wN \@@_generate_aux:w
@@ -1395,8 +1406,7 @@
   {
     \exp:w \exp_after:wN
       \@@_generate_aux:nnw \exp_after:wN
-        { \__int_value:w \__int_eval:w #1 \exp_after:wN }
-          {#2} \exp_end:
+        { \__int_value:w \__int_eval:w #1 } {#2} \exp_end:
   }
 %    \end{macrocode}
 %   Before doing any actual conversion, first some special case filtering.
@@ -2250,7 +2260,6 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_true_remove:w
   {
-    \group_align_safe_end:
     \tex_afterassignment:D \@@_true_aux:w
     \cs_set_eq:NN \@@_tmp:w
   }
@@ -2257,54 +2266,47 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[TF]{\@@_token_generic:NN}
-%   The generic function stores the test token in both implicit and
+% \begin{macro}{\@@_token_generic_aux:NNNTF}
+%   The generic functions store the test token in both implicit and
 %   explicit modes, and the \texttt{true} and \texttt{false} code as
 %   token lists, more or less. The two branches have to be absorbed here
 %   as the input stream needs to be cleared for the peek function itself.
+%   Here, |#1| is \cs{@@_true_remove:w} when removing the token and
+%   \cs{@@_true_aux:w} otherwise.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_token_generic:NNTF #1#2#3#4
+\cs_new_protected:Npn \@@_token_generic_aux:NNNTF #1#2#3#4#5
   {
-    \cs_set_eq:NN \l_@@_search_token #2
-    \tl_set:Nn \l_@@_search_tl {#2}
-    \cs_set:Npx \@@_true:w
+    \group_align_safe_begin:
+    \cs_set_eq:NN \l_@@_search_token #3
+    \tl_set:Nn \l_@@_search_tl {#3}
+    \cs_set:Npx \@@_true_aux:w
       {
         \exp_not:N \group_align_safe_end:
-        \exp_not:n {#3}
+        \exp_not:n {#4}
       }
+    \cs_set_eq:NN \@@_true:w #1
     \cs_set:Npx \@@_false:w
       {
         \exp_not:N \group_align_safe_end:
-        \exp_not:n {#4}
+        \exp_not:n {#5}
       }
-    \group_align_safe_begin:
-      \peek_after:Nw #1
+    \peek_after:Nw #2
   }
-\cs_new_protected:Npn \@@_token_generic:NNT #1#2#3
-  { \@@_token_generic:NNTF #1 #2 {#3} { } }
-\cs_new_protected:Npn \@@_token_generic:NNF #1#2#3
-  { \@@_token_generic:NNTF #1 #2 { } {#3} }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[TF]{\@@_token_remove_generic:NN}
+% \begin{macro}[TF]{\@@_token_generic:NN, \@@_token_remove_generic:NN}
 %   For token removal there needs to be a call to the auxiliary
 %   function which does the work.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_token_remove_generic:NNTF #1#2#3#4
-  {
-    \cs_set_eq:NN \l_@@_search_token #2
-    \tl_set:Nn \l_@@_search_tl {#2}
-    \cs_set_eq:NN \@@_true:w \@@_true_remove:w
-    \cs_set:Npx \@@_true_aux:w { \exp_not:n {#3} }
-    \cs_set:Npx \@@_false:w
-      {
-        \exp_not:N \group_align_safe_end:
-        \exp_not:n {#4}
-      }
-    \group_align_safe_begin:
-      \peek_after:Nw #1
-  }
+\cs_new_protected:Npn \@@_token_generic:NNTF
+  { \@@_token_generic_aux:NNNTF \@@_true_aux:w }
+\cs_new_protected:Npn \@@_token_generic:NNT #1#2#3
+  { \@@_token_generic:NNTF #1 #2 {#3} { } }
+\cs_new_protected:Npn \@@_token_generic:NNF #1#2#3
+  { \@@_token_generic:NNTF #1 #2 { } {#3} }
+\cs_new_protected:Npn \@@_token_remove_generic:NNTF
+  { \@@_token_generic_aux:NNNTF \@@_true_remove:w }
 \cs_new_protected:Npn \@@_token_remove_generic:NNT #1#2#3
   { \@@_token_remove_generic:NNTF #1 #2 {#3} { } }
 \cs_new_protected:Npn \@@_token_remove_generic:NNF #1#2#3

Modified: trunk/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -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/07/15]
-%<package>\@ifpackagelater{expl3}{2017/07/15}
+\RequirePackage{expl3}[2017/07/19]
+%<package>\@ifpackagelater{expl3}{2017/07/19}
 %<package>  {}
 %<package>  {%
 %<package>    \PackageError{l3keys2e}{Support package l3kernel too old}
@@ -60,7 +60,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %
@@ -131,7 +131,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{l3keys2e}{2017/07/15}{}
+\ProvidesExplPackage{l3keys2e}{2017/07/19}{}
   {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-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -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/07/15]
-%<package>\@ifpackagelater{expl3}{2017/07/15}
+\RequirePackage{expl3}[2017/07/19]
+%<package>\@ifpackagelater{expl3}{2017/07/19}
 %<package>  {}
 %<package>  {%
 %<package>    \PackageError{xfp}{Support package l3kernel too old}
@@ -62,7 +62,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %
@@ -143,7 +143,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xfp}{2017/07/15}{}
+\ProvidesExplPackage{xfp}{2017/07/19}{}
   {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-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -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/07/15]
-%<package>\@ifpackagelater{expl3}{2017/07/15}
+\RequirePackage{expl3}[2017/07/19]
+%<package>\@ifpackagelater{expl3}{2017/07/19}
 %<package>  {}
 %<package>  {%
 %<package>    \PackageError{xfrac}{Support package l3kernel too old}
@@ -63,7 +63,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %
@@ -533,7 +533,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xfrac}{2017/07/15}{}
+\ProvidesExplPackage{xfrac}{2017/07/19}{}
   {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-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -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/07/15]
-%<package>\@ifpackagelater{expl3}{2017/07/15}
+\RequirePackage{expl3}[2017/07/19]
+%<package>\@ifpackagelater{expl3}{2017/07/19}
 %<package>  {}
 %<package>  {%
 %<package>    \PackageError{xparse}{Support package l3kernel too old}
@@ -67,7 +67,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %
@@ -131,15 +131,15 @@
 %     internal code surrounded by a brace pair. This is the \pkg{xparse}
 %     type specifier for a normal \TeX{} argument.
 %   \item[l] An argument which reads everything up to the first
-%     open group token: in standard \LaTeX{} this is a left brace.
+%     begin-group token: in standard \LaTeX{} this is a left brace.
 %   \item[r] Reads a \enquote{required} delimited argument, where the
-%     delimiters are given as \meta{token1} and \meta{token2}:
-%     \texttt{r}\meta{token1}\meta{token2}. If the opening \meta{token}
+%     delimiters are given as \meta{char1} and \meta{char2}:
+%     \texttt{r}\meta{char1}\meta{char2}. If the opening \meta{character}
 %     is missing, the default marker |-NoValue-| will be inserted after
 %     a suitable error.
 %   \item[R] As for \texttt{r}, this is a \enquote{required} delimited
 %     argument but has a user-definable recovery \meta{default}, given
-%     as \texttt{R}\meta{token1}\meta{token2}\marg{default}.
+%     as \texttt{R}\meta{char1}\meta{char2}\marg{default}.
 %   \item[u] Reads an argument \enquote{until} \meta{tokens} are encountered,
 %     where the desired \meta{tokens} are given as an argument to the
 %     specifier: \texttt{u}\marg{tokens}.
@@ -158,22 +158,22 @@
 %   \item[o] A standard \LaTeX{} optional argument, surrounded with square
 %     brackets, which will supply
 %     the special |-NoValue-| marker if not given (as described later).
-%   \item[d] An optional argument which is delimited by \meta{token1}
-%     and \meta{token2}, which are given as arguments:
-%     \texttt{d}\meta{token1}\meta{token2}. As with \texttt{o}, if no
+%   \item[d] An optional argument which is delimited by \meta{char1}
+%     and \meta{char2}, given as follows:
+%     \texttt{d}\meta{char1}\meta{char2}. As with \texttt{o}, if no
 %     value is given the special marker |-NoValue-| is returned.
 %   \item[O] As for \texttt{o}, but returns \meta{default} if no
 %     value is given.  Should be given as \texttt{O}\marg{default}.
 %   \item[D] As for \texttt{d}, but returns \meta{default} if no
-%     value is given: \texttt{D}\meta{token1}\meta{token2}\marg{default}.
+%     value is given: \texttt{D}\meta{char1}\meta{char2}\marg{default}.
 %     Internally, the \texttt{o}, \texttt{d} and \texttt{O} types are
 %     short-cuts to an appropriated-constructed \texttt{D} type argument.
 %   \item[s] An optional star, which will result in a value
 %     \cs{BooleanTrue} if a star is present and \cs{BooleanFalse}
 %     otherwise (as described later).
-%   \item[t] An optional \meta{token}, which will result in a value
-%     \cs{BooleanTrue} if \meta{token} is present and \cs{BooleanFalse}
-%     otherwise. Given as \texttt{t}\meta{token}.
+%   \item[t] An optional \meta{char}, which will result in a value
+%     \cs{BooleanTrue} if \meta{char} is present and \cs{BooleanFalse}
+%     otherwise. Given as \texttt{t}\meta{char}.
 %   \item[g] An optional argument given inside a pair of \TeX{} group
 %     tokens (in standard \LaTeX, |{| \ldots |}|), which returns
 %     |-NoValue-| if not present.
@@ -180,13 +180,13 @@
 %   \item[G] As for \texttt{g} but returns \meta{default} if no value
 %     is given: \texttt{G}\marg{default}.
 %   \item[e] A set of optional \emph{embellishments}, each of which
-%     requires a \emph{value}: \texttt{e}\marg{tokens}.  If an
+%     requires a \emph{value}: \texttt{e}\marg{chars}.  If an
 %     embellishment is not present, |-NoValue-| is returned.  Each
 %     embellishment gives one argument, ordered as for the list of
-%     \meta{tokens} in the argument specification.  All \meta{tokens}
+%     \meta{chars} in the argument specification.  All \meta{chars}
 %     must be distinct.  \emph{This is an experimental type}.
 %   \item[E] As for \texttt{e} but returns one or more \meta{defaults}
-%     if values are not given: \texttt{E}\marg{tokens}\marg{defaults}. See
+%     if values are not given: \texttt{E}\marg{chars}\marg{defaults}. See
 %     Section~\ref{sec:embellishment} for more details.
 % \end{itemize}
 %
@@ -235,7 +235,7 @@
 %   \foobaz[ {abc}]         % => " {abc}"
 % \end{verbatim}
 %
-% Two more tokens have a special meaning when creating an argument
+% Two more characters have a special meaning when creating an argument
 % specifier. First, \texttt{+} is used to make an argument long (to
 % accept paragraph tokens). In contrast to \LaTeXe's \cs{newcommand},
 % this applies on an argument-by-argument basis. So modifying the
@@ -242,7 +242,7 @@
 % example to `|s o o +m O{default}|' means that the mandatory argument
 % is now \cs{long}, whereas the optional arguments are not.
 %
-% Secondly, the token \texttt{>} is used to declare so-called
+% Secondly, the character \texttt{>} is used to declare so-called
 % \enquote{argument processors}, which can be used to modify the contents of an
 % argument before it is passed to the macro definition. The use of
 % argument processors is a somewhat advanced topic, (or at least a less
@@ -354,20 +354,20 @@
 % \subsection{Default values for \enquote{embellishments}}
 % \label{sec:embellishment}
 %
-% The \texttt{E}-type argument allows one default value per test token.
+% The \texttt{E}-type argument allows one default value per test character.
 % This is achieved by giving a list of defaults for each entry in the
 % list, for example:
 % \begin{verbatim}
 %   E{^_}{{UP}{DOWN}}
 % \end{verbatim}
-% If the list of default values is \emph{shorter} than the list of test tokens,
-% the special \cs{NoValue} marker will be returned (as for the \texttt{e}-type
+% If the list of default values is \emph{shorter} than the list of test characters,
+% the special |-NoValue-| marker will be returned (as for the \texttt{e}-type
 % argument). Thus for example
 % \begin{verbatim}
 %   E{^_}{{UP}}
 % \end{verbatim}
-% has default \texttt{UP} for the |^| test token, but will return the
-% \cs{NoValue} marker as a default for |_|. This allows mixing of explicit
+% has default \texttt{UP} for the |^| test character, but will return the
+% |-NoValue-| marker as a default for |_|. This allows mixing of explicit
 % defaults with testing for missing values.
 %
 % \subsection{Declaring commands and environments}
@@ -514,7 +514,7 @@
 %
 % \begin{variable}{\BooleanFalse, \BooleanTrue}
 %   The \texttt{true} and \texttt{false} flags set when searching for
-%   an optional token (using \texttt{s} or \texttt{t\meta{token}}) have
+%   an optional character (using \texttt{s} or \texttt{t\meta{char}}) have
 %   names which are accessible outside of code blocks.
 % \end{variable}
 %
@@ -545,7 +545,7 @@
 % processor can therefore be used to regularise input at an early stage,
 % allowing the internal functions to be completely independent of input
 % form. Processors are applied to user input and to default values for
-% optional arguments, but \emph{not} to the special \cs{NoValue} marker.
+% optional arguments, but \emph{not} to the special |-NoValue-| marker.
 %
 % Each argument processor is specified by the syntax
 % \texttt{>}\marg{processor} in the argument specification. Processors
@@ -593,7 +593,7 @@
 %   input. The processed input is placed inside
 %   $\text{\meta{number}} + 1$ sets of braces for further use.
 %   If there are fewer than \Arg{number} of \Arg{tokens} in the argument
-%   then \cs{NoValue} markers are added at the end of the processed
+%   then |-NoValue-| markers are added at the end of the processed
 %   argument.
 %   \begin{verbatim}
 %     \NewDocumentCommand \foo
@@ -776,7 +776,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xparse}{2017/07/15}{}
+\ProvidesExplPackage{xparse}{2017/07/19}{}
   {L3 Experimental document command parser}
 %    \end{macrocode}
 %
@@ -1487,7 +1487,7 @@
 % The first thing that is done in the loop is to check that the various
 % argument types have the correct number of data items associated with
 % them.  The opportunity is also taken to make sure that where a single
-% token is required, one has actually been supplied.
+% character is required, one has actually been supplied.
 %
 % The second is that processors and the marker~|+| for long arguments
 % must be followed by arguments.
@@ -1667,10 +1667,10 @@
 %   }
 % \begin{macro}[aux]{\@@_normalize_E_unique_check:w}
 %   Optional argument types.  Check that all required data is present
-%   (and consists of single tokens if applicable) and check for
+%   (and consists of single characters if applicable) and check for
 %   forbidden types for expandable commands.  For \texttt{E}-type
 %   require that there is at least one embellishment, that each one is a
-%   single token, and that there aren't more optional arguments than
+%   single character, and that there aren't more optional arguments than
 %   embellishments; also remember that each embellishment counts as one
 %   argument for \cs{l_@@_current_arg_int}.  Then in each case
 %   store the data in \cs{l_@@_arg_spec_tl}, and
@@ -1680,9 +1680,9 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_normalize_type_D:w #1#2#3
   {
-    \@@_single_token_check:n {#1}
-    \@@_single_token_check:n {#2}
     \quark_if_recursion_tail_stop_do:nn {#3} { \@@_bad_arg_spec:wn }
+    \@@_single_char_check:n {#1}
+    \@@_single_char_check:n {#2}
     \@@_add_arg_spec:n { D #1 #2 {#3} }
     \tl_put_right:Nn \l_@@_last_delimiters_tl {#1}
     \bool_set_false:N \l_@@_grab_expandably_bool
@@ -1692,7 +1692,7 @@
   {
     \quark_if_recursion_tail_stop_do:nn {#2} { \@@_bad_arg_spec:wn }
     \tl_if_blank:nT {#1} { \@@_bad_arg_spec:wn }
-    \tl_map_function:nN {#1} \@@_single_token_check:n
+    \tl_map_function:nN {#1} \@@_single_char_check:n
     \@@_normalize_E_unique_check:w #1 \q_nil \q_stop
     \int_compare:nNnT { \tl_count:n {#2} } > { \tl_count:n {#1} }
       { \@@_bad_arg_spec:wn }
@@ -1720,8 +1720,8 @@
   }
 \cs_new_protected:Npn \@@_normalize_type_t:w #1
   {
-    \@@_single_token_check:n {#1}
     \quark_if_recursion_tail_stop_do:Nn #1 { \@@_bad_arg_spec:wn }
+    \@@_single_char_check:n {#1}
     \tl_put_right:Nn \l_@@_arg_spec_tl { t #1 }
     \tl_put_right:Nn \l_@@_last_delimiters_tl {#1}
     \bool_set_false:N \l_@@_grab_expandably_bool
@@ -1741,7 +1741,7 @@
 %     \@@_normalize_type_v:w
 %   }
 %   Mandatory arguments.  First check the required data is present,
-%   consists of single tokens where applicable, and that the argument
+%   consists of single characters where applicable, and that the argument
 %   type is allowed for expandable commands if applicable.  For the
 %   \texttt{m} and \texttt{R} argument types check that they do not
 %   follow some optional argument with that delimiter as otherwise the
@@ -1767,9 +1767,9 @@
   }
 \cs_new_protected:Npn \@@_normalize_type_R:w #1#2#3
   {
-    \@@_single_token_check:n {#1}
-    \@@_single_token_check:n {#2}
     \quark_if_recursion_tail_stop_do:nn {#3} { \@@_bad_arg_spec:wn }
+    \@@_single_char_check:n {#1}
+    \@@_single_char_check:n {#2}
     \@@_delimiter_check:nnn {#1} { R/r } { \tl_to_str:n {#1} }
     \@@_add_arg_spec:n { R #1 #2 {#3} }
     \int_incr:N \l_@@_mandatory_args_int
@@ -1797,15 +1797,26 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\@@_single_token_check:n}
-%   A spin-out function to check that what should be single tokens really
-%   are single tokens.
+% \begin{macro}{\@@_single_char_check:n}
+%   Checks that what should be single characters really are single
+%   characters (possibly surrounded by spaces).
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_single_token_check:n #1
+\cs_new_protected:Npn \@@_single_char_check:n #1
   {
-    \exp_args:Nx \tl_if_single_token:nF { \tl_trim_spaces:n {#1} }
+    \exp_args:Nx \tl_if_single_token:nTF { \tl_trim_spaces:n {#1} }
       {
-        \__msg_kernel_error:nnxx { xparse } { not-single-token }
+        \group_begin:
+        \tex_escapechar:D = 92 \scan_stop:
+        \exp_args:Nx \tl_if_single_token:nF
+          { \exp_args:No \tl_to_str:n { \use:nn #1 { } } }
+          {
+            \__msg_kernel_warning:nnxx { xparse } { not-single-char }
+              { \iow_char:N \\ \l_@@_function_tl } { \tl_to_str:n {#1} }
+          }
+        \group_end:
+      }
+      {
+        \__msg_kernel_error:nnxx { xparse } { not-single-char }
           { \iow_char:N \\ \l_@@_function_tl } { \tl_to_str:n {#1} }
         \@@_bad_def:wn
       }
@@ -1887,18 +1898,17 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_add_arg_spec:n #1
   {
-    \bool_if:NF \l_@@_long_bool
+    \bool_lazy_and:nnT
+      { ! \l_@@_long_bool }
+      { \l_@@_some_long_bool }
       {
-        \bool_if:NT \l_@@_some_long_bool
+        \bool_if:NT \l_@@_expandable_bool
           {
-            \bool_if:NT \l_@@_expandable_bool
-              {
-                \__msg_kernel_error:nnx { xparse } { inconsistent-long }
-                  { \iow_char:N \\ \l_@@_function_tl }
-                \@@_bad_def:wn
-              }
-            \bool_set_false:N \l_@@_grab_expandably_bool
+            \__msg_kernel_error:nnx { xparse } { inconsistent-long }
+              { \iow_char:N \\ \l_@@_function_tl }
+            \@@_bad_def:wn
           }
+        \bool_set_false:N \l_@@_grab_expandably_bool
       }
     \bool_if:NTF \l_@@_long_bool
       { \bool_set_true:N \l_@@_some_long_bool }
@@ -4140,12 +4150,15 @@
     \\ \\
     LaTeX~will~ignore~this~entire~definition.
   }
-\__msg_kernel_new:nnnn { xparse } { not-single-token }
-  { Argument~delimiter~'#2'~for~the~command~'#1'~should~be~a~single~token. }
+\__msg_kernel_new:nnnn { xparse } { not-single-char }
   {
+    Argument~delimiter~'#2'~for~the~command~'#1'~should~be~
+    a~single~character.
+  }
+  {
     \c__msg_coding_error_text_tl
-    The~argument~specification~provided~was~not~valid:~
-    in~a~place~where~a~single~token~is~required,~LaTeX~found~'#2'. \\ \\
+    The~argument~specification~provided~was~not~valid:~in~a~place~
+    where~a~single~character~is~required,~LaTeX~found~'#2'. \\ \\
     LaTeX~will~ignore~this~entire~definition.
   }
 \__msg_kernel_new:nnnn { xparse } { processor-in-expandable }

Modified: trunk/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx	2017-07-21 22:02:53 UTC (rev 44864)
@@ -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/07/15]
-%<package>\@ifpackagelater{expl3}{2017/07/15}
+\RequirePackage{expl3}[2017/07/19]
+%<package>\@ifpackagelater{expl3}{2017/07/19}
 %<package>  {}
 %<package>  {%
 %<package>    \PackageError{xtemplate}{Support package l3kernel too old}
@@ -63,7 +63,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/07/15}
+% \date{Released 2017/07/19}
 %
 % \maketitle
 %
@@ -682,7 +682,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xtemplate}{2017/07/15}{}
+\ProvidesExplPackage{xtemplate}{2017/07/19}{}
   {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-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-convert.sty	2017-07-21 22:02:53 UTC (rev 44864)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3str-convert.dtx Copyright (C) 2013-2017 The LaTeX3 Project
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3str-convert}{2017/07/15}{}
+\ProvidesExplPackage{l3str-convert}{2017/07/19}{}
   {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-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty	2017-07-21 22:02:53 UTC (rev 44864)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3str-format.dtx Copyright (C) 2012-2013,2015-2017 The LaTeX3 Project
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3str-format}{2017/07/15}{}
+\ProvidesExplPackage{l3str-format}{2017/07/19}{}
   {L3 Experimental string formatting}
 \RequirePackage{l3str}
 \cs_generate_variant:Nn \use:nn { nf }

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty	2017-07-21 22:02:53 UTC (rev 44864)
@@ -20,7 +20,7 @@
 %% 
 %% File: xcoffins.dtx Copyright(C) 2010-2012,2014,2016,2017 The LaTeX3 Project
 \RequirePackage{xparse}
-\ProvidesExplPackage{xcoffins}{2017/07/15}{}
+\ProvidesExplPackage{xcoffins}{2017/07/19}{}
   {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-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty	2017-07-21 22:02:53 UTC (rev 44864)
@@ -20,8 +20,8 @@
 %% 
 %% File: l3galley.dtx Copyright (C) 1999-2001, 2004-2009 Frank Mittelbach
 %%                              (C) 2010-2017 The LaTeX3 Project
-\RequirePackage{expl3}[2017/07/15]
-\@ifpackagelater{expl3}{2017/07/15}
+\RequirePackage{expl3}[2017/07/19]
+\@ifpackagelater{expl3}{2017/07/19}
   {}
   {%
     \PackageError{l3galley}{Support package l3kernel too old}
@@ -33,7 +33,7 @@
       }%
     \endinput
   }
-\ProvidesExplPackage{l3galley}{2017/07/15}{}
+\ProvidesExplPackage{l3galley}{2017/07/19}{}
   {L3 Experimental galley code}
 \int_new:N \l__galley_tmp_int
 \seq_new:N \g__galley_tmpa_seq
@@ -668,7 +668,7 @@
       {
         \dim_compare:nNnT
           { \etex_glueexpr:D \g__galley_interpar_vspace_user_tl }
-            < { \etex_glueexpr:D #1 \scan_stop: }
+            < { \etex_glueexpr:D (#1) \scan_stop: }
           { \galley_vspace_set_single:n {#1} }
       }
   }
@@ -766,6 +766,7 @@
     \__galley_calc_interline_penalties:
   }
 \cs_generate_variant:Nn \galley_display_club_penalties_set:n { V , v }
+\__debug_patch_args:nNNpn { { (#1) } }
 \cs_new_protected:Npn \galley_interline_penalty_set:n #1
   {
     \int_compare:nNnTF { \etex_interlinepenalties:D 0 } = 0

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty	2017-07-21 22:02:53 UTC (rev 44864)
@@ -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/07/15}{}
+\ProvidesExplPackage{xgalley}{2017/07/19}{}
   {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-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex	2017-07-21 22:02:53 UTC (rev 44864)
@@ -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/07/15}%
+\def\ExplFileDate{2017/07/19}%
 \begingroup
   \def\next{\endgroup}%
   \expandafter\ifx\csname PackageError\endcsname\relax
@@ -1480,6 +1480,189 @@
 \cs_set:Npn \use_none:nnnnnnn   #1#2#3#4#5#6#7     { }
 \cs_set:Npn \use_none:nnnnnnnn  #1#2#3#4#5#6#7#8   { }
 \cs_set:Npn \use_none:nnnnnnnnn #1#2#3#4#5#6#7#8#9 { }
+\cs_set_protected:Npn \__debug:TF #1#2 {#2}
+\tex_ifodd:D \l at expl@enable at debug@bool
+  \cs_set_protected:Npn \__debug:TF #1#2 {#1}
+\fi:
+\__debug:TF
+  {
+    \cs_set_protected:Npn \debug_on:n #1
+      {
+        \exp_args:No \clist_map_inline:nn { \tl_to_str:n {#1} }
+          {
+            \cs_if_exist_use:cF { __debug_##1_on: }
+              { \__msg_kernel_error:nnn { kernel } { debug } {##1} }
+          }
+      }
+    \cs_set_protected:Npn \debug_off:n #1
+      {
+        \exp_args:No \clist_map_inline:nn { \tl_to_str:n {#1} }
+          {
+            \cs_if_exist_use:cF { __debug_##1_off: }
+              { \__msg_kernel_error:nnn { kernel } { debug } {##1} }
+          }
+      }
+  }
+  {
+    \cs_set_protected:Npn \debug_on:n #1
+      {
+        \__msg_kernel_error:nnx { kernel } { enable-debug }
+          { \tl_to_str:n { \debug_on:n {#1} } }
+      }
+    \cs_set_protected:Npn \debug_off:n #1
+      {
+        \__msg_kernel_error:nnx { kernel } { enable-debug }
+          { \tl_to_str:n { \debug_off:n {#1} } }
+      }
+  }
+\__debug:TF
+  {
+    \exp_args:Nc \cs_set_protected:Npn { __debug_check-declarations_on: }
+      {
+        \cs_set_protected:Npn \__debug_chk_var_exist:N ##1
+          {
+            \cs_if_exist:NF ##1
+              {
+                \__msg_kernel_error:nnx { kernel } { non-declared-variable }
+                  { \token_to_str:N ##1 }
+              }
+          }
+        \cs_set_protected:Npn \__debug_chk_cs_exist:N ##1
+          {
+            \cs_if_exist:NF ##1
+              {
+                \__msg_kernel_error:nnx { kernel } { command-not-defined }
+                  { \token_to_str:N ##1 }
+              }
+          }
+      }
+    \exp_args:Nc \cs_set_protected:Npn { __debug_check-declarations_off: }
+      {
+        \cs_set_protected:Npn \__debug_chk_var_exist:N ##1 { }
+        \cs_set_protected:Npn \__debug_chk_cs_exist:N ##1 { }
+      }
+    \cs_set_protected:Npn \__debug_chk_cs_exist:c
+      { \exp_args:Nc \__debug_chk_cs_exist:N }
+    \tex_ifodd:D \l at expl@check at declarations@bool
+      \use:c { __debug_check-declarations_on: }
+    \else:
+      \use:c { __debug_check-declarations_off: }
+    \fi:
+  }
+  { }
+\__debug:TF
+  {
+    \exp_args:Nc \cs_set_protected:Npn { __debug_log-functions_on: }
+      {
+        \cs_set_protected:Npn \__debug_log:x { \iow_log:x }
+        \cs_set_protected:Npn \__debug_suspend_log:
+          {
+            \cs_set_protected:Npx \__debug_resume_log:
+              {
+                \cs_set_protected:Npn \__debug_resume_log:
+                  { \exp_not:o { \__debug_resume_log: } }
+                \cs_set_protected:Npn \__debug_log:x
+                  { \exp_not:o { \__debug_log:x } }
+              }
+            \cs_set_protected:Npn \__debug_log:x { \use_none:n }
+          }
+        \cs_set_protected:Npn \__debug_resume_log: { }
+      }
+    \exp_args:Nc \cs_set_protected:Npn { __debug_log-functions_off: }
+      {
+        \cs_set_protected:Npn \__debug_log:x { \use_none:n }
+        \cs_set_protected:Npn \__debug_suspend_log: { }
+        \cs_set_protected:Npn \__debug_resume_log: { }
+      }
+    \tex_ifodd:D \l at expl@log at functions@bool
+      \use:c { __debug_log-functions_on: }
+    \else:
+      \use:c { __debug_log-functions_off: }
+    \fi:
+  }
+  { }
+\__debug:TF
+  {
+    \cs_set_protected:Npn \__debug_deprecation_on:
+      { \g__debug_deprecation_on_tl }
+    \cs_set_protected:Npn \__debug_deprecation_off:
+      { \g__debug_deprecation_off_tl }
+    \cs_set_nopar:Npn \g__debug_deprecation_on_tl { }
+    \cs_set_nopar:Npn \g__debug_deprecation_off_tl { }
+  }
+  { }
+\__debug:TF
+  {
+    \cs_set_protected:Npn \__debug_deprecation:nnNNpn #1#2#3#4#5#
+      {
+        \if_meaning:w \cs_new_protected:Npn #3
+        \else:
+          \__msg_kernel_error:nnx { kernel } { debug-unpatchable }
+            { \token_to_str:N #3 ~(for~deprecation) }
+        \fi:
+        \__debug_deprecation_aux:nnNnn {#1} {#2} #4 {#5}
+      }
+    \cs_set_protected:Npn \__debug_deprecation_aux:nnNnn #1#2#3#4#5
+      {
+        \tl_gput_right:Nn \g__debug_deprecation_on_tl
+          {
+            \tex_let:D #3 \scan_stop:
+            \__deprecation_error:Nnn #3 {#2} {#1}
+          }
+        \tl_gput_right:Nn \g__debug_deprecation_off_tl
+          {
+            \tex_let:D #3 \scan_stop:
+            \cs_set_protected:Npn #3 #4 {#5}
+          }
+        \cs_new_protected:Npx #3
+          {
+            \exp_not:N \__msg_kernel_warning:nnxxx
+              { kernel } { deprecated-command }
+              {#1} { \token_to_str:N #3 } { \tl_to_str:n {#2} }
+            \exp_not:n { \cs_gset_protected:Npn #3 #4 {#5} }
+            \exp_not:N #3
+          }
+      }
+  }
+  { \cs_set_protected:Npn \__debug_deprecation:nnNNpn #1#2 { } }
+\__debug:TF
+  {
+    \cs_set_protected:Npn \__debug_patch:nnNNpn #1#2#3#4#5#
+      { \__debug_patch_aux:nnNNnn {#1} {#2} #3 #4 {#5} }
+    \cs_set_protected:Npn \__debug_patch_conditional:nNNpnn #1#2#3#4#
+      { \__debug_patch_aux:nNNnnn {#1} #2 #3 {#4} }
+    \cs_set_protected:Npn \__debug_patch_aux:nnNNnn #1#2#3#4#5#6
+      { #3 #4 #5 { #1 #6 #2 } }
+    \cs_set_protected:Npn \__debug_patch_aux:nNNnnn #1#2#3#4#5#6
+      { #2 #3 #4 {#5} { #1 #6 } }
+  }
+  {
+    \cs_set_protected:Npn \__debug_patch:nnNNpn #1#2 { }
+    \cs_set_protected:Npn \__debug_patch_conditional:nNNpnn #1 { }
+  }
+\__debug:TF
+  {
+    \cs_set_protected:Npn \__debug_patch_args:nNNpn #1#2#3#4#
+      { \__debug_patch_args_aux:nNNnn {#1} #2 #3 {#4} }
+    \cs_set_protected:Npn \__debug_patch_conditional_args:nNNpnn #1#2#3#4#
+      { \__debug_patch_args_aux:nNNnnn {#1} #2 #3 {#4} }
+    \cs_set_protected:Npn \__debug_patch_args_aux:nNNnn #1#2#3#4#5
+      {
+        \cs_set:Npn \__debug_tmp:w #4 {#5}
+        \exp_after:wN \__debug_patch_aux:nnNNnn \exp_after:wN
+          { \__debug_tmp:w #1 } { } #2 #3 {#4} { }
+      }
+    \cs_set_protected:Npn \__debug_patch_args_aux:nNNnnn #1#2#3#4#5#6
+      {
+        \cs_set:Npn \__debug_tmp:w #4 {#6}
+        \exp_after:wN \__debug_patch_aux:nNNnnn \exp_after:wN
+          { \__debug_tmp:w #1 } #2 #3 {#4} {#5} { }
+      }
+  }
+  {
+    \cs_set_protected:Npn \__debug_patch_args:nNNpn #1 { }
+    \cs_set_protected:Npn \__debug_patch_conditional_args:nNNpnn #1 { }
+  }
 \cs_set:Npn \prg_return_true:
   { \exp_after:wN \use_i:nn  \exp:w }
 \cs_set:Npn \prg_return_false:
@@ -1636,26 +1819,22 @@
       #5 {#1} {#2} {#3} {#4}
     \__prg_set_eq_conditional_loop:nnnnNw {#1} {#2} {#3} {#4} #5
   }
+\__debug_patch:nnNNpn
+  { \__debug_chk_cs_exist:c { #5 _p : #6    } } { }
 \cs_set:Npn \__prg_set_eq_conditional_p_form:wNnnnn #1 \q_stop #2#3#4#5#6
-  {
-    \__chk_if_exist_cs:c { #5 _p : #6    }
-    #2 { #3 _p : #4    } { #5 _p : #6    }
-  }
+  { #2 { #3 _p : #4    }    { #5 _p : #6    } }
+\__debug_patch:nnNNpn
+  { \__debug_chk_cs_exist:c { #5    : #6 TF } } { }
 \cs_set:Npn \__prg_set_eq_conditional_TF_form:wNnnnn #1 \q_stop #2#3#4#5#6
-  {
-    \__chk_if_exist_cs:c { #5    : #6 TF }
-    #2 { #3    : #4 TF } { #5    : #6 TF }
-  }
+  { #2 { #3    : #4 TF }    { #5    : #6 TF } }
+\__debug_patch:nnNNpn
+  { \__debug_chk_cs_exist:c { #5    : #6 T  } } { }
 \cs_set:Npn \__prg_set_eq_conditional_T_form:wNnnnn #1 \q_stop #2#3#4#5#6
-  {
-    \__chk_if_exist_cs:c { #5    : #6 T  }
-    #2 { #3    : #4 T  } { #5    : #6 T  }
-  }
+  { #2 { #3    : #4 T  }    { #5    : #6 T  } }
+\__debug_patch:nnNNpn
+  { \__debug_chk_cs_exist:c { #5    : #6  F } } { }
 \cs_set:Npn \__prg_set_eq_conditional_F_form:wNnnnn #1 \q_stop #2#3#4#5#6
-  {
-    \__chk_if_exist_cs:c { #5    : #6  F }
-    #2 { #3    : #4  F } { #5    : #6  F }
-  }
+  { #2 { #3    : #4  F }    { #5    : #6  F } }
 \tex_chardef:D \c_true_bool  = 1 ~
 \tex_chardef:D \c_false_bool = 0 ~
 \cs_set:Npn \cs_to_str:N
@@ -1782,80 +1961,7 @@
   { \tex_immediate:D \tex_write:D -1 }
 \cs_set_protected:Npn \iow_term:x
   { \tex_immediate:D \tex_write:D 16 }
-\cs_set_protected:Npn \debug_log_functions_on:
-  {
-    \__msg_kernel_error:nnx { kernel } { enable-debug }
-      { \token_to_str:N \debug_log_functions_on: }
-  }
-\cs_set_protected:Npn \debug_log_functions_off:
-  {
-    \__msg_kernel_error:nnx { kernel } { enable-debug }
-      { \token_to_str:N \debug_log_functions_off: }
-  }
-\cs_set_protected:Npn \__debug_suspend_log: { }
-\cs_set_protected:Npn \__debug_resume_log: { }
-\tex_ifodd:D \l at expl@enable at debug@bool
-  \cs_set_protected:Npn \debug_log_functions_on:
-    {
-      \cs_set_protected:Npn \__debug_log:x { \iow_log:x }
-      \cs_set_protected:Npn \__debug_suspend_log:
-        {
-          \cs_set_protected:Npx \__debug_resume_log:
-            {
-              \cs_set_protected:Npn \__debug_resume_log:
-                { \exp_not:o { \__debug_resume_log: } }
-              \cs_set_protected:Npn \__debug_log:x
-                { \exp_not:o { \__debug_log:x } }
-            }
-          \cs_set_protected:Npn \__debug_log:x { \use_none:n }
-        }
-      \cs_set_protected:Npn \__debug_resume_log: { }
-    }
-  \cs_set_protected:Npn \debug_log_functions_off:
-    {
-      \cs_set_protected:Npn \__debug_log:x { \use_none:n }
-      \cs_set_protected:Npn \__debug_suspend_log: { }
-      \cs_set_protected:Npn \__debug_resume_log: { }
-    }
-  \tex_ifodd:D \l at expl@log at functions@bool
-    \debug_log_functions_on:
-  \else:
-    \debug_log_functions_off:
-  \fi:
-\fi:
-\cs_set_protected:Npn \__debug_patch:nnNw #1#2 { }
-\tex_ifodd:D \l at expl@enable at debug@bool
-  \cs_set_protected:Npn \__debug_patch:nnNw #1#2#3
-    {
-      \tex_ifcase:D
-        \if_meaning:w #3 \cs_new_protected:Npn  1~ \fi:
-        \if_meaning:w #3 \cs_new:Npn            1~ \fi:
-        \if_meaning:w #3 \cs_set_protected:Npn  1~ \fi:
-        \if_meaning:w #3 \cs_set:Npn            1~ \fi:
-        \if_meaning:w #3 \cs_gset_protected:Npn 1~ \fi:
-        \if_meaning:w #3 \cs_gset:Npn           1~ \fi:
-        \if_meaning:w #3 \prg_new_protected_conditional:Npnn 2~ \fi:
-        \if_meaning:w #3 \prg_new_conditional:Npnn           2~ \fi:
-        \__msg_kernel_error:nnx { kernel } { debug-unpatchable }
-          { \token_to_str:N #3 }
-      \or:
-        \exp_after:wN \__debug_patch_param:NNnnNnp
-        \exp_after:wN \__debug_patch_new:nnNNnn
-      \else:
-        \exp_after:wN \__debug_patch_param:NNnnNnp
-        \exp_after:wN \__debug_patch_new_conditional:nnNNnnn
-      \fi:
-      \use_none:nn {#1} {#2} #3
-    }
-  \cs_set_protected:Npn \__debug_patch_param:NNnnNnp #1#2#3#4#5#6#7#
-    { #1 {#3} {#4} #5 #6 {#7} }
-  \cs_set_protected:Npn \__debug_patch_new:nnNNnn #1#2#3#4#5#6
-    { #3 #4 #5 { #1 #6 #2 } }
-  \cs_set_protected:Npn \__debug_patch_new_conditional:nnNNnnn
-      #1#2#3#4#5#6#7
-    { #3 #4 #5 {#6} { #1 #7 #2 } }
-\fi:
-\__debug_patch:nnNw { }
+\__debug_patch:nnNNpn { }
   { \__debug_log:x { Defining~\token_to_str:N #1~ \msg_line_context: } }
 \cs_set_protected:Npn \__chk_if_free_cs:N #1
   {
@@ -1867,46 +1973,6 @@
   }
 \cs_set_protected:Npn \__chk_if_free_cs:c
   { \exp_args:Nc \__chk_if_free_cs:N }
-\cs_set_protected:Npn \debug_check_declarations_on:
-  {
-    \__msg_kernel_error:nnx { kernel } { enable-debug }
-      { \token_to_str:N \debug_check_declarations_on: }
-  }
-\cs_set_protected:Npn \debug_check_declarations_off:
-  {
-    \__msg_kernel_error:nnx { kernel } { enable-debug }
-      { \token_to_str:N \debug_check_declarations_off: }
-  }
-\tex_ifodd:D \l at expl@enable at debug@bool
-  \cs_set_protected:Npn \debug_check_declarations_on:
-    {
-      \cs_set_protected:Npn \__chk_if_exist_var:N ##1
-        {
-          \cs_if_exist:NF ##1
-            {
-              \__msg_kernel_error:nnx { check } { non-declared-variable }
-                { \token_to_str:N ##1 }
-            }
-        }
-    }
-  \cs_set_protected:Npn \debug_check_declarations_off:
-    { \cs_set_protected:Npn \__chk_if_exist_var:N ##1 { } }
-  \tex_ifodd:D \l at expl@check at declarations@bool
-    \debug_check_declarations_on:
-  \else:
-    \debug_check_declarations_off:
-  \fi:
-\fi:
-\cs_set_protected:Npn \__chk_if_exist_cs:N #1
-  {
-    \cs_if_exist:NF #1
-      {
-        \__msg_kernel_error:nnx { kernel } { command-not-defined }
-          { \token_to_str:N #1 }
-      }
-  }
-\cs_set_protected:Npn \__chk_if_exist_cs:c
-  { \exp_args:Nc \__chk_if_exist_cs:N }
 \cs_set:Npn \__cs_tmp:w #1#2
   {
     \cs_set_protected:Npn #1 ##1
@@ -1981,7 +2047,7 @@
     \exp_args:Nx \__cs_parm_from_arg_count_test:nnF
       {
         \exp_after:wN \exp_not:n
-        \if_case:w \__int_eval:w #2 \__int_eval_end:
+        \if_case:w \__int_eval:w (#2) \__int_eval_end:
              { }
         \or: { ##1 }
         \or: { ##1##2 }
@@ -2439,9 +2505,9 @@
 \cs_new:Npn ^^@{\expansionERROR}
 \cs_new:Npn \exp_end_continue_f:nw #1 { `^^@ #1 }
 \tex_catcode:D `\^^@=15
+\__debug_patch:nnNNpn { \__debug_chk_cs_exist:N #1 } { }
 \cs_new_protected:Npn \cs_generate_variant:Nn #1#2
   {
-    \__chk_if_exist_cs:N #1
     \__cs_generate_variant:N #1
     \exp_after:wN \__cs_split_function:NN
     \exp_after:wN #1
@@ -2576,7 +2642,7 @@
       \fi:
     \fi:
   }
-\__debug_patch:nnNw
+\__debug_patch:nnNNpn
   {
     \cs_if_free:NF #4
       {
@@ -2665,14 +2731,14 @@
 \tex_ifodd:D \l at expl@enable at debug@bool
   \cs_new_protected:Npn \tl_set_eq:NN #1#2
     {
-      \__chk_if_exist_var:N #1
-      \__chk_if_exist_var:N #2
+      \__debug_chk_var_exist:N #1
+      \__debug_chk_var_exist:N #2
       \cs_set_eq:NN #1 #2
     }
   \cs_new_protected:Npn \tl_gset_eq:NN #1#2
     {
-      \__chk_if_exist_var:N #1
-      \__chk_if_exist_var:N #2
+      \__debug_chk_var_exist:N #1
+      \__debug_chk_var_exist:N #2
       \cs_gset_eq:NN #1 #2
     }
 \else:
@@ -2681,20 +2747,20 @@
 \fi:
 \cs_generate_variant:Nn \tl_set_eq:NN { cN, Nc, cc }
 \cs_generate_variant:Nn \tl_gset_eq:NN { cN, Nc, cc }
-\__debug_patch:nnNw
+\__debug_patch:nnNNpn
   {
-    \__chk_if_exist_var:N #1
-    \__chk_if_exist_var:N #2
-    \__chk_if_exist_var:N #3
+    \__debug_chk_var_exist:N #1
+    \__debug_chk_var_exist:N #2
+    \__debug_chk_var_exist:N #3
   }
   { }
 \cs_new_protected:Npn \tl_concat:NNN #1#2#3
   { \tl_set:Nx #1 { \exp_not:o {#2} \exp_not:o {#3} } }
-\__debug_patch:nnNw
+\__debug_patch:nnNNpn
   {
-    \__chk_if_exist_var:N #1
-    \__chk_if_exist_var:N #2
-    \__chk_if_exist_var:N #3
+    \__debug_chk_var_exist:N #1
+    \__debug_chk_var_exist:N #2
+    \__debug_chk_var_exist:N #3
   }
   { }
 \cs_new_protected:Npn \tl_gconcat:NNN #1#2#3
@@ -2705,22 +2771,22 @@
 \prg_new_eq_conditional:NNn \tl_if_exist:c \cs_if_exist:c { TF , T , F , p }
 \tl_const:Nn \c_empty_tl { }
 \tl_const:Nn \c_space_tl { ~ }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \tl_set:Nn #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:n {#2} } }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \tl_set:No #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:o {#2} } }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \tl_set:Nx #1#2
   { \cs_set_nopar:Npx #1 {#2} }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \tl_gset:Nn #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:n {#2} } }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \tl_gset:No #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:o {#2} } }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \tl_gset:Nx #1#2
   { \cs_gset_nopar:Npx #1 {#2} }
 \cs_generate_variant:Nn \tl_set:Nn  {         NV , Nv , Nf }
@@ -2729,28 +2795,28 @@
 \cs_generate_variant:Nn \tl_gset:Nn {         NV , Nv , Nf }
 \cs_generate_variant:Nn \tl_gset:Nx { c }
 \cs_generate_variant:Nn \tl_gset:Nn { c, co , cV , cv , cf }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \tl_put_left:Nn #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:n {#2} \exp_not:o #1 } }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \tl_put_left:NV #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:V #2 \exp_not:o #1 } }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \tl_put_left:No #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:o {#2} \exp_not:o #1 } }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \tl_put_left:Nx #1#2
   { \cs_set_nopar:Npx #1 { #2 \exp_not:o #1 } }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \tl_gput_left:Nn #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:n {#2} \exp_not:o #1 } }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \tl_gput_left:NV #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:V #2 \exp_not:o #1 } }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \tl_gput_left:No #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:o {#2} \exp_not:o #1 } }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \tl_gput_left:Nx #1#2
   { \cs_gset_nopar:Npx #1 { #2 \exp_not:o {#1} } }
 \cs_generate_variant:Nn \tl_put_left:Nn  { c }
@@ -2761,28 +2827,28 @@
 \cs_generate_variant:Nn \tl_gput_left:NV { c }
 \cs_generate_variant:Nn \tl_gput_left:No { c }
 \cs_generate_variant:Nn \tl_gput_left:Nx { c }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \tl_put_right:Nn #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:o #1 \exp_not:n {#2} } }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \tl_put_right:NV #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:o #1 \exp_not:V #2 } }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \tl_put_right:No #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:o #1 \exp_not:o {#2} } }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \tl_put_right:Nx #1#2
   { \cs_set_nopar:Npx #1 { \exp_not:o #1 #2 } }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \tl_gput_right:Nn #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:o #1 \exp_not:n {#2} } }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \tl_gput_right:NV #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:o #1 \exp_not:V #2 } }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \tl_gput_right:No #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:o #1 \exp_not:o {#2} } }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \tl_gput_right:Nx #1#2
   { \cs_gset_nopar:Npx #1 { \exp_not:o {#1} #2 } }
 \cs_generate_variant:Nn \tl_put_right:Nn  { c }
@@ -3509,24 +3575,10 @@
 \tl_new:N \g_tmpb_tl
 \tl_new:N \l_tmpa_tl
 \tl_new:N \l_tmpb_tl
-\cs_new_protected:Npn \tl_to_lowercase:n #1
-  {
-    \__msg_kernel_warning:nnxxx { kernel } { deprecated-command }
-      { 2017-12-31 }
-      { \token_to_str:N \tl_to_lowercase:n }
-      { }
-    \cs_gset_eq:NN \tl_to_lowercase:n \tex_lowercase:D
-    \tex_lowercase:D {#1}
-  }
-\cs_new_protected:Npn \tl_to_uppercase:n #1
-  {
-    \__msg_kernel_warning:nnxxx { kernel } { deprecated-command }
-      { 2017-12-31 }
-      { \token_to_str:N \tl_to_uppercase:n }
-      { }
-    \cs_gset_eq:NN \tl_to_uppercase:n \tex_uppercase:D
-    \tex_uppercase:D {#1}
-  }
+\__debug_deprecation:nnNNpn { 2017-12-31 } { \tex_lowercase:D }
+\cs_new_protected:Npn \tl_to_lowercase:n #1 { \tex_lowercase:D {#1} }
+\__debug_deprecation:nnNNpn { 2017-12-31 } { \tex_uppercase:D }
+\cs_new_protected:Npn \tl_to_uppercase:n #1 { \tex_uppercase:D {#1} }
 %% File: l3str.dtx Copyright (C) 2011-2017 The LaTeX3 Project
 \group_begin:
   \cs_set_protected:Npn \__str_tmp:n #1
@@ -3753,6 +3805,7 @@
   }
 \cs_new:Npn \str_item_ignore_spaces:nn #1
   { \exp_args:No \__str_item:nn { \tl_to_str:n {#1} } }
+\__debug_patch_args:nNNpn { {#1} { (#2) } }
 \cs_new:Npn \__str_item:nn #1#2
   {
     \exp_after:wN \__str_item:w
@@ -3811,6 +3864,7 @@
   }
 \cs_new:Npn \str_range_ignore_spaces:nnn #1
   { \exp_args:No \__str_range:nnn { \tl_to_str:n {#1} } }
+\__debug_patch_args:nNNpn { {#1} { (#2) } { (#3) } }
 \cs_new:Npn \__str_range:nnn #1#2#3
   {
     \exp_after:wN \__str_range:w
@@ -4709,8 +4763,10 @@
 \cs_new_eq:NN \__int_eval_end:    \tex_relax:D
 \cs_new_eq:NN \if_int_odd:w     \tex_ifodd:D
 \cs_new_eq:NN \if_case:w        \tex_ifcase:D
+\__debug_patch_args:nNNpn { { (#1) } }
 \cs_new:Npn \int_eval:n #1
   { \__int_value:w \__int_eval:w #1 \__int_eval_end: }
+\__debug_patch_args:nNNpn { { (#1) } }
 \cs_new:Npn \int_abs:n #1
   {
     \__int_value:w \exp_after:wN \__int_abs:N
@@ -4719,6 +4775,7 @@
   }
 \cs_new:Npn \__int_abs:N #1
   { \if_meaning:w - #1 \else: \exp_after:wN #1 \fi: }
+\__debug_patch_args:nNNpn { { (#1) } { (#2) } }
 \cs_set:Npn \int_max:nn #1#2
   {
     \__int_value:w \exp_after:wN \__int_maxmin:wwN
@@ -4727,6 +4784,7 @@
       >
     \exp_stop_f:
   }
+\__debug_patch_args:nNNpn { { (#1) } { (#2) } }
 \cs_set:Npn \int_min:nn #1#2
   {
     \__int_value:w \exp_after:wN \__int_maxmin:wwN
@@ -4743,6 +4801,7 @@
       #2
     \fi:
   }
+\__debug_patch_args:nNNpn { { (#1) } { (#2) } }
 \cs_new:Npn \int_div_truncate:nn #1#2
   {
     \__int_value:w \__int_eval:w
@@ -4766,6 +4825,7 @@
   }
 \cs_new:Npn \int_div_round:nn #1#2
   { \__int_value:w \__int_eval:w ( #1 ) / ( #2 ) \__int_eval_end: }
+\__debug_patch_args:nNNpn { { (#1) } { (#2) } }
 \cs_new:Npn \int_mod:nn #1#2
   {
     \__int_value:w \__int_eval:w \exp_after:wN \__int_mod:ww
@@ -4797,7 +4857,7 @@
           {
             \__chk_if_free_cs:N #1
             \tex_global:D \__int_constdef:Nw #1 =
-              \__int_eval:w #2 \__int_eval_end:
+              \__int_eval:w (#2) \__int_eval_end:
           }
       }
   }
@@ -4835,8 +4895,10 @@
   { TF , T , F , p }
 \prg_new_eq_conditional:NNn \int_if_exist:c \cs_if_exist:c
   { TF , T , F , p }
+\__debug_patch_args:nNNpn { {#1} { (#2) } }
 \cs_new_protected:Npn \int_add:Nn #1#2
   { \tex_advance:D #1 by \__int_eval:w #2 \__int_eval_end: }
+\__debug_patch_args:nNNpn { {#1} { (#2) } }
 \cs_new_protected:Npn \int_sub:Nn #1#2
   { \tex_advance:D #1 by - \__int_eval:w #2 \__int_eval_end: }
 \cs_new_protected:Npn \int_gadd:Nn
@@ -4859,6 +4921,7 @@
 \cs_generate_variant:Nn \int_decr:N  { c }
 \cs_generate_variant:Nn \int_gincr:N { c }
 \cs_generate_variant:Nn \int_gdecr:N { c }
+\__debug_patch_args:nNNpn { {#1} { (#2) } }
 \cs_new_protected:Npn \int_set:Nn #1#2
   { #1 ~ \__int_eval:w #2 \__int_eval_end: }
 \cs_new_protected:Npn \int_gset:Nn { \tex_global:D \int_set:Nn }
@@ -4934,6 +4997,7 @@
   { \__int_compare:nnN { \if_int_compare:w } {#3} > }
 \cs_new:cpn { __int_compare_>=:NNw } #1#2#3 >=
   { \__int_compare:nnN { \if_int_compare:w } {#3} < }
+\__debug_patch_conditional_args:nNNpnn { { (#1) \__int_eval_end: } {#2} { (#3) } }
 \prg_new_conditional:Npnn \int_compare:nNn #1#2#3 { p , T , F , TF }
   {
     \if_int_compare:w \__int_eval:w #1 #2 \__int_eval:w #3 \__int_eval_end:
@@ -4971,6 +5035,7 @@
       { \__int_case:nw {#1} }
   }
 \cs_new_eq:NN \__int_case_end:nw \__prg_case_end:nw
+\__debug_patch_conditional_args:nNNpnn { { (#1) } }
 \prg_new_conditional:Npnn \int_if_odd:n #1 { p , T , F , TF}
   {
     \if_int_odd:w \__int_eval:w #1 \__int_eval_end:
@@ -4979,6 +5044,7 @@
       \prg_return_false:
     \fi:
   }
+\__debug_patch_conditional_args:nNNpnn { { (#1) } }
 \prg_new_conditional:Npnn \int_if_even:n #1 { p , T , F , TF}
   {
     \if_int_odd:w \__int_eval:w #1 \__int_eval_end:
@@ -5043,6 +5109,7 @@
     \int_compare:nNnF {#1} #2 {#3}
       { \int_do_until:nNnn {#1} #2 {#3} {#4} }
   }
+\__debug_patch_args:nNNpn { { (#1) } { (#2) } { (#3) } }
 \cs_new:Npn \int_step_function:nnnN #1#2#3
   {
     \exp_after:wN \__int_step:wwwN
@@ -5499,7 +5566,16 @@
 \int_new:N \l_tmpb_int
 \int_new:N \g_tmpa_int
 \int_new:N \g_tmpb_int
-\cs_new_eq:NN \c_minus_one \m at ne
+\cs_gset_eq:NN \c__deprecation_minus_one \m at ne
+\cs_new_eq:NN \c_minus_one \c__deprecation_minus_one
+\__debug:TF
+  {
+    \tl_gput_right:Nn \g__debug_deprecation_on_tl
+      { \__deprecation_error:Nnn \c_minus_one { -1 } { 2018-12-31 } }
+    \tl_gput_right:Nn \g__debug_deprecation_off_tl
+      { \tex_let:D \c_minus_one \c__deprecation_minus_one }
+  }
+  { }
 %% File: l3intarray.dtx Copyright (C) 2017 The LaTeX3 Project
 \int_new:N \g__intarray_font_int
 \cs_new_protected:Npn \__intarray_new:Nn #1#2
@@ -5560,8 +5636,8 @@
     \cs_new:cpn { flag~#1 } ##1 ;
       { \exp_after:wN \use_none:n \cs:w flag~#1~##1 \cs_end: }
   }
-\__debug_patch:nnNw
-  { \exp_args:Nc \__chk_if_exist_var:N { flag~#1 } } { }
+\__debug_patch:nnNNpn
+  { \exp_args:Nc \__debug_chk_var_exist:N { flag~#1 } } { }
 \cs_new_protected:Npn \flag_clear:n #1 { \__flag_clear:wn 0 ; {#1} }
 \cs_new_protected:Npn \__flag_clear:wn #1 ; #2
   {
@@ -5598,7 +5674,7 @@
     \cs_if_exist:cTF { flag~#1 }
       { \prg_return_true: } { \prg_return_false: }
   }
-\__debug_patch:nnNw { \__flag_chk_exist:n {#1} } { }
+\__debug_patch_conditional:nNNpnn { \__flag_chk_exist:n {#1} }
 \prg_new_conditional:Npnn \flag_if_raised:n #1 { p , T , F , TF }
   {
     \if_cs_exist:w flag~#1~0 \cs_end:
@@ -5607,7 +5683,7 @@
       \prg_return_false:
     \fi:
   }
-\__debug_patch:nnNw { \__flag_chk_exist:n {#1} } { }
+\__debug_patch:nnNNpn { \__flag_chk_exist:n {#1} } { }
 \cs_new:Npn \flag_height:n #1 { \__flag_height_loop:wn 0; {#1} }
 \cs_new:Npn \__flag_height_loop:wn #1 ; #2
   {
@@ -5736,16 +5812,16 @@
 \cs_new_eq:NN \if_predicate:w \tex_ifodd:D
 \cs_new_protected:Npn \bool_new:N #1 { \cs_new_eq:NN #1 \c_false_bool }
 \cs_generate_variant:Nn \bool_new:N { c }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \bool_set_true:N #1
   { \cs_set_eq:NN #1 \c_true_bool }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \bool_set_false:N #1
   { \cs_set_eq:NN #1 \c_false_bool }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \bool_gset_true:N #1
   { \cs_gset_eq:NN #1 \c_true_bool }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \bool_gset_false:N #1
   { \cs_gset_eq:NN #1 \c_false_bool }
 \cs_generate_variant:Nn \bool_set_true:N   { c }
@@ -5756,10 +5832,10 @@
 \cs_new_eq:NN \bool_gset_eq:NN \tl_gset_eq:NN
 \cs_generate_variant:Nn \bool_set_eq:NN { Nc, cN, cc }
 \cs_generate_variant:Nn \bool_gset_eq:NN { Nc, cN, cc }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \bool_set:Nn #1#2
   { \tex_chardef:D #1 = \bool_if_p:n {#2} }
-\__debug_patch:nnNw { \__chk_if_exist_var:N #1 } { }
+\__debug_patch:nnNNpn { \__debug_chk_var_exist:N #1 } { }
 \cs_new_protected:Npn \bool_gset:Nn #1#2
   { \tex_global:D \tex_chardef:D #1 = \bool_if_p:n {#2} }
 \cs_generate_variant:Nn \bool_set:Nn  { c }
@@ -5766,7 +5842,7 @@
 \cs_generate_variant:Nn \bool_gset:Nn { c }
 \prg_new_conditional:Npnn \bool_if:N #1 { p , T , F , TF }
   {
-    \if_meaning:w \c_true_bool #1
+    \if_bool:N #1
       \prg_return_true:
     \else:
       \prg_return_false:
@@ -5810,23 +5886,11 @@
 \cs_new:Npn \bool_if_p:n #1
   {
     \group_align_safe_begin:
-    \__bool_if_left_parentheses:wwwn \q_nil
-      #1 \q_mark { }
-      (  \q_mark { \__bool_if_right_parentheses:wwwn \q_nil }
-      )  \q_mark { \__bool_if_or:wwwn \q_nil }
-      || \q_mark \__bool_if_parse:NNNww
-    \q_stop
+    \exp_after:wN
+    \group_align_safe_end:
+    \exp:w \exp_end_continue_f:w % (
+    \__bool_get_next:NN \use_i:nnnn #1 )
   }
-\cs_new:Npn \__bool_if_left_parentheses:wwwn #1 \q_nil #2 ( #3 \q_mark #4
-  { #4 \__bool_if_left_parentheses:wwwn #1 #2 (( \q_nil #3 \q_mark {#4} }
-\cs_new:Npn \__bool_if_right_parentheses:wwwn #1 \q_nil #2 ) #3 \q_mark #4
-  { #4 \__bool_if_right_parentheses:wwwn #1 #2 )) \q_nil #3 \q_mark {#4} }
-\cs_new:Npn \__bool_if_or:wwwn #1 \q_nil #2 || #3 \q_mark #4
-  { #4 \__bool_if_or:wwwn #1 #2 )||( \q_nil #3 \q_mark {#4} }
-\cs_new:Npn \__bool_if_parse:NNNww #1#2#3#4 \q_mark #5 \q_stop
-  {
-    \__bool_get_next:NN \use_i:nn (( #4 )) S
-  }
 \cs_new:Npn \__bool_get_next:NN #1#2
   {
     \use:c
@@ -5838,11 +5902,14 @@
       #1 #2
   }
 \cs_new:cpn { __bool_!:Nw } #1#2
-  { \exp_after:wN \__bool_get_next:NN #1 \use_ii:nn \use_i:nn }
+  {
+    \exp_after:wN \__bool_get_next:NN
+    #1 \use_ii:nnnn \use_i:nnnn \use_iii:nnnn \use_iv:nnnn
+  }
 \cs_new:cpn { __bool_(:Nw } #1#2
   {
     \exp_after:wN \__bool_choose:NNN \exp_after:wN #1
-    \__int_value:w \__bool_get_next:NN \use_i:nn
+    \__int_value:w \__bool_get_next:NN \use_i:nnnn
   }
 \cs_new:cpn { __bool_p:Nw } #1
   { \exp_after:wN \__bool_choose:NNN \exp_after:wN #1 \__int_value:w }
@@ -5850,38 +5917,19 @@
   {
     \use:c
       {
-        __bool_ #3 _
-        #1 #2 { \if_meaning:w 0 #2 1 \else: 0 \fi: }
-        :w
+        __bool_ \token_to_str:N #3 _
+        #1 #2 { \if_meaning:w 0 #2 1 \else: 0 \fi: } 2 0 :
       }
   }
-\cs_new:cpn { __bool_)_0:w } { \c_false_bool }
-\cs_new:cpn { __bool_)_1:w } { \c_true_bool }
-\cs_new:cpn { __bool_S_0:w } { \group_align_safe_end: \c_false_bool }
-\cs_new:cpn { __bool_S_1:w } { \group_align_safe_end: \c_true_bool }
-\cs_new:cpn { __bool_&_1:w } & { \__bool_get_next:NN \use_i:nn }
-\cs_new:cpn { __bool_|_0:w } | { \__bool_get_next:NN \use_i:nn }
-\cs_new:cpn { __bool_&_0:w } &
-  { \__bool_eval_skip_to_end_auxi:Nw \c_false_bool }
-\cs_new:cpn { __bool_|_1:w } |
-  { \__bool_eval_skip_to_end_auxi:Nw \c_true_bool }
-%% (
-\cs_new:Npn \__bool_eval_skip_to_end_auxi:Nw #1#2 )
-  {
-    \__bool_eval_skip_to_end_auxii:Nw #1#2 ( % )
-    \q_no_value \q_stop
-    {#2}
-  }
-\cs_new:Npn \__bool_eval_skip_to_end_auxii:Nw #1#2 ( #3#4 \q_stop #5 % )
-  {
-    \quark_if_no_value:NTF #3
-    {#1}
-    { \__bool_eval_skip_to_end_auxiii:Nw #1 #5 }
-  }
-\cs_new:Npn \__bool_eval_skip_to_end_auxiii:Nw #1#2 ( #3 )
-  { % (
-    \__bool_eval_skip_to_end_auxi:Nw #1#3 )
-  }
+\cs_new:cpn { __bool_)_0: } { \c_false_bool }
+\cs_new:cpn { __bool_)_1: } { \c_true_bool }
+\cs_new:cpn { __bool_)_2: } { \c_true_bool }
+\cs_new:cpn { __bool_&_0: } & { \__bool_get_next:NN \use_iv:nnnn }
+\cs_new:cpn { __bool_&_1: } & { \__bool_get_next:NN \use_i:nnnn }
+\cs_new:cpn { __bool_&_2: } & { \__bool_get_next:NN \use_iii:nnnn }
+\cs_new:cpn { __bool_|_0: } | { \__bool_get_next:NN \use_i:nnnn }
+\cs_new:cpn { __bool_|_1: } | { \__bool_get_next:NN \use_iii:nnnn }
+\cs_new:cpn { __bool_|_2: } | { \__bool_get_next:NN \use_iii:nnnn }
 \prg_new_conditional:Npnn \bool_lazy_all:n #1 { p , T , F , TF }
   { \__bool_lazy_all:n #1 \q_recursion_tail \q_recursion_stop }
 \cs_new:Npn \__bool_lazy_all:n #1
@@ -5957,6 +6005,7 @@
     #2
     \bool_if:nF {#1} { \bool_do_until:nn {#1} {#2}  }
   }
+\__debug_patch_args:nNNpn { { (#1) } }
 \cs_new:Npn \prg_replicate:nn #1
   {
     \exp:w
@@ -6564,13 +6613,15 @@
 \clist_new:N \g_tmpa_clist
 \clist_new:N \g_tmpb_clist
 %% File: l3token.dtx Copyright (C) 2005-2017 The LaTeX3 Project
+\__debug_patch_args:nNNpn { { (#1) } { (#2) } }
 \cs_new_protected:Npn \char_set_catcode:nn #1#2
   {
     \tex_catcode:D \__int_eval:w #1 \__int_eval_end:
       = \__int_eval:w #2 \__int_eval_end:
-   }
+  }
+\__debug_patch_args:nNNpn { { (#1) } }
 \cs_new:Npn \char_value_catcode:n #1
-  { \tex_the:D \tex_catcode:D \__int_eval:w #1\__int_eval_end: }
+  { \tex_the:D \tex_catcode:D \__int_eval:w #1 \__int_eval_end: }
 \cs_new_protected:Npn \char_show_value_catcode:n #1
   { \__msg_show_wrap:n { > ~ \char_value_catcode:n {#1} } }
 \cs_new_protected:Npn \char_set_catcode_escape:N #1
@@ -6637,40 +6688,48 @@
   { \char_set_catcode:nn {#1} { 14 } }
 \cs_new_protected:Npn \char_set_catcode_invalid:n #1
   { \char_set_catcode:nn {#1} { 15 } }
+\__debug_patch_args:nNNpn { { (#1) } { (#2) } }
 \cs_new_protected:Npn \char_set_mathcode:nn #1#2
   {
     \tex_mathcode:D \__int_eval:w #1 \__int_eval_end:
     = \__int_eval:w #2 \__int_eval_end:
   }
+\__debug_patch_args:nNNpn { { (#1) } }
 \cs_new:Npn \char_value_mathcode:n #1
-  { \tex_the:D \tex_mathcode:D \__int_eval:w #1\__int_eval_end: }
+  { \tex_the:D \tex_mathcode:D \__int_eval:w #1 \__int_eval_end: }
 \cs_new_protected:Npn \char_show_value_mathcode:n #1
   { \__msg_show_wrap:n { > ~ \char_value_mathcode:n {#1} } }
+\__debug_patch_args:nNNpn { { (#1) } { (#2) } }
 \cs_new_protected:Npn \char_set_lccode:nn #1#2
   {
     \tex_lccode:D \__int_eval:w #1 \__int_eval_end:
     = \__int_eval:w #2 \__int_eval_end:
   }
+\__debug_patch_args:nNNpn { { (#1) } }
 \cs_new:Npn \char_value_lccode:n #1
-  { \tex_the:D \tex_lccode:D \__int_eval:w #1\__int_eval_end: }
+  { \tex_the:D \tex_lccode:D \__int_eval:w #1 \__int_eval_end: }
 \cs_new_protected:Npn \char_show_value_lccode:n #1
   { \__msg_show_wrap:n { > ~ \char_value_lccode:n {#1} } }
+\__debug_patch_args:nNNpn { { (#1) } { (#2) } }
 \cs_new_protected:Npn \char_set_uccode:nn #1#2
   {
     \tex_uccode:D \__int_eval:w #1 \__int_eval_end:
     = \__int_eval:w #2 \__int_eval_end:
   }
+\__debug_patch_args:nNNpn { { (#1) } }
 \cs_new:Npn \char_value_uccode:n #1
-  { \tex_the:D \tex_uccode:D \__int_eval:w #1\__int_eval_end: }
+  { \tex_the:D \tex_uccode:D \__int_eval:w #1 \__int_eval_end: }
 \cs_new_protected:Npn \char_show_value_uccode:n #1
   { \__msg_show_wrap:n { > ~ \char_value_uccode:n {#1} } }
+\__debug_patch_args:nNNpn { { (#1) } { (#2) } }
 \cs_new_protected:Npn \char_set_sfcode:nn #1#2
   {
     \tex_sfcode:D \__int_eval:w #1 \__int_eval_end:
     = \__int_eval:w #2 \__int_eval_end:
   }
+\__debug_patch_args:nNNpn { { (#1) } }
 \cs_new:Npn \char_value_sfcode:n #1
-  { \tex_the:D \tex_sfcode:D \__int_eval:w #1\__int_eval_end: }
+  { \tex_the:D \tex_sfcode:D \__int_eval:w #1 \__int_eval_end: }
 \cs_new_protected:Npn \char_show_value_sfcode:n #1
   { \__msg_show_wrap:n { > ~ \char_value_sfcode:n {#1} } }
 \seq_new:N \l_char_special_seq
@@ -6699,6 +6758,7 @@
 \cs_generate_variant:Nn \char_gset_active_eq:NN { Nc }
 \cs_generate_variant:Nn \char_set_active_eq:nN  { nc }
 \cs_generate_variant:Nn \char_gset_active_eq:nN { nc }
+\__debug_patch_args:nNNpn { { (#1) } { (#2) } }
 \cs_new:Npn \char_generate:nn #1#2
   {
     \exp:w \exp_after:wN \__char_generate_aux:w
@@ -6709,8 +6769,7 @@
   {
     \exp:w \exp_after:wN
       \__char_generate_aux:nnw \exp_after:wN
-        { \__int_value:w \__int_eval:w #1 \exp_after:wN }
-          {#2} \exp_end:
+        { \__int_value:w \__int_eval:w #1 } {#2} \exp_end:
   }
 \cs_new:Npn \__char_generate_aux:w #1 ; #2 ;
   {
@@ -7106,45 +7165,35 @@
   { \tex_global:D \tex_futurelet:D \g_peek_token }
 \cs_new_protected:Npn \__peek_true_remove:w
   {
-    \group_align_safe_end:
     \tex_afterassignment:D \__peek_true_aux:w
     \cs_set_eq:NN \__peek_tmp:w
   }
-\cs_new_protected:Npn \__peek_token_generic:NNTF #1#2#3#4
+\cs_new_protected:Npn \__peek_token_generic_aux:NNNTF #1#2#3#4#5
   {
-    \cs_set_eq:NN \l__peek_search_token #2
-    \tl_set:Nn \l__peek_search_tl {#2}
-    \cs_set:Npx \__peek_true:w
+    \group_align_safe_begin:
+    \cs_set_eq:NN \l__peek_search_token #3
+    \tl_set:Nn \l__peek_search_tl {#3}
+    \cs_set:Npx \__peek_true_aux:w
       {
         \exp_not:N \group_align_safe_end:
-        \exp_not:n {#3}
+        \exp_not:n {#4}
       }
+    \cs_set_eq:NN \__peek_true:w #1
     \cs_set:Npx \__peek_false:w
       {
         \exp_not:N \group_align_safe_end:
-        \exp_not:n {#4}
+        \exp_not:n {#5}
       }
-    \group_align_safe_begin:
-      \peek_after:Nw #1
+    \peek_after:Nw #2
   }
+\cs_new_protected:Npn \__peek_token_generic:NNTF
+  { \__peek_token_generic_aux:NNNTF \__peek_true_aux:w }
 \cs_new_protected:Npn \__peek_token_generic:NNT #1#2#3
   { \__peek_token_generic:NNTF #1 #2 {#3} { } }
 \cs_new_protected:Npn \__peek_token_generic:NNF #1#2#3
   { \__peek_token_generic:NNTF #1 #2 { } {#3} }
-\cs_new_protected:Npn \__peek_token_remove_generic:NNTF #1#2#3#4
-  {
-    \cs_set_eq:NN \l__peek_search_token #2
-    \tl_set:Nn \l__peek_search_tl {#2}
-    \cs_set_eq:NN \__peek_true:w \__peek_true_remove:w
-    \cs_set:Npx \__peek_true_aux:w { \exp_not:n {#3} }
-    \cs_set:Npx \__peek_false:w
-      {
-        \exp_not:N \group_align_safe_end:
-        \exp_not:n {#4}
-      }
-    \group_align_safe_begin:
-      \peek_after:Nw #1
-  }
+\cs_new_protected:Npn \__peek_token_remove_generic:NNTF
+  { \__peek_token_generic_aux:NNNTF \__peek_true_remove:w }
 \cs_new_protected:Npn \__peek_token_remove_generic:NNT #1#2#3
   { \__peek_token_remove_generic:NNTF #1 #2 {#3} { } }
 \cs_new_protected:Npn \__peek_token_remove_generic:NNF #1#2#3
@@ -7580,7 +7629,7 @@
     \cs_if_exist:cTF { \c__msg_text_prefix_tl #1 / #2 }
       { \prg_return_true: } { \prg_return_false: }
   }
-\__debug_patch:nnNw { }
+\__debug_patch:nnNNpn { }
   { \__debug_log:x { Defining~message~ #1 / #2 ~\msg_line_context: } }
 \cs_new_protected:Npn \__chk_if_free_msg:nn #1#2
   {
@@ -8216,9 +8265,14 @@
   }
 \bool_if:NTF \l at expl@enable at debug@bool
   {
-    \__msg_kernel_new:nnn { kernel } { debug-unpatchable }
-      { Only~some~definitions~can~be~patched;~'#3'~cannot. }
-    \__msg_kernel_new:nnnn { check } { non-declared-variable }
+    \__msg_kernel_new:nnnn { kernel } { debug }
+      { The~debugging~option~'#1'~does~not~exist~\msg_line_context:. }
+      {
+        The~functions~'\iow_char:N\\debug_on:n'~and~
+        '\iow_char:N\\debug_off:n'~only~accept~the~arguments~
+        'check-declarations',~'deprecation',~'log-functions',~not~'#1'.
+      }
+    \__msg_kernel_new:nnnn { kernel } { non-declared-variable }
       { The~variable~#1~has~not~been~declared~\msg_line_context:. }
       {
         Checking~is~active,~and~you~have~tried~do~so~something~like: \\
@@ -8646,10 +8700,10 @@
   { 1 }
   {
     \cs_if_exist:NTF \normalend
-      { \tex_count:D 38 \scan_stop: }
+      { \tex_count:D 38 ~ }
       {
-        \tex_count:D 16 \scan_stop:
-          \cs_if_exist:NT \loccount { - 1 }
+        \tex_count:D 16 ~ %
+        \cs_if_exist:NT \loccount { - 1 }
       }
   }
   {
@@ -8795,10 +8849,10 @@
   { 1 }
   {
     \cs_if_exist:NTF \normalend
-      { \tex_count:D 39 \scan_stop: }
+      { \tex_count:D 39 ~ }
       {
-        \tex_count:D 17 \scan_stop:
-          \cs_if_exist:NT \loccount { - 1 }
+        \tex_count:D 17 ~
+        \cs_if_exist:NT \loccount { - 1 }
       }
   }
   {
@@ -8945,7 +8999,8 @@
       \cs_set_eq:NN \  \c_catcode_other_space_tl
       \cs_set_eq:NN \iow_indent:n \__iow_indent:n
       #3
-      \__iow_wrap_set:Nx \l__iow_wrap_tl {#1}
+      \cs_set_eq:NN \protect \token_to_str:N
+      \tl_set:Nx \l__iow_wrap_tl {#1}
       \cs_set_eq:NN \iow_indent:n \__iow_indent_error:n
       \tl_set:Nx \l__iow_newline_tl { \iow_newline: #2 }
       \tl_set:Nx \l__iow_newline_tl { \tl_to_str:N \l__iow_newline_tl }
@@ -8955,7 +9010,6 @@
     \exp_args:NNf \group_end:
     #4 { \tl_to_str:N \l__iow_wrap_tl }
   }
-\cs_new_eq:NN \__iow_wrap_set:Nx \protected at edef
 \cs_new_protected:Npn \__iow_wrap_do:
   {
     \tl_set:Nx \l__iow_wrap_tl
@@ -9187,95 +9241,51 @@
   }
 \tl_new:N \g_file_current_name_tl
 \tl_gset:Nn \g_file_current_name_tl { \g_file_curr_name_str }
-\cs_new_protected:Npn \file_path_include:n #1
+\__debug:TF
   {
-    \__msg_kernel_warning:nnxxx { kernel } { deprecated-command }
-      { 2018-12-31 }
-      { \token_to_str:N \file_path_include:n }
+    \tl_gput_right:Nn \g__debug_deprecation_on_tl
       {
-        \token_to_str:N \seq_put_right:Nn \c_space_tl
-        \token_to_str:N \l_file_search_path_seq
+        \__deprecation_error:Nnn \g_file_current_name_tl
+          { \g_file_curr_name_str } { 2018-12-31 }
       }
+    \tl_gput_right:Nn \g__debug_deprecation_off_tl
+      { \tex_def:D \g_file_current_name_tl { \g_file_curr_name_str } }
+  }
+  { }
+\__debug_deprecation:nnNNpn { 2018-12-31 }
+  { \seq_put_right:Nn \l_file_search_path_seq }
+\cs_new_protected:Npn \file_path_include:n #1
+  {
     \__file_name_sanitize:nN {#1} \l__file_full_name_str
     \seq_if_in:NVF \l_file_search_path_seq \l__file_full_name_str
       { \seq_put_right:NV \l_file_search_path_seq \l__file_full_name_str }
   }
+\__debug_deprecation:nnNNpn { 2018-12-31 }
+  { \seq_remove_all:Nn \l_file_search_path_seq }
 \cs_new_protected:Npn \file_path_remove:n #1
   {
-    \__msg_kernel_warning:nnxxx { kernel } { deprecated-command }
-      { 2018-12-31 }
-      { \token_to_str:N \file_path_remove:n }
-      {
-        \token_to_str:N \seq_remove_all:Nn \c_space_tl
-        \token_to_str:N \l_file_search_path_seq
-      }
     \__file_name_sanitize:nN {#1} \l__file_full_name_str
     \seq_remove_all:NV \l_file_search_path_seq \l__file_full_name_str
   }
+\__debug_deprecation:nnNNpn { 2018-12-31 } { \file_get_full_name:nN }
 \cs_new_protected:Npn \file_add_path:nN #1#2
   {
-    \__msg_kernel_warning:nnxxx { kernel } { deprecated-command }
-      { 2018-12-31 }
-      { \token_to_str:N \file_add_path:nN }
-      { \token_to_str:N \file_get_full_name:nN }
     \file_get_full_name:nN {#1} #2
     \str_if_empty:NT #2
       { \tl_set:Nn #2 { \q_no_value } }
   }
-\cs_new_protected:Npn \ior_get_str:NN
-  {
-    \__msg_kernel_warning:nnxxx { kernel } { deprecated-command }
-      { 2017-12-31 }
-      { \token_to_str:N \ior_get_str:NN }
-      { \token_to_str:N \ior_str_get:NN }
-    \cs_gset_eq:NN \ior_get_str:NN \ior_str_get:NN
-    \ior_str_get:NN
-  }
-\cs_new_protected:Npn \file_list:
-  {
-    \__msg_kernel_warning:nnxxx { kernel } { deprecated-command }
-      { 2018-12-31 }
-      { \token_to_str:N \file_list: }
-      { \token_to_str:N \file_log_list: }
-    \cs_gset_eq:NN \file_list: \file_log_list:
-    \file_log_list:
-  }
-\cs_new_protected:Npn \ior_list_streams:
-  {
-    \__msg_kernel_warning:nnxxx { kernel } { deprecated-command }
-      { 2018-12-31 }
-      { \token_to_str:N \ior_list_streams: }
-      { \token_to_str:N \ior_show_list: }
-    \cs_gset_eq:NN \ior_list_streams: \ior_show_list:
-    \ior_show_list:
-  }
-\cs_new_protected:Npn \ior_log_streams:
-  {
-    \__msg_kernel_warning:nnxxx { kernel } { deprecated-command }
-      { 2018-12-31 }
-      { \token_to_str:N \ior_log_streams: }
-      { \token_to_str:N \ior_log_list: }
-    \cs_gset_eq:NN \ior_log_streams: \ior_log_list:
-    \ior_log_list:
-  }
-\cs_new_protected:Npn \iow_list_streams:
-  {
-    \__msg_kernel_warning:nnxxx { kernel } { deprecated-command }
-      { 2018-12-31 }
-      { \token_to_str:N \iow_list_streams: }
-      { \token_to_str:N \iow_show_list: }
-    \cs_gset_eq:NN \iow_list_streams: \iow_show_list:
-    \iow_show_list:
-  }
-\cs_new_protected:Npn \iow_log_streams:
-  {
-    \__msg_kernel_warning:nnxxx { kernel } { deprecated-command }
-      { 2018-12-31 }
-      { \token_to_str:N \iow_log_streams: }
-      { \token_to_str:N \iow_log_list: }
-    \cs_gset_eq:NN \iow_log_streams: \iow_log_list:
-    \iow_log_list:
-  }
+\__debug_deprecation:nnNNpn { 2017-12-31 } { \ior_str_get:NN }
+\cs_new_protected:Npn \ior_get_str:NN      { \ior_str_get:NN }
+\__debug_deprecation:nnNNpn { 2018-12-31 } { \file_log_list: }
+\cs_new_protected:Npn \file_list:          { \file_log_list: }
+\__debug_deprecation:nnNNpn { 2018-12-31 } { \ior_show_list: }
+\cs_new_protected:Npn \ior_list_streams:   { \ior_show_list: }
+\__debug_deprecation:nnNNpn { 2018-12-31 } { \ior_log_list: }
+\cs_new_protected:Npn \ior_log_streams:    { \ior_log_list: }
+\__debug_deprecation:nnNNpn { 2018-12-31 } { \iow_show_list: }
+\cs_new_protected:Npn \iow_list_streams:   { \iow_show_list: }
+\__debug_deprecation:nnNNpn { 2018-12-31 } { \iow_log_list: }
+\cs_new_protected:Npn \iow_log_streams:    { \iow_log_list: }
 %% File: l3skip.dtx Copyright (C) 2004-2011 Frank Mittelbach, The LaTeX3 Project
 %%                            (C) 2012-2017 The LaTeX3 Project
 \cs_new_eq:NN \if_dim:w      \tex_ifdim:D
@@ -9307,6 +9317,7 @@
   { TF , T , F , p }
 \prg_new_eq_conditional:NNn \dim_if_exist:c \cs_if_exist:c
   { TF , T , F , p }
+\__debug_patch_args:nNNpn { {#1} { (#2) } }
 \cs_new_protected:Npn \dim_set:Nn #1#2
   { #1 ~ \__dim_eval:w #2 \__dim_eval_end: }
 \cs_new_protected:Npn \dim_gset:Nn { \tex_global:D \dim_set:Nn }
@@ -9318,16 +9329,19 @@
 \cs_new_protected:Npn \dim_gset_eq:NN #1#2 { \tex_global:D #1 = #2 }
 \cs_generate_variant:Nn \dim_gset_eq:NN {       c }
 \cs_generate_variant:Nn \dim_gset_eq:NN { Nc , cc }
+\__debug_patch_args:nNNpn { {#1} { (#2) } }
 \cs_new_protected:Npn \dim_add:Nn #1#2
   { \tex_advance:D #1 by \__dim_eval:w #2 \__dim_eval_end: }
 \cs_new_protected:Npn \dim_gadd:Nn { \tex_global:D \dim_add:Nn }
 \cs_generate_variant:Nn \dim_add:Nn  { c }
 \cs_generate_variant:Nn \dim_gadd:Nn { c }
+\__debug_patch_args:nNNpn { {#1} { (#2) } }
 \cs_new_protected:Npn \dim_sub:Nn #1#2
   { \tex_advance:D #1 by - \__dim_eval:w #2 \__dim_eval_end: }
 \cs_new_protected:Npn \dim_gsub:Nn { \tex_global:D \dim_sub:Nn }
 \cs_generate_variant:Nn \dim_sub:Nn  { c }
 \cs_generate_variant:Nn \dim_gsub:Nn { c }
+\__debug_patch_args:nNNpn { { (#1) } }
 \cs_new:Npn \dim_abs:n #1
   {
     \exp_after:wN \__dim_abs:N
@@ -9335,6 +9349,7 @@
   }
 \cs_new:Npn \__dim_abs:N #1
   { \if_meaning:w - #1 \else: \exp_after:wN #1 \fi: }
+\__debug_patch_args:nNNpn { { (#1) } { (#2) } }
 \cs_new:Npn \dim_max:nn #1#2
   {
     \dim_use:N \__dim_eval:w \exp_after:wN \__dim_maxmin:wwN
@@ -9343,6 +9358,7 @@
       >
     \__dim_eval_end:
   }
+\__debug_patch_args:nNNpn { { (#1) } { (#2) } }
 \cs_new:Npn \dim_min:nn #1#2
   {
     \dim_use:N \__dim_eval:w \exp_after:wN \__dim_maxmin:wwN
@@ -9363,6 +9379,7 @@
   { \__dim_ratio:n {#1} / \__dim_ratio:n {#2} }
 \cs_new:Npn \__dim_ratio:n #1
   { \__int_value:w \__dim_eval:w (#1) \__dim_eval_end: }
+\__debug_patch_conditional_args:nNNpnn { { (#1) \__dim_eval_end: } {#2} { (#3) } }
 \prg_new_conditional:Npnn \dim_compare:nNn #1#2#3 { p , T , F , TF }
   {
     \if_dim:w \__dim_eval:w #1 #2 \__dim_eval:w #3 \__dim_eval_end:
@@ -9489,14 +9506,16 @@
     \dim_compare:nNnF {#1} #2 {#3}
       { \dim_do_until:nNnn {#1} #2 {#3} {#4} }
   }
+\__debug_patch_args:nNNpn { { (#1) } }
 \cs_new:Npn \dim_eval:n #1
   { \dim_use:N \__dim_eval:w #1 \__dim_eval_end: }
 \cs_new_eq:NN \dim_use:N \tex_the:D
 \cs_new:Npn \dim_use:c #1 { \tex_the:D \cs:w #1 \cs_end: }
+\__debug_patch_args:nNNpn { { (#1) } }
 \cs_new:Npn \dim_to_decimal:n #1
   {
     \exp_after:wN
-      \__dim_to_decimal:w \dim_use:N \__dim_eval:w (#1) \__dim_eval_end:
+      \__dim_to_decimal:w \dim_use:N \__dim_eval:w #1 \__dim_eval_end:
   }
 \use:x
   {
@@ -9510,6 +9529,7 @@
       }
 \cs_new:Npn \dim_to_decimal_in_bp:n #1
   { \dim_to_decimal:n { ( #1 ) * 800 / 803 } }
+\__debug_patch_args:nNNpn { { (#1) } }
 \cs_new:Npn \dim_to_decimal_in_sp:n #1
   { \int_eval:n { \__dim_eval:w #1 \__dim_eval_end: } }
 \cs_new:Npn \dim_to_decimal_in_unit:nn #1#2
@@ -9560,6 +9580,7 @@
   { TF , T , F , p }
 \prg_new_eq_conditional:NNn \skip_if_exist:c \cs_if_exist:c
   { TF , T , F , p }
+\__debug_patch_args:nNNpn { {#1} { (#2) } }
 \cs_new_protected:Npn \skip_set:Nn #1#2
   { #1 ~ \etex_glueexpr:D #2 \scan_stop: }
 \cs_new_protected:Npn \skip_gset:Nn { \tex_global:D \skip_set:Nn }
@@ -9571,11 +9592,13 @@
 \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 }
+\__debug_patch_args:nNNpn { {#1} { (#2) } }
 \cs_new_protected:Npn \skip_add:Nn #1#2
   { \tex_advance:D #1 by \etex_glueexpr:D #2 \scan_stop: }
 \cs_new_protected:Npn \skip_gadd:Nn { \tex_global:D \skip_add:Nn }
 \cs_generate_variant:Nn \skip_add:Nn  { c }
 \cs_generate_variant:Nn \skip_gadd:Nn { c }
+\__debug_patch_args:nNNpn { {#1} { (#2) } }
 \cs_new_protected:Npn \skip_sub:Nn #1#2
   { \tex_advance:D #1 by - \etex_glueexpr:D #2 \scan_stop: }
 \cs_new_protected:Npn \skip_gsub:Nn { \tex_global:D \skip_sub:Nn }
@@ -9593,6 +9616,7 @@
   }
 \cs_set_protected:Npn \__cs_tmp:w #1
   {
+    \__debug_patch_conditional_args:nNNpnn { { (##1) } }
     \prg_new_conditional:Npnn \skip_if_finite:n ##1 { p , T , F , TF }
       {
         \exp_after:wN \__skip_if_finite:wwNw
@@ -9602,14 +9626,17 @@
     \cs_new:Npn \__skip_if_finite:wwNw ##1 #1 ##2 ; ##3 ##4 \q_stop {##3}
   }
 \exp_args:No \__cs_tmp:w { \tl_to_str:n { fil } }
+\__debug_patch_args:nNNpn { { (#1) } }
 \cs_new:Npn \skip_eval:n #1
   { \skip_use:N \etex_glueexpr:D #1 \scan_stop: }
 \cs_new_eq:NN \skip_use:N \tex_the:D
 \cs_new:Npn \skip_use:c #1 { \tex_the:D \cs:w #1 \cs_end: }
 \cs_new_eq:NN  \skip_horizontal:N \tex_hskip:D
+\__debug_patch_args:nNNpn { { (#1) } }
 \cs_new:Npn \skip_horizontal:n #1
   { \skip_horizontal:N \etex_glueexpr:D #1 \scan_stop: }
 \cs_new_eq:NN  \skip_vertical:N \tex_vskip:D
+\__debug_patch_args:nNNpn { { (#1) } }
 \cs_new:Npn \skip_vertical:n #1
   { \skip_vertical:N \etex_glueexpr:D #1 \scan_stop: }
 \cs_generate_variant:Nn \skip_horizontal:N { c }
@@ -9655,6 +9682,7 @@
   { TF , T , F , p }
 \prg_new_eq_conditional:NNn \muskip_if_exist:c \cs_if_exist:c
   { TF , T , F , p }
+\__debug_patch_args:nNNpn { {#1} { (#2) } }
 \cs_new_protected:Npn \muskip_set:Nn #1#2
   { #1 ~ \etex_muexpr:D #2 \scan_stop: }
 \cs_new_protected:Npn \muskip_gset:Nn { \tex_global:D \muskip_set:Nn }
@@ -9666,16 +9694,19 @@
 \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 }
+\__debug_patch_args:nNNpn { {#1} { (#2) } }
 \cs_new_protected:Npn \muskip_add:Nn #1#2
   { \tex_advance:D #1 by \etex_muexpr:D #2 \scan_stop: }
 \cs_new_protected:Npn \muskip_gadd:Nn { \tex_global:D \muskip_add:Nn }
 \cs_generate_variant:Nn \muskip_add:Nn  { c }
 \cs_generate_variant:Nn \muskip_gadd:Nn { c }
+\__debug_patch_args:nNNpn { {#1} { (#2) } }
 \cs_new_protected:Npn \muskip_sub:Nn #1#2
   { \tex_advance:D #1 by - \etex_muexpr:D #2 \scan_stop: }
 \cs_new_protected:Npn \muskip_gsub:Nn { \tex_global:D \muskip_sub:Nn }
 \cs_generate_variant:Nn \muskip_sub:Nn  { c }
 \cs_generate_variant:Nn \muskip_gsub:Nn { c }
+\__debug_patch_args:nNNpn { { (#1) } }
 \cs_new:Npn \muskip_eval:n #1
   { \muskip_use:N \etex_muexpr:D #1 \scan_stop: }
 \cs_new_eq:NN \muskip_use:N \tex_the:D
@@ -10022,7 +10053,7 @@
           }
       }
   }
-\__debug_patch:nnNw
+\__debug_patch:nnNNpn
   {
     \cs_if_exist:cF { \c__keys_code_root_tl #1 }
       { \__debug_log:x { Defining~key~#1~\msg_line_context: } }
@@ -11148,18 +11179,36 @@
       \__fp_round_o:Nw \__fp_round_to_nearest:NNN #1
     #2
   }
-\cs_new:Npn \__fp_parse_round:Nw
-    #1 #2 \__fp_round_to_nearest:NNN #3#4 { #2 #1 #3 }
-\cs_new:Npn \__fp_parse_round_deprecation_error:Nw
-    #1 #2 \__fp_round_to_nearest:NNN #3#4
+\__debug:TF
   {
-    \__fp_error:nnfn { fp-deprecated } { round#4() }
+    \tl_gput_right:Nn \g__debug_deprecation_on_tl
       {
-        \str_case:nn {#2}
-          { { + } { ceil } { 0 } { trunc } { - } { floor } }
-      } { }
-    #2 #1 #3
+        \cs_set_eq:NN \__fp_parse_round:Nw
+          \__fp_parse_round_deprecation_error:Nw
+      }
+    \tl_gput_right:Nn \g__debug_deprecation_off_tl
+      {
+        \cs_set_eq:NN \__fp_parse_round:Nw
+          \__fp_parse_round_no_error:Nw
+      }
+    \cs_new:Npn \__fp_parse_round_deprecation_error:Nw
+        #1 #2 \__fp_round_to_nearest:NNN #3#4
+      {
+        \__fp_error:nnfn { fp-deprecated } { round#4() }
+          {
+            \str_case:nn {#2}
+              { { + } { ceil } { 0 } { trunc } { - } { floor } }
+          } { }
+        #2 #1 #3
+      }
+    \cs_new:Npn \__fp_parse_round_no_error:Nw
+        #1 #2 \__fp_round_to_nearest:NNN #3#4 { #2 #1 #3 }
+    \cs_new_eq:NN \__fp_parse_round:Nw \__fp_parse_round_no_error:Nw
   }
+  {
+    \cs_new:Npn \__fp_parse_round:Nw
+        #1 #2 \__fp_round_to_nearest:NNN #3#4 { #2 #1 #3 }
+  }
 \int_const:Nn \c__fp_five_int { 5 }
 \cs_new:Npn \__fp_round_return_one:
   { \exp_after:wN 1 \exp_after:wN \exp_stop_f: \exp:w }
@@ -15800,6 +15849,7 @@
     \exp_after:wN \__fp_to_decimal_dispatch:w \exp:w \exp_end_continue_f:w
     \__fp_round:Nwn \__fp_round_to_nearest:NNN #1; { 0 }
   }
+\__debug_patch_args:nNNpn { { (#1) } }
 \cs_new:Npn \dim_to_fp:n #1
   {
     \exp_after:wN \__fp_from_dim_test:ww
@@ -16484,24 +16534,10 @@
     \iow_char:N\\sort_return_swapped: ~multiple~times.~
     Exactly~one~of~these~should~be~called.
   }
-\cs_new_protected:Npn \sort_ordered:
-  {
-    \__msg_kernel_warning:nnxxx { kernel } { deprecated-command }
-      { 2018-12-31 }
-      { \token_to_str:N \sort_ordered: }
-      { \token_to_str:N \sort_return_same: }
-    \cs_gset_eq:NN \sort_ordered: \sort_return_same:
-    \sort_return_same:
-  }
-\cs_new_protected:Npn \sort_reversed:
-  {
-    \__msg_kernel_warning:nnxxx { kernel } { deprecated-command }
-      { 2018-12-31 }
-      { \token_to_str:N \sort_reversed: }
-      { \token_to_str:N \sort_return_swapped: }
-    \cs_gset_eq:NN \sort_reversed: \sort_return_swapped:
-    \sort_return_swapped:
-  }
+\__debug_deprecation:nnNNpn { 2018-12-31 } { \sort_return_same: }
+\cs_new_protected:Npn \sort_ordered: { \sort_return_same: }
+\__debug_deprecation:nnNNpn { 2018-12-31 } { \sort_return_swapped: }
+\cs_new_protected:Npn \sort_reversed: { \sort_return_swapped: }
 %% File: l3tl-build.dtx Copyright (C) 2011-2017 The LaTeX3 Project
 \int_new:N \l__tl_build_start_index_int
 \int_new:N \l__tl_build_index_int
@@ -16604,43 +16640,32 @@
   {
     \group_begin:
       \group_align_safe_begin:
-        \__tl_analysis_setup:n {#1}
         \__tl_analysis_a:n {#1}
         \__tl_analysis_b:n {#1}
       \group_align_safe_end:
     \group_end:
   }
-\cs_new_protected:Npn \__tl_analysis_setup:n #1
-  {
-    \int_set:Nn \tex_escapechar:D { -1 }
-    \exp_after:wN \__tl_analysis_disable_loop:N
-      \tl_to_str:n {#1} { ~ } { ? \__prg_break: }
-    \__prg_break_point:
-    \scan_stop:
-  }
 \group_begin:
   \char_set_catcode_active:N \^^@
-  \cs_new_protected:Npn \__tl_analysis_disable_loop:N #1
+  \cs_new_protected:Npn \__tl_analysis_disable:n #1
     {
-      \tex_lccode:D 0 = `#1 ~
+      \tex_lccode:D 0 = #1 \exp_stop_f:
       \tex_lowercase:D { \tex_let:D ^^@ } \tex_undefined:D
-      \__tl_analysis_disable_loop:N
     }
   \cs_if_exist:NT \ptex_kanjiskip:D
     {
-      \cs_gset_protected:Npn \__tl_analysis_disable_loop:N #1
+      \cs_gset_protected:Npn \__tl_analysis_disable:n #1
         {
-          \use_none:n #1 \scan_stop:
-          \if_int_compare:w 256 > `#1 \exp_stop_f:
-            \tex_lccode:D 0 = `#1 ~
+          \if_int_compare:w 256 > #1 \exp_stop_f:
+            \tex_lccode:D 0 = #1 \exp_stop_f:
             \tex_lowercase:D { \tex_let:D ^^@ } \tex_undefined:D
           \fi:
-          \__tl_analysis_disable_loop:N
         }
     }
 \group_end:
 \cs_new_protected:Npn \__tl_analysis_a:n #1
   {
+    \__tl_analysis_disable:n { 32 }
     \int_set:Nn \tex_escapechar:D { 92 }
     \int_zero:N \l__tl_analysis_normal_int
     \int_zero:N \l__tl_analysis_index_int
@@ -16692,14 +16717,12 @@
     \__tl_analysis_a_loop:w
   }
 \group_begin:
-  \char_set_catcode_group_begin:N \^^@
-  \char_set_catcode_group_end:N \^^E
+  \char_set_catcode_group_begin:N \^^@ % {
   \cs_new_protected:Npn \__tl_analysis_a_bgroup:w
-    { \__tl_analysis_a_group:nw { \exp_after:wN ^^@ \if_false: ^^E \fi: } }
-  \char_set_catcode_group_begin:N \^^B
+    { \__tl_analysis_a_group:nw { \exp_after:wN ^^@ \if_false: } \fi: } }
   \char_set_catcode_group_end:N \^^@
   \cs_new_protected:Npn \__tl_analysis_a_egroup:w
-    { \__tl_analysis_a_group:nw { \if_false: ^^B \fi: ^^@ } }
+    { \__tl_analysis_a_group:nw { \if_false: { \fi: ^^@ } } % }
 \group_end:
 \cs_new_protected:Npn \__tl_analysis_a_group:nw #1
   {
@@ -16708,6 +16731,19 @@
     \if_int_compare:w \tex_lccode:D 0 = \tex_escapechar:D
       \int_set:Nn \tex_escapechar:D { 139 - \tex_escapechar:D }
     \fi:
+    \__tl_analysis_disable:n { \tex_lccode:D 0 }
+    \tex_futurelet:D \l__tl_analysis_token \__tl_analysis_a_group_aux:w
+  }
+\cs_new_protected:Npn \__tl_analysis_a_group_aux:w
+  {
+    \if_meaning:w \l__tl_analysis_token \tex_undefined:D
+      \exp_after:wN \__tl_analysis_a_safe:N
+    \else:
+      \exp_after:wN \__tl_analysis_a_group_auxii:w
+    \fi:
+  }
+\cs_new_protected:Npn \__tl_analysis_a_group_auxii:w
+  {
     \tex_afterassignment:D \__tl_analysis_a_group_test:w
     \exp_after:wN \cs_set_eq:NN
     \exp_after:wN \l__tl_analysis_char_token
@@ -16726,7 +16762,7 @@
   {
     \tex_advance:D \l__tl_analysis_nesting_int \l__tl_analysis_type_int
     \if_int_compare:w \tex_lccode:D 0 = `\ \exp_stop_f:
-      \tex_multiply:D \l__tl_analysis_type_int 2 \exp_stop_f:
+      \tex_advance:D \l__tl_analysis_type_int \l__tl_analysis_type_int
     \fi:
     \tex_skip:D \l__tl_analysis_index_int
       = \l__tl_analysis_normal_int sp plus \l__tl_analysis_type_int sp \scan_stop:
@@ -16742,10 +16778,15 @@
         \scan_stop:
         \exp_after:wN \use_none:n \token_to_str:N #1 \prg_do_nothing:
         \scan_stop:
-      \int_incr:N \l__tl_analysis_normal_int
+      \exp_after:wN \use_i:nn
     \else:
-      \__tl_analysis_cs_space_count:NN \__tl_analysis_a_cs:ww #1
+      \exp_after:wN \use_ii:nn
     \fi:
+      {
+        \__tl_analysis_disable:n { `#1 }
+        \int_incr:N \l__tl_analysis_normal_int
+      }
+      { \__tl_analysis_cs_space_count:NN \__tl_analysis_a_cs:ww #1 }
     \__tl_analysis_a_loop:w
   }
 \cs_new_protected:Npn \__tl_analysis_a_cs:ww #1; #2;
@@ -16754,10 +16795,10 @@
       \tex_skip:D \l__tl_analysis_index_int
         = \__int_eval:w \l__tl_analysis_normal_int + 1 sp \scan_stop:
       \tex_advance:D \l__tl_analysis_index_int #1 \exp_stop_f:
-      \l__tl_analysis_normal_int #2 \exp_stop_f:
     \else:
-      \tex_advance:D \l__tl_analysis_normal_int #2 \exp_stop_f:
+      \tex_advance:D
     \fi:
+    \l__tl_analysis_normal_int #2 \exp_stop_f:
   }
 \cs_new_protected:Npn \__tl_analysis_b:n #1
   {
@@ -16841,7 +16882,7 @@
       \fi:
       \tex_the:D \tex_toks:D #1 \s__tl
       \if_case:w \etex_gluestretch:D \tex_skip:D #1 \exp_stop_f:
-             A
+             \token_to_str:N A
       \or:   1
       \or:   1
       \else: 2
@@ -17248,6 +17289,14 @@
     \__regex_item_caseful_range:nn { `A } { `F }
     \__regex_item_caseful_range:nn { `a } { `f }
   }
+\__debug_patch:nnNNpn
+  {
+    \__debug_trace_push:nnN { regex } { 1 } \__regex_escape_use:nnnn
+    \__tl_build:Nw \l__regex_internal_a_tl
+      \__tl_build_one:n { \__debug_trace_pop:nnN { regex } { 1 } \__regex_escape_use:nnnn }
+      \use_none:nn
+  }
+  { }
 \cs_new_protected:Npn \__regex_escape_use:nnnn #1#2#3#4
   {
     \__tl_build:Nw \l__regex_internal_a_tl
@@ -18536,6 +18585,12 @@
     \__regex_compile:n {#1}
     \__regex_build:N \l__regex_internal_regex
   }
+\__debug_patch:nnNNpn
+  { \__debug_trace_push:nnN { regex } { 1 } \__regex_build:N }
+  {
+    \__regex_trace_states:n { 2 }
+    \__debug_trace_pop:nnN { regex } { 1 } \__regex_build:N
+  }
 \cs_new_protected:Npn \__regex_build:N #1
   {
     \__regex_standard_escapechar:
@@ -18549,6 +18604,12 @@
     \__regex_toks_put_right:Nn \l__regex_right_state_int
       { \__regex_action_success: }
   }
+\__debug_patch:nnNNpn
+  { \__debug_trace_push:nnN { regex } { 1 } \__regex_build_for_cs:n }
+  {
+    \__regex_trace_states:n { 2 }
+    \__debug_trace_pop:nnN { regex } { 1 } \__regex_build_for_cs:n
+  }
 \cs_new_protected:Npn \__regex_build_for_cs:n #1
   {
     \int_set_eq:NN \l__regex_max_state_int \l__regex_min_state_int
@@ -18582,6 +18643,18 @@
   { \__regex_toks_put_left:Nx  #2 { #1 { \int_eval:n { #3 - #2 } } } }
 \cs_new_protected:Npn \__regex_build_transition_right:nNn #1#2#3
   { \__regex_toks_put_right:Nx #2 { #1 { \int_eval:n { #3 - #2 } } } }
+\__debug_patch:nnNNpn
+  {
+    \__debug_trace:nnx { regex } { 2 }
+      {
+        regex~new~state~
+        L=\int_use:N \l__regex_left_state_int ~ -> ~
+        R=\int_use:N \l__regex_right_state_int ~ -> ~
+        M=\int_use:N \l__regex_max_state_int ~ -> ~
+        \int_eval:n { \l__regex_max_state_int + 1 }
+      }
+  }
+  { }
 \cs_new_protected:Npn \__regex_build_new_state:
   {
     \__regex_toks_clear:N \l__regex_max_state_int
@@ -18654,6 +18727,9 @@
           \__regex_tests_action_cost:n \l__regex_right_state_int
       }
   }
+\__debug_patch:nnNNpn
+  { \__debug_trace_push:nnN { regex } { 1 } \__regex_group_aux:nnnnN }
+  { \__debug_trace_pop:nnN { regex } { 1 } \__regex_group_aux:nnnnN }
 \cs_new_protected:Npn \__regex_group_aux:nnnnN #1#2#3#4#5
   {
       \if_int_compare:w #3 = 0 \exp_stop_f:
@@ -18703,6 +18779,9 @@
       { \int_max:nn {#1} { \l__regex_capturing_group_int } }
       {#2}
   }
+\__debug_patch:nnNNpn
+  { \__debug_trace_push:nnN { regex } { 1 } \__regex_branch:n }
+  { \__debug_trace_pop:nnN { regex } { 1 } \__regex_branch:n }
 \cs_new_protected:Npn \__regex_branch:n #1
   {
     \__regex_build_new_state:
@@ -18889,6 +18968,12 @@
 \bool_new:N \g__regex_success_bool
 \bool_new:N \l__regex_saved_success_bool
 \bool_new:N \l__regex_match_success_bool
+\__debug_patch:nnNNpn
+  {
+    \__debug_trace_push:nnN { regex } { 1 } \__regex_match:n
+    \__debug_trace:nnx { regex } { 1 } { analyzing~query~token~list }
+  }
+  { \__debug_trace_pop:nnN { regex } { 1 } \__regex_match:n }
 \cs_new_protected:Npn \__regex_match:n #1
   {
     \int_zero:N \l__regex_balance_int
@@ -18899,6 +18984,14 @@
       { \__regex_query_set:nnn {##1} {"##2} {##3} }
     \int_set_eq:NN \l__regex_max_pos_int \l__regex_curr_pos_int
     \__regex_query_set:nnn { } { -1 } { -2 }
+    \__regex_match_init:
+    \__regex_match_once:
+  }
+\__debug_patch:nnNNpn
+  { \__debug_trace:nnx { regex } { 1 } { initializing } }
+  { }
+\cs_new_protected:Npn \__regex_match_init:
+  {
     \bool_gset_false:N \g__regex_success_bool
     \int_step_inline:nnnn
       \l__regex_min_state_int { 1 } { \l__regex_max_state_int - 1 }
@@ -18910,7 +19003,6 @@
       { 2 * \l__regex_max_state_int }
     \int_set_eq:NN \l__regex_submatch_int \l__regex_min_submatch_int
     \bool_set_false:N \l__regex_empty_success_bool
-    \__regex_match_once:
   }
 \cs_new_protected:Npn \__regex_match_once:
   {
@@ -19001,6 +19093,9 @@
       = \__intarray_item_fast:Nn \g__regex_catcode_intarray
           { \l__regex_curr_pos_int } \scan_stop:
   }
+\__debug_patch:nnNNpn
+  { \__debug_trace:nnx { regex } { 2 } { state~\int_use:N \l__regex_curr_state_int } }
+  { }
 \cs_new_protected:Npn \__regex_use_state:
   {
     \__intarray_gset_fast:Nnn \g__regex_state_active_intarray
@@ -19148,6 +19243,9 @@
         }
     \__int_eval_end:
   }
+\__debug_patch:nnNNpn
+  { \__debug_trace_push:nnN { regex } { 1 } \__regex_replacement:n }
+  { \__debug_trace_pop:nnN { regex } { 1 } \__regex_replacement:n }
 \cs_new_protected:Npn \__regex_replacement:n #1
   {
     \__tl_build:Nw \l__regex_internal_a_tl
@@ -19996,6 +20094,36 @@
           }
       }
   }
+\__debug:TF
+  {
+    \cs_new_protected:Npn \__debug_trace_push:nnN #1#2#3
+      { \__debug_trace:nnx {#1} {#2} { entering~ \token_to_str:N #3 } }
+    \cs_new_protected:Npn \__debug_trace_pop:nnN #1#2#3
+      { \__debug_trace:nnx {#1} {#2} { leaving~ \token_to_str:N #3 } }
+    \cs_new_protected:Npn \__debug_trace:nnx #1#2#3
+      {
+        \int_compare:nNnF
+          { \int_use:c { g__debug_trace_#1_int } } < {#2}
+          { \iow_term:x { Trace:~#3 } }
+      }
+  }
+  { }
+\int_new:N \g__debug_trace_regex_int
+\__debug:TF
+  {
+    \cs_new_protected:Npn \__regex_trace_states:n #1
+      {
+        \int_step_inline:nnnn
+          \l__regex_min_state_int
+          { 1 }
+          { \l__regex_max_state_int - 1 }
+          {
+            \__debug_trace:nnx { regex } {#1}
+              { \iow_char:N \\toks ##1 = { \__regex_toks_use:w ##1 } }
+          }
+      }
+  }
+  { }
 %% File: l3box.dtx Copyright (C) 2005-2017 The LaTeX3 Project
 \cs_new_protected:Npn \box_new:N #1
   {
@@ -20037,10 +20165,13 @@
 \cs_generate_variant:Nn \box_ht:N { c }
 \cs_generate_variant:Nn \box_dp:N { c }
 \cs_generate_variant:Nn \box_wd:N { c }
+\__debug_patch_args:nNNpn { {#1} { (#2) } }
 \cs_new_protected:Npn \box_set_dp:Nn #1#2
   { \box_dp:N #1 \__dim_eval:w #2 \__dim_eval_end: }
+\__debug_patch_args:nNNpn { {#1} { (#2) } }
 \cs_new_protected:Npn \box_set_ht:Nn #1#2
   { \box_ht:N #1 \__dim_eval:w #2 \__dim_eval_end: }
+\__debug_patch_args:nNNpn { {#1} { (#2) } }
 \cs_new_protected:Npn \box_set_wd:Nn #1#2
   { \box_wd:N #1 \__dim_eval:w #2 \__dim_eval_end: }
 \cs_generate_variant:Nn \box_set_ht:Nn { c }
@@ -20050,12 +20181,16 @@
 \cs_new_eq:NN \box_use:N \tex_copy:D
 \cs_generate_variant:Nn \box_use_clear:N { c }
 \cs_generate_variant:Nn \box_use:N { c }
+\__debug_patch_args:nNNpn { { (#1) } {#2} }
 \cs_new_protected:Npn \box_move_left:nn #1#2
   { \tex_moveleft:D \__dim_eval:w #1 \__dim_eval_end: #2 }
+\__debug_patch_args:nNNpn { { (#1) } {#2} }
 \cs_new_protected:Npn \box_move_right:nn #1#2
   { \tex_moveright:D \__dim_eval:w #1 \__dim_eval_end: #2 }
+\__debug_patch_args:nNNpn { { (#1) } {#2} }
 \cs_new_protected:Npn \box_move_up:nn #1#2
   { \tex_raise:D \__dim_eval:w #1 \__dim_eval_end: #2 }
+\__debug_patch_args:nNNpn { { (#1) } {#2} }
 \cs_new_protected:Npn \box_move_down:nn #1#2
   { \tex_lower:D \__dim_eval:w #1 \__dim_eval_end: #2 }
 \cs_new_eq:NN \if_hbox:N      \tex_ifhbox:D
@@ -20133,6 +20268,7 @@
 \cs_new_protected:Npn \hbox_gset:Nn { \tex_global:D \hbox_set:Nn }
 \cs_generate_variant:Nn \hbox_set:Nn { c }
 \cs_generate_variant:Nn \hbox_gset:Nn { c }
+\__debug_patch_args:nNNpn { {#1} { (#2) } {#3} }
 \cs_new_protected:Npn \hbox_set_to_wd:Nnn #1#2#3
   {
     \tex_setbox:D #1 \tex_hbox:D to \__dim_eval:w #2 \__dim_eval_end:
@@ -20158,6 +20294,7 @@
     \c_group_end_token
   }
 \cs_new_eq:NN \hbox_gset_end: \hbox_set_end:
+\__debug_patch_args:nNNpn { {#1} { (#2) } }
 \cs_new_protected:Npn \hbox_set_to_wd:Nnw #1#2
   {
     \tex_setbox:D #1 \tex_hbox:D to \__dim_eval:w #2 \__dim_eval_end:
@@ -20168,6 +20305,7 @@
   { \tex_global:D \hbox_set_to_wd:Nnw }
 \cs_generate_variant:Nn \hbox_set_to_wd:Nnw  { c }
 \cs_generate_variant:Nn \hbox_gset_to_wd:Nnw { c }
+\__debug_patch_args:nNNpn { { (#1) } {#2} }
 \cs_new_protected:Npn \hbox_to_wd:nn #1#2
    {
      \tex_hbox:D to \__dim_eval:w #1 \__dim_eval_end:
@@ -20187,6 +20325,7 @@
   { \tex_vbox:D { \group_begin: #1 \par \group_end: } }
 \cs_new_protected:Npn \vbox_top:n #1
   { \tex_vtop:D { \group_begin: #1 \par \group_end: } }
+\__debug_patch_args:nNNpn { { (#1) } {#2} }
 \cs_new_protected:Npn \vbox_to_ht:nn #1#2
   {
     \tex_vbox:D to \__dim_eval:w #1 \__dim_eval_end:
@@ -20214,6 +20353,7 @@
   { \tex_global:D \vbox_set_top:Nn }
 \cs_generate_variant:Nn \vbox_set_top:Nn { c }
 \cs_generate_variant:Nn \vbox_gset_top:Nn { c }
+\__debug_patch_args:nNNpn { {#1} { (#2) } {#3} }
 \cs_new_protected:Npn \vbox_set_to_ht:Nnn #1#2#3
   {
     \tex_setbox:D #1 \tex_vbox:D to \__dim_eval:w #2 \__dim_eval_end:
@@ -20240,6 +20380,7 @@
     \c_group_end_token
   }
 \cs_new_eq:NN \vbox_gset_end: \vbox_set_end:
+\__debug_patch_args:nNNpn { {#1} { (#2) } }
 \cs_new_protected:Npn \vbox_set_to_ht:Nnw #1#2
   {
     \tex_setbox:D #1 \tex_vbox:D to \__dim_eval:w #2 \__dim_eval_end:
@@ -20254,6 +20395,7 @@
 \cs_new_eq:NN \vbox_unpack_clear:N \tex_unvbox:D
 \cs_generate_variant:Nn \vbox_unpack:N { c }
 \cs_generate_variant:Nn \vbox_unpack_clear:N { c }
+\__debug_patch_args:nNNpn { {#1} {#2} { (#3) } }
 \cs_new_protected:Npn \vbox_set_split_to_ht:NNn #1#2#3
   { \tex_setbox:D #1 \tex_vsplit:D #2 to \__dim_eval:w #3 \__dim_eval_end: }
 \fp_new:N \l__box_angle_fp
@@ -20555,8 +20697,14 @@
           }
       }
   }
-\cs_new_eq:NN \box_resize:Nnn \box_resize_to_wd_and_ht_plus_dp:Nnn
-\cs_new_eq:NN \box_resize:cnn \box_resize_to_wd_and_ht_plus_dp:cnn
+\__debug_deprecation:nnNNpn
+  { 2018-12-31 } { \box_resize_to_wd_and_ht_plus_dp:Nnn }
+\cs_new_protected:Npn \box_resize:Nnn
+  { \box_resize_to_wd_and_ht_plus_dp:Nnn }
+\__debug_deprecation:nnNNpn
+  { 2018-12-31 } { \box_resize_to_wd_and_ht_plus_dp:cnn }
+\cs_new_protected:Npn \box_resize:cnn
+  { \box_resize_to_wd_and_ht_plus_dp:cnn }
 %% File: l3coffins.dtx Copyright(C) 2010-2017 The LaTeX3 Project
 \box_new:N \l__coffin_internal_box
 \dim_new:N \l__coffin_internal_dim
@@ -20621,18 +20769,33 @@
       }
   }
 \cs_generate_variant:Nn \coffin_clear:N { c }
-\cs_new_protected:Npn \coffin_new:N #1
+\__debug:TF
   {
-    \box_new:N #1
-    \__debug_suspend_log:
-    \prop_clear_new:c { l__coffin_corners_ \__int_value:w #1 _prop }
-    \prop_clear_new:c { l__coffin_poles_   \__int_value:w #1 _prop }
-    \prop_gset_eq:cN { l__coffin_corners_ \__int_value:w #1 _prop }
-      \c__coffin_corners_prop
-    \prop_gset_eq:cN { l__coffin_poles_ \__int_value:w #1 _prop }
-      \c__coffin_poles_prop
-    \__debug_resume_log:
+    \cs_new_protected:Npn \coffin_new:N #1
+      {
+        \box_new:N #1
+        \__debug_suspend_log:
+        \prop_clear_new:c { l__coffin_corners_ \__int_value:w #1 _prop }
+        \prop_clear_new:c { l__coffin_poles_   \__int_value:w #1 _prop }
+        \prop_gset_eq:cN { l__coffin_corners_ \__int_value:w #1 _prop }
+          \c__coffin_corners_prop
+        \prop_gset_eq:cN { l__coffin_poles_ \__int_value:w #1 _prop }
+          \c__coffin_poles_prop
+        \__debug_resume_log:
+      }
   }
+  {
+    \cs_new_protected:Npn \coffin_new:N #1
+      {
+        \box_new:N #1
+        \prop_clear_new:c { l__coffin_corners_ \__int_value:w #1 _prop }
+        \prop_clear_new:c { l__coffin_poles_   \__int_value:w #1 _prop }
+        \prop_gset_eq:cN { l__coffin_corners_ \__int_value:w #1 _prop }
+          \c__coffin_corners_prop
+        \prop_gset_eq:cN { l__coffin_poles_ \__int_value:w #1 _prop }
+          \c__coffin_poles_prop
+      }
+  }
 \cs_generate_variant:Nn \coffin_new:N { c }
 \cs_new_protected:Npn \hcoffin_set:Nn #1#2
   {
@@ -21498,30 +21661,6 @@
 \__deprecation_error:Nnn \xetex_if_engine:F { \sys_if_engine_xetex:F } { 2017-01-01 }
 \__deprecation_error:Nnn \xetex_if_engine:T { \sys_if_engine_xetex:T } { 2017-01-01 }
 \__deprecation_error:Nnn \xetex_if_engine:TF { \sys_if_engine_xetex:TF } { 2017-01-01 }
-\cs_new_protected:Npn \deprecation_error:
-  {
-    \__deprecation_error:Nnn \tl_to_lowercase:n { } { 2017-12-31 }
-    \__deprecation_error:Nnn \tl_to_uppercase:n { } { 2017-12-31 }
-    \__deprecation_error:Nnn \ior_get_str:NN { \ior_str_get:NN } { 2017-12-31 }
-    \__deprecation_error:Nnn \box_resize:Nnn { \box_resize_to_wd_and_ht_plus_dp:Nnn } { 2018-12-31 }
-    \__deprecation_error:Nnn \box_resize:cnn { \box_resize_to_wd_and_ht_plus_dp:cnn } { 2018-12-31 }
-    \__deprecation_error:Nnn \c_minus_one { - 1 } { 2018-12-31 }
-    \__deprecation_error:Nnn \sort_ordered: { \sort_return_same: } { 2018-12-31 }
-    \__deprecation_error:Nnn \sort_reversed: { \sort_return_swapped: } { 2018-12-31 }
-    \__deprecation_error:Nnn \g_file_current_name_tl { \g_file_curr_name_str } { 2018-12-31 }
-    \__deprecation_error:Nnn \file_add_path:nN { \file_get_full_name:nN } { 2018-12-31 }
-    \__deprecation_error:Nnn \file_path_include:n
-      { \seq_put_right:Nn \l_file_search_path_seq } { 2018-12-31 }
-    \__deprecation_error:Nnn \file_path_remove:n
-      { \seq_remove_all:Nn \l_file_search_path_seq } { 2018-12-31 }
-    \__deprecation_error:Nnn \file_list: { \file_log_list: } { 2018-12-31 }
-    \__deprecation_error:Nnn \ior_list_streams: { \ior_show_list: } { 2018-12-31 }
-    \__deprecation_error:Nnn \ior_log_streams: { \ior_log_list: } { 2018-12-31 }
-    \__deprecation_error:Nnn \iow_list_streams: { \iow_show_list: } { 2018-12-31 }
-    \__deprecation_error:Nnn \iow_log_streams: { \iow_log_list: } { 2018-12-31 }
-    \cs_set_eq:NN \__fp_parse_round:Nw \__fp_parse_round_deprecation_error:Nw
-    \cs_set_eq:NN \deprecation_error: \scan_stop:
-  }
 %% File: l3candidates.dtx Copyright (C) 2012-2017 The LaTeX3 Project
 \cs_new_protected:Npx \mode_leave_vertical:
   {
@@ -21539,6 +21678,7 @@
 \cs_new_protected:Npn \box_clip:N #1
   { \hbox_set:Nn #1 { \__driver_box_use_clip:N #1 } }
 \cs_generate_variant:Nn \box_clip:N { c }
+\__debug_patch_args:nNNpn { {#1} { (#2) } {#3} { (#4) } {#5} }
 \cs_new_protected:Npn \box_trim:Nnnnn #1#2#3#4#5
   {
     \hbox_set:Nn \l__box_internal_box
@@ -21559,7 +21699,7 @@
       {
         \hbox_set:Nn \l__box_internal_box
           {
-            \box_move_down:nn { #3 - \box_dp:N #1 }
+            \box_move_down:nn { (#3) - \box_dp:N #1 }
               { \box_use:N \l__box_internal_box }
           }
         \box_set_dp:Nn \l__box_internal_box \c_zero_dim
@@ -21577,7 +21717,7 @@
       {
         \hbox_set:Nn \l__box_internal_box
           {
-            \box_move_up:nn { #5 - \box_ht:N \l__box_internal_box }
+            \box_move_up:nn { (#5) - \box_ht:N \l__box_internal_box }
               { \box_use:N \l__box_internal_box }
           }
         \box_set_ht:Nn \l__box_internal_box \c_zero_dim
@@ -21585,6 +21725,7 @@
     \box_set_eq:NN #1 \l__box_internal_box
   }
 \cs_generate_variant:Nn \box_trim:Nnnnn { c }
+\__debug_patch_args:nNNpn { {#1} { (#2) } {#3} { (#4) } {#5} }
 \cs_new_protected:Npn \box_viewport:Nnnnn #1#2#3#4#5
   {
     \hbox_set:Nn \l__box_internal_box
@@ -21616,7 +21757,7 @@
           }
         \box_set_ht:Nn \l__box_internal_box
           {
-            #5
+            (#5)
             \dim_compare:nNnT {#3} > \c_zero_dim
               { - (#3) }
           }
@@ -21870,7 +22011,7 @@
   {
     \prop_put:cnx { l__coffin_poles_ \__int_value:w #1 _prop } {#2}
       {
-        { \dim_eval:n #3 + \box_wd:N #1 } {#4}
+        { \dim_eval:n { #3 + \box_wd:N #1 } } {#4}
         {#5} {#6}
       }
   }
@@ -21937,15 +22078,6 @@
     \str_if_empty:NF \l__file_full_name_str
       { \__file_input:V \l__file_full_name_str }
   }
-\cs_new_protected:Npn \file_if_exist_input:nT #1#2
-  {
-    \file_get_full_name:nN {#1} \l__file_full_name_str
-    \str_if_empty:NF \l__file_full_name_str
-      {
-        #2
-        \__file_input:V \l__file_full_name_str
-      }
-  }
 \cs_new_protected:Npn \file_if_exist_input:nF #1#2
   {
     \file_get_full_name:nN {#1} \l__file_full_name_str
@@ -21953,19 +22085,26 @@
       {#2}
       { \__file_input:V \l__file_full_name_str }
   }
+\__debug_deprecation:nnNNpn { 2017-12-31 }
+  { \file_if_exist:nTF and~ \file_input:n }
 \cs_new_protected:Npn \file_if_exist_input:nTF #1#2#3
   {
     \file_get_full_name:nN {#1} \l__file_full_name_str
     \str_if_empty:NTF \l__file_full_name_str
-      {#3}
-      {
-        #2
-        \__file_input:V \l__file_full_name_str
-      }
+      {#3} { #2 \__file_input:V \l__file_full_name_str }
   }
+\__debug_deprecation:nnNNpn { 2017-12-31 }
+  { \file_if_exist:nT and~ \file_input:n }
+\cs_new_protected:Npn \file_if_exist_input:nT #1#2
+  {
+    \file_get_full_name:nN {#1} \l__file_full_name_str
+    \str_if_empty:NF \l__file_full_name_str
+      { #2 \__file_input:V \l__file_full_name_str }
+  }
 \cs_new_protected:Npn \file_input_stop: { \tex_endinput:D }
 \cs_if_exist:NTF \pdftex_uniformdeviate:D
   {
+    \__debug_patch_args:nNNpn { { (#1) } { (#2) } }
     \cs_new:Npn \int_rand:nn #1#2
       {
         \exp_after:wN \__int_rand:ww
@@ -22163,6 +22302,7 @@
       { \prg_return_false: }
   }
 \cs_new:Npn \sys_rand_seed: { \tex_the:D \pdftex_randomseed:D }
+\__debug_patch_args:nNNpn { { (#1) } }
 \cs_new_protected:Npn \sys_gset_rand_seed:n #1
   { \pdftex_setrandomseed:D \__int_eval:w #1 \__int_eval_end: }
 \int_const:Nn \c_sys_shell_escape_int
@@ -23285,17 +23425,24 @@
 \cs_generate_variant:Nn \tl_rand_item:N { c }
 \cs_new:Npn \tl_range:Nnn { \exp_args:No \tl_range:nnn }
 \cs_generate_variant:Nn \tl_range:Nnn { c }
-\cs_new:Npn \tl_range:nnn #1#2#3
+\cs_new:Npn \tl_range:nnn { \__tl_range:Nnnn \__tl_range:w }
+\cs_new:Npn \tl_range_braced:Nnn { \exp_args:No \tl_range_braced:nnn }
+\cs_generate_variant:Nn \tl_range_braced:Nnn { c }
+\cs_new:Npn \tl_range_braced:nnn { \__tl_range:Nnnn \__tl_range_braced:w }
+\cs_new:Npn \tl_range_unbraced:Nnn { \exp_args:No \tl_range_unbraced:nnn }
+\cs_generate_variant:Nn \tl_range_unbraced:Nnn { c }
+\cs_new:Npn \tl_range_unbraced:nnn { \__tl_range:Nnnn \__tl_range_unbraced:w }
+\cs_new:Npn \__tl_range:Nnnn #1#2#3#4
   {
     \tl_head:f
       {
-        \exp_args:Nf \__tl_range:nnnw { \tl_count:n {#1} } {#2} {#3}
-        #1
+        \exp_args:Nf \__tl_range:nnnNn
+          { \tl_count:n {#2} } {#3} {#4} #1 {#2}
       }
   }
-\cs_new:Npn \__tl_range:nnnw #1#2#3
+\cs_new:Npn \__tl_range:nnnNn #1#2#3
   {
-    \exp_args:Nff \__tl_range:nnw
+    \exp_args:Nff \__tl_range:nnNn
       {
         \exp_args:Nf \__tl_range_normalize:nn
           { \int_eval:n { #2 - 1 } } {#1}
@@ -23305,15 +23452,14 @@
           { \int_eval:n {#3} } {#1}
       }
   }
-\cs_new:Npn \__tl_range:nnw #1#2
+\cs_new:Npn \__tl_range:nnNn #1#2#3#4
   {
     \if_int_compare:w #2 > #1 \exp_stop_f: \else:
       \exp_after:wN { \exp_after:wN }
     \fi:
-    \exp_after:wN \__tl_range_collect:w
+    \exp_after:wN #3
     \__int_value:w \__int_eval:w #2 - #1 \exp_after:wN ;
-    \exp_after:wN { \exp_after:wN }
-    \exp:w \__tl_range_skip:w #1 ; { }
+    \exp_after:wN { \exp:w \__tl_range_skip:w #1 ; { } #4 }
   }
 \cs_new:Npn \__tl_range_skip:w #1 ; #2
   {
@@ -23324,14 +23470,64 @@
       \exp_after:wN \exp_end:
     \fi:
   }
-\cs_new:Npn \__tl_range_collect:w #1 ; #2#3
+\cs_new:Npn \__tl_range_braced:w #1 ; #2
+  { \__tl_range_collect_braced:w #1 ; { } #2 }
+\cs_new:Npn \__tl_range_unbraced:w #1 ; #2
+  { \__tl_range_collect_unbraced:w #1 ; { } #2 }
+\cs_new:Npn \__tl_range_collect_braced:w #1 ; #2#3
   {
     \if_int_compare:w #1 > 1 \exp_stop_f:
-      \exp_after:wN \__tl_range_collect:w
+      \exp_after:wN \__tl_range_collect_braced:w
       \__int_value:w \__int_eval:w #1 - 1 \exp_after:wN ;
     \fi:
     { #2 {#3} }
   }
+\cs_new:Npn \__tl_range_collect_unbraced:w #1 ; #2#3
+  {
+    \if_int_compare:w #1 > 1 \exp_stop_f:
+      \exp_after:wN \__tl_range_collect_unbraced:w
+      \__int_value:w \__int_eval:w #1 - 1 \exp_after:wN ;
+    \fi:
+    { #2 #3 }
+  }
+\cs_new:Npn \__tl_range:w #1 ; #2
+  {
+    \exp_args:Nf \__tl_range_collect:nn
+      { \__tl_range_skip_spaces:n {#2} } {#1}
+  }
+\cs_new:Npn \__tl_range_skip_spaces:n #1
+  {
+    \tl_if_head_is_space:nTF {#1}
+      { \exp_args:Nf \__tl_range_skip_spaces:n {#1} }
+      { { } #1 }
+  }
+\cs_new:Npn \__tl_range_collect:nn #1#2
+  {
+    \int_compare:nNnTF {#2} = 0
+      {#1}
+      {
+        \exp_args:No \tl_if_head_is_space:nTF { \use_none:n #1 }
+          {
+            \exp_args:Nf \__tl_range_collect:nn
+              { \__tl_range_collect_space:nw #1 }
+              {#2}
+          }
+          {
+            \__tl_range_collect:ff
+              {
+                \exp_args:No \tl_if_head_is_N_type:nTF { \use_none:n #1 }
+                  { \__tl_range_collect_N:nN }
+                  { \__tl_range_collect_group:nn }
+                #1
+              }
+              { \int_eval:n { #2 - 1 } }
+          }
+      }
+  }
+\cs_new:Npn \__tl_range_collect_space:nw #1 ~ { { #1 ~ } }
+\cs_new:Npn \__tl_range_collect_N:nN #1#2 { { #1 #2 } }
+\cs_new:Npn \__tl_range_collect_group:nn #1#2 { { #1 {#2} } }
+\cs_generate_variant:Nn \__tl_range_collect:nn { ff }
 \cs_new:Npn \__tl_range_normalize:nn #1#2
   {
     \int_eval:n

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex	2017-07-21 22:02:53 UTC (rev 44864)
@@ -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/07/15}%
+\def\ExplFileDate{2017/07/19}%
 \let\ExplLoaderFileDate\ExplFileDate
 \begingroup
   \def\tempa{LaTeX2e}%
@@ -73,7 +73,6 @@
 \expandafter\ifx\csname tex\string _let:D\endcsname\relax
   \expandafter\endinput
 \fi
-\cs_set_eq:NN \__iow_wrap_set:Nx \tl_set:Nx
 \cs_set_protected:Npn \ProvidesExplFile
   {
     \group_begin:

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty	2017-07-21 22:02:53 UTC (rev 44864)
@@ -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/07/15}%
+\def\ExplFileDate{2017/07/19}%
 \let\ExplLoaderFileDate\ExplFileDate
 \ProvidesPackage{expl3}
   [%
@@ -232,6 +232,7 @@
       }
     \cs_set_protected:Npn \box_rotate:Nn #1#2
       { \hbox_set:Nn #1 { \rotatebox {#2} { \box_use:N #1 } } }
+    \__debug_patch_args:nNNpn { {#1} { (#2) } { (#3) } }
     \cs_set_protected:Npn \box_resize_to_wd_and_ht_plus_dp:Nnn #1#2#3
       {
         \hbox_set:Nn #1
@@ -242,6 +243,7 @@
               { \box_use:N #1 }
           }
       }
+    \__debug_patch_args:nNNpn { {#1} { (#2) } }
     \cs_set_protected:Npn \box_resize_to_ht_plus_dp:Nn #1#2
       {
         \hbox_set:Nn #1
@@ -250,6 +252,7 @@
               { \box_use:N #1 }
           }
       }
+    \__debug_patch_args:nNNpn { {#1} { (#2) } }
     \cs_set_protected:Npn \box_resize_to_wd:Nn #1#2
       {
         \hbox_set:Nn #1

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls	2017-07-21 22:02:53 UTC (rev 44864)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3doc.dtx Copyright (C) 1990-2017 The LaTeX3 project
 \RequirePackage{expl3,xparse,calc}
-\ProvidesExplClass{l3doc}{2017/07/15}{}
+\ProvidesExplClass{l3doc}{2017/07/19}{}
   {L3 Experimental documentation class}
 \clist_new:N \g_docinput_clist
 \seq_new:N \g_doc_functions_seq
@@ -30,6 +30,7 @@
 \coffin_new:N \l__codedoc_descr_coffin
 \coffin_new:N \l__codedoc_syntax_coffin
 \box_new:N \g__codedoc_syntax_box
+\bool_new:N \l__codedoc_in_function_bool
 \bool_new:N \l__codedoc_long_name_bool
 \dim_new:N \l__codedoc_trial_width_dim
 \int_new:N \l__codedoc_nested_macro_int
@@ -299,6 +300,16 @@
   { The~deprecated~function(s)~'#1'~should~have~been~removed~on~#2. }
 \msg_new:nnn { l3doc } { date-format }
   { The~date~'#1'~should~be~given~in~YYYY-MM-DD~format. }
+\msg_new:nnn { l3doc } { syntax-nested-function }
+  {
+    The~'syntax'~environment~should~be~used~in~the~
+    innermost~'function'~environment.
+  }
+\msg_new:nnn { l3doc } { multiple-syntax }
+  {
+    The~'syntax'~environment~should~only~be~used~once~in~
+    a~'function'~environment.
+  }
 \DeclareOption { a5paper } { \@latexerr { Option~not~supported } { } }
 \DeclareOption { full }
   {
@@ -834,16 +845,23 @@
   }
 \cs_new_protected:Npn \__codedoc_date_set:Nn #1#2
   {
-    \tl_if_in:nnT {#2} { / }
-      { \msg_error:nnn { l3doc } { date-format } {#2} }
     \tl_set:Nn #1 {#2}
+    \regex_replace_once:nnNF
+      { \A(\d\d\d\d)[-/](\d\d?)[-/](\d\d?)\Z } { \1-\2-\3 } #1
+      {
+        \msg_error:nnn { l3doc } { date-format } {#2}
+        \tl_set:Nn #1 { 1970-01-01 }
+      }
   }
 \cs_new_protected:Npn \__codedoc_deprecated_on:n #1
   {
-    \__codedoc_date_compare:nNnT {#1} < { \tex_year:D - \tex_month:D - \tex_day:D }
+    \__codedoc_date_set:Nn \l__codedoc_tmpa_tl {#1}
+    \exp_args:No \__codedoc_date_compare:nNnT
+      { \l__codedoc_tmpa_tl } < { \tex_year:D - \tex_month:D - \tex_day:D }
       {
         \msg_error:nnxx { l3doc } { deprecated-function }
-          { \tl_to_str:N \l__codedoc_macro_argument_tl } {#1}
+          { \tl_to_str:N \l__codedoc_macro_argument_tl }
+          { \l__codedoc_tmpa_tl }
       }
     \bool_set_true:N \l__codedoc_macro_internal_bool
   }
@@ -874,27 +892,30 @@
     \par
     \allowbreak
   }
-\group_begin:
-  \char_set_catcode_active:N \<
-  \cs_new_protected:Npn \__codedoc_function_init:
-    {
-      \coffin_clear:N \l__codedoc_descr_coffin
-      \box_gclear:N \g__codedoc_syntax_box
-      \coffin_clear:N \l__codedoc_syntax_coffin
-      \coffin_clear:N \l__codedoc_functions_coffin
-      \bool_set_false:N \l__codedoc_macro_TF_bool
-      \bool_set_false:N \l__codedoc_macro_pTF_bool
-      \bool_set_false:N \l__codedoc_macro_noTF_bool
-      \bool_set_false:N \l__codedoc_macro_EXP_bool
-      \bool_set_false:N \l__codedoc_macro_rEXP_bool
-      \bool_set_false:N \l__codedoc_no_label_bool
-      \bool_set_false:N \l__codedoc_names_verb_bool
-      \clist_clear:N \l__codedoc_function_label_clist
-      \tl_set:Nn \l__codedoc_override_module_tl { \q_no_value }
-      \char_set_catcode_active:N \<
-      \cs_set_protected_nopar:Npn < ##1 > { \meta {##1} }
+\cs_new_protected:Npn \__codedoc_function_init:
+  {
+    \box_if_empty:NF \g__codedoc_syntax_box
+      { \msg_error:nn { l3doc } { syntax-nested-function } }
+    \coffin_clear:N \l__codedoc_descr_coffin
+    \box_gclear:N \g__codedoc_syntax_box
+    \coffin_clear:N \l__codedoc_syntax_coffin
+    \coffin_clear:N \l__codedoc_functions_coffin
+    \bool_set_false:N \l__codedoc_macro_TF_bool
+    \bool_set_false:N \l__codedoc_macro_pTF_bool
+    \bool_set_false:N \l__codedoc_macro_noTF_bool
+    \bool_set_false:N \l__codedoc_macro_EXP_bool
+    \bool_set_false:N \l__codedoc_macro_rEXP_bool
+    \bool_set_false:N \l__codedoc_no_label_bool
+    \bool_set_false:N \l__codedoc_names_verb_bool
+    \bool_set_true:N \l__codedoc_in_function_bool
+    \clist_clear:N \l__codedoc_function_label_clist
+    \tl_set:Nn \l__codedoc_override_module_tl { \q_no_value }
+    \char_set_active_eq:NN \< \__codedoc_shorthand_meta:
+    \char_set_catcode_active:N \<
   }
-\group_end:
+\cs_new_protected:Npn \__codedoc_shorthand_meta:
+  { \mode_if_math:TF { < } { \__codedoc_shorthand_meta:w } }
+\cs_new_protected_nopar:Npn \__codedoc_shorthand_meta:w #1 > { \meta {#1} }
 \cs_new_protected:Npn \__codedoc_function_reset:
   {
     \tl_set:Nn \l__codedoc_override_module_tl { \q_no_value }
@@ -918,7 +939,7 @@
 \cs_new_protected:Npn \__codedoc_function_assemble:
   {
     \hcoffin_set:Nn  \l__codedoc_syntax_coffin
-      { \box_use:N \g__codedoc_syntax_box }
+      { \box_use_clear:N \g__codedoc_syntax_box }
     \bool_if:NTF \l__codedoc_long_name_bool
       {
         \coffin_join:NnnNnnnn
@@ -1057,6 +1078,8 @@
 \dim_new:N \l__codedoc_syntax_dim
 \cs_new_protected:Npn \__codedoc_syntax:w
   {
+    \box_if_empty:NF \g__codedoc_syntax_box
+      { \msg_error:nn { l3doc } { multiple-syntax } }
     \dim_set:Nn \l__codedoc_syntax_dim
       {
         \textwidth
@@ -1079,6 +1102,13 @@
       \end{tabular}
       \arrayrulecolor{black}
     \hbox_gset_end:
+    \bool_if:NF \l__codedoc_in_function_bool
+      {
+        \begin{quote}
+          \mode_leave_vertical:
+          \box_use_clear:N \g__codedoc_syntax_box
+        \end{quote}
+      }
   }
 \keys_define:nn { l3doc/macro }
   {

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def	2017-07-21 22:02:53 UTC (rev 44864)
@@ -30,8 +30,9 @@
           {
             \tl_set:Nx \l__color_current_tl
               {
-                \exp_after:wN \__driver_color_pickup_aux:w
-                  \current at color ~ 0 ~ 0 ~ 0 \q_stop
+                \exp_after:wN \exp_after:wN\exp_after:wN
+                  \__driver_color_pickup_aux:w \exp_after:wN
+                  \current at color \c_space_tl 0 ~ 0 ~ 0 \q_stop
               }
           }
         \cs_new:Npn \__driver_color_pickup_aux:w #1 ~ #2 ~ #3 ~ #4 ~ #5 ~ #6 \q_stop
@@ -71,10 +72,10 @@
   { \use:c { __driver_color_convert_ #1 :w } }
 \cs_new:Npn \__driver_color_convert_gray:w #1 ~ #2 \q_stop
   { #1 ~ g ~ #1 ~ G }
-\cs_new:Npn \__driver_color_convert_cmyk:w #1 ~ #2 ~ #3 ~ #4 \q_stop
+\cs_new:Npn \__driver_color_convert_cmyk:w #1 ~ #2 ~ #3 ~ #4 ~#5 \q_stop
+  { #1 ~ #2 ~ #3 ~ #4 ~ k ~ #1 ~ #2 ~ #3 ~ #4 ~ K }
+\cs_new:Npn \__driver_color_convert_rgb:w #1 ~ #2 ~ #3 ~ #4 \q_stop
   { #1 ~ #2 ~ #3 ~ rg ~ #1 ~ #2 ~ #3 ~ RG }
-\cs_new:Npn \__driver_color_convert_rgb:w #1 ~ #2 ~ #3 ~ #4 ~ #5 \q_stop
-  { #1 ~ #2 ~ #3 ~ #4 ~ k ~ #1 ~ #2 ~ #3 ~ #4 ~ K }
 \cs_new_protected:Npx \__driver_color_reset:
   {
     \cs_if_exist:NTF \luatex_pdfextension:D

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3sort.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3sort.sty	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3sort.sty	2017-07-21 22:02:53 UTC (rev 44864)
@@ -31,9 +31,6 @@
 \typeout{** }
 \typeout{** Its functionality is now only provided as part of the expl3 package.}
 \typeout{** }
-\typeout{** After showing you an error message you can hit <return> we will continue}
-\typeout{** for now by loading expl3 for you. However, the old packages will be}
-\typeout{** removed entirely at the end of 2017.}
 \typeout{** The old packages will be removed entirely at the end of 2018.}
 \typeout{** }
 \typeout{** Therefore, please replace '\string\usepackage{\old at liii@module at name}'}
@@ -40,11 +37,9 @@
 \typeout{** with '\string\usepackage{expl3}' in your documents as soon as possible.}
 \typeout{** }
 \typeout{*******************************************************************}
-\PackageError
 \PackageWarning
   \old at liii@module at name{This package is obsolete ---
    use 'expl3' instead}
-  \@ehc
 \RequirePackage{expl3}
 
 %% 

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3tl-analysis.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3tl-analysis.sty	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3tl-analysis.sty	2017-07-21 22:02:53 UTC (rev 44864)
@@ -31,9 +31,6 @@
 \typeout{** }
 \typeout{** Its functionality is now only provided as part of the expl3 package.}
 \typeout{** }
-\typeout{** After showing you an error message you can hit <return> we will continue}
-\typeout{** for now by loading expl3 for you. However, the old packages will be}
-\typeout{** removed entirely at the end of 2017.}
 \typeout{** The old packages will be removed entirely at the end of 2018.}
 \typeout{** }
 \typeout{** Therefore, please replace '\string\usepackage{\old at liii@module at name}'}
@@ -40,11 +37,9 @@
 \typeout{** with '\string\usepackage{expl3}' in your documents as soon as possible.}
 \typeout{** }
 \typeout{*******************************************************************}
-\PackageError
 \PackageWarning
   \old at liii@module at name{This package is obsolete ---
    use 'expl3' instead}
-  \@ehc
 \RequirePackage{expl3}
 
 %% 

Added: trunk/Master/texmf-dist/tex/latex/l3kernel/l3tl-build.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3tl-build.sty	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3tl-build.sty	2017-07-21 22:02:53 UTC (rev 44864)
@@ -0,0 +1,47 @@
+%%
+%% This is file `l3tl-build.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% l3oldmodules.dtx  (with options: `l3tl-build,oldmodules')
+%% 
+%% Copyright (C) 1990-2017 The LaTeX3 Project
+%% 
+%% It may be distributed and/or modified under the conditions of
+%% the LaTeX Project Public License (LPPL), either version 1.3c of
+%% this license or (at your option) any later version.  The latest
+%% version of this license is in the file:
+%% 
+%%    http://www.latex-project.org/lppl.txt
+%% 
+%% This file is part of the "l3kernel bundle" (The Work in LPPL)
+%% and all files in that bundle must be distributed together.
+%% 
+%% File: l3oldmodules.dtx Copyright (C) 2014,2016,2017 The LaTeX3 Project
+\def\old at liii@module at name
+{l3tl-build}
+\ProvidesPackage\old at liii@module at name
+  [%
+    2017/03/18 Obsolete L3 package
+  ]
+\typeout{*****************************************************************}
+\typeout{** }
+\typeout{** Package \old at liii@module at name\space is obsolete and has been removed!}
+\typeout{** }
+\typeout{** Its functionality is now only provided as part of the expl3 package.}
+\typeout{** }
+\typeout{** The old packages will be removed entirely at the end of 2018.}
+\typeout{** }
+\typeout{** Therefore, please replace '\string\usepackage{\old at liii@module at name}'}
+\typeout{** with '\string\usepackage{expl3}' in your documents as soon as possible.}
+\typeout{** }
+\typeout{*******************************************************************}
+\PackageWarning
+  \old at liii@module at name{This package is obsolete ---
+   use 'expl3' instead}
+\RequirePackage{expl3}
+
+%% 
+%%
+%% End of file `l3tl-build.sty'.


Property changes on: trunk/Master/texmf-dist/tex/latex/l3kernel/l3tl-build.sty
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty	2017-07-21 22:02:53 UTC (rev 44864)
@@ -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/07/15]
-\@ifpackagelater{expl3}{2017/07/15}
+\RequirePackage{expl3}[2017/07/19]
+\@ifpackagelater{expl3}{2017/07/19}
   {}
   {%
     \PackageError{l3keys2e}{Support package l3kernel too old}
@@ -32,7 +32,7 @@
       }%
     \endinput
   }
-\ProvidesExplPackage{l3keys2e}{2017/07/15}{}
+\ProvidesExplPackage{l3keys2e}{2017/07/19}{}
   {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-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/tex/latex/l3packages/xfp/xfp.sty	2017-07-21 22:02:53 UTC (rev 44864)
@@ -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/07/15]
-\@ifpackagelater{expl3}{2017/07/15}
+\RequirePackage{expl3}[2017/07/19]
+\@ifpackagelater{expl3}{2017/07/19}
   {}
   {%
     \PackageError{xfp}{Support package l3kernel too old}
@@ -33,7 +33,7 @@
     \endinput
   }
 \RequirePackage{xparse}
-\ProvidesExplPackage{xfp}{2017/07/15}{}
+\ProvidesExplPackage{xfp}{2017/07/19}{}
   {L3 Floating point unit}
 \NewExpandableDocumentCommand \fpeval { m } { \fp_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-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/tex/latex/l3packages/xfrac/xfrac.sty	2017-07-21 22:02:53 UTC (rev 44864)
@@ -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/07/15]
-\@ifpackagelater{expl3}{2017/07/15}
+\RequirePackage{expl3}[2017/07/19]
+\@ifpackagelater{expl3}{2017/07/19}
   {}
   {%
     \PackageError{xfrac}{Support package l3kernel too old}
@@ -34,7 +34,7 @@
     \endinput
   }
 \RequirePackage{amstext,graphicx,l3keys2e,textcomp,xparse,xtemplate}
-\ProvidesExplPackage{xfrac}{2017/07/15}{}
+\ProvidesExplPackage{xfrac}{2017/07/19}{}
   {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-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/tex/latex/l3packages/xparse/xparse.sty	2017-07-21 22:02:53 UTC (rev 44864)
@@ -23,8 +23,8 @@
 %%                  (C) Copyright 2004-2008 Frank Mittelbach,
 %%                      The LaTeX3 Project
 %%                  (C) Copyright 2009-2017 The LaTeX3 Project
-\RequirePackage{expl3}[2017/07/15]
-\@ifpackagelater{expl3}{2017/07/15}
+\RequirePackage{expl3}[2017/07/19]
+\@ifpackagelater{expl3}{2017/07/19}
   {}
   {%
     \PackageError{xparse}{Support package l3kernel too old}
@@ -36,7 +36,7 @@
       }%
     \endinput
   }
-\ProvidesExplPackage{xparse}{2017/07/15}{}
+\ProvidesExplPackage{xparse}{2017/07/19}{}
   {L3 Experimental document command parser}
 \tl_const:Nx \c__xparse_no_value_tl
   { \char_generate:nn { `\- } { 11 } NoValue- }
@@ -450,9 +450,9 @@
   }
 \cs_new_protected:Npn \__xparse_normalize_type_D:w #1#2#3
   {
-    \__xparse_single_token_check:n {#1}
-    \__xparse_single_token_check:n {#2}
     \quark_if_recursion_tail_stop_do:nn {#3} { \__xparse_bad_arg_spec:wn }
+    \__xparse_single_char_check:n {#1}
+    \__xparse_single_char_check:n {#2}
     \__xparse_add_arg_spec:n { D #1 #2 {#3} }
     \tl_put_right:Nn \l__xparse_last_delimiters_tl {#1}
     \bool_set_false:N \l__xparse_grab_expandably_bool
@@ -462,7 +462,7 @@
   {
     \quark_if_recursion_tail_stop_do:nn {#2} { \__xparse_bad_arg_spec:wn }
     \tl_if_blank:nT {#1} { \__xparse_bad_arg_spec:wn }
-    \tl_map_function:nN {#1} \__xparse_single_token_check:n
+    \tl_map_function:nN {#1} \__xparse_single_char_check:n
     \__xparse_normalize_E_unique_check:w #1 \q_nil \q_stop
     \int_compare:nNnT { \tl_count:n {#2} } > { \tl_count:n {#1} }
       { \__xparse_bad_arg_spec:wn }
@@ -490,8 +490,8 @@
   }
 \cs_new_protected:Npn \__xparse_normalize_type_t:w #1
   {
-    \__xparse_single_token_check:n {#1}
     \quark_if_recursion_tail_stop_do:Nn #1 { \__xparse_bad_arg_spec:wn }
+    \__xparse_single_char_check:n {#1}
     \tl_put_right:Nn \l__xparse_arg_spec_tl { t #1 }
     \tl_put_right:Nn \l__xparse_last_delimiters_tl {#1}
     \bool_set_false:N \l__xparse_grab_expandably_bool
@@ -516,9 +516,9 @@
   }
 \cs_new_protected:Npn \__xparse_normalize_type_R:w #1#2#3
   {
-    \__xparse_single_token_check:n {#1}
-    \__xparse_single_token_check:n {#2}
     \quark_if_recursion_tail_stop_do:nn {#3} { \__xparse_bad_arg_spec:wn }
+    \__xparse_single_char_check:n {#1}
+    \__xparse_single_char_check:n {#2}
     \__xparse_delimiter_check:nnn {#1} { R/r } { \tl_to_str:n {#1} }
     \__xparse_add_arg_spec:n { R #1 #2 {#3} }
     \int_incr:N \l__xparse_mandatory_args_int
@@ -543,11 +543,22 @@
     \tl_clear:N \l__xparse_last_delimiters_tl
     \__xparse_normalize_arg_spec_loop:n
   }
-\cs_new_protected:Npn \__xparse_single_token_check:n #1
+\cs_new_protected:Npn \__xparse_single_char_check:n #1
   {
-    \exp_args:Nx \tl_if_single_token:nF { \tl_trim_spaces:n {#1} }
+    \exp_args:Nx \tl_if_single_token:nTF { \tl_trim_spaces:n {#1} }
       {
-        \__msg_kernel_error:nnxx { xparse } { not-single-token }
+        \group_begin:
+        \tex_escapechar:D = 92 \scan_stop:
+        \exp_args:Nx \tl_if_single_token:nF
+          { \exp_args:No \tl_to_str:n { \use:nn #1 { } } }
+          {
+            \__msg_kernel_warning:nnxx { xparse } { not-single-char }
+              { \iow_char:N \\ \l__xparse_function_tl } { \tl_to_str:n {#1} }
+          }
+        \group_end:
+      }
+      {
+        \__msg_kernel_error:nnxx { xparse } { not-single-char }
           { \iow_char:N \\ \l__xparse_function_tl } { \tl_to_str:n {#1} }
         \__xparse_bad_def:wn
       }
@@ -595,18 +606,17 @@
 \cs_new_protected:Npn \__xparse_bad_def:wn #1 \__xparse_break_point:n #2 { }
 \cs_new_protected:Npn \__xparse_add_arg_spec:n #1
   {
-    \bool_if:NF \l__xparse_long_bool
+    \bool_lazy_and:nnT
+      { ! \l__xparse_long_bool }
+      { \l__xparse_some_long_bool }
       {
-        \bool_if:NT \l__xparse_some_long_bool
+        \bool_if:NT \l__xparse_expandable_bool
           {
-            \bool_if:NT \l__xparse_expandable_bool
-              {
-                \__msg_kernel_error:nnx { xparse } { inconsistent-long }
-                  { \iow_char:N \\ \l__xparse_function_tl }
-                \__xparse_bad_def:wn
-              }
-            \bool_set_false:N \l__xparse_grab_expandably_bool
+            \__msg_kernel_error:nnx { xparse } { inconsistent-long }
+              { \iow_char:N \\ \l__xparse_function_tl }
+            \__xparse_bad_def:wn
           }
+        \bool_set_false:N \l__xparse_grab_expandably_bool
       }
     \bool_if:NTF \l__xparse_long_bool
       { \bool_set_true:N \l__xparse_some_long_bool }
@@ -1919,12 +1929,15 @@
     \\ \\
     LaTeX~will~ignore~this~entire~definition.
   }
-\__msg_kernel_new:nnnn { xparse } { not-single-token }
-  { Argument~delimiter~'#2'~for~the~command~'#1'~should~be~a~single~token. }
+\__msg_kernel_new:nnnn { xparse } { not-single-char }
   {
+    Argument~delimiter~'#2'~for~the~command~'#1'~should~be~
+    a~single~character.
+  }
+  {
     \c__msg_coding_error_text_tl
-    The~argument~specification~provided~was~not~valid:~
-    in~a~place~where~a~single~token~is~required,~LaTeX~found~'#2'. \\ \\
+    The~argument~specification~provided~was~not~valid:~in~a~place~
+    where~a~single~character~is~required,~LaTeX~found~'#2'. \\ \\
     LaTeX~will~ignore~this~entire~definition.
   }
 \__msg_kernel_new:nnnn { xparse } { processor-in-expandable }

Modified: trunk/Master/texmf-dist/tex/latex/l3packages/xtemplate/xtemplate.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3packages/xtemplate/xtemplate.sty	2017-07-21 22:02:07 UTC (rev 44863)
+++ trunk/Master/texmf-dist/tex/latex/l3packages/xtemplate/xtemplate.sty	2017-07-21 22:02:53 UTC (rev 44864)
@@ -23,8 +23,8 @@
 %%                     (C) Copyright 2004-2010 Frank Mittelbach,
 %%                         The LaTeX3 Project
 %%                     (C) Copyright 2011-2016 The LaTeX3 Project
-\RequirePackage{expl3}[2017/07/15]
-\@ifpackagelater{expl3}{2017/07/15}
+\RequirePackage{expl3}[2017/07/19]
+\@ifpackagelater{expl3}{2017/07/19}
   {}
   {%
     \PackageError{xtemplate}{Support package l3kernel too old}
@@ -36,7 +36,7 @@
       }%
     \endinput
   }
-\ProvidesExplPackage{xtemplate}{2017/07/15}{}
+\ProvidesExplPackage{xtemplate}{2017/07/19}{}
   {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