summaryrefslogtreecommitdiff
path: root/macros/latex-dev/base
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex-dev/base')
-rw-r--r--macros/latex-dev/base/README.md2
-rw-r--r--macros/latex-dev/base/alltt.pdfbin223766 -> 223766 bytes
-rw-r--r--macros/latex-dev/base/cfgguide.pdfbin264168 -> 264168 bytes
-rw-r--r--macros/latex-dev/base/changes.txt71
-rw-r--r--macros/latex-dev/base/classes.pdfbin560495 -> 560495 bytes
-rw-r--r--macros/latex-dev/base/clsguide-historic.pdfbin415956 -> 415956 bytes
-rw-r--r--macros/latex-dev/base/clsguide.pdfbin495486 -> 495486 bytes
-rw-r--r--macros/latex-dev/base/cmfonts.pdfbin292600 -> 292600 bytes
-rw-r--r--macros/latex-dev/base/cyrguide.pdfbin257359 -> 257359 bytes
-rw-r--r--macros/latex-dev/base/doc-code.pdfbin1079175 -> 1078843 bytes
-rw-r--r--macros/latex-dev/base/doc.dtx4
-rw-r--r--macros/latex-dev/base/doc.pdfbin758107 -> 757312 bytes
-rw-r--r--macros/latex-dev/base/docstrip.pdfbin506772 -> 506772 bytes
-rw-r--r--macros/latex-dev/base/encguide.pdfbin1318576 -> 1318576 bytes
-rw-r--r--macros/latex-dev/base/exscale.pdfbin204708 -> 204708 bytes
-rw-r--r--macros/latex-dev/base/fix-cm.pdfbin287727 -> 287727 bytes
-rw-r--r--macros/latex-dev/base/fntguide.pdfbin522637 -> 522637 bytes
-rw-r--r--macros/latex-dev/base/graphpap.pdfbin161722 -> 161722 bytes
-rw-r--r--macros/latex-dev/base/ifthen.pdfbin222460 -> 222460 bytes
-rw-r--r--macros/latex-dev/base/inputenc.pdfbin318372 -> 318372 bytes
-rw-r--r--macros/latex-dev/base/lamport-manual.pdfbin170876 -> 170876 bytes
-rw-r--r--macros/latex-dev/base/latexrelease.pdfbin282447 -> 282447 bytes
-rw-r--r--macros/latex-dev/base/latexsym.pdfbin200759 -> 200759 bytes
-rw-r--r--macros/latex-dev/base/lb2.pdfbin252519 -> 252519 bytes
-rw-r--r--macros/latex-dev/base/letter.pdfbin337788 -> 337788 bytes
-rw-r--r--macros/latex-dev/base/lgc2.pdfbin217663 -> 217663 bytes
-rw-r--r--macros/latex-dev/base/lppl.pdfbin132370 -> 132370 bytes
-rw-r--r--macros/latex-dev/base/ltcmdhooks-code.pdfbin753317 -> 756067 bytes
-rw-r--r--macros/latex-dev/base/ltcmdhooks-doc.pdfbin498918 -> 505075 bytes
-rw-r--r--macros/latex-dev/base/ltcmdhooks.dtx78
-rw-r--r--macros/latex-dev/base/ltcounts.dtx11
-rw-r--r--macros/latex-dev/base/ltfilehook-code.pdfbin806610 -> 806610 bytes
-rw-r--r--macros/latex-dev/base/ltfilehook-doc.pdfbin551943 -> 551941 bytes
-rw-r--r--macros/latex-dev/base/lthooks-code.pdfbin1251255 -> 1254049 bytes
-rw-r--r--macros/latex-dev/base/lthooks-doc.pdfbin762323 -> 762877 bytes
-rw-r--r--macros/latex-dev/base/lthooks.dtx50
-rw-r--r--macros/latex-dev/base/ltluatex.pdfbin325889 -> 325889 bytes
-rw-r--r--macros/latex-dev/base/ltmarks-code.pdfbin717810 -> 719005 bytes
-rw-r--r--macros/latex-dev/base/ltmarks-doc.pdfbin575888 -> 582809 bytes
-rw-r--r--macros/latex-dev/base/ltmarks.dtx18
-rw-r--r--macros/latex-dev/base/ltnews.pdfbin1431653 -> 1444433 bytes
-rw-r--r--macros/latex-dev/base/ltnews.tex2
-rw-r--r--macros/latex-dev/base/ltnews01.pdfbin169553 -> 169553 bytes
-rw-r--r--macros/latex-dev/base/ltnews02.pdfbin151773 -> 151773 bytes
-rw-r--r--macros/latex-dev/base/ltnews03.pdfbin151324 -> 151324 bytes
-rw-r--r--macros/latex-dev/base/ltnews04.pdfbin152551 -> 152551 bytes
-rw-r--r--macros/latex-dev/base/ltnews05.pdfbin175211 -> 175211 bytes
-rw-r--r--macros/latex-dev/base/ltnews06.pdfbin142867 -> 142867 bytes
-rw-r--r--macros/latex-dev/base/ltnews07.pdfbin138214 -> 138214 bytes
-rw-r--r--macros/latex-dev/base/ltnews08.pdfbin155442 -> 155442 bytes
-rw-r--r--macros/latex-dev/base/ltnews09.pdfbin130028 -> 130028 bytes
-rw-r--r--macros/latex-dev/base/ltnews10.pdfbin169433 -> 169433 bytes
-rw-r--r--macros/latex-dev/base/ltnews11.pdfbin112208 -> 112208 bytes
-rw-r--r--macros/latex-dev/base/ltnews12.pdfbin156764 -> 156764 bytes
-rw-r--r--macros/latex-dev/base/ltnews13.pdfbin182483 -> 182483 bytes
-rw-r--r--macros/latex-dev/base/ltnews14.pdfbin170722 -> 170722 bytes
-rw-r--r--macros/latex-dev/base/ltnews15.pdfbin130328 -> 130328 bytes
-rw-r--r--macros/latex-dev/base/ltnews16.pdfbin138107 -> 138107 bytes
-rw-r--r--macros/latex-dev/base/ltnews17.pdfbin166269 -> 166269 bytes
-rw-r--r--macros/latex-dev/base/ltnews18.pdfbin39839 -> 39839 bytes
-rw-r--r--macros/latex-dev/base/ltnews19.pdfbin225936 -> 225936 bytes
-rw-r--r--macros/latex-dev/base/ltnews20.pdfbin318193 -> 318193 bytes
-rw-r--r--macros/latex-dev/base/ltnews21.pdfbin245228 -> 245228 bytes
-rw-r--r--macros/latex-dev/base/ltnews22.pdfbin318026 -> 318026 bytes
-rw-r--r--macros/latex-dev/base/ltnews23.pdfbin286824 -> 286824 bytes
-rw-r--r--macros/latex-dev/base/ltnews24.pdfbin265497 -> 265497 bytes
-rw-r--r--macros/latex-dev/base/ltnews25.pdfbin205100 -> 205100 bytes
-rw-r--r--macros/latex-dev/base/ltnews26.pdfbin379733 -> 379733 bytes
-rw-r--r--macros/latex-dev/base/ltnews27.pdfbin251283 -> 251283 bytes
-rw-r--r--macros/latex-dev/base/ltnews28.pdfbin376950 -> 376950 bytes
-rw-r--r--macros/latex-dev/base/ltnews29.pdfbin455437 -> 455437 bytes
-rw-r--r--macros/latex-dev/base/ltnews30.pdfbin512240 -> 512240 bytes
-rw-r--r--macros/latex-dev/base/ltnews31.pdfbin526681 -> 526681 bytes
-rw-r--r--macros/latex-dev/base/ltnews32.pdfbin546540 -> 546540 bytes
-rw-r--r--macros/latex-dev/base/ltnews33.pdfbin522757 -> 522757 bytes
-rw-r--r--macros/latex-dev/base/ltnews34.pdfbin508345 -> 508345 bytes
-rw-r--r--macros/latex-dev/base/ltnews35.pdfbin563305 -> 563305 bytes
-rw-r--r--macros/latex-dev/base/ltnews36.pdfbin517934 -> 517934 bytes
-rw-r--r--macros/latex-dev/base/ltnews37.pdfbin456933 -> 456933 bytes
-rw-r--r--macros/latex-dev/base/ltnews38.pdfbin523675 -> 523675 bytes
-rw-r--r--macros/latex-dev/base/ltnews39.pdfbin541772 -> 541772 bytes
-rw-r--r--macros/latex-dev/base/ltnews40.pdfbin486885 -> 476853 bytes
-rw-r--r--macros/latex-dev/base/ltnews40.tex570
-rw-r--r--macros/latex-dev/base/ltnews41.pdfbin0 -> 222785 bytes
-rw-r--r--macros/latex-dev/base/ltnews41.tex190
-rw-r--r--macros/latex-dev/base/ltpara-code.pdfbin672995 -> 672995 bytes
-rw-r--r--macros/latex-dev/base/ltpara-doc.pdfbin560715 -> 560715 bytes
-rw-r--r--macros/latex-dev/base/ltproperties-code.pdfbin557533 -> 557320 bytes
-rw-r--r--macros/latex-dev/base/ltproperties-doc.pdfbin432296 -> 431802 bytes
-rw-r--r--macros/latex-dev/base/ltproperties.dtx11
-rw-r--r--macros/latex-dev/base/ltshipout-code.pdfbin821586 -> 821340 bytes
-rw-r--r--macros/latex-dev/base/ltshipout-doc.pdfbin567758 -> 567691 bytes
-rw-r--r--macros/latex-dev/base/ltshipout.dtx4
-rw-r--r--macros/latex-dev/base/ltsockets-code.pdfbin599231 -> 602006 bytes
-rw-r--r--macros/latex-dev/base/ltsockets-doc.pdfbin482086 -> 486428 bytes
-rw-r--r--macros/latex-dev/base/ltsockets.dtx36
-rw-r--r--macros/latex-dev/base/lttagging.dtx203
-rw-r--r--macros/latex-dev/base/lttemplates-code.pdfbin751718 -> 751718 bytes
-rw-r--r--macros/latex-dev/base/lttemplates-doc.pdfbin467500 -> 467500 bytes
-rw-r--r--macros/latex-dev/base/lttextcomp.dtx4
-rw-r--r--macros/latex-dev/base/ltvers.dtx4
-rw-r--r--macros/latex-dev/base/ltx3info.pdfbin219358 -> 219358 bytes
-rw-r--r--macros/latex-dev/base/ltxdoc.pdfbin244141 -> 244141 bytes
-rw-r--r--macros/latex-dev/base/makeindx.pdfbin165816 -> 165816 bytes
-rw-r--r--macros/latex-dev/base/manifest.txt3
-rw-r--r--macros/latex-dev/base/modguide.pdfbin257825 -> 257825 bytes
-rw-r--r--macros/latex-dev/base/nfssfont.pdfbin211314 -> 211314 bytes
-rw-r--r--macros/latex-dev/base/proc.pdfbin227065 -> 227065 bytes
-rw-r--r--macros/latex-dev/base/slides.pdfbin375493 -> 375493 bytes
-rw-r--r--macros/latex-dev/base/slifonts.pdfbin233905 -> 233905 bytes
-rw-r--r--macros/latex-dev/base/source2e.pdfbin6506843 -> 6521205 bytes
-rw-r--r--macros/latex-dev/base/syntonly.pdfbin189462 -> 189462 bytes
-rw-r--r--macros/latex-dev/base/tlc2.pdfbin290257 -> 290257 bytes
-rw-r--r--macros/latex-dev/base/tlc3.pdfbin385504 -> 385504 bytes
-rw-r--r--macros/latex-dev/base/tulm.pdfbin162773 -> 162773 bytes
-rw-r--r--macros/latex-dev/base/usrguide-historic.pdfbin439393 -> 439393 bytes
-rw-r--r--macros/latex-dev/base/usrguide.pdfbin487553 -> 488007 bytes
-rw-r--r--macros/latex-dev/base/usrguide.tex13
-rw-r--r--macros/latex-dev/base/utf8ienc.pdfbin353390 -> 353390 bytes
-rw-r--r--macros/latex-dev/base/webcomp.pdfbin146205 -> 146205 bytes
120 files changed, 939 insertions, 335 deletions
diff --git a/macros/latex-dev/base/README.md b/macros/latex-dev/base/README.md
index a22c57ad24..8e74772593 100644
--- a/macros/latex-dev/base/README.md
+++ b/macros/latex-dev/base/README.md
@@ -1,7 +1,7 @@
The LaTeX kernel
================
-Release 2024-11-01 pre-release 4
+Release 2025-06-01 pre-release 0
Overview
--------
diff --git a/macros/latex-dev/base/alltt.pdf b/macros/latex-dev/base/alltt.pdf
index 26c6b0e171..bd3211998e 100644
--- a/macros/latex-dev/base/alltt.pdf
+++ b/macros/latex-dev/base/alltt.pdf
Binary files differ
diff --git a/macros/latex-dev/base/cfgguide.pdf b/macros/latex-dev/base/cfgguide.pdf
index e8b7788146..7bf7bd0b18 100644
--- a/macros/latex-dev/base/cfgguide.pdf
+++ b/macros/latex-dev/base/cfgguide.pdf
Binary files differ
diff --git a/macros/latex-dev/base/changes.txt b/macros/latex-dev/base/changes.txt
index 5f0a4f5014..6321cf6fd8 100644
--- a/macros/latex-dev/base/changes.txt
+++ b/macros/latex-dev/base/changes.txt
@@ -6,6 +6,55 @@ to completeness or accuracy and it contains some references to files that are
not part of the distribution.
================================================================================
+================================================================================
+All changes above are only part of the development branch for the next release.
+================================================================================
+
+#########################
+# 2024-11-01 Release
+#########################
+
+2024-10-29 Yukai Chou <muzimuzhi@gmail.com>
+ * lthooks.dtx (subsection{Setting rules for hooks code}):
+ Skip mapping over undeclared \g__hook_<hook>_code_prop (gh/1513).
+
+2024-10-27 Marcel Krüger <Marcel.Krueger@latex-project.org>
+ * lttagging.dtx
+ Change tagging sockets with two arguments to drop the first argument
+ but return the second argument when the socket is disabled with \SuspendTagging.
+ Add expandable versions of tagging socket use commands.
+ * ltsocket.dtx
+ Add expandable versions of \socket_use_expandable:n.
+ Make internal plug definitions non-protected to allow expandable use.
+
+2024-10-26 Yukai Chou <muzimuzhi@gmail.com>
+ * ltcounts.dtx (subsection{Environment Counter Macros}):
+ Fully expand counter name in \theH<counter> commands (gh/1508)
+
+2024-10-23 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+ * doc.dtx:
+ A rollback comment leaked into the documentation (gh1418)
+
+2024-10-22 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+ * ltcmdhooks.dtx:
+ Some clarification why not all
+ commands allow generic cmd hooks (gh/1091, gh/1430 and gh/1501)
+
+2024-10-22 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
+ * ltshipout.dtx: correct documentation (gh/1470).
+
+ 2024-10-21 Matthew Bertucci <bertucci@math.utah.edu>
+ * lthooks.dtx
+ Define \IfHookEmptyT, \IfHookEmptyF
+ * ltmarks.dtx
+ Define \IfMarksEqualT, \IfMarksEqualF
+ * ltproperties.dtx
+ Define \IfPropertyRecordedT, \IfPropertyRecordedF
+
+2024-10-18 Clea Rees <reesc21@cf.ac.uk>
+ * lttextcomp.dtx
+ Fix typo in \ProvidesFile
+
2024-10-12 Joseph Wright <Joseph.Wright@latex-project.org>
* ltmiscen.dtx
Define \begin as an engine-protected macro
@@ -15,7 +64,7 @@ not part of the distribution.
Correct passing of token list content using \KeyValue
2024-10-02 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
- * lttagging.dtx: restore also paratagging in the para/restore socket,
+ * lttagging.dtx: restore also paratagging in the para/restore socket,
see https://github.com/latex3/tagging-project/issues/723
2024-09-25 Matthew Bertucci <bertucci@math.utah.edu>
@@ -25,7 +74,6 @@ not part of the distribution.
* lttagging.dtx: dummy for \tag_suspend:n and \tag_resume:n
* lttagging.dtx: declare tagging sockets for floats and caption.
-
2024-09-21 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
* ltcounts.dtx (subsection{Environment Counter Macros}):
@@ -34,7 +82,6 @@ not part of the distribution.
Use sockets in \refstepcounter for target and tagging support.
* ltmeta.dtx: move patches and change of \MakeLinkTarget from latex-lab.
* lttagging.dtx: add tagging socket for targets.
-
2024-09-15 Joseph Wright <Joseph.Wright@latex-project.org>
* lttemplates-doc.tex, lttemplates-code.tex:
@@ -125,12 +172,6 @@ not part of the distribution.
(subsection{Declaring commands and environments}):
Simplify \__cmd_declare_env:nnnn, use space-trimmed envname directly
-2024-06-23 Yukai Chou <muzimuzhi@gmail.com>
-
- * ltpara.dtx
- Append \everypar toks to \g__parar_standard_everypar_tl, rollback
- 2023/06/01 (gh/1386)
-
2024-06-24 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
* ltlists.dtx:
@@ -198,9 +239,15 @@ not part of the distribution.
* lttemplates.dtx:
Fix markup typos.
-================================================================================
-All changes above are only part of the development branch for the next release.
-================================================================================
+#########################
+# 2024-06-01 PL2 Release
+#########################
+
+2024-06-23 Yukai Chou <muzimuzhi@gmail.com>
+
+ * ltpara.dtx
+ Append \everypar toks to \g__parar_standard_everypar_tl, rollback
+ 2023/06/01 (gh/1386)
#########################
# 2024-06-01 PL1 Release
diff --git a/macros/latex-dev/base/classes.pdf b/macros/latex-dev/base/classes.pdf
index 094b379cb6..a43910f485 100644
--- a/macros/latex-dev/base/classes.pdf
+++ b/macros/latex-dev/base/classes.pdf
Binary files differ
diff --git a/macros/latex-dev/base/clsguide-historic.pdf b/macros/latex-dev/base/clsguide-historic.pdf
index c5b07e748b..76ce49be4b 100644
--- a/macros/latex-dev/base/clsguide-historic.pdf
+++ b/macros/latex-dev/base/clsguide-historic.pdf
Binary files differ
diff --git a/macros/latex-dev/base/clsguide.pdf b/macros/latex-dev/base/clsguide.pdf
index 526a571cd2..1658b6168e 100644
--- a/macros/latex-dev/base/clsguide.pdf
+++ b/macros/latex-dev/base/clsguide.pdf
Binary files differ
diff --git a/macros/latex-dev/base/cmfonts.pdf b/macros/latex-dev/base/cmfonts.pdf
index 60aef6e282..89de0c3ef6 100644
--- a/macros/latex-dev/base/cmfonts.pdf
+++ b/macros/latex-dev/base/cmfonts.pdf
Binary files differ
diff --git a/macros/latex-dev/base/cyrguide.pdf b/macros/latex-dev/base/cyrguide.pdf
index 0f643e3122..b5f914d9e2 100644
--- a/macros/latex-dev/base/cyrguide.pdf
+++ b/macros/latex-dev/base/cyrguide.pdf
Binary files differ
diff --git a/macros/latex-dev/base/doc-code.pdf b/macros/latex-dev/base/doc-code.pdf
index 60072bde43..d361838381 100644
--- a/macros/latex-dev/base/doc-code.pdf
+++ b/macros/latex-dev/base/doc-code.pdf
Binary files differ
diff --git a/macros/latex-dev/base/doc.dtx b/macros/latex-dev/base/doc.dtx
index 4cb8dd6b1c..a6af48b88a 100644
--- a/macros/latex-dev/base/doc.dtx
+++ b/macros/latex-dev/base/doc.dtx
@@ -34,7 +34,7 @@
%\catcode`\<=14
%<+package|shortvrb>\NeedsTeXFormat{LaTeX2e}[1994/12/01]
%<+package>
-% Any rollback request before 2016-02-15 we try to fulfill with the 2016 version:
+% ^^A Any rollback request before 2016-02-15 we try to fulfill with the 2016 version:
%<+package>\DeclareRelease{}{1994-06-01}
%<+package> {doc-2016-02-15.sty}
%<+package>\DeclareRelease{v2.1g}{2016-02-15}
@@ -45,7 +45,7 @@
%<+package>
%<+package>\ProvidesPackage{doc}
%<+shortvrb>\ProvidesPackage{shortvrb}
-%<+package|shortvrb> [2024/06/29 v3.0q
+%<+package|shortvrb> [2024/10/23 v3.0q
%<+package|shortvrb> Standard LaTeX documentation package V3 (FMi)]
%\catcode`\<=12
%
diff --git a/macros/latex-dev/base/doc.pdf b/macros/latex-dev/base/doc.pdf
index 65ebc473e3..817c4c5a5e 100644
--- a/macros/latex-dev/base/doc.pdf
+++ b/macros/latex-dev/base/doc.pdf
Binary files differ
diff --git a/macros/latex-dev/base/docstrip.pdf b/macros/latex-dev/base/docstrip.pdf
index 2080f1d0cf..91ac058a5d 100644
--- a/macros/latex-dev/base/docstrip.pdf
+++ b/macros/latex-dev/base/docstrip.pdf
Binary files differ
diff --git a/macros/latex-dev/base/encguide.pdf b/macros/latex-dev/base/encguide.pdf
index 773c3a208e..e01c09a6e3 100644
--- a/macros/latex-dev/base/encguide.pdf
+++ b/macros/latex-dev/base/encguide.pdf
Binary files differ
diff --git a/macros/latex-dev/base/exscale.pdf b/macros/latex-dev/base/exscale.pdf
index c26625bac2..fceeac65e7 100644
--- a/macros/latex-dev/base/exscale.pdf
+++ b/macros/latex-dev/base/exscale.pdf
Binary files differ
diff --git a/macros/latex-dev/base/fix-cm.pdf b/macros/latex-dev/base/fix-cm.pdf
index e63ddf44a8..dfa6f18896 100644
--- a/macros/latex-dev/base/fix-cm.pdf
+++ b/macros/latex-dev/base/fix-cm.pdf
Binary files differ
diff --git a/macros/latex-dev/base/fntguide.pdf b/macros/latex-dev/base/fntguide.pdf
index 1e7ef27095..4788f8aa5e 100644
--- a/macros/latex-dev/base/fntguide.pdf
+++ b/macros/latex-dev/base/fntguide.pdf
Binary files differ
diff --git a/macros/latex-dev/base/graphpap.pdf b/macros/latex-dev/base/graphpap.pdf
index 54bcbc0c10..7988bac004 100644
--- a/macros/latex-dev/base/graphpap.pdf
+++ b/macros/latex-dev/base/graphpap.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ifthen.pdf b/macros/latex-dev/base/ifthen.pdf
index aacaf95452..19a244e1d3 100644
--- a/macros/latex-dev/base/ifthen.pdf
+++ b/macros/latex-dev/base/ifthen.pdf
Binary files differ
diff --git a/macros/latex-dev/base/inputenc.pdf b/macros/latex-dev/base/inputenc.pdf
index da79e23b16..9f855b1da3 100644
--- a/macros/latex-dev/base/inputenc.pdf
+++ b/macros/latex-dev/base/inputenc.pdf
Binary files differ
diff --git a/macros/latex-dev/base/lamport-manual.pdf b/macros/latex-dev/base/lamport-manual.pdf
index 5451a4e7dc..c9edf04efd 100644
--- a/macros/latex-dev/base/lamport-manual.pdf
+++ b/macros/latex-dev/base/lamport-manual.pdf
Binary files differ
diff --git a/macros/latex-dev/base/latexrelease.pdf b/macros/latex-dev/base/latexrelease.pdf
index 6a68894e03..f4d6211ea4 100644
--- a/macros/latex-dev/base/latexrelease.pdf
+++ b/macros/latex-dev/base/latexrelease.pdf
Binary files differ
diff --git a/macros/latex-dev/base/latexsym.pdf b/macros/latex-dev/base/latexsym.pdf
index 2c2f9185b5..fef1fb9d98 100644
--- a/macros/latex-dev/base/latexsym.pdf
+++ b/macros/latex-dev/base/latexsym.pdf
Binary files differ
diff --git a/macros/latex-dev/base/lb2.pdf b/macros/latex-dev/base/lb2.pdf
index 2ba307919b..0f5e8979fe 100644
--- a/macros/latex-dev/base/lb2.pdf
+++ b/macros/latex-dev/base/lb2.pdf
Binary files differ
diff --git a/macros/latex-dev/base/letter.pdf b/macros/latex-dev/base/letter.pdf
index d27d0b009f..a7f8eb532a 100644
--- a/macros/latex-dev/base/letter.pdf
+++ b/macros/latex-dev/base/letter.pdf
Binary files differ
diff --git a/macros/latex-dev/base/lgc2.pdf b/macros/latex-dev/base/lgc2.pdf
index d77ecbbf98..acbc7ab359 100644
--- a/macros/latex-dev/base/lgc2.pdf
+++ b/macros/latex-dev/base/lgc2.pdf
Binary files differ
diff --git a/macros/latex-dev/base/lppl.pdf b/macros/latex-dev/base/lppl.pdf
index 9e356ca732..3f025cadbb 100644
--- a/macros/latex-dev/base/lppl.pdf
+++ b/macros/latex-dev/base/lppl.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltcmdhooks-code.pdf b/macros/latex-dev/base/ltcmdhooks-code.pdf
index 8aca1f3bec..cdf9a60b5b 100644
--- a/macros/latex-dev/base/ltcmdhooks-code.pdf
+++ b/macros/latex-dev/base/ltcmdhooks-code.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltcmdhooks-doc.pdf b/macros/latex-dev/base/ltcmdhooks-doc.pdf
index 7eadbbbdc8..ebd2c3780b 100644
--- a/macros/latex-dev/base/ltcmdhooks-doc.pdf
+++ b/macros/latex-dev/base/ltcmdhooks-doc.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltcmdhooks.dtx b/macros/latex-dev/base/ltcmdhooks.dtx
index e8793817df..0d14ebfe6b 100644
--- a/macros/latex-dev/base/ltcmdhooks.dtx
+++ b/macros/latex-dev/base/ltcmdhooks.dtx
@@ -20,7 +20,7 @@
%<*driver>
% \fi
\ProvidesFile{ltcmdhooks.dtx}
- [2024/07/08 v1.0j LaTeX Kernel (Command hooks)]
+ [2024/10/22 v1.0j LaTeX Kernel (Command hooks)]
% \iffalse
%
\documentclass{l3doc}
@@ -68,7 +68,15 @@
% supported
% for all types of commands, see section~\ref{sec:look-ahead} for
% the restrictions that apply and what happens if one tries to use
-% this with commands for which this is not supported.} These are:
+% this with commands for which this is not supported.}
+%
+% However, this is only true \enquote{in theory}. In practice there
+% are a number of restrictions that makes it impossible to use such
+% generic command hooks in a number of cases, so please read all
+% of section~\ref{sec:restrictions} to understand what may prevent
+% you from using them successfully.
+%
+% The generic command hooks are:
% \begin{description}
% \item[\hook{cmd/\meta{name}/before}]
%
@@ -152,7 +160,55 @@
% and \TeX{} doesn't have a reliable way to see that, so some guesswork
% has to be employed.
%
-% \subsection{Patching}
+% We can do this in most cases when commands are defined using
+% \cs{NewDocumentCommand} or \cs{newcommand} (with a few exceptions).
+% For commands defined with \tn{def} the situation is less good.
+% Common cases where the command hooks will not work are:
+% \begin{itemize}
+% \item
+%
+% Commands that use special catcode settings within their
+% definition. In that case it is usually not possible to augment the
+% definition (see~\ref{sec:patching}).
+%
+% \item
+%
+% If a command is defined while \cs{ExplSyntaxOn} is in force
+% \textbf{and} the command contains \verb=~= characters to represent
+% spaces, then it can't be patched to include the command hooks. In
+% fact in some very special circumstances you might even get a
+% low-level error rather than the information that the command can't
+% be patched (see, for example,
+% \url{https://github.com/latex3/latex2e/issues/1430}.
+%
+% \item
+%
+% Commands that have arguments as far as the user is concerned
+% (e.g., \cs{section} or \cs{caption}), but are defined in a way that these
+% arguments are not read by the user level command but only later
+% during the processing. In that case the \texttt{after} hook
+% doesn't work at all. The \text{before} hook only works with
+% \cs{AddToHook} but not with \cs{AddToHookWithArguments} because the
+% arguments haven't been read at that point where the hook is
+% patched in. See
+% section~\ref{sec:look-ahead}.
+%
+%
+% \item
+% Adding a specific generic command hook is only attempted once per
+% command, thus after redefining a command such hooks will no longer
+% be there and will also not being re-added, see section~\ref{sec:timing}.
+%
+% \end{itemize}
+% All this means that you have to have a good understanding of how
+% commands are defined when you attempt to make use of such hooks and
+% something goes wrong.
+% What can help in that case is to turn on \cs{DebugHooksOn} in which
+% case you get much more (low-level) details on why something fails and
+% what was tried to enable the hooks.
+%
+%
+% \subsection{Patching}\label{sec:patching}
%
% The code here tries to find out if a command was defined with
% \tn{newcommand} or \tn{DeclareRobustCommand} or
@@ -172,7 +228,7 @@
% catcode settings are not the same as the ones at the time of command's
% definition, so not always adding a hook to a command will work.
%
-% \subsubsection{Timing}
+% \subsubsection{Timing}\label{sec:timing}
%
% When \cs{AddToHook} (or its \pkg{expl3} equivalent) is called with
% a generic |cmd| hook, say, \hook{cmd/foo/before}, for the first time
@@ -211,12 +267,14 @@
% hooks attached to them.
%
% One good example is the \tn{section} command. You can add something
-% to the \hook{cmd/section/before} hook, but if you try to add something
-% to the \hook{cmd/section/after} hook, \tn{section} will no longer
-% work. That happens because the \tn{section} macro takes no argument,
-% but instead calls a few internal \LaTeX{} macros to look for the
-% optional and mandatory arguments. By adding code to the
-% \hook{cmd/section/after} hook, you get in the way of that scanning.
+% to the \hook{cmd/section/before} hook (but only with \cs{AddToHook}
+% not \cs{AddToHookWithArguments}),
+% but if you try to add anything to the \hook{cmd/section/after}
+% hook, \tn{section} will no longer work at all. That happens because the
+% \tn{section} macro takes no argument, but instead calls a few
+% internal \LaTeX{} macros to look for the optional and mandatory
+% arguments. By adding code to the \hook{cmd/section/after} hook, you
+% get in the way of that scanning.
%
% In such a case, where it is known that a specific generic command
% hook does not work if code is added to it, the package author can
diff --git a/macros/latex-dev/base/ltcounts.dtx b/macros/latex-dev/base/ltcounts.dtx
index 9417769d73..1d3f202489 100644
--- a/macros/latex-dev/base/ltcounts.dtx
+++ b/macros/latex-dev/base/ltcounts.dtx
@@ -33,7 +33,7 @@
%<*driver>
% \fi
\ProvidesFile{ltcounts.dtx}
- [2024/09/20 v1.1o LaTeX Kernel (Counters)]
+ [2024/10/26 v1.1p LaTeX Kernel (Counters)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltcounts.dtx}
@@ -310,6 +310,7 @@
% \changes{v1.1n}{2023/11/07}{Do not change \cs{the...} if already defined (gh/823)}
% \changes{v1.1o}{2024/09/20}{define theHfoo (used for internal links)}
% \begin{macrocode}
+% \changes{v1.1p}{2024/10/26}{Fully expand counter name in theHfoo commands (gh/1508)}
%</2ekernel>
%<latexrelease>\IncludeInRelease{2024/11/01}{\@definecounter}
%<latexrelease> {provide theHfoo commands}%
@@ -319,7 +320,8 @@
\global\expandafter\let\csname cl@#1\endcsname\@empty
\@addtoreset{#1}{@ckpt}%
\global\expandafter\let\csname p@#1\endcsname\@empty
- \expandafter\gdef\csname theH#1\endcsname{\the\value{#1}}%
+ \expandafter\xdef\csname theH#1\endcsname{%
+ \noexpand\the\noexpand\value{#1}}%
% \end{macrocode}
% If \cs{the\#1} is undefined or \cs{relax} we define it with the
% standard definition for counters, otherwise we warn. This will
@@ -360,6 +362,7 @@
%
% \begin{macro}{\@addtoreset}
% \changes{v1.1o}{2024/09/20}{add the parent theHfoo if a counter is reset}
+% \changes{v1.1p}{2024/10/26}{Fully expand counter name in theHfoo commands (gh/1508)}
% If a counter is reset when a parent counter changes it no longer has an unique value
% across the document. As |\theH<counter>| should be unique
% this representation is changed to include also the
@@ -371,7 +374,9 @@
%<latexrelease> {provide theHfoo commands}%
%<*2ekernel|latexrelease>
\def\@addtoreset#1#2{\expandafter\@cons\csname cl@#2\endcsname {{#1}}%
- \expandafter\gdef\csname theH#1\endcsname{\csname theH#2\endcsname.\the\value{#1}}%
+ \expandafter\xdef\csname theH#1\endcsname{%
+ \expandafter\noexpand\csname theH#2\endcsname.%
+ \noexpand\the\noexpand\value{#1}}%
}
%<latexrelease>\EndIncludeInRelease
%</2ekernel|latexrelease>
diff --git a/macros/latex-dev/base/ltfilehook-code.pdf b/macros/latex-dev/base/ltfilehook-code.pdf
index 1269635a4a..18f398e257 100644
--- a/macros/latex-dev/base/ltfilehook-code.pdf
+++ b/macros/latex-dev/base/ltfilehook-code.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltfilehook-doc.pdf b/macros/latex-dev/base/ltfilehook-doc.pdf
index e6d556b0a9..fd8a9f3758 100644
--- a/macros/latex-dev/base/ltfilehook-doc.pdf
+++ b/macros/latex-dev/base/ltfilehook-doc.pdf
Binary files differ
diff --git a/macros/latex-dev/base/lthooks-code.pdf b/macros/latex-dev/base/lthooks-code.pdf
index a340bcdedd..419be940ec 100644
--- a/macros/latex-dev/base/lthooks-code.pdf
+++ b/macros/latex-dev/base/lthooks-code.pdf
Binary files differ
diff --git a/macros/latex-dev/base/lthooks-doc.pdf b/macros/latex-dev/base/lthooks-doc.pdf
index b3f605cbec..d05d264308 100644
--- a/macros/latex-dev/base/lthooks-doc.pdf
+++ b/macros/latex-dev/base/lthooks-doc.pdf
Binary files differ
diff --git a/macros/latex-dev/base/lthooks.dtx b/macros/latex-dev/base/lthooks.dtx
index 9e4450d628..0c33c022e3 100644
--- a/macros/latex-dev/base/lthooks.dtx
+++ b/macros/latex-dev/base/lthooks.dtx
@@ -32,7 +32,7 @@
%<*driver>
% \fi
\ProvidesFile{lthooks.dtx}
- [2024/08/09 v1.1i LaTeX Kernel (hooks)]
+ [2024/10/29 v1.1k LaTeX Kernel (hooks)]
% \iffalse
%
\documentclass{l3doc}
@@ -405,11 +405,17 @@
% Removes any code labeled by \meta{label} from the \meta{hook}.
% When the optional argument \meta{label} is not provided, the
% \meta{default label} is used (see section~\ref{sec:default-label}).
+% \end{function}
%
% If there is no code under the \meta{label} in the \meta{hook},
% or if the \meta{hook} does not exist, a warning is issued when
% you attempt to \cs{RemoveFromHook}, and the command is ignored.
-% \cs{RemoveFromHook} should be used only when you know exactly what
+% \cs{RemoveFromHook}\marginpar{\raggedleft\rightskip5pt\itshape
+% \textbf{Important:}\break The \cs{RemoveFromHook} command should be
+% only used if one has full control over the code chunk to be removed.
+% In particular it should not be used to remove code chunks from other
+% packages! For this the \texttt{voids} relation is provided.}
+% should be used only when you know exactly what
% labels are in a hook. Typically this will be when some code gets added to a hook
% by a package, then later this code is removed by that same package.
% If you want to prevent the execution of code from another
@@ -423,16 +429,15 @@
% The \meta{hook} and \meta{label} can be specified using the
% dot-syntax to denote the current package name.
% See section~\ref{sec:default-label}.
-% \end{function}
-%
-% \medskip
%
-% In contrast to the \texttt{voids} relationship between two labels
+% In contrast to the \texttt {voids} relationship between two labels
% in a \cs{DeclareHookRule} this is a destructive operation as the
% labeled code is removed from the hook data structure, whereas the
% relationship setting can be undone by providing a different
% relationship later.
%
+% \medskip
+%
% A useful application for this declaration inside the document body
% is when one wants to temporarily add code to hooks and later remove
% it again, e.g.,
@@ -538,7 +543,6 @@
%
%
%
-%
% \subsubsection{Hook names and default labels}
% \label{sec:default-label}
%
@@ -894,7 +898,7 @@
% some variant thereof. Generic hooks such as \hook{file} and \hook{env} hooks are
% automatically declared when code is added to them.
%
-% \begin{function}[EXP]{\IfHookEmptyTF}
+% \begin{function}[EXP]{\IfHookEmptyTF,\IfHookEmptyT,\IfHookEmptyF}
% \begin{syntax}
% \cs{IfHookEmptyTF} \Arg{hook} \Arg{true code} \Arg{false code}
% \end{syntax}
@@ -6174,6 +6178,8 @@
}
% \end{macrocode}
%
+% \changes{v1.1k}{2024/10/29}
+% {Skip mapping over undeclared \cs{g_@@_\meta{hook}_code_prop} (gh/1513)}
% \begin{macrocode}
\@@_if_usable:nF {#1}
{ \@@_log_line:x { The~hook~is~not~declared. } }
@@ -6183,7 +6189,9 @@
{ #2 { The~hook~is~empty } }
{
\@@_log_line:x { Code~chunks: }
- \prop_if_empty:cTF { g_@@_#1_code_prop }
+ \bool_lazy_or:nnTF
+ { ! \prop_if_exist_p:c { g_@@_#1_code_prop } }
+ { \prop_if_empty_p:c { g_@@_#1_code_prop } }
{ \@@_log_line_indent:x { --- } }
{
\prop_map_inline:cn { g_@@_#1_code_prop }
@@ -6445,19 +6453,24 @@
% |#2|${}={}$\meta{label_1}\verb=|=\meta{label_2},
% and |#3|${}={}$\meta{hook} (the latter may be the argument |#1| to
% \cs{@@_list_rules:nn}, or \texttt{??} if it is a default rule).
+% \changes{v1.1k}{2024/10/29}
+% {Skip mapping over undeclared \cs{g_@@_\meta{hook}_code_prop} (gh/1513)}
% \begin{macrocode}
\cs_new_protected:Npn \@@_list_rules:nn #1 #2
{
- \cs_set_protected:Npn \@@_tmp:w ##1 ##2 ##3 {#2}
- \prop_map_inline:cn { g_@@_#1_code_prop }
+ \prop_if_exist:cT { g_@@_#1_code_prop }
{
+ \cs_set_protected:Npn \@@_tmp:w ##1 ##2 ##3 {#2}
\prop_map_inline:cn { g_@@_#1_code_prop }
{
- \@@_if_label_case:nnnnn {##1} {####1}
- { \prop_map_break: }
- { \@@_list_one_rule:nnn {##1} {####1} }
- { \@@_list_one_rule:nnn {####1} {##1} }
- {#1}
+ \prop_map_inline:cn { g_@@_#1_code_prop }
+ {
+ \@@_if_label_case:nnnnn {##1} {####1}
+ { \prop_map_break: }
+ { \@@_list_one_rule:nnn {##1} {####1} }
+ { \@@_list_one_rule:nnn {####1} {##1} }
+ {#1}
+ }
}
}
}
@@ -7764,13 +7777,16 @@
% \end{macro}
%
%
-% \begin{macro}[EXP]{\IfHookEmptyTF}
+% \begin{macro}[EXP]{\IfHookEmptyTF,\IfHookEmptyT,\IfHookEmptyF}
+% \changes{v1.1j}{2024/10/21}{Define \cs{IfHookEmptyT}, \cs{IfHookEmptyF}}
% Here we avoid the overhead of \pkg{xparse}, since \cs{IfHookEmptyTF}
% is used in \cs{end} (that is, every \LaTeX{} environment). As a
% further optimization, use \cs{let} rather than \cs{def} to avoid one
% expansion step.
% \begin{macrocode}
\cs_new_eq:NN \IfHookEmptyTF \hook_if_empty:nTF
+\cs_new_eq:NN \IfHookEmptyT \hook_if_empty:nT
+\cs_new_eq:NN \IfHookEmptyF \hook_if_empty:nF
% \end{macrocode}
% \end{macro}
%
diff --git a/macros/latex-dev/base/ltluatex.pdf b/macros/latex-dev/base/ltluatex.pdf
index 6886ca4fa0..992ee68de4 100644
--- a/macros/latex-dev/base/ltluatex.pdf
+++ b/macros/latex-dev/base/ltluatex.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltmarks-code.pdf b/macros/latex-dev/base/ltmarks-code.pdf
index cf1a13a38e..61b65bbe12 100644
--- a/macros/latex-dev/base/ltmarks-code.pdf
+++ b/macros/latex-dev/base/ltmarks-code.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltmarks-doc.pdf b/macros/latex-dev/base/ltmarks-doc.pdf
index 567d98b29b..30a1f71773 100644
--- a/macros/latex-dev/base/ltmarks-doc.pdf
+++ b/macros/latex-dev/base/ltmarks-doc.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltmarks.dtx b/macros/latex-dev/base/ltmarks.dtx
index f71bfab9b6..f769a09324 100644
--- a/macros/latex-dev/base/ltmarks.dtx
+++ b/macros/latex-dev/base/ltmarks.dtx
@@ -17,7 +17,7 @@
%<*driver>
% \fi
\ProvidesFile{ltmarks.dtx}
- [2024/07/08 v1.0g LaTeX Kernel (Marks)]
+ [2024/10/22 v1.0h LaTeX Kernel (Marks)]
% \iffalse
%
\documentclass{l3doc}
@@ -257,7 +257,7 @@
% running headers and footers and shipout out both in one
% go.\footnote{As of now that scenario is not yet officially supported.}
%
-% \begin{function}[EXP]{\IfMarksEqualTF,\mark_if_eq:nnnnTF,\mark_if_eq:nnnnnnTF}
+% \begin{function}[EXP]{\IfMarksEqualTF,\IfMarksEqualT,\IfMarksEqualF,\mark_if_eq:nnnnTF,\mark_if_eq:nnnnnnTF}
% \begin{syntax}
% \cs{IfMarksEqualTF} \oarg{region} \Arg{class} \Arg{pos_1} \Arg{pos_2} \Arg{true} \Arg{false}
% \cs{mark_if_eq:nnnnTF} \Arg{region} \Arg{class} \Arg{pos_1} \Arg{pos_2} \Arg{true} \Arg{false}
@@ -676,7 +676,8 @@
% and adds suitable \cs{mark_insert:nn} in the two token
% lists. These token lists can then be executed at the right place
% to reinsert the marks, e.g., directly after the box. This is, for
-% example, used by \pkg{multicol} when a short balanced
+% example, going to be used\footnote{Probably not before 2025, though.}
+% by \pkg{multicol} when a short balanced
% \env{multicols} is returned to the galley for typesetting.
%
% If the \meta{source} consists of a single vertical box (plus
@@ -1799,8 +1800,9 @@
%
%
%
-% \begin{macro}[EXP]{\IfMarksEqualTF}
-% We only provide a CamelCase command for the case with one region
+% \begin{macro}[EXP]{\IfMarksEqualTF,\IfMarksEqualT,\IfMarksEqualF}
+% \changes{v1.0h}{2024/10/21}{Define \cs{IfMarksEqualT}, \cs{IfMarksEqualF}}
+% We only provide CamelCase commands for the case with one region
% (optional) and one class. One could think of also providing a
% version for the general case with several optional arguments, but
% use cases for this are most likely rare, so not done yet.
@@ -1808,6 +1810,12 @@
\NewExpandableDocumentCommand \IfMarksEqualTF {O{page}mmm} {
\mark_if_eq:nnnnTF {#1}{#2}{#3}{#4}
}
+\NewExpandableDocumentCommand \IfMarksEqualT {O{page}mmm} {
+ \mark_if_eq:nnnnT {#1}{#2}{#3}{#4}
+}
+\NewExpandableDocumentCommand \IfMarksEqualF {O{page}mmm} {
+ \mark_if_eq:nnnnF {#1}{#2}{#3}{#4}
+}
% \end{macrocode}
% \end{macro}
%
diff --git a/macros/latex-dev/base/ltnews.pdf b/macros/latex-dev/base/ltnews.pdf
index c678cd2b29..fc920d24d4 100644
--- a/macros/latex-dev/base/ltnews.pdf
+++ b/macros/latex-dev/base/ltnews.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews.tex b/macros/latex-dev/base/ltnews.tex
index af21aad00b..7756497289 100644
--- a/macros/latex-dev/base/ltnews.tex
+++ b/macros/latex-dev/base/ltnews.tex
@@ -40,7 +40,7 @@
\ProvidesFile{ltnews.tex}%
[2022/06/10 v1.4e Master file for ltnews*.tex (LaTeX Project)]
-\providecommand*{\lastissue}{40}
+\providecommand*{\lastissue}{41}
\InputIfFileExists{ltnews-lastissue.cfg}{}{}
diff --git a/macros/latex-dev/base/ltnews01.pdf b/macros/latex-dev/base/ltnews01.pdf
index 3fc3020d72..5fdbbf0d8e 100644
--- a/macros/latex-dev/base/ltnews01.pdf
+++ b/macros/latex-dev/base/ltnews01.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews02.pdf b/macros/latex-dev/base/ltnews02.pdf
index 5f7fd7cf48..482b092195 100644
--- a/macros/latex-dev/base/ltnews02.pdf
+++ b/macros/latex-dev/base/ltnews02.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews03.pdf b/macros/latex-dev/base/ltnews03.pdf
index 349ec0769d..3c231187b9 100644
--- a/macros/latex-dev/base/ltnews03.pdf
+++ b/macros/latex-dev/base/ltnews03.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews04.pdf b/macros/latex-dev/base/ltnews04.pdf
index bc48b28219..b0f68211d5 100644
--- a/macros/latex-dev/base/ltnews04.pdf
+++ b/macros/latex-dev/base/ltnews04.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews05.pdf b/macros/latex-dev/base/ltnews05.pdf
index d5fd084578..5e8372a988 100644
--- a/macros/latex-dev/base/ltnews05.pdf
+++ b/macros/latex-dev/base/ltnews05.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews06.pdf b/macros/latex-dev/base/ltnews06.pdf
index 11c2f135d6..b6b3d6465c 100644
--- a/macros/latex-dev/base/ltnews06.pdf
+++ b/macros/latex-dev/base/ltnews06.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews07.pdf b/macros/latex-dev/base/ltnews07.pdf
index eb9f3a9493..741dd1c092 100644
--- a/macros/latex-dev/base/ltnews07.pdf
+++ b/macros/latex-dev/base/ltnews07.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews08.pdf b/macros/latex-dev/base/ltnews08.pdf
index b611e667af..2c2d934244 100644
--- a/macros/latex-dev/base/ltnews08.pdf
+++ b/macros/latex-dev/base/ltnews08.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews09.pdf b/macros/latex-dev/base/ltnews09.pdf
index 372cd9a26a..f20a22d717 100644
--- a/macros/latex-dev/base/ltnews09.pdf
+++ b/macros/latex-dev/base/ltnews09.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews10.pdf b/macros/latex-dev/base/ltnews10.pdf
index eaa67dc4ee..8f5a1e7806 100644
--- a/macros/latex-dev/base/ltnews10.pdf
+++ b/macros/latex-dev/base/ltnews10.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews11.pdf b/macros/latex-dev/base/ltnews11.pdf
index ad17c6ffdf..7120d140b7 100644
--- a/macros/latex-dev/base/ltnews11.pdf
+++ b/macros/latex-dev/base/ltnews11.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews12.pdf b/macros/latex-dev/base/ltnews12.pdf
index a1871c4aeb..0086ef464e 100644
--- a/macros/latex-dev/base/ltnews12.pdf
+++ b/macros/latex-dev/base/ltnews12.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews13.pdf b/macros/latex-dev/base/ltnews13.pdf
index 582736ea05..65ccc95c39 100644
--- a/macros/latex-dev/base/ltnews13.pdf
+++ b/macros/latex-dev/base/ltnews13.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews14.pdf b/macros/latex-dev/base/ltnews14.pdf
index 0d088afec9..4151f2e058 100644
--- a/macros/latex-dev/base/ltnews14.pdf
+++ b/macros/latex-dev/base/ltnews14.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews15.pdf b/macros/latex-dev/base/ltnews15.pdf
index a20c4970a4..068ffb4a79 100644
--- a/macros/latex-dev/base/ltnews15.pdf
+++ b/macros/latex-dev/base/ltnews15.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews16.pdf b/macros/latex-dev/base/ltnews16.pdf
index 888372ba70..b0563d1876 100644
--- a/macros/latex-dev/base/ltnews16.pdf
+++ b/macros/latex-dev/base/ltnews16.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews17.pdf b/macros/latex-dev/base/ltnews17.pdf
index 71240c09c6..5eed24de70 100644
--- a/macros/latex-dev/base/ltnews17.pdf
+++ b/macros/latex-dev/base/ltnews17.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews18.pdf b/macros/latex-dev/base/ltnews18.pdf
index 4d55619b98..ffa8c6ba01 100644
--- a/macros/latex-dev/base/ltnews18.pdf
+++ b/macros/latex-dev/base/ltnews18.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews19.pdf b/macros/latex-dev/base/ltnews19.pdf
index 16c0c62911..d33fbb3fb8 100644
--- a/macros/latex-dev/base/ltnews19.pdf
+++ b/macros/latex-dev/base/ltnews19.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews20.pdf b/macros/latex-dev/base/ltnews20.pdf
index a585544562..05f877fba5 100644
--- a/macros/latex-dev/base/ltnews20.pdf
+++ b/macros/latex-dev/base/ltnews20.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews21.pdf b/macros/latex-dev/base/ltnews21.pdf
index b9dfe73338..2654d394fd 100644
--- a/macros/latex-dev/base/ltnews21.pdf
+++ b/macros/latex-dev/base/ltnews21.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews22.pdf b/macros/latex-dev/base/ltnews22.pdf
index 91027fe345..4023a9680f 100644
--- a/macros/latex-dev/base/ltnews22.pdf
+++ b/macros/latex-dev/base/ltnews22.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews23.pdf b/macros/latex-dev/base/ltnews23.pdf
index 1db85acf71..d5f7d765bd 100644
--- a/macros/latex-dev/base/ltnews23.pdf
+++ b/macros/latex-dev/base/ltnews23.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews24.pdf b/macros/latex-dev/base/ltnews24.pdf
index b75c2b8054..7393a550ff 100644
--- a/macros/latex-dev/base/ltnews24.pdf
+++ b/macros/latex-dev/base/ltnews24.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews25.pdf b/macros/latex-dev/base/ltnews25.pdf
index 7443c1edf1..c056f4458e 100644
--- a/macros/latex-dev/base/ltnews25.pdf
+++ b/macros/latex-dev/base/ltnews25.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews26.pdf b/macros/latex-dev/base/ltnews26.pdf
index efafea05cf..bb8440029b 100644
--- a/macros/latex-dev/base/ltnews26.pdf
+++ b/macros/latex-dev/base/ltnews26.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews27.pdf b/macros/latex-dev/base/ltnews27.pdf
index 81e0108ef9..bbca3fcd86 100644
--- a/macros/latex-dev/base/ltnews27.pdf
+++ b/macros/latex-dev/base/ltnews27.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews28.pdf b/macros/latex-dev/base/ltnews28.pdf
index 92b00f2885..d1f7332f07 100644
--- a/macros/latex-dev/base/ltnews28.pdf
+++ b/macros/latex-dev/base/ltnews28.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews29.pdf b/macros/latex-dev/base/ltnews29.pdf
index 8a09f387e8..a320b2e899 100644
--- a/macros/latex-dev/base/ltnews29.pdf
+++ b/macros/latex-dev/base/ltnews29.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews30.pdf b/macros/latex-dev/base/ltnews30.pdf
index 706fa88cba..a7765966ab 100644
--- a/macros/latex-dev/base/ltnews30.pdf
+++ b/macros/latex-dev/base/ltnews30.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews31.pdf b/macros/latex-dev/base/ltnews31.pdf
index 0a89ed7361..dd27b7e52b 100644
--- a/macros/latex-dev/base/ltnews31.pdf
+++ b/macros/latex-dev/base/ltnews31.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews32.pdf b/macros/latex-dev/base/ltnews32.pdf
index 63e78248ae..a585387999 100644
--- a/macros/latex-dev/base/ltnews32.pdf
+++ b/macros/latex-dev/base/ltnews32.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews33.pdf b/macros/latex-dev/base/ltnews33.pdf
index e7b2c447cb..ff8b3685b7 100644
--- a/macros/latex-dev/base/ltnews33.pdf
+++ b/macros/latex-dev/base/ltnews33.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews34.pdf b/macros/latex-dev/base/ltnews34.pdf
index c1b7881021..60af644363 100644
--- a/macros/latex-dev/base/ltnews34.pdf
+++ b/macros/latex-dev/base/ltnews34.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews35.pdf b/macros/latex-dev/base/ltnews35.pdf
index 487a850ff3..5dfb4fd316 100644
--- a/macros/latex-dev/base/ltnews35.pdf
+++ b/macros/latex-dev/base/ltnews35.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews36.pdf b/macros/latex-dev/base/ltnews36.pdf
index 2fe5308173..7cb9f129f8 100644
--- a/macros/latex-dev/base/ltnews36.pdf
+++ b/macros/latex-dev/base/ltnews36.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews37.pdf b/macros/latex-dev/base/ltnews37.pdf
index 52f03a43ed..d7e1a7d554 100644
--- a/macros/latex-dev/base/ltnews37.pdf
+++ b/macros/latex-dev/base/ltnews37.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews38.pdf b/macros/latex-dev/base/ltnews38.pdf
index 2849e8c898..38985af42d 100644
--- a/macros/latex-dev/base/ltnews38.pdf
+++ b/macros/latex-dev/base/ltnews38.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews39.pdf b/macros/latex-dev/base/ltnews39.pdf
index 3fc09b75fb..0101d6d37b 100644
--- a/macros/latex-dev/base/ltnews39.pdf
+++ b/macros/latex-dev/base/ltnews39.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews40.pdf b/macros/latex-dev/base/ltnews40.pdf
index eb7d8d5579..f41370e623 100644
--- a/macros/latex-dev/base/ltnews40.pdf
+++ b/macros/latex-dev/base/ltnews40.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews40.tex b/macros/latex-dev/base/ltnews40.tex
index a1067731d6..cbb04bcb40 100644
--- a/macros/latex-dev/base/ltnews40.tex
+++ b/macros/latex-dev/base/ltnews40.tex
@@ -141,7 +141,8 @@
\tubcommand{\input{tubltmac}}
\publicationmonth{November}
-\publicationyear{2024 --- DRAFT version for upcoming release}
+%\publicationyear{2024 --- DRAFT version for upcoming release}
+\publicationyear{2024}
\publicationissue{40}
@@ -155,147 +156,320 @@
\medskip
-\section{Introduction}
-\emph{to write \ldots\ 30th aniversary of \LaTeXe{} this year btw}
+\section{Thirty years of \LaTeXe{}}
+
+In summer 1994, i.e., thirty years ago, \LaTeXe{} saw its first public
+release. Back then it was meant to be an intermediate version (hence
+the $\epsilon$) on the way to a major new version (the mythical
+\LaTeX3) that we expected to take a couple of more years to reach
+maturity. It took much more than that in the end\Dash nominally,
+\LaTeXe{} is still with us today.
+
+However, under the hood, \LaTeXe{} changed a lot throughout these
+thirty years, as one can see, for example, when looking through the
+forty newsletters~\cite{40:ltnews} that accompanied the \LaTeX{}
+releases that happened in the meantime.
+
+During the first two decades, the \LaTeX{} kernel was kept largely
+stable with only minimal bug fix activities. During that period
+additional functionality was mostly provided through new or
+extended packages that could be loaded in the document preamble. This
+included many of the ideas targeted for \LaTeX3{}, e.g., \pkg{expl3}
+(\LaTeX3 programming language), \pkg{xparse} (new document command
+interface), \pkg{xtemplate} (a configuration mechanism), and many
+others.
+
+Initially, this approach worked well and provided good backward
+compatibility; however, over time it became apparent that keeping all
+developments confined to packages was more and more problematical.
+Features or bug fixes that should have been generally available, i.e.,
+part of the kernel, were only available in packages, so a lot of
+dependencies between packages were introduced and resulted in
+convoluted code that was difficult to manage. For example,
+\pkg{hyperref} had to rewrite a lot of kernel (and package) macros, so
+the code and behavior of other packages had to change depending on
+whether or not \pkg{hyperref} was loaded or not.
+
+Thus, in 2015 the \LaTeX{} team decided to change the policy and
+(re)start active kernel development, see~\cite{40:ltnews22}. To ensure
+continuous backward compatibility we introduced at the same time the
+\pkg{latexrelease} package that enables users to roll back changes to
+the \LaTeX{} kernel to an earlier release, in case this is necessary
+to successfully rerun a document produced at that time.
+
+As a consequence of this policy change the last decade saw a larger
+number of enhancements and corrections that were made part of the
+\LaTeX{} kernel. Overall, we can confidently say that the new
+approach has worked well and enabled us to modernize \LaTeX{} and ensure
+that it remains relevant without compromising one of the cornerstones
+of \LaTeX{}: its outstanding ability to reprocess old documents
+written many years ago.
+
+Being able to update and modernize the kernel sources allowed us to
+embark in 2019 on the multi-year \enquote{\LaTeX{} Tagged PDF} project
+with the goal of automatically providing accessible PDF documents with
+\LaTeX{}. While there are several more project phases to complete, the
+milestones already reached allow users to generate PDF/UA compliant
+documents if the input is restricted to a (growing) subset of packages
+and document classes; see next section and previous newsletters.
+
+ A big change happened with the 2020-02-02 release as part of the project activity,
+ albeit somewhat obfuscated by us as \enquote{Improved load-times for
+ \pkg{expl3}}. While technically correct, what it really meant is
+ that we had finally integrated the programming layer of \LaTeX3,
+ i.e., the ideas originally sketched out around 1992. Or saying it
+ differently: with that date the original ideas for \LaTeX3 became a
+ reality as part of the standard \LaTeX{} kernel.
+
+ With the programming layer available under the hood we were then able to
+ provide new concepts and extensions as part of \LaTeX{},
+ e.g., the hook management system, a new mark mechanism, core
+ functionality for tagging and PDF resource management, a consistent
+ key/value interface, and more recently the socket and plug mechanism.
+
+ More will follow while we continue to work on modernizing \LaTeX{} and
+ bringing the Tagged PDF project to a truly successful completion\Dash so
+ stay tuned and watch this space for future announcements in the next
+ newsletters.
+
+
-\section{Switch to T1 as default encoding in documents using \cs{DocumentMetadata}}
+\section{News from the \enquote{\LaTeX{} Tagged PDF} project}
-As it is well known the font encoding \texttt{OT1} supports only 128 characters and
-has various problems and quirks notably for languages different to English.
-Nevertheless \texttt{OT1} is the default encoding in \LaTeX{} and this can not be easily
-changed without affecting many documents as the \texttt{T1} version of the fonts have slightly different metrics.
+\subsection{Engine support:\ An important update}
-The introduction of the \cs{DocumentMetadata} command, which announces
-\emph{new} code and changes that can also affect the layout gives us now the
-opportunity to make this step. So with this version a use of
-\cs{DocumentMetadata} with (pdf)\LaTeX{} will setup \texttt{T1} as default
-font encoding\footnote{The Unicode engines will continue to use \texttt{TU}
-as encoding.}. To ensure that scalable fonts are used, the package
-\pkg{cm-super} has to be installed. Users who want to revert to the
-\texttt{OT1} encoding in their document can do so with
-\verb+\usepackage[OT1]{fontenc}+.
+As detailed below, work is progressing on the Tagged PDF
+project. There are many drivers for this work, including legal changes
+in many places which will increasingly require well-tagged PDFs
+including full support for mathematics. As part of the work on this,
+we are looking at the technical abilities of the \TeX{} engines.
+With \XeTeX{}, it is impossible to reliably produce tagged PDFs due to
+engine limitations. The increasing importance of tagged PDFs means
+that this requires a move away from \XeTeX{}. We will continue to
+address issues with \XeTeX{} support in team-maintained \LaTeX{} code
+on a best-effort basis. No \emph{new} functionality will be added for
+\XeTeX{} by the \LaTeX{} team. It is likely that over time
+functionality may become more restricted, and users are urged to
+migrate \XeTeX{} documents to \LuaTeX{}.
+For \pdfTeX{}, tagging is available and we are able to support
+mathematics by including relevant \TeX{} source or by using
+externally-generated MathML. Only \LuaTeX{} is capable of
+\emph{automatic} generation of MathML as part of a \LaTeX{} run. Thus
+\pdfTeX{} continues to be supported for existing material, but for new
+documents, moving to \LuaTeX{} is recommended.
-\section{News from the \enquote{\LaTeX{} Tagged PDF} project}
+We cannot make statements about the support for other engines such as
+(u)p\TeX{}, as we don't use these programs nor have in depth knowledge
+of their functionalities. To the best of our knowledge, core \LaTeX{}
+works well with these engines, but if and to what extent tagging can
+be supported will remain to be seen. If relevant information becomes
+available to us we will provide an update in future editions of the
+\LaTeX{} newsletter.
+
+
+\subsection{Tagging support for external packages}
+
+At \url{https://latex3.github.io/tagging-project/tagging-status/} we
+show the status of many \LaTeX{} packages and classes with respect to
+PDF tagging. We also started to improve tagging support in external
+packages. If the \texttt{firstaid} key is used in addition to the
+\texttt{phase-III} key basic commands of several packages, including
+\pkg{amsthm} and \pkg{fancyvrb}, can now be used.
+
+
+\subsection{Improved table tagging}
The tagging of tabulars has been extended: it is now possible to tag
-also row headers and to create cells that span more than one row.
+row headers and to create cells that span more than one row.
+
+The interface to this functionality is not finalized but can be
+accessed in the current release by specifying the row and columns to
+be treated as headers. For example
+%
+\begin{verbatim}
+ \tagpdfsetup{
+ table/header-rows={1,2},
+ table/header-columns={1} }
+\end{verbatim}
+would specify that in the following tables the first two rows and
+first column of each row should be tagged as heading entries.
+
+Similarly you may add a RowSpan attributes to tag a cell that spans
+two rows using:
+\begin{verbatim}
+ \tagpdfsetup{table/multirow={2}}
+\end{verbatim}
+
+
+\subsection{Automatic MathML tagging}
+
+When Lua\LaTeX{} is being used, and the \pkg{luamml} package is
+available, and if the document uses the \pkg{unicode-math} package,
+then the math module will automatically convert each math formula to
+MathML and use it to attach MathML associated files (or MathML
+Structure elements) to the tagged PDF. This new feature can be
+disabled with \verb+\tagpdfsetup{math/mathml/luamml/load=false}+. More
+options to configure MathML tagging can be found in the documentation
+of \pkg{latex-lab-math}.
+
+
+\subsection{Change behavior of tagging sockets with two arguments}
+
+When calling tagging sockets with two arguments using
+\cs{UseTaggingSocket} when tagging is suspended, previous versions of
+\LaTeXe{} dropped both arguments. This behavior has been changed to
+drop the first argument and preserve the second one instead, thereby
+allowing tagging sockets to be used to wrap existing content which
+should still appear in a non-tagging context.
+
+Since no tagging sockets currently provided by \LaTeX{} use two
+arguments we do not expect this change to affect any existing
+documents, but if a custom tagging socket has been defined outside of
+the kernel it might need to be adapted to be compatible with the new
+behavior.
+%
+\githubissue{1500}
-\emph{write more details ...}
-The math module will automatically generate a MathML file and use it to
-attach MathML associated files to the structure if lua\LaTeX{} and
-the \pkg{unicode-math} package are used and the \pkg{luamml} is found.
-This new feature can be disabled with \verb+\tagpdfsetup{math/mathml/luamml=false}+
-More details can be found in the documentation of \pkg{latex-lab-math}.
-At \url{https://latex3.github.io/tagging-project/tagging-status/} we show the status of many \LaTeX{} Packages and Classes with respect to PDF tagging.
-We also started to improve tagging support in external packages. If the
-\texttt{firstaid} key is used in addition to the \texttt{phase-III} key
-basic commands of packages like \pkg{amsthm} and \pkg{fancyvrb} can now be used.
+\section{Changes to the \LaTeX{} kernel}
-\section{Handling paragraph continuation}
+\subsection{Handling paragraph continuation}
-Already \LaTeX~2.09 offered some automatism to detect whether or not
+Already \LaTeX~2.09 offered some automation to detect whether or not
text after a list or some other display environment is meant to be a
continuation of the current paragraph or should start a new one. The
document-level syntax for this is that a blank line after such an
-environment signals to \LaTeX{} that it should start a new paragraph; whilst
-no blank line signals that there should be no new paragraph and the
-text should be considered a continuation.
+environment signals to \LaTeX{} that it should start a new paragraph;
+whilst no blank line signals that there should be no new paragraph and
+the text should be considered a continuation.
-Unfortunately, there are a number of cases where the original 2.09
+Unfortunately, there were a number of cases where the original 2.09
approach failed, e.g., with
\begin{flushleft}
\ttfamily
-\{\meta{local customizations}\\
-\cs{begin}\{equation\} a<b \cs{end}\{equation\}\} \\
-\meta{some text}
+\ \ \{\meta{local customizations}\\
+\ \ \cs{begin}\{equation\} a<b \cs{end}\{equation\}\} \\
+\ \ \meta{some text}
\end{flushleft}
the \meta{some text} incorrectly started a new paragraph. Bug reports
about this behavior can be traced back to the time \LaTeXe{} was
developed, e.g., one test file from 1992 has a note that the above
-case was unfortunately not resolvable despite some improvements made back
-then. The main cause of the issue (as you probably guessed) is that
-the mechanism failed whenever the environment was executed within a
-group (\texttt{\{...\}}, \cs{begingroup}/\cs{endgroup}, or
+case was unfortunately not resolvable despite some improvements made
+back then. The main cause of the issue (as you probably guessed) is
+that the mechanism failed whenever the environment was executed within
+a group (\texttt{\{...\}}, \cs{begingroup}/\cs{endgroup}, or
\cs{bgroup}/\cs{egroup} pair) that was closed before the next blank
line was reached.
-While most of the time this could be visually corrected by adding some
+While most of the time this could be visually corrected by adding some
explicit \cs{noindent}, the situation got worse when we tried to
implement tagged PDFs resulting in incorrect structures or worse.
We therefore made a new attempt to resolve this problem in every
-situation and this new solution is rolled out in the current
-release.
+situation and this new solution is rolled out in the current release.
-\section{New or improved commands}
-
\subsection{Avoid bogus \enquote{no item} error}
The commands \cs{addvspace} and \cs{addpenalty} generated the famous
-error message \enquote{Something's wrong--perhaps a missing \cs{item}}
-when they were encountered outside vertical mode. Most of the time this
-error was bogus and if not, then it was generated several times rather
-than once.
+error message \enquote{Something's wrong---perhaps a missing \cs{item}}
+when they were encountered outside vertical mode. Most of the time
+this error was bogus and if not, then it was generated several times
+rather than once.
Once upon a time (in \LaTeX{}~2.09) it was necessary that these
commands were used only in vertical mode, but with \LaTeXe{} in 1994,
we changed the internals but simply overlooked that this error message
-then had become useless. In this release, i.e.,~30 years too late, we have
-finally lifted the ban and from now on this error should only show
-up if there is indeed a missing \cs{item}.
+then had become useless. In this release, i.e.,~30 years too late, we
+have finally lifted the ban and from now on this error should only
+show up if there is indeed a missing \cs{item}.
%
\githubissue{1460}
+\subsection[Switch to T1 as default encoding in documents
+ using \cs{DocumentMetadata}]
+ {Switch to T1 as default encoding in documents\\\mbox\qquad
+ using \cs{DocumentMetadata}}
+
+As it is well known, the font encoding \texttt{OT1} supports only 128
+characters and has various problems and quirks notably for languages
+different to English. Nevertheless \texttt{OT1} is the default
+encoding in \LaTeX{} and this cannot be easily changed without
+affecting many documents as the \texttt{T1} version of the fonts have
+slightly different metrics.
+
+The introduction of the \cs{DocumentMetadata} command, which announces
+\emph{new} code and changes that can also affect the layout gives us
+now the opportunity to make this step. So with this version a use of
+\cs{DocumentMetadata} with (pdf)\LaTeX{} will setup \texttt{T1} as
+default font encoding.\footnote{The Unicode engines will continue to
+use \texttt{TU} as the encoding.} To ensure that scalable fonts are used,
+the package \pkg{cm-super} has to be installed. Users who want to
+revert to the \texttt{OT1} encoding in their document can do so with
+\verb+\usepackage[OT1]{fontenc}+.
+
+
+
+
\section{Code improvements}
-\subsection{Avoiding keyval option clashes between classes and packages}
-
-In \LaTeX{} News~35~\cite{40:ltnews35} we introduced keyval option processing
-to the kernel. Following the standard for \LaTeXe{} options, keyval options
-given to the \cs{documentclass} line were treated as global and so parsed by
-every package. However, with keyvals, the likelihood of a name clash between a
-class-specific option and one used by a package is much higher than it is with
-simple strings. We have therefore refined the mechanism in the current release.
-
-When a class uses the kernel keyval processor, any options it recognises are
-recorded and any packages using the keyval processor will then \emph{skip}
-these \enquote{global} options. To allow for the case where a class directly
-uses an option which should be global (for example \texttt{draft}), a new key
-property \texttt{.pass-to-packages} has been added. This can then be set to
-indicate that this key is not to be skipped. For example
+\subsection[Avoiding key--value option clashes between classes and packages]
+ {Avoiding key--value option clashes between classes\\\mbox\qquad and packages}
+
+In \LaTeX{} News~35~\cite{40:ltnews35} we introduced key--value option
+processing to the kernel. Following the standard for \LaTeXe{}
+options, keyval options given to the \cs{documentclass} line were
+treated as global and so parsed by every package. However, with
+keyvals, the likelihood of a name clash between a class-specific
+option and one used by a package is much higher than it is with simple
+strings. We have therefore refined the mechanism in the current
+release.
+
+When a class uses the kernel keyval processor, any options it
+recognizes are recorded and any packages using the keyval processor
+will then \emph{skip} these \enquote{global} options. To allow for the
+case where a class directly uses an option which should be global (for
+example \texttt{draft}), a new key property \texttt{.pass-to-packages}
+has been added. This can then be set to indicate that this key is not
+to be skipped. For example
\begin{verbatim}
-\DeclareKeys{
- draft .if = {ifl@cls@draft},
- draft .pass-to-packages = true,
- mode .store = \cls@mode
-}
+ \DeclareKeys{
+ draft .if = {ifl@cls@draft},
+ draft .pass-to-packages = true,
+ mode .store = \cls@mode
+ }
\end{verbatim}
-in a class would create two options, \texttt{draft} and \texttt{mode}. The
-\texttt{draft} option will be treated in the normal way by packages using
-keyvals, but they will ignore the \texttt{mode} option: it is effectively
-marked as \enquote{private} to the class.
+in a class would create two options, \texttt{draft} and
+\texttt{mode}. The \texttt{draft} option will be treated in the normal
+way by packages using keyvals, but they will ignore the \texttt{mode}
+option: it is effectively marked as \enquote{private} to the class.
%
\githubissue{1279}
+\subsection{Improvement to \textup{\XeTeX}\ \cs{showhyphens}}
+
+When using \cs{showhyphens} with \XeTeX, missing character warnings
+would be generated for any character not in Latin Modern. This has
+been corrected and the warnings are suppressed.
+%
+\githubissue{1380}
\subsection{Improved error raised by empty hook}
-When using the hook management, both hook and label names (if specified)
-should be non-empty. Before empty hook and empty label both raised the
-same label-specific error.
+When using the hook management, both hook and label names (if
+specified) should be non-empty. Before, empty hook and empty label names both
+raised the same label-specific error:
\begin{verbatim}
! LaTeX hooks Error: Empty code label on line ....
Using 'top-level' instead.
\end{verbatim}
-This has now been improved. Now empty hook raises
+This has now been improved. Now an empty hook raises
\begin{verbatim}
! LaTeX hooks Error: Empty hook on line ....
\end{verbatim}
@@ -304,24 +478,25 @@ This has now been improved. Now empty hook raises
\subsection{Provide counter representations for link targets}
-To create unique target names for links the package
-\pkg{hyperref} uses a special counter representation
-\verb+\theH+\meta{counter}. To ensure that this
-counter representation exists, \pkg{hyperref} redefined the
-commands \verb+\@definecounter+, \verb+\@addtoreset+
-and \verb+\refstepcounter+. This counter representation is also
-needed for the Tagged PDF project and and so these augmented command definitions
-have now been incorporated
-into the kernel.
-Thus from now on every \verb+\newcounter{+\meta{counter}\verb+}+ will not
-only define \verb+\the+\meta{counter} but also \verb+\theH+\meta{counter}.
+To create unique target names for links the package \pkg{hyperref}
+uses a special counter representation \verb+\theH+\meta{counter}. To
+ensure that this counter representation exists, \pkg{hyperref}
+redefined the commands \verb+\@definecounter+, \verb+\@addtoreset+ and
+\verb+\refstepcounter+. This counter representation is also needed for
+the Tagged PDF project and so these augmented command definitions
+have now been incorporated into the kernel. Thus from now on every
+\verb+\newcounter{+\meta{counter}\verb+}+ will not only define
+\verb+\the+\meta{counter} but also \verb+\theH+\meta{counter}.
\subsection{Extending \cs{refstepcounter}}
-The package \pkg{hyperref} redefines since many years \verb+\refstepcounter+ and
-adds code that creates link targets. The kernel definition has now been extended
-with socket interfaces that will allow \pkg{hyperref} to avoid the redefinitions. The new interfaces are also used by the Tagged PDF code that needs target names to resolve
-references between structures.
+For many years, the package \pkg{hyperref} had been redefining
+\verb+\refstepcounter+ and adding code that creates link targets. The
+kernel definition has now been extended with socket interfaces that
+will allow \pkg{hyperref} to avoid the redefinitions. The new
+interfaces are also used by the Tagged PDF code that needs target
+names to resolve references between structures.
+
\section{Bug fixes}
@@ -340,48 +515,51 @@ LaTeX Warning: Suspicious rollback/min-date
\end{verbatim}
In some cases this message showed a wrong file type, i.e.,
-\verb|document class '<pkgname>'| or \verb|package '<clsname>'|.
-This has now been corrected.
+\verb|document class '<pkgname>'| or \verb|package '<clsname>'|. This
+has now been corrected.
%
\githubissue{870}
\subsection*{Fix existence check of document environments}
-\cs{NewDocumentEnvironment} and friends define (or redefine) a document
-environment using the space-trimmed \meta{envname}, but the existence
-check for \meta{envname} was done without space trimming. Thus when the
-user-specified \meta{envname} consists of leading and/or trailing
-space(s), it may lead to erroneously silent environment declaration.
-For example, in
-\begin{verbatim}
- \NewDocumentEnvironment{myenv}{}{begin}{end}
- \NewDocumentEnvironment{ myenv }{}{begin}{end}
-\end{verbatim}
+
+\cs{NewDocumentEnvironment} and friends define (or redefine) a
+document environment using the space-trimmed \meta{envname}, but the
+existence check for \meta{envname} was done without space
+trimming. Thus when the user-specified \meta{envname} consists of
+leading and/or trailing space(s), it may lead to erroneously silent
+environment declaration. For example, in
+\begin{flushleft}
+\ttfamily
+\ \ \verb=\NewDocumentEnvironment{myenv}{}{begin}{end}=\\
+\ \ \verb*=\NewDocumentEnvironment{ myenv }{}{begin}{end}=\kern-1cm
+\end{flushleft}
the first line defines a new environment \env{myenv} but the second
-line would check existence for \env{ myenv } (which is not yet defined),
-then redefine \env{myenv} environment without raising any errors.
-This has now been corrected.
+line would check existence for \verb*| myenv | (which is not yet
+defined), then redefine \env{myenv} environment without raising any
+errors. This has now been corrected.
%
\githubissue{1399}
\subsection{Handling of global keys with spaces}
If the global (class) options contained spaces around key names,
-\cs{ProcessKeyOptions} would fail to remove known keys from the
-list of unused global options and \cs{OptionNotUsed} would mistakenly
-add space-surrounded key names to that list.
-These has been corrected as a hotfix in patch level 1 of the November 2023
-release (but unfortunately not mentioned in~\cite{40:ltnews38}) and
-the current release, respectively.
+\cs{ProcessKeyOptions} would fail to remove known keys from the list
+of unused global options and \cs{OptionNotUsed} would mistakenly add
+space-surrounded key names to that list. The first issue was corrected as
+a hotfix in patch level 1 of the November 2023 release (but
+unfortunately not mentioned in~\cite{40:ltnews38}) and the second in the current
+release.
%
\githubissue{1238}
\subsection{File list entries for rolled back packages/classes}
-When the rollback mechanism for packages and classes was introduced
-in 2018~\cite{40:ltnews28}, loading of the selected historic release
-was not recorded in the file list used by \cs{listfiles}.
-This has now been corrected so that the extended usage~\cite{40:ltnews39}
+
+When the rollback mechanism for packages and classes was introduced in
+2018~\cite{40:ltnews28}, loading of the selected historic release was
+not recorded in the file list used by \cs{listfiles}. This has now
+been corrected so that the extended usage~\cite{40:ltnews39}
\begin{verbatim}
-\listfiles[hashes,sizes]
+ \listfiles[hashes,sizes]
\end{verbatim}
now gives more complete and less confusing info.
%
@@ -389,56 +567,61 @@ now gives more complete and less confusing info.
\subsection{\pkg{doc}:\ \cs{PrintDescribeMacro} in preamble}
-In \pkg{doc} version 2 it was possible alter the definition of
+In \pkg{doc} version 2 it was possible to alter the definition of
\cs{PrintDescribeMacro} and similar commands in preamble. In version 3
-this stopped working because they go reset at the end of the
+this stopped working because they were reset at the end of the
preamble. This has now been implemented differently and changes in the
preamble are possible again.
%
\githubissue{1000}
-\section{Improvement to \XeTeX\ \cs{showhyphens}}
-When using \cs{showhyphens} with \XeTeX, missing character warnings
-would be generated for any character not in Latin Modern. This has been
-corrected and the warnings are suppressed.
-%
-\githubissue{1380}
+\subsection{Avoid low-level error if \cs{ShowHooks} is used late}
+If \cs{ShowHooks} was used to examine a package hook after the
+package was loaded, a low level error resulted. This has now been
+corrected.
+%
+\githubissue{1513}
-\section{Avoid code duplication in rollback}
+\subsection{Avoid code duplication in rollback}
-When the kernel uses \cs{AddToHook} in a region that might be
-rolled back (which happens in a few places) and a document requests a
-rollback, then we have the situation that the hook already contains code to which we added the same
-(or slightly different) code during the
-rollback; this results in code duplication or, worse, in errors. This has
-now been corrected by dropping any such code chunk (if there is one) prior to
-adding the rollback code.
+When the kernel uses \cs{AddToHook} in a region that might be rolled
+back (which happens in a few places) and a document requests a
+rollback, then we have the situation that the hook already contains
+code to which we added the same (or slightly different) code during
+the rollback; this results in code duplication or, worse, in
+errors. This has now been corrected by dropping any such code chunk
+(if there is one) prior to adding the rollback code.
%
\githubissue{1407}
-\section{Passing template keys using \cs{KeyValue}}
-With the move of the template code to the kernel, some internal efficiencies
-were also made. However, there was an oversight in how passing key values from
-one setting to another was implemented, meaning that using \cs{KeyValue} could
-result in an infinite loop. This has now been fixed.
+\subsection{Passing template keys using \cs{KeyValue}}
+
+With the move of the template code to the kernel, internal
+functions were reviewed to improve efficiency. However, there
+was an oversight in how
+passing key values from one setting to another was implemented,
+such that using \cs{KeyValue} could result in an infinite
+loop. This has now been fixed.
%
\githubissue{1486}
+
+
\section{Changes to packages in the \pkg{amsmath} category}
-\section{Extend support for \cs{dots}}
+\subsection{Extend support for \cs{dots}}
The implementation of \cs{dots} in \pkg{amsmath} has the feature that
it selects different dots depending on the symbol that follows: e.g.,
dots between commas would normally be on the baseline, while dots
-between binary or relational symols would be raised. However, when symbols such
-as \cs{cong} were protected from expansion in moving arguments (so
-that they worked in places such as headings) it had the unfortunate
-side-effect that the \cs{dots} magic stopped working for them. This
-has now been corrected.
+between binary or relational symbols would be raised. However, when
+symbols such as \cs{cong} were protected from expansion in moving
+arguments (so that they worked in places such as headings) it had the
+unfortunate side-effect that the \cs{dots} magic stopped working for
+them. This has now been corrected.
%
\githubissue{1265}
@@ -450,15 +633,29 @@ has now been corrected.
\subsection{Modification to generation of the \file{.tex} from \pkg{fileerr}}
-The \pkg{fileerr} extraction has been modified to write \texttt{rename-to-empty-base.tex}
-rather than \texttt{.tex} to comply with an expected security change in texlive 2025.
-\texttt{build.lua} has been modified to rename \texttt{rename-to-empty-base.tex} to \texttt{.tex}
-after unpacking. However if using \textsf{docstrip} directly rather than using \textsf{l3build}
-or the unpacked zip file from \CTAN{}, the user must now rename the file and install as \texttt{.tex}.
+The \pkg{fileerr} extraction has been modified to write
+\texttt{rename-to-empty-base.tex} rather than \texttt{.tex} to comply
+with an expected security change in \TeX{}~Live 2025. The
+\texttt{build.lua} file for the \pkg{tools} has been modified to
+rename \texttt{rename-to-empty-base.tex} to \texttt{.tex} after
+unpacking. However if using \textsf{docstrip} directly rather than
+using \textsf{l3build} or the unpacked zip file from \CTAN{}, the user
+must now rename the file and install as \texttt{.tex}.
%
\githubissue{1412}
-\subsection{\pkg{array}: Tagging support for \cs{cline}}
+
+\subsection{\pkg{array}:\ Improve \texttt{>\{...\}} specifier}
+
+If the argument of \texttt{>\{...\}} ended with a command accepting a
+trailing optional argument, e.g., defined for example with
+\verb=\NewDocumentCommand\foo{o}{...}=, one could get low-level
+parsing errors. This has now been corrected.
+%
+\githubissue{1468}
+
+
+\subsection{\pkg{array}:\ Tagging support for \cs{cline}}
In the last release we added tagging support for \pkg{array},
\pkg{longtable} and other tabular packages, but we overlooked that the
@@ -468,40 +665,55 @@ artifact. Furthermore, the processing of a \cs{cline} looks to the
algorithm as if another row is added (which is technically what
happens), thus it was also necessary to decrement the internal row
counter to get a correct row count. This has now been corrected in
-\pkg{array} which is automatically loaded for tagging, so that all
+\pkg{array}, which is automatically loaded for tagging, so that all
these packages are now fully compatible with the tagging code if it is
turned on.
%
\taggingissue{134}
-\subsection{\pkg{longtable}: Extend caption type}
-The \pkg{longtable} has been extended and now provides the command \cs{LTcaptype}
-(stemming from the \pkg{ltcaption} package) to change
-the counter and caption type used by the \cs{caption} command from longtable.
-So with \verb+\renewcommand\LTcaptype{figure}+, a longtable will step the
-figure counter instead of the table counter and produce an
-entry in the list of figures. An empty definition, \verb+\renewcommand\LTcaptype{}+,
-will suppress increasing of the counter. This makes it easy to define an
-unnumbered variant of longtable:
+\subsection{\pkg{longtable}:\ Extend caption type}
+
+The \pkg{longtable} package has been extended and now provides the command
+\cs{LTcaptype} (stemming from the \pkg{ltcaption} package) to change
+the counter and caption type used by the \cs{caption} command from
+longtable. So with \verb+\renewcommand\LTcaptype{figure}+, a
+longtable will step the figure counter instead of the table counter
+and produce an entry in the list of figures. An empty definition,
+\verb+\renewcommand\LTcaptype{}+, will suppress increasing of the
+counter. This makes it easy to define an unnumbered variant of
+longtable:
\begin{verbatim}
-\newenvironment{longtable*}
- {\renewcommand\LTcaptype{}\longtable}
- {\endlongtable}
+ \newenvironment{longtable*}
+ {\renewcommand\LTcaptype{}\longtable}
+ {\endlongtable}
\end{verbatim}
+\subsection{\pkg{longtable}:\ Prevent \cs{pagegoal} exceeding maximum value}
-\subsection{\pkg{array}: Improve \texttt{>\{...\}} specifier}
-
-If the argument of \texttt{>\{...\}} ended with a command accepting a
-trailing optional argument, e.g., defined for example with
-\verb=\NewDocumentCommand\foo{o}{...}=, one could get low-level
-parsing errors. This has now been corrected.
+An internal guard has been added to avoid \TeX\ errors if
+\verb=\pagegoal= is increased beyond the maximum value for a
+\TeX\ dimension.
%
-\githubissue{1468}
+\githubissue{1495}
+
+\section{Changes to \pkg{l3build}}
+
+To support third-party developers testing their code against pre-release
+\LaTeX{}, a new switch \verb|--dev| has been added to \pkg{l3build}.
+This allows the developer to run
+\begin{verbatim}
+ l3build check
+\end{verbatim}
+to run their test suite against the current release of \LaTeX{} and
+\begin{verbatim}
+ l3build check --dev
+\end{verbatim}
+to run exactly the same tests using the development release of
+\LaTeX{}.
%\section{Changes to files in the \pkg{cyrillic} category}
@@ -518,9 +730,13 @@ Leslie Lamport.
\newblock Reprinted with corrections in 1996.
\bibitem{40:ltnews} \LaTeX{} Project Team.
- \emph{\LaTeXe{} news 1--39}. June, 2024.
+ \emph{\LaTeXe{} news 1--39}. June 2024.
\url{https://latex-project.org/news/latex2e-news/ltnews.pdf}
+\bibitem{40:ltnews22} \LaTeX{} Project Team.
+ \emph{\LaTeXe{} news 22}. January 2015.
+ \url{https://latex-project.org/news/latex2e-news/ltnews22.pdf}
+
\bibitem{40:ltnews28} \LaTeX{} Project Team.
\emph{\LaTeXe{} news 28}. April 2018.
\url{https://latex-project.org/news/latex2e-news/ltnews28.pdf}
diff --git a/macros/latex-dev/base/ltnews41.pdf b/macros/latex-dev/base/ltnews41.pdf
new file mode 100644
index 0000000000..aa6c674964
--- /dev/null
+++ b/macros/latex-dev/base/ltnews41.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews41.tex b/macros/latex-dev/base/ltnews41.tex
new file mode 100644
index 0000000000..0c9751704a
--- /dev/null
+++ b/macros/latex-dev/base/ltnews41.tex
@@ -0,0 +1,190 @@
+% \iffalse meta-comment
+%
+% Copyright 2024
+% The LaTeX Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the LaTeX base system.
+% -——————————————
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% https://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+%
+% This file has the LPPL maintenance status "maintained".
+%
+% The list of all files belonging to the LaTeX base distribution is
+% given in the file `manifest.txt'. See also `legal.txt' for additional
+% information.
+%
+% The list of derived (unpacked) files belonging to the distribution
+% and covered by LPPL is defined by the unpacking scripts (with
+% extension .ins) which are part of the distribution.
+%
+% \fi
+% Filename: ltnews41.tex
+%
+% This is issue 41 of LaTeX News.
+
+\NeedsTeXFormat{LaTeX2e}[2020-02-02]
+
+\documentclass{ltnews}
+
+%% Maybe needed only for Chris' inadequate system:
+\providecommand\Dash {\unskip \textemdash}
+
+%% NOTE: Chris' preferred hyphens!
+%% \showhyphens{parameters}
+%% \hyphenation{because}
+
+\usepackage[T1]{fontenc}
+
+\usepackage{lmodern,url,hologo}
+
+\usepackage{csquotes}
+\usepackage{multicol}
+\usepackage{color}
+
+\providecommand\hook[1]{\texttt{#1}}
+
+\providecommand\meta[1]{$\langle$\textrm{\itshape#1}$\rangle$}
+\providecommand\option[1]{\texttt{#1}}
+\providecommand\env[1]{\texttt{#1}}
+\providecommand\Arg[1]{\texttt\{\meta{#1}\texttt\}}
+
+
+\providecommand\eTeX{\hologo{eTeX}}
+\providecommand\XeTeX{\hologo{XeTeX}}
+\providecommand\LuaTeX{\hologo{LuaTeX}}
+\providecommand\pdfTeX{\hologo{pdfTeX}}
+\providecommand\MiKTeX{\hologo{MiKTeX}}
+\providecommand\CTAN{\textsc{ctan}}
+\providecommand\TL{\TeX\,Live}
+
+
+\providecommand\githubissue[2][]{\ifhmode\unskip\fi
+ \quad\penalty500\strut\nobreak\hfill
+ \mbox{\small\slshape(%
+ \href{https://github.com/latex3/latex2e/issues/\getfirstgithubissue#2 \relax}%
+ {github issue#1 #2}%
+ )}%
+ \par\smallskip}
+%% But Chris has to mostly disable \href for his TEXPAD app:
+%% \def\href #1#2{#2} % Only For Chris' deficient TeX engine
+
+% simple solution right now (just link to the first issue if there are more)
+\def\getfirstgithubissue#1 #2\relax{#1}
+
+\providecommand\sxissue[1]{\ifhmode\unskip
+ \else
+ % githubissue preceding
+ \vskip-\smallskipamount
+ \vskip-\parskip
+ \fi
+ \quad\penalty500\strut\nobreak\hfill
+ \mbox{\small\slshape(\url{https://tex.stackexchange.com/#1})}\par}
+
+\providecommand\gnatsissue[2]{\ifhmode\unskip\fi
+ \quad\penalty500\strut\nobreak\hfill
+ \mbox{\small\slshape(%
+ \href{https://www.latex-project.org/cgi-bin/ltxbugs2html?pr=#1\%2F\getfirstgithubissue#2 \relax}%
+ {gnats issue #1/#2}%
+ )}%
+ \par}
+
+\let\cls\pkg
+\providecommand\env[1]{\texttt{#1}}
+\providecommand\acro[1]{\textsc{#1}}
+
+\vbadness=1400 % accept slightly empty columns
+
+
+\let\finalpagebreak\pagebreak % for TUB (if they use it)
+\let\finalvspace\vspace % for document layout fixes
+
+\makeatletter
+% maybe not the greatest design but normally we wouldn't have subsubsections
+\renewcommand{\subsubsection}{%
+ \@startsection {subsubsection}{2}{0pt}{1.5ex \@plus 1ex \@minus .2ex}%
+ {-1em}{\@subheadingfont\colonize}%
+}
+\providecommand\colonize[1]{#1:}
+\makeatother
+
+
+% Undo ltnews's \verbatim@font with active < and >
+\makeatletter
+\def\verbatim@font{\normalsize\ttfamily}
+\makeatother
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\providecommand\tubcommand[1]{}
+\tubcommand{\input{tubltmac}}
+
+\publicationmonth{June}
+\publicationyear{2025 --- DRAFT version for upcoming release}
+
+\publicationissue{41}
+
+\begin{document}
+
+\maketitle
+{\hyphenpenalty=10000 \exhyphenpenalty=10000 \spaceskip=3.33pt \hbadness=10000
+\tableofcontents}
+
+\setlength\rightskip{0pt plus 3em}
+
+\medskip
+
+\section{Introduction}
+
+% To write
+
+\section{New or improved commands}
+
+\section{Code improvements}
+
+\section{Bug fixes}
+
+%\subsection{A fix}
+
+%% Some text
+%
+%%\githubissue{XXXX}
+
+%\section{Changes to packages in the \pkg{amsmath} category}
+
+%\section{Changes to packages in the \pkg{graphics} category}
+
+%\section{Changes to packages in the \pkg{tools} category}
+
+%\section{Changes to files in the \pkg{cyrillic} category}
+
+\begin{thebibliography}{9}\frenchspacing
+
+%\fontsize{9.3}{11.3}\selectfont
+
+\bibitem{41:Lamport}
+Leslie Lamport.
+\newblock \emph{{\LaTeX}: {A} Document Preparation System: User's Guide and Reference
+ Manual}.
+\newblock \mbox{Addison}-Wesley, Reading, MA, USA, 2nd edition, 1994.
+\newblock ISBN 0-201-52983-1.
+\newblock Reprinted with corrections in 1996.
+
+\bibitem{41:ltnews} \LaTeX{} Project Team.
+ \emph{\LaTeXe{} news 1--39}. June, 2024.
+ \url{https://latex-project.org/news/latex2e-news/ltnews.pdf}
+
+\bibitem{41:ltnews40} \LaTeX{} Project Team.
+ \emph{\LaTeXe{} news 40}. November 2024.
+ \url{https://latex-project.org/news/latex2e-news/ltnews40.pdf}
+
+\end{thebibliography}
+
+\end{document}
diff --git a/macros/latex-dev/base/ltpara-code.pdf b/macros/latex-dev/base/ltpara-code.pdf
index 538b23b3ac..9fd9d61978 100644
--- a/macros/latex-dev/base/ltpara-code.pdf
+++ b/macros/latex-dev/base/ltpara-code.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltpara-doc.pdf b/macros/latex-dev/base/ltpara-doc.pdf
index 9a28b40b5b..2400146a3d 100644
--- a/macros/latex-dev/base/ltpara-doc.pdf
+++ b/macros/latex-dev/base/ltpara-doc.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltproperties-code.pdf b/macros/latex-dev/base/ltproperties-code.pdf
index 88e4b154b1..6ef1abd4fb 100644
--- a/macros/latex-dev/base/ltproperties-code.pdf
+++ b/macros/latex-dev/base/ltproperties-code.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltproperties-doc.pdf b/macros/latex-dev/base/ltproperties-doc.pdf
index 9075c499b8..7411dda4c3 100644
--- a/macros/latex-dev/base/ltproperties-doc.pdf
+++ b/macros/latex-dev/base/ltproperties-doc.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltproperties.dtx b/macros/latex-dev/base/ltproperties.dtx
index 23a38c43af..77d36a43a9 100644
--- a/macros/latex-dev/base/ltproperties.dtx
+++ b/macros/latex-dev/base/ltproperties.dtx
@@ -30,7 +30,7 @@
%<*driver>
% \fi
\ProvidesFile{ltproperties.dtx}
- [2024/09/25 v1.0g LaTeX Kernel (Properties)]
+ [2024/10/21 v1.0h LaTeX Kernel (Properties)]
% \iffalse
%
\documentclass[full]{l3doc}
@@ -363,7 +363,7 @@
% has been set with the standard \cs{label} command.
% \end{function}
%
-% \begin{function}{\IfPropertyRecordedTF}
+% \begin{function}{\IfPropertyRecordedTF,\IfPropertyRecordedT,\IfPropertyRecordedF}
% \begin{syntax}
% \cs{IfPropertyRecordedTF} \Arg{label} \Arg{property} \Arg{true code} \Arg{false code}
% \end{syntax}
@@ -805,9 +805,12 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\IfPropertyRecordedTF}
+% \begin{macro}{\IfPropertyRecordedTF,\IfPropertyRecordedT,\IfPropertyRecordedF}
+% \changes{v1.0h}{2024-10-21}{Define \cs{IfPropertyRecordedT}, \cs{IfPropertyRecordedF}}
% \begin{macrocode}
-\cs_new_eq:NN \IfPropertyRecordedTF \property_if_recorded:eeTF
+\cs_new_eq:NN \IfPropertyRecordedTF \property_if_recorded:eeTF
+\cs_new:Npn \IfPropertyRecordedT #1#2#3 { \property_if_recorded:eeTF {#1}{#2}{#3}{} }
+\cs_new:Npn \IfPropertyRecordedF #1#2#3 { \property_if_recorded:eeTF {#1}{#2}{}{#3} }
% \end{macrocode}
% \end{macro}
%
diff --git a/macros/latex-dev/base/ltshipout-code.pdf b/macros/latex-dev/base/ltshipout-code.pdf
index 8800cc981a..ed0017f6a5 100644
--- a/macros/latex-dev/base/ltshipout-code.pdf
+++ b/macros/latex-dev/base/ltshipout-code.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltshipout-doc.pdf b/macros/latex-dev/base/ltshipout-doc.pdf
index 8b6ba93c8a..3f179f3f17 100644
--- a/macros/latex-dev/base/ltshipout-doc.pdf
+++ b/macros/latex-dev/base/ltshipout-doc.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltshipout.dtx b/macros/latex-dev/base/ltshipout.dtx
index 0c9113ce93..c2e70ba6d5 100644
--- a/macros/latex-dev/base/ltshipout.dtx
+++ b/macros/latex-dev/base/ltshipout.dtx
@@ -34,7 +34,7 @@
%<*driver>
% \fi
\ProvidesFile{ltshipout.dtx}
- [2024/02/11 v1.0n LaTeX Kernel (Shipout)]
+ [2024/10/22 v1.0n LaTeX Kernel (Shipout)]
% \iffalse
%
\documentclass{l3doc}
@@ -469,7 +469,7 @@
%
% \begin{variable}{\PreviousTotalPages}
% \begin{syntax}
-% \cs{thetotalpages}/\cs{PreviousTotalPages}
+% \cs{PreviousTotalPages}
% \end{syntax}
% Command that expands to the number of total pages from the
% previous run. If there was no previous run or if used in the
diff --git a/macros/latex-dev/base/ltsockets-code.pdf b/macros/latex-dev/base/ltsockets-code.pdf
index 017fcd6d1e..db17620914 100644
--- a/macros/latex-dev/base/ltsockets-code.pdf
+++ b/macros/latex-dev/base/ltsockets-code.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltsockets-doc.pdf b/macros/latex-dev/base/ltsockets-doc.pdf
index 37df65d4d7..0328fa8758 100644
--- a/macros/latex-dev/base/ltsockets-doc.pdf
+++ b/macros/latex-dev/base/ltsockets-doc.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltsockets.dtx b/macros/latex-dev/base/ltsockets.dtx
index c77c74b57f..a977f8f6aa 100644
--- a/macros/latex-dev/base/ltsockets.dtx
+++ b/macros/latex-dev/base/ltsockets.dtx
@@ -33,7 +33,7 @@
%<*driver>
% \fi
\ProvidesFile{ltsockets.dtx}
- [2024/06/29 v0.9a LaTeX Kernel (Sockets)]
+ [2024/10/27 v0.9b LaTeX Kernel (Sockets)]
% \iffalse
%
\documentclass{l3doc}
@@ -371,7 +371,7 @@
% number of inputs = 2
% available plugs = noop, plug-A, plug-B
% current plug = plug-B
-% definition = \protected\long macro:#1#2->\begin {quote}\sffamily
+% definition = \long macro:#1#2->\begin {quote}\sffamily
% foo-B: #2\textsuperscript {2}\end {quote}
% \end{verbatim}
% \LogSocket{foo}
@@ -617,6 +617,22 @@
% \end{function}
%
%
+% \begin{function}[EXP]{\socket_use_expandable:nw,\socket_use_expandable:n}
+% \begin{syntax}
+% \cs{socket_use_expandable:n} \Arg{socket-name}
+% \end{syntax}
+% Fully expandable variant of \cs{socket_use:n}. This can be used in macro code
+% to retrieve code from sockets which need to appear in an expandable context.
+%
+% This usually requires the plug to only contain expandable code and should therefore
+% only be used for sockets which are clearly documented to be used in an expandable context.
+% This command does not print any debugging info when \cs{DebugSocketsOn} is active
+% and should therefore be avoided whenever possible.
+%
+% For performance reasons there is no explicit check that the socket was declared!
+% \end{function}
+%
+%
% \begin{function}{\ShowSocket,\LogSocket,\socket_show:n,\socket_log:n}
% \begin{syntax}
% \cs{ShowSocket} \Arg{socket-name}
@@ -820,6 +836,7 @@
%
%
% \begin{macro}{\socket_new_plug:nnn,\socket_set_plug:nnn}
+% \changes{v0.9b}{2024/10/27}{Make plug definition non-protected}
%
% Declaring a code for a socket is just making a definition, taking
% the number of arguments from the saved int.
@@ -834,7 +851,7 @@
{
\cs_generate_from_arg_count:cNnn
{ @@_#1_plug_#2:w }
- \cs_new_protected:Npn
+ \cs_new:Npn
{ \int_use:c { c_@@_#1_args_int } }
{#3}
% \end{macrocode}
@@ -862,7 +879,7 @@
{
\cs_generate_from_arg_count:cNnn
{ @@_#1_plug_#2:w }
- \cs_set_protected:Npn
+ \cs_set:Npn
{ \int_use:c { c_@@_#1_args_int } }
{#3}
\@@_debug_term:n
@@ -942,6 +959,17 @@
% \fmi{Implement?}
% \end{macro}
%
+% \begin{macro}{\socket_use_expandable:nw,\socket_use_expandable:n}
+% \changes{v0.9b}{2024/10/27}{Added \cs{socket_use_expandable:n}}
+% The same as the non-expandable code, except for the missing debug output.
+% \begin{macrocode}
+\cs_new:Npn \socket_use_expandable:nw #1 {
+ \use:c { @@_#1_plug_ \str_use:c { l_@@_#1_plug_str } :w }
+}
+\cs_new_eq:NN \socket_use_expandable:n \socket_use_expandable:nw % socket with no inputs
+% \end{macrocode}
+% \end{macro}
+%
%
%
%
diff --git a/macros/latex-dev/base/lttagging.dtx b/macros/latex-dev/base/lttagging.dtx
index 74735a3762..6b68cd0e05 100644
--- a/macros/latex-dev/base/lttagging.dtx
+++ b/macros/latex-dev/base/lttagging.dtx
@@ -33,7 +33,7 @@
%<*driver>
% \fi
\ProvidesFile{lttagging.dtx}
- [2024/10/11 v1.0j LaTeX Kernel (tagging support)]
+ [2024/10/21 v1.0k LaTeX Kernel (tagging support)]
% \iffalse
\documentclass{l3doc}
\GetFileInfo{lttagging.dtx}
@@ -78,7 +78,7 @@
% \DescribeMacro\tag_suspend:n
% \DescribeMacro\tag_resume:n
-%
+%
% The are places in code where it is import top stop any tagging
% activities, e.g., when we are doing trial typesetting that it is
% done several times. In such a case one must tag only the final
@@ -107,46 +107,51 @@
% \DescribeMacro\UseTaggingSocket
% \DescribeMacro\tag_socket_use:n
% \DescribeMacro\tag_socket_use:nn
-% To support tagging in packages we use sockets with names starting
-% with \texttt{tagsupport/}. Usually, these sockets have exactly two
-% plugs defined:
-% \plug{noop} (when no tagging is requested or tagging is not wanted
-% for some reason) and a second plug that enables the tagging. There
-% may be more, e.g., tagging with special debugging, etc., but right
-% now it is usually just on or off.
-%
-% Given that we sometimes have to suspend tagging, it would be fairly
-% inefficient to put different plugs into these sockets whenever that
-% happens. We therefore offer \cs{UseTaggingSocket} which is like
-% \cs{UseSocket} except that the socket name is specified without
-% \texttt{tagsupport/}, i.e.,
+% \DescribeMacro\tag_socket_use:nnn
+% Given that we sometimes have to suspend tagging, it would be fairly
+% inefficient to put different plugs into these sockets whenever that
+% happens. We therefore offer \cs{UseTaggingSocket} which is like
+% \cs{UseSocket} except that is expects a socket starting with
+% \texttt{tagsupport/} but the socket name is specified without
+% this prefix, i.e.,
% \begin{quote}
% \verb=\UseTaggingSocket{foo}= $\to$
% \verb=\UseSocket{tagsupport/foo}=
-% \end{quote}
-% Beside being slightly shorter, the big advantage is that this way
-% we can change \cs{UseTaggingSocket} to do nothing when tagging is
-% suspended with \cs{SuspendTagging} instead of changing the plugs of
-% the tagging support sockets back and forth.
-%
-% This means that with \cs{SuspendTagging} in force all socket
-% arguments are ignored (including the case when there is a single
-% one), i.e., all sockets used with \cs{UseTaggingSocket} behave as
-% if the \text{noop} plug is assigned.
-%
-% It is possible to use the tagging support sockets with
-% \cs{UseSocket} instead of \cs{UseTaggingSocket}, but in this case
-% the socket remains active if \cs{SuspendTagging} is in force. There
-% may be reasons for doing that, but in general we expect to always
-% use \cs{UseTaggingSocket}.
-%
-% The L3 programming layer versions \cs{tag_socket_use:n} and
-% \cs{tag_socket_use:nn} are slightly more efficient than
+% \end{quote}.
+%
+% Beside being slightly shorter, the big advantage is that this way
+% we can change \cs{UseTaggingSocket} to do nothing by switching a boolean
+% instead of changing the plugs of the tagging support sockets back and forth.
+%
+% Usually, these sockets have (beside the default plug defined for every socket)
+% one additional plug defined and directly assigned. This plug is used when
+% tagging is active.
+% There may be more plugs, e.g., tagging with special debugging or special behaviour
+% depending on the class or PDF version etc., but right now it is usually just on or off.
+%
+% When tagging is suspended they all have the same predefined behaviour:
+% The sockets with zero arguments do nothing. The sockets with one argument
+% gobble their argument. The sockets with two arguments
+% will drop their first argument and pass the second unchanged.
+%
+% It is possible to use the tagging support sockets with
+% \cs{UseSocket} directly, but in this case the socket remains active
+% if \cs{SuspendTagging} is in force. There may be reasons for doing
+% that but in general we expect to always use \cs{UseTaggingSocket}.
+%
+% \DescribeMacro\UseExpandableTaggingSocket
+% \DescribeMacro\tag_socket_use_expandable:n
+% For special cases like in some \cs{halign} contexts we need a fully expandable
+% version of the commend. For these cases, \cs{UseExpandableTaggingSocket} can be
+% used. To allow being expandable, it does not output any debugging information
+% if \cs{DebugSocketsOn} is in effect and therefore should be avoided whenever possible.
+%
+% The L3 programming layer versions \cs{tag_socket_use_expandable:n},
+% \cs{tag_socket_use:n}, \cs{tag_socket_use:nn}, and \cs{tag_socket_use:nnn}
+% are slightly more efficient than
% \cs{UseTaggingSocket} because they do not have to determine how
-% many arguments the socket takes when disabling it, so in code that
-% is using the L3 programming layer we recommend to use them instead
-% of the CamelCase command.
-%
+% many arguments the socket takes when disabling it.
+%
%
% \MaybeStop{}
%
@@ -156,12 +161,12 @@
%
%
% \begin{macro}{\tag_suspend:n,\tag_resume:n,\SuspendTagging,\ResumeTagging}
-%
+%
% In the kernel, these commands get dummy definitions so that
% they can be used without harm in packages. The real definition is
% used when tagging gets enabled.
% \begin{macrocode}
-\cs_new_eq:NN \tag_suspend:n \use_none:n
+\cs_new_eq:NN \tag_suspend:n \use_none:n
\cs_new_eq:NN \tag_resume:n \use_none:n
\cs_new_protected:Npn \SuspendTagging #1 { \tag_suspend:n {#1} }
\cs_new_protected:Npn \ResumeTagging #1 { \tag_resume:n {#1} }
@@ -170,7 +175,10 @@
%
% \begin{macro}{\tag_socket_use:n,
% \tag_socket_use:nn,
+% \tag_socket_use:nnn,
+% \tag_socket_use_expandable:n,
% \UseTaggingSocket,
+% \UseExpandableTaggingSocket,
% }
% Again this is not the final definition for the kernel; it is just
% a version to get going while some parts of the kernel support are
@@ -187,19 +195,21 @@
%
% Dummy definitions in the kernel.
% These definitions will get updated in \pkg{tagpdf}.
+% The default in the kernel is just to get rid of the first argument, the second is preserved if present:
+% \changes{v1.0k}{2024/10/21}{Changed behavior of two argument tagging sockets when disabled.}
+% \changes{v1.0k}{2024/10/21}{Added expandable variants}
% \begin{macrocode}
+\cs_new:Npn \tag_socket_use_expandable:n #1 { }
\cs_new_protected:Npn \tag_socket_use:n #1 { }
\cs_new_protected:Npn \tag_socket_use:nn #1#2 { }
-% \end{macrocode}
-% The default in the kernel is just to get rid of the argument:
-% \begin{macrocode}
+\cs_new_protected:Npn \tag_socket_use:nnn #1#2#3 { #3 }
\cs_new_protected:Npn \UseTaggingSocket #1 {
\int_case:nnF
{ \int_use:c { c__socket_tagsupport/#1_args_int } }
{
0 \prg_do_nothing:
1 \use_none:n
- 2 \use_none:nn
+ 2 \use_ii:nn
% \end{macrocode}
% We do not expect tagging sockets with more than one or two
% arguments, so for now we only provide those.
@@ -208,15 +218,28 @@
\ERRORusetaggingsocket % that should get a proper error message
}
% \end{macrocode}
+% The same as an expandable command:
+% \begin{macrocode}
+\cs_new:Npn \UseExpandableTaggingSocket #1 {
+ \int_case:nnF
+ { \int_use:c { c__socket_tagsupport/#1_args_int } }
+ {
+ 0 \prg_do_nothing:
+ 1 \use_none:n
+ 2 \use_ii:nn
+ }
+ \ERRORusetaggingsocket % that should get a proper error message
+}
+% \end{macrocode}
%
% \end{macro}
%
% \subsection{Tagging sockets}
% This collects tagging sockets that should be generally available
-% so that they can also be used even if the tagging code is not loaded.
-%
+% so that they can also be used even if the tagging code is not loaded.
+%
% \subsubsection{Tagging support for paragraph setup}
-%
+%
% Paragraphs are tagged through the code in the para/hooks. This code is sometimes
% adjusted, e.g. to produce a \enquote{flattened} paragraph or to use a different tag.
% Sockets related to such code parts are collected here.
@@ -225,22 +248,22 @@
% The block code needs to know if they are nested blockenvs inside
% a flattened environment. For this it uses a counter. Inside some contexts,
% e.g. at the begin of a minipage or a footnote this counter must be reset.
-% We therefore define the counter here so that we can use it in the following
-% socket.
+% We therefore define the counter here so that we can use it in the following
+% socket.
% \begin{macrocode}
\int_new:N \l__tag_block_flattened_level_int
% \end{macrocode}
% \end{macro}
-%
+%
% \begin{socketdecl}{tagsupport/para/restore}
% This socket restores the para related settings to their default. It
% should be used in places where ``normal'' paragraph tagging must be ensured, for example
-% at the begin of a footnote.
+% at the begin of a footnote.
% \begin{macrocode}
\NewSocket{tagsupport/para/restore}{0}
% \end{macrocode}
% \end{socketdecl}
-%
+%
% \begin{plugdecl}{default}
% \changes{v1.0i}{2024/10/10}{Restore also paratagging (tagging/723)}
% \begin{macrocode}
@@ -255,7 +278,7 @@
\AssignSocketPlug{tagsupport/para/restore}{default}
% \end{macrocode}
% \end{plugdecl}
-%
+%
% \begin{socketdecl}{tagsupport/para/begin,tagsupport/para/end}
% These sockets are currently defined in tagpdf. They overwrite
% definitions in the latex-lab-block code. There is also a simpler
@@ -273,22 +296,22 @@
\NewSocket{tagsupport/recordtarget}{0}
% \end{macrocode}
% \end{socketdecl}
-%
+%
% \begin{plugdecl}{kernel (tagsupport/recordtarget)}
% \begin{macrocode}
-%
+%
\NewSocketPlug{tagsupport/recordtarget}{kernel}
{
\tl_if_blank:VF \@currentHref
{
- \prop_gput:Nee
- \g__tag_struct_dest_num_prop
+ \prop_gput:Nee
+ \g__tag_struct_dest_num_prop
{\@currentHref}
- {\tag_get:n{struct_num}}
+ {\tag_get:n{struct_num}}
}
}
-\AssignSocketPlug{tagsupport/recordtarget}{kernel}
-\ExplSyntaxOff
+\AssignSocketPlug{tagsupport/recordtarget}{kernel}
+\ExplSyntaxOff
% \end{macrocode}
% \end{plugdecl}
% \subsubsection{Tagging sockets for toc}
@@ -307,28 +330,28 @@
% \begin{socketdecl}{tagsupport/toc/starttoc/before,
% tagsupport/toc/starttoc/after}
% Tagging sockets for the begin and end of start of \cs{@starttoc}.
-% They take one argument, the extension.
+% They take one argument, the extension.
% \begin{macrocode}
\NewSocket{tagsupport/toc/starttoc/before}{1}
\NewSocket{tagsupport/toc/starttoc/after}{1}
% \end{macrocode}
% \end{socketdecl}
-%
+%
% \begin{socketdecl}{tagsupport/toc/leaders/before,
% tagsupport/toc/leaders/after}
% Tagging sockets to make the dot leaders an artifact.
-% They do not take an argument.
+% They do not take an argument.
% \begin{macrocode}
\NewSocket{tagsupport/toc/leaders/before}{0}
\NewSocket{tagsupport/toc/leaders/after}{0}
% \end{macrocode}
% \end{socketdecl}
-%
+%
% \subsubsection{Tagging support for table/tabular packages}
%
% The code uses a number of sockets to inject the tagging
% commands. These can be easily set to a noop-plug in case the
-% automated tagging is not wanted.
+% automated tagging is not wanted.
%
% \begin{socketdecl}{tagsupport/tbl/cell/begin,
% tagsupport/tbl/cell/end,
@@ -463,10 +486,10 @@
% \end{socketdecl}
%
% \subsubsection{Tagging Support for floats}
-%
+%
% \begin{socketdecl}{tagsupport/float/hmode/begin,
% tagsupport/float/hmode/end}
-% These sockets are used if the float is called in
+% These sockets are used if the float is called in
% hmode.
% \changes{v1.0h}{2024/09/13}{Sockets for floats added}
% \begin{macrocode}
@@ -484,38 +507,38 @@
% \end{macrocode}
% \end{socketdecl}
%
-%
+%
% \begin{socketdecl}{tagsupport/caption/begin,
% tagsupport/caption/end}
% These sockets are used in \cs{@makecaption}.
% They open and close the \texttt{Caption} structure.
-% Their default plugs assume that they are used in
+% Their default plugs assume that they are used in
% vmode. The argument of the begin socket is
% the structure number of the parent float. If it is
-% empty the current structure number is used.
+% empty the current structure number is used.
% \begin{macrocode}
\NewSocket{tagsupport/caption/begin}{1}
\NewSocket{tagsupport/caption/end}{0}
% \end{macrocode}
% \end{socketdecl}
-%
+%
% \begin{socketdecl}{tagsupport/caption/label/begin,
% tagsupport/caption/label/end}
% These sockets are used in \cs{@makecaption} around the
-% label. Their default plugs ensure that
-% the label is outside the paragraph and that
+% label. Their default plugs ensure that
+% the label is outside the paragraph and that
% the rest of the caption uses flattened para mode. If the
-% caption is not in a hbox, the \texttt{para/begin}
-% socket should follow to properly start the paragraph.
+% caption is not in a hbox, the \texttt{para/begin}
+% socket should follow to properly start the paragraph.
% \begin{macrocode}
\NewSocket{tagsupport/caption/label/begin}{0}
-\NewSocket{tagsupport/caption/label/end}{0}
+\NewSocket{tagsupport/caption/label/end}{0}
% \end{macrocode}
% \end{socketdecl}
-%
+%
% \section{For lttab.dtx parked here for now}
%
-%
+%
% \begin{macrocode}
%<@@=tbl>
\ExplSyntaxOn
@@ -536,7 +559,7 @@
% \g_@@_row_int,
% \g_@@_span_tl,
% \g_@@_table_cols_tl}
-%
+%
% \cs{g_@@_row_int} holds the current row number in the table. The
% value \texttt{0} means we haven't yet processed the table
% preamble (or in case of longtable are just in front of the next
@@ -606,14 +629,14 @@
% \subsection{Tracing/debugging}
%
% \begin{macro}{\DebugTablesOn,\DebugTablesOff}
-%
+%
% \begin{macrocode}
\def\DebugTablesOn{
\cs_set_eq:NN \@@_trace:n \typeout
-}
+}
\def\DebugTablesOff{
\cs_set_eq:NN \@@_trace:n \use_none:n
-}
+}
% \end{macrocode}
%
% \begin{macrocode}
@@ -663,7 +686,7 @@
%
%
% \begin{macro}{\l_@@_tmpa_seq}
-%
+%
% \begin{macrocode}
\seq_new:N \l_@@_tmpa_seq
% \end{macrocode}
@@ -672,7 +695,7 @@
%
%
% \begin{macro}{\tbl_count_missing_cells:n}
-%
+%
% We might have the situation that some table package has not
% implemented the \cs{tbl_count_table_cols:} in which case
% \cs{g_@@_table_cols_tl} would always be zero and we would get an
@@ -708,7 +731,7 @@
%
%
% \begin{macro}{\tbl_save_outer_table_cols:}
-%
+%
% \begin{macrocode}
\cs_new_protected:Npn \tbl_save_outer_table_cols: {
\tl_set_eq:NN \l_@@_saved_table_cols_tl \g_@@_table_cols_tl
@@ -718,7 +741,7 @@
%
%
% \begin{macro}{\tbl_init_cell_data_for_table:}
-%
+%
% \begin{macrocode}
\cs_new_protected:Npn \tbl_init_cell_data_for_table: {
\tl_set:No \l_@@_saved_col_tl {\int_use:N \g_@@_col_int }
@@ -832,14 +855,14 @@
%
%
% \begin{macro}{\tbl_restore_outer_cell_data:}
-%
+%
% \begin{macrocode}
\cs_new_protected:Npn \tbl_restore_outer_cell_data: {
\int_gset:Nn \g_@@_col_int { \l_@@_saved_col_tl }
\int_gset:Nn \g_@@_row_int { \l_@@_saved_row_tl }
\tl_gset_eq:NN \g_@@_span_tl \l_@@_saved_span_tl
\tl_gset_eq:NN \g_@@_table_cols_tl \l_@@_saved_table_cols_tl
- \UseTaggingSocket{tbl/restore/celldata}
+ \UseTaggingSocket{tbl/restore/celldata}
\@@_trace:n { ==>~ restored~cell~data:~
\int_use:N \g_@@_row_int,
\int_use:N \g_@@_col_int,
@@ -901,7 +924,7 @@
% the macro \cs{tbl_count_missing_cells:n} is executed and
% then the row is finished with a final \cs{cr}.
% \begin{macrocode}
-\cs_new:Npn \tbl_crcr:n #1 {
+\cs_new:Npn \tbl_crcr:n #1 {
\int_compare:nNnT \g_@@_col_int > 0
{
\tbl_count_missing_cells:n {#1}
@@ -928,7 +951,7 @@
% \changes{v1.0h}{2024/09/20}{moved \cs{@kernel@refstepcounter} into ltxref}
% This is needed for \pkg{longtable} because \cs{refstepcounter} is
% setting up a target when \pkg{hyperref} is loaded and we don't
-% want that in \pkg{longtable}.%%
+% want that in \pkg{longtable}.%%
% Prevent longtable patching by hyperref until hyperref does so automatically:
% \begin{macrocode}
\def\hyper@nopatch@longtable{}
diff --git a/macros/latex-dev/base/lttemplates-code.pdf b/macros/latex-dev/base/lttemplates-code.pdf
index 2a2ede340d..aa3b6f9c56 100644
--- a/macros/latex-dev/base/lttemplates-code.pdf
+++ b/macros/latex-dev/base/lttemplates-code.pdf
Binary files differ
diff --git a/macros/latex-dev/base/lttemplates-doc.pdf b/macros/latex-dev/base/lttemplates-doc.pdf
index b828c74d87..76c00342a5 100644
--- a/macros/latex-dev/base/lttemplates-doc.pdf
+++ b/macros/latex-dev/base/lttemplates-doc.pdf
Binary files differ
diff --git a/macros/latex-dev/base/lttextcomp.dtx b/macros/latex-dev/base/lttextcomp.dtx
index 7f247747d6..1ee4a18b7a 100644
--- a/macros/latex-dev/base/lttextcomp.dtx
+++ b/macros/latex-dev/base/lttextcomp.dtx
@@ -2357,8 +2357,8 @@
% \changes{v1.1a}{2024/01/27}{Added check file for encoding subset}
% \begin{macrocode}
%<*TS1check>
-\Providesfile{checkencodingsubset.tex}
- [2024/01/27 v0.5a Figure out safe TS1 encoding subsets]
+\ProvidesFile{checkencodingsubset.tex}
+ [2024/10/18 v0.5b Figure out safe TS1 encoding subsets]
% \end{macrocode}
%
% \begin{macrocode}
diff --git a/macros/latex-dev/base/ltvers.dtx b/macros/latex-dev/base/ltvers.dtx
index 50c8b9a91f..76a16e3528 100644
--- a/macros/latex-dev/base/ltvers.dtx
+++ b/macros/latex-dev/base/ltvers.dtx
@@ -112,10 +112,10 @@
%</2ekernel>
%<latexrelease>\edef\latexreleaseversion
%<*2ekernel|latexrelease>
- {2024-11-01}
+ {2025-06-01}
%</2ekernel|latexrelease>
%<*2ekernel>
-\def\patch@level{-4}
+\def\patch@level{0}
% \end{macrocode}
%
% \begin{macro}{\development@branch@name}
diff --git a/macros/latex-dev/base/ltx3info.pdf b/macros/latex-dev/base/ltx3info.pdf
index c9d6243144..ea8d21b55f 100644
--- a/macros/latex-dev/base/ltx3info.pdf
+++ b/macros/latex-dev/base/ltx3info.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltxdoc.pdf b/macros/latex-dev/base/ltxdoc.pdf
index bf34a6158d..f0034affb5 100644
--- a/macros/latex-dev/base/ltxdoc.pdf
+++ b/macros/latex-dev/base/ltxdoc.pdf
Binary files differ
diff --git a/macros/latex-dev/base/makeindx.pdf b/macros/latex-dev/base/makeindx.pdf
index 17b55b3b69..7be9058ba3 100644
--- a/macros/latex-dev/base/makeindx.pdf
+++ b/macros/latex-dev/base/makeindx.pdf
Binary files differ
diff --git a/macros/latex-dev/base/manifest.txt b/macros/latex-dev/base/manifest.txt
index 21b3c0bff3..e393012417 100644
--- a/macros/latex-dev/base/manifest.txt
+++ b/macros/latex-dev/base/manifest.txt
@@ -76,7 +76,8 @@
% ltnews37.tex -- What was new in the release dated 2023/06.
% ltnews38.tex -- What was new in the release dated 2023/11.
% ltnews39.tex -- What was new in the release dated 2024/06.
-%
+% ltnews40.tex -- What was new in the release dated 2024/11.
+% ltnews41.tex -- What was new in the release dated 2025/06.
%
% ltx3info.tex -- Information about the LaTeX3 project.
%
diff --git a/macros/latex-dev/base/modguide.pdf b/macros/latex-dev/base/modguide.pdf
index b2f9b603d3..a176dd214f 100644
--- a/macros/latex-dev/base/modguide.pdf
+++ b/macros/latex-dev/base/modguide.pdf
Binary files differ
diff --git a/macros/latex-dev/base/nfssfont.pdf b/macros/latex-dev/base/nfssfont.pdf
index daeb13bff5..06fcd085a8 100644
--- a/macros/latex-dev/base/nfssfont.pdf
+++ b/macros/latex-dev/base/nfssfont.pdf
Binary files differ
diff --git a/macros/latex-dev/base/proc.pdf b/macros/latex-dev/base/proc.pdf
index f3df0c2e37..5a14431bdd 100644
--- a/macros/latex-dev/base/proc.pdf
+++ b/macros/latex-dev/base/proc.pdf
Binary files differ
diff --git a/macros/latex-dev/base/slides.pdf b/macros/latex-dev/base/slides.pdf
index 22f5e97d71..8297e59343 100644
--- a/macros/latex-dev/base/slides.pdf
+++ b/macros/latex-dev/base/slides.pdf
Binary files differ
diff --git a/macros/latex-dev/base/slifonts.pdf b/macros/latex-dev/base/slifonts.pdf
index f9e8e569e9..e1c640709a 100644
--- a/macros/latex-dev/base/slifonts.pdf
+++ b/macros/latex-dev/base/slifonts.pdf
Binary files differ
diff --git a/macros/latex-dev/base/source2e.pdf b/macros/latex-dev/base/source2e.pdf
index 618ab9f305..87c4de96db 100644
--- a/macros/latex-dev/base/source2e.pdf
+++ b/macros/latex-dev/base/source2e.pdf
Binary files differ
diff --git a/macros/latex-dev/base/syntonly.pdf b/macros/latex-dev/base/syntonly.pdf
index 46ee8c1e14..a711c567f2 100644
--- a/macros/latex-dev/base/syntonly.pdf
+++ b/macros/latex-dev/base/syntonly.pdf
Binary files differ
diff --git a/macros/latex-dev/base/tlc2.pdf b/macros/latex-dev/base/tlc2.pdf
index dcf6ce6c2e..2174d9c5d3 100644
--- a/macros/latex-dev/base/tlc2.pdf
+++ b/macros/latex-dev/base/tlc2.pdf
Binary files differ
diff --git a/macros/latex-dev/base/tlc3.pdf b/macros/latex-dev/base/tlc3.pdf
index 978b713fb6..f7c206a692 100644
--- a/macros/latex-dev/base/tlc3.pdf
+++ b/macros/latex-dev/base/tlc3.pdf
Binary files differ
diff --git a/macros/latex-dev/base/tulm.pdf b/macros/latex-dev/base/tulm.pdf
index c146c31e21..d3a865fe6c 100644
--- a/macros/latex-dev/base/tulm.pdf
+++ b/macros/latex-dev/base/tulm.pdf
Binary files differ
diff --git a/macros/latex-dev/base/usrguide-historic.pdf b/macros/latex-dev/base/usrguide-historic.pdf
index 0a1b81b425..2ebb782a01 100644
--- a/macros/latex-dev/base/usrguide-historic.pdf
+++ b/macros/latex-dev/base/usrguide-historic.pdf
Binary files differ
diff --git a/macros/latex-dev/base/usrguide.pdf b/macros/latex-dev/base/usrguide.pdf
index c33ac4a591..4cdaff2fa3 100644
--- a/macros/latex-dev/base/usrguide.pdf
+++ b/macros/latex-dev/base/usrguide.pdf
Binary files differ
diff --git a/macros/latex-dev/base/usrguide.tex b/macros/latex-dev/base/usrguide.tex
index 2b9e959627..e4ea6e4e0c 100644
--- a/macros/latex-dev/base/usrguide.tex
+++ b/macros/latex-dev/base/usrguide.tex
@@ -43,7 +43,7 @@
\texttt{usrguide.tex} for full details.}%
}
-\date{2024-05-24}
+\date{2024-10-22}
\NewDocumentCommand\cs{m}{\texttt{\textbackslash\detokenize{#1}}}
\NewDocumentCommand\marg{m}{\arg{#1}}
@@ -265,7 +265,16 @@ These commands work in the same way as \cs{NewDocumentCommand}, etc.\@, but
create environments (\cs{begin}\arg{env} \ldots{}
\cs{end}\arg{env}). Both the \meta{beg-code} and \meta{end-code}
may access the arguments as defined by \meta{arg spec}. The arguments will be
-given following \cs{begin}\arg{env}.
+given following \cs{begin}\arg{env}. Any spaces at the start and end of the
+\arg{env} are removed before the definition takes place, thus
+\begin{verbatim}
+\NewDocumentEnvironment{foo}
+\end{verbatim}
+and
+\begin{verbatim}
+\NewDocumentEnvironment{ foo }
+\end{verbatim}
+both create the same \enquote{\texttt{foo}} environment.
\subsection{Optional arguments}
\label{sec:cmd:opt}
diff --git a/macros/latex-dev/base/utf8ienc.pdf b/macros/latex-dev/base/utf8ienc.pdf
index b7f8f1da07..fee976bcfa 100644
--- a/macros/latex-dev/base/utf8ienc.pdf
+++ b/macros/latex-dev/base/utf8ienc.pdf
Binary files differ
diff --git a/macros/latex-dev/base/webcomp.pdf b/macros/latex-dev/base/webcomp.pdf
index d570bb43fe..5796eaeff8 100644
--- a/macros/latex-dev/base/webcomp.pdf
+++ b/macros/latex-dev/base/webcomp.pdf
Binary files differ