texlive[69066] Master/texmf-dist: l3kernel (8dec23)

commits+karl at tug.org commits+karl at tug.org
Fri Dec 8 22:36:03 CET 2023


Revision: 69066
          https://tug.org/svn/texlive?view=revision&revision=69066
Author:   karl
Date:     2023-12-08 22:36:03 +0100 (Fri, 08 Dec 2023)
Log Message:
-----------
l3kernel (8dec23)

Modified Paths:
--------------
    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/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-build.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx
    trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex
    trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex
    trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.ltx
    trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3debug.def
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls

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

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md	2023-12-08 21:36:03 UTC (rev 69066)
@@ -7,6 +7,17 @@
 
 ## [Unreleased]
 
+## [2023-12-08]
+
+### Added
+- `\c_empty_str` (issue \#1361)
+- `l3bitset`: moved from `l3experimental`
+
+### Fixed
+- Return `str` (not `tl`) in `\bool_to_str:N` and `\bool_to_str:n` (issue \#1331)
+- Catcode of space from `\str_set_convert:Nnnn` (issue \#1344)
+- Tidy up various documentation issues (issue \#1345)
+
 ## [2023-11-09]
 
 ### Added
@@ -13,6 +24,10 @@
 - Documentation for `\c_nan_fp`
 - `\str_case_e:en(TF)`
 
+### Changes
+- Speed up `\str_(g)set:Nn`, `\str_const:Nn`, `\str_(g)put_left:Nn`,
+  and `\str_(g)put_right:Nn`
+
 ### Fixed
 - Normalisation of `.inherit:n` key data (issue \#1314)
 
@@ -98,7 +113,7 @@
 ## [2023-08-11]
 
 ### Changed
--  Wrap long lists of variants in `l3doc` display of functions (issue \#1258)
+- Wrap long lists of variants in `l3doc` display of functions (issue \#1258)
 
 ### Fixed
 - Revert 'Allow for implicit chars when case changing' (issue \#1260)
@@ -151,7 +166,7 @@
 - `\prg_gset_eq_conditional:NNn` (issue \#1212)
 - `\iow_shell_open:Nn` (issue \#1122)
 
-## Deprecated
+### Deprecated
 - `\tl_case:Nn(TF)`
 - `expl3` package option `enable-debug` (no longer required)
 
@@ -168,8 +183,8 @@
 - Rounded out the `\use_i:nn...` functions to cover all cases taking
   one argument from up to nine arguments
 - `\coffin_(g)reset_poles:N`
--  `\dim_to_decimal_in_<unit>:n`, for `<unit>` types
-    `cc`, `cm`, `dd`, `in`, `mm` and `pc`
+- `\dim_to_decimal_in_<unit>:n`, for `<unit>` types
+  `cc`, `cm`, `dd`, `in`, `mm` and `pc`
 - `\file_input_raw:n`
 - `\int_if_zero:n(TF)`
 - `\str_mdfive_hash:n`
@@ -376,13 +391,13 @@
   [\#1109](https://github.com/latex3/latex3/issues/1109)), for many expandable
   tokens (issue [\#1110](https://github.com/latex3/latex3/issues/1110)), and an
   esoteric case (issue [\#1113](https://github.com/latex3/latex3/issues/1113))
--  Creation of a message with some engines (issue
+- Creation of a message with some engines (issue
   [\#1139](https://github.com/latex3/latex3/issues/1139))
 
 ### Deprecated
 - `\char_to_nfd:N`, `\char_to_nfd:n`
-- `\char_foldcase:N`, `\char_lowercase:N`, `\char_uppercase:N`
-   and `str` variants
+- `\char_foldcase:N`, `\char_lowercase:N`, `\char_titlecase:N`,
+   `\char_uppercase:N` and `str` variants
 - `\char_to_utfviii_bytes:n`
 - `\str_foldcase:n`
 
@@ -500,7 +515,7 @@
 - Language settings `hy` and `hy-x-yiwn` for handling of ech-yiwn ligature
   uppercasing
 
-## Changed
+### Changed
 - Support BCP 47 properly in case changer language argument
 
 ### Fixed
@@ -809,7 +824,7 @@
 ## [2020-10-27]
 
 ### Added
--  `\token_if_font_selection:N(TF)` (see \#806)
+- `\token_if_font_selection:N(TF)` (see \#806)
 
 ### Fixed
 - Avoid relying on braced `\input` primitive syntax
@@ -1112,7 +1127,7 @@
 ### Changed
 - Standard backend for (u)pTeX is now `dvips`
 - Minimum LuaTeX version now v0.95
-- Moved `\debug_on:`, `\debug_off:`, `\debug_suspend:` and `\debug_resume:`
+- Moved `\debug_on:n`, `\debug_off:n`, `\debug_suspend:` and `\debug_resume:`
   to stable
 - Accept 'traditional' class options for backend (`dvipdfmx`, `dvips`, etc.)
 - Performance enhancements when loading `expl3`
@@ -1527,7 +1542,7 @@
 - Implement `\intarray_gset_rand:Nnn`
 - Implement candidate `l3fparray` module
 
-## Changed
+### Changed
 - Update minimal required versions of XeTeX and LuaTeX
 - Deprecate named integer constants `\c_zero`. etc.
 - Move all primitives to `\tex_...:D namespace`,
@@ -1591,7 +1606,8 @@
 - Step functions have been added for dim variables,
   e.g. `\dim_step_inline:nnnn`
 
-[Unreleased]: https://github.com/latex3/latex3/compare/2023-11-09...HEAD
+[Unreleased]: https://github.com/latex3/latex3/compare/2023-12-08...HEAD
+[2023-12-08]: https://github.com/latex3/latex3/compare/2023-11-09...2023-12-08
 [2023-11-09]: https://github.com/latex3/latex3/compare/2023-11-01...2023-11-09
 [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

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/README.md	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/README.md	2023-12-08 21:36:03 UTC (rev 69066)
@@ -1,7 +1,7 @@
 LaTeX3 Programming Conventions
 ==============================
 
-Release 2023-11-09
+Release 2023-12-08
 
 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-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex	2023-12-08 21:36:03 UTC (rev 69066)
@@ -64,7 +64,7 @@
          {latex-team at latex-project.org}%
    }%
 }
-\date{Released 2023-11-09}
+\date{Released 2023-12-08}
 
 \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-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3obsolete.txt	2023-12-08 21:36:03 UTC (rev 69066)
@@ -19,6 +19,7 @@
 \char_lower_case:N                       2020-01-03
 \char_lowercase:N                        2022-10-17
 \char_mixed_case:N                       2020-01-03
+\char_titlecase:N                        2022-10-17
 \char_upper_case:N                       2020-01-03
 \char_uppercase:N                        2022-10-17
 \char_str_fold_case:N                    2020-01-03
@@ -26,11 +27,16 @@
 \char_str_lower_case:N                   2020-01-03
 \char_str_lowercase:N                    2022-10-17
 \char_str_mixed_case:N                   2020-01-03
+\char_str_titlecase:N                    2022-10-17
 \char_str_upper_case:N                   2020-01-03
 \char_str_uppercase:N                    2022-10-17
 \char_to_utfviii_bytes:n                 2022-10-09
 \char_to_nfd:N                           2022-10-09
 \cs_argument_spec:N                      2022-06-24
+\iow_shipout_x:cn                        2023-09-17
+\iow_shipout_x:cx                        2023-09-17
+\iow_shipout_x:Nn                        2023-09-17
+\iow_shipout_x:Nx                        2023-09-17
 \l_keys_key_tl                           2020-02-08
 \l_keys_path_tl                          2020-02-08
 \l_text_accents_tl                       2023-02-07
@@ -47,7 +53,7 @@
 \str_declare_eight_bit_encoding:nnn      2020-08-20
 \str_fold_case:n                         2020-01-03
 \str_fold_case:V                         2020-01-03
-\str_foldcase:N                          2022-10-17
+\str_foldcase:n                          2022-10-17
 \str_foldcase:V                          2022-10-17
 \str_lower_case:f                        2020-01-03
 \str_lower_case:n                        2020-01-03
@@ -76,6 +82,14 @@
 \tl_mixed_case:nn                        2020-01-03
 \tl_upper_case:n                         2020-01-03
 \tl_upper_case:nn                        2020-01-03
+[key property] .str_gset_x:c             2023-09-27
+[key property] .str_gset_x:N             2023-09-27
+[key property] .str_set_x:c              2023-09-27
+[key property] .str_set_x:N              2023-09-27
+[key property] .tl_gset_x:c              2023-09-27
+[key property] .tl_gset_x:N              2023-09-27
+[key property] .tl_set_x:c               2023-09-27
+[key property] .tl_set_x:N               2023-09-27
 [x-type variants]                        2023-09-27
 ---------------------------------------------------
 
@@ -356,7 +370,6 @@
 \iow_now_when_avail:Nn                          2012-06-05
 \iow_now_when_avail:Nx                          2012-06-05
 \iow_open_streams:                              2011-09-08
-\iow_shipout_x:Nn                               2023-09-17
 \iow_wrap:xnnnN                                 2013-01-08
 \KV_process_no_space_removal_no_sanitize:NNn    2011-09-08
 \KV_process_space_removal_no_sanitize:NNn       2011-09-08

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.csv
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.csv	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.csv	2023-12-08 21:36:03 UTC (rev 69066)
@@ -196,7 +196,7 @@
 pkgploader,pkgploader,Michiel Helvensteijn,,,,2014-02-05,2014-02-05,
 platex,platex,Japanese TeX Development Community,https://github.com/texjporg/platex,https://github.com/texjporg/platex.git,https://github.com/texjporg/platex/issues,2020-09-30,2020-09-30,
 polyglossia,polyglossia,Arthur Reutenauer,https://www.polyglossia.org/,https://github.com/reutenauer/polyglossia,https://github.com/reutenauer/polyglossia/issues,2019-09-03,,
-postnotes,postnotes,Gustavo Barros,https://github.com/gusbrs/postnotes,https://github.com/gusbrs/postnotes.git,https://github.com/gusbrs/postnotes/issues,2022-04-23,2022-04-23,
+postnotes,postnotes,gusbrs,https://github.com/gusbrs/postnotes,https://github.com/gusbrs/postnotes.git,https://github.com/gusbrs/postnotes/issues,2022-04-23,2022-04-23,
 prelim,prelim2e,Marei Peischl,https://github.com/TeXhackse/prelim2e,https://github.com/TeXhackse/prelim2e.git,https://github.com/TeXhackse/prelim2e/issues,2020-11-24,2020-11-24,
 prg,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
 primargs,morewrites,Bruno Le Floch,https://github.com/blefloch/latex-morewrites,https://github.com/blefloch/latex-morewrites.git,https://github.com/blefloch/latex-morewrites/issues,2013-03-16,2015-09-22,
@@ -271,6 +271,7 @@
 utex,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2015-07-28,2015-07-28,
 vbox,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
 vcoffin,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-28,2012-09-28,
+wheelchart,wheelchart,Matthias Floré,,,,2023-12-07,2023-12-07,
 withargs,withargs,Michiel Helvensteijn,,,,2014-02-05,2014-02-05,
 witharrows,witharrows,François Pantigny,,,,2019-12-19,2019-12-19,
 xeCJK,xecjk,Qing Lee,https://github.com/CTeX-org/ctex-kit,https://github.com/CTeX-org/ctex-kit.git,https://github.com/CTeX-org/ctex-kit/issues,2013-05-26,2013-05-26,
@@ -288,7 +289,7 @@
 zero,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12,
 zhlipsum,zhlipsum,Xiangdong Zeng,https://github.com/stone-zeng/zhlipsum,https://github.com/stone-zeng/zhlipsum.git,https://github.com/stone-zeng/zhlipsum/issues,2018-06-14,2018-06-14,
 zhnum,zhnumber,Qing Lee,https://github.com/CTeX-org/ctex-kit,https://github.com/CTeX-org/ctex-kit.git,https://github.com/CTeX-org/ctex-kit/issues,2013-03-16,2013-05-26,
-zrefcheck,zref-check,Gustavo Barros,https://github.com/gusbrs/zref-check,https://github.com/gusbrs/zref-check,https://github.com/gusbrs/zref-check/issues,2021-08-05,2021-08-05,
-zrefclever,zref-clever,Gustavo Barros,https://github.com/gusbrs/zref-clever,https://github.com/gusbrs/zref-clever,https://github.com/gusbrs/zref-clever/issues,2021-11-29,2021-11-29,
-zrefvario,zref-vario,Gustavo Barros,https://github.com/gusbrs/zref-vario,https://github.com/gusbrs/zref-vario,https://github.com/gusbrs/zref-vario/issues,2022-02-02,2022-02-02,
+zrefcheck,zref-check,gusbrs,https://github.com/gusbrs/zref-check,https://github.com/gusbrs/zref-check,https://github.com/gusbrs/zref-check/issues,2021-08-05,2021-08-05,
+zrefclever,zref-clever,gusbrs,https://github.com/gusbrs/zref-clever,https://github.com/gusbrs/zref-clever,https://github.com/gusbrs/zref-clever/issues,2021-11-29,2021-11-29,
+zrefvario,zref-vario,gusbrs,https://github.com/gusbrs/zref-vario,https://github.com/gusbrs/zref-vario,https://github.com/gusbrs/zref-vario/issues,2022-02-02,2022-02-02,
 zxjt,zxjatype,Takayuki Yato,,,,2013-03-16,2013-03-16,

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-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex	2023-12-08 21:36:03 UTC (rev 69066)
@@ -32,7 +32,7 @@
         {latex-team at latex-project.org}%
     }%
 }
-\date{Released 2023-11-09}
+\date{Released 2023-12-08}
 
 \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-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex	2023-12-08 21:36:03 UTC (rev 69066)
@@ -32,7 +32,7 @@
         {latex-team at latex-project.org}%
     }%
 }
-\date{Released 2023-11-09}
+\date{Released 2023-12-08}
 
 \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-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex	2023-12-08 21:36:03 UTC (rev 69066)
@@ -32,7 +32,7 @@
         {latex-team at latex-project.org}%
     }%
 }
-\date{Released 2023-11-09}
+\date{Released 2023-12-08}
 
 \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-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex	2023-12-08 21:36:03 UTC (rev 69066)
@@ -57,7 +57,7 @@
          {latex-team at latex-project.org}%
    }%
 }
-\date{Released 2023-11-09}
+\date{Released 2023-12-08}
 
 \pagenumbering{roman}
 \maketitle

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/source3body.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/source3body.tex	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/source3body.tex	2023-12-08 21:36:03 UTC (rev 69066)
@@ -272,15 +272,7 @@
     dependent and their name can change without warning, thus their
     use is \emph{strongly discouraged} in package code: programmers
     should instead use the interfaces documented in
-    \href{interface3.pdf}{interface3.pdf}%^^A
-    \footnote{If a primitive offers a functionality not yet in the
-      kernel, programmers and users are encouraged to write to the
-      \texttt{LaTeX-L} mailing list
-      (\url{mailto:LATEX-L at listserv.uni-heidelberg.de}) describing
-      their use-case and intended behaviour, so that a possible
-      interface can be discussed.  Temporarily, while an interface is
-      not provided, programmers may use the procedure described in the
-      \href{l3styleguide.pdf}{l3styleguide.pdf}.}.
+    \href{interface3.pdf}{interface3.pdf}.
 \end{description}
 Notice that the argument specifier describes how the argument is
 processed prior to being passed to the underlying function. For example,
@@ -306,7 +298,9 @@
   \texttt{\string\l_int_tmpa_int} would be very unreadable.}  name
 and then a descriptive part.
 Variables end with a short identifier to show the variable type:
-\begin{description}
+\begin{description}%  
+  \item[\texttt{bitset}] a set of bits (a string made up of a series of \texttt{0}
+    and \texttt{1} tokens that are accessed by position).
   \item[\texttt{clist}] Comma separated list.
   \item[\texttt{dim}] \enquote{Rigid} lengths.
   \item[\texttt{fp}] Floating-point values;
@@ -590,6 +584,7 @@
 \ExplSyntaxOff
 
 \DocInput{l3fparray.dtx}
+\DocInput{l3bitset.dtx}
 \DocInput{l3cctab.dtx}
 
 \part{Text manipulation}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -24,7 +24,7 @@
 %
 %<*driver|generic|package|2ekernel>
 %</driver|generic|package|2ekernel>
-\def\ExplFileDate{2023-11-09}%
+\def\ExplFileDate{2023-12-08}%
 %<*driver>
 \documentclass[full]{l3doc}
 \usepackage{graphicx}
@@ -51,7 +51,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %
@@ -414,6 +414,8 @@
 %
 % The data types in \LaTeX3 are:
 % \begin{description}
+%   \item[bitset] a string of bits (\texttt{0} and \texttt{1} tokens) that are
+%                 accessed by position or by name;
 %   \item[bool]   either true or false (the \LaTeX3 implementation does
 %                 not use \tn{iftrue} or \tn{iffalse});
 %   \item[box]    box register;
@@ -900,7 +902,7 @@
 % \texttt{check-declarations} option enables checking for all variable
 % assignments, issuing an error if any variables are assigned without being
 % initialised.  See also \cs{debug_on:n} \texttt{\{check-declarations\}}
-% in \pkg{l3candidates} for finer control.
+% in \pkg{interface3} for finer control.
 %
 % \DescribeOption{log-functions}
 % The \texttt{log-functions} option is used to enable recording of every new
@@ -908,7 +910,7 @@
 % purposes, as it means that there is a complete list of all functions
 % created by each module loaded (with the exceptions of a very small number
 % required by the bootstrap code).  See also \cs{debug_on:n}
-% \texttt{\{log-functions\}} in \pkg{l3candidates} for finer control.
+% \texttt{\{log-functions\}} in \pkg{interface3} for finer control.
 %
 % \DescribeOption{backend}
 % Selects the backend to be used for color, graphics and related operations that
@@ -1510,10 +1512,10 @@
     \tex_everyjob:D \exp_after:wN
       {
         \tex_the:D \tex_everyjob:D
-        \sys_everyjob:
+        \__kernel_sys_everyjob:
       }
   }
-  { \sys_everyjob: }
+  { \__kernel_sys_everyjob: }
 %    \end{macrocode}
 %
 % \begin{variable}{\s_@@_stop}
@@ -1759,7 +1761,7 @@
 % \begin{macro}{\g__kernel_backend_header_bool}
 % Load the dynamic code and standard back-end.
 %    \begin{macrocode}
-\sys_everyjob:
+\__kernel_sys_everyjob:
 \bool_new:N \g__kernel_backend_header_bool
 \bool_gset_true:N \g__kernel_backend_header_bool
 \sys_load_backend:n { }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3.ins
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3.ins	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3.ins	2023-12-08 21:36:03 UTC (rev 69066)
@@ -97,6 +97,7 @@
         \from{l3fp-symbolic.dtx}{package}
         \from{l3fp-functions.dtx}{package}
         \from{l3fparray.dtx}    {package}
+        \from{l3bitset.dtx}     {package}
         \from{l3cctab.dtx}      {package}
         \from{l3sort.dtx}       {package}
         \from{l3str-convert.dtx}{package}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %
@@ -1631,7 +1631,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\use:x}
+% \begin{macro}[deprecated]{\use:x}
 %   Fully expands its argument and passes it to the input stream. Uses
 %   the reserved \cs{l_@@_internal_tl} which we've set up above.
 %    \begin{macrocode}
@@ -2587,7 +2587,7 @@
 %    us to generate error messages. The next few definitions here are
 %    only temporary, they will be redefined later on.
 %
-% \begin{macro}
+% \begin{macro}[documented-as = \msg_error:nnnn]
 %   {\msg_error:nnee, \msg_error:nne, \msg_error:nn}
 %   If an internal error occurs before \LaTeX3 has loaded \pkg{l3msg} then
 %   the code should issue a usable if terse error message and halt. This

Added: trunk/Master/texmf-dist/source/latex/l3kernel/l3bitset.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3bitset.dtx	                        (rev 0)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3bitset.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -0,0 +1,604 @@
+% \iffalse meta-comment
+%
+%% File: l3bitset.dtx
+%
+% Copyright (C) 2020-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
+%
+%    http://www.latex-project.org/lppl.txt
+%
+% This file is part of the "l3kernel bundle" (The Work in LPPL)
+% and all files in that bundle must be distributed together.
+%
+% -----------------------------------------------------------------------
+%
+% 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 \pkg{l3bitset} package  \\ Bitsets ^^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-12-08}
+%
+% \maketitle
+%
+% \begin{documentation}
+%
+% This package defines and implements the data type \texttt{bitset}, a vector of
+% bits. The size of the vector may grow dynamically.
+% Individual bits can be set and unset by names pointing to an index position.
+% The names |1|, |2|, |3|, \ldots\ are predeclared and point to the
+% index positions  $1$, $2$, $3$,\ldots. More names can be added and existing names can
+% be changed.
+% The index is like all other indices in \pkg{expl3} modules \emph{1-based}.
+% A \texttt{bitset} can be output as binary number or---as needed e.g. in a
+% PDF dictionary---as decimal (arabic) number.
+% Currently only a small subset of the functions provided by the \pkg{bitset}
+% package are implemented here, mainly the functions needed to use bitsets in
+% PDF dictionaries.
+%
+% The bitset is stored as a string (but one shouldn't rely on the internal
+% representation) and so the vector size is theoretically
+% unlimited, only restricted by \TeX-memory. But the functions to set and clear
+% bits uses integer functions for the index so bitsets can't be longer
+% than $2^{31} - 1$.
+% The export function
+% \cs{bitset_to_arabic:N} can use functions from the \texttt{int} module only if
+% the largest index used for this bitset is smaller then $32$, for longer
+% bitsets \texttt{fp} is used and this is slower.
+%
+% \section{Creating bitsets}
+%
+% \begin{function}[added = 2021-01-26,updated=2020-12-29]
+%   {\bitset_new:N,\bitset_new:c,\bitset_new:Nn, \bitset_new:cn}
+%   \begin{syntax}
+%     \cs{bitset_new:N}  \meta{bitset var} \\
+%     \cs{bitset_new:Nn} \meta{bitset var}
+%      \{
+%         \meta{name1} |=| \meta{index1} |,|
+%         \meta{name2} |=| \meta{index2} |,| \ldots{}
+%      \}
+%   \end{syntax}
+% Creates a new \meta{bitset var} or raises an error if the name is already taken.
+% The declaration is global. The \meta{bitset var} is initially $0$.
+%
+% Bitsets are implemented as string variables consisting of
+% \texttt{1}'s and \texttt{0}'s.
+% The rightmost number is the index position $1$, so
+% the string variable can be viewed directly as the binary number.
+% But one shouldn't rely on the internal representation, but use the
+% dedicated \cs{bitset_to_bin:N} instead to get the binary number.
+%
+% The name--index pairs given in the second
+% argument of \cs{bitset_new:Nn} declares names for some indices,
+% which can be used to set and unset bits.
+% The names |1|, |2|, |3|, \ldots\ are predeclared and point to the
+% index positions $1$, $2$, $3$, \ldots.
+%
+% \meta{index\ldots} should be a positive number or an
+% \meta{integer expression} which evaluates to a positive number.
+% The expression is evaluated when the index is used, not a declaration time.
+% The names \meta{name\ldots}
+% should be unique. Using a number as name, e.g.~|10=1|, is allowed, it
+% then overwrites the predeclared name |10|,
+% but the index position $10$ can then only be reached if some other
+% name for it exists, e.g. |ten=10|.
+% It is not necessary to give every index
+% a name, and an index can have more than one name. The named index
+% can be extended or changed with the next function.
+% \end{function}
+%
+% \begin{function}[added = 2021-01-26]
+%   {\bitset_addto_named_index:Nn}
+%   \begin{syntax}
+%     \cs{bitset_addto_named_index:Nn} \meta{bitset var}
+%      \{
+%         \meta{name1} |=| \meta{index1} |,|
+%         \meta{name2} |=| \meta{index2} |,| \ldots{}
+%      \}
+%   \end{syntax}
+%   This extends or changes the name--index pairs for \meta{bitset var}
+%   globally as described for \cs{bitset_new:Nn}.
+% \end{function}
+%
+% For example after these settings
+% \begin{verbatim}
+%   \bitset_new:Nn \l_pdfannot_F_bitset
+%     {
+%       Invisible      = 1,
+%       Hidden         = 2,
+%       Print          = 3,
+%       NoZoom         = 4,
+%       NoRotate       = 5,
+%       NoView         = 6,
+%       ReadOnly       = 7,
+%       Locked         = 8,
+%       ToggleNoView   = 9,
+%       LockedContents = 10
+%     }
+%   \bitset_addto_named_index:Nn \l_pdfannot_F_bitset
+%     {
+%       print = 3
+%     }
+% \end{verbatim}
+% it is possible to set bit $3$ by using any of this alternatives:
+% \begin{verbatim}
+%   \bitset_set_true:Nn \l_pdfannot_F_bitset {Print}
+%   \bitset_set_true:Nn \l_pdfannot_F_bitset {print}
+%   \bitset_set_true:Nn \l_pdfannot_F_bitset {3}
+% \end{verbatim}
+%
+% \begin{function}[EXP, pTF,added = 2021-01-26]
+%   {\bitset_if_exist:N, \bitset_if_exist:c}
+%   \begin{syntax}
+%     \cs{bitset_if_exist_p:N} \meta{bitset var}
+%     \cs{bitset_if_exist:NTF} \meta{bitset var} \Arg{true code} \Arg{false code}%
+%   \end{syntax}
+%   Tests whether the \meta{bitset var} exist.
+% \end{function}
+%
+% \section{Setting and unsetting bits}
+%
+% \begin{function}[added = 2021-01-26]
+%   {
+%     \bitset_set_true:Nn, \bitset_set_true:cn,
+%     \bitset_gset_true:Nn, \bitset_gset_true:cn
+%   }
+%   \begin{syntax}
+%     \cs{bitset_set_true:Nn}   \meta{bitset var}  \Arg{name}\\
+%     \cs{bitset_gset_true:Nn}  \meta{bitset var}  \Arg{name}
+%   \end{syntax}
+%   This sets the bit of the index position represented by \Arg{name} to $1$.
+%   \Arg{name} should be either one of the predeclared names
+%   |1|, |2|, |3|, \ldots, or one of the names added manually.
+%   Index position are 1-based.
+%   If needed the length of the bit vector is enlarged.
+% \end{function}
+%
+% \begin{function}[added = 2021-01-26]
+%   {
+%     \bitset_set_false:Nn, \bitset_set_false:cn,
+%     \bitset_gset_false:Nn, \bitset_set_false:cn
+%   }
+%   \begin{syntax}
+%     \cs{bitset_set_false:Nn}   \meta{bitset var}  \Arg{name}\\
+%     \cs{bitset_gset_false:Nn}  \meta{bitset var}  \Arg{name}
+%   \end{syntax}
+%   This unsets the bit of the index position represented by \Arg{name} (sets
+%   it to $0$).
+%   \Arg{name} should be either one of the predeclared names
+%   |1|, |2|, |3|, \ldots, or one of the names added manually.
+%   The index is $1$-based. If the index position is larger
+%   than the current length of the bit vector
+%   nothing happens. If the leading (left most) bit is unset,
+%   zeros are not trimmed but stay in the bit vector and are still shown
+%   by \cs{bitset_show:N}.
+% \end{function}
+%
+% \begin{function}[added = 2021-01-26]
+%   {\bitset_clear:N,\bitset_clear:c,\bitset_gclear:N,\bitset_gclear:c}
+%   \begin{syntax}
+%     \cs{bitset_clear:N}  \meta{bitset var} \\
+%     \cs{bitset_gclear:N}  \meta{bitset var}
+%   \end{syntax}
+%   This resets the bitset to the initial state. The declared names are not changed.
+% \end{function}
+%
+% \section{Using bitsets}
+%
+% \begin{function}[EXP,added = 2021-01-26]
+%   {\bitset_item:Nn, \bitset_item:cn}
+%   \begin{syntax}
+%     \cs{bitset_item:Nn}   \meta{bitset var}  \Arg{name}
+%   \end{syntax}
+% \cs{bitset_item:Nn} outputs \texttt{1} if the bit with
+% the index number represented by \Arg{name} is set and \texttt{0} otherwise.
+%  \Arg{name} is either one of the predeclared names
+% |1|, |2|, |3|, \ldots, or one of the names added manually.
+% \end{function}
+%
+% \begin{function}[EXP,added = 2021-01-26]
+%   {\bitset_to_bin:N, \bitset_to_bin:c}
+%   \begin{syntax}
+%     \cs{bitset_to_bin:N} \meta{bitset var}
+%   \end{syntax}
+%   This leaves the current value of the bitset expressed as
+%   a binary (string) number in the input stream.
+%   If no bit has been set yet, the output is zero.
+% \end{function}
+% \begin{function}[EXP,added = 2021-01-26]
+%   {\bitset_to_arabic:N, \bitset_to_arabic:c}
+%   \begin{syntax}
+%     \cs{bitset_to_arabic:N} \meta{bitset var}
+%   \end{syntax}
+%   This leaves the current value of the bitset expressed as
+%   a decimal number in the input stream. If no bit has been set yet,
+%   the output is zero. The function uses \cs{int_from_bin:n} if the largest
+%   index that have been set or unset is smaller then $32$, and a slower implementation
+%   based on \cs{fp_eval:n} otherwise.
+% \end{function}
+%
+% \begin{function}[added = 2021-01-26]
+%   {\bitset_show:N, \bitset_show:c}
+%   \begin{syntax}
+%     \cs{bitset_show:N} \meta{bitset var}
+%   \end{syntax}
+%   Displays the binary and decimal value of the \meta{bitset var} on the terminal,
+% \end{function}
+%
+% \begin{function}[added = 2021-01-26]
+%   {\bitset_log:N, \bitset_log:c}
+%   \begin{syntax}
+%     \cs{bitset_log:N} \meta{bitset var}
+%   \end{syntax}
+%   Writes the value of the \meta{bitset var} in the log file.
+% \end{function}
+%
+% \end{documentation}
+%
+% \begin{implementation}
+%
+% \section{\pkg{l3bitset} implementation}
+%
+%    \begin{macrocode}
+%<*package>
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+%<@@=bitset>
+%    \end{macrocode}
+%
+% Transitional support.
+%    \begin{macrocode}
+\cs_if_exist:NT \@expl at finalise@setup@@@@
+  {
+    \tl_gput_right:Nn \@expl at finalise@setup@@@@
+      { \disable at package@load { l3bitset } { } }
+  }
+%    \end{macrocode}
+%
+% A bitset is a string variable.
+%  \begin{macro}{\bitset_new:N, \bitset_new:c}
+%  \begin{macro}{\bitset_new:Nn, \bitset_new:cn}
+%    \begin{macrocode}
+\cs_new_protected:Npn \bitset_new:N #1
+  {
+    \__kernel_chk_if_free_cs:N #1
+    \cs_gset_eq:NN #1 \c_zero_str
+    \prop_new:c { g__bitset_ \cs_to_str:N #1 _name_prop }
+  }
+
+\cs_new_protected:Npn \bitset_new:Nn #1 #2
+  {
+    \__kernel_chk_if_free_cs:N #1
+    \cs_gset_eq:NN #1 \c_zero_str
+    \prop_new:c { g__bitset_ \cs_to_str:N #1 _name_prop }
+    \prop_gset_from_keyval:cn
+       { g__bitset_ \cs_to_str:N #1 _name_prop }
+       {#2}
+  }
+\cs_generate_variant:Nn \bitset_new:N { c }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{variable}{\l_@@_tmp_prop}
+% A scratch prop to be able to extend the names properties.
+%    \begin{macrocode}
+\prop_new:N \l_@@_tmp_prop
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}{\bitset_addto_named_index:Nn}
+%    \begin{macrocode}
+\cs_new_protected:Npn \bitset_addto_named_index:Nn #1#2
+  {
+     \prop_set_from_keyval:Nn \l_@@_tmp_prop {#2}
+     \prop_map_inline:Nn \l_@@_tmp_prop
+       {
+         \prop_gput:cnn
+           { g_@@_ \cs_to_str:N #1 _name_prop }
+           {##1}
+           {##2}
+       }
+  }
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}[EXP,pTF]
+%   {
+%     \bitset_if_exist:N, \bitset_if_exist:c
+%   }
+% Existence tests.
+%    \begin{macrocode}
+\prg_new_eq_conditional:NNn
+  \bitset_if_exist:N \str_if_exist:N { p , T , F , TF }
+\prg_new_eq_conditional:NNn
+  \bitset_if_exist:c \str_if_exist:c
+  { p , T , F , TF }
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_set_true:Nn, \@@_gset_true:Nn, \@@_set_false:Nn, \@@_gset_false:Nn}
+% \begin{macro}{\@@_set:NNnN}
+% The internal command uses only numbers (integer expressions) for the
+% position.
+% A bit is set by either extending the string or by splitting it and
+% then inserting an $1$. It is not checked if the value was already $1$.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_set_true:Nn #1#2
+  { \@@_set:NNnN \str_set:Ne #1 {#2} 1 }
+\cs_new_protected:Npn \@@_gset_true:Nn #1#2
+  { \@@_set:NNnN \str_gset:Ne #1 {#2} 1 }
+\cs_new_protected:Npn \@@_set_false:Nn #1#2
+  { \@@_set:NNnN \str_set:Ne #1 {#2} 0 }
+\cs_new_protected:Npn \@@_gset_false:Nn #1#2
+  { \@@_set:NNnN \str_gset:Ne #1 {#2} 0 }
+\cs_new_protected:Npn \@@_set:NNnN #1#2#3#4
+  {
+    \int_compare:nNnT {#3} > { 0 }
+      {
+        \int_compare:nNnTF { \str_count:N #2 } < {#3}
+          {
+            #1 #2
+              {
+                #4
+                \prg_replicate:nn { #3 - \str_count:N #2 - 1 } { 0 }
+                #2
+              }
+          }
+          {
+             #1 #2
+              {
+                \str_range:Nnn #2 { 1 } { -1 - (#3) }
+                #4
+                \str_range:Nnn #2 { 1 - (#3) } { -1 }
+             }
+          }
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{variable}{\l_@@_internal_int}
+%    \begin{macrocode}
+\int_new:N \l_@@_internal_int
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[TF]{\@@_test_digits:n}
+% \begin{macro}{\@@_test_digits_end:n}
+% \begin{macro}{\@@_test_digits:wn}
+%   \url{https://chat.stackexchange.com/transcript/message/56878159#56878159}
+%    \begin{macrocode}
+\prg_new_protected_conditional:Npnn \@@_test_digits:n #1 { TF }
+  {
+    \tex_afterassignment:D \@@_test_digits:w
+    \l_@@_internal_int = 0 \tl_trim_spaces_apply:nN {#1} \tl_to_str:n
+    \@@_test_digits_end:
+    \use_i:nnn \if_false:
+    \@@_test_digits_end:
+    \if_int_compare:w \c_zero_int < \l_@@_internal_int
+      \prg_return_true:
+    \else:
+      \prg_return_false:
+    \fi:
+  }
+\cs_new_eq:NN \@@_test_digits_end: \exp_stop_f:
+\cs_new_protected:Npn \@@_test_digits:w #1 \@@_test_digits_end: { }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}
+%   {
+%     \bitset_set_true:Nn, \bitset_set_true:cn,
+%     \bitset_gset_true:Nn, \bitset_gset_true:cn,
+%   }
+% \begin{macro}{\@@_set_aux:NNn}
+% The user commands must first translate the argument to an index number.
+%    \begin{macrocode}
+\cs_new_protected:Npn \bitset_set_true:Nn #1#2
+  { \@@_set:NNn \@@_set_true:Nn #1 {#2} }
+\cs_new_protected:Npn \bitset_gset_true:Nn #1#2
+  { \@@_set:NNn \@@_gset_true:Nn #1 {#2} }
+\cs_new_protected:Npn \bitset_set_false:Nn #1#2
+  { \@@_set:NNn \@@_set_false:Nn #1 {#2} }
+\cs_new_protected:Npn \bitset_gset_false:Nn #1#2
+  { \@@_set:NNn \@@_gset_false:Nn #1 {#2} }
+\cs_new_protected:Npn \@@_set:NNn #1#2#3
+  {
+    \prop_if_in:cnTF { g_@@_ \cs_to_str:N #2 _name_prop } {#3}
+      {
+        #1 #2
+          {
+            \prop_item:cn  { g_@@_ \cs_to_str:N #2 _name_prop } {#3}
+          }
+      }
+      {
+        \@@_test_digits:nTF {#3}
+          {
+            #1 #2 {#3}
+            \prop_gput:cnn { g_@@_ \cs_to_str:N #2 _name_prop } {#3} {#3}
+          }
+          {
+            \msg_warning:nnee { bitset } { unknown-name }
+              { \token_to_str:N #2 }
+              { \tl_to_str:n {#3} }
+          }
+      }
+  }
+\cs_generate_variant:Nn \bitset_set_true:Nn  { c }
+\cs_generate_variant:Nn \bitset_gset_true:Nn { c }
+\cs_generate_variant:Nn \bitset_set_false:Nn  { c }
+\cs_generate_variant:Nn \bitset_gset_false:Nn { c }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}
+%   {
+%     \bitset_clear:N,  \bitset_clear:c,
+%     \bitset_gclear:N, \bitset_gclear:c
+%   }
+%    \begin{macrocode}
+\cs_new_protected:Npn \bitset_clear:N #1
+  {
+    \str_set_eq:NN #1 \c_zero_str
+  }
+\cs_new_protected:Npn \bitset_gclear:N #1
+  {
+    \str_gset_eq:NN #1 \c_zero_str
+  }
+\cs_generate_variant:Nn \bitset_clear:N { c }
+\cs_generate_variant:Nn \bitset_gclear:N { c }
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}
+%   {
+%     \bitset_to_arabic:N, \bitset_to_arabic:c,
+%     \bitset_to_bin:N,    \bitset_to_bin:c,
+%   }
+%   The naming of the commands follow the names in the \texttt{int} module.
+%   \cs{bitset_to_arabic:N} uses \cs{int_from_bin:n} if the string is shorter
+%   then $32$ and the slower \cs{fp_eval} for larger bitsets.
+%    \begin{macrocode}
+\cs_new:Npn \bitset_to_arabic:N #1
+  {
+    \int_compare:nNnTF { \str_count:N #1 } < { 32 }
+      { \exp_args:No \int_from_bin:n {#1} }
+      {
+        \exp_after:wN \@@_to_int:nN \exp_after:wN 0
+        #1 \q_recursion_tail \q_recursion_stop
+      }
+  }
+
+\cs_new:Npn \@@_to_int:nN #1#2
+  {
+    \quark_if_recursion_tail_stop_do:Nn #2 {#1}
+    \exp_args:Nf \@@_to_int:nN { \fp_eval:n { #1 * 2 + #2 } }
+  }
+
+\cs_new:Npn \bitset_to_bin:N #1
+  {
+    #1
+  }
+\cs_generate_variant:Nn \bitset_to_arabic:N  { c }
+\cs_generate_variant:Nn \bitset_to_bin:N { c }
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}
+%   {
+%     \bitset_item:Nn, \bitset_item:cn
+%   }
+% All bits that have been set at anytime have an entry in the prop,
+% so we can take everything else as $0$.
+%    \begin{macrocode}
+\cs_new:Npn \bitset_item:Nn #1#2
+  {
+    \prop_if_in:cnTF { g_@@_ \cs_to_str:N #1 _name_prop } {#2}
+      {
+        \int_eval:n
+          {
+            \str_item:Nn #1
+              { 0 - ( \prop_item:cn { g_@@_ \cs_to_str:N #1 _name_prop } {#2} ) }
+            +0
+          }
+     }
+     {
+       0
+     }
+  }
+\cs_generate_variant:Nn \bitset_item:Nn { c }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}
+%   {
+%     \bitset_show:N, \bitset_show:c,
+%     \bitset_log:N,  \bitset_log:c
+%   }
+%    \begin{macrocode}
+\cs_new_protected:Npn   \bitset_show:N { \@@_show:NN \msg_show:nneeee }
+\cs_generate_variant:Nn \bitset_show:N { c }
+\cs_new_protected:Npn   \bitset_log:N  { \@@_show:NN \msg_log:nneeee }
+\cs_generate_variant:Nn \bitset_log:N  { c }
+\cs_new_protected:Npn   \bitset_show_named_index:N { \@@_show_named_index:NN \msg_show:nneeee }
+\cs_generate_variant:Nn \bitset_show_named_index:N { c }
+\cs_new_protected:Npn \@@_show:NN #1#2
+  {
+    \__kernel_chk_defined:NT #2
+      {
+        #1 { bitset } { show }
+           { \token_to_str:N #2 }
+           { \bitset_to_bin:N #2 }
+           { \bitset_to_arabic:N #2 }
+           { }
+      }
+  }
+\cs_new_protected:Npn \@@_show_named_index:NN #1#2
+  {
+    \__kernel_chk_defined:NT #2
+      {
+        #1 { bitset } { show-names }
+           { \token_to_str:N #2 }
+           { \prop_map_function:cN { g_@@_ \cs_to_str:N #2 _name_prop }  \msg_show_item:nn  }
+           { }
+           { }
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsection{Messages}
+%    \begin{macrocode}
+ \msg_new:nnn { bitset } { show }
+  {
+    The~bitset~#1~has~the~representation: \\
+    >~binary:~#2  \\
+    >~arabic:~#3 .
+  }
+\msg_new:nnn { bitset } { show-names }
+  {
+    The~bitset~#1~
+    \tl_if_empty:nTF {#2}
+      { knows~no~names~yet \\>~ . }
+      { knows~the~name/index~pairs~(without~outer~braces): #2 . }
+  }
+\msg_new:nnn { bitset } { unknown-name }
+  { The~name~'#2'~is~unknown~for~bitset~\tl_to_str:n {#1} }
+\prop_gput:Nnn \g_msg_module_name_prop { bitset } { LaTeX }
+\prop_gput:Nnn \g_msg_module_type_prop { bitset } { }
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+%</package>
+%    \end{macrocode}
+%
+% \end{implementation}
+%
+% \PrintIndex


Property changes on: trunk/Master/texmf-dist/source/latex/l3kernel/l3bitset.dtx
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %
@@ -1435,7 +1435,7 @@
 % \begin{macro}
 %   {
 %     \clist_gremove_all:Nn, \clist_gremove_all:cn,
-%     \clist_gremove_all:NV, \clist_remove_all:cV
+%     \clist_gremove_all:NV, \clist_gremove_all:cV
 %   }
 % \UnitTested
 % \begin{macro}{\@@_remove_all:NNNn}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %
@@ -1766,7 +1766,7 @@
 %     \coffin_scale:Nnn, \coffin_scale:cnn,
 %     \coffin_gscale:Nnn, \coffin_gscale:cnn
 %   }
-% \begin{macro}{\coffin_scale:NnnNN}
+% \begin{macro}{\@@_scale:NnnNN}
 %   For scaling, the opposite calculation is done to find the new
 %   dimensions for the coffin. Only the total height is needed, as this
 %   is the shift required for corners and poles. The scaling is done

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3color.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3color.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3color.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %
@@ -128,7 +128,7 @@
 %
 % Standard file identification.
 %    \begin{macrocode}
-\ProvidesExplFile{l3debug.def}{2019-04-06}{}{L3 Debugging support}
+\ProvidesExplFile{l3debug.def}{2023-12-08}{}{L3 Debugging support}
 %    \end{macrocode}
 %
 % \begin{variable}{\s_@@_stop}
@@ -838,6 +838,10 @@
       \skip_set_eq:NN
       \skip_add:Nn
       \skip_sub:Nn
+      \str_clear:N
+      \str_set_eq:NN
+      \str_put_left:Nn
+      \str_put_right:Nn
       \__kernel_tl_set:Ne
       \tl_clear:N
       \tl_set_eq:NN
@@ -903,6 +907,10 @@
       \skip_gset_eq:NN
       \skip_gadd:Nn
       \skip_gsub:Nn
+      \str_gclear:N
+      \str_gset_eq:NN
+      \str_gput_left:Nn
+      \str_gput_right:Nn
       \__kernel_tl_gset:Ne
       \tl_gclear:N
       \tl_gset_eq:NN
@@ -941,6 +949,7 @@
       \intarray_const_from_clist:Nn
       \muskip_const:Nn
       \skip_const:Nn
+      \str_const:Nn
       \tl_const:Nn
     }
 %    \end{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %
@@ -396,9 +396,9 @@
 \@@_old_protected:Nnn \tl_show_analysis:n
   { \tl_analysis_show:n } { 2020-01-01 }
 \@@_old:Nnn \tl_case:cnn
-  { \tl_case:cnF } { 2015-07-14 }
+  { \exp_args:Nc \token_case_meaning:NnF } { 2015-07-14 }
 \@@_old:Nnn \tl_case:Nnn
-  { \tl_case:NnF } { 2015-07-14 }
+  { \token_case_meaning:NnF } { 2015-07-14 }
 \@@_old_protected:Nnn \tl_gset_from_file:Nnn
   { \file_get:nnN } { 2021-07-01 }
 \@@_old_protected:Nnn \tl_gset_from_file_x:Nnn
@@ -438,7 +438,7 @@
 %<@@=cs>
 %    \end{macrocode}
 %
-% \begin{macro}[EXP]{\cs_argument_spec:N}
+% \begin{macro}[EXP, deprecated]{\cs_argument_spec:N}
 %   For the present, do not deprecate fully as \LaTeXe{} will need to catch
 %   up: one for Fall 2022.
 %    \begin{macrocode}
@@ -447,6 +447,87 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \subsection{Deprecated \pkg{l3file} functions}
+%
+% \begin{macro}[deprecated]
+%   {
+%     \iow_shipout_x:Nn, \iow_shipout_x:Nx,
+%     \iow_shipout_x:cn, \iow_shipout_x:cx
+%   }
+%   Previously described as \texttt{x}-type, but the hash behaviour is really
+%   \texttt{e}-type. Currently not \enquote{live} as we need to have a transition.
+%    \begin{macrocode}
+% \__kernel_patch_deprecation:nnNNpn { 2023-10-10 } { \iow_shipout_e:Nn }
+\cs_new_protected:Npn \iow_shipout_x:Nn { \iow_shipout_e:Nn }
+\cs_generate_variant:Nn \iow_shipout_x:Nn { Nx , c, cx }
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsection{Deprecated \pkg{l3keys} functions}
+%
+%    \begin{macrocode}
+%<@@=keys>
+%    \end{macrocode}
+%
+% \begin{macro}[deprecated]{.str_set_x:N, .str_set_x:c}
+% \begin{macro}[deprecated]{.str_gset_x:N, .str_gset_x:c}
+%    \begin{macrocode}
+\cs_new_protected:cpn { \c_@@_props_root_str .str_set_x:N } #1
+  { \@@_variable_set:NnnN #1 { str } { } x }
+\cs_new_protected:cpn { \c_@@_props_root_str .str_set_x:c } #1
+  { \@@_variable_set:cnnN {#1} { str } { } x }
+\cs_new_protected:cpn { \c_@@_props_root_str .str_gset_x:N } #1
+  { \@@_variable_set:NnnN #1 { str } { g } x }
+\cs_new_protected:cpn { \c_@@_props_root_str .str_gset_x:c } #1
+  { \@@_variable_set:cnnN {#1} { str } { g } x }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[deprecated]{.tl_set_x:N, .tl_set_x:c}
+% \begin{macro}[deprecated]{.tl_gset_x:N, .tl_gset_x:c}
+%    \begin{macrocode}
+\cs_new_protected:cpn { \c_@@_props_root_str .tl_set_x:N } #1
+  { \@@_variable_set:NnnN #1 { tl } { } x }
+\cs_new_protected:cpn { \c_@@_props_root_str .tl_set_x:c } #1
+  { \@@_variable_set:cnnN {#1} { tl } { } x }
+\cs_new_protected:cpn { \c_@@_props_root_str .tl_gset_x:N } #1
+  { \@@_variable_set:NnnN #1 { tl } { g } x }
+\cs_new_protected:cpn { \c_@@_props_root_str .tl_gset_x:c } #1
+  { \@@_variable_set:cnnN {#1} { tl } { g } x }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Deprecated \pkg{l3pdf} functions}
+%
+% \begin{variable}[deprecated]{\g_@@_object_prop}
+%   For tracking objects.
+%    \begin{macrocode}
+\prop_new:N \g_@@_object_prop
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[deprecated]
+%   {\pdf_object_new:nn, \pdf_object_write:nn, \pdf_object_write:nx}
+%    \begin{macrocode}
+\__kernel_patch_deprecation:nnNNpn { 2022-08-30 } { [\pdf_object_new:n] }
+\cs_new_protected:Npn \pdf_object_new:nn #1#2
+  {
+    \prop_gput:Nnn \g_@@_object_prop {#1} {#2}
+    \@@_backend_object_new:n {#1}
+  }
+\__kernel_patch_deprecation:nnNNpn { 2022-08-30 } { [\pdf_object_write:n] }
+\cs_new_protected:Npn \pdf_object_write:nn #1#2
+  {
+    \exp_args:Nne \@@_backend_object_write:nnn
+      {#1} { \prop_item:Nn \g_@@_object_prop {#1} } {#2}
+    \bool_gset_true:N \g_@@_init_bool
+  }
+\cs_generate_variant:Nn \pdf_object_write:nn { nx }
+%    \end{macrocode}
+% \end{macro}
+%
 % \subsection{Deprecated \pkg{l3prg} functions}
 %
 %    \begin{macrocode}
@@ -453,15 +534,15 @@
 %<@@=cs>
 %    \end{macrocode}
 %
-% \begin{macro}[EXP, noTF]{\bool_case_true:n}
+% \begin{macro}[EXP, noTF, deprecated]{\bool_case_true:n}
 %    \begin{macrocode}
-\__kernel_patch_deprecation:nnNNpn { 2023-05-03 } { \bool_case_true:n }
+\__kernel_patch_deprecation:nnNNpn { 2023-05-03 } { \bool_case:n }
 \cs_gset:Npn \bool_case_true:n { \bool_case:n }
-\__kernel_patch_deprecation:nnNNpn { 2023-05-03 } { \bool_case_true:nT }
+\__kernel_patch_deprecation:nnNNpn { 2023-05-03 } { \bool_case:nT }
 \cs_gset:Npn \bool_case_true:nT { \bool_case:nT }
-\__kernel_patch_deprecation:nnNNpn { 2023-05-03 } { \bool_case_true:nF }
+\__kernel_patch_deprecation:nnNNpn { 2023-05-03 } { \bool_case:nF }
 \cs_gset:Npn \bool_case_true:nF { \bool_case:nF }
-\__kernel_patch_deprecation:nnNNpn { 2023-05-03 } { \bool_case_true:nTF }
+\__kernel_patch_deprecation:nnNNpn { 2023-05-03 } { \bool_case:nTF }
 \cs_gset:Npn \bool_case_true:nTF { \bool_case:nTF }
 %    \end{macrocode}
 % \end{macro}
@@ -472,7 +553,7 @@
 %<@@=str>
 %    \end{macrocode}
 %
-% \begin{macro}[EXP]
+% \begin{macro}[EXP, deprecated]
 %   {
 %     \str_lower_case:n, \str_lower_case:f,
 %     \str_upper_case:n, \str_upper_case:f,
@@ -494,7 +575,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[EXP]
+% \begin{macro}[EXP, deprecated]
 %   {\str_foldcase:n,  \str_foldcase:V}
 %    \begin{macrocode}
 \__kernel_patch_deprecation:nnNNpn { 2020-10-17 } { \str_casefold:n }
@@ -504,7 +585,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[EXP]
+% \begin{macro}[EXP, deprecated]
 %   {\str_declare_eight_bit_encoding:nnn}
 %   This command was made internal, with one more argument.  There is no
 %   easy way to compute a reasonable value for that extra argument so we
@@ -518,8 +599,8 @@
 %
 % \subsection{Deprecated \pkg{l3seq} functions}
 %
-% \begin{macro}{\seq_indexed_map_inline:Nn}
-% \begin{macro}[EXP]{ \seq_indexed_map_function:NN}
+% \begin{macro}[deprecated]{\seq_indexed_map_inline:Nn}
+% \begin{macro}[EXP, deprecated]{ \seq_indexed_map_function:NN}
 %    \begin{macrocode}
 \__kernel_patch_deprecation:nnNNpn { 2020-06-18 } { \seq_map_indexed_inline:Nn }
 \cs_gset_protected:Npn \seq_indexed_map_inline:Nn { \seq_map_indexed_inline:Nn }
@@ -529,14 +610,14 @@
 % \end{macro}
 % \end{macro}
 %
-% \begin{macro}{\seq_mapthread_function:NNN}
+% \begin{macro}[deprecated]{\seq_mapthread_function:NNN}
 %    \begin{macrocode}
-\__kernel_patch_deprecation:nnNNpn { 2023-05-10 } { \seq_mapthread_function:NNN }
+\__kernel_patch_deprecation:nnNNpn { 2023-05-10 } { \seq_map_pairwise_function:NNN }
 \cs_gset:Npn \seq_mapthread_function:NNN { \seq_map_pairwise_function:NNN }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\seq_set_map_x:NNn, \seq_gset_map_x:NNn}
+% \begin{macro}[deprecated]{\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 }
@@ -551,7 +632,7 @@
 %<@@=sys>
 %    \end{macrocode}
 %
-% \begin{macro}{\sys_load_deprecation:}
+% \begin{macro}[deprecated]{\sys_load_deprecation:}
 %    \begin{macrocode}
 \__kernel_patch_deprecation:nnNNpn { 2021-01-11 } { (no~longer~required) }
 \cs_gset_protected:Npn \sys_load_deprecation: { }
@@ -560,8 +641,8 @@
 %
 % \subsection{Deprecated \pkg{l3text} functions}
 %
-% \begin{macro}[EXP]{\text_titlecase:n}
-% \begin{macro}[EXP]{\text_titlecase:nn}
+% \begin{macro}[EXP, deprecated]{\text_titlecase:n}
+% \begin{macro}[EXP, deprecated]{\text_titlecase:nn}
 %    \begin{macrocode}
 \__kernel_patch_deprecation:nnNNpn { 2023-07-08 } { \text_titlecase_first:n }
 \cs_gset:Npn \text_titlecase:n #1
@@ -579,7 +660,7 @@
 %<@@=tl>
 %    \end{macrocode}
 %
-% \begin{macro}
+% \begin{macro}[deprecated]
 %   {
 %     \tl_lower_case:n, \tl_lower_case:nn,
 %     \tl_upper_case:n, \tl_upper_case:nn,
@@ -607,7 +688,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[noTF]{\tl_case:Nn, \tl_case:cn}
+% \begin{macro}[noTF, deprecated]{\tl_case:Nn, \tl_case:cn}
 %    \begin{macrocode}
 \__kernel_patch_deprecation:nnNNpn { 2022-05-23 } { \token_case_meaning:Nn }
 \cs_gset:Npn \tl_case:Nn { \token_case_meaning:Nn }
@@ -623,7 +704,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\tl_build_clear:N, \tl_build_gclear:N}
+% \begin{macro}[deprecated]{\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 }
@@ -634,14 +715,14 @@
 %
 % \subsection{Deprecated \pkg{l3token} functions}
 %
-% \begin{macro}[EXP]{\char_to_utfviii_bytes:n}
+% \begin{macro}[EXP, deprecated]{\char_to_utfviii_bytes:n}
 %    \begin{macrocode}
-\__kernel_patch_deprecation:nnNNpn { 2022-10-09 } { [ \codepoint_generate:n ] }
+\__kernel_patch_deprecation:nnNNpn { 2022-10-09 } { [ \codepoint_generate:nn ] }
 \cs_gset:Npn \char_to_utfviii_bytes:n { \__kernel_codepoint_to_bytes:n }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[EXP]{\char_to_nfd:N, \char_to_nfd:n}
+% \begin{macro}[EXP, deprecated]{\char_to_nfd:N, \char_to_nfd:n}
 %    \begin{macrocode}
 \__kernel_patch_deprecation:nnNNpn { 2022-10-09 } { \codepoint_to_nfd:n }
 \cs_gset:Npn \char_to_nfd:N #1 { \codepoint_to_nfd:n {`#1} }
@@ -650,7 +731,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[EXP]
+% \begin{macro}[EXP, deprecated]
 %   {
 %     \char_lower_case:N, \char_upper_case:N,
 %     \char_mixed_case:Nn, \char_fold_case:N,
@@ -677,11 +758,11 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[EXP]
+% \begin{macro}[EXP, deprecated]
 %   {
-%     \char_lowercase:N, \char_uppercase:N,
+%     \char_lowercase:N, \char_titlecase:N, \char_uppercase:N,
 %     \char_foldcase:N,
-%     \char_str_lowercase:N, \char_str_uppercase:N,
+%     \char_str_lowercase:N, \char_str_titlecase:N, \char_str_uppercase:N,
 %     \char_str_foldcase:N,
 %   }
 %    \begin{macrocode}
@@ -689,10 +770,16 @@
 \cs_gset:Npn \char_lowercase:N { \text_lowercase:n }
 \__kernel_patch_deprecation:nnNNpn { 2022-10-17 } { \text_uppercase:n }
 \cs_gset:Npn \char_uppercase:N { \text_uppercase:n }
+\__kernel_patch_deprecation:nnNNpn { 2022-10-17 } { \text_titlecase_first:n }
+\cs_gset:Npn \char_titlecase:N { \text_titlecase_first:n }
 \__kernel_patch_deprecation:nnNNpn { 2022-10-17 } { \str_casefold:n }
 \cs_gset:Npn \char_foldcase:N { \str_casefold:n }
 \__kernel_patch_deprecation:nnNNpn { 2022-10-17 } { \str_lowercase:n }
 \cs_gset:Npn \char_str_lowercase:N { \str_lowercase:n }
+\__kernel_patch_deprecation:nnNNpn { 2022-10-17 }
+  { \tl_to_str:e { \text_titlecase_first:n } }
+\cs_gset:Npn \char_str_titlecase:N #1
+  { \tl_to_str:e { \text_titlecase_first:n {#1} } }
 \__kernel_patch_deprecation:nnNNpn { 2022-10-17 } { \str_uppercase:n }
 \cs_gset:Npn \char_str_uppercase:N { \str_uppercase:n }
 \__kernel_patch_deprecation:nnNNpn { 2022-10-17 } { \str_casefold:n }
@@ -700,7 +787,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[TF]
+% \begin{macro}[TF, deprecated]
 %   {
 %     \peek_catcode_ignore_spaces:N, \peek_catcode_remove_ignore_spaces:N,
 %     \peek_charcode_ignore_spaces:N, \peek_charcode_remove_ignore_spaces:N,

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -85,7 +85,7 @@
 %    require you to do updates, if the class changes.}}
 %
 % \author{\Team}
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 % \maketitle
 % \tableofcontents
 %
@@ -469,6 +469,10 @@
 % |T| nor |F|, to document functions such as \cs[no-index]{prop_get:NN}
 % which also have conditional forms (\cs[no-index]{prop_get:NNTF}).
 %
+% In a very small number of cases, there is no user documentation for
+% a \enquote{public} function. In these rare cases, the option
+% |no-user-doc| may be added to suppress the undefined reference that
+% would otherwise then arises.
 %
 % \DescribeMacro{\TestFiles}
 % \cs{TestFiles}\marg{list of files} is used to indicate which test
@@ -695,8 +699,9 @@
 %
 % \begin{variable}
 %   {
-%     \l_@@_macro_internal_set_bool,
+%     \l_@@_macro_deprecated_bool ,
 %     \l_@@_macro_internal_bool,
+%     \l_@@_macro_nodoc_bool ,
 %     \l_@@_macro_TF_bool,
 %     \l_@@_macro_pTF_bool,
 %     \l_@@_macro_noTF_bool,
@@ -710,8 +715,9 @@
 %   environments.  We initialize \cs{l_@@_override_module_tl} to avoid
 %   overriding module names by an empty name (meaning no module).
 %    \begin{macrocode}
-\bool_new:N \l_@@_macro_internal_set_bool
+\bool_new:N \l_@@_macro_deprecated_bool
 \bool_new:N \l_@@_macro_internal_bool
+\bool_new:N \l_@@_macro_nodoc_bool
 \bool_new:N \l_@@_macro_TF_bool
 \bool_new:N \l_@@_macro_pTF_bool
 \bool_new:N \l_@@_macro_noTF_bool
@@ -955,49 +961,12 @@
 % \begin{macro}
 %   {
 %     \seq_set_split:NoV,
-%     \str_case:fn,
-%     \tl_count:f,
-%     \tl_greplace_all:Nen,
-%     \tl_greplace_all:Nno,
-%     \tl_if_head_eq_charcode:oNTF,
-%     \tl_if_head_eq_charcode:oNT,
-%     \tl_if_head_eq_charcode:oNF,
-%     \tl_if_head_eq_meaning:VNF,
-%     \tl_if_in:noTF,
-%     \tl_if_in:ooTF,
-%     \tl_if_in:NoTF,
-%     \tl_if_in:NoT,
-%     \tl_if_in:NoF,
-%     \tl_remove_all:Ne,
-%     \tl_replace_all:Nen,
-%     \tl_replace_all:Nne,
-%     \tl_replace_all:Non,
-%     \tl_replace_all:Nno,
-%     \tl_replace_once:Noo,
-%     \tl_to_str:f,
-%     \tl_to_str:o,
+%     \tl_to_str:f
 %   }
 %   A few missing variants.
 %    \begin{macrocode}
 \cs_generate_variant:Nn \seq_set_split:Nnn { NoV }
-\cs_generate_variant:Nn \seq_gput_right:Nn { Nf }
-\cs_generate_variant:Nn \str_case:nn { fn }
-\cs_generate_variant:Nn \tl_count:n { f }
-\cs_generate_variant:Nn \tl_greplace_all:Nnn { Nx , Nno }
-\cs_generate_variant:Nn \tl_if_empty:nTF { f }
-\cs_generate_variant:Nn \tl_if_head_eq_charcode:nNTF { o }
-\cs_generate_variant:Nn \tl_if_head_eq_charcode:nNT  { o }
-\cs_generate_variant:Nn \tl_if_head_eq_charcode:nNF  { o }
-\cs_generate_variant:Nn \tl_if_head_eq_meaning:nNF  { V }
-\cs_generate_variant:Nn \tl_if_in:nnTF { no , oo }
-\cs_generate_variant:Nn \tl_if_in:NnTF { No }
-\cs_generate_variant:Nn \tl_if_in:NnT  { No }
-\cs_generate_variant:Nn \tl_if_in:NnF  { No }
-\cs_generate_variant:Nn \tl_remove_all:Nn   { Nx }
-\cs_generate_variant:Nn \tl_replace_all:Nnn { Nx , Nnx, No , Nno }
-\cs_generate_variant:Nn \tl_replace_once:Nnn { Noo }
-\cs_generate_variant:Nn \tl_set_rescan:Nnn { NnV }
-\cs_generate_variant:Nn \tl_to_str:n { f , o }
+\cs_generate_variant:Nn \tl_to_str:n { f }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -1004,7 +973,7 @@
 % \begin{macro}[TF]{\@@_if_almost_str:n}
 %   Used to test if the argument of |\cmd| or other macros to be indexed
 %   is almost a string or not: for instance this is \texttt{false} if |#1|
-%   contains |\meta{...}|.  The surprising |f|-expansion are there to
+%   contains |\meta{...}|.  The surprising |f|-expansion is there to
 %   cope with the case of |#1| starting with \cs{c_backslash_str}
 %   which should be expanded and considered to be \enquote{normal}.
 %    \begin{macrocode}
@@ -1012,11 +981,11 @@
   {
     \int_compare:nNnTF
       { \tl_count:n {#1} }
-      < { \tl_count:f { \tl_to_str:f {#1} } }
+      < { \tl_count:e { \tl_to_str:f {#1} } }
       { \prg_return_false: }
       { \prg_return_true: }
   }
-\cs_generate_variant:Nn \@@_if_almost_str:nT { V }
+\prg_generate_conditional_variant:Nnn \@@_if_almost_str:n { V } { T }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -1110,7 +1079,7 @@
   \cs_new_protected:Npn \@@_detect_internals_aux:N #1
     {
       \tl_set_eq:NN \l_@@_detect_internals_tl #1
-      \tl_replace_all:Non \l_@@_detect_internals_tl { \token_to_str:N _ } { _ }
+      \tl_replace_all:NVn \l_@@_detect_internals_tl \c_underscore_str { _ }
       \seq_set_split:NnV \l_@@_tmpa_seq { _ _ } \l_@@_detect_internals_tl
       \seq_pop_left:NN \l_@@_tmpa_seq \l_@@_detect_internals_tl
       \seq_map_variable:NNn \l_@@_tmpa_seq \l_@@_detect_internals_tl
@@ -1993,9 +1962,9 @@
     \bool_if:NT \l_@@_cmd_replace_bool
       {
         \tl_set_rescan:Nnn \l_@@_tmpb_tl { } { _ }
-        \tl_replace_all:Non \l_@@_cmd_tl \l_@@_tmpb_tl { _ }
+        \tl_replace_all:NVn \l_@@_cmd_tl \l_@@_tmpb_tl { _ }
         \@@_replace_at_at:N \l_@@_cmd_tl
-        \tl_replace_all:Nno \l_@@_cmd_tl { _ } \l_@@_tmpb_tl
+        \tl_replace_all:NnV \l_@@_cmd_tl { _ } \l_@@_tmpb_tl
       }
 %    \end{macrocode}
 % Typesetting.
@@ -2075,7 +2044,7 @@
       {
         \tl_set_rescan:Nnn \l_@@_tmpb_tl
           { \char_set_catcode:nn { `_ } {##1} } { _ }
-        \tl_replace_all:Non \l_@@_tmpa_tl \l_@@_tmpb_tl
+        \tl_replace_all:NVn \l_@@_tmpa_tl \l_@@_tmpb_tl
           { \@@_ensuremath_sb:n }
       }
     \exp_args:NV \@@_meta_original:n \l_@@_tmpa_tl
@@ -2155,8 +2124,8 @@
 \cs_new_protected:Npn \@@_get_hyper_target:nN #1#2
   {
     \__kernel_tl_set:Ne #2 { \tl_to_str:n {#1} }
-    \tl_replace_all:Nen #2 { \c_underscore_str } { / }
-    \tl_remove_all:Ne   #2 { \c_backslash_str }
+    \tl_replace_all:NVn #2 \c_underscore_str { / }
+    \tl_remove_all:NV   #2 \c_backslash_str
     \tl_put_left:Nn #2 { doc/function// }
   }
 \cs_generate_variant:Nn \@@_get_hyper_target:nN { o , e }
@@ -2282,8 +2251,8 @@
   {
     \seq_pop:NN #1 \l_@@_tmpa_tl
     \tl_gset_eq:NN \g_@@_base_name_tl \l_@@_tmpa_tl
-    \tl_greplace_all:Nno \g_@@_base_name_tl
-      { ~ } { \c_catcode_other_space_tl }
+    \tl_greplace_all:NnV \g_@@_base_name_tl
+      { ~ } \c_catcode_other_space_tl
     \seq_get:NN #1 \l_@@_tmpa_tl
     \str_if_eq:VnTF \l_@@_tmpa_tl { \scan_stop: }
       {
@@ -2350,13 +2319,10 @@
 %    \begin{macrocode}
 \prg_new_conditional:Npnn \@@_if_macro_internal:n #1 { p , T , F , TF }
   {
-    \bool_if:NTF \l_@@_macro_internal_set_bool
+    \bool_if:NTF \l_@@_macro_internal_bool
+      { \prg_return_true: }
       {
-        \bool_if:NTF \l_@@_macro_internal_bool
-          { \prg_return_true: } { \prg_return_false: }
-      }
-      {
-        \tl_if_empty:fTF
+        \tl_if_empty:eTF
           {
             \exp_after:wN \@@_if_macro_internal_aux:w
             \tl_to_str:n { #1 ~ __ }
@@ -2437,7 +2403,8 @@
       } ,
     added .code:n = { \@@_date_set_past:Nn \l_@@_date_added_tl {#1} },
     updated .code:n = { \@@_date_set_past:Nn \l_@@_date_updated_tl {#1} } ,
-    deprecated .code:n = {} , % A stub
+    deprecated .bool_set:N = \l_@@_macro_deprecated_bool , 
+    no-user-doc .bool_set:N = \l_@@_macro_nodoc_bool ,
     tested .code:n = { } ,
     label .code:n =
       {
@@ -2884,18 +2851,14 @@
         \msg_warning:nnnn { l3doc } { deprecated-option }
           { aux } { function/macro }
       } ,
+    deprecated .bool_set:N = \l_@@_macro_deprecated_bool , 
     internal .value_forbidden:n = true ,
     internal .code:n =
-      {
-        \bool_set_true:N \l_@@_macro_internal_bool
-        \bool_set_true:N \l_@@_macro_internal_set_bool
-      } ,
+      { \bool_set_true:N \l_@@_macro_internal_bool } ,
     int .value_forbidden:n = true ,
     int .code:n =
-      {
-        \bool_set_true:N \l_@@_macro_internal_bool
-        \bool_set_true:N \l_@@_macro_internal_set_bool
-      } ,
+      { \bool_set_true:N \l_@@_macro_internal_bool } ,
+    no-user-doc .bool_set:N = \l_@@_macro_nodoc_bool ,
     var .value_forbidden:n = true ,
     var .code:n =
       { \bool_set_true:N \l_@@_macro_var_bool } ,
@@ -2934,7 +2897,6 @@
       } ,
     added .code:n = {} , % TODO
     updated .code:n = {} , % TODO
-    deprecated .code:n = {} , % A stub
     verb .bool_set:N = \l_@@_names_verb_bool ,
     module .tl_set:N = \l_@@_override_module_tl ,
     documented-as .tl_set:N = \l_@@_macro_documented_tl ,
@@ -2977,8 +2939,8 @@
 \cs_new_protected:Npn \@@_macro_init:
   {
     \int_incr:N \l_@@_nested_macro_int
+    \bool_set_false:N \l_@@_macro_deprecated_bool
     \bool_set_false:N \l_@@_macro_internal_bool
-    \bool_set_false:N \l_@@_macro_internal_set_bool
     \bool_set_false:N \l_@@_macro_TF_bool
     \bool_set_false:N \l_@@_macro_pTF_bool
     \bool_set_false:N \l_@@_macro_noTF_bool
@@ -3026,8 +2988,8 @@
     \tl_if_empty:NTF \l_@@_macro_documented_tl
       { \@@_names_block_base_map:N \@@_macro_save_names_aux:n }
       {
-        \seq_gput_right:Nf \g_@@_nested_names_seq
-          { \exp_after:wN \token_to_str:N \l_@@_macro_documented_tl }
+        \seq_gput_right:Ne \g_@@_nested_names_seq
+          { \tl_to_str:N \l_@@_macro_documented_tl }
       }
   }
 \cs_new_protected:Npn \@@_macro_save_names_aux:n #1
@@ -3103,7 +3065,6 @@
           { \@@_get_function_name:n {#1} } #2
       }
   }
-\cs_generate_variant:Nn \@@_macro_typeset_block:nN { x }
 \cs_new_protected:Npn \@@_macro_typeset_variant_list:nN #1#2
   {
     \seq_map_inline:Nn \g_@@_variants_seq
@@ -3140,7 +3101,12 @@
     \DoNotIndex {#1}
     \bool_if:NT #2
       {
-        \@@_if_macro_internal:nF {#1}
+        \bool_lazy_any:nF
+          {
+            { \@@_if_macro_internal_p:n {#1} }
+            { \l_@@_macro_deprecated_bool }
+            { \l_@@_macro_nodoc_bool }
+          }
           { \seq_gput_right:Nn \g_doc_macros_seq {#1} }
         \hbox_set:Nw \l_@@_macro_index_box
           \hbox_unpack_drop:N \l_@@_macro_index_box
@@ -3198,8 +3164,8 @@
         \int_compare:nTF { \str_count:n {#1} <= 28 }
           { \MacroFont } { \MacroLongFont }
         \tl_set:Nn \l_@@_tmpa_tl {#1}
-        \tl_replace_all:Nno \l_@@_tmpa_tl
-          { ~ } { \c_catcode_other_space_tl }
+        \tl_replace_all:NnV \l_@@_tmpa_tl
+          { ~ } \c_catcode_other_space_tl
         \@@_macroname_prefix:o \l_@@_tmpa_tl
         \@@_macroname_suffix:N #2
       }
@@ -3377,8 +3343,8 @@
 \cs_new_protected:Npn \@@_macro_end_wrap_item:n #1
   {
     \tl_set:Nn \l_@@_tmpa_tl {#1}
-    \tl_replace_all:Non \l_@@_tmpa_tl
-      { \token_to_str:N _ } { \_ }
+    \tl_replace_all:NVn \l_@@_tmpa_tl
+      \c_underscore_str { \_ }
     \texttt { \l_@@_tmpa_tl }
   }
 \cs_new_protected:Npn \@@_print_end_definition:
@@ -3400,7 +3366,14 @@
   {
     \seq_gset_filter:NNn \g_@@_nested_names_seq
       \g_@@_nested_names_seq
-      { ! \@@_if_macro_internal_p:n {##1} }
+      {
+        ! \bool_lazy_any_p:n
+          {
+            { \@@_if_macro_internal_p:n {##1} }
+            { \l_@@_macro_deprecated_bool }
+            { \l_@@_macro_nodoc_bool }
+          }
+      }
     \seq_if_empty:NF \g_@@_nested_names_seq
       {
         \int_set:Nn \l_@@_tmpa_int
@@ -3963,18 +3936,18 @@
         \tl_clear:N \l_@@_doc_def_tl
         \tl_clear:N \l_@@_doc_undef_tl
         \tl_clear:N \l_@@_undoc_def_tl
+        \seq_gremove_duplicates:N \g_doc_functions_seq
+        \seq_gremove_duplicates:N \g_doc_macros_seq
         \seq_map_inline:Nn \g_doc_functions_seq
           {
             \seq_if_in:NnTF \g_doc_macros_seq {##1}
               {
                 \tl_put_right:Ne \l_@@_doc_def_tl
-                  { ##1 \iow_newline: }
-                \iow_now:Nn \g_@@_func_iow { > ~ ##1 }
+                  { \iow_newline: > ~ ##1 }
               }
               {
                 \tl_put_right:Ne \l_@@_doc_undef_tl
-                  { ##1 \iow_newline: }
-                \iow_now:Nn \g_@@_func_iow { ! ~ ##1 }
+                  { \iow_newline: ! ~ ##1 }
               }
           }
         \seq_map_inline:Nn \g_doc_macros_seq
@@ -3982,8 +3955,7 @@
             \seq_if_in:NnF \g_doc_functions_seq {##1}
               {
                 \tl_put_right:Ne \l_@@_undoc_def_tl
-                  { ##1 \iow_newline: }
-                \iow_now:Nn \g_@@_func_iow { ? ~ ##1 }
+                  { \iow_newline: ? ~ ##1 }
               }
           }
         \@@_functions_typeout:nN
@@ -4012,11 +3984,11 @@
   {
     \tl_if_empty:NF #2
       {
-        \typeout
+        \iow_now:Ne \g_@@_func_iow
           {
             \c_@@_iow_midrule_tl \iow_newline:
             #1 \iow_newline:
-            \c_@@_iow_midrule_tl \iow_newline:
+            \c_@@_iow_midrule_tl
             #2
           }
         \tl_clear:N #2
@@ -4367,7 +4339,7 @@
     \__kernel_tl_set:Ne #1 { \tl_to_str:n {#2} }
     \@@_if_almost_str:nTF {#2}
       {
-        \tl_replace_all:Non #1 { \tl_to_str:n { __ } }
+        \tl_replace_all:Nen #1 { \tl_to_str:n { __ } }
           {
             \verbatimchar
             \token_to_str:N \_ \token_to_str:N \_
@@ -4390,8 +4362,8 @@
       }
       {
         \tl_set:Nn #1 {#2}
-        \tl_replace_all:Non #1
-          { \c_backslash_str }
+        \tl_replace_all:NVn #1
+          \c_backslash_str
           { \token_to_str:N \bslash \c_space_tl }
       }
     \@@_quote_special_char:N #1
@@ -4430,27 +4402,26 @@
 %   module name, while for \TeX{}/\LaTeXe{} commands the module name is
 %   |TeX|, and others have an empty module name.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_key_get:n #1
+\cs_new_protected:Npe \@@_key_get:n #1
   {
-    \@@_key_get_base:nN {#1} \l_@@_index_macro_tl
-    \__kernel_tl_set:Ne \l_@@_index_key_tl
-      { \tl_to_str:N \l_@@_index_macro_tl }
-    \tl_clear:N \l_@@_index_module_tl
-    \tl_if_in:NoTF \l_@@_index_key_tl { \tl_to_str:n { __ } }
-      { \bool_set_true:N \l_@@_index_internal_bool }
-      { \bool_set_false:N \l_@@_index_internal_bool }
-    \exp_last_unbraced:NNo
-    \tl_if_head_eq_charcode:oNT
-      { \l_@@_index_key_tl } \c_backslash_str
-      { \@@_key_pop: }
-    \tl_if_in:NoTF \l_@@_index_key_tl { \token_to_str:N : }
-      { \@@_key_func: }
+    \exp_not:N \@@_key_get_base:nN {#1} \exp_not:N \l_@@_index_macro_tl
+    \__kernel_tl_set:Ne \exp_not:N \l_@@_index_key_tl
+      { \exp_not:N \tl_to_str:N \exp_not:N \l_@@_index_macro_tl }
+    \tl_clear:N \exp_not:N \l_@@_index_module_tl
+    \tl_if_in:NnTF \exp_not:N \l_@@_index_key_tl { \tl_to_str:n { __ } }
+      { \bool_set_true:N \exp_not:N \l_@@_index_internal_bool }
+      { \bool_set_false:N \exp_not:N \l_@@_index_internal_bool }
+    \exp_not:N \tl_if_head_eq_charcode:VNT
+      \exp_not:N \l_@@_index_key_tl \c_backslash_str
+      { \exp_not:N \@@_key_pop: }
+    \tl_if_in:NnTF \exp_not:N \l_@@_index_key_tl { \token_to_str:N : }
+      { \exp_not:N \@@_key_func: }
       {
-        \tl_if_in:NoTF \l_@@_index_key_tl { \token_to_str:N _ }
-          { \@@_key_var: }
+        \tl_if_in:NnTF \exp_not:N \l_@@_index_key_tl { \token_to_str:N _ }
+          { \exp_not:N \@@_key_var: }
           {
-            \tl_if_in:NoT \l_@@_index_key_tl { \token_to_str:N @ }
-              { \tl_set:Nn \l_@@_index_module_tl { TeX } }
+            \tl_if_in:NnT \exp_not:N \l_@@_index_key_tl { \token_to_str:N @ }
+              { \tl_set:Nn \exp_not:N \l_@@_index_module_tl { TeX } }
           }
       }
   }
@@ -4476,7 +4447,7 @@
   }
 \cs_new_protected:Npn \@@_key_drop_underscores:
   {
-    \tl_if_head_eq_charcode:oNT { \l_@@_index_key_tl } _
+    \tl_if_head_eq_charcode:VNT \l_@@_index_key_tl _
       { \@@_key_pop: \@@_key_drop_underscores: }
   }
 %    \end{macrocode}
@@ -4491,7 +4462,7 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_key_func:
   {
-    \tl_if_head_eq_charcode:oNT { \l_@@_index_key_tl } .
+    \tl_if_head_eq_charcode:VNT \l_@@_index_key_tl .
       { \@@_key_pop: }
     \@@_key_drop_underscores:
     \tl_set_eq:NN \l_@@_index_module_tl \l_@@_index_key_tl
@@ -4527,7 +4498,7 @@
     \exp_args:Ne \tl_if_head_eq_charcode:nNTF
       { \exp_args:No \str_tail:n \l_@@_index_key_tl } _
       {
-        \str_case:fn { \str_head:N \l_@@_index_key_tl }
+        \str_case:en { \str_head:N \l_@@_index_key_tl }
           {
             { q } { \tl_set:Nn \l_@@_index_module_tl { quark } }
             { s } { \tl_set:Nn \l_@@_index_module_tl { scan } }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -63,7 +63,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %
@@ -310,23 +310,16 @@
 %
 % When speed is essential (for functions that do very little work and
 % whose variants are used numerous times in a document) the following
-% considerations apply because internal functions for argument expansion
-% come in two flavours, some faster than others.
+% considerations apply because the speed of internal functions that
+% expand the arguments of a base function depend on what needs doing
+% with each argument and where this happens in the list of arguments:
 % \begin{itemize}
-%   \item
-%     Arguments that might need expansion should come first in the list
-%     of arguments.
-%   \item
-%     Arguments that should consist of single tokens |N|, |c|, |V|, or
-%     |v| should come first among these.
-%   \item
-%     Arguments that appear after the first multi-token argument |n|,
-%     |f|, |e|, or |o| require slightly slower special processing to be
-%     expanded.  Therefore it is best to use the optimized functions,
-%     namely those that contain only |N|, |c|, |V|, and |v|, and, in the
-%     last position, |o|, |f|, |e|, with possible trailing |N| or |n| or
-%     |T| or |F|, which are not expanded.  Any |x|-type argument causes
-%     slightly slower processing.
+%   \item for fastest processing any |c|-type arguments should come first
+%     followed by all other modified arguments;
+%   \item unchanged |N|-type args that appear before modified ones have
+%     a small performance hit;
+%  \item unchanged |n|-type args that appear before modified ones have
+%    a relative larger performance hit.
 % \end{itemize}
 %
 % \section{Manipulating the first argument}
@@ -471,7 +464,6 @@
 %   third as detailed by their argument specifier. The first argument
 %   of the function is then the next item on the input stream, followed
 %   by the expansion of the second and third arguments.
-%   These functions need slower processing.
 % \end{function}
 %
 % \begin{function}
@@ -542,7 +534,6 @@
 %   and fourth as detailed by their argument specifier. The first
 %   argument of the function is then the next item on the input stream,
 %   followed by the expansion of the second argument, \emph{etc}.
-%   These functions need slower processing.
 % \end{function}
 %
 % \begin{function}[added = 2015-08-12]
@@ -2384,8 +2375,9 @@
 %
 % \subsection{Held-over variant generation}
 %
-% \begin{macro}{\cs_generate_from_arg_count:NNno}
-% \begin{macro}{\cs_replacement_spec:c}
+% \begin{macro}[documented-as = \cs_generate_from_arg_count:NNnn]
+%    {\cs_generate_from_arg_count:NNno}
+% \begin{macro}[documented-as = \cs_replacement_spec:N]{\cs_replacement_spec:c}
 %   A couple of variants that are from early functions.
 %    \begin{macrocode}
 \cs_generate_variant:Nn \cs_generate_from_arg_count:NNnn { NNno }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %
@@ -716,7 +716,8 @@
 %     \cs{file_if_exist_p:n} \Arg{file name}
 %     \cs{file_if_exist:nTF} \Arg{file name} \Arg{true code} \Arg{false code}
 %   \end{syntax}
-%   Searches for \meta{file name} using the current \TeX{} search
+%   Expands the argument of the \cs{file name} to give a string, then
+%   searches for this string using the current \TeX{} search
 %   path and the additional paths controlled by
 %   \cs{l_file_search_path_seq}.
 % \end{function}
@@ -724,10 +725,10 @@
 % \begin{function}[noTF, added = 2019-01-16, updated = 2019-02-16]
 %   {\file_get:nnN, \file_get:VnN}
 %   \begin{syntax}
-%     \cs{file_get:nnN} \Arg{filename} \Arg{setup} \meta{tl}
-%     \cs{file_get:nnNTF} \Arg{filename} \Arg{setup} \meta{tl} \Arg{true code} \Arg{false code}
+%     \cs{file_get:nnN} \Arg{file name} \Arg{setup} \meta{tl}
+%     \cs{file_get:nnNTF} \Arg{file name} \Arg{setup} \meta{tl} \Arg{true code} \Arg{false code}
 %   \end{syntax}
-%   Defines \meta{tl} to the contents of \meta{filename}.
+%   Defines \meta{tl} to the contents of \meta{file name}.
 %   Category codes may need to be set appropriately via the \meta{setup}
 %   argument.
 %   The non-branching version sets the \meta{tl} to \cs{q_no_value} if the file is
@@ -2546,22 +2547,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \subsection{Deprecated functions}
-%
-% \begin{macro}
-%   {
-%     \iow_shipout_x:Nn, \iow_shipout_x:Nx,
-%     \iow_shipout_x:cn, \iow_shipout_x:cx
-%   }
-%   Previously described as \texttt{x}-type, but the hash behaviour is really
-%   \texttt{e}-type.
 %    \begin{macrocode}
-\cs_new_eq:NN \iow_shipout_x:Nn \iow_shipout_e:Nn
-\cs_generate_variant:Nn \iow_shipout_x:Nn { Nx , c, cx }
-%    \end{macrocode}
-% \end{macro}
-%
-%    \begin{macrocode}
 %<@@=file>
 %    \end{macrocode}
 %
@@ -3359,7 +3345,7 @@
 %   {
 %     \file_compare_timestamp:nNn,
 %     \file_compare_timestamp:nNV,
-%     \file_compare_timestamp:VNn
+%     \file_compare_timestamp:VNn,
 %     \file_compare_timestamp:VNV
 %   }
 % \begin{macro}[EXP]{\@@_compare_timestamp:nnN}
@@ -3415,7 +3401,7 @@
 % \end{macro}
 % \end{macro}
 %
-% \begin{macro}[TF]{\file_if_exist:n, \file_if_exist:V}
+% \begin{macro}[pTF]{\file_if_exist:n, \file_if_exist:V}
 %   The test for the existence of a file is a wrapper around the function to
 %   add a path to a file. If the file was found, the path contains
 %   something, whereas if the file was not located then the return value
@@ -3569,8 +3555,8 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\file_parse_full_name:n, \file_parse_full_name:nV}
-% \begin{macro}{\file_parse_full_name_apply:nN \file_parse_full_name_apply:VN}
+% \begin{macro}{\file_parse_full_name:n, \file_parse_full_name:V}
+% \begin{macro}{\file_parse_full_name_apply:nN, \file_parse_full_name_apply:VN}
 %   The main parsing macro \cs{file_parse_full_name_apply:nN} passes the
 %   file name |#1| through \cs{__kernel_file_name_sanitize:n} so that we
 %   have a single normalised way to treat files internally.

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %
@@ -61,7 +61,7 @@
 % to zero requires non-expandable assignments.
 %
 % Flag variables are always local. They are referenced by a \meta{flag
-% name} such as \texttt{str_missing}.  The \meta{flag name} is used as
+% name} such as \texttt{@@_missing}.  The \meta{flag name} is used as
 % part of \cs{use:c} constructions hence is expanded at point of use.
 % It must expand to character tokens only, with no spaces.
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 % \maketitle
 %
 % \begin{documentation}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-functions.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-functions.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-functions.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-symbolic.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-symbolic.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-symbolic.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 % \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-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-types.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-types.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-types.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -49,7 +49,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %
@@ -415,6 +415,13 @@
 %   are errors, and in such case the definition is aborted.
 % \end{function}
 %
+% \begin{function}{\__kernel_sys_everyjob:}
+%   \begin{syntax}
+%     \cs{__kernel_sys_everyjob:}
+%   \end{syntax}
+%   Inserts the internal token list required at the start of every run (job).
+% \end{function}
+%
 % \begin{variable}{\c__kernel_randint_max_int}
 %   Maximal allowed argument to \cs{__kernel_randint:n}.  Equal to
 %   $2^{17}-1$.

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %
@@ -1585,11 +1585,16 @@
 %    \end{macrocode}
 % \end{variable}
 %
-% \begin{variable}{\l_keys_key_str, \l_keys_key_tl}
-%   The name of a key itself: needed when setting keys. The |tl| version
-%   is deprecated but has to be handled manually.
+% \begin{variable}{\l_keys_key_str}
+%   The name of a key itself: needed when setting keys.
 %    \begin{macrocode}
 \str_new:N \l_keys_key_str
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}[deprecated]{\l_keys_key_tl}
+%   The |tl| version is deprecated but has to be handled manually.
+%    \begin{macrocode}
 \tl_new:N \l_keys_key_tl
 %    \end{macrocode}
 % \end{variable}
@@ -1616,12 +1621,17 @@
 %    \end{macrocode}
 % \end{variable}
 %
-% \begin{variable}{\l_keys_path_str, \l_keys_path_tl}
+% \begin{variable}{\l_keys_path_str}
 %   The \enquote{path} of the current key is stored here: this is
-%   available to the programmer and so is public. The older version is
-%   deprecated but has to be handled manually.
+%   available to the programmer and so is public.
 %    \begin{macrocode}
 \str_new:N \l_keys_path_str
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}[deprecated]{\l_keys_path_tl}
+%   The older version is deprecated but has to be handled manually.
+%    \begin{macrocode}
 \tl_new:N \l_keys_path_tl
 %    \end{macrocode}
 % \end{variable}
@@ -3593,39 +3603,7 @@
 \prop_gput:Nnn \g_msg_module_type_prop { keys } { }
 %    \end{macrocode}
 %
-% \subsection{Deprecated functions}
-%
-% \begin{macro}{.str_set_x:N, .str_set_x:c}
-% \begin{macro}{.str_gset_x:N, .str_gset_x:c}
 %    \begin{macrocode}
-\cs_new_protected:cpn { \c_@@_props_root_str .str_set_x:N } #1
-  { \@@_variable_set:NnnN #1 { str } { } x }
-\cs_new_protected:cpn { \c_@@_props_root_str .str_set_x:c } #1
-  { \@@_variable_set:cnnN {#1} { str } { } x }
-\cs_new_protected:cpn { \c_@@_props_root_str .str_gset_x:N } #1
-  { \@@_variable_set:NnnN #1 { str } { g } x }
-\cs_new_protected:cpn { \c_@@_props_root_str .str_gset_x:c } #1
-  { \@@_variable_set:cnnN {#1} { str } { g } x }
-%    \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{.tl_set_x:N, .tl_set_x:c}
-% \begin{macro}{.tl_gset_x:N, .tl_gset_x:c}
-%    \begin{macrocode}
-\cs_new_protected:cpn { \c_@@_props_root_str .tl_set_x:N } #1
-  { \@@_variable_set:NnnN #1 { tl } { } x }
-\cs_new_protected:cpn { \c_@@_props_root_str .tl_set_x:c } #1
-  { \@@_variable_set:cnnN {#1} { tl } { } x }
-\cs_new_protected:cpn { \c_@@_props_root_str .tl_gset_x:N } #1
-  { \@@_variable_set:NnnN #1 { tl } { g } x }
-\cs_new_protected:cpn { \c_@@_props_root_str .tl_gset_x:c } #1
-  { \@@_variable_set:cnnN {#1} { tl } { g } x }
-%    \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-%    \begin{macrocode}
 %</package>
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %
@@ -450,7 +450,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{md5.HEX}
+% \begin{macro}[int]{md5.HEX}
 % Hash a string and return the hash in uppercase hexadecimal format.
 % In some engines, this is build-in. For traditional \LuaTeX{}, the conversion
 % to hexadecimal has to be done by us.
@@ -681,7 +681,7 @@
   if status.ini_version then
 %    \end{macrocode}
 %
-% \begin{macro}{register_luadata}
+% \begin{macro}[int]{register_luadata}
 % \texttt{register_luadata} is only available during format generation.
 % It accept a string which uniquely identifies the data object and has to be
 % provided to retrieve it later. Additionally it accepts a function which is
@@ -716,7 +716,7 @@
   else
 %    \end{macrocode}
 %
-% \begin{macro}{get_luadata}
+% \begin{macro}[int]{get_luadata}
 % \texttt{get_luadata} is only available if data should be restored.
 % It accept the identifier which was used when the data object was registered and
 % returns the associated object. Every object can only be retrieved once.

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %
@@ -1461,7 +1461,7 @@
 %<*lua>
 %    \end{macrocode}
 %
-% \begin{macro}{\tex_strcmp:D}
+% \begin{macro}[no-user-doc]{\tex_strcmp:D}
 %   Compare two strings, expanding to |0| if they are equal,
 %   |-1| if the first one is smaller and |1| if the second one is smaller.
 %   Here \enquote{smaller} refers to codepoint order which does not correspond to
@@ -1482,7 +1482,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\tex_Ucharcat:D}
+% \begin{macro}[no-user-doc]{\tex_Ucharcat:D}
 %   Creating arbitrary chars using |tex.cprint|.
 %   The alternative approach using |token.new(...)| is about 10\% slower
 %   but needed to create arbitrary space tokens.
@@ -1501,7 +1501,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\tex_filesize:D}
+% \begin{macro}[no-user-doc]{\tex_filesize:D}
 %   Wrap the function from |ltxutils|.
 %    \begin{macrocode}
 luacmd('tex_filesize:D', function()
@@ -1511,7 +1511,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\tex_mdfivesum:D}
+% \begin{macro}[no-user-doc]{\tex_mdfivesum:D}
 %   There are two cases: Either hash a file or a string.
 %   Both are already implemented in l3luatex or built-in.
 %    \begin{macrocode}
@@ -1527,7 +1527,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\tex_filemoddate:D}
+% \begin{macro}[no-user-doc]{\tex_filemoddate:D}
 %   A primitive for getting the modification date of a file.
 %    \begin{macrocode}
 luacmd('tex_filemoddate:D', function()
@@ -1537,7 +1537,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\tex_filedump:D}
+% \begin{macro}[no-user-doc]{\tex_filedump:D}
 %   An emulated primitive for getting a hexdump from a (partial) file.
 %   The length has a default of |0|. This is consistent with
 %   \pdfTeX, but it effectivly makes the primitive useless without an

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3pdf.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3pdf.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3pdf.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %
@@ -369,7 +369,7 @@
 %
 % \subsection{Version}
 %
-% \begin{macro}{\pdf_version_compare:Nn}
+% \begin{macro}[pTF,EXP]{\pdf_version_compare:Nn}
 % \begin{macro}
 %   {
 %     @@_version_compare_=:w ,
@@ -522,34 +522,7 @@
   }
 %    \end{macrocode}
 %
-% \subsection{Deprecated functions}
-%
-% \begin{variable}{\g_@@_object_prop}
-%   For tracking objects.
 %    \begin{macrocode}
-\prop_new:N \g_@@_object_prop
-%    \end{macrocode}
-% \end{variable}
-%
-% \begin{macro}{\pdf_object_new:nn, \pdf_object_write:nn, \pdf_object_write:nx}
-%   Wrap up the type data in a prop.
-%    \begin{macrocode}
-\cs_new_protected:Npn \pdf_object_new:nn #1#2
-  {
-    \prop_gput:Nnn \g_@@_object_prop {#1} {#2}
-    \@@_backend_object_new:n {#1}
-  }
-\cs_new_protected:Npn \pdf_object_write:nn #1#2
-  {
-    \exp_args:Nne \@@_backend_object_write:nnn
-      {#1} { \prop_item:Nn \g_@@_object_prop {#1} } {#2}
-    \bool_gset_true:N \g_@@_init_bool
-  }
-\cs_generate_variant:Nn \pdf_object_write:nn { nx }
-%    \end{macrocode}
-% \end{macro}
-%
-%    \begin{macrocode}
 %</package>
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %
@@ -330,12 +330,13 @@
 %   based on this result.
 % \end{function}
 %
-% \begin{function}[EXP, added = 2021-11-01]{\bool_to_str:N, \bool_to_str:c, \bool_to_str:n}
+% \begin{function}[EXP, added = 2021-11-01, updated = 2023-11-14]
+%   {\bool_to_str:N, \bool_to_str:c, \bool_to_str:n}
 %   \begin{syntax}
 %     \cs{bool_to_str:N} \meta{boolean}
 %     \cs{bool_to_str:n} \meta{boolean expression}
 %   \end{syntax}
-%   Expands to the letters \texttt{true} or \texttt{false} depending on
+%   Expands to the string \texttt{true} or \texttt{false} depending on
 %   the logical truth of the \meta{boolean} or \meta{boolean
 %   expression}.
 % \end{function}
@@ -1048,11 +1049,19 @@
 % \end{macro}
 %
 % \begin{macro}[EXP]{\bool_to_str:N, \bool_to_str:c, \bool_to_str:n}
-%   Expands to \texttt{true} or \texttt{false} with category code letter.
+%   Expands to string literal \texttt{true} or \texttt{false}.
 %    \begin{macrocode}
-\cs_new:Npn \bool_to_str:N #1 { \bool_if:NTF #1 { true } { false } }
+\cs_new:Npe \bool_to_str:N #1
+  {
+    \exp_not:N \bool_if:NTF #1
+      { \tl_to_str:n { true } } { \tl_to_str:n { false } }
+  }
 \cs_generate_variant:Nn \bool_to_str:N { c }
-\cs_new:Npn \bool_to_str:n #1 { \bool_if:nTF {#1} { true } { false } }
+\cs_new:Npe \bool_to_str:n #1
+  {
+    \exp_not:N \bool_if:nTF {#1}
+      { \tl_to_str:n { true } } { \tl_to_str:n { false } }
+  }
 %    \end{macrocode}
 % \end{macro}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %
@@ -667,7 +667,7 @@
 % \begin{function}[noTF, added = 2017-05-26]
 %   {
 %     \regex_extract_once:nnN, \regex_extract_once:nVN,
-%     \regex_extract_once:NVN, \regex_extract_once:NVN
+%     \regex_extract_once:NnN, \regex_extract_once:NVN
 %   }
 %   \begin{syntax}
 %     \cs{regex_extract_once:nnN} \Arg{regex} \Arg{token list} \meta{seq~var}
@@ -6683,7 +6683,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[noTF]{\regex_case_replace_all:nN}
+% \begin{macro}[noTF]{\regex_replace_case_all:nN}
 %   If the input is bad (odd number of items) then take the false
 %   branch.  Otherwise, use the same auxiliary as
 %   \cs{regex_replace_all:nnN}, but with more complicated code to build

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %
@@ -1413,7 +1413,7 @@
 %   \seq_gput_left:Nn, \seq_gput_left:NV, \seq_gput_left:Nv, \seq_gput_left:Ne,
 %   \seq_gput_left:No, \seq_gput_left:Nx,
 %   \seq_gput_left:cn, \seq_gput_left:cV, \seq_gput_left:cv, \seq_gput_left:ce,
-%   \seq_gput_left:co, \seq_put_left:cx
+%   \seq_gput_left:co, \seq_gput_left:cx
 % }
 % \begin{macro}[EXP]{\@@_put_left_aux:w}
 %   When adding to the left of a sequence, remove \cs{s_@@}.  This is
@@ -1525,7 +1525,7 @@
 %   {
 %     \seq_remove_all:Nn, \seq_remove_all:NV, \seq_remove_all:Ne,
 %     \seq_remove_all:Nx,
-%     \seq_remove_all:cn, \seq_remove_all:cV, \seq_remove_all:ce
+%     \seq_remove_all:cn, \seq_remove_all:cV, \seq_remove_all:ce,
 %     \seq_remove_all:cx,
 %   }
 % \UnitTested

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %
@@ -343,13 +343,13 @@
 %    \end{macrocode}
 % \end{variable}
 %
-% \begin{variable}{str_byte, str_error}
+% \begin{variable}{@@_byte, @@_error}
 %   Conversions from one \meta{encoding}/\meta{escaping} pair to another
 %   are done within \texttt{e}-expanding assignments. Errors are
 %   signalled by raising the relevant flag.
 %    \begin{macrocode}
-\flag_new:n { str_byte }
-\flag_new:n { str_error }
+\flag_new:n { @@_byte }
+\flag_new:n { @@_error }
 %    \end{macrocode}
 % \end{variable}
 %
@@ -714,6 +714,8 @@
         { encode } { escape }
         \use_ii_i:nn
         \@@_convert_encode_:
+        \__kernel_tl_gset:Ne \g_@@_result_tl
+          { \tl_to_str:V \g_@@_result_tl }
     \group_end:
     #2 #3 \g_@@_result_tl
   }
@@ -891,7 +893,7 @@
 % \begin{macro}[rEXP]{\@@_filter_bytes_aux:N}
 %   In the case of 8-bit engines, every character is a byte.  For
 %   Unicode-aware engines, test the character code; non-bytes cause us
-%   to raise the flag \texttt{str_byte}.  Spaces have already been given
+%   to raise the flag \texttt{@@_byte}.  Spaces have already been given
 %   the correct category code when this function is called.
 %    \begin{macrocode}
 \bool_lazy_any:nTF
@@ -912,7 +914,7 @@
         \if_int_compare:w `#1 < 256 \exp_stop_f:
           #1
         \else:
-          \flag_raise:n { str_byte }
+          \flag_raise:n { @@_byte }
         \fi:
         \@@_filter_bytes_aux:N
       }
@@ -935,10 +937,10 @@
   {
     \cs_new_protected:Npn \@@_convert_unescape_:
       {
-        \flag_clear:n { str_byte }
+        \flag_clear:n { @@_byte }
         \__kernel_tl_gset:Ne \g_@@_result_tl
           { \exp_args:No \@@_filter_bytes:n \g_@@_result_tl }
-        \@@_if_flag_error:nne { str_byte } { non-byte } { bytes }
+        \@@_if_flag_error:nne { @@_byte } { non-byte } { bytes }
       }
   }
   { \cs_new_protected:Npn \@@_convert_unescape_: { } }
@@ -995,15 +997,15 @@
   {
     \cs_new_protected:Npn \@@_convert_encode_:
       {
-        \flag_clear:n { str_error }
+        \flag_clear:n { @@_error }
         \@@_convert_gmap_internal:N \@@_encode_native_char:n
-        \@@_if_flag_error:nne { str_error }
+        \@@_if_flag_error:nne { @@_error }
           { native-overflow } { }
       }
     \cs_new:Npn \@@_encode_native_char:n #1
       {
         \if_int_compare:w #1 > \c_@@_max_byte_int
-          \flag_raise:n { str_error }
+          \flag_raise:n { @@_error }
           ?
         \else:
           \char_generate:nn {#1} {12}
@@ -1184,9 +1186,9 @@
         \exp_not:N \@@_decode_eight_bit_aux:Nn
         \exp_not:c { g_@@_decode_#1_intarray }
       }
-    \flag_clear:n { str_error }
+    \flag_clear:n { @@_error }
     \@@_convert_gmap:N \@@_tmp:w
-    \@@_if_flag_error:nne { str_error } { decode-8-bit } {#1}
+    \@@_if_flag_error:nne { @@_error } { decode-8-bit } {#1}
   }
 \cs_new:Npn \@@_decode_eight_bit_aux:Nn #1#2
   {
@@ -1198,7 +1200,7 @@
 \cs_new:Npn \@@_decode_eight_bit_aux:n #1
   {
     \if_int_compare:w #1 < \c_zero_int
-      \flag_raise:n { str_error }
+      \flag_raise:n { @@_error }
       \int_value:w \c_@@_replacement_char_int
     \else:
       #1
@@ -1228,9 +1230,9 @@
         \exp_not:c { g_@@_encode_#1_intarray }
         \exp_not:c { g_@@_decode_#1_intarray }
       }
-    \flag_clear:n { str_error }
+    \flag_clear:n { @@_error }
     \@@_convert_gmap_internal:N \@@_tmp:w
-    \@@_if_flag_error:nne { str_error } { encode-8-bit } {#1}
+    \@@_if_flag_error:nne { @@_error } { encode-8-bit } {#1}
   }
 \cs_new:Npn \@@_encode_eight_bit_aux:NNn #1#2#3
   {
@@ -1246,7 +1248,7 @@
   {
     \int_compare:nNnTF { \intarray_item:Nn #3 { 1 + #1 } } = {#2}
       { \@@_output_byte:n {#1} }
-      { \flag_raise:n { str_error } }
+      { \flag_raise:n { @@_error } }
   }
 %    \end{macrocode}
 % \end{macro}
@@ -1266,7 +1268,7 @@
   {
     Since~native~strings~do~not~consist~in~bytes,~
     none~of~the~escaping~methods~make~sense.~
-    The~specified~escaping,~'#1',~will be ignored.
+    The~specified~escaping,~'#1',~will~be~ignored.
   }
 \msg_new:nnn { str } { file-not-found }
   { File~'l3str-#1.def'~not~found. }
@@ -1347,7 +1349,7 @@
 \cs_new_protected:Npn \@@_convert_unescape_hex:
   {
     \group_begin:
-      \flag_clear:n { str_error }
+      \flag_clear:n { @@_error }
       \int_set:Nn \tex_escapechar:D { 92 }
       \__kernel_tl_gset:Ne \g_@@_result_tl
         {
@@ -1358,7 +1360,7 @@
             \prg_break_point:
           \@@_output_end:
         }
-      \@@_if_flag_error:nne { str_error } { unescape-hex } { }
+      \@@_if_flag_error:nne { @@_error } { unescape-hex } { }
     \group_end:
   }
 \cs_new:Npn \@@_unescape_hex_auxi:N #1
@@ -1367,7 +1369,7 @@
     \@@_hexadecimal_use:NTF #1
       { \@@_unescape_hex_auxii:N }
       {
-        \flag_raise:n { str_error }
+        \flag_raise:n { @@_error }
         \@@_unescape_hex_auxi:N
       }
   }
@@ -1380,7 +1382,7 @@
         \@@_output_byte:w " \@@_unescape_hex_auxi:N
       }
       {
-        \flag_raise:n { str_error }
+        \flag_raise:n { @@_error }
         \@@_unescape_hex_auxii:N
       }
   }
@@ -1425,8 +1427,8 @@
     \cs_new_protected:cpn { @@_convert_unescape_#2: }
       {
         \group_begin:
-          \flag_clear:n { str_byte }
-          \flag_clear:n { str_error }
+          \flag_clear:n { @@_byte }
+          \flag_clear:n { @@_error }
           \int_set:Nn \tex_escapechar:D { 92 }
           \__kernel_tl_gset:Ne \g_@@_result_tl
             {
@@ -1434,8 +1436,8 @@
                 #1 ? { ? \prg_break: }
               \prg_break_point:
             }
-          \@@_if_flag_error:nne { str_byte } { non-byte } { #2 }
-          \@@_if_flag_error:nne { str_error } { unescape-#2 } { }
+          \@@_if_flag_error:nne { @@_byte } { non-byte } { #2 }
+          \@@_if_flag_error:nne { @@_error } { unescape-#2 } { }
         \group_end:
       }
     \cs_new:Npn #3 ##1#1##2##3
@@ -1448,12 +1450,12 @@
               \@@_hexadecimal_use:NTF ##3
                 { }
                 {
-                  \flag_raise:n { str_error }
+                  \flag_raise:n { @@_error }
                   * 0 + `#1 \use_i:nn
                 }
             }
             {
-              \flag_raise:n { str_error }
+              \flag_raise:n { @@_error }
               0 + `#1 \use_i:nn
             }
         \@@_output_end:
@@ -1511,8 +1513,8 @@
       \cs_new_protected:Npn \@@_convert_unescape_string:
         {
           \group_begin:
-            \flag_clear:n { str_byte }
-            \flag_clear:n { str_error }
+            \flag_clear:n { @@_byte }
+            \flag_clear:n { @@_error }
             \int_set:Nn \tex_escapechar:D { 92 }
             \__kernel_tl_gset:Ne \g_@@_result_tl
               {
@@ -1526,8 +1528,8 @@
                   \g_@@_result_tl #1 ?? { ? \prg_break: }
                 \prg_break_point:
               }
-            \@@_if_flag_error:nne { str_byte } { non-byte } { string }
-            \@@_if_flag_error:nne { str_error } { unescape-string } { }
+            \@@_if_flag_error:nne { @@_byte } { non-byte } { string }
+            \@@_if_flag_error:nne { @@_error } { unescape-string } { }
           \group_end:
         }
     }
@@ -1567,7 +1569,7 @@
                     { ^^J } { 0 - 1 }
                   }
                   {
-                    \flag_raise:n { str_error }
+                    \flag_raise:n { @@_error }
                     0 - 1 \use_i:nn
                   }
               }
@@ -1844,19 +1846,19 @@
 %   first remind the user what a correct \textsc{utf-8} string should
 %   look like, then add error-specific information.
 %    \begin{macrocode}
-\flag_clear_new:n { str_missing }
-\flag_clear_new:n { str_extra }
-\flag_clear_new:n { str_overlong }
-\flag_clear_new:n { str_overflow }
+\flag_clear_new:n { @@_missing }
+\flag_clear_new:n { @@_extra }
+\flag_clear_new:n { @@_overlong }
+\flag_clear_new:n { @@_overflow }
 \msg_new:nnnn { str } { utf8-decode }
   {
     Invalid~UTF-8~string:
     \exp_last_unbraced:Nf \use_none:n
       {
-        \@@_if_flag_times:nT { str_missing }  { ,~missing~continuation~byte }
-        \@@_if_flag_times:nT { str_extra }    { ,~extra~continuation~byte }
-        \@@_if_flag_times:nT { str_overlong } { ,~overlong~form }
-        \@@_if_flag_times:nT { str_overflow } { ,~code~point~too~large }
+        \@@_if_flag_times:nT { @@_missing }  { ,~missing~continuation~byte }
+        \@@_if_flag_times:nT { @@_extra }    { ,~extra~continuation~byte }
+        \@@_if_flag_times:nT { @@_overlong } { ,~overlong~form }
+        \@@_if_flag_times:nT { @@_overflow } { ,~code~point~too~large }
       }
     .
   }
@@ -1871,18 +1873,18 @@
         Code~point~    <~1114112:~11110xxx~10xxxxxx~10xxxxxx~10xxxxxx \\
       }
     Bytes~of~the~form~10xxxxxx~are~called~continuation~bytes.
-    \flag_if_raised:nT { str_missing }
+    \flag_if_raised:nT { @@_missing }
       {
         \\\\
         A~leading~byte~(in~the~range~[192,255])~was~not~followed~by~
         the~appropriate~number~of~continuation~bytes.
       }
-    \flag_if_raised:nT { str_extra }
+    \flag_if_raised:nT { @@_extra }
       {
         \\\\
         LaTeX~came~across~a~continuation~byte~when~it~was~not~expected.
       }
-    \flag_if_raised:nT { str_overlong }
+    \flag_if_raised:nT { @@_overlong }
       {
         \\\\
         Every~Unicode~code~point~must~be~expressed~in~the~shortest~
@@ -1889,7 +1891,7 @@
         possible~form.~For~instance,~'0xC0'~'0x83'~is~not~a~valid~
         representation~for~the~code~point~3.
       }
-    \flag_if_raised:nT { str_overflow }
+    \flag_if_raised:nT { @@_overflow }
       {
         \\\\
         Unicode~limits~code~points~to~the~range~[0,1114111].
@@ -1968,11 +1970,11 @@
 %    \begin{macrocode}
 \cs_new_protected:cpn { @@_convert_decode_utf8: }
   {
-    \flag_clear:n { str_error }
-    \flag_clear:n { str_missing }
-    \flag_clear:n { str_extra }
-    \flag_clear:n { str_overlong }
-    \flag_clear:n { str_overflow }
+    \flag_clear:n { @@_error }
+    \flag_clear:n { @@_missing }
+    \flag_clear:n { @@_extra }
+    \flag_clear:n { @@_overlong }
+    \flag_clear:n { @@_overflow }
     \__kernel_tl_gset:Ne \g_@@_result_tl
       {
         \exp_after:wN \@@_decode_utf_viii_start:N \g_@@_result_tl
@@ -1979,7 +1981,7 @@
           { \prg_break: \@@_decode_utf_viii_end: }
         \prg_break_point:
       }
-    \@@_if_flag_error:nne { str_error } { utf8-decode } { }
+    \@@_if_flag_error:nne { @@_error } { utf8-decode } { }
   }
 \cs_new:Npn \@@_decode_utf_viii_start:N #1
   {
@@ -1989,8 +1991,8 @@
       \if_int_compare:w `#1 < "80 \exp_stop_f:
         \int_value:w `#1
       \else:
-        \flag_raise:n { str_extra }
-        \flag_raise:n { str_error }
+        \flag_raise:n { @@_extra }
+        \flag_raise:n { @@_error }
         \int_use:N \c_@@_replacement_char_int
       \fi:
     \else:
@@ -2013,8 +2015,8 @@
       \int_value:w \int_eval:n { #1 * "40 + `#3 - "80 } \exp_after:wN
     \else:
       \s_@@
-      \flag_raise:n { str_missing }
-      \flag_raise:n { str_error }
+      \flag_raise:n { @@_missing }
+      \flag_raise:n { @@_error }
       \int_use:N \c_@@_replacement_char_int
     \fi:
     \s_@@
@@ -2027,8 +2029,8 @@
     \if_int_compare:w #1 < #4 \exp_stop_f:
       \s_@@
       \if_int_compare:w #1 < #3 \exp_stop_f:
-        \flag_raise:n { str_overlong }
-        \flag_raise:n { str_error }
+        \flag_raise:n { @@_overlong }
+        \flag_raise:n { @@_error }
         \int_use:N \c_@@_replacement_char_int
       \else:
         #1
@@ -2047,15 +2049,15 @@
 \cs_new:Npn \@@_decode_utf_viii_overflow:w #1 \fi: #2 \fi:
   {
     \fi: \fi:
-    \flag_raise:n { str_overflow }
-    \flag_raise:n { str_error }
+    \flag_raise:n { @@_overflow }
+    \flag_raise:n { @@_error }
     \int_use:N \c_@@_replacement_char_int
   }
 \cs_new:Npn \@@_decode_utf_viii_end:
   {
     \s_@@
-    \flag_raise:n { str_missing }
-    \flag_raise:n { str_error }
+    \flag_raise:n { @@_missing }
+    \flag_raise:n { @@_error }
     \int_use:N \c_@@_replacement_char_int \s_@@
     \prg_break:
   }
@@ -2117,10 +2119,10 @@
     { \@@_encode_utf_xvi_aux:N \@@_output_byte_pair_le:n }
   \cs_new_protected:Npn \@@_encode_utf_xvi_aux:N #1
     {
-      \flag_clear:n { str_error }
+      \flag_clear:n { @@_error }
       \cs_set_eq:NN \@@_tmp:w #1
       \@@_convert_gmap_internal:N \@@_encode_utf_xvi_char:n
-      \@@_if_flag_error:nne { str_error } { utf16-encode } { }
+      \@@_if_flag_error:nne { @@_error } { utf16-encode } { }
     }
   \cs_new:Npn \@@_encode_utf_xvi_char:n #1
     {
@@ -2129,7 +2131,7 @@
       \else:
         \if_int_compare:w #1 < "10000 \exp_stop_f:
           \if_int_compare:w #1 < "E000 \exp_stop_f:
-            \flag_raise:n { str_error }
+            \flag_raise:n { @@_error }
             \@@_tmp:w { \c_@@_replacement_char_int }
           \else:
             \@@_tmp:w {#1}
@@ -2160,9 +2162,9 @@
 %   an unexpected trail surrogate, and a string containing an odd number
 %   of bytes.
 %    \begin{macrocode}
-  \flag_clear_new:n { str_missing }
-  \flag_clear_new:n { str_extra }
-  \flag_clear_new:n { str_end }
+  \flag_clear_new:n { @@_missing }
+  \flag_clear_new:n { @@_extra }
+  \flag_clear_new:n { @@_end }
   \msg_new:nnnn { str } { utf16-encode }
     { Unicode~string~cannot~be~expressed~in~UTF-16:~surrogate. }
     {
@@ -2175,9 +2177,9 @@
       Invalid~UTF-16~string:
       \exp_last_unbraced:Nf \use_none:n
         {
-          \@@_if_flag_times:nT { str_missing }  { ,~missing~trail~surrogate }
-          \@@_if_flag_times:nT { str_extra }    { ,~extra~trail~surrogate }
-          \@@_if_flag_times:nT { str_end }      { ,~odd~number~of~bytes }
+          \@@_if_flag_times:nT { @@_missing }  { ,~missing~trail~surrogate }
+          \@@_if_flag_times:nT { @@_extra }    { ,~extra~trail~surrogate }
+          \@@_if_flag_times:nT { @@_end }      { ,~odd~number~of~bytes }
         }
       .
     }
@@ -2194,17 +2196,17 @@
         }
       Lead~surrogates~are~pairs~of~bytes~in~the~range~[0xD800,~0xDBFF],~
       and~trail~surrogates~are~in~the~range~[0xDC00,~0xDFFF].
-      \flag_if_raised:nT { str_missing }
+      \flag_if_raised:nT { @@_missing }
         {
           \\\\
           A~lead~surrogate~was~not~followed~by~a~trail~surrogate.
         }
-      \flag_if_raised:nT { str_extra }
+      \flag_if_raised:nT { @@_extra }
         {
           \\\\
           LaTeX~came~across~a~trail~surrogate~when~it~was~not~expected.
         }
-      \flag_if_raised:nT { str_end }
+      \flag_if_raised:nT { @@_end }
         {
           \\\\
           The~string~contained~an~odd~number~of~bytes.~This~is~invalid:~
@@ -2258,10 +2260,10 @@
     }
   \cs_new_protected:Npn \@@_decode_utf_xvi:Nw #1#2 \s_@@_stop
     {
-      \flag_clear:n { str_error }
-      \flag_clear:n { str_missing }
-      \flag_clear:n { str_extra }
-      \flag_clear:n { str_end }
+      \flag_clear:n { @@_error }
+      \flag_clear:n { @@_missing }
+      \flag_clear:n { @@_extra }
+      \flag_clear:n { @@_end }
       \cs_set:Npn \@@_tmp:w ##1 ##2 { ` ## #1 }
       \__kernel_tl_gset:Ne \g_@@_result_tl
         {
@@ -2269,7 +2271,7 @@
             #2 \q_@@_nil \q_@@_nil
           \prg_break_point:
         }
-      \@@_if_flag_error:nne { str_error } { utf16-decode } { }
+      \@@_if_flag_error:nne { @@_error } { utf16-decode } { }
     }
 %    \end{macrocode}
 % \end{macro}
@@ -2375,7 +2377,7 @@
     { \@@_decode_utf_xvi_error:nNN { extra } #1#2 }
   \cs_new:Npn \@@_decode_utf_xvi_error:nNN #1#2#3
     {
-      \flag_raise:n { str_error }
+      \flag_raise:n { @@_error }
       \flag_raise:n { str_#1 }
       #2 #3 \s_@@
       \int_use:N \c_@@_replacement_char_int \s_@@
@@ -2454,7 +2456,7 @@
 % \end{macro}
 % \end{macro}
 %
-% \begin{variable}{str_overflow, str_end}
+% \begin{variable}{@@_overflow, @@_end}
 %   There can be no error when encoding in \textsc{utf-32}. When
 %   decoding, the string may not have length $4n$, or it may contain
 %   code points larger than \hexnum{10FFFF}. The latter case often
@@ -2461,15 +2463,15 @@
 %   happens if the encoding was in fact not \textsc{utf-32}, because
 %   most arbitrary strings are not valid in \textsc{utf-32}.
 %    \begin{macrocode}
-  \flag_clear_new:n { str_overflow }
-  \flag_clear_new:n { str_end }
+  \flag_clear_new:n { @@_overflow }
+  \flag_clear_new:n { @@_end }
   \msg_new:nnnn { str } { utf32-decode }
     {
       Invalid~UTF-32~string:
       \exp_last_unbraced:Nf \use_none:n
         {
-          \@@_if_flag_times:nT { str_overflow } { ,~code~point~too~large }
-          \@@_if_flag_times:nT { str_end }      { ,~truncated~string }
+          \@@_if_flag_times:nT { @@_overflow } { ,~code~point~too~large }
+          \@@_if_flag_times:nT { @@_end }      { ,~truncated~string }
         }
       .
     }
@@ -2476,7 +2478,7 @@
     {
       In~the~UTF-32~encoding,~every~Unicode~character~
       (in~the~range~[U+0000,~U+10FFFF])~is~encoded~as~4~bytes.
-      \flag_if_raised:nT { str_overflow }
+      \flag_if_raised:nT { @@_overflow }
         {
           \\\\
           LaTeX~came~across~a~code~point~larger~than~1114111,~
@@ -2483,7 +2485,7 @@
           the~maximum~code~point~defined~by~Unicode.~
           Perhaps~the~string~was~not~encoded~in~the~UTF-32~encoding?
         }
-      \flag_if_raised:nT { str_end }
+      \flag_if_raised:nT { @@_end }
         {
           \\\\
           The~length~of~the~string~is~not~a~multiple~of~4.~
@@ -2547,9 +2549,9 @@
     }
   \cs_new_protected:Npn \@@_decode_utf_xxxii:Nw #1#2 \s_@@_stop
     {
-      \flag_clear:n { str_overflow }
-      \flag_clear:n { str_end }
-      \flag_clear:n { str_error }
+      \flag_clear:n { @@_overflow }
+      \flag_clear:n { @@_end }
+      \flag_clear:n { @@_error }
       \cs_set:Npn \@@_tmp:w ##1 ##2 { ` ## #1 }
       \__kernel_tl_gset:Ne \g_@@_result_tl
         {
@@ -2557,7 +2559,7 @@
             #2 \s_@@_stop \s_@@_stop \s_@@_stop \s_@@_stop
           \prg_break_point:
         }
-      \@@_if_flag_error:nne { str_error } { utf32-decode } { }
+      \@@_if_flag_error:nne { @@_error } { utf32-decode } { }
     }
   \cs_new:Npn \@@_decode_utf_xxxii_loop:NNNN #1#2#3#4
     {
@@ -2566,13 +2568,13 @@
       \fi:
       #1#2#3#4 \s_@@
       \if_int_compare:w \@@_tmp:w #1#4 > \c_zero_int
-        \flag_raise:n { str_overflow }
-        \flag_raise:n { str_error }
+        \flag_raise:n { @@_overflow }
+        \flag_raise:n { @@_error }
         \int_use:N \c_@@_replacement_char_int
       \else:
         \if_int_compare:w \@@_tmp:w #2#3 > 16 \exp_stop_f:
-          \flag_raise:n { str_overflow }
-          \flag_raise:n { str_error }
+          \flag_raise:n { @@_overflow }
+          \flag_raise:n { @@_error }
           \int_use:N \c_@@_replacement_char_int
         \else:
           \int_eval:n
@@ -2586,8 +2588,8 @@
     {
       \tl_if_empty:nF {#1}
         {
-          \flag_raise:n { str_end }
-          \flag_raise:n { str_error }
+          \flag_raise:n { @@_end }
+          \flag_raise:n { @@_error }
           #1 \s_@@
           \int_use:N \c_@@_replacement_char_int \s_@@
         }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %
@@ -127,7 +127,11 @@
 %   Clears the content of the \meta{str~var}.
 % \end{function}
 %
-% \begin{function}[added = 2015-09-18]{\str_clear_new:N, \str_clear_new:c}
+% \begin{function}[added = 2015-09-18]
+%   {
+%      \str_clear_new:N, \str_clear_new:c,
+%      \str_gclear_new:N, \str_gclear_new:c
+%    }
 %   \begin{syntax}
 %     \cs{str_clear_new:N} \meta{str~var}
 %   \end{syntax}
@@ -839,6 +843,10 @@
 %   code $12$.
 % \end{variable}
 %
+% \begin{variable}[added = 2023-12-07]{\c_empty_str}
+%   Constant that is always empty.
+% \end{variable}
+%
 % \section{Scratch strings}
 %
 % \begin{variable}{\l_tmpa_str, \l_tmpb_str}
@@ -855,16 +863,6 @@
 %   code and so should only be used for short-term storage.
 % \end{variable}
 %
-% \section{Deprecated functions}
-%
-% \begin{function}[EXP, added = 2019-11-26]
-%   {\str_foldcase:n, \str_foldcase:V}
-%   \begin{syntax}
-%     \cs{str_foldcase:n} \Arg{tokens}
-%   \end{syntax}
-%   A previous name for the functionally-identical \cs{str_casefold:n}.
-% \end{function}
-%
 % \end{documentation}
 %
 % \begin{implementation}
@@ -989,33 +987,53 @@
 %     \str_gput_right:Nn, \str_gput_right:NV, \str_gput_right:Ne, \str_gput_right:Nx,
 %     \str_gput_right:cn, \str_gput_right:cV, \str_gput_right:ce, \str_gput_right:cx
 %   }
-%   Simply convert the token list inputs to \meta{strings}.
+%   Similar to corresponding \pkg{l3tl} base functions, except that
+%   \cs{__kernel_exp_not:w} is replaced with \cs{__kernel_tl_to_str:w}.
+%   Just like token list, string constants use \cs{cs_gset_nopar:Npe}
+%   instead of \cs{__kernel_tl_gset:Ne} so that the scope checking for
+%   |c| is applied when \pkg{l3debug} is used.
+%   To maintain backward compatibility, in
+%     \cs[index=str_put_left:Nn]{str_(g)put_left:Nn} and
+%     \cs[index=str_put_right:Nn]{str_(g)put_right:Nn},
+%   contents of string variables are wrapped in \cs{__kernel_exp_not:w}
+%   to prevent further expansion.
 %    \begin{macrocode}
-\group_begin:
-  \cs_set_protected:Npn \@@_tmp:n #1
-    {
-      \tl_if_blank:nF {#1}
-        {
-          \cs_new_protected:cpe { str_ #1 :Nn } ##1##2
-            {
-              \exp_not:c { tl_ #1 :Ne } ##1
-                { \exp_not:N \tl_to_str:n {##2} }
-            }
-          \cs_generate_variant:cn { str_ #1 :Nn }
-            { NV , Ne , Nx , cn , cV , ce , cx }
-          \@@_tmp:n
-        }
-    }
-  \@@_tmp:n
-    { set }
-    { gset }
-    { const }
-    { put_left }
-    { gput_left }
-    { put_right }
-    { gput_right }
-    { }
-\group_end:
+\cs_new_protected:Npn \str_set:Nn #1#2
+  { \__kernel_tl_set:Ne #1 { \__kernel_tl_to_str:w {#2} } }
+\cs_gset_protected:Npn \str_gset:Nn #1#2
+  { \__kernel_tl_gset:Ne #1 { \__kernel_tl_to_str:w {#2} } }
+\cs_new_protected:Npn \str_const:Nn #1#2
+  {
+    \__kernel_chk_if_free_cs:N #1
+    \cs_gset_nopar:Npe #1 { \__kernel_tl_to_str:w {#2} }
+  }
+\cs_new_protected:Npn \str_put_left:Nn #1#2
+  {
+    \__kernel_tl_set:Ne #1
+      { \__kernel_tl_to_str:w {#2} \__kernel_exp_not:w \exp_after:wN {#1} }
+  }
+\cs_new_protected:Npn \str_gput_left:Nn #1#2
+  {
+    \__kernel_tl_gset:Ne #1
+      { \__kernel_tl_to_str:w {#2} \__kernel_exp_not:w \exp_after:wN {#1} }
+  }
+\cs_new_protected:Npn \str_put_right:Nn #1#2
+  {
+    \__kernel_tl_set:Ne #1
+      { \__kernel_exp_not:w \exp_after:wN {#1} \__kernel_tl_to_str:w {#2} }
+  }
+\cs_new_protected:Npn \str_gput_right:Nn #1#2
+  {
+    \__kernel_tl_gset:Ne #1
+      { \__kernel_exp_not:w \exp_after:wN {#1} \__kernel_tl_to_str:w {#2} }
+  }
+\cs_generate_variant:Nn \str_set:Nn        { NV , Ne , Nx , c , cV , ce , cx }
+\cs_generate_variant:Nn \str_gset:Nn       { NV , Ne , Nx , c , cV , ce , cx }
+\cs_generate_variant:Nn \str_const:Nn      { NV , Ne , Nx , c , cV , ce , cx }
+\cs_generate_variant:Nn \str_put_left:Nn   { NV , Ne , Nx , c , cV , ce , cx }
+\cs_generate_variant:Nn \str_gput_left:Nn  { NV , Ne , Nx , c , cV , ce , cx }
+\cs_generate_variant:Nn \str_put_right:Nn  { NV , Ne , Nx , c , cV , ce , cx }
+\cs_generate_variant:Nn \str_gput_right:Nn { NV , Ne , Nx , c , cV , ce , cx }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -2158,6 +2176,13 @@
 %    \end{macrocode}
 % \end{variable}
 %
+% \begin{variable}{\c_empty_str}
+%   An empty string is simply an empty token list.
+%    \begin{macrocode}
+\cs_new_eq:NN \c_empty_str \c_empty_tl
+%    \end{macrocode}
+% \end{variable}
+%
 % \begin{variable}{\l_tmpa_str, \l_tmpb_str, \g_tmpa_str, \g_tmpb_str}
 %   Scratch strings.
 %    \begin{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %
@@ -260,6 +260,11 @@
 %   \meta{shell command}.  The \cs{sys_get_shell:nnNTF} conditional
 %   inserts the \meta{true code} if the shell is available and no quote is
 %   detected, and the \meta{false code} otherwise.
+%
+%   \emph{Note}: It is not possible to tell from \TeX{} if a command is allowed
+%   in restricted shell escape. If restricted escape is enabled, the
+%   \texttt{true} branch is taken: if the command is forbidden at this stage, a
+%   low-level \TeX{} error will arise.
 % \end{function}
 %
 % \begin{variable}[added = 2017-05-27]{\c_sys_shell_escape_int}
@@ -861,11 +866,11 @@
 %
 % \subsection{Dynamic (every job) code}
 %
-% \begin{macro}{\sys_everyjob:}
+% \begin{macro}{\__kernel_sys_everyjob:}
 % \begin{macro}{\@@_everyjob:n}
 % \begin{variable}{\g_@@_everyjob_tl}
 %    \begin{macrocode}
-\cs_new_protected:Npn \sys_everyjob:
+\cs_new_protected:Npn \__kernel_sys_everyjob:
   {
     \tl_use:N \g_@@_everyjob_tl
     \tl_gclear:N \g_@@_everyjob_tl
@@ -1088,7 +1093,7 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \sys_finalise:
   {
-    \sys_everyjob:
+    \__kernel_sys_everyjob:
     \tl_use:N \g_@@_finalise_tl
     \tl_gclear:N \g_@@_finalise_tl
   }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %
@@ -1634,7 +1634,7 @@
 % \begin{macro}[EXP]{\@@_change_case_boundary_upper_el:nnnN}
 % \begin{macro}[EXP]{\@@_change_case_boundary_upper_el:nnnn}
 % \begin{macro}[EXP]{\@@_change_case_boundary_upper_el:nnnnw}
-%   There is one things that need special treatment at start start of
+%   There is one things that need special treatment at the start of
 %   words in Greek. For an isolated accent \emph{eta},
 %   which is handled by seeing if we have exactly one of the affected
 %   codepoints followed by a space or brace group.

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3text-map.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3text-map.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3text-map.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %
@@ -368,7 +368,7 @@
 %    \end{macrocode}
 %   Hangul needs additional treatment. First we have to deal with
 %   the start-of-Hangul position: output what we had up to now, then
-%   move the the specialist handler. The idea here is to pick off the
+%   move the specialist handler. The idea here is to pick off the
 %   different codepoint types one at a time, tracking what else can be
 %   considered at each stage until we hit the end of the viable types.
 %   Other than that, we just keep building up the Hangul codepoints

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3text.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3text.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3text.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %
@@ -794,7 +794,7 @@
 %
 % \subsection{Configuration variables}
 %
-% \begin{variable}{\l_text_accents_tl, \l_text_letterlike_tl}
+% \begin{variable}[deprecated]{\l_text_accents_tl, \l_text_letterlike_tl}
 %   Used to be used for excluding these ideas from expansion: now deprecated.
 %    \begin{macrocode}
 \tl_new:N \l_text_accents_tl

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %
@@ -295,7 +295,11 @@
 %   or \cs{str_if_eq:nnTF} if category codes are not important.
 % \end{function}
 %
-% \begin{function}[TF]{\tl_if_in:Nn, \tl_if_in:NV, \tl_if_in:cn, \tl_if_in:cV}
+% \begin{function}[TF]
+%   {
+%     \tl_if_in:Nn, \tl_if_in:NV, \tl_if_in:No,
+%     \tl_if_in:cn, \tl_if_in:cV, \tl_if_in:co
+%   }
 %   \begin{syntax}
 %     \cs{tl_if_in:NnTF} \meta{tl~var} \Arg{token list} \Arg{true code} \Arg{false code}
 %   \end{syntax}
@@ -307,7 +311,10 @@
 % \end{function}
 %
 % \begin{function}[TF]
-%   {\tl_if_in:nn, \tl_if_in:Vn, \tl_if_in:nV, \tl_if_in:on, \tl_if_in:no}
+%   {
+%     \tl_if_in:nn, \tl_if_in:Vn, \tl_if_in:VV, \tl_if_in:on, \tl_if_in:oo,
+%     \tl_if_in:nV, \tl_if_in:no
+%   }
 %   \begin{syntax}
 %     \cs{tl_if_in:nnTF} \Arg{token list_1} \Arg{token list_2} \Arg{true code} \Arg{false code}
 %   \end{syntax}
@@ -367,7 +374,10 @@
 % \subsection{Testing the first token}
 %
 % \begin{function}[updated = 2012-07-09, EXP, pTF]
-%   {\tl_if_head_eq_catcode:nN, \tl_if_head_eq_catcode:oN}
+%   {
+%     \tl_if_head_eq_catcode:nN, \tl_if_head_eq_catcode:VN,
+%     \tl_if_head_eq_catcode:eN, \tl_if_head_eq_catcode:oN
+%   }
 %   \begin{syntax}
 %     \cs{tl_if_head_eq_catcode_p:nN} \Arg{token list} \meta{test token}
 %     \cs{tl_if_head_eq_catcode:nNTF} \Arg{token list} \meta{test token}
@@ -379,7 +389,10 @@
 % \end{function}
 %
 % \begin{function}[updated = 2012-07-09, EXP, pTF]
-%   {\tl_if_head_eq_charcode:nN, \tl_if_head_eq_charcode:fN}
+%   {
+%     \tl_if_head_eq_charcode:nN, \tl_if_head_eq_charcode:VN,
+%     \tl_if_head_eq_charcode:eN, \tl_if_head_eq_charcode:fN
+%   }
 %   \begin{syntax}
 %     \cs{tl_if_head_eq_charcode_p:nN} \Arg{token list} \meta{test token}
 %     \cs{tl_if_head_eq_charcode:nNTF} \Arg{token list} \meta{test token}
@@ -390,7 +403,11 @@
 %   \meta{token list} is empty, the test is always \texttt{false}.
 % \end{function}
 %
-% \begin{function}[updated = 2012-07-09, EXP, pTF]{\tl_if_head_eq_meaning:nN}
+% \begin{function}[updated = 2012-07-09, EXP, pTF]
+%   {
+%     \tl_if_head_eq_meaning:nN, \tl_if_head_eq_meaning:VN,
+%     \tl_if_head_eq_meaning:eN
+%   }
 %   \begin{syntax}
 %     \cs{tl_if_head_eq_meaning_p:nN} \Arg{token list} \meta{test token}
 %     \cs{tl_if_head_eq_meaning:nNTF} \Arg{token list} \meta{test token}
@@ -516,7 +533,7 @@
 % \subsection{Counting and reversing token lists}
 %
 % \begin{function}[added = 2012-05-13, EXP]
-%   {\tl_count:n, \tl_count:V, \tl_count:o}
+%   {\tl_count:n, \tl_count:V, \tl_count:v, \tl_count:e, \tl_count:o}
 %   \begin{syntax}
 %     \cs{tl_count:n} \Arg{tokens}
 %   \end{syntax}
@@ -1352,8 +1369,11 @@
 %     \tl_const:cn, \tl_const:ce, \tl_const:cx
 %   }
 %   Constants are also easy to generate. They use \cs{cs_gset_nopar:Npe} instead
-%   of \cs{__kernel_tl_gset:Ne} so that the correct scope checking is applied if
-%   \pkg{l3debug} is used.
+%   of \cs{__kernel_tl_gset:Ne} so that the correct scope checking for |c|,
+%   instead of for |g|, is applied when
+%   \cs{debug_on:n} |{ check-declarations }| is used.
+%   Constant assignment functions are patched specially in \pkg{l3debug} to
+%   apply such checks.
 %    \begin{macrocode}
 \cs_new_protected:Npn \tl_const:Nn #1#2
   {
@@ -2429,12 +2449,16 @@
     \fi:
   }
 \prg_generate_conditional_variant:Nnn \tl_if_eq:nn
-  { nV , ne , nx , e , ee , x , xx }
+  { nV , ne , nx , V, e , ee , x , xx }
   { TF , T , F }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[TF]{\tl_if_in:Nn, \tl_if_in:NV, \tl_if_in:cn, \tl_if_in:cV}
+% \begin{macro}[TF]
+%   {
+%     \tl_if_in:Nn, \tl_if_in:NV, \tl_if_in:No,
+%     \tl_if_in:cn, \tl_if_in:cV, \tl_if_in:co
+%   }
 %   See \cs{tl_if_in:nnTF} for further comments. Here we simply
 %   expand the token list variable and pass it to \cs{tl_if_in:nnTF}.
 %    \begin{macrocode}
@@ -2442,11 +2466,15 @@
 \cs_new_protected:Npn \tl_if_in:NnF  { \exp_args:No \tl_if_in:nnF  }
 \cs_new_protected:Npn \tl_if_in:NnTF { \exp_args:No \tl_if_in:nnTF }
 \prg_generate_conditional_variant:Nnn \tl_if_in:Nn
-  { NV , c , cV } { T , F , TF }
+  { NV , No , c , cV , co } { T , F , TF }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[TF]{\tl_if_in:nn, \tl_if_in:Vn, \tl_if_in:on, \tl_if_in:nV, \tl_if_in:no}
+% \begin{macro}[TF]
+%   {
+%     \tl_if_in:nn, \tl_if_in:Vn, \tl_if_in:VV, \tl_if_in:on, \tl_if_in:oo,
+%     \tl_if_in:nV, \tl_if_in:no
+%   }
 %   Once more, the test relies on the emptiness test for robustness.
 %   The function \cs{@@_tmp:w} removes tokens until the first occurrence
 %   of |#2|. If this does not appear in |#1|, then the final |#2| is removed,
@@ -2476,7 +2504,7 @@
     \if_false: } \fi:
   }
 \prg_generate_conditional_variant:Nnn \tl_if_in:nn
-  { V , o , nV , no } { T , F , TF }
+  { V , VV , o , oo , nV , no } { T , F , TF }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -2756,7 +2784,7 @@
 %
 % \subsection{Working with the contents of token lists}
 %
-% \begin{macro}{\tl_count:n, \tl_count:V, \tl_count:o}
+% \begin{macro}{\tl_count:n, \tl_count:V, \tl_count:v, \tl_count:e, \tl_count:o}
 % \begin{macro}{\tl_count:N, \tl_count:c}
 % \begin{macro}{\@@_count:n}
 %   Count number of elements within a token list or token list
@@ -2776,7 +2804,7 @@
       { 0 \tl_map_function:NN #1 \@@_count:n }
   }
 \cs_new:Npn \@@_count:n #1 { + 1 }
-\cs_generate_variant:Nn \tl_count:n { V , o }
+\cs_generate_variant:Nn \tl_count:n { V , v , e , o }
 \cs_generate_variant:Nn \tl_count:N { c }
 %    \end{macrocode}
 % \end{macro}
@@ -3014,11 +3042,21 @@
 % \end{macro}
 % \end{macro}
 %
-% \begin{macro}[pTF]{\tl_if_head_eq_meaning:nN}
-% \begin{macro}[pTF]{\tl_if_head_eq_charcode:nN}
-% \begin{macro}[pTF]{\tl_if_head_eq_charcode:fN}
-% \begin{macro}[pTF]{\tl_if_head_eq_catcode:nN}
-% \begin{macro}[pTF]{\tl_if_head_eq_catcode:oN}
+% \begin{macro}[pTF]
+%   {
+%     \tl_if_head_eq_meaning:nN, \tl_if_head_eq_meaning:VN,
+%     \tl_if_head_eq_meaning:eN
+%   }
+% \begin{macro}[pTF]
+%   {
+%     \tl_if_head_eq_charcode:nN, \tl_if_head_eq_charcode:VN,
+%     \tl_if_head_eq_charcode:eN, \tl_if_head_eq_charcode:fN
+%   }
+% \begin{macro}[pTF]
+%   {
+%     \tl_if_head_eq_catcode:nN, \tl_if_head_eq_catcode:VN,
+%     \tl_if_head_eq_catcode:eN, \tl_if_head_eq_catcode:oN
+%   }
 % \begin{macro}[EXP]{\@@_head_exp_not:w}
 % \begin{macro}[EXP]{\@@_if_head_eq_empty_arg:w}
 %   Accessing the first token of a token list is tricky in three cases:
@@ -3057,7 +3095,7 @@
     \fi:
   }
 \prg_generate_conditional_variant:Nnn \tl_if_head_eq_charcode:nN
-  { f } { p , TF , T , F }
+  { V , e , f } { p , TF , T , F }
 %    \end{macrocode}
 %   For \cs{tl_if_head_eq_catcode:nN}, again we detect special cases
 %   with a \cs{tl_if_head_is_N_type:n}.  Then we need to test if the
@@ -3084,7 +3122,7 @@
     \fi:
   }
 \prg_generate_conditional_variant:Nnn \tl_if_head_eq_catcode:nN
-  { o } { p , TF , T , F }
+  { V , e , o } { p , TF , T , F }
 %    \end{macrocode}
 %   For \cs{tl_if_head_eq_meaning:nN}, again, detect special cases.  In
 %   the normal case, use \cs{tl_head:w}, with no \cs{exp_not:N} this
@@ -3105,6 +3143,8 @@
       \@@_if_head_eq_meaning_special:nN
     {#1} #2
   }
+\prg_generate_conditional_variant:Nnn \tl_if_head_eq_meaning:nN
+  { V , e } { p , TF , T , F }
 \cs_new:Npn \@@_if_head_eq_meaning_normal:nN #1 #2
   {
     \exp_after:wN \if_meaning:w
@@ -3158,8 +3198,6 @@
 % \end{macro}
 % \end{macro}
 % \end{macro}
-% \end{macro}
-% \end{macro}
 %
 % \begin{macro}[pTF]{\tl_if_head_is_N_type:n}
 % \begin{macro}[EXP]

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %
@@ -1132,9 +1132,9 @@
 %   \item Some frozen tokens can only be accessed in interactive
 %     sessions: |\cr|, |\right|, |\endgroup|, |\fi|, |\inaccessible|.
 %   \item In \LuaTeX{}, there is also the strange case of \enquote{bytes}
-%     |^^^^^^1100|$x$$y$ where $x,y$ are any two lowercase hexadecimal
+%     |^^^^^^1100|$xy$ where $x,y$ are any two lowercase hexadecimal
 %     digits, so that the hexadecimal number ranges from
-%     $"\text{110000}=1114112$ to~$"\text{1100ff}=1114367$.  These are
+%     |"|$11\,0000=1\,114\,112$ to~|"|$110\,0\mathrm{ff}=1\,114\,367$.  These are
 %     used to output individual bytes to files, rather than UTF-8.  For
 %     the purposes of token comparisons they behave like non-expandable
 %     primitive control sequences (\emph{not characters}) whose
@@ -1219,28 +1219,6 @@
 % characters at the start of the argument are \emph{not} ignored in this
 % case (and they prevent brace-stripping).
 %
-% \section{Deprecated functions}
-%
-% \begin{function}[added = 2020-01-09, EXP]
-%   {
-%     \char_lowercase:N, \char_uppercase:N,
-%     \char_titlecase:N, \char_foldcase:N,
-%     \char_str_lowercase:N, \char_str_uppercase:N,
-%     \char_str_titlecase:N, \char_str_foldcase:N
-%   }
-%   \begin{syntax}
-%     \cs{char_lowercase:N} \meta{char}
-%   \end{syntax}
-%   Converts the \meta{char} to the equivalent case-changed character
-%   as detailed by the function name (see \cs{str_foldcase:n}
-%   and \cs{text_titlecase_all:n} for details of these terms). The case mapping
-%   is carried out with no context-dependence (\emph{cf.}~\cs{text_uppercase:n},
-%   \emph{etc.}) The \texttt{str} versions always generate \enquote{other}
-%   (category code $12$) characters, whilst the standard versions generate
-%   characters with the category code of the \meta{char} (i.e.~only
-%   the character code changes).
-% \end{function}
-%
 % \end{documentation}
 %
 % \begin{implementation}
@@ -1688,160 +1666,6 @@
 % \end{macro}
 % \end{macro}
 %
-% \begin{macro}[EXP]
-%   {
-%     \char_lowercase:N, \char_uppercase:N,
-%     \char_titlecase:N, \char_foldcase:N
-%   }
-% \begin{macro}[EXP]{\@@_change_case:nN}
-% \begin{macro}[EXP]{\@@_change_case:nnnN}
-% \begin{macro}[EXP]{\@@_change_case_auxi:nN, \@@_change_case_auxii:nN}
-% \begin{macro}[EXP]{\@@_change_case_catcode:N}
-% \begin{macro}[EXP]
-%   {
-%     \char_str_lowercase:N, \char_str_uppercase:N,
-%     \char_str_titlecase:N, \char_str_foldcase:N
-%   }
-% \begin{macro}[EXP]{\@@_str_change_case:nN, \@@_str_change_case_aux:nN}
-% \begin{macro}[EXP]{\@@_str_change_case:nnnN}
-% \begin{macro}[EXP]{\@@_str_change_case:n}
-%   To ensure that the category codes produced are predictable, every character
-%   is re-generated even if it is otherwise unchanged.
-%    \begin{macrocode}
-\cs_new:Npn \char_lowercase:N
-  { \@@_change_case:nN { lowercase } }
-\cs_new:Npn \char_uppercase:N
-  { \@@_change_case:nN { uppercase } }
-\cs_new:Npn \char_titlecase:N
-  { \@@_change_case:nN { titlecase } }
-\cs_new:Npn \char_foldcase:N
-  { \@@_change_case:nN { casefold } }
-\cs_new:Npn \@@_change_case:nN #1#2
-  {
-    \int_compare:nNnTF {`#2} = { `\  }
-      { ~ }
-      {
-        \exp_args:Ne \@@_change_case_auxi:nN
-          { \__kernel_codepoint_case:nn {#1} {`#2} } #2
-      }
-  }
-\cs_new:Npn \@@_change_case_auxi:nN #1#2
-  { \use:e { \@@_change_case:nnnN #1 #2 } }
-\cs_new:Npn \@@_change_case:nnnN #1#2#3#4
-  {
-    \int_compare:nNnTF {#1} = {`#4}
-      { \exp_not:n {#4} }
-      {
-        \@@_change_case_auxii:nN {#1} {#4}
-        \tl_if_blank:nF {#2}
-          {
-            \@@_change_case_auxii:nN {#2} {#4}
-            \tl_if_blank:nF {#3}
-              { \@@_change_case_auxii:nN {#3} {#4} }
-          }
-      }
-  }
-\cs_new:Npn \@@_change_case_auxii:nN #1#2
-  {
-    \char_generate:nn {#1}
-      { \@@_change_case_catcode:N #2 }
-  }
-\bool_lazy_or:nnF
-  { \sys_if_engine_luatex_p: }
-  { \sys_if_engine_xetex_p: }
-  {
-    \cs_gset:Npn \@@_change_case_auxii:nN #1#2
-      {
-        \int_compare:nNnTF {#1} < { "80 }
-          {
-            \char_generate:nn {#1}
-              { \@@_change_case_catcode:N #2 }
-          }
-          { \exp_not:n {#2} }
-      }
-  }
-\cs_new:Npn \@@_change_case_catcode:N #1
-  {
-    \if_catcode:w \exp_not:N #1 \c_math_toggle_token
-      3
-    \else:
-      \if_catcode:w \exp_not:N #1 \c_alignment_token
-        4
-      \else:
-        \if_catcode:w \exp_not:N #1 \c_math_superscript_token
-          7
-        \else:
-          \if_catcode:w \exp_not:N #1 \c_math_subscript_token
-            8
-          \else:
-            \if_catcode:w \exp_not:N #1 \c_space_token
-              10
-            \else:
-             \if_catcode:w \exp_not:N #1 \c_catcode_letter_token
-               11
-             \else:
-               \if_catcode:w \exp_not:N #1 \c_catcode_other_token
-                 12
-               \else:
-                 13
-               \fi:
-             \fi:
-            \fi:
-          \fi:
-        \fi:
-      \fi:
-    \fi:
-  }
-%    \end{macrocode}
-%   Same story for the string version, except category code is easier
-%   to follow. This of course makes this version faster.
-%    \begin{macrocode}
-\cs_new:Npn \char_str_lowercase:N
-  { \@@_str_change_case:nN { lowercase } }
-\cs_new:Npn \char_str_uppercase:N
-  { \@@_str_change_case:nN { uppercase } }
-\cs_new:Npn \char_str_titlecase:N
-  { \@@_str_change_case:nN { titlecase } }
-\cs_new:Npn \char_str_foldcase:N
-  { \@@_str_change_case:nN { casefold } }
-\cs_new:Npn \@@_str_change_case:nN #1#2
-  {
-    \int_compare:nNnTF {`#2} = { `\  }
-      { ~ }
-      {
-        \exp_args:Ne \@@_str_change_case_aux:nN
-          { \__kernel_codepoint_case:nn {#1} {`#2} } #2
-      }
-  }
-\cs_new:Npn \@@_str_change_case_aux:nN #1#2
-  { \use:e { \@@_str_change_case:nnnN #1 #2 } }
-\cs_new:Npn \@@_str_change_case:nnnN #1#2#3#4
-  {
-    \int_compare:nNnTF {#1} = {`#4}
-      { \tl_to_str:n {#4} }
-      {
-        \@@_str_change_case:n {#1}
-        \tl_if_blank:nF {#2}
-          {
-            \@@_str_change_case:n {#2}
-            \tl_if_blank:nF {#3}
-              { \@@_str_change_case:n {#3} }
-          }
-      }
-  }
-\cs_new:Npn \@@_str_change_case:n #1
-  { \char_generate:nn {#1} { 12 } }
-%    \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
 % \begin{variable}{\c_catcode_active_space_tl}
 %   While \cs{char_generate:nn} can produce active characters in some
 %   engines it cannot in general.  It would be possible to simply change

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
 %
 % \maketitle
 %
@@ -857,7 +857,7 @@
       \fi:
     }
 %    \end{macrocode}
-% Here, |#4| can have have a trailing space, so we tidy up a bit at the cost of
+% Here, |#4| can have a trailing space, so we tidy up a bit at the cost of
 % speed for these small number of cases it applies to.
 %    \begin{macrocode}
   \cs_set_protected:Npn \@@_data_auxii:w #1 ~ #2 ~ #3 ~ #4 \q_stop
@@ -922,7 +922,7 @@
 % \begin{macro}[EXP]{\@@_case:nnn}
 % \begin{macro}[EXP]
 %   {\@@_uppercase:n, \@@_lowercase:n, \@@_titlecase:n, \@@_casefold:n}
-% \begin{macro}[EXP]{\@_case:nn}
+% \begin{macro}[EXP]{\@@_case:nn}
 %   With the core data files loaded, there is now a need to provide access to
 %   this information for other modules. That is done here such that case
 %   folding can also be covered. At this level, all that needs to be returned

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex	2023-12-08 21:36:03 UTC (rev 69066)
@@ -43,6 +43,7 @@
 %% l3fp-symbolic.dtx  (with options: `package')
 %% l3fp-functions.dtx  (with options: `package')
 %% l3fparray.dtx  (with options: `package')
+%% l3bitset.dtx  (with options: `package')
 %% l3cctab.dtx  (with options: `package')
 %% l3sort.dtx  (with options: `package')
 %% l3str-convert.dtx  (with options: `package')
@@ -75,7 +76,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx
-\def\ExplFileDate{2023-11-09}%
+\def\ExplFileDate{2023-12-08}%
 \begingroup
   \def\next{\endgroup}%
   \expandafter\ifx\csname PackageError\endcsname\relax
@@ -3883,13 +3884,13 @@
     \fi:
   }
 \prg_generate_conditional_variant:Nnn \tl_if_eq:nn
-  { nV , ne , nx , e , ee , x , xx }
+  { nV , ne , nx , V, e , ee , x , xx }
   { TF , T , F }
 \cs_new_protected:Npn \tl_if_in:NnT  { \exp_args:No \tl_if_in:nnT  }
 \cs_new_protected:Npn \tl_if_in:NnF  { \exp_args:No \tl_if_in:nnF  }
 \cs_new_protected:Npn \tl_if_in:NnTF { \exp_args:No \tl_if_in:nnTF }
 \prg_generate_conditional_variant:Nnn \tl_if_in:Nn
-  { NV , c , cV } { T , F , TF }
+  { NV , No , c , cV , co } { T , F , TF }
 \prg_new_protected_conditional:Npnn \tl_if_in:nn #1#2 { T  , F , TF }
   {
     \scan_stop:
@@ -3900,7 +3901,7 @@
     \if_false: } \fi:
   }
 \prg_generate_conditional_variant:Nnn \tl_if_in:nn
-  { V , o , nV , no } { T , F , TF }
+  { V , VV , o , oo , nV , no } { T , F , TF }
 \cs_set_protected:Npn \__tl_tmp:w #1
   {
     \prg_new_conditional:Npnn \tl_if_novalue:n ##1
@@ -4043,7 +4044,7 @@
       { 0 \tl_map_function:NN #1 \__tl_count:n }
   }
 \cs_new:Npn \__tl_count:n #1 { + 1 }
-\cs_generate_variant:Nn \tl_count:n { V , o }
+\cs_generate_variant:Nn \tl_count:n { V , v , e , o }
 \cs_generate_variant:Nn \tl_count:N { c }
 \cs_new:Npn \tl_count_tokens:n #1
   {
@@ -4167,7 +4168,7 @@
     \fi:
   }
 \prg_generate_conditional_variant:Nnn \tl_if_head_eq_charcode:nN
-  { f } { p , TF , T , F }
+  { V , e , f } { p , TF , T , F }
 \prg_new_conditional:Npnn \tl_if_head_eq_catcode:nN #1 #2 { p , T , F , TF }
   {
     \if_catcode:w
@@ -4185,7 +4186,7 @@
     \fi:
   }
 \prg_generate_conditional_variant:Nnn \tl_if_head_eq_catcode:nN
-  { o } { p , TF , T , F }
+  { V , e , o } { p , TF , T , F }
 \prg_new_conditional:Npnn \tl_if_head_eq_meaning:nN #1#2 { p , T , F , TF }
   {
     \tl_if_head_is_N_type:nTF { #1 ? }
@@ -4193,6 +4194,8 @@
       \__tl_if_head_eq_meaning_special:nN
     {#1} #2
   }
+\prg_generate_conditional_variant:Nnn \tl_if_head_eq_meaning:nN
+  { V , e } { p , TF , T , F }
 \cs_new:Npn \__tl_if_head_eq_meaning_normal:nN #1 #2
   {
     \exp_after:wN \if_meaning:w
@@ -4691,31 +4694,42 @@
 \cs_new_eq:NN \str_gconcat:NNN \tl_gconcat:NNN
 \cs_generate_variant:Nn \str_concat:NNN  { ccc }
 \cs_generate_variant:Nn \str_gconcat:NNN { ccc }
-\group_begin:
-  \cs_set_protected:Npn \__str_tmp:n #1
-    {
-      \tl_if_blank:nF {#1}
-        {
-          \cs_new_protected:cpe { str_ #1 :Nn } ##1##2
-            {
-              \exp_not:c { tl_ #1 :Ne } ##1
-                { \exp_not:N \tl_to_str:n {##2} }
-            }
-          \cs_generate_variant:cn { str_ #1 :Nn }
-            { NV , Ne , Nx , cn , cV , ce , cx }
-          \__str_tmp:n
-        }
-    }
-  \__str_tmp:n
-    { set }
-    { gset }
-    { const }
-    { put_left }
-    { gput_left }
-    { put_right }
-    { gput_right }
-    { }
-\group_end:
+\cs_new_protected:Npn \str_set:Nn #1#2
+  { \__kernel_tl_set:Ne #1 { \__kernel_tl_to_str:w {#2} } }
+\cs_gset_protected:Npn \str_gset:Nn #1#2
+  { \__kernel_tl_gset:Ne #1 { \__kernel_tl_to_str:w {#2} } }
+\cs_new_protected:Npn \str_const:Nn #1#2
+  {
+    \__kernel_chk_if_free_cs:N #1
+    \cs_gset_nopar:Npe #1 { \__kernel_tl_to_str:w {#2} }
+  }
+\cs_new_protected:Npn \str_put_left:Nn #1#2
+  {
+    \__kernel_tl_set:Ne #1
+      { \__kernel_tl_to_str:w {#2} \__kernel_exp_not:w \exp_after:wN {#1} }
+  }
+\cs_new_protected:Npn \str_gput_left:Nn #1#2
+  {
+    \__kernel_tl_gset:Ne #1
+      { \__kernel_tl_to_str:w {#2} \__kernel_exp_not:w \exp_after:wN {#1} }
+  }
+\cs_new_protected:Npn \str_put_right:Nn #1#2
+  {
+    \__kernel_tl_set:Ne #1
+      { \__kernel_exp_not:w \exp_after:wN {#1} \__kernel_tl_to_str:w {#2} }
+  }
+\cs_new_protected:Npn \str_gput_right:Nn #1#2
+  {
+    \__kernel_tl_gset:Ne #1
+      { \__kernel_exp_not:w \exp_after:wN {#1} \__kernel_tl_to_str:w {#2} }
+  }
+\cs_generate_variant:Nn \str_set:Nn        { NV , Ne , Nx , c , cV , ce , cx }
+\cs_generate_variant:Nn \str_gset:Nn       { NV , Ne , Nx , c , cV , ce , cx }
+\cs_generate_variant:Nn \str_const:Nn      { NV , Ne , Nx , c , cV , ce , cx }
+\cs_generate_variant:Nn \str_put_left:Nn   { NV , Ne , Nx , c , cV , ce , cx }
+\cs_generate_variant:Nn \str_gput_left:Nn  { NV , Ne , Nx , c , cV , ce , cx }
+\cs_generate_variant:Nn \str_put_right:Nn  { NV , Ne , Nx , c , cV , ce , cx }
+\cs_generate_variant:Nn \str_gput_right:Nn { NV , Ne , Nx , c , cV , ce , cx }
 \cs_new_protected:Npn \str_replace_once:Nnn
   { \__str_replace:NNNnn \prg_do_nothing: \__kernel_tl_set:Ne  }
 \cs_new_protected:Npn \str_greplace_once:Nnn
@@ -5388,6 +5402,7 @@
 \str_const:Ne \c_tilde_str       { \cs_to_str:N \~ }
 \str_const:Ne \c_underscore_str  { \cs_to_str:N \_ }
 \str_const:Ne \c_zero_str        { 0 }
+\cs_new_eq:NN \c_empty_str \c_empty_tl
 \str_new:N \l_tmpa_str
 \str_new:N \l_tmpb_str
 \str_new:N \g_tmpa_str
@@ -7138,9 +7153,17 @@
     \fi:
   }
 \prg_generate_conditional_variant:Nnn \bool_if:N { c } { p , T , F , TF }
-\cs_new:Npn \bool_to_str:N #1 { \bool_if:NTF #1 { true } { false } }
+\cs_new:Npe \bool_to_str:N #1
+  {
+    \exp_not:N \bool_if:NTF #1
+      { \tl_to_str:n { true } } { \tl_to_str:n { false } }
+  }
 \cs_generate_variant:Nn \bool_to_str:N { c }
-\cs_new:Npn \bool_to_str:n #1 { \bool_if:nTF {#1} { true } { false } }
+\cs_new:Npe \bool_to_str:n #1
+  {
+    \exp_not:N \bool_if:nTF {#1}
+      { \tl_to_str:n { true } } { \tl_to_str:n { false } }
+  }
 \cs_new_protected:Npn \bool_show:n
   { \__kernel_msg_show_eval:Nn \bool_to_str:n }
 \cs_new_protected:Npn \bool_log:n
@@ -7707,7 +7730,7 @@
       { \iow_shipout:Nn \c__sys_shell_stream_int {#1} }
   }
 \cs_generate_variant:Nn \sys_shell_shipout:n { e , x }
-\cs_new_protected:Npn \sys_everyjob:
+\cs_new_protected:Npn \__kernel_sys_everyjob:
   {
     \tl_use:N \g__sys_everyjob_tl
     \tl_gclear:N \g__sys_everyjob_tl
@@ -7815,7 +7838,7 @@
   { \cs_gset_eq:NN \g_file_curr_name_str \tex_jobname:D }
 \cs_new_protected:Npn \sys_finalise:
   {
-    \sys_everyjob:
+    \__kernel_sys_everyjob:
     \tl_use:N \g__sys_finalise_tl
     \tl_gclear:N \g__sys_finalise_tl
   }
@@ -8780,125 +8803,6 @@
         }
   \fi:
 \group_end:
-\cs_new:Npn \char_lowercase:N
-  { \__char_change_case:nN { lowercase } }
-\cs_new:Npn \char_uppercase:N
-  { \__char_change_case:nN { uppercase } }
-\cs_new:Npn \char_titlecase:N
-  { \__char_change_case:nN { titlecase } }
-\cs_new:Npn \char_foldcase:N
-  { \__char_change_case:nN { casefold } }
-\cs_new:Npn \__char_change_case:nN #1#2
-  {
-    \int_compare:nNnTF {`#2} = { `\  }
-      { ~ }
-      {
-        \exp_args:Ne \__char_change_case_auxi:nN
-          { \__kernel_codepoint_case:nn {#1} {`#2} } #2
-      }
-  }
-\cs_new:Npn \__char_change_case_auxi:nN #1#2
-  { \use:e { \__char_change_case:nnnN #1 #2 } }
-\cs_new:Npn \__char_change_case:nnnN #1#2#3#4
-  {
-    \int_compare:nNnTF {#1} = {`#4}
-      { \exp_not:n {#4} }
-      {
-        \__char_change_case_auxii:nN {#1} {#4}
-        \tl_if_blank:nF {#2}
-          {
-            \__char_change_case_auxii:nN {#2} {#4}
-            \tl_if_blank:nF {#3}
-              { \__char_change_case_auxii:nN {#3} {#4} }
-          }
-      }
-  }
-\cs_new:Npn \__char_change_case_auxii:nN #1#2
-  {
-    \char_generate:nn {#1}
-      { \__char_change_case_catcode:N #2 }
-  }
-\bool_lazy_or:nnF
-  { \sys_if_engine_luatex_p: }
-  { \sys_if_engine_xetex_p: }
-  {
-    \cs_gset:Npn \__char_change_case_auxii:nN #1#2
-      {
-        \int_compare:nNnTF {#1} < { "80 }
-          {
-            \char_generate:nn {#1}
-              { \__char_change_case_catcode:N #2 }
-          }
-          { \exp_not:n {#2} }
-      }
-  }
-\cs_new:Npn \__char_change_case_catcode:N #1
-  {
-    \if_catcode:w \exp_not:N #1 \c_math_toggle_token
-      3
-    \else:
-      \if_catcode:w \exp_not:N #1 \c_alignment_token
-        4
-      \else:
-        \if_catcode:w \exp_not:N #1 \c_math_superscript_token
-          7
-        \else:
-          \if_catcode:w \exp_not:N #1 \c_math_subscript_token
-            8
-          \else:
-            \if_catcode:w \exp_not:N #1 \c_space_token
-              10
-            \else:
-             \if_catcode:w \exp_not:N #1 \c_catcode_letter_token
-               11
-             \else:
-               \if_catcode:w \exp_not:N #1 \c_catcode_other_token
-                 12
-               \else:
-                 13
-               \fi:
-             \fi:
-            \fi:
-          \fi:
-        \fi:
-      \fi:
-    \fi:
-  }
-\cs_new:Npn \char_str_lowercase:N
-  { \__char_str_change_case:nN { lowercase } }
-\cs_new:Npn \char_str_uppercase:N
-  { \__char_str_change_case:nN { uppercase } }
-\cs_new:Npn \char_str_titlecase:N
-  { \__char_str_change_case:nN { titlecase } }
-\cs_new:Npn \char_str_foldcase:N
-  { \__char_str_change_case:nN { casefold } }
-\cs_new:Npn \__char_str_change_case:nN #1#2
-  {
-    \int_compare:nNnTF {`#2} = { `\  }
-      { ~ }
-      {
-        \exp_args:Ne \__char_str_change_case_aux:nN
-          { \__kernel_codepoint_case:nn {#1} {`#2} } #2
-      }
-  }
-\cs_new:Npn \__char_str_change_case_aux:nN #1#2
-  { \use:e { \__char_str_change_case:nnnN #1 #2 } }
-\cs_new:Npn \__char_str_change_case:nnnN #1#2#3#4
-  {
-    \int_compare:nNnTF {#1} = {`#4}
-      { \tl_to_str:n {#4} }
-      {
-        \__char_str_change_case:n {#1}
-        \tl_if_blank:nF {#2}
-          {
-            \__char_str_change_case:n {#2}
-            \tl_if_blank:nF {#3}
-              { \__char_str_change_case:n {#3} }
-          }
-      }
-  }
-\cs_new:Npn \__char_str_change_case:n #1
-  { \char_generate:nn {#1} { 12 } }
 \group_begin:
   \char_set_catcode_active:N *
   \char_set_lccode:nn { `* } { `\ }
@@ -11523,8 +11427,6 @@
     \cs_new:Npn \__iow_wrap_trim_aux:w ##1 \s__iow_mark ##2 \s__iow_stop {##1}
   }
 \exp_args:NV \__iow_tmp:w \c_catcode_other_space_tl
-\cs_new_eq:NN \iow_shipout_x:Nn \iow_shipout_e:Nn
-\cs_generate_variant:Nn \iow_shipout_x:Nn { Nx , c, cx }
 \tl_new:N \l__file_internal_tl
 \str_new:N \g_file_curr_dir_str
 \str_new:N \g_file_curr_ext_str
@@ -14377,22 +14279,6 @@
   }
 \prop_gput:Nnn \g_msg_module_name_prop { keys } { LaTeX }
 \prop_gput:Nnn \g_msg_module_type_prop { keys } { }
-\cs_new_protected:cpn { \c__keys_props_root_str .str_set_x:N } #1
-  { \__keys_variable_set:NnnN #1 { str } { } x }
-\cs_new_protected:cpn { \c__keys_props_root_str .str_set_x:c } #1
-  { \__keys_variable_set:cnnN {#1} { str } { } x }
-\cs_new_protected:cpn { \c__keys_props_root_str .str_gset_x:N } #1
-  { \__keys_variable_set:NnnN #1 { str } { g } x }
-\cs_new_protected:cpn { \c__keys_props_root_str .str_gset_x:c } #1
-  { \__keys_variable_set:cnnN {#1} { str } { g } x }
-\cs_new_protected:cpn { \c__keys_props_root_str .tl_set_x:N } #1
-  { \__keys_variable_set:NnnN #1 { tl } { } x }
-\cs_new_protected:cpn { \c__keys_props_root_str .tl_set_x:c } #1
-  { \__keys_variable_set:cnnN {#1} { tl } { } x }
-\cs_new_protected:cpn { \c__keys_props_root_str .tl_gset_x:N } #1
-  { \__keys_variable_set:NnnN #1 { tl } { g } x }
-\cs_new_protected:cpn { \c__keys_props_root_str .tl_gset_x:c } #1
-  { \__keys_variable_set:cnnN {#1} { tl } { g } x }
 %% File: l3intarray.dtx
 \msg_new:nnn { kernel } { negative-array-size }
   { Size~of~array~may~not~be~negative:~#1 }
@@ -21589,6 +21475,220 @@
   }
 \cs_new:Npn \__fp_array_item_normal:w #1 #2#3#4#5 #6 ; #7 ; #8 ; #9
   { #9 \s__fp \__fp_chk:w 1 #1 {#8} #7 {#2#3#4#5} {#6} ; }
+%% File: l3bitset.dtx
+\cs_if_exist:NT \@expl at finalise@setup@@
+  {
+    \tl_gput_right:Nn \@expl at finalise@setup@@
+      { \disable at package@load { l3bitset } { } }
+  }
+\cs_new_protected:Npn \bitset_new:N #1
+  {
+    \__kernel_chk_if_free_cs:N #1
+    \cs_gset_eq:NN #1 \c_zero_str
+    \prop_new:c { g__bitset_ \cs_to_str:N #1 _name_prop }
+  }
+
+\cs_new_protected:Npn \bitset_new:Nn #1 #2
+  {
+    \__kernel_chk_if_free_cs:N #1
+    \cs_gset_eq:NN #1 \c_zero_str
+    \prop_new:c { g__bitset_ \cs_to_str:N #1 _name_prop }
+    \prop_gset_from_keyval:cn
+       { g__bitset_ \cs_to_str:N #1 _name_prop }
+       {#2}
+  }
+\cs_generate_variant:Nn \bitset_new:N { c }
+\prop_new:N \l__bitset_tmp_prop
+\cs_new_protected:Npn \bitset_addto_named_index:Nn #1#2
+  {
+     \prop_set_from_keyval:Nn \l__bitset_tmp_prop {#2}
+     \prop_map_inline:Nn \l__bitset_tmp_prop
+       {
+         \prop_gput:cnn
+           { g__bitset_ \cs_to_str:N #1 _name_prop }
+           {##1}
+           {##2}
+       }
+  }
+\prg_new_eq_conditional:NNn
+  \bitset_if_exist:N \str_if_exist:N { p , T , F , TF }
+\prg_new_eq_conditional:NNn
+  \bitset_if_exist:c \str_if_exist:c
+  { p , T , F , TF }
+\cs_new_protected:Npn \__bitset_set_true:Nn #1#2
+  { \__bitset_set:NNnN \str_set:Ne #1 {#2} 1 }
+\cs_new_protected:Npn \__bitset_gset_true:Nn #1#2
+  { \__bitset_set:NNnN \str_gset:Ne #1 {#2} 1 }
+\cs_new_protected:Npn \__bitset_set_false:Nn #1#2
+  { \__bitset_set:NNnN \str_set:Ne #1 {#2} 0 }
+\cs_new_protected:Npn \__bitset_gset_false:Nn #1#2
+  { \__bitset_set:NNnN \str_gset:Ne #1 {#2} 0 }
+\cs_new_protected:Npn \__bitset_set:NNnN #1#2#3#4
+  {
+    \int_compare:nNnT {#3} > { 0 }
+      {
+        \int_compare:nNnTF { \str_count:N #2 } < {#3}
+          {
+            #1 #2
+              {
+                #4
+                \prg_replicate:nn { #3 - \str_count:N #2 - 1 } { 0 }
+                #2
+              }
+          }
+          {
+             #1 #2
+              {
+                \str_range:Nnn #2 { 1 } { -1 - (#3) }
+                #4
+                \str_range:Nnn #2 { 1 - (#3) } { -1 }
+             }
+          }
+      }
+  }
+\int_new:N \l__bitset_internal_int
+\prg_new_protected_conditional:Npnn \__bitset_test_digits:n #1 { TF }
+  {
+    \tex_afterassignment:D \__bitset_test_digits:w
+    \l__bitset_internal_int = 0 \tl_trim_spaces_apply:nN {#1} \tl_to_str:n
+    \__bitset_test_digits_end:
+    \use_i:nnn \if_false:
+    \__bitset_test_digits_end:
+    \if_int_compare:w \c_zero_int < \l__bitset_internal_int
+      \prg_return_true:
+    \else:
+      \prg_return_false:
+    \fi:
+  }
+\cs_new_eq:NN \__bitset_test_digits_end: \exp_stop_f:
+\cs_new_protected:Npn \__bitset_test_digits:w #1 \__bitset_test_digits_end: { }
+\cs_new_protected:Npn \bitset_set_true:Nn #1#2
+  { \__bitset_set:NNn \__bitset_set_true:Nn #1 {#2} }
+\cs_new_protected:Npn \bitset_gset_true:Nn #1#2
+  { \__bitset_set:NNn \__bitset_gset_true:Nn #1 {#2} }
+\cs_new_protected:Npn \bitset_set_false:Nn #1#2
+  { \__bitset_set:NNn \__bitset_set_false:Nn #1 {#2} }
+\cs_new_protected:Npn \bitset_gset_false:Nn #1#2
+  { \__bitset_set:NNn \__bitset_gset_false:Nn #1 {#2} }
+\cs_new_protected:Npn \__bitset_set:NNn #1#2#3
+  {
+    \prop_if_in:cnTF { g__bitset_ \cs_to_str:N #2 _name_prop } {#3}
+      {
+        #1 #2
+          {
+            \prop_item:cn  { g__bitset_ \cs_to_str:N #2 _name_prop } {#3}
+          }
+      }
+      {
+        \__bitset_test_digits:nTF {#3}
+          {
+            #1 #2 {#3}
+            \prop_gput:cnn { g__bitset_ \cs_to_str:N #2 _name_prop } {#3} {#3}
+          }
+          {
+            \msg_warning:nnee { bitset } { unknown-name }
+              { \token_to_str:N #2 }
+              { \tl_to_str:n {#3} }
+          }
+      }
+  }
+\cs_generate_variant:Nn \bitset_set_true:Nn  { c }
+\cs_generate_variant:Nn \bitset_gset_true:Nn { c }
+\cs_generate_variant:Nn \bitset_set_false:Nn  { c }
+\cs_generate_variant:Nn \bitset_gset_false:Nn { c }
+\cs_new_protected:Npn \bitset_clear:N #1
+  {
+    \str_set_eq:NN #1 \c_zero_str
+  }
+\cs_new_protected:Npn \bitset_gclear:N #1
+  {
+    \str_gset_eq:NN #1 \c_zero_str
+  }
+\cs_generate_variant:Nn \bitset_clear:N { c }
+\cs_generate_variant:Nn \bitset_gclear:N { c }
+\cs_new:Npn \bitset_to_arabic:N #1
+  {
+    \int_compare:nNnTF { \str_count:N #1 } < { 32 }
+      { \exp_args:No \int_from_bin:n {#1} }
+      {
+        \exp_after:wN \__bitset_to_int:nN \exp_after:wN 0
+        #1 \q_recursion_tail \q_recursion_stop
+      }
+  }
+
+\cs_new:Npn \__bitset_to_int:nN #1#2
+  {
+    \quark_if_recursion_tail_stop_do:Nn #2 {#1}
+    \exp_args:Nf \__bitset_to_int:nN { \fp_eval:n { #1 * 2 + #2 } }
+  }
+
+\cs_new:Npn \bitset_to_bin:N #1
+  {
+    #1
+  }
+\cs_generate_variant:Nn \bitset_to_arabic:N  { c }
+\cs_generate_variant:Nn \bitset_to_bin:N { c }
+\cs_new:Npn \bitset_item:Nn #1#2
+  {
+    \prop_if_in:cnTF { g__bitset_ \cs_to_str:N #1 _name_prop } {#2}
+      {
+        \int_eval:n
+          {
+            \str_item:Nn #1
+              { 0 - ( \prop_item:cn { g__bitset_ \cs_to_str:N #1 _name_prop } {#2} ) }
+            +0
+          }
+     }
+     {
+       0
+     }
+  }
+\cs_generate_variant:Nn \bitset_item:Nn { c }
+\cs_new_protected:Npn   \bitset_show:N { \__bitset_show:NN \msg_show:nneeee }
+\cs_generate_variant:Nn \bitset_show:N { c }
+\cs_new_protected:Npn   \bitset_log:N  { \__bitset_show:NN \msg_log:nneeee }
+\cs_generate_variant:Nn \bitset_log:N  { c }
+\cs_new_protected:Npn   \bitset_show_named_index:N { \__bitset_show_named_index:NN \msg_show:nneeee }
+\cs_generate_variant:Nn \bitset_show_named_index:N { c }
+\cs_new_protected:Npn \__bitset_show:NN #1#2
+  {
+    \__kernel_chk_defined:NT #2
+      {
+        #1 { bitset } { show }
+           { \token_to_str:N #2 }
+           { \bitset_to_bin:N #2 }
+           { \bitset_to_arabic:N #2 }
+           { }
+      }
+  }
+\cs_new_protected:Npn \__bitset_show_named_index:NN #1#2
+  {
+    \__kernel_chk_defined:NT #2
+      {
+        #1 { bitset } { show-names }
+           { \token_to_str:N #2 }
+           { \prop_map_function:cN { g__bitset_ \cs_to_str:N #2 _name_prop }  \msg_show_item:nn  }
+           { }
+           { }
+      }
+  }
+ \msg_new:nnn { bitset } { show }
+  {
+    The~bitset~#1~has~the~representation: \\
+    >~binary:~#2  \\
+    >~arabic:~#3 .
+  }
+\msg_new:nnn { bitset } { show-names }
+  {
+    The~bitset~#1~
+    \tl_if_empty:nTF {#2}
+      { knows~no~names~yet \\>~ . }
+      { knows~the~name/index~pairs~(without~outer~braces): #2 . }
+  }
+\msg_new:nnn { bitset } { unknown-name }
+  { The~name~'#2'~is~unknown~for~bitset~\tl_to_str:n {#1} }
+\prop_gput:Nnn \g_msg_module_name_prop { bitset } { LaTeX }
+\prop_gput:Nnn \g_msg_module_type_prop { bitset } { }
 %% File: l3cctab.dtx
 \seq_new:N \g__cctab_stack_seq
 \seq_new:N \g__cctab_unused_seq
@@ -22442,8 +22542,8 @@
     \prop_gput:Nnn \g__str_alias_prop { default } { utf8 }
   }
 \bool_new:N \g__str_error_bool
-\flag_new:n { str_byte }
-\flag_new:n { str_error }
+\flag_new:n { __str_byte }
+\flag_new:n { __str_error }
 \prg_new_conditional:Npnn \__str_if_contains_char:Nn #1#2 { T , TF }
   {
     \exp_after:wN \__str_if_contains_char_aux:nn \exp_after:wN {#1} {#2}
@@ -22618,6 +22718,8 @@
         { encode } { escape }
         \use_ii_i:nn
         \__str_convert_encode_:
+        \__kernel_tl_gset:Ne \g__str_result_tl
+          { \tl_to_str:V \g__str_result_tl }
     \group_end:
     #2 #3 \g__str_result_tl
   }
@@ -22720,7 +22822,7 @@
         \if_int_compare:w `#1 < 256 \exp_stop_f:
           #1
         \else:
-          \flag_raise:n { str_byte }
+          \flag_raise:n { __str_byte }
         \fi:
         \__str_filter_bytes_aux:N
       }
@@ -22734,10 +22836,10 @@
   {
     \cs_new_protected:Npn \__str_convert_unescape_:
       {
-        \flag_clear:n { str_byte }
+        \flag_clear:n { __str_byte }
         \__kernel_tl_gset:Ne \g__str_result_tl
           { \exp_args:No \__str_filter_bytes:n \g__str_result_tl }
-        \__str_if_flag_error:nne { str_byte } { non-byte } { bytes }
+        \__str_if_flag_error:nne { __str_byte } { non-byte } { bytes }
       }
   }
   { \cs_new_protected:Npn \__str_convert_unescape_: { } }
@@ -22762,15 +22864,15 @@
   {
     \cs_new_protected:Npn \__str_convert_encode_:
       {
-        \flag_clear:n { str_error }
+        \flag_clear:n { __str_error }
         \__str_convert_gmap_internal:N \__str_encode_native_char:n
-        \__str_if_flag_error:nne { str_error }
+        \__str_if_flag_error:nne { __str_error }
           { native-overflow } { }
       }
     \cs_new:Npn \__str_encode_native_char:n #1
       {
         \if_int_compare:w #1 > \c__str_max_byte_int
-          \flag_raise:n { str_error }
+          \flag_raise:n { __str_error }
           ?
         \else:
           \char_generate:nn {#1} {12}
@@ -22856,9 +22958,9 @@
         \exp_not:N \__str_decode_eight_bit_aux:Nn
         \exp_not:c { g__str_decode_#1_intarray }
       }
-    \flag_clear:n { str_error }
+    \flag_clear:n { __str_error }
     \__str_convert_gmap:N \__str_tmp:w
-    \__str_if_flag_error:nne { str_error } { decode-8-bit } {#1}
+    \__str_if_flag_error:nne { __str_error } { decode-8-bit } {#1}
   }
 \cs_new:Npn \__str_decode_eight_bit_aux:Nn #1#2
   {
@@ -22870,7 +22972,7 @@
 \cs_new:Npn \__str_decode_eight_bit_aux:n #1
   {
     \if_int_compare:w #1 < \c_zero_int
-      \flag_raise:n { str_error }
+      \flag_raise:n { __str_error }
       \int_value:w \c__str_replacement_char_int
     \else:
       #1
@@ -22885,9 +22987,9 @@
         \exp_not:c { g__str_encode_#1_intarray }
         \exp_not:c { g__str_decode_#1_intarray }
       }
-    \flag_clear:n { str_error }
+    \flag_clear:n { __str_error }
     \__str_convert_gmap_internal:N \__str_tmp:w
-    \__str_if_flag_error:nne { str_error } { encode-8-bit } {#1}
+    \__str_if_flag_error:nne { __str_error } { encode-8-bit } {#1}
   }
 \cs_new:Npn \__str_encode_eight_bit_aux:NNn #1#2#3
   {
@@ -22903,7 +23005,7 @@
   {
     \int_compare:nNnTF { \intarray_item:Nn #3 { 1 + #1 } } = {#2}
       { \__str_output_byte:n {#1} }
-      { \flag_raise:n { str_error } }
+      { \flag_raise:n { __str_error } }
   }
 \msg_new:nnn { str } { unknown-esc }
   { Escaping~scheme~'#1'~(filtered:~'#2')~unknown. }
@@ -22914,7 +23016,7 @@
   {
     Since~native~strings~do~not~consist~in~bytes,~
     none~of~the~escaping~methods~make~sense.~
-    The~specified~escaping,~'#1',~will be ignored.
+    The~specified~escaping,~'#1',~will~be~ignored.
   }
 \msg_new:nnn { str } { file-not-found }
   { File~'l3str-#1.def'~not~found. }
@@ -22954,7 +23056,7 @@
 \cs_new_protected:Npn \__str_convert_unescape_hex:
   {
     \group_begin:
-      \flag_clear:n { str_error }
+      \flag_clear:n { __str_error }
       \int_set:Nn \tex_escapechar:D { 92 }
       \__kernel_tl_gset:Ne \g__str_result_tl
         {
@@ -22965,7 +23067,7 @@
             \prg_break_point:
           \__str_output_end:
         }
-      \__str_if_flag_error:nne { str_error } { unescape-hex } { }
+      \__str_if_flag_error:nne { __str_error } { unescape-hex } { }
     \group_end:
   }
 \cs_new:Npn \__str_unescape_hex_auxi:N #1
@@ -22974,7 +23076,7 @@
     \__str_hexadecimal_use:NTF #1
       { \__str_unescape_hex_auxii:N }
       {
-        \flag_raise:n { str_error }
+        \flag_raise:n { __str_error }
         \__str_unescape_hex_auxi:N
       }
   }
@@ -22987,7 +23089,7 @@
         \__str_output_byte:w " \__str_unescape_hex_auxi:N
       }
       {
-        \flag_raise:n { str_error }
+        \flag_raise:n { __str_error }
         \__str_unescape_hex_auxii:N
       }
   }
@@ -23002,8 +23104,8 @@
     \cs_new_protected:cpn { __str_convert_unescape_#2: }
       {
         \group_begin:
-          \flag_clear:n { str_byte }
-          \flag_clear:n { str_error }
+          \flag_clear:n { __str_byte }
+          \flag_clear:n { __str_error }
           \int_set:Nn \tex_escapechar:D { 92 }
           \__kernel_tl_gset:Ne \g__str_result_tl
             {
@@ -23011,8 +23113,8 @@
                 #1 ? { ? \prg_break: }
               \prg_break_point:
             }
-          \__str_if_flag_error:nne { str_byte } { non-byte } { #2 }
-          \__str_if_flag_error:nne { str_error } { unescape-#2 } { }
+          \__str_if_flag_error:nne { __str_byte } { non-byte } { #2 }
+          \__str_if_flag_error:nne { __str_error } { unescape-#2 } { }
         \group_end:
       }
     \cs_new:Npn #3 ##1#1##2##3
@@ -23025,12 +23127,12 @@
               \__str_hexadecimal_use:NTF ##3
                 { }
                 {
-                  \flag_raise:n { str_error }
+                  \flag_raise:n { __str_error }
                   * 0 + `#1 \use_i:nn
                 }
             }
             {
-              \flag_raise:n { str_error }
+              \flag_raise:n { __str_error }
               0 + `#1 \use_i:nn
             }
         \__str_output_end:
@@ -23055,8 +23157,8 @@
       \cs_new_protected:Npn \__str_convert_unescape_string:
         {
           \group_begin:
-            \flag_clear:n { str_byte }
-            \flag_clear:n { str_error }
+            \flag_clear:n { __str_byte }
+            \flag_clear:n { __str_error }
             \int_set:Nn \tex_escapechar:D { 92 }
             \__kernel_tl_gset:Ne \g__str_result_tl
               {
@@ -23070,8 +23172,8 @@
                   \g__str_result_tl #1 ?? { ? \prg_break: }
                 \prg_break_point:
               }
-            \__str_if_flag_error:nne { str_byte } { non-byte } { string }
-            \__str_if_flag_error:nne { str_error } { unescape-string } { }
+            \__str_if_flag_error:nne { __str_byte } { non-byte } { string }
+            \__str_if_flag_error:nne { __str_error } { unescape-string } { }
           \group_end:
         }
     }
@@ -23111,7 +23213,7 @@
                     { ^^J } { 0 - 1 }
                   }
                   {
-                    \flag_raise:n { str_error }
+                    \flag_raise:n { __str_error }
                     0 - 1 \use_i:nn
                   }
               }
@@ -23237,19 +23339,19 @@
       #5 \s__str_stop
     \__str_output_byte:n { #2 - 64 * ( #1 - 2 ) }
   }
-\flag_clear_new:n { str_missing }
-\flag_clear_new:n { str_extra }
-\flag_clear_new:n { str_overlong }
-\flag_clear_new:n { str_overflow }
+\flag_clear_new:n { __str_missing }
+\flag_clear_new:n { __str_extra }
+\flag_clear_new:n { __str_overlong }
+\flag_clear_new:n { __str_overflow }
 \msg_new:nnnn { str } { utf8-decode }
   {
     Invalid~UTF-8~string:
     \exp_last_unbraced:Nf \use_none:n
       {
-        \__str_if_flag_times:nT { str_missing }  { ,~missing~continuation~byte }
-        \__str_if_flag_times:nT { str_extra }    { ,~extra~continuation~byte }
-        \__str_if_flag_times:nT { str_overlong } { ,~overlong~form }
-        \__str_if_flag_times:nT { str_overflow } { ,~code~point~too~large }
+        \__str_if_flag_times:nT { __str_missing }  { ,~missing~continuation~byte }
+        \__str_if_flag_times:nT { __str_extra }    { ,~extra~continuation~byte }
+        \__str_if_flag_times:nT { __str_overlong } { ,~overlong~form }
+        \__str_if_flag_times:nT { __str_overflow } { ,~code~point~too~large }
       }
     .
   }
@@ -23264,18 +23366,18 @@
         Code~point~    <~1114112:~11110xxx~10xxxxxx~10xxxxxx~10xxxxxx \\
       }
     Bytes~of~the~form~10xxxxxx~are~called~continuation~bytes.
-    \flag_if_raised:nT { str_missing }
+    \flag_if_raised:nT { __str_missing }
       {
         \\\\
         A~leading~byte~(in~the~range~[192,255])~was~not~followed~by~
         the~appropriate~number~of~continuation~bytes.
       }
-    \flag_if_raised:nT { str_extra }
+    \flag_if_raised:nT { __str_extra }
       {
         \\\\
         LaTeX~came~across~a~continuation~byte~when~it~was~not~expected.
       }
-    \flag_if_raised:nT { str_overlong }
+    \flag_if_raised:nT { __str_overlong }
       {
         \\\\
         Every~Unicode~code~point~must~be~expressed~in~the~shortest~
@@ -23282,7 +23384,7 @@
         possible~form.~For~instance,~'0xC0'~'0x83'~is~not~a~valid~
         representation~for~the~code~point~3.
       }
-    \flag_if_raised:nT { str_overflow }
+    \flag_if_raised:nT { __str_overflow }
       {
         \\\\
         Unicode~limits~code~points~to~the~range~[0,1114111].
@@ -23292,11 +23394,11 @@
 \prop_gput:Nnn \g_msg_module_type_prop { str } { }
 \cs_new_protected:cpn { __str_convert_decode_utf8: }
   {
-    \flag_clear:n { str_error }
-    \flag_clear:n { str_missing }
-    \flag_clear:n { str_extra }
-    \flag_clear:n { str_overlong }
-    \flag_clear:n { str_overflow }
+    \flag_clear:n { __str_error }
+    \flag_clear:n { __str_missing }
+    \flag_clear:n { __str_extra }
+    \flag_clear:n { __str_overlong }
+    \flag_clear:n { __str_overflow }
     \__kernel_tl_gset:Ne \g__str_result_tl
       {
         \exp_after:wN \__str_decode_utf_viii_start:N \g__str_result_tl
@@ -23303,7 +23405,7 @@
           { \prg_break: \__str_decode_utf_viii_end: }
         \prg_break_point:
       }
-    \__str_if_flag_error:nne { str_error } { utf8-decode } { }
+    \__str_if_flag_error:nne { __str_error } { utf8-decode } { }
   }
 \cs_new:Npn \__str_decode_utf_viii_start:N #1
   {
@@ -23313,8 +23415,8 @@
       \if_int_compare:w `#1 < "80 \exp_stop_f:
         \int_value:w `#1
       \else:
-        \flag_raise:n { str_extra }
-        \flag_raise:n { str_error }
+        \flag_raise:n { __str_extra }
+        \flag_raise:n { __str_error }
         \int_use:N \c__str_replacement_char_int
       \fi:
     \else:
@@ -23337,8 +23439,8 @@
       \int_value:w \int_eval:n { #1 * "40 + `#3 - "80 } \exp_after:wN
     \else:
       \s__str
-      \flag_raise:n { str_missing }
-      \flag_raise:n { str_error }
+      \flag_raise:n { __str_missing }
+      \flag_raise:n { __str_error }
       \int_use:N \c__str_replacement_char_int
     \fi:
     \s__str
@@ -23351,8 +23453,8 @@
     \if_int_compare:w #1 < #4 \exp_stop_f:
       \s__str
       \if_int_compare:w #1 < #3 \exp_stop_f:
-        \flag_raise:n { str_overlong }
-        \flag_raise:n { str_error }
+        \flag_raise:n { __str_overlong }
+        \flag_raise:n { __str_error }
         \int_use:N \c__str_replacement_char_int
       \else:
         #1
@@ -23371,15 +23473,15 @@
 \cs_new:Npn \__str_decode_utf_viii_overflow:w #1 \fi: #2 \fi:
   {
     \fi: \fi:
-    \flag_raise:n { str_overflow }
-    \flag_raise:n { str_error }
+    \flag_raise:n { __str_overflow }
+    \flag_raise:n { __str_error }
     \int_use:N \c__str_replacement_char_int
   }
 \cs_new:Npn \__str_decode_utf_viii_end:
   {
     \s__str
-    \flag_raise:n { str_missing }
-    \flag_raise:n { str_error }
+    \flag_raise:n { __str_missing }
+    \flag_raise:n { __str_error }
     \int_use:N \c__str_replacement_char_int \s__str
     \prg_break:
   }
@@ -23397,10 +23499,10 @@
     { \__str_encode_utf_xvi_aux:N \__str_output_byte_pair_le:n }
   \cs_new_protected:Npn \__str_encode_utf_xvi_aux:N #1
     {
-      \flag_clear:n { str_error }
+      \flag_clear:n { __str_error }
       \cs_set_eq:NN \__str_tmp:w #1
       \__str_convert_gmap_internal:N \__str_encode_utf_xvi_char:n
-      \__str_if_flag_error:nne { str_error } { utf16-encode } { }
+      \__str_if_flag_error:nne { __str_error } { utf16-encode } { }
     }
   \cs_new:Npn \__str_encode_utf_xvi_char:n #1
     {
@@ -23409,7 +23511,7 @@
       \else:
         \if_int_compare:w #1 < "10000 \exp_stop_f:
           \if_int_compare:w #1 < "E000 \exp_stop_f:
-            \flag_raise:n { str_error }
+            \flag_raise:n { __str_error }
             \__str_tmp:w { \c__str_replacement_char_int }
           \else:
             \__str_tmp:w {#1}
@@ -23420,9 +23522,9 @@
         \fi:
       \fi:
     }
-  \flag_clear_new:n { str_missing }
-  \flag_clear_new:n { str_extra }
-  \flag_clear_new:n { str_end }
+  \flag_clear_new:n { __str_missing }
+  \flag_clear_new:n { __str_extra }
+  \flag_clear_new:n { __str_end }
   \msg_new:nnnn { str } { utf16-encode }
     { Unicode~string~cannot~be~expressed~in~UTF-16:~surrogate. }
     {
@@ -23435,9 +23537,9 @@
       Invalid~UTF-16~string:
       \exp_last_unbraced:Nf \use_none:n
         {
-          \__str_if_flag_times:nT { str_missing }  { ,~missing~trail~surrogate }
-          \__str_if_flag_times:nT { str_extra }    { ,~extra~trail~surrogate }
-          \__str_if_flag_times:nT { str_end }      { ,~odd~number~of~bytes }
+          \__str_if_flag_times:nT { __str_missing }  { ,~missing~trail~surrogate }
+          \__str_if_flag_times:nT { __str_extra }    { ,~extra~trail~surrogate }
+          \__str_if_flag_times:nT { __str_end }      { ,~odd~number~of~bytes }
         }
       .
     }
@@ -23454,17 +23556,17 @@
         }
       Lead~surrogates~are~pairs~of~bytes~in~the~range~[0xD800,~0xDBFF],~
       and~trail~surrogates~are~in~the~range~[0xDC00,~0xDFFF].
-      \flag_if_raised:nT { str_missing }
+      \flag_if_raised:nT { __str_missing }
         {
           \\\\
           A~lead~surrogate~was~not~followed~by~a~trail~surrogate.
         }
-      \flag_if_raised:nT { str_extra }
+      \flag_if_raised:nT { __str_extra }
         {
           \\\\
           LaTeX~came~across~a~trail~surrogate~when~it~was~not~expected.
         }
-      \flag_if_raised:nT { str_end }
+      \flag_if_raised:nT { __str_end }
         {
           \\\\
           The~string~contained~an~odd~number~of~bytes.~This~is~invalid:~
@@ -23492,10 +23594,10 @@
     }
   \cs_new_protected:Npn \__str_decode_utf_xvi:Nw #1#2 \s__str_stop
     {
-      \flag_clear:n { str_error }
-      \flag_clear:n { str_missing }
-      \flag_clear:n { str_extra }
-      \flag_clear:n { str_end }
+      \flag_clear:n { __str_error }
+      \flag_clear:n { __str_missing }
+      \flag_clear:n { __str_extra }
+      \flag_clear:n { __str_end }
       \cs_set:Npn \__str_tmp:w ##1 ##2 { ` ## #1 }
       \__kernel_tl_gset:Ne \g__str_result_tl
         {
@@ -23503,7 +23605,7 @@
             #2 \q__str_nil \q__str_nil
           \prg_break_point:
         }
-      \__str_if_flag_error:nne { str_error } { utf16-decode } { }
+      \__str_if_flag_error:nne { __str_error } { utf16-decode } { }
     }
   \cs_new:Npn \__str_decode_utf_xvi_pair:NN #1#2
     {
@@ -23559,7 +23661,7 @@
     { \__str_decode_utf_xvi_error:nNN { extra } #1#2 }
   \cs_new:Npn \__str_decode_utf_xvi_error:nNN #1#2#3
     {
-      \flag_raise:n { str_error }
+      \flag_raise:n { __str_error }
       \flag_raise:n { str_#1 }
       #2 #3 \s__str
       \int_use:N \c__str_replacement_char_int \s__str
@@ -23600,15 +23702,15 @@
       \__str_output_byte_pair_le:n {#1}
       ^^00
     }
-  \flag_clear_new:n { str_overflow }
-  \flag_clear_new:n { str_end }
+  \flag_clear_new:n { __str_overflow }
+  \flag_clear_new:n { __str_end }
   \msg_new:nnnn { str } { utf32-decode }
     {
       Invalid~UTF-32~string:
       \exp_last_unbraced:Nf \use_none:n
         {
-          \__str_if_flag_times:nT { str_overflow } { ,~code~point~too~large }
-          \__str_if_flag_times:nT { str_end }      { ,~truncated~string }
+          \__str_if_flag_times:nT { __str_overflow } { ,~code~point~too~large }
+          \__str_if_flag_times:nT { __str_end }      { ,~truncated~string }
         }
       .
     }
@@ -23615,7 +23717,7 @@
     {
       In~the~UTF-32~encoding,~every~Unicode~character~
       (in~the~range~[U+0000,~U+10FFFF])~is~encoded~as~4~bytes.
-      \flag_if_raised:nT { str_overflow }
+      \flag_if_raised:nT { __str_overflow }
         {
           \\\\
           LaTeX~came~across~a~code~point~larger~than~1114111,~
@@ -23622,7 +23724,7 @@
           the~maximum~code~point~defined~by~Unicode.~
           Perhaps~the~string~was~not~encoded~in~the~UTF-32~encoding?
         }
-      \flag_if_raised:nT { str_end }
+      \flag_if_raised:nT { __str_end }
         {
           \\\\
           The~length~of~the~string~is~not~a~multiple~of~4.~
@@ -23650,9 +23752,9 @@
     }
   \cs_new_protected:Npn \__str_decode_utf_xxxii:Nw #1#2 \s__str_stop
     {
-      \flag_clear:n { str_overflow }
-      \flag_clear:n { str_end }
-      \flag_clear:n { str_error }
+      \flag_clear:n { __str_overflow }
+      \flag_clear:n { __str_end }
+      \flag_clear:n { __str_error }
       \cs_set:Npn \__str_tmp:w ##1 ##2 { ` ## #1 }
       \__kernel_tl_gset:Ne \g__str_result_tl
         {
@@ -23660,7 +23762,7 @@
             #2 \s__str_stop \s__str_stop \s__str_stop \s__str_stop
           \prg_break_point:
         }
-      \__str_if_flag_error:nne { str_error } { utf32-decode } { }
+      \__str_if_flag_error:nne { __str_error } { utf32-decode } { }
     }
   \cs_new:Npn \__str_decode_utf_xxxii_loop:NNNN #1#2#3#4
     {
@@ -23669,13 +23771,13 @@
       \fi:
       #1#2#3#4 \s__str
       \if_int_compare:w \__str_tmp:w #1#4 > \c_zero_int
-        \flag_raise:n { str_overflow }
-        \flag_raise:n { str_error }
+        \flag_raise:n { __str_overflow }
+        \flag_raise:n { __str_error }
         \int_use:N \c__str_replacement_char_int
       \else:
         \if_int_compare:w \__str_tmp:w #2#3 > 16 \exp_stop_f:
-          \flag_raise:n { str_overflow }
-          \flag_raise:n { str_error }
+          \flag_raise:n { __str_overflow }
+          \flag_raise:n { __str_error }
           \int_use:N \c__str_replacement_char_int
         \else:
           \int_eval:n
@@ -23689,8 +23791,8 @@
     {
       \tl_if_empty:nF {#1}
         {
-          \flag_raise:n { str_end }
-          \flag_raise:n { str_error }
+          \flag_raise:n { __str_end }
+          \flag_raise:n { __str_error }
           #1 \s__str
           \int_use:N \c__str_replacement_char_int \s__str
         }
@@ -31171,19 +31273,6 @@
           }
       }
   }
-\prop_new:N \g__pdf_object_prop
-\cs_new_protected:Npn \pdf_object_new:nn #1#2
-  {
-    \prop_gput:Nnn \g__pdf_object_prop {#1} {#2}
-    \__pdf_backend_object_new:n {#1}
-  }
-\cs_new_protected:Npn \pdf_object_write:nn #1#2
-  {
-    \exp_args:Nne \__pdf_backend_object_write:nnn
-      {#1} { \prop_item:Nn \g__pdf_object_prop {#1} } {#2}
-    \bool_gset_true:N \g__pdf_init_bool
-  }
-\cs_generate_variant:Nn \pdf_object_write:nn { nx }
 %% File: l3coffins.dtx
 \box_new:N \l__coffin_internal_box
 \dim_new:N \l__coffin_internal_dim
@@ -36634,9 +36723,9 @@
 \__deprecation_old_protected:Nnn \tl_show_analysis:n
   { \tl_analysis_show:n } { 2020-01-01 }
 \__deprecation_old:Nnn \tl_case:cnn
-  { \tl_case:cnF } { 2015-07-14 }
+  { \exp_args:Nc \token_case_meaning:NnF } { 2015-07-14 }
 \__deprecation_old:Nnn \tl_case:Nnn
-  { \tl_case:NnF } { 2015-07-14 }
+  { \token_case_meaning:NnF } { 2015-07-14 }
 \__deprecation_old_protected:Nnn \tl_gset_from_file:Nnn
   { \file_get:nnN } { 2021-07-01 }
 \__deprecation_old_protected:Nnn \tl_gset_from_file_x:Nnn
@@ -36668,13 +36757,46 @@
 \__deprecation_old:Nnn \xetex_if_engine:TF
   { \sys_if_engine_xetex:TF } { 2017-01-01 }
 \cs_gset:Npn \cs_argument_spec:N { \cs_parameter_spec:N }
-\__kernel_patch_deprecation:nnNNpn { 2023-05-03 } { \bool_case_true:n }
+\cs_new_protected:Npn \iow_shipout_x:Nn { \iow_shipout_e:Nn }
+\cs_generate_variant:Nn \iow_shipout_x:Nn { Nx , c, cx }
+\cs_new_protected:cpn { \c__keys_props_root_str .str_set_x:N } #1
+  { \__keys_variable_set:NnnN #1 { str } { } x }
+\cs_new_protected:cpn { \c__keys_props_root_str .str_set_x:c } #1
+  { \__keys_variable_set:cnnN {#1} { str } { } x }
+\cs_new_protected:cpn { \c__keys_props_root_str .str_gset_x:N } #1
+  { \__keys_variable_set:NnnN #1 { str } { g } x }
+\cs_new_protected:cpn { \c__keys_props_root_str .str_gset_x:c } #1
+  { \__keys_variable_set:cnnN {#1} { str } { g } x }
+\cs_new_protected:cpn { \c__keys_props_root_str .tl_set_x:N } #1
+  { \__keys_variable_set:NnnN #1 { tl } { } x }
+\cs_new_protected:cpn { \c__keys_props_root_str .tl_set_x:c } #1
+  { \__keys_variable_set:cnnN {#1} { tl } { } x }
+\cs_new_protected:cpn { \c__keys_props_root_str .tl_gset_x:N } #1
+  { \__keys_variable_set:NnnN #1 { tl } { g } x }
+\cs_new_protected:cpn { \c__keys_props_root_str .tl_gset_x:c } #1
+  { \__keys_variable_set:cnnN {#1} { tl } { g } x }
+\prop_new:N \g__keys_object_prop
+\__kernel_patch_deprecation:nnNNpn { 2022-08-30 } { [\pdf_object_new:n] }
+\cs_new_protected:Npn \pdf_object_new:nn #1#2
+  {
+    \prop_gput:Nnn \g__keys_object_prop {#1} {#2}
+    \__keys_backend_object_new:n {#1}
+  }
+\__kernel_patch_deprecation:nnNNpn { 2022-08-30 } { [\pdf_object_write:n] }
+\cs_new_protected:Npn \pdf_object_write:nn #1#2
+  {
+    \exp_args:Nne \__keys_backend_object_write:nnn
+      {#1} { \prop_item:Nn \g__keys_object_prop {#1} } {#2}
+    \bool_gset_true:N \g__keys_init_bool
+  }
+\cs_generate_variant:Nn \pdf_object_write:nn { nx }
+\__kernel_patch_deprecation:nnNNpn { 2023-05-03 } { \bool_case:n }
 \cs_gset:Npn \bool_case_true:n { \bool_case:n }
-\__kernel_patch_deprecation:nnNNpn { 2023-05-03 } { \bool_case_true:nT }
+\__kernel_patch_deprecation:nnNNpn { 2023-05-03 } { \bool_case:nT }
 \cs_gset:Npn \bool_case_true:nT { \bool_case:nT }
-\__kernel_patch_deprecation:nnNNpn { 2023-05-03 } { \bool_case_true:nF }
+\__kernel_patch_deprecation:nnNNpn { 2023-05-03 } { \bool_case:nF }
 \cs_gset:Npn \bool_case_true:nF { \bool_case:nF }
-\__kernel_patch_deprecation:nnNNpn { 2023-05-03 } { \bool_case_true:nTF }
+\__kernel_patch_deprecation:nnNNpn { 2023-05-03 } { \bool_case:nTF }
 \cs_gset:Npn \bool_case_true:nTF { \bool_case:nTF }
 \__kernel_patch_deprecation:nnNNpn { 2020-01-03 } { \str_lowercase:n }
 \cs_gset:Npn \str_lower_case:n { \str_lowercase:n }
@@ -36699,7 +36821,7 @@
 \cs_gset_protected:Npn \seq_indexed_map_inline:Nn { \seq_map_indexed_inline:Nn }
 \__kernel_patch_deprecation:nnNNpn { 2020-06-18 } { \seq_map_indexed_function:NN }
 \cs_gset:Npn \seq_indexed_map_function:NN { \seq_map_indexed_function:NN }
-\__kernel_patch_deprecation:nnNNpn { 2023-05-10 } { \seq_mapthread_function:NNN }
+\__kernel_patch_deprecation:nnNNpn { 2023-05-10 } { \seq_map_pairwise_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 }
@@ -36746,7 +36868,7 @@
 \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 ] }
+\__kernel_patch_deprecation:nnNNpn { 2022-10-09 } { [ \codepoint_generate:nn ] }
 \cs_gset:Npn \char_to_utfviii_bytes:n { \__kernel_codepoint_to_bytes:n }
 \__kernel_patch_deprecation:nnNNpn { 2022-10-09 } { \codepoint_to_nfd:n }
 \cs_gset:Npn \char_to_nfd:N #1 { \codepoint_to_nfd:n {`#1} }
@@ -36772,10 +36894,16 @@
 \cs_gset:Npn \char_lowercase:N { \text_lowercase:n }
 \__kernel_patch_deprecation:nnNNpn { 2022-10-17 } { \text_uppercase:n }
 \cs_gset:Npn \char_uppercase:N { \text_uppercase:n }
+\__kernel_patch_deprecation:nnNNpn { 2022-10-17 } { \text_titlecase_first:n }
+\cs_gset:Npn \char_titlecase:N { \text_titlecase_first:n }
 \__kernel_patch_deprecation:nnNNpn { 2022-10-17 } { \str_casefold:n }
 \cs_gset:Npn \char_foldcase:N { \str_casefold:n }
 \__kernel_patch_deprecation:nnNNpn { 2022-10-17 } { \str_lowercase:n }
 \cs_gset:Npn \char_str_lowercase:N { \str_lowercase:n }
+\__kernel_patch_deprecation:nnNNpn { 2022-10-17 }
+  { \tl_to_str:e { \text_titlecase_first:n } }
+\cs_gset:Npn \char_str_titlecase:N #1
+  { \tl_to_str:e { \text_titlecase_first:n {#1} } }
 \__kernel_patch_deprecation:nnNNpn { 2022-10-17 } { \str_uppercase:n }
 \cs_gset:Npn \char_str_uppercase:N { \str_uppercase:n }
 \__kernel_patch_deprecation:nnNNpn { 2022-10-17 } { \str_casefold:n }

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex	2023-12-08 21:36:03 UTC (rev 69066)
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx
-\def\ExplFileDate{2023-11-09}%
+\def\ExplFileDate{2023-12-08}%
 \let\ExplLoaderFileDate\ExplFileDate
 \begingroup
   \catcode`\_=11
@@ -92,7 +92,7 @@
       }
     \tex_input:D #1 .def \scan_stop:
   }
-\sys_everyjob:
+\__kernel_sys_everyjob:
 \bool_new:N \g__kernel_backend_header_bool
 \bool_gset_true:N \g__kernel_backend_header_bool
 \sys_load_backend:n { }

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.ltx
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.ltx	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.ltx	2023-12-08 21:36:03 UTC (rev 69066)
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx
-\def\ExplFileDate{2023-11-09}%
+\def\ExplFileDate{2023-12-08}%
 \let\ExplLoaderFileDate\ExplFileDate
 \begingroup
   \catcode`\_=11
@@ -137,10 +137,10 @@
     \tex_everyjob:D \exp_after:wN
       {
         \tex_the:D \tex_everyjob:D
-        \sys_everyjob:
+        \__kernel_sys_everyjob:
       }
   }
-  { \sys_everyjob: }
+  { \__kernel_sys_everyjob: }
 \reverse_if:N \if_cs_exist:N \s__expl_stop
   \scan_new:N \s__expl_stop
 \fi:

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty	2023-12-08 21:36:03 UTC (rev 69066)
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx
-\def\ExplFileDate{2023-11-09}%
+\def\ExplFileDate{2023-12-08}%
 \let\ExplLoaderFileDate\ExplFileDate
 \ProvidesPackage{expl3}
   [%
@@ -164,10 +164,10 @@
     \tex_everyjob:D \exp_after:wN
       {
         \tex_the:D \tex_everyjob:D
-        \sys_everyjob:
+        \__kernel_sys_everyjob:
       }
   }
-  { \sys_everyjob: }
+  { \__kernel_sys_everyjob: }
 \reverse_if:N \if_cs_exist:N \s__expl_stop
   \scan_new:N \s__expl_stop
 \fi:

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3debug.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3debug.def	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3debug.def	2023-12-08 21:36:03 UTC (rev 69066)
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: l3debug.dtx
-\ProvidesExplFile{l3debug.def}{2019-04-06}{}{L3 Debugging support}
+\ProvidesExplFile{l3debug.def}{2023-12-08}{}{L3 Debugging support}
 \scan_new:N \s__debug_stop
 \cs_new:Npn \__debug_use_i_delimit_by_s_stop:nw #1 #2 \s__debug_stop {#1}
 \quark_new:N \q__debug_recursion_tail
@@ -466,6 +466,10 @@
       \skip_set_eq:NN
       \skip_add:Nn
       \skip_sub:Nn
+      \str_clear:N
+      \str_set_eq:NN
+      \str_put_left:Nn
+      \str_put_right:Nn
       \__kernel_tl_set:Ne
       \tl_clear:N
       \tl_set_eq:NN
@@ -531,6 +535,10 @@
       \skip_gset_eq:NN
       \skip_gadd:Nn
       \skip_gsub:Nn
+      \str_gclear:N
+      \str_gset_eq:NN
+      \str_gput_left:Nn
+      \str_gput_right:Nn
       \__kernel_tl_gset:Ne
       \tl_gclear:N
       \tl_gset_eq:NN
@@ -565,6 +573,7 @@
       \intarray_const_from_clist:Nn
       \muskip_const:Nn
       \skip_const:Nn
+      \str_const:Nn
       \tl_const:Nn
     }
   \__kernel_patch:nnn

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls	2023-12-08 21:35:35 UTC (rev 69065)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls	2023-12-08 21:36:03 UTC (rev 69066)
@@ -42,8 +42,9 @@
 \prop_new:N \g__codedoc_missing_tests_prop
 \seq_new:N \g__codedoc_not_tested_seq
 \seq_new:N \g__codedoc_testfiles_seq
-\bool_new:N \l__codedoc_macro_internal_set_bool
+\bool_new:N \l__codedoc_macro_deprecated_bool
 \bool_new:N \l__codedoc_macro_internal_bool
+\bool_new:N \l__codedoc_macro_nodoc_bool
 \bool_new:N \l__codedoc_macro_TF_bool
 \bool_new:N \l__codedoc_macro_pTF_bool
 \bool_new:N \l__codedoc_macro_noTF_bool
@@ -102,33 +103,16 @@
 \cs_new_eq:NN \__codedoc_tmpa:w ?
 \cs_new_eq:NN \__codedoc_tmpb:w ?
 \cs_generate_variant:Nn \seq_set_split:Nnn { NoV }
-\cs_generate_variant:Nn \seq_gput_right:Nn { Nf }
-\cs_generate_variant:Nn \str_case:nn { fn }
-\cs_generate_variant:Nn \tl_count:n { f }
-\cs_generate_variant:Nn \tl_greplace_all:Nnn { Nx , Nno }
-\cs_generate_variant:Nn \tl_if_empty:nTF { f }
-\cs_generate_variant:Nn \tl_if_head_eq_charcode:nNTF { o }
-\cs_generate_variant:Nn \tl_if_head_eq_charcode:nNT  { o }
-\cs_generate_variant:Nn \tl_if_head_eq_charcode:nNF  { o }
-\cs_generate_variant:Nn \tl_if_head_eq_meaning:nNF  { V }
-\cs_generate_variant:Nn \tl_if_in:nnTF { no , oo }
-\cs_generate_variant:Nn \tl_if_in:NnTF { No }
-\cs_generate_variant:Nn \tl_if_in:NnT  { No }
-\cs_generate_variant:Nn \tl_if_in:NnF  { No }
-\cs_generate_variant:Nn \tl_remove_all:Nn   { Nx }
-\cs_generate_variant:Nn \tl_replace_all:Nnn { Nx , Nnx, No , Nno }
-\cs_generate_variant:Nn \tl_replace_once:Nnn { Noo }
-\cs_generate_variant:Nn \tl_set_rescan:Nnn { NnV }
-\cs_generate_variant:Nn \tl_to_str:n { f , o }
+\cs_generate_variant:Nn \tl_to_str:n { f }
 \prg_new_protected_conditional:Npnn \__codedoc_if_almost_str:n #1 { TF , T , F }
   {
     \int_compare:nNnTF
       { \tl_count:n {#1} }
-      < { \tl_count:f { \tl_to_str:f {#1} } }
+      < { \tl_count:e { \tl_to_str:f {#1} } }
       { \prg_return_false: }
       { \prg_return_true: }
   }
-\cs_generate_variant:Nn \__codedoc_if_almost_str:nT { V }
+\prg_generate_conditional_variant:Nnn \__codedoc_if_almost_str:n { V } { T }
 \cs_new_protected:Npn \__codedoc_trim_right:Nn #1#2
   {
     \cs_set:Npn \__codedoc_tmp:w ##1 #2 ##2 \q_stop { \exp_not:n {##1} }
@@ -173,7 +157,7 @@
   \cs_new_protected:Npn \__codedoc_detect_internals_aux:N #1
     {
       \tl_set_eq:NN \l__codedoc_detect_internals_tl #1
-      \tl_replace_all:Non \l__codedoc_detect_internals_tl { \token_to_str:N _ } { _ }
+      \tl_replace_all:NVn \l__codedoc_detect_internals_tl \c_underscore_str { _ }
       \seq_set_split:NnV \l__codedoc_tmpa_seq { _ _ } \l__codedoc_detect_internals_tl
       \seq_pop_left:NN \l__codedoc_tmpa_seq \l__codedoc_detect_internals_tl
       \seq_map_variable:NNn \l__codedoc_tmpa_seq \l__codedoc_detect_internals_tl
@@ -695,9 +679,9 @@
     \bool_if:NT \l__codedoc_cmd_replace_bool
       {
         \tl_set_rescan:Nnn \l__codedoc_tmpb_tl { } { _ }
-        \tl_replace_all:Non \l__codedoc_cmd_tl \l__codedoc_tmpb_tl { _ }
+        \tl_replace_all:NVn \l__codedoc_cmd_tl \l__codedoc_tmpb_tl { _ }
         \__codedoc_replace_at_at:N \l__codedoc_cmd_tl
-        \tl_replace_all:Nno \l__codedoc_cmd_tl { _ } \l__codedoc_tmpb_tl
+        \tl_replace_all:NnV \l__codedoc_cmd_tl { _ } \l__codedoc_tmpb_tl
       }
     \mode_if_math:T { \mbox }
       {
@@ -751,7 +735,7 @@
       {
         \tl_set_rescan:Nnn \l__codedoc_tmpb_tl
           { \char_set_catcode:nn { `_ } {##1} } { _ }
-        \tl_replace_all:Non \l__codedoc_tmpa_tl \l__codedoc_tmpb_tl
+        \tl_replace_all:NVn \l__codedoc_tmpa_tl \l__codedoc_tmpb_tl
           { \__codedoc_ensuremath_sb:n }
       }
     \exp_args:NV \__codedoc_meta_original:n \l__codedoc_tmpa_tl
@@ -809,8 +793,8 @@
 \cs_new_protected:Npn \__codedoc_get_hyper_target:nN #1#2
   {
     \__kernel_tl_set:Ne #2 { \tl_to_str:n {#1} }
-    \tl_replace_all:Nen #2 { \c_underscore_str } { / }
-    \tl_remove_all:Ne   #2 { \c_backslash_str }
+    \tl_replace_all:NVn #2 \c_underscore_str { / }
+    \tl_remove_all:NV   #2 \c_backslash_str
     \tl_put_left:Nn #2 { doc/function// }
   }
 \cs_generate_variant:Nn \__codedoc_get_hyper_target:nN { o , e }
@@ -886,8 +870,8 @@
   {
     \seq_pop:NN #1 \l__codedoc_tmpa_tl
     \tl_gset_eq:NN \g__codedoc_base_name_tl \l__codedoc_tmpa_tl
-    \tl_greplace_all:Nno \g__codedoc_base_name_tl
-      { ~ } { \c_catcode_other_space_tl }
+    \tl_greplace_all:NnV \g__codedoc_base_name_tl
+      { ~ } \c_catcode_other_space_tl
     \seq_get:NN #1 \l__codedoc_tmpa_tl
     \str_if_eq:VnTF \l__codedoc_tmpa_tl { \scan_stop: }
       {
@@ -923,13 +907,10 @@
 \cs_generate_variant:Nn \__codedoc_names_typeset_block:nN { e }
 \prg_new_conditional:Npnn \__codedoc_if_macro_internal:n #1 { p , T , F , TF }
   {
-    \bool_if:NTF \l__codedoc_macro_internal_set_bool
+    \bool_if:NTF \l__codedoc_macro_internal_bool
+      { \prg_return_true: }
       {
-        \bool_if:NTF \l__codedoc_macro_internal_bool
-          { \prg_return_true: } { \prg_return_false: }
-      }
-      {
-        \tl_if_empty:fTF
+        \tl_if_empty:eTF
           {
             \exp_after:wN \__codedoc_if_macro_internal_aux:w
             \tl_to_str:n { #1 ~ __ }
@@ -993,7 +974,8 @@
       } ,
     added .code:n = { \__codedoc_date_set_past:Nn \l__codedoc_date_added_tl {#1} },
     updated .code:n = { \__codedoc_date_set_past:Nn \l__codedoc_date_updated_tl {#1} } ,
-    deprecated .code:n = {} , % A stub
+    deprecated .bool_set:N = \l__codedoc_macro_deprecated_bool ,
+    no-user-doc .bool_set:N = \l__codedoc_macro_nodoc_bool ,
     tested .code:n = { } ,
     label .code:n =
       {
@@ -1292,18 +1274,14 @@
         \msg_warning:nnnn { l3doc } { deprecated-option }
           { aux } { function/macro }
       } ,
+    deprecated .bool_set:N = \l__codedoc_macro_deprecated_bool ,
     internal .value_forbidden:n = true ,
     internal .code:n =
-      {
-        \bool_set_true:N \l__codedoc_macro_internal_bool
-        \bool_set_true:N \l__codedoc_macro_internal_set_bool
-      } ,
+      { \bool_set_true:N \l__codedoc_macro_internal_bool } ,
     int .value_forbidden:n = true ,
     int .code:n =
-      {
-        \bool_set_true:N \l__codedoc_macro_internal_bool
-        \bool_set_true:N \l__codedoc_macro_internal_set_bool
-      } ,
+      { \bool_set_true:N \l__codedoc_macro_internal_bool } ,
+    no-user-doc .bool_set:N = \l__codedoc_macro_nodoc_bool ,
     var .value_forbidden:n = true ,
     var .code:n =
       { \bool_set_true:N \l__codedoc_macro_var_bool } ,
@@ -1342,7 +1320,6 @@
       } ,
     added .code:n = {} , % TODO
     updated .code:n = {} , % TODO
-    deprecated .code:n = {} , % A stub
     verb .bool_set:N = \l__codedoc_names_verb_bool ,
     module .tl_set:N = \l__codedoc_override_module_tl ,
     documented-as .tl_set:N = \l__codedoc_macro_documented_tl ,
@@ -1366,8 +1343,8 @@
 \cs_new_protected:Npn \__codedoc_macro_init:
   {
     \int_incr:N \l__codedoc_nested_macro_int
+    \bool_set_false:N \l__codedoc_macro_deprecated_bool
     \bool_set_false:N \l__codedoc_macro_internal_bool
-    \bool_set_false:N \l__codedoc_macro_internal_set_bool
     \bool_set_false:N \l__codedoc_macro_TF_bool
     \bool_set_false:N \l__codedoc_macro_pTF_bool
     \bool_set_false:N \l__codedoc_macro_noTF_bool
@@ -1399,8 +1376,8 @@
     \tl_if_empty:NTF \l__codedoc_macro_documented_tl
       { \__codedoc_names_block_base_map:N \__codedoc_macro_save_names_aux:n }
       {
-        \seq_gput_right:Nf \g__codedoc_nested_names_seq
-          { \exp_after:wN \token_to_str:N \l__codedoc_macro_documented_tl }
+        \seq_gput_right:Ne \g__codedoc_nested_names_seq
+          { \tl_to_str:N \l__codedoc_macro_documented_tl }
       }
   }
 \cs_new_protected:Npn \__codedoc_macro_save_names_aux:n #1
@@ -1446,7 +1423,6 @@
           { \__codedoc_get_function_name:n {#1} } #2
       }
   }
-\cs_generate_variant:Nn \__codedoc_macro_typeset_block:nN { x }
 \cs_new_protected:Npn \__codedoc_macro_typeset_variant_list:nN #1#2
   {
     \seq_map_inline:Nn \g__codedoc_variants_seq
@@ -1467,7 +1443,12 @@
     \DoNotIndex {#1}
     \bool_if:NT #2
       {
-        \__codedoc_if_macro_internal:nF {#1}
+        \bool_lazy_any:nF
+          {
+            { \__codedoc_if_macro_internal_p:n {#1} }
+            { \l__codedoc_macro_deprecated_bool }
+            { \l__codedoc_macro_nodoc_bool }
+          }
           { \seq_gput_right:Nn \g_doc_macros_seq {#1} }
         \hbox_set:Nw \l__codedoc_macro_index_box
           \hbox_unpack_drop:N \l__codedoc_macro_index_box
@@ -1505,8 +1486,8 @@
         \int_compare:nTF { \str_count:n {#1} <= 28 }
           { \MacroFont } { \MacroLongFont }
         \tl_set:Nn \l__codedoc_tmpa_tl {#1}
-        \tl_replace_all:Nno \l__codedoc_tmpa_tl
-          { ~ } { \c_catcode_other_space_tl }
+        \tl_replace_all:NnV \l__codedoc_tmpa_tl
+          { ~ } \c_catcode_other_space_tl
         \__codedoc_macroname_prefix:o \l__codedoc_tmpa_tl
         \__codedoc_macroname_suffix:N #2
       }
@@ -1609,8 +1590,8 @@
 \cs_new_protected:Npn \__codedoc_macro_end_wrap_item:n #1
   {
     \tl_set:Nn \l__codedoc_tmpa_tl {#1}
-    \tl_replace_all:Non \l__codedoc_tmpa_tl
-      { \token_to_str:N _ } { \_ }
+    \tl_replace_all:NVn \l__codedoc_tmpa_tl
+      \c_underscore_str { \_ }
     \texttt { \l__codedoc_tmpa_tl }
   }
 \cs_new_protected:Npn \__codedoc_print_end_definition:
@@ -1632,7 +1613,14 @@
   {
     \seq_gset_filter:NNn \g__codedoc_nested_names_seq
       \g__codedoc_nested_names_seq
-      { ! \__codedoc_if_macro_internal_p:n {##1} }
+      {
+        ! \bool_lazy_any_p:n
+          {
+            { \__codedoc_if_macro_internal_p:n {##1} }
+            { \l__codedoc_macro_deprecated_bool }
+            { \l__codedoc_macro_nodoc_bool }
+          }
+      }
     \seq_if_empty:NF \g__codedoc_nested_names_seq
       {
         \int_set:Nn \l__codedoc_tmpa_int
@@ -1995,18 +1983,18 @@
         \tl_clear:N \l__codedoc_doc_def_tl
         \tl_clear:N \l__codedoc_doc_undef_tl
         \tl_clear:N \l__codedoc_undoc_def_tl
+        \seq_gremove_duplicates:N \g_doc_functions_seq
+        \seq_gremove_duplicates:N \g_doc_macros_seq
         \seq_map_inline:Nn \g_doc_functions_seq
           {
             \seq_if_in:NnTF \g_doc_macros_seq {##1}
               {
                 \tl_put_right:Ne \l__codedoc_doc_def_tl
-                  { ##1 \iow_newline: }
-                \iow_now:Nn \g__codedoc_func_iow { > ~ ##1 }
+                  { \iow_newline: > ~ ##1 }
               }
               {
                 \tl_put_right:Ne \l__codedoc_doc_undef_tl
-                  { ##1 \iow_newline: }
-                \iow_now:Nn \g__codedoc_func_iow { ! ~ ##1 }
+                  { \iow_newline: ! ~ ##1 }
               }
           }
         \seq_map_inline:Nn \g_doc_macros_seq
@@ -2014,8 +2002,7 @@
             \seq_if_in:NnF \g_doc_functions_seq {##1}
               {
                 \tl_put_right:Ne \l__codedoc_undoc_def_tl
-                  { ##1 \iow_newline: }
-                \iow_now:Nn \g__codedoc_func_iow { ? ~ ##1 }
+                  { \iow_newline: ? ~ ##1 }
               }
           }
         \__codedoc_functions_typeout:nN
@@ -2040,11 +2027,11 @@
   {
     \tl_if_empty:NF #2
       {
-        \typeout
+        \iow_now:Ne \g__codedoc_func_iow
           {
             \c__codedoc_iow_midrule_tl \iow_newline:
             #1 \iow_newline:
-            \c__codedoc_iow_midrule_tl \iow_newline:
+            \c__codedoc_iow_midrule_tl
             #2
           }
         \tl_clear:N #2
@@ -2275,7 +2262,7 @@
     \__kernel_tl_set:Ne #1 { \tl_to_str:n {#2} }
     \__codedoc_if_almost_str:nTF {#2}
       {
-        \tl_replace_all:Non #1 { \tl_to_str:n { __ } }
+        \tl_replace_all:Nen #1 { \tl_to_str:n { __ } }
           {
             \verbatimchar
             \token_to_str:N \_ \token_to_str:N \_
@@ -2298,8 +2285,8 @@
       }
       {
         \tl_set:Nn #1 {#2}
-        \tl_replace_all:Non #1
-          { \c_backslash_str }
+        \tl_replace_all:NVn #1
+          \c_backslash_str
           { \token_to_str:N \bslash \c_space_tl }
       }
     \__codedoc_quote_special_char:N #1
@@ -2312,27 +2299,26 @@
           { \tl_to_str:N ##1 } { \quotechar \tl_to_str:N ##1 }
       }
   }
-\cs_new_protected:Npn \__codedoc_key_get:n #1
+\cs_new_protected:Npe \__codedoc_key_get:n #1
   {
-    \__codedoc_key_get_base:nN {#1} \l__codedoc_index_macro_tl
-    \__kernel_tl_set:Ne \l__codedoc_index_key_tl
-      { \tl_to_str:N \l__codedoc_index_macro_tl }
-    \tl_clear:N \l__codedoc_index_module_tl
-    \tl_if_in:NoTF \l__codedoc_index_key_tl { \tl_to_str:n { __ } }
-      { \bool_set_true:N \l__codedoc_index_internal_bool }
-      { \bool_set_false:N \l__codedoc_index_internal_bool }
-    \exp_last_unbraced:NNo
-    \tl_if_head_eq_charcode:oNT
-      { \l__codedoc_index_key_tl } \c_backslash_str
-      { \__codedoc_key_pop: }
-    \tl_if_in:NoTF \l__codedoc_index_key_tl { \token_to_str:N : }
-      { \__codedoc_key_func: }
+    \exp_not:N \__codedoc_key_get_base:nN {#1} \exp_not:N \l__codedoc_index_macro_tl
+    \__kernel_tl_set:Ne \exp_not:N \l__codedoc_index_key_tl
+      { \exp_not:N \tl_to_str:N \exp_not:N \l__codedoc_index_macro_tl }
+    \tl_clear:N \exp_not:N \l__codedoc_index_module_tl
+    \tl_if_in:NnTF \exp_not:N \l__codedoc_index_key_tl { \tl_to_str:n { __ } }
+      { \bool_set_true:N \exp_not:N \l__codedoc_index_internal_bool }
+      { \bool_set_false:N \exp_not:N \l__codedoc_index_internal_bool }
+    \exp_not:N \tl_if_head_eq_charcode:VNT
+      \exp_not:N \l__codedoc_index_key_tl \c_backslash_str
+      { \exp_not:N \__codedoc_key_pop: }
+    \tl_if_in:NnTF \exp_not:N \l__codedoc_index_key_tl { \token_to_str:N : }
+      { \exp_not:N \__codedoc_key_func: }
       {
-        \tl_if_in:NoTF \l__codedoc_index_key_tl { \token_to_str:N _ }
-          { \__codedoc_key_var: }
+        \tl_if_in:NnTF \exp_not:N \l__codedoc_index_key_tl { \token_to_str:N _ }
+          { \exp_not:N \__codedoc_key_var: }
           {
-            \tl_if_in:NoT \l__codedoc_index_key_tl { \token_to_str:N @ }
-              { \tl_set:Nn \l__codedoc_index_module_tl { TeX } }
+            \tl_if_in:NnT \exp_not:N \l__codedoc_index_key_tl { \token_to_str:N @ }
+              { \tl_set:Nn \exp_not:N \l__codedoc_index_module_tl { TeX } }
           }
       }
   }
@@ -2350,12 +2336,12 @@
   }
 \cs_new_protected:Npn \__codedoc_key_drop_underscores:
   {
-    \tl_if_head_eq_charcode:oNT { \l__codedoc_index_key_tl } _
+    \tl_if_head_eq_charcode:VNT \l__codedoc_index_key_tl _
       { \__codedoc_key_pop: \__codedoc_key_drop_underscores: }
   }
 \cs_new_protected:Npn \__codedoc_key_func:
   {
-    \tl_if_head_eq_charcode:oNT { \l__codedoc_index_key_tl } .
+    \tl_if_head_eq_charcode:VNT \l__codedoc_index_key_tl .
       { \__codedoc_key_pop: }
     \__codedoc_key_drop_underscores:
     \tl_set_eq:NN \l__codedoc_index_module_tl \l__codedoc_index_key_tl
@@ -2367,7 +2353,7 @@
     \exp_args:Ne \tl_if_head_eq_charcode:nNTF
       { \exp_args:No \str_tail:n \l__codedoc_index_key_tl } _
       {
-        \str_case:fn { \str_head:N \l__codedoc_index_key_tl }
+        \str_case:en { \str_head:N \l__codedoc_index_key_tl }
           {
             { q } { \tl_set:Nn \l__codedoc_index_module_tl { quark } }
             { s } { \tl_set:Nn \l__codedoc_index_module_tl { scan } }



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