texlive[68721] Master: latex3 (1nov23)

commits+karl at tug.org commits+karl at tug.org
Wed Nov 1 21:15:10 CET 2023


Revision: 68721
          https://tug.org/svn/texlive?view=revision&revision=68721
Author:   karl
Date:     2023-11-01 21:15:10 +0100 (Wed, 01 Nov 2023)
Log Message:
-----------
latex3 (1nov23)

Modified Paths:
--------------
    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/l3doc.pdf
    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/l3obsolete.txt
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.csv
    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/l3kernel/source3body.tex
    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/l3.ins
    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-functions.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-symbolic.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-types.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-map.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/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/l3kernel/l3doc.cls
    trunk/Master/tlpkg/bin/c2lx

Added Paths:
-----------
    trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/CHANGELOG.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3experimental/CHANGELOG.md	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/doc/latex/l3experimental/CHANGELOG.md	2023-11-01 20:15:10 UTC (rev 68721)
@@ -7,6 +7,11 @@
 
 ## [Unreleased]
 
+## [2023-11-01]
+
+### Changed
+- Track `expl3` core changes
+
 ## [2023-10-10]
 
 ### Changed
@@ -281,7 +286,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/2023-10-10...HEAD
+[Unreleased]: https://github.com/latex3/latex3/compare/2023-11-01...HEAD
+[2023-11-01]: https://github.com/latex3/latex3/compare/2023-10-10...2023-11-01
 [2023-10-10]: https://github.com/latex3/latex3/compare/2023-05-11...2023-10-10
 [2023-05-11]: https://github.com/latex3/latex3/compare/2023-04-19...2023-05-11
 [2023-04-19]: https://github.com/latex3/latex3/compare/2023-03-30...2023-04-19

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3experimental/README.md	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/doc/latex/l3experimental/README.md	2023-11-01 20:15:10 UTC (rev 68721)
@@ -1,7 +1,7 @@
 Experimental LaTeX3 Concepts
 ============================
 
-Release 2023-10-10
+Release 2023-11-01
 
 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	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md	2023-11-01 20:15:10 UTC (rev 68721)
@@ -7,6 +7,29 @@
 
 ## [Unreleased]
 
+## [2023-11-01]
+
+### Added
+- `\seq_(g)set_map_e:NNn`
+- Documentation for `\ExplLoaderFileDate` in `expl3.pdf`
+
+### Changed
+- Documentation improvements
+- Refine action of `\text_titlecase_first:n(n)` to be focussed strictly on
+  first (relevant) codepoint in the input
+- Standardize "This is the (e)TeX primitive ..." in `texnote` in documentation
+- Move `\tl_build_(g)begin:N`, `\tl_build_(g)end:N`, `\tl_build_(g)put_left:Nn`
+  and `\tl_build_(g)right:Nn` to stable status
+
+### Deprecated
+- `\seq_(g)set_map_x:NNn` in favor of `e`-type naming
+
+### Fixed
+- `\fp_clear_variable:n` should act locally (issue \#1298)
+- `\fp_clear_function:n` should act locally and correctly
+- Support for `\fp_show:N` showing symbolic expressions (issue \#1301)
+- Undefined `\str_case:en(TF)` (excluding `\str_case:en`)
+
 ## [2023-10-23]
 
 ### Added
@@ -18,11 +41,12 @@
   `\fp_new_function:n`, `\fp_set_function:nnn` and `\fp_clear_function:n`
 
 ### Changed
-- Refine action of `\text_titlecase_first:n(n)` to be focussed strictly on
-  first (relevant) codepoint in the input
+- Clarify action of `\text_titlecase_first:n(n)`
+- Detect letters for titlecasing based on Unicode general category
 
 ### Deprecated
 - `\text_titlecase:n(n)` as ambiguous: replaced by `\text_titlecase_all:n(n)`
+- `\tl_build_(g)clear:N` in favour of `\tl_build_(g)begin:N`
 
 ### Fixed
 - Support arbitrary BCP-47 locales for case-changing overrides (issue \#1239)
@@ -1558,7 +1582,8 @@
 - Step functions have been added for dim variables,
   e.g. `\dim_step_inline:nnnn`
 
-[Unreleased]: https://github.com/latex3/latex3/compare/2023-10-23...HEAD
+[Unreleased]: https://github.com/latex3/latex3/compare/2023-11-01...HEAD
+[2023-11-01]: https://github.com/latex3/latex3/compare/2023-10-23...2023-11-01
 [2023-10-23]: https://github.com/latex3/latex3/compare/2023-10-10...2023-10-23
 [2023-10-10]: https://github.com/latex3/latex3/compare/2023-08-29...2023-10-10
 [2023-08-29]: https://github.com/latex3/latex3/compare/2023-08-11...2023-08-29

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/README.md	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/README.md	2023-11-01 20:15:10 UTC (rev 68721)
@@ -1,7 +1,7 @@
 LaTeX3 Programming Conventions
 ==============================
 
-Release 2023-10-23
+Release 2023-11-01
 
 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	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex	2023-11-01 20:15:10 UTC (rev 68721)
@@ -64,7 +64,7 @@
          {latex-team at latex-project.org}%
    }%
 }
-\date{Released 2023-10-23}
+\date{Released 2023-11-01}
 
 \pagenumbering{roman}
 \maketitle

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

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/l3obsolete.txt
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/l3obsolete.txt	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3obsolete.txt	2023-11-01 20:15:10 UTC (rev 68721)
@@ -55,9 +55,13 @@
 \str_upper_case:n                        2020-01-03
 \seq_indexed_map_inline:Nn               2020-06-18
 \seq_indexed_map_function:NN             2020-06-18
+\seq_gset_map_x:NNn                      2023-10-26
+\seq_set_map_x:NNn                       2023-10-26
 \sys_load_deprecation:                   2021-01-11
 \text_titlecase:n                        2023-07-08
 \text_titlecase:nn                       2023-07-08
+\tl_build_clear:N                        2023-10-18
+\tl_build_gclear:N                       2023-10-18
 \tl_case:cn                              2023-05-23
 \tl_case:cnF                             2023-05-23
 \tl_case:cnT                             2023-05-23

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.csv
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.csv	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.csv	2023-11-01 20:15:10 UTC (rev 68721)
@@ -243,6 +243,7 @@
 sys,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2015-09-07,2015-09-08,
 tag,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2019-06-02,2019-06-02,
 tasks,tasks,Clemens Niederberger,https://github.com/cgnieder/tasks/,https://github.com/cgnieder/tasks.git,https://github.com/cgnieder/cgnieder/tasks/issues,2013-03-16,2020-04-14,
+tbl,latex2e,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex2e.git,https://github.com/latex3/latex2e/issues,2023-10-23,2023-10-23,
 tblr,tabularray,Jianrui Lyu,https://github.com/lvjr/tabularray,https://github.com/lvjr/tabularray.git,https://github.com/lvjr/tabularray/issues,2022-04-02,2022-04-02,
 tcobox,tcolorbox,Thomas F. Sturm,https://github.com/T-F-S/tcolorbox,https://github.com/T-F-S/tcolorbox.git,https://github.com/T-F-S/tcolorbox/issues,2020-02-19,2020-02-19,
 template,latex2e,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex2e.git,https://github.com/latex3/latex2e/issues,2021-01-20,2021-03-03,

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	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex	2023-11-01 20:15:10 UTC (rev 68721)
@@ -32,7 +32,7 @@
         {latex-team at latex-project.org}%
     }%
 }
-\date{Released 2023-10-23}
+\date{Released 2023-11-01}
 
 \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	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex	2023-11-01 20:15:10 UTC (rev 68721)
@@ -32,7 +32,7 @@
         {latex-team at latex-project.org}%
     }%
 }
-\date{Released 2023-10-23}
+\date{Released 2023-11-01}
 
 \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	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex	2023-11-01 20:15:10 UTC (rev 68721)
@@ -32,7 +32,7 @@
         {latex-team at latex-project.org}%
     }%
 }
-\date{Released 2023-10-23}
+\date{Released 2023-11-01}
 
 \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	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex	2023-11-01 20:15:10 UTC (rev 68721)
@@ -57,7 +57,7 @@
          {latex-team at latex-project.org}%
    }%
 }
-\date{Released 2023-10-23}
+\date{Released 2023-11-01}
 
 \pagenumbering{roman}
 \maketitle

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/source3body.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/source3body.tex	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/source3body.tex	2023-11-01 20:15:10 UTC (rev 68721)
@@ -551,6 +551,7 @@
 \part{Data types}
 
 \DocInput{l3tl.dtx}
+\DocInput{l3tl-build.dtx}
 \DocInput{l3str.dtx}
 \DocInput{l3str-convert.dtx}
 \DocInput{l3quark.dtx}

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -2,7 +2,7 @@
 %
 %% File: l3benchmark.dtx
 % 
-% Copyright (C) 2011,2012,2014-2023 The LaTeX Project
+% Copyright (C) 2011-2023 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
@@ -46,7 +46,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-10}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %
@@ -122,7 +122,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{l3benchmark}{2023-10-10}{}
+\ProvidesExplPackage{l3benchmark}{2023-11-01}{}
   {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	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3bitset/l3bitset.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-10}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 % \begin{documentation}
@@ -264,7 +264,7 @@
 %<@@=bitset>
 %    \end{macrocode}
 %    \begin{macrocode}
-\ProvidesExplPackage{l3bitset}{2023-10-10}{}
+\ProvidesExplPackage{l3bitset}{2023-11-01}{}
   {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	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-10}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-10}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-10}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %
@@ -999,19 +999,11 @@
       \dim_set_eq:NN \l_@@_softpath_lastx_dim \g_@@_softpath_lastx_dim
       \dim_set_eq:NN \l_@@_softpath_lasty_dim \g_@@_softpath_lasty_dim
       \@@_path_reset_limits:
-      \tl_build_get:NN \g_@@_softpath_main_tl \l_@@_softpath_main_tl
-      \bool_set_eq:NN
-        \l_@@_softpath_corners_bool
-        \g_@@_softpath_corners_bool
-      \@@_softpath_clear:
+      \@@_softpath_save:
   }
 \cs_new_protected:Npn \draw_path_scope_end:
   {
-      \@@_softpath_clear:
-      \bool_gset_eq:NN
-        \g_@@_softpath_corners_bool
-        \l_@@_softpath_corners_bool
-      \@@_softpath_add:o \l_@@_softpath_main_tl
+      \@@_softpath_restore:
       \dim_gset_eq:NN \g_@@_softpath_lastx_dim \l_@@_softpath_lastx_dim
       \dim_gset_eq:NN \g_@@_softpath_lasty_dim \l_@@_softpath_lasty_dim
       \dim_gset_eq:NN \g_@@_path_xmax_dim \l_@@_path_xmax_dim

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-10}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-10}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-10}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %
@@ -82,10 +82,10 @@
 %    \end{macrocode}
 % \end{variable}
 %
-% \begin{variable}{\l_@@_softpath_internal_tl}
-%   The soft path itself.
+% \begin{variable}{\l_@@_softpath_tmp_tl}
+%   Scratch space.
 %    \begin{macrocode}
-\tl_new:N \l_@@_softpath_internal_tl
+\tl_new:N \l_@@_softpath_tmp_tl
 %    \end{macrocode}
 % \end{variable}
 %
@@ -104,23 +104,51 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}
-%   {\@@_softpath_use:, \@@_softpath_clear:}
+% \begin{macro}{\@@_softpath_use:, \@@_softpath_clear:}
 %   Using and clearing is trivial.
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_softpath_use:
   {
-    \tl_build_get:NN \g_@@_softpath_main_tl \l_@@_softpath_internal_tl
-    \l_@@_softpath_internal_tl
+    \tl_build_gend:N \g_@@_softpath_main_tl
+    \tl_set_eq:NN \l_@@_softpath_tmp_tl \g_@@_softpath_main_tl
+    \l_@@_softpath_tmp_tl
+    \tl_build_gbegin:N \g_@@_softpath_main_tl
+    \exp_args:NNV \tl_build_gput_right:Nn
+      \g_@@_softpath_main_tl \l_@@_softpath_tmp_tl
   }
 \cs_new_protected:Npn \@@_softpath_clear:
   {
-    \tl_build_gclear:N \g_@@_softpath_main_tl
+    \tl_build_gbegin:N \g_@@_softpath_main_tl
     \bool_gset_false:N \g_@@_softpath_corners_bool
   }
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}{\@@_softpath_save:, \@@_softpath_restore:}
+%   Abstracted ideas to keep variables inside this submodule.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_softpath_save:
+  {
+    \tl_build_gend:N \g_@@_softpath_main_tl
+    \tl_set_eq:NN
+      \l_@@_softpath_main_tl
+      \g_@@_softpath_main_tl
+    \bool_set_eq:NN
+      \l_@@_softpath_corners_bool
+      \g_@@_softpath_corners_bool
+    \@@_softpath_clear:
+  }
+\cs_new_protected:Npn \@@_softpath_restore:
+  {
+    \@@_softpath_clear:
+    \@@_softpath_add:o \l_@@_softpath_main_tl
+    \bool_gset_eq:NN
+      \g_@@_softpath_corners_bool
+      \l_@@_softpath_corners_bool
+  }
+%    \end{macrocode}
+% \end{macro}
+%
 % \begin{variable}{\g_@@_softpath_lastx_dim, \g_@@_softpath_lasty_dim}
 %   For tracking the end of the path (to close it).
 %    \begin{macrocode}
@@ -323,9 +351,9 @@
           \fp_zero:N \l_@@_softpath_lasty_fp
           \tl_clear:N \l_@@_softpath_first_tl
           \tl_clear:N \l_@@_softpath_move_tl
-          \tl_build_get:NN \g_@@_softpath_main_tl \l_@@_softpath_internal_tl
+          \tl_build_gend:N \g_@@_softpath_main_tl
           \exp_after:wN \@@_softpath_round_loop:Nnn
-            \l_@@_softpath_internal_tl
+            \g_@@_softpath_main_tl
             \q_@@_recursion_tail ? ?
             \q_@@_recursion_stop
         \group_end:
@@ -587,7 +615,7 @@
       \l_@@_softpath_move_tl
     \tl_put_right:No \l_@@_softpath_main_tl
       \l_@@_softpath_part_tl
-    \tl_build_gclear:N \g_@@_softpath_main_tl
+    \tl_build_gbegin:N \g_@@_softpath_main_tl
     \@@_softpath_add:o \l_@@_softpath_main_tl
   }
 %    \end{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-10}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-10}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -110,7 +110,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-10}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %
@@ -1173,7 +1173,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{l3draw}{2023-10-10}{}
+\ProvidesExplPackage{l3draw}{2023-11-01}{}
   {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	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-10}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %
@@ -184,7 +184,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{l3graphics}{2023-10-10}{}
+\ProvidesExplPackage{l3graphics}{2023-11-01}{}
   {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	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3opacity/l3opacity.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -46,7 +46,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-10}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %
@@ -96,7 +96,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{l3opacity}{2023-10-10}{}
+\ProvidesExplPackage{l3opacity}{2023-11-01}{}
   {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	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -48,7 +48,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-10}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %
@@ -123,7 +123,7 @@
 %
 % \begin{function}[EXP]{\fp_format:nn}
 %   \begin{syntax}
-%     \cs{fp_format:nn} \Arg{fpexpr} \Arg{format specification}
+%     \cs{fp_format:nn} \Arg{fp expr} \Arg{format specification}
 %   \end{syntax}
 %   Evaluates the \meta{floating point expression} and converts the
 %   result to a string according to the \meta{format specification}.
@@ -166,7 +166,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{l3str-format}{2023-10-10}{}
+\ProvidesExplPackage{l3str-format}{2023-11-01}{}
   {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	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -46,7 +46,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-10}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %
@@ -151,7 +151,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{l3sys-shell}{2023-10-10}{}
+\ProvidesExplPackage{l3sys-shell}{2023-11-01}{}
   {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	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -2,7 +2,7 @@
 %
 %% File: xcoffins.dtx
 %
-% Copyright (C) 2010-2012,2014,2016-2023 The LaTeX Project
+% Copyright (C) 2010-2023 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
@@ -53,7 +53,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-10}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %
@@ -672,7 +672,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xcoffins}{2023-10-10}{}
+\ProvidesExplPackage{xcoffins}{2023-11-01}{}
   {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	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -61,7 +61,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-10}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %
@@ -686,7 +686,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{l3galley}{2023-10-10}{}
+\ProvidesExplPackage{l3galley}{2023-11-01}{}
   {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	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-10}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %
@@ -731,7 +731,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xgalley}{2023-10-10}{}
+\ProvidesExplPackage{xgalley}{2023-11-01}{}
   {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	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -24,7 +24,7 @@
 %
 %<*driver|generic|package|2ekernel>
 %</driver|generic|package|2ekernel>
-\def\ExplFileDate{2023-10-23}%
+\def\ExplFileDate{2023-11-01}%
 %<*driver>
 \documentclass[full]{l3doc}
 \usepackage{graphicx}
@@ -51,7 +51,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %
@@ -958,6 +958,16 @@
 % loadable: package loading is dependent on the \LaTeXe{} package-management
 % mechanism.
 %
+% \section{Getting the version of \pkg{expl3}}
+%
+% \begin{function}{\ExplLoaderFileDate}
+%   Once the programming layer is loaded by one of the loaders, you can access
+%   its version in the ISO date format \meta{year}-\meta{month}-\meta{day},
+%   through \cs{ExplLoaderFileDate}.
+%
+%   The current version of \pkg{expl3} is \ExplLoaderFileDate.
+% \end{function}
+%
 % \section{Engine/primitive requirements}
 %
 % To use \pkg{expl3} and the higher level packages provided by the

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3.ins
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3.ins	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3.ins	2023-11-01 20:15:10 UTC (rev 68721)
@@ -65,6 +65,7 @@
         \from{l3expan.dtx}      {package}
         \from{l3quark.dtx}      {package}
         \from{l3tl.dtx}         {package}
+        \from{l3tl-build.dtx}   {package}
         \from{l3str.dtx}        {package}
         \from{l3seq.dtx}        {package}
         \from{l3int.dtx}        {package}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %
@@ -106,6 +106,9 @@
 %   level may be closed by a \cs{group_end:} function or by a token
 %   with category code $2$ (close-group), namely a ^^A{
 %   |}| if standard category codes apply.
+%   \begin{texnote}
+%     This is the \TeX{} primitive \tn{aftergroup}.
+%   \end{texnote}
 % \end{function}
 %
 % \begin{function}[added = 2021-05-11]{\group_show_list:, \group_log_list:}
@@ -116,7 +119,7 @@
 %   Display (to the terminal or log file) a list of the groups that are
 %   currently opened.  This is intended for tracking down problems.
 %   \begin{texnote}
-%     This is a wrapper around the \tn{showgroups} primitive.
+%     This is a wrapper around the \eTeX{} primitive \tn{showgroups}.
 %   \end{texnote}
 % \end{function}
 %
@@ -130,8 +133,9 @@
 % is therefore used as a shorthand for \enquote{replacement text}.
 %
 % Functions which are not \enquote{protected} are fully expanded
-% inside an \texttt{x} expansion. In contrast, \enquote{protected}
-% functions are not expanded within \texttt{x} expansions.
+% inside an \texttt{e}-type or \texttt{x}-type expansion.
+% In contrast, \enquote{protected} functions are not expanded within
+% \texttt{e} and \texttt{x} expansions.
 %
 % \subsection{Defining functions}
 %
@@ -175,7 +179,7 @@
 %      Create a new function with the \texttt{protected} restriction,
 %      such as \cs{cs_set_protected:Npn}. The parameter may contain
 %      \cs{par} tokens but the function will not expand within an
-%      \texttt{x}-type or \texttt{e}-type expansion.
+%      \texttt{e}-type or \texttt{x}-type expansion.
 % \end{description}
 %
 % Finally, the functions in
@@ -245,8 +249,8 @@
 %   Creates \meta{function} to expand to \meta{code} as replacement text.
 %   Within the \meta{code}, the \meta{parameters} (|#1|, |#2|,
 %   \emph{etc.}) will be replaced by those absorbed by the function.
-%   The \meta{function} will not expand within an \texttt{x}-type or
-%   or \texttt{e}-type
+%   The \meta{function} will not expand within an \texttt{e}-type or
+%   or \texttt{x}-type
 %   argument. The definition is global and an error results if the
 %   \meta{function} is already defined.
 % \end{function}
@@ -265,7 +269,7 @@
 %   \emph{etc.}) will be replaced by those absorbed by the function.
 %   When the \meta{function} is used the \meta{parameters} absorbed
 %   cannot contain \cs{par} tokens. The \meta{function} will not
-%   expand within an \texttt{x}-type or \texttt{e}-type argument. The definition is global
+%   expand within an \texttt{e}-type or \texttt{x}-type argument. The definition is global
 %   and an error results if the \meta{function} is already defined.
 % \end{function}
 %
@@ -317,7 +321,7 @@
 %   \emph{etc.}) will be replaced by those absorbed by the function.
 %   The assignment of a meaning to the \meta{function} is restricted to
 %   the current \TeX{} group level. The \meta{function} will
-%   not expand within an \texttt{x}-type or \texttt{e}-type argument.
+%   not expand within an \texttt{e}-type or \texttt{x}-type argument.
 % \end{function}
 %
 % \begin{function}
@@ -336,7 +340,7 @@
 %   cannot contain \cs{par} tokens. The assignment of a meaning
 %   to the \meta{function} is restricted to the current \TeX{} group
 %   level. The \meta{function} will not expand within an
-%   \texttt{x}-type or \texttt{e}-type argument.
+%   \texttt{e}-type or \texttt{x}-type argument.
 % \end{function}
 %
 % \begin{function}
@@ -389,7 +393,7 @@
 %   The assignment of a meaning to the \meta{function} is \emph{not}
 %   restricted to the current \TeX{} group level: the assignment is
 %   global. The \meta{function} will not expand within an
-%   \texttt{x}-type or \texttt{e}-type argument.
+%   \texttt{e}-type or \texttt{x}-type argument.
 % \end{function}
 %
 % \begin{function}
@@ -408,7 +412,7 @@
 %   cannot contain \cs{par} tokens. The assignment of a meaning to the
 %   \meta{function} is \emph{not} restricted to the current \TeX{}
 %   group level: the assignment is global. The \meta{function} will
-%   not expand within an \texttt{x}-type or \texttt{e}-type argument.
+%   not expand within an \texttt{e}-type or \texttt{x}-type argument.
 % \end{function}
 %
 % \subsection{Defining new functions using the signature}
@@ -459,8 +463,8 @@
 %   Within the \meta{code}, the number of \meta{parameters} is detected
 %   automatically from the function signature. These \meta{parameters}
 %   (|#1|, |#2|, \emph{etc.}) will be replaced by those absorbed by the
-%   function. The \meta{function} will not expand within an \texttt{x}-type
-%   or \texttt{e}-type argument. The definition is global and
+%   function. The \meta{function} will not expand within an \texttt{e}-type
+%   or \texttt{x}-type argument. The definition is global and
 %   an error results if the \meta{function} is already defined.
 % \end{function}
 %
@@ -478,7 +482,7 @@
 %   (|#1|, |#2|, \emph{etc.}) will be replaced by those absorbed by the
 %   function.  When the \meta{function} is used the \meta{parameters}
 %   absorbed cannot contain \cs{par} tokens. The \meta{function} will not
-%   expand within an \texttt{x}-type or \texttt{e}-type argument. The definition is global and
+%   expand within an \texttt{e}-type or \texttt{x}-type argument. The definition is global and
 %   an error results if the \meta{function} is already defined.
 % \end{function}
 %
@@ -529,8 +533,8 @@
 %   Within the \meta{code}, the number of \meta{parameters} is detected
 %   automatically from the function signature. These \meta{parameters}
 %   (|#1|, |#2|, \emph{etc.}) will be replaced by those absorbed by the
-%   function. The \meta{function} will not expand within an \texttt{x}-type
-%   or \texttt{e}-type argument.
+%   function. The \meta{function} will not expand within an \texttt{e}-type
+%   or \texttt{x}-type argument.
 %   The assignment of a meaning to the \meta{function} is restricted to
 %   the current \TeX{} group level.
 % \end{function}
@@ -549,7 +553,7 @@
 %   (|#1|, |#2|, \emph{etc.}) will be replaced by those absorbed by the
 %   function.  When the \meta{function} is used the \meta{parameters}
 %   absorbed cannot contain \cs{par} tokens. The \meta{function} will not
-%   expand within an \texttt{x}-type or \texttt{e}-type argument.
+%   expand within an \texttt{e}-type or \texttt{x}-type argument.
 %   The assignment of a meaning to the \meta{function} is restricted to
 %   the current \TeX{} group level.
 % \end{function}
@@ -599,8 +603,8 @@
 %   Within the \meta{code}, the number of \meta{parameters} is detected
 %   automatically from the function signature. These \meta{parameters}
 %   (|#1|, |#2|, \emph{etc.}) will be replaced by those absorbed by the
-%   function. The \meta{function} will not expand within an \texttt{x}-type
-%   or \texttt{e}-type argument.
+%   function. The \meta{function} will not expand within an \texttt{e}-type
+%   or \texttt{x}-type argument.
 %   The assignment of a meaning to the \meta{function} is  global.
 % \end{function}
 %
@@ -618,7 +622,7 @@
 %   (|#1|, |#2|, \emph{etc.}) will be replaced by those absorbed by the
 %   function.  When the \meta{function} is used the \meta{parameters}
 %   absorbed cannot contain \cs{par} tokens. The \meta{function} will not
-%   expand within an \texttt{x}-type or \texttt{e}-type argument.
+%   expand within an \texttt{e}-type or \texttt{x}-type argument.
 %   The assignment of a meaning to the \meta{function} is global.
 % \end{function}
 %
@@ -712,7 +716,7 @@
 %   This function expands to the \emph{meaning} of the \meta{control sequence}
 %   control sequence. For a macro, this includes the \meta{replacement text}.
 %   \begin{texnote}
-%     This is \TeX{}'s \tn{meaning} primitive.
+%     This is the \TeX{} primitive \tn{meaning}.
 %     For tokens that are not control sequences, it is more logical to
 %     use \cs{token_to_meaning:N}.
 %     The \texttt{c} variant correctly reports undefined arguments.
@@ -825,7 +829,7 @@
 %   of category code $10$. The result does \emph{not} include
 %   the current escape token, contrarily to \cs{token_to_str:N}.
 %   Full expansion of this function requires exactly $2$ expansion
-%   steps, and so an \texttt{x}-type or \texttt{e}-type expansion, or two
+%   steps, and so an \texttt{e}-type or \texttt{x}-type expansion, or two
 %   \texttt{o}-type expansions are required to
 %   convert the \meta{control sequence} to a sequence of characters
 %   in the input stream. In most cases, an \texttt{f}-expansion
@@ -1207,7 +1211,7 @@
 % Certain conditionals deal with specific data types like boxes and
 % fonts and are described there. The ones described below are either
 % the universal conditionals or deal with control sequences. We
-% prefix primitive conditionals with |\if_|.
+% prefix primitive conditionals with |\if_|, except for \cs{if:w}.
 %
 % \begin{function}[EXP]
 %   {\if_true:, \if_false:, \else:, \fi:, \reverse_if:N}
@@ -1222,8 +1226,10 @@
 %   conditional. The function "\or:" is documented in \pkg{l3int} and
 %   used in case switches.
 %   \begin{texnote}
-%     These are equivalent to their corresponding \TeX\ primitive
-%     conditionals; \cs{reverse_if:N} is \eTeX's \tn{unless}.
+%     \cs{if_true:} and \cs{if_false:} are equivalent to their corresponding
+%     \TeX{} primitive conditionals \tn{iftrue} and \tn{iffalse};
+%     \cs{else:} and \cs{fi:} are the \TeX{} primitives \tn{else} and \tn{fi};
+%     \cs{reverse_if:N} is the \eTeX{} primitive \tn{unless}.
 %   \end{texnote}
 % \end{function}
 %
@@ -1236,7 +1242,7 @@
 %   <arg_1> and <arg_2> could be functions, variables, tokens; in all cases the
 %   \emph{unexpanded} definitions are compared.
 %   \begin{texnote}
-%     This is \TeX{}'s \tn{ifx}.
+%     This is the \TeX{} primitive \tn{ifx}.
 %   \end{texnote}
 % \end{function}
 %
@@ -1251,6 +1257,10 @@
 %   tests if the category codes of the two tokens are the same whereas
 %   "\if:w" tests if the character codes are
 %   identical. "\if_charcode:w" is an alternative name for "\if:w".
+%   \begin{texnote}
+%     \cs{if:w} and \cs{if_charcode:w} are both the \TeX{} primitive \tn{if}.
+%     \cs{if_catcode:w} is the \TeX{} primitive \tn{ifcat}.
+%   \end{texnote}
 % \end{function}
 %
 % \begin{function}[EXP]{\if_cs_exist:N, \if_cs_exist:w}
@@ -1264,7 +1274,7 @@
 %   "\scan_stop:"! This can be useful when dealing with control
 %   sequences which cannot be entered as a single token.
 %   \begin{texnote}
-%     These are \TeX{}'s \tn{ifdefined} and \tn{ifcsname}, respectively.
+%     These are the \TeX{} primitives \tn{ifdefined} and \tn{ifcsname}.
 %   \end{texnote}
 % \end{function}
 %
@@ -1278,6 +1288,10 @@
 %   \end{syntax}
 %   Execute <true code> if currently in horizontal mode, otherwise
 %   execute <false code>. Similar for the other functions.
+%   \begin{texnote}
+%     These are the \TeX{} primitives \tn{ifhmode}, \tn{ifvmode}, \tn{ifmmode},
+%     and~\tn{ifinner}.
+%   \end{texnote}
 % \end{function}
 %
 % \section{Starting a paragraph}
@@ -2414,9 +2428,6 @@
 %   returned with \meta{true} for when there is a colon in the function
 %   and \meta{false} if there is not.
 %
-%   We cannot use |:| directly as it has the wrong category code so
-%   an |x|-type expansion is used to force the conversion.
-%
 %   First ensure that we actually get a properly evaluated string by
 %   expanding \cs{cs_to_str:N} twice.  If the function contained a
 %   colon, the auxiliary takes as |#1| the function name, delimited by
@@ -3245,7 +3256,7 @@
 %   wrapping code as otherwise we would wrongly see the definitions that
 %   are in place there.  To get correct escape characters, set the
 %   \tn{escapechar} in a group; this also localizes the assignment
-%   performed by \texttt{x}-expansion.  The \cs{cs_show:c} and \cs{cs_log:c} commands
+%   performed by \texttt{e}-expansion.  The \cs{cs_show:c} and \cs{cs_log:c} commands
 %   convert their argument to a control sequence within a group to avoid
 %   showing \tn{relax} for undefined control sequences.
 %    \begin{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %
@@ -51,9 +51,16 @@
 %
 % \section{Using the \LaTeX3 modules}
 %
-% The modules documented in \file{source3} are designed to be used on top of
-% \LaTeXe{} and are loaded all as one with the usual |\usepackage{expl3}| or
-% |\RequirePackage{expl3}| instructions.
+% The modules documented in ^^A
+% \ifinterface
+%   this file (and \file{source3} for documented sources) ^^A
+% \else
+%   \file{interface3} (and this file) ^^A
+% \fi
+% are designed to be used on top of \LaTeXe{} and are already pre-loaded
+% since \LaTeXe{} 2020-02-02.
+% To support older formats, the |\usepackage{expl3}| or |\RequirePackage{expl3}|
+% instructions are still available to load them all as one.
 %
 % As the modules use a coding syntax different from standard
 % \LaTeXe{} it provides a few functions for setting it up.
@@ -80,7 +87,6 @@
 % \begin{function}[updated = 2017-03-19, updated = 2023-08-03]
 %   {\ProvidesExplPackage, \ProvidesExplClass, \ProvidesExplFile}
 %   \begin{syntax}
-%     |\RequirePackage{expl3}| \\
 %     \cs{ProvidesExplPackage} \Arg{package} \Arg{date} \Arg{version} \Arg{description}
 %   \end{syntax}
 %   These functions act broadly in the same way as the corresponding
@@ -99,7 +105,6 @@
 %
 % \begin{function}[updated = 2012-06-04]{\GetIdInfo}
 %   \begin{syntax}
-%     |\RequirePackage{l3bootstrap}|
 %     \cs{GetIdInfo} |$Id:| \meta{SVN info field} |$| \Arg{description}
 %   \end{syntax}
 %   Extracts all information from a SVN field. Spaces are not

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %
@@ -639,7 +639,7 @@
 %   variable does not exist or if it is invalid. This function may be applied to
 %   local or global boxes.
 %   \begin{texnote}
-%     This is the \tn{box} primitive.
+%     This is the \TeX{} primitive \tn{box}.
 %   \end{texnote}
 % \end{function}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %
@@ -103,49 +103,6 @@
 %
 % \section{Additions to \pkg{l3tl}}
 %
-% \begin{function}[added = 2018-04-01]{\tl_build_begin:N, \tl_build_gbegin:N}
-%   \begin{syntax}
-%     \cs{tl_build_begin:N} \meta{tl~var}
-%   \end{syntax}
-%   Clears the \meta{tl~var} and sets it up to support other
-%   \cs[no-index]{tl_build_\ldots{}} functions, which allow accumulating
-%   large numbers of tokens piece by piece much more efficiently than
-%   standard \pkg{l3tl} functions.  Until \cs{tl_build_end:N}
-%   \meta{tl~var} is called, applying any function from \pkg{l3tl} other
-%   than \cs[no-index]{tl_build_\ldots{}} will lead to incorrect
-%   results.  The |begin| and |gbegin| functions must be used for local
-%   and global \meta{tl~var} respectively.
-% \end{function}
-%
-% \begin{function}[added = 2018-04-01]{\tl_build_clear:N, \tl_build_gclear:N}
-%   \begin{syntax}
-%     \cs{tl_build_clear:N} \meta{tl~var}
-%   \end{syntax}
-%   Clears the \meta{tl~var} and sets it up to support other
-%   \cs[no-index]{tl_build_\ldots{}} functions.  The |clear| and
-%   |gclear| functions must be used for local and global \meta{tl~var}
-%   respectively.
-% \end{function}
-%
-% \begin{function}[added = 2018-04-01]
-%   {
-%     \tl_build_put_left:Nn, \tl_build_put_left:Ne,
-%     \tl_build_gput_left:Nn, \tl_build_gput_left:Ne,
-%     \tl_build_put_right:Nn, \tl_build_put_right:Ne,
-%     \tl_build_gput_right:Nn, \tl_build_gput_right:Ne
-%   }
-%   \begin{syntax}
-%     \cs{tl_build_put_left:Nn} \meta{tl~var} \Arg{tokens}
-%     \cs{tl_build_put_right:Nn} \meta{tl~var} \Arg{tokens}
-%   \end{syntax}
-%   Adds \meta{tokens} to the left or right side of the current contents
-%   of \meta{tl~var}.  The \meta{tl~var} must have been set up with
-%   \cs{tl_build_begin:N} or \cs{tl_build_gbegin:N}.  The |put| and
-%   |gput| functions must be used for local and global \meta{tl~var}
-%   respectively.  The |right| functions are about twice faster than the
-%   |left| functions.
-% \end{function}
-%
 % \begin{function}[added = 2018-04-01]{\tl_build_get:NN}
 %   \begin{syntax}
 %     \cs{tl_build_get:NN} \meta{tl~var_1} \meta{tl~var_2}
@@ -157,20 +114,6 @@
 %   \cs{tl_set:Nn}.
 % \end{function}
 %
-% \begin{function}[added = 2018-04-01]{\tl_build_end:N, \tl_build_gend:N}
-%   \begin{syntax}
-%     \cs{tl_build_end:N} \meta{tl~var}
-%   \end{syntax}
-%   Gets the contents of \meta{tl~var} and stores that into the
-%   \meta{tl~var} using \cs{tl_set:Nn} or \cs{tl_gset:Nn}.
-%   The \meta{tl~var} must have
-%   been set up with \cs{tl_build_begin:N} or \cs{tl_build_gbegin:N}.
-%   The |end| and |gend| functions must be used for local and global
-%   \meta{tl~var} respectively.  These functions completely remove the
-%   setup code that enabled \meta{tl~var} to be used for other
-%   \cs[no-index]{tl_build_\ldots{}} functions.
-% \end{function}
-%
 % \end{documentation}
 %
 % \begin{implementation}
@@ -195,7 +138,7 @@
 %   and skipping out of that would break horribly.
 %   The \cs{@@_wrap_item:n} function inserts the relevant
 %   \cs{@@_item:n} without expansion in the input stream,
-%   hence in the \texttt{x}-expanding assignment.
+%   hence in the \texttt{e}-expanding assignment.
 %    \begin{macrocode}
 \cs_new_protected:Npn \seq_set_filter:NNn
   { \@@_set_filter:NNNn \__kernel_tl_set:Ne }
@@ -219,214 +162,14 @@
 %<@@=tl>
 %    \end{macrocode}
 %
-% Between \cs{tl_build_begin:N} \meta{tl~var} and \cs{tl_build_end:N}
-% \meta{tl~var}, the \meta{tl~var} has the structure
-% \begin{quote}
-%   \cs{exp_end:} \ldots{} \cs{exp_end:} \cs{@@_build_last:NNn}
-%   \meta{assignment} \meta{next~tl} \Arg{left} \meta{right}
-% \end{quote}
-% where \meta{right} is not braced.  The \enquote{data} it represents is
-% \meta{left} followed by the \enquote{data} of \meta{next~tl} followed
-% by \meta{right}.  The \meta{next~tl} is a token list variable whose
-% name is that of \meta{tl~var} followed by~|'|.  There are between $0$
-% and $4$ \cs{exp_end:} to keep track of when \meta{left} and
-% \meta{right} should be put into the \meta{next~tl}.  The
-% \meta{assignment} is \cs{cs_set_nopar:Npe} if the variable is local,
-% and \cs{cs_gset_nopar:Npe} if it is global.
-%
-% \begin{macro}{\tl_build_begin:N, \tl_build_gbegin:N}
-% \begin{macro}{\@@_build_begin:NN, \@@_build_begin:NNN}
-%   First construct the \meta{next~tl}: using a prime here conflicts
-%   with the usual \pkg{expl3} convention but we need a name that can be
-%   derived from |#1| without any external data such as a counter.
-%   Empty that \meta{next~tl} and setup the structure.  The local and
-%   global versions only differ by a single function
-%   \cs[no-index]{cs_(g)set_nopar:Npe} used for all assignments: this is
-%   important because only that function is stored in the \meta{tl~var}
-%   and \meta{next~tl} for subsequent assignments.  In principle
-%   \cs{@@_build_begin:NNN} could use \cs[no-index]{tl_(g)clear_new:N}
-%   to empty |#1| and make sure it is defined, but logging the
-%   definition does not seem useful so we just do |#3| |#1| |{}| to
-%   clear it locally or globally as appropriate.
-%    \begin{macrocode}
-\cs_new_protected:Npn \tl_build_begin:N #1
-  { \@@_build_begin:NN \cs_set_nopar:Npe #1 }
-\cs_new_protected:Npn \tl_build_gbegin:N #1
-  { \@@_build_begin:NN \cs_gset_nopar:Npe #1 }
-\cs_new_protected:Npn \@@_build_begin:NN #1#2
-  { \exp_args:Nc \@@_build_begin:NNN { \cs_to_str:N #2 ' } #2 #1 }
-\cs_new_protected:Npn \@@_build_begin:NNN #1#2#3
-  {
-    #3 #1 { }
-    #3 #2
-      {
-        \exp_not:n { \exp_end: \exp_end: \exp_end: \exp_end: }
-        \exp_not:n { \@@_build_last:NNn #3 #1 { } }
-      }
-  }
-%    \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\tl_build_clear:N, \tl_build_gclear:N}
-%   The |begin| and |gbegin| functions already clear enough to make the
-%   token list variable effectively empty.  Eventually the |begin| and
-%   |gbegin| functions should check that |#1'| is empty or undefined,
-%   while the |clear| and |gclear| functions ought to empty |#1'|,
-%   |#1''| and so on, similar to \cs{tl_build_end:N}.  This only affects
-%   memory usage.
-%    \begin{macrocode}
-\cs_new_eq:NN \tl_build_clear:N \tl_build_begin:N
-\cs_new_eq:NN \tl_build_gclear:N \tl_build_gbegin:N
-%    \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}
-%   {
-%     \tl_build_put_right:Nn, \tl_build_put_right:Ne, \tl_build_put_right:Nx,
-%     \tl_build_gput_right:Nn, \tl_build_gput_right:Ne, \tl_build_gput_right:Nx,
-%     \@@_build_last:NNn, \@@_build_put:nn, \@@_build_put:nw
-%   }
-%   Similar to \cs{tl_put_right:Nn}, but apply \cs{exp:w} to |#1|.  Most
-%   of the time this just removes one \cs{exp_end:}.  When there are
-%   none left, \cs{@@_build_last:NNn} is expanded instead.  It resets
-%   the definition of the \meta{tl~var} by ending the \cs{exp_not:n} and
-%   the definition early.  Then it makes sure the \meta{next~tl} (its
-%   argument |#1|) is set-up and starts a new definition.  Then
-%   \cs{@@_build_put:nn} and \cs{@@_build_put:nw} place the \meta{left}
-%   part of the original \meta{tl~var} as appropriate for the definition
-%   of the \meta{next~tl} (the \meta{right} part is left in the right
-%   place without ever becoming a macro argument).  We use
-%   \cs{exp_after:wN} rather than some \cs{exp_args:No} to avoid reading
-%   arguments that are likely very long token lists.  We use
-%   \cs[no-index]{cs_(g)set_nopar:Npe} rather than
-%   \cs[no-index]{tl_(g)set:Ne} partly for the same reason and partly
-%   because the assignments are interrupted by brace tricks, which
-%   implies that the assignment does not simply set the token list to an
-%   |x|-expansion of the second argument.
-%    \begin{macrocode}
-\cs_new_protected:Npn \tl_build_put_right:Nn #1#2
-  {
-    \cs_set_nopar:Npe #1
-      { \exp_after:wN \exp_not:n \exp_after:wN { \exp:w #1 #2 } }
-  }
-\cs_generate_variant:Nn \tl_build_put_right:Nn { Ne , Nx }
-\cs_new_protected:Npn \tl_build_gput_right:Nn #1#2
-  {
-    \cs_gset_nopar:Npe #1
-      { \exp_after:wN \exp_not:n \exp_after:wN { \exp:w #1 #2 } }
-  }
-\cs_generate_variant:Nn \tl_build_gput_right:Nn { Ne , Nx }
-\cs_new_protected:Npn \@@_build_last:NNn #1#2
-  {
-    \if_false: { { \fi:
-          \exp_end: \exp_end: \exp_end: \exp_end: \exp_end:
-          \@@_build_last:NNn #1 #2 { }
-        }
-      }
-    \if_meaning:w \c_empty_tl #2
-      \@@_build_begin:NN #1 #2
-    \fi:
-    #1 #2
-      {
-        \exp_after:wN \exp_not:n \exp_after:wN
-          {
-            \exp:w \if_false: } } \fi:
-            \exp_after:wN \@@_build_put:nn \exp_after:wN {#2}
-  }
-\cs_new_protected:Npn \@@_build_put:nn #1#2 { \@@_build_put:nw {#2} #1 }
-\cs_new_protected:Npn \@@_build_put:nw #1#2 \@@_build_last:NNn #3#4#5
-  { #2 \@@_build_last:NNn #3 #4 { #1 #5 } }
-%    \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}
-%   {
-%     \tl_build_put_left:Nn, \tl_build_put_left:Ne, \tl_build_put_left:Nx,
-%     \tl_build_gput_left:Nn, \tl_build_gput_left:Ne, \tl_build_gput_left:Nx,
-%     \@@_build_put_left:NNn
-%   }
-%   See \cs{tl_build_put_right:Nn} for all the machinery.  We could
-%   easily provide \cs[no-index]{tl_build_put_left_right:Nnn}, by just
-%   add the \meta{right} material after the \Arg{left} in the
-%   |x|-expanding assignment.
-%    \begin{macrocode}
-\cs_new_protected:Npn \tl_build_put_left:Nn #1
-  { \@@_build_put_left:NNn \cs_set_nopar:Npe #1 }
-\cs_generate_variant:Nn \tl_build_put_left:Nn { Ne , Nx }
-\cs_new_protected:Npn \tl_build_gput_left:Nn #1
-  { \@@_build_put_left:NNn \cs_gset_nopar:Npe #1 }
-\cs_generate_variant:Nn \tl_build_gput_left:Nn { Ne , Nx }
-\cs_new_protected:Npn \@@_build_put_left:NNn #1#2#3
-  {
-    #1 #2
-      {
-        \exp_after:wN \exp_not:n \exp_after:wN
-          {
-            \exp:w \exp_after:wN \@@_build_put:nn
-              \exp_after:wN {#2} {#3}
-          }
-      }
-  }
-%    \end{macrocode}
-% \end{macro}
-%
 % \begin{macro}{\tl_build_get:NN}
-% \begin{macro}{\@@_build_get:NNN, \@@_build_get:w, \@@_build_get_end:w}
-%   The idea is to expand the \meta{tl~var} then the \meta{next~tl} and
-%   so on, all within an |x|-expanding assignment, and wrap as
-%   appropriate in \cs{exp_not:n}.  The various \meta{left} parts are
-%   left in the assignment as we go, which enables us to expand the
-%   \meta{next~tl} at the right place.  The various \meta{right} parts
-%   are eventually picked up in one last \cs{exp_not:n}, with a brace
-%   trick to wrap all the \meta{right} parts together.
 %    \begin{macrocode}
 \cs_new_protected:Npn \tl_build_get:NN
   { \@@_build_get:NNN \__kernel_tl_set:Ne }
-\cs_new_protected:Npn \@@_build_get:NNN #1#2#3
-  { #1 #3 { \if_false: { \fi: \exp_after:wN \@@_build_get:w #2 } } }
-\cs_new:Npn \@@_build_get:w #1 \@@_build_last:NNn #2#3#4
-  {
-    \exp_not:n {#4}
-    \if_meaning:w \c_empty_tl #3
-      \exp_after:wN \@@_build_get_end:w
-    \fi:
-    \exp_after:wN \@@_build_get:w #3
-  }
-\cs_new:Npn \@@_build_get_end:w #1#2#3
-  { \exp_after:wN \exp_not:n \exp_after:wN { \if_false: } \fi: }
 %    \end{macrocode}
 % \end{macro}
-% \end{macro}
 %
-% \begin{macro}{\tl_build_end:N, \tl_build_gend:N, \@@_build_end_loop:NN}
-%   Get the data then clear the \meta{next~tl} recursively until finding
-%   an empty one.  It is perhaps wasteful to repeatedly use
-%   \cs{cs_to_str:N}.  The local/global scope is checked by
-%   \cs{tl_set:Ne} or \cs{tl_gset:Ne}.
 %    \begin{macrocode}
-\cs_new_protected:Npn \tl_build_end:N #1
-  {
-    \@@_build_get:NNN \__kernel_tl_set:Ne #1 #1
-    \exp_args:Nc \@@_build_end_loop:NN { \cs_to_str:N #1 ' } \tl_clear:N
-  }
-\cs_new_protected:Npn \tl_build_gend:N #1
-  {
-    \@@_build_get:NNN \__kernel_tl_gset:Ne #1 #1
-    \exp_args:Nc \@@_build_end_loop:NN { \cs_to_str:N #1 ' } \tl_gclear:N
-  }
-\cs_new_protected:Npn \@@_build_end_loop:NN #1#2
-  {
-    \if_meaning:w \c_empty_tl #1
-      \exp_after:wN \use_none:nnnnnn
-    \fi:
-    #2 #1
-    \exp_args:Nc \@@_build_end_loop:NN { \cs_to_str:N #1 ' } #2
-  }
-%    \end{macrocode}
-% \end{macro}
-%
-%    \begin{macrocode}
 %</package>
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %
@@ -361,7 +361,7 @@
 %   \begin{texnote}
 %     The result is returned within \tn{unexpanded}, which means that the
 %     comma list does not expand further when appearing in an
-%     \texttt{x}-type or \texttt{e}-type argument expansion.
+%     \texttt{e}-type or \texttt{x}-type argument expansion.
 %   \end{texnote}
 % \end{function}
 %
@@ -586,8 +586,8 @@
 %   \begin{texnote}
 %     The result is returned within the \tn{unexpanded}
 %     primitive (\cs{exp_not:n}), which means that the \meta{items}
-%     do not expand further when appearing in an \texttt{x}-type
-%     or \texttt{e}-type argument expansion.
+%     do not expand further when appearing in an \texttt{e}-type
+%     or \texttt{x}-type argument expansion.
 %   \end{texnote}
 % \end{function}
 %
@@ -611,8 +611,8 @@
 %   \begin{texnote}
 %     The result is returned within the \tn{unexpanded}
 %     primitive (\cs{exp_not:n}), which means that the \meta{items}
-%     do not expand further when appearing in an \texttt{x}-type
-%     or \texttt{e}-type argument expansion.
+%     do not expand further when appearing in an \texttt{e}-type
+%     or \texttt{x}-type argument expansion.
 %   \end{texnote}
 % \end{function}
 %
@@ -631,8 +631,8 @@
 %   \begin{texnote}
 %     The result is returned within the \tn{unexpanded}
 %     primitive (\cs{exp_not:n}), which means that the \meta{items}
-%     do not expand further when appearing in an \texttt{x}-type
-%     or \texttt{e}-type argument expansion.
+%     do not expand further when appearing in an \texttt{e}-type
+%     or \texttt{x}-type argument expansion.
 %   \end{texnote}
 % \end{function}
 %
@@ -737,8 +737,8 @@
 %   \begin{texnote}
 %     The result is returned within the \tn{unexpanded}
 %     primitive (\cs{exp_not:n}), which means that the \meta{item}
-%     does not expand further when appearing in an \texttt{x}-type
-%     or \texttt{e}-type argument expansion.
+%     does not expand further when appearing in an \texttt{e}-type
+%     or \texttt{x}-type argument expansion.
 %   \end{texnote}
 % \end{function}
 %
@@ -753,8 +753,8 @@
 %   \begin{texnote}
 %     The result is returned within the \tn{unexpanded}
 %     primitive (\cs{exp_not:n}), which means that the \meta{item}
-%     does not expand further when appearing in an \texttt{x}-type
-%     or \texttt{e}-type argument expansion.
+%     does not expand further when appearing in an \texttt{e}-type
+%     or \texttt{x}-type argument expansion.
 %   \end{texnote}
 % \end{function}
 %
@@ -1523,7 +1523,7 @@
 %     \clist_reverse:N, \clist_reverse:c,
 %     \clist_greverse:N, \clist_greverse:c
 %   }
-%   Use \cs{clist_reverse:n} in an \texttt{x}-expanding assignment.  The
+%   Use \cs{clist_reverse:n} in an \texttt{e}-expanding assignment.  The
 %   extra work that \cs{clist_reverse:n} does to preserve braces and
 %   spaces would not be needed for the well-controlled case of
 %   \texttt{N}-type comma lists, but the slow-down is not too bad.

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3color.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3color.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3color.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %
@@ -137,7 +137,7 @@
 %   In case we want a warning, the \meta{function} is defined to produce
 %   such a warning without grabbing any argument, then redefine itself
 %   to the standard definition that the \meta{function} should have,
-%   with arguments, and call that definition.  The \texttt{x}-type
+%   with arguments, and call that definition.  The \texttt{e}-type
 %   expansion and \cs{exp_not:n} avoid needing to double the~|#|, which
 %   we could not do anyways.  We then deal with the code for
 %   \cs{debug_off:n} |{deprecation}|: presumably someone doing that does
@@ -536,6 +536,15 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}{\seq_set_map_x:NNn, \seq_gset_map_x:NNn}
+%    \begin{macrocode}
+\__kernel_patch_deprecation:nnNNpn { 2023-10-26 } { \seq_set_map_e:NNn }
+\cs_gset_protected:Npn \seq_set_map_x:NNn { \seq_set_map_e:NNn }
+\__kernel_patch_deprecation:nnNNpn { 2023-10-26 } { \seq_gset_map_e:NNn }
+\cs_gset_protected:Npn \seq_gset_map_x:NNn { \seq_gset_map_e:NNn }
+%    \end{macrocode}
+% \end{macro}
+%
 % \subsection{Deprecated \pkg{l3sys} functions}
 %
 %    \begin{macrocode}
@@ -614,6 +623,15 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}{\tl_build_clear:N, \tl_build_gclear:N}
+%    \begin{macrocode}
+\__kernel_patch_deprecation:nnNNpn { 2023-10-18 } { \tl_build_begin:N }
+\cs_new_protected:Npn \tl_build_clear:N { \tl_build_begin:N }
+\__kernel_patch_deprecation:nnNNpn { 2023-10-18 } { \tl_build_gbegin:N }
+\cs_new_protected:Npn \tl_build_gclear:N { \tl_build_gbegin:N }
+%    \end{macrocode}
+% \end{macro}
+%
 % \subsection{Deprecated \pkg{l3token} functions}
 %
 % \begin{macro}[EXP]{\char_to_utfviii_bytes:n}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -85,7 +85,7 @@
 %    require you to do updates, if the class changes.}}
 %
 % \author{\Team}
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 % \maketitle
 % \tableofcontents
 %
@@ -1190,7 +1190,7 @@
 %   Get predicate from a function's base name.  The code is not broken
 %   by functions with no signature.  The |n|-type version can be used
 %   for keys and other non-control sequences.  The output after
-%   |x|-expansion is a string.
+%   |e|-expansion is a string.
 %    \begin{macrocode}
 \cs_new:Npn \@@_predicate_from_base:n #1
   {
@@ -1930,9 +1930,9 @@
     \raisebox{\baselineskip}[0pt][0pt]{\hypertarget{expstar}{}}%
     \write \@auxout { \def \string \Codedoc at expstar { } }
     \@@_typeset_exp:\ indicates~fully~expandable~functions,~which~
-    can~be~used~within~an~\texttt{x}-type~argument~(in~plain~
-    \TeX{}~terms,~inside~an~\cs{edef}),~as~well~as~within~an~
-    \texttt{f}-type~argument.
+    can~be~used~within~an~\texttt{e}-type~argument~(inside~an~\tn{expanded}),~
+    \texttt{x}-type~argument~(in~plain~\TeX{}~terms,~inside~an~\tn{edef}),~
+    as~well~as~within~an~\texttt{f}-type~argument.
   }
 \NewDocumentCommand { \CodedocExplainREXP } { }
   {
@@ -1940,8 +1940,8 @@
     \write \@auxout { \def \string \Codedoc at rexpstar { } }
     \@@_typeset_rexp:\ indicates~
     restricted~expandable~functions,~which~can~be~used~within~an~
-    \texttt{x}-type~argument~but~cannot~be~fully~expanded~within~an~
-    \texttt{f}-type~argument.
+    \texttt{x}-type~argument~or~an~\texttt{e}-type~argument,~
+    but~cannot~be~fully~expanded~within~an~\texttt{f}-type~argument.
   }
 \NewDocumentCommand { \CodedocExplainTF } { }
   {

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -63,7 +63,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %
@@ -229,7 +229,7 @@
 % contrast to |e|, all macro parameter characters |#| must be doubled,
 % and omitting this leads to low-level errors.  In addition this type of
 % expansion is not expandable, namely functions that have |x| in their
-% signature do not themselves expand when appearing inside |x| or |e|
+% signature do not themselves expand when appearing inside |e| or |x|
 % expansion.
 %
 % The |f| type is so special that it deserves an example.  It is
@@ -264,8 +264,7 @@
 % \begin{quote}
 %   |\example:n { 3 , 7 }|
 % \end{quote}
-% at the cost of being protected (for |x| type) or very much slower in
-% old engines (for |e| type).
+% at the cost of being protected for |x|-type.
 % If you use |f| type expansion in conditional processing then
 % you should stick to using |TF|  type functions only as the expansion
 % does not finish any |\if... \fi:| itself!
@@ -642,7 +641,7 @@
 %   appropriate argument specifier variant or the appropriate
 %   \cs[no-index]{exp_args:N\meta{variant}} function.
 %   \begin{texnote}
-%     This is the \TeX{} primitive \tn{expandafter} renamed.
+%     This is the \TeX{} primitive \tn{expandafter}.
 %   \end{texnote}
 % \end{function}
 %
@@ -659,10 +658,10 @@
 %     \cs{exp_not:N} \meta{token}
 %   \end{syntax}
 %   Prevents expansion of the \meta{token} in a context where it would
-%   otherwise be expanded, for example an |x|-type argument or the first
-%   token in an |o| or |e| or |f| argument.
+%   otherwise be expanded, for example an |e|-type or |x|-type argument or
+%   the first token in an |o|-type or |f|-type argument.
 %   \begin{texnote}
-%     This is the \TeX{} \tn{noexpand} primitive.  It only prevents
+%     This is the \TeX{} primitive \tn{noexpand}.  It only prevents
 %     expansion.  At the beginning of an |f|-type argument, a space
 %     \meta{token} is removed even if it appears as \cs{exp_not:N}
 %     \cs{c_space_token}.  In an |e|-expanding definition
@@ -686,16 +685,16 @@
 %   \begin{syntax}
 %     \cs{exp_not:n} \Arg{tokens}
 %   \end{syntax}
-%   Prevents expansion of the \meta{tokens} in an |e| or |x|-type argument.  In
-%   all other cases the \meta{tokens} continue to be expanded, for
+%   Prevents expansion of the \meta{tokens} in an |e|-type or |x|-type argument.
+%   In all other cases the \meta{tokens} continue to be expanded, for
 %   example in the input stream or in other types of arguments such as
 %   \texttt{c}, \texttt{f}, \texttt{v}.  The argument of \cs{exp_not:n}
 %   \emph{must} be surrounded by braces.
 %   \begin{texnote}
-%     This is the \eTeX{} \tn{unexpanded} primitive.  In an
-%     |x|-expanding definition (\cs{cs_new:Npe}), \cs{exp_not:n}~|{#1}|
+%     This is the \eTeX{} primitive \tn{unexpanded}.  In an
+%     |e|-expanding definition (\cs{cs_new:Npe}), \cs{exp_not:n}~|{#1}|
 %     is equivalent to |##1| rather than to~|#1|, namely it inserts the
-%     two characters |#| and~|1|.  In an |e|-type argument
+%     two characters |#| and~|1|, and
 %     \cs{exp_not:n}~|{#}| is equivalent to |#|, namely it inserts the
 %     character~|#|.
 %   \end{texnote}
@@ -706,7 +705,7 @@
 %     \cs{exp_not:o} \Arg{tokens}
 %   \end{syntax}
 %   Expands the \meta{tokens} once, then prevents any further expansion
-%   in |x|-type or \texttt{e}-type arguments using \cs{exp_not:n}.
+%   in |e|-type or |x|-type arguments using \cs{exp_not:n}.
 % \end{function}
 %
 % \begin{function}[EXP]{\exp_not:V}
@@ -714,7 +713,7 @@
 %     \cs{exp_not:V} \meta{variable}
 %   \end{syntax}
 %   Recovers the content of the \meta{variable}, then prevents expansion
-%   of this material in |x|-type or \texttt{e}-type arguments using \cs{exp_not:n}.
+%   of this material in |e|-type or |x|-type arguments using \cs{exp_not:n}.
 % \end{function}
 %
 % \begin{function}[EXP]{\exp_not:v}
@@ -725,7 +724,7 @@
 %   converts this into a control sequence which should be a \meta{variable}
 %   name.
 %   The content of the \meta{variable} is recovered, and further
-%   expansion in |x|-type or \texttt{e}-type arguments is prevented using \cs{exp_not:n}.
+%   expansion in |e|-type or |x|-type arguments is prevented using \cs{exp_not:n}.
 % \end{function}
 %
 % \begin{function}[EXP]{\exp_not:e}
@@ -734,7 +733,7 @@
 %   \end{syntax}
 %   Expands \meta{tokens} exhaustively, then protects the result of the
 %   expansion (including any tokens which were not expanded) from
-%   further expansion in |e| or |x|-type arguments using \cs{exp_not:n}.
+%   further expansion in |e|-type or |x|-type arguments using \cs{exp_not:n}.
 %   This is very rarely useful but is provided for consistency.
 % \end{function}
 %
@@ -745,7 +744,7 @@
 %   Expands \meta{tokens} fully until the first unexpandable token is
 %   found (if it is a space it is removed). Expansion then stops, and
 %   the result of the expansion (including any tokens which were not
-%   expanded) is protected from further expansion in |x|-type or \texttt{e}-type arguments
+%   expanded) is protected from further expansion in |e|-type or |x|-type arguments
 %   using \cs{exp_not:n}.
 % \end{function}
 %
@@ -758,7 +757,7 @@
 %   and all of \meta{tokens} are expandable \cs{exp_stop_f:}
 %   terminates the expansion of tokens even if \meta{more tokens}
 %   are also expandable. The function itself is an implicit space
-%   token. Inside an \texttt{x}-type or \texttt{e}-type expansion, it retains its
+%   token. Inside an \texttt{e}-type or \texttt{x}-type expansion, it retains its
 %   form, but when typeset it produces the underlying space (\verb*| |).
 % \end{function}
 %
@@ -948,7 +947,7 @@
 % In this section a general mechanism for defining functions that handle
 % arguments is defined.  These general expansion functions are
 % expandable unless |x| is used.  (Any version of |x| is going to have
-% to use one of the \LaTeX3 names for \cs{cs_set:Npe} at some
+% to use one of the \LaTeX3 names for \cs{cs_set:Npx} at some
 % point, and so is never going to be expandable.)
 %
 % The definition of expansion functions with this technique happens
@@ -1062,7 +1061,7 @@
 %   Since the expansion of \cs{exp:w} \cs{exp_end_continue_f:w} is
 %   empty, we wind up with a fully expanded list, only \TeX{} has not
 %   tried to execute any of the non-expandable tokens. This is what
-%   differentiates this function from the |x| argument type.
+%   differentiates this function from the |e| and |x| argument type.
 %    \begin{macrocode}
 \cs_new:Npn \::f #1 \::: #2#3
   {
@@ -1818,7 +1817,7 @@
 %       trigger an error, because we do not have a means to replace
 %       |o|-expansion by |x|-expansion.
 %       More generally, we can only convert |N| to |c|, or convert |n|
-%       to |V|, |v|, |o|, |f|, |x|.
+%       to |V|, |v|, |o|, |e|, |f|, or |x|.
 %     \end{itemize}
 %     All this boils down to a few rules.  Only |n| and |N|-type
 %     arguments can be replaced by \cs{cs_generate_variant:Nn}.  Other
@@ -1828,7 +1827,7 @@
 %     part is ignored.
 %
 %     We compare the base and variant signatures one character at a time
-%     within |x|-expansion.  The result is given to
+%     within |e|-expansion.  The result is given to
 %     \cs{@@_generate_variant:wwNN} (defined later) in the form
 %     \meta{processed variant signature} \cs{s_@@_mark} \meta{errors}
 %     \cs{s_@@_stop} \meta{base function} \meta{new function}.  If all went
@@ -1889,7 +1888,7 @@
 %
 %   The case where the two letters are different is only allowed if the
 %   base is |N| and the variant is |c|, or when the base is |n| and the
-%   variant is |o|, |V|, |v|, |f| or |x|.  Otherwise, call
+%   variant is |V|, |v|, |o|, |e|, |f|, or |x|.  Otherwise, call
 %   \cs{@@_generate_variant_loop_invalid:NNwNNnn} to remove the end of
 %   the loop, get arguments at the end of the loop, and place an
 %   appropriate error message as a second argument of

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %
@@ -486,7 +486,7 @@
 %   \end{syntax}
 %   This function writes \meta{tokens} to the specified
 %   \meta{stream} when the current page is finalised (\emph{i.e.}~at
-%   shipout). The \texttt{x}-type variants expand the \meta{tokens}
+%   shipout). The \texttt{e}-type variants expand the \meta{tokens}
 %   at the point where the function is used but \emph{not} when the
 %   resulting tokens are written to the \meta{stream}
 %   (\emph{cf.}~\cs{iow_shipout_e:Nn}).
@@ -597,7 +597,7 @@
 %   output does \emph{not} expand further when written to a file.
 %
 %   \begin{texnote}
-%     Internally, \cs{iow_wrap:nnnN} carries out an \texttt{x}-type expansion
+%     Internally, \cs{iow_wrap:nnnN} carries out an \texttt{e}-type expansion
 %     on the \meta{text} to expand it. This is done in such a way that
 %     \cs{exp_not:N} or \cs{exp_not:n} \emph{could} be used to prevent
 %     expansion of material. However, this is less conceptually clear than
@@ -687,9 +687,11 @@
 %   \emph{not} end in |/| other than the case that it is exactly equal
 %   to the root directory. The \meta{name} and \meta{ext} parts together
 %   make up the file name, thus the \meta{name} part may be thought of
-%   as the \enquote{job name} for the current file. Note that \TeX{} does
-%   not provide information on the \meta{ext} part for the main (top
-%   level) file and that this file always has an empty \meta{dir} component.
+%   as the \enquote{job name} for the current file.
+%
+%   Note that \TeX{} does not provide information on the \meta{dir} and
+%   \meta{ext} part for the main (top level) file and that this file
+%   always has empty \meta{dir} and \meta{ext} components.
 %   Also, the \meta{name} here will be equal to \cs{c_sys_jobname_str},
 %   which may be different from the real file name (if set using
 %   |--jobname|, for example).

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 % \maketitle
 %
 % \begin{documentation}
@@ -165,7 +165,6 @@
 % \subsection{Showing values}
 %
 % \begin{macro}{\fp_show:N, \fp_show:c, \fp_log:N, \fp_log:c, \@@_show:NN}
-% \begin{macro}[EXP]{\@@_show_validate:w}
 %   This shows the result of computing its argument by
 %   passing the right data to \cs{tl_show:n} or \cs{tl_log:n}.
 %    \begin{macrocode}
@@ -176,22 +175,92 @@
 \cs_new_protected:Npn \@@_show:NN #1#2
   {
     \__kernel_chk_tl_type:NnnT #2 { fp }
+      { \exp_args:No \@@_show_validate:n #2 }
+      { \exp_args:Ne #1 { \token_to_str:N #2 = \fp_to_tl:N #2 } }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[EXP]
+%   {
+%     \@@_show_validate:n, \@@_show_validate_aux:n, \@@_show_validate:nn,
+%   }
+% \begin{macro}[EXP]
+%   {
+%     \@@_show_validate:w,
+%     \@@_tuple_show_validate:w,
+%     \@@_symbolic_show_validate:w
+%   }
+%   To support symbolic expression, validation has to be done recursively.
+%   Two |\@@_show_validate:nn| wrappers are used to distinguish between
+%   initial and recursive calls, in which the former provides a demo of
+%   possible forms a |fp| variable would have.
+%    \begin{macrocode}
+\cs_new:Npn \@@_show_validate:n #1
+  {
+    \@@_show_validate:nn { #1 }
       {
-        \str_if_eq:eeTF { \tl_head:N #2 } { \s_@@_tuple } { \exp_not:o #2 }
+        \s_@@ \@@_chk:w ??? ;~ or \iow_newline:
+        \s_@@_tuple \_@@_tuple_chk:w ? ;~ or \iow_newline:
+        \s_@@_symbolic \@@_symbolic_chk:w ? , ? ;
+      }
+  }
+\cs_new:Npn \@@_show_validate_aux:n #1
+  {
+    \@@_show_validate:nn { #1 } { }
+  }
+\cs_new:Npn \@@_show_validate:nn #1#2
+  {
+    \tl_if_empty:nF { #1 }
+      {
+        \str_case:enF { \tl_head:n { #1 } }
           {
-            \exp_after:wN \@@_show_validate:w #2
-            \s_@@ \@@_chk:w ??? ; \s_@@_stop
+            { \s_@@ }
+              {
+                \@@_show_validate:w #1 \s_@@
+                \@@_chk:w ??? ; \s_@@_stop
+              }
+            { \s_@@_tuple }
+              {
+                \@@_tuple_show_validate:w #1
+                \s_@@_tuple \_@@_tuple_chk:w ?? ; \s_@@_stop
+              }
+            { \s_@@_symbolic }
+              {
+                \@@_symbolic_show_validate:w #1
+                \s_@@_symbolic \@@_symbolic_chk:w ? , ?? ; \s_@@_stop
+              }
           }
+          { #2 }
       }
-      { \exp_args:Ne #1 { \token_to_str:N #2 = \fp_to_tl:N #2 } }
   }
 \cs_new:Npn \@@_show_validate:w
     #1 \s_@@ \@@_chk:w #2#3#4#5 ; #6 \s_@@_stop
   {
-    \token_if_eq_meaning:NNTF #2 1
-      { \s_@@ \@@_chk:w #2 #3 {#4} #5 ; }
-      { \s_@@ \@@_chk:w #2 #3 #4 #5 ; }
+    \str_if_eq:nnF { #2 } {?}
+      {
+        \token_if_eq_meaning:NNTF #2 1
+          { \s_@@ \@@_chk:w #2 #3 { #4 } #5 ; }
+          { \s_@@ \@@_chk:w #2 #3 #4 #5 ; }
+        \@@_show_validate_aux:n { #6 }
+      }
   }
+\cs_new:Npn \@@_tuple_show_validate:w
+    #1 \s_@@_tuple \_@@_tuple_chk:w #2#3 ; #4 \s_@@_stop
+  {
+    \str_if_eq:nnF { #2 } {?}
+      { \s_@@_tuple \@@_tuple_chk:w { \@@_show_validate_aux:n { #2 } } ; }
+  }
+\cs_new:Npn \@@_symbolic_show_validate:w
+    #1 \s_@@_symbolic \@@_symbolic_chk:w #2 , #3#4 ; #5 \s_@@_stop
+  {
+    \str_if_eq:nnF { #2 } {?}
+      {
+        \s_@@_symbolic \@@_symbolic_chk:w \exp_not:n { #2 } ,
+        { \@@_show_validate_aux:n { #3 } };
+        \@@_show_validate_aux:n { #5 }
+      }
+  }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %
@@ -97,8 +97,8 @@
 % When used directly without an accessor function, floating points
 % should produce an error: this is the role of \cs{@@_chk:w}.  We could
 % make floating point variables be protected to prevent them from
-% expanding under \texttt{x}-expansion, but it seems more convenient to
-% treat them as a subcase of token list variables.
+% expanding under \texttt{e}/\texttt{x}-expansion, but it seems more
+% convenient to treat them as a subcase of token list variables.
 %
 % The (decimal part of the) IEEE-754-2008 standard requires the format
 % to be able to represent special floating point numbers besides the
@@ -235,7 +235,8 @@
 %   where \cs{s_@@} is equal to the \TeX{} primitive \tn{relax}, and
 %   \cs{@@_chk:w} is protected.  The rest of the floating point number
 %   is made of characters (or \tn{relax}).  This ensures that nothing
-%   expands under \texttt{f}-expansion, nor under \texttt{x}-expansion.
+%   expands under \texttt{f}-expansion, nor under
+%   \texttt{e}/\texttt{x}-expansion.
 %   However, when typeset, \cs{s_@@} does nothing, and \cs{@@_chk:w} is
 %   expanded.  We define \cs{@@_chk:w} to produce an error.
 %    \begin{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-functions.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-functions.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-functions.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %
@@ -72,7 +72,7 @@
 \cs_new_protected:Npn \@@_new_function:n #1
   {
     \@@_id_if_invalid:nTF {#1}
-      { \msg_error:nnn { fp } { invalid-identifier } {#1} }
+      { \msg_error:nnn { fp } { id-invalid } {#1} }
       {
         \cs_if_exist:cT { @@_parse_word_#1:N }
           {
@@ -91,12 +91,12 @@
 % \begin{macro}
 %   {\@@_function_set_parsing:Nn, \@@_function_set_parsing_aux:NNn}
 %    \begin{macrocode}
-\cs_new:Npn \@@_function_set_parsing:Nn #1#2
+\cs_new_protected:Npn \@@_function_set_parsing:Nn #1#2
   {
     \exp_args:NNc \@@_function_set_parsing_aux:NNn #1
       { @@_parse_word_#2:N } {#2}
   }
-\cs_new:Npn \@@_function_set_parsing_aux:NNn #1#2#3
+\cs_new_protected:Npn \@@_function_set_parsing_aux:NNn #1#2#3
   {
     \cs_set:Npe \@@_tmp:w
       {
@@ -171,7 +171,7 @@
 \cs_new_protected:Npn \@@_set_function:Nnnn #1#2#3#4
   {
     \@@_id_if_invalid:nTF {#2}
-      { \msg_error:nnn { fp } { invalid-identifier } {#2} }
+      { \msg_error:nnn { fp } { id-invalid } {#2} }
       {
         \cs_if_exist:cF { @@_parse_word_#2:N }
           { \@@_function_set_parsing:Nn \cs_set_eq:NN {#2} }
@@ -180,8 +180,10 @@
           \exp_args:No \clist_map_inline:nn { \tl_to_str:n {#3} }
             {
               \int_incr:N \l_@@_function_arg_int
-              \exp_args:Ne \@@_clear_variable:n
-                { _ \tex_romannumeral:D \l_@@_function_arg_int }
+              \exp_args:Ne \@@_clear_variable_aux:n
+                {
+                  \c_underscore_str \tex_romannumeral:D \l_@@_function_arg_int
+                }
               \fp_clear_variable:n {##1}
               \cs_set_nopar:cpe { l_@@_variable_##1_fp }
                 {
@@ -264,8 +266,12 @@
   { \exp_args:No \@@_clear_function:n { \tl_to_str:n {#1} } }
 \cs_new_protected:Npn \@@_clear_function:n #1
   {
-    \cs_undefine:c { @@_parse_word_ #1 :N }
-    \@@_function_set_parsing:Nn \cs_set_eq:NN {#1}
+    \@@_id_if_invalid:nTF {#1}
+      { \msg_error:nnn { fp } { id-invalid } {#1} }
+      {
+        \cs_set_eq:cN { @@_#1_o:w } \tex_undefine:D
+        \@@_function_set_parsing:Nn \cs_set_eq:NN {#1} 
+      }
   }
 %    \end{macrocode}
 % \end{macro}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-symbolic.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-symbolic.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-symbolic.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %
@@ -157,8 +157,8 @@
 % \begin{macro}[EXP]
 %   {\@@_if_has_symbolic:nTF, \@@_if_has_symbolic_aux:w}
 %   Tests if |#1| contains \cs{s_@@_symbolic} at top-level.  This test
-%   should be precise enough to determine if a given an array contains a
-%   symbolic expression or only consists in floating points.  Used in
+%   should be precise enough to determine if a given array contains a
+%   symbolic expression or only consists of floating points.  Used in
 %   \cs{@@_exp_after_symbolic_f:nw}.
 %    \begin{macrocode}
 \cs_new:Npn \@@_if_has_symbolic:nTF #1
@@ -255,9 +255,9 @@
 %     \@@_&_symbolic_o:ww,
 %   }
 %    \begin{macrocode}
-\cs_set:Npn \@@_tmp:w #1#2
+\cs_set_protected:Npn \@@_tmp:w #1#2
   {
-    \cs_new_nopar:cpn
+    \cs_new:cpn
       { @@_symbolic_#2_symbolic_o:ww }
       { \@@_symbolic_binary_o:Nww #1 }
     \cs_new_eq:cc
@@ -277,7 +277,7 @@
 %
 % \subsection{Applying prefix functions to expressions}
 %
-% \begin{macro}[aux, EXP]{\@@_symbolic_unary_o:NNw}
+% \begin{macro}[EXP]{\@@_symbolic_unary_o:NNw}
 %   Used when applying infix operators to expressions.
 %    \begin{macrocode}
 \cs_new:Npn \@@_symbolic_unary_o:NNw #1#2#3; @
@@ -313,7 +313,7 @@
     {not} {sec} {set_sign} {sin} {sqrt} {tan}
   }
   {
-    \cs_new_nopar:cpe { @@_symbolic_#1_o:w }
+    \cs_new:cpe { @@_symbolic_#1_o:w }
       {
         \exp_not:N \@@_symbolic_unary_o:NNw
         \exp_not:c { @@_#1_o:w }
@@ -336,7 +336,7 @@
 %    \begin{macrocode}
 \cs_set_protected:Npn \@@_tmp:w #1#2#3
   {
-    \cs_new_nopar:cpn { @@_symbolic_to_#1:w }
+    \cs_new:cpn { @@_symbolic_to_#1:w }
       {
         \exp_after:wN \@@_symbolic_convert:wnnN
         \exp:w \exp_end_continue_f:w
@@ -384,7 +384,8 @@
 % \begin{macro}[rEXP]
 %   {
 %     \@@_symbolic_unary_to_tl:NNw,
-%     \@@_symbolic_binary_to_tl:Nww
+%     \@@_symbolic_binary_to_tl:Nww,
+%     \@@_symbolic_function_to_tl:Nw
 %   }
 %   Converting a symbolic expression to a token list is possible.
 %    \begin{macrocode}
@@ -440,6 +441,7 @@
 %   loop through letters in |#1|: if it is not a letter, break the loop
 %   and return \texttt{true}.  If the end of the loop is reached
 %   without finding any non-letter, return \texttt{false}.
+%   Note |#1| must be a str (i.e., resulted from \cs{tl_to_str:n}).
 %    \begin{macrocode}
 \prg_new_protected_conditional:Npnn
     \@@_id_if_invalid:n #1 { T , F , TF }
@@ -447,10 +449,10 @@
     \tl_if_empty:nTF {#1}
       { \prg_return_true: }
       {
-        \tl_if_in:onTF { \tl_to_str:n {#1} } { ~ }
+        \tl_if_in:nnTF { #1 } { ~ }
           { \prg_return_true: }
           {
-            \exp_after:wN \@@_id_if_invalid_aux:N \tl_to_str:n {#1}
+            \@@_id_if_invalid_aux:N #1
               { ? \prg_break:n \prg_return_false: }
             \prg_break_point:
           }
@@ -511,9 +513,9 @@
 % \begin{macro}
 %   {\@@_variable_set_parsing:Nn, \@@_variable_set_parsing_aux:NNn}
 %    \begin{macrocode}
-\cs_new:Npn \@@_variable_set_parsing:Nn #1#2
+\cs_new_protected:Npn \@@_variable_set_parsing:Nn #1#2
   {
-    \cs_set_nopar:Npn \@@_tmp:w
+    \cs_set:Npn \@@_tmp:w
       {
         \@@_exp_after_symbolic_f:nw { \@@_parse_infix:NN }
         \s_@@_symbolic \@@_symbolic_chk:w
@@ -522,7 +524,7 @@
     \exp_args:NNc \@@_variable_set_parsing_aux:NNn #1
       { @@_parse_word_#2:N } {#2}
   }
-\cs_new:Npn \@@_variable_set_parsing_aux:NNn #1#2#3
+\cs_new_protected:Npn \@@_variable_set_parsing_aux:NNn #1#2#3
   {
     \cs_if_eq:NNF #2 \@@_tmp:w
       {
@@ -541,23 +543,32 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\fp_clear_variable:n}
-% \begin{macro}{\@@_clear_variable:n}
+% \begin{macro}
+%   {
+%     \fp_clear_variable:n,
+%     \@@_clear_variable:n, \@@_clear_variable_aux:n
+%   }
+%   We need local undefining, so have to do it low-level.
+%   \cs{@@_clear_variable_aux:n} is needed by \cs{@@_set_function:Nnnn}
+%   to skip \cs{@@_id_if_invalid:nTF}.
 %    \begin{macrocode}
 \cs_new_protected:Npn \fp_clear_variable:n #1
   {
+    \exp_args:No \@@_clear_variable:n { \tl_to_str:n {#1} }
+  }
+\cs_new_protected:Npn \@@_clear_variable:n #1
+  {
     \@@_id_if_invalid:nTF {#1}
       { \msg_error:nnn { fp } { id-invalid } {#1} }
-      { \exp_args:No \@@_clear_variable:n { \tl_to_str:n {#1} } }
+      { \@@_clear_variable_aux:n {#1} }
   }
-\cs_new_protected:Npn \@@_clear_variable:n #1
+\cs_new_protected:Npn \@@_clear_variable_aux:n #1
   {
-    \cs_undefine:c { l_@@_variable_#1_fp }
+    \cs_set_eq:cN { l_@@_variable_#1_fp } \tex_undefined:D
     \@@_variable_set_parsing:Nn \cs_set_eq:NN {#1}
   }
 %    \end{macrocode}
 % \end{macro}
-% \end{macro}
 %
 % \begin{macro}{\fp_new_variable:n}
 % \begin{macro}{\@@_new_variable:n}
@@ -567,20 +578,22 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \fp_new_variable:n #1
   {
-    \@@_id_if_invalid:nTF {#1}
-      { \msg_error:nnn { fp } { id-invalid } {#1} }
-      { \exp_args:No \@@_new_variable:n { \tl_to_str:n {#1} } }
+    \exp_args:No \@@_new_variable:n { \tl_to_str:n {#1} }
   }
 \cs_new_protected:Npn \@@_new_variable:n #1
   {
-    \cs_if_exist:cT { @@_parse_word_#1:N }
+    \@@_id_if_invalid:nTF {#1}
+      { \msg_error:nnn { fp } { id-invalid } {#1} }
       {
-        \msg_error:nnn
-          { fp } { id-already-defined } {#1}
-        \cs_undefine:c { @@_parse_word_#1:N }
-        \cs_undefine:c { l_@@_variable_#1_fp }
+        \cs_if_exist:cT { @@_parse_word_#1:N }
+        {
+          \msg_error:nnn
+            { fp } { id-already-defined } {#1}
+          \cs_undefine:c { @@_parse_word_#1:N }
+          \cs_set_eq:cN { l_@@_variable_#1_fp } \tex_undefined:D
+        }
+      \@@_variable_set_parsing:Nn \cs_gset_eq:NN {#1}
       }
-    \@@_variable_set_parsing:Nn \cs_gset_eq:NN {#1}
   }
 %    \end{macrocode}
 % \end{macro}
@@ -605,24 +618,26 @@
 \flag_new:n { @@_symbolic }
 \cs_new_protected:Npn \fp_set_variable:nn #1
   {
-    \@@_id_if_invalid:nTF {#1}
-      { \msg_error:nnn { fp } { id-invalid } {#1} }
-      { \exp_args:No \@@_set_variable:nn { \tl_to_str:n {#1} } }
+    \exp_args:No \@@_set_variable:nn { \tl_to_str:n {#1} }
   }
 \cs_new_protected:Npn \@@_set_variable:nn #1#2
   {
-    \@@_variable_set_parsing:Nn \cs_set_eq:NN {#1}
-    \fp_set:Nn \l_@@_symbolic_fp {#2}
-    \cs_set_nopar:cpn { l_@@_variable_#1_fp }
-      { \flag_ensure_raised:n { @@_symbolic } \c_nan_fp }
-    \flag_clear:n { @@_symbolic }
-    \fp_set:cn { l_@@_variable_#1_fp } { \l_@@_symbolic_fp }
-    \flag_if_raised:nT { @@_symbolic }
+    \@@_id_if_invalid:nTF {#1}
+      { \msg_error:nnn { fp } { id-invalid } {#1} }
       {
-        \msg_error:nneee { fp } { id-loop }
-          { \tl_to_str:n {#1} }
-          { \tl_to_str:n {#2} }
-          { \fp_to_tl:N \l_@@_symbolic_fp }
+        \@@_variable_set_parsing:Nn \cs_set_eq:NN {#1}
+        \fp_set:Nn \l_@@_symbolic_fp {#2}
+        \cs_set_nopar:cpn { l_@@_variable_#1_fp }
+          { \flag_ensure_raised:n { @@_symbolic } \c_nan_fp }
+        \flag_clear:n { @@_symbolic }
+        \fp_set:cn { l_@@_variable_#1_fp } { \l_@@_symbolic_fp }
+        \flag_if_raised:nT { @@_symbolic }
+          {
+            \msg_error:nneee { fp } { id-loop }
+              { #1 }
+              { \tl_to_str:n {#2} }
+              { \fp_to_tl:N \l_@@_symbolic_fp }
+          }
       }
   }
 %    \end{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 % \maketitle
 %
 % \begin{documentation}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-types.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-types.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-types.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -49,7 +49,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %
@@ -768,7 +768,8 @@
 %   \end{syntax}
 %   Defines the \meta{identifier} to stand in any further expression for
 %   the result of evaluating the \meta{floating point expression}, with
-%   the \meta{identifier} accepting the \meta{vars} (a comma list).
+%   the \meta{identifier} accepting the \meta{vars} (a non-empty
+%   comma-separated list).
 %   The result may contain other functions, which are
 %   then replaced by their results if they have any.  For instance,
 %   \begin{quote}
@@ -1376,10 +1377,10 @@
 %   \end{syntax}
 %   Computes the arcsine, arccosine, arccosecant, or arcsecant of the
 %   \meta{fp expr} and returns the result in degrees, in the range
-%   $[-90,90]$ for \texttt{asin} and \texttt{acsc} and $[0,180]$ for
-%   \texttt{acos} and \texttt{asec}.  For a result in radians, use
-%   \texttt{asin}, \emph{etc.}  If the argument of |asin| or |acos| lies
-%   outside the range $[-1,1]$, or the argument of |acsc| or |asec|
+%   $[-90,90]$ for \texttt{asind} and \texttt{acscd} and $[0,180]$ for
+%   \texttt{acosd} and \texttt{asecd}.  For a result in radians, use
+%   \texttt{asin}, \emph{etc.}  If the argument of |asind| or |acosd| lies
+%   outside the range $[-1,1]$, or the argument of |acscd| or |asecd|
 %   inside the range $(-1,1)$, an \enquote{invalid operation} exception
 %   is raised.  \enquote{Underflow} and \enquote{overflow} occur when
 %   appropriate.
@@ -1424,8 +1425,8 @@
 %     \cs{fp_eval:n} \{ |acotd(| \meta{fp expr} |)| \}
 %     \cs{fp_eval:n} \{ |acotd(| \meta{fp expr_1} , \meta{fp expr_2} |)| \}
 %   \end{syntax}
-%   Those functions yield an angle in degrees: \texttt{atand} and
-%   \texttt{acotd} are their analogs in radians.  The one-argument
+%   Those functions yield an angle in degrees: \texttt{atan} and
+%   \texttt{acot} are their analogs in radians.  The one-argument
 %   versions compute the arctangent or arccotangent of the
 %   \meta{fp expr}: arctangent takes values in the range $[-90,90]$, and
 %   arccotangent in the range $[0,180]$.  The two-argument arctangent

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %
@@ -1035,7 +1035,7 @@
 %   |=|, |<| or |>| with category code $12$.
 %   The \cs{else:} branch is optional.
 %   \begin{texnote}
-%     These are both names for the \TeX{} primitive \tn{ifnum}.
+%     This is the \TeX{} primitive \tn{ifnum}.
 %   \end{texnote}
 % \end{function}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %
@@ -101,7 +101,7 @@
 %   given \meta{specific type} of token list.  Produces suitable error
 %   messages if the \meta{control sequence} does not exist, or if it is
 %   not a token list variable at all, or if the \meta{control sequence}
-%   differs from the result of |x|-expanding \meta{reconstruction}.  If
+%   differs from the result of |e|-expanding \meta{reconstruction}.  If
 %   all of these tests succeed then the \meta{true code} is run.
 % \end{function}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %
@@ -1023,12 +1023,12 @@
 %   all). Spaces are trimmed from the ends of the \meta{key} and \meta{value},
 %   then one \emph{outer} set of braces is removed from the \meta{key}
 %   and \meta{value} as part of the processing. If you need exactly the output
-%   shown above, you'll need to either \texttt{x}-type or \texttt{e}-type expand
+%   shown above, you'll need to either \texttt{e}-type or \texttt{x}-type expand
 %   the function.
 %   \begin{texnote}
 %     The result of each list element is returned within \cs{exp_not:n}, which
 %     means that the converted input stream does not expand further when
-%     appearing in an \texttt{x}-type or \texttt{e}-type argument expansion.
+%     appearing in an \texttt{e}-type or \texttt{x}-type argument expansion.
 %   \end{texnote}
 % \end{function}
 %
@@ -1068,7 +1068,7 @@
 %   \begin{texnote}
 %     The result is returned within \cs{exp_not:n}, which means that the
 %     converted input stream does not expand further when appearing in an
-%     \texttt{x}-type or \texttt{e}-type argument expansion.
+%     \texttt{e}-type or \texttt{x}-type argument expansion.
 %   \end{texnote}
 % \end{function}
 %
@@ -1805,7 +1805,7 @@
 %   }
 %   Searching for a property means finding the last |.| in the input,
 %   and storing the text before and after it. Everything is turned into
-%   strings, so there is no problem using an \texttt{x}-type expansion. Since
+%   strings, so there is no problem using an \texttt{e}-type expansion. Since
 %   \cs{@@_trim_spaces:n} will turn its argument into a string anyway, this
 %   function uses \cs{cs_set_nopar:Npe} instead of \cs{tl_set:Ne} to gain some
 %   speed.

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %
@@ -244,13 +244,12 @@
 %   Wrapper around |require'|\meta{module}|'|.
 %    \begin{macrocode}
 \str_new:N \l_@@_err_msg_str
-\cs_generate_variant:Nn \msg_error:nnnn { nnnV }
 \cs_new_protected:Npn \lua_load_module:n #1
   {
     \bool_if:nF { \@@_load_module_p:n { #1 } }
       {
         \msg_error:nnnV
-          { luatex } { module-not-found } { #1 } { \l_@@_err_msg_str }
+          { luatex } { module-not-found } { #1 } \l_@@_err_msg_str
       }
   }
 %    \end{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %
@@ -288,7 +288,7 @@
 % message, extra arguments are ignored, or empty arguments added (of
 % course the sense of the message may be impaired). The four arguments are
 % converted to strings before being added to the message text: the
-% \texttt{x}-type variants should be used to expand material.
+% \texttt{e}-type variants should be used to expand material.
 % Note that this expansion takes place with the standard definitions in
 % effect, which means that shorthands such as |\~| or |\\| are
 % \emph{not} available; instead one should use \cs{iow_char:N} |\~| and
@@ -961,7 +961,7 @@
 % \begin{macro}{\@@_interrupt_text:n, \@@_interrupt_more_text:n}
 %   First setup \TeX{}'s \tn{errhelp} register with the extra help |#1|,
 %   then build a nice-looking error message with |#2|.  Everything is
-%   done using \texttt{x}-type expansion as the new line markers are
+%   done using \texttt{e}-type expansion as the new line markers are
 %   different for the two type of text and need to be correctly set up.
 %   The auxiliary \cs{@@_interrupt_more_text:n} receives its argument
 %   as a line-wrapped string, which is thus unaffected by expansion.

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3pdf.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3pdf.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3pdf.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %
@@ -335,8 +335,8 @@
 %     \cs{prop_get:NnN}.
 %     The result is returned within the \tn{unexpanded}
 %     primitive (\cs{exp_not:n}), which means that the \meta{value}
-%     does not expand further when appearing in an \texttt{x}-type
-%     or \texttt{e}-type argument expansion.
+%     does not expand further when appearing in an \texttt{e}-type
+%     or \texttt{x}-type argument expansion.
 %   \end{texnote}
 % \end{function}
 %
@@ -358,7 +358,7 @@
 %   \begin{texnote}
 %     The result is returned within the \tn{unexpanded} primitive
 %     (\cs{exp_not:n}), which means that the key--value list does not expand
-%     further when appearing in an \texttt{x}-type or \texttt{e}-type argument expansion.
+%     further when appearing in an \texttt{e}-type or \texttt{x}-type argument expansion.
 %     It also needs exactly two steps of expansion.
 %   \end{texnote}
 % \end{function}
@@ -1258,7 +1258,7 @@
 %   \meta{value} may contain arbitrary tokens, it is not safe to include
 %   them in the argument of \cs{@@_split:NnTF}.  We thus start by
 %   storing in \cs{l_@@_internal_tl} tokens which (after
-%   \texttt{x}-expansion) encode the key--value pair.  This variable can
+%   \texttt{e}-expansion) encode the key--value pair.  This variable can
 %   safely be used in \cs{@@_split:NnTF}.  If the \meta{key} was absent,
 %   append the new key--value to the list.
 %   Otherwise concatenate the extracts |##1|

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -31,7 +31,7 @@
 % \fi
 %
 % \title{^^A
-%   The \pkg{l3quark} package\\ Quarks^^A
+%   The \pkg{l3quark} package\\ Quarks and scan marks^^A
 % }
 %
 % \author{^^A
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %
@@ -1090,7 +1090,7 @@
 % When actually building the result,
 % \begin{itemize}
 %   \item \tn{toks}\meta{position} holds \meta{tokens} which \texttt{o}-
-%     and \texttt{x}-expand to the \meta{position}-th token in the query.
+%     and \texttt{e}-expand to the \meta{position}-th token in the query.
 %   \item \cs{g_@@_balance_intarray} holds the balance of begin-group and
 %     end-group character tokens which appear before that point in the
 %     token list.
@@ -1160,12 +1160,12 @@
 %
 % \begin{macro}{\@@_toks_put_left:Ne}
 % \begin{macro}{\@@_toks_put_right:Ne, \@@_toks_put_right:Nn}
-%   During the building phase we wish to add \texttt{x}-expanded
+%   During the building phase we wish to add \texttt{e}-expanded
 %   material to \tn{toks}, either to the left or to the right. The
 %   expansion is done \enquote{by hand} for optimization (these
 %   operations are used quite a lot). The \texttt{Nn} version of
 %   \cs{@@_toks_put_right:Ne} is provided because it is more
-%   efficient than \texttt{x}-expanding with \cs{exp_not:n}.
+%   efficient than \texttt{e}-expanding with \cs{exp_not:n}.
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_toks_put_left:Ne #1#2
   {
@@ -1188,7 +1188,7 @@
 % \begin{macro}[rEXP]{\@@_curr_cs_to_str:}
 %   Expands to the string representation of the token (known to be a
 %   control sequence) at the current position \cs{l_@@_curr_pos_int}.
-%   It should only be used in \texttt{x}-expansion to avoid losing a
+%   It should only be used in \texttt{e}/\texttt{x}-expansion to avoid losing a
 %   leading space.
 %    \begin{macrocode}
 \cs_new:Npn \@@_curr_cs_to_str:
@@ -1705,7 +1705,7 @@
 % a string, then read from left to right, interpreting backslashes as
 % escaping the next character.  Unescaped characters are fed to the
 % function \meta{inline~1}, and escaped characters are fed to the function
-% \meta{inline~2} within an \texttt{x}-expansion context (typically those
+% \meta{inline~2} within an \texttt{e}-expansion context (typically those
 % functions perform some tests on their argument to decide how to output
 % them).  The escape sequences |\a|, |\e|, |\f|, |\n|, |\r|, |\t| and
 % |\x| are recognized, and those are replaced by the corresponding
@@ -1712,7 +1712,7 @@
 % character, then fed to \meta{inline~3}. The result is then left in the
 % input stream. Spaces are ignored unless escaped.
 %
-% The conversion is done within an \texttt{x}-expanding assignment.
+% The conversion is done within an \texttt{e}-expanding assignment.
 %
 % \begin{macro}{\@@_escape_use:nnnn}
 %   The result is built in \cs{l_@@_internal_a_tl}, which is then left
@@ -2393,7 +2393,7 @@
 % \begin{macro}{\@@_compile:w, \@@_compile_end:}
 %   Used when compiling a user regex or a regex for the |\c{...}| escape
 %   sequence within another regex. Start building a token list within a
-%   group (with \texttt{x}-expansion at the outset), and set a few
+%   group (with \texttt{e}-expansion at the outset), and set a few
 %   variables (group level, catcodes), then start the first branch. At
 %   the end, make sure there are no dangling classes nor groups, close
 %   the last branch: we are done building \cs{l_@@_internal_regex}.
@@ -3638,7 +3638,7 @@
 %
 % \begin{macro}[EXP]{\@@_compile_u_loop:NN}
 %   We collect the characters for the argument of |\u| within an
-%   \texttt{x}-expanding assignment. In principle we could just wait to
+%   \texttt{e}-expanding assignment. In principle we could just wait to
 %   encounter a right brace, but this is unsafe: if the right brace was
 %   missing, then we would reach the end-markers of the regex, and
 %   continue, leading to obscure fatal errors. Instead, we only allow
@@ -4220,7 +4220,7 @@
 \cs_new_protected:Npn \@@_show_item_exact_cs:n #1
   {
     \seq_set_split:Nnn \l_@@_internal_seq { \scan_stop: } {#1}
-    \seq_set_map_x:NNn \l_@@_internal_seq
+    \seq_set_map_e:NNn \l_@@_internal_seq
       \l_@@_internal_seq { \iow_char:N\\##1 }
     \@@_show_one:n
       { control~sequence~ \seq_use:Nn \l_@@_internal_seq { ~or~ } }
@@ -5363,7 +5363,7 @@
   }
 \cs_new_protected:Npn \@@_match_once_init_aux:
   {
-    \tl_build_clear:N \l_@@_matched_analysis_tl
+    \tl_build_begin:N \l_@@_matched_analysis_tl
     \tl_clear:N \l_@@_curr_analysis_tl
   }
 %    \end{macrocode}
@@ -5663,7 +5663,7 @@
           \l_@@_fresh_thread_bool
         \int_set_eq:NN \l_@@_success_pos_int \l_@@_curr_pos_int
         \int_set_eq:NN \l_@@_last_char_success_int \l_@@_last_char_int
-        \tl_build_clear:N \l_@@_matched_analysis_tl
+        \tl_build_begin:N \l_@@_matched_analysis_tl
         \tl_set_eq:NN \l_@@_success_submatches_tl
           \l_@@_curr_submatches_tl
         \prg_break:
@@ -5748,7 +5748,7 @@
 %   \cs{exp_not:n} requires a braced argument. As far as I can tell, it
 %   is only needed if the user tries to include in the replacement text
 %   a control sequence set equal to a macro parameter character, such as
-%   \cs{c_parameter_token}. Indeed, within an \texttt{x}-expanding
+%   \cs{c_parameter_token}. Indeed, within an \texttt{e}/\texttt{x}-expanding
 %   assignment, \cs{exp_not:N}~|#| behaves as a single |#|, whereas
 %   \cs{exp_not:n}~|{#}| behaves as a doubled |##|.
 %    \begin{macrocode}
@@ -5774,7 +5774,7 @@
 %   exclusive. The function \cs{@@_query_range:nn} \Arg{min}
 %   \Arg{max} unpacks registers from the position \meta{min} to the
 %   position $\meta{max}-1$ included. Once this is expanded, a second
-%   \texttt{x}-expansion results in the actual tokens from the
+%   \texttt{e}-expansion results in the actual tokens from the
 %   query. That second expansion is only done by user functions at the
 %   very end of their operation, after checking (and correcting) the
 %   brace balance first.
@@ -6056,9 +6056,7 @@
 %   Unless the submatch appears inside a |\c{...}| or |\u{...}|
 %   construction, it must be taken into account in the brace balance.
 %   Later on, |##1| will be replaced by a pointer to the $0$-th submatch for a
-%   given match.  There is an \cs{exp_not:N} here as at the point-of-use
-%   of \cs{g_@@_balance_tl} there is an \texttt{x}-type expansion which is needed
-%   to get |##1| in correctly.
+%   given match.
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_replacement_put_submatch:n #1
   {
@@ -6292,7 +6290,7 @@
 %
 % \begin{macro}{\@@_replacement_c_A:w}
 %   For an active character, expansion must be avoided, twice because we
-%   later do two \texttt{x}-expansions, to unpack \tn{toks} for the
+%   later do two \texttt{e}-expansions, to unpack \tn{toks} for the
 %   query, and to expand their contents to tokens of the query.
 %    \begin{macrocode}
   \char_set_catcode_active:N \^^@
@@ -6305,7 +6303,7 @@
 %   An explicit begin-group token increases the balance, unless within a
 %   |\c{...}| or |\u{...}| construction. Add the desired begin-group
 %   character, using the standard \cs{if_false:} trick. We eventually
-%   \texttt{x}-expand twice. The first time must yield a balanced token
+%   \texttt{e}-expand twice. The first time must yield a balanced token
 %   list, and the second one gives the bare begin-group token. The
 %   \cs{exp_after:wN} is not strictly needed, but is more consistent
 %   with \pkg{l3tl-analysis}.
@@ -6326,7 +6324,7 @@
 %   This is not quite catcode-related: when the user requests a
 %   character with category \enquote{control sequence}, the
 %   one-character control symbol is returned. As for the active
-%   character, we prepare for two \texttt{x}-expansions.
+%   character, we prepare for two \texttt{e}-expansions.
 %    \begin{macrocode}
   \cs_new_protected:Npn \@@_replacement_c_C:w #1#2
     {
@@ -6347,7 +6345,7 @@
 % \end{macro}
 %
 % \begin{macro}{\@@_replacement_c_E:w}
-%   Similar to the begin-group case, the second \texttt{x}-expansion
+%   Similar to the begin-group case, the second \texttt{e}-expansion
 %   produces the bare end-group token.
 %    \begin{macrocode}
   \char_set_catcode_group_end:N \^^@
@@ -6391,7 +6389,7 @@
 %
 % \begin{macro}{\@@_replacement_c_P:w}
 %   For macro parameters, expansion is a tricky issue. We need to
-%   prepare for two \texttt{x}-expansions and passing through various
+%   prepare for two \texttt{e}-expansions and passing through various
 %   macro definitions. Note that we cannot replace one \cs{exp_not:n} by
 %   doubling the macro parameter characters because this would misbehave
 %   if a mischievous user asks for |\c{\cP\#}|, since that macro
@@ -7213,7 +7211,7 @@
 %   this match; we need to add the tokens from the end of the match to
 %   the end of the query. Finally, store the result in the user's
 %   variable after closing the group: this step involves an additional
-%   \texttt{x}-expansion, and checks that braces are balanced in the
+%   \texttt{e}-expansion, and checks that braces are balanced in the
 %   final result.
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_replace_once:nnN #1#2
@@ -7303,7 +7301,7 @@
 %     \@@_group_end_replace:N, \@@_group_end_replace_try:,
 %     \@@_group_end_replace_check:w, \@@_group_end_replace_check:n
 %   }
-%   At this stage \cs{l_@@_internal_a_tl} (|x|-expands to the desired
+%   At this stage \cs{l_@@_internal_a_tl} (|e|-expands to the desired
 %   result).  Guess from \cs{l_@@_balance_int} the number of braces to
 %   add before or after the result then try expanding.  The simplest
 %   case is when \cs{l_@@_internal_a_tl} together with the braces we
@@ -7476,7 +7474,7 @@
       \@@_single_match:
       #1
       \@@_match_init:
-      \tl_build_clear:N \l_@@_input_tl
+      \tl_build_begin:N \l_@@_input_tl
       \@@_match_once_init:
       \peek_analysis_map_inline:n
         {
@@ -7499,7 +7497,7 @@
 %   match.  For \cs{peek_regex_remove_once:nTF} we reinsert the tokens
 %   seen only if the match failed; otherwise we just reinsert the
 %   tokens~|#1|, with one expansion.  To be more precise, |#1| consists
-%   of tokens that \texttt{o}-expand and \texttt{x}-expand to the last
+%   of tokens that \texttt{o}-expand and \texttt{e}-expand to the last
 %   token seen, for example it is \cs{exp_not:N} \meta{cs} for a control
 %   sequence.  This means that just doing \cs{exp_after:wN}
 %   \cs{l_@@_peek_true_tl} |#1| would be unsafe because the expansion of
@@ -7661,12 +7659,12 @@
 % \begin{macro}{\@@_peek_replacement_put:n}
 %   While building the replacement function
 %   \cs{@@_replacement_do_one_match:n}, we often want to put simple
-%   material, given as |#1|, whose \texttt{x}-expansion
+%   material, given as |#1|, whose \texttt{e}-expansion
 %   \texttt{o}-expands to a single token.  Normally we can just add the
 %   token to \cs{l_@@_build_tl}, but for
 %   \cs{peek_regex_replace_once:nnTF} we eventually want to do some
 %   strange expansion that is basically using \cs{exp_after:wN} to jump
-%   through numerous tokens (we cannot use \texttt{x}-expansion like for
+%   through numerous tokens (we cannot use \texttt{e}-expansion like for
 %   \cs{regex_replace_once:nnNTF} because it is ok for the result to be
 %   unbalanced since we insert it in the input stream rather than
 %   storing it.  When within a csname we don't do any such shenanigan

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %
@@ -327,8 +327,8 @@
 %   \begin{texnote}
 %     The result is returned within the \tn{unexpanded}
 %     primitive (\cs{exp_not:n}), which means that the \meta{item}
-%     does not expand further when appearing in an \texttt{x}-type
-%     or \texttt{e}-type argument expansion.
+%     does not expand further when appearing in an \texttt{e}-type
+%     or \texttt{x}-type argument expansion.
 %   \end{texnote}
 % \end{function}
 %
@@ -342,8 +342,8 @@
 %   \begin{texnote}
 %     The result is returned within the \tn{unexpanded}
 %     primitive (\cs{exp_not:n}), which means that the \meta{item}
-%     does not expand further when appearing in an \texttt{x}-type
-%     or \texttt{e}-type argument expansion.
+%     does not expand further when appearing in an \texttt{e}-type
+%     or \texttt{x}-type argument expansion.
 %   \end{texnote}
 % \end{function}
 %
@@ -740,15 +740,15 @@
 %   \end{texnote}
 % \end{function}
 %
-% \begin{function}[added = 2020-07-16]
-%   {\seq_set_map_x:NNn, \seq_gset_map_x:NNn}
+% \begin{function}[added = 2020-07-16, updated = 2023-10-26]
+%   {\seq_set_map_e:NNn, \seq_gset_map_e:NNn}
 %   \begin{syntax}
-%     \cs{seq_set_map_x:NNn} \meta{seq~var_1} \meta{seq~var_2} \Arg{inline function}
+%     \cs{seq_set_map_e:NNn} \meta{seq~var_1} \meta{seq~var_2} \Arg{inline function}
 %   \end{syntax}
 %   Applies \meta{inline function} to every \meta{item} stored
 %   within the \meta{seq~var_2}. The \meta{inline function} should
 %   consist of code which will receive the \meta{item} as |#1|.
-%   The sequence resulting from \texttt{x}-expanding
+%   The sequence resulting from \texttt{e}-expanding
 %   \meta{inline function} applied to each \meta{item}
 %   is assigned to \meta{seq~var_1}. As such, the code
 %   in \meta{inline function} should be expandable.
@@ -796,8 +796,8 @@
 %   \begin{texnote}
 %     The result is returned within the \tn{unexpanded}
 %     primitive (\cs{exp_not:n}), which means that the \meta{items}
-%     do not expand further when appearing in an \texttt{x}-type
-%     or \texttt{e}-type argument expansion.
+%     do not expand further when appearing in an \texttt{e}-type
+%     or \texttt{x}-type argument expansion.
 %   \end{texnote}
 % \end{function}
 %
@@ -821,8 +821,8 @@
 %   \begin{texnote}
 %     The result is returned within the \tn{unexpanded}
 %     primitive (\cs{exp_not:n}), which means that the \meta{items}
-%     do not expand further when appearing in an \texttt{x}-type
-%     or \texttt{e}-type argument expansion.
+%     do not expand further when appearing in an \texttt{e}-type
+%     or \texttt{x}-type argument expansion.
 %   \end{texnote}
 % \end{function}
 %
@@ -1308,14 +1308,14 @@
 %   spaces the item is enclosed within braces. After
 %   \cs{tl_replace_all:Nnn}, the token list \cs{l_@@_internal_a_tl}
 %   is a repetition of the pattern
-%   \cs{@@_set_split_auxi:w} \cs{prg_do_nothing:}
+%   \cs{@@_set_split:Nw} \cs{prg_do_nothing:}
 %   \meta{item with spaces} \cs{@@_set_split_end:}.
-%   Then, \texttt{x}-expansion causes \cs{@@_set_split_auxi:w}
+%   Then, \texttt{e}-expansion causes \cs{@@_set_split:Nw}
 %   to trim spaces, and leaves its result as
-%   \cs{@@_set_split_auxii:w} \meta{trimmed item}
+%   \cs{@@_set_split:w} \meta{trimmed item}
 %   \cs{@@_set_split_end:}. This is then converted
 %   to the \pkg{l3seq} internal structure by another
-%   \texttt{x}-expansion. In the first step, we insert
+%   \texttt{e}-expansion. In the first step, we insert
 %   \cs{prg_do_nothing:} to avoid losing braces too early:
 %   that would cause space trimming to act within those
 %   lost braces. The second step is solely there to strip
@@ -1480,7 +1480,7 @@
 %
 % \begin{macro}{\@@_wrap_item:n}
 %   This function converts its argument to a proper sequence item
-%   in an \texttt{x}-expansion context.
+%   in an \texttt{e}-expansion context.
 %    \begin{macrocode}
 \cs_new:Npn \@@_wrap_item:n #1 { \exp_not:n { \@@_item:n {#1} } }
 %    \end{macrocode}
@@ -1542,15 +1542,15 @@
 %   items one at a time to an intermediate sequence.
 %   The approach taken is therefore similar to
 %   that in \cs{@@_pop_right:NNN}, using a \enquote{flexible}
-%   \texttt{x}-type expansion to do most of the work. As \cs{tl_if_eq:nnT}
+%   \texttt{e}-type expansion to do most of the work. As \cs{tl_if_eq:nnT}
 %   is not expandable, a two-part strategy is needed. First, the
-%   \texttt{x}-type expansion uses \cs{str_if_eq:nnT} to find potential
+%   \texttt{e}-type expansion uses \cs{str_if_eq:nnT} to find potential
 %   matches. If one is found, the expansion is halted and the necessary
-%   set up takes place to use the \cs{tl_if_eq:NNT} test. The \texttt{x}-type
+%   set up takes place to use the \cs{tl_if_eq:NNT} test. The \texttt{e}-type
 %   is started again, including all of the items copied already. This
 %   happens repeatedly until the entire sequence has been scanned. The code
-%   is set up to avoid needing and intermediate scratch list: the lead-off
-%   \texttt{x}-type expansion (|#1 #2 {#2}|) ensures that nothing is lost.
+%   is set up to avoid needing an intermediate scratch list: the lead-off
+%   \texttt{e}-type expansion (|#1 #2 {#2}|) ensures that nothing is lost.
 %    \begin{macrocode}
 \cs_new_protected:Npn \seq_remove_all:Nn
   { \@@_remove_all_aux:NNn \__kernel_tl_set:Ne }
@@ -1993,7 +1993,7 @@
 %   use some of the same ideas as getting from the right. What is needed is a
 %   \enquote{flexible length} way to set a token list variable. This is
 %   supplied by the |{ \if_false: } \fi:| \ldots
-%   |\if_false: { \fi: }| construct. Using an \texttt{x}-type
+%   |\if_false: { \fi: }| construct. Using an \texttt{e}-type
 %   expansion and a \enquote{non-expanding} definition for \cs{@@_item:n},
 %   the left-most $n - 1$ entries in a sequence of $n$ items are stored
 %   back in the sequence. That needs a loop of unknown length, hence using the
@@ -2280,7 +2280,7 @@
 %   }
 % \UnitTested
 %   This is just a specialised version of the in-line mapping function,
-%   using an \texttt{x}-type expansion for the code set up so that the
+%   using an \texttt{e}-type expansion for the code set up so that the
 %   number of |#| tokens required is as expected.
 %    \begin{macrocode}
 \cs_new_protected:Npn \seq_map_variable:NNn #1#2#3
@@ -2389,17 +2389,17 @@
 % \end{macro}
 % \end{macro}
 %
-% \begin{macro}{\seq_set_map_x:NNn, \seq_gset_map_x:NNn}
-% \begin{macro}{\@@_set_map_x:NNNn}
+% \begin{macro}{\seq_set_map_e:NNn, \seq_gset_map_e:NNn}
+% \begin{macro}{\@@_set_map_e:NNNn}
 %   Very similar to \cs{seq_set_filter:NNn}. We could actually
 %   merge the two within a single function, but it would have weird
 %   semantics.
 %    \begin{macrocode}
-\cs_new_protected:Npn \seq_set_map_x:NNn
-  { \@@_set_map_x:NNNn \__kernel_tl_set:Ne }
-\cs_new_protected:Npn \seq_gset_map_x:NNn
-  { \@@_set_map_x:NNNn \__kernel_tl_gset:Ne }
-\cs_new_protected:Npn \@@_set_map_x:NNNn #1#2#3#4
+\cs_new_protected:Npn \seq_set_map_e:NNn
+  { \@@_set_map_e:NNNn \__kernel_tl_set:Ne }
+\cs_new_protected:Npn \seq_gset_map_e:NNn
+  { \@@_set_map_e:NNNn \__kernel_tl_gset:Ne }
+\cs_new_protected:Npn \@@_set_map_e:NNNn #1#2#3#4
   {
     \@@_push_item_def:n { \exp_not:N \@@_item:n {#4} }
     #1 #2 { #3 }
@@ -2411,7 +2411,7 @@
 %
 % \begin{macro}{\seq_set_map:NNn, \seq_gset_map:NNn}
 % \begin{macro}{\@@_set_map:NNNn}
-%   Similar to \cs{seq_set_map_x:NNn}, but prevents expansion of the
+%   Similar to \cs{seq_set_map_e:NNn}, but prevents expansion of the
 %   <inline function>.
 %    \begin{macrocode}
 \cs_new_protected:Npn \seq_set_map:NNn

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %
@@ -907,7 +907,7 @@
 %   Inserts a horizontal \meta{skip} into the current list.
 %   The argument can also be a \meta{dim}.
 %   \begin{texnote}
-%     \cs{skip_horizontal:N} is the \TeX{} primitive \tn{hskip} renamed.
+%     \cs{skip_horizontal:N} is the \TeX{} primitive \tn{hskip}.
 %   \end{texnote}
 % \end{function}
 %
@@ -920,7 +920,7 @@
 %   Inserts a vertical \meta{skip} into the current list.
 %   The argument can also be a \meta{dim}.
 %   \begin{texnote}
-%     \cs{skip_vertical:N} is the \TeX{} primitive \tn{vskip} renamed.
+%     \cs{skip_vertical:N} is the \TeX{} primitive \tn{vskip}.
 %   \end{texnote}
 % \end{function}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %
@@ -345,7 +345,7 @@
 %
 % \begin{variable}{str_byte, str_error}
 %   Conversions from one \meta{encoding}/\meta{escaping} pair to another
-%   are done within \texttt{x}-expanding assignments. Errors are
+%   are done within \texttt{e}-expanding assignments. Errors are
 %   signalled by raising the relevant flag.
 %    \begin{macrocode}
 \flag_new:n { str_byte }
@@ -979,7 +979,7 @@
 %   non-Unicode-aware engines we use a fall-back character |?| rather
 %   than nothing when given a character code outside $[0,255]$.  We
 %   detect the presence of bad characters using a flag and only produce
-%   a single error after the \texttt{x}-expanding assignment.
+%   a single error after the \texttt{e}-expanding assignment.
 %    \begin{macrocode}
 \bool_lazy_any:nTF
   {
@@ -2515,7 +2515,7 @@
 %   its second argument (expanded or not). It sets \cs{@@_tmp:w} to
 %   expand to the character code of either of its two arguments
 %   depending on endianness, then triggers the \texttt{_loop} auxiliary
-%   inside an \texttt{x}-expanding assignment to \cs{g_@@_result_tl}.
+%   inside an \texttt{e}-expanding assignment to \cs{g_@@_result_tl}.
 %
 %   The \texttt{_loop} auxiliary first checks for the end-of-string
 %   marker \cs{s_@@_stop}, calling the \texttt{_end} auxiliary if

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %
@@ -1036,7 +1036,7 @@
 %   simplified version of the token list code because neither the
 %   delimiter nor the replacement can contain macro parameters or
 %   braces.  The delimiter \cs{s_@@_mark} cannot appear in the string to
-%   edit so it is used in all cases.  Some |x|-expansion is unnecessary.
+%   edit so it is used in all cases.  Some |e|-expansion is unnecessary.
 %   There is no need to avoid losing braces nor to protect against
 %   expansion.  The ending code is much simplified and does not need to
 %   hide in braces.
@@ -1266,7 +1266,7 @@
   { \@@_case:nw {#1} #2 {#1} { } \s_@@_mark {#3} \s_@@_mark {#4} \s_@@_stop }
 \cs_generate_variant:Nn \str_case:nn   { V , o , e , nV , nv }
 \prg_generate_conditional_variant:Nnn \str_case:nn
-  { V , o , nV , nv } { T , F , TF }
+  { V , o , e , nV , nv } { T , F , TF }
 \cs_new_eq:NN \str_case:Nn   \str_case:Vn
 \cs_new_eq:NN \str_case:NnT  \str_case:VnT
 \cs_new_eq:NN \str_case:NnF  \str_case:VnF

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %
@@ -54,7 +54,7 @@
 % \begin{variable}[added = 2015-09-19, updated = 2019-10-27]{\c_sys_jobname_str}
 %   Constant that gets the \enquote{job name} assigned when \TeX{} starts.
 %   \begin{texnote}
-%     This copies the contents of the primitive \tn{jobname}. For technical
+%     This is the \TeX{} primitive \tn{jobname}. For technical
 %     reasons, the string here is not of the same internal form as other,
 %     but may be manipulated using normal string functions.
 %   \end{texnote}
@@ -73,7 +73,8 @@
 %   The date and time at which the current job was started: these are
 %   all reported as integers.
 %   \begin{texnote}
-%     Whilst the underlying primitives can be altered by the user, this
+%     Whilst the underlying \TeX{} primitives \tn{time}, \tn{day}, \tn{month},
+%     and~\tn{year} can be altered by the user, this
 %     interface to the time and date is intended to be the \enquote{real}
 %     values.
 %   \end{texnote}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %
@@ -192,8 +192,12 @@
 % \begin{macro}[EXP]{\@@_change_case_lower_sigma:nnnnn}
 % \begin{macro}[EXP]{\@@_change_case_lower_sigma:nnnnw}
 % \begin{macro}[EXP]{\@@_change_case_lower_sigma:nnnnN}
+% \begin{macro}[EXP]
+%   {
+%     \@@_change_case_codepoint_title_auxi:nnnn ,
+%     \@@_change_case_codepoint_title_auxii:nnnn
+%   }
 % \begin{macro}[EXP]{\@@_change_case_codepoint_title:nnn}
-% \begin{macro}[EXP]{\@@_change_case_codepoint_title:nnnnn}
 % \begin{macro}[EXP]{\@@_change_case_codepoint:nnnnn}
 % \begin{macro}[EXP]{\@@_change_case_codepoint:nn}
 % \begin{macro}[EXP]
@@ -695,40 +699,39 @@
     \@@_change_case_loop:nnnw {#2} {#3} {#4} #5
   }
 %    \end{macrocode}
-%   For titlecasing, we need to fully expand the new character to see if it
-%   is a letter (or active).
+%   For titlecasing, we need to obtain the general category of the current
+%   codepoint.
 %    \begin{macrocode}
 \cs_new:Npn \@@_change_case_codepoint_title:nnnn #1#2#3#4
   {
     \bool_if:NTF \l_text_titlecase_check_letter_bool
       {
-        \tl_if_single:nTF {#4}
+        \exp_args:Ne \@@_change_case_codepoint_title_auxi:nnnn
           {
-            \bool_lazy_or:nnTF
-              { \token_if_letter_p:N #4 }
-              {
-                \bool_lazy_and_p:nn
-                  { \token_if_active_p:N #4 }
-                  { ! \int_compare_p:nNn {`#4} < { "80 } }
-              }
-              { \@@_change_case_codepoint_title:nnn }
-              { \@@_change_case_codepoint_title:nnnnn { title } {#1} }
+            \codepoint_to_category:n
+              { \@@_codepoint_from_chars:Nw #4 }
           }
-          { \@@_change_case_codepoint_title:nnn }
       }
       { \@@_change_case_codepoint_title:nnn }
         {#2} {#3} {#4}
   }
+\cs_new:Npn \@@_change_case_codepoint_title_auxi:nnnn #1#2#3#4
+  {
+    \tl_if_head_eq_charcode:nNTF {#1} { L }
+      { \@@_change_case_codepoint_title:nnn }
+      { \@@_change_case_codepoint_title_auxii:nnnn { title } }
+        {#2} {#3} {#4}
+  }
 \cs_new:Npn \@@_change_case_codepoint_title:nnn #1#2#3
-  { \@@_change_case_codepoint_title:nnnnn { title } { end } {#1} {#2} {#3} }
-\cs_new:Npn \@@_change_case_codepoint_title:nnnnn #1#2#3#4#5
+  { \@@_change_case_codepoint_title_auxii:nnnn { end } {#1} {#2} {#3} }
+\cs_new:Npn \@@_change_case_codepoint_title_auxii:nnnn #1#2#3#4
   {
-    \cs_if_exist_use:cF { @@_change_case_title_ #4 :nnnnn }
+    \cs_if_exist_use:cF { @@_change_case_title_ #3 :nnnnn }
       {
-        \cs_if_exist_use:cF { @@_change_case_upper_ #4 :nnnnn }
+        \cs_if_exist_use:cF { @@_change_case_upper_ #3 :nnnnn }
           { \@@_change_case_codepoint:nnnnn }
       }
-        {#1} {#2} {#3} {#4} {#5}
+        { title } {#1} {#2} {#3} {#4}
   }
 \cs_new:Npn \@@_change_case_codepoint:nnnnn #1#2#3#4#5
   {

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3text-map.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3text-map.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3text-map.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3text.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3text.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3text.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %
@@ -188,13 +188,12 @@
 %   \end{itemize}
 %
 %  Determining whether non-letter characters at the start of text should count
-%  as the uppercase element is controllable. When \cs{l_text_titlecase_check_letter_bool} is
-%  \texttt{true}, characters which are not letters (category code~$11$) are
-%  \enquote{skipped}: the first \emph{letter} is uppercased.
-%  (With $8$-bit engines, this is extended to active characters which form
-%  part of a multi-byte letter codepoint.) When
-%  \cs{l_text_titlecase_check_letter_bool} is \texttt{false}, the first
-%  character is uppercased, irrespective of the category code of the character.
+%  as the uppercase element is controllable. When
+%  \cs{l_text_titlecase_check_letter_bool} is \texttt{true}, codepoints which are
+%  not letters (Unicode general category \texttt{L}) are not changed, and only
+%  the first \emph{letter} is uppercased.
+%  When \cs{l_text_titlecase_check_letter_bool} is \texttt{false}, the first
+%  codepoint is uppercased, irrespective of the general code of the character.
 %
 % \begin{function}[added = 2022-07-04]
 %   {

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %
@@ -61,7 +61,7 @@
 % \meta{token}:
 % \begin{itemize}
 %   \item \meta{tokens}, which both \texttt{o}-expand and
-%     \texttt{x}-expand to the \meta{token}. The detailed form of
+%     \texttt{e}/\texttt{x}-expand to the \meta{token}. The detailed form of
 %     \meta{tokens} may change in later releases.
 %   \item \meta{char code}, a decimal representation of the character
 %     code of the \meta{token}, $-1$ if it is a control sequence.
@@ -132,7 +132,7 @@
 % We thus need a way to encode any \meta{token} (even begin-group and
 % end-group character tokens) in a way amenable to manipulating tokens
 % individually. The best we can do is to find \meta{tokens} which both
-% \texttt{o}-expand and \texttt{x}-expand to the given
+% \texttt{o}-expand and \texttt{e}/\texttt{x}-expand to the given
 % \meta{token}. Collecting more information about the category code and
 % character code is also useful for regular expressions, since most
 % regexes are catcode-agnostic. The internal format thus takes the form
@@ -140,7 +140,7 @@
 % \begin{quote}
 %   \meta{tokens} \cs{s_@@} \meta{catcode} \meta{char code} \cs{s_@@}
 % \end{quote}
-% The \meta{tokens} \texttt{o}- \emph{and} \texttt{x}-expand to the
+% The \meta{tokens} \texttt{o}- \emph{and} \texttt{e}/\texttt{x}-expand to the
 % original token in the token list or to the cluster of tokens
 % corresponding to one Unicode character in the given encoding (for
 % \pkg{l3str-convert}). The \meta{catcode} is given as a single hexadecimal
@@ -155,7 +155,7 @@
 % converting from a general token list to the internal format.
 %
 % The current rule for converting a \meta{token} to a balanced set of
-% \meta{tokens} which both \texttt{o}-expands and \texttt{x}-expands to
+% \meta{tokens} which both \texttt{o}-expands and \texttt{e}/\texttt{x}-expands to
 % it is the following.
 % \begin{itemize}
 %   \item A control sequence |\cs| becomes |\exp_not:n { \cs }|
@@ -189,7 +189,7 @@
 %   then need to control expansion much more carefully: compare
 %   \cs{int_value:w} |`#1| \cs{s_@@} with \cs{int_value:w} |`#1|
 %   \cs{exp_stop_f:} \cs{exp_not:N} \cs{q_mark} to extract a character
-%   code followed by the delimiter in an \texttt{x}-expansion.
+%   code followed by the delimiter in an \texttt{e}-expansion.
 %    \begin{macrocode}
 \scan_new:N \s_@@
 %    \end{macrocode}
@@ -350,7 +350,7 @@
 % (\texttt{N}-type) argument by \TeX{}. The plan is to have a two pass
 % system. In the first pass, locate special tokens, and store them in
 % various \tn{toks} registers. In the second pass, which is done within
-% an \texttt{x}-expanding assignment, normal tokens are taken in as
+% an \texttt{e}-expanding assignment, normal tokens are taken in as
 % \texttt{N}-type arguments, and special tokens are retrieved from the
 % \tn{toks} registers, and removed from the input stream by some means.
 % The whole process takes linear time, because we avoid building the
@@ -830,7 +830,7 @@
 %   while a control sequence is always longer (we have set the escape
 %   character to a printable value). In both cases, we leave
 %   \cs{exp_not:n} \Arg{token} \cs{s_@@} in the input stream
-%   (after \texttt{x}-expansion). Here, \cs{exp_not:n} is used
+%   (after \texttt{e}-expansion). Here, \cs{exp_not:n} is used
 %   rather than \cs{exp_not:N} because |#3| could be
 %   a macro parameter character or could be \cs{s_@@}
 %   (which must be hidden behind braces in the result).
@@ -937,7 +937,7 @@
 %   Check now whether we reached the end (we shouldn't keep the trailing
 %   end-group character that marked the end of the token list in the
 %   first pass).
-%   Unpack the \tn{toks} register: when \texttt{x}-expanding again,
+%   Unpack the \tn{toks} register: when \texttt{e}/\texttt{x}-expanding again,
 %   we will get the special token.
 %   Then leave the category code in the input stream, followed by
 %   the character code, and call \cs{@@_analysis_b_loop:w} with the next index.
@@ -1069,7 +1069,7 @@
 % \end{macro}
 %
 % \begin{macro}[rEXP]{\@@_analysis_show:, \@@_analysis_show_loop:wNw}
-%   Here, |#1| \texttt{o}- and \texttt{x}-expands to the token;
+%   Here, |#1| \texttt{o}- and \texttt{e}/\texttt{x}-expands to the token;
 %   |#2| is the category code (one uppercase hexadecimal digit),
 %   $0$ for control sequences;
 %   |#3| is the character code, which we ignore.
@@ -1390,7 +1390,7 @@
 %   characters to anything else than character code~$32$), then we apply
 %   \cs{@@_analysis_b_char:Nn}, which detects active characters by
 %   comparing them to \cs{tex_undefined:D}, and we must have undefined
-%   the active space for this test to work ---we use an |x|-expanding
+%   the active space for this test to work ---we use an |e|-expanding
 %   assignment to get the active space in the right place.  Finally
 %   \cs{@@_peek_analysis_char:w} puts the arguments in the correct
 %   order, including \cs{exp_not:n} for macro parameter characters and
@@ -1549,7 +1549,7 @@
 %   character code.  In the latter two cases we call
 %   \cs{char_generate:nn} with suitable arguments and put suitable
 %   \cs{if_false:} \cs{fi:} constructions to make the result balanced
-%   and such that \texttt{o}-expanding or \texttt{x}-expanding gives
+%   and such that \texttt{o}-expanding or \texttt{e}/\texttt{x}-expanding gives
 %   back a single (unbalanced) begin-group or end-group character.
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_peek_analysis_explicit:n #1

Added: trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx	                        (rev 0)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -0,0 +1,329 @@
+% \iffalse meta-comment
+%
+%% File: l3tl-build.dtx
+%
+% Copyright (C) 2018-2023 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
+% license or (at your option) any later version.  The latest version
+% of this license is in the file
+%
+%    https://www.latex-project.org/lppl.txt
+%
+% This file is part of the "l3kernel bundle" (The Work in LPPL)
+% and all files in that bundle must be distributed together.
+%
+% -----------------------------------------------------------------------
+%
+% The development version of the bundle can be found at
+%
+%    https://github.com/latex3/latex3
+%
+% for those people who are interested.
+%
+%<*driver>
+\documentclass[full,kernel]{l3doc}
+\begin{document}
+  \DocInput{\jobname.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \title{^^A
+%   The \textsf{l3tl-build} package\\ Piecewise \texttt{tl} constructions^^A
+% }
+%
+% \author{^^A
+%  The \LaTeX{} Project\thanks
+%    {^^A
+%      E-mail:
+%        \href{mailto:latex-team at latex-project.org}
+%          {latex-team at latex-project.org}^^A
+%    }^^A
+% }
+%
+% \date{Released 2023-11-01}
+%
+% \maketitle
+%
+% \begin{documentation}
+%
+% \section{Constructing \meta{tl~var} by accumulation}
+%
+% When creating a \meta{tl~var} by accumulation of many tokens, the performance
+% available using a combination of \cs{tl_set:Nn} and \cs{tl_put_right:Nn} or
+% similar begins to become an issue. To address this, a set of functions are
+% available to \enquote{build} a \meta{tl~var}. The performance of this approach
+% is much more efficient than the standard \cs{tl_put_right:Nn}, but the
+% constructed token list cannot be accessed during construction other than
+% by methods provided in this section.
+%
+% \begin{function}[added = 2018-04-01]{\tl_build_begin:N, \tl_build_gbegin:N}
+%   \begin{syntax}
+%     \cs{tl_build_begin:N} \meta{tl~var}
+%   \end{syntax}
+%   Clears the \meta{tl~var} and sets it up to support other
+%   \cs[no-index]{tl_build_\ldots{}} functions.  Until \cs{tl_build_end:N}
+%   \meta{tl~var} is called, applying any function from \pkg{l3tl} other
+%   than \cs[no-index]{tl_build_\ldots{}} will lead to incorrect
+%   results.  The |begin| and |gbegin| functions must be used for local
+%   and global \meta{tl~var} respectively.
+% \end{function}
+%
+% \begin{function}[added = 2018-04-01]
+%   {
+%     \tl_build_put_left:Nn, \tl_build_put_left:Ne,
+%     \tl_build_gput_left:Nn, \tl_build_gput_left:Ne,
+%     \tl_build_put_right:Nn, \tl_build_put_right:Ne,
+%     \tl_build_gput_right:Nn, \tl_build_gput_right:Ne
+%   }
+%   \begin{syntax}
+%     \cs{tl_build_put_left:Nn} \meta{tl~var} \Arg{tokens}
+%     \cs{tl_build_put_right:Nn} \meta{tl~var} \Arg{tokens}
+%   \end{syntax}
+%   Adds \meta{tokens} to the left or right side of the current contents
+%   of \meta{tl~var}.  The \meta{tl~var} must have been set up with
+%   \cs{tl_build_begin:N} or \cs{tl_build_gbegin:N}.  The |put| and
+%   |gput| functions must be used for local and global \meta{tl~var}
+%   respectively.  The |right| functions are about twice faster than the
+%   |left| functions.
+% \end{function}
+%
+% \begin{function}[added = 2018-04-01]{\tl_build_end:N, \tl_build_gend:N}
+%   \begin{syntax}
+%     \cs{tl_build_end:N} \meta{tl~var}
+%   \end{syntax}
+%   Gets the contents of \meta{tl~var} and stores that into the
+%   \meta{tl~var} using \cs{tl_set:Nn} or \cs{tl_gset:Nn}.
+%   The \meta{tl~var} must have
+%   been set up with \cs{tl_build_begin:N} or \cs{tl_build_gbegin:N}.
+%   The |end| and |gend| functions must be used for local and global
+%   \meta{tl~var} respectively.  These functions completely remove the
+%   setup code that enabled \meta{tl~var} to be used for other
+%   \cs[no-index]{tl_build_\ldots{}} functions. After the action of
+%   |end|/|gend|, the \meta{tl~var} may be manipulated using standard
+%   \texttt{tl} functions.
+% \end{function}
+%
+% \end{documentation}
+%
+% \begin{implementation}
+%
+% \section{\pkg{l3tl-build} implementation}
+%
+%    \begin{macrocode}
+%<*package>
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+%<@@=tl>
+%    \end{macrocode}
+%
+% Between \cs{tl_build_begin:N} \meta{tl~var} and \cs{tl_build_end:N}
+% \meta{tl~var}, the \meta{tl~var} has the structure
+% \begin{quote}
+%   \cs{exp_end:} \ldots{} \cs{exp_end:} \cs{@@_build_last:NNn}
+%   \meta{assignment} \meta{next~tl} \Arg{left} \meta{right}
+% \end{quote}
+% where \meta{right} is not braced.  The \enquote{data} it represents is
+% \meta{left} followed by the \enquote{data} of \meta{next~tl} followed
+% by \meta{right}.  The \meta{next~tl} is a token list variable whose
+% name is that of \meta{tl~var} followed by~|'|.  There are between $0$
+% and $4$ \cs{exp_end:} to keep track of when \meta{left} and
+% \meta{right} should be put into the \meta{next~tl}.  The
+% \meta{assignment} is \cs{cs_set_nopar:Npe} if the variable is local,
+% and \cs{cs_gset_nopar:Npe} if it is global.
+%
+% \begin{macro}{\tl_build_begin:N, \tl_build_gbegin:N}
+% \begin{macro}{\@@_build_begin:NN, \@@_build_begin:NNN}
+%   First construct the \meta{next~tl}: using a prime here conflicts
+%   with the usual \pkg{expl3} convention but we need a name that can be
+%   derived from |#1| without any external data such as a counter.
+%   Empty that \meta{next~tl} and setup the structure.  The local and
+%   global versions only differ by a single function
+%   \cs[no-index]{cs_(g)set_nopar:Npe} used for all assignments: this is
+%   important because only that function is stored in the \meta{tl~var}
+%   and \meta{next~tl} for subsequent assignments.  In principle
+%   \cs{@@_build_begin:NNN} could use \cs[no-index]{tl_(g)clear_new:N}
+%   to empty |#1| and make sure it is defined, but logging the
+%   definition does not seem useful so we just do |#3| |#1| |{}| to
+%   clear it locally or globally as appropriate.
+%    \begin{macrocode}
+\cs_new_protected:Npn \tl_build_begin:N #1
+  { \@@_build_begin:NN \cs_set_nopar:Npe #1 }
+\cs_new_protected:Npn \tl_build_gbegin:N #1
+  { \@@_build_begin:NN \cs_gset_nopar:Npe #1 }
+\cs_new_protected:Npn \@@_build_begin:NN #1#2
+  { \exp_args:Nc \@@_build_begin:NNN { \cs_to_str:N #2 ' } #2 #1 }
+\cs_new_protected:Npn \@@_build_begin:NNN #1#2#3
+  {
+    #3 #1 { }
+    #3 #2
+      {
+        \exp_not:n { \exp_end: \exp_end: \exp_end: \exp_end: }
+        \exp_not:n { \@@_build_last:NNn #3 #1 { } }
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}
+%   {
+%     \tl_build_put_right:Nn, \tl_build_put_right:Ne, \tl_build_put_right:Nx,
+%     \tl_build_gput_right:Nn, \tl_build_gput_right:Ne, \tl_build_gput_right:Nx
+%   }
+% \begin{macro}{\@@_build_last:NNn}
+% \begin{macro}{\@@_build_put:nn}
+% \begin{macro}{\@@_build_put:nw}
+%   Similar to \cs{tl_put_right:Nn}, but apply \cs{exp:w} to |#1|.  Most
+%   of the time this just removes one \cs{exp_end:}.  When there are
+%   none left, \cs{@@_build_last:NNn} is expanded instead.  It resets
+%   the definition of the \meta{tl~var} by ending the \cs{exp_not:n} and
+%   the definition early.  Then it makes sure the \meta{next~tl} (its
+%   argument |#1|) is set-up and starts a new definition.  Then
+%   \cs{@@_build_put:nn} and \cs{@@_build_put:nw} place the \meta{left}
+%   part of the original \meta{tl~var} as appropriate for the definition
+%   of the \meta{next~tl} (the \meta{right} part is left in the right
+%   place without ever becoming a macro argument).  We use
+%   \cs{exp_after:wN} rather than some \cs{exp_args:No} to avoid reading
+%   arguments that are likely very long token lists.  We use
+%   \cs[no-index]{cs_(g)set_nopar:Npe} rather than
+%   \cs[no-index]{tl_(g)set:Ne} partly for the same reason and partly
+%   because the assignments are interrupted by brace tricks, which
+%   implies that the assignment does not simply set the token list to an
+%   |e|-expansion of the second argument.
+%    \begin{macrocode}
+\cs_new_protected:Npn \tl_build_put_right:Nn #1#2
+  {
+    \cs_set_nopar:Npe #1
+      { \__kernel_exp_not:w \exp_after:wN { \exp:w #1 #2 } }
+  }
+\cs_generate_variant:Nn \tl_build_put_right:Nn { Ne , Nx }
+\cs_new_protected:Npn \tl_build_gput_right:Nn #1#2
+  {
+    \cs_gset_nopar:Npe #1
+      { \__kernel_exp_not:w \exp_after:wN { \exp:w #1 #2 } }
+  }
+\cs_generate_variant:Nn \tl_build_gput_right:Nn { Ne , Nx }
+\cs_new_protected:Npn \@@_build_last:NNn #1#2
+  {
+    \if_false: { { \fi:
+          \exp_end: \exp_end: \exp_end: \exp_end: \exp_end:
+          \@@_build_last:NNn #1 #2 { }
+        }
+      }
+    \if_meaning:w \c_empty_tl #2
+      \@@_build_begin:NN #1 #2
+    \fi:
+    #1 #2
+      {
+        \__kernel_exp_not:w \exp_after:wN
+          {
+            \exp:w \if_false: } } \fi:
+            \exp_after:wN \@@_build_put:nn \exp_after:wN {#2}
+  }
+\cs_new_protected:Npn \@@_build_put:nn #1#2 { \@@_build_put:nw {#2} #1 }
+\cs_new_protected:Npn \@@_build_put:nw #1#2 \@@_build_last:NNn #3#4#5
+  { #2 \@@_build_last:NNn #3 #4 { #1 #5 } }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}
+%   {
+%     \tl_build_put_left:Nn, \tl_build_put_left:Ne, \tl_build_put_left:Nx,
+%     \tl_build_gput_left:Nn, \tl_build_gput_left:Ne, \tl_build_gput_left:Nx
+%   }
+% \begin{macro}{\@@_build_put_left:NNn}
+%   See \cs{tl_build_put_right:Nn} for all the machinery.  We could
+%   easily provide \cs[no-index]{tl_build_put_left_right:Nnn}, by just
+%   adding the \meta{right} material after the \Arg{left} in the
+%   |e|-expanding assignment.
+%    \begin{macrocode}
+\cs_new_protected:Npn \tl_build_put_left:Nn #1
+  { \@@_build_put_left:NNn \cs_set_nopar:Npe #1 }
+\cs_generate_variant:Nn \tl_build_put_left:Nn { Ne , Nx }
+\cs_new_protected:Npn \tl_build_gput_left:Nn #1
+  { \@@_build_put_left:NNn \cs_gset_nopar:Npe #1 }
+\cs_generate_variant:Nn \tl_build_gput_left:Nn { Ne , Nx }
+\cs_new_protected:Npn \@@_build_put_left:NNn #1#2#3
+  {
+    #1 #2
+      {
+        \__kernel_exp_not:w \exp_after:wN
+          {
+            \exp:w \exp_after:wN \@@_build_put:nn
+              \exp_after:wN {#2} {#3}
+          }
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\tl_build_end:N, \tl_build_gend:N}
+% \begin{macro}{\@@_build_end_loop:NN}
+%   Get the data then clear the \meta{next~tl} recursively until finding
+%   an empty one.  It is perhaps wasteful to repeatedly use
+%   \cs{cs_to_str:N}.  The local/global scope is checked by
+%   \cs{tl_set:Ne} or \cs{tl_gset:Ne}.
+%    \begin{macrocode}
+\cs_new_protected:Npn \tl_build_end:N #1
+  {
+    \@@_build_get:NNN \__kernel_tl_set:Ne #1 #1
+    \exp_args:Nc \@@_build_end_loop:NN { \cs_to_str:N #1 ' } \tl_clear:N
+  }
+\cs_new_protected:Npn \tl_build_gend:N #1
+  {
+    \@@_build_get:NNN \__kernel_tl_gset:Ne #1 #1
+    \exp_args:Nc \@@_build_end_loop:NN { \cs_to_str:N #1 ' } \tl_gclear:N
+  }
+\cs_new_protected:Npn \@@_build_end_loop:NN #1#2
+  {
+    \if_meaning:w \c_empty_tl #1
+      \exp_after:wN \use_none:nnnnnn
+    \fi:
+    #2 #1
+    \exp_args:Nc \@@_build_end_loop:NN { \cs_to_str:N #1 ' } #2
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@@_build_get:NNN}
+% \begin{macro}{\@@_build_get:w, \@@_build_get_end:w}
+%   The idea is to expand the \meta{tl~var} then the \meta{next~tl} and
+%   so on, all within an |e|-expanding assignment, and wrap as
+%   appropriate in \cs{exp_not:n}.  The various \meta{left} parts are
+%   left in the assignment as we go, which enables us to expand the
+%   \meta{next~tl} at the right place.  The various \meta{right} parts
+%   are eventually picked up in one last \cs{exp_not:n}, with a brace
+%   trick to wrap all the \meta{right} parts together.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_build_get:NNN #1#2#3
+  { #1 #3 { \if_false: { \fi: \exp_after:wN \@@_build_get:w #2 } } }
+\cs_new:Npn \@@_build_get:w #1 \@@_build_last:NNn #2#3#4
+  {
+    \exp_not:n {#4}
+    \if_meaning:w \c_empty_tl #3
+      \exp_after:wN \@@_build_get_end:w
+    \fi:
+    \exp_after:wN \@@_build_get:w #3
+  }
+\cs_new:Npn \@@_build_get_end:w #1#2#3
+  { \__kernel_exp_not:w \exp_after:wN { \if_false: } \fi: }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%    \begin{macrocode}
+%</package>
+%    \end{macrocode}
+%
+% \end{implementation}
+%
+% \PrintIndex


Property changes on: trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %
@@ -566,8 +566,8 @@
 %   See also \cs{tl_reverse:N}.
 %   \begin{texnote}
 %     The result is returned within \tn{unexpanded}, which means that the token
-%     list does not expand further when appearing in an \texttt{x}-type
-%     or \texttt{e}-type argument expansion.
+%     list does not expand further when appearing in an \texttt{e}-type
+%     or \texttt{x}-type argument expansion.
 %   \end{texnote}
 % \end{function}
 %
@@ -603,8 +603,8 @@
 %   consider the slower function \cs{tl_reverse:n}.
 %   \begin{texnote}
 %     The result is returned within \tn{unexpanded}, which means that the token
-%     list does not expand further when appearing in an \texttt{x}-type
-%     or \texttt{e}-type argument expansion.
+%     list does not expand further when appearing in an \texttt{e}-type
+%     or \texttt{x}-type argument expansion.
 %   \end{texnote}
 % \end{function}
 %
@@ -623,8 +623,8 @@
 %   stream.
 %   \begin{texnote}
 %     The result is returned within \tn{unexpanded}, which means that the token
-%     list does not expand further when appearing in an \texttt{x}-type
-%     or \texttt{e}-type argument expansion.
+%     list does not expand further when appearing in an \texttt{e}-type
+%     or \texttt{x}-type argument expansion.
 %   \end{texnote}
 % \end{function}
 %
@@ -873,8 +873,8 @@
 %   \cs{tl_head:n} leaving nothing in the input stream.
 %   \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.
+%     list does not expand further when appearing in an \texttt{e}-type
+%     or \texttt{x}-type argument expansion.
 %   \end{texnote}
 % \end{function}
 %
@@ -918,8 +918,8 @@
 %   in \cs{tl_tail:n} leaving nothing in the input stream.
 %   \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.
+%     token list does not expand further when appearing in an \texttt{e}-type
+%     or \texttt{x}-type argument expansion.
 %   \end{texnote}
 % \end{function}
 %
@@ -959,8 +959,8 @@
 %   \begin{texnote}
 %     The result is returned within the \tn{unexpanded}
 %     primitive (\cs{exp_not:n}), which means that the \meta{item}
-%     does not expand further when appearing in an \texttt{x}-type
-%     or \texttt{e}-type argument expansion.
+%     does not expand further when appearing in an \texttt{e}-type
+%     or \texttt{x}-type argument expansion.
 %   \end{texnote}
 % \end{function}
 %
@@ -976,8 +976,8 @@
 %   \begin{texnote}
 %     The result is returned within the \tn{unexpanded}
 %     primitive (\cs{exp_not:n}), which means that the \meta{item}
-%     does not expand further when appearing in an \texttt{x}-type
-%     or \texttt{e}-type argument expansion.
+%     does not expand further when appearing in an \texttt{e}-type
+%     or \texttt{x}-type argument expansion.
 %   \end{texnote}
 % \end{function}
 %
@@ -1047,8 +1047,8 @@
 %   \begin{texnote}
 %     The result is returned within the \tn{unexpanded}
 %     primitive (\cs{exp_not:n}), which means that the \meta{item}
-%     does not expand further when appearing in an \texttt{x}-type
-%     or \texttt{e}-type argument expansion.
+%     does not expand further when appearing in an \texttt{e}-type
+%     or \texttt{x}-type argument expansion.
 %   \end{texnote}
 % \end{function}
 %
@@ -1079,7 +1079,7 @@
 %   \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.
+%     \texttt{e}-type or \texttt{x}-type argument expansion.
 %   \end{texnote}
 % \end{function}
 %
@@ -1255,7 +1255,7 @@
 %     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}
+%     Contrarily to the \tn{scantokens} \eTeX{} 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.
@@ -2153,7 +2153,7 @@
 %   All of its work is done between
 %   \cs{group_align_safe_begin:} and \cs{group_align_safe_end:} to avoid
 %   issues in alignments.  It does the actual replacement within
-%   |#3|~|#4|~|{...}|, an \texttt{x}-expanding \meta{assignment}~|#3| to
+%   |#3|~|#4|~|{...}|, an \texttt{e}-expanding \meta{assignment}~|#3| to
 %   the \meta{tl~var}~|#4|.  The auxiliary \cs{@@_replace_next:w} is
 %   called, followed by the \meta{token list}, some tokens including the
 %   \meta{delimiter}~|#1|, followed by the \meta{pattern}~|#5|.
@@ -2166,7 +2166,7 @@
 %   |##1| cannot contain the \meta{delimiter}~|#1| that we worked so
 %   hard to obtain, thus \cs{@@_replace_wrap:w} gets~|##1| as its own
 %   argument~|##1|, and protects it against
-%   the \texttt{x}-expanding assignment.  It also finds \cs{exp_not:n}
+%   the \texttt{e}-expanding assignment.  It also finds \cs{exp_not:n}
 %   as~|##2| and does nothing to it, thus letting through \cs{exp_not:n}
 %   \Arg{replacement} into the assignment.  Note that
 %   \cs{@@_replace_next:w} and \cs{@@_replace_wrap:w} are always called
@@ -2858,7 +2858,7 @@
 %   \cs{@@_trim_mark:} expands to nothing in a single expansion.  In the case
 %   at hand, we take \cs{__kernel_exp_not:w} \cs{exp_after:wN} as our
 %   continuation, so that space trimming behaves correctly within an
-%   \texttt{x}-type expansion.
+%   \texttt{e}-type or \texttt{x}-type expansion.
 %    \begin{macrocode}
 \cs_new:Npn \tl_trim_spaces:n #1
   {

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %
@@ -456,7 +456,7 @@
 %   as |macro|s.
 %   \begin{texnote}
 %     This is the \TeX{} primitive \tn{meaning}.
-%     The \meta{token} can thus be an explicit space tokens or an
+%     The \meta{token} can thus be an explicit space token or an
 %     explicit begin-group or end-group character token (|{|~or~|}| when
 %     normal \TeX{} category codes apply) even though these are not
 %     valid \texttt{N}-type arguments.
@@ -473,7 +473,7 @@
 %   category code $12$ (the escape character is part of the
 %   \meta{token}). This function requires only a single expansion.
 %   \begin{texnote}
-%     \cs{token_to_str:N} is the \TeX{} primitive \tn{string} renamed.
+%     \cs{token_to_str:N} is the \TeX{} primitive \tn{string}.
 %     The \meta{token} can thus be an explicit space tokens or an
 %     explicit begin-group or end-group character token (|{|~or~|}| when
 %     normal \TeX{} category codes apply) even though these are not
@@ -752,7 +752,7 @@
 %     \cs{token_if_primitive:NTF} \meta{token} \Arg{true code} \Arg{false code}
 %   \end{syntax}
 %   Tests if the \meta{token} is an engine primitive. In \LuaTeX{}
-%   this includes primitive-like commands defined using |{token.set_lua}|.
+%   this includes primitive-like commands defined using |token.set_lua|.
 % \end{function}
 %
 % \begin{function}[added = 2020-12-03, EXP, noTF]
@@ -968,7 +968,7 @@
 %   receives three arguments for each \meta{token} in the input stream:
 %   \begin{itemize}
 %   \item \meta{tokens}, which both \texttt{o}-expand and
-%     \texttt{x}-expand to the \meta{token}. The detailed form of
+%     \texttt{e}/\texttt{x}-expand to the \meta{token}. The detailed form of
 %     \meta{tokens} may change in later releases.
 %   \item \meta{char code}, a decimal representation of the character
 %     code of the \meta{token}, $-1$ if it is a control sequence.
@@ -2328,7 +2328,7 @@
 %
 %   Characters used as delimiters must have catcode~$12$
 %   and are obtained through \cs{tl_to_str:n}.  This requires doing all
-%   definitions within \texttt{x}-expansion.  The temporary function
+%   definitions within \texttt{e}-expansion.  The temporary function
 %   \cs{@@_tmp:w} used to define each conditional receives three
 %   arguments: the name of the conditional, the auxiliary's delimiter
 %   (also used to name the auxiliary), and the string to which one

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3benchmark/l3benchmark.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3benchmark/l3benchmark.sty	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3benchmark/l3benchmark.sty	2023-11-01 20:15:10 UTC (rev 68721)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3benchmark.dtx
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3benchmark}{2023-10-10}{}
+\ProvidesExplPackage{l3benchmark}{2023-11-01}{}
   {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	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3bitset/l3bitset.sty	2023-11-01 20:15:10 UTC (rev 68721)
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: l3bitset.dtx
-\ProvidesExplPackage{l3bitset}{2023-10-10}{}
+\ProvidesExplPackage{l3bitset}{2023-11-01}{}
   {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	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty	2023-11-01 20:15:10 UTC (rev 68721)
@@ -28,7 +28,7 @@
 %% 
 %% File: l3draw.dtx
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3draw}{2023-10-10}{}
+\ProvidesExplPackage{l3draw}{2023-11-01}{}
   {L3 Experimental core drawing support}
 \scan_new:N \s__draw_mark
 \scan_new:N \s__draw_stop
@@ -776,19 +776,11 @@
       \dim_set_eq:NN \l__draw_softpath_lastx_dim \g__draw_softpath_lastx_dim
       \dim_set_eq:NN \l__draw_softpath_lasty_dim \g__draw_softpath_lasty_dim
       \__draw_path_reset_limits:
-      \tl_build_get:NN \g__draw_softpath_main_tl \l__draw_softpath_main_tl
-      \bool_set_eq:NN
-        \l__draw_softpath_corners_bool
-        \g__draw_softpath_corners_bool
-      \__draw_softpath_clear:
+      \__draw_softpath_save:
   }
 \cs_new_protected:Npn \draw_path_scope_end:
   {
-      \__draw_softpath_clear:
-      \bool_gset_eq:NN
-        \g__draw_softpath_corners_bool
-        \l__draw_softpath_corners_bool
-      \__draw_softpath_add:o \l__draw_softpath_main_tl
+      \__draw_softpath_restore:
       \dim_gset_eq:NN \g__draw_softpath_lastx_dim \l__draw_softpath_lastx_dim
       \dim_gset_eq:NN \g__draw_softpath_lasty_dim \l__draw_softpath_lasty_dim
       \dim_gset_eq:NN \g__draw_path_xmax_dim \l__draw_path_xmax_dim
@@ -1418,7 +1410,7 @@
   }
 %% File: l3draw-softpath.dtx
 \tl_new:N \g__draw_softpath_main_tl
-\tl_new:N \l__draw_softpath_internal_tl
+\tl_new:N \l__draw_softpath_tmp_tl
 \bool_new:N \g__draw_softpath_corners_bool
 \cs_new_protected:Npn \__draw_softpath_add:n
   { \tl_build_gput_right:Nn \g__draw_softpath_main_tl }
@@ -1425,14 +1417,37 @@
 \cs_generate_variant:Nn \__draw_softpath_add:n { o, e }
 \cs_new_protected:Npn \__draw_softpath_use:
   {
-    \tl_build_get:NN \g__draw_softpath_main_tl \l__draw_softpath_internal_tl
-    \l__draw_softpath_internal_tl
+    \tl_build_gend:N \g__draw_softpath_main_tl
+    \tl_set_eq:NN \l__draw_softpath_tmp_tl \g__draw_softpath_main_tl
+    \l__draw_softpath_tmp_tl
+    \tl_build_gbegin:N \g__draw_softpath_main_tl
+    \exp_args:NNV \tl_build_gput_right:Nn
+      \g__draw_softpath_main_tl \l__draw_softpath_tmp_tl
   }
 \cs_new_protected:Npn \__draw_softpath_clear:
   {
-    \tl_build_gclear:N \g__draw_softpath_main_tl
+    \tl_build_gbegin:N \g__draw_softpath_main_tl
     \bool_gset_false:N \g__draw_softpath_corners_bool
   }
+\cs_new_protected:Npn \__draw_softpath_save:
+  {
+    \tl_build_gend:N \g__draw_softpath_main_tl
+    \tl_set_eq:NN
+      \l__draw_softpath_main_tl
+      \g__draw_softpath_main_tl
+    \bool_set_eq:NN
+      \l__draw_softpath_corners_bool
+      \g__draw_softpath_corners_bool
+    \__draw_softpath_clear:
+  }
+\cs_new_protected:Npn \__draw_softpath_restore:
+  {
+    \__draw_softpath_clear:
+    \__draw_softpath_add:o \l__draw_softpath_main_tl
+    \bool_gset_eq:NN
+      \g__draw_softpath_corners_bool
+      \l__draw_softpath_corners_bool
+  }
 \dim_new:N \g__draw_softpath_lastx_dim
 \dim_new:N \g__draw_softpath_lasty_dim
 \bool_new:N \g__draw_softpath_move_bool
@@ -1526,9 +1541,9 @@
           \fp_zero:N \l__draw_softpath_lasty_fp
           \tl_clear:N \l__draw_softpath_first_tl
           \tl_clear:N \l__draw_softpath_move_tl
-          \tl_build_get:NN \g__draw_softpath_main_tl \l__draw_softpath_internal_tl
+          \tl_build_gend:N \g__draw_softpath_main_tl
           \exp_after:wN \__draw_softpath_round_loop:Nnn
-            \l__draw_softpath_internal_tl
+            \g__draw_softpath_main_tl
             \q__draw_recursion_tail ? ?
             \q__draw_recursion_stop
         \group_end:
@@ -1734,7 +1749,7 @@
       \l__draw_softpath_move_tl
     \tl_put_right:No \l__draw_softpath_main_tl
       \l__draw_softpath_part_tl
-    \tl_build_gclear:N \g__draw_softpath_main_tl
+    \tl_build_gbegin:N \g__draw_softpath_main_tl
     \__draw_softpath_add:o \l__draw_softpath_main_tl
   }
 %% File: l3draw-state.dtx

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3graphics/l3graphics.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3graphics/l3graphics.sty	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3graphics/l3graphics.sty	2023-11-01 20:15:10 UTC (rev 68721)
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: l3graphics.dtx
-\ProvidesExplPackage{l3graphics}{2023-10-10}{}
+\ProvidesExplPackage{l3graphics}{2023-11-01}{}
   {L3 Experimental graphics inclusion support}
 \dim_new:N \l__graphics_internal_dim
 \ior_new:N \l__graphics_internal_ior

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3opacity/l3opacity.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3opacity/l3opacity.sty	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3opacity/l3opacity.sty	2023-11-01 20:15:10 UTC (rev 68721)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3opacity.dtx
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3opacity}{2023-10-10}{}
+\ProvidesExplPackage{l3opacity}{2023-11-01}{}
   {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	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty	2023-11-01 20:15:10 UTC (rev 68721)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3str-format.dtx
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3str-format}{2023-10-10}{}
+\ProvidesExplPackage{l3str-format}{2023-11-01}{}
   {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	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3sys-shell/l3sys-shell.sty	2023-11-01 20:15:10 UTC (rev 68721)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3sys-shell.dtx
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3sys-shell}{2023-10-10}{}
+\ProvidesExplPackage{l3sys-shell}{2023-11-01}{}
   {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	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty	2023-11-01 20:15:10 UTC (rev 68721)
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: xcoffins.dtx
-\ProvidesExplPackage{xcoffins}{2023-10-10}{}
+\ProvidesExplPackage{xcoffins}{2023-11-01}{}
   {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	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty	2023-11-01 20:15:10 UTC (rev 68721)
@@ -32,7 +32,7 @@
       }%
     \endinput
   }
-\ProvidesExplPackage{l3galley}{2023-10-10}{}
+\ProvidesExplPackage{l3galley}{2023-11-01}{}
   {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	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty	2023-11-01 20:15:10 UTC (rev 68721)
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: xgalley.dtx
-\ProvidesExplPackage{xgalley}{2023-10-10}{}
+\ProvidesExplPackage{xgalley}{2023-11-01}{}
   {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	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex	2023-11-01 20:15:10 UTC (rev 68721)
@@ -11,6 +11,7 @@
 %% l3expan.dtx  (with options: `package')
 %% l3quark.dtx  (with options: `package')
 %% l3tl.dtx  (with options: `package')
+%% l3tl-build.dtx  (with options: `package')
 %% l3str.dtx  (with options: `package')
 %% l3seq.dtx  (with options: `package')
 %% l3int.dtx  (with options: `package')
@@ -74,7 +75,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx
-\def\ExplFileDate{2023-10-23}%
+\def\ExplFileDate{2023-11-01}%
 \begingroup
   \def\next{\endgroup}%
   \expandafter\ifx\csname PackageError\endcsname\relax
@@ -4559,6 +4560,101 @@
 \tl_new:N \l_tmpa_tl
 \tl_new:N \l_tmpb_tl
 \cs_undefine:N \__tl_tmp:w
+%% File: l3tl-build.dtx
+\cs_new_protected:Npn \tl_build_begin:N #1
+  { \__tl_build_begin:NN \cs_set_nopar:Npe #1 }
+\cs_new_protected:Npn \tl_build_gbegin:N #1
+  { \__tl_build_begin:NN \cs_gset_nopar:Npe #1 }
+\cs_new_protected:Npn \__tl_build_begin:NN #1#2
+  { \exp_args:Nc \__tl_build_begin:NNN { \cs_to_str:N #2 ' } #2 #1 }
+\cs_new_protected:Npn \__tl_build_begin:NNN #1#2#3
+  {
+    #3 #1 { }
+    #3 #2
+      {
+        \exp_not:n { \exp_end: \exp_end: \exp_end: \exp_end: }
+        \exp_not:n { \__tl_build_last:NNn #3 #1 { } }
+      }
+  }
+\cs_new_protected:Npn \tl_build_put_right:Nn #1#2
+  {
+    \cs_set_nopar:Npe #1
+      { \__kernel_exp_not:w \exp_after:wN { \exp:w #1 #2 } }
+  }
+\cs_generate_variant:Nn \tl_build_put_right:Nn { Ne , Nx }
+\cs_new_protected:Npn \tl_build_gput_right:Nn #1#2
+  {
+    \cs_gset_nopar:Npe #1
+      { \__kernel_exp_not:w \exp_after:wN { \exp:w #1 #2 } }
+  }
+\cs_generate_variant:Nn \tl_build_gput_right:Nn { Ne , Nx }
+\cs_new_protected:Npn \__tl_build_last:NNn #1#2
+  {
+    \if_false: { { \fi:
+          \exp_end: \exp_end: \exp_end: \exp_end: \exp_end:
+          \__tl_build_last:NNn #1 #2 { }
+        }
+      }
+    \if_meaning:w \c_empty_tl #2
+      \__tl_build_begin:NN #1 #2
+    \fi:
+    #1 #2
+      {
+        \__kernel_exp_not:w \exp_after:wN
+          {
+            \exp:w \if_false: } } \fi:
+            \exp_after:wN \__tl_build_put:nn \exp_after:wN {#2}
+  }
+\cs_new_protected:Npn \__tl_build_put:nn #1#2 { \__tl_build_put:nw {#2} #1 }
+\cs_new_protected:Npn \__tl_build_put:nw #1#2 \__tl_build_last:NNn #3#4#5
+  { #2 \__tl_build_last:NNn #3 #4 { #1 #5 } }
+\cs_new_protected:Npn \tl_build_put_left:Nn #1
+  { \__tl_build_put_left:NNn \cs_set_nopar:Npe #1 }
+\cs_generate_variant:Nn \tl_build_put_left:Nn { Ne , Nx }
+\cs_new_protected:Npn \tl_build_gput_left:Nn #1
+  { \__tl_build_put_left:NNn \cs_gset_nopar:Npe #1 }
+\cs_generate_variant:Nn \tl_build_gput_left:Nn { Ne , Nx }
+\cs_new_protected:Npn \__tl_build_put_left:NNn #1#2#3
+  {
+    #1 #2
+      {
+        \__kernel_exp_not:w \exp_after:wN
+          {
+            \exp:w \exp_after:wN \__tl_build_put:nn
+              \exp_after:wN {#2} {#3}
+          }
+      }
+  }
+\cs_new_protected:Npn \tl_build_end:N #1
+  {
+    \__tl_build_get:NNN \__kernel_tl_set:Ne #1 #1
+    \exp_args:Nc \__tl_build_end_loop:NN { \cs_to_str:N #1 ' } \tl_clear:N
+  }
+\cs_new_protected:Npn \tl_build_gend:N #1
+  {
+    \__tl_build_get:NNN \__kernel_tl_gset:Ne #1 #1
+    \exp_args:Nc \__tl_build_end_loop:NN { \cs_to_str:N #1 ' } \tl_gclear:N
+  }
+\cs_new_protected:Npn \__tl_build_end_loop:NN #1#2
+  {
+    \if_meaning:w \c_empty_tl #1
+      \exp_after:wN \use_none:nnnnnn
+    \fi:
+    #2 #1
+    \exp_args:Nc \__tl_build_end_loop:NN { \cs_to_str:N #1 ' } #2
+  }
+\cs_new_protected:Npn \__tl_build_get:NNN #1#2#3
+  { #1 #3 { \if_false: { \fi: \exp_after:wN \__tl_build_get:w #2 } } }
+\cs_new:Npn \__tl_build_get:w #1 \__tl_build_last:NNn #2#3#4
+  {
+    \exp_not:n {#4}
+    \if_meaning:w \c_empty_tl #3
+      \exp_after:wN \__tl_build_get_end:w
+    \fi:
+    \exp_after:wN \__tl_build_get:w #3
+  }
+\cs_new:Npn \__tl_build_get_end:w #1#2#3
+  { \__kernel_exp_not:w \exp_after:wN { \if_false: } \fi: }
 %% File: l3str.dtx
 \scan_new:N \s__str_mark
 \scan_new:N \s__str_stop
@@ -4752,7 +4848,7 @@
   { \__str_case:nw {#1} #2 {#1} { } \s__str_mark {#3} \s__str_mark {#4} \s__str_stop }
 \cs_generate_variant:Nn \str_case:nn   { V , o , e , nV , nv }
 \prg_generate_conditional_variant:Nnn \str_case:nn
-  { V , o , nV , nv } { T , F , TF }
+  { V , o , e , nV , nv } { T , F , TF }
 \cs_new_eq:NN \str_case:Nn   \str_case:Vn
 \cs_new_eq:NN \str_case:NnT  \str_case:VnT
 \cs_new_eq:NN \str_case:NnF  \str_case:VnF
@@ -5955,11 +6051,11 @@
     \__seq_map_pairwise_function:Nnnwnn #1 #4 \s__seq_stop
   }
 \cs_generate_variant:Nn \seq_map_pairwise_function:NNN { Nc , c , cc }
-\cs_new_protected:Npn \seq_set_map_x:NNn
-  { \__seq_set_map_x:NNNn \__kernel_tl_set:Ne }
-\cs_new_protected:Npn \seq_gset_map_x:NNn
-  { \__seq_set_map_x:NNNn \__kernel_tl_gset:Ne }
-\cs_new_protected:Npn \__seq_set_map_x:NNNn #1#2#3#4
+\cs_new_protected:Npn \seq_set_map_e:NNn
+  { \__seq_set_map_e:NNNn \__kernel_tl_set:Ne }
+\cs_new_protected:Npn \seq_gset_map_e:NNn
+  { \__seq_set_map_e:NNNn \__kernel_tl_gset:Ne }
+\cs_new_protected:Npn \__seq_set_map_e:NNNn #1#2#3#4
   {
     \__seq_push_item_def:n { \exp_not:N \__seq_item:n {#4} }
     #1 #2 { #3 }
@@ -16819,22 +16915,74 @@
 \cs_new_protected:Npn \__fp_show:NN #1#2
   {
     \__kernel_chk_tl_type:NnnT #2 { fp }
+      { \exp_args:No \__fp_show_validate:n #2 }
+      { \exp_args:Ne #1 { \token_to_str:N #2 = \fp_to_tl:N #2 } }
+  }
+\cs_new:Npn \__fp_show_validate:n #1
+  {
+    \__fp_show_validate:nn { #1 }
       {
-        \str_if_eq:eeTF { \tl_head:N #2 } { \s__fp_tuple } { \exp_not:o #2 }
+        \s__fp \__fp_chk:w ??? ;~ or \iow_newline:
+        \s__fp_tuple \__fp_tuple_chk:w ? ;~ or \iow_newline:
+        \s__fp_symbolic \__fp_symbolic_chk:w ? , ? ;
+      }
+  }
+\cs_new:Npn \__fp_show_validate_aux:n #1
+  {
+    \__fp_show_validate:nn { #1 } { }
+  }
+\cs_new:Npn \__fp_show_validate:nn #1#2
+  {
+    \tl_if_empty:nF { #1 }
+      {
+        \str_case:enF { \tl_head:n { #1 } }
           {
-            \exp_after:wN \__fp_show_validate:w #2
-            \s__fp \__fp_chk:w ??? ; \s__fp_stop
+            { \s__fp }
+              {
+                \__fp_show_validate:w #1 \s__fp
+                \__fp_chk:w ??? ; \s__fp_stop
+              }
+            { \s__fp_tuple }
+              {
+                \__fp_tuple_show_validate:w #1
+                \s__fp_tuple \__fp_tuple_chk:w ?? ; \s__fp_stop
+              }
+            { \s__fp_symbolic }
+              {
+                \__fp_symbolic_show_validate:w #1
+                \s__fp_symbolic \__fp_symbolic_chk:w ? , ?? ; \s__fp_stop
+              }
           }
+          { #2 }
       }
-      { \exp_args:Ne #1 { \token_to_str:N #2 = \fp_to_tl:N #2 } }
   }
 \cs_new:Npn \__fp_show_validate:w
     #1 \s__fp \__fp_chk:w #2#3#4#5 ; #6 \s__fp_stop
   {
-    \token_if_eq_meaning:NNTF #2 1
-      { \s__fp \__fp_chk:w #2 #3 {#4} #5 ; }
-      { \s__fp \__fp_chk:w #2 #3 #4 #5 ; }
+    \str_if_eq:nnF { #2 } {?}
+      {
+        \token_if_eq_meaning:NNTF #2 1
+          { \s__fp \__fp_chk:w #2 #3 { #4 } #5 ; }
+          { \s__fp \__fp_chk:w #2 #3 #4 #5 ; }
+        \__fp_show_validate_aux:n { #6 }
+      }
   }
+\cs_new:Npn \__fp_tuple_show_validate:w
+    #1 \s__fp_tuple \__fp_tuple_chk:w #2#3 ; #4 \s__fp_stop
+  {
+    \str_if_eq:nnF { #2 } {?}
+      { \s__fp_tuple \__fp_tuple_chk:w { \__fp_show_validate_aux:n { #2 } } ; }
+  }
+\cs_new:Npn \__fp_symbolic_show_validate:w
+    #1 \s__fp_symbolic \__fp_symbolic_chk:w #2 , #3#4 ; #5 \s__fp_stop
+  {
+    \str_if_eq:nnF { #2 } {?}
+      {
+        \s__fp_symbolic \__fp_symbolic_chk:w \exp_not:n { #2 } ,
+        { \__fp_show_validate_aux:n { #3 } };
+        \__fp_show_validate_aux:n { #5 }
+      }
+  }
 \cs_new_protected:Npn \fp_show:n
   { \__kernel_msg_show_eval:Nn \fp_to_tl:n }
 \cs_new_protected:Npn \fp_log:n
@@ -20838,9 +20986,9 @@
       \s__fp_symbolic \__fp_symbolic_chk:w
       \__fp_types_binary:Nww #1 , { #2; #3; } ;
   }
-\cs_set:Npn \__fp_tmp:w #1#2
+\cs_set_protected:Npn \__fp_tmp:w #1#2
   {
-    \cs_new_nopar:cpn
+    \cs_new:cpn
       { __fp_symbolic_#2_symbolic_o:ww }
       { \__fp_symbolic_binary_o:Nww #1 }
     \cs_new_eq:cc
@@ -20864,7 +21012,7 @@
     {not} {sec} {set_sign} {sin} {sqrt} {tan}
   }
   {
-    \cs_new_nopar:cpe { __fp_symbolic_#1_o:w }
+    \cs_new:cpe { __fp_symbolic_#1_o:w }
       {
         \exp_not:N \__fp_symbolic_unary_o:NNw
         \exp_not:c { __fp_#1_o:w }
@@ -20872,7 +21020,7 @@
   }
 \cs_set_protected:Npn \__fp_tmp:w #1#2#3
   {
-    \cs_new_nopar:cpn { __fp_symbolic_to_#1:w }
+    \cs_new:cpn { __fp_symbolic_to_#1:w }
       {
         \exp_after:wN \__fp_symbolic_convert:wnnN
         \exp:w \exp_end_continue_f:w
@@ -20949,10 +21097,10 @@
     \tl_if_empty:nTF {#1}
       { \prg_return_true: }
       {
-        \tl_if_in:onTF { \tl_to_str:n {#1} } { ~ }
+        \tl_if_in:nnTF { #1 } { ~ }
           { \prg_return_true: }
           {
-            \exp_after:wN \__fp_id_if_invalid_aux:N \tl_to_str:n {#1}
+            \__fp_id_if_invalid_aux:N #1
               { ? \prg_break:n \prg_return_false: }
             \prg_break_point:
           }
@@ -20995,9 +21143,9 @@
           }
       }
   }
-\cs_new:Npn \__fp_variable_set_parsing:Nn #1#2
+\cs_new_protected:Npn \__fp_variable_set_parsing:Nn #1#2
   {
-    \cs_set_nopar:Npn \__fp_tmp:w
+    \cs_set:Npn \__fp_tmp:w
       {
         \__fp_exp_after_symbolic_f:nw { \__fp_parse_infix:NN }
         \s__fp_symbolic \__fp_symbolic_chk:w
@@ -21006,7 +21154,7 @@
     \exp_args:NNc \__fp_variable_set_parsing_aux:NNn #1
       { __fp_parse_word_#2:N } {#2}
   }
-\cs_new:Npn \__fp_variable_set_parsing_aux:NNn #1#2#3
+\cs_new_protected:Npn \__fp_variable_set_parsing_aux:NNn #1#2#3
   {
     \cs_if_eq:NNF #2 \__fp_tmp:w
       {
@@ -21024,53 +21172,61 @@
   }
 \cs_new_protected:Npn \fp_clear_variable:n #1
   {
+    \exp_args:No \__fp_clear_variable:n { \tl_to_str:n {#1} }
+  }
+\cs_new_protected:Npn \__fp_clear_variable:n #1
+  {
     \__fp_id_if_invalid:nTF {#1}
       { \msg_error:nnn { fp } { id-invalid } {#1} }
-      { \exp_args:No \__fp_clear_variable:n { \tl_to_str:n {#1} } }
+      { \__fp_clear_variable_aux:n {#1} }
   }
-\cs_new_protected:Npn \__fp_clear_variable:n #1
+\cs_new_protected:Npn \__fp_clear_variable_aux:n #1
   {
-    \cs_undefine:c { l__fp_variable_#1_fp }
+    \cs_set_eq:cN { l__fp_variable_#1_fp } \tex_undefined:D
     \__fp_variable_set_parsing:Nn \cs_set_eq:NN {#1}
   }
 \cs_new_protected:Npn \fp_new_variable:n #1
   {
-    \__fp_id_if_invalid:nTF {#1}
-      { \msg_error:nnn { fp } { id-invalid } {#1} }
-      { \exp_args:No \__fp_new_variable:n { \tl_to_str:n {#1} } }
+    \exp_args:No \__fp_new_variable:n { \tl_to_str:n {#1} }
   }
 \cs_new_protected:Npn \__fp_new_variable:n #1
   {
-    \cs_if_exist:cT { __fp_parse_word_#1:N }
+    \__fp_id_if_invalid:nTF {#1}
+      { \msg_error:nnn { fp } { id-invalid } {#1} }
       {
-        \msg_error:nnn
-          { fp } { id-already-defined } {#1}
-        \cs_undefine:c { __fp_parse_word_#1:N }
-        \cs_undefine:c { l__fp_variable_#1_fp }
+        \cs_if_exist:cT { __fp_parse_word_#1:N }
+        {
+          \msg_error:nnn
+            { fp } { id-already-defined } {#1}
+          \cs_undefine:c { __fp_parse_word_#1:N }
+          \cs_set_eq:cN { l__fp_variable_#1_fp } \tex_undefined:D
+        }
+      \__fp_variable_set_parsing:Nn \cs_gset_eq:NN {#1}
       }
-    \__fp_variable_set_parsing:Nn \cs_gset_eq:NN {#1}
   }
 \flag_new:n { __fp_symbolic }
 \cs_new_protected:Npn \fp_set_variable:nn #1
   {
-    \__fp_id_if_invalid:nTF {#1}
-      { \msg_error:nnn { fp } { id-invalid } {#1} }
-      { \exp_args:No \__fp_set_variable:nn { \tl_to_str:n {#1} } }
+    \exp_args:No \__fp_set_variable:nn { \tl_to_str:n {#1} }
   }
 \cs_new_protected:Npn \__fp_set_variable:nn #1#2
   {
-    \__fp_variable_set_parsing:Nn \cs_set_eq:NN {#1}
-    \fp_set:Nn \l__fp_symbolic_fp {#2}
-    \cs_set_nopar:cpn { l__fp_variable_#1_fp }
-      { \flag_ensure_raised:n { __fp_symbolic } \c_nan_fp }
-    \flag_clear:n { __fp_symbolic }
-    \fp_set:cn { l__fp_variable_#1_fp } { \l__fp_symbolic_fp }
-    \flag_if_raised:nT { __fp_symbolic }
+    \__fp_id_if_invalid:nTF {#1}
+      { \msg_error:nnn { fp } { id-invalid } {#1} }
       {
-        \msg_error:nneee { fp } { id-loop }
-          { \tl_to_str:n {#1} }
-          { \tl_to_str:n {#2} }
-          { \fp_to_tl:N \l__fp_symbolic_fp }
+        \__fp_variable_set_parsing:Nn \cs_set_eq:NN {#1}
+        \fp_set:Nn \l__fp_symbolic_fp {#2}
+        \cs_set_nopar:cpn { l__fp_variable_#1_fp }
+          { \flag_ensure_raised:n { __fp_symbolic } \c_nan_fp }
+        \flag_clear:n { __fp_symbolic }
+        \fp_set:cn { l__fp_variable_#1_fp } { \l__fp_symbolic_fp }
+        \flag_if_raised:nT { __fp_symbolic }
+          {
+            \msg_error:nneee { fp } { id-loop }
+              { #1 }
+              { \tl_to_str:n {#2} }
+              { \fp_to_tl:N \l__fp_symbolic_fp }
+          }
       }
   }
 \msg_new:nnnn { fp } { id-invalid }
@@ -21104,7 +21260,7 @@
 \cs_new_protected:Npn \__fp_new_function:n #1
   {
     \__fp_id_if_invalid:nTF {#1}
-      { \msg_error:nnn { fp } { invalid-identifier } {#1} }
+      { \msg_error:nnn { fp } { id-invalid } {#1} }
       {
         \cs_if_exist:cT { __fp_parse_word_#1:N }
           {
@@ -21116,12 +21272,12 @@
         \__fp_function_set_parsing:Nn \cs_gset_eq:NN {#1}
       }
   }
-\cs_new:Npn \__fp_function_set_parsing:Nn #1#2
+\cs_new_protected:Npn \__fp_function_set_parsing:Nn #1#2
   {
     \exp_args:NNc \__fp_function_set_parsing_aux:NNn #1
       { __fp_parse_word_#2:N } {#2}
   }
-\cs_new:Npn \__fp_function_set_parsing_aux:NNn #1#2#3
+\cs_new_protected:Npn \__fp_function_set_parsing_aux:NNn #1#2#3
   {
     \cs_set:Npe \__fp_tmp:w
       {
@@ -21170,7 +21326,7 @@
 \cs_new_protected:Npn \__fp_set_function:Nnnn #1#2#3#4
   {
     \__fp_id_if_invalid:nTF {#2}
-      { \msg_error:nnn { fp } { invalid-identifier } {#2} }
+      { \msg_error:nnn { fp } { id-invalid } {#2} }
       {
         \cs_if_exist:cF { __fp_parse_word_#2:N }
           { \__fp_function_set_parsing:Nn \cs_set_eq:NN {#2} }
@@ -21179,8 +21335,10 @@
           \exp_args:No \clist_map_inline:nn { \tl_to_str:n {#3} }
             {
               \int_incr:N \l__fp_function_arg_int
-              \exp_args:Ne \__fp_clear_variable:n
-                { _ \tex_romannumeral:D \l__fp_function_arg_int }
+              \exp_args:Ne \__fp_clear_variable_aux:n
+                {
+                  \c_underscore_str \tex_romannumeral:D \l__fp_function_arg_int
+                }
               \fp_clear_variable:n {##1}
               \cs_set_nopar:cpe { l__fp_variable_##1_fp }
                 {
@@ -21246,8 +21404,12 @@
   { \exp_args:No \__fp_clear_function:n { \tl_to_str:n {#1} } }
 \cs_new_protected:Npn \__fp_clear_function:n #1
   {
-    \cs_undefine:c { __fp_parse_word_ #1 :N }
-    \__fp_function_set_parsing:Nn \cs_set_eq:NN {#1}
+    \__fp_id_if_invalid:nTF {#1}
+      { \msg_error:nnn { fp } { id-invalid } {#1} }
+      {
+        \cs_set_eq:cN { __fp_#1_o:w } \tex_undefine:D
+        \__fp_function_set_parsing:Nn \cs_set_eq:NN {#1}
+      }
   }
 %% File: l3fparray.dtx
 \int_new:N \g__fp_array_int
@@ -26166,7 +26328,7 @@
 \cs_new_protected:Npn \__regex_show_item_exact_cs:n #1
   {
     \seq_set_split:Nnn \l__regex_internal_seq { \scan_stop: } {#1}
-    \seq_set_map_x:NNn \l__regex_internal_seq
+    \seq_set_map_e:NNn \l__regex_internal_seq
       \l__regex_internal_seq { \iow_char:N\\##1 }
     \__regex_show_one:n
       { control~sequence~ \seq_use:Nn \l__regex_internal_seq { ~or~ } }
@@ -26685,7 +26847,7 @@
   }
 \cs_new_protected:Npn \__regex_match_once_init_aux:
   {
-    \tl_build_clear:N \l__regex_matched_analysis_tl
+    \tl_build_begin:N \l__regex_matched_analysis_tl
     \tl_clear:N \l__regex_curr_analysis_tl
   }
 \cs_new_protected:Npn \__regex_single_match:
@@ -26857,7 +27019,7 @@
           \l__regex_fresh_thread_bool
         \int_set_eq:NN \l__regex_success_pos_int \l__regex_curr_pos_int
         \int_set_eq:NN \l__regex_last_char_success_int \l__regex_last_char_int
-        \tl_build_clear:N \l__regex_matched_analysis_tl
+        \tl_build_begin:N \l__regex_matched_analysis_tl
         \tl_set_eq:NN \l__regex_success_submatches_tl
           \l__regex_curr_submatches_tl
         \prg_break:
@@ -27860,7 +28022,7 @@
       \__regex_single_match:
       #1
       \__regex_match_init:
-      \tl_build_clear:N \l__regex_input_tl
+      \tl_build_begin:N \l__regex_input_tl
       \__regex_match_once_init:
       \peek_analysis_map_inline:n
         {
@@ -32290,13 +32452,12 @@
 \cs_new:Npn \lua_escape:e #1 { \__lua_escape:n {#1} }
 \cs_new:Npn \lua_escape:n #1 { \lua_escape:e { \exp_not:n {#1} } }
 \str_new:N \l__lua_err_msg_str
-\cs_generate_variant:Nn \msg_error:nnnn { nnnV }
 \cs_new_protected:Npn \lua_load_module:n #1
   {
     \bool_if:nF { \__lua_load_module_p:n { #1 } }
       {
         \msg_error:nnnV
-          { luatex } { module-not-found } { #1 } { \l__lua_err_msg_str }
+          { luatex } { module-not-found } { #1 } \l__lua_err_msg_str
       }
   }
 \sys_if_engine_luatex:F
@@ -34061,33 +34222,32 @@
   {
     \bool_if:NTF \l_text_titlecase_check_letter_bool
       {
-        \tl_if_single:nTF {#4}
+        \exp_args:Ne \__text_change_case_codepoint_title_auxi:nnnn
           {
-            \bool_lazy_or:nnTF
-              { \token_if_letter_p:N #4 }
-              {
-                \bool_lazy_and_p:nn
-                  { \token_if_active_p:N #4 }
-                  { ! \int_compare_p:nNn {`#4} < { "80 } }
-              }
-              { \__text_change_case_codepoint_title:nnn }
-              { \__text_change_case_codepoint_title:nnnnn { title } {#1} }
+            \codepoint_to_category:n
+              { \__text_codepoint_from_chars:Nw #4 }
           }
-          { \__text_change_case_codepoint_title:nnn }
       }
       { \__text_change_case_codepoint_title:nnn }
         {#2} {#3} {#4}
   }
+\cs_new:Npn \__text_change_case_codepoint_title_auxi:nnnn #1#2#3#4
+  {
+    \tl_if_head_eq_charcode:nNTF {#1} { L }
+      { \__text_change_case_codepoint_title:nnn }
+      { \__text_change_case_codepoint_title_auxii:nnnn { title } }
+        {#2} {#3} {#4}
+  }
 \cs_new:Npn \__text_change_case_codepoint_title:nnn #1#2#3
-  { \__text_change_case_codepoint_title:nnnnn { title } { end } {#1} {#2} {#3} }
-\cs_new:Npn \__text_change_case_codepoint_title:nnnnn #1#2#3#4#5
+  { \__text_change_case_codepoint_title_auxii:nnnn { end } {#1} {#2} {#3} }
+\cs_new:Npn \__text_change_case_codepoint_title_auxii:nnnn #1#2#3#4
   {
-    \cs_if_exist_use:cF { __text_change_case_title_ #4 :nnnnn }
+    \cs_if_exist_use:cF { __text_change_case_title_ #3 :nnnnn }
       {
-        \cs_if_exist_use:cF { __text_change_case_upper_ #4 :nnnnn }
+        \cs_if_exist_use:cF { __text_change_case_upper_ #3 :nnnnn }
           { \__text_change_case_codepoint:nnnnn }
       }
-        {#1} {#2} {#3} {#4} {#5}
+        { title } {#1} {#2} {#3} {#4}
   }
 \cs_new:Npn \__text_change_case_codepoint:nnnnn #1#2#3#4#5
   {
@@ -36200,104 +36360,8 @@
     #1 #2 { #3 }
     \__seq_pop_item_def:
   }
-\cs_new_protected:Npn \tl_build_begin:N #1
-  { \__tl_build_begin:NN \cs_set_nopar:Npe #1 }
-\cs_new_protected:Npn \tl_build_gbegin:N #1
-  { \__tl_build_begin:NN \cs_gset_nopar:Npe #1 }
-\cs_new_protected:Npn \__tl_build_begin:NN #1#2
-  { \exp_args:Nc \__tl_build_begin:NNN { \cs_to_str:N #2 ' } #2 #1 }
-\cs_new_protected:Npn \__tl_build_begin:NNN #1#2#3
-  {
-    #3 #1 { }
-    #3 #2
-      {
-        \exp_not:n { \exp_end: \exp_end: \exp_end: \exp_end: }
-        \exp_not:n { \__tl_build_last:NNn #3 #1 { } }
-      }
-  }
-\cs_new_eq:NN \tl_build_clear:N \tl_build_begin:N
-\cs_new_eq:NN \tl_build_gclear:N \tl_build_gbegin:N
-\cs_new_protected:Npn \tl_build_put_right:Nn #1#2
-  {
-    \cs_set_nopar:Npe #1
-      { \exp_after:wN \exp_not:n \exp_after:wN { \exp:w #1 #2 } }
-  }
-\cs_generate_variant:Nn \tl_build_put_right:Nn { Ne , Nx }
-\cs_new_protected:Npn \tl_build_gput_right:Nn #1#2
-  {
-    \cs_gset_nopar:Npe #1
-      { \exp_after:wN \exp_not:n \exp_after:wN { \exp:w #1 #2 } }
-  }
-\cs_generate_variant:Nn \tl_build_gput_right:Nn { Ne , Nx }
-\cs_new_protected:Npn \__tl_build_last:NNn #1#2
-  {
-    \if_false: { { \fi:
-          \exp_end: \exp_end: \exp_end: \exp_end: \exp_end:
-          \__tl_build_last:NNn #1 #2 { }
-        }
-      }
-    \if_meaning:w \c_empty_tl #2
-      \__tl_build_begin:NN #1 #2
-    \fi:
-    #1 #2
-      {
-        \exp_after:wN \exp_not:n \exp_after:wN
-          {
-            \exp:w \if_false: } } \fi:
-            \exp_after:wN \__tl_build_put:nn \exp_after:wN {#2}
-  }
-\cs_new_protected:Npn \__tl_build_put:nn #1#2 { \__tl_build_put:nw {#2} #1 }
-\cs_new_protected:Npn \__tl_build_put:nw #1#2 \__tl_build_last:NNn #3#4#5
-  { #2 \__tl_build_last:NNn #3 #4 { #1 #5 } }
-\cs_new_protected:Npn \tl_build_put_left:Nn #1
-  { \__tl_build_put_left:NNn \cs_set_nopar:Npe #1 }
-\cs_generate_variant:Nn \tl_build_put_left:Nn { Ne , Nx }
-\cs_new_protected:Npn \tl_build_gput_left:Nn #1
-  { \__tl_build_put_left:NNn \cs_gset_nopar:Npe #1 }
-\cs_generate_variant:Nn \tl_build_gput_left:Nn { Ne , Nx }
-\cs_new_protected:Npn \__tl_build_put_left:NNn #1#2#3
-  {
-    #1 #2
-      {
-        \exp_after:wN \exp_not:n \exp_after:wN
-          {
-            \exp:w \exp_after:wN \__tl_build_put:nn
-              \exp_after:wN {#2} {#3}
-          }
-      }
-  }
 \cs_new_protected:Npn \tl_build_get:NN
   { \__tl_build_get:NNN \__kernel_tl_set:Ne }
-\cs_new_protected:Npn \__tl_build_get:NNN #1#2#3
-  { #1 #3 { \if_false: { \fi: \exp_after:wN \__tl_build_get:w #2 } } }
-\cs_new:Npn \__tl_build_get:w #1 \__tl_build_last:NNn #2#3#4
-  {
-    \exp_not:n {#4}
-    \if_meaning:w \c_empty_tl #3
-      \exp_after:wN \__tl_build_get_end:w
-    \fi:
-    \exp_after:wN \__tl_build_get:w #3
-  }
-\cs_new:Npn \__tl_build_get_end:w #1#2#3
-  { \exp_after:wN \exp_not:n \exp_after:wN { \if_false: } \fi: }
-\cs_new_protected:Npn \tl_build_end:N #1
-  {
-    \__tl_build_get:NNN \__kernel_tl_set:Ne #1 #1
-    \exp_args:Nc \__tl_build_end_loop:NN { \cs_to_str:N #1 ' } \tl_clear:N
-  }
-\cs_new_protected:Npn \tl_build_gend:N #1
-  {
-    \__tl_build_get:NNN \__kernel_tl_gset:Ne #1 #1
-    \exp_args:Nc \__tl_build_end_loop:NN { \cs_to_str:N #1 ' } \tl_gclear:N
-  }
-\cs_new_protected:Npn \__tl_build_end_loop:NN #1#2
-  {
-    \if_meaning:w \c_empty_tl #1
-      \exp_after:wN \use_none:nnnnnn
-    \fi:
-    #2 #1
-    \exp_args:Nc \__tl_build_end_loop:NN { \cs_to_str:N #1 ' } #2
-  }
 %% File: l3legacy.dtx
 \prg_new_conditional:Npnn \legacy_if:n #1 { p , T , F , TF }
   {
@@ -36632,6 +36696,10 @@
 \cs_gset:Npn \seq_indexed_map_function:NN { \seq_map_indexed_function:NN }
 \__kernel_patch_deprecation:nnNNpn { 2023-05-10 } { \seq_mapthread_function:NNN }
 \cs_gset:Npn \seq_mapthread_function:NNN { \seq_map_pairwise_function:NNN }
+\__kernel_patch_deprecation:nnNNpn { 2023-10-26 } { \seq_set_map_e:NNn }
+\cs_gset_protected:Npn \seq_set_map_x:NNn { \seq_set_map_e:NNn }
+\__kernel_patch_deprecation:nnNNpn { 2023-10-26 } { \seq_gset_map_e:NNn }
+\cs_gset_protected:Npn \seq_gset_map_x:NNn { \seq_gset_map_e:NNn }
 \__kernel_patch_deprecation:nnNNpn { 2021-01-11 } { (no~longer~required) }
 \cs_gset_protected:Npn \sys_load_deprecation: { }
 \__kernel_patch_deprecation:nnNNpn { 2023-07-08 } { \text_titlecase_first:n }
@@ -36669,6 +36737,10 @@
 \cs_generate_variant:Nn \tl_case:Nn   { c }
 \prg_generate_conditional_variant:Nnn \tl_case:Nn
   { c } { T , F , TF }
+\__kernel_patch_deprecation:nnNNpn { 2023-10-18 } { \tl_build_begin:N }
+\cs_new_protected:Npn \tl_build_clear:N { \tl_build_begin:N }
+\__kernel_patch_deprecation:nnNNpn { 2023-10-18 } { \tl_build_gbegin:N }
+\cs_new_protected:Npn \tl_build_gclear:N { \tl_build_gbegin:N }
 \__kernel_patch_deprecation:nnNNpn { 2022-10-09 } { [ \codepoint_generate:n ] }
 \cs_gset:Npn \char_to_utfviii_bytes:n { \__kernel_codepoint_to_bytes:n }
 \__kernel_patch_deprecation:nnNNpn { 2022-10-09 } { \codepoint_to_nfd:n }

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex	2023-11-01 20:15:10 UTC (rev 68721)
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx
-\def\ExplFileDate{2023-10-23}%
+\def\ExplFileDate{2023-11-01}%
 \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	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.ltx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx
-\def\ExplFileDate{2023-10-23}%
+\def\ExplFileDate{2023-11-01}%
 \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	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty	2023-11-01 20:15:10 UTC (rev 68721)
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx
-\def\ExplFileDate{2023-10-23}%
+\def\ExplFileDate{2023-11-01}%
 \let\ExplLoaderFileDate\ExplFileDate
 \ProvidesPackage{expl3}
   [%

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls	2023-11-01 20:15:10 UTC (rev 68721)
@@ -655,9 +655,9 @@
     \raisebox{\baselineskip}[0pt][0pt]{\hypertarget{expstar}{}}%
     \write \@auxout { \def \string \Codedoc at expstar { } }
     \__codedoc_typeset_exp:\ indicates~fully~expandable~functions,~which~
-    can~be~used~within~an~\texttt{x}-type~argument~(in~plain~
-    \TeX{}~terms,~inside~an~\cs{edef}),~as~well~as~within~an~
-    \texttt{f}-type~argument.
+    can~be~used~within~an~\texttt{e}-type~argument~(inside~an~\tn{expanded}),~
+    \texttt{x}-type~argument~(in~plain~\TeX{}~terms,~inside~an~\tn{edef}),~
+    as~well~as~within~an~\texttt{f}-type~argument.
   }
 \NewDocumentCommand { \CodedocExplainREXP } { }
   {
@@ -665,8 +665,8 @@
     \write \@auxout { \def \string \Codedoc at rexpstar { } }
     \__codedoc_typeset_rexp:\ indicates~
     restricted~expandable~functions,~which~can~be~used~within~an~
-    \texttt{x}-type~argument~but~cannot~be~fully~expanded~within~an~
-    \texttt{f}-type~argument.
+    \texttt{x}-type~argument~or~an~\texttt{e}-type~argument,~
+    but~cannot~be~fully~expanded~within~an~\texttt{f}-type~argument.
   }
 \NewDocumentCommand { \CodedocExplainTF } { }
   {

Modified: trunk/Master/tlpkg/bin/c2lx
===================================================================
--- trunk/Master/tlpkg/bin/c2lx	2023-11-01 20:13:49 UTC (rev 68720)
+++ trunk/Master/tlpkg/bin/c2lx	2023-11-01 20:15:10 UTC (rev 68721)
@@ -26,7 +26,7 @@
   pkgs="$pkgs latex-tools-dev latex-base-dev l3build"
 elif test "x$1" = x3; then
   shift; label=l3
-  pkgs="l3kernel l3packages l3experimental l3build l3backend l3build"
+  pkgs="l3kernel l3packages l3experimental l3build l3backend"
 elif test "x$1" = xdeng; then
   shift; label=deng
   pkgs="elegantbook elegantnote elegantpaper"



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