summaryrefslogtreecommitdiff
path: root/macros
diff options
context:
space:
mode:
Diffstat (limited to 'macros')
-rw-r--r--macros/latex-dev/base/README.md2
-rw-r--r--macros/latex-dev/base/alltt.pdfbin223828 -> 223831 bytes
-rw-r--r--macros/latex-dev/base/cfgguide.pdfbin264157 -> 264168 bytes
-rw-r--r--macros/latex-dev/base/changes.txt88
-rw-r--r--macros/latex-dev/base/classes.pdfbin560996 -> 560998 bytes
-rw-r--r--macros/latex-dev/base/clsguide-historic.pdfbin415586 -> 415615 bytes
-rw-r--r--macros/latex-dev/base/clsguide.pdfbin452015 -> 451992 bytes
-rw-r--r--macros/latex-dev/base/cmfonts.pdfbin292647 -> 292600 bytes
-rw-r--r--macros/latex-dev/base/cyrguide.pdfbin257359 -> 257359 bytes
-rw-r--r--macros/latex-dev/base/doc-code.pdfbin1075545 -> 1075811 bytes
-rw-r--r--macros/latex-dev/base/doc.pdfbin755961 -> 756197 bytes
-rw-r--r--macros/latex-dev/base/docstrip.pdfbin504261 -> 504704 bytes
-rw-r--r--macros/latex-dev/base/encguide.pdfbin1318565 -> 1318576 bytes
-rw-r--r--macros/latex-dev/base/exscale.pdfbin204710 -> 204708 bytes
-rw-r--r--macros/latex-dev/base/fix-cm.pdfbin287726 -> 287727 bytes
-rw-r--r--macros/latex-dev/base/fntguide.pdfbin517658 -> 517659 bytes
-rw-r--r--macros/latex-dev/base/format.ins2
-rw-r--r--macros/latex-dev/base/graphpap.pdfbin161717 -> 161722 bytes
-rw-r--r--macros/latex-dev/base/ifthen.pdfbin221207 -> 221219 bytes
-rw-r--r--macros/latex-dev/base/inputenc.pdfbin318162 -> 318199 bytes
-rw-r--r--macros/latex-dev/base/lamport-manual.pdfbin170883 -> 170876 bytes
-rw-r--r--macros/latex-dev/base/latexrelease.ins2
-rw-r--r--macros/latex-dev/base/latexrelease.pdfbin282097 -> 282095 bytes
-rw-r--r--macros/latex-dev/base/latexsym.pdfbin200762 -> 200759 bytes
-rw-r--r--macros/latex-dev/base/lb2.err2
-rw-r--r--macros/latex-dev/base/lb2.pdfbin252516 -> 252497 bytes
-rw-r--r--macros/latex-dev/base/letter.pdfbin337720 -> 337428 bytes
-rw-r--r--macros/latex-dev/base/lgc2.err2
-rw-r--r--macros/latex-dev/base/lgc2.pdfbin217757 -> 217659 bytes
-rw-r--r--macros/latex-dev/base/lppl.pdfbin132369 -> 132370 bytes
-rw-r--r--macros/latex-dev/base/ltcmd.dtx153
-rw-r--r--macros/latex-dev/base/ltcmdhooks-code.pdfbin755479 -> 755624 bytes
-rw-r--r--macros/latex-dev/base/ltcmdhooks-doc.pdfbin498967 -> 499095 bytes
-rw-r--r--macros/latex-dev/base/ltcmdhooks.dtx8
-rw-r--r--macros/latex-dev/base/ltfilehook-code.pdfbin804008 -> 803891 bytes
-rw-r--r--macros/latex-dev/base/ltfilehook-doc.pdfbin548598 -> 548560 bytes
-rw-r--r--macros/latex-dev/base/ltfilehook.dtx3
-rw-r--r--macros/latex-dev/base/ltfiles.dtx26
-rw-r--r--macros/latex-dev/base/lthooks-code.pdfbin1242405 -> 1258576 bytes
-rw-r--r--macros/latex-dev/base/lthooks-doc.pdfbin739507 -> 755724 bytes
-rw-r--r--macros/latex-dev/base/lthooks.dtx38
-rw-r--r--macros/latex-dev/base/ltluatex.dtx12
-rw-r--r--macros/latex-dev/base/ltluatex.pdfbin325074 -> 325191 bytes
-rw-r--r--macros/latex-dev/base/ltmarks-code.pdfbin716305 -> 716708 bytes
-rw-r--r--macros/latex-dev/base/ltmarks-doc.pdfbin586433 -> 586833 bytes
-rw-r--r--macros/latex-dev/base/ltmiscen.dtx245
-rw-r--r--macros/latex-dev/base/ltnews.pdfbin1287055 -> 1320668 bytes
-rw-r--r--macros/latex-dev/base/ltnews.tex2
-rw-r--r--macros/latex-dev/base/ltnews01.pdfbin169550 -> 169553 bytes
-rw-r--r--macros/latex-dev/base/ltnews02.pdfbin151773 -> 151773 bytes
-rw-r--r--macros/latex-dev/base/ltnews03.pdfbin151321 -> 151324 bytes
-rw-r--r--macros/latex-dev/base/ltnews04.pdfbin152549 -> 152551 bytes
-rw-r--r--macros/latex-dev/base/ltnews05.pdfbin175216 -> 175211 bytes
-rw-r--r--macros/latex-dev/base/ltnews06.pdfbin142864 -> 142867 bytes
-rw-r--r--macros/latex-dev/base/ltnews07.pdfbin138211 -> 138214 bytes
-rw-r--r--macros/latex-dev/base/ltnews08.pdfbin155434 -> 155442 bytes
-rw-r--r--macros/latex-dev/base/ltnews09.pdfbin130026 -> 130028 bytes
-rw-r--r--macros/latex-dev/base/ltnews10.pdfbin169432 -> 169433 bytes
-rw-r--r--macros/latex-dev/base/ltnews11.pdfbin112202 -> 112208 bytes
-rw-r--r--macros/latex-dev/base/ltnews12.pdfbin156765 -> 156764 bytes
-rw-r--r--macros/latex-dev/base/ltnews13.pdfbin182490 -> 182483 bytes
-rw-r--r--macros/latex-dev/base/ltnews14.pdfbin170721 -> 170722 bytes
-rw-r--r--macros/latex-dev/base/ltnews15.pdfbin130323 -> 130328 bytes
-rw-r--r--macros/latex-dev/base/ltnews16.pdfbin138110 -> 138107 bytes
-rw-r--r--macros/latex-dev/base/ltnews17.pdfbin166268 -> 166269 bytes
-rw-r--r--macros/latex-dev/base/ltnews18.pdfbin39840 -> 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.pdfbin245229 -> 245228 bytes
-rw-r--r--macros/latex-dev/base/ltnews22.pdfbin318036 -> 318026 bytes
-rw-r--r--macros/latex-dev/base/ltnews23.pdfbin286839 -> 286824 bytes
-rw-r--r--macros/latex-dev/base/ltnews24.pdfbin265497 -> 265497 bytes
-rw-r--r--macros/latex-dev/base/ltnews25.pdfbin205098 -> 205100 bytes
-rw-r--r--macros/latex-dev/base/ltnews26.pdfbin379722 -> 379733 bytes
-rw-r--r--macros/latex-dev/base/ltnews27.pdfbin251285 -> 251283 bytes
-rw-r--r--macros/latex-dev/base/ltnews28.pdfbin376930 -> 376933 bytes
-rw-r--r--macros/latex-dev/base/ltnews29.pdfbin455431 -> 455437 bytes
-rw-r--r--macros/latex-dev/base/ltnews30.pdfbin512246 -> 512240 bytes
-rw-r--r--macros/latex-dev/base/ltnews31.pdfbin526692 -> 526688 bytes
-rw-r--r--macros/latex-dev/base/ltnews32.pdfbin546554 -> 546540 bytes
-rw-r--r--macros/latex-dev/base/ltnews33.pdfbin522771 -> 522757 bytes
-rw-r--r--macros/latex-dev/base/ltnews34.pdfbin508349 -> 508345 bytes
-rw-r--r--macros/latex-dev/base/ltnews35.pdfbin563329 -> 563307 bytes
-rw-r--r--macros/latex-dev/base/ltnews36.pdfbin517935 -> 517934 bytes
-rw-r--r--macros/latex-dev/base/ltnews37.pdfbin456936 -> 456926 bytes
-rw-r--r--macros/latex-dev/base/ltnews38.pdfbin0 -> 359786 bytes
-rw-r--r--macros/latex-dev/base/ltnews38.tex257
-rw-r--r--macros/latex-dev/base/ltpara-code.pdfbin672189 -> 672682 bytes
-rw-r--r--macros/latex-dev/base/ltpara-doc.pdfbin560056 -> 560566 bytes
-rw-r--r--macros/latex-dev/base/ltproperties-code.pdfbin0 -> 557678 bytes
-rw-r--r--macros/latex-dev/base/ltproperties-code.tex5
-rw-r--r--macros/latex-dev/base/ltproperties-doc.pdfbin0 -> 432158 bytes
-rw-r--r--macros/latex-dev/base/ltproperties-doc.tex8
-rw-r--r--macros/latex-dev/base/ltproperties.dtx943
-rw-r--r--macros/latex-dev/base/ltshipout-code.pdfbin821608 -> 821678 bytes
-rw-r--r--macros/latex-dev/base/ltshipout-doc.pdfbin566503 -> 566578 bytes
-rw-r--r--macros/latex-dev/base/ltsockets-code.pdfbin0 -> 606430 bytes
-rw-r--r--macros/latex-dev/base/ltsockets-code.tex5
-rw-r--r--macros/latex-dev/base/ltsockets-doc.pdfbin0 -> 489290 bytes
-rw-r--r--macros/latex-dev/base/ltsockets-doc.tex8
-rw-r--r--macros/latex-dev/base/ltsockets.dtx1069
-rw-r--r--macros/latex-dev/base/ltspace.dtx19
-rw-r--r--macros/latex-dev/base/ltvers.dtx2
-rw-r--r--macros/latex-dev/base/ltx3info.pdfbin219347 -> 219358 bytes
-rw-r--r--macros/latex-dev/base/ltxdoc.pdfbin244224 -> 244215 bytes
-rw-r--r--macros/latex-dev/base/makeindx.pdfbin165816 -> 165816 bytes
-rw-r--r--macros/latex-dev/base/manifest.txt1
-rw-r--r--macros/latex-dev/base/modguide.pdfbin257823 -> 257825 bytes
-rw-r--r--macros/latex-dev/base/nfssfont.pdfbin211175 -> 211171 bytes
-rw-r--r--macros/latex-dev/base/proc.pdfbin227060 -> 227065 bytes
-rw-r--r--macros/latex-dev/base/slides.pdfbin375509 -> 375493 bytes
-rw-r--r--macros/latex-dev/base/slifonts.pdfbin234183 -> 234171 bytes
-rw-r--r--macros/latex-dev/base/source2e.pdfbin6006299 -> 6137755 bytes
-rw-r--r--macros/latex-dev/base/source2e.tex4
-rw-r--r--macros/latex-dev/base/syntonly.pdfbin189801 -> 189816 bytes
-rw-r--r--macros/latex-dev/base/tlc2.err2
-rw-r--r--macros/latex-dev/base/tlc2.pdfbin291233 -> 291143 bytes
-rw-r--r--macros/latex-dev/base/tlc3.err655
-rw-r--r--macros/latex-dev/base/tlc3.pdfbin250362 -> 323048 bytes
-rw-r--r--macros/latex-dev/base/tulm.pdfbin162770 -> 162773 bytes
-rw-r--r--macros/latex-dev/base/usrguide-historic.pdfbin438603 -> 438602 bytes
-rw-r--r--macros/latex-dev/base/usrguide.pdfbin479722 -> 477695 bytes
-rw-r--r--macros/latex-dev/base/usrguide.tex30
-rw-r--r--macros/latex-dev/base/utf8ienc.pdfbin353396 -> 353658 bytes
-rw-r--r--macros/latex-dev/base/webcomp.pdfbin146199 -> 146199 bytes
-rw-r--r--macros/latex-dev/required/amsmath/README.md2
-rw-r--r--macros/latex-dev/required/amsmath/amsbsy.pdfbin174944 -> 174946 bytes
-rw-r--r--macros/latex-dev/required/amsmath/amscd.pdfbin179953 -> 179951 bytes
-rw-r--r--macros/latex-dev/required/amsmath/amsgen.pdfbin178181 -> 178193 bytes
-rw-r--r--macros/latex-dev/required/amsmath/amsldoc.pdfbin508198 -> 508230 bytes
-rw-r--r--macros/latex-dev/required/amsmath/amsmath.pdfbin419900 -> 419922 bytes
-rw-r--r--macros/latex-dev/required/amsmath/amsopn.pdfbin140096 -> 140093 bytes
-rw-r--r--macros/latex-dev/required/amsmath/amstext.pdfbin217502 -> 217504 bytes
-rw-r--r--macros/latex-dev/required/amsmath/amsxtra.pdfbin113554 -> 113560 bytes
-rw-r--r--macros/latex-dev/required/amsmath/changes.txt4
-rw-r--r--macros/latex-dev/required/amsmath/subeqn.pdfbin109734 -> 109733 bytes
-rw-r--r--macros/latex-dev/required/amsmath/technote.pdfbin147464 -> 147459 bytes
-rw-r--r--macros/latex-dev/required/amsmath/testmath.pdfbin454559 -> 454658 bytes
-rw-r--r--macros/latex-dev/required/amsmath/testmath.tex69
-rw-r--r--macros/latex-dev/required/firstaid/changes.txt9
-rw-r--r--macros/latex-dev/required/firstaid/firstaid.ins7
-rw-r--r--macros/latex-dev/required/firstaid/latex2e-first-aid-for-external-files.dtx121
-rw-r--r--macros/latex-dev/required/firstaid/latex2e-first-aid-for-external-files.pdfbin269095 -> 252465 bytes
-rw-r--r--macros/latex/contrib/arraycols/arraycols.dtx178
-rw-r--r--macros/latex/contrib/arraycols/arraycols.pdfbin463229 -> 464654 bytes
-rw-r--r--macros/latex/contrib/jeuxcartes/doc/JeuxCartes-doc.pdfbin8285082 -> 8286389 bytes
-rw-r--r--macros/latex/contrib/jeuxcartes/doc/JeuxCartes-doc.tex8
-rw-r--r--macros/latex/contrib/jeuxcartes/tex/JeuxCartes.sty11
-rw-r--r--macros/latex/contrib/l3build/CHANGELOG.md18
-rw-r--r--macros/latex/contrib/l3build/README.md2
-rw-r--r--macros/latex/contrib/l3build/l3build-check.lua3
-rw-r--r--macros/latex/contrib/l3build/l3build-install.lua1
-rw-r--r--macros/latex/contrib/l3build/l3build-typesetting.lua6
-rw-r--r--macros/latex/contrib/l3build/l3build-variables.lua2
-rw-r--r--macros/latex/contrib/l3build/l3build.12
-rw-r--r--macros/latex/contrib/l3build/l3build.dtx21
-rwxr-xr-xmacros/latex/contrib/l3build/l3build.lua2
-rw-r--r--macros/latex/contrib/l3build/l3build.pdfbin744608 -> 744760 bytes
-rw-r--r--macros/luatex/latex/lua-typo/README.md7
-rw-r--r--macros/luatex/latex/lua-typo/doc/lua-typo-demo.pdfbin16859 -> 16859 bytes
-rw-r--r--macros/luatex/latex/lua-typo/doc/lua-typo-fr.pdfbin106625 -> 107474 bytes
-rw-r--r--macros/luatex/latex/lua-typo/doc/lua-typo.pdfbin208526 -> 217771 bytes
-rw-r--r--macros/luatex/latex/lua-typo/source/lua-typo.dtx588
-rw-r--r--macros/texinfo/latest/texinfo.tex9
164 files changed, 3881 insertions, 782 deletions
diff --git a/macros/latex-dev/base/README.md b/macros/latex-dev/base/README.md
index ba50e71a80..cb5a4a60dc 100644
--- a/macros/latex-dev/base/README.md
+++ b/macros/latex-dev/base/README.md
@@ -1,7 +1,7 @@
The LaTeX kernel
================
-Release 2023-11-01 pre-release 0
+Release 2023-11-01 pre-release 1
Overview
--------
diff --git a/macros/latex-dev/base/alltt.pdf b/macros/latex-dev/base/alltt.pdf
index 2f288f85c3..f2368d8b8c 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 15f9b2e4b3..dc422901be 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 86fda4e1ca..3454f49ac6 100644
--- a/macros/latex-dev/base/changes.txt
+++ b/macros/latex-dev/base/changes.txt
@@ -5,10 +5,74 @@ It is provided for convenience only. It therefore makes no claims to
completeness or accuracy and it contains some references to files that
are not part of the distribution.
================================================================================
+2023-09-13 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
+ * ltproperties.dtx:
+ expand consistently the label/property names in the LaTeX2e commands.
+
+2023-09-13 Joseph Wright <Joseph.Wright@latex-project.org>
+ * ltmiscen.dtx:
+ add test to \enddocument for changes in property values.
+
+2023-09-05 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
+ * ltproperties.dtx:
+ First implementation of properties module
+ * ltmiscen.dtx:
+ Correct typo
+
+2023-09-01 Joseph Wright <Joseph.Wright@latex-project.org>
+
+ * ltmiscen.dtx
+ Provide global definition for active tab
+
+2023-06-15 Joseph Wright <Joseph.Wright@latex-project.org>
+
+ * ltmiscen.dtx
+ Refinements to tab support
+
+2023-06-14 Joseph Wright <Joseph.Wright@latex-project.org>
+
+ * ltmiscen.dtx, ltspace.dtx
+ Support (visible) tabs in verbatim material
+
+2023-08-19 Joseph Wright <Joseph.Wright@latex-project.org>
+
+2023-08-19 Joseph Wright <Joseph.Wright@latex-project.org>
+
+ * ltcmd.dtx, usrguide.tex
+ Remove \GetDocumentCommandArgSpec,
+ \GetDocumentEnvironmentArgSpec,
+ \ShowDocumentCommandArgSpec,
+ \ShowDocumentEnvironmentArgSpec
+
+2023-08-05 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * ltsockets.dtx:
+ First implementation of the sockets module.
+
+2023-07-10 Marcel Krüger <marcel.krueger@latex-project.org>
+
+ * ltluatex.dtx
+ Restore post_mlist_to_hlist_filter callback type to reverselist (gh1116)
+
+2023-07-10 Yukai Chou <muzimuzhi@gmail.com>
+
+ * ltfilehook.dtx (subsection{Declaring a file substitution}):
+ Drop a redundant \ExplSyntaxOff
+
+2023-07-02 David Carlisle <David.Carlisle@latex-project.org>
+
+ * ltluatex.dtx modify new_luafunction to ensure
+ \e@alloc@luafunction@count always matches the size of the Lua
+ table of function allocations (gh100)
+
+2023-06-12 Joseph Wright <Joseph.Wright@latex-project.org>
+
+ * usrguide.tex
+ Correct description of font encodings supported for case changing
2023-06-09 Joseph Wright <Joseph.Wright@latex-project.org>
- * usrguide.txt
+ * usrguide.tex
Various refinements to descriptions of \NewDocumentCommand, etc.
================================================================================
@@ -16,6 +80,26 @@ All changes above are only part of the development branch for the next release.
================================================================================
#########################
+# 2023-06-01 PL1 Release
+#########################
+
+2023-06-16 Yukai Chou <muzimuzhi@gmail.com>
+
+ * lthooks.dtx (subsection{Setting rules for hooks code}):
+ Sync \@expl@@@initialize@all@@ with \__hook_initialize_all: if latter is
+ rolled back (gh1088)
+
+2023-06-16 Joseph Wright <Joseph.Wright@latex-project.org>
+
+ * ltfiles.dtx
+ Allow for pipes in \input, etc.
+
+2023-06-16 Phelype Oleinik <Joseph.Wright@latex-project.org>
+
+ * lthooks.dtx, ltcmdhooks.dtx
+ Correct some rollback labels and dates.
+
+#########################
# 2023-06-01 Release
#########################
@@ -26,7 +110,7 @@ All changes above are only part of the development branch for the next release.
2023-05-31 Joseph Wright <Joseph.Wright@latex-project.org>
- * usrguide.txt
+ * usrguide.tex
Correct syntax of opt. arg. for \DeclareLowercaseMapping, etc.
2023-05-30 Joseph Wright <Joseph.Wright@latex-project.org>
diff --git a/macros/latex-dev/base/classes.pdf b/macros/latex-dev/base/classes.pdf
index d41f58e276..e77d02dec9 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 e5a2ce5fb6..9ed59b2255 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 de72af6952..04c4ea27a4 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 b1dfbca7d3..b4f8929917 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 9b65f892be..2bdb504323 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 b6275f54a2..4ed15617dd 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.pdf b/macros/latex-dev/base/doc.pdf
index b06b8b45f3..e31007c879 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 f3b5f66e8e..df1404ebe5 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 5cdbd43262..aa08d7dc01 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 774055dd4e..546a2d0549 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 885c9771af..07a8643054 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 38d6bc75b6..1be6ca422f 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/format.ins b/macros/latex-dev/base/format.ins
index 74cd78ff4a..ba0965004d 100644
--- a/macros/latex-dev/base/format.ins
+++ b/macros/latex-dev/base/format.ins
@@ -169,6 +169,7 @@ the system are in the document `cfgguide.tex'.
\from{ltcmd.dtx}{2ekernel} % L3 layer module (used to be xparse)
\from{lthooks.dtx}{2ekernel} % L3 layer module
\from{ltcmdhooks.dtx}{2ekernel} % L3 layer module
+ \from{ltsockets.dtx}{2ekernel} % L3 layer module
\from{ltalloc.dtx}{2ekernel}
\from{ltcntrl.dtx}{2ekernel}
\from{lterror.dtx}{2ekernel}
@@ -191,6 +192,7 @@ the system are in the document `cfgguide.tex'.
\from{lttextcomp.dtx}{2ekernel}
\from{ltpageno.dtx}{2ekernel}
\from{ltxref.dtx}{2ekernel}
+ \from{ltproperties.dtx}{2ekernel}
\from{ltmiscen.dtx}{2ekernel}
\from{ltmath.dtx}{2ekernel}
\from{ltlists.dtx}{2ekernel}
diff --git a/macros/latex-dev/base/graphpap.pdf b/macros/latex-dev/base/graphpap.pdf
index 7f4f6f9757..02c26dfdb6 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 5276d75a11..ff5e6a9040 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 2dc16e5a84..5b83bb0998 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 f37100a1aa..35607608f6 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.ins b/macros/latex-dev/base/latexrelease.ins
index 61315f8e07..93739630e3 100644
--- a/macros/latex-dev/base/latexrelease.ins
+++ b/macros/latex-dev/base/latexrelease.ins
@@ -96,6 +96,7 @@ extension .ins) which are part of the distribution.
\from{ltcmd.dtx} {latexrelease}% L3 layer module
\from{lthooks.dtx} {latexrelease}% L3 layer module
\from{ltcmdhooks.dtx} {latexrelease}% L3 layer module
+ \from{ltsockets.dtx} {latexrelease}% L3 layer module
\from{ltalloc.dtx} {latexrelease}% empty
\from{ltcntrl.dtx} {latexrelease}% empty
\from{lterror.dtx} {latexrelease}% empty
@@ -118,6 +119,7 @@ extension .ins) which are part of the distribution.
\from{lttextcomp.dtx} {latexrelease}%
\from{ltpageno.dtx} {latexrelease}% empty
\from{ltxref.dtx} {latexrelease}% empty
+ \from{ltproperties.dtx}{latexrelease}%
\from{ltmiscen.dtx} {latexrelease}%
\from{ltmath.dtx} {latexrelease}%
\from{ltlists.dtx} {latexrelease}% empty
diff --git a/macros/latex-dev/base/latexrelease.pdf b/macros/latex-dev/base/latexrelease.pdf
index ec3e02593c..38f5ef20fb 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 b080247c6f..3d6f87b2f1 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.err b/macros/latex-dev/base/lb2.err
index d2ea742f82..74c0e222b6 100644
--- a/macros/latex-dev/base/lb2.err
+++ b/macros/latex-dev/base/lb2.err
@@ -1,4 +1,4 @@
-\newcommand\erratafiledate{2014-09-30}
+\newcommand\erratafiledate{2014/09/30}
\def\comando#1{\texttt{\string#1}}
diff --git a/macros/latex-dev/base/lb2.pdf b/macros/latex-dev/base/lb2.pdf
index c01ef84a40..4f1de0028e 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 da4b8da31b..d4c0361f9a 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.err b/macros/latex-dev/base/lgc2.err
index cb1a382348..c899388be9 100644
--- a/macros/latex-dev/base/lgc2.err
+++ b/macros/latex-dev/base/lgc2.err
@@ -1,4 +1,4 @@
-\newcommand\erratafiledate{2008-06-13}
+\newcommand\erratafiledate{2008/06/13}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% To produce a printed version of this errata file run this file through
diff --git a/macros/latex-dev/base/lgc2.pdf b/macros/latex-dev/base/lgc2.pdf
index e595b3c577..01e844d127 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 634e0cf419..6f35bb62a5 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/ltcmd.dtx b/macros/latex-dev/base/ltcmd.dtx
index d6322ff3ee..dcb85a1ae8 100644
--- a/macros/latex-dev/base/ltcmd.dtx
+++ b/macros/latex-dev/base/ltcmd.dtx
@@ -34,8 +34,8 @@
%%% From File: ltcmd.dtx
%
% \begin{macrocode}
-\def\ltcmdversion{v1.1e}
-\def\ltcmddate{2023-05-26}
+\def\ltcmdversion{v1.2a}
+\def\ltcmddate{2023-08-19}
% \end{macrocode}
%
%<*driver>
@@ -59,6 +59,8 @@
% \section{Creating document commands}
%
% \changes{v1.0a}{2020/11/20}{Initial version derived from \texttt{xparse.dtx}}
+% \changes{v1.2a}{2023/08/19}{Removed commands that should have remained
+% only in \texttt{xparse.dtx}}
%
% Document commands should be created using the tools provided by this module:
% \cs{NewDocumentCommand}, etc.\@, in almost all cases. This allows clean
@@ -4263,116 +4265,6 @@
% \end{macro}
% \end{macro}
%
-% \subsection{Access to the argument specification}
-%
-% \begin{macro}{\@@_get_arg_spec_error:N, \@@_get_arg_spec_error:n}
-% \begin{macro}{\@@_get_arg_spec_error_aux:n}
-% Provide an informative error when trying to get the argument
-% specification of a non-\pkg{xparse} command or environment.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_get_arg_spec_error:N #1
- {
- \bool_set_false:N \l_@@_environment_bool
- \tl_set:Nn \l_@@_fn_tl {#1}
- \@@_get_arg_spec_error_aux:n { \cs_if_exist:NTF #1 }
- }
-\cs_new_protected:Npn \@@_get_arg_spec_error:n #1
- {
- \bool_set_true:N \l_@@_environment_bool
- \str_set:Nx \l_@@_environment_str {#1}
- \@@_get_arg_spec_error_aux:n
- { \cs_if_exist:cTF { \l_@@_environment_str } }
- }
-\cs_new_protected:Npn \@@_get_arg_spec_error_aux:n #1
- {
- #1
- {
- \msg_error:nnx { cmd } { non-xparse }
- { \@@_environment_or_command: }
- }
- {
- \msg_error:nnx { cmd } { unknown }
- { \@@_environment_or_command: }
- }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@@_get_arg_spec:NTF}
-% If the command is not an \pkg{xparse} command, complain. If it is,
-% its second \enquote{item} is the argument specification.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_get_arg_spec:NTF #1#2#3
- {
- \__kernel_cmd_if_xparse:NTF #1
- {
- \tl_set:Nx \ArgumentSpecification { \tl_item:Nn #1 { 2 } }
- #2
- }
- {#3}
- }
-% \end{macrocode}
-% \end{macro}
-%
-% Rolling forward from 2020-10-01 is tricky because the entire |ltcmd|
-% module is new, but the user-level commands have the same name, so only
-% these will clash. To work around that, in |latexrelease| mode we will
-% (temporarily) disable \cs{__kernel_chk_if_free_cs:N} for this final
-% part of the code, then restore at the end.
-% \begin{macrocode}
-%<latexrelease>\cs_new_eq:NN \@@_chk_if_free_cs:N \__kernel_chk_if_free_cs:N
-%<latexrelease>\cs_gset_eq:NN \__kernel_chk_if_free_cs:N \use_none:n
-% \end{macrocode}
-%
-% \begin{variable}{\ArgumentSpecification}
-% \begin{macrocode}
-\tl_new:N \ArgumentSpecification
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{macro}{\@@_get_arg_spec:N}
-% \begin{macro}{\@@_get_arg_spec:n}
-% Recovering the argument specification is now trivial.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_get_arg_spec:N #1
- {
- \@@_get_arg_spec:NTF #1 { }
- { \@@_get_arg_spec_error:N #1 }
- }
-\cs_new_protected:Npn \@@_get_arg_spec:n #1
- {
- \exp_args:Nc \@@_get_arg_spec:NTF
- { environment~ \tl_to_str:n {#1} }
- { }
- { \@@_get_arg_spec_error:n {#1} }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@@_show_arg_spec:N}
-% \begin{macro}{\@@_show_arg_spec:n}
-% Showing the argument specification simply means finding it and then
-% calling the \cs{tl_show:N} function.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_show_arg_spec:N #1
- {
- \@@_get_arg_spec:NTF #1
- { \tl_show:N \ArgumentSpecification }
- { \@@_get_arg_spec_error:N #1 }
- }
-\cs_new_protected:Npn \@@_show_arg_spec:n #1
- {
- \exp_args:Nc \@@_get_arg_spec:NTF
- { environment~ \tl_to_str:n {#1} }
- { \tl_show:N \ArgumentSpecification }
- { \@@_get_arg_spec_error:n {#1} }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
% \subsection{Utilities}
%
% \begin{macro}{\@@_check_definable:nNT, \@@_check_definable_aux:nN}
@@ -4817,12 +4709,6 @@
LaTeX~did~not~find~this~argument~and~will~insert~a~default~value~
for~further~processing.
}
-\msg_new:nnnn { cmd } { non-xparse }
- { \str_uppercase:n #1~not~defined~using~xparse. }
- {
- You~have~asked~for~the~argument~specification~for~the~#1,~
- but~this~was~not~defined~using~xparse.
- }
\msg_new:nnnn { cmd } { arg-split }
{ Too~many~'#1'~separators~in~argument. }
{
@@ -4830,12 +4716,6 @@
at~each~occurrence~of~the~separator~'#1'~into~#2~parts.~
Too~many~separators~were~found.
}
-\msg_new:nnnn { cmd } { unknown }
- { Unknown~document~#1. }
- {
- You~have~asked~for~the~argument~specification~for~the~#1,~
- but~it~is~not~defined.
- }
\msg_new:nnnn { cmd } { verbatim-nl }
{ Verbatim-like~#1~ended~by~end~of~line. }
{
@@ -5153,31 +5033,6 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\GetDocumentCommandArgSpec}
-% \begin{macro}{\GetDocumentEnvironmentArgSpec}
-% \begin{macro}{\ShowDocumentCommandArgSpec}
-% \begin{macro}{\ShowDocumentEnvironmentArgSpec}
-% More simple mappings, with a check that the argument is a single
-% control sequence or active character.
-% \begin{macrocode}
-\cs_new_protected:Npn \GetDocumentCommandArgSpec #1
- {
- \@@_check_definable:nNT {#1} \GetDocumentCommandArgSpec
- { \@@_get_arg_spec:N #1 }
- }
-\cs_new_eq:NN \GetDocumentEnvironmentArgSpec \@@_get_arg_spec:n
-\cs_new_protected:Npn \ShowDocumentCommandArgSpec #1
- {
- \@@_check_definable:nNT {#1} \ShowDocumentCommandArgSpec
- { \@@_show_arg_spec:N #1 }
- }
-\cs_new_eq:NN \ShowDocumentEnvironmentArgSpec \@@_show_arg_spec:n
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
% Finally as promised, restore \cs{__kernel_chk_if_free_cs:N}:
% \begin{macrocode}
%<latexrelease>\cs_gset_eq:NN \__kernel_chk_if_free_cs:N \@@_chk_if_free_cs:N
diff --git a/macros/latex-dev/base/ltcmdhooks-code.pdf b/macros/latex-dev/base/ltcmdhooks-code.pdf
index b1cd499d3c..598e09076d 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 91b366eb9f..e00d1a517f 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 27907af679..6f885a2c6c 100644
--- a/macros/latex-dev/base/ltcmdhooks.dtx
+++ b/macros/latex-dev/base/ltcmdhooks.dtx
@@ -14,8 +14,8 @@
%
%%% From File: ltcmdhooks.dtx
%
-\def\ltcmdhooksversion{v1.0h}
-\def\ltcmdhooksdate{2023/05/21}
+\def\ltcmdhooksversion{v1.0i}
+\def\ltcmdhooksdate{2023/06/16}
%
%
%
@@ -1641,10 +1641,10 @@
% \subsection{Messages}
%
% \begin{macrocode}
-%<latexrelease>\IncludeInRelease{2021/11/15}{wrong-cmd-hook}%
+%<latexrelease>\IncludeInRelease{2023/06/01}{wrong-cmd-hook}%
%<latexrelease> {Standardise~generic~hook~names}
%<latexrelease>\EndIncludeInRelease
-%<latexrelease>\IncludeInRelease{2021/11/15}{wrong-cmd-hook}%
+%<latexrelease>\IncludeInRelease{2021/06/01}{wrong-cmd-hook}%
%<latexrelease> {Standardise~generic~hook~names}
%<latexrelease>\msg_new:nnnn { hooks } { wrong-cmd-hook }
%<latexrelease> {
diff --git a/macros/latex-dev/base/ltfilehook-code.pdf b/macros/latex-dev/base/ltfilehook-code.pdf
index f7422c2a21..423d9c8c60 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 e30bf34f5d..607cc91ca1 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/ltfilehook.dtx b/macros/latex-dev/base/ltfilehook.dtx
index e10a5416e5..ae183bfeb4 100644
--- a/macros/latex-dev/base/ltfilehook.dtx
+++ b/macros/latex-dev/base/ltfilehook.dtx
@@ -32,7 +32,7 @@
%
% \begin{macrocode}
\providecommand\ltfilehookversion{v1.0o}
-\providecommand\ltfilehookdate{2023/04/02}
+\providecommand\ltfilehookdate{2023/07/10}
% \end{macrocode}
%
%<*driver>
@@ -1043,7 +1043,6 @@
%
% \begin{macrocode}
%<@@=>
-\ExplSyntaxOff
% \end{macrocode}
%
% \subsection{Selecting a file (\cs{set@curr@file})}
diff --git a/macros/latex-dev/base/ltfiles.dtx b/macros/latex-dev/base/ltfiles.dtx
index 3bac7ea0b2..f079c2cf5b 100644
--- a/macros/latex-dev/base/ltfiles.dtx
+++ b/macros/latex-dev/base/ltfiles.dtx
@@ -32,7 +32,7 @@
%<*driver>
% \fi
\ProvidesFile{ltfiles.dtx}
- [2023/05/17 v1.2t LaTeX Kernel (File Handling)]
+ [2023/06/17 v1.2u LaTeX Kernel (File Handling)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltfiles.dtx}
@@ -1203,8 +1203,9 @@
% \changes{v1.2d}{2019/10/26}{quote on openin}
% \changes{v1.2k}{2021/03/12}{Allow unbalanced conditionals (gh/530)}
% \changes{v1.2t}{2023/05/15}{Use \pkg{expl3} file existence test}
-% \begin{macro}{\IfFileExists@}
+% \begin{macro}{\IfFileExists@@}
% \changes{v1.2t}{2023/05/15}{Macro added}
+% \changes{v1.2u}{2023/06/16}{Support piped input}
% Argument |#1| is |\@curr@file| so catcode 12 string with no quotes.
%
% The original definition picked up arguments |#2| and |#3| in a
@@ -1212,7 +1213,7 @@
% implementation would have been not to pick up the arguments at
% all but instead use the usual \cs{@firstoftwo} and
% \cs{secondoftwo}. However, that changes how |#| is interpreted
-% and so we can't do that nowaways without invalidating a lot of
+% and so we can't do that nowadays without invalidating a lot of
% code. Therefore the somewhat curious construction near the end.
%
% Earlier versions used |\openin| here, but this led to two
@@ -1224,7 +1225,7 @@
% \begin{macrocode}
%</2ekernel>
%<*2ekernel|latexrelease>
-%<latexrelease>\IncludeInRelease{2023/05/01}%
+%<latexrelease>\IncludeInRelease{2023/06/01}%
%<latexrelease> {\IfFileExists@}{IfFileExists}
\long\def \IfFileExists@#1#2#3{%
\edef\@filef@und{\IfFileExists@@{#1}}%
@@ -1251,8 +1252,23 @@
\expandafter\def\expandafter\reserved@a
\expandafter{\reserved@a{#2}{#3}}%
\reserved@a}
+% \end{macrocode}
+% Pipes are not really files, but at the document level they are supported.
+% To quickly trim of any leading spaces, we use a blank test and \cs{use:n}
+% rather than \cs{tl_trim_spaces:n} for speed as we don't care about the end
+% of the input.
+% \begin{macrocode}
\ExplSyntaxOn
-\cs_new_eq:NN \IfFileExists@@ \file_full_name:n
+\cs_new:Npn \IfFileExists@@ #1
+ {
+ \tl_if_blank:nF {#1}
+ {
+ \tl_if_head_eq_charcode:oNTF { \use:n #1 } |
+ {#1}
+ { \file_full_name:n {#1} }
+ }
+ }
+\cs_generate_variant:Nn \tl_if_head_eq_charcode:nNTF { o }
\ExplSyntaxOff
%</2ekernel|latexrelease>
%<latexrelease>\EndIncludeInRelease
diff --git a/macros/latex-dev/base/lthooks-code.pdf b/macros/latex-dev/base/lthooks-code.pdf
index 60bfdc9c57..452cc324fd 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 fe0c9da6b8..379f81449c 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 3807d25c44..e43fa4ef35 100644
--- a/macros/latex-dev/base/lthooks.dtx
+++ b/macros/latex-dev/base/lthooks.dtx
@@ -31,8 +31,8 @@
%%% From File: lthooks.dtx
%
% \begin{macrocode}
-\def\lthooksversion{v1.1e}
-\def\lthooksdate{2023/06/06}
+\def\lthooksversion{v1.1f}
+\def\lthooksdate{2023/08/11}
% \end{macrocode}
%
%<*driver>
@@ -298,10 +298,6 @@
% consumed and any further attempt to add to it will result in
% executing the code to be added immediately.
%
-% The \meta{hook} \emph{cannot} be specified using the dot-syntax.
-% A leading |.| is treated literally. See
-% section~\ref{sec:default-label} for details.
-%
% Using \cs{UseOneTimeHook} several times with the same
% \Arg{hook} means that it only executes the first time it is used.
% For example, if it is used in a command that can be called several times
@@ -311,6 +307,11 @@
% Mixing \cs{UseHook} and \cs{UseOneTimeHook} for the same
% \Arg{hook} should be avoided, but if this is done then neither will execute
% after the first \cs{UseOneTimeHook}.
+%
+% The \meta{hook} \emph{cannot} be specified using the dot-syntax.
+% A leading |.| is treated literally. See
+% section~\ref{sec:default-label} for details.
+%
% \end{function}
%
% \begin{function}{\UseOneTimeHookWithArguments}
@@ -327,6 +328,11 @@
% longer possible to use \cs{AddToHookWithArguments} or similar with
% that hook. \cs{AddToHook} continues to work as normal.
% Section~\ref{sec:hook-args} explains hooks with arguments.
+%
+% The \meta{hook} \emph{cannot} be specified using the dot-syntax.
+% A leading |.| is treated literally. See
+% section~\ref{sec:default-label} for details.
+%
% \end{function}
%
%
@@ -607,7 +613,10 @@
% \meta{hook} arguments, both in the \LaTeXe{} interface, and the \LaTeX3
% interface described in section~\ref{sec:l3hook-interface}.
%
-% Note, however, that the replacement of |.| by the \meta{default label}
+% Note,\marginpar{\raggedleft\rightskip5pt\itshape \textbf{Important:}\break The dot-syntax
+% is \textbf{not} available with
+% \cs{UseHook} and some other commands that are typically used within code!}
+% however, that the replacement of |.| by the \meta{default label}
% takes place when the hook command is executed, so actions that are
% somehow executed after the package ends will have the wrong
% \meta{default label} if the dot-syntax is used. For that reason,
@@ -1997,8 +2006,9 @@
%
% \item[\hook{begindocument}]
%
-% This hook is added to when using \cs{AtBeginDocument} and it is
-% executed after the \texttt{.aux} file as be read in and most
+% This hook is added to by using \cs{AddToHook}\texttt{\{begindocument\}}
+% or by using \cs{AtBeginDocument} and it is
+% executed after the \texttt{.aux} file has been read and most
% initialization are done, so they can be altered and inspected by
% the hook code. It is followed by a small number of further
% initializations that shouldn't be altered and are therefore
@@ -3534,7 +3544,7 @@
% \changes{v1.1a}{2023/04/06}
% {Add \cs{hook_gput_code_with_args:nnn} (hook-args).}
% \begin{macrocode}
-%<latexrelease>\IncludeInRelease{2023/06/01}{\hook_gput_code_with_args:nnn}
+%<latexrelease>\IncludeInRelease{2023/06/01}{\hook_gput_code:nnn}
%<latexrelease> {Hooks~with~args}
\cs_new_protected:Npn \hook_gput_code:nnn #1 #2 #3
{
@@ -4386,7 +4396,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-%<latexrelease>\IncludeInRelease{2023/06/01}{\hook_gremove_code:nn}
+%<latexrelease>\IncludeInRelease{2020/10/01}{\hook_gremove_code:nn}
%<latexrelease> {Hooks~with~args}
%<latexrelease>\cs_new_protected:Npn \@@_gremove_code:nn #1 #2
%<latexrelease> {
@@ -5287,6 +5297,10 @@
%<latexrelease> \cs_gset_eq:NN \hook_use:n \@@_use_initialized:n
%<latexrelease> \cs_gset_eq:NN \@@_preamble_hook:n \use_none:n
%<latexrelease> }
+%<@@=>
+%<latexrelease>\cs_gset_eq:NN \@expl@@@initialize@all@@
+%<latexrelease> \__hook_initialize_all:
+%<@@=hook>
%<latexrelease>\EndIncludeInRelease
% \end{macrocode}
% \end{macro}
@@ -7365,7 +7379,7 @@
\NewDocumentCommand \NewMirroredHookPairWithArguments { mmm }
{ \hook_new_pair_with_args:nnn {#1} {#2} {#3} }
%<latexrelease>\EndIncludeInRelease
-%<latexrelease>\IncludeInRelease{2023/06/01}{\NewHookWithArguments}
+%<latexrelease>\IncludeInRelease{2020/10/01}{\NewHookWithArguments}
%<latexrelease> {Hooks~with~args}
%<latexrelease>\cs_new_protected:Npn \NewHookWithArguments #1 #2 { }
%<latexrelease>\cs_new_protected:Npn \NewReversedHookWithArguments #1 #2 { }
diff --git a/macros/latex-dev/base/ltluatex.dtx b/macros/latex-dev/base/ltluatex.dtx
index 135cb63009..6d274ed5c3 100644
--- a/macros/latex-dev/base/ltluatex.dtx
+++ b/macros/latex-dev/base/ltluatex.dtx
@@ -28,7 +28,7 @@
\ProvidesFile{ltluatex.dtx}
%</driver>
%<*tex>
-[2023/01/19 v1.2b
+[2023/08/03 v1.2c
%</tex>
%<plain> LuaTeX support for plain TeX (core)
%<*tex>
@@ -1284,6 +1284,7 @@ luatexbase.new_chunkname = new_chunkname
%
% \begin{macro}{new_luafunction}
% \changes{v1.1i}{2018/10/21}{Function added}
+% \changes{v1.2c}{2023/07/02}{Ensure existing table entries not overwritten gh/1100}
% Much the same as for attribute allocation in Lua.
% The optional \meta{name} argument is used in the log if given.
% \begin{macrocode}
@@ -1291,7 +1292,11 @@ local luafunction_count_name =
luafunction_count_name or "e@alloc@luafunction@count"
local function new_luafunction(name)
tex_setcount("global", luafunction_count_name,
- tex_count[luafunction_count_name] + 1)
+ math.max(
+ #(lua.get_functions_table()),
+ tex_count[luafunction_count_name])
+ + 1)
+ lua.get_functions_table()[tex_count[luafunction_count_name]] = false
if tex_count[luafunction_count_name] > 65534 then
luatexbase_error("No room for a new luafunction register")
end
@@ -2147,12 +2152,13 @@ luatexbase.uninstall = uninstall
% \begin{macro}{mlist_to_hlist}
% \changes{v1.1l}{2020/02/02}{|pre/post_mlist_to_hlist| added}
% \changes{v1.1y}{2022/08/13}{Use shared\_callback system for pre/post/mlist_to_hlist}
+% \changes{v1.2c}{2023/08/03}{Fix callback type of post_mlist_to_hlist_callback}
% To emulate these callbacks, the ``real'' |mlist_to_hlist| is replaced by a
% wrapper calling the wrappers before and after.
% \begin{macrocode}
create_callback('pre_mlist_to_hlist_filter', 'list')
create_callback('mlist_to_hlist', 'exclusive', node.mlist_to_hlist)
-create_callback('post_mlist_to_hlist_filter', 'list')
+create_callback('post_mlist_to_hlist_filter', 'reverselist')
function shared_callbacks.mlist_to_hlist.handler(head, display_type, need_penalties)
local current = call_callback("pre_mlist_to_hlist_filter", head, display_type, need_penalties)
if current == false then
diff --git a/macros/latex-dev/base/ltluatex.pdf b/macros/latex-dev/base/ltluatex.pdf
index 7c5864ac80..fa5dd9a06a 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 bc9395f38d..7f53320733 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 feae65cce7..94b2a0a762 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/ltmiscen.dtx b/macros/latex-dev/base/ltmiscen.dtx
index 801d1e6862..74a9685f1f 100644
--- a/macros/latex-dev/base/ltmiscen.dtx
+++ b/macros/latex-dev/base/ltmiscen.dtx
@@ -32,7 +32,7 @@
%<*driver>
% \fi
\ProvidesFile{ltmiscen.dtx}
- [2022/11/06 v1.2a LaTeX Kernel (Misc. Environments)]
+ [2023/09/13 v1.2c LaTeX Kernel (Misc. Environments)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltmiscen.dtx}
@@ -194,8 +194,8 @@
% \begin{macrocode}
%</2ekernel>
%<*2ekernel|latexrelease>
-%<latexrelease>\IncludeInRelease{2020/10/01}%
-%<latexrelease> {\enddocument}{Use Hooks}%
+%<latexrelease>\IncludeInRelease{2023/11/01}%
+%<latexrelease> {\enddocument}{check property labels}%
\def\enddocument{%
% \end{macrocode}
% The |\end{document}| hook is executed first. If necessary it can
@@ -230,6 +230,10 @@
\let\@setckpt\@gobbletwo
\let\@newl@bel\@testdef
% \end{macrocode}
+% \changes{v1.2b}{2023/09/06}{Test changes of values in \cs{new@label@record}}
+% \begin{macrocode}
+ \let\new@label@record\@kernel@new@label@record@testdef
+% \end{macrocode}
% \changes{v1.0z}{1995/07/13}{Shorten redefinition of \cs{bibcite} and
% \cs{newlabel}}
% The previous line is equiv to setting
@@ -357,6 +361,67 @@
% \begin{macrocode}
%</2ekernel|latexrelease>
%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\enddocument}{Use Hooks}%
+%<latexrelease>\def\enddocument{%
+%<latexrelease> \@kernel@before@enddocument
+%<latexrelease> \UseOneTimeHook{enddocument}%
+%<latexrelease> \@kernel@after@enddocument
+%<latexrelease> \@checkend{document}%
+%<latexrelease> \clearpage
+%<latexrelease> \UseOneTimeHook{enddocument/afterlastpage}%
+%<latexrelease> \@kernel@after@enddocument@afterlastpage
+%<latexrelease> \begingroup
+%<latexrelease> \if@filesw
+%<latexrelease> \immediate\closeout\@mainaux
+%<latexrelease> \let\@setckpt\@gobbletwo
+%<latexrelease> \let\@newl@bel\@testdef
+%<latexrelease> \@tempswafalse
+%<latexrelease> \makeatletter \@@input\jobname.aux
+%<latexrelease> \fi
+%<latexrelease> \UseOneTimeHook{enddocument/afteraux}%
+%<latexrelease> \UseOneTimeHook{enddocument/info}%
+%<latexrelease> \endgroup
+%<latexrelease> \UseOneTimeHook{enddocument/end}%
+%<latexrelease> \deadcycles\z@\@@end}
+%<latexrelease>\NewHook{enddocument}
+%<latexrelease>\NewHook{enddocument/afterlastpage}
+%<latexrelease>\NewHook{enddocument/afteraux}
+%<latexrelease>\NewHook{enddocument/info}
+%<latexrelease>\NewHook{enddocument/end}
+%<latexrelease>\AddToHook{enddocument/info}[kernel/filelist]{\@dofilelist}
+%<latexrelease>\AddToHook{enddocument/info}[kernel/warnings]{\@enddocument@kernel@warnings}
+%<latexrelease>\AddToHook{enddocument/info}[kernel/release]{%
+%<latexrelease> \let\show@release@info\wlog
+%<latexrelease> \show@release@info{ ***********}%
+%<latexrelease> \the\LaTeXReleaseInfo
+%<latexrelease> \show@release@info{ ***********}}
+%<latexrelease>
+%<latexrelease>\DeclareHookRule{enddocument/info}{kernel/release}{before}{kernel/filelist}
+%<latexrelease>\DeclareHookRule{enddocument/info}{kernel/filelist}{before}{kernel/warnings}
+%<latexrelease>\def\@enddocument@kernel@warnings{%
+%<latexrelease> \ifdim \font@submax >\fontsubfuzz\relax
+%<latexrelease> \@font@warning{Size substitutions with differences\MessageBreak
+%<latexrelease> up to \font@submax\space have occurred.\@gobbletwo}%
+%<latexrelease> \fi
+%<latexrelease> \@defaultsubs
+%<latexrelease> \@refundefined
+%<latexrelease> \if@filesw
+%<latexrelease> \ifx \@multiplelabels \relax
+%<latexrelease> \if@tempswa
+%<latexrelease> \@latex@warning@no@line{Label(s) may have changed.
+%<latexrelease> Rerun to get cross-references right}%
+%<latexrelease> \fi
+%<latexrelease> \else
+%<latexrelease> \@multiplelabels
+%<latexrelease> \fi
+%<latexrelease> \ifx \@extra@page@added \relax
+%<latexrelease> \@latex@warning@no@line{Temporary extra page added at the end.
+%<latexrelease> Rerun to get it removed}%
+%<latexrelease> \fi
+%<latexrelease> \fi
+%<latexrelease>}
+%<latexrelease>\EndIncludeInRelease
%<latexrelease>\IncludeInRelease{0000/00/00}%
%<latexrelease> {\enddocument}{Use Hooks}%
%<latexrelease>
@@ -496,8 +561,7 @@
\protected\def\protected@file@percent{}
% \end{macrocode}
% \end{macro}
-
-
+%
% \begin{macro}{\add@percent@to@temptokena}
% Helper function which is used to inspect a sequence of tokens
% (the second argument of \cs{@writefile} and it the last token is
@@ -1189,11 +1253,33 @@
% print as the \TeX{}book's space character instead of as blank spaces.
%
% \begin{macro}{\@vobeyspaces}
+% \changes{v1.2b}{2023/06/15}{Support tabs}
+% \begin{macro}{\@vobeytabs}
+% \changes{v1.2b}{2023/06/14}{Macro added}
+% \changes{v1.2c}{2023/09/01}{Provide global definition for active tab}
% \begin{macrocode}
+%</2ekernel>
+%<latexrelease>\IncludeInRelease{2023/11/01}%
+%<latexrelease> {\@vobeytabs}{Obeyed tabs}%
+%<*2ekernel|latexrelease>
{\catcode`\ =\active%
-\gdef\@vobeyspaces{\catcode`\ \active\let \@xobeysp}}
+\gdef\@vobeyspaces{\catcode`\ \active\let \@xobeysp\@vobeytabs}}
+{\catcode`\^^I=\active
+\gdef\@vobeytabs{\catcode`\^^I\active\let^^I\@xobeytab}%
+\global\let^^I=\space
+}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\@vobeytabs}{Obeyed tabs}%
+%<latexrelease>{\catcode`\ =\active%
+%<latexrelease>\gdef\@vobeyspaces{\catcode`\ \active\let \@xobeysp}}
+%<latexrelease>\let\@vobeytabs\@undefined
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
% \end{macro}
+% \end{macro}
%
% \begin{macro}{\@xobeysp}
% \changes{v1.0z}{1995/07/13}{Use \cs{nobreak}}
@@ -1368,44 +1454,8 @@
% \end{macro}
%
%
-
-% \begin{macro}{\@setupverbvisiblespace}
-%
-% In pdf\TeX{} a catcode 12 space will produce the character in
-% slot 32 which is assumed to be a visible space character (in a
-% typewriter font in OT1 or T1 encoding). In Xe\TeX{} or Lua\TeX{} a
-% font in TU encoding is normally used and that has a real space in
-% this slot. So what we do in this case is this: we check the
-% definition of
-% |\verbvisiblespace| and if it is |\asciispace| we assume that the
-% char32 can be used (e.g., in pdf\TeX{}). We then redefine
-% |\@xobeysp| so that after running |\@vobeyspaces| we get
-% characters from slot 32 for each active space.
-%
-% \changes{v1.1o}{2018/10/11}
-% {Provide visible space in \cs{verb*} also for XeTeX and LuaTeX (github/69)}
-% \begin{macrocode}
-\def\@setupverbvisiblespace{%
- \ifx\verbvisiblespace\asciispace
- \let\@xobeysp\asciispace
- \else
-% \end{macrocode} Otherwise we measure the width of a character in
-% the mon-spaced current font and place a
-% |\verbvisiblespace| into a box of the right width which we are then
-% using as the character for a space. By default this will be the space
-% character from OT1 cmtt but by changing
-% |\verbvisiblespace| one could use, for example, the |\textvisiblespace|
-% of the current typewriter font.
-% \begin{macrocode}
- \setbox\z@\hbox{x}%
- \setbox\@verbvisiblespacebox\hbox to\wd\z@{\hss\verbvisiblespace\hss}%
- \def\@xobeysp{\leavevmode\copy\@verbvisiblespacebox}%
- \fi
-}
-% \end{macrocode}
-% \end{macro}
+% ^^A \@setupverbvisiblespace was here
%
-
% \begin{macro}{\@verbvisiblespacebox}
% The box to hold the visible space character if it isn't in slot
% 32 in the current typewriter font.
@@ -1426,6 +1476,8 @@
% check if space is already active---it shouldn't be.
% \changes{v1.1o}{2018/10/11}
% {Provide visible space in \cs{verb*} also for XeTeX and LuaTeX (github/69)}
+% \changes{v1.2b}{2023/06/14}
+% {Support visible tabs in \cs{verb*}}
% \begin{macrocode}
\@namedef{verbatim*}{\@verbatim
\@setupverbvisiblespace
@@ -1434,8 +1486,6 @@
% \end{macrocode}
% \end{environment}
%
-%
-%
% \begin{macrocode}
%</2ekernel|latexrelease>
%<latexrelease>\EndIncludeInRelease
@@ -1452,7 +1502,88 @@
%<*2ekernel>
% \end{macrocode}
%
+% \begin{macro}{\@setupverbvisiblespace}
%
+% In pdf\TeX{} a catcode 12 space will produce the character in
+% slot 32 which is assumed to be a visible space character (in a
+% typewriter font in OT1 or T1 encoding). In Xe\TeX{} or Lua\TeX{} a
+% font in TU encoding is normally used and that has a real space in
+% this slot. So what we do in this case is this: we check the
+% definition of
+% |\verbvisiblespace| and if it is |\asciispace| we assume that the
+% char32 can be used (e.g., in pdf\TeX{}). We then redefine
+% |\@xobeysp| so that after running |\@vobeyspaces| we get
+% characters from slot 32 for each active space.
+%
+% \changes{v1.1o}{2018/10/11}
+% {Provide visible space in \cs{verb*} also for XeTeX and LuaTeX (github/69)}
+% \changes{v1.2b}{2023/06/15}
+% {Support visible tabs}
+% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2023/11/01}%
+%<latexrelease> {\@setupverbvisiblespace}{Setup visible tab for \verb}%
+\def\@setupverbvisiblespace{%
+ \ifx\verbvisiblespace\asciispace
+ \let\@xobeysp\asciispace
+ \else
+% \end{macrocode}
+% Otherwise we measure the width of a character in
+% the mono-spaced current font and place a
+% |\verbvisiblespace| into a box of the right width which we are then
+% using as the character for a space. By default this will be the space
+% character from OT1 cmtt but by changing
+% |\verbvisiblespace| one could use, for example, the |\textvisiblespace|
+% of the current typewriter font.
+% \begin{macrocode}
+ \setbox\z@\hbox{x}%
+ \setbox\@verbvisiblespacebox\hbox to\wd\z@{\hss\verbvisiblespace\hss}%
+ \def\@xobeysp{\leavevmode\copy\@verbvisiblespacebox}%
+ \fi
+ \@setupverbvisibletab
+}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{2018/12/01}%
+%<latexrelease> {\@setupverbvisiblespace}{Setup visible space for \verb}%
+%<latexrelease>\def\@setupverbvisiblespace{%
+%<latexrelease> \ifx\verbvisiblespace\asciispace
+%<latexrelease> \let\@xobeysp\asciispace
+%<latexrelease> \else
+%<latexrelease> \setbox\z@\hbox{x}%
+%<latexrelease> \setbox\@verbvisiblespacebox\hbox to\wd\z@{\hss\verbvisiblespace\hss}%
+%<latexrelease> \def\@xobeysp{\leavevmode\copy\@verbvisiblespacebox}%
+%<latexrelease> \fi
+%<latexrelease>}
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\@setupverbvisiblespace}{Setup visible space for \verb}%
+%<latexrelease>\let\@setupverbvisiblespace\@undefined
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@setupverbvisibletab}
+% \changes{v1.2q}{2023/06/15}
+% {Provide visible tab in \cs{verb*}}
+% A redirection: just a simple wrapper.
+% \begin{macrocode}
+%</2ekernel>
+%<latexrelease>\IncludeInRelease{2023/11/01}%
+%<latexrelease> {\@setupverbvisibletab}{Setup visible tab for \verb}%
+%<*2ekernel|latexrelease>
+\def\@setupverbvisibletab{\let\@xobeytab\@xobeysp}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\@setupverbvisibletab}{Setup visible tab for \verb}%
+%<latexrelease>\let\@setupverbvisibletab\@undefined
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
+% \end{macro}
%
% \begin{macro}{\@sverb}
% \begin{macro}{\@@sverb}
@@ -1464,8 +1595,8 @@
% \begin{macrocode}
%</2ekernel>
%<*2ekernel|latexrelease>
-%<latexrelease>\IncludeInRelease{2020/10/01}%
-%<latexrelease> {\@sverb}{Drop spaces before \verb delimiter}%
+%<latexrelease>\IncludeInRelease{2023/11/01}%
+%<latexrelease> {\@sverb}{Support visible tabs}%
% \end{macrocode}
%
% If the users types \verb=\verb !~! foo= then surprisingly we would
@@ -1496,8 +1627,13 @@
% it the definition for the active space character.
% \changes{v1.1o}{2018/10/11}
% {Provide visible space in \cs{verb*} also for XeTeX and LuaTeX (github/69)}
+% \changes{v1.2b}{2023/06/15}
+% {Support visible tabs}
% \begin{macrocode}
- \ifnum\catcode`\ =\active
+ \ifnum0%
+ \ifnum\catcode`\ =\active\else 1\fi
+ \ifnum\catcode`\^^I=\active\else 1\fi
+ =0 %
\else \@setupverbvisiblespace \@vobeyspaces \fi
}
% \end{macrocode}
@@ -1505,6 +1641,19 @@
% \begin{macrocode}
%</2ekernel|latexrelease>
%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\@sverb}{Drop spaces before \verb delimiter}%
+%<latexrelease>\def\@@sverb#1{%
+%<latexrelease> \catcode`#1\active
+%<latexrelease> \lccode`\~`#1%
+%<latexrelease> \gdef\verb@balance@group{\verb@egroup
+%<latexrelease> \@latex@error{\noexpand\verb illegal in argument}\@ehc}%
+%<latexrelease> \aftergroup\verb@balance@group
+%<latexrelease> \lowercase{\let~\verb@egroup}%
+%<latexrelease> \ifnum\catcode`\ =\active
+%<latexrelease> \else \@setupverbvisiblespace \@vobeyspaces \fi
+%<latexrelease>}
+%<latexrelease>\EndIncludeInRelease
%<latexrelease>\IncludeInRelease{2018/12/01}%
%<latexrelease> {\@sverb}{Setup visible space for \verb}%
%<latexrelease>
diff --git a/macros/latex-dev/base/ltnews.pdf b/macros/latex-dev/base/ltnews.pdf
index 057069d15c..a482c44754 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 d239fc274f..0cb6ad55cc 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}{37}
+\providecommand*{\lastissue}{38}
\InputIfFileExists{ltnews-lastissue.cfg}{}{}
diff --git a/macros/latex-dev/base/ltnews01.pdf b/macros/latex-dev/base/ltnews01.pdf
index 163b63d1f8..45080cd056 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 22d5f44f13..3c92dcbb13 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 907142faea..9c76b172f2 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 8ec38ae7aa..5fc5b7e2f2 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 a7b467cce3..82f6e2e66b 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 6d3af11e7b..8686878390 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 fde4db801e..dbde03e3c6 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 9b5d5b5491..6de4f5dcc2 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 6b73bd238d..703e4fcbc1 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 a4e1070c63..92cf03c100 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 8655dd1ebb..7fc53570a7 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 adaa3a8030..7bb2af0d90 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 5386e0271e..238024988f 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 2358596a46..ca1bde861a 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 a733dd4666..e93edf9da6 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 0d85052702..58a8ae986d 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 b7a68faf54..48dcad813d 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 10dff17af7..3bd5213f40 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 d382282afc..f61eafeabe 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 a8f609ad22..fd2f0c7f6c 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 c49a3e744f..3caee8b8aa 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 dc6307cae7..463eef696d 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 a29989f019..fb51fd8738 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 e537c5858e..e8ef825448 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 1b3a3bf336..a7171c631a 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 50882f8175..6de2aba701 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 2a7f4dada7..2426592152 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 6c539c3d2b..3b505c36e5 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 1af62187fd..b9bda4e3ad 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 77b50dc802..6197b58162 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 aac568ca14..1de3b0fd5b 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 2d2fbac00a..e18c5d44fd 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 48e19ae5f2..1190e8ed79 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 f44a59c817..eec3c3f35b 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 2163da5a3c..c03ef0306b 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 ae19fc9f58..5e16afdce0 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 c8796695da..02b03b00a0 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
new file mode 100644
index 0000000000..6dfed26068
--- /dev/null
+++ b/macros/latex-dev/base/ltnews38.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews38.tex b/macros/latex-dev/base/ltnews38.tex
new file mode 100644
index 0000000000..38745b9dbf
--- /dev/null
+++ b/macros/latex-dev/base/ltnews38.tex
@@ -0,0 +1,257 @@
+% \iffalse meta-comment
+%
+% Copyright 2021-2023
+% 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: ltnews38.tex
+%
+% This is issue 38 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 parameters parameter}
+
+\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{} % 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
+
+
+\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
+
+\let\finalvspace\vspace % for document layout fixes
+
+% Undo ltnews's \verbatim@font with active < and >
+\makeatletter
+\def\verbatim@font{%
+ \normalsize\ttfamily}
+\makeatletter
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\providecommand\tubcommand[1]{}
+\tubcommand{\input{tubltmac}}
+
+\publicationmonth{November}
+\publicationyear{2023 --- DRAFT version for upcoming release}
+
+\publicationissue{38}
+
+\begin{document}
+
+\tubcommand{\addtolength\textheight{4.2pc}} % only for TUB
+
+\maketitle
+{\hyphenpenalty=10000 \exhyphenpenalty=10000 \spaceskip=3.33pt \hbadness=10000
+\tableofcontents}
+
+\setlength\rightskip{0pt plus 3em}
+
+\medskip
+
+\section{Introduction}
+
+
+\section{Sockets and plugs}
+
+\emph{write}
+
+For documentation see \texttt{texdoc ltsockets-doc} for now.
+
+\section{Extended cross-referencing of document properties}
+
+Traditionally \LaTeX{} allowed with \cs{label} to record two \enquote{local}
+properties of the document: the representation of the current page number and
+of the current counter. Their values could then be referenced with the
+(non-expandable) commands \cs{ref} and \cs{pageref} in arbitrary places of a
+document. With the summer 2023 release the \cs{label} was enhanced to record
+also if set by packages like \pkg{nameref} or \pkg{hyperref} the title and
+the name of the link target.
+
+Over the years packages extended the label-ref system in various ways.
+Examples are for example the \pkg{refcount} package to reference the values
+expandably, the \pkg{smartref} package, which allows to store more counter
+values and so to reference the current chapter together with the current
+equation, the \pkg{cleveref} package, which stores in a second internal label
+beside other the name of the counter, the \pkg{hyperref} package whose
+\cs{autoref} command tries to retrieve the name of the counter from the name
+of the link target, the \pkg{tikzmarks} which records absolute positions on
+the page, and the \pkg{zref} package which implements a general method to
+record and reference properties.
+
+Starting with this release the \LaTeX{} kernel contains now its own
+extension. It is loosely based on \pkg{zref}. It allows to declare new
+properties, to record arbitrary combinations of properties. The values are
+retrieved expandably.
+
+As an example to setup a new property which records the current chapter
+number the following declaration could be used:
+\begin{verbatim}
+\NewProperty{chapter}{now}{?}{\thechapter}
+\end{verbatim}
+The second argument means that the property is recorded immediately
+(\enquote{now}) and not at shipout. The third argument sets a default if a
+label is unknown. It is then possible to record a list of properties with
+\cs{RecordProperties}:
+\begin{verbatim}
+\RecordProperties{mylabel}{chapter,page,currentlabel}
+\end{verbatim}
+To reference the value the \cs{RefProperty} command is provided which takes
+two arguments, the label and the property:
+\begin{verbatim}
+\RefProperty{mylabel}{chapter}
+\end{verbatim}
+
+The new module predeclares a set of generally useful properties:
+\texttt{currentlabel} (the standard counter representation), \texttt{page}
+(the page representation), \texttt{title} (the title if set e.g.~by
+\pkg{nameref}), \texttt{target} (the name of the link target if set e.g.~by
+\pkg{hyperref}), \texttt{pagenum} (the page as an arabic number),
+\texttt{abspage} (the absolute page number), \texttt{counter} (the name of
+the current counter), \texttt{xpos} and \texttt{ypos} the position on the
+page as set by a previous \cs{pdfsavepos}.
+
+The module provides both \LaTeXe{} camel case commands and expl3 commands.
+
+For documentation see \texttt{texdoc ltproperties-doc}.
+
+\section{New or improved commands}
+
+%
+\githubissue{xxx}
+
+\section{\emph{Removed} commands}
+
+It is very rare that commands are removed from the \LaTeX{} kernel. However, in
+this release we have elected to remove \cs{GetDocumentCommandArgSpec},
+\cs{GetDocumentEnvironmentArgSpec}, \cs{ShowDocumentCommandArgSpec} and
+\cs{ShowDocumentEnvironmentArgSpec} from the kernel. These commands have been
+moved back to the \enquote{stub} \pkg{xparse} provided in \pkg{l3packages}. The
+reason for this change is that the commands were essentially part of debugging
+early forms of the kernel code, and expose implementation detail in a way that
+was not helpful.
+
+\section{Code improvements}
+
+\subsection{Support for tabs in \cs{verb*} and \texttt{verbatim*}}
+
+\LaTeX{} converts a single tab to a single space, which is then treated like a
+\enquote{real} space in typesetting. The same has been true to date inside
+\cs{verb}, but was done in a way that meant that they remained as normal spaces
+even in \cs{verb*}, etc. We have now adjusted the code so that tabs are
+retained within the argument to \cs{verb} and \cs{verb*}, and the
+\texttt{verbatim} and \texttt{verbatim*} environments independently from
+spaces, and are set up to print in the same way spaces do. This means that they
+now generate visible spaces inside \cs{verb*} and \texttt{verbatim*}, and their
+behavior can be adjusted if required to be different from that of spaces.
+%
+\githubissue{1085}
+
+\section{Bug fixes}
+
+\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}
+
+
+%\medskip
+
+\begin{thebibliography}{9}
+
+\fontsize{9.3}{11.3}\selectfont
+
+\end{thebibliography}
+
+\end{document}
diff --git a/macros/latex-dev/base/ltpara-code.pdf b/macros/latex-dev/base/ltpara-code.pdf
index 2a02548738..6836c91ff6 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 1aa8f1fff8..f29cf22b46 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
new file mode 100644
index 0000000000..8176e3fdde
--- /dev/null
+++ b/macros/latex-dev/base/ltproperties-code.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltproperties-code.tex b/macros/latex-dev/base/ltproperties-code.tex
new file mode 100644
index 0000000000..486cefa7b9
--- /dev/null
+++ b/macros/latex-dev/base/ltproperties-code.tex
@@ -0,0 +1,5 @@
+% This will typeset documentation + code
+%
+
+\AtBeginDocument{\AlsoImplementation}
+\input{ltproperties.dtx}
diff --git a/macros/latex-dev/base/ltproperties-doc.pdf b/macros/latex-dev/base/ltproperties-doc.pdf
new file mode 100644
index 0000000000..553223ecc2
--- /dev/null
+++ b/macros/latex-dev/base/ltproperties-doc.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltproperties-doc.tex b/macros/latex-dev/base/ltproperties-doc.tex
new file mode 100644
index 0000000000..072dfedad0
--- /dev/null
+++ b/macros/latex-dev/base/ltproperties-doc.tex
@@ -0,0 +1,8 @@
+% This will typeset only documentation but not the code
+%
+
+\AtBeginDocument{\OnlyDescription
+% \let\tableofcontents\relax
+ \RenewCommandCopy\MaybeStop\StopEventually
+ }
+\input{ltproperties.dtx}
diff --git a/macros/latex-dev/base/ltproperties.dtx b/macros/latex-dev/base/ltproperties.dtx
new file mode 100644
index 0000000000..71b6e2a14f
--- /dev/null
+++ b/macros/latex-dev/base/ltproperties.dtx
@@ -0,0 +1,943 @@
+% \iffalse meta-comment
+%
+%% File: ltproperties.dtx
+%
+% Copyright (C) 2021-2023 The LaTeX Project
+%
+% It may be distributed and/or modified under the conditions of the
+% LaTeX Project Public License (LPPL), either version 1.3c of this
+% license or (at your option) any later version. The latest version
+% of this license is in the file
+%
+% http://www.latex-project.org/lppl.txt
+%
+% This file is part of the LaTeX base system. (The Work in LPPL)
+% and all files in that bundle must be distributed together.
+%
+% -----------------------------------------------------------------------
+%
+% The development version of the bundle can be found at
+%
+% https://github.com/latex3/latex2e
+%
+% for those people who are interested.
+% \begin{macrocode}
+\def\ltpropertiesversion{1.0b}
+\def\ltpropertiesdate{2023-09-13}
+% \end{macrocode}
+
+%<*driver>
+\documentclass[full]{l3doc}
+\EnableCrossrefs
+\CodelineIndex
+\begin{document}
+ \DocInput{ltproperties.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \title{^^A
+% Recording and cross-referencing document properties^^A
+% \thanks{This module has version
+% \ltpropertiesversion\ dated \ltpropertiesdate, \copyright\ The \LaTeX\
+% Project.}
+% }
+%
+% \author{^^A
+% The \LaTeX\ Project\thanks
+% {^^A
+% E-mail:
+% \href{mailto:latex-team@latex-project.org}
+% {latex-team@latex-project.org}^^A
+% }^^A
+% }
+%
+% \maketitle
+%
+% \begin{documentation}
+% \begin{abstract}
+% This code implements command to record and (expandably) reference
+% document properties. It extends the standard \cs{label}/\cs{ref}/\cs{pageref}
+% commands.
+% \end{abstract}
+%
+% \tableofcontents
+%
+% \section{Introduction}
+%
+% The module allows to record the \enquote{current state} of various
+% document properties (typically the content of macros and values of counters)
+% and to access them in other places through a label.
+% The list of properties that can be recorded and retrieved
+% are not fix and can be extended by the user. The values of the properties
+% are recorded in the \texttt{.aux} file and can be retrieved at the second compilation.
+%
+%
+% The module uses the ideas of properties and labels. A label is
+% a document reference point: a name for the user. An property is something
+% that \LaTeX{} can track, such as a page number, section number or name.
+% The names of labels and properties may be arbitrary. Note that there is
+% a single namespace for each.
+%
+% \section{Design discussion}
+%
+% The design here largely follows ideas from \pkg{zref}. In particular, there
+% are two independent concepts: properties that can be recorded between runs,
+% and labels which consist of lists of these properties. The reason for the
+% split is that individual labels will want to record some but not all
+% properties. For examples, a label concerned with position would track
+% the $x$ and $y$ co-ordinates of the current point, but not for example
+% the page number.
+%
+% In the current implementation, properties share a single namespace. This
+% allows multiple lists to re-use the same properties, for example page number,
+% absolute page number, etc. This does mean that \emph{changing} a standard
+% property is an issue. However, some properties have complex definitions
+% (again, see \pkg{zref} at present): having them in a single shared space
+% avoids the need to copy code.
+%
+% Labels could be implemented as |prop| data. That is not done at present as
+% there is no obvious need to map to or copy the data. As such, faster
+% performance is available using a hash table approach as in a \enquote{classical}
+% set up. Data written to the |.aux| file uses simple paired \emph{balanced
+% text} not keyvals: this avoids any restrictions on names and again offers
+% increased performance.
+%
+% The \pkg{expl3} versions of the label command do not
+% use \cs{@bsphack}/\cs{@esphack} to avoid double spaces,
+% but the \LaTeXe{} command does as it lives at the document command level.
+%
+% The reference commands are expandable.
+%
+% Currently the code has nearly no impact on the main \cs{label} and \cs{ref} commands as
+% too many external packages rely on the concrete implementation.
+% There is one exception:
+% the label names share the same namespace. That means that if both |\label{ABC}| and
+% |\RecordProperties{ABC}{page}| are used there is a warning
+% \texttt{Label `ABC' multiply defined}.
+%
+% \section{Handling unknown labels and properties}
+% With the standard \cs{label}/\cs{ref} commands the requested label is
+% either in the |.aux|-file (and so known) or not.
+% In the first case the stored value can be used,
+% in the second case the reference commands print two question marks.
+%
+% With flexible property lists a reference commands asks for the
+% value of a specific property stored under a label name
+% and we have to consider more variants:
+% \begin{itemize}
+% \item If the requested property is unknown (not declared) the system
+% is not correctly set up and an error is issued.
+% \item If the label is unknown, the default of the property is used.
+% \item If the label is known, but doesn't provide a value for the
+% property then again the default of the property is used.
+% \item The command |\property_ref:nnn| allows to give a local default
+% which is used instead of the property default in the two cases before.
+% \end{itemize}
+%
+% \section{Rerun messages}
+%
+% As the reference commands are expandable they can neither issue a message that
+% the label or the label-property combination is unknown, nor can they trigger the
+% rerun message at the end of the \LaTeX{} run.
+%
+% Where needed such messages must therefore be triggered manually. For this two commands
+% are provided: \cs{property_ref_undefined_warn:} and \cs{property_ref_undefined_warn:nn}.
+% See below for a description.
+%
+% \section{Open points}
+%
+% \begin{itemize}
+% \item The \texttt{xpos} and \texttt{ypos} properties require that the position is
+% stored first but there is no (public) engine independent interface yet. Code must
+% use \cs{tex_savepos:D}.
+% \end{itemize}
+%
+% \section{Code interfaces}
+%
+% \begin{function}{\property_new:nnnn,\property_gset:nnnn}
+% \begin{syntax}
+% \cs{property_new:nnnn} \Arg{property} \Arg{setpoint} \Arg{default} \Arg{code}
+% \cs{property_gset:nnnn} \Arg{property}\Arg{setpoint} \Arg{default} \Arg{code}
+% \end{syntax}
+% \LaTeXe-interface: see \cs{NewProperty}, \cs{SetProperty}.\\
+% Sets the \meta{property} to have the \meta{default} specified, and at the
+% \meta{setpoint} (either |now| or |shipout|) to write the result of the
+% \meta{code} as part of a label. The \meta{code} should be expandable. The expansion
+% of \meta{code} (the value of the property) is written to the |.aux| file and read
+% back from there at the next compilation. Values should assume that the
+% standard \LaTeX{} catcode régime with |@| a letter is active then.
+%
+% If the property is declared within a package it is suggested
+% that its name is build from letters, hyphens and slashes,
+% and is always structured as follows:\\
+% \meta{package-name}\texttt{/}\meta{property-name}.
+% \end{function}
+%
+% \begin{function}
+% {
+% \property_record:nN,
+% \property_record:nn, \property_record:nV, \property_record:xx
+% }
+% \begin{syntax}
+% \cs{property_record:nN} \Arg{label} \Arg{clist var}
+% \cs{property_record:nn} \Arg{label} \Arg{clist}
+% \end{syntax}
+% \LaTeXe{}-interface: see \cs{RecordProperties}.\\
+% Writes the list of properties given by the \meta{clist} to the |.aux|
+% file with the \meta{label} specified.
+% \end{function}
+%
+% \begin{function}[EXP]{\property_ref:nn,\property_ref:ee}
+% \begin{syntax}
+% \cs{property_ref:nn} \Arg{label} \Arg{property}
+% \end{syntax}
+% \LaTeXe{}-interface: see \cs{RefProperty}.\\
+% Expands to the value of the \meta{property} for the \meta{label}, if
+% available, and the default value of the property otherwise.
+% If \meta{property} has not been declared with |\property_new:nnnn|
+% an error is issued. The command raises an internal, expandable, local flag
+% if the reference can not be resolved.
+% \end{function}
+%
+% \begin{function}[EXP]{\property_ref:nnn,\property_ref:een}
+% \begin{syntax}
+% \cs{property_ref:nnn} \Arg{label} \Arg{property} \Arg{local default}
+% \end{syntax}
+% \LaTeXe{}-interface: see \cs{RefProperty}.\\
+% Expands to the value of the \meta{property} for the \meta{label}, if
+% available, and to \meta{local default} otherwise.
+% If \meta{property} has not been declared with |\property_new:nnnn|
+% an error is issued. The command raises an internal, expandable local flag
+% if the reference can not be resolved.
+% \end{function}
+%
+% \begin{function}{\property_ref_undefined_warn:}
+% \begin{syntax}
+% \cs{property_ref_undefined_warn:}
+% \end{syntax}
+% \LaTeXe{}-interface: not provided.\\
+% The commands triggers the standard warning
+% \\
+% \hspace*{1em}\texttt{LaTeX Warning: There were undefined references.}
+% \\
+% at the end of the document if there was a recent
+% \cs{property_ref:nn} or \cs{property_ref:nnn} which couldn't be resolved
+% and so raised the flag. \enquote{Recent} means in the same group
+% or in some outer group!
+% \end{function}
+%
+% \begin{function}{\property_ref_undefined_warn:n,\property_ref_undefined_warn:x}
+% \begin{syntax}
+% \cs{property_ref_undefined_warn:n} \Arg{label}
+% \end{syntax}
+% \LaTeXe{}-interface: not provided.\\
+% The commands triggers the standard warning\\
+% \hspace*{1em}\texttt{LaTeX Warning: There were undefined references.}
+% \\
+% at the end of the document if \meta{label} is not known.
+% At the point where it is called it also issues the warning\\
+% \hspace*{1em}%
+% \texttt{Reference~`\meta{label}'~on~page~\meta{page}\space undefined}.
+% \end{function}
+%
+% \begin{function}{\property_ref_undefined_warn:nn,\property_ref_undefined_warn:xx}
+% \begin{syntax}
+% \cs{property_ref_undefined_warn:nn} \Arg{label} \Arg{property}
+% \end{syntax}
+% \LaTeXe{}-interface: see \cs{RefUndefinedWarn}.\\
+% The commands triggers the standard warning\\
+% \hspace*{1em}%
+% \texttt{LaTeX Warning: There were undefined references.}\\
+% at the end of the document if the reference can not be resolved.
+% At the point where it is called it also issues the warning\\
+% \hspace*{1em}%
+% \texttt{Reference~`\meta{label}'~on~page~\meta{page}\space undefined}\\
+% if the label
+% is unknown, or the more specific\\
+% \hspace*{1em}%
+% \texttt{Property `\meta{property}' undefined for reference
+% `\meta{label}' on page \meta{page}}\\
+% if the label is known but doesn't provide a value for the requested property.
+% \end{function}
+%
+% \begin{function}[pTF]{\property_if_exist:n,\property_if_exist:e}
+% \begin{syntax}
+% \cs{property_if_exist_p:n} \Arg{property}
+% \cs{property_if_exist:nTF} \Arg{property} \Arg{true code} \Arg{false code}
+% \end{syntax}
+% \LaTeXe{}-interface: \cs{IfPropertyExistTF}.\\
+% Tests if the \meta{property} has been declared.
+% \end{function}
+%
+% \begin{function}[pTF]{\property_if_recorded:n,\property_if_recorded:e}
+% \begin{syntax}
+% \cs{property_if_recorded_p:n} \Arg{label}
+% \cs{property_if_recorded:nTF} \Arg{label} \Arg{true code} \Arg{false code}
+% \end{syntax}
+% \LaTeXe{}-interface: \cs{IfLabelExistTF}\\
+% Tests if the \meta{label} is known. This is also true if the label has been
+% set with the standard \cs{label} command.
+% \end{function}
+%
+% \begin{function}[pTF]{\property_if_recorded:nn,\property_if_recorded:ee}
+% \begin{syntax}
+% \cs{property_if_recorded_p:nn} \Arg{label} \Arg{property}
+% \cs{property_if_recorded:nnTF} \Arg{label} \Arg{property} \Arg{true code} \Arg{false code}
+% \end{syntax}
+% \LaTeXe{}-interface: \cs{IfPropertyRecordedTF}.\\
+% Tests if the label \meta{label} is known and if it provides a value of the \meta{property}.
+% \end{function}
+%
+% \section{Auxiliary file interfaces}
+%
+% \begin{function}{\new@label@record}
+% \begin{syntax}
+% \cs{new@label@record} \Arg{label} \Arg{data}
+% \end{syntax}
+% This is a command only for use in the |.aux| file. It loads the key--value
+% list of \meta{data} to be available for the \meta{label}.
+% \end{function}
+%
+% \section{\LaTeXe{} interface}
+%
+% The LaTeXe{} interfaces always expand label and property arguments.
+%
+% \begin{function}{\NewProperty,\SetProperty}
+% \begin{syntax}
+% \cs{NewProperty} \Arg{property} \Arg{setpoint} \Arg{default} \Arg{code}
+% \cs{SetProperty} \Arg{property} \Arg{setpoint} \Arg{default} \Arg{code}
+% \end{syntax}
+% Sets the \meta{property} to have the \meta{default} specified, and at the
+% \meta{setpoint} (either |now| or |shipout|) to write the result of the
+% \meta{code} as part of a label. The \meta{code} should be expandable. The expansion
+% of \meta{code} (the value of the property) is written to the |.aux| file and read
+% back from there at the next compilation (at which point normally
+% the standard \LaTeX{} catcode régime with |@| a letter is active).
+%
+% \end{function}
+%
+% \begin{function}{\RecordProperties}
+% \begin{syntax}
+% \cs{RecordProperties} \Arg{label} \Arg{clist}
+% \end{syntax}
+% Writes the list of properties given by the \meta{clist} to the |.aux|
+% file with the \meta{label} specified. Similar to the standard \cs{label} command
+% the arguments are expanded. So \meta{clist} can be a macro containing a list
+% of properties. Also similar to the standard \cs{label} command, the command is surrounded
+% by an \cs{@bsphack}/\cs{@esphack} pair to preserve spacing.
+% \end{function}
+
+% \begin{function}[EXP]{\RefProperty}
+% \begin{syntax}
+% \cs{RefProperty} \oarg{local default} \Arg{label} \Arg{property}
+% \end{syntax}
+% Expands to the value of the \meta{property} for the \meta{label}, if
+% available, and the default value of the property or -- if given --
+% to \meta{local default} otherwise.
+% If \Arg{property} has not been declared an error is issued.
+% \end{function}
+%
+% \begin{function}{\IfPropertyExistTF}
+% \begin{syntax}
+% \cs{IfPropertyExistTF} \Arg{property} \Arg{true code} \Arg{false code}
+% \end{syntax}
+% Tests if the \meta{property} has been declared.
+% \end{function}
+%
+% \begin{function}{\IfLabelExistTF}
+% \begin{syntax}
+% \cs{IfLabelExistTF} \Arg{label} \Arg{true code} \Arg{false code}
+% \end{syntax}
+% Tests if the \meta{label} has been recorded. This is also true if a label
+% has been set with the standard \cs{label} command.
+% \end{function}
+%
+% \begin{function}{\IfPropertyRecordedTF}
+% \begin{syntax}
+% \cs{IfPropertyRecordedTF} \Arg{label} \Arg{property} \Arg{true code} \Arg{false code}
+% \end{syntax}
+% Tests if the label and a value of the \meta{property} for the \meta{label} are both known.
+% \end{function}
+
+% \begin{function}{\RefUndefinedWarn}
+% \begin{syntax}
+% \cs{RefUndefinedWarn} \Arg{label} \Arg{property}
+% \end{syntax}
+% This commands triggers the standard warning\\
+% \hspace*{1em}%
+% \texttt{LaTeX Warning: There were undefined references.}\\
+% at the end of the document if the reference for \meta{label} and \meta{property}
+% can not be resolved.
+% At the point where it is called it also issues the warning\\
+% \hspace*{1em}%
+% \texttt{Reference `\meta{label}' on page \meta{page} undefined}\\
+% if the label is unknown, or the more specific\\
+% \hspace*{1em}%
+% \texttt{Property `\meta{property}' undefined for reference
+% `\meta{label}' on page \meta{page}}
+% if the label is known but doesn't provide a value for the requested property.
+% \end{function}
+%
+% \section{Pre-declared properties}
+%
+% \begin{variable}{abspage}
+% (shipout) The absolute value of the current page: starts at $1$ and increases
+% monotonically at each shipout.
+% \end{variable}
+%
+% \begin{variable}{page}
+% (shipout) The current page as given by \cs{thepage}: this may or may not
+% be a numerical value, depending on the current style. Contrast with
+% \cs{abspage}. You get this value also with the standard \cs{label}/\cs{pageref}.
+% \end{variable}
+%
+% \begin{variable}{pagenum}
+% (shipout) The current page as arabic number. This is suitable for integer operations and
+% comparisions.
+% \end{variable}
+%
+% \begin{variable}{currentlabel}
+% (now) The content of \cs{@currentlabel}. This is the value that
+% you get also with the standard \cs{label}/\cs{ref}.
+% \end{variable}
+%
+% \begin{variable}{title}
+% (now) The content of \cs{@currentlabelname}.
+% This command is filled beside others by the \pkg{nameref} package and some
+% classes (e.g.~\pkg{memoir}).
+% \end{variable}
+%
+% \begin{variable}{target}
+% (now) The content of \cs{@currentHref}.
+% This command is normally filled by for example by
+% \pkg{hyperref} and gives the name of the last destination it created.
+% \end{variable}
+%
+% \begin{variable}{counter}
+% (now) The content of \cs{@currentcounter}.
+% This command contains after a \cs{refstepcounter} the name of the counter.
+% \end{variable}
+%
+% \begin{variable}{xpos,ypos}
+% (shipout) This stores the $x$~and $y$ coordinates of a point previously
+% stored with \cs{pdfsavepos}/\cs{savepos}.
+% E.g.~(if bidi is used it can be necessary to save the position
+% before and after the label):
+% \begin{verbatim}
+% \tex_savepos:D
+% \property_record:nn{myposition}{xpos,ypos}
+% \tex_savepos:D
+% \end{verbatim}
+% \end{variable}
+% \end{documentation}
+%
+% \begin{implementation}
+%
+% \section{The Implementation}
+%
+% \begin{macrocode}
+%<*2ekernel|latexrelease>
+% \end{macrocode}
+% \begin{macrocode}
+\ExplSyntaxOn
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<@@=property>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\NewModuleRelease{2023/11/01}{ltproperties}
+%<latexrelease> {Cross-referencing~properties}
+% \end{macrocode}
+%
+% The approach here is based closely on that from \pkg{zref}; separate out
+% lists of properties and the properties themselves, so the latter can be
+% used multiple times and in varying combinations.
+% However, not everything is a straight copy. Firstly,
+% we treat lists of properties as simple comma lists: that allows us to have
+% either saved or dynamic lists and to avoid another data structure. The cost
+% is that errors are detected at point-of-use, but in any real case that should
+% be true anyway (and is true for \tn{zref@labelbyprop} already). Secondly,
+% we allow properties to have
+% arbitrary names, as the code does not require them to tokenize as control
+% sequences.
+%
+% \begin{macro}{\property_new:nnnn, \property_gset:nnnn, \@@_gset:nnnn}
+% As properties can be reset, they are not constants. But they also have
+% various pieces of required data. So we use the same approach as color and
+% make them declarations. Data-wise, we need the detail of the implementation,
+% the default and a flag to show if the code works now or at shipout. This
+% last entry is done using text so needs a check. We could use a set of
+% |prop| here, but as we never need to map or copy the lists, we can gain
+% performance using the hash table approach.
+% \begin{macrocode}
+\cs_new_protected:Npn \property_new:nnnn #1#2#3#4
+ {
+ \cs_if_free:cTF { @@_code_ #1 : }
+ {
+ \exp_args:Nx \@@_gset:nnnn { \tl_to_str:n {#1} }
+ {#2} {#3} {#4}
+ }
+ {
+ \msg_error:nn { property }{ exists }{#1}
+ }
+ }
+\cs_new_protected:Npn \property_gset:nnnn #1#2#3#4
+ {
+ \@@_gset:xnnn { \tl_to_str:n {#1} }
+ {#2} {#3} {#4}
+ }
+\cs_new_protected:Npn \@@_gset:nnnn #1#2#3#4
+ {
+ \cs_gset:cpn { @@_code_ #1 : } {#4}
+ \tl_gclear_new:c { g_@@_default_ #1 _tl }
+ \tl_gset:cn { g_@@_default_ #1 _tl } {#3}
+ \bool_if_exist:cF { g_@@_shipout_ #1 _tl }
+ { \bool_new:c { g_@@_shipout_ #1 _tl } }
+ \str_case:nnF {#2}
+ {
+ { now } { { \bool_gset_false:c { g_@@_shipout_ #1 _tl } } }
+ { shipout }
+ { \bool_gset_true:c { g_@@_shipout_ #1 _tl } }
+ }
+ { \msg_error:nnnn { property } { unknown-setpoint } {#1} {#2} }
+ }
+\cs_generate_variant:Nn \@@_gset:nnnn {xnnn}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\NewProperty,\SetProperty}
+% For consistency we expand the property name, but this doesn't warant a
+% variant of the L3-commands.
+% \begin{macrocode}
+\cs_new_protected:Npn \NewProperty #1#2#3#4
+ {
+ \exp_args:Nx \property_new:nnnn {#1}{#2}{#3}{#4}
+ }
+\cs_new_protected:Npn \SetProperty #1#2#3#4
+ {
+ \exp_args:Nx \property_gset:nnnn {#1}{#2}{#3}{#4}
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\property_record:nN}
+% \begin{macro}
+% {
+% \property_record:nn,
+% \property_record:nV,
+% \property_record:xx,
+% \@@_record:nn,
+% \@@_record:xn
+% }
+% \begin{macro}[EXP]
+% {\@@_record_value:n, \@@_record_value_aux:n, \@@_record_value_aux:e}
+% Writing data when it is labelled means expanding at this stage and possibly
+% later too. That is all pretty easy using \pkg{expl3}: we accept a stray
+% comma at the end of the list as that is easier to deal with than trying
+% to tidy up, and there is no real downside.
+% \begin{macrocode}
+\cs_new_protected:Npn \property_record:nN #1#2
+ { \property_record:nV {#1} #2 }
+\cs_new_protected:Npn \property_record:nn #1#2
+ { \@@_record:xn { \tl_to_str:n {#1} } {#2} }
+\cs_generate_variant:Nn \property_record:nn { nV , xx }
+\cs_new_protected:Npn \@@_record:nn #1#2
+ {
+ \legacy_if:nT { @filesw }
+ {
+ \iow_shipout_x:Nx \@auxout
+ {
+ \token_to_str:N \new@label@record
+ {#1}
+ { \clist_map_function:nN {#2} \@@_record_value:n }
+ }
+ }
+ }
+\cs_generate_variant:Nn \@@_record:nn { x }
+\cs_new:Npn \@@_record_value:n #1
+ { \@@_record_value_aux:e { \tl_to_str:n {#1} } }
+\cs_new:Npn \@@_record_value_aux:n #1
+ {
+ \cs_if_exist:cTF { @@_code_ #1 : }
+ {
+ {#1}
+ {
+ \bool_if:cTF { g_@@_shipout_ #1 _tl }
+ { \exp_not:c }
+ { \use:c }
+ { @@_code_ #1 : }
+ }
+ }
+ { \msg_expandable_error:nnn { property } { not-declared } {#1} }
+ }
+\cs_generate_variant:Nn \@@_record_value_aux:n { e }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\RecordProperties}
+% \begin{macrocode}
+\NewDocumentCommand\RecordProperties { m m }
+ {
+ \@bsphack
+ \property_record:xx {#1}{#2}
+ \@esphack
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Reference commands}
+%
+% \begin{variable}{ l_@@_ref_flag }
+% A flag that is set if a reference couldn't be resolved.
+% \begin{macrocode}
+\flag_new:n { l_@@_ref_flag }
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP]{\property_ref:nn,\property_ref:ee}
+% Search for the label/property combination, and if not found fall back
+% to the default of the property.
+% \begin{macrocode}
+\cs_new:Npn \property_ref:nn #1#2
+ {
+ \@@_ref:een
+ { \tl_to_str:n {#1} }
+ { \tl_to_str:n {#2} }
+ { \tl_use:c { g_@@_default_ #2 _tl } }
+ }
+\cs_generate_variant:Nn \property_ref:nn {ee}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\property_ref:nnn,\property_ref:een, \@@_ref:nnn, \@@_ref:een}
+% This allows to set a local default value which overrides the default value
+% of the property.
+% \begin{macrocode}
+\cs_new:Npn \property_ref:nnn #1#2#3
+ {
+ \@@_ref:een
+ { \tl_to_str:n {#1} }
+ { \tl_to_str:n {#2} }
+ {#3}
+ }
+\cs_new:Npn \@@_ref:nnn #1#2#3
+ {
+ \tl_if_exist:cTF { g_@@_label_ #1 _ #2 _tl }
+ { \tl_use:c { g_@@_label_ #1 _ #2 _tl } }
+ {
+ \flag_if_raised:nF
+ { l_@@_ref_flag } { \flag_raise:n { l_@@_ref_flag } }
+% \end{macrocode}
+% We test for the default of the property only to check if the property has
+% been declared.
+% \begin{macrocode}
+ \tl_if_exist:cTF { g_@@_default_ #2 _tl }
+ { #3 }
+ { \msg_expandable_error:nnn { property } { not-declared } {#2} }
+ }
+ }
+\cs_generate_variant:Nn \@@_ref:nnn { ee }
+\cs_generate_variant:Nn \property_ref:nnn {een}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\RefProperty}
+% Search for the label/property combination, and if not found fall back
+% to the default of the property or the given default.
+% \begin{macrocode}
+\NewExpandableDocumentCommand \RefProperty { o m m }
+ {
+ \IfNoValueTF {#1}
+ {
+ \property_ref:ee {#2}{#3}
+ }
+ {
+ \property_ref:een {#2}{#3}{#1}
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\new@label@record}
+% \begin{macro}{\@@_data:nnn}
+% A standard recursion loop.
+% \begin{macrocode}
+\cs_new_protected:Npn \new@label@record #1#2
+ {
+ \tl_if_exist:cTF { r@#1 }
+ {
+ \gdef \@multiplelabels
+ { \@latex@warning@no@line { There~were~multiply-defined~labels } }
+ \@latex@warning@no@line { Label~`#1'~multiply~defined }
+ }
+ {
+ \tl_new:c { r@#1 }
+ \tl_gset:cn { r@#1 }{#2}
+ }
+ \@@_data:nnn {#1} #2 { \q_recursion_tail } { ? } \q_recursion_stop
+ }
+\cs_new_protected:Npn \@@_data:nnn #1#2#3
+ {
+ \quark_if_recursion_tail_stop:n {#2}
+ \tl_gclear_new:c { g_@@_label_ \tl_to_str:n {#1} _ \tl_to_str:n {#2} _tl }
+ \tl_gset:cn { g_@@_label_ \tl_to_str:n {#1} _ \tl_to_str:n {#2} _tl } {#3}
+ \@@_data:nnn {#1}
+ }
+% \end{macrocode}
+%
+% This command is used in \cs{enddocument} to test if some label values have changed.
+% \begin{macrocode}
+\cs_new_protected:Npn \@kernel@new@label@record@testdef #1 #2
+ {
+ \tl_if_eq:cnF { r@#1 } {#2}
+ { \@tempswatrue }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Tests and warnings}
+%
+% \begin{macro}[pTF]{\property_if_exist:n}
+% Tests if property has been declared.
+% \begin{macrocode}
+\prg_new_conditional:Npnn \property_if_exist:n #1 { p , T , F, TF }
+ % #1 property
+ {
+ \cs_if_exist:cTF { @@_code_ #1 : }
+ {
+ \prg_return_true:
+ }
+ {
+ \prg_return_false:
+ }
+ }
+\prg_generate_conditional_variant:Nnn \property_if_exist:n {e} {TF}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{IfPropertyExistTF}
+% \begin{macrocode}
+\cs_new_eq:NN \IfPropertyExistTF \property_if_exist:eTF
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[pTF]{\property_if_recorded:n}
+% Tests if the label has been set.
+% This can then be used to setup e.g.~rerun messages.
+% \begin{macrocode}
+\prg_new_conditional:Npnn \property_if_recorded:n #1 { p , T , F, TF }
+ % #1 label
+ {
+ \tl_if_exist:cTF { r@#1 }
+ {
+ \prg_return_true:
+ }
+ {
+ \prg_return_false:
+ }
+ }
+\prg_generate_conditional_variant:Nnn \property_if_recorded:n {e} {TF}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\IfLabelExistTF}
+% \begin{macrocode}
+\cs_new_eq:NN \IfLabelExistTF \property_if_recorded:eTF
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[pTF]{\property_if_recorded:nn}
+% tests if the label/property combination has been set
+% This can then be used to setup e.g.~rerun messages.
+% \begin{macrocode}
+\prg_new_conditional:Npnn \property_if_recorded:nn #1#2 { p , T , F, TF }
+ % #1 label #2 property
+ {
+ \tl_if_exist:cTF { g_@@_label_ \tl_to_str:n {#1} _ \tl_to_str:n {#2} _tl }
+ {
+ \prg_return_true:
+ }
+ {
+ \prg_return_false:
+ }
+ }
+\prg_generate_conditional_variant:Nnn \property_if_recorded:nn {ee} {TF}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\IfPropertyRecordedTF}
+% \begin{macrocode}
+\cs_new_eq:NN \IfPropertyRecordedTF \property_if_recorded:eeTF
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\property_ref_undefined_warn:}
+% \cs{G@refundefinedtrue} is defined in \texttt{ltxref} and redefines a warning message.
+% \begin{macrocode}
+\cs_new_protected:Npn \property_ref_undefined_warn:
+ {
+ \flag_if_raised:nT { l_@@_ref_flag }
+ {
+ \G@refundefinedtrue
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\property_ref_undefined_warn:n}
+% \begin{macrocode}
+\cs_new_protected:Npn \property_ref_undefined_warn:n #1 %#1 label
+ {
+ \property_if_recorded:nF {#1}
+ {
+ \G@refundefinedtrue
+ \@latex@warning{Reference~`#1'~on~page~\thepage\space undefined}%
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\property_ref_undefined_warn:nn,
+% \property_ref_undefined_warn:xx,
+% \RefUndefinedWarn}
+% \begin{macrocode}
+\cs_new_protected:Npn \property_ref_undefined_warn:nn #1#2 %#1 label, #2 property
+ {
+ \property_if_recorded:nTF {#1}
+ {
+ \property_if_recorded:nnF {#1}{#2}
+ {
+ \G@refundefinedtrue
+ \@latex@warning
+ { Property~`#2'~undefined~for~reference~`#1'~on~page~\thepage }
+ }
+ }
+ {
+ \G@refundefinedtrue
+ \@latex@warning { Reference~`#1'~on~page~\thepage\space undefined }%
+ }
+ }
+\cs_generate_variant:Nn \property_ref_undefined_warn:nn {xx}
+\cs_set_eq:NN \RefUndefinedWarn \property_ref_undefined_warn:xx
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Predeclared properties}
+%
+% \begin{variable}{abspage}
+% \begin{macrocode}
+\property_new:nnnn { abspage } { shipout }
+ { 0 } { \int_use:N \g_shipout_readonly_int }
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{page}
+% \begin{macrocode}
+\property_new:nnnn { page } { shipout } { 0 } { \thepage }
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{pagenum}
+% \begin{macrocode}
+\property_new:nnnn { pagenum } { shipout } { 0 } { \the \value { page } }
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{currentlabel}
+% \begin{macrocode}
+\property_new:nnnn { currentlabel } { now } { ?? } { \@currentlabel }
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{title}
+% \begin{macrocode}
+\property_new:nnnn { title } { now }
+ { \exp_not:n { \textbf { ?? } } } { \@currentlabelname }
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{target}
+% \begin{macrocode}
+\property_new:nnnn { target } { now } { } { \@currentHref }
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{counter}
+% \begin{macrocode}
+\property_new:nnnn { counter } { now } { } { \@currentcounter }
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{xpos,ypos}
+% \begin{macrocode}
+\property_new:nnnn { xpos } { shipout } { 0} { \int_use:N \tex_lastxpos:D }
+\property_new:nnnn { ypos } { shipout } { 0} { \int_use:N \tex_lastypos:D }
+% \end{macrocode}
+% \end{variable}
+%
+% \subsection{Messages}
+% \begin{macrocode}
+\msg_new:nnnn { property } { exists }
+ { Property~'#1'~ has~ already~ been~ declared. }
+ { There~ already~ exists~ a~ property~ declaration~ with~ this~
+ name.\\
+ Please~ use~ a~ different~ name~ for~ your~ property.}
+
+\msg_new:nnnn { property } { not-declared }
+ { Property~'#1'~not~declared. }
+ {
+ LaTeX~has~been~asked~to~use~property~'#1',~but~this~
+ name~has~not~been~declared.
+ }
+\msg_new:nnnn { property } { unknown-setpoint }
+ { Unknown~keyword~'#2'~for~setting~property~'#1'. }
+ {
+ LaTeX~has~been~asked~to~set~the~property~'#1',~but~the~keyword~
+ '#2'~is~not~one~of~the~two~known~values:~'now'~or~'shipout'.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+%
+%<latexrelease>\IncludeInRelease{0000/00/00}{ltproperties}
+%<latexrelease> {cross-referencing~properties~(undo)}%
+%<latexrelease>
+%<latexrelease>\let \NewProperty \@undefined
+%<latexrelease>\let \SetProperty \@undefined
+%<latexrelease>
+%<latexrelease>\let \RecordProperties \@undefined
+%<latexrelease>\let \RefProperty \@undefined
+%<latexrelease>\let \RefUndefinedWarn \@undefined
+%<latexrelease>
+%<latexrelease>\let \IfPropertyExistTF \@undefined
+%<latexrelease>\let \IfLabelExistTF \@undefined
+%<latexrelease>\let \IfPropertyRecordedTF \@undefined
+%<latexrelease>
+%<latexrelease>\let\new@label@record \@undefined
+%<latexrelease>\let\@kernel@new@label@record@testdef\@undefined
+%<latexrelease>\EndModuleRelease
+% \end{macrocode}
+%
+% \begin{macrocode}
+\ExplSyntaxOff
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</2ekernel|latexrelease>
+% \end{macrocode}
+%
+% Reset module prefix:
+% \begin{macrocode}
+%<@@=>
+% \end{macrocode}
+%
+%
+% \end{implementation}
+%
+% \Finale
diff --git a/macros/latex-dev/base/ltshipout-code.pdf b/macros/latex-dev/base/ltshipout-code.pdf
index a2b9753e1d..ff0e6d4c2b 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 747936c204..bf58bd09b9 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/ltsockets-code.pdf b/macros/latex-dev/base/ltsockets-code.pdf
new file mode 100644
index 0000000000..82ccada409
--- /dev/null
+++ b/macros/latex-dev/base/ltsockets-code.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltsockets-code.tex b/macros/latex-dev/base/ltsockets-code.tex
new file mode 100644
index 0000000000..82ca0b059b
--- /dev/null
+++ b/macros/latex-dev/base/ltsockets-code.tex
@@ -0,0 +1,5 @@
+% This will typeset documentation + code
+%
+
+\AtBeginDocument{\AlsoImplementation}
+\input{ltsockets.dtx}
diff --git a/macros/latex-dev/base/ltsockets-doc.pdf b/macros/latex-dev/base/ltsockets-doc.pdf
new file mode 100644
index 0000000000..0d32f64a1d
--- /dev/null
+++ b/macros/latex-dev/base/ltsockets-doc.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltsockets-doc.tex b/macros/latex-dev/base/ltsockets-doc.tex
new file mode 100644
index 0000000000..c181fbb3cc
--- /dev/null
+++ b/macros/latex-dev/base/ltsockets-doc.tex
@@ -0,0 +1,8 @@
+% This will typeset only documentation but not the code
+%
+
+\AtBeginDocument{\OnlyDescription
+% \let\tableofcontents\relax
+ \RenewCommandCopy\MaybeStop\StopEventually
+ }
+\input{ltsockets.dtx}
diff --git a/macros/latex-dev/base/ltsockets.dtx b/macros/latex-dev/base/ltsockets.dtx
new file mode 100644
index 0000000000..7d2940f454
--- /dev/null
+++ b/macros/latex-dev/base/ltsockets.dtx
@@ -0,0 +1,1069 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2023
+% Frank Mittelbach, The LaTeX Project
+%
+% 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
+%
+% \iffalse
+%
+%%% From File: ltsockets.dtx
+%
+% \begin{macrocode}
+\def\ltsocketsversion{0.9a}
+\def\ltsocketsdate{2023-08-21}
+% \end{macrocode}
+%
+%<*driver>
+\documentclass{l3doc}
+
+
+\providecommand\InternalDetectionOff{}
+\providecommand\InternalDetectionOn{}
+
+\EnableCrossrefs
+\CodelineIndex
+\begin{document}
+ \DocInput{ltsockets.dtx}
+\end{document}
+%</driver>
+%
+% \fi
+%
+%
+%
+%
+% \title{\LaTeX{}'s socket management\thanks{This module has version
+% \ltsocketsversion\ dated \ltsocketsdate, \copyright\ \LaTeX\
+% Project.}}
+%
+% \author{Frank Mittelbach}
+%
+% \maketitle
+%
+% ^^A this needs some cleanup:
+% \long\def\fmi#1{\begin{quote} TODO: \itshape #1\end{quote}}
+%
+% \providecommand\pkg[1]{\texttt{#1}}
+% \providecommand\hook[1]{\texttt{#1}}
+% \providecommand\env[1]{\texttt{#1}}
+% \providecommand\plug[1]{\texttt{#1}}
+% \providecommand\socket[1]{\texttt{#1}}
+%
+%
+% \begin{abstract}
+% This code implements sockets which are places in the code into
+% which predeclared chunks of code (plugs) can be placed. Both the sockets
+% and the plugs are \enquote{named} and each socket is
+% assigned exactly one plug at any given time.
+% \end{abstract}
+%
+% \tableofcontents
+%
+% \section{Introduction}
+%
+% A \LaTeX{} source file is transformed into a typeset document by
+% executing code for each command or environment in the document
+% source. Through various steps this code transforms the input and
+% eventually generates typeset output appearing in a \enquote{galley}
+% from which individual pages are cut off in an asyncronous way. This
+% page generating process is normally not directly associated with
+% commands in the input\footnote{Excepts for directives such as
+% \cs{newpage}.} but is triggered whenever the galley has received
+% enough material to form another page (giving current settings).
+%
+% As part of this transformation input data may get stored in some form
+% and later reused, for example, as part of the output routine
+% processing.
+%
+% \section{Configuration of the transformation process}
+%
+% There are three different major methods offered by \LaTeX{} to
+% configure the transformation process:
+% \begin{itemize}
+% \item through the template mechanism,
+% \item through the hook mechanism, or
+% \item through sockets and plugs.
+% \end{itemize}
+% They offer different possibilities (with different features and
+% limitations) and are intended for specific use cases, though it is
+% possible to combine them.
+%
+% \subsection{The template mechanism}
+%
+% The template mechanism is intended for more complex document-level
+% elements (e.g., headings such as \verb=\section= or environments like
+% \env{itemize}). The template code implements the overall processing
+% logic for such an element and offers a set of parameters to influence
+% the final result.
+%
+% The document element is then implemented by (a) selecting a suitable
+% template (there may be more than one available for the kind of
+% document element) and (b) by setting its parameters to desired
+% values. This then forms a so-called instance which is executed when
+% the document element is found in the source.
+%
+% By altering the parameter values (in a document class or in the
+% document preamble) or, if more drastic layout changes are desired, by
+% selecting a different template and then adjusting its parameters, a
+% wide variety of layouts can be realized through simple configuration
+% setups without the need to develop new code.
+%
+% The target audience of this method are therefore document class
+% developers or users who wish to alter an existing layout (implemented
+% by a document class) in certain (minor) ways.
+%
+% The template mechanism is currently documented as part of the
+% \pkg{xtemplate} package and one more elaborate implementation can be
+% found as part of the \texttt{latex-lab} code for lists (to be
+% documented further).
+%
+% \subsection{The hook mechanism}
+%
+% Hooks are places in the kernel code (or in packages) that offer
+% packages the possibility to inject additional code at specific
+% points in the processing in a controlled way without the need to
+% replace the existing code block (and thereby overwriting
+% modifications/extensions made by other packages). The target
+% audience is therefore mainly package developers, even though some
+% hooks can be useful for document authors.
+%
+% Obviously, what can reasonably be added into a hook depends on the
+% individual hook (hopefully documented as part of the hook
+% documentation), but in general the idea behind hooks is that more
+% than one package could add code into the hook at the same
+% time. Perhaps the most famous hook (that \LaTeX{} had for a very
+% long time) is \hook{begindocument} into which many packages add code
+% to through \cs{AtBeginDocument}\marg{code} (which is nowadays
+% implemented as a shorthand for
+% \cs{AddToHook}\texttt{\{\hook{begindocument}\}}\marg{code}). To
+% resolve possible conflicts between injections by different packages
+% there is a rule mechanism by which code chunks in a hook can be
+% ordered in a certain way and by which incompatible packages can be
+% detected if a resolution is impossible.
+%
+% In contrast to template code, there is no standard configuration
+% method through parameters for hooks, i.e., the code added to a hook
+% \enquote{is} the configuration. If it wants to provide for
+% configuration through parameters it has to also provide its own
+% method to set such parameters in some way. However, in that case it
+% is likely that using a hook is not the right approach and the
+% developer better calls a template instance instead which then offers
+% configuration through a key/value interface.
+%
+% In most cases, hooks do not take any arguments as input. Instead, the data
+% that they can (and are allowed to) access depends on the surrounding
+% context.
+%
+% For example, the various hooks available during the page shipout
+% process in \LaTeX's output routine can (and have to) access the
+% accumulated page material stored in a box named
+% \verb=\ShipoutBox=. This way, code added to, say, the
+% \hook{shipout/before} hook could access the page content, alter it,
+% and then write it back into \verb=\ShipoutBox= and any other code
+% added to this hook could then operate on the modified content. Of
+% course, for such a scheme to work the code prior to executing the hook
+% would need to setup up data in appropriate places and the hook
+% documentation would need to document what kind of storage can be
+% accessed (and possibly altered) by the hook.
+%
+% There are also hooks that take arguments (typically portions of
+% document data) and in that case the hook code can access these
+% arguments through \verb=#1=, \verb=#2=, etc.
+%
+% The hook mechanism is documented in \texttt{lthooks-doc.pdf}.
+%
+%
+%
+% \subsection{The socket mechanism}
+%
+% In some cases there is code that implements a certain programming
+% logic (for example, combining footnotes, floats, and the text for the
+% current page to be shipped out) and if this logic should change (e.g.,
+% footnotes to be placed above bottom floats instead of below) then this
+% whole code block needs to be replaced with different code.
+%
+% In theory, this could be implemented with templates, i.e., the code
+% simply calls some instance that implements the logic and that instance
+% is altered by selecting a different templates and/or adjusting their
+% parameters. However, in many cases customization through parameters is
+% overkill in such a case (or otherwise awkward, because paramerization
+% is better done on a higher level instead of individually for small
+% blocks of code) and using the template mechanism just to replace one
+% block of code with a different one results in a fairly high
+% performance hit. It is therefore usually not a good choice.
+%
+% In theory, it would also be possible to use a hook, but again that is
+% basically a misuse of the concept, because in this use case there should
+% never be more than one block of code inside the hook; thus, to alter
+% the processing logic one would need to set up rules that replace code
+% rather than (as intended) execute all code added to the hook.
+%
+%
+%
+% For this reason \LaTeX{} now offers a third mechanism:
+% \enquote{sockets} into which one can place exactly one code block
+% --- a \enquote{plug}.
+%
+% In a nutshell: instead of having a fixed code block somewhere as part
+% of the code, implementing a certain programming logic there is a
+% reference to a named socket at this point.
+% This is done by first declaring the named socket with:
+% \begin{quote}
+% \cs{NewSocket}\marg{socket-name}\marg{number-of-inputs}
+% \end{quote}
+% This is then referenced at the point where the replaceable code block
+% should be executed with:
+% \begin{quote}
+% \cs{UseSocket}\marg{socket-name}
+% \end{quote}
+% or, if the socket should take a number of inputs (additional
+% arguments beside the name) with
+% \begin{quote}
+% \cs{UseSocket}\marg{socket-name}\marg{arg\textsubscript{1}}\ldots
+% \marg{arg\textsubscript{\meta{number-of-inputs}}}
+% \end{quote}
+%
+% In addition, several code blocks (a.k.a.\ plugs) implementing different logic for this
+% socket are set up, each with a declaration of the form:
+% \begin{quote}
+% \cs{NewSocketPlug}\marg{socket-name}\marg{socket-plug-name}\marg{code}
+% \end{quote}
+% Finally,
+% one of them is assigned to the socket:
+% \begin{quote}
+% \cs{AssignSocketPlug}\marg{socket-name}\marg{socket-plug-name}
+% \end{quote}
+% If the programming logic should change, then all that is necessary is
+% to make a new assignment with \cs{AssignSocketPlug} to a different
+% \marg{socket-plug-name}. This assignment obeys scope so that an
+% environment can alter a socket without the need to restore the
+% previous setting manually.
+%
+% If the socket takes inputs, then those need to be provided to
+% \cs{UseSocket} and in that case they can be referenced in the \meta{code}
+% argument of \cs{NewSocketPlug} with \verb=#1=, \verb=#2=, etc.
+%
+% In most cases a named socket is used only in a single place, but there
+% is, of course, nothing wrong with using it in several places, as long
+% as the code in all places is supposed to change in the same way.
+%
+%
+%
+%
+%
+% \subsubsection{Examples}
+%
+%
+% We start by declaring a new socket named \socket{foo} that expects
+% two inputs:
+%\begin{verbatim}
+% \NewSocket{foo}{2}
+%\end{verbatim}
+% \NewSocket{foo}{2}
+%
+% Such a declaration has do be unique across the whole \LaTeX{}
+% run. Thus, if another package attempts to use the same name
+% (regardless of the number of inputs) it will generate an error:
+%\begin{verbatim}
+% \NewSocket{foo}{2}
+% \NewSocket{foo}{1}
+% \end{verbatim}
+% Both declarations would therefore produce:
+% \begin{verbatim}
+% ! LaTeX socket Error: Socket 'foo' already declared!
+%\end{verbatim}
+%
+% You also get an error if you attempt to declare some socket plug and
+% the socket name is not yet declared, e.g.,
+%\begin{verbatim}
+% \NewSocketPlug{baz}{undeclared}{some code}
+%\end{verbatim}
+% generates
+%\begin{verbatim}
+% ! LaTeX socket Error: Socket 'baz' undeclared!
+%\end{verbatim}
+%
+%
+% Setting up plugs for the socket is done like this:
+%\begin{verbatim}
+% \NewSocketPlug{foo}{plug-A}
+% {\begin{quote}\itshape foo-A: #1!#2\end{quote}}
+% \NewSocketPlug{foo}{plug-B}
+% {\begin{quote}\sffamily foo-B: #2\textsuperscript{2}\end{quote}}
+%\end{verbatim}
+% This will set up the plugs \texttt{plug-A} and \texttt{plug-B} for
+% this socket.
+%
+%\NewSocketPlug{foo}{plug-A}{\begin{quote}\itshape foo-A: #1!#2\end{quote}}
+%\NewSocketPlug{foo}{plug-B}{\begin{quote}\sffamily foo-B: #2\textsuperscript{2}\end{quote}}
+%
+% We still have to assign one or the other to the socket, thus without
+% doing that the line
+% \begin{verbatim}
+% \UseSocket{foo}{hello}{world}
+% \end{verbatim}
+% produces nothing because the default plug for sockets with 2 inputs
+% is \plug{noop} (which grabs the additional arguments and throws them
+% away).\footnote{If socket \socket{foo} would have been a socket with one
+% input, then the default plug would be \plug{identity}, in which case
+% the socket input would remain without braces and gets typeset!}
+%
+% \UseSocket{foo}{hello}{world} ^^A nothing happens
+%
+% So let's do the assignment
+% \begin{verbatim}
+% \AssignSocketPlug{foo}{plug-A}
+% \end{verbatim}
+% and then
+% \begin{verbatim}
+% \UseSocket{foo}{hello}{world}
+% \end{verbatim}
+% will properly typeset
+% \AssignSocketPlug{foo}{plug-A}\UseSocket{foo}{hello}{world}
+% and after
+% \begin{verbatim}
+% \AssignSocketPlug{foo}{plug-B}
+% \end{verbatim}
+% and another call to
+% \begin{verbatim}
+% \UseSocket{foo}{hello}{world}
+% \end{verbatim}
+% we get
+% \AssignSocketPlug{foo}{plug-B}\UseSocket{foo}{hello}{world}
+%
+% If we attempt to assign a plug that was not defined, e.g.,
+% \begin{verbatim}
+% \AssignSocketPlug{foo}{plug-C}
+% \end{verbatim}
+% then we get an error during the assignment
+% \begin{verbatim}
+% ! LaTeX socket Error: Plug 'plug-C' for socket 'foo' undeclared!
+% \end{verbatim}
+% and the previous assignment remains in place.
+%
+% To see what is known about a socket and its plugs you can use
+% \cs{ShowSocket} or \cs{LogSocket} which displays information similar
+% to this on the terminal or in the transcript file:
+% \begin{verbatim}
+% Socket foo:
+% number of inputs = 2
+% available plugs = noop, plug-A, plug-B
+% current plug = plug-B
+% definition = \protected\long macro:#1#2->\begin {quote}\sffamily
+% foo-B: #2\textsuperscript {2}\end {quote}
+% \end{verbatim}
+% \LogSocket{foo}
+%
+%
+% \subsubsection{Details and semantics}
+%
+% In this section we collect some normative statements.
+%
+% \begin{itemize}
+%
+% \item
+% From a functional point of view sockets are like simple \TeX{} macros,
+% i.e., they expect 0 to 9 mandatory arguments (the socket inputs) and get replaced by
+% their \enquote{expansion}
+%
+% \item
+% A socket is \enquote{named} and the name consists of ASCII letters
+% \texttt{[a-z]},
+% \texttt{[A-Z]}, \texttt{[0-9]}, \texttt{[-/@]} only
+%
+% \item
+% Socket names have to be unique, i.e., there can be only one socket
+% named \meta{name}. This is ensured by declaring each socket with
+% \cs{NewSocket}.
+%
+% However, there is no requirement that sockets and
+% hook names have to be different. In fact, if a certain action that
+% could overwise be specified as hook code has to be executed always
+% last (or first) one could ensure this by placing a socket (single
+% action) after a hook (or vice versa) and using the same name to
+% indicate the relationship, e.g.,
+%\begin{verbatim}
+% \UseHook{foo} % different package can add code here
+% \UseSocket{foo} % only one package can assign a plug
+%\end{verbatim}
+% This avoids the need to order the hook code to ensure that
+% something is always last.
+%
+% \item
+% Best practice naming conventions are \ldots\ \emph{to be documented}
+%
+% \item
+% A socket has documented inputs which are
+%
+% \begin{itemize}
+% \item
+% the positional arguments (if any) with a description of what
+% they contain when used
+%
+% \item
+% implicit data (registers and other 2e/expl3 data stores) that
+% the socket is allowed to make use of, with a documented description
+% of what they contain (if relevant for the task at hand---no need to
+% describe the whole \LaTeX{} universe)
+%
+% \item
+% information about the state of the \TeX{} engine (again when
+% relevant), e.g. is called in mmode or vmode or in the output routine or \ldots
+%
+% \item
+% \ldots\ \empty{anything missing?}
+% \end{itemize}
+%
+%
+% \item
+% A socket has documented results/outputs which can be
+%
+% \begin{itemize}
+% \item
+% what kind of data it should write to the current list (if that
+% is part of its task)
+%
+% \item
+% what kind of registers and other 2e/expl3 data stores it should
+% modify and in what way
+%
+% \item
+% what kind of state changes it should do (if any)
+%
+% \item
+% \emph{\ldots\ anything else?}
+% \end{itemize}
+%
+% \item
+%
+% At any time a socket has one block of code (a plug \iffalse(\fi:-)\,)
+% associated with it. Such code is itself named and the association
+% is done by linking the socket name to the code name (putting a
+% plug into the socket).
+%
+% \item
+%
+% The name of a plug consists of ASCII letters \texttt{[a-z]},
+% \texttt{[A-Z]}, \texttt{[0-9]}, \texttt{[-/@]} only.
+%
+% \item
+% Socket plug names have to be unique within on a per socket basis,
+% but it is perfectly allowed (and sensible in some cases) to use
+% the same plug name with different sockets (where based on the
+% sockets' purposes, different actions may be associated with the plug
+% name). For example \plug{noop} is a plug name declared for every
+% socket, yet it action \enquote{grab the socket inputs and throw
+% them away} obviously differs depending on how many inputs the
+% socket has.
+%
+% \item
+%
+% When declaring a plug it is stated for which socket it is meant
+% (i.e., its code can only be used with that socket). This means
+% that the same plug name can be used with different sockets
+% referring to different code in each case.
+%
+% \item
+% Configuration of a socket can only be done by
+% linking different code to it. Nevertheless the code linked to it can
+% provide its own means of configuration (but this is outside of the
+% spec).
+%
+% \item
+% Technically execution of a socket (\cs{UseSocket}) involves
+%
+% \begin{itemize}
+% \item
+% doing any house keeping (like writing debugging info, \ldots);
+%
+% \item
+% looking up the current code association (what plug is in the socket);
+%
+% \item
+% executing this code which will pick up the mandatory arguments
+% (happens at this point, not
+% before), i.e., it is like calling a csname defined with
+% \begin{verbatim}
+% \def\foo#1#2...{...#1...#2...}
+% \end{verbatim}
+%
+% \item
+% do some further house keeping (if needed).
+% \end{itemize}
+%
+% \item
+% A socket is typically only used in one place in code, but this is not
+% a requirement, i.e., if the same operation with the same inputs need
+% to be carried out in several places the same named socket can be used.
+%
+% \end{itemize}
+%
+%
+%
+%
+%
+% \subsubsection{Command syntax}
+%
+% We give both the \LaTeXe{} and the L3 programming layer command names.
+%
+% \begin{function}{\NewSocket,\socket_new:nn}
+% \begin{syntax}
+% \cs{NewSocket} \Arg{socket-name}\Arg{number-of-inputs}
+% \cs{socket_new:nn}\Arg{socket-name}\Arg{number-of-inputs}
+% \end{syntax}
+% Declares a new socket with name \meta{socket-name} having
+% \meta{number-of-inputs} inputs. There is automatically a
+% plug \plug{noop} declared for it, which does nothing, i.e., it gobbles
+% the socket inputs (if any). This is made the default plug except for
+% sockets with one input which additionally define the plug
+% \plug{identity} and assign that as their default.
+%
+% This \plug{identity} plug simply returns the socket input without
+% its outer braces.
+% The use case for this plug are situations like this:
+% \begin{quote}
+% \cs{UseSocket}\verb={tagsupport/footnote}=\Arg{code}
+% \end{quote}
+% If tagging is not active and the socket contains the plug \plug{identity}
+% then this returns \meta{code} without the outer braces and to
+% activate tagging all that is necessary is to change the plug to
+% say \plug{tagpdf} so
+% that it surrounds \meta{code} by some tagging magic.
+% This is the most common use case for sockets with one input, which
+% is why they have this special default.
+%
+% The socket documentation should describe its purpose, its inputs and the
+% expected results as discussed above.
+%
+% The declaration is only allowed at top-level, i.e., not inside a group.
+% \end{function}
+%
+%
+% \begin{function}{\NewSocketPlug,\socket_new_plug:nnn,\socket_set_plug:nnn}
+% \begin{syntax}
+% \cs{NewSocketPlug} \Arg{socket-name}\Arg{socket-plug-name}\Arg{code}
+% \cs{socket_new_plug:nnn}\Arg{socket-name}\Arg{socket-plug-name}\Arg{code}
+% \cs{socket_set_plug:nnn}\Arg{socket-name}\Arg{socket-plug-name}\Arg{code}
+% \end{syntax}
+% Declares a new plug for socket \meta{socket-name} that runs
+% \meta{code} when executing. It complains if the plug was already
+% declared previously.
+%
+% The form \cs{socket_set_plug:nnn} changes an existing plug. As
+% this should normally not be necessary, we currently have only an L3
+% layer name for the few cases it might be useful.
+%
+% The declarations can be made inside a group and obey scope, i.e.,
+% they vanish if the group ends.
+% \end{function}
+%
+%
+% \begin{function}{\AssignSocketPlug,\socket_assign_plug:nn}
+% \begin{syntax}
+% \cs{AssignSocketPlug} \Arg{socket-name}\Arg{socket-plug-name}
+% \cs{socket_assign_plug:nn}\Arg{socket-name}\Arg{socket-plug-name}
+% \end{syntax}
+% Assigns the plug \meta{socket-plug-name} to the socket
+% \meta{socket-name}. It errors if either socket or plug is not
+% defined.
+%
+% The assignment is local, i.e., it obeys scope.
+% \end{function}
+%
+%
+% \begin{function}{\UseSocket,\socket_use:nw,\socket_use:n,\socket_use:nn,\socket_use:nnn,\socket_use:nnnn}
+% \begin{syntax}
+% \cs{UseSocket} \Arg{socket-name}
+% \cs{socket_use:nnn}\Arg{socket-name} \Arg{socket-arg\textsubscript{1}} \Arg{socket-arg\textsubscript{2}}
+% \end{syntax}
+% Executes the socket \meta{socket-name} by retrieving the
+% \meta{code} of the current plug assigned to the socket. This is
+% the only command that would appear inside macro code in packages.
+%
+% For performance reasons there is no explicit check that the socket
+% was declared!
+%
+% The different L3 programming layer commands are really doing the
+% same thing: they grab as many arguments as defined as inputs for the socket
+% and then pass them to the plug. The different names are only there
+% to make the code more readable, i.e., to indicate how many
+% arguments are grabbed in total (note that no runtime check is made to
+% verify that this is actually true). We only provide them for
+% sockets with up to 3 inputs (most likely those with zero or one input would
+% have been sufficient). If you happen to have a socket with more
+% inputs, use \cs{socket_use:nw}.
+% \end{function}
+%
+%
+% \begin{function}{\ShowSocket,\LogSocket,\socket_show:n,\socket_log:n}
+% \begin{syntax}
+% \cs{ShowSocket} \Arg{socket-name}
+% \cs{socket_show:n}\Arg{socket-name}
+% \end{syntax}
+% Displays information about the socket \meta{socket-name} and its
+% state then stops and waits for further instructions --- at the
+% moment some what rudimentary.
+%
+% \cs{LogSocket} and \cs{socket_log:n} only differ in that they don't stop.
+% \end{function}
+%
+%
+% \begin{function}{\DebugSocketsOn,\DebugSocketsOff,
+% \socket_debug_on:,\socket_debug_off:}
+% \begin{syntax}
+% \cs{DebugSocketsOn} \ldots\ \cs{DebugSocketsOff}
+% \end{syntax}
+% Turns debugging of sockets on or off.
+% \end{function}
+%
+% \subsubsection{Rationale for error handling}
+%
+% The errors during the declarations are produced to help with
+% typos---after all, such declarations might be part of a document
+% preamble (not that likely, but possible). However, \cs{UseSocket} is
+% not doing much checking, e.g.,
+% \begin{verbatim}
+% \UseSocket{mispelled-socket}{hello}{world}
+% \end{verbatim}
+% will generate a rather low-level error and then typesets
+% ``{hello}{world}'' because there is no dedicated runtime check if
+% \texttt{mispelled-socket} is a known socket.
+%
+% The reason is that if the misspelling is in the code, then this is a
+% programming error in the package and for speed reasons \LaTeX{} does
+% not repeately make runtime checks for coding errors unless they can or
+% are likely to be user introduced.
+%
+%
+% \MaybeStop{\setlength\IndexMin{200pt} \PrintIndex }
+%
+%
+% \section{The Implementation}
+%
+% The implementation of the socket mechanism should be (partially)
+% redone and we should probably store the different code chunks in
+% a property list so that we can have a decent \cs{ShowSocket}
+% command that shows the available alternatives.\fmi{implement?}
+%
+% \begin{macrocode}
+%<*2ekernel|latexrelease>
+% \end{macrocode}
+%
+% \begin{macrocode}
+\ExplSyntaxOn
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<@@=socket>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\NewModuleRelease{2023/11/01}{ltsockets}
+%<latexrelease> {The~socket~management~system}
+% \end{macrocode}
+%
+%
+%
+% \subsection{Debugging the socket structures}
+%
+% Code and commands in this section are not final, it needs more
+% experimentation to see what kind of tracing information is going to
+% be useful in practice. For now the tracing is mainly meant to be used
+% for code testing and not so much for application testing.
+%
+% It is quite likely that the
+% commands and the behavior of the tracing might change in the
+% future once we gained some experience with it.
+%
+% \begin{macro}{\g_@@_debug_bool}
+% Holds the current debugging state.
+% \begin{macrocode}
+\bool_new:N \g_@@_debug_bool
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\socket_debug_on:,\socket_debug_off:}
+% \begin{macro}{\@@_debug:n, \@@_debug_term:n}
+% \begin{macro}{\@@_debug_gset:}
+% Turns debugging on and off by redefining \cs{@@_debug:n} and
+% \cs{@@_debug_term:n}. By default they do nothing.
+% \begin{macrocode}
+\cs_new_eq:NN \@@_debug:n \use_none:n
+\cs_new_eq:NN \@@_debug_term:n \use_none:n
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \socket_debug_on:
+ {
+ \bool_gset_true:N \g_@@_debug_bool
+ \@@_debug_gset:
+ }
+\cs_new_protected:Npn \socket_debug_off:
+ {
+ \bool_gset_false:N \g_@@_debug_bool
+ \@@_debug_gset:
+ }
+\cs_new_protected:Npn \@@_debug_gset:
+ {
+ \cs_gset_protected:Npx \@@_debug:n ##1
+ { \bool_if:NT \g_@@_debug_bool {##1} }
+ \cs_gset_protected:Npx \@@_debug_term:n ##1
+ { \bool_if:NT \g_@@_debug_bool
+ { \iow_term:x { ^^J [Sockets]~ ==>~ ##1} } }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsection{The L3 layer commands}
+%
+% \begin{macro}{\socket_new:nn}
+%
+% Declaring a socket creates a str to hold the name (a pointer) to the
+% code that should be used when the socket is executed, and an integer to
+% hold the number of inputs of that socket. Initially, an
+% ``empty'' code chunk is created and assigned so the socket
+% does nothing by default other than swallowing its inputs (if any).
+% \begin{macrocode}
+\cs_new_protected:Npn \socket_new:nn #1 #2 {
+ \str_if_exist:cTF { l_@@_#1_plug_str }
+ {
+ \msg_error:nnn { socket } { already-declared } {#1}
+ }
+ {
+% \end{macrocode}
+% We only support declarations on top-level.
+% \begin{macrocode}
+ \int_if_zero:nTF \tex_currentgrouplevel:D
+ {
+ \str_new:c { l_@@_#1_plug_str }
+ \seq_new:c { l_@@_#1_plugs_seq }
+ \int_const:cn { c_@@_#1_args_int } {#2}
+ \socket_new_plug:nnn {#1} { noop } {}
+ \int_compare:nNnTF {#2} = 1
+ {
+ \socket_new_plug:nnn {#1} { identity } {##1}
+ \socket_assign_plug:nn {#1} { identity }
+ }
+ { \socket_assign_plug:nn {#1} { noop } }
+ \@@_debug_term:n
+ { Socket~ '#1'~ declared~ with~ #2~ input(s) }
+ }
+ {
+ \msg_error:nn { socket } { not-top-level }
+ }
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\socket_log:n,\socket_show:n}
+% Show the current state of the socket --- for now this is just a
+% quick draft and should be redone and extended.
+% \begin{macrocode}
+\cs_new_protected:Npn \socket_log:n #1 {
+ \typeout{ Socket~ #1:}
+ \str_if_exist:cTF { l_@@_#1_plug_str }
+ {
+ \typeout{ \@spaces number~ of~ inputs~ =~
+ \int_use:c { c_@@_#1_args_int } }
+ \typeout{ \@spaces available~plugs~ =~
+ \seq_use:cnnn { l_@@_#1_plugs_seq }{,~}{,~}{,~} }
+ \typeout{ \@spaces current~ plug~ =~
+ \str_use:c { l_@@_#1_plug_str } }
+ \typeout{ \@spaces definition~ =~
+ \cs_meaning:c
+ { @@_#1_plug_ \str_use:c { l_@@_#1_plug_str } :w } }
+ \typeout{}
+ }
+ {
+% \end{macrocode}
+% If we are showing a socket it is not an error if it doesn't exist.
+% \begin{macrocode}
+ \typeout { Socket~ is~ not~ declared! }
+ }
+}
+% \end{macrocode}
+% And here the version that stops:
+% \begin{macrocode}
+\cs_new_protected:Npn \socket_show:n #1 {\socket_log:n {#1} \errmessage{}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%
+% \begin{macro}{\socket_new_plug:nnn,\socket_set_plug:nnn}
+%
+% Declaring a code for a socket is just making a definition, taking
+% the number of arguments from the saved int.
+% \begin{macrocode}
+\cs_new_protected:Npn \socket_new_plug:nnn #1#2#3 {
+ \str_if_exist:cTF { l_@@_#1_plug_str }
+ {
+ \cs_if_exist:cTF { @@_#1_plug_#2:w }
+ {
+ \msg_error:nnnn { socket } { plug-already-declared } {#1} {#2}
+ }
+ {
+ \cs_generate_from_arg_count:cNnn
+ { @@_#1_plug_#2:w }
+ \cs_new_protected:Npn
+ { \int_use:c { c_@@_#1_args_int } }
+ {#3}
+% \end{macrocode}
+% This is a new declaration so we add the name to a seq for the
+% debugging info.
+% \begin{macrocode}
+ \seq_put_right:cn { l_@@_#1_plugs_seq } {#2}
+ \@@_debug_term:n
+ { Plug~ '#2'~ for~ socket~ '#1'~ declared. }
+ }
+ }
+ {
+ \msg_error:nnn { socket } { undeclared } {#1}
+ }
+}
+% \end{macrocode}
+% Changing the plug of an existing socket is rather similar, except
+% that we don't have to deal with adding it to the debugging
+% sequence.
+% \begin{macrocode}
+\cs_new_protected:Npn \socket_set_plug:nnn #1#2#3 {
+ \str_if_exist:cTF { l_@@_#1_plug_str }
+ {
+ \cs_if_exist:cTF { @@_#1_plug_#2:w }
+ {
+ \cs_generate_from_arg_count:cNnn
+ { @@_#1_plug_#2:w }
+ \cs_set_protected:Npn
+ { \int_use:c { c_@@_#1_args_int } }
+ {#3}
+ \@@_debug_term:n
+ { Plug~ '#2'~ for~ socket~ '#1'~ changed. }
+ }
+ {
+ \msg_error:nnnn { socket } { plug-undeclared } {#1} {#2}
+ }
+ }
+ {
+ \msg_error:nnn { socket } { undeclared } {#1}
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\socket_assign_plug:nn}
+%
+% Assigning a plug to a socket just changes the name in
+% the socket string. The assignment is local to the current group.
+% \begin{macrocode}
+\cs_new_protected:Npn \socket_assign_plug:nn #1 #2 {
+ \str_if_exist:cTF { l_@@_#1_plug_str }
+ {
+ \cs_if_exist:cTF { @@_#1_plug_#2:w }
+ {
+ \@@_debug_term:n
+ { Replacing~ plug~ '\str_use:c { l_@@_#1_plug_str }'~
+ with~ '#2'~ in~ socket~ '#1'. }
+ \str_set:cn { l_@@_#1_plug_str } {#2}
+ }
+ {
+ \msg_error:nnnn { socket } { plug-undeclared } {#1} {#2}
+ }
+ }
+ { \msg_error:nnn { socket } { undeclared } {#1} }
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\socket_use:nw,\socket_use:n,\socket_use:nn,\socket_use:nnn,\socket_use:nnnn}
+%
+% And using it is more or less a \cs{use:c} so very lightweight. We do not
+% add a runtime check for speed reasons!
+%
+% This command is named
+% \cs{socket_use:nw} because we don't know how many inputs the
+% socket has until we have looked at the socket name (in argument \verb=#1=).
+% But, of course, the developer knows so we also offer a few aliases
+% \cs{socket_use:nn}, etc.\ so that one can indicate the correct number of
+% arguments (socket inputs plus one) in the L3 layer code.
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \socket_use:nw #1 {
+ \@@_debug_term:n
+ { Socket~ '#1'~ containing~ plug~
+ '\str_use:c { l_@@_#1_plug_str }'~ used. }
+ \use:c { @@_#1_plug_ \str_use:c { l_@@_#1_plug_str } :w }
+}
+% \end{macrocode}
+% To make code a bit more readable we also define functions that
+% indicate how many arguments are picked up. However, this is just for
+% code documentation: internally they all do the same and the number
+% of arguments isn't checked by default.
+% \begin{macrocode}
+\cs_new_eq:NN \socket_use:n \socket_use:nw % socket with no inputs
+\cs_new_eq:NN \socket_use:nn \socket_use:nw % socket with one input
+\cs_new_eq:NN \socket_use:nnn \socket_use:nw % socket with two inputs
+\cs_new_eq:NN \socket_use:nnnn \socket_use:nw % socket with three inputs
+% \end{macrocode}
+% The above commands could be changed to check how many inputs
+% the socket is declared with (for example, when checking is in
+% force).
+% \fmi{Implement?}
+% \end{macro}
+%
+%
+%
+%
+%
+%
+%
+% \subsection{Error messages}
+%
+
+%
+% \begin{macrocode}
+\msg_new:nnnn { socket } { already-declared }
+ { Socket~ '#1'~ already~ declared! }
+ { A~ socket~ can~ only~ be~ declared~ once.~ The~ name~ '#1'~ is~
+ already~ taken.~ Use~ \ShowSocket{#1}~ to~ see~ its~ definition. }
+
+\msg_new:nnnn { socket } { undeclared }
+ { Socket~ '#1'~ undeclared! }
+ { You~ tried~ to~ use~ a~ socket~ that~ was~ not~ declared~ before. }
+
+\msg_new:nnnn { socket } { not-top-level }
+ { Sockets~ can~ only~ be~ declared~ at~ top-level! }
+ { It~ is~ not~ allowed~ to~ declare~ sockets~ inside~ a~
+ group.~ Move~ the~ declaration~ to~ the~ top-level. }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\msg_new:nnnn { socket } { plug-already-declared }
+ { Plug~ '#2'~ for~ socket~ '#1'~ already~ declared! }
+ { You~ can't~ change~ an~ existing~ plug~ with~ \NewSocketPlug~ and~ it~
+ is~ normally~ not~ sensible~ to~ do~ so.~ Use~ the~ L3~ programming~
+ layer~ function~ \socket_set_plug:nnn~ if~ you~ really~ have~ to. }
+
+\msg_new:nnnn { socket } { plug-undeclared }
+ { Plug~ '#2'~ for~ socket~ '#1'~ undeclared! }
+ { The~ plug~ name~ is~ unknown.~ Is~ the~ name~ misspelled~ or~ did~ you~
+ intend~ to~ assign~ it~ to~ a~ different~ socket? }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\prop_gput:Nnn \g_msg_module_type_prop { socket } { LaTeX }
+% \end{macrocode}
+%
+%
+%
+%
+% \subsection{The \LaTeXe{} interface commands}
+%
+% \begin{macro}{\NewSocket,\NewSocketPlug,
+% \ShowSocket,\LogSocket,
+% \AssignSocketPlug,\UseSocket,
+% \DebugSocketsOn,\DebugSocketsOff}
+% As we expect that there are existing \LaTeXe{} packages that may
+% want to make use of the socket mechanism, we provide 2e names for
+% most of the commands.
+% \begin{macrocode}
+\cs_new_eq:NN \NewSocket \socket_new:nn
+\cs_new_eq:NN \ShowSocket \socket_show:n
+\cs_new_eq:NN \LogSocket \socket_log:n
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_eq:NN \NewSocketPlug \socket_new_plug:nnn
+\cs_new_eq:NN \AssignSocketPlug \socket_assign_plug:nn
+\cs_new_eq:NN \UseSocket \socket_use:nw
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_eq:NN \DebugSocketsOn \socket_debug_on:
+\cs_new_eq:NN \DebugSocketsOff \socket_debug_off:
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macrocode}
+%
+%<latexrelease>\IncludeInRelease{0000/00/00}{ltsockets}
+%<latexrelease> {The~socket~management~(undo)}%
+%<latexrelease>
+%<latexrelease>\let \NewSocket \@undefined
+%<latexrelease>\let \ShowSocket \@undefined
+%<latexrelease>\let \LogSocket \@undefined
+%<latexrelease>
+%<latexrelease>\let \NewSocketPlug \@undefined
+%<latexrelease>\let \AssignSocketPlug \@undefined
+%<latexrelease>\let \UseSocket \@undefined
+%<latexrelease>
+%<latexrelease>\let \DebugSocketsOn \@undefined
+%<latexrelease>\let \DebugSocketsOff \@undefined
+%<latexrelease>
+%<latexrelease>\EndModuleRelease
+% \end{macrocode}
+%
+% \begin{macrocode}
+\ExplSyntaxOff
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</2ekernel|latexrelease>
+% \end{macrocode}
+%
+% Reset module prefix:
+% \begin{macrocode}
+%<@@=>
+% \end{macrocode}
+%
+%
+% \Finale
+%
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\endinput
+
+
+
+^^A Needed for emacs
+^^A
+^^A Local Variables:
+^^A mode: latex
+^^A coding: utf-8-unix
+^^A End:
+
+
+
diff --git a/macros/latex-dev/base/ltspace.dtx b/macros/latex-dev/base/ltspace.dtx
index a77314b1bd..66841cae38 100644
--- a/macros/latex-dev/base/ltspace.dtx
+++ b/macros/latex-dev/base/ltspace.dtx
@@ -32,7 +32,7 @@
%<*driver>
% \fi
\ProvidesFile{ltspace.dtx}
- [2023/05/26 v1.3p LaTeX Kernel (spacing)]
+ [2023/06/14 v1.3q LaTeX Kernel (spacing)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltspace.dtx}
@@ -1223,9 +1223,24 @@
% \end{macro}
% \end{macro}
%
+% \begin{macro}{\@xobeytab}
+% \changes{v1.3q}{2023/06/14}{Macro added}
+% Equivalent to the space case with the default settings.
% \begin{macrocode}
+%</2ekernel>
+%<latexrelease>\IncludeInRelease{2023/11/01}%
+%<latexrelease> {\@xobeytab}{Obeyed tabs}%
+%<*2ekernel|latexrelease>
+\let\@xobeytab\@xobeysp
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\@xobeytab}{Obeyed tabs}%
+%<latexrelease>\let\@xobeytab\@undefined
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
-%
+% \end{macro}
%
%
% \begin{macro}{\@}
diff --git a/macros/latex-dev/base/ltvers.dtx b/macros/latex-dev/base/ltvers.dtx
index 5b124febd9..5b78c3bc5e 100644
--- a/macros/latex-dev/base/ltvers.dtx
+++ b/macros/latex-dev/base/ltvers.dtx
@@ -115,7 +115,7 @@
{2023-11-01}
%</2ekernel|latexrelease>
%<*2ekernel>
-\def\patch@level{-0}
+\def\patch@level{-1}
% \end{macrocode}
%
% \begin{macro}{\development@branch@name}
diff --git a/macros/latex-dev/base/ltx3info.pdf b/macros/latex-dev/base/ltx3info.pdf
index b29a68a68a..d80998b77c 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 86b5710cf9..4acf824c6b 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 2d417f6b01..aa2de39ace 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 22791a2494..ff7bf49ad1 100644
--- a/macros/latex-dev/base/manifest.txt
+++ b/macros/latex-dev/base/manifest.txt
@@ -145,6 +145,7 @@
% ltcmdhooks.dtx -- Hook management (generic) for commands
% ltpara.dtx -- Hook management for paragraphs
% ltmarks.dtx -- Mark management
+% ltsockets.dtx -- Sockets and plugs management
%
% Standard Classes:
% -----------------
diff --git a/macros/latex-dev/base/modguide.pdf b/macros/latex-dev/base/modguide.pdf
index e03c6e1075..d1f7521e0d 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 84599cd94c..df53f5fa0e 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 4797864d17..79b95b1af0 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 af59f4891a..3efdda8edb 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 0704a46022..aec17314d4 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 4b1b06981a..bb85ca131c 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/source2e.tex b/macros/latex-dev/base/source2e.tex
index 873daebb4d..c538593ddd 100644
--- a/macros/latex-dev/base/source2e.tex
+++ b/macros/latex-dev/base/source2e.tex
@@ -254,6 +254,8 @@ page_precedence "rnaA"
\DocInclude{ltcmdhooks}% Hook management for commands (L3 module)
+ \DocInclude{ltsockets}% Socket and plug management (L3 module)
+
\DocInclude{ltalloc} % Allocation of counters and others.
\DocInclude{ltcntrl} % Program control macros.
@@ -301,6 +303,8 @@ page_precedence "rnaA"
\DocInclude{ltpageno} % Page numbering
\DocInclude{ltxref} % Cross referencing
+
+ \DocInclude{ltproperties} % Extended Cross referencing
\DocInclude{ltmiscen} % Miscellaneous environment definitions.
diff --git a/macros/latex-dev/base/syntonly.pdf b/macros/latex-dev/base/syntonly.pdf
index 58ea87a4a4..c62cd393f7 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.err b/macros/latex-dev/base/tlc2.err
index 5b01ff0513..5c8723a4cb 100644
--- a/macros/latex-dev/base/tlc2.err
+++ b/macros/latex-dev/base/tlc2.err
@@ -1,4 +1,4 @@
-\newcommand\erratafiledate{2023-01-08}
+\newcommand\erratafiledate{2023/01/08}
\def\comando#1{\texttt{\string#1}}
diff --git a/macros/latex-dev/base/tlc2.pdf b/macros/latex-dev/base/tlc2.pdf
index 9e68702dc8..b43f85c4a8 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.err b/macros/latex-dev/base/tlc3.err
index b7e2c1c0fd..81975c34e7 100644
--- a/macros/latex-dev/base/tlc3.err
+++ b/macros/latex-dev/base/tlc3.err
@@ -1,6 +1,4 @@
-\newcommand\erratafiledate{2023-05-30}
-
-\def\comando#1{\texttt{\string#1}}
+\newcommand\erratafiledate{2023/09/01} % needs / not -
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% To produce a printed version of this errata file run this file through
@@ -255,15 +253,21 @@
%
% Specifies the date from which on errata entries should be listed.
%
-% The format is YYYY/MM/DD.
+% The format is YYYY/MM/DD (hyphens are not supported)
%
% The default below ensures that all entries for a particular
% printing are typeset.
%
\renewcommand\erratastartdate{2023/04/01}
+%\renewcommand\erratastartdate{2023/05/30} % for the first digital edition
+% If you own a digital edition (which is more often updated than the
+% print edition) then you can alter the above date to match the date
+% shown at the bottom of the Copyright page --- if it says
+% "First digital release, 2023" then use the date 2023/05/30 above.
+%
%
% \myprinting
%
@@ -306,9 +310,15 @@
\let\u\underline % shortcut for this file
\newcommand\meta[1]{$\langle$\textit{#1\/}$\rangle$}
-\usepackage{textcomp}
+\usepackage{color}
+\newcommand\bl{\color{blue}}
+
+\newcommand\textttu[1]{\texttt{\upshape #1}}
+
+\usepackage{hyperref}
+
+\let\u\underline % needs resetting after hyperref
-\usepackage{url}
\begin{document}
@@ -333,9 +343,16 @@
\end{verbatim}
-\begin{list}{}{\setlength\leftmargin{0cm}\setlength\rightmargin{3cm}}
+\begin{list}{}{\setlength\leftmargin{0cm}%
+ \setlength\rightmargin{3cm}%
+ \setlength\listparindent{1em}}
\item[]
+\tableofcontents
+
+\bigskip
+
+\noindent
This file (\texttt{\jobname.err}) can be found as part of the \LaTeX{}
distribution and its latest version is maintained on the \LaTeX{}
project site at \texttt{https://www.latex-project.org/help/books/\jobname.err}
@@ -350,6 +367,7 @@ are counted from the bottom of the page). The third column shows the
first finder of the problem.
You can customize this list to only show errata related to the printing
+or digital edition
you own by changing the configuration in the file \texttt{\jobname.cfg}.
\begin{center}
@@ -358,11 +376,11 @@ you own by changing the configuration in the file \texttt{\jobname.cfg}.
Any mistake found and reported is a gain for all readers of our book.
For this reason Addison-Wesley and the authors offer a prize (for 5
-periods) to the eligible person who finds the largest
-number of bugs during that period (in case of a draw a random choice
-will be made between all those with the largest number of findings).
-A person can receive at most one prize, ever; errors found by any of
-the authors do not count.
+limited time periods) to the eligible person who finds the largest number of bugs
+during that period (more precisely, it is a lottery among the people
+with the 5 top-most findings up to that point). A person can receive
+at most one prize, ever; errors found by any of the authors do not
+count.
Each prize is a free choice of any single computing book found on the
Addison-Wesley/Pearson web site:
@@ -388,9 +406,9 @@ Due to its size the third edition of \textit{The \LaTeX{} Companion} is printed
as a two-volume set. The digital version, however, is provided as a
single PDF or ePub. This means that a small fraction of the digital
content differs from that of the printed version: there is only a
-single font matter, a single bibliography, and a single index, whereas
+single front matter, a single bibliography, and a single index, whereas
in the printed books these are separated out. However, all versions share the main
-matter (down to the page numbering) so most of the errata applies to
+matter (down to the page numbering) so most of the errata apply to
all versions, but a few only to the digital and some only to the
printed version. Thus, we end up with three separate lists.
@@ -403,21 +421,34 @@ printed version. Thus, we end up with three separate lists.
%<--------------------------
\newcommand\BibTeX{\textsc{Bib}\TeX}
-\newcommand\cs[1]{\texttt{\textbackslash #1}}
+\newcommand\cs[1]{\texttt{\upshape\textbackslash #1}}
\newcommand\env[1]{\texttt{#1}}
\newcommand\pkg[1]{\textsf{#1}}
-\section*{Errata for the print version (not applicable to the digital version)}
+\section{Errata for the print version (not applicable to the digital version)}
The printed books differ from the digital version in that the
-bibliography is split across both volumes (with a few repeats) and that
-the font matter of each volume has its own table of contents and list
+bibliography is split across both volumes (with a few repeats) and
+the front matter of each volume has its own table of contents and list
of figures and tables. Therefore these parts have different page
numbers and you will see similar errata entries for both print and
digital differing only in that respect.
\begin{erratalist}
+\CHAPTER{General}
+
+\erroronpage{}{}{FMi}{2023/07/30}{}
+
+Text or graphics typeset in the the spot color (blue) are not always
+perfectly aligned. This is a side-effect of the printing technology.
+On most pages everything is fine, but occasionally blue text in a
+paragraph seems to be slightly above or below the baseline or blue
+text in tables appears slightly misaligned horizontally. It differs
+from book to book (and therefore not recorded in this errata) and
+can't be controlled by the authors, unfortunately.
+
+
\CHAPTER{Front matter (Part I)}
\erroronpage{I-ix\ldots I-xvi}{}{FMi}{2023/04/04}{s}
@@ -510,7 +541,7 @@ Publishing \> Publishing\u{,}
%<--------------------------
-\section*{Errata for the digital version (not applicable to the print version)}
+\section{Errata for the digital version (not applicable to the print version)}
All known errors to the digital version have already been incorporated in the product as distributed.
@@ -526,7 +557,7 @@ All known errors to the digital version have already been incorporated in the pr
%<--------------------------
-\section*{Errata common to the print and digital versions}
+\section{Errata common to the print and digital versions}
The main matter is identical (also in page numbers) in the print and
the digital versions. Therefore most errata entries appear in this
@@ -537,48 +568,89 @@ section.
\CHAPTER{General}
-\erroronpage{}{}{FMi}{2023/04/04}{s}
+\erroronpage{}{}{FMi}{2023/04/04}{}
Some corrections result in index changes. These are not tracked here;
the index is always fully regenerated for new printings.
+\erroronpage{}{}{MJo/FMi}{2023/07/07}{}
+
+ There are a dozen occurrences of the word \u{rôle} throughout the book,
+ which is more commonly spelled \u{role}. However, this is not wrong
+ but is the somewhat dated form used mostly in British
+ English. Personally, I prefer the version with accent (as does Don
+ Knuth) so it is deliberate and will not change.
+
\CHAPTER{Chapter 1 --- Introduction}
\erroronpage{I-5}{para 4, l.4}{kb}{2023/04/04}{s}
\u{of} the bugs \> \u{with} the bugs
-\\ Already corrected in the digital version.
+
\erroronpage{I-5}{para 5, l.5}{kb}{2023/04/04}{s}
not least \> \u{but} not least
-\\ Already corrected in the digital version.
+
\CHAPTER{Chapter 2 --- The Structure of a \LaTeX{} Document}
\erroronpage{I-34}{l.-1}{FMi}{2023/04/04}{s}
Moved first line of page 35 to 34.
-\\ Already corrected in the digital version.
+
\erroronpage{I-35}{l.1}{FMi}{2023/04/04}{s}
Moved first line of page 35 to 34.
-\\ Already corrected in the digital version.
+
\erroronpage{I-113}{listing}{FMi}{2023/05/14}{s}
Situation is the same in the 2023 distributions; listing output updated.
-\\ Already corrected in the digital version.
+
+
+\erroronpage{I-117}{l.-5}{BeB}{2023/07/25}{s}
+\textit{latexrelease} \> \texttt{latexrelease}
\CHAPTER{Chapter 3 --- Basic Formatting Tools -- Paragraph \ldots}
+\erroronpage{I-160}{para -2, l.1}{BeB}{2023/07/14}{s}
+Repeated word: keys \u{keys} \> keys
+
+\erroronpage{I-163}{para 2, l.2}{FMi}{2023/07/26}{s}
+as we did \u{above}. \> as we did \u{in Example 3-3-14 below}.
+
+\erroronpage{I-163}{para 3, margin}{FMi}{2023/07/26}{s}
+Add a marginal note: \u{No warning if another \LaTeX{} run is necessary!}
+
+\erroronpage{I-163}{example 3-3-14}{BeB}{2023/07/25}{s}
+Output of example misses the page numbers in acronym list \> Run example 3 times (not only twice---there is no warning)
+
+
\CHAPTER{Chapter 4 --- Basic Formatting Tools -- Larger \ldots}
+\erroronpage{I-323}{Table 4.4, left column}{BeB}{2023/07/25}{s}
+Typo: Assembler (\u{N}otorola68k, x86masm) \> \\ Assembler (\u{M}otorola68k, x86masm)
+% Matlab \> Matlab \u{(empty, 5.1)}
+% könnte auch aktualisiert werden, steht aber in Version 1.8d nicht drin
+
\CHAPTER{Chapter 5 --- The Layout of the Page}
\CHAPTER{Chapter 6 --- Tabular Material}
+\erroronpage{I-489}{para 1, l.3}{EOl}{2023/07/30}{s}
+Change:
+to \u{additionally} load \textsf{longtable} or \textsf{supertabular} \u{prior} to \>
+to load \textsf{longtable} or \textsf{supertabular} \u{in addition} to
+
+\erroronpage{I-490}{footnote}{EOl}{2023/07/30}{s}
+Replace footnote text with \>
+If you forget this, you either get an empty cell or, if parts of the
+text can be interpreted as a value, a somewhat ``random'' number and
+the rest is dropped. For example, \texttt{31 December 2022} would
+result in ``31.00'', which is probably not desired.
+
\CHAPTER{Chapter 7 --- Mastering Floats}
@@ -593,54 +665,274 @@ The example uses \verb*/left color=red!20/ but this is not really
visible if the red is turned into some gray value in the book (which
is then made even lighter through \texttt{!20}). So it is better to
start from full red, i.e., \> \verb*/left color=red/ instead.
-\\ Already corrected in the digital version.
+
+
+
+\erroronpage{I-644}{syntaxbox for \cs{foreach}}{BeB}{2023/07/14}{s}
+superfluous ``in'': \ldots\{\textsl{commands}\} \u{in} \> \ldots\{\textsl{commands}\}
+
+
\CHAPTER{Chapter 9 --- Font Selection and Encodings}
-
+
+
+\erroronpage{I-688}{para -2, l. 1}{BeB}{2023/08/13}{s}
+acronym PSNFSS not explained: PSNFSS \> PostScript New Font Selection Scheme (PSNFSS)
+
+
\erroronpage{I-669}{exa 9-3-11}{FMi}{2023/04/04}{s}
Changed line breaks in example.
+\erroronpage{I-681}{para 2, l.1}{BeB}{2023/07/14}{s}
+Missing space: Theproblem \> The problem
+
\erroronpage{I-708}{listing}{FMi}{2023/05/14}{s}
Situation is the same in the 2023 distributions; listing output updated.
-\\ Already corrected in the digital version.
+
+\erroronpage{I-759}{l.1}{BeB}{2023/08/20}{s}
+in the range of 0000 to \u{00FF} \> in the range of 0000 to \u{007F}
\CHAPTER{Chapter 10 --- Text and Symbol Fonts}
+
+\erroronpage{II-5}{table 10.1, l. 5}{BeB/FMi}{2023/08/13}{s}
+ official \u{companion} family name \> \u{related} official \u{font} family name
+
+\erroronpage{II-5}{para -1, l.2}{FMi}{2023/08/15}{s}
+
+then this structure is repeated as often as necessary. \>
+then this structure is repeated \u{for the related font families} as often as necessary.
+
+
+\erroronpage{II-24}{para 3, l. -2}{BeB}{2023/08/13}{s}
+There is no slanted shape in Grande Mono: \\
+\u{\textsl{naïve}} \> \u{\textsl{\bl naïve}}
+
+
+\erroronpage{II-25}{para -4, margin}{BeB}{2023/08/13}{s}
+Open Type font is available: \\
+\u{— no Open Type —} \> \u{Lucida Handwriting OT}
+
+\erroronpage{II-25}{para -2, l.-2}{BeB}{2023/08/13}{s}
+There are no italic blackletters: \\
+\textit{phœnix's official rôle}\> \textit{\bl phœnix's official rôle}
+
+\erroronpage{II-28}{table 10.14, l. 3}{BeB}{2023/08/13}{s}
+Inconsistent order: sl, l \> l, sl
+
+\erroronpage{II-28}{table 10.14, lines 7 + 19}{BeB}{2023/08/13}{s}
+semi-bold twice, extra-bold missing: sbsc, bsc, \u{sbsc} \> sbsc, bsc, \u{ebsc}
+
+\erroronpage{II-28}{table 10.14, lines 13 + 25}{BeB}{2023/08/13}{s}
+semi-bold twice, extra-bold missing: sbec, bec, \u{sbec} \> sbec, bec, \u{ebec}
+
+\erroronpage{II-29}{table 10.15, lines 7}{BeB}{2023/08/13}{s}
+semi-bold twice, extra-bold missing: sbsc, bsc, \u{sbsc} \> sbsc, bsc, \u{ebsc}
+
+\erroronpage{II-29}{table 10.15, l. 10}{BeB}{2023/08/13}{s}
+semi-bold twice, extra-bold missing: sbc, bc, \u{sbc} \> sbc, bc, \u{ebc}
+
+\erroronpage{II-29}{table 10.15, l.13}{BeB}{2023/08/13}{s}
+semi-bold twice, extra-bold missing: sbec, bec, \u{sbec} \> sbec, bec, \u{ebec}
+
+
+\erroronpage{II-34}{table 10.20}{FMi}{2023/08/15}{s}
+Add table note:
+%
+\textit{\textttu{k} (black) is a nonstandard series name for \textttu{eb} (extra
+bold) or in some families for \textttu{ub} (ultra bold).}
+
+\erroronpage{II-40}{table 10.24}{FMi}{2023/08/15}{s}
+In table note: \textit{Unfortunately, \u{\texttt{sco}}} \> \textit{Unfortunately, \u{\textttu{sco}}}
+
+
+\erroronpage{II-50}{font sample Cambria}{FMi}{2023/08/14}{s}
+
+Because of problems with the font names, the Cambria family currently requires a \texttt{Cambria.fontspec} file
+(possibly only temporary) when used with Lua\TeX{} with the following content:
+\begin{verbatim}
+\defaultfontfeatures[Cambria]{%
+ UprightFont =cambria.ttc,
+ BoldFont = cambriab.ttf,
+ ItalicFont = cambriai.ttf,
+ BoldItalicFont = cambriaz.ttf}
+\end{verbatim}
+Without it, the bold fonts are not correctly set up, which is why
+\textbf{almost anything} is not in bold and \textbf{Fields} is not typeset in
+bold small caps in the sample even though Cambria supports these typefaces.
+
+
+\erroronpage{II-61}{table 10.48}{FMi}{2023/08/15}{s}
+Add table note:
+%
+\textit{Unfortunately, \textttu{sco} is a nonstandard shape name for
+\textttu{scsl}; thus, low-level shape commands are needed to access it.}
+
+\erroronpage{II-62}{table 10.50}{FMi}{2023/08/15}{s}
+Add table note:
+%
+\textit{Unfortunately, \textttu{sco} is a nonstandard shape name for
+\textttu{scsl}; thus, low-level shape commands are needed to access it.}
+
+\erroronpage{II-63}{table 10.51}{FMi}{2023/08/15}{s}
+Table moved to page II-62 for better pagination.
+
+\erroronpage{II-65}{para 1, l.1}{YvH}{2023/08/20}{s}
+ Slap \> Slab
+
+\erroronpage{II-66}{Unicode box}{DFl}{2023/08/03}{s}
+ OpenType fonts for the Concrete family do exist.
+
+ Therefore changed the text to
+ \begin{quote}
+ OpenType fonts of the family for use in Unicode engines do exist. They offer additional characters
+ and also true \textbf{bold} and \textbf{\itshape bold italic} shapes.
+ \end{quote}
+ and moved it down after the discussion of missing bold fonts.
+
+\erroronpage{II-66}{table 10.55}{FMi}{2023/08/03}{s}
+ Change: \u{---no OpenType---} \> \u{CMU Concrete}
+
+ Added line showing: \u{\texttt{b}\qquad\texttt{n, it}}
+ and the text \u{---Not available with pdf\TeX, only in Unicode engines---}
+
+\erroronpage{II-66}{1st font example}{FMi}{2023/08/03}{s}
+ Change: \u{---no OpenType---} \> \u{CMU Concrete}
+
+\erroronpage{II-66}{2nd font example}{FMi}{2023/08/03}{s}
+ Added (in margin info): \u{---only OT1---}
+
+\erroronpage{II-71}{para 1, l.1}{BeB}{2023/08/13}{s}
+ub should be upright: \verb+\fontseries{+\u{\textsl{ub}}\verb+}+ \> \verb+\fontseries{ub}+
+
+
+\erroronpage{II-71}{para 2, l.5}{YFu}{2023/07/25}{s}
+\u{Akira Kobayashi} should be written in Japanese style \> \u{KOBAYASHI Akira}\\
+Also corrected in the index.
+
+\erroronpage{II-75}{table 10.64}{FMi}{2023/08/15}{s}
+Add table note:
+%
+\textit{Unfortunately, \textttu{sco} is a nonstandard shape name for
+\textttu{scsl}; thus, low-level shape commands are needed to access it.}
+
+
+\erroronpage{II-76,77}{both font examples}{BeB}{2023/08/13}{s}
+Helvetica and its clones do not have true italics but instead an
+oblique/slanted face (despite the fact that the internal font
+information claims it is ``italic''). For this reason the blue
+text in both Helvetica examples should be as follows:
+
+ \textsl{\bl naïve} vis-à-vis the dæmonic \textit{phœnix's official rôle} \> \\
+ \textsl{naïve} vis-à-vis the dæmonic \textit{\bl phœnix's official rôle}
+
+
+\erroronpage{II-86}{table 10.74, l.4}{FMi}{2023/08/15}{s}
+
+It's weights not widths:\\
+\u{S}ome nonstandard \u{widths} \> \u{Also s}ome nonstandard \u{weights}
+
+
+\erroronpage{II-86}{table 10.74}{FMi}{2023/08/15}{s}
+Add table note:
+%
+\textit{Unfortunately, the font family uses the nonstandard series
+ names \textttu{t} (thin) and \textttu{k} (black) instead of the
+ standard series names \textttu{ul} (ultra light) and \textttu{ub}
+ (ultra bold). The \textttu{mb} (medium) is halfway between the
+ standard \textttu{m} and \textttu{sb} and does not fit into the NFSS
+ naming conventions. It can serve as a replacement for \textttu{m},
+ e.g., via \cs{DeclareFontSeriesDefault}.}
+
+
+
+\erroronpage{II-91}{l. -1}{BeB}{2023/08/13}{s}
+In the DejaVu Sans Mono Example add: \texttt{OIl or 011?}
+
+
+
+\erroronpage{II-102}{para -4, margin}{BeB}{2023/08/13}{s}
+Change: \u{— no Open Type —} \> \u{Lucida Handwriting OT}
+
+
+\erroronpage{II-104}{para -1, l.2}{FMi}{2023/08/13}{s}
+
+Footnote added after: \u{Unicode characters}
+\begin{quote}
+ However, strangely enough this only works in pdf\TeX{} and \emph{not} in Unicode engines!
+\end{quote}
+
+\erroronpage{II-105}{para 1 replaced}{FMi/BeB}{2023/08/13}{s}
+
+The yfonts have a suprising feature: you can use the Unicode
+characters {ÄÖÜäöüß} in pdf\TeX{}, but this is not possible in
+Unicode engines! The first paragraph was therefore replaced to
+clarify this. The new text is:
+\begin{quote}
+ The next example shows the various ligatures. With pdf\TeX{} one can
+ use the Unicode characters \texttt{ÄÖÜäöüß} directly and only needs
+ the ``{short s}'' ligature. However, due to the special font
+ encoding this \emph{does not work} in Unicode engines\,---\,with
+ these engines you have to enter the accents as ligatures or \LaTeX{}
+ commands.
+\end{quote}
+
+
+\erroronpage{II-106}{para -3, l. 1}{BeB}{2023/08/13}{s}
+Acronym GFS not explained: Greek Font Society \> Greek Font Society (GFS)
+
+
+\erroronpage{II-107}{exa 10-11-1}{FMi}{2023/08/14}{s}
+
+The Cambria fonts currently require a \texttt{Cambria.fontspec} file
+(possibly temporary) when used with Lua\TeX{} --- see errata on page II-50.
+Without it, the bold fonts are not correctly set up, which is why they are
+not showing in the example.
+
+\erroronpage{II-110}{exa 10-12-1}{FMi}{2023/08/14}{s}
+
+The Cambria fonts currently require a \texttt{Cambria.fontspec} file
+(possibly temporary) when used with Lua\TeX{} --- see errata on page II-50.
+Without it, the bold fonts are not correctly set up, which is why they are
+not showing in the example.
+
+
+
\erroronpage{II-114}{table 10.89}{FMi}{2023/04/04}{s}
Added missing \texttt{U+00Fx} line.
There was a bug in code generating it.
-\\ Already corrected in the digital version.
+
\erroronpage{II-117}{table 10.92}{FMi}{2023/04/04}{s}
Added missing \texttt{U+00Fx} line.
There was a bug in code generating it.
-\\ Already corrected in the digital version.
+
\erroronpage{II-121}{table 10.96}{FMi}{2023/04/04}{s}
Added missing \texttt{U+00Fx} line.
There was a bug in code generating it.
-\\ Already corrected in the digital version.
+
\erroronpage{II-122}{table 10.98}{FMi}{2023/04/04}{s}
Added missing \texttt{U+00Fx} line.
There was a bug in code generating it.
-\\ Already corrected in the digital version.
+
\erroronpage{II-122}{table 10.99}{FMi}{2023/04/04}{s}
Added missing \texttt{U+00Fx} line.
There was a bug in code generating it.
-\\ Already corrected in the digital version.
+
\erroronpage{II-123}{table 10.100}{FMi}{2023/04/04}{s}
Added missing \texttt{U+00Fx} line.
There was a bug in code generating it.
-\\ Already corrected in the digital version.
+
\erroronpage{II-124}{table 10.103}{FMi}{2023/04/04}{s}
Added missing \texttt{U+00Fx} line.
There was a bug in code generating it.
-\\ Already corrected in the digital version.
+
@@ -652,44 +944,48 @@ package, \pkg{amsmath}, which \u{makes} \ldots
\>\\
\u{In the early nineties the} American Mathematical Society (AMS)
\u{provided} a major package, \pkg{amsmath}, which \u{made} \ldots
-\\ Already corrected in the digital version.
+
\erroronpage{II-129}{para -3, l.1}{bb/FMi}{2023/04/04}{s}
The principal documentation for these packages
\>\\
The principal documentation for these \u{two} packages
-\\ Already corrected in the digital version.
+
\erroronpage{II-129}{para -1, l.3}{bb}{2023/04/04}{s}
\u{lot} additions \> \u{many} additions
-\\ Already corrected in the digital version.
+
\erroronpage{II-132}{table 11.1}{bb/FMi}{2023/04/04}{s}
Also mention \env{alignat}, \env{alignat*}, and \env{alignedat}.
-\\ Already corrected in the digital version.
+
\erroronpage{II-133}{para 4,l.2}{bb/FMi}{2023/04/04}{s}
Add:
Furthermore, they move the equation tag out of the way if it would
otherwise overprint the formula.
-\\ Already corrected in the digital version.
+
+
+
+\erroronpage{II-133}{para. -3, l. -1}{BeB}{2023/08/13}{s}
+Wrong reference: Section 11.2.\u{10} \> 11.2.\u{11}
\erroronpage{II-138}{heading}{bb/FMi}{2023/04/04}{s}
Multiple alignments: \env{align} \u{and \env{flalign}}
\>
Multiple alignments: \env{align}\u{, \env{flalign}, and \env{alignat}}
-\\ Already corrected in the digital version.
+
\erroronpage{II-138}{}{FMi}{2023/04/04}{s}
Moved para from 139 to end of this page.
-\\ Already corrected in the digital version.
+
\erroronpage{II-139}{para 1}{FMi}{2023/04/04}{s}
Moved para back to page 138.
-\\ Already corrected in the digital version.
+
\erroronpage{II-139}{bottom}{FMi}{2023/04/04}{s}
Add:
@@ -703,34 +999,34 @@ it does not add any spaces between the pairs, e.g.,
\begin{alignat}{3} x &= y &\qquad X &= Y &\qquad a &= b+c \\ ...
\end{verbatim}
As usual, equation numbers can be altered with \cs{tag} or suppressed with \cs{notag}.
-\\ Already corrected in the digital version.
+
\erroronpage{II-140}{para 1, l.2}{bb/FMi}{2023/04/04}{s}
Add:
Do not forget to reset \cs{minalignsep} if you change it in this manner.
-\\ Already corrected in the digital version.
-\erroronpage{II-140}{para 2, l.4}{bb/FMi}{2023/04/04}{s}
+
+\erroronpage{II-140}{para 2, l.4}{bb/FMi}{2023/08/16}{s}
Add:
You can think of them as subsidiary environments that can be used
-within any of the display environments discussed so far (below we use
-them inside equation).
-\\ Already corrected in the digital version.
+within any of the display environments discussed so far. (Below we use
+them inside equation.)
+
\erroronpage{II-140}{para -1}{FMi}{2023/04/04}{s}
Paragraph moved to page 141.
-\\ Already corrected in the digital version.
+
\erroronpage{II-141}{}{FMi}{2023/04/04}{s}
One paragraph moved over from page 140.
-\\ Already corrected in the digital version.
+
\erroronpage{II-144}{para 2, l.-3}{FMi}{2023/04/04}{s}
the issue \> the \u{spacing} issue
-\\ Already corrected in the digital version.
+
\erroronpage{II-145}{para 2, l.1}{bb/FMi}{2023/04/04}{s}
Add:
@@ -738,47 +1034,270 @@ Add:
Another problem is that an empty line introduces an unwanted break
point in front of the display, thus \cs{predisplaypenalty} is no
longer honored.
-\\ Already corrected in the digital version.
+\erroronpage{II-167}{para. 3, l. -2}{BeB}{2023/08/13}{s}
+option\u e \> option\u{s}
+
+
+\erroronpage{II-178}{table 11.3, l.10}{EOl}{2023/07/30}{s}
+ Cross-\u{produce} tensor \> Cross-\u{product} tensor
+
+\erroronpage{II-178}{Tab. 11.3, l.10}{BeB}{2023/08/13}{s}
+in the description column: \u{array}-symbol-arrow \> \u{arrow}-symbol-arrow
+
+
+
+
+
\CHAPTER{Chapter 12 --- Fonts in Formulas}
\erroronpage{II-225}{heading}{FMi}{2023/04/04}{s}
Chapter title not properly capitalized.
-\\ Already corrected in the digital version.
+
+
+\erroronpage{II-229}{para -3, l.1}{BeB}{2023/08/15}{s}
+for Lucida fonts \> Lucida \u{and Cambria} fonts
+
+\erroronpage{II-274}{exa 12-18-fig}{FMi}{2023/08/14}{s}
+
+The Cambria fonts currently require a \texttt{Cambria.fontspec} file
+(possibly temporary) when used with Lua\TeX{} --- see errata on page II-50.
+Without it, the bold fonts are not correctly set up, which is why they are
+missing in the section heading of the example.
+
\erroronpage{II-261}{para 3, l.3}{FMi}{2023/05/26}{s}
Yoda spoke it seems: \ldots \u{and compare we should} \>
\ldots \u{and you should compare}
-\\ Already corrected in the digital version.
+
+
+\erroronpage{II-286}{fig. 12-36}{FMi}{2023/08/21}{s}
+
+Heading is not bold because of an error in the distributed
+\texttt{.fontspec} file for this family. This needs to be corrected
+in the NewComputerModern distribution and maybe also in the
+\pkg{fontspec} package itself. A \texttt{NewCM10-Regular.fontspec}
+file that works could look like this:
+\begin{verbatim}
+\defaultfontfeatures[NewCM10-Regular]{
+ Extension = .otf ,
+% Can't use NewCM10-Regular here (or we get a fontspec error).
+% Doesn't matter in this case, but looks like a fontspec issue.
+ UprightFont = NewCM08-Regular ,
+ UprightFeatures = {
+ SizeFeatures = {
+ {Size = -8 , Font = NewCM08-Regular} ,
+ {Size = 8- , Font = NewCM10-Regular} ,
+ },
+ },
+% Same here:
+ SlantedFont = NewCM08-Regular ,
+ SlantedFeatures = {
+ SizeFeatures = {
+ {Size = -8 , Font = NewCM08-Regular} ,
+ {Size = 8- , Font = NewCM10-Regular} ,
+ },
+ FakeSlant=0.25,
+ },
+ ItalicFont = NewCM10-Italic ,
+ ItalicFeatures = {
+ SizeFeatures = {
+ {Size = -8 , Font = NewCM08-Italic} ,
+ {Size = 8- , Font = NewCM10-Italic} ,
+ },
+ },
+ BoldFont = NewCM10-Bold ,
+ BoldItalicFont = NewCM10-BoldItalic ,
+ BoldSlantedFont = NewCM10-Bold ,
+ BoldSlantedFeatures = { FakeSlant=0.25 },
+ SmallCapsFeatures = { Numbers=OldStyle },
+}
+\end{verbatim}
+
+
+\erroronpage{II-286}{fig. 12-36}{FMi}{2023/08/21}{s}
+
+Change in title: \u{Mathematical} typesetting \> \u{Math} typesetting
+
+
+\erroronpage{II-286}{fig. 12-37}{FMi}{2023/08/21}{s}
+
+Heading is not bold because of an error in the distributed
+\texttt{.fontspec} file for this family. This needs to be corrected
+in the NewComputerModern distribution and maybe also in the
+\pkg{fontspec} package itself. A \texttt{NewCM10-Book.fontspec}
+file that works could look like this:
+\begin{verbatim}
+\defaultfontfeatures[NewCM10-Book]{
+ Extension = .otf ,
+ UprightFont = NewCM08-Book ,
+ UprightFeatures = {
+ SizeFeatures = {
+ {Size = -8 , Font = NewCM08-Book} ,
+ {Size = 8- , Font = NewCM10-Book} ,
+ },
+ },
+ SlantedFont = NewCM08-Book ,
+ SlantedFeatures = {
+ SizeFeatures = {
+ {Size = -8 , Font = NewCM08-Book} ,
+ {Size = 8- , Font = NewCM10-Book} ,
+ },
+ FakeSlant=0.25,
+ },
+ ItalicFont = NewCM10-BookItalic ,
+ ItalicFeatures = {
+ SizeFeatures = {
+ {Size = -8 , Font = NewCM08-BookItalic} ,
+ {Size = 8- , Font = NewCM10-BookItalic} ,
+ },
+ },
+ BoldFont = NewCM10-Bold ,
+ BoldItalicFont = NewCM10-BoldItalic ,
+ BoldSlantedFont = NewCM10-Bold ,
+ BoldSlantedFeatures = { FakeSlant=0.25 },
+ SmallCapsFeatures = { Numbers=OldStyle },
+}
+\end{verbatim}
+
+\erroronpage{II-286}{fig. 12-37}{FMi}{2023/08/21}{s}
+Change title to more or less fit the width of the sample:\\
+\hspace*{1em}\u{Mathematical} typesetting with NewComputerModern \> \\
+\hspace*{1em}\u{Math} typesetting with NewComputerModern \u{Book}\\
+
+
+\erroronpage{II-288}{para 3, l.-1}{BeB}{2023/08/20}{s}
+Typo and spurious comma: series\u{, though} substitution. \> series \u{through} substitution.
+
+
+\erroronpage{II-295}{par -2, l.-1}{BeB}{2023/08/20}{s}
+
+Options \texttt{vvarbb} and \texttt{upint} show no effect in figure
+12.50. This was due to a bug in the package --- now corrected. Thus,
+rerunning the example shows the expected behavior.
\CHAPTER{Chapter 13 --- Localizing Documents}
\erroronpage{II-297}{heading}{FMi}{2023/04/04}{s}
Chapter title not properly capitalized.
-\\ Already corrected in the digital version.
+\erroronpage{II-307}{after exa 13-2-5}{BeB/FMi}{2023/08/20}{s}
+
+Replace:
+On the other hand, \pkg{tikz} provides a library to overcome these issues.
+\>\\
+In the particular case of \pkg{tikz}, you can use
+\cs{usetikzlibrary}\verb={babel}= instead of \cs{shorthandoff}
+to overcome these issues for all \pkg{tikz} pictures of the document.
+
+
+
+\erroronpage{II-308}{para 2, l.3}{BeB}{2023/08/20}{s}
+Acronyms BCP and IETF not explained:\\
+BCP \> the Best Current Practice (BCP)\\
+IETF \> the Internet Engineering Task Force (IETF)
+
+\erroronpage{II-308}{para 3, l.1}{BeB}{2023/08/20}{s}
+ BPD \> BCP
+
+\erroronpage{II-319}{para 2, l.1}{BeB}{2023/08/20}{s}
+Missing word: is described \textit{A History} \> is described \u{in}
+\textit{A History}
+
+\erroronpage{II-332}{exa 13-5-2, and above}{FMi}{2023/04/28}{s}
+
+The keyword \texttt{Harf\u{b}uzz} should be spelled
+\texttt{Harf\u{B}uzz}. Both names are supported, but the recommended
+spelling is \texttt{HarfBuzz}.
+
\CHAPTER{Chapter 14 --- Index Generation}
+% Das Beispiel von S. II-352 als File wäre schön, dann könnte man das mit
+% dem Index mal durchspielen. Das Beispiel 16-7-6 ist zwar mal wieder
+% recht eindrucksvoll, berührt die Thematik aber nur so nebenbei.
+% \erroronpage{II-352}{Fig. 14.3}{BeB}{2023/08/31}{}
+% The code shown in Fig. 14.3 now is the Example 14-2-1
+
+
\CHAPTER{Chapter 15 --- Bibliography Generation}
+\erroronpage{II-390}{para 4, l.1}{BeB/FMi}{2023/08/31}{s}
+Replace:
+ \u{predates the Internet} and so\> \\
+ \u{were developed when the Internet was in its infancy} and so
+
+
+\erroronpage{II-391}{Fig. 15.2, bib-entry jane-2}{BeB}{2023/08/31}{s}
+\verb+\title = {A+\texttt{\u{n} second book\}}\> \verb+\title = {A second book}+
+
+Changes the output of example 16-7-31 on page II-560 as well.
+
+% For later:
+%S. II-399: Man könnte in dem biber/biblatex Kasten noch anmerken, dass die
+% Konvertierung auch on-the-fly geht – hatte mir in der Übergangsphase weitergeholfen:
+%\erroronpage{II-399}{biber/biblatex box}{BeB}{2023/08/31}{}
+%Add: One can do this conversion directly from a .bib file to a .bbl file by using e.g.
+%\verb+biber --output-encoding=ascii --output-safecharsset=full+
+%and stay with one .bib file (in UTF8-encoding).
+
+
\erroronpage{II-435}{code}{FMi}{2023/05/26}{s}
-\verb=\textcolor{See= \> \verb=\textcolor{blue}{See=
-\\ Already corrected in the digital version.
+\verb=\textcolor{See= \> \cs{textcolor}\u{\texttt{\{blue\}}}\texttt{\{See}
+
+\erroronpage{II-443}{biblatex-mla style}{BeB}{2023/08/31}{s}
+Explain acronym: \u{MLA handbook} \> \u{Modern Language Association (MLA) handbook}
+
+\smallskip
+
+This moves the text line on the bottom to the next page.
\CHAPTER{Chapter 16 --- Managing Citations}
+\erroronpage{II-475}{para -2, l.6}{BeB}{2023/08/31}{s}
+Figure 15.1 \> Figure 15.1 \u{on pages 382--383}
+
+
+\erroronpage{II-513}{para -1}{BeB/FMi}{2023/08/31}{s}
+
+Extend the explanation:\\
+is created only if the entry \u{contains} a shorttitle \u{field} and the title and shorttitle fields differ. \>\\
+is created only if the entry \u{has been referenced (prior to typesetting}\\
+\u{the bibliography), contains} a shorttitle \u{field,} and the title and shorttitle fields differ.
+
+
+\erroronpage{II-560}{exa 16-7-31}{FMi}{2023/08/31}{s}
+Jane Doe.\ \textit{A\u{n} second book.}\ 2020.\> Jane Doe.\ \textit{A second book.}\ 2020.
+
\CHAPTER{Chapter 17 --- \LaTeX{} Package Documentation Tools}
-
+
+\erroronpage{II-599}{para 3, l.1}{EOl}{2023/07/30}{s}
+
+\u{Whencreating automatically} the driver \> \u{When} the driver
+
\CHAPTER{Appendix A --- \LaTeX{} Overview for Preamble, \ldots}
-
+
+\erroronpage{II-624--629}{}{BeB/FMi}{2023/08/31}{s}
+Replace for consistency with section 1.4: \u{command definition} \> \u{code}
+
+\erroronpage{II-629}{para 1, l.3}{FMi}{2023/08/31}{s}
+\u{An} warning \> \u{A} warning
+
+
+\erroronpage{II-633}{para 2}{BeB/FMi}{2023/08/31}{s}
+Add at the end: A maximum of nine ``argument'' letters is supported.
+
+
+\erroronpage{II-682}{para -2, l.3}{FMi}{2023/04/28}{s}
+\texttt{Harf\u{b}uzz} \> \texttt{Harf\u{B}uzz}
+
\CHAPTER{Appendix B --- Tracing and Resolving Problems}
@@ -787,7 +1306,7 @@ Chapter title not properly capitalized.
\erroronpage{II-297}{heading}{FMi}{2023/04/04}{s}
Appendix title not properly capitalized.
-\\ Already corrected in the digital version.
+
\CHAPTER{Biographies}
@@ -798,13 +1317,21 @@ Appendix title not properly capitalized.
+\section*{Notes on this errata document}
+
\setcounter{collectmore}{3}
\begin{multicols}{3}[Thanks to all who have found errors or
omissions. Listed are the people who found an errata entry first.]
-\contributor{bb}{Barbara Beeton}
+\contributor{BeB}{Bernd Burghardt}
+\contributor{DFl}{Daniel Flipo}
+\contributor{EOl}{Edgar Olthof}
\contributor{FMi}{Frank Mittelbach}
+\contributor{MJo}{Maciej Jończyk}
+\contributor{YFu}{FUJIMURA Yukitoshi}
+\contributor{YvH}{Yvon Henel}
+\contributor{bb}{Barbara Beeton}
\contributor{kb}{Karl Berry}
\end{multicols}
@@ -827,7 +1354,7 @@ Here is an example:
\erroronpage{5}{para 3, l.1}{FMi}{2023/06/21}{}
\u{LaTeX} \> \u{\LaTeX}
\end{verbatim}
-\verb=\u= underlines a text fragment and \verb=\>= produces \>.
+\verb=\u{...}= underlines a text fragment, \verb=\>= produces \>, and \verb=\bl= is a short form for \verb=\color{blue}=.
\end{document}
diff --git a/macros/latex-dev/base/tlc3.pdf b/macros/latex-dev/base/tlc3.pdf
index 5228aefe9d..b7992b7152 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 d99b8c586c..57f1df3e27 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 cb96ab3d50..aabe4c0543 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 d61fe208e5..310c0e11ba 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 5577be9f03..05fc93e7af 100644
--- a/macros/latex-dev/base/usrguide.tex
+++ b/macros/latex-dev/base/usrguide.tex
@@ -877,33 +877,6 @@ defined as
[As an aside: the code is written in \pkg{expl3}, so we don't have to
worry about spaces creeping into the definition.]
-\subsection{Access to the argument specification}
-
-The argument specifications for document commands and environments are
-available for examination and use.
-
-\begin{decl}
- |\GetDocumentCommandArgSpec| \arg{cmd} \\
- |\GetDocumentEnvironmentArgSpec| \arg{environment}
-\end{decl}
-These commands transfer the current argument specification for the
-requested \meta{cmd} or \meta{environment} into the token list
-variable \cs{ArgumentSpecification}. If the \meta{cmd} or
-\meta{environment} has no known argument specification then an error
-is issued. The assignment to \cs{ArgumentSpecification} is local to
-the current \TeX{} group.
-
-\begin{decl}
- |\ShowDocumentCommandArgSpec| \arg{cmd} \\
- |\ShowDocumentEnvironmentArgSpec| \arg{environment}
-\end{decl}
-These commands show the current argument specification for the
-requested \meta{cmd} or \meta{environment} at the terminal. If
-the \meta{cmd} or \meta{environment} has no known argument
-specification then an error is issued.
-
-
-
\section{Copying and showing (robust) commands and environments}
If you want to (slightly) alter an existing command you may want to
@@ -1212,8 +1185,7 @@ Upper- and lower-casing are well-understood in general conversation.
Titlecasing here follows the definition given by the Unicode Consortium: the
first character of the input will be converted to (broadly) uppercase, and the
rest of the input to lowercase. The full range of Unicode UTF-8 input can be
-supported, with the proviso that at present the characters set up with 8-bit
-engines match those available in standard input encodings (|T1|, |T2|, |LGR|).
+supported.
\begin{quotation}
\begin{tabular}{rl}
|\MakeUppercase{hello WORLD ßüé}| & \MakeUppercase{hello WORLD ßüé} \\
diff --git a/macros/latex-dev/base/utf8ienc.pdf b/macros/latex-dev/base/utf8ienc.pdf
index d008d97030..3925b86fcb 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 735f72c3b8..ce28e4400f 100644
--- a/macros/latex-dev/base/webcomp.pdf
+++ b/macros/latex-dev/base/webcomp.pdf
Binary files differ
diff --git a/macros/latex-dev/required/amsmath/README.md b/macros/latex-dev/required/amsmath/README.md
index ac10c989ea..05c4c7543a 100644
--- a/macros/latex-dev/required/amsmath/README.md
+++ b/macros/latex-dev/required/amsmath/README.md
@@ -1,7 +1,7 @@
The amsmath bundle for LaTeX
============================
-Release 2023-11-01 pre-release 0
+Release 2023-11-01 pre-release 1
Overview
--------
diff --git a/macros/latex-dev/required/amsmath/amsbsy.pdf b/macros/latex-dev/required/amsmath/amsbsy.pdf
index 87bfa6df03..60f9c08920 100644
--- a/macros/latex-dev/required/amsmath/amsbsy.pdf
+++ b/macros/latex-dev/required/amsmath/amsbsy.pdf
Binary files differ
diff --git a/macros/latex-dev/required/amsmath/amscd.pdf b/macros/latex-dev/required/amsmath/amscd.pdf
index bbfa58d70d..582d63279f 100644
--- a/macros/latex-dev/required/amsmath/amscd.pdf
+++ b/macros/latex-dev/required/amsmath/amscd.pdf
Binary files differ
diff --git a/macros/latex-dev/required/amsmath/amsgen.pdf b/macros/latex-dev/required/amsmath/amsgen.pdf
index 0a9a85254b..fdc060f165 100644
--- a/macros/latex-dev/required/amsmath/amsgen.pdf
+++ b/macros/latex-dev/required/amsmath/amsgen.pdf
Binary files differ
diff --git a/macros/latex-dev/required/amsmath/amsldoc.pdf b/macros/latex-dev/required/amsmath/amsldoc.pdf
index 288bb12445..2e31edf184 100644
--- a/macros/latex-dev/required/amsmath/amsldoc.pdf
+++ b/macros/latex-dev/required/amsmath/amsldoc.pdf
Binary files differ
diff --git a/macros/latex-dev/required/amsmath/amsmath.pdf b/macros/latex-dev/required/amsmath/amsmath.pdf
index 4a702bb99f..188ca0bb43 100644
--- a/macros/latex-dev/required/amsmath/amsmath.pdf
+++ b/macros/latex-dev/required/amsmath/amsmath.pdf
Binary files differ
diff --git a/macros/latex-dev/required/amsmath/amsopn.pdf b/macros/latex-dev/required/amsmath/amsopn.pdf
index 339f576260..cae09a4e59 100644
--- a/macros/latex-dev/required/amsmath/amsopn.pdf
+++ b/macros/latex-dev/required/amsmath/amsopn.pdf
Binary files differ
diff --git a/macros/latex-dev/required/amsmath/amstext.pdf b/macros/latex-dev/required/amsmath/amstext.pdf
index 09147c84e6..2da56e8d43 100644
--- a/macros/latex-dev/required/amsmath/amstext.pdf
+++ b/macros/latex-dev/required/amsmath/amstext.pdf
Binary files differ
diff --git a/macros/latex-dev/required/amsmath/amsxtra.pdf b/macros/latex-dev/required/amsmath/amsxtra.pdf
index 06c8eab3e7..f7d546fb5d 100644
--- a/macros/latex-dev/required/amsmath/amsxtra.pdf
+++ b/macros/latex-dev/required/amsmath/amsxtra.pdf
Binary files differ
diff --git a/macros/latex-dev/required/amsmath/changes.txt b/macros/latex-dev/required/amsmath/changes.txt
index 149da6b425..b038677206 100644
--- a/macros/latex-dev/required/amsmath/changes.txt
+++ b/macros/latex-dev/required/amsmath/changes.txt
@@ -1,3 +1,7 @@
+2023-08-24 David Carlisle <David.Carlisle@latex-project.org>
+
+ * testmath.tex: remove spaces before ~,
+
================================================================================
All changes above are only part of the development branch for the next release.
================================================================================
diff --git a/macros/latex-dev/required/amsmath/subeqn.pdf b/macros/latex-dev/required/amsmath/subeqn.pdf
index 5a72c25f09..72caa0c5e7 100644
--- a/macros/latex-dev/required/amsmath/subeqn.pdf
+++ b/macros/latex-dev/required/amsmath/subeqn.pdf
Binary files differ
diff --git a/macros/latex-dev/required/amsmath/technote.pdf b/macros/latex-dev/required/amsmath/technote.pdf
index 14fcc7374a..6f9c45f5a3 100644
--- a/macros/latex-dev/required/amsmath/technote.pdf
+++ b/macros/latex-dev/required/amsmath/technote.pdf
Binary files differ
diff --git a/macros/latex-dev/required/amsmath/testmath.pdf b/macros/latex-dev/required/amsmath/testmath.pdf
index 4f43dc57b0..c059693f3b 100644
--- a/macros/latex-dev/required/amsmath/testmath.pdf
+++ b/macros/latex-dev/required/amsmath/testmath.pdf
Binary files differ
diff --git a/macros/latex-dev/required/amsmath/testmath.tex b/macros/latex-dev/required/amsmath/testmath.tex
index 069944ee9d..c0df337015 100644
--- a/macros/latex-dev/required/amsmath/testmath.tex
+++ b/macros/latex-dev/required/amsmath/testmath.tex
@@ -1,41 +1,15 @@
%%% ====================================================================
-%%% @LaTeX-file{
-%%% filename = "testmath.tex",
-%%% version = "2.0",
-%%% date = "1999/11/15",
-%%% time = "15:09:17 EST",
-%%% checksum = "07762 2342 7811 82371",
-%%% author = "American Mathematical Society",
-%%% copyright = "Copyright 1995, 1999 American Mathematical Society,
-%%% all rights reserved. Copying of this file is
-%%% authorized only if either:
-%%% (1) you make absolutely no changes to your copy,
-%%% including name; OR
-%%% (2) if you do make changes, you first rename it
-%%% to some other name.",
-%%% address = "American Mathematical Society,
-%%% Technical Support,
-%%% Electronic Products and Services,
-%%% P. O. Box 6248,
-%%% Providence, RI 02940,
-%%% USA",
-%%% telephone = "401-455-4080 or (in the USA and Canada)
-%%% 800-321-4AMS (321-4267)",
-%%% FAX = "401-331-3842",
-%%% email = "tech-support@ams.org (Internet)",
-%%% codetable = "ISO/ASCII",
-%%% keywords = "latex, amsmath, examples, documentation",
-%%% supported = "yes",
-%%% abstract = "This is a test file containing extensive examples of
-%%% mathematical constructs supported by the amsmath
-%%% package.",
-%%% docstring = "The checksum field above contains a CRC-16
-%%% checksum as the first value, followed by the
-%%% equivalent of the standard UNIX wc (word
-%%% count) utility output of lines, words, and
-%%% characters. This is produced by Robert
-%%% Solovay's checksum utility.",
-%%% }
+%%% filename = testmath.tex
+%%% version = 2.0a
+%%% date = 2023/08/24
+%%% author = American Mathematical Society
+%%% copyright = Copyright 1995, 1999 American Mathematical Society
+%%% 2023 LaTeX Project.
+%%% License = https://www.latex-project.org/lppl/lppl-1-3c
+%%% keywords = latex, amsmath, examples, documentation
+%%% abstract = This is a test file containing extensive examples of
+%%% mathematical constructs supported by the amsmath
+%%% package."
%%% ====================================================================
\NeedsTeXFormat{LaTeX2e}% LaTeX 2.09 can't be used (nor non-LaTeX)
[1994/12/01]% LaTeX date must December 1994 or later
@@ -45,7 +19,7 @@
\title{Sample Paper for the \pkg{amsmath} Package\\
File name: \fn{testmath.tex}}
\author{American Mathematical Society}
-\date{Version 2.0, 1999/11/15}
+\date{Version 2.0a, 2023/08/24}
\usepackage{amsmath,amsthm}
@@ -250,7 +224,7 @@ Then, it follows that
\end{lem}
Note that all basic properties of determinants are direct consequences
-of Lemma ~\ref{lem-det}. Write
+of Lemma~\ref{lem-det}. Write
\begin{equation}\label{sum-bij}
\sum_{j\in\mathbf{n}}b_{ij}\hat y_j=\sum_{j\in\mathbf{n}}b^{(\lambda)}
_{ij}\hat y_j+(b_{ii}-\lambda_i)\hat y_i\hat y
@@ -325,7 +299,7 @@ D(t_1,\dots,t_n)
where $\mathbf{K}(t=1,t_1,\dots,t_n; i|i)$ is the $i$th principal
submatrix of $\mathbf{K}(t=1,t_1,\dots,t_n)$.
-Theorem ~\ref{thm-main} leads to
+Theorem~\ref{thm-main} leads to
\begin{equation}\label{detK1}
\det\mathbf{K}(t_1,t_1,\dots,t_n)
=\sum_{I\in\mathbf{n}}(-1)^{\envert{I}}t^{n-\envert{I}}
@@ -339,7 +313,7 @@ Note that
^{(\lambda)}(\overline{I}|\overline{I})=0.
\end{equation}
-Let $t_i=\hat x_i,i=1,\dots,n$. Lemma ~\ref{lem-per} yields
+Let $t_i=\hat x_i,i=1,\dots,n$. Lemma~\ref{lem-per} yields
\begin{multline}
\biggl(\sum_{\,i\in\mathbf{n}}a_{l _i}x_i\biggr)
\det\mathbf{K}(t=1,x_1,\dots,x_n;l |l )\\
@@ -381,8 +355,8 @@ D(t_1,\dots,t_n)}_{t_i=\left\{\begin{smallmatrix}
\section{Application}
\label{lincomp}
-We consider here the applications of Theorems~\ref{th-info-ow-ow} and
-~\ref{th-weak-ske-owf} to a complete
+We consider here the applications of Theorems~\ref{th-info-ow-ow}
+and~\ref{th-weak-ske-owf} to a complete
multipartite graph $K_{n_1\dots n_p}$. It can be shown that the
number of spanning trees of $K_{n_1\dots n_p}$
may be written
@@ -395,8 +369,7 @@ where
n=n_1+\dots+n_p.
\end{equation}
-It follows from Theorems~\ref{th-info-ow-ow} and
-~\ref{th-weak-ske-owf} that
+It follows from Theorems~\ref{th-info-ow-ow} and~\ref{th-weak-ske-owf} that
\begin{equation}\label{e:barwq}
\begin{split}
H_c&=\frac1{2n}
@@ -423,7 +396,7 @@ H_c&=\frac12\sum^{n-1}_{l =0}
\end{equation}
The enumeration of $H_c$ in a $K_{n_1\dotsm n_p}$ graph can also be
-carried out by Theorem ~\ref{thm-H-param} or ~\ref{thm-asym}
+carried out by Theorem~\ref{thm-H-param} or~\ref{thm-asym}
together with the algebraic method of \eqref{multdef}.
Some elegant representations may be obtained. For example, $H_c$ in
a $K_{n_1n_2n_3}$ graph may be written
@@ -499,7 +472,7 @@ We begin our discussion with the following definition:
A function $H\colon \Re^n \to \Re^n$ is said to be
\emph{B-differentiable} at the point $z$ if (i)~$H$ is Lipschitz
-continuous in a neighborhood of $z$, and (ii)~ there exists a positive
+continuous in a neighborhood of $z$, and (ii)~there exists a positive
homogeneous function $BH(z)\colon \Re^n \to \Re^n$, called the
\emph{B-derivative} of $H$ at $z$, such that
\[ \lim_{v \to 0} \frac{H(z+v) - H(z) - BH(z)v}{\enVert{v}} = 0. \]
@@ -1112,7 +1085,7 @@ A_l =
0,&\text{otherwise }.\end{cases}
\label{compl-bip-gr}
\end{equation}
-Theorem ~\ref{thm-H-param}
+Theorem~\ref{thm-H-param}
leads to
\begin{equation}
H_c=\frac1{n_1+n_2}n_1!n_2!\delta_{n_1n_2}.
diff --git a/macros/latex-dev/required/firstaid/changes.txt b/macros/latex-dev/required/firstaid/changes.txt
index e326957807..17d8f9acdf 100644
--- a/macros/latex-dev/required/firstaid/changes.txt
+++ b/macros/latex-dev/required/firstaid/changes.txt
@@ -1,3 +1,10 @@
+2023-07-18 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
+ * latex2e-first-aid-for-external-files.dtx: remove no longer needed code for
+ everysel
+ * latex2e-first-aid-for-external-files.dtx: remove no longer needed code for bidi
+ * latex2e-first-aid-for-external-files.dtx:
+ remove no longer needed code for memoir/stockheight
+
2023-05-20 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
* latex2e-first-aid-for-external-files.dtx: removed temporary fix for
@@ -137,5 +144,3 @@
* latex2e-first-aid-for-external-files.dtx:
Initial version for 2020-10-01 release containing first aid
for packages bidi, filehook and class dinbrief.
-
-
diff --git a/macros/latex-dev/required/firstaid/firstaid.ins b/macros/latex-dev/required/firstaid/firstaid.ins
index cd5ea2006d..b3f30c30da 100644
--- a/macros/latex-dev/required/firstaid/firstaid.ins
+++ b/macros/latex-dev/required/firstaid/firstaid.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright (C) 2020-2021
+%% Copyright (C) 2020-2023
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -44,7 +44,7 @@ reports for it can be opened at https://latex-project.org/bugs/
(but please observe conditions on bug reports sent to that address!)
-Copyright (C) 2020-2021
+Copyright (C) 2020-2023
The LaTeX Project and any individual authors listed elsewhere
in this file.
@@ -72,7 +72,4 @@ without such generated files.
\generate{\file{filehook-ltx.sty}
{\from{latex2e-first-aid-for-external-files.dtx}{filehook-ltx}}}
-\generate{\file{everysel-ltx.sty}
- {\from{latex2e-first-aid-for-external-files.dtx}{everysel-ltx}}}
-
\endbatchfile
diff --git a/macros/latex-dev/required/firstaid/latex2e-first-aid-for-external-files.dtx b/macros/latex-dev/required/firstaid/latex2e-first-aid-for-external-files.dtx
index 90958ed777..d1eeaf5ce2 100644
--- a/macros/latex-dev/required/firstaid/latex2e-first-aid-for-external-files.dtx
+++ b/macros/latex-dev/required/firstaid/latex2e-first-aid-for-external-files.dtx
@@ -111,8 +111,8 @@
% \end{macrocode}
%
% \begin{macrocode}
-\def\LaTeXFirstAidDate{2023/05/20}
-\def\LaTeXFirstAidVersion{v1.0z}
+\def\LaTeXFirstAidDate{2023/07/18}
+\def\LaTeXFirstAidVersion{v1.1a}
% \end{macrocode}
%
% \begin{macrocode}
@@ -285,62 +285,10 @@
%</filehook-ltx>
% \end{macrocode}
%
-%
-%
-%
-% \subsection{The \pkg{bidi} package first aid}
-%
-% The \pkg{bidi} package adds a lot of hooks in various places and
-% those added to \cs{document} and \cs{enddocument} are now no
-% longer necessary as the kernel already provides the right hooks
-% there.
-%
-% However, we aren't trying to change that but instead only make
-% sure that the existing patches still work by adding some first
-% aid after \pkg{biditools} has been loaded.
-%
-% If the package gets updated one can easily take that out simply
-% through
-%\begin{verbatim}
-% \RemoveFromHook{file/biditools.sty/after}[firstaid]
-%\end{verbatim}
-% This makes it easy to test new bidi code while the first aid code
-% is still in the kernel.
-%
% \begin{macrocode}
%<*kernel>
% \end{macrocode}
%
-% Bidi is now ar a new version: patches are no longer needed.
-% \begin{macrocode}
-%\AddToHook{file/biditools.sty/after}[firstaid]{%
-% \FirstAidNeededT{biditools}{sty}%
-% {2020/05/13 v2 Programming tools for bidi package}%
-% {%
-% \end{macrocode}
-% \pkg{bidi} adds some code to the beginning of \cs{document} which
-% contains \cs{endgroup} and \cs{begingroup} which is no longer
-% correct.
-%
-% Patching \cs{document} using \cs{bidi@patchcmd} doesn't work so
-% we take the extra groups out by hand:
-% \begin{macrocode}
-% \def\firstaid@bidi@document@patch
-% \endgroup#1\begingroup#2\firstaid@bidi@document@patch
-% {\unexpanded{#1#2}}%
-% \edef\document{\expandafter\firstaid@bidi@document@patch\document
-% \firstaid@bidi@document@patch}%
-% \end{macrocode}
-% There are also some patches into \cs{enddocument}, some continue
-% to go in but one fails, so we add that now into the right place.
-% \begin{macrocode}
-% \AddToHook{enddocument/info}%
-% {\let\bidi@AfterEndDocumentCheckLabelsRerun\@firstofone
-% \bidi@afterenddocumentchecklabelsrerunhook}%
-% }%
-%}
-% \end{macrocode}
-%
% \subsection{The \pkg{dinbrief} class first aid}
%
% Again a case of a no longer correct \cs{endgroup} in document.
@@ -482,46 +430,6 @@
%</kernel>
% \end{macrocode}
%
-% \subsection{The \pkg{everysel} package first aid}
-%
-%
-% The \cs{selectfont} command got a hook (with the 2021/05 release) which
-% was originally provided by the \pkg{everysel}
-% package. Now that it is in the kernel this package is no longer
-% needed (or only in a simplified manner).
-%
-% If it is requested we replace it with a simplified package
-% (until) it gets updated at which point this line can be removed.
-% \changes{v2.2k}{2020/12/04}{Emulate everysel package}
-% \begin{macrocode}
-%<*kernel>
-% this has been updated
-%\declare@file@substitution{everysel.sty}{everysel-ltx.sty}
-%</kernel>
-% \end{macrocode}
-%
-%
-%
-% \begin{macrocode}
-%<*everysel-ltx>
-\ProvidesPackage{everysel-ltx}
- [2020/12/04 v1.0a
- Emulation of the original everysel^^Jpackage with kernel methods]
-% \end{macrocode}
-%
-% \begin{macrocode}
-\newcommand*{\EverySelectfont}[1]
- {\AddToHook{selectfont}{#1}}
-\newcommand*{\AtNextSelectfont}[1]
- {\AddToHookNext{selectfont}{#1}}
-% \end{macrocode}
-%
-%
-% \begin{macrocode}
-%</everysel-ltx>
-% \end{macrocode}
-%
-%
%
% \begin{macrocode}
%<*kernel>
@@ -652,31 +560,6 @@
}
% \end{macrocode}
%
-%
-% \subsection{First aid for \pkg{memoir}}
-%
-% The introduction of \cs{stockheight} and \cs{stockwidth} into the
-% kernel requires some first aid. This has to go in \emph{before}
-% loading the class, so we cannot check the version string here.
-% \begin{macrocode}
-\AddToHook{file/memoir.cls/before}[firstaid]{%
- \expandafter\def\expandafter\@tempa\string\dimen{}%
- \edef\kernel@stockheight{\expandafter\@tempa\meaning\stockheight}%
- \edef\kernel@stockwidth{\expandafter\@tempa\meaning\stockwidth}%
- \let\stockheight\@undefined
- \let\stockwidth\@undefined
-}
-\AddToHook{file/memoir.cls/after}[firstaid]{%
- \dimen\kernel@stockheight=\stockheight
- \dimen\kernel@stockwidth=\stockwidth
- \dimendef\stockheight=\kernel@stockheight
- \dimendef\stockwidth=\kernel@stockwidth
-}
-% \end{macrocode}
-%
-%
-%
-%
% \begin{macrocode}
%</kernel>
% \end{macrocode}
diff --git a/macros/latex-dev/required/firstaid/latex2e-first-aid-for-external-files.pdf b/macros/latex-dev/required/firstaid/latex2e-first-aid-for-external-files.pdf
index 991a11ec54..c024fad142 100644
--- a/macros/latex-dev/required/firstaid/latex2e-first-aid-for-external-files.pdf
+++ b/macros/latex-dev/required/firstaid/latex2e-first-aid-for-external-files.pdf
Binary files differ
diff --git a/macros/latex/contrib/arraycols/arraycols.dtx b/macros/latex/contrib/arraycols/arraycols.dtx
index 43dc0fe7ea..b3a438be98 100644
--- a/macros/latex/contrib/arraycols/arraycols.dtx
+++ b/macros/latex/contrib/arraycols/arraycols.dtx
@@ -20,7 +20,7 @@
%<*package>
\NeedsTeXFormat{LaTeX2e}[2005/12/01]
\ProvidesPackage{arraycols}
- [2023/08/09 v1.3 .dtx arraycols file]
+ [2023/09/13 v1.4 .dtx arraycols file]
%</package>
%<*driver>
\documentclass{ltxdoc}
@@ -29,6 +29,12 @@
\usepackage[french,english]{babel}
\usepackage{lmodern}
\usepackage{arraycols}
+
+\usepackage{sectsty}
+\usepackage{xcolor}
+\definecolor{darkbrown}{rgb}{0.5,0.1,0.1}
+\allsectionsfont{\color{darkbrown}}
+
\DisableCrossrefs
%\CodelineIndex
%\RecordChanges
@@ -72,9 +78,11 @@
% \changes{v1.0}{2019/05/04}{Initial version, creating dtx and ins files}
% \changes{v1.0}{2019/06/17}{English translation by François Bastouil}
% \changes{v1.1}{2020/11/23}{Incompatibility with tablestyles mentioned,
-% minor changes in documentation}
-% \changes{v1.2}{2021/09/20}{Incompatibility with siunitx package (called by pstricks-add) is solved}
-% \changes{v1.3}{2023/09/08}{Small changes in the documentation}
+% minor changes in documentation}
+% \changes{v1.2}{2021/09/20}{Incompatibility with siunitx package
+% (called by pstricks-add) is solved}
+% \changes{v1.3}{2023/08/09}{Small changes in documentation}
+% \changes{v1.4}{2023/09/13}{More changes in documentation}
%
% \GetFileInfo{arraycols.sty}
%
@@ -82,15 +90,16 @@
% corresponds to \textsf{arraycols}~\fileversion, dated \filedate.
% Thanks to François Bastouil for assistance with the English translation.}}
% \author{Antoine Missier \\ \texttt{antoine.missier@ac-toulouse.fr}}
-% \date{August 9, 2023}
+% \date{September 13, 2023}
% \maketitle
%
% \section{Introduction}
%
-% This package introduces new predefined column types for tables, alongside
-% the \textsf{array} package by Frank Mittelbach and David Carlisle~\cite{ARRAY}. It also includes a command for wide horizontal rule drawing.
+% This package introduces new predefined column types for tables, in addition to
+% the \textsf{array} package by Frank Mittelbach and David Carlisle~\cite{ARRAY}.
+% It also includes a command for wide horizontal rule drawing.
% Below is a summary of the column types and macro defined by \textsf{arraycols},
-% with further to follow.
+% which will be detailed in the following section.
%
% \begin{center}\small \setlength{\extrarowheight}{1pt}
% \begin{tabular}{|cIm{7.9cm}|}
@@ -112,7 +121,8 @@
% \hline
% \texttt{y} & Left-aligned column in math mode with adjusted height \\
% \hline
-% \texttt{z}\marg{width} & Centered column in math mode, similar to \texttt{x}, with adjusted height,
+% \texttt{z}\marg{width} & Centered column in math mode, similar to \texttt{x},
+% with adjusted height,
% but with fixed \meta{width} \\
% \hline
% \texttt{T} & Centered text column with adjusted width
@@ -132,62 +142,66 @@
% \end{tabular}
% \end{center}
%
-% Note that if a column type has been previously defined,
+% Note that if a column type has been previously defined by another package,
% using \textsf{arraycols} will overwrite it and display a warning message.
%
-% In addition to loading the \textsf{array} package, \textsf{arraycols} also requires the \textsf{cellspace} package~\cite{CELLSP},
-% which is necessary for the \texttt{x}, \texttt{y}, \texttt{z} and \texttt{Z} column types. Moreover it relies on
+% In addition to loading the \textsf{array} package, \textsf{arraycols}
+% also requires \textsf{cellspace}~\cite{CELLSP},
+% which is necessary for the \texttt{x}, \texttt{y}, \texttt{z} and \texttt{Z} column types.
+% Moreover it relies on
% \textsf{tabularx}~\cite{TABX} for \texttt{T} and \texttt{Z} column types and
% loads \textsf{makecell}~\cite{MKCELL} for creation of multilined tabular cells.
% It's worth mentioning that the \textsf{tablestyles} package~\cite{TBLSTY}
-% also defines L, C, R and Z column types differently.
+% also defines L, C, R and Z column types, but differently.
% Nevertheless, \textsf{tablestyles} is incompatible with \textsf{makecell}
% and consequently with \textsf{arraycols} as well.
%
-% Despite its minimal code, this package does not aim to introduce new macros.
-% Its main purpose is to combine and configure features derived from other packages.
+% With its minimal code, \textsf{arraycols} makes no claim to develop new macros.
+% Its purpose is to combine and configure functionalities derived from other packages.
%
% \section{Usage}
%
%\medskip
% \DescribeEnv{L} \DescribeEnv{C} \DescribeEnv{R}
% Referring to an example from the \textsf{array} package documentation,
-% the |L|, |C| and |R| columns types, offered by \textsf{arraycols}, provide the convenience
-% of reversing the mathematical mode.
+% the |L|, |C| and |R| columns types, enable the
+% reversal of the mathematical mode.
% This allows to achieve centered, left-aligned or right-aligned
% LR-mode in an \texttt{array} environment or an equivalent math-mode
% in a \texttt{tabular} environment.
% For instance, using the declaration "\begin{tabular}{|l|C|r|}" sets the second column
% in centered mathematical mode. Similarly, using the declaration "\begin{array}{|L|c|c|}"
-% sets the first column\footnote{The declarations
+% sets the first column in text mode, left-aligned\footnote{The declarations
% \texttt{L, C, R} do not work in a \texttt{tabularx} environment.
% Additionally, the \mbox{\textsf{tabulary}} package by David Carlisle~\cite{TABY}
-% already defines the \texttt{L, C, R} and \texttt{J} column types for specific alignments
+% already defines the \texttt{L, C, R} (and \texttt{J}) column types for specific alignments
% in tables of the same type as \texttt{tabularx}.
-% However there is no incompatibility with \textsf{arraycols} because these column definitions
-% apply exclusively in \texttt{tabulary} environments.
-% } in text mode, left-aligned.
+% However, there is no incompatibility with \textsf{arraycols} because these column definitions
+% apply exclusively within \texttt{tabulary} environments.
+% }.
%
% \medskip
% \DescribeEnv{t\marg{width}}
-% The newly introduced column type definition \texttt{t}\{\meta{width}\} (text in LR-mode)
-% achieves both horizontal and vertical centering within the column. It is distinct from the traditional
-% \texttt{p}\marg{width} (in standard \LaTeX) and \texttt{m}\marg{width}
-% (from the \textsf{array} package) column types, which are equivalent to
-% "\parbox[t]" or "\parbox".
+% The newly introduced column type definition \texttt{t}\{\meta{width}\}
+% horizontally and vertically centers paragraphs within the column,
+% with a specified \meta{width}.
+% In contrast, the traditional \texttt{p}\marg{width} (in standard \LaTeX)
+% and \texttt{m}\marg{width} (from the \textsf{array} package) column types,
+% justifies paragraphs, while text in \texttt{t}\{\meta{width}\} is centered.
%
% \medskip
% \DescribeEnv{x} \DescribeEnv{y}
% In order to guarantee adequate row heights, especially for displaymath mode
% formulas, the package includes the column types \texttt{x} (centered)
-% and \texttt{y} (left aligned), based on the \textsf{cellspace} package
+% and \texttt{y} (left aligned).
+% These column types activate the mathematical mode and
+% allow automatic adjustment of row heights to prevent any overlap with
+% horizontal rules in cases where the content is too tall,
+% thanks to a functionality of the \textsf{cellspace} package
% by Josselin Noirel~\cite{CELLSP}.
-% These column types allow automatic adjustment of row heights to prevent any overlap with
-% horizontal rules in cases where the content is too tall.
% While \textsf{cellspace} is initially designed for \texttt{tabular} environments,
-% the new \texttt{x} and \texttt{y} column types, introduces by \mbox{\textsf{arraycols}},
-% generate mathematically well-adjusted columns.
-% They are applicable in both \texttt{tabular} and \texttt{array} environments.
+% the new \texttt{x} and \texttt{y} column types
+% are applicable in both \texttt{tabular} and \texttt{array} environments.
% Examine the following examples created using
% "\begin{array}{|c|}" and "\begin{array}{|x|}".
% \[
@@ -222,24 +236,26 @@
% \og the \textsf{amsmath} package can be loaded beforehand with other
% packages (such as \texttt{empheq} or \texttt{mathtools}),
% were an incompatibility to arise from one’s loading it later\fg.}
-% to effectively manage row heights in matrix tables.
+% to efficiently manage row heights, including in matrices.
% Another option of \textsf{cellspace}, \texttt{column=Q}
% (with \texttt{S} being the default in \textsf{cellspace})\footnote{The
-% selection of the letter Q to substitute the default column modifier S of the \textsf{cellspace}
-% package is here arbitrary.}, was necessary to prevent any compatibility issues
+% letter Q is a substitute for the default column modifier S of the \textsf{cellspace}
+% package.}, was necessary to prevent any compatibility issues
% with the \textsf{siunitx} package (also loaded by \textsf{pstricks-add}).
-% The \texttt{Q} column type serves as a \og modifier \fg{}
-% that, when combined with the traditional
-% column types \texttt{l, c, r}, permits the adjustment of cell height.
+% The \texttt{Q} declaration serves as a \og modifier \fg{}
+% that, when placed before a column type declaration,
+% permits the adjustment of cell height,
+% for instance ``\texttt{Qc}'' for a vertical adjustment
+% within a centered column type.
%
% \medskip
% Notice that another package, \textsf{booktabs}~\cite{BOOK}, also offers
% excellent row height adjustment. However, regrettably, it doesn't handle the height
-% of vertical separators "|".
+% of vertical separators ``"|"''.
% In order to achieve a similar vertical adjustment as \textsf{booktabs},
-% we configure the \textsf{cellspace} parameters as follows:\\
-% "\setlength{\cellspacetoplimit}{3pt}", \\
-% "\setlength{\cellspacebottomlimit}{2pt}".
+% we set the \textsf{cellspace} parameters as follows:\\
+% \indent\indent"\setlength{\cellspacetoplimit}{3pt}", \\
+% \indent\indent"\setlength{\cellspacebottomlimit}{2pt}".
%
% Additionally, it's worth mentioning the \textsf{tabls} package by Donald Arneseau~\cite{TABLS}
% that makes a good adjustment of row heights as well, but it is incompatible
@@ -253,21 +269,25 @@
%
% \medskip
% \DescribeEnv{z\marg{width}}
-% The \texttt{z}\marg{width} column type allows you to define the column width,
-% just like \texttt{t}\marg{width},
-% and it also activates math mode and adjusts the row height,
-% similar to the \texttt{x} column type.
+% The \texttt{z}\marg{width} column type activates the mathematical mode
+% and allows to define the column width,
+% similar to \texttt{t}\marg{width}.
+% It also adjusts the row height, akin to the \texttt{x} column type.
+% The content consist of a single line. When it becomes too wide, it may protrude to the right.
%
% \medskip
% \DescribeEnv{T} \DescribeEnv{Z}
% The \textsf{tabularx} package by David Carlisle~\cite{TABX} introduces
-% the \texttt{X} column definition, which calculates its width based on
+% the \texttt{X} column definition, which calculates its width in relation to
% the required width for the entire table. It aligns text to the left
-% akin to \texttt{p}\marg{width}.
-% For instance, using "\begin{tabularx}{8cm}{|c|X|X|}" adjusts the width of the \texttt{X} columns
+% similar to \texttt{p}\marg{width}.
+% For instance, using "\begin{tabularx}{8cm}{|c|X|X|}"
+% adjusts the width of the \texttt{X} columns
% to achieve a total width of 8\,cm. To complement this, we offer
-% the \texttt{T} declaration, which performs a similar function but centers the content horizontally.
-% Additionally the \texttt{Z} declaration goes further by activating mathematical mode and adjusting
+% the \texttt{T} declaration, which performs a similar function
+% but centers the content horizontally.
+% Additionally the \texttt{Z} declaration activates mathematical
+% mode and adjusts
% line heights, comparable to \texttt{x} or \texttt{z}). Here's an example with
% "\begin{tabularx}{\linewidth}{|T|y|x|Z|T|}".
% \begin{center}
@@ -281,24 +301,30 @@
% \hline
% \end{tabularx}
% \end{center}
-% In order to maintain precise alignment of fraction bars within mathematical formulas,
-% cells are deliberately not vertically centered. Nevertheless, for achieving accurate vertical positioning
-% within the last cell, we have used the powerful "\makecell" command from
+% Observe that cells 3 and 4 are not vertically centered to preserve
+% the precise alignment of fraction bars within mathematical formulas
+% across cells.
+% For achieving accurate vertical positioning
+% within the last cell, we have used the powerful "\makecell"\oarg{pos}\marg{content}
+% command from
% the \textsf{makecell} package by Olga Lapko~\cite{MKCELL}:
% "\makecell{a multi-line \\ piece of text}".
%
% \bigskip
-% \DescribeEnv{I} \DescribeEnv{V\marg{thickness}}
+% \DescribeEnv{I} \DescribeEnv{V\marg{thickness}}
% The column definition \texttt{I} is mentioned in The \LaTeX\ Companion~\cite{COMP}
-% and allows for drawing a thicker \emph{vertical} line (1\,pt thick) compared to the one achieved
-% with the standard declaration "|". For selecting the line thickness, we additionally provide the column
+% and allows for drawing a thicker \emph{vertical} line (1\,pt thick)
+% compared to the one achieved
+% with the standard declaration ``"|"''. For selecting the line thickness,
+% we additionally provide the column
% definition \texttt{V}\marg{thickness}\footnote{The definition of \texttt{V}
-% would have been simplified by utilizing an optional argument for \texttt{I}, but unfortunately, this approach doesn't function.}.
+% would have been simplified by utilizing an optional argument for \texttt{I},
+% but unfortunately, this approach doesn't function.}.
%
% \medskip
% \DescribeMacro{\whline}
-% Similarly, the "\whline" command, suggested in The \LaTeX\ Companion, allows for drawing a
-% thicker \emph{horizontal} line (1\,pt thick) compared to the line obtained with "\hline".
+% Similarly, the "\whline" command, suggested in The \LaTeX\ Companion, enables the drawing of
+% a thicker \emph{horizontal} line (1\,pt thick) compared to the line obtained with "\hline".
% Moreover, the \textsf{makecell} package provides the command "\Xhline"\marg{thickness}
% enabling the choice of horizontal rule thickness.
%
@@ -307,12 +333,13 @@
% serving as a separator between the two text columns.
% Horizontal rules at the beginning and end of the table are accomplished using "\whline",
% while a "\Xhline{0.8pt}" rule is employed after the legend rows.
-% The formatting of header rows is achieved using the "\thead" command from the \textsf{makecell}
-% package. By default, \textsf{arraycols} sets:
+% The formatting of header rows is achieved using the "\thead" command
+% from the \textsf{makecell} package. By default, \textsf{arraycols} sets:
% "\renewcommand\theadfont{\footnotesize\sffamily}"
-% (initially |\footnotesize| only, without "\sffamily").
+% (in \textsf{makecell} it is |\footnotesize| only, without "\sffamily").
% Lastly, following a recommendation of the \textsf{array} package~\cite{ARRAY},
-% an additional 1\,pt has been added to the standard height of each row within this table. This adjustment is implemented with the command
+% an additional 1\,pt has been added to the standard height of each row within this table.
+% This adjustment is implemented with the command
% "\setlength{\extrarowheight}{1pt}"\footnote{As stated
% in the \textsf{array} package documentation:
% \og This is important for tables with horizontal lines because those
@@ -332,7 +359,8 @@
\newcolumntype{R}{>{$}r<{$}}
\newcolumntype{t}[1]{>{\centering\arraybackslash}m{#1}}
% \end{macrocode}
-% The \textsf{cellspace} package offers the \texttt{S} modifier (we used \texttt{Q} instead), which,
+% The \textsf{cellspace} package provides the \texttt{S} modifier
+% (we used \texttt{Q} instead), which,
% when placed before a column declaration, allows for the adjustment of cell content height
% to prevent any overlap with horizontal rules. The spacing between the content and the rules
% is governed by the parameters
@@ -345,20 +373,28 @@
\setlength{\cellspacebottomlimit}{2pt}
\newcolumntype{z}[1]{>{$}Q{>{\centering\arraybackslash}p{#1}}<{$}}
% \end{macrocode}
-% When defining the \texttt{z} column type, we employ the \texttt{p} column type instead of \texttt{m}
-% (which centers content automatically). This choice ensures proper alignment of mathematical
+% For the \texttt{z} column type, we employed the \texttt{p} declaration
+% instead of \texttt{m} (which should automatically center content).
+% This choice ensures proper alignment of mathematical
% expressions within cells of the same row.
+% The same result can be achieved with the following definition:
+% "\newcolumntype{z}[1]{>{$}Q{W{c}{#1}}<{$}}" with "W{c}" defined
+% in the \textsf{array} package.
+%
% \medskip
% \begin{macrocode}
\newcolumntype{T}{>{\centering\arraybackslash}X}
\newcolumntype{Z}{>{$}QT<{$}}
% \end{macrocode}
-% The \texttt{T} columns are not centered automatically. Although it's possible to achieve this
+% Like \texttt{X}, the \texttt{T} columns are not vertically centered.
+% Although it's possible to achieve this
% by using the command "\renewcommand{\tabularxcolumn}[1]{m{#1}}"
% (with \texttt{m} instead of default value \texttt{p}),
% unfortunately, this approach has a global effect on all column declarations based
% on \texttt{X}, including \texttt{T} and \texttt{Z}. As a result, it could disrupt the
% alignment of mathematical expressions within cells of the same row.
+%
+% \medskip
% \begin{macrocode}
\newcolumntype{I}{!{\vrule width 1pt}}
\newcolumntype{V}[1]{!{\vrule width #1}}
@@ -371,6 +407,7 @@
\renewcommand\theadfont{\footnotesize\sffamily}
% \end{macrocode}
%
+% \bigskip
% \begin{thebibliography}{11}
% \bibitem{ARRAY} \emph{A new implementation of LATEX’s \textsf{tabular} and \textsf{array}
% environment}, Frank Mittelbach, David Carlisle, CTAN, v2.4k revised 2018/12/30.
@@ -384,7 +421,8 @@
% \bibitem{BOOK} \emph{Publication quality tables in \LaTeX}, package \textsf{booktabs} by
% Simon Fear, CTAN, v1.618033 2016/04/29.
% \bibitem{TABLS} \emph{The \textsf{tabls} package}, Donald Arseneau, CTAN, v3.5 2010/02/26.
-% \bibitem{STRUT} \emph{The \textsf{multirow}, \textsf{bigstrut} and \textsf{bigdelim} packages},
+% \bibitem{STRUT} \emph{The \textsf{multirow}, \textsf{bigstrut}
+% and \textsf{bigdelim} packages},
% Piet van Oostrum, Øystein Bache, Jerry Leichter, CTAN, v2.4 2019/01/01.
% \bibitem{SPA} \emph{The \textsf{spacingtricks} package}, Antoine Missier,
% CTAN, v1.3 2020/11/02.
diff --git a/macros/latex/contrib/arraycols/arraycols.pdf b/macros/latex/contrib/arraycols/arraycols.pdf
index d66dd231be..b42c461d36 100644
--- a/macros/latex/contrib/arraycols/arraycols.pdf
+++ b/macros/latex/contrib/arraycols/arraycols.pdf
Binary files differ
diff --git a/macros/latex/contrib/jeuxcartes/doc/JeuxCartes-doc.pdf b/macros/latex/contrib/jeuxcartes/doc/JeuxCartes-doc.pdf
index df8748d316..722121dd37 100644
--- a/macros/latex/contrib/jeuxcartes/doc/JeuxCartes-doc.pdf
+++ b/macros/latex/contrib/jeuxcartes/doc/JeuxCartes-doc.pdf
Binary files differ
diff --git a/macros/latex/contrib/jeuxcartes/doc/JeuxCartes-doc.tex b/macros/latex/contrib/jeuxcartes/doc/JeuxCartes-doc.tex
index 9b1ec0f77c..704c498ab7 100644
--- a/macros/latex/contrib/jeuxcartes/doc/JeuxCartes-doc.tex
+++ b/macros/latex/contrib/jeuxcartes/doc/JeuxCartes-doc.tex
@@ -69,8 +69,8 @@
\setlength{\parindent}{0pt}
\definecolor{LightGray}{gray}{0.9}
-\def\TPversion{0.2.7}
-\def\TPdate{08 août 2023}
+\def\TPversion{0.2.8}
+\def\TPdate{13 septembre 2023}
\usepackage[most]{tcolorbox}
\usepackage[outputdir=build]{minted}
@@ -182,6 +182,8 @@ Une commande pour des cartes en version \og miniatures \fg{} (individuelle, main
\hfill{}\textit{Merci aux membres du groupe \faFacebook{} du \og Coin \LaTeX{} \fg{} pour leur aide et leurs idées !}
+\hfill{}\textit{Merci à Fabrice Eudes pour ses retours !}
+
\vfill
\hrule
@@ -209,6 +211,8 @@ Une commande pour des cartes en version \og miniatures \fg{} (individuelle, main
\part{Historique}
+{\small \bverb|v0.2.8|~:~~~~Correction d'un bug mineur sur les commandes 'multicartes'.
+
{\small \bverb|v0.2.7|~:~~~~Retour en arrière sur les cartes de Tarot \textsf{v2} qui sont supprimées (pb de licence).
{\small \bverb|v0.2.5|~:~~~~Compatibilité des \textit{Mini}-Cartes avec les cartes avec nom anglais.
diff --git a/macros/latex/contrib/jeuxcartes/tex/JeuxCartes.sty b/macros/latex/contrib/jeuxcartes/tex/JeuxCartes.sty
index daee9c4690..575e251551 100644
--- a/macros/latex/contrib/jeuxcartes/tex/JeuxCartes.sty
+++ b/macros/latex/contrib/jeuxcartes/tex/JeuxCartes.sty
@@ -11,7 +11,8 @@
% Uno v1 cards Image's Licence.: MIT License https://eperezcosano.github.io/uno-part1/
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{JeuxCartes}[2023/08/08 v0.2.7 Jeux de cartes]
+\ProvidesPackage{JeuxCartes}[2023/09/13 v0.2.8 Jeux de cartes]
+% 0.2.8 Correction de bugs mineurs
% 0.2.7 Retour en arrière design v2 tarot (pb de licence)
% 0.2.5 Correction d'un dysfonctionnement avec le J qui peut désormais être utilisé en MiniCarte avec le Joker [en] + MiniMains [en]
% 0.2.4 Style <fr> avec cartes françaises + <bicycl> + modification des clés avec l'ajout de <StyleJeu> + Suppression xcolor
@@ -143,7 +144,7 @@
\readlist*\ListeCartesMain{#2}%
\def\NbCartesMain{\ListeCartesMainlen}%nbcartes
%main côte à côte
- \foreach \i in {1,2,...,\ListeCartesMainlen}{%
+ \foreach \i in {1,...,\ListeCartesMainlen}{%
\itemtomacro\ListeCartesMain[\i]\CarteMain%
\AffCarteJeu[TypeJeu=\MainSimpleJeuType,StyleJeu=\MainSimpleJeuStyle,Hauteur=\MainSimpleHauteur]{\CarteMain}%
}%
@@ -219,7 +220,7 @@
\foreach \i in {\ListeCartesMainlen,\inteval{\ListeCartesMainlen-1},...,1}
}%
{%
- \foreach \i in {1,2,...,\ListeCartesMainlen}
+ \foreach \i in {1,...,\ListeCartesMainlen}
}%
{%
\itemtomacro\ListeCartesMain[\i]\CarteMain%
@@ -358,7 +359,7 @@
\foreach \i in {#2,\inteval{#2-1},...,1}
}%
{%
- \foreach \i in {1,2,...,#2}
+ \foreach \i in {1,...,#2}
}%
{%début du foreach
\GetItem{CartesJeuMelange}{\inteval{\CarteDebutRand+\i-1}}{CarteMainChoisie}%
@@ -550,7 +551,7 @@
}%
{}%
%création de la main
- \foreach \i in {1,2,...,#2}{%
+ \foreach \i in {1,...,#2}{%
\GetItem{MiniCartesJeuMelange}{\inteval{\i-1}}{MiniCarteMainChoisie}%
\AffMiniCarteJeu[FondAtout=\MiniMainAleaFondAtout,Largeur=\MiniMainAleaLargeur]{\MiniCarteMainChoisie}%
}%finpour
diff --git a/macros/latex/contrib/l3build/CHANGELOG.md b/macros/latex/contrib/l3build/CHANGELOG.md
index 7c6c7f83c4..f0af1e3c8c 100644
--- a/macros/latex/contrib/l3build/CHANGELOG.md
+++ b/macros/latex/contrib/l3build/CHANGELOG.md
@@ -7,6 +7,21 @@ this project uses date-based 'snapshot' version identifiers.
## [Unreleased]
+## [2023-09-13]
+
+### Added
+- Document ConTeXt as supported `checkformat`
+
+### Changed
+- Extend version string normalisation during checks
+ (see issue \#96)
+
+- Extend excludefiles to cover `build.lua` (see \#286)
+### Fixed
+- Return passing errorlevel if BibTeX issues warnings
+ (see \#260)
+- Respect `excludefiles` when doing (local) installation
+
## [2023-09-07]
### Changed
@@ -697,7 +712,8 @@ this project uses date-based 'snapshot' version identifiers.
- Rationalise short option names: removed `-d`, `-E`, `-r`
- Target `cmdcheck`: specific to LaTeX kernel work
-[Unreleased]: https://github.com/latex3/l3build/compare/2023-09-07...HEAD
+[Unreleased]: https://github.com/latex3/l3build/compare/2023-09-13...HEAD
+[2023-09-13]: https://github.com/latex3/l3build/compare/2023-09-07...2023-09-13
[2023-09-07]: https://github.com/latex3/l3build/compare/2023-09-05...2023-09-07
[2023-09-05]: https://github.com/latex3/l3build/compare/2023-07-20...2023-09-05
[2023-07-20]: https://github.com/latex3/l3build/compare/2023-07-17...2023-07-20
diff --git a/macros/latex/contrib/l3build/README.md b/macros/latex/contrib/l3build/README.md
index 825c32f55b..0b7cfe9f97 100644
--- a/macros/latex/contrib/l3build/README.md
+++ b/macros/latex/contrib/l3build/README.md
@@ -1,7 +1,7 @@
l3build: a testing and building system for LaTeX
=================================================
-Release 2023-09-07
+Release 2023-09-13
Overview
--------
diff --git a/macros/latex/contrib/l3build/l3build-check.lua b/macros/latex/contrib/l3build/l3build-check.lua
index 3e26de429b..3279f2c4a1 100644
--- a/macros/latex/contrib/l3build/l3build-check.lua
+++ b/macros/latex/contrib/l3build/l3build-check.lua
@@ -171,6 +171,9 @@ local function normalize_log(content,engine,errlevels)
-- Deal with dates
if match(line, "[^<]%d%d%d%d[/%-]%d%d[/%-]%d%d") then
line = gsub(line,"%d%d%d%d[/%-]%d%d[/%-]%d%d","....-..-..")
+ -- Semantic version-like ones
+ line = gsub(line,"v%d+%.%d+%.%d+[%d%a.+%-]*","v...")
+ -- Classical LaTeX version strings
line = gsub(line,"v%d+%.?%d?%d?%w?","v...")
end
-- Deal with leading spaces for file and page number lines
diff --git a/macros/latex/contrib/l3build/l3build-install.lua b/macros/latex/contrib/l3build/l3build-install.lua
index 64d29fc590..e96259caa3 100644
--- a/macros/latex/contrib/l3build/l3build-install.lua
+++ b/macros/latex/contrib/l3build/l3build-install.lua
@@ -215,6 +215,7 @@ function install_files(target,full,dry_run)
dir = dir or currentdir
include = include or { }
exclude = exclude or { }
+ insert(exclude,excludefiles)
local excludelist = { }
for _,glob_table in pairs(exclude) do
for _,glob in pairs(glob_table) do
diff --git a/macros/latex/contrib/l3build/l3build-typesetting.lua b/macros/latex/contrib/l3build/l3build-typesetting.lua
index d0e491d4c5..c12c544738 100644
--- a/macros/latex/contrib/l3build/l3build-typesetting.lua
+++ b/macros/latex/contrib/l3build/l3build-typesetting.lua
@@ -72,8 +72,10 @@ function bibtex(name,dir)
os_grepexe .. " \"^" .. grep .. "bibdata{\" " .. name .. ".aux > "
.. os_null
) == 0 then
- return runcmd(bibtexexe .. " " .. bibtexopts .. " " .. name,dir,
- {"BIBINPUTS","BSTINPUTS"})
+ local errorlevel = runcmd(bibtexexe .. " " .. bibtexopts .. " " .. name,
+ dir,{"BIBINPUTS","BSTINPUTS"})
+ -- BibTeX(8) signals warnings with errorlevel 1
+ if errorlevel > 1 then return errorlevel else return 0 end
end
end
return 0
diff --git a/macros/latex/contrib/l3build/l3build-variables.lua b/macros/latex/contrib/l3build/l3build-variables.lua
index 204c386f69..bbebf2fd08 100644
--- a/macros/latex/contrib/l3build/l3build-variables.lua
+++ b/macros/latex/contrib/l3build/l3build-variables.lua
@@ -83,7 +83,7 @@ cleanfiles = cleanfiles or {"*.log", "*.pdf", "*.zip"}
demofiles = demofiles or { }
docfiles = docfiles or { }
dynamicfiles = dynamicfiles or { }
-excludefiles = excludefiles or {"*~"}
+excludefiles = excludefiles or {"*~","build.lua","config-*.lua"}
exefiles = exefiles or { }
installfiles = installfiles or {"*.sty","*.cls"}
makeindexfiles = makeindexfiles or {"*.ist"}
diff --git a/macros/latex/contrib/l3build/l3build.1 b/macros/latex/contrib/l3build/l3build.1
index 87dbac2ce3..fbf4b84fda 100644
--- a/macros/latex/contrib/l3build/l3build.1
+++ b/macros/latex/contrib/l3build/l3build.1
@@ -1,4 +1,4 @@
-.TH l3build 1 "2023-09-07"
+.TH l3build 1 "2023-09-13"
.SH NAME
l3build \- Checking and building packages
.SH SYNOPSIS
diff --git a/macros/latex/contrib/l3build/l3build.dtx b/macros/latex/contrib/l3build/l3build.dtx
index d8778fcce7..b6787a1044 100644
--- a/macros/latex/contrib/l3build/l3build.dtx
+++ b/macros/latex/contrib/l3build/l3build.dtx
@@ -88,7 +88,7 @@
\luavarset{demofiles} {\{\}}{Files which show how to use a module}
\luavarset{docfiles} {\{\}}{Files which are part of the documentation but should not be typeset}
\luavarset{dynamicfiles} {\{ \}}{Secondary files to cleared before each test is run}
-\luavarset{excludefiles} {\{"*\string~"\}}{Files to ignore entirely (default for Emacs backup files)}
+\luavarset{excludefiles} {\{"*\string~","build.lua","config-*.lua"\}}{Files to ignore entirely (default for Emacs backup files)}
\luavarset{installfiles} {\{"*.sty","*.cls"\}}{Files to install to the \texttt{tex} area of the \texttt{texmf} tree}
\luavarset{makeindexfiles} {\{"*.ist"\}}{MakeIndex files to be included in a TDS-style zip}
\luavarset{scriptfiles} {\{ \}}{Files to install to the \texttt{scripts} area of the \texttt{texmf} tree}
@@ -251,7 +251,7 @@
% }^^A
% }
%
-% \date{Released 2023-09-07}
+% \date{Released 2023-09-13}
%
% \maketitle
% \tableofcontents
@@ -433,11 +433,13 @@
% configurations are used and need adjustment to the standard engine, this does
% need to be given explicitly using \var{stdengine}.
% The format used for tests can be altered by setting \var{checkformat}: the default setting \texttt{latex} means that tests are run using \emph{e.g.}~\texttt{pdflatex}, whereas setting to \texttt{tex} will run tests using \emph{e.g.}~\texttt{pdftex}.
-% (Currently, this should be one of \texttt{latex} or \texttt{tex}.)
+% (Currently, this should be one of \texttt{latex}, \texttt{tex}, or
+% \texttt{context}.)
% To perform the check, the engine typesets each test up to \var{checkruns} times.
% More detail on this in the documentation on |save|.
-% Options passed to the binary are defined in the variable \var{checkopts}.
-% These are applied in addition to any
+% Options passed to the binary are those defined in the variable
+% \var{checkopts}, followed by the engine-specific ones for the current
+% \var{checkformat} (stored in table \var{specialformats}), if exist.
%
% By default, |texmf| trees are searched for input files when checking. This can be disabled by setting \var{checksearch} to |false|: isolation provides confidence that the tests cannot accidentally be running with incorrect files installed in the main distribution or |hometexmf|.
%
@@ -819,12 +821,13 @@
% For more complex set ups, \var{specialformats} should be used. This is a
% table with one entry per \var{checkformat}. Each entry is itself a table,
% and these contain a list of engines and settings for |binary|, |format|
-% and |options|. For example, for Con\TeX{}t and appropriate set up is
+% and |options|. For example, the set up for Con\TeX{}t in \pkg{l3build} 2023-07-17 is
% \begin{verbatim}
% specialformats.context = {
-% luatex = {binary = "context", format = ""},
-% pdftex = {binary = "texexec", format = ""},
-% xetex = {binary = "texexec", format = "", options = "--xetex"}
+% luametatex = {binary = "context", format = ""},
+% luatex = {binary = "context", format = "", options = "--luatex"},
+% pdftex = {binary = "texexec", format = ""},
+% xetex = {binary = "texexec", format = "", options = "--xetex"}
% }
% \end{verbatim}
% Additional tokens can also be injected before the loading of a test file using
diff --git a/macros/latex/contrib/l3build/l3build.lua b/macros/latex/contrib/l3build/l3build.lua
index 1ac608c971..e520cd1811 100755
--- a/macros/latex/contrib/l3build/l3build.lua
+++ b/macros/latex/contrib/l3build/l3build.lua
@@ -25,7 +25,7 @@ for those people who are interested.
--]]
-- Version information
-release_date = "2023-09-07"
+release_date = "2023-09-13"
-- File operations are aided by the LuaFileSystem module
local lfs = require("lfs")
diff --git a/macros/latex/contrib/l3build/l3build.pdf b/macros/latex/contrib/l3build/l3build.pdf
index e713477fca..4e7c03759d 100644
--- a/macros/latex/contrib/l3build/l3build.pdf
+++ b/macros/latex/contrib/l3build/l3build.pdf
Binary files differ
diff --git a/macros/luatex/latex/lua-typo/README.md b/macros/luatex/latex/lua-typo/README.md
index 526538afb0..8f974434fa 100644
--- a/macros/luatex/latex/lua-typo/README.md
+++ b/macros/luatex/latex/lua-typo/README.md
@@ -90,7 +90,7 @@ Changes
* v.0.70:
- Options handled via `ltkeys` instead of `kvoptions`.
- - code cleaning, bug fixes.
+ - Code cleaning, bug fixes.
* v.0.80:
- Config file `lua-typo.cfg` changed (new colours added, all colour
@@ -99,6 +99,11 @@ Changes
added for lines affected by multiple flaws (f.i. widow+overfull).
- Bug fix (file `.typo`): in footnotes, line numbers for homeoarchy
were not reset.
+
+* v.0.85:
+ - A warning is issued if some pages fail to be checked properly.
+ - Margin notes checking added (over/underfull lines, position).
+ - Code cleaning, bug fixes.
--
Copyright 2020--2023 Daniel Flipo
diff --git a/macros/luatex/latex/lua-typo/doc/lua-typo-demo.pdf b/macros/luatex/latex/lua-typo/doc/lua-typo-demo.pdf
index 6606b65d36..e82b355c62 100644
--- a/macros/luatex/latex/lua-typo/doc/lua-typo-demo.pdf
+++ b/macros/luatex/latex/lua-typo/doc/lua-typo-demo.pdf
Binary files differ
diff --git a/macros/luatex/latex/lua-typo/doc/lua-typo-fr.pdf b/macros/luatex/latex/lua-typo/doc/lua-typo-fr.pdf
index 88dea3e4de..b117378ac8 100644
--- a/macros/luatex/latex/lua-typo/doc/lua-typo-fr.pdf
+++ b/macros/luatex/latex/lua-typo/doc/lua-typo-fr.pdf
Binary files differ
diff --git a/macros/luatex/latex/lua-typo/doc/lua-typo.pdf b/macros/luatex/latex/lua-typo/doc/lua-typo.pdf
index b43a1f75fe..be36b78a7e 100644
--- a/macros/luatex/latex/lua-typo/doc/lua-typo.pdf
+++ b/macros/luatex/latex/lua-typo/doc/lua-typo.pdf
Binary files differ
diff --git a/macros/luatex/latex/lua-typo/source/lua-typo.dtx b/macros/luatex/latex/lua-typo/source/lua-typo.dtx
index 4ec480c921..7809a01377 100644
--- a/macros/luatex/latex/lua-typo/source/lua-typo.dtx
+++ b/macros/luatex/latex/lua-typo/source/lua-typo.dtx
@@ -204,7 +204,7 @@
% \pkg{lua-typo}, il suffit d’ajouter dans le préambule la ligne %\\
% |\usepackage[All]{lua-typo}|
%
-% La version courante (0.80) nécessite un noyau LaTeX récent,
+% La version courante (0.85) nécessite un noyau LaTeX récent,
% 2022/06/01 ou ultérieur. Ceux qui ne disposent que d’un noyau
% antérieur à 2021/06/01 reçoivent un message d’erreur
% «\texttt{Unable to register callback}» ; une version «rollback »
@@ -269,6 +269,7 @@
% consécutives ?\\
% FootnoteSplit & Fin de note de bas de page sur page suivante?\\
% ShortFinalWord & Mot de fin de phrase court en haut de page\\
+% MarginparPos & Note marginale se terminant trop bas\\
% \hline
% \end{tabular}
% \end{table}
@@ -363,7 +364,7 @@
% La valeur donnée doit être un entier supérieur ou égal à~100,
% cette valeur 100 correspond à l’étirement maximal prévu par la
% fonte (|\fontdimen3|) ; avec ce réglage attendez-vous à trouver
-% une kyrielle de lignes les creuses ! En fait la valeur par défaut
+% une kyrielle de lignes creuses ! En fait la valeur par défaut
% (200) correspond approximativement à ce que TeX, avec les
% réglages par défaut (|\tolerance=200|, |\hbadness=1000|),
% considère comme \emph{Underfull hbox}.
@@ -380,7 +381,7 @@
% (trois lettres en commun), mais « mon » et « mont » en début de
% ligne échappent à la détection.
%
-% \item[EOLShortWords:] cette option signale la présence en fin de
+% \item[EOLShortWords:] cette option signale la présence en fin de
% ligne de mots très courts (une ou deux lettres)
% qui sont répertoriés dans une des listes
% suivantes (elles dépendent de la langue courante) :\\
@@ -405,6 +406,12 @@
% caractères}, donc entourée de simples ou doubles
% \emph{quotes} \textsc{ascii} et composées de mots séparés
% par des espaces comme dans les exemples ci-dessus.
+%
+% \item[\cs{luatypoMarginparTol}] est une \emph{dimension} qui vaut
+% |\baselineskip| par défaut; les notes marginales qui se
+% terminent à plus de |\luatypoMarginparTol| en dessous de la
+% dernière ligne de la page sont déclarées fautives.
+%
% \end{description}
%
% À chacune des vérifications faites par \pkg{lua-typo} peut être
@@ -432,6 +439,7 @@
% \luatypoSetColor{14}{cyan} % Note de bas de page éclatée
% \luatypoSetColor{15}{red} % Mot de fin de phrase en haut de page
% \luatypoSetColor{16}{LTline}% Ligne présentant plusieurs "défauts"
+% \luatypoSetColor{17}{red} % Note marginale se terminant trop bas
% \end{verbatim}
% \pkg{lua-typo} charge les extensions \pkg{luacolor} et donc
% \pkg{color}. Seules les couleurs portant un nom (\emph{named
@@ -512,7 +520,8 @@
% for them, a ``rollback’’ version of \pkg{lua-typo} is provided,
% it can be loaded this way: |\usepackage[All]{lua-typo}[=v0.4]|.
%
-% Version 0.80 requires a LaTeX kernel dated 2022/06/01 or later.
+% \enlargethispage*{\baselineskip}
+% Version 0.85 requires a LaTeX kernel dated 2022/06/01 or later.
% Another ``rollback’’ version |[=v0.65]| has been added for those
% who run an older kernel.
%
@@ -558,6 +567,7 @@
% LastWordMatch & same (part of) word ending two consecutive lines?\\
% FootnoteSplit & footnotes spread over two pages or more?\\
% ShortFinalWord & Short word ending a sentence on the next page\\
+% MarginparPos & Margin note ending too low on the page\\
% \hline
% \end{tabular}\\[12pt]
% For example, if you want \pkg{lua-typo} to only warn about overfull
@@ -574,6 +584,7 @@
% this option provides an easy way to get their names without having
% to look into the documentation.
%
+% \newpage
% With option \opt{None}, \pkg{lua-typo} \emph{does absolutely
% nothing}, all checks are disabled as the main function is not added
% to any LuaTeX callback. It not quite equivalent to commenting out
@@ -594,7 +605,8 @@
% \item[ShortFinalWord :] the first word on a page is highlighted
% if it ends a sentence and is short (up to |\luatypoMinLen=4|
% letters).
-% \end{description}
+%
+% \end{description}
%
% \section{Customisation}
%
@@ -682,7 +694,12 @@
% (\emph{i.e.} surrounded by single or double \textsc{ascii}
% quotes) made of your words separated by spaces.
%
-% \end{description}
+% \item[\cs{luatypoMarginparTol}] is a \emph{dimension} which
+% defaults to |\baselineskip|; marginal notes trigger a flaw
+% if they end lower than |\luatypoMarginparTol| under the page’s
+% last line.
+%
+% \end{description}
%
% It is possible to define a specific colour for each
% typographic flaws that \pkg{lua-typo} deals with.
@@ -706,8 +723,8 @@
% \luatypoSetColor{13}{LTgrey}% Paragraph’s last line nearly full
% \luatypoSetColor{14}{cyan} % Footnotes spread over two pages
% \luatypoSetColor{15}{red} % Short final word on top of the page
-% \luatypoSetColor{16}{LTline}% Line color for multiple flaws\end{verbatim}
-%
+% \luatypoSetColor{16}{LTline}% Line color for multiple flaws
+% \luatypoSetColor{17}{red} % Margin note ending too low\end{verbatim}
% \pkg{lua-typo} loads the \pkg{luacolor} package which loads the
% \pkg{color} package from the LaTeX graphic bundle.
% |\luatypoSetColor| requires named colours, so you can either use
@@ -728,7 +745,7 @@
%<+scan>\ProvidesPackage{scan-page}
%<+dtx>\ProvidesFile{lua-typo.dtx}
%<*dtx|sty|scan>
- [2023-04-28 v.0.80 Daniel Flipo]
+ [2023-09-13 v.0.85 Daniel Flipo]
%</dtx|sty|scan>
%<*sty>
% \fi
@@ -746,7 +763,7 @@
% \begin{macrocode}
\DeclareRelease{v0.4}{2021-01-01}{lua-typo-2021-04-18.sty}
\DeclareRelease{v0.65}{2023-03-08}{lua-typo-2023-03-08.sty}
-\DeclareCurrentRelease{}{2023-04-12}
+\DeclareCurrentRelease{}{2023-09-13}
% \end{macrocode}
%
% This package only runs with LuaLaTeX and requires packages
@@ -769,6 +786,7 @@
\newdimen\luatypoLLminWD
\newdimen\luatypoBackPI
\newdimen\luatypoBackFuzz
+\newdimen\luatypoMarginparTol
\newcount\luatypoStretchMax
\newcount\luatypoHyphMax
\newcount\luatypoPageMin
@@ -814,6 +832,7 @@ luatypo = { }
LastWordMatch.if = LT@LastWordMatch ,
FootnoteSplit.if = LT@FootnoteSplit ,
ShortFinalWord.if = LT@ShortFinalWord ,
+ MarginparPos.if = LT@MarginparPos ,
All.if = LT@All ,
All.code = \LT@ShortLinestrue \LT@ShortPagestrue
\LT@OverfullLinestrue \LT@UnderfullLinestrue
@@ -822,7 +841,7 @@ luatypo = { }
\LT@ParLastHyphentrue \LT@EOLShortWordstrue
\LT@FirstWordMatchtrue \LT@LastWordMatchtrue
\LT@BackParindenttrue \LT@FootnoteSplittrue
- \LT@ShortFinalWordtrue
+ \LT@ShortFinalWordtrue \LT@MarginparPostrue
}
\ProcessKeyOptions[luatypo]
% \end{macrocode}
@@ -929,6 +948,12 @@ luatypo = { }
\else
\directlua{ luatypo.ShortFinalWord = false }%
\fi
+ \ifLT@MarginparPos
+ \advance\luatypo@options by 1
+ \directlua{ luatypo.MarginparPos = true }%
+ \else
+ \directlua{ luatypo.MarginparPos = false }%
+ \fi
}
% \end{macrocode}
%
@@ -958,6 +983,7 @@ luatypo = { }
LastWordMatch [false]\MessageBreak
FootnoteSplit [false]\MessageBreak
ShortFinalWord [false]\MessageBreak
+ MarginparPos [false]\MessageBreak
\MessageBreak
*********************************************%
\MessageBreak Lua-typo [ShowOptions]
@@ -979,11 +1005,12 @@ luatypo = { }
% \end{macrocode}
% Ensure |MinFull|$\leq$|MinPart|.
% \begin{macrocode}
- luatypo.MinFull = math.min(luatypo.MinPart,luatypo.MinFull)
- luatypo.MinLen = tex.count.luatypoMinLen
- luatypo.LLminWD = tex.dimen.luatypoLLminWD
- luatypo.BackPI = tex.dimen.luatypoBackPI
- luatypo.BackFuzz = tex.dimen.luatypoBackFuzz
+ luatypo.MinFull = math.min(luatypo.MinPart,luatypo.MinFull)
+ luatypo.MinLen = tex.count.luatypoMinLen
+ luatypo.LLminWD = tex.dimen.luatypoLLminWD
+ luatypo.BackPI = tex.dimen.luatypoBackPI
+ luatypo.BackFuzz = tex.dimen.luatypoBackFuzz
+ luatypo.MParTol = tex.dimen.luatypoMarginparTol
% \end{macrocode}
% \changes{0.80}{2023/04/28}{New table `luatypo.map’ for colours.}
%
@@ -1006,6 +1033,16 @@ luatypo = { }
% (very) end of document and write the report file on disc,
% unless option |None| has been selected.
%
+% On every page, at least one line of text should be found.
+% Otherwise, \pkg{lua-typo} presumes something went wrong and
+% writes the page number to a |failedlist| list.
+% In case |pagelist| is empty \emph{and} |failedlist| \emph{is not},
+% a warning is issued instead of the \texttt{No Typo Flaws found.}
+% message (new to version~0.85).
+%
+% \changes{0.85}{2023/09/07}{Warn in case some pages failed to
+% be checked properly.}
+%
% \begin{macrocode}
\AtVeryEndDocument{%
\ifnum\luatypo@options = 0 \LT@Nonetrue \fi
@@ -1023,14 +1060,27 @@ luatypo = { }
texio.write_nl(' ')
texio.write_nl('*************************************')
if luatypo.pagelist == " " then
- texio.write_nl('*** lua-typo: No Typo Flaws found.')
+ if luatypo.failedlist == " " then
+ texio.write_nl('*** lua-typo: No Typo Flaws found.')
+ else
+ texio.write_nl('*** WARNING: ')
+ texio.write('lua-typo failed to scan these pages:')
+ texio.write_nl('***' .. luatypo.failedlist)
+ texio.write_nl('*** Please report to the maintainer.')
+ end
else
texio.write_nl('*** lua-typo: WARNING *************')
texio.write_nl('The following pages need attention:')
texio.write(luatypo.pagelist)
end
- texio.write_nl('***********************************')
+ texio.write_nl('*************************************')
texio.write_nl(' ')
+ if luatypo.failedlist == " " then
+ else
+ local prt = "WARNING: lua-typo failed to scan pages " ..
+ luatypo.failedlist .. "\string\n\string\n"
+ luatypo.buffer = prt .. luatypo.buffer
+ end
local fileout= tex.jobname .. ".typo"
local out=io.open(fileout,"w+")
out:write(luatypo.buffer)
@@ -1060,7 +1110,7 @@ luatypo = { }
local s = utf8.char(c)
luatypo.single[langno] = luatypo.single[langno] .. s
end
-%<dbg> texio.write_nl("SINGLE=" .. luatypo.single[langno])
+%<dbg> texio.write_nl('SINGLE=' .. luatypo.single[langno])
%<dbg> texio.write_nl(' ')
}%
\else
@@ -1079,7 +1129,7 @@ luatypo = { }
local s = utf8.char(c)
luatypo.double[langno] = luatypo.double[langno] .. s
end
-%<dbg> texio.write_nl("DOUBLE=" .. luatypo.double[langno])
+%<dbg> texio.write_nl('DOUBLE=' .. luatypo.double[langno])
%<dbg> texio.write_nl(' ')
}%
\else
@@ -1113,13 +1163,14 @@ luatypo = { }
%
% \begin{macrocode}
\begin{luacode}
-luatypo.colortbl = { }
-luatypo.map = { }
-luatypo.single = { }
-luatypo.double = { }
-luatypo.pagelist = " "
-luatypo.buffer = "List of typographic flaws found for "
- .. tex.jobname .. ".pdf:\string\n\string\n"
+luatypo.colortbl = { }
+luatypo.map = { }
+luatypo.single = { }
+luatypo.double = { }
+luatypo.pagelist = " "
+luatypo.failedlist = " "
+luatypo.buffer = "List of typographic flaws found for "
+ .. tex.jobname .. ".pdf:\string\n\string\n"
local char_to_discard = { }
char_to_discard[string.byte(",")] = true
@@ -1535,12 +1586,12 @@ local check_line_last_word =
new = utf8_gsub(new, "_+$", "") -- $
new = utf8_gsub(new, "^_+", "")
maxlen = math.min(utf8_len(old), utf8_len(new))
-%<dbg> texio.write_nl("EOLsigold=" .. old)
-%<dbg> texio.write(" EOLsig=" .. new)
+%<dbg> texio.write_nl('EOLsigold=' .. old)
+%<dbg> texio.write(' EOLsig=' .. new)
% \end{macrocode}
-% When called with flag |false|, |check_line_last_word| returns
-% the last word’s signature, but doesn’t compare it with the
-% previous line’s.
+% When called with flag |false|, |check_line_last_word| doesn’t
+% compare it with the previous line’s, but just returns the
+% last word’s signature.
% \begin{macrocode}
if flag and old ~= "" then
% \end{macrocode}
@@ -1571,11 +1622,11 @@ local check_line_last_word =
end
end
if oldsub == newsub then
-%<dbg> texio.write_nl("EOLnewsub=" .. newsub)
+%<dbg> texio.write_nl('EOLnewsub=' .. newsub)
match = true
end
if oldlast == newlast and utf8_len(newlast) >= MinFull then
-%<dbg> texio.write_nl("EOLnewlast=" .. newlast)
+%<dbg> texio.write_nl('EOLnewlast=' .. newlast)
if utf8_len(newlast) > MinPart or not match then
oldsub = oldlast
newsub = newlast
@@ -1621,13 +1672,13 @@ local check_line_last_word =
local c = nn.char
if not char_to_discard[c] then l = l + 1 end
end
-%<dbg> texio.write_nl("l (box)=" .. l)
+%<dbg> texio.write_nl('l (box)=' .. l)
elseif n then
color_node(n, COLOR)
li, newsub = signature(n, newsub, swap)
l = l + li - lo
lo = li
-%<dbg> texio.write_nl("l=" .. l)
+%<dbg> texio.write_nl('l=' .. l)
end
n = n.prev
end
@@ -1688,12 +1739,12 @@ local check_line_first_word =
new = utf8_gsub(new, "_+$", "") -- $
new = utf8_gsub(new, "^_+", "")
maxlen = math.min(utf8_len(old), utf8_len(new))
-%<dbg> texio.write_nl("BOLsigold=" .. old)
-%<dbg> texio.write(" BOLsig=" .. new)
+%<dbg> texio.write_nl('BOLsigold=' .. old)
+%<dbg> texio.write(' BOLsig=' .. new)
% \end{macrocode}
-% When called with flag |false|, |check_line_first_word| returns
-% the first word’s signature, but doesn’t compare it with the
-% previous line’s.
+% When called with flag |false|, |check_line_first_word| doesn’t
+% compare it with the previous line’s, but returns
+% the first word’s signature.
% \begin{macrocode}
if flag and old ~= "" then
local oldfirst = utf8_gsub (old, "_.*", "")
@@ -1713,11 +1764,11 @@ local check_line_first_word =
end
end
if oldsub == newsub then
-%<dbg> texio.write_nl("BOLnewsub=" .. newsub)
+%<dbg> texio.write_nl('BOLnewsub=' .. newsub)
match = true
end
if oldfirst == newfirst and utf8_len(newfirst) >= MinFull then
-%<dbg> texio.write_nl("BOLnewfirst=" .. newfirst)
+%<dbg> texio.write_nl('BOLnewfirst=' .. newfirst)
if utf8_len(newfirst) > MinPart or not match then
oldsub = oldfirst
newsub = newfirst
@@ -1741,7 +1792,7 @@ local check_line_first_word =
end
end
newsub = utf8_gsub(newsub, "_+$", "") --$
-%<dbg> texio.write_nl("BOLfullmatch=" .. newsub)
+%<dbg> texio.write_nl('BOLfullmatch=' .. newsub)
local msg = "B.O.L. MATCH=" .. newsub
log_flaw(msg, line, colno, footnote)
% \end{macrocode}
@@ -1832,7 +1883,7 @@ local check_page_first_word = function (node, colno, footnote)
match = true
end
end
-%<dbg> texio.write_nl("FinalWord=" .. new)
+%<dbg> texio.write_nl('FinalWord=' .. new)
if match then
local msg = "ShortFinalWord=" .. new
log_flaw(msg, 1, colno, footnote)
@@ -1981,11 +2032,11 @@ local footnoterule_ahead = function (head)
if totalht == 0 or totalht == ruleht then
flag = true
else
-%<dbg> texio.write_nl(" ")
-%<dbg> texio.write_nl("Not a footnoterule:")
-%<dbg> texio.write(" KERN height=" .. ht1)
-%<dbg> texio.write(" RULE height=" .. ht2)
-%<dbg> texio.write(" KERN height=" .. ht3)
+%<dbg> texio.write_nl(' ')
+%<dbg> texio.write_nl('Not a footnoterule:')
+%<dbg> texio.write(' KERN height=' .. ht1)
+%<dbg> texio.write(' RULE height=' .. ht2)
+%<dbg> texio.write(' KERN height=' .. ht3)
end
end
end
@@ -2013,15 +2064,108 @@ local check_EOP = function (node)
body_bot = true
elseif footnoterule_ahead(n) then
body_bot = true
-%<dbg> texio.write_nl("=> FOOTNOTE RULE ahead")
-%<dbg> texio.write_nl("check_vtop: last line before footnotes")
-%<dbg> texio.write_nl(" ")
+%<dbg> texio.write_nl('=> FOOTNOTE RULE ahead')
+%<dbg> texio.write_nl('check_vtop: last line before footnotes')
+%<dbg> texio.write_nl(' ')
end
return page_bot, body_bot
end
% \end{macrocode}
% \end{macro}
%
+% \changes{v0.85}{2023/09/07}{New function `check\_marginnote’.}
+%
+% \begin{macro}{check-marginnote}
+% This function checks margin notes for overfull/underfull lines;
+% It also warns if a margin note ends too low under the last line
+% of text.
+% \begin{macrocode}
+local check_marginnote = function (head, line, colno, vpos, bpmn)
+ local OverfullLines = luatypo.OverfullLines
+ local UnderfullLines = luatypo.UnderfullLines
+ local MarginparPos = luatypo.MarginparPos
+ local margintol = luatypo.MParTol
+ local marginpp = tex.getdimen("marginparpush")
+ local pflag = false
+ local ofirst = true
+ local ufirst = true
+ local n = head.head
+ local bottom = vpos
+ if vpos <= bpmn then
+ bottom = bpmn + marginpp
+ end
+%<dbg> texio.write_nl('*** Margin note? ***')
+ repeat
+ if n and (n.id == GLUE or n.id == PENALTY) then
+%<dbg> texio.write_nl(' Found GLUE or PENALTY')
+ n = n.next
+ elseif n and n.id == VLIST then
+%<dbg> texio.write_nl(' Found VLIST')
+ n = n.head
+ end
+ until not n or (n.id == HLIST and n.subtype == LINE)
+ local head = n
+ if head then
+%<dbg> texio.write_nl(' Found HLIST')
+ else
+%<dbg> texio.write_nl(' No text line found.')
+ end
+%<dbg> local l = 0
+ local last = head
+ while head do
+ local next = head.next
+ if head.id == HLIST and head.subtype == LINE then
+%<dbg> l = l + 1
+%<dbg> texio.write_nl(' Checking line ' .. l)
+ bottom = bottom + head.height + head.depth
+ local first = head.head
+ local linewd = head.width
+ local hmax = linewd + tex.hfuzz
+ local w,h,d = dimensions(1,2,0, first)
+ local Stretch = math.max(luatypo.Stretch/100,1)
+ if w > hmax and OverfullLines then
+%<dbg> texio.write(': Overfull!')
+ pflag = true
+ local COLOR = luatypo.colortbl[8]
+ color_line (head, COLOR)
+ if ofirst then
+ local msg = "OVERFULL line(s) in margin note"
+ log_flaw(msg, line, colno, false)
+ ofirst = false
+ end
+ elseif head.glue_set > Stretch and head.glue_sign == 1 and
+ head.glue_order == 0 and UnderfullLines then
+%<dbg> texio.write(': Underfull!')
+ pflag = true
+ local COLOR = luatypo.colortbl[9]
+ color_line (head, COLOR)
+ if ufirst then
+ local msg = "UNDERFULL line(s) in margin note"
+ log_flaw(msg, line, colno, false)
+ ufirst = false
+ end
+ end
+ end
+ last = head
+ head = next
+ end
+ local textht = tex.getdimen("textheight")
+%<dbg> local tht = string.format("%.1fpt", textht/65536)
+%<dbg> local bott = string.format("%.1fpt", bottom/65536)
+%<dbg> texio.write_nl(' Bottom=' .. bott)
+%<dbg> texio.write(' TextBottom=' ..tht)
+ if bottom > textht + margintol and MarginparPos then
+ pflag = true
+ local COLOR = luatypo.colortbl[17]
+ color_line (last, COLOR)
+ local msg = "Margin note too low"
+ log_flaw(msg, line, colno, false)
+ end
+ return bottom, pflag
+end
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{get-pagebody}
% The next function scans the \node{vlist}s on the current
% page in search of the page body.
@@ -2038,29 +2182,29 @@ local get_pagebody = function (head)
repeat
fn = fn.next
until fn.id == VLIST and fn.height > 0
-%<dbg> texio.write_nl(" ")
+%<dbg> texio.write_nl(' ')
%<dbg> local ht = string.format("%.1fpt", fn.height/65536)
%<dbg> local dp = string.format("%.1fpt", fn.depth/65536)
-%<dbg> texio.write_nl("get_pagebody: TOP VLIST")
-%<dbg> texio.write(" ht=" .. ht .. " dp=" .. dp)
+%<dbg> texio.write_nl('get_pagebody: TOP VLIST')
+%<dbg> texio.write(' ht=' .. ht .. ' dp=' .. dp)
first = fn.list
for n in traverse_id(VLIST,first) do
if n.subtype == 0 and n.height == textht then
%<dbg> local ht = string.format("%.1fpt", n.height/65536)
-%<dbg> texio.write_nl("BODY found: ht=" .. ht)
-%<dbg> texio.write_nl(" ")
+%<dbg> texio.write_nl('BODY found: ht=' .. ht)
+%<dbg> texio.write_nl(' ')
body = n
break
else
-%<dbg> texio.write_nl("Skip short VLIST:")
+%<dbg> texio.write_nl('Skip short VLIST:')
%<dbg> local ht = string.format("%.1fpt", n.height/65536)
%<dbg> local dp = string.format("%.1fpt", n.depth/65536)
-%<dbg> texio.write(" ht=" .. ht .. " dp=" .. dp)
+%<dbg> texio.write(' ht=' .. ht .. ' dp=' .. dp)
first = n.list
for n in traverse_id(VLIST,first) do
if n.subtype == 0 and n.height == textht then
%<dbg> local ht = string.format("%.1fpt", n.height/65536)
-%<dbg> texio.write_nl(" BODY: ht=" .. ht)
+%<dbg> texio.write_nl(' BODY: ht=' .. ht)
body = n
break
end
@@ -2068,7 +2212,7 @@ local get_pagebody = function (head)
end
end
if not body then
- texio.write_nl("***lua-typo ERROR: PAGE BODY *NOT* FOUND!***")
+ texio.write_nl('***lua-typo ERROR: PAGE BODY *NOT* FOUND!***')
end
return body
end
@@ -2120,6 +2264,7 @@ check_vtop = function (top, colno, vpos)
vpos_min = vpos_min * 1.5
local linewd = tex.getdimen("textwidth")
local first_bot = true
+ local done = false
local footnote = false
local ftnsplit = false
local orphanflag = false
@@ -2135,6 +2280,7 @@ check_vtop = function (top, colno, vpos)
local pageline = 0
local ftnline = 0
local line = 0
+ local bpmn = 0
local body_bottom = false
local page_bottom = false
local pageflag = false
@@ -2154,9 +2300,11 @@ check_vtop = function (top, colno, vpos)
% \end{macrocode}
% This is a text line, store its width, increment counters
% |pageline| or |ftnline| and |line| (for |log_flaw|).
-% Let’s update |vpos| (vertical position in `sp’ units) too.
+% Let’s update |vpos| (vertical position in `sp’ units) and
+% set flag |done| to |true|.
% \begin{macrocode}
vpos = vpos + head.height + head.depth
+ done = true
local linewd = head.width
local first = head.head
local ListItem = false
@@ -2256,15 +2404,15 @@ check_vtop = function (top, colno, vpos)
% Does the first word and the one on the previous line match
% (except lists)?
% \begin{macrocode}
- if FirstWordMatch then
- local flag = not ListItem and (line > 1)
- firstwd, flag =
- check_line_first_word(firstwd, first, line, colno,
- flag, footnote)
- if flag then
- pageflag = true
- end
+ if FirstWordMatch then
+ local flag = not ListItem and (line > 1)
+ firstwd, flag =
+ check_line_first_word(firstwd, first, line, colno,
+ flag, footnote)
+ if flag then
+ pageflag = true
end
+ end
% \end{macrocode}
% Check the page’s first word (end of sentence?).
% \begin{macrocode}
@@ -2277,12 +2425,19 @@ check_vtop = function (top, colno, vpos)
% and |pn| are the last two nodes.
% \begin{macrocode}
local ln = slide(first)
+% \end{macrocode}
+% Skip a possible RULE pointing an overfull line.
+% \begin{macrocode}
+ if ln.id == RULE and ln.subtype == 0 then
+ ln = ln.prev
+ end
local pn = ln.prev
if pn and pn.id == GLUE and pn.subtype == PARFILL then
% \end{macrocode}
% CASE 1: this line ends the paragraph, reset |ftnsplit| and |orphan|
% flags to false…
% \begin{macrocode}
+%<dbg> texio.write_nl('EOL CASE 1: end of paragraph')
hyphcount = 0
ftnsplit = false
orphanflag = false
@@ -2302,8 +2457,8 @@ check_vtop = function (top, colno, vpos)
local llwd = linewd - PFskip
%<dbg> local PFskip_pt = string.format("%.1fpt", PFskip/65536)
%<dbg> local llwd_pt = string.format("%.1fpt", llwd/65536)
-%<dbg> texio.write_nl("PFskip= " .. PFskip_pt)
-%<dbg> texio.write(" llwd= " .. llwd_pt)
+%<dbg> texio.write_nl('PFskip= ' .. PFskip_pt)
+%<dbg> texio.write(' llwd= ' .. llwd_pt)
% \end{macrocode}
% |llwd| is the line’s length. Is it too short?
% \begin{macrocode}
@@ -2347,6 +2502,7 @@ check_vtop = function (top, colno, vpos)
% \end{macrocode}
% CASE 2: the current line ends with an hyphen.
% \begin{macrocode}
+%<dbg> texio.write_nl('EOL CASE 2: hyphen')
hyphcount = hyphcount + 1
if hyphcount > HYPHmax and RepeatedHyphens then
local COLOR = luatypo.colortbl[3]
@@ -2400,10 +2556,11 @@ check_vtop = function (top, colno, vpos)
end
% \end{macrocode}
% CASE 3: the current line ends with anything else (\node{glyph},
-% \node{mkern}, \node{hlist}, etc.), reset |hyphcount|, check for
-% `LastWordMatch’ and `EOLShortWords’.
+% \node{mkern}, \node{hlist}, etc.), then reset |hyphcount| and
+% check for `LastWordMatch’ and `EOLShortWords’.
% \begin{macrocode}
else
+%<dbg> texio.write_nl('EOL CASE 3')
hyphcount = 0
% \end{macrocode}
% Track matching words at end of line and short words.
@@ -2485,6 +2642,36 @@ check_vtop = function (top, colno, vpos)
color_line (head, COLOR)
backpar = false
end
+ elseif head and head.id == HLIST and head.subtype == BOX and
+ head.width > 0 then
+ if head.height == 0 then
+% \end{macrocode}
+% This is a possible margin note.
+% \begin{macrocode}
+ bpmn, pflag = check_marginnote(head, line, colno, vpos, bpmn)
+ if pflag then pageflag = true end
+ else
+% \end{macrocode}
+% Leave |check_vtop| if a two columns box starts.
+% \begin{macrocode}
+ local hf = head.list
+ if hf and hf.id == VLIST and hf.subtype == 0 then
+%<dbg> texio.write_nl('check_vtop: BREAK => multicol')
+%<dbg> texio.write_nl(' ')
+ break
+ else
+% \end{macrocode}
+% \changes{v0.80}{2023/04/18}{hlist-2: added detection of page bottom
+% and increment line number and vpos.}
+% This is an |\hbox| (f.i.\ centred), let’s update |vpos|, line
+% and check for page bottom
+% \begin{macrocode}
+ vpos = vpos + head.height + head.depth
+ pageline = pageline + 1
+ line = pageline
+ page_bottom, body_bottom = check_EOP (nextnode)
+ end
+ end
elseif head.id == HLIST and
(head.subtype == EQN or head.subtype == ALIGN) and
(head.height > 0 or head.depth > 0) then
@@ -2561,8 +2748,8 @@ check_vtop = function (top, colno, vpos)
% If it is, set the |footnote| flag and reset some counters
% and flags for the coming footnote lines.
% \begin{macrocode}
-%<dbg> texio.write_nl("check_vtop: footnotes start")
-%<dbg> texio.write_nl(" ")
+%<dbg> texio.write_nl('check_vtop: footnotes start')
+%<dbg> texio.write_nl(' ')
footnote = true
ftnline = 0
body_bottom = false
@@ -2580,15 +2767,15 @@ check_vtop = function (top, colno, vpos)
if first_bot then
%<dbg> local vpos_pt = string.format("%.1fpt", vpos/65536)
%<dbg> local vmin_pt = string.format("%.1fpt", vpos_min/65536)
-%<dbg> texio.write_nl("pageline=" .. pageline)
-%<dbg> texio.write_nl("vpos=" .. vpos_pt)
-%<dbg> texio.write(" vpos_min=" .. vmin_pt)
+%<dbg> texio.write_nl('pageline=' .. pageline)
+%<dbg> texio.write_nl('vpos=' .. vpos_pt)
+%<dbg> texio.write(' vpos_min=' .. vmin_pt)
%<dbg> if page_bottom then
%<dbg> local tht = tex.getdimen("textheight")
%<dbg> local tht_pt = string.format("%.1fpt", tht/65536)
-%<dbg> texio.write(" textheight=" .. tht_pt)
+%<dbg> texio.write(' textheight=' .. tht_pt)
%<dbg> end
-%<dbg> texio.write_nl(" ")
+%<dbg> texio.write_nl(' ')
if pageline > 1 and pageline < PAGEmin
and vpos < vpos_min and ShortPages then
pageshort = true
@@ -2619,38 +2806,20 @@ check_vtop = function (top, colno, vpos)
% This is a |\vbox|, let’s update |vpos|.
% \begin{macrocode}
vpos = vpos + head.height + head.depth
- elseif head.id == HLIST and head.subtype == BOX then
-% \end{macrocode}
-% \changes{v0.80}{2023/04/18}{hlist-2: added detection of page bottom
-% and increment line number and vpos.}
-%
-% This is an |\hbox| (f.i.\ centred), let’s update |vpos|, line
-% and check for page bottom
-% \begin{macrocode}
- vpos = vpos + head.height + head.depth
- pageline = pageline + 1
- line = pageline
- page_bottom, body_bottom = check_EOP (nextnode)
- local hf = head.list
-% \end{macrocode}
-% Leave |check_vtop| if a two columns box starts.
-% \begin{macrocode}
- if hf and hf.id == VLIST and hf.subtype == 0 then
-%<dbg> texio.write_nl("check_vtop: BREAK => multicol")
-%<dbg> texio.write_nl(" ")
- break
- end
+%<dbg> local tht = head.height + head.depth
+%<dbg> local tht_pt = string.format("%.1fpt", tht/65536)
+%<dbg> texio.write(' vbox: height=' .. tht_pt)
end
head = nextnode
end
%<dbg> if nextnode then
-%<dbg> texio.write("Exit check_vtop, next=")
+%<dbg> texio.write('Exit check_vtop, next=')
%<dbg> texio.write(tostring(node.type(nextnode.id)))
-%<dbg> texio.write("-".. nextnode.subtype)
+%<dbg> texio.write('-'.. nextnode.subtype)
%<dbg> else
-%<dbg> texio.write_nl("Exit check_vtop, next=nil")
+%<dbg> texio.write_nl('Exit check_vtop, next=nil')
%<dbg> end
-%<dbg> texio.write_nl("")
+%<dbg> texio.write_nl('')
% \end{macrocode}
% Update the list of flagged pages avoiding duplicates:
% \begin{macrocode}
@@ -2661,9 +2830,10 @@ check_vtop = function (top, colno, vpos)
luatypo.pagelist = luatypo.pagelist .. tostring(pageno) .. ", "
end
end
- return head
+ return head, done
% \end{macrocode}
% |head| is nil unless |check_vtop| exited on a two column start.
+% |done| is true unless |check_vtop| found no text line.
% \begin{macrocode}
end
% \end{macrocode}
@@ -2686,49 +2856,71 @@ end
% \begin{macrocode}
luatypo.check_page = function (head)
local textwd = tex.getdimen("textwidth")
- local vpos = 0
- local n2, n3, col, colno
+ local textht = tex.getdimen("textheight")
+ local checked, boxed, n2, n3, col, colno
local body = get_pagebody(head)
+ local pageno = tex.getcount("c@page")
+ local vpos = 0
local footnote = false
local top = body
local first = body.list
- if (first and first.id == HLIST and first.subtype == BOX) or
- (first and first.id == VLIST and first.subtype == 0) then
+ local next
+ local count = 0
+%<dbg> texio.write_nl('Body=' .. tostring(node.type(top.id)))
+%<dbg> texio.write('-' .. tostring(top.subtype))
+%<dbg> texio.write('; First=' .. tostring(node.type(first.id)))
+%<dbg> texio.write('-' .. tostring(first.subtype))
+%<dbg> texio.write_nl(' ')
+ if ((first and first.id == HLIST and first.subtype == BOX) or
+ (first and first.id == VLIST and first.subtype == 0)) and
+ (first.width == textwd and first.height > 0 and not boxed) then
% \end{macrocode}
% Some classes (\cls{memoir}, \cls{tugboat} …) use one more level
-% of bowing, let’s step down one level.
+% of bowing for two columns, let’s step down one level.
% \begin{macrocode}
%<dbg> local boxwd = string.format("%.1fpt", first.width/65536)
-%<dbg> texio.write_nl("One step down: boxwd=" .. boxwd)
-%<dbg> texio.write_nl(" ")
+%<dbg> texio.write_nl('One step down: boxwd=' .. boxwd)
+%<dbg> texio.write_nl(' ')
top = body.list
- first = top.list
+% \end{macrocode}
+% A float on top of a page is a VLIST-0 included in a VLIST-0 (body),
+% it should not trigger this step down. Workaround: the body will be
+% read again.
+% \begin{macrocode}
+ if first.id == VLIST then
+ boxed = body
+ end
end
% \end{macrocode}
% Main loop:
% \begin{macrocode}
while top do
first = top.list
-%<dbg> texio.write_nl("Page loop: top=" .. tostring(node.type(top.id)))
-%<dbg> texio.write("-" .. top.subtype)
-%<dbg> texio.write_nl(" ")
+ next = top.next
+%<dbg> count = count + 1
+%<dbg> texio.write_nl('Page loop' .. count)
+%<dbg> texio.write(': top=' .. tostring(node.type(top.id)))
+%<dbg> texio.write('-' .. tostring(top.subtype))
+%<dbg> if first then
+%<dbg> texio.write(' first=' .. tostring(node.type(first.id)))
+%<dbg> texio.write('-' .. tostring(first.subtype))
+%<dbg> end
if top and top.id == VLIST and top.subtype == 0 and
- top.width > textwd/2 then
+ top.width > textwd/2 then
% \end{macrocode}
% Single column, run |check_vtop| on the top vlist.
% \begin{macrocode}
%<dbg> local boxht = string.format("%.1fpt", top.height/65536)
%<dbg> local boxwd = string.format("%.1fpt", top.width/65536)
-%<dbg> texio.write_nl("**VLIST: ")
+%<dbg> texio.write_nl('**VLIST: ')
%<dbg> texio.write(tostring(node.type(top.id)))
-%<dbg> texio.write("-" .. top.subtype)
-%<dbg> texio.write(" wd=" .. boxwd .. " ht=" .. boxht)
-%<dbg> texio.write_nl(" ")
- local next = check_vtop(top,colno,vpos)
- if next then
- top = next
- elseif top then
- top = top.next
+%<dbg> texio.write('-' .. tostring(top.subtype))
+%<dbg> texio.write(' wd=' .. boxwd .. ' ht=' .. boxht)
+%<dbg> texio.write_nl(' ')
+ local n, ok = check_vtop(top,colno,vpos)
+ if ok then checked = true end
+ if n then
+ next = n
end
elseif (top and top.id == HLIST and top.subtype == BOX) and
(first and first.id == VLIST and first.subtype == 0) and
@@ -2737,23 +2929,24 @@ luatypo.check_page = function (head)
% Two or more columns, each one is boxed in a vlist.\par
% Run |check_vtop| on every column.
% \begin{macrocode}
-%<dbg> texio.write_nl("**MULTICOL type1:")
-%<dbg> texio.write_nl(" ")
+%<dbg> texio.write_nl('**MULTICOL type1:')
+%<dbg> texio.write_nl(' ')
colno = 0
for col in traverse_id(VLIST, first) do
colno = colno + 1
-%<dbg> texio.write_nl("Start of col." .. colno)
-%<dbg> texio.write_nl(" ")
- check_vtop(col,colno,vpos)
-%<dbg> texio.write_nl("End of col." .. colno)
-%<dbg> texio.write_nl(" ")
+%<dbg> texio.write_nl('Start of col.' .. colno)
+%<dbg> texio.write_nl(' ')
+ local n, ok = check_vtop(col,colno,vpos)
+ if ok then checked = true end
+%<dbg> texio.write_nl('End of col.' .. colno)
+%<dbg> texio.write_nl(' ')
end
colno = nil
top = top.next
-%<dbg> texio.write_nl("MULTICOL type1 END: next=")
+%<dbg> texio.write_nl('MULTICOL type1 END: next=')
%<dbg> texio.write(tostring(node.type(top.id)))
-%<dbg> texio.write("-" .. top.subtype)
-%<dbg> texio.write_nl(" ")
+%<dbg> texio.write('-' .. tostring(top.subtype))
+%<dbg> texio.write_nl(' ')
elseif (top and top.id == HLIST and top.subtype == BOX) and
(first and first.id == HLIST and first.subtype == BOX) and
(first.height > 0 and first.width > 0) then
@@ -2762,25 +2955,38 @@ luatypo.check_page = function (head)
% holds a vlist.\par
% Run |check_vtop| on every column.
% \begin{macrocode}
-%<dbg> texio.write_nl("**MULTICOL type2:")
-%<dbg> texio.write_nl(" ")
+%<dbg> texio.write_nl('**MULTICOL type2:')
+%<dbg> texio.write_nl(' ')
colno = 0
for n in traverse_id(HLIST, first) do
colno = colno + 1
local col = n.list
if col and col.list then
-%<dbg> texio.write_nl("Start of col." .. colno)
-%<dbg> texio.write_nl(" ")
- check_vtop(col,colno,vpos)
-%<dbg> texio.write_nl("End of col." .. colno)
-%<dbg> texio.write_nl(" ")
+%<dbg> texio.write_nl('Start of col.' .. colno)
+%<dbg> texio.write_nl(' ')
+ local n, ok = check_vtop(col,colno,vpos)
+ if ok then checked = true end
+%<dbg> texio.write_nl('End of col.' .. colno)
+%<dbg> texio.write_nl(' ')
end
end
colno = nil
- top = top.next
- else
- top = top.next
end
+% \end{macrocode}
+% Workaround for top floats: check the whole body again.
+% \begin{macrocode}
+ if boxed and not next then
+ next = boxed
+ boxed = nil
+ end
+ top = next
+ end
+ if not checked then
+ luatypo.failedlist = luatypo.failedlist .. tostring(pageno) .. ", "
+%<dbg> texio.write_nl(' ')
+%<dbg> texio.write_nl('WARNING: no text line found on page ')
+%<dbg> texio.write(tostring(pageno))
+%<dbg> texio.write_nl(' ')
end
return true
end
@@ -2842,6 +3048,7 @@ return luatypo.check_page
\luatypoSetColor{14}{cyan}% Footnote split
\luatypoSetColor{15}{red}% Too short first (final) word on the page
\luatypoSetColor{16}{LTline}% Line color for multiple flaws
+ \luatypoSetColor{17}{red}% Margin note ending too low
\luatypoBackPI=1em\relax
\luatypoBackFuzz=2pt\relax
\ifdim\parindent=0pt \luatypoLLminWD=20pt\relax
@@ -2852,12 +3059,13 @@ return luatypo.check_page
\luatypoMinFull=3\relax
\luatypoMinPart=4\relax
\luatypoMinLen=4\relax
+ \luatypoMarginparTol=\baselineskip
}%
% \end{macrocode}
% \iffalse
%</sty>
% \fi
-% \clearpage
+%
% \section{Configuration file}
%
% \iffalse
@@ -2892,8 +3100,12 @@ return luatypo.check_page
\luatypoMinPart=4\relax
%% Minimum number of characters for the first word on a page if it ends
-%% a sentence.
-\luatypoMinLen=4\relax
+%% a sentence (version >= 0.65).
+\ifdefined\luatypoMinLen \luatypoMinLen=4\relax\fi
+
+%% Acceptable marginpars must end at |\luatypoMarginparTol| under
+%% the page’s last line or above (version >= 0.85).
+\ifdefined\luatypoMarginparTol \luatypoMarginparTol=\baselineskip \fi
%% Default colours = red, cyan, blue, LTgrey, LTred, LTline.
\definecolor{LTgrey}{gray}{0.6}
@@ -2915,6 +3127,7 @@ return luatypo.check_page
\luatypoSetColor{14}{cyan}% Footnote split
\luatypoSetColor{15}{red}% Too short first (final) word on the page
\luatypoSetColor{16}{LTline}% Line color for multiple flaws
+\luatypoSetColor{17}{red}% Margin note ending too low
%% Language specific settings (example for French):
%% short words (two letters max) to be avoided at end of lines.
@@ -2984,12 +3197,12 @@ return luatypo.check_page
\AtVeryEndDocument{%
\directlua{
- texio.write_nl(" ")
- texio.write_nl("***************************")
- texio.write_nl("*** PAGE SCANNING ONLY: ***")
- texio.write_nl("*** NO CHECK PERFORMED! ***")
- texio.write_nl("***************************")
- texio.write_nl(" ")
+ texio.write_nl(' ')
+ texio.write_nl('***************************')
+ texio.write_nl('*** PAGE SCANNING ONLY: ***')
+ texio.write_nl('*** NO CHECK PERFORMED! ***')
+ texio.write_nl('***************************')
+ texio.write_nl(' ')
}%
}
@@ -3003,6 +3216,7 @@ luatypo.single = { }
luatypo.double = { }
luatypo.colortbl = { }
luatypo.pagelist = " "
+luatypo.failedlist = " "
local hyphcount = 0
local pageno = 0
@@ -3055,20 +3269,20 @@ local get_pagebody = function (head)
for n in traverse_id(VLIST,first) do
if n.subtype == 0 and n.height == textht then
local ht = string.format("%.1fpt", n.height/65536)
- texio.write_nl(" BODY: " .. ht)
- texio.write_nl(" ")
+ texio.write_nl(' BODY: ' .. ht)
+ texio.write_nl(' ')
body = n
break
else
local ht = string.format("%.1fpt", n.height/65536)
local dp = string.format("%.1fpt", n.depth/65536)
- texio.write_nl(" SKIP vlist: ht=" .. ht .. " dp=" .. dp)
+ texio.write_nl(' SKIP vlist: ht=' .. ht .. ' dp=' .. dp)
first = n.list
for n in traverse_id(VLIST,first) do
if n.subtype == 0 and n.height == textht then
ht = string.format("%.1fpt", n.height/65536)
- texio.write_nl(" BODY: " .. ht)
- texio.write_nl(" ")
+ texio.write_nl(' BODY: ' .. ht)
+ texio.write_nl(' ')
body = n
break
end
@@ -3076,7 +3290,7 @@ local get_pagebody = function (head)
end
end
if not body then
- texio.write_nl("***lua-typo ERROR: PAGE BODY *NOT* FOUND!***")
+ texio.write_nl('***lua-typo ERROR: PAGE BODY *NOT* FOUND!***')
end
return body
end
@@ -3088,7 +3302,7 @@ local print_subtype = function (node,parent)
elseif n.id == GLUE then
texio.write(tostring(n.subtype))
real_pt = string.format("%.1fpt", effective_glue(n,parent)/65536)
- texio.write(" realwd=" .. real_pt)
+ texio.write(' realwd=' .. real_pt)
elseif n.id == DISC then
local c = ""
if n.replace then
@@ -3102,24 +3316,24 @@ local print_subtype = function (node,parent)
for nn in traverse_id(GLYPH, n.pre) do
c = c .. utf8.char(nn.char)
end
- texio.write(" pre=" .. c)
+ texio.write(' pre=' .. c)
end
if n.post then
c = ""
for nn in traverse_id(GLYPH, n.post) do
c = c .. utf8.char(nn.char)
end
- texio.write(" post=" .. c)
+ texio.write(' post=' .. c)
end
elseif n.subtype and n.subtype < 256 then
texio.write(tostring(n.subtype))
if n.height and n.depth then
ht_pt = string.format("%.1fpt", n.height/65536)
dp_pt = string.format("%.1fpt", n.depth/65536)
- texio.write(" ht=" .. ht_pt .. " dp=" .. dp_pt)
+ texio.write(' ht=' .. ht_pt .. ' dp=' .. dp_pt)
if n.width then
wd_pt = string.format("%.1fpt", n.width/65536)
- texio.write(" wd=" .. wd_pt)
+ texio.write(' wd=' .. wd_pt)
end
end
end
@@ -3133,58 +3347,62 @@ local scanvlist = function (head)
local textht = tex.getdimen("textheight")
local textwd = tex.getdimen("textwidth")
local pageno = tex.getcount("c@page")
- texio.write_nl("PAGE " .. pageno)
- texio.write(" textheight=".. string.format("%.1fpt", textht/65536))
- texio.write(" textwidth=" .. string.format("%.1fpt", textwd/65536))
+ texio.write_nl('PAGE ' .. pageno)
+ texio.write(' textheight='.. string.format("%.1fpt", textht/65536))
+ texio.write(' textwidth=' .. string.format("%.1fpt", textwd/65536))
local linecount = 0
local body, parent, ht_pt, dp_pt, real_pt
body = get_pagebody(head)
if body then
parent = body
head = body.head
+ texio.write_nl('Enter outer vbox (body) of type ')
+ texio.write(tostring(node.type(body.id)))
+ texio.write('-')
+ texio.write(tostring(body.subtype))
end
- while (head) do
+ while head do
texio.write_nl(tostring(node.type(head.id)))
- texio.write("-")
+ texio.write('-')
print_subtype(head,body)
if head.kern then
ht_pt = string.format("%.1fpt", head.kern/65536)
- texio.write(" KERN ht/wd=" .. ht_pt)
+ texio.write(' KERN ht/wd=' .. ht_pt)
end
local next = head.next
local first = head.head
for n in traverse(first) do
parent = head
- texio.write_nl(" " .. tostring(node.type(n.id)))
- texio.write("-")
+ texio.write_nl(' ' .. tostring(node.type(n.id)))
+ texio.write('-')
print_subtype(n,head)
if n.id == VLIST or n.id == HLIST then
local ff = n.head
for nn in traverse(ff) do
parent = n
- texio.write_nl(" " .. tostring(node.type(nn.id)))
- texio.write("-")
+ texio.write_nl(' ' .. tostring(node.type(nn.id)))
+ texio.write('-')
print_subtype(nn,n)
if nn.id == VLIST or nn.id == HLIST then
local f3 = nn.head
for n3 in traverse(f3) do
parent = nn
- texio.write_nl(" " .. tostring(node.type(n3.id)))
- texio.write("-")
+ texio.write_nl(' ' .. tostring(node.type(n3.id)))
+ texio.write('-')
print_subtype(n3,nn)
if n3.id == VLIST or n3.id == HLIST then
local f4 = n3.head
for n4 in traverse(f4) do
parent = n3
- texio.write_nl(" " .. tostring(node.type(n4.id)))
- texio.write("-")
+ texio.write_nl(' ' .. tostring(node.type(n4.id)))
+ texio.write('-')
print_subtype(n4,n3)
if n4.id == VLIST or n4.id == HLIST then
local f5 = n4.head
for n5 in traverse(f5) do
parent = n4
- texio.write_nl(" " .. tostring(node.type(n4.id)))
- texio.write("-")
+ texio.write_nl(' ' .. tostring(node.type(n5.id)))
+ texio.write('-')
print_subtype(n5,n4)
end
end
diff --git a/macros/texinfo/latest/texinfo.tex b/macros/texinfo/latest/texinfo.tex
index 44004c14bd..cc562fc8e0 100644
--- a/macros/texinfo/latest/texinfo.tex
+++ b/macros/texinfo/latest/texinfo.tex
@@ -3,7 +3,7 @@
% Load plain if necessary, i.e., if running under initex.
\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
%
-\def\texinfoversion{2023-08-13.14}
+\def\texinfoversion{2023-09-12.17}
%
% Copyright 1985, 1986, 1988, 1990-2023 Free Software Foundation, Inc.
%
@@ -11867,9 +11867,13 @@ directory should work if nowhere else does.}
\def\c{\loadconf\c}%
% Definition for the first newline read in the file
\def ^^M{\loadconf}%
- % In case the first line has a whole-line command on it
+ % In case the first line has a whole-line or environment command on it
\let\originalparsearg\parsearg%
\def\parsearg{\loadconf\originalparsearg}%
+ %
+ % \startenvironment is in the expansion of commands defined with \envdef
+ \let\originalstartenvironment\startenvironment%
+ \def\startenvironment{\loadconf\startenvironment}%
}}
@@ -11897,6 +11901,7 @@ directory should work if nowhere else does.}
\enableemergencynewline
\let\c=\comment
\let\parsearg\originalparsearg
+ \let\startenvironment\originalstartenvironment
%
% Also turn back on active characters that might appear in the input
% file name, in case not using a pre-dumped format.