texlive[48749] trunk: l3 (24sep18)

commits+karl at tug.org commits+karl at tug.org
Mon Sep 24 22:23:19 CEST 2018


Revision: 48749
          http://tug.org/svn/texlive?view=revision&revision=48749
Author:   karl
Date:     2018-09-24 22:23:18 +0200 (Mon, 24 Sep 2018)
Log Message:
-----------
l3 (24sep18)

Modified Paths:
--------------
    trunk/Build/source/texk/texlive/linked_scripts/l3build/l3build.lua
    trunk/Master/texmf-dist/doc/latex/l3build/CHANGELOG.md
    trunk/Master/texmf-dist/doc/latex/l3build/README.md
    trunk/Master/texmf-dist/doc/latex/l3build/l3build.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md
    trunk/Master/texmf-dist/doc/latex/l3kernel/README.md
    trunk/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex
    trunk/Master/texmf-dist/doc/latex/l3kernel/source3.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex
    trunk/Master/texmf-dist/doc/latex/l3packages/CHANGELOG.md
    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/doc/man/man1/l3build.1
    trunk/Master/texmf-dist/doc/man/man1/l3build.man1.pdf
    trunk/Master/texmf-dist/scripts/l3build/l3build-check.lua
    trunk/Master/texmf-dist/scripts/l3build/l3build-ctan.lua
    trunk/Master/texmf-dist/scripts/l3build/l3build-install.lua
    trunk/Master/texmf-dist/scripts/l3build/l3build-typesetting.lua
    trunk/Master/texmf-dist/scripts/l3build/l3build-variables.lua
    trunk/Master/texmf-dist/scripts/l3build/l3build.lua
    trunk/Master/texmf-dist/source/latex/l3build/l3build.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3final.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/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.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.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/l3kernel/expl3-code.tex
    trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex
    trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvipdfmx.def
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvips.def
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvisvgm.def
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3xdvipdfmx.def
    trunk/Master/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty
    trunk/Master/texmf-dist/tex/latex/l3packages/xfp/xfp.sty
    trunk/Master/texmf-dist/tex/latex/l3packages/xfrac/xfrac.sty
    trunk/Master/texmf-dist/tex/latex/l3packages/xparse/xparse.sty
    trunk/Master/texmf-dist/tex/latex/l3packages/xtemplate/xtemplate.sty

Modified: trunk/Build/source/texk/texlive/linked_scripts/l3build/l3build.lua
===================================================================
--- trunk/Build/source/texk/texlive/linked_scripts/l3build/l3build.lua	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Build/source/texk/texlive/linked_scripts/l3build/l3build.lua	2018-09-24 20:23:18 UTC (rev 48749)
@@ -25,7 +25,7 @@
 --]]
 
 -- Version information
-release_date = "2018-09-21"
+release_date = "2018-09-23"
 
 -- File operations are aided by the LuaFileSystem module
 local lfs = require("lfs")
@@ -137,9 +137,16 @@
       end
     end
     if next(failed) then
-      print("  Failed tests for configs:")
       for _,config in ipairs(failed) do
-        print("  - " .. config)
+        print("Failed tests for configuration " .. config .. ":")
+        print("\n  Check failed with difference files")
+        if failed ~= "build" then
+          local testdir = testdir .. "-" .. failed
+        end
+        for _,i in ipairs(filelist(testdir,"*" .. os_diffext)) do
+          print("  - " .. testdir .. "/" .. i)
+        end
+        print("")
       end
       exit(1)
     else
@@ -154,6 +161,7 @@
    local config = "./" .. checkconfigs[1] .. ".lua"
    if fileexists(config) then
      dofile(config)
+     testdir = testdir .. "-" .. checkconfigs[1]
    else
      print("Error: Cannot find configuration " ..  checkconfigs[1])
      exit(1)

Modified: trunk/Master/texmf-dist/doc/latex/l3build/CHANGELOG.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3build/CHANGELOG.md	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/doc/latex/l3build/CHANGELOG.md	2018-09-24 20:23:18 UTC (rev 48749)
@@ -7,6 +7,15 @@
 
 ## [Unreleased]
 
+## [2018-09-23]
+
+## Changed
+
+- Entries in `scriptfiles` are excluded from `installfiles`
+- Use a per-config directory for running tests
+- Enable use of local `texmf.cnf` file in tests and documentation
+- New `ctanreadme` variable
+
 ## [2018-09-21]
 
 ### Changed
@@ -159,7 +168,8 @@
 - Rationalise short option names: removed `-d`, `-E`, `-r`
 - Target `cmdcheck`: specific to LaTeX3 kernel work
 
-[Unreleased]: https://github.com/latex3/l3build/compare/2018-09-21...HEAD
+[Unreleased]: https://github.com/latex3/l3build/compare/2018-09-23...HEAD
+[2018-09-23]: https://github.com/latex3/l3build/compare/2018-09-21...2018-09-23
 [2018-09-21]: https://github.com/latex3/l3build/compare/2018-08-07...2018-09-21
 [2018-08-07]: https://github.com/latex3/l3build/compare/2018-08-04...2018-08-07
 [2018-08-04]: https://github.com/latex3/l3build/compare/2018-08-02...2018-08-04

Modified: trunk/Master/texmf-dist/doc/latex/l3build/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3build/README.md	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/doc/latex/l3build/README.md	2018-09-24 20:23:18 UTC (rev 48749)
@@ -1,7 +1,7 @@
 l3build: a testing and building system for LaTeX3
 =================================================
 
-Release 2018-09-21
+Release 2018-09-23
 
 Overview
 --------

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

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md	2018-09-24 20:23:18 UTC (rev 48749)
@@ -7,6 +7,16 @@
 
 ## [Unreleased]
 
+## [2018-09-24]
+
+### Added
+- Some driver-level support for PDF features
+- `\peek_catcode_collect_inline:Nn`, `\peek_charcode_collect_inline:Nn`,
+  `\peek_meaning_collect_inline:Nn`
+
+### Fixed
+- Handling of unknown keys when inheritance is active (fixes #481)
+
 ## [2018-08-23]
 
 ### Added
@@ -122,7 +132,8 @@
 - Step func­tions have been added for dim vari­ables,
   e.g. `\dim_step_in­line:nnnn`
 
-[Unreleased]: https://github.com/latex3/latex3/compare/2018-08-23...HEAD
+[Unreleased]: https://github.com/latex3/latex3/compare/2018-09-24...HEAD
+[2018-09-24]: https://github.com/latex3/latex3/compare/2018-08-23...2018-09-24
 [2018-08-23]: https://github.com/latex3/latex3/compare/2018-06-14...2018-08-23
 [2018-06-14]: https://github.com/latex3/latex3/compare/2018-06-01...2018-06-14
 [2018-06-01]: https://github.com/latex3/latex3/compare/2018-05-13...2018-06-01

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/README.md	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/README.md	2018-09-24 20:23:18 UTC (rev 48749)
@@ -1,7 +1,7 @@
 LaTeX3 Programming Conventions
 ==============================
 
-Release 2018-08-23
+Release 2018-09-24
 
 Overview
 --------

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

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

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex	2018-09-24 20:23:18 UTC (rev 48749)
@@ -52,7 +52,7 @@
          {latex-team at latex-project.org}%
    }%
 }
-\date{Released 2018-08-23}
+\date{Released 2018-09-24}
 
 \pagenumbering{roman}
 \maketitle

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

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

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex	2018-09-24 20:23:18 UTC (rev 48749)
@@ -30,7 +30,7 @@
         {latex-team at latex-project.org}%
     }%
 }
-\date{Released 2018-08-23}
+\date{Released 2018-09-24}
 
 \begin{document}
 

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

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex	2018-09-24 20:23:18 UTC (rev 48749)
@@ -30,7 +30,7 @@
         {latex-team at latex-project.org}%
     }%
 }
-\date{Released 2018-08-23}
+\date{Released 2018-09-24}
 
 \newcommand{\TF}{\textit{(TF)}}
 

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

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex	2018-09-24 20:23:18 UTC (rev 48749)
@@ -51,7 +51,7 @@
          {latex-team at latex-project.org}%
    }%
 }
-\date{Released 2018-08-23}
+\date{Released 2018-09-24}
 
 \pagenumbering{roman}
 \maketitle

Modified: trunk/Master/texmf-dist/doc/latex/l3packages/CHANGELOG.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3packages/CHANGELOG.md	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/doc/latex/l3packages/CHANGELOG.md	2018-09-24 20:23:18 UTC (rev 48749)
@@ -7,6 +7,11 @@
 
 ## [Unreleased]
 
+## [2018-09-24]
+
+### Changed
+- `xparse`: put spaces back when a trailing optional arg is absent (fixes #466)
+
 ## [2018-08-23]
 
 ### Added
@@ -25,7 +30,8 @@
 - Switch to ISO date format
 - Improve cross-module use of internal functions
 
-[Unreleased]: https://github.com/latex3/latex3/compare/2018-08-23...HEAD
+[Unreleased]: https://github.com/latex3/latex3/compare/2018-09-24...HEAD
+[2018-09-24]: https://github.com/latex3/latex3/compare/2018-08-23...2018-09-24
 [2018-08-23]: https://github.com/latex3/latex3/compare/2018-05-12...2018-08-23
 [2018-05-12]: https://github.com/latex3/latex3/compare/2018-04-30...2018-05-12
 [2018-04-30]: https://github.com/latex3/latex3/compare/2017-12-16...2018-04-30

Modified: trunk/Master/texmf-dist/doc/latex/l3packages/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3packages/README.md	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/doc/latex/l3packages/README.md	2018-09-24 20:23:18 UTC (rev 48749)
@@ -1,7 +1,7 @@
 LaTeX3 High-Level Concepts
 ==========================
 
-Release 2018-08-23
+Release 2018-09-24
 
 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/doc/man/man1/l3build.1
===================================================================
--- trunk/Master/texmf-dist/doc/man/man1/l3build.1	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/doc/man/man1/l3build.1	2018-09-24 20:23:18 UTC (rev 48749)
@@ -1,4 +1,4 @@
-.TH l3build 1 "2018-09-21"
+.TH l3build 1 "2018-09-23"
 .SH NAME
 l3build \- Checking and building packages
 .SH SYNOPSIS

Modified: trunk/Master/texmf-dist/doc/man/man1/l3build.man1.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/scripts/l3build/l3build-check.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/l3build/l3build-check.lua	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/scripts/l3build/l3build-check.lua	2018-09-24 20:23:18 UTC (rev 48749)
@@ -30,6 +30,9 @@
 
 local rnd              = math.random
 
+local var_value        = kpse.var_value
+local set_program_name = kpse.set_program_name
+
 local luatex_version   = status.luatex_version
 
 local len              = string.len
@@ -726,6 +729,8 @@
       break
     end
   end
+  -- Deal with TEXMFCNF
+  set_program_name("kpsewhich")
   -- Clean out any dynamic files
   for _,filetype in pairs(dynamicfiles) do
     rm(testdir,filetype)
@@ -741,6 +746,9 @@
       -- Avoid spurious output from (u)pTeX
       os_setenv .. " GUESS_INPUT_KANJI_ENCODING=0"
         .. os_concat ..
+      -- Allow for local texmf files
+      os_setenv .. " TEXMFCNF=." .. os_pathsep .. var_value("TEXMFCNF")
+        .. os_concat ..
       (forcecheckepoch and setepoch() or "") ..
       -- Ensure lines are of a known length
       os_setenv .. " max_print_line=" .. maxprintline

Modified: trunk/Master/texmf-dist/scripts/l3build/l3build-ctan.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/l3build/l3build-ctan.lua	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/scripts/l3build/l3build-ctan.lua	2018-09-24 20:23:18 UTC (rev 48749)
@@ -25,6 +25,9 @@
 local pairs = pairs
 local print = print
 
+local lower = string.lower
+local match = string.match
+
 -- Copy files to the main CTAN release directory
 function copyctan()
   mkdir(ctandir .. "/" .. ctanpkg)
@@ -129,6 +132,17 @@
         cp(i, j, tdsdir .. "/doc/" .. tdsroot .. "/" .. bundle)
       end
     end
+    -- Rename README if necessary
+    if ctanreadme ~= "" and not match(lower(ctanreadme),"^readme%.%w+") then
+      local newfile = "README." .. match(ctanreadme,"%.(%w+)$")
+      for _,dir in pairs({ctandir .. "/" .. ctanpkg,
+        tdsdir .. "/doc/" .. tdsroot .. "/" .. bundle}) do
+        if fileexists(dir .. "/" .. ctanreadme) then
+          rm(dir,newfile)
+          ren(dir,ctanreadme,newfile)
+        end
+      end
+    end
     dirzip(tdsdir, ctanpkg .. ".tds")
     if packtdszip then
       cp(ctanpkg .. ".tds.zip", tdsdir, ctandir)

Modified: trunk/Master/texmf-dist/scripts/l3build/l3build-install.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/l3build/l3build-install.lua	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/scripts/l3build/l3build-install.lua	2018-09-24 20:23:18 UTC (rev 48749)
@@ -29,6 +29,7 @@
 local var_value   = kpse.var_value
 
 local gsub  = string.gsub
+local lower = string.lower
 local match = string.match
 
 local insert = table.insert
@@ -132,14 +133,6 @@
   end
   local errorlevel = unpack()
   if errorlevel ~= 0 then return errorlevel end
-  errorlevel = install_files(unpackdir,"tex",{installfiles})
-    + install_files(unpackdir,"bibtex/bst",{bstfiles},module,true)
-    + install_files(unpackdir,"makeindex",{makeindexfiles},module,true)
-    + install_files(unpackdir,"scripts",{scriptfiles},module)
-  if errorlevel ~= 0 then return errorlevel end
-  if full then
-    errorlevel = doc()
-    if errorlevel ~= 0 then return errorlevel end
 
     -- Creates a 'controlled' list of files
     local function excludelist(dir,include,exclude)
@@ -165,6 +158,11 @@
       return includelist
     end
 
+  local installlist = excludelist(unpackdir,installfiles,{scriptfiles})
+
+  if full then
+    errorlevel = doc()
+    if errorlevel ~= 0 then return errorlevel end
     -- For the purposes here, any typesetting demo files need to be
     -- part of the main typesetting list
     local typesetfiles = typesetfiles
@@ -188,6 +186,16 @@
           {bibfiles,demofiles,docfiles,pdffiles,textfiles,typesetlist})
     if errorlevel ~= 0 then return errorlevel end
 
+    -- Rename README if necessary
+    if not dry_run then
+      if ctanreadme ~= "" and not match(lower(ctanreadme),"^readme%.%w+") then
+        local installdir = target .. "/doc/" .. moduledir
+        if fileexists(installdir .. "/" .. ctanreadme) then
+          ren(installdir,ctanreadme,"README." .. match(ctanreadme,"%.(%w+)$"))
+        end
+      end
+    end
+
     -- Any script man files need special handling
     local manfiles = { }
     for _,glob in pairs(scriptmanfiles) do
@@ -210,6 +218,14 @@
       end
     end
   end
+
+  if errorlevel ~= 0 then return errorlevel end
+
+  errorlevel = install_files(unpackdir,"tex",{installlist})
+    + install_files(unpackdir,"bibtex/bst",{bstfiles},module,true)
+    + install_files(unpackdir,"makeindex",{makeindexfiles},module,true)
+    + install_files(unpackdir,"scripts",{scriptfiles},module)
+  
   return errorlevel
 end
 

Modified: trunk/Master/texmf-dist/scripts/l3build/l3build-typesetting.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/l3build/l3build-typesetting.lua	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/scripts/l3build/l3build-typesetting.lua	2018-09-24 20:23:18 UTC (rev 48749)
@@ -29,6 +29,9 @@
 local gsub             = string.gsub
 local match            = string.match
 
+local var_value        = kpse.var_value
+local set_program_name = kpse.set_program_name
+
 function dvitopdf(name, dir, engine, hide)
   if match(engine, "^u?ptex$") then
     run(
@@ -52,11 +55,15 @@
 
 -- An auxiliary used to set up the environmental variables
 function runtool(subdir, dir, envvar, command)
+  set_program_name("kpsewhich")
   dir = dir or "."
   return(
     run(
       typesetdir .. "/" .. subdir,
       (forcedocepoch and setepoch() or "") ..
+      -- Allow for local texmf files
+      os_setenv .. " TEXMFCNF=." .. os_pathsep .. var_value("TEXMFCNF")
+        .. os_concat ..
       os_setenv .. " " .. envvar .. "=." .. os_pathsep
         .. abspath(localdir) .. os_pathsep
         .. abspath(dir .. "/" .. subdir)

Modified: trunk/Master/texmf-dist/scripts/l3build/l3build-variables.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/l3build/l3build-variables.lua	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/scripts/l3build/l3build-variables.lua	2018-09-24 20:23:18 UTC (rev 48749)
@@ -159,6 +159,7 @@
 -- Other required settings
 asciiengines = asciiengines or {"pdftex"}
 checkruns    = checkruns    or 1
+ctanreadme   = ctanreadme   or "README.md"
 ctanzip      = ctanzip      or ctanpkg .. "-ctan"
 epoch        = epoch        or 1463734800
 if flatten == nil then

Modified: trunk/Master/texmf-dist/scripts/l3build/l3build.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/l3build/l3build.lua	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/scripts/l3build/l3build.lua	2018-09-24 20:23:18 UTC (rev 48749)
@@ -25,7 +25,7 @@
 --]]
 
 -- Version information
-release_date = "2018-09-21"
+release_date = "2018-09-23"
 
 -- File operations are aided by the LuaFileSystem module
 local lfs = require("lfs")
@@ -137,9 +137,16 @@
       end
     end
     if next(failed) then
-      print("  Failed tests for configs:")
       for _,config in ipairs(failed) do
-        print("  - " .. config)
+        print("Failed tests for configuration " .. config .. ":")
+        print("\n  Check failed with difference files")
+        if failed ~= "build" then
+          local testdir = testdir .. "-" .. failed
+        end
+        for _,i in ipairs(filelist(testdir,"*" .. os_diffext)) do
+          print("  - " .. testdir .. "/" .. i)
+        end
+        print("")
       end
       exit(1)
     else
@@ -154,6 +161,7 @@
    local config = "./" .. checkconfigs[1] .. ".lua"
    if fileexists(config) then
      dofile(config)
+     testdir = testdir .. "-" .. checkconfigs[1]
    else
      print("Error: Cannot find configuration " ..  checkconfigs[1])
      exit(1)

Modified: trunk/Master/texmf-dist/source/latex/l3build/l3build.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3build/l3build.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3build/l3build.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -152,6 +152,7 @@
 \luavarseparator
 \luavarset{asciiengines}{\{"pdftex"\}}{Engines which should log as sure ASCII}
 \luavarset{checkruns}   {1}           {Number of runs to complete for a test before comparing the log}
+\luavarset{ctanreadme}{"README.md"}   {Name of the file to send to CTAN as \texttt{README.\meta{ext}}}
 \luavarset{ctanzip}{ctanpkg ... "-ctan"}{Name of the zip file created for upload to CTAN}
 \luavarset{epoch}       {1463734800}  {Epoch (Unix date) to set for test runs}
 \luavarset{flatten}     {true}        {Switch to flatten any source structure when sending to CTAN}
@@ -222,7 +223,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-09-21}
+% \date{Released 2018-09-23}
 %
 % \maketitle
 % \tableofcontents
@@ -437,6 +438,11 @@
 % The |source| tree is constructed from all files matched by \var{typesetfiles} and \var{sourcefiles}.
 % The |tex| tree from all files matched by \var{installfiles}.
 %
+% The special case \var{ctanreadme} is used to allow renaming of a local
+% |foo.xyz| file to |README.xyz|. The local |foo.xyz| should be listed in
+% \var{textfiles}, and will be renamed as part of constructing the CTAN
+% structure. The file extension will be unchanged by this process.
+%
 % Files that should always be excluded from the archive are matched against the \var{excludefiles} variable; by default this is \luavar{excludefiles}, which match Emacs' autosave files.
 %
 % Binary files should be specified with the \var{binaryfiles} variable (default \luavar{binaryfiles}); these are added to the zip archive without normalising line endings (text files are automatically converted to Unix-style line endings).
@@ -1054,6 +1060,18 @@
 % takes either a date or raw epoch. When given, this will automatically
 % activate forcing of the epoch in both testing and typesetting.
 %
+% \subsection{Settings in \texttt{texmf.cnf}}
+%
+% To allow application of non-standard \TeX{} trees or similar non-standard
+% settings, \pkg{l3build} enables searching for a \texttt{texmf.cnf} file
+% by setting the envirnmental variable \texttt{TEXMFCNF}. This might
+% for example be used with a file containing
+% \begin{verbatim}
+% TEXMFAUXTREES = ../../texmf,
+% \end{verbatim}
+% for adding a local tree within the development repository (assuming the
+% typical \pkg{l3build} layout).
+%
 % \section{Alternative test formats}
 %
 % \subsection{Generating test files with \pkg{DocStrip}}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -21,7 +21,7 @@
 % for those people who are interested.
 %
 %<*driver|generic|package>
-\def\ExplFileDate{2018-08-23}%
+\def\ExplFileDate{2018-09-24}%
 %</driver|generic|package>
 %<*driver>
 \documentclass[full]{l3doc}
@@ -49,7 +49,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -138,7 +138,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %
@@ -1467,6 +1467,39 @@
 %   (as appropriate to the result of the test).
 % \end{function}
 %
+% \begin{function}[added = 2018-09-23]
+%   {
+%     \peek_catcode_collect_inline:Nn,
+%     \peek_charcode_collect_inline:Nn,
+%     \peek_meaning_collect_inline:Nn
+%   }
+%   \begin{syntax}
+%     \cs{peek_catcode_collect_inline:Nn} \meta{test token} \Arg{inline code}
+%     \cs{peek_charcode_collect_inline:Nn} \meta{test token} \Arg{inline code}
+%     \cs{peek_meaning_collect_inline:Nn} \meta{test token} \Arg{inline code}
+%   \end{syntax}
+%   Collects and removes tokens from the input stream until finding a
+%   token that does not match the \meta{test token} (as defined by the
+%   test \cs{token_if_eq_catcode:NNTF} or \cs{token_if_eq_charcode:NNTF}
+%   or \cs{token_if_eq_meaning:NNTF}).  The collected tokens are passed
+%   to the \meta{inline code} as~|#1|.  When begin-group or end-group
+%   tokens (usually |{| or~|}|) are collected they are replaced by
+%   implicit \cs{c_group_begin_token} and \cs{c_group_end_token}, and
+%   when spaces (including \cs{c_space_token}) are collected they are
+%   replaced by explicit spaces.
+%
+%   For example the following code prints ``Hello'' to the terminal and
+%   leave ``, world!'' in the input stream.
+% \begin{verbatim}
+% \peek_catcode_collect_inline:Nn A { \iow_term:n {#1} } Hello,~world!
+% \end{verbatim}
+%   Another example is that the following code tests if the next token is |*|, ignoring intervening spaces, but putting them back using |#1| if there is no~|*|.
+% \begin{verbatim}
+% \peek_meaning_collect_inline:Nn \c_space_token
+%   { \peek_charcode:NTF * { star } { no~star #1 } }
+% \end{verbatim}
+% \end{function}
+%
 % \end{documentation}
 %
 % \begin{implementation}
@@ -1488,21 +1521,13 @@
 %   this will switch to horizontal mode and insert \tn{everypar} tokens and
 %   nothing else. Unlike the \LaTeXe{} version, the availability of \eTeX{}
 %   means using a mode test can be done at for example the start of an
-%   \tn{halign}. The \tn{quitvmode} primitive essentially wraps the same
-%   code up at the engine level.
+%   \tn{halign}.
 %    \begin{macrocode}
-\cs_new_protected:Npx \mode_leave_vertical:
+\cs_new_protected:Npn \mode_leave_vertical:
   {
-    \cs_if_exist:NTF \tex_quitvmode:D
-      { \tex_quitvmode:D }
-      {
-        \exp_not:n
-          {
-            \if_mode_vertical:
-              \exp_after:wN \tex_indent:D
-            \fi:
-          }
-     }
+    \if_mode_vertical:
+      \exp_after:wN \tex_indent:D
+    \fi:
   }
 %    \end{macrocode}
 % \end{macro}
@@ -5229,7 +5254,87 @@
 % \end{macro}
 % \end{macro}
 %
+% \begin{variable}{\l_@@_collect_tl}
 %    \begin{macrocode}
+\tl_new:N \l_@@_collect_tl
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}
+%   {
+%     \peek_catcode_collect_inline:Nn,
+%     \peek_charcode_collect_inline:Nn,
+%     \peek_meaning_collect_inline:Nn
+%   }
+% \begin{macro}
+%   {
+%     \@@_collect:NNn, \@@_collect_true:w,
+%     \@@_collect_remove:nw, \@@_collect:N
+%   }
+%     Most of the work is done by \cs{@@_execute_branches_\ldots{}:},
+%     which calls either \cs{@@_true:w} or \cs{@@_false:w} according to
+%     whether the next token \cs{l_peek_token} matches the search token
+%     (stored in \cs{l_@@_search_token} and \cs{l_@@_search_tl}).
+%     Here, in the \texttt{true} case we run \cs{@@_collect_true:w},
+%     which generally calls \cs{@@_collect:N} to store the peeked token
+%     into \cs{l_@@_collect_tl}, except in special non-\texttt{N}-type
+%     cases (begin-group, end-group, or space), where a frozen token is
+%     stored.  The \texttt{true} branch calls
+%     \cs{@@_execute_branches_\ldots{}:} to fetch more matching tokens.
+%     Once there are no more, \cs{@@_false_aux:n} closes the safe-align
+%     group and runs the user's inline code.
+%    \begin{macrocode}
+\cs_new_protected:Npn \peek_catcode_collect_inline:Nn
+  { \@@_collect:NNn \@@_execute_branches_catcode: }
+\cs_new_protected:Npn \peek_charcode_collect_inline:Nn
+  { \@@_collect:NNn \@@_execute_branches_charcode: }
+\cs_new_protected:Npn \peek_meaning_collect_inline:Nn
+  { \@@_collect:NNn \@@_execute_branches_meaning: }
+\cs_new_protected:Npn \@@_collect:NNn #1#2#3
+  {
+    \group_align_safe_begin:
+    \cs_set_eq:NN \l_@@_search_token #2
+    \tl_set:Nn \l_@@_search_tl {#2}
+    \tl_clear:N \l_@@_collect_tl
+    \cs_set:Npn \@@_false:w
+      { \exp_args:No \@@_false_aux:n \l_@@_collect_tl }
+    \cs_set:Npn \@@_false_aux:n ##1
+      {
+        \group_align_safe_end:
+        #3
+      }
+    \cs_set_eq:NN \@@_true:w \@@_collect_true:w
+    \cs_set:Npn \@@_true_aux:w { \peek_after:Nw #1 }
+    \@@_true_aux:w
+  }
+\cs_new_protected:Npn \@@_collect_true:w
+  {
+    \if_case:w
+        \if_catcode:w \exp_not:N \l_peek_token {   1 \exp_stop_f: \fi:
+        \if_catcode:w \exp_not:N \l_peek_token }   2 \exp_stop_f: \fi:
+        \if_meaning:w \l_peek_token \c_space_token 3 \exp_stop_f: \fi:
+        0 \exp_stop_f:
+      \exp_after:wN \@@_collect:N
+    \or: \@@_collect_remove:nw { \c_group_begin_token }
+    \or: \@@_collect_remove:nw { \c_group_end_token }
+    \or: \@@_collect_remove:nw { ~ }
+    \fi:
+  }
+\cs_new_protected:Npn \@@_collect:N #1
+  {
+    \tl_put_right:Nn \l_@@_collect_tl {#1}
+    \@@_true_aux:w
+  }
+\cs_new_protected:Npn \@@_collect_remove:nw #1
+  {
+    \tl_put_right:Nn \l_@@_collect_tl {#1}
+    \exp_after:wN \@@_true_remove:w
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%    \begin{macrocode}
 %</initex|package>
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -77,7 +77,7 @@
 %
 % \title{The \cls{l3doc} class}
 % \author{\Team}
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 % \maketitle
 % \tableofcontents
 %
@@ -281,6 +281,10 @@
 %     \item |replace| is a boolean key (\texttt{true} by default) which
 %       indicates whether to replace |@@| as \pkg{l3docstrip} does.
 %   \end{itemize}
+%   These commands allow hyphenation of control sequences after (most) underscores.
+%   By default, a hyphen is used to mark the hyphenation, but this can be changed with
+%   the \texttt{cs-break-nohyphen} class option.
+%   To disable hyphenation of control sequencies entirely, use \texttt{cs-break-off}.
 % \end{function}
 %
 %
@@ -687,6 +691,7 @@
 %     \g_@@_lmodern_bool,
 %     \g_@@_checkfunc_bool,
 %     \g_@@_checktest_bool,
+%     \g_@@_cs_break_bool,
 %     \g_@@_kernel_bool
 %   }
 %   Information about package options.
@@ -695,6 +700,8 @@
 \bool_new:N \g_@@_checkfunc_bool
 \bool_new:N \g_@@_checktest_bool
 \bool_new:N \g_@@_kernel_bool
+\bool_new:N \g_@@_cs_break_bool
+\bool_gset_true:N \g_@@_cs_break_bool
 %    \end{macrocode}
 % \end{variable}
 %
@@ -1412,6 +1419,13 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
+\DeclareOption { cs-break-off }
+  { \bool_gset_false:N \g_@@_cs_break_bool }
+\DeclareOption { cs-break-nohyphen }
+  { \PassOptionsToPackage{nohyphen}{underscore} }
+%    \end{macrocode}
+%
+%    \begin{macrocode}
 \DeclareOption* { \PassOptionsToClass { \CurrentOption } { article } }
 \ExecuteOptions { full, kernel, nocheck, nochecktest, lm-default }
 \PassOptionsToClass { a4paper } { article }
@@ -1460,9 +1474,9 @@
     pifont,
     textcomp,
     trace,
-    underscore,
     csquotes,
     fancyvrb,
+    underscore,
     verbatim
   }
 \raggedbottom
@@ -1933,19 +1947,34 @@
         \@@_replace_at_at:N \l_@@_cmd_tl
         \tl_replace_all:Nno \l_@@_cmd_tl { _ } \l_@@_tmpb_tl
       }
+%    \end{macrocode}
+% \paragraph{Typesetting}
+% Note the replacement for the underscore is to permit linebreaks.
+% The \texttt{underscore} package adds the linebreak,
+% and the regex results in applying the breakable underscore only to the \emph{last}
+% of a run of underscores, and not if the underscore follows a backslash.
+%    \begin{macrocode}
     \mode_if_math:T { \mbox }
-    {
-      \verbatim at font
-      \@@_if_almost_str:VT \l_@@_cmd_tl
-        {
-          \tl_set:Nx \l_@@_cmd_tl { \tl_to_str:N \l_@@_cmd_tl }
-          \tl_replace_all:Non \l_@@_cmd_tl
-            { \token_to_str:N _ } { \_ }
-        }
-      \tl_replace_all:Nnn \l_@@_cmd_tl { ~ } { \@xobeysp }
-      \l_@@_cmd_tl
-      \@
-    }
+      {
+        \verbatim at font
+        \@@_if_almost_str:VT \l_@@_cmd_tl
+          {
+            \tl_set:Nx \l_@@_cmd_tl { \tl_to_str:N \l_@@_cmd_tl }
+            \bool_if:NT \g_@@_cs_break_bool
+              {
+                \regex_replace_all:nnN
+                  {([^\\])_([^\_])}
+                  {\1\c{BreakableUnderscore}\2}
+                  \l_@@_cmd_tl
+              }
+          }
+        \tl_replace_all:Nnn \l_@@_cmd_tl { ~ } { \@xobeysp }
+        \l_@@_cmd_tl
+        \@
+      }
+%    \end{macrocode}
+% \paragraph{Indexing}
+%    \begin{macrocode}
     \bool_if:NF \l_@@_cmd_noindex_bool
       {
         \quark_if_no_value:NF \l_@@_cmd_index_tl

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -61,7 +61,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %
@@ -458,6 +458,79 @@
 %   given.
 % \end{function}
 %
+% \section{PDF Features}
+%
+% A range of PDF features are exposed by \pdfTeX{} and \LuaTeX{} in direct PDF
+% output mode, and the vast majority of these are also controllable using
+% the \texttt{(x)dvipdfmx} driver (as DVI instructions are converted directly
+% to PDF). Some of these functions are also available for cases where PDFs
+% are generated by \texttt{dvips}: this depends on being able to pass
+% information through correctly.
+%
+% \subsection{PDF Objects}
+%
+% Objects are used to provide a range of data structures in a PDF. At the
+% driver level, different PDF object types are declared separately. Objects
+% are only \emph{written} to the PDF when referenced.
+%
+% \begin{function}{\driver_pdf_object_new:nn}
+%   \begin{syntax}
+%     \cs{driver_pdf_object_new:n} \Arg{name} \Arg{type}
+%   \end{syntax}
+%   Declares \meta{name} as a PDF object. The \texttt{type} should be one of
+%   |array| or |dict|, |fstream| or |stream|.
+% \end{function}
+%
+% \begin{function}[EXP]{\driver_pdf_object_ref:n}
+%   \begin{syntax}
+%     \cs{driver_pdf_object_ref:n} \Arg{object}
+%   \end{syntax}
+%   Inserts the appropriate information to reference the \meta{object}
+%   in for example page resource allocation.
+% \end{function}
+%
+% \begin{function}{\driver_pdf_object_write:nn}
+%   \begin{syntax}
+%     \cs{driver_pdf_object_write:nn} \Arg{name} \Arg{data}
+%   \end{syntax}
+%   Writes the \meta{data} as content of the \meta{object}. Depending on the
+%   \meta{type} declared for the object, the format required for the
+%   \meta{data} will vary
+%   \begin{itemize}
+%     \item[\texttt{array}] A space-separated list of values
+%     \item[\texttt{dict}] Key--value pairs in the form
+%       \texttt{/\meta{key} \meta{value}}
+%     \item[\texttt{fstream}] Two brace groups: \meta{content} and
+%       \meta{file name}
+%     \item[\texttt{stream}] Two brace groups: \meta{content} and
+%       \meta{additional attributes}
+%   \end{itemize}
+% \end{function}
+%
+% \subsection{PDF structure}
+%
+% \begin{function}{\driver_pdf_compresslevel:n}
+%   \begin{syntax}
+%     \cs{driver_pdf_compresslevel:n} \Arg{level}
+%   \end{syntax}
+%   Sets the degree of compression used for PDF files: the \meta{level} should
+%   be in the range $0$ to $9$ (higher is more compression). Typically, either
+%   compression is disables ($0$) or maximised ($9$). When used with
+%   \texttt{(x)dvipdfmx}, this setting may only be applied globally: it should
+%   be set only once.
+% \end{function}
+%
+% \begin{function}{\driver_pdf_objects_enable:, \driver_pdf_objects_disable:}
+%   \begin{syntax}
+%     \cs{driver_pdf_objects_disable:}
+%   \end{syntax}
+%   Enables or disables the creation of PDF objects. These objects are used to
+%   reduce the size of PDFs, and typically are enabled as standard. When used
+%   with \texttt{(x)dvipdfmx}, object creation can be disabled but not
+%   re-enabled, and this setting may only be applied globally: it should
+%   be set only once.
+% \end{function}
+%
 % \end{documentation}
 %
 % \begin{implementation}
@@ -481,23 +554,23 @@
 %<*package>
 \ProvidesExplFile
 %<*dvipdfmx>
-  {l3dvidpfmx.def}{2018-08-23}{}
+  {l3dvidpfmx.def}{2018-09-24}{}
   {L3 Experimental driver: dvipdfmx}
 %</dvipdfmx>
 %<*dvips>
-  {l3dvips.def}{2018-08-23}{}
+  {l3dvips.def}{2018-09-24}{}
   {L3 Experimental driver: dvips}
 %</dvips>
 %<*dvisvgm>
-  {l3dvisvgm.def}{2018-08-23}{}
+  {l3dvisvgm.def}{2018-09-24}{}
   {L3 Experimental driver: dvisvgm}
 %</dvisvgm>
 %<*pdfmode>
-  {l3pdfmode.def}{2018-08-23}{}
+  {l3pdfmode.def}{2018-09-24}{}
   {L3 Experimental driver: PDF mode}
 %</pdfmode>
 %<*xdvipdfmx>
-  {l3xdvidpfmx.def}{2018-08-23}{}
+  {l3xdvidpfmx.def}{2018-09-24}{}
   {L3 Experimental driver: xdvipdfmx}
 %</xdvipdfmx>
 %</package>
@@ -605,7 +678,7 @@
       { rgb~ \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} }
   }
 \cs_new_protected:Npn \driver_color_spot:nn #1#2
-  { \@@_color_select:n { \c_space_tl #1 } }
+  { \@@_color_select:n { #1 } }
 \cs_new_protected:Npn \@@_color_select:n #1
   {
     \@@_literal:n { color~push~ #1 }
@@ -904,7 +977,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \subsection{Images}
+% \subsubsection{Images}
 %
 % \begin{macro}{\@@_image_getbb_eps:n}
 %   Simply use the generic function.
@@ -922,7 +995,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \subsection{Drawing}
+% \subsubsection{Drawing}
 %
 % \begin{macro}{\@@_draw_literal:n, \@@_draw_literal:x}
 %   The same as literal PostScript: same arguments about positioning apply
@@ -1322,7 +1395,114 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \subsubsection{PDF Features}
+%
+% \begin{variable}{\g_@@_pdf_object_int, \g_@@_pdf_object_prop}
+%   For tracking objects to allow finalisation.
 %    \begin{macrocode}
+\int_new:N \g_@@_pdf_object_int
+\prop_new:N \g_@@_pdf_object_prop
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}{\driver_pdf_object_new:nn}
+% \begin{macro}[EXP]{\driver_pdf_object_ref:n}
+%   Tracking objects is similar to \texttt{dvipdfmx}.
+%    \begin{macrocode}
+\cs_new_protected:Npn \driver_pdf_object_new:nn #1#2
+  {
+    \int_gincr:N \g_@@_pdf_object_int
+    \int_const:cn
+      { g_@@_pdf_object_ \tl_to_str:n {#1} _int }
+      { \g_@@_pdf_object_int }
+    \prop_gput:Nnn \g_@@_pdf_object_prop {#1} {#2}
+  }
+\cs_new:Npn \driver_pdf_object_ref:n #1
+  { { l3obj \int_use:c { g_@@_pdf_object_ \tl_to_str:n {#1} _int } } }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\driver_pdf_object_write:nn}
+% \begin{macro}
+%   {
+%     \@@_pdf_object_write_array:nn ,
+%     \@@_pdf_object_write_dict:nn  ,
+%     \@@_pdf_object_write_stream:nn
+%   }
+% \begin{macro}{\@@_pdf_object_write_stream:nnn}
+%   This is where we choose the actual type: some work to get things
+%   right.
+%    \begin{macrocode}
+\cs_new_protected:Npn \driver_pdf_object_write:nn #1#2
+  {
+    \@@_literal_postscript:x
+      {
+        mark ~ /_objdef ~ \driver_pdf_object_ref:n {#1} ~
+        /type
+        \str_case_e:nn
+          { \prop_item:Nn \g_@@_pdf_object_prop {#1} }
+          {
+            { array }   { /array }
+            { dict }    { /dict }
+            { fstream } { /stream }
+            { stream }  { /stream }
+          }
+        /OBJ ~ pdfmark
+      }
+    \use:c
+      { @@_pdf_object_write_ \prop_item:Nn \g_@@_pdf_object_prop {#1} :nn }
+      {#1} {#2}
+  }
+\cs_new_protected:Npn \@@_pdf_object_write_array:nn #1#2
+  {
+    \@@_literal_postscript:x
+      {
+        mark ~ \driver_pdf_object_ref:n {#1} ~
+          [ ~ \exp_not:n {#2} ~ ] ~ /PUTINTERVAL ~ pdfmark
+      }
+  }
+\cs_new_protected:Npn \@@_pdf_object_write_dict:nn #1#2
+  {
+    \@@_literal_postscript:x
+      {
+        mark ~ \driver_pdf_object_ref:n {#1} ~
+          << ~ \exp_not:n {#2} ~ >> ~ /PUT ~ pdfmark
+      }
+  }
+\cs_new_protected:Npn \@@_pdf_object_write_stream:nn #1#2
+  {
+    \exp_args:Nx
+      \@@_pdf_object_write_stream:nnn
+        { \driver_pdf_object_ref:n {#1} }
+        #2
+  }
+\cs_new_protected:Npn \@@_pdf_object_write_stream:nnn #1#2#3
+  {
+    \@@_literal_postscript:n
+      {
+        [nobreak] ~
+        mark ~ #1 ~ ( #3 ) ~ /PUT ~ pdfmark ~
+        mark ~ #1 ~ << #2 >> ~ /PUT ~ pdfmark
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\driver_pdf_compresslevel:n}
+% \begin{macro}{\driver_pdf_objects_enable:, \driver_pdf_objects_disable:}
+%   These are all no-ops.
+%    \begin{macrocode}
+\cs_new_protected:Npn \driver_pdf_compresslevel:n #1 { }
+\cs_new_protected:Npn \driver_pdf_objects_enable: { }
+\cs_new_protected:Npn \driver_pdf_objects_disable: { }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%    \begin{macrocode}
 %</dvips>
 %    \end{macrocode}
 %
@@ -1483,7 +1663,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \subsection{Images}
+% \subsubsection{Images}
 %
 % \begin{variable}{\l_@@_image_attr_tl}
 %   In PDF mode, additional attributes of an image (such as page number) are
@@ -1594,7 +1774,118 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \subsubsection{PDF Objects}
+%
+% \begin{variable}{\g_@@_pdf_object_prop}
+%   For tracking objects to allow finalisation.
 %    \begin{macrocode}
+\prop_new:N \g_@@_pdf_object_prop
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}{\driver_pdf_object_new:nn}
+% \begin{macro}[EXP]{\driver_pdf_object_ref:n}
+%   Declaring objects means reserving at the PDF level plus starting
+%   tracking.
+%    \begin{macrocode}
+\group_begin:
+  \cs_set_protected:Npn \@@_tmp:w #1#2
+    {
+      \cs_new_protected:Npx \driver_pdf_object_new:nn ##1##2
+        {
+          #1 reserveobjnum ~
+          \int_const:cn
+            { g_@@_pdf_object_ \exp_not:N \tl_to_str:n {##1} _int }
+            {#2}
+          \prop_gput:Nnn \exp_not:N \g_@@_pdf_object_prop {##1} {##2}
+        }
+    }
+  \cs_if_exist:NTF \tex_pdfextension:D
+    {
+      \@@_tmp:w
+        { \tex_pdfextension:D obj ~ }
+        { \tex_pdffeedback:D lastobj \scan_stop: }
+    }
+    { \@@_tmp:w { \tex_pdfobj:D } { \tex_pdflastobj:D } }
+\group_end:
+\cs_new:Npn \driver_pdf_object_ref:n #1
+  { \int_use:c { g_@@_pdf_object_ \tl_to_str:n {#1} _int } ~ 0 ~ R }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\driver_pdf_object_write:nn}
+% \begin{macro}[EXP]{\@@_exp_not_i:nn, \@@_exp_not_ii:nn}
+%   Writing the data needs a little information about the structure of the
+%   object.
+%    \begin{macrocode}
+\group_begin:
+  \cs_set_protected:Npn \@@_tmp:w #1
+    {
+      \cs_new_protected:Npn \driver_pdf_object_write:nn ##1##2
+        {
+          \tex_immediate:D #1 useobjnum ~
+          \int_use:c
+            { g_@@_pdf_object_ \tl_to_str:n {##1} _int }
+            \str_case_e:nn
+              { \prop_item:Nn \g_@@_pdf_object_prop {##1} }
+              {
+                { array } { { [ ~ \exp_not:n {##2} ~ ] } }
+                { dict }  { { << ~ \exp_not:n {##2} ~ >> } }
+                { fstream }
+                  {
+                    stream ~ attr ~ { \@@_exp_not_i:nn ##2 } ~
+                      file ~ { \@@_exp_not_ii:nn ##2 }
+                  }
+                { stream }
+                  {
+                    stream ~ attr ~ { \@@_exp_not_i:nn ##2 } ~ 
+                      { \@@_exp_not_ii:nn ##2 }
+                  }
+              }
+        }
+    }
+  \cs_if_exist:NTF \tex_pdfextension:D
+    { \@@_tmp:w { \tex_pdfextension:D obj ~ } }
+    { \@@_tmp:w { \tex_pdfobj:D } }
+\group_end:
+\cs_new:Npn \@@_exp_not_i:nn #1#2 { \exp_not:n {#1} }
+\cs_new:Npn \@@_exp_not_ii:nn #1#2 { \exp_not:n {#2} }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsubsection{PDF Structure}
+%
+% \begin{macro}{\driver_pdf_compresslevel:n}
+% \begin{macro}{\driver_pdf_objects_enable:, \driver_pdf_objects_disable:}
+% \begin{macro}{\@@_pdf_objectlevel:n}
+%   Simply pass data to the engine.
+%    \begin{macrocode}
+\cs_new_protected:Npx \driver_pdf_compresslevel:n #1
+  {
+    \cs_if_exist:NTF \tex_pdfcompresslevel:D
+      { \tex_pdfcompresslevel:D }
+      { \tex_pdfvariable:D compresslevel }
+      \exp_not:N \int_value:w \exp_not:N \int_eval:n {#1} \scan_stop:
+  }
+\cs_new_protected:Npn \driver_pdf_objects_enable:
+  { \@@_pdf_objectlevel:n { 2 } }
+\cs_new_protected:Npn \driver_pdf_objects_disable:
+  { \@@_pdf_objectlevel:n { 0 } }
+\cs_new_protected:Npx \@@_pdf_objectlevel:n #1
+  {
+    \cs_if_exist:NTF \tex_pdfobjcompresslevel:D
+      { \tex_pdfobjcompresslevel:D }
+      { \tex_pdfvariable:D objcompresslevel }
+      #1 \scan_stop:
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%    \begin{macrocode}
 %</pdfmode>
 %    \end{macrocode}
 %
@@ -1704,7 +1995,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \subsection{Images}
+% \subsubsection{Images}
 %
 % \begin{macro}
 %   {
@@ -1840,7 +2131,105 @@
 % \end{macro}
 % \end{macro}
 %
+% \subsubsection{PDF Objects}
+%
+% \begin{variable}{\g_@@_pdf_object_int, \g_@@_pdf_object_prop}
+%   For tracking objects to allow finalisation.
 %    \begin{macrocode}
+\int_new:N \g_@@_pdf_object_int
+\prop_new:N \g_@@_pdf_object_prop
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}{\driver_pdf_object_new:nn}
+% \begin{macro}[EXP]{\driver_pdf_object_ref:n}
+%   Objects are tracked at the macro level, but we don't have to do anything
+%   at this stage.
+%    \begin{macrocode}
+\cs_new_protected:Npn \driver_pdf_object_new:nn #1#2
+  {
+    \int_gincr:N \g_@@_pdf_object_int
+    \int_const:cn
+      { g_@@_pdf_object_ \tl_to_str:n {#1} _int }
+      { \g_@@_pdf_object_int }
+    \prop_gput:Nnn \g_@@_pdf_object_prop {#1} {#2}
+  }
+\cs_new:Npn \driver_pdf_object_ref:n #1
+  { @l3obj \int_use:c { g_@@_pdf_object_ \tl_to_str:n {#1} _int } }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\driver_pdf_object_write:nn}
+% \begin{macro}{\@@_pdf_object_write:nnn}
+% \begin{macro}
+%   {
+%     \@@_pdf_object_write_array:nn   ,
+%     \@@_pdf_object_write_dict:nn    ,
+%     \@@_pdf_object_write_fstream:nn ,
+%     \@@_pdf_object_write_stream:nn
+%   }
+% \begin{macro}{\@@_pdf_object_write_stream:nnnn}
+%   This is where we choose the actual type.
+%    \begin{macrocode}
+\cs_new_protected:Npn \driver_pdf_object_write:nn #1#2
+  {
+    \exp_args:Nx \@@_pdf_object_write:nnn
+      { \prop_item:Nn \g_@@_pdf_object_prop {#1} } {#1} {#2}
+  }
+\cs_new_protected:Npn \@@_pdf_object_write:nnn #1#2#3
+  { \use:c { @@_pdf_object_write_ #1 :nn } {#2} {#3} }
+\cs_new_protected:Npn \@@_pdf_object_write_array:nn #1#2
+  {
+    \@@_literal:x
+      {
+        pdf:obj ~ \driver_pdf_object_ref:n {#1} ~
+          [ ~ \exp_not:n {#2} ~ ]
+      }
+  }
+\cs_new_protected:Npn \@@_pdf_object_write_dict:nn #1#2
+  {
+    \@@_literal:x
+      {
+        pdf:obj ~ \driver_pdf_object_ref:n {#1} ~
+          << ~ \exp_not:n {#2} ~ >>
+      }
+  }
+\cs_new_protected:Npn \@@_pdf_object_write_fstream:nn #1#2
+  { \@@_pdf_object_write_stream:nnnn { f } {#1} #2 }
+\cs_new_protected:Npn \@@_pdf_object_write_stream:nn #1#2
+  { \@@_pdf_object_write_stream:nnnn { } {#1} #2 }
+\cs_new_protected:Npn \@@_pdf_object_write_stream:nnnn #1#2#3#4
+  {
+    \@@_literal:x
+      {
+        pdf: #1 stream ~ \driver_pdf_object_ref:n {#2} ~
+          ( \exp_not:n {#4} ) ~ << \exp_not:n {#3} >>
+        
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsubsection{PDF Structure}
+%
+% \begin{macro}{\driver_pdf_compresslevel:n}
+% \begin{macro}{\driver_pdf_objects_enable:, \driver_pdf_objects_disable:}
+%   Pass data to the driver: these are a one-shot.
+%    \begin{macrocode}
+\cs_new_protected:Npn \driver_pdf_compresslevel:n #1
+  { \@@_literal:x { dvipdfmx:config~z~ \int_eval:n {#1} } }
+\cs_new_protected:Npn \driver_pdf_objects_enable: { }
+\cs_new_protected:Npn \driver_pdf_objects_disable:
+  { \@@_literal:n { dvipdfmx:config~C~0x40 } }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%    \begin{macrocode}
 %</dvipdfmx|xdvipdfmx>
 %    \end{macrocode}
 %
@@ -1850,7 +2239,7 @@
 %<*xdvipdfmx>
 %    \end{macrocode}
 %
-% \subsection{Images}
+% \subsubsection{Images}
 %
 % \begin{macro}
 %   {\@@_image_getbb_jpg:n, \@@_image_getbb_pdf:n, \@@_image_getbb_png:n}
@@ -1955,7 +2344,7 @@
 %<*dvipdfmx|pdfmode|xdvipdfmx>
 %    \end{macrocode}
 %
-% \subsection{Drawing}
+% \subsubsection{Drawing}
 %
 % \begin{macro}{\@@_draw_literal:n, \@@_draw_literal:x}
 %   Pass data through using a dedicated interface.
@@ -2416,7 +2805,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \subsection{Driver-specific auxiliaries}
+% \subsubsection{Driver-specific auxiliaries}
 %
 % \begin{macro}{\@@_scope_begin:n, \@@_scope_begin:x}
 %   In SVG transformations, clips and so on are attached directly to scopes so
@@ -2556,7 +2945,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \subsection{Images}
+% \subsubsection{Images}
 %
 % \begin{macro}{\@@_image_getbb_png:n, \@@_image_getbb_jpg:n}
 %   These can be included by extracting the bounding box data.
@@ -2592,8 +2981,30 @@
 % \end{macro}
 % \end{macro}
 %
-% \subsection{Drawing}
+% \subsubsection{PDF Features}
 %
+% \begin{macro}{\driver_pdf_object_new:n}
+% \begin{macro}[EXP]{\driver_pdf_object_ref:n}
+% \begin{macro}{\driver_pdf_ojbect_write:nn}
+% \begin{macro}{\driver_pdf_compresslevel:n}
+% \begin{macro}{\driver_pdf_objects_enable:, \driver_pdf_objects_disable:}
+%   These are all no-ops.
+%    \begin{macrocode}
+\cs_new_protected:Npn \driver_pdf_object_new:n #1 { }
+\cs_new:Npn \driver_pdf_object_ref:n #1 { }
+\cs_new_protected:Npn \driver_pdf_object_write:nn #1#2 { }
+\cs_new_protected:Npn \driver_pdf_compresslevel:n #1 { }
+\cs_new_protected:Npn \driver_pdf_objects_enable: { }
+\cs_new_protected:Npn \driver_pdf_objects_disable: { }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsubsection{Drawing}
+%
 % \begin{macro}{\@@_draw_literal:n, \@@_draw_literal:x}
 %   The same as the more general literal call.
 %    \begin{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %
@@ -667,6 +667,13 @@
 %
 % \subsubsection{Variables and constants}
 %
+% \begin{variable}{\l_@@_internal_tl}
+%   Used as a short-term scratch variable.
+%    \begin{macrocode}
+\tl_new:N  \l_@@_internal_tl
+%    \end{macrocode}
+% \end{variable}
+%
 % \begin{variable}{\c_term_ior}
 %   Reading from the terminal (with a prompt) is done using a positive
 %   but non-existent stream number. Unlike writing, there is no concept
@@ -955,7 +962,6 @@
 % \begin{macro}{\@@_map_inline:NNn}
 % \begin{macro}{\@@_map_inline:NNNn}
 % \begin{macro}{\@@_map_inline_loop:NNN}
-% \begin{variable}{\l_@@_internal_tl}
 %   Mapping to an input stream can be done on either a token or a string
 %   basis, hence the set up. Within that, there is a check to avoid reading
 %   past the end of a file, hence the two applications of \cs{ior_if_eof:N}.
@@ -988,9 +994,7 @@
         \@@_map_inline_loop:NNN #1#2#3
       }
   }
-\tl_new:N  \l_@@_internal_tl
 %    \end{macrocode}
-% \end{variable}
 % \end{macro}
 % \end{macro}
 % \end{macro}
@@ -1865,6 +1869,13 @@
 %
 % \subsection{File operations}
 %
+% \begin{variable}{\l_@@_internal_tl}
+%   Used as a short-term scratch variable.
+%    \begin{macrocode}
+\tl_new:N \l_@@_internal_tl
+%    \end{macrocode}
+% \end{variable}
+%
 % \begin{variable}{\g_@@_internal_ior}
 %   A reserved stream to test for file existence.
 %    \begin{macrocode}
@@ -1952,13 +1963,6 @@
 %    \end{macrocode}
 % \end{variable}
 %
-% \begin{variable}{\l_@@_tmp_tl}
-%   Used as a short-term scratch variable.
-%    \begin{macrocode}
-\tl_new:N \l_@@_tmp_tl
-%    \end{macrocode}
-% \end{variable}
-%
 % \begin{variable}{\l_@@_base_name_str, \l_@@_full_name_str}
 %   For storing the basename and full path whilst passing data internally.
 %    \begin{macrocode}
@@ -2007,14 +2011,14 @@
     \group_begin:
       \seq_map_inline:Nn \l_char_active_seq
         {
-          \tl_set:Nx \l_@@_tmp_tl { \iow_char:N ##1 }
-          \char_set_active_eq:NN ##1 \l_@@_tmp_tl
+          \tl_set:Nx \l_@@_internal_tl { \iow_char:N ##1 }
+          \char_set_active_eq:NN ##1 \l_@@_internal_tl
         }
-      \tl_set:Nx \l_@@_tmp_tl {#1}
-      \tl_set:Nx \l_@@_tmp_tl
-        { \tl_to_str:N \l_@@_tmp_tl }
+      \tl_set:Nx \l_@@_internal_tl {#1}
+      \tl_set:Nx \l_@@_internal_tl
+        { \tl_to_str:N \l_@@_internal_tl }
     \exp_args:NNNV \group_end:
-    \str_set:Nn #2 \l_@@_tmp_tl
+    \str_set:Nn #2 \l_@@_internal_tl
   }
 \cs_new_protected:Npn \@@_name_quote:nN #1#2
   {
@@ -2174,8 +2178,8 @@
 %</package>
 \cs_new_protected:Npn \@@_input_pop:
   {
-    \seq_gpop:NN \g_@@_stack_seq \l_@@_tmp_tl
-    \exp_after:wN \@@_input_pop:nnn \l_@@_tmp_tl
+    \seq_gpop:NN \g_@@_stack_seq \l_@@_internal_tl
+    \exp_after:wN \@@_input_pop:nnn \l_@@_internal_tl
   }
 %<*package>
 \cs_new_eq:NN \__kernel_file_input_pop: \__file_input_pop:

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3final.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3final.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3final.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 % \maketitle
 %
 % \begin{documentation}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 % \maketitle
 %
 % \begin{documentation}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -47,7 +47,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %
@@ -550,7 +550,7 @@
 % \end{function}
 %
 % \begin{function}[added = 2012-06-04, updated = 2018-04-22]
-%   {\int_step_variable:nnn, \int_step_variable:nnnn, \int_step_variable:nnnnn}
+%   {\int_step_variable:nNn, \int_step_variable:nnNn, \int_step_variable:nnnNn}
 %   \begin{syntax}
 %     \cs{int_step_variable:nNn} \Arg{final value} \meta{tl~var} \Arg{code}
 %     \cs{int_step_variable:nnNn} \Arg{initial value} \Arg{final value} \meta{tl~var} \Arg{code}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %
@@ -238,9 +238,7 @@
 %   \end{syntax}
 %   Stores the \meta{code} for execution when \meta{key} is used.
 %   The \meta{code} can include one parameter (|#1|), which will be the
-%   \meta{value} given for the \meta{key}. The \texttt{x}-type variant
-%   expands \meta{code} at the point  where the \meta{key} is
-%   created.
+%   \meta{value} given for the \meta{key}.
 % \end{function}
 %
 % \begin{function}[updated = 2013-07-09]
@@ -2300,7 +2298,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\@@_execute:, \@@_execute_unknown:}
+% \begin{macro}{\@@_execute:, \@@_execute_inherit:, \@@_execute_unknown:}
 % \begin{macro}[EXP]{\@@_execute:nn}
 % \begin{macro}{\@@_store_unused:}
 %   Actually executing a key is done in two parts. First, look for the
@@ -2317,43 +2315,51 @@
         \cs:w \c_@@_code_root_tl \l_keys_path_tl \exp_after:wN \cs_end:
           \exp_after:wN { \l_keys_value_tl }
       }
-      { \@@_execute_unknown: }
-  }
-\cs_new_protected:Npn \@@_execute_unknown:
-  {
-    \bool_if:NTF \l_@@_only_known_bool
-      { \@@_store_unused: }
       {
-        \cs_if_exist:cTF
-          { \c_@@_inherit_root_tl \@@_parent:o \l_keys_path_tl }
+        \bool_if:NTF \l_@@_only_known_bool
+          { \@@_store_unused: }
           {
-            \clist_map_inline:cn
+            \cs_if_exist:cTF
               { \c_@@_inherit_root_tl \@@_parent:o \l_keys_path_tl }
-              {
-                \cs_if_exist:cT
-                  { \c_@@_code_root_tl ##1 / \l_keys_key_tl }
-                  {
-                    \cs:w \c_@@_code_root_tl ##1 / \l_keys_key_tl
-                      \exp_after:wN \cs_end: \exp_after:wN
-                      { \l_keys_value_tl }
-                    \clist_map_break:
-                  }
-              }
+              { \@@_execute_inherit: }
+              { \@@_execute_unknown: }
           }
+      }
+  }
+%    \end{macrocode}
+%   To deal with the case where there is no hit, we leave
+%   \cs{@@_execute_unknown:} in the input stream and clean it up using the
+%    break function: that avoids needing a boolean.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_execute_inherit:
+  {
+    \clist_map_inline:cn
+      { \c_@@_inherit_root_tl \@@_parent:o \l_keys_path_tl }
+      {
+        \cs_if_exist:cT
+          { \c_@@_code_root_tl ##1 / \l_keys_key_tl }
           {
-            \cs_if_exist:cTF
-              { \c_@@_code_root_tl \l_@@_module_tl / unknown }
-              {
-                \cs:w \c_@@_code_root_tl \l_@@_module_tl / unknown
-                  \exp_after:wN \cs_end: \exp_after:wN { \l_keys_value_tl }
-              }
-              {
-                \__kernel_msg_error:nnxx { kernel } { key-unknown }
-                  { \l_keys_path_tl } { \l_@@_module_tl }
-              }
+            \cs:w \c_@@_code_root_tl ##1 / \l_keys_key_tl
+              \exp_after:wN \cs_end: \exp_after:wN
+              { \l_keys_value_tl }
+            \clist_map_break:n { \use_none:n }
           }
-       }
+      }
+    \@@_execute_unknown: 
   }
+\cs_new_protected:Npn \@@_execute_unknown:
+  {
+    \cs_if_exist:cTF
+      { \c_@@_code_root_tl \l_@@_module_tl / unknown }
+      {
+        \cs:w \c_@@_code_root_tl \l_@@_module_tl / unknown
+          \exp_after:wN \cs_end: \exp_after:wN { \l_keys_value_tl }
+      }
+      {
+        \__kernel_msg_error:nnxx { kernel } { key-unknown }
+         { \l_keys_path_tl } { \l_@@_module_tl }
+      }
+  }
 \cs_new:Npn \@@_execute:nn #1#2
   {
     \cs_if_exist:cTF { \c_@@_code_root_tl #1 }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %
@@ -774,6 +774,10 @@
   \@@_primitive:NN \automatichyphenpenalty
     \tex_automatichyphenpenalty:D
   \@@_primitive:NN \begincsname           \tex_begincsname:D
+  \@@_primitive:NN \bodydir               \tex_bodydir:D
+  \@@_primitive:NN \bodydirection         \tex_bodydirection:D
+  \@@_primitive:NN \boxdir                \tex_boxdir:D
+  \@@_primitive:NN \boxdirection          \tex_boxdirection:D
   \@@_primitive:NN \breakafterdirmode     \tex_breakafterdirmode:D
   \@@_primitive:NN \catcodetable          \tex_catcodetable:D
   \@@_primitive:NN \clearmarks            \tex_clearmarks:D
@@ -782,6 +786,7 @@
     \tex_crampedscriptscriptstyle:D
   \@@_primitive:NN \crampedscriptstyle    \tex_crampedscriptstyle:D
   \@@_primitive:NN \crampedtextstyle      \tex_crampedtextstyle:D
+  \@@_primitive:NN \csstring              \tex_csstring:D
   \@@_primitive:NN \directlua             \tex_directlua:D
   \@@_primitive:NN \dviextension          \tex_dviextension:D
   \@@_primitive:NN \dvifeedback           \tex_dvifeedback:D
@@ -788,6 +793,7 @@
   \@@_primitive:NN \dvivariable           \tex_dvivariable:D
   \@@_primitive:NN \etoksapp              \tex_etoksapp:D
   \@@_primitive:NN \etokspre              \tex_etokspre:D
+  \@@_primitive:NN \exceptionpenalty      \tex_exceptionpenalty:D
   \@@_primitive:NN \explicithyphenpenalty \tex_explicithyphenpenalty:D
   \@@_primitive:NN \expanded              \tex_expanded:D
   \@@_primitive:NN \explicitdiscretionary \tex_explicitdiscretionary:D
@@ -800,16 +806,34 @@
   \@@_primitive:NN \hyphenationmin        \tex_hyphenationmin:D
   \@@_primitive:NN \hyphenpenaltymode     \tex_hyphenpenaltymode:D
   \@@_primitive:NN \gleaders              \tex_gleaders:D
+  \@@_primitive:NN \ifcondition           \tex_ifcondition:D
+  \@@_primitive:NN \immediateassigned     \tex_immediateassigned:D
+  \@@_primitive:NN \immediateassignment   \tex_immediateassignment:D
   \@@_primitive:NN \initcatcodetable      \tex_initcatcodetable:D
   \@@_primitive:NN \lastnamedcs           \tex_lastnamedcs:D
   \@@_primitive:NN \latelua               \tex_latelua:D
+  \@@_primitive:NN \lateluafunction       \tex_lateluafunction:D
+  \@@_primitive:NN \leftghost             \tex_leftghost:D
   \@@_primitive:NN \letcharcode           \tex_letcharcode:D
+  \@@_primitive:NN \linedir               \tex_linedir:D
+  \@@_primitive:NN \linedirection         \tex_linedirection:D
+  \@@_primitive:NN \localbrokenpenalty    \tex_localbrokenpenalty:D
+  \@@_primitive:NN \localinterlinepenalty \tex_localinterlinepenalty:D
+  \@@_primitive:NN \luabytecode           \tex_luabytecode:D
+  \@@_primitive:NN \luabytecodecall       \tex_luabytecodecall:D
+  \@@_primitive:NN \luacopyinputnodes     \tex_luacopyinputnodes:D
+  \@@_primitive:NN \luadef                \tex_luadef:D
+  \@@_primitive:NN \localleftbox          \tex_localleftbox:D
+  \@@_primitive:NN \localrightbox         \tex_localrightbox:D
   \@@_primitive:NN \luaescapestring       \tex_luaescapestring:D
   \@@_primitive:NN \luafunction           \tex_luafunction:D
+  \@@_primitive:NN \luafunctioncall       \tex_luafunctioncall:D
   \@@_primitive:NN \luatexbanner          \tex_luatexbanner:D
   \@@_primitive:NN \luatexrevision        \tex_luatexrevision:D
   \@@_primitive:NN \luatexversion         \tex_luatexversion:D
   \@@_primitive:NN \mathdelimitersmode    \tex_mathdelimitersmode:D
+  \@@_primitive:NN \mathdir               \tex_mathdir:D
+  \@@_primitive:NN \mathdirection         \tex_mathdirection:D
   \@@_primitive:NN \mathdisplayskipmode   \tex_mathdisplayskipmode:D
   \@@_primitive:NN \matheqnogapstep       \tex_matheqnogapstep:D
   \@@_primitive:NN \mathnolimitsmode      \tex_mathnolimitsmode:D
@@ -818,6 +842,7 @@
   \@@_primitive:NN \mathrulesfam          \tex_mathrulesfam:D
   \@@_primitive:NN \mathscriptsmode       \tex_mathscriptsmode:D
   \@@_primitive:NN \mathscriptboxmode     \tex_mathscriptboxmode:D
+  \@@_primitive:NN \mathscriptcharmode    \tex_mathscriptcharmode:D
   \@@_primitive:NN \mathstyle             \tex_mathstyle:D
   \@@_primitive:NN \mathsurroundmode      \tex_mathsurroundmode:D
   \@@_primitive:NN \mathsurroundskip      \tex_mathsurroundskip:D
@@ -828,9 +853,13 @@
   \@@_primitive:NN \novrule               \tex_novrule:D
   \@@_primitive:NN \outputbox             \tex_outputbox:D
   \@@_primitive:NN \pagebottomoffset      \tex_pagebottomoffset:D
+  \@@_primitive:NN \pagedir               \tex_pagedir:D
+  \@@_primitive:NN \pagedirection         \tex_pagedirection:D
   \@@_primitive:NN \pageleftoffset        \tex_pageleftoffset:D
   \@@_primitive:NN \pagerightoffset       \tex_pagerightoffset:D
   \@@_primitive:NN \pagetopoffset         \tex_pagetopoffset:D
+  \@@_primitive:NN \pardir                \tex_pardir:D
+  \@@_primitive:NN \pardirection          \tex_pardirection:D
   \@@_primitive:NN \pdfextension          \tex_pdfextension:D
   \@@_primitive:NN \pdffeedback           \tex_pdffeedback:D
   \@@_primitive:NN \pdfvariable           \tex_pdfvariable:D
@@ -841,6 +870,7 @@
   \@@_primitive:NN \preexhyphenchar       \tex_preexhyphenchar:D
   \@@_primitive:NN \prehyphenchar         \tex_prehyphenchar:D
   \@@_primitive:NN \prerelpenalty         \tex_prerelpenalty:D
+  \@@_primitive:NN \rightghost            \tex_rightghost:D
   \@@_primitive:NN \savecatcodetable      \tex_savecatcodetable:D
   \@@_primitive:NN \scantextokens         \tex_scantextokens:D
   \@@_primitive:NN \setfontid             \tex_setfontid:D
@@ -851,28 +881,13 @@
   \@@_primitive:NN \suppressoutererror    \tex_suppressoutererror:D
   \@@_primitive:NN \suppressprimitiveerror
     \tex_suppressprimitiveerror:D
+  \@@_primitive:NN \textdir               \tex_textdir:D
+  \@@_primitive:NN \textdirection         \tex_textdirection:D
   \@@_primitive:NN \toksapp               \tex_toksapp:D
   \@@_primitive:NN \tokspre               \tex_tokspre:D
   \@@_primitive:NN \tpack                 \tex_tpack:D
   \@@_primitive:NN \vpack                 \tex_vpack:D
 %    \end{macrocode}
-% These come from Omega/Aleph, but we do not support those engines and
-% so list them here.
-%    \begin{macrocode}
-  \@@_primitive:NN \bodydir               \tex_bodydir:D
-  \@@_primitive:NN \boxdir                \tex_boxdir:D
-  \@@_primitive:NN \leftghost             \tex_leftghost:D
-  \@@_primitive:NN \linedir               \tex_linedir:D
-  \@@_primitive:NN \localbrokenpenalty    \tex_localbrokenpenalty:D
-  \@@_primitive:NN \localinterlinepenalty \tex_localinterlinepenalty:D
-  \@@_primitive:NN \localleftbox          \tex_localleftbox:D
-  \@@_primitive:NN \localrightbox         \tex_localrightbox:D
-  \@@_primitive:NN \mathdir               \tex_mathdir:D
-  \@@_primitive:NN \pagedir               \tex_pagedir:D
-  \@@_primitive:NN \pardir                \tex_pardir:D
-  \@@_primitive:NN \rightghost            \tex_rightghost:D
-  \@@_primitive:NN \textdir               \tex_textdir:D
-%    \end{macrocode}
 % Primitives from \pdfTeX{} that \LuaTeX{} renames.
 %    \begin{macrocode}
   \@@_primitive:NN \adjustspacing         \tex_adjustspacing:D

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3oldmodules.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3oldmodules.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3oldmodules.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -42,7 +42,7 @@
 % }
 %
 %
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %
@@ -114,23 +114,23 @@
 %   |\_.*?\_| where |.| matches arbitrary characters and the
 %   lazy quantifier |*?| means to match as few characters as
 %   possible, thus avoiding matching underscores.
-% \item |[+-]?\d+| matches an explicit integer with at most one
+% \item |[\+\-]?\d+| matches an explicit integer with at most one
 %   sign.
-% \item \verb*"[+\-\ ]*\d+\ *" matches an explicit integer with any
+% \item \verb*"[\+\-\ ]*\d+\ *" matches an explicit integer with any
 %   number of $+$ and $-$ signs, with spaces allowed except within the
 %   mantissa, and surrounded by spaces.
-% \item \verb*"[+\-\ ]*(\d+|\d*\.\d+)\ *" matches an explicit integer or
+% \item \verb*"[\+\-\ ]*(\d+|\d*\.\d+)\ *" matches an explicit integer or
 %   decimal number; using \verb*"[.,]" instead of \verb*"\." would allow
 %   the comma as a decimal marker.
 % \item
-%   \verb*"[+\-\ ]*(\d+|\d*\.\d+)\ *((?i)pt|in|[cem]m|ex|[bs]p|[dn]d|[pcn]c)\ *"
+%   \verb*"[\+\-\ ]*(\d+|\d*\.\d+)\ *((?i)pt|in|[cem]m|ex|[bs]p|[dn]d|[pcn]c)\ *"
 %   \allowbreak matches an explicit dimension with any unit that \TeX{} knows, where
 %   \verb*"(?i)" means to treat lowercase and uppercase letters
 %   identically.
-% \item \verb*"[+\-\ ]*((?i)nan|inf|(\d+|\d*\.\d+)(\ *e[+-\ ]*\d+)?)\ *"
+% \item \verb*"[\+\-\ ]*((?i)nan|inf|(\d+|\d*\.\d+)(\ *e[\+\-\ ]*\d+)?)\ *"
 %   matches an explicit floating point number or the special values
 %   \verb*"nan" and \verb*"inf" (with signs and spaces allowed).
-% \item \verb*"[+\-\ ]*(\d+|\cC.)\ *" matches an explicit integer or
+% \item \verb*"[\+\-\ ]*(\d+|\cC.)\ *" matches an explicit integer or
 %   control sequence (without checking whether it is an integer
 %   variable).
 % \item |\G.*?\K| at the beginning of a regular expression matches and
@@ -141,7 +141,7 @@
 %   \cs{regex_extract_all:nnN}.
 % \end{itemize}
 % While it is impossible for a regular expression to match only integer
-% expressions, \verb*"[+\-\(]*\d+\)*([+\-*/][+\-\(]*\d+\)*)*" matches among
+% expressions, \verb*"[\+\-\(]*\d+\)*([\+\-*/][\+\-\(]*\d+\)*)*" matches among
 % other things all valid integer expressions (made only with explicit
 % integers).  One should follow it with further testing.
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -60,7 +60,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %
@@ -131,7 +131,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{l3keys2e}{2018-08-23}{}
+\ProvidesExplPackage{l3keys2e}{2018-09-24}{}
   {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	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -62,7 +62,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %
@@ -161,7 +161,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xfp}{2018-08-23}{}
+\ProvidesExplPackage{xfp}{2018-09-24}{}
   {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	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -63,7 +63,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %
@@ -533,7 +533,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xfrac}{2018-08-23}{}
+\ProvidesExplPackage{xfrac}{2018-09-24}{}
   {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	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -67,7 +67,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %
@@ -818,7 +818,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xparse}{2018-08-23}{}
+\ProvidesExplPackage{xparse}{2018-09-24}{}
   {L3 Experimental document command parser}
 %    \end{macrocode}
 %
@@ -953,6 +953,13 @@
 %    \end{macrocode}
 % \end{variable}
 %
+% \begin{variable}{\l_@@_obey_spaces_bool}
+%   For trailing optionals.
+%    \begin{macrocode}
+\bool_new:N \l_@@_obey_spaces_bool
+%    \end{macrocode}
+% \end{variable}
+%
 % \begin{variable}{\l_@@_last_delimiters_tl}
 %   Holds the delimiters (first tokens) of all optional arguments since
 %   the previous mandatory argument, to warn about cases where it would
@@ -971,13 +978,6 @@
 %    \end{macrocode}
 % \end{variable}
 %
-% \begin{variable}{\l_@@_ignore_spaces_bool}
-%   For trailing optionals.
-%    \begin{macrocode}
-\bool_new:N \l_@@_ignore_spaces_bool
-%    \end{macrocode}
-% \end{variable}
-%
 % \begin{variable}{\l_@@_m_args_int}
 %   The number of \texttt{m} arguments: if this is the same as the total
 %   number of arguments, then a short-cut can be taken in the creation of
@@ -1028,15 +1028,20 @@
 %    \end{macrocode}
 % \end{variable}
 %
-% \begin{variable}{\l_@@_some_long_bool, \l_@@_some_short_bool}
-%   Both of these flags are set while normalizing the argument
-%   specification.  To grab arguments expandably, all short arguments
-%   must appear before long arguments, so as soon as the first long
-%   argument is seen (other than \texttt{t}-type, whose long status is
-%   ignored) the \texttt{some_long} flag is set.  The
-%   \texttt{some_short} flag is used for expandable commands, to know
-%   whether to define a short auxiliary too.
+% \begin{variable}
+%   {\l_@@_some_obey_spaces_bool, \l_@@_some_long_bool, \l_@@_some_short_bool}
+%   These flags are set while normalizing the argument specification.
+%   The \texttt{obey_spaces} one is used to detect when |!| is used on
+%   an argument that is not a trailing optional argument.
+%   The other two are used to check whether all short arguments appear
+%   before long arguments: this is needed to grab arguments expandably.
+%   As soon as the first long argument is seen (other than
+%   \texttt{t}-type, whose long status is ignored) the
+%   \texttt{some_long} flag is set.  The \texttt{some_short} flag is
+%   used for expandable commands, to know whether to define a short
+%   auxiliary too.
 %    \begin{macrocode}
+\bool_new:N \l_@@_some_obey_spaces_bool
 \bool_new:N \l_@@_some_long_bool
 \bool_new:N \l_@@_some_short_bool
 %    \end{macrocode}
@@ -1521,50 +1526,49 @@
 % specification is valid before the main parsing run.  If it is not
 % valid the entire set up is abandoned to avoid any strange internal
 % errors.  A function is provided for each argument type that will grab
-% any extra arguments and call the loop function.
+% any extra data items and call the loop function after performing the
+% following checks and tasks.
+% \begin{itemize}
+%   \item Check that each argument has the correct number of data items
+%     associated with it, and that where a single character is required,
+%     one has actually been supplied.
+%   \item Check that processors and the markers~|+| and~|!| are followed
+%     by an argument for which they make sense, and are not redundant.
+%   \item Check the absence of forbidden types for expandable commands,
+%     namely \texttt{G}/\texttt{v} always, and \texttt{l}/\texttt{u}
+%     after optional arguments (\pkg{xparse} may have inserted braces
+%     due to a failed search for an optional argument).
+%   \item Check that no optional argument is followed by a mandatory
+%     argument with the same delimiter, as otherwise the optional
+%     argument could never be omitted.
+%   \item Keep track in \cs{l_@@_some_long_bool} and
+%     \cs{l_@@_some_short_bool} of whether the command has some
+%     long/short arguments.
+%   \item Keep track in \cs{l_@@_grab_expandably_bool} of whether all
+%     arguments are \texttt{m}/\texttt{l}/\texttt{u} type and short
+%     arguments appear before long ones, in which case they can be
+%     grabbed expandably just as safely as they could be grabbed
+%     nonexpandably.  Regardless of that, arguments of expandable
+%     commands will be grabbed expandably and arguments of environments
+%     will not (because the list of arguments built by non-expandable
+%     grabbing is used to pass them to the end-environment code).
+%   \item Count mandatory arguments, used later to detect which optional
+%     arguments are trailing.
+% \end{itemize}
+% Further checks happen at the end of the loop:
+% \begin{itemize}
+% \item that there are at most $9$ arguments;
+% \item that an expandable command does not end with an optional
+%   argument (this case is detected by using the fact that
+%   \cs{l_@@_last_delimiters_tl} is cleared by every mandatory argument
+%   and filled by every optional argument).
+% \end{itemize}
 %
-% 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
-% character is required, one has actually been supplied.
-%
-% The second is that processors and the marker~|+| for long arguments
-% must be followed by arguments.
-%
-% The third is to check for forbidden types for expandable commands,
-% namely \texttt{G}/\texttt{v} always, and \texttt{l}/\texttt{u} after
-% optional arguments (\pkg{xparse} may have inserted braces due to a
-% failed search for an optional argument).
-%
-% The fourth is that an optional argument should not be followed by a
-% mandatory argument with the same delimiter, as otherwise the optional
-% argument could never be omitted.
-%
-% The fifth is to keep track in \cs{l_@@_some_long_bool} and
-% \cs{l_@@_some_short_bool} of whether the command has some long/short
-% arguments.
-%
-% The sixth is to keep track in \cs{l_@@_grab_expandably_bool} of
-% whether all arguments are \texttt{m}/\texttt{l}/\texttt{u} type and
-% short arguments appear before long ones, in which case they can be
-% grabbed expandably just as safely as they could be grabbed expandably.
-% Regardless of that, arguments of expandable commands will be grabbed
-% expandably and arguments of environments will not (because the list of
-% arguments built by non-expandable grabbing is used to pass them to the
-% end-environment code).
-%
-% The last is to count mandatory arguments, used later to detect which
-% optional arguments are trailing.
-%
 % \begin{macro}{\@@_normalize_arg_spec:n}
 % \begin{macro}{\@@_normalize_arg_spec_loop:n}
 %   Loop through the argument specification, calling an auxiliary
 %   specific to each argument type.  If any argument is unknown stop the
-%   definition.  After the loop, if there are more than
-%   $9$ arguments, stop.  Additionally, expandable commands may not end
-%   with an optional argument; this case is detected by using the fact
-%   that \cs{l_@@_last_delimiters_tl} is cleared by every mandatory
-%   argument and filled by every optional argument.
+%   definition.
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_normalize_arg_spec:n #1
   {
@@ -1573,10 +1577,11 @@
     \tl_clear:N \l_@@_last_delimiters_tl
     \tl_clear:N \l_@@_arg_spec_tl
     \bool_set_true:N \l_@@_grab_expandably_bool
+    \bool_set_false:N \l_@@_obey_spaces_bool
     \bool_set_false:N \l_@@_long_bool
+    \bool_set_false:N \l_@@_some_obey_spaces_bool
     \bool_set_false:N \l_@@_some_long_bool
     \bool_set_false:N \l_@@_some_short_bool
-    \bool_set_false:N \l_@@_ignore_spaces_bool
     \@@_normalize_arg_spec_loop:n #1
       \q_recursion_tail \q_recursion_tail \q_recursion_tail \q_recursion_stop
     \int_compare:nNnT \l_@@_current_arg_int > 9
@@ -1691,7 +1696,12 @@
 \cs_new_protected:cpn { @@_normalize_type_+:w } #1
   {
     \quark_if_recursion_tail_stop_do:nn {#1} { \@@_bad_arg_spec:wn }
-    \tl_put_right:Nn \l_@@_arg_spec_tl { + }
+    \bool_if:NT \l_@@_long_bool
+      {
+        \__kernel_msg_error:nnxx { xparse } { two-markers }
+          { \iow_char:N \\ \l_@@_function_tl } { + }
+        \@@_bad_def:wn
+      }
     \bool_set_true:N \l_@@_long_bool
     \int_decr:N \l_@@_current_arg_int
     \@@_normalize_arg_spec_loop:n {#1}
@@ -1699,7 +1709,14 @@
 \cs_new_protected:cpn { @@_normalize_type_!:w } #1
   {
     \quark_if_recursion_tail_stop_do:nn {#1} { \@@_bad_arg_spec:wn }
-    \tl_put_right:Nn \l_@@_arg_spec_tl { ! }
+    \bool_if:NT \l_@@_obey_spaces_bool
+      {
+        \__kernel_msg_error:nnxx { xparse } { two-markers }
+          { \iow_char:N \\ \l_@@_function_tl } { ! }
+        \@@_bad_def:wn
+      }
+    \bool_set_true:N \l_@@_obey_spaces_bool
+    \bool_set_true:N \l_@@_some_obey_spaces_bool
     \int_decr:N \l_@@_current_arg_int
     \@@_normalize_arg_spec_loop:n {#1}
   }
@@ -1770,9 +1787,14 @@
   {
     \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:Nx \l_@@_arg_spec_tl
+      {
+        \bool_if:NT \l_@@_obey_spaces_bool { ! }
+        t \exp_not:n {#1}
+      }
     \tl_put_right:Nn \l_@@_last_delimiters_tl {#1}
     \bool_set_false:N \l_@@_grab_expandably_bool
+    \bool_set_false:N \l_@@_obey_spaces_bool
     \bool_set_false:N \l_@@_long_bool
     \@@_normalize_arg_spec_loop:n
   }
@@ -1800,17 +1822,13 @@
 \cs_new_protected:Npn \@@_normalize_type_l:w
   {
     \@@_normalize_check_lu:N l
-    \@@_add_arg_spec:n { l }
-    \int_incr:N \l_@@_mandatory_args_int
-    \tl_clear:N \l_@@_last_delimiters_tl
+    \@@_add_arg_spec_mandatory:n { l }
     \@@_normalize_arg_spec_loop:n
   }
 \cs_new_protected:Npn \@@_normalize_type_m:w
   {
     \@@_delimiter_check:nnn { } { m } { \iow_char:N \{ }
-    \@@_add_arg_spec:n { m }
-    \int_incr:N \l_@@_mandatory_args_int
-    \tl_clear:N \l_@@_last_delimiters_tl
+    \@@_add_arg_spec_mandatory:n { m }
     \@@_normalize_arg_spec_loop:n
   }
 \cs_new_protected:Npn \@@_normalize_type_R:w #1#2#3
@@ -1819,10 +1837,8 @@
     \@@_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
-    \tl_clear:N \l_@@_last_delimiters_tl
     \bool_set_false:N \l_@@_grab_expandably_bool
+    \@@_add_arg_spec_mandatory:n { R #1 #2 {#3} }
     \@@_normalize_arg_spec_loop:n
   }
 \cs_new_protected:Npn \@@_normalize_type_u:w #1
@@ -1829,17 +1845,13 @@
   {
     \quark_if_recursion_tail_stop_do:nn {#1} { \@@_bad_arg_spec:wn }
     \@@_normalize_check_lu:N u
-    \@@_add_arg_spec:n { u {#1} }
-    \int_incr:N \l_@@_mandatory_args_int
-    \tl_clear:N \l_@@_last_delimiters_tl
+    \@@_add_arg_spec_mandatory:n { u {#1} }
     \@@_normalize_arg_spec_loop:n
   }
 \cs_new_protected:Npn \@@_normalize_type_v:w
   {
     \@@_normalize_check_gv:N v
-    \@@_add_arg_spec:n { v }
-    \int_incr:N \l_@@_mandatory_args_int
-    \tl_clear:N \l_@@_last_delimiters_tl
+    \@@_add_arg_spec_mandatory:n { v }
     \@@_normalize_arg_spec_loop:n
   }
 %    \end{macrocode}
@@ -1936,13 +1948,16 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\@@_add_arg_spec:n}
+% \begin{macro}{\@@_add_arg_spec:n, \@@_add_arg_spec_mandatory:n}
 %   When adding an argument to the argument specification, set the
 %   \texttt{some_long} or \texttt{some_short} booleans as appropriate
-%   and clear the boolean keeping track of whether the argument is long.
+%   and clear the booleans keeping track of |+| and |!| markers.
 %   Before that, test for a short argument following some long
 %   arguments: this is forbidden for expandable commands and prevents
 %   grabbing arguments expandably.
+%
+%   For mandatory arguments do some more work, in particular complain if
+%   they were preceeded by~|!|.
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_add_arg_spec:n #1
   {
@@ -1961,9 +1976,27 @@
     \bool_if:NTF \l_@@_long_bool
       { \bool_set_true:N \l_@@_some_long_bool }
       { \bool_set_true:N \l_@@_some_short_bool }
+    \tl_put_right:Nx \l_@@_arg_spec_tl
+      {
+        \bool_if:NT \l_@@_long_bool { + }
+        \bool_if:NT \l_@@_obey_spaces_bool { ! }
+        \exp_not:n {#1}
+      }
     \bool_set_false:N \l_@@_long_bool
-    \tl_put_right:Nn \l_@@_arg_spec_tl {#1}
+    \bool_set_false:N \l_@@_obey_spaces_bool
   }
+\cs_new_protected:Npn \@@_add_arg_spec_mandatory:n #1
+  {
+    \bool_if:NT \l_@@_some_obey_spaces_bool
+      {
+        \__kernel_msg_error:nnxx { xparse } { non-trailing-obey-spaces }
+          { \iow_char:N \\ \l_@@_function_tl } { \tl_to_str:n {#1} }
+        \@@_bad_def:wn
+      }
+    \int_incr:N \l_@@_mandatory_args_int
+    \tl_clear:N \l_@@_last_delimiters_tl
+    \@@_add_arg_spec:n {#1}
+  }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -1972,8 +2005,8 @@
 % \begin{macro}{\@@_prepare_signature:n}
 % \begin{macro}{\@@_prepare_signature:N}
 % \begin{macro}{\@@_prepare_signature_bypass:N}
-%   Actually creating the signature uses the same loop approach as counting
-%   up mandatory arguments. There are first a number of variables which need
+%   Actually creating the signature uses the same loop approach as
+%   normalizing the signature. There are first a number of variables which need
 %   to be set to track what is going on. Many of these variables are unused
 %   when defining expandable commands.
 %    \begin{macrocode}
@@ -1981,7 +2014,7 @@
   {
     \int_zero:N \l_@@_current_arg_int
     \bool_set_false:N \l_@@_long_bool
-    \bool_set_false:N \l_@@_ignore_spaces_bool
+    \bool_set_false:N \l_@@_obey_spaces_bool
     \int_zero:N \l_@@_m_args_int
     \bool_set_false:N \l_@@_defaults_bool
     \tl_clear:N \l_@@_defaults_tl
@@ -2056,7 +2089,7 @@
 \cs_new_protected:cpn { @@_add_type_!:w }
   {
     \@@_flush_m_args:
-    \bool_set_true:N \l_@@_ignore_spaces_bool
+    \bool_set_true:N \l_@@_obey_spaces_bool
     \bool_set_true:N \l_@@_prefixed_bool
     \@@_prepare_signature_bypass:N
   }
@@ -2239,24 +2272,16 @@
 %
 % \begin{macro}{\@@_add_grabber_mandatory:N}
 % \begin{macro}{\@@_add_grabber_optional:N}
-%   To keep the various checks needed in one place, adding the grabber to
-%   the signature is done here. For mandatory arguments, the only question
-%   is whether to add a long grabber. For optional arguments, there is
-%   also a check to see if any mandatory arguments are still to be added.
-%   This is used to determine whether to skip spaces or not when
-%   searching for the argument.
+%   To keep the various checks needed in one place, adding the grabber
+%   to the signature is done here.  The only questions are whether the
+%   grabber should be long or not, and whether to obey spaces.  The
+%   \cs{l_@@_obey_spaces_bool} boolean can only be \texttt{true} for
+%   trailing optional arguments.  In that case spaces will not be
+%   ignored when looking for that optional argument.
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_add_grabber_mandatory:N #1
   {
-    \tl_put_right:Nx \l_@@_signature_tl
-      {
-        \exp_not:c
-          { @@_grab_ #1 \bool_if:NT \l_@@_long_bool { _long } :w }
-      }
-    \bool_set_false:N \l_@@_long_bool
-    \tl_put_right:Nx \l_@@_process_all_tl
-      { { \exp_not:o \l_@@_process_one_tl } }
-    \tl_clear:N \l_@@_process_one_tl
+    \@@_add_grabber_optional:N #1
     \int_decr:N \l_@@_mandatory_args_int
   }
 \cs_new_protected:Npn \@@_add_grabber_optional:N #1
@@ -2267,15 +2292,12 @@
           {
             @@_grab_ #1
             \bool_if:NT \l_@@_long_bool { _long }
-            \bool_lazy_and:nnT
-              { \l_@@_ignore_spaces_bool }
-              { \int_compare_p:nNn \l_@@_mandatory_args_int = 0 }
-              { _ignore_spaces }
+            \bool_if:NT \l_@@_obey_spaces_bool { _obey_spaces }
             :w
           }
       }
     \bool_set_false:N \l_@@_long_bool
-    \bool_set_false:N \l_@@_ignore_spaces_bool
+    \bool_set_false:N \l_@@_obey_spaces_bool
     \tl_put_right:Nx \l_@@_process_all_tl
       { { \exp_not:o \l_@@_process_one_tl } }
     \tl_clear:N \l_@@_process_one_tl
@@ -2573,8 +2595,8 @@
 %
 % \begin{macro}{\@@_grab_D:w}
 % \begin{macro}{\@@_grab_D_long:w}
-% \begin{macro}{\@@_grab_D_ignore_spaces:w}
-% \begin{macro}{\@@_grab_D_long_ignore_spaces:w}
+% \begin{macro}{\@@_grab_D_obey_spaces:w}
+% \begin{macro}{\@@_grab_D_long_obey_spaces:w}
 %   The generic delimited argument grabber. The auxiliary function does
 %   a peek test before calling \cs{@@_grab_D_call:Nw}, so that the
 %   optional nature of the argument works as expected.
@@ -2581,20 +2603,26 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_grab_D:w #1#2#3 \@@_run_code:
   {
-    \@@_grab_D_aux:NNnNn #1 #2 {#3} \cs_set_protected_nopar:Npn
-      { _ignore_spaces }
+    \@@_grab_D_aux:NNnNN #1 #2 {#3} \cs_set_protected_nopar:Npn
+      \@@_peek_nonspace_remove:NTF
   }
 \cs_new_protected:Npn \@@_grab_D_long:w #1#2#3 \@@_run_code:
   {
-    \@@_grab_D_aux:NNnNn #1 #2 {#3} \cs_set_protected:Npn
-      { _ignore_spaces }
+    \@@_grab_D_aux:NNnNN #1 #2 {#3} \cs_set_protected:Npn
+      \@@_peek_nonspace_remove:NTF
   }
-\cs_new_protected:Npn \@@_grab_D_ignore_spaces:w #1#2#3 \@@_run_code:
-  { \@@_grab_D_aux:NNnNn #1 #2 {#3} \cs_set_protected_nopar:Npn { } }
-\cs_new_protected:Npn \@@_grab_D_long_ignore_spaces:w #1#2#3 \@@_run_code:
-  { \@@_grab_D_aux:NNnNn #1 #2 {#3} \cs_set_protected:Npn { } }
+\cs_new_protected:Npn \@@_grab_D_obey_spaces:w #1#2#3 \@@_run_code:
+  {
+    \@@_grab_D_aux:NNnNN #1 #2 {#3} \cs_set_protected_nopar:Npn
+      \peek_meaning_remove:NTF
+  }
+\cs_new_protected:Npn \@@_grab_D_long_obey_spaces:w #1#2#3 \@@_run_code:
+  {
+    \@@_grab_D_aux:NNnNN #1 #2 {#3} \cs_set_protected:Npn
+      \peek_meaning_remove:NTF
+  }
 %    \end{macrocode}
-% \begin{macro}{\@@_grab_D_aux:NNnNn}
+% \begin{macro}{\@@_grab_D_aux:NNnNN}
 % \begin{macro}{\@@_grab_D_aux:NNnN}
 %   This is a bit complicated. The idea is that, in order to check for
 %   nested optional argument tokens (\texttt{[[...]]} and so on) the
@@ -2604,10 +2632,10 @@
 %   prevents loss of braces, and there is then a test to see if there are
 %   nested delimiters to handle.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_grab_D_aux:NNnNn #1#2#3#4#5
+\cs_new_protected:Npn \@@_grab_D_aux:NNnNN #1#2#3#4#5
   {
     \@@_grab_D_aux:NNnN #1#2 {#3} #4
-    \use:c { peek_meaning_remove #5 :NTF } #1
+    #5 #1
       { \@@_grab_D_call:Nw #1 }
       { \@@_add_arg:o \c_novalue_tl }
   }
@@ -2743,36 +2771,36 @@
 % \begin{macro}
 %   {
 %     \@@_grab_E:w, \@@_grab_E_long:w,
-%     \@@_grab_E_ignore_spaces:w, \@@_grab_E_long_ignore_spaces:w
+%     \@@_grab_E_obey_spaces:w, \@@_grab_E_long_obey_spaces:w
 %   }
-% \begin{macro}{\@@_grab_E:nnNn}
-% \begin{macro}{\@@_grab_E_loop:nnN}
+% \begin{macro}{\@@_grab_E:nnNN}
+% \begin{macro}{\@@_grab_E_loop:NnN}
 % \begin{macro}{\@@_grab_E_finalise:}
 %   Everything here needs to point to a loop.
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_grab_E:w #1#2 \@@_run_code:
   {
-    \@@_grab_E:nnNn {#1} {#2}
+    \@@_grab_E:nnNN {#1} {#2}
       \cs_set_protected_nopar:Npn
-      { _ignore_spaces }
+      \@@_peek_nonspace_remove:NTF
   }
 \cs_new_protected:Npn \@@_grab_E_long:w #1#2 \@@_run_code:
   {
-    \@@_grab_E:nnNn {#1} {#2}
+    \@@_grab_E:nnNN {#1} {#2}
       \cs_set_protected:Npn
-      { _ignore_spaces }
+      \@@_peek_nonspace_remove:NTF
   }
-\cs_new_protected:Npn \@@_grab_E_ignore_spaces:w #1#2 \@@_run_code:
+\cs_new_protected:Npn \@@_grab_E_obey_spaces:w #1#2 \@@_run_code:
   {
-    \@@_grab_E:nnNn {#1} {#2}
+    \@@_grab_E:nnNN {#1} {#2}
       \cs_set_protected_nopar:Npn
-      { }
+      \peek_meaning_remove:NTF
   }
-\cs_new_protected:Npn \@@_grab_E_long_ignore_spaces:w #1#2 \@@_run_code:
+\cs_new_protected:Npn \@@_grab_E_long_obey_spaces:w #1#2 \@@_run_code:
   {
-    \@@_grab_E:nnNn {#1} {#2}
+    \@@_grab_E:nnNN {#1} {#2}
       \cs_set_protected:Npn
-      { }
+      \peek_meaning_remove:NTF
   }
 %    \end{macrocode}
 %   A loop is needed here to allow a random ordering of keys. These are
@@ -2780,12 +2808,12 @@
 %   they can appear later. The grabbed values are held in a property list
 %   which is then turned into an ordered list to be passed back to the user.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_grab_E:nnNn #1#2#3#4
+\cs_new_protected:Npn \@@_grab_E:nnNN #1#2#3#4
   {
     \exp_after:wN #3 \l_@@_fn_tl ##1##2##3
       {
         \prop_put:Nnn \l_@@_tmp_prop {##1} {##3}
-        \@@_grab_E_loop:nnN {#4} { } ##2 \q_recursion_stop
+        \@@_grab_E_loop:NnN #4 { } ##2 \q_recursion_stop
       }
     \prop_clear:N \l_@@_tmp_prop
     \tl_set:Nn \l_@@_signature_tl {#2}
@@ -2800,16 +2828,16 @@
           }
         \l_@@_signature_tl \@@_run_code:
       }
-    \@@_grab_E_loop:nnN {#4} { } #1 \q_recursion_tail \q_recursion_stop
+    \@@_grab_E_loop:NnN #4 { } #1 \q_recursion_tail \q_recursion_stop
   }
-\cs_new_protected:Npn \@@_grab_E_loop:nnN #1#2#3#4 \q_recursion_stop
+\cs_new_protected:Npn \@@_grab_E_loop:NnN #1#2#3#4 \q_recursion_stop
   {
     \cs_if_eq:NNTF #3 \q_recursion_tail
       { \@@_grab_E_finalise: }
       {
-        \use:c { peek_meaning_remove #1 :NTF } #3
+        #1 #3
           { \l_@@_fn_tl #3 {#2#4} }
-          { \@@_grab_E_loop:nnN {#1} {#2#3} #4 \q_recursion_stop }
+          { \@@_grab_E_loop:NnN #1 {#2#3} #4 \q_recursion_stop }
       }
   }
 \cs_new_protected:Npn \@@_grab_E_finalise: { }
@@ -2821,31 +2849,38 @@
 %
 % \begin{macro}{\@@_grab_G:w}
 % \begin{macro}{\@@_grab_G_long:w}
-% \begin{macro}{\@@_grab_G_ignore_spaces:w}
-% \begin{macro}{\@@_grab_G_long_ignore_spaces:w}
-% \begin{macro}{\@@_grab_G_aux:nNn}
+% \begin{macro}{\@@_grab_G_obey_spaces:w}
+% \begin{macro}{\@@_grab_G_long_obey_spaces:w}
+% \begin{macro}{\@@_grab_G_aux:nNN}
 %   Optional groups are checked by meaning, so that the same code will
 %   work with, for example, \ConTeXt{}-like input.
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_grab_G:w #1 \@@_run_code:
   {
-    \@@_grab_G_aux:nNn {#1} \cs_set_protected_nopar:Npn
-      { _ignore_spaces }
+    \@@_grab_G_aux:nNN {#1} \cs_set_protected_nopar:Npn
+      \@@_peek_nonspace:NTF
   }
 \cs_new_protected:Npn \@@_grab_G_long:w #1 \@@_run_code:
   {
-    \@@_grab_G_aux:nNn {#1} \cs_set_protected:Npn { _ignore_spaces }
+    \@@_grab_G_aux:nNN {#1} \cs_set_protected:Npn
+      \@@_peek_nonspace:NTF
   }
-\cs_new_protected:Npn \@@_grab_G_ignore_spaces:w #1 \@@_run_code:
-  { \@@_grab_G_aux:nNn {#1} \cs_set_protected_nopar:Npn { } }
-\cs_new_protected:Npn \@@_grab_G_long_ignore_spaces:w #1 \@@_run_code:
-  { \@@_grab_G_aux:nNn {#1} \cs_set_protected:Npn { } }
-\cs_new_protected:Npn \@@_grab_G_aux:nNn #1#2#3
+\cs_new_protected:Npn \@@_grab_G_obey_spaces:w #1 \@@_run_code:
   {
+    \@@_grab_G_aux:nNN {#1} \cs_set_protected_nopar:Npn
+      \peek_meaning:NTF
+  }
+\cs_new_protected:Npn \@@_grab_G_long_obey_spaces:w #1 \@@_run_code:
+  {
+    \@@_grab_G_aux:nNN {#1} \cs_set_protected:Npn
+      \peek_meaning:NTF
+  }
+\cs_new_protected:Npn \@@_grab_G_aux:nNN #1#2#3
+  {
     \tl_set:Nn \l_@@_signature_tl {#1}
     \exp_after:wN #2 \l_@@_fn_tl ##1
       { \@@_add_arg:n {##1} }
-    \use:c { peek_meaning #3 :NTF } \c_group_begin_token
+    #3 \c_group_begin_token
       { \l_@@_fn_tl }
       { \@@_add_arg:o \c_novalue_tl }
   }
@@ -2998,7 +3033,7 @@
 \cs_new_protected:Npn \@@_grab_R_aux:NNnN #1#2#3#4
   {
     \@@_grab_D_aux:NNnN #1 #2 {#3} #4
-    \peek_meaning_remove_ignore_spaces:NTF #1
+    \@@_peek_nonspace_remove:NTF #1
       { \@@_grab_D_call:Nw #1 }
       {
         \__kernel_msg_error:nnxx { xparse } { missing-required }
@@ -3012,19 +3047,15 @@
 % \end{macro}
 %
 % \begin{macro}{\@@_grab_t:w}
-% \begin{macro}{\@@_grab_t_long:w}
-% \begin{macro}{\@@_grab_t_ignore_spaces:w}
-% \begin{macro}{\@@_grab_t_long_ignore_spaces:w}
+% \begin{macro}{\@@_grab_t_obey_spaces:w}
 % \begin{macro}{\@@_grab_t_aux:NNw}
 %   Dealing with a token is quite easy. Check the match, remove the
 %   token if needed and add a flag to the output.
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_grab_t:w
-  { \@@_grab_t_aux:NNw \peek_meaning_remove_ignore_spaces:NTF }
-\cs_new_eq:NN \@@_grab_t_long:w \@@_grab_t:w
-\cs_new_protected:Npn \@@_grab_t_ignore_spaces:w
+  { \@@_grab_t_aux:NNw \@@_peek_nonspace_remove:NTF }
+\cs_new_protected:Npn \@@_grab_t_obey_spaces:w
   { \@@_grab_t_aux:NNw \peek_meaning_remove:NTF }
-\cs_new_eq:NN \@@_grab_t_long_ignore_spaces:w \@@_grab_t_ignore_spaces:w
 \cs_new_protected:Npn \@@_grab_t_aux:NNw #1#2#3 \@@_run_code:
   {
     \tl_set:Nn \l_@@_signature_tl {#3}
@@ -3040,8 +3071,6 @@
 % \end{macro}
 % \end{macro}
 % \end{macro}
-% \end{macro}
-% \end{macro}
 %
 % \begin{macro}{\@@_grab_u:w}
 % \begin{macro}{\@@_grab_u_long:w}
@@ -4066,6 +4095,23 @@
 % \end{macro}
 % \end{macro}
 %
+% \begin{macro}{\@@_peek_nonspace:NTF, \@@_peek_nonspace_remove:NTF, \@@_peek_nonspace_aux:nNNTF}
+%   Collect spaces in a loop, and put the collected spaces back in the
+%   false branch of a call to \cs{peek_meaning:NTF} or
+%   \cs{peek_meaning_remove:NTF}.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_peek_nonspace:NTF
+  { \@@_peek_nonspace_aux:nNNTF { } \peek_meaning:NTF }
+\cs_new_protected:Npn \@@_peek_nonspace_remove:NTF
+  { \@@_peek_nonspace_aux:nNNTF { } \peek_meaning_remove:NTF }
+\cs_new_protected:Npn \@@_peek_nonspace_aux:nNNTF #1#2#3#4#5
+  {
+    \peek_meaning_remove:NTF \c_space_token
+      { \@@_peek_nonspace_aux:nNNTF { #1 ~ } #2 #3 {#4} {#5} }
+      { #2 #3 { #4 } { #5 #1 } }
+  }
+% \end{macro}
+%
 % \subsection{Messages}
 %
 % Some messages intended as errors.
@@ -4158,6 +4204,13 @@
     The~current~command~'#1'~expects~an~argument~starting~with~'#2'.~
     LaTeX~did~not~find~it,~and~will~insert~a~default~value~to~be~processed.
   }
+\__kernel_msg_new:nnnn { xparse } { non-trailing-obey-spaces }
+  { Prefix~'!'~used~before~mandatory~argument~'#2'~of~command~'#1'. }
+  {
+    The~prefix~'!'~can~only~apply~to~trailing~optional~arguments.
+    \\ \\
+    LaTeX~will~ignore~this~entire~definition.
+  }
 \__kernel_msg_new:nnnn { xparse } { non-xparse-command }
   { Command~'#1'~not~defined~using~xparse. }
   {
@@ -4219,6 +4272,12 @@
     This~cannot~be~implemented. \\ \\
     LaTeX~will~ignore~this~entire~definition.
   }
+\__kernel_msg_new:nnnn { xparse } { two-markers }
+  { Two~'#2'~apply~to~the~same~argument~in~argument~specification~of~command~'#1'. }
+  {
+    The~argument~specification~provided~has~two~markers~'#2'~applying~
+    to~the~same~argument;~these~are~redundant.
+  }
 \__kernel_msg_new:nnnn { xparse } { unknown-argument-type }
   { Unknown~argument~type~'#2'~for~the~command~'#1'. }
   {

Modified: trunk/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx	2018-09-24 20:23:18 UTC (rev 48749)
@@ -63,7 +63,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-08-23}
+% \date{Released 2018-09-24}
 %
 % \maketitle
 %
@@ -682,7 +682,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xtemplate}{2018-08-23}{}
+\ProvidesExplPackage{xtemplate}{2018-09-24}{}
   {L3 Experimental prototype document functions}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex	2018-09-24 20:23:18 UTC (rev 48749)
@@ -63,7 +63,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx Copyright (C) 1990-2018 The LaTeX3 Project
-\def\ExplFileDate{2018-08-23}%
+\def\ExplFileDate{2018-09-24}%
 \begingroup
   \def\next{\endgroup}%
   \expandafter\ifx\csname PackageError\endcsname\relax
@@ -961,6 +961,10 @@
   \__kernel_primitive:NN \automatichyphenpenalty
     \tex_automatichyphenpenalty:D
   \__kernel_primitive:NN \begincsname           \tex_begincsname:D
+  \__kernel_primitive:NN \bodydir               \tex_bodydir:D
+  \__kernel_primitive:NN \bodydirection         \tex_bodydirection:D
+  \__kernel_primitive:NN \boxdir                \tex_boxdir:D
+  \__kernel_primitive:NN \boxdirection          \tex_boxdirection:D
   \__kernel_primitive:NN \breakafterdirmode     \tex_breakafterdirmode:D
   \__kernel_primitive:NN \catcodetable          \tex_catcodetable:D
   \__kernel_primitive:NN \clearmarks            \tex_clearmarks:D
@@ -969,6 +973,7 @@
     \tex_crampedscriptscriptstyle:D
   \__kernel_primitive:NN \crampedscriptstyle    \tex_crampedscriptstyle:D
   \__kernel_primitive:NN \crampedtextstyle      \tex_crampedtextstyle:D
+  \__kernel_primitive:NN \csstring              \tex_csstring:D
   \__kernel_primitive:NN \directlua             \tex_directlua:D
   \__kernel_primitive:NN \dviextension          \tex_dviextension:D
   \__kernel_primitive:NN \dvifeedback           \tex_dvifeedback:D
@@ -975,6 +980,7 @@
   \__kernel_primitive:NN \dvivariable           \tex_dvivariable:D
   \__kernel_primitive:NN \etoksapp              \tex_etoksapp:D
   \__kernel_primitive:NN \etokspre              \tex_etokspre:D
+  \__kernel_primitive:NN \exceptionpenalty      \tex_exceptionpenalty:D
   \__kernel_primitive:NN \explicithyphenpenalty \tex_explicithyphenpenalty:D
   \__kernel_primitive:NN \expanded              \tex_expanded:D
   \__kernel_primitive:NN \explicitdiscretionary \tex_explicitdiscretionary:D
@@ -987,16 +993,34 @@
   \__kernel_primitive:NN \hyphenationmin        \tex_hyphenationmin:D
   \__kernel_primitive:NN \hyphenpenaltymode     \tex_hyphenpenaltymode:D
   \__kernel_primitive:NN \gleaders              \tex_gleaders:D
+  \__kernel_primitive:NN \ifcondition           \tex_ifcondition:D
+  \__kernel_primitive:NN \immediateassigned     \tex_immediateassigned:D
+  \__kernel_primitive:NN \immediateassignment   \tex_immediateassignment:D
   \__kernel_primitive:NN \initcatcodetable      \tex_initcatcodetable:D
   \__kernel_primitive:NN \lastnamedcs           \tex_lastnamedcs:D
   \__kernel_primitive:NN \latelua               \tex_latelua:D
+  \__kernel_primitive:NN \lateluafunction       \tex_lateluafunction:D
+  \__kernel_primitive:NN \leftghost             \tex_leftghost:D
   \__kernel_primitive:NN \letcharcode           \tex_letcharcode:D
+  \__kernel_primitive:NN \linedir               \tex_linedir:D
+  \__kernel_primitive:NN \linedirection         \tex_linedirection:D
+  \__kernel_primitive:NN \localbrokenpenalty    \tex_localbrokenpenalty:D
+  \__kernel_primitive:NN \localinterlinepenalty \tex_localinterlinepenalty:D
+  \__kernel_primitive:NN \luabytecode           \tex_luabytecode:D
+  \__kernel_primitive:NN \luabytecodecall       \tex_luabytecodecall:D
+  \__kernel_primitive:NN \luacopyinputnodes     \tex_luacopyinputnodes:D
+  \__kernel_primitive:NN \luadef                \tex_luadef:D
+  \__kernel_primitive:NN \localleftbox          \tex_localleftbox:D
+  \__kernel_primitive:NN \localrightbox         \tex_localrightbox:D
   \__kernel_primitive:NN \luaescapestring       \tex_luaescapestring:D
   \__kernel_primitive:NN \luafunction           \tex_luafunction:D
+  \__kernel_primitive:NN \luafunctioncall       \tex_luafunctioncall:D
   \__kernel_primitive:NN \luatexbanner          \tex_luatexbanner:D
   \__kernel_primitive:NN \luatexrevision        \tex_luatexrevision:D
   \__kernel_primitive:NN \luatexversion         \tex_luatexversion:D
   \__kernel_primitive:NN \mathdelimitersmode    \tex_mathdelimitersmode:D
+  \__kernel_primitive:NN \mathdir               \tex_mathdir:D
+  \__kernel_primitive:NN \mathdirection         \tex_mathdirection:D
   \__kernel_primitive:NN \mathdisplayskipmode   \tex_mathdisplayskipmode:D
   \__kernel_primitive:NN \matheqnogapstep       \tex_matheqnogapstep:D
   \__kernel_primitive:NN \mathnolimitsmode      \tex_mathnolimitsmode:D
@@ -1005,6 +1029,7 @@
   \__kernel_primitive:NN \mathrulesfam          \tex_mathrulesfam:D
   \__kernel_primitive:NN \mathscriptsmode       \tex_mathscriptsmode:D
   \__kernel_primitive:NN \mathscriptboxmode     \tex_mathscriptboxmode:D
+  \__kernel_primitive:NN \mathscriptcharmode    \tex_mathscriptcharmode:D
   \__kernel_primitive:NN \mathstyle             \tex_mathstyle:D
   \__kernel_primitive:NN \mathsurroundmode      \tex_mathsurroundmode:D
   \__kernel_primitive:NN \mathsurroundskip      \tex_mathsurroundskip:D
@@ -1015,9 +1040,13 @@
   \__kernel_primitive:NN \novrule               \tex_novrule:D
   \__kernel_primitive:NN \outputbox             \tex_outputbox:D
   \__kernel_primitive:NN \pagebottomoffset      \tex_pagebottomoffset:D
+  \__kernel_primitive:NN \pagedir               \tex_pagedir:D
+  \__kernel_primitive:NN \pagedirection         \tex_pagedirection:D
   \__kernel_primitive:NN \pageleftoffset        \tex_pageleftoffset:D
   \__kernel_primitive:NN \pagerightoffset       \tex_pagerightoffset:D
   \__kernel_primitive:NN \pagetopoffset         \tex_pagetopoffset:D
+  \__kernel_primitive:NN \pardir                \tex_pardir:D
+  \__kernel_primitive:NN \pardirection          \tex_pardirection:D
   \__kernel_primitive:NN \pdfextension          \tex_pdfextension:D
   \__kernel_primitive:NN \pdffeedback           \tex_pdffeedback:D
   \__kernel_primitive:NN \pdfvariable           \tex_pdfvariable:D
@@ -1028,6 +1057,7 @@
   \__kernel_primitive:NN \preexhyphenchar       \tex_preexhyphenchar:D
   \__kernel_primitive:NN \prehyphenchar         \tex_prehyphenchar:D
   \__kernel_primitive:NN \prerelpenalty         \tex_prerelpenalty:D
+  \__kernel_primitive:NN \rightghost            \tex_rightghost:D
   \__kernel_primitive:NN \savecatcodetable      \tex_savecatcodetable:D
   \__kernel_primitive:NN \scantextokens         \tex_scantextokens:D
   \__kernel_primitive:NN \setfontid             \tex_setfontid:D
@@ -1038,23 +1068,12 @@
   \__kernel_primitive:NN \suppressoutererror    \tex_suppressoutererror:D
   \__kernel_primitive:NN \suppressprimitiveerror
     \tex_suppressprimitiveerror:D
+  \__kernel_primitive:NN \textdir               \tex_textdir:D
+  \__kernel_primitive:NN \textdirection         \tex_textdirection:D
   \__kernel_primitive:NN \toksapp               \tex_toksapp:D
   \__kernel_primitive:NN \tokspre               \tex_tokspre:D
   \__kernel_primitive:NN \tpack                 \tex_tpack:D
   \__kernel_primitive:NN \vpack                 \tex_vpack:D
-  \__kernel_primitive:NN \bodydir               \tex_bodydir:D
-  \__kernel_primitive:NN \boxdir                \tex_boxdir:D
-  \__kernel_primitive:NN \leftghost             \tex_leftghost:D
-  \__kernel_primitive:NN \linedir               \tex_linedir:D
-  \__kernel_primitive:NN \localbrokenpenalty    \tex_localbrokenpenalty:D
-  \__kernel_primitive:NN \localinterlinepenalty \tex_localinterlinepenalty:D
-  \__kernel_primitive:NN \localleftbox          \tex_localleftbox:D
-  \__kernel_primitive:NN \localrightbox         \tex_localrightbox:D
-  \__kernel_primitive:NN \mathdir               \tex_mathdir:D
-  \__kernel_primitive:NN \pagedir               \tex_pagedir:D
-  \__kernel_primitive:NN \pardir                \tex_pardir:D
-  \__kernel_primitive:NN \rightghost            \tex_rightghost:D
-  \__kernel_primitive:NN \textdir               \tex_textdir:D
   \__kernel_primitive:NN \adjustspacing         \tex_adjustspacing:D
   \__kernel_primitive:NN \copyfont              \tex_copyfont:D
   \__kernel_primitive:NN \draftmode             \tex_draftmode:D
@@ -10130,6 +10149,7 @@
 \cs_generate_variant:Nn \__kernel_msg_expandable_error:nnnn { nnff }
 \cs_generate_variant:Nn \__kernel_msg_expandable_error:nnn { nnf }
 %% File: l3file.dtx Copyright (C) 1990-2018 The LaTeX3 Project
+\tl_new:N  \l__ior_internal_tl
 \int_const:Nn \c_term_ior { 16 }
 \seq_new:N \g__ior_streams_seq
 \tl_new:N \l__ior_stream_tl
@@ -10268,7 +10288,6 @@
         \__ior_map_inline_loop:NNN #1#2#3
       }
   }
-\tl_new:N  \l__ior_internal_tl
 \int_const:Nn \c_log_iow  { -1 }
 \int_const:Nn \c_term_iow
   {
@@ -10665,6 +10684,7 @@
   { \tl_if_empty:NF #1 { \exp_after:wN \__iow_wrap_trim:w #1 \q_stop } }
 \exp_last_unbraced:NNNNo
   \cs_new:Npn \__iow_wrap_trim:w #1 \c_catcode_other_space_tl \q_stop {#1}
+\tl_new:N \l__file_internal_tl
 \ior_new:N \g__file_internal_ior
 \str_new:N \g_file_curr_dir_str
 \str_new:N \g_file_curr_ext_str
@@ -10694,7 +10714,6 @@
     { \exp_after:wN \__file_tmp:w \@currnamestack }
 \group_end:
 \seq_new:N \g__file_record_seq
-\tl_new:N \l__file_tmp_tl
 \str_new:N \l__file_base_name_str
 \str_new:N \l__file_full_name_str
 \str_new:N \l__file_dir_str
@@ -10707,14 +10726,14 @@
     \group_begin:
       \seq_map_inline:Nn \l_char_active_seq
         {
-          \tl_set:Nx \l__file_tmp_tl { \iow_char:N ##1 }
-          \char_set_active_eq:NN ##1 \l__file_tmp_tl
+          \tl_set:Nx \l__file_internal_tl { \iow_char:N ##1 }
+          \char_set_active_eq:NN ##1 \l__file_internal_tl
         }
-      \tl_set:Nx \l__file_tmp_tl {#1}
-      \tl_set:Nx \l__file_tmp_tl
-        { \tl_to_str:N \l__file_tmp_tl }
+      \tl_set:Nx \l__file_internal_tl {#1}
+      \tl_set:Nx \l__file_internal_tl
+        { \tl_to_str:N \l__file_internal_tl }
     \exp_args:NNNV \group_end:
-    \str_set:Nn #2 \l__file_tmp_tl
+    \str_set:Nn #2 \l__file_internal_tl
   }
 \cs_new_protected:Npn \__file_name_quote:nN #1#2
   {
@@ -10815,8 +10834,8 @@
 \cs_new_eq:NN \__kernel_file_input_push:n \__file_input_push:n
 \cs_new_protected:Npn \__file_input_pop:
   {
-    \seq_gpop:NN \g__file_stack_seq \l__file_tmp_tl
-    \exp_after:wN \__file_input_pop:nnn \l__file_tmp_tl
+    \seq_gpop:NN \g__file_stack_seq \l__file_internal_tl
+    \exp_after:wN \__file_input_pop:nnn \l__file_internal_tl
   }
 \cs_new_eq:NN \__kernel_file_input_pop: \__file_input_pop:
 \cs_new_protected:Npn \__file_input_pop:nnn #1#2#3
@@ -12371,43 +12390,46 @@
         \cs:w \c__keys_code_root_tl \l_keys_path_tl \exp_after:wN \cs_end:
           \exp_after:wN { \l_keys_value_tl }
       }
-      { \__keys_execute_unknown: }
-  }
-\cs_new_protected:Npn \__keys_execute_unknown:
-  {
-    \bool_if:NTF \l__keys_only_known_bool
-      { \__keys_store_unused: }
       {
-        \cs_if_exist:cTF
-          { \c__keys_inherit_root_tl \__keys_parent:o \l_keys_path_tl }
+        \bool_if:NTF \l__keys_only_known_bool
+          { \__keys_store_unused: }
           {
-            \clist_map_inline:cn
+            \cs_if_exist:cTF
               { \c__keys_inherit_root_tl \__keys_parent:o \l_keys_path_tl }
-              {
-                \cs_if_exist:cT
-                  { \c__keys_code_root_tl ##1 / \l_keys_key_tl }
-                  {
-                    \cs:w \c__keys_code_root_tl ##1 / \l_keys_key_tl
-                      \exp_after:wN \cs_end: \exp_after:wN
-                      { \l_keys_value_tl }
-                    \clist_map_break:
-                  }
-              }
+              { \__keys_execute_inherit: }
+              { \__keys_execute_unknown: }
           }
+      }
+  }
+\cs_new_protected:Npn \__keys_execute_inherit:
+  {
+    \clist_map_inline:cn
+      { \c__keys_inherit_root_tl \__keys_parent:o \l_keys_path_tl }
+      {
+        \cs_if_exist:cT
+          { \c__keys_code_root_tl ##1 / \l_keys_key_tl }
           {
-            \cs_if_exist:cTF
-              { \c__keys_code_root_tl \l__keys_module_tl / unknown }
-              {
-                \cs:w \c__keys_code_root_tl \l__keys_module_tl / unknown
-                  \exp_after:wN \cs_end: \exp_after:wN { \l_keys_value_tl }
-              }
-              {
-                \__kernel_msg_error:nnxx { kernel } { key-unknown }
-                  { \l_keys_path_tl } { \l__keys_module_tl }
-              }
+            \cs:w \c__keys_code_root_tl ##1 / \l_keys_key_tl
+              \exp_after:wN \cs_end: \exp_after:wN
+              { \l_keys_value_tl }
+            \clist_map_break:n { \use_none:n }
           }
-       }
+      }
+    \__keys_execute_unknown:
   }
+\cs_new_protected:Npn \__keys_execute_unknown:
+  {
+    \cs_if_exist:cTF
+      { \c__keys_code_root_tl \l__keys_module_tl / unknown }
+      {
+        \cs:w \c__keys_code_root_tl \l__keys_module_tl / unknown
+          \exp_after:wN \cs_end: \exp_after:wN { \l_keys_value_tl }
+      }
+      {
+        \__kernel_msg_error:nnxx { kernel } { key-unknown }
+         { \l_keys_path_tl } { \l__keys_module_tl }
+      }
+  }
 \cs_new:Npn \__keys_execute:nn #1#2
   {
     \cs_if_exist:cTF { \c__keys_code_root_tl #1 }
@@ -24737,18 +24759,11 @@
     \group_end:
   }
 %% File: l3candidates.dtx Copyright (C) 2012-2018 The LaTeX3 Project
-\cs_new_protected:Npx \mode_leave_vertical:
+\cs_new_protected:Npn \mode_leave_vertical:
   {
-    \cs_if_exist:NTF \tex_quitvmode:D
-      { \tex_quitvmode:D }
-      {
-        \exp_not:n
-          {
-            \if_mode_vertical:
-              \exp_after:wN \tex_indent:D
-            \fi:
-          }
-     }
+    \if_mode_vertical:
+      \exp_after:wN \tex_indent:D
+    \fi:
   }
 \cs_new_protected:Npn \box_clip:N #1
   { \hbox_set:Nn #1 { \driver_box_use_clip:N #1 } }
@@ -27014,6 +27029,53 @@
   { \__peek_token_generic:NNT \__peek_execute_branches_N_type: \scan_stop: }
 \cs_new_protected:Npn \peek_N_type:F
   { \__peek_token_generic:NNF \__peek_execute_branches_N_type: \scan_stop: }
+\tl_new:N \l__peek_collect_tl
+\cs_new_protected:Npn \peek_catcode_collect_inline:Nn
+  { \__peek_collect:NNn \__peek_execute_branches_catcode: }
+\cs_new_protected:Npn \peek_charcode_collect_inline:Nn
+  { \__peek_collect:NNn \__peek_execute_branches_charcode: }
+\cs_new_protected:Npn \peek_meaning_collect_inline:Nn
+  { \__peek_collect:NNn \__peek_execute_branches_meaning: }
+\cs_new_protected:Npn \__peek_collect:NNn #1#2#3
+  {
+    \group_align_safe_begin:
+    \cs_set_eq:NN \l__peek_search_token #2
+    \tl_set:Nn \l__peek_search_tl {#2}
+    \tl_clear:N \l__peek_collect_tl
+    \cs_set:Npn \__peek_false:w
+      { \exp_args:No \__peek_false_aux:n \l__peek_collect_tl }
+    \cs_set:Npn \__peek_false_aux:n ##1
+      {
+        \group_align_safe_end:
+        #3
+      }
+    \cs_set_eq:NN \__peek_true:w \__peek_collect_true:w
+    \cs_set:Npn \__peek_true_aux:w { \peek_after:Nw #1 }
+    \__peek_true_aux:w
+  }
+\cs_new_protected:Npn \__peek_collect_true:w
+  {
+    \if_case:w
+        \if_catcode:w \exp_not:N \l_peek_token {   1 \exp_stop_f: \fi:
+        \if_catcode:w \exp_not:N \l_peek_token }   2 \exp_stop_f: \fi:
+        \if_meaning:w \l_peek_token \c_space_token 3 \exp_stop_f: \fi:
+        0 \exp_stop_f:
+      \exp_after:wN \__peek_collect:N
+    \or: \__peek_collect_remove:nw { \c_group_begin_token }
+    \or: \__peek_collect_remove:nw { \c_group_end_token }
+    \or: \__peek_collect_remove:nw { ~ }
+    \fi:
+  }
+\cs_new_protected:Npn \__peek_collect:N #1
+  {
+    \tl_put_right:Nn \l__peek_collect_tl {#1}
+    \__peek_true_aux:w
+  }
+\cs_new_protected:Npn \__peek_collect_remove:nw #1
+  {
+    \tl_put_right:Nn \l__peek_collect_tl {#1}
+    \exp_after:wN \__peek_true_remove:w
+  }
 %% File: l3deprecation.dtx (C) Copyright 2017-2018 The LaTeX3 Project
 \cs_new_protected:Npn \__kernel_deprecation_error:Nnn #1#2#3
   {

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex	2018-09-24 20:23:18 UTC (rev 48749)
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx Copyright (C) 1990-2018 The LaTeX3 Project
-\def\ExplFileDate{2018-08-23}%
+\def\ExplFileDate{2018-09-24}%
 \let\ExplLoaderFileDate\ExplFileDate
 \begingroup
   \def\tempa{LaTeX2e}%

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty	2018-09-24 20:23:18 UTC (rev 48749)
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx Copyright (C) 1990-2018 The LaTeX3 Project
-\def\ExplFileDate{2018-08-23}%
+\def\ExplFileDate{2018-09-24}%
 \let\ExplLoaderFileDate\ExplFileDate
 \ProvidesPackage{expl3}
   [%

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls	2018-09-24 20:23:18 UTC (rev 48749)
@@ -57,6 +57,8 @@
 \bool_new:N \g__codedoc_checkfunc_bool
 \bool_new:N \g__codedoc_checktest_bool
 \bool_new:N \g__codedoc_kernel_bool
+\bool_new:N \g__codedoc_cs_break_bool
+\bool_gset_true:N \g__codedoc_cs_break_bool
 \tl_new:N \l__codedoc_tmpa_tl
 \tl_new:N \l__codedoc_tmpb_tl
 \int_new:N \l__codedoc_tmpa_int
@@ -416,6 +418,10 @@
   { \bool_gset_false:N \g__codedoc_lmodern_bool }
 \DeclareOption { lm-default }
   { \bool_gset_true:N \g__codedoc_lmodern_bool }
+\DeclareOption { cs-break-off }
+  { \bool_gset_false:N \g__codedoc_cs_break_bool }
+\DeclareOption { cs-break-nohyphen }
+  { \PassOptionsToPackage{nohyphen}{underscore} }
 \DeclareOption* { \PassOptionsToClass { \CurrentOption } { article } }
 \ExecuteOptions { full, kernel, nocheck, nochecktest, lm-default }
 \PassOptionsToClass { a4paper } { article }
@@ -446,9 +452,9 @@
     pifont,
     textcomp,
     trace,
-    underscore,
     csquotes,
     fancyvrb,
+    underscore,
     verbatim
   }
 \raggedbottom
@@ -686,18 +692,23 @@
         \tl_replace_all:Nno \l__codedoc_cmd_tl { _ } \l__codedoc_tmpb_tl
       }
     \mode_if_math:T { \mbox }
-    {
-      \verbatim at font
-      \__codedoc_if_almost_str:VT \l__codedoc_cmd_tl
-        {
-          \tl_set:Nx \l__codedoc_cmd_tl { \tl_to_str:N \l__codedoc_cmd_tl }
-          \tl_replace_all:Non \l__codedoc_cmd_tl
-            { \token_to_str:N _ } { \_ }
-        }
-      \tl_replace_all:Nnn \l__codedoc_cmd_tl { ~ } { \@xobeysp }
-      \l__codedoc_cmd_tl
-      \@
-    }
+      {
+        \verbatim at font
+        \__codedoc_if_almost_str:VT \l__codedoc_cmd_tl
+          {
+            \tl_set:Nx \l__codedoc_cmd_tl { \tl_to_str:N \l__codedoc_cmd_tl }
+            \bool_if:NT \g__codedoc_cs_break_bool
+              {
+                \regex_replace_all:nnN
+                  {([^\\])_([^\_])}
+                  {\1\c{BreakableUnderscore}\2}
+                  \l__codedoc_cmd_tl
+              }
+          }
+        \tl_replace_all:Nnn \l__codedoc_cmd_tl { ~ } { \@xobeysp }
+        \l__codedoc_cmd_tl
+        \@
+      }
     \bool_if:NF \l__codedoc_cmd_noindex_bool
       {
         \quark_if_no_value:NF \l__codedoc_cmd_index_tl

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvipdfmx.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvipdfmx.def	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvipdfmx.def	2018-09-24 20:23:18 UTC (rev 48749)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3drivers.dtx Copyright(C) 2011-2018 The LaTeX3 Project
 \ProvidesExplFile
-  {l3dvidpfmx.def}{2018-08-23}{}
+  {l3dvidpfmx.def}{2018-09-24}{}
   {L3 Experimental driver: dvipdfmx}
 \cs_new_eq:NN \__driver_literal:e \tex_special:D
 \cs_new_protected:Npn \__driver_literal:n #1
@@ -68,7 +68,7 @@
       { rgb~ \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} }
   }
 \cs_new_protected:Npn \driver_color_spot:nn #1#2
-  { \__driver_color_select:n { \c_space_tl #1 } }
+  { \__driver_color_select:n { #1 } }
 \cs_new_protected:Npn \__driver_color_select:n #1
   {
     \__driver_literal:n { color~push~ #1 }
@@ -208,6 +208,59 @@
           }
       }
   }
+\int_new:N \g__driver_pdf_object_int
+\prop_new:N \g__driver_pdf_object_prop
+\cs_new_protected:Npn \driver_pdf_object_new:nn #1#2
+  {
+    \int_gincr:N \g__driver_pdf_object_int
+    \int_const:cn
+      { g__driver_pdf_object_ \tl_to_str:n {#1} _int }
+      { \g__driver_pdf_object_int }
+    \prop_gput:Nnn \g__driver_pdf_object_prop {#1} {#2}
+  }
+\cs_new:Npn \driver_pdf_object_ref:n #1
+  { @l3obj \int_use:c { g__driver_pdf_object_ \tl_to_str:n {#1} _int } }
+\cs_new_protected:Npn \driver_pdf_object_write:nn #1#2
+  {
+    \exp_args:Nx \__driver_pdf_object_write:nnn
+      { \prop_item:Nn \g__driver_pdf_object_prop {#1} } {#1} {#2}
+  }
+\cs_new_protected:Npn \__driver_pdf_object_write:nnn #1#2#3
+  { \use:c { __driver_pdf_object_write_ #1 :nn } {#2} {#3} }
+\cs_new_protected:Npn \__driver_pdf_object_write_array:nn #1#2
+  {
+    \__driver_literal:x
+      {
+        pdf:obj ~ \driver_pdf_object_ref:n {#1} ~
+          [ ~ \exp_not:n {#2} ~ ]
+      }
+  }
+\cs_new_protected:Npn \__driver_pdf_object_write_dict:nn #1#2
+  {
+    \__driver_literal:x
+      {
+        pdf:obj ~ \driver_pdf_object_ref:n {#1} ~
+          << ~ \exp_not:n {#2} ~ >>
+      }
+  }
+\cs_new_protected:Npn \__driver_pdf_object_write_fstream:nn #1#2
+  { \__driver_pdf_object_write_stream:nnnn { f } {#1} #2 }
+\cs_new_protected:Npn \__driver_pdf_object_write_stream:nn #1#2
+  { \__driver_pdf_object_write_stream:nnnn { } {#1} #2 }
+\cs_new_protected:Npn \__driver_pdf_object_write_stream:nnnn #1#2#3#4
+  {
+    \__driver_literal:x
+      {
+        pdf: #1 stream ~ \driver_pdf_object_ref:n {#2} ~
+          ( \exp_not:n {#4} ) ~ << \exp_not:n {#3} >>
+
+      }
+  }
+\cs_new_protected:Npn \driver_pdf_compresslevel:n #1
+  { \__driver_literal:x { dvipdfmx:config~z~ \int_eval:n {#1} } }
+\cs_new_protected:Npn \driver_pdf_objects_enable: { }
+\cs_new_protected:Npn \driver_pdf_objects_disable:
+  { \__driver_literal:n { dvipdfmx:config~C~0x40 } }
 \cs_new_eq:NN \__driver_draw_literal:n \__driver_literal_pdf:n
 \cs_generate_variant:Nn \__driver_draw_literal:n { x }
 \cs_new_protected:Npn \driver_draw_begin:

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvips.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvips.def	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvips.def	2018-09-24 20:23:18 UTC (rev 48749)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3drivers.dtx Copyright(C) 2011-2018 The LaTeX3 Project
 \ProvidesExplFile
-  {l3dvips.def}{2018-08-23}{}
+  {l3dvips.def}{2018-09-24}{}
   {L3 Experimental driver: dvips}
 \cs_new_eq:NN \__driver_literal:e \tex_special:D
 \cs_new_protected:Npn \__driver_literal:n #1
@@ -68,7 +68,7 @@
       { rgb~ \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} }
   }
 \cs_new_protected:Npn \driver_color_spot:nn #1#2
-  { \__driver_color_select:n { \c_space_tl #1 } }
+  { \__driver_color_select:n { #1 } }
 \cs_new_protected:Npn \__driver_color_select:n #1
   {
     \__driver_literal:n { color~push~ #1 }
@@ -394,6 +394,73 @@
     \__driver_draw_literal:n { [begin] }
     \__driver_draw_literal:n { @beginspecial }
   }
+\int_new:N \g__driver_pdf_object_int
+\prop_new:N \g__driver_pdf_object_prop
+\cs_new_protected:Npn \driver_pdf_object_new:nn #1#2
+  {
+    \int_gincr:N \g__driver_pdf_object_int
+    \int_const:cn
+      { g__driver_pdf_object_ \tl_to_str:n {#1} _int }
+      { \g__driver_pdf_object_int }
+    \prop_gput:Nnn \g__driver_pdf_object_prop {#1} {#2}
+  }
+\cs_new:Npn \driver_pdf_object_ref:n #1
+  { { l3obj \int_use:c { g__driver_pdf_object_ \tl_to_str:n {#1} _int } } }
+\cs_new_protected:Npn \driver_pdf_object_write:nn #1#2
+  {
+    \__driver_literal_postscript:x
+      {
+        mark ~ /_objdef ~ \driver_pdf_object_ref:n {#1} ~
+        /type
+        \str_case_e:nn
+          { \prop_item:Nn \g__driver_pdf_object_prop {#1} }
+          {
+            { array }   { /array }
+            { dict }    { /dict }
+            { fstream } { /stream }
+            { stream }  { /stream }
+          }
+        /OBJ ~ pdfmark
+      }
+    \use:c
+      { __driver_pdf_object_write_ \prop_item:Nn \g__driver_pdf_object_prop {#1} :nn }
+      {#1} {#2}
+  }
+\cs_new_protected:Npn \__driver_pdf_object_write_array:nn #1#2
+  {
+    \__driver_literal_postscript:x
+      {
+        mark ~ \driver_pdf_object_ref:n {#1} ~
+          [ ~ \exp_not:n {#2} ~ ] ~ /PUTINTERVAL ~ pdfmark
+      }
+  }
+\cs_new_protected:Npn \__driver_pdf_object_write_dict:nn #1#2
+  {
+    \__driver_literal_postscript:x
+      {
+        mark ~ \driver_pdf_object_ref:n {#1} ~
+          << ~ \exp_not:n {#2} ~ >> ~ /PUT ~ pdfmark
+      }
+  }
+\cs_new_protected:Npn \__driver_pdf_object_write_stream:nn #1#2
+  {
+    \exp_args:Nx
+      \__driver_pdf_object_write_stream:nnn
+        { \driver_pdf_object_ref:n {#1} }
+        #2
+  }
+\cs_new_protected:Npn \__driver_pdf_object_write_stream:nnn #1#2#3
+  {
+    \__driver_literal_postscript:n
+      {
+        [nobreak] ~
+        mark ~ #1 ~ ( #3 ) ~ /PUT ~ pdfmark ~
+        mark ~ #1 ~ << #2 >> ~ /PUT ~ pdfmark
+      }
+  }
+\cs_new_protected:Npn \driver_pdf_compresslevel:n #1 { }
+\cs_new_protected:Npn \driver_pdf_objects_enable: { }
+\cs_new_protected:Npn \driver_pdf_objects_disable: { }
 %% 
 %%
 %% End of file `l3dvips.def'.

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvisvgm.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvisvgm.def	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvisvgm.def	2018-09-24 20:23:18 UTC (rev 48749)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3drivers.dtx Copyright(C) 2011-2018 The LaTeX3 Project
 \ProvidesExplFile
-  {l3dvisvgm.def}{2018-08-23}{}
+  {l3dvisvgm.def}{2018-09-24}{}
   {L3 Experimental driver: dvisvgm}
 \cs_new_eq:NN \__driver_literal:e \tex_special:D
 \cs_new_protected:Npn \__driver_literal:n #1
@@ -68,7 +68,7 @@
       { rgb~ \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} }
   }
 \cs_new_protected:Npn \driver_color_spot:nn #1#2
-  { \__driver_color_select:n { \c_space_tl #1 } }
+  { \__driver_color_select:n { #1 } }
 \cs_new_protected:Npn \__driver_color_select:n #1
   {
     \__driver_literal:n { color~push~ #1 }
@@ -186,6 +186,12 @@
 \cs_new_eq:NN \__driver_image_include_jpg:n \__driver_image_include_png:n
 \cs_new:Npn \__driver_image_include_bitmap_quote:w #1 " #2 " #3 \q_stop
   { #1#2 }
+\cs_new_protected:Npn \driver_pdf_object_new:n #1 { }
+\cs_new:Npn \driver_pdf_object_ref:n #1 { }
+\cs_new_protected:Npn \driver_pdf_object_write:nn #1#2 { }
+\cs_new_protected:Npn \driver_pdf_compresslevel:n #1 { }
+\cs_new_protected:Npn \driver_pdf_objects_enable: { }
+\cs_new_protected:Npn \driver_pdf_objects_disable: { }
 \cs_new_eq:NN \__driver_draw_literal:n \__driver_literal_svg:n
 \cs_generate_variant:Nn \__driver_draw_literal:n { x }
 \cs_new_protected:Npn \driver_draw_begin:

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def	2018-09-24 20:23:18 UTC (rev 48749)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3drivers.dtx Copyright(C) 2011-2018 The LaTeX3 Project
 \ProvidesExplFile
-  {l3pdfmode.def}{2018-08-23}{}
+  {l3pdfmode.def}{2018-09-24}{}
   {L3 Experimental driver: PDF mode}
 \cs_new_eq:NN \__driver_literal:e \tex_special:D
 \cs_new_protected:Npn \__driver_literal:n #1
@@ -264,6 +264,79 @@
   }
 \cs_new_eq:NN \__driver_image_include_pdf:n \__driver_image_include_jpg:n
 \cs_new_eq:NN \__driver_image_include_png:n \__driver_image_include_jpg:n
+\prop_new:N \g__driver_pdf_object_prop
+\group_begin:
+  \cs_set_protected:Npn \__driver_tmp:w #1#2
+    {
+      \cs_new_protected:Npx \driver_pdf_object_new:nn ##1##2
+        {
+          #1 reserveobjnum ~
+          \int_const:cn
+            { g__driver_pdf_object_ \exp_not:N \tl_to_str:n {##1} _int }
+            {#2}
+          \prop_gput:Nnn \exp_not:N \g__driver_pdf_object_prop {##1} {##2}
+        }
+    }
+  \cs_if_exist:NTF \tex_pdfextension:D
+    {
+      \__driver_tmp:w
+        { \tex_pdfextension:D obj ~ }
+        { \tex_pdffeedback:D lastobj \scan_stop: }
+    }
+    { \__driver_tmp:w { \tex_pdfobj:D } { \tex_pdflastobj:D } }
+\group_end:
+\cs_new:Npn \driver_pdf_object_ref:n #1
+  { \int_use:c { g__driver_pdf_object_ \tl_to_str:n {#1} _int } ~ 0 ~ R }
+\group_begin:
+  \cs_set_protected:Npn \__driver_tmp:w #1
+    {
+      \cs_new_protected:Npn \driver_pdf_object_write:nn ##1##2
+        {
+          \tex_immediate:D #1 useobjnum ~
+          \int_use:c
+            { g__driver_pdf_object_ \tl_to_str:n {##1} _int }
+            \str_case_e:nn
+              { \prop_item:Nn \g__driver_pdf_object_prop {##1} }
+              {
+                { array } { { [ ~ \exp_not:n {##2} ~ ] } }
+                { dict }  { { << ~ \exp_not:n {##2} ~ >> } }
+                { fstream }
+                  {
+                    stream ~ attr ~ { \__driver_exp_not_i:nn ##2 } ~
+                      file ~ { \__driver_exp_not_ii:nn ##2 }
+                  }
+                { stream }
+                  {
+                    stream ~ attr ~ { \__driver_exp_not_i:nn ##2 } ~
+                      { \__driver_exp_not_ii:nn ##2 }
+                  }
+              }
+        }
+    }
+  \cs_if_exist:NTF \tex_pdfextension:D
+    { \__driver_tmp:w { \tex_pdfextension:D obj ~ } }
+    { \__driver_tmp:w { \tex_pdfobj:D } }
+\group_end:
+\cs_new:Npn \__driver_exp_not_i:nn #1#2 { \exp_not:n {#1} }
+\cs_new:Npn \__driver_exp_not_ii:nn #1#2 { \exp_not:n {#2} }
+\cs_new_protected:Npx \driver_pdf_compresslevel:n #1
+  {
+    \cs_if_exist:NTF \tex_pdfcompresslevel:D
+      { \tex_pdfcompresslevel:D }
+      { \tex_pdfvariable:D compresslevel }
+      \exp_not:N \int_value:w \exp_not:N \int_eval:n {#1} \scan_stop:
+  }
+\cs_new_protected:Npn \driver_pdf_objects_enable:
+  { \__driver_pdf_objectlevel:n { 2 } }
+\cs_new_protected:Npn \driver_pdf_objects_disable:
+  { \__driver_pdf_objectlevel:n { 0 } }
+\cs_new_protected:Npx \__driver_pdf_objectlevel:n #1
+  {
+    \cs_if_exist:NTF \tex_pdfobjcompresslevel:D
+      { \tex_pdfobjcompresslevel:D }
+      { \tex_pdfvariable:D objcompresslevel }
+      #1 \scan_stop:
+  }
 \cs_new_eq:NN \__driver_draw_literal:n \__driver_literal_pdf:n
 \cs_generate_variant:Nn \__driver_draw_literal:n { x }
 \cs_new_protected:Npn \driver_draw_begin:

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3xdvipdfmx.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3xdvipdfmx.def	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3xdvipdfmx.def	2018-09-24 20:23:18 UTC (rev 48749)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3drivers.dtx Copyright(C) 2011-2018 The LaTeX3 Project
 \ProvidesExplFile
-  {l3xdvidpfmx.def}{2018-08-23}{}
+  {l3xdvidpfmx.def}{2018-09-24}{}
   {L3 Experimental driver: xdvipdfmx}
 \cs_new_eq:NN \__driver_literal:e \tex_special:D
 \cs_new_protected:Npn \__driver_literal:n #1
@@ -68,7 +68,7 @@
       { rgb~ \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} }
   }
 \cs_new_protected:Npn \driver_color_spot:nn #1#2
-  { \__driver_color_select:n { \c_space_tl #1 } }
+  { \__driver_color_select:n { #1 } }
 \cs_new_protected:Npn \__driver_color_select:n #1
   {
     \__driver_literal:n { color~push~ #1 }
@@ -193,6 +193,59 @@
           }
       }
   }
+\int_new:N \g__driver_pdf_object_int
+\prop_new:N \g__driver_pdf_object_prop
+\cs_new_protected:Npn \driver_pdf_object_new:nn #1#2
+  {
+    \int_gincr:N \g__driver_pdf_object_int
+    \int_const:cn
+      { g__driver_pdf_object_ \tl_to_str:n {#1} _int }
+      { \g__driver_pdf_object_int }
+    \prop_gput:Nnn \g__driver_pdf_object_prop {#1} {#2}
+  }
+\cs_new:Npn \driver_pdf_object_ref:n #1
+  { @l3obj \int_use:c { g__driver_pdf_object_ \tl_to_str:n {#1} _int } }
+\cs_new_protected:Npn \driver_pdf_object_write:nn #1#2
+  {
+    \exp_args:Nx \__driver_pdf_object_write:nnn
+      { \prop_item:Nn \g__driver_pdf_object_prop {#1} } {#1} {#2}
+  }
+\cs_new_protected:Npn \__driver_pdf_object_write:nnn #1#2#3
+  { \use:c { __driver_pdf_object_write_ #1 :nn } {#2} {#3} }
+\cs_new_protected:Npn \__driver_pdf_object_write_array:nn #1#2
+  {
+    \__driver_literal:x
+      {
+        pdf:obj ~ \driver_pdf_object_ref:n {#1} ~
+          [ ~ \exp_not:n {#2} ~ ]
+      }
+  }
+\cs_new_protected:Npn \__driver_pdf_object_write_dict:nn #1#2
+  {
+    \__driver_literal:x
+      {
+        pdf:obj ~ \driver_pdf_object_ref:n {#1} ~
+          << ~ \exp_not:n {#2} ~ >>
+      }
+  }
+\cs_new_protected:Npn \__driver_pdf_object_write_fstream:nn #1#2
+  { \__driver_pdf_object_write_stream:nnnn { f } {#1} #2 }
+\cs_new_protected:Npn \__driver_pdf_object_write_stream:nn #1#2
+  { \__driver_pdf_object_write_stream:nnnn { } {#1} #2 }
+\cs_new_protected:Npn \__driver_pdf_object_write_stream:nnnn #1#2#3#4
+  {
+    \__driver_literal:x
+      {
+        pdf: #1 stream ~ \driver_pdf_object_ref:n {#2} ~
+          ( \exp_not:n {#4} ) ~ << \exp_not:n {#3} >>
+
+      }
+  }
+\cs_new_protected:Npn \driver_pdf_compresslevel:n #1
+  { \__driver_literal:x { dvipdfmx:config~z~ \int_eval:n {#1} } }
+\cs_new_protected:Npn \driver_pdf_objects_enable: { }
+\cs_new_protected:Npn \driver_pdf_objects_disable:
+  { \__driver_literal:n { dvipdfmx:config~C~0x40 } }
 \cs_new_protected:Npn \__driver_image_getbb_jpg:n #1
   {
     \int_zero:N \l_image_page_int

Modified: trunk/Master/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty	2018-09-24 20:23:18 UTC (rev 48749)
@@ -32,7 +32,7 @@
       }%
     \endinput
   }
-\ProvidesExplPackage{l3keys2e}{2018-08-23}{}
+\ProvidesExplPackage{l3keys2e}{2018-09-24}{}
   {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	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/tex/latex/l3packages/xfp/xfp.sty	2018-09-24 20:23:18 UTC (rev 48749)
@@ -33,7 +33,7 @@
     \endinput
   }
 \RequirePackage{xparse}
-\ProvidesExplPackage{xfp}{2018-08-23}{}
+\ProvidesExplPackage{xfp}{2018-09-24}{}
   {L3 Floating point unit}
 \NewExpandableDocumentCommand \fpeval { m } { \fp_eval:n {#1} }
 \NewExpandableDocumentCommand \inteval { m } { \int_eval:n {#1} }

Modified: trunk/Master/texmf-dist/tex/latex/l3packages/xfrac/xfrac.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3packages/xfrac/xfrac.sty	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/tex/latex/l3packages/xfrac/xfrac.sty	2018-09-24 20:23:18 UTC (rev 48749)
@@ -34,7 +34,7 @@
     \endinput
   }
 \RequirePackage{amstext,graphicx,l3keys2e,textcomp,xparse,xtemplate}
-\ProvidesExplPackage{xfrac}{2018-08-23}{}
+\ProvidesExplPackage{xfrac}{2018-09-24}{}
   {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	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/tex/latex/l3packages/xparse/xparse.sty	2018-09-24 20:23:18 UTC (rev 48749)
@@ -36,7 +36,7 @@
       }%
     \endinput
   }
-\ProvidesExplPackage{xparse}{2018-08-23}{}
+\ProvidesExplPackage{xparse}{2018-09-24}{}
   {L3 Experimental document command parser}
 \tl_new:N \l__xparse_arg_spec_tl
 \tl_new:N \l__xparse_args_tl
@@ -58,9 +58,9 @@
 \tl_new:N \l__xparse_fn_code_tl
 \tl_new:N \l__xparse_function_tl
 \bool_new:N \l__xparse_grab_expandably_bool
+\bool_new:N \l__xparse_obey_spaces_bool
 \tl_new:N \l__xparse_last_delimiters_tl
 \bool_new:N \l__xparse_long_bool
-\bool_new:N \l__xparse_ignore_spaces_bool
 \int_new:N \l__xparse_m_args_int
 \int_new:N \l__xparse_mandatory_args_int
 \bool_new:N \l__xparse_prefixed_bool
@@ -68,6 +68,7 @@
 \tl_new:N \l__xparse_process_one_tl
 \bool_new:N \l__xparse_process_some_bool
 \tl_new:N \l__xparse_signature_tl
+\bool_new:N \l__xparse_some_obey_spaces_bool
 \bool_new:N \l__xparse_some_long_bool
 \bool_new:N \l__xparse_some_short_bool
 \prop_new:N \l__xparse_tmp_prop
@@ -362,10 +363,11 @@
     \tl_clear:N \l__xparse_last_delimiters_tl
     \tl_clear:N \l__xparse_arg_spec_tl
     \bool_set_true:N \l__xparse_grab_expandably_bool
+    \bool_set_false:N \l__xparse_obey_spaces_bool
     \bool_set_false:N \l__xparse_long_bool
+    \bool_set_false:N \l__xparse_some_obey_spaces_bool
     \bool_set_false:N \l__xparse_some_long_bool
     \bool_set_false:N \l__xparse_some_short_bool
-    \bool_set_false:N \l__xparse_ignore_spaces_bool
     \__xparse_normalize_arg_spec_loop:n #1
       \q_recursion_tail \q_recursion_tail \q_recursion_tail \q_recursion_stop
     \int_compare:nNnT \l__xparse_current_arg_int > 9
@@ -443,7 +445,12 @@
 \cs_new_protected:cpn { __xparse_normalize_type_+:w } #1
   {
     \quark_if_recursion_tail_stop_do:nn {#1} { \__xparse_bad_arg_spec:wn }
-    \tl_put_right:Nn \l__xparse_arg_spec_tl { + }
+    \bool_if:NT \l__xparse_long_bool
+      {
+        \__kernel_msg_error:nnxx { xparse } { two-markers }
+          { \iow_char:N \\ \l__xparse_function_tl } { + }
+        \__xparse_bad_def:wn
+      }
     \bool_set_true:N \l__xparse_long_bool
     \int_decr:N \l__xparse_current_arg_int
     \__xparse_normalize_arg_spec_loop:n {#1}
@@ -451,7 +458,14 @@
 \cs_new_protected:cpn { __xparse_normalize_type_!:w } #1
   {
     \quark_if_recursion_tail_stop_do:nn {#1} { \__xparse_bad_arg_spec:wn }
-    \tl_put_right:Nn \l__xparse_arg_spec_tl { ! }
+    \bool_if:NT \l__xparse_obey_spaces_bool
+      {
+        \__kernel_msg_error:nnxx { xparse } { two-markers }
+          { \iow_char:N \\ \l__xparse_function_tl } { ! }
+        \__xparse_bad_def:wn
+      }
+    \bool_set_true:N \l__xparse_obey_spaces_bool
+    \bool_set_true:N \l__xparse_some_obey_spaces_bool
     \int_decr:N \l__xparse_current_arg_int
     \__xparse_normalize_arg_spec_loop:n {#1}
   }
@@ -499,9 +513,14 @@
   {
     \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:Nx \l__xparse_arg_spec_tl
+      {
+        \bool_if:NT \l__xparse_obey_spaces_bool { ! }
+        t \exp_not:n {#1}
+      }
     \tl_put_right:Nn \l__xparse_last_delimiters_tl {#1}
     \bool_set_false:N \l__xparse_grab_expandably_bool
+    \bool_set_false:N \l__xparse_obey_spaces_bool
     \bool_set_false:N \l__xparse_long_bool
     \__xparse_normalize_arg_spec_loop:n
   }
@@ -508,17 +527,13 @@
 \cs_new_protected:Npn \__xparse_normalize_type_l:w
   {
     \__xparse_normalize_check_lu:N l
-    \__xparse_add_arg_spec:n { l }
-    \int_incr:N \l__xparse_mandatory_args_int
-    \tl_clear:N \l__xparse_last_delimiters_tl
+    \__xparse_add_arg_spec_mandatory:n { l }
     \__xparse_normalize_arg_spec_loop:n
   }
 \cs_new_protected:Npn \__xparse_normalize_type_m:w
   {
     \__xparse_delimiter_check:nnn { } { m } { \iow_char:N \{ }
-    \__xparse_add_arg_spec:n { m }
-    \int_incr:N \l__xparse_mandatory_args_int
-    \tl_clear:N \l__xparse_last_delimiters_tl
+    \__xparse_add_arg_spec_mandatory:n { m }
     \__xparse_normalize_arg_spec_loop:n
   }
 \cs_new_protected:Npn \__xparse_normalize_type_R:w #1#2#3
@@ -527,10 +542,8 @@
     \__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
-    \tl_clear:N \l__xparse_last_delimiters_tl
     \bool_set_false:N \l__xparse_grab_expandably_bool
+    \__xparse_add_arg_spec_mandatory:n { R #1 #2 {#3} }
     \__xparse_normalize_arg_spec_loop:n
   }
 \cs_new_protected:Npn \__xparse_normalize_type_u:w #1
@@ -537,17 +550,13 @@
   {
     \quark_if_recursion_tail_stop_do:nn {#1} { \__xparse_bad_arg_spec:wn }
     \__xparse_normalize_check_lu:N u
-    \__xparse_add_arg_spec:n { u {#1} }
-    \int_incr:N \l__xparse_mandatory_args_int
-    \tl_clear:N \l__xparse_last_delimiters_tl
+    \__xparse_add_arg_spec_mandatory:n { u {#1} }
     \__xparse_normalize_arg_spec_loop:n
   }
 \cs_new_protected:Npn \__xparse_normalize_type_v:w
   {
     \__xparse_normalize_check_gv:N v
-    \__xparse_add_arg_spec:n { v }
-    \int_incr:N \l__xparse_mandatory_args_int
-    \tl_clear:N \l__xparse_last_delimiters_tl
+    \__xparse_add_arg_spec_mandatory:n { v }
     \__xparse_normalize_arg_spec_loop:n
   }
 \cs_new_protected:Npn \__xparse_single_char_check:n #1
@@ -628,14 +637,32 @@
     \bool_if:NTF \l__xparse_long_bool
       { \bool_set_true:N \l__xparse_some_long_bool }
       { \bool_set_true:N \l__xparse_some_short_bool }
+    \tl_put_right:Nx \l__xparse_arg_spec_tl
+      {
+        \bool_if:NT \l__xparse_long_bool { + }
+        \bool_if:NT \l__xparse_obey_spaces_bool { ! }
+        \exp_not:n {#1}
+      }
     \bool_set_false:N \l__xparse_long_bool
-    \tl_put_right:Nn \l__xparse_arg_spec_tl {#1}
+    \bool_set_false:N \l__xparse_obey_spaces_bool
   }
+\cs_new_protected:Npn \__xparse_add_arg_spec_mandatory:n #1
+  {
+    \bool_if:NT \l__xparse_some_obey_spaces_bool
+      {
+        \__kernel_msg_error:nnxx { xparse } { non-trailing-obey-spaces }
+          { \iow_char:N \\ \l__xparse_function_tl } { \tl_to_str:n {#1} }
+        \__xparse_bad_def:wn
+      }
+    \int_incr:N \l__xparse_mandatory_args_int
+    \tl_clear:N \l__xparse_last_delimiters_tl
+    \__xparse_add_arg_spec:n {#1}
+  }
 \cs_new_protected:Npn \__xparse_prepare_signature:n #1
   {
     \int_zero:N \l__xparse_current_arg_int
     \bool_set_false:N \l__xparse_long_bool
-    \bool_set_false:N \l__xparse_ignore_spaces_bool
+    \bool_set_false:N \l__xparse_obey_spaces_bool
     \int_zero:N \l__xparse_m_args_int
     \bool_set_false:N \l__xparse_defaults_bool
     \tl_clear:N \l__xparse_defaults_tl
@@ -671,7 +698,7 @@
 \cs_new_protected:cpn { __xparse_add_type_!:w }
   {
     \__xparse_flush_m_args:
-    \bool_set_true:N \l__xparse_ignore_spaces_bool
+    \bool_set_true:N \l__xparse_obey_spaces_bool
     \bool_set_true:N \l__xparse_prefixed_bool
     \__xparse_prepare_signature_bypass:N
   }
@@ -766,15 +793,7 @@
   }
 \cs_new_protected:Npn \__xparse_add_grabber_mandatory:N #1
   {
-    \tl_put_right:Nx \l__xparse_signature_tl
-      {
-        \exp_not:c
-          { __xparse_grab_ #1 \bool_if:NT \l__xparse_long_bool { _long } :w }
-      }
-    \bool_set_false:N \l__xparse_long_bool
-    \tl_put_right:Nx \l__xparse_process_all_tl
-      { { \exp_not:o \l__xparse_process_one_tl } }
-    \tl_clear:N \l__xparse_process_one_tl
+    \__xparse_add_grabber_optional:N #1
     \int_decr:N \l__xparse_mandatory_args_int
   }
 \cs_new_protected:Npn \__xparse_add_grabber_optional:N #1
@@ -785,15 +804,12 @@
           {
             __xparse_grab_ #1
             \bool_if:NT \l__xparse_long_bool { _long }
-            \bool_lazy_and:nnT
-              { \l__xparse_ignore_spaces_bool }
-              { \int_compare_p:nNn \l__xparse_mandatory_args_int = 0 }
-              { _ignore_spaces }
+            \bool_if:NT \l__xparse_obey_spaces_bool { _obey_spaces }
             :w
           }
       }
     \bool_set_false:N \l__xparse_long_bool
-    \bool_set_false:N \l__xparse_ignore_spaces_bool
+    \bool_set_false:N \l__xparse_obey_spaces_bool
     \tl_put_right:Nx \l__xparse_process_all_tl
       { { \exp_not:o \l__xparse_process_one_tl } }
     \tl_clear:N \l__xparse_process_one_tl
@@ -953,22 +969,28 @@
   }
 \cs_new_protected:Npn \__xparse_grab_D:w #1#2#3 \__xparse_run_code:
   {
-    \__xparse_grab_D_aux:NNnNn #1 #2 {#3} \cs_set_protected_nopar:Npn
-      { _ignore_spaces }
+    \__xparse_grab_D_aux:NNnNN #1 #2 {#3} \cs_set_protected_nopar:Npn
+      \__xparse_peek_nonspace_remove:NTF
   }
 \cs_new_protected:Npn \__xparse_grab_D_long:w #1#2#3 \__xparse_run_code:
   {
-    \__xparse_grab_D_aux:NNnNn #1 #2 {#3} \cs_set_protected:Npn
-      { _ignore_spaces }
+    \__xparse_grab_D_aux:NNnNN #1 #2 {#3} \cs_set_protected:Npn
+      \__xparse_peek_nonspace_remove:NTF
   }
-\cs_new_protected:Npn \__xparse_grab_D_ignore_spaces:w #1#2#3 \__xparse_run_code:
-  { \__xparse_grab_D_aux:NNnNn #1 #2 {#3} \cs_set_protected_nopar:Npn { } }
-\cs_new_protected:Npn \__xparse_grab_D_long_ignore_spaces:w #1#2#3 \__xparse_run_code:
-  { \__xparse_grab_D_aux:NNnNn #1 #2 {#3} \cs_set_protected:Npn { } }
-\cs_new_protected:Npn \__xparse_grab_D_aux:NNnNn #1#2#3#4#5
+\cs_new_protected:Npn \__xparse_grab_D_obey_spaces:w #1#2#3 \__xparse_run_code:
   {
+    \__xparse_grab_D_aux:NNnNN #1 #2 {#3} \cs_set_protected_nopar:Npn
+      \peek_meaning_remove:NTF
+  }
+\cs_new_protected:Npn \__xparse_grab_D_long_obey_spaces:w #1#2#3 \__xparse_run_code:
+  {
+    \__xparse_grab_D_aux:NNnNN #1 #2 {#3} \cs_set_protected:Npn
+      \peek_meaning_remove:NTF
+  }
+\cs_new_protected:Npn \__xparse_grab_D_aux:NNnNN #1#2#3#4#5
+  {
     \__xparse_grab_D_aux:NNnN #1#2 {#3} #4
-    \use:c { peek_meaning_remove #5 :NTF } #1
+    #5 #1
       { \__xparse_grab_D_call:Nw #1 }
       { \__xparse_add_arg:o \c_novalue_tl }
   }
@@ -1043,34 +1065,34 @@
   }
 \cs_new_protected:Npn \__xparse_grab_E:w #1#2 \__xparse_run_code:
   {
-    \__xparse_grab_E:nnNn {#1} {#2}
+    \__xparse_grab_E:nnNN {#1} {#2}
       \cs_set_protected_nopar:Npn
-      { _ignore_spaces }
+      \__xparse_peek_nonspace_remove:NTF
   }
 \cs_new_protected:Npn \__xparse_grab_E_long:w #1#2 \__xparse_run_code:
   {
-    \__xparse_grab_E:nnNn {#1} {#2}
+    \__xparse_grab_E:nnNN {#1} {#2}
       \cs_set_protected:Npn
-      { _ignore_spaces }
+      \__xparse_peek_nonspace_remove:NTF
   }
-\cs_new_protected:Npn \__xparse_grab_E_ignore_spaces:w #1#2 \__xparse_run_code:
+\cs_new_protected:Npn \__xparse_grab_E_obey_spaces:w #1#2 \__xparse_run_code:
   {
-    \__xparse_grab_E:nnNn {#1} {#2}
+    \__xparse_grab_E:nnNN {#1} {#2}
       \cs_set_protected_nopar:Npn
-      { }
+      \peek_meaning_remove:NTF
   }
-\cs_new_protected:Npn \__xparse_grab_E_long_ignore_spaces:w #1#2 \__xparse_run_code:
+\cs_new_protected:Npn \__xparse_grab_E_long_obey_spaces:w #1#2 \__xparse_run_code:
   {
-    \__xparse_grab_E:nnNn {#1} {#2}
+    \__xparse_grab_E:nnNN {#1} {#2}
       \cs_set_protected:Npn
-      { }
+      \peek_meaning_remove:NTF
   }
-\cs_new_protected:Npn \__xparse_grab_E:nnNn #1#2#3#4
+\cs_new_protected:Npn \__xparse_grab_E:nnNN #1#2#3#4
   {
     \exp_after:wN #3 \l__xparse_fn_tl ##1##2##3
       {
         \prop_put:Nnn \l__xparse_tmp_prop {##1} {##3}
-        \__xparse_grab_E_loop:nnN {#4} { } ##2 \q_recursion_stop
+        \__xparse_grab_E_loop:NnN #4 { } ##2 \q_recursion_stop
       }
     \prop_clear:N \l__xparse_tmp_prop
     \tl_set:Nn \l__xparse_signature_tl {#2}
@@ -1085,38 +1107,45 @@
           }
         \l__xparse_signature_tl \__xparse_run_code:
       }
-    \__xparse_grab_E_loop:nnN {#4} { } #1 \q_recursion_tail \q_recursion_stop
+    \__xparse_grab_E_loop:NnN #4 { } #1 \q_recursion_tail \q_recursion_stop
   }
-\cs_new_protected:Npn \__xparse_grab_E_loop:nnN #1#2#3#4 \q_recursion_stop
+\cs_new_protected:Npn \__xparse_grab_E_loop:NnN #1#2#3#4 \q_recursion_stop
   {
     \cs_if_eq:NNTF #3 \q_recursion_tail
       { \__xparse_grab_E_finalise: }
       {
-        \use:c { peek_meaning_remove #1 :NTF } #3
+        #1 #3
           { \l__xparse_fn_tl #3 {#2#4} }
-          { \__xparse_grab_E_loop:nnN {#1} {#2#3} #4 \q_recursion_stop }
+          { \__xparse_grab_E_loop:NnN #1 {#2#3} #4 \q_recursion_stop }
       }
   }
 \cs_new_protected:Npn \__xparse_grab_E_finalise: { }
 \cs_new_protected:Npn \__xparse_grab_G:w #1 \__xparse_run_code:
   {
-    \__xparse_grab_G_aux:nNn {#1} \cs_set_protected_nopar:Npn
-      { _ignore_spaces }
+    \__xparse_grab_G_aux:nNN {#1} \cs_set_protected_nopar:Npn
+      \__xparse_peek_nonspace:NTF
   }
 \cs_new_protected:Npn \__xparse_grab_G_long:w #1 \__xparse_run_code:
   {
-    \__xparse_grab_G_aux:nNn {#1} \cs_set_protected:Npn { _ignore_spaces }
+    \__xparse_grab_G_aux:nNN {#1} \cs_set_protected:Npn
+      \__xparse_peek_nonspace:NTF
   }
-\cs_new_protected:Npn \__xparse_grab_G_ignore_spaces:w #1 \__xparse_run_code:
-  { \__xparse_grab_G_aux:nNn {#1} \cs_set_protected_nopar:Npn { } }
-\cs_new_protected:Npn \__xparse_grab_G_long_ignore_spaces:w #1 \__xparse_run_code:
-  { \__xparse_grab_G_aux:nNn {#1} \cs_set_protected:Npn { } }
-\cs_new_protected:Npn \__xparse_grab_G_aux:nNn #1#2#3
+\cs_new_protected:Npn \__xparse_grab_G_obey_spaces:w #1 \__xparse_run_code:
   {
+    \__xparse_grab_G_aux:nNN {#1} \cs_set_protected_nopar:Npn
+      \peek_meaning:NTF
+  }
+\cs_new_protected:Npn \__xparse_grab_G_long_obey_spaces:w #1 \__xparse_run_code:
+  {
+    \__xparse_grab_G_aux:nNN {#1} \cs_set_protected:Npn
+      \peek_meaning:NTF
+  }
+\cs_new_protected:Npn \__xparse_grab_G_aux:nNN #1#2#3
+  {
     \tl_set:Nn \l__xparse_signature_tl {#1}
     \exp_after:wN #2 \l__xparse_fn_tl ##1
       { \__xparse_add_arg:n {##1} }
-    \use:c { peek_meaning #3 :NTF } \c_group_begin_token
+    #3 \c_group_begin_token
       { \l__xparse_fn_tl }
       { \__xparse_add_arg:o \c_novalue_tl }
   }
@@ -1211,7 +1240,7 @@
 \cs_new_protected:Npn \__xparse_grab_R_aux:NNnN #1#2#3#4
   {
     \__xparse_grab_D_aux:NNnN #1 #2 {#3} #4
-    \peek_meaning_remove_ignore_spaces:NTF #1
+    \__xparse_peek_nonspace_remove:NTF #1
       { \__xparse_grab_D_call:Nw #1 }
       {
         \__kernel_msg_error:nnxx { xparse } { missing-required }
@@ -1221,11 +1250,9 @@
       }
   }
 \cs_new_protected:Npn \__xparse_grab_t:w
-  { \__xparse_grab_t_aux:NNw \peek_meaning_remove_ignore_spaces:NTF }
-\cs_new_eq:NN \__xparse_grab_t_long:w \__xparse_grab_t:w
-\cs_new_protected:Npn \__xparse_grab_t_ignore_spaces:w
+  { \__xparse_grab_t_aux:NNw \__xparse_peek_nonspace_remove:NTF }
+\cs_new_protected:Npn \__xparse_grab_t_obey_spaces:w
   { \__xparse_grab_t_aux:NNw \peek_meaning_remove:NTF }
-\cs_new_eq:NN \__xparse_grab_t_long_ignore_spaces:w \__xparse_grab_t_ignore_spaces:w
 \cs_new_protected:Npn \__xparse_grab_t_aux:NNw #1#2#3 \__xparse_run_code:
   {
     \tl_set:Nn \l__xparse_signature_tl {#3}
@@ -1810,6 +1837,16 @@
       }
   }
 \cs_new:Npn \__xparse_cmd_if_xparse_aux:w #1 ~ #2 \q_stop {#1}
+\cs_new_protected:Npn \__xparse_peek_nonspace:NTF
+  { \__xparse_peek_nonspace_aux:nNNTF { } \peek_meaning:NTF }
+\cs_new_protected:Npn \__xparse_peek_nonspace_remove:NTF
+  { \__xparse_peek_nonspace_aux:nNNTF { } \peek_meaning_remove:NTF }
+\cs_new_protected:Npn \__xparse_peek_nonspace_aux:nNNTF #1#2#3#4#5
+  {
+    \peek_meaning_remove:NTF \c_space_token
+      { \__xparse_peek_nonspace_aux:nNNTF { #1 ~ } #2 #3 {#4} {#5} }
+      { #2 #3 { #4 } { #5 #1 } }
+  }
 \__kernel_msg_new:nnnn { xparse } { bad-arg-spec }
   { Bad~argument~specification~'#2'~for~command~'#1'. }
   {
@@ -1898,6 +1935,13 @@
     The~current~command~'#1'~expects~an~argument~starting~with~'#2'.~
     LaTeX~did~not~find~it,~and~will~insert~a~default~value~to~be~processed.
   }
+\__kernel_msg_new:nnnn { xparse } { non-trailing-obey-spaces }
+  { Prefix~'!'~used~before~mandatory~argument~'#2'~of~command~'#1'. }
+  {
+    The~prefix~'!'~can~only~apply~to~trailing~optional~arguments.
+    \\ \\
+    LaTeX~will~ignore~this~entire~definition.
+  }
 \__kernel_msg_new:nnnn { xparse } { non-xparse-command }
   { Command~'#1'~not~defined~using~xparse. }
   {
@@ -1959,6 +2003,12 @@
     This~cannot~be~implemented. \\ \\
     LaTeX~will~ignore~this~entire~definition.
   }
+\__kernel_msg_new:nnnn { xparse } { two-markers }
+  { Two~'#2'~apply~to~the~same~argument~in~argument~specification~of~command~'#1'. }
+  {
+    The~argument~specification~provided~has~two~markers~'#2'~applying~
+    to~the~same~argument;~these~are~redundant.
+  }
 \__kernel_msg_new:nnnn { xparse } { unknown-argument-type }
   { Unknown~argument~type~'#2'~for~the~command~'#1'. }
   {

Modified: trunk/Master/texmf-dist/tex/latex/l3packages/xtemplate/xtemplate.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3packages/xtemplate/xtemplate.sty	2018-09-24 20:21:13 UTC (rev 48748)
+++ trunk/Master/texmf-dist/tex/latex/l3packages/xtemplate/xtemplate.sty	2018-09-24 20:23:18 UTC (rev 48749)
@@ -36,7 +36,7 @@
       }%
     \endinput
   }
-\ProvidesExplPackage{xtemplate}{2018-08-23}{}
+\ProvidesExplPackage{xtemplate}{2018-09-24}{}
   {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