summaryrefslogtreecommitdiff
path: root/macros/latex/contrib
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2023-11-02 03:04:13 +0000
committerNorbert Preining <norbert@preining.info>2023-11-02 03:04:13 +0000
commit2da66dea964ffa47d24f26081f2942a6e1ef1121 (patch)
tree74283568549892324b317485ab0a26dc23917afb /macros/latex/contrib
parenta9d0083bcc66de9ea863ed14cf8cde44e88e4355 (diff)
CTAN sync 202311020304
Diffstat (limited to 'macros/latex/contrib')
-rw-r--r--macros/latex/contrib/l3build/CHANGELOG.md12
-rw-r--r--macros/latex/contrib/l3build/README.md2
-rw-r--r--macros/latex/contrib/l3build/l3build-file-functions.lua8
-rw-r--r--macros/latex/contrib/l3build/l3build.12
-rw-r--r--macros/latex/contrib/l3build/l3build.dtx14
-rwxr-xr-xmacros/latex/contrib/l3build/l3build.lua2
-rw-r--r--macros/latex/contrib/l3build/l3build.pdfbin744760 -> 746427 bytes
-rw-r--r--macros/latex/contrib/l3experimental/CHANGELOG.md8
-rw-r--r--macros/latex/contrib/l3experimental/README.md2
-rw-r--r--macros/latex/contrib/l3experimental/l3benchmark.dtx6
-rw-r--r--macros/latex/contrib/l3experimental/l3benchmark.pdfbin308535 -> 308534 bytes
-rw-r--r--macros/latex/contrib/l3experimental/l3bitset.dtx4
-rw-r--r--macros/latex/contrib/l3experimental/l3bitset.pdfbin404408 -> 404410 bytes
-rw-r--r--macros/latex/contrib/l3experimental/l3draw-boxes.dtx2
-rw-r--r--macros/latex/contrib/l3experimental/l3draw-code.pdfbin679935 -> 681452 bytes
-rw-r--r--macros/latex/contrib/l3experimental/l3draw-layers.dtx2
-rw-r--r--macros/latex/contrib/l3experimental/l3draw-paths.dtx14
-rw-r--r--macros/latex/contrib/l3experimental/l3draw-points.dtx2
-rw-r--r--macros/latex/contrib/l3experimental/l3draw-scopes.dtx2
-rw-r--r--macros/latex/contrib/l3experimental/l3draw-softpath.dtx52
-rw-r--r--macros/latex/contrib/l3experimental/l3draw-state.dtx2
-rw-r--r--macros/latex/contrib/l3experimental/l3draw-transforms.dtx2
-rw-r--r--macros/latex/contrib/l3experimental/l3draw.dtx4
-rw-r--r--macros/latex/contrib/l3experimental/l3draw.pdfbin517831 -> 517829 bytes
-rw-r--r--macros/latex/contrib/l3experimental/l3galley.dtx4
-rw-r--r--macros/latex/contrib/l3experimental/l3galley.pdfbin408917 -> 408914 bytes
-rw-r--r--macros/latex/contrib/l3experimental/l3graphics.dtx4
-rw-r--r--macros/latex/contrib/l3experimental/l3graphics.pdfbin383648 -> 383641 bytes
-rw-r--r--macros/latex/contrib/l3experimental/l3opacity.dtx4
-rw-r--r--macros/latex/contrib/l3experimental/l3opacity.pdfbin313597 -> 313597 bytes
-rw-r--r--macros/latex/contrib/l3experimental/l3str-format.dtx6
-rw-r--r--macros/latex/contrib/l3experimental/l3str-format.pdfbin368030 -> 368029 bytes
-rw-r--r--macros/latex/contrib/l3experimental/l3sys-shell.dtx4
-rw-r--r--macros/latex/contrib/l3experimental/l3sys-shell.pdfbin348054 -> 348053 bytes
-rw-r--r--macros/latex/contrib/l3experimental/xcoffins.dtx6
-rw-r--r--macros/latex/contrib/l3experimental/xcoffins.pdfbin394481 -> 394481 bytes
-rw-r--r--macros/latex/contrib/l3experimental/xgalley.dtx4
-rw-r--r--macros/latex/contrib/l3experimental/xgalley.pdfbin299638 -> 299636 bytes
-rw-r--r--macros/latex/contrib/l3kernel/CHANGELOG.md31
-rw-r--r--macros/latex/contrib/l3kernel/README.md2
-rw-r--r--macros/latex/contrib/l3kernel/expl3.dtx14
-rw-r--r--macros/latex/contrib/l3kernel/expl3.pdfbin622183 -> 623137 bytes
-rw-r--r--macros/latex/contrib/l3kernel/interface3.pdfbin1732906 -> 1766132 bytes
-rw-r--r--macros/latex/contrib/l3kernel/interface3.tex2
-rw-r--r--macros/latex/contrib/l3kernel/l3.ins1
-rw-r--r--macros/latex/contrib/l3kernel/l3basics.dtx75
-rw-r--r--macros/latex/contrib/l3kernel/l3bootstrap.dtx17
-rw-r--r--macros/latex/contrib/l3kernel/l3box.dtx4
-rw-r--r--macros/latex/contrib/l3kernel/l3candidates.dtx261
-rw-r--r--macros/latex/contrib/l3kernel/l3cctab.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3clist.dtx26
-rw-r--r--macros/latex/contrib/l3kernel/l3coffins.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3color.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3debug.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3deprecation.dtx22
-rw-r--r--macros/latex/contrib/l3kernel/l3doc.dtx14
-rw-r--r--macros/latex/contrib/l3kernel/l3doc.pdfbin557935 -> 557934 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3docstrip.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3docstrip.pdfbin151749 -> 151750 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3expan.dtx47
-rw-r--r--macros/latex/contrib/l3kernel/l3file.dtx14
-rw-r--r--macros/latex/contrib/l3kernel/l3flag.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-assign.dtx87
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-aux.dtx9
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-basics.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-convert.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-expo.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-extended.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-functions.dtx24
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-logic.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-parse.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-random.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-round.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-symbolic.dtx101
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-traps.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-trig.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-types.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp.dtx17
-rw-r--r--macros/latex/contrib/l3kernel/l3fparray.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3int.dtx4
-rw-r--r--macros/latex/contrib/l3kernel/l3intarray.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3kernel-functions.dtx4
-rw-r--r--macros/latex/contrib/l3kernel/l3keys.dtx10
-rw-r--r--macros/latex/contrib/l3kernel/l3legacy.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3luatex.dtx5
-rw-r--r--macros/latex/contrib/l3kernel/l3msg.dtx6
-rw-r--r--macros/latex/contrib/l3kernel/l3names.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3news.pdfbin396222 -> 396222 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news01.pdfbin122959 -> 122959 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news02.pdfbin150919 -> 150919 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news03.pdfbin148747 -> 148747 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news04.pdfbin114754 -> 114754 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news05.pdfbin112524 -> 112524 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news06.pdfbin151591 -> 151591 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news07.pdfbin128344 -> 128344 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news08.pdfbin163484 -> 163484 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news09.pdfbin250159 -> 250159 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news10.pdfbin150302 -> 150302 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news11.pdfbin170102 -> 170102 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news12.pdfbin205020 -> 205020 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3pdf.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3prefixes.csv1
-rw-r--r--macros/latex/contrib/l3kernel/l3prefixes.pdfbin82661 -> 82683 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3prg.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3prop.dtx10
-rw-r--r--macros/latex/contrib/l3kernel/l3quark.dtx4
-rw-r--r--macros/latex/contrib/l3kernel/l3regex.dtx54
-rw-r--r--macros/latex/contrib/l3kernel/l3seq.dtx66
-rw-r--r--macros/latex/contrib/l3kernel/l3skip.dtx6
-rw-r--r--macros/latex/contrib/l3kernel/l3sort.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3str-convert.dtx8
-rw-r--r--macros/latex/contrib/l3kernel/l3str.dtx6
-rw-r--r--macros/latex/contrib/l3kernel/l3styleguide.pdfbin296258 -> 296258 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3styleguide.tex2
-rw-r--r--macros/latex/contrib/l3kernel/l3syntax-changes.pdfbin242903 -> 242903 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3syntax-changes.tex2
-rw-r--r--macros/latex/contrib/l3kernel/l3sys.dtx7
-rw-r--r--macros/latex/contrib/l3kernel/l3term-glossary.pdfbin218059 -> 218059 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3term-glossary.tex2
-rw-r--r--macros/latex/contrib/l3kernel/l3text-case.dtx43
-rw-r--r--macros/latex/contrib/l3kernel/l3text-map.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3text-purify.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3text.dtx15
-rw-r--r--macros/latex/contrib/l3kernel/l3tl-analysis.dtx24
-rw-r--r--macros/latex/contrib/l3kernel/l3tl-build.dtx329
-rw-r--r--macros/latex/contrib/l3kernel/l3tl.dtx44
-rw-r--r--macros/latex/contrib/l3kernel/l3token.dtx12
-rw-r--r--macros/latex/contrib/l3kernel/l3unicode.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/source3.pdfbin7475976 -> 7490669 bytes
-rw-r--r--macros/latex/contrib/l3kernel/source3.tex2
-rw-r--r--macros/latex/contrib/l3kernel/source3body.tex1
-rw-r--r--macros/latex/contrib/profmaquette/doc/TestCAN.pdfbin0 -> 20353 bytes
-rw-r--r--macros/latex/contrib/profmaquette/doc/TestCAN.tex27
-rw-r--r--macros/latex/contrib/profmaquette/doc/TestCANComplement.pdfbin0 -> 21506 bytes
-rw-r--r--macros/latex/contrib/profmaquette/doc/TestCANComplement.tex31
-rw-r--r--macros/latex/contrib/profmaquette/doc/profmaquette-doc.pdfbin203416 -> 241332 bytes
-rw-r--r--macros/latex/contrib/profmaquette/doc/profmaquette-doc.tex102
-rw-r--r--macros/latex/contrib/profmaquette/latex/ProfMaquette.sty337
138 files changed, 1385 insertions, 775 deletions
diff --git a/macros/latex/contrib/l3build/CHANGELOG.md b/macros/latex/contrib/l3build/CHANGELOG.md
index f0af1e3c8c..6b6e1c7f16 100644
--- a/macros/latex/contrib/l3build/CHANGELOG.md
+++ b/macros/latex/contrib/l3build/CHANGELOG.md
@@ -7,6 +7,15 @@ this project uses date-based 'snapshot' version identifiers.
## [Unreleased]
+## [2023-11-01]
+
+### Changed
+- Drop duplicate backslashes in doc
+
+### Fixed
+- Support non-ASCII filenames that fall within the system codepage on Windows
+ (see \#122)
+
## [2023-09-13]
### Added
@@ -712,7 +721,8 @@ this project uses date-based 'snapshot' version identifiers.
- Rationalise short option names: removed `-d`, `-E`, `-r`
- Target `cmdcheck`: specific to LaTeX kernel work
-[Unreleased]: https://github.com/latex3/l3build/compare/2023-09-13...HEAD
+[Unreleased]: https://github.com/latex3/l3build/compare/2023-11-01...HEAD
+[2023-11-01]: https://github.com/latex3/l3build/compare/2023-09-13...2023-11-01
[2023-09-13]: https://github.com/latex3/l3build/compare/2023-09-07...2023-09-13
[2023-09-07]: https://github.com/latex3/l3build/compare/2023-09-05...2023-09-07
[2023-09-05]: https://github.com/latex3/l3build/compare/2023-07-20...2023-09-05
diff --git a/macros/latex/contrib/l3build/README.md b/macros/latex/contrib/l3build/README.md
index 0b7cfe9f97..7288867655 100644
--- a/macros/latex/contrib/l3build/README.md
+++ b/macros/latex/contrib/l3build/README.md
@@ -1,7 +1,7 @@
l3build: a testing and building system for LaTeX
=================================================
-Release 2023-09-13
+Release 2023-11-01
Overview
--------
diff --git a/macros/latex/contrib/l3build/l3build-file-functions.lua b/macros/latex/contrib/l3build/l3build-file-functions.lua
index d6ec0cd513..847a1d15e6 100644
--- a/macros/latex/contrib/l3build/l3build-file-functions.lua
+++ b/macros/latex/contrib/l3build/l3build-file-functions.lua
@@ -153,9 +153,15 @@ if os_type == "windows" then
os_yes = "for /l %I in (1,1,300) do @echo y"
end
+-- Deal with codepage hell on Windows
+local function fixname(f) return f end
+if chgstrcp then
+ fixname = chgstrcp.utf8tosyscp
+end
+
-- Deal with the fact that Windows and Unix use different path separators
local function unix_to_win(path)
- return gsub(path, "/", "\\")
+ return fixname(gsub(path, "/", "\\"))
end
function normalize_path(path)
diff --git a/macros/latex/contrib/l3build/l3build.1 b/macros/latex/contrib/l3build/l3build.1
index fbf4b84fda..0ff6254515 100644
--- a/macros/latex/contrib/l3build/l3build.1
+++ b/macros/latex/contrib/l3build/l3build.1
@@ -1,4 +1,4 @@
-.TH l3build 1 "2023-09-13"
+.TH l3build 1 "2023-11-01"
.SH NAME
l3build \- Checking and building packages
.SH SYNOPSIS
diff --git a/macros/latex/contrib/l3build/l3build.dtx b/macros/latex/contrib/l3build/l3build.dtx
index b6787a1044..e425786e03 100644
--- a/macros/latex/contrib/l3build/l3build.dtx
+++ b/macros/latex/contrib/l3build/l3build.dtx
@@ -251,7 +251,7 @@
% }^^A
% }
%
-% \date{Released 2023-09-13}
+% \date{Released 2023-11-01}
%
% \maketitle
% \tableofcontents
@@ -529,7 +529,7 @@
% If the compilation is successful the |.pdf| is moved back into the main directory.
%
% The documentation compilation is performed with the \var{typesetexe} binary (default \texttt{pdflatex}), with options \var{typesetopts}.
-% Additional \TeX{} material defined in \var{typesetcmds} is passed to the document (e.g., for writing |\\PassOptionsToClass{l3doc}{letterpaper}|, and so on---note that backslashes need to be escaped in Lua strings).
+% Additional \TeX{} material defined in \var{typesetcmds} is passed to the document (e.g., for writing |\PassOptionsToClass{l3doc}{letterpaper}|, and so on---note that backslashes need to be escaped in Lua strings).
%
% Files that match |typesetsuppfiles| in the |support| directory (|supportdir|) are copied into the |build/doc| directory (|typesetdir|) for the typesetting compilation process.
% Additional dependencies listed in the \var{typesetdeps} variable (empty by default) will also be installed.
@@ -1819,7 +1819,7 @@
% |normalize_path(|\meta{path}|)|
% \end{syntax}
% When called on Windows, returns a string comprising the \meta{path} with
-% |/| characters replaced by |\\|. In other cases returns the path unchanged.
+% |/| characters replaced by |\|. In other cases returns the path unchanged.
% \end{function}
%
% \subsection{System-dependent strings}
@@ -2141,6 +2141,14 @@
% Full descriptions of their usage and arguments can be found within the |l3build-manifest-setup.lua|
% code itself.
%
+% \section{Known limitations}
+%
+% \subsection{Non-\textsc{ascii} filenames}
+%
+% On Windows, support for non-\textsc{ascii} filenames is limited by the way
+% that Lua handles system calls. While calling \TeX{} engines should work with
+% any name, general file operations will only success if the filename falls
+% within the codepage currently in use by the operating system.
%
% \end{documentation}
%
diff --git a/macros/latex/contrib/l3build/l3build.lua b/macros/latex/contrib/l3build/l3build.lua
index e520cd1811..cf8f66cc1f 100755
--- a/macros/latex/contrib/l3build/l3build.lua
+++ b/macros/latex/contrib/l3build/l3build.lua
@@ -25,7 +25,7 @@ for those people who are interested.
--]]
-- Version information
-release_date = "2023-09-13"
+release_date = "2023-11-01"
-- File operations are aided by the LuaFileSystem module
local lfs = require("lfs")
diff --git a/macros/latex/contrib/l3build/l3build.pdf b/macros/latex/contrib/l3build/l3build.pdf
index 4e7c03759d..fdd536d4ac 100644
--- a/macros/latex/contrib/l3build/l3build.pdf
+++ b/macros/latex/contrib/l3build/l3build.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/CHANGELOG.md b/macros/latex/contrib/l3experimental/CHANGELOG.md
index 7befc1cdf8..7d3becf388 100644
--- a/macros/latex/contrib/l3experimental/CHANGELOG.md
+++ b/macros/latex/contrib/l3experimental/CHANGELOG.md
@@ -7,6 +7,11 @@ this project uses date-based 'snapshot' version identifiers.
## [Unreleased]
+## [2023-11-01]
+
+### Changed
+- Track `expl3` core changes
+
## [2023-10-10]
### Changed
@@ -281,7 +286,8 @@ this project uses date-based 'snapshot' version identifiers.
- New `l3color` module using `xcolor`-like expression syntax
- New `l3draw` module, based on `pgf` layer of the TikZ system
-[Unreleased]: https://github.com/latex3/latex3/compare/2023-10-10...HEAD
+[Unreleased]: https://github.com/latex3/latex3/compare/2023-11-01...HEAD
+[2023-11-01]: https://github.com/latex3/latex3/compare/2023-10-10...2023-11-01
[2023-10-10]: https://github.com/latex3/latex3/compare/2023-05-11...2023-10-10
[2023-05-11]: https://github.com/latex3/latex3/compare/2023-04-19...2023-05-11
[2023-04-19]: https://github.com/latex3/latex3/compare/2023-03-30...2023-04-19
diff --git a/macros/latex/contrib/l3experimental/README.md b/macros/latex/contrib/l3experimental/README.md
index f78ecff28a..138d797530 100644
--- a/macros/latex/contrib/l3experimental/README.md
+++ b/macros/latex/contrib/l3experimental/README.md
@@ -1,7 +1,7 @@
Experimental LaTeX3 Concepts
============================
-Release 2023-10-10
+Release 2023-11-01
Overview
--------
diff --git a/macros/latex/contrib/l3experimental/l3benchmark.dtx b/macros/latex/contrib/l3experimental/l3benchmark.dtx
index cd41c2103e..26feb420ab 100644
--- a/macros/latex/contrib/l3experimental/l3benchmark.dtx
+++ b/macros/latex/contrib/l3experimental/l3benchmark.dtx
@@ -2,7 +2,7 @@
%
%% File: l3benchmark.dtx
%
-% Copyright (C) 2011,2012,2014-2023 The LaTeX Project
+% Copyright (C) 2011-2023 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -46,7 +46,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-10}
+% \date{Released 2023-11-01}
%
% \maketitle
%
@@ -122,7 +122,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{l3benchmark}{2023-10-10}{}
+\ProvidesExplPackage{l3benchmark}{2023-11-01}{}
{L3 Experimental benchmarking}
% \end{macrocode}
%
diff --git a/macros/latex/contrib/l3experimental/l3benchmark.pdf b/macros/latex/contrib/l3experimental/l3benchmark.pdf
index a4f0054473..382968cbf2 100644
--- a/macros/latex/contrib/l3experimental/l3benchmark.pdf
+++ b/macros/latex/contrib/l3experimental/l3benchmark.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/l3bitset.dtx b/macros/latex/contrib/l3experimental/l3bitset.dtx
index 6d342b0955..4783bd7786 100644
--- a/macros/latex/contrib/l3experimental/l3bitset.dtx
+++ b/macros/latex/contrib/l3experimental/l3bitset.dtx
@@ -42,7 +42,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-10}
+% \date{Released 2023-11-01}
%
% \maketitle
% \begin{documentation}
@@ -264,7 +264,7 @@
%<@@=bitset>
% \end{macrocode}
% \begin{macrocode}
-\ProvidesExplPackage{l3bitset}{2023-10-10}{}
+\ProvidesExplPackage{l3bitset}{2023-11-01}{}
{L3 Experimental bitset support}
% \end{macrocode}
% A bitset is a string variable.
diff --git a/macros/latex/contrib/l3experimental/l3bitset.pdf b/macros/latex/contrib/l3experimental/l3bitset.pdf
index 095a3dd391..17b59d8a2b 100644
--- a/macros/latex/contrib/l3experimental/l3bitset.pdf
+++ b/macros/latex/contrib/l3experimental/l3bitset.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/l3draw-boxes.dtx b/macros/latex/contrib/l3experimental/l3draw-boxes.dtx
index b48aa9d995..44989999a5 100644
--- a/macros/latex/contrib/l3experimental/l3draw-boxes.dtx
+++ b/macros/latex/contrib/l3experimental/l3draw-boxes.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-10}
+% \date{Released 2023-11-01}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3experimental/l3draw-code.pdf b/macros/latex/contrib/l3experimental/l3draw-code.pdf
index 9e5404c221..8c79d0a1b7 100644
--- a/macros/latex/contrib/l3experimental/l3draw-code.pdf
+++ b/macros/latex/contrib/l3experimental/l3draw-code.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/l3draw-layers.dtx b/macros/latex/contrib/l3experimental/l3draw-layers.dtx
index e85f370c34..1337427dc2 100644
--- a/macros/latex/contrib/l3experimental/l3draw-layers.dtx
+++ b/macros/latex/contrib/l3experimental/l3draw-layers.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-10}
+% \date{Released 2023-11-01}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3experimental/l3draw-paths.dtx b/macros/latex/contrib/l3experimental/l3draw-paths.dtx
index 41e866e563..5d8b63247f 100644
--- a/macros/latex/contrib/l3experimental/l3draw-paths.dtx
+++ b/macros/latex/contrib/l3experimental/l3draw-paths.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-10}
+% \date{Released 2023-11-01}
%
% \maketitle
%
@@ -999,19 +999,11 @@
\dim_set_eq:NN \l_@@_softpath_lastx_dim \g_@@_softpath_lastx_dim
\dim_set_eq:NN \l_@@_softpath_lasty_dim \g_@@_softpath_lasty_dim
\@@_path_reset_limits:
- \tl_build_get:NN \g_@@_softpath_main_tl \l_@@_softpath_main_tl
- \bool_set_eq:NN
- \l_@@_softpath_corners_bool
- \g_@@_softpath_corners_bool
- \@@_softpath_clear:
+ \@@_softpath_save:
}
\cs_new_protected:Npn \draw_path_scope_end:
{
- \@@_softpath_clear:
- \bool_gset_eq:NN
- \g_@@_softpath_corners_bool
- \l_@@_softpath_corners_bool
- \@@_softpath_add:o \l_@@_softpath_main_tl
+ \@@_softpath_restore:
\dim_gset_eq:NN \g_@@_softpath_lastx_dim \l_@@_softpath_lastx_dim
\dim_gset_eq:NN \g_@@_softpath_lasty_dim \l_@@_softpath_lasty_dim
\dim_gset_eq:NN \g_@@_path_xmax_dim \l_@@_path_xmax_dim
diff --git a/macros/latex/contrib/l3experimental/l3draw-points.dtx b/macros/latex/contrib/l3experimental/l3draw-points.dtx
index 044f01a374..ba47cddd4c 100644
--- a/macros/latex/contrib/l3experimental/l3draw-points.dtx
+++ b/macros/latex/contrib/l3experimental/l3draw-points.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-10}
+% \date{Released 2023-11-01}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3experimental/l3draw-scopes.dtx b/macros/latex/contrib/l3experimental/l3draw-scopes.dtx
index 4017e46f17..5917a0c6bc 100644
--- a/macros/latex/contrib/l3experimental/l3draw-scopes.dtx
+++ b/macros/latex/contrib/l3experimental/l3draw-scopes.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-10}
+% \date{Released 2023-11-01}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3experimental/l3draw-softpath.dtx b/macros/latex/contrib/l3experimental/l3draw-softpath.dtx
index 44524fb17b..9419015a91 100644
--- a/macros/latex/contrib/l3experimental/l3draw-softpath.dtx
+++ b/macros/latex/contrib/l3experimental/l3draw-softpath.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-10}
+% \date{Released 2023-11-01}
%
% \maketitle
%
@@ -82,10 +82,10 @@
% \end{macrocode}
% \end{variable}
%
-% \begin{variable}{\l_@@_softpath_internal_tl}
-% The soft path itself.
+% \begin{variable}{\l_@@_softpath_tmp_tl}
+% Scratch space.
% \begin{macrocode}
-\tl_new:N \l_@@_softpath_internal_tl
+\tl_new:N \l_@@_softpath_tmp_tl
% \end{macrocode}
% \end{variable}
%
@@ -104,23 +104,51 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}
-% {\@@_softpath_use:, \@@_softpath_clear:}
+% \begin{macro}{\@@_softpath_use:, \@@_softpath_clear:}
% Using and clearing is trivial.
% \begin{macrocode}
\cs_new_protected:Npn \@@_softpath_use:
{
- \tl_build_get:NN \g_@@_softpath_main_tl \l_@@_softpath_internal_tl
- \l_@@_softpath_internal_tl
+ \tl_build_gend:N \g_@@_softpath_main_tl
+ \tl_set_eq:NN \l_@@_softpath_tmp_tl \g_@@_softpath_main_tl
+ \l_@@_softpath_tmp_tl
+ \tl_build_gbegin:N \g_@@_softpath_main_tl
+ \exp_args:NNV \tl_build_gput_right:Nn
+ \g_@@_softpath_main_tl \l_@@_softpath_tmp_tl
}
\cs_new_protected:Npn \@@_softpath_clear:
{
- \tl_build_gclear:N \g_@@_softpath_main_tl
+ \tl_build_gbegin:N \g_@@_softpath_main_tl
\bool_gset_false:N \g_@@_softpath_corners_bool
}
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\@@_softpath_save:, \@@_softpath_restore:}
+% Abstracted ideas to keep variables inside this submodule.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_softpath_save:
+ {
+ \tl_build_gend:N \g_@@_softpath_main_tl
+ \tl_set_eq:NN
+ \l_@@_softpath_main_tl
+ \g_@@_softpath_main_tl
+ \bool_set_eq:NN
+ \l_@@_softpath_corners_bool
+ \g_@@_softpath_corners_bool
+ \@@_softpath_clear:
+ }
+\cs_new_protected:Npn \@@_softpath_restore:
+ {
+ \@@_softpath_clear:
+ \@@_softpath_add:o \l_@@_softpath_main_tl
+ \bool_gset_eq:NN
+ \g_@@_softpath_corners_bool
+ \l_@@_softpath_corners_bool
+ }
+% \end{macrocode}
+% \end{macro}
+%
% \begin{variable}{\g_@@_softpath_lastx_dim, \g_@@_softpath_lasty_dim}
% For tracking the end of the path (to close it).
% \begin{macrocode}
@@ -323,9 +351,9 @@
\fp_zero:N \l_@@_softpath_lasty_fp
\tl_clear:N \l_@@_softpath_first_tl
\tl_clear:N \l_@@_softpath_move_tl
- \tl_build_get:NN \g_@@_softpath_main_tl \l_@@_softpath_internal_tl
+ \tl_build_gend:N \g_@@_softpath_main_tl
\exp_after:wN \@@_softpath_round_loop:Nnn
- \l_@@_softpath_internal_tl
+ \g_@@_softpath_main_tl
\q_@@_recursion_tail ? ?
\q_@@_recursion_stop
\group_end:
@@ -587,7 +615,7 @@
\l_@@_softpath_move_tl
\tl_put_right:No \l_@@_softpath_main_tl
\l_@@_softpath_part_tl
- \tl_build_gclear:N \g_@@_softpath_main_tl
+ \tl_build_gbegin:N \g_@@_softpath_main_tl
\@@_softpath_add:o \l_@@_softpath_main_tl
}
% \end{macrocode}
diff --git a/macros/latex/contrib/l3experimental/l3draw-state.dtx b/macros/latex/contrib/l3experimental/l3draw-state.dtx
index e1a67309e2..36b30cdecc 100644
--- a/macros/latex/contrib/l3experimental/l3draw-state.dtx
+++ b/macros/latex/contrib/l3experimental/l3draw-state.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-10}
+% \date{Released 2023-11-01}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3experimental/l3draw-transforms.dtx b/macros/latex/contrib/l3experimental/l3draw-transforms.dtx
index 35b31395db..31d8b95ea2 100644
--- a/macros/latex/contrib/l3experimental/l3draw-transforms.dtx
+++ b/macros/latex/contrib/l3experimental/l3draw-transforms.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-10}
+% \date{Released 2023-11-01}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3experimental/l3draw.dtx b/macros/latex/contrib/l3experimental/l3draw.dtx
index d1e604d42d..8f0467519c 100644
--- a/macros/latex/contrib/l3experimental/l3draw.dtx
+++ b/macros/latex/contrib/l3experimental/l3draw.dtx
@@ -110,7 +110,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-10}
+% \date{Released 2023-11-01}
%
% \maketitle
%
@@ -1173,7 +1173,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{l3draw}{2023-10-10}{}
+\ProvidesExplPackage{l3draw}{2023-11-01}{}
{L3 Experimental core drawing support}
% \end{macrocode}
%
diff --git a/macros/latex/contrib/l3experimental/l3draw.pdf b/macros/latex/contrib/l3experimental/l3draw.pdf
index 485b4ded36..583e37966b 100644
--- a/macros/latex/contrib/l3experimental/l3draw.pdf
+++ b/macros/latex/contrib/l3experimental/l3draw.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/l3galley.dtx b/macros/latex/contrib/l3experimental/l3galley.dtx
index 7272d8625e..7aaf367785 100644
--- a/macros/latex/contrib/l3experimental/l3galley.dtx
+++ b/macros/latex/contrib/l3experimental/l3galley.dtx
@@ -61,7 +61,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-10}
+% \date{Released 2023-11-01}
%
% \maketitle
%
@@ -686,7 +686,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{l3galley}{2023-10-10}{}
+\ProvidesExplPackage{l3galley}{2023-11-01}{}
{L3 Experimental galley code}
% \end{macrocode}
%
diff --git a/macros/latex/contrib/l3experimental/l3galley.pdf b/macros/latex/contrib/l3experimental/l3galley.pdf
index 3ba577c159..f4f6d46e8c 100644
--- a/macros/latex/contrib/l3experimental/l3galley.pdf
+++ b/macros/latex/contrib/l3experimental/l3galley.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/l3graphics.dtx b/macros/latex/contrib/l3experimental/l3graphics.dtx
index 0266b711fa..ebb4f86a2c 100644
--- a/macros/latex/contrib/l3experimental/l3graphics.dtx
+++ b/macros/latex/contrib/l3experimental/l3graphics.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-10}
+% \date{Released 2023-11-01}
%
% \maketitle
%
@@ -184,7 +184,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{l3graphics}{2023-10-10}{}
+\ProvidesExplPackage{l3graphics}{2023-11-01}{}
{L3 Experimental graphics inclusion support}
% \end{macrocode}
%
diff --git a/macros/latex/contrib/l3experimental/l3graphics.pdf b/macros/latex/contrib/l3experimental/l3graphics.pdf
index dd86d0bd76..52daaf7cb6 100644
--- a/macros/latex/contrib/l3experimental/l3graphics.pdf
+++ b/macros/latex/contrib/l3experimental/l3graphics.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/l3opacity.dtx b/macros/latex/contrib/l3experimental/l3opacity.dtx
index 3fce2c27d1..1bb27e2ca3 100644
--- a/macros/latex/contrib/l3experimental/l3opacity.dtx
+++ b/macros/latex/contrib/l3experimental/l3opacity.dtx
@@ -46,7 +46,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-10}
+% \date{Released 2023-11-01}
%
% \maketitle
%
@@ -96,7 +96,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{l3opacity}{2023-10-10}{}
+\ProvidesExplPackage{l3opacity}{2023-11-01}{}
{L3 Experimental opacity support}
% \end{macrocode}
%
diff --git a/macros/latex/contrib/l3experimental/l3opacity.pdf b/macros/latex/contrib/l3experimental/l3opacity.pdf
index bd73f200d5..4f871a2bcb 100644
--- a/macros/latex/contrib/l3experimental/l3opacity.pdf
+++ b/macros/latex/contrib/l3experimental/l3opacity.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/l3str-format.dtx b/macros/latex/contrib/l3experimental/l3str-format.dtx
index 10ccfb2f79..57aebd6296 100644
--- a/macros/latex/contrib/l3experimental/l3str-format.dtx
+++ b/macros/latex/contrib/l3experimental/l3str-format.dtx
@@ -48,7 +48,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-10}
+% \date{Released 2023-11-01}
%
% \maketitle
%
@@ -123,7 +123,7 @@
%
% \begin{function}[EXP]{\fp_format:nn}
% \begin{syntax}
-% \cs{fp_format:nn} \Arg{fpexpr} \Arg{format specification}
+% \cs{fp_format:nn} \Arg{fp expr} \Arg{format specification}
% \end{syntax}
% Evaluates the \meta{floating point expression} and converts the
% result to a string according to the \meta{format specification}.
@@ -166,7 +166,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{l3str-format}{2023-10-10}{}
+\ProvidesExplPackage{l3str-format}{2023-11-01}{}
{L3 Experimental string formatting}
% \end{macrocode}
%
diff --git a/macros/latex/contrib/l3experimental/l3str-format.pdf b/macros/latex/contrib/l3experimental/l3str-format.pdf
index dbc0058ace..9a8715c64f 100644
--- a/macros/latex/contrib/l3experimental/l3str-format.pdf
+++ b/macros/latex/contrib/l3experimental/l3str-format.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/l3sys-shell.dtx b/macros/latex/contrib/l3experimental/l3sys-shell.dtx
index 0cc622dbbb..c17d9a97b1 100644
--- a/macros/latex/contrib/l3experimental/l3sys-shell.dtx
+++ b/macros/latex/contrib/l3experimental/l3sys-shell.dtx
@@ -46,7 +46,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-10}
+% \date{Released 2023-11-01}
%
% \maketitle
%
@@ -151,7 +151,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{l3sys-shell}{2023-10-10}{}
+\ProvidesExplPackage{l3sys-shell}{2023-11-01}{}
{L3 Experimental system shell functions}
% \end{macrocode}
%
diff --git a/macros/latex/contrib/l3experimental/l3sys-shell.pdf b/macros/latex/contrib/l3experimental/l3sys-shell.pdf
index 2416721b43..201397cbd6 100644
--- a/macros/latex/contrib/l3experimental/l3sys-shell.pdf
+++ b/macros/latex/contrib/l3experimental/l3sys-shell.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/xcoffins.dtx b/macros/latex/contrib/l3experimental/xcoffins.dtx
index 8e8a9f0ca1..2dc6cffa6a 100644
--- a/macros/latex/contrib/l3experimental/xcoffins.dtx
+++ b/macros/latex/contrib/l3experimental/xcoffins.dtx
@@ -2,7 +2,7 @@
%
%% File: xcoffins.dtx
%
-% Copyright (C) 2010-2012,2014,2016-2023 The LaTeX Project
+% Copyright (C) 2010-2023 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -53,7 +53,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-10}
+% \date{Released 2023-11-01}
%
% \maketitle
%
@@ -672,7 +672,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{xcoffins}{2023-10-10}{}
+\ProvidesExplPackage{xcoffins}{2023-11-01}{}
{L3 Experimental design level coffins}
% \end{macrocode}
%
diff --git a/macros/latex/contrib/l3experimental/xcoffins.pdf b/macros/latex/contrib/l3experimental/xcoffins.pdf
index 4e7d4f9a57..b10dcf8453 100644
--- a/macros/latex/contrib/l3experimental/xcoffins.pdf
+++ b/macros/latex/contrib/l3experimental/xcoffins.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/xgalley.dtx b/macros/latex/contrib/l3experimental/xgalley.dtx
index abda67cc7e..3dd89b46e8 100644
--- a/macros/latex/contrib/l3experimental/xgalley.dtx
+++ b/macros/latex/contrib/l3experimental/xgalley.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-10}
+% \date{Released 2023-11-01}
%
% \maketitle
%
@@ -731,7 +731,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{xgalley}{2023-10-10}{}
+\ProvidesExplPackage{xgalley}{2023-11-01}{}
{L3 Experimental galley}
\RequirePackage{xtemplate,l3galley}
% \end{macrocode}
diff --git a/macros/latex/contrib/l3experimental/xgalley.pdf b/macros/latex/contrib/l3experimental/xgalley.pdf
index eacea34401..9aeb6d4e19 100644
--- a/macros/latex/contrib/l3experimental/xgalley.pdf
+++ b/macros/latex/contrib/l3experimental/xgalley.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/CHANGELOG.md b/macros/latex/contrib/l3kernel/CHANGELOG.md
index 919e6779b6..43a783d0b7 100644
--- a/macros/latex/contrib/l3kernel/CHANGELOG.md
+++ b/macros/latex/contrib/l3kernel/CHANGELOG.md
@@ -7,6 +7,29 @@ this project uses date-based 'snapshot' version identifiers.
## [Unreleased]
+## [2023-11-01]
+
+### Added
+- `\seq_(g)set_map_e:NNn`
+- Documentation for `\ExplLoaderFileDate` in `expl3.pdf`
+
+### Changed
+- Documentation improvements
+- Refine action of `\text_titlecase_first:n(n)` to be focussed strictly on
+ first (relevant) codepoint in the input
+- Standardize "This is the (e)TeX primitive ..." in `texnote` in documentation
+- Move `\tl_build_(g)begin:N`, `\tl_build_(g)end:N`, `\tl_build_(g)put_left:Nn`
+ and `\tl_build_(g)right:Nn` to stable status
+
+### Deprecated
+- `\seq_(g)set_map_x:NNn` in favor of `e`-type naming
+
+### Fixed
+- `\fp_clear_variable:n` should act locally (issue \#1298)
+- `\fp_clear_function:n` should act locally and correctly
+- Support for `\fp_show:N` showing symbolic expressions (issue \#1301)
+- Undefined `\str_case:en(TF)` (excluding `\str_case:en`)
+
## [2023-10-23]
### Added
@@ -18,11 +41,12 @@ this project uses date-based 'snapshot' version identifiers.
`\fp_new_function:n`, `\fp_set_function:nnn` and `\fp_clear_function:n`
### Changed
-- Refine action of `\text_titlecase_first:n(n)` to be focussed strictly on
- first (relevant) codepoint in the input
+- Clarify action of `\text_titlecase_first:n(n)`
+- Detect letters for titlecasing based on Unicode general category
### Deprecated
- `\text_titlecase:n(n)` as ambiguous: replaced by `\text_titlecase_all:n(n)`
+- `\tl_build_(g)clear:N` in favour of `\tl_build_(g)begin:N`
### Fixed
- Support arbitrary BCP-47 locales for case-changing overrides (issue \#1239)
@@ -1558,7 +1582,8 @@ this project uses date-based 'snapshot' version identifiers.
- Step functions have been added for dim variables,
e.g. `\dim_step_inline:nnnn`
-[Unreleased]: https://github.com/latex3/latex3/compare/2023-10-23...HEAD
+[Unreleased]: https://github.com/latex3/latex3/compare/2023-11-01...HEAD
+[2023-11-01]: https://github.com/latex3/latex3/compare/2023-10-23...2023-11-01
[2023-10-23]: https://github.com/latex3/latex3/compare/2023-10-10...2023-10-23
[2023-10-10]: https://github.com/latex3/latex3/compare/2023-08-29...2023-10-10
[2023-08-29]: https://github.com/latex3/latex3/compare/2023-08-11...2023-08-29
diff --git a/macros/latex/contrib/l3kernel/README.md b/macros/latex/contrib/l3kernel/README.md
index 5f52ac444b..559fcaf4ae 100644
--- a/macros/latex/contrib/l3kernel/README.md
+++ b/macros/latex/contrib/l3kernel/README.md
@@ -1,7 +1,7 @@
LaTeX3 Programming Conventions
==============================
-Release 2023-10-23
+Release 2023-11-01
Overview
--------
diff --git a/macros/latex/contrib/l3kernel/expl3.dtx b/macros/latex/contrib/l3kernel/expl3.dtx
index 09e21e4710..bf5bc9e46f 100644
--- a/macros/latex/contrib/l3kernel/expl3.dtx
+++ b/macros/latex/contrib/l3kernel/expl3.dtx
@@ -24,7 +24,7 @@
%
%<*driver|generic|package|2ekernel>
%</driver|generic|package|2ekernel>
-\def\ExplFileDate{2023-10-23}%
+\def\ExplFileDate{2023-11-01}%
%<*driver>
\documentclass[full]{l3doc}
\usepackage{graphicx}
@@ -51,7 +51,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
@@ -958,6 +958,16 @@
% loadable: package loading is dependent on the \LaTeXe{} package-management
% mechanism.
%
+% \section{Getting the version of \pkg{expl3}}
+%
+% \begin{function}{\ExplLoaderFileDate}
+% Once the programming layer is loaded by one of the loaders, you can access
+% its version in the ISO date format \meta{year}-\meta{month}-\meta{day},
+% through \cs{ExplLoaderFileDate}.
+%
+% The current version of \pkg{expl3} is \ExplLoaderFileDate.
+% \end{function}
+%
% \section{Engine/primitive requirements}
%
% To use \pkg{expl3} and the higher level packages provided by the
diff --git a/macros/latex/contrib/l3kernel/expl3.pdf b/macros/latex/contrib/l3kernel/expl3.pdf
index 48ef0d9e7e..adfa71fe8e 100644
--- a/macros/latex/contrib/l3kernel/expl3.pdf
+++ b/macros/latex/contrib/l3kernel/expl3.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/interface3.pdf b/macros/latex/contrib/l3kernel/interface3.pdf
index d80ff728b7..a63062c398 100644
--- a/macros/latex/contrib/l3kernel/interface3.pdf
+++ b/macros/latex/contrib/l3kernel/interface3.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/interface3.tex b/macros/latex/contrib/l3kernel/interface3.tex
index ded23a7954..18cd1df664 100644
--- a/macros/latex/contrib/l3kernel/interface3.tex
+++ b/macros/latex/contrib/l3kernel/interface3.tex
@@ -64,7 +64,7 @@ for those people who are interested.
{latex-team@latex-project.org}%
}%
}
-\date{Released 2023-10-23}
+\date{Released 2023-11-01}
\pagenumbering{roman}
\maketitle
diff --git a/macros/latex/contrib/l3kernel/l3.ins b/macros/latex/contrib/l3kernel/l3.ins
index 24f11d8f7b..0018a81d70 100644
--- a/macros/latex/contrib/l3kernel/l3.ins
+++ b/macros/latex/contrib/l3kernel/l3.ins
@@ -65,6 +65,7 @@ and all files in that bundle must be distributed together.
\from{l3expan.dtx} {package}
\from{l3quark.dtx} {package}
\from{l3tl.dtx} {package}
+ \from{l3tl-build.dtx} {package}
\from{l3str.dtx} {package}
\from{l3seq.dtx} {package}
\from{l3int.dtx} {package}
diff --git a/macros/latex/contrib/l3kernel/l3basics.dtx b/macros/latex/contrib/l3kernel/l3basics.dtx
index 00e159d817..716b916817 100644
--- a/macros/latex/contrib/l3kernel/l3basics.dtx
+++ b/macros/latex/contrib/l3kernel/l3basics.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
@@ -106,6 +106,9 @@
% level may be closed by a \cs{group_end:} function or by a token
% with category code $2$ (close-group), namely a ^^A{
% |}| if standard category codes apply.
+% \begin{texnote}
+% This is the \TeX{} primitive \tn{aftergroup}.
+% \end{texnote}
% \end{function}
%
% \begin{function}[added = 2021-05-11]{\group_show_list:, \group_log_list:}
@@ -116,7 +119,7 @@
% Display (to the terminal or log file) a list of the groups that are
% currently opened. This is intended for tracking down problems.
% \begin{texnote}
-% This is a wrapper around the \tn{showgroups} primitive.
+% This is a wrapper around the \eTeX{} primitive \tn{showgroups}.
% \end{texnote}
% \end{function}
%
@@ -130,8 +133,9 @@
% is therefore used as a shorthand for \enquote{replacement text}.
%
% Functions which are not \enquote{protected} are fully expanded
-% inside an \texttt{x} expansion. In contrast, \enquote{protected}
-% functions are not expanded within \texttt{x} expansions.
+% inside an \texttt{e}-type or \texttt{x}-type expansion.
+% In contrast, \enquote{protected} functions are not expanded within
+% \texttt{e} and \texttt{x} expansions.
%
% \subsection{Defining functions}
%
@@ -175,7 +179,7 @@
% Create a new function with the \texttt{protected} restriction,
% such as \cs{cs_set_protected:Npn}. The parameter may contain
% \cs{par} tokens but the function will not expand within an
-% \texttt{x}-type or \texttt{e}-type expansion.
+% \texttt{e}-type or \texttt{x}-type expansion.
% \end{description}
%
% Finally, the functions in
@@ -245,8 +249,8 @@
% Creates \meta{function} to expand to \meta{code} as replacement text.
% Within the \meta{code}, the \meta{parameters} (|#1|, |#2|,
% \emph{etc.}) will be replaced by those absorbed by the function.
-% The \meta{function} will not expand within an \texttt{x}-type or
-% or \texttt{e}-type
+% The \meta{function} will not expand within an \texttt{e}-type or
+% or \texttt{x}-type
% argument. The definition is global and an error results if the
% \meta{function} is already defined.
% \end{function}
@@ -265,7 +269,7 @@
% \emph{etc.}) will be replaced by those absorbed by the function.
% When the \meta{function} is used the \meta{parameters} absorbed
% cannot contain \cs{par} tokens. The \meta{function} will not
-% expand within an \texttt{x}-type or \texttt{e}-type argument. The definition is global
+% expand within an \texttt{e}-type or \texttt{x}-type argument. The definition is global
% and an error results if the \meta{function} is already defined.
% \end{function}
%
@@ -317,7 +321,7 @@
% \emph{etc.}) will be replaced by those absorbed by the function.
% The assignment of a meaning to the \meta{function} is restricted to
% the current \TeX{} group level. The \meta{function} will
-% not expand within an \texttt{x}-type or \texttt{e}-type argument.
+% not expand within an \texttt{e}-type or \texttt{x}-type argument.
% \end{function}
%
% \begin{function}
@@ -336,7 +340,7 @@
% cannot contain \cs{par} tokens. The assignment of a meaning
% to the \meta{function} is restricted to the current \TeX{} group
% level. The \meta{function} will not expand within an
-% \texttt{x}-type or \texttt{e}-type argument.
+% \texttt{e}-type or \texttt{x}-type argument.
% \end{function}
%
% \begin{function}
@@ -389,7 +393,7 @@
% The assignment of a meaning to the \meta{function} is \emph{not}
% restricted to the current \TeX{} group level: the assignment is
% global. The \meta{function} will not expand within an
-% \texttt{x}-type or \texttt{e}-type argument.
+% \texttt{e}-type or \texttt{x}-type argument.
% \end{function}
%
% \begin{function}
@@ -408,7 +412,7 @@
% cannot contain \cs{par} tokens. The assignment of a meaning to the
% \meta{function} is \emph{not} restricted to the current \TeX{}
% group level: the assignment is global. The \meta{function} will
-% not expand within an \texttt{x}-type or \texttt{e}-type argument.
+% not expand within an \texttt{e}-type or \texttt{x}-type argument.
% \end{function}
%
% \subsection{Defining new functions using the signature}
@@ -459,8 +463,8 @@
% Within the \meta{code}, the number of \meta{parameters} is detected
% automatically from the function signature. These \meta{parameters}
% (|#1|, |#2|, \emph{etc.}) will be replaced by those absorbed by the
-% function. The \meta{function} will not expand within an \texttt{x}-type
-% or \texttt{e}-type argument. The definition is global and
+% function. The \meta{function} will not expand within an \texttt{e}-type
+% or \texttt{x}-type argument. The definition is global and
% an error results if the \meta{function} is already defined.
% \end{function}
%
@@ -478,7 +482,7 @@
% (|#1|, |#2|, \emph{etc.}) will be replaced by those absorbed by the
% function. When the \meta{function} is used the \meta{parameters}
% absorbed cannot contain \cs{par} tokens. The \meta{function} will not
-% expand within an \texttt{x}-type or \texttt{e}-type argument. The definition is global and
+% expand within an \texttt{e}-type or \texttt{x}-type argument. The definition is global and
% an error results if the \meta{function} is already defined.
% \end{function}
%
@@ -529,8 +533,8 @@
% Within the \meta{code}, the number of \meta{parameters} is detected
% automatically from the function signature. These \meta{parameters}
% (|#1|, |#2|, \emph{etc.}) will be replaced by those absorbed by the
-% function. The \meta{function} will not expand within an \texttt{x}-type
-% or \texttt{e}-type argument.
+% function. The \meta{function} will not expand within an \texttt{e}-type
+% or \texttt{x}-type argument.
% The assignment of a meaning to the \meta{function} is restricted to
% the current \TeX{} group level.
% \end{function}
@@ -549,7 +553,7 @@
% (|#1|, |#2|, \emph{etc.}) will be replaced by those absorbed by the
% function. When the \meta{function} is used the \meta{parameters}
% absorbed cannot contain \cs{par} tokens. The \meta{function} will not
-% expand within an \texttt{x}-type or \texttt{e}-type argument.
+% expand within an \texttt{e}-type or \texttt{x}-type argument.
% The assignment of a meaning to the \meta{function} is restricted to
% the current \TeX{} group level.
% \end{function}
@@ -599,8 +603,8 @@
% Within the \meta{code}, the number of \meta{parameters} is detected
% automatically from the function signature. These \meta{parameters}
% (|#1|, |#2|, \emph{etc.}) will be replaced by those absorbed by the
-% function. The \meta{function} will not expand within an \texttt{x}-type
-% or \texttt{e}-type argument.
+% function. The \meta{function} will not expand within an \texttt{e}-type
+% or \texttt{x}-type argument.
% The assignment of a meaning to the \meta{function} is global.
% \end{function}
%
@@ -618,7 +622,7 @@
% (|#1|, |#2|, \emph{etc.}) will be replaced by those absorbed by the
% function. When the \meta{function} is used the \meta{parameters}
% absorbed cannot contain \cs{par} tokens. The \meta{function} will not
-% expand within an \texttt{x}-type or \texttt{e}-type argument.
+% expand within an \texttt{e}-type or \texttt{x}-type argument.
% The assignment of a meaning to the \meta{function} is global.
% \end{function}
%
@@ -712,7 +716,7 @@
% This function expands to the \emph{meaning} of the \meta{control sequence}
% control sequence. For a macro, this includes the \meta{replacement text}.
% \begin{texnote}
-% This is \TeX{}'s \tn{meaning} primitive.
+% This is the \TeX{} primitive \tn{meaning}.
% For tokens that are not control sequences, it is more logical to
% use \cs{token_to_meaning:N}.
% The \texttt{c} variant correctly reports undefined arguments.
@@ -825,7 +829,7 @@
% of category code $10$. The result does \emph{not} include
% the current escape token, contrarily to \cs{token_to_str:N}.
% Full expansion of this function requires exactly $2$ expansion
-% steps, and so an \texttt{x}-type or \texttt{e}-type expansion, or two
+% steps, and so an \texttt{e}-type or \texttt{x}-type expansion, or two
% \texttt{o}-type expansions are required to
% convert the \meta{control sequence} to a sequence of characters
% in the input stream. In most cases, an \texttt{f}-expansion
@@ -1207,7 +1211,7 @@
% Certain conditionals deal with specific data types like boxes and
% fonts and are described there. The ones described below are either
% the universal conditionals or deal with control sequences. We
-% prefix primitive conditionals with |\if_|.
+% prefix primitive conditionals with |\if_|, except for \cs{if:w}.
%
% \begin{function}[EXP]
% {\if_true:, \if_false:, \else:, \fi:, \reverse_if:N}
@@ -1222,8 +1226,10 @@
% conditional. The function "\or:" is documented in \pkg{l3int} and
% used in case switches.
% \begin{texnote}
-% These are equivalent to their corresponding \TeX\ primitive
-% conditionals; \cs{reverse_if:N} is \eTeX's \tn{unless}.
+% \cs{if_true:} and \cs{if_false:} are equivalent to their corresponding
+% \TeX{} primitive conditionals \tn{iftrue} and \tn{iffalse};
+% \cs{else:} and \cs{fi:} are the \TeX{} primitives \tn{else} and \tn{fi};
+% \cs{reverse_if:N} is the \eTeX{} primitive \tn{unless}.
% \end{texnote}
% \end{function}
%
@@ -1236,7 +1242,7 @@
% <arg_1> and <arg_2> could be functions, variables, tokens; in all cases the
% \emph{unexpanded} definitions are compared.
% \begin{texnote}
-% This is \TeX{}'s \tn{ifx}.
+% This is the \TeX{} primitive \tn{ifx}.
% \end{texnote}
% \end{function}
%
@@ -1251,6 +1257,10 @@
% tests if the category codes of the two tokens are the same whereas
% "\if:w" tests if the character codes are
% identical. "\if_charcode:w" is an alternative name for "\if:w".
+% \begin{texnote}
+% \cs{if:w} and \cs{if_charcode:w} are both the \TeX{} primitive \tn{if}.
+% \cs{if_catcode:w} is the \TeX{} primitive \tn{ifcat}.
+% \end{texnote}
% \end{function}
%
% \begin{function}[EXP]{\if_cs_exist:N, \if_cs_exist:w}
@@ -1264,7 +1274,7 @@
% "\scan_stop:"! This can be useful when dealing with control
% sequences which cannot be entered as a single token.
% \begin{texnote}
-% These are \TeX{}'s \tn{ifdefined} and \tn{ifcsname}, respectively.
+% These are the \TeX{} primitives \tn{ifdefined} and \tn{ifcsname}.
% \end{texnote}
% \end{function}
%
@@ -1278,6 +1288,10 @@
% \end{syntax}
% Execute <true code> if currently in horizontal mode, otherwise
% execute <false code>. Similar for the other functions.
+% \begin{texnote}
+% These are the \TeX{} primitives \tn{ifhmode}, \tn{ifvmode}, \tn{ifmmode},
+% and~\tn{ifinner}.
+% \end{texnote}
% \end{function}
%
% \section{Starting a paragraph}
@@ -2414,9 +2428,6 @@
% returned with \meta{true} for when there is a colon in the function
% and \meta{false} if there is not.
%
-% We cannot use |:| directly as it has the wrong category code so
-% an |x|-type expansion is used to force the conversion.
-%
% First ensure that we actually get a properly evaluated string by
% expanding \cs{cs_to_str:N} twice. If the function contained a
% colon, the auxiliary takes as |#1| the function name, delimited by
@@ -3245,7 +3256,7 @@
% wrapping code as otherwise we would wrongly see the definitions that
% are in place there. To get correct escape characters, set the
% \tn{escapechar} in a group; this also localizes the assignment
-% performed by \texttt{x}-expansion. The \cs{cs_show:c} and \cs{cs_log:c} commands
+% performed by \texttt{e}-expansion. The \cs{cs_show:c} and \cs{cs_log:c} commands
% convert their argument to a control sequence within a group to avoid
% showing \tn{relax} for undefined control sequences.
% \begin{macrocode}
diff --git a/macros/latex/contrib/l3kernel/l3bootstrap.dtx b/macros/latex/contrib/l3kernel/l3bootstrap.dtx
index a42f358ae8..395e5e35b4 100644
--- a/macros/latex/contrib/l3kernel/l3bootstrap.dtx
+++ b/macros/latex/contrib/l3kernel/l3bootstrap.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
@@ -51,9 +51,16 @@
%
% \section{Using the \LaTeX3 modules}
%
-% The modules documented in \file{source3} are designed to be used on top of
-% \LaTeXe{} and are loaded all as one with the usual |\usepackage{expl3}| or
-% |\RequirePackage{expl3}| instructions.
+% The modules documented in ^^A
+% \ifinterface
+% this file (and \file{source3} for documented sources) ^^A
+% \else
+% \file{interface3} (and this file) ^^A
+% \fi
+% are designed to be used on top of \LaTeXe{} and are already pre-loaded
+% since \LaTeXe{} 2020-02-02.
+% To support older formats, the |\usepackage{expl3}| or |\RequirePackage{expl3}|
+% instructions are still available to load them all as one.
%
% As the modules use a coding syntax different from standard
% \LaTeXe{} it provides a few functions for setting it up.
@@ -80,7 +87,6 @@
% \begin{function}[updated = 2017-03-19, updated = 2023-08-03]
% {\ProvidesExplPackage, \ProvidesExplClass, \ProvidesExplFile}
% \begin{syntax}
-% |\RequirePackage{expl3}| \\
% \cs{ProvidesExplPackage} \Arg{package} \Arg{date} \Arg{version} \Arg{description}
% \end{syntax}
% These functions act broadly in the same way as the corresponding
@@ -99,7 +105,6 @@
%
% \begin{function}[updated = 2012-06-04]{\GetIdInfo}
% \begin{syntax}
-% |\RequirePackage{l3bootstrap}|
% \cs{GetIdInfo} |$Id:| \meta{SVN info field} |$| \Arg{description}
% \end{syntax}
% Extracts all information from a SVN field. Spaces are not
diff --git a/macros/latex/contrib/l3kernel/l3box.dtx b/macros/latex/contrib/l3kernel/l3box.dtx
index 5757653168..b92b4faaa6 100644
--- a/macros/latex/contrib/l3kernel/l3box.dtx
+++ b/macros/latex/contrib/l3kernel/l3box.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
@@ -639,7 +639,7 @@
% variable does not exist or if it is invalid. This function may be applied to
% local or global boxes.
% \begin{texnote}
-% This is the \tn{box} primitive.
+% This is the \TeX{} primitive \tn{box}.
% \end{texnote}
% \end{function}
%
diff --git a/macros/latex/contrib/l3kernel/l3candidates.dtx b/macros/latex/contrib/l3kernel/l3candidates.dtx
index 567969d545..b5c30bd42f 100644
--- a/macros/latex/contrib/l3kernel/l3candidates.dtx
+++ b/macros/latex/contrib/l3kernel/l3candidates.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
@@ -103,49 +103,6 @@
%
% \section{Additions to \pkg{l3tl}}
%
-% \begin{function}[added = 2018-04-01]{\tl_build_begin:N, \tl_build_gbegin:N}
-% \begin{syntax}
-% \cs{tl_build_begin:N} \meta{tl~var}
-% \end{syntax}
-% Clears the \meta{tl~var} and sets it up to support other
-% \cs[no-index]{tl_build_\ldots{}} functions, which allow accumulating
-% large numbers of tokens piece by piece much more efficiently than
-% standard \pkg{l3tl} functions. Until \cs{tl_build_end:N}
-% \meta{tl~var} is called, applying any function from \pkg{l3tl} other
-% than \cs[no-index]{tl_build_\ldots{}} will lead to incorrect
-% results. The |begin| and |gbegin| functions must be used for local
-% and global \meta{tl~var} respectively.
-% \end{function}
-%
-% \begin{function}[added = 2018-04-01]{\tl_build_clear:N, \tl_build_gclear:N}
-% \begin{syntax}
-% \cs{tl_build_clear:N} \meta{tl~var}
-% \end{syntax}
-% Clears the \meta{tl~var} and sets it up to support other
-% \cs[no-index]{tl_build_\ldots{}} functions. The |clear| and
-% |gclear| functions must be used for local and global \meta{tl~var}
-% respectively.
-% \end{function}
-%
-% \begin{function}[added = 2018-04-01]
-% {
-% \tl_build_put_left:Nn, \tl_build_put_left:Ne,
-% \tl_build_gput_left:Nn, \tl_build_gput_left:Ne,
-% \tl_build_put_right:Nn, \tl_build_put_right:Ne,
-% \tl_build_gput_right:Nn, \tl_build_gput_right:Ne
-% }
-% \begin{syntax}
-% \cs{tl_build_put_left:Nn} \meta{tl~var} \Arg{tokens}
-% \cs{tl_build_put_right:Nn} \meta{tl~var} \Arg{tokens}
-% \end{syntax}
-% Adds \meta{tokens} to the left or right side of the current contents
-% of \meta{tl~var}. The \meta{tl~var} must have been set up with
-% \cs{tl_build_begin:N} or \cs{tl_build_gbegin:N}. The |put| and
-% |gput| functions must be used for local and global \meta{tl~var}
-% respectively. The |right| functions are about twice faster than the
-% |left| functions.
-% \end{function}
-%
% \begin{function}[added = 2018-04-01]{\tl_build_get:NN}
% \begin{syntax}
% \cs{tl_build_get:NN} \meta{tl~var_1} \meta{tl~var_2}
@@ -157,20 +114,6 @@
% \cs{tl_set:Nn}.
% \end{function}
%
-% \begin{function}[added = 2018-04-01]{\tl_build_end:N, \tl_build_gend:N}
-% \begin{syntax}
-% \cs{tl_build_end:N} \meta{tl~var}
-% \end{syntax}
-% Gets the contents of \meta{tl~var} and stores that into the
-% \meta{tl~var} using \cs{tl_set:Nn} or \cs{tl_gset:Nn}.
-% The \meta{tl~var} must have
-% been set up with \cs{tl_build_begin:N} or \cs{tl_build_gbegin:N}.
-% The |end| and |gend| functions must be used for local and global
-% \meta{tl~var} respectively. These functions completely remove the
-% setup code that enabled \meta{tl~var} to be used for other
-% \cs[no-index]{tl_build_\ldots{}} functions.
-% \end{function}
-%
% \end{documentation}
%
% \begin{implementation}
@@ -195,7 +138,7 @@
% and skipping out of that would break horribly.
% The \cs{@@_wrap_item:n} function inserts the relevant
% \cs{@@_item:n} without expansion in the input stream,
-% hence in the \texttt{x}-expanding assignment.
+% hence in the \texttt{e}-expanding assignment.
% \begin{macrocode}
\cs_new_protected:Npn \seq_set_filter:NNn
{ \@@_set_filter:NNNn \__kernel_tl_set:Ne }
@@ -219,210 +162,10 @@
%<@@=tl>
% \end{macrocode}
%
-% Between \cs{tl_build_begin:N} \meta{tl~var} and \cs{tl_build_end:N}
-% \meta{tl~var}, the \meta{tl~var} has the structure
-% \begin{quote}
-% \cs{exp_end:} \ldots{} \cs{exp_end:} \cs{@@_build_last:NNn}
-% \meta{assignment} \meta{next~tl} \Arg{left} \meta{right}
-% \end{quote}
-% where \meta{right} is not braced. The \enquote{data} it represents is
-% \meta{left} followed by the \enquote{data} of \meta{next~tl} followed
-% by \meta{right}. The \meta{next~tl} is a token list variable whose
-% name is that of \meta{tl~var} followed by~|'|. There are between $0$
-% and $4$ \cs{exp_end:} to keep track of when \meta{left} and
-% \meta{right} should be put into the \meta{next~tl}. The
-% \meta{assignment} is \cs{cs_set_nopar:Npe} if the variable is local,
-% and \cs{cs_gset_nopar:Npe} if it is global.
-%
-% \begin{macro}{\tl_build_begin:N, \tl_build_gbegin:N}
-% \begin{macro}{\@@_build_begin:NN, \@@_build_begin:NNN}
-% First construct the \meta{next~tl}: using a prime here conflicts
-% with the usual \pkg{expl3} convention but we need a name that can be
-% derived from |#1| without any external data such as a counter.
-% Empty that \meta{next~tl} and setup the structure. The local and
-% global versions only differ by a single function
-% \cs[no-index]{cs_(g)set_nopar:Npe} used for all assignments: this is
-% important because only that function is stored in the \meta{tl~var}
-% and \meta{next~tl} for subsequent assignments. In principle
-% \cs{@@_build_begin:NNN} could use \cs[no-index]{tl_(g)clear_new:N}
-% to empty |#1| and make sure it is defined, but logging the
-% definition does not seem useful so we just do |#3| |#1| |{}| to
-% clear it locally or globally as appropriate.
-% \begin{macrocode}
-\cs_new_protected:Npn \tl_build_begin:N #1
- { \@@_build_begin:NN \cs_set_nopar:Npe #1 }
-\cs_new_protected:Npn \tl_build_gbegin:N #1
- { \@@_build_begin:NN \cs_gset_nopar:Npe #1 }
-\cs_new_protected:Npn \@@_build_begin:NN #1#2
- { \exp_args:Nc \@@_build_begin:NNN { \cs_to_str:N #2 ' } #2 #1 }
-\cs_new_protected:Npn \@@_build_begin:NNN #1#2#3
- {
- #3 #1 { }
- #3 #2
- {
- \exp_not:n { \exp_end: \exp_end: \exp_end: \exp_end: }
- \exp_not:n { \@@_build_last:NNn #3 #1 { } }
- }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\tl_build_clear:N, \tl_build_gclear:N}
-% The |begin| and |gbegin| functions already clear enough to make the
-% token list variable effectively empty. Eventually the |begin| and
-% |gbegin| functions should check that |#1'| is empty or undefined,
-% while the |clear| and |gclear| functions ought to empty |#1'|,
-% |#1''| and so on, similar to \cs{tl_build_end:N}. This only affects
-% memory usage.
-% \begin{macrocode}
-\cs_new_eq:NN \tl_build_clear:N \tl_build_begin:N
-\cs_new_eq:NN \tl_build_gclear:N \tl_build_gbegin:N
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}
-% {
-% \tl_build_put_right:Nn, \tl_build_put_right:Ne, \tl_build_put_right:Nx,
-% \tl_build_gput_right:Nn, \tl_build_gput_right:Ne, \tl_build_gput_right:Nx,
-% \@@_build_last:NNn, \@@_build_put:nn, \@@_build_put:nw
-% }
-% Similar to \cs{tl_put_right:Nn}, but apply \cs{exp:w} to |#1|. Most
-% of the time this just removes one \cs{exp_end:}. When there are
-% none left, \cs{@@_build_last:NNn} is expanded instead. It resets
-% the definition of the \meta{tl~var} by ending the \cs{exp_not:n} and
-% the definition early. Then it makes sure the \meta{next~tl} (its
-% argument |#1|) is set-up and starts a new definition. Then
-% \cs{@@_build_put:nn} and \cs{@@_build_put:nw} place the \meta{left}
-% part of the original \meta{tl~var} as appropriate for the definition
-% of the \meta{next~tl} (the \meta{right} part is left in the right
-% place without ever becoming a macro argument). We use
-% \cs{exp_after:wN} rather than some \cs{exp_args:No} to avoid reading
-% arguments that are likely very long token lists. We use
-% \cs[no-index]{cs_(g)set_nopar:Npe} rather than
-% \cs[no-index]{tl_(g)set:Ne} partly for the same reason and partly
-% because the assignments are interrupted by brace tricks, which
-% implies that the assignment does not simply set the token list to an
-% |x|-expansion of the second argument.
-% \begin{macrocode}
-\cs_new_protected:Npn \tl_build_put_right:Nn #1#2
- {
- \cs_set_nopar:Npe #1
- { \exp_after:wN \exp_not:n \exp_after:wN { \exp:w #1 #2 } }
- }
-\cs_generate_variant:Nn \tl_build_put_right:Nn { Ne , Nx }
-\cs_new_protected:Npn \tl_build_gput_right:Nn #1#2
- {
- \cs_gset_nopar:Npe #1
- { \exp_after:wN \exp_not:n \exp_after:wN { \exp:w #1 #2 } }
- }
-\cs_generate_variant:Nn \tl_build_gput_right:Nn { Ne , Nx }
-\cs_new_protected:Npn \@@_build_last:NNn #1#2
- {
- \if_false: { { \fi:
- \exp_end: \exp_end: \exp_end: \exp_end: \exp_end:
- \@@_build_last:NNn #1 #2 { }
- }
- }
- \if_meaning:w \c_empty_tl #2
- \@@_build_begin:NN #1 #2
- \fi:
- #1 #2
- {
- \exp_after:wN \exp_not:n \exp_after:wN
- {
- \exp:w \if_false: } } \fi:
- \exp_after:wN \@@_build_put:nn \exp_after:wN {#2}
- }
-\cs_new_protected:Npn \@@_build_put:nn #1#2 { \@@_build_put:nw {#2} #1 }
-\cs_new_protected:Npn \@@_build_put:nw #1#2 \@@_build_last:NNn #3#4#5
- { #2 \@@_build_last:NNn #3 #4 { #1 #5 } }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}
-% {
-% \tl_build_put_left:Nn, \tl_build_put_left:Ne, \tl_build_put_left:Nx,
-% \tl_build_gput_left:Nn, \tl_build_gput_left:Ne, \tl_build_gput_left:Nx,
-% \@@_build_put_left:NNn
-% }
-% See \cs{tl_build_put_right:Nn} for all the machinery. We could
-% easily provide \cs[no-index]{tl_build_put_left_right:Nnn}, by just
-% add the \meta{right} material after the \Arg{left} in the
-% |x|-expanding assignment.
-% \begin{macrocode}
-\cs_new_protected:Npn \tl_build_put_left:Nn #1
- { \@@_build_put_left:NNn \cs_set_nopar:Npe #1 }
-\cs_generate_variant:Nn \tl_build_put_left:Nn { Ne , Nx }
-\cs_new_protected:Npn \tl_build_gput_left:Nn #1
- { \@@_build_put_left:NNn \cs_gset_nopar:Npe #1 }
-\cs_generate_variant:Nn \tl_build_gput_left:Nn { Ne , Nx }
-\cs_new_protected:Npn \@@_build_put_left:NNn #1#2#3
- {
- #1 #2
- {
- \exp_after:wN \exp_not:n \exp_after:wN
- {
- \exp:w \exp_after:wN \@@_build_put:nn
- \exp_after:wN {#2} {#3}
- }
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
% \begin{macro}{\tl_build_get:NN}
-% \begin{macro}{\@@_build_get:NNN, \@@_build_get:w, \@@_build_get_end:w}
-% The idea is to expand the \meta{tl~var} then the \meta{next~tl} and
-% so on, all within an |x|-expanding assignment, and wrap as
-% appropriate in \cs{exp_not:n}. The various \meta{left} parts are
-% left in the assignment as we go, which enables us to expand the
-% \meta{next~tl} at the right place. The various \meta{right} parts
-% are eventually picked up in one last \cs{exp_not:n}, with a brace
-% trick to wrap all the \meta{right} parts together.
% \begin{macrocode}
\cs_new_protected:Npn \tl_build_get:NN
{ \@@_build_get:NNN \__kernel_tl_set:Ne }
-\cs_new_protected:Npn \@@_build_get:NNN #1#2#3
- { #1 #3 { \if_false: { \fi: \exp_after:wN \@@_build_get:w #2 } } }
-\cs_new:Npn \@@_build_get:w #1 \@@_build_last:NNn #2#3#4
- {
- \exp_not:n {#4}
- \if_meaning:w \c_empty_tl #3
- \exp_after:wN \@@_build_get_end:w
- \fi:
- \exp_after:wN \@@_build_get:w #3
- }
-\cs_new:Npn \@@_build_get_end:w #1#2#3
- { \exp_after:wN \exp_not:n \exp_after:wN { \if_false: } \fi: }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\tl_build_end:N, \tl_build_gend:N, \@@_build_end_loop:NN}
-% Get the data then clear the \meta{next~tl} recursively until finding
-% an empty one. It is perhaps wasteful to repeatedly use
-% \cs{cs_to_str:N}. The local/global scope is checked by
-% \cs{tl_set:Ne} or \cs{tl_gset:Ne}.
-% \begin{macrocode}
-\cs_new_protected:Npn \tl_build_end:N #1
- {
- \@@_build_get:NNN \__kernel_tl_set:Ne #1 #1
- \exp_args:Nc \@@_build_end_loop:NN { \cs_to_str:N #1 ' } \tl_clear:N
- }
-\cs_new_protected:Npn \tl_build_gend:N #1
- {
- \@@_build_get:NNN \__kernel_tl_gset:Ne #1 #1
- \exp_args:Nc \@@_build_end_loop:NN { \cs_to_str:N #1 ' } \tl_gclear:N
- }
-\cs_new_protected:Npn \@@_build_end_loop:NN #1#2
- {
- \if_meaning:w \c_empty_tl #1
- \exp_after:wN \use_none:nnnnnn
- \fi:
- #2 #1
- \exp_args:Nc \@@_build_end_loop:NN { \cs_to_str:N #1 ' } #2
- }
% \end{macrocode}
% \end{macro}
%
diff --git a/macros/latex/contrib/l3kernel/l3cctab.dtx b/macros/latex/contrib/l3kernel/l3cctab.dtx
index 794b53b5f4..317f623f2f 100644
--- a/macros/latex/contrib/l3kernel/l3cctab.dtx
+++ b/macros/latex/contrib/l3kernel/l3cctab.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3clist.dtx b/macros/latex/contrib/l3kernel/l3clist.dtx
index bd8082cf34..21563de7ea 100644
--- a/macros/latex/contrib/l3kernel/l3clist.dtx
+++ b/macros/latex/contrib/l3kernel/l3clist.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
@@ -361,7 +361,7 @@
% \begin{texnote}
% The result is returned within \tn{unexpanded}, which means that the
% comma list does not expand further when appearing in an
-% \texttt{x}-type or \texttt{e}-type argument expansion.
+% \texttt{e}-type or \texttt{x}-type argument expansion.
% \end{texnote}
% \end{function}
%
@@ -586,8 +586,8 @@
% \begin{texnote}
% The result is returned within the \tn{unexpanded}
% primitive (\cs{exp_not:n}), which means that the \meta{items}
-% do not expand further when appearing in an \texttt{x}-type
-% or \texttt{e}-type argument expansion.
+% do not expand further when appearing in an \texttt{e}-type
+% or \texttt{x}-type argument expansion.
% \end{texnote}
% \end{function}
%
@@ -611,8 +611,8 @@
% \begin{texnote}
% The result is returned within the \tn{unexpanded}
% primitive (\cs{exp_not:n}), which means that the \meta{items}
-% do not expand further when appearing in an \texttt{x}-type
-% or \texttt{e}-type argument expansion.
+% do not expand further when appearing in an \texttt{e}-type
+% or \texttt{x}-type argument expansion.
% \end{texnote}
% \end{function}
%
@@ -631,8 +631,8 @@
% \begin{texnote}
% The result is returned within the \tn{unexpanded}
% primitive (\cs{exp_not:n}), which means that the \meta{items}
-% do not expand further when appearing in an \texttt{x}-type
-% or \texttt{e}-type argument expansion.
+% do not expand further when appearing in an \texttt{e}-type
+% or \texttt{x}-type argument expansion.
% \end{texnote}
% \end{function}
%
@@ -737,8 +737,8 @@
% \begin{texnote}
% The result is returned within the \tn{unexpanded}
% primitive (\cs{exp_not:n}), which means that the \meta{item}
-% does not expand further when appearing in an \texttt{x}-type
-% or \texttt{e}-type argument expansion.
+% does not expand further when appearing in an \texttt{e}-type
+% or \texttt{x}-type argument expansion.
% \end{texnote}
% \end{function}
%
@@ -753,8 +753,8 @@
% \begin{texnote}
% The result is returned within the \tn{unexpanded}
% primitive (\cs{exp_not:n}), which means that the \meta{item}
-% does not expand further when appearing in an \texttt{x}-type
-% or \texttt{e}-type argument expansion.
+% does not expand further when appearing in an \texttt{e}-type
+% or \texttt{x}-type argument expansion.
% \end{texnote}
% \end{function}
%
@@ -1523,7 +1523,7 @@
% \clist_reverse:N, \clist_reverse:c,
% \clist_greverse:N, \clist_greverse:c
% }
-% Use \cs{clist_reverse:n} in an \texttt{x}-expanding assignment. The
+% Use \cs{clist_reverse:n} in an \texttt{e}-expanding assignment. The
% extra work that \cs{clist_reverse:n} does to preserve braces and
% spaces would not be needed for the well-controlled case of
% \texttt{N}-type comma lists, but the slow-down is not too bad.
diff --git a/macros/latex/contrib/l3kernel/l3coffins.dtx b/macros/latex/contrib/l3kernel/l3coffins.dtx
index cf046706b6..3f3e484cfa 100644
--- a/macros/latex/contrib/l3kernel/l3coffins.dtx
+++ b/macros/latex/contrib/l3kernel/l3coffins.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3color.dtx b/macros/latex/contrib/l3kernel/l3color.dtx
index 2cdf604d02..ca0aae12ae 100644
--- a/macros/latex/contrib/l3kernel/l3color.dtx
+++ b/macros/latex/contrib/l3kernel/l3color.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3debug.dtx b/macros/latex/contrib/l3kernel/l3debug.dtx
index c351529d85..ec27fe33af 100644
--- a/macros/latex/contrib/l3kernel/l3debug.dtx
+++ b/macros/latex/contrib/l3kernel/l3debug.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3deprecation.dtx b/macros/latex/contrib/l3kernel/l3deprecation.dtx
index 98d8df40e5..6fcc98968a 100644
--- a/macros/latex/contrib/l3kernel/l3deprecation.dtx
+++ b/macros/latex/contrib/l3kernel/l3deprecation.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
@@ -137,7 +137,7 @@
% In case we want a warning, the \meta{function} is defined to produce
% such a warning without grabbing any argument, then redefine itself
% to the standard definition that the \meta{function} should have,
-% with arguments, and call that definition. The \texttt{x}-type
+% with arguments, and call that definition. The \texttt{e}-type
% expansion and \cs{exp_not:n} avoid needing to double the~|#|, which
% we could not do anyways. We then deal with the code for
% \cs{debug_off:n} |{deprecation}|: presumably someone doing that does
@@ -536,6 +536,15 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\seq_set_map_x:NNn, \seq_gset_map_x:NNn}
+% \begin{macrocode}
+\__kernel_patch_deprecation:nnNNpn { 2023-10-26 } { \seq_set_map_e:NNn }
+\cs_gset_protected:Npn \seq_set_map_x:NNn { \seq_set_map_e:NNn }
+\__kernel_patch_deprecation:nnNNpn { 2023-10-26 } { \seq_gset_map_e:NNn }
+\cs_gset_protected:Npn \seq_gset_map_x:NNn { \seq_gset_map_e:NNn }
+% \end{macrocode}
+% \end{macro}
+%
% \subsection{Deprecated \pkg{l3sys} functions}
%
% \begin{macrocode}
@@ -614,6 +623,15 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\tl_build_clear:N, \tl_build_gclear:N}
+% \begin{macrocode}
+\__kernel_patch_deprecation:nnNNpn { 2023-10-18 } { \tl_build_begin:N }
+\cs_new_protected:Npn \tl_build_clear:N { \tl_build_begin:N }
+\__kernel_patch_deprecation:nnNNpn { 2023-10-18 } { \tl_build_gbegin:N }
+\cs_new_protected:Npn \tl_build_gclear:N { \tl_build_gbegin:N }
+% \end{macrocode}
+% \end{macro}
+%
% \subsection{Deprecated \pkg{l3token} functions}
%
% \begin{macro}[EXP]{\char_to_utfviii_bytes:n}
diff --git a/macros/latex/contrib/l3kernel/l3doc.dtx b/macros/latex/contrib/l3kernel/l3doc.dtx
index 789095d104..920145ce23 100644
--- a/macros/latex/contrib/l3kernel/l3doc.dtx
+++ b/macros/latex/contrib/l3kernel/l3doc.dtx
@@ -85,7 +85,7 @@ and all files in that bundle must be distributed together.
% require you to do updates, if the class changes.}}
%
% \author{\Team}
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
% \maketitle
% \tableofcontents
%
@@ -1190,7 +1190,7 @@ and all files in that bundle must be distributed together.
% Get predicate from a function's base name. The code is not broken
% by functions with no signature. The |n|-type version can be used
% for keys and other non-control sequences. The output after
-% |x|-expansion is a string.
+% |e|-expansion is a string.
% \begin{macrocode}
\cs_new:Npn \@@_predicate_from_base:n #1
{
@@ -1930,9 +1930,9 @@ and all files in that bundle must be distributed together.
\raisebox{\baselineskip}[0pt][0pt]{\hypertarget{expstar}{}}%
\write \@auxout { \def \string \Codedoc@expstar { } }
\@@_typeset_exp:\ indicates~fully~expandable~functions,~which~
- can~be~used~within~an~\texttt{x}-type~argument~(in~plain~
- \TeX{}~terms,~inside~an~\cs{edef}),~as~well~as~within~an~
- \texttt{f}-type~argument.
+ can~be~used~within~an~\texttt{e}-type~argument~(inside~an~\tn{expanded}),~
+ \texttt{x}-type~argument~(in~plain~\TeX{}~terms,~inside~an~\tn{edef}),~
+ as~well~as~within~an~\texttt{f}-type~argument.
}
\NewDocumentCommand { \CodedocExplainREXP } { }
{
@@ -1940,8 +1940,8 @@ and all files in that bundle must be distributed together.
\write \@auxout { \def \string \Codedoc@rexpstar { } }
\@@_typeset_rexp:\ indicates~
restricted~expandable~functions,~which~can~be~used~within~an~
- \texttt{x}-type~argument~but~cannot~be~fully~expanded~within~an~
- \texttt{f}-type~argument.
+ \texttt{x}-type~argument~or~an~\texttt{e}-type~argument,~
+ but~cannot~be~fully~expanded~within~an~\texttt{f}-type~argument.
}
\NewDocumentCommand { \CodedocExplainTF } { }
{
diff --git a/macros/latex/contrib/l3kernel/l3doc.pdf b/macros/latex/contrib/l3kernel/l3doc.pdf
index 2612bef184..905adabf2d 100644
--- a/macros/latex/contrib/l3kernel/l3doc.pdf
+++ b/macros/latex/contrib/l3kernel/l3doc.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3docstrip.dtx b/macros/latex/contrib/l3kernel/l3docstrip.dtx
index 59bd089ae6..9c363c8753 100644
--- a/macros/latex/contrib/l3kernel/l3docstrip.dtx
+++ b/macros/latex/contrib/l3kernel/l3docstrip.dtx
@@ -63,7 +63,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3docstrip.pdf b/macros/latex/contrib/l3kernel/l3docstrip.pdf
index 4f43b61756..537e38e21a 100644
--- a/macros/latex/contrib/l3kernel/l3docstrip.pdf
+++ b/macros/latex/contrib/l3kernel/l3docstrip.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3expan.dtx b/macros/latex/contrib/l3kernel/l3expan.dtx
index 3bf2bd6153..d133eaae45 100644
--- a/macros/latex/contrib/l3kernel/l3expan.dtx
+++ b/macros/latex/contrib/l3kernel/l3expan.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
@@ -229,7 +229,7 @@
% contrast to |e|, all macro parameter characters |#| must be doubled,
% and omitting this leads to low-level errors. In addition this type of
% expansion is not expandable, namely functions that have |x| in their
-% signature do not themselves expand when appearing inside |x| or |e|
+% signature do not themselves expand when appearing inside |e| or |x|
% expansion.
%
% The |f| type is so special that it deserves an example. It is
@@ -264,8 +264,7 @@
% \begin{quote}
% |\example:n { 3 , 7 }|
% \end{quote}
-% at the cost of being protected (for |x| type) or very much slower in
-% old engines (for |e| type).
+% at the cost of being protected for |x|-type.
% If you use |f| type expansion in conditional processing then
% you should stick to using |TF| type functions only as the expansion
% does not finish any |\if... \fi:| itself!
@@ -642,7 +641,7 @@
% appropriate argument specifier variant or the appropriate
% \cs[no-index]{exp_args:N\meta{variant}} function.
% \begin{texnote}
-% This is the \TeX{} primitive \tn{expandafter} renamed.
+% This is the \TeX{} primitive \tn{expandafter}.
% \end{texnote}
% \end{function}
%
@@ -659,10 +658,10 @@
% \cs{exp_not:N} \meta{token}
% \end{syntax}
% Prevents expansion of the \meta{token} in a context where it would
-% otherwise be expanded, for example an |x|-type argument or the first
-% token in an |o| or |e| or |f| argument.
+% otherwise be expanded, for example an |e|-type or |x|-type argument or
+% the first token in an |o|-type or |f|-type argument.
% \begin{texnote}
-% This is the \TeX{} \tn{noexpand} primitive. It only prevents
+% This is the \TeX{} primitive \tn{noexpand}. It only prevents
% expansion. At the beginning of an |f|-type argument, a space
% \meta{token} is removed even if it appears as \cs{exp_not:N}
% \cs{c_space_token}. In an |e|-expanding definition
@@ -686,16 +685,16 @@
% \begin{syntax}
% \cs{exp_not:n} \Arg{tokens}
% \end{syntax}
-% Prevents expansion of the \meta{tokens} in an |e| or |x|-type argument. In
-% all other cases the \meta{tokens} continue to be expanded, for
+% Prevents expansion of the \meta{tokens} in an |e|-type or |x|-type argument.
+% In all other cases the \meta{tokens} continue to be expanded, for
% example in the input stream or in other types of arguments such as
% \texttt{c}, \texttt{f}, \texttt{v}. The argument of \cs{exp_not:n}
% \emph{must} be surrounded by braces.
% \begin{texnote}
-% This is the \eTeX{} \tn{unexpanded} primitive. In an
-% |x|-expanding definition (\cs{cs_new:Npe}), \cs{exp_not:n}~|{#1}|
+% This is the \eTeX{} primitive \tn{unexpanded}. In an
+% |e|-expanding definition (\cs{cs_new:Npe}), \cs{exp_not:n}~|{#1}|
% is equivalent to |##1| rather than to~|#1|, namely it inserts the
-% two characters |#| and~|1|. In an |e|-type argument
+% two characters |#| and~|1|, and
% \cs{exp_not:n}~|{#}| is equivalent to |#|, namely it inserts the
% character~|#|.
% \end{texnote}
@@ -706,7 +705,7 @@
% \cs{exp_not:o} \Arg{tokens}
% \end{syntax}
% Expands the \meta{tokens} once, then prevents any further expansion
-% in |x|-type or \texttt{e}-type arguments using \cs{exp_not:n}.
+% in |e|-type or |x|-type arguments using \cs{exp_not:n}.
% \end{function}
%
% \begin{function}[EXP]{\exp_not:V}
@@ -714,7 +713,7 @@
% \cs{exp_not:V} \meta{variable}
% \end{syntax}
% Recovers the content of the \meta{variable}, then prevents expansion
-% of this material in |x|-type or \texttt{e}-type arguments using \cs{exp_not:n}.
+% of this material in |e|-type or |x|-type arguments using \cs{exp_not:n}.
% \end{function}
%
% \begin{function}[EXP]{\exp_not:v}
@@ -725,7 +724,7 @@
% converts this into a control sequence which should be a \meta{variable}
% name.
% The content of the \meta{variable} is recovered, and further
-% expansion in |x|-type or \texttt{e}-type arguments is prevented using \cs{exp_not:n}.
+% expansion in |e|-type or |x|-type arguments is prevented using \cs{exp_not:n}.
% \end{function}
%
% \begin{function}[EXP]{\exp_not:e}
@@ -734,7 +733,7 @@
% \end{syntax}
% Expands \meta{tokens} exhaustively, then protects the result of the
% expansion (including any tokens which were not expanded) from
-% further expansion in |e| or |x|-type arguments using \cs{exp_not:n}.
+% further expansion in |e|-type or |x|-type arguments using \cs{exp_not:n}.
% This is very rarely useful but is provided for consistency.
% \end{function}
%
@@ -745,7 +744,7 @@
% Expands \meta{tokens} fully until the first unexpandable token is
% found (if it is a space it is removed). Expansion then stops, and
% the result of the expansion (including any tokens which were not
-% expanded) is protected from further expansion in |x|-type or \texttt{e}-type arguments
+% expanded) is protected from further expansion in |e|-type or |x|-type arguments
% using \cs{exp_not:n}.
% \end{function}
%
@@ -758,7 +757,7 @@
% and all of \meta{tokens} are expandable \cs{exp_stop_f:}
% terminates the expansion of tokens even if \meta{more tokens}
% are also expandable. The function itself is an implicit space
-% token. Inside an \texttt{x}-type or \texttt{e}-type expansion, it retains its
+% token. Inside an \texttt{e}-type or \texttt{x}-type expansion, it retains its
% form, but when typeset it produces the underlying space (\verb*| |).
% \end{function}
%
@@ -948,7 +947,7 @@
% In this section a general mechanism for defining functions that handle
% arguments is defined. These general expansion functions are
% expandable unless |x| is used. (Any version of |x| is going to have
-% to use one of the \LaTeX3 names for \cs{cs_set:Npe} at some
+% to use one of the \LaTeX3 names for \cs{cs_set:Npx} at some
% point, and so is never going to be expandable.)
%
% The definition of expansion functions with this technique happens
@@ -1062,7 +1061,7 @@
% Since the expansion of \cs{exp:w} \cs{exp_end_continue_f:w} is
% empty, we wind up with a fully expanded list, only \TeX{} has not
% tried to execute any of the non-expandable tokens. This is what
-% differentiates this function from the |x| argument type.
+% differentiates this function from the |e| and |x| argument type.
% \begin{macrocode}
\cs_new:Npn \::f #1 \::: #2#3
{
@@ -1818,7 +1817,7 @@
% trigger an error, because we do not have a means to replace
% |o|-expansion by |x|-expansion.
% More generally, we can only convert |N| to |c|, or convert |n|
-% to |V|, |v|, |o|, |f|, |x|.
+% to |V|, |v|, |o|, |e|, |f|, or |x|.
% \end{itemize}
% All this boils down to a few rules. Only |n| and |N|-type
% arguments can be replaced by \cs{cs_generate_variant:Nn}. Other
@@ -1828,7 +1827,7 @@
% part is ignored.
%
% We compare the base and variant signatures one character at a time
-% within |x|-expansion. The result is given to
+% within |e|-expansion. The result is given to
% \cs{@@_generate_variant:wwNN} (defined later) in the form
% \meta{processed variant signature} \cs{s_@@_mark} \meta{errors}
% \cs{s_@@_stop} \meta{base function} \meta{new function}. If all went
@@ -1889,7 +1888,7 @@
%
% The case where the two letters are different is only allowed if the
% base is |N| and the variant is |c|, or when the base is |n| and the
-% variant is |o|, |V|, |v|, |f| or |x|. Otherwise, call
+% variant is |V|, |v|, |o|, |e|, |f|, or |x|. Otherwise, call
% \cs{@@_generate_variant_loop_invalid:NNwNNnn} to remove the end of
% the loop, get arguments at the end of the loop, and place an
% appropriate error message as a second argument of
diff --git a/macros/latex/contrib/l3kernel/l3file.dtx b/macros/latex/contrib/l3kernel/l3file.dtx
index af83fe4e08..423c9c2761 100644
--- a/macros/latex/contrib/l3kernel/l3file.dtx
+++ b/macros/latex/contrib/l3kernel/l3file.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
@@ -486,7 +486,7 @@
% \end{syntax}
% This function writes \meta{tokens} to the specified
% \meta{stream} when the current page is finalised (\emph{i.e.}~at
-% shipout). The \texttt{x}-type variants expand the \meta{tokens}
+% shipout). The \texttt{e}-type variants expand the \meta{tokens}
% at the point where the function is used but \emph{not} when the
% resulting tokens are written to the \meta{stream}
% (\emph{cf.}~\cs{iow_shipout_e:Nn}).
@@ -597,7 +597,7 @@
% output does \emph{not} expand further when written to a file.
%
% \begin{texnote}
-% Internally, \cs{iow_wrap:nnnN} carries out an \texttt{x}-type expansion
+% Internally, \cs{iow_wrap:nnnN} carries out an \texttt{e}-type expansion
% on the \meta{text} to expand it. This is done in such a way that
% \cs{exp_not:N} or \cs{exp_not:n} \emph{could} be used to prevent
% expansion of material. However, this is less conceptually clear than
@@ -687,9 +687,11 @@
% \emph{not} end in |/| other than the case that it is exactly equal
% to the root directory. The \meta{name} and \meta{ext} parts together
% make up the file name, thus the \meta{name} part may be thought of
-% as the \enquote{job name} for the current file. Note that \TeX{} does
-% not provide information on the \meta{ext} part for the main (top
-% level) file and that this file always has an empty \meta{dir} component.
+% as the \enquote{job name} for the current file.
+%
+% Note that \TeX{} does not provide information on the \meta{dir} and
+% \meta{ext} part for the main (top level) file and that this file
+% always has empty \meta{dir} and \meta{ext} components.
% Also, the \meta{name} here will be equal to \cs{c_sys_jobname_str},
% which may be different from the real file name (if set using
% |--jobname|, for example).
diff --git a/macros/latex/contrib/l3kernel/l3flag.dtx b/macros/latex/contrib/l3kernel/l3flag.dtx
index 278c71f27c..831f583aa1 100644
--- a/macros/latex/contrib/l3kernel/l3flag.dtx
+++ b/macros/latex/contrib/l3kernel/l3flag.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-assign.dtx b/macros/latex/contrib/l3kernel/l3fp-assign.dtx
index 17d75d1045..385086dca4 100644
--- a/macros/latex/contrib/l3kernel/l3fp-assign.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-assign.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
% \maketitle
%
% \begin{documentation}
@@ -165,7 +165,6 @@
% \subsection{Showing values}
%
% \begin{macro}{\fp_show:N, \fp_show:c, \fp_log:N, \fp_log:c, \@@_show:NN}
-% \begin{macro}[EXP]{\@@_show_validate:w}
% This shows the result of computing its argument by
% passing the right data to \cs{tl_show:n} or \cs{tl_log:n}.
% \begin{macrocode}
@@ -176,21 +175,91 @@
\cs_new_protected:Npn \@@_show:NN #1#2
{
\__kernel_chk_tl_type:NnnT #2 { fp }
+ { \exp_args:No \@@_show_validate:n #2 }
+ { \exp_args:Ne #1 { \token_to_str:N #2 = \fp_to_tl:N #2 } }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[EXP]
+% {
+% \@@_show_validate:n, \@@_show_validate_aux:n, \@@_show_validate:nn,
+% }
+% \begin{macro}[EXP]
+% {
+% \@@_show_validate:w,
+% \@@_tuple_show_validate:w,
+% \@@_symbolic_show_validate:w
+% }
+% To support symbolic expression, validation has to be done recursively.
+% Two |\@@_show_validate:nn| wrappers are used to distinguish between
+% initial and recursive calls, in which the former provides a demo of
+% possible forms a |fp| variable would have.
+% \begin{macrocode}
+\cs_new:Npn \@@_show_validate:n #1
+ {
+ \@@_show_validate:nn { #1 }
+ {
+ \s_@@ \@@_chk:w ??? ;~ or \iow_newline:
+ \s_@@_tuple \_@@_tuple_chk:w ? ;~ or \iow_newline:
+ \s_@@_symbolic \@@_symbolic_chk:w ? , ? ;
+ }
+ }
+\cs_new:Npn \@@_show_validate_aux:n #1
+ {
+ \@@_show_validate:nn { #1 } { }
+ }
+\cs_new:Npn \@@_show_validate:nn #1#2
+ {
+ \tl_if_empty:nF { #1 }
{
- \str_if_eq:eeTF { \tl_head:N #2 } { \s_@@_tuple } { \exp_not:o #2 }
+ \str_case:enF { \tl_head:n { #1 } }
{
- \exp_after:wN \@@_show_validate:w #2
- \s_@@ \@@_chk:w ??? ; \s_@@_stop
+ { \s_@@ }
+ {
+ \@@_show_validate:w #1 \s_@@
+ \@@_chk:w ??? ; \s_@@_stop
+ }
+ { \s_@@_tuple }
+ {
+ \@@_tuple_show_validate:w #1
+ \s_@@_tuple \_@@_tuple_chk:w ?? ; \s_@@_stop
+ }
+ { \s_@@_symbolic }
+ {
+ \@@_symbolic_show_validate:w #1
+ \s_@@_symbolic \@@_symbolic_chk:w ? , ?? ; \s_@@_stop
+ }
}
+ { #2 }
}
- { \exp_args:Ne #1 { \token_to_str:N #2 = \fp_to_tl:N #2 } }
}
\cs_new:Npn \@@_show_validate:w
#1 \s_@@ \@@_chk:w #2#3#4#5 ; #6 \s_@@_stop
{
- \token_if_eq_meaning:NNTF #2 1
- { \s_@@ \@@_chk:w #2 #3 {#4} #5 ; }
- { \s_@@ \@@_chk:w #2 #3 #4 #5 ; }
+ \str_if_eq:nnF { #2 } {?}
+ {
+ \token_if_eq_meaning:NNTF #2 1
+ { \s_@@ \@@_chk:w #2 #3 { #4 } #5 ; }
+ { \s_@@ \@@_chk:w #2 #3 #4 #5 ; }
+ \@@_show_validate_aux:n { #6 }
+ }
+ }
+\cs_new:Npn \@@_tuple_show_validate:w
+ #1 \s_@@_tuple \_@@_tuple_chk:w #2#3 ; #4 \s_@@_stop
+ {
+ \str_if_eq:nnF { #2 } {?}
+ { \s_@@_tuple \@@_tuple_chk:w { \@@_show_validate_aux:n { #2 } } ; }
+ }
+\cs_new:Npn \@@_symbolic_show_validate:w
+ #1 \s_@@_symbolic \@@_symbolic_chk:w #2 , #3#4 ; #5 \s_@@_stop
+ {
+ \str_if_eq:nnF { #2 } {?}
+ {
+ \s_@@_symbolic \@@_symbolic_chk:w \exp_not:n { #2 } ,
+ { \@@_show_validate_aux:n { #3 } };
+ \@@_show_validate_aux:n { #5 }
+ }
}
% \end{macrocode}
% \end{macro}
diff --git a/macros/latex/contrib/l3kernel/l3fp-aux.dtx b/macros/latex/contrib/l3kernel/l3fp-aux.dtx
index ccd5e63ac1..83191b8074 100644
--- a/macros/latex/contrib/l3kernel/l3fp-aux.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-aux.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
@@ -97,8 +97,8 @@
% When used directly without an accessor function, floating points
% should produce an error: this is the role of \cs{@@_chk:w}. We could
% make floating point variables be protected to prevent them from
-% expanding under \texttt{x}-expansion, but it seems more convenient to
-% treat them as a subcase of token list variables.
+% expanding under \texttt{e}/\texttt{x}-expansion, but it seems more
+% convenient to treat them as a subcase of token list variables.
%
% The (decimal part of the) IEEE-754-2008 standard requires the format
% to be able to represent special floating point numbers besides the
@@ -235,7 +235,8 @@
% where \cs{s_@@} is equal to the \TeX{} primitive \tn{relax}, and
% \cs{@@_chk:w} is protected. The rest of the floating point number
% is made of characters (or \tn{relax}). This ensures that nothing
-% expands under \texttt{f}-expansion, nor under \texttt{x}-expansion.
+% expands under \texttt{f}-expansion, nor under
+% \texttt{e}/\texttt{x}-expansion.
% However, when typeset, \cs{s_@@} does nothing, and \cs{@@_chk:w} is
% expanded. We define \cs{@@_chk:w} to produce an error.
% \begin{macrocode}
diff --git a/macros/latex/contrib/l3kernel/l3fp-basics.dtx b/macros/latex/contrib/l3kernel/l3fp-basics.dtx
index b79950c267..bba9b9535f 100644
--- a/macros/latex/contrib/l3kernel/l3fp-basics.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-basics.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-convert.dtx b/macros/latex/contrib/l3kernel/l3fp-convert.dtx
index 70983272dd..499e1f2f5f 100644
--- a/macros/latex/contrib/l3kernel/l3fp-convert.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-convert.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-expo.dtx b/macros/latex/contrib/l3kernel/l3fp-expo.dtx
index f0e691f310..a2ff43ef28 100644
--- a/macros/latex/contrib/l3kernel/l3fp-expo.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-expo.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-extended.dtx b/macros/latex/contrib/l3kernel/l3fp-extended.dtx
index e374e7e288..2720891ef3 100644
--- a/macros/latex/contrib/l3kernel/l3fp-extended.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-extended.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-functions.dtx b/macros/latex/contrib/l3kernel/l3fp-functions.dtx
index a899f3493a..55729bbcd8 100644
--- a/macros/latex/contrib/l3kernel/l3fp-functions.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-functions.dtx
@@ -42,7 +42,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
@@ -72,7 +72,7 @@
\cs_new_protected:Npn \@@_new_function:n #1
{
\@@_id_if_invalid:nTF {#1}
- { \msg_error:nnn { fp } { invalid-identifier } {#1} }
+ { \msg_error:nnn { fp } { id-invalid } {#1} }
{
\cs_if_exist:cT { @@_parse_word_#1:N }
{
@@ -91,12 +91,12 @@
% \begin{macro}
% {\@@_function_set_parsing:Nn, \@@_function_set_parsing_aux:NNn}
% \begin{macrocode}
-\cs_new:Npn \@@_function_set_parsing:Nn #1#2
+\cs_new_protected:Npn \@@_function_set_parsing:Nn #1#2
{
\exp_args:NNc \@@_function_set_parsing_aux:NNn #1
{ @@_parse_word_#2:N } {#2}
}
-\cs_new:Npn \@@_function_set_parsing_aux:NNn #1#2#3
+\cs_new_protected:Npn \@@_function_set_parsing_aux:NNn #1#2#3
{
\cs_set:Npe \@@_tmp:w
{
@@ -171,7 +171,7 @@
\cs_new_protected:Npn \@@_set_function:Nnnn #1#2#3#4
{
\@@_id_if_invalid:nTF {#2}
- { \msg_error:nnn { fp } { invalid-identifier } {#2} }
+ { \msg_error:nnn { fp } { id-invalid } {#2} }
{
\cs_if_exist:cF { @@_parse_word_#2:N }
{ \@@_function_set_parsing:Nn \cs_set_eq:NN {#2} }
@@ -180,8 +180,10 @@
\exp_args:No \clist_map_inline:nn { \tl_to_str:n {#3} }
{
\int_incr:N \l_@@_function_arg_int
- \exp_args:Ne \@@_clear_variable:n
- { _ \tex_romannumeral:D \l_@@_function_arg_int }
+ \exp_args:Ne \@@_clear_variable_aux:n
+ {
+ \c_underscore_str \tex_romannumeral:D \l_@@_function_arg_int
+ }
\fp_clear_variable:n {##1}
\cs_set_nopar:cpe { l_@@_variable_##1_fp }
{
@@ -264,8 +266,12 @@
{ \exp_args:No \@@_clear_function:n { \tl_to_str:n {#1} } }
\cs_new_protected:Npn \@@_clear_function:n #1
{
- \cs_undefine:c { @@_parse_word_ #1 :N }
- \@@_function_set_parsing:Nn \cs_set_eq:NN {#1}
+ \@@_id_if_invalid:nTF {#1}
+ { \msg_error:nnn { fp } { id-invalid } {#1} }
+ {
+ \cs_set_eq:cN { @@_#1_o:w } \tex_undefine:D
+ \@@_function_set_parsing:Nn \cs_set_eq:NN {#1}
+ }
}
% \end{macrocode}
% \end{macro}
diff --git a/macros/latex/contrib/l3kernel/l3fp-logic.dtx b/macros/latex/contrib/l3kernel/l3fp-logic.dtx
index 5e98d6b62c..edf16c72b2 100644
--- a/macros/latex/contrib/l3kernel/l3fp-logic.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-logic.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-parse.dtx b/macros/latex/contrib/l3kernel/l3fp-parse.dtx
index 58fc4f1f2a..e13a671892 100644
--- a/macros/latex/contrib/l3kernel/l3fp-parse.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-parse.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-random.dtx b/macros/latex/contrib/l3kernel/l3fp-random.dtx
index 3cff0bdc1a..5e213c5e4c 100644
--- a/macros/latex/contrib/l3kernel/l3fp-random.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-random.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-round.dtx b/macros/latex/contrib/l3kernel/l3fp-round.dtx
index 901cb5ba34..783a7fd0a3 100644
--- a/macros/latex/contrib/l3kernel/l3fp-round.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-round.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-symbolic.dtx b/macros/latex/contrib/l3kernel/l3fp-symbolic.dtx
index 277ecfabf5..29ac5aa07c 100644
--- a/macros/latex/contrib/l3kernel/l3fp-symbolic.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-symbolic.dtx
@@ -42,7 +42,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
@@ -157,8 +157,8 @@
% \begin{macro}[EXP]
% {\@@_if_has_symbolic:nTF, \@@_if_has_symbolic_aux:w}
% Tests if |#1| contains \cs{s_@@_symbolic} at top-level. This test
-% should be precise enough to determine if a given an array contains a
-% symbolic expression or only consists in floating points. Used in
+% should be precise enough to determine if a given array contains a
+% symbolic expression or only consists of floating points. Used in
% \cs{@@_exp_after_symbolic_f:nw}.
% \begin{macrocode}
\cs_new:Npn \@@_if_has_symbolic:nTF #1
@@ -255,9 +255,9 @@
% \@@_&_symbolic_o:ww,
% }
% \begin{macrocode}
-\cs_set:Npn \@@_tmp:w #1#2
+\cs_set_protected:Npn \@@_tmp:w #1#2
{
- \cs_new_nopar:cpn
+ \cs_new:cpn
{ @@_symbolic_#2_symbolic_o:ww }
{ \@@_symbolic_binary_o:Nww #1 }
\cs_new_eq:cc
@@ -277,7 +277,7 @@
%
% \subsection{Applying prefix functions to expressions}
%
-% \begin{macro}[aux, EXP]{\@@_symbolic_unary_o:NNw}
+% \begin{macro}[EXP]{\@@_symbolic_unary_o:NNw}
% Used when applying infix operators to expressions.
% \begin{macrocode}
\cs_new:Npn \@@_symbolic_unary_o:NNw #1#2#3; @
@@ -313,7 +313,7 @@
{not} {sec} {set_sign} {sin} {sqrt} {tan}
}
{
- \cs_new_nopar:cpe { @@_symbolic_#1_o:w }
+ \cs_new:cpe { @@_symbolic_#1_o:w }
{
\exp_not:N \@@_symbolic_unary_o:NNw
\exp_not:c { @@_#1_o:w }
@@ -336,7 +336,7 @@
% \begin{macrocode}
\cs_set_protected:Npn \@@_tmp:w #1#2#3
{
- \cs_new_nopar:cpn { @@_symbolic_to_#1:w }
+ \cs_new:cpn { @@_symbolic_to_#1:w }
{
\exp_after:wN \@@_symbolic_convert:wnnN
\exp:w \exp_end_continue_f:w
@@ -384,7 +384,8 @@
% \begin{macro}[rEXP]
% {
% \@@_symbolic_unary_to_tl:NNw,
-% \@@_symbolic_binary_to_tl:Nww
+% \@@_symbolic_binary_to_tl:Nww,
+% \@@_symbolic_function_to_tl:Nw
% }
% Converting a symbolic expression to a token list is possible.
% \begin{macrocode}
@@ -440,6 +441,7 @@
% loop through letters in |#1|: if it is not a letter, break the loop
% and return \texttt{true}. If the end of the loop is reached
% without finding any non-letter, return \texttt{false}.
+% Note |#1| must be a str (i.e., resulted from \cs{tl_to_str:n}).
% \begin{macrocode}
\prg_new_protected_conditional:Npnn
\@@_id_if_invalid:n #1 { T , F , TF }
@@ -447,10 +449,10 @@
\tl_if_empty:nTF {#1}
{ \prg_return_true: }
{
- \tl_if_in:onTF { \tl_to_str:n {#1} } { ~ }
+ \tl_if_in:nnTF { #1 } { ~ }
{ \prg_return_true: }
{
- \exp_after:wN \@@_id_if_invalid_aux:N \tl_to_str:n {#1}
+ \@@_id_if_invalid_aux:N #1
{ ? \prg_break:n \prg_return_false: }
\prg_break_point:
}
@@ -511,9 +513,9 @@
% \begin{macro}
% {\@@_variable_set_parsing:Nn, \@@_variable_set_parsing_aux:NNn}
% \begin{macrocode}
-\cs_new:Npn \@@_variable_set_parsing:Nn #1#2
+\cs_new_protected:Npn \@@_variable_set_parsing:Nn #1#2
{
- \cs_set_nopar:Npn \@@_tmp:w
+ \cs_set:Npn \@@_tmp:w
{
\@@_exp_after_symbolic_f:nw { \@@_parse_infix:NN }
\s_@@_symbolic \@@_symbolic_chk:w
@@ -522,7 +524,7 @@
\exp_args:NNc \@@_variable_set_parsing_aux:NNn #1
{ @@_parse_word_#2:N } {#2}
}
-\cs_new:Npn \@@_variable_set_parsing_aux:NNn #1#2#3
+\cs_new_protected:Npn \@@_variable_set_parsing_aux:NNn #1#2#3
{
\cs_if_eq:NNF #2 \@@_tmp:w
{
@@ -541,23 +543,32 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\fp_clear_variable:n}
-% \begin{macro}{\@@_clear_variable:n}
+% \begin{macro}
+% {
+% \fp_clear_variable:n,
+% \@@_clear_variable:n, \@@_clear_variable_aux:n
+% }
+% We need local undefining, so have to do it low-level.
+% \cs{@@_clear_variable_aux:n} is needed by \cs{@@_set_function:Nnnn}
+% to skip \cs{@@_id_if_invalid:nTF}.
% \begin{macrocode}
\cs_new_protected:Npn \fp_clear_variable:n #1
{
+ \exp_args:No \@@_clear_variable:n { \tl_to_str:n {#1} }
+ }
+\cs_new_protected:Npn \@@_clear_variable:n #1
+ {
\@@_id_if_invalid:nTF {#1}
{ \msg_error:nnn { fp } { id-invalid } {#1} }
- { \exp_args:No \@@_clear_variable:n { \tl_to_str:n {#1} } }
+ { \@@_clear_variable_aux:n {#1} }
}
-\cs_new_protected:Npn \@@_clear_variable:n #1
+\cs_new_protected:Npn \@@_clear_variable_aux:n #1
{
- \cs_undefine:c { l_@@_variable_#1_fp }
+ \cs_set_eq:cN { l_@@_variable_#1_fp } \tex_undefined:D
\@@_variable_set_parsing:Nn \cs_set_eq:NN {#1}
}
% \end{macrocode}
% \end{macro}
-% \end{macro}
%
% \begin{macro}{\fp_new_variable:n}
% \begin{macro}{\@@_new_variable:n}
@@ -567,20 +578,22 @@
% \begin{macrocode}
\cs_new_protected:Npn \fp_new_variable:n #1
{
- \@@_id_if_invalid:nTF {#1}
- { \msg_error:nnn { fp } { id-invalid } {#1} }
- { \exp_args:No \@@_new_variable:n { \tl_to_str:n {#1} } }
+ \exp_args:No \@@_new_variable:n { \tl_to_str:n {#1} }
}
\cs_new_protected:Npn \@@_new_variable:n #1
{
- \cs_if_exist:cT { @@_parse_word_#1:N }
+ \@@_id_if_invalid:nTF {#1}
+ { \msg_error:nnn { fp } { id-invalid } {#1} }
{
- \msg_error:nnn
- { fp } { id-already-defined } {#1}
- \cs_undefine:c { @@_parse_word_#1:N }
- \cs_undefine:c { l_@@_variable_#1_fp }
+ \cs_if_exist:cT { @@_parse_word_#1:N }
+ {
+ \msg_error:nnn
+ { fp } { id-already-defined } {#1}
+ \cs_undefine:c { @@_parse_word_#1:N }
+ \cs_set_eq:cN { l_@@_variable_#1_fp } \tex_undefined:D
+ }
+ \@@_variable_set_parsing:Nn \cs_gset_eq:NN {#1}
}
- \@@_variable_set_parsing:Nn \cs_gset_eq:NN {#1}
}
% \end{macrocode}
% \end{macro}
@@ -605,24 +618,26 @@
\flag_new:n { @@_symbolic }
\cs_new_protected:Npn \fp_set_variable:nn #1
{
- \@@_id_if_invalid:nTF {#1}
- { \msg_error:nnn { fp } { id-invalid } {#1} }
- { \exp_args:No \@@_set_variable:nn { \tl_to_str:n {#1} } }
+ \exp_args:No \@@_set_variable:nn { \tl_to_str:n {#1} }
}
\cs_new_protected:Npn \@@_set_variable:nn #1#2
{
- \@@_variable_set_parsing:Nn \cs_set_eq:NN {#1}
- \fp_set:Nn \l_@@_symbolic_fp {#2}
- \cs_set_nopar:cpn { l_@@_variable_#1_fp }
- { \flag_ensure_raised:n { @@_symbolic } \c_nan_fp }
- \flag_clear:n { @@_symbolic }
- \fp_set:cn { l_@@_variable_#1_fp } { \l_@@_symbolic_fp }
- \flag_if_raised:nT { @@_symbolic }
+ \@@_id_if_invalid:nTF {#1}
+ { \msg_error:nnn { fp } { id-invalid } {#1} }
{
- \msg_error:nneee { fp } { id-loop }
- { \tl_to_str:n {#1} }
- { \tl_to_str:n {#2} }
- { \fp_to_tl:N \l_@@_symbolic_fp }
+ \@@_variable_set_parsing:Nn \cs_set_eq:NN {#1}
+ \fp_set:Nn \l_@@_symbolic_fp {#2}
+ \cs_set_nopar:cpn { l_@@_variable_#1_fp }
+ { \flag_ensure_raised:n { @@_symbolic } \c_nan_fp }
+ \flag_clear:n { @@_symbolic }
+ \fp_set:cn { l_@@_variable_#1_fp } { \l_@@_symbolic_fp }
+ \flag_if_raised:nT { @@_symbolic }
+ {
+ \msg_error:nneee { fp } { id-loop }
+ { #1 }
+ { \tl_to_str:n {#2} }
+ { \fp_to_tl:N \l_@@_symbolic_fp }
+ }
}
}
% \end{macrocode}
diff --git a/macros/latex/contrib/l3kernel/l3fp-traps.dtx b/macros/latex/contrib/l3kernel/l3fp-traps.dtx
index 1bdece9ba7..5fec65448d 100644
--- a/macros/latex/contrib/l3kernel/l3fp-traps.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-traps.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
% \maketitle
%
% \begin{documentation}
diff --git a/macros/latex/contrib/l3kernel/l3fp-trig.dtx b/macros/latex/contrib/l3kernel/l3fp-trig.dtx
index c49383a178..8b9b843e2a 100644
--- a/macros/latex/contrib/l3kernel/l3fp-trig.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-trig.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-types.dtx b/macros/latex/contrib/l3kernel/l3fp-types.dtx
index 693cec5ccc..b99be49f16 100644
--- a/macros/latex/contrib/l3kernel/l3fp-types.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-types.dtx
@@ -42,7 +42,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp.dtx b/macros/latex/contrib/l3kernel/l3fp.dtx
index 578d568978..1391e8b758 100644
--- a/macros/latex/contrib/l3kernel/l3fp.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp.dtx
@@ -49,7 +49,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
@@ -768,7 +768,8 @@
% \end{syntax}
% Defines the \meta{identifier} to stand in any further expression for
% the result of evaluating the \meta{floating point expression}, with
-% the \meta{identifier} accepting the \meta{vars} (a comma list).
+% the \meta{identifier} accepting the \meta{vars} (a non-empty
+% comma-separated list).
% The result may contain other functions, which are
% then replaced by their results if they have any. For instance,
% \begin{quote}
@@ -1376,10 +1377,10 @@
% \end{syntax}
% Computes the arcsine, arccosine, arccosecant, or arcsecant of the
% \meta{fp expr} and returns the result in degrees, in the range
-% $[-90,90]$ for \texttt{asin} and \texttt{acsc} and $[0,180]$ for
-% \texttt{acos} and \texttt{asec}. For a result in radians, use
-% \texttt{asin}, \emph{etc.} If the argument of |asin| or |acos| lies
-% outside the range $[-1,1]$, or the argument of |acsc| or |asec|
+% $[-90,90]$ for \texttt{asind} and \texttt{acscd} and $[0,180]$ for
+% \texttt{acosd} and \texttt{asecd}. For a result in radians, use
+% \texttt{asin}, \emph{etc.} If the argument of |asind| or |acosd| lies
+% outside the range $[-1,1]$, or the argument of |acscd| or |asecd|
% inside the range $(-1,1)$, an \enquote{invalid operation} exception
% is raised. \enquote{Underflow} and \enquote{overflow} occur when
% appropriate.
@@ -1424,8 +1425,8 @@
% \cs{fp_eval:n} \{ |acotd(| \meta{fp expr} |)| \}
% \cs{fp_eval:n} \{ |acotd(| \meta{fp expr_1} , \meta{fp expr_2} |)| \}
% \end{syntax}
-% Those functions yield an angle in degrees: \texttt{atand} and
-% \texttt{acotd} are their analogs in radians. The one-argument
+% Those functions yield an angle in degrees: \texttt{atan} and
+% \texttt{acot} are their analogs in radians. The one-argument
% versions compute the arctangent or arccotangent of the
% \meta{fp expr}: arctangent takes values in the range $[-90,90]$, and
% arccotangent in the range $[0,180]$. The two-argument arctangent
diff --git a/macros/latex/contrib/l3kernel/l3fparray.dtx b/macros/latex/contrib/l3kernel/l3fparray.dtx
index 36d84a593d..e06c4d39bc 100644
--- a/macros/latex/contrib/l3kernel/l3fparray.dtx
+++ b/macros/latex/contrib/l3kernel/l3fparray.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3int.dtx b/macros/latex/contrib/l3kernel/l3int.dtx
index c1dc697e71..b658aedd8d 100644
--- a/macros/latex/contrib/l3kernel/l3int.dtx
+++ b/macros/latex/contrib/l3kernel/l3int.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
@@ -1035,7 +1035,7 @@
% |=|, |<| or |>| with category code $12$.
% The \cs{else:} branch is optional.
% \begin{texnote}
-% These are both names for the \TeX{} primitive \tn{ifnum}.
+% This is the \TeX{} primitive \tn{ifnum}.
% \end{texnote}
% \end{function}
%
diff --git a/macros/latex/contrib/l3kernel/l3intarray.dtx b/macros/latex/contrib/l3kernel/l3intarray.dtx
index cbfdc48666..3d1f4b8b1f 100644
--- a/macros/latex/contrib/l3kernel/l3intarray.dtx
+++ b/macros/latex/contrib/l3kernel/l3intarray.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3kernel-functions.dtx b/macros/latex/contrib/l3kernel/l3kernel-functions.dtx
index ce3ab20970..9971ab4305 100644
--- a/macros/latex/contrib/l3kernel/l3kernel-functions.dtx
+++ b/macros/latex/contrib/l3kernel/l3kernel-functions.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
@@ -101,7 +101,7 @@
% given \meta{specific type} of token list. Produces suitable error
% messages if the \meta{control sequence} does not exist, or if it is
% not a token list variable at all, or if the \meta{control sequence}
-% differs from the result of |x|-expanding \meta{reconstruction}. If
+% differs from the result of |e|-expanding \meta{reconstruction}. If
% all of these tests succeed then the \meta{true code} is run.
% \end{function}
%
diff --git a/macros/latex/contrib/l3kernel/l3keys.dtx b/macros/latex/contrib/l3kernel/l3keys.dtx
index 9fea120c91..d5bdf4d969 100644
--- a/macros/latex/contrib/l3kernel/l3keys.dtx
+++ b/macros/latex/contrib/l3kernel/l3keys.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
@@ -1023,12 +1023,12 @@
% all). Spaces are trimmed from the ends of the \meta{key} and \meta{value},
% then one \emph{outer} set of braces is removed from the \meta{key}
% and \meta{value} as part of the processing. If you need exactly the output
-% shown above, you'll need to either \texttt{x}-type or \texttt{e}-type expand
+% shown above, you'll need to either \texttt{e}-type or \texttt{x}-type expand
% the function.
% \begin{texnote}
% The result of each list element is returned within \cs{exp_not:n}, which
% means that the converted input stream does not expand further when
-% appearing in an \texttt{x}-type or \texttt{e}-type argument expansion.
+% appearing in an \texttt{e}-type or \texttt{x}-type argument expansion.
% \end{texnote}
% \end{function}
%
@@ -1068,7 +1068,7 @@
% \begin{texnote}
% The result is returned within \cs{exp_not:n}, which means that the
% converted input stream does not expand further when appearing in an
-% \texttt{x}-type or \texttt{e}-type argument expansion.
+% \texttt{e}-type or \texttt{x}-type argument expansion.
% \end{texnote}
% \end{function}
%
@@ -1805,7 +1805,7 @@
% }
% Searching for a property means finding the last |.| in the input,
% and storing the text before and after it. Everything is turned into
-% strings, so there is no problem using an \texttt{x}-type expansion. Since
+% strings, so there is no problem using an \texttt{e}-type expansion. Since
% \cs{@@_trim_spaces:n} will turn its argument into a string anyway, this
% function uses \cs{cs_set_nopar:Npe} instead of \cs{tl_set:Ne} to gain some
% speed.
diff --git a/macros/latex/contrib/l3kernel/l3legacy.dtx b/macros/latex/contrib/l3kernel/l3legacy.dtx
index 78adefa2da..cd483bc1b8 100644
--- a/macros/latex/contrib/l3kernel/l3legacy.dtx
+++ b/macros/latex/contrib/l3kernel/l3legacy.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3luatex.dtx b/macros/latex/contrib/l3kernel/l3luatex.dtx
index c0ec4f69a0..47570a46ac 100644
--- a/macros/latex/contrib/l3kernel/l3luatex.dtx
+++ b/macros/latex/contrib/l3kernel/l3luatex.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
@@ -244,13 +244,12 @@
% Wrapper around |require'|\meta{module}|'|.
% \begin{macrocode}
\str_new:N \l_@@_err_msg_str
-\cs_generate_variant:Nn \msg_error:nnnn { nnnV }
\cs_new_protected:Npn \lua_load_module:n #1
{
\bool_if:nF { \@@_load_module_p:n { #1 } }
{
\msg_error:nnnV
- { luatex } { module-not-found } { #1 } { \l_@@_err_msg_str }
+ { luatex } { module-not-found } { #1 } \l_@@_err_msg_str
}
}
% \end{macrocode}
diff --git a/macros/latex/contrib/l3kernel/l3msg.dtx b/macros/latex/contrib/l3kernel/l3msg.dtx
index 382aab68dd..57d7f05b3d 100644
--- a/macros/latex/contrib/l3kernel/l3msg.dtx
+++ b/macros/latex/contrib/l3kernel/l3msg.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
@@ -288,7 +288,7 @@
% message, extra arguments are ignored, or empty arguments added (of
% course the sense of the message may be impaired). The four arguments are
% converted to strings before being added to the message text: the
-% \texttt{x}-type variants should be used to expand material.
+% \texttt{e}-type variants should be used to expand material.
% Note that this expansion takes place with the standard definitions in
% effect, which means that shorthands such as |\~| or |\\| are
% \emph{not} available; instead one should use \cs{iow_char:N} |\~| and
@@ -961,7 +961,7 @@
% \begin{macro}{\@@_interrupt_text:n, \@@_interrupt_more_text:n}
% First setup \TeX{}'s \tn{errhelp} register with the extra help |#1|,
% then build a nice-looking error message with |#2|. Everything is
-% done using \texttt{x}-type expansion as the new line markers are
+% done using \texttt{e}-type expansion as the new line markers are
% different for the two type of text and need to be correctly set up.
% The auxiliary \cs{@@_interrupt_more_text:n} receives its argument
% as a line-wrapped string, which is thus unaffected by expansion.
diff --git a/macros/latex/contrib/l3kernel/l3names.dtx b/macros/latex/contrib/l3kernel/l3names.dtx
index e85262831f..afd91b76b3 100644
--- a/macros/latex/contrib/l3kernel/l3names.dtx
+++ b/macros/latex/contrib/l3kernel/l3names.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3news.pdf b/macros/latex/contrib/l3kernel/l3news.pdf
index b5c1844444..1c2156589f 100644
--- a/macros/latex/contrib/l3kernel/l3news.pdf
+++ b/macros/latex/contrib/l3kernel/l3news.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news01.pdf b/macros/latex/contrib/l3kernel/l3news01.pdf
index 4d0a8ae25d..76d3d67a09 100644
--- a/macros/latex/contrib/l3kernel/l3news01.pdf
+++ b/macros/latex/contrib/l3kernel/l3news01.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news02.pdf b/macros/latex/contrib/l3kernel/l3news02.pdf
index 7342946a43..ddb8613f00 100644
--- a/macros/latex/contrib/l3kernel/l3news02.pdf
+++ b/macros/latex/contrib/l3kernel/l3news02.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news03.pdf b/macros/latex/contrib/l3kernel/l3news03.pdf
index 331b9cf1b4..4ebd7e81c0 100644
--- a/macros/latex/contrib/l3kernel/l3news03.pdf
+++ b/macros/latex/contrib/l3kernel/l3news03.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news04.pdf b/macros/latex/contrib/l3kernel/l3news04.pdf
index b860cf5ff4..9aeaf6e808 100644
--- a/macros/latex/contrib/l3kernel/l3news04.pdf
+++ b/macros/latex/contrib/l3kernel/l3news04.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news05.pdf b/macros/latex/contrib/l3kernel/l3news05.pdf
index 7e616f5a29..64be0087b8 100644
--- a/macros/latex/contrib/l3kernel/l3news05.pdf
+++ b/macros/latex/contrib/l3kernel/l3news05.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news06.pdf b/macros/latex/contrib/l3kernel/l3news06.pdf
index 77334146c0..0c13cd3cc3 100644
--- a/macros/latex/contrib/l3kernel/l3news06.pdf
+++ b/macros/latex/contrib/l3kernel/l3news06.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news07.pdf b/macros/latex/contrib/l3kernel/l3news07.pdf
index 1193adac7e..f003a75d6b 100644
--- a/macros/latex/contrib/l3kernel/l3news07.pdf
+++ b/macros/latex/contrib/l3kernel/l3news07.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news08.pdf b/macros/latex/contrib/l3kernel/l3news08.pdf
index ae70965ba3..fb00f3e886 100644
--- a/macros/latex/contrib/l3kernel/l3news08.pdf
+++ b/macros/latex/contrib/l3kernel/l3news08.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news09.pdf b/macros/latex/contrib/l3kernel/l3news09.pdf
index d9791e7186..85b20e8051 100644
--- a/macros/latex/contrib/l3kernel/l3news09.pdf
+++ b/macros/latex/contrib/l3kernel/l3news09.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news10.pdf b/macros/latex/contrib/l3kernel/l3news10.pdf
index 366041530a..4dfef6f18d 100644
--- a/macros/latex/contrib/l3kernel/l3news10.pdf
+++ b/macros/latex/contrib/l3kernel/l3news10.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news11.pdf b/macros/latex/contrib/l3kernel/l3news11.pdf
index 410448f654..55e13420dc 100644
--- a/macros/latex/contrib/l3kernel/l3news11.pdf
+++ b/macros/latex/contrib/l3kernel/l3news11.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news12.pdf b/macros/latex/contrib/l3kernel/l3news12.pdf
index 127946bd80..b1c9c79ff8 100644
--- a/macros/latex/contrib/l3kernel/l3news12.pdf
+++ b/macros/latex/contrib/l3kernel/l3news12.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3pdf.dtx b/macros/latex/contrib/l3kernel/l3pdf.dtx
index 9c6172caaf..9380b62220 100644
--- a/macros/latex/contrib/l3kernel/l3pdf.dtx
+++ b/macros/latex/contrib/l3kernel/l3pdf.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3prefixes.csv b/macros/latex/contrib/l3kernel/l3prefixes.csv
index 8b4ead7bf3..b6f56360ca 100644
--- a/macros/latex/contrib/l3kernel/l3prefixes.csv
+++ b/macros/latex/contrib/l3kernel/l3prefixes.csv
@@ -243,6 +243,7 @@ substances,substances,Clemens Niederberger,https://github.com/cgnieder/substance
sys,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2015-09-07,2015-09-08,
tag,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2019-06-02,2019-06-02,
tasks,tasks,Clemens Niederberger,https://github.com/cgnieder/tasks/,https://github.com/cgnieder/tasks.git,https://github.com/cgnieder/cgnieder/tasks/issues,2013-03-16,2020-04-14,
+tbl,latex2e,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex2e.git,https://github.com/latex3/latex2e/issues,2023-10-23,2023-10-23,
tblr,tabularray,Jianrui Lyu,https://github.com/lvjr/tabularray,https://github.com/lvjr/tabularray.git,https://github.com/lvjr/tabularray/issues,2022-04-02,2022-04-02,
tcobox,tcolorbox,Thomas F. Sturm,https://github.com/T-F-S/tcolorbox,https://github.com/T-F-S/tcolorbox.git,https://github.com/T-F-S/tcolorbox/issues,2020-02-19,2020-02-19,
template,latex2e,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex2e.git,https://github.com/latex3/latex2e/issues,2021-01-20,2021-03-03,
diff --git a/macros/latex/contrib/l3kernel/l3prefixes.pdf b/macros/latex/contrib/l3kernel/l3prefixes.pdf
index de3f86bdb7..29c821848c 100644
--- a/macros/latex/contrib/l3kernel/l3prefixes.pdf
+++ b/macros/latex/contrib/l3kernel/l3prefixes.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3prg.dtx b/macros/latex/contrib/l3kernel/l3prg.dtx
index c676e7343e..f57c433fd6 100644
--- a/macros/latex/contrib/l3kernel/l3prg.dtx
+++ b/macros/latex/contrib/l3kernel/l3prg.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3prop.dtx b/macros/latex/contrib/l3kernel/l3prop.dtx
index 8fb7648af5..320a0b926b 100644
--- a/macros/latex/contrib/l3kernel/l3prop.dtx
+++ b/macros/latex/contrib/l3kernel/l3prop.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
@@ -335,8 +335,8 @@
% \cs{prop_get:NnN}.
% The result is returned within the \tn{unexpanded}
% primitive (\cs{exp_not:n}), which means that the \meta{value}
-% does not expand further when appearing in an \texttt{x}-type
-% or \texttt{e}-type argument expansion.
+% does not expand further when appearing in an \texttt{e}-type
+% or \texttt{x}-type argument expansion.
% \end{texnote}
% \end{function}
%
@@ -358,7 +358,7 @@
% \begin{texnote}
% The result is returned within the \tn{unexpanded} primitive
% (\cs{exp_not:n}), which means that the key--value list does not expand
-% further when appearing in an \texttt{x}-type or \texttt{e}-type argument expansion.
+% further when appearing in an \texttt{e}-type or \texttt{x}-type argument expansion.
% It also needs exactly two steps of expansion.
% \end{texnote}
% \end{function}
@@ -1258,7 +1258,7 @@
% \meta{value} may contain arbitrary tokens, it is not safe to include
% them in the argument of \cs{@@_split:NnTF}. We thus start by
% storing in \cs{l_@@_internal_tl} tokens which (after
-% \texttt{x}-expansion) encode the key--value pair. This variable can
+% \texttt{e}-expansion) encode the key--value pair. This variable can
% safely be used in \cs{@@_split:NnTF}. If the \meta{key} was absent,
% append the new key--value to the list.
% Otherwise concatenate the extracts |##1|
diff --git a/macros/latex/contrib/l3kernel/l3quark.dtx b/macros/latex/contrib/l3kernel/l3quark.dtx
index d515229582..d5687886f5 100644
--- a/macros/latex/contrib/l3kernel/l3quark.dtx
+++ b/macros/latex/contrib/l3kernel/l3quark.dtx
@@ -31,7 +31,7 @@
% \fi
%
% \title{^^A
-% The \pkg{l3quark} package\\ Quarks^^A
+% The \pkg{l3quark} package\\ Quarks and scan marks^^A
% }
%
% \author{^^A
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3regex.dtx b/macros/latex/contrib/l3kernel/l3regex.dtx
index cd7bd9f33b..c07583f539 100644
--- a/macros/latex/contrib/l3kernel/l3regex.dtx
+++ b/macros/latex/contrib/l3kernel/l3regex.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
@@ -1090,7 +1090,7 @@
% When actually building the result,
% \begin{itemize}
% \item \tn{toks}\meta{position} holds \meta{tokens} which \texttt{o}-
-% and \texttt{x}-expand to the \meta{position}-th token in the query.
+% and \texttt{e}-expand to the \meta{position}-th token in the query.
% \item \cs{g_@@_balance_intarray} holds the balance of begin-group and
% end-group character tokens which appear before that point in the
% token list.
@@ -1160,12 +1160,12 @@
%
% \begin{macro}{\@@_toks_put_left:Ne}
% \begin{macro}{\@@_toks_put_right:Ne, \@@_toks_put_right:Nn}
-% During the building phase we wish to add \texttt{x}-expanded
+% During the building phase we wish to add \texttt{e}-expanded
% material to \tn{toks}, either to the left or to the right. The
% expansion is done \enquote{by hand} for optimization (these
% operations are used quite a lot). The \texttt{Nn} version of
% \cs{@@_toks_put_right:Ne} is provided because it is more
-% efficient than \texttt{x}-expanding with \cs{exp_not:n}.
+% efficient than \texttt{e}-expanding with \cs{exp_not:n}.
% \begin{macrocode}
\cs_new_protected:Npn \@@_toks_put_left:Ne #1#2
{
@@ -1188,7 +1188,7 @@
% \begin{macro}[rEXP]{\@@_curr_cs_to_str:}
% Expands to the string representation of the token (known to be a
% control sequence) at the current position \cs{l_@@_curr_pos_int}.
-% It should only be used in \texttt{x}-expansion to avoid losing a
+% It should only be used in \texttt{e}/\texttt{x}-expansion to avoid losing a
% leading space.
% \begin{macrocode}
\cs_new:Npn \@@_curr_cs_to_str:
@@ -1705,14 +1705,14 @@
% a string, then read from left to right, interpreting backslashes as
% escaping the next character. Unescaped characters are fed to the
% function \meta{inline~1}, and escaped characters are fed to the function
-% \meta{inline~2} within an \texttt{x}-expansion context (typically those
+% \meta{inline~2} within an \texttt{e}-expansion context (typically those
% functions perform some tests on their argument to decide how to output
% them). The escape sequences |\a|, |\e|, |\f|, |\n|, |\r|, |\t| and
% |\x| are recognized, and those are replaced by the corresponding
% character, then fed to \meta{inline~3}. The result is then left in the
% input stream. Spaces are ignored unless escaped.
%
-% The conversion is done within an \texttt{x}-expanding assignment.
+% The conversion is done within an \texttt{e}-expanding assignment.
%
% \begin{macro}{\@@_escape_use:nnnn}
% The result is built in \cs{l_@@_internal_a_tl}, which is then left
@@ -2393,7 +2393,7 @@
% \begin{macro}{\@@_compile:w, \@@_compile_end:}
% Used when compiling a user regex or a regex for the |\c{...}| escape
% sequence within another regex. Start building a token list within a
-% group (with \texttt{x}-expansion at the outset), and set a few
+% group (with \texttt{e}-expansion at the outset), and set a few
% variables (group level, catcodes), then start the first branch. At
% the end, make sure there are no dangling classes nor groups, close
% the last branch: we are done building \cs{l_@@_internal_regex}.
@@ -3638,7 +3638,7 @@
%
% \begin{macro}[EXP]{\@@_compile_u_loop:NN}
% We collect the characters for the argument of |\u| within an
-% \texttt{x}-expanding assignment. In principle we could just wait to
+% \texttt{e}-expanding assignment. In principle we could just wait to
% encounter a right brace, but this is unsafe: if the right brace was
% missing, then we would reach the end-markers of the regex, and
% continue, leading to obscure fatal errors. Instead, we only allow
@@ -4220,7 +4220,7 @@
\cs_new_protected:Npn \@@_show_item_exact_cs:n #1
{
\seq_set_split:Nnn \l_@@_internal_seq { \scan_stop: } {#1}
- \seq_set_map_x:NNn \l_@@_internal_seq
+ \seq_set_map_e:NNn \l_@@_internal_seq
\l_@@_internal_seq { \iow_char:N\\##1 }
\@@_show_one:n
{ control~sequence~ \seq_use:Nn \l_@@_internal_seq { ~or~ } }
@@ -5363,7 +5363,7 @@
}
\cs_new_protected:Npn \@@_match_once_init_aux:
{
- \tl_build_clear:N \l_@@_matched_analysis_tl
+ \tl_build_begin:N \l_@@_matched_analysis_tl
\tl_clear:N \l_@@_curr_analysis_tl
}
% \end{macrocode}
@@ -5663,7 +5663,7 @@
\l_@@_fresh_thread_bool
\int_set_eq:NN \l_@@_success_pos_int \l_@@_curr_pos_int
\int_set_eq:NN \l_@@_last_char_success_int \l_@@_last_char_int
- \tl_build_clear:N \l_@@_matched_analysis_tl
+ \tl_build_begin:N \l_@@_matched_analysis_tl
\tl_set_eq:NN \l_@@_success_submatches_tl
\l_@@_curr_submatches_tl
\prg_break:
@@ -5748,7 +5748,7 @@
% \cs{exp_not:n} requires a braced argument. As far as I can tell, it
% is only needed if the user tries to include in the replacement text
% a control sequence set equal to a macro parameter character, such as
-% \cs{c_parameter_token}. Indeed, within an \texttt{x}-expanding
+% \cs{c_parameter_token}. Indeed, within an \texttt{e}/\texttt{x}-expanding
% assignment, \cs{exp_not:N}~|#| behaves as a single |#|, whereas
% \cs{exp_not:n}~|{#}| behaves as a doubled |##|.
% \begin{macrocode}
@@ -5774,7 +5774,7 @@
% exclusive. The function \cs{@@_query_range:nn} \Arg{min}
% \Arg{max} unpacks registers from the position \meta{min} to the
% position $\meta{max}-1$ included. Once this is expanded, a second
-% \texttt{x}-expansion results in the actual tokens from the
+% \texttt{e}-expansion results in the actual tokens from the
% query. That second expansion is only done by user functions at the
% very end of their operation, after checking (and correcting) the
% brace balance first.
@@ -6056,9 +6056,7 @@
% Unless the submatch appears inside a |\c{...}| or |\u{...}|
% construction, it must be taken into account in the brace balance.
% Later on, |##1| will be replaced by a pointer to the $0$-th submatch for a
-% given match. There is an \cs{exp_not:N} here as at the point-of-use
-% of \cs{g_@@_balance_tl} there is an \texttt{x}-type expansion which is needed
-% to get |##1| in correctly.
+% given match.
% \begin{macrocode}
\cs_new_protected:Npn \@@_replacement_put_submatch:n #1
{
@@ -6292,7 +6290,7 @@
%
% \begin{macro}{\@@_replacement_c_A:w}
% For an active character, expansion must be avoided, twice because we
-% later do two \texttt{x}-expansions, to unpack \tn{toks} for the
+% later do two \texttt{e}-expansions, to unpack \tn{toks} for the
% query, and to expand their contents to tokens of the query.
% \begin{macrocode}
\char_set_catcode_active:N \^^@
@@ -6305,7 +6303,7 @@
% An explicit begin-group token increases the balance, unless within a
% |\c{...}| or |\u{...}| construction. Add the desired begin-group
% character, using the standard \cs{if_false:} trick. We eventually
-% \texttt{x}-expand twice. The first time must yield a balanced token
+% \texttt{e}-expand twice. The first time must yield a balanced token
% list, and the second one gives the bare begin-group token. The
% \cs{exp_after:wN} is not strictly needed, but is more consistent
% with \pkg{l3tl-analysis}.
@@ -6326,7 +6324,7 @@
% This is not quite catcode-related: when the user requests a
% character with category \enquote{control sequence}, the
% one-character control symbol is returned. As for the active
-% character, we prepare for two \texttt{x}-expansions.
+% character, we prepare for two \texttt{e}-expansions.
% \begin{macrocode}
\cs_new_protected:Npn \@@_replacement_c_C:w #1#2
{
@@ -6347,7 +6345,7 @@
% \end{macro}
%
% \begin{macro}{\@@_replacement_c_E:w}
-% Similar to the begin-group case, the second \texttt{x}-expansion
+% Similar to the begin-group case, the second \texttt{e}-expansion
% produces the bare end-group token.
% \begin{macrocode}
\char_set_catcode_group_end:N \^^@
@@ -6391,7 +6389,7 @@
%
% \begin{macro}{\@@_replacement_c_P:w}
% For macro parameters, expansion is a tricky issue. We need to
-% prepare for two \texttt{x}-expansions and passing through various
+% prepare for two \texttt{e}-expansions and passing through various
% macro definitions. Note that we cannot replace one \cs{exp_not:n} by
% doubling the macro parameter characters because this would misbehave
% if a mischievous user asks for |\c{\cP\#}|, since that macro
@@ -7213,7 +7211,7 @@
% this match; we need to add the tokens from the end of the match to
% the end of the query. Finally, store the result in the user's
% variable after closing the group: this step involves an additional
-% \texttt{x}-expansion, and checks that braces are balanced in the
+% \texttt{e}-expansion, and checks that braces are balanced in the
% final result.
% \begin{macrocode}
\cs_new_protected:Npn \@@_replace_once:nnN #1#2
@@ -7303,7 +7301,7 @@
% \@@_group_end_replace:N, \@@_group_end_replace_try:,
% \@@_group_end_replace_check:w, \@@_group_end_replace_check:n
% }
-% At this stage \cs{l_@@_internal_a_tl} (|x|-expands to the desired
+% At this stage \cs{l_@@_internal_a_tl} (|e|-expands to the desired
% result). Guess from \cs{l_@@_balance_int} the number of braces to
% add before or after the result then try expanding. The simplest
% case is when \cs{l_@@_internal_a_tl} together with the braces we
@@ -7476,7 +7474,7 @@
\@@_single_match:
#1
\@@_match_init:
- \tl_build_clear:N \l_@@_input_tl
+ \tl_build_begin:N \l_@@_input_tl
\@@_match_once_init:
\peek_analysis_map_inline:n
{
@@ -7499,7 +7497,7 @@
% match. For \cs{peek_regex_remove_once:nTF} we reinsert the tokens
% seen only if the match failed; otherwise we just reinsert the
% tokens~|#1|, with one expansion. To be more precise, |#1| consists
-% of tokens that \texttt{o}-expand and \texttt{x}-expand to the last
+% of tokens that \texttt{o}-expand and \texttt{e}-expand to the last
% token seen, for example it is \cs{exp_not:N} \meta{cs} for a control
% sequence. This means that just doing \cs{exp_after:wN}
% \cs{l_@@_peek_true_tl} |#1| would be unsafe because the expansion of
@@ -7661,12 +7659,12 @@
% \begin{macro}{\@@_peek_replacement_put:n}
% While building the replacement function
% \cs{@@_replacement_do_one_match:n}, we often want to put simple
-% material, given as |#1|, whose \texttt{x}-expansion
+% material, given as |#1|, whose \texttt{e}-expansion
% \texttt{o}-expands to a single token. Normally we can just add the
% token to \cs{l_@@_build_tl}, but for
% \cs{peek_regex_replace_once:nnTF} we eventually want to do some
% strange expansion that is basically using \cs{exp_after:wN} to jump
-% through numerous tokens (we cannot use \texttt{x}-expansion like for
+% through numerous tokens (we cannot use \texttt{e}-expansion like for
% \cs{regex_replace_once:nnNTF} because it is ok for the result to be
% unbalanced since we insert it in the input stream rather than
% storing it. When within a csname we don't do any such shenanigan
diff --git a/macros/latex/contrib/l3kernel/l3seq.dtx b/macros/latex/contrib/l3kernel/l3seq.dtx
index 56662dc623..d9ab9ba1dd 100644
--- a/macros/latex/contrib/l3kernel/l3seq.dtx
+++ b/macros/latex/contrib/l3kernel/l3seq.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
@@ -327,8 +327,8 @@
% \begin{texnote}
% The result is returned within the \tn{unexpanded}
% primitive (\cs{exp_not:n}), which means that the \meta{item}
-% does not expand further when appearing in an \texttt{x}-type
-% or \texttt{e}-type argument expansion.
+% does not expand further when appearing in an \texttt{e}-type
+% or \texttt{x}-type argument expansion.
% \end{texnote}
% \end{function}
%
@@ -342,8 +342,8 @@
% \begin{texnote}
% The result is returned within the \tn{unexpanded}
% primitive (\cs{exp_not:n}), which means that the \meta{item}
-% does not expand further when appearing in an \texttt{x}-type
-% or \texttt{e}-type argument expansion.
+% does not expand further when appearing in an \texttt{e}-type
+% or \texttt{x}-type argument expansion.
% \end{texnote}
% \end{function}
%
@@ -740,15 +740,15 @@
% \end{texnote}
% \end{function}
%
-% \begin{function}[added = 2020-07-16]
-% {\seq_set_map_x:NNn, \seq_gset_map_x:NNn}
+% \begin{function}[added = 2020-07-16, updated = 2023-10-26]
+% {\seq_set_map_e:NNn, \seq_gset_map_e:NNn}
% \begin{syntax}
-% \cs{seq_set_map_x:NNn} \meta{seq~var_1} \meta{seq~var_2} \Arg{inline function}
+% \cs{seq_set_map_e:NNn} \meta{seq~var_1} \meta{seq~var_2} \Arg{inline function}
% \end{syntax}
% Applies \meta{inline function} to every \meta{item} stored
% within the \meta{seq~var_2}. The \meta{inline function} should
% consist of code which will receive the \meta{item} as |#1|.
-% The sequence resulting from \texttt{x}-expanding
+% The sequence resulting from \texttt{e}-expanding
% \meta{inline function} applied to each \meta{item}
% is assigned to \meta{seq~var_1}. As such, the code
% in \meta{inline function} should be expandable.
@@ -796,8 +796,8 @@
% \begin{texnote}
% The result is returned within the \tn{unexpanded}
% primitive (\cs{exp_not:n}), which means that the \meta{items}
-% do not expand further when appearing in an \texttt{x}-type
-% or \texttt{e}-type argument expansion.
+% do not expand further when appearing in an \texttt{e}-type
+% or \texttt{x}-type argument expansion.
% \end{texnote}
% \end{function}
%
@@ -821,8 +821,8 @@
% \begin{texnote}
% The result is returned within the \tn{unexpanded}
% primitive (\cs{exp_not:n}), which means that the \meta{items}
-% do not expand further when appearing in an \texttt{x}-type
-% or \texttt{e}-type argument expansion.
+% do not expand further when appearing in an \texttt{e}-type
+% or \texttt{x}-type argument expansion.
% \end{texnote}
% \end{function}
%
@@ -1308,14 +1308,14 @@
% spaces the item is enclosed within braces. After
% \cs{tl_replace_all:Nnn}, the token list \cs{l_@@_internal_a_tl}
% is a repetition of the pattern
-% \cs{@@_set_split_auxi:w} \cs{prg_do_nothing:}
+% \cs{@@_set_split:Nw} \cs{prg_do_nothing:}
% \meta{item with spaces} \cs{@@_set_split_end:}.
-% Then, \texttt{x}-expansion causes \cs{@@_set_split_auxi:w}
+% Then, \texttt{e}-expansion causes \cs{@@_set_split:Nw}
% to trim spaces, and leaves its result as
-% \cs{@@_set_split_auxii:w} \meta{trimmed item}
+% \cs{@@_set_split:w} \meta{trimmed item}
% \cs{@@_set_split_end:}. This is then converted
% to the \pkg{l3seq} internal structure by another
-% \texttt{x}-expansion. In the first step, we insert
+% \texttt{e}-expansion. In the first step, we insert
% \cs{prg_do_nothing:} to avoid losing braces too early:
% that would cause space trimming to act within those
% lost braces. The second step is solely there to strip
@@ -1480,7 +1480,7 @@
%
% \begin{macro}{\@@_wrap_item:n}
% This function converts its argument to a proper sequence item
-% in an \texttt{x}-expansion context.
+% in an \texttt{e}-expansion context.
% \begin{macrocode}
\cs_new:Npn \@@_wrap_item:n #1 { \exp_not:n { \@@_item:n {#1} } }
% \end{macrocode}
@@ -1542,15 +1542,15 @@
% items one at a time to an intermediate sequence.
% The approach taken is therefore similar to
% that in \cs{@@_pop_right:NNN}, using a \enquote{flexible}
-% \texttt{x}-type expansion to do most of the work. As \cs{tl_if_eq:nnT}
+% \texttt{e}-type expansion to do most of the work. As \cs{tl_if_eq:nnT}
% is not expandable, a two-part strategy is needed. First, the
-% \texttt{x}-type expansion uses \cs{str_if_eq:nnT} to find potential
+% \texttt{e}-type expansion uses \cs{str_if_eq:nnT} to find potential
% matches. If one is found, the expansion is halted and the necessary
-% set up takes place to use the \cs{tl_if_eq:NNT} test. The \texttt{x}-type
+% set up takes place to use the \cs{tl_if_eq:NNT} test. The \texttt{e}-type
% is started again, including all of the items copied already. This
% happens repeatedly until the entire sequence has been scanned. The code
-% is set up to avoid needing and intermediate scratch list: the lead-off
-% \texttt{x}-type expansion (|#1 #2 {#2}|) ensures that nothing is lost.
+% is set up to avoid needing an intermediate scratch list: the lead-off
+% \texttt{e}-type expansion (|#1 #2 {#2}|) ensures that nothing is lost.
% \begin{macrocode}
\cs_new_protected:Npn \seq_remove_all:Nn
{ \@@_remove_all_aux:NNn \__kernel_tl_set:Ne }
@@ -1993,7 +1993,7 @@
% use some of the same ideas as getting from the right. What is needed is a
% \enquote{flexible length} way to set a token list variable. This is
% supplied by the |{ \if_false: } \fi:| \ldots
-% |\if_false: { \fi: }| construct. Using an \texttt{x}-type
+% |\if_false: { \fi: }| construct. Using an \texttt{e}-type
% expansion and a \enquote{non-expanding} definition for \cs{@@_item:n},
% the left-most $n - 1$ entries in a sequence of $n$ items are stored
% back in the sequence. That needs a loop of unknown length, hence using the
@@ -2280,7 +2280,7 @@
% }
% \UnitTested
% This is just a specialised version of the in-line mapping function,
-% using an \texttt{x}-type expansion for the code set up so that the
+% using an \texttt{e}-type expansion for the code set up so that the
% number of |#| tokens required is as expected.
% \begin{macrocode}
\cs_new_protected:Npn \seq_map_variable:NNn #1#2#3
@@ -2389,17 +2389,17 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}{\seq_set_map_x:NNn, \seq_gset_map_x:NNn}
-% \begin{macro}{\@@_set_map_x:NNNn}
+% \begin{macro}{\seq_set_map_e:NNn, \seq_gset_map_e:NNn}
+% \begin{macro}{\@@_set_map_e:NNNn}
% Very similar to \cs{seq_set_filter:NNn}. We could actually
% merge the two within a single function, but it would have weird
% semantics.
% \begin{macrocode}
-\cs_new_protected:Npn \seq_set_map_x:NNn
- { \@@_set_map_x:NNNn \__kernel_tl_set:Ne }
-\cs_new_protected:Npn \seq_gset_map_x:NNn
- { \@@_set_map_x:NNNn \__kernel_tl_gset:Ne }
-\cs_new_protected:Npn \@@_set_map_x:NNNn #1#2#3#4
+\cs_new_protected:Npn \seq_set_map_e:NNn
+ { \@@_set_map_e:NNNn \__kernel_tl_set:Ne }
+\cs_new_protected:Npn \seq_gset_map_e:NNn
+ { \@@_set_map_e:NNNn \__kernel_tl_gset:Ne }
+\cs_new_protected:Npn \@@_set_map_e:NNNn #1#2#3#4
{
\@@_push_item_def:n { \exp_not:N \@@_item:n {#4} }
#1 #2 { #3 }
@@ -2411,7 +2411,7 @@
%
% \begin{macro}{\seq_set_map:NNn, \seq_gset_map:NNn}
% \begin{macro}{\@@_set_map:NNNn}
-% Similar to \cs{seq_set_map_x:NNn}, but prevents expansion of the
+% Similar to \cs{seq_set_map_e:NNn}, but prevents expansion of the
% <inline function>.
% \begin{macrocode}
\cs_new_protected:Npn \seq_set_map:NNn
diff --git a/macros/latex/contrib/l3kernel/l3skip.dtx b/macros/latex/contrib/l3kernel/l3skip.dtx
index 3130ef8597..9dd5b3cbed 100644
--- a/macros/latex/contrib/l3kernel/l3skip.dtx
+++ b/macros/latex/contrib/l3kernel/l3skip.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
@@ -907,7 +907,7 @@
% Inserts a horizontal \meta{skip} into the current list.
% The argument can also be a \meta{dim}.
% \begin{texnote}
-% \cs{skip_horizontal:N} is the \TeX{} primitive \tn{hskip} renamed.
+% \cs{skip_horizontal:N} is the \TeX{} primitive \tn{hskip}.
% \end{texnote}
% \end{function}
%
@@ -920,7 +920,7 @@
% Inserts a vertical \meta{skip} into the current list.
% The argument can also be a \meta{dim}.
% \begin{texnote}
-% \cs{skip_vertical:N} is the \TeX{} primitive \tn{vskip} renamed.
+% \cs{skip_vertical:N} is the \TeX{} primitive \tn{vskip}.
% \end{texnote}
% \end{function}
%
diff --git a/macros/latex/contrib/l3kernel/l3sort.dtx b/macros/latex/contrib/l3kernel/l3sort.dtx
index 0a987712f3..a82fa5c16f 100644
--- a/macros/latex/contrib/l3kernel/l3sort.dtx
+++ b/macros/latex/contrib/l3kernel/l3sort.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3str-convert.dtx b/macros/latex/contrib/l3kernel/l3str-convert.dtx
index c4fc416d42..a36a77ec18 100644
--- a/macros/latex/contrib/l3kernel/l3str-convert.dtx
+++ b/macros/latex/contrib/l3kernel/l3str-convert.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
@@ -345,7 +345,7 @@
%
% \begin{variable}{str_byte, str_error}
% Conversions from one \meta{encoding}/\meta{escaping} pair to another
-% are done within \texttt{x}-expanding assignments. Errors are
+% are done within \texttt{e}-expanding assignments. Errors are
% signalled by raising the relevant flag.
% \begin{macrocode}
\flag_new:n { str_byte }
@@ -979,7 +979,7 @@
% non-Unicode-aware engines we use a fall-back character |?| rather
% than nothing when given a character code outside $[0,255]$. We
% detect the presence of bad characters using a flag and only produce
-% a single error after the \texttt{x}-expanding assignment.
+% a single error after the \texttt{e}-expanding assignment.
% \begin{macrocode}
\bool_lazy_any:nTF
{
@@ -2515,7 +2515,7 @@
% its second argument (expanded or not). It sets \cs{@@_tmp:w} to
% expand to the character code of either of its two arguments
% depending on endianness, then triggers the \texttt{_loop} auxiliary
-% inside an \texttt{x}-expanding assignment to \cs{g_@@_result_tl}.
+% inside an \texttt{e}-expanding assignment to \cs{g_@@_result_tl}.
%
% The \texttt{_loop} auxiliary first checks for the end-of-string
% marker \cs{s_@@_stop}, calling the \texttt{_end} auxiliary if
diff --git a/macros/latex/contrib/l3kernel/l3str.dtx b/macros/latex/contrib/l3kernel/l3str.dtx
index 99c0f980a5..6aca45dae0 100644
--- a/macros/latex/contrib/l3kernel/l3str.dtx
+++ b/macros/latex/contrib/l3kernel/l3str.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
@@ -1036,7 +1036,7 @@
% simplified version of the token list code because neither the
% delimiter nor the replacement can contain macro parameters or
% braces. The delimiter \cs{s_@@_mark} cannot appear in the string to
-% edit so it is used in all cases. Some |x|-expansion is unnecessary.
+% edit so it is used in all cases. Some |e|-expansion is unnecessary.
% There is no need to avoid losing braces nor to protect against
% expansion. The ending code is much simplified and does not need to
% hide in braces.
@@ -1266,7 +1266,7 @@
{ \@@_case:nw {#1} #2 {#1} { } \s_@@_mark {#3} \s_@@_mark {#4} \s_@@_stop }
\cs_generate_variant:Nn \str_case:nn { V , o , e , nV , nv }
\prg_generate_conditional_variant:Nnn \str_case:nn
- { V , o , nV , nv } { T , F , TF }
+ { V , o , e , nV , nv } { T , F , TF }
\cs_new_eq:NN \str_case:Nn \str_case:Vn
\cs_new_eq:NN \str_case:NnT \str_case:VnT
\cs_new_eq:NN \str_case:NnF \str_case:VnF
diff --git a/macros/latex/contrib/l3kernel/l3styleguide.pdf b/macros/latex/contrib/l3kernel/l3styleguide.pdf
index 945554d2f4..fdaafb1a43 100644
--- a/macros/latex/contrib/l3kernel/l3styleguide.pdf
+++ b/macros/latex/contrib/l3kernel/l3styleguide.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3styleguide.tex b/macros/latex/contrib/l3kernel/l3styleguide.tex
index 995a5d3668..704fc29a32 100644
--- a/macros/latex/contrib/l3kernel/l3styleguide.tex
+++ b/macros/latex/contrib/l3kernel/l3styleguide.tex
@@ -32,7 +32,7 @@ The released version of this bundle is available from CTAN.
{latex-team@latex-project.org}%
}%
}
-\date{Released 2023-10-23}
+\date{Released 2023-11-01}
\begin{document}
diff --git a/macros/latex/contrib/l3kernel/l3syntax-changes.pdf b/macros/latex/contrib/l3kernel/l3syntax-changes.pdf
index f2db75a12a..1fd86e3b60 100644
--- a/macros/latex/contrib/l3kernel/l3syntax-changes.pdf
+++ b/macros/latex/contrib/l3kernel/l3syntax-changes.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3syntax-changes.tex b/macros/latex/contrib/l3kernel/l3syntax-changes.tex
index d93e7bc8dc..e9a9840a5f 100644
--- a/macros/latex/contrib/l3kernel/l3syntax-changes.tex
+++ b/macros/latex/contrib/l3kernel/l3syntax-changes.tex
@@ -32,7 +32,7 @@ The released version of this bundle is available from CTAN.
{latex-team@latex-project.org}%
}%
}
-\date{Released 2023-10-23}
+\date{Released 2023-11-01}
\newcommand{\TF}{\textit{(TF)}}
diff --git a/macros/latex/contrib/l3kernel/l3sys.dtx b/macros/latex/contrib/l3kernel/l3sys.dtx
index 577e4daa19..65c64f4da3 100644
--- a/macros/latex/contrib/l3kernel/l3sys.dtx
+++ b/macros/latex/contrib/l3kernel/l3sys.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
@@ -54,7 +54,7 @@
% \begin{variable}[added = 2015-09-19, updated = 2019-10-27]{\c_sys_jobname_str}
% Constant that gets the \enquote{job name} assigned when \TeX{} starts.
% \begin{texnote}
-% This copies the contents of the primitive \tn{jobname}. For technical
+% This is the \TeX{} primitive \tn{jobname}. For technical
% reasons, the string here is not of the same internal form as other,
% but may be manipulated using normal string functions.
% \end{texnote}
@@ -73,7 +73,8 @@
% The date and time at which the current job was started: these are
% all reported as integers.
% \begin{texnote}
-% Whilst the underlying primitives can be altered by the user, this
+% Whilst the underlying \TeX{} primitives \tn{time}, \tn{day}, \tn{month},
+% and~\tn{year} can be altered by the user, this
% interface to the time and date is intended to be the \enquote{real}
% values.
% \end{texnote}
diff --git a/macros/latex/contrib/l3kernel/l3term-glossary.pdf b/macros/latex/contrib/l3kernel/l3term-glossary.pdf
index ffdbc76f29..1bb44c049e 100644
--- a/macros/latex/contrib/l3kernel/l3term-glossary.pdf
+++ b/macros/latex/contrib/l3kernel/l3term-glossary.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3term-glossary.tex b/macros/latex/contrib/l3kernel/l3term-glossary.tex
index 25a510d9e6..03ec043f69 100644
--- a/macros/latex/contrib/l3kernel/l3term-glossary.tex
+++ b/macros/latex/contrib/l3kernel/l3term-glossary.tex
@@ -32,7 +32,7 @@ The released version of this bundle is available from CTAN.
{latex-team@latex-project.org}%
}%
}
-\date{Released 2023-10-23}
+\date{Released 2023-11-01}
\newcommand{\TF}{\textit{(TF)}}
diff --git a/macros/latex/contrib/l3kernel/l3text-case.dtx b/macros/latex/contrib/l3kernel/l3text-case.dtx
index e34e9043a5..7c4eca5178 100644
--- a/macros/latex/contrib/l3kernel/l3text-case.dtx
+++ b/macros/latex/contrib/l3kernel/l3text-case.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
@@ -192,8 +192,12 @@
% \begin{macro}[EXP]{\@@_change_case_lower_sigma:nnnnn}
% \begin{macro}[EXP]{\@@_change_case_lower_sigma:nnnnw}
% \begin{macro}[EXP]{\@@_change_case_lower_sigma:nnnnN}
+% \begin{macro}[EXP]
+% {
+% \@@_change_case_codepoint_title_auxi:nnnn ,
+% \@@_change_case_codepoint_title_auxii:nnnn
+% }
% \begin{macro}[EXP]{\@@_change_case_codepoint_title:nnn}
-% \begin{macro}[EXP]{\@@_change_case_codepoint_title:nnnnn}
% \begin{macro}[EXP]{\@@_change_case_codepoint:nnnnn}
% \begin{macro}[EXP]{\@@_change_case_codepoint:nn}
% \begin{macro}[EXP]
@@ -695,40 +699,39 @@
\@@_change_case_loop:nnnw {#2} {#3} {#4} #5
}
% \end{macrocode}
-% For titlecasing, we need to fully expand the new character to see if it
-% is a letter (or active).
+% For titlecasing, we need to obtain the general category of the current
+% codepoint.
% \begin{macrocode}
\cs_new:Npn \@@_change_case_codepoint_title:nnnn #1#2#3#4
{
\bool_if:NTF \l_text_titlecase_check_letter_bool
{
- \tl_if_single:nTF {#4}
+ \exp_args:Ne \@@_change_case_codepoint_title_auxi:nnnn
{
- \bool_lazy_or:nnTF
- { \token_if_letter_p:N #4 }
- {
- \bool_lazy_and_p:nn
- { \token_if_active_p:N #4 }
- { ! \int_compare_p:nNn {`#4} < { "80 } }
- }
- { \@@_change_case_codepoint_title:nnn }
- { \@@_change_case_codepoint_title:nnnnn { title } {#1} }
+ \codepoint_to_category:n
+ { \@@_codepoint_from_chars:Nw #4 }
}
- { \@@_change_case_codepoint_title:nnn }
}
{ \@@_change_case_codepoint_title:nnn }
{#2} {#3} {#4}
}
+\cs_new:Npn \@@_change_case_codepoint_title_auxi:nnnn #1#2#3#4
+ {
+ \tl_if_head_eq_charcode:nNTF {#1} { L }
+ { \@@_change_case_codepoint_title:nnn }
+ { \@@_change_case_codepoint_title_auxii:nnnn { title } }
+ {#2} {#3} {#4}
+ }
\cs_new:Npn \@@_change_case_codepoint_title:nnn #1#2#3
- { \@@_change_case_codepoint_title:nnnnn { title } { end } {#1} {#2} {#3} }
-\cs_new:Npn \@@_change_case_codepoint_title:nnnnn #1#2#3#4#5
+ { \@@_change_case_codepoint_title_auxii:nnnn { end } {#1} {#2} {#3} }
+\cs_new:Npn \@@_change_case_codepoint_title_auxii:nnnn #1#2#3#4
{
- \cs_if_exist_use:cF { @@_change_case_title_ #4 :nnnnn }
+ \cs_if_exist_use:cF { @@_change_case_title_ #3 :nnnnn }
{
- \cs_if_exist_use:cF { @@_change_case_upper_ #4 :nnnnn }
+ \cs_if_exist_use:cF { @@_change_case_upper_ #3 :nnnnn }
{ \@@_change_case_codepoint:nnnnn }
}
- {#1} {#2} {#3} {#4} {#5}
+ { title } {#1} {#2} {#3} {#4}
}
\cs_new:Npn \@@_change_case_codepoint:nnnnn #1#2#3#4#5
{
diff --git a/macros/latex/contrib/l3kernel/l3text-map.dtx b/macros/latex/contrib/l3kernel/l3text-map.dtx
index d863e51ace..4399853c15 100644
--- a/macros/latex/contrib/l3kernel/l3text-map.dtx
+++ b/macros/latex/contrib/l3kernel/l3text-map.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3text-purify.dtx b/macros/latex/contrib/l3kernel/l3text-purify.dtx
index 5770853cd7..afd0e6b850 100644
--- a/macros/latex/contrib/l3kernel/l3text-purify.dtx
+++ b/macros/latex/contrib/l3kernel/l3text-purify.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3text.dtx b/macros/latex/contrib/l3kernel/l3text.dtx
index ea33b58855..131084f832 100644
--- a/macros/latex/contrib/l3kernel/l3text.dtx
+++ b/macros/latex/contrib/l3kernel/l3text.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
@@ -188,13 +188,12 @@
% \end{itemize}
%
% Determining whether non-letter characters at the start of text should count
-% as the uppercase element is controllable. When \cs{l_text_titlecase_check_letter_bool} is
-% \texttt{true}, characters which are not letters (category code~$11$) are
-% \enquote{skipped}: the first \emph{letter} is uppercased.
-% (With $8$-bit engines, this is extended to active characters which form
-% part of a multi-byte letter codepoint.) When
-% \cs{l_text_titlecase_check_letter_bool} is \texttt{false}, the first
-% character is uppercased, irrespective of the category code of the character.
+% as the uppercase element is controllable. When
+% \cs{l_text_titlecase_check_letter_bool} is \texttt{true}, codepoints which are
+% not letters (Unicode general category \texttt{L}) are not changed, and only
+% the first \emph{letter} is uppercased.
+% When \cs{l_text_titlecase_check_letter_bool} is \texttt{false}, the first
+% codepoint is uppercased, irrespective of the general code of the character.
%
% \begin{function}[added = 2022-07-04]
% {
diff --git a/macros/latex/contrib/l3kernel/l3tl-analysis.dtx b/macros/latex/contrib/l3kernel/l3tl-analysis.dtx
index 6336b0d076..2ad8d9b9f9 100644
--- a/macros/latex/contrib/l3kernel/l3tl-analysis.dtx
+++ b/macros/latex/contrib/l3kernel/l3tl-analysis.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
@@ -61,7 +61,7 @@
% \meta{token}:
% \begin{itemize}
% \item \meta{tokens}, which both \texttt{o}-expand and
-% \texttt{x}-expand to the \meta{token}. The detailed form of
+% \texttt{e}/\texttt{x}-expand to the \meta{token}. The detailed form of
% \meta{tokens} may change in later releases.
% \item \meta{char code}, a decimal representation of the character
% code of the \meta{token}, $-1$ if it is a control sequence.
@@ -132,7 +132,7 @@
% We thus need a way to encode any \meta{token} (even begin-group and
% end-group character tokens) in a way amenable to manipulating tokens
% individually. The best we can do is to find \meta{tokens} which both
-% \texttt{o}-expand and \texttt{x}-expand to the given
+% \texttt{o}-expand and \texttt{e}/\texttt{x}-expand to the given
% \meta{token}. Collecting more information about the category code and
% character code is also useful for regular expressions, since most
% regexes are catcode-agnostic. The internal format thus takes the form
@@ -140,7 +140,7 @@
% \begin{quote}
% \meta{tokens} \cs{s_@@} \meta{catcode} \meta{char code} \cs{s_@@}
% \end{quote}
-% The \meta{tokens} \texttt{o}- \emph{and} \texttt{x}-expand to the
+% The \meta{tokens} \texttt{o}- \emph{and} \texttt{e}/\texttt{x}-expand to the
% original token in the token list or to the cluster of tokens
% corresponding to one Unicode character in the given encoding (for
% \pkg{l3str-convert}). The \meta{catcode} is given as a single hexadecimal
@@ -155,7 +155,7 @@
% converting from a general token list to the internal format.
%
% The current rule for converting a \meta{token} to a balanced set of
-% \meta{tokens} which both \texttt{o}-expands and \texttt{x}-expands to
+% \meta{tokens} which both \texttt{o}-expands and \texttt{e}/\texttt{x}-expands to
% it is the following.
% \begin{itemize}
% \item A control sequence |\cs| becomes |\exp_not:n { \cs }|
@@ -189,7 +189,7 @@
% then need to control expansion much more carefully: compare
% \cs{int_value:w} |`#1| \cs{s_@@} with \cs{int_value:w} |`#1|
% \cs{exp_stop_f:} \cs{exp_not:N} \cs{q_mark} to extract a character
-% code followed by the delimiter in an \texttt{x}-expansion.
+% code followed by the delimiter in an \texttt{e}-expansion.
% \begin{macrocode}
\scan_new:N \s_@@
% \end{macrocode}
@@ -350,7 +350,7 @@
% (\texttt{N}-type) argument by \TeX{}. The plan is to have a two pass
% system. In the first pass, locate special tokens, and store them in
% various \tn{toks} registers. In the second pass, which is done within
-% an \texttt{x}-expanding assignment, normal tokens are taken in as
+% an \texttt{e}-expanding assignment, normal tokens are taken in as
% \texttt{N}-type arguments, and special tokens are retrieved from the
% \tn{toks} registers, and removed from the input stream by some means.
% The whole process takes linear time, because we avoid building the
@@ -830,7 +830,7 @@
% while a control sequence is always longer (we have set the escape
% character to a printable value). In both cases, we leave
% \cs{exp_not:n} \Arg{token} \cs{s_@@} in the input stream
-% (after \texttt{x}-expansion). Here, \cs{exp_not:n} is used
+% (after \texttt{e}-expansion). Here, \cs{exp_not:n} is used
% rather than \cs{exp_not:N} because |#3| could be
% a macro parameter character or could be \cs{s_@@}
% (which must be hidden behind braces in the result).
@@ -937,7 +937,7 @@
% Check now whether we reached the end (we shouldn't keep the trailing
% end-group character that marked the end of the token list in the
% first pass).
-% Unpack the \tn{toks} register: when \texttt{x}-expanding again,
+% Unpack the \tn{toks} register: when \texttt{e}/\texttt{x}-expanding again,
% we will get the special token.
% Then leave the category code in the input stream, followed by
% the character code, and call \cs{@@_analysis_b_loop:w} with the next index.
@@ -1069,7 +1069,7 @@
% \end{macro}
%
% \begin{macro}[rEXP]{\@@_analysis_show:, \@@_analysis_show_loop:wNw}
-% Here, |#1| \texttt{o}- and \texttt{x}-expands to the token;
+% Here, |#1| \texttt{o}- and \texttt{e}/\texttt{x}-expands to the token;
% |#2| is the category code (one uppercase hexadecimal digit),
% $0$ for control sequences;
% |#3| is the character code, which we ignore.
@@ -1390,7 +1390,7 @@
% characters to anything else than character code~$32$), then we apply
% \cs{@@_analysis_b_char:Nn}, which detects active characters by
% comparing them to \cs{tex_undefined:D}, and we must have undefined
-% the active space for this test to work ---we use an |x|-expanding
+% the active space for this test to work ---we use an |e|-expanding
% assignment to get the active space in the right place. Finally
% \cs{@@_peek_analysis_char:w} puts the arguments in the correct
% order, including \cs{exp_not:n} for macro parameter characters and
@@ -1549,7 +1549,7 @@
% character code. In the latter two cases we call
% \cs{char_generate:nn} with suitable arguments and put suitable
% \cs{if_false:} \cs{fi:} constructions to make the result balanced
-% and such that \texttt{o}-expanding or \texttt{x}-expanding gives
+% and such that \texttt{o}-expanding or \texttt{e}/\texttt{x}-expanding gives
% back a single (unbalanced) begin-group or end-group character.
% \begin{macrocode}
\cs_new_protected:Npn \@@_peek_analysis_explicit:n #1
diff --git a/macros/latex/contrib/l3kernel/l3tl-build.dtx b/macros/latex/contrib/l3kernel/l3tl-build.dtx
new file mode 100644
index 0000000000..08eb31e1b2
--- /dev/null
+++ b/macros/latex/contrib/l3kernel/l3tl-build.dtx
@@ -0,0 +1,329 @@
+% \iffalse meta-comment
+%
+%% File: l3tl-build.dtx
+%
+% Copyright (C) 2018-2023 The LaTeX Project
+%
+% It may be distributed and/or modified under the conditions of the
+% LaTeX Project Public License (LPPL), either version 1.3c of this
+% license or (at your option) any later version. The latest version
+% of this license is in the file
+%
+% https://www.latex-project.org/lppl.txt
+%
+% This file is part of the "l3kernel bundle" (The Work in LPPL)
+% and all files in that bundle must be distributed together.
+%
+% -----------------------------------------------------------------------
+%
+% The development version of the bundle can be found at
+%
+% https://github.com/latex3/latex3
+%
+% for those people who are interested.
+%
+%<*driver>
+\documentclass[full,kernel]{l3doc}
+\begin{document}
+ \DocInput{\jobname.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \title{^^A
+% The \textsf{l3tl-build} package\\ Piecewise \texttt{tl} constructions^^A
+% }
+%
+% \author{^^A
+% The \LaTeX{} Project\thanks
+% {^^A
+% E-mail:
+% \href{mailto:latex-team@latex-project.org}
+% {latex-team@latex-project.org}^^A
+% }^^A
+% }
+%
+% \date{Released 2023-11-01}
+%
+% \maketitle
+%
+% \begin{documentation}
+%
+% \section{Constructing \meta{tl~var} by accumulation}
+%
+% When creating a \meta{tl~var} by accumulation of many tokens, the performance
+% available using a combination of \cs{tl_set:Nn} and \cs{tl_put_right:Nn} or
+% similar begins to become an issue. To address this, a set of functions are
+% available to \enquote{build} a \meta{tl~var}. The performance of this approach
+% is much more efficient than the standard \cs{tl_put_right:Nn}, but the
+% constructed token list cannot be accessed during construction other than
+% by methods provided in this section.
+%
+% \begin{function}[added = 2018-04-01]{\tl_build_begin:N, \tl_build_gbegin:N}
+% \begin{syntax}
+% \cs{tl_build_begin:N} \meta{tl~var}
+% \end{syntax}
+% Clears the \meta{tl~var} and sets it up to support other
+% \cs[no-index]{tl_build_\ldots{}} functions. Until \cs{tl_build_end:N}
+% \meta{tl~var} is called, applying any function from \pkg{l3tl} other
+% than \cs[no-index]{tl_build_\ldots{}} will lead to incorrect
+% results. The |begin| and |gbegin| functions must be used for local
+% and global \meta{tl~var} respectively.
+% \end{function}
+%
+% \begin{function}[added = 2018-04-01]
+% {
+% \tl_build_put_left:Nn, \tl_build_put_left:Ne,
+% \tl_build_gput_left:Nn, \tl_build_gput_left:Ne,
+% \tl_build_put_right:Nn, \tl_build_put_right:Ne,
+% \tl_build_gput_right:Nn, \tl_build_gput_right:Ne
+% }
+% \begin{syntax}
+% \cs{tl_build_put_left:Nn} \meta{tl~var} \Arg{tokens}
+% \cs{tl_build_put_right:Nn} \meta{tl~var} \Arg{tokens}
+% \end{syntax}
+% Adds \meta{tokens} to the left or right side of the current contents
+% of \meta{tl~var}. The \meta{tl~var} must have been set up with
+% \cs{tl_build_begin:N} or \cs{tl_build_gbegin:N}. The |put| and
+% |gput| functions must be used for local and global \meta{tl~var}
+% respectively. The |right| functions are about twice faster than the
+% |left| functions.
+% \end{function}
+%
+% \begin{function}[added = 2018-04-01]{\tl_build_end:N, \tl_build_gend:N}
+% \begin{syntax}
+% \cs{tl_build_end:N} \meta{tl~var}
+% \end{syntax}
+% Gets the contents of \meta{tl~var} and stores that into the
+% \meta{tl~var} using \cs{tl_set:Nn} or \cs{tl_gset:Nn}.
+% The \meta{tl~var} must have
+% been set up with \cs{tl_build_begin:N} or \cs{tl_build_gbegin:N}.
+% The |end| and |gend| functions must be used for local and global
+% \meta{tl~var} respectively. These functions completely remove the
+% setup code that enabled \meta{tl~var} to be used for other
+% \cs[no-index]{tl_build_\ldots{}} functions. After the action of
+% |end|/|gend|, the \meta{tl~var} may be manipulated using standard
+% \texttt{tl} functions.
+% \end{function}
+%
+% \end{documentation}
+%
+% \begin{implementation}
+%
+% \section{\pkg{l3tl-build} implementation}
+%
+% \begin{macrocode}
+%<*package>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<@@=tl>
+% \end{macrocode}
+%
+% Between \cs{tl_build_begin:N} \meta{tl~var} and \cs{tl_build_end:N}
+% \meta{tl~var}, the \meta{tl~var} has the structure
+% \begin{quote}
+% \cs{exp_end:} \ldots{} \cs{exp_end:} \cs{@@_build_last:NNn}
+% \meta{assignment} \meta{next~tl} \Arg{left} \meta{right}
+% \end{quote}
+% where \meta{right} is not braced. The \enquote{data} it represents is
+% \meta{left} followed by the \enquote{data} of \meta{next~tl} followed
+% by \meta{right}. The \meta{next~tl} is a token list variable whose
+% name is that of \meta{tl~var} followed by~|'|. There are between $0$
+% and $4$ \cs{exp_end:} to keep track of when \meta{left} and
+% \meta{right} should be put into the \meta{next~tl}. The
+% \meta{assignment} is \cs{cs_set_nopar:Npe} if the variable is local,
+% and \cs{cs_gset_nopar:Npe} if it is global.
+%
+% \begin{macro}{\tl_build_begin:N, \tl_build_gbegin:N}
+% \begin{macro}{\@@_build_begin:NN, \@@_build_begin:NNN}
+% First construct the \meta{next~tl}: using a prime here conflicts
+% with the usual \pkg{expl3} convention but we need a name that can be
+% derived from |#1| without any external data such as a counter.
+% Empty that \meta{next~tl} and setup the structure. The local and
+% global versions only differ by a single function
+% \cs[no-index]{cs_(g)set_nopar:Npe} used for all assignments: this is
+% important because only that function is stored in the \meta{tl~var}
+% and \meta{next~tl} for subsequent assignments. In principle
+% \cs{@@_build_begin:NNN} could use \cs[no-index]{tl_(g)clear_new:N}
+% to empty |#1| and make sure it is defined, but logging the
+% definition does not seem useful so we just do |#3| |#1| |{}| to
+% clear it locally or globally as appropriate.
+% \begin{macrocode}
+\cs_new_protected:Npn \tl_build_begin:N #1
+ { \@@_build_begin:NN \cs_set_nopar:Npe #1 }
+\cs_new_protected:Npn \tl_build_gbegin:N #1
+ { \@@_build_begin:NN \cs_gset_nopar:Npe #1 }
+\cs_new_protected:Npn \@@_build_begin:NN #1#2
+ { \exp_args:Nc \@@_build_begin:NNN { \cs_to_str:N #2 ' } #2 #1 }
+\cs_new_protected:Npn \@@_build_begin:NNN #1#2#3
+ {
+ #3 #1 { }
+ #3 #2
+ {
+ \exp_not:n { \exp_end: \exp_end: \exp_end: \exp_end: }
+ \exp_not:n { \@@_build_last:NNn #3 #1 { } }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}
+% {
+% \tl_build_put_right:Nn, \tl_build_put_right:Ne, \tl_build_put_right:Nx,
+% \tl_build_gput_right:Nn, \tl_build_gput_right:Ne, \tl_build_gput_right:Nx
+% }
+% \begin{macro}{\@@_build_last:NNn}
+% \begin{macro}{\@@_build_put:nn}
+% \begin{macro}{\@@_build_put:nw}
+% Similar to \cs{tl_put_right:Nn}, but apply \cs{exp:w} to |#1|. Most
+% of the time this just removes one \cs{exp_end:}. When there are
+% none left, \cs{@@_build_last:NNn} is expanded instead. It resets
+% the definition of the \meta{tl~var} by ending the \cs{exp_not:n} and
+% the definition early. Then it makes sure the \meta{next~tl} (its
+% argument |#1|) is set-up and starts a new definition. Then
+% \cs{@@_build_put:nn} and \cs{@@_build_put:nw} place the \meta{left}
+% part of the original \meta{tl~var} as appropriate for the definition
+% of the \meta{next~tl} (the \meta{right} part is left in the right
+% place without ever becoming a macro argument). We use
+% \cs{exp_after:wN} rather than some \cs{exp_args:No} to avoid reading
+% arguments that are likely very long token lists. We use
+% \cs[no-index]{cs_(g)set_nopar:Npe} rather than
+% \cs[no-index]{tl_(g)set:Ne} partly for the same reason and partly
+% because the assignments are interrupted by brace tricks, which
+% implies that the assignment does not simply set the token list to an
+% |e|-expansion of the second argument.
+% \begin{macrocode}
+\cs_new_protected:Npn \tl_build_put_right:Nn #1#2
+ {
+ \cs_set_nopar:Npe #1
+ { \__kernel_exp_not:w \exp_after:wN { \exp:w #1 #2 } }
+ }
+\cs_generate_variant:Nn \tl_build_put_right:Nn { Ne , Nx }
+\cs_new_protected:Npn \tl_build_gput_right:Nn #1#2
+ {
+ \cs_gset_nopar:Npe #1
+ { \__kernel_exp_not:w \exp_after:wN { \exp:w #1 #2 } }
+ }
+\cs_generate_variant:Nn \tl_build_gput_right:Nn { Ne , Nx }
+\cs_new_protected:Npn \@@_build_last:NNn #1#2
+ {
+ \if_false: { { \fi:
+ \exp_end: \exp_end: \exp_end: \exp_end: \exp_end:
+ \@@_build_last:NNn #1 #2 { }
+ }
+ }
+ \if_meaning:w \c_empty_tl #2
+ \@@_build_begin:NN #1 #2
+ \fi:
+ #1 #2
+ {
+ \__kernel_exp_not:w \exp_after:wN
+ {
+ \exp:w \if_false: } } \fi:
+ \exp_after:wN \@@_build_put:nn \exp_after:wN {#2}
+ }
+\cs_new_protected:Npn \@@_build_put:nn #1#2 { \@@_build_put:nw {#2} #1 }
+\cs_new_protected:Npn \@@_build_put:nw #1#2 \@@_build_last:NNn #3#4#5
+ { #2 \@@_build_last:NNn #3 #4 { #1 #5 } }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}
+% {
+% \tl_build_put_left:Nn, \tl_build_put_left:Ne, \tl_build_put_left:Nx,
+% \tl_build_gput_left:Nn, \tl_build_gput_left:Ne, \tl_build_gput_left:Nx
+% }
+% \begin{macro}{\@@_build_put_left:NNn}
+% See \cs{tl_build_put_right:Nn} for all the machinery. We could
+% easily provide \cs[no-index]{tl_build_put_left_right:Nnn}, by just
+% adding the \meta{right} material after the \Arg{left} in the
+% |e|-expanding assignment.
+% \begin{macrocode}
+\cs_new_protected:Npn \tl_build_put_left:Nn #1
+ { \@@_build_put_left:NNn \cs_set_nopar:Npe #1 }
+\cs_generate_variant:Nn \tl_build_put_left:Nn { Ne , Nx }
+\cs_new_protected:Npn \tl_build_gput_left:Nn #1
+ { \@@_build_put_left:NNn \cs_gset_nopar:Npe #1 }
+\cs_generate_variant:Nn \tl_build_gput_left:Nn { Ne , Nx }
+\cs_new_protected:Npn \@@_build_put_left:NNn #1#2#3
+ {
+ #1 #2
+ {
+ \__kernel_exp_not:w \exp_after:wN
+ {
+ \exp:w \exp_after:wN \@@_build_put:nn
+ \exp_after:wN {#2} {#3}
+ }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\tl_build_end:N, \tl_build_gend:N}
+% \begin{macro}{\@@_build_end_loop:NN}
+% Get the data then clear the \meta{next~tl} recursively until finding
+% an empty one. It is perhaps wasteful to repeatedly use
+% \cs{cs_to_str:N}. The local/global scope is checked by
+% \cs{tl_set:Ne} or \cs{tl_gset:Ne}.
+% \begin{macrocode}
+\cs_new_protected:Npn \tl_build_end:N #1
+ {
+ \@@_build_get:NNN \__kernel_tl_set:Ne #1 #1
+ \exp_args:Nc \@@_build_end_loop:NN { \cs_to_str:N #1 ' } \tl_clear:N
+ }
+\cs_new_protected:Npn \tl_build_gend:N #1
+ {
+ \@@_build_get:NNN \__kernel_tl_gset:Ne #1 #1
+ \exp_args:Nc \@@_build_end_loop:NN { \cs_to_str:N #1 ' } \tl_gclear:N
+ }
+\cs_new_protected:Npn \@@_build_end_loop:NN #1#2
+ {
+ \if_meaning:w \c_empty_tl #1
+ \exp_after:wN \use_none:nnnnnn
+ \fi:
+ #2 #1
+ \exp_args:Nc \@@_build_end_loop:NN { \cs_to_str:N #1 ' } #2
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@@_build_get:NNN}
+% \begin{macro}{\@@_build_get:w, \@@_build_get_end:w}
+% The idea is to expand the \meta{tl~var} then the \meta{next~tl} and
+% so on, all within an |e|-expanding assignment, and wrap as
+% appropriate in \cs{exp_not:n}. The various \meta{left} parts are
+% left in the assignment as we go, which enables us to expand the
+% \meta{next~tl} at the right place. The various \meta{right} parts
+% are eventually picked up in one last \cs{exp_not:n}, with a brace
+% trick to wrap all the \meta{right} parts together.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_build_get:NNN #1#2#3
+ { #1 #3 { \if_false: { \fi: \exp_after:wN \@@_build_get:w #2 } } }
+\cs_new:Npn \@@_build_get:w #1 \@@_build_last:NNn #2#3#4
+ {
+ \exp_not:n {#4}
+ \if_meaning:w \c_empty_tl #3
+ \exp_after:wN \@@_build_get_end:w
+ \fi:
+ \exp_after:wN \@@_build_get:w #3
+ }
+\cs_new:Npn \@@_build_get_end:w #1#2#3
+ { \__kernel_exp_not:w \exp_after:wN { \if_false: } \fi: }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%
+% \end{implementation}
+%
+% \PrintIndex
diff --git a/macros/latex/contrib/l3kernel/l3tl.dtx b/macros/latex/contrib/l3kernel/l3tl.dtx
index f3c52e2a0f..774814ad33 100644
--- a/macros/latex/contrib/l3kernel/l3tl.dtx
+++ b/macros/latex/contrib/l3kernel/l3tl.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
@@ -566,8 +566,8 @@
% See also \cs{tl_reverse:N}.
% \begin{texnote}
% The result is returned within \tn{unexpanded}, which means that the token
-% list does not expand further when appearing in an \texttt{x}-type
-% or \texttt{e}-type argument expansion.
+% list does not expand further when appearing in an \texttt{e}-type
+% or \texttt{x}-type argument expansion.
% \end{texnote}
% \end{function}
%
@@ -603,8 +603,8 @@
% consider the slower function \cs{tl_reverse:n}.
% \begin{texnote}
% The result is returned within \tn{unexpanded}, which means that the token
-% list does not expand further when appearing in an \texttt{x}-type
-% or \texttt{e}-type argument expansion.
+% list does not expand further when appearing in an \texttt{e}-type
+% or \texttt{x}-type argument expansion.
% \end{texnote}
% \end{function}
%
@@ -623,8 +623,8 @@
% stream.
% \begin{texnote}
% The result is returned within \tn{unexpanded}, which means that the token
-% list does not expand further when appearing in an \texttt{x}-type
-% or \texttt{e}-type argument expansion.
+% list does not expand further when appearing in an \texttt{e}-type
+% or \texttt{x}-type argument expansion.
% \end{texnote}
% \end{function}
%
@@ -873,8 +873,8 @@
% \cs{tl_head:n} leaving nothing in the input stream.
% \begin{texnote}
% The result is returned within \cs{exp_not:n}, which means that the token
-% list does not expand further when appearing in an \texttt{x}-type
-% or \texttt{e}-type argument expansion.
+% list does not expand further when appearing in an \texttt{e}-type
+% or \texttt{x}-type argument expansion.
% \end{texnote}
% \end{function}
%
@@ -918,8 +918,8 @@
% in \cs{tl_tail:n} leaving nothing in the input stream.
% \begin{texnote}
% The result is returned within \cs{exp_not:n}, which means that the
-% token list does not expand further when appearing in an \texttt{x}-type
-% or \texttt{e}-type argument expansion.
+% token list does not expand further when appearing in an \texttt{e}-type
+% or \texttt{x}-type argument expansion.
% \end{texnote}
% \end{function}
%
@@ -959,8 +959,8 @@
% \begin{texnote}
% The result is returned within the \tn{unexpanded}
% primitive (\cs{exp_not:n}), which means that the \meta{item}
-% does not expand further when appearing in an \texttt{x}-type
-% or \texttt{e}-type argument expansion.
+% does not expand further when appearing in an \texttt{e}-type
+% or \texttt{x}-type argument expansion.
% \end{texnote}
% \end{function}
%
@@ -976,8 +976,8 @@
% \begin{texnote}
% The result is returned within the \tn{unexpanded}
% primitive (\cs{exp_not:n}), which means that the \meta{item}
-% does not expand further when appearing in an \texttt{x}-type
-% or \texttt{e}-type argument expansion.
+% does not expand further when appearing in an \texttt{e}-type
+% or \texttt{x}-type argument expansion.
% \end{texnote}
% \end{function}
%
@@ -1047,8 +1047,8 @@
% \begin{texnote}
% The result is returned within the \tn{unexpanded}
% primitive (\cs{exp_not:n}), which means that the \meta{item}
-% does not expand further when appearing in an \texttt{x}-type
-% or \texttt{e}-type argument expansion.
+% does not expand further when appearing in an \texttt{e}-type
+% or \texttt{x}-type argument expansion.
% \end{texnote}
% \end{function}
%
@@ -1079,7 +1079,7 @@
% \begin{texnote}
% The result is returned within \cs{exp_not:n}, which means that the
% token list does not expand further when appearing in an
-% \texttt{x}-type or \texttt{e}-type argument expansion.
+% \texttt{e}-type or \texttt{x}-type argument expansion.
% \end{texnote}
% \end{function}
%
@@ -1255,7 +1255,7 @@
% single-line string, as if it appeared in the middle of a line
% read from a file.
%
-% Contrarily to the \tn{scantokens} primitive, \cs{tl_rescan:nn}
+% Contrarily to the \tn{scantokens} \eTeX{} primitive, \cs{tl_rescan:nn}
% tokenizes the whole string in the same category code regime rather
% than one token at a time, so that directives such as \tn{verb}
% that rely on changing category codes will not function properly.
@@ -2153,7 +2153,7 @@
% All of its work is done between
% \cs{group_align_safe_begin:} and \cs{group_align_safe_end:} to avoid
% issues in alignments. It does the actual replacement within
-% |#3|~|#4|~|{...}|, an \texttt{x}-expanding \meta{assignment}~|#3| to
+% |#3|~|#4|~|{...}|, an \texttt{e}-expanding \meta{assignment}~|#3| to
% the \meta{tl~var}~|#4|. The auxiliary \cs{@@_replace_next:w} is
% called, followed by the \meta{token list}, some tokens including the
% \meta{delimiter}~|#1|, followed by the \meta{pattern}~|#5|.
@@ -2166,7 +2166,7 @@
% |##1| cannot contain the \meta{delimiter}~|#1| that we worked so
% hard to obtain, thus \cs{@@_replace_wrap:w} gets~|##1| as its own
% argument~|##1|, and protects it against
-% the \texttt{x}-expanding assignment. It also finds \cs{exp_not:n}
+% the \texttt{e}-expanding assignment. It also finds \cs{exp_not:n}
% as~|##2| and does nothing to it, thus letting through \cs{exp_not:n}
% \Arg{replacement} into the assignment. Note that
% \cs{@@_replace_next:w} and \cs{@@_replace_wrap:w} are always called
@@ -2858,7 +2858,7 @@
% \cs{@@_trim_mark:} expands to nothing in a single expansion. In the case
% at hand, we take \cs{__kernel_exp_not:w} \cs{exp_after:wN} as our
% continuation, so that space trimming behaves correctly within an
-% \texttt{x}-type expansion.
+% \texttt{e}-type or \texttt{x}-type expansion.
% \begin{macrocode}
\cs_new:Npn \tl_trim_spaces:n #1
{
diff --git a/macros/latex/contrib/l3kernel/l3token.dtx b/macros/latex/contrib/l3kernel/l3token.dtx
index 888ceb3601..81534b5480 100644
--- a/macros/latex/contrib/l3kernel/l3token.dtx
+++ b/macros/latex/contrib/l3kernel/l3token.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
@@ -456,7 +456,7 @@
% as |macro|s.
% \begin{texnote}
% This is the \TeX{} primitive \tn{meaning}.
-% The \meta{token} can thus be an explicit space tokens or an
+% The \meta{token} can thus be an explicit space token or an
% explicit begin-group or end-group character token (|{|~or~|}| when
% normal \TeX{} category codes apply) even though these are not
% valid \texttt{N}-type arguments.
@@ -473,7 +473,7 @@
% category code $12$ (the escape character is part of the
% \meta{token}). This function requires only a single expansion.
% \begin{texnote}
-% \cs{token_to_str:N} is the \TeX{} primitive \tn{string} renamed.
+% \cs{token_to_str:N} is the \TeX{} primitive \tn{string}.
% The \meta{token} can thus be an explicit space tokens or an
% explicit begin-group or end-group character token (|{|~or~|}| when
% normal \TeX{} category codes apply) even though these are not
@@ -752,7 +752,7 @@
% \cs{token_if_primitive:NTF} \meta{token} \Arg{true code} \Arg{false code}
% \end{syntax}
% Tests if the \meta{token} is an engine primitive. In \LuaTeX{}
-% this includes primitive-like commands defined using |{token.set_lua}|.
+% this includes primitive-like commands defined using |token.set_lua|.
% \end{function}
%
% \begin{function}[added = 2020-12-03, EXP, noTF]
@@ -968,7 +968,7 @@
% receives three arguments for each \meta{token} in the input stream:
% \begin{itemize}
% \item \meta{tokens}, which both \texttt{o}-expand and
-% \texttt{x}-expand to the \meta{token}. The detailed form of
+% \texttt{e}/\texttt{x}-expand to the \meta{token}. The detailed form of
% \meta{tokens} may change in later releases.
% \item \meta{char code}, a decimal representation of the character
% code of the \meta{token}, $-1$ if it is a control sequence.
@@ -2328,7 +2328,7 @@
%
% Characters used as delimiters must have catcode~$12$
% and are obtained through \cs{tl_to_str:n}. This requires doing all
-% definitions within \texttt{x}-expansion. The temporary function
+% definitions within \texttt{e}-expansion. The temporary function
% \cs{@@_tmp:w} used to define each conditional receives three
% arguments: the name of the conditional, the auxiliary's delimiter
% (also used to name the auxiliary), and the string to which one
diff --git a/macros/latex/contrib/l3kernel/l3unicode.dtx b/macros/latex/contrib/l3kernel/l3unicode.dtx
index 54486cc0fa..1ee49aeb44 100644
--- a/macros/latex/contrib/l3kernel/l3unicode.dtx
+++ b/macros/latex/contrib/l3kernel/l3unicode.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-23}
+% \date{Released 2023-11-01}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/source3.pdf b/macros/latex/contrib/l3kernel/source3.pdf
index 13567c5b2a..830fc37b84 100644
--- a/macros/latex/contrib/l3kernel/source3.pdf
+++ b/macros/latex/contrib/l3kernel/source3.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/source3.tex b/macros/latex/contrib/l3kernel/source3.tex
index bb91c59643..9c7384cad0 100644
--- a/macros/latex/contrib/l3kernel/source3.tex
+++ b/macros/latex/contrib/l3kernel/source3.tex
@@ -57,7 +57,7 @@ for those people who are interested.
{latex-team@latex-project.org}%
}%
}
-\date{Released 2023-10-23}
+\date{Released 2023-11-01}
\pagenumbering{roman}
\maketitle
diff --git a/macros/latex/contrib/l3kernel/source3body.tex b/macros/latex/contrib/l3kernel/source3body.tex
index f76e8f2872..b469621d95 100644
--- a/macros/latex/contrib/l3kernel/source3body.tex
+++ b/macros/latex/contrib/l3kernel/source3body.tex
@@ -551,6 +551,7 @@ used on top of \LaTeXe{} if \tn{outer} tokens are used in the arguments.
\part{Data types}
\DocInput{l3tl.dtx}
+\DocInput{l3tl-build.dtx}
\DocInput{l3str.dtx}
\DocInput{l3str-convert.dtx}
\DocInput{l3quark.dtx}
diff --git a/macros/latex/contrib/profmaquette/doc/TestCAN.pdf b/macros/latex/contrib/profmaquette/doc/TestCAN.pdf
new file mode 100644
index 0000000000..ce210e3c71
--- /dev/null
+++ b/macros/latex/contrib/profmaquette/doc/TestCAN.pdf
Binary files differ
diff --git a/macros/latex/contrib/profmaquette/doc/TestCAN.tex b/macros/latex/contrib/profmaquette/doc/TestCAN.tex
new file mode 100644
index 0000000000..58cbf7a758
--- /dev/null
+++ b/macros/latex/contrib/profmaquette/doc/TestCAN.tex
@@ -0,0 +1,27 @@
+\documentclass[french]{article}
+\usepackage[nonamssymb]{ProfCollegeT}
+\usepackage{ProfMaquetteT}
+
+\usepackage[warnings-off={mathtools-colon,mathtools-overbracket}]{unicode-math}
+\usepackage[math-style=french,Scale=0.98]{fourier-otf}
+
+\newfontfamily\myfontScratch[Scale=0.725]{DejaVu Sans}
+
+%\usepackage[a5paper,margin=1cm,noheadfoot]{geometry}
+\setlength{\parindent}{0pt}
+\pagestyle{empty}
+
+\usepackage{babel}
+
+\usepackage{lipsum}
+
+\begin{document}
+\begin{Maquette}[CAN]{}
+ \begin{exercice}
+ On considère un triangle $ABC$\dots
+ \end{exercice}
+\end{Maquette}
+\end{document}
+% Local Variables:
+% TeX-engine: luatex
+% End:
diff --git a/macros/latex/contrib/profmaquette/doc/TestCANComplement.pdf b/macros/latex/contrib/profmaquette/doc/TestCANComplement.pdf
new file mode 100644
index 0000000000..a2b2f04465
--- /dev/null
+++ b/macros/latex/contrib/profmaquette/doc/TestCANComplement.pdf
Binary files differ
diff --git a/macros/latex/contrib/profmaquette/doc/TestCANComplement.tex b/macros/latex/contrib/profmaquette/doc/TestCANComplement.tex
new file mode 100644
index 0000000000..565b168d7e
--- /dev/null
+++ b/macros/latex/contrib/profmaquette/doc/TestCANComplement.tex
@@ -0,0 +1,31 @@
+\documentclass[french]{article}
+\usepackage[nonamssymb]{ProfCollegeT}
+\usepackage{ProfMaquetteT}
+
+\usepackage[warnings-off={mathtools-colon,mathtools-overbracket}]{unicode-math}
+\usepackage[math-style=french,Scale=0.98]{fourier-otf}
+
+\newfontfamily\myfontScratch[Scale=0.725]{DejaVu Sans}
+
+%\usepackage[a5paper,margin=1cm,noheadfoot]{geometry}
+\setlength{\parindent}{0pt}
+\pagestyle{empty}
+
+\usepackage{babel}
+
+\usepackage{lipsum}
+
+\begin{document}
+\begin{Maquette}[CAN]{CoefQ=0.5,CoefR=0.25}
+ \begin{exercice}
+ $17+19$
+ \end{exercice}
+ \begin{exercice}
+ $ABC$ est un triangle tel que $\widehat{ABC}=\ang{30}$ et $\widehat{BCA}=\ang{70}$. Alors\dots
+ \Complement{$\widehat{CAB}=\dots$}
+ \end{exercice}
+\end{Maquette}
+\end{document}
+% Local Variables:
+% TeX-engine: luatex
+% End:
diff --git a/macros/latex/contrib/profmaquette/doc/profmaquette-doc.pdf b/macros/latex/contrib/profmaquette/doc/profmaquette-doc.pdf
index 26ddb6c90f..684fb60cce 100644
--- a/macros/latex/contrib/profmaquette/doc/profmaquette-doc.pdf
+++ b/macros/latex/contrib/profmaquette/doc/profmaquette-doc.pdf
Binary files differ
diff --git a/macros/latex/contrib/profmaquette/doc/profmaquette-doc.tex b/macros/latex/contrib/profmaquette/doc/profmaquette-doc.tex
index 201af9c0d0..deb64e3d34 100644
--- a/macros/latex/contrib/profmaquette/doc/profmaquette-doc.tex
+++ b/macros/latex/contrib/profmaquette/doc/profmaquette-doc.tex
@@ -5,6 +5,7 @@
\input{Christ7}
\usepackage[warnings-off={mathtools-colon,mathtools-overbracket}]{unicode-math}
\usepackage{fourier-otf}
+
\usepackage[a4paper,margin=1.5cm,nohead,includefoot]{geometry}
\setlength{\parindent}{0pt}
\pagestyle{empty}
@@ -120,13 +121,13 @@
texcsstyle=*\color{black},%pour colorer la contre-oblique
classoffset=5,
texcsstyle=*\color{blue},%pour colorer la contre-oblique
- moretexcs={brm,TikzDM,TikzDMCor,TikzDS,TikzDSCor,TikzIE,TikzIECor,TikzFiche,TikzFicheCor,TikzCours,Competences,TikzParcours,TikzParcoursCor,TikzPdT,TikzPdTCor,PfMCompNA,PfMCompECA,PfMCompA,AfficheParcours,CheminVrai,CheminFaux,TikzContrat,TikzContratCor,TikzFdR,TikzFdRCor,AfficheContrat,AfficheFdR},
+ moretexcs={brm,TikzDM,TikzDMCor,TikzDS,TikzDSCor,TikzIE,TikzIECor,TikzFiche,TikzFicheCor,TikzCours,Competences,TikzParcours,TikzParcoursCor,TikzPdT,TikzPdTCor,PfMCompNA,PfMCompECA,PfMCompA,AfficheParcours,CheminVrai,CheminFaux,TikzContrat,TikzContratCor,TikzFdR,TikzFdRCor,AfficheContrat,AfficheFdR,TikzCAN,TikzCANCor,Complement},
emph={Maquette,exercice,exercice,Solution,Reponse,Indice},%
classoffset=1,
- keywords={DM,DS,IE,Fiche,CorrigeFin,CorrigeApres,PdT,Parcours,ParcoursPerso,Cours,FdR,Contrat},
+ keywords={DM,DS,IE,Fiche,CorrigeFin,CorrigeApres,PdT,Parcours,ParcoursPerso,Cours,FdR,Contrat,CAN},
keywordstyle=\color{OliveDrab},
classoffset=2,
- keywords={Theme,Niveau,Classe,Date,Calculatrice,Code,Numero,Sujet,Nom,NumSujet,Fichier,Type},
+ keywords={Theme,Niveau,Classe,Date,Calculatrice,Code,Numero,Sujet,Nom,NumSujet,Fichier,Type,CoefQ,CoefR,CoefJ},
keywordstyle=\color{BlueViolet},%DarkMagenta},
classoffset=3,
keywords={Pouce,Direct,PasCorrige,BaremeDetaille,BaremeTotal,Source,Titre,Oral,Calculatrice,Competence,Trajet,Confiance,Route,Stop},
@@ -182,8 +183,8 @@
{\sffamily\textlangle #1\textrangle}%
}%
-\newcommand{\Defaut}[1]{%
-\hfill valeur par défaut : {\sffamily #1}\par%
+\newcommand\Defaut[1]{%
+\hfill valeur par défaut : {\sffamily #1}\\[-1em]%
}%
\usepackage{parskip}
@@ -303,7 +304,7 @@ Le c\oe ur de l'utilisation du package \lstinline!ProfMaquette! est donc une ges
\end{Codes}
C'est lui qui indique :
\begin{itemize}
-\item le type de document souhaité \metamk{TypeDocument} (Devoir Maison / Devoir Surveillé / Interrogation écrite / Fiche d'exercices / Parcours d'exercices / Parcours personnalisé / Plan de travail / Cours / Contrat de confiance / Feuille de route);
+\item le type de document souhaité \metamk{TypeDocument} (Devoir Maison / Devoir Surveillé / Interrogation écrite / Fiche d'exercices / Parcours d'exercices / Parcours personnalisé / Plan de travail / Cours / Contrat de confiance / Feuille de route / CAN (Course aux nombres));
\item et si ce travail est corrigé \metamk{TypeCorrection} (à la suite d'un exercice ou à la fin du document) ou pas;
\end{itemize}
puis il indiquera les caractéristiques \metamk{Caracteristiques} du document souhaité.
@@ -382,7 +383,7 @@ puis il indiquera les caractéristiques \metamk{Caracteristiques} du document so
\item[]La clé \Cle{Niveau}\Defaut{6}
\item[]La clé \Cle{Theme} Thème de la fiche \Defaut{Les nombres décimaux}
\item[]La clé \Cle{Code}\Defaut{}
- \item[]La clé \Cle{Nomexercice} pour modifier le nom des exercices\Defaut{exercice}
+ \item[]La clé \Cle{NomExercice} pour modifier le nom des exercices\Defaut{exercice}
\end{itemize}
\end{Description}
\end{CadreMP}
@@ -405,7 +406,7 @@ puis il indiquera les caractéristiques \metamk{Caracteristiques} du document so
\item[]La clé \Cle{Niveau}\Defaut{6}
\item[]La clé \Cle{Theme} Thème du parcours \Defaut{Les nombres décimaux}
\item[]La clé \Cle{Code}\Defaut{}
- \item[]La clé \Cle{Nomexercice} pour modifier le nom des exercices\Defaut{exercice}
+ \item[]La clé \Cle{NomExercice} pour modifier le nom des exercices\Defaut{exercice}
\end{itemize}
\end{Description}
\end{CadreMP}
@@ -426,7 +427,7 @@ puis il indiquera les caractéristiques \metamk{Caracteristiques} du document so
\item[]La clé \Cle{Niveau}\Defaut{6}
\item[]La clé \Cle{Theme} Thème du plan de travail \Defaut{Les nombres décimaux}
\item[]La clé \Cle{Code}\Defaut{}
- \item[]La clé \Cle{Nomexercice} pour modifier le nom des exercices\Defaut{exercice}
+ \item[]La clé \Cle{NomExercice} pour modifier le nom des exercices\Defaut{exercice}
\end{itemize}
\end{Description}
\end{CadreMP}
@@ -462,7 +463,7 @@ puis il indiquera les caractéristiques \metamk{Caracteristiques} du document so
\begin{itemize}
\item[]La clé \Cle{Theme} modifie le titre du \og cours\fg\Defaut{Trace écrite}
\item[]La clé \Cle{Couleur} modifie la couleur donnée à l'entête\Defaut{Crimson}
- \item[]La clé \Cle{Nomexercice} pour modifier le nom des exercices\Defaut{exercice}
+ \item[]La clé \Cle{NomExercice} pour modifier le nom des exercices\Defaut{exercice}
\end{itemize}
\end{Description}
\end{CadreMP}
@@ -482,7 +483,7 @@ puis il indiquera les caractéristiques \metamk{Caracteristiques} du document so
\begin{itemize}
\item[]La clé \Cle{Theme} modifie le titre du \og cours\fg\Defaut{-}
\item[]La clé \Cle{Couleur} modifie la couleur donnée à l'entête\Defaut{Crimson}
- \item[]La clé \Cle{Nomexercice} pour modifier le nom des exercices\Defaut{exercice}
+ \item[]La clé \Cle{NomExercice} pour modifier le nom des exercices\Defaut{exercice}
\end{itemize}
\end{Description}
\end{CadreMP}
@@ -502,7 +503,7 @@ puis il indiquera les caractéristiques \metamk{Caracteristiques} du document so
\begin{itemize}
\item[]La clé \Cle{Theme} modifie le titre du \og cours\fg\Defaut{-}
\item[]La clé \Cle{Couleur} modifie la couleur donnée à l'entête\Defaut{Crimson}
- \item[]La clé \Cle{Nomexercice} pour modifier le nom des exercices\Defaut{exercice}
+ \item[]La clé \Cle{NomExercice} pour modifier le nom des exercices\Defaut{exercice}
\end{itemize}
\end{Description}
\end{CadreMP}
@@ -515,6 +516,35 @@ puis il indiquera les caractéristiques \metamk{Caracteristiques} du document so
On considère un triangle $ABC$\dots
\end{Maquette}
\clearpage
+\subsection*{Course aux nombres}
+\begin{CadreMP}
+ \begin{Description}
+\item[La clé \Cle{CAN}]\Defaut{false}
+ \begin{itemize}
+ \item[]La clé \Cle{Date}\Defaut{\lstinline!\\today!}
+ \item[]La clé \Cle{Niveau}\Defaut{6}
+ \item[]La clé \Cle{Duree} modifie la durée de la course\Defaut{9}
+ \item[]La clé \Cle{CoefQ} modifie, en multipliant \lstinline!\\linewidth! par la valeur donnée, la largeur de la colonne \og Questions\fg{}\Defaut{0.4}
+ \item[]La clé \Cle{CoefR} modifie, en multipliant \lstinline!\\linewidth! par la valeur donnée, la largeur de la colonne \og Réponse\fg{}\Defaut{0.35}
+ \item[]La clé \Cle{CoefJ} modifie, en multipliant \lstinline!\\linewidth! par la valeur donnée, la largeur de la colonne \og Jury\fg{}\Defaut{0.1}
+ \end{itemize}
+\end{Description}
+\end{CadreMP}
+\begin{Codes}[listing only]{0.4}{}
+\begin{Maquette}[CAN]{}
+ \begin{exercice}
+ On considère un triangle $ABC$\dots
+ \end{exercice}
+\end{Maquette}
+\end{Codes}
+%\begin{Maquette}[CAN]{}
+% \begin{exercice}
+% On considère un triangle $ABC$\dots
+% \end{exercice}
+%\end{Maquette}
+\clearpage
+\includepdf[nup=1x2,pages=-,landscape]{TestCAN.pdf}
+\clearpage
Comme on peut le voir, chaque type de travail est associé à une présentation. Ces présentations sont créées par les commandes associées à des styles prédéfinies.\footnote{Qu'on peut donc redéfinir. Par exemple, c'est ce que j'ai fait dans ce document pour la commande \lstinline!\\TikzFiche! : elle ne commence plus une nouvelle page.} \lstinline!tcolorbox! :
\begin{itemize}[label=\textbullet]
\item \lstinline!userdm/userdmcor! pour la clé \Cle{DM};
@@ -573,8 +603,9 @@ Pour modifier {\em plus finement} les entêtes des différentes maquettes, on di
\item \lstinline!\TikzParcours/\TikzParcoursCor! pour la clé \Cle{Parcours};%*
\item \lstinline!\TikzPdT/\TikzPdTCor! pour la clé \Cle{PdT};%*
\item \lstinline!\TikzCours! pour la clé \Cle{Cours};
-\item \lstinline!\TikzContrat/\TikzContratCor! pour la clé \Cle{PdT};%*
-\item et \lstinline!\TikzFdR/\TikzFdRCor! pour la clé \Cle{PdT}.%*
+\item \lstinline!\TikzContrat/\TikzContratCor! pour la clé \Cle{Contrat};%*
+\item \lstinline!\TikzFdR/\TikzFdRCor! pour la clé \Cle{FdR};%*
+\item et \lstinline!\TikzCAN/\TikzCANCor! pour la clé \Cle{CAN}.%*
\end{itemize}
Leurs modifications seront facilitées en copiant le code fourni par le fichier \lstinline!ProfMaquette.sty!.
\clearpage
@@ -607,7 +638,7 @@ Si l'on souhaite davantage de niveaux d'évaluations (ou moins), on utilisera le
L'environnement \lstinline!exercice! doit {\em impérativement} être inclus dans un environnement \lstinline!Maquette! car le choix de document influence la présentation des exercices.
\begin{Codes}[]{0.5}{}
\begin{Maquette}[IE]{Theme=Les fonctions,Niveau=3,Classe=Gide}
- \begin{exercice}
+ \begin{exercice}%
La fonction $f:x\mapsto3x+2$ est-elle une fonction affine ? Justifier.
\end{exercice}
\end{Maquette}
@@ -636,10 +667,8 @@ L'environnement \lstinline!exercice! doit {\em impérativement} être inclus dan
\subsection*{La personnalisation}
On peut, dans un premier temps, utiliser les clés suivantes :
\begin{Description}
-\item[La clé \Cle{BackGround}]\Defaut{white}
- modifie les arrière-plans des exercices.
-\item[La clé \Cle{Cadre}]\Defaut{gray!50}
- modifie la couleur du cadre des exercices.
+\item[La clé \Cle{BackGround}] modifie les arrière-plans des exercices.\Defaut{white}
+\item[La clé \Cle{Cadre}] modifie la couleur du cadre des exercices.\Defaut{gray!50}
\end{Description}
\begin{Codes}[]{0.4}{}
\begin{Maquette}[Fiche]{Theme=Les fonctions,Niveau=3,Classe=Gide}
@@ -656,9 +685,9 @@ On remarque que certains exercices sont associés à un total de point. C'est un
\item est {\em fixée} à {\sffamily false} pour la clé \Cle{Fiche};
\item est positionnée à {\sffamily true} mais {\em modifiable} pour les clés \Cle{DM}, \Cle{DS} et \Cle{IE}.
\end{itemize}
-\item[La clé \Cle{BaremeDetaille}]\Defaut{false}\par qui a le même fonctionnement que la clé \Cle{BaremeTotal}.
- La commande \lstinline!\brm{}! permet la construction du barème (détaillé et total).
-\item[La clé \Cle{MotPoint}]\Defaut{point}\par donnée sous forme de texte puisque le pluriel est géré.
+\item[La clé \Cle{BaremeDetaille}] a le même fonctionnement que la clé \Cle{BaremeTotal}.
+ La commande \lstinline!\brm{}! permet la construction du barème (détaillé et total).\Defaut{false}
+\item[La clé \Cle{MotPoint}] donnée sous forme de texte puisque le pluriel est géré.\Defaut{point}
\begin{Codes}[listing only]{0.4}{}
\begin{Maquette}[DS]{Numero=3,Classe=Euler,Niveau=4}
\begin{exercice} % ici le barème est total, pas de détail : comportement par défaut
@@ -732,10 +761,8 @@ Si on souhaite citer la source d'un exercice ou lui donner un titre, on dispose
Les clés décrites dans cette partie ne sont disponibles que pour les maquettes
\lstinline!Fiche! / \lstinline!Parcours!.
\begin{Description}
-\item[La clé \Cle{Oral}]\Defaut{false}\par
- pour indiquer que l'exercice se résout oralement.
-\item[La clé \Cle{Calculatrice}]\Defaut{true}\par
- pour afficher que la calculatrice {\em est interdite}.
+\item[La clé \Cle{Oral}] pour indiquer que l'exercice se résout oralement.\Defaut{false}
+\item[La clé \Cle{Calculatrice}] pour afficher que la calculatrice {\em est interdite}.\Defaut{true}
\end{Description}
\begin{Codes}[listing only,listing options={frame=,escapechar=!}]{0.4}{}
\begin{Maquette}[Fiche]{Theme=Calcul mental}
@@ -1088,6 +1115,25 @@ Dans le cas de cette maquette, l'environnement \lstinline!exercice! dispose des
\end{exercice}
\end{Maquette}
\clearpage
+\subsection*{Focus sur la maquette \lstinline!CAN!}
+Dans le cas de cette maquette, l'environnement \lstinline!exercice! n'admet aucune clé. La création de la page de garde et du tableau est automatique mais nécessite {\em au moins} deux compilations pour adapter au mieux les dimensions du tableau.
+
+La commande \lstinline!\Complement{}! permet d'ajouter du contenu à la colonne \og Réponse\fg.
+
+\begin{Codes}[listing only]{0.5}{}
+% cet exemple a été créé avec une feuille au format A5
+\begin{Maquette}[CAN]{CoefQ=0.5,CoefR=0.25}
+ \begin{exercice}
+ $17+19$
+ \end{exercice}
+ \begin{exercice}
+ $ABC$ est un triangle tel que $\widehat{ABC}=\ang{30}$ et $\widehat{BCA}=\ang{70}$. Alors\dots
+ \Complement{$\widehat{CAB}=\dots$}
+ \end{exercice}
+\end{Maquette}
+\end{Codes}
+\includegraphics{pg_0002-crop.pdf}
+\clearpage
\subsection*{\og Correction\fg{} des exercices}
Un exercice avec correction pourra\footnote{Dans les faits, seul l'environnement \lstinline!exercice! est nécessaire.} avoir la forme suivante :
\begin{Codes}[listing only]{0.4}{}
@@ -1120,7 +1166,7 @@ On peut gérer la correction des exercices à deux niveaux :
\end{quote}
\end{Description}
-Pour la maquette \lstinline!ParcoursPerso!, seule la clé \Cle{CorrigeFin} est autorisée.
+Pour les maquettes \lstinline!ParcoursPerso! et \lstinline!CAN!, seule la clé \Cle{CorrigeFin} est autorisée.
\begin{Codes}[listing only]{0.4}{\footnotesize}
\begin{Maquette}[IE,CorrigeApres]{Theme=Calcul littéral}
@@ -1275,7 +1321,7 @@ Cela engendre, si nécessaire, la création de fichier \lstinline!*.sol! pour le
\clearpage
\section*{Historique}
\begin{description}
-\item[\PfMfiledate{}--v \PfMfileversion] Création des feuilles de route et contrat de confiance.
+\item[\PfMfiledate{}--v \PfMfileversion] Création du format CAN (Course aux nombres).
\end{description}
\end{document}
%%% Local Variables:
diff --git a/macros/latex/contrib/profmaquette/latex/ProfMaquette.sty b/macros/latex/contrib/profmaquette/latex/ProfMaquette.sty
index 31e188b47a..714e745a63 100644
--- a/macros/latex/contrib/profmaquette/latex/ProfMaquette.sty
+++ b/macros/latex/contrib/profmaquette/latex/ProfMaquette.sty
@@ -2,35 +2,35 @@
% licence : Released under the LaTeX Project Public License v1.3c
% or later, see http://www.latex-project.org/lppl.txtf
\NeedsTeXFormat{LaTeX2e}%
-\def\filedate{2023/10/25}%
+\def\filedate{2023/11/01}%
\let\PfMfiledate\filedate%
-\def\fileversion{0.55}%
+\def\fileversion{0.65}%
\let\PfMfileversion\fileversion%
\ProvidesPackage{ProfMaquette}[\filedate\space v\fileversion\space Maquettage de documents]%
% packages nécessaires
-\RequirePackage{verbatim}
+\RequirePackage{verbatim}%
-\RequirePackage{calc}
+\RequirePackage{calc}%
-\RequirePackage{xlop}
+\RequirePackage{xlop}%
-\RequirePackage{varwidth}
+\RequirePackage{varwidth}%
-\RequirePackage{tcolorbox}
-\tcbuselibrary{breakable,external,fitting,hooks,magazine,poster,raster,skins,theorems,listings,listingsutf8}
+\RequirePackage{tcolorbox}%
+\tcbuselibrary{breakable,external,fitting,hooks,magazine,poster,raster,skins,theorems,listings,listingsutf8}%
-\RequirePackage{xinttools}
+\RequirePackage{xinttools}%
-\RequirePackage{listofitems}
-\RequirePackage{array}
-\RequirePackage{datatool}
+\RequirePackage{listofitems}%
+\RequirePackage{array}%
+\RequirePackage{datatool}%
-\RequirePackage{modulus}
+\RequirePackage{modulus}%
%définition des clés
\RequirePackage{simplekv}
-\setKVdefault[Boulot]{Cours=false,Base=false,BaseHTML=false,Fiche=false,DM=false,DS=false,IE=false,Kholle=false,RecapBrevet=false,PdT=false,Parcours=false,Contrat=false,FdR=false,ParcoursPerso=false,CorrigeApres=false,CorrigeFin=false,CorrigeAll=false,Brevet=false,BaremeComplet=false,BaremeGlobal=false,CorrectionColonnes=false,Epaisseur=0pt,AllDirect=false,AllPouce=false}%Les deux derniers pour essayer de mettre tous les exercices d'un même fichier en mode Reponse, en mode Indice. Pas implanté, pas testé
+\setKVdefault[Boulot]{Cours=false,Base=false,BaseHTML=false,CAN=false,Fiche=false,DM=false,DS=false,IE=false,Kholle=false,RecapBrevet=false,PdT=false,Parcours=false,Contrat=false,FdR=false,ParcoursPerso=false,CorrigeApres=false,CorrigeFin=false,CorrigeAll=false,Brevet=false,BaremeComplet=false,BaremeGlobal=false,CorrectionColonnes=false,Epaisseur=0pt,AllDirect=false,AllPouce=false}%Les deux derniers pour essayer de mettre tous les exercices d'un même fichier en mode Reponse, en mode Indice. Pas implanté, pas testé
\defKV[Boulot]{Colonnes=\setKV[Boulot]{CorrectionColonnes}}%
\setKVdefault[Cours]{Couleur=Crimson,Theme=Trace écrite,NomExercice=Exercice}%
\setKVdefault[DM]{Numero=1,Date=\today,Classe={},Niveau=3,Code=\jobname}%
@@ -46,6 +46,7 @@
\setKVdefault[RecapBrevet]{Theme=Les nombres décimaux,Date=\today,Code={},NomExercice=Exercice}%
\setKVdefault[Kholle]{Sujet=1,Numero=1,Date=15,Niveau=TSI-1,Code=\jobname,Lieu=Lycée
du Hainaut (Valenciennes),NomEleve=Albert Einstein,CR=false}%
+\setKVdefault[CAN]{Date=\today,Niveau=6,Duree=9,CoefQ=0.4,CoefR=0.35,CoefJ=0.1}%
\setKVdefault[ClesExercices]{NbQuestions=1,PasTitre=false,AffichageSource=false,BaremeTotal,BaremeDetaille=false,MotPoint=point,AffichageTitre=false,Calculatrice=true,Oral=false,Difficulte=0,AffichageCompetence=false,PasCorrige=false,Direct=false,Pouce=false,Parcours=false,Contrat=false,FdR=false,Routes=false,Stops=false,Background=white,Cadre=gray!50,Numerote}%
\defKV[ClesExercices]{Source=\setKV[ClesExercices]{AffichageSource}}%
\defKV[ClesExercices]{Titre=\setKV[ClesExercices]{AffichageTitre}}%
@@ -64,9 +65,12 @@
\newlength\PfMRayonSchemaContrat%
\newlength\PfMLargeurSchemaFdR%
\newlength\PfMRayonSchemaFdR%
-\newlength{\PfMHauteurAppreciation}%
+\newlength\PfMHauteurAppreciation%
+\newlength\PfMHauteurRemarque%
+\newlength\PfMLargeurQuestion%
+\newlength\PfMLargeurReponse%
+\newlength\PfMLargeurJury%
\setlength{\PfMHauteurAppreciation}{5cm}%
-\newlength{\PfMHauteurRemarque}%
\setlength{\PfMHauteurRemarque}{5cm}%
% définition des compteurs
\newcounter{PfMMaquette}%Pour compter le nombres de "travaux"
@@ -92,21 +96,22 @@
\newcounter{PfMNbLogo}%Pour décaler les logos sur la ligne haute de tcolorbox
\setcounter{PfMNbLogo}{0}%
\newcount\Orientation%Pour le schéma des parcours
+\newcounter{PfMCNNumQ}%
% couleurs
-\colorlet{PfMColCpt}{gray!50}
-\colorlet{PfMColSrc}{gray!50}
+\colorlet{PfMColCpt}{gray!50}%
+\colorlet{PfMColSrc}{gray!50}%
%\colorlet{PfMCadreFiche}{gray!50}
-\colorlet{PfMCadreDM}{gray!85}
-\colorlet{PfMCadreParcours}{gray!50}
-\colorlet{PfMCadreContrat}{gray!50}
-\colorlet{PfMCadreFdR}{gray!50}
+\colorlet{PfMCadreDM}{gray!85}%
+\colorlet{PfMCadreParcours}{gray!50}%
+\colorlet{PfMCadreContrat}{gray!50}%
+\colorlet{PfMCadreFdR}{gray!50}%
% Définitions de commandes
-\newcommand\PfMIENom{\dotfill}
-\newcommand\PfMIEPrenom{\dotfill}
-\newcommand\PfMIEClasse{\dotfill}
-\newcommand\PfMCompNA{NA}
-\newcommand\PfMCompECA{ECA}
-\newcommand\PfMCompA{A}
+\newcommand\PfMIENom{\dotfill}%
+\newcommand\PfMIEPrenom{\dotfill}%
+\newcommand\PfMIEClasse{\dotfill}%
+\newcommand\PfMCompNA{NA}%
+\newcommand\PfMCompECA{ECA}%
+\newcommand\PfMCompA{A}%
% Pour la gestion de l'aléatoire
% afin de permettre d'utiliser le même exercice.
% Extraire des sommets
@@ -169,6 +174,7 @@
\RenewDocumentCommand\ChoixAlea{s o m m m}{%
\IfBooleanTF{#1}{%
\stepcounter{PfMAlea}%
+% je sauvegarde la valeur \thePfMExo-\thePfMAlea
\IfNoValueTF{#2}{%
\expandafter\xdef\csname valeur\Roman{PfMExo}\roman{PfMAlea}\endcsname{\fpeval{randint(#3,#4)}}%
\expandafter\xdef\csname #5\endcsname{\csname valeur\Roman{PfMExo}\roman{PfMAlea}\endcsname}%
@@ -212,7 +218,7 @@
% #4 valeur(s) exclue(s)
% #5 Nom de la liste qui récupère les données.
\ifx\bla#4\bla%
- \PackageWarning{ProfMaquette}{Il faut définir au moins une valeur à exclure.}
+ \PackageWarning{ProfMaquette}{Il faut définir au moins une valeur à exclure.}%
\else%
\xdef\PfMMixFoo{#2}%
\setsepchar{,}\ignoreemptyitems%
@@ -250,23 +256,71 @@
\NewDocumentCommand\RestoreChoixAlea{m}{%
\stepcounter{PfMAlea}%
- \expandafter\xdef\csname #1\endcsname{\csname valeur\Roman{PfMExoSol}\roman{PfMAlea}\endcsname}
+ %Je restaure la valeur \thePfMExoSol-\thePfMAlea
+ \expandafter\xdef\csname #1\endcsname{\csname valeur\Roman{PfMExoSol}\roman{PfMAlea}\endcsname}%
}%
\NewDocumentCommand\ExporteListe{mm}{%
%#1 le nom de la liste
%#2 le contenu de la liste.
- \stepcounter{PfMAlea}
+ \stepcounter{PfMAlea}%
\expandafter\xdef\csname Liste\Roman{PfMExo}\roman{PfMAlea}\endcsname{#2}%
- \expandafter\xdef\csname #1\endcsname{\csname Liste\Roman{PfMExo}\roman{PfMAlea}\endcsname}
+ \expandafter\xdef\csname #1\endcsname{\csname Liste\Roman{PfMExo}\roman{PfMAlea}\endcsname}%
}%
\NewDocumentCommand\RestoreListe{m}{%
%#1 le nom de la liste à restaurer
\stepcounter{PfMAlea}%
- \expandafter\xdef\csname #1\endcsname{\csname Liste\Roman{PfMExoSol}\roman{PfMAlea}\endcsname}
+ \expandafter\xdef\csname #1\endcsname{\csname Liste\Roman{PfMExoSol}\roman{PfMAlea}\endcsname}%
}%
+%%
+%\newcounter{Melquestions}%
+%\newcounter{Comptequestions}%
+%
+%\NewDocumentEnvironment{Enumelange}{o+b}{%
+% \setcounter{Melquestions}{0}%
+% \setsepchar{\item}%
+% \readlist*\ListeTest{#2}%
+% \IfNoValueTF{#1}{%
+% \ChoixAleaMultiMix{\ListeTestlen}{1}{\ListeTestlen}{0}{\ListeShuffleA}%
+% \xdef\MelangeValeurTotale{\ListeTestlen}%
+% }{%
+% \ChoixAleaMultiMix{#1}{1}{\ListeTestlen}{0}{\ListeShuffleA}%
+% \xdef\MelangeValeurTotale{#1}%
+% }%
+% \ExporteListe{ListeShuffle}{\ListeShuffleA}%
+% \setsepchar{,}\ignoreemptyitems%
+% \readlist*\ListeNumQ{\ListeShuffleA}%
+% \setcounter{Comptequestions}{1}%
+% \begin{enumerate}
+% \loop%
+% \setcounter{Melquestions}{\ListeNumQ[\theComptequestions]}%
+% \item \ListeTest[\theMelquestions]%
+% \stepcounter{Comptequestions}%
+% \ifnum\theComptequestions<\numexpr\MelangeValeurTotale+1%
+% \repeat%
+% \end{enumerate}
+%}{}%
+
+%\NewDocumentEnvironment{Enumelangesol}{b}{%
+% \setcounter{Melquestions}{0}%
+% \setsepchar{\item}%
+% \readlist*\ListeTest{#1}%
+% \RestoreListe{ListeShuffle}%
+% \setsepchar{,}\ignoreemptyitems%
+% \readlist*\ListeNumQ{\ListeShuffle}%
+% \setcounter{Comptequestions}{1}%
+% \begin{enumerate}
+% \loop%
+% \setcounter{Melquestions}{\ListeNumQ[\theComptequestions]}%
+% \item \ListeTest[\theMelquestions]%
+% \stepcounter{Comptequestions}%
+% \ifnum\theComptequestions<\numexpr\ListeNumQlen+1%
+% \repeat%
+% \end{enumerate}
+%}{}%
+
% Définitions pour les compétences
\NewDocumentCommand\Competences{O{3}m}{%
\setsepchar[*]{/}\ignoreemptyitems%
@@ -312,14 +366,14 @@
\def\SolutionWrite{%
\setcounter{PfMAlea}{0}%
- \@bsphack
- \immediate\openout \verbatim@out "\jobname-Ex\thePfMExo.sol" %
- \let\do\@makeother\dospecials
- \catcode`\^^M\active
+ \@bsphack%
+ \immediate\openout \verbatim@out "\jobname-Ex\thePfMExo.sol"%
+ \let\do\@makeother\dospecials%
+ \catcode`\^^M\active%
\def\verbatim@processline{%
\immediate\write\verbatim@out{\the\verbatim@line}}%
- \verbatim@start}
-\def\endSolutionWrite{\immediate\closeout\verbatim@out\@esphack}
+ \verbatim@start}%
+\def\endSolutionWrite{\immediate\closeout\verbatim@out\@esphack}%
\def\SolutionWritePP{%
\@bsphack
@@ -450,6 +504,13 @@
}%
\NewDocumentCommand\PfMAffichageCorrige{}{%
+ \ifboolKV[Boulot]{CAN}{%Toto
+ \xintFor* ##1 in{\xintSeq{1}{\PfMCANTotalExo}}\do{%
+ \setcounter{PfMExoSol}{##1}%
+ \setcounter{PfMAlea}{0}%
+ \IfFileExists{\jobname-Ex##1.sol}{\textbf{Question\ifnum\PfMCANTotalExo=1\relax\else~##1 :\fi}~\input{\jobname-Ex##1.sol}\par\goodbreak}{}%
+ }%
+ }{%
\xintFor* ##1 in{\xintSeq{1}{\thePfMExo}}\do{%
\setcounter{PfMExoSol}{##1}%
\setcounter{PfMAlea}{0}%
@@ -458,6 +519,7 @@
}%
}%
}%
+ }%
}%
%%%%%%%% BAREME %%%%%%%%%%%
%% Bareme
@@ -1083,6 +1145,104 @@
%\makeatother
+%CAN
+\setsepchar[*]{,*/}%
+\readlist*\ListeNoms{Aude/Elle/d'Aude/qu'Aude,Bernard/Il/de Bernard/que Bernard,Céline/Elle/de Céline/que Céline,Daniel/Il/de Daniel/que Daniel,\'Elise/Elle/d'\'Elise/qu'\'Elise,Fabien/Il/de Fabien/que Fabien,Gérard/Il/de Gérard/que Gérard,Hélène/Elle/d'Hélène/qu'Hélène,Ilies/Il/d'Ilies/qu'Ilies,Jasmine/Elle/de Jasmine/que Jasmine,Kylian/Il/de Kylian/que Kylian,Laurent/Il/de Laurent/que Laurent,Mathilde/Elle/de Mathilde/que Mathilde,Nina/Elle/de Nina/que Nina,Octave/Il/d'Octave/qu'Octave,Philippe/Il/de Philippe/que Philippe,Joachim/Il/de Joachim/que Joachim,Thérèse/Elle/de Thérèse/que Thérèse,Nawel/Elle/de Nawel/que Nawel,Alexandre/Il/d'Alexandre/qu'Alexandre,Maxence/Il/de Maxence/que Maxence,Sophie/Elle/de Sophie/que Sophie,Christophe/Il/de Christophe/que Christophe,Myriam/Elle/de Myriam/que Myriam,Nathalie/Elle/de Nathalie/que Nathalie,Sébastien/Il/de Sébastion/que Sébastien}%
+\readlist*\ListeChersObjets{montre/une,collier/un,bague/une,pendentif/un}%
+\setsepchar{,}%
+\readlist*\ListePetitsObjets{bonbons,billes,biscuits,gommes,clous,vis,cahiers,trousses}%
+\readlist*\ListeFruits{pommes,poires,abricots,cerises,fraises,framboises,noix,pêches,nectarines,myrtilles,oranges,mandarines,kiwis}%
+\readlist*\ListeVariables{a,b,c,m,n,p,r,s,t,x,y,z}%
+
+\makeatletter
+\def\ExoCANWrite{%
+ \setcounter{PfMAlea}{0}%
+ \PfMChoixCorrection%
+ \stepcounter{PfMExo}%
+ \immediate\write\@auxout{%
+ \string\opcopy{\thePfMExo}{TotalExo}%
+ }%
+ \@bsphack
+ \immediate\openout \verbatim@out "\jobname-Ex\thePfMExo.can"
+ \let\do\@makeother\dospecials
+ \catcode`\^^M\active
+ %\immediate\write\verbatim@out{ \string\setcounter{PfMAlea}{0}}
+ \def\verbatim@processline{\immediate\write\verbatim@out{\the\verbatim@line}}
+ \verbatim@start}
+\def\endExoCANWrite{\immediate\closeout\verbatim@out\@esphack}
+\makeatother
+
+\NewDocumentCommand\Complement{+m}{%
+ \ifboolKV[Boulot]{CAN}{%
+ \expandafter\xdef\csname CNReponse\endcsname{#1}%
+ }{%
+ \begin{center}
+ #1%
+ \end{center}
+ }%
+}%
+
+\NewDocumentCommand\EcartComplement{m}{%
+ \rule{0mm}{#1}%
+}%
+
+\tcbset{%
+ usercan/.style={%
+ enhanced,
+ % spread upwards=-1cm,colback=gray!5%
+ frame hidden,
+ colback=white,
+ middle=24pt,
+ overlay={% unbroken and first={%
+ \draw[line width=2pt] (frame.north west)--(frame.north east);
+ \draw[line width=2pt] (frame.south west)--(frame.south east);
+ }
+ }%
+}%
+\tcbset{%
+ usercancor/.style={%
+ spread upwards=-1cm,colback=gray!5%
+ }%
+}%
+
+\makeatletter
+\NewDocumentCommand\TikzCAN{}{%
+ \begin{tcolorbox}[usercan]%
+ {\sc Nom :} \PfCTBstrut\pointilles[0.35\linewidth]\hfill\textbf{\sc Prénom :} \pointilles[0.35\linewidth]
+ \par\bigskip\par
+ \textbf{\sc Classe :} \pointilles[0.35\linewidth]\hfill
+ \begin{minipage}{0.3\linewidth}
+ \begin{tcolorbox}
+ \textbf{\sc Score :} \hfill\textbf{/\@ifundefined{Op@TotalExo}{Recompilez}{\opexport{TotalExo}{\TotalExo}\TotalExo}}
+ \end{tcolorbox}
+ \end{minipage}
+ \tcblower
+ \begin{itemize}
+ \item[\faCheck] \textbf{Durée : \useKV[CAN]{Duree} minutes.}\\[0.5em]
+ \item[\faCheck] \textit{L'épreuve comporte \@ifundefined{Op@TotalExo}{Recompilez}{\opexport{TotalExo}{\TotalExo}\TotalExo{} question\ifnum\TotalExo=1\else\relax s\fi.}}\\[0.5em]
+ \item[\faCheck] \textit{L'usage de la calculatrice et du brouillon sont interdits. Il n'est pas permis d'écrire des calculs intermédiaires.}
+ \end{itemize}
+ \vspace*{12pt}
+ \end{tcolorbox}%
+ \begin{center}
+ \Large Sujet \useKV[CAN]{Niveau}\hspace{0.15\linewidth}\useKV[CAN]{Date}
+ \end{center}
+ \clearpage%
+}%
+\makeatother
+
+\makeatletter
+\NewDocumentCommand\TikzCANCor{m}{%
+ \clearpage
+ \setKV[CAN]{#1}%
+ \begin{tcolorbox}[usercancor]%
+ \begin{center}
+ \Large\sffamily Course aux nombres (Correction)
+ \end{center}
+ \hfill\useKV[CAN]{Niveau}%
+ %\par{\tiny\useKV[FdR]{Code}}\hfill{\scriptsize\useKV[FdR]{Date}}%
+ \end{tcolorbox}%
+}
%%% FdR %%%
\tcbset{%
userfdr/.style={%
@@ -1357,7 +1517,30 @@
\endtcolorbox%
}{}
-\newenvironment{exerciceDS}[1][]{%
+\NewDocumentEnvironment{exerciceDS}{so+b}{%
+ \setcounter{PfMAlea}{0}%
+ \useKVdefault[ClesExercices]%
+ \setKV[ClesExercices]{#2}%
+ \refstepcounter{PfMSection}%
+ \PfMChoixCorrection%
+ \refstepcounter{PfMExo}%
+ \immediate\write\@auxout{%
+ \string\opcopy{\thePfMExo}{TotalExo}%
+ }
+ \ifboolKV[ClesExercices]{BaremeTotal}{%
+ \immediate\write\@auxout{%
+ \string\opcopy{0}{total\the\c@PfMSection-\the\c@PfMExo}%
+ }}{}
+ \tcolorbox[%
+ tikzds,
+ label is label,
+ label=page-\thePfMMaquette-\thePfMExo
+ ]
+ #3
+\endtcolorbox%
+}{}%
+
+\newenvironment{exerciceDSold}[1][]{%
\setcounter{PfMAlea}{0}%
\useKVdefault[ClesExercices]%
\setKV[ClesExercices]{#1}%
@@ -1377,7 +1560,7 @@
label=page-\thePfMMaquette-\thePfMExo
]
}{\endtcolorbox%
-}
+}%
\makeatother
%%% Recap Brevet
%%% Style Brevet
@@ -2227,6 +2410,42 @@
\useKVdefault[Boulot]%
\setKV[Boulot]{#1}%
\IfHookExistsTF{env/exercice/after}{\RemoveFromHook{env/exercice/after}[*]\AddToHook{env/exercice/after}[ChoixExo]{\PfMChoixAffichageCorrection}}{\AddToHook{env/exercice/after}[ChoixExo]{\PfMChoixAffichageCorrection}}%
+ % Test
+ \IfHookExistsTF{env/exercice/begin}{\RemoveFromHook{env/exercice/begin}[*]}{}%
+ \IfHookExistsTF{env/Maquette/end}{\RemoveFromHook{env/Maquette/end}[*]}{}%
+ \ifboolKV[Boulot]{CAN}{%
+ \setKV[CAN]{#2}\TikzCAN%
+ \setcounter{PfMCNNumQ}{1}%
+ \setlength{\PfMLargeurQuestion}{\useKV[CAN]{CoefQ}\linewidth}\setlength{\PfMLargeurReponse}{\useKV[CAN]{CoefR}\linewidth}\setlength{\PfMLargeurJury}{\useKV[CAN]{CoefJ}\linewidth}%
+ \let\exercice\ExoCANWrite\let\endexercice\endExoCANWrite%
+ \AddToHook{env/exercice/begin}{\setcounter{PfMAlea}{0}}%
+ \AddToHook{env/Maquette/end}{%
+ \xdef\PfMCANTotalExo{\thePfMExo}%
+ \setcounter{PfMExo}{0}%
+ \renewcommand{\arraystretch}{2}%
+ \begin{longtable}{|c|m{\PfMLargeurQuestion}|>{\centering\arraybackslash}m{\PfMLargeurReponse}|m{\PfMLargeurJury}|}%
+ \hhline{~---}%
+ \multicolumn{1}{c|}{}&\cellcolor{gray!15}\centering Question&\cellcolor{gray!15}\centering Réponse&\cellcolor{gray!15}\centering\arraybackslash Jury\\%
+ \hline%
+ \endhead%
+ \xintFor* ##1 in {\xintSeq{1}{\PfMCANTotalExo}}\do{%
+ \ttfamily{\thePfMCNNumQ}\stepcounter{PfMCNNumQ}&\Complement{}\stepcounter{PfMExo}\setcounter{PfMAlea}{0}\input{\jobname-Ex##1.can}&\CNReponse&\\
+ \hline%
+ }%
+ \end{longtable}%
+ \renewcommand{\arraystretch}{1}%
+ }%
+ \ifboolKV[Boulot]{CorrigeFin}{%
+ \AddToHook{env/Maquette/after}[Correction]{%
+ \setKV[Boulot]{#1}%
+ \setlength{\columnseprule}{\useKV[Boulot]{Epaisseur}}%
+ \TikzCANCor{#2}%
+ \ifboolKV[Boulot]{CorrectionColonnes}{\begin{multicols}{\useKV[Boulot]{Colonnes}}}{}%
+ \PfMAffichageCorrige%
+ \ifboolKV[Boulot]{CorrectionColonnes}{\end{multicols}}{}%
+ }%
+ }{}%
+ }{%
\ifboolKV[Boulot]{FdR}{%
\setKV[FdR]{#2}\TikzFdR%
\let\exercice\exerciceFdR\let\endexercice\endexerciceFdR%
@@ -2234,7 +2453,7 @@
\AddToHook{env/Maquette/after}[Correction]{%
\setKV[Boulot]{#1}%
\setlength{\columnseprule}{\useKV[Boulot]{Epaisseur}}%
- \TikzFdRCor{#2}
+ \TikzFdRCor{#2}%
\ifboolKV[Boulot]{CorrectionColonnes}{\begin{multicols}{\useKV[Boulot]{Colonnes}}}{}%
\PfMAffichageCorrige%
\ifboolKV[Boulot]{CorrectionColonnes}{\end{multicols}}{}%
@@ -2385,24 +2604,23 @@
}{}%
}{%
\ifboolKV[Boulot]{DS}{%
- \setKV[DS]{#2}\TikzDS%
+ \setKV[DS]{#2}\TikzDS
\let\exercice\exerciceDS\let\endexercice\endexerciceDS%
-% \let\Exercice\exerciceDS\let\endExercice\endexerciceDS%
- \ifboolKV[Boulot]{BaremeComplet}{%
- \begin{center}
- \TableauRecapitulatif
- \end{center}
- }{}%
- \ifboolKV[Boulot]{CorrigeFin}{%
- \AddToHook{env/Maquette/after}[Correction]{%
- \setKV[Boulot]{#1}%
- \setlength{\columnseprule}{\useKV[Boulot]{Epaisseur}}%
- \TikzDSCor{#2}%
- \ifboolKV[Boulot]{CorrectionColonnes}{\begin{multicols}{\useKV[Boulot]{Colonnes}}}{}%
- \PfMAffichageCorrige%
- \ifboolKV[Boulot]{CorrectionColonnes}{\end{multicols}}{}%
- }%
- }{}%
+ %\ifboolKV[Boulot]{BaremeComplet}{%
+ % \begin{center}
+ % \TableauRecapitulatif
+ % \end{center}
+ %}{}%
+ %\ifboolKV[Boulot]{CorrigeFin}{%
+ % \AddToHook{env/Maquette/after}[Correction]{%
+ % \setKV[Boulot]{#1}%
+ % \setlength{\columnseprule}{\useKV[Boulot]{Epaisseur}}%
+ % \TikzDSCor{#2}%
+ % \ifboolKV[Boulot]{CorrectionColonnes}{\begin{multicols}{\useKV[Boulot]{Colonnes}}}{}%
+ % \PfMAffichageCorrige%
+ % \ifboolKV[Boulot]{CorrectionColonnes}{\end{multicols}}{}%
+ % }%
+ %}{}%
}{%
\ifboolKV[Boulot]{IE}{%
\setKV[IE]{#2}\TikzIE%
@@ -2445,6 +2663,7 @@
}%
}%
}%
+}
}{}%
%\makeatother