texlive[75056] Master/texmf-dist: l3kernel-dev (29apr25)

commits+karl at tug.org commits+karl at tug.org
Tue Apr 29 21:46:22 CEST 2025


Revision: 75056
          https://tug.org/svn/texlive?view=revision&revision=75056
Author:   karl
Date:     2025-04-29 21:46:22 +0200 (Tue, 29 Apr 2025)
Log Message:
-----------
l3kernel-dev (29apr25)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/CHANGELOG.md
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/README.md
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/expl3.pdf
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/interface3.pdf
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/interface3.tex
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3doc.pdf
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3docstrip.pdf
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3news.pdf
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3news01.pdf
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3news02.pdf
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3news03.pdf
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3news04.pdf
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3news05.pdf
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3news06.pdf
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3news07.pdf
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3news08.pdf
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3news09.pdf
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3news10.pdf
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3news11.pdf
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3news12.pdf
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3prefixes.pdf
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3styleguide.pdf
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3styleguide.tex
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3syntax-changes.pdf
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3syntax-changes.tex
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3term-glossary.pdf
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3term-glossary.tex
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/source3.pdf
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/source3.tex
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/expl3.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3basics.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3benchmark.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3bitset.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3bootstrap.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3box.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3cctab.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3clist.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3coffins.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3color.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3debug.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3deprecation.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3doc.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3docstrip.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3expan.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3file.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3flag.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-assign.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-aux.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-basics.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-convert.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-expo.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-extended.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-functions.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-logic.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-parse.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-random.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-round.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-symbolic.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-traps.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-trig.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-types.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fparray.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3graphics.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3int.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3intarray.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3kernel-functions.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3keys.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3legacy.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3luatex.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3msg.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3names.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3opacity.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3pdf.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3prg.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3prop.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3quark.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3regex.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3seq.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3skip.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3sort.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3str-convert.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3str.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3sys.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3text-case.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3text-map.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3text-purify.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3text.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3tl-analysis.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3tl-build.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3tl.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3token.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3unicode.dtx
    trunk/Master/texmf-dist/tex/latex-dev/l3kernel/expl3-code.tex
    trunk/Master/texmf-dist/tex/latex-dev/l3kernel/expl3-generic.tex
    trunk/Master/texmf-dist/tex/latex-dev/l3kernel/expl3.ltx
    trunk/Master/texmf-dist/tex/latex-dev/l3kernel/expl3.lua
    trunk/Master/texmf-dist/tex/latex-dev/l3kernel/expl3.sty
    trunk/Master/texmf-dist/tex/latex-dev/l3kernel/l3debug.def
    trunk/Master/texmf-dist/tex/latex-dev/l3kernel/l3doc.cls

Modified: trunk/Master/texmf-dist/doc/latex-dev/l3kernel/CHANGELOG.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex-dev/l3kernel/CHANGELOG.md	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/doc/latex-dev/l3kernel/CHANGELOG.md	2025-04-29 19:46:22 UTC (rev 75056)
@@ -7,6 +7,11 @@
 
 ## [Unreleased]
 
+## [2025-04-29]
+
+### Fixed
+- Support for LuaMetaTeX in generic mode (issue \#1702)
+
 ## [2025-04-14]
 
 ### Added
@@ -1886,7 +1891,8 @@
 - Step functions have been added for dim variables,
   e.g. `\dim_step_inline:nnnn`
 
-[Unreleased]: https://github.com/latex3/latex3/compare/2025-04-14...HEAD
+[Unreleased]: https://github.com/latex3/latex3/compare/2025-04-29...HEAD
+[2025-04-29]: https://github.com/latex3/latex3/compare/2025-04-14...2025-04-29
 [2025-04-14]: https://github.com/latex3/latex3/compare/2025-03-26...2025-04-14
 [2025-03-26]: https://github.com/latex3/latex3/compare/2025-03-10...2025-03-26
 [2025-03-10]: https://github.com/latex3/latex3/compare/2025-01-18...2025-03-10

Modified: trunk/Master/texmf-dist/doc/latex-dev/l3kernel/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex-dev/l3kernel/README.md	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/doc/latex-dev/l3kernel/README.md	2025-04-29 19:46:22 UTC (rev 75056)
@@ -1,7 +1,7 @@
 LaTeX3 Programming Conventions
 ==============================
 
-Release 2025-04-14
+Release 2025-04-29
 
 Overview
 --------

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

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

Modified: trunk/Master/texmf-dist/doc/latex-dev/l3kernel/interface3.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex-dev/l3kernel/interface3.tex	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/doc/latex-dev/l3kernel/interface3.tex	2025-04-29 19:46:22 UTC (rev 75056)
@@ -58,7 +58,7 @@
          {latex-team at latex-project.org}%
    }%
 }
-\date{Released 2025-04-14}
+\date{Released 2025-04-29}
 
 \pagenumbering{roman}
 \maketitle

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Modified: trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3styleguide.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3styleguide.tex	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3styleguide.tex	2025-04-29 19:46:22 UTC (rev 75056)
@@ -32,7 +32,7 @@
         {latex-team at latex-project.org}%
     }%
 }
-\date{Released 2025-04-14}
+\date{Released 2025-04-29}
 
 \begin{document}
 

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

Modified: trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3syntax-changes.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3syntax-changes.tex	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3syntax-changes.tex	2025-04-29 19:46:22 UTC (rev 75056)
@@ -32,7 +32,7 @@
         {latex-team at latex-project.org}%
     }%
 }
-\date{Released 2025-04-14}
+\date{Released 2025-04-29}
 
 \newcommand{\TF}{\textit{(TF)}}
 

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

Modified: trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3term-glossary.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3term-glossary.tex	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3term-glossary.tex	2025-04-29 19:46:22 UTC (rev 75056)
@@ -32,7 +32,7 @@
         {latex-team at latex-project.org}%
     }%
 }
-\date{Released 2025-04-14}
+\date{Released 2025-04-29}
 
 \newcommand{\TF}{\textit{(TF)}}
 

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

Modified: trunk/Master/texmf-dist/doc/latex-dev/l3kernel/source3.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex-dev/l3kernel/source3.tex	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/doc/latex-dev/l3kernel/source3.tex	2025-04-29 19:46:22 UTC (rev 75056)
@@ -57,7 +57,7 @@
          {latex-team at latex-project.org}%
    }%
 }
-\date{Released 2025-04-14}
+\date{Released 2025-04-29}
 
 \pagenumbering{roman}
 \maketitle

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/expl3.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/expl3.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/expl3.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -22,7 +22,7 @@
 %
 % for those people who are interested.
 %
-\def\ExplFileDate{2025-04-14}%
+\def\ExplFileDate{2025-04-29}%
 %<*driver>
 \documentclass[full]{l3doc}
 \usepackage{graphicx}
@@ -49,7 +49,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3basics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3basics.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3basics.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3benchmark.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3benchmark.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3benchmark.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3bitset.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3bitset.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3bitset.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3bootstrap.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3bootstrap.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3bootstrap.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3box.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3box.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3box.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3cctab.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3cctab.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3cctab.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3clist.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3clist.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3clist.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3coffins.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3coffins.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3coffins.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3color.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3color.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3color.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3debug.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3debug.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3debug.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %
@@ -69,7 +69,7 @@
 %
 % Standard file identification.
 %    \begin{macrocode}
-\ProvidesExplFile{l3debug.def}{2025-04-14}{}{L3 Debugging support}
+\ProvidesExplFile{l3debug.def}{2025-04-29}{}{L3 Debugging support}
 %    \end{macrocode}
 %
 % \begin{variable}{\s_@@_stop}
@@ -1410,8 +1410,8 @@
         \skip_use:N \tex_glueexpr:D
           \__kernel_chk_expr:nNnN
             {##1} \tex_glueexpr:D { } \skip_if_finite:n
-        ; \prg_return_false:
-        #1 ; \prg_return_true: \s_@@_stop
+        \@@_sep: \prg_return_false:
+        #1 \@@_sep: \prg_return_true: \s_@@_stop
       }
   }
 \exp_args:No \@@_tmp:w { \tl_to_str:n { fil } }

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3deprecation.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3deprecation.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3deprecation.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3doc.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3doc.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3doc.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -71,7 +71,7 @@
 % This isn't included in the typeset documentation because it's a bit
 % ugly:
 %<*class>
-\ProvidesExplClass{l3doc}{2025-04-14}{}
+\ProvidesExplClass{l3doc}{2025-04-29}{}
   {L3 Experimental documentation class}
 %</class>
 % \fi
@@ -84,7 +84,7 @@
 %    require you to do updates, if the class changes.}}
 %
 % \author{\Team}
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 % \maketitle
 % \tableofcontents
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3docstrip.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3docstrip.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3docstrip.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -63,7 +63,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3expan.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3expan.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3expan.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %
@@ -445,17 +445,18 @@
 %   {
 %     \exp_args:Nnc,
 %     \exp_args:Nno,
+%     \exp_args:Nnf,
 %     \exp_args:NnV,
 %     \exp_args:Nnv,
 %     \exp_args:Nne,
-%     \exp_args:Nnf,
+%     \exp_args:Nce,
 %     \exp_args:Noc,
 %     \exp_args:Noo,
 %     \exp_args:Nof,
-%     \exp_args:NVo,
 %     \exp_args:Nfo,
 %     \exp_args:Nff,
-%     \exp_args:Nee,
+%     \exp_args:NVo,
+%     \exp_args:Nee
 %   }
 %   \begin{syntax}
 %     \cs{exp_args:Noo} \meta{token} \Arg{tokens_1} \Arg{tokens_2}
@@ -509,22 +510,50 @@
 %
 % \begin{function}[EXP]
 %   {
-%     \exp_args:NNcf,
 %     \exp_args:NNno,
 %     \exp_args:NNnV,
+%     \exp_args:NNnv,
+%     \exp_args:NNne,
+%     \exp_args:NNcc,
+%     \exp_args:NNcf,
 %     \exp_args:NNoo,
 %     \exp_args:NNVV,
+%     \exp_args:NNVv,
+%     \exp_args:NNVe,
+%     \exp_args:NNvV,
+%     \exp_args:NNvv,
+%     \exp_args:NNve,
+%     \exp_args:NNeV,
+%     \exp_args:NNev,
+%     \exp_args:NNee,
+%     \exp_args:NnNV,
+%     \exp_args:Nnnc,
+%     \exp_args:Nnno,
+%     \exp_args:Nnnf,
+%     \exp_args:NnnV,
+%     \exp_args:Nnnv,
+%     \exp_args:Nnne,
+%     \exp_args:Nnff,
+%     \exp_args:Nnee,
+%     \exp_args:Ncnc,
 %     \exp_args:Ncno,
 %     \exp_args:NcnV,
+%     \exp_args:Ncnv,
+%     \exp_args:Ncne,
 %     \exp_args:Ncoo,
 %     \exp_args:NcVV,
-%     \exp_args:Nnnc,
-%     \exp_args:Nnno,
-%     \exp_args:Nnnf,
-%     \exp_args:Nnff,
+%     \exp_args:NcVv,
+%     \exp_args:NcVe,
+%     \exp_args:NcvV,
+%     \exp_args:Ncvv,
+%     \exp_args:Ncve,
+%     \exp_args:NceV,
+%     \exp_args:Ncev,
+%     \exp_args:Ncee,
 %     \exp_args:Nooo,
 %     \exp_args:Noof,
 %     \exp_args:Nffo,
+%     \exp_args:NVNV,
 %     \exp_args:Neee
 %   }
 %   \begin{syntax}

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3file.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3file.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3file.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %
@@ -2252,6 +2252,12 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}{\@@_sep:}
+%    \begin{macrocode}
+\cs_new_eq:NN \@@_sep: \__kernel_int_sep:
+%    \end{macrocode}
+% \end{macro}
+%
 % \begin{macro}{\@@_wrap_chunk:nw, \@@_wrap_next:nw}
 %   The \texttt{chunk} and \texttt{next} auxiliaries are defined
 %   indirectly to obtain the expansions of \cs{c_catcode_other_space_tl}
@@ -2280,9 +2286,9 @@
               {
                 \@@_wrap_line:nw
                   { \l_@@_indent_tl }
-                  ##1 - \l_@@_indent_int ;
+                  ##1 - \l_@@_indent_int \@@_sep:
               }
-              { \@@_wrap_line:nw { } ##1 ; }
+              { \@@_wrap_line:nw { } ##1 \@@_sep: }
             ##2 #1
             \@@_wrap_end_chunk:w 7 6 5 4 3 2 1 0 \s_@@_stop
           }
@@ -2304,7 +2310,7 @@
 %     \@@_wrap_line_end:nw,
 %     \@@_wrap_end_chunk:w
 %   }
-%   This is followed by \Arg{string} \meta{int expr} |;|.  It stores the
+%   This is followed by \Arg{string} \meta{int expr} \cs{@@_sep:}.  It stores the
 %   \meta{string} and up to \meta{int expr} characters from the current
 %   chunk into \cs{l_@@_line_part_tl}.  Characters are grabbed 8~at a
 %   time and left in \cs{l_@@_line_part_tl} by the \texttt{line_loop}
@@ -2336,7 +2342,7 @@
     \exp_after:wN \@@_wrap_line_loop:w
     \int_value:w \int_eval:w
   }
-\cs_new:Npn \@@_wrap_line_loop:w #1 ; #2#3#4#5#6#7#8#9
+\cs_new:Npn \@@_wrap_line_loop:w #1 \@@_sep: #2#3#4#5#6#7#8#9
   {
     \if_int_compare:w #1 < 8 \exp_stop_f:
       \@@_wrap_line_aux:Nw #1
@@ -2343,9 +2349,9 @@
     \fi:
     #2 #3 #4 #5 #6 #7 #8 #9
     \exp_after:wN \@@_wrap_line_loop:w
-    \int_value:w \int_eval:w #1 - 8 ;
+    \int_value:w \int_eval:w #1 - 8 \@@_sep:
   }
-\cs_new:Npn \@@_wrap_line_aux:Nw #1#2#3 \exp_after:wN #4 ;
+\cs_new:Npn \@@_wrap_line_aux:Nw #1#2#3 \exp_after:wN #4 \@@_sep:
   {
     #2
     \exp_after:wN \@@_wrap_line_end:NnnnnnnnN
@@ -2368,7 +2374,7 @@
 \cs_new:Npn \@@_wrap_line_end:NnnnnnnnN #1#2#3#4#5#6#7#8#9
   {
     #2 #3 #4 #5 #6 #7 #8
-    \use_none:nnnnn \int_eval:w 8 - ; #9
+    \use_none:nnnnn \int_eval:w 8 - \@@_sep: #9
     \token_if_eq_charcode:NNTF \c_space_token #9
       { \@@_wrap_line_end:nw { } }
       { \if_false: { \fi: } \@@_wrap_break:w #9 }
@@ -2380,7 +2386,7 @@
     \@@_wrap_next_line:w
   }
 \cs_new:Npn \@@_wrap_end_chunk:w
-    #1 \int_eval:w #2 - #3 ; #4#5 \s_@@_stop
+    #1 \int_eval:w #2 - #3 \@@_sep: #4#5 \s_@@_stop
   {
     \if_false: { \fi: }
     \exp_args:Nf \@@_wrap_next:nw { \int_eval:n { #2 - #4 } }
@@ -2470,7 +2476,7 @@
       {
         \@@_wrap_line:nw
           { \l_@@_indent_tl }
-          \l_@@_line_target_int - \l_@@_indent_int ;
+          \l_@@_line_target_int - \l_@@_indent_int \@@_sep:
           #1 #2 \s_@@_stop
       }
   }

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3flag.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3flag.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3flag.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %
@@ -192,6 +192,12 @@
 %
 % \TestFiles{m3flag001}
 %
+% \begin{macro}{\@@_sep:}
+%    \begin{macrocode}
+\cs_new_eq:NN \@@_sep: \__kernel_int_sep:
+%    \end{macrocode}
+% \end{macro}
+%
 % \subsection{Protected flag commands}
 %
 % The height $h$ of a flag (which is initially zero) is stored by
@@ -227,11 +233,11 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \flag_clear:N #1
   {
-    \@@_clear:wN 0 ; #1
+    \@@_clear:wN 0 \@@_sep: #1
     \prg_break_point:
   }
 \cs_generate_variant:Nn \flag_clear:N { c }
-\cs_new_protected:Npn \@@_clear:wN #1 ; #2
+\cs_new_protected:Npn \@@_clear:wN #1 \@@_sep: #2
   {
     \if_cs_exist:w #2 #1 \cs_end: \else:
       \prg_break:n
@@ -238,7 +244,7 @@
     \fi:
     \cs_set_eq:cN { #2 #1 } \tex_undefined:D
     \exp_after:wN \@@_clear:wN
-    \int_value:w \int_eval:w \c_one_int + #1 ; #2
+    \int_value:w \int_eval:w \c_one_int + #1 \@@_sep: #2
   }
 %    \end{macrocode}
 % \end{macro}
@@ -303,16 +309,16 @@
 %   Extract the value of the flag by going through all of the
 %   control sequences starting from |0|.
 %    \begin{macrocode}
-\cs_new:Npn \flag_height:N #1 { \@@_height_loop:wN 0; #1 }
-\cs_new:Npn \@@_height_loop:wN #1 ; #2
+\cs_new:Npn \flag_height:N #1 { \@@_height_loop:wN 0 \@@_sep: #1 }
+\cs_new:Npn \@@_height_loop:wN #1 \@@_sep: #2
   {
     \if_cs_exist:w #2 #1 \cs_end: \else:
       \exp_after:wN \@@_height_end:wN
     \fi:
     \exp_after:wN \@@_height_loop:wN
-    \int_value:w \int_eval:w \c_one_int + #1 ; #2
+    \int_value:w \int_eval:w \c_one_int + #1 \@@_sep: #2
   }
-\cs_new:Npn \@@_height_end:wN #1 + #2 ; #3 {#2}
+\cs_new:Npn \@@_height_end:wN #1 + #2 \@@_sep: #3 {#2}
 \cs_generate_variant:Nn \flag_height:N { c }
 %    \end{macrocode}
 % \end{macro}

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-assign.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-assign.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-assign.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -42,7 +42,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 % \maketitle
 %
 % \begin{documentation}

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-aux.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-aux.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-aux.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %
@@ -80,17 +80,8 @@
 % \end{macro}
 %
 % \begin{macro}{\@@_sep:}
-%   We need a way to stop the expansion in \cs{@@_int_eval:w} and similar with a
-%   token that isn't absorbed so that it works as a marker for right-delimited
-%   arguments. Additionally the used token should be impossible to form a valid
-%   expression for these expression primitives (the otherwise often used
-%   |;| is turned into a binary operator in some engines for instance). And
-%   since this is about right-delimiting I think it's funny to use
-%   \cs{tex_right:D}. An unexpandable primitive is used because it is guaranteed
-%   to never be a valid token in such an expression and survives all kinds of
-%   expansion (just like |;| would).
 %    \begin{macrocode}
-\cs_new_eq:NN \@@_sep: \tex_right:D
+\cs_new_eq:NN \@@_sep: \__kernel_int_sep:
 %    \end{macrocode}
 % \end{macro}
 %
@@ -177,7 +168,7 @@
 %
 % Calculations are done in base $10000$, i.e. one myriad.
 %
-% \subsection{Using arguments and semicolons}
+% \subsection{Using arguments and \cs{@@_sep:}s}
 %
 % \begin{macro}[EXP]{\@@_use_none_stop_f:n}
 %   This function removes an argument (typically a digit) and replaces
@@ -189,7 +180,7 @@
 % \end{macro}
 %
 % \begin{macro}[EXP]{\@@_use_s:n, \@@_use_s:nn}
-%   Those functions place a semicolon after one or two arguments
+%   Those functions place a \cs{@@_sep:} after one or two arguments
 %   (typically digits).
 %    \begin{macrocode}
 \cs_new:Npn \@@_use_s:n #1 { #1\@@_sep: }
@@ -200,7 +191,7 @@
 % \begin{macro}[EXP]
 %   {\@@_use_none_until_s:w, \@@_use_i_until_s:nw, \@@_use_ii_until_s:nnw}
 %   Those functions select specific arguments among a set of arguments
-%   delimited by a semicolon.
+%   delimited by a \cs{@@_sep:}.
 %    \begin{macrocode}
 \cs_new:Npn \@@_use_none_until_s:w #1\@@_sep: { }
 \cs_new:Npn \@@_use_i_until_s:nw #1#2\@@_sep: {#1}
@@ -209,7 +200,7 @@
 % \end{macro}
 %
 % \begin{macro}[EXP]{\@@_reverse_args:Nww}
-%   Many internal functions take arguments delimited by semicolons, and
+%   Many internal functions take arguments delimited by \cs{@@_sep:}s, and
 %   it is occasionally useful to swap two such arguments.
 %    \begin{macrocode}
 \cs_new:Npn \@@_reverse_args:Nww #1 #2\@@_sep: #3\@@_sep:
@@ -218,7 +209,7 @@
 % \end{macro}
 %
 % \begin{macro}[EXP]{\@@_rrot:www}
-%   Rotate three arguments delimited by semicolons.  This is the inverse
+%   Rotate three arguments delimited by \cs{@@_sep:}s.  This is the inverse
 %   (or the square) of the Forth primitive |ROT|, hence the name.
 %    \begin{macrocode}
 \cs_new:Npn \@@_rrot:www #1\@@_sep: #2\@@_sep: #3\@@_sep:
@@ -227,7 +218,7 @@
 % \end{macro}
 %
 % \begin{macro}[EXP]{\@@_use_i:ww, \@@_use_i:www}
-%   Many internal functions take arguments delimited by semicolons, and
+%   Many internal functions take arguments delimited by \cs{@@_sep:}s, and
 %   it is occasionally useful to remove one or two such arguments.
 %    \begin{macrocode}
 \cs_new:Npn \@@_use_i:ww #1\@@_sep: #2\@@_sep: { #1\@@_sep: }
@@ -554,7 +545,7 @@
 % \begin{macro}[EXP]{\@@_tuple_count:w, \@@_array_count:n}
 % \begin{macro}[EXP]{\@@_tuple_count_loop:Nw}
 %   Count the number of items in a tuple of floating points by counting
-%   semicolons.  The technique is very similar to \cs{tl_count:n}, but
+%   \cs{@@_sep:}s.  The technique is very similar to \cs{tl_count:n}, but
 %   with the loop built-in.  Checking for the end of the loop is done
 %   with the |\use_none:n #1| construction.
 %    \begin{macrocode}
@@ -768,7 +759,7 @@
 % expect as long as the numbers to multiply are not too big; it
 % also works to some extent with negative results.  The \texttt{pack}
 % function puts the last $4$ of those $9$ digits into a brace group,
-% moves the semi-colon delimiter, and inserts a |+|, which combines the
+% moves the \cs{@@_sep:} delimiter, and inserts a |+|, which combines the
 % carry with the previous computation.  The shifts nicely combine into
 % $5\,0000\,0000 / 10^{4} + 4\,9995\,0000 = 5\,0000\,0000$.  As long as
 % the operands are in some range, the result of this second computation
@@ -854,9 +845,9 @@
 %   \begin{syntax}
 %     \cs{@@_pack_twice_four:wNNNNNNNN} \meta{tokens} \cs{@@_sep:} \meta{$\geq 8$ digits}
 %   \end{syntax}
-%   Grabs two sets of $4$ digits and places them before the semi-colon
+%   Grabs two sets of $4$ digits and places them before the \cs{@@_sep:}
 %   delimiter.  Putting several copies of this function before a
-%   semicolon packs more digits since each takes the digits
+%   \cs{@@_sep:} packs more digits since each takes the digits
 %   packed by the others in its first argument.
 %    \begin{macrocode}
 \cs_new:Npn \@@_pack_twice_four:wNNNNNNNN #1\@@_sep: #2#3#4#5 #6#7#8#9
@@ -868,9 +859,9 @@
 %   \begin{syntax}
 %     \cs{@@_pack_eight:wNNNNNNNN} \meta{tokens} \cs{@@_sep:} \meta{$\geq 8$ digits}
 %   \end{syntax}
-%   Grabs one set of $8$ digits and places them before the semi-colon
+%   Grabs one set of $8$ digits and places them before the \cs{@@_sep:}
 %   delimiter as a single group.  Putting several copies of this
-%   function before a semicolon packs more digits since each
+%   function before a \cs{@@_sep:} packs more digits since each
 %   takes the digits packed by the others in its first argument.
 %    \begin{macrocode}
 \cs_new:Npn \@@_pack_eight:wNNNNNNNN #1\@@_sep: #2#3#4#5 #6#7#8#9
@@ -1065,7 +1056,7 @@
 %   as an alternation of unbraced and braced blocks of $4$ digits,
 %   such that the first $5$ groups of token consist in $4$ single digits,
 %   and one brace group (in some order), and the next $5$ have the same
-%   structure. This is followed by some digits and a semicolon.
+%   structure. This is followed by some digits and a \cs{@@_sep:}.
 %    \begin{macrocode}
 \cs_new:Npn \@@_decimate_pack:nnnnnnnnnnw #1#2#3#4#5
   { \@@_decimate_pack:nnnnnnw { #1#2#3#4#5 } }
@@ -1123,8 +1114,8 @@
 %   This function ends a \TeX{} conditional, removes junk and a floating
 %   point, and places its first argument in the input stream.  A quirk
 %   is that we don't define this function requiring a floating point to
-%   follow, simply anything ending in a semicolon.  This, in turn, means
-%   that the \meta{junk} may not contain semicolons.
+%   follow, simply anything ending in a \cs{@@_sep:}.  This, in turn, means
+%   that the \meta{junk} may not contain \cs{@@_sep:}s.
 %    \begin{macrocode}
 \cs_new:Npn \@@_case_return:nw #1#2 \fi: #3 \@@_sep: { \fi: #1 }
 %    \end{macrocode}

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-basics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-basics.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-basics.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -42,7 +42,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %
@@ -592,7 +592,7 @@
 %   too close a call to know yet, namely if $1 \meta{Y'_1} \meta{Y'_2} =
 %   \meta{X_1} \meta{X_2} \meta{X_3} \meta{X_4} 0$, then call the
 %   \texttt{quite_far} auxiliary.  We use the odd combination of space
-%   and semi-colon delimiters to allow the \texttt{not_far} auxiliary to
+%   and \cs{@@_sep:} delimiters to allow the \texttt{not_far} auxiliary to
 %   grab each piece individually, the \texttt{very_far} auxiliary to use
 %   \cs{@@_pack_eight:wNNNNNNNN}, and the \texttt{quite_far} to ignore
 %   the significands easily (using the \cs{@@_sep:} delimiter).
@@ -843,7 +843,7 @@
 %       \Arg{X_1} \Arg{X_2} \Arg{X_3} \Arg{X_4} \meta{sign}
 %       \Arg{Y_1} \Arg{Y_2} \Arg{Y_3} \Arg{Y_4}
 %   \end{quote}
-%   Note the three semicolons at the end of the definition.  One is for
+%   Note the three \cs{@@_sep:}s at the end of the definition.  One is for
 %   the last \cs{@@_mul_significand_drop:NNNNNw}; one is for
 %   \cs{@@_round_digit:Nw} later on; and one, preceded by
 %   \cs{exp_after:wN}, which is correctly expanded (within an
@@ -1013,7 +1013,7 @@
 %   \cs{@@_div_significand_i_o:wnnw}, namely an integer \meta{y} obtained
 %   by adding $1$ to the first $5$ digits of $Z$ (explanation given soon
 %   below), then the four \Arg{A_{i}}, then the four \Arg{Z_{i}}, a
-%   semi-colon, and the \meta{final sign}, used for rounding at the end.
+%   \cs{@@_sep:}, and the \meta{final sign}, used for rounding at the end.
 %    \begin{macrocode}
 \cs_new:Npn \@@_div_npos_o:Nww
     #1 \s_@@ \@@_chk:w 1 #2 #3 #4 \@@_sep:

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-convert.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-convert.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-convert.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-expo.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-expo.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-expo.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -42,7 +42,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %
@@ -386,7 +386,7 @@
 %   in $[1,10]$, and \meta{exponent} is
 %   the exponent. Also, the expansion is done backwards. Then
 %   \cs{@@_div_significand_pack:NNN} puts things in the
-%   correct order to add the $Q_{i}$ together and put semicolons
+%   correct order to add the $Q_{i}$ together and put \cs{@@_sep:}s
 %   between each piece. Once those have been expanded, we get
 %   \begin{syntax}
 %     \cs{@@_ln_div_after:Nw} \meta{fixed-tl} \meta{1d} \cs{@@_sep:} \meta{4d} \cs{@@_sep:}
@@ -714,7 +714,7 @@
 %   10^{-1})$.  We compute $10$ terms of the Taylor series.  The
 %   first argument is irrelevant (rounding digit used by some other
 %   functions).  The next three arguments, at least $16$ digits,
-%   delimited by a semicolon, form a fixed point number, so we pack it
+%   delimited by a \cs{@@_sep:}, form a fixed point number, so we pack it
 %   in blocks of $4$ digits.
 %    \begin{macrocode}
 \cs_new:Npn \@@_exp_Taylor:Nnnwn #1#2#3 #4\@@_sep: #5 #6
@@ -834,7 +834,7 @@
 %   The first two arguments are irrelevant (a rounding digit, and a
 %   brace group with $8$ zeros).  The third argument is the integer part
 %   of our number, then we have the decimal part delimited by a
-%   semicolon, and finally the exponent, in the range $[0,5]$.  Remove
+%   \cs{@@_sep:}, and finally the exponent, in the range $[0,5]$.  Remove
 %   leading zeros from the integer part: putting |#4| in there too
 %   ensures that an integer part of $0$ is also removed.  Then read
 %   digits one by one, looking up $\exp(\meta{digit}\cdot
@@ -932,7 +932,7 @@
 %     \cs{@@_pow_normal_o:ww} followed by the two \texttt{fp} $a$ and $b$.
 %     For $a=+0$ or $+\inf$, call \cs{@@_pow_zero_or_inf:ww} instead, to
 %     return either $+0$ or $+\infty$ as appropriate.
-%   \item If $a$ is a \texttt{nan}, then skip to the next semicolon
+%   \item If $a$ is a \texttt{nan}, then skip to the next \cs{@@_sep:}
 %     (which happens to be conveniently the end of $b$) and return
 %     \texttt{nan}.
 %   \item Finally, if $a$ is negative, compute $|a|^b$

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-extended.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-extended.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-extended.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -42,7 +42,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %
@@ -93,7 +93,7 @@
 %   ~~\meta{operand_2} \cs{@@_sep:} \Arg{continuation}
 % \end{syntax}
 % They perform the \meta{calculation} on the two \meta{operands}, then
-% feed the result ($6$ brace groups followed by a semicolon) to the
+% feed the result ($6$ brace groups followed by a \cs{@@_sep:}) to the
 % \meta{continuation}, responsible for the next step of the calculation.
 % Some functions only accept an \texttt{N}-type \meta{continuation}.
 % This allows constructions such as
@@ -264,7 +264,7 @@
 %   last $9999$, giving the integer closest to $10000 + a_{6}/n$.
 %
 %   Each \texttt{pack} auxiliary receives $5$ digits followed by a
-%   semicolon.  The first digit is added as a carry to the integer
+%   \cs{@@_sep:}.  The first digit is added as a carry to the integer
 %   expression above, and the $4$ other digits are braced.  Each call to
 %   the \texttt{pack} auxiliary thus produces one brace group.  The last
 %   brace group is produced by the \texttt{after} auxiliary, which
@@ -624,7 +624,7 @@
 % In this section we manipulate floating point numbers with roughly $24$
 % significant figures (\enquote{extended-precision} numbers, in short,
 % \enquote{ep}), which take the form of an integer exponent, followed by a
-% comma, then six groups of digits, ending with a semicolon.  The first
+% comma, then six groups of digits, ending with a \cs{@@_sep:}.  The first
 % group of digit may be any non-negative integer, while other groups of
 % digits have $4$~digits.  In other words, an extended-precision number
 % is an exponent ending in a comma, then a fixed point number.  The

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-functions.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-functions.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-functions.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-logic.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-logic.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-logic.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -42,7 +42,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-parse.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-parse.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-parse.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -42,7 +42,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %
@@ -199,7 +199,7 @@
 % second \cs{exp_after:wN} to expand, and to trigger the construction
 % \cs{exp:w}, which expands |\operand:w|, defined to read
 % what follows and make a number out of it, then leave \cs{exp_end:}, the
-% number, and a semicolon in the input stream.  Once |\operand:w| is
+% number, and a \cs{@@_sep:} in the input stream.  Once |\operand:w| is
 % done expanding, we obtain essentially
 % \begin{syntax}
 %   \cs{exp_after:wN} |\add:ww| \cs{int_value:w} 12345 \cs{@@_sep:}
@@ -637,12 +637,12 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[EXP]{\@@_parse_return_semicolon:w}
+% \begin{macro}[EXP]{\@@_parse_return_sep:w}
 %   This very odd function swaps its position with the following
 %   \cs{fi:} and removes \cs{@@_parse_expand:w} normally responsible for
 %   expansion.  That turns out to be useful.
 %    \begin{macrocode}
-\cs_new:Npn \@@_parse_return_semicolon:w
+\cs_new:Npn \@@_parse_return_sep:w
     #1 \fi: \@@_parse_expand:w { \fi: \@@_sep: #1 }
 %    \end{macrocode}
 % \end{macro}
@@ -682,7 +682,7 @@
         \if_int_compare:w 9 < 1 \token_to_str:N ##1 \exp_stop_f:
           \token_to_str:N ##1 \exp_after:wN #2 \exp:w
         \else:
-          \@@_parse_return_semicolon:w #3 ##1
+          \@@_parse_return_sep:w #3 ##1
         \fi:
         \@@_parse_expand:w
       }
@@ -1050,7 +1050,7 @@
       \exp:w \exp_after:wN \@@_parse_letters:N
       \exp:w
     \else:
-      \@@_parse_return_semicolon:w #1
+      \@@_parse_return_sep:w #1
     \fi:
     \@@_parse_expand:w
   }
@@ -1464,7 +1464,7 @@
         \exp:w
       \fi:
     \else:
-      \@@_parse_return_semicolon:w 0 #1
+      \@@_parse_return_sep:w 0 #1
     \fi:
     \@@_parse_expand:w
   }
@@ -1475,7 +1475,7 @@
       \exp_after:wN \@@_parse_round_up:N
       \exp:w
     \else:
-      \@@_parse_return_semicolon:w 1 #1
+      \@@_parse_return_sep:w 1 #1
     \fi:
     \@@_parse_expand:w
   }
@@ -1648,7 +1648,7 @@
 %   This function should be called within an \cs{int_value:w}
 %   expansion (or within an integer expression).  It leaves digits of the
 %   exponent behind it in the input stream, and terminates the expansion
-%   with a semicolon.  If there is no~|e| (or~|E|), leave an exponent of~$0$.  If
+%   with a \cs{@@_sep:}.  If there is no~|e| (or~|E|), leave an exponent of~$0$.  If
 %   there is an~|e| or~|E|, expand the next token to run some tests on it.  The
 %   first rough test is that if the character code of~|#1| is greater
 %   than that of~|9| (largest code valid for an exponent, less than any
@@ -1662,7 +1662,7 @@
       \exp_after:wN #1
       \exp:w
     \else:
-      0 \@@_parse_return_semicolon:w #1
+      0 \@@_parse_return_sep:w #1
     \fi:
     \@@_parse_expand:w
   }
@@ -1707,7 +1707,7 @@
       \exp:w
     \else:
       \@@_parse_exponent_keep:NTF #1
-        { \@@_parse_return_semicolon:w #1 }
+        { \@@_parse_return_sep:w #1 }
         {
           \exp_after:wN \@@_sep:
           \exp:w
@@ -1720,7 +1720,7 @@
 %
 % \begin{macro}[rEXP]{\@@_parse_exponent_digits:N}
 %   Read digits one by one, and leave them behind in the input stream.
-%   When finding a non-digit, stop, and insert a semicolon.  Note that
+%   When finding a non-digit, stop, and insert a \cs{@@_sep:}.  Note that
 %   we do not check for overflow of the exponent, hence there can be a
 %   \TeX{} error.  It is mostly harmless, except when parsing
 %   |0e9876543210|, which should be a valid representation of $0$, but
@@ -1733,7 +1733,7 @@
       \exp_after:wN \@@_parse_exponent_digits:N
       \exp:w
     \else:
-      \@@_parse_return_semicolon:w #1
+      \@@_parse_return_sep:w #1
     \fi:
     \@@_parse_expand:w
   }
@@ -2876,8 +2876,6 @@
   { #1~got~no~argument;~used~nan. }
 \msg_new:nnn { fp } { multi-arg }
   { #1~got~more~than~one~argument;~used~nan. }
-\msg_new:nnn { fp } { num-args }
-  { #1~expects~between~#2~and~#3~arguments. }
 \msg_new:nnn { fp } { bad-args }
   { Arguments~in~#1#2~are~invalid. }
 \msg_new:nnn { fp } { infty-pi }

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-random.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-random.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-random.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -42,7 +42,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %
@@ -304,8 +304,8 @@
         \@@_rand_myriads:n { XXXX } { 0000 } { 0000 } \@@_sep: 0
       }
       {
-        \msg_expandable_error:nnnnn
-          { fp } { num-args } { rand() } { 0 } { 0 }
+        \@@_error_num_args:ffff { rand } { 0 } { 0 }
+          { \@@_array_count:n {#1} }
         \exp_after:wN \c_nan_fp
       }
   }

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-round.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-round.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-round.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %
@@ -269,7 +269,7 @@
 %   \begin{syntax}
 %     \cs{@@_round_s:NNNw} \meta{final sign} \meta{digit} \meta{more digits} \cs{@@_sep:}
 %   \end{syntax}
-%   Similar to \cs{@@_round:NNN}, but with an extra semicolon, this
+%   Similar to \cs{@@_round:NNN}, but with an extra \cs{@@_sep:}, this
 %   function expands to |0\exp_stop_f:|\cs{@@_sep:} if rounding
 %   $\meta{final sign}\meta{digit}.\meta{more digits}$ to an integer
 %   truncates, and to |1\exp_stop_f:|\cs{@@_sep:} otherwise.
@@ -305,7 +305,7 @@
 %   or \cs{@@_int_eval:w} expansion; it may add an extra
 %   \cs{@@_int_eval:w}, which means that the integer or integer
 %   expression should not be ended with a synonym of \tn{relax}, but
-%   with a semi-colon for instance.
+%   with a \cs{@@_sep:} for instance.
 %    \begin{macrocode}
 \cs_new:Npn \@@_round_digit:Nw #1 #2\@@_sep:
   {
@@ -411,10 +411,10 @@
 \cs_new:Npn \@@_round_no_arg_o:Nw #1
   {
     \cs_if_eq:NNTF #1 \@@_round_to_nearest:NNN
-      { \@@_error:nnnn { num-args } { round () } { 1 } { 3 } }
+      { \@@_error_num_args:nnnn { round } { 1 } { 3 } { 0 } }
       {
-        \@@_error:nffn { num-args }
-          { \@@_round_name_from_cs:N #1 () } { 1 } { 2 }
+        \@@_error_num_args:ffff
+          { \@@_round_name_from_cs:N #1 } { 1 } { 2 } { 0 }
       }
     \exp_after:wN \c_nan_fp
   }
@@ -445,13 +445,15 @@
             #2 \@@_sep: #3 \@@_sep:
           }
           {
-            \@@_error:nnnn { num-args } { round () } { 1 } { 3 }
+            \@@_error_num_args:ffff { round } { 1 } { 3 }
+              { \int_eval:n { 3 + \@@_array_count:n {#7} } }
             \exp_after:wN \c_nan_fp
           }
       }
       {
-        \@@_error:nffn { num-args }
-          { \@@_round_name_from_cs:N #1 () } { 1 } { 2 }
+        \@@_error_num_args:ffff
+          { \@@_round_name_from_cs:N #1 } { 1 } { 2 }
+          { \int_eval:n { 3 + \@@_array_count:n {#7} } }
         \exp_after:wN \c_nan_fp
       }
   }

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-symbolic.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-symbolic.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-symbolic.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %
@@ -77,8 +77,8 @@
 % \cs{@@_symbolic_chk:w} \meta{operation} |,| \Arg{operands} \meta{junk}
 % \cs{@@_sep:} where the \meta{operation} is a list of \texttt{N}-type tokens,
 % the \meta{operands} is an array of floating point objects, and the
-% \meta{junk} is to be discarded.  If the outermost operator (last to be
-% evaluated) is unary, the expression has the form
+% \meta{junk} (typically empty) is to be discarded.  If the outermost operator
+% (last to be evaluated) is unary, the expression has the form
 % \begin{quote}
 %   \cs{s_@@_symbolic} \cs{@@_symbolic_chk:w} \\
 %   \cs{@@_types_unary:NNw} |\__fp_|\meta{op}|_o:w| \meta{token} |,| \\
@@ -96,6 +96,13 @@
 % \end{quote}
 % where the \meta{op} is an operation (|+|, |&|, \ldots{}), and
 % |\__fp_|\meta{op}|_o:ww| receives the \meta{operands} as arguments.
+% If the expression is a user-defined function applied to some arguments
+% it is stored as
+% \begin{quote}
+%   \cs{s_@@_symbolic} \cs{@@_symbolic_chk:w} \\
+%   \cs{@@_function_o:w} \cs[no-index]{@@_\meta{identifier}_o:w} |,| \\
+%   |{| \meta{operands} |}| \meta{junk} \cs{@@_sep:}
+% \end{quote}
 % If the expression consists of a single variable, it is stored as
 % \begin{quote}
 %   \cs{s_@@_symbolic} \cs{@@_symbolic_chk:w} \\
@@ -267,7 +274,7 @@
       { @@         _#2_symbolic_o:ww }
       { @@_symbolic_#2_symbolic_o:ww }
   }
-\tl_map_inline:nn { + - * / ^ & | }
+\tl_map_inline:nn { + - * / ^ & | } % |
   { \exp_args:Nc \@@_tmp:w { @@_#1_o:ww } {#1} }
 %    \end{macrocode}
 % \end{macro}
@@ -334,7 +341,7 @@
 %   }
 % \begin{macro}[EXP]{\@@_symbolic_convert:wnnN}
 %   Symbolic expressions cannot be converted to decimal, integer, or
-%   scientific notation unless they can be reduced to
+%   scientific notation unless they can be evaluated all the way.
 %    \begin{macrocode}
 \cs_set_protected:Npn \@@_tmp:w #1#2#3
   {

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-traps.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-traps.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-traps.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -42,7 +42,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 % \maketitle
 %
 % \begin{documentation}
@@ -351,6 +351,22 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}[EXP]{\@@_error_num_args:nnnn, \@@_error_num_args:ffff}
+%    \begin{macrocode}
+\cs_new:Npn \@@_error_num_args:nnnn #1#2#3#4
+  {
+    \int_compare:nNnTF {#2} = {#3}
+      { \msg_expandable_error:nnnnn { fp } { num-args-eq } {#1} {#2} {#4} }
+      { \msg_expandable_error:nnnnnn { fp } { num-args } {#1} {#2} {#3} {#4} }
+  }
+\cs_generate_variant:Nn \@@_error_num_args:nnnn { ffff }
+\msg_new:nnn { fp } { num-args-eq }
+  { #1()~needs~#2~arguments,~got~#3. }
+\msg_new:nnn { fp } { num-args }
+  { #1()~needs~#2~to~#3~arguments,~got~#4. }
+%    \end{macrocode}
+% \end{macro}
+%
 % \subsection{Messages}
 %
 % Some messages.

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-trig.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-trig.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-trig.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -42,7 +42,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %
@@ -832,8 +832,8 @@
 %   }
 %   First come the first $64$~digits of the fractional part of
 %   $10^{\text{\texttt{\#1}}-16}/(2\pi)$, arranged in $16$~blocks
-%   of~$4$, and ending with a semicolon.  Then a few more digits of the
-%   same fractional part, ending with a semicolon, then $4$~blocks of
+%   of~$4$, and ending with a \cs{@@_sep:}.  Then a few more digits of the
+%   same fractional part, ending with a \cs{@@_sep:}, then $4$~blocks of
 %   $4$~digits holding the significand of the original argument.
 %   Multiply the $16$-digit significand with the $64$-digit fractional
 %   part: the \texttt{auxvi} auxiliary receives the significand
@@ -845,7 +845,7 @@
 %   the last \texttt{middle} shift by the appropriate \texttt{trailing}
 %   shift, then discard the significand and remaining $3$~blocks from
 %   the fractional part, as there are not enough digits to compute any
-%   more step in the ladder.  The last semicolon closes the ladder, and
+%   more step in the ladder.  The last \cs{@@_sep:} closes the ladder, and
 %   we return control to the \texttt{auxvii} auxiliary.
 %    \begin{macrocode}
 \cs_new:Npn \@@_trig_large_auxv:www #1\@@_sep: #2\@@_sep: #3\@@_sep:
@@ -883,7 +883,7 @@
 %     \@@_trig_large_auxxi:w
 %   }
 %   The \texttt{auxvii} auxiliary is followed by $52$~digits and a
-%   semicolon.  We find the octant as the integer part of $8$~times what
+%   \cs{@@_sep:}.  We find the octant as the integer part of $8$~times what
 %   follows, or equivalently as the integer part of $|#1#2#3|/125$, and
 %   add it to the surrounding integer expression for the octant.  We
 %   then compute $8$~times the $52$-digit number, with a minus sign if
@@ -949,7 +949,7 @@
 %   Here we receive a conversion function \cs{@@_ep_to_float_o:wwN} or
 %   \cs{@@_ep_inv_to_float_o:wwN}, a \meta{sign} ($0$ or~$2$), a
 %   (non-negative) \meta{octant} delimited by a dot, a \meta{fixed
-%     point} number delimited by a semicolon, and an extended-precision
+%     point} number delimited by a \cs{@@_sep:}, and an extended-precision
 %   number.  The auxiliary receives:
 %   \begin{itemize}
 %   \item the conversion function~|#1|;
@@ -1300,7 +1300,7 @@
 % \begin{macro}[EXP]{\@@_atan_normal_o:NNnwNnw}
 %   Here we simply reorder the floating point data into a pair of signed
 %   extended-precision numbers, that is, a sign, an exponent ending with
-%   a comma, and a six-block mantissa ending with a semi-colon.  This
+%   a comma, and a six-block mantissa ending with a \cs{@@_sep:}.  This
 %   extended precision is required by other inverse trigonometric
 %   functions, to compute things like $\operatorname{atan}(x,\sqrt{1-x^2})$ without
 %   intermediate rounding errors.
@@ -1422,7 +1422,7 @@
 %   $\frac{1}{2k-1}$, then subtract from it $z^2$ times |#2|.  The loop
 %   stops when $k=0$: then |#2| is $(\operatorname{atan} z)/z$, and there is a need to
 %   clean up all the unnecessary data, end the integer expression
-%   computing the octant with a semicolon, and leave the result~|#2|
+%   computing the octant with a \cs{@@_sep:}, and leave the result~|#2|
 %   afterwards.
 %    \begin{macrocode}
 \cs_new:Npn \@@_atan_Taylor_loop:www #1\@@_sep: #2\@@_sep: #3\@@_sep:

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-types.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-types.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-types.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -49,7 +49,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fparray.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fparray.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fparray.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3graphics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3graphics.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3graphics.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3int.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3int.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3int.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %
@@ -1183,9 +1183,8 @@
 % \end{macro}
 %
 % \begin{macro}{\@@_sep:}
-%   See comments in \texttt{l3fp-aux.dtx} for this idea.
 %    \begin{macrocode}
-\cs_new_eq:NN \@@_sep: \tex_right:D
+\cs_new_eq:NN \@@_sep: \__kernel_int_sep:
 %    \end{macrocode}
 % \end{macro}
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3intarray.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3intarray.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3intarray.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %
@@ -203,6 +203,12 @@
   { Size~of~array~may~not~be~negative:~#1 }
 %    \end{macrocode}
 %
+% \begin{macro}{\@@_sep:}
+%    \begin{macrocode}
+\cs_new_eq:NN \@@_sep: \__kernel_int_sep:
+%    \end{macrocode}
+% \end{macro}
+%
 % \begin{variable}{\l_@@_loop_int}
 %   A loop index.
 %    \begin{macrocode}
@@ -730,11 +736,11 @@
       {
         \exp_after:wN \@@_gset:Nww
         \exp_after:wN #1
-        \int_value:w \int_eval:n {#2} \exp_after:wN ;
-        \int_value:w \int_eval:n {#3} ;
+        \int_value:w \int_eval:n {#2} \exp_after:wN \@@_sep:
+        \int_value:w \int_eval:n {#3} \@@_sep:
       }
     \cs_generate_variant:Nn \intarray_gset:Nnn { c }
-    \cs_new_protected:Npn \@@_gset:Nww #1#2 ; #3 ;
+    \cs_new_protected:Npn \@@_gset:Nww #1#2 \@@_sep: #3 \@@_sep:
       {
         \@@_bounds:NNnTF \msg_error:nneee #1 {#2}
           {
@@ -802,10 +808,10 @@
       {
         \exp_after:wN \@@_item:Nw
         \exp_after:wN #1
-        \int_value:w \int_eval:n {#2} ;
+        \int_value:w \int_eval:n {#2} \@@_sep:
       }
     \cs_generate_variant:Nn \intarray_item:Nn { c }
-    \cs_new:Npn \@@_item:Nw #1#2 ;
+    \cs_new:Npn \@@_item:Nw #1#2 \@@_sep:
       {
         \@@_bounds:NNnTF \msg_expandable_error:nnfff #1 {#2}
           { \__kernel_intarray_item:Nn #1 {#2} }
@@ -866,10 +872,10 @@
         \int_compare:nNnF { \intarray_count:N #1 } = \c_zero_int
           {
             \exp_last_unbraced:Nf \use_none:n
-              { \@@_to_clist:w 1 ; #1 {#2} \prg_break_point: }
+              { \@@_to_clist:w 1 \@@_sep: #1 {#2} \prg_break_point: }
           }
       }
-    \cs_new:Npn \@@_to_clist:w #1 ; #2#3
+    \cs_new:Npn \@@_to_clist:w #1 \@@_sep: #2#3
       {
         \if_int_compare:w #1 > \@@_count:w #2
           \prg_break:n
@@ -876,7 +882,7 @@
         \fi:
         #3 \__kernel_intarray_item:Nn #2 {#1}
         \exp_after:wN \@@_to_clist:w
-        \int_value:w \int_eval:w #1 + \c_one_int ; #2 {#3}
+        \int_value:w \int_eval:w #1 + \c_one_int \@@_sep: #2 {#3}
       }
 %    \end{macrocode}
 % \end{macro}
@@ -889,12 +895,12 @@
         \exp_last_unbraced:Nf \use_none:n
           {
             \exp_after:wN \@@_range_to_clist:ww
-            \int_value:w \int_eval:w #2 \exp_after:wN ;
-            \int_value:w \int_eval:w #3 ;
+            \int_value:w \int_eval:w #2 \exp_after:wN \@@_sep:
+            \int_value:w \int_eval:w #3 \@@_sep:
             #1 \prg_break_point:
           }
       }
-    \cs_new:Npn \@@_range_to_clist:ww #1 ; #2 ; #3
+    \cs_new:Npn \@@_range_to_clist:ww #1 \@@_sep: #2 \@@_sep: #3
       {
         \if_int_compare:w #1 > #2 \exp_stop_f:
           \prg_break:n
@@ -901,7 +907,7 @@
         \fi:
         , \__kernel_intarray_item:Nn #3 {#1}
         \exp_after:wN \@@_range_to_clist:ww
-        \int_value:w \int_eval:w #1 + \c_one_int ; #2 ; #3
+        \int_value:w \int_eval:w #1 + \c_one_int \@@_sep: #2 \@@_sep: #3
       }
 %    \end{macrocode}
 % \end{macro}

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3kernel-functions.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3kernel-functions.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3kernel-functions.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %
@@ -286,6 +286,20 @@
 %   than once.
 % \end{function}
 %
+% \begin{function}[EXP]{\__kernel_int_sep:}
+%   \begin{syntax}
+%     \cs{__kernel_int_sep:}
+%   \end{syntax}
+%   Provides a way to stop the expansion in \cs{tex_numexpr:D} with a
+%   token that is not absorbed so that it works as a marker for right-delimited
+%   arguments. Additionally the used token should be impossible to form a valid
+%   expression for these expression primitives (the otherwise previously-used
+%   |;| is turned into a binary operator in some engines for instance). 
+%   An unexpandable primitive is used because it is guaranteed
+%   to never be a valid token in such an expression and survives all kinds of
+%   expansion (just like~|;| would in \eTeX{}).
+% \end{function}
+%
 % \begin{function}[added = 2018-03-31]{\__kernel_intarray_gset:Nnn}
 %   \begin{syntax}
 %     \cs{__kernel_intarray_gset:Nnn} \meta{intarray~var} \Arg{index} \Arg{value}

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3keys.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3keys.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3keys.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3legacy.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3legacy.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3legacy.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3luatex.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3luatex.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3luatex.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %
@@ -374,7 +374,7 @@
 local token_create_safe
 do
   local is_defined = token.is_defined
-  local set_char   = token.set_char
+  local set_char   = token.set_char or tex.chardef
   local runtoks    = tex.runtoks
   local let_token  = token_create'let'
 

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3msg.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3msg.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3msg.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3names.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3names.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3names.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3opacity.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3opacity.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3opacity.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3pdf.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3pdf.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3pdf.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3prg.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3prg.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3prg.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3prop.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3prop.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3prop.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3quark.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3quark.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3quark.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3regex.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3regex.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3regex.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %
@@ -1113,6 +1113,12 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}{\@@_sep:}
+%    \begin{macrocode}
+\cs_new_eq:NN \@@_sep: \__kernel_int_sep:
+%    \end{macrocode}
+% \end{macro}
+%
 % \begin{macro}{\@@_standard_escapechar:}
 %   Make the \tn{escapechar} into the standard backslash.
 %    \begin{macrocode}
@@ -1823,7 +1829,7 @@
     \exp_after:wN \@@_escape_x_end:w
     \int_value:w "0 \@@_escape_x_test:N
   }
-\cs_new:Npn \@@_escape_x_end:w #1 ;
+\cs_new:Npn \@@_escape_x_end:w #1 \@@_sep:
   {
     \int_compare:nNnTF {#1} > \c_max_char_int
       {
@@ -1849,7 +1855,7 @@
 \cs_new:Npn \@@_escape_x_test:N #1
   {
     \if_meaning:w \scan_stop: #1
-      \exp_after:wN \use_i:nnn \exp_after:wN ;
+      \exp_after:wN \use_i:nnn \exp_after:wN \@@_sep:
     \fi:
     \use:n
       {
@@ -1868,7 +1874,7 @@
     \else:
       \@@_hexadecimal_use:NTF #1
         { \exp_after:wN \@@_escape_x:N }
-        { ; \exp_after:wN \@@_escape_loop:N \exp_after:wN #1 }
+        { \@@_sep: \exp_after:wN \@@_escape_loop:N \exp_after:wN #1 }
     \fi:
   }
 %    \end{macrocode}
@@ -1880,13 +1886,13 @@
 \cs_new:Npn \@@_escape_x:N #1
   {
     \if_meaning:w \scan_stop: #1
-      \exp_after:wN \use_i:nnn \exp_after:wN ;
+      \exp_after:wN \use_i:nnn \exp_after:wN \@@_sep:
     \fi:
     \use:n
       {
         \@@_hexadecimal_use:NTF #1
-          { ; \@@_escape_loop:N }
-          { ; \@@_escape_loop:N #1 }
+          { \@@_sep: \@@_escape_loop:N }
+          { \@@_sep: \@@_escape_loop:N #1 }
       }
   }
 %    \end{macrocode}
@@ -1903,7 +1909,7 @@
       \exp_after:wN \use_ii:nnn
     \fi:
     \use_ii:nn
-      { ; \@@_escape_x_loop_error:n { } {#1} }
+      { \@@_sep: \@@_escape_x_loop_error:n { } {#1} }
       {
         \@@_hexadecimal_use:NTF #1
           { \@@_escape_x_loop:N }
@@ -1911,7 +1917,7 @@
             \token_if_eq_charcode:NNTF \c_space_token #1
               { \@@_escape_x_loop:N }
               {
-                ;
+                \@@_sep:
                 \exp_after:wN
                 \token_if_eq_charcode:NNTF \c_right_brace_str #1
                   { \@@_escape_loop:N }
@@ -3016,7 +3022,7 @@
         \@@_if_within_catcode:TF
           {
             \exp_after:wN \@@_compile_class_catcode:w
-              \int_use:N \l_@@_catcodes_int ;
+              \int_use:N \l_@@_catcodes_int \@@_sep:
           }
           { \@@_compile_class_normal:w }
       }
@@ -3049,7 +3055,7 @@
 %   as appropriate, each with the current catcodes bitmap |#1| as an
 %   argument, and reset the catcodes.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_compile_class_catcode:w #1;
+\cs_new_protected:Npn \@@_compile_class_catcode:w #1 \@@_sep:
   {
     \if_int_compare:w \l_@@_mode_int = \c_@@_catcode_mode_int
       \tl_build_put_right:Nn \l_@@_build_tl
@@ -5402,7 +5408,7 @@
 %   and category from the query. Then unpack the array of active
 %   threads, and clear it by resetting its length
 %   (\texttt{max_thread}). This results in a sequence of
-%   \cs{@@_use_state_and_submatches:w} \meta{state}|,|\meta{submatch-clist}|;| and
+%   \cs{@@_use_state_and_submatches:w} \meta{state}|,|\meta{submatch-clist}\cs{@@_sep:} and
 %   we consider those states one by one in order. As soon as a thread
 %   succeeds, exit the step, and, if there are threads to consider at the
 %   next position, and we have not reached the end of the string,
@@ -5446,7 +5452,7 @@
       \g_@@_thread_info_intarray
       { \c_one_int + #1 * (\l_@@_capturing_group_int * 2 + \c_one_int) }
       { (\c_one_int + #1) * (\l_@@_capturing_group_int * 2 + \c_one_int) }
-    ;
+    \@@_sep:
   }
 %    \end{macrocode}
 % \end{macro}
@@ -5480,7 +5486,7 @@
 %   \texttt{curr_state} and \texttt{curr_submatches} and use the
 %   state if it has not yet been encountered at this step.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_use_state_and_submatches:w #1 , #2 ;
+\cs_new_protected:Npn \@@_use_state_and_submatches:w #1 , #2 \@@_sep:
   {
     \int_set:Nn \l_@@_curr_state_int {#1}
     \if_int_compare:w
@@ -5619,9 +5625,9 @@
 \cs_new_protected:Npn \@@_action_submatch:nN #1#2
   {
     \exp_after:wN \@@_action_submatch_aux:w
-    \l_@@_curr_submatches_tl ; {#1} #2
+    \l_@@_curr_submatches_tl \@@_sep: {#1} #2
   }
-\cs_new_protected:Npn \@@_action_submatch_aux:w #1 ; #2#3
+\cs_new_protected:Npn \@@_action_submatch_aux:w #1 \@@_sep: #2#3
   {
     \tl_set:Ne \l_@@_curr_submatches_tl
       {
@@ -5778,11 +5784,11 @@
 \cs_new:Npn \@@_query_range:nn #1#2
   {
     \exp_after:wN \@@_query_range_loop:ww
-    \int_value:w \@@_int_eval:w #1 \exp_after:wN ;
-    \int_value:w \@@_int_eval:w #2 ;
+    \int_value:w \@@_int_eval:w #1 \exp_after:wN \@@_sep:
+    \int_value:w \@@_int_eval:w #2 \@@_sep:
     \prg_break_point:
   }
-\cs_new:Npn \@@_query_range_loop:ww #1 ; #2 ;
+\cs_new:Npn \@@_query_range_loop:ww #1 \@@_sep: #2 \@@_sep:
   {
     \if_int_compare:w #1 < #2 \exp_stop_f:
     \else:
@@ -5790,7 +5796,7 @@
     \fi:
     \@@_toks_use:w #1 \exp_stop_f:
     \exp_after:wN \@@_query_range_loop:ww
-      \int_value:w \@@_int_eval:w #1 + \c_one_int ; #2 ;
+      \int_value:w \@@_int_eval:w #1 + \c_one_int \@@_sep: #2 \@@_sep:
   }
 %    \end{macrocode}
 % \end{macro}
@@ -7048,9 +7054,9 @@
   {
     \@@_tmp:w { }
     \exp_after:wN \@@_extract_seq_aux:ww
-    \int_value:w \@@_submatch_balance:n {#1} ; #1;
+    \int_value:w \@@_submatch_balance:n {#1} \@@_sep: #1 \@@_sep:
   }
-\cs_new:Npn \@@_extract_seq_aux:ww #1; #2;
+\cs_new:Npn \@@_extract_seq_aux:ww #1 \@@_sep: #2 \@@_sep:
   {
     \if_int_compare:w #1 < \c_zero_int
       \prg_replicate:nn {-#1}

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3seq.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3seq.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3seq.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %
@@ -2491,6 +2491,12 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}{\@@_sep:}
+%    \begin{macrocode}
+\cs_new_eq:NN \@@_sep: \__kernel_int_sep:
+%    \end{macrocode}
+% \end{macro}
+%
 % \begin{macro}
 %   {
 %     \seq_map_indexed_function:NN, \seq_map_indexed_inline:Nn,
@@ -2520,17 +2526,17 @@
     \exp_after:wN #2
     \int_value:w 1
     \exp_after:wN \use_i:nn
-    \exp_after:wN ;
+    \exp_after:wN \@@_sep:
     #1
     \prg_break: \@@_item:n { } \prg_break_point:
   }
-\cs_new:Npn \@@_map_indexed:Nw #1#2 ; #3 \@@_item:n #4
+\cs_new:Npn \@@_map_indexed:Nw #1#2 \@@_sep: #3 \@@_item:n #4
   {
     #3
     #1 {#2} {#4}
     \exp_after:wN \@@_map_indexed:Nw
     \exp_after:wN #1
-    \int_value:w \int_eval:w 1 + #2 ;
+    \int_value:w \int_eval:w 1 + #2 \@@_sep:
   }
 %    \end{macrocode}
 % \end{macro}

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3skip.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3skip.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3skip.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %
@@ -1330,6 +1330,12 @@
 %
 % \subsection{Utilities for dimension calculations}
 %
+% \begin{macro}{\@@_sep:}
+%    \begin{macrocode}
+\cs_new_eq:NN \@@_sep: \__kernel_int_sep:
+%    \end{macrocode}
+% \end{macro}
+%
 % \begin{macro}[EXP]{\dim_abs:n}
 % \begin{macro}[EXP]{\@@_abs:N}
 % \UnitTested
@@ -1351,8 +1357,8 @@
 \cs_new:Npn \dim_max:nn #1#2
   {
     \dim_use:N \@@_eval:w \exp_after:wN \@@_maxmin:wwN
-      \dim_use:N \@@_eval:w #1 \exp_after:wN ;
-      \dim_use:N \@@_eval:w #2 ;
+      \dim_use:N \@@_eval:w #1 \exp_after:wN \@@_sep:
+      \dim_use:N \@@_eval:w #2 \@@_sep:
       >
     \@@_eval_end:
   }
@@ -1359,12 +1365,12 @@
 \cs_new:Npn \dim_min:nn #1#2
   {
     \dim_use:N \@@_eval:w \exp_after:wN \@@_maxmin:wwN
-      \dim_use:N \@@_eval:w #1 \exp_after:wN ;
-      \dim_use:N \@@_eval:w #2 ;
+      \dim_use:N \@@_eval:w #1 \exp_after:wN \@@_sep:
+      \dim_use:N \@@_eval:w #2 \@@_sep:
       <
     \@@_eval_end:
   }
-\cs_new:Npn \@@_maxmin:wwN #1 ; #2 ; #3
+\cs_new:Npn \@@_maxmin:wwN #1 \@@_sep: #2 \@@_sep: #3
   {
     \if_dim:w #1 #3 #2 ~
       #1
@@ -1614,11 +1620,11 @@
 \cs_new:Npn \dim_step_function:nnnN #1#2#3
   {
     \exp_after:wN \@@_step:wwwN
-    \tex_the:D \@@_eval:w #1 \exp_after:wN ;
-    \tex_the:D \@@_eval:w #2 \exp_after:wN ;
-    \tex_the:D \@@_eval:w #3 ;
+    \tex_the:D \@@_eval:w #1 \exp_after:wN \@@_sep:
+    \tex_the:D \@@_eval:w #2 \exp_after:wN \@@_sep:
+    \tex_the:D \@@_eval:w #3 \@@_sep:
   }
-\cs_new:Npn \@@_step:wwwN #1; #2; #3; #4
+\cs_new:Npn \@@_step:wwwN #1 \@@_sep: #2 \@@_sep: #3 \@@_sep: #4
   {
     \dim_compare:nNnTF {#2} > \c_zero_dim
       { \@@_step:NnnnN > }
@@ -1707,10 +1713,10 @@
 \cs_new:Npn \dim_sign:n #1
   {
     \int_value:w \exp_after:wN \@@_sign:Nw
-      \dim_use:N \@@_eval:w #1 \@@_eval_end: ;
+      \dim_use:N \@@_eval:w #1 \@@_eval_end: \@@_sep:
     \exp_stop_f:
   }
-\cs_new:Npn \@@_sign:Nw #1#2 ;
+\cs_new:Npn \@@_sign:Nw #1#2 \@@_sep:
   {
     \if_dim:w #1#2 > \c_zero_dim
       1
@@ -1840,7 +1846,7 @@
       \cs_new:cpn { dim_to_decimal_in_ #1 :n } ##1
         {
           \exp_after:wN \@@_to_decimal_aux:w
-            \int_value:w \@@_eval:w ##1 \@@_eval_end: ; #2 ;
+            \int_value:w \@@_eval:w ##1 \@@_eval_end: \@@_sep: #2 \@@_sep:
         }
     }
 %    \end{macrocode}
@@ -1861,8 +1867,8 @@
 \group_end:
 %    \end{macrocode}
 %   The tokens after \cs{@@_to_decimal_aux:w} shall have the following form:
-%   |<number>;<half of delta inverse>;|, where |<number>| represents the
-%   input dimension in |sp| unit.
+%   |<number>|\cs{@@_sep:}|<half of delta inverse>|\cs{@@_sep:}, where
+%   |<number>| represents the input dimension in |sp| unit.
 %   If |<number>| is positive, then |#1| is its leading digit and |#2|
 %   (possibly empty) is all the remaining digits;
 %   If |<number>| is zero, then |#1| is~|0|$_{12}$ and |#2| is empty;
@@ -1871,7 +1877,7 @@
 %   In all three cases, |#1#2| is the original |<number>|. We can use |#1|
 %   to decide whether to use the |-1| formula or the |+1| formula.
 %    \begin{macrocode}
-\cs_new:Npn \@@_to_decimal_aux:w #1#2 ; #3 ;
+\cs_new:Npn \@@_to_decimal_aux:w #1#2 \@@_sep: #3 \@@_sep:
   {
     \dim_to_decimal:n
       {
@@ -1902,27 +1908,27 @@
 \cs_new:Npn \dim_to_decimal_in_unit:nn #1#2
   {
     \exp_after:wN \@@_chk_unit:w
-      \int_value:w \@@_eval:w #2 \@@_eval_end: ; {#1}
+      \int_value:w \@@_eval:w #2 \@@_eval_end: \@@_sep: {#1}
   }
 %    \end{macrocode}
 % \end{macro}
 % \begin{macro}[EXP]{\@@_chk_unit:w}
 %   The tokens after \cs{@@_chk_unit:w} shall have the following form:
-%   |<number2>;{<dimexpr1>}|, where |<number2>| represents |<dimexpr2>| in
-%   |sp| unit.
+%   |<number2>|\cs{@@_sep:}|{<dimexpr1>}|, where |<number2>| represents
+%   |<dimexpr2>| in |sp| unit.
 %   If |#1| is~|0|$_{12}$, the \enquote{unit} |<dimexpr2>| must also be zero.
 %   So we throw out a \enquote{division by zero} error message at this point.
 %   Otherwise, if |#1| is~|-|$_{12}$, we shall negate both |<dimexpr1>| and
 %   |<dimexpr2>| for later procedures.
 %    \begin{macrocode}
-\cs_new:Npn \@@_chk_unit:w #1#2;#3
+\cs_new:Npn \@@_chk_unit:w #1#2 \@@_sep: #3
   {
     \token_if_eq_charcode:NNTF #1 0
       { \msg_expandable_error:nn { dim } { zero-unit } }
       {
         \exp_after:wN \@@_branch_unit:w
-          \int_value:w \if:w #1 - - \fi: \@@_eval:w #3 \exp_after:wN ;
-          \int_value:w \if:w #1 - - \fi: #1#2 ;
+          \int_value:w \if:w #1 - - \fi: \@@_eval:w #3 \exp_after:wN \@@_sep:
+          \int_value:w \if:w #1 - - \fi: #1#2 \@@_sep:
       }
   }
 %    \end{macrocode}
@@ -1929,7 +1935,8 @@
 % \end{macro}
 % \begin{macro}[EXP]{\@@_branch_unit:w}
 %   The tokens after \cs{@@_branch_unit:w} shall have the following form:
-%   |<number1>;<number2>;|, where |<number1>| represents |<dimexpr1>| in
+%   |<number1>|\cs{@@_sep:}|<number2>|\cs{@@_sep:}, where |<number1>|
+%   represents |<dimexpr1>| in
 %   |sp| unit (whose sign is taken care of) and |<number2>| represents the
 %   absolute value of |<dimexpr2>| in |sp| unit (which is strictly positive).
 %
@@ -1977,14 +1984,14 @@
 %   represents the \enquote{integer} part, while $0\le R'\le65536$ represents the
 %   \enquote{fractional} part. (Can $R'=65536$ really happen? Didn't investigate.)
 %    \begin{macrocode}
-\cs_new:Npn \@@_branch_unit:w #1;#2;
+\cs_new:Npn \@@_branch_unit:w #1 \@@_sep: #2 \@@_sep:
   {
     \int_compare:nNnTF {#2} > { 65536 }
-      { \@@_to_decimal_aux:w #1 ; 32768 / #2 ; }
+      { \@@_to_decimal_aux:w #1 \@@_sep: 32768 / #2 \@@_sep: }
       {
         \int_compare:nNnTF {#2} = { 65536 }
           { \dim_to_decimal:n { #1sp } }
-          { \@@_get_quotient:w #1 ; #2 ; }
+          { \@@_get_quotient:w #1 \@@_sep: #2 \@@_sep: }
       }
   }
 %    \end{macrocode}
@@ -2005,9 +2012,9 @@
 %
 %   After \cs{@@_get_quotient:w} has done its job, either we have the
 %   decimal~|0|, or we have \cs{@@_get_remainder:w} followed by
-%   $q$|;|$\lvert X\rvert$|;|$n$|;<sign of X>;|.
+%   $q$\cs{@@_sep:}$\lvert X\rvert$\cs{@@_sep:}$n$\cs{@@_sep:}|<sign of X>|\cs{@@_sep:}.
 %    \begin{macrocode}
-\cs_new:Npn \@@_get_quotient:w #1#2;#3;
+\cs_new:Npn \@@_get_quotient:w #1#2 \@@_sep: #3 \@@_sep:
   {
     \token_if_eq_charcode:NNTF #1 0
       { 0 }
@@ -2015,13 +2022,13 @@
         \token_if_eq_charcode:NNTF #1 -
           {
             \exp_after:wN \exp_after:wN \exp_after:wN \@@_get_remainder:w
-              \int_eval:n {  ( 2 * #2 - #3 ) / ( 2 * #3 ) } ;
-              #2 ; #3 ; - ;
+              \int_eval:n {  ( 2 * #2 - #3 ) / ( 2 * #3 ) } \@@_sep:
+              #2 \@@_sep: #3 \@@_sep: - \@@_sep:
           }
           {
             \exp_after:wN \exp_after:wN \exp_after:wN \@@_get_remainder:w
-              \int_eval:n { ( 2 * #1#2 - #3 ) / ( 2 * #3 ) } ;
-              #1#2 ; #3 ; ;
+              \int_eval:n { ( 2 * #1#2 - #3 ) / ( 2 * #3 ) } \@@_sep:
+              #1#2 \@@_sep: #3 \@@_sep: \@@_sep:
           }
       }
   }
@@ -2031,13 +2038,13 @@
 %   \cs{@@_get_remainder:w} does not need to read the sign.
 %   After finding the remainder~$r$, the number~$\lvert X\rvert$ is no longer
 %   needed. We should then have \cs{@@_convert_remainder:w} followed by
-%   $r$|;|$n$|;|$q$|;<sign of X>;|.
+%   $r$\cs{@@_sep:}$n$\cs{@@_sep:}$q$\cs{@@_sep:}|<sign of X>|\cs{@@_sep:}.
 %    \begin{macrocode}
-\cs_new:Npn \@@_get_remainder:w #1;#2;#3;
+\cs_new:Npn \@@_get_remainder:w #1 \@@_sep: #2 \@@_sep: #3 \@@_sep:
   {
     \exp_after:wN \exp_after:wN \exp_after:wN \@@_convert_remainder:w
-      \int_eval:n { #2 - #1 * #3 } ;
-      #3 ; #1 ;
+      \int_eval:n { #2 - #1 * #3 } \@@_sep:
+      #3 \@@_sep: #1 \@@_sep:
   }
 %    \end{macrocode}
 % \end{macro}
@@ -2044,13 +2051,13 @@
 % \begin{macro}[EXP]{\@@_convert_remainder:w}
 %   This is trivial. We compute $R'=\lfloor65536r/n+\frac{1}{2}\rfloor$,
 %   then leave \cs{@@_test_candidate:w} followed by
-%   $R'$|;|$r$|;|$n$|;|$q$|;<sign of X>;|.
+%   $R'$\cs{@@_sep:}$r$\cs{@@_sep:}$n$\cs{@@_sep:}$q$\cs{@@_sep:}|<sign of X>|\cs{@@_sep:}.
 %    \begin{macrocode}
-\cs_new:Npn \@@_convert_remainder:w #1;#2;
+\cs_new:Npn \@@_convert_remainder:w #1 \@@_sep: #2 \@@_sep:
   {
     \exp_after:wN \exp_after:wN \exp_after:wN \@@_test_candidate:w
-      \int_eval:n { #1 * 65536 / #2 } ;
-      #1 ; #2 ;
+      \int_eval:n { #1 * 65536 / #2 } \@@_sep:
+      #1 \@@_sep: #2 \@@_sep:
   }
 %    \end{macrocode}
 % \end{macro}
@@ -2062,15 +2069,15 @@
 %   If the result is true, then we've found~$R'$;
 %   otherwise we add one to~$R'$.
 %   After this step, $r$ and~$n$ are no longer needed. We should then have
-%   \cs{@@_parse_decimal:w} followed by $R'$|;|$q$|;<sign of X>;|.
+%   \cs{@@_parse_decimal:w} followed by $R'$\cs{@@_sep:}$q$\cs{@@_sep:}|<sign of X>|\cs{@@_sep:}.
 %    \begin{macrocode}
-\cs_new:Npn \@@_test_candidate:w #1;#2;#3;
+\cs_new:Npn \@@_test_candidate:w #1 \@@_sep: #2 \@@_sep: #3 \@@_sep:
   {
     \dim_compare:nNnTF { #2sp } =
       { \dim_to_decimal:n { #1sp } \@@_eval:w #3sp \@@_eval_end: }
-      { \@@_parse_decimal:w #1 ; }
+      { \@@_parse_decimal:w #1 \@@_sep: }
       {
-        \@@_parse_decimal:w \int_eval:n { #1 + 1 } ;
+        \@@_parse_decimal:w \int_eval:n { #1 + 1 } \@@_sep:
       }
   }
 %    \end{macrocode}
@@ -2080,15 +2087,15 @@
 %   result if necessary. These are all done expandably.
 %   If $0<R'/65536<1$, the integer summation is naturally terminated at the
 %   decimal point. If $R'/65536=0$ (or~$1$?), the summation is terminated
-%   at the semicolon. The auxiliary function \cs{@@_parse_decimal_aux:w}
+%   at the \cs{@@_sep:}. The auxiliary function \cs{@@_parse_decimal_aux:w}
 %   takes care of both cases.
 %    \begin{macrocode}
-\cs_new:Npn \@@_parse_decimal:w #1;#2;#3;
+\cs_new:Npn \@@_parse_decimal:w #1 \@@_sep: #2 \@@_sep: #3 \@@_sep:
   {
     \exp_after:wN \@@_parse_decimal_aux:w
-      \int_value:w #3 \int_eval:w #2 + \dim_to_decimal:n { #1sp } ;
+      \int_value:w #3 \int_eval:w #2 + \dim_to_decimal:n { #1sp } \@@_sep:
   }
-\cs_new:Npn \@@_parse_decimal_aux:w #1 ; {#1}
+\cs_new:Npn \@@_parse_decimal_aux:w #1 \@@_sep: {#1}
 %    \end{macrocode}
 % \end{macro}
 %
@@ -2289,6 +2296,12 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}{\@@_sep:}
+%    \begin{macrocode}
+\cs_new_eq:NN \@@_sep: \__kernel_int_sep:
+%    \end{macrocode}
+% \end{macro}
+%
 % \begin{macro}[EXP,pTF]{\skip_if_finite:n}
 % \begin{macro}[EXP]{\@@_if_finite:wwNw}
 %   With \eTeX{}, we have an easy access to the order of infinities of
@@ -2304,10 +2317,10 @@
     \prg_new_conditional:Npnn \skip_if_finite:n ##1 { p , T , F , TF }
       {
         \exp_after:wN \@@_if_finite:wwNw
-        \skip_use:N \tex_glueexpr:D ##1 ; \prg_return_false:
-        #1 ; \prg_return_true: \s_@@_stop
+        \skip_use:N \tex_glueexpr:D ##1 \@@_sep: \prg_return_false:
+        #1 \@@_sep: \prg_return_true: \s_@@_stop
       }
-    \cs_new:Npn \@@_if_finite:wwNw ##1 #1 ##2 ; ##3 ##4 \s_@@_stop {##3}
+    \cs_new:Npn \@@_if_finite:wwNw ##1 #1 ##2 \@@_sep: ##3 ##4 \s_@@_stop {##3}
   }
 \exp_args:No \@@_tmp:w { \tl_to_str:n { fil } }
 %    \end{macrocode}

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3sort.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3sort.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3sort.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %
@@ -119,6 +119,12 @@
 %<@@=sort>
 %    \end{macrocode}
 %
+% \begin{macro}{\@@_sep:}
+%    \begin{macrocode}
+\cs_new_eq:NN \@@_sep: \__kernel_int_sep:
+%    \end{macrocode}
+% \end{macro}
+%
 % \subsection{Variables}
 %
 % \begin{variable}{\g_@@_internal_seq, \g_@@_internal_tl}
@@ -377,18 +383,18 @@
     \group_begin:
       \@@_main:NNNn \tl_map_inline:Nn \tl_map_break:n #2 {#3}
       \__kernel_tl_gset:Nx \g_@@_internal_tl
-        { \@@_tl_toks:w \l_@@_min_int ; }
+        { \@@_tl_toks:w \l_@@_min_int \@@_sep: }
     \group_end:
     #1 #2 \g_@@_internal_tl
     \tl_gclear:N \g_@@_internal_tl
     \prg_break_point:
   }
-\cs_new:Npn \@@_tl_toks:w #1 ;
+\cs_new:Npn \@@_tl_toks:w #1 \@@_sep:
   {
     \if_int_compare:w #1 < \l_@@_top_int
       { \tex_the:D \tex_toks:D #1 }
       \exp_after:wN \@@_tl_toks:w
-      \int_value:w \int_eval:n { #1 + 1 } \exp_after:wN ;
+      \int_value:w \int_eval:n { #1 + 1 } \exp_after:wN \@@_sep:
     \fi:
   }
 %    \end{macrocode}

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3str-convert.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3str-convert.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3str-convert.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %
@@ -1793,7 +1793,7 @@
   { \@@_convert_gmap_internal:N \@@_encode_utf_viii_char:n }
 \cs_new:Npn \@@_encode_utf_viii_char:n #1
   {
-    \@@_encode_utf_viii_loop:wwnnw #1 ; - 1 + 0 * ;
+    \@@_encode_utf_viii_loop:wwnnw #1 \@@_sep: - 1 + 0 * \@@_sep:
       { 128 } {       0 }
       {  32 } {     192 }
       {  16 } {     224 }
@@ -1800,7 +1800,8 @@
       {   8 } {     240 }
     \s_@@_stop
   }
-\cs_new:Npn \@@_encode_utf_viii_loop:wwnnw #1; #2; #3#4 #5 \s_@@_stop
+\cs_new:Npn \@@_encode_utf_viii_loop:wwnnw
+  #1 \@@_sep: #2 \@@_sep: #3#4 #5 \s_@@_stop
   {
     \if_int_compare:w #1 < #3 \exp_stop_f:
       \@@_output_byte:n { #1 + #4 }
@@ -1807,7 +1808,7 @@
       \exp_after:wN \@@_use_none_delimit_by_s_stop:w
     \fi:
     \exp_after:wN \@@_encode_utf_viii_loop:wwnnw
-      \int_value:w \int_div_truncate:nn {#1} {64} ; #1 ;
+      \int_value:w \int_div_truncate:nn {#1} {64} \@@_sep: #1 \@@_sep:
       #5 \s_@@_stop
     \@@_output_byte:n { #2 - 64 * ( #1 - 2 ) }
   }

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3str.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3str.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3str.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %
@@ -1555,6 +1555,12 @@
 % \end{macro}
 % \end{macro}
 %
+% \begin{macro}{\@@_sep:}
+%    \begin{macrocode}
+\cs_new_eq:NN \@@_sep: \__kernel_int_sep:
+%    \end{macrocode}
+% \end{macro}
+%
 % \begin{macro}[EXP]
 %   {\str_item:Nn, \str_item:cn, \str_item:nn, \str_item_ignore_spaces:nn}
 % \begin{macro}[EXP]{\@@_item:nn, \@@_item:w}
@@ -1590,11 +1596,11 @@
 \cs_new:Npn \@@_item:nn #1#2
   {
     \exp_after:wN \@@_item:w
-    \int_value:w \int_eval:n {#2} \exp_after:wN ;
-    \int_value:w \@@_count:n {#1} ;
+    \int_value:w \int_eval:n {#2} \exp_after:wN \@@_sep:
+    \int_value:w \@@_count:n {#1} \@@_sep:
     #1 \s_@@_stop
   }
-\cs_new:Npn \@@_item:w #1; #2;
+\cs_new:Npn \@@_item:w #1 \@@_sep: #2 \@@_sep:
   {
     \int_compare:nNnTF {#1} < 0
       {
@@ -1603,7 +1609,7 @@
           {
             \exp_after:wN \@@_use_i_delimit_by_s_stop:nw
             \exp:w \exp_after:wN \@@_skip_exp_end:w
-              \int_value:w \int_eval:n { #1 + #2 } ;
+              \int_value:w \int_eval:n { #1 + #2 } \@@_sep:
           }
       }
       {
@@ -1611,7 +1617,7 @@
           { \@@_use_none_delimit_by_s_stop:w }
           {
             \exp_after:wN \@@_use_i_delimit_by_s_stop:nw
-            \exp:w \@@_skip_exp_end:w #1 ; { }
+            \exp:w \@@_skip_exp_end:w #1 \@@_sep: { }
           }
       }
   }
@@ -1636,7 +1642,7 @@
 %   stop the initial expansion with \cs{exp_end:} (see places where
 %   \cs{@@_skip_exp_end:w} is called).
 %    \begin{macrocode}
-\cs_new:Npn \@@_skip_exp_end:w #1;
+\cs_new:Npn \@@_skip_exp_end:w #1 \@@_sep:
   {
     \if_int_compare:w #1 > 8 \exp_stop_f:
       \exp_after:wN \@@_skip_loop:wNNNNNNNN
@@ -1644,14 +1650,14 @@
       \exp_after:wN \@@_skip_end:w
       \int_value:w \int_eval:w
     \fi:
-    #1 ;
+    #1 \@@_sep:
   }
-\cs_new:Npn \@@_skip_loop:wNNNNNNNN #1; #2#3#4#5#6#7#8#9
+\cs_new:Npn \@@_skip_loop:wNNNNNNNN #1 \@@_sep: #2#3#4#5#6#7#8#9
   {
     \exp_after:wN \@@_skip_exp_end:w
-      \int_value:w \int_eval:n { #1 - 8 } ;
+      \int_value:w \int_eval:n { #1 - 8 } \@@_sep:
   }
-\cs_new:Npn \@@_skip_end:w #1 ;
+\cs_new:Npn \@@_skip_end:w #1 \@@_sep:
   {
     \exp_after:wN \@@_skip_end:NNNNNNNN
     \if_case:w #1 \exp_stop_f: \or: \or: \or: \or: \or: \or: \or: \or:
@@ -1689,12 +1695,12 @@
 \cs_new:Npn \@@_range:nnn #1#2#3
   {
     \exp_after:wN \@@_range:w
-    \int_value:w \@@_count:n {#1} \exp_after:wN ;
-    \int_value:w \int_eval:n { (#2) - 1 } \exp_after:wN ;
-    \int_value:w \int_eval:n {#3} ;
+    \int_value:w \@@_count:n {#1} \exp_after:wN \@@_sep:
+    \int_value:w \int_eval:n { (#2) - 1 } \exp_after:wN \@@_sep:
+    \int_value:w \int_eval:n {#3} \@@_sep:
     #1 \s_@@_stop
   }
-\cs_new:Npn \@@_range:w #1; #2; #3;
+\cs_new:Npn \@@_range:w #1 \@@_sep: #2 \@@_sep: #3 \@@_sep:
   {
     \exp_args:Nf \@@_range:nnw
       { \@@_range_normalize:nn {#2} {#1} }
@@ -1703,8 +1709,8 @@
 \cs_new:Npn \@@_range:nnw #1#2
   {
     \exp_after:wN \@@_collect_delimit_by_q_stop:w
-    \int_value:w \int_eval:n { #2 - #1 } \exp_after:wN ;
-    \exp:w \@@_skip_exp_end:w #1 ;
+    \int_value:w \int_eval:n { #2 - #1 } \exp_after:wN \@@_sep:
+    \exp:w \@@_skip_exp_end:w #1 \@@_sep:
   }
 %    \end{macrocode}
 % \end{macro}
@@ -1755,9 +1761,9 @@
 %   leaving this in the input stream closes the conditional properly
 %   and the \cs{or:} disappear.
 %    \begin{macrocode}
-\cs_new:Npn \@@_collect_delimit_by_q_stop:w #1;
-  { \@@_collect_loop:wn #1 ; { } }
-\cs_new:Npn \@@_collect_loop:wn #1 ;
+\cs_new:Npn \@@_collect_delimit_by_q_stop:w #1 \@@_sep:
+  { \@@_collect_loop:wn #1 \@@_sep: { } }
+\cs_new:Npn \@@_collect_loop:wn #1 \@@_sep:
   {
     \if_int_compare:w #1 > 7 \exp_stop_f:
       \exp_after:wN \@@_collect_loop:wnNNNNNNN
@@ -1764,15 +1770,15 @@
     \else:
       \exp_after:wN \@@_collect_end:wn
     \fi:
-    #1 ;
+    #1 \@@_sep:
   }
-\cs_new:Npn \@@_collect_loop:wnNNNNNNN #1; #2 #3#4#5#6#7#8#9
+\cs_new:Npn \@@_collect_loop:wnNNNNNNN #1 \@@_sep: #2 #3#4#5#6#7#8#9
   {
     \exp_after:wN \@@_collect_loop:wn
-    \int_value:w \int_eval:n { #1 - 7 } ;
+    \int_value:w \int_eval:n { #1 - 7 } \@@_sep:
     { #2 #3#4#5#6#7#8#9 }
   }
-\cs_new:Npn \@@_collect_end:wn #1 ;
+\cs_new:Npn \@@_collect_end:wn #1 \@@_sep:
   {
     \exp_after:wN \@@_collect_end:nnnnnnnnw
     \if_case:w \if_int_compare:w #1 > \c_zero_int

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3sys.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3sys.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3sys.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3text-case.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3text-case.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3text-case.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3text-map.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3text-map.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3text-map.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3text-purify.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3text-purify.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3text-purify.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3text.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3text.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3text.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %
@@ -496,6 +496,12 @@
 %
 % \subsection{Utilities}
 %
+% \begin{macro}{\@@_sep:}
+%    \begin{macrocode}
+\cs_new_eq:NN \@@_sep: \__kernel_int_sep:
+%    \end{macrocode}
+% \end{macro}
+%
 % \begin{macro}[EXP]
 %   {
 %     \@@_token_to_explicit:N      ,
@@ -601,10 +607,10 @@
         \if_catcode:w A #1 11 \else:
         \if_catcode:w + #1 12 \else:
         4 \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi:
-    \exp_after:wN ;
+    \exp_after:wN \@@_sep:
     \token_to_meaning:N #1 \s_@@_stop
   }
-\cs_new:Npn \@@_token_to_explicit_auxi:w #1 ; #2 \s_@@_stop
+\cs_new:Npn \@@_token_to_explicit_auxi:w #1 \@@_sep: #2 \s_@@_stop
   {
     \char_generate:nn
       {

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3tl-analysis.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3tl-analysis.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3tl-analysis.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %
@@ -292,7 +292,9 @@
 %   Extracting the character code from the meaning of
 %   \cs{l_@@_analysis_token}. This has no error checking, and should
 %   only be assumed to work for begin-group and end-group character
-%   tokens. It produces a number in the form |`|\meta{char}.
+%   tokens. It produces a number in the form |`|\meta{char}. LuaMeta\TeX{}
+%   uses a different format for \tn{meaning}, so there is a little work to
+%   do: we extract the Unicode value this contains.
 %    \begin{macrocode}
 \cs_new:Npn \@@_analysis_extract_charcode:
   {
@@ -300,6 +302,12 @@
       \token_to_meaning:N \l_@@_analysis_token
   }
 \cs_new:Npn \@@_analysis_extract_charcode_aux:w #1 ~ #2 ~ { ` }
+\bool_lazy_and:nnT
+  { \cs_if_exist_p:N \tex_luatexversion:D }
+  { \int_compare_p:nNn { \int_div_truncate:nn { \tex_luatexversion:D } { 100 } } > 1 }
+  {
+    \cs_gset:Npn \@@_analysis_extract_charcode_aux:w #1 + #2 ~ ' #3 ' {"#2}
+  }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
@@ -310,16 +318,17 @@
 %   Counts the number of spaces in the string representation of its
 %   second argument, as well as the number of characters following the
 %   last space in that representation, and feeds the two numbers as
-%   semicolon-delimited arguments to the first argument. When this
+%   \cs{@@_sep:}-delimited arguments to the first argument. When this
 %   function is used, the escape character is printable and non-space.
 %    \begin{macrocode}
-\cs_new:Npn \@@_analysis_cs_space_count:NN #1 #2
+\cs_new:Npe \@@_analysis_cs_space_count:NN #1 #2
   {
-    \exp_after:wN #1
-    \int_value:w \int_eval:w 0
-      \exp_after:wN \@@_analysis_cs_space_count:w
-        \token_to_str:N #2
-        \fi: \@@_analysis_cs_space_count_end:w ; ~ !
+    \exp_not:N \exp_after:wN #1
+    \exp_not:N \int_value:w \exp_not:N \int_eval:w 0
+      \exp_not:N \exp_after:wN \exp_not:N \@@_analysis_cs_space_count:w
+        \exp_not:N \token_to_str:N #2
+        \exp_not:N \fi: \exp_not:N \@@_analysis_cs_space_count_end:w
+          \exp_not:N \@@_sep: \c_space_tl !
   }
 \cs_new:Npn \@@_analysis_cs_space_count:w #1 ~
   {
@@ -327,8 +336,11 @@
     + 1
     \@@_analysis_cs_space_count:w
   }
-\cs_new:Npn \@@_analysis_cs_space_count_end:w ; #1 \fi: #2 !
-  { \exp_after:wN ; \int_value:w \str_count_ignore_spaces:n {#1} ; }
+\cs_new:Npn \@@_analysis_cs_space_count_end:w \@@_sep: #1 \fi: #2 !
+  {
+    \exp_after:wN \@@_sep: \int_value:w
+      \str_count_ignore_spaces:n {#1} \@@_sep:
+  }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
@@ -773,7 +785,7 @@
       { \@@_analysis_cs_space_count:NN \@@_analysis_a_cs:ww #1 }
     \@@_analysis_a_loop:w
   }
-\cs_new_protected:Npn \@@_analysis_a_cs:ww #1; #2;
+\cs_new_protected:Npn \@@_analysis_a_cs:ww #1 \@@_sep: #2 \@@_sep:
   {
     \if_int_compare:w #1 > \c_zero_int
       \tex_skip:D \l_@@_analysis_index_int
@@ -805,14 +817,14 @@
   {
     \__kernel_tl_gset:Nx \g_@@_analysis_result_tl
       {
-        \@@_analysis_b_loop:w 0; #1
+        \@@_analysis_b_loop:w 0 \@@_sep: #1
         \prg_break_point:
       }
   }
-\cs_new:Npn \@@_analysis_b_loop:w #1;
+\cs_new:Npn \@@_analysis_b_loop:w #1 \@@_sep:
   {
     \exp_after:wN \@@_analysis_b_normals:ww
-      \int_value:w \tex_skip:D #1 ; #1 ;
+      \int_value:w \tex_skip:D #1 \@@_sep: #1 \@@_sep:
   }
 %    \end{macrocode}
 % \end{macro}
@@ -832,14 +844,14 @@
 %   a macro parameter character or could be \cs{s_@@}
 %   (which must be hidden behind braces in the result).
 %    \begin{macrocode}
-\cs_new:Npn \@@_analysis_b_normals:ww #1;
+\cs_new:Npn \@@_analysis_b_normals:ww #1 \@@_sep:
   {
     \if_int_compare:w #1 = \c_zero_int
       \@@_analysis_b_special:w
     \fi:
-    \@@_analysis_b_normal:wwN #1;
+    \@@_analysis_b_normal:wwN #1 \@@_sep:
   }
-\cs_new:Npn \@@_analysis_b_normal:wwN #1; #2; #3
+\cs_new:Npn \@@_analysis_b_normal:wwN #1 \@@_sep: #2 \@@_sep: #3
   {
     \exp_not:n { \exp_not:n { #3 } } \s_@@
     \if_charcode:w
@@ -851,7 +863,7 @@
     \else:
       \exp_after:wN \@@_analysis_b_cs:Nww
     \fi:
-    #3 #1; #2;
+    #3 #1 \@@_sep: #2 \@@_sep:
   }
 %    \end{macrocode}
 % \end{macro}
@@ -910,7 +922,8 @@
     0 -1 \s_@@
     \@@_analysis_cs_space_count:NN \@@_analysis_b_cs_test:ww #1
   }
-\cs_new:Npn \@@_analysis_b_cs_test:ww #1 ; #2 ; #3 ; #4 ;
+\cs_new:Npn \@@_analysis_b_cs_test:ww
+  #1 \@@_sep: #2 \@@_sep: #3 \@@_sep: #4 \@@_sep:
   {
     \exp_after:wN \@@_analysis_b_normals:ww
     \int_value:w \int_eval:w
@@ -920,8 +933,8 @@
       \tex_skip:D \int_eval:n { #4 + #1 } \exp_stop_f:
     \fi:
     - #2
-    \exp_after:wN ;
-    \int_value:w \int_eval:n { #4 + #1 } ;
+    \exp_after:wN \@@_sep:
+    \int_value:w \int_eval:n { #4 + #1 } \@@_sep:
   }
 %    \end{macrocode}
 % \end{macro}
@@ -942,7 +955,7 @@
 \group_begin:
   \char_set_catcode_other:N A
   \cs_new:Npn \@@_analysis_b_special:w
-      \fi: \@@_analysis_b_normal:wwN 0 ; #1 ;
+      \fi: \@@_analysis_b_normal:wwN 0 \@@_sep: #1 \@@_sep:
     {
       \fi:
       \if_int_compare:w #1 = \l_@@_analysis_index_int
@@ -960,19 +973,23 @@
       \else:
         \exp_after:wN \@@_analysis_b_special_space:w \int_value:w
       \fi:
-      \int_eval:n { 1 + #1 } \exp_after:wN ;
+      \int_eval:n { 1 + #1 } \exp_after:wN \@@_sep:
       \token_to_str:N
     }
 \group_end:
-\cs_new:Npn \@@_analysis_b_special_char:wN #1 ; #2
+\cs_new:Npn \@@_analysis_b_special_char:wN #1 \@@_sep: #2
   {
     \int_value:w `#2 \s_@@
-    \@@_analysis_b_loop:w #1 ;
+    \@@_analysis_b_loop:w #1 \@@_sep:
   }
-\cs_new:Npn \@@_analysis_b_special_space:w #1 ; ~
+\use:e
   {
+    \cs_new:Npn \exp_not:N \@@_analysis_b_special_space:w
+      #1 \exp_not:N \@@_sep: \c_space_tl
+  }
+  {
     32 \s_@@
-    \@@_analysis_b_loop:w #1 ;
+    \@@_analysis_b_loop:w #1 \@@_sep:
   }
 %    \end{macrocode}
 % \end{macro}

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3tl-build.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3tl-build.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3tl-build.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3tl.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3tl.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3tl.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %
@@ -3797,6 +3797,20 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}{\__kernel_int_sep:}
+%  See comments in the kernel functions file: has to be set up here as this
+%  is the first module where it is needed.
+%    \begin{macrocode}
+\cs_new_eq:NN \__kernel_int_sep: \tex_right:D
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_sep:}
+%    \begin{macrocode}
+\cs_new_eq:NN \@@_sep: \__kernel_int_sep:
+%    \end{macrocode}
+% \end{macro}
+%
 % \begin{macro}{\tl_range:Nnn, \tl_range:cnn, \tl_range:nnn}
 % \begin{macro}
 %   {
@@ -3818,7 +3832,7 @@
 %   extra brace group avoids an off-by-one shift).  For the braced
 %   version \cs{@@_range_braced:w} sets up
 %   \cs{@@_range_collect_braced:w} which stores items one by one in an
-%   argument after the semicolon. Depending on the first token of the tail,
+%   argument after the \cs{@@_sep:}. Depending on the first token of the tail,
 %   either just move  it (if it is a space) or also decrement the number of
 %   items left to find.  Eventually, the result is a brace group followed by
 %   the rest of the token list, and \cs{tl_head:f} cleans up and gives the
@@ -3853,19 +3867,19 @@
       \exp_after:wN { \exp_after:wN }
     \fi:
     \exp_after:wN #3
-    \int_value:w \int_eval:n { #2 - #1 } \exp_after:wN ;
-    \exp_after:wN { \exp:w \@@_range_skip:w #1 ; { } #4 }
+    \int_value:w \int_eval:n { #2 - #1 } \exp_after:wN \@@_sep:
+    \exp_after:wN { \exp:w \@@_range_skip:w #1 \@@_sep: { } #4 }
   }
-\cs_new:Npn \@@_range_skip:w #1 ; #2
+\cs_new:Npn \@@_range_skip:w #1 \@@_sep: #2
   {
     \if_int_compare:w #1 > \c_zero_int
       \exp_after:wN \@@_range_skip:w
-      \int_value:w \int_eval:n { #1 - 1 } \exp_after:wN ;
+      \int_value:w \int_eval:n { #1 - 1 } \exp_after:wN \@@_sep:
     \else:
       \exp_after:wN \exp_end:
     \fi:
   }
-\cs_new:Npn \@@_range:w #1 ; #2
+\cs_new:Npn \@@_range:w #1 \@@_sep: #2
   {
     \exp_args:Nf \@@_range_collect:nn
       { \@@_range_skip_spaces:n {#2} } {#1}

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3token.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3token.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3token.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %
@@ -1512,6 +1512,12 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}{\@@_sep:}
+%    \begin{macrocode}
+\cs_new_eq:NN \@@_sep: \__kernel_int_sep:
+%    \end{macrocode}
+% \end{macro}
+%
 % \begin{macro}[EXP]{\char_generate:nn}
 % \begin{macro}[EXP]{\@@_generate_aux:nn}
 % \begin{macro}[EXP]{\@@_generate_aux:nnw, \@@_generate_auxii:nnw}
@@ -1526,8 +1532,8 @@
 \cs_new:Npn \char_generate:nn #1#2
   {
     \exp:w \exp_after:wN \@@_generate_aux:w
-      \int_value:w \int_eval:n {#1} \exp_after:wN ;
-      \int_value:w \int_eval:n {#2} ;
+      \int_value:w \int_eval:n {#1} \exp_after:wN \@@_sep:
+      \int_value:w \int_eval:n {#2} \@@_sep:
   }
 %    \end{macrocode}
 %   Before doing any actual conversion, first some special case filtering.
@@ -1536,7 +1542,7 @@
 %   done with macro emulation either, so is treated separately. That
 %   done, hand off to the engine-dependent part.
 %    \begin{macrocode}
-\cs_new:Npn \@@_generate_aux:w #1 ; #2 ;
+\cs_new:Npn \@@_generate_aux:w #1 \@@_sep: #2 \@@_sep:
   {
     \if_int_odd:w 0
         \if_int_compare:w #2 < 1  \exp_stop_f: 1 \fi:

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3unicode.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3unicode.dtx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3unicode.dtx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-04-14}
+% \date{Released 2025-04-29}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/tex/latex-dev/l3kernel/expl3-code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/l3kernel/expl3-code.tex	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/tex/latex-dev/l3kernel/expl3-code.tex	2025-04-29 19:46:22 UTC (rev 75056)
@@ -78,7 +78,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx
-\def\ExplFileDate{2025-04-14}%
+\def\ExplFileDate{2025-04-29}%
 \begingroup
   \def\next{\endgroup}%
   \expandafter\ifx\csname PackageError\endcsname\relax
@@ -4561,6 +4561,8 @@
   }
 \cs_new:Npn \tl_rand_item:N { \exp_args:No \tl_rand_item:n }
 \cs_generate_variant:Nn \tl_rand_item:N { c }
+\cs_new_eq:NN \__kernel_int_sep: \tex_right:D
+\cs_new_eq:NN \__tl_sep: \__kernel_int_sep:
 \cs_new:Npn \tl_range:Nnn { \exp_args:No \tl_range:nnn }
 \cs_generate_variant:Nn \tl_range:Nnn { c }
 \cs_new:Npn \tl_range:nnn { \__tl_range:Nnnn \__tl_range:w }
@@ -4590,19 +4592,19 @@
       \exp_after:wN { \exp_after:wN }
     \fi:
     \exp_after:wN #3
-    \int_value:w \int_eval:n { #2 - #1 } \exp_after:wN ;
-    \exp_after:wN { \exp:w \__tl_range_skip:w #1 ; { } #4 }
+    \int_value:w \int_eval:n { #2 - #1 } \exp_after:wN \__tl_sep:
+    \exp_after:wN { \exp:w \__tl_range_skip:w #1 \__tl_sep: { } #4 }
   }
-\cs_new:Npn \__tl_range_skip:w #1 ; #2
+\cs_new:Npn \__tl_range_skip:w #1 \__tl_sep: #2
   {
     \if_int_compare:w #1 > \c_zero_int
       \exp_after:wN \__tl_range_skip:w
-      \int_value:w \int_eval:n { #1 - 1 } \exp_after:wN ;
+      \int_value:w \int_eval:n { #1 - 1 } \exp_after:wN \__tl_sep:
     \else:
       \exp_after:wN \exp_end:
     \fi:
   }
-\cs_new:Npn \__tl_range:w #1 ; #2
+\cs_new:Npn \__tl_range:w #1 \__tl_sep: #2
   {
     \exp_args:Nf \__tl_range_collect:nn
       { \__tl_range_skip_spaces:n {#2} } {#1}
@@ -5195,6 +5197,7 @@
       }
     \cs_new:Npn \__str_to_other_fast_end:w #1 * A #2 \s__str_stop {#1}
   }
+\cs_new_eq:NN \__str_sep: \__kernel_int_sep:
 \cs_new:Npn \str_item:Nn { \exp_args:No \str_item:nn }
 \cs_generate_variant:Nn \str_item:Nn { c }
 \cs_new:Npn \str_item:nn #1#2
@@ -5210,11 +5213,11 @@
 \cs_new:Npn \__str_item:nn #1#2
   {
     \exp_after:wN \__str_item:w
-    \int_value:w \int_eval:n {#2} \exp_after:wN ;
-    \int_value:w \__str_count:n {#1} ;
+    \int_value:w \int_eval:n {#2} \exp_after:wN \__str_sep:
+    \int_value:w \__str_count:n {#1} \__str_sep:
     #1 \s__str_stop
   }
-\cs_new:Npn \__str_item:w #1; #2;
+\cs_new:Npn \__str_item:w #1 \__str_sep: #2 \__str_sep:
   {
     \int_compare:nNnTF {#1} < 0
       {
@@ -5223,7 +5226,7 @@
           {
             \exp_after:wN \__str_use_i_delimit_by_s_stop:nw
             \exp:w \exp_after:wN \__str_skip_exp_end:w
-              \int_value:w \int_eval:n { #1 + #2 } ;
+              \int_value:w \int_eval:n { #1 + #2 } \__str_sep:
           }
       }
       {
@@ -5231,11 +5234,11 @@
           { \__str_use_none_delimit_by_s_stop:w }
           {
             \exp_after:wN \__str_use_i_delimit_by_s_stop:nw
-            \exp:w \__str_skip_exp_end:w #1 ; { }
+            \exp:w \__str_skip_exp_end:w #1 \__str_sep: { }
           }
       }
   }
-\cs_new:Npn \__str_skip_exp_end:w #1;
+\cs_new:Npn \__str_skip_exp_end:w #1 \__str_sep:
   {
     \if_int_compare:w #1 > 8 \exp_stop_f:
       \exp_after:wN \__str_skip_loop:wNNNNNNNN
@@ -5243,14 +5246,14 @@
       \exp_after:wN \__str_skip_end:w
       \int_value:w \int_eval:w
     \fi:
-    #1 ;
+    #1 \__str_sep:
   }
-\cs_new:Npn \__str_skip_loop:wNNNNNNNN #1; #2#3#4#5#6#7#8#9
+\cs_new:Npn \__str_skip_loop:wNNNNNNNN #1 \__str_sep: #2#3#4#5#6#7#8#9
   {
     \exp_after:wN \__str_skip_exp_end:w
-      \int_value:w \int_eval:n { #1 - 8 } ;
+      \int_value:w \int_eval:n { #1 - 8 } \__str_sep:
   }
-\cs_new:Npn \__str_skip_end:w #1 ;
+\cs_new:Npn \__str_skip_end:w #1 \__str_sep:
   {
     \exp_after:wN \__str_skip_end:NNNNNNNN
     \if_case:w #1 \exp_stop_f: \or: \or: \or: \or: \or: \or: \or: \or:
@@ -5271,12 +5274,12 @@
 \cs_new:Npn \__str_range:nnn #1#2#3
   {
     \exp_after:wN \__str_range:w
-    \int_value:w \__str_count:n {#1} \exp_after:wN ;
-    \int_value:w \int_eval:n { (#2) - 1 } \exp_after:wN ;
-    \int_value:w \int_eval:n {#3} ;
+    \int_value:w \__str_count:n {#1} \exp_after:wN \__str_sep:
+    \int_value:w \int_eval:n { (#2) - 1 } \exp_after:wN \__str_sep:
+    \int_value:w \int_eval:n {#3} \__str_sep:
     #1 \s__str_stop
   }
-\cs_new:Npn \__str_range:w #1; #2; #3;
+\cs_new:Npn \__str_range:w #1 \__str_sep: #2 \__str_sep: #3 \__str_sep:
   {
     \exp_args:Nf \__str_range:nnw
       { \__str_range_normalize:nn {#2} {#1} }
@@ -5285,8 +5288,8 @@
 \cs_new:Npn \__str_range:nnw #1#2
   {
     \exp_after:wN \__str_collect_delimit_by_q_stop:w
-    \int_value:w \int_eval:n { #2 - #1 } \exp_after:wN ;
-    \exp:w \__str_skip_exp_end:w #1 ;
+    \int_value:w \int_eval:n { #2 - #1 } \exp_after:wN \__str_sep:
+    \exp:w \__str_skip_exp_end:w #1 \__str_sep:
   }
 \cs_new:Npn \__str_range_normalize:nn #1#2
   {
@@ -5307,9 +5310,9 @@
         \fi:
       }
   }
-\cs_new:Npn \__str_collect_delimit_by_q_stop:w #1;
-  { \__str_collect_loop:wn #1 ; { } }
-\cs_new:Npn \__str_collect_loop:wn #1 ;
+\cs_new:Npn \__str_collect_delimit_by_q_stop:w #1 \__str_sep:
+  { \__str_collect_loop:wn #1 \__str_sep: { } }
+\cs_new:Npn \__str_collect_loop:wn #1 \__str_sep:
   {
     \if_int_compare:w #1 > 7 \exp_stop_f:
       \exp_after:wN \__str_collect_loop:wnNNNNNNN
@@ -5316,15 +5319,15 @@
     \else:
       \exp_after:wN \__str_collect_end:wn
     \fi:
-    #1 ;
+    #1 \__str_sep:
   }
-\cs_new:Npn \__str_collect_loop:wnNNNNNNN #1; #2 #3#4#5#6#7#8#9
+\cs_new:Npn \__str_collect_loop:wnNNNNNNN #1 \__str_sep: #2 #3#4#5#6#7#8#9
   {
     \exp_after:wN \__str_collect_loop:wn
-    \int_value:w \int_eval:n { #1 - 7 } ;
+    \int_value:w \int_eval:n { #1 - 7 } \__str_sep:
     { #2 #3#4#5#6#7#8#9 }
   }
-\cs_new:Npn \__str_collect_end:wn #1 ;
+\cs_new:Npn \__str_collect_end:wn #1 \__str_sep:
   {
     \exp_after:wN \__str_collect_end:nnnnnnnnw
     \if_case:w \if_int_compare:w #1 > \c_zero_int
@@ -6229,6 +6232,7 @@
   }
 \cs_generate_variant:Nn \seq_map_variable:NNn {     Nc }
 \cs_generate_variant:Nn \seq_map_variable:NNn { c , cc }
+\cs_new_eq:NN \__seq_sep: \__kernel_int_sep:
 \cs_new:Npn \seq_map_indexed_function:NN #1#2
   {
     \__seq_map_indexed:NN #1#2
@@ -6250,17 +6254,17 @@
     \exp_after:wN #2
     \int_value:w 1
     \exp_after:wN \use_i:nn
-    \exp_after:wN ;
+    \exp_after:wN \__seq_sep:
     #1
     \prg_break: \__seq_item:n { } \prg_break_point:
   }
-\cs_new:Npn \__seq_map_indexed:Nw #1#2 ; #3 \__seq_item:n #4
+\cs_new:Npn \__seq_map_indexed:Nw #1#2 \__seq_sep: #3 \__seq_item:n #4
   {
     #3
     #1 {#2} {#4}
     \exp_after:wN \__seq_map_indexed:Nw
     \exp_after:wN #1
-    \int_value:w \int_eval:w 1 + #2 ;
+    \int_value:w \int_eval:w 1 + #2 \__seq_sep:
   }
 \cs_new:Npn \seq_map_pairwise_function:NNN #1#2#3
   { \exp_after:wN \__seq_map_pairwise_function:wNN #2 \s__seq_stop #1 #3 }
@@ -6429,7 +6433,7 @@
 \cs_new:Npn \int_eval:n #1
   { \tex_the:D \__int_eval:w #1 \__int_eval_end: }
 \cs_new:Npn \int_eval:w { \tex_the:D \__int_eval:w }
-\cs_new_eq:NN \__int_sep: \tex_right:D
+\cs_new_eq:NN \__int_sep: \__kernel_int_sep:
 \cs_new:Npn \int_sign:n #1
   {
     \int_value:w \exp_after:wN \__int_sign:Nw
@@ -7278,6 +7282,7 @@
 \int_new:N \l__seq_internal_a_int
 \int_new:N \l__seq_internal_b_int
 %% File: l3flag.dtx
+\cs_new_eq:NN \__flag_sep: \__kernel_int_sep:
 \cs_new_protected:Npn \flag_new:N #1
   { \cs_new_protected:Npe #1 { \cs_to_str:N #1 } }
 \cs_generate_variant:Nn \flag_new:N { c }
@@ -7285,11 +7290,11 @@
 \flag_new:N \l_tmpb_flag
 \cs_new_protected:Npn \flag_clear:N #1
   {
-    \__flag_clear:wN 0 ; #1
+    \__flag_clear:wN 0 \__flag_sep: #1
     \prg_break_point:
   }
 \cs_generate_variant:Nn \flag_clear:N { c }
-\cs_new_protected:Npn \__flag_clear:wN #1 ; #2
+\cs_new_protected:Npn \__flag_clear:wN #1 \__flag_sep: #2
   {
     \if_cs_exist:w #2 #1 \cs_end: \else:
       \prg_break:n
@@ -7296,7 +7301,7 @@
     \fi:
     \cs_set_eq:cN { #2 #1 } \tex_undefined:D
     \exp_after:wN \__flag_clear:wN
-    \int_value:w \int_eval:w \c_one_int + #1 ; #2
+    \int_value:w \int_eval:w \c_one_int + #1 \__flag_sep: #2
   }
 \cs_new_protected:Npn \flag_clear_new:N #1
   { \flag_if_exist:NTF #1 { \flag_clear:N } { \flag_new:N } #1 }
@@ -7324,16 +7329,16 @@
   }
 \prg_generate_conditional_variant:Nnn \flag_if_raised:N
   { c } { p , T , F , TF }
-\cs_new:Npn \flag_height:N #1 { \__flag_height_loop:wN 0; #1 }
-\cs_new:Npn \__flag_height_loop:wN #1 ; #2
+\cs_new:Npn \flag_height:N #1 { \__flag_height_loop:wN 0 \__flag_sep: #1 }
+\cs_new:Npn \__flag_height_loop:wN #1 \__flag_sep: #2
   {
     \if_cs_exist:w #2 #1 \cs_end: \else:
       \exp_after:wN \__flag_height_end:wN
     \fi:
     \exp_after:wN \__flag_height_loop:wN
-    \int_value:w \int_eval:w \c_one_int + #1 ; #2
+    \int_value:w \int_eval:w \c_one_int + #1 \__flag_sep: #2
   }
-\cs_new:Npn \__flag_height_end:wN #1 + #2 ; #3 {#2}
+\cs_new:Npn \__flag_height_end:wN #1 + #2 \__flag_sep: #3 {#2}
 \cs_generate_variant:Nn \flag_height:N { c }
 \cs_new:Npn \flag_raise:N #1
   { \exp_after:wN \use_none:n \cs:w #1 \flag_height:N #1 \cs_end: }
@@ -9055,13 +9060,14 @@
 \cs_generate_variant:Nn \char_set_active_eq:nN  { nc }
 \cs_generate_variant:Nn \char_gset_active_eq:nN { nc }
 \cs_new_eq:NN \__char_int_to_roman:w \tex_romannumeral:D
+\cs_new_eq:NN \__char_sep: \__kernel_int_sep:
 \cs_new:Npn \char_generate:nn #1#2
   {
     \exp:w \exp_after:wN \__char_generate_aux:w
-      \int_value:w \int_eval:n {#1} \exp_after:wN ;
-      \int_value:w \int_eval:n {#2} ;
+      \int_value:w \int_eval:n {#1} \exp_after:wN \__char_sep:
+      \int_value:w \int_eval:n {#2} \__char_sep:
   }
-\cs_new:Npn \__char_generate_aux:w #1 ; #2 ;
+\cs_new:Npn \__char_generate_aux:w #1 \__char_sep: #2 \__char_sep:
   {
     \if_int_odd:w 0
         \if_int_compare:w #2 < 1  \exp_stop_f: 1 \fi:
@@ -12047,6 +12053,7 @@
     \tl_clear:N \l__iow_indent_tl
     \__iow_wrap_chunk:nw { \l_iow_line_count_int }
   }
+\cs_new_eq:NN \__iow_sep: \__kernel_int_sep:
 \cs_set_protected:Npn \__iow_tmp:w #1#2
   {
     \cs_new_protected:Npn \__iow_wrap_chunk:nw ##1##2 #2
@@ -12061,9 +12068,9 @@
               {
                 \__iow_wrap_line:nw
                   { \l__iow_indent_tl }
-                  ##1 - \l__iow_indent_int ;
+                  ##1 - \l__iow_indent_int \__iow_sep:
               }
-              { \__iow_wrap_line:nw { } ##1 ; }
+              { \__iow_wrap_line:nw { } ##1 \__iow_sep: }
             ##2 #1
             \__iow_wrap_end_chunk:w 7 6 5 4 3 2 1 0 \s__iow_stop
           }
@@ -12079,7 +12086,7 @@
     \exp_after:wN \__iow_wrap_line_loop:w
     \int_value:w \int_eval:w
   }
-\cs_new:Npn \__iow_wrap_line_loop:w #1 ; #2#3#4#5#6#7#8#9
+\cs_new:Npn \__iow_wrap_line_loop:w #1 \__iow_sep: #2#3#4#5#6#7#8#9
   {
     \if_int_compare:w #1 < 8 \exp_stop_f:
       \__iow_wrap_line_aux:Nw #1
@@ -12086,9 +12093,9 @@
     \fi:
     #2 #3 #4 #5 #6 #7 #8 #9
     \exp_after:wN \__iow_wrap_line_loop:w
-    \int_value:w \int_eval:w #1 - 8 ;
+    \int_value:w \int_eval:w #1 - 8 \__iow_sep:
   }
-\cs_new:Npn \__iow_wrap_line_aux:Nw #1#2#3 \exp_after:wN #4 ;
+\cs_new:Npn \__iow_wrap_line_aux:Nw #1#2#3 \exp_after:wN #4 \__iow_sep:
   {
     #2
     \exp_after:wN \__iow_wrap_line_end:NnnnnnnnN
@@ -12111,7 +12118,7 @@
 \cs_new:Npn \__iow_wrap_line_end:NnnnnnnnN #1#2#3#4#5#6#7#8#9
   {
     #2 #3 #4 #5 #6 #7 #8
-    \use_none:nnnnn \int_eval:w 8 - ; #9
+    \use_none:nnnnn \int_eval:w 8 - \__iow_sep: #9
     \token_if_eq_charcode:NNTF \c_space_token #9
       { \__iow_wrap_line_end:nw { } }
       { \if_false: { \fi: } \__iow_wrap_break:w #9 }
@@ -12123,7 +12130,7 @@
     \__iow_wrap_next_line:w
   }
 \cs_new:Npn \__iow_wrap_end_chunk:w
-    #1 \int_eval:w #2 - #3 ; #4#5 \s__iow_stop
+    #1 \int_eval:w #2 - #3 \__iow_sep: #4#5 \s__iow_stop
   {
     \if_false: { \fi: }
     \exp_args:Nf \__iow_wrap_next:nw { \int_eval:n { #2 - #4 } }
@@ -12173,7 +12180,7 @@
       {
         \__iow_wrap_line:nw
           { \l__iow_indent_tl }
-          \l__iow_line_target_int - \l__iow_indent_int ;
+          \l__iow_line_target_int - \l__iow_indent_int \__iow_sep:
           #1 #2 \s__iow_stop
       }
   }
@@ -13132,6 +13139,7 @@
   }
 \cs_generate_variant:Nn \dim_sub:Nn  { c }
 \cs_generate_variant:Nn \dim_gsub:Nn { c }
+\cs_new_eq:NN \__dim_sep: \__kernel_int_sep:
 \cs_new:Npn \dim_abs:n #1
   {
     \exp_after:wN \__dim_abs:N
@@ -13142,8 +13150,8 @@
 \cs_new:Npn \dim_max:nn #1#2
   {
     \dim_use:N \__dim_eval:w \exp_after:wN \__dim_maxmin:wwN
-      \dim_use:N \__dim_eval:w #1 \exp_after:wN ;
-      \dim_use:N \__dim_eval:w #2 ;
+      \dim_use:N \__dim_eval:w #1 \exp_after:wN \__dim_sep:
+      \dim_use:N \__dim_eval:w #2 \__dim_sep:
       >
     \__dim_eval_end:
   }
@@ -13150,12 +13158,12 @@
 \cs_new:Npn \dim_min:nn #1#2
   {
     \dim_use:N \__dim_eval:w \exp_after:wN \__dim_maxmin:wwN
-      \dim_use:N \__dim_eval:w #1 \exp_after:wN ;
-      \dim_use:N \__dim_eval:w #2 ;
+      \dim_use:N \__dim_eval:w #1 \exp_after:wN \__dim_sep:
+      \dim_use:N \__dim_eval:w #2 \__dim_sep:
       <
     \__dim_eval_end:
   }
-\cs_new:Npn \__dim_maxmin:wwN #1 ; #2 ; #3
+\cs_new:Npn \__dim_maxmin:wwN #1 \__dim_sep: #2 \__dim_sep: #3
   {
     \if_dim:w #1 #3 #2 ~
       #1
@@ -13301,11 +13309,11 @@
 \cs_new:Npn \dim_step_function:nnnN #1#2#3
   {
     \exp_after:wN \__dim_step:wwwN
-    \tex_the:D \__dim_eval:w #1 \exp_after:wN ;
-    \tex_the:D \__dim_eval:w #2 \exp_after:wN ;
-    \tex_the:D \__dim_eval:w #3 ;
+    \tex_the:D \__dim_eval:w #1 \exp_after:wN \__dim_sep:
+    \tex_the:D \__dim_eval:w #2 \exp_after:wN \__dim_sep:
+    \tex_the:D \__dim_eval:w #3 \__dim_sep:
   }
-\cs_new:Npn \__dim_step:wwwN #1; #2; #3; #4
+\cs_new:Npn \__dim_step:wwwN #1 \__dim_sep: #2 \__dim_sep: #3 \__dim_sep: #4
   {
     \dim_compare:nNnTF {#2} > \c_zero_dim
       { \__dim_step:NnnnN > }
@@ -13358,10 +13366,10 @@
 \cs_new:Npn \dim_sign:n #1
   {
     \int_value:w \exp_after:wN \__dim_sign:Nw
-      \dim_use:N \__dim_eval:w #1 \__dim_eval_end: ;
+      \dim_use:N \__dim_eval:w #1 \__dim_eval_end: \__dim_sep:
     \exp_stop_f:
   }
-\cs_new:Npn \__dim_sign:Nw #1#2 ;
+\cs_new:Npn \__dim_sign:Nw #1#2 \__dim_sep:
   {
     \if_dim:w #1#2 > \c_zero_dim
       1
@@ -13398,7 +13406,7 @@
       \cs_new:cpn { dim_to_decimal_in_ #1 :n } ##1
         {
           \exp_after:wN \__dim_to_decimal_aux:w
-            \int_value:w \__dim_eval:w ##1 \__dim_eval_end: ; #2 ;
+            \int_value:w \__dim_eval:w ##1 \__dim_eval_end: \__dim_sep: #2 \__dim_sep:
         }
     }
   \__dim_tmp:w { in } {   50 /  7227 } % delta = 7227/100
@@ -13409,7 +13417,7 @@
   \__dim_tmp:w { dd } { 1157 /  2476 } % delta = 1238/1157
   \__dim_tmp:w { cc } { 1157 / 29712 } % delta = 14856/1157
 \group_end:
-\cs_new:Npn \__dim_to_decimal_aux:w #1#2 ; #3 ;
+\cs_new:Npn \__dim_to_decimal_aux:w #1#2 \__dim_sep: #3 \__dim_sep:
   {
     \dim_to_decimal:n
       {
@@ -13421,29 +13429,29 @@
 \cs_new:Npn \dim_to_decimal_in_unit:nn #1#2
   {
     \exp_after:wN \__dim_chk_unit:w
-      \int_value:w \__dim_eval:w #2 \__dim_eval_end: ; {#1}
+      \int_value:w \__dim_eval:w #2 \__dim_eval_end: \__dim_sep: {#1}
   }
-\cs_new:Npn \__dim_chk_unit:w #1#2;#3
+\cs_new:Npn \__dim_chk_unit:w #1#2 \__dim_sep: #3
   {
     \token_if_eq_charcode:NNTF #1 0
       { \msg_expandable_error:nn { dim } { zero-unit } }
       {
         \exp_after:wN \__dim_branch_unit:w
-          \int_value:w \if:w #1 - - \fi: \__dim_eval:w #3 \exp_after:wN ;
-          \int_value:w \if:w #1 - - \fi: #1#2 ;
+          \int_value:w \if:w #1 - - \fi: \__dim_eval:w #3 \exp_after:wN \__dim_sep:
+          \int_value:w \if:w #1 - - \fi: #1#2 \__dim_sep:
       }
   }
-\cs_new:Npn \__dim_branch_unit:w #1;#2;
+\cs_new:Npn \__dim_branch_unit:w #1 \__dim_sep: #2 \__dim_sep:
   {
     \int_compare:nNnTF {#2} > { 65536 }
-      { \__dim_to_decimal_aux:w #1 ; 32768 / #2 ; }
+      { \__dim_to_decimal_aux:w #1 \__dim_sep: 32768 / #2 \__dim_sep: }
       {
         \int_compare:nNnTF {#2} = { 65536 }
           { \dim_to_decimal:n { #1sp } }
-          { \__dim_get_quotient:w #1 ; #2 ; }
+          { \__dim_get_quotient:w #1 \__dim_sep: #2 \__dim_sep: }
       }
   }
-\cs_new:Npn \__dim_get_quotient:w #1#2;#3;
+\cs_new:Npn \__dim_get_quotient:w #1#2 \__dim_sep: #3 \__dim_sep:
   {
     \token_if_eq_charcode:NNTF #1 0
       { 0 }
@@ -13451,43 +13459,43 @@
         \token_if_eq_charcode:NNTF #1 -
           {
             \exp_after:wN \exp_after:wN \exp_after:wN \__dim_get_remainder:w
-              \int_eval:n {  ( 2 * #2 - #3 ) / ( 2 * #3 ) } ;
-              #2 ; #3 ; - ;
+              \int_eval:n {  ( 2 * #2 - #3 ) / ( 2 * #3 ) } \__dim_sep:
+              #2 \__dim_sep: #3 \__dim_sep: - \__dim_sep:
           }
           {
             \exp_after:wN \exp_after:wN \exp_after:wN \__dim_get_remainder:w
-              \int_eval:n { ( 2 * #1#2 - #3 ) / ( 2 * #3 ) } ;
-              #1#2 ; #3 ; ;
+              \int_eval:n { ( 2 * #1#2 - #3 ) / ( 2 * #3 ) } \__dim_sep:
+              #1#2 \__dim_sep: #3 \__dim_sep: \__dim_sep:
           }
       }
   }
-\cs_new:Npn \__dim_get_remainder:w #1;#2;#3;
+\cs_new:Npn \__dim_get_remainder:w #1 \__dim_sep: #2 \__dim_sep: #3 \__dim_sep:
   {
     \exp_after:wN \exp_after:wN \exp_after:wN \__dim_convert_remainder:w
-      \int_eval:n { #2 - #1 * #3 } ;
-      #3 ; #1 ;
+      \int_eval:n { #2 - #1 * #3 } \__dim_sep:
+      #3 \__dim_sep: #1 \__dim_sep:
   }
-\cs_new:Npn \__dim_convert_remainder:w #1;#2;
+\cs_new:Npn \__dim_convert_remainder:w #1 \__dim_sep: #2 \__dim_sep:
   {
     \exp_after:wN \exp_after:wN \exp_after:wN \__dim_test_candidate:w
-      \int_eval:n { #1 * 65536 / #2 } ;
-      #1 ; #2 ;
+      \int_eval:n { #1 * 65536 / #2 } \__dim_sep:
+      #1 \__dim_sep: #2 \__dim_sep:
   }
-\cs_new:Npn \__dim_test_candidate:w #1;#2;#3;
+\cs_new:Npn \__dim_test_candidate:w #1 \__dim_sep: #2 \__dim_sep: #3 \__dim_sep:
   {
     \dim_compare:nNnTF { #2sp } =
       { \dim_to_decimal:n { #1sp } \__dim_eval:w #3sp \__dim_eval_end: }
-      { \__dim_parse_decimal:w #1 ; }
+      { \__dim_parse_decimal:w #1 \__dim_sep: }
       {
-        \__dim_parse_decimal:w \int_eval:n { #1 + 1 } ;
+        \__dim_parse_decimal:w \int_eval:n { #1 + 1 } \__dim_sep:
       }
   }
-\cs_new:Npn \__dim_parse_decimal:w #1;#2;#3;
+\cs_new:Npn \__dim_parse_decimal:w #1 \__dim_sep: #2 \__dim_sep: #3 \__dim_sep:
   {
     \exp_after:wN \__dim_parse_decimal_aux:w
-      \int_value:w #3 \int_eval:w #2 + \dim_to_decimal:n { #1sp } ;
+      \int_value:w #3 \int_eval:w #2 + \dim_to_decimal:n { #1sp } \__dim_sep:
   }
-\cs_new:Npn \__dim_parse_decimal_aux:w #1 ; {#1}
+\cs_new:Npn \__dim_parse_decimal_aux:w #1 \__dim_sep: {#1}
 \cs_new_eq:NN  \dim_show:N \__kernel_register_show:N
 \cs_generate_variant:Nn \dim_show:N { c }
 \cs_new_protected:Npn \dim_show:n
@@ -13557,15 +13565,16 @@
       { \prg_return_true: }
       { \prg_return_false: }
   }
+\cs_new_eq:NN \__skip_sep: \__kernel_int_sep:
 \cs_set_protected:Npn \__skip_tmp:w #1
   {
     \prg_new_conditional:Npnn \skip_if_finite:n ##1 { p , T , F , TF }
       {
         \exp_after:wN \__skip_if_finite:wwNw
-        \skip_use:N \tex_glueexpr:D ##1 ; \prg_return_false:
-        #1 ; \prg_return_true: \s__skip_stop
+        \skip_use:N \tex_glueexpr:D ##1 \__skip_sep: \prg_return_false:
+        #1 \__skip_sep: \prg_return_true: \s__skip_stop
       }
-    \cs_new:Npn \__skip_if_finite:wwNw ##1 #1 ##2 ; ##3 ##4 \s__skip_stop {##3}
+    \cs_new:Npn \__skip_if_finite:wwNw ##1 #1 ##2 \__skip_sep: ##3 ##4 \s__skip_stop {##3}
   }
 \exp_args:No \__skip_tmp:w { \tl_to_str:n { fil } }
 \cs_new:Npn \skip_eval:n #1
@@ -15163,6 +15172,7 @@
 %% File: l3intarray.dtx
 \msg_new:nnn { kernel } { negative-array-size }
   { Size~of~array~may~not~be~negative:~#1 }
+\cs_new_eq:NN \__intarray_sep: \__kernel_int_sep:
 \int_new:N \l__intarray_loop_int
 \cs_if_exist:NTF \__intarray_gset_count:Nw
   {
@@ -15291,11 +15301,11 @@
       {
         \exp_after:wN \__intarray_gset:Nww
         \exp_after:wN #1
-        \int_value:w \int_eval:n {#2} \exp_after:wN ;
-        \int_value:w \int_eval:n {#3} ;
+        \int_value:w \int_eval:n {#2} \exp_after:wN \__intarray_sep:
+        \int_value:w \int_eval:n {#3} \__intarray_sep:
       }
     \cs_generate_variant:Nn \intarray_gset:Nnn { c }
-    \cs_new_protected:Npn \__intarray_gset:Nww #1#2 ; #3 ;
+    \cs_new_protected:Npn \__intarray_gset:Nww #1#2 \__intarray_sep: #3 \__intarray_sep:
       {
         \__intarray_bounds:NNnTF \msg_error:nneee #1 {#2}
           {
@@ -15343,10 +15353,10 @@
       {
         \exp_after:wN \__intarray_item:Nw
         \exp_after:wN #1
-        \int_value:w \int_eval:n {#2} ;
+        \int_value:w \int_eval:n {#2} \__intarray_sep:
       }
     \cs_generate_variant:Nn \intarray_item:Nn { c }
-    \cs_new:Npn \__intarray_item:Nw #1#2 ;
+    \cs_new:Npn \__intarray_item:Nw #1#2 \__intarray_sep:
       {
         \__intarray_bounds:NNnTF \msg_expandable_error:nnfff #1 {#2}
           { \__kernel_intarray_item:Nn #1 {#2} }
@@ -15375,10 +15385,10 @@
         \int_compare:nNnF { \intarray_count:N #1 } = \c_zero_int
           {
             \exp_last_unbraced:Nf \use_none:n
-              { \__intarray_to_clist:w 1 ; #1 {#2} \prg_break_point: }
+              { \__intarray_to_clist:w 1 \__intarray_sep: #1 {#2} \prg_break_point: }
           }
       }
-    \cs_new:Npn \__intarray_to_clist:w #1 ; #2#3
+    \cs_new:Npn \__intarray_to_clist:w #1 \__intarray_sep: #2#3
       {
         \if_int_compare:w #1 > \__intarray_count:w #2
           \prg_break:n
@@ -15385,7 +15395,7 @@
         \fi:
         #3 \__kernel_intarray_item:Nn #2 {#1}
         \exp_after:wN \__intarray_to_clist:w
-        \int_value:w \int_eval:w #1 + \c_one_int ; #2 {#3}
+        \int_value:w \int_eval:w #1 + \c_one_int \__intarray_sep: #2 {#3}
       }
     \cs_new:Npn \__kernel_intarray_range_to_clist:Nnn #1#2#3
       {
@@ -15392,12 +15402,12 @@
         \exp_last_unbraced:Nf \use_none:n
           {
             \exp_after:wN \__intarray_range_to_clist:ww
-            \int_value:w \int_eval:w #2 \exp_after:wN ;
-            \int_value:w \int_eval:w #3 ;
+            \int_value:w \int_eval:w #2 \exp_after:wN \__intarray_sep:
+            \int_value:w \int_eval:w #3 \__intarray_sep:
             #1 \prg_break_point:
           }
       }
-    \cs_new:Npn \__intarray_range_to_clist:ww #1 ; #2 ; #3
+    \cs_new:Npn \__intarray_range_to_clist:ww #1 \__intarray_sep: #2 \__intarray_sep: #3
       {
         \if_int_compare:w #1 > #2 \exp_stop_f:
           \prg_break:n
@@ -15404,7 +15414,7 @@
         \fi:
         , \__kernel_intarray_item:Nn #3 {#1}
         \exp_after:wN \__intarray_range_to_clist:ww
-        \int_value:w \int_eval:w #1 + \c_one_int ; #2 ; #3
+        \int_value:w \int_eval:w #1 + \c_one_int \__intarray_sep: #2 \__intarray_sep: #3
       }
     \cs_new_protected:Npn \__kernel_intarray_gset_range_from_clist:Nnn #1#2#3
       {
@@ -15445,7 +15455,7 @@
 \cs_new_eq:NN \__fp_int_eval:w \tex_numexpr:D
 \cs_new_eq:NN \__fp_int_eval_end: \scan_stop:
 \cs_new_eq:NN \__fp_int_to_roman:w \tex_romannumeral:D
-\cs_new_eq:NN \__fp_sep: \tex_right:D
+\cs_new_eq:NN \__fp_sep: \__kernel_int_sep:
 \cs_new:Npn \__fp_use_none_stop_f:n #1 { \exp_stop_f: }
 \cs_new:Npn \__fp_use_s:n #1 { #1\__fp_sep: }
 \cs_new:Npn \__fp_use_s:nn #1#2 { #1#2\__fp_sep: }
@@ -15976,6 +15986,17 @@
 \cs_new:Npn \__fp_error:nnnn
   { \msg_expandable_error:nnnnn { fp } }
 \cs_generate_variant:Nn \__fp_error:nnnn { nnf, nff , nfff }
+\cs_new:Npn \__fp_error_num_args:nnnn #1#2#3#4
+  {
+    \int_compare:nNnTF {#2} = {#3}
+      { \msg_expandable_error:nnnnn { fp } { num-args-eq } {#1} {#2} {#4} }
+      { \msg_expandable_error:nnnnnn { fp } { num-args } {#1} {#2} {#3} {#4} }
+  }
+\cs_generate_variant:Nn \__fp_error_num_args:nnnn { ffff }
+\msg_new:nnn { fp } { num-args-eq }
+  { #1()~needs~#2~arguments,~got~#3. }
+\msg_new:nnn { fp } { num-args }
+  { #1()~needs~#2~to~#3~arguments,~got~#4. }
 \msg_new:nnnn { fp } { unknown-fpu-exception }
   {
     The~FPU~exception~'#1'~is~not~known:~
@@ -16169,10 +16190,10 @@
 \cs_new:Npn \__fp_round_no_arg_o:Nw #1
   {
     \cs_if_eq:NNTF #1 \__fp_round_to_nearest:NNN
-      { \__fp_error:nnnn { num-args } { round () } { 1 } { 3 } }
+      { \__fp_error_num_args:nnnn { round } { 1 } { 3 } { 0 } }
       {
-        \__fp_error:nffn { num-args }
-          { \__fp_round_name_from_cs:N #1 () } { 1 } { 2 }
+        \__fp_error_num_args:ffff
+          { \__fp_round_name_from_cs:N #1 } { 1 } { 2 } { 0 }
       }
     \exp_after:wN \c_nan_fp
   }
@@ -16193,13 +16214,15 @@
             #2 \__fp_sep: #3 \__fp_sep:
           }
           {
-            \__fp_error:nnnn { num-args } { round () } { 1 } { 3 }
+            \__fp_error_num_args:ffff { round } { 1 } { 3 }
+              { \int_eval:n { 3 + \__fp_array_count:n {#7} } }
             \exp_after:wN \c_nan_fp
           }
       }
       {
-        \__fp_error:nffn { num-args }
-          { \__fp_round_name_from_cs:N #1 () } { 1 } { 2 }
+        \__fp_error_num_args:ffff
+          { \__fp_round_name_from_cs:N #1 } { 1 } { 2 }
+          { \int_eval:n { 3 + \__fp_array_count:n {#7} } }
         \exp_after:wN \c_nan_fp
       }
   }
@@ -16320,7 +16343,7 @@
 \int_const:Nn \c__fp_prec_tuple_int  { 1 }
 \int_const:Nn \c__fp_prec_end_int    { 0 }
 \cs_new:Npn \__fp_parse_expand:w #1 { \exp_end_continue_f:w #1 }
-\cs_new:Npn \__fp_parse_return_semicolon:w
+\cs_new:Npn \__fp_parse_return_sep:w
     #1 \fi: \__fp_parse_expand:w { \fi: \__fp_sep: #1 }
 \cs_set_protected:Npn \__fp_tmp:w #1 #2 #3
   {
@@ -16329,7 +16352,7 @@
         \if_int_compare:w 9 < 1 \token_to_str:N ##1 \exp_stop_f:
           \token_to_str:N ##1 \exp_after:wN #2 \exp:w
         \else:
-          \__fp_parse_return_semicolon:w #3 ##1
+          \__fp_parse_return_sep:w #3 ##1
         \fi:
         \__fp_parse_expand:w
       }
@@ -16560,7 +16583,7 @@
       \exp:w \exp_after:wN \__fp_parse_letters:N
       \exp:w
     \else:
-      \__fp_parse_return_semicolon:w #1
+      \__fp_parse_return_sep:w #1
     \fi:
     \__fp_parse_expand:w
   }
@@ -16768,7 +16791,7 @@
         \exp:w
       \fi:
     \else:
-      \__fp_parse_return_semicolon:w 0 #1
+      \__fp_parse_return_sep:w 0 #1
     \fi:
     \__fp_parse_expand:w
   }
@@ -16779,7 +16802,7 @@
       \exp_after:wN \__fp_parse_round_up:N
       \exp:w
     \else:
-      \__fp_parse_return_semicolon:w 1 #1
+      \__fp_parse_return_sep:w 1 #1
     \fi:
     \__fp_parse_expand:w
   }
@@ -16862,7 +16885,7 @@
       \exp_after:wN #1
       \exp:w
     \else:
-      0 \__fp_parse_return_semicolon:w #1
+      0 \__fp_parse_return_sep:w #1
     \fi:
     \__fp_parse_expand:w
   }
@@ -16894,7 +16917,7 @@
       \exp:w
     \else:
       \__fp_parse_exponent_keep:NTF #1
-        { \__fp_parse_return_semicolon:w #1 }
+        { \__fp_parse_return_sep:w #1 }
         {
           \exp_after:wN \__fp_sep:
           \exp:w
@@ -16909,7 +16932,7 @@
       \exp_after:wN \__fp_parse_exponent_digits:N
       \exp:w
     \else:
-      \__fp_parse_return_semicolon:w #1
+      \__fp_parse_return_sep:w #1
     \fi:
     \__fp_parse_expand:w
   }
@@ -17648,8 +17671,6 @@
   { #1~got~no~argument;~used~nan. }
 \msg_new:nnn { fp } { multi-arg }
   { #1~got~more~than~one~argument;~used~nan. }
-\msg_new:nnn { fp } { num-args }
-  { #1~expects~between~#2~and~#3~arguments. }
 \msg_new:nnn { fp } { bad-args }
   { Arguments~in~#1#2~are~invalid. }
 \msg_new:nnn { fp } { infty-pi }
@@ -21520,8 +21541,8 @@
         \__fp_rand_myriads:n { XXXX } { 0000 } { 0000 } \__fp_sep: 0
       }
       {
-        \msg_expandable_error:nnnnn
-          { fp } { num-args } { rand() } { 0 } { 0 }
+        \__fp_error_num_args:ffff { rand } { 0 } { 0 }
+          { \__fp_array_count:n {#1} }
         \exp_after:wN \c_nan_fp
       }
   }
@@ -21881,7 +21902,7 @@
       { __fp         _#2_symbolic_o:ww }
       { __fp_symbolic_#2_symbolic_o:ww }
   }
-\tl_map_inline:nn { + - * / ^ & | }
+\tl_map_inline:nn { + - * / ^ & | } % |
   { \exp_args:Nc \__fp_tmp:w { __fp_#1_o:ww } {#1} }
 \cs_new:Npn \__fp_symbolic_unary_o:NNw #1#2#3\__fp_sep: @
   {
@@ -23098,6 +23119,7 @@
 \prop_gput:Nnn \g_msg_module_name_prop { cctab } { LaTeX }
 \prop_gput:Nnn \g_msg_module_type_prop { cctab } { }
 %% File l3sort.dtx
+\cs_new_eq:NN \__sort_sep: \__kernel_int_sep:
 \seq_new:N \g__sort_internal_seq
 \tl_new:N \g__sort_internal_tl
 \int_new:N \l__sort_length_int
@@ -23212,18 +23234,18 @@
     \group_begin:
       \__sort_main:NNNn \tl_map_inline:Nn \tl_map_break:n #2 {#3}
       \__kernel_tl_gset:Nx \g__sort_internal_tl
-        { \__sort_tl_toks:w \l__sort_min_int ; }
+        { \__sort_tl_toks:w \l__sort_min_int \__sort_sep: }
     \group_end:
     #1 #2 \g__sort_internal_tl
     \tl_gclear:N \g__sort_internal_tl
     \prg_break_point:
   }
-\cs_new:Npn \__sort_tl_toks:w #1 ;
+\cs_new:Npn \__sort_tl_toks:w #1 \__sort_sep:
   {
     \if_int_compare:w #1 < \l__sort_top_int
       { \tex_the:D \tex_toks:D #1 }
       \exp_after:wN \__sort_tl_toks:w
-      \int_value:w \int_eval:n { #1 + 1 } \exp_after:wN ;
+      \int_value:w \int_eval:n { #1 + 1 } \exp_after:wN \__sort_sep:
     \fi:
   }
 \cs_new_protected:Npn \seq_sort:Nn
@@ -24333,7 +24355,7 @@
   { \__str_convert_gmap_internal:N \__str_encode_utf_viii_char:n }
 \cs_new:Npn \__str_encode_utf_viii_char:n #1
   {
-    \__str_encode_utf_viii_loop:wwnnw #1 ; - 1 + 0 * ;
+    \__str_encode_utf_viii_loop:wwnnw #1 \__str_sep: - 1 + 0 * \__str_sep:
       { 128 } {       0 }
       {  32 } {     192 }
       {  16 } {     224 }
@@ -24340,7 +24362,8 @@
       {   8 } {     240 }
     \s__str_stop
   }
-\cs_new:Npn \__str_encode_utf_viii_loop:wwnnw #1; #2; #3#4 #5 \s__str_stop
+\cs_new:Npn \__str_encode_utf_viii_loop:wwnnw
+  #1 \__str_sep: #2 \__str_sep: #3#4 #5 \s__str_stop
   {
     \if_int_compare:w #1 < #3 \exp_stop_f:
       \__str_output_byte:n { #1 + #4 }
@@ -24347,7 +24370,7 @@
       \exp_after:wN \__str_use_none_delimit_by_s_stop:w
     \fi:
     \exp_after:wN \__str_encode_utf_viii_loop:wwnnw
-      \int_value:w \int_div_truncate:nn {#1} {64} ; #1 ;
+      \int_value:w \int_div_truncate:nn {#1} {64} \__str_sep: #1 \__str_sep:
       #5 \s__str_stop
     \__str_output_byte:n { #2 - 64 * ( #1 - 2 ) }
   }
@@ -24876,14 +24899,21 @@
       \token_to_meaning:N \l__tl_analysis_token
   }
 \cs_new:Npn \__tl_analysis_extract_charcode_aux:w #1 ~ #2 ~ { ` }
-\cs_new:Npn \__tl_analysis_cs_space_count:NN #1 #2
+\bool_lazy_and:nnT
+  { \cs_if_exist_p:N \tex_luatexversion:D }
+  { \int_compare_p:nNn { \int_div_truncate:nn { \tex_luatexversion:D } { 100 } } > 1 }
   {
-    \exp_after:wN #1
-    \int_value:w \int_eval:w 0
-      \exp_after:wN \__tl_analysis_cs_space_count:w
-        \token_to_str:N #2
-        \fi: \__tl_analysis_cs_space_count_end:w ; ~ !
+    \cs_gset:Npn \__tl_analysis_extract_charcode_aux:w #1 + #2 ~ ' #3 ' {"#2}
   }
+\cs_new:Npe \__tl_analysis_cs_space_count:NN #1 #2
+  {
+    \exp_not:N \exp_after:wN #1
+    \exp_not:N \int_value:w \exp_not:N \int_eval:w 0
+      \exp_not:N \exp_after:wN \exp_not:N \__tl_analysis_cs_space_count:w
+        \exp_not:N \token_to_str:N #2
+        \exp_not:N \fi: \exp_not:N \__tl_analysis_cs_space_count_end:w
+          \exp_not:N \__tl_sep: \c_space_tl !
+  }
 \cs_new:Npn \__tl_analysis_cs_space_count:w #1 ~
   {
     \if_false: #1 #1 \fi:
@@ -24890,8 +24920,11 @@
     + 1
     \__tl_analysis_cs_space_count:w
   }
-\cs_new:Npn \__tl_analysis_cs_space_count_end:w ; #1 \fi: #2 !
-  { \exp_after:wN ; \int_value:w \str_count_ignore_spaces:n {#1} ; }
+\cs_new:Npn \__tl_analysis_cs_space_count_end:w \__tl_sep: #1 \fi: #2 !
+  {
+    \exp_after:wN \__tl_sep: \int_value:w
+      \str_count_ignore_spaces:n {#1} \__tl_sep:
+  }
 \cs_new_protected:Npn \__tl_analysis:n #1
   {
     \group_begin:
@@ -25072,7 +25105,7 @@
       { \__tl_analysis_cs_space_count:NN \__tl_analysis_a_cs:ww #1 }
     \__tl_analysis_a_loop:w
   }
-\cs_new_protected:Npn \__tl_analysis_a_cs:ww #1; #2;
+\cs_new_protected:Npn \__tl_analysis_a_cs:ww #1 \__tl_sep: #2 \__tl_sep:
   {
     \if_int_compare:w #1 > \c_zero_int
       \tex_skip:D \l__tl_analysis_index_int
@@ -25087,23 +25120,23 @@
   {
     \__kernel_tl_gset:Nx \g__tl_analysis_result_tl
       {
-        \__tl_analysis_b_loop:w 0; #1
+        \__tl_analysis_b_loop:w 0 \__tl_sep: #1
         \prg_break_point:
       }
   }
-\cs_new:Npn \__tl_analysis_b_loop:w #1;
+\cs_new:Npn \__tl_analysis_b_loop:w #1 \__tl_sep:
   {
     \exp_after:wN \__tl_analysis_b_normals:ww
-      \int_value:w \tex_skip:D #1 ; #1 ;
+      \int_value:w \tex_skip:D #1 \__tl_sep: #1 \__tl_sep:
   }
-\cs_new:Npn \__tl_analysis_b_normals:ww #1;
+\cs_new:Npn \__tl_analysis_b_normals:ww #1 \__tl_sep:
   {
     \if_int_compare:w #1 = \c_zero_int
       \__tl_analysis_b_special:w
     \fi:
-    \__tl_analysis_b_normal:wwN #1;
+    \__tl_analysis_b_normal:wwN #1 \__tl_sep:
   }
-\cs_new:Npn \__tl_analysis_b_normal:wwN #1; #2; #3
+\cs_new:Npn \__tl_analysis_b_normal:wwN #1 \__tl_sep: #2 \__tl_sep: #3
   {
     \exp_not:n { \exp_not:n { #3 } } \s__tl
     \if_charcode:w
@@ -25115,7 +25148,7 @@
     \else:
       \exp_after:wN \__tl_analysis_b_cs:Nww
     \fi:
-    #3 #1; #2;
+    #3 #1 \__tl_sep: #2 \__tl_sep:
   }
 \cs_new:Npe \__tl_analysis_b_char:Nn #1#2
   {
@@ -25150,7 +25183,8 @@
     0 -1 \s__tl
     \__tl_analysis_cs_space_count:NN \__tl_analysis_b_cs_test:ww #1
   }
-\cs_new:Npn \__tl_analysis_b_cs_test:ww #1 ; #2 ; #3 ; #4 ;
+\cs_new:Npn \__tl_analysis_b_cs_test:ww
+  #1 \__tl_sep: #2 \__tl_sep: #3 \__tl_sep: #4 \__tl_sep:
   {
     \exp_after:wN \__tl_analysis_b_normals:ww
     \int_value:w \int_eval:w
@@ -25160,13 +25194,13 @@
       \tex_skip:D \int_eval:n { #4 + #1 } \exp_stop_f:
     \fi:
     - #2
-    \exp_after:wN ;
-    \int_value:w \int_eval:n { #4 + #1 } ;
+    \exp_after:wN \__tl_sep:
+    \int_value:w \int_eval:n { #4 + #1 } \__tl_sep:
   }
 \group_begin:
   \char_set_catcode_other:N A
   \cs_new:Npn \__tl_analysis_b_special:w
-      \fi: \__tl_analysis_b_normal:wwN 0 ; #1 ;
+      \fi: \__tl_analysis_b_normal:wwN 0 \__tl_sep: #1 \__tl_sep:
     {
       \fi:
       \if_int_compare:w #1 = \l__tl_analysis_index_int
@@ -25184,19 +25218,23 @@
       \else:
         \exp_after:wN \__tl_analysis_b_special_space:w \int_value:w
       \fi:
-      \int_eval:n { 1 + #1 } \exp_after:wN ;
+      \int_eval:n { 1 + #1 } \exp_after:wN \__tl_sep:
       \token_to_str:N
     }
 \group_end:
-\cs_new:Npn \__tl_analysis_b_special_char:wN #1 ; #2
+\cs_new:Npn \__tl_analysis_b_special_char:wN #1 \__tl_sep: #2
   {
     \int_value:w `#2 \s__tl
-    \__tl_analysis_b_loop:w #1 ;
+    \__tl_analysis_b_loop:w #1 \__tl_sep:
   }
-\cs_new:Npn \__tl_analysis_b_special_space:w #1 ; ~
+\use:e
   {
+    \cs_new:Npn \exp_not:N \__tl_analysis_b_special_space:w
+      #1 \exp_not:N \__tl_sep: \c_space_tl
+  }
+  {
     32 \s__tl
-    \__tl_analysis_b_loop:w #1 ;
+    \__tl_analysis_b_loop:w #1 \__tl_sep:
   }
 \cs_new_protected:Npn \tl_analysis_map_inline:Nn #1
   { \exp_args:No \tl_analysis_map_inline:nn #1 }
@@ -25782,6 +25820,7 @@
   }
 %% File: l3regex.dtx
 \cs_new_eq:NN \__regex_int_eval:w \tex_numexpr:D
+\cs_new_eq:NN \__regex_sep: \__kernel_int_sep:
 \cs_new_protected:Npn \__regex_standard_escapechar:
   { \int_set:Nn \tex_escapechar:D { `\\ } }
 \cs_new:Npn \__regex_toks_use:w { \tex_the:D \tex_toks:D }
@@ -26131,7 +26170,7 @@
     \exp_after:wN \__regex_escape_x_end:w
     \int_value:w "0 \__regex_escape_x_test:N
   }
-\cs_new:Npn \__regex_escape_x_end:w #1 ;
+\cs_new:Npn \__regex_escape_x_end:w #1 \__regex_sep:
   {
     \int_compare:nNnTF {#1} > \c_max_char_int
       {
@@ -26146,7 +26185,7 @@
 \cs_new:Npn \__regex_escape_x_test:N #1
   {
     \if_meaning:w \scan_stop: #1
-      \exp_after:wN \use_i:nnn \exp_after:wN ;
+      \exp_after:wN \use_i:nnn \exp_after:wN \__regex_sep:
     \fi:
     \use:n
       {
@@ -26165,19 +26204,19 @@
     \else:
       \__regex_hexadecimal_use:NTF #1
         { \exp_after:wN \__regex_escape_x:N }
-        { ; \exp_after:wN \__regex_escape_loop:N \exp_after:wN #1 }
+        { \__regex_sep: \exp_after:wN \__regex_escape_loop:N \exp_after:wN #1 }
     \fi:
   }
 \cs_new:Npn \__regex_escape_x:N #1
   {
     \if_meaning:w \scan_stop: #1
-      \exp_after:wN \use_i:nnn \exp_after:wN ;
+      \exp_after:wN \use_i:nnn \exp_after:wN \__regex_sep:
     \fi:
     \use:n
       {
         \__regex_hexadecimal_use:NTF #1
-          { ; \__regex_escape_loop:N }
-          { ; \__regex_escape_loop:N #1 }
+          { \__regex_sep: \__regex_escape_loop:N }
+          { \__regex_sep: \__regex_escape_loop:N #1 }
       }
   }
 \cs_new:Npn \__regex_escape_x_loop:N #1
@@ -26186,7 +26225,7 @@
       \exp_after:wN \use_ii:nnn
     \fi:
     \use_ii:nn
-      { ; \__regex_escape_x_loop_error:n { } {#1} }
+      { \__regex_sep: \__regex_escape_x_loop_error:n { } {#1} }
       {
         \__regex_hexadecimal_use:NTF #1
           { \__regex_escape_x_loop:N }
@@ -26194,7 +26233,7 @@
             \token_if_eq_charcode:NNTF \c_space_token #1
               { \__regex_escape_x_loop:N }
               {
-                ;
+                \__regex_sep:
                 \exp_after:wN
                 \token_if_eq_charcode:NNTF \c_right_brace_str #1
                   { \__regex_escape_loop:N }
@@ -26795,7 +26834,7 @@
         \__regex_if_within_catcode:TF
           {
             \exp_after:wN \__regex_compile_class_catcode:w
-              \int_use:N \l__regex_catcodes_int ;
+              \int_use:N \l__regex_catcodes_int \__regex_sep:
           }
           { \__regex_compile_class_normal:w }
       }
@@ -26806,7 +26845,7 @@
       { \__regex_class:NnnnN \c_true_bool }
       { \__regex_class:NnnnN \c_false_bool }
   }
-\cs_new_protected:Npn \__regex_compile_class_catcode:w #1;
+\cs_new_protected:Npn \__regex_compile_class_catcode:w #1 \__regex_sep:
   {
     \if_int_compare:w \l__regex_mode_int = \c__regex_catcode_mode_int
       \tl_build_put_right:Nn \l__regex_build_tl
@@ -28212,7 +28251,7 @@
       \g__regex_thread_info_intarray
       { \c_one_int + #1 * (\l__regex_capturing_group_int * 2 + \c_one_int) }
       { (\c_one_int + #1) * (\l__regex_capturing_group_int * 2 + \c_one_int) }
-    ;
+    \__regex_sep:
   }
 \cs_new_protected:Npn \__regex_use_state:
   {
@@ -28223,7 +28262,7 @@
       \l__regex_curr_state_int
       { \__regex_int_eval:w \l__regex_step_int + \c_one_int \scan_stop: }
   }
-\cs_new_protected:Npn \__regex_use_state_and_submatches:w #1 , #2 ;
+\cs_new_protected:Npn \__regex_use_state_and_submatches:w #1 , #2 \__regex_sep:
   {
     \int_set:Nn \l__regex_curr_state_int {#1}
     \if_int_compare:w
@@ -28296,9 +28335,9 @@
 \cs_new_protected:Npn \__regex_action_submatch:nN #1#2
   {
     \exp_after:wN \__regex_action_submatch_aux:w
-    \l__regex_curr_submatches_tl ; {#1} #2
+    \l__regex_curr_submatches_tl \__regex_sep: {#1} #2
   }
-\cs_new_protected:Npn \__regex_action_submatch_aux:w #1 ; #2#3
+\cs_new_protected:Npn \__regex_action_submatch_aux:w #1 \__regex_sep: #2#3
   {
     \tl_set:Ne \l__regex_curr_submatches_tl
       {
@@ -28346,11 +28385,11 @@
 \cs_new:Npn \__regex_query_range:nn #1#2
   {
     \exp_after:wN \__regex_query_range_loop:ww
-    \int_value:w \__regex_int_eval:w #1 \exp_after:wN ;
-    \int_value:w \__regex_int_eval:w #2 ;
+    \int_value:w \__regex_int_eval:w #1 \exp_after:wN \__regex_sep:
+    \int_value:w \__regex_int_eval:w #2 \__regex_sep:
     \prg_break_point:
   }
-\cs_new:Npn \__regex_query_range_loop:ww #1 ; #2 ;
+\cs_new:Npn \__regex_query_range_loop:ww #1 \__regex_sep: #2 \__regex_sep:
   {
     \if_int_compare:w #1 < #2 \exp_stop_f:
     \else:
@@ -28358,7 +28397,7 @@
     \fi:
     \__regex_toks_use:w #1 \exp_stop_f:
     \exp_after:wN \__regex_query_range_loop:ww
-      \int_value:w \__regex_int_eval:w #1 + \c_one_int ; #2 ;
+      \int_value:w \__regex_int_eval:w #1 + \c_one_int \__regex_sep: #2 \__regex_sep:
   }
 \cs_new:Npn \__regex_query_submatch:n #1
   {
@@ -29069,9 +29108,9 @@
   {
     \__regex_tmp:w { }
     \exp_after:wN \__regex_extract_seq_aux:ww
-    \int_value:w \__regex_submatch_balance:n {#1} ; #1;
+    \int_value:w \__regex_submatch_balance:n {#1} \__regex_sep: #1 \__regex_sep:
   }
-\cs_new:Npn \__regex_extract_seq_aux:ww #1; #2;
+\cs_new:Npn \__regex_extract_seq_aux:ww #1 \__regex_sep: #2 \__regex_sep:
   {
     \if_int_compare:w #1 < \c_zero_int
       \prg_replicate:nn {-#1}
@@ -35016,6 +35055,7 @@
       { \__text_use_i_delimit_by_s_recursion_stop:nw }
       { \use_none:n }
   }
+\cs_new_eq:NN \__text_sep: \__kernel_int_sep:
 \group_begin:
   \char_set_catcode_active:n { 0 }
   \cs_new:Npn \__text_token_to_explicit:N #1
@@ -35088,10 +35128,10 @@
         \if_catcode:w A #1 11 \else:
         \if_catcode:w + #1 12 \else:
         4 \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi:
-    \exp_after:wN ;
+    \exp_after:wN \__text_sep:
     \token_to_meaning:N #1 \s__text_stop
   }
-\cs_new:Npn \__text_token_to_explicit_auxi:w #1 ; #2 \s__text_stop
+\cs_new:Npn \__text_token_to_explicit_auxi:w #1 \__text_sep: #2 \s__text_stop
   {
     \char_generate:nn
       {

Modified: trunk/Master/texmf-dist/tex/latex-dev/l3kernel/expl3-generic.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/l3kernel/expl3-generic.tex	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/tex/latex-dev/l3kernel/expl3-generic.tex	2025-04-29 19:46:22 UTC (rev 75056)
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx
-\def\ExplFileDate{2025-04-14}%
+\def\ExplFileDate{2025-04-29}%
 \let\ExplLoaderFileDate\ExplFileDate
 \begingroup
   \catcode`\_=11

Modified: trunk/Master/texmf-dist/tex/latex-dev/l3kernel/expl3.ltx
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/l3kernel/expl3.ltx	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/tex/latex-dev/l3kernel/expl3.ltx	2025-04-29 19:46:22 UTC (rev 75056)
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx
-\def\ExplFileDate{2025-04-14}%
+\def\ExplFileDate{2025-04-29}%
 \let\ExplLoaderFileDate\ExplFileDate
 \begingroup
   \catcode`\_=11

Modified: trunk/Master/texmf-dist/tex/latex-dev/l3kernel/expl3.lua
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/l3kernel/expl3.lua	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/tex/latex-dev/l3kernel/expl3.lua	2025-04-29 19:46:22 UTC (rev 75056)
@@ -65,7 +65,7 @@
 local token_create_safe
 do
   local is_defined = token.is_defined
-  local set_char   = token.set_char
+  local set_char   = token.set_char or tex.chardef
   local runtoks    = tex.runtoks
   local let_token  = token_create'let'
 

Modified: trunk/Master/texmf-dist/tex/latex-dev/l3kernel/expl3.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/l3kernel/expl3.sty	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/tex/latex-dev/l3kernel/expl3.sty	2025-04-29 19:46:22 UTC (rev 75056)
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx
-\def\ExplFileDate{2025-04-14}%
+\def\ExplFileDate{2025-04-29}%
 \let\ExplLoaderFileDate\ExplFileDate
 \ProvidesPackage{expl3}
   [%

Modified: trunk/Master/texmf-dist/tex/latex-dev/l3kernel/l3debug.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/l3kernel/l3debug.def	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/tex/latex-dev/l3kernel/l3debug.def	2025-04-29 19:46:22 UTC (rev 75056)
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: l3debug.dtx
-\ProvidesExplFile{l3debug.def}{2025-04-14}{}{L3 Debugging support}
+\ProvidesExplFile{l3debug.def}{2025-04-29}{}{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
@@ -1007,8 +1007,8 @@
         \skip_use:N \tex_glueexpr:D
           \__kernel_chk_expr:nNnN
             {##1} \tex_glueexpr:D { } \skip_if_finite:n
-        ; \prg_return_false:
-        #1 ; \prg_return_true: \s__skip_stop
+        \__skip_sep: \prg_return_false:
+        #1 \__skip_sep: \prg_return_true: \s__skip_stop
       }
   }
 \exp_args:No \__skip_tmp:w { \tl_to_str:n { fil } }

Modified: trunk/Master/texmf-dist/tex/latex-dev/l3kernel/l3doc.cls
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/l3kernel/l3doc.cls	2025-04-29 19:46:03 UTC (rev 75055)
+++ trunk/Master/texmf-dist/tex/latex-dev/l3kernel/l3doc.cls	2025-04-29 19:46:22 UTC (rev 75056)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3doc.dtx
 \RequirePackage{calc}
-\ProvidesExplClass{l3doc}{2025-04-14}{}
+\ProvidesExplClass{l3doc}{2025-04-29}{}
   {L3 Experimental documentation class}
 \clist_new:N \g_docinput_clist
 \seq_new:N \g_doc_functions_seq



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