summaryrefslogtreecommitdiff
path: root/macros/latex/base
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2023-11-02 03:04:13 +0000
committerNorbert Preining <norbert@preining.info>2023-11-02 03:04:13 +0000
commit2da66dea964ffa47d24f26081f2942a6e1ef1121 (patch)
tree74283568549892324b317485ab0a26dc23917afb /macros/latex/base
parenta9d0083bcc66de9ea863ed14cf8cde44e88e4355 (diff)
CTAN sync 202311020304
Diffstat (limited to 'macros/latex/base')
-rw-r--r--macros/latex/base/README.md2
-rw-r--r--macros/latex/base/alltt.pdfbin223828 -> 223831 bytes
-rw-r--r--macros/latex/base/cfgguide.pdfbin264157 -> 264168 bytes
-rw-r--r--macros/latex/base/changes.txt126
-rw-r--r--macros/latex/base/classes.pdfbin560996 -> 560998 bytes
-rw-r--r--macros/latex/base/clsguide-historic.pdfbin415586 -> 415615 bytes
-rw-r--r--macros/latex/base/clsguide.pdfbin452015 -> 489925 bytes
-rw-r--r--macros/latex/base/clsguide.tex200
-rw-r--r--macros/latex/base/cmfonts.pdfbin292647 -> 292600 bytes
-rw-r--r--macros/latex/base/cyrguide.pdfbin257359 -> 257359 bytes
-rw-r--r--macros/latex/base/doc-code.pdfbin1075741 -> 1075915 bytes
-rw-r--r--macros/latex/base/doc.pdfbin756154 -> 756298 bytes
-rw-r--r--macros/latex/base/docstrip.dtx25
-rw-r--r--macros/latex/base/docstrip.pdfbin504452 -> 506630 bytes
-rw-r--r--macros/latex/base/encguide.pdfbin1318565 -> 1318576 bytes
-rw-r--r--macros/latex/base/exscale.pdfbin204710 -> 204708 bytes
-rw-r--r--macros/latex/base/fix-cm.pdfbin287726 -> 287727 bytes
-rw-r--r--macros/latex/base/fntguide.pdfbin517658 -> 517708 bytes
-rw-r--r--macros/latex/base/fntguide.tex4
-rw-r--r--macros/latex/base/format.ins2
-rw-r--r--macros/latex/base/graphpap.pdfbin161717 -> 161722 bytes
-rw-r--r--macros/latex/base/ifthen.pdfbin221207 -> 221219 bytes
-rw-r--r--macros/latex/base/inputenc.pdfbin318162 -> 318199 bytes
-rw-r--r--macros/latex/base/lamport-manual.pdfbin170883 -> 170876 bytes
-rw-r--r--macros/latex/base/latexrelease.ins2
-rw-r--r--macros/latex/base/latexrelease.pdfbin282097 -> 282095 bytes
-rw-r--r--macros/latex/base/latexsym.pdfbin200762 -> 200759 bytes
-rw-r--r--macros/latex/base/lb2.err2
-rw-r--r--macros/latex/base/lb2.pdfbin252516 -> 252497 bytes
-rw-r--r--macros/latex/base/letter.pdfbin337923 -> 337852 bytes
-rw-r--r--macros/latex/base/lgc2.err2
-rw-r--r--macros/latex/base/lgc2.pdfbin217757 -> 217659 bytes
-rw-r--r--macros/latex/base/lppl.pdfbin132369 -> 132370 bytes
-rw-r--r--macros/latex/base/ltboxes.dtx95
-rw-r--r--macros/latex/base/ltcmd.dtx153
-rw-r--r--macros/latex/base/ltcmdhooks-code.pdfbin755602 -> 755882 bytes
-rw-r--r--macros/latex/base/ltcmdhooks-doc.pdfbin499096 -> 499346 bytes
-rw-r--r--macros/latex/base/ltexpl.dtx25
-rw-r--r--macros/latex/base/ltfilehook-code.pdfbin804186 -> 804030 bytes
-rw-r--r--macros/latex/base/ltfilehook-doc.pdfbin548776 -> 548695 bytes
-rw-r--r--macros/latex/base/ltfilehook.dtx3
-rw-r--r--macros/latex/base/ltfiles.dtx2
-rw-r--r--macros/latex/base/ltfssaxes.dtx6
-rw-r--r--macros/latex/base/ltfssbas.dtx4
-rw-r--r--macros/latex/base/lthooks-code.pdfbin1243214 -> 1258628 bytes
-rw-r--r--macros/latex/base/lthooks-doc.pdfbin739693 -> 755246 bytes
-rw-r--r--macros/latex/base/lthooks.dtx32
-rw-r--r--macros/latex/base/ltluatex.dtx12
-rw-r--r--macros/latex/base/ltluatex.pdfbin325074 -> 325191 bytes
-rw-r--r--macros/latex/base/ltmarks-code.pdfbin716492 -> 716681 bytes
-rw-r--r--macros/latex/base/ltmarks-doc.pdfbin586622 -> 586808 bytes
-rw-r--r--macros/latex/base/ltmiscen.dtx245
-rw-r--r--macros/latex/base/ltnews.pdfbin1287055 -> 1360066 bytes
-rw-r--r--macros/latex/base/ltnews.tex2
-rw-r--r--macros/latex/base/ltnews01.pdfbin169550 -> 169553 bytes
-rw-r--r--macros/latex/base/ltnews02.pdfbin151773 -> 151773 bytes
-rw-r--r--macros/latex/base/ltnews03.pdfbin151321 -> 151324 bytes
-rw-r--r--macros/latex/base/ltnews04.pdfbin152549 -> 152551 bytes
-rw-r--r--macros/latex/base/ltnews05.pdfbin175216 -> 175211 bytes
-rw-r--r--macros/latex/base/ltnews06.pdfbin142864 -> 142867 bytes
-rw-r--r--macros/latex/base/ltnews07.pdfbin138211 -> 138214 bytes
-rw-r--r--macros/latex/base/ltnews08.pdfbin155434 -> 155442 bytes
-rw-r--r--macros/latex/base/ltnews09.pdfbin130026 -> 130028 bytes
-rw-r--r--macros/latex/base/ltnews10.pdfbin169432 -> 169433 bytes
-rw-r--r--macros/latex/base/ltnews11.pdfbin112202 -> 112208 bytes
-rw-r--r--macros/latex/base/ltnews12.pdfbin156765 -> 156764 bytes
-rw-r--r--macros/latex/base/ltnews13.pdfbin182490 -> 182483 bytes
-rw-r--r--macros/latex/base/ltnews14.pdfbin170721 -> 170722 bytes
-rw-r--r--macros/latex/base/ltnews15.pdfbin130323 -> 130328 bytes
-rw-r--r--macros/latex/base/ltnews16.pdfbin138110 -> 138107 bytes
-rw-r--r--macros/latex/base/ltnews17.pdfbin166268 -> 166269 bytes
-rw-r--r--macros/latex/base/ltnews18.pdfbin39840 -> 39839 bytes
-rw-r--r--macros/latex/base/ltnews19.pdfbin225936 -> 225936 bytes
-rw-r--r--macros/latex/base/ltnews20.pdfbin318193 -> 318193 bytes
-rw-r--r--macros/latex/base/ltnews21.pdfbin245229 -> 245228 bytes
-rw-r--r--macros/latex/base/ltnews22.pdfbin318036 -> 318026 bytes
-rw-r--r--macros/latex/base/ltnews23.pdfbin286839 -> 286824 bytes
-rw-r--r--macros/latex/base/ltnews24.pdfbin265497 -> 265497 bytes
-rw-r--r--macros/latex/base/ltnews25.pdfbin205098 -> 205100 bytes
-rw-r--r--macros/latex/base/ltnews26.pdfbin379722 -> 379733 bytes
-rw-r--r--macros/latex/base/ltnews27.pdfbin251285 -> 251283 bytes
-rw-r--r--macros/latex/base/ltnews28.pdfbin376930 -> 376933 bytes
-rw-r--r--macros/latex/base/ltnews29.pdfbin455431 -> 455437 bytes
-rw-r--r--macros/latex/base/ltnews30.pdfbin512246 -> 512240 bytes
-rw-r--r--macros/latex/base/ltnews31.pdfbin526692 -> 526688 bytes
-rw-r--r--macros/latex/base/ltnews32.pdfbin546554 -> 546540 bytes
-rw-r--r--macros/latex/base/ltnews33.pdfbin522771 -> 522757 bytes
-rw-r--r--macros/latex/base/ltnews34.pdfbin508349 -> 508345 bytes
-rw-r--r--macros/latex/base/ltnews35.pdfbin563329 -> 563307 bytes
-rw-r--r--macros/latex/base/ltnews36.pdfbin517935 -> 517934 bytes
-rw-r--r--macros/latex/base/ltnews37.pdfbin456936 -> 456933 bytes
-rw-r--r--macros/latex/base/ltnews37.tex2
-rw-r--r--macros/latex/base/ltnews38.pdfbin0 -> 523672 bytes
-rw-r--r--macros/latex/base/ltnews38.tex602
-rw-r--r--macros/latex/base/ltpara-code.pdfbin672377 -> 672700 bytes
-rw-r--r--macros/latex/base/ltpara-doc.pdfbin560248 -> 560578 bytes
-rw-r--r--macros/latex/base/ltplain.dtx4
-rw-r--r--macros/latex/base/ltproperties-code.pdfbin0 -> 558646 bytes
-rw-r--r--macros/latex/base/ltproperties-code.tex5
-rw-r--r--macros/latex/base/ltproperties-doc.pdfbin0 -> 433141 bytes
-rw-r--r--macros/latex/base/ltproperties-doc.tex8
-rw-r--r--macros/latex/base/ltproperties.dtx966
-rw-r--r--macros/latex/base/ltshipout-code.pdfbin821824 -> 821655 bytes
-rw-r--r--macros/latex/base/ltshipout-doc.pdfbin566698 -> 566566 bytes
-rw-r--r--macros/latex/base/ltsockets-code.pdfbin0 -> 606454 bytes
-rw-r--r--macros/latex/base/ltsockets-code.tex5
-rw-r--r--macros/latex/base/ltsockets-doc.pdfbin0 -> 489314 bytes
-rw-r--r--macros/latex/base/ltsockets-doc.tex8
-rw-r--r--macros/latex/base/ltsockets.dtx1069
-rw-r--r--macros/latex/base/ltspace.dtx44
-rw-r--r--macros/latex/base/ltvers.dtx4
-rw-r--r--macros/latex/base/ltx3info.pdfbin219347 -> 219358 bytes
-rw-r--r--macros/latex/base/ltxdoc.pdfbin244224 -> 244215 bytes
-rw-r--r--macros/latex/base/makeindx.pdfbin165816 -> 165816 bytes
-rw-r--r--macros/latex/base/manifest.txt1
-rw-r--r--macros/latex/base/modguide.pdfbin257823 -> 257825 bytes
-rw-r--r--macros/latex/base/nfssfont.pdfbin211175 -> 211171 bytes
-rw-r--r--macros/latex/base/proc.pdfbin227060 -> 227065 bytes
-rw-r--r--macros/latex/base/slides.pdfbin375509 -> 375493 bytes
-rw-r--r--macros/latex/base/slifonts.pdfbin234183 -> 234171 bytes
-rw-r--r--macros/latex/base/source2e.pdfbin6007580 -> 6150042 bytes
-rw-r--r--macros/latex/base/source2e.tex4
-rw-r--r--macros/latex/base/source2edoc.cls2
-rw-r--r--macros/latex/base/syntonly.pdfbin189997 -> 190255 bytes
-rw-r--r--macros/latex/base/tlc2.err2
-rw-r--r--macros/latex/base/tlc2.pdfbin291233 -> 291143 bytes
-rw-r--r--macros/latex/base/tlc3.err703
-rw-r--r--macros/latex/base/tlc3.pdfbin250362 -> 326462 bytes
-rw-r--r--macros/latex/base/tulm.pdfbin162770 -> 162773 bytes
-rw-r--r--macros/latex/base/usrguide-historic.pdfbin438603 -> 438602 bytes
-rw-r--r--macros/latex/base/usrguide.pdfbin479599 -> 477695 bytes
-rw-r--r--macros/latex/base/usrguide.tex55
-rw-r--r--macros/latex/base/utf8ienc.pdfbin353579 -> 353655 bytes
-rw-r--r--macros/latex/base/webcomp.pdfbin146199 -> 146199 bytes
134 files changed, 4058 insertions, 370 deletions
diff --git a/macros/latex/base/README.md b/macros/latex/base/README.md
index 758e6c7184..09de821f1d 100644
--- a/macros/latex/base/README.md
+++ b/macros/latex/base/README.md
@@ -1,7 +1,7 @@
The LaTeX kernel
================
-Release 2023-06-01 patch level 1
+Release 2023-11-01
Overview
--------
diff --git a/macros/latex/base/alltt.pdf b/macros/latex/base/alltt.pdf
index 24b95189f8..0bcc657737 100644
--- a/macros/latex/base/alltt.pdf
+++ b/macros/latex/base/alltt.pdf
Binary files differ
diff --git a/macros/latex/base/cfgguide.pdf b/macros/latex/base/cfgguide.pdf
index fe237e926a..1c143425f9 100644
--- a/macros/latex/base/cfgguide.pdf
+++ b/macros/latex/base/cfgguide.pdf
Binary files differ
diff --git a/macros/latex/base/changes.txt b/macros/latex/base/changes.txt
index 686286d2ad..812143d3e3 100644
--- a/macros/latex/base/changes.txt
+++ b/macros/latex/base/changes.txt
@@ -1,16 +1,126 @@
-================================================================================
-This file lists changes to the LaTeX2e files in reverse chronological order of
-publication (therefore the dates might be out of sequence if there are hotfixes).
-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.
-================================================================================
+================================================================================
+This file lists changes to the LaTeX2e files in reverse chronological order
+of publication (therefore the dates might be out of sequence if there are
+hotfixes). 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.
+================================================================================
================================================================================
All changes above are only part of the development branch for the next release.
================================================================================
#########################
+# 2023-11-01 Release
+#########################
+
+2023-10-15 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
+ * ltproperties.dtx:
+ Add support for pagetarget property.
+
+2023-10-26 David Carlisle <David.Carlisle@latex-project.org>
+ * ltboxes.dtx:
+ add check so \makebox[4cm][?]{abc} does not discard text (gh1072)
+
+2023-10-26 Joseph Wright <Joseph.Wright@latex-project.org>
+ * ltspace.tex:
+ Use a protected definition for tilde which is safe in csnames
+
+2023-10-21 Yukai Chou <muzimuzhi@gmai.com>
+ * ltfssbas.dtx, ltplain.dtx, ltspace.dtx:
+ Correct typos
+
+2023-10-14 Joseph Wright <Joseph.Wright@latex-project.org>
+ * clsguide.tex:
+ Additional documentation
+
+2023-10-14 Joseph Wright <Joseph.Wright@latex-project.org>
+ * clsguide.tex:
+ Add that \CurrentOption is available in \DeclareUnknownKeyHandler
+
+2023-10-13 Joseph Wright <Joseph.Wright@latex-project.org>
+ * ltexpl.dtx:
+ Add \IfExplAtLeastTF
+
+2023-10-10 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * docstrip.dtx (section{Internal functions and variables}):
+ Explain the steps carried out by the replacement algorithm for @@.
+
+2023-09-13 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
+ * ltproperties.dtx:
+ Use \protected@edef for expansion in the LaTeX2e commands.
+
+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:
+ Correct typo
+
+2023-09-05 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
+ * ltproperties.dtx:
+ First implementation of properties module
+
+ * ltmiscen.dtx:
+ Add test to \enddocument for changes in property values.
+
+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>
+
+ * 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.tex
+ Various refinements to descriptions of \NewDocumentCommand, etc.
+
+#########################
# 2023-06-01 PL1 Release
#########################
@@ -41,7 +151,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.text
+ * 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/base/classes.pdf b/macros/latex/base/classes.pdf
index b02f360cc0..0a016cdee7 100644
--- a/macros/latex/base/classes.pdf
+++ b/macros/latex/base/classes.pdf
Binary files differ
diff --git a/macros/latex/base/clsguide-historic.pdf b/macros/latex/base/clsguide-historic.pdf
index 39f80d57d4..05014b96fb 100644
--- a/macros/latex/base/clsguide-historic.pdf
+++ b/macros/latex/base/clsguide-historic.pdf
Binary files differ
diff --git a/macros/latex/base/clsguide.pdf b/macros/latex/base/clsguide.pdf
index 585dd936db..06dd277b56 100644
--- a/macros/latex/base/clsguide.pdf
+++ b/macros/latex/base/clsguide.pdf
Binary files differ
diff --git a/macros/latex/base/clsguide.tex b/macros/latex/base/clsguide.tex
index 7225425ec8..457f74f287 100644
--- a/macros/latex/base/clsguide.tex
+++ b/macros/latex/base/clsguide.tex
@@ -42,7 +42,7 @@
\texttt{clsguide.tex} for full details.}%
}
-\date{2023-01-12}
+\date{2023-10-24}
\NewDocumentCommand\cs{m}{\texttt{\textbackslash\detokenize{#1}}}
\NewDocumentCommand\marg{m}{\arg{#1}}
@@ -143,7 +143,7 @@ There are several reasons why we should not make such changes to these
files.
\begin{itemize}
\item
- However misguided, the current behaviour is clearly what was
+ However misguided, the current behavior is clearly what was
intended when these classes were designed.
\item
It is not good practice to change such aspects of `standard classes'
@@ -188,7 +188,7 @@ command which should only be used in the \LaTeX{} kernel, whereas
However, this rule of thumb is still useful: if a command has |@| in
its name then it is not part of the supported \LaTeX{} language---and
-its behaviour may change in future releases! If a command is
+its behavior may change in future releases! If a command is
mixed-case, or is described in \emph{\LaTeXbook}, then you can rely on
future releases of \LaTeX{} supporting the command.
@@ -489,7 +489,7 @@ the |article| class to set the |\paperheight| and |\paperwidth| lengths:
\end{verbatim}
Sometimes a user will request an option which the class or package has not
explicitly declared. By default this will produce a warning (for classes) or
-error (for packages); this behaviour can be altered as follows:
+error (for packages); this behavior can be altered as follows:
\begin{verbatim}
\DeclareOption*{<code>}
\end{verbatim}
@@ -847,7 +847,7 @@ The basic properties provided here are
has no limitation on scope (\texttt{general})
\end{itemize}
The part of the \meta{key} before the \m{property} is the \m{name}, with the
-\m{value} working with the \m{property} to define the behaviour of the option.
+\m{value} working with the \m{property} to define the behavior of the option.
For example, with
\begin{verbatim}
@@ -875,7 +875,15 @@ options.
The command |\DeclareUnknownKeyHandler| may be used to define the behavior when
an undefined key is encountered. The \m{code} will receive the unknown key name
as |#1| and the value as |#2|. These can then be processed as appropriate,
-e.g.~by forwarding to another package.
+e.g.~by forwarding to another package. The entire option is available as
+\cs{CurrentOption}, should it be necessary to pass on options which may or
+may not contain an |=|~sign. For example, this may be used to pass an
+unknown option on to a non-keyval class such as \pkg{article}:
+\begin{verbatim}
+\DeclareUnknownKeyHandler{%
+ \PassOptionsToClass{\CurrentOption}{article}
+}
+\end{verbatim}
\begin{decl}
|\ProcessKeyOptions| \oarg{family}
@@ -883,6 +891,8 @@ e.g.~by forwarding to another package.
The |\ProcessKeyOptions| function is used to check the current option list
against the keys defined for \m{family}. Global (class) options and local
(package) options are checked when this function is called in a package.
+The command will process \emph{all} options given the the current
+package or class: there is no need to also apply \cs{ProcessOptions}.
\begin{decl}
|\SetKeys| \oarg{family} \arg{keyvals}
@@ -1181,12 +1191,184 @@ defined as
where |#1| is the user input and the first argument to
\cs{MakeUppercaseAux} takes two arguments, the locale and input text.
+\subsection{Extended and expandable references of properties}
+
+A property is something that \LaTeX{} can track while processing
+the document, such as a page
+number, a heading number, other counter values, a heading title,
+a position on the page, etc.
+The current value of such properties can be labeled and
+written to the \texttt{aux}-file. It can then be referenced in
+the next compilation, similar to the way the standard \cs{label}/\cs{ref}
+commands work (they record/reference a fixed set of properties:
+label, page, title, and target).
+
+\begin{decl}
+ |\RecordProperties|\arg{label}\arg{list of properties}
+\end{decl}
+This command writes the value(s) of the \meta{list of properties}
+\texttt{aux}-file labeled by \meta{label}. Recorded are either the
+values current when \cs{RecordProperties} is called or the value
+current when the next shipout happens---which depends on the
+declaration for each property.
+%
+The arguments \meta{label} and \meta{list of properties} can contain
+commands that are expanded. \meta{label} can expand to an arbitrary
+string (as long as it can safely be written to the \texttt{aux}-file)
+but note that the label names of \cs{label} and \cs{RecordProperties}
+share a singe namespace. This means that you get a \texttt{Label `A'
+ multiply defined} warning with the following code:
+\begin{verbatim}
+\label{A}\RecordProperties{A}{abspage}
+\end{verbatim}
+
+
+\begin{decl}
+ |\RefProperty|\arg{label}\arg{property}
+\end{decl}
+This command allows to reference the value of the property
+\meta{property} recorded in the previous run and labeled by \meta{label}.
+Differently to the standard
+\cs{ref} command the command is expandable and the value can for
+example---if it is a number---be used in an assignment.\footnote{For
+this to work the default value for the property would need to be a number too,
+because recorded values aren't known in the first \LaTeX{} run.}
+
+\begin{verbatim}
+\section{A section}
+\RecordProperties{mylabel}{pagenum,counter}
+\RefProperty{mylabel}{counter} % outputs section
+\setcounter{mycounter}{\RefProperty{mylabel}{pagenum}}
+\end{verbatim}
+
+
+
+As \cs{RefProperty} is expandable it can not issue a rerun warning if
+a label is not found. If needed such a warning can be forced by the
+following command:
+\begin{decl}
+ |\RefUndefinedWarn|\arg{label}\arg{property}
+\end{decl}
+
+\LaTeX{} predefines a set of properties, this set contains also the
+properties stored by the standard \cs{label} command. In the list
+below \enquote{default} indicates the value returned when the value is
+not yet known (i.e., if it wasn't recorded in the previous run and
+\enquote{at shipout} means that this property is not recorded
+immediately when \cs{RecordProperties} is used but during the next
+\cs{shipout}.
+
+\begin{description}
+ \item[\texttt{abspage} (default: \texttt{0}, at shipout)] The absolute value of the current page:
+ starts at $1$ and increases monotonically at each shipout.
+
+ \item[\texttt{page} (default: \texttt{0}, at 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 \texttt{abspage}. You get this value also with
+ the standard \cs{label}/\cs{pageref}.
+
+ \item[\texttt{pagenum} (default: \texttt{0}, at shipout)] The current page as arabic number. This is
+ suitable for integer operations and comparisions.
+
+ \item[\texttt{label} (default: \texttt{??})] The content of \cs{@currentlabel}. This is the value
+ that you get also with the standard \cs{label}/\cs{ref}.
+
+ \item[\texttt{title} (default: \texttt{\cs{textbf}\{??\}})] The content of \cs{@currentlabelname}. This
+ command is filled beside others by the \pkg{nameref} package and
+ some classes (e.g.~\pkg{memoir}) and typically gives
+ the title defined in the document by some sectioning command
+
+ \item[\texttt{target} (default: \meta{\mdseries empty})] The content of \cs{@currentHref}. This
+ command is normally filled by \pkg{hyperref} and holds the name of
+ the last destination it created.
+
+\item[\texttt{pagetarget} (default: \meta{\mdseries empty}, at shipout)]
+ The content of \cs{@currentHpage}. This command is filled by
+ \pkg{hyperref} (version v7.01c or newer) and holds the name of the last
+ page anchor it created.
+
+ \item[\texttt{counter} (default: \meta{\mdseries empty})] The content of \cs{@currentcounter}. This
+ command contains after a \cs{refstepcounter} the name of the
+ counter.
+
+ \item[\texttt{xpos}, \texttt{ypos} (default: \texttt{0}, at shipout)] These properties records the
+ $x$~and $y$ coordinates of a point previously stored with
+ \cs{pdfsavepos}/\cs{savepos}. E.g.~(if \pkg{bidi} is used it can
+ be necessary to save the position before and after the label):
+ \begin{verbatim}
+ \pdfsavepos
+ \RecordProperties{myposition}{xpos,ypos}%
+ \pdfsavepos
+ \end{verbatim}
+\end{description}
+
+Class and package authors can define more properties to store other
+values they are interested in.
+\begin{decl}
+ |\NewProperty|\arg{name}\arg{setpoint}\arg{default}\arg{code}\\
+ |\SetProperty|\arg{name}\arg{setpoint}\arg{default}\arg{code}
+\end{decl}
+These commands declare or change a property \meta{name}\footnote{Only change
+properties that you have declared. The declarations of standard properties of \LaTeX{} and
+properties of other packages should never be altered!}. If a new property is
+declared within a package it is suggested that its name is always structured
+as follows: \meta{package-name}\texttt{/}\meta{property-name}.
+\meta{setpoint} is either |now| or |shipout| and decides if the value is
+written directly or at the next shipout. \meta{default} is used if the
+property is referenced but not yet known, e.g., in the first run.
+\meta{code} is the code executed when storing the value. For example, the
+\texttt{pagenum} property is declared as
+\begin{verbatim}
+\NewProperty{pagenum}{shipout}{0}{\the\value{page}}
+\end{verbatim}
+
+The commands related to properties are offered as a set of CamelCase
+commands for traditional \LaTeXe{} packages (and for use in the
+document preamble if needed) as well as \texttt{expl3} commands for
+modern packages, that use the L3 programming layer of \LaTeX{}. The
+\texttt{expl3} commands and more details can be found in
+\texttt{ltproperties-doc.pdf}.
+
+\subsection{Preparing link targets}
+
+Active links in a document need targets to which they can jump to. Such
+targets are often created automatically (if the package \pkg{hyperref}
+is loaded) by the \cs{refstepcounter} command but there are also cases
+where class or package authors need to add a target manually, for
+example, in unnumbered sectioning commands or in environments. For this
+\LaTeX{} provides the following commands. \emph{Without}
+\pkg{hyperref} they do nothing or insert only a whatsits
+(to ensure that spacing doesn't change when hyperref is loaded), \emph{with}
+\pkg{hyperref} they add the necessary targets. Details about the
+behavior and the arguments of the following commands can by found in
+the \pkg{hyperref} package in \texttt{hyperref-linktarget.pdf}.
+
+\begin{decl}
+ |\MakeLinkTarget|\oarg{prefix}\arg{counter}\\
+ |\MakeLinkTarget|\oarg{prefix}\{\}\\
+ |\MakeLinkTarget|*\arg{target name}
+\end{decl}
+This command prepares the creations of targets.
+
+\begin{decl}
+ |\LinkTargetOn|\\
+ |\LinkTargetOff|
+\end{decl}
+These commands allow to enable and disable locally the creation of
+targets. This can be useful to suppress targets otherwise created automatically
+by \cs{refstepcounter}.
+
+\begin{decl}
+ |\NextLinkTarget|\arg{target name}
+\end{decl}
+This changes the name of the next target that will be created.
+
\section{Commands superseded for new material}
A small number of commands were introduced as part of \LaTeXe{} in the
-mid-1990s, are widely used but have been superseded by more modern methods.
-These are covered here as they are likely to be encountered routinely in
-existing classes and packages.
+mid-1990s, are widely used but have been superseded by more modern
+methods. These are covered here as they are likely to be encountered
+routinely in existing classes and packages.
\subsection{Defining commands}
diff --git a/macros/latex/base/cmfonts.pdf b/macros/latex/base/cmfonts.pdf
index 396362c196..6dae682fa8 100644
--- a/macros/latex/base/cmfonts.pdf
+++ b/macros/latex/base/cmfonts.pdf
Binary files differ
diff --git a/macros/latex/base/cyrguide.pdf b/macros/latex/base/cyrguide.pdf
index 0ce387ea1b..a4f49af98f 100644
--- a/macros/latex/base/cyrguide.pdf
+++ b/macros/latex/base/cyrguide.pdf
Binary files differ
diff --git a/macros/latex/base/doc-code.pdf b/macros/latex/base/doc-code.pdf
index 357fa04afc..d9eec5ba62 100644
--- a/macros/latex/base/doc-code.pdf
+++ b/macros/latex/base/doc-code.pdf
Binary files differ
diff --git a/macros/latex/base/doc.pdf b/macros/latex/base/doc.pdf
index fc6b230c2a..bea75c57ef 100644
--- a/macros/latex/base/doc.pdf
+++ b/macros/latex/base/doc.pdf
Binary files differ
diff --git a/macros/latex/base/docstrip.dtx b/macros/latex/base/docstrip.dtx
index be373499e6..776d0e68d7 100644
--- a/macros/latex/base/docstrip.dtx
+++ b/macros/latex/base/docstrip.dtx
@@ -31,7 +31,7 @@
\def\filename{docstrip.dtx}
\def\fileversion{v2.6b}
\def\filedate{2022-09-03}
-\def\docdate {2022-09-03}
+\def\docdate {2023-10-10}
%%
%
%\iffalse
@@ -838,6 +838,29 @@
% suppressed by giving an empty module name, namely using the
% syntax \texttt{\%<@@=>}.
%
+% The exact steps that are carried out by this replacement
+% algorithm are the following:
+% \begin{enumerate}
+% \item First, deal with \texttt{@@@@} as a special case (by using a
+% temporary disguise).
+%
+% \item Then change all |__@@| to |__|\meta{module}.
+%
+% \item Then change all remaining |_@@| to
+% |__|\meta{module}.
+%
+% \item Then change all remaining \texttt{@@} to
+% |__|\meta{module}.
+%
+% \item Finally, tidy up by changing each ``disguised
+% \texttt{@@@@}'' to \texttt{@@}.
+% \end{enumerate}
+% Thus, replacement means that \texttt{@@} is replaced by the
+% \meta{module} name and that 0, 1, or 2 underscores in front of
+% \texttt{@@} are replaced by exactly 2 underscores (whilst any
+% larger number of underscores is preserved).
+%
+%
% \section{Those other languages}
% Since \TeX\ is an open system some of \TeX\ packages include
% non-\TeX\ files. Some authors use \ds\ to generate PostScript
diff --git a/macros/latex/base/docstrip.pdf b/macros/latex/base/docstrip.pdf
index 39026d1bdc..86eeca561d 100644
--- a/macros/latex/base/docstrip.pdf
+++ b/macros/latex/base/docstrip.pdf
Binary files differ
diff --git a/macros/latex/base/encguide.pdf b/macros/latex/base/encguide.pdf
index 14feaa7f03..2eb91dada3 100644
--- a/macros/latex/base/encguide.pdf
+++ b/macros/latex/base/encguide.pdf
Binary files differ
diff --git a/macros/latex/base/exscale.pdf b/macros/latex/base/exscale.pdf
index ae7329dd91..100c365be9 100644
--- a/macros/latex/base/exscale.pdf
+++ b/macros/latex/base/exscale.pdf
Binary files differ
diff --git a/macros/latex/base/fix-cm.pdf b/macros/latex/base/fix-cm.pdf
index a78b9a4e1a..4c6012e007 100644
--- a/macros/latex/base/fix-cm.pdf
+++ b/macros/latex/base/fix-cm.pdf
Binary files differ
diff --git a/macros/latex/base/fntguide.pdf b/macros/latex/base/fntguide.pdf
index 5b6920cb3f..92cfacfab8 100644
--- a/macros/latex/base/fntguide.pdf
+++ b/macros/latex/base/fntguide.pdf
Binary files differ
diff --git a/macros/latex/base/fntguide.tex b/macros/latex/base/fntguide.tex
index 619cc907b2..143956ecc4 100644
--- a/macros/latex/base/fntguide.tex
+++ b/macros/latex/base/fntguide.tex
@@ -52,7 +52,7 @@
\texttt{fntguide.tex} for full details.}%
}
-\date{May 2023}
+\date{October 2023}
\begin{document}
@@ -1463,7 +1463,7 @@ which is specific to one encoding. For example, the definition of |\k|
in the |T1| encoding is:
\begin{verbatim}
\DeclareTextCommand{\k}{T1}[1]
- {\oalign{\null#1\crcr\hidewidth\char12}}
+ {\hmode@bgroup\ooalign{\null#1\crcr\hidewidth\char12}\egroup}
\end{verbatim}
|\DeclareTextCommand| takes the same optional arguments as
|\newcommand|.
diff --git a/macros/latex/base/format.ins b/macros/latex/base/format.ins
index 74cd78ff4a..ba0965004d 100644
--- a/macros/latex/base/format.ins
+++ b/macros/latex/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/base/graphpap.pdf b/macros/latex/base/graphpap.pdf
index f52ddaa65f..cc40850371 100644
--- a/macros/latex/base/graphpap.pdf
+++ b/macros/latex/base/graphpap.pdf
Binary files differ
diff --git a/macros/latex/base/ifthen.pdf b/macros/latex/base/ifthen.pdf
index 05bdaae4dd..fd8a7a4f0b 100644
--- a/macros/latex/base/ifthen.pdf
+++ b/macros/latex/base/ifthen.pdf
Binary files differ
diff --git a/macros/latex/base/inputenc.pdf b/macros/latex/base/inputenc.pdf
index 961cd7f8da..bb00659632 100644
--- a/macros/latex/base/inputenc.pdf
+++ b/macros/latex/base/inputenc.pdf
Binary files differ
diff --git a/macros/latex/base/lamport-manual.pdf b/macros/latex/base/lamport-manual.pdf
index 0066c0893d..57e79f436e 100644
--- a/macros/latex/base/lamport-manual.pdf
+++ b/macros/latex/base/lamport-manual.pdf
Binary files differ
diff --git a/macros/latex/base/latexrelease.ins b/macros/latex/base/latexrelease.ins
index 61315f8e07..93739630e3 100644
--- a/macros/latex/base/latexrelease.ins
+++ b/macros/latex/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/base/latexrelease.pdf b/macros/latex/base/latexrelease.pdf
index c75ad13489..4063f8d212 100644
--- a/macros/latex/base/latexrelease.pdf
+++ b/macros/latex/base/latexrelease.pdf
Binary files differ
diff --git a/macros/latex/base/latexsym.pdf b/macros/latex/base/latexsym.pdf
index 6e3e837ccd..d7c3ee94d0 100644
--- a/macros/latex/base/latexsym.pdf
+++ b/macros/latex/base/latexsym.pdf
Binary files differ
diff --git a/macros/latex/base/lb2.err b/macros/latex/base/lb2.err
index d2ea742f82..74c0e222b6 100644
--- a/macros/latex/base/lb2.err
+++ b/macros/latex/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/base/lb2.pdf b/macros/latex/base/lb2.pdf
index 6f22661ffe..32d9e799c4 100644
--- a/macros/latex/base/lb2.pdf
+++ b/macros/latex/base/lb2.pdf
Binary files differ
diff --git a/macros/latex/base/letter.pdf b/macros/latex/base/letter.pdf
index 69f6a08831..591c90152d 100644
--- a/macros/latex/base/letter.pdf
+++ b/macros/latex/base/letter.pdf
Binary files differ
diff --git a/macros/latex/base/lgc2.err b/macros/latex/base/lgc2.err
index cb1a382348..c899388be9 100644
--- a/macros/latex/base/lgc2.err
+++ b/macros/latex/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/base/lgc2.pdf b/macros/latex/base/lgc2.pdf
index 8ea67bbe08..9fc5080fec 100644
--- a/macros/latex/base/lgc2.pdf
+++ b/macros/latex/base/lgc2.pdf
Binary files differ
diff --git a/macros/latex/base/lppl.pdf b/macros/latex/base/lppl.pdf
index 56c2eb87cb..a576e1fd9d 100644
--- a/macros/latex/base/lppl.pdf
+++ b/macros/latex/base/lppl.pdf
Binary files differ
diff --git a/macros/latex/base/ltboxes.dtx b/macros/latex/base/ltboxes.dtx
index ff1717caa9..d84158c161 100644
--- a/macros/latex/base/ltboxes.dtx
+++ b/macros/latex/base/ltboxes.dtx
@@ -33,7 +33,7 @@
%<*driver>
% \fi
\ProvidesFile{ltboxes.dtx}
- [2022/09/07 v1.4d LaTeX Kernel (Box Commands)]
+ [2023/10/26 v1.4e LaTeX Kernel (Box Commands)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltboxes.dtx}
@@ -342,13 +342,36 @@
% \begin{macro}{\@imakebox}
% \changes{v0.1a}{1993/12/03}
% {macro modified}
+% \changes{v1.4e}{2023/10/26}
+% {Guard against unknown alignment gh/1072}
% Internal form of |\makebox|.
% \begin{macrocode}
+%</2ekernel>
+%<latexrelease>\IncludeInRelease{2023/11/01}%
+%<latexrelease> {\@imakebox}{Unknown alignment warning}%
+%<*2ekernel|latexrelease>
\long\def\@imakebox[#1][#2]#3{%
\@begin@tempboxa\hbox{#3}%
\setlength\@tempdima{#1}% support calc
- \hb@xt@\@tempdima{\csname bm@#2\endcsname}%
+ \hb@xt@\@tempdima{%
+ \expandafter\ifx\csname bm@#2\endcsname\relax
+ \bm@c
+ \@latex@warning{Unexpected alignment #2}%
+ \else
+ \csname bm@#2\endcsname
+ \fi}%
\@end@tempboxa}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\@imakebox}{Unknown alignment warning}%
+%<latexrelease>\long\def\@imakebox[#1][#2]#3{%
+%<latexrelease> \@begin@tempboxa\hbox{#3}%
+%<latexrelease> \setlength\@tempdima{#1}% support calc
+%<latexrelease> \hb@xt@\@tempdima{\csname bm@#2\endcsname}%
+%<latexrelease> \@end@tempboxa}
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
% \end{macro}
%
@@ -748,19 +771,46 @@
% {\cs{leavevmode} moved to \cs{@frameb@x}}
% \changes{v1.0s}{1995/04/27}
% {Move \cs{leavevmode} for graphics/1512}
+% \changes{v1.4e}{2023/10/26}
+% {Guard against unknown alignment gh/1072}
% In order to set the whole box, including the frame to the
% specified dimension, we first determine that dimension
% from the natural size of the text, |#3|.
% calculated width.
% \begin{macrocode}
+%</2ekernel>
+%<latexrelease>\IncludeInRelease{2023/11/01}%
+%<latexrelease> {\@iframebox}{Unknown alignment warning}%
+%<*2ekernel|latexrelease>
\long\def\@iframebox[#1][#2]#3{%
\leavevmode
\@begin@tempboxa\hbox{#3}%
\setlength\@tempdima{#1}%
\setbox\@tempboxa\hb@xt@\@tempdima
- {\kern\fboxsep\csname bm@#2\endcsname\kern\fboxsep}%
+ {\kern\fboxsep
+ \expandafter\ifx\csname bm@#2\endcsname\relax
+ \bm@c
+ \@latex@warning{Unexpected alignment #2}%
+ \else
+ \csname bm@#2\endcsname
+ \fi
+ \kern\fboxsep}%
\@frameb@x{\kern-\fboxrule}%
\@end@tempboxa}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\@iframebox}{Unknown alignment warning}%
+%<latexrelease>\long\def\@iframebox[#1][#2]#3{%
+%<latexrelease> \leavevmode
+%<latexrelease> \@begin@tempboxa\hbox{#3}%
+%<latexrelease> \setlength\@tempdima{#1}%
+%<latexrelease> \setbox\@tempboxa\hb@xt@\@tempdima
+%<latexrelease> {\kern\fboxsep\csname bm@#2\endcsname\kern\fboxsep}%
+%<latexrelease> \@frameb@x{\kern-\fboxrule}%
+%<latexrelease> \@end@tempboxa}
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
% \end{macro}
%
@@ -881,9 +931,17 @@
% \changes{v1.1g}{2006/05/18}
% {Ensure \cs{@parboxto} holds the value of \cs{@tempdimb} not the
% register itself (pr/3867)}
+% \changes{v1.4e}{2023/10/26}
+% {Guard against unknown alignment gh/1072}
% The internal version of |\parbox|.
% \begin{macrocode}
\let\@parboxto\@empty
+% \end{macrocode}
+% \begin{macrocode}
+%</2ekernel>
+%<latexrelease>\IncludeInRelease{2023/11/01}%
+%<latexrelease> {\@iiiparbox}{Unknown alignment warning}%
+%<*2ekernel|latexrelease>
\long\def\@iiiparbox#1#2[#3]#4#5{%
\leavevmode
\@pboxswfalse
@@ -899,9 +957,38 @@
\else\@pboxswtrue $\vcenter
\fi\fi\fi
\@parboxto{\let\hss\vss\let\unhbox\unvbox
- \csname bm@#3\endcsname}%
+ \expandafter\ifx\csname bm@#3\endcsname\relax
+ \bm@c
+ \@latex@warning{Unexpected alignment #3}%
+ \else
+ \csname bm@#3\endcsname
+ \fi}%
\if@pboxsw \m@th$\fi
\@end@tempboxa}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\@iiiparbox}{Unknown alignment warning}%
+%<latexrelease>\long\def\@iiiparbox#1#2[#3]#4#5{%
+%<latexrelease> \leavevmode
+%<latexrelease> \@pboxswfalse
+%<latexrelease> \setlength\@tempdima{#4}%
+%<latexrelease> \@begin@tempboxa\vbox{\hsize\@tempdima\@parboxrestore#5\@@par}%
+%<latexrelease> \ifx\relax#2\else
+%<latexrelease> \setlength\@tempdimb{#2}%
+%<latexrelease> \edef\@parboxto{to\the\@tempdimb}%
+%<latexrelease> \fi
+%<latexrelease> \if#1b\vbox
+%<latexrelease> \else\if #1t\vtop
+%<latexrelease> \else\ifmmode\vcenter
+%<latexrelease> \else\@pboxswtrue $\vcenter
+%<latexrelease> \fi\fi\fi
+%<latexrelease> \@parboxto{\let\hss\vss\let\unhbox\unvbox
+%<latexrelease> \csname bm@#3\endcsname}%
+%<latexrelease> \if@pboxsw \m@th$\fi
+%<latexrelease> \@end@tempboxa}
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
% \end{macro}
% \end{macro}
diff --git a/macros/latex/base/ltcmd.dtx b/macros/latex/base/ltcmd.dtx
index d6322ff3ee..dcb85a1ae8 100644
--- a/macros/latex/base/ltcmd.dtx
+++ b/macros/latex/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/base/ltcmdhooks-code.pdf b/macros/latex/base/ltcmdhooks-code.pdf
index 91ad94bbf1..f31b145a3d 100644
--- a/macros/latex/base/ltcmdhooks-code.pdf
+++ b/macros/latex/base/ltcmdhooks-code.pdf
Binary files differ
diff --git a/macros/latex/base/ltcmdhooks-doc.pdf b/macros/latex/base/ltcmdhooks-doc.pdf
index 08d79f4e0a..bb4499d9c3 100644
--- a/macros/latex/base/ltcmdhooks-doc.pdf
+++ b/macros/latex/base/ltcmdhooks-doc.pdf
Binary files differ
diff --git a/macros/latex/base/ltexpl.dtx b/macros/latex/base/ltexpl.dtx
index 92e6de52cb..4e5eba550b 100644
--- a/macros/latex/base/ltexpl.dtx
+++ b/macros/latex/base/ltexpl.dtx
@@ -33,7 +33,7 @@
%<*driver>
% \fi
\ProvidesFile{ltexpl.dtx}
- [2022/02/28 v1.3f LaTeX Kernel (expl3-dependent code)]
+ [2023/10/13 v1.3g LaTeX Kernel (expl3-dependent code)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltexpl.dtx}
@@ -516,4 +516,27 @@
%<latexrelease>\EndIncludeInRelease
% \end{macrocode}
%
+% \DescribeMacro\IfExplAtLeastTF
+% A pretty simple wrapper.
+%
+% \begin{macro}{\IfExplAtLeastTF}
+% \changes{v1.3g}{2023/10/13}{Provide a test for \pkg{expl3} date (gh/1004)}
+% \begin{macrocode}
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2023/11/01}%
+%<latexrelease> {\IfExplAtLeastTF}{Test for expl3 date}%
+\def\IfExplAtLeastTF{\@ifl@t@r\ExplLoaderFileDate}
+% \end{macrocode}
+% \end{macro}
+% We make sure the command is always available.
+% \begin{macrocode}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\IfExplAtLeastTF}{Test for expl3 date}%
+%<latexrelease>
+%<latexrelease>\def\IfExplAtLeastTF{\@ifl@t@r\ExplLoaderFileDate}
+%<latexrelease>\EndIncludeInRelease
+% \end{macrocode}
+%
% \Finale
diff --git a/macros/latex/base/ltfilehook-code.pdf b/macros/latex/base/ltfilehook-code.pdf
index 1a78aaec89..ea7c06646a 100644
--- a/macros/latex/base/ltfilehook-code.pdf
+++ b/macros/latex/base/ltfilehook-code.pdf
Binary files differ
diff --git a/macros/latex/base/ltfilehook-doc.pdf b/macros/latex/base/ltfilehook-doc.pdf
index 8ebe83242b..f135c2a8b4 100644
--- a/macros/latex/base/ltfilehook-doc.pdf
+++ b/macros/latex/base/ltfilehook-doc.pdf
Binary files differ
diff --git a/macros/latex/base/ltfilehook.dtx b/macros/latex/base/ltfilehook.dtx
index e10a5416e5..ae183bfeb4 100644
--- a/macros/latex/base/ltfilehook.dtx
+++ b/macros/latex/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/base/ltfiles.dtx b/macros/latex/base/ltfiles.dtx
index 9b02824197..f079c2cf5b 100644
--- a/macros/latex/base/ltfiles.dtx
+++ b/macros/latex/base/ltfiles.dtx
@@ -1225,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}}%
diff --git a/macros/latex/base/ltfssaxes.dtx b/macros/latex/base/ltfssaxes.dtx
index 9e68b38654..a0746bd08c 100644
--- a/macros/latex/base/ltfssaxes.dtx
+++ b/macros/latex/base/ltfssaxes.dtx
@@ -35,7 +35,7 @@
%
%
\ProvidesFile{ltfssaxes.dtx}
- [2021/03/18 v1.0i LaTeX Kernel (NFSS Axes handing)]
+ [2023/10/30 v1.0i LaTeX Kernel (NFSS Axes handing)]
% \iffalse
\documentclass{ltxdoc}
\begin{document}
@@ -1240,9 +1240,9 @@
% The next rule might be a bit surprising and rightly so. Correct
% would be that \texttt{sc} is not affected by \texttt{up}, i.e.,
% remains \texttt{sc} as showed in the commented out rule. However,
-% for nearly three decades commands such as \upshape{sc} or
+% for nearly three decades commands such as \cs{sc} or
% \cs{textup} changed small caps back to the ``normal'' shape. So
-% for backward compatibility we keep hat behavior.
+% for backward compatibility we keep that behavior.
%
% As a result you are currently typesetting in \texttt{scit} or
% \texttt{scsl} using \cs{upshape} twice will return you to the
diff --git a/macros/latex/base/ltfssbas.dtx b/macros/latex/base/ltfssbas.dtx
index fda3d1ca4b..fa82bd73bb 100644
--- a/macros/latex/base/ltfssbas.dtx
+++ b/macros/latex/base/ltfssbas.dtx
@@ -35,7 +35,7 @@
%
%
\ProvidesFile{ltfssbas.dtx}
- [2023/04/01 v3.2l LaTeX Kernel (NFSS Basic Macros)]
+ [2023/10/21 v3.2l LaTeX Kernel (NFSS Basic Macros)]
% \iffalse
\documentclass{ltxdoc}
\begin{document}
@@ -279,7 +279,7 @@
% For this we compare the given value \verb=#3= with one where we
% may have dropped an ``m''. If nothing has changes,
% fine. Otherwise there was a wrong value which is now corrected in
-% \cs{reservedb} so we use that and also issue a warning.
+% \cs{reserved@b} so we use that and also issue a warning.
% \changes{v3.2j}{2021/06/09}{Improve information message}
% \begin{macrocode}
\edef\reserved@a{#3}%
diff --git a/macros/latex/base/lthooks-code.pdf b/macros/latex/base/lthooks-code.pdf
index ba8140f1a6..357bdba228 100644
--- a/macros/latex/base/lthooks-code.pdf
+++ b/macros/latex/base/lthooks-code.pdf
Binary files differ
diff --git a/macros/latex/base/lthooks-doc.pdf b/macros/latex/base/lthooks-doc.pdf
index c271b480eb..3be0d9ef92 100644
--- a/macros/latex/base/lthooks-doc.pdf
+++ b/macros/latex/base/lthooks-doc.pdf
Binary files differ
diff --git a/macros/latex/base/lthooks.dtx b/macros/latex/base/lthooks.dtx
index 8f78ecd0c6..20d48730c4 100644
--- a/macros/latex/base/lthooks.dtx
+++ b/macros/latex/base/lthooks.dtx
@@ -32,7 +32,7 @@
%
% \begin{macrocode}
\def\lthooksversion{v1.1f}
-\def\lthooksdate{2023/06/16}
+\def\lthooksdate{2023/10/02}
% \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,
@@ -786,7 +795,7 @@
% \end{itemize}
% There can only be a single relation between two labels for a
% given hook,
-% i.e., a later \cs{DeclareHookrule} overwrites any previous
+% i.e., a later \cs{DeclareHookRule} overwrites any previous
% declaration.
%
% The \meta{hook} and \meta{label} can be specified using the
@@ -1557,8 +1566,8 @@
%
% Generic hooks defined in this way are always normal hooks (i.e.,
% you can't implement reversed hooks this way). This is a
-% deliberate limitation, because it speeds up the processessing
-% conciderably.
+% deliberate limitation, because it speeds up the processing
+% considerably.
%
%
% \subsection{Hooks with arguments}
@@ -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
diff --git a/macros/latex/base/ltluatex.dtx b/macros/latex/base/ltluatex.dtx
index 135cb63009..6d274ed5c3 100644
--- a/macros/latex/base/ltluatex.dtx
+++ b/macros/latex/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/base/ltluatex.pdf b/macros/latex/base/ltluatex.pdf
index 23f80ce8cb..d523e3d3ea 100644
--- a/macros/latex/base/ltluatex.pdf
+++ b/macros/latex/base/ltluatex.pdf
Binary files differ
diff --git a/macros/latex/base/ltmarks-code.pdf b/macros/latex/base/ltmarks-code.pdf
index acc4a4fd07..b2e54b6915 100644
--- a/macros/latex/base/ltmarks-code.pdf
+++ b/macros/latex/base/ltmarks-code.pdf
Binary files differ
diff --git a/macros/latex/base/ltmarks-doc.pdf b/macros/latex/base/ltmarks-doc.pdf
index 5ed0b04298..ce69138e07 100644
--- a/macros/latex/base/ltmarks-doc.pdf
+++ b/macros/latex/base/ltmarks-doc.pdf
Binary files differ
diff --git a/macros/latex/base/ltmiscen.dtx b/macros/latex/base/ltmiscen.dtx
index 801d1e6862..74a9685f1f 100644
--- a/macros/latex/base/ltmiscen.dtx
+++ b/macros/latex/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/base/ltnews.pdf b/macros/latex/base/ltnews.pdf
index c95766d1b7..c4db47e2e1 100644
--- a/macros/latex/base/ltnews.pdf
+++ b/macros/latex/base/ltnews.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews.tex b/macros/latex/base/ltnews.tex
index d239fc274f..0cb6ad55cc 100644
--- a/macros/latex/base/ltnews.tex
+++ b/macros/latex/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/base/ltnews01.pdf b/macros/latex/base/ltnews01.pdf
index c02ecc8850..cc27a40283 100644
--- a/macros/latex/base/ltnews01.pdf
+++ b/macros/latex/base/ltnews01.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews02.pdf b/macros/latex/base/ltnews02.pdf
index e28e51abe1..8bf08308cf 100644
--- a/macros/latex/base/ltnews02.pdf
+++ b/macros/latex/base/ltnews02.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews03.pdf b/macros/latex/base/ltnews03.pdf
index ca84edebb2..22c5d06530 100644
--- a/macros/latex/base/ltnews03.pdf
+++ b/macros/latex/base/ltnews03.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews04.pdf b/macros/latex/base/ltnews04.pdf
index 0d6aae69ab..c7e38be796 100644
--- a/macros/latex/base/ltnews04.pdf
+++ b/macros/latex/base/ltnews04.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews05.pdf b/macros/latex/base/ltnews05.pdf
index 2495387708..2bfbc5203c 100644
--- a/macros/latex/base/ltnews05.pdf
+++ b/macros/latex/base/ltnews05.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews06.pdf b/macros/latex/base/ltnews06.pdf
index a4add5f134..002b4628cd 100644
--- a/macros/latex/base/ltnews06.pdf
+++ b/macros/latex/base/ltnews06.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews07.pdf b/macros/latex/base/ltnews07.pdf
index 03553e8991..df61b0c0eb 100644
--- a/macros/latex/base/ltnews07.pdf
+++ b/macros/latex/base/ltnews07.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews08.pdf b/macros/latex/base/ltnews08.pdf
index 48c0387289..8214a4b51e 100644
--- a/macros/latex/base/ltnews08.pdf
+++ b/macros/latex/base/ltnews08.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews09.pdf b/macros/latex/base/ltnews09.pdf
index 14664f9631..902e595af4 100644
--- a/macros/latex/base/ltnews09.pdf
+++ b/macros/latex/base/ltnews09.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews10.pdf b/macros/latex/base/ltnews10.pdf
index 6ddb248e51..ba8b2b7344 100644
--- a/macros/latex/base/ltnews10.pdf
+++ b/macros/latex/base/ltnews10.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews11.pdf b/macros/latex/base/ltnews11.pdf
index 0cfbd4c631..170e28d7a4 100644
--- a/macros/latex/base/ltnews11.pdf
+++ b/macros/latex/base/ltnews11.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews12.pdf b/macros/latex/base/ltnews12.pdf
index eb6f956288..03d8a54107 100644
--- a/macros/latex/base/ltnews12.pdf
+++ b/macros/latex/base/ltnews12.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews13.pdf b/macros/latex/base/ltnews13.pdf
index 81e503d9be..b626a354ea 100644
--- a/macros/latex/base/ltnews13.pdf
+++ b/macros/latex/base/ltnews13.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews14.pdf b/macros/latex/base/ltnews14.pdf
index 5d7fd76410..3fc0e8c4a7 100644
--- a/macros/latex/base/ltnews14.pdf
+++ b/macros/latex/base/ltnews14.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews15.pdf b/macros/latex/base/ltnews15.pdf
index e8c79bdc3a..2f938fc524 100644
--- a/macros/latex/base/ltnews15.pdf
+++ b/macros/latex/base/ltnews15.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews16.pdf b/macros/latex/base/ltnews16.pdf
index 6929abe599..8bee08869f 100644
--- a/macros/latex/base/ltnews16.pdf
+++ b/macros/latex/base/ltnews16.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews17.pdf b/macros/latex/base/ltnews17.pdf
index d61986c987..fd22f3e20a 100644
--- a/macros/latex/base/ltnews17.pdf
+++ b/macros/latex/base/ltnews17.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews18.pdf b/macros/latex/base/ltnews18.pdf
index c45ce489ce..cb3d992d88 100644
--- a/macros/latex/base/ltnews18.pdf
+++ b/macros/latex/base/ltnews18.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews19.pdf b/macros/latex/base/ltnews19.pdf
index 00b9942605..8c7fef291f 100644
--- a/macros/latex/base/ltnews19.pdf
+++ b/macros/latex/base/ltnews19.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews20.pdf b/macros/latex/base/ltnews20.pdf
index b30f5cea8f..1e3f7bbf7e 100644
--- a/macros/latex/base/ltnews20.pdf
+++ b/macros/latex/base/ltnews20.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews21.pdf b/macros/latex/base/ltnews21.pdf
index 1a42b64807..337869f93e 100644
--- a/macros/latex/base/ltnews21.pdf
+++ b/macros/latex/base/ltnews21.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews22.pdf b/macros/latex/base/ltnews22.pdf
index e33218e80a..276644765a 100644
--- a/macros/latex/base/ltnews22.pdf
+++ b/macros/latex/base/ltnews22.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews23.pdf b/macros/latex/base/ltnews23.pdf
index e61131c806..2c4f701092 100644
--- a/macros/latex/base/ltnews23.pdf
+++ b/macros/latex/base/ltnews23.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews24.pdf b/macros/latex/base/ltnews24.pdf
index 97198edd5a..eac6c0c552 100644
--- a/macros/latex/base/ltnews24.pdf
+++ b/macros/latex/base/ltnews24.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews25.pdf b/macros/latex/base/ltnews25.pdf
index 0210784c0a..487826d5d5 100644
--- a/macros/latex/base/ltnews25.pdf
+++ b/macros/latex/base/ltnews25.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews26.pdf b/macros/latex/base/ltnews26.pdf
index 1a2ca7d552..b4033bc8f5 100644
--- a/macros/latex/base/ltnews26.pdf
+++ b/macros/latex/base/ltnews26.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews27.pdf b/macros/latex/base/ltnews27.pdf
index 6fbdbacd6c..e9aedc8be7 100644
--- a/macros/latex/base/ltnews27.pdf
+++ b/macros/latex/base/ltnews27.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews28.pdf b/macros/latex/base/ltnews28.pdf
index d9bfd13c15..fcc6a0797b 100644
--- a/macros/latex/base/ltnews28.pdf
+++ b/macros/latex/base/ltnews28.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews29.pdf b/macros/latex/base/ltnews29.pdf
index e8ca694ce4..9c29d4cb19 100644
--- a/macros/latex/base/ltnews29.pdf
+++ b/macros/latex/base/ltnews29.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews30.pdf b/macros/latex/base/ltnews30.pdf
index 79e55868c2..cecd625638 100644
--- a/macros/latex/base/ltnews30.pdf
+++ b/macros/latex/base/ltnews30.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews31.pdf b/macros/latex/base/ltnews31.pdf
index c5f601fdfc..d8f120c891 100644
--- a/macros/latex/base/ltnews31.pdf
+++ b/macros/latex/base/ltnews31.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews32.pdf b/macros/latex/base/ltnews32.pdf
index d859dde5f0..71ad0309e1 100644
--- a/macros/latex/base/ltnews32.pdf
+++ b/macros/latex/base/ltnews32.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews33.pdf b/macros/latex/base/ltnews33.pdf
index 133dfde137..0e32c23c80 100644
--- a/macros/latex/base/ltnews33.pdf
+++ b/macros/latex/base/ltnews33.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews34.pdf b/macros/latex/base/ltnews34.pdf
index 8c0b7bb996..c2721f2c55 100644
--- a/macros/latex/base/ltnews34.pdf
+++ b/macros/latex/base/ltnews34.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews35.pdf b/macros/latex/base/ltnews35.pdf
index adb182f7eb..7b221cca29 100644
--- a/macros/latex/base/ltnews35.pdf
+++ b/macros/latex/base/ltnews35.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews36.pdf b/macros/latex/base/ltnews36.pdf
index e084426828..7bd4c0d29d 100644
--- a/macros/latex/base/ltnews36.pdf
+++ b/macros/latex/base/ltnews36.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews37.pdf b/macros/latex/base/ltnews37.pdf
index 2abb7b1415..0de6516335 100644
--- a/macros/latex/base/ltnews37.pdf
+++ b/macros/latex/base/ltnews37.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews37.tex b/macros/latex/base/ltnews37.tex
index 5527975c54..3adda3ea90 100644
--- a/macros/latex/base/ltnews37.tex
+++ b/macros/latex/base/ltnews37.tex
@@ -585,7 +585,7 @@ class option \texttt{doc2}. This has now been corrected.
-\subsection{Improve spacing at top of \env{minipages}}
+\subsection{Improve spacing at top of \env{minipage}s}
A list and several other document elements add some vertical space in
front of them. However this should not happen at the beginning of a
diff --git a/macros/latex/base/ltnews38.pdf b/macros/latex/base/ltnews38.pdf
new file mode 100644
index 0000000000..3929f78180
--- /dev/null
+++ b/macros/latex/base/ltnews38.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews38.tex b/macros/latex/base/ltnews38.tex
new file mode 100644
index 0000000000..04ffe1a0ed
--- /dev/null
+++ b/macros/latex/base/ltnews38.tex
@@ -0,0 +1,602 @@
+% \iffalse meta-comment
+%
+% Copyright 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
+
+
+\let\finalpagebreak\pagebreak % for TUB (if they use it)
+
+\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}
+\publicationyear{2023}
+
+\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{News from the \enquote{\LaTeX{} Tagged PDF} project}
+
+The multi-year project to automatically tag \LaTeX{} documents in
+order to make them accessible~\cite{38:blueprint} is progressing
+steadily (at this point in time mainly as experimental
+\texttt{latex-lab} code).
+
+Just recently we added support for automatic tagging of tabular
+structures including environments from \pkg{tabularx} and
+\pkg{longtable}. The code is still in its early stages and lacks
+configuration possibilities\Dash these will be added in the future.
+
+\subsection{Approaching an important milestone}
+
+Nevertheless, with this new addition we are more or less able to
+automatically tag any document that confines itself to the commands
+and environments described in Leslie Lamport's \emph{\LaTeX{}
+Manual}~\cite{38:Lamport} by simply adding a single configuration line
+at the top.
+
+In addition, a number of extension packages that go beyond Lamport are
+already supported, most importantly perhaps \pkg{amsmath} (providing
+extended math capabilities) and \pkg{hyperref} (enhancing \LaTeX{}
+with interactive hyperlinking features).
+\finalpagebreak
+Also already supported are
+some of the major bibliography support packages such as \pkg{natbib}
+and \pkg{biblatex}.
+
+For now activation is done through the line
+\begin{verbatim}
+\DocumentMetadata
+ {testphase={phase-III,math,tabular}}
+\end{verbatim}
+The math and the tabular support are not yet incorporated into
+\texttt{phase-III} but need their own activation, so that we can
+better experiment with additions and code adjustments.
+
+The \texttt{latex-lab} bundle contains various (still untagged)
+documentation files about the new code that can be accessed with
+\verb|texdoc -l latex-lab|.
+
+\subsection{A GitHub repository dedicated to the project}
+
+We have also started a new GitHub repository mainly intended for
+reporting issues, and offering a platform for discussions. For
+example, there is one discussion on ways to extend the \LaTeX{}
+\env{tabular} syntax to allow describing the logical structure of
+tables (e.g., which cells are header cells, etc.).
+
+Having all issues and discussions related to the project in a single
+place instead of being spread across multiple repositories such as
+\pkg{latex2e}, \pkg{latex3}, \pkg{tagpdf}, \pkg{hyperref},
+\pkg{pdfresources}, etc., helps people to find information easily
+and report any issue related to the project without needing to know in which
+code repository the problematic code resides.
+
+You find this repository at
+\url{https://github.com/latex3/tagging-project} and the mentioned
+discussion on \env{tabular} syntax at
+\url{https://github.com/latex3/tagging-project/discussions/1}.
+
+Your feedback is important and reporting what doesn't yet work is
+beneficial to all users, so we hope to see you there and thank you for
+any contribution, whether it is an issue or a post on a discussion
+thread.
+
+
+\section{Hooks, sockets and plugs}
+
+In previous releases of \LaTeX{} we introduced the general concept of
+hooks (both specific and generic ones). These are places in the
+code into which different packages (or the user in the document
+preamble) can safely add their own code to extend the functionality of
+existing commands and environments without the need to overwrite or
+patch them in incompatible ways. An important feature of such hooks is
+that the code chunks added by different packages can be ordered by
+rules, if necessary,
+\finalpagebreak
+thereby avoiding problems arising from
+differences in package loading order. See \LaTeX{} News issues
+32--34~\cite{38:ltnews} for more information.
+
+However, sometimes you need a kind of \enquote{hook} into which only a
+single chunk of code is placed at any time.\footnote{While this is in
+theory possible to model with the existing hook mechanism, it is
+inefficient and cumbersome.} For example, there is code that
+implements footnote placement in relation to bottom floats (above or
+below them). But at any time in the document only one such placement
+code can be in force. Or consider the extra code needed for making
+\LaTeX{} documents accessible (e.g., adding tags to the PDF
+output). Such code is either there (perhaps in alternative versions)
+or not at all, but it cannot have code from other packages added at
+the same point interfering with the algorithm.
+
+For these use cases we now introduce the concept of sockets and plugs.
+A socket is a place in the code into which one can put a plug (a
+chunk of code with a name) after which the socket is in use; to put in
+a different plug, the former one has to be taken out
+first.\footnote{Think of electric outlets and plugging something into
+them.} A socket may or may not have inputs that can then be used by
+the plugs.
+%
+While this is technically not much different to putting a command in
+the code and at some point alter its definition, the advantage is that
+this offers a consistent interface, allows for status information,
+supports tracing, etc.
+
+You declare a new socket and possibly some plugs for it with
+\begin{flushleft}
+ \cs{NewSocket}\Arg{socket name}\Arg{\# of inputs} \\
+ \cs{NewSocketPlug}\Arg{socket name}\Arg{plug name}\Arg{code}
+\end{flushleft}
+For example, after the declaration \verb=\NewSocket{foo}{0}= you can
+immediately use this socket in your code with \verb=\UseSocket{foo}=.
+The \cs{NewSocket} declaration automatically defines a simple plug
+with the name \texttt{noop} for the socket and assigns it to the socket
+(plugs it in), thus your \cs{UseSocket} sits idle doing
+nothing\footnote{Sockets with one input also define an
+\texttt{identity} plug and initially assign that to the socket\Dash
+this means that their input is simply returned without processing.}
+until you assign it a different plug, which is done with
+\cs{AssignSocketPlug}. This takes the current plug out and puts the
+new one in.
+%
+All the declarations and commands are also available in the \LaTeX3
+programming layer as \cs{socket\_new:nn}, \cs{socket\_new\_plug:nnn},
+etc.
+
+With this concept we can, for example, add tagging support for the
+\enquote{\LaTeX{} Tagged PDF} project to various packages without
+altering their behavior if the tagging code is inactive. Activating
+one or the other form of tagging then just means to assign named plugs
+to the different sockets.
+
+This is just a brief introduction to the mechanism; for more detailed
+documentation see \texttt{texdoc ltsockets-doc}.
+
+
+\finalpagebreak
+
+\section{Document properties and cross-referencing}
+
+Traditional \LaTeX{} uses \cs{label}\Arg{key} to record the values of two
+\enquote{local} properties of the document: the textual
+representations of the \emph{current page number} and the
+\emph{current \textup{\cs{ref}} value} set by \cs{refstepcounter}
+declarations~\cite[p.~209]{38:Lamport}. (These declarations are
+issued, for example, by sectioning commands, by numbered environments
+like \env{equation}, and by \cs{item} in an \env{enumerate} or
+similar environment.)
+
+These two recorded values can then be accessed and typeset (from
+anywhere in the next run of the document) by use of the
+(non-expandable) commands \cs{ref} and \cs{pageref} using the
+\emph{key} that was specified as the argument to \cs{label} when
+recording these values. This supported basic cross-referencing
+(within a document), using these recorded values to provide both
+page-related and counter-related information (such as the page xvii or
+the subsection number 4.5.2).\footnote{In the Spring 2023 release of
+\LaTeX{}, the \cs{label} command was extended to record, in addition,
+both a title (such as the text used in a section head) and the
+\emph{logical name} used for an associated link target provided these
+have been set by packages such as \pkg{nameref} or \pkg{hyperref}.}
+
+
+Over the years \LaTeX{} packages have appeared that extend
+this basic \enquote{label-ref system} in various ways.
+%
+For example, the \pkg{refcount} package made a small but significant change
+to the functions used to access recorded values, by making them expandable.
+And the \pkg{smart-ref} package supports the storage of a larger
+collection of counter values so that, for example, a cross-reference
+can refer to the relevant chapter together with an equation tag.
+The \pkg{cleveref} package stores (by means of a second, internal
+\enquote{logical label}) extra information such as the name of the counter.
+The \pkg{hyperref} package adds the \cs{autoref} command, which
+tries to retrieve the name of a counter from the \emph{logical name}
+used for a link target.
+The \pkg{tikzmarks} library records information about
+ \emph{labelled positions} on the page when using \pkg{tikz}.
+Finally, the \pkg{zref} package implements many related ideas, including a general
+idea of properties and lists of properties, with methods to record, and
+subsequently access, the value of any declared property.
+
+
+Starting with this release, the \LaTeX{} kernel provides handling of
+general document properties as a core functionality with standard
+interfaces.
+%
+This is based on concepts introduced by the \pkg{zref} package but
+with some differences in detail, particularly in the implementation.
+It supports the declaration of new properties, and the recording of
+the values of any list of properties. These values are retrieved
+expandably.
+
+To set up a new property that is the current chapter
+number, for example, here is the declaration to use.
+\begin{verbatim}
+ \NewProperty{chapter}{now}{?}{\thechapter}
+\end{verbatim}
+\par\finalpagebreak\noindent
+The second argument means that the property value will be recorded
+immediately (\enquote{now}), and not \enquote{during the next
+ \cs{shipout}}. The third argument sets a default to be used when,
+for example, an unknown label is supplied.
+%
+The final argument contains the code that will, as part of the
+recording process, be expanded to obtain the value to record for this
+property.
+
+Then, to record the value of this new property,
+together with others, use this command.
+\begin{verbatim}
+ \RecordProperties{mylabel}
+ {chapter,page,label}
+\end{verbatim}
+This records the current values for the properties \texttt{chapter},
+\texttt{page}, and \texttt{label}, using \texttt{mylabel} as the
+label, or \emph{key}, for the record.
+
+To \emph{reference} (i.e., retrieve) this recorded value for use in a
+cross-reference to this chapter, use the \cs{RefProperty} command with
+two arguments: the label, or \emph{key}, and the property.
+\begin{verbatim}
+ \RefProperty{mylabel}{chapter}
+\end{verbatim}
+
+The
+\LaTeX{} kernel itself contains
+declarations for some generally useful properties,
+including these:
+\begin{description}
+\item[\texttt{label}] the textual representation of the \emph{current
+\textup{\cs{ref}} value}, see above;
+
+\item[\texttt{page}] the textual representation of the page number for
+ the page currently under construction;
+
+\item[\texttt{title}] the title, if set by, e.g.,~\pkg{nameref};
+
+\item[\texttt{target}] the logical name of the associated link target,
+ if set by, e.g.,~\pkg{hyperref};
+
+\item[\texttt{pagetarget}] the logical name of the target added by
+ \pkg{hyperref} at the origin of each shipped out page;
+
+\item[\texttt{pagenum}] the value of the \LaTeX{} counter
+ \texttt{page} in Arabic numerals;
+
+\item[\texttt{abspage}] the absolute page number of the page under
+ construction, i.e., one more than the number of pages shipped out so
+ far (thus it starts at 1 and is increased by 1 whenever a page is
+ shipped out);
+
+\item[\texttt{counter}] the name of the counter that produced the
+ \emph{current \textup{\cs{ref}} value}, i.e., the counter that was
+ stepped in the most recent \cs{refstepcounter} within the current
+ scope;
+
+\item[\texttt{xpos}, \texttt{ypos}] the position on the shipped out
+ page as set by the most recent \cs{pdfsavepos}: recording these
+ properties should be done as soon as possible after saving the
+ position.
+\end{description}
+
+Both \LaTeXe{} commands (using camel-case names) and
+\LaTeX3 programming layer commands are provided.
+%
+For a more complete documentation, see \texttt{texdoc ltproperties-doc}.
+
+
+
+\finalpagebreak
+
+\section{New or improved commands}
+
+\subsection{Testing for the \LaTeX3 programming layer version: \cs{IfExplAtLeastTF}}
+
+The integration of \pkg{expl3} (the \LaTeX3 programming layer)
+into the kernel means that programmers can use all of the features
+available without needing to load it explicitly. However, as \pkg{expl3}
+is upgraded separately from \LaTeXe{} and is not a separate package, its
+version is different from that of \LaTeXe{} and cannot be tested using
+\cs{IfPackageAtLeastTF}. To date, low-level methods have therefore
+been needed to check for the availability of features in
+\pkg{expl3}. We have now added \cs{IfExplAtLeastTF} as a test working
+in the same way as \cs{IfPackageAtLeastTF} but focused on the
+pre-loaded programming layer. Programmers can check the date of
+\pkg{expl3} they are using in the \texttt{.log}, as it appears both at
+the start and end in the format
+\begin{verbatim}
+ L3 programming layer <YYYY-MM-DD>
+\end{verbatim}
+just after the line which identifies the format (\texttt{LaTeX2e}, etc.).
+%
+\githubissue{1004}
+
+
+\section{Code improvements}
+
+\subsection{Support for tabs in \cs{verb*} and \env{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
+\env{verbatim} and \env{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 \env{verbatim*}, and their
+behavior can be adjusted if required to be different from that of spaces.
+%
+\githubissue{1085}
+
+
+\subsection{Improved argument checking for box commands}
+Previously if an alignment option had an unexpected value, such as
+\verb|\makebox[4cm][x]{text}|,
+no warning was given but the box content was silently discarded.
+This will now produce a warning and act like the default \texttt{c} alignment.
+\cs{framebox} and \cs{parbox} have a similar change.
+%
+\githubissue{1072}
+
+
+\subsection{Aligning status of tilde with other active characters}
+
+Some time ago we revised the definition of active characters in \pdfTeX{} to
+allow the full range of UTF-8 codepoints to be used in for example labels,
+file names, etc. However, \verb|~| was not changed at that point as it is active
+independent of the engine in use. This has now been corrected: the definition
+of \verb|~| is an engine-protected one which gives the string version of the
+character if used inside a csname.
+
+\finalpagebreak
+
+\subsection{In the programming layer}
+
+In the programming layer (\pkg{expl3}), we have revised the behavior of the
+titlecasing function to enable this to either titlecase only the first word of
+the input, or to titlecase every word. This should be transparent at the
+document level but will be useful for programmers.
+
+We have also added the ability to define variables and functions inside
+\cs{fpeval} (at the \pkg{expl3} level this is \cs{fp\_eval:n}). This allows
+programmers to create non-standard functions that can then be used inside
+\cs{fpeval}. For example, this could be used to create a new function
+\texttt{dinner}:
+\begin{verbatim}
+\ExplSyntaxOn
+\fp_new_variable:n{duck}
+\fp_new_function:n{dinner}
+\fp_set_function:nnn{dinner}{duck}
+ {duck - 0.25 * duck}
+\fp_set_variable:nn{duck}{1}
+$\fp_eval:n{duck}
+ >\fp_eval:n{dinner(duck)}
+ \fp_set_variable:nn{duck}{dinner(duck)}
+ >\fp_eval:n{dinner(duck)}
+ \fp_set_variable:nn{duck}{dinner(duck)}
+ >\fp_eval:n{dinner(duck)}
+ \fp_set_variable:nn{duck}{dinner(duck)}
+ >\fp_eval:n{dinner(duck)}
+$
+\ExplSyntaxOff
+\end{verbatim}
+
+The computation above would then generate
+\begin{quote}
+\ExplSyntaxOn
+\fp_new_variable:n{duck}
+\fp_new_function:n{dinner}
+\fp_set_function:nnn{dinner}{duck}
+ {duck - 0.25 * duck}
+\fp_set_variable:nn{duck}{1}
+$\fp_eval:n{duck}
+ >\fp_eval:n{dinner(duck)}
+ \fp_set_variable:nn{duck}{dinner(duck)}
+ >\fp_eval:n{dinner(duck)}
+ \fp_set_variable:nn{duck}{dinner(duck)}
+ >\fp_eval:n{dinner(duck)}
+ \fp_set_variable:nn{duck}{dinner(duck)}
+ >\fp_eval:n{dinner(duck)}
+$
+\ExplSyntaxOff
+\end{quote}
+
+Users will be able to access added functions without needing to use the
+\pkg{expl3} layer. It is possible that a future release of \LaTeX{} will
+add the ability to create and set floating point variables at the
+document level: this will be examined based on feedback on the
+utility of the programming layer change.
+
+
+\section{\emph{Removed} kernel 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 removed commands exposed implementation
+details. They were essentially debugging tools which with hindsight should
+not have been made available directly in the kernel.
+
+
+% \section{Bug fixes}
+
+\finalpagebreak
+
+\section{Changes to packages in the \pkg{tools} category}
+
+\subsection{\pkg{longtable}: correct p-column definition}
+
+In general the \pkg{longtable} implementation follows the \pkg{array}
+usage but the package didn't take over a change made 1992 in
+\pkg{array} which adjusted the handling of the strut inserted at the
+begin of p-columns. As a consequence there are a number of
+inconsistencies in the output of p-columns between \pkg{tabular} and
+\pkg{longtable}. This has been corrected; \pkg{longtable} now uses for
+the strut the same definition as \pkg{array}.
+%
+\githubissue{1128}
+
+\medskip
+\tubcommand{\newpage}
+
+\begin{thebibliography}{9}
+
+%\fontsize{9.3}{11.3}\selectfont
+
+
+\bibitem{38:Lamport}
+Leslie Lamport.
+\newblock \emph{{\LaTeX}: {A} Document Preparation System: User's Guide and Reference
+ Manual}.
+\newblock \mbox{Addison}-Wesley, Reading, MA, USA, 2nd edition, 1994.
+\newblock ISBN 0-201-52983-1.
+\newblock Reprinted with corrections in 1996.
+
+
+\bibitem{38:ltnews} \LaTeX{} Project Team.
+ \emph{\LaTeXe{} news 1--38}.\\
+ \url{https://latex-project.org/news/latex2e-news/ltnews.pdf}
+
+\bibitem{38:blueprint} Frank Mittelbach and Chris Rowley.
+ \emph{\LaTeX{} Tagged PDF \Dash A blueprint for a large project}.\\
+ \url{https://latex-project.org/publications/indexbyyear/2020/}
+
+
+
+\end{thebibliography}
+
+\end{document}
diff --git a/macros/latex/base/ltpara-code.pdf b/macros/latex/base/ltpara-code.pdf
index 0ea61b04f8..0f092ff3eb 100644
--- a/macros/latex/base/ltpara-code.pdf
+++ b/macros/latex/base/ltpara-code.pdf
Binary files differ
diff --git a/macros/latex/base/ltpara-doc.pdf b/macros/latex/base/ltpara-doc.pdf
index a586608830..70da3eb859 100644
--- a/macros/latex/base/ltpara-doc.pdf
+++ b/macros/latex/base/ltpara-doc.pdf
Binary files differ
diff --git a/macros/latex/base/ltplain.dtx b/macros/latex/base/ltplain.dtx
index 89e5017300..b41810373d 100644
--- a/macros/latex/base/ltplain.dtx
+++ b/macros/latex/base/ltplain.dtx
@@ -32,7 +32,7 @@
%<*driver>
% \fi
\ProvidesFile{ltplain.dtx}
- [2023/04/15 v2.3i LaTeX Kernel (Plain TeX)]
+ [2023/10/21 v2.3i LaTeX Kernel (Plain TeX)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltplain.dtx}
@@ -1281,7 +1281,7 @@
% \cs{par} with whatever definition \cs{par} has when it is
% executed. It can, however, be
% redefined (before calling \cs{obeylines}!) to achieve some
-% special effects. If you want to alter is definition when already
+% special effects. If you want to alter this definition when already
% in the scope of \cs{obeylines}, it has no effect (because
% \cs{let} is used above).
% In that case simply make another call to \cs{obeylines}
diff --git a/macros/latex/base/ltproperties-code.pdf b/macros/latex/base/ltproperties-code.pdf
new file mode 100644
index 0000000000..063c5c6bab
--- /dev/null
+++ b/macros/latex/base/ltproperties-code.pdf
Binary files differ
diff --git a/macros/latex/base/ltproperties-code.tex b/macros/latex/base/ltproperties-code.tex
new file mode 100644
index 0000000000..486cefa7b9
--- /dev/null
+++ b/macros/latex/base/ltproperties-code.tex
@@ -0,0 +1,5 @@
+% This will typeset documentation + code
+%
+
+\AtBeginDocument{\AlsoImplementation}
+\input{ltproperties.dtx}
diff --git a/macros/latex/base/ltproperties-doc.pdf b/macros/latex/base/ltproperties-doc.pdf
new file mode 100644
index 0000000000..fd6d3be8b5
--- /dev/null
+++ b/macros/latex/base/ltproperties-doc.pdf
Binary files differ
diff --git a/macros/latex/base/ltproperties-doc.tex b/macros/latex/base/ltproperties-doc.tex
new file mode 100644
index 0000000000..072dfedad0
--- /dev/null
+++ b/macros/latex/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/base/ltproperties.dtx b/macros/latex/base/ltproperties.dtx
new file mode 100644
index 0000000000..40c50cd20a
--- /dev/null
+++ b/macros/latex/base/ltproperties.dtx
@@ -0,0 +1,966 @@
+% \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.0c}
+\def\ltpropertiesdate{2023-10-15}
+% \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:ee
+% }
+% \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:e}
+% \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:ee}
+% \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.
+% This means that one must be careful when using active chars or commands in the
+% names. UTF8-chars are protected and should be safe, similar most babel shorthands.
+%
+% \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}{label}
+% (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
+% \pkg{hyperref} and gives the name of the last destination it created.
+% \end{variable}
+%
+% \begin{variable}{pagetarget}
+% (shipout) The content of \cs{@currentHpage}.
+% This command is filled for example by a recent version of
+% \pkg{hyperref} and then gives the name of the last page
+% 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:ennn { \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 {ennn}
+% \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.
+% \changes{v1.0c}{2023-09-20}{use \cs{protected@edef}}
+% \begin{macrocode}
+\cs_new_protected:Npn \NewProperty #1#2#3#4
+ {
+ \protected@edef\reserved@a{#1}
+ \exp_args:No \property_new:nnnn {\reserved@a} {#2}{#3}{#4}
+ }
+\cs_new_protected:Npn \SetProperty #1#2#3#4
+ {
+ \protected@edef\reserved@a{#1}
+ \exp_args:No \property_gset:nnnn {\reserved@a} {#2}{#3}{#4}
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\property_record:nN}
+% \begin{macro}
+% {
+% \property_record:nn,
+% \property_record:nV,
+% \property_record:ee,
+% \property_record:oo,
+% \@@_record:nn,
+% \@@_record:en
+% }
+% \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:en { \tl_to_str:n {#1} } {#2} }
+\cs_generate_variant:Nn \property_record:nn { nV , ee, oo }
+\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 { e }
+\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}
+% \changes{v1.0c}{2023-09-20}{use \cs{protected@edef} for safer handling of active chars.} %
+% \begin{macrocode}
+\NewDocumentCommand\RecordProperties { m m }
+ {
+ \@bsphack
+ \protected@edef\reserved@a{#1}
+ \protected@edef\reserved@b{#2}
+ \property_record:oo {\reserved@a}{\reserved@b}
+ \@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:ee,
+% \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 {ee}
+\cs_set_eq:NN \RefUndefinedWarn \property_ref_undefined_warn:ee
+% \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}{label}
+% \begin{macrocode}
+\property_new:nnnn { label } { 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}{target}
+% \begin{macrocode}
+\newcommand\@currentHpage{}
+\property_new:nnnn { pagetarget } { shipout } { } { \@currentHpage }
+% \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/base/ltshipout-code.pdf b/macros/latex/base/ltshipout-code.pdf
index d7fc1394f9..e530fd038b 100644
--- a/macros/latex/base/ltshipout-code.pdf
+++ b/macros/latex/base/ltshipout-code.pdf
Binary files differ
diff --git a/macros/latex/base/ltshipout-doc.pdf b/macros/latex/base/ltshipout-doc.pdf
index d4084e3f3f..2d8b422fc7 100644
--- a/macros/latex/base/ltshipout-doc.pdf
+++ b/macros/latex/base/ltshipout-doc.pdf
Binary files differ
diff --git a/macros/latex/base/ltsockets-code.pdf b/macros/latex/base/ltsockets-code.pdf
new file mode 100644
index 0000000000..be3842b9b6
--- /dev/null
+++ b/macros/latex/base/ltsockets-code.pdf
Binary files differ
diff --git a/macros/latex/base/ltsockets-code.tex b/macros/latex/base/ltsockets-code.tex
new file mode 100644
index 0000000000..82ca0b059b
--- /dev/null
+++ b/macros/latex/base/ltsockets-code.tex
@@ -0,0 +1,5 @@
+% This will typeset documentation + code
+%
+
+\AtBeginDocument{\AlsoImplementation}
+\input{ltsockets.dtx}
diff --git a/macros/latex/base/ltsockets-doc.pdf b/macros/latex/base/ltsockets-doc.pdf
new file mode 100644
index 0000000000..e842b80328
--- /dev/null
+++ b/macros/latex/base/ltsockets-doc.pdf
Binary files differ
diff --git a/macros/latex/base/ltsockets-doc.tex b/macros/latex/base/ltsockets-doc.tex
new file mode 100644
index 0000000000..c181fbb3cc
--- /dev/null
+++ b/macros/latex/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/base/ltsockets.dtx b/macros/latex/base/ltsockets.dtx
new file mode 100644
index 0000000000..7d2940f454
--- /dev/null
+++ b/macros/latex/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/base/ltspace.dtx b/macros/latex/base/ltspace.dtx
index a77314b1bd..03b3445047 100644
--- a/macros/latex/base/ltspace.dtx
+++ b/macros/latex/base/ltspace.dtx
@@ -32,7 +32,7 @@
%<*driver>
% \fi
\ProvidesFile{ltspace.dtx}
- [2023/05/26 v1.3p LaTeX Kernel (spacing)]
+ [2023/10/26 v1.3r LaTeX Kernel (spacing)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltspace.dtx}
@@ -742,7 +742,7 @@
% true (as |\@esphack| used to do previously).
% This is currently used only for floats and similar environments.
% \changes{v1.2s}{1996/08/02}{Remove \cs{global} before \cs{@ignore...}}
-% \changes{v1.3d}{2015/01/11}{Allow hyphenation (Donald Arseneau pr/3498) (latexrelease)}w
+% \changes{v1.3d}{2015/01/11}{Allow hyphenation (Donald Arseneau pr/3498) (latexrelease)}
% \begin{macrocode}
%</2ekernel>
%<latexrelease>\IncludeInRelease{2015/01/01}%
@@ -1195,6 +1195,7 @@
%
% \begin{macro}{\nobreakspace}
% \changes{v1.2k}{1995/12/04}{(Macro added}
+% \changes{v1.3r}{2023/10/26}{Protected definition for tilde}
% \begin{macro}{\@xobeysp}
% \changes{v1.2t}{1996/09/28}{Moved from ltmiscen.dtx and redefined to
% use \cs{nobreakspace }}
@@ -1213,19 +1214,54 @@
% We need to keep \cs{@xobeysp} as it is widely used; so here it is
% let to the non-robust command \cs{nobreakspace }.
%
+% The fragile version of |~| needs a brace group after \cs{nobreakspace}
+% to prevent loss of spaces if it occurs in an expansion context. That's
+% not an issue with the updated \cs{protected} definition, so we keep the
+% code shorter and avoid that.
% \begin{macrocode}
\DeclareRobustCommand{\nobreakspace}{%
\leavevmode\nobreak\ }
\catcode `\~=13
-\def~{\nobreakspace{}}
+%</2ekernel>
+%<latexrelease>\IncludeInRelease{2023/11/01}%
+%<latexrelease> {\tilde}{Protected tilde}%
+%<*2ekernel|latexrelease>
+\protected\edef~{%
+ \noexpand\ifincsname\noexpand\expandafter\string~%
+ \noexpand\else
+ \noexpand\expandafter\noexpand\nobreakspace
+ \noexpand\fi
+}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\tilde}{Protected tilde}%
+%<latexrelease>\def~{\nobreakspace{}}
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
\expandafter\let\expandafter\@xobeysp\csname nobreakspace \endcsname
% \end{macrocode}
% \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/base/ltvers.dtx b/macros/latex/base/ltvers.dtx
index b324a38020..b2198bbbbc 100644
--- a/macros/latex/base/ltvers.dtx
+++ b/macros/latex/base/ltvers.dtx
@@ -112,10 +112,10 @@
%</2ekernel>
%<latexrelease>\edef\latexreleaseversion
%<*2ekernel|latexrelease>
- {2023-06-01}
+ {2023-11-01}
%</2ekernel|latexrelease>
%<*2ekernel>
-\def\patch@level{1}
+\def\patch@level{0}
% \end{macrocode}
%
% \begin{macro}{\development@branch@name}
diff --git a/macros/latex/base/ltx3info.pdf b/macros/latex/base/ltx3info.pdf
index 40e4f48331..d94fc56f61 100644
--- a/macros/latex/base/ltx3info.pdf
+++ b/macros/latex/base/ltx3info.pdf
Binary files differ
diff --git a/macros/latex/base/ltxdoc.pdf b/macros/latex/base/ltxdoc.pdf
index 9ff5be506c..bffaeceb51 100644
--- a/macros/latex/base/ltxdoc.pdf
+++ b/macros/latex/base/ltxdoc.pdf
Binary files differ
diff --git a/macros/latex/base/makeindx.pdf b/macros/latex/base/makeindx.pdf
index d656a530e6..6a8cd10b17 100644
--- a/macros/latex/base/makeindx.pdf
+++ b/macros/latex/base/makeindx.pdf
Binary files differ
diff --git a/macros/latex/base/manifest.txt b/macros/latex/base/manifest.txt
index 22791a2494..ff7bf49ad1 100644
--- a/macros/latex/base/manifest.txt
+++ b/macros/latex/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/base/modguide.pdf b/macros/latex/base/modguide.pdf
index e6d7de3b3e..e3182bf680 100644
--- a/macros/latex/base/modguide.pdf
+++ b/macros/latex/base/modguide.pdf
Binary files differ
diff --git a/macros/latex/base/nfssfont.pdf b/macros/latex/base/nfssfont.pdf
index e99ee3d534..7293533226 100644
--- a/macros/latex/base/nfssfont.pdf
+++ b/macros/latex/base/nfssfont.pdf
Binary files differ
diff --git a/macros/latex/base/proc.pdf b/macros/latex/base/proc.pdf
index b215de97dc..74bd93e935 100644
--- a/macros/latex/base/proc.pdf
+++ b/macros/latex/base/proc.pdf
Binary files differ
diff --git a/macros/latex/base/slides.pdf b/macros/latex/base/slides.pdf
index 4be668aade..c347373ea5 100644
--- a/macros/latex/base/slides.pdf
+++ b/macros/latex/base/slides.pdf
Binary files differ
diff --git a/macros/latex/base/slifonts.pdf b/macros/latex/base/slifonts.pdf
index da07645303..02b6504061 100644
--- a/macros/latex/base/slifonts.pdf
+++ b/macros/latex/base/slifonts.pdf
Binary files differ
diff --git a/macros/latex/base/source2e.pdf b/macros/latex/base/source2e.pdf
index 8d2cc4f2f7..5c112d7b48 100644
--- a/macros/latex/base/source2e.pdf
+++ b/macros/latex/base/source2e.pdf
Binary files differ
diff --git a/macros/latex/base/source2e.tex b/macros/latex/base/source2e.tex
index 873daebb4d..c538593ddd 100644
--- a/macros/latex/base/source2e.tex
+++ b/macros/latex/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/base/source2edoc.cls b/macros/latex/base/source2edoc.cls
index f0f1479cac..5f731af7ae 100644
--- a/macros/latex/base/source2edoc.cls
+++ b/macros/latex/base/source2edoc.cls
@@ -30,7 +30,7 @@
\seq_if_empty:NF \g__codedoc_nested_names_seq
{
% This is a crude change: we grab the first name
- \__codedoc_get_hyper_target:xN
+ \__codedoc_get_hyper_target:eN
{ \seq_item:Nn \g__codedoc_nested_names_seq { 1 } }
\l__codedoc_tmpa_tl
% ... and check if it has a reference
diff --git a/macros/latex/base/syntonly.pdf b/macros/latex/base/syntonly.pdf
index a916465230..cfd0712147 100644
--- a/macros/latex/base/syntonly.pdf
+++ b/macros/latex/base/syntonly.pdf
Binary files differ
diff --git a/macros/latex/base/tlc2.err b/macros/latex/base/tlc2.err
index 5b01ff0513..5c8723a4cb 100644
--- a/macros/latex/base/tlc2.err
+++ b/macros/latex/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/base/tlc2.pdf b/macros/latex/base/tlc2.pdf
index 731b1d3c38..385bfb2af9 100644
--- a/macros/latex/base/tlc2.pdf
+++ b/macros/latex/base/tlc2.pdf
Binary files differ
diff --git a/macros/latex/base/tlc3.err b/macros/latex/base/tlc3.err
index b7e2c1c0fd..d4f94705d7 100644
--- a/macros/latex/base/tlc3.err
+++ b/macros/latex/base/tlc3.err
@@ -1,6 +1,4 @@
-\newcommand\erratafiledate{2023-05-30}
-
-\def\comando#1{\texttt{\string#1}}
+\newcommand\erratafiledate{2023/10/30} % needs / and not -
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% To produce a printed version of this errata file run this file through
@@ -255,15 +253,22 @@
%
% 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/04/01} % ALL ENTRIES
+%\renewcommand\erratastartdate{2023/05/30} % for the first digital edition
+%\renewcommand\erratastartdate{2023/09/01} %
+% 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 +311,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 +344,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 +368,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 +377,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 +407,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 +422,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}
@@ -435,8 +467,12 @@ beyond \> \u{B}eyond
\erroronpage{I-xx\ldots I-xxi}{}{FMi}{2023/04/04}{s}
Dot leaders have been changed on all sections.
+
\CHAPTER{Bibliography (Part I)}
+\erroronpage{I-779}{[24], l.-1}{FMi}{2023/10/28}{s}
+Link should use \texttt{https://}
+
\erroronpage{I-783}{[55], l.-2}{FMi}{2023/04/04}{s}
all \> \u{them} all
@@ -510,23 +546,30 @@ 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.
+Most known errors to the digital version have already been
+incorporated in the product as distributed, here are the remaining
+ones.
+
+\begin{erratalist}
-%\begin{erratalist}
-%
%\CHAPTER{General}
%
%\CHAPTER{Front matter}
-%
-%\end{erratalist}
+
+\CHAPTER{Bibliography}
+
+\erroronpage{II-800}{[50], l.-1}{FMi}{2023/10/28}{s}
+Link should use \texttt{https://}
+
+\end{erratalist}
%<--------------------------
-\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,51 +580,107 @@ 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}
+\erroronpage{I-386}{exa 5-3-1, l.7}{EOl}{2023/09/09}{s}
+Change:
+paragraph over \u{two} pages. \> paragraph over \u{three} pages.
+
+\textit{Reason: The third page contains just the word ``pages.'' (which would be page 8)
+is not shown.}
+
+\erroronpage{I-389}{syntax box -1}{DC}{2023/10/06}{s}
+
+\u{\cs{right}} \> \u{\cs{rightmark}}
+
+
\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}
+\erroronpage{I-520}{paragraph 4, l.3}{EOl}{2023/09/09}{s}
+Change:
+For \u{a} example \> For example
\CHAPTER{Chapter 8 --- Graphics Generation and Manipulation}
@@ -593,54 +692,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 +971,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 +1026,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 +1061,277 @@ 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-396}{in box: para 2, l.2}{MJo}{2023/10/30}{s}
+the \cs{MakeUpper}\texttt{\u{C}ase} trick \>
+the \cs{MakeUpper}\texttt{\u{c}ase} trick
+
+
\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
+
+\erroronpage{II-605}{para 1, l.10}{CAR}{2023/10/10}{s}
+\u{right numbers} of underscores \> \u{correct number} of underscores
+
\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 +1340,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 +1351,23 @@ 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{CAR}{Chris Rowley}
+\contributor{DC}{Davide Campagnari}
+\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 +1390,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/base/tlc3.pdf b/macros/latex/base/tlc3.pdf
index bb91b4ed5a..13bcd9631c 100644
--- a/macros/latex/base/tlc3.pdf
+++ b/macros/latex/base/tlc3.pdf
Binary files differ
diff --git a/macros/latex/base/tulm.pdf b/macros/latex/base/tulm.pdf
index 38d7209c2c..d5449eedea 100644
--- a/macros/latex/base/tulm.pdf
+++ b/macros/latex/base/tulm.pdf
Binary files differ
diff --git a/macros/latex/base/usrguide-historic.pdf b/macros/latex/base/usrguide-historic.pdf
index 2c946d5201..ba175af6d0 100644
--- a/macros/latex/base/usrguide-historic.pdf
+++ b/macros/latex/base/usrguide-historic.pdf
Binary files differ
diff --git a/macros/latex/base/usrguide.pdf b/macros/latex/base/usrguide.pdf
index 284736bfaa..e4bd8c51fe 100644
--- a/macros/latex/base/usrguide.pdf
+++ b/macros/latex/base/usrguide.pdf
Binary files differ
diff --git a/macros/latex/base/usrguide.tex b/macros/latex/base/usrguide.tex
index 42d5e401f8..05fc93e7af 100644
--- a/macros/latex/base/usrguide.tex
+++ b/macros/latex/base/usrguide.tex
@@ -142,7 +142,7 @@ arguments. The mandatory types
is read between two identical characters, which cannot be any of |%|, |\|,
|#|, |{|, |}| or \verb*| |. The verbatim argument can also be enclosed
between braces, |{| and |}|. A command with a verbatim argument will
- produce an error when it appears within an argument of another function.
+ produce an error when it appears within an argument of another command.
\item[\texttt{b}] Only suitable in the argument specification of an
environment, it denotes the body of the environment, between
|\begin|\marg{environment} and |\end|\marg{environment}. See
@@ -244,7 +244,7 @@ defined.
\item \cs{RenewDocumentCommand} will issue an error if \meta{cmd}
has not previously been defined.
\item \cs{ProvideDocumentCommand} creates a new definition for
- \meta{function} only if one has not already been given.
+ \meta{cmd} only if one has not already been given.
\item \cs{DeclareDocumentCommand} will always create the new
definition, irrespective of any existing \meta{cmd} with the
same name. This should be used sparingly.
@@ -619,7 +619,8 @@ Spaces are trimmed at each end of each item parsed.
The \texttt{E} argument type is somewhat special, because with a single
\texttt{E} in the command declaration you may end up with several
arguments in a command (one formal argument per embellishment token).
-Therefore, when an argument processor is applied to an \texttt{E}-type
+Therefore, when an argument processor is applied to an
+\texttt{e}/\texttt{E}-type
argument, all the arguments pass through that processor before being fed
to the \meta{code}. For example, this command
\begin{verbatim}
@@ -640,9 +641,9 @@ processed argument can be further processed using a mapping function
\NewDocumentCommand \foo {>{\SplitList{;}} m}
{\MappingFunction#1}
\end{verbatim}
-If only a single character \meta{token} is used for the split, any
-category code $13$ (active) character matching the \meta{token} will
-be replaced before the split takes place.
+If only a single character \meta{token} is used for the split, it will
+take account of the possibility that the \meta{token} has been made active
+(category code~$13$) and will split at such tokens.
Spaces are trimmed at each end of each item parsed. Exactly one set
of braces will be stripped if an entire item is surrounded by them,
i.e.~the following inputs and outputs result (each separte item as
@@ -658,11 +659,11 @@ a,{b}c ==> {a}{{b}c}
\end{verbatim}
\begin{decl}
- |\ProcessList| \arg{list} \arg{function}
+ |\ProcessList| \arg{list} \arg{cmd}
\end{decl}
To support \cs{SplitList}, the function \cs{ProcessList} is available
-to apply a \meta{function} to every entry in a \meta{list}. The
-\meta{function} should absorb one argument: the list entry. For example
+to apply a \meta{cmd} to every entry in a \meta{list}. The
+\meta{cmd} should absorb one argument: the list entry. For example
\begin{verbatim}
\NewDocumentCommand \foo {>{\SplitList{;}} m}
{\ProcessList{#1}{\SomeDocumentCommand}}
@@ -751,10 +752,10 @@ This facility should only be used when \emph{necessary}.
|\ProvideExpandableDocumentCommand| \arg{cmd} \arg{arg spec} \arg{code} \\
|\DeclareExpandableDocumentCommand| \arg{cmd} \arg{arg spec} \arg{code}
\end{decl}
-This family of commands is used to create a document-level \meta{function},
+This family of commands is used to create a document-level \meta{cmd},
which will grab its arguments in a fully-expandable manner. The
argument specification for the function is given by \meta{arg spec},
-and the function will execute \meta{code}. In general, \meta{code} will
+and the \meta{cmd} will execute \meta{code}. In general, \meta{code} will
also be fully expandable, although it is possible that this will
not be the case (for example, a function for use in a table might
expand so that \cs{omit} is the first non-expandable non-space token).
@@ -832,7 +833,7 @@ and the command call is aborted.
\subsubsection{Control sequence tokens}
-A control sequence (or control character) token is characterized by is
+A control sequence (or control character) token is characterized by
its name, and its meaning is its definition.
A token cannot have two different meanings at the same time.
When a control sequence is defined as delimiter in a command,
@@ -876,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 functions 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 functions 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
@@ -1211,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/base/utf8ienc.pdf b/macros/latex/base/utf8ienc.pdf
index fb390aacbe..beafa65973 100644
--- a/macros/latex/base/utf8ienc.pdf
+++ b/macros/latex/base/utf8ienc.pdf
Binary files differ
diff --git a/macros/latex/base/webcomp.pdf b/macros/latex/base/webcomp.pdf
index 8515e01056..7b331e2e17 100644
--- a/macros/latex/base/webcomp.pdf
+++ b/macros/latex/base/webcomp.pdf
Binary files differ