texlive[61040] trunk: l3 (12nov21)

commits+karl at tug.org commits+karl at tug.org
Sat Nov 13 00:04:14 CET 2021


Revision: 61040
          http://tug.org/svn/texlive?view=revision&revision=61040
Author:   karl
Date:     2021-11-13 00:04:14 +0100 (Sat, 13 Nov 2021)
Log Message:
-----------
l3 (12nov21)

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/l3experimental/CHANGELOG.md
    trunk/Master/texmf-dist/doc/latex/l3experimental/README.md
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3benchmark/l3benchmark.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3bitset/l3bitset.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw-code.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3graphics/l3graphics.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3opacity/l3opacity.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-format.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3sys-shell/l3sys-shell.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/xcoffins/xcoffins.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/xgalley/l3galley.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/xgalley/xgalley.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/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/l3news.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news01.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news02.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news03.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news04.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news05.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news06.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news07.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news08.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news09.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news10.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news11.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news12.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex
    trunk/Master/texmf-dist/doc/latex/l3kernel/source3.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex
    trunk/Master/texmf-dist/doc/latex/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-arguments.lua
    trunk/Master/texmf-dist/scripts/l3build/l3build-aux.lua
    trunk/Master/texmf-dist/scripts/l3build/l3build-check.lua
    trunk/Master/texmf-dist/scripts/l3build/l3build-clean.lua
    trunk/Master/texmf-dist/scripts/l3build/l3build-ctan.lua
    trunk/Master/texmf-dist/scripts/l3build/l3build-file-functions.lua
    trunk/Master/texmf-dist/scripts/l3build/l3build-help.lua
    trunk/Master/texmf-dist/scripts/l3build/l3build-install.lua
    trunk/Master/texmf-dist/scripts/l3build/l3build-manifest-setup.lua
    trunk/Master/texmf-dist/scripts/l3build/l3build-manifest.lua
    trunk/Master/texmf-dist/scripts/l3build/l3build-stdmain.lua
    trunk/Master/texmf-dist/scripts/l3build/l3build-tagging.lua
    trunk/Master/texmf-dist/scripts/l3build/l3build-typesetting.lua
    trunk/Master/texmf-dist/scripts/l3build/l3build-unpack.lua
    trunk/Master/texmf-dist/scripts/l3build/l3build-upload.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/l3experimental/l3benchmark/l3benchmark.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3bitset/l3bitset.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3opacity/l3opacity.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/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/l3cctab.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3color.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3debug.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/l3expan.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3file.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/l3legacy.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/l3pdf.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-convert.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/l3text-case.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3text.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/l3experimental/l3benchmark/l3benchmark.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3bitset/l3bitset.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3graphics/l3graphics.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3opacity/l3opacity.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3sys-shell/l3sys-shell.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty
    trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex
    trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex
    trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.ltx
    trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty
    trunk/Master/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty
    trunk/Master/texmf-dist/tex/latex/l3packages/xfp/xfp.sty
    trunk/Master/texmf-dist/tex/latex/l3packages/xfrac/xfrac.sty
    trunk/Master/texmf-dist/tex/latex/l3packages/xparse/xparse.sty
    trunk/Master/texmf-dist/tex/latex/l3packages/xtemplate/xtemplate.sty

Modified: trunk/Build/source/texk/texlive/linked_scripts/l3build/l3build.lua
===================================================================
--- trunk/Build/source/texk/texlive/linked_scripts/l3build/l3build.lua	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Build/source/texk/texlive/linked_scripts/l3build/l3build.lua	2021-11-12 23:04:14 UTC (rev 61040)
@@ -2,7 +2,7 @@
 
 --[[
 
-File l3build.lua Copyright (C) 2014-2020 The LaTeX Project
+File l3build.lua Copyright (C) 2014-2021 The LaTeX Project
 
 It may be distributed and/or modified under the conditions of the
 LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -25,7 +25,7 @@
 --]]
 
 -- Version information
-release_date = "2021-08-28"
+release_date = "2021-11-12"
 
 -- File operations are aided by the LuaFileSystem module
 local lfs = require("lfs")
@@ -201,7 +201,7 @@
 if #checkconfigs == 1 and
    checkconfigs[1] ~= "build" and
    (options["target"] == "check" or options["target"] == "save" or options["target"] == "clean") then
-   local config = "./" .. gsub(checkconfigs[1],".lua$","") .. ".lua"
+   local config = "./" .. gsub(checkconfigs[1],"%.lua$","") .. ".lua"
    if fileexists(config) then
      local savedtestfiledir = testfiledir
      dofile(config)

Modified: trunk/Master/texmf-dist/doc/latex/l3build/CHANGELOG.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3build/CHANGELOG.md	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/doc/latex/l3build/CHANGELOG.md	2021-11-12 23:04:14 UTC (rev 61040)
@@ -7,6 +7,14 @@
 
 ## [Unreleased]
 
+## [2021-11-12]
+
+### Changed
+- Documentation improvements
+
+### Fixed
+- Allow config names ending with 'lua', as long as they don't end with '.lua'
+
 ## [2021-08-28]
 
 ### Fixed
@@ -509,7 +517,8 @@
 - Rationalise short option names: removed `-d`, `-E`, `-r`
 - Target `cmdcheck`: specific to LaTeX kernel work
 
-[Unreleased]: https://github.com/latex3/l3build/compare/2021-08-28...HEAD
+[Unreleased]: https://github.com/latex3/l3build/compare/2021-11-12...HEAD
+[2021-11-12]: https://github.com/latex3/l3build/compare/2021-08-28...2021-11-12
 [2021-08-28]: https://github.com/latex3/l3build/compare/2021-08-27...2021-08-28
 [2021-08-27]: https://github.com/latex3/l3build/compare/2021-05-06...2021-08-27
 [2021-05-06]: https://github.com/latex3/l3build/compare/2021-05-05...2021-05-06

Modified: trunk/Master/texmf-dist/doc/latex/l3build/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3build/README.md	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/doc/latex/l3build/README.md	2021-11-12 23:04:14 UTC (rev 61040)
@@ -1,7 +1,7 @@
 l3build: a testing and building system for LaTeX
 =================================================
 
-Release 2021-08-28
+Release 2021-11-12
 
 Overview
 --------
@@ -31,6 +31,6 @@
 
 -----
 
-<p>Copyright (C) 2014-2020 The LaTeX Project <br />
+<p>Copyright (C) 2014-2021 The LaTeX Project <br />
 <a href="http://latex-project.org/">http://latex-project.org/</a> <br />
 All rights reserved.</p>

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

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/CHANGELOG.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3experimental/CHANGELOG.md	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/doc/latex/l3experimental/CHANGELOG.md	2021-11-12 23:04:14 UTC (rev 61040)
@@ -7,6 +7,11 @@
 
 ## [Unreleased]
 
+## [2021-11-12]
+
+### Added
+- `\draw_point_intersect_line_circle:nnnnn`
+
 ## [2021-08-27]
 
 ### Changed
@@ -226,7 +231,8 @@
 - New `l3color` module using `xcolor`-like expression syntax
 - New `l3draw` module, based on `pgf` layer of the TikZ system
 
-[Unreleased]: https://github.com/latex3/latex3/compare/2021-08-27...HEAD
+[Unreleased]: https://github.com/latex3/latex3/compare/2021-11-12...HEAD
+[2021-11-12]: https://github.com/latex3/latex3/compare/2021-08-27...2021-11-12
 [2021-08-27]: https://github.com/latex3/latex3/compare/2021-08-04...2021-08-27
 [2021-08-04]: https://github.com/latex3/latex3/compare/2021-07-12...2021-08-04
 [2021-07-12]: https://github.com/latex3/latex3/compare/2021-05-27...2021-07-12

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3experimental/README.md	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/doc/latex/l3experimental/README.md	2021-11-12 23:04:14 UTC (rev 61040)
@@ -1,7 +1,7 @@
 Experimental LaTeX3 Concepts
 ============================
 
-Release 2021-08-27
+Release 2021-11-12
 
 Overview
 --------

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

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

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

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

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

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

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

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

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

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

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

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md	2021-11-12 23:04:14 UTC (rev 61040)
@@ -7,6 +7,19 @@
 
 ## [Unreleased]
 
+## [2021-11-12]
+
+### Fixed
+- DeviceN colorspace conversions with alternative model RGB
+
+### Added
+- `.str_set:N`, etc., key properties (issue #1007)
+- `\bool_to_str:n` (issue #1010)
+
+### Changed
+- `\prop_..._from_keyval:Nn` functions now support active comma or
+  equal sign (pull #1012)
+
 ## [2021-10-18]
 
 ### Added
@@ -971,7 +984,8 @@
 - Step functions have been added for dim variables,
   e.g. `\dim_step_inline:nnnn`
 
-[Unreleased]: https://github.com/latex3/latex3/compare/2021-10-18...HEAD
+[Unreleased]: https://github.com/latex3/latex3/compare/2021-11-12...HEAD
+[2021-11-12]: https://github.com/latex3/latex3/compare/2021-10-18...2021-11-12
 [2021-10-18]: https://github.com/latex3/latex3/compare/2021-10-17...2021-10-18
 [2021-10-17]: https://github.com/latex3/latex3/compare/2021-10-12...2021-10-17
 [2021-10-12]: https://github.com/latex3/latex3/compare/2021-08-27...2021-10-12

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/README.md	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/README.md	2021-11-12 23:04:14 UTC (rev 61040)
@@ -1,7 +1,7 @@
 LaTeX3 Programming Conventions
 ==============================
 
-Release 2021-10-18
+Release 2021-11-12
 
 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	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex	2021-11-12 23:04:14 UTC (rev 61040)
@@ -54,7 +54,7 @@
          {latex-team at latex-project.org}%
    }%
 }
-\date{Released 2021-10-18}
+\date{Released 2021-11-12}
 
 \pagenumbering{roman}
 \maketitle

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.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	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex	2021-11-12 23:04:14 UTC (rev 61040)
@@ -32,7 +32,7 @@
         {latex-team at latex-project.org}%
     }%
 }
-\date{Released 2021-10-18}
+\date{Released 2021-11-12}
 
 \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	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex	2021-11-12 23:04:14 UTC (rev 61040)
@@ -32,7 +32,7 @@
         {latex-team at latex-project.org}%
     }%
 }
-\date{Released 2021-10-18}
+\date{Released 2021-11-12}
 
 \newcommand{\TF}{\textit{(TF)}}
 

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

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex	2021-11-12 23:04:14 UTC (rev 61040)
@@ -32,7 +32,7 @@
         {latex-team at latex-project.org}%
     }%
 }
-\date{Released 2021-10-18}
+\date{Released 2021-11-12}
 
 \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	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex	2021-11-12 23:04:14 UTC (rev 61040)
@@ -53,7 +53,7 @@
          {latex-team at latex-project.org}%
    }%
 }
-\date{Released 2021-10-18}
+\date{Released 2021-11-12}
 
 \pagenumbering{roman}
 \maketitle

Modified: trunk/Master/texmf-dist/doc/latex/l3packages/CHANGELOG.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3packages/CHANGELOG.md	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/doc/latex/l3packages/CHANGELOG.md	2021-11-12 23:04:14 UTC (rev 61040)
@@ -7,6 +7,11 @@
 
 ## [Unreleased]
 
+## [2021-11-12]
+
+### Added
+- Added `\NewCommandCopy` support for deprecated argument types.
+
 ## [2021-08-27]
 
 ### Changed
@@ -159,7 +164,8 @@
 - Switch to ISO date format
 - Improve cross-module use of internal functions
 
-[Unreleased]: https://github.com/latex3/latex3/compare/2021-08-27...HEAD
+[Unreleased]: https://github.com/latex3/latex3/compare/2021-11-12...HEAD
+[2021-11-12]: https://github.com/latex3/latex3/compare/2021-08-27...2021-11-12
 [2021-08-27]: https://github.com/latex3/latex3/compare/2021-08-04...2021-08-27
 [2021-08-04]: https://github.com/latex3/latex3/compare/2021-06-18...2021-08-04
 [2021-06-18]: https://github.com/latex3/latex3/compare/2021-06-01...2021-06-18

Modified: trunk/Master/texmf-dist/doc/latex/l3packages/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3packages/README.md	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/doc/latex/l3packages/README.md	2021-11-12 23:04:14 UTC (rev 61040)
@@ -1,7 +1,7 @@
 LaTeX3 High-Level Concepts
 ==========================
 
-Release 2021-08-27
+Release 2021-11-12
 
 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	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/doc/man/man1/l3build.1	2021-11-12 23:04:14 UTC (rev 61040)
@@ -1,4 +1,4 @@
-.TH l3build 1 "2021-08-28"
+.TH l3build 1 "2021-11-12"
 .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-arguments.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/l3build/l3build-arguments.lua	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/scripts/l3build/l3build-arguments.lua	2021-11-12 23:04:14 UTC (rev 61040)
@@ -1,6 +1,6 @@
 --[[
 
-File l3build-arguments.lua Copyright (C) 2018-2020 The LaTeX Project
+File l3build-arguments.lua Copyright (C) 2018-2021 The LaTeX Project
 
 It may be distributed and/or modified under the conditions of the
 LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -141,7 +141,7 @@
       },
     ["show-saves"] =
       {
-        desc  = "If tests fail, show the l3build save invocation to regenerate the tests",
+        desc  = "Show the invocation to update failing .tlg files",
         short = "S",
         type  = "boolean"
       },

Modified: trunk/Master/texmf-dist/scripts/l3build/l3build-aux.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/l3build/l3build-aux.lua	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/scripts/l3build/l3build-aux.lua	2021-11-12 23:04:14 UTC (rev 61040)
@@ -1,6 +1,6 @@
 --[[
 
-File l3build-aux.lua Copyright (C) 2018-2020 The LaTeX Project
+File l3build-aux.lua Copyright (C) 2018-2021 The LaTeX Project
 
 It may be distributed and/or modified under the conditions of the
 LaTeX Project Public License (LPPL), either version 1.3c of this

Modified: trunk/Master/texmf-dist/scripts/l3build/l3build-check.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/l3build/l3build-check.lua	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/scripts/l3build/l3build-check.lua	2021-11-12 23:04:14 UTC (rev 61040)
@@ -1,6 +1,6 @@
 --[[
 
-File l3build-check.lua Copyright (C) 2018-2020 The LaTeX Project
+File l3build-check.lua Copyright (C) 2018-2021 The LaTeX Project
 
 It may be distributed and/or modified under the conditions of the
 LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -548,6 +548,7 @@
       not match(line,"^%%%%Invocation") and
       not match(line,"^%%%%%+") then
       line = gsub(line,"%/ID( ?)%[<[^>]+><[^>]+>]","/ID%1[<ID-STRING><ID-STRING>]")
+      line = gsub(line,"%/ID( ?)%[(%b())%2%]","/ID%1[<ID-STRING><ID-STRING>]")
       new_content = new_content .. line .. os_newline
     end
   end

Modified: trunk/Master/texmf-dist/scripts/l3build/l3build-clean.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/l3build/l3build-clean.lua	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/scripts/l3build/l3build-clean.lua	2021-11-12 23:04:14 UTC (rev 61040)
@@ -1,6 +1,6 @@
 --[[
 
-File l3build-clean.lua Copyright (C) 2018,2020 The LaTeX Project
+File l3build-clean.lua Copyright (C) 2018,2020,2021 The LaTeX Project
 
 It may be distributed and/or modified under the conditions of the
 LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -77,4 +77,3 @@
         + rmdir(ctandir)
         + rmdir(tdsdir)
 end
-

Modified: trunk/Master/texmf-dist/scripts/l3build/l3build-ctan.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/l3build/l3build-ctan.lua	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/scripts/l3build/l3build-ctan.lua	2021-11-12 23:04:14 UTC (rev 61040)
@@ -1,6 +1,6 @@
 --[[
 
-File l3build-ctan.lua Copyright (C) 2018-2020 The LaTeX Project
+File l3build-ctan.lua Copyright (C) 2018-2021 The LaTeX Project
 
 It may be distributed and/or modified under the conditions of the
 LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -160,4 +160,3 @@
   end
   return errorlevel
 end
-

Modified: trunk/Master/texmf-dist/scripts/l3build/l3build-file-functions.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/l3build/l3build-file-functions.lua	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/scripts/l3build/l3build-file-functions.lua	2021-11-12 23:04:14 UTC (rev 61040)
@@ -1,6 +1,6 @@
 --[[
 
-File l3build-file-functions.lua Copyright (C) 2018-2020 The LaTeX Project
+File l3build-file-functions.lua Copyright (C) 2018-2021 The LaTeX Project
 
 It may be distributed and/or modified under the conditions of the
 LaTeX Project Public License (LPPL), either version 1.3c of this

Modified: trunk/Master/texmf-dist/scripts/l3build/l3build-help.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/l3build/l3build-help.lua	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/scripts/l3build/l3build-help.lua	2021-11-12 23:04:14 UTC (rev 61040)
@@ -1,6 +1,6 @@
 --[[
 
-File l3build-help.lua Copyright (C) 2018,2020 The LaTeX Project
+File l3build-help.lua Copyright (C) 2018,2020,2021 The LaTeX Project
 
 It may be distributed and/or modified under the conditions of the
 LaTeX Project Public License (LPPL), either version 1.3c of this

Modified: trunk/Master/texmf-dist/scripts/l3build/l3build-install.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/l3build/l3build-install.lua	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/scripts/l3build/l3build-install.lua	2021-11-12 23:04:14 UTC (rev 61040)
@@ -1,6 +1,6 @@
 --[[
 
-File l3build-install.lua Copyright (C) 2018-2020 The LaTeX Project
+File l3build-install.lua Copyright (C) 2018-2021 The LaTeX Project
 
 It may be distributed and/or modified under the conditions of the
 LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -234,11 +234,11 @@
     typesetlist = create_file_list(docfiledir,typesetfiles,{sourcefiles})
     sourcelist = create_file_list(sourcefiledir,sourcefiles,
       {bstfiles,installfiles,makeindexfiles,scriptfiles})
- 
+
   if dry_run then
     print("\nFor installation inside " .. target .. ":")
-  end 
-    
+  end
+
     errorlevel = create_install_map(sourcefiledir,"source",{sourcelist})
       + create_install_map(docfiledir,"doc",
           {bibfiles,demofiles,docfiles,pdffiles,textfiles,typesetlist})
@@ -290,8 +290,8 @@
   for _,v in ipairs(installmap) do
     errorlevel = cp(v.file,v.source,v.dest)
     if errorlevel ~= 0  then return errorlevel end
-  end 
-  
+  end
+
   return 0
 end
 

Modified: trunk/Master/texmf-dist/scripts/l3build/l3build-manifest-setup.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/l3build/l3build-manifest-setup.lua	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/scripts/l3build/l3build-manifest-setup.lua	2021-11-12 23:04:14 UTC (rev 61040)
@@ -1,6 +1,6 @@
 --[[
 
-File l3build-manifest-setup.lua Copyright (C) 2018,2020 The LaTeX Project
+File l3build-manifest-setup.lua Copyright (C) 2018,2020,2021 The LaTeX Project
 
 It may be distributed and/or modified under the conditions of the
 LaTeX Project Public License (LPPL), either version 1.3c of this

Modified: trunk/Master/texmf-dist/scripts/l3build/l3build-manifest.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/l3build/l3build-manifest.lua	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/scripts/l3build/l3build-manifest.lua	2021-11-12 23:04:14 UTC (rev 61040)
@@ -1,6 +1,6 @@
 --[[
 
-File l3build-manifest.lua Copyright (C) 2018,2020 The LaTeX Project
+File l3build-manifest.lua Copyright (C) 2018,2020,2021 The LaTeX Project
 
 It may be distributed and/or modified under the conditions of the
 LaTeX Project Public License (LPPL), either version 1.3c of this

Modified: trunk/Master/texmf-dist/scripts/l3build/l3build-stdmain.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/l3build/l3build-stdmain.lua	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/scripts/l3build/l3build-stdmain.lua	2021-11-12 23:04:14 UTC (rev 61040)
@@ -1,6 +1,6 @@
 --[[
 
-File l3build-stdmain.lua Copyright (C) 2018-2020 The LaTeX Project
+File l3build-stdmain.lua Copyright (C) 2018-2021 The LaTeX Project
 
 It may be distributed and/or modified under the conditions of the
 LaTeX Project Public License (LPPL), either version 1.3c of this

Modified: trunk/Master/texmf-dist/scripts/l3build/l3build-tagging.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/l3build/l3build-tagging.lua	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/scripts/l3build/l3build-tagging.lua	2021-11-12 23:04:14 UTC (rev 61040)
@@ -1,6 +1,6 @@
 --[[
 
-File l3build-tagging.lua Copyright (C) 2018-2020 The LaTeX Project
+File l3build-tagging.lua Copyright (C) 2018-2021 The LaTeX Project
 
 It may be distributed and/or modified under the conditions of the
 LaTeX Project Public License (LPPL), either version 1.3c of this

Modified: trunk/Master/texmf-dist/scripts/l3build/l3build-typesetting.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/l3build/l3build-typesetting.lua	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/scripts/l3build/l3build-typesetting.lua	2021-11-12 23:04:14 UTC (rev 61040)
@@ -1,6 +1,6 @@
 --[[
 
-File l3build-typesetting.lua Copyright (C) 2018-2020 The LaTeX Project
+File l3build-typesetting.lua Copyright (C) 2018-2021 The LaTeX Project
 
 It may be distributed and/or modified under the conditions of the
 LaTeX Project Public License (LPPL), either version 1.3c of this

Modified: trunk/Master/texmf-dist/scripts/l3build/l3build-unpack.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/l3build/l3build-unpack.lua	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/scripts/l3build/l3build-unpack.lua	2021-11-12 23:04:14 UTC (rev 61040)
@@ -1,6 +1,6 @@
 --[[
 
-File l3build-unpack.lua Copyright (C) 2018-2020 The LaTeX Project
+File l3build-unpack.lua Copyright (C) 2018-2021 The LaTeX Project
 
 It may be distributed and/or modified under the conditions of the
 LaTeX Project Public License (LPPL), either version 1.3c of this

Modified: trunk/Master/texmf-dist/scripts/l3build/l3build-upload.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/l3build/l3build-upload.lua	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/scripts/l3build/l3build-upload.lua	2021-11-12 23:04:14 UTC (rev 61040)
@@ -1,6 +1,6 @@
 --[[
 
-File l3build-upload.lua Copyright (C) 2018-2020 The LaTeX Project
+File l3build-upload.lua Copyright (C) 2018-2021 The LaTeX Project
 
 It may be distributed and/or modified under the conditions of the
 LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -145,10 +145,10 @@
   output(curlopt)
   write(ctan_post)
   close(curlopt)
-  
+
   ctan_post=curlexe .. " --config " .. curloptfile
-  
 
+
 if options["debug"] then
     ctan_post = ctan_post ..  ' https://httpbin.org/post'
     fp_return = shell(ctan_post)
@@ -254,7 +254,7 @@
   -- start building the curl command:
 -- commandline  ctan_post = curlexe .. " "
   ctan_post=""
-  
+
   -- build up the curl command field-by-field:
 
   --         field                                   max  desc                                 mandatory  multi

Modified: trunk/Master/texmf-dist/scripts/l3build/l3build-variables.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/l3build/l3build-variables.lua	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/scripts/l3build/l3build-variables.lua	2021-11-12 23:04:14 UTC (rev 61040)
@@ -1,6 +1,6 @@
 --[[
 
-File l3build-variables.lua Copyright (C) 2018-2020 The LaTeX Project
+File l3build-variables.lua Copyright (C) 2018-2021 The LaTeX Project
 
 It may be distributed and/or modified under the conditions of the
 LaTeX Project Public License (LPPL), either version 1.3c of this

Modified: trunk/Master/texmf-dist/scripts/l3build/l3build.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/l3build/l3build.lua	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/scripts/l3build/l3build.lua	2021-11-12 23:04:14 UTC (rev 61040)
@@ -2,7 +2,7 @@
 
 --[[
 
-File l3build.lua Copyright (C) 2014-2020 The LaTeX Project
+File l3build.lua Copyright (C) 2014-2021 The LaTeX Project
 
 It may be distributed and/or modified under the conditions of the
 LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -25,7 +25,7 @@
 --]]
 
 -- Version information
-release_date = "2021-08-28"
+release_date = "2021-11-12"
 
 -- File operations are aided by the LuaFileSystem module
 local lfs = require("lfs")
@@ -201,7 +201,7 @@
 if #checkconfigs == 1 and
    checkconfigs[1] ~= "build" and
    (options["target"] == "check" or options["target"] == "save" or options["target"] == "clean") then
-   local config = "./" .. gsub(checkconfigs[1],".lua$","") .. ".lua"
+   local config = "./" .. gsub(checkconfigs[1],"%.lua$","") .. ".lua"
    if fileexists(config) then
      local savedtestfiledir = testfiledir
      dofile(config)

Modified: trunk/Master/texmf-dist/source/latex/l3build/l3build.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3build/l3build.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3build/l3build.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -1,6 +1,6 @@
 % \iffalse
 %
-% File l3build.dtx (C) Copyright 2014-2020 The LaTeX Project
+% File l3build.dtx (C) Copyright 2014-2021 The LaTeX Project
 %
 % It may be distributed and/or modified under the conditions of the
 % LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -236,7 +236,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-08-28}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 % \tableofcontents
@@ -366,7 +366,7 @@
 % \item |--first| Name of the first test to run
 % \item |--force| (|-f|) Force checks to run even if sanity
 %   checks fail, \emph{e.g.}~when |--engine| is not given in
-%   \luavar{checkengines}
+%   \var{checkengines}
 % \item |--full| Instructs the \texttt{install} target to include the
 %   \texttt{doc} and \texttt{source} trees
 % \item |--halt-on-error| (|-H|) Specifies that checks
@@ -1087,7 +1087,7 @@
 %
 % To allow complex set up for tests, a hook |checkinit_hook()| is available
 % to be executed once all standard set up is complete but before any tests
-% are run.
+% are run. This should return an integer value: $0$ indicates no error.
 %
 % \subsection{Additional test tasks}
 %
@@ -1149,9 +1149,9 @@
 % \subsection{Epoch setting}
 %
 % To produce predictable output when using dates, the test system offers the
-% ability to set the epoch to a known value. The \luavar{epoch} variable may
+% ability to set the epoch to a known value. The \var{epoch} variable may
 % be given as a raw value (a simple integer) or as a date in ISO format.
-% The two flags \luavar{forcecheckepoch} and \luavar{forcedocepoch} then
+% The two flags \var{forcecheckepoch} and \var{forcedocepoch} then
 % determine whether this is applied in testing and typesetting, respectively.
 %
 % The epoch may also be given as a command line option, |-E|, which again
@@ -1309,7 +1309,7 @@
 % \end{itemize}
 %
 % For more complex set ups, this can be customised using the
-% \luavar{tdslocations} table. Each entry there should be a glob specifying the
+% \var{tdslocations} table. Each entry there should be a glob specifying the
 % TDS position of a file or files. Any files not specified in the table
 % will use the standard locations above. For example, to place some files
 % in the generic tree, some in the plain \TeX{} tree and some in the \LaTeX{}
@@ -1383,8 +1383,8 @@
 % As part of the overall build process, \pkg{l3build} will create PDF
 % documentation as described earlier. The standard build process for PDFs
 % will attempt to run Biber, \BibTeX{} and MakeIndex as appropriate
-% (the exact binaries used are defined by \luavar{biberexe}, \luavar{bibtexexe}
-% and \luavar{makeindexexe}). However, there is no attempt to create an entire
+% (the exact binaries used are defined by \var{biberexe}, \var{bibtexexe}
+% and \var{makeindexexe}). However, there is no attempt to create an entire
 % PDF creation system in the style of \texttt{latexmk} or similar.
 %
 % For package authors who have more complex requirements than those covered
@@ -1828,7 +1828,7 @@
 %  Rather than use this function, we recommend the replacement construct
 %  \begin{verbatim}
 %    io.popen(<cmd>,"w"):write(string.rep("y\n", 300)):close()
-%  \end{verbatim}   
+%  \end{verbatim}
 % \end{variable}
 %
 % \subsection{Components of \texttt{l3build}}

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -46,7 +46,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-08-27}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %
@@ -122,7 +122,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{l3benchmark}{2021-08-27}{}
+\ProvidesExplPackage{l3benchmark}{2021-11-12}{}
   {L3 Experimental benchmarking}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3bitset/l3bitset.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3bitset/l3bitset.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3bitset/l3bitset.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-08-27}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 % \begin{documentation}
@@ -264,7 +264,7 @@
 %<@@=bitset>
 %    \end{macrocode}
 %    \begin{macrocode}
-\ProvidesExplPackage{l3bitset}{2021-08-27}{}
+\ProvidesExplPackage{l3bitset}{2021-11-12}{}
   {L3 Experimental bitset support}
 %    \end{macrocode}
 % A bitset is a string variable.

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-08-27}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-08-27}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-08-27}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-08-27}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %
@@ -477,6 +477,137 @@
 % \end{macro}
 % \end{macro}
 %
+% \begin{macro}[EXP]{\draw_point_intersect_line_circle:nnnnn}
+% \begin{macro}[EXP]{\@@_point_intersect_line_circle_auxi:nnnnnnnn}
+% \begin{macro}[EXP]
+%   {
+%     \@@_point_intersect_line_circle_auxii:nnnnnnnn,
+%     \@@_point_intersect_line_circle_auxii:fnnnnnnn,
+%     \@@_point_intersect_line_circle_auxiii:nnnnnnnn,
+%     \@@_point_intersect_line_circle_auxiii:fffnnnnn
+%   }
+%  \begin{macro}[EXP]
+%    {
+%      \@@_point_intersect_line_circle_auxiv:nnnnnnnn,
+%      \@@_point_intersect_line_circle_auxiv:ffnnnnnn
+%    }
+%  \begin{macro}[EXP]
+%    {
+%      \@@_point_intersect_line_circle_auxv:nnnnn,
+%      \@@_point_intersect_line_circle_auxv:fnnnn
+%    }
+%   The intersection points~$P_{1}$ and~$P_{2}$ between
+%   a line joining points $(x_{1}, y_{1})$ and $(x_{2}, y_{2})$
+%   and a circle with center $(x_{3}, y_{3})$ and radius~$r$.
+%   We use the intermediate
+%   values
+%   \begin{align*}
+%     a &= (x_{2} - x_{1})^{2} + (y_{2} - y_{1})^{2} \\
+%     b &= 2 \times ((x_{2} - x_{1}) \times (x_{1} - x_{3}) + (y_{2} - y_{1}) \times (y_{1} - y_{3})) \\
+%     c &= x_{3}^{2} + y_{3}^{2} + x_{1}^{2} + y_{1}^{2}
+%          - 2\times(x_{3} \times x_{1} + y_{3} \times y_{1}) - r^{2} \\
+%     d &= b^{2} - 4\times a \times c \\
+%     \mu_{1} &= \frac{-b + \sqrt{d}}{2 \times a}\\
+%     \mu_{2} &= \frac{-b - \sqrt{d}}{2 \times a}
+%   \end{align*}
+%   in either
+%   \begin{align*}
+%     P_{1x} &= x_{1} + \mu_{1}\times (x_{2} - x_{1}) \\
+%     P_{1y} &= y_{1} + \mu_{1}\times (y_{2} - y_{1})
+%   \end{align*}
+%   or
+%   \begin{align*}
+%     P_{2x} &= x_{1} + \mu_{2}\times (x_{2} - x_{1}) \\
+%     P_{2y} &= y_{1} + \mu_{2}\times (y_{2} - y_{1})
+%   \end{align*}
+%   depending on which solution is required. The rest of the work is simply
+%   forcing the appropriate expansion and shuffling arguments.
+%    \begin{macrocode}
+\cs_new:Npn \draw_point_intersect_line_circle:nnnnn #1#2#3#4#5
+  {
+    \@@_point_process:nnnn
+      { \@@_point_intersect_line_circle_auxi:nnnnnnnn {#4} {#5} }
+      {#1} {#2} {#3}
+  }
+\cs_new:Npn \@@_point_intersect_line_circle_auxi:nnnnnnnn #1#2#3#4#5#6#7#8
+  {
+    \@@_point_intersect_line_circle_auxii:fnnnnnnn
+      { \fp_eval:n {#1} } {#3} {#4} {#5} {#6} {#7} {#8} {#2}
+  }
+%    \end{macrocode}
+%   At this stage we have all of the information we need, fully expanded:
+%   \begin{enumerate}[label = \#\arabic*, font = \ttfamily]
+%     \item $r$
+%     \item $x_{1}$
+%     \item $y_{1}$
+%     \item $x_{2}$
+%     \item $y_{2}$
+%     \item $x_{3}$
+%     \item $y_{3}$
+%     \item $n$
+%   \end{enumerate}
+%   Once we evaluate $a$, $b$ and $c$, the co-ordinate $(x_{3},y_{3})$
+%   and $r$ are no longer required: handy as we will need various
+%   intermediate values in the following.
+%    \begin{macrocode}
+\cs_new:Npn \@@_point_intersect_line_circle_auxii:nnnnnnnn #1#2#3#4#5#6#7#8
+  {
+    \@@_point_intersect_line_circle_auxiii:fffnnnnn
+      { \fp_eval:n { (#4-#2)*(#4-#2)+(#5-#3)*(#5-#3) } }
+      { \fp_eval:n { 2*((#4-#2)*(#2-#6)+(#5-#3)*(#3-#7)) } }
+      { \fp_eval:n { (#6*#6+#7*#7)+(#2*#2+#3*#3)-(2*(#6*#2+#7*#3))-(#1*#1) } }
+      {#2} {#3} {#4} {#5} {#8}
+  }
+\cs_generate_variant:Nn \@@_point_intersect_line_circle_auxii:nnnnnnnn { f }
+%    \end{macrocode}
+% then we can get $d = b^{2} - 4\times a \times c$ and the usage of $n$.
+%    \begin{macrocode}
+\cs_new:Npn \@@_point_intersect_line_circle_auxiii:nnnnnnnn #1#2#3#4#5#6#7#8
+  {
+    \@@_point_intersect_line_circle_auxiv:ffnnnnnn
+      { \fp_eval:n {  #2 * #2 - 4 * #1 * #3 } }
+      { \int_if_odd:nTF {#8} { 1 } { -1 } }
+      {#1} {#2} {#4} {#5} {#6} {#7}
+  }
+\cs_generate_variant:Nn \@@_point_intersect_line_circle_auxiii:nnnnnnnn { fff }
+%    \end{macrocode}
+%   We now have all of the intermediate values we require, with one division
+%   carried out up-front to avoid doing this expensive step twice:
+%   \begin{enumerate}[label = \#\arabic*, font = \ttfamily]
+%     \item $a$
+%     \item $b$
+%     \item $c$
+%     \item $d$
+%     \item $\pm$(the usage of $n$)
+%     \item $x_{1}$
+%     \item $y_{1}$
+%     \item $x_{2}$
+%     \item $y_{2}$
+%   \end{enumerate}
+%   There are some final pre-calculations,
+%   $\mu = \frac{-b \pm \sqrt{d}}{2 \times a}$
+%   then, we can yield a result.
+%    \begin{macrocode}
+\cs_new:Npn \@@_point_intersect_line_circle_auxiv:nnnnnnnn #1#2#3#4#5#6#7#8
+  {
+    \@@_point_intersect_line_circle_auxv:fnnnn
+      { \fp_eval:n { (-1 * #4 + #2 * sqrt(#1)) / (2 * #3) } }
+      {#5} {#6} {#7} {#8}
+  }
+\cs_generate_variant:Nn \@@_point_intersect_line_circle_auxiv:nnnnnnnn { ff }
+\cs_new:Npn \@@_point_intersect_line_circle_auxv:nnnnn #1#2#3#4#5
+  {
+    \draw_point:n
+      { #2 + #1 * (#4 - #2), #3 + #1 * (#5 - #3) }
+  }
+\cs_generate_variant:Nn \@@_point_intersect_line_circle_auxv:nnnnn { f }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
 % \subsection{Interpolation on a line (vector) or arc}
 %
 % \begin{macro}[EXP]{\draw_point_interpolate_line:nnn}

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-08-27}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-08-27}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-08-27}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-08-27}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -110,7 +110,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-08-27}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %
@@ -528,6 +528,17 @@
 %   \pkg{pgf}, which has the two centers then the two radii.
 % \end{function}
 %
+% \begin{function}[EXP]{\draw_point_intersect_line_circle:nnnnn}
+%   \begin{syntax}
+%     \cs{draw_point_intersect_line_circle:nnnnn}
+%       \Arg{point1} \Arg{point2} \Arg{center} \Arg{radius} \Arg{root}
+%   \end{syntax}
+%   Evaluates the point at the intersection of one line, joining
+%   \meta{point1} and \meta{point2}, and a circle with \meta{center}
+%   and \meta{radius}. If the lines and circle do not intersect and
+%   error will occur.
+% \end{function}
+%
 % \subsubsection{Interpolations}
 %
 % \begin{function}[EXP]{\draw_point_interpolate_line:nnn}
@@ -1162,7 +1173,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{l3draw}{2021-08-27}{}
+\ProvidesExplPackage{l3draw}{2021-11-12}{}
   {L3 Experimental core drawing support}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -46,7 +46,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-08-27}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %
@@ -240,7 +240,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{l3graphics}{2021-08-27}{}
+\ProvidesExplPackage{l3graphics}{2021-11-12}{}
   {L3 Experimental graphics inclusion support}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3opacity/l3opacity.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3opacity/l3opacity.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3opacity/l3opacity.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -46,7 +46,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-08-27}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %
@@ -97,7 +97,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{l3opacity}{2021-08-27}{}
+\ProvidesExplPackage{l3opacity}{2021-11-12}{}
   {L3 Experimental opacity support}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -48,7 +48,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-08-27}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %
@@ -166,7 +166,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{l3str-format}{2021-08-27}{}
+\ProvidesExplPackage{l3str-format}{2021-11-12}{}
   {L3 Experimental string formatting}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -46,7 +46,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-08-27}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %
@@ -151,7 +151,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{l3sys-shell}{2021-08-27}{}
+\ProvidesExplPackage{l3sys-shell}{2021-11-12}{}
   {L3 Experimental system shell functions}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -53,7 +53,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-08-27}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %
@@ -672,7 +672,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xcoffins}{2021-08-27}{}
+\ProvidesExplPackage{xcoffins}{2021-11-12}{}
   {L3 Experimental design level coffins}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -61,7 +61,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-08-27}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %
@@ -686,7 +686,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{l3galley}{2021-08-27}{}
+\ProvidesExplPackage{l3galley}{2021-11-12}{}
   {L3 Experimental galley code}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-08-27}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %
@@ -731,7 +731,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xgalley}{2021-08-27}{}
+\ProvidesExplPackage{xgalley}{2021-11-12}{}
   {L3 Experimental galley}
 \RequirePackage{xtemplate,l3galley}
 %    \end{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -24,7 +24,7 @@
 %
 %<*driver|generic|package|2ekernel>
 %</driver|generic|package|2ekernel>
-\def\ExplFileDate{2021-10-18}%
+\def\ExplFileDate{2021-11-12}%
 %<*driver>
 \documentclass[full]{l3doc}
 \usepackage{graphicx}
@@ -51,7 +51,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %
@@ -1203,7 +1203,7 @@
 %   Tests whether the \meta{control sequence} is currently free to
 %   be defined. This test is \texttt{false} if the
 %   \meta{control sequence} currently exists (as defined by
-%   \cs{cs_if_exist:N}).
+%   \cs{cs_if_exist:NTF}).
 % \end{function}
 %
 % \subsection{Primitive conditionals}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %
@@ -699,7 +699,7 @@
 %
 % \subsection{Category code table conditionals}
 %
-% \begin{macro}{\cctab_if_exist:N,\cctab_if_exist:c}
+% \begin{macro}[pTF]{\cctab_if_exist:N,\cctab_if_exist:c}
 %   Checks whether a \meta{cctab~var} is defined.
 %    \begin{macrocode}
 \prg_new_eq_conditional:NNn \cctab_if_exist:N \cs_if_exist:N

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3color.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3color.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3color.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %
@@ -654,20 +654,20 @@
     \tl_set:Nx #4
       {
         \cs_if_exist:cTF { @@_convert_ #1 _ #2 :w }
-          { \use:c { @@_convert_ #1 _ #2 :w } #3 ~ 0 ~ 0 ~ 0 \s_@@_stop }
+          { \use:c { @@_convert_ #1 _ #2 :w } #3 \s_@@_stop }
           { \use:c { c_@@_fallback_ #2 _tl } }
       }
   }
 \cs_generate_variant:Nn \@@_convert:nnnN { nV , nnV }
-\cs_new:Npn \@@_convert_gray_rgb:w #1 ~ #2 \s_@@_stop
+\cs_new:Npn \@@_convert_gray_rgb:w #1 \s_@@_stop
   { #1 ~ #1 ~ #1 }
-\cs_new:Npn \@@_convert_gray_cmyk:w #1 ~ #2 \s_@@_stop
+\cs_new:Npn \@@_convert_gray_cmyk:w #1 \s_@@_stop
   { 0 ~ 0 ~ 0 ~ \fp_eval:n { 1 - #1 } }
 %    \end{macrocode}
 %   These rather odd values are based on \textsc{ntsc} television: the set are
 %   used for the |cmyk| conversion.
 %    \begin{macrocode}
-\cs_new:Npn \@@_convert_rgb_gray:w #1 ~ #2 ~ #3 ~ #4 \s_@@_stop
+\cs_new:Npn \@@_convert_rgb_gray:w #1 ~ #2 ~ #3 \s_@@_stop
   { \fp_eval:n { 0.3 * #1 + 0.59 * #2 + 0.11 * #3 } }
 %    \end{macrocode}
 %   The conversion from |rgb| to |cmyk| is the most complex: a two-step
@@ -677,7 +677,7 @@
 %   Moreover, as the likelihood of anyone using a non-unitary matrix here is
 %   tiny, we simplify and treat those two concepts as no-ops.
 %    \begin{macrocode}
-\cs_new:Npn \@@_convert_rgb_cmyk:w #1 ~ #2 ~ #3 ~ #4 \s_@@_stop
+\cs_new:Npn \@@_convert_rgb_cmyk:w #1 ~ #2 ~ #3 \s_@@_stop
   {
     \exp_args:Nf \@@_convert_rgb_cmyk:nnnn
       { \fp_eval:n { min ( 1 - #1 , 1 - #2 , 1 - #3 ) } } {#1} {#2} {#3}
@@ -689,9 +689,9 @@
     \fp_eval:n { min ( 1 , max ( 0 , 1 - #4 - #1 ) ) } \c_space_tl
     #1
   }
-\cs_new:Npn \@@_convert_cmyk_gray:w #1 ~ #2 ~ #3 ~ #4 ~ #5 \s_@@_stop
+\cs_new:Npn \@@_convert_cmyk_gray:w #1 ~ #2 ~ #3 ~ #4 \s_@@_stop
   { \fp_eval:n { 1 - min ( 1 , 0.3 * #1 + 0.59 * #2 + 0.11 * #3 + #4 ) } }
-\cs_new:Npn \@@_convert_cmyk_rgb:w #1 ~ #2 ~ #3 ~ #4 ~ #5 \s_@@_stop
+\cs_new:Npn \@@_convert_cmyk_rgb:w #1 ~ #2 ~ #3 ~ #4 \s_@@_stop
   {
     \fp_eval:n { 1 - min ( 1 , #1 + #4 ) } \c_space_tl
     \fp_eval:n { 1 - min ( 1 , #2 + #4 ) } \c_space_tl
@@ -1664,7 +1664,10 @@
   {
     \fp_compare:nNnTF {#1} = { 0 }
       { 00 }
-      { \int_to_Hex:n { \fp_to_int:n { #1 * 255 } } }
+      {
+        \fp_compare:nNnT { #1 * 255 } < { 16 } { 0 }
+        \int_to_Hex:n { \fp_to_int:n { #1 * 255 } }
+      }
   }
 \cs_new_protected:cpn { @@_export_space-sep-rgb:Nw } #1#2 \s_@@_stop
   { \tl_set:Nn #1 {#2} }
@@ -1930,7 +1933,7 @@
   }
 \cs_new_protected:Npn \@@_model_separation_cmyk:nnnnnn #1#2#3#4#5#6
   {
-    \cs_new:cpn { @@_convert_ #1 _cmyk:w } ##1 ~ ##2 \s_@@_stop
+    \cs_new:cpn { @@_convert_ #1 _cmyk:w } ##1 \s_@@_stop
       {
          \fp_eval:n {##1 * #3} ~
          \fp_eval:n {##1 * #4} ~
@@ -1945,7 +1948,7 @@
   }
 \cs_new_protected:Npn \@@_model_separation_rgb:nnnnnn #1#2#3#4#5#6
   {
-    \cs_new:cpn { @@_convert_ #1 _rgb:w } ##1 ~ ##2 \s_@@_stop
+    \cs_new:cpn { @@_convert_ #1 _rgb:w } ##1 \s_@@_stop
       {
          \fp_eval:n {##1 * #3} ~
          \fp_eval:n {##1 * #4} ~
@@ -1959,7 +1962,7 @@
   }
 \cs_new_protected:Npn \@@_model_separation_gray:nnnnnn #1#2#3#4#5#6
   {
-    \cs_new:cpn { @@_convert_ #1 _cmyk:w } ##1 ~ ##2 \s_@@_stop
+    \cs_new:cpn { @@_convert_ #1 _cmyk:w } ##1 \s_@@_stop
       {
         \fp_eval:n {##1 * #3} ~
         \fp_eval:n {##1 * #3} ~
@@ -1966,9 +1969,9 @@
         \fp_eval:n {##1 * #3} ~
         \fp_eval:n {##1 * #3}
       }
-    \cs_new:cpn { @@_convert_ #1 _gray:w } ##1 ~ ##2 \s_@@_stop
+    \cs_new:cpn { @@_convert_ #1 _gray:w } ##1 \s_@@_stop
       { \fp_eval:n {##1 * #3} }
-    \cs_new:cpn { @@_convert_ #1 _rgb:w } ##1 ~ ##2 \s_@@_stop
+    \cs_new:cpn { @@_convert_ #1 _rgb:w } ##1 \s_@@_stop
       {
         \fp_eval:n {##1 * #3} ~
         \fp_eval:n {##1 * #3} ~
@@ -1982,11 +1985,11 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_model_convert:nnn #1#2#3
   {
-    \cs_new:cpx { @@_convert_ #1 _ #3 :w } ##1 ~ ##2 \s_@@_stop
+    \cs_new:cpx { @@_convert_ #1 _ #3 :w } ##1 \s_@@_stop
       {
         \exp_not:N \exp_args:NNe \exp_not:N \use:nn
         \exp_not:c { @@_convert_  #2 _ #3 :w }
-          { \exp_not:c { @@_convert_ #1 _ #2 :w } ##1 ~ ##2 \s_@@_stop }
+          { \exp_not:c { @@_convert_ #1 _ #2 :w } ##1 \s_@@_stop }
           \c_space_tl \exp_not:N \s_@@_stop
       }
   }
@@ -2018,11 +2021,11 @@
     \tl_if_exist:cTF { c_@@_model_whitepoint_CIELAB_ #1 _tl }
       {
         \@@_backend_separation_init_CIELAB:nnn {#1} {#3} { #4 ~ #5 ~ #6 }
-        \cs_new:cpn { @@_convert_ #2 _cmyk:w } ##1 ~ ##2 \s_@@_stop
+        \cs_new:cpn { @@_convert_ #2 _cmyk:w } ##1 \s_@@_stop
           { 0 ~ 0 ~ 0 ~ 1 }
-        \cs_new:cpn { @@_convert_ #2 _rgb:w } ##1 ~ ##2 \s_@@_stop
+        \cs_new:cpn { @@_convert_ #2 _rgb:w } ##1 \s_@@_stop
           { 1 ~ 1 ~ 1 }
-        \cs_new:cpn { @@_convert_ #2 _gray:w } ##1 ~ ##2 \s_@@_stop
+        \cs_new:cpn { @@_convert_ #2 _gray:w } ##1 \s_@@_stop
           { 1 }
       }
       {
@@ -2311,7 +2314,7 @@
         \prop_get:NnN \g_@@_alternative_values_prop {##1}
           \l_@@_value_tl
         \exp_after:wN \@@_model_devicen_transform:w
-          \l_@@_value_tl , 0 , 0 , 0 \s_@@_stop {#1} {#2}
+          \l_@@_value_tl , 0 , 0 , 0 , \s_@@_stop {#1} {#2}
       }
     \tl_put_right:Nx \l_@@_internal_tl
       {
@@ -2349,7 +2352,7 @@
   { \@@_model_devicen_transform:nnn {#5} { 1 } {#1} }
 \cs_new_protected:cpn { @@_model_devicen_transform_3:nnnnn } #1#2#3#4#5
   {
-    \clist_map_inline { #1 , #2 , #3 }
+    \clist_map_inline:nn { #1 , #2 , #3 }
       { \@@_model_devicen_transform:nnn {#5} { 3 } {##1} }
   }
 \cs_new_protected:cpn { @@_model_devicen_transform_4:nnnnn } #1#2#3#4#5
@@ -2407,8 +2410,9 @@
       {
         \exp_not:c { @@_convert_devicen_ #2 : \prg_replicate:nn {#3} { n } w }
           \prg_replicate:nn {#3} { { 1 } }
-          ##1 \exp_not:N \s_@@_mark
+          ##1 ~ \exp_not:N \s_@@_mark
           \clist_map_function:nN {#4} \@@_model_devicen_convert:n
+          {}
           \exp_not:N \s_@@_stop
       }
   }
@@ -2490,7 +2494,7 @@
 \cs_new:Npn \@@_convert_devicen_rgb:nnnw
   #1#2#3#4 ~ #5 \s_@@_mark #6#7 \s_@@_stop
   {
-    \@@_convert_devicen_cmyk:nnnnnn {#4} {#1} {#2} {#3} #6
+    \@@_convert_devicen_rgb:nnnnnnn {#4} {#1} {#2} {#3} #6
       #5 \s_@@_mark #7 \s_@@_stop
   }
 \cs_new:Npn \@@_convert_devicen_rgb:nnnnnnn #1#2#3#4#5#6#7

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -79,7 +79,7 @@
 %
 % \title{The \cls{l3doc} class}
 % \author{\Team}
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 % \maketitle
 % \tableofcontents
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -63,7 +63,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %
@@ -876,8 +876,8 @@
 %     \cs{file_if_exist_input:nF} \Arg{file name} \Arg{false code}
 %   \end{syntax}
 %   Searches for \meta{file name} using the current \TeX{} search
-%   path and the additional paths controlled by
-%   \cs{file_path_include:n}. If found then
+%   path and the additional paths included in \cs{l_file_search_path_seq}.
+%   If found then
 %   reads in the file as additional \LaTeX{} source as described for
 %   \cs{file_input:n}, otherwise inserts the \meta{false code}.
 %   Note that these functions do not raise

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 % \maketitle
 %
 % \begin{documentation}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %
@@ -1000,8 +1000,7 @@
 \cs_new:Npn \@@_pow_normal_o:ww
     \s_@@ \@@_chk:w 1 #1#2#3; \s_@@ \@@_chk:w #4#5
   {
-    \if_int_compare:w \@@_str_if_eq:nn { #2 #3 }
-              { 1 {1000} {0000} {0000} {0000} } = \c_zero_int
+    \if:w 0 \@@_str_if_eq:nn { #2 #3 } { 1 {1000} {0000} {0000} {0000} }
       \if_int_compare:w #4 #1 = 32 \exp_stop_f:
         \exp_after:wN \@@_case_return_ii_o:ww
       \fi:

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %
@@ -1755,9 +1755,7 @@
   {
     \if_catcode:w \scan_stop: \exp_not:N #1
       \if_meaning:w \scan_stop: #1
-        \if_int_compare:w
-            \@@_str_if_eq:nn { \s_@@ } { \exp_not:N #1 }
-            = \c_zero_int
+        \if:w 0 \@@_str_if_eq:nn { \s_@@ } { \exp_not:N #1 }
           0
           \msg_expandable_error:nnn
             { fp } { after-e } { floating~point~ }
@@ -1769,9 +1767,7 @@
           \prg_return_false:
         \fi:
       \else:
-        \if_int_compare:w
-            \@@_str_if_eq:nn { \int_value:w #1 } { \tex_the:D #1 }
-            = \c_zero_int
+        \if:w 0 \@@_str_if_eq:nn { \int_value:w #1 } { \tex_the:D #1 }
           \int_value:w #1
         \else:
           0
@@ -2263,9 +2259,7 @@
 \cs_new:Npn \@@_parse_infix:NN #1 #2
   {
     \if_catcode:w \scan_stop: \exp_not:N #2
-      \if_int_compare:w
-          \@@_str_if_eq:nn { \s_@@_expr_mark } { \exp_not:N #2 }
-          = \c_zero_int
+      \if:w 0 \@@_str_if_eq:nn { \s_@@_expr_mark } { \exp_not:N #2 }
         \exp_after:wN \exp_after:wN
         \exp_after:wN \@@_parse_infix_mark:NNN
       \else:
@@ -2315,9 +2309,7 @@
 \cs_new:Npn \@@_parse_infix_after_paren:NN #1 #2
   {
     \if_catcode:w \scan_stop: \exp_not:N #2
-      \if_int_compare:w
-          \@@_str_if_eq:nn { \s_@@_expr_mark } { \exp_not:N #2 }
-          = \c_zero_int
+      \if:w 0 \@@_str_if_eq:nn { \s_@@_expr_mark } { \exp_not:N #2 }
         \exp_after:wN \exp_after:wN
         \exp_after:wN \@@_parse_infix_mark:NNN
       \else:

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 % \maketitle
 %
 % \begin{documentation}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -49,7 +49,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %
@@ -178,10 +178,10 @@
 % \begin{function}[updated = 2013-07-08]
 %   {.bool_set:N, .bool_set:c, .bool_gset:N, .bool_gset:c}
 %   \begin{syntax}
-%     \meta{key} .bool_set:N = \meta{boolean}
+%     \meta{key} .bool_set:N = \meta{boolean variable}
 %   \end{syntax}
-%   Defines \meta{key} to set \meta{boolean} to \meta{value} (which
-%   must be either \texttt{true} or \texttt{false}).  If the variable
+%   Defines \meta{key} to set \meta{boolean variable} to \meta{value} (which
+%   must be either \enquote{\texttt{true}} or \enquote{\texttt{false}}).  If the variable
 %   does not exist, it will be created globally at the point that
 %   the key is set up.
 % \end{function}
@@ -192,12 +192,12 @@
 %     .bool_gset_inverse:N, .bool_gset_inverse:c
 %   }
 %   \begin{syntax}
-%     \meta{key} .bool_set_inverse:N = \meta{boolean}
+%     \meta{key} .bool_set_inverse:N = \meta{boolean variable}
 %   \end{syntax}
-%   Defines \meta{key} to set \meta{boolean} to the logical
-%   inverse of \meta{value} (which  must be either \texttt{true} or
-%   \texttt{false}).
-%   If the \meta{boolean} does not exist, it will be created globally
+%   Defines \meta{key} to set \meta{boolean variable} to the logical
+%   inverse of \meta{value} (which  must be either \enquote{\texttt{true}} or
+%   \enquote{\texttt{false}}).
+%   If the \meta{boolean variable} does not exist, it will be created globally
 %   at the point that the key is set up.
 % \end{function}
 %
@@ -435,6 +435,27 @@
 %   require a value at point-of-use unless a default is set.
 % \end{function}
 %
+% \begin{function}[added = 2021-10-30]
+%   {.str_set:N, .str_set:c, .str_gset:N, .str_gset:c}
+%   \begin{syntax}
+%     \meta{key} .str_set:N = \meta{string variable}
+%   \end{syntax}
+%   Defines \meta{key} to set \meta{string variable} to \meta{value}.
+%   If the variable does not exist, it is created globally
+%   at the point that the key is set up.
+% \end{function}
+%
+% \begin{function}[added = 2021-10-30]
+%   {.str_set_x:N, .str_set_x:c, .str_gset_x:N, .str_gset_x:c}
+%   \begin{syntax}
+%     \meta{key} .str_set_x:N = \meta{string variable}
+%   \end{syntax}
+%   Defines \meta{key} to set \meta{string variable} to \meta{value},
+%   which will be subjected to an \texttt{x}-type expansion
+%   (\emph{i.e.}~using \cs{str_set:Nx}). If the variable does not exist,
+%   it is created globally at the point that the key is set up.
+% \end{function}
+%
 % \begin{function}{.tl_set:N, .tl_set:c, .tl_gset:N, .tl_gset:c}
 %   \begin{syntax}
 %     \meta{key} .tl_set:N = \meta{token list variable}
@@ -467,7 +488,7 @@
 %   \end{syntax}
 %   Specifies that \meta{key} cannot receive a \meta{value} when used.
 %   If a \meta{value} is given then an error will be issued. Setting
-%   the property \texttt{false} cancels the restriction.
+%   the property \enquote{\texttt{false}} cancels the restriction.
 % \end{function}
 %
 % \begin{function}[added = 2015-07-14]{.value_required:n}
@@ -476,7 +497,7 @@
 %   \end{syntax}
 %   Specifies that \meta{key} must receive a \meta{value} when used.
 %   If a \meta{value} is not given then an error will be issued. Setting
-%   the property \texttt{false} cancels the restriction.
+%   the property \enquote{\texttt{false}} cancels the restriction.
 % \end{function}
 %
 % \section{Sub-dividing keys}
@@ -1001,6 +1022,16 @@
 %    \end{macrocode}
 % \end{variable}
 %
+% \begin{variable}{\l__kernel_keyval_allow_blank_keys_bool}
+%   The general behavior of the \pkg{l3keys} module is to throw an error on
+%   blank key names. However to support the usage of \cs{keyval_parse:nnn} in
+%   the \pkg{l3prop} module we allow this error to be switched off temporarily
+%   and just ignore blank names.
+%    \begin{macrocode}
+\bool_new:N \l__kernel_keyval_allow_blank_keys_bool
+%    \end{macrocode}
+% \end{variable}
+%
 %   This temporary macro will be used since some of the definitions will need an
 %   active comma or equals sign. Inside of this macro |#1| will be the active
 %   comma and |#2| will be the active equals sign.
@@ -1343,9 +1374,11 @@
 %    \begin{macrocode}
 \cs_new:Npn \@@_blank_true:w \s_@@_mark \s_@@_stop \@@_trim:nN #1 \@@_key:nn
   { \@@_loop_other:nnw }
-\cs_new:Npn \@@_blank_key_error:w #1 \@@_loop_other:nnw
+\cs_new:Npn \@@_blank_key_error:w \s_@@_mark \s_@@_stop #1 \@@_loop_other:nnw
   {
-    \msg_expandable_error:nn { keyval } { blank-key-name }
+    \bool_if:NTF \l__kernel_keyval_allow_blank_keys_bool
+      { #1 }
+      { \msg_expandable_error:nn { keyval } { blank-key-name } }
     \@@_loop_other:nnw
   }
 %    \end{macrocode}
@@ -2052,7 +2085,7 @@
       }
       {
         \msg_error:nnx { keys }
-          { property-boolean-values-only }
+          { boolean-values-only }
           { .value_ #1 :n }
       }
   }
@@ -2398,6 +2431,34 @@
 % \end{macro}
 % \end{macro}
 %
+% \begin{macro}{.str_set:N, .str_set:c}
+% \begin{macro}{.str_gset:N, .str_gset:c}
+% \begin{macro}{.str_set_x:N, .str_set_x:c}
+% \begin{macro}{.str_gset_x:N, .str_gset_x:c}
+%   Setting a variable is very easy: just pass the data along.
+%    \begin{macrocode}
+\cs_new_protected:cpn { \c_@@_props_root_str .str_set:N } #1
+  { \@@_variable_set:NnnN #1 { str } { } n }
+\cs_new_protected:cpn { \c_@@_props_root_str .str_set:c } #1
+  { \@@_variable_set:cnnN {#1} { str } { } n }
+\cs_new_protected:cpn { \c_@@_props_root_str .str_set_x:N } #1
+  { \@@_variable_set:NnnN #1 { str } { } x }
+\cs_new_protected:cpn { \c_@@_props_root_str .str_set_x:c } #1
+  { \@@_variable_set:cnnN {#1} { str } { } x }
+\cs_new_protected:cpn { \c_@@_props_root_str .str_gset:N } #1
+  { \@@_variable_set:NnnN #1 { str } { g } n }
+\cs_new_protected:cpn { \c_@@_props_root_str .str_gset:c } #1
+  { \@@_variable_set:cnnN {#1} { str } { g } n }
+\cs_new_protected:cpn { \c_@@_props_root_str .str_gset_x:N } #1
+  { \@@_variable_set:NnnN #1 { str } { g } x }
+\cs_new_protected:cpn { \c_@@_props_root_str .str_gset_x:c } #1
+  { \@@_variable_set:cnnN {#1} { str } { g } x }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
 % \begin{macro}{.tl_set:N, .tl_set:c}
 % \begin{macro}{.tl_gset:N, .tl_gset:c}
 % \begin{macro}{.tl_set_x:N, .tl_set_x:c}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %
@@ -1979,7 +1979,7 @@
 \msg_new:nnn { prg } { negative-replication }
   { Negative~argument~for~\iow_char:N\\prg_replicate:nn. }
 \msg_new:nnn { prop } { prop-keyval }
-  { Missing/extra~'='~in~'#1'~(in~'..._keyval:Nn') }
+  { Missing~'='~in~'#1'~(in~'..._keyval:Nn') }
 \msg_new:nnn { kernel } { unknown-comparison }
   { Relation~'#1'~not~among~=,<,>,==,!=,<=,>=. }
 \msg_new:nnn { kernel } { zero-step }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3pdf.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3pdf.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3pdf.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %
@@ -313,6 +313,16 @@
 %   based on this result.
 % \end{function}
 %
+% \begin{function}[EXP, added = 2021-11-01]{\bool_to_str:N, \bool_to_str:c, \bool_to_str:n}
+%   \begin{syntax}
+%     \cs{bool_to_str:N} \meta{boolean}
+%     \cs{bool_to_str:n} \meta{boolean expression}
+%   \end{syntax}
+%   Expands to the letters \texttt{true} or \texttt{false} depending on
+%   the logical truth of the \meta{boolean} or \meta{boolean
+%   expression}.
+% \end{function}
+%
 % \begin{function}[added = 2012-02-09, updated = 2021-04-29]{\bool_show:N, \bool_show:c}
 %   \begin{syntax}
 %     \cs{bool_show:N} \meta{boolean}
@@ -961,20 +971,24 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}[EXP]{\bool_to_str:N, \bool_to_str:c, \bool_to_str:n}
+%   Expands to \texttt{true} or \texttt{false} with category code letter.
+%    \begin{macrocode}
+\cs_new:Npn \bool_to_str:N #1 { \bool_if:NTF #1 { true } { false } }
+\cs_generate_variant:Nn \bool_to_str:N { c }
+\cs_new:Npn \bool_to_str:n #1 { \bool_if:nTF {#1} { true } { false } }
+%    \end{macrocode}
+% \end{macro}
+%
 % \begin{macro}{\bool_show:n, \bool_log:n}
-% \begin{macro}{\@@_to_str:n}
-%   Show the truth value of the boolean, as \texttt{true} or
-%   \texttt{false}.
+%   Show the truth value of the boolean.
 %    \begin{macrocode}
 \cs_new_protected:Npn \bool_show:n
-  { \msg_show_eval:Nn \@@_to_str:n }
+  { \msg_show_eval:Nn \bool_to_str:n }
 \cs_new_protected:Npn \bool_log:n
-  { \msg_log_eval:Nn \@@_to_str:n }
-\cs_new:Npn \@@_to_str:n #1
-  { \bool_if:nTF {#1} { true } { false } }
+  { \msg_log_eval:Nn \bool_to_str:n }
 %    \end{macrocode}
 % \end{macro}
-% \end{macro}
 %
 % \begin{macro}{\bool_show:N, \bool_show:c, \bool_log:N, \bool_log:c, \@@_show:NN}
 %   Show the truth value of the boolean, as \texttt{true} or

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %
@@ -52,10 +52,10 @@
 % \LaTeX3 implements a \enquote{property list} data type, which contain
 % an unordered list of entries each of which consists of a \meta{key} and
 % an associated \meta{value}. The \meta{key} and \meta{value} may both
-% be any \meta{balanced text}, but the \meta{key} is processed using
-% \cs{tl_to_str:n}, meaning that category codes are ignored. It is
-% possible to map functions to property lists such that the function is
-% applied to every key--value pair within the list.
+% be any \meta{balanced text}, the \meta{key} is processed using
+% \cs{tl_to_str:n}, meaning that category codes are ignored. It is possible to
+% map functions to property lists such that the function is applied to every
+% key--value pair within the list.
 %
 % Each entry in a property list must have a unique \meta{key}: if an entry is
 % added to a property list which already contains the \meta{key} then the new
@@ -111,7 +111,7 @@
 %   \meta{property list_2}.
 % \end{function}
 %
-% \begin{function}[added = 2017-11-28, updated = 2019-08-25]
+% \begin{function}[added = 2017-11-28, updated = 2021-11-07]
 %   {
 %     \prop_set_from_keyval:Nn, \prop_set_from_keyval:cn,
 %     \prop_gset_from_keyval:Nn, \prop_gset_from_keyval:cn,
@@ -131,9 +131,11 @@
 %   group then a set of outer braces is removed.  This enables both the
 %   \meta{key} and the \meta{value} to contain spaces, commas or equal
 %   signs.  The \meta{key} is then processed by \cs{tl_to_str:n}.
+%   This function correctly detects the |=| and |,| signs provided they
+%   have the standard category code~$12$ or they are active.
 % \end{function}
 %
-% \begin{function}[added = 2017-11-28, updated = 2019-08-25]
+% \begin{function}[added = 2017-11-28, updated = 2021-11-07]
 %   {\prop_const_from_keyval:Nn, \prop_const_from_keyval:cn}
 %   \begin{syntax}
 %     \cs{prop_const_from_keyval:Nn} \meta{prop~var}
@@ -147,6 +149,8 @@
 %   contain key--value pairs given in the second argument, processed in
 %   the way described for \cs{prop_set_from_keyval:Nn}.  If duplicate
 %   keys appear only the last of the values is kept.
+%   This function correctly detects the |=| and |,| signs provided they
+%   have the standard category code~$12$ or they are active.
 % \end{function}
 %
 % \section{Adding and updating property list entries}
@@ -205,7 +209,7 @@
 %   last value, namely the value in \meta{prop~var_3} is kept.
 % \end{function}
 %
-% \begin{function}[added = 2021-05-16]
+% \begin{function}[added = 2021-05-16, updated = 2021-11-07]
 %   {
 %     \prop_put_from_keyval:Nn, \prop_put_from_keyval:cn,
 %     \prop_gput_from_keyval:Nn, \prop_gput_from_keyval:cn,
@@ -230,6 +234,8 @@
 %   \cs{prop_concat:NNN}.  In particular, the \meta{keys} and
 %   \meta{values} are space-trimmed and unbraced as described in
 %   \cs{prop_set_from_keyval:Nn}.
+%   This function correctly detects the |=| and |,| signs provided they
+%   have the standard category code~$12$ or they are active.
 % \end{function}
 %
 % \section{Recovering values from property lists}
@@ -793,7 +799,7 @@
 \cs_new_protected:Npn \@@_concat:NNNN #1#2#3#4
   {
     \prop_set_eq:NN \l_@@_internal_prop #3
-    \prop_map_tokens:Nn #4 { \prop_put:Nnn \l_@@_internal_prop }
+    \prop_map_inline:Nn #4 { \prop_put:Nnn \l_@@_internal_prop {##1} {##2} }
     #1 #2 \l_@@_internal_prop
   }
 %    \end{macrocode}
@@ -804,16 +810,7 @@
 % \begin{macro}{\prop_const_from_keyval:Nn, \prop_const_from_keyval:cn}
 % \begin{macro}{\prop_put_from_keyval:Nn, \prop_put_from_keyval:cn}
 % \begin{macro}{\prop_gput_from_keyval:Nn, \prop_gput_from_keyval:cn}
-% \begin{macro}
-%   {
-%     \@@_from_keyval:n,
-%     \@@_from_keyval_loop:w,
-%     \@@_from_keyval_split:Nw,
-%     \@@_from_keyval_key:n,
-%     \@@_from_keyval_key:w,
-%     \@@_from_keyval_value:n,
-%     \@@_from_keyval_value:w
-%   }
+% \begin{macro}{\@@_missing_eq:n}
 %   To avoid tracking throughout the loop the variable name and whether
 %   the assignment is local/global, do everything in a scratch variable
 %   and empty it afterwards to avoid wasting memory.  Loop through items
@@ -832,81 +829,49 @@
 %   output one key--value pair for the property list; otherwise complain
 %   about a missing or extra~|=|.
 %    \begin{macrocode}
-\cs_new_protected:Npn \prop_set_from_keyval:Nn #1#2
+\cs_new_protected:Npn \prop_set_from_keyval:Nn #1
   {
-    \prop_clear:N \l_@@_internal_prop
-    \@@_from_keyval:n {#2}
-    \prop_set_eq:NN #1 \l_@@_internal_prop
-    \prop_clear:N \l_@@_internal_prop
+    \prop_clear:N #1
+    \prop_put_from_keyval:Nn #1
   }
 \cs_generate_variant:Nn \prop_set_from_keyval:Nn { c }
-\cs_new_protected:Npn \prop_gset_from_keyval:Nn #1#2
+\cs_new_protected:Npn \prop_gset_from_keyval:Nn #1
   {
-    \prop_clear:N \l_@@_internal_prop
-    \@@_from_keyval:n {#2}
-    \prop_gset_eq:NN #1 \l_@@_internal_prop
-    \prop_clear:N \l_@@_internal_prop
+    \prop_gclear:N #1
+    \prop_gput_from_keyval:Nn #1
   }
 \cs_generate_variant:Nn \prop_gset_from_keyval:Nn { c }
 \cs_new_protected:Npn \prop_const_from_keyval:Nn #1#2
   {
-    \prop_clear:N \l_@@_internal_prop
-    \@@_from_keyval:n {#2}
+    \prop_set_from_keyval:Nn \l_@@_internal_prop {#2}
     \tl_const:Nx #1 { \exp_not:o \l_@@_internal_prop }
     \prop_clear:N \l_@@_internal_prop
   }
 \cs_generate_variant:Nn \prop_const_from_keyval:Nn { c }
-\cs_new_protected:Npn \prop_put_from_keyval:Nn #1#2
+\cs_new_protected:Npn \prop_put_from_keyval:Nn
   {
-    \prop_set_eq:NN \l_@@_internal_prop #1
-    \@@_from_keyval:n {#2}
-    \prop_set_eq:NN #1 \l_@@_internal_prop
-    \prop_clear:N \l_@@_internal_prop
+    \bool_if:NTF \l__kernel_keyval_allow_blank_keys_bool
+      { \@@_keyval_parse:NNNn \c_true_bool }
+      { \@@_keyval_parse:NNNn \c_false_bool }
+      \prop_put:Nnn
   }
 \cs_generate_variant:Nn \prop_put_from_keyval:Nn { c }
-\cs_new_protected:Npn \prop_gput_from_keyval:Nn #1#2
+\cs_new_protected:Npn \prop_gput_from_keyval:Nn
   {
-    \prop_set_eq:NN \l_@@_internal_prop #1
-    \@@_from_keyval:n {#2}
-    \prop_gset_eq:NN #1 \l_@@_internal_prop
-    \prop_clear:N \l_@@_internal_prop
+    \bool_if:NTF \l__kernel_keyval_allow_blank_keys_bool
+      { \@@_keyval_parse:NNNn \c_true_bool }
+      { \@@_keyval_parse:NNNn \c_false_bool }
+      \prop_gput:Nnn
   }
 \cs_generate_variant:Nn \prop_gput_from_keyval:Nn { c }
-\cs_new_protected:Npn \@@_from_keyval:n #1
+\cs_new_protected:Npn \@@_missing_eq:n
+  { \msg_error:nnn { prop } { prop-keyval } }
+\cs_new_protected:Npn \@@_keyval_parse:NNNn #1#2#3#4
   {
-    \@@_from_keyval_loop:w \prg_do_nothing: #1 ,
-      \q_@@_recursion_tail , \q_@@_recursion_stop
+    \bool_set_eq:NN \l__kernel_keyval_allow_blank_keys_bool \c_true_bool
+    \keyval_parse:nnn \@@_missing_eq:n { #2 #3 } {#4}
+    \bool_set_eq:NN \l__kernel_keyval_allow_blank_keys_bool #1
   }
-\cs_new_protected:Npn \@@_from_keyval_loop:w #1 ,
-  {
-    \@@_if_recursion_tail_stop:o {#1}
-    \@@_from_keyval_split:Nw \@@_from_keyval_key:n
-      #1 = = \s_@@_stop {#1}
-    \@@_from_keyval_loop:w \prg_do_nothing:
-  }
-\cs_new_protected:Npn \@@_from_keyval_split:Nw #1#2 =
-  { \tl_trim_spaces_apply:oN {#2} #1 }
-\cs_new_protected:Npn \@@_from_keyval_key:n #1
-  { \@@_from_keyval_key:w #1 \s_@@_mark }
-\cs_new_protected:Npn \@@_from_keyval_key:w #1 \s_@@_mark #2 \s_@@_stop
-  {
-    \@@_from_keyval_split:Nw \@@_from_keyval_value:n
-      \prg_do_nothing: #2 \s_@@_stop {#1}
-  }
-\cs_new_protected:Npn \@@_from_keyval_value:n #1
-  { \@@_from_keyval_value:w #1 \s_@@_mark }
-\cs_new_protected:Npn \@@_from_keyval_value:w #1 \s_@@_mark #2 \s_@@_stop #3#4
-  {
-    \tl_if_single:nTF {#2}
-      { \prop_put:Nnn \l_@@_internal_prop {#3} {#1} }
-      {
-        \tl_if_empty:nF { #3 #1 #2 }
-          {
-            \msg_error:nnx { prop } { prop-keyval }
-              { \exp_not:o {#4} }
-          }
-      }
-  }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %
@@ -83,11 +83,12 @@
 %
 % If a regular expression is to be used several times,
 % it can be compiled once, and stored in a regex
-% variable using \cs{regex_const:Nn}. For example,
+% variable using \cs{regex_set:Nn}. For example,
 % \begin{verbatim}
-%   \regex_const:Nn \c_foo_regex { \c{begin} \cB. (\c[^BE].*) \cE. }
+%   \regex_new:N \l_foo_regex
+%   \regex_set:Nn \l_foo_regex { \c{begin} \cB. (\c[^BE].*) \cE. }
 % \end{verbatim}
-% stores in \cs[no-index]{c_foo_regex} a regular expression which matches the
+% stores in \cs[no-index]{l_foo_regex} a regular expression which matches the
 % starting marker for an environment: \cs[no-index]{begin}, followed by a
 % begin-group token (|\cB.|), then any number of tokens which are
 % neither begin-group nor end-group character tokens (|\c[^BE].*|),
@@ -164,7 +165,7 @@
 %   |\A|, |\B|, \ldots{} have special meanings;
 % \item non-alphanumeric printable ascii characters can (and should)
 %   always be escaped: many of them have special meanings (\emph{e.g.},
-%   use |\(|, |\)|, |\?|, |\.|);
+%   use |\(|, |\)|, |\?|, |\.|, |\^|);
 % \item spaces should always be escaped (even in character
 %   classes);
 % \item any other character may be escaped or not, without any
@@ -335,11 +336,14 @@
 %     \meta{regex}, anchored at the beginning and end, so that |\c{begin}|
 %     matches exactly \cs[no-index]{begin}, and nothing else.
 %   \item[\\cX] Applies to the next object, which can be a character,
-%     character property, class, or group, and forces this object to
-%     only match tokens with category |X| (any of |CBEMTPUDSLOA|. For
-%     instance, |\cL[A-Z\d]| matches uppercase letters and digits of
-%     category code letter, |\cC.| matches any control sequence, and
-%     |\cO(abc)| matches |abc| where each character has category other.
+%     escape character sequence such as |\x{0A}|, character class, or
+%     group, and forces this object to only match tokens with category
+%     |X| (any of |CBEMTPUDSLOA|. For instance, |\cL[A-Z\d]| matches
+%     uppercase letters and digits of category code letter, |\cC.|
+%     matches any control sequence, and |\cO(abc)| matches |abc| where
+%     each character has category other.\footnote{This last example also
+%     captures \enquote{\texttt{abc}} as a regex group; to avoid this
+%     use a non-capturing group \texttt{\textbackslash cO(?:abc)}.}
 %   \item[{\\c[XYZ]}] Applies to the next object, and forces it to only
 %     match tokens with category |X|, |Y|, or |Z| (each being any of
 %     |CBEMTPUDSLOA|). For instance, |\c[LSO](..)| matches two tokens of
@@ -531,23 +535,29 @@
 %   \meta{regex~var} is initially such that it never matches.
 % \end{function}
 %
-% \begin{function}[added = 2017-05-26]
-%   {\regex_set:Nn, \regex_gset:Nn, \regex_const:Nn}
+% \begin{function}[added = 2017-05-26]{\regex_set:Nn, \regex_gset:Nn}
 %   \begin{syntax}
 %     \cs{regex_set:Nn} \meta{regex~var} \Arg{regex}
 %   \end{syntax}
-%   Stores a compiled version of the \meta{regular expression}
-%   in the \meta{regex~var}. For instance, this function can be used
-%   as
+%   Stores a compiled version of the \meta{regular expression} in the
+%   \meta{regex~var}. The assignment is local for \cs{regex_set:Nn} and
+%   global for \cs{regex_gset:Nn}. For instance, this function can be
+%   used as
 %   \begin{verbatim}
 %     \regex_new:N \l_my_regex
 %     \regex_set:Nn \l_my_regex { my\ (simple\ )? reg(ex|ular\ expression) }
 %   \end{verbatim}
-%   The assignment is local for \cs{regex_set:Nn} and global for
-%   \cs{regex_gset:Nn}. Use \cs{regex_const:Nn} for compiled expressions
-%   which never change.
 % \end{function}
 %
+% \begin{function}[added = 2017-05-26]{\regex_const:Nn}
+%   \begin{syntax}
+%     \cs{regex_const:Nn} \meta{regex~var} \Arg{regex}
+%   \end{syntax}
+%   Creates a new constant \meta{regex~var} or raises an error if the name
+%   is already taken.  The value of the \meta{regex~var} is set
+%   globally to the compiled version of the \meta{regular expression}.
+% \end{function}
+%
 % \begin{function}[added = 2021-04-26, updated = 2021-04-29]
 %   {\regex_show:N, \regex_show:n, \regex_log:N, \regex_log:n}
 %   \begin{syntax}
@@ -722,7 +732,7 @@
 %   locally to \meta{tl~var}.
 % \end{function}
 %
-% \section{Constants and variables}
+% \section{Scratch regular expressions}
 %
 % \begin{variable}[added = 2017-12-11]{\l_tmpa_regex, \l_tmpb_regex}
 %   Scratch regex for local assignment. These are never used by

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %
@@ -95,7 +95,7 @@
 %     appropriately.
 % \end{itemize}
 %
-% \section{Building strings}
+% \section{Creating and initialising string variables}
 %
 % \begin{function}[added = 2015-09-18]{\str_new:N, \str_new:c}
 %   \begin{syntax}
@@ -164,6 +164,16 @@
 %   this function does not convert their contents to a string.
 % \end{function}
 %
+% \begin{function}[EXP, pTF, added = 2015-09-18]
+%   {\str_if_exist:N, \str_if_exist:c}
+%   \begin{syntax}
+%     \cs{str_if_exist_p:N} \meta{str~var}
+%     \cs{str_if_exist:NTF} \meta{str~var} \Arg{true code} \Arg{false code}
+%   \end{syntax}
+%   Tests whether the \meta{str~var} is currently defined.  This does not
+%   check that the \meta{str~var} really is a string.
+% \end{function}
+%
 % \section{Adding data to string variables}
 %
 % \begin{function}[added = 2015-09-18, updated = 2018-07-28]
@@ -210,84 +220,8 @@
 %     var} are not automatically converted to a string.
 % \end{function}
 %
-% \section{Modifying string variables}
-%
-% \begin{function}[added = 2017-10-08]
-%   {
-%     \str_replace_once:Nnn,  \str_replace_once:cnn,
-%     \str_greplace_once:Nnn, \str_greplace_once:cnn
-%   }
-%   \begin{syntax}
-%     \cs{str_replace_once:Nnn} \meta{str~var} \Arg{old} \Arg{new}
-%   \end{syntax}
-%   Converts the \meta{old} and \meta{new} token lists to strings, then
-%   replaces the first (leftmost) occurrence of \meta{old string} in the
-%   \meta{str~var} with \meta{new string}.
-% \end{function}
-%
-% \begin{function}[added = 2017-10-08]
-%   {
-%     \str_replace_all:Nnn, \str_replace_all:cnn,
-%     \str_greplace_all:Nnn, \str_greplace_all:cnn
-%   }
-%   \begin{syntax}
-%     \cs{str_replace_all:Nnn} \meta{str~var} \Arg{old} \Arg{new}
-%   \end{syntax}
-%   Converts the \meta{old} and \meta{new} token lists to strings, then
-%   replaces all occurrences of \meta{old string} in the
-%   \meta{str~var} with \meta{new string}.
-%   As this function
-%   operates from left to right, the pattern \meta{old string}
-%   may remain after the replacement (see \cs{str_remove_all:Nn}
-%   for an example).
-% \end{function}
-%
-% \begin{function}[added = 2017-10-08]
-%   {
-%     \str_remove_once:Nn,  \str_remove_once:cn,
-%     \str_gremove_once:Nn, \str_gremove_once:cn
-%   }
-%   \begin{syntax}
-%     \cs{str_remove_once:Nn} \meta{str~var} \Arg{token list}
-%   \end{syntax}
-%   Converts the \meta{token list} to a \meta{string} then
-%   removes the first (leftmost) occurrence of \meta{string} from the
-%   \meta{str~var}.
-% \end{function}
-%
-% \begin{function}[added = 2017-10-08]
-%   {
-%     \str_remove_all:Nn,  \str_remove_all:cn,
-%     \str_gremove_all:Nn, \str_gremove_all:cn
-%   }
-%   \begin{syntax}
-%     \cs{str_remove_all:Nn} \meta{str~var} \Arg{token list}
-%   \end{syntax}
-%   Converts the \meta{token list} to a \meta{string} then
-%   removes all occurrences of \meta{string} from the
-%   \meta{str~var}.
-%   As this function
-%   operates from left to right, the pattern \meta{string}
-%   may remain after the removal, for instance,
-%   \begin{quote}
-%     \cs{str_set:Nn} \cs{l_tmpa_str} |{abbccd}|
-%     \cs{str_remove_all:Nn} \cs{l_tmpa_str} |{bc}|
-%   \end{quote}
-%   results in \cs{l_tmpa_str} containing \texttt{abcd}.
-% \end{function}
-%
 % \section{String conditionals}
 %
-% \begin{function}[EXP, pTF, added = 2015-09-18]
-%   {\str_if_exist:N, \str_if_exist:c}
-%   \begin{syntax}
-%     \cs{str_if_exist_p:N} \meta{str~var}
-%     \cs{str_if_exist:NTF} \meta{str~var} \Arg{true code} \Arg{false code}
-%   \end{syntax}
-%   Tests whether the \meta{str~var} is currently defined.  This does not
-%   check that the \meta{str~var} really is a string.
-% \end{function}
-%
 % \begin{function}[EXP,pTF, added = 2015-09-18]
 %   {\str_if_empty:N, \str_if_empty:c}
 %   \begin{syntax}
@@ -459,6 +393,19 @@
 %   receives the \meta{character} as |#1|.
 % \end{function}
 %
+% \begin{function}[rEXP, added = 2021-05-05]
+%   {\str_map_tokens:nn, \str_map_tokens:Nn, \str_map_tokens:cn}
+%   \begin{syntax}
+%     \cs{str_map_tokens:nn} \Arg{token list} \Arg{code}
+%     \cs{str_map_tokens:Nn} \meta{str~var} \Arg{code}
+%   \end{syntax}
+%   Converts the \meta{token list} to a \meta{string} then applies
+%   \meta{code} to every \meta{character} in the \meta{string} including
+%   spaces.  The \meta{code} receives each character as a trailing brace
+%   group.  This is equivalent to \cs{str_map_function:nN} if the
+%   \meta{code} consists of a single function.
+% \end{function}
+%
 % \begin{function}[added = 2017-11-14]
 %   {\str_map_variable:nNn, \str_map_variable:NNn, \str_map_variable:cNn}
 %   \begin{syntax}
@@ -475,19 +422,6 @@
 %   \meta{string} is empty.  See also \cs{str_map_inline:Nn}.
 % \end{function}
 %
-% \begin{function}[rEXP, added = 2021-05-05]
-%   {\str_map_tokens:nn, \str_map_tokens:Nn, \str_map_tokens:cn}
-%   \begin{syntax}
-%     \cs{str_map_tokens:nn} \Arg{token list} \Arg{code}
-%     \cs{str_map_tokens:Nn} \meta{str~var} \Arg{code}
-%   \end{syntax}
-%   Converts the \meta{token list} to a \meta{string} then applies
-%   \meta{code} to every \meta{character} in the \meta{string} including
-%   spaces.  The \meta{code} receives each character as a trailing brace
-%   group.  This is equivalent to \cs{str_map_function:nN} if the
-%   \meta{code} consists of a single function.
-% \end{function}
-%
 % \begin{function}[added = 2017-10-08, rEXP]{\str_map_break:}
 %   \begin{syntax}
 %     \cs{str_map_break:}
@@ -698,6 +632,72 @@
 %   instances of |bcde|.
 % ^^A\end{function}
 %
+% \section{Modifying string variables}
+%
+% \begin{function}[added = 2017-10-08]
+%   {
+%     \str_replace_once:Nnn,  \str_replace_once:cnn,
+%     \str_greplace_once:Nnn, \str_greplace_once:cnn
+%   }
+%   \begin{syntax}
+%     \cs{str_replace_once:Nnn} \meta{str~var} \Arg{old} \Arg{new}
+%   \end{syntax}
+%   Converts the \meta{old} and \meta{new} token lists to strings, then
+%   replaces the first (leftmost) occurrence of \meta{old string} in the
+%   \meta{str~var} with \meta{new string}.
+% \end{function}
+%
+% \begin{function}[added = 2017-10-08]
+%   {
+%     \str_replace_all:Nnn, \str_replace_all:cnn,
+%     \str_greplace_all:Nnn, \str_greplace_all:cnn
+%   }
+%   \begin{syntax}
+%     \cs{str_replace_all:Nnn} \meta{str~var} \Arg{old} \Arg{new}
+%   \end{syntax}
+%   Converts the \meta{old} and \meta{new} token lists to strings, then
+%   replaces all occurrences of \meta{old string} in the
+%   \meta{str~var} with \meta{new string}.
+%   As this function
+%   operates from left to right, the pattern \meta{old string}
+%   may remain after the replacement (see \cs{str_remove_all:Nn}
+%   for an example).
+% \end{function}
+%
+% \begin{function}[added = 2017-10-08]
+%   {
+%     \str_remove_once:Nn,  \str_remove_once:cn,
+%     \str_gremove_once:Nn, \str_gremove_once:cn
+%   }
+%   \begin{syntax}
+%     \cs{str_remove_once:Nn} \meta{str~var} \Arg{token list}
+%   \end{syntax}
+%   Converts the \meta{token list} to a \meta{string} then
+%   removes the first (leftmost) occurrence of \meta{string} from the
+%   \meta{str~var}.
+% \end{function}
+%
+% \begin{function}[added = 2017-10-08]
+%   {
+%     \str_remove_all:Nn,  \str_remove_all:cn,
+%     \str_gremove_all:Nn, \str_gremove_all:cn
+%   }
+%   \begin{syntax}
+%     \cs{str_remove_all:Nn} \meta{str~var} \Arg{token list}
+%   \end{syntax}
+%   Converts the \meta{token list} to a \meta{string} then
+%   removes all occurrences of \meta{string} from the
+%   \meta{str~var}.
+%   As this function
+%   operates from left to right, the pattern \meta{string}
+%   may remain after the removal, for instance,
+%   \begin{quote}
+%     \cs{str_set:Nn} \cs{l_tmpa_str} |{abbccd}|
+%     \cs{str_remove_all:Nn} \cs{l_tmpa_str} |{bc}|
+%   \end{quote}
+%   results in \cs{l_tmpa_str} containing \texttt{abcd}.
+% \end{function}
+%
 % \section{String manipulation}
 %
 % \begin{function}[EXP, added = 2019-11-26]
@@ -1163,15 +1163,16 @@
 %     \str_if_eq:ee
 %   }
 %   Modern engines provide a direct way of comparing two token lists,
-%   but returning a number. This set of conditionals therefore make life
-%   a bit clearer. The \texttt{nn} and \texttt{xx} versions are created
-%   directly as this is most efficient.
+%   but returning a number. This set of conditionals therefore makes life
+%   a bit clearer. The \texttt{nn} and \texttt{ee} versions are created
+%   directly as this is most efficient. Since \cs{@@_if_eq:nn} will expand to
+%   |0| as an explicit character with category 12 if the two lists match (and
+%   either |-1| or |1| if they don't) we can use \cs{if:w} here which is faster
+%   than using \cs{if_int_compare:w}.
 %    \begin{macrocode}
 \prg_new_conditional:Npnn \str_if_eq:nn #1#2 { p , T , F , TF }
   {
-    \if_int_compare:w
-      \@@_if_eq:nn { \exp_not:n {#1} } { \exp_not:n {#2} }
-      = \c_zero_int
+    \if:w 0 \@@_if_eq:nn { \exp_not:n {#1} } { \exp_not:n {#2} }
       \prg_return_true: \else: \prg_return_false: \fi:
   }
 \prg_generate_conditional_variant:Nnn \str_if_eq:nn
@@ -1178,7 +1179,7 @@
   { V , v , o , nV , no , VV , nv } { p , T , F , TF }
 \prg_new_conditional:Npnn \str_if_eq:ee #1#2 { p , T , F , TF }
   {
-    \if_int_compare:w \@@_if_eq:nn {#1} {#2} = \c_zero_int
+    \if:w 0 \@@_if_eq:nn {#1} {#2}
       \prg_return_true: \else: \prg_return_false: \fi:
   }
 %    \end{macrocode}
@@ -1186,14 +1187,13 @@
 %
 % \begin{macro}[EXP, pTF]
 %   {\str_if_eq:NN, \str_if_eq:Nc, \str_if_eq:cN, \str_if_eq:cc}
-%   Note that \cs{str_if_eq:NN} is different from
-%   \cs{tl_if_eq:NN} because it needs to ignore category codes.
+%   Note that \cs{str_if_eq:NNTF} is different from
+%   \cs{tl_if_eq:NNTF} because it needs to ignore category codes.
 %    \begin{macrocode}
 \prg_new_conditional:Npnn \str_if_eq:NN #1#2 { p , TF , T , F }
   {
-    \if_int_compare:w
-      \@@_if_eq:nn { \tl_to_str:N #1 } { \tl_to_str:N #2 }
-      = \c_zero_int \prg_return_true: \else: \prg_return_false: \fi:
+    \if:w 0 \@@_if_eq:nn { \tl_to_str:N #1 } { \tl_to_str:N #2 }
+      \prg_return_true: \else: \prg_return_false: \fi:
   }
 \prg_generate_conditional_variant:Nnn \str_if_eq:NN
   { c , Nc , cc } { T , F , TF , p }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3text.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3text.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3text.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %
@@ -205,159 +205,6 @@
 %   \meta{tl~var}.
 % \end{function}
 %
-% \section{Modifying token list variables}
-%
-% \begin{function}[updated = 2011-08-11]
-%   {
-%     \tl_replace_once:Nnn,  \tl_replace_once:cnn,
-%     \tl_greplace_once:Nnn, \tl_greplace_once:cnn
-%   }
-%   \begin{syntax}
-%     \cs{tl_replace_once:Nnn} \meta{tl~var} \Arg{old tokens} \Arg{new tokens}
-%   \end{syntax}
-%   Replaces the first (leftmost) occurrence of \meta{old tokens} in the
-%   \meta{tl~var} with \meta{new tokens}. \meta{Old tokens}
-%   cannot contain |{|, |}| or |#|
-%   (more precisely, explicit character tokens with category code $1$
-%   (begin-group) or $2$ (end-group), and tokens with category code $6$).
-% \end{function}
-%
-% \begin{function}[updated = 2011-08-11]
-%   {
-%     \tl_replace_all:Nnn, \tl_replace_all:cnn,
-%     \tl_greplace_all:Nnn, \tl_greplace_all:cnn
-%   }
-%   \begin{syntax}
-%     \cs{tl_replace_all:Nnn} \meta{tl~var} \Arg{old tokens} \Arg{new tokens}
-%   \end{syntax}
-%   Replaces all occurrences of \meta{old tokens} in the
-%   \meta{tl~var} with \meta{new tokens}. \meta{Old tokens}
-%   cannot contain |{|, |}| or |#|
-%   (more precisely, explicit character tokens with category code $1$
-%   (begin-group) or $2$ (end-group), and tokens with category code $6$).
-%   As this function
-%   operates from left to right, the pattern \meta{old tokens}
-%   may remain after the replacement (see \cs{tl_remove_all:Nn}
-%   for an example).
-% \end{function}
-%
-% \begin{function}[updated = 2011-08-11]
-%   {
-%     \tl_remove_once:Nn,  \tl_remove_once:cn,
-%     \tl_gremove_once:Nn, \tl_gremove_once:cn
-%   }
-%   \begin{syntax}
-%     \cs{tl_remove_once:Nn} \meta{tl~var} \Arg{tokens}
-%   \end{syntax}
-%   Removes the first (leftmost) occurrence of \meta{tokens} from the
-%   \meta{tl~var}. \meta{Tokens} cannot contain |{|, |}| or |#|
-%   (more precisely, explicit character tokens with category code $1$
-%   (begin-group) or $2$ (end-group), and tokens with category code $6$).
-% \end{function}
-%
-% \begin{function}[updated = 2011-08-11]
-%   {
-%     \tl_remove_all:Nn,  \tl_remove_all:cn,
-%     \tl_gremove_all:Nn, \tl_gremove_all:cn
-%   }
-%   \begin{syntax}
-%     \cs{tl_remove_all:Nn} \meta{tl~var} \Arg{tokens}
-%   \end{syntax}
-%   Removes all occurrences of \meta{tokens} from the
-%   \meta{tl~var}. \meta{Tokens} cannot contain |{|, |}| or |#|
-%   (more precisely, explicit character tokens with category code $1$
-%   (begin-group) or $2$ (end-group), and tokens with category code $6$).
-%   As this function
-%   operates from left to right, the pattern \meta{tokens}
-%   may remain after the removal, for instance,
-%   \begin{quote}
-%     \cs{tl_set:Nn} \cs{l_tmpa_tl} |{abbccd}|
-%     \cs{tl_remove_all:Nn} \cs{l_tmpa_tl} |{bc}|
-%   \end{quote}
-%   results in \cs{l_tmpa_tl} containing \texttt{abcd}.
-% \end{function}
-%
-% \section{Reassigning token list category codes}
-%
-% These functions allow the rescanning of tokens: re-apply \TeX{}'s
-% tokenization process to apply category codes different from those
-% in force when the tokens were absorbed. Whilst this functionality is
-% supported, it is often preferable to find alternative approaches
-% to achieving outcomes rather than rescanning tokens (for example
-% construction of token lists token-by-token with intervening category
-% code changes or using \cs{char_generate:nn}).
-%
-% \begin{function}[updated = 2015-08-11]
-%   {
-%     \tl_set_rescan:Nnn,  \tl_set_rescan:Nno,  \tl_set_rescan:Nnx,
-%     \tl_set_rescan:cnn,  \tl_set_rescan:cno,  \tl_set_rescan:cnx,
-%     \tl_gset_rescan:Nnn, \tl_gset_rescan:Nno, \tl_gset_rescan:Nnx,
-%     \tl_gset_rescan:cnn, \tl_gset_rescan:cno, \tl_gset_rescan:cnx
-%   }
-%   \begin{syntax}
-%     \cs{tl_set_rescan:Nnn} \meta{tl~var} \Arg{setup} \Arg{tokens}
-%   \end{syntax}
-%   Sets \meta{tl~var} to contain \meta{tokens}, applying the category
-%   code r\'{e}gime specified in the \meta{setup} before carrying out
-%   the assignment. (Category codes applied to tokens not explicitly covered
-%   by the \meta{setup} are those in force at the point of use of
-%   \cs{tl_set_rescan:Nnn}.)
-%   This allows the \meta{tl~var} to contain material
-%   with category codes other than those that apply when \meta{tokens}
-%   are absorbed.  The \meta{setup} is run within a group and may
-%   contain any valid input, although only changes in category codes,
-%   such as uses of \cs{cctab_select:N},
-%   are relevant. See also \cs{tl_rescan:nn}.
-%   \begin{texnote}
-%     The \meta{tokens} are first turned into a string (using
-%     \cs{tl_to_str:n}).  If the string contains one or more characters
-%     with character code \tn{newlinechar} (set equal to
-%     \tn{endlinechar} unless that is equal to $32$, before the user
-%     \meta{setup}), then it is split into lines at these characters,
-%     then read as if reading multiple lines from a file, ignoring
-%     spaces (catcode $10$) at the beginning and spaces and tabs
-%     (character code $32$ or $9$) at the end of every line.
-%     Otherwise, spaces (and tabs) are retained at both ends of the
-%     single-line string, as if it appeared in the middle of a line
-%     read from a file.
-%   \end{texnote}
-% \end{function}
-%
-% \begin{function}[updated = 2015-08-11]{\tl_rescan:nn}
-%   \begin{syntax}
-%     \cs{tl_rescan:nn} \Arg{setup} \Arg{tokens}
-%   \end{syntax}
-%   Rescans \meta{tokens} applying the category code r\'{e}gime
-%   specified in the \meta{setup}, and leaves the resulting tokens in
-%   the input stream. (Category codes applied to tokens not explicitly covered
-%   by the \meta{setup} are those in force at the point of use of
-%   \cs{tl_rescan:nn}.)
-%   The \meta{setup} is run within a group and may
-%   contain any valid input, although only changes in category codes,
-%   such as uses of \cs{cctab_select:N},
-%   are relevant.  See also \cs{tl_set_rescan:Nnn}, which is more
-%   robust than using \cs{tl_set:Nn} in the \meta{tokens} argument of
-%   \cs{tl_rescan:nn}.
-%   \begin{texnote}
-%     The \meta{tokens} are first turned into a string (using
-%     \cs{tl_to_str:n}).  If the string contains one or more characters
-%     with character code \tn{newlinechar} (set equal to
-%     \tn{endlinechar} unless that is equal to $32$, before the user
-%     \meta{setup}), then it is split into lines at these characters,
-%     then read as if reading multiple lines from a file, ignoring
-%     spaces (catcode $10$) at the beginning and spaces and tabs
-%     (character code $32$ or $9$) at the end of every line.
-%     Otherwise, spaces (and tabs) are retained at both ends of the
-%     single-line string, as if it appeared in the middle of a line
-%     read from a file.
-%
-%     Contrarily to the \tn{scantokens} primitive, \cs{tl_rescan:nn}
-%     tokenizes the whole string in the same category code regime rather
-%     than one token at a time, so that directives such as \tn{verb}
-%     that rely on changing category codes will not function properly.
-%   \end{texnote}
-% \end{function}
-%
 % \section{Token list conditionals}
 %
 % \begin{function}[EXP,pTF, updated = 2019-09-04]
@@ -473,7 +320,7 @@
 %     \cs{tl_if_single_p:N} \meta{tl~var}
 %     \cs{tl_if_single:NTF} \meta{tl~var} \Arg{true code} \Arg{false code}
 %   \end{syntax}
-%   Tests if the content of the \meta{tl~var} consists of a single item,
+%   Tests if the content of the \meta{tl~var} consists of a single \meta{item},
 %   \emph{i.e.}~is a single normal token (neither an explicit space
 %   character nor a begin-group character) or a single brace group,
 %   surrounded by optional spaces on both sides. In other words, such a
@@ -485,7 +332,7 @@
 %     \cs{tl_if_single_p:n} \Arg{token list}
 %     \cs{tl_if_single:nTF} \Arg{token list} \Arg{true code} \Arg{false code}
 %   \end{syntax}
-%   Tests if the \meta{token list} has exactly one item, \emph{i.e.}~is
+%   Tests if the \meta{token list} has exactly one \meta{item}, \emph{i.e.}~is
 %   a single normal token (neither an explicit space character nor a
 %   begin-group character) or a single brace group, surrounded by
 %   optional spaces on both sides. In other words, such a token list has
@@ -498,7 +345,7 @@
 %   \cs{tl_if_single_token:nTF} \Arg{token list} \Arg{true code} \Arg{false code}
 %   \end{syntax}
 %   Tests if the token list consists of exactly one token, \emph{i.e.}~is
-%   either a single space character or a single \enquote{normal} token.
+%   either a single space character or a single normal token.
 %   Token groups (|{|\ldots|}|) are not single tokens.
 % \end{function}
 %
@@ -526,153 +373,94 @@
 %   available.
 % \end{function}
 %
-% \section{Mapping over token lists}
+% \subsection{Testing the first token}
 %
-% All mappings are done at the current group level, \emph{i.e.}~any
-% local assignments made by the \meta{function} or \meta{code} discussed
-% below remain in effect after the loop.
-%
-% \begin{function}[updated = 2012-06-29, rEXP]
-%   {\tl_map_function:NN, \tl_map_function:cN}
+% \begin{function}[updated = 2012-07-09, EXP, pTF]
+%   {\tl_if_head_eq_catcode:nN, \tl_if_head_eq_catcode:oN}
 %   \begin{syntax}
-%     \cs{tl_map_function:NN} \meta{tl~var} \meta{function}
+%     \cs{tl_if_head_eq_catcode_p:nN} \Arg{token list} \meta{test token}
+%     \cs{tl_if_head_eq_catcode:nNTF} \Arg{token list} \meta{test token}
+%     ~~\Arg{true code} \Arg{false code}
 %   \end{syntax}
-%   Applies \meta{function} to every \meta{item} in the \meta{tl~var}.
-%   The \meta{function} receives one argument for each iteration.
-%   This may be a number of tokens if the \meta{item} was stored within
-%   braces. Hence the \meta{function} should anticipate receiving
-%   \texttt{n}-type arguments. See also \cs{tl_map_function:nN}.
+%   Tests if the first \meta{token} in the \meta{token list} has the
+%   same category code as the \meta{test token}.  In the case where the
+%   \meta{token list} is empty, the test is always \texttt{false}.
 % \end{function}
 %
-% \begin{function}[updated = 2012-06-29, rEXP]{\tl_map_function:nN}
+% \begin{function}[updated = 2012-07-09, EXP, pTF]
+%   {\tl_if_head_eq_charcode:nN, \tl_if_head_eq_charcode:fN}
 %   \begin{syntax}
-%     \cs{tl_map_function:nN} \Arg{token list} \meta{function}
+%     \cs{tl_if_head_eq_charcode_p:nN} \Arg{token list} \meta{test token}
+%     \cs{tl_if_head_eq_charcode:nNTF} \Arg{token list} \meta{test token}
+%     ~~\Arg{true code} \Arg{false code}
 %   \end{syntax}
-%   Applies \meta{function} to every \meta{item} in the \meta{token list},
-%   The \meta{function} receives one argument for each iteration.
-%   This may be a number of tokens if the \meta{item} was stored within
-%   braces. Hence the \meta{function} should anticipate receiving
-%   \texttt{n}-type arguments. See also \cs{tl_map_function:NN}.
+%   Tests if the first \meta{token} in the \meta{token list} has the
+%   same character code as the \meta{test token}.  In the case where the
+%   \meta{token list} is empty, the test is always \texttt{false}.
 % \end{function}
 %
-% \begin{function}[updated = 2012-06-29]
-%   {\tl_map_inline:Nn, \tl_map_inline:cn}
+% \begin{function}[updated = 2012-07-09, EXP, pTF]{\tl_if_head_eq_meaning:nN}
 %   \begin{syntax}
-%     \cs{tl_map_inline:Nn} \meta{tl~var} \Arg{inline function}
+%     \cs{tl_if_head_eq_meaning_p:nN} \Arg{token list} \meta{test token}
+%     \cs{tl_if_head_eq_meaning:nNTF} \Arg{token list} \meta{test token}
+%     ~~\Arg{true code} \Arg{false code}
 %   \end{syntax}
-%   Applies the \meta{inline function} to every \meta{item} stored within the
-%   \meta{tl~var}. The \meta{inline function} should consist of code which
-%   receives the \meta{item} as |#1|. See also \cs{tl_map_function:NN}.
+%   Tests if the first \meta{token} in the \meta{token list} has the
+%   same meaning as the \meta{test token}.  In the case where
+%   \meta{token list} is empty, the test is always \texttt{false}.
 % \end{function}
 %
-% \begin{function}[updated = 2012-06-29]{\tl_map_inline:nn}
+% \begin{function}[added = 2012-07-08, EXP, pTF]{\tl_if_head_is_group:n}
 %   \begin{syntax}
-%     \cs{tl_map_inline:nn} \Arg{token list} \Arg{inline function}
+%     \cs{tl_if_head_is_group_p:n} \Arg{token list}
+%     \cs{tl_if_head_is_group:nTF} \Arg{token list} \Arg{true code} \Arg{false code}
 %   \end{syntax}
-%   Applies the \meta{inline function} to every \meta{item} stored within the
-%   \meta{token list}. The \meta{inline function}  should consist of code which
-%   receives the \meta{item} as |#1|. See also \cs{tl_map_function:nN}.
+%   Tests if the first \meta{token} in the \meta{token list}
+%   is an explicit begin-group character (with category code~$1$
+%   and any character code), in other words, if the \meta{token list}
+%   starts with a brace group. In particular, the test is \texttt{false}
+%   if the \meta{token list} starts with an implicit token such as
+%   \cs{c_group_begin_token}, or if it is empty.
+%   This function is useful to implement actions on token lists on
+%   a token by token basis.
 % \end{function}
 %
-% \begin{function}[rEXP, added = 2019-09-02]
-%   {\tl_map_tokens:Nn, \tl_map_tokens:cn, \tl_map_tokens:nn}
+% \begin{function}[added = 2012-07-08, EXP, pTF]{\tl_if_head_is_N_type:n}
 %   \begin{syntax}
-%     \cs{tl_map_tokens:Nn} \meta{tl~var} \Arg{code}
-%     \cs{tl_map_tokens:nn} \Arg{tokens} \Arg{code}
+%     \cs{tl_if_head_is_N_type_p:n} \Arg{token list}
+%     \cs{tl_if_head_is_N_type:nTF} \Arg{token list} \Arg{true code} \Arg{false code}
 %   \end{syntax}
-%   Analogue of \cs{tl_map_function:NN} which maps several tokens
-%   instead of a single function.  The \meta{code} receives each item in
-%   the \meta{tl~var} or in \meta{tokens} as a trailing brace group. For
-%   instance,
-%   \begin{verbatim}
-%     \tl_map_tokens:Nn \l_my_tl { \prg_replicate:nn { 2 } }
-%   \end{verbatim}
-%   expands to twice each item in the \meta{tl~var}: for each item in
-%   \cs[no-index]{l_my_tl} the function \cs{prg_replicate:nn} receives |2| and
-%   \meta{item} as its two arguments.  The function
-%   \cs{tl_map_inline:Nn} is typically faster but is not expandable.
+%   Tests if the first \meta{token} in the \meta{token list}
+%   is a normal \texttt{N}-type argument. In other words,
+%   it is neither an explicit space character
+%   (explicit token with character code~$32$ and category code~$10$)
+%   nor an explicit begin-group character
+%   (with category code~1 and any character code). An empty
+%   argument yields \texttt{false}, as it does not have a normal
+%   first token.
+%   This function is useful to implement actions on token lists on
+%   a token by token basis.
 % \end{function}
 %
-% \begin{function}[updated = 2012-06-29]
-%   {\tl_map_variable:NNn, \tl_map_variable:cNn}
+% \begin{function}[updated = 2012-07-08, EXP, pTF]{\tl_if_head_is_space:n}
 %   \begin{syntax}
-%     \cs{tl_map_variable:NNn} \meta{tl~var} \meta{variable} \Arg{code}
+%     \cs{tl_if_head_is_space_p:n} \Arg{token list}
+%     \cs{tl_if_head_is_space:nTF} \Arg{token list} \Arg{true code} \Arg{false code}
 %   \end{syntax}
-%   Stores each \meta{item} of the \meta{tl~var} in turn in the (token
-%   list) \meta{variable} and applies the \meta{code}.  The \meta{code}
-%   will usually make use of the \meta{variable}, but this is not
-%   enforced.  The assignments to the \meta{variable} are local.  Its
-%   value after the loop is the last \meta{item} in the \meta{tl~var},
-%   or its original value if the \meta{tl~var} is blank.  See also
-%   \cs{tl_map_inline:Nn}.
+%   Tests if the first \meta{token} in the \meta{token list}
+%   is an explicit space character
+%   (explicit token with character code~$12$ and category code~$10$).
+%   In particular, the test is \texttt{false} if the \meta{token list}
+%   starts with an implicit token such as \cs{c_space_token}, or if it
+%   is empty.
+%   This function is useful to implement actions on token lists on
+%   a token by token basis.
 % \end{function}
 %
-% \begin{function}[updated = 2012-06-29]{\tl_map_variable:nNn}
-%   \begin{syntax}
-%     \cs{tl_map_variable:nNn} \Arg{token list} \meta{variable} \Arg{code}
-%   \end{syntax}
-%   Stores each \meta{item} of the \meta{token list} in turn in the
-%   (token list) \meta{variable} and applies the \meta{code}.  The
-%   \meta{code} will usually make use of the \meta{variable}, but this
-%   is not enforced.  The assignments to the \meta{variable} are local.
-%   Its value after the loop is the last \meta{item} in the
-%   \meta{tl~var}, or its original value if the \meta{tl~var} is blank.
-%   See also \cs{tl_map_inline:nn}.
-% \end{function}
+% \section{Working with token lists as a whole}
 %
-% \begin{function}[updated = 2012-06-29, rEXP]{\tl_map_break:}
-%   \begin{syntax}
-%     \cs{tl_map_break:}
-%   \end{syntax}
-%   Used to terminate a \cs[no-index]{tl_map_\ldots} function before all
-%   entries in the \meta{token list variable} have been processed. This
-%   normally takes place within a conditional statement, for example
-%   \begin{verbatim}
-%     \tl_map_inline:Nn \l_my_tl
-%       {
-%         \str_if_eq:nnT { #1 } { bingo } { \tl_map_break: }
-%         % Do something useful
-%       }
-%   \end{verbatim}
-%   See also \cs{tl_map_break:n}.
-%   Use outside of a \cs[no-index]{tl_map_\ldots} scenario leads to low
-%   level \TeX{} errors.
-%   \begin{texnote}
-%     When the mapping is broken, additional tokens may be inserted
-%     before the \meta{tokens} are
-%     inserted into the input stream.
-%     This depends on the design of the mapping function.
-%   \end{texnote}
-% \end{function}
+% \subsection{Using token lists}
 %
-% \begin{function}[updated = 2012-06-29, rEXP]{\tl_map_break:n}
-%   \begin{syntax}
-%     \cs{tl_map_break:n} \Arg{code}
-%   \end{syntax}
-%   Used to terminate a \cs[no-index]{tl_map_\ldots} function before all
-%   entries in the \meta{token list variable} have been processed, inserting
-%   the \meta{code} after the mapping has ended. This
-%   normally takes place within a conditional statement, for example
-%   \begin{verbatim}
-%     \tl_map_inline:Nn \l_my_tl
-%       {
-%         \str_if_eq:nnT { #1 } { bingo }
-%           { \tl_map_break:n { <code> } }
-%         % Do something useful
-%       }
-%   \end{verbatim}
-%   Use outside of a \cs[no-index]{tl_map_\ldots} scenario leads to low
-%   level \TeX{} errors.
-%   \begin{texnote}
-%     When the mapping is broken, additional tokens may be inserted
-%     before the \meta{code} is
-%     inserted into the input stream.
-%     This depends on the design of the mapping function.
-%   \end{texnote}
-% \end{function}
-%
-% \section{Using token lists}
-%
 % \begin{function}[EXP]{\tl_to_str:n, \tl_to_str:V}
 %   \begin{syntax}
 %     \cs{tl_to_str:n} \Arg{token list}
@@ -733,7 +521,7 @@
 %   a \meta{tl~var} directly without an accessor function.
 % \end{function}
 %
-% \section{Working with the content of token lists}
+% \subsection{Counting and reversing token lists}
 %
 % \begin{function}[added = 2012-05-13, EXP]
 %   {\tl_count:n, \tl_count:V, \tl_count:o}
@@ -752,7 +540,7 @@
 %   \begin{syntax}
 %     \cs{tl_count:N} \meta{tl~var}
 %   \end{syntax}
-%   Counts the number of token groups in the \meta{tl~var}
+%   Counts the number of \meta{items} in the \meta{tl~var}
 %   and leaves this information in the input stream. Unbraced tokens
 %   count as one element as do each token group (|{|\ldots|}|). This
 %   process ignores any unprotected spaces within the \meta{tl~var}.
@@ -867,37 +655,195 @@
 %   \emph{resets} the content of the variable.
 % \end{function}
 %
-% \begin{function}[added = 2017-02-06]
-%   {\tl_sort:Nn, \tl_sort:cn, \tl_gsort:Nn, \tl_gsort:cn}
+% \subsection{Viewing token lists}
+%
+% \begin{function}[updated = 2021-04-29]{\tl_show:N, \tl_show:c}
 %   \begin{syntax}
-%     \cs{tl_sort:Nn} \meta{tl var} \Arg{comparison code}
+%     \cs{tl_show:N} \meta{tl~var}
 %   \end{syntax}
-%   Sorts the items in the \meta{tl var} according to the
-%   \meta{comparison code}, and assigns the result to
-%   \meta{tl var}. The details of sorting comparison are
-%   described in Section~\ref{sec:l3sort:mech}.
+%   Displays the content of the \meta{tl~var} on the terminal.
+%   \begin{texnote}
+%     This is similar to the \TeX{} primitive \tn{show}, wrapped to a
+%     fixed number of characters per line.
+%   \end{texnote}
 % \end{function}
 %
-% \begin{function}[added = 2017-02-06, EXP]{\tl_sort:nN}
+% \begin{function}[updated = 2015-08-07]{\tl_show:n}
 %   \begin{syntax}
-%     \cs{tl_sort:nN} \Arg{token list} \meta{conditional}
+%     \cs{tl_show:n} \Arg{token list}
 %   \end{syntax}
-%   Sorts the items in the \meta{token list}, using the
-%   \meta{conditional} to compare items, and leaves the result in the
-%   input stream.  The \meta{conditional} should have signature |:nnTF|,
-%   and return \texttt{true} if the two items being compared should be
-%   left in the same order, and \texttt{false} if the items should be
-%   swapped. The details of sorting comparison are
-%   described in Section~\ref{sec:l3sort:mech}.
+%   Displays the \meta{token list} on the terminal.
 %   \begin{texnote}
-%     The result is returned within \cs{exp_not:n}, which means that the
-%     token list does not expand further when appearing in an
-%     \texttt{x}-type or \texttt{e}-type argument expansion.
+%     This is similar to the \eTeX{} primitive \tn{showtokens}, wrapped
+%     to a fixed number of characters per line.
 %   \end{texnote}
 % \end{function}
 %
-% \section{The first token from a token list}
+% \begin{function}[added = 2014-08-22, updated = 2021-04-29]{\tl_log:N, \tl_log:c}
+%   \begin{syntax}
+%     \cs{tl_log:N} \meta{tl~var}
+%   \end{syntax}
+%   Writes the content of the \meta{tl~var} in the log file.  See also
+%   \cs{tl_show:N} which displays the result in the terminal.
+% \end{function}
 %
+% \begin{function}[added = 2014-08-22, updated = 2015-08-07]{\tl_log:n}
+%   \begin{syntax}
+%     \cs{tl_log:n} \Arg{token list}
+%   \end{syntax}
+%   Writes the \meta{token list} in the log file.  See also
+%   \cs{tl_show:n} which displays the result in the terminal.
+% \end{function}
+%
+% \section{Manipulating items in token lists}
+%
+% \subsection{Mapping over token lists}
+%
+% All mappings are done at the current group level, \emph{i.e.}~any
+% local assignments made by the \meta{function} or \meta{code} discussed
+% below remain in effect after the loop.
+%
+% \begin{function}[updated = 2012-06-29, rEXP]
+%   {\tl_map_function:NN, \tl_map_function:cN}
+%   \begin{syntax}
+%     \cs{tl_map_function:NN} \meta{tl~var} \meta{function}
+%   \end{syntax}
+%   Applies \meta{function} to every \meta{item} in the \meta{tl~var}.
+%   The \meta{function} receives one argument for each iteration.
+%   This may be a number of tokens if the \meta{item} was stored within
+%   braces. Hence the \meta{function} should anticipate receiving
+%   \texttt{n}-type arguments. See also \cs{tl_map_function:nN}.
+% \end{function}
+%
+% \begin{function}[updated = 2012-06-29, rEXP]{\tl_map_function:nN}
+%   \begin{syntax}
+%     \cs{tl_map_function:nN} \Arg{token list} \meta{function}
+%   \end{syntax}
+%   Applies \meta{function} to every \meta{item} in the \meta{token list},
+%   The \meta{function} receives one argument for each iteration.
+%   This may be a number of tokens if the \meta{item} was stored within
+%   braces. Hence the \meta{function} should anticipate receiving
+%   \texttt{n}-type arguments. See also \cs{tl_map_function:NN}.
+% \end{function}
+%
+% \begin{function}[updated = 2012-06-29]
+%   {\tl_map_inline:Nn, \tl_map_inline:cn}
+%   \begin{syntax}
+%     \cs{tl_map_inline:Nn} \meta{tl~var} \Arg{inline function}
+%   \end{syntax}
+%   Applies the \meta{inline function} to every \meta{item} stored within the
+%   \meta{tl~var}. The \meta{inline function} should consist of code which
+%   receives the \meta{item} as |#1|. See also \cs{tl_map_function:NN}.
+% \end{function}
+%
+% \begin{function}[updated = 2012-06-29]{\tl_map_inline:nn}
+%   \begin{syntax}
+%     \cs{tl_map_inline:nn} \Arg{token list} \Arg{inline function}
+%   \end{syntax}
+%   Applies the \meta{inline function} to every \meta{item} stored within the
+%   \meta{token list}. The \meta{inline function}  should consist of code which
+%   receives the \meta{item} as |#1|. See also \cs{tl_map_function:nN}.
+% \end{function}
+%
+% \begin{function}[rEXP, added = 2019-09-02]
+%   {\tl_map_tokens:Nn, \tl_map_tokens:cn, \tl_map_tokens:nn}
+%   \begin{syntax}
+%     \cs{tl_map_tokens:Nn} \meta{tl~var} \Arg{code}
+%     \cs{tl_map_tokens:nn} \Arg{tokens} \Arg{code}
+%   \end{syntax}
+%   Analogue of \cs{tl_map_function:NN} which maps several tokens
+%   instead of a single function.  The \meta{code} receives each \meta{item} in
+%   the \meta{tl~var} or in \meta{tokens} as a trailing brace group. For
+%   instance,
+%   \begin{verbatim}
+%     \tl_map_tokens:Nn \l_my_tl { \prg_replicate:nn { 2 } }
+%   \end{verbatim}
+%   expands to twice each \meta{item} in the \meta{tl~var}: for each \meta{item} in
+%   \cs[no-index]{l_my_tl} the function \cs{prg_replicate:nn} receives |2| and
+%   \meta{item} as its two arguments.  The function
+%   \cs{tl_map_inline:Nn} is typically faster but is not expandable.
+% \end{function}
+%
+% \begin{function}[updated = 2012-06-29]
+%   {\tl_map_variable:NNn, \tl_map_variable:cNn}
+%   \begin{syntax}
+%     \cs{tl_map_variable:NNn} \meta{tl~var} \meta{variable} \Arg{code}
+%   \end{syntax}
+%   Stores each \meta{item} of the \meta{tl~var} in turn in the (token
+%   list) \meta{variable} and applies the \meta{code}.  The \meta{code}
+%   will usually make use of the \meta{variable}, but this is not
+%   enforced.  The assignments to the \meta{variable} are local.  Its
+%   value after the loop is the last \meta{item} in the \meta{tl~var},
+%   or its original value if the \meta{tl~var} is blank.  See also
+%   \cs{tl_map_inline:Nn}.
+% \end{function}
+%
+% \begin{function}[updated = 2012-06-29]{\tl_map_variable:nNn}
+%   \begin{syntax}
+%     \cs{tl_map_variable:nNn} \Arg{token list} \meta{variable} \Arg{code}
+%   \end{syntax}
+%   Stores each \meta{item} of the \meta{token list} in turn in the
+%   (token list) \meta{variable} and applies the \meta{code}.  The
+%   \meta{code} will usually make use of the \meta{variable}, but this
+%   is not enforced.  The assignments to the \meta{variable} are local.
+%   Its value after the loop is the last \meta{item} in the
+%   \meta{tl~var}, or its original value if the \meta{tl~var} is blank.
+%   See also \cs{tl_map_inline:nn}.
+% \end{function}
+%
+% \begin{function}[updated = 2012-06-29, rEXP]{\tl_map_break:}
+%   \begin{syntax}
+%     \cs{tl_map_break:}
+%   \end{syntax}
+%   Used to terminate a \cs[no-index]{tl_map_\ldots} function before all
+%   entries in the \meta{token list variable} have been processed. This
+%   normally takes place within a conditional statement, for example
+%   \begin{verbatim}
+%     \tl_map_inline:Nn \l_my_tl
+%       {
+%         \str_if_eq:nnT { #1 } { bingo } { \tl_map_break: }
+%         % Do something useful
+%       }
+%   \end{verbatim}
+%   See also \cs{tl_map_break:n}.
+%   Use outside of a \cs[no-index]{tl_map_\ldots} scenario leads to low
+%   level \TeX{} errors.
+%   \begin{texnote}
+%     When the mapping is broken, additional tokens may be inserted
+%     before the \meta{tokens} are
+%     inserted into the input stream.
+%     This depends on the design of the mapping function.
+%   \end{texnote}
+% \end{function}
+%
+% \begin{function}[updated = 2012-06-29, rEXP]{\tl_map_break:n}
+%   \begin{syntax}
+%     \cs{tl_map_break:n} \Arg{code}
+%   \end{syntax}
+%   Used to terminate a \cs[no-index]{tl_map_\ldots} function before all
+%   entries in the \meta{token list variable} have been processed, inserting
+%   the \meta{code} after the mapping has ended. This
+%   normally takes place within a conditional statement, for example
+%   \begin{verbatim}
+%     \tl_map_inline:Nn \l_my_tl
+%       {
+%         \str_if_eq:nnT { #1 } { bingo }
+%           { \tl_map_break:n { <code> } }
+%         % Do something useful
+%       }
+%   \end{verbatim}
+%   Use outside of a \cs[no-index]{tl_map_\ldots} scenario leads to low
+%   level \TeX{} errors.
+%   \begin{texnote}
+%     When the mapping is broken, additional tokens may be inserted
+%     before the \meta{code} is
+%     inserted into the input stream.
+%     This depends on the design of the mapping function.
+%   \end{texnote}
+% \end{function}
+%
+% \subsection{Head and tail of token lists}
+%
 % Functions which deal with either only the very first item (balanced
 % text or single normal token) in a token list, or the remaining tokens.
 %
@@ -979,90 +925,8 @@
 %   \end{texnote}
 % \end{function}
 %
-% \begin{function}[updated = 2012-07-09, EXP, pTF]
-%   {\tl_if_head_eq_catcode:nN, \tl_if_head_eq_catcode:oN}
-%   \begin{syntax}
-%     \cs{tl_if_head_eq_catcode_p:nN} \Arg{token list} \meta{test token}
-%     \cs{tl_if_head_eq_catcode:nNTF} \Arg{token list} \meta{test token}
-%     ~~\Arg{true code} \Arg{false code}
-%   \end{syntax}
-%   Tests if the first \meta{token} in the \meta{token list} has the
-%   same category code as the \meta{test token}.  In the case where the
-%   \meta{token list} is empty, the test is always \texttt{false}.
-% \end{function}
+% \subsection{Items and ranges in token lists}
 %
-% \begin{function}[updated = 2012-07-09, EXP, pTF]
-%   {\tl_if_head_eq_charcode:nN, \tl_if_head_eq_charcode:fN}
-%   \begin{syntax}
-%     \cs{tl_if_head_eq_charcode_p:nN} \Arg{token list} \meta{test token}
-%     \cs{tl_if_head_eq_charcode:nNTF} \Arg{token list} \meta{test token}
-%     ~~\Arg{true code} \Arg{false code}
-%   \end{syntax}
-%   Tests if the first \meta{token} in the \meta{token list} has the
-%   same character code as the \meta{test token}.  In the case where the
-%   \meta{token list} is empty, the test is always \texttt{false}.
-% \end{function}
-%
-% \begin{function}[updated = 2012-07-09, EXP, pTF]{\tl_if_head_eq_meaning:nN}
-%   \begin{syntax}
-%     \cs{tl_if_head_eq_meaning_p:nN} \Arg{token list} \meta{test token}
-%     \cs{tl_if_head_eq_meaning:nNTF} \Arg{token list} \meta{test token}
-%     ~~\Arg{true code} \Arg{false code}
-%   \end{syntax}
-%   Tests if the first \meta{token} in the \meta{token list} has the
-%   same meaning as the \meta{test token}.  In the case where
-%   \meta{token list} is empty, the test is always \texttt{false}.
-% \end{function}
-%
-% \begin{function}[added = 2012-07-08, EXP, pTF]{\tl_if_head_is_group:n}
-%   \begin{syntax}
-%     \cs{tl_if_head_is_group_p:n} \Arg{token list}
-%     \cs{tl_if_head_is_group:nTF} \Arg{token list} \Arg{true code} \Arg{false code}
-%   \end{syntax}
-%   Tests if the first \meta{token} in the \meta{token list}
-%   is an explicit begin-group character (with category code~$1$
-%   and any character code), in other words, if the \meta{token list}
-%   starts with a brace group. In particular, the test is \texttt{false}
-%   if the \meta{token list} starts with an implicit token such as
-%   \cs{c_group_begin_token}, or if it is empty.
-%   This function is useful to implement actions on token lists on
-%   a token by token basis.
-% \end{function}
-%
-% \begin{function}[added = 2012-07-08, EXP, pTF]{\tl_if_head_is_N_type:n}
-%   \begin{syntax}
-%     \cs{tl_if_head_is_N_type_p:n} \Arg{token list}
-%     \cs{tl_if_head_is_N_type:nTF} \Arg{token list} \Arg{true code} \Arg{false code}
-%   \end{syntax}
-%   Tests if the first \meta{token} in the \meta{token list}
-%   is a normal \texttt{N}-type argument. In other words,
-%   it is neither an explicit space character
-%   (explicit token with character code~$32$ and category code~$10$)
-%   nor an explicit begin-group character
-%   (with category code~1 and any character code). An empty
-%   argument yields \texttt{false}, as it does not have a \enquote{normal}
-%   first token.
-%   This function is useful to implement actions on token lists on
-%   a token by token basis.
-% \end{function}
-%
-% \begin{function}[updated = 2012-07-08, EXP, pTF]{\tl_if_head_is_space:n}
-%   \begin{syntax}
-%     \cs{tl_if_head_is_space_p:n} \Arg{token list}
-%     \cs{tl_if_head_is_space:nTF} \Arg{token list} \Arg{true code} \Arg{false code}
-%   \end{syntax}
-%   Tests if the first \meta{token} in the \meta{token list}
-%   is an explicit space character
-%   (explicit token with character code~$12$ and category code~$10$).
-%   In particular, the test is \texttt{false} if the \meta{token list}
-%   starts with an implicit token such as \cs{c_space_token}, or if it
-%   is empty.
-%   This function is useful to implement actions on token lists on
-%   a token by token basis.
-% \end{function}
-%
-% \section{Using a single item}
-%
 % \begin{function}[added = 2014-07-17, EXP]
 %   {\tl_item:nn, \tl_item:Nn, \tl_item:cn}
 %   \begin{syntax}
@@ -1172,46 +1036,192 @@
 %   \end{texnote}
 % \end{function}
 %
-% \section{Viewing token lists}
+% \subsection{Sorting token lists}
 %
-% \begin{function}[updated = 2021-04-29]{\tl_show:N, \tl_show:c}
+% \begin{function}[added = 2017-02-06]
+%   {\tl_sort:Nn, \tl_sort:cn, \tl_gsort:Nn, \tl_gsort:cn}
 %   \begin{syntax}
-%     \cs{tl_show:N} \meta{tl~var}
+%     \cs{tl_sort:Nn} \meta{tl var} \Arg{comparison code}
 %   \end{syntax}
-%   Displays the content of the \meta{tl~var} on the terminal.
-%   \begin{texnote}
-%     This is similar to the \TeX{} primitive \tn{show}, wrapped to a
-%     fixed number of characters per line.
-%   \end{texnote}
+%   Sorts the items in the \meta{tl var} according to the
+%   \meta{comparison code}, and assigns the result to
+%   \meta{tl var}. The details of sorting comparison are
+%   described in Section~\ref{sec:l3sort:mech}.
 % \end{function}
 %
-% \begin{function}[updated = 2015-08-07]{\tl_show:n}
+% \begin{function}[added = 2017-02-06, EXP]{\tl_sort:nN}
 %   \begin{syntax}
-%     \cs{tl_show:n} \Arg{token list}
+%     \cs{tl_sort:nN} \Arg{token list} \meta{conditional}
 %   \end{syntax}
-%   Displays the \meta{token list} on the terminal.
+%   Sorts the items in the \meta{token list}, using the
+%   \meta{conditional} to compare items, and leaves the result in the
+%   input stream.  The \meta{conditional} should have signature |:nnTF|,
+%   and return \texttt{true} if the two items being compared should be
+%   left in the same order, and \texttt{false} if the items should be
+%   swapped. The details of sorting comparison are
+%   described in Section~\ref{sec:l3sort:mech}.
 %   \begin{texnote}
-%     This is similar to the \eTeX{} primitive \tn{showtokens}, wrapped
-%     to a fixed number of characters per line.
+%     The result is returned within \cs{exp_not:n}, which means that the
+%     token list does not expand further when appearing in an
+%     \texttt{x}-type or \texttt{e}-type argument expansion.
 %   \end{texnote}
 % \end{function}
 %
-% \begin{function}[added = 2014-08-22, updated = 2021-04-29]{\tl_log:N, \tl_log:c}
+% \section{Manipulating tokens in token lists}
+%
+% \subsection{Replacing tokens}
+%
+% \begin{function}[updated = 2011-08-11]
+%   {
+%     \tl_replace_once:Nnn,  \tl_replace_once:cnn,
+%     \tl_greplace_once:Nnn, \tl_greplace_once:cnn
+%   }
 %   \begin{syntax}
-%     \cs{tl_log:N} \meta{tl~var}
+%     \cs{tl_replace_once:Nnn} \meta{tl~var} \Arg{old tokens} \Arg{new tokens}
 %   \end{syntax}
-%   Writes the content of the \meta{tl~var} in the log file.  See also
-%   \cs{tl_show:N} which displays the result in the terminal.
+%   Replaces the first (leftmost) occurrence of \meta{old tokens} in the
+%   \meta{tl~var} with \meta{new tokens}. \meta{Old tokens}
+%   cannot contain |{|, |}| or |#|
+%   (more precisely, explicit character tokens with category code $1$
+%   (begin-group) or $2$ (end-group), and tokens with category code $6$).
 % \end{function}
 %
-% \begin{function}[added = 2014-08-22, updated = 2015-08-07]{\tl_log:n}
+% \begin{function}[updated = 2011-08-11]
+%   {
+%     \tl_replace_all:Nnn, \tl_replace_all:cnn,
+%     \tl_greplace_all:Nnn, \tl_greplace_all:cnn
+%   }
 %   \begin{syntax}
-%     \cs{tl_log:n} \Arg{token list}
+%     \cs{tl_replace_all:Nnn} \meta{tl~var} \Arg{old tokens} \Arg{new tokens}
 %   \end{syntax}
-%   Writes the \meta{token list} in the log file.  See also
-%   \cs{tl_show:n} which displays the result in the terminal.
+%   Replaces all occurrences of \meta{old tokens} in the
+%   \meta{tl~var} with \meta{new tokens}. \meta{Old tokens}
+%   cannot contain |{|, |}| or |#|
+%   (more precisely, explicit character tokens with category code $1$
+%   (begin-group) or $2$ (end-group), and tokens with category code $6$).
+%   As this function
+%   operates from left to right, the pattern \meta{old tokens}
+%   may remain after the replacement (see \cs{tl_remove_all:Nn}
+%   for an example).
 % \end{function}
 %
+% \begin{function}[updated = 2011-08-11]
+%   {
+%     \tl_remove_once:Nn,  \tl_remove_once:cn,
+%     \tl_gremove_once:Nn, \tl_gremove_once:cn
+%   }
+%   \begin{syntax}
+%     \cs{tl_remove_once:Nn} \meta{tl~var} \Arg{tokens}
+%   \end{syntax}
+%   Removes the first (leftmost) occurrence of \meta{tokens} from the
+%   \meta{tl~var}. \meta{Tokens} cannot contain |{|, |}| or |#|
+%   (more precisely, explicit character tokens with category code $1$
+%   (begin-group) or $2$ (end-group), and tokens with category code $6$).
+% \end{function}
+%
+% \begin{function}[updated = 2011-08-11]
+%   {
+%     \tl_remove_all:Nn,  \tl_remove_all:cn,
+%     \tl_gremove_all:Nn, \tl_gremove_all:cn
+%   }
+%   \begin{syntax}
+%     \cs{tl_remove_all:Nn} \meta{tl~var} \Arg{tokens}
+%   \end{syntax}
+%   Removes all occurrences of \meta{tokens} from the
+%   \meta{tl~var}. \meta{Tokens} cannot contain |{|, |}| or |#|
+%   (more precisely, explicit character tokens with category code $1$
+%   (begin-group) or $2$ (end-group), and tokens with category code $6$).
+%   As this function
+%   operates from left to right, the pattern \meta{tokens}
+%   may remain after the removal, for instance,
+%   \begin{quote}
+%     \cs{tl_set:Nn} \cs{l_tmpa_tl} |{abbccd}|
+%     \cs{tl_remove_all:Nn} \cs{l_tmpa_tl} |{bc}|
+%   \end{quote}
+%   results in \cs{l_tmpa_tl} containing \texttt{abcd}.
+% \end{function}
+%
+% \subsection{Reassigning category codes}
+%
+% These functions allow the rescanning of tokens: re-apply \TeX{}'s
+% tokenization process to apply category codes different from those
+% in force when the tokens were absorbed. Whilst this functionality is
+% supported, it is often preferable to find alternative approaches
+% to achieving outcomes rather than rescanning tokens (for example
+% construction of token lists token-by-token with intervening category
+% code changes or using \cs{char_generate:nn}).
+%
+% \begin{function}[updated = 2015-08-11]
+%   {
+%     \tl_set_rescan:Nnn,  \tl_set_rescan:Nno,  \tl_set_rescan:Nnx,
+%     \tl_set_rescan:cnn,  \tl_set_rescan:cno,  \tl_set_rescan:cnx,
+%     \tl_gset_rescan:Nnn, \tl_gset_rescan:Nno, \tl_gset_rescan:Nnx,
+%     \tl_gset_rescan:cnn, \tl_gset_rescan:cno, \tl_gset_rescan:cnx
+%   }
+%   \begin{syntax}
+%     \cs{tl_set_rescan:Nnn} \meta{tl~var} \Arg{setup} \Arg{tokens}
+%   \end{syntax}
+%   Sets \meta{tl~var} to contain \meta{tokens}, applying the category
+%   code r\'{e}gime specified in the \meta{setup} before carrying out
+%   the assignment. (Category codes applied to tokens not explicitly covered
+%   by the \meta{setup} are those in force at the point of use of
+%   \cs{tl_set_rescan:Nnn}.)
+%   This allows the \meta{tl~var} to contain material
+%   with category codes other than those that apply when \meta{tokens}
+%   are absorbed.  The \meta{setup} is run within a group and may
+%   contain any valid input, although only changes in category codes,
+%   such as uses of \cs{cctab_select:N},
+%   are relevant. See also \cs{tl_rescan:nn}.
+%   \begin{texnote}
+%     The \meta{tokens} are first turned into a string (using
+%     \cs{tl_to_str:n}).  If the string contains one or more characters
+%     with character code \tn{newlinechar} (set equal to
+%     \tn{endlinechar} unless that is equal to $32$, before the user
+%     \meta{setup}), then it is split into lines at these characters,
+%     then read as if reading multiple lines from a file, ignoring
+%     spaces (catcode $10$) at the beginning and spaces and tabs
+%     (character code $32$ or $9$) at the end of every line.
+%     Otherwise, spaces (and tabs) are retained at both ends of the
+%     single-line string, as if it appeared in the middle of a line
+%     read from a file.
+%   \end{texnote}
+% \end{function}
+%
+% \begin{function}[updated = 2015-08-11]{\tl_rescan:nn}
+%   \begin{syntax}
+%     \cs{tl_rescan:nn} \Arg{setup} \Arg{tokens}
+%   \end{syntax}
+%   Rescans \meta{tokens} applying the category code r\'{e}gime
+%   specified in the \meta{setup}, and leaves the resulting tokens in
+%   the input stream. (Category codes applied to tokens not explicitly covered
+%   by the \meta{setup} are those in force at the point of use of
+%   \cs{tl_rescan:nn}.)
+%   The \meta{setup} is run within a group and may
+%   contain any valid input, although only changes in category codes,
+%   such as uses of \cs{cctab_select:N},
+%   are relevant.  See also \cs{tl_set_rescan:Nnn}, which is more
+%   robust than using \cs{tl_set:Nn} in the \meta{tokens} argument of
+%   \cs{tl_rescan:nn}.
+%   \begin{texnote}
+%     The \meta{tokens} are first turned into a string (using
+%     \cs{tl_to_str:n}).  If the string contains one or more characters
+%     with character code \tn{newlinechar} (set equal to
+%     \tn{endlinechar} unless that is equal to $32$, before the user
+%     \meta{setup}), then it is split into lines at these characters,
+%     then read as if reading multiple lines from a file, ignoring
+%     spaces (catcode $10$) at the beginning and spaces and tabs
+%     (character code $32$ or $9$) at the end of every line.
+%     Otherwise, spaces (and tabs) are retained at both ends of the
+%     single-line string, as if it appeared in the middle of a line
+%     read from a file.
+%
+%     Contrarily to the \tn{scantokens} primitive, \cs{tl_rescan:nn}
+%     tokenizes the whole string in the same category code regime rather
+%     than one token at a time, so that directives such as \tn{verb}
+%     that rely on changing category codes will not function properly.
+%   \end{texnote}
+% \end{function}
+%
 % \section{Constant token lists}
 %
 % \begin{variable}{\c_empty_tl}
@@ -1442,7 +1452,7 @@
 %   By using \cs{exp_not:n} token list variables can contain |#| tokens,
 %   which makes the token list registers provided by \TeX{}
 %   more or less redundant. The \cs{tl_set:No} version is done
-%   \enquote{by hand} as it is used quite a lot.
+%   by hand as it is used quite a lot.
 %    \begin{macrocode}
 \cs_new_protected:Npn \tl_set:Nn #1#2
   { \__kernel_tl_set:Nx #1 { \__kernel_exp_not:w {#2} } }
@@ -2289,7 +2299,7 @@
 %   The \cs{if_false:} constructions are a faster way to do
 %   \cs{group_align_safe_begin:} and \cs{group_align_safe_end:}.
 %   The \cs{scan_stop:} ensures that \texttt{f}-expanding
-%   \cs{tl_if_in:nn} does not lead to unbalanced braces.
+%   \cs{tl_if_in:nnTF} does not lead to unbalanced braces.
 %    \begin{macrocode}
 \prg_new_protected_conditional:Npnn \tl_if_in:nn #1#2 { T  , F , TF }
   {
@@ -2335,7 +2345,7 @@
 % \end{macro}
 %
 % \begin{macro}[EXP,pTF]{\tl_if_single:N}
-%   Expand the token list and feed it to \cs{tl_if_single:n}.
+%   Expand the token list and feed it to \cs{tl_if_single:nTF}.
 %    \begin{macrocode}
 \cs_new:Npn \tl_if_single_p:N { \exp_args:No \tl_if_single_p:n }
 \cs_new:Npn \tl_if_single:NT  { \exp_args:No \tl_if_single:nT  }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %
@@ -541,7 +541,7 @@
 % \begin{function}[EXP,pTF]{\token_if_parameter:N}
 %   \begin{syntax}
 %     \cs{token_if_parameter_p:N} \meta{token} \\
-%     \cs{token_if_alignment:NTF} \meta{token} \Arg{true code} \Arg{false code}
+%     \cs{token_if_parameter:NTF} \meta{token} \Arg{true code} \Arg{false code}
 %   \end{syntax}
 %   Tests if \meta{token} has the category code of a macro parameter token
 %   (|#| when normal \TeX{} category codes are in force).

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-10-18}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -62,7 +62,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-08-27}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %
@@ -139,7 +139,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{l3keys2e}{2021-08-27}{}
+\ProvidesExplPackage{l3keys2e}{2021-11-12}{}
   {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	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -63,7 +63,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-08-27}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %
@@ -166,7 +166,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xfp}{2021-08-27}{}
+\ProvidesExplPackage{xfp}{2021-11-12}{}
   {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	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -65,7 +65,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-08-27}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %
@@ -535,7 +535,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xfrac}{2021-08-27}{}
+\ProvidesExplPackage{xfrac}{2021-11-12}{}
   {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	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -67,7 +67,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-08-27}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %
@@ -1064,7 +1064,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xparse}{2021-08-27}{}
+\ProvidesExplPackage{xparse}{2021-11-12}{}
   {L3 Experimental document command parser}
 %    \end{macrocode}
 %
@@ -1249,6 +1249,39 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \subsection{Copying a command and its internal structure}
+%
+% The apparatus for copying commands is almost entirely in |ltcmd.dtx|,
+% preloaded in the \LaTeXe{} kernel.  The missing parts, regarding
+% copying the deprecated argument types |G|, |l| and |u| boil down to
+% copying the expandable grabber for |u|.
+%
+% \begin{macro}{\@@_copy_grabber_u:w}
+%   An expandable |u|-type uses a dedicated grabber just like a
+%   |D|-type, except that both its delimiter tokens are omitted, so to
+%   copy that we just copy a |D|-type and leave the last two arguments
+%   empty:
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_copy_grabber_u:w #1 #2 #3
+  { \@@_copy_grabber_D:w {#1} {#2} {#3} { } { } }
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Showing the definition of a command}
+%
+% \begin{macro}{\c_@@_show_type_u_tl,\c_@@_show_type_G_tl}
+%   Same as for copying, only small bits are missing here.  Namely, two
+%   token lists that tell the \pkg{ltcmd} mechanism how to deal with the
+%   argument types defined here.  Both |G| and |u| are classified
+%   as~|3|: commands that take a default value.  That's not really true
+%   for~|u|, but it's a close enough approximation to get the output we
+%   want.
+%    \begin{macrocode}
+\tl_const:Nn \c_@@_show_type_u_tl { 3 }
+\tl_const:Nn \c_@@_show_type_G_tl { 3 }
+%    \end{macrocode}
+% \end{macro}
+%
 % \subsection{Grabbing arguments}
 %
 % \begin{macro}{\@@_grab_G:w}

Modified: trunk/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -63,7 +63,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2021-08-27}
+% \date{Released 2021-11-12}
 %
 % \maketitle
 %
@@ -682,7 +682,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xtemplate}{2021-08-27}{}
+\ProvidesExplPackage{xtemplate}{2021-11-12}{}
   {L3 Experimental prototype document functions}
 %    \end{macrocode}
 %
@@ -1280,7 +1280,7 @@
     \seq_put_right:No \l_@@_key_order_seq \l_@@_key_name_tl
     \str_if_eq:onT \l_@@_keytype_tl { choice }
       {
-        \clist_if_in:NnT \l_@@_keytype_arg_tl { unknown }
+        \exp_args:No \clist_if_in:nnT \l_@@_keytype_arg_tl { unknown }
           { \msg_error:nn { xtemplate } { choice-unknown-reserved } }
       }
   }
@@ -1446,13 +1446,8 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\@@_store_value_code:n}
-% \begin{macro}{\@@_store_value_choice:n}
-% \begin{macro}{\@@_store_value_commalist:n}
-% \begin{macro}{\@@_store_value_function:n}
-% \begin{macro}{\@@_store_value_instance:n}
-% \begin{macro}{\@@_store_value_real:n}
-% \begin{macro}{\@@_store_value_tokenlist:n}
+% \begin{macro}{\@@_store_value_code:n, \@@_store_value_choice:n,
+%   \@@_store_value_function:n, \@@_store_value_instance:n}
 %   With no need to worry about delayed evaluation, these keytypes all
 %   just store the input directly.
 %    \begin{macrocode}
@@ -1459,82 +1454,42 @@
 \cs_new_protected:Npn \@@_store_value_code:n #1
   { \prop_put:Non \l_@@_values_prop \l_@@_key_name_tl {#1} }
 \cs_new_eq:NN \@@_store_value_choice:n    \@@_store_value_code:n
-\cs_new_eq:NN \@@_store_value_commalist:n \@@_store_value_code:n
 \cs_new_eq:NN \@@_store_value_function:n  \@@_store_value_code:n
 \cs_new_eq:NN \@@_store_value_instance:n  \@@_store_value_code:n
-\cs_new_eq:NN \@@_store_value_real:n      \@@_store_value_code:n
-\cs_new_eq:NN \@@_store_value_tokenlist:n \@@_store_value_code:n
 %    \end{macrocode}
 % \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
 %
-% \begin{macro}{\@@_store_value_integer:n}
-% \begin{macro}{\@@_store_value_length:n}
-% \begin{macro}{\@@_store_value_muskip:n}
-% \begin{macro}{\@@_store_value_skip:n}
-%   Storing the value of a number is in all cases more or less the same.
-%   If evaluation is taking place now, assignment is made to a scratch
-%   variable, and this result is then stored. On the other hand, if
-%   evaluation is delayed the current data is simply stored \enquote{as is}.
+% \begin{macro}{\@@_store_value_aux:Nn, \@@_store_value_integer:n,
+%   \@@_store_value_length:n, \@@_store_value_muskip:n,
+%   \@@_store_value_real:n, \@@_store_value_skip:n,
+%   \@@_store_value_tokenlist:n, \@@_store_value_commalist:n}
+%   Storing values in \cs{l_@@_values_prop} is in most cases the same.
+%   If evaluation is taking place now, one \texttt{x}-expands an
+%   evaluation function and the result is then stored. On the other
+%   hand, if evaluation is delayed the current data is simply stored
+%   \enquote{as is}.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_store_value_integer:n #1
+\cs_new_protected:Npn \@@_store_value_aux:Nn #1#2
   {
-    \@@_if_eval_now:nTF {#1}
-      {
-        \int_set:Nn \l_@@_tmp_int {#1}
-        \prop_put:NVV \l_@@_values_prop \l_@@_key_name_int
-          \l_@@_tmp_int
-      }
-      {
-        \prop_put:Non \l_@@_values_prop \l_@@_key_name_tl {#1}
-      }
+    \@@_if_eval_now:nTF {#2}
+      { \prop_put:NVx \l_@@_values_prop \l_@@_key_name_tl { #1 {#2} } }
+      { \prop_put:Non \l_@@_values_prop \l_@@_key_name_tl {#2} }
   }
-\cs_new_protected:Npn \@@_store_value_length:n #1
-  {
-    \@@_if_eval_now:nTF {#1}
-      {
-        \dim_set:Nn \l_@@_tmp_dim {#1}
-        \prop_put:NVV \l_@@_values_prop \l_@@_key_name_tl
-          \l_@@_tmp_dim
-      }
-      {
-        \prop_put:Non \l_@@_values_prop \l_@@_key_name_tl {#1}
-      }
-  }
-\cs_new_protected:Npn \@@_store_value_muskip:n #1
-  {
-    \@@_if_eval_now:nTF {#1}
-      {
-        \muskip_set:Nn \l_@@_tmp_muskip {#1}
-        \prop_put:NVV \l_@@_values_prop \l_@@_key_name_tl
-          \l_@@_tmp_muskip
-      }
-      {
-        \prop_put:Non \l_@@_values_prop \l_@@_key_name_tl {#1}
-      }
-  }
-\cs_new_protected:Npn \@@_store_value_skip:n #1
-  {
-    \@@_if_eval_now:nTF {#1}
-      {
-        \skip_set:Nn \l_@@_tmp_skip {#1}
-        \prop_put:NVV \l_@@_values_prop \l_@@_key_name_tl
-          \l_@@_tmp_skip
-      }
-      {
-        \prop_put:Non \l_@@_values_prop \l_@@_key_name_tl {#1}
-      }
-  }
+\cs_new_protected:Npn \@@_store_value_integer:n
+  { \@@_store_value_aux:Nn \int_eval:n }
+\cs_new_protected:Npn \@@_store_value_length:n
+  { \@@_store_value_aux:Nn \dim_eval:n }
+\cs_new_protected:Npn \@@_store_value_muskip:n
+  { \@@_store_value_aux:Nn \muskip_eval:n }
+\cs_new_protected:Npn \@@_store_value_real:n
+  { \@@_store_value_aux:Nn \fp_eval:n }
+\cs_new_protected:Npn \@@_store_value_skip:n
+  { \@@_store_value_aux:Nn \skip_eval:n }
+\cs_new_protected:Npn \@@_store_value_tokenlist:n
+  { \@@_store_value_aux:Nn \use:n }
+\cs_new_eq:NN \@@_store_value_commalist:n \@@_store_value_tokenlist:n
 %    \end{macrocode}
 % \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
 %
 % \subsection{Implementation part of template declaration}
 %
@@ -1713,7 +1668,7 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_implement_choices:n #1
   {
-    \clist_set_eq:NN \l_@@_tmp_clist \l_@@_keytype_arg_tl
+    \clist_set:No \l_@@_tmp_clist { \l_@@_keytype_arg_tl }
     \prop_put:Non \l_@@_vars_prop \l_@@_key_name_tl { }
     \keyval_parse:NNn
       \@@_implement_choice_elt:n \@@_implement_choice_elt:nn

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3benchmark/l3benchmark.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3benchmark/l3benchmark.sty	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3benchmark/l3benchmark.sty	2021-11-12 23:04:14 UTC (rev 61040)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3benchmark.dtx
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3benchmark}{2021-08-27}{}
+\ProvidesExplPackage{l3benchmark}{2021-11-12}{}
   {L3 Experimental benchmarking}
 \fp_new:N \g_benchmark_duration_target_fp
 \fp_gset:Nn \g_benchmark_duration_target_fp { 1 }

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3bitset/l3bitset.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3bitset/l3bitset.sty	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3bitset/l3bitset.sty	2021-11-12 23:04:14 UTC (rev 61040)
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: l3bitset.dtx
-\ProvidesExplPackage{l3bitset}{2021-08-27}{}
+\ProvidesExplPackage{l3bitset}{2021-11-12}{}
   {L3 Experimental bitset support}
 \cs_new_protected:Npn \bitset_new:N #1
   {

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty	2021-11-12 23:04:14 UTC (rev 61040)
@@ -28,7 +28,7 @@
 %% 
 %% File: l3draw.dtx
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3draw}{2021-08-27}{}
+\ProvidesExplPackage{l3draw}{2021-11-12}{}
   {L3 Experimental core drawing support}
 \scan_new:N \s__draw_mark
 \scan_new:N \s__draw_stop
@@ -963,6 +963,47 @@
       { #6 + #4 * #1 + #2 * #3 * #5 , #7 + #5 * #1 + -1 * #2 * #3 * #4 }
   }
 \cs_generate_variant:Nn \__draw_point_intersect_circles_auxvii:nnnnnnn { fff }
+\cs_new:Npn \draw_point_intersect_line_circle:nnnnn #1#2#3#4#5
+  {
+    \__draw_point_process:nnnn
+      { \__draw_point_intersect_line_circle_auxi:nnnnnnnn {#4} {#5} }
+      {#1} {#2} {#3}
+  }
+\cs_new:Npn \__draw_point_intersect_line_circle_auxi:nnnnnnnn #1#2#3#4#5#6#7#8
+  {
+    \__draw_point_intersect_line_circle_auxii:fnnnnnnn
+      { \fp_eval:n {#1} } {#3} {#4} {#5} {#6} {#7} {#8} {#2}
+  }
+\cs_new:Npn \__draw_point_intersect_line_circle_auxii:nnnnnnnn #1#2#3#4#5#6#7#8
+  {
+    \__draw_point_intersect_line_circle_auxiii:fffnnnnn
+      { \fp_eval:n { (#4-#2)*(#4-#2)+(#5-#3)*(#5-#3) } }
+      { \fp_eval:n { 2*((#4-#2)*(#2-#6)+(#5-#3)*(#3-#7)) } }
+      { \fp_eval:n { (#6*#6+#7*#7)+(#2*#2+#3*#3)-(2*(#6*#2+#7*#3))-(#1*#1) } }
+      {#2} {#3} {#4} {#5} {#8}
+  }
+\cs_generate_variant:Nn \__draw_point_intersect_line_circle_auxii:nnnnnnnn { f }
+\cs_new:Npn \__draw_point_intersect_line_circle_auxiii:nnnnnnnn #1#2#3#4#5#6#7#8
+  {
+    \__draw_point_intersect_line_circle_auxiv:ffnnnnnn
+      { \fp_eval:n {  #2 * #2 - 4 * #1 * #3 } }
+      { \int_if_odd:nTF {#8} { 1 } { -1 } }
+      {#1} {#2} {#4} {#5} {#6} {#7}
+  }
+\cs_generate_variant:Nn \__draw_point_intersect_line_circle_auxiii:nnnnnnnn { fff }
+\cs_new:Npn \__draw_point_intersect_line_circle_auxiv:nnnnnnnn #1#2#3#4#5#6#7#8
+  {
+    \__draw_point_intersect_line_circle_auxv:fnnnn
+      { \fp_eval:n { (-1 * #4 + #2 * sqrt(#1)) / (2 * #3) } }
+      {#5} {#6} {#7} {#8}
+  }
+\cs_generate_variant:Nn \__draw_point_intersect_line_circle_auxiv:nnnnnnnn { ff }
+\cs_new:Npn \__draw_point_intersect_line_circle_auxv:nnnnn #1#2#3#4#5
+  {
+    \draw_point:n
+      { #2 + #1 * (#4 - #2), #3 + #1 * (#5 - #3) }
+  }
+\cs_generate_variant:Nn \__draw_point_intersect_line_circle_auxv:nnnnn { f }
 \cs_new:Npn \draw_point_interpolate_line:nnn #1#2#3
   {
     \__draw_point_process:nnn

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3graphics/l3graphics.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3graphics/l3graphics.sty	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3graphics/l3graphics.sty	2021-11-12 23:04:14 UTC (rev 61040)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3graphics.dtx
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3graphics}{2021-08-27}{}
+\ProvidesExplPackage{l3graphics}{2021-11-12}{}
   {L3 Experimental graphics inclusion support}
 \ior_new:N \l__graphics_tmp_ior
 \tl_new:N  \l__graphics_tmp_tl

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3opacity/l3opacity.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3opacity/l3opacity.sty	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3opacity/l3opacity.sty	2021-11-12 23:04:14 UTC (rev 61040)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3opacity.dtx
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3opacity}{2021-08-27}{}
+\ProvidesExplPackage{l3opacity}{2021-11-12}{}
   {L3 Experimental opacity support}
 \cs_new_protected:Npn \opacity_select:n #1
   { \__opacity_select:nN {#1} \__opacity_backend_select:n }

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty	2021-11-12 23:04:14 UTC (rev 61040)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3str-format.dtx
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3str-format}{2021-08-27}{}
+\ProvidesExplPackage{l3str-format}{2021-11-12}{}
   {L3 Experimental string formatting}
 \cs_generate_variant:Nn \use:nn { nf }
 \cs_generate_variant:Nn \use:nnn { fnf }

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3sys-shell/l3sys-shell.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3sys-shell/l3sys-shell.sty	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3sys-shell/l3sys-shell.sty	2021-11-12 23:04:14 UTC (rev 61040)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3sys-shell.dtx
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3sys-shell}{2021-08-27}{}
+\ProvidesExplPackage{l3sys-shell}{2021-11-12}{}
   {L3 Experimental system shell functions}
 \scan_new:N \s__sys_stop
 \quark_new:N \q__sys_nil

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty	2021-11-12 23:04:14 UTC (rev 61040)
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: xcoffins.dtx
-\ProvidesExplPackage{xcoffins}{2021-08-27}{}
+\ProvidesExplPackage{xcoffins}{2021-11-12}{}
   {L3 Experimental design level coffins}
 \keys_define:nn { coffin }
   {

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty	2021-11-12 23:04:14 UTC (rev 61040)
@@ -32,7 +32,7 @@
       }%
     \endinput
   }
-\ProvidesExplPackage{l3galley}{2021-08-27}{}
+\ProvidesExplPackage{l3galley}{2021-11-12}{}
   {L3 Experimental galley code}
 \int_new:N \l__galley_tmp_int
 \seq_new:N \g__galley_tmpa_seq

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty	2021-11-12 23:04:14 UTC (rev 61040)
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: xgalley.dtx
-\ProvidesExplPackage{xgalley}{2021-08-27}{}
+\ProvidesExplPackage{xgalley}{2021-11-12}{}
   {L3 Experimental galley}
 \RequirePackage{xtemplate,l3galley}
 \clist_new:N \l__galley_tmpa_clist

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex	2021-11-12 23:04:14 UTC (rev 61040)
@@ -70,7 +70,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx
-\def\ExplFileDate{2021-10-18}%
+\def\ExplFileDate{2021-11-12}%
 \begingroup
   \def\next{\endgroup}%
   \expandafter\ifx\csname PackageError\endcsname\relax
@@ -4962,9 +4962,7 @@
   }
 \prg_new_conditional:Npnn \str_if_eq:nn #1#2 { p , T , F , TF }
   {
-    \if_int_compare:w
-      \__str_if_eq:nn { \exp_not:n {#1} } { \exp_not:n {#2} }
-      = \c_zero_int
+    \if:w 0 \__str_if_eq:nn { \exp_not:n {#1} } { \exp_not:n {#2} }
       \prg_return_true: \else: \prg_return_false: \fi:
   }
 \prg_generate_conditional_variant:Nnn \str_if_eq:nn
@@ -4971,14 +4969,13 @@
   { V , v , o , nV , no , VV , nv } { p , T , F , TF }
 \prg_new_conditional:Npnn \str_if_eq:ee #1#2 { p , T , F , TF }
   {
-    \if_int_compare:w \__str_if_eq:nn {#1} {#2} = \c_zero_int
+    \if:w 0 \__str_if_eq:nn {#1} {#2}
       \prg_return_true: \else: \prg_return_false: \fi:
   }
 \prg_new_conditional:Npnn \str_if_eq:NN #1#2 { p , TF , T , F }
   {
-    \if_int_compare:w
-      \__str_if_eq:nn { \tl_to_str:N #1 } { \tl_to_str:N #2 }
-      = \c_zero_int \prg_return_true: \else: \prg_return_false: \fi:
+    \if:w 0 \__str_if_eq:nn { \tl_to_str:N #1 } { \tl_to_str:N #2 }
+      \prg_return_true: \else: \prg_return_false: \fi:
   }
 \prg_generate_conditional_variant:Nnn \str_if_eq:NN
   { c , Nc , cc } { T , F , TF , p }
@@ -7117,12 +7114,13 @@
     \fi:
   }
 \prg_generate_conditional_variant:Nnn \bool_if:N { c } { p , T , F , TF }
+\cs_new:Npn \bool_to_str:N #1 { \bool_if:NTF #1 { true } { false } }
+\cs_generate_variant:Nn \bool_to_str:N { c }
+\cs_new:Npn \bool_to_str:n #1 { \bool_if:nTF {#1} { true } { false } }
 \cs_new_protected:Npn \bool_show:n
-  { \msg_show_eval:Nn \__bool_to_str:n }
+  { \msg_show_eval:Nn \bool_to_str:n }
 \cs_new_protected:Npn \bool_log:n
-  { \msg_log_eval:Nn \__bool_to_str:n }
-\cs_new:Npn \__bool_to_str:n #1
-  { \bool_if:nTF {#1} { true } { false } }
+  { \msg_log_eval:Nn \bool_to_str:n }
 \cs_new_protected:Npn \bool_show:N { \__bool_show:NN \tl_show:n }
 \cs_generate_variant:Nn \bool_show:N { c }
 \cs_new_protected:Npn \bool_log:N { \__bool_show:NN \tl_log:n }
@@ -9493,84 +9491,52 @@
 \cs_new_protected:Npn \__prop_concat:NNNN #1#2#3#4
   {
     \prop_set_eq:NN \l__prop_internal_prop #3
-    \prop_map_tokens:Nn #4 { \prop_put:Nnn \l__prop_internal_prop }
+    \prop_map_inline:Nn #4 { \prop_put:Nnn \l__prop_internal_prop {##1} {##2} }
     #1 #2 \l__prop_internal_prop
   }
-\cs_new_protected:Npn \prop_set_from_keyval:Nn #1#2
+\cs_new_protected:Npn \prop_set_from_keyval:Nn #1
   {
-    \prop_clear:N \l__prop_internal_prop
-    \__prop_from_keyval:n {#2}
-    \prop_set_eq:NN #1 \l__prop_internal_prop
-    \prop_clear:N \l__prop_internal_prop
+    \prop_clear:N #1
+    \prop_put_from_keyval:Nn #1
   }
 \cs_generate_variant:Nn \prop_set_from_keyval:Nn { c }
-\cs_new_protected:Npn \prop_gset_from_keyval:Nn #1#2
+\cs_new_protected:Npn \prop_gset_from_keyval:Nn #1
   {
-    \prop_clear:N \l__prop_internal_prop
-    \__prop_from_keyval:n {#2}
-    \prop_gset_eq:NN #1 \l__prop_internal_prop
-    \prop_clear:N \l__prop_internal_prop
+    \prop_gclear:N #1
+    \prop_gput_from_keyval:Nn #1
   }
 \cs_generate_variant:Nn \prop_gset_from_keyval:Nn { c }
 \cs_new_protected:Npn \prop_const_from_keyval:Nn #1#2
   {
-    \prop_clear:N \l__prop_internal_prop
-    \__prop_from_keyval:n {#2}
+    \prop_set_from_keyval:Nn \l__prop_internal_prop {#2}
     \tl_const:Nx #1 { \exp_not:o \l__prop_internal_prop }
     \prop_clear:N \l__prop_internal_prop
   }
 \cs_generate_variant:Nn \prop_const_from_keyval:Nn { c }
-\cs_new_protected:Npn \prop_put_from_keyval:Nn #1#2
+\cs_new_protected:Npn \prop_put_from_keyval:Nn
   {
-    \prop_set_eq:NN \l__prop_internal_prop #1
-    \__prop_from_keyval:n {#2}
-    \prop_set_eq:NN #1 \l__prop_internal_prop
-    \prop_clear:N \l__prop_internal_prop
+    \bool_if:NTF \l__kernel_keyval_allow_blank_keys_bool
+      { \__prop_keyval_parse:NNNn \c_true_bool }
+      { \__prop_keyval_parse:NNNn \c_false_bool }
+      \prop_put:Nnn
   }
 \cs_generate_variant:Nn \prop_put_from_keyval:Nn { c }
-\cs_new_protected:Npn \prop_gput_from_keyval:Nn #1#2
+\cs_new_protected:Npn \prop_gput_from_keyval:Nn
   {
-    \prop_set_eq:NN \l__prop_internal_prop #1
-    \__prop_from_keyval:n {#2}
-    \prop_gset_eq:NN #1 \l__prop_internal_prop
-    \prop_clear:N \l__prop_internal_prop
+    \bool_if:NTF \l__kernel_keyval_allow_blank_keys_bool
+      { \__prop_keyval_parse:NNNn \c_true_bool }
+      { \__prop_keyval_parse:NNNn \c_false_bool }
+      \prop_gput:Nnn
   }
 \cs_generate_variant:Nn \prop_gput_from_keyval:Nn { c }
-\cs_new_protected:Npn \__prop_from_keyval:n #1
+\cs_new_protected:Npn \__prop_missing_eq:n
+  { \msg_error:nnn { prop } { prop-keyval } }
+\cs_new_protected:Npn \__prop_keyval_parse:NNNn #1#2#3#4
   {
-    \__prop_from_keyval_loop:w \prg_do_nothing: #1 ,
-      \q__prop_recursion_tail , \q__prop_recursion_stop
+    \bool_set_eq:NN \l__kernel_keyval_allow_blank_keys_bool \c_true_bool
+    \keyval_parse:nnn \__prop_missing_eq:n { #2 #3 } {#4}
+    \bool_set_eq:NN \l__kernel_keyval_allow_blank_keys_bool #1
   }
-\cs_new_protected:Npn \__prop_from_keyval_loop:w #1 ,
-  {
-    \__prop_if_recursion_tail_stop:o {#1}
-    \__prop_from_keyval_split:Nw \__prop_from_keyval_key:n
-      #1 = = \s__prop_stop {#1}
-    \__prop_from_keyval_loop:w \prg_do_nothing:
-  }
-\cs_new_protected:Npn \__prop_from_keyval_split:Nw #1#2 =
-  { \tl_trim_spaces_apply:oN {#2} #1 }
-\cs_new_protected:Npn \__prop_from_keyval_key:n #1
-  { \__prop_from_keyval_key:w #1 \s__prop_mark }
-\cs_new_protected:Npn \__prop_from_keyval_key:w #1 \s__prop_mark #2 \s__prop_stop
-  {
-    \__prop_from_keyval_split:Nw \__prop_from_keyval_value:n
-      \prg_do_nothing: #2 \s__prop_stop {#1}
-  }
-\cs_new_protected:Npn \__prop_from_keyval_value:n #1
-  { \__prop_from_keyval_value:w #1 \s__prop_mark }
-\cs_new_protected:Npn \__prop_from_keyval_value:w #1 \s__prop_mark #2 \s__prop_stop #3#4
-  {
-    \tl_if_single:nTF {#2}
-      { \prop_put:Nnn \l__prop_internal_prop {#3} {#1} }
-      {
-        \tl_if_empty:nF { #3 #1 #2 }
-          {
-            \msg_error:nnx { prop } { prop-keyval }
-              { \exp_not:o {#4} }
-          }
-      }
-  }
 \cs_new_protected:Npn \__prop_split:NnTF #1#2
   { \exp_args:NNo \__prop_split_aux:NnTF #1 { \tl_to_str:n {#2} } }
 \cs_new_protected:Npn \__prop_split_aux:NnTF #1#2#3#4
@@ -10640,7 +10606,7 @@
 \msg_new:nnn { prg } { negative-replication }
   { Negative~argument~for~\iow_char:N\\prg_replicate:nn. }
 \msg_new:nnn { prop } { prop-keyval }
-  { Missing/extra~'='~in~'#1'~(in~'..._keyval:Nn') }
+  { Missing~'='~in~'#1'~(in~'..._keyval:Nn') }
 \msg_new:nnn { kernel } { unknown-comparison }
   { Relation~'#1'~not~among~=,<,>,==,!=,<=,>=. }
 \msg_new:nnn { kernel } { zero-step }
@@ -12776,6 +12742,7 @@
 \scan_new:N \s__keyval_mark
 \scan_new:N \s__keyval_stop
 \scan_new:N \s__keyval_tail
+\bool_new:N \l__kernel_keyval_allow_blank_keys_bool
 \group_begin:
   \cs_set_protected:Npn \__keyval_tmp:w #1#2
     {
@@ -12946,9 +12913,11 @@
 \cs_new:Npn \__keyval_if_recursion_tail:w \s__keyval_mark #1 \s__keyval_tail { }
 \cs_new:Npn \__keyval_blank_true:w \s__keyval_mark \s__keyval_stop \__keyval_trim:nN #1 \__keyval_key:nn
   { \__keyval_loop_other:nnw }
-\cs_new:Npn \__keyval_blank_key_error:w #1 \__keyval_loop_other:nnw
+\cs_new:Npn \__keyval_blank_key_error:w \s__keyval_mark \s__keyval_stop #1 \__keyval_loop_other:nnw
   {
-    \msg_expandable_error:nn { keyval } { blank-key-name }
+    \bool_if:NTF \l__kernel_keyval_allow_blank_keys_bool
+      { #1 }
+      { \msg_expandable_error:nn { keyval } { blank-key-name } }
     \__keyval_loop_other:nnw
   }
 \msg_new:nnn { keyval } { misplaced-equals-sign }
@@ -13316,7 +13285,7 @@
       }
       {
         \msg_error:nnx { keys }
-          { property-boolean-values-only }
+          { boolean-values-only }
           { .value_ #1 :n }
       }
   }
@@ -13489,6 +13458,22 @@
   { \__keys_variable_set_required:NnnN #1 { skip } { g } n }
 \cs_new_protected:cpn { \c__keys_props_root_str .skip_gset:c } #1
   { \__keys_variable_set_required:cnnN {#1} { skip } { g } n }
+\cs_new_protected:cpn { \c__keys_props_root_str .str_set:N } #1
+  { \__keys_variable_set:NnnN #1 { str } { } n }
+\cs_new_protected:cpn { \c__keys_props_root_str .str_set:c } #1
+  { \__keys_variable_set:cnnN {#1} { str } { } n }
+\cs_new_protected:cpn { \c__keys_props_root_str .str_set_x:N } #1
+  { \__keys_variable_set:NnnN #1 { str } { } x }
+\cs_new_protected:cpn { \c__keys_props_root_str .str_set_x:c } #1
+  { \__keys_variable_set:cnnN {#1} { str } { } x }
+\cs_new_protected:cpn { \c__keys_props_root_str .str_gset:N } #1
+  { \__keys_variable_set:NnnN #1 { str } { g } n }
+\cs_new_protected:cpn { \c__keys_props_root_str .str_gset:c } #1
+  { \__keys_variable_set:cnnN {#1} { str } { g } n }
+\cs_new_protected:cpn { \c__keys_props_root_str .str_gset_x:N } #1
+  { \__keys_variable_set:NnnN #1 { str } { g } x }
+\cs_new_protected:cpn { \c__keys_props_root_str .str_gset_x:c } #1
+  { \__keys_variable_set:cnnN {#1} { str } { g } x }
 \cs_new_protected:cpn { \c__keys_props_root_str .tl_set:N } #1
   { \__keys_variable_set:NnnN #1 { tl } { } n }
 \cs_new_protected:cpn { \c__keys_props_root_str .tl_set:c } #1
@@ -15782,9 +15767,7 @@
   {
     \if_catcode:w \scan_stop: \exp_not:N #1
       \if_meaning:w \scan_stop: #1
-        \if_int_compare:w
-            \__fp_str_if_eq:nn { \s__fp } { \exp_not:N #1 }
-            = \c_zero_int
+        \if:w 0 \__fp_str_if_eq:nn { \s__fp } { \exp_not:N #1 }
           0
           \msg_expandable_error:nnn
             { fp } { after-e } { floating~point~ }
@@ -15796,9 +15779,7 @@
           \prg_return_false:
         \fi:
       \else:
-        \if_int_compare:w
-            \__fp_str_if_eq:nn { \int_value:w #1 } { \tex_the:D #1 }
-            = \c_zero_int
+        \if:w 0 \__fp_str_if_eq:nn { \int_value:w #1 } { \tex_the:D #1 }
           \int_value:w #1
         \else:
           0
@@ -16084,9 +16065,7 @@
 \cs_new:Npn \__fp_parse_infix:NN #1 #2
   {
     \if_catcode:w \scan_stop: \exp_not:N #2
-      \if_int_compare:w
-          \__fp_str_if_eq:nn { \s__fp_expr_mark } { \exp_not:N #2 }
-          = \c_zero_int
+      \if:w 0 \__fp_str_if_eq:nn { \s__fp_expr_mark } { \exp_not:N #2 }
         \exp_after:wN \exp_after:wN
         \exp_after:wN \__fp_parse_infix_mark:NNN
       \else:
@@ -16128,9 +16107,7 @@
 \cs_new:Npn \__fp_parse_infix_after_paren:NN #1 #2
   {
     \if_catcode:w \scan_stop: \exp_not:N #2
-      \if_int_compare:w
-          \__fp_str_if_eq:nn { \s__fp_expr_mark } { \exp_not:N #2 }
-          = \c_zero_int
+      \if:w 0 \__fp_str_if_eq:nn { \s__fp_expr_mark } { \exp_not:N #2 }
         \exp_after:wN \exp_after:wN
         \exp_after:wN \__fp_parse_infix_mark:NNN
       \else:
@@ -18769,8 +18746,7 @@
 \cs_new:Npn \__fp_pow_normal_o:ww
     \s__fp \__fp_chk:w 1 #1#2#3; \s__fp \__fp_chk:w #4#5
   {
-    \if_int_compare:w \__fp_str_if_eq:nn { #2 #3 }
-              { 1 {1000} {0000} {0000} {0000} } = \c_zero_int
+    \if:w 0 \__fp_str_if_eq:nn { #2 #3 } { 1 {1000} {0000} {0000} {0000} }
       \if_int_compare:w #4 #1 = 32 \exp_stop_f:
         \exp_after:wN \__fp_case_return_ii_o:ww
       \fi:
@@ -27973,18 +27949,18 @@
     \tl_set:Nx #4
       {
         \cs_if_exist:cTF { __color_convert_ #1 _ #2 :w }
-          { \use:c { __color_convert_ #1 _ #2 :w } #3 ~ 0 ~ 0 ~ 0 \s__color_stop }
+          { \use:c { __color_convert_ #1 _ #2 :w } #3 \s__color_stop }
           { \use:c { c__color_fallback_ #2 _tl } }
       }
   }
 \cs_generate_variant:Nn \__color_convert:nnnN { nV , nnV }
-\cs_new:Npn \__color_convert_gray_rgb:w #1 ~ #2 \s__color_stop
+\cs_new:Npn \__color_convert_gray_rgb:w #1 \s__color_stop
   { #1 ~ #1 ~ #1 }
-\cs_new:Npn \__color_convert_gray_cmyk:w #1 ~ #2 \s__color_stop
+\cs_new:Npn \__color_convert_gray_cmyk:w #1 \s__color_stop
   { 0 ~ 0 ~ 0 ~ \fp_eval:n { 1 - #1 } }
-\cs_new:Npn \__color_convert_rgb_gray:w #1 ~ #2 ~ #3 ~ #4 \s__color_stop
+\cs_new:Npn \__color_convert_rgb_gray:w #1 ~ #2 ~ #3 \s__color_stop
   { \fp_eval:n { 0.3 * #1 + 0.59 * #2 + 0.11 * #3 } }
-\cs_new:Npn \__color_convert_rgb_cmyk:w #1 ~ #2 ~ #3 ~ #4 \s__color_stop
+\cs_new:Npn \__color_convert_rgb_cmyk:w #1 ~ #2 ~ #3 \s__color_stop
   {
     \exp_args:Nf \__color_convert_rgb_cmyk:nnnn
       { \fp_eval:n { min ( 1 - #1 , 1 - #2 , 1 - #3 ) } } {#1} {#2} {#3}
@@ -27996,9 +27972,9 @@
     \fp_eval:n { min ( 1 , max ( 0 , 1 - #4 - #1 ) ) } \c_space_tl
     #1
   }
-\cs_new:Npn \__color_convert_cmyk_gray:w #1 ~ #2 ~ #3 ~ #4 ~ #5 \s__color_stop
+\cs_new:Npn \__color_convert_cmyk_gray:w #1 ~ #2 ~ #3 ~ #4 \s__color_stop
   { \fp_eval:n { 1 - min ( 1 , 0.3 * #1 + 0.59 * #2 + 0.11 * #3 + #4 ) } }
-\cs_new:Npn \__color_convert_cmyk_rgb:w #1 ~ #2 ~ #3 ~ #4 ~ #5 \s__color_stop
+\cs_new:Npn \__color_convert_cmyk_rgb:w #1 ~ #2 ~ #3 ~ #4 \s__color_stop
   {
     \fp_eval:n { 1 - min ( 1 , #1 + #4 ) } \c_space_tl
     \fp_eval:n { 1 - min ( 1 , #2 + #4 ) } \c_space_tl
@@ -28636,7 +28612,10 @@
   {
     \fp_compare:nNnTF {#1} = { 0 }
       { 00 }
-      { \int_to_Hex:n { \fp_to_int:n { #1 * 255 } } }
+      {
+        \fp_compare:nNnT { #1 * 255 } < { 16 } { 0 }
+        \int_to_Hex:n { \fp_to_int:n { #1 * 255 } }
+      }
   }
 \cs_new_protected:cpn { __color_export_space-sep-rgb:Nw } #1#2 \s__color_stop
   { \tl_set:Nn #1 {#2} }
@@ -28791,7 +28770,7 @@
   }
 \cs_new_protected:Npn \__color_model_separation_cmyk:nnnnnn #1#2#3#4#5#6
   {
-    \cs_new:cpn { __color_convert_ #1 _cmyk:w } ##1 ~ ##2 \s__color_stop
+    \cs_new:cpn { __color_convert_ #1 _cmyk:w } ##1 \s__color_stop
       {
          \fp_eval:n {##1 * #3} ~
          \fp_eval:n {##1 * #4} ~
@@ -28806,7 +28785,7 @@
   }
 \cs_new_protected:Npn \__color_model_separation_rgb:nnnnnn #1#2#3#4#5#6
   {
-    \cs_new:cpn { __color_convert_ #1 _rgb:w } ##1 ~ ##2 \s__color_stop
+    \cs_new:cpn { __color_convert_ #1 _rgb:w } ##1 \s__color_stop
       {
          \fp_eval:n {##1 * #3} ~
          \fp_eval:n {##1 * #4} ~
@@ -28820,7 +28799,7 @@
   }
 \cs_new_protected:Npn \__color_model_separation_gray:nnnnnn #1#2#3#4#5#6
   {
-    \cs_new:cpn { __color_convert_ #1 _cmyk:w } ##1 ~ ##2 \s__color_stop
+    \cs_new:cpn { __color_convert_ #1 _cmyk:w } ##1 \s__color_stop
       {
         \fp_eval:n {##1 * #3} ~
         \fp_eval:n {##1 * #3} ~
@@ -28827,9 +28806,9 @@
         \fp_eval:n {##1 * #3} ~
         \fp_eval:n {##1 * #3}
       }
-    \cs_new:cpn { __color_convert_ #1 _gray:w } ##1 ~ ##2 \s__color_stop
+    \cs_new:cpn { __color_convert_ #1 _gray:w } ##1 \s__color_stop
       { \fp_eval:n {##1 * #3} }
-    \cs_new:cpn { __color_convert_ #1 _rgb:w } ##1 ~ ##2 \s__color_stop
+    \cs_new:cpn { __color_convert_ #1 _rgb:w } ##1 \s__color_stop
       {
         \fp_eval:n {##1 * #3} ~
         \fp_eval:n {##1 * #3} ~
@@ -28840,11 +28819,11 @@
   }
 \cs_new_protected:Npn \__color_model_convert:nnn #1#2#3
   {
-    \cs_new:cpx { __color_convert_ #1 _ #3 :w } ##1 ~ ##2 \s__color_stop
+    \cs_new:cpx { __color_convert_ #1 _ #3 :w } ##1 \s__color_stop
       {
         \exp_not:N \exp_args:NNe \exp_not:N \use:nn
         \exp_not:c { __color_convert_  #2 _ #3 :w }
-          { \exp_not:c { __color_convert_ #1 _ #2 :w } ##1 ~ ##2 \s__color_stop }
+          { \exp_not:c { __color_convert_ #1 _ #2 :w } ##1 \s__color_stop }
           \c_space_tl \exp_not:N \s__color_stop
       }
   }
@@ -28865,11 +28844,11 @@
     \tl_if_exist:cTF { c__color_model_whitepoint_CIELAB_ #1 _tl }
       {
         \__color_backend_separation_init_CIELAB:nnn {#1} {#3} { #4 ~ #5 ~ #6 }
-        \cs_new:cpn { __color_convert_ #2 _cmyk:w } ##1 ~ ##2 \s__color_stop
+        \cs_new:cpn { __color_convert_ #2 _cmyk:w } ##1 \s__color_stop
           { 0 ~ 0 ~ 0 ~ 1 }
-        \cs_new:cpn { __color_convert_ #2 _rgb:w } ##1 ~ ##2 \s__color_stop
+        \cs_new:cpn { __color_convert_ #2 _rgb:w } ##1 \s__color_stop
           { 1 ~ 1 ~ 1 }
-        \cs_new:cpn { __color_convert_ #2 _gray:w } ##1 ~ ##2 \s__color_stop
+        \cs_new:cpn { __color_convert_ #2 _gray:w } ##1 \s__color_stop
           { 1 }
       }
       {
@@ -29047,7 +29026,7 @@
         \prop_get:NnN \g__color_alternative_values_prop {##1}
           \l__color_value_tl
         \exp_after:wN \__color_model_devicen_transform:w
-          \l__color_value_tl , 0 , 0 , 0 \s__color_stop {#1} {#2}
+          \l__color_value_tl , 0 , 0 , 0 , \s__color_stop {#1} {#2}
       }
     \tl_put_right:Nx \l__color_internal_tl
       {
@@ -29085,7 +29064,7 @@
   { \__color_model_devicen_transform:nnn {#5} { 1 } {#1} }
 \cs_new_protected:cpn { __color_model_devicen_transform_3:nnnnn } #1#2#3#4#5
   {
-    \clist_map_inline { #1 , #2 , #3 }
+    \clist_map_inline:nn { #1 , #2 , #3 }
       { \__color_model_devicen_transform:nnn {#5} { 3 } {##1} }
   }
 \cs_new_protected:cpn { __color_model_devicen_transform_4:nnnnn } #1#2#3#4#5
@@ -29137,8 +29116,9 @@
       {
         \exp_not:c { __color_convert_devicen_ #2 : \prg_replicate:nn {#3} { n } w }
           \prg_replicate:nn {#3} { { 1 } }
-          ##1 \exp_not:N \s__color_mark
+          ##1 ~ \exp_not:N \s__color_mark
           \clist_map_function:nN {#4} \__color_model_devicen_convert:n
+          {}
           \exp_not:N \s__color_stop
       }
   }
@@ -29220,7 +29200,7 @@
 \cs_new:Npn \__color_convert_devicen_rgb:nnnw
   #1#2#3#4 ~ #5 \s__color_mark #6#7 \s__color_stop
   {
-    \__color_convert_devicen_cmyk:nnnnnn {#4} {#1} {#2} {#3} #6
+    \__color_convert_devicen_rgb:nnnnnnn {#4} {#1} {#2} {#3} #6
       #5 \s__color_mark #7 \s__color_stop
   }
 \cs_new:Npn \__color_convert_devicen_rgb:nnnnnnn #1#2#3#4#5#6#7

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex	2021-11-12 23:04:14 UTC (rev 61040)
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx
-\def\ExplFileDate{2021-10-18}%
+\def\ExplFileDate{2021-11-12}%
 \let\ExplLoaderFileDate\ExplFileDate
 \begingroup
   \catcode`\_=11

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.ltx
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.ltx	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.ltx	2021-11-12 23:04:14 UTC (rev 61040)
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx
-\def\ExplFileDate{2021-10-18}%
+\def\ExplFileDate{2021-11-12}%
 \let\ExplLoaderFileDate\ExplFileDate
 \begingroup
   \catcode`\_=11

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty	2021-11-12 23:04:14 UTC (rev 61040)
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx
-\def\ExplFileDate{2021-10-18}%
+\def\ExplFileDate{2021-11-12}%
 \let\ExplLoaderFileDate\ExplFileDate
 \ProvidesPackage{expl3}
   [%

Modified: trunk/Master/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty	2021-11-12 23:04:14 UTC (rev 61040)
@@ -32,7 +32,7 @@
       }%
     \endinput
   }
-\ProvidesExplPackage{l3keys2e}{2021-08-27}{}
+\ProvidesExplPackage{l3keys2e}{2021-11-12}{}
   {LaTeX2e option processing using LaTeX3 keys}
 \cs_if_exist:NT \ProcessKeysOptions
   { \file_input_stop: }

Modified: trunk/Master/texmf-dist/tex/latex/l3packages/xfp/xfp.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3packages/xfp/xfp.sty	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/tex/latex/l3packages/xfp/xfp.sty	2021-11-12 23:04:14 UTC (rev 61040)
@@ -32,7 +32,7 @@
       }%
     \endinput
   }
-\ProvidesExplPackage{xfp}{2021-08-27}{}
+\ProvidesExplPackage{xfp}{2021-11-12}{}
   {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	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/tex/latex/l3packages/xfrac/xfrac.sty	2021-11-12 23:04:14 UTC (rev 61040)
@@ -34,7 +34,7 @@
     \endinput
   }
 \RequirePackage{amstext,graphicx,l3keys2e,textcomp,xparse,xtemplate}
-\ProvidesExplPackage{xfrac}{2021-08-27}{}
+\ProvidesExplPackage{xfrac}{2021-11-12}{}
   {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	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/tex/latex/l3packages/xparse/xparse.sty	2021-11-12 23:04:14 UTC (rev 61040)
@@ -60,7 +60,7 @@
       }
   }
 \ExplSyntaxOff
-\ProvidesExplPackage{xparse}{2021-08-27}{}
+\ProvidesExplPackage{xparse}{2021-11-12}{}
   {L3 Experimental document command parser}
 \clist_new:N \l__cmd_options_clist
 \DeclareOption* { \clist_put_right:NV \l__cmd_options_clist \CurrentOption }
@@ -153,6 +153,10 @@
       { \exp_not:c  { \l__cmd_expandable_aux_name_tl } }
     \__cmd_prepare_signature:N
   }
+\cs_new_protected:Npn \__cmd_copy_grabber_u:w #1 #2 #3
+  { \__cmd_copy_grabber_D:w {#1} {#2} {#3} { } { } }
+\tl_const:Nn \c__cmd_show_type_u_tl { 3 }
+\tl_const:Nn \c__cmd_show_type_G_tl { 3 }
 \cs_new_protected:Npn \__cmd_grab_G:w #1 \__cmd_run_code:
   {
     \__cmd_grab_G_aux:nNN {#1} \cs_set_protected_nopar:Npn

Modified: trunk/Master/texmf-dist/tex/latex/l3packages/xtemplate/xtemplate.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3packages/xtemplate/xtemplate.sty	2021-11-12 23:02:10 UTC (rev 61039)
+++ trunk/Master/texmf-dist/tex/latex/l3packages/xtemplate/xtemplate.sty	2021-11-12 23:04:14 UTC (rev 61040)
@@ -32,7 +32,7 @@
       }%
     \endinput
   }
-\ProvidesExplPackage{xtemplate}{2021-08-27}{}
+\ProvidesExplPackage{xtemplate}{2021-11-12}{}
   {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~>~ }
@@ -313,7 +313,7 @@
     \seq_put_right:No \l__xtemplate_key_order_seq \l__xtemplate_key_name_tl
     \str_if_eq:onT \l__xtemplate_keytype_tl { choice }
       {
-        \clist_if_in:NnT \l__xtemplate_keytype_arg_tl { unknown }
+        \exp_args:No \clist_if_in:nnT \l__xtemplate_keytype_arg_tl { unknown }
           { \msg_error:nn { xtemplate } { choice-unknown-reserved } }
       }
   }
@@ -413,59 +413,27 @@
 \cs_new_protected:Npn \__xtemplate_store_value_code:n #1
   { \prop_put:Non \l__xtemplate_values_prop \l__xtemplate_key_name_tl {#1} }
 \cs_new_eq:NN \__xtemplate_store_value_choice:n    \__xtemplate_store_value_code:n
-\cs_new_eq:NN \__xtemplate_store_value_commalist:n \__xtemplate_store_value_code:n
 \cs_new_eq:NN \__xtemplate_store_value_function:n  \__xtemplate_store_value_code:n
 \cs_new_eq:NN \__xtemplate_store_value_instance:n  \__xtemplate_store_value_code:n
-\cs_new_eq:NN \__xtemplate_store_value_real:n      \__xtemplate_store_value_code:n
-\cs_new_eq:NN \__xtemplate_store_value_tokenlist:n \__xtemplate_store_value_code:n
-\cs_new_protected:Npn \__xtemplate_store_value_integer:n #1
+\cs_new_protected:Npn \__xtemplate_store_value_aux:Nn #1#2
   {
-    \__xtemplate_if_eval_now:nTF {#1}
-      {
-        \int_set:Nn \l__xtemplate_tmp_int {#1}
-        \prop_put:NVV \l__xtemplate_values_prop \l__xtemplate_key_name_int
-          \l__xtemplate_tmp_int
-      }
-      {
-        \prop_put:Non \l__xtemplate_values_prop \l__xtemplate_key_name_tl {#1}
-      }
+    \__xtemplate_if_eval_now:nTF {#2}
+      { \prop_put:NVx \l__xtemplate_values_prop \l__xtemplate_key_name_tl { #1 {#2} } }
+      { \prop_put:Non \l__xtemplate_values_prop \l__xtemplate_key_name_tl {#2} }
   }
-\cs_new_protected:Npn \__xtemplate_store_value_length:n #1
-  {
-    \__xtemplate_if_eval_now:nTF {#1}
-      {
-        \dim_set:Nn \l__xtemplate_tmp_dim {#1}
-        \prop_put:NVV \l__xtemplate_values_prop \l__xtemplate_key_name_tl
-          \l__xtemplate_tmp_dim
-      }
-      {
-        \prop_put:Non \l__xtemplate_values_prop \l__xtemplate_key_name_tl {#1}
-      }
-  }
-\cs_new_protected:Npn \__xtemplate_store_value_muskip:n #1
-  {
-    \__xtemplate_if_eval_now:nTF {#1}
-      {
-        \muskip_set:Nn \l__xtemplate_tmp_muskip {#1}
-        \prop_put:NVV \l__xtemplate_values_prop \l__xtemplate_key_name_tl
-          \l__xtemplate_tmp_muskip
-      }
-      {
-        \prop_put:Non \l__xtemplate_values_prop \l__xtemplate_key_name_tl {#1}
-      }
-  }
-\cs_new_protected:Npn \__xtemplate_store_value_skip:n #1
-  {
-    \__xtemplate_if_eval_now:nTF {#1}
-      {
-        \skip_set:Nn \l__xtemplate_tmp_skip {#1}
-        \prop_put:NVV \l__xtemplate_values_prop \l__xtemplate_key_name_tl
-          \l__xtemplate_tmp_skip
-      }
-      {
-        \prop_put:Non \l__xtemplate_values_prop \l__xtemplate_key_name_tl {#1}
-      }
-  }
+\cs_new_protected:Npn \__xtemplate_store_value_integer:n
+  { \__xtemplate_store_value_aux:Nn \int_eval:n }
+\cs_new_protected:Npn \__xtemplate_store_value_length:n
+  { \__xtemplate_store_value_aux:Nn \dim_eval:n }
+\cs_new_protected:Npn \__xtemplate_store_value_muskip:n
+  { \__xtemplate_store_value_aux:Nn \muskip_eval:n }
+\cs_new_protected:Npn \__xtemplate_store_value_real:n
+  { \__xtemplate_store_value_aux:Nn \fp_eval:n }
+\cs_new_protected:Npn \__xtemplate_store_value_skip:n
+  { \__xtemplate_store_value_aux:Nn \skip_eval:n }
+\cs_new_protected:Npn \__xtemplate_store_value_tokenlist:n
+  { \__xtemplate_store_value_aux:Nn \use:n }
+\cs_new_eq:NN \__xtemplate_store_value_commalist:n \__xtemplate_store_value_tokenlist:n
 \cs_new_protected:Npn \__xtemplate_declare_template_code:nnnnn #1#2#3#4#5
   {
     \__xtemplate_execute_if_type_exist:nT {#1}
@@ -582,7 +550,7 @@
   }
 \cs_new_protected:Npn \__xtemplate_implement_choices:n #1
   {
-    \clist_set_eq:NN \l__xtemplate_tmp_clist \l__xtemplate_keytype_arg_tl
+    \clist_set:No \l__xtemplate_tmp_clist { \l__xtemplate_keytype_arg_tl }
     \prop_put:Non \l__xtemplate_vars_prop \l__xtemplate_key_name_tl { }
     \keyval_parse:NNn
       \__xtemplate_implement_choice_elt:n \__xtemplate_implement_choice_elt:nn



More information about the tex-live-commits mailing list.