summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/source')
-rw-r--r--Master/texmf-dist/source/latex-dev/amsmath/amsbsy.ins2
-rw-r--r--Master/texmf-dist/source/latex-dev/amsmath/amscd.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/amsmath/amscd.ins4
-rw-r--r--Master/texmf-dist/source/latex-dev/amsmath/amsgen.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/amsmath/amsgen.ins2
-rw-r--r--Master/texmf-dist/source/latex-dev/amsmath/amsmath.dtx10
-rw-r--r--Master/texmf-dist/source/latex-dev/amsmath/amsmath.ins4
-rw-r--r--Master/texmf-dist/source/latex-dev/amsmath/amsopn.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/amsmath/amsopn.ins4
-rw-r--r--Master/texmf-dist/source/latex-dev/amsmath/amstext.dtx6
-rw-r--r--Master/texmf-dist/source/latex-dev/amsmath/amstext.ins4
-rw-r--r--Master/texmf-dist/source/latex-dev/amsmath/amsxtra.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/amsmath/amsxtra.ins4
-rw-r--r--Master/texmf-dist/source/latex-dev/base/alltt.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/alltt.ins4
-rw-r--r--Master/texmf-dist/source/latex-dev/base/classes.dtx8
-rw-r--r--Master/texmf-dist/source/latex-dev/base/classes.ins4
-rw-r--r--Master/texmf-dist/source/latex-dev/base/cmextra.ins4
-rw-r--r--Master/texmf-dist/source/latex-dev/base/cmfonts.fdd2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/cmfonts.ins4
-rw-r--r--Master/texmf-dist/source/latex-dev/base/doc.dtx22
-rw-r--r--Master/texmf-dist/source/latex-dev/base/docstrip.dtx37
-rw-r--r--Master/texmf-dist/source/latex-dev/base/docstrip.ins4
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ec.ins4
-rw-r--r--Master/texmf-dist/source/latex-dev/base/exscale.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/exscale.ins4
-rw-r--r--Master/texmf-dist/source/latex-dev/base/fix-cm.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/fix-cm.ins4
-rw-r--r--Master/texmf-dist/source/latex-dev/base/fontdef.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/format.ins8
-rw-r--r--Master/texmf-dist/source/latex-dev/base/graphpap.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/graphpap.ins4
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ifthen.dtx4
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ifthen.ins4
-rw-r--r--Master/texmf-dist/source/latex-dev/base/inputenc.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/inputenc.ins4
-rw-r--r--Master/texmf-dist/source/latex-dev/base/latex209.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/latex209.ins4
-rw-r--r--Master/texmf-dist/source/latex-dev/base/latexrelease.dtx17
-rw-r--r--Master/texmf-dist/source/latex-dev/base/latexrelease.ins4
-rw-r--r--Master/texmf-dist/source/latex-dev/base/latexsym.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/latexsym.ins6
-rw-r--r--Master/texmf-dist/source/latex-dev/base/letter.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/letter.ins4
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltalloc.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltbibl.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltboxes.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltclass.dtx20
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltcmd.dtx571
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltcmdhooks.dtx59
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltcntrl.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltcounts.dtx52
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltdefns.dtx13
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltdirchk.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/lterror.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltexpl.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltfilehook.dtx49
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltfiles.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltfinal.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltfloat.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltfntcmd.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltfssaxes.dtx4028
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltfssbas.dtx105
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltfsscmp.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltfssdcl.dtx54
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltfssini.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltfsstrc.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/lthooks.dtx197
-rw-r--r--Master/texmf-dist/source/latex-dev/base/lthyphen.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltidxglo.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltkeys.dtx21
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltlength.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltlists.dtx27
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltlogos.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltluatex.dtx19
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltmarks.dtx51
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltmath.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltmeta.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltmiscen.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltoutenc.dtx67
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltoutenc.ins4
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltoutput.dtx1617
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltpage.dtx6
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltpageno.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltpar.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltpara.dtx7
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltpictur.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltplain.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltproperties.dtx14
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltsect.dtx80
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltshipout.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltsockets.dtx159
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltspace.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/lttab.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/lttagging.dtx330
-rw-r--r--Master/texmf-dist/source/latex-dev/base/lttemplates.dtx186
-rw-r--r--Master/texmf-dist/source/latex-dev/base/lttextcomp.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltthm.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltvers.dtx4
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltxdoc.dtx4
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltxref.dtx40
-rw-r--r--Master/texmf-dist/source/latex-dev/base/makeindx.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/makeindx.ins4
-rw-r--r--Master/texmf-dist/source/latex-dev/base/newdc.ins4
-rw-r--r--Master/texmf-dist/source/latex-dev/base/newlfont.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/nfssfont.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/nfssfont.ins4
-rw-r--r--Master/texmf-dist/source/latex-dev/base/olddc.ins4
-rw-r--r--Master/texmf-dist/source/latex-dev/base/oldlfont.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/preload.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/proc.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/proc.ins4
-rw-r--r--Master/texmf-dist/source/latex-dev/base/slides.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/slides.ins8
-rw-r--r--Master/texmf-dist/source/latex-dev/base/slifonts.fdd2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/syntonly.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/syntonly.ins4
-rw-r--r--Master/texmf-dist/source/latex-dev/base/tulm.fdd2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/tulm.ins4
-rw-r--r--Master/texmf-dist/source/latex-dev/base/unpack.ins2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/utf8ienc.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/firstaid/firstaid.ins4
-rw-r--r--Master/texmf-dist/source/latex-dev/firstaid/latex2e-first-aid-for-external-files.dtx12
-rw-r--r--Master/texmf-dist/source/latex-dev/graphics/color.dtx8
-rw-r--r--Master/texmf-dist/source/latex-dev/graphics/drivers.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/graphics/epsfig.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/graphics/graphics.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/graphics/graphicx.dtx30
-rw-r--r--Master/texmf-dist/source/latex-dev/graphics/keyval.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/graphics/lscape.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/graphics/rotating.dtx23
-rw-r--r--Master/texmf-dist/source/latex-dev/graphics/trig.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/latex-lab/documentmetadata-support.dtx179
-rw-r--r--Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-amsmath.dtx971
-rw-r--r--Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-block.dtx189
-rw-r--r--Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-firstaid.dtx39
-rw-r--r--Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-float.dtx10
-rw-r--r--Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-footnotes.dtx32
-rw-r--r--Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-graphic.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-marginpar.dtx12
-rw-r--r--Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-math.dtx1000
-rw-r--r--Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-mathintent.dtx109
-rw-r--r--Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-mathpkg.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-mathtools.dtx264
-rw-r--r--Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-minipage.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-namespace.dtx13
-rw-r--r--Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-new-or-1.dtx135
-rw-r--r--Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-new-or-2.dtx639
-rw-r--r--Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-sec.dtx423
-rw-r--r--Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-table.dtx119
-rw-r--r--Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-testphase.dtx10
-rw-r--r--Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-text.dtx92
-rw-r--r--Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-title.dtx6
-rw-r--r--Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-toc-hyperref-changes.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-toc-kernel-changes.dtx12
-rw-r--r--Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-toc.dtx8
-rw-r--r--Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-unicode-math.dtx175
-rw-r--r--Master/texmf-dist/source/latex-dev/latex-lab/latex-lab.ins6
-rw-r--r--Master/texmf-dist/source/latex-dev/tools/afterpage.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/tools/afterpage.ins4
-rw-r--r--Master/texmf-dist/source/latex-dev/tools/array.dtx105
-rw-r--r--Master/texmf-dist/source/latex-dev/tools/bm.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/tools/bm.ins4
-rw-r--r--Master/texmf-dist/source/latex-dev/tools/calc.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/tools/dcolumn.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/tools/delarray.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/tools/enumerate.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/tools/fileerr.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/tools/fontsmpl.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/tools/ftnright.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/tools/hhline.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/tools/indentfirst.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/tools/l3sys-query.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/tools/l3sys-query.ins4
-rw-r--r--Master/texmf-dist/source/latex-dev/tools/layout.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/tools/longtable.dtx9
-rw-r--r--Master/texmf-dist/source/latex-dev/tools/longtable.ins4
-rw-r--r--Master/texmf-dist/source/latex-dev/tools/multicol.dtx6
-rw-r--r--Master/texmf-dist/source/latex-dev/tools/multicol.ins4
-rw-r--r--Master/texmf-dist/source/latex-dev/tools/rawfonts.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/tools/shellesc.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/tools/showkeys.dtx4
-rw-r--r--Master/texmf-dist/source/latex-dev/tools/somedefs.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/tools/tabularx.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/tools/tabularx.ins4
-rw-r--r--Master/texmf-dist/source/latex-dev/tools/theorem.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/tools/tools.ins4
-rw-r--r--Master/texmf-dist/source/latex-dev/tools/trace.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/tools/varioref.dtx9
-rw-r--r--Master/texmf-dist/source/latex-dev/tools/varioref.ins4
-rw-r--r--Master/texmf-dist/source/latex-dev/tools/verbatim.dtx2
-rw-r--r--Master/texmf-dist/source/latex-dev/tools/xr.dtx16
-rw-r--r--Master/texmf-dist/source/latex-dev/tools/xspace.dtx2
193 files changed, 9589 insertions, 3304 deletions
diff --git a/Master/texmf-dist/source/latex-dev/amsmath/amsbsy.ins b/Master/texmf-dist/source/latex-dev/amsmath/amsbsy.ins
index 2d0cdd7be32..47827ade30d 100644
--- a/Master/texmf-dist/source/latex-dev/amsmath/amsbsy.ins
+++ b/Master/texmf-dist/source/latex-dev/amsmath/amsbsy.ins
@@ -26,7 +26,7 @@
\preamble
Copyright (C) 1995, 1999 American Mathematical Society.
-Copyright (C) 2016-2024 LaTeX Project and American Mathematical Society.
+Copyright (C) 2016-2025 LaTeX Project and American Mathematical Society.
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either version 1.3c
diff --git a/Master/texmf-dist/source/latex-dev/amsmath/amscd.dtx b/Master/texmf-dist/source/latex-dev/amsmath/amscd.dtx
index e1eba3aec28..fd14dfa0872 100644
--- a/Master/texmf-dist/source/latex-dev/amsmath/amscd.dtx
+++ b/Master/texmf-dist/source/latex-dev/amsmath/amscd.dtx
@@ -2,7 +2,7 @@
% \iffalse meta-comment
%
% Copyright (C) 1995, 1999 American Mathematical Society.
-% Copyright (C) 2016-2024 LaTeX Project and American Mathematical Society.
+% Copyright (C) 2016-2025 LaTeX Project and American Mathematical Society.
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3c
diff --git a/Master/texmf-dist/source/latex-dev/amsmath/amscd.ins b/Master/texmf-dist/source/latex-dev/amsmath/amscd.ins
index 8f2e5decd42..8deb662575d 100644
--- a/Master/texmf-dist/source/latex-dev/amsmath/amscd.ins
+++ b/Master/texmf-dist/source/latex-dev/amsmath/amscd.ins
@@ -1,6 +1,6 @@
%%
%% Copyright (C) 2010 American Mathematical Society.
-%% Copyright (C) 2016-2024 LaTeX Project and American Mathematical Society.
+%% Copyright (C) 2016-2025 LaTeX Project and American Mathematical Society.
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3c
@@ -25,7 +25,7 @@
\preamble
Copyright (C) 1995, 1999 American Mathematical Society.
-Copyright (C) 2016-2024 LaTeX Project and American Mathematical Society.
+Copyright (C) 2016-2025 LaTeX Project and American Mathematical Society.
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either version 1.3c
diff --git a/Master/texmf-dist/source/latex-dev/amsmath/amsgen.dtx b/Master/texmf-dist/source/latex-dev/amsmath/amsgen.dtx
index a7b1ebc87f3..361b684ee4a 100644
--- a/Master/texmf-dist/source/latex-dev/amsmath/amsgen.dtx
+++ b/Master/texmf-dist/source/latex-dev/amsmath/amsgen.dtx
@@ -2,7 +2,7 @@
% \iffalse meta-comment
%
% Copyright (C) 1995, 1999 American Mathematical Society.
-% Copyright (C) 2016-2024 LaTeX Project and American Mathematical Society.
+% Copyright (C) 2016-2025 LaTeX Project and American Mathematical Society.
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3c
diff --git a/Master/texmf-dist/source/latex-dev/amsmath/amsgen.ins b/Master/texmf-dist/source/latex-dev/amsmath/amsgen.ins
index 8b6f4185955..cd08d61d49a 100644
--- a/Master/texmf-dist/source/latex-dev/amsmath/amsgen.ins
+++ b/Master/texmf-dist/source/latex-dev/amsmath/amsgen.ins
@@ -25,7 +25,7 @@
\preamble
Copyright (C) 1995, 1999 American Mathematical Society.
-Copyright (C) 2016-2024 LaTeX Project and American Mathematical Society.
+Copyright (C) 2016-2025 LaTeX Project and American Mathematical Society.
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either version 1.3c
diff --git a/Master/texmf-dist/source/latex-dev/amsmath/amsmath.dtx b/Master/texmf-dist/source/latex-dev/amsmath/amsmath.dtx
index 591d175642c..2496b7edef0 100644
--- a/Master/texmf-dist/source/latex-dev/amsmath/amsmath.dtx
+++ b/Master/texmf-dist/source/latex-dev/amsmath/amsmath.dtx
@@ -2,7 +2,7 @@
% \iffalse meta-comment
%
% Copyright (C) 1995, 2000, 2013 American Mathematical Society.
-% Copyright (C) 2016-2024 LaTeX Project and American Mathematical Society.
+% Copyright (C) 2016-2025 LaTeX Project and American Mathematical Society.
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3c
@@ -85,7 +85,7 @@ Bug reports can be opened (category \texttt{#1}) at\\%
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesPackage{amsmath}[2024/11/05 v2.17t AMS math features]
+\ProvidesPackage{amsmath}[2025/01/19 v2.17u AMS math features]
% \end{macrocode}
%
% \section{Catcode defenses}
@@ -347,6 +347,7 @@ For additional information on amsmath, use the \lq ?\rq\space option.%
% \cn{DeclareMathOperator}.
% \begin{macrocode}
\RequirePackage{amstext}[1995/01/25]
+%\RequirePackage{amsgen}[1995/01/25] % already loaded by amstext
\RequirePackage{amsbsy}[1995/01/20]
\RequirePackage{amsopn}[1995/01/20]
% \end{macrocode}
@@ -3117,9 +3118,12 @@ ill-advised in LaTeX.%
% \end{macrocode}
% In case there is an enumerate inside a minipage inside an equation,
% we need to reset \cn{label} to its normal value:
+% \changes{v2.17u}{2025/01/11}{Correct 30 years old typo:
+% \cs{@arrayparboxrestore} needs changing not
+% \cs{@arrayboxrestore} (gh/1608)}
% \begin{macrocode}
\toks@\@xp{\@arrayparboxrestore \let\label\ltx@label}%
-\edef\@arrayboxrestore{\the\toks@}
+\edef\@arrayparboxrestore{\the\toks@}
% \end{macrocode}
%
% \begin{macrocode}
diff --git a/Master/texmf-dist/source/latex-dev/amsmath/amsmath.ins b/Master/texmf-dist/source/latex-dev/amsmath/amsmath.ins
index 528700f238e..148287990a4 100644
--- a/Master/texmf-dist/source/latex-dev/amsmath/amsmath.ins
+++ b/Master/texmf-dist/source/latex-dev/amsmath/amsmath.ins
@@ -1,6 +1,6 @@
%%
%% Copyright (C) 2010 American Mathematical Society.
-%% Copyright (C) 2016-2024 LaTeX Project and American Mathematical Society.
+%% Copyright (C) 2016-2025 LaTeX Project and American Mathematical Society.
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3c
@@ -25,7 +25,7 @@
\preamble
Copyright (C) 1995, 1999, 2000, 2013 American Mathematical Society.
-Copyright (C) 2016-2024 LaTeX Project and American Mathematical Society.
+Copyright (C) 2016-2025 LaTeX Project and American Mathematical Society.
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either version 1.3c
diff --git a/Master/texmf-dist/source/latex-dev/amsmath/amsopn.dtx b/Master/texmf-dist/source/latex-dev/amsmath/amsopn.dtx
index 11ad62ddc1f..b981aac45e0 100644
--- a/Master/texmf-dist/source/latex-dev/amsmath/amsopn.dtx
+++ b/Master/texmf-dist/source/latex-dev/amsmath/amsopn.dtx
@@ -2,7 +2,7 @@
% \iffalse meta-comment
%
% Copyright (C) 1995, 1999 American Mathematical Society.
-% Copyright (C) 2016-2024 LaTeX Project and American Mathematical Society.
+% Copyright (C) 2016-2025 LaTeX Project and American Mathematical Society.
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3c
diff --git a/Master/texmf-dist/source/latex-dev/amsmath/amsopn.ins b/Master/texmf-dist/source/latex-dev/amsmath/amsopn.ins
index 67b2b3c077e..b14d211692a 100644
--- a/Master/texmf-dist/source/latex-dev/amsmath/amsopn.ins
+++ b/Master/texmf-dist/source/latex-dev/amsmath/amsopn.ins
@@ -1,6 +1,6 @@
%%
%% Copyright (C) 2010 American Mathematical Society.
-%% Copyright (C) 2016-2024 LaTeX Project and American Mathematical Society.
+%% Copyright (C) 2016-2025 LaTeX Project and American Mathematical Society.
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3c
@@ -25,7 +25,7 @@
\preamble
Copyright (C) 1995, 1999 American Mathematical Society.
-Copyright (C) 2016-2024 LaTeX Project and American Mathematical Society.
+Copyright (C) 2016-2025 LaTeX Project and American Mathematical Society.
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either version 1.3c
diff --git a/Master/texmf-dist/source/latex-dev/amsmath/amstext.dtx b/Master/texmf-dist/source/latex-dev/amsmath/amstext.dtx
index 68299946b07..2f856aea389 100644
--- a/Master/texmf-dist/source/latex-dev/amsmath/amstext.dtx
+++ b/Master/texmf-dist/source/latex-dev/amsmath/amstext.dtx
@@ -2,7 +2,7 @@
% \iffalse meta-comment
%
% Copyright (C) 1995, 1999 American Mathematical Society.
-% Copyright (C) 2016-2024 LaTeX Project and American Mathematical Society.
+% Copyright (C) 2016-2025 LaTeX Project and American Mathematical Society.
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3c
@@ -77,7 +77,7 @@ Bug reports can be opened (category \texttt{#1}) at\\%
% \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}% LaTeX 2.09 can't be used (nor non-LaTeX)
[1994/12/01]% LaTeX date must be December 1994 or later
-\ProvidesPackage{amstext}[2021/08/26 v2.01 AMS text]
+\ProvidesPackage{amstext}[2024/11/17 v2.01 AMS text]
% \end{macrocode}
%
% \section{The implementation}
@@ -121,7 +121,7 @@ Bug reports can be opened (category \texttt{#1}) at\\%
{\textdef@\displaystyle\f@size{#1}}%
% \end{macrocode}
% The other three cases are similar except for the
-% \cs{iffirstchoice} switch which we set to false. This is
+% \cs{iffirstchoice@} switch which we set to false. This is
% done to prevent \LaTeX{} macros like \cn{ref} or \cn{index}
% from writing their arguments more than once.
% \begin{macrocode}
diff --git a/Master/texmf-dist/source/latex-dev/amsmath/amstext.ins b/Master/texmf-dist/source/latex-dev/amsmath/amstext.ins
index 8ecb9523c9e..0a6e696b454 100644
--- a/Master/texmf-dist/source/latex-dev/amsmath/amstext.ins
+++ b/Master/texmf-dist/source/latex-dev/amsmath/amstext.ins
@@ -1,6 +1,6 @@
%%
%% Copyright (C) 2010 American Mathematical Society.
-%% Copyright (C) 2016-2024 LaTeX Project and American Mathematical Society.
+%% Copyright (C) 2016-2025 LaTeX Project and American Mathematical Society.
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3c
@@ -25,7 +25,7 @@
\preamble
Copyright (C) 1995, 1999 American Mathematical Society.
-Copyright (C) 2016-2024 LaTeX Project and American Mathematical Society.
+Copyright (C) 2016-2025 LaTeX Project and American Mathematical Society.
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either version 1.3c
diff --git a/Master/texmf-dist/source/latex-dev/amsmath/amsxtra.dtx b/Master/texmf-dist/source/latex-dev/amsmath/amsxtra.dtx
index 5ace38995da..69b5c2ff843 100644
--- a/Master/texmf-dist/source/latex-dev/amsmath/amsxtra.dtx
+++ b/Master/texmf-dist/source/latex-dev/amsmath/amsxtra.dtx
@@ -2,7 +2,7 @@
% \iffalse meta-comment
%
% Copyright (C) 1995, 1999 American Mathematical Society.
-% Copyright (C) 2016-2024 LaTeX Project and American Mathematical Society.
+% Copyright (C) 2016-2025 LaTeX Project and American Mathematical Society.
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3c
diff --git a/Master/texmf-dist/source/latex-dev/amsmath/amsxtra.ins b/Master/texmf-dist/source/latex-dev/amsmath/amsxtra.ins
index 2ba4f221386..9097bbb4423 100644
--- a/Master/texmf-dist/source/latex-dev/amsmath/amsxtra.ins
+++ b/Master/texmf-dist/source/latex-dev/amsmath/amsxtra.ins
@@ -1,6 +1,6 @@
%%
%% Copyright (C) 2010 American Mathematical Society.
-%% Copyright (C) 2016-2024 LaTeX Project and American Mathematical Society.
+%% Copyright (C) 2016-2025 LaTeX Project and American Mathematical Society.
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3c
@@ -25,7 +25,7 @@
\preamble
Copyright (C) 1995, 1999 American Mathematical Society.
-Copyright (C) 2016-2024 LaTeX Project and American Mathematical Society.
+Copyright (C) 2016-2025 LaTeX Project and American Mathematical Society.
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either version 1.3c
diff --git a/Master/texmf-dist/source/latex-dev/base/alltt.dtx b/Master/texmf-dist/source/latex-dev/base/alltt.dtx
index 8fd4ac2db36..bf0aa321093 100644
--- a/Master/texmf-dist/source/latex-dev/base/alltt.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/alltt.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/Master/texmf-dist/source/latex-dev/base/alltt.ins b/Master/texmf-dist/source/latex-dev/base/alltt.ins
index 6d702c1cc71..fe0807abf40 100644
--- a/Master/texmf-dist/source/latex-dev/base/alltt.ins
+++ b/Master/texmf-dist/source/latex-dev/base/alltt.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright (C) 1993-2024
+%% Copyright (C) 1993-2025
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright (C) 1993-2024
+Copyright (C) 1993-2025
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/Master/texmf-dist/source/latex-dev/base/classes.dtx b/Master/texmf-dist/source/latex-dev/base/classes.dtx
index ce3d902b21c..a9d80bfe638 100644
--- a/Master/texmf-dist/source/latex-dev/base/classes.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/classes.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -53,7 +53,7 @@
%<*driver>
\ProvidesFile{classes.drv}
%</driver>
- [2024/06/29 v1.4n
+ [2025/01/22 v1.4n
%<article|report|book> Standard LaTeX document class]
%<10pt|11pt|12pt> Standard LaTeX file (size option)]
% \end{macrocode}
@@ -3024,9 +3024,9 @@
% Note that this environment is not defined for books.
% \changes{v1.3e}{1995/06/19}{Added setting of \cs{@endparpenalty}
% to avoid page break after abstract heading.}
-% \begin{macrocode}
-% \changes{v1.3m}{1995/10/23}{Added setting of \cs{beginparpenalty} to
+% \changes{v1.3m}{1995/10/23}{Added setting of \cs{@beginparpenalty} to
% discourage page break before abstract heading.}
+% \begin{macrocode}
%<*article|report>
\if@titlepage
\newenvironment{abstract}{%
diff --git a/Master/texmf-dist/source/latex-dev/base/classes.ins b/Master/texmf-dist/source/latex-dev/base/classes.ins
index 7fa35896a42..fd411450822 100644
--- a/Master/texmf-dist/source/latex-dev/base/classes.ins
+++ b/Master/texmf-dist/source/latex-dev/base/classes.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright (C) 1993-2024
+%% Copyright (C) 1993-2025
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright (C) 1993-2024
+Copyright (C) 1993-2025
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/Master/texmf-dist/source/latex-dev/base/cmextra.ins b/Master/texmf-dist/source/latex-dev/base/cmextra.ins
index 3f06c1548b7..9894acc47f5 100644
--- a/Master/texmf-dist/source/latex-dev/base/cmextra.ins
+++ b/Master/texmf-dist/source/latex-dev/base/cmextra.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright (C) 1993-2024
+%% Copyright (C) 1993-2025
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright (C) 1993-2024
+Copyright (C) 1993-2025
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/Master/texmf-dist/source/latex-dev/base/cmfonts.fdd b/Master/texmf-dist/source/latex-dev/base/cmfonts.fdd
index ed6f3d70ee7..45ee2abb25d 100644
--- a/Master/texmf-dist/source/latex-dev/base/cmfonts.fdd
+++ b/Master/texmf-dist/source/latex-dev/base/cmfonts.fdd
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/Master/texmf-dist/source/latex-dev/base/cmfonts.ins b/Master/texmf-dist/source/latex-dev/base/cmfonts.ins
index fb9d08f440c..a750441a9b0 100644
--- a/Master/texmf-dist/source/latex-dev/base/cmfonts.ins
+++ b/Master/texmf-dist/source/latex-dev/base/cmfonts.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright (C) 1993-2024
+%% Copyright (C) 1993-2025
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright (C) 1993-2024
+Copyright (C) 1993-2025
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/Master/texmf-dist/source/latex-dev/base/doc.dtx b/Master/texmf-dist/source/latex-dev/base/doc.dtx
index a6af48b88a8..05256d878f3 100644
--- a/Master/texmf-dist/source/latex-dev/base/doc.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/doc.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -45,7 +45,7 @@
%<+package>
%<+package>\ProvidesPackage{doc}
%<+shortvrb>\ProvidesPackage{shortvrb}
-%<+package|shortvrb> [2024/10/23 v3.0q
+%<+package|shortvrb> [2024/12/25 v3.0q
%<+package|shortvrb> Standard LaTeX documentation package V3 (FMi)]
%\catcode`\<=12
%
@@ -972,9 +972,23 @@
% index entries \\
% \hspace*{30pt} Special macros for \*
% \end{quote}
-% Such an entry might be produced with the line:
+% Such an entry might be produced with the line
%\begin{verbatim}
-% \index{index entries\levelchar Special macros for \*}
+% \index{index entries>Special macros for \*}
+%\end{verbatim}
+% assuming that \verb=>= is the \cs{levelchar} used by the index
+% processor.
+
+% You can't use \cs{levelchar} in this situation because if \cs{index}
+% is directly used in the document then it's argument is written out
+% fully verbatim. However, if you define your own index commands,
+% expansion will happen on the way to the \texttt{.idx} file; and in
+% that case you can use \cs{levelchar}---this is what the \pkg{doc}
+% macros do. This then allows to change the indexing syntax easily, e.g.,
+%\begin{verbatim}
+% \newcommand\ltxconcept[2]{\index{#1\levelchar#2}}
+% ...
+% \ltxconcept{index entries}{Special macros for \*}
%\end{verbatim}
%
%
diff --git a/Master/texmf-dist/source/latex-dev/base/docstrip.dtx b/Master/texmf-dist/source/latex-dev/base/docstrip.dtx
index 1d61d78f56f..d746137f548 100644
--- a/Master/texmf-dist/source/latex-dev/base/docstrip.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/docstrip.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -29,9 +29,9 @@
\catcode`\{=1
\catcode`\}=2
\def\filename{docstrip.dtx}
-\def\fileversion{v2.6b}
-\def\filedate{2022-09-03}
-\def\docdate {2024-02-08}
+\def\fileversion{v2.6c}
+\def\filedate{2024-12-23}
+\def\docdate {2024-12-23}
%%
%
%\iffalse
@@ -3027,8 +3027,37 @@ Z
% defining preamble for the current file.
% \begin{macrocode}
\def\@fileX#1#2{%
+% \end{macrocode}
+% If the csname used for the stream has already been defined, e.g.,
+% as a preamble or postamble or for some other purposes, chances are
+% that turning it into a stream number will break something. We
+% therefore generate an error and show the current definition.
+% \changes{v2.6c}{2024-12-23}{Check that stream macro is not already
+% used (gh/1150)}
+% \begin{macrocode}
+ \ifx#1\relax \else
+ \errmessage{Command \string#1 for denoting the output \noexpand
+ \file stream already defined!^^J
+ \space Current meaning is:^^J^^J\meaning#1^^J^^J
+ \space Extraction will probably fail - check result}%
+ \fi
\chardef#1=\stream@closed
\def\curout{#1}%
+% \end{macrocode}
+% If it matches the name of the current preamble or postamble then
+% it definitely can't work, so we call that out explicitly:
+% \begin{macrocode}
+ \ifx\curout\currentpreamble
+ \errmessage{Declared preamble name \string#1 not allowed if
+ \string\file{\@stripstring#1} is used}%
+ \fi
+ \ifx\curout\currentpostamble
+ \errmessage{Declared postamble name \string#1 not allowed if
+ \string\file{\@stripstring#1} is used}%
+ \fi
+% \end{macrocode}
+%
+% \begin{macrocode}
\let\curinfiles\empty
\let\curinnames\empty
\def\curref{\MetaPrefix ^^J%
diff --git a/Master/texmf-dist/source/latex-dev/base/docstrip.ins b/Master/texmf-dist/source/latex-dev/base/docstrip.ins
index 6ed99c92239..e145b036c69 100644
--- a/Master/texmf-dist/source/latex-dev/base/docstrip.ins
+++ b/Master/texmf-dist/source/latex-dev/base/docstrip.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright (C) 1993-2024
+%% Copyright (C) 1993-2025
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -52,7 +52,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright (C) 1993-2024
+Copyright (C) 1993-2025
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/Master/texmf-dist/source/latex-dev/base/ec.ins b/Master/texmf-dist/source/latex-dev/base/ec.ins
index 53ea22f9573..dd652de9f4f 100644
--- a/Master/texmf-dist/source/latex-dev/base/ec.ins
+++ b/Master/texmf-dist/source/latex-dev/base/ec.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright (C) 1993-2024
+%% Copyright (C) 1993-2025
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright (C) 1993-2024
+Copyright (C) 1993-2025
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/Master/texmf-dist/source/latex-dev/base/exscale.dtx b/Master/texmf-dist/source/latex-dev/base/exscale.dtx
index 1712d18a267..107f2f5c86b 100644
--- a/Master/texmf-dist/source/latex-dev/base/exscale.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/exscale.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/Master/texmf-dist/source/latex-dev/base/exscale.ins b/Master/texmf-dist/source/latex-dev/base/exscale.ins
index 38c6aea61ee..4dda68b7b62 100644
--- a/Master/texmf-dist/source/latex-dev/base/exscale.ins
+++ b/Master/texmf-dist/source/latex-dev/base/exscale.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright (C) 1993-2024
+%% Copyright (C) 1993-2025
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright (C) 1993-2024
+Copyright (C) 1993-2025
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/Master/texmf-dist/source/latex-dev/base/fix-cm.dtx b/Master/texmf-dist/source/latex-dev/base/fix-cm.dtx
index 09af95dad35..4d99b91c4da 100644
--- a/Master/texmf-dist/source/latex-dev/base/fix-cm.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/fix-cm.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/Master/texmf-dist/source/latex-dev/base/fix-cm.ins b/Master/texmf-dist/source/latex-dev/base/fix-cm.ins
index 2023ea229c3..1484eb946d8 100644
--- a/Master/texmf-dist/source/latex-dev/base/fix-cm.ins
+++ b/Master/texmf-dist/source/latex-dev/base/fix-cm.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright (C) 1993-2024
+%% Copyright (C) 1993-2025
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright (C) 1993-2024
+Copyright (C) 1993-2025
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/Master/texmf-dist/source/latex-dev/base/fontdef.dtx b/Master/texmf-dist/source/latex-dev/base/fontdef.dtx
index ad66ed4118a..770afe445b9 100644
--- a/Master/texmf-dist/source/latex-dev/base/fontdef.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/fontdef.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/Master/texmf-dist/source/latex-dev/base/format.ins b/Master/texmf-dist/source/latex-dev/base/format.ins
index e20ff094380..a6dde4038b2 100644
--- a/Master/texmf-dist/source/latex-dev/base/format.ins
+++ b/Master/texmf-dist/source/latex-dev/base/format.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright (C) 1993-2024
+%% Copyright (C) 1993-2025
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright (C) 1993-2024
+Copyright (C) 1993-2025
The LaTeX Project and any individual authors listed elsewhere
in this file.
@@ -88,7 +88,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright (C) 2015-2024
+Copyright (C) 2015-2025
The LaTeX Project and any individual authors listed elsewhere
in this file.
@@ -123,7 +123,7 @@ extension .ins) which are part of the distribution.
This is a generated file.
-Copyright (C) 1993-2024
+Copyright (C) 1993-2025
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/Master/texmf-dist/source/latex-dev/base/graphpap.dtx b/Master/texmf-dist/source/latex-dev/base/graphpap.dtx
index 7d93512b267..9de5fb7cac4 100644
--- a/Master/texmf-dist/source/latex-dev/base/graphpap.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/graphpap.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/Master/texmf-dist/source/latex-dev/base/graphpap.ins b/Master/texmf-dist/source/latex-dev/base/graphpap.ins
index 7898dd2f92e..567a5c65c8d 100644
--- a/Master/texmf-dist/source/latex-dev/base/graphpap.ins
+++ b/Master/texmf-dist/source/latex-dev/base/graphpap.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright (C) 1993-2024
+%% Copyright (C) 1993-2025
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright (C) 1993-2024
+Copyright (C) 1993-2025
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/Master/texmf-dist/source/latex-dev/base/ifthen.dtx b/Master/texmf-dist/source/latex-dev/base/ifthen.dtx
index 0bbe3612115..1e286f640a5 100644
--- a/Master/texmf-dist/source/latex-dev/base/ifthen.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ifthen.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -30,7 +30,7 @@
%%
%% File `ifthen.dtx'.
%% Copyright (C) 1991 by Leslie Lamport
-%% Copyright (C) 1994-2024 LaTeX project, David Carlisle
+%% Copyright (C) 1994-2025 LaTeX project, David Carlisle
%% all rights reserved.
%%
%
diff --git a/Master/texmf-dist/source/latex-dev/base/ifthen.ins b/Master/texmf-dist/source/latex-dev/base/ifthen.ins
index 0382d2255e0..115ca707d31 100644
--- a/Master/texmf-dist/source/latex-dev/base/ifthen.ins
+++ b/Master/texmf-dist/source/latex-dev/base/ifthen.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright (C) 1993-2024
+%% Copyright (C) 1993-2025
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright (C) 1993-2024
+Copyright (C) 1993-2025
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/Master/texmf-dist/source/latex-dev/base/inputenc.dtx b/Master/texmf-dist/source/latex-dev/base/inputenc.dtx
index 7ab9713d8e9..407fc23e4da 100644
--- a/Master/texmf-dist/source/latex-dev/base/inputenc.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/inputenc.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/Master/texmf-dist/source/latex-dev/base/inputenc.ins b/Master/texmf-dist/source/latex-dev/base/inputenc.ins
index 2cfe820673c..4b3803b2cc7 100644
--- a/Master/texmf-dist/source/latex-dev/base/inputenc.ins
+++ b/Master/texmf-dist/source/latex-dev/base/inputenc.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright (C) 1993-2024
+%% Copyright (C) 1993-2025
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright (C) 1993-2024
+Copyright (C) 1993-2025
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/Master/texmf-dist/source/latex-dev/base/latex209.dtx b/Master/texmf-dist/source/latex-dev/base/latex209.dtx
index 62cb5123d04..6670dbcdbf4 100644
--- a/Master/texmf-dist/source/latex-dev/base/latex209.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/latex209.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/Master/texmf-dist/source/latex-dev/base/latex209.ins b/Master/texmf-dist/source/latex-dev/base/latex209.ins
index 9226268c281..631cedb8561 100644
--- a/Master/texmf-dist/source/latex-dev/base/latex209.ins
+++ b/Master/texmf-dist/source/latex-dev/base/latex209.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright (C) 1993-2024
+%% Copyright (C) 1993-2025
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright (C) 1993-2024
+Copyright (C) 1993-2025
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/Master/texmf-dist/source/latex-dev/base/latexrelease.dtx b/Master/texmf-dist/source/latex-dev/base/latexrelease.dtx
index 5b5c3648a48..4442b05ca9f 100644
--- a/Master/texmf-dist/source/latex-dev/base/latexrelease.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/latexrelease.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -40,7 +40,7 @@
%<*latexrelease>
% \fi
% \ProvidesFile{latexrelease.dtx}
- [2024/08/11 v1.0p LaTeX release emulation and tests
+ [2025/01/31 v1.0q LaTeX release emulation and tests
(including releases up to \latexreleaseversion)]
% \iffalse
%</latexrelease>
@@ -754,6 +754,14 @@ of this package available from CTAN}
\msg_redirect_name:nnn { mark } { class-already-defined }{ none }
% \end{macrocode}
%
+% The same is also needed for \cs{NewSocket} and \cs{NewSocketPlug}.
+% \changes{v1.0q}{2025/01/31}
+% {Silence \cs{NewSocket} and \cs{NewSocketPlug} in rollback}
+% \begin{macrocode}
+\msg_redirect_name:nnn { socket } { already-declared } { none }
+\msg_redirect_name:nnn { socket } { plug-already-declared } { none }
+% \end{macrocode}
+%
% Now a one-off for |ltcmd.dtx|: we need to make \cs{NewDocumentCommand}
% not complain on an already existing command, but it has to be done
% after \cs{NewDocumentCommand} is defined, so this is separate from
@@ -806,9 +814,14 @@ of this package available from CTAN}
% And restore the silenced error messages.
% \changes{v1.0p}{2022/11/14}
% {Unsilence \cs{NewMarkClass} error message after rollback (gh/955)}
+% \changes{v1.0q}{2025/01/31}
+% {Unsilence \cs{NewSocket} and \cs{NewSocketPlug} error message
+% after rollback}
% \begin{macrocode}
\msg_redirect_name:nnn { hooks } { exists } { }
\msg_redirect_name:nnn { mark } { class-already-defined } { }
+\msg_redirect_name:nnn { socket } { already-declared } { }
+\msg_redirect_name:nnn { socket } { plug-already-declared } { }
% \end{macrocode}
%
% \begin{macrocode}
diff --git a/Master/texmf-dist/source/latex-dev/base/latexrelease.ins b/Master/texmf-dist/source/latex-dev/base/latexrelease.ins
index 89c3b0fc3a7..9c3b8d6fce1 100644
--- a/Master/texmf-dist/source/latex-dev/base/latexrelease.ins
+++ b/Master/texmf-dist/source/latex-dev/base/latexrelease.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright (C) 1993-2024
+%% Copyright (C) 1993-2025
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright (C) 1993-2024
+Copyright (C) 1993-2025
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/Master/texmf-dist/source/latex-dev/base/latexsym.dtx b/Master/texmf-dist/source/latex-dev/base/latexsym.dtx
index 4ad17315899..d3240c73d30 100644
--- a/Master/texmf-dist/source/latex-dev/base/latexsym.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/latexsym.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/Master/texmf-dist/source/latex-dev/base/latexsym.ins b/Master/texmf-dist/source/latex-dev/base/latexsym.ins
index 874f12cbf7b..e53ccdefe4d 100644
--- a/Master/texmf-dist/source/latex-dev/base/latexsym.ins
+++ b/Master/texmf-dist/source/latex-dev/base/latexsym.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright (C) 1993-2024
+%% Copyright (C) 1993-2025
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright (C) 1993-2024
+Copyright (C) 1993-2025
The LaTeX Project and any individual authors listed elsewhere
in this file.
@@ -87,7 +87,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright (C) 1993-2024
+Copyright (C) 1993-2025
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/Master/texmf-dist/source/latex-dev/base/letter.dtx b/Master/texmf-dist/source/latex-dev/base/letter.dtx
index 2521381a37e..1e6fc981b05 100644
--- a/Master/texmf-dist/source/latex-dev/base/letter.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/letter.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/Master/texmf-dist/source/latex-dev/base/letter.ins b/Master/texmf-dist/source/latex-dev/base/letter.ins
index 72bb25531c2..e91376a5557 100644
--- a/Master/texmf-dist/source/latex-dev/base/letter.ins
+++ b/Master/texmf-dist/source/latex-dev/base/letter.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright (C) 1993-2024
+%% Copyright (C) 1993-2025
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright (C) 1993-2024
+Copyright (C) 1993-2025
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/Master/texmf-dist/source/latex-dev/base/ltalloc.dtx b/Master/texmf-dist/source/latex-dev/base/ltalloc.dtx
index d9d5ebd3bee..b2e81bb1599 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltalloc.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltalloc.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/Master/texmf-dist/source/latex-dev/base/ltbibl.dtx b/Master/texmf-dist/source/latex-dev/base/ltbibl.dtx
index 04fa98dc359..1537eaeb7d2 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltbibl.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltbibl.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/Master/texmf-dist/source/latex-dev/base/ltboxes.dtx b/Master/texmf-dist/source/latex-dev/base/ltboxes.dtx
index e3620ef1aea..152ba12857f 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltboxes.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltboxes.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/Master/texmf-dist/source/latex-dev/base/ltclass.dtx b/Master/texmf-dist/source/latex-dev/base/ltclass.dtx
index 6167cf56085..52580eaf54b 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltclass.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltclass.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -33,7 +33,7 @@
%<*driver>
% \fi
\ProvidesFile{ltclass.dtx}
- [2024/08/28 v1.5m LaTeX Kernel (Class & Package Interface)]
+ [2025/01/02 v1.5n LaTeX Kernel (Class & Package Interface)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltclass.dtx}
@@ -2808,8 +2808,20 @@
%<*2ekernel>
% \end{macrocode}
%
-% \begin{macrocode}
-\@onlypreamble\AtBeginDocument
+% In its initial implementation (not using the hook system)
+% \cs{AtBeginDocument} was made \cs{@onlypreamble} because using it
+% later had no effect whatsoever, thus was most certainly an
+% unintended programming error. With the reimplementation, using
+% the \texttt{begindocument} hook internally, this has changed
+% because adding to a onetime hook after it has already been used
+% simply executes the additional code immediately. We therefore no
+% longer generate an error if it is used inside the document so
+% that \verb=\AddToHook{begindocument}= and \cs{AtBeginDocument}
+% are truly equivalent (as claimed in the hook documentation).
+% \changes{v1.5n}{2025/01/02}{Do not make \cs{AtBeginDocument}
+% preamble only (gh/1604)}
+% \begin{macrocode}
+%\@onlypreamble\AtBeginDocument
% \end{macrocode}
% \end{macro}
% \end{macro}
diff --git a/Master/texmf-dist/source/latex-dev/base/ltcmd.dtx b/Master/texmf-dist/source/latex-dev/base/ltcmd.dtx
index b0af2f7966c..928e9d89d91 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltcmd.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltcmd.dtx
@@ -2,7 +2,7 @@
%
% Copyright (C) 1999 Frank Mittelbach, Chris Rowley, David Carlisle
% Copyright (C) 2004-2008 Frank Mittelbach, The LaTeX Project
-% Copyright (C) 2009-2024
+% Copyright (C) 2009-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -34,8 +34,8 @@
%%% From File: ltcmd.dtx
%
% \begin{macrocode}
-\def\ltcmdversion{v1.2f}
-\def\ltcmddate{2024-07-06}
+\def\ltcmdversion{v1.3b}
+\def\ltcmddate{2025-02-01}
% \end{macrocode}
%
%<*driver>
@@ -97,6 +97,10 @@
%<latexrelease> {Document~command~parser}%
% \end{macrocode}
%
+% \begin{macrocode}
+\cs_generate_variant:Nn \tl_head:n { e }
+% \end{macrocode}
+%
% \subsection{Variables and constants}
%
% \begin{variable}{\l_@@_arg_spec_tl}
@@ -132,6 +136,15 @@
% \end{macrocode}
% \end{variable}
%
+% \begin{variable}{\l_@@_total_args_int}
+% \changes{v1.3a}{2025-01-23}{New variable}
+% The total number of arguments found during normalization: this is required
+% where special action is needed for the penultimate argument.
+% \begin{macrocode}
+\int_new:N \l_@@_total_args_int
+% \end{macrocode}
+% \end{variable}
+%
% \begin{variable}{\l_@@_defaults_bool, \l_@@_defaults_tl}
% The boolean indicates whether there are any argument with default
% value other than |-NoValue-|; the token list holds the code to
@@ -326,6 +339,15 @@
% \end{macrocode}
% \end{variable}
%
+% \begin{variable}{\l_@@_final_verb_bool}
+% \changes{v1.3a}{2025-01-23}{New variable}
+% Needed to establish whether optional arguments should be collected
+% \enquote{verbatim safe}.
+% \begin{macrocode}
+\bool_new:N \l_@@_final_verb_bool
+% \end{macrocode}
+% \end{variable}
+%
% \begin{variable}{\q_@@_recursion_tail,\q_@@_recursion_stop}
% \begin{macro}{\@@_if_recursion_tail_stop_do:Nn}
% \begin{macro}{\@@_use_i_delimit_by_q_recursion_stop:nw}
@@ -1331,28 +1353,40 @@
% \end{macro}
%
% \begin{macro}{\@@_normalize_type_b:w}
-% This argument type is not allowed for commands. This is only
+% \changes{v1.3a}{2025-01-23}{Extend to cover \texttt{c}-type grabbing}
+% \begin{macro}{\@@_normalize_type_c:w}
+% \changes{v1.3a}{2025-01-23}{New function}
+% \begin{macro}{\@@_normalize_type_b_or_c:nn}
+% \changes{v1.3a}{2025-01-23}{New function}
+% These argument types are not allowed for commands. They are only
% allowed at the end of the argument specification, hence we check
% that |#1| is the end.
% \begin{macrocode}
\cs_new_protected:Npn \@@_normalize_type_b:w #1
+ { \@@_normalize_type_b_or_c:nn {#1} { b } }
+\cs_new_protected:Npn \@@_normalize_type_c:w #1
+ { \@@_normalize_type_b_or_c:nn {#1} { c } }
+\cs_new_protected:Npn \@@_normalize_type_b_or_c:nn #1#2
{
\bool_if:NF \l_@@_environment_bool
{
\msg_error:nnxx { cmd } { invalid-command-arg }
- { \@@_environment_or_command: } { b }
+ { \@@_environment_or_command: } {#2}
\@@_bad_def:wn
}
\tl_clear:N \l_@@_last_delimiters_tl
- \@@_add_arg_spec:n { b }
+ \@@_add_arg_spec:n {#2}
\quark_if_recursion_tail_stop:n {#1}
- \msg_error:nnxx { cmd } { arg-after-body }
+ \msg_error:nnxxx { cmd } { arg-after-body }
+ {#2}
{ \@@_environment_or_command: }
{ \tl_to_str:n {#1} }
\@@_bad_def:wn
}
% \end{macrocode}
% \end{macro}
+% \end{macro}
+% \end{macro}
%
% \begin{macro}{\@@_single_token_check:n}
% Checks that the argument is a single (non-space) token (possibly
@@ -1501,7 +1535,10 @@
{ \bool_set_true:N \l_@@_some_short_bool }
\tl_put_right:Nx \l_@@_arg_spec_tl
{
- \bool_if:NT \l_@@_long_bool { + }
+ \bool_lazy_and:nnT
+ { \l_@@_long_bool }
+ { ! \str_if_eq_p:nn {#1} { c } }
+ { + }
\bool_if:NT \l_@@_obey_spaces_bool { ! }
\exp_not:n {#1}
}
@@ -1530,6 +1567,8 @@
% \subsection{Preparing the signature: general mechanism}
%
% \begin{macro}{\@@_prepare_signature:n}
+% \changes{v1.3a}{2025-01-23}{Extend to cover \texttt{c}-type grabbing}
+% \begin{macro}{\@@_prepare_signature_verb_chk:n}
% \begin{macro}{\@@_prepare_signature:N}
% \begin{macro}{\@@_prepare_signature_bypass:N}
% Actually creating the signature uses the same loop approach as
@@ -1539,6 +1578,7 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_prepare_signature:n #1
{
+ \int_set_eq:NN \l_@@_total_args_int \l_@@_current_arg_int
\int_zero:N \l_@@_current_arg_int
\bool_set_false:N \l_@@_long_bool
\bool_set_false:N \l_@@_obey_spaces_bool
@@ -1550,10 +1590,20 @@
\tl_clear:N \l_@@_process_one_tl
\bool_set_false:N \l_@@_process_some_bool
\tl_clear:N \l_@@_signature_tl
+ \@@_prepare_signature_verb_chk:n {#1}
\@@_prepare_signature:N #1 \q_recursion_tail \q_recursion_stop
\bool_if:NF \l_@@_expandable_bool { \@@_flush_m_args: }
}
% \end{macrocode}
+% A quick check on the final arg.~type.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_prepare_signature_verb_chk:n #1
+ {
+ \str_if_eq:eeTF { \tl_head:e { \tl_reverse:n {#1} } } { c }
+ { \bool_set_true:N \l_@@_final_verb_bool }
+ { \bool_set_false:N \l_@@_final_verb_bool }
+ }
+% \end{macrocode}
% The main looping function does not take an argument, but carries out the
% reset on the processor boolean. This is split off from the rest of the
% process so that when actually setting up processors the flag-reset can
@@ -1582,6 +1632,7 @@
% \end{macro}
% \end{macro}
% \end{macro}
+% \end{macro}
%
% \subsection{Setting up a standard signature}
%
@@ -1640,7 +1691,7 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\@@_add_type_=:}
+% \begin{macro}{\@@_add_type_=:w}
% \changes{v1.1a}{2022/08/10}{Add support for \texttt{=} modifier}
% A mix of the ideas from above: set a flag and add a processor.
% \begin{macrocode}
@@ -1658,16 +1709,27 @@
% \end{macro}
%
% \begin{macro}{\@@_add_type_b:w}
+% \changes{v1.3a}{2025-01-23}{Extend to cover \texttt{c}-type grabbing}
+% \begin{macro}{\@@_add_type_c:w}
+% \changes{v1.3a}{2025-01-23}{New function}
+% \begin{macro}{\@@_add_type_b_or_c:N}
+% \changes{v1.3a}{2025-01-23}{New function}
% \begin{macrocode}
\cs_new_protected:Npn \@@_add_type_b:w
+ { \@@_add_type_b_or_c:N b }
+\cs_new_protected:Npn \@@_add_type_c:w
+ { \@@_add_type_b_or_c:N c }
+\cs_new_protected:Npn \@@_add_type_b_or_c:N #1
{
\@@_flush_m_args:
\@@_add_default:
- \@@_add_grabber:N b
+ \@@_add_grabber:N #1
\@@_prepare_signature:N
}
% \end{macrocode}
% \end{macro}
+% \end{macro}
+% \end{macro}
%
% \begin{macro}{\@@_add_type_D:w}
% \begin{macrocode}
@@ -1842,6 +1904,7 @@
% ignored when looking for that optional argument.
% \changes{v1.0g}{2021/08/07}
% {Replicate argument processors for all embellishments (gh/639)}
+% \changes{v1.3a}{2025-01-23}{Extend to support \texttt{c}-type grabbing}
% \begin{macrocode}
\cs_new_protected:Npn \@@_add_grabber:N #1
{
@@ -1856,12 +1919,23 @@
{ \l_@@_suppress_strip_bool }
{ \str_if_eq_p:nn {#1} { D } }
{ _no_strip }
+ \bool_lazy_all:nT
+ {
+ { \l_@@_final_verb_bool }
+ { \str_if_eq_p:nn {#1} { D } }
+ {
+ \int_compare_p:nNn \l_@@_current_arg_int
+ = { \l_@@_total_args_int - 1 }
+ }
+ }
+ { _verb_safe }
:w
}
}
\bool_set_false:N \l_@@_long_bool
\bool_set_false:N \l_@@_obey_spaces_bool
\bool_set_false:N \l_@@_suppress_strip_bool
+ \bool_set_false:N \l_@@_verb_safe_bool
\tl_put_right:Nx \l_@@_process_all_tl
{
{
@@ -2254,7 +2328,7 @@
%
% \changes{v1.1c}{2023/03/12}
% {Distinguish (non-expandable) document commands starting with
-% \cs{@@_start_expandable:nNNNNn}}
+% \cs{__cmd_start_expandable:nNNNNn}}
% There's one variant: a command begins with \cs{@@_start_expandable:nNNNNn}
% may still be un-expandable/protected if it's defined by
% \cs{NewDocumentCommand} and friends, with empty or only m-type arguments.
@@ -2605,7 +2679,7 @@
%
% \changes{v1.1c}{2023/03/12}
% {Distinguish (non-expandable) document commands starting with
-% \cs{@@_start_expandable:nNNNNn}}
+% \cs{__cmd_start_expandable:nNNNNn}}
% There's one variant: a command begins with \cs{@@_start_expandable:nNNNNn}
% may still be un-expandable/protected if it's defined by
% \cs{NewDocumentCommand} and friends, with empty or only m-type arguments.
@@ -3002,68 +3076,320 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}
-% {
-% \@@_grab_D:w ,
-% \@@_grab_D_long:w ,
-% \@@_grab_D_obey_spaces:w ,
-% \@@_grab_D_long_obey_spaces:w ,
-% \@@_grab_D_no_strip:w ,
-% \@@_grab_D_long_no_strip:w ,
-% \@@_grab_D_obey_spaces_no_strip:w ,
-% \@@_grab_D_long_obey_spaces_no_strip:w
-% }
-% \changes{v1.1a}{2022/08/10}{Add support for skipping brace stripping}
-% The generic delimited argument grabber. The auxiliary function does
-% a peek test before calling \cs{@@_grab_D_call:Nw}, so that the
-% optional nature of the argument works as expected.
+% \begin{macro}{\@@_grab_c:w}
+% \changes{v1.3a}{2025-01-23}{New \texttt{c}-type grabbing function}
+% \begin{macro}{\@@_grab_c_obey_spaces:w}
+% \begin{macro}{\@@_grab_c_start:n}
+% \begin{macro}{\@@_grab_c_first:w}
+% \begin{macro}{\@@_grab_c_loop:w}
+% Collecting an environment body verbatim shares some ideas with the
+% \texttt{v}-type grabber, and others with the standard \texttt{filecontents}
+% environment. The start is to set the end-of-line to a predictable value
+% and to deactivate the specials.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_grab_D:w #1#2#3 \@@_run_code:
+\cs_new_protected:Npn \@@_grab_c:w #1 \@@_run_code:
{
- \@@_grab_D_aux:NNnNNN #1 #2 {#3} \cs_set_protected_nopar:Npn
- \@@_peek_nonspace_remove:NTF \use_ii:nn
+ \bool_set_false:N \l_@@_obey_spaces_bool
+ \@@_grab_c_start:n {#1}
}
-\cs_new_protected:Npn \@@_grab_D_long:w #1#2#3 \@@_run_code:
+\cs_new_protected:Npn \@@_grab_c_obey_spaces:w #1 \@@_run_code:
{
- \@@_grab_D_aux:NNnNNN #1 #2 {#3} \cs_set_protected:Npn
- \@@_peek_nonspace_remove:NTF \use_ii:nn
+ \bool_set_true:N \l_@@_obey_spaces_bool
+ \@@_grab_c_start:n {#1}
}
-\cs_new_protected:Npn \@@_grab_D_obey_spaces:w #1#2#3 \@@_run_code:
+\cs_new_protected:Npn \@@_grab_c_start:n #1
{
- \@@_grab_D_aux:NNnNNN #1 #2 {#3} \cs_set_protected_nopar:Npn
- \@@_peek_meaning_remove:NTF \use_ii:nn
+ \tl_set:Nn \l_@@_signature_tl {#1}
+ \group_begin:
+ \tl_clear:N \l_@@_v_arg_tl
+ \tex_escapechar:D = 92 \scan_stop:
+ \tex_endlinechar:D = `\^^M \scan_stop:
+ \cs_set_eq:NN \do \char_set_catcode_other:N
+ \dospecials
+ \char_set_catcode_other:n { `\^^M }
+ \@@_grab_c_first:w
}
-\cs_new_protected:Npn \@@_grab_D_long_obey_spaces:w #1#2#3 \@@_run_code:
+% \end{macrocode}
+% Notice here and below that we cannot use |\token_to_str:N \end| as that
+% would have the wrong category codes for the letters.
+% \begin{macrocode}
+\group_begin:
+ \char_set_catcode_other:N \^^M %
+ \cs_new_protected:Npn \@@_grab_c_first:w #1 ^^M %
+ { %
+ \tl_if_blank:nF {#1} %
+ { %
+ \msg_warning:nnee { cmd } { chars-dropped-first-line } %
+ { \exp_not:n {#1} } %
+ { \exp_not:V \@currenvir } %
+ } %
+ \@@_grab_c_loop:w #1 ^^M %
+ } %
+ \cs_new_protected:Npe \@@_grab_c_loop:w #1 ^^M %
+ { %
+ \exp_not:N \@@_grab_c_auxi:w #1 %
+ \c_backslash_str end %
+ \scan_stop: %
+ } %
+\group_end:
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\@@_grab_c_auxi:w}
+% \begin{macro}{\@@_grab_c_auxii:w}
+% \begin{macro}{\@@_grab_c_auxiii:N}
+% \begin{macro}{\@@_grab_c_auxiv:}
+% \begin{macro}{\@@_grab_c_auxv:}
+% \begin{macro}{\@@_grab_c_auxvi:N}
+% \begin{macro}{\@@_grab_c_auxvii:}
+% \begin{macro}{\@@_grab_c_auxviii:}
+% We need to see if the current line contains |\end| followed by the name
+% of the current environment. To do that and allow for spaces, we have to
+% work stepwise. First, establish if there is an |\end| at all: remember that
+% here we are dealing with \enquote{other} tokens. Whether these is an
+% |\end| or not, the tokens \emph{before} it form part of the line.
+% \begin{macrocode}
+\use:e
{
- \@@_grab_D_aux:NNnNNN #1 #2 {#3} \cs_set_protected:Npn
- \@@_peek_meaning_remove:NTF \use_ii:nn
+ \cs_new_protected:Npn \exp_not:N \@@_grab_c_auxi:w
+ #1 \c_backslash_str end #2 \scan_stop:
}
-\cs_new_protected:Npn \@@_grab_D_no_strip:w
- #1#2#3 \@@_run_code:
{
- \@@_grab_D_aux:NNnNNN #1 #2 {#3} \cs_set_protected_nopar:Npn
- \@@_peek_nonspace_remove:NTF \use_none:n
+ \tl_put_right:Nn \l_@@_v_arg_tl {#1}
+ \tl_if_empty:nTF {#2}
+ {
+ \tl_put_right:Nn \l_@@_v_arg_tl { \obeyedline }
+ \@@_grab_c_loop:w
+ }
+ { \@@_grab_c_auxii:w #2 \scan_stop: }
}
-\cs_new_protected:Npn \@@_grab_D_long_no_strip:w
- #1#2#3 \@@_run_code:
+% \end{macrocode}
+% There is an |\end|, so we now remove the trailing marker we needed
+% to do the test. This is stripped off, then we need to examine the
+% rest of the line one token at a time: see |verbatim.dtx| for the
+% inspiration. Notice that we use |^^M| here as the end marker: this allows
+% looping to look for multiple |\end| entries in the line.
+% \begin{macrocode}
+\group_begin:
+ \char_set_catcode_other:N \^^M %
+ \use:e %
+ { %
+ \cs_new_protected:Npe \exp_not:N \@@_grab_c_auxii:w %
+ #1 \c_backslash_str end \scan_stop: %
+ } %
+ { %
+ \tl_set:Nn \exp_not:N \l_@@_tmpa_tl
+ { \c_backslash_str end } %
+ \exp_not:N \@@_grab_c_auxiii:N #1 ^^M %
+ } %
+% \end{macrocode}
+% Within the line, we need to collect up the tokens: if we do not find
+% the end-of-environment argument, we will need those to reinsert. There
+% are three special cases here: |^^M| (end of line: tidy up and back to
+% the main loop), \verb*| | (possibly skip over) and |{| (start the inner
+% loop). Anything else means we move back to examine the rest of the line
+% for any more |\end| entries.
+% \begin{macrocode}
+ \cs_new_protected:Npn \@@_grab_c_auxiii:N #1 %
+ { %
+ \token_case_charcode:NnF #1 %
+ { %
+ ^^M %
+ { \@@_grab_c_auxiv: } %
+ \c_space_token %
+ { %
+ \tl_put_right:Nn \l_@@_tmpa_tl {#1} %
+ \@@_grab_c_auxiii:N %
+ } %
+ \c_group_begin_token %
+ { %
+ \tl_set:Nn \l_@@_tmpb_tl {#1} %
+ \@@_grab_c_auxvi:N %
+ } %
+ } %
+ { \@@_grab_c_auxv: } %
+ } %
+\group_end:
+\cs_new_protected:Npn \@@_grab_c_auxiv:
{
- \@@_grab_D_aux:NNnNNN #1 #2 {#3} \cs_set_protected:Npn
- \@@_peek_nonspace_remove:NTF \use_none:n
+ \tl_put_right:Ne \l_@@_v_arg_tl
+ {
+ \exp_not:V \l_@@_tmpa_tl
+ \exp_not:N \obeyedline
+ }
+ \@@_grab_c_loop:w
}
-\cs_new_protected:Npn \@@_grab_D_obey_spaces_no_strip:w
- #1#2#3 \@@_run_code:
+\cs_new_protected:Npn \@@_grab_c_auxv:
{
- \@@_grab_D_aux:NNnNNN #1 #2 {#3} \cs_set_protected_nopar:Npn
- \@@_peek_meaning_remove:NTF \use_none:n
+ \tl_put_right:NV \l_@@_v_arg_tl \l_@@_tmpa_tl
+ \@@_grab_c_loop:w
+ }
+% \end{macrocode}
+% In the inner loop, we again have only a few special cases. First, we could
+% again have |^^M|, in which case we tidy up using a common auxiliary. Second,
+% we check for the escape char: this cannot happen inside the end of an
+% environment and means we loop, re-inserting the token. Finally, we have
+% |}|, where we need to move on to check what has been collected. Otherwise,
+% collect up and loop. Notice here that the inner loop needs to
+% collect tokens separately: this leaves any spaces after |\end| in
+% \cs{l_@@_tmpa_tl}, so we can test \cs{l_@@_tmpb_tl} directly.
+% \begin{macrocode}
+\group_begin:
+ \char_set_catcode_other:N \^^M %
+ \cs_new_protected:Npe \@@_grab_c_auxvi:N #1 %
+ { %
+ \exp_not:N \token_case_charcode:NnF #1 %
+ { %
+ ^^M %
+ {
+ \exp_not:N \@@_grab_c_auxvii: %
+ \exp_not:N \@@_grab_c_auxiv: %
+ }%
+ \c_backslash_str %
+ { %
+ \exp_not:N \@@_grab_c_auxvii: %
+ \exp_not:N \@@_grab_c_auxv: #1
+ } %
+ \c_group_end_token %
+ { %
+ \tl_put_right:Nn \exp_not:N \l_@@_tmpb_tl {#1} %
+ \exp_not:N \@@_grab_c_auxviii: %
+ } %
+ } %
+ { %
+ \tl_put_right:Nn \exp_not:N \l_@@_tmpb_tl {#1} %
+ \exp_not:N \@@_grab_c_auxvi:N %
+ } %
+ } %
+\group_end: %
+\cs_new_protected:Npn \@@_grab_c_auxvii:
+ { \tl_put_right:NV \l_@@_tmpa_tl \l_@@_tmpb_tl }
+\cs_new_protected:Npn \@@_grab_c_auxviii:
+ {
+ \str_if_eq:eeTF { \exp_not:V \l_@@_tmpb_tl } { { \@currenvir } }
+ { \@@_grab_c_end:w }
+ {
+ \@@_grab_c_auxvii:
+ \@@_grab_c_auxv:
+ }
}
-\cs_new_protected:Npn \@@_grab_D_long_obey_spaces_no_strip:w
- #1#2#3 \@@_run_code:
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\@@_grab_c_end:w}
+% \begin{macro}{\@@_grab_c_end:n}
+% \begin{macro}{\@@_grab_c_end_auxi:w}
+% \begin{macro}{\@@_grab_c_end_auxii:w}
+% \begin{macro}{\@@_grab_c_end_auxiii:w}
+% To end the collection, we clean up the last line: once again we need to
+% find |^^M|. Once that is done, we can warn if there is anything left
+% behind.
+% \begin{macrocode}
+\group_begin:
+ \char_set_catcode_other:N \^^M %
+ \cs_new_protected:Npn \@@_grab_c_end:w #1 ^^M %
+ { %
+ \tl_if_blank:nF {#1} %
+ { %
+ \msg_warning:nnee { cmd } { chars-dropped-last-line } %
+ { \exp_not:n {#1} } %
+ { \exp_not:V \@currenvir } %
+ } %
+ \exp_args:NNNo \group_end: %
+ \tl_set:Nn \l_@@_v_arg_tl { \l_@@_v_arg_tl } %
+ \@@_add_arg:x %
+ { %
+ \bool_if:NTF \l_@@_obey_spaces_bool %
+ { \exp_not:V } %
+ { \exp_args:NV \@@_grab_c_end:n } %
+ \l_@@_v_arg_tl %
+ } %
+ \exp_args:NV \end \@currenvir %
+ } %
+\group_end: %
+% \end{macrocode}
+% Look for line markers at each end and tidy up if required.
+% \begin{macrocode}
+\cs_new:Npn \@@_grab_c_end:n #1
+ {
+ \@@_grab_c_end_auxi:w \q_nil #1 \q_nil
+ \obeyedline \obeyedline \q_nil \q_stop
+ }
+\cs_new:Npn \@@_grab_c_end_auxi:w #1 \q_nil \obeyedline
+ { \@@_grab_c_end_auxii:w #1 \q_nil }
+\cs_new:Npn \@@_grab_c_end_auxii:w \q_nil #1 \obeyedline \q_nil
+ { \@@_grab_c_end_auxiii:w #1 \q_nil }
+\cs_new:Npn \@@_grab_c_end_auxiii:w #1 \q_nil #2 \q_stop
+ { \exp_not:n {#1} }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}
+% {
+% \@@_grab_D:w ,
+% \@@_grab_D_no_strip:w ,
+% \@@_grab_D_obey_spaces:w ,
+% \@@_grab_D_obey_spaces_no_strip:w ,
+% \@@_grab_D_long:w ,
+% \@@_grab_D_long_no_strip:w ,
+% \@@_grab_D_long_obey_spaces:w ,
+% \@@_grab_D_long_obey_spaces_no_strip:w
+% }
+% \changes{v1.1a}{2022/08/10}{Add support for skipping brace stripping}
+% \changes{v1.3a}{2025-01-23}{Auto-generate D-grabbers}
+% The generic delimited argument grabber. The auxiliary function does
+% a peek test before calling \cs{@@_grab_D_call:Nw}, so that the
+% optional nature of the argument works as expected.
+% \begin{macrocode}
+\tl_map_inline:nn { { } { _long } }
{
- \@@_grab_D_aux:NNnNNN #1 #2 {#3} \cs_set_protected:Npn
- \@@_peek_meaning_remove:NTF \use_none:n
+ \tl_map_inline:nn { { } { _obey_spaces } }
+ {
+ \tl_map_inline:nn { { } { _no_strip } }
+ {
+ \tl_map_inline:nn { { } { _verb_safe } }
+ {
+ \cs_new_protected:cpe { @@_grab_D #1 ##1 ####1 ########1 :w }
+ ################1################2################3
+ \@@_run_code:
+ {
+ \exp_not:N \@@_grab_D_aux:NNnNNNN
+ ################1 ################2 {################3}
+ \str_if_eq:nnTF {#1} { _long }
+ \cs_set_protected:Npn
+ \cs_set_protected_nopar:Npn
+ \str_if_eq:nnTF {##1} { _obey_spaces }
+ { \exp_not:N \@@_peek_meaning_remove:NTF }
+ { \exp_not:N \@@_peek_nonspace_remove:NTF }
+ \str_if_eq:nnTF {####1} { _no_strip }
+ { \exp_not:N \use_none:n }
+ { \exp_not:N \use_ii:nn }
+ \str_if_eq:nnTF {########1} { _verb_safe }
+ { \exp_not:N \use:n }
+ { \exp_not:N \use_none:n }
+ }
+ }
+ }
+ }
}
% \end{macrocode}
-% \begin{macro}{\@@_grab_D_aux:NNnNNN}
+% \begin{macro}{\@@_grab_D_aux:NNnNNNN}
+% \changes{v1.3a}{2025-01-23}{Extend to support \texttt{c}-type grabbing}
+% \begin{macro}{\@@_grab_D_verb_safe:NN}
+% \changes{v1.3a}{2025-01-23}{New macro}
% \begin{macro}{\@@_grab_D_aux:NNnNN}
% This is a bit complicated. The idea is that, in order to check for
% nested optional argument tokens (\texttt{[[...]]} and so on) the
@@ -3073,12 +3399,51 @@
% prevents loss of braces, and there is then a test to see if there are
% nested delimiters to handle.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_grab_D_aux:NNnNNN #1#2#3#4#5#6
+\group_begin:
+ \char_set_catcode_other:N \^^M
+ \cs_new_protected:Npn \@@_grab_D_aux:NNnNNNN #1#2#3#4#5#6#7
+ {
+ \@@_grab_D_aux:NNnNN #1#2 {#3} #4 #6
+ #7
+ {
+ \group_begin:
+ \@@_grab_D_verb_safe:NN #1#5
+ }
+ #5 #1
+ {
+ #7 { \group_end: }
+ \@@_grab_D_call:Nw #1
+ }
+ {
+ #7 { \group_end: }
+ \@@_add_arg:o \c_novalue_tl
+ }
+ }
+\group_end:
+% \end{macrocode}
+% The only awkwardness here is the need to preserve the catcode of the search
+% token: this is done low-level for performance reasons. Only values that
+% are realistic are included. As this does not cover spaces when they are
+% skipped that has to be covered separately.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_grab_D_verb_safe:NN #1#2
{
- \@@_grab_D_aux:NNnNN #1#2 {#3} #4 #6
- #5 #1
- { \@@_grab_D_call:Nw #1 }
- { \@@_add_arg:o \c_novalue_tl }
+ \cs_set_eq:NN \do \char_set_catcode_other:N
+ \dospecials
+ \char_set_catcode_other:N \^^M
+ \token_if_eq_meaning:NNT #2 \@@_peek_nonspace_remove:NTF
+ { \char_set_catcode_space:n { `\ } }
+ \use:c
+ {
+ char_set_catcode_
+ \if_catcode:w \c_math_toggle_token #1 math_toggle \else:
+ \if_catcode:w ^ #1 math_superscript \else:
+ \if_catcode:w \c_math_subscript_token #1 math_subscript \else:
+ \if_catcode:w A #1 letter \else:
+ other \fi: \fi: \fi: \fi:
+ :N
+ }
+ #1
}
% \end{macrocode}
% Inside the \enquote{standard} grabber, there is a test to see if the
@@ -3113,6 +3478,7 @@
% \end{macro}
% \end{macro}
% \end{macro}
+% \end{macro}
%
% \begin{macro}{\@@_grab_D_nested:NNnN}
% \begin{macro}{\@@_grab_D_nested:w}
@@ -3300,7 +3666,6 @@
% \end{macro}
% \end{macro}
%
-%
% \begin{macro}{\@@_grab_m:w}
% \begin{macro}{\@@_grab_m_long:w}
% Collecting a single mandatory argument is quite easy.
@@ -3663,20 +4028,37 @@
% \end{macro}
%
% \begin{macro}{\@@_grab_v_aux_catcodes:}
+% \changes{v1.2g}{2025-01-21}{Store spaces and tabs as active chars}
% \begin{macro}{\@@_grab_v_aux_abort:n}
% The approach for short verbatim arguments is to make the end-line
% character a macro parameter character: this is forbidden by the
% rest of the code. Then the error branch can check what caused the
% bail out and give the appropriate error message.
% \begin{macrocode}
+%<latexrelease>\IncludeInRelease{2025/06/01}{\@@_grab_v_aux_catcodes:}%
+%<latexrelease> {Active~spaces~and~tabs}
\cs_new_protected:Npn \@@_grab_v_aux_catcodes:
{
\cs_set_eq:NN \do \char_set_catcode_other:N
\dospecials
+ \char_set_catcode_active:n { `\ }
+ \char_set_catcode_active:n { `\^^I }
\bool_if:NTF \l_@@_long_bool
{ \char_set_catcode_other:n { \tex_endlinechar:D } }
{ \char_set_catcode_parameter:n { \tex_endlinechar:D } }
}
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{2020/10/01}{\@@_grab_v_aux_catcodes:}%
+%<latexrelease> {Active~spaces~and~tabs}
+%<latexrelease>\cs_new_protected:Npn \@@_grab_v_aux_catcodes:
+%<latexrelease> {
+%<latexrelease> \cs_set_eq:NN \do \char_set_catcode_other:N
+%<latexrelease> \dospecials
+%<latexrelease> \bool_if:NTF \l_@@_long_bool
+%<latexrelease> { \char_set_catcode_other:n { \tex_endlinechar:D } }
+%<latexrelease> { \char_set_catcode_parameter:n { \tex_endlinechar:D } }
+%<latexrelease> }
+%<latexrelease>\EndIncludeInRelease
\cs_new_protected:Npn \@@_grab_v_aux_abort:n #1
{
\@@_grab_v_group_end:
@@ -3703,26 +4085,38 @@
%
% \begin{macro}{\@@_grab_v_aux_put:N}
% \changes{v1.2d}{2024/03/21}{Collect \cs{endlinechar} as \cs{obeyedline}}
-% Storing one token in the collected argument. Most tokens are
-% converted to category code $12$, with the exception of active
-% characters, and spaces (not sure what should be done for those).
+% \changes{v1.2g}{2025-01-21}{Simplify catcode handling}
+% Storing one token in the collected argument: everything as-is except
+% for end-of-lines, with \cs{exp_not:N} to handle actives.
% \begin{macrocode}
-%<latexrelease>\IncludeInRelease{2024/06/01}{\@@_grab_v_aux_put:N}%
-%<latexrelease> {Endlines~as~\obeyedline}
+%<latexrelease>\IncludeInRelease{2025-06-01}{\@@_grab_v_aux_put:N}%
+%<latexrelease> {Use~more~std~catcodes}
\cs_new_protected:Npn \@@_grab_v_aux_put:N #1
{
\tl_put_right:Nx \l_@@_v_arg_tl
{
- \token_if_active:NTF #1
+ \int_compare:nNnTF {`#1} = \tex_endlinechar:D
+ { \exp_not:N \obeyedline }
{ \exp_not:N #1 }
- {
- \int_compare:nNnTF {`#1} = \tex_endlinechar:D
- { \exp_not:N \obeyedline }
- { \token_to_str:N #1 }
- }
}
}
%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{2024/06/01}{\@@_grab_v_aux_put:N}%
+%<latexrelease> {Endlines~as~\obeyedline}
+%<latexrelease>\cs_new_protected:Npn \@@_grab_v_aux_put:N #1
+%<latexrelease> {
+%<latexrelease> \tl_put_right:Nx \l_@@_v_arg_tl
+%<latexrelease> {
+%<latexrelease> \token_if_active:NTF #1
+%<latexrelease> { \exp_not:N #1 }
+%<latexrelease> {
+%<latexrelease> \int_compare:nNnTF {`#1} = \tex_endlinechar:D
+%<latexrelease> { \exp_not:N \obeyedline }
+%<latexrelease> { \token_to_str:N #1 }
+%<latexrelease> }
+%<latexrelease> }
+%<latexrelease> }
+%<latexrelease>\EndIncludeInRelease
%<latexrelease>\IncludeInRelease{2020/10/01}{\@@_grab_v_aux_put:N}%
%<latexrelease> {Endlines~as~\obeyedline}
%<latexrelease>\cs_new_protected:Npn \@@_grab_v_aux_put:N #1
@@ -4568,9 +4962,9 @@
% \begin{macro}{\@@_cmd_type_cases:NnnnnnF}
% \changes{v1.0d}{2021/04/19}{Renamed \cs{__cmd_cmd_if_xparse:NTF} to
% \cs{__kernel_cmd_if_xparse:NTF} for cross-module usage}
-% \changes{v1.0d}{2021/07/30}{Added \cs{@@_cmd_type_cases:NnnnnF} for
+% \changes{v1.0d}{2021/07/30}{Added \cs{__cmd_cmd_type_cases:NnnnnF} for
% \cs{NewCommandCopy} and \cs{ShowCommand} support}
-% \changes{v1.0l}{2022/03/18}{Fix \cs{@@_cmd_type_cases:NnnnnF}
+% \changes{v1.0l}{2022/03/18}{Fix \cs{__cmd_cmd_type_cases:NnnnnF}
% prematurely expanding macros (gh/795)}
% \changes{v1.2b}{2023/12/01}{Extend for optimized commands}
% \changes{v1.2e}{2024/04/17}{Use \cs{__kernel_cs_parameter_spec:N} instead
@@ -4716,12 +5110,13 @@
% \changes{v1.0f}{2021/06/04}{Normalize various error messages}
% \changes{v1.2c}{2023/12/22}
% {Generalize message \texttt{invalid-bang} (gh/1198)}
+% \changes{v1.3a}{2025-01-23}{Generalize message \texttt{arg-after-body}}
% \begin{macrocode}
\msg_new:nnnn { cmd } { arg-after-body }
- { Argument~type~'b'~must~be~last~in~#1. }
+ { Argument~type~'#1'~must~be~last~in~#2. }
{
- The~'b'~argument~type~must~come~last~but~it~is~followed~
- by~'#2'~in~the~argument~specification.~This~is~not~allowed.
+ The~'#1'~argument~type~must~come~last~but~it~is~followed~
+ by~'#3'~in~the~argument~specification.~This~is~not~allowed.
\c_@@_ignore_def_tl
}
\msg_new:nnnn { cmd } { bad-arg-spec }
@@ -4745,6 +5140,22 @@
with~a~command~that~was~never~defined.
\c_@@_ignore_def_tl
}
+% \end{macrocode}
+% \changes{v1.3a}{2025-01-23}{New message \texttt{chars-dropped-first-line}}
+% \changes{v1.3a}{2025-01-23}{New message \texttt{chars-dropped-last-line}}
+% \begin{macrocode}
+\msg_new:nnnn { cmd } { chars-dropped-first-line }
+ { Characters~'#1'~dropped~on~first~line~of~#2~environment. }
+ {
+ LaTeX~was~collecting~a~verbatim-like~environment,~and~the~characters~
+ '#1'~were~found~after~'\begin{#2}~on~the~first~line:~this~is~not~supported.
+ }
+\msg_new:nnnn { cmd } { chars-dropped-last-line }
+ { Characters~'#1'~dropped~after~end~of~#2~environment. }
+ {
+ LaTeX~was~collecting~a~verbatim-like~environment,~and~the~characters~
+ '#1'~were~found~after~\end{#2}~on~the~last~line:~this~is~not~supported.
+ }
\msg_new:nnnn { cmd } { env-already-defined }
{ Environment~'#1'~already~defined. }
{
@@ -5295,8 +5706,10 @@
%
% \begin{macro}{\ProcessList}
% To support \cs{SplitList}.
+% \changes{v1.3b}{2025-02-01}
+% {Use \cs{tl_map_tokens:nn} instead of \cs{tl_map_function:nN}}
% \begin{macrocode}
-\cs_new_eq:NN \ProcessList \tl_map_function:nN
+\cs_new_eq:NN \ProcessList \tl_map_tokens:nn
% \end{macrocode}
% \end{macro}
%
diff --git a/Master/texmf-dist/source/latex-dev/base/ltcmdhooks.dtx b/Master/texmf-dist/source/latex-dev/base/ltcmdhooks.dtx
index 0d14ebfe6bb..8c948105606 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltcmdhooks.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltcmdhooks.dtx
@@ -1,7 +1,7 @@
% \iffalse meta-comment
%
%% From File: ltcmdhooks.dtx
-%% Copyright (C) 2020-2024
+%% Copyright (C) 2020-2025
%% Frank Mittelbach, Phelype Oleinik, The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
@@ -20,7 +20,7 @@
%<*driver>
% \fi
\ProvidesFile{ltcmdhooks.dtx}
- [2024/10/22 v1.0j LaTeX Kernel (Command hooks)]
+ [2024/12/25 v1.0k LaTeX Kernel (Command hooks)]
% \iffalse
%
\documentclass{l3doc}
@@ -513,7 +513,7 @@
% \begin{macro}{\c_@@_hash_tl,\c_@@_hashes_tl}
% Two constant token lists that contain one and two parameter tokens.
% \changes{v1.0g}{2023/04/06}
-% {Rename to \cs{c_@@_hashes_tl} and add \cs{c_@@_hash_tl} (hook-args).}
+% {Rename to \cs{c__hook_hashes_tl} and add \cs{c__hook_hash_tl} (hook-args)}
% \begin{macrocode}
\tl_const:Nn \c_@@_hash_tl { # }
\tl_const:Nn \c_@@_hashes_tl { # # }
@@ -577,20 +577,53 @@
% otherwise it tries to update the hook.
% \changes{v1.0d}{2021/08/25}{Simplify generic hook detection}
% \begin{macrocode}
-%<latexrelease>\IncludeInRelease{2021/11/15}{\@@_try_put_cmd_hook:n}%
-%<latexrelease> {Standardise~generic~hook~names}
+%<latexrelease>\IncludeInRelease{2024/12/22}{\@@_try_put_cmd_hook:n}%
+%<latexrelease> {Don't~define~command}
\cs_new_protected:Npn \@@_try_put_cmd_hook:n #1
{ \@@_try_put_cmd_hook:w #1 / / / \s_@@_mark {#1} }
\cs_new_protected:Npn \@@_try_put_cmd_hook:w
#1 / #2 / #3 / #4 \s_@@_mark #5
{
\@@_debug:n { \iow_term:n { ->~Adding~cmd~hook~to~'#2'~(#3): } }
- \exp_args:Nc \@@_patch_cmd_or_delay:Nnn {#2} {#2} {#3}
+% \end{macrocode}
+% \cs{@@_patch_cmd_or_delay:Nnn} expects the command to be patched
+% as its first argument so we need to construct it from its name
+% (\texttt{\#2}). However, at this moment it may not exist yet, so
+% using \cs{cs:w} would incorrectly turn it from
+% \enquote{undefined} into \cs{relax}. We therefore use the
+% following curious construction: we start a group and expand out of
+% it to call \cs{cs:w}. If the command is now changed to \cs{relax}
+% the \cs{group_end:} will undo that change, but the token is
+% nevertheless there to be consumed by \cs{@@_patch_cmd_or_delay:Nnn}.
+% \changes{v1.0k}{2024/12/22}{Avoid defining command while adding a cmd
+% hook (gh/1591)}
+% \begin{macrocode}
+ \group_begin:
+ \exp_after:wN
+ \group_end:
+ \exp_after:wN
+ \@@_patch_cmd_or_delay:Nnn
+ \cs:w #2\cs_end:
+ {#2} {#3}
}
%<latexrelease>\EndIncludeInRelease
% \end{macrocode}
%
% \begin{macrocode}
+%<latexrelease>\IncludeInRelease{2021/11/15}{\@@_try_put_cmd_hook:n}%
+%<latexrelease> {Standardise~generic~hook~names}
+%<latexrelease>\cs_new_protected:Npn \@@_try_put_cmd_hook:n #1
+%<latexrelease> { \@@_try_put_cmd_hook:w #1 / / / \s_@@_mark {#1} }
+%<latexrelease>\cs_new_protected:Npn \@@_try_put_cmd_hook:w
+%<latexrelease> #1 / #2 / #3 / #4 \s_@@_mark #5
+%<latexrelease> {
+%<latexrelease> \@@_debug:n { \iow_term:n { ->~Adding~cmd~hook~to~'#2'~(#3): } }
+%<latexrelease> \exp_args:Nc \__hook_patch_cmd_or_delay:Nnn {#2} {#2} {#3}
+%<latexrelease> }
+%<latexrelease>\EndIncludeInRelease
+% \end{macrocode}
+%
+% \begin{macrocode}
%<latexrelease>\IncludeInRelease{2021/06/01}{\@@_try_put_cmd_hook:n}%
%<latexrelease> {Standardise~generic~hook~names}
%<latexrelease>\cs_new_protected:Npn \@@_try_put_cmd_hook:n #1
@@ -849,7 +882,7 @@
%
% \changes{v1.0f}{2021/10/20}
% {Correct patching by expansion+redefinition when the macro
-% contains a parameter token (gh/697).}
+% contains a parameter token (gh/697)}
% Patching with expansion+redefinition is trickier than it looks like
% at first glance. Suppose the simple definition:
% \begin{verbatim}
@@ -964,7 +997,7 @@
% Here we'll conditionally add |[|\ldots|]| around the first
% parameter:
% \changes{v1.0g}{2023/04/06}
-% {Rename to \cs{c_@@_hashes_tl} (hook-args).}
+% {Rename to \cs{c__hook_hashes_tl} (hook-args)}
% \begin{macrocode}
\bool_if:NTF #1
{ \@@_tmp:w \tl_set:Nx { [ \c_@@_hashes_tl 1 ] } }
@@ -1032,7 +1065,7 @@
% the extent we want. Code stored in the hook and other metadata
% about it are not lost in the process.
% \changes{v1.0h}{2023/05/21}
-% {Changes to allow support arguments in cmd hooks (cmd-args).}
+% {Changes to allow support arguments in cmd hooks (cmd-args)}
% \begin{macrocode}
\@@_disable:n { cmd / #3 / #4 }
\cs_undefine:c { c_@@_cmd / #3 / #4_parameter_tl }
@@ -1242,7 +1275,7 @@
% then checks if the token is \cs{c_@@_hashes_tl}, and if so just leaves
% it.
% \changes{v1.0g}{2023/04/06}
-% {Add case for \cs{c_@@_hashes_tl} (hook-args).}
+% {Add case for \cs{c__hook_hashes_tl} (hook-args)}
% \begin{macrocode}
\cs_new:Npn \@@_double_hashes_output:N #1
{
@@ -1543,7 +1576,7 @@
% hashes, and not other characters, and that there is no
% \enquote{trick parameter}.
% \changes{v1.0h}{2023/05/21}
-% {Macro added (cmd-args).}
+% {Macro added (cmd-args)}
% \begin{macrocode}
%<latexrelease>\IncludeInRelease{2023/06/01}{\@@_guess_arg_count:NN}
%<latexrelease> {cmd~hooks~with~args}
@@ -1592,7 +1625,7 @@
% Here, when patching by retokenization, we can only guess the number
% of arguments of the macro.
% \changes{v1.0h}{2023/05/21}
-% {Changes to allow support arguments in cmd hooks (cmd-args).}
+% {Changes to allow support arguments in cmd hooks (cmd-args)}
% \begin{macrocode}
\@@_guess_arg_count:NN #1 \l_@@_patch_num_args_int
% \end{macrocode}
@@ -1614,7 +1647,7 @@
{ #### } { \c_hash_str }
}
% \end{macrocode}
-% Then, make make some things \tn{relax} to avoid lots of
+% Then, make some things \tn{relax} to avoid lots of
% \tn{noexpand} below.
% \begin{macrocode}
\cs_set_eq:NN \kerneltmpDoNotUse \scan_stop:
diff --git a/Master/texmf-dist/source/latex-dev/base/ltcntrl.dtx b/Master/texmf-dist/source/latex-dev/base/ltcntrl.dtx
index fad5bf479ec..6c406240be8 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltcntrl.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltcntrl.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/Master/texmf-dist/source/latex-dev/base/ltcounts.dtx b/Master/texmf-dist/source/latex-dev/base/ltcounts.dtx
index 1d3f2024898..da88a92b7a5 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltcounts.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltcounts.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -33,7 +33,7 @@
%<*driver>
% \fi
\ProvidesFile{ltcounts.dtx}
- [2024/10/26 v1.1p LaTeX Kernel (Counters)]
+ [2025/01/22 v1.2a LaTeX Kernel (Counters)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltcounts.dtx}
@@ -56,6 +56,7 @@
%</driver>
% \fi
%
+% \providecommand\env[1]{\texttt{#1}}
%
% \changes{v1.0c}{1994/03/29}
% {Create file from parts of ltmiscen and ltherest.}
@@ -63,7 +64,9 @@
% \changes{v1.1d}{1996/04/23}{Documentation improvements}
%
% \section{Counters and Lengths}
-% Commands for defining and using counters. This file defines:
+% Commands for defining and using counters.
+% This file defines the following commands. In each case \marg{counter} may be
+% |*| denoting the current counter as set by a previous |\refstepcounter|.
%
% \DescribeMacro{\newcounter}
% To define a new counter.
@@ -72,13 +75,13 @@
% To set the value of counters.
%
% \DescribeMacro{\addtocounter}
-% Increase the counter |#1| by the number |#2|.
+% Increase the \marg{counter} |#1| by the number |#2|.
%
% \DescribeMacro{\stepcounter}
-% Increase a counter by one.
+% Increase the \marg{counter} by one.
%
% \DescribeMacro{\refstepcounter}
-% Increase a counter by one, also setting the value used by |\label|.
+% Increase the \marg{counter} by one, also setting the value used by |\label|.
%
%
% \DescribeMacro{\value}
@@ -113,7 +116,8 @@
% |\the|\meta{within-counter}.\meta{format}\marg{counter} with \cs{arabic} as
% the default for \meta{format}.
% Star form omits redefining the print representation.
-
+%
+% The |*| alias for the current counter may not be used in either argument.
%
% \DescribeMacro\counterwithout
% |\counterwithout|\oarg{format}\marg{counter}\marg{within-counter}:
@@ -124,6 +128,8 @@
% the default for \meta{format}.
% Star form omits redefining the print representation.
%
+% The |*| alias for the current counter may not be used in either argument.
+%
% \MaybeStop{}
%
% \begin{macrocode}
@@ -246,7 +252,19 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\@newctr}
+% \begin{macro}{\c@*}
+% \changes{v1.2a}{2025/01/22}{\cs{c@*} added (gh/1632)}
+% Make the current counter available as a \LaTeX\ counter
+% with name |*|, so |\alph*| returns the current
+% counter as a letter, |\stepcounter{*}| increments the current
+% counter, etc.
+% \begin{macrocode}
+\protected\expandafter
+ \def\csname c@*\endcsname{\value\@currentcounter}
+% \end{macrocode}
+% \end{macro}
+%
+%\begin{macro}{\@newctr}
% \changes{v1.0d}{1994/04/09}
% {\cs{@nocnterr} now has counter name argument}
% \changes{v1.0e}{1994/04/17}
@@ -422,19 +440,27 @@
\endgroup}}
% \end{macrocode}
% \end{macro}
-
-
-
+%
% \begin{macro}{\@ifbothcounters}
% \changes{v1.1k}{2018/03/08}{Interface added}
+% \changes{v1.2a}{2025/01/22}{Guard against star alias.}
% Test if arg |#1| and |#2| are counters and if so execute |#3|.
% \begin{macrocode}
+\begingroup\catcode`\*=11 \lowercase{\endgroup
\def\@ifbothcounters#1#2#3{%
+% \end{macrocode}
+% \begin{macrocode}
+ \begingroup\let\c@*\@undefined
+% \end{macrocode}
+% \begin{macrocode}
\@ifundefined{c@#1}{\@nocounterr{#1}}%
{% else counter is defined
\@ifundefined{c@#2}{\@nocounterr{#2}}%
{% else both counter and within are defined
- #3}}}
+ #3}}%
+% \end{macrocode}
+% \begin{macrocode}
+ \endgroup}}
% \end{macrocode}
% \end{macro}
%
@@ -621,7 +647,7 @@
% |\@Roman\FOOcounter|
% Representation of |\FOOcounter| as upper-case
% Roman numerals.
-
+%
% \changes{v1.1f}{1997/10/06}{Change \cs{@Roman} to be fully
% expandable, so that the result is written properly to files.}
% \begin{macrocode}
diff --git a/Master/texmf-dist/source/latex-dev/base/ltdefns.dtx b/Master/texmf-dist/source/latex-dev/base/ltdefns.dtx
index 5185a076eb2..4784c5dec0d 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltdefns.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltdefns.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -32,7 +32,7 @@
%<*driver>
% \fi
\ProvidesFile{ltdefns.dtx}
- [2024/09/06 v1.5t LaTeX Kernel (definition commands)]
+ [2025/01/24 v1.5t LaTeX Kernel (definition commands)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltdefns.dtx}
@@ -943,6 +943,15 @@
% \end{macro}
% \end{macro}
%
+% There are also \cs{@gobble@om}, \cs{@gobble@som},
+% \cs{@gobble@with@sphack@om}, and \cs{@gobble@with@sphack@som}. They
+% accept an optional and a mandatory argument, possibly preceeded by a
+% star. In all cases the expansion is empty or just manipulates the
+% spaces around the command. Used to disable commands such as
+% \cs{index} or \cs{label} in certain situations. Since they are
+% defined with \cs{DeclareDocumentCommand}, which is not yet available
+% at this point, the actual definition happens in \texttt{ltsect.dtx}.
+%
% \begin{macro}{\@firstofone}
% \begin{macro}{\@firstoftwo}
% \begin{macro}{\@secondoftwo}
diff --git a/Master/texmf-dist/source/latex-dev/base/ltdirchk.dtx b/Master/texmf-dist/source/latex-dev/base/ltdirchk.dtx
index cefbdefce6f..5fd38cb9816 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltdirchk.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltdirchk.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/Master/texmf-dist/source/latex-dev/base/lterror.dtx b/Master/texmf-dist/source/latex-dev/base/lterror.dtx
index 7170e51f8c6..99653108864 100644
--- a/Master/texmf-dist/source/latex-dev/base/lterror.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/lterror.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/Master/texmf-dist/source/latex-dev/base/ltexpl.dtx b/Master/texmf-dist/source/latex-dev/base/ltexpl.dtx
index 0133688af6b..1e01684ec06 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltexpl.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltexpl.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2019-2024
+% Copyright (C) 2019-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/Master/texmf-dist/source/latex-dev/base/ltfilehook.dtx b/Master/texmf-dist/source/latex-dev/base/ltfilehook.dtx
index 02e95d0f8fa..e8f5257003d 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltfilehook.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltfilehook.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2020-2024
+% Copyright (C) 2020-2025
% Frank Mittelbach, Phelype Oleinik and The LaTeX Project
%
% This file is part of the LaTeX base system.
@@ -34,7 +34,7 @@
%\iffalse
%<*driver,structuredlog>
%\fi
-\def\ltfilehookdate{2024/03/13}
+\def\ltfilehookdate{2025/01/25}
\def\ltfilehookversion{v1.0o}
%\iffalse
%</driver,structuredlog>
@@ -140,11 +140,11 @@
%
% \begin{tabbing}
% mm\=mm\=mm\=mm\=\kill
-% \>\cs{UseHook}\marg{\hook{file/before}} \\
-% \>\cs{UseHook}\marg{\hook{file/\meta{file name}/before}} \\
+% \>\cs{UseHook}\texttt{\{\hook{file/before}\}} \\
+% \>\cs{UseHook}\texttt{\{\hook{file/\meta{file name}/before}\}} \\
% \>\> \meta{file contents} \\
-% \>\cs{UseHook}\marg{\hook{file/\meta{file name}/after}} \\
-% \>\cs{UseHook}\marg{\hook{file/after}}
+% \>\cs{UseHook}\texttt{\{\hook{file/\meta{file name}/after}\}} \\
+% \>\cs{UseHook}\texttt{\{\hook{file/after}\}}
% \end{tabbing}
%
% The file hooks only refer to the file by its name and extension,
@@ -242,31 +242,32 @@
% \meta{name} (without extension).
%
% \end{description}
-% \end{variable}
% All \hook{/after} hooks are implemented as reversed hooks.
+% \end{variable}
+%
+% \bigskip
%
-% \noindent The overall sequence of execution for \cs{usepackage}
-% and friends is therefore:
+% The overall sequence of execution for \cs{usepackage}
+% and friends is:
% \begin{tabbing}
% mm\=mm\=mm\=mm\=\kill
-% \>\cs{UseHook}\marg{\hook{package/before}} \\
-% \>\cs{UseHook}\marg{\hook{package/\meta{package name}/before}} \\[5pt]
-% \>\>\cs{UseHook}\marg{\hook{file/before}} \\
-% \>\>\cs{UseHook}\marg{\hook{file/\meta{package name}.sty/before}} \\
+% \>\cs{UseHook}\texttt{\{\hook{package/before}\}} \\
+% \>\cs{UseOneTimeHook}\texttt{\{\hook{package/\meta{package name}/before}\}} \\[5pt]
+% \>\>\cs{UseHook}\texttt{\{\hook{file/before}\}} \\
+% \>\>\cs{UseHook}\texttt{\{\hook{file/\meta{package name}.sty/before}\}} \\
% \>\>\> \meta{package contents} \\
-% \>\>\cs{UseHook}\marg{\hook{file/\meta{package name}.sty/after}} \\
-% \>\>\cs{UseHook}\marg{\hook{file/after}} \\[5pt]
+% \>\>\cs{UseHook}\texttt{\{\hook{file/\meta{package name}.sty/after}\}} \\
+% \>\>\cs{UseHook}\texttt{\{\hook{file/after}\}} \\[5pt]
% \>\>\emph{code from \cs{AtEndOfPackage} if
% used inside the package} \\[5pt]
-% \>\cs{UseHook}\marg{\hook{package/\meta{package name}/after}} \\
-% \>\cs{UseHook}\marg{\hook{package/after}}
+% \>\cs{UseOneTimeHook}\texttt{\{\hook{package/\meta{package name}/after}\}} \\
+% \>\cs{UseHook}\texttt{\{\hook{package/after}\}}
% \end{tabbing}
% and similar for class file loading, except that \hook{package/}
% is replaced by \hook{class/} and \cs{AtEndOfPackage} by
% \cs{AtEndOfClass}.
%
-% If a package or class is not loaded (or it was loaded before the
-% hooks were set) none of the hooks are executed!
+% If a package or class is not loaded none of the hooks are executed!
%
% All class or package hooks involving the name of the class or
% package are implemented as
@@ -282,6 +283,7 @@
%
%
%
+%
% \subsection{Hooks for \cs{include} files}
%
% To manage \cs{include} files, \LaTeX{} issues a \cs{clearpage}
@@ -622,7 +624,7 @@
% need \cs{CurrentFile} earlier (\cs{@onefilewithoptions}), so these
% are manually used elsewhere as well.
% \changes{v1.0h}{2021/03/18}
-% {Define \cs{g_@@_input_file_seq} to avoid losing data when
+% {Define \cs{g__filehook_input_file_seq} to avoid losing data when
% rolling back.}
% \changes{v1.0l}{2021/08/27}{Internal message name changes}
% \begin{macrocode}
@@ -1276,6 +1278,10 @@
% \end{macro}
%
%
+% \begin{macrocode}
+%<@@=filehook>
+% \end{macrocode}
+%
%
% \begin{macro}{\@@_set_curr_file:nNN,
% \@@_set_curr_file_assign:nnnNN}
@@ -1292,9 +1298,8 @@
%</2ekernel>
%<*2ekernel|latexrelease>
%<latexrelease>\IncludeInRelease{2020/10/01}%
-%<latexrelease> {@@_set_curr_file:nNN}{Set curr file}%
+%<latexrelease> {\@@_set_curr_file:nNN}{Set curr file}%
\ExplSyntaxOn
-%<@@=filehook>
\cs_new_protected:Npn \@@_set_curr_file:nNN #1
{
\exp_args:Nf \@@_file_parse_full_name:nN {#1}
diff --git a/Master/texmf-dist/source/latex-dev/base/ltfiles.dtx b/Master/texmf-dist/source/latex-dev/base/ltfiles.dtx
index 2e2a8884a01..40c0b7dff8e 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltfiles.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltfiles.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/Master/texmf-dist/source/latex-dev/base/ltfinal.dtx b/Master/texmf-dist/source/latex-dev/base/ltfinal.dtx
index 7be7c033b68..ae236de2ebe 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltfinal.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltfinal.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/Master/texmf-dist/source/latex-dev/base/ltfloat.dtx b/Master/texmf-dist/source/latex-dev/base/ltfloat.dtx
index ef057def0b8..7edce570cdd 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltfloat.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltfloat.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/Master/texmf-dist/source/latex-dev/base/ltfntcmd.dtx b/Master/texmf-dist/source/latex-dev/base/ltfntcmd.dtx
index 097b8f692e4..12b2d7af57c 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltfntcmd.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltfntcmd.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/Master/texmf-dist/source/latex-dev/base/ltfssaxes.dtx b/Master/texmf-dist/source/latex-dev/base/ltfssaxes.dtx
index 56506a97601..b0dcf9c74ab 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltfssaxes.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltfssaxes.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2019-2024
+% Copyright (C) 2019-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -28,14 +28,14 @@
% \fi
% \iffalse
%%% From File: ltfssaxes.dtx
-%% Copyright (C) 2019-2020 Frank Mittelbach
+%% Copyright (C) 2019-2020 Frank Mittelbach (initial implementation)
%
%<*driver>
% \fi
%
%
\ProvidesFile{ltfssaxes.dtx}
- [2024/11/19 v1.0j LaTeX Kernel (NFSS Axes handing)]
+ [2024/12/16 v1.0k LaTeX Kernel (NFSS Axes handing)]
% \iffalse
\documentclass{ltxdoc}
\begin{document}
@@ -59,8 +59,8 @@
% \maketitle
%
% This file contains the implementation for handling extra axes
-% splitting the series and the values into sub-categories. selection
-% commands. See other parts of the \LaTeX\ distribution, or \emph{The
+% by splitting the series and the shape values into sub-categories.
+% See other parts of the \LaTeX\ distribution, or \emph{The
% \LaTeX\ Companion} for higher level documentation of the
% \LaTeX\ Font Selection Scheme.
%
@@ -81,7 +81,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-%<latexrelease>\IncludeInRelease{2020/02/02}%
+%<latexrelease>\IncludeInRelease{2025/06/01}%
%<latexrelease> {\DeclareFontSeriesChangeRule}{Series change rules}%
% \end{macrocode}
%
@@ -91,43 +91,43 @@
%
% In the original NFSS implementation the series was a single
% attribute stored in \cs{f@series} and so one always had to specify
-% both weight and width together. This means it was impossible to
-% typeset, a paragraph in a condensed font and inside have a few words
+% both weight and width together. This meant that it was impossible to
+% typeset a paragraph in a condensed font and inside have a few words
% in bold weight (but still condensed) without doing this manually by
% requesting \verb=\fontseries{bc}\selectfont=.
%
-% The new implementation now works differently by looking both at the
-% current value of \cs{f@series} and the requested new series and out
-% of that combination selects a resulting series value. Thus, if the
-% current series is \texttt{c} and we ask for \texttt{b} we now get
+% The new implementation now works differently, by looking at both the
+% current value of \cs{f@series} and the requested new series; these
+% are then used to select a new series value. Thus, if the
+% current series is \texttt{c} and we ask for \texttt{b} we now get
% \texttt{bc}.
%
% This is done by consulting a simple lookup table. This table is
-% configurable (though most likely that flexibility will seldom of
-% ever be needed) Adding or changing entries in this table are done
+% configurable (though most likely that flexibility will seldom if
+% ever be needed). Adding or changing entries in this table is done
% with \cs{DeclareFontSeriesChangeRule}.
%
% \subsection{The series lookup table}
%
%
% \begin{macro}{\DeclareFontSeriesChangeRule}
-% The \cs{DeclareFontSeriesChangeRule} defines entries in a simple
+% The macro \cs{DeclareFontSeriesChangeRule} defines entries in a simple
% database (implemented as a set of commands) that define mappings
-% between from an existing series and requested new series and maps
-% that to a result series (and additionally offers an alternative
-% if the desired one is not existing):
+% from the current series and a requested new series to a result series
+% (and additionally offers an alternative if the desired one is
+% unavailable):
% \begin{itemize}
% \item[\texttt{\#1}] current \cs{f@series}
% \item[\texttt{\#2}] requested new series
-% \item[\texttt{\#3}] result (if that exist for the given font family
+% \item[\texttt{\#3}] result (provided this series exists in the given font family)
% \item[\texttt{\#4}] alternative result (if \texttt{\#3} does not exist)
% \end{itemize}
% If an \texttt{.fd} file has its own substitution rules then
% \texttt{\#3} exist and thus \texttt{\#4} is not applied.
%
-% If there is no matching database entry or if neither the result
-% nor the alternate result exist in the font family the requested
-% new series is used (which then may trigger substitutions later on.
+% If there is no matching database entry, or if neither the result
+% nor the alternative result exists in this font family, then the requested
+% new series is used (which then may trigger substitutions later on).
% \begin{macrocode}
\def\DeclareFontSeriesChangeRule#1#2#3#4{%
\@namedef{series@#1@#2}{{#3}{#4}}}
@@ -139,9 +139,11 @@
% The rules set up use explicit series values not \cs{..default}
% indirections; my current feeling is that this is in fact better.
%
-% With 9 weights and 9 width classes this table is getting a bit large
-% in the end (324 entries) but on the other hand it doesn't change and
-% accessing speed and it is fast this way.
+% With 9~weight values (from \texttt{ul} to \texttt{ub}) and 9~width values
+% (from \texttt{uc} to \texttt{ux}), this table is now rather large
+% (far more than 1000~entries), but, on the other hand, the table
+% doesn't change and accessing rules is fast when using a table implemented
+% in this way.
%
% We could alternatively split the axis and maintain weight and width
% separately, but that would take more processing time and would not
@@ -152,38 +154,95 @@
% \begin{itemize}
% \item
%
-% We make \texttt{m} to reset both weight and width (as this is
+% We make \texttt{m} reset both weight and width (as this is
% how it always worked). To reset just the width \texttt{?m} is
-% provided and to reset just the weight \texttt{m?}.
+% provided and to reset just the weight \texttt{m?}\ is provided.
%
% \item
%
-% We do support ``\texttt{m}\textit{width}'' and
-% ``\textit{weight}\texttt{m}'', e.g., \texttt{mec} to mean ``go to
+% We support ``\texttt{m}\meta{width}'' and
+% ``\meta{weight}\texttt{m}'', e.g., \texttt{mec} to mean ``go to
% medium weight and extra-condensed width''. At the end of the
% process we automatically drop any leftover \texttt{m} in the
% series name (unless it is just a single \texttt{m}).
%
+% \item
+%
+% If there is no table entry then the requested series is used
+% unconditionally. This means that we usually do not need entries
+% where the second argument (the requested series) and the third argument
+% (the result series) are identical (unless we want to use the fourth
+% argument to specify an alternative result series). In particular,
+% this means:
+% \begin{itemize}
+% \item
+%
+% Any request for \texttt{m} needs no entry, i.e., there are no entries
+% which have \texttt{m} as the second argument.
+%
+% \item
+%
+% Any request to set both weight and width (e.g., \texttt{sbx} or
+% \texttt{ulc}) needs no entry. For that reason, there are no entries
+% which have a weight+width as second argument (except for cases
+% involving \texttt{bx}, see below). In particular, this is also true
+% for cases involving \texttt{m}, e.g., \texttt{bm} (bold medium width)
+% which automatically gets reduced to \texttt{b}, or \texttt{mc}
+% (medium weight condensed) which becomes \texttt{c} as a result.
+%
+% There is one exception: we do have rules for a request for
+% \texttt{bx}; this is because the Computer Modern fonts (or related
+% families like Latin Modern) need \texttt{bx} as their bold series
+% default (\cs{bfdefault}),
+% since they only have a \texttt{b} series for a
+% restricted set of font faces. Many other font families have only
+% \texttt{b} but no \texttt{bx}, so we have explicit rules
+% that fall back from \texttt{bx} to \texttt{b}.
+% \end{itemize}
+%
+% \item
+%
+% For each combination of a non-\texttt{m} \meta{weight} and a
+% non-\texttt{m} \meta{width}, there are 19~entries which have
+% ``\meta{weight}\meta{width}'' as first argument: 8~of them have
+% the weight values from \texttt{ul} to \texttt{ub} except \texttt{m} as
+% second argument, another 8~have the width values from \texttt{uc}
+% to \texttt{ux} except \texttt{m} as second argument, and (further down
+% in this file) there is one entry which has \texttt{bx} as second
+% argument and two further entries which have \texttt{m?}\ and
+% \texttt{?m} as second argument. Rules which have \texttt{m} or a
+% weight+width (other than \texttt{bx}) as second argument aren't needed
+% (see above).
%
% \item
%
-% If there is no table entry then the target series is used
-% unconditionally. This means that any request to set both weight
-% and width (e.g. \texttt{bx} or \texttt{ulc}) needs no table
-% entries.
-% For that reason there are no entries which have a weight+width as
-% request (i.e., second argument).
+% For each non-\texttt{m} \meta{weight}, there are at least 11~entries
+% which have ``\meta{weight}'' as first argument: 8~of them have the
+% width values from \texttt{uc} to \texttt{ux} except \texttt{m} as
+% second argument, and (further down in this file) there is one entry
+% which has \texttt{bx} as second argument and two further entries
+% which have \texttt{m?}\ and \texttt{?m} as second argument. Rules
+% which have a single weight value as second argument aren't needed
+% because the second and third arguments would then be identical. In
+% some cases, there are extra rules which make use of the fourth
+% argument to specify an alternative result series.
+%
+% \item
%
-% In particular this is also true for cases involving \texttt{m},
-% e.g., \texttt{bm} (bold medium width) which automatically gets
-% reduced result in \texttt{b} or \texttt{mc} (medium weight
-% condensed) which becomes \texttt{c} as a result.
+% Similarily, for each non-\texttt{m} \meta{width}, there are at least
+% 11~entries which have ``\meta{width}'' as first argument: 8~of them
+% have the weight values from \texttt{ul} to \texttt{ub} except
+% \texttt{m} as second argument, and (further down in this file) there
+% is one entry which has \texttt{bx} as second argument and two
+% further entries which have \texttt{m?}\ and \texttt{?m} as second
+% argument. Rules which have a single width value as second argument
+% aren't needed because the second and third arguments would then be
+% identical. In some cases, there are extra rules which make use of the
+% fourth argument to specify an alternative result series.
%
% \item
%
-% Only a few entries have ``alternative'' values and perhaps most of
-% them should get dropped. Or maybe not \ldots{} needs some thought
-% perhaps.
+% Only a few entries have ``alternative'' values.
%
% The idea is that you don't want the normal substitution to kick
% in because that would reset the shape first and it may be better
@@ -192,503 +251,3119 @@
% shape to \texttt{n} and then find that \texttt{bc/n} doesn't
% exist either and thus ending up with \texttt{m/n}.
%
-% \item
+% We mainly do this when \texttt{sb}, \texttt{eb}, or
+% \texttt{ub} is requested but can't be fulfilled. In that case it
+% is better to try to stay with some sort of bold rather than
+% ending up with \texttt{m}. There are some other cases where an
+% ``alternative'' value is specified; these are explained below in
+% the appropriate places.
+%
+% \end{itemize}
%
-% Also: while I did set up all nine standard weight values from
-% \texttt{ul} to \texttt{ub} I only bothered to provide entries for
-% \texttt{ec}, \texttt{sc}, \texttt{c} and \texttt{x}, because other levels of
-% compression/expansion are not in any real fonts that I know.
+% \changes{1.0k}{2024/12/13}{Minor modifications to a few
+% \cs{DeclareFontSeriesChangeRule} entries (gh/1396)}
+% \changes{1.0k}{2024/12/13}{Add numerous \cs{DeclareFontSeriesChangeRule}
+% entries to support the full range of weights (from \texttt{ul} to
+% \texttt{ub}) and widths (from \texttt{uc} to \texttt{ux}) (gh/1396)}
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {uluc}{ul} {uluc} {}
+\DeclareFontSeriesChangeRule {uluc}{el} {eluc} {}
+\DeclareFontSeriesChangeRule {uluc}{l} {luc} {}
+\DeclareFontSeriesChangeRule {uluc}{sl} {sluc} {}
+\DeclareFontSeriesChangeRule {uluc}{sb} {sbuc} {buc}
+\DeclareFontSeriesChangeRule {uluc}{b} {buc} {}
+\DeclareFontSeriesChangeRule {uluc}{eb} {ebuc} {buc}
+\DeclareFontSeriesChangeRule {uluc}{ub} {ubuc} {buc}
+\DeclareFontSeriesChangeRule {uluc}{uc} {uluc} {}
+\DeclareFontSeriesChangeRule {uluc}{ec} {ulec} {}
+\DeclareFontSeriesChangeRule {uluc}{c} {ulc} {}
+\DeclareFontSeriesChangeRule {uluc}{sc} {ulsc} {}
+\DeclareFontSeriesChangeRule {uluc}{sx} {ulsx} {}
+\DeclareFontSeriesChangeRule {uluc}{x} {ulx} {}
+\DeclareFontSeriesChangeRule {uluc}{ex} {ulex} {}
+\DeclareFontSeriesChangeRule {uluc}{ux} {ulux} {}
+% \end{macrocode}
%
-% Could and perhaps should be eventually extended to cover the
-% whole set.
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {ulec}{ul} {ulec} {}
+\DeclareFontSeriesChangeRule {ulec}{el} {elec} {}
+\DeclareFontSeriesChangeRule {ulec}{l} {lec} {}
+\DeclareFontSeriesChangeRule {ulec}{sl} {slec} {}
+\DeclareFontSeriesChangeRule {ulec}{sb} {sbec} {bec}
+\DeclareFontSeriesChangeRule {ulec}{b} {bec} {}
+\DeclareFontSeriesChangeRule {ulec}{eb} {ebec} {bec}
+\DeclareFontSeriesChangeRule {ulec}{ub} {ubec} {bec}
+\DeclareFontSeriesChangeRule {ulec}{uc} {uluc} {}
+\DeclareFontSeriesChangeRule {ulec}{ec} {ulec} {}
+\DeclareFontSeriesChangeRule {ulec}{c} {ulc} {}
+\DeclareFontSeriesChangeRule {ulec}{sc} {ulsc} {}
+\DeclareFontSeriesChangeRule {ulec}{sx} {ulsx} {}
+\DeclareFontSeriesChangeRule {ulec}{x} {ulx} {}
+\DeclareFontSeriesChangeRule {ulec}{ex} {ulex} {}
+\DeclareFontSeriesChangeRule {ulec}{ux} {ulux} {}
+% \end{macrocode}
%
-% \end{itemize}
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {ulc}{ul} {ulc} {}
+\DeclareFontSeriesChangeRule {ulc}{el} {elc} {}
+\DeclareFontSeriesChangeRule {ulc}{l} {lc} {}
+\DeclareFontSeriesChangeRule {ulc}{sl} {slc} {}
+\DeclareFontSeriesChangeRule {ulc}{sb} {sbc} {bc}
+\DeclareFontSeriesChangeRule {ulc}{b} {bc} {}
+\DeclareFontSeriesChangeRule {ulc}{eb} {ebc} {bc}
+\DeclareFontSeriesChangeRule {ulc}{ub} {ubc} {bc}
+\DeclareFontSeriesChangeRule {ulc}{uc} {uluc} {}
+\DeclareFontSeriesChangeRule {ulc}{ec} {ulec} {}
+\DeclareFontSeriesChangeRule {ulc}{c} {ulc} {}
+\DeclareFontSeriesChangeRule {ulc}{sc} {ulsc} {}
+\DeclareFontSeriesChangeRule {ulc}{sx} {ulsx} {}
+\DeclareFontSeriesChangeRule {ulc}{x} {ulx} {}
+\DeclareFontSeriesChangeRule {ulc}{ex} {ulex} {}
+\DeclareFontSeriesChangeRule {ulc}{ux} {ulux} {}
+% \end{macrocode}
%
% \begin{macrocode}
-\DeclareFontSeriesChangeRule {bc}{b}{bc}{}
-\DeclareFontSeriesChangeRule {bc}{c}{bc}{}
-\DeclareFontSeriesChangeRule {bc}{eb}{ebc}{}
-\DeclareFontSeriesChangeRule {bc}{ec}{bec} {bc}
-\DeclareFontSeriesChangeRule {bc}{el}{elc}{}
-\DeclareFontSeriesChangeRule {bc}{l}{lc}{}
-\DeclareFontSeriesChangeRule {bc}{sb}{sbc}{}
-\DeclareFontSeriesChangeRule {bc}{sc}{bsc} {bc}
-\DeclareFontSeriesChangeRule {bc}{sl}{slc}{}
-\DeclareFontSeriesChangeRule {bc}{ub}{ubc}{}
-\DeclareFontSeriesChangeRule {bc}{ul}{ulc}{}
-\DeclareFontSeriesChangeRule {bc}{x}{bx}{}
-% \end{macrocode}
-%
+\DeclareFontSeriesChangeRule {ulsc}{ul} {ulsc} {}
+\DeclareFontSeriesChangeRule {ulsc}{el} {elsc} {}
+\DeclareFontSeriesChangeRule {ulsc}{l} {lsc} {}
+\DeclareFontSeriesChangeRule {ulsc}{sl} {slsc} {}
+\DeclareFontSeriesChangeRule {ulsc}{sb} {sbsc} {bsc}
+\DeclareFontSeriesChangeRule {ulsc}{b} {bsc} {}
+\DeclareFontSeriesChangeRule {ulsc}{eb} {ebsc} {bsc}
+\DeclareFontSeriesChangeRule {ulsc}{ub} {ubsc} {bsc}
+\DeclareFontSeriesChangeRule {ulsc}{uc} {uluc} {}
+\DeclareFontSeriesChangeRule {ulsc}{ec} {ulec} {}
+\DeclareFontSeriesChangeRule {ulsc}{c} {ulc} {}
+\DeclareFontSeriesChangeRule {ulsc}{sc} {ulsc} {}
+\DeclareFontSeriesChangeRule {ulsc}{sx} {ulsx} {}
+\DeclareFontSeriesChangeRule {ulsc}{x} {ulx} {}
+\DeclareFontSeriesChangeRule {ulsc}{ex} {ulex} {}
+\DeclareFontSeriesChangeRule {ulsc}{ux} {ulux} {}
+% \end{macrocode}
+%
% \begin{macrocode}
-\DeclareFontSeriesChangeRule {bx}{b}{bx}{}
-\DeclareFontSeriesChangeRule {bx}{c} {bc} {bx} %<-----
-\DeclareFontSeriesChangeRule {bx}{eb}{ebx}{}
-\DeclareFontSeriesChangeRule {bx}{ec} {bec} {bx} %<-----
-\DeclareFontSeriesChangeRule {bx}{el}{elx}{}
-\DeclareFontSeriesChangeRule {bx}{l}{lx}{}
-\DeclareFontSeriesChangeRule {bx}{sb} {sbx} {}
-\DeclareFontSeriesChangeRule {bx}{sc} {bsc} {bx} %<-----
-\DeclareFontSeriesChangeRule {bx}{sl}{slx} {}
-\DeclareFontSeriesChangeRule {bx}{ub}{ubx}{}
-\DeclareFontSeriesChangeRule {bx}{ul}{ulx}{}
-\DeclareFontSeriesChangeRule {bx}{x}{bx}{}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\DeclareFontSeriesChangeRule {b}{bx} {bx} {b} %<-----
-\DeclareFontSeriesChangeRule {b}{c} {bc} {b} %<-----
-\DeclareFontSeriesChangeRule {b}{ec} {bec} {b} %<-----
-\DeclareFontSeriesChangeRule {b}{sb} {sb} {b} %<-----
-\DeclareFontSeriesChangeRule {b}{sc} {bsc} {b} %<-----
-\DeclareFontSeriesChangeRule {b}{x} {bx} {b} %<-----
-% \end{macrocode}
-%
-% \begin{macrocode}
-\DeclareFontSeriesChangeRule {c}{bx} {bx} {b} %<-----
-\DeclareFontSeriesChangeRule {c}{b}{bc}{}
-\DeclareFontSeriesChangeRule {c}{eb}{ebc}{}
-\DeclareFontSeriesChangeRule {c}{el}{elc}{}
-\DeclareFontSeriesChangeRule {c}{l}{lc}{}
-\DeclareFontSeriesChangeRule {c}{sb}{sbc}{}
-\DeclareFontSeriesChangeRule {c}{sl}{slc}{}
-\DeclareFontSeriesChangeRule {c}{ub}{ubc}{}
-\DeclareFontSeriesChangeRule {c}{ul}{ulc}{}
-\DeclareFontSeriesChangeRule {c}{x}{x}{m} %<-----
-% \end{macrocode}
-%
+\DeclareFontSeriesChangeRule {ul}{uc} {uluc} {}
+\DeclareFontSeriesChangeRule {ul}{ec} {ulec} {}
+\DeclareFontSeriesChangeRule {ul}{c} {ulc} {}
+\DeclareFontSeriesChangeRule {ul}{sc} {ulsc} {}
+\DeclareFontSeriesChangeRule {ul}{sx} {ulsx} {}
+\DeclareFontSeriesChangeRule {ul}{x} {ulx} {}
+\DeclareFontSeriesChangeRule {ul}{ex} {ulex} {}
+\DeclareFontSeriesChangeRule {ul}{ux} {ulux} {}
+\DeclareFontSeriesChangeRule {ul}{sb} {sb} {b}
+\DeclareFontSeriesChangeRule {ul}{eb} {eb} {b}
+\DeclareFontSeriesChangeRule {ul}{ub} {ub} {b}
+% \end{macrocode}
+%
% \begin{macrocode}
-\DeclareFontSeriesChangeRule {ebc}{b}{bc}{}
-\DeclareFontSeriesChangeRule {ebc}{c}{ebc}{}
-\DeclareFontSeriesChangeRule {ebc}{eb}{ebc}{}
-\DeclareFontSeriesChangeRule {ebc}{ec}{ebec}{ebc}
-\DeclareFontSeriesChangeRule {ebc}{el}{elc}{}
-\DeclareFontSeriesChangeRule {ebc}{l}{lc}{}
-\DeclareFontSeriesChangeRule {ebc}{sb}{sbc}{}
-\DeclareFontSeriesChangeRule {ebc}{sc}{ebsc}{ebc}
-\DeclareFontSeriesChangeRule {ebc}{sl}{slc}{}
-\DeclareFontSeriesChangeRule {ebc}{ub}{ubc}{}
-\DeclareFontSeriesChangeRule {ebc}{ul}{ulc}{}
-\DeclareFontSeriesChangeRule {ebc}{x}{ebx}{}
-% \end{macrocode}
-%
-%
+\DeclareFontSeriesChangeRule {ulsx}{ul} {ulsx} {}
+\DeclareFontSeriesChangeRule {ulsx}{el} {elsx} {}
+\DeclareFontSeriesChangeRule {ulsx}{l} {lsx} {}
+\DeclareFontSeriesChangeRule {ulsx}{sl} {slsx} {}
+\DeclareFontSeriesChangeRule {ulsx}{sb} {sbsx} {bsx}
+\DeclareFontSeriesChangeRule {ulsx}{b} {bsx} {}
+\DeclareFontSeriesChangeRule {ulsx}{eb} {ebsx} {bsx}
+\DeclareFontSeriesChangeRule {ulsx}{ub} {ubsx} {bsx}
+\DeclareFontSeriesChangeRule {ulsx}{uc} {uluc} {}
+\DeclareFontSeriesChangeRule {ulsx}{ec} {ulec} {}
+\DeclareFontSeriesChangeRule {ulsx}{c} {ulc} {}
+\DeclareFontSeriesChangeRule {ulsx}{sc} {ulsc} {}
+\DeclareFontSeriesChangeRule {ulsx}{sx} {ulsx} {}
+\DeclareFontSeriesChangeRule {ulsx}{x} {ulx} {}
+\DeclareFontSeriesChangeRule {ulsx}{ex} {ulex} {}
+\DeclareFontSeriesChangeRule {ulsx}{ux} {ulux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {ulx}{ul} {ulx} {}
+\DeclareFontSeriesChangeRule {ulx}{el} {elx} {}
+\DeclareFontSeriesChangeRule {ulx}{l} {lx} {}
+\DeclareFontSeriesChangeRule {ulx}{sl} {slx} {}
+\DeclareFontSeriesChangeRule {ulx}{sb} {sbx} {bx}
+\DeclareFontSeriesChangeRule {ulx}{b} {bx} {}
+\DeclareFontSeriesChangeRule {ulx}{eb} {ebx} {bx}
+\DeclareFontSeriesChangeRule {ulx}{ub} {ubx} {bx}
+\DeclareFontSeriesChangeRule {ulx}{uc} {uluc} {}
+\DeclareFontSeriesChangeRule {ulx}{ec} {ulec} {}
+\DeclareFontSeriesChangeRule {ulx}{c} {ulc} {}
+\DeclareFontSeriesChangeRule {ulx}{sc} {ulsc} {}
+\DeclareFontSeriesChangeRule {ulx}{sx} {ulsx} {}
+\DeclareFontSeriesChangeRule {ulx}{x} {ulx} {}
+\DeclareFontSeriesChangeRule {ulx}{ex} {ulex} {}
+\DeclareFontSeriesChangeRule {ulx}{ux} {ulux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {ulex}{ul} {ulex} {}
+\DeclareFontSeriesChangeRule {ulex}{el} {elex} {}
+\DeclareFontSeriesChangeRule {ulex}{l} {lex} {}
+\DeclareFontSeriesChangeRule {ulex}{sl} {slex} {}
+\DeclareFontSeriesChangeRule {ulex}{sb} {sbex} {bex}
+\DeclareFontSeriesChangeRule {ulex}{b} {bex} {}
+\DeclareFontSeriesChangeRule {ulex}{eb} {ebex} {bex}
+\DeclareFontSeriesChangeRule {ulex}{ub} {ubex} {bex}
+\DeclareFontSeriesChangeRule {ulex}{uc} {uluc} {}
+\DeclareFontSeriesChangeRule {ulex}{ec} {ulec} {}
+\DeclareFontSeriesChangeRule {ulex}{c} {ulc} {}
+\DeclareFontSeriesChangeRule {ulex}{sc} {ulsc} {}
+\DeclareFontSeriesChangeRule {ulex}{sx} {ulsx} {}
+\DeclareFontSeriesChangeRule {ulex}{x} {ulx} {}
+\DeclareFontSeriesChangeRule {ulex}{ex} {ulex} {}
+\DeclareFontSeriesChangeRule {ulex}{ux} {ulux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {ulux}{ul} {ulux} {}
+\DeclareFontSeriesChangeRule {ulux}{el} {elux} {}
+\DeclareFontSeriesChangeRule {ulux}{l} {lux} {}
+\DeclareFontSeriesChangeRule {ulux}{sl} {slux} {}
+\DeclareFontSeriesChangeRule {ulux}{sb} {sbux} {bux}
+\DeclareFontSeriesChangeRule {ulux}{b} {bux} {}
+\DeclareFontSeriesChangeRule {ulux}{eb} {ebux} {bux}
+\DeclareFontSeriesChangeRule {ulux}{ub} {ubux} {bux}
+\DeclareFontSeriesChangeRule {ulux}{uc} {uluc} {}
+\DeclareFontSeriesChangeRule {ulux}{ec} {ulec} {}
+\DeclareFontSeriesChangeRule {ulux}{c} {ulc} {}
+\DeclareFontSeriesChangeRule {ulux}{sc} {ulsc} {}
+\DeclareFontSeriesChangeRule {ulux}{sx} {ulsx} {}
+\DeclareFontSeriesChangeRule {ulux}{x} {ulx} {}
+\DeclareFontSeriesChangeRule {ulux}{ex} {ulex} {}
+\DeclareFontSeriesChangeRule {ulux}{ux} {ulux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {eluc}{ul} {uluc} {}
+\DeclareFontSeriesChangeRule {eluc}{el} {eluc} {}
+\DeclareFontSeriesChangeRule {eluc}{l} {luc} {}
+\DeclareFontSeriesChangeRule {eluc}{sl} {sluc} {}
+\DeclareFontSeriesChangeRule {eluc}{sb} {sbuc} {buc}
+\DeclareFontSeriesChangeRule {eluc}{b} {buc} {}
+\DeclareFontSeriesChangeRule {eluc}{eb} {ebuc} {buc}
+\DeclareFontSeriesChangeRule {eluc}{ub} {ubuc} {buc}
+\DeclareFontSeriesChangeRule {eluc}{uc} {eluc} {}
+\DeclareFontSeriesChangeRule {eluc}{ec} {elec} {}
+\DeclareFontSeriesChangeRule {eluc}{c} {elc} {}
+\DeclareFontSeriesChangeRule {eluc}{sc} {elsc} {}
+\DeclareFontSeriesChangeRule {eluc}{sx} {elsx} {}
+\DeclareFontSeriesChangeRule {eluc}{x} {elx} {}
+\DeclareFontSeriesChangeRule {eluc}{ex} {elex} {}
+\DeclareFontSeriesChangeRule {eluc}{ux} {elux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {elec}{ul} {ulec} {}
+\DeclareFontSeriesChangeRule {elec}{el} {elec} {}
+\DeclareFontSeriesChangeRule {elec}{l} {lec} {}
+\DeclareFontSeriesChangeRule {elec}{sl} {slec} {}
+\DeclareFontSeriesChangeRule {elec}{sb} {sbec} {bec}
+\DeclareFontSeriesChangeRule {elec}{b} {bec} {}
+\DeclareFontSeriesChangeRule {elec}{eb} {ebec} {bec}
+\DeclareFontSeriesChangeRule {elec}{ub} {ubec} {bec}
+\DeclareFontSeriesChangeRule {elec}{uc} {eluc} {}
+\DeclareFontSeriesChangeRule {elec}{ec} {elec} {}
+\DeclareFontSeriesChangeRule {elec}{c} {elc} {}
+\DeclareFontSeriesChangeRule {elec}{sc} {elsc} {}
+\DeclareFontSeriesChangeRule {elec}{sx} {elsx} {}
+\DeclareFontSeriesChangeRule {elec}{x} {elx} {}
+\DeclareFontSeriesChangeRule {elec}{ex} {elex} {}
+\DeclareFontSeriesChangeRule {elec}{ux} {elux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {elc}{ul} {ulc} {}
+\DeclareFontSeriesChangeRule {elc}{el} {elc} {}
+\DeclareFontSeriesChangeRule {elc}{l} {lc} {}
+\DeclareFontSeriesChangeRule {elc}{sl} {slc} {}
+\DeclareFontSeriesChangeRule {elc}{sb} {sbc} {bc}
+\DeclareFontSeriesChangeRule {elc}{b} {bc} {}
+\DeclareFontSeriesChangeRule {elc}{eb} {ebc} {bc}
+\DeclareFontSeriesChangeRule {elc}{ub} {ubc} {bc}
+\DeclareFontSeriesChangeRule {elc}{uc} {eluc} {}
+\DeclareFontSeriesChangeRule {elc}{ec} {elec} {}
+\DeclareFontSeriesChangeRule {elc}{c} {elc} {}
+\DeclareFontSeriesChangeRule {elc}{sc} {elsc} {}
+\DeclareFontSeriesChangeRule {elc}{sx} {elsx} {}
+\DeclareFontSeriesChangeRule {elc}{x} {elx} {}
+\DeclareFontSeriesChangeRule {elc}{ex} {elex} {}
+\DeclareFontSeriesChangeRule {elc}{ux} {elux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {elsc}{ul} {ulsc} {}
+\DeclareFontSeriesChangeRule {elsc}{el} {elsc} {}
+\DeclareFontSeriesChangeRule {elsc}{l} {lsc} {}
+\DeclareFontSeriesChangeRule {elsc}{sl} {slsc} {}
+\DeclareFontSeriesChangeRule {elsc}{sb} {sbsc} {bsc}
+\DeclareFontSeriesChangeRule {elsc}{b} {bsc} {}
+\DeclareFontSeriesChangeRule {elsc}{eb} {ebsc} {bsc}
+\DeclareFontSeriesChangeRule {elsc}{ub} {ubsc} {bsc}
+\DeclareFontSeriesChangeRule {elsc}{uc} {eluc} {}
+\DeclareFontSeriesChangeRule {elsc}{ec} {elec} {}
+\DeclareFontSeriesChangeRule {elsc}{c} {elc} {}
+\DeclareFontSeriesChangeRule {elsc}{sc} {elsc} {}
+\DeclareFontSeriesChangeRule {elsc}{sx} {elsx} {}
+\DeclareFontSeriesChangeRule {elsc}{x} {elx} {}
+\DeclareFontSeriesChangeRule {elsc}{ex} {elex} {}
+\DeclareFontSeriesChangeRule {elsc}{ux} {elux} {}
+% \end{macrocode}
+%
% \begin{macrocode}
-\DeclareFontSeriesChangeRule {ec}{bx} {bx} {b} %<-----
-\DeclareFontSeriesChangeRule {ec}{b}{bec}{}
-\DeclareFontSeriesChangeRule {ec}{eb}{ebec}{}
-\DeclareFontSeriesChangeRule {ec}{el}{elec}{}
-\DeclareFontSeriesChangeRule {ec}{l}{lec}{}
-\DeclareFontSeriesChangeRule {ec}{sb}{sbec}{}
-\DeclareFontSeriesChangeRule {ec}{sl}{slec}{}
-\DeclareFontSeriesChangeRule {ec}{ub}{ubec}{}
-\DeclareFontSeriesChangeRule {ec}{ul}{ulec}{}
-\DeclareFontSeriesChangeRule {ec}{x}{x}{m} %<-----
-% \end{macrocode}
-%
-% \begin{macrocode}
-\DeclareFontSeriesChangeRule {sc}{bx} {bx} {b} %<-----
-\DeclareFontSeriesChangeRule {sc}{b}{bsc}{}
-\DeclareFontSeriesChangeRule {sc}{eb}{ebsc}{}
-\DeclareFontSeriesChangeRule {sc}{el}{elsc}{}
-\DeclareFontSeriesChangeRule {sc}{l}{lsc}{}
-\DeclareFontSeriesChangeRule {sc}{sb}{sbsc}{}
-\DeclareFontSeriesChangeRule {sc}{sl}{slsc}{}
-\DeclareFontSeriesChangeRule {sc}{ub}{ubsc}{}
-\DeclareFontSeriesChangeRule {sc}{ul}{ulsc}{}
-\DeclareFontSeriesChangeRule {sc}{x}{x}{m} %<-----
-% \end{macrocode}
+\DeclareFontSeriesChangeRule {el}{uc} {eluc} {}
+\DeclareFontSeriesChangeRule {el}{ec} {elec} {}
+\DeclareFontSeriesChangeRule {el}{c} {elc} {}
+\DeclareFontSeriesChangeRule {el}{sc} {elsc} {}
+\DeclareFontSeriesChangeRule {el}{sx} {elsx} {}
+\DeclareFontSeriesChangeRule {el}{x} {elx} {}
+\DeclareFontSeriesChangeRule {el}{ex} {elex} {}
+\DeclareFontSeriesChangeRule {el}{ux} {elux} {}
+\DeclareFontSeriesChangeRule {el}{sb} {sb} {b}
+\DeclareFontSeriesChangeRule {el}{eb} {eb} {b}
+\DeclareFontSeriesChangeRule {el}{ub} {ub} {b}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {elsx}{ul} {ulsx} {}
+\DeclareFontSeriesChangeRule {elsx}{el} {elsx} {}
+\DeclareFontSeriesChangeRule {elsx}{l} {lsx} {}
+\DeclareFontSeriesChangeRule {elsx}{sl} {slsx} {}
+\DeclareFontSeriesChangeRule {elsx}{sb} {sbsx} {bsx}
+\DeclareFontSeriesChangeRule {elsx}{b} {bsx} {}
+\DeclareFontSeriesChangeRule {elsx}{eb} {ebsx} {bsx}
+\DeclareFontSeriesChangeRule {elsx}{ub} {ubsx} {bsx}
+\DeclareFontSeriesChangeRule {elsx}{uc} {eluc} {}
+\DeclareFontSeriesChangeRule {elsx}{ec} {elec} {}
+\DeclareFontSeriesChangeRule {elsx}{c} {elc} {}
+\DeclareFontSeriesChangeRule {elsx}{sc} {elsc} {}
+\DeclareFontSeriesChangeRule {elsx}{sx} {elsx} {}
+\DeclareFontSeriesChangeRule {elsx}{x} {elx} {}
+\DeclareFontSeriesChangeRule {elsx}{ex} {elex} {}
+\DeclareFontSeriesChangeRule {elsx}{ux} {elux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {elx}{ul} {ulx} {}
+\DeclareFontSeriesChangeRule {elx}{el} {elx} {}
+\DeclareFontSeriesChangeRule {elx}{l} {lx} {}
+\DeclareFontSeriesChangeRule {elx}{sl} {slx} {}
+\DeclareFontSeriesChangeRule {elx}{sb} {sbx} {bx}
+\DeclareFontSeriesChangeRule {elx}{b} {bx} {}
+\DeclareFontSeriesChangeRule {elx}{eb} {ebx} {bx}
+\DeclareFontSeriesChangeRule {elx}{ub} {ubx} {bx}
+\DeclareFontSeriesChangeRule {elx}{uc} {eluc} {}
+\DeclareFontSeriesChangeRule {elx}{ec} {elec} {}
+\DeclareFontSeriesChangeRule {elx}{c} {elc} {}
+\DeclareFontSeriesChangeRule {elx}{sc} {elsc} {}
+\DeclareFontSeriesChangeRule {elx}{sx} {elsx} {}
+\DeclareFontSeriesChangeRule {elx}{x} {elx} {}
+\DeclareFontSeriesChangeRule {elx}{ex} {elex} {}
+\DeclareFontSeriesChangeRule {elx}{ux} {elux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {elex}{ul} {ulex} {}
+\DeclareFontSeriesChangeRule {elex}{el} {elex} {}
+\DeclareFontSeriesChangeRule {elex}{l} {lex} {}
+\DeclareFontSeriesChangeRule {elex}{sl} {slex} {}
+\DeclareFontSeriesChangeRule {elex}{sb} {sbex} {bex}
+\DeclareFontSeriesChangeRule {elex}{b} {bex} {}
+\DeclareFontSeriesChangeRule {elex}{eb} {ebex} {bex}
+\DeclareFontSeriesChangeRule {elex}{ub} {ubex} {bex}
+\DeclareFontSeriesChangeRule {elex}{uc} {eluc} {}
+\DeclareFontSeriesChangeRule {elex}{ec} {elec} {}
+\DeclareFontSeriesChangeRule {elex}{c} {elc} {}
+\DeclareFontSeriesChangeRule {elex}{sc} {elsc} {}
+\DeclareFontSeriesChangeRule {elex}{sx} {elsx} {}
+\DeclareFontSeriesChangeRule {elex}{x} {elx} {}
+\DeclareFontSeriesChangeRule {elex}{ex} {elex} {}
+\DeclareFontSeriesChangeRule {elex}{ux} {elux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {elux}{ul} {ulux} {}
+\DeclareFontSeriesChangeRule {elux}{el} {elux} {}
+\DeclareFontSeriesChangeRule {elux}{l} {lux} {}
+\DeclareFontSeriesChangeRule {elux}{sl} {slux} {}
+\DeclareFontSeriesChangeRule {elux}{sb} {sbux} {bux}
+\DeclareFontSeriesChangeRule {elux}{b} {bux} {}
+\DeclareFontSeriesChangeRule {elux}{eb} {ebux} {bux}
+\DeclareFontSeriesChangeRule {elux}{ub} {ubux} {bux}
+\DeclareFontSeriesChangeRule {elux}{uc} {eluc} {}
+\DeclareFontSeriesChangeRule {elux}{ec} {elec} {}
+\DeclareFontSeriesChangeRule {elux}{c} {elc} {}
+\DeclareFontSeriesChangeRule {elux}{sc} {elsc} {}
+\DeclareFontSeriesChangeRule {elux}{sx} {elsx} {}
+\DeclareFontSeriesChangeRule {elux}{x} {elx} {}
+\DeclareFontSeriesChangeRule {elux}{ex} {elex} {}
+\DeclareFontSeriesChangeRule {elux}{ux} {elux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {luc}{ul} {uluc} {}
+\DeclareFontSeriesChangeRule {luc}{el} {eluc} {}
+\DeclareFontSeriesChangeRule {luc}{l} {luc} {}
+\DeclareFontSeriesChangeRule {luc}{sl} {sluc} {}
+\DeclareFontSeriesChangeRule {luc}{sb} {sbuc} {buc}
+\DeclareFontSeriesChangeRule {luc}{b} {buc} {}
+\DeclareFontSeriesChangeRule {luc}{eb} {ebuc} {buc}
+\DeclareFontSeriesChangeRule {luc}{ub} {ubuc} {buc}
+\DeclareFontSeriesChangeRule {luc}{uc} {luc} {}
+\DeclareFontSeriesChangeRule {luc}{ec} {lec} {}
+\DeclareFontSeriesChangeRule {luc}{c} {lc} {}
+\DeclareFontSeriesChangeRule {luc}{sc} {lsc} {}
+\DeclareFontSeriesChangeRule {luc}{sx} {lsx} {}
+\DeclareFontSeriesChangeRule {luc}{x} {lx} {}
+\DeclareFontSeriesChangeRule {luc}{ex} {lex} {}
+\DeclareFontSeriesChangeRule {luc}{ux} {lux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {lec}{ul} {ulec} {}
+\DeclareFontSeriesChangeRule {lec}{el} {elec} {}
+\DeclareFontSeriesChangeRule {lec}{l} {lec} {}
+\DeclareFontSeriesChangeRule {lec}{sl} {slec} {}
+\DeclareFontSeriesChangeRule {lec}{sb} {sbec} {bec}
+\DeclareFontSeriesChangeRule {lec}{b} {bec} {}
+\DeclareFontSeriesChangeRule {lec}{eb} {ebec} {bec}
+\DeclareFontSeriesChangeRule {lec}{ub} {ubec} {bec}
+\DeclareFontSeriesChangeRule {lec}{uc} {luc} {}
+\DeclareFontSeriesChangeRule {lec}{ec} {lec} {}
+\DeclareFontSeriesChangeRule {lec}{c} {lc} {}
+\DeclareFontSeriesChangeRule {lec}{sc} {lsc} {}
+\DeclareFontSeriesChangeRule {lec}{sx} {lsx} {}
+\DeclareFontSeriesChangeRule {lec}{x} {lx} {}
+\DeclareFontSeriesChangeRule {lec}{ex} {lex} {}
+\DeclareFontSeriesChangeRule {lec}{ux} {lux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {lc}{ul} {ulc} {}
+\DeclareFontSeriesChangeRule {lc}{el} {elc} {}
+\DeclareFontSeriesChangeRule {lc}{l} {lc} {}
+\DeclareFontSeriesChangeRule {lc}{sl} {slc} {}
+\DeclareFontSeriesChangeRule {lc}{sb} {sbc} {bc}
+\DeclareFontSeriesChangeRule {lc}{b} {bc} {}
+\DeclareFontSeriesChangeRule {lc}{eb} {ebc} {bc}
+\DeclareFontSeriesChangeRule {lc}{ub} {ubc} {bc}
+\DeclareFontSeriesChangeRule {lc}{uc} {luc} {}
+\DeclareFontSeriesChangeRule {lc}{ec} {lec} {}
+\DeclareFontSeriesChangeRule {lc}{c} {lc} {}
+\DeclareFontSeriesChangeRule {lc}{sc} {lsc} {}
+\DeclareFontSeriesChangeRule {lc}{sx} {lsx} {}
+\DeclareFontSeriesChangeRule {lc}{x} {lx} {}
+\DeclareFontSeriesChangeRule {lc}{ex} {lex} {}
+\DeclareFontSeriesChangeRule {lc}{ux} {lux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {lsc}{ul} {ulsc} {}
+\DeclareFontSeriesChangeRule {lsc}{el} {elsc} {}
+\DeclareFontSeriesChangeRule {lsc}{l} {lsc} {}
+\DeclareFontSeriesChangeRule {lsc}{sl} {slsc} {}
+\DeclareFontSeriesChangeRule {lsc}{sb} {sbsc} {bsc}
+\DeclareFontSeriesChangeRule {lsc}{b} {bsc} {}
+\DeclareFontSeriesChangeRule {lsc}{eb} {ebsc} {bsc}
+\DeclareFontSeriesChangeRule {lsc}{ub} {ubsc} {bsc}
+\DeclareFontSeriesChangeRule {lsc}{uc} {luc} {}
+\DeclareFontSeriesChangeRule {lsc}{ec} {lec} {}
+\DeclareFontSeriesChangeRule {lsc}{c} {lc} {}
+\DeclareFontSeriesChangeRule {lsc}{sc} {lsc} {}
+\DeclareFontSeriesChangeRule {lsc}{sx} {lsx} {}
+\DeclareFontSeriesChangeRule {lsc}{x} {lx} {}
+\DeclareFontSeriesChangeRule {lsc}{ex} {lex} {}
+\DeclareFontSeriesChangeRule {lsc}{ux} {lux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {l}{uc} {luc} {}
+\DeclareFontSeriesChangeRule {l}{ec} {lec} {}
+\DeclareFontSeriesChangeRule {l}{c} {lc} {}
+\DeclareFontSeriesChangeRule {l}{sc} {lsc} {}
+\DeclareFontSeriesChangeRule {l}{sx} {lsx} {}
+\DeclareFontSeriesChangeRule {l}{x} {lx} {}
+\DeclareFontSeriesChangeRule {l}{ex} {lex} {}
+\DeclareFontSeriesChangeRule {l}{ux} {lux} {}
+\DeclareFontSeriesChangeRule {l}{sb} {sb} {b}
+\DeclareFontSeriesChangeRule {l}{eb} {eb} {b}
+\DeclareFontSeriesChangeRule {l}{ub} {ub} {b}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {lsx}{ul} {ulsx} {}
+\DeclareFontSeriesChangeRule {lsx}{el} {elsx} {}
+\DeclareFontSeriesChangeRule {lsx}{l} {lsx} {}
+\DeclareFontSeriesChangeRule {lsx}{sl} {slsx} {}
+\DeclareFontSeriesChangeRule {lsx}{sb} {sbsx} {bsx}
+\DeclareFontSeriesChangeRule {lsx}{b} {bsx} {}
+\DeclareFontSeriesChangeRule {lsx}{eb} {ebsx} {bsx}
+\DeclareFontSeriesChangeRule {lsx}{ub} {ubsx} {bsx}
+\DeclareFontSeriesChangeRule {lsx}{uc} {luc} {}
+\DeclareFontSeriesChangeRule {lsx}{ec} {lec} {}
+\DeclareFontSeriesChangeRule {lsx}{c} {lc} {}
+\DeclareFontSeriesChangeRule {lsx}{sc} {lsc} {}
+\DeclareFontSeriesChangeRule {lsx}{sx} {lsx} {}
+\DeclareFontSeriesChangeRule {lsx}{x} {lx} {}
+\DeclareFontSeriesChangeRule {lsx}{ex} {lex} {}
+\DeclareFontSeriesChangeRule {lsx}{ux} {lux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {lx}{ul} {ulx} {}
+\DeclareFontSeriesChangeRule {lx}{el} {elx} {}
+\DeclareFontSeriesChangeRule {lx}{l} {lx} {}
+\DeclareFontSeriesChangeRule {lx}{sl} {slx} {}
+\DeclareFontSeriesChangeRule {lx}{sb} {sbx} {bx}
+\DeclareFontSeriesChangeRule {lx}{b} {bx} {}
+\DeclareFontSeriesChangeRule {lx}{eb} {ebx} {bx}
+\DeclareFontSeriesChangeRule {lx}{ub} {ubx} {bx}
+\DeclareFontSeriesChangeRule {lx}{uc} {luc} {}
+\DeclareFontSeriesChangeRule {lx}{ec} {lec} {}
+\DeclareFontSeriesChangeRule {lx}{c} {lc} {}
+\DeclareFontSeriesChangeRule {lx}{sc} {lsc} {}
+\DeclareFontSeriesChangeRule {lx}{sx} {lsx} {}
+\DeclareFontSeriesChangeRule {lx}{x} {lx} {}
+\DeclareFontSeriesChangeRule {lx}{ex} {lex} {}
+\DeclareFontSeriesChangeRule {lx}{ux} {lux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {lex}{ul} {ulex} {}
+\DeclareFontSeriesChangeRule {lex}{el} {elex} {}
+\DeclareFontSeriesChangeRule {lex}{l} {lex} {}
+\DeclareFontSeriesChangeRule {lex}{sl} {slex} {}
+\DeclareFontSeriesChangeRule {lex}{sb} {sbex} {bex}
+\DeclareFontSeriesChangeRule {lex}{b} {bex} {}
+\DeclareFontSeriesChangeRule {lex}{eb} {ebex} {bex}
+\DeclareFontSeriesChangeRule {lex}{ub} {ubex} {bex}
+\DeclareFontSeriesChangeRule {lex}{uc} {luc} {}
+\DeclareFontSeriesChangeRule {lex}{ec} {lec} {}
+\DeclareFontSeriesChangeRule {lex}{c} {lc} {}
+\DeclareFontSeriesChangeRule {lex}{sc} {lsc} {}
+\DeclareFontSeriesChangeRule {lex}{sx} {lsx} {}
+\DeclareFontSeriesChangeRule {lex}{x} {lx} {}
+\DeclareFontSeriesChangeRule {lex}{ex} {lex} {}
+\DeclareFontSeriesChangeRule {lex}{ux} {lux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {lux}{ul} {ulux} {}
+\DeclareFontSeriesChangeRule {lux}{el} {elux} {}
+\DeclareFontSeriesChangeRule {lux}{l} {lux} {}
+\DeclareFontSeriesChangeRule {lux}{sl} {slux} {}
+\DeclareFontSeriesChangeRule {lux}{sb} {sbux} {bux}
+\DeclareFontSeriesChangeRule {lux}{b} {bux} {}
+\DeclareFontSeriesChangeRule {lux}{eb} {ebux} {bux}
+\DeclareFontSeriesChangeRule {lux}{ub} {ubux} {bux}
+\DeclareFontSeriesChangeRule {lux}{uc} {luc} {}
+\DeclareFontSeriesChangeRule {lux}{ec} {lec} {}
+\DeclareFontSeriesChangeRule {lux}{c} {lc} {}
+\DeclareFontSeriesChangeRule {lux}{sc} {lsc} {}
+\DeclareFontSeriesChangeRule {lux}{sx} {lsx} {}
+\DeclareFontSeriesChangeRule {lux}{x} {lx} {}
+\DeclareFontSeriesChangeRule {lux}{ex} {lex} {}
+\DeclareFontSeriesChangeRule {lux}{ux} {lux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {sluc}{ul} {uluc} {}
+\DeclareFontSeriesChangeRule {sluc}{el} {eluc} {}
+\DeclareFontSeriesChangeRule {sluc}{l} {luc} {}
+\DeclareFontSeriesChangeRule {sluc}{sl} {sluc} {}
+\DeclareFontSeriesChangeRule {sluc}{sb} {sbuc} {buc}
+\DeclareFontSeriesChangeRule {sluc}{b} {buc} {}
+\DeclareFontSeriesChangeRule {sluc}{eb} {ebuc} {buc}
+\DeclareFontSeriesChangeRule {sluc}{ub} {ubuc} {buc}
+\DeclareFontSeriesChangeRule {sluc}{uc} {sluc} {}
+\DeclareFontSeriesChangeRule {sluc}{ec} {slec} {}
+\DeclareFontSeriesChangeRule {sluc}{c} {slc} {}
+\DeclareFontSeriesChangeRule {sluc}{sc} {slsc} {}
+\DeclareFontSeriesChangeRule {sluc}{sx} {slsx} {}
+\DeclareFontSeriesChangeRule {sluc}{x} {slx} {}
+\DeclareFontSeriesChangeRule {sluc}{ex} {slex} {}
+\DeclareFontSeriesChangeRule {sluc}{ux} {slux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {slec}{ul} {ulec} {}
+\DeclareFontSeriesChangeRule {slec}{el} {elec} {}
+\DeclareFontSeriesChangeRule {slec}{l} {lec} {}
+\DeclareFontSeriesChangeRule {slec}{sl} {slec} {}
+\DeclareFontSeriesChangeRule {slec}{sb} {sbec} {bec}
+\DeclareFontSeriesChangeRule {slec}{b} {bec} {}
+\DeclareFontSeriesChangeRule {slec}{eb} {ebec} {bec}
+\DeclareFontSeriesChangeRule {slec}{ub} {ubec} {bec}
+\DeclareFontSeriesChangeRule {slec}{uc} {sluc} {}
+\DeclareFontSeriesChangeRule {slec}{ec} {slec} {}
+\DeclareFontSeriesChangeRule {slec}{c} {slc} {}
+\DeclareFontSeriesChangeRule {slec}{sc} {slsc} {}
+\DeclareFontSeriesChangeRule {slec}{sx} {slsx} {}
+\DeclareFontSeriesChangeRule {slec}{x} {slx} {}
+\DeclareFontSeriesChangeRule {slec}{ex} {slex} {}
+\DeclareFontSeriesChangeRule {slec}{ux} {slux} {}
+% \end{macrocode}
%
-% \begin{macrocode}
-\DeclareFontSeriesChangeRule {ebx}{b}{bx}{}
-\DeclareFontSeriesChangeRule {ebx}{c}{ebc}{}
-\DeclareFontSeriesChangeRule {ebx}{eb}{ebx}{}
-\DeclareFontSeriesChangeRule {ebx}{ec}{ebec}{}
-\DeclareFontSeriesChangeRule {ebx}{el}{elx}{}
-\DeclareFontSeriesChangeRule {ebx}{l}{lx}{}
-\DeclareFontSeriesChangeRule {ebx}{sb}{sbx}{}
-\DeclareFontSeriesChangeRule {ebx}{sc}{ebsc}{}
-\DeclareFontSeriesChangeRule {ebx}{sl}{slx}{}
-\DeclareFontSeriesChangeRule {ebx}{ub}{ubx}{}
-\DeclareFontSeriesChangeRule {ebx}{ul}{ulx}{}
-\DeclareFontSeriesChangeRule {ebx}{x}{ebx}{}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\DeclareFontSeriesChangeRule {eb}{c}{ebc}{}
-\DeclareFontSeriesChangeRule {eb}{ec}{ebec}{}
-\DeclareFontSeriesChangeRule {eb}{sc}{ebsc}{}
-\DeclareFontSeriesChangeRule {eb}{x}{ebx}{}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\DeclareFontSeriesChangeRule {elc}{b}{bc}{}
-\DeclareFontSeriesChangeRule {elc}{c}{elc}{}
-\DeclareFontSeriesChangeRule {elc}{eb}{ebc}{}
-\DeclareFontSeriesChangeRule {elc}{ec}{elec}{}
-\DeclareFontSeriesChangeRule {elc}{el}{elc}{}
-\DeclareFontSeriesChangeRule {elc}{l}{lc}{}
-\DeclareFontSeriesChangeRule {elc}{sb}{sbc}{}
-\DeclareFontSeriesChangeRule {elc}{sc}{elsc}{}
-\DeclareFontSeriesChangeRule {elc}{sl}{slc}{}
-\DeclareFontSeriesChangeRule {elc}{ub}{ubc}{}
-\DeclareFontSeriesChangeRule {elc}{ul}{ulc}{}
-\DeclareFontSeriesChangeRule {elc}{x}{elx}{}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\DeclareFontSeriesChangeRule {elx}{b}{bx}{}
-\DeclareFontSeriesChangeRule {elx}{c}{elc}{}
-\DeclareFontSeriesChangeRule {elx}{eb}{ebx}{}
-\DeclareFontSeriesChangeRule {elx}{ec}{elec}{}
-\DeclareFontSeriesChangeRule {elx}{el}{elx}{}
-\DeclareFontSeriesChangeRule {elx}{l}{lx}{}
-\DeclareFontSeriesChangeRule {elx}{sb}{sbx}{}
-\DeclareFontSeriesChangeRule {elx}{sc}{elsc}{}
-\DeclareFontSeriesChangeRule {elx}{sl}{slx}{}
-\DeclareFontSeriesChangeRule {elx}{ub}{ubx}{}
-\DeclareFontSeriesChangeRule {elx}{ul}{ulx}{}
-\DeclareFontSeriesChangeRule {elx}{x}{elx}{}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\DeclareFontSeriesChangeRule {el}{c}{elc}{}
-\DeclareFontSeriesChangeRule {el}{ec}{elec}{}
-\DeclareFontSeriesChangeRule {el}{sc}{elsc}{}
-\DeclareFontSeriesChangeRule {el}{x}{elx}{}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\DeclareFontSeriesChangeRule {lc}{b}{bc}{}
-\DeclareFontSeriesChangeRule {lc}{c}{lc}{}
-\DeclareFontSeriesChangeRule {lc}{eb}{ebc}{}
-\DeclareFontSeriesChangeRule {lc}{ec}{lec}{}
-\DeclareFontSeriesChangeRule {lc}{el}{elc}{}
-\DeclareFontSeriesChangeRule {lc}{l}{lc}{}
-\DeclareFontSeriesChangeRule {lc}{sb}{sbc}{}
-\DeclareFontSeriesChangeRule {lc}{sc}{lsc}{}
-\DeclareFontSeriesChangeRule {lc}{sl}{slc}{}
-\DeclareFontSeriesChangeRule {lc}{ub}{ubc}{}
-\DeclareFontSeriesChangeRule {lc}{ul}{ulc}{}
-\DeclareFontSeriesChangeRule {lc}{x}{lx}{}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\DeclareFontSeriesChangeRule {lx}{b}{bx}{}
-\DeclareFontSeriesChangeRule {lx}{c}{lc}{}
-\DeclareFontSeriesChangeRule {lx}{eb}{ebx}{}
-\DeclareFontSeriesChangeRule {lx}{ec}{lec}{}
-\DeclareFontSeriesChangeRule {lx}{el}{elx}{}
-\DeclareFontSeriesChangeRule {lx}{l}{lx}{}
-\DeclareFontSeriesChangeRule {lx}{sb}{sbx}{}
-\DeclareFontSeriesChangeRule {lx}{sc}{lsc}{}
-\DeclareFontSeriesChangeRule {lx}{sl}{slx}{}
-\DeclareFontSeriesChangeRule {lx}{ub}{ubx}{}
-\DeclareFontSeriesChangeRule {lx}{ul}{ulx}{}
-\DeclareFontSeriesChangeRule {lx}{x}{lx}{}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\DeclareFontSeriesChangeRule {l}{bx} {bx} {b} %<-----
-\DeclareFontSeriesChangeRule {l}{b} {b} {bx} %<-----
-\DeclareFontSeriesChangeRule {l}{c} {lc} {l} % ? %<-----
-\DeclareFontSeriesChangeRule {l}{ec} {lec} {l} % ? %<-----
-\DeclareFontSeriesChangeRule {l}{sb} {sb} {b} % ? %<-----
-\DeclareFontSeriesChangeRule {l}{sc} {lsc} {l} % ? %<-----
-\DeclareFontSeriesChangeRule {l}{x} {lx} {l} % ? %<-----
-% \end{macrocode}
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {slc}{ul} {ulc} {}
+\DeclareFontSeriesChangeRule {slc}{el} {elc} {}
+\DeclareFontSeriesChangeRule {slc}{l} {lc} {}
+\DeclareFontSeriesChangeRule {slc}{sl} {slc} {}
+\DeclareFontSeriesChangeRule {slc}{sb} {sbc} {bc}
+\DeclareFontSeriesChangeRule {slc}{b} {bc} {}
+\DeclareFontSeriesChangeRule {slc}{eb} {ebc} {bc}
+\DeclareFontSeriesChangeRule {slc}{ub} {ubc} {bc}
+\DeclareFontSeriesChangeRule {slc}{uc} {sluc} {}
+\DeclareFontSeriesChangeRule {slc}{ec} {slec} {}
+\DeclareFontSeriesChangeRule {slc}{c} {slc} {}
+\DeclareFontSeriesChangeRule {slc}{sc} {slsc} {}
+\DeclareFontSeriesChangeRule {slc}{sx} {slsx} {}
+\DeclareFontSeriesChangeRule {slc}{x} {slx} {}
+\DeclareFontSeriesChangeRule {slc}{ex} {slex} {}
+\DeclareFontSeriesChangeRule {slc}{ux} {slux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {slsc}{ul} {ulsc} {}
+\DeclareFontSeriesChangeRule {slsc}{el} {elsc} {}
+\DeclareFontSeriesChangeRule {slsc}{l} {lsc} {}
+\DeclareFontSeriesChangeRule {slsc}{sl} {slsc} {}
+\DeclareFontSeriesChangeRule {slsc}{sb} {sbsc} {bsc}
+\DeclareFontSeriesChangeRule {slsc}{b} {bsc} {}
+\DeclareFontSeriesChangeRule {slsc}{eb} {ebsc} {bsc}
+\DeclareFontSeriesChangeRule {slsc}{ub} {ubsc} {bsc}
+\DeclareFontSeriesChangeRule {slsc}{uc} {sluc} {}
+\DeclareFontSeriesChangeRule {slsc}{ec} {slec} {}
+\DeclareFontSeriesChangeRule {slsc}{c} {slc} {}
+\DeclareFontSeriesChangeRule {slsc}{sc} {slsc} {}
+\DeclareFontSeriesChangeRule {slsc}{sx} {slsx} {}
+\DeclareFontSeriesChangeRule {slsc}{x} {slx} {}
+\DeclareFontSeriesChangeRule {slsc}{ex} {slex} {}
+\DeclareFontSeriesChangeRule {slsc}{ux} {slux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {sl}{uc} {sluc} {}
+\DeclareFontSeriesChangeRule {sl}{ec} {slec} {}
+\DeclareFontSeriesChangeRule {sl}{c} {slc} {}
+\DeclareFontSeriesChangeRule {sl}{sc} {slsc} {}
+\DeclareFontSeriesChangeRule {sl}{sx} {slsx} {}
+\DeclareFontSeriesChangeRule {sl}{x} {slx} {}
+\DeclareFontSeriesChangeRule {sl}{ex} {slex} {}
+\DeclareFontSeriesChangeRule {sl}{ux} {slux} {}
+\DeclareFontSeriesChangeRule {sl}{sb} {sb} {b}
+\DeclareFontSeriesChangeRule {sl}{eb} {eb} {b}
+\DeclareFontSeriesChangeRule {sl}{ub} {ub} {b}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {slsx}{ul} {ulsx} {}
+\DeclareFontSeriesChangeRule {slsx}{el} {elsx} {}
+\DeclareFontSeriesChangeRule {slsx}{l} {lsx} {}
+\DeclareFontSeriesChangeRule {slsx}{sl} {slsx} {}
+\DeclareFontSeriesChangeRule {slsx}{sb} {sbsx} {bsx}
+\DeclareFontSeriesChangeRule {slsx}{b} {bsx} {}
+\DeclareFontSeriesChangeRule {slsx}{eb} {ebsx} {bsx}
+\DeclareFontSeriesChangeRule {slsx}{ub} {ubsx} {bsx}
+\DeclareFontSeriesChangeRule {slsx}{uc} {sluc} {}
+\DeclareFontSeriesChangeRule {slsx}{ec} {slec} {}
+\DeclareFontSeriesChangeRule {slsx}{c} {slc} {}
+\DeclareFontSeriesChangeRule {slsx}{sc} {slsc} {}
+\DeclareFontSeriesChangeRule {slsx}{sx} {slsx} {}
+\DeclareFontSeriesChangeRule {slsx}{x} {slx} {}
+\DeclareFontSeriesChangeRule {slsx}{ex} {slex} {}
+\DeclareFontSeriesChangeRule {slsx}{ux} {slux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {slx}{ul} {ulx} {}
+\DeclareFontSeriesChangeRule {slx}{el} {elx} {}
+\DeclareFontSeriesChangeRule {slx}{l} {lx} {}
+\DeclareFontSeriesChangeRule {slx}{sl} {slx} {}
+\DeclareFontSeriesChangeRule {slx}{sb} {sbx} {bx}
+\DeclareFontSeriesChangeRule {slx}{b} {bx} {}
+\DeclareFontSeriesChangeRule {slx}{eb} {ebx} {bx}
+\DeclareFontSeriesChangeRule {slx}{ub} {ubx} {bx}
+\DeclareFontSeriesChangeRule {slx}{uc} {sluc} {}
+\DeclareFontSeriesChangeRule {slx}{ec} {slec} {}
+\DeclareFontSeriesChangeRule {slx}{c} {slc} {}
+\DeclareFontSeriesChangeRule {slx}{sc} {slsc} {}
+\DeclareFontSeriesChangeRule {slx}{sx} {slsx} {}
+\DeclareFontSeriesChangeRule {slx}{x} {slx} {}
+\DeclareFontSeriesChangeRule {slx}{ex} {slex} {}
+\DeclareFontSeriesChangeRule {slx}{ux} {slux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {slex}{ul} {ulex} {}
+\DeclareFontSeriesChangeRule {slex}{el} {elex} {}
+\DeclareFontSeriesChangeRule {slex}{l} {lex} {}
+\DeclareFontSeriesChangeRule {slex}{sl} {slex} {}
+\DeclareFontSeriesChangeRule {slex}{sb} {sbex} {bex}
+\DeclareFontSeriesChangeRule {slex}{b} {bex} {}
+\DeclareFontSeriesChangeRule {slex}{eb} {ebex} {bex}
+\DeclareFontSeriesChangeRule {slex}{ub} {ubex} {bex}
+\DeclareFontSeriesChangeRule {slex}{uc} {sluc} {}
+\DeclareFontSeriesChangeRule {slex}{ec} {slec} {}
+\DeclareFontSeriesChangeRule {slex}{c} {slc} {}
+\DeclareFontSeriesChangeRule {slex}{sc} {slsc} {}
+\DeclareFontSeriesChangeRule {slex}{sx} {slsx} {}
+\DeclareFontSeriesChangeRule {slex}{x} {slx} {}
+\DeclareFontSeriesChangeRule {slex}{ex} {slex} {}
+\DeclareFontSeriesChangeRule {slex}{ux} {slux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {slux}{ul} {ulux} {}
+\DeclareFontSeriesChangeRule {slux}{el} {elux} {}
+\DeclareFontSeriesChangeRule {slux}{l} {lux} {}
+\DeclareFontSeriesChangeRule {slux}{sl} {slux} {}
+\DeclareFontSeriesChangeRule {slux}{sb} {sbux} {bux}
+\DeclareFontSeriesChangeRule {slux}{b} {bux} {}
+\DeclareFontSeriesChangeRule {slux}{eb} {ebux} {bux}
+\DeclareFontSeriesChangeRule {slux}{ub} {ubux} {bux}
+\DeclareFontSeriesChangeRule {slux}{uc} {sluc} {}
+\DeclareFontSeriesChangeRule {slux}{ec} {slec} {}
+\DeclareFontSeriesChangeRule {slux}{c} {slc} {}
+\DeclareFontSeriesChangeRule {slux}{sc} {slsc} {}
+\DeclareFontSeriesChangeRule {slux}{sx} {slsx} {}
+\DeclareFontSeriesChangeRule {slux}{x} {slx} {}
+\DeclareFontSeriesChangeRule {slux}{ex} {slex} {}
+\DeclareFontSeriesChangeRule {slux}{ux} {slux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {uc}{ul} {uluc} {}
+\DeclareFontSeriesChangeRule {uc}{el} {eluc} {}
+\DeclareFontSeriesChangeRule {uc}{l} {luc} {}
+\DeclareFontSeriesChangeRule {uc}{sl} {sluc} {}
+\DeclareFontSeriesChangeRule {uc}{sb} {sbuc} {buc}
+\DeclareFontSeriesChangeRule {uc}{b} {buc} {}
+\DeclareFontSeriesChangeRule {uc}{eb} {ebuc} {buc}
+\DeclareFontSeriesChangeRule {uc}{ub} {ubuc} {buc}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {ec}{ul} {ulec} {}
+\DeclareFontSeriesChangeRule {ec}{el} {elec} {}
+\DeclareFontSeriesChangeRule {ec}{l} {lec} {}
+\DeclareFontSeriesChangeRule {ec}{sl} {slec} {}
+\DeclareFontSeriesChangeRule {ec}{sb} {sbec} {bec}
+\DeclareFontSeriesChangeRule {ec}{b} {bec} {}
+\DeclareFontSeriesChangeRule {ec}{eb} {ebec} {bec}
+\DeclareFontSeriesChangeRule {ec}{ub} {ubec} {bec}
+% \end{macrocode}
+%
+% There are a number of font families that implement condensed
+% series, but often only \texttt{c} and \texttt{bc}. Therefore, if
+% we see a weight or width change request that can't be fulfilled
+% we try to stay with \texttt{c} or \texttt{bc}.
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {c}{ul} {ulc} {c}
+\DeclareFontSeriesChangeRule {c}{el} {elc} {c}
+\DeclareFontSeriesChangeRule {c}{l} {lc} {c}
+\DeclareFontSeriesChangeRule {c}{sl} {slc} {c}
+\DeclareFontSeriesChangeRule {c}{sb} {sbc} {bc}
+\DeclareFontSeriesChangeRule {c}{b} {bc} {}
+\DeclareFontSeriesChangeRule {c}{eb} {ebc} {bc}
+\DeclareFontSeriesChangeRule {c}{ub} {ubc} {bc}
+\DeclareFontSeriesChangeRule {c}{uc} {uc} {c}
+\DeclareFontSeriesChangeRule {c}{ec} {ec} {c}
+\DeclareFontSeriesChangeRule {c}{sc} {sc} {c}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {sc}{ul} {ulsc} {}
+\DeclareFontSeriesChangeRule {sc}{el} {elsc} {}
+\DeclareFontSeriesChangeRule {sc}{l} {lsc} {}
+\DeclareFontSeriesChangeRule {sc}{sl} {slsc} {}
+\DeclareFontSeriesChangeRule {sc}{sb} {sbsc} {bsc}
+\DeclareFontSeriesChangeRule {sc}{b} {bsc} {}
+\DeclareFontSeriesChangeRule {sc}{eb} {ebsc} {bsc}
+\DeclareFontSeriesChangeRule {sc}{ub} {ubsc} {bsc}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {m}{sb} {sb} {b}
+\DeclareFontSeriesChangeRule {m}{eb} {eb} {b}
+\DeclareFontSeriesChangeRule {m}{ub} {ub} {b}
+% \end{macrocode}
+%
+% This special rule normally does nothing since nearly every font
+% implements the \texttt{b} bold series. The exception are Computer
+% Modern and Latin Modern and fonts based on them. They usually
+% only have \texttt{bx}, but then they normally provide an
+% \texttt{.fd} file declaration mapping from \texttt{b} to
+% \texttt{bx} and thus pretend that \texttt{b} exists. But in case
+% any of them does not, we offer an alternative result and switch
+% to \texttt{bx} if \texttt{b} can't be found.
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {m}{b} {b} {bx}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {sx}{ul} {ulsx} {}
+\DeclareFontSeriesChangeRule {sx}{el} {elsx} {}
+\DeclareFontSeriesChangeRule {sx}{l} {lsx} {}
+\DeclareFontSeriesChangeRule {sx}{sl} {slsx} {}
+\DeclareFontSeriesChangeRule {sx}{sb} {sbsx} {bsx}
+\DeclareFontSeriesChangeRule {sx}{b} {bsx} {}
+\DeclareFontSeriesChangeRule {sx}{eb} {ebsx} {bsx}
+\DeclareFontSeriesChangeRule {sx}{ub} {ubsx} {bsx}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {x}{ul} {ulx} {}
+\DeclareFontSeriesChangeRule {x}{el} {elx} {}
+\DeclareFontSeriesChangeRule {x}{l} {lx} {}
+\DeclareFontSeriesChangeRule {x}{sl} {slx} {}
+\DeclareFontSeriesChangeRule {x}{sb} {sbx} {bx}
+\DeclareFontSeriesChangeRule {x}{b} {bx} {}
+\DeclareFontSeriesChangeRule {x}{eb} {ebx} {bx}
+\DeclareFontSeriesChangeRule {x}{ub} {ubx} {bx}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {ex}{ul} {ulex} {}
+\DeclareFontSeriesChangeRule {ex}{el} {elex} {}
+\DeclareFontSeriesChangeRule {ex}{l} {lex} {}
+\DeclareFontSeriesChangeRule {ex}{sl} {slex} {}
+\DeclareFontSeriesChangeRule {ex}{sb} {sbex} {bex}
+\DeclareFontSeriesChangeRule {ex}{b} {bex} {}
+\DeclareFontSeriesChangeRule {ex}{eb} {ebex} {bex}
+\DeclareFontSeriesChangeRule {ex}{ub} {ubex} {bex}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {ux}{ul} {ulux} {}
+\DeclareFontSeriesChangeRule {ux}{el} {elux} {}
+\DeclareFontSeriesChangeRule {ux}{l} {lux} {}
+\DeclareFontSeriesChangeRule {ux}{sl} {slux} {}
+\DeclareFontSeriesChangeRule {ux}{sb} {sbux} {bux}
+\DeclareFontSeriesChangeRule {ux}{b} {bux} {}
+\DeclareFontSeriesChangeRule {ux}{eb} {ebux} {bux}
+\DeclareFontSeriesChangeRule {ux}{ub} {ubux} {bux}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {sbuc}{ul} {uluc} {}
+\DeclareFontSeriesChangeRule {sbuc}{el} {eluc} {}
+\DeclareFontSeriesChangeRule {sbuc}{l} {luc} {}
+\DeclareFontSeriesChangeRule {sbuc}{sl} {sluc} {}
+\DeclareFontSeriesChangeRule {sbuc}{sb} {sbuc} {}
+\DeclareFontSeriesChangeRule {sbuc}{b} {buc} {}
+\DeclareFontSeriesChangeRule {sbuc}{eb} {ebuc} {buc}
+\DeclareFontSeriesChangeRule {sbuc}{ub} {ubuc} {buc}
+\DeclareFontSeriesChangeRule {sbuc}{uc} {sbuc} {}
+\DeclareFontSeriesChangeRule {sbuc}{ec} {sbec} {}
+\DeclareFontSeriesChangeRule {sbuc}{c} {sbc} {}
+\DeclareFontSeriesChangeRule {sbuc}{sc} {sbsc} {}
+\DeclareFontSeriesChangeRule {sbuc}{sx} {sbsx} {}
+\DeclareFontSeriesChangeRule {sbuc}{x} {sbx} {}
+\DeclareFontSeriesChangeRule {sbuc}{ex} {sbex} {}
+\DeclareFontSeriesChangeRule {sbuc}{ux} {sbux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {sbec}{ul} {ulec} {}
+\DeclareFontSeriesChangeRule {sbec}{el} {elec} {}
+\DeclareFontSeriesChangeRule {sbec}{l} {lec} {}
+\DeclareFontSeriesChangeRule {sbec}{sl} {slec} {}
+\DeclareFontSeriesChangeRule {sbec}{sb} {sbec} {}
+\DeclareFontSeriesChangeRule {sbec}{b} {bec} {}
+\DeclareFontSeriesChangeRule {sbec}{eb} {ebec} {bec}
+\DeclareFontSeriesChangeRule {sbec}{ub} {ubec} {bec}
+\DeclareFontSeriesChangeRule {sbec}{uc} {sbuc} {}
+\DeclareFontSeriesChangeRule {sbec}{ec} {sbec} {}
+\DeclareFontSeriesChangeRule {sbec}{c} {sbc} {}
+\DeclareFontSeriesChangeRule {sbec}{sc} {sbsc} {}
+\DeclareFontSeriesChangeRule {sbec}{sx} {sbsx} {}
+\DeclareFontSeriesChangeRule {sbec}{x} {sbx} {}
+\DeclareFontSeriesChangeRule {sbec}{ex} {sbex} {}
+\DeclareFontSeriesChangeRule {sbec}{ux} {sbux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {sbc}{ul} {ulc} {}
+\DeclareFontSeriesChangeRule {sbc}{el} {elc} {}
+\DeclareFontSeriesChangeRule {sbc}{l} {lc} {}
+\DeclareFontSeriesChangeRule {sbc}{sl} {slc} {}
+\DeclareFontSeriesChangeRule {sbc}{sb} {sbc} {}
+\DeclareFontSeriesChangeRule {sbc}{b} {bc} {}
+\DeclareFontSeriesChangeRule {sbc}{eb} {ebc} {bc}
+\DeclareFontSeriesChangeRule {sbc}{ub} {ubc} {bc}
+\DeclareFontSeriesChangeRule {sbc}{uc} {sbuc} {}
+\DeclareFontSeriesChangeRule {sbc}{ec} {sbec} {}
+\DeclareFontSeriesChangeRule {sbc}{c} {sbc} {}
+\DeclareFontSeriesChangeRule {sbc}{sc} {sbsc} {}
+\DeclareFontSeriesChangeRule {sbc}{sx} {sbsx} {}
+\DeclareFontSeriesChangeRule {sbc}{x} {sbx} {}
+\DeclareFontSeriesChangeRule {sbc}{ex} {sbex} {}
+\DeclareFontSeriesChangeRule {sbc}{ux} {sbux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {sbsc}{ul} {ulsc} {}
+\DeclareFontSeriesChangeRule {sbsc}{el} {elsc} {}
+\DeclareFontSeriesChangeRule {sbsc}{l} {lsc} {}
+\DeclareFontSeriesChangeRule {sbsc}{sl} {slsc} {}
+\DeclareFontSeriesChangeRule {sbsc}{sb} {sbsc} {}
+\DeclareFontSeriesChangeRule {sbsc}{b} {bsc} {}
+\DeclareFontSeriesChangeRule {sbsc}{eb} {ebsc} {bsc}
+\DeclareFontSeriesChangeRule {sbsc}{ub} {ubsc} {bsc}
+\DeclareFontSeriesChangeRule {sbsc}{uc} {sbuc} {}
+\DeclareFontSeriesChangeRule {sbsc}{ec} {sbec} {}
+\DeclareFontSeriesChangeRule {sbsc}{c} {sbc} {}
+\DeclareFontSeriesChangeRule {sbsc}{sc} {sbsc} {}
+\DeclareFontSeriesChangeRule {sbsc}{sx} {sbsx} {}
+\DeclareFontSeriesChangeRule {sbsc}{x} {sbx} {}
+\DeclareFontSeriesChangeRule {sbsc}{ex} {sbex} {}
+\DeclareFontSeriesChangeRule {sbsc}{ux} {sbux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {sb}{uc} {sbuc} {}
+\DeclareFontSeriesChangeRule {sb}{ec} {sbec} {}
+\DeclareFontSeriesChangeRule {sb}{c} {sbc} {}
+\DeclareFontSeriesChangeRule {sb}{sc} {sbsc} {}
+\DeclareFontSeriesChangeRule {sb}{sx} {sbsx} {}
+\DeclareFontSeriesChangeRule {sb}{x} {sbx} {}
+\DeclareFontSeriesChangeRule {sb}{ex} {sbex} {}
+\DeclareFontSeriesChangeRule {sb}{ux} {sbux} {}
+\DeclareFontSeriesChangeRule {sb}{eb} {eb} {b}
+\DeclareFontSeriesChangeRule {sb}{ub} {ub} {b}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {sbsx}{ul} {ulsx} {}
+\DeclareFontSeriesChangeRule {sbsx}{el} {elsx} {}
+\DeclareFontSeriesChangeRule {sbsx}{l} {lsx} {}
+\DeclareFontSeriesChangeRule {sbsx}{sl} {slsx} {}
+\DeclareFontSeriesChangeRule {sbsx}{sb} {sbsx} {}
+\DeclareFontSeriesChangeRule {sbsx}{b} {bsx} {}
+\DeclareFontSeriesChangeRule {sbsx}{eb} {ebsx} {bsx}
+\DeclareFontSeriesChangeRule {sbsx}{ub} {ubsx} {bsx}
+\DeclareFontSeriesChangeRule {sbsx}{uc} {sbuc} {}
+\DeclareFontSeriesChangeRule {sbsx}{ec} {sbec} {}
+\DeclareFontSeriesChangeRule {sbsx}{c} {sbc} {}
+\DeclareFontSeriesChangeRule {sbsx}{sc} {sbsc} {}
+\DeclareFontSeriesChangeRule {sbsx}{sx} {sbsx} {}
+\DeclareFontSeriesChangeRule {sbsx}{x} {sbx} {}
+\DeclareFontSeriesChangeRule {sbsx}{ex} {sbex} {}
+\DeclareFontSeriesChangeRule {sbsx}{ux} {sbux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {sbx}{ul} {ulx} {}
+\DeclareFontSeriesChangeRule {sbx}{el} {elx} {}
+\DeclareFontSeriesChangeRule {sbx}{l} {lx} {}
+\DeclareFontSeriesChangeRule {sbx}{sl} {slx} {}
+\DeclareFontSeriesChangeRule {sbx}{sb} {sbx} {}
+\DeclareFontSeriesChangeRule {sbx}{b} {bx} {}
+\DeclareFontSeriesChangeRule {sbx}{eb} {ebx} {bx}
+\DeclareFontSeriesChangeRule {sbx}{ub} {ubx} {bx}
+\DeclareFontSeriesChangeRule {sbx}{uc} {sbuc} {}
+\DeclareFontSeriesChangeRule {sbx}{ec} {sbec} {}
+\DeclareFontSeriesChangeRule {sbx}{c} {sbc} {}
+\DeclareFontSeriesChangeRule {sbx}{sc} {sbsc} {}
+\DeclareFontSeriesChangeRule {sbx}{sx} {sbsx} {}
+\DeclareFontSeriesChangeRule {sbx}{x} {sbx} {}
+\DeclareFontSeriesChangeRule {sbx}{ex} {sbex} {}
+\DeclareFontSeriesChangeRule {sbx}{ux} {sbux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {sbex}{ul} {ulex} {}
+\DeclareFontSeriesChangeRule {sbex}{el} {elex} {}
+\DeclareFontSeriesChangeRule {sbex}{l} {lex} {}
+\DeclareFontSeriesChangeRule {sbex}{sl} {slex} {}
+\DeclareFontSeriesChangeRule {sbex}{sb} {sbex} {}
+\DeclareFontSeriesChangeRule {sbex}{b} {bex} {}
+\DeclareFontSeriesChangeRule {sbex}{eb} {ebex} {bex}
+\DeclareFontSeriesChangeRule {sbex}{ub} {ubex} {bex}
+\DeclareFontSeriesChangeRule {sbex}{uc} {sbuc} {}
+\DeclareFontSeriesChangeRule {sbex}{ec} {sbec} {}
+\DeclareFontSeriesChangeRule {sbex}{c} {sbc} {}
+\DeclareFontSeriesChangeRule {sbex}{sc} {sbsc} {}
+\DeclareFontSeriesChangeRule {sbex}{sx} {sbsx} {}
+\DeclareFontSeriesChangeRule {sbex}{x} {sbx} {}
+\DeclareFontSeriesChangeRule {sbex}{ex} {sbex} {}
+\DeclareFontSeriesChangeRule {sbex}{ux} {sbux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {sbux}{ul} {ulux} {}
+\DeclareFontSeriesChangeRule {sbux}{el} {elux} {}
+\DeclareFontSeriesChangeRule {sbux}{l} {lux} {}
+\DeclareFontSeriesChangeRule {sbux}{sl} {slux} {}
+\DeclareFontSeriesChangeRule {sbux}{sb} {sbux} {}
+\DeclareFontSeriesChangeRule {sbux}{b} {bux} {}
+\DeclareFontSeriesChangeRule {sbux}{eb} {ebux} {bux}
+\DeclareFontSeriesChangeRule {sbux}{ub} {ubux} {bux}
+\DeclareFontSeriesChangeRule {sbux}{uc} {sbuc} {}
+\DeclareFontSeriesChangeRule {sbux}{ec} {sbec} {}
+\DeclareFontSeriesChangeRule {sbux}{c} {sbc} {}
+\DeclareFontSeriesChangeRule {sbux}{sc} {sbsc} {}
+\DeclareFontSeriesChangeRule {sbux}{sx} {sbsx} {}
+\DeclareFontSeriesChangeRule {sbux}{x} {sbx} {}
+\DeclareFontSeriesChangeRule {sbux}{ex} {sbex} {}
+\DeclareFontSeriesChangeRule {sbux}{ux} {sbux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {buc}{ul} {uluc} {}
+\DeclareFontSeriesChangeRule {buc}{el} {eluc} {}
+\DeclareFontSeriesChangeRule {buc}{l} {luc} {}
+\DeclareFontSeriesChangeRule {buc}{sl} {sluc} {}
+\DeclareFontSeriesChangeRule {buc}{sb} {sbuc} {buc}
+\DeclareFontSeriesChangeRule {buc}{b} {buc} {}
+\DeclareFontSeriesChangeRule {buc}{eb} {ebuc} {buc}
+\DeclareFontSeriesChangeRule {buc}{ub} {ubuc} {buc}
+\DeclareFontSeriesChangeRule {buc}{uc} {buc} {}
+\DeclareFontSeriesChangeRule {buc}{ec} {bec} {}
+\DeclareFontSeriesChangeRule {buc}{c} {bc} {}
+\DeclareFontSeriesChangeRule {buc}{sc} {bsc} {}
+\DeclareFontSeriesChangeRule {buc}{sx} {bsx} {}
+\DeclareFontSeriesChangeRule {buc}{x} {bx} {}
+\DeclareFontSeriesChangeRule {buc}{ex} {bex} {}
+\DeclareFontSeriesChangeRule {buc}{ux} {bux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {bec}{ul} {ulec} {}
+\DeclareFontSeriesChangeRule {bec}{el} {elec} {}
+\DeclareFontSeriesChangeRule {bec}{l} {lec} {}
+\DeclareFontSeriesChangeRule {bec}{sl} {slec} {}
+\DeclareFontSeriesChangeRule {bec}{sb} {sbec} {bec}
+\DeclareFontSeriesChangeRule {bec}{b} {bec} {}
+\DeclareFontSeriesChangeRule {bec}{eb} {ebec} {bec}
+\DeclareFontSeriesChangeRule {bec}{ub} {ubec} {bec}
+\DeclareFontSeriesChangeRule {bec}{uc} {buc} {}
+\DeclareFontSeriesChangeRule {bec}{ec} {bec} {}
+\DeclareFontSeriesChangeRule {bec}{c} {bc} {}
+\DeclareFontSeriesChangeRule {bec}{sc} {bsc} {}
+\DeclareFontSeriesChangeRule {bec}{sx} {bsx} {}
+\DeclareFontSeriesChangeRule {bec}{x} {bx} {}
+\DeclareFontSeriesChangeRule {bec}{ex} {bex} {}
+\DeclareFontSeriesChangeRule {bec}{ux} {bux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {bc}{ul} {ulc} {}
+\DeclareFontSeriesChangeRule {bc}{el} {elc} {}
+\DeclareFontSeriesChangeRule {bc}{l} {lc} {}
+\DeclareFontSeriesChangeRule {bc}{sl} {slc} {}
+\DeclareFontSeriesChangeRule {bc}{sb} {sbc} {bc}
+\DeclareFontSeriesChangeRule {bc}{b} {bc} {}
+\DeclareFontSeriesChangeRule {bc}{eb} {ebc} {bc}
+\DeclareFontSeriesChangeRule {bc}{ub} {ubc} {bc}
+\DeclareFontSeriesChangeRule {bc}{uc} {buc} {}
+\DeclareFontSeriesChangeRule {bc}{ec} {bec} {}
+\DeclareFontSeriesChangeRule {bc}{c} {bc} {}
+\DeclareFontSeriesChangeRule {bc}{sc} {bsc} {}
+\DeclareFontSeriesChangeRule {bc}{sx} {bsx} {}
+\DeclareFontSeriesChangeRule {bc}{x} {bx} {}
+\DeclareFontSeriesChangeRule {bc}{ex} {bex} {}
+\DeclareFontSeriesChangeRule {bc}{ux} {bux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {bsc}{ul} {ulsc} {}
+\DeclareFontSeriesChangeRule {bsc}{el} {elsc} {}
+\DeclareFontSeriesChangeRule {bsc}{l} {lsc} {}
+\DeclareFontSeriesChangeRule {bsc}{sl} {slsc} {}
+\DeclareFontSeriesChangeRule {bsc}{sb} {sbsc} {bsc}
+\DeclareFontSeriesChangeRule {bsc}{b} {bsc} {}
+\DeclareFontSeriesChangeRule {bsc}{eb} {ebsc} {bsc}
+\DeclareFontSeriesChangeRule {bsc}{ub} {ubsc} {bsc}
+\DeclareFontSeriesChangeRule {bsc}{uc} {buc} {}
+\DeclareFontSeriesChangeRule {bsc}{ec} {bec} {}
+\DeclareFontSeriesChangeRule {bsc}{c} {bc} {}
+\DeclareFontSeriesChangeRule {bsc}{sc} {bsc} {}
+\DeclareFontSeriesChangeRule {bsc}{sx} {bsx} {}
+\DeclareFontSeriesChangeRule {bsc}{x} {bx} {}
+\DeclareFontSeriesChangeRule {bsc}{ex} {bex} {}
+\DeclareFontSeriesChangeRule {bsc}{ux} {bux} {}
+% \end{macrocode}
+%
+% If we are in \texttt{b} and a width change is requested that
+% leads to a missing font face we stay in \texttt{b} because then the
+% font family probably doesn't implement width changes at all.
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {b}{uc} {buc} {b}
+\DeclareFontSeriesChangeRule {b}{ec} {bec} {b}
+\DeclareFontSeriesChangeRule {b}{c} {bc} {b}
+\DeclareFontSeriesChangeRule {b}{sc} {bsc} {b}
+\DeclareFontSeriesChangeRule {b}{sx} {bsx} {b}
+\DeclareFontSeriesChangeRule {b}{x} {bx} {b}
+\DeclareFontSeriesChangeRule {b}{ex} {bex} {b}
+\DeclareFontSeriesChangeRule {b}{ux} {bux} {b}
+\DeclareFontSeriesChangeRule {b}{sb} {sb} {b}
+\DeclareFontSeriesChangeRule {b}{eb} {eb} {b}
+\DeclareFontSeriesChangeRule {b}{ub} {ub} {b}
+% \end{macrocode}
%
% \begin{macrocode}
-\DeclareFontSeriesChangeRule {m}{bx} {bx} {b} %<-----
-\DeclareFontSeriesChangeRule {m}{b} {b} {bx} %<-----
-\DeclareFontSeriesChangeRule {m}{c} {c} {m} %<-----
-\DeclareFontSeriesChangeRule {m}{ec} {ec} {m} %<-----
-\DeclareFontSeriesChangeRule {m}{l} {l} {m} %<-----
-\DeclareFontSeriesChangeRule {m}{sb} {sb} {b} %<-----
-\DeclareFontSeriesChangeRule {m}{sc} {sc} {m} %<-----
-\DeclareFontSeriesChangeRule {m}{x} {x} {m} %<-----
-% \end{macrocode}
-%
-% \begin{macrocode}
-\DeclareFontSeriesChangeRule {sbc}{b}{bc}{}
-\DeclareFontSeriesChangeRule {sbc}{c}{sbc}{}
-\DeclareFontSeriesChangeRule {sbc}{eb}{ebc}{}
-\DeclareFontSeriesChangeRule {sbc}{ec}{sbec}{sbc}
-\DeclareFontSeriesChangeRule {sbc}{el}{elc}{}
-\DeclareFontSeriesChangeRule {sbc}{l}{lc}{}
-\DeclareFontSeriesChangeRule {sbc}{sb}{sbc}{}
-\DeclareFontSeriesChangeRule {sbc}{sc}{sbsc}{sbc}
-\DeclareFontSeriesChangeRule {sbc}{sl}{slc}{}
-\DeclareFontSeriesChangeRule {sbc}{ub}{ubc}{}
-\DeclareFontSeriesChangeRule {sbc}{ul}{ulc}{}
-\DeclareFontSeriesChangeRule {sbc}{x}{sbx}{}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\DeclareFontSeriesChangeRule {sbx}{b}{bx}{}
-\DeclareFontSeriesChangeRule {sbx}{c}{sbc}{}
-\DeclareFontSeriesChangeRule {sbx}{eb}{ebx}{}
-\DeclareFontSeriesChangeRule {sbx}{ec}{sbec}{}
-\DeclareFontSeriesChangeRule {sbx}{el}{elx}{}
-\DeclareFontSeriesChangeRule {sbx}{l}{lx}{}
-\DeclareFontSeriesChangeRule {sbx}{sb}{sbx}{}
-\DeclareFontSeriesChangeRule {sbx}{sc}{sbsc}{}
-\DeclareFontSeriesChangeRule {sbx}{sl}{slx}{}
-\DeclareFontSeriesChangeRule {sbx}{ub}{ubx}{}
-\DeclareFontSeriesChangeRule {sbx}{ul}{ulx}{}
-\DeclareFontSeriesChangeRule {sbx}{x}{sbx}{}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\DeclareFontSeriesChangeRule {sb}{c} {sbc} {bc} %? %<-----
-\DeclareFontSeriesChangeRule {sb}{ec} {sbec} {sbc} %? %<-----
-\DeclareFontSeriesChangeRule {sb}{sc} {sbsc} {sbc} %? %<-----
-\DeclareFontSeriesChangeRule {sb}{x} {sbx} {bx} %? %<-----
-% \end{macrocode}
-%
-% \begin{macrocode}
-\DeclareFontSeriesChangeRule {slc}{b}{bc}{}
-\DeclareFontSeriesChangeRule {slc}{c}{slc}{}
-\DeclareFontSeriesChangeRule {slc}{eb}{ebc}{}
-\DeclareFontSeriesChangeRule {slc}{ec}{slec}{}
-\DeclareFontSeriesChangeRule {slc}{el}{elc}{}
-\DeclareFontSeriesChangeRule {slc}{l}{lc}{}
-\DeclareFontSeriesChangeRule {slc}{sb}{sbc}{}
-\DeclareFontSeriesChangeRule {slc}{sc}{slsc}{}
-\DeclareFontSeriesChangeRule {slc}{sl}{slc}{}
-\DeclareFontSeriesChangeRule {slc}{ub}{ubc}{}
-\DeclareFontSeriesChangeRule {slc}{ul}{ulc}{}
-\DeclareFontSeriesChangeRule {slc}{x}{slx}{}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\DeclareFontSeriesChangeRule {slx}{b}{bx}{}
-\DeclareFontSeriesChangeRule {slx}{c}{slc}{}
-\DeclareFontSeriesChangeRule {slx}{eb}{ebx}{}
-\DeclareFontSeriesChangeRule {slx}{ec}{slec}{}
-\DeclareFontSeriesChangeRule {slx}{el}{elx}{}
-\DeclareFontSeriesChangeRule {slx}{l}{lx}{}
-\DeclareFontSeriesChangeRule {slx}{sb}{sbx}{}
-\DeclareFontSeriesChangeRule {slx}{sc}{slsc}{}
-\DeclareFontSeriesChangeRule {slx}{sl}{slx}{}
-\DeclareFontSeriesChangeRule {slx}{ub}{ubx}{}
-\DeclareFontSeriesChangeRule {slx}{ul}{ulx}{}
-\DeclareFontSeriesChangeRule {slx}{x}{slx}{}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\DeclareFontSeriesChangeRule {sl}{c}{slc}{}
-\DeclareFontSeriesChangeRule {sl}{ec}{slec}{}
-\DeclareFontSeriesChangeRule {sl}{sc}{slsc}{}
-\DeclareFontSeriesChangeRule {sl}{x}{slx}{}
+\DeclareFontSeriesChangeRule {bsx}{ul} {ulsx} {}
+\DeclareFontSeriesChangeRule {bsx}{el} {elsx} {}
+\DeclareFontSeriesChangeRule {bsx}{l} {lsx} {}
+\DeclareFontSeriesChangeRule {bsx}{sl} {slsx} {}
+\DeclareFontSeriesChangeRule {bsx}{sb} {sbsx} {bsx}
+\DeclareFontSeriesChangeRule {bsx}{b} {bsx} {}
+\DeclareFontSeriesChangeRule {bsx}{eb} {ebsx} {bsx}
+\DeclareFontSeriesChangeRule {bsx}{ub} {ubsx} {bsx}
+\DeclareFontSeriesChangeRule {bsx}{uc} {buc} {}
+\DeclareFontSeriesChangeRule {bsx}{ec} {bec} {}
+\DeclareFontSeriesChangeRule {bsx}{c} {bc} {}
+\DeclareFontSeriesChangeRule {bsx}{sc} {bsc} {}
+\DeclareFontSeriesChangeRule {bsx}{sx} {bsx} {}
+\DeclareFontSeriesChangeRule {bsx}{x} {bx} {}
+\DeclareFontSeriesChangeRule {bsx}{ex} {bex} {}
+\DeclareFontSeriesChangeRule {bsx}{ux} {bux} {}
% \end{macrocode}
%
% \begin{macrocode}
-\DeclareFontSeriesChangeRule {ubc}{b}{bc}{}
-\DeclareFontSeriesChangeRule {ubc}{c}{ubc}{}
-\DeclareFontSeriesChangeRule {ubc}{eb}{ebc}{}
-\DeclareFontSeriesChangeRule {ubc}{ec}{ubec}{}
-\DeclareFontSeriesChangeRule {ubc}{el}{elc}{}
-\DeclareFontSeriesChangeRule {ubc}{l}{lc}{}
-\DeclareFontSeriesChangeRule {ubc}{sb}{sbc}{}
-\DeclareFontSeriesChangeRule {ubc}{sc}{ubsc}{}
-\DeclareFontSeriesChangeRule {ubc}{sl}{slc}{}
-\DeclareFontSeriesChangeRule {ubc}{ub}{ubc}{}
-\DeclareFontSeriesChangeRule {ubc}{ul}{ulc}{}
-\DeclareFontSeriesChangeRule {ubc}{x}{ubx}{}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\DeclareFontSeriesChangeRule {ubx}{b}{bx}{}
-\DeclareFontSeriesChangeRule {ubx}{c}{ubc}{}
-\DeclareFontSeriesChangeRule {ubx}{eb}{ebx}{}
-\DeclareFontSeriesChangeRule {ubx}{ec}{ubec}{}
-\DeclareFontSeriesChangeRule {ubx}{el}{elx}{}
-\DeclareFontSeriesChangeRule {ubx}{l}{lx}{}
-\DeclareFontSeriesChangeRule {ubx}{sb}{sbx}{}
-\DeclareFontSeriesChangeRule {ubx}{sc}{ubsc}{}
-\DeclareFontSeriesChangeRule {ubx}{sl}{slx}{}
-\DeclareFontSeriesChangeRule {ubx}{ub}{ubx}{}
-\DeclareFontSeriesChangeRule {ubx}{ul}{ulx}{}
-\DeclareFontSeriesChangeRule {ubx}{x}{ubx}{}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\DeclareFontSeriesChangeRule {ub}{c}{ubc}{}
-\DeclareFontSeriesChangeRule {ub}{ec}{ubec}{}
-\DeclareFontSeriesChangeRule {ub}{sc}{ubsc}{}
-\DeclareFontSeriesChangeRule {ub}{x}{ubx}{}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\DeclareFontSeriesChangeRule {ulc}{b}{bc}{}
-\DeclareFontSeriesChangeRule {ulc}{c}{ulc}{}
-\DeclareFontSeriesChangeRule {ulc}{eb}{ebc}{}
-\DeclareFontSeriesChangeRule {ulc}{ec}{ulec}{ulc}
-\DeclareFontSeriesChangeRule {ulc}{el}{elc}{}
-\DeclareFontSeriesChangeRule {ulc}{l}{lc}{}
-\DeclareFontSeriesChangeRule {ulc}{sb}{sbc}{}
-\DeclareFontSeriesChangeRule {ulc}{sc}{ulsc}{ulc}
-\DeclareFontSeriesChangeRule {ulc}{sl}{slc}{}
-\DeclareFontSeriesChangeRule {ulc}{ub}{ubc}{}
-\DeclareFontSeriesChangeRule {ulc}{ul}{ulc}{}
-\DeclareFontSeriesChangeRule {ulc}{x}{ulx}{}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\DeclareFontSeriesChangeRule {ulx}{b}{bx}{}
-\DeclareFontSeriesChangeRule {ulx}{c}{ulc}{}
-\DeclareFontSeriesChangeRule {ulx}{eb}{ebx}{}
-\DeclareFontSeriesChangeRule {ulx}{ec}{ulec}{}
-\DeclareFontSeriesChangeRule {ulx}{el}{elx}{}
-\DeclareFontSeriesChangeRule {ulx}{l}{lx}{}
-\DeclareFontSeriesChangeRule {ulx}{sb}{sbx}{}
-\DeclareFontSeriesChangeRule {ulx}{sc}{ulsc}{}
-\DeclareFontSeriesChangeRule {ulx}{sl}{slx}{}
-\DeclareFontSeriesChangeRule {ulx}{ub}{ubx}{}
-\DeclareFontSeriesChangeRule {ulx}{ul}{ulx}{}
-\DeclareFontSeriesChangeRule {ulx}{x}{ulx}{}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\DeclareFontSeriesChangeRule {ul}{c}{ulc}{}
-\DeclareFontSeriesChangeRule {ul}{ec}{ulec}{}
-\DeclareFontSeriesChangeRule {ul}{sc}{ulsc}{}
-\DeclareFontSeriesChangeRule {ul}{x}{ulx}{}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\DeclareFontSeriesChangeRule {x}{b}{bx}{}
-\DeclareFontSeriesChangeRule {x}{c}{c}{}
-\DeclareFontSeriesChangeRule {x}{eb}{ebx}{}
-\DeclareFontSeriesChangeRule {x}{ec}{ec}{}
-\DeclareFontSeriesChangeRule {x}{el}{elx}{}
-\DeclareFontSeriesChangeRule {x}{l}{lx}{}
-\DeclareFontSeriesChangeRule {x}{sb}{sbx}{}
-\DeclareFontSeriesChangeRule {x}{sc}{sc}{}
-\DeclareFontSeriesChangeRule {x}{sl}{slx}{}
-\DeclareFontSeriesChangeRule {x}{ub}{ubx}{}
-\DeclareFontSeriesChangeRule {x}{ul}{ulx}{}
-% \end{macrocode}
-%
-%
-% Special rules for \texttt{lm} etc.\ aren't needed because if the
-% target \texttt{lm} is request it will used if there is no rule
-% and that id then reduced to \texttt{l}
-% automatically. Same for \texttt{mc} and friends. Only \texttt{?m}
-% and \texttt{m?} need rules.
-%
-% So here are the special rules for \texttt{m?}:
-% \begin{macrocode}
-\DeclareFontSeriesChangeRule {bc}{m?}{c}{}
-\DeclareFontSeriesChangeRule {bec}{m?}{ec}{}
-\DeclareFontSeriesChangeRule {bsc}{m?}{sc}{}
-\DeclareFontSeriesChangeRule {bx}{m?}{x}{}
-\DeclareFontSeriesChangeRule {b}{m?}{m}{}
-\DeclareFontSeriesChangeRule {c}{m?}{c}{}
-\DeclareFontSeriesChangeRule {ebc}{m?}{c}{}
-\DeclareFontSeriesChangeRule {ebec}{m?}{ec}{}
-\DeclareFontSeriesChangeRule {ebsc}{m?}{sc}{}
-\DeclareFontSeriesChangeRule {ebx}{m?}{x}{}
-\DeclareFontSeriesChangeRule {eb}{m?}{m}{}
-\DeclareFontSeriesChangeRule {ec}{m?}{ec}{}
-\DeclareFontSeriesChangeRule {elc}{m?}{c}{}
-\DeclareFontSeriesChangeRule {elec}{m?}{ec}{}
-\DeclareFontSeriesChangeRule {elsc}{m?}{sc}{}
-\DeclareFontSeriesChangeRule {elx}{m?}{x}{}
-\DeclareFontSeriesChangeRule {el}{m?}{m}{}
-\DeclareFontSeriesChangeRule {lc}{m?}{c}{}
-\DeclareFontSeriesChangeRule {lec}{m?}{ec}{}
-\DeclareFontSeriesChangeRule {lsc}{m?}{sc}{}
-\DeclareFontSeriesChangeRule {lx}{m?}{x}{}
-\DeclareFontSeriesChangeRule {l}{m?}{m}{}
-\DeclareFontSeriesChangeRule {m}{m?}{m}{}
-\DeclareFontSeriesChangeRule {sbc}{m?}{c}{}
-\DeclareFontSeriesChangeRule {sbec}{m?}{ec}{}
-\DeclareFontSeriesChangeRule {sbsc}{m?}{sc}{}
-\DeclareFontSeriesChangeRule {sbx}{m?}{x}{}
-\DeclareFontSeriesChangeRule {sb}{m?}{m}{}
-\DeclareFontSeriesChangeRule {sc}{m?}{sc}{}
-\DeclareFontSeriesChangeRule {slc}{m?}{c}{}
-\DeclareFontSeriesChangeRule {slec}{m?}{ec}{}
-\DeclareFontSeriesChangeRule {slsc}{m?}{sc}{}
-\DeclareFontSeriesChangeRule {slx}{m?}{x}{}
-\DeclareFontSeriesChangeRule {sl}{m?}{m}{}
-\DeclareFontSeriesChangeRule {ubc}{m?}{c}{}
-\DeclareFontSeriesChangeRule {ubec}{m?}{ec}{}
-\DeclareFontSeriesChangeRule {ubsc}{m?}{sc}{}
-\DeclareFontSeriesChangeRule {ubx}{m?}{x}{}
-\DeclareFontSeriesChangeRule {ub}{m?}{ub}{}
-\DeclareFontSeriesChangeRule {ulc}{m?}{c}{}
-\DeclareFontSeriesChangeRule {ulec}{m?}{ec}{}
-\DeclareFontSeriesChangeRule {ulsc}{m?}{sc}{}
-\DeclareFontSeriesChangeRule {ulx}{m?}{x}{}
-\DeclareFontSeriesChangeRule {ul}{m?}{m}{}
-\DeclareFontSeriesChangeRule {x}{m?}{x}{}
+\DeclareFontSeriesChangeRule {bx}{ul} {ulx} {}
+\DeclareFontSeriesChangeRule {bx}{el} {elx} {}
+\DeclareFontSeriesChangeRule {bx}{l} {lx} {}
+\DeclareFontSeriesChangeRule {bx}{sl} {slx} {}
+\DeclareFontSeriesChangeRule {bx}{sb} {sbx} {bx}
+\DeclareFontSeriesChangeRule {bx}{b} {bx} {}
+\DeclareFontSeriesChangeRule {bx}{eb} {ebx} {bx}
+\DeclareFontSeriesChangeRule {bx}{ub} {ubx} {bx}
+\DeclareFontSeriesChangeRule {bx}{uc} {buc} {}
+\DeclareFontSeriesChangeRule {bx}{ec} {bec} {}
+\DeclareFontSeriesChangeRule {bx}{c} {bc} {}
+\DeclareFontSeriesChangeRule {bx}{sc} {bsc} {}
+\DeclareFontSeriesChangeRule {bx}{sx} {bsx} {}
+\DeclareFontSeriesChangeRule {bx}{x} {bx} {}
+\DeclareFontSeriesChangeRule {bx}{ex} {bex} {}
+\DeclareFontSeriesChangeRule {bx}{ux} {bux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {bex}{ul} {ulex} {}
+\DeclareFontSeriesChangeRule {bex}{el} {elex} {}
+\DeclareFontSeriesChangeRule {bex}{l} {lex} {}
+\DeclareFontSeriesChangeRule {bex}{sl} {slex} {}
+\DeclareFontSeriesChangeRule {bex}{sb} {sbex} {bex}
+\DeclareFontSeriesChangeRule {bex}{b} {bex} {}
+\DeclareFontSeriesChangeRule {bex}{eb} {ebex} {bex}
+\DeclareFontSeriesChangeRule {bex}{ub} {ubex} {bex}
+\DeclareFontSeriesChangeRule {bex}{uc} {buc} {}
+\DeclareFontSeriesChangeRule {bex}{ec} {bec} {}
+\DeclareFontSeriesChangeRule {bex}{c} {bc} {}
+\DeclareFontSeriesChangeRule {bex}{sc} {bsc} {}
+\DeclareFontSeriesChangeRule {bex}{sx} {bsx} {}
+\DeclareFontSeriesChangeRule {bex}{x} {bx} {}
+\DeclareFontSeriesChangeRule {bex}{ex} {bex} {}
+\DeclareFontSeriesChangeRule {bex}{ux} {bux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {bux}{ul} {ulux} {}
+\DeclareFontSeriesChangeRule {bux}{el} {elux} {}
+\DeclareFontSeriesChangeRule {bux}{l} {lux} {}
+\DeclareFontSeriesChangeRule {bux}{sl} {slux} {}
+\DeclareFontSeriesChangeRule {bux}{sb} {sbux} {bux}
+\DeclareFontSeriesChangeRule {bux}{b} {bux} {}
+\DeclareFontSeriesChangeRule {bux}{eb} {ebux} {bux}
+\DeclareFontSeriesChangeRule {bux}{ub} {ubux} {bux}
+\DeclareFontSeriesChangeRule {bux}{uc} {buc} {}
+\DeclareFontSeriesChangeRule {bux}{ec} {bec} {}
+\DeclareFontSeriesChangeRule {bux}{c} {bc} {}
+\DeclareFontSeriesChangeRule {bux}{sc} {bsc} {}
+\DeclareFontSeriesChangeRule {bux}{sx} {bsx} {}
+\DeclareFontSeriesChangeRule {bux}{x} {bx} {}
+\DeclareFontSeriesChangeRule {bux}{ex} {bex} {}
+\DeclareFontSeriesChangeRule {bux}{ux} {bux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {ebuc}{ul} {uluc} {}
+\DeclareFontSeriesChangeRule {ebuc}{el} {eluc} {}
+\DeclareFontSeriesChangeRule {ebuc}{l} {luc} {}
+\DeclareFontSeriesChangeRule {ebuc}{sl} {sluc} {}
+\DeclareFontSeriesChangeRule {ebuc}{sb} {sbuc} {buc}
+\DeclareFontSeriesChangeRule {ebuc}{b} {buc} {}
+\DeclareFontSeriesChangeRule {ebuc}{eb} {ebuc} {}
+% \end{macrocode}
+%
+% In the following rule, we use \texttt{eb} instead of \texttt{b}
+% in the fourth argument, since \texttt{eb} is a better
+% approximation to \texttt{ub} than \texttt{b} and \texttt{ebuc}
+% is already in the first argument and we can therefore assume that
+% this font face actually exists. A similar consideration also
+% applies to some other rules in the following.
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {ebuc}{ub} {ubuc} {ebuc}
+\DeclareFontSeriesChangeRule {ebuc}{uc} {ebuc} {}
+\DeclareFontSeriesChangeRule {ebuc}{ec} {ebec} {}
+\DeclareFontSeriesChangeRule {ebuc}{c} {ebc} {}
+\DeclareFontSeriesChangeRule {ebuc}{sc} {ebsc} {}
+\DeclareFontSeriesChangeRule {ebuc}{sx} {ebsx} {}
+\DeclareFontSeriesChangeRule {ebuc}{x} {ebx} {}
+\DeclareFontSeriesChangeRule {ebuc}{ex} {ebex} {}
+\DeclareFontSeriesChangeRule {ebuc}{ux} {ebux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {ebec}{ul} {ulec} {}
+\DeclareFontSeriesChangeRule {ebec}{el} {elec} {}
+\DeclareFontSeriesChangeRule {ebec}{l} {lec} {}
+\DeclareFontSeriesChangeRule {ebec}{sl} {slec} {}
+\DeclareFontSeriesChangeRule {ebec}{sb} {sbec} {bec}
+\DeclareFontSeriesChangeRule {ebec}{b} {bec} {}
+\DeclareFontSeriesChangeRule {ebec}{eb} {ebec} {}
+\DeclareFontSeriesChangeRule {ebec}{ub} {ubec} {ebec}
+\DeclareFontSeriesChangeRule {ebec}{uc} {ebuc} {}
+\DeclareFontSeriesChangeRule {ebec}{ec} {ebec} {}
+\DeclareFontSeriesChangeRule {ebec}{c} {ebc} {}
+\DeclareFontSeriesChangeRule {ebec}{sc} {ebsc} {}
+\DeclareFontSeriesChangeRule {ebec}{sx} {ebsx} {}
+\DeclareFontSeriesChangeRule {ebec}{x} {ebx} {}
+\DeclareFontSeriesChangeRule {ebec}{ex} {ebex} {}
+\DeclareFontSeriesChangeRule {ebec}{ux} {ebux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {ebc}{ul} {ulc} {}
+\DeclareFontSeriesChangeRule {ebc}{el} {elc} {}
+\DeclareFontSeriesChangeRule {ebc}{l} {lc} {}
+\DeclareFontSeriesChangeRule {ebc}{sl} {slc} {}
+\DeclareFontSeriesChangeRule {ebc}{sb} {sbc} {bc}
+\DeclareFontSeriesChangeRule {ebc}{b} {bc} {}
+\DeclareFontSeriesChangeRule {ebc}{eb} {ebc} {}
+\DeclareFontSeriesChangeRule {ebc}{ub} {ubc} {ebc}
+\DeclareFontSeriesChangeRule {ebc}{uc} {ebuc} {}
+\DeclareFontSeriesChangeRule {ebc}{ec} {ebec} {}
+\DeclareFontSeriesChangeRule {ebc}{c} {ebc} {}
+\DeclareFontSeriesChangeRule {ebc}{sc} {ebsc} {}
+\DeclareFontSeriesChangeRule {ebc}{sx} {ebsx} {}
+\DeclareFontSeriesChangeRule {ebc}{x} {ebx} {}
+\DeclareFontSeriesChangeRule {ebc}{ex} {ebex} {}
+\DeclareFontSeriesChangeRule {ebc}{ux} {ebux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {ebsc}{ul} {ulsc} {}
+\DeclareFontSeriesChangeRule {ebsc}{el} {elsc} {}
+\DeclareFontSeriesChangeRule {ebsc}{l} {lsc} {}
+\DeclareFontSeriesChangeRule {ebsc}{sl} {slsc} {}
+\DeclareFontSeriesChangeRule {ebsc}{sb} {sbsc} {bsc}
+\DeclareFontSeriesChangeRule {ebsc}{b} {bsc} {}
+\DeclareFontSeriesChangeRule {ebsc}{eb} {ebsc} {}
+\DeclareFontSeriesChangeRule {ebsc}{ub} {ubsc} {ebsc}
+\DeclareFontSeriesChangeRule {ebsc}{uc} {ebuc} {}
+\DeclareFontSeriesChangeRule {ebsc}{ec} {ebec} {}
+\DeclareFontSeriesChangeRule {ebsc}{c} {ebc} {}
+\DeclareFontSeriesChangeRule {ebsc}{sc} {ebsc} {}
+\DeclareFontSeriesChangeRule {ebsc}{sx} {ebsx} {}
+\DeclareFontSeriesChangeRule {ebsc}{x} {ebx} {}
+\DeclareFontSeriesChangeRule {ebsc}{ex} {ebex} {}
+\DeclareFontSeriesChangeRule {ebsc}{ux} {ebux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {eb}{uc} {ebuc} {}
+\DeclareFontSeriesChangeRule {eb}{ec} {ebec} {}
+\DeclareFontSeriesChangeRule {eb}{c} {ebc} {}
+\DeclareFontSeriesChangeRule {eb}{sc} {ebsc} {}
+\DeclareFontSeriesChangeRule {eb}{sx} {ebsx} {}
+\DeclareFontSeriesChangeRule {eb}{x} {ebx} {}
+\DeclareFontSeriesChangeRule {eb}{ex} {ebex} {}
+\DeclareFontSeriesChangeRule {eb}{ux} {ebux} {}
+\DeclareFontSeriesChangeRule {eb}{sb} {sb} {b}
+\DeclareFontSeriesChangeRule {eb}{ub} {ub} {eb}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {ebsx}{ul} {ulsx} {}
+\DeclareFontSeriesChangeRule {ebsx}{el} {elsx} {}
+\DeclareFontSeriesChangeRule {ebsx}{l} {lsx} {}
+\DeclareFontSeriesChangeRule {ebsx}{sl} {slsx} {}
+\DeclareFontSeriesChangeRule {ebsx}{sb} {sbsx} {bsx}
+\DeclareFontSeriesChangeRule {ebsx}{b} {bsx} {}
+\DeclareFontSeriesChangeRule {ebsx}{eb} {ebsx} {}
+\DeclareFontSeriesChangeRule {ebsx}{ub} {ubsx} {ebsx}
+\DeclareFontSeriesChangeRule {ebsx}{uc} {ebuc} {}
+\DeclareFontSeriesChangeRule {ebsx}{ec} {ebec} {}
+\DeclareFontSeriesChangeRule {ebsx}{c} {ebc} {}
+\DeclareFontSeriesChangeRule {ebsx}{sc} {ebsc} {}
+\DeclareFontSeriesChangeRule {ebsx}{sx} {ebsx} {}
+\DeclareFontSeriesChangeRule {ebsx}{x} {ebx} {}
+\DeclareFontSeriesChangeRule {ebsx}{ex} {ebex} {}
+\DeclareFontSeriesChangeRule {ebsx}{ux} {ebux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {ebx}{ul} {ulx} {}
+\DeclareFontSeriesChangeRule {ebx}{el} {elx} {}
+\DeclareFontSeriesChangeRule {ebx}{l} {lx} {}
+\DeclareFontSeriesChangeRule {ebx}{sl} {slx} {}
+\DeclareFontSeriesChangeRule {ebx}{sb} {sbx} {bx}
+\DeclareFontSeriesChangeRule {ebx}{b} {bx} {}
+\DeclareFontSeriesChangeRule {ebx}{eb} {ebx} {}
+\DeclareFontSeriesChangeRule {ebx}{ub} {ubx} {ebx}
+\DeclareFontSeriesChangeRule {ebx}{uc} {ebuc} {}
+\DeclareFontSeriesChangeRule {ebx}{ec} {ebec} {}
+\DeclareFontSeriesChangeRule {ebx}{c} {ebc} {}
+\DeclareFontSeriesChangeRule {ebx}{sc} {ebsc} {}
+\DeclareFontSeriesChangeRule {ebx}{sx} {ebsx} {}
+\DeclareFontSeriesChangeRule {ebx}{x} {ebx} {}
+\DeclareFontSeriesChangeRule {ebx}{ex} {ebex} {}
+\DeclareFontSeriesChangeRule {ebx}{ux} {ebux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {ebex}{ul} {ulex} {}
+\DeclareFontSeriesChangeRule {ebex}{el} {elex} {}
+\DeclareFontSeriesChangeRule {ebex}{l} {lex} {}
+\DeclareFontSeriesChangeRule {ebex}{sl} {slex} {}
+\DeclareFontSeriesChangeRule {ebex}{sb} {sbex} {bex}
+\DeclareFontSeriesChangeRule {ebex}{b} {bex} {}
+\DeclareFontSeriesChangeRule {ebex}{eb} {ebex} {}
+\DeclareFontSeriesChangeRule {ebex}{ub} {ubex} {ebex}
+\DeclareFontSeriesChangeRule {ebex}{uc} {ebuc} {}
+\DeclareFontSeriesChangeRule {ebex}{ec} {ebec} {}
+\DeclareFontSeriesChangeRule {ebex}{c} {ebc} {}
+\DeclareFontSeriesChangeRule {ebex}{sc} {ebsc} {}
+\DeclareFontSeriesChangeRule {ebex}{sx} {ebsx} {}
+\DeclareFontSeriesChangeRule {ebex}{x} {ebx} {}
+\DeclareFontSeriesChangeRule {ebex}{ex} {ebex} {}
+\DeclareFontSeriesChangeRule {ebex}{ux} {ebux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {ebux}{ul} {ulux} {}
+\DeclareFontSeriesChangeRule {ebux}{el} {elux} {}
+\DeclareFontSeriesChangeRule {ebux}{l} {lux} {}
+\DeclareFontSeriesChangeRule {ebux}{sl} {slux} {}
+\DeclareFontSeriesChangeRule {ebux}{sb} {sbux} {bux}
+\DeclareFontSeriesChangeRule {ebux}{b} {bux} {}
+\DeclareFontSeriesChangeRule {ebux}{eb} {ebux} {}
+\DeclareFontSeriesChangeRule {ebux}{ub} {ubux} {ebux}
+\DeclareFontSeriesChangeRule {ebux}{uc} {ebuc} {}
+\DeclareFontSeriesChangeRule {ebux}{ec} {ebec} {}
+\DeclareFontSeriesChangeRule {ebux}{c} {ebc} {}
+\DeclareFontSeriesChangeRule {ebux}{sc} {ebsc} {}
+\DeclareFontSeriesChangeRule {ebux}{sx} {ebsx} {}
+\DeclareFontSeriesChangeRule {ebux}{x} {ebx} {}
+\DeclareFontSeriesChangeRule {ebux}{ex} {ebex} {}
+\DeclareFontSeriesChangeRule {ebux}{ux} {ebux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {ubuc}{ul} {uluc} {}
+\DeclareFontSeriesChangeRule {ubuc}{el} {eluc} {}
+\DeclareFontSeriesChangeRule {ubuc}{l} {luc} {}
+\DeclareFontSeriesChangeRule {ubuc}{sl} {sluc} {}
+\DeclareFontSeriesChangeRule {ubuc}{sb} {sbuc} {buc}
+\DeclareFontSeriesChangeRule {ubuc}{b} {buc} {}
+\DeclareFontSeriesChangeRule {ubuc}{eb} {ebuc} {ubuc}
+\DeclareFontSeriesChangeRule {ubuc}{ub} {ubuc} {}
+\DeclareFontSeriesChangeRule {ubuc}{uc} {ubuc} {}
+\DeclareFontSeriesChangeRule {ubuc}{ec} {ubec} {}
+\DeclareFontSeriesChangeRule {ubuc}{c} {ubc} {}
+\DeclareFontSeriesChangeRule {ubuc}{sc} {ubsc} {}
+\DeclareFontSeriesChangeRule {ubuc}{sx} {ubsx} {}
+\DeclareFontSeriesChangeRule {ubuc}{x} {ubx} {}
+\DeclareFontSeriesChangeRule {ubuc}{ex} {ubex} {}
+\DeclareFontSeriesChangeRule {ubuc}{ux} {ubux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {ubec}{ul} {ulec} {}
+\DeclareFontSeriesChangeRule {ubec}{el} {elec} {}
+\DeclareFontSeriesChangeRule {ubec}{l} {lec} {}
+\DeclareFontSeriesChangeRule {ubec}{sl} {slec} {}
+\DeclareFontSeriesChangeRule {ubec}{sb} {sbec} {bec}
+\DeclareFontSeriesChangeRule {ubec}{b} {bec} {}
+\DeclareFontSeriesChangeRule {ubec}{eb} {ebec} {ubec}
+\DeclareFontSeriesChangeRule {ubec}{ub} {ubec} {}
+\DeclareFontSeriesChangeRule {ubec}{uc} {ubuc} {}
+\DeclareFontSeriesChangeRule {ubec}{ec} {ubec} {}
+\DeclareFontSeriesChangeRule {ubec}{c} {ubc} {}
+\DeclareFontSeriesChangeRule {ubec}{sc} {ubsc} {}
+\DeclareFontSeriesChangeRule {ubec}{sx} {ubsx} {}
+\DeclareFontSeriesChangeRule {ubec}{x} {ubx} {}
+\DeclareFontSeriesChangeRule {ubec}{ex} {ubex} {}
+\DeclareFontSeriesChangeRule {ubec}{ux} {ubux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {ubc}{ul} {ulc} {}
+\DeclareFontSeriesChangeRule {ubc}{el} {elc} {}
+\DeclareFontSeriesChangeRule {ubc}{l} {lc} {}
+\DeclareFontSeriesChangeRule {ubc}{sl} {slc} {}
+\DeclareFontSeriesChangeRule {ubc}{sb} {sbc} {bc}
+\DeclareFontSeriesChangeRule {ubc}{b} {bc} {}
+\DeclareFontSeriesChangeRule {ubc}{eb} {ebc} {ubc}
+\DeclareFontSeriesChangeRule {ubc}{ub} {ubc} {}
+\DeclareFontSeriesChangeRule {ubc}{uc} {ubuc} {}
+\DeclareFontSeriesChangeRule {ubc}{ec} {ubec} {}
+\DeclareFontSeriesChangeRule {ubc}{c} {ubc} {}
+\DeclareFontSeriesChangeRule {ubc}{sc} {ubsc} {}
+\DeclareFontSeriesChangeRule {ubc}{sx} {ubsx} {}
+\DeclareFontSeriesChangeRule {ubc}{x} {ubx} {}
+\DeclareFontSeriesChangeRule {ubc}{ex} {ubex} {}
+\DeclareFontSeriesChangeRule {ubc}{ux} {ubux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {ubsc}{ul} {ulsc} {}
+\DeclareFontSeriesChangeRule {ubsc}{el} {elsc} {}
+\DeclareFontSeriesChangeRule {ubsc}{l} {lsc} {}
+\DeclareFontSeriesChangeRule {ubsc}{sl} {slsc} {}
+\DeclareFontSeriesChangeRule {ubsc}{sb} {sbsc} {bsc}
+\DeclareFontSeriesChangeRule {ubsc}{b} {bsc} {}
+\DeclareFontSeriesChangeRule {ubsc}{eb} {ebsc} {ubsc}
+\DeclareFontSeriesChangeRule {ubsc}{ub} {ubsc} {}
+\DeclareFontSeriesChangeRule {ubsc}{uc} {ubuc} {}
+\DeclareFontSeriesChangeRule {ubsc}{ec} {ubec} {}
+\DeclareFontSeriesChangeRule {ubsc}{c} {ubc} {}
+\DeclareFontSeriesChangeRule {ubsc}{sc} {ubsc} {}
+\DeclareFontSeriesChangeRule {ubsc}{sx} {ubsx} {}
+\DeclareFontSeriesChangeRule {ubsc}{x} {ubx} {}
+\DeclareFontSeriesChangeRule {ubsc}{ex} {ubex} {}
+\DeclareFontSeriesChangeRule {ubsc}{ux} {ubux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {ub}{uc} {ubuc} {}
+\DeclareFontSeriesChangeRule {ub}{ec} {ubec} {}
+\DeclareFontSeriesChangeRule {ub}{c} {ubc} {}
+\DeclareFontSeriesChangeRule {ub}{sc} {ubsc} {}
+\DeclareFontSeriesChangeRule {ub}{sx} {ubsx} {}
+\DeclareFontSeriesChangeRule {ub}{x} {ubx} {}
+\DeclareFontSeriesChangeRule {ub}{ex} {ubex} {}
+\DeclareFontSeriesChangeRule {ub}{ux} {ubux} {}
+\DeclareFontSeriesChangeRule {ub}{sb} {sb} {b}
+\DeclareFontSeriesChangeRule {ub}{eb} {eb} {ub}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {ubsx}{ul} {ulsx} {}
+\DeclareFontSeriesChangeRule {ubsx}{el} {elsx} {}
+\DeclareFontSeriesChangeRule {ubsx}{l} {lsx} {}
+\DeclareFontSeriesChangeRule {ubsx}{sl} {slsx} {}
+\DeclareFontSeriesChangeRule {ubsx}{sb} {sbsx} {bsx}
+\DeclareFontSeriesChangeRule {ubsx}{b} {bsx} {}
+\DeclareFontSeriesChangeRule {ubsx}{eb} {ebsx} {ubsx}
+\DeclareFontSeriesChangeRule {ubsx}{ub} {ubsx} {}
+\DeclareFontSeriesChangeRule {ubsx}{uc} {ubuc} {}
+\DeclareFontSeriesChangeRule {ubsx}{ec} {ubec} {}
+\DeclareFontSeriesChangeRule {ubsx}{c} {ubc} {}
+\DeclareFontSeriesChangeRule {ubsx}{sc} {ubsc} {}
+\DeclareFontSeriesChangeRule {ubsx}{sx} {ubsx} {}
+\DeclareFontSeriesChangeRule {ubsx}{x} {ubx} {}
+\DeclareFontSeriesChangeRule {ubsx}{ex} {ubex} {}
+\DeclareFontSeriesChangeRule {ubsx}{ux} {ubux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {ubx}{ul} {ulx} {}
+\DeclareFontSeriesChangeRule {ubx}{el} {elx} {}
+\DeclareFontSeriesChangeRule {ubx}{l} {lx} {}
+\DeclareFontSeriesChangeRule {ubx}{sl} {slx} {}
+\DeclareFontSeriesChangeRule {ubx}{sb} {sbx} {bx}
+\DeclareFontSeriesChangeRule {ubx}{b} {bx} {}
+\DeclareFontSeriesChangeRule {ubx}{eb} {ebx} {ubx}
+\DeclareFontSeriesChangeRule {ubx}{ub} {ubx} {}
+\DeclareFontSeriesChangeRule {ubx}{uc} {ubuc} {}
+\DeclareFontSeriesChangeRule {ubx}{ec} {ubec} {}
+\DeclareFontSeriesChangeRule {ubx}{c} {ubc} {}
+\DeclareFontSeriesChangeRule {ubx}{sc} {ubsc} {}
+\DeclareFontSeriesChangeRule {ubx}{sx} {ubsx} {}
+\DeclareFontSeriesChangeRule {ubx}{x} {ubx} {}
+\DeclareFontSeriesChangeRule {ubx}{ex} {ubex} {}
+\DeclareFontSeriesChangeRule {ubx}{ux} {ubux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {ubex}{ul} {ulex} {}
+\DeclareFontSeriesChangeRule {ubex}{el} {elex} {}
+\DeclareFontSeriesChangeRule {ubex}{l} {lex} {}
+\DeclareFontSeriesChangeRule {ubex}{sl} {slex} {}
+\DeclareFontSeriesChangeRule {ubex}{sb} {sbex} {bex}
+\DeclareFontSeriesChangeRule {ubex}{b} {bex} {}
+\DeclareFontSeriesChangeRule {ubex}{eb} {ebex} {ubex}
+\DeclareFontSeriesChangeRule {ubex}{ub} {ubex} {}
+\DeclareFontSeriesChangeRule {ubex}{uc} {ubuc} {}
+\DeclareFontSeriesChangeRule {ubex}{ec} {ubec} {}
+\DeclareFontSeriesChangeRule {ubex}{c} {ubc} {}
+\DeclareFontSeriesChangeRule {ubex}{sc} {ubsc} {}
+\DeclareFontSeriesChangeRule {ubex}{sx} {ubsx} {}
+\DeclareFontSeriesChangeRule {ubex}{x} {ubx} {}
+\DeclareFontSeriesChangeRule {ubex}{ex} {ubex} {}
+\DeclareFontSeriesChangeRule {ubex}{ux} {ubux} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {ubux}{ul} {ulux} {}
+\DeclareFontSeriesChangeRule {ubux}{el} {elux} {}
+\DeclareFontSeriesChangeRule {ubux}{l} {lux} {}
+\DeclareFontSeriesChangeRule {ubux}{sl} {slux} {}
+\DeclareFontSeriesChangeRule {ubux}{sb} {sbux} {bux}
+\DeclareFontSeriesChangeRule {ubux}{b} {bux} {}
+\DeclareFontSeriesChangeRule {ubux}{eb} {ebux} {ubux}
+\DeclareFontSeriesChangeRule {ubux}{ub} {ubux} {}
+\DeclareFontSeriesChangeRule {ubux}{uc} {ubuc} {}
+\DeclareFontSeriesChangeRule {ubux}{ec} {ubec} {}
+\DeclareFontSeriesChangeRule {ubux}{c} {ubc} {}
+\DeclareFontSeriesChangeRule {ubux}{sc} {ubsc} {}
+\DeclareFontSeriesChangeRule {ubux}{sx} {ubsx} {}
+\DeclareFontSeriesChangeRule {ubux}{x} {ubx} {}
+\DeclareFontSeriesChangeRule {ubux}{ex} {ubex} {}
+\DeclareFontSeriesChangeRule {ubux}{ux} {ubux} {}
+% \end{macrocode}
+%
+% Special rules for \texttt{lm} etc.\ aren't needed because if
+% \texttt{lm} is requested, it will be used if there is no rule, and
+% that is then reduced to \texttt{l} automatically. Same for \texttt{mc}
+% and friends.
+%
+% The following entries handle a request for \texttt{bx} and fall
+% back to \texttt{b} if that can't be fulfilled.
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {uluc}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {ulec}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {ulc}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {ulsc}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {ul}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {ulsx}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {ulx}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {ulex}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {ulux}{bx} {bx} {b}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {eluc}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {elec}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {elc}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {elsc}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {el}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {elsx}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {elx}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {elex}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {elux}{bx} {bx} {b}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {luc}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {lec}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {lc}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {lsc}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {l}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {lsx}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {lx}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {lex}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {lux}{bx} {bx} {b}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {sluc}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {slec}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {slc}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {slsc}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {sl}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {slsx}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {slx}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {slex}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {slux}{bx} {bx} {b}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {sbuc}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {sbec}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {sbc}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {sbsc}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {sb}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {sbsx}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {sbx}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {sbex}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {sbux}{bx} {bx} {b}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {buc}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {bec}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {bc}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {bsc}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {b}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {bsx}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {bx}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {bex}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {bux}{bx} {bx} {b}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {ebuc}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {ebec}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {ebc}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {ebsc}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {eb}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {ebsx}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {ebx}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {ebex}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {ebux}{bx} {bx} {b}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {ubuc}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {ubec}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {ubc}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {ubsc}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {ub}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {ubsx}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {ubx}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {ubex}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {ubux}{bx} {bx} {b}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {uc}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {ec}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {c}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {sc}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {m}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {sx}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {x}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {ex}{bx} {bx} {b}
+\DeclareFontSeriesChangeRule {ux}{bx} {bx} {b}
+% \end{macrocode}
+%
+% Here are the special rules for \texttt{m?}:
+% \begin{macrocode}
+\DeclareFontSeriesChangeRule {uluc}{m?} {uc} {}
+\DeclareFontSeriesChangeRule {ulec}{m?} {ec} {}
+\DeclareFontSeriesChangeRule {ulc}{m?} {c} {}
+\DeclareFontSeriesChangeRule {ulsc}{m?} {sc} {}
+\DeclareFontSeriesChangeRule {ul}{m?} {m} {}
+\DeclareFontSeriesChangeRule {ulsx}{m?} {sx} {}
+\DeclareFontSeriesChangeRule {ulx}{m?} {x} {}
+\DeclareFontSeriesChangeRule {ulex}{m?} {ex} {}
+\DeclareFontSeriesChangeRule {ulux}{m?} {ux} {}
+\DeclareFontSeriesChangeRule {eluc}{m?} {uc} {}
+\DeclareFontSeriesChangeRule {elec}{m?} {ec} {}
+\DeclareFontSeriesChangeRule {elc}{m?} {c} {}
+\DeclareFontSeriesChangeRule {elsc}{m?} {sc} {}
+\DeclareFontSeriesChangeRule {el}{m?} {m} {}
+\DeclareFontSeriesChangeRule {elsx}{m?} {sx} {}
+\DeclareFontSeriesChangeRule {elx}{m?} {x} {}
+\DeclareFontSeriesChangeRule {elex}{m?} {ex} {}
+\DeclareFontSeriesChangeRule {elux}{m?} {ux} {}
+\DeclareFontSeriesChangeRule {luc}{m?} {uc} {}
+\DeclareFontSeriesChangeRule {lec}{m?} {ec} {}
+\DeclareFontSeriesChangeRule {lc}{m?} {c} {}
+\DeclareFontSeriesChangeRule {lsc}{m?} {sc} {}
+\DeclareFontSeriesChangeRule {l}{m?} {m} {}
+\DeclareFontSeriesChangeRule {lsx}{m?} {sx} {}
+\DeclareFontSeriesChangeRule {lx}{m?} {x} {}
+\DeclareFontSeriesChangeRule {lex}{m?} {ex} {}
+\DeclareFontSeriesChangeRule {lux}{m?} {ux} {}
+\DeclareFontSeriesChangeRule {sluc}{m?} {uc} {}
+\DeclareFontSeriesChangeRule {slec}{m?} {ec} {}
+\DeclareFontSeriesChangeRule {slc}{m?} {c} {}
+\DeclareFontSeriesChangeRule {slsc}{m?} {sc} {}
+\DeclareFontSeriesChangeRule {sl}{m?} {m} {}
+\DeclareFontSeriesChangeRule {slsx}{m?} {sx} {}
+\DeclareFontSeriesChangeRule {slx}{m?} {x} {}
+\DeclareFontSeriesChangeRule {slex}{m?} {ex} {}
+\DeclareFontSeriesChangeRule {slux}{m?} {ux} {}
+\DeclareFontSeriesChangeRule {uc}{m?} {uc} {}
+\DeclareFontSeriesChangeRule {ec}{m?} {ec} {}
+\DeclareFontSeriesChangeRule {c}{m?} {c} {}
+\DeclareFontSeriesChangeRule {sc}{m?} {sc} {}
+\DeclareFontSeriesChangeRule {m}{m?} {m} {}
+\DeclareFontSeriesChangeRule {sx}{m?} {sx} {}
+\DeclareFontSeriesChangeRule {x}{m?} {x} {}
+\DeclareFontSeriesChangeRule {ex}{m?} {ex} {}
+\DeclareFontSeriesChangeRule {ux}{m?} {ux} {}
+\DeclareFontSeriesChangeRule {sbuc}{m?} {uc} {}
+\DeclareFontSeriesChangeRule {sbec}{m?} {ec} {}
+\DeclareFontSeriesChangeRule {sbc}{m?} {c} {}
+\DeclareFontSeriesChangeRule {sbsc}{m?} {sc} {}
+\DeclareFontSeriesChangeRule {sb}{m?} {m} {}
+\DeclareFontSeriesChangeRule {sbsx}{m?} {sx} {}
+\DeclareFontSeriesChangeRule {sbx}{m?} {x} {}
+\DeclareFontSeriesChangeRule {sbex}{m?} {ex} {}
+\DeclareFontSeriesChangeRule {sbux}{m?} {ux} {}
+\DeclareFontSeriesChangeRule {buc}{m?} {uc} {}
+\DeclareFontSeriesChangeRule {bec}{m?} {ec} {}
+\DeclareFontSeriesChangeRule {bc}{m?} {c} {}
+\DeclareFontSeriesChangeRule {bsc}{m?} {sc} {}
+\DeclareFontSeriesChangeRule {b}{m?} {m} {}
+\DeclareFontSeriesChangeRule {bsx}{m?} {sx} {}
+\DeclareFontSeriesChangeRule {bx}{m?} {x} {}
+\DeclareFontSeriesChangeRule {bex}{m?} {ex} {}
+\DeclareFontSeriesChangeRule {bux}{m?} {ux} {}
+\DeclareFontSeriesChangeRule {ebuc}{m?} {uc} {}
+\DeclareFontSeriesChangeRule {ebec}{m?} {ec} {}
+\DeclareFontSeriesChangeRule {ebc}{m?} {c} {}
+\DeclareFontSeriesChangeRule {ebsc}{m?} {sc} {}
+\DeclareFontSeriesChangeRule {eb}{m?} {m} {}
+\DeclareFontSeriesChangeRule {ebsx}{m?} {sx} {}
+\DeclareFontSeriesChangeRule {ebx}{m?} {x} {}
+\DeclareFontSeriesChangeRule {ebex}{m?} {ex} {}
+\DeclareFontSeriesChangeRule {ebux}{m?} {ux} {}
+\DeclareFontSeriesChangeRule {ubuc}{m?} {uc} {}
+\DeclareFontSeriesChangeRule {ubec}{m?} {ec} {}
+\DeclareFontSeriesChangeRule {ubc}{m?} {c} {}
+\DeclareFontSeriesChangeRule {ubsc}{m?} {sc} {}
+\DeclareFontSeriesChangeRule {ub}{m?} {m} {}
+\DeclareFontSeriesChangeRule {ubsx}{m?} {sx} {}
+\DeclareFontSeriesChangeRule {ubx}{m?} {x} {}
+\DeclareFontSeriesChangeRule {ubex}{m?} {ex} {}
+\DeclareFontSeriesChangeRule {ubux}{m?} {ux} {}
% \end{macrocode}
%
% And there the special rules for \texttt{?m}:
% \begin{macrocode}
-\DeclareFontSeriesChangeRule {bc}{?m}{b}{}
-\DeclareFontSeriesChangeRule {bec}{?m}{b}{}
-\DeclareFontSeriesChangeRule {bsc}{?m}{b}{}
-\DeclareFontSeriesChangeRule {bsc}{?m}{b}{}
-\DeclareFontSeriesChangeRule {bx}{?m}{b}{}
-\DeclareFontSeriesChangeRule {b}{?m}{b}{}
-\DeclareFontSeriesChangeRule {c}{?m}{m}{}
-\DeclareFontSeriesChangeRule {ebc}{?m}{eb}{}
-\DeclareFontSeriesChangeRule {ebec}{?m}{eb}{}
-\DeclareFontSeriesChangeRule {ebsc}{?m}{eb}{}
-\DeclareFontSeriesChangeRule {ebsc}{?m}{eb}{}
-\DeclareFontSeriesChangeRule {ebx}{?m}{eb}{}
-\DeclareFontSeriesChangeRule {eb}{?m}{eb}{}
-\DeclareFontSeriesChangeRule {ec}{?m}{m}{}
-\DeclareFontSeriesChangeRule {elc}{?m}{el}{}
-\DeclareFontSeriesChangeRule {elec}{?m}{el}{}
-\DeclareFontSeriesChangeRule {elsc}{?m}{el}{}
-\DeclareFontSeriesChangeRule {elsc}{?m}{el}{}
-\DeclareFontSeriesChangeRule {elx}{?m}{el}{}
-\DeclareFontSeriesChangeRule {el}{?m}{el}{}
-\DeclareFontSeriesChangeRule {lc}{?m}{l}{}
-\DeclareFontSeriesChangeRule {lec}{?m}{l}{}
-\DeclareFontSeriesChangeRule {lsc}{?m}{l}{}
-\DeclareFontSeriesChangeRule {lsc}{?m}{l}{}
-\DeclareFontSeriesChangeRule {lx}{?m}{l}{}
-\DeclareFontSeriesChangeRule {l}{?m}{l}{}
-\DeclareFontSeriesChangeRule {m}{?m}{m}{}
-\DeclareFontSeriesChangeRule {sbc}{?m}{sb}{}
-\DeclareFontSeriesChangeRule {sbec}{?m}{sb}{}
-\DeclareFontSeriesChangeRule {sbsc}{?m}{sb}{}
-\DeclareFontSeriesChangeRule {sbsc}{?m}{sb}{}
-\DeclareFontSeriesChangeRule {sbx}{?m}{sb}{}
-\DeclareFontSeriesChangeRule {sb}{?m}{sb}{}
-\DeclareFontSeriesChangeRule {sc}{?m}{m}{}
-\DeclareFontSeriesChangeRule {sc}{?m}{m}{}
-\DeclareFontSeriesChangeRule {slc}{?m}{sl}{}
-\DeclareFontSeriesChangeRule {slec}{?m}{sl}{}
-\DeclareFontSeriesChangeRule {slsc}{?m}{sl}{}
-\DeclareFontSeriesChangeRule {slsc}{?m}{sl}{}
-\DeclareFontSeriesChangeRule {slx}{?m}{sl}{}
-\DeclareFontSeriesChangeRule {sl}{?m}{sl}{}
-\DeclareFontSeriesChangeRule {ubc}{?m}{ub}{}
-\DeclareFontSeriesChangeRule {ubec}{?m}{ub}{}
-\DeclareFontSeriesChangeRule {ubsc}{?m}{ub}{}
-\DeclareFontSeriesChangeRule {ubsc}{?m}{ub}{}
-\DeclareFontSeriesChangeRule {ubx}{?m}{ub}{}
-\DeclareFontSeriesChangeRule {ub}{?m}{m}{}
-\DeclareFontSeriesChangeRule {ulc}{?m}{ul}{}
-\DeclareFontSeriesChangeRule {ulec}{?m}{ul}{}
-\DeclareFontSeriesChangeRule {ulsc}{?m}{ul}{}
-\DeclareFontSeriesChangeRule {ulsc}{?m}{ul}{}
-\DeclareFontSeriesChangeRule {ulx}{?m}{ul}{}
-\DeclareFontSeriesChangeRule {ul}{?m}{ul}{}
-\DeclareFontSeriesChangeRule {x}{?m}{m}{}
+\DeclareFontSeriesChangeRule {uluc}{?m} {ul} {}
+\DeclareFontSeriesChangeRule {ulec}{?m} {ul} {}
+\DeclareFontSeriesChangeRule {ulc}{?m} {ul} {}
+\DeclareFontSeriesChangeRule {ulsc}{?m} {ul} {}
+\DeclareFontSeriesChangeRule {ul}{?m} {ul} {}
+\DeclareFontSeriesChangeRule {ulsx}{?m} {ul} {}
+\DeclareFontSeriesChangeRule {ulx}{?m} {ul} {}
+\DeclareFontSeriesChangeRule {ulex}{?m} {ul} {}
+\DeclareFontSeriesChangeRule {ulux}{?m} {ul} {}
+\DeclareFontSeriesChangeRule {eluc}{?m} {el} {}
+\DeclareFontSeriesChangeRule {elec}{?m} {el} {}
+\DeclareFontSeriesChangeRule {elc}{?m} {el} {}
+\DeclareFontSeriesChangeRule {elsc}{?m} {el} {}
+\DeclareFontSeriesChangeRule {el}{?m} {el} {}
+\DeclareFontSeriesChangeRule {elsx}{?m} {el} {}
+\DeclareFontSeriesChangeRule {elx}{?m} {el} {}
+\DeclareFontSeriesChangeRule {elex}{?m} {el} {}
+\DeclareFontSeriesChangeRule {elux}{?m} {el} {}
+\DeclareFontSeriesChangeRule {luc}{?m} {l} {}
+\DeclareFontSeriesChangeRule {lec}{?m} {l} {}
+\DeclareFontSeriesChangeRule {lc}{?m} {l} {}
+\DeclareFontSeriesChangeRule {lsc}{?m} {l} {}
+\DeclareFontSeriesChangeRule {l}{?m} {l} {}
+\DeclareFontSeriesChangeRule {lsx}{?m} {l} {}
+\DeclareFontSeriesChangeRule {lx}{?m} {l} {}
+\DeclareFontSeriesChangeRule {lex}{?m} {l} {}
+\DeclareFontSeriesChangeRule {lux}{?m} {l} {}
+\DeclareFontSeriesChangeRule {sluc}{?m} {sl} {}
+\DeclareFontSeriesChangeRule {slec}{?m} {sl} {}
+\DeclareFontSeriesChangeRule {slc}{?m} {sl} {}
+\DeclareFontSeriesChangeRule {slsc}{?m} {sl} {}
+\DeclareFontSeriesChangeRule {sl}{?m} {sl} {}
+\DeclareFontSeriesChangeRule {slsx}{?m} {sl} {}
+\DeclareFontSeriesChangeRule {slx}{?m} {sl} {}
+\DeclareFontSeriesChangeRule {slex}{?m} {sl} {}
+\DeclareFontSeriesChangeRule {slux}{?m} {sl} {}
+\DeclareFontSeriesChangeRule {uc}{?m} {m} {}
+\DeclareFontSeriesChangeRule {ec}{?m} {m} {}
+\DeclareFontSeriesChangeRule {c}{?m} {m} {}
+\DeclareFontSeriesChangeRule {sc}{?m} {m} {}
+\DeclareFontSeriesChangeRule {m}{?m} {m} {}
+\DeclareFontSeriesChangeRule {sx}{?m} {m} {}
+\DeclareFontSeriesChangeRule {x}{?m} {m} {}
+\DeclareFontSeriesChangeRule {ex}{?m} {m} {}
+\DeclareFontSeriesChangeRule {ux}{?m} {m} {}
+\DeclareFontSeriesChangeRule {sbuc}{?m} {sb} {}
+\DeclareFontSeriesChangeRule {sbec}{?m} {sb} {}
+\DeclareFontSeriesChangeRule {sbc}{?m} {sb} {}
+\DeclareFontSeriesChangeRule {sbsc}{?m} {sb} {}
+\DeclareFontSeriesChangeRule {sb}{?m} {sb} {}
+\DeclareFontSeriesChangeRule {sbsx}{?m} {sb} {}
+\DeclareFontSeriesChangeRule {sbx}{?m} {sb} {}
+\DeclareFontSeriesChangeRule {sbex}{?m} {sb} {}
+\DeclareFontSeriesChangeRule {sbux}{?m} {sb} {}
+\DeclareFontSeriesChangeRule {buc}{?m} {b} {}
+\DeclareFontSeriesChangeRule {bec}{?m} {b} {}
+\DeclareFontSeriesChangeRule {bc}{?m} {b} {}
+\DeclareFontSeriesChangeRule {bsc}{?m} {b} {}
+\DeclareFontSeriesChangeRule {b}{?m} {b} {}
+\DeclareFontSeriesChangeRule {bsx}{?m} {b} {}
+\DeclareFontSeriesChangeRule {bx}{?m} {b} {}
+\DeclareFontSeriesChangeRule {bex}{?m} {b} {}
+\DeclareFontSeriesChangeRule {bux}{?m} {b} {}
+\DeclareFontSeriesChangeRule {ebuc}{?m} {eb} {}
+\DeclareFontSeriesChangeRule {ebec}{?m} {eb} {}
+\DeclareFontSeriesChangeRule {ebc}{?m} {eb} {}
+\DeclareFontSeriesChangeRule {ebsc}{?m} {eb} {}
+\DeclareFontSeriesChangeRule {eb}{?m} {eb} {}
+\DeclareFontSeriesChangeRule {ebsx}{?m} {eb} {}
+\DeclareFontSeriesChangeRule {ebx}{?m} {eb} {}
+\DeclareFontSeriesChangeRule {ebex}{?m} {eb} {}
+\DeclareFontSeriesChangeRule {ebux}{?m} {eb} {}
+\DeclareFontSeriesChangeRule {ubuc}{?m} {ub} {}
+\DeclareFontSeriesChangeRule {ubec}{?m} {ub} {}
+\DeclareFontSeriesChangeRule {ubc}{?m} {ub} {}
+\DeclareFontSeriesChangeRule {ubsc}{?m} {ub} {}
+\DeclareFontSeriesChangeRule {ub}{?m} {ub} {}
+\DeclareFontSeriesChangeRule {ubsx}{?m} {ub} {}
+\DeclareFontSeriesChangeRule {ubx}{?m} {ub} {}
+\DeclareFontSeriesChangeRule {ubex}{?m} {ub} {}
+\DeclareFontSeriesChangeRule {ubux}{?m} {ub} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
% \end{macrocode}
%
%
% Supporting rollback \ldots
% \begin{macrocode}
-%</2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/02/02}%
+%<latexrelease> {\DeclareFontSeriesChangeRule}{Series change rules}%
+% \end{macrocode}
+% The next definition is only needed if somebody rolls forward from a
+% release older than 2020-02-02 but not to the latest version but
+% one before 2025-06-01. Pretty unlikely, but \ldots.
+% \begin{macrocode}
+%<latexrelease>
+%<latexrelease>\def\DeclareFontSeriesChangeRule#1#2#3#4{%
+%<latexrelease> \@namedef{series@#1@#2}{{#3}{#4}}}
+%<latexrelease>
+% \end{macrocode}
+% The huge set of declarations below are those from 2020-02-02 plus
+% all from above that were newly added (but now with empty result
+% and alternative result arguments). To compile this list I sorted
+% both together and then dropped entries appearing twice. This is
+% why the sorting is now different from the one above.
+% \begin{macrocode}
+%<latexrelease>\DeclareFontSeriesChangeRule {bc}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bc}{b}{bc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {bc}{c}{bc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {bc}{eb}{ebc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {bc}{ec}{bec} {bc}
+%<latexrelease>\DeclareFontSeriesChangeRule {bc}{el}{elc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {bc}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bc}{l}{lc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {bc}{sb}{sbc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {bc}{sc}{bsc} {bc}
+%<latexrelease>\DeclareFontSeriesChangeRule {bc}{sl}{slc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {bc}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bc}{ub}{ubc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {bc}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bc}{ul}{ulc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {bc}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bc}{x}{bx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {bec}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bec}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bec}{c} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bec}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bec}{ec} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bec}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bec}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bec}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bec}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bec}{sc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bec}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bec}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bec}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bec}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bec}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bec}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bec}{x} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bex}{?m} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bex}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bex}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bex}{c} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bex}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bex}{ec} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bex}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bex}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bex}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bex}{m?} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bex}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bex}{sc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bex}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bex}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bex}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bex}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bex}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bex}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bex}{x} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bsc}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bsc}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bsc}{c} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bsc}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bsc}{ec} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bsc}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bsc}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bsc}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bsc}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bsc}{sc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bsc}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bsc}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bsc}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bsc}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bsc}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bsc}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bsc}{x} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bsx}{?m} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bsx}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bsx}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bsx}{c} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bsx}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bsx}{ec} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bsx}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bsx}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bsx}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bsx}{m?} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bsx}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bsx}{sc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bsx}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bsx}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bsx}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bsx}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bsx}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bsx}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bsx}{x} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {buc}{?m} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {buc}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {buc}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {buc}{c} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {buc}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {buc}{ec} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {buc}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {buc}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {buc}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {buc}{m?} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {buc}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {buc}{sc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {buc}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {buc}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {buc}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {buc}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {buc}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {buc}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {buc}{x} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bux}{?m} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bux}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bux}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bux}{c} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bux}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bux}{ec} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bux}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bux}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bux}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bux}{m?} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bux}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bux}{sc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bux}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bux}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bux}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bux}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bux}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bux}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bux}{x} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bx}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bx}{b}{bx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {bx}{c} {bc} {bx}
+%<latexrelease>\DeclareFontSeriesChangeRule {bx}{eb}{ebx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {bx}{ec} {bec} {bx}
+%<latexrelease>\DeclareFontSeriesChangeRule {bx}{el}{elx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {bx}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bx}{l}{lx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {bx}{sb} {sbx} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bx}{sc} {bsc} {bx}
+%<latexrelease>\DeclareFontSeriesChangeRule {bx}{sl}{slx} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bx}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bx}{ub}{ubx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {bx}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bx}{ul}{ulx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {bx}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {bx}{x}{bx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {b}{bx} {bx} {b}
+%<latexrelease>\DeclareFontSeriesChangeRule {b}{c} {bc} {b}
+%<latexrelease>\DeclareFontSeriesChangeRule {b}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {b}{ec} {bec} {b}
+%<latexrelease>\DeclareFontSeriesChangeRule {b}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {b}{sb} {sb} {b}
+%<latexrelease>\DeclareFontSeriesChangeRule {b}{sc} {bsc} {b}
+%<latexrelease>\DeclareFontSeriesChangeRule {b}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {b}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {b}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {b}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {b}{x} {bx} {b}
+%<latexrelease>\DeclareFontSeriesChangeRule {c}{bx} {bx} {b}
+%<latexrelease>\DeclareFontSeriesChangeRule {c}{b}{bc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {c}{eb}{ebc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {c}{ec} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {c}{el}{elc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {c}{l}{lc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {c}{sb}{sbc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {c}{sc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {c}{sl}{slc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {c}{ub}{ubc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {c}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {c}{x}{x}{m}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebc}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebc}{b}{bc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebc}{c}{ebc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebc}{eb}{ebc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebc}{ec}{ebec}{ebc}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebc}{el}{elc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebc}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebc}{l}{lc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebc}{sb}{sbc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebc}{sc}{ebsc}{ebc}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebc}{sl}{slc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebc}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebc}{ub}{ubc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebc}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebc}{ul}{ulc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebc}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebc}{x}{ebx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebec}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebec}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebec}{c} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebec}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebec}{ec} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebec}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebec}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebec}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebec}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebec}{sc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebec}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebec}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebec}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebec}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebec}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebec}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebec}{x} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebex}{?m} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebex}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebex}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebex}{c} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebex}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebex}{ec} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebex}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebex}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebex}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebex}{m?} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebex}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebex}{sc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebex}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebex}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebex}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebex}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebex}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebex}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebex}{x} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebsc}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebsc}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebsc}{c} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebsc}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebsc}{ec} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebsc}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebsc}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebsc}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebsc}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebsc}{sc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebsc}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebsc}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebsc}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebsc}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebsc}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebsc}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebsc}{x} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebsx}{?m} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebsx}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebsx}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebsx}{c} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebsx}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebsx}{ec} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebsx}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebsx}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebsx}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebsx}{m?} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebsx}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebsx}{sc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebsx}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebsx}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebsx}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebsx}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebsx}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebsx}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebsx}{x} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebuc}{?m} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebuc}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebuc}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebuc}{c} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebuc}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebuc}{ec} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebuc}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebuc}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebuc}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebuc}{m?} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebuc}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebuc}{sc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebuc}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebuc}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebuc}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebuc}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebuc}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebuc}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebuc}{x} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebux}{?m} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebux}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebux}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebux}{c} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebux}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebux}{ec} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebux}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebux}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebux}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebux}{m?} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebux}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebux}{sc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebux}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebux}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebux}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebux}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebux}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebux}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebux}{x} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebx}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebx}{b}{bx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebx}{c}{ebc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebx}{eb}{ebx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebx}{ec}{ebec}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebx}{el}{elx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebx}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebx}{l}{lx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebx}{sb}{sbx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebx}{sc}{ebsc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebx}{sl}{slx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebx}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebx}{ub}{ubx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebx}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebx}{ul}{ulx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebx}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ebx}{x}{ebx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {eb}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {eb}{c}{ebc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {eb}{ec}{ebec}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {eb}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {eb}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {eb}{sc}{ebsc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {eb}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {eb}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {eb}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {eb}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {eb}{x}{ebx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ec}{bx} {bx} {b}
+%<latexrelease>\DeclareFontSeriesChangeRule {ec}{b}{bec}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ec}{eb}{ebec}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ec}{el}{elec}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ec}{l}{lec}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ec}{sb}{sbec}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ec}{sl}{slec}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ec}{ub}{ubec}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ec}{x}{x}{m}
+%<latexrelease>\DeclareFontSeriesChangeRule {elc}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elc}{b}{bc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {elc}{c}{elc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {elc}{eb}{ebc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {elc}{ec}{elec}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {elc}{el}{elc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {elc}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elc}{l}{lc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {elc}{sb}{sbc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {elc}{sc}{elsc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {elc}{sl}{slc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {elc}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elc}{ub}{ubc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {elc}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elc}{ul}{ulc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {elc}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elc}{x}{elx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {elec}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elec}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elec}{c} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elec}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elec}{ec} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elec}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elec}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elec}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elec}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elec}{sc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elec}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elec}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elec}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elec}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elec}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elec}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elec}{x} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elex}{?m} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elex}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elex}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elex}{c} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elex}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elex}{ec} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elex}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elex}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elex}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elex}{m?} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elex}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elex}{sc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elex}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elex}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elex}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elex}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elex}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elex}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elex}{x} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elsc}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elsc}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elsc}{c} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elsc}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elsc}{ec} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elsc}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elsc}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elsc}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elsc}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elsc}{sc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elsc}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elsc}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elsc}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elsc}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elsc}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elsc}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elsc}{x} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elsx}{?m} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elsx}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elsx}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elsx}{c} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elsx}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elsx}{ec} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elsx}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elsx}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elsx}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elsx}{m?} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elsx}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elsx}{sc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elsx}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elsx}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elsx}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elsx}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elsx}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elsx}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elsx}{x} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {eluc}{?m} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {eluc}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {eluc}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {eluc}{c} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {eluc}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {eluc}{ec} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {eluc}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {eluc}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {eluc}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {eluc}{m?} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {eluc}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {eluc}{sc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {eluc}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {eluc}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {eluc}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {eluc}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {eluc}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {eluc}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {eluc}{x} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elux}{?m} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elux}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elux}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elux}{c} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elux}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elux}{ec} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elux}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elux}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elux}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elux}{m?} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elux}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elux}{sc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elux}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elux}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elux}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elux}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elux}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elux}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elux}{x} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elx}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elx}{b}{bx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {elx}{c}{elc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {elx}{eb}{ebx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {elx}{ec}{elec}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {elx}{el}{elx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {elx}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elx}{l}{lx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {elx}{sb}{sbx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {elx}{sc}{elsc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {elx}{sl}{slx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {elx}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elx}{ub}{ubx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {elx}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elx}{ul}{ulx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {elx}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {elx}{x}{elx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {el}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {el}{c}{elc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {el}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {el}{ec}{elec}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {el}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {el}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {el}{sc}{elsc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {el}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {el}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {el}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {el}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {el}{x}{elx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ex}{?m} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ex}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ex}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ex}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ex}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ex}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ex}{m?} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ex}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ex}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ex}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ex}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lc}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lc}{b}{bc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {lc}{c}{lc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {lc}{eb}{ebc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {lc}{ec}{lec}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {lc}{el}{elc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {lc}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lc}{l}{lc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {lc}{sb}{sbc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {lc}{sc}{lsc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {lc}{sl}{slc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {lc}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lc}{ub}{ubc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {lc}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lc}{ul}{ulc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {lc}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lc}{x}{lx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {lec}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lec}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lec}{c} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lec}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lec}{ec} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lec}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lec}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lec}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lec}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lec}{sc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lec}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lec}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lec}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lec}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lec}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lec}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lec}{x} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lex}{?m} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lex}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lex}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lex}{c} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lex}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lex}{ec} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lex}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lex}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lex}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lex}{m?} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lex}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lex}{sc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lex}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lex}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lex}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lex}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lex}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lex}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lex}{x} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lsc}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lsc}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lsc}{c} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lsc}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lsc}{ec} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lsc}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lsc}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lsc}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lsc}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lsc}{sc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lsc}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lsc}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lsc}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lsc}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lsc}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lsc}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lsc}{x} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lsx}{?m} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lsx}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lsx}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lsx}{c} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lsx}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lsx}{ec} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lsx}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lsx}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lsx}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lsx}{m?} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lsx}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lsx}{sc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lsx}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lsx}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lsx}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lsx}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lsx}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lsx}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lsx}{x} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {luc}{?m} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {luc}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {luc}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {luc}{c} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {luc}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {luc}{ec} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {luc}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {luc}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {luc}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {luc}{m?} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {luc}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {luc}{sc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {luc}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {luc}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {luc}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {luc}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {luc}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {luc}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {luc}{x} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lux}{?m} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lux}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lux}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lux}{c} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lux}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lux}{ec} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lux}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lux}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lux}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lux}{m?} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lux}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lux}{sc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lux}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lux}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lux}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lux}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lux}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lux}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lux}{x} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lx}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lx}{b}{bx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {lx}{c}{lc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {lx}{eb}{ebx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {lx}{ec}{lec}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {lx}{el}{elx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {lx}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lx}{l}{lx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {lx}{sb}{sbx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {lx}{sc}{lsc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {lx}{sl}{slx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {lx}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lx}{ub}{ubx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {lx}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lx}{ul}{ulx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {lx}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {lx}{x}{lx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {l}{b} {b} {bx}
+%<latexrelease>\DeclareFontSeriesChangeRule {l}{c} {lc} {l}
+%<latexrelease>\DeclareFontSeriesChangeRule {l}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {l}{ec} {lec} {l}
+%<latexrelease>\DeclareFontSeriesChangeRule {l}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {l}{sb} {sb} {b}
+%<latexrelease>\DeclareFontSeriesChangeRule {l}{sc} {lsc} {l}
+%<latexrelease>\DeclareFontSeriesChangeRule {l}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {l}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {l}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {l}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {l}{x} {lx} {l}
+%<latexrelease>\DeclareFontSeriesChangeRule {m}{bx} {bx} {b}
+%<latexrelease>\DeclareFontSeriesChangeRule {m}{c} {c} {m}
+%<latexrelease>\DeclareFontSeriesChangeRule {m}{l} {l} {m}
+%<latexrelease>\DeclareFontSeriesChangeRule {m}{sc} {sc} {m}
+%<latexrelease>\DeclareFontSeriesChangeRule {m}{x} {x} {m}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbc}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbc}{b}{bc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbc}{c}{sbc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbc}{eb}{ebc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbc}{ec}{sbec}{sbc}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbc}{el}{elc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbc}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbc}{l}{lc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbc}{sb}{sbc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbc}{sc}{sbsc}{sbc}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbc}{sl}{slc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbc}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbc}{ub}{ubc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbc}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbc}{ul}{ulc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbc}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbc}{x}{sbx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbec}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbec}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbec}{c} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbec}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbec}{ec} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbec}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbec}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbec}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbec}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbec}{sc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbec}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbec}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbec}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbec}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbec}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbec}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbec}{x} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbex}{?m} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbex}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbex}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbex}{c} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbex}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbex}{ec} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbex}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbex}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbex}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbex}{m?} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbex}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbex}{sc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbex}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbex}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbex}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbex}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbex}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbex}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbex}{x} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbsc}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbsc}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbsc}{c} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbsc}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbsc}{ec} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbsc}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbsc}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbsc}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbsc}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbsc}{sc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbsc}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbsc}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbsc}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbsc}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbsc}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbsc}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbsc}{x} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbsx}{?m} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbsx}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbsx}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbsx}{c} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbsx}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbsx}{ec} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbsx}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbsx}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbsx}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbsx}{m?} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbsx}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbsx}{sc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbsx}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbsx}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbsx}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbsx}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbsx}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbsx}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbsx}{x} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbuc}{?m} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbuc}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbuc}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbuc}{c} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbuc}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbuc}{ec} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbuc}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbuc}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbuc}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbuc}{m?} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbuc}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbuc}{sc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbuc}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbuc}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbuc}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbuc}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbuc}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbuc}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbuc}{x} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbux}{?m} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbux}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbux}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbux}{c} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbux}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbux}{ec} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbux}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbux}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbux}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbux}{m?} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbux}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbux}{sc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbux}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbux}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbux}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbux}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbux}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbux}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbux}{x} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbx}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbx}{b}{bx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbx}{c}{sbc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbx}{eb}{ebx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbx}{ec}{sbec}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbx}{el}{elx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbx}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbx}{l}{lx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbx}{sb}{sbx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbx}{sc}{sbsc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbx}{sl}{slx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbx}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbx}{ub}{ubx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbx}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbx}{ul}{ulx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbx}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sbx}{x}{sbx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {sb}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sb}{c} {sbc} {bc}
+%<latexrelease>\DeclareFontSeriesChangeRule {sb}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sb}{ec} {sbec} {sbc}
+%<latexrelease>\DeclareFontSeriesChangeRule {sb}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sb}{sc} {sbsc} {sbc}
+%<latexrelease>\DeclareFontSeriesChangeRule {sb}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sb}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sb}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sb}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sb}{x} {sbx} {bx}
+%<latexrelease>\DeclareFontSeriesChangeRule {sc}{bx} {bx} {b}
+%<latexrelease>\DeclareFontSeriesChangeRule {sc}{b}{bsc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {sc}{eb}{ebsc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {sc}{el}{elsc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {sc}{l}{lsc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {sc}{sb}{sbsc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {sc}{sl}{slsc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {sc}{ub}{ubsc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {sc}{x}{x}{m}
+%<latexrelease>\DeclareFontSeriesChangeRule {slc}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slc}{b}{bc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {slc}{c}{slc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {slc}{eb}{ebc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {slc}{ec}{slec}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {slc}{el}{elc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {slc}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slc}{l}{lc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {slc}{sb}{sbc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {slc}{sc}{slsc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {slc}{sl}{slc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {slc}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slc}{ub}{ubc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {slc}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slc}{ul}{ulc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {slc}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slc}{x}{slx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {slec}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slec}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slec}{c} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slec}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slec}{ec} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slec}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slec}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slec}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slec}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slec}{sc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slec}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slec}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slec}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slec}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slec}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slec}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slec}{x} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slex}{?m} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slex}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slex}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slex}{c} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slex}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slex}{ec} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slex}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slex}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slex}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slex}{m?} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slex}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slex}{sc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slex}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slex}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slex}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slex}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slex}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slex}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slex}{x} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slsc}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slsc}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slsc}{c} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slsc}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slsc}{ec} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slsc}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slsc}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slsc}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slsc}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slsc}{sc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slsc}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slsc}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slsc}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slsc}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slsc}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slsc}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slsc}{x} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slsx}{?m} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slsx}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slsx}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slsx}{c} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slsx}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slsx}{ec} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slsx}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slsx}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slsx}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slsx}{m?} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slsx}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slsx}{sc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slsx}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slsx}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slsx}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slsx}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slsx}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slsx}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slsx}{x} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sluc}{?m} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sluc}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sluc}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sluc}{c} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sluc}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sluc}{ec} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sluc}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sluc}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sluc}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sluc}{m?} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sluc}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sluc}{sc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sluc}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sluc}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sluc}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sluc}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sluc}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sluc}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sluc}{x} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slux}{?m} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slux}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slux}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slux}{c} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slux}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slux}{ec} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slux}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slux}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slux}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slux}{m?} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slux}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slux}{sc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slux}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slux}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slux}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slux}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slux}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slux}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slux}{x} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slx}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slx}{b}{bx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {slx}{c}{slc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {slx}{eb}{ebx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {slx}{ec}{slec}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {slx}{el}{elx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {slx}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slx}{l}{lx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {slx}{sb}{sbx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {slx}{sc}{slsc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {slx}{sl}{slx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {slx}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slx}{ub}{ubx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {slx}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slx}{ul}{ulx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {slx}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {slx}{x}{slx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {sl}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sl}{c}{slc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {sl}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sl}{ec}{slec}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {sl}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sl}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sl}{sc}{slsc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {sl}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sl}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sl}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sl}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sl}{x}{slx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {sx}{?m} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sx}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sx}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sx}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sx}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sx}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sx}{m?} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sx}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sx}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sx}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {sx}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubc}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubc}{b}{bc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubc}{c}{ubc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubc}{eb}{ebc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubc}{ec}{ubec}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubc}{el}{elc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubc}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubc}{l}{lc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubc}{sb}{sbc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubc}{sc}{ubsc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubc}{sl}{slc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubc}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubc}{ub}{ubc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubc}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubc}{ul}{ulc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubc}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubc}{x}{ubx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubec}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubec}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubec}{c} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubec}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubec}{ec} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubec}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubec}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubec}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubec}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubec}{sc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubec}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubec}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubec}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubec}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubec}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubec}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubec}{x} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubex}{?m} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubex}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubex}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubex}{c} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubex}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubex}{ec} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubex}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubex}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubex}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubex}{m?} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubex}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubex}{sc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubex}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubex}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubex}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubex}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubex}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubex}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubex}{x} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubsc}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubsc}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubsc}{c} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubsc}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubsc}{ec} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubsc}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubsc}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubsc}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubsc}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubsc}{sc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubsc}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubsc}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubsc}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubsc}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubsc}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubsc}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubsc}{x} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubsx}{?m} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubsx}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubsx}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubsx}{c} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubsx}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubsx}{ec} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubsx}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubsx}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubsx}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubsx}{m?} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubsx}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubsx}{sc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubsx}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubsx}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubsx}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubsx}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubsx}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubsx}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubsx}{x} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubuc}{?m} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubuc}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubuc}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubuc}{c} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubuc}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubuc}{ec} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubuc}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubuc}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubuc}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubuc}{m?} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubuc}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubuc}{sc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubuc}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubuc}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubuc}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubuc}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubuc}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubuc}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubuc}{x} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubux}{?m} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubux}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubux}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubux}{c} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubux}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubux}{ec} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubux}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubux}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubux}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubux}{m?} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubux}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubux}{sc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubux}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubux}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubux}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubux}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubux}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubux}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubux}{x} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubx}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubx}{b}{bx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubx}{c}{ubc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubx}{eb}{ebx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubx}{ec}{ubec}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubx}{el}{elx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubx}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubx}{l}{lx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubx}{sb}{sbx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubx}{sc}{ubsc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubx}{sl}{slx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubx}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubx}{ub}{ubx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubx}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubx}{ul}{ulx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubx}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ubx}{x}{ubx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ub}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ub}{c}{ubc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ub}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ub}{ec}{ubec}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ub}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ub}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ub}{sc}{ubsc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ub}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ub}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ub}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ub}{x}{ubx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {uc}{?m} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {uc}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {uc}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {uc}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {uc}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {uc}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {uc}{m?} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {uc}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {uc}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {uc}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {uc}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulc}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulc}{b}{bc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulc}{c}{ulc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulc}{eb}{ebc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulc}{ec}{ulec}{ulc}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulc}{el}{elc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulc}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulc}{l}{lc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulc}{sb}{sbc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulc}{sc}{ulsc}{ulc}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulc}{sl}{slc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulc}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulc}{ub}{ubc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulc}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulc}{ul}{ulc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulc}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulc}{x}{ulx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulec}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulec}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulec}{c} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulec}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulec}{ec} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulec}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulec}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulec}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulec}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulec}{sc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulec}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulec}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulec}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulec}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulec}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulec}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulec}{x} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulex}{?m} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulex}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulex}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulex}{c} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulex}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulex}{ec} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulex}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulex}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulex}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulex}{m?} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulex}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulex}{sc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulex}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulex}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulex}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulex}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulex}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulex}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulex}{x} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulsc}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulsc}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulsc}{c} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulsc}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulsc}{ec} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulsc}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulsc}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulsc}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulsc}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulsc}{sc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulsc}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulsc}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulsc}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulsc}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulsc}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulsc}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulsc}{x} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulsx}{?m} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulsx}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulsx}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulsx}{c} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulsx}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulsx}{ec} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulsx}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulsx}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulsx}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulsx}{m?} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulsx}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulsx}{sc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulsx}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulsx}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulsx}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulsx}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulsx}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulsx}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulsx}{x} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {uluc}{?m} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {uluc}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {uluc}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {uluc}{c} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {uluc}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {uluc}{ec} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {uluc}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {uluc}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {uluc}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {uluc}{m?} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {uluc}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {uluc}{sc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {uluc}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {uluc}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {uluc}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {uluc}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {uluc}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {uluc}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {uluc}{x} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulux}{?m} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulux}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulux}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulux}{c} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulux}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulux}{ec} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulux}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulux}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulux}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulux}{m?} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulux}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulux}{sc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulux}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulux}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulux}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulux}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulux}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulux}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulux}{x} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulx}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulx}{b}{bx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulx}{c}{ulc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulx}{eb}{ebx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulx}{ec}{ulec}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulx}{el}{elx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulx}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulx}{l}{lx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulx}{sb}{sbx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulx}{sc}{ulsc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulx}{sl}{slx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulx}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulx}{ub}{ubx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulx}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulx}{ul}{ulx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulx}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ulx}{x}{ulx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ul}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ul}{c}{ulc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ul}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ul}{ec}{ulec}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ul}{ex} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ul}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ul}{sc}{ulsc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ul}{sx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ul}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ul}{uc} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ul}{ux} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ul}{x}{ulx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {ux}{?m} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ux}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ux}{b} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ux}{eb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ux}{el} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ux}{l} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ux}{m?} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ux}{sb} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ux}{sl} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ux}{ub} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {ux}{ul} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {x}{bx} {} {}
+%<latexrelease>\DeclareFontSeriesChangeRule {x}{c}{c}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {x}{ec}{ec}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {x}{el}{elx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {x}{l}{lx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {x}{sc}{sc}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {x}{sl}{slx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {x}{ub}{ubx}{}
+%<latexrelease>\DeclareFontSeriesChangeRule {x}{ul}{ulx}{}
+%<latexrelease>
%<latexrelease>\EndIncludeInRelease
+% \end{macrocode}
+%
+% \begin{macrocode}
%<latexrelease>\IncludeInRelease{0000/00/00}%
%<latexrelease> {\DeclareFontSeriesChangeRule}{Series change rules}%
%<latexrelease>
@@ -713,7 +3388,7 @@
%
% \begin{macro}{\fontseries}
% The \cs{fontseries} command takes one argument which is the requested new
-% font series. In the original implementation it simply saved the
+% font series. In the original implementation it simply saved the
% expanded value in \cs{f@series}. Now we do a bit more processing
% and look up the final value in the font series data base. This is
% done by \cs{merge@font@series}. But the lookup should be done
@@ -1034,7 +3709,7 @@
% changed the default. However that means a) the above test will
% definitely fail (maybe something to change) and b) we better use
% \cs{edef} on the next line to get rid of it as otherwise the test
-% against \verb=#2= (e.g. \cs{bfdef@ult}) will fail in other places.
+% against \verb=#2= (e.g., \cs{bfdef@ult}) will fail in other places.
% \changes{v1.0e}{2020/05/19}{Need to use \cs{edef} (gh/336)}
% \begin{macrocode}
\edef#2{#1}%
@@ -1096,10 +3771,12 @@
% that is desirable), essentially building in an ``sc''
% axis.
%
+% \changes{v1.0k}{2024/12/11}{Reorganized the rollback data}
+%
% \begin{macrocode}
%<*2ekernel|latexrelease>
%<latexrelease>\IncludeInRelease{2020/02/02}%
-%<latexrelease> {\DeclareFontShapeChangeRule}{Font shape change rules}%
+%<latexrelease> {\ulcshape}{Font shape change rules}%
% \end{macrocode}
%
%
@@ -1175,14 +3852,24 @@
% \begin{macro}{\sscshape}
% \begin{macro}{\textssc}
% \begin{macro}{\sscdefault}
-% New command to select spaced small capitals. This is only here
-% because \texttt{fontaxes} offered it. There isn't a single free
-% font that supports it. However, some commercial ones do, so we
-% offer it so that at some point \texttt{fontaxes} could be
-% retired.
+%
+% New commands to select spaced small capitals. There isn't a
+% single free font that supports it. However, some commercial ones
+% do, so we offer it. It is also possible to produce spaced small
+% capitals from normal small capitals in OTF fonts using
+% \texttt{otftotfm} with calls such as
+%\begin{verbatim}
+% otftotfm -e TEXMF/fonts/enc/dvips/base/texnansx.enc \
+% SourceSerifPro-Regular.otf -fkern -fliga --feature=smcp \
+% --letterspacing=80 SourceSerifPro-Regular-ssc-LY1
+%\end{verbatim}
%
-% So far there aren't any rules for it---probably there should be
-% some putting it in the same category as \texttt{sc}.
+% Michael Ummels kindly prepared the necessary rules for
+% \texttt{ssc} ages ago, but until recently they managed to hide
+% deep down in my inbox. I finally got around to integrating them
+% (with a few changes) and I also took the opportunity to
+% rationalize (a bit) the rules for the only other uncommon shape,
+% \texttt{sw}.
% \begin{macrocode}
\DeclareRobustCommand\sscshape
{\not@math@alphabet\sscshape\relax
@@ -1195,26 +3882,75 @@
% \end{macro}
%
%
+% Supporting rollback \ldots
+% \begin{macrocode}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\ulcshape}{Font shape change rules}%
+%<latexrelease>
+%<latexrelease>\let\DeclareFontShapeChangeRule\@undefined
+%<latexrelease>\let\ulcshape\@undefined
+%<latexrelease>\let\ulcdefault\@undefined
+%<latexrelease>\let\swshape\@undefined
+%<latexrelease>\let\swdefault\@undefined
+%<latexrelease>\let\sscshape\@undefined
+%<latexrelease>\let\sscdefault\@undefined
+%<latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
+%
%
% \subsection{Mapping rules for shape combinations}
%
% Many of the entries are commented out as we will get that result
% without any entry.
% \begin{macrocode}
-%\DeclareFontShapeChangeRule {n}{n} {n} {}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2025/06/01}%
+%<latexrelease> {\DeclareFontShapeChangeRule}{Rules for ssc and sw}%
+%
+% \DeclareFontShapeChangeRule {n}{n} {n} {}
\DeclareFontShapeChangeRule {n}{it} {it} {sl}
\DeclareFontShapeChangeRule {n}{sl} {sl} {it}
-%\DeclareFontShapeChangeRule {n}{sw} {sw} {}
-%\DeclareFontShapeChangeRule {n}{sc} {sc} {}
+% \end{macrocode}
+% If \texttt{sw} is requested but not available (not many font
+% families offer it) we try to fallback to \texttt{it} instead of
+% \texttt{sw}. That isn't always perfect, because some swash shapes
+% are actually upright, but it is only a fallback and most of the
+% time it would be better than \texttt{n}.
+% \changes{v1.0k}{2024/12/11}{Rationalize \texttt{sw} shape change
+% rules (gh/1581)}
+% \begin{macrocode}
+\DeclareFontShapeChangeRule {n}{sw} {sw} {it}
+% \DeclareFontShapeChangeRule {n}{sc} {sc} {}
\DeclareFontShapeChangeRule {n}{ulc} {n} {}
-\DeclareFontShapeChangeRule {n}{up} {n} {}
+\DeclareFontShapeChangeRule {n}{up} {n} {}
+% \end{macrocode}
+% For the \texttt{ssc} shape we make the following general
+% assumptions: if \texttt{ssc}\meta{X} exists then
+% \texttt{sc}\meta{X} and \meta{X} also exist in the font. If the
+% \texttt{ssc}\meta{X} shape doesn't exist but the user had asked
+% for \texttt{ssc} we try to replace it by \texttt{sc} because we
+% then assume that the current font family simply doesn't have any
+% \texttt{ssc} shapes. However, if we are already in some
+% \texttt{ssc} shape and a shape change is requested we know that at
+% least some \texttt{ssc} shapes exist for the current font family,
+% so rather than falling back to some \texttt{sc} shape we try to stay
+% within \texttt{ssc} shapes in a fallback situation.
+% \changes{v1.0k}{2024/12/11}{Add \texttt{ssc} shape change
+% rules (gh/1581)}
+% \begin{macrocode}
+\DeclareFontShapeChangeRule {n}{ssc} {ssc} {sc}
% \end{macrocode}
%
% \begin{macrocode}
-%\DeclareFontShapeChangeRule {it}{n} {n} {}
-%\DeclareFontShapeChangeRule {it}{it} {it} {}
+% \DeclareFontShapeChangeRule {it}{n} {n} {}
+% \DeclareFontShapeChangeRule {it}{it} {it} {}
\DeclareFontShapeChangeRule {it}{sl} {sl} {it}
-%\DeclareFontShapeChangeRule {it}{sw} {sw} {}
+\DeclareFontShapeChangeRule {it}{sw} {sw} {it}
% \end{macrocode}
% If neither \texttt{scit} nor \texttt{scsl} exist then \texttt{sc}
% will be used as a fallback albeit with a log entry, so except for
@@ -1222,32 +3958,35 @@
% \begin{macrocode}
\DeclareFontShapeChangeRule {it}{sc} {scit} {scsl}
\DeclareFontShapeChangeRule {it}{ulc} {it} {}
-\DeclareFontShapeChangeRule {it}{up} {n} {}
+\DeclareFontShapeChangeRule {it}{up} {n} {}
+\DeclareFontShapeChangeRule {it}{ssc} {sscit} {scit}
% \end{macrocode}
%
% \begin{macrocode}
-%\DeclareFontShapeChangeRule {sl}{n} {n} {}
+% \DeclareFontShapeChangeRule {sl}{n} {n} {}
\DeclareFontShapeChangeRule {sl}{it} {it} {sl}
-%\DeclareFontShapeChangeRule {sl}{sl} {sl} {}
-%\DeclareFontShapeChangeRule {sl}{sw} {sw} {}
+% \DeclareFontShapeChangeRule {sl}{sl} {sl} {}
+\DeclareFontShapeChangeRule {sl}{sw} {sw} {it}
\DeclareFontShapeChangeRule {sl}{sc} {scsl} {scit}
\DeclareFontShapeChangeRule {sl}{ulc} {sl} {}
-\DeclareFontShapeChangeRule {sl}{up} {n} {}
+\DeclareFontShapeChangeRule {sl}{up} {n} {}
+\DeclareFontShapeChangeRule {sl}{ssc} {sscsl} {scsl}
% \end{macrocode}
%
% \begin{macrocode}
-%\DeclareFontShapeChangeRule {sc}{n} {n} {}
+% \DeclareFontShapeChangeRule {sc}{n} {n} {}
\DeclareFontShapeChangeRule {sc}{it} {scit} {scsl}
\DeclareFontShapeChangeRule {sc}{sl} {scsl} {scit}
-\DeclareFontShapeChangeRule {sc}{sw} {scsw} {sw}
-%\DeclareFontShapeChangeRule {sc}{sc} {sc} {}
-\DeclareFontShapeChangeRule {sc}{ulc} {n} {}
+\DeclareFontShapeChangeRule {sc}{sw} {scsw} {scit}
+% \DeclareFontShapeChangeRule {sc}{sc} {sc} {}
+\DeclareFontShapeChangeRule {sc}{ulc} {n} {}
% \end{macrocode}
%
-% 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 \cs{sc} or
+% The next rule might be a bit surprising, and rightly so.
+% It would be more correct if \texttt{sc}
+% were not affected by \texttt{up}, so that it
+% remains \texttt{sc} as shown in the commented out rule. However,
+% for nearly three decades commands such as \cs{upshape} or
% \cs{textup} changed small caps back to the ``normal'' shape. So
% for backward compatibility we keep that behavior.
%
@@ -1260,77 +3999,220 @@
% compatible with the way \texttt{fontspec} behaved. Still it
% remains an oddity which I would rather liked to have avoided.
% \begin{macrocode}
-%\DeclareFontShapeChangeRule {sc}{up} {sc} {}
+% \DeclareFontShapeChangeRule {sc}{up} {sc} {}
\DeclareFontShapeChangeRule {sc}{up} {n} {}
+% \DeclareFontShapeChangeRule {sc}{ssc} {ssc} {}
% \end{macrocode}
%
% \begin{macrocode}
-%\DeclareFontShapeChangeRule {scit}{n} {n} {}
+% \DeclareFontShapeChangeRule {scit}{n} {n} {}
\DeclareFontShapeChangeRule {scit}{it} {scit} {}
\DeclareFontShapeChangeRule {scit}{sl} {scsl} {scit}
-\DeclareFontShapeChangeRule {scit}{sw} {scsw} {sc} % or scit?
+\DeclareFontShapeChangeRule {scit}{sw} {scsw} {scit}
\DeclareFontShapeChangeRule {scit}{sc} {scit} {}
\DeclareFontShapeChangeRule {scit}{ulc} {it} {}
-\DeclareFontShapeChangeRule {scit}{up} {sc} {}
% \end{macrocode}
-% The previous rule assumes that if \texttt{scit} exists then
+% The next rule assumes that if \texttt{scit} exists then
% \texttt{it} exists as well. If not, the mechanism will save
-% \texttt{ulc} in \cs{f@series} which most certainly doesn't
+% \texttt{ulc} in \cs{f@series}, which most certainly doesn't
% exist. So when a font is later selected that would result in a
% substitution (so no harm done really). Alternatively, we could in
% this case use \texttt{n} as alternative, which may be a bit
% faster, but such a setup would be so weird in the first place
% that this isn't worth the effort.
-%
% \begin{macrocode}
-%\DeclareFontShapeChangeRule {scsl}{n} {n} {}
+\DeclareFontShapeChangeRule {scit}{up} {sc} {}
+\DeclareFontShapeChangeRule {scit}{ssc} {sscit} {scit}
+% \end{macrocode}
+%
+% \begin{macrocode}
+% \DeclareFontShapeChangeRule {scsl}{n} {n} {}
\DeclareFontShapeChangeRule {scsl}{it} {scit} {scsl}
\DeclareFontShapeChangeRule {scsl}{sl} {scsl} {}
-\DeclareFontShapeChangeRule {scsl}{sw} {scsw} {sc} % or scsl?
+\DeclareFontShapeChangeRule {scsl}{sw} {scsw} {scsl}
\DeclareFontShapeChangeRule {scsl}{sc} {scsl} {}
\DeclareFontShapeChangeRule {scsl}{ulc} {sl} {}
-\DeclareFontShapeChangeRule {scsl}{up} {sc} {}
+\DeclareFontShapeChangeRule {scsl}{up} {sc} {}
+\DeclareFontShapeChangeRule {scsl}{ssc} {sscsl} {scsl}
% \end{macrocode}
%
% \begin{macrocode}
-%\DeclareFontShapeChangeRule {scsw}{n} {n} {}
+% \DeclareFontShapeChangeRule {scsw}{n} {n} {}
\DeclareFontShapeChangeRule {scsw}{it} {scit} {scsw}
\DeclareFontShapeChangeRule {scsw}{sl} {scsl} {}
\DeclareFontShapeChangeRule {scsw}{sw} {scsw} {}
\DeclareFontShapeChangeRule {scsw}{sc} {scsw} {}
\DeclareFontShapeChangeRule {scsw}{ulc} {sw} {}
-\DeclareFontShapeChangeRule {scsw}{up} {sc} {}
+\DeclareFontShapeChangeRule {scsw}{up} {sc} {}
+\DeclareFontShapeChangeRule {scsw}{ssc} {sscsw} {scsw}
% \end{macrocode}
%
% \begin{macrocode}
-%\DeclareFontShapeChangeRule {sw}{n} {n} {}
-%\DeclareFontShapeChangeRule {sw}{it} {it} {}
-%\DeclareFontShapeChangeRule {sw}{sl} {sl} {}
-%\DeclareFontShapeChangeRule {sw}{sw} {sw} {}
-\DeclareFontShapeChangeRule {sw}{sc} {scsw} {}
+% \DeclareFontShapeChangeRule {sw}{n} {n} {}
+% \DeclareFontShapeChangeRule {sw}{it} {it} {}
+% \DeclareFontShapeChangeRule {sw}{sl} {sl} {}
+% \DeclareFontShapeChangeRule {sw}{sw} {sw} {}
+\DeclareFontShapeChangeRule {sw}{sc} {scsw} {scit}
\DeclareFontShapeChangeRule {sw}{ulc} {sw} {}
-\DeclareFontShapeChangeRule {sw}{up} {n} {}
+\DeclareFontShapeChangeRule {sw}{up} {n} {}
+\DeclareFontShapeChangeRule {sw}{ssc} {sscsw} {scsw}
+% \end{macrocode}
+%
+% \begin{macrocode}
+% \DeclareFontShapeChangeRule {ssc}{n} {n} {}
+\DeclareFontShapeChangeRule {ssc}{it} {sscit} {sscsl}
+\DeclareFontShapeChangeRule {ssc}{sl} {sscsl} {sscit}
+\DeclareFontShapeChangeRule {ssc}{sw} {sscsw} {sscit}
+\DeclareFontShapeChangeRule {ssc}{sc} {sc} {}
+% \DeclareFontShapeChangeRule {ssc}{ssc} {ssc} {}
+\DeclareFontShapeChangeRule {ssc}{ulc} {n} {}
+% \end{macrocode}
+% We implement the same logic as for \texttt{sc}, see above. The
+% \texttt{ssc} shape doesn't have to care about 30 years of history,
+% but it would be surprising if \cs{sscshape}\cs{upshape} did not
+% work like \cs{scshape}\cs{upshape}.
+% \begin{macrocode}
+% \DeclareFontShapeChangeRule {ssc}{up} {ssc} {}
+\DeclareFontShapeChangeRule {ssc}{up} {n} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+% \DeclareFontShapeChangeRule {sscit}{n} {n} {}
+\DeclareFontShapeChangeRule {sscit}{it} {sscit} {}
+\DeclareFontShapeChangeRule {sscit}{sl} {sscsl} {sscit}
+\DeclareFontShapeChangeRule {sscit}{sw} {sscsw} {sscit}
+\DeclareFontShapeChangeRule {sscit}{ssc} {sscit} {}
+\DeclareFontShapeChangeRule {sscit}{sc} {scit} {}
+\DeclareFontShapeChangeRule {sscit}{ulc} {it} {}
+\DeclareFontShapeChangeRule {sscit}{up} {ssc} {}
% \end{macrocode}
%
-% Supporting rollback \ldots
% \begin{macrocode}
+% \DeclareFontShapeChangeRule {sscsl}{n} {n} {}
+\DeclareFontShapeChangeRule {sscsl}{it} {sscit} {sscsl}
+\DeclareFontShapeChangeRule {sscsl}{sl} {sscsl} {}
+\DeclareFontShapeChangeRule {sscsl}{sw} {sscsw} {sscit}
+\DeclareFontShapeChangeRule {sscsl}{sc} {scsl} {}
+\DeclareFontShapeChangeRule {sscsl}{ulc} {sl} {}
+\DeclareFontShapeChangeRule {sscsl}{up} {ssc} {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+% \DeclareFontShapeChangeRule {sscsw}{n} {n} {}
+\DeclareFontShapeChangeRule {sscsw}{it} {sscit} {sscsl}
+\DeclareFontShapeChangeRule {sscsw}{sl} {sscsl} {sscit}
+\DeclareFontShapeChangeRule {sscsw}{sw} {sscsw} {}
+\DeclareFontShapeChangeRule {sscsw}{ssc} {sscsw} {}
+\DeclareFontShapeChangeRule {sscsw}{sc} {scsw} {scit}
+\DeclareFontShapeChangeRule {sscsw}{ulc} {sw} {it}
+\DeclareFontShapeChangeRule {sscsw}{up} {ssc} {}
%</2ekernel|latexrelease>
%<latexrelease>\EndIncludeInRelease
-%<latexrelease>\IncludeInRelease{0000/00/00}%
-%<latexrelease> {\DeclareFontShapeChangeRule}{Font shape change rules}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\IncludeInRelease{2020/02/02}%
+%<latexrelease> {\DeclareFontShapeChangeRule}{Rules for ssc and sw}%
%<latexrelease>
-%<latexrelease>\let\DeclareFontShapeChangeRule\@undefined
-%<latexrelease>\let\ulcshape\@undefined
-%<latexrelease>\let\ulcdefault\@undefined
-%<latexrelease>\let\swshape\@undefined
-%<latexrelease>\let\swdefault\@undefined
-%<latexrelease>\let\sscshape\@undefined
-%<latexrelease>\let\sscdefault\@undefined
+%<latexrelease>\DeclareFontShapeChangeRule {n}{it} {it} {sl}
+%<latexrelease>\DeclareFontShapeChangeRule {n}{sl} {sl} {it}
+%<latexrelease>\DeclareFontShapeChangeRule {n}{ulc} {n} {}
+%<latexrelease>\DeclareFontShapeChangeRule {n}{up} {n} {}
+%<latexrelease>\DeclareFontShapeChangeRule {it}{sl} {sl} {it}
+%<latexrelease>\DeclareFontShapeChangeRule {it}{sc} {scit} {scsl}
+%<latexrelease>\DeclareFontShapeChangeRule {it}{ulc} {it} {}
+%<latexrelease>\DeclareFontShapeChangeRule {it}{up} {n} {}
+%<latexrelease>\DeclareFontShapeChangeRule {sl}{it} {it} {sl}
+%<latexrelease>\DeclareFontShapeChangeRule {sl}{sc} {scsl} {scit}
+%<latexrelease>\DeclareFontShapeChangeRule {sl}{ulc} {sl} {}
+%<latexrelease>\DeclareFontShapeChangeRule {sl}{up} {n} {}
+%<latexrelease>\DeclareFontShapeChangeRule {sc}{it} {scit} {scsl}
+%<latexrelease>\DeclareFontShapeChangeRule {sc}{sl} {scsl} {scit}
+%<latexrelease>\DeclareFontShapeChangeRule {sc}{sw} {scsw} {sw}
+%<latexrelease>\DeclareFontShapeChangeRule {sc}{ulc} {n} {}
+%<latexrelease>\DeclareFontShapeChangeRule {sc}{up} {n} {}
+%<latexrelease>\DeclareFontShapeChangeRule {scit}{it} {scit} {}
+%<latexrelease>\DeclareFontShapeChangeRule {scit}{sl} {scsl} {scit}
+%<latexrelease>\DeclareFontShapeChangeRule {scit}{sw} {scsw} {sc} % or scit?
+%<latexrelease>\DeclareFontShapeChangeRule {scit}{sc} {scit} {}
+%<latexrelease>\DeclareFontShapeChangeRule {scit}{ulc} {it} {}
+%<latexrelease>\DeclareFontShapeChangeRule {scit}{up} {sc} {}
+%<latexrelease>\DeclareFontShapeChangeRule {scsl}{it} {scit} {scsl}
+%<latexrelease>\DeclareFontShapeChangeRule {scsl}{sl} {scsl} {}
+%<latexrelease>\DeclareFontShapeChangeRule {scsl}{sw} {scsw} {sc} % or scsl?
+%<latexrelease>\DeclareFontShapeChangeRule {scsl}{sc} {scsl} {}
+%<latexrelease>\DeclareFontShapeChangeRule {scsl}{ulc} {sl} {}
+%<latexrelease>\DeclareFontShapeChangeRule {scsl}{up} {sc} {}
+%<latexrelease>\DeclareFontShapeChangeRule {scsw}{it} {scit} {scsw}
+%<latexrelease>\DeclareFontShapeChangeRule {scsw}{sl} {scsl} {}
+%<latexrelease>\DeclareFontShapeChangeRule {scsw}{sw} {scsw} {}
+%<latexrelease>\DeclareFontShapeChangeRule {scsw}{sc} {scsw} {}
+%<latexrelease>\DeclareFontShapeChangeRule {scsw}{ulc} {sw} {}
+%<latexrelease>\DeclareFontShapeChangeRule {scsw}{up} {sc} {}
+%<latexrelease>\DeclareFontShapeChangeRule {sw}{sc} {scsw} {}
+%<latexrelease>\DeclareFontShapeChangeRule {sw}{ulc} {sw} {}
+%<latexrelease>\DeclareFontShapeChangeRule {sw}{up} {n} {}
+%<latexrelease>
+% \end{macrocode}
+% In 2022-02-02 the \texttt{ssc} shape had no rules, so
+% that any use of it would have resulted in just switching to
+% that shape or switching away from it; so we mimic that by
+% providing the corresponding trivial rules to overrule those
+% from above when we roll back.
+% \begin{macrocode}
+%<latexrelease>\DeclareFontShapeChangeRule {n}{ssc} {ssc} {}
+%<latexrelease>\DeclareFontShapeChangeRule {it}{ssc} {ssc} {}
+%<latexrelease>\DeclareFontShapeChangeRule {sl}{ssc} {ssc} {}
+%<latexrelease>\DeclareFontShapeChangeRule {sw}{ssc} {ssc} {}
+%<latexrelease>
+%<latexrelease>\DeclareFontShapeChangeRule {scit}{ssc}{ssc} {}
+%<latexrelease>\DeclareFontShapeChangeRule {scsl}{ssc}{ssc} {}
+%<latexrelease>\DeclareFontShapeChangeRule {scsw}{ssc}{ssc} {}
%<latexrelease>
+%<latexrelease>\DeclareFontShapeChangeRule {ssc}{it} {it} {}
+%<latexrelease>\DeclareFontShapeChangeRule {ssc}{sl} {sl} {}
+%<latexrelease>\DeclareFontShapeChangeRule {ssc}{sw} {sw} {}
+%<latexrelease>\DeclareFontShapeChangeRule {ssc}{sc} {sc} {}
+%<latexrelease>\DeclareFontShapeChangeRule {ssc}{ulc} {n} {}
+%<latexrelease>\DeclareFontShapeChangeRule {ssc}{up} {n} {}
+%<latexrelease>
+%<latexrelease>\DeclareFontShapeChangeRule {sscit}{it} {it} {}
+%<latexrelease>\DeclareFontShapeChangeRule {sscit}{sl} {sl} {}
+%<latexrelease>\DeclareFontShapeChangeRule {sscit}{sw} {sw} {}
+%<latexrelease>\DeclareFontShapeChangeRule {sscit}{ssc} {ssc}{}
+%<latexrelease>\DeclareFontShapeChangeRule {sscit}{sc} {sc} {}
+%<latexrelease>\DeclareFontShapeChangeRule {sscit}{ulc} {n} {}
+%<latexrelease>\DeclareFontShapeChangeRule {sscit}{up} {ssc}{}
+%<latexrelease>
+%<latexrelease>\DeclareFontShapeChangeRule {sscsl}{it} {it} {}
+%<latexrelease>\DeclareFontShapeChangeRule {sscsl}{sl} {sl} {}
+%<latexrelease>\DeclareFontShapeChangeRule {sscsl}{sw} {sw} {}
+%<latexrelease>\DeclareFontShapeChangeRule {sscsl}{sc} {sc} {}
+%<latexrelease>\DeclareFontShapeChangeRule {sscsl}{ulc} {n} {}
+%<latexrelease>\DeclareFontShapeChangeRule {sscsl}{up} {ssc}{}
+%<latexrelease>
+%<latexrelease>\DeclareFontShapeChangeRule {sscsw}{it} {it} {}
+%<latexrelease>\DeclareFontShapeChangeRule {sscsw}{sl} {sl} {}
+%<latexrelease>\DeclareFontShapeChangeRule {sscsw}{sw} {sw} {}
+%<latexrelease>\DeclareFontShapeChangeRule {sscsw}{ssc} {ssc}{}
+%<latexrelease>\DeclareFontShapeChangeRule {sscsw}{sc} {sc} {}
+%<latexrelease>\DeclareFontShapeChangeRule {sscsw}{ulc} {n} {}
+%<latexrelease>\DeclareFontShapeChangeRule {sscsw}{up} {ssc}{}
+%<latexrelease>\EndIncludeInRelease
+% \end{macrocode}
+% Before 2020-02-02 we don't really care about any existing shape
+% change rules since the mechanism isn't used.
+% \begin{macrocode}
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\DeclareFontShapeChangeRule}{Rules for ssc and sw}%
%<latexrelease>\EndIncludeInRelease
% \end{macrocode}
%
%
+
+
+
+
% \subsection{Changing to a new shape}
%
%
diff --git a/Master/texmf-dist/source/latex-dev/base/ltfssbas.dtx b/Master/texmf-dist/source/latex-dev/base/ltfssbas.dtx
index 4e376d3761a..53638235fb3 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltfssbas.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltfssbas.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -35,7 +35,7 @@
%
%
\ProvidesFile{ltfssbas.dtx}
- [2024/11/19 v3.2n LaTeX Kernel (NFSS Basic Macros)]
+ [2025/02/20 v3.2p LaTeX Kernel (NFSS Basic Macros)]
% \iffalse
\documentclass{ltxdoc}
\begin{document}
@@ -705,8 +705,25 @@
% For usage examples see definitions in \texttt{lttextcomp.dtx}.
%
% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2025/06/01}%
+%<latexrelease> {\CheckEncodingSubset}{preload .fd file}%
+% \end{macrocode}
+%
+% \begin{macrocode}
\def\CheckEncodingSubset#1#2#3#4#5{%
- \ifnum #4>%
+% \end{macrocode}
+% If the \texttt{.fd} is not yet loaded we make an attempt to load
+% it now because it may contain a \cs{DeclareEncodingSubset}
+% declaration for the font.
+% \changes{v3.2p}{2025/02/20}{If necessary, load the \texttt{.fd}
+% before checking the encoding subset (gh/1669)}
+% \begin{macrocode}
+ \expandafter\ifx\csname #2:\f@family\endcsname\relax
+ \LoadFontDefinitionFile{#2}\f@family
+ \fi
+ \ifnum #4>%
\expandafter\ifx\csname #2:\f@family\endcsname\relax
0\csname #2:?\endcsname
\else
@@ -720,6 +737,28 @@
{#1{#2}}{#3}%
#5%
}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\CheckEncodingSubset}{preload .fd file}%
+%<latexrelease>
+%<latexrelease>\def\CheckEncodingSubset#1#2#3#4#5{%
+%<latexrelease> \ifnum #4>%
+%<latexrelease> \expandafter\ifx\csname #2:\f@family\endcsname\relax
+%<latexrelease> 0\csname #2:?\endcsname
+%<latexrelease> \else
+%<latexrelease> \csname #2:\f@family\endcsname
+%<latexrelease> \fi
+%<latexrelease> \relax
+%<latexrelease> \expandafter\@firstoftwo
+%<latexrelease> \else
+%<latexrelease> \expandafter\@secondoftwo
+%<latexrelease> \fi
+%<latexrelease> {#1{#2}}{#3}%
+%<latexrelease> #5%
+%<latexrelease>}
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
% \end{macro}
%
@@ -1184,18 +1223,28 @@
% \changes{v1.2g}{1990/02/16}{\cs{@nomath} added.}
% \changes{v2.1a}{1994/01/17}{New math font setup}
% \changes{v3.2l}{2023/04/01}{Reset frozen mathversion gh/1028}
+% \changes{v3.2o}{2024/11/30}{New appoach to
+% \texttt{localmathalphabets} (gh/1101)}
% \begin{macrocode}
\DeclareRobustCommand\mathversion[1]
{\@nomath\mathversion
\expandafter\ifx\csname mv@#1\endcsname\relax
\@latex@error{Math version `#1' is not defined}\@eha\else
% \end{macrocode}
-% If there has been a frozen math version reset locally. See GH 1028.
-% \begin{macrocode}
- \ifcsname mv@\math@version @frozen\endcsname
- \expandafter\let
- \csname mv@\math@version @frozen\expandafter\endcsname
- \csname mv@\math@version\endcsname
+% If there has been a frozen math version reset unconditionally to
+% it if we are at \cs{@math@level} one, so that in the typical case
+% of one bold symbol within the normal version this doesn't
+% allocate an additional math alphabet.
+% If the nesting is deeper we do nothing, which means
+% alphabet allocations accumulate until the end of the formula. One
+% could do slightly better but that would mean keeping track of the
+% allocations on all levels severately and this is likely to be
+% overkill in nearly all situations.
+% \begin{macrocode}
+ \ifcsname mv@#1@frozen\endcsname
+ \ifnum \@math@level = \@ne
+ \unconditionally@reset@math@version {#1}%
+ \fi
\fi
% \end{macrocode}
% \begin{macrocode}
@@ -1220,6 +1269,21 @@
\aftergroup\glb@settings
\fi}
% \end{macrocode}
+%
+% Reseting the math version unconditionally means that we have to
+% copy the frozen version to \verb=\mv@#1= and also reset the
+% counter \verb=\c@mv@#1= to the number of math alphabets allocated
+% in the frozen version.
+% \changes{v3.2o}{2024/11/30}{New appoach to
+% \texttt{localmathalphabets} (gh/1101)}
+% \begin{macrocode}
+\ExplSyntaxOn
+\cs_new_protected:Npn \unconditionally@reset@math@version #1 {
+ \cs_gset_eq:cc { mv@#1 }{ mv@#1@frozen }
+ \int_gset:cn { c@mv@#1 }{ \tl_use:c {g__nfss_frozen_mv_ #1 _tl} }
+}
+\ExplSyntaxOff
+% \end{macrocode}
% \end{macro}
% \end{macro}
%
@@ -1273,6 +1337,14 @@
%
%
+% \begin{macro}{\@math@level}
+% This counter records the nesting level of math within math.
+% \changes{v3.2o}{2024/11/30}{New appoach to
+% \texttt{localmathalphabets} (gh/1101)}
+% \begin{macrocode}
+\newcount\@math@level
+% \end{macrocode}
+% \end{macro}
%
% \begin{macro}{\frozen@everydisplay}
% \changes{v2.1a}{1994/01/17}{New math font setup}
@@ -1291,6 +1363,8 @@
% \changes{v3.2k}{2022/07/04}{Ignore spaces if necessary (gh/886)}
% The issue with handling of spaces was found in 2022, but it is
% really a bug fix for the code added in 2021/11.
+% \changes{v3.2o}{2024/11/30}{New appoach to
+% \texttt{localmathalphabets} (gh/1101)}
% \begin{macrocode}
%</2ekernel>
%<latexrelease>\IncludeInRelease{2021/11/15}
@@ -1298,10 +1372,17 @@
%<*2ekernel|latexrelease>
\frozen@everydisplay = {%
\aftergroup\@ignoretrue \aftergroup\ignorespaces
+% \end{macrocode}
+% Record that we entered another math level.
+% \changes{v3.2o}{2024/11/30}{New appoach to
+% \texttt{localmathalphabets} (gh/1101)}
+% \begin{macrocode}
+ \advance\@math@level\@ne
\check@mathfonts
\the\everydisplay}
% \end{macrocode}
% \end{macro}
+%
% \begin{macro}{\frozen@everymath}
@@ -1312,6 +1393,12 @@
% \begin{macrocode}
\frozen@everymath = {%
\aftergroup\@ignorefalse
+% \end{macrocode}
+% Record that we entered another math level.
+% \changes{v3.2o}{2024/11/30}{New appoach to
+% \texttt{localmathalphabets} (gh/1101)}
+% \begin{macrocode}
+ \advance\@math@level\@ne
\check@mathfonts
\the\everymath}
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex-dev/base/ltfsscmp.dtx b/Master/texmf-dist/source/latex-dev/base/ltfsscmp.dtx
index 57c94ea6889..893172d95a9 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltfsscmp.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltfsscmp.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/Master/texmf-dist/source/latex-dev/base/ltfssdcl.dtx b/Master/texmf-dist/source/latex-dev/base/ltfssdcl.dtx
index c88fe6e1b8d..15d6cb3acdf 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltfssdcl.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltfssdcl.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -36,7 +36,7 @@
%
%
\ProvidesFile{ltfssdcl.dtx}
- [2024/11/19 v3.1c LaTeX Kernel (NFSS Declarative Interface)]
+ [2024/11/27 v3.1d LaTeX Kernel (NFSS Declarative Interface)]
% \iffalse
\documentclass{ltxdoc}
\begin{document}
@@ -714,33 +714,67 @@
% \begin{macrocode}
\cs_gset:cpn{mv@#1@reset}
{
+% \end{macrocode}
+% If we are back at top-level, or more precisely outside of any
+% (nested) math, we may have to reset the math version back to its
+% frozen version, if that exists and has fewer alphabets allocated.
+% \changes{v3.1d}{2024/11/27}{Reset math version if necessary (gh/1101 and gh/1028)}
+% \begin{macrocode}
+ \int_compare:nNnTF \@math@level = 0
+ {
\int_compare:nNnTF { \int_use:c{c@mv@#1} } >
{ \tl_use:c{g__nfss_frozen_mv_ #1 _tl} }
{
- \@font@info{Undo~ math~ alphabet~ allocation~ in~ version~ #1}
+ \@font@info{ Undo~ math~ alphabet~ allocation~ in~ version~ #1 }
% \end{macrocode}
% If the undo is necessary, we restore the \cs{mv@\meta{version}} code.
% \begin{macrocode}
\cs_gset_eq:cc { mv@#1 }{ mv@#1@frozen }
\int_gset:cn { c@mv@#1 }{ \tl_use:c {g__nfss_frozen_mv_ #1 _tl} }
% \end{macrocode}
-% But we also should undo changes to the math alphabet
+% But we also should undo changes to the top-level math alphabet
% definitions. We therefore run this code with a modified
% definition for \cs{getanddefine@fonts} because there is no need
% to do anything to the symbol fonts that are permanently allocated.
-% \begin{macrocode}
- \group_begin:
- \cs_set_eq:NN \getanddefine@fonts \use_none:nn
- \use:c {mv@#1}
- \group_end:
+% However, we do this only if the resetting was for the current
+% math version, because otherwise we would give the top-level
+% definitions the values for the last math version being resetted
+% (e.g., bold if there are just two).
+% \changes{v3.1d}{2024/11/27}{Reset top-level alphabet definitions
+% only for the current math version (gh/1101 and gh/1028)}
+% \begin{macrocode}
+ \tl_if_eq:NnTF \math@version {#1}
+ {
+ \group_begin:
+ \cs_set_eq:NN \getanddefine@fonts \use_none:nn
+ \use:c {mv@ \math@version }
+ \group_end:
+ }
+ {
+% \end{macrocode}
+% Once we have hit the boundary and have to revert to the frozen
+% version that happens quite often, but typically only for the
+% normal version. Thus, it is better to report only when we do not
+% revert the top-level definition as this is the exceptional case
+% and happens only if several math versions are used in parallel.
+% \begin{macrocode}
+ \@font@info{ ...~ but~ do~ not~ reset~ the~
+ top-level~ math~ alphabet~ definitions }
+ }
}
{
% \end{macrocode}
% If there was no change, we report that in the log (but this
% branch could go completely).
% \begin{macrocode}
- \@font@info{No~ math~ alphabet~ change~ to~ frozen~ version~ #1}
+ \@font@info{ No~ math~ alphabet~ change~
+ to~ frozen~ version~ #1 }
}
+ }
+ {
+ \@font@info{ Nested~ math:~ keeping~ math~ alphabet~
+ allocation~ in~ version~ #1}
+ }
% \end{macrocode}
% If this is executed after a math display, we may have to arrange
% for ignoring spaces, because they are now hidden if
diff --git a/Master/texmf-dist/source/latex-dev/base/ltfssini.dtx b/Master/texmf-dist/source/latex-dev/base/ltfssini.dtx
index 79e8546915e..7df7484301d 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltfssini.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltfssini.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/Master/texmf-dist/source/latex-dev/base/ltfsstrc.dtx b/Master/texmf-dist/source/latex-dev/base/ltfsstrc.dtx
index 6ce92f61687..9b91383e75c 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltfsstrc.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltfsstrc.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/Master/texmf-dist/source/latex-dev/base/lthooks.dtx b/Master/texmf-dist/source/latex-dev/base/lthooks.dtx
index 0c33c022e3b..df43dbd84b6 100644
--- a/Master/texmf-dist/source/latex-dev/base/lthooks.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/lthooks.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2020-2024
+% Copyright (C) 2020-2025
% Frank Mittelbach, Phelype Oleinik, The LaTeX Project
%
% This file is part of the LaTeX base system.
@@ -32,7 +32,7 @@
%<*driver>
% \fi
\ProvidesFile{lthooks.dtx}
- [2024/10/29 v1.1k LaTeX Kernel (hooks)]
+ [2025/02/05 v1.1l LaTeX Kernel (hooks)]
% \iffalse
%
\documentclass{l3doc}
@@ -76,7 +76,7 @@
% Hooks are points in the code of commands or environments where it
% is possible to add processing code into existing commands. This
% can be done by different packages that do not know about each
-% other and to allow for hopefully safe processing it is necessary
+% other, and to allow for hopefully safe processing it is necessary
% to sort different chunks of code added by different packages into
% a suitable processing order.
%
@@ -113,7 +113,7 @@
%
% With a few exceptions, hooks have to be declared before they can
% be used. The exceptions are the generic hooks for commands and
-% environments (executed at \cs{begin} and \cs{end}), and the
+% environments (executed at \cs{begin} and \cs{end}), and the generic
% hooks run when loading files (see section~\ref{sec:generic}).
%
% \begin{function}{\NewHook}
@@ -249,6 +249,12 @@
%
% \subsubsection{Using hooks in code}
%
+% Using a hook that is executing the code that has been associated
+% with it is only allowed if the hook has been previously declared
+% with \cs{NewHook}. For performance reason there are no runtime
+% checks for this and it is the responsibility of the programmer of a
+% package to ensure that all hooks that are used in a package (with
+% one of the commands in this section) are declared first.
%
% \begin{function}{\UseHook}
% \begin{syntax}
@@ -340,6 +346,16 @@
%
% \subsubsection{Updating code for hooks}
%
+% In contrast to the commands from the previous section, declarations
+% such as \cs{AddToHook} or \cs{DeclareHookRule} can be
+% used even when the hook is not yet declared. The rationale is that
+% the hook declaration may be in some package that is loaded later, or
+% perhaps not loaded at all.
+%
+% A side effect of this design is that misspellings do not raise an
+% error but are simply regarded as declarations for hooks with a
+% different name.
+%
% \begin{function}{\AddToHook}
% \begin{syntax}
% \cs{AddToHook} \Arg{hook} \oarg{label} \Arg{code}
@@ -441,18 +457,20 @@
% A useful application for this declaration inside the document body
% is when one wants to temporarily add code to hooks and later remove
% it again, e.g.,
+% \changes{v1.1l}{2025/01/03}{Correct example to use \texttt{env/quote/begin}
+% instead of \texttt{/before} (gh/1599)}
%\begin{verbatim}
-% \AddToHook{env/quote/before}{\small}
+% \AddToHook{env/quote/begin}{\small}
% \begin{quote}
% A quote set in a smaller typeface
% \end{quote}
% ...
-% \RemoveFromHook{env/quote/before}
+% \RemoveFromHook{env/quote/begin}
% ... now back to normal for further quotes
%\end{verbatim}
% Note that you can't cancel the setting with
%\begin{verbatim}
-% \AddToHook{env/quote/before}{}
+% \AddToHook{env/quote/begin}{}
%\end{verbatim}
% because that only \enquote{adds} a further empty chunk of code to
% the hook. Adding \cs{normalsize} would work but that means the hook
@@ -738,18 +756,32 @@
% in others.
%
% Before the hook management system was introduced
-% packages had to take elaborate precaution to determine of some other
-% package got loaded as well (before or after) and find some ways to
+% packages had to take elaborate precautions to determine whether some other
+% package had also been loaded (before or after) and then to find some ways to
% alter its behavior accordingly. In addition is was often the user's
-% responsibility to load packages in the right order so that code
-% added to hooks got added in the right order and some cases even
+% responsibility to load packages in the right order so that alterations
+% made by packages were done in thsat same order; and in some cases even
% altering the loading order wouldn't resolve the conflicts.
%
% With the new hook management system it is now possible to define
% rules (i.e., relationships) between code chunks added by different
-% packages and explicitly describe in which order they should be
+% packages and to specify explicitly the order in which they should be
% processed.
%
+% The rules can be declared for hooks before the hook has been
+% declared with \cs{NewHook} and they are allowed to refer to code
+% labels that do not yet exist, e.g., because a package defining the
+% code chunk with that label has not yet been loaded.
+% When the hook code is finally sorted for fast execution, all rules that apply are acted on
+% and the others are ignored.
+%
+% This offers the flexibility needed to handle complicated
+% relationships between code from different packages and to set this up
+% beforehand in a way that is independent of whether or not the packages are actually loaded in a
+% specific document. The downside of this is that misspellings of
+% hook names or code labels will not raise any error, instead the rule
+% will simply never apply!
+%
% \begin{function}{\DeclareHookRule}
% \begin{syntax}
% \cs{DeclareHookRule} \Arg{hook} \Arg{label1} \Arg{relation} \Arg{label2}
@@ -914,7 +946,7 @@
%
%
%
-% \subsubsection{Displaying hook code}
+% \subsubsection{Displaying hook code}\label{sec:display-hooks}
%
% If one has to adjust the code execution in a hook using a hook
% rule it is helpful to get some information about the code
@@ -1030,7 +1062,9 @@
% \end{syntax}
% Turn the debugging of hook code on or off. This displays most changes
% made to the hook data structures. The output is rather coarse and
-% not really intended for normal use.
+% not really intended for normal use, but it can be helpful in case hooks do
+% not work as expected. See also \ref{sec:display-hooks} for
+% commands to inspect individual hooks.
% \end{function}
%
%
@@ -1664,7 +1698,7 @@
% will be replaced by \verb|arg-1|, \verb|#2| by \verb|arg-2| and so
% on. If, at the point of usage, the programmer provides more
% arguments than the hook is declared to take, the excess arguments
-% are simply ignored by the hook. Behaviour is
+% are simply ignored by the hook. Behavior is
% unpredictable\footnote
% {The hook \emph{will} take the declared number of arguments, and
% what will happen depends on what was grabbed, and what the hook
@@ -2581,13 +2615,15 @@
%
% \subsubsection{The data structures of a hook}
%
-% \DescribeMacro{\g_@@_\meta{hook}_code_prop}
-% \DescribeMacro{\@@\textvisiblespace\meta{hook}}
-% \DescribeMacro{\g_@@_\meta{hook}_reversed_tl}
-% \DescribeMacro{\g_@@_\meta{hook}_declared_tl}
-% \DescribeMacro{\g_@@_\meta{hook}_parameter_tl}
-% \DescribeMacro{\@@_next\textvisiblespace\meta{hook}}
-% \DescribeMacro{\@@_toplevel\textvisiblespace\meta{hook}}
+%^^A \DecribeMacro is not set up to use @@ convention so __hook is used explicitly
+%
+% \DescribeMacro{\g__hook_\meta{hook}_code_prop}
+% \DescribeMacro{\__hook\textvisiblespace\meta{hook}}
+% \DescribeMacro{\g__hook_\meta{hook}_reversed_tl}
+% \DescribeMacro{\g__hook_\meta{hook}_declared_tl}
+% \DescribeMacro{\g__hook_\meta{hook}_parameter_tl}
+% \DescribeMacro{\__hook_next\textvisiblespace\meta{hook}}
+% \DescribeMacro{\__hook_toplevel\textvisiblespace\meta{hook}}
% Hooks have a name (called \meta{hook} in the description below)
% and for each hook we have to
% provide a number of data structures. These are
@@ -2875,7 +2911,7 @@
% code with arguments to a hook without prior knowledge of the number
% of arguments of that hook, so \pkg{lthooks} assumes~9 until the
% hook is properly declared and the number of arguments is known.
-% \cs{@@_normalise_cs_args:nn} does the normalisation by using the
+% \cs{@@_normalise_cs_args:nn} does the normalization by using the
% \cs[no-index]{c_@@_\meta{hook}_parameter_tl} defined just above.
% \begin{macrocode}
\@@_normalise_cs_args:nn { _toplevel } {#1}
@@ -3123,8 +3159,8 @@
% Here we set \cs{@@_replacing_args_false:} because no legacy code
% will reference hook arguments.
% \changes{v1.1b}{2023/04/16}
-% {\cs{@@_replacing_args_false:} in
-% \cs{@@_include_legacy_code_chunk:n}.}
+% {\cs{__hook_replacing_args_false:} in
+% \cs{__hook_include_legacy_code_chunk:n}}
% \begin{macrocode}
\@@_replacing_args_false:
\use:e
@@ -3707,11 +3743,13 @@
{
% \end{macrocode}
% However, first some debugging info if debugging is enabled:
+% \changes{v1.1l}{2024/11/26}{Adjust debugging message (gh/1459)}
% \begin{macrocode}
- \@@_debug:n{\iow_term:x{****~ Add~ to~
+ \@@_debug:n{\iow_term:x{[lthooks]~ Add~ to~
\@@_if_usable:nF {#1} { undeclared~ }
- hook~ #1~ (#2)
- \on@line\space <-~ \tl_to_str:n{#3}} }
+ hook~ '#1'~ (#2) \on@line
+ ^^J [lthooks] \@spaces
+ <-~ \tl_to_str:n{#3}} }
% \end{macrocode}
% Then try to get the code chunk labeled \verb=#2= from the hook.
% If there's code already there, then append \verb=#3= to that,
@@ -3882,7 +3920,7 @@
% \begin{macro}{\@@_gput_undeclared_hook:nnn}
% Often it may happen that a package $A$ defines a hook \verb=foo=,
% but package $B$, that adds code to that hook, is loaded before $A$.
-% In such case we need to add code to the hook before its declared.
+% In such case we need to add code to the hook before it is declared.
% An implicitly declared hook doesn't have arguments (in principle),
% so use \cs{c_false_bool} here.
% \begin{macrocode}
@@ -3911,7 +3949,7 @@
% next-execution hooks does the same: it defers the code to
% \cs{hook_gput_next_code:nn} if the generic hook was declared, or
% to \cs{@@_gput_next_do:nn} otherwise.
-% \changes{v1.0p}{2021/08/25}{Standardise generic hook names (gh/648)}
+% \changes{v1.0p}{2021/08/25}{Standardize generic hook names (gh/648)}
% \changes{v1.1d}{2023/05/21}
% {Changes to allow support arguments in cmd hooks (cmd-args).}
% \begin{macrocode}
@@ -3935,7 +3973,7 @@
%<latexrelease>\EndIncludeInRelease
%<latexrelease>\IncludeInRelease{2021/11/15}
%<latexrelease> {\@@_try_declaring_generic_hook:nnn}
-%<latexrelease> {Standardise~generic~hook~names}
+%<latexrelease> {Standardize~generic~hook~names}
%<latexrelease>\cs_gset_protected:Npn \@@_try_declaring_generic_hook:nnn #1
%<latexrelease> {
%<latexrelease> \@@_try_declaring_generic_hook:wnTF #1 / / / \scan_stop:
@@ -3956,7 +3994,7 @@
%<latexrelease>\EndIncludeInRelease
%<latexrelease>\IncludeInRelease{2020/10/01}
%<latexrelease> {\@@_try_declaring_generic_hook:nnn}
-%<latexrelease> {Standardise~generic~hook~names}
+%<latexrelease> {Standardize~generic~hook~names}
%<latexrelease>\cs_new_protected:Npn
%<latexrelease> \@@_try_declaring_generic_hook:nnn #1
%<latexrelease> {
@@ -3986,9 +4024,9 @@
% in other cases.
%
% \changes{v1.0s}{2021/09/28}
-% {Correct usage of older \cs{@@_if_file_hook:wTF} (gh/675)}
+% {Correct usage of older \cs{__hook_if_file_hook:wTF} (gh/675)}
% \changes{v1.1h}{2024/01/24}
-% {Correct usage of older \cs{@@_if_file_hook:wTF} (gh/1243)}
+% {Correct usage of older \cs{__hook_if_file_hook:wTF} (gh/1243)}
% \begin{macrocode}
%<latexrelease>\cs_new_protected:Npn \@@_try_declaring_generic_hook:nNNnn #1
%<latexrelease> {
@@ -4144,7 +4182,7 @@
% \begin{macrocode}
%<latexrelease>\IncludeInRelease{2021/11/15}
%<latexrelease> {\@@_try_declaring_generic_hook:wn}
-%<latexrelease> {Standardise~generic~hook~names}
+%<latexrelease> {Standardize~generic~hook~names}
%<latexrelease>\prg_new_protected_conditional:Npnn
%<latexrelease> \@@_try_declaring_generic_hook:wn
%<latexrelease> #1 / #2 / #3 / #4 \scan_stop: #5 { TF }
@@ -4248,10 +4286,10 @@
% executes the \meta{true} branch, otherwise \meta{false}.
% \begin{macrocode}
%<latexrelease>\IncludeInRelease{2021/11/15}{\@@_if_file_hook:w}
-%<latexrelease> {Standardise~generic~hook~names}
+%<latexrelease> {Standardize~generic~hook~names}
%<latexrelease>\EndIncludeInRelease
%<latexrelease>\IncludeInRelease{2020/10/01}{\@@_if_file_hook:w}
-%<latexrelease> {Standardise~generic~hook~names}
+%<latexrelease> {Standardize~generic~hook~names}
%<latexrelease>\prg_new_conditional:Npnn \@@_if_file_hook:w
%<latexrelease> #1 / #2 / #3 \s_@@_mark { TF }
%<latexrelease> {
@@ -4278,7 +4316,7 @@
%
% \begin{macrocode}
%<latexrelease>\IncludeInRelease{2021/11/15}{\@@_file_hook_normalize:n}
-%<latexrelease> {Standardise~generic~hook~names}
+%<latexrelease> {Standardize~generic~hook~names}
%<latexrelease>\EndIncludeInRelease
% \end{macrocode}
%
@@ -4290,7 +4328,7 @@
% have to be \verb|\AddToHook{file/./mypath//file.tex/after}|.
% \begin{macrocode}
%<latexrelease>\IncludeInRelease{2020/10/01}{\@@_file_hook_normalize:n}
-%<latexrelease> {Standardise~generic~hook~names}
+%<latexrelease> {Standardize~generic~hook~names}
%<latexrelease>\cs_new:Npn \@@_file_hook_normalize:n #1
%<latexrelease> { \@@_strip_double_slash:n {#1} }
%<latexrelease>\cs_new:Npn \@@_strip_double_slash:n #1
@@ -4337,7 +4375,7 @@
% \end{description}
% \begin{macrocode}
%<latexrelease>\IncludeInRelease{2021/11/15}{\c_@@_generics_prop}
-%<latexrelease> {Standardise~generic~hook~names}
+%<latexrelease> {Standardize~generic~hook~names}
\clist_map_inline:nn { cmd , env , file , package , class , include }
{
\tl_const:cn { c_@@_generic_#1/./before_tl } { + }
@@ -4366,7 +4404,7 @@
%
% \begin{macrocode}
%<latexrelease>\IncludeInRelease{2020/10/01}{\c_@@_generics_prop}
-%<latexrelease> {Standardise~generic~hook~names}
+%<latexrelease> {Standardize~generic~hook~names}
%<latexrelease>\prop_const_from_keyval:Nn \c_@@_generics_prop
%<latexrelease> {cmd=,env=,file=,package=,class=,include=}
%<latexrelease>\EndIncludeInRelease
@@ -4380,13 +4418,13 @@
% (the |ii| and |iii| names are kept for the deprecation cycle):
% \begin{macrocode}
%<latexrelease>\IncludeInRelease{2021/11/15}{\c_@@_generics_reversed_ii_prop}
-%<latexrelease> {Standardise~generic~hook~names}
+%<latexrelease> {Standardize~generic~hook~names}
%<latexrelease>\EndIncludeInRelease
% \end{macrocode}
%
% \begin{macrocode}
%<latexrelease>\IncludeInRelease{2020/10/01}{\c_@@_generics_reversed_ii_prop}
-%<latexrelease> {Standardise~generic~hook~names}
+%<latexrelease> {Standardize~generic~hook~names}
%<latexrelease>\prop_const_from_keyval:Nn
%<latexrelease> \c_@@_generics_reversed_ii_prop {after=,end=}
%<latexrelease>\prop_const_from_keyval:Nn
@@ -4546,8 +4584,8 @@
% \begin{macro}{\@@_cs_gput_right_fast:nnn,\@@_cs_gput_right_slow:nnn}
% \begin{macro}{\@@_code_gset_auxi:nnnn,\@@_code_gset_auxi:eeen}
% This macro is used to append code to the \verb|toplevel| and
-% \verb|next| token lists, trating them correctly depending on their
-% number of arguments, and depending if the code being added should
+% \verb|next| token lists, treating them correctly depending on their
+% number of arguments, and depending on whether the code being added should
% have parameter tokens understood as parameters, or doubled to be
% stored as parameter tokens.
% \changes{v1.1a}{2023/04/06}
@@ -4603,7 +4641,7 @@
% Here we take the existing code in the macro, expand it with as many
% arguments as it takes, then double the hashes so the code can be
% reused. \pho{Maybe can be improved. The case of adding to an empty
-% cs can be optimised by quickly checking \cs{cs_replacement_spec}.}
+% cs can be optimized by quickly checking \cs{cs_replacement_spec}.}
% \begin{macrocode}
{
\exp_args:NNo \exp_args:No \@@_double_hashes:n
@@ -4695,7 +4733,7 @@
% \end{macro}
%
% \begin{macro}{\@@_normalise_cs_args:nn}
-% This macro normalises the parameters of the macros
+% This macro normalizes the parameters of the macros
% \cs[no-index]{@@\meta{type}\textvisiblespace\meta{hook}} to take the
% right number of arguments after a hook is declared. At this point
% we know \cs[no-index]{c_@@_\meta{hook}_parameter_tl} exists, so use
@@ -4755,7 +4793,7 @@
% \end{macrocode}
% First, call \cs{@@_set_normalise_fn:nn} with the hook name to set
% everything up, then we'll loop over the
-% hook's code pool applying the normalisation above. After that's
+% hook's code pool applying the normalization above. After that's
% done, copy the temporary property list back to the hook's.
% \begin{macrocode}
\@@_set_normalise_fn:nn {#1} { Offending~label:~'##1' }
@@ -5374,10 +5412,11 @@
% \end{macrocode}
% If we are debugging we show results hook by hook for all hooks
% that have data.
+% \changes{v1.1l}{2024/11/26}{Adjust debugging message (gh/1459)}
% \begin{macrocode}
\@@_debug:n
{
- \iow_term:x { ^^J All~initialized~(non-empty)~hooks: }
+ \iow_term:x { ^^J[lthooks]~ All~initialized~(non-empty)~hooks: }
\prop_map_inline:Nn \g_@@_used_prop
{
\iow_term:x
@@ -5433,13 +5472,14 @@
% afterwards only if the hook code changes.
% \changes{v1.1a}{2023/04/06}
% {Changes to add hook arguments (hook-args).}
+% \changes{v1.1l}{2024/11/26}{Adjust debugging message (gh/1459)}
% \begin{macrocode}
%<latexrelease>\IncludeInRelease{2023/06/01}{\@@_initialize_hook_code:n}
%<latexrelease> {Hooks~with~args}
\cs_new_protected:Npn \@@_initialize_hook_code:n #1
{
\@@_debug:n
- { \iow_term:x { ^^J Update~code~for~hook~'#1' \on@line :^^J } }
+ { \iow_term:x { ^^J[lthooks]~ Update~code~for~hook~'#1' \on@line :^^J } }
% \end{macrocode}
% This does the sorting and the updates.
% First thing we do is to check if a legacy hook macro exists and
@@ -5732,9 +5772,10 @@
\exp_args:NNV \@@_tl_gput:Nn #1 \l_@@_return_tl
% \end{macrocode}
%
+% \changes{v1.1l}{2024/11/26}{Adjust debugging message (gh/1459)}
% \begin{macrocode}
\@@_clist_gput:NV #2 \l_@@_front_tl
- \@@_debug:n{ \iow_term:x{Handled~ code~ for~ \l_@@_front_tl} }
+ \@@_debug:n{ \iow_term:x{[lthooks]~ Handled~ code~ for~ \l_@@_front_tl} }
% \end{macrocode}
%
% This is step T6, except that we don't use a pointer $P$ to move
@@ -6146,9 +6187,9 @@
% \end{macrocode}
%
% \changes{v1.1a}{2023/04/06}
-% {Changes to add hook arguments (hook-args).}
+% {Changes to add hook arguments (hook-args)}
% \changes{v1.1g}{2024/01/03}
-% {Fix expansion of \cs{@@_print_args:nn} argument (gh/1221).}
+% {Fix expansion of \cs{__hook__print_args:nn} argument (gh/1221)}
% \begin{macrocode}
%<latexrelease>\IncludeInRelease{2023/06/01}{\@@_log:nN}
%<latexrelease> {Hooks~with~args}
@@ -6179,7 +6220,7 @@
% \end{macrocode}
%
% \changes{v1.1k}{2024/10/29}
-% {Skip mapping over undeclared \cs{g_@@_\meta{hook}_code_prop} (gh/1513)}
+% {Skip mapping over undeclared \cs{g__hook_\meta{hook}_code_prop} (gh/1513)}
% \begin{macrocode}
\@@_if_usable:nF {#1}
{ \@@_log_line:x { The~hook~is~not~declared. } }
@@ -6454,7 +6495,7 @@
% and |#3|${}={}$\meta{hook} (the latter may be the argument |#1| to
% \cs{@@_list_rules:nn}, or \texttt{??} if it is a default rule).
% \changes{v1.1k}{2024/10/29}
-% {Skip mapping over undeclared \cs{g_@@_\meta{hook}_code_prop} (gh/1513)}
+% {Skip mapping over undeclared \cs{g__hook_\meta{hook}_code_prop} (gh/1513)}
% \begin{macrocode}
\cs_new_protected:Npn \@@_list_rules:nn #1 #2
{
@@ -6535,12 +6576,42 @@
{
\@@_replacing_args_false:
\@@_normalize_hook_args:Nn \@@_gput_next_code:nn {#1} {#2}
+% \end{macrocode}
+%
+% \changes{v1.1l}{2024/11/26}{Add debugging message (gh/1459)}
+% \begin{macrocode}
+ \@@_debug:n{\iow_term:x{[lthooks]~ Add~ to~
+ \@@_if_usable:nF {#1} { undeclared~ }
+ hook~ '#1'~ ( next~ invocation~ only )
+ \on@line
+ ^^J [lthooks] \@spaces
+ <-~ \tl_to_str:n{#2}
+ }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
\@@_replacing_args_reset:
}
\cs_new_protected:Npn \hook_gput_next_code_with_args:nn #1 #2
{
\@@_replacing_args_true:
\@@_normalize_hook_args:Nn \@@_gput_next_code:nn {#1} {#2}
+% \end{macrocode}
+%
+% \changes{v1.1l}{2024/11/26}{Add debugging message (gh/1459)}
+% \begin{macrocode}
+ \@@_debug:n{\iow_term:x{[lthooks]~ Add~ to~
+ \@@_if_usable:nF {#1} { undeclared~ }
+ hook~ '#1'~ ( next~ invocation~ only )
+ \on@line
+ ^^J [lthooks] \@spaces
+ <-~ \tl_to_str:n{#2}
+ }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
\@@_replacing_args_reset:
}
%<latexrelease>\EndIncludeInRelease
@@ -6584,7 +6655,7 @@
% \changes{v1.1a}{2023/04/06}
% {Changes to add hook arguments (hook-args).}
% \changes{v1.1c}{2023/04/19}
-% {Initialise hook structure when adding 'next' code (gh/1052).}
+% {Initialize hook structure when adding 'next' code (gh/1052).}
% \begin{macrocode}
%<latexrelease>\IncludeInRelease{2023/06/01}{\@@_gput_next_do:nn}
%<latexrelease> {Hooks~with~args}
@@ -6699,7 +6770,7 @@
%
% \begin{macrocode}
%<latexrelease>\IncludeInRelease{2021/11/15}{\hook_use:n}
-%<latexrelease> {Standardise~generic~hook~names}
+%<latexrelease> {Standardize~generic~hook~names}
%<latexrelease>\cs_new_protected:Npn \hook_use:n #1
%<latexrelease> {
%<latexrelease> \tl_if_exist:cT { @@~#1 }
@@ -6722,7 +6793,7 @@
%
% \begin{macrocode}
%<latexrelease>\IncludeInRelease{2020/10/01}{\hook_use:n}
-%<latexrelease> {Standardise~generic~hook~names}
+%<latexrelease> {Standardize~generic~hook~names}
%<latexrelease>\cs_new_protected:Npn \hook_use:n #1
%<latexrelease> {
%<latexrelease> \tl_if_exist:cTF { @@~#1 }
@@ -6827,10 +6898,10 @@
% \cs{@@_preamble_hook:n} if so, then uses the hook.
% \begin{macrocode}
%<latexrelease>\IncludeInRelease{2021/11/15}{\@@_use:wn}
-%<latexrelease> {Standardise~generic~hook~names}
+%<latexrelease> {Standardize~generic~hook~names}
%<latexrelease>\EndIncludeInRelease
%<latexrelease>\IncludeInRelease{2020/10/01}{\@@_use:wn}
-%<latexrelease> {Standardise~generic~hook~names}
+%<latexrelease> {Standardize~generic~hook~names}
%<latexrelease>\cs_new:Npn \@@_use:wn #1 / #2 \s_@@_mark #3
%<latexrelease> {
%<latexrelease> \str_if_eq:nnTF {#1} { file }
@@ -6840,9 +6911,9 @@
% \end{macrocode}
%
% \changes{v1.0s}{2021/09/28}
-% {Correct usage of older \cs{@@_if_file_hook:wTF} (gh/675)}
+% {Correct usage of older \cs{__hook_if_file_hook:wTF} (gh/675)}
% \changes{v1.1h}{2024/01/24}
-% {Correct usage of older \cs{@@_if_file_hook:wTF} (gh/1243)}
+% {Correct usage of older \cs{__hook_if_file_hook:wTF} (gh/1243)}
% \begin{macrocode}
%<latexrelease>\cs_new_protected:Npn \@@_try_file_hook:n #1
%<latexrelease> {
@@ -7768,7 +7839,7 @@
%
% \begin{macro}{\ClearHookRule}
% A special setup rule that removes an existing relation.
-% Basically {@@_rule_gclear:nnn} plus fixing the property list for debugging.
+% Basically \cs{@@_rule_gclear:nnn} plus fixing the property list for debugging.
% \fmiinline{Needs perhaps an L3 interface, or maybe it should get dropped?}
% \begin{macrocode}
\NewDocumentCommand \ClearHookRule { m m m }
diff --git a/Master/texmf-dist/source/latex-dev/base/lthyphen.dtx b/Master/texmf-dist/source/latex-dev/base/lthyphen.dtx
index ae1e2182aa3..3ef84608d1d 100644
--- a/Master/texmf-dist/source/latex-dev/base/lthyphen.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/lthyphen.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/Master/texmf-dist/source/latex-dev/base/ltidxglo.dtx b/Master/texmf-dist/source/latex-dev/base/ltidxglo.dtx
index ca63844f880..f0cb8a8a5ca 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltidxglo.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltidxglo.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/Master/texmf-dist/source/latex-dev/base/ltkeys.dtx b/Master/texmf-dist/source/latex-dev/base/ltkeys.dtx
index a9e430206b6..aff11bd3069 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltkeys.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltkeys.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2021-2024
+% Copyright (C) 2021-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -33,7 +33,7 @@
%<*driver>
% \fi
\ProvidesFile{ltkeys.dtx}
- [2024/06/20 v1.0o LaTeX Kernel (Keyval options)]
+ [2025/02/18 v1.0p LaTeX Kernel (Keyval options)]
% \iffalse
\documentclass{l3doc}
\GetFileInfo{ltkeys.dtx}
@@ -158,7 +158,7 @@
%
% \begin{macro}{.code, .if, .ifnot, .store, .usage}
% \changes{v1.0b}{2022/02/05}
-% {Create properties in \texttt{ltlkeys}}
+% {Create properties in \texttt{ltkeys}}
% \changes{v1.0c}{2022/02/07}
% {Correct \texttt.{.code} property}
% \changes{v1.0i}{2022/06/22}
@@ -277,6 +277,7 @@
% \changes{v1.0l}{2022/10/20}
% {Define key option handler in \pkg{ltkeys}}
% \changes{v1.0i}{2022/07/05}{Support \cs{CurrentOption}}
+% \changes{v1.0p}{2025/01/15}{Only process global options on first pass}
% \begin{macro}{\@@_options_end:}
% The main function calls functions to collect up the global and local
% options into \cs{l_@@_options_clist} before calling the
@@ -286,17 +287,23 @@
% current family, and is cleaned up afterwards if required. To allow
% the \LaTeXe{} layer to know this mechanism is active, and to deal
% with the key family not matching the file name, we store the family
-% in all cases.
+% in all cases. Global options are only considered the first time a
+% package is loaded: this is tracked using
+% |opt@handler@\@currname.\@currext|, as this is defined once keyval
+% processing has been applied for the first time.
% \begin{macrocode}
\cs_new_protected:Npn \@@_options:n #1
{ \@@_options_expand_module:Nn \@@_options_aux:n {#1} }
\cs_new_protected:Npn \@@_options_aux:n #1
{
- \cs_gset_protected:cpn { opt@handler@\@currname.\@currext }
- { \ProcessKeyOptions [ #1 ] }
\cs_set_protected:Npn \@@_option_end: { }
\clist_clear:N \l_@@_options_clist
- \@@_options_global:n {#1}
+ \cs_if_exist:cF { opt@handler@ \@currname . \@currext }
+ {
+ \@@_options_global:n {#1}
+ \cs_gset_protected:cpn { opt@handler@ \@currname . \@currext }
+ { \ProcessKeyOptions [ #1 ] }
+ }
\@@_options_local:
\keys_if_exist:nnF {#1} { unknown }
{
diff --git a/Master/texmf-dist/source/latex-dev/base/ltlength.dtx b/Master/texmf-dist/source/latex-dev/base/ltlength.dtx
index 75c1f22676b..9bb04ee746a 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltlength.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltlength.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/Master/texmf-dist/source/latex-dev/base/ltlists.dtx b/Master/texmf-dist/source/latex-dev/base/ltlists.dtx
index 5858cbddfb8..836675398e6 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltlists.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltlists.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -31,7 +31,7 @@
%<*driver>
% \fi
\ProvidesFile{ltlists.dtx}
- [2024/06/23 v1.0u LaTeX Kernel (List Environments)]
+ [2025/01/26 v1.0v LaTeX Kernel (List Environments)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltlists.dtx}
@@ -851,11 +851,26 @@
\def\@endpetrue {%
\global\let\if@endpe\iftrue
% \end{macrocode}
-% If we are inside a group then propagate to the outside:
+% If we are inside a simple or a semi-simple group then propagate
+% to the outside, for all other group types do nothing. Normally, we
+% would start out in the group opened by \cs{begin} (type 14). When we
+% migrate out of that we are either on top-level (type 0) or in
+% another semi-simple group (type 14) or
+% in some other group. Thus, the best order of tests is to first
+% test for 14, then for 0 and finally for 1 (simple group).
+% \changes{v1.0v}{2025/01/26}{Only migrate \cs{@doendpe} out of simple
+% and semi-simple groups (gh1641)}
% \begin{macrocode}
- \ifnum\currentgrouplevel>\z@
- \aftergroup\propagate@doendpe
- \fi
+ \ifnum\currentgrouptype =14 % semi-simple group
+ \aftergroup\propagate@doendpe
+ \else
+ \ifnum\currentgrouptype =\z@ % no group: top-level
+ \else
+ \ifnum\currentgrouptype =\@ne % simple group
+ \aftergroup\propagate@doendpe
+ \fi
+ \fi
+ \fi
}
% \end{macrocode}
% If \cs{if@endpe} is still true after the group ends, we run \cs{@doendpe}
diff --git a/Master/texmf-dist/source/latex-dev/base/ltlogos.dtx b/Master/texmf-dist/source/latex-dev/base/ltlogos.dtx
index 4fc710ba40d..e6e92713321 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltlogos.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltlogos.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/Master/texmf-dist/source/latex-dev/base/ltluatex.dtx b/Master/texmf-dist/source/latex-dev/base/ltluatex.dtx
index 315b62cc9e2..594fcce23c2 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltluatex.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltluatex.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2015-2024
+% Copyright (C) 2015-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -30,7 +30,7 @@
%<*plain>
% \fi
% \ProvidesFile{ltluatex.dtx}
-[2024/08/16 v1.2e
+[2025/01/11 v1.2e
% LaTeX Kernel (LuaTeX support)^^A
%\iffalse
%<plain> LuaTeX support for plain TeX (core)%
@@ -1676,14 +1676,15 @@ end
% passed the return value of the previous (and the other arguments
% untouched, if any). The return value is that of the last function;
% \item[list] is a specialized variant of \emph{data} for functions
-% filtering node lists. Such functions may return either the head of a
-% modified node list, or the boolean values |true| or |false|. The
-% functions are chained the same way as for \emph{data} except that for
-% the following. If
-% one function returns |false|, then |false| is immediately returned and
-% the following functions are \emph{not} called. If one function returns
+% filtering node lists. Such functions are called with a node list head
+% as the first argument and may return either the head of a modified node list,
+% or the boolean values |true| or |false|.
+% The functions are chained the same way as for \emph{data} except for
+% the following cases.
+% If a function returns |false|, then |false| is immediately returned and
+% the following functions are \emph{not} called. If a function returns
% |true|, then the same head is passed to the next function. If all
-% functions return |true|, then |true| is returned, otherwise the return
+% functions return |true|, then the original head is returned, otherwise the return
% value of the last function not returning |true| is used.
% \item[reverselist] is a specialized variant of \emph{list} which executes
% functions in inverse order.
diff --git a/Master/texmf-dist/source/latex-dev/base/ltmarks.dtx b/Master/texmf-dist/source/latex-dev/base/ltmarks.dtx
index 1e1c5c7fb8e..a35efa8c188 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltmarks.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltmarks.dtx
@@ -1,7 +1,7 @@
% \iffalse meta-comment
%
%% File: ltmarks.dtx
-%% Copyright (C) 2022-2024
+%% Copyright (C) 2022-2025
%% Frank Mittelbach, The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
@@ -17,7 +17,7 @@
%<*driver>
% \fi
\ProvidesFile{ltmarks.dtx}
- [2024/11/14 v1.1a LaTeX Kernel (Marks)]
+ [2025/01/10 v1.1c LaTeX Kernel (Marks)]
% \iffalse
%
\documentclass{l3doc}
@@ -743,9 +743,9 @@
% region to \meta{alias}, i.e., make the structures identical. Used
% to update the \texttt{previous-...} structures inside
% \cs{mark_update_structure_from_material:nn} and \texttt{first-column} and
-% \texttt{last-column} structures inside
-% \cs{@@_update_singlecol_structures:} or
-% \cs{@@_update_dblcol_structures:}.
+% \texttt{last-column} structures inside the internal commands
+% \cs{__mark_update_singlecol_structures:} or
+% \cs{__mark__update_dblcol_structures:}.
% \end{function}
%
%
@@ -797,7 +797,7 @@
% If the \meta{source} consists of a single vertical box (plus
% possibly followed by some glue but nothing else) then the box is
% unpacked and the top-level marks are collected from its
-% content. However, if it is not a vertical box or there are are
+% content. However, if it is not a vertical box or there are
% other data then nothing is unpacked and you have to do the
% unpacking yourself to get at the marks inside.
%
@@ -979,7 +979,8 @@
%
%
% \begin{macro}{\@@_init_region:nn,\c_@@_empty_tl}
-%
+% \changes{v1.1b}{2024/12/03}{Fix inconsistent local/global assignment (gh/1574)}
+%
% For each class (\texttt{\#2}) and region (\texttt{\#1}), we need
% three token lists: one for top, first, and last. The default value to be
% returned is \enquote{empty}.
@@ -988,12 +989,12 @@
\tl_new:c { g_@@_#1_top_ #2 _tl }
\tl_new:c { g_@@_#1_first_ #2 _tl }
\tl_new:c { g_@@_#1_last_ #2 _tl }
- \tl_set_eq:cN { g_@@_#1_top_ #2 _tl } \c_@@_empty_tl
- \tl_set_eq:cN { g_@@_#1_first_ #2 _tl } \c_@@_empty_tl
- \tl_set_eq:cN { g_@@_#1_last_ #2 _tl } \c_@@_empty_tl
+ \tl_gset_eq:cN { g_@@_#1_top_ #2 _tl } \c_@@_empty_tl
+ \tl_gset_eq:cN { g_@@_#1_first_ #2 _tl } \c_@@_empty_tl
+ \tl_gset_eq:cN { g_@@_#1_last_ #2 _tl } \c_@@_empty_tl
}
% \end{macrocode}
-%
+%
% All marks will have an identification in the form of a
% number\footnote{There are a few cases where special
% identification strings are used, e.g., \texttt{2.09-compat}.} that is
@@ -1151,7 +1152,7 @@
% We are now ready to \cs{vsplit} the box to get at the marks. If
% the box contains some infinite negative glue the \TeX{} will
% produce an error complaining about it but it will correctly find
-% the the split marks. Given that we can't prevent that error, we
+% the split marks. Given that we can't prevent that error, we
% hide it from the user and ensure that \TeX{} doesn't stop. The
% error message still shows in the log, but even that is mitigated
% as best as possible---see the definition of
@@ -1229,7 +1230,7 @@
% Then we change them so that no escape char is printed in the
% error message (accounts for the missing backslash in front of
% \verb/Infinite shrink .../) and we set the interaction to
-% \cs{nonstopmode} so that the the error (if any) just goes into
+% \cs{nonstopmode} so that the error (if any) just goes into
% the \texttt{.log} file and \TeX{} doesn't stop at that point.
% \begin{macrocode}
\tex_escapechar:D -1 \scan_stop:
@@ -1475,7 +1476,14 @@
{
%<*trace>
\@@_debug:n { \iow_term:x { Marks:~ extract~ last~
- mark~ for~ class~ '##1'~ =~ \g_@@_tmp_tl } }
+% \end{macrocode}
+% The mark content in \cs{g_@@_tmp_tl} may contain aribtrary code
+% that may react badly if it is expanded in a write. So we better
+% avoid that expansion, otherwise debugging might generate spurious
+% errors when turned on.
+% \changes{v1.1c}{2025/01/10}{Do not expand mark content while debugging}
+% \begin{macrocode}
+ mark~ for~ class~ '##1'~ =~ \exp_not:o \g_@@_tmp_tl } }
%</trace>
\tl_gput_right:Ne \g_@@_last_marks_tl
{ \mark_insert:nn {##1} { \@@_drop_id:o { \g_@@_tmp_tl } } }
@@ -1487,10 +1495,15 @@
% faster in case there is none.
% \begin{macrocode}
%<*trace>
- \@@_debug:n { \iow_term:x { Marks:~ extract~ first~
- mark~ for~ class~ '##1'~ =~
- \tex_splitfirstmarks:D
+ \@@_debug:n { \iow_term:x {
+ Marks:~ extract~ first~ mark~ for~ class~ '##1'~ =~
+% \end{macrocode}
+% Again no expansion for the mark content.
+% \begin{macrocode}
+ \exp_not:o {
+ \tex_splitfirstmarks:D
\use:c { c_@@_class_##1_mark }
+ }
} }
%</trace>
\tl_gput_right:Ne \g_@@_first_marks_tl
@@ -1683,7 +1696,7 @@
%
% \begin{macro}{\@@_value:nn}
% A hidden marker is placed into every mark added by
-% \cs{mark_insert:nn}. It will will not show up in the output but
+% \cs{mark_insert:nn}. It will not show up in the output but
% its argument (a counter value that is incremented) makes all
% marks unique so the test for \enquote{equal} is not fooled by two
% different marks having the same mark text.
@@ -2203,7 +2216,7 @@
% Updating the \texttt{first} mark for the \texttt{page} region is
% more complicated. We first have to find out of there is any mark
% in the first column (this can be done by comparing the \texttt{top} and
-% the \texttt{first} mark of of that region).
+% the \texttt{first} mark of that region).
% \changes{v1.0f}{2024/05/30}{Correct logic for first mark in page
% region if first column contains no marks (gh/1359)}
% \begin{macrocode}
diff --git a/Master/texmf-dist/source/latex-dev/base/ltmath.dtx b/Master/texmf-dist/source/latex-dev/base/ltmath.dtx
index b40faa8a800..6cd251bd2e7 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltmath.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltmath.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/Master/texmf-dist/source/latex-dev/base/ltmeta.dtx b/Master/texmf-dist/source/latex-dev/base/ltmeta.dtx
index 410f6459f52..35fe3ada06f 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltmeta.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltmeta.dtx
@@ -1,7 +1,7 @@
% \iffalse meta-comment
%
%% File: ltmeta.dtx
-%% Copyright (C) 2021-2024
+%% Copyright (C) 2021-2025
%% Frank Mittelbach, The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
diff --git a/Master/texmf-dist/source/latex-dev/base/ltmiscen.dtx b/Master/texmf-dist/source/latex-dev/base/ltmiscen.dtx
index 70c374f7086..833bcc8e452 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltmiscen.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltmiscen.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/Master/texmf-dist/source/latex-dev/base/ltoutenc.dtx b/Master/texmf-dist/source/latex-dev/base/ltoutenc.dtx
index 639f214fa9a..a786be3fe1a 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltoutenc.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltoutenc.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -37,14 +37,14 @@
%<TS1>\ProvidesFile{ts1enc.def}[2001/06/05 v3.0e (jk/car/fm)
%<TU>\ProvidesFile{tuenc.def}
%<package>\ProvidesPackage{fontenc}
-%<OT1|T1|OMS|OML|OT4|TU|package> [2024/11/06 v2.1b
+%<OT1|T1|OMS|OML|OT4|TU|package> [2024/12/21 v2.1c
%<OT1|T1|OMS|OML|OT4|TS1|TU> Standard LaTeX file]
%<package> Standard LaTeX package]
%
%<*driver>
% \fi
\ProvidesFile{ltoutenc.dtx}
- [2024/11/06 v2.1b LaTeX Kernel (font encodings)]
+ [2025/02/11 v2.1c LaTeX Kernel (font encodings)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltoutenc.dtx}
@@ -595,8 +595,41 @@
\@dec@text@cmd\providecommand}
% \end{macrocode}
%
+%
+% \changes{v2.1c}{2024/11/26}{Declare command for logging (gh/1242)}
+% \begin{macrocode}
+\def\@enc@info#1{%
+ \GenericInfo{(Encoding)\@spaces\@spaces\@spaces\space\space}%
+ {LaTeX Encoding Info: \space\space\space#1}}%
+% \end{macrocode}
+%
% \begin{macrocode}
\def\@dec@text@cmd#1#2#3{%
+% \end{macrocode}
+% For logging, there are a number of different cases to cater for.
+% \changes{v2.1c}{2025/02/11}{Log text command/symbol redeclarations (gh/1242)}
+% \begin{macrocode}
+ \ifcsname #3\string#2\endcsname
+ \@enc@info{%
+ \ifx#1\providecommand
+ Ignoring declaration for
+ \else
+ Redeclaring
+ \fi
+ text
+% \end{macrocode}
+% This test distinguishes between commands and symbols:
+% \begin{macrocode}
+ \ifx#1\chardef@text@cmd
+ symbol
+ \else
+ command
+ \fi
+ \string#2 (encoding #3)}%
+ \fi
+% \end{macrocode}
+%
+% \begin{macrocode}
\expandafter\def\expandafter#2%
\expandafter{%
\csname#3-cmd\expandafter\endcsname
@@ -906,9 +939,13 @@
\def\DeclareTextCompositeCommand#1#2#3#4{%
\expandafter\let\expandafter\reserved@a\csname#2\string#1\endcsname
\ifx\reserved@a\relax
+% \end{macrocode}
+%
+% \changes{v2.1c}{2024/11/26}{Alter error and info message}
+% \begin{macrocode}
\DeclareTextCommand#1{#2}{%
- \@latex@error{\string#1 undeclared in encoding #2}\@eha}%
- \@latex@info{Composite with undeclared \string#1 in encoding #2}%
+ \@latex@error{Text composite \string#1 undeclared in encoding #2}\@eha}%
+ \@enc@info{Text composite with undeclared \string#1 in encoding #2}%
\expandafter\let\expandafter\reserved@a\csname#2\string#1\endcsname
\fi
\expandafter\expandafter\expandafter\ifx
@@ -1187,14 +1224,14 @@
\def\UndeclareTextCommand#1#2{%
% \end{macrocode}
% If there is no declaration for the current encoding do nothing.
-% (This makes a hash table entry but without e\TeX{} we can't do
-% anything about that).
+% \changes{v2.1c}{2024/11/26}{Use \cs{ifcsname} to avoid generating a csname}
% \begin{macrocode}
- \expandafter\ifx\csname#2\string#1\endcsname\relax
- \else
+ \ifcsname #2\string#1\endcsname
% \end{macrocode}
% Else: throw away that declaration.
+% \changes{v2.1c}{2024/11/26}{Log text command change (gh/1242)}
% \begin{macrocode}
+ \@enc@info{Undeclare text command \string#1 (encoding #2)}%
\global\expandafter\let\csname#2\string#1\endcsname
\@undefined
% \end{macrocode}
@@ -1227,7 +1264,12 @@
{\csname ?-cmd\expandafter\endcsname\expandafter
#1\csname?\string#1\endcsname}%
\fi
- \fi
+ \else
+% \end{macrocode}
+% \changes{v2.1c}{2024/11/26}{Log text command change (gh/1242)}
+% \begin{macrocode}
+ \@enc@info{Text command \string#1 (encoding #2) is not declared}%
+ \fi
}
% \end{macrocode}
%
@@ -2279,10 +2321,11 @@
\fi
% \end{macrocode}
%
-% \changes{v2.1b}{2024/11/06}{Support for macron-i for T1}
+% \changes{v2.1b}{2024/11/06}{Support for macron-i for T1 (gh/1453)}
+% \changes{v2.1c}{2024/12/21}{Correct base letter (gh/1587)}
% One oddity.
% \begin{macrocode}
-\DeclareTextCompositeCommand{\=}{T1}{\i}{\=\i}
+\DeclareTextCompositeCommand{\=}{T1}{i}{\=\i}
% \end{macrocode}
%
% \begin{macrocode}
diff --git a/Master/texmf-dist/source/latex-dev/base/ltoutenc.ins b/Master/texmf-dist/source/latex-dev/base/ltoutenc.ins
index c5316f9aaba..5f9fa23201e 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltoutenc.ins
+++ b/Master/texmf-dist/source/latex-dev/base/ltoutenc.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright (C) 1993-2024
+%% Copyright (C) 1993-2025
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright (C) 1993-2024
+Copyright (C) 1993-2025
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/Master/texmf-dist/source/latex-dev/base/ltoutput.dtx b/Master/texmf-dist/source/latex-dev/base/ltoutput.dtx
index f2ae4150a94..10269632a5e 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltoutput.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltoutput.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -30,14 +30,14 @@
%%% From File: ltoutput.dtx
%<flafter>\ProvidesPackage{flafter}
%<fltrace>\ProvidesPackage{fltrace}
-%<flafter,fltrace> [2024/11/16 v1.4k
+%<flafter,fltrace> [2025/02/20 v1.4n
%<flafter> Standard LaTeX floats after reference (FMi)]
%<fltrace> Tracing LaTeX floats algorithm (FMi)]
%
%<*driver>
% \fi
\ProvidesFile{ltoutput.dtx}
- [2024/11/16 v1.4k LaTeX Kernel (Output Routine)]
+ [2025/02/20 v1.4n LaTeX Kernel (Output Routine)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltoutput.dtx}
@@ -46,13 +46,21 @@
\author{Leslie Lamport, Frank Mittelbach, Chris Rowley}
\begin{document}
\MaintainedByLaTeXTeam{latex}
- \maketitle
+ \maketitle \tableofcontents
\DocInput{\filename}
\end{document}
%</driver>
% \fi
%
%
+% \providecommand\hook[1]{\texttt{#1\DescribeHook[noprint]{#1}}}
+% \providecommand\socket[1]{\texttt{#1\DescribeSocket[noprint]{#1}}}
+% \providecommand\plug[1]{\texttt{#1\DescribePlug[noprint]{#1}}}
+%
+% \ProvideDocElement[printtype=\textit{socket},idxtype=socket,idxgroup=Sockets]{Socket}{socketdecl}
+% \ProvideDocElement[printtype=\textit{plug},idxtype=plug,idxgroup=Plugs]{Plug}{plugdecl}
+% \ProvideDocElement[printtype=\textit{hook},idxtype=hook,idxgroup=Hooks]{Hook}{hookdecl}
+%
%
% \iffalse
% LATEX VERSION 2e
@@ -125,26 +133,18 @@
% \def \ie {i.e.~}
% \def \eg {e.g.~}
%
-% \section{Output Routine}
+% \section{Output Routine and float handling}
%
-% \subsection{Floats}
%
-% The `2ekernel' code ensures that a |\usepackage{autoout1}| is
-% essentially ignored if a `full' format is being used that has
-% the autoload file mode already in the format.
% \begin{macrocode}
-%<defx>\begingroup
-%<defx>\makeatletter
-%<defx>\nfss@catcodes
-%<2ekernel>\expandafter\let\csname ver@autoout1.sty\endcsname\fmtversion
+%<*2ekernel>
+\message{output,}
% \end{macrocode}
%
+% \subsection{Historical notes on the algorithm and commands}
+%
%
% \begin{oldcomments}
-% \begin{macrocode}
-%<*2ekernel>
-\message{output,}
-% \end{macrocode}
% ****************************************
% * OUTPUT *
% ****************************************
@@ -644,9 +644,13 @@
% \nointerlineskip
% \hbox{\vrule height 0 width 0 depth \@pagedp}
% END
+% \end{oldcomments}
+%
+%
+%
+% \subsection{Core definitions}
%
% Floats and marginpars add a lot of dead cycles.
-% \end{oldcomments}
% \begin{macrocode}
\maxdeadcycles = 100
% \end{macrocode}
@@ -690,7 +694,10 @@
\fi}
% \end{macrocode}
%
-% DEFINITION OF FLOAT BOXES:
+%
+% \subsubsection{Definition of float boxes}
+%
+%
% \changes{v1.3a}{2015/09/205}
% {extended \cs{@freelist}}
% \begin{macrocode}
@@ -756,7 +763,11 @@
\gdef\@dbldeferlist{}
% \end{macrocode}
%
-% PAGE LAYOUT PARAMETERS
+%
+%
+% \subsubsection{Page layout parameters}
+%
+%
% \begin{macrocode}
\newdimen\topmargin
\newdimen\oddsidemargin
@@ -890,8 +901,12 @@
% \end{macro}
% \end{macro}
%
-% \begin{oldcomments}
-% INTERNAL REGISTERS
+%
+%
+%
+% \subsubsection{Internal registers}
+%
+%
%
% \begin{macrocode}
\newcount\@topnum
@@ -918,7 +933,11 @@
\def\@thehead{\@oddhead} % initialization
\def\@thefoot{\@oddfoot}
% \end{macrocode}
-% \end{oldcomments}
+%
+%
+%
+%
+% \subsubsection{Page break commands}
%
% \begin{macro}{\clearpage}
% \changes{v1.1r}{1995/10/11}{Added a check so that it does not lose
@@ -1213,6 +1232,241 @@
% \end{macro}
%
%
+%
+% \section{The \LaTeX{} output routine}
+%
+% \subsection{Hooks and replaceable code blocks}
+%
+% To support packages that want to augment aspects of the output
+% routine we offer a number of hooks (where several packages can
+% add code) as well as some sockets (that can only be changed by
+% one package or through options like those of the \pkg{footmisc}
+% package).
+%
+%
+% \subsubsection{Output routine hooks}
+%
+% \begin{description}
+%
+% \item[\hook{build/page/before}, \hook{build/page/after}]
+% These two hooks enable packages to prepend or append code to
+% the page processing in the output routine. They are
+% implemented as mirrored hooks.
+%
+% Technically, they are executed at the start and the end of the internal
+% \LaTeXe{} \cs{@outputpage} command, respectively.
+%
+%
+% \item[\hook{build/page/reset}]
+% Packages that set up special conventions for text in the main
+% galley (such as catcode changes, etc.)\ can use this hook to
+% undo these changes within the output routine, so that they
+% aren't applied to unrelated material, e.g., the text for
+% running header or footers.
+%
+% \item[\hook{build/column/before}, \hook{build/column/after}]
+% These two hooks enable packages to prepend or append code to
+% the column processing in the output routine. They are
+% implemented as mirrored hooks.
+%
+% Technically, they are executed at the start and the end of the internal
+% \LaTeXe{} \cs{@makecol} command, respectively.
+%
+% \end{description}
+%
+% \subsubsection{Replaceable code blocks (sockets)}
+%
+% To cater for different layouts with respect to text, footnotes,
+% and bottom-floats placements there are sockets for
+% now. They are sockets not hooks, because the overall layout can only be
+% controlled by one package, i.e., the last setting wins.
+%
+% \begin{description}
+% \item[\socket{build/column/outputbox} (0 arguments)]
+%
+% In code for this socket the \cs{@outputbox} (holding the
+% galley text for the current column or page) is augmented by
+% attaching floats and footnote areas together with appropriate
+% spacing.
+%
+% Prior to calling the socket the output routine has already
+% decided which floats go into which area and which get deferred.
+% Therefore, the assumption is that the code in the socket attaches all
+% areas that contain floats. If this is not done, then the order
+% of floats is likely to be screwed up unless unused floats
+% are moved to the defer list in an appropriate way (for now we
+% don't offer any interface for that scenario).
+%
+% Before the code in the socket is run, any existing glue at the bottom
+% of the \cs{@outputbox} is removed and stored in a safe
+% place. If needed, it can be reinserted with one of the helper
+% commands.
+%
+% To support setting this up the following helper commands are available:
+% \begin{description}
+% \item[\cs{@outputbox@append} (1 argument)]
+%
+% \DescribeMacro[noprint]{@outputbox@append}
+%
+% This general purpose command alters the \cs{@outputbox} box by
+% appending material to it.
+%
+% \item[\cs{@outputbox@appendfootnotes} (0 arguments)]
+%
+% \DescribeMacro[noprint]{@outputbox@appendfootnotes}
+%
+% This command appends the footnotes to the \cs{@outputbox} (if
+% there are any). If not, then it does nothing.
+%
+% \item[\cs{@outputbox@attachfloats} (0 arguments)]
+% \item[\cs{@outputbox@attachtopfloats} (0 arguments)]
+% \item[\cs{@outputbox@attachbottomfloats} (0 arguments)]
+%
+% \DescribeMacro[noprint]{@outputbox@attachfloats}
+% \DescribeMacro[noprint]{@outputbox@attachtopfloats}
+% \DescribeMacro[noprint]{@outputbox@attachbottomfloats}
+%
+% Attaching top and bottom floats can usually be done in one
+% go, but for special layouts we might want more control so we
+% provide also separate commands.
+%
+% \item[\cs{@outputbox@reinsertbskip} (0 arguments)]
+%
+% \DescribeMacro[noprint]{@outputbox@reinsertbskip}
+%
+% Reinsert the bottom skip of the \cs{@outputbox} that was
+% saved before in \cs{@makecol}.
+%
+% \item[Testing for existence of material]
+%
+% \DescribeMacro[noprint]{@if@footnotes@TF}
+% \DescribeMacro[noprint]{@if@bottomfloats@TF}
+%
+% There are a number of helpers to run conditional code
+% depending on whether or not there are footnotes or bottom
+% floats. They are \cs{@if@footnotes@TF} and
+% \cs{@if@bottomfloats@TF}
+% (names are likely to change).
+%
+% \end{description}
+%
+% \task{fmi}{Decide on names for these helper commands. We could keep
+% them similar to the above (because they are only supposed to be
+% used by a few packages). However, we could alternatively use
+% CamelCase names, under the assumption that classes may also
+% directly define a plug for the socket, instead of loading a
+% support package such as \pkg{footmisc} (or in addition
+% to). --- decide}
+%
+% This socket cannot be empty but needs appropriate code; a set
+% of suitable plugs for it are already given in the kernel. These
+% are
+% \begin{description}
+% \item[\plug{space-footnotes-floats}]
+%
+% After the galley text there is a vertical \cs{vfill}
+% followed by any footnotes followed by the bottom floats, if any.
+%
+% \item[\plug{footnotes-space-floats}]
+%
+% As before but the \cs{vfill} is between footnotes and floats.
+%
+% \item[\plug{floats-space-footnotes}]
+%
+% Floats are directly after the text, then a space and then
+% footnotes at the bottom.
+%
+% \item[\plug{space-floats-footnotes}]
+%
+% Both floats and footnotes are pushed to the bottom with
+% footnotes last.\footnote{There are two more permutations,
+% but neither of them has ever been requested so they aren't
+% set up by default --- doing that in a class would be trivial
+% though.}
+%
+% \item[\plug{floats-footnotes}]
+%
+% All excess space is distributed across the existing
+% glue on the page, e.g., within the text galley, the
+% separation between blocks, etc.
+% The order is text, floats, footnotes.
+%
+% \item[\plug{footnotes-floats}]
+%
+% As the previous one but floats and footnotes are
+% swapped. This is the \LaTeX{} default for newer document,
+% i.e., this plug is assigned to the socket when
+% \cs{DocumentMetadata} is used.
+%
+% \item[\plug{footnotes-floats-legacy}]
+%
+% As the previous one but \LaTeX{}'s bottom skip bug is not
+% corrected, i.e., in ragged bottom designs where footnotes
+% are supposed to be directly attached to the text, they suddenly
+% appear at the bottom of the page when the page is ended with
+% \cs{newpage} or \cs{clearpage}.
+% While this is clearly a bug, it was the case since the days
+% of \LaTeX~2.09; thus for
+% compatibility we continue to support this behavior.
+%
+% \end{description}
+%
+%
+% \item[\socket{build/column/footnotes} (0 arguments)]
+%
+% This socket is used to manipulate the footnote
+% material inside \cs{box}\cs{footins}. It if contains code, it
+% is supposed to do some processing of that box and then write
+% the result back into it (and nothing else!). By default it
+% does nothing, i.e., has the \plug{noop} assigned.
+%
+% If (short) footnotes are run as a paragraph this socket gets
+% the plug \plug{para} assigned which is defined elsewhere.
+%
+% \end{description}
+%
+% \subsubsection{Tagging sockets}
+%
+% The following sockets are used to implement tagging. They are used
+% via \cs{UseTaggingSocket} which turns them off when tagging is
+% disabled.
+% For each of them a \plug{default} plug is implemented that holds the tagging code.
+%
+% \begin{description}
+%
+% \item[\socket{build/column/outputbox} (0 arguments)]
+% This socket is used to add any missing tagging structures to the
+% \cs{@outputbox} box, if necessary.
+%
+% \item[\socket{build/column/footins} (0 arguments)]
+% This socket is used to add any missing tagging structures to
+% \cs{footins} box, if necessary.
+%
+% \item[\socket{build/page/header} (2 arguments)]
+%
+% This socket receives the content of the formatted page header
+% as its second argument and adds the necessary tagging around
+% it. The first argument is empty as no special setup is
+% necessary.
+%
+% \item[\socket{build/page/footer} (2 arguments)]
+%
+% This socket receives the content of the formatted page footer
+% as its second argument and adds the necessary tagging around
+% it. The first argument is empty as no special setup is
+% necessary.
+%
+% \end{description}
+%
+%
+%
+%
+%
+% \subsubsection{Output routine commands}
+%
+%
+%
+%
% \begin{macro}{\output}
% \changes{v1.0f}{1993/12/05}{Command changed}
% \begin{macro}{\@specialoutput}
@@ -1694,172 +1948,136 @@
% \end{macro}
%
%
+% \begin{macrocode}
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2025/06/01}%
+%<latexrelease> {\@makecol}{\@makecol adding hooks/sockets}%
+% \end{macrocode}
+%
% \begin{macro}{\@makecol}
% \changes{v0.1c}{1993/11/23}{Command changed}
% \changes{v1.0b}{1993/11/29}{\cs{@makespecialcolbox} added}
-% We must rewrite this macro to allow for variations in page-makeup
-% required by changes in page-length.
-%
-% This uses a different macro if a special-length column is being
-% produced.
+% \changes{v1.4m}{2025/02/14}{Use sockets and hooks}
%
+% \cs{@makecol} is shortened a lot, basically all the hardwired
+% code in the middle has moved into a socket.
% \begin{macrocode}
-%<*2ekernel>
-\gdef \@makecol {%
- \ifvoid\footins
- \setbox\@outputbox \box\@cclv
- \else
- \setbox\@outputbox \vbox {%
+\def \@makecol {%
% \end{macrocode}
-% This |\boxmaxdepth| setting is to ensure that deep footnotes
-% do not overwrite the footer (on account of the negative skip
-% added later): it should use |\@maxdepth| otherwise the change is
-% pointless when there are footnotes.
-% \task{CAR}{Investigate providing an option to put the footnotes
-% below the bottom floats.}
-%
-% But see also its use when combining floats.
-% \changes{v1.0l}{1994/03/15}{\cs{maxdepth} changed to \cs{@maxdepth}}
+% A number of packages want to prepend code to \cs{@makecol}; this
+% is the hook for that:
% \begin{macrocode}
- \boxmaxdepth \@maxdepth
+ \UseHook {build/column/before}%
% \end{macrocode}
-%
-% \changes{v1.2e}{1999/01/06}{Added negative vskip, as when processing
-% outputbox below: suggested by Fred Bartlett pr/2892}
-% \changes{1.2i}{2000/07/12}{Removed negative vskip, as it gives
-% unacceptable results when the depth is large: pr/3189}
-% \changes{v1.2m}{2004/10/20}{Removed dead code}
-% \task{CAR}{As can be seen from the above two changes, getting a good
-% layout here is difficult: fix!}
+% Save away box 255 as \cs{@outputbox} to make it available for further adjustments.
% \begin{macrocode}
-% \@tempdima\dp\@cclv
- \unvbox \@cclv
-% \vskip-\@tempdima
- \vskip \skip\footins
+ \setbox\@outputbox \box\@cclv
% \end{macrocode}
-% \changes{v1.1a}{1994/10/31}
-% {(DPC/CAR) Colour resetting moved to here}
+% The only real addition is the next command which either does
+% nothing or removes an infinite glue from the bottom of the
+% \cs{@outputbox}.
% \begin{macrocode}
- \color@begingroup
- \normalcolor
- \footnoterule
- \unvbox \footins
- \color@endgroup
- }%
- \fi
+ \@outputbox@removebskip
+% \end{macrocode}
+% Now a kernel hook for tagging that adjusts the content of
+% \cs{@outputbox}, if necessary. At this point it just contains the material from
+% the galley.
+% \begin{macrocode}
+ \UseTaggingSocket{build/column/outputbox}%
% \end{macrocode}
-% The h floats have now been finally committed to this page so we
-% can reset their list. The top and bottom floats are then added
-% to the page.
+% When this code is run any ``here'' floats in the \cs{@outputbox}
+% are already handled, so we recycle their registers and put them
+% back to the \cs{@freelist}.
+% \changes{v1.0h}{1993/12/12}{defs changed to lets}
% \changes{v1.2k}{2003/12/16}{Ensure that \cs{@elt} has a defined
% state (pr/3586)}
% \begin{macrocode}
- \let\@elt\relax
- \xdef\@freelist{\@freelist\@midlist}%
+ \let\@elt\relax
+ \xdef\@freelist{\@freelist\@midlist}%
+ \global \let \@midlist \@empty
% \end{macrocode}
-% \changes{v1.0h}{1993/12/12}{defs changed to lets}
+% Here we have the configurable part. This socket is supposed to
+% add floats, footnotes and stretchable vertical space as
+% appropriate to the \cs{@outputbox}. It is used by packages such
+% as \pkg{footmisc} to implement different layout, e.g., footnotes
+% above or below bottom floats, etc.
% \begin{macrocode}
- \global \let \@midlist \@empty
- \@combinefloats
+ \UseSocket {build/column/outputbox}%
% \end{macrocode}
-% The variations start here in case |\enlargethispage| has
-% been used.
+% Then we deal with any \cs{enlargethispage} or run the normal code
+% to build a column.
% \begin{macrocode}
- \ifvbox\@kludgeins
- \@makespecialcolbox
- \else
+ \ifvbox\@kludgeins
+ \@make@specialcolbox
+ \else
+ \@make@normalcolbox
+ \fi
+ \global \maxdepth \@maxdepth
% \end{macrocode}
-% This extra reboxing is only needed to add the
-% |\@texttop| and |\@textbotttom| but this could be done earlier,
-% when the floats are added.
-%
-% The |\boxmaxdepth| resetting here will have no effect unless
-% |\@textbottom| ends with a box or rule. So is this (or possibly
-% |\@maxdepth|) the correct value?
-%
-% The |\vskip -\dimen@|
-% ensures that the visible depth of the box does not
-% affect the placement of anything on the page.
-% Thus very deep pages will overprint the footer; but these should
-% have been prevented by suitable settings of the maxdepths at
-% appropriate times.
+% Finally, another hook for external packages or classes that want
+% to augment or alter the output routine by appending to \cs{@makecol}.
+% \begin{macrocode}
+ \UseHook {build/column/after}%
+}
+% \end{macrocode}
+% \end{macro}
%
-% If |\@textbottom| ends with a box or rule of non-zero depth
-% then this skip adjustment should be done again after it.
+% \begin{macro}{\@outputbox@depth}
+% \changes{v1.4m}{2025/02/14}{Macro added}
+% We need to know the depth of \cs{@outputbox} once in a
+% while. Rather than using a temp dimen (as it was done in the
+% past), we give it a proper register.
+% \begin{macrocode}
+\newdimen\@outputbox@depth
+% \end{macrocode}
+% \end{macro}
%
-% I think that the final boxing of the main text page could have a
-% common ending which may make it simpler to see what is going on.
%
-% This needs further investigation, especially in the `special
-% case'.
-% \task{CAR}{Further investigation of makecol}
+% \begin{macro}{\@make@normalcolbox}
+% \changes{v1.4m}{2025/02/14}{Macro added}
+% Taken out of \cs{@makecol} for readability.
%
-% Also, the |\boxmaxdepth| setting here affects what happens within
-% |\@texttop| and |\@textbottom|, should it? Is it needed at all?
% \changes{v1.0l}{1994/03/15}{Removed boxmaxdepth setting.}
-%
-% RmS 91/10/22: Replaced |\dimen128| by |\dimen@|.
-%
% \begin{macrocode}
- \setbox\@outputbox \vbox to\@colht {%
-% \boxmaxdepth \maxdepth %??
+\def \@make@normalcolbox {%
+ \setbox\@outputbox \vbox to\@colht {%
\@texttop
- \dimen@ \dp\@outputbox
+ \@outputbox@depth \dp\@outputbox
\unvbox \@outputbox
- \vskip -\dimen@
- \@textbottom
- }%
- \fi
- \global \maxdepth \@maxdepth
-}
% \end{macrocode}
-% \end{macro}
+% The |\vskip -\@outputbox@depth@| ensures that the visible depth
+% of the box does not affect the placement of anything on the page.
+% Thus very deep pages will overprint the footer; but these should
+% have been prevented by suitable settings of the maxdepths at
+% appropriate times.
%
-% \begin{macro}{\@reinserts}
-% \changes{v1.0e}{1993/12/01}{Command added}
-% This is the code which reinserts the inserts. It puts them all
-% in one place; this can make some of them come out on the wrong
-% page.
-% It has been put into a separate macro to expedite experimentation.
+% If |\@textbottom| ends with a box or rule of non-zero depth then
+% this skip adjustment should be done again after it.
% \begin{macrocode}
-\gdef \@reinserts{%
- \ifvoid\footins\else\insert\footins{\unvbox\footins}\fi
- \ifvbox\@kludgeins\insert\@kludgeins
- {\unvbox\@kludgeins}\fi
+ \vskip -\@outputbox@depth
+ \@textbottom
+ }%
}
-%</2ekernel>
% \end{macrocode}
% \end{macro}
%
-%
-%
-% \begin{macro}{\@makespecialcolbox}
-% \changes{v1.0b}{1993/11/29}{Command added}
-% This implements certain variations in page-makeup.
+% \begin{macro}{\@make@specialcolbox}
+% \changes{v1.4m}{2025/02/14}{Macro added}
+% Make the colbox when \cs{enlargethispage} was used.
% \begin{macrocode}
-%<*2ekernel|fltrace>
-\gdef \@makespecialcolbox {%
+%</2ekernel|latexrelease>
+%<*2ekernel|latexrelease|fltrace>
+\def \@make@specialcolbox {%
%<*trace>
\fl@trace{Kludgeins ht \the\ht\@kludgeins\space
dp \the\dp\@kludgeins\space
wd \the\wd\@kludgeins}%
%</trace>
+ \@outputbox@append {\vskip-\@outputbox@depth}%
+ \@tempdima \@colht
% \end{macrocode}
-% First we find the natural height of the column.
%
-% See above for discussion of what is happening here.
-%
-% This needs further investigation, especially in this `special
-% case'.
-% \changes{v1.0k}{1994/02/08}{boxmaxdepth setting removed}
% \begin{macrocode}
- \setbox\@outputbox \vbox {%
- \@texttop
- \dimen@ \dp\@outputbox
- \unvbox\@outputbox
- \vskip-\dimen@
- }%
- \@tempdima \@colht
\ifdim \wd\@kludgeins>\z@
% \end{macrocode}
% Note that in this case (the *-version), the height of the
@@ -1889,10 +2107,6 @@
% space added to force shrinking.
% \task{CAR}{Further investigation of kludge-* space}
%
-% See above for a discussion of the |\boxmaxdepth| setting here.
-%
-% \changes{v1.0k}{1994/02/08}{boxmaxdepth setting added}
-% \changes{v1.0l}{1994/03/15}{Removed boxmaxdepth setting.}
% \begin{macrocode}
\advance \@tempdima -\ht\@outputbox
\advance \@tempdima \pageshrink
@@ -1903,7 +2117,6 @@
\fl@trace {Hence, space added: \the \@tempdima}%
%</trace>
\setbox\@outputbox \vbox to \@colht {%
-% \boxmaxdepth \maxdepth
\unvbox\@outputbox
\vskip \@tempdima
\@textbottom
@@ -1940,23 +2153,592 @@
\@textbottom}%
\vss}%
\fi
-% \end{macrocode}
-% Finally we need to explicitly make the insert box void.
-% \begin{macrocode}
{\setbox \@tempboxa \box \@kludgeins}%
%<*trace>
\fl@trace {kludgeins box made void}%
%</trace>
}
-%</2ekernel|fltrace>
+%</2ekernel|latexrelease|fltrace>
+%<*2ekernel|latexrelease>
% \end{macrocode}
% \end{macro}
%
+%
+%
+%
+% \begin{macro}{\@outputbox@removebskip}
+% \changes{v1.4m}{2025/02/14}{Macro added}
+% \changes{v1.4m}{2025/02/14}{Finally fix bottom skip bug (from 2.09)}
+%
+% This is really a bug fix for the kernel (from the 2.09 days) but
+% one we only make by default in new documents that are using
+% \cs{DocumentMetadata}. If \cs{raggedbottom} is in force,
+% footnotes get attached to the main galley at a distance of
+% \cs{footskip} on all pages except on those that are ended by
+% \cs{newpage} or \cs{clearpage} where the \cs{vfil} from
+% \cs{newpage} pushes the footnotes to the very bottom.
+%
+% This is kind of a weird difference to a page ending with
+% \cs{pagebreak}---in that case the page is also run
+% short, but the footnotes are not pushed to the bottom.
+%
+% In \pkg{footmisc} \cs{@outputbox@removebskip} is only applied when
+% \pkg{footmisc} is called with an option specifying the
+% footnote placement, i.e., not in the default case.
+% In new documents we apply it always.
+% \begin{macrocode}
+\def\@outputbox@removebskip{%
+% \end{macrocode}
+% We first test if we are in a \cs{raggedbottom} layout. If not we
+% do nothing, but we don't disable the code because
+% \cs{raggedbottom} may get used only for some parts of the
+% document.
+% \begin{macrocode}
+ \ifx\@textbottom\relax \else
+% \end{macrocode}
+% In some special circumstances the \cs{@outputbox} might be
+% void. As \cs{@outputbox@append} below would change this, we
+% better handle this case and leave it unchanged in this situation,
+% because otherwise we can't detect that situation any longer
+% (needed, for example, in \pkg{ftnright}).
+% \begin{macrocode}
+ \ifvoid \@outputbox
+ \global\let\@outputbox@reinsertbskip\relax
+ \else
+% \end{macrocode}
+% If not, we drop the final skip at the end of \cs{@outputbox}
+% provided there is one and it has a glue stretch
+% order of 1 or more (i.e., contains a \texttt{fil} or \texttt{fill} part).
+% \begin{macrocode}
+ \@outputbox@append{%
+ \@tempskipa\lastskip
+ \ifnum \gluestretchorder\@tempskipa>\z@
+ \unskip
+% \end{macrocode}
+%
+% \begin{macro}{\@outputbox@reinsertbskip}
+% We also record the value so that it can be reinserted
+% elsewhere. As we have to do this globally, we also need to
+% explicitly reset it if we don't find any such glue.
+% \begin{macrocode}
+ \xdef\@outputbox@reinsertbskip
+ {\noexpand\@outputbox@append{\vskip\the\@tempskipa}}%
+ \else
+ \global\let\@outputbox@reinsertbskip\relax
+ \fi
+ }%
+ \fi
+ \fi
+}
+% \end{macrocode}
+% We need a trivial top-level definition for
+% \cs{@outputbox@reinsertbskip} in case the first page has no
+% bottom glue and the command gets called.
+% \begin{macrocode}
+\let \@outputbox@reinsertbskip \relax
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+% \subsection{The output routine configuration components}
+%
+% Here we provide the comands that are used to define code for the
+% socket \socket{build/column/outputbox}. The all manipulate the
+% \cs{@outputbox} box in one way or another.
+%
+%
+% \begin{macro}{\@outputbox@append}
+% \changes{v1.4m}{2025/02/14}{Macro added}
+%
+% This general purpose command alters the \cs{@outputbox} box by
+% appending material to it. As this is a box typesetting operation
+% we make sure that the last line of the box reflects the true
+% depth of the last line (in case that is needed later). We also
+% expose the current depth of \cs{@outputbox} as
+% \cs{@outputbox@depth} before unboxing so that its value can be
+% used by \verb=#1= if wanted.
+% \begin{macrocode}
+\def\@outputbox@append #1{%
+ \setbox\@outputbox \vbox {%
+% \end{macrocode}
+% This |\boxmaxdepth| setting is to ensure that deep footnotes
+% do not overwrite the footer (on account of the negative skip
+% added later): it should use |\@maxdepth| otherwise the change is
+% pointless when there are footnotes.
+%
+% But see also its use when combining floats.
+% \changes{v1.0l}{1994/03/15}{\cs{maxdepth} changed to \cs{@maxdepth}}
+% \begin{macrocode}
+ \boxmaxdepth \@maxdepth
+ \@outputbox@depth\dp\@outputbox % if needed in #1
+ \unvbox \@outputbox
+ #1%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%
+% \begin{macro}{\@outputbox@appendfootnotes}
+% \changes{v1.4m}{2025/02/14}{Macro added}
+%
+% This command appends the footnotes to the \cs{@outputbox} (if
+% there are any). If not, then it does nothing.
+% \begin{macrocode}
+\def\@outputbox@appendfootnotes {%
+ \ifvoid\footins \else
+% \end{macrocode}
+% Handling split footnotes need further work so this is for the
+% moment just a dummy that does nothing. It might vanish and get
+% replaced by a socket eventually.
+% \task{fmi}{The code for handling split footnotes will get revised as part
+% of socket handling in the future}
+% \begin{macrocode}
+ \@makecol@handlesplitfootnotes
+% \end{macrocode}
+%
+% The following socket can be used to manipulate the material in
+% \cs{footins} box, for example, if the footnotes are to be presented
+% all together in a single paragraph. By default it does nothing.
+% \begin{macrocode}
+ \UseSocket{build/column/footnotes}%
+% \end{macrocode}
+% Then the footnotes are appended:
+% \begin{macrocode}
+ \@outputbox@append{%
+ \vskip \skip\footins
+% \end{macrocode}
+% This is socket adjusts the tagging of the \cs{footins} box, if necessary.
+% \begin{macrocode}
+ \UseTaggingSocket{build/column/footins}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \color@begingroup
+ \normalcolor
+ \footnoterule
+% \end{macrocode}
+% Support for \pkg{pdfcolfoot}, eventually this can go once color
+% is properly supported. The csname is constructed in case the command
+% is not defined, i.e., the package not loaded.
+% \task{fmi}{Fix when no longer needed}
+% \begin{macrocode}
+ \csname pdfcolfoot@current\endcsname
+ \unvbox \footins
+ \color@endgroup
+ }%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@makecol@handlesplitfootnotes}
+% For future extensions \ldots
+% \begin{macrocode}
+\let \@makecol@handlesplitfootnotes \@empty
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@outputbox@attachfloats}
+% \changes{v1.4m}{2025/02/14}{Macro added}
+% \begin{macro}{\@outputbox@attachtopfloats}
+% \changes{v1.4m}{2025/02/14}{Macro added}
+% \begin{macro}{\@outputbox@attachbottomfloats}
+% \changes{v1.4m}{2025/02/14}{Macro added}
+% Attaching top and bottom floats can usually be done in one go,
+% but for special layouts we might want more control so we provide
+% also separate commands.
+%
+% The next command was called \cs{@combinefloats} in the past.
+% \begin{macrocode}
+\def \@outputbox@attachfloats {%
+ \ifx \@toplist\@empty \else \@cflt \fi
+ \ifx \@botlist\@empty \else \@cflb \fi
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def \@outputbox@attachtopfloats {%
+ \ifx \@toplist\@empty \else \@cflt \fi
+}
+\def \@outputbox@attachbottomfloats {%
+ \ifx \@botlist\@empty \else \@cflb \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% The next three conditionals might be useful when setting up running
+% headers and footers so perhaps they should be change to CamelCase
+% names. For now they are internal.
+%
+% \begin{macro}{\@if@flushbottom@TF}
+% \changes{v1.4m}{2025/02/14}{Macro added}
+% Test for \cs{flushbottom} (currently not used).
+% \begin{macrocode}
+\def\@if@flushbottom@TF{%
+ \ifx\@textbottom\relax
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@if@footnotes@TF}
+% \changes{v1.4m}{2025/02/14}{Macro added}
+% Test if footnotes are present on the current page.
+% \begin{macrocode}
+\def\@if@footnotes@TF{%
+ \ifvoid\footins
+ \expandafter\@secondoftwo
+ \else
+ \expandafter\@firstoftwo
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@if@bottomfloats@TF}
+% \changes{v1.4m}{2025/02/14}{Macro added}
+% Test if bottom floats are around.
+% \begin{macrocode}
+\def\@if@bottomfloats@TF{%
+ \ifx \@botlist\@empty
+ \expandafter\@secondoftwo
+ \else
+ \expandafter\@firstoftwo
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%
+%
+%
+% \subsubsection{Configuration sockets}
+%
+% \changes{v1.4m}{2025/02/14}{Use sockets and hooks in OR}
+%
+% \begin{socketdecl}{build/column/outputbox}
+% \changes{v1.4m}{2025/02/14}{Socket added}
+% We have one socket that is supposed to augment the \cs{@outputbox}
+% by attaching floats and footnotes with appropriate spacing.
+% \begin{macrocode}
+\NewSocket{build/column/outputbox}{0}
+% \end{macrocode}
+% \end{socketdecl}
+%
+%
+% The following plugs are available for
+% this socket:
+%
+% \begin{plugdecl}{space-footnotes-floats}
+% After the galley text there is a vertical \cs{vfill} followed by
+% any footnotes followed by the bottom floats, if any.
+% \begin{macrocode}
+\NewSocketPlug {build/column/outputbox}{space-footnotes-floats} {%
+ \@if@footnotes@TF
+ {\@outputbox@append{\vfill}}%
+ {\@if@bottomfloats@TF
+ {\@outputbox@append{\vfill}}%
+ {\@outputbox@reinsertbskip}%
+ }%
+ \@outputbox@appendfootnotes
+ \@outputbox@attachfloats
+}
+% \end{macrocode}
+% \end{plugdecl}
+%
+% \begin{plugdecl}{footnotes-space-floats}
+% As before but the \cs{vfill} is between footnotes and floats.
+% \begin{macrocode}
+\NewSocketPlug {build/column/outputbox}{footnotes-space-floats} {%
+ \@outputbox@appendfootnotes
+ \@if@bottomfloats@TF
+ {\@outputbox@append{\vfill}}%
+ {\@outputbox@reinsertbskip}%
+ \@outputbox@attachfloats
+}
+% \end{macrocode}
+% \end{plugdecl}
+%
+% \begin{plugdecl}{floats-space-footnotes}
+% Floats immediately after the galley text and footnotes at the bottom.
+% \begin{macrocode}
+\NewSocketPlug {build/column/outputbox}{floats-space-footnotes} {%
+ \@outputbox@attachfloats
+ \@if@footnotes@TF
+ {\@outputbox@append{\vfill}}%
+ {\@outputbox@reinsertbskip}%
+ \@outputbox@appendfootnotes
+}
+% \end{macrocode}
+% \end{plugdecl}
+%
+% \begin{plugdecl}{space-floats-footnotes}
+% Both floats and footnotes are pushed to the bottom with
+% footnotes last.\footnote{There are two more
+% permutations, but neither of them has ever been requested so
+% they aren't set up by default --- doing that in a class
+% would be trivial though.}
+% \begin{macrocode}
+\NewSocketPlug {build/column/outputbox}{space-floats-footnotes} {%
+ \@if@footnotes@TF
+ {\@outputbox@append{\vfill}}%
+ {\@if@bottomfloats@TF
+ {\@outputbox@append{\vfill}}%
+ {\@outputbox@reinsertbskip}}%
+ \@outputbox@attachfloats
+ \@outputbox@appendfootnotes
+}
+% \end{macrocode}
+% \end{plugdecl}
+%
+%
+%
+% \begin{plugdecl}{floats-footnotes}
+% All excess space has to be distributed across the existing
+% glue on the page, e.g., within the text galley, the
+% separation between blocks, etc.
+% The order is text, floats, footnotes.
+% \begin{macrocode}
+\NewSocketPlug {build/column/outputbox}{floats-footnotes} {%
+ \@outputbox@attachfloats
+ \@outputbox@appendfootnotes
+% \end{macrocode}
+% We do reinsert the bottom skip from \cs{newpage} if it
+% was taken out earlier. This is, strictly speaking, not necessary
+% in most cases, but it is a \cs{vfil} while \cs{raggedbottom} is
+% only generating \verb=\vspace{0pt plus .0001fil}=, so if you have
+% several \cs{vfil} on the page before the \cs{newpage} you would
+% alter the space distribution if one is taken out.
+% \begin{macrocode}
+ \@outputbox@reinsertbskip
+}
+% \end{macrocode}
+%
+% \end{plugdecl}
+%
+% \begin{plugdecl}{footnotes-floats}
+% \begin{macrocode}
+\NewSocketPlug {build/column/outputbox}{footnotes-floats} {%
+ \@outputbox@appendfootnotes
+ \@outputbox@attachfloats
+ \@outputbox@reinsertbskip
+}
+% \end{macrocode}
+% The \texttt{footnote-floats} plug implements the layout used by
+% \LaTeX{} but with the bottom skip bug corrected. This will be
+% the default when \cs{DocumentMetadata} is used; it can be
+% overwritten either through \pkg{footmisc} or by assigning any of
+% the other plugs (or by coding yet another plug for the socket).
+% \end{plugdecl}
+%
+% \begin{plugdecl}{footnotes-floats-legacy}
+% This implements the 2.09 layout (including its bottom skip bug).
+% \begin{macrocode}
+\NewSocketPlug {build/column/outputbox}{footnotes-floats-legacy} {%
+% \end{macrocode}
+% In the legacy case we don't really want to take out the bottom
+% skip, but rather then altering \cs{@outputbox@removebskip} in
+% \cs{makecol} to do nothing, which we would then have to undo in
+% each other layout, we simply reinsert the dropped skip
+% immediately again.
+% \begin{macrocode}
+ \@outputbox@reinsertbskip
+ \@outputbox@appendfootnotes
+ \@outputbox@attachfloats
+}
+% \end{macrocode}
+% The \texttt{footnote-floats-legacy} plug is the default used by
+% \LaTeX{} when \cs{DocumentMetadata} is not used; it can be
+% overwritten
+% either through \pkg{footmisc} or
+% by assigning any of the other plugs (or by coding yet another
+% plug for the socket).
+% \begin{macrocode}
+\AssignSocketPlug {build/column/outputbox}{footnotes-floats-legacy}
+% \end{macrocode}
+% \end{plugdecl}
+%
+%
+%
+%
+% \begin{socketdecl}{build/column/footnotes}
+%
+% The socket allowing the manipulation of \cs{footins} box
+% (result needs to be moved back in there). Used when footnotes are
+% reformatted into a single paragraph by the
+% \texttt{para} option of \pkg{footmisc}. By default it does nothing.
+% \begin{macrocode}
+\NewSocket{build/column/footnotes}{0}
+% \end{macrocode}
+% \end{socketdecl}
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+% \begin{hookdecl}{build/page/before,
+% build/page/after}
+% \changes{v1.4m}{2025/02/14}{Hook added}
+% Hooks at the start and end of \cs{@outputpage} for use by packages.
+% \begin{macrocode}
+\NewMirroredHookPair{build/page/before}{build/page/after}
+% \end{macrocode}
+% \end{hookdecl}
+%
+%
+%
+% \begin{hookdecl}{build/page/reset}
+% \changes{v1.4m}{2025/02/14}{Hook added}
+% Hook in \cs{@outputpage} to reset special galley conventions
+% within the output routine.
+% \begin{macrocode}
+\NewHook {build/page/reset}
+% \end{macrocode}
+% \end{hookdecl}
+%
+%
+%
+% \begin{hookdecl}{build/column/before,build/column/after}
+% \changes{v1.4m}{2025/02/14}{Hook added}
+% Hooks at the start and end of \cs{@makecol} for use by packages.
+% \begin{macrocode}
+\NewMirroredHookPair{build/column/before}{build/column/after}
+% \end{macrocode}
+% \end{hookdecl}
+%
+%
+%
+% \begin{macrocode}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\@makecol}{\@makecol adding hooks/sockets}%
+%<latexrelease>
+%<latexrelease>\gdef \@makecol {%
+%<latexrelease> \ifvoid\footins
+%<latexrelease> \setbox\@outputbox \box\@cclv
+%<latexrelease> \else
+%<latexrelease> \setbox\@outputbox \vbox {%
+%<latexrelease> \boxmaxdepth \@maxdepth
+%<latexrelease> \unvbox \@cclv
+%<latexrelease> \vskip \skip\footins
+%<latexrelease> \color@begingroup
+%<latexrelease> \normalcolor
+%<latexrelease> \footnoterule
+%<latexrelease> \unvbox \footins
+%<latexrelease> \color@endgroup
+%<latexrelease> }%
+%<latexrelease> \fi
+%<latexrelease> \let\@elt\relax
+%<latexrelease> \xdef\@freelist{\@freelist\@midlist}%
+%<latexrelease> \global \let \@midlist \@empty
+%<latexrelease> \@combinefloats
+%<latexrelease> \ifvbox\@kludgeins
+%<latexrelease> \@makespecialcolbox
+%<latexrelease> \else
+%<latexrelease> \setbox\@outputbox \vbox to\@colht {%
+%<latexrelease> \@texttop
+%<latexrelease> \dimen@ \dp\@outputbox
+%<latexrelease> \unvbox \@outputbox
+%<latexrelease> \vskip -\dimen@
+%<latexrelease> \@textbottom
+%<latexrelease> }%
+%<latexrelease> \fi
+%<latexrelease> \global \maxdepth \@maxdepth
+%<latexrelease>}
+%<latexrelease>
+%<latexrelease>\gdef \@makespecialcolbox {%
+%<latexrelease> \setbox\@outputbox \vbox {%
+%<latexrelease> \@texttop
+%<latexrelease> \dimen@ \dp\@outputbox
+%<latexrelease> \unvbox\@outputbox
+%<latexrelease> \vskip-\dimen@
+%<latexrelease> }%
+%<latexrelease> \@tempdima \@colht
+%<latexrelease> \ifdim \wd\@kludgeins>\z@
+%<latexrelease> \advance \@tempdima -\ht\@outputbox
+%<latexrelease> \advance \@tempdima \pageshrink
+%<latexrelease> \setbox\@outputbox \vbox to \@colht {%
+%<latexrelease> \unvbox\@outputbox
+%<latexrelease> \vskip \@tempdima
+%<latexrelease> \@textbottom
+%<latexrelease> }%
+%<latexrelease> \else
+%<latexrelease> \advance \@tempdima -\ht\@kludgeins
+%<latexrelease> \setbox \@outputbox \vbox to \@colht {%
+%<latexrelease> \vbox to \@tempdima {%
+%<latexrelease> \unvbox\@outputbox
+%<latexrelease> \@textbottom}%
+%<latexrelease> \vss}%
+%<latexrelease> \fi
+%<latexrelease> {\setbox \@tempboxa \box \@kludgeins}%
+%<latexrelease>}
+%<latexrelease>
+%<latexrelease> \let \@make@normalcolbox \@undefined
+%<latexrelease> \let \@make@specialcolbox \@undefined
+%<latexrelease> \let \@outputbox@removebskip \@undefined
+%<latexrelease> \let \@outputbox@reinsertbskip \@undefined
+%<latexrelease>
+%<latexrelease> \let \@outputbox@append \@undefined
+%<latexrelease> \let \@outputbox@appendfootnotes \@undefined
+%<latexrelease> \let \@outputbox@attachfloats \@undefined
+%<latexrelease> \let \@outputbox@attachtopfloats \@undefined
+%<latexrelease> \let \@outputbox@attachbottomfloats \@undefined
+%<latexrelease>
+%<latexrelease> \let \@if@flushbottom@TF \@undefined
+%<latexrelease> \let \@if@footnotes@TF \@undefined
+%<latexrelease> \let \@if@bottomfloats@TF \@undefined
+%<latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
+%
+% \begin{macro}{\@reinserts}
+% \changes{v1.0e}{1993/12/01}{Command added}
+% This is the code which reinserts the inserts. It puts them all
+% in one place; this can make some of them come out on the wrong
+% page.
+% It has been put into a separate macro to expedite experimentation.
+% \begin{macrocode}
+\gdef \@reinserts{%
+ \ifvoid\footins\else\insert\footins{\unvbox\footins}\fi
+ \ifvbox\@kludgeins\insert\@kludgeins
+ {\unvbox\@kludgeins}\fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
% \begin{macro}{\@texttop}
% \begin{macro}{\@textbottom}
% These do nothing as a default.
% \begin{macrocode}
-%<*2ekernel>
\let \@texttop \relax
\let \@textbottom \relax
% \end{macrocode}
@@ -2028,7 +2810,8 @@
% {New, experimental, versions: need in-lining}
% \changes{v1.1s}{1995/11/10}{In-lined}
% \changes{v1.1w}{1996/09/21}{Added \cs{@parboxrestore} and made
-% consequent deletions: wait for the howls of protest}
+% consequent deletions: wait for the howls of protest}
+% \changes{v1.4m}{2025/02/14}{Hooks and sockets added}
%
% The |\color@hbox| hooks here are used to avoid putting just a
% colour special into an otherwise empty box (in a header or
@@ -2068,7 +2851,20 @@
%<latexrelease>\IncludeInRelease{2025/06/01}%
%<latexrelease> {\@outputpage}{Use new mark mechanism}%
%<*2ekernel|latexrelease>
-\def\@outputpage{%
+% \end{macrocode}
+% Temp definition to vanish again when something is offered by the backend:
+% \begin{macrocode}
+\protected \def \pdfannot@link@on@@ { \csname pdfannot_link_on:\endcsname }
+\protected \def \pdfannot@link@off@@ { \csname pdfannot_link_off:\endcsname }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def \@outputpage {%
+% \end{macrocode}
+% We start with a hook available to packages that want to prepend
+% code to \cs{@outputpage}.
+% \begin{macrocode}
+ \UseHook {build/page/before}%
% \end{macrocode}
% The |\endgroup| is put in by |\aftergroup|.
% \begin{macrocode}
@@ -2078,7 +2874,12 @@
%
% First the stuff for the writes.
%
-% From here \ldots\ was in the command |\@writesetup|.
+% From here on was orginially in the command |\@writesetup|.
+%
+% The following defenition of \cs{protect} is the one active during
+% the \cs{write} statement that migrate out of the \cs{shipout}
+% box, so even though it is immediately changed below (inside
+% \cs{shipout} it still has to be here!
% \begin{macrocode}
\let \protect \noexpand
% \end{macrocode}
@@ -2146,16 +2947,29 @@
\@parboxrestore
% \end{macrocode}
% \ldots\ to here was in the command |\@writesetup|.
+%
+% Hook to allow adding resets local to the output routine processing, e.g.,
+% in \cs{write} or running headers/footers, for packages that set
+% up special conventions in the main galley that should not leak
+% into the page production just because a page break happens in the
+% middle of such an environment.
+% \begin{macrocode}
+ \UseHook {build/page/reset}%
+% \end{macrocode}
% \begin{macrocode}
\shipout \vbox{%
+% \end{macrocode}
+% Inside the \cs{shipout} box we have a different setting for \cs{protect}.
+% \begin{macrocode}
\set@typeset@protect
\aftergroup \endgroup
% \end{macrocode}
-% Correct? or just restore by ending the group?
+% Once the \cs{shipout} boxs ends \cs{protect} is again
+% \cs{noexpand} which is correct for any \cs{write} statements, but
+% once they are processed we want to get back to the following setting:
% \begin{macrocode}
\aftergroup \set@typeset@protect
% \end{macrocode}
-% This first bit has been moved inside the shipped out box.
%
% Now the setup inside the shipped out box; this should contain all
% the stuff that could only affect typesetting; other stuff may need
@@ -2164,13 +2978,18 @@
% From here \ldots\ was in the command |\@shipoutsetup|.
% \begin{macrocode}
\if@specialpage
- \global\@specialpagefalse\@nameuse{ps@\@specialstyle}%
+ \global \@specialpagefalse
+ \@nameuse {ps@\@specialstyle}%
\fi
\if@twoside
- \ifodd\count\z@ \let\@thehead\@oddhead \let\@thefoot\@oddfoot
- \let\@themargin\oddsidemargin
- \else \let\@thehead\@evenhead
- \let\@thefoot\@evenfoot \let\@themargin\evensidemargin
+ \ifodd\count\z@
+ \let \@thehead \@oddhead
+ \let \@thefoot \@oddfoot
+ \let \@themargin \oddsidemargin
+ \else
+ \let \@thehead \@evenhead
+ \let \@thefoot \@evenfoot
+ \let \@themargin \evensidemargin
\fi
\fi
% \end{macrocode}
@@ -2199,52 +3018,82 @@
% Reset these here (previously reset separately for head and foot)
% \changes{v1.2b}{1997/04/14}
% {Move \cs{label} and \cs{index} (from patch file)}
+% \changes{v1.4l}{2025/01/21}{Support extended syntax
+% for \cs{label}, \cs{index}, and \cs{glossary} (gh/311)}
+% \changes{v1.4m}{2025/01/23}
+% {Make \cs{label}, \cs{index} and \cs{glossary} truely invisible
+% when typesetting (gh/1638)}
% \begin{macrocode}
- \let\label\@gobble
- \let\index\@gobble
- \let\glossary\@gobble
+ \let \label \@gobble@with@sphack@om
+ \let \index \@gobble@with@sphack@som
+ \let \glossary \@gobble@with@sphack@om
% \end{macrocode}
%
% \begin{macrocode}
- \baselineskip\z@skip \lineskip\z@skip \lineskiplimit\z@
+ \baselineskip \z@skip
+ \lineskip \z@skip
+ \lineskiplimit \z@
% \end{macrocode}
% \ldots\ to here was in the command |\@shipoutsetup|.
% \begin{macrocode}
\@begindvi
\vskip \topmargin
\moveright\@themargin \vbox {%
- \setbox\@tempboxa \vbox to\headheight{%
+ \setbox\@tempboxa \vbox to\headheight {%
\vfil
- \color@hbox
- \normalcolor
- \hb@xt@\textwidth{\@thehead}%
- \color@endbox
% \end{macrocode}
-% 22 Feb 87
-% \begin{macrocode}
- }%
- \dp\@tempboxa \z@
- \box\@tempboxa
+% Tagging socket that receives the header in its second argument to
+% surround the header with appropriate tagging structures (first
+% argument is unused). If tagging is disabled it returns the
+% content of the second argument.
+% \begin{macrocode}
+ \pdfannot@link@off@@
+ \UseTaggingSocket{build/page/header}{}%
+ {
+ \color@hbox
+ \normalcolor
+ \hb@xt@ \textwidth {\@thehead }%
+ \color@endbox
+ }
+ \pdfannot@link@on@@
+ }
+ \dp \@tempboxa \z@
+ \box \@tempboxa
\vskip \headsep
- \box\@outputbox
+ \box \@outputbox
\baselineskip \footskip
- \color@hbox
- \normalcolor
- \hb@xt@\textwidth{\@thefoot}%
- \color@endbox
- }%
- }%
+% \end{macrocode}
+% Tagging socket that receives the footer in its second argument to
+% surround the footer with appropriate tagging structures (first
+% argument is unused). If tagging is disabled it returns the
+% content of the second argument.
+% \begin{macrocode}
+ \pdfannot@link@off@@
+ \UseTaggingSocket{build/page/footer}{}%
+ {
+ \color@hbox
+ \normalcolor
+ \hb@xt@ \textwidth {\@thefoot }%
+ \color@endbox
+ }
+ \pdfannot@link@on@@
+ }
+ }
% \end{macrocode}
% |\endgroup| now inserted by |\aftergroup|
%
% Restore |\if@newlist|
% \begin{macrocode}
- \global\let\if@newlist\@@if@newlist
+ \global \let \if@newlist \@@if@newlist
% \end{macrocode}
%
% \begin{macrocode}
\global \@colht \textheight
\stepcounter{page}%
+% \end{macrocode}
+% Another hook for packages that want to append material to \cs{@outputpage}.
+% \begin{macrocode}
+ \UseHook {build/page/after}%
}
%<latexrelease>\EndIncludeInRelease
% \end{macrocode}
@@ -2306,10 +3155,11 @@
%<latexrelease> \global \@colht \textheight
%<latexrelease> \stepcounter{page}%
% \end{macrocode}
-% It is now clear that this does something useful, thanks to Pieter
-% van Oostrum. It is needed because a float page is made without
-% using TeX's page-builder; thus the output routine is never called
-% so the marks are not updated.
+% It is now clear that this does something useful (in the old mark
+% mechanism), thanks to Pieter van Oostrum pointing this out. It
+% is needed because a float page is made without using TeX's
+% page-builder; thus the output routine is never called so the
+% marks are not updated.
% \begin{macrocode}
%<latexrelease> \let\firstmark\botmark
%<latexrelease>}
@@ -2401,7 +3251,26 @@
% \end{macrocode}
% \end{macro}
%
+%
+%
+%
+%
+%
+% \subsubsection{Dealing with floats}
+%
+%
+%
% \begin{macro}{\@combinefloats}
+% \changes{v1.4m}{2025/02/14}{Macro got a new name}
+% Old name for what is now called \cs{@outputbox@attachfloats};
+% kept to support legacy packages.
+% \begin{macrocode}
+\let \@combinefloats \@outputbox@attachfloats
+% \end{macrocode}
+% \end{macro}
+%
+%
+
% \begin{macro}{\@cflt}
% \changes{v1.0h}{1993/12/12}{name changed}
% \begin{macro}{\@cflb}
@@ -2411,14 +3280,6 @@
% moved there; this also agrees with the original pseudocode.
%
% \changes{v1.0h}{1993/12/12}{boxmaxdepth setting moved}
-% \begin{macrocode}
-\def \@combinefloats {%
-% \boxmaxdepth \maxdepth
- \ifx \@toplist\@empty \else \@cflt \fi
- \ifx \@botlist\@empty \else \@cflb \fi
-}
-% \end{macrocode}
-%
% \changes{v1.0h}{1993/12/12}{defs changed to lets}
% \begin{macrocode}
\def \@cflt{%
@@ -2458,7 +3319,7 @@
% \end{macrocode}
% \end{macro}
% \end{macro}
-% \end{macro}
+%
%
% \begin{macro}{\@comflelt}
% \begin{macro}{\@comdblflelt}
@@ -2953,7 +3814,7 @@
%
% \changes{v1.2n}{2015/01/14}{float order in 2-column (latexrelease)}
% \begin{macrocode}
-%<latexrelease|fltrace|flafter>\IncludeInRelease{2015/01/01}%
+%<latexrelease|fltrace|flafter>\IncludeInRelease{2025/06/01}%
%<latexrelease|fltrace|flafter> {\@addtocurcol}{float order in 2-column}%
%<*2ekernel|latexrelease|fltrace|flafter>
\def \@addtocurcol {%
@@ -3001,6 +3862,13 @@
%</trace>
\fi
\advance \@reqcolroom \ht\@currbox
+% \end{macrocode}
+% We save the current value of \cs{@reqcolroom} so that we can
+% return to this value later, in case a test fails that may have added
+% something to it.
+% \changes{v1.4n}{2025/01/29}{Save current value of \cs{@reqcolroom} (gh/1645)}
+% \begin{macrocode}
+ \saved@reqcolroom \@reqcolroom
%<*trace>
\fl@trace{float size = \the \ht \@currbox (addtocurcol)}%
\fl@trace{colroom = \the \@colroom (addtocurcol)}%
@@ -3166,6 +4034,158 @@
}%
%</2ekernel|latexrelease|fltrace|flafter>
%<latexrelease|fltrace|flafter>\EndIncludeInRelease
+% \end{macrocode}
+% The rollback code is rather complicated as it has to account for
+% the fact that we roll back not just the kernel but also the
+% packages \pkg{flafter} and \pkg{fltrace}.
+% \begin{macrocode}
+%<latexrelease|fltrace|flafter>\IncludeInRelease{2015/01/01}%
+%<latexrelease|fltrace|flafter> {\@addtocurcol}{float order in 2-column}%
+%<latexrelease|fltrace|flafter>\def \@addtocurcol {%
+%<*trace>
+%<latexrelease|fltrace|flafter> \fl@trace{***Start addtocurcol}%
+%</trace>
+%<latexrelease|fltrace|flafter> \@insertfalse
+%<latexrelease|fltrace|flafter> \@setfloattypecounts
+%<latexrelease|fltrace|flafter> \ifnum \@fpstype=8
+%<*trace>
+%<latexrelease|fltrace|flafter> \fl@trace{fpstype !p only (addtocurcol): \the \@fpstype = 8?}%
+%</trace>
+%<latexrelease|fltrace|flafter> \else
+%<latexrelease|fltrace|flafter> \ifnum \@fpstype=24
+%<*trace>
+%<latexrelease|fltrace|flafter> \fl@trace{fpstype p only (addtocurcol): \the \@fpstype = 24?}%
+%</trace>
+%<latexrelease|fltrace|flafter> \else
+%<latexrelease|fltrace|flafter> \@flsettextmin
+%<*trace>
+%<latexrelease|fltrace|flafter> \fl@trace{textfloatsheight (before) = \the \@textfloatsheight}%
+%</trace>
+%<latexrelease|fltrace|flafter> \advance \@textmin \@textfloatsheight
+%<latexrelease|fltrace|flafter> \@reqcolroom \@pageht
+%<*trace>
+%<latexrelease|fltrace|flafter> \fl@trace{textmin + textfloatsheight: \the \@textmin}%
+%<latexrelease|fltrace|flafter> \fl@trace{page-so-far: \the \@reqcolroom}%
+%</trace>
+%<latexrelease|fltrace|flafter> \ifdim \@textmin>\@reqcolroom
+%<latexrelease|fltrace|flafter> \@reqcolroom \@textmin
+%<*trace>
+%<latexrelease|fltrace|flafter> \fl@trace{ORD? textmin being used}%
+%</trace>
+%<latexrelease|fltrace|flafter> \fi
+%<latexrelease|fltrace|flafter> \advance \@reqcolroom \ht\@currbox
+%<*trace>
+%<latexrelease|fltrace|flafter> \fl@trace{float size = \the \ht \@currbox (addtocurcol)}%
+%<latexrelease|fltrace|flafter> \fl@trace{colroom = \the \@colroom (addtocurcol)}%
+%<latexrelease|fltrace|flafter> \fl@trace{reqcolroom = \the \@reqcolroom (addtocurcol)}%
+%</trace>
+%<latexrelease|fltrace|flafter> \ifdim \@colroom>\@reqcolroom
+%<latexrelease|fltrace|flafter> \@flsetnum \@colnum
+%<latexrelease|fltrace|flafter> \ifnum \@colnum>\z@
+%<latexrelease|fltrace|flafter> \@bitor\@currtype\@deferlist
+%<latexrelease|fltrace|flafter> \@testwrongwidth\@currbox
+%<*trace>
+%<latexrelease|fltrace|flafter> \fl@trace{deferlist: \@deferlist: (addtocurcol-before)}%
+%</trace>
+%<latexrelease|fltrace|flafter> \if@test
+%<*trace>
+%<latexrelease|fltrace|flafter> \fl@trace{type already on list: defer (addtocurcol)}%
+%</trace>
+%<latexrelease|fltrace|flafter> \else
+%<latexrelease|fltrace|flafter> \@bitor\@currtype\@botlist
+%<*trace>
+%<latexrelease|fltrace|flafter> \fl@trace{botlist: \@botlist: (addtocurcol-before)}%
+%</trace>
+%<latexrelease|fltrace|flafter> \if@test
+%<*trace>
+%<latexrelease|fltrace|flafter> \fl@trace{type already on list: bot---sent to addtobot}%
+%</trace>
+%<latexrelease|fltrace|flafter> \@addtobot
+%<latexrelease|fltrace|flafter> \else
+%<*trace>
+%<latexrelease|fltrace|flafter> \fl@trace{fpstype \ifodd \@tempcnta OK \else not \fi
+%<latexrelease|fltrace|flafter> here: \the \@fpstype}%
+%</trace>
+%<latexrelease|fltrace|flafter> \ifodd \count\@currbox
+%<latexrelease|fltrace|flafter> \advance \@reqcolroom \intextsep
+%<latexrelease|fltrace|flafter> \ifdim \@colroom>\@reqcolroom
+%<latexrelease|fltrace|flafter> \global \advance \@colnum \m@ne
+%<latexrelease|fltrace|flafter> \global \advance \@textfloatsheight \ht\@currbox
+%<latexrelease|fltrace|flafter> \global \advance \@textfloatsheight 2\intextsep
+%<latexrelease|fltrace|flafter> \@cons \@midlist \@currbox
+%<*trace>
+%<latexrelease|fltrace|flafter> \fl@trace{***Success: here}%
+%<latexrelease|fltrace|flafter> \fl@trace{textfloatsheight (after-here) =
+%<latexrelease|fltrace|flafter> \the \@textfloatsheight}%
+%<latexrelease|fltrace|flafter> \fl@trace{colnum (after-here) = \the \@colnum}%
+%</trace>
+%<latexrelease|fltrace|flafter> \if@nobreak
+%<latexrelease|fltrace|flafter> \nobreak
+%<latexrelease|fltrace|flafter> \@nobreakfalse
+%<latexrelease|fltrace|flafter> \everypar{}%
+%<latexrelease|fltrace|flafter> \else
+%<latexrelease|fltrace|flafter> \addpenalty \interlinepenalty
+%<latexrelease|fltrace|flafter> \fi
+%<latexrelease|fltrace|flafter> \vskip \intextsep
+%<latexrelease|fltrace|flafter> \box\@currbox
+%<latexrelease|fltrace|flafter> \penalty\interlinepenalty
+%<latexrelease|fltrace|flafter> \vskip\intextsep
+%<latexrelease|fltrace|flafter> \ifnum\outputpenalty <-\@Mii \vskip -\parskip\fi
+%<latexrelease|fltrace|flafter> \outputpenalty \z@
+%<latexrelease|fltrace|flafter> \@inserttrue
+%<*trace>
+%<latexrelease|fltrace|flafter> \else
+%<latexrelease|fltrace|flafter> \fl@trace{Fail---no room at 2nd test of colroom
+%<latexrelease|fltrace|flafter> (addtocorcol \string\intextsep)}%
+%</trace>
+%<latexrelease|fltrace|flafter> \fi
+%<latexrelease|fltrace|flafter> \fi
+%<latexrelease|fltrace|flafter> \if@insert
+%<latexrelease|fltrace|flafter> \else
+%<*trace>
+%<fltrace|latexrelease> \fl@trace{not here: sent to addtotoporbot}%
+%</trace>
+%<fltrace|latexrelease> \@addtotoporbot
+%<*trace>
+%<flafter> \fl@trace{not here: sent to addtobot}%
+%</trace>
+%<flafter> \@addtobot
+%<latexrelease|fltrace|flafter> \fi
+%<latexrelease|fltrace|flafter> \fi
+%<latexrelease|fltrace|flafter> \fi
+%<*trace>
+%<latexrelease|fltrace|flafter> \else
+%<latexrelease|fltrace|flafter> \fl@trace{Fail: colnum = \the \@colnum:
+%<latexrelease|fltrace|flafter> fpstype \the \@fpstype=ORD?}%
+%<latexrelease|fltrace|flafter> \ifnum \@fpstype<\sixt@@n
+%<latexrelease|fltrace|flafter> \fl@trace{ERROR: BANG float not successful (addtocurcol)}%
+%<latexrelease|fltrace|flafter> \fi
+%</trace>
+%<latexrelease|fltrace|flafter> \fi
+%<*trace>
+%<latexrelease|fltrace|flafter> \else
+%<latexrelease|fltrace|flafter> \fl@trace{Fail---no room: fl box ht: \the \ht \@currbox
+%<latexrelease|fltrace|flafter> (addtocurcol)}%
+%</trace>
+%<latexrelease|fltrace|flafter> \fi
+%<latexrelease|fltrace|flafter> \fi
+%<latexrelease|fltrace|flafter> \fi
+%<latexrelease|fltrace|flafter> \if@insert
+%<latexrelease|fltrace|flafter> \else
+%<latexrelease|fltrace|flafter> \@resethfps
+%<*trace>
+%<latexrelease|fltrace|flafter> \fl@trace{put on deferlist (addtocurcol)}%
+%</trace>
+%<latexrelease|fltrace|flafter> \@cons\@deferlist\@currbox
+%<*trace>
+%<latexrelease|fltrace|flafter> \fl@trace{deferlist: \@deferlist: (addtocurcol-after)}%
+%</trace>
+%<latexrelease|fltrace|flafter> \fi
+%<latexrelease|fltrace|flafter>}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease|fltrace|flafter>\EndIncludeInRelease
%<latexrelease|fltrace|flafter>\IncludeInRelease{0000/00/00}%
%<latexrelease|fltrace|flafter> {\@addtocurcol}{float order in 2-column}%
%<latexrelease|fltrace|flafter>\def \@addtocurcol {%
@@ -3398,7 +4418,7 @@
% \changes{v1.2n}{2015/01/14}{float order in 2-column (latexrelease)}
% \changes{v1.4b}{2017/12/17}{fix doc guards}
% \begin{macrocode}
-%<latexrelease|fltrace>\IncludeInRelease{2015/01/01}
+%<latexrelease|fltrace>\IncludeInRelease{2025/06/01}
%<latexrelease|fltrace> {\@addtonextcol}{float order in 2-column}%
%<*2ekernel|latexrelease|fltrace>
\def\@addtonextcol{%
@@ -3427,6 +4447,11 @@
\fl@trace{float size: \the \@reqcolroom (addtonextcol)}%
%</trace>
\advance \@reqcolroom \@textmin
+% \end{macrocode}
+%
+% \changes{v1.4n}{2025/01/29}{Save current value of \cs{@reqcolroom} (gh/1645)}
+% \begin{macrocode}
+ \saved@reqcolroom \@reqcolroom
%<*trace>
\fl@trace{colroom = \the \@colroom (addtonextcol)}%
\fl@trace{reqcolroom = \the \@reqcolroom (addtonextcol)}%
@@ -3486,6 +4511,92 @@
}%
%</2ekernel|latexrelease|fltrace>
%<latexrelease|fltrace>\EndIncludeInRelease
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease|fltrace>\IncludeInRelease{2015/01/01}
+%<latexrelease|fltrace> {\@addtonextcol}{float order in 2-column}%
+%<latexrelease|fltrace>\def\@addtonextcol{%
+%<latexrelease|fltrace> \begingroup
+%<*trace>
+%<latexrelease|fltrace> \fl@trace{***Start addtonextcol}%
+%</trace>
+%<latexrelease|fltrace> \@insertfalse
+%<latexrelease|fltrace> \@setfloattypecounts
+%<latexrelease|fltrace> \ifnum \@fpstype=8
+%<*trace>
+%<latexrelease|fltrace> \fl@trace{fpstype not curcol: \the \@fpstype = 8?}%
+%</trace>
+%<latexrelease|fltrace> \else
+%<latexrelease|fltrace> \ifnum \@fpstype=24
+%<*trace>
+%<latexrelease|fltrace> \fl@trace{fpstype not curcol: \the \@fpstype = 24?}%
+%</trace>
+%<latexrelease|fltrace> \else
+%<latexrelease|fltrace> \@flsettextmin
+%<*trace>
+%<latexrelease|fltrace> \fl@trace{text-so-far: 0pt (top of col)}%
+%</trace>
+%<latexrelease|fltrace> \@reqcolroom \ht\@currbox
+%<*trace>
+%<latexrelease|fltrace> \fl@trace{float size: \the \@reqcolroom (addtonextcol)}%
+%</trace>
+%<latexrelease|fltrace> \advance \@reqcolroom \@textmin
+%<*trace>
+%<latexrelease|fltrace> \fl@trace{colroom = \the \@colroom (addtonextcol)}%
+%<latexrelease|fltrace> \fl@trace{reqcolroom = \the \@reqcolroom (addtonextcol)}%
+%</trace>
+%<latexrelease|fltrace> \ifdim \@colroom>\@reqcolroom
+%<latexrelease|fltrace> \@flsetnum \@colnum
+%<latexrelease|fltrace> \ifnum\@colnum>\z@
+%<latexrelease|fltrace> \@bitor\@currtype\@deferlist
+%<*trace>
+%<latexrelease|fltrace> \fl@trace{deferlist: \@deferlist: (addtonextcol-before)}%
+%</trace>
+%<latexrelease|fltrace> \@testwrongwidth\@currbox
+%<latexrelease|fltrace> \if@test
+%<*trace>
+%<latexrelease|fltrace> \fl@trace{type already on list: defer (addtonextcol)}%
+%</trace>
+%<latexrelease|fltrace> \else
+%<*trace>
+%<latexrelease|fltrace> \fl@trace{sent to addtotoporbot (addtonextcol)}%
+%</trace>
+%<latexrelease|fltrace> \@addtotoporbot
+%<latexrelease|fltrace> \fi
+%<latexrelease|fltrace> \fi
+%<*trace>
+%<latexrelease|fltrace> \else
+%<latexrelease|fltrace> \fl@trace{Fail---no room: fl box ht: \the \ht \@currbox
+%<latexrelease|fltrace> (addtonextcol)}%
+%</trace>
+%<latexrelease|fltrace> \fi
+%<latexrelease|fltrace> \fi
+%<latexrelease|fltrace> \fi
+%<latexrelease|fltrace> \if@insert
+%<latexrelease|fltrace> \else
+%<*trace>
+%<latexrelease|fltrace> \fl@trace{put back on deferlist (addtonextcol)}%
+%</trace>
+%<latexrelease|fltrace> \@cons\@deferlist\@currbox
+%<*trace>
+%<latexrelease|fltrace> \fl@trace{deferlist: \@deferlist: (addtonextcol-after)}%
+%</trace>
+%<latexrelease|fltrace> \fi
+%<*trace>
+%<latexrelease|fltrace> \fl@trace{End of addtonextcol -- locally counts:}%
+%<latexrelease|fltrace> \fl@trace{col: \the\@colnum. top: \the \@topnum. bot: \the \@botnum.}%
+%</trace>
+%<latexrelease|fltrace> \endgroup
+%<*trace>
+%<latexrelease|fltrace> \fl@trace{End of addtonextcol -- globally counts:}%
+%<latexrelease|fltrace> \fl@trace{col: \the\@colnum. top: \the \@topnum. bot: \the \@botnum.}%
+%</trace>
+%<latexrelease|fltrace>}%
+%<latexrelease|fltrace>\EndIncludeInRelease
+% \end{macrocode}
+%
+% \begin{macrocode}
%<latexrelease|fltrace>\IncludeInRelease{0000/00/00}%
%<latexrelease|fltrace> {\@addtonextcol}{float order in 2-column}%
%<latexrelease|fltrace>\def\@addtonextcol{%
@@ -3924,21 +5035,18 @@
% This part of the file is part of the implementation of the following
% two new commands for \LaTeX2e{}.
%
-%
-% \begin{verbatim}
+%\begin{verbatim}
% \enlargethispage{<dim>}
-% \end{verbatim}
-%
+%\end{verbatim}
% Adds |<dim>| to the height of the current column only. On the printed
% page the bottom of this column is extended downwards by exactly
% |<dim>| without having any effect on the placement of the footer; this
% may result in an overprinting.
%
-% \begin{verbatim}
+%\begin{verbatim}
% \enlargethispage*{<dim>}
-% \end{verbatim}
-%
-% Similar to |\enlargethispage| but it tries to squeeze the column to
+%\end{verbatim}
+%% Similar to |\enlargethispage| but it tries to squeeze the column to
% be printed in as small a space as possible, ie it uses any
% shrinkability in the column. If the column was not explicitly broken
% (\eg with |\pagebreak|) this may result in an overfull box message but
@@ -4317,12 +5425,29 @@
\newcount \@fpstype
\newdimen \@reqcolroom
\newdimen \@textfloatsheight
-%</2ekernel>
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
+%
+% \begin{macro}{\saved@reqcolroom}
+% Saved value of \cs{@reqcolroom}; this is needed when making several tests.
+% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2025/06/01}%
+%<latexrelease> {\saved@reqcolroom}{float placement calculation}%
+\newdimen \saved@reqcolroom
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\saved@reqcolroom}{float placement calculation}%
+%<latexrelease>\let \saved@reqcolroom \@undefined
+%<latexrelease>\EndIncludeInRelease
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\@fpsadddefault}
% \changes{v1.0f}{1993/12/05}{Command added}
% Adds the default placement to what is already there.
@@ -4563,7 +5688,18 @@
% Sets |@tempswa| true if there is room for |\@currbox|.
%
% \begin{macrocode}
+%</2ekernel|fltrace>
+%<*2ekernel|fltrace|latexrelease>
+%<latexrelease|fltrace>\IncludeInRelease{2025/06/01}%
+%<latexrelease|fltrace> {\@flcheckspace}{float placement calculation}%
\def \@flcheckspace #1#2{%
+% \end{macrocode}
+% When this test is executed, the value of \cs{@reqcolroom} may
+% no longer be correct due to a previous test that altered it. We
+% therefore reset it to a value saved earlier.
+% \changes{v1.4n}{2025/01/29}{Reset current value of \cs{@reqcolroom} (gh/1645)}
+% \begin{macrocode}
+ \@reqcolroom \saved@reqcolroom
\advance \@reqcolroom
\ifx #2\@empty \textfloatsep \else \floatsep \fi
%<*trace>
@@ -4589,7 +5725,7 @@
\fl@trace{BANG float ignoring #1
(flcheckspace \string#1 \string#2):}%
\fl@trace{\@spaces #1 = \the #1. Ht float: \the \ht \@currbox
- BANG}%
+ \space BANG}%
%</trace>
\@tempswatrue
%<*trace>
@@ -4597,7 +5733,7 @@
\fl@trace{Fail---no room (flcheckspace \string#1 \string#2)
(fpstype \the \@fpstype=ORD?):}%
\fl@trace{\@spaces #1 = \the #1. Ht float: \the \ht \@currbox
- ORD?}%
+ \space ORD?}%
%</trace>
\fi
\fi
@@ -4608,7 +5744,60 @@
%</trace>
\fi
}
-%</2ekernel|fltrace>
+%</2ekernel|fltrace|latexrelease>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease|fltrace>\EndIncludeInRelease
+%<latexrelease|fltrace>\IncludeInRelease{0000/00/00}%
+%<latexrelease|fltrace> {\@flcheckspace}{float placement calculation}%
+%<latexrelease|fltrace>
+%<latexrelease|fltrace>\def \@flcheckspace #1#2{%
+%<latexrelease|fltrace> \advance \@reqcolroom
+%<latexrelease|fltrace> \ifx #2\@empty \textfloatsep \else \floatsep \fi
+%<*trace>
+%<latexrelease|fltrace> \fl@trace{colroom = \the \@colroom
+%<latexrelease|fltrace> (flcheckspace \string#1 \string#2)}%
+%<latexrelease|fltrace> \fl@trace{reqcolroom = \the \@reqcolroom
+%<latexrelease|fltrace> (flcheckspace \string#1 \string#2)}%
+%</trace>
+%<latexrelease|fltrace> \ifdim \@colroom>\@reqcolroom
+%<latexrelease|fltrace> \ifdim #1>\ht\@currbox
+%<latexrelease|fltrace> \@tempswatrue
+%<*trace>
+%<latexrelease|fltrace> \fl@trace{Space OK: #1 = \the #1 > \the \ht \@currbox
+%<latexrelease|fltrace> (flcheckspace \string#1 \string#2)}%
+%</trace>
+%<latexrelease|fltrace> \else
+%<*trace>
+%<latexrelease|fltrace> \fl@trace{fpstype: \the \@fpstype
+%<latexrelease|fltrace> (flcheckspace \string#1 \string#2)}%
+%</trace>
+%<latexrelease|fltrace> \ifnum \@fpstype<\sixt@@n
+%<*trace>
+%<latexrelease|fltrace> \fl@trace{BANG float ignoring #1
+%<latexrelease|fltrace> (flcheckspace \string#1 \string#2):}%
+%<latexrelease|fltrace> \fl@trace{\@spaces #1 = \the #1. Ht float: \the \ht \@currbox
+%<latexrelease|fltrace> \space BANG}%
+%</trace>
+%<latexrelease|fltrace> \@tempswatrue
+%<*trace>
+%<latexrelease|fltrace> \else
+%<latexrelease|fltrace> \fl@trace{Fail---no room (flcheckspace \string#1 \string#2)
+%<latexrelease|fltrace> (fpstype \the \@fpstype=ORD?):}%
+%<latexrelease|fltrace> \fl@trace{\@spaces #1 = \the #1. Ht float: \the \ht \@currbox
+%<latexrelease|fltrace> \space ORD?}%
+%</trace>
+%<latexrelease|fltrace> \fi
+%<latexrelease|fltrace> \fi
+%<*trace>
+%<latexrelease|fltrace> \else
+%<latexrelease|fltrace> \fl@trace{Fail---no room at 2nd test of colroom
+%<latexrelease|fltrace> (flcheckspace \string#1 \string#2)}%
+%</trace>
+%<latexrelease|fltrace> \fi
+%<latexrelease|fltrace>}
+%<latexrelease|fltrace>\EndIncludeInRelease
% \end{macrocode}
% \end{macro}
%
diff --git a/Master/texmf-dist/source/latex-dev/base/ltpage.dtx b/Master/texmf-dist/source/latex-dev/base/ltpage.dtx
index 25bb5a5a26d..8baa95c46bb 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltpage.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltpage.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -204,7 +204,7 @@
% error (pr/3203).}
% \changes{v1.0m}{2020/07/27}{Don't make the command \cs{long} (gh/354)}
% \changes{v1.0n}{2022/04/04}{Interface with new mark mechanism}
-% \changes{v1.1a}{2025/06/01}{}
+% \changes{v1.0o}{2024/11/16}{Drop legacy mark support}
% \begin{macrocode}
\ExplSyntaxOn
\DeclareRobustCommand*\markboth[2]{%
@@ -216,7 +216,7 @@
%
% \changes{v1.0m}{2020/07/27}{Don't make the command \cs{long} (gh/354)}
% \changes{v1.0n}{2022/04/04}{Interface with new mark mechanism}
-% \changes{v1.1a}{2025/06/01}{}
+% \changes{v1.0o}{2024/11/16}{Drop legacy mark support}
% \begin{macrocode}
\DeclareRobustCommand*\markright[1]{%
\mark_insert:nn{2e-right}{#1}
diff --git a/Master/texmf-dist/source/latex-dev/base/ltpageno.dtx b/Master/texmf-dist/source/latex-dev/base/ltpageno.dtx
index da80dbaab73..5f2704676e3 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltpageno.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltpageno.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/Master/texmf-dist/source/latex-dev/base/ltpar.dtx b/Master/texmf-dist/source/latex-dev/base/ltpar.dtx
index 200d3b4238b..5e8e2bd89ae 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltpar.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltpar.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/Master/texmf-dist/source/latex-dev/base/ltpara.dtx b/Master/texmf-dist/source/latex-dev/base/ltpara.dtx
index b7b895350d2..bfc307062ce 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltpara.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltpara.dtx
@@ -1,7 +1,7 @@
% \iffalse meta-comment
%
%% File: ltpara.dtx
-%% Copyright (C) 2020-2024
+%% Copyright (C) 2020-2025
%% Frank Mittelbach, The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
@@ -17,7 +17,7 @@
%<*driver>
% \fi
\ProvidesFile{ltpara.dtx}
- [2024/06/29 v1.0n LaTeX Kernel (paragraph hooks)]
+ [2025/02/07 v1.0n LaTeX Kernel (paragraph hooks)]
% \iffalse
%
\documentclass{l3doc}
@@ -548,6 +548,7 @@
% At the start of the paragraph increment both sequence counter and
% level and also save the then current sequence number on our stack.
%\begin{verbatim}
+% \makeatletter % because we use a few internal 2e commands
% \AddToHook{para/begin}{%
% \stepcounter{paracnt}\stepcounter{paralevel}%
% \ParaPush
@@ -821,7 +822,7 @@
}
% \end{macrocode}
% \changes{v1.0n}{2024/06/23}
-% {Append \cs{everypar} toks to \cs{g_@@_standard_everypar_tl},
+% {Append \cs{everypar} toks to \cs{g__para_standard_everypar_tl},
% rollback 2023/06/01 (gh/1386)}
% \begin{macrocode}
%<latexrelease>\cs_set:Npn \@@_tmp:w #1#2#3#4#5 { }
diff --git a/Master/texmf-dist/source/latex-dev/base/ltpictur.dtx b/Master/texmf-dist/source/latex-dev/base/ltpictur.dtx
index c6fc5236a5f..38d7f64571c 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltpictur.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltpictur.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/Master/texmf-dist/source/latex-dev/base/ltplain.dtx b/Master/texmf-dist/source/latex-dev/base/ltplain.dtx
index 83330dd3685..b43a57fcb28 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltplain.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltplain.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/Master/texmf-dist/source/latex-dev/base/ltproperties.dtx b/Master/texmf-dist/source/latex-dev/base/ltproperties.dtx
index 6351d08c872..185359802e8 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltproperties.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltproperties.dtx
@@ -2,7 +2,7 @@
%
% File: ltproperties.dtx
%
-% Copyright (C) 2023-2024 The LaTeX Project
+% Copyright (C) 2023-2025 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
@@ -30,7 +30,7 @@
%<*driver>
% \fi
\ProvidesFile{ltproperties.dtx}
- [2024/11/05 v1.0i LaTeX Kernel (Properties)]
+ [2024/11/28 v1.0i LaTeX Kernel (Properties)]
% \iffalse
%
\documentclass[full]{l3doc}
@@ -225,7 +225,7 @@
% \cs{property_ref_undefined_warn:}
% \end{syntax}
% \LaTeXe{}-interface: not provided.\\
-% The commands triggers the standard warning
+% Triggers the standard warning
% \\
% \hspace*{1em}\texttt{LaTeX Warning: There were undefined references.}
% \\
@@ -239,8 +239,8 @@
% \begin{syntax}
% \cs{property_ref_undefined_warn:n} \Arg{label}
% \end{syntax}
-% \LaTeXe{}-interface: not provided.\\
-% The commands triggers the standard warning\\
+% \LaTeXe{}-interface: not provided.\\
+% 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.
@@ -254,7 +254,7 @@
% \cs{property_ref_undefined_warn:nn} \Arg{label} \Arg{property}
% \end{syntax}
% \LaTeXe{}-interface: see \cs{RefUndefinedWarn}.\\
-% The commands triggers the standard warning\\
+% 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.
@@ -374,7 +374,7 @@
% \begin{syntax}
% \cs{RefUndefinedWarn} \Arg{label} \Arg{property}
% \end{syntax}
-% This commands triggers the standard warning\\
+% 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}
diff --git a/Master/texmf-dist/source/latex-dev/base/ltsect.dtx b/Master/texmf-dist/source/latex-dev/base/ltsect.dtx
index 21aeda32e02..2bab4f3a13f 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltsect.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltsect.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -31,7 +31,7 @@
%%% From File: ltsect.dtx
%<*driver>
% \fi
-\ProvidesFile{ltsect.dtx}[2024/03/25 v1.1f LaTeX Kernel (Sectioning)]
+\ProvidesFile{ltsect.dtx}[2025/01/23 v1.1h LaTeX Kernel (Sectioning)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltsect.dtx}
@@ -762,8 +762,8 @@
% \end{macro}
%
% \begin{macro}{\addcontentsline}
-% The |\addcontentsline{|\meta{table}|}{|\meta{type}|}{|%
-% \meta{entry}|}| command allows the user to add
+% The |\addcontentsline{|\meta{table}|}{|\meta{type}|}{|\meta{entry}|}|
+% command allows the user to add
% his/her own entry to a table of contents, etc. The command adds the
% entry |\contentsline{|\meta{type}|}{|\meta{entry}|}{|\meta{page}|}{}|
% to the |.|\meta{table} file.
@@ -815,20 +815,84 @@
% \end{macrocode}
% \end{macro}
%
-% \changes{v1.0c}{1994/05/20}{Correct setting of \cs{protect}.}
-% \changes{v1.0h}{1994/11/04}{Added \cs{protected@write} to
-% \cs{addtocontents}. ASAJ.}
+%
+%
+%
+%
+% \begin{macro}{\@gobble@om,\@gobble@som,\@gobble@with@sphack@om,\@gobble@with@sphack@som}
+%
+% Each of these four commands accepts an optional and a mandatory
+% argument, possibly preceeded by a star. In all cases the
+% expansion is empty or just manipulates the spaces around the command.
+% Used to disable commands such as \cs{index}
+% or \cs{label} in certain situations.
+% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2025/06/01}%
+%<latexrelease> {\@gobble@som}{Extended index/label}%
+% \end{macrocode}
+%
+% Just getting rid of the input in an expandable way is done by these two.
+% \changes{v1.1g}{2025/01/21}
+% {Support extended syntax for \cs{label}, \cs{index} and \cs{glossary} (gh/311)}
+% \begin{macrocode}
+\DeclareExpandableDocumentCommand\@gobble@om{+o+m}{}
+\DeclareExpandableDocumentCommand\@gobble@som{s+o+m}{}
+% \end{macrocode}
+%
+% When something needs to be suppressed during typesetting, one often
+% also wants to ensure that this doesn't end up with two spaces (in
+% case there is one before and one after). This can't be done expandably.
+% \changes{v1.1h}{2025/01/23}
+% {Make \cs{label}, \cs{index} and \cs{glossary} truely invisible
+% when typesetting (gh/1638)}
+% \begin{macrocode}
+\DeclareDocumentCommand\@gobble@with@sphack@om{+o+m}{\@bsphack\@esphack}
+\DeclareDocumentCommand\@gobble@with@sphack@som{s+o+m}{\@bsphack\@esphack}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%
% \begin{macro}{\addtocontents}
%
% The |\addtocontents{|\meta{table}|}{|\meta{text}|}| command
% adds \meta{text} to the |.|\meta{table} file, with no
% page number.
%
+% \changes{v1.0c}{1994/05/20}{Correct setting of \cs{protect}.}
+% \changes{v1.0h}{1994/11/04}{Added \cs{protected@write} to
+% \cs{addtocontents}. ASAJ.}
+% \changes{v1.1g}{2025/01/21}{Support extended syntax
+% for \cs{label}, \cs{index}, and \cs{glossary} (gh/311)}
% \begin{macrocode}
\long\def\addtocontents#1#2{%
\protected@write\@auxout
- {\let\label\@gobble \let\index\@gobble \let\glossary\@gobble}%
+ {\let\label\@gobble@om
+ \let\index\@gobble@som
+ \let\glossary\@gobble@om}%
{\string\@writefile{#1}{#2}}}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\@gobble@som}{Extended index/label}%
+%<latexrelease>\long\def\addtocontents#1#2{%
+%<latexrelease> \protected@write\@auxout
+%<latexrelease> {\let\label\@gobble \let\index\@gobble \let\glossary\@gobble}%
+%<latexrelease> {\string\@writefile{#1}{#2}}}
+%<latexrelease>
+%<latexrelease>\let\@gobble@om\@undefined
+%<latexrelease>\let\@gobble@som\@undefined
+%<latexrelease>\let\@gobble@with@sphack@om\@undefined
+%<latexrelease>\let\@gobble@with@sphack@som\@undefined
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
% \end{macro}
%
diff --git a/Master/texmf-dist/source/latex-dev/base/ltshipout.dtx b/Master/texmf-dist/source/latex-dev/base/ltshipout.dtx
index c2e70ba6d54..a15bbb88f76 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltshipout.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltshipout.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%%
-%% Copyright (C) 2020-2024
+%% Copyright (C) 2020-2025
%% Frank Mittelbach, The LaTeX Project
%%
%
diff --git a/Master/texmf-dist/source/latex-dev/base/ltsockets.dtx b/Master/texmf-dist/source/latex-dev/base/ltsockets.dtx
index a977f8f6aa5..999874e4186 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltsockets.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltsockets.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2023-2024
+% Copyright (C) 2023-2025
% Frank Mittelbach, The LaTeX Project
%
% This file is part of the LaTeX base system.
@@ -33,7 +33,7 @@
%<*driver>
% \fi
\ProvidesFile{ltsockets.dtx}
- [2024/10/27 v0.9b LaTeX Kernel (Sockets)]
+ [2024/12/27 v0.9c LaTeX Kernel (Sockets)]
% \iffalse
%
\documentclass{l3doc}
@@ -645,6 +645,43 @@
% \cs{LogSocket} and \cs{socket_log:n} only differ in that they don't stop.
% \end{function}
%
+%
+% It is sometimes necessary/helpful to know if a particular socket or
+% plug exists (or is assigned to a certain socket) and based on that
+% take different actions.
+%
+% \begin{function}[EXP]{\IfSocketExistsTF,\socket_if_exist:nTF}
+% \begin{syntax}
+% \cs{IfSocketExistsTF} \Arg{socket-name} \Arg{true code} \Arg{false code}
+% \end{syntax}
+% If socket \meta{socket-name} exists then execute \meta{true code}
+% otherwise \meta{false code}. Variants with only \texttt{T} or
+% \texttt{F} are also available.
+% \end{function}
+%
+% \begin{function}[EXP]{\IfSocketPlugExistsTF,\socket_if_plug_exist:nnTF}
+% \begin{syntax}
+% \cs{IfSocketPlugExistsTF} \Arg{socket-name} \Arg{plug-name}
+% \qquad \Arg{true code} \Arg{false code}
+% \end{syntax}
+% If plug \meta{plug-name} for socket \meta{socket-name} exists then
+% execute \meta{true code} otherwise \meta{false code}. Variants
+% with only \texttt{T} or \texttt{F} are also available.
+% \end{function}
+%
+% \begin{function}[EXP]{\IfSocketPlugAssignedTF,\socket_if_plug_assigned:nnTF}
+% \begin{syntax}
+% \cs{IfSocketPlugAssignedTF} \Arg{socket-name} \Arg{plug-name}
+% \qquad \Arg{true code} \Arg{false code}
+% \end{syntax}
+% If plug \meta{plug-name} is assigned to socket \meta{socket-name}
+% then execute \meta{true code} otherwise \meta{false
+% code}. Variants with only \texttt{T} or \texttt{F} are also
+% available.
+% \end{function}
+%
+%
+%
%
% \begin{function}{\DebugSocketsOn,\DebugSocketsOff,
% \socket_debug_on:,\socket_debug_off:}
@@ -654,6 +691,8 @@
% Turns debugging of sockets on or off.
% \end{function}
%
+%
+%
% \subsubsection{Rationale for error handling}
%
% The errors during the declarations are produced to help with
@@ -766,7 +805,7 @@
% 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 }
+ \socket_if_exist:nTF {#1}
{
\msg_error:nnn { socket } { already-declared } {#1}
}
@@ -796,7 +835,23 @@
}
% \end{macrocode}
% \end{macro}
-%
+%
+%
+%
+% \begin{macro}[pTF, EXP] { \socket_if_exist:n }
+% Conditional testing the existance of a socket.
+% The argument is fully expanded as part of the csname generation.
+% \changes{v0.9c}{2024/12/27}{Conditionals for sockets, plugs, and
+% assignments (gh/1577)}
+% \begin{macrocode}
+\prg_new_conditional:Npnn \socket_if_exist:n #1 { p , T , F , TF }
+ { \str_if_exist:cTF { l_@@_#1_plug_str }
+ \prg_return_true:
+ \prg_return_false:
+ }
+% \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
@@ -804,7 +859,7 @@
% \begin{macrocode}
\cs_new_protected:Npn \socket_log:n #1 {
\typeout{ Socket~ #1:}
- \str_if_exist:cTF { l_@@_#1_plug_str }
+ \socket_if_exist:nTF {#1}
{
\typeout{ \@spaces number~ of~ inputs~ =~
\int_use:c { c_@@_#1_args_int } }
@@ -842,9 +897,9 @@
% 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 }
+ \socket_if_exist:nTF {#1}
{
- \cs_if_exist:cTF { @@_#1_plug_#2:w }
+ \socket_if_plug_exist:nnTF {#1} {#2}
{
\msg_error:nnnn { socket } { plug-already-declared } {#1} {#2}
}
@@ -863,9 +918,7 @@
{ Plug~ '#2'~ for~ socket~ '#1'~ declared. }
}
}
- {
- \msg_error:nnn { socket } { undeclared } {#1}
- }
+ { \msg_error:nnn { socket } { undeclared } {#1} }
}
% \end{macrocode}
% Changing the plug of an existing socket is rather similar, except
@@ -873,9 +926,9 @@
% sequence.
% \begin{macrocode}
\cs_new_protected:Npn \socket_set_plug:nnn #1#2#3 {
- \str_if_exist:cTF { l_@@_#1_plug_str }
+ \socket_if_exist:nTF {#1}
{
- \cs_if_exist:cTF { @@_#1_plug_#2:w }
+ \socket_if_plug_exist:nnTF {#1} {#2}
{
\cs_generate_from_arg_count:cNnn
{ @@_#1_plug_#2:w }
@@ -889,14 +942,28 @@
\msg_error:nnnn { socket } { plug-undeclared } {#1} {#2}
}
}
- {
- \msg_error:nnn { socket } { undeclared } {#1}
- }
+ { \msg_error:nnn { socket } { undeclared } {#1} }
}
% \end{macrocode}
% \end{macro}
%
-%
+%
+%
+% \begin{macro}[pTF, EXP] { \socket_if_plug_exist:nn }
+% Conditional testing the existance of a plug.
+% Both arguments are fully expanded as part of the csname generation.
+% \changes{v0.9c}{2024/12/27}{Conditionals for sockets, plugs, and
+% assignments (gh/1577)}
+% \begin{macrocode}
+\prg_new_conditional:Npnn \socket_if_plug_exist:nn #1#2 { p , T , F , TF }
+ { \cs_if_exist:cTF { @@_#1_plug_#2:w }
+ \prg_return_true:
+ \prg_return_false:
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
%
% \begin{macro}{\socket_assign_plug:nn}
%
@@ -904,9 +971,9 @@
% 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 }
+ \socket_if_exist:nTF {#1}
{
- \cs_if_exist:cTF { @@_#1_plug_#2:w }
+ \socket_if_plug_exist:nnTF {#1} {#2}
{
\@@_debug_term:n
{ Replacing~ plug~ '\str_use:c { l_@@_#1_plug_str }'~
@@ -921,7 +988,25 @@
}
% \end{macrocode}
% \end{macro}
-%
+%
+%
+%
+% \begin{macro}[pTF, EXP] { \socket_if_plug_assigned:nn }
+% Conditional testing the assignment of a plug.
+% Both arguments are fully expanded.
+% \changes{v0.9c}{2024/12/27}{Conditionals for sockets, plugs, and
+% assignments (gh/1577)}
+% \begin{macrocode}
+\prg_new_conditional:Npnn \socket_if_plug_assigned:nn #1#2 { p , T , F , TF }
+ { \exp_args:Ne
+ \str_if_eq:nvTF {#2} { l__socket_#1_plug_str }
+ \prg_return_true:
+ \prg_return_false:
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
%
% \begin{macro}{\socket_use:nw,\socket_use:n,\socket_use:nn,\socket_use:nnn,\socket_use:nnnn}
%
@@ -1044,6 +1129,32 @@
% \end{macro}
%
%
+% \begin{macro}{\IfSocketExistsTF,\IfSocketExistsT,\IfSocketExistsF,
+% \IfSocketPlugExistsTF,\IfSocketPlugExistsT,
+% \IfSocketPlugExistsF,
+% \IfSocketPlugAssignedTF,\IfSocketPlugAssignedT,
+% \IfSocketPlugAssignedF}
+% A bunch of conditionals:
+% \changes{v0.9c}{2024/12/27}{Conditionals for sockets, plugs, and
+% assignments (gh/1577)}
+% \begin{macrocode}
+\cs_new_eq:NN \IfSocketExistsTF \socket_if_exist:nTF
+\cs_new_eq:NN \IfSocketExistsT \socket_if_exist:nT
+\cs_new_eq:NN \IfSocketExistsF \socket_if_exist:nF
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_eq:NN \IfSocketPlugExistsTF \socket_if_plug_exist:nnTF
+\cs_new_eq:NN \IfSocketPlugExistsT \socket_if_plug_exist:nnT
+\cs_new_eq:NN \IfSocketPlugExistsF \socket_if_plug_exist:nnF
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_eq:NN \IfSocketPlugAssignedTF \socket_if_plug_assigned:nnTF
+\cs_new_eq:NN \IfSocketPlugAssignedT \socket_if_plug_assigned:nnT
+\cs_new_eq:NN \IfSocketPlugAssignedF \socket_if_plug_assigned:nnF
+% \end{macrocode}
+% \end{macro}
%
% \begin{macrocode}
%
@@ -1061,6 +1172,16 @@
%<latexrelease>\let \DebugSocketsOn \@undefined
%<latexrelease>\let \DebugSocketsOff \@undefined
%<latexrelease>
+%<latexrelease>\let \IfSocketExistsTF \@undefined
+%<latexrelease>\let \IfSocketExistsT \@undefined
+%<latexrelease>\let \IfSocketExistsF \@undefined
+%<latexrelease>\let \IfSocketPlugExistsTF \@undefined
+%<latexrelease>\let \IfSocketPlugExistsT \@undefined
+%<latexrelease>\let \IfSocketPlugExistsF \@undefined
+%<latexrelease>\let \IfSocketPlugAssignedTF \@undefined
+%<latexrelease>\let \IfSocketPlugAssignedT \@undefined
+%<latexrelease>\let \IfSocketPlugAssignedF \@undefined
+%<latexrelease>
%<latexrelease>\EndModuleRelease
% \end{macrocode}
%
diff --git a/Master/texmf-dist/source/latex-dev/base/ltspace.dtx b/Master/texmf-dist/source/latex-dev/base/ltspace.dtx
index 03005f59962..341e3930505 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltspace.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltspace.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/Master/texmf-dist/source/latex-dev/base/lttab.dtx b/Master/texmf-dist/source/latex-dev/base/lttab.dtx
index f1147578219..aef3d11ffbf 100644
--- a/Master/texmf-dist/source/latex-dev/base/lttab.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/lttab.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/Master/texmf-dist/source/latex-dev/base/lttagging.dtx b/Master/texmf-dist/source/latex-dev/base/lttagging.dtx
index 35753825836..6887830abdb 100644
--- a/Master/texmf-dist/source/latex-dev/base/lttagging.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/lttagging.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2023-2024
+% Copyright (C) 2023-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -33,7 +33,7 @@
%<*driver>
% \fi
\ProvidesFile{lttagging.dtx}
- [2024/11/22 v1.0l LaTeX Kernel (tagging support)]
+ [2025/02/16 v1.0n LaTeX Kernel (tagging support)]
% \iffalse
\documentclass{l3doc}
\GetFileInfo{lttagging.dtx}
@@ -126,10 +126,10 @@
% Usually, these sockets have (beside the default plug defined for every socket)
% one additional plug defined and directly assigned. This plug is used when
% tagging is active.
-% There may be more plugs, e.g., tagging with special debugging or special behaviour
+% There may be more plugs, e.g., tagging with special debugging or special behavior
% depending on the class or PDF version etc., but right now it is usually just on or off.
%
-% When tagging is suspended they all have the same predefined behaviour:
+% When tagging is suspended they all have the same predefined behavior:
% The sockets with zero arguments do nothing. The sockets with one argument
% gobble their argument. The sockets with two arguments
% will drop their first argument and pass the second unchanged.
@@ -152,7 +152,14 @@
% \cs{UseTaggingSocket} because they do not have to determine how
% many arguments the socket takes when disabling it.
%
-%
+% \DescribeMacro\MathCollectTrue
+% \DescribeMacro\MathCollectFalse
+% The tagging of math has to collect/grab the math first. This is not wanted
+% for all uses of \verb+$+. These command allow to control the behavior of the
+% math shift token. Without the math tagging code they do nothing. Their behavior
+% with the math tagging code is documented in latex-lab-math.pdf
+%
+%
% \MaybeStop{}
%
%
@@ -230,6 +237,16 @@
%
% \end{macro}
%
+% \subsection{Math collection}
+% The documentation is in latex-lab-math.
+%
+% \begin{macro}{\MathCollectTrue,\MathCollectFalse}
+% \begin{macrocode}
+\cs_new_protected:Npn\MathCollectTrue{}
+\cs_new_protected:Npn\MathCollectFalse{}
+% \end{macrocode}
+% \end{macro}
+%
% \subsection{Tagging sockets}
% This collects tagging sockets that should be generally available
% so that they can also be used even if the tagging code is not loaded.
@@ -321,6 +338,12 @@
\NewSocket{tagsupport/toc/contentsline/before}{1}
\NewSocket{tagsupport/toc/contentsline/after}{1}
% \end{macrocode}
+%
+% \changes{v1.0n}{2025/02/16}{Initialize tagging sockets with 1 or 2 arguments}
+% \begin{macrocode}
+\AssignSocketPlug{tagsupport/toc/contentsline/before}{noop}
+\AssignSocketPlug{tagsupport/toc/contentsline/after}{noop}
+% \end{macrocode}
% \end{socketdecl}
%
% \begin{socketdecl}{tagsupport/toc/starttoc/before,
@@ -331,6 +354,12 @@
\NewSocket{tagsupport/toc/starttoc/before}{1}
\NewSocket{tagsupport/toc/starttoc/after}{1}
% \end{macrocode}
+%
+% \changes{v1.0n}{2025/02/16}{Initialize tagging sockets with 1 or 2 arguments}
+% \begin{macrocode}
+\AssignSocketPlug{tagsupport/toc/starttoc/before}{noop}
+\AssignSocketPlug{tagsupport/toc/starttoc/after}{noop}
+% \end{macrocode}
% \end{socketdecl}
%
% \begin{socketdecl}{tagsupport/toc/leaders/before,
@@ -342,6 +371,17 @@
\NewSocket{tagsupport/toc/leaders/after}{0}
% \end{macrocode}
% \end{socketdecl}
+%
+% \subsubsection{Tagging support for marginpar}
+%
+% \begin{socketdecl}{tagsupport/marginpar/begin,tagsupport/marginpar/end}
+% \changes{v1.0n}{2025/02/21}{move marginpar sockets}
+% \begin{macrocode}
+\NewSocket{tagsupport/marginpar/begin}{0}
+\NewSocket{tagsupport/marginpar/end}{0}
+% \end{macrocode}
+% \end{socketdecl}
+
%
% \subsubsection{Tagging support for table/tabular packages}
%
@@ -423,6 +463,11 @@
% \begin{macrocode}
\NewSocket{tagsupport/tbl/colspan}{1}
% \end{macrocode}
+%
+% \changes{v1.0n}{2025/02/16}{Initialize tagging sockets with 1 or 2 arguments}
+% \begin{macrocode}
+\AssignSocketPlug{tagsupport/tbl/colspan}{noop}
+% \end{macrocode}
% \end{socketdecl}
%
@@ -516,6 +561,11 @@
\NewSocket{tagsupport/caption/begin}{1}
\NewSocket{tagsupport/caption/end}{0}
% \end{macrocode}
+%
+% \changes{v1.0n}{2025/02/16}{Initialize tagging sockets with 1 or 2 arguments}
+% \begin{macrocode}
+\AssignSocketPlug{tagsupport/caption/begin}{noop}
+% \end{macrocode}
% \end{socketdecl}
%
% \begin{socketdecl}{tagsupport/caption/label/begin,
@@ -535,6 +585,61 @@
%
% \subsection{Tagging support for output routines}
%
+% \changes{v1.0m}{2025/02/14}{Tagging support for output routines added}
+%
+% \begin{socketdecl}{tagsupport/build/page/header}
+% \changes{v1.0m}{2025/02/14}{Tagging socket added}
+% \begin{socketdecl}{tagsupport/build/page/footer}
+% \changes{v1.0m}{2025/02/14}{Tagging socket added}
+% These sockets receive the formatted running header/footer in its
+% second argument (the first is not used) following the convention
+% of tagging sockets, i.e., only the second argument is processed
+% if tagging is not actove
+% \begin{macrocode}
+\NewSocket{tagsupport/build/page/header}{2}
+\NewSocket{tagsupport/build/page/footer}{2}
+% \end{macrocode}
+%
+% \changes{v1.0n}{2025/02/16}{Initialize tagging sockets with 1 or 2 arguments}
+% \begin{macrocode}
+\NewSocketPlug{tagsupport/build/page/header}{transparent}{#2}
+\NewSocketPlug{tagsupport/build/page/footer}{transparent}{#2}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\AssignSocketPlug{tagsupport/build/page/header}{transparent}
+\AssignSocketPlug{tagsupport/build/page/footer}{transparent}
+% \end{macrocode}
+% \end{socketdecl}
+% \end{socketdecl}
+%
+%
+%
+% \begin{socketdecl}{tagsupport/build/column/outputbox}
+% \changes{v1.0m}{2025/02/14}{Tagging socket added}
+% This socket is used to add any missing tagging structures to the
+% \cs{@outputbox} box, if necessary.
+% \begin{macrocode}
+\NewSocket{tagsupport/build/column/outputbox}{0}
+% \end{macrocode}
+% \end{socketdecl}
+%
+%
+%
+% \begin{socketdecl}{tagsupport/build/column/footins}
+% \changes{v1.0m}{2025/02/14}{Tagging socket added}
+% This socket is used to add any missing tagging structures to the
+% \cs{footins} box, if necessary.
+% \begin{macrocode}
+\NewSocket{tagsupport/build/column/footins}{0}
+% \end{macrocode}
+% \end{socketdecl}
+%
+%
+%
+%
+%
+%
% \begin{socketdecl}{tagsupport/page@sofar}
%
% This socket is declared and used in the \pkg{multicol} output routines.
@@ -544,7 +649,222 @@
% \end{macrocode}
% \end{socketdecl}
%
+% \subsection{Tagging support for math}
+%
+% \subsubsection{General sockets}
+%
+% The following sockets are the main math sockets.
+%
+% \changes{v1.0n}{2025/02/19}{Moved math sockets into lttagging}
+% \begin{macrocode}
+\NewSocket{tagsupport/math/inline/begin}{0}
+\NewSocket{tagsupport/math/inline/end}{0}
+\NewSocket{tagsupport/math/inline/formula/begin}{2}
+\NewSocket{tagsupport/math/inline/formula/end}{0}
+\NewSocket{tagsupport/math/display/begin}{0}
+\NewSocket{tagsupport/math/display/end}{0}
+\NewSocket{tagsupport/math/display/formula/begin}{2}
+\NewSocket{tagsupport/math/display/formula/end}{0}
+\NewSocket{tagsupport/math/display/tag/begin}{0}
+\NewSocket{tagsupport/math/display/tag/end}{0}
+% \end{macrocode}
+% Assign transparent socket to the sockets with two arguments:
+% \begin{macrocode}
+\NewSocketPlug{tagsupport/math/inline/formula/begin}{transparent}{#2}
+\AssignSocketPlug{tagsupport/math/inline/formula/begin}{transparent}
+\NewSocketPlug{tagsupport/math/display/formula/begin}{transparent}{#2}
+\AssignSocketPlug{tagsupport/math/display/formula/begin}{transparent}
+% \end{macrocode}
+%
+% \subsubsection{Sockets specific for luamml}
+% \paragraph{Save sockets}
+% These sockets are wrappers around the \cs{luamml_save:...} commands.
+% They take an argument which should contain the argument of the save command.
+%
+% \begin{socketdecl}{tagsupport/math/luamml/save/nn}
+% The argument should contain the two arguments of the command.
+% \begin{macrocode}
+\NewSocket{tagsupport/math/luamml/save/nn}{1}
+\AssignSocketPlug{tagsupport/math/luamml/save/nn}{noop}
+% \end{macrocode}
+% \end{socketdecl}
+%
+% \begin{socketdecl}{tagsupport/math/luamml/save/nNn}
+% The argument should contain the three arguments of the command.
+% \begin{macrocode}
+\NewSocket{tagsupport/math/luamml/save/nNn}{1}
+\AssignSocketPlug{tagsupport/math/luamml/save/nNn}{noop}
+% \end{macrocode}
+% \end{socketdecl}
+%
+% \paragraph{Socket to annotate}
+%
+% \begin{socketdecl}{tagsupport/math/luamml/annotate/false}
+% These socket can be used for content that should be annotated
+% with \texttt{core=false}
+% \begin{macrocode}
+\NewSocket{tagsupport/math/luamml/annotate/false}{2}
+\NewSocketPlug{tagsupport/math/luamml/annotate/false}{transparent}{#2}
+\AssignSocketPlug{tagsupport/math/luamml/annotate/false}{transparent}
+% \end{macrocode}
+% \end{socketdecl}
+%
+% \paragraph{Array sockets} These sockets will be used in \pkg{array} to
+% add luamml support to the array environment.
+%
+% \begin{socketdecl}{tagsupport/math/luamml/array/save}
%
+% This socket will be used in \cs{endarray}. The plug is set by luamml.
+% \begin{macrocode}
+\NewSocket{tagsupport/math/luamml/array/save}{0}
+% \end{macrocode}
+% \end{socketdecl}
+%
+% \begin{socketdecl}{tagsupport/math/luamml/array/finalize}
+%
+% This socket will be used in \cs{endarray}. The plug is set by luamml.
+% \begin{macrocode}
+\NewSocket{tagsupport/math/luamml/array/finalize}{0}
+% \end{macrocode}
+% \end{socketdecl}
+%
+% \begin{socketdecl}{tagsupport/math/luamml/array/initcol}
+% This socket will be used in \cs{@classz}. The plug is set by luamml.
+% \begin{macrocode}
+\NewSocket{tagsupport/math/luamml/array/initcol}{0}
+% \end{macrocode}
+% \end{socketdecl}
+%
+%
+% \begin{socketdecl}{tagsupport/math/luamml/array/finalizecol}
+% This socket will be used in \cs{@classz}. The plug is set by luamml.
+% The argument sets the type of the column.
+% \begin{macrocode}
+\NewSocket{tagsupport/math/luamml/array/finalizecol}{1}
+\AssignSocketPlug{tagsupport/math/luamml/array/finalizecol}{noop}
+% \end{macrocode}
+% \end{socketdecl}
+%
+% \paragraph{Alignment environments}
+% Multiline environments like \texttt{align}, \texttt{multline} or \texttt{gather}
+% are tagged as \texttt{mtable}.
+%
+% \begin{socketdecl}{tagsupport/math/luamml/mtable/finalizecol}
+% This sockets is used at the end of alignment cells and adds them to
+% the row. The argument passes a type like \texttt{last} or \texttt{box}.
+% \begin{macrocode}
+\NewSocket{tagsupport/math/luamml/mtable/finalizecol}{1}
+\AssignSocketPlug{tagsupport/math/luamml/mtable/finalizecol}{noop}
+% \end{macrocode}
+% \end{socketdecl}
+%
+%
+% \begin{socketdecl}{tagsupport/math/luamml/mtable/finalize}
+% This sockets is used at the end of alignment environment to finalize the
+% mtable code. It should be used normally with \cs{UseExpandableTaggingSocket}.
+% \begin{macrocode}
+\NewSocket{tagsupport/math/luamml/mtable/finalize}{1}
+\AssignSocketPlug{tagsupport/math/luamml/mtable/finalize}{noop}
+% \end{macrocode}
+% \end{socketdecl}
+%
+% \begin{socketdecl}{tagsupport/math/luamml/mtable/aligncol}
+% This sockets is used in multline to add attributes
+% describing the alignment to the left and right.
+% It takes an argument, the alignment.
+% \begin{macrocode}
+\NewSocket{tagsupport/math/luamml/mtable/aligncol}{1}
+\AssignSocketPlug{tagsupport/math/luamml/mtable/aligncol}{noop}
+% \end{macrocode}
+% \end{socketdecl}
+
+%
+% \begin{socketdecl}{tagsupport/math/luamml/mtable/innertable/save}
+% This socket is used in \cs{endaligned} to save the table. It takes no argument.
+% \begin{macrocode}
+\NewSocket{tagsupport/math/luamml/mtable/innertable/save}{0}
+% \end{macrocode}
+% \end{socketdecl}
+%
+% \begin{socketdecl}{tagsupport/math/luamml/mtable/smallmatrix/save}
+% This socket is used in \cs{endsmallmatrix} to save the table. It takes no argument.
+% TODO: Check if this socket and the innertable socket can/should be merged into a more
+% generic version.
+% \begin{macrocode}
+\NewSocket{tagsupport/math/luamml/mtable/smallmatrix/save}{0}
+% \end{macrocode}
+% \end{socketdecl}
+%
+% \begin{socketdecl}{tagsupport/math/luamml/mtable/innertable/finalize}
+% This socket is used e.g. in \cs{endsmallmatrix} and \cs{gathered} to finalize the table.
+% It takes no argument.
+% \begin{macrocode}
+\NewSocket{tagsupport/math/luamml/mtable/innertable/finalize}{0}
+% \end{macrocode}
+% \end{socketdecl}
+%
+% \begin{socketdecl}{tagsupport/math/luamml/mtable/tag/save}
+% This socket is used to save a tag for later use.
+% has been save before.
+% \begin{macrocode}
+\NewSocket{tagsupport/math/luamml/mtable/tag/save}{0}
+% \end{macrocode}
+% \end{socketdecl}
+
+% \begin{socketdecl}{tagsupport/math/luamml/mtable/tag/set}
+% This socket should be used when a tag is placed. It inserts a tag that
+% has been save before.
+% \begin{macrocode}
+\NewSocket{tagsupport/math/luamml/mtable/tag/set}{0}
+% \end{macrocode}
+% \end{socketdecl}
+%
+% \paragraph{mbox socket}
+%
+% \begin{socketdecl}{tagsupport/math/luamml/hbox}
+% This socket is used around \cs{hbox}
+% inside an \cs{mbox}, \cs{makebox} and \cs{text} and annotates
+% the content if the \cs{hbox} is used inside math.
+% The real plug is set by luamml but a default plug is defined
+% here so that the socket can also be used if luamml is not used.
+% \begin{macrocode}
+\NewSocket{tagsupport/math/luamml/hbox}{2}
+\NewSocketPlug{tagsupport/math/luamml/hbox}{transparent}{#2}
+\AssignSocketPlug{tagsupport/math/luamml/hbox}{transparent}
+% \end{macrocode}
+% \end{socketdecl}
+%
+%
+% \paragraph{math phantom sockets}
+% \changes{1.0m}{2025-01-27}{add sockets for math phantom commands}
+% \begin{socketdecl}{tagsupport/math/luamml/finph@nt}
+% This socket handles the annotation of \cs{finph@nt}
+% \begin{macrocode}
+\NewSocket{tagsupport/math/luamml/finph@nt}{2}
+\NewSocketPlug{tagsupport/math/luamml/finph@nt}{transparent}{#2}
+\AssignSocketPlug{tagsupport/math/luamml/finph@nt}{transparent}
+% \end{macrocode}
+% \end{socketdecl}
+%
+% \begin{socketdecl}{tagsupport/math/luamml/finph@nt}
+% This socket handles the annotation of \cs{finsm@sh}
+% \begin{macrocode}
+\NewSocket{tagsupport/math/luamml/finsm@sh}{2}
+\NewSocketPlug{tagsupport/math/luamml/finsm@sh}{transparent}{#2}
+\AssignSocketPlug{tagsupport/math/luamml/finsm@sh}{transparent}
+% \end{macrocode}
+% \end{socketdecl}
+% \paragraph{Artifact root sign}
+%
+% \begin{socketdecl}{tagsupport/math/luamml/artifact}
+% Unicode characters like a root sign should be marked as artifacts
+% to avoid duplication, e.g., in derivation if mathml
+% structure elements are used that imply the meaning.
+%
+% \begin{macrocode}
+\NewSocket{tagsupport/math/luamml/artifact}{0}
+% \end{macrocode}
+% \end{socketdecl}
%
% \section{For lttab.dtx parked here for now}
%
diff --git a/Master/texmf-dist/source/latex-dev/base/lttemplates.dtx b/Master/texmf-dist/source/latex-dev/base/lttemplates.dtx
index 4d2f679feea..d69f70e97a1 100644
--- a/Master/texmf-dist/source/latex-dev/base/lttemplates.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/lttemplates.dtx
@@ -2,7 +2,7 @@
%
% Copyright (C) 1999 Frank Mittelbach, Chris Rowley, David Carlisle
% Copyright (C) 2004-2010 Frank Mittelbach, The LaTeX Project
-% Copyright (C) 2011-2024
+% Copyright (C) 2011-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -36,7 +36,7 @@
%<*driver>
% \fi
\ProvidesFile{lttemplates.dtx}
- [2024-11-17 v1.0d LaTeX Kernel (Prototype document functions)]
+ [2025-01-20 v1.0e LaTeX Kernel (Prototype document functions)]
% \iffalse
\documentclass{l3doc}
\GetFileInfo{lttemplates.dtx}
@@ -91,7 +91,7 @@
% \item Loading one of the many packages to customise certain elements of
% the standard classes.
% \item Loading a completely different document class, such as
-% \textsf{KOMA-Script} or \textsf{memoir}, that allows easy customisation.
+% \textsf{KOMA-Script} or \textsf{memoir}, that allows easy customization.
% \end{itemize}
% All three of these approaches have their drawbacks and learning curves.
%
@@ -99,7 +99,7 @@
% introduced at the beginning of this section, so that document authors who
% are not programmers can easily change the design of their documents.
% \pkg{lttemplates} also makes it easier for \LaTeX{} programmers to provide
-% their own customisations on top of a pre-existing class.
+% their own customizations on top of a pre-existing class.
%
% \section{What is a document?}
%
@@ -120,7 +120,7 @@
% contain the same sort of information but present it in slightly
% different ways. For example, the difference between a numbered and an
% unnumbered section, \cs{section} and |\section*|, or the difference
-% between an itemised list or an enumerated list.
+% between an itemized list or an enumerated list.
%
% There are three distinct layers in the definition of
% \enquote{a document} at this level
@@ -180,7 +180,7 @@
% \section{Templates}
% \label{sec:templates}
%
-% A \emph{template} is a generalised design solution for representing
+% A \emph{template} is a generalized design solution for representing
% the information of a specified type. Templates that do the same
% thing, but in different ways, are grouped together by their type
% and given separate names. There are two important parts to a template:
@@ -320,7 +320,7 @@
% \toprule
% \multicolumn{1}{l}{Key-type} & Description of binding \\
% \midrule
-% \ & Boolean variable, \emph{e.g}.~\cs{l_tmpa_bool} \\
+% boolean & Boolean variable, \emph{e.g}.~\cs{l_tmpa_bool} \\
% choice
% & List of choice implementations
% (see Section~\ref{sec:choices-key}) \\
@@ -351,12 +351,95 @@
% In the final argument of \cs{DeclareTemplateCode} the assignment of
% keys defined by the template may be delayed by including the command
% \cs{AssignTemplateKeys}. If this is \emph{not} present, keys are assigned
-% immediately before the template code. If \cs{AssignTemplateKeys} is
+% immediately before the template code. If an
+% \cs{AssignTemplateKeys} command is
% present, assignment is delayed until this point. Note that the
% command must be \emph{directly} present in the code, not placed
% within a nested command/macro.
% \end{function}
%
+
+% \begin{function}{\SetKnownTemplateKeys,\SetTemplateKeys,\UnusedTemplateKeys}
+% \begin{syntax}
+% \cs{SetKnownTemplateKeys} \Arg{type} \Arg{template} \Arg{keyvals}
+% \cs{SetTemplateKeys} \Arg{type} \Arg{template} \Arg{keyvals}
+%
+% \cs{UnusedTemplateKeys} \% all \meta{keyvals} unused by previous \cs{SetKnownTemplateKeys}
+% \end{syntax}
+%
+% In the final argument of \cs{DeclareTemplateCode} one can also
+% overwrite (some of) the current template key value settings by
+% using the command \cs{SetKnownTemplateKeys} or
+% \cs{SetTemplateKeys}, i.e., they can overwrite the template default values and
+% the values assigned by the instance.
+%
+% The \cs{SetKnownTemplateKeys} and \cs{SetTemplateKeys} commands
+% are only supported within the code of a template; using them
+% elsewhere has unpredictable results. If they are used together
+% with \cs{AssignTemplateKeys} then the latter command should come first
+% in the template code.
+%
+% The main use case for these commands is the situation where there
+% is an argument (normally \texttt{\#1}) to the template in which
+% a key/value list can be specified that overwrites the normal
+% settings. In that case one could use
+%\begin{quote}
+% \verb/\SetKnownTemplateKeys/\Arg{type}\Arg{template}\verb/{#1}/
+%\end{quote}
+% to process this key/value list inside the template.
+%
+% If \cs{SetKnownTemplateKeys} is executed and the \meta{keyvals} argument contains keys not known to the
+% \meta{template} they are simply ignored and stored in the
+% tokenlist \cs{UnusedTemplateKeys}
+% without generating an error. This way it is possible to
+% apply the same key/val list specified by the user on a
+% document-level command or environment to several templates, which
+% is useful, if the command or environment is implemented by calling several different template instances.
+%
+% \end{function}
+%
+% As a variation of that, you can use this key/val
+% list the first time, and for the next template instance use what remains in
+% \cs{UnusedTemplateKeys} (i.e., the key/val list with only the keys that have not been processed previously). The final processing step could then be
+% \cs{SetTemplateKeys}, which unconditionally attempts to set the
+% \meta{keyvals} received in its third argument. This command
+% complains if any of them are unknown keys. Alternatively, you
+% could use \cs{SetKnownTemplateKeys} and afterwards check whether \cs{UnusedTemplateKeys} is empty.\footnote{Using
+% \cs{SetTemplateKeys} exposes the inner structure of the template
+% keys when generating an error. This is something one may want to
+% avoid as it can be confusing to the user, especially if several
+% templates are involved. In that
+% case use \cs{SetKnownTemplateKeys} and afterwards check whether
+% \cs{UnusedTemplateKeys} is empty; if it is not empty then generate your own
+% error message.}
+%
+% For example, a list, such as \env{enumerate}, is made up from a
+% \texttt{blockenv}, \texttt{block}, \texttt{list}, and a
+% \texttt{para} template and in the single user-supplied optional
+% argument of \env{enumerate} key/values for any of these templates might
+% be specified.
+%
+% In fact, in the particular example of list environments,
+% the supplied key/value list is also saved and then applied to each
+% \cs{item} which is implemented through an \texttt{item}
+% template. This way, one can specify one-off settings for all the items
+% of a single list (on the environment level), as well as to
+% individual items within that list (by specifying them in the
+% optional argument of an \cs{item}). With
+% \cs{SetKnownTemplateKeys} and \cs{SetTemplateKeys} working
+% together, it is possible to provide this flexibility and still
+% alert the user when one of their keys is misspelled.
+%
+% On the other hand you may want to allow for
+% \enquote{misspellings} without generating an error or a
+% warning. For example, if you define a template that accepts only a
+% few keys, you might just want to ignore anything specified in the
+% source when you use this template in place of a different one,
+% without the need to alter the document source. Or you might just
+% generate a warning message, which is easy, given that the unused
+% key/values are available in the \cs{UnusedTemplateKeys} variable.
+%
+%
% \begin{function}{\DeclareTemplateCopy}
% \begin{syntax}
% \cs{DeclareTemplateCopy}
@@ -418,7 +501,7 @@
% For keys which accept the values \texttt{true} and \texttt{false}
% both the boolean and choice key types can be used. As template
% interfaces are intended to prompt clarity at the design level, the
-% boolean key type should be favoured, with the choice type reserved
+% boolean key type should be favored, with the choice type reserved
% for keys which take arbitrary values.
%
% \section{Instances}
@@ -432,10 +515,10 @@
% are input into it.
%
% For example, a template might say \enquote{here is a section with or
-% without a number that might be centred or left aligned and print its
+% without a number that might be centered or left aligned and print its
% contents in a certain font of a certain size, with a bit of a gap
% before and after it} whereas an instance declares \enquote{this is a
-% section with a number, which is centred and set in $12\,\text{pt}$
+% section with a number, which is centered and set in $12\,\text{pt}$
% italic with a $10\,\text{pt}$ skip before and a
% $12\,\text{pt}$ skip after it}. Therefore, an instance is just a
% frozen version of a template with specific settings as chosen by the
@@ -516,8 +599,8 @@
% detailed by the \meta{type} declaration. This in effect
% is the same as creating an instance using \cs{DeclareInstance}
% and immediately using it with \cs{UseInstance}, but without the
-% instance having any further existence. It is therefore useful where
-% a template needs to be used once.
+% instance having any further existence. This command is therefore useful when
+% a template needs to be used only once.
%
% This function can also be used as the argument to \texttt{instance}
% key types:
@@ -565,39 +648,6 @@
% template untouched.
% \end{function}
%
-% \section{\emph{Ad hoc} adjustment of templates}
-%
-% \begin{function}{\SetTemplateKeys}
-% \begin{syntax}
-% \cs{SetTemplateKeys} \Arg{type} \Arg{template} \Arg{keyvals}
-% \end{syntax}
-% At point of use it may be useful to apply changed to individual instances.
-% This is supported as each template key is made available for adjustment
-% using \cs{SetTemplateKeys}.
-% \end{function}
-%
-% For example, after
-% \begin{verbatim}
-% \NewTypeType{MyObj}{0}
-% \DeclareTemplateInterface{MyObj}{TemplateA}{0}
-% {
-% akey: tokenlist ,
-% bkey: function{2}
-% }
-% \DeclareTemplateCode{MyObj}{TemplateA}{0}
-% {
-% akey = SomeTokens ,
-% bkey = \func:nn ,
-% }
-% \end{verbatim}
-% the template keys could be adjusted in an \emph{ad hoc} fashion using
-% \begin{verbatim}
-% \SetTemplateKeys{MyObj}{TemplateA}
-% {
-% akey = OtherTokens ,
-% bkey = \AltFunc:nn
-% }
-% \end{verbatim}
%
% \section{Getting information about templates and instances}
%
@@ -1385,6 +1435,7 @@
% \subsection{Implementation part of template declaration}
%
% \begin{macro}{\@@_declare_template_code:nnnnn}
+% \changes{2025-01-20}{v1.0e}{Speed up test for \cs{AssignTemplateKeys}}
% \begin{macro}{\@@_declare_template_code:nnnn}
% The main function for implementing a template starts with a couple of
% simple checks to make sure that there are no obvious mistakes: the
@@ -1400,8 +1451,15 @@
\@@_if_keys_exist:nnT {#1} {#2}
{
\@@_store_key_implementation:nnn {#1} {#2} {#4}
- \regex_match:nnTF { \c { AssignTemplateKeys } } {#5}
- { \@@_declare_template_code:nnnn {#1} {#2} {#3} {#5} }
+ \str_if_in:nnTF {#5} { AssignTemplateKeys }
+ {
+ \regex_match:nnTF { \c { AssignTemplateKeys } } {#5}
+ { \@@_declare_template_code:nnnn {#1} {#2} {#3} {#5} }
+ {
+ \@@_declare_template_code:nnnn
+ {#1} {#2} {#3} { \AssignTemplateKeys #5 }
+ }
+ }
{
\@@_declare_template_code:nnnn
{#1} {#2} {#3} { \AssignTemplateKeys #5 }
@@ -2619,11 +2677,35 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\SetTemplateKeys}
-% A friendly wrapper
+% \begin{macro}{\SetKnownTemplateKeys,\SetTemplateKeys}
+% A friendly wrapper, with some speed up for the common case of the
+% third argument being empty.
+% \changes{2025-01-08}{v1.0d}{Test for empty key/val list to speed up processing}
+% \begin{macrocode}
+\cs_new_protected:Npn \SetKnownTemplateKeys #1#2#3
+ {
+ \tl_if_empty:oTF {#3}
+ {
+ \tl_set_eq:NN \UnusedTemplateKeys \c_empty_tl
+ }
+ {
+ \keys_set_known:noN { template / #1 / #2 } {#3} \UnusedTemplateKeys
+ }
+ }
+% \end{macrocode}
+%
% \begin{macrocode}
\cs_new_protected:Npn \SetTemplateKeys #1#2#3
- { \keys_set_known:nnN { template / #1 / #2 } {#3} \l_@@_tmp_clist }
+ {
+ \tl_if_empty:oF {#3}
+ {
+ \keys_set:no { template / #1 / #2 } {#3}
+ }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\tl_new:N \UnusedTemplateKeys
% \end{macrocode}
% \end{macro}
%
@@ -2647,4 +2729,4 @@
%<@@=>
% \end{macrocode}
%
-% \Finale \ No newline at end of file
+% \Finale
diff --git a/Master/texmf-dist/source/latex-dev/base/lttextcomp.dtx b/Master/texmf-dist/source/latex-dev/base/lttextcomp.dtx
index 64c89fe9598..b8f8b7ec934 100644
--- a/Master/texmf-dist/source/latex-dev/base/lttextcomp.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/lttextcomp.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2019-2024
+% Copyright (C) 2019-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/Master/texmf-dist/source/latex-dev/base/ltthm.dtx b/Master/texmf-dist/source/latex-dev/base/ltthm.dtx
index c900f519dd5..ea27e45c133 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltthm.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltthm.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/Master/texmf-dist/source/latex-dev/base/ltvers.dtx b/Master/texmf-dist/source/latex-dev/base/ltvers.dtx
index d775f77aa6e..f78a849a145 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltvers.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltvers.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -115,7 +115,7 @@
{2025-06-01}
%</2ekernel|latexrelease>
%<*2ekernel>
-\def\patch@level{-1}
+\def\patch@level{-2}
% \end{macrocode}
%
% \begin{macro}{\development@branch@name}
diff --git a/Master/texmf-dist/source/latex-dev/base/ltxdoc.dtx b/Master/texmf-dist/source/latex-dev/base/ltxdoc.dtx
index 5e8b4946926..9f5d7777325 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltxdoc.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltxdoc.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -677,7 +677,7 @@ Bug reports can be opened (category \texttt{#1}) at\\%
%
% Copyright 2006, 2007, 2011
% Heiko Oberdiek
-% Copyright (C) 2014-2024
+% Copyright (C) 2014-2025
% The LaTeX Project
%
diff --git a/Master/texmf-dist/source/latex-dev/base/ltxref.dtx b/Master/texmf-dist/source/latex-dev/base/ltxref.dtx
index 4464409abd3..da2d9a6aed3 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltxref.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltxref.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -33,7 +33,7 @@
%<*driver>
% \fi
\ProvidesFile{ltxref.dtx}
- [2024/09/20 v1.1r LaTeX Kernel (Cross Referencing)]
+ [2025/01/22 v1.1t LaTeX Kernel (Cross Referencing)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltxref.dtx}
@@ -418,12 +418,21 @@
%
%
% \begin{macro}{\refstepcounter}
+% \changes{v1.1t}{2025/01/22}{Macro added}
+% Saved |*| for testing the argument of \cs{refstepcounter}.
+% \begin{macrocode}
+\def\ltx@star@counter{*}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\refstepcounter}
% Step the counter and allow for labels to point to its current value.
% \changes{v1.1n}{2020/05/05}{record the counter name in \cs{@currentcounter}}
% \changes{v1.1o}{2020/08/23}{add default definition of \cs{@currentcounter}}
% \changes{v1.1r}{2024/09/20}{set also \@currentHref}
% \changes{v1.1r}{2024/09/20}{provide a kernel copy \@kernel@refstepcounter}
% \changes{v1.1r}{2024/09/20}{add sockets}
+% \changes{v1.1t}{2025/01/22}{Guard * from causing infinite loop}
% \begin{macrocode}
%<latexrelease>\IncludeInRelease{2022/06/01}%
%<latexrelease> {\Ref}{Add starred version}%
@@ -465,7 +474,10 @@
\def\refstepcounter#1{%
\UseSocket{refstepcounter}{%
\stepcounter{#1}%
- \edef\@currentcounter{#1}%
+ \edef\reserved@a{#1}%
+ \ifx\reserved@a\ltx@star@counter\else
+ \let\@currentcounter\reserved@a
+ \fi
\protected@edef\@currentlabel
% \end{macrocode}
% By generating the second csname first the |\p@...| command can
@@ -501,7 +513,10 @@
\def\@kernel@refstepcounter#1{%
\UseSocket{refstepcounter}{%
\stepcounter{#1}%
- \edef\@currentcounter{#1}%
+ \edef\reserved@a{#1}%
+ \ifx\reserved@a\ltx@star@counter\else
+ \let\@currentcounter\reserved@a
+ \fi
\protected@edef\@currentlabel
{\csname p@#1\expandafter\endcsname\csname the#1\endcsname}}}%
% \end{macrocode}
@@ -549,10 +564,11 @@
% \changes{v1.1l}{2019/08/22}{Commanded moved from \texttt{varioref.sty}}
% \changes{v1.1p}{2022/04/12}{Macro reimplemented with a starred version}%
% \begin{macrocode}
-\def\@kernel@Ref#1{\protected@edef\@tempa{\@kernel@ref{#1}}%
- \expandafter\MakeUppercase\@tempa}
-\def\@kernel@sRef#1{\protected@edef\@tempa{\@kernel@sref{#1}}%
- \expandafter\MakeUppercase\@tempa}
+% \changes{v1.1s}{2024/12/10}{Replace \cs{@tempa} with \cs{reserved@a} (gh/1579)}
+\def\@kernel@Ref#1{\protected@edef\reserved@a{\@kernel@ref{#1}}%
+ \expandafter\MakeUppercase\reserved@a}
+\def\@kernel@sRef#1{\protected@edef\reserved@a{\@kernel@sref{#1}}%
+ \expandafter\MakeUppercase\reserved@a}
\NewDocumentCommand\Ref{s}
{\IfBooleanTF{#1}{\@kernel@sRef}{\@kernel@Ref}}
% \end{macrocode}
@@ -583,8 +599,8 @@
%<latexrelease> {\csname p@#1\expandafter\endcsname\csname the#1\endcsname}%
%<latexrelease>}
%<latexrelease>\def\labelformat#1{\expandafter\def\csname p@#1\endcsname##1}
-%<latexrelease>\DeclareRobustCommand\Ref[1]{\protected@edef\@tempa{\ref{#1}}%
-%<latexrelease> \expandafter\MakeUppercase\@tempa}
+%<latexrelease>\DeclareRobustCommand\Ref[1]{\protected@edef\reserved@a{\ref{#1}}%
+%<latexrelease> \expandafter\MakeUppercase\reserved@a}
%<latexrelease>\EndIncludeInRelease
%<latexrelease>\IncludeInRelease{2019/10/01}%
%<latexrelease> {\refstepcounter}{Add \labelformat and \Ref}%
@@ -594,8 +610,8 @@
%<latexrelease> {\csname p@#1\expandafter\endcsname\csname the#1\endcsname}%
%<latexrelease>}
%<latexrelease>\def\labelformat#1{\expandafter\def\csname p@#1\endcsname##1}
-%<latexrelease>\DeclareRobustCommand\Ref[1]{\protected@edef\@tempa{\ref{#1}}%
-%<latexrelease> \expandafter\MakeUppercase\@tempa}
+%<latexrelease>\DeclareRobustCommand\Ref[1]{\protected@edef\reserved@a{\ref{#1}}%
+%<latexrelease> \expandafter\MakeUppercase\reserved@a}
%<latexrelease>\EndIncludeInRelease
%<latexrelease>\IncludeInRelease{0000/00/00}%
%<latexrelease> {\refstepcounter}{Add \labelformat and \Ref}%
diff --git a/Master/texmf-dist/source/latex-dev/base/makeindx.dtx b/Master/texmf-dist/source/latex-dev/base/makeindx.dtx
index 20da2f159df..57384bb1b14 100644
--- a/Master/texmf-dist/source/latex-dev/base/makeindx.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/makeindx.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/Master/texmf-dist/source/latex-dev/base/makeindx.ins b/Master/texmf-dist/source/latex-dev/base/makeindx.ins
index 45e5c9aab00..d58ead0bb23 100644
--- a/Master/texmf-dist/source/latex-dev/base/makeindx.ins
+++ b/Master/texmf-dist/source/latex-dev/base/makeindx.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright (C) 1993-2024
+%% Copyright (C) 1993-2025
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright (C) 1993-2024
+Copyright (C) 1993-2025
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/Master/texmf-dist/source/latex-dev/base/newdc.ins b/Master/texmf-dist/source/latex-dev/base/newdc.ins
index 69d74d61676..40344ede55f 100644
--- a/Master/texmf-dist/source/latex-dev/base/newdc.ins
+++ b/Master/texmf-dist/source/latex-dev/base/newdc.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright (C) 1993-2024
+%% Copyright (C) 1993-2025
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright (C) 1993-2024
+Copyright (C) 1993-2025
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/Master/texmf-dist/source/latex-dev/base/newlfont.dtx b/Master/texmf-dist/source/latex-dev/base/newlfont.dtx
index 2792395c58a..a7fb388ca26 100644
--- a/Master/texmf-dist/source/latex-dev/base/newlfont.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/newlfont.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/Master/texmf-dist/source/latex-dev/base/nfssfont.dtx b/Master/texmf-dist/source/latex-dev/base/nfssfont.dtx
index 0464053c10f..5f18ec812b9 100644
--- a/Master/texmf-dist/source/latex-dev/base/nfssfont.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/nfssfont.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/Master/texmf-dist/source/latex-dev/base/nfssfont.ins b/Master/texmf-dist/source/latex-dev/base/nfssfont.ins
index 00f5a0c8a39..292d2877162 100644
--- a/Master/texmf-dist/source/latex-dev/base/nfssfont.ins
+++ b/Master/texmf-dist/source/latex-dev/base/nfssfont.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright (C) 1993-2024
+%% Copyright (C) 1993-2025
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright (C) 1993-2024
+Copyright (C) 1993-2025
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/Master/texmf-dist/source/latex-dev/base/olddc.ins b/Master/texmf-dist/source/latex-dev/base/olddc.ins
index 1f5d12ece4a..9b64c8512e8 100644
--- a/Master/texmf-dist/source/latex-dev/base/olddc.ins
+++ b/Master/texmf-dist/source/latex-dev/base/olddc.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright (C) 1993-2024
+%% Copyright (C) 1993-2025
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright (C) 1993-2024
+Copyright (C) 1993-2025
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/Master/texmf-dist/source/latex-dev/base/oldlfont.dtx b/Master/texmf-dist/source/latex-dev/base/oldlfont.dtx
index 7a3534f517a..94ef5e6ced0 100644
--- a/Master/texmf-dist/source/latex-dev/base/oldlfont.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/oldlfont.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/Master/texmf-dist/source/latex-dev/base/preload.dtx b/Master/texmf-dist/source/latex-dev/base/preload.dtx
index fb5f86824cf..029db1c50cd 100644
--- a/Master/texmf-dist/source/latex-dev/base/preload.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/preload.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/Master/texmf-dist/source/latex-dev/base/proc.dtx b/Master/texmf-dist/source/latex-dev/base/proc.dtx
index ec69e473966..e704147c7ac 100644
--- a/Master/texmf-dist/source/latex-dev/base/proc.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/proc.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/Master/texmf-dist/source/latex-dev/base/proc.ins b/Master/texmf-dist/source/latex-dev/base/proc.ins
index 83f50bda123..f2e3be72900 100644
--- a/Master/texmf-dist/source/latex-dev/base/proc.ins
+++ b/Master/texmf-dist/source/latex-dev/base/proc.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright (C) 1993-2024
+%% Copyright (C) 1993-2025
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright (C) 1993-2024
+Copyright (C) 1993-2025
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/Master/texmf-dist/source/latex-dev/base/slides.dtx b/Master/texmf-dist/source/latex-dev/base/slides.dtx
index 3674a6c05f6..0d77e5a6836 100644
--- a/Master/texmf-dist/source/latex-dev/base/slides.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/slides.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/Master/texmf-dist/source/latex-dev/base/slides.ins b/Master/texmf-dist/source/latex-dev/base/slides.ins
index 3124ed366f9..4402c07463b 100644
--- a/Master/texmf-dist/source/latex-dev/base/slides.ins
+++ b/Master/texmf-dist/source/latex-dev/base/slides.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright (C) 1993-2024
+%% Copyright (C) 1993-2025
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright (C) 1993-2024
+Copyright (C) 1993-2025
The LaTeX Project and any individual authors listed elsewhere
in this file.
@@ -96,7 +96,7 @@ extension .ins) which are part of the distribution.
This is a generated file.
-Copyright (C) 1993-2024
+Copyright (C) 1993-2025
The LaTeX Project and any individual authors listed elsewhere
in this file.
@@ -138,7 +138,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright (C) 1993-2024
+Copyright (C) 1993-2025
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/Master/texmf-dist/source/latex-dev/base/slifonts.fdd b/Master/texmf-dist/source/latex-dev/base/slifonts.fdd
index b35cd07a8be..3b4ca46bd79 100644
--- a/Master/texmf-dist/source/latex-dev/base/slifonts.fdd
+++ b/Master/texmf-dist/source/latex-dev/base/slifonts.fdd
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/Master/texmf-dist/source/latex-dev/base/syntonly.dtx b/Master/texmf-dist/source/latex-dev/base/syntonly.dtx
index 9844585fa56..6b671628d47 100644
--- a/Master/texmf-dist/source/latex-dev/base/syntonly.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/syntonly.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/Master/texmf-dist/source/latex-dev/base/syntonly.ins b/Master/texmf-dist/source/latex-dev/base/syntonly.ins
index 6435e0a6ee8..91434295d5c 100644
--- a/Master/texmf-dist/source/latex-dev/base/syntonly.ins
+++ b/Master/texmf-dist/source/latex-dev/base/syntonly.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright (C) 1993-2024
+%% Copyright (C) 1993-2025
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright (C) 1993-2024
+Copyright (C) 1993-2025
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/Master/texmf-dist/source/latex-dev/base/tulm.fdd b/Master/texmf-dist/source/latex-dev/base/tulm.fdd
index 6f7a6873cd6..d8dbd176e63 100644
--- a/Master/texmf-dist/source/latex-dev/base/tulm.fdd
+++ b/Master/texmf-dist/source/latex-dev/base/tulm.fdd
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2016-2024
+% Copyright (C) 2016-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/Master/texmf-dist/source/latex-dev/base/tulm.ins b/Master/texmf-dist/source/latex-dev/base/tulm.ins
index ea8fd7b22bf..244aadf6ab5 100644
--- a/Master/texmf-dist/source/latex-dev/base/tulm.ins
+++ b/Master/texmf-dist/source/latex-dev/base/tulm.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright (C) 2016-2024
+%% Copyright (C) 2016-2025
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright (C) 2016-2024
+Copyright (C) 2016-2025
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/Master/texmf-dist/source/latex-dev/base/unpack.ins b/Master/texmf-dist/source/latex-dev/base/unpack.ins
index e81c8dbfa82..d0501f57736 100644
--- a/Master/texmf-dist/source/latex-dev/base/unpack.ins
+++ b/Master/texmf-dist/source/latex-dev/base/unpack.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright (C) 1993-2024
+%% Copyright (C) 1993-2025
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
diff --git a/Master/texmf-dist/source/latex-dev/base/utf8ienc.dtx b/Master/texmf-dist/source/latex-dev/base/utf8ienc.dtx
index a2701ac5c87..25e6d8bf4c2 100644
--- a/Master/texmf-dist/source/latex-dev/base/utf8ienc.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/utf8ienc.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/Master/texmf-dist/source/latex-dev/firstaid/firstaid.ins b/Master/texmf-dist/source/latex-dev/firstaid/firstaid.ins
index 5de510ba513..656ecf395f9 100644
--- a/Master/texmf-dist/source/latex-dev/firstaid/firstaid.ins
+++ b/Master/texmf-dist/source/latex-dev/firstaid/firstaid.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright (C) 2020-2024
+%% Copyright (C) 2020-2025
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -44,7 +44,7 @@ reports for it can be opened at https://latex-project.org/bugs/
(but please observe conditions on bug reports sent to that address!)
-Copyright (C) 2020-2024
+Copyright (C) 2020-2025
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/Master/texmf-dist/source/latex-dev/firstaid/latex2e-first-aid-for-external-files.dtx b/Master/texmf-dist/source/latex-dev/firstaid/latex2e-first-aid-for-external-files.dtx
index 7b26705bf25..98efb23eb1c 100644
--- a/Master/texmf-dist/source/latex-dev/firstaid/latex2e-first-aid-for-external-files.dtx
+++ b/Master/texmf-dist/source/latex-dev/firstaid/latex2e-first-aid-for-external-files.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-%% File: latex2e-first-aid-for-external-files.dtx (C) Copyright 2020-2024
+%% File: latex2e-first-aid-for-external-files.dtx (C) Copyright 2020-2025
%%
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
@@ -111,8 +111,8 @@
% \end{macrocode}
%
% \begin{macrocode}
-\def\LaTeXFirstAidDate{2024/11/24}
-\def\LaTeXFirstAidVersion{v1.1j}
+\def\LaTeXFirstAidDate{2025/02/16}
+\def\LaTeXFirstAidVersion{v1.1m}
% \end{macrocode}
%
% \begin{macrocode}
@@ -134,7 +134,8 @@
% \begin{macrocode}
\ExplSyntaxOn
\cs_new:Npn\FirstAidNeededT#1#2#3{
- \exp_args:Ncx\str_if_eq:onF{ver@#1.#2}{#3}
+ \exp_args:Ncx\str_if_eq:onTF{ver@#1.#2}{#3}
+ { \typeout{==>~ First~ Aid~ for~ #1.#2~ applied! } }
{ \typeout{==>~ First~ Aid~ for~ #1.#2~ no~ longer~ applied!^^J
\@spaces Expected:^^J
\@spaces\@spaces #3^^J
@@ -330,7 +331,7 @@
%
% \begin{macrocode}
\ExplSyntaxOn
-\AddToHook{file/pgfpages.sty/after}[firstaid]{%
+\AddToHook{file/pgfpages.sty/after}[firstaid]{
% \end{macrocode}
% Undo overwriting \cs{shipout}:
% \begin{macrocode}
@@ -778,6 +779,7 @@
}
% \end{macrocode}
%
+%
% \begin{macrocode}
%</kernel>
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex-dev/graphics/color.dtx b/Master/texmf-dist/source/latex-dev/graphics/color.dtx
index b14c148f2f9..a35d6f6e964 100644
--- a/Master/texmf-dist/source/latex-dev/graphics/color.dtx
+++ b/Master/texmf-dist/source/latex-dev/graphics/color.dtx
@@ -2,7 +2,7 @@
% \iffalse
%
%% color.dtx Copyright (C) 1994--1999 David Carlisle
-%% Copyright (C) 2005-2024 LaTeX Project
+%% Copyright (C) 2005-2025 LaTeX Project
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -21,7 +21,7 @@
%<driver> \ProvidesFile{color.drv}
% \fi
% \ProvidesFile{color.dtx}
- [2024/06/23 v1.3e Standard LaTeX Color (DPC)]
+ [2025/01/14 v1.3e Standard LaTeX Color (DPC)]
%
% \iffalse
%<*driver>
@@ -458,7 +458,9 @@
% specified colour, but then the colour reverts to its previous value.
% The naming is by analogy with |\textrm| (as opposed to |\rm| and
% |\rmfamily|) although it is slightly a misnomer as the command also
-% works in math-mode.
+% works in math-mode. In contrast to |\textrm|, the command gobbles spaces
+% at the begin of its argument, so |Hello\textcolor{red}{ World}| will
+% output Hello\textcolor{red}{ World}.
%
% Since December 95, in fact this command has one other difference
% from |\color|. It calls |\leavevmode| to ensure the start of
diff --git a/Master/texmf-dist/source/latex-dev/graphics/drivers.dtx b/Master/texmf-dist/source/latex-dev/graphics/drivers.dtx
index fb5132272b9..bfa42f46f73 100644
--- a/Master/texmf-dist/source/latex-dev/graphics/drivers.dtx
+++ b/Master/texmf-dist/source/latex-dev/graphics/drivers.dtx
@@ -3,7 +3,7 @@
%
%% drivers.dtx Copyright (C) 1994 David Carlisle Sebastian Rahtz
%% Copyright (C) 1995 1996 1997 1998 1999 David Carlisle
-%% Copyright (C) 2000-2024 LaTeX Project
+%% Copyright (C) 2000-2025 LaTeX Project
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
diff --git a/Master/texmf-dist/source/latex-dev/graphics/epsfig.dtx b/Master/texmf-dist/source/latex-dev/graphics/epsfig.dtx
index 46dc36d0bf8..13e59b25b19 100644
--- a/Master/texmf-dist/source/latex-dev/graphics/epsfig.dtx
+++ b/Master/texmf-dist/source/latex-dev/graphics/epsfig.dtx
@@ -2,7 +2,7 @@
% \iffalse
%
%% epsfig.dtx Copyright (C) 1994-1996 1999 Sebastian Rahtz
-%% Copyright (C) 2000-2024 LaTeX Project
+%% Copyright (C) 2000-2025 LaTeX Project
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
diff --git a/Master/texmf-dist/source/latex-dev/graphics/graphics.dtx b/Master/texmf-dist/source/latex-dev/graphics/graphics.dtx
index 86556ea40ac..03e3157da8a 100644
--- a/Master/texmf-dist/source/latex-dev/graphics/graphics.dtx
+++ b/Master/texmf-dist/source/latex-dev/graphics/graphics.dtx
@@ -2,7 +2,7 @@
% \iffalse
%
%% graphics.dtx Copyright (C) 1994 David Carlisle Sebastian Rahtz
-%% Copyright (C) 1995-2024 LaTeX Project
+%% Copyright (C) 1995-2025 LaTeX Project
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
diff --git a/Master/texmf-dist/source/latex-dev/graphics/graphicx.dtx b/Master/texmf-dist/source/latex-dev/graphics/graphicx.dtx
index 92f1af1d396..0dc0bfe1987 100644
--- a/Master/texmf-dist/source/latex-dev/graphics/graphicx.dtx
+++ b/Master/texmf-dist/source/latex-dev/graphics/graphicx.dtx
@@ -2,7 +2,7 @@
% \iffalse
%
%% graphicx.dtx Copyright (C) 1994 David Carlisle Sebastian Rahtz
-%% Copyright (C) 1995-2024 LaTeX Project
+%% Copyright (C) 1995-2025 LaTeX Project
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -19,7 +19,7 @@
%<driver> \ProvidesFile{graphicx.drv}
% \fi
% \ProvidesFile{graphicx.dtx}
- [2021/09/16 v1.2d Enhanced LaTeX Graphics (DPC,SPQR)]
+ [2024/12/31 v1.2e Enhanced LaTeX Graphics (DPC,SPQR)]
%
% \iffalse
%<*driver>
@@ -170,7 +170,10 @@
% \item[page] The page of a multi-page PDF graphic to be used.
% \item[interpolate] Enables interpolation of bitmap images by viewers.
% \item[pagebox] Specifies which PDF box should be used for the natural image size, one of
-% mediabox, cropbox, bleedbox, trimbox, artbox. The default is driver-specific.
+% mediabox, cropbox, bleedbox, trimbox, artbox. The default is driver-specific.
+% \item[alt] Alternative text in accessibility uses.
+% \item[actualtext] ActualText text in accessibility uses.
+% \item[artifact] Boolean to mark graphics as an artifact in accessibility uses.
% \end{description}
%
% The arguments are interpreted left to right. |clip|, |draft|, |bb|,,
@@ -566,7 +569,7 @@
% \end{key}
%
% \begin{key}{Gin}{alt}
-% \changes{v1.2d}{2021/09/16 }{alt key gh/651}
+% \changes{v1.2d}{2021/09/16}{alt key gh/651}
% By default the |alt| key does nothing but may be used
% for alternative text for accessibility uses in extensions.
% \begin{macrocode}
@@ -574,6 +577,25 @@
% \end{macrocode}
% \end{key}
%
+% \begin{key}{Gin}{actualtext}
+% \changes{v1.2e}{2024/12/31}{actualtext key gh/1552}
+% By default the |actualtext| key does nothing but may be used
+% for ActualText text for accessibility uses in extensions.
+% \begin{macrocode}
+\define@key{Gin}{actualtext}{}
+% \end{macrocode}
+% \end{key}
+%
+% \begin{key}{Gin}{artifact}
+% \changes{v1.2e}{2024/12/31}{artifact key gh/1552}
+% By default the |artifact| key does nothing but may be used
+% to mark graphicas as an artifact for accessibility uses in extensions.
+% \begin{macrocode}
+\define@key{Gin}{artifact}[true]{%
+ \lowercase{\Gin@boolkey{#1}}{artifact}}
+% \end{macrocode}
+% \end{key}
+%
% \begin{macro}{\Gin@boolkey}
% Helper function for defining boolean valued functions. The order of
% arguments allows |\lowercase| to only act on the user-supplied
diff --git a/Master/texmf-dist/source/latex-dev/graphics/keyval.dtx b/Master/texmf-dist/source/latex-dev/graphics/keyval.dtx
index 02f9a15ec7c..7fecf57cd4f 100644
--- a/Master/texmf-dist/source/latex-dev/graphics/keyval.dtx
+++ b/Master/texmf-dist/source/latex-dev/graphics/keyval.dtx
@@ -1,7 +1,7 @@
%
% \iffalse
%% keyval.dtx Copyright (C) 1993 1994 1995 1997 1998 1999 David Carlisle
-%% Copyright (C) 2000-2024 David Carlisle, LaTeX Project
+%% Copyright (C) 2000-2025 David Carlisle, LaTeX Project
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
diff --git a/Master/texmf-dist/source/latex-dev/graphics/lscape.dtx b/Master/texmf-dist/source/latex-dev/graphics/lscape.dtx
index eca5aa432bd..547d4372065 100644
--- a/Master/texmf-dist/source/latex-dev/graphics/lscape.dtx
+++ b/Master/texmf-dist/source/latex-dev/graphics/lscape.dtx
@@ -2,7 +2,7 @@
% \iffalse
%
%% lscape.dtx Copyright (C) 1994 1999-2000 David Carlisle
-%% Copyright (C) 2000-2024 LaTeX Project
+%% Copyright (C) 2000-2025 LaTeX Project
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
diff --git a/Master/texmf-dist/source/latex-dev/graphics/rotating.dtx b/Master/texmf-dist/source/latex-dev/graphics/rotating.dtx
index bac5759956a..a1ca1c8c82c 100644
--- a/Master/texmf-dist/source/latex-dev/graphics/rotating.dtx
+++ b/Master/texmf-dist/source/latex-dev/graphics/rotating.dtx
@@ -5,7 +5,7 @@
% File: rotating.dtx
%% Copyright (C) 1995-1999 Sebastian Rahtz and Leonor Barroca
%% Copyright (C) 2001-2003,2007-2009 Robin Fairbairns
-%% Copyright (C) 2016-2024 LaTeX Project
+%% Copyright (C) 2016-2025 LaTeX Project
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%
@@ -30,7 +30,7 @@
\ProvidesFile{rotating.dtx}%
%</dtx>
%<package>\ProvidesPackage{rotating}%
- [2016/08/11 v2.16d
+ [2025/01/14 v2.16e
%<package> rotated objects in LaTeX%
%<*dtx>
rotating package source file%
@@ -257,8 +257,12 @@
% \section{Turning and rotation environments}
% \begin{macro}{sideways}
% Environment to turn the contents through 90 degrees.
+% \changes{v2.16e}{2025/01/14}{add \cs{leavevmode} for tagging support}
+% \cs{Grot@box} issues a \cs{leavevmode} but for tagging (when using lualatex)
+% this is too late, it should happen before the box is set.
% \begin{macrocode}
\def\sideways{%
+ \leavevmode
\Grot@setangle{90}%
\setbox\z@\color@hbox\ignorespaces}
\def\endsideways{%
@@ -272,8 +276,10 @@
%
% \begin{macro}{turn}
% Rotate the contents of the environment, leaving the appropriate space
+% \changes{v2.16e}{2025/01/14}{add \cs{leavevmode} for tagging support}
% \begin{macrocode}
\def\turn#1{%
+ \leavevmode
\Grot@setangle{#1}%
\setbox\z@\color@hbox\ignorespaces}
\def\endturn{%
@@ -286,8 +292,10 @@
% \end{macro}
% \begin{macro}{rotate}
% Rotate the contents of the environment, leaving \emph{no space}.
+% \changes{v2.16e}{2025/01/14}{add \cs{leavevmode} for tagging support}
% \begin{macrocode}
\def\rotate#1{%
+ \leavevmode
\Grot@setangle{#1}%
\setbox\z@\color@hbox\ignorespaces}
\def\endrotate{%
@@ -301,8 +309,10 @@
% \end{macro}
% \begin{macro}{\turnbox}
% A macro version of the `rotate' environment.
+% \changes{v2.16e}{2025/01/14}{add \cs{leavevmode} for tagging support}
% \begin{macrocode}
\def\turnbox#1#2{%
+ \leavevmode
\Grot@setangle{#1}%
% \end{macrocode}
% Note: grouping within the box makes \cs{color@hbox} unnecessary, I think.
@@ -350,9 +360,13 @@
% \end{macrocode}
% Set the float contents in
% a box of width \cs{textheight} instead of \cs{columnwidth}.
+% \changes{v2.16e}{2025/01/14}{correct tagging of the minipage}
% \begin{macrocode}
\begin{lrbox}\rot@float@box
+ \SuspendTagging{\minipage}%
\begin{minipage}\textheight
+ \ResumeTagging{\minipage}%
+ \UseTaggingSocket{para/restore}%
}
% \end{macrocode}
% \end{macro}
@@ -372,7 +386,10 @@
% we need to use the a variant \cs{pageref} mechanism and our own
% specialised labels.
% \begin{macrocode}
- \end{minipage}\end{lrbox}%
+ \par\SuspendTagging{\minipage}%
+ \end{minipage}%
+ \ResumeTagging{\minipage}%
+ \end{lrbox}%
\stepcounter{r@tfl@t}%
\rot@label{RF\ther@tfl@t}%
\rot@pageref{RF\ther@tfl@t}{\R@@page}%
diff --git a/Master/texmf-dist/source/latex-dev/graphics/trig.dtx b/Master/texmf-dist/source/latex-dev/graphics/trig.dtx
index d2fa91f91f7..ebbcb7598b2 100644
--- a/Master/texmf-dist/source/latex-dev/graphics/trig.dtx
+++ b/Master/texmf-dist/source/latex-dev/graphics/trig.dtx
@@ -1,6 +1,6 @@
% \iffalse
%% File: trig.dtx Copyright (C) 1993-1999 David Carlisle
-%% Copyright (C) 2000-2024 LaTeX Project
+%% Copyright (C) 2000-2025 LaTeX Project
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
diff --git a/Master/texmf-dist/source/latex-dev/latex-lab/documentmetadata-support.dtx b/Master/texmf-dist/source/latex-dev/latex-lab/documentmetadata-support.dtx
index 6752e8098ae..9d83f35b9e6 100644
--- a/Master/texmf-dist/source/latex-dev/latex-lab/documentmetadata-support.dtx
+++ b/Master/texmf-dist/source/latex-dev/latex-lab/documentmetadata-support.dtx
@@ -1,7 +1,7 @@
% \iffalse meta-comment
%
%% File: documentmetadata-support.dtx
-% Copyright (C) 2021-2024 The LaTeX Project
+% Copyright (C) 2021-2025 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
@@ -18,8 +18,8 @@
% for those people who are interested or want to report an issue.
%
% \begin{macrocode}
-\def\documentmetadatasupportversion{1.0j}
-\def\documentmetadatasupportdate{2024-09-13}
+\def\documentmetadatasupportversion{1.0m}
+\def\documentmetadatasupportdate{2025-02-17}
% \end{macrocode}
%
%
@@ -68,7 +68,7 @@
% is easier to update it without the need to build a full \LaTeX{}
% release. Over time the functionality will move fully into the
% kernel.
-%
+%
% \cs{DocumentMetadata} also loads and activates
% the new PDF management code from \pkg{pdfmanagement-testphase}.
% As this forces the loading of the \pkg{l3backend} files, a backend
@@ -85,12 +85,12 @@
% project~\cite{blueprint}.
%
% \section{The \cs{DocumentMetadata} command}
-%
+%
% \begin{function}{\DocumentMetadata}
% \begin{syntax}
% \cs{DocumentMetadata}\Arg{key-value list}
% \end{syntax}
-%
+%
% The command should be used as the first command in a document, before
% \cs{documentclass}. It takes a key-value argument.
% \end{function}
@@ -137,37 +137,40 @@
% The |u| variants do not enforce unicode,
% but they will pass the information to hyperref. The |a| variants
% do \emph{not} enforce (or even test) a tagged pdf yet.
-%
-% Starting with version 0.95s of \pkg{pdfmanagement-testphase}
-% it is also possible to use the values
-% |X-4|, |X-4p|, |X-5g|, |X-5n|, |X-5pg|, |X-6|, |X-6n|, |X-6p|, |UA-1| for
-% a PDF/X and PDF/UA standard. These keys currently set \emph{only} the relevant
-% XMP-metadata. In version 0.95z support for |UA-2| has been added but
-% note that |UA-2| hasn't been released yet. It should be used only together
-% with pdf version 2.0.
+%
+% Beside the A-standards it is also possible to use the values
+% |X-4|, |X-4p|, |X-5g|, |X-5n|, |X-5pg|, |X-6|, |X-6n|, |X-6p| for
+% a PDF/X and |UA-1| and |UA-2| for PDF/UA standard.
+% |UA-2| should only be used together with PDF 2.0.
+% Currently these keys set \emph{only} the relevant XMP-metadata.
+% They do not validate or enforce special requirements
+% (e.g., the |UA| standards do not automatically activate tagging).
%
% |pdfstandard| can be used more than once to set overlapping standards, e.g:\\
% |pdfstandard=A-2b,pdfstandard=X-4,pdfstandard=UA-1|
-%
+%
% If XMP-metadata are added (see the following key \texttt{xmp})
-% the needed conformance marker for the standards are set.
-%
+% the necessary conformance markers for the standards are set.
+%
% More information can be found in the documentation
-% of \pkg{l3pdfmeta}.
+% of \pkg{l3pdfmeta}.
%
% \item[\texttt{xmp}] A boolean, if set to false no XMP metadata are added to the PDF.
% The initial value is true. Details are described in the documentation of \pkg{l3pdfmeta}.
-%
+%
% \item[\texttt{colorprofiles}] This allows to load icc-colorprofiles. Details
% are described in the documentation of \pkg{l3pdfmeta}.
%
-% \item[\texttt{testphase}] This key is used to load testphase code.
+% \item[\texttt{testphase}] This key is used to load testphase code.
% The |testphase| key can only be used in the first \cs{DocumentMetadata}.
% The values it accepts and their effect will change over time, when testphase packages are added or
% removed or when the code is moved into the kernel. The key accepts a list of values
% and it can be used more than once.
-%
-% The \texttt{phase} key bundle testphase modules. They also all activate tagging.
+%
+% The value \texttt{latest} loads all modules that we recommend
+% so that it is not necessary to specify individual modules.
+%
+% The \texttt{phase} keys bundle testphase modules. They also all activate tagging.
% \begin{description}
% \item[\texttt{phase-I}]
% This value loads code implementing the first phase of the project~\cite{blueprint}, i.e., it
@@ -183,37 +186,37 @@
% This is the current development phase.
% It differs from \texttt{phase-II} \emph{a lot}: It will
% load new code for the tagging of lists, sectioning commands,
-% table of contents and similar lists, graphics, minipages and floats.
-% As it redefines many internals it is currently restricted to the use of
-% standard classes (article, report, and book)
-% and it supports only a limited number of add-on packages.
+% table of contents and similar lists, graphics, minipages and floats.
+% As it redefines many internals it is currently restricted to the use of
+% standard classes (article, report, and book)
+% and it supports only a limited number of add-on packages.
% \end{description}
-%
+%
% The various testphase modules can also be loaded individually (at least in theory,
% there can be hidden dependencies). If loaded like this, the tagpdf package is not
% loaded and tagging is not activated! The list of modules will change over time.
-% \begin{description}
+% \begin{description}
% \item[\texttt{new-or-1}] This patches a few commands related
% to the output routine. The patches are needed for the tagging
-% of paragraphs, for the tagging of header and footer and
+% of paragraphs, for the tagging of header and footer and
% to allow the PDF management to insert code which avoids that
-% links happening at page breaks spills into the header and footer.
+% links happening at page breaks spills into the header and footer.
% This code is automatically loaded if the \texttt{testphase} values
-% \texttt{phase-I}, \texttt{phase-II} or \texttt{new-or} are used.%
-% \item[\texttt{new-or}] This loads more changes to the output routine required for the
-% tagging. It is not compatible with every class! The code is also loaded by the
+% \texttt{phase-I}, \texttt{phase-II} or \texttt{new-or} are used.%
+% \item[\texttt{new-or}] This loads more changes to the output routine required for the
+% tagging. It is not compatible with every class! The code is also loaded by the
% \texttt{phase-II} value.
% \item[\texttt{sec}] This adapts commands related to sectioning to make them tagging aware.
% The \texttt{sec} module is loaded by \texttt{phase-III}.
% \item[\texttt{toc}] This adapts commands related to the table of contents and
-% similar list to make them tagging aware. The \texttt{toc} module is loaded by \texttt{phase-III}.
+% similar list to make them tagging aware. The \texttt{toc} module is loaded by \texttt{phase-III}.
% \item[\texttt{graphic}] This enables tagging support for
-% the \cs{includegraphics} command and the \texttt{picture} environment.
+% the \cs{includegraphics} command and the \texttt{picture} environment.
% This code is also loaded by the \texttt{phase-III} key.
% \item[\texttt{block}] This reimplements lists and blocks environments and
% add tagging support.
% This code is also loaded by the \texttt{phase-III} key.
-% \item[\texttt{minipage}] This adds tagging support to \texttt{minipage}
+% \item[\texttt{minipage}] This adds tagging support to \texttt{minipage}
% and \cs{parbox}.
% This code is also loaded by the \texttt{phase-III} key.
% \item[\texttt{float}] This adds tagging support to floats.
@@ -230,16 +233,16 @@
% and \cs{author} commands to fill the XMP-metadata and set the window title.
% It is not compatible with packages and classes which redefine these commands
% too. The module is currently not loaded by any \texttt{phase} key.
-% \item[\texttt{math}] This adapts math for tagging. This is only a prototype.
-% The module is currently not loaded by any \texttt{phase} key.
-% \item[\texttt{table}] This provides basic tagging for
-% \texttt{tabular}, \texttt{longtable} and similar table environments.
-% The module is currently not loaded by any \texttt{phase} key. Its use and
-% restrictions is documented in \texttt{latex-lab-table.pdf}.%
+% \item[\texttt{math}] This adapts math for tagging. This is only a prototype.
+% The module is currently not loaded by any \texttt{phase} key.
+% \item[\texttt{table}] This provides basic tagging for
+% \texttt{tabular}, \texttt{longtable} and similar table environments.
+% The module is currently not loaded by any \texttt{phase} key. Its use and
+% restrictions is documented in \texttt{latex-lab-table.pdf}.%
% \item[\texttt{firstaid}] This contains small adjustments to external packages.
-% The module is currently not loaded by any \texttt{phase} key.
+% The module is currently not loaded by any \texttt{phase} key.
% \end{description}
-%
+%
%
% \item[\texttt{debug}] This key activates some debug options. It takes a list of key-values
% as value. Currently the following keys are known:
@@ -253,12 +256,12 @@
% related to them. More information can be found in the documentation of
% \pkg{pdfmanagement-firstaid}.
% \item[\texttt{xmp-export}] This will export the XMP-metadata to a file \verb+\jobname.xmpi+.
-% with \texttt{debug=\{xmp-export=filename\}} the file name can be changed.
+% with \texttt{debug=\{xmp-export=filename\}} the file name can be changed.
% More information can be found in the documentation of \pkg{l3pdfmeta} of the \pkg{pdfmanagement-testphase}
-% bundle.
+% bundle.
% \item[\texttt{tagpdf}] This loads the package tagpdf-debug which enhances
% various commands from tagpdf with additional debugging options. This can slow down
-% the compilation!
+% the compilation!
% \end{description}
% \end{description}
%
@@ -304,7 +307,7 @@
% \begin{macrocode}
\clist_if_exist:NF \g_@@_firstaidoff_clist
{ \clist_new:N \g_@@_firstaidoff_clist }
-% \end{macrocode}
+% \end{macrocode}
% \end{variable}
% \begin{variable}{\g_@@_testphase_tl}
% a tl to store the testphase loading code so that we can load them at
@@ -314,7 +317,7 @@
{ \tl_new:N \g_@@_testphase_tl }
% \end{macrocode}
% \end{variable}
-%
+%
% \subsection{Kernel changes with \cs{DocumentMetadata}}
% \begin{macro}{\@kernel@before@DocumentMetadata}
% \begin{macrocode}
@@ -329,7 +332,7 @@
% \end{macro}
% \subsection{\cs{DocumentMetadata}}
-%
+%
% \begin{macro}{\DocumentMetadata}
%
% \cs{DocumentMetadata} should not be used after
@@ -367,35 +370,38 @@
\file_input:n {l3backend-testphase-\c_sys_backend_str.def}
\ExplSyntaxOff\makeatother
% \end{macrocode}
-%
-% Process the init keys and setup the generic driver.
+% \changes{v1.0m}{2025/02/17}{Set PDF 2.0 as default}
% \begin{macrocode}
- \keys_set_filter:nnn { document / metadata } { init } { #1 }
+ \pdf_version_gset:n { 2.0 }
+% \end{macrocode}
+% Process the non-init keys and setup the generic driver.
+% \begin{macrocode}
+ \keys_set_exclude_groups:nnn { document / metadata } { init } { #1 }
\bool_if:NT \g_@@_active_bool
{
\PassOptionsToPackage{customdriver=hgeneric-testphase}{hyperref}
% \end{macrocode}
-% Finally we setup the language default.
+% Finally we setup the language default.
% This is done after the begindocument hook so that it can pick up settings
% from babel. If the Catalog dictionary already contains a lang value we do nothing,
% otherwise we use the value stored in \cs{BCPdata}, either the main language
-% (if its exists) or the fall back language.
+% (if its exists) or the fall back language.
% Note: if babel is loaded without a language this gives the language \texttt{und}.
-% \begin{macrocode}
+% \begin{macrocode}
\g@addto@macro\@kernel@after@begindocument
- {
+ {
\pdfdict_get:nnN {g__pdf_Core/Catalog}{Lang}\l_@@_tmpa_tl
- \quark_if_no_value:NT\l_@@_tmpa_tl
+ \quark_if_no_value:NT\l_@@_tmpa_tl
{
\tl_if_empty:eTF { \BCPdata{main.language} }
{ \tl_set:Ne \l_@@_tmpb_tl { \BCPdata{language} } }
{ \tl_set:Ne \l_@@_tmpb_tl { \BCPdata{main.language} } }
\msg_warning:nne { meta } { lang-missing }{ \l_@@_tmpb_tl }
\exp_last_unbraced:Ne
- \AddToDocumentProperties{[document]{lang}{\l_@@_tmpb_tl}}
- \pdfmanagement_add:nne {Catalog} {Lang}{(\l_@@_tmpb_tl)}
+ \AddToDocumentProperties{[document]{lang}{\l_@@_tmpb_tl}}
+ \pdfmanagement_add:nne {Catalog} {Lang}{(\l_@@_tmpb_tl)}
}
- }
+ }
}
% \end{macrocode}
% \cs{pdfmanagement_add:nnn} has collected values in this hook.
@@ -409,7 +415,7 @@
% \begin{macrocode}
\cs_set_protected:Npn \DocumentMetadata ##1
{
- \keys_set_filter:nnn { document / metadata } { init } { ##1 }
+ \keys_set_exclude_groups:nnn { document / metadata } { init } { ##1 }
\str_remove_all:cn {opt@hyperref.sty}{customdriver=hgeneric-testphase}
\bool_if:NT \g__pdfmanagement_active_bool
{
@@ -428,6 +434,7 @@
% \end{macro}
%\subsection{\cs{DocumentMetadata} keys}
+%\changes{1.0k}{2024-12-17}{added latest value for testphase key.}
% \begin{macrocode}
\keys_define:nn { document / metadata }
{
@@ -466,41 +473,32 @@
,_pdfstandard .choices:nn =
{A-1B,A-2A,A-2B,A-2U,A-3A,A-3B,A-3U,A-4}
{
- \prop_if_exist:cT { g__pdfmeta_standard_pdf/#1_prop }
- {
- \prop_gset_eq:Nc \g__pdfmeta_standard_prop { g__pdfmeta_standard_pdf/#1 _prop }
- }
+ \prop_gset_eq:Nc \g__pdfmeta_standard_prop { g__pdfmeta_standard_pdf/#1 _prop }
\AddToDocumentProperties [document]{pdfstandard}{#1}
}
- ,_pdfstandard / A-4F .code:n =
+ ,_pdfstandard / A-4F .code:n =
{
- \prop_if_exist:cTF { g__pdfmeta_standard_pdf/A-4F_prop }
- {
- \prop_gset_eq:Nc \g__pdfmeta_standard_prop { g__pdfmeta_standard_pdf/A-4F_prop }
- }
- {
- \prop_gset_eq:Nc \g__pdfmeta_standard_prop { g__pdfmeta_standard_pdf/A-4_prop }
- \prop_gput:Nnn \g__pdfmeta_standard_prop{conformance}{F}
- }
+ \prop_gset_eq:Nc \g__pdfmeta_standard_prop { g__pdfmeta_standard_pdf/A-4F_prop }
\AddToDocumentProperties [document]{pdfstandard}{A-4F}
}
- ,_pdfstandard / A-4E .code:n =
+ ,_pdfstandard / A-4E .code:n =
{
- \prop_if_exist:cTF { g__pdfmeta_standard_pdf/A-4E_prop }
- {
- \prop_gset_eq:Nc \g__pdfmeta_standard_prop { g__pdfmeta_standard_pdf/A-4E_prop }
- }
- {
- \prop_gset_eq:Nc \g__pdfmeta_standard_prop { g__pdfmeta_standard_pdf/A-4_prop }
- \prop_gput:Nnn \g__pdfmeta_standard_prop{conformance}{E}
- }
+ \prop_gset_eq:Nc \g__pdfmeta_standard_prop { g__pdfmeta_standard_pdf/A-4E_prop }
\AddToDocumentProperties [document]{pdfstandard}{A-4E}
- }
+ }
,_pdfstandard / unknown .code:n =
{
\msg_error:nnn{pdf}{unknown-standard}{#1}
}
,testphase .multichoice:
+ ,testphase / latest .code:n =
+ {
+ \keys_set:nn
+ {document / metadata}
+ {testphase={phase-III,title,table,math,firstaid}}
+ \msg_note:nnn { meta } { testphase-latest-loading }
+ { phase-III,~title,~table,~math,~firstaid }
+ }
,testphase / tagpdf .code:n =
{
\tl_gput_right:Nn\g_@@_testphase_tl
@@ -568,7 +566,7 @@
{
\RequirePackage{tagpdf-debug}
}
- }
+ }
,debug / uncompress .code:n =
{
\pdf_uncompress:
@@ -596,9 +594,14 @@
}
\msg_new:nnn { meta } { lang-missing }
{
- The~language~has~not~been~set~in~\token_to_str:N
+ The~language~has~not~been~set~in~\token_to_str:N
\DocumentMetadata.\\Setting~it~to~'#1'~as~fallback.
- }
+ }
+\msg_new:nnn { meta } { testphase-latest-loading }
+ {
+ Loading~testphase~modules\\
+ #1
+ }
% \end{macrocode}
%
% \begin{macrocode}
diff --git a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-amsmath.dtx b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-amsmath.dtx
index 8591b39b392..3c9b8585a40 100644
--- a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-amsmath.dtx
+++ b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-amsmath.dtx
@@ -2,7 +2,7 @@
%
%% File: latex-lab-amsmath.dtx
%
-% Copyright (C) 2022-2024 The LaTeX Project
+% Copyright (C) 2022-2025 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
@@ -48,15 +48,16 @@
%
% \section{Introduction}
%
-% This file implements adaptations to the \pkg{amsmath} package needed for
-% the tagging project.
+% This file implements adaptations to the \pkg{amsmath} package needed for
+% the tagging project.
%
% \MaybeStop{\setlength\IndexMin{200pt} \PrintIndex }
%
% \section{The Implementation}
%
+% Better no @@ expansion here \ldots ...
% \begin{macrocode}
-%<@@=math>
+%<@@=>
% \end{macrocode}
%
% \begin{macrocode}
@@ -66,7 +67,7 @@
% \subsection{File declaration}
% \begin{macrocode}
\ProvidesFile{latex-lab-amsmath.ltx}
- [2024-09-18 v0.1c amsmath adaptions]
+ [2025-01-31 v0.1e amsmath adaptions]
% \end{macrocode}
% \subsection{Tagpdf support}
% To make the code independent from tagging being loaded and active
@@ -75,87 +76,958 @@
% \begin{macrocode}
\RequirePackage{tagpdf-base}
% \end{macrocode}
-%
+%
% \begin{macrocode}
\ExplSyntaxOn
% \end{macrocode}
%
+% \subsection{Measuring}
+% When measuring we neither want tagging nor the luamml processing.
+% \begin{macro}{\measuring@true}
+% \begin{macrocode}
+\def\measuring@true{\let\ifmeasuring@\iftrue\tag_suspend:n{\measuring}\luamml_ignore:}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Display environments}
+% \changes{0.1e}{2025-01-31}{moved redefinitions from latex-lab-math and luamml into this file}
+%
+% \subsubsection{Tag}
+% The tag/label must be saved, so that it can be reinserted later.
+%
+% TODO: \cs{maketag@@@} is perhaps used in places where tagging/luamml handling
+% is not wanted. This must be checked and handled.
+% \begin{macro}{\maketag@@@}
+% \begin{macrocode}
+\def\maketag@@@#1
+ {%
+ \ifmeasuring@
+ \hbox{\m@th\normalfont#1}%
+ \else
+ \UseTaggingSocket{math/display/tag/begin}
+ \hbox{\m@th\normalfont#1
+ \UseTaggingSocket{math/luamml/mtable/tag/save}
+ }%
+ \UseTaggingSocket{math/display/tag/end}
+ \fi
+ }
+% \end{macrocode}
+% \end{macro}
+% \cs{eqref} uses \cs{tagform@} and so \cs{maketag@@@} but we do not want this tagging
+% there.
+%
+% \begin{macro}{\eqref}
+% \begin{macro}{\maketag@@@notog}
+% \begin{macrocode}
+\def\maketag@@@notag#1{\hbox{\m@th\normalfont#1}}
+\DeclareRobustCommand{\eqref}[1]
+ {\textup{\let\maketag@@@\maketag@@@notag\tagform@{\ref{#1}}}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsubsection{align \& friends}
+%
+% Most display environment uses a common command for the end which contains
+% the luamml socket to finalize the mtable.
+% \begin{macro}{\common@align@ending}
+% \begin{macrocode}
+\def\common@align@ending {
+ \math@cr \black@\totwidth@
+ \UseExpandableTaggingSocket {math/luamml/mtable/finalize} {align}
+ \egroup
+ \ifingather@
+ \restorealignstate@
+ \egroup
+ \nonumber
+ \ifnum0=`{\fi\iffalse}\fi
+ \else
+ $$%
+ \fi
+ \ignorespacesafterend
+}
+% \end{macrocode}
+% \end{macro}
+% Now we redefine the display alignments to use these ending.
+% \begin{macrocode}
+\renewenvironment{align}{%
+ \start@align\@ne\st@rredfalse\m@ne
+}{%
+ \common@align@ending
+}
+\renewenvironment{align*}{%
+ \start@align\@ne\st@rredtrue\m@ne
+}{%
+ \common@align@ending
+}
+\renewenvironment{alignat}{%
+ \start@align\z@\st@rredfalse
+}{%
+ \common@align@ending
+}
+\renewenvironment{alignat*}{%
+ \start@align\z@\st@rredtrue
+}{%
+ \common@align@ending
+}
+\renewenvironment{flalign}{%
+ \start@align\tw@\st@rredfalse\m@ne
+}{%
+ \common@align@ending
+}
+\renewenvironment{flalign*}{%
+ \start@align\tw@\st@rredtrue\m@ne
+}{%
+ \common@align@ending
+}
+\renewenvironment{xalignat}{%
+ \start@align\@ne\st@rredfalse
+}{%
+ \common@align@ending
+}
+\renewenvironment{xalignat*}{%
+ \start@align\@ne\st@rredtrue
+}{%
+ \common@align@ending
+}
+\renewenvironment{xxalignat}{%
+ \start@align\tw@\st@rredtrue
+}{%
+ \common@align@ending
+}
+% \end{macrocode}
+%
+% And register these environments for the math grabbing.
+% \begin{macrocode}
+ \math_register_halign_env:nn {align}{}
+ \math_register_halign_env:nn {align*}{}
+ \math_register_halign_env:nn {alignat}{}
+ \math_register_halign_env:nn {alignat*}{}
+ \math_register_halign_env:nn {flalign}{}
+ \math_register_halign_env:nn {flalign*}{}
+ \math_register_halign_env:nn {xalignat}{}
+ \math_register_halign_env:nn {xalignat*}{}
+ \math_register_halign_env:nn {xxalignat}{}
+% \end{macrocode}
+%
+% The align preamble (used in \cs{align@}) needs code for luamml
+% to save the cells.
+% \begin{macro}{\align@preamble}
+% \begin{macrocode}
+\def\align@preamble{%
+ &\hfil
+ \strut@
+ \setboxz@h
+ {
+ \@lign
+ $
+ \m@th\displaystyle{##}
+ \ifmeasuring@
+ \luamml_ignore:
+ \else
+ \UseTaggingSocket{math/luamml/save/nNn}{ {} \displaystyle {mtd} }
+ \fi
+ $
+ }%
+ \ifmeasuring@
+ \savefieldlength@
+ \else
+ \UseTaggingSocket{math/luamml/mtable/finalizecol}{box}
+ \fi
+ \set@field
+ \tabskip\z@skip
+ &\setboxz@h
+ {
+ \@lign
+ $
+ \m@th\displaystyle{{}##}
+ \ifmeasuring@
+ \luamml_ignore:
+ \else
+ \UseTaggingSocket{math/luamml/save/nNn}{ {} \displaystyle {mtd} }
+ \fi
+ $
+ }%
+ \ifmeasuring@
+ \savefieldlength@
+ \else
+ \UseTaggingSocket{math/luamml/mtable/finalizecol}{box}
+ \fi
+ \set@field
+ \hfil
+ \tabskip\alignsep@
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\math@cr@@@align}
+% \begin{macrocode}
+\def\math@cr@@@align{%
+ \ifst@rred\nonumber\fi
+ \if@eqnsw \global\tag@true \fi
+ \global\advance\row@\@ne
+ \add@amps\maxfields@
+ \omit
+ \kern-\alignsep@
+ \iftag@
+ \setboxz@h{\@lign\strut@{\make@display@tag}}%
+ \place@tag
+ \fi
+ \UseTaggingSocket{math/luamml/mtable/tag/set}
+ \ifst@rred\else\global\@eqnswtrue\fi
+ \global\lineht@\z@
+ \cr
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{\texttt{gather} and \texttt{gather*}}
+%
+% \begin{macro}{\gather@}
+% \begin{macrocode}
+\def\gather@#1{%
+ \ingather@true \let\split\insplit@
+ \let\tag\tag@in@align \let\label\label@in@display
+ \chardef\dspbrk@context\z@
+ \intertext@ \displ@y@ \Let@
+ \let\math@cr@@@\math@cr@@@gather
+ \gmeasure@{#1}%
+ \global\shifttag@false
+ \tabskip\z@skip
+ \global\row@\@ne
+ \halign to\displaywidth\bgroup
+ \strut@
+ \setboxz@h
+ {
+ $\m@th\displaystyle{##}
+ \UseTaggingSocket{math/luamml/save/nNn}{ {} \displaystyle {mtd} }
+ $
+ }%
+ \UseTaggingSocket{math/luamml/mtable/finalizecol}{box}
+ \calc@shift@gather
+ \set@gather@field
+ \tabskip\@centering
+ &\setboxz@h{\strut@{##}}%
+ \place@tag@gather
+ \UseTaggingSocket{math/luamml/mtable/tag/set}
+ \tabskip \iftagsleft@ \gdisplaywidth@ \else \z@skip \span\fi
+ \crcr
+ #1%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\endgather}
+% \begin{macrocode}
+\def\endgather{
+ \math@cr
+ \black@ \totwidth@
+ \UseExpandableTaggingSocket{math/luamml/mtable/finalize} {gather}
+ \egroup
+ $$
+ \ignorespacesafterend
+}
+% \end{macrocode}
+% \end{macro}
+%
+% The original definition of \texttt{gather*} uses \cs{endgather}
+% but this redirection doesn't work if we alter \texttt{gather} so we use
+% the real meaning and add the socket.
+% \begin{environment}{gather*}
+% \begin{macrocode}
+\renewenvironment{gather*}
+ {
+ \start@gather\st@rredtrue
+ }
+ {
+ \math@cr
+ \black@\totwidth@
+ \UseExpandableTaggingSocket{math/luamml/mtable/finalize} {gather}
+ \egroup
+ $$\ignorespacesafterend
+ }
+% \end{macrocode}
+% \end{environment}
+%
+% Register both environments
+% \begin{macrocode}
+\math_register_halign_env:nn {gather}{}
+\math_register_halign_env:nn {gather*}{}
+% \end{macrocode}
+%
+% \subsubsection{gathered, aligned and alignedat}
+% These environments are not grabbed as they are inside other display
+% environments but they need various sockets for luamml support.
+% \begin{macro}{\start@aligned}
+% \begin{macrocode}
+\renewcommand{\start@aligned}[2]{
+ \RIfM@
+ \else
+ \nonmatherr@ {\begin{\@currenvir}}
+ \fi
+ \savecolumn@ % Assumption: called inside a group
+ \UseTaggingSocket{math/luamml/annotate/false}{}{ \alignedspace@left }
+ \ams@start@box {#1} \bgroup
+ \maxfields@ #2 \relax
+ \ifnum \maxfields@ > \m@ne
+ \multiply \maxfields@ \tw@
+ \let \math@cr@@@ \math@cr@@@alignedat
+ \alignsep@ \z@skip
+ \else
+ \let \math@cr@@@ \math@cr@@@aligned
+ \alignsep@ \minalignsep
+ \fi
+ \Let@ \chardef \dspbrk@context \@ne
+ \default@tag
+ \spread@equation % no-op if already called
+ \global \column@ \z@
+ \ialign \bgroup
+ & \column@plus
+ \hfil
+ \strut@
+ $
+ \m@th
+ \displaystyle
+ {##}
+ \UseTaggingSocket{math/luamml/save/nNn}{ {} \displaystyle {mtd} }
+ $
+ \UseTaggingSocket{math/luamml/mtable/finalizecol}{last}
+ \tabskip \z@skip
+ & \column@plus
+ $
+ \m@th
+ \displaystyle
+ {
+ {}
+ ##
+ }
+ \UseTaggingSocket{math/luamml/save/nNn}{ {} \displaystyle {mtd} }
+ $
+ \UseTaggingSocket{math/luamml/mtable/finalizecol}{last}
+ \hfil
+ \tabskip\alignsep@
+ \crcr
+ \ams@return@opt@arg
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{gathered}
+% \begin{macrocode}
+\renewenvironment{gathered}[1][c]{%
+ \RIfM@\else
+ \nonmatherr@{\begin{gathered}}%
+ \fi
+% \end{macrocode}
+% This annotates the space
+% \begin{macrocode}
+ \UseTaggingSocket{ math/luamml/annotate/false } {}{ \alignedspace@left }
+ \ams@start@box{#1}\bgroup
+ \Let@ \chardef\dspbrk@context\@ne \restore@math@cr
+ \spread@equation
+ \ialign\bgroup
+ \hfil\strut@$\m@th\displaystyle##
+% \end{macrocode}
+% This save the cell and then finalize it.
+% \begin{macrocode}
+ \UseTaggingSocket{math/luamml/save/nNn}{ {} \displaystyle {mtd} }
+ $
+ \UseTaggingSocket{math/luamml/mtable/finalizecol}{last}
+ \hfil
+ \crcr
+ \ams@return@opt@arg
+}{%
+ \endaligned
+}
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{macro}{\endaligned}
+% \begin{macrocode}
+\def\endaligned
+ {
+ \crcr
+ \UseExpandableTaggingSocket{math/luamml/mtable/innertable/save}
+ \egroup
+ \restorecolumn@
+ \egroup
+ \UseTaggingSocket{math/luamml/mtable/innertable/finalize}
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{multline and multline*}
+%
+% \texttt{multline*} needs a redefinition before it is registered as it uses
+% \cs{endmultline}, this must be replaced by the true code.
+%
+% \begin{environment}{multline*}
+% \begin{macrocode}
+\renewenvironment{multline*}{\start@multline\st@rredtrue}
+ {%
+ \iftagsleft@ \@xp\lendmultline@ \else \@xp\rendmultline@ \fi
+ \ignorespacesafterend
+ }
+% \end{macrocode}
+% \end{environment}
+%
+% And now we register both
+% \begin{macrocode}
+\math_register_halign_env:nn {multline}{}
+\math_register_halign_env:nn {multline*}{}
+% \end{macrocode}
+%
+% In the internal commands we have to add sockets for alignment attributes
+% \begin{macro}{\multline@}
+% \begin{macrocode}
+\def\multline@#1{%
+ \Let@
+ \@display@init{\global\advance\row@\@ne \global\dspbrk@lvl\m@ne}%
+ \chardef\dspbrk@context\z@
+ \restore@math@cr
+ \let\tag\tag@in@align
+ \global\tag@false \global\let\raise@tag\@empty
+ \mmeasure@{#1}%
+ \let\tag\gobble@tag \let\label\@gobble
+ \tabskip \if@fleqn \@mathmargin \else \z@skip \fi
+ \totwidth@\displaywidth
+ \if@fleqn
+ \advance\totwidth@-\@mathmargin
+ \fi
+ \halign\bgroup
+ \hbox to\totwidth@{%
+ \if@fleqn
+ \hskip \@centering \relax
+ \else
+ \hfil
+ \fi
+ \strut@
+ $\m@th\displaystyle{}##\endmultline@math
+ \hfil
+ }%
+ \crcr
+ \if@fleqn
+ \hskip-\@mathmargin
+ \def\multline@indent{\hskip\@mathmargin}% put it back
+ \else
+ \hfilneg
+ \def\multline@indent{\hskip\multlinegap}%
+ \fi
+ \iftagsleft@
+ \iftag@
+ \begingroup
+ \ifshifttag@
+ \rlap{\vbox{%
+ \normalbaselines
+ \hbox{%
+ \strut@
+ \make@display@tag
+ }%
+ \vbox to\lineht@{}%
+ \raise@tag
+ }}%
+ \multline@indent
+ \else
+ \setbox\z@\hbox{\make@display@tag}%
+ \dimen@\@mathmargin \advance\dimen@-\wd\z@
+ \ifdim\dimen@<\multlinetaggap
+ \dimen@\multlinetaggap
+ \fi
+ \box\z@ \hskip\dimen@\relax
+ \fi
+ \endgroup
+ \else
+ \multline@indent
+ \fi
+ \else
+ \multline@indent
+ \fi
+ \ifmeasuring@ \else
+ \UseTaggingSocket{math/luamml/mtable/aligncol} {left}
+ \fi
+ #1%
+ \ifmeasuring@ \else
+ \UseTaggingSocket{math/luamml/mtable/aligncol} {right}
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% Luckily, \texttt{multline} uses \cs{endmultline@math} in exactly
+% the spot where we have to set the flag.
+% Less luckily, \cs{endmultline@math} sometimes get overwritten for the last line.
+% But that isn't much of a problem since we want special behavior there anyway.
+% \begin{macro}{\endmultline@math}
+% \begin{macrocode}
+\def\endmultline@math
+ {
+ \UseTaggingSocket{math/luamml/save/nNn}{ {} \displaystyle {mtd} }
+ $
+ \UseTaggingSocket{math/luamml/mtable/finalizecol}{last}
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\rendmultline@}
+% \begin{macrocode}
+\def\rendmultline@{%
+ \iftag@
+% \end{macrocode}
+% we need to surround the math token with tagging sockets.
+% \begin{macrocode}
+ \UseTaggingSocket{math/luamml/save/nNn}{ {} \displaystyle {mtd} }
+ $
+ \UseTaggingSocket{math/luamml/mtable/finalizecol}{last}
+ \let\endmultline@math\relax
+ \ifshifttag@
+ \hskip\multlinegap
+ \llap{\vtop{%
+ \raise@tag
+ \normalbaselines
+ \setbox\@ne\null
+ \dp\@ne\lineht@
+ \box\@ne
+ \hbox{\strut@\make@display@tag}%
+ }}%
+ \else
+ \hskip\multlinetaggap
+ \make@display@tag
+ \fi
+% \end{macrocode}
+% Here we set the tag TODO: is that sensible with multline? Where is the tag saved?
+% \begin{macrocode}
+ \UseTaggingSocket{math/luamml/mtable/tag/set}
+ \else
+ \hskip\multlinegap
+ \fi
+ \hfilneg
+ \math@cr
+% \end{macrocode}
+% Now we finalize the mtable.
+% \begin{macrocode}
+ \UseExpandableTaggingSocket {math/luamml/mtable/finalize} {multline}
+ \egroup$$%
+}
+% \end{macrocode}
+% \end{macro}
+% And something similar for the left version
+% \begin{macro}{\lendmultline@}
+% \begin{macrocode}
+\def\lendmultline@{%
+ \hfilneg
+ \hskip\multlinegap
+ \math@cr
+ \UseExpandableTaggingSocket {math/luamml/mtable/finalize} {multline}
+ \egroup
+ $$%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Cases}
+%
+% \begin{macro}{env@cases}
+% \begin{macrocode}
+\def\env@cases{%
+ \let\@ifnextchar\new@ifnextchar
+ \left\lbrace
+ \def\arraystretch{1.2}%
+ \array{@{}l@{\quad}l@{\luamml_ignore:}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{smallmatrix}
+
+% \begin{environment}{smallmatrix}
+% \begin{macrocode}
+\renewenvironment {smallmatrix} {
+ \UseTaggingSocket{ math/luamml/annotate/false } {} { \null\, }
+ \vcenter \bgroup
+ \Let@
+ \restore@math@cr
+ \default@tag
+ \baselineskip 6 \ex@
+ \lineskip 1.5 \ex@
+ \lineskiplimit \lineskip
+ \ialign \bgroup
+ \hfil
+ $
+ \m@th
+ \scriptstyle
+ ##
+ % No \scriptsize here since we want to add the mstyle nodes
+ \UseTaggingSocket{math/luamml/save/nn}{ {} {mtd} }
+ $
+ \UseTaggingSocket{math/luamml/mtable/finalizecol}{last}
+ \hfil
+ &&
+ \thickspace
+ \hfil
+ $
+ \m@th
+ \scriptstyle
+ ##
+ % No \scriptsize here since we want to add the mstyle nodes
+ \UseTaggingSocket{math/luamml/save/nn}{ {} {mtd} }
+ $
+ \UseTaggingSocket{math/luamml/mtable/finalizecol}{last}
+ \hfil
+ \crcr
+}{%
+ \crcr
+ \UseExpandableTaggingSocket{math/luamml/mtable/smallmatrix/save}
+ \egroup
+ \egroup
+ \UseTaggingSocket{math/luamml/mtable/innertable/finalize}
+ \UseTaggingSocket{ math/luamml/annotate/false } {}{ \, }
+}
+% \end{macrocode}
+% \end{environment}
+%
+% \subsection{The split environment}
+%
+% The split environment is not trivial to handle as it has a rather convoluted
+% implementation in amsmath: depending on in which display environment it is embedded
+% it takes different branches, which makes it difficult to finalize the mtable.
+%
+% The following patches work with leqno and reqno if the (default) \texttt{centertags}
+% are used.
+% The currently fail (the structure is wrong) if the option \texttt{tbtags} is used.
+% The alignment of the cells is currently not handled.
+% A simple debug command until everything is sorted.
+% \begin{macro}{\__math_split_debug_typeout:n}
+% \begin{macrocode}
+\cs_new:Npn\__math_split_debug_typeout:n#1{\use_none:n{#1}}
+% \end{macrocode}
+% \end{macro}
+% We need to detect if \cs{gather@split} has been used or not
+% \begin{macro}{\l__math_gathersplit_bool}
+% \begin{macrocode}
+\bool_new:N\l__math_gathersplit_bool
+% \end{macrocode}
+% \end{macro}
+% At first a redefinition of the main environment. Here we only have to add
+% the saving command for the inner table:
+% \begin{environment}{split}
+% \begin{macrocode}
+\renewenvironment{split}{%
+ \__math_split_debug_typeout:n {begin~split}
+ \if@display
+ \ifinner
+ \@xp\@xp\@xp\split@aligned
+ \else
+ \ifst@rred \else \global\@eqnswtrue \fi
+ \fi
+ \else
+ \let\endsplit\@empty \@xp\collect@body\@xp\split@err
+ \fi
+ \collect@body\gather@split
+}{\__math_split_debug_typeout:n{end~split}%
+ \crcr
+ \UseExpandableTaggingSocket{math/luamml/mtable/innertable/save}%
+ \egroup
+ \egroup
+ \iftagsleft@ \@xp\lendsplit@ \else \@xp\rendsplit@ \fi
+}
+% \end{macrocode}
+% \end{environment}
+%
+% In \cs{gather@split} we have to add the finalization socket.
+% We also set the boolean to true so that we can detect if
+% the finalization has already happened. Perhaps this
+% could be done in the luamml code instead?
+% \begin{macro}{\gather@split}
+% \begin{macrocode}
+\def\gather@split#1#2#3{
+ \__math_split_debug_typeout:n{gather@split}%
+ \@xp\endgroup \reset@equation % math@cr will handle equation numbering
+ \iftag@
+ \toks@\@xp{\df@tag}%
+ \edef\split@tag{%
+ \gdef\@nx\df@tag{\the\toks@}%
+ \global\@nx\tag@true \@nx\nonumber
+ }%
+ \else \let\split@tag\@empty
+ \fi
+ \bool_set_true:N\l__math_gathersplit_bool
+ \spread@equation
+ \vcenter\bgroup
+ \gather@{\split@tag
+ \begin{split}#1\end{split}}%
+ \def\endmathdisplay@a{%
+ \__math_split_debug_typeout:n{endmathdisplay@a}
+ \__math_split_debug_typeout:n{finalize~innertable~endmathdisplay@a}
+ \math@cr
+ \black@ \totwidth@
+ \egroup
+ \egroup
+ \UseExpandableTaggingSocket{math/luamml/mtable/innertable/finalize}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\insplit@}
+% In \cs{insplit@} we have to add the sockets which store the cell content.
+% \begin{macrocode}
+\def\insplit@{\__math_split_debug_typeout:n{insplit@}%
+ \global\setbox\z@\vbox\bgroup
+ \Let@ \chardef\dspbrk@context\@ne \restore@math@cr
+ \default@tag % disallow use of \tag here
+ \ialign\bgroup
+ \hfil
+ \strut@
+ $\m@th\displaystyle {##}%
+ \UseTaggingSocket{math/luamml/save/nNn}{ {} \displaystyle {mtd} }%
+ $%
+ \UseTaggingSocket{math/luamml/mtable/finalizecol}{last}%
+ &$\m@th\displaystyle {{}##}%
+ \UseTaggingSocket{math/luamml/save/nNn}{ {} \displaystyle {mtd} }%
+ $%
+ \UseTaggingSocket{math/luamml/mtable/finalizecol}{last}%
+ \hfill % Why not \hfil?---dmj, 1994/12/28
+ \crcr
+}
+% \end{macrocode}
+% \end{macro}
+% And now the difficult part. Depending on the options leqno/reqno \cs{lendsplit@}
+% or \cs{rendsplit@} are used for the typesetting and the inner table must
+% be finalized here in case this hasn't happen yet. This must be tested with the
+% boolean from \cs{gather@split}
+% \begin{macrocode}
+\def\lendsplit@{%
+ \global\setbox9\vtop{\unvcopy\z@}%
+ \ifinalign@
+ \setbox\@ne\vbox{%
+ \unvcopy\z@
+ \global\setbox8\lastbox
+ }%
+ \setbox\@ne\hbox{%
+ \unhcopy8%
+ \unskip
+ \setbox\tw@\lastbox
+ \unskip
+ \global\setbox\thr@@\lastbox
+ }%
+ \__math_split_debug_typeout:n{lendsplit@/aligncase}
+ \ifctagsplit@
+ \__math_split_debug_typeout:n{lendsplit@/aligncase/centertags}
+ \gdef\split@{%
+ \hbox to\wd\thr@@{}%
+ &\vcenter{\vbox{\moveleft\wd\thr@@\box9}}%
+ \__math_split_debug_typeout:n{finalize~innertable~aligncase}
+ \UseTaggingSocket{math/luamml/mtable/innertable/finalize}%
+ }%
+ \else
+ %TODO, not correct yet.
+ \__math_split_debug_typeout:n{lendsplit@/aligncase/tbtags}
+ \gdef\split@{%
+ \hbox to\wd\thr@@{}%
+ &\vbox{\moveleft\wd\thr@@\box9}%
+ \__math_split_debug_typeout:n{finalize~innertable~aligncase}
+ \UseTaggingSocket{math/luamml/mtable/innertable/finalize}%
+ }%
+ \fi
+ \else
+% \end{macrocode}
+% If not in align we need to test for \cs{gather@split}
+% \begin{macrocode}
+ \ifctagsplit@
+ \bool_if:NTF \l__math_gathersplit_bool
+ {
+ \__math_split_debug_typeout:n{lendsplit/equationcase/centertags}
+ \gdef\split@%
+ {\UseTaggingSocket{math/luamml/annotate/false}{}{\vcenter{\box9}}}
+ }
+ {
+ \__math_split_debug_typeout:n {lendsplit/gathercase/centertags}
+ \gdef\split@{\vcenter{\box9}%
+ \__math_split_debug_typeout:n {finalize~innertable~gathercase}
+ \UseTaggingSocket{math/luamml/mtable/innertable/finalize}}
+ }
+ \else
+ % TODO tbtags not correct yet.
+ \bool_if:NTF \l__math_gathersplit_bool
+ {
+ \__math_split_debug_typeout:n {lendsplit/equationcase/tbtags}
+ \gdef\split@%
+ {\UseTaggingSocket{math/luamml/annotate/false}{}{\box9}}
+ }
+ {
+ \__math_split_debug_typeout:n {lendsplit/gathercase/tbtags}
+ \gdef\split@{
+ \box9%
+ \__math_split_debug_typeout:n {finalize~innertable~gathercase}
+ \UseTaggingSocket{math/luamml/mtable/innertable/finalize}}
+ }
+ \fi
+ \fi
+ \aftergroup\split@
+}
+% \end{macrocode}
+%
+% \begin{macro}{\rendsplit@}
+% And more or less the same for the \cs{rendsplit@} environment.
+% \begin{macrocode}
+\def\rendsplit@{%
+ \ifinalign@
+ \global\setbox9 \vtop{%
+ \unvcopy\z@
+ \global\setbox8 \lastbox
+ \unskip
+ }%
+ \setbox\@ne\hbox{%
+ \unhcopy8
+ \unskip
+ \global\setbox\tw@\lastbox
+ \unskip
+ \global\setbox\thr@@\lastbox
+ }%
+ \ifctagsplit@
+ \gdef\split@{%
+ \hbox to\wd\thr@@{}
+ &\vcenter{\vbox{\moveleft\wd\thr@@\boxz@}}%
+ \__math_split_debug_typeout:n {rendsplit/aligncase/centertags}
+ \__math_split_debug_typeout:n {finalize~innertable~aligncase}
+ \UseTaggingSocket{math/luamml/mtable/innertable/finalize}
+ }%
+ \else
+ \__math_split_debug_typeout:n{rendsplit@/aligncase/tbtags}
+ %TODO tbtags is not correct yet
+ \global\setbox7 \hbox{\unhbox\tw@\unskip}%
+ \gdef\split@{%
+ \global\@tempcnta\column@
+ &\setboxz@h{}%
+ \savetaglength@
+ \global\advance\row@\@ne
+ \vbox{\moveleft\wd\thr@@\box9}%
+ \crcr
+ \noalign{\global\lineht@\z@}%
+ \add@amps\@tempcnta
+ \UseTaggingSocket{math/luamml/annotate/false}{}{\box\thr@@}
+ &\box7
+ \__math_split_debug_typeout:n {finalize~innertable~aligncase}
+ \UseTaggingSocket{math/luamml/mtable/innertable/finalize}%
+ }%
+ \fi
+% \end{macrocode}
+% and again the if we are not in align we need to test for \cs{gathersplit}
+% \begin{macrocode}
+ \else
+ \ifctagsplit@
+ \bool_if:NTF \l__math_gathersplit_bool
+ {
+ \__math_split_debug_typeout:n {rendsplit/equationcase/centertags}
+ \gdef\split@%
+ {\UseTaggingSocket{math/luamml/annotate/false}{}{\vcenter{\boxz@}}}
+ }
+ {
+ \__math_split_debug_typeout:n {rendsplit/gathercase/centertags}
+ \gdef\split@{\vcenter{\boxz@}%
+ \__math_split_debug_typeout:n {finalize~innertable~gathercase}
+ \UseTaggingSocket{math/luamml/mtable/innertable/finalize}}
+ }
+ \else
+ \bool_if:NTF \l__math_gathersplit_bool
+ {
+ \__math_split_debug_typeout:n {rendsplit/equationcase/tbtags}
+ \gdef\split@{%
+ \UseTaggingSocket{math/luamml/annotate/false}{}{\boxz@}}
+ }
+ {
+ \__math_split_debug_typeout:n {rendsplit/gathercase/tbtags}
+ \gdef\split@{%
+ \boxz@
+ \UseTaggingSocket{math/luamml/mtable/innertable/finalize}}
+ }
+ \fi
+ \fi
+ \aftergroup\split@
+}
+% \end{macrocode}
+% \end{macro}
% \subsection{\cs{intertext}}
% The \cs{intertext} command errors with active tagging as it is processed twice
-% which leads to duplicated structures.
+% which leads to duplicated structures.
+%
+% \begin{macro}{\intertext@}
+% TODO: review and add sockets!
% \begin{macrocode}
-\AddToHook{package/amsmath/after}
- {
- \def\intertext@{%
- \def\intertext##1{%
- \ifvmode\else\\\@empty\fi
- \noalign{%
+\def\intertext@{%
+ \def\intertext##1{%
+ \ifvmode\else\\\@empty\fi
+ \noalign{%
% \end{macrocode}
% we have to flip the sign and use a negative \cs{belowdisplayskip}
% as we flipped the sign at the outside.
% \begin{macrocode}
- \penalty\postdisplaypenalty\vskip-\belowdisplayskip
- \vbox{
+ \penalty\postdisplaypenalty\vskip-\belowdisplayskip
+ \vbox{
% \end{macrocode}
% Stop tagging when measuring:
% \begin{macrocode}
- \ifmeasuring@\tag_suspend:n{\measuring}\fi
- \normalbaselines
- \ifdim\linewidth=\columnwidth
- \else \parshape\@ne \@totalleftmargin \linewidth
- \fi
+ \ifmeasuring@\tag_suspend:n{\measuring}\fi
+ \normalbaselines
+ \ifdim\linewidth=\columnwidth
+ \else \parshape\@ne \@totalleftmargin \linewidth
+ \fi
% \end{macrocode}
% End the previous mc:
% \begin{macrocode}
- \tag_mc_end_push:
+ \tag_mc_end_push:
% \end{macrocode}
% We are already in a par so we change now to text:
% \begin{macrocode}
- \tagpdfsetup{para/tag=P}%
+ \tagpdfsetup{para/tag=P}%
% \end{macrocode}
-% TODO why \cs{tagpdfparaOn} needed?
+% TODO why \cs{tagpdfparaOn} needed?
% \begin{macrocode}
- \tagpdfparaOn
- \noindent\ignorespaces##1\par
+ \tagpdfparaOn
+ \noindent\ignorespaces##1\par
% \end{macrocode}
% Restart the MC
% \begin{macrocode}
- \tag_mc_begin_pop:n{}}%
- \penalty\predisplaypenalty\vskip\abovedisplayskip%
- }%
- }}
- }
+ \tag_mc_begin_pop:n{}}%
+ \penalty\predisplaypenalty\vskip\abovedisplayskip%
+ }%
+}}
% \end{macrocode}
+% \end{macro}
%
% \subsection{\cs{text}}
-%
+%
% The \cs{text} command uses \cs{mathchoice} which \enquote{typesets} the argument
-% four times. This makes it quite problematic for tagging. Without precautions
-% structure objects would be created four times and would get MC-chunks as kids
-% that doesn't really exist. amsmath contains a switch that allows to execute code
+% four times. This makes it quite problematic for tagging. Without precautions
+% structure objects would be created four times and would get MC-chunks as kids
+% that don't really exist. amsmath contains a switch that allows to execute code
% only in the first (displaymath) branch, but that isn't usable here. At first because
% we don't know if the first branch creates the same structure as the one that is
% actually used. At second because the engines executes some commands like \cs{label}
% and \cs{pdfannot} only at shipout from the branch that really was used. So we would
-% get structure data from one \cs{mathchoice}-branch and MC-labels and links from another
-% one and that gets very messy.
-%
+% get structure data from one \cs{mathchoice}-branch and MC-labels and links from another
+% one and that gets very messy.
+%
% We therefore have to avoid that tagging is active in unused branches. In pdflatex it
% is not possible to detect the mathstyle before, so we use a label. With lualatex is
% is possible to redefine \cs{text} not to use \cs{mathchoice}
-%
+%
+% \begin{macro}{\text@}
% \begin{macrocode}
\AddToHook{package/amstext/after}
{
% \end{macrocode}
% currently amsmath is loaded in a begindocument hook, so this
% test is fine. If amstext is loaded earlier (in the kernel), this needs perhaps a change.
+% \changes{v0.1d}{2024/12/03}{Add tagging socket for luamml support}
% \begin{macrocode}
\tag_if_active:T
{
\sys_if_engine_luatex:TF
{
- \def\text@#1{{%
+ \def\text@#1{
+ \tag_socket_use:nnn {math/luamml/hbox}{}
+ {{%
\ifcase\mathstyle
\hbox{{#1}}\or
\hbox{{#1}}\or
@@ -168,7 +1040,7 @@
\ERROR
\fi
\check@mathfonts
- }}
+ }}}
}
{
\def\text@#1
@@ -177,39 +1049,41 @@
\tag_suspend:n{\text@}
\mathchoice
{
- \@@_tag_if_mathstyle:en{mathchoice-\int_use:N\g__math_mathchoice_int}{0}
+ \__math_tag_if_mathstyle:en{mathchoice-\int_use:N\g__math_mathchoice_int}{0}
\textdef@\displaystyle\f@size{#1}
}
{
- \@@_tag_if_mathstyle:en{mathchoice-\int_use:N\g__math_mathchoice_int}{2}
+ \__math_tag_if_mathstyle:en{mathchoice-\int_use:N\g__math_mathchoice_int}{2}
\textdef@\textstyle\f@size{\firstchoice@false #1}
}
{
- \@@_tag_if_mathstyle:en{mathchoice-\int_use:N\g__math_mathchoice_int}{4}
+ \__math_tag_if_mathstyle:en{mathchoice-\int_use:N\g__math_mathchoice_int}{4}
\textdef@\textstyle\sf@size{\firstchoice@false #1}
}
{
- \@@_tag_if_mathstyle:en{mathchoice-\int_use:N\g__math_mathchoice_int}{6}
+ \__math_tag_if_mathstyle:en{mathchoice-\int_use:N\g__math_mathchoice_int}{6}
\textdef@\textstyle \ssf@size{\firstchoice@false #1}
}
\check@mathfonts
- }}
+ }}
}
}
}
% \end{macrocode}
+% \end{macro}
%
% \subsection{\cs{pmb}}
% \cs{pmb} prints its argument three times. For tagging we must mark
% two of occurrences as artifact.
% For luatex the attributes in the box must be reset, for this
% we switch to expl3-boxes.
+% \begin{macro}{\pbm@@,\pmb@}
% \begin{macrocode}
\AddToHook{package/amsbsy/after}
{
- \def\pmb@@@@#1#2#3{\leavevmode\hbox_set:Nn\l_@@_tmpa_box{xxx#3}
+ \def\pmb@@#1#2#3{\leavevmode\hbox_set:Nn\l_@@_tmpa_box{xxx#3}
\dimen@-\box_wd:N\l_@@_tmpa_box
- \kern-.5\ex@\box_use:N\l_@@_tmpa_box
+ \kern-.5\ex@\box_use:N\l_@@_tmpa_box
\tag_mc_end:\tag_mc_begin:n{artifact}
\tag_mc_reset_box:N\l_@@_tmpa_box
\kern\dimen@\kern.25\ex@\raise.4\ex@\box_use:N\l_@@_tmpa_box
@@ -220,7 +1094,7 @@
\setboxz@h{$\m@th#1\mkern.5mu$}\pmbraise@\wdz@
\binrel@{#2}
\dimen@-\box_wd:N\l_@@_tmpa_box
- \binrel@@@@{
+ \binrel@@{
\mkern-.8mu\box_use:N\l_@@_tmpa_box
\tag_mc_end:\tag_mc_begin:n{artifact}
\tag_mc_reset_box:N\l_@@_tmpa_box
@@ -231,6 +1105,7 @@
}
}
% \end{macrocode}
+% \end{macro}
% \begin{macrocode}
\ExplSyntaxOff
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-block.dtx b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-block.dtx
index 2399d156260..13c732bf08d 100644
--- a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-block.dtx
+++ b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-block.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-%% File: latex-lab-block.dtx (C) Copyright 2021-2024 LaTeX Project
+%% File: latex-lab-block.dtx (C) Copyright 2021-2025 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
@@ -9,8 +9,9 @@
%
% https://www.latex-project.org/lppl.txt
%
-\def\ltlabblockdate{2024-11-25}
-\def\ltlabblockversion{0.8w}
+\def\ltlabblockdate{2025-01-20}
+\def\ltlabblockversion{0.9a}
+
%<*driver>
\documentclass[kernel]{l3doc}
\usepackage{amstext}
@@ -235,7 +236,7 @@
% \begin{TemplateDescription}{blockenv}{display}
%
% \TemplateKey{env-name}{tokenlist}
-% {Name of the environment used only in tracing}{}
+% {Name of the environment used in tracing and error messages}{}
% \TemplateKey{tag-name}{tokenlist}
% {Name of the tag in the PDF. If not explicitly given
% the name is defined by the \key{tagging-recipe}}{}
@@ -765,6 +766,25 @@
\def\@doendpe{\@endpetrue
\def\par
{
+% \end{macrocode}
+% If we are processing a \verb=$$= math display and we encounter a real
+% \cs{par} after it, we need to add a \cs{parskip} when tagging is
+% done, because the one
+% added by \TeX{} is always canceled by the processing in
+% \cs{__math_tag_dollardollar_display_end:} in that case. This is
+% signaled by the global legacy switch \texttt{@domathendpe} which is set
+% to true in that case. Once the skip is applied we set it to
+% false. If there is no \cs{par} at all, it will be reset in
+% \cs{everypar} when the next paragraph starts.
+% \changes{v0.8x}{2024/12/01}{Handle \cs{parskip} after \texttt{\$\$}
+% display (tagging/762)}
+% \begin{macrocode}
+ \if@domathendpe
+% \typeout{------->~ add~ another~ parskip~ that~ is~
+% not~ canceled:~ \the\parskip }
+ \skip_vertical:n { \tex_parskip:D }
+ \@domathendpefalse
+ \fi
\@restorepar
\clubpenalty\@clubpenalty
% \end{macrocode}
@@ -787,6 +807,14 @@
\everypar{{\setbox\z@\lastbox}
\everypar{}
\@endpefalse
+% \end{macrocode}
+% Not sure what is faster: testing for the status of the switch or
+% setting it unconditionally to false (globally), probably roughly the same,
+% so we set it always:
+% \begin{macrocode}
+% \if@domathendpe
+ \@domathendpefalse
+% \fi
}
}
% \end{macrocode}
@@ -800,6 +828,21 @@
% \end{macro}
%
%
+% \begin{macro}{\if@domathendpe,\@domathendpefalse,\@domathendpetrue}
+% Signal that special paragraph handling after a math display is required.
+% \changes{v0.8x}{2024/12/01}{Handle \cs{parskip} after \texttt{\$\$}
+% display (tagging/762)}
+% \begin{macrocode}
+\newif\if@domathendpe
+\def\@domathendpefalse{\global\let\if@domathendpe\iffalse}
+\def\@domathendpetrue {\global\let\if@domathendpe\iftrue}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%
% \subsection{Object and template interfaces}
%
%
@@ -1067,8 +1110,7 @@
{
\@@_debug_typeout:n{\l_@@_env_name_tl -env-start}
%
- \tl_if_empty:nF {#1} { \SetTemplateKeys{blockenv}{display}{#1} }
-%
+ \SetKnownTemplateKeys{blockenv}{display}{#1}
% \end{macrocode}
% We need to know later if we have nested blockenvs inside
% a flattened environment. Whenever we start a new blockenv we
@@ -1159,7 +1201,16 @@
\UseInstance{block}
{ \l_@@_block_instance_tl - \int_use:N
\g_block_nesting_depth_int }
- {#1}
+ \UnusedTemplateKeys
+% \end{macrocode}
+% After this instance has been processed, any remaining unused keys
+% are stored in \cs{UnusedTemplateKeys} and we can make use of this
+% data later as
+% long as we do not call another instance that also does unused key
+% processing and overwrites it. This is what happens below, so we better save its
+% current value for now.
+% \begin{macrocode}
+ \tl_set_eq:NN \l_@@_unused_blockenv_keys_tl \UnusedTemplateKeys
% \end{macrocode}
% After the block instance call the para and then inner (list)
% instance if either or both are
@@ -1191,7 +1242,28 @@
% not clean use "o"?
{ - \int_use:N \l_@@_inner_level_counter_tl }
}
- {#1}
+ \l_@@_unused_blockenv_keys_tl
+% \end{macrocode}
+% Again the instance may has processed a few keys from the sofar
+% unused keys, so we update \cs{l_@@_unused_blockenv_keys_tl} to
+% match the new reality.
+% \begin{macrocode}
+ \tl_set_eq:NN \l_@@_unused_blockenv_keys_tl \UnusedTemplateKeys
+ }
+% \end{macrocode}
+% At this point, the \cs{l_@@_unused_blockenv_keys_tl} token list
+% should either be empty or it should contain only keys that are suitable for
+% the item template, but right now there is no code to test that
+% can test
+% the latter; it would help probably if we have an interface for
+% this.
+%
+% For now we handle that when the first item is encountered, but
+% that isn't realy clean.\fmi{fix}
+% \begin{macrocode}
+ \tl_if_empty:NF \l_@@_unused_blockenv_keys_tl
+ {
+ % check if only item template keys remain
}
% \end{macrocode}
% We finish off with \cs{l_@@_final_code_tl} which defaults to
@@ -1204,6 +1276,14 @@
% \end{template}
%
%
+% \begin{macro}{\l_@@_unused_blockenv_keys_tl}
+%
+% \begin{macrocode}
+\tl_new:N \l_@@_unused_blockenv_keys_tl
+% \end{macrocode}
+% \end{macro}
+%
+%
% \begin{macro}{\l__tag_block_flattened_level_int}
% Count the levels of nested blockenvs starting with the first that
% is \enquote{flattened}. The counter is defined in lttagging.dtx,
@@ -1401,7 +1481,7 @@
para-class = \l__tag_para_attr_class_tl ,
}
{
- \tl_if_empty:nF {#1} { \SetTemplateKeys{para}{std}{#1} }
+ \SetTemplateKeys{para}{std}{#1}
\skip_set:Nn \@rightskip \rightskip
}
% \end{macrocode}
@@ -1443,7 +1523,7 @@
parindent = \l_@@_parindent_dim ,
}
{
- \tl_if_empty:nF {#1} { \SetTemplateKeys{block}{display}{#1} }
+ \SetKnownTemplateKeys{block}{display}{#1}
% \end{macrocode}
% \fmi{generalize heading usage (or drop?)}
% \begin{macrocode}
@@ -1653,7 +1733,7 @@
% if they should alter all items the right place would be the list
% environment. For this reason we need to store the values and then
% set them inside the \tn{item} template code using
-% \tn{SetTemplateKeys} in the appropriate context (template type
+% \tn{SetKnownTemplateKeys} in the appropriate context (template type
% and template name). This is done in
% \cs{@@_evaluate_saved_user_keys:nn}. The context is provided in
% the two arguments (because different list environments may use
@@ -1672,10 +1752,8 @@
%\cs_new:Npn \@@_save_user_keys:n #1 {
% \tl_if_empty:nTF {#1}
% { \cs_set_eq:NN \@@_evaluate_saved_user_keys:nn \use_none:nn }
-% {
-% \cs_set:Npe \@@_evaluate_saved_user_keys:nn ##1##2
-% { \SetTemplateKeys{##1}{##2}{ \exp_not:n{#1} } }
-% }
+% { \cs_set:Npe \@@_evaluate_saved_user_keys:nn ##1##2
+% { \SetKnownTemplateKeys{##1}{##2}{ \exp_not:n{#1} } }
%}
% \end{macrocode}
% \end{macro}
@@ -1707,19 +1785,50 @@
% \end{macrocode}
% We start by looking at the user supplied keys in \texttt{\#1}. If
% there aren't any we reset \cs{@@_evaluate_saved_user_keys:nn} to
-% do nothing. Otherwise we evaluate and set the keys in the contect
+% do nothing. Otherwise we evaluate and set the keys in the context
% of the current list template. In addition we prepare
% \cs{@@_evaluate_saved_user_keys:nn} for execution in the
% template for \tn{item}.
% \changes{v0.8s}{2024/10/03}{Prepare \cs{@@_evaluate_saved_user_keys:nn}
% for use in \tn{item}}
% \begin{macrocode}
- \tl_if_empty:nTF {#1}
+ \tl_if_empty:oTF {#1}
{ \cs_set_eq:NN \@@_evaluate_saved_user_keys:nn \use_none:nn }
{
- \SetTemplateKeys{list}{std}{#1}
+ \SetKnownTemplateKeys{list}{std}{#1}
+% \end{macrocode}
+% The setup for \cs{@@_evaluate_saved_user_keys:nn} is a bit trcky
+% and has to be done with \cs{cs_set:Npe} even though we don't want
+% to expand anything and therefore use \cs{exp_not:n} inside. All
+% this does is that any \texttt{\#} passed in via \texttt{\#1} is
+% doubled (e.g., from \verb/label-format=\fbox{#1}/ which is
+% represented as \verb/...\fbox{##1}/). Otherwise, we would end up
+% with a replacement text like
+%\begin{verbatim}
+% \SetTemplateKeys {#1}{#2}{label-format=\fbox {#1}}
+%\end{verbatim}
+% instead of
+%\begin{verbatim}
+% \SetTemplateKeys {#1}{#2}{label-format=\fbox {##1}}
+%\end{verbatim}
+% resulting in very odd and puzzling behavior.
+% \begin{macrocode}
\cs_set:Npe \@@_evaluate_saved_user_keys:nn ##1##2
- { \SetTemplateKeys{##1}{##2}{ \exp_not:n{#1} } }
+ { \SetKnownTemplateKeys{##1}{##2}{
+ \exp_not:o { \UnusedTemplateKeys }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \exp_not:n {
+ \tl_if_empty:NF \UnusedTemplateKeys
+ {
+ \msg_error:nnee { block } { unknown-keys }
+ { \l_@@_env_name_tl \space environment}
+ \UnusedTemplateKeys
+ }
+ }
+ }
}
% \end{macrocode}
% Has this list a counter name defined in the instance?
@@ -1802,6 +1911,20 @@
\@@_debug_typeout:n{template:list:std~end}
}
% \end{macrocode}
+%
+% The message that is used above when we are left with keys that
+% are unknown:
+% \begin{macrocode}
+\msg_new:nnnn { block } { unknown-keys }
+ { Some~ keys~ specified~ on~ the~ #1~ are~ unknown. }
+ {
+ The~ following~ keys~ are~ unknown~ and~ their~
+ values~ are~ ignored:\\
+ \space\space #2\\
+ Perhaps~ a~ misspelling~ or~ the~ current~ template~
+ instance~ uses~ special~ keys.
+ }
+% \end{macrocode}
%
%
% Extra keys to support enumitem conventions:
@@ -1895,7 +2018,18 @@
% to make use of user keys on the list level}
% \begin{macrocode}
\@@_evaluate_saved_user_keys:nn {item}{std}
- \tl_if_empty:nF{#1}{ \SetTemplateKeys{item}{std}{#1} }
+% \end{macrocode}
+% We don't care whether all of the user keys from the list level have
+% been applied, but those explicitly set on the \cs{item} command
+% should be aplicable, so we generate an error if that isn't the case:
+ % \begin{macrocode}
+ \SetKnownTemplateKeys{item}{std}{#1}
+ \tl_if_empty:NF \UnusedTemplateKeys
+ {
+ \msg_error:nnee { block } { unknown-keys }
+ { \noexpand\item command }
+ \UnusedTemplateKeys
+ }
% \end{macrocode}
%
% If no optional argument was given then \cs{l_@@_label_given_tl}
@@ -3143,6 +3277,7 @@
% of a surrounding list. So instead we need to make sure that the
% paragraph end is executed in a group so that any parshape setup
% is preserved.
+% \changes{v0.8x}{2025/01/12}{flattened para inside verbatim using codeline tag}
% \begin{macrocode}
%<@@=>
\def\legacyverbatimsetup{%
@@ -3161,8 +3296,7 @@
% \end{macrocode}
%
% \begin{macrocode}
- \tl_set:Nn \l__tag_para_main_tag_tl {codeline}
- \tagtool{paratag=Code}% oder faster: \tl_set:Nn\l__tag_para_tag_tl{Code}
+ \tl_set:Nn \l__tag_para_tag_tl {codeline}
}
%<@@=block>
% \end{macrocode}
@@ -3759,10 +3893,14 @@
%
% \begin{instance}{blockenv verbatim}
%
-% The rolemapping is currently \struct{verbatim} to \struct{P} and
+% The rolemapping is \struct{verbatim} to \struct{Code} and
% \struct{codeline} to \struct{Sub} (which is role mapped
-% to \struct{Span} in pdf 1.7. Alternatives for PDF 1.7: \struct{Div} and \struct{P}.
-%
+% to \struct{Span} in pdf 1.7). Sub inside Code is allowed according
+% the errata of ISO 32005. The paragraphs inside verbatim are flattened.
+% Line numbers should inside the \struct{codeline} structure
+% and be tagged either as \struct{Lbl} or \struct{Artifact}\struct{Lbl}.
+%
+% \changes{v0.8x}{2025/01/12}{use flattened para inside verbatim}
% \begin{macrocode}
\DeclareInstance{blockenv}{verbatim}{display}
{
@@ -3770,6 +3908,7 @@
tag-name = verbatim,
tag-class = ,
tagging-recipe = standard,
+ para-flattened = true,
inner-level-counter = ,
level-increase = false,
setup-code = ,
diff --git a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-firstaid.dtx b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-firstaid.dtx
index a5c44b82417..a25192395d9 100644
--- a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-firstaid.dtx
+++ b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-firstaid.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-%% File: latex-lab-firstaid.dtx (C) Copyright 2023-2024 LaTeX Project
+%% File: latex-lab-firstaid.dtx (C) Copyright 2023-2025 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
@@ -16,7 +16,7 @@
%
% for those people who are interested or want to report an issue.
%
-\def\ltlabfirstaiddate{2024-11-23}
+\def\ltlabfirstaiddate{2025-01-27}
\def\ltlabfirstaidversion{0.85i}
%<*driver>
\documentclass{l3doc}
@@ -117,14 +117,41 @@
%
% \begin{macrocode}
\AddToHook{class/amsart/after}[latex-lab-testphase-firstaid/amsthm]
- {\tag_if_active:T{\@@_firstaid_amsthm:}}
+ {\tag_if_active:T{\@@_firstaid_amsthm:}\@@_firstaid_ams_abstract:}
\AddToHook{class/amsbook/after}[latex-lab-testphase-firstaid/amsthm]
- {\tag_if_active:T{\@@_firstaid_amsthm:}}
+ {\tag_if_active:T{\@@_firstaid_amsthm:}\@@_firstaid_ams_abstract:}
\AddToHook{class/amsproc/after}[latex-lab-testphase-firstaid/amsthm]
{\tag_if_active:T{\@@_firstaid_amsthm:}}
\AddToHook{package/amsthm/after}[latex-lab-testphase-firstaid/amsthm]
{\tag_if_active:T{\@@_firstaid_amsthm:}}
% \end{macrocode}
+%
+% \changes{v0.85i}{2025/01/26}{Add missing \cs{par} to abstract env (gh/1641)}
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_firstaid_ams_abstract:
+ {
+\renewenvironment{abstract}{%
+ \ifx\maketitle\relax
+ \ClassWarning{\@classname}{Abstract~ should~ precede~
+ \protect\maketitle\space in~ AMS~ document~ classes;~ reported}%
+ \fi
+ \global\setbox\abstractbox=\vtop \bgroup
+ \normalfont\Small
+ \list{}{\labelwidth\z@
+ \leftmargin3pc \rightmargin\leftmargin
+ \listparindent\normalparindent \itemindent\z@
+ \parsep\z@ \@plus\p@
+ \let\fullwidthdisplay\relax
+ }%
+ \item[\hskip\labelsep\scshape\abstractname.]%
+}{%
+ \endlist
+ \par % <--- added
+ \egroup
+ \ifx\@setabstract\relax \@setabstracta \fi
+}
+ }
+% \end{macrocode}
% \changes{v0.85h}{2024/10/16}{moved Caption tag into \@begintheorem, tagging issue\#733}
% \begin{macrocode}
\cs_new_protected:Npn \@@_firstaid_amsthm:
@@ -450,7 +477,7 @@
% The environments are surrounded by a \texttt{verbatim} structure,
% every line by a \texttt{codeline}
% structure (this requires the block code, but firstaid should be used only with
-% phase-III anyway). Line numbers are tagged as Lbl, currently outside of the
+% phase-III anyway). Line numbers are tagged as Lbl, inside of the
% \texttt{codeline} structure. The frame lines are marked as artifact.
%
% \begin{macro}{\FV@LeaveVMode}
@@ -537,6 +564,7 @@
\hbox to \hsize{%
\kern\leftmargin
\hbox to \linewidth{%
+ \tag_struct_begin:n{tag=codeline}
\cs_if_exist:NT \FV@LeftListNumber
{
\tag_struct_begin:n{tag=Lbl}
@@ -551,7 +579,6 @@
\FV@LeftListFrame
\tag_mc_end:
}
- \tag_struct_begin:n{tag=codeline}
\tag_mc_begin:n{}%
\FancyVerbFormatLine{#1}%
\tag_mc_end:
diff --git a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-float.dtx b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-float.dtx
index 0bbf7b7eb66..2844168174a 100644
--- a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-float.dtx
+++ b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-float.dtx
@@ -16,8 +16,8 @@
%
% for those people who are interested or want to report an issue.
%
-\def\ltlabfloatdate{2024-11-21}
-\def\ltlabfloatversion{0.81g}
+\def\ltlabfloatdate{2024-12-27}
+\def\ltlabfloatversion{0.81h}
%<*driver>
\documentclass{l3doc}
\EnableCrossrefs
@@ -297,7 +297,7 @@
% \subsection{Tagging sockets}
% For now we test if the sockets are already defined
% \begin{macrocode}
-\str_if_exist:cF { l__socket_tagsupport/float/begin_plug_str }
+\socket_if_exist:nF {tagsupport/float/begin}
{
\NewSocket{tagsupport/float/hmode/begin}{0}
\NewSocket{tagsupport/float/hmode/end}{0}
@@ -540,7 +540,7 @@
% First some temporary sockets.
% These sockets are in lttagging.
% \begin{macrocode}
-\str_if_exist:cF { l__socket_tagsupport/caption/begin_plug_str }
+\socket_if_exist:nF {tagsupport/caption/begin}
{
\NewSocket{tagsupport/caption/begin}{1}
\NewSocket{tagsupport/caption/end}{0}
@@ -551,7 +551,7 @@
% These socket are currently defined in tagpdf.
% \changes{v0.81g}{2024-11-21}{add missing argument to socket}
% \begin{macrocode}
-\str_if_exist:cF { l__socket_tagsupport/para/begin_plug_str }
+\socket_if_exist:nF {tagsupport/para/begin}
{
\NewSocket{tagsupport/para/begin}{0}
\NewSocket{tagsupport/para/end}{0}
diff --git a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-footnotes.dtx b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-footnotes.dtx
index f4ad7edd9de..576693b2d69 100644
--- a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-footnotes.dtx
+++ b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-footnotes.dtx
@@ -1,7 +1,7 @@
% \iffalse meta-comment
%
%% File: latex-lab-footnotes.dtx
-% Copyright (C) 2022-2024 The LaTeX Project
+% Copyright (C) 2022-2025 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
@@ -17,8 +17,8 @@
%
% for those people who are interested or want to report an issue.
%
-\def\ltlabfootnotedate{2024-09-30}
-\def\ltlabfootnoteversion{0.8g}
+\def\ltlabfootnotedate{2025-02-20}
+\def\ltlabfootnoteversion{0.8k}
%<*driver>
\documentclass{l3doc}
@@ -1177,7 +1177,7 @@
% \begin{macro}{\fnote_footnotetext:n}
% We temporarily test for the tagging socket until it is in the next release:
% \begin{macrocode}
-\str_if_exist:cF { l__socket_tagsupport/para/restore_plug_str }
+\socket_if_exist:nF {tagsupport/para/restore}
{
\NewSocket{tagsupport/para/restore}{0}
\NewSocketPlug{tagsupport/para/restore}{default}
@@ -2187,7 +2187,7 @@
\DeclareRelease{v5}{2011-06-06}{footmisc-2011-06-06.sty}
\DeclareCurrentRelease{}{2022-02-14}
\ProvidesPackage{latex-lab-footmisc}%
- [2022/03/08 v6.0d
+ [2025/02/20 v6.0e
a miscellany of footnote facilities -- latex-lab version%
]
@@ -2311,10 +2311,10 @@
% \texttt{dblfnote} package if we integrate that).
% \begin{macrocode}
\ifFN@para
- \NewSocketPlug{@makecol/footnotes}{para}{%
+ \NewSocketPlug{build/column/footnotes}{para}{%
\global\setbox\footins\vbox{\FN@makefootnoteparagraph}%
}
- \AssignSocketPlug{@makecol/footnotes}{para}
+ \AssignSocketPlug{build/column/footnotes}{para}
\fi
% \end{macrocode}
%
@@ -2345,23 +2345,23 @@
% \begin{macrocode}
\ifcase \FN@bottomcases\relax
\ERROR
-\or %1
+\or %1 bottom option
\ifFN@abovefloats
- \AssignSocketPlug {@makecol/outputbox}{space-footnotes-floats}
+ \AssignSocketPlug {build/column/outputbox}{space-footnotes-floats}
\else
- \AssignSocketPlug {@makecol/outputbox}{floats-footnotes-space}
+ \AssignSocketPlug {build/column/outputbox}{floats-space-footnotes}
\fi
-\or %2
+\or %2 bottomfloats
\ifFN@abovefloats
- \AssignSocketPlug {@makecol/outputbox}{footnotes-space-floats}
+ \AssignSocketPlug {build/column/outputbox}{footnotes-space-floats}
\else
- \AssignSocketPlug {@makecol/outputbox}{space-floats-footnotes}
+ \AssignSocketPlug {build/column/outputbox}{space-floats-footnotes}
\fi
-\or %3
+\or %3 neither bottom nor bottomfloats
\ifFN@abovefloats
- \AssignSocketPlug {@makecol/outputbox}{footnotes-floats}
+ \AssignSocketPlug {build/column/outputbox}{footnotes-floats}
\else
- \AssignSocketPlug {@makecol/outputbox}{floats-footnotes}
+ \AssignSocketPlug {build/column/outputbox}{floats-footnotes}
\fi
\else
\ERROR
diff --git a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-graphic.dtx b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-graphic.dtx
index b3ee3eb6c6d..4ac8a523d40 100644
--- a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-graphic.dtx
+++ b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-graphic.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-%% File: latex-lab-graphic.dtx (C) Copyright 2022-2024 LaTeX Project
+%% File: latex-lab-graphic.dtx (C) Copyright 2022-2025 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
diff --git a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-marginpar.dtx b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-marginpar.dtx
index 2f293ee4924..3a4d7c4c75f 100644
--- a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-marginpar.dtx
+++ b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-marginpar.dtx
@@ -2,7 +2,7 @@
%
%% File: latex-lab-marginpar.dtx
%%
-% Copyright (C) 2024 LaTeX Project
+% Copyright (C) 2024-2025 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
@@ -18,8 +18,8 @@
%
% for those people who are interested or want to report an issue.
%
-\def\ltlabmarginpardate{2024-09-18}
-\def\ltlabmarginparversion{0.85d}
+\def\ltlabmarginpardate{2025-02-21}
+\def\ltlabmarginparversion{0.85e}
%<*driver>
\documentclass[kernel]{l3doc}
@@ -148,9 +148,11 @@
% \subsection{Tagging sockets}
%
% \begin{socketdecl}{tagsupport/marginpar/begin,tagsupport/marginpar/end}
+% The sockets are declared in lttagging.
+% \changes{0.85e}{2025/02/21}{moved sockets into lttagging}
% \begin{macrocode}
-\socket_new:nn {tagsupport/marginpar/begin}{0}
-\socket_new:nn {tagsupport/marginpar/end}{0}
+%\socket_new:nn {tagsupport/marginpar/begin}{0}
+%\socket_new:nn {tagsupport/marginpar/end}{0}
% \end{macrocode}
% \end{socketdecl}
%
diff --git a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-math.dtx b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-math.dtx
index 7ff1e742738..472beaccea4 100644
--- a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-math.dtx
+++ b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-math.dtx
@@ -2,7 +2,7 @@
%
%% File: latex-lab-math.dtx
%
-% Copyright (C) 2022-2024 The LaTeX Project
+% Copyright (C) 2022-2025 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
@@ -19,8 +19,9 @@
% for those people who are interested or want to report an issue.
%
%
-\def\ltlabmathdate{2024-11-26}
-\def\ltlabmathversion{0.6j}
+
+\def\ltlabmathdate{2025-02-20}
+\def\ltlabmathversion{0.6l}
%
%<*driver>
\documentclass{l3doc}
@@ -80,15 +81,15 @@
% \car*{Todo: update all the documentation! Both here and
% (what little there is!) in the implementation section.}
%
-% Tagging math involves a variety of tasks that require that math is captured before the
-% typesetting
+% Tagging math involves a variety of tasks that require that
+% math is captured before the typesetting:
% \begin{itemize}
% \item When typesetting the math MC-tags and structure commands must
% be inserted at the begin and the end, and perhaps also around lines
% or other subparts of the equation.
% \item The source and/or a mathml-representation of the source must be available
% so that it can be (perhaps after some preprocessing) be used in an associated file
-% or in an alternate text
+% or in an alternate text.
% \item It must be possible to measure the math for, e.g., a bbox setting.
% \end{itemize}
%
@@ -114,11 +115,146 @@
% regardless of the state of the boolean. For
% |equation|, |equation*| and |math| this is a change as they no longer can
% contain verbatim.
-%
-% \item BUG: |\[...\]| grabs if \cs{l_@@_collected_bool} is false. If it is
-% true it falls back to |equation*| and then errors because this can't find the end.
% \end{itemize}
%
+% \section{Avoiding math capture}\label{sec:nocapture}
+% In most cases when an environment or command switches into math,
+% the semantic meaning of the content \emph{is} math and
+% grabbing and then tagging that as a Formula is adequate.
+%
+% But there are exceptions, most prominently with the math shift token |$|.
+% \begin{itemize}
+% \item |$| can be used to center a box with |\vcenter|,
+% for example in the tabular code. The opening |$| is then often in a
+% different command than the closing |$| and the content of the box
+% should be tagged normally, including all math it contains.
+% This means one wants to avoid that the opening |$| triggers the math
+% grabbing and creates a Formula structure, and after the |$| one
+% wants to switch back to normal text and math capture/tagging.
+%
+% \item |$| is used to place superscripts and subscripts, see the definition of
+% |\textsuperscript| which uses |\ensuremath| internally. Inside the superscript
+% in special cases you may want more tagging (including nested math tagging) but
+% typically it is simple text.
+%
+% \item |$| is used to access a char in a math font.
+%
+% For example the |\meta| command uses internally the math commands
+% |\langle| and |\rangle| around its argument:\\
+% |$\langle$\textit{argument}$\rangle$|
+% which gives $\langle$\textit{argument}$\rangle$.
+%
+% The symbols are then clearly not math.
+% (Beside disabling math tagging one could also use text commands like
+% |\textlangle| and |\textrangle|: \textlangle\textit{argument}\textrangle{}.
+% Depending on the font that could even look better,
+% but it requires that the font supports the chars, which is not the case
+% for various OpenType fonts.)
+% Additional tagging inside the math should be not needed.
+% If the symbols need an actualtext then a Span can be added around the whole material.
+%
+% \end{itemize}
+%
+% \subsection{Options to suppressing math capture and tagging}
+% We are there providing a number of options to suppress the collection/grabbing
+% of the math and with it the tagging.
+% \DescribeMacro\MathCollectTrue
+% \DescribeMacro\MathCollectFalse
+% \DescribeMacro\m@th
+% \DescribeMacro\SuspendTagging
+% These commands can be used to control locally the tagging of math.
+% The first two are new commands. |\m@th| is a standard \LaTeX\ command
+% used in a number of places to set |\mathsurround| to zero;
+% with active tagging it is also used to identify math
+% that should not be tagged, because it has traditionally be used in exactly
+% the places where math mode is used for its layout charactistics and not for
+% representing a formula.\footnote{This way even code that is not adjusted up
+% for tagging is handled correctly if it uses \cs{m@th}.}.
+% Details are described below.
+% (|\SuspendTagging| is documented in source2e.pdf.)
+%
+% To set |\mathsurround| without disabling math tagging, use |\mathsurround\z@| directly.
+%
+%
+% \subsubsection{Using the trigger token \cs{m@th} \emph{inside} the math}
+%
+% If the grabbed math contains the token |\m@th| the tagging/processing
+% of the math is suppressed. As the math is nevertheless grabbed, this requires
+% that the end math shift token is not hidden in some other command.
+% |\m@th| sets also |\mathsurround| to zero, which is often
+% wanted in untagged math anyway.
+%
+% Text tagging is \emph{not} suppressed inside the math, e.g.,
+% |\mbox{\emph{text}}| will still create an Em-structure.
+% In contrast nested math is not tagged.
+%
+% To suppress the text tagging |\SuspendTagging{}| can be used:
+% \begin{itemize}
+% \item no math tagging, but |\emph| is tagged:\\
+% |$\m@th\langle\mbox{\emph{if and only if} $x=y$}\rangle$|
+%
+% \item no internal tagging:
+% \\
+% |$\m@th\SuspendTagging{}\langle\mbox{\emph{if and only if}} $x=y$}\rangle$|
+% \end{itemize}
+%
+% The method is quite suitable for symbols and also for sub- and superscripts
+% (as long as they don't contain nested math that should be tagged).
+%
+%
+% \subsubsection{Using \cs{m@th} \emph{before} the opening \texttt{\$}}
+%
+% |\m@th| (as defined in the latex-lab-math code) sets also the internal boolean
+% which controls the grabbing to true and so when it is used \emph{before}
+% some math it disables math grabbing and tagging for all following math
+% in the current group (including nested math).
+% Text tagging inside the math is still active, it can be disabled as above
+% with |\SuspendTagging{}|.
+%
+% When |\m@th| is used like this it is possible to reenable the math
+% tagging of nested math, by adding |\MathCollectTrue| after the opening |$|.
+%
+% \begin{itemize}
+% \item no math tagging, but |\emph| is tagged:\\
+% |{\m@th$\langle\mbox{\emph{if and only if} $x=y$}\rangle$}|
+%
+% \item both nested math and |\emph| is tagged:\\
+% |{\m@th$\MathCollectTrue\langle\mbox{\emph{if and only if} $x=y$}\rangle$}|
+% \end{itemize}
+%
+% The method is suitable for symbols and sub- and superscripts too
+% (it is actually how superscripts avoid math tagging currently).
+% It can also be used in cases where the end math shift token is
+% hidden in some other command. But it is not so useful for
+% larger boxes as it sets |\mathsurround| to zero.
+% Grouping should be used to avoid side-effects on following math.
+%
+%
+%\subsubsection{Disabling math tagging with \cs{MathCollectFalse}}
+%
+% Without a side-effect on |\mathsurround| the math grabbing can be
+% suppressed and reenabled by setting the boolean that controls the collecting.
+% So in the following example the math in the |\mbox| is properly tagged,
+% but the angled brackets are simple text.
+%
+% \begin{verbatim}
+% %stop math grabbing
+% \MathCollectFalse
+% $
+% %(optional) restart math grabbing for nested math
+% \MathCollectTrue
+% \langle\mbox{\emph{if and only if}} $x=y$}\rangle
+% $
+% %(optional) restart math grabbing for following math
+% % if there is no grouping
+% \MathCollectTrue
+% \quad $x=1$
+% \end{verbatim}
+% The method is suitable if a box should be centered with
+% |\vcenter| (and is used in array.sty for the tabular code).
+%
+% \section{Math capture interfaces}
+%
% \subsection{Code level interfaces}
%
% \begin{function}{\math_register_env:n, \math_register_env:nn}
@@ -164,6 +300,15 @@
% \end{itemize}
% \end{function}
%
+% \begin{function}{\MathCollectTrue,\MathCollectFalse}
+% \begin{syntax}
+% \cs{MathCollectTrue}\\
+% \cs{MathCollectFalse}
+% \end{syntax}
+% This activates/deactivates the math collection of the math shift token.
+% See above for cases when this can be usefull.
+% \end{function}
+%
% \section{Math tagging}
%
% \subsection{Code requirements}
@@ -184,8 +329,6 @@
% \item setup attributes
% \item add associated files
% \item add a Formula structure
-% \item surround subparts (e.g., lines) with Formula sub structures
-% (perhaps with their own set of additional content)
% \item surround elements of the equation with mathml structure elements
% (currently only luatex with luamml)
% \end{itemize}
@@ -215,14 +358,11 @@
% and so can be used to suppress a setting).
% \item |tagsupport/math/struct/begin| This calls \cs{tag_struct_begin:n}.
% It should also write the associated files if needed.
-% \item |tagsupport/math/substruct/begin| this handles subparts.
-% TODO: does it really make sense in inline math to have that??
% \end{itemize}
% \item |tagsupport/math/inline/formula/end|
% This socket ends the formula structure(s). The |default|
-% plug calls these internal sockets:
+% plug calls this internal socket:
% \begin{itemize}
-% \item |tagsupport/math/substruct/end|
% \item |tagsupport/math/struct/end|
% \end{itemize}
% \end{itemize}
@@ -326,22 +466,22 @@
%
% \subsection{Automatic mathml creation with luamml}\label{sec:luamml}
%
-% If lualatex and the package \pkg{unicode-math} is used
-% the package \texttt{luamml} is loaded and
-% will automatically generate the file |\jobname-luamml-mathml.html|
+% If lualatex and the package \pkg{unicode-math} is used,
+% the package \texttt{luamml} is loaded and this package
+% will then automatically generate the file |\jobname-luamml-mathml.html|
% with mathml representations of all math formulas.
% This file is then used in subsequent compilations and works also with
% pdflatex.
-%
+%
% The generation of the file can be suppressed (in the preamble)
% with |math/mathml/luamml/write=false|.
-%
-% If the package \pkg{unicode-math} is not used,
+%
+% If the package \pkg{unicode-math} is not used,
% the loading of \pkg{luamml} and with it the generation of the file can be forced
% with |math/mathml/luamml/load=true| or |math/mathml/luamml/write=true|
% but be aware that it is then possible that various symbols
% are mapped to the wrong Unicode code points.
-%
+%
% The package \pkg{luamml} is still quite experimental and the output should be checked.
% The |\jobname-luamml-mathml.html| file may be previewed in a browser although
% you may need to add additional css or javascript declarations
@@ -445,7 +585,7 @@
% \item[reading and embedding]
% By default the code will read and embed
% mathml from |\jobname-mathml.html| and |\jobname-luamml-mathml.html| in this order and
-% the first fragment with a new hash value will be inserted.%
+% the first fragment with a new hash value will be inserted.
% The list of sources and their order can be changed with the key
% |math/mathml/sources|, setting that to an empty value suppresses
% the loading mathml associated files completely. For efficiency reasons
@@ -461,7 +601,7 @@
% equations with the same source and so the same hash
% can have different mathml representation, e.g.,
% if there are references or commands or counters in the equation. This
-% will change in a feature version.
+% will change in a future version.
% The attachment can be suppressed locally with |math/mathml/AF=false|.
% The mathml fragment will still be embedded in the PDF!
%
@@ -519,14 +659,14 @@
% and |equation*| (see, e.g., tagging-project issue \#30).
%
% \item Begin and end of the math or math environment can not be hidden in commands.
-% For example \verb+>{$}l<{$}+ in a tabular would lead to errors.
-% Defining |\[| to fall back to |equation*| doesn't work if |equation*| is
-% a grabbing environment.
-%
-% \item The behaviour of |\[...\]| is faulty. See above.
+% For example \verb+>{$}l<{$}+ in a tabular would lead to errors. Therefore
+% in a tabular a slower token-by-token grabbing is used.
% \end{enumerate}
%
% \subsection{Fake math}
+% For the current state see \ref{sec:nocapture} above. The text here is mainly
+% kept for history.
+%
% In a number of places in \LaTeX{} math commands (mainly |$|) is used
% only for technical reason, e.g., to access a math font, to setup a symbol
% or to use \cs{vcenter}.
@@ -559,7 +699,7 @@
% \end{itemize}
%
% \subsubsection{Open problems}
-%
+%
% \begin{enumerate}
% \item The grabbing code doesn't pass the info that it detected a \cs{m@th} token.
% This means that the tagging code has to do the same check (and doesn't do this
@@ -639,7 +779,6 @@
%
% \subsection{File declaration}
%
-% \car{Change description here?}
% \begin{macrocode}
\ProvidesFile{latex-lab-math.ltx}
[\ltlabmathdate\space
@@ -660,7 +799,8 @@
%
% Loading \pkg{amsmath} is an absolute requirement: this avoids needing to
% have conditional definitions and deals with how to define \cs{[}/\cs{]}
-% neatly.
+% neatly. The package is loaded at begin document to allow user to load it with
+% options.
% \begin{macrocode}
\AddToHook{begindocument/before}{ \RequirePackage { amsmath } }
% \end{macrocode}
@@ -678,6 +818,7 @@
% \end{macrocode}
% \end{variable}
%
+%
% \begin{variable}{\l_@@_fakemath_bool}
% Tracks whether math mode material has been identified as fake math during
% the grabbing phase, which happens currently if the
@@ -875,7 +1016,7 @@
{
<!DOCTYPE~html>
\iow_newline:
- <html>
+ <html~ xmlns="http://www.w3.org/1999/xhtml">
\iow_newline:
}
\tl_new:N \l_@@_mathml_write_before_tl
@@ -953,109 +1094,12 @@
% \begin{macrocode}
\sys_if_engine_luatex:TF
{
-% \end{macrocode}
-% Temporary (!) fixes for endarray
-% \begin{macrocode}
- \cs_new_protected:Npn \@@_correct_luamml_array_patches:
- {
- \AddToHook{package/array/after}
- {
- \cs_set:Npn \endarray
- {
- \tbl_crcr:n{endarray}
- \__luamml_array_save_array:
- \egroup
- \UseTaggingSocket{tbl/finalize}
- \tbl_restore_outer_cell_data:
- \egroup
- \mode_if_math:T { \__luamml_array_finalize_array: }
- \@arrayright
- \gdef \@preamble {}
- }
- \cs_set:Npn \@classz
- {
- \@classx
- \@tempcnta \count@
- \prepnext@tok
- \@addtopreamble {
- \ifcase \@chnum
- \hfil
- \hskip 1sp
- \d@llarbegin
- \cs_if_eq:NNTF \d@llarbegin \begingroup {
- \insert@column
- \d@llarend
- } {
- \__luamml_array_init_col:
- \insert@column
- \luamml_flag_save:nn {} {mtd}
- \d@llarend
- \__luamml_array_finalize_col:w 0~
- }
- \do@row@strut
- \hfil
- \or
- \hskip 1sp
- \d@llarbegin
- \cs_if_eq:NNTF \d@llarbegin \begingroup {
- \insert@column
- \d@llarend
- } {
- \__luamml_array_init_col:
- \insert@column
- \luamml_flag_save:nn {} {mtd}
- \d@llarend
- \__luamml_array_finalize_col:w 1~
- }
- \do@row@strut
- \hfil
- \or
- \hfil
- \hskip 1sp
- \d@llarbegin
- \cs_if_eq:NNTF \d@llarbegin \begingroup {
- \insert@column
- \d@llarend
- } {
- \__luamml_array_init_col:
- \insert@column
- \luamml_flag_save:nn {} {mtd}
- \d@llarend
- \__luamml_array_finalize_col:w 2~
- }
- \do@row@strut
- \or
- \setbox \ar@mcellbox \vbox \@startpbox { \@nextchar }
- \insert@pcolumn
- \@endpbox
- \ar@align@mcell
- \do@row@strut
- \or
- \vtop \@startpbox { \@nextchar }
- \insert@pcolumn
- \@endpbox
- \do@row@strut
- \or
- \vbox \@startpbox { \@nextchar }
- \insert@pcolumn
- \@endpbox
- \do@row@strut
- \fi
- }
- \prepnext@tok
- }
- }
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
\AddToHook{begindocument/before}
{
\str_case:on \g_@@_luamml_load_tl
{
{ 1 } {
\RequirePackage { luamml }
- \@@_correct_luamml_array_patches:
\AddToHook{begindocument/end}
{
\@@_luamml_activate_write:
@@ -1073,7 +1117,6 @@
\@ifpackageloaded { unicode-math }
{
\RequirePackage { luamml }
- \@@_correct_luamml_array_patches:
\AddToHook{begindocument/end}
{
\@@_luamml_activate_write:
@@ -1086,7 +1129,10 @@
}
}
{
- \@@_provide_luamml_commands:
+ \AddToHook{begindocument/before}
+ {
+ \@@_provide_luamml_commands:
+ }
}
\msg_new:nnn { tag }{ luamml-status }
{
@@ -1113,8 +1159,6 @@
\bool_gset_true:N\g__tag_math_mathml_AF_bool
\AssignSocketPlug{tagsupport/math/struct/begin}{mathml-AF}
\AssignSocketPlug{tagsupport/math/struct/end}{mathml-AF}
- \AssignSocketPlug{tagsupport/math/substruct/begin}{single}
- \AssignSocketPlug{tagsupport/math/substruct/end}{single}
\int_set:Nn \l__luamml_pretty_int { 7 }
\RegisterFamilyMapping\symsymbols{oms}
\RegisterFamilyMapping\symletters{oml}
@@ -1126,6 +1170,14 @@
{
\tl_if_empty:NF \l_@@_mathml_write_before_tl
{
+% \end{macrocode}
+% We check here if the current group level is equal to the one stored for the
+% outer math. If not, we add currently a suffix to change the hash.
+% \changes{0.6k}{2024-12-04}{Test for current group level}
+% \begin{macrocode}
+ \int_compare:nNnF
+ { \@math@level } = { 1 }
+ { \tl_put_right:Ne \l_@@_content_hash_tl {-INNER} }
\iow_now:Ne \g_@@_luamml_iow
{
\l_@@_mathml_write_before_tl
@@ -1191,7 +1243,7 @@
math/mathml/luamml/load .default:n = true,
math/mathml/luamml/load .usage:n=preamble,
% \end{macrocode}
-% A key to activate math structure elements.
+% A key to activate math structure elements.
% \changes{v0.6j}{2024-11-19}{no longer enable globally for better fake math handling, issue \#764}
% \begin{macrocode}
math/mathml/structelem .choice:,
@@ -1210,7 +1262,7 @@
\cs_set_eq:NN\@@_luamml_structelem:\prg_do_nothing:
\cs_set_eq:NN\@@_luamml_ignore:\prg_do_nothing:
},
- math/mathml/structelem .default:n = true,
+ math/mathml/structelem .default:n = true,
% \end{macrocode}
% and a key to call the ignore flag. This should only be used locally.
% \begin{macrocode}
@@ -1252,7 +1304,7 @@
\iow_now:Ne \g_@@_writedummy_iow
{
\l_@@_mathml_write_before_tl
- <math></math>
+ <math~ xmlns="http://www.w3.org/1998/Math/MathML"></math>
\c_@@_mathml_write_after_tl
}
}
@@ -1322,11 +1374,6 @@
\typeout{Info:~Activating~mathml~support}
\AssignSocketPlug{tagsupport/math/struct/begin}{mathml-AF}
\AssignSocketPlug{tagsupport/math/struct/end}{mathml-AF}
-% \end{macrocode}
-% mathml handling doesn't like subparts, so we disable them for now:
-% \begin{macrocode}
- \AssignSocketPlug{tagsupport/math/substruct/begin}{single}
- \AssignSocketPlug{tagsupport/math/substruct/end}{single}
\AddToHook{enddocument/info}
{
\iow_term:n{MathML~statistic}
@@ -1419,6 +1466,59 @@
}
% \end{macrocode}
%
+% \subsubsection{Meta keys}
+% The |math/setup| key accepts a list with the values |mathml-SE|, |mathml-AF| and |tex-AF|.
+% It is a fast way to set the main option. It at first disables them all, to get a clean state.
+% \begin{macrocode}
+\keys_define:nn {__tag / setup}
+ {
+ math/setup .code:n =
+ {
+ %deactivate loading of luamml
+ \tl_gset:Nn \g_@@_luamml_load_tl{-1}
+ \keys_set:nn {__tag / setup}
+ {
+ %deactivate tex source AF
+ math/tex/AF = false,
+ %deactivate reading of mathml-AF
+ math/mathml/sources=,
+ math/mathml/AF=false,
+ %deactivate structelem
+ math/mathml/structelem=false,
+ %handle value
+ }
+ \clist_map_inline:nn { #1}
+ {
+ \keys_set:nn {__tag/ setup}{math/__setup/##1}
+ }
+ },
+ math/__setup / mathml-SE .code:n =
+ {
+ \tl_gset:Nn \g_@@_luamml_load_tl{1}
+ \keys_set:nn {__tag / setup}
+ {
+ math/mathml/structelem=true
+ }
+ },
+ math/__setup / mathml-AF .code:n =
+ {
+ \tl_gset:Nn \g_@@_luamml_load_tl{1}
+ \clist_put_right:Ne\l__tag_math_mathml_files_clist
+ {\c_sys_jobname_str-mathml,\c_sys_jobname_str-luamml-mathml}
+ \keys_set:nn {__tag / setup}
+ {
+ math/mathml/AF=true
+ }
+ },
+ math/__setup / tex-AF .code:n =
+ {
+ \keys_set:nn {__tag / setup}
+ {
+ math/tex/AF =true
+ }
+ },
+ }
+% \end{macrocode}
% \subsection{Sockets}
% \subsubsection{Main inline math sockets}
%
@@ -1429,6 +1529,7 @@
% tagsupport/math/inline/formula/begin,
% tagsupport/math/inline/formula/end,
% }
+% These sockets are already declared in lttagging and only documented here.
% The first two sockets are meant to embed inline
% math into the surrounding (so to close/reopen, e.g., MC-chunks).
% The other two implement the actual formula structure.
@@ -1438,10 +1539,10 @@
% \changes{v0.6j}{2024-11-19}{change the socket to two arguments so that it can
% be used as tagging socket}
% \begin{macrocode}
-\socket_new:nn {tagsupport/math/inline/begin}{0}
-\socket_new:nn {tagsupport/math/inline/end}{0}
-\socket_new:nn {tagsupport/math/inline/formula/begin}{2} %
-\socket_new:nn {tagsupport/math/inline/formula/end}{0}
+%\socket_new:nn {tagsupport/math/inline/begin}{0}
+%\socket_new:nn {tagsupport/math/inline/end}{0}
+%\socket_new:nn {tagsupport/math/inline/formula/begin}{2} %
+%\socket_new:nn {tagsupport/math/inline/formula/end}{0}
% \end{macrocode}
%\end{socketdecl}
%
@@ -1474,11 +1575,6 @@
\@@_luamml_structelem:
\tag_socket_use:n{math/content}
\tag_socket_use:n{math/struct/begin}
-% \end{macrocode}
-% TODO: does inline math need subformula handling?
-% \begin{macrocode}
- % inner formula if multiple parts (not really implemented yet)
- \tag_socket_use:n{math/substruct/begin}
#2
\tag_socket_use:n{math/end}
}
@@ -1486,7 +1582,6 @@
{tagsupport/math/inline/formula/end}
{default}
{
- \socket_use:n{tagsupport/math/substruct/end}
\socket_use:n{tagsupport/math/struct/end}
}
% \end{macrocode}
@@ -1501,6 +1596,7 @@
% tagsupport/math/display/formula/begin,
% tagsupport/math/display/formula/end,
% }
+% These sockets are already declared in lttagging and only documented here.
% The first two sockets are meant to embed display
% math into the surrounding (so to close/reopen, e.g., MC-chunks and
% P-structure).
@@ -1510,10 +1606,10 @@
% the end socket is after the math!
% \changes{v0.6j}{2024-11-19}{change number of arguments of formula/begin socket}
% \begin{macrocode}
-\socket_new:nn {tagsupport/math/display/begin}{0}
-\socket_new:nn {tagsupport/math/display/end}{0}
-\socket_new:nn {tagsupport/math/display/formula/begin}{2} %
-\socket_new:nn {tagsupport/math/display/formula/end}{0}
+%\socket_new:nn {tagsupport/math/display/begin}{0}
+%\socket_new:nn {tagsupport/math/display/end}{0}
+%\socket_new:nn {tagsupport/math/display/formula/begin}{2} %
+%\socket_new:nn {tagsupport/math/display/formula/end}{0}
% \end{macrocode}
%\end{socketdecl}
@@ -1543,7 +1639,6 @@
\@@_luamml_structelem:
\tag_socket_use:n{math/content}
\tag_socket_use:n{math/struct/begin}
- \tag_socket_use:n{math/substruct/begin}
#2
\tag_socket_use:n{math/end}
}
@@ -1551,12 +1646,52 @@
{tagsupport/math/display/formula/end}
{default}
{
- \socket_use:n{tagsupport/math/substruct/end}
\socket_use:n{tagsupport/math/struct/end}
}
% \end{macrocode}
% \end{plugdecl}
%
+% \subsubsection{Sockets plugs for tags (labels)}
+% \begin{socketdecl}
+% {
+% tagsupport/math/display/tag/begin,
+% tagsupport/math/display/tag/end,
+% }
+% These sockets are already declared in lttagging and only documented here.
+% These sockets are used in \cs{maketag@@@} to tag
+% labels as Lbl. luamml changes the plug to move
+% the Lbl into the math structure with an intent.
+% \changes{v0.6l}{2025-02-06}{added sockets for tags/labels}
+% \begin{macrocode}
+%\socket_new:nn {tagsupport/math/display/tag/begin}{0}
+%\socket_new:nn {tagsupport/math/display/tag/end}{0}
+% \end{macrocode}
+%\end{socketdecl}
+%
+% \begin{plugdecl}{default}
+% \changes{v0.6j}{2024-11-19}{moved \cs{tagpdfparaOff} into the socket, tagging/765}
+% \begin{macrocode}
+\socket_new_plug:nnn
+ {tagsupport/math/display/tag/begin}
+ {default}
+ {
+ \tag_mc_end:
+ \tag_struct_begin:n {tag=Lbl}
+ \tag_mc_begin:n {}
+ }
+\socket_new_plug:nnn
+ {tagsupport/math/display/tag/end}
+ {default}
+ {
+ \tag_mc_end:
+ \tag_struct_end:
+ \tag_mc_begin:n{}
+ }
+\socket_assign_plug:nn {tagsupport/math/display/tag/begin}{default}
+\socket_assign_plug:nn {tagsupport/math/display/tag/end}{default}
+% \end{macrocode}
+% \end{plugdecl}
+%
% \subsubsection{Internal sockets}
%
% \begin{variable}{\l_@@_content_template_tl}
@@ -1700,11 +1835,13 @@
actualtext = \l_@@_content_actual_tl,
alt = \l_@@_content_alt_tl
}
+ \typeout{====>grabbed~math=\meaning\g_@@_grabbed_math_tl}
+ \tag_mc_begin:n{}
}
\socket_new_plug:nnn
{tagsupport/math/struct/end}
{default}
- { \tag_struct_end: }
+ { \tag_mc_end: \tag_struct_end: }
\socket_assign_plug:nn {tagsupport/math/struct/begin}{default}
\socket_assign_plug:nn {tagsupport/math/struct/end}{default}
@@ -1783,6 +1920,8 @@
title-o = \g_@@_grabbed_env_tl, %
alt = \l_@@_content_alt_tl
}
+ \typeout{====>grabbed~math=\meaning\g_@@_grabbed_math_tl}
+ \tag_mc_begin:n{}
}
% \end{macrocode}
% not really needed but looks more symmetric:
@@ -1791,59 +1930,12 @@
{tagsupport/math/struct/end}
{mathml-AF}
{
+ \tag_mc_end:
\tag_struct_end:
}
% \end{macrocode}
% \end{plugdecl}
%
-% \begin{socketdecl}{tagsupport/math/substruct/begin,
-% tagsupport/math/substruct/end}
-% This holds the code to handle subparts of the formula.
-% \begin{macrocode}
-\socket_new:nn {tagsupport/math/substruct/begin}{0}
-\socket_new:nn {tagsupport/math/substruct/end}{0}
-% \end{macrocode}
-% \end{socketdecl}
-%
-% \begin{plugdecl}{default}
-% \begin{macrocode}
-\socket_new_plug:nnn
- {tagsupport/math/substruct/begin}
- {default}
- { \grabaformulapartandstart }
-\socket_new_plug:nnn
- {tagsupport/math/substruct/end}
- {default}
- {
- \tagmcend
- \if@subformulas
- \tagstructend
- \fi
- }
-\socket_assign_plug:nn {tagsupport/math/substruct/begin}{default}
-\socket_assign_plug:nn {tagsupport/math/substruct/end}{default}
-% \end{macrocode}
-% \end{plugdecl}
-
-% \begin{plugdecl}{single}
-% We need an option to disable subparts as it is unclear
-% if consumers can handle them:
-% \begin{macrocode}
-\socket_new_plug:nnn
- {tagsupport/math/substruct/begin}
- {single}
- {
- \typeout{====>subpart~splitting~deactivated}
- \typeout{====>grabbed~math=\meaning\g_@@_grabbed_math_tl}
- \tag_mc_begin:n{}
- }
-\socket_new_plug:nnn
- {tagsupport/math/substruct/end}
- {single}
- { \tag_mc_end:}
-% \end{macrocode}
-% \end{plugdecl}
-%
% \begin{socketdecl}{tagsupport/math/end}
% A socket used at the end of the math (before the closing dollar(s))
% which can, e.g., set a flag for luamml.
@@ -1903,6 +1995,13 @@
%
% \subsection{Content grabbing}
%
+% \begin{macro}{\MathCollectTrue,\MathCollectFalse}
+% \begin{macrocode}
+\cs_set_protected:Npn\MathCollectTrue{\bool_set_false:N \l__math_collected_bool}
+\cs_set_protected:Npn\MathCollectFalse{\bool_set_true:N \l__math_collected_bool}
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\@@_grab_dollar:w}
% \begin{macro}{\@@_grab_dollar:n}
% \changes{v0.6c}{2024-08-22}{Correct handling of empty math segments}
@@ -1991,30 +2090,54 @@
% \ShowTagging{struct-stack}
\para_raw_end:
% \end{macrocode}
-% The \cs{postdisplaypenalty} was temporarily set to 10000 inside
-% the display and the \cs{belowdisplayskip} and the
+% The \cs{postdisplaypenalty} was temporarily set
+% to 10000 inside the display and the \cs{belowdisplayskip} and the
% \cs{belowdisplayshortskip} was negated, so whatever was inserted
-% it should have been a negative skip. Whatever skip was added we
-% pick it ups value up here, so that we can correct the spacing
-% after the tagging code was inserted.
+% it should have been a negative skip. Whatever
+% was added, we pick up the value up, so that we can correct
+% the spacing after the tagging code was inserted.
% \begin{macrocode}
\l_@@_tmpa_skip \lastskip
\tag_socket_use:n{math/display/formula/end}
% \end{macrocode}
-% Now we add a skip without indroducing a page break possibility,
+% Now we add a skip without introducing a page break possibility,
% that should bring the current vertical position back to the point
% where \TeX{} would add the penalty and the \enquote{below skip}.
% \changes{v0.6f}{2024-09-30}{Correct logic for inserting below skips
% after displays (tagging/721)}
% \begin{macrocode}
\nobreak
- \skip_vertical:n { -\l_@@_tmpa_skip } % remove the negative belowdisplayskip
+ \skip_vertical:n { -\l_@@_tmpa_skip }
% \end{macrocode}
-% Then we finally add the real stuff:
+% Then we finally add the real stuff: the true \cs{postdisplaypenalty}
+% and then negated value of skip we saved from above. It may look
+% strange that we have two identical negated skips next to each
+% other, but if you think about it, that is correct: the first
+% cancels the \enquote{below skip} that \TeX{} had added and the
+% second puts the same amount after the penalty (which is where it
+% should be).
% \begin{macrocode}
\penalty \postdisplaypenalty
\skip_vertical:n { -\l_@@_tmpa_skip } % insert the correct skip
- \@doendpe % this has no \end{...} to take care of it
+% \end{macrocode}
+% As we are now in vertical mode the situation is different from
+% the way \TeX{} would handle things after a display: \TeX{} would
+% internally switch to horizontal mode without adding a
+% \cs{parskip}. But this is not possible to do on the macro
+% level. Therefore we have to neutralize the upcoming \cs{parskip}
+% since we can't prevent it from being set.
+% \changes{v0.6k}{2024/12/01}{Handle \cs{parskip} after \texttt{\$\$}
+% display correctly (tagging/762)}
+% \begin{macrocode}
+% \typeout{------->~ add~ negative~ parskip~ (to~ cancel~ the~
+% one~ that~ TeX~ will~ add)}
+ \skip_vertical:n { -\tex_parskip:D }
+% \end{macrocode}
+%
+% We also set the \texttt{@domathendpetrue} flag to signal that the
+% \begin{macrocode}
+ \@domathendpetrue
+ \@doendpe % this has no \end{...} to take care of it
}
% \end{macrocode}
@@ -2240,7 +2363,7 @@
% \begin{macro}{\math_register_env:n}
% \begin{macro}{\RegisterMathEnvironment}
% Set up to capture environment content and make available.
-%
+% \changes{0.6k}{2024-12-04}{Store the current grouplevel for luamml }
% \begin{macrocode}
\cs_new_protected:Npn \math_register_env:nn #1#2
{
@@ -2275,7 +2398,10 @@
{
}
}
-
+% \end{macrocode}
+% \changes{v0.6k}{2024/12/04}{Add tagging sockets for luamml support}
+% \changes{v0.6k}{2024/12/04}{Store the current grouplevel for luamml }
+% \begin{macrocode}
\cs_new_protected:Npn \math_register_halign_env:nn #1#2
{
\tl_set:Nn \l_@@_env_name_tl {#1}
@@ -2311,6 +2437,7 @@
}
% \end{macrocode}
% TODO: the following command is neither documented nor used. Is is needed?
+% TODO: if it is ever used in needs to set the current group level too.
% \begin{macrocode}
\cs_new_protected:Npn \math_register_odd_env:nn #1#2
{
@@ -2349,22 +2476,6 @@
}
-% FMi: compare with block change!
-%
-% \DeclareRobustCommand*\begin[1]{%
-% \UseHook{env/#1/before}%
-% \@ifundefined{#1}%
-% {\def\reserved@a{\@latex@error{Environment #1 undefined}\@eha}}%
-% {\def\reserved@a{\def\@currenvir{#1}%
-% \edef\@currenvline{\on@line}%
-% \@execute@begin@hook{#1}%
-% \csname #1\endcsname}}%
-% \@ignorefalse
-% \begingroup
-% \@endpefalse % tmp!!! is it ok to drop this here?
-% \reserved@a}
-
-
\cs_new:Npn \@kernel@math@registered@begin {
% \ShowTagging{struct-stack}
%\typeout{==>A1}\ShowTagging{struct-stack,mc-current}
@@ -2589,25 +2700,14 @@
% \end{macrocode}
%
% Tabulars currently contain a \$ that shouldn't trigger math
-% tagging.
+% tagging. Also we do need to change the grabbing method to the slow
+% loop-method.
% \begin{macrocode}
\RequirePackage{array}
-\tl_if_in:NnT\@tabular{$}
+\tl_if_exist:NT\@kernel@tabular@init
{
- \def\@tabular{%
- \leavevmode
- \UseTaggingSocket{tbl/hmode/begin}%
- \hbox \bgroup
- \bool_set_true:N \l_@@_collected_bool
- $
- \bool_set_false:N \l_@@_collected_bool
- \col@sep\tabcolsep \let\d@llarbegin\begingroup
- \let\d@llarend\endgroup
-% \end{macrocode}
-% A proper switching mechanism is needed: for the present, do directly.
-% \begin{macrocode}
- \cs_set_protected:Npn \@@_grab_dollar:w { \@@_grab_dollar_loop: }
- \@tabarray}
+ \tl_put_right:Nn\@kernel@tabular@init
+ {\cs_set_protected:Npn \@@_grab_dollar:w { \@@_grab_dollar_loop: }}
}
% \end{macrocode}
%
@@ -2624,388 +2724,58 @@
% \end{macrocode}
% \end{macro}
%
-% \subsection{Disable math grabbing in the begindocument hook}
-% For example amsart uses math to measure text there.
-%
-% \begin{macrocode}
-\tl_gput_right:Nn\@kernel@before@begindocument
- {
- \bool_set_true:N\l_@@_collected_bool
- }
-\tl_gput_right:Nn\@kernel@after@begindocument
- {
- \bool_set_false:N\l_@@_collected_bool
- }
-% \end{macrocode}
+% \subsection{Modifying kernel commands}
%
-% \subsection{Modifying \pkg{amsmath}}
+% \begin{macro}{\mathpalette}
+% The \cs{mathpalette} command is a problem if lualatex is used and math
+% structure elements are created as the math is then processed more than once.
+% We therefore redefine it to use \cs{mathstyle}.
%
-% \begin{macro}{\@@_amsmath_align@:nn}
-% \begin{macro}
-% {
-% \@@_amsmath_gather@:n ,
-% \@@_amsmath_multline@:n
-% }
-% \begin{macro}{\align@}
-% \begin{macro}{\gather@, \multline@}
-% Mark up all of the display environments as the content is captured anyway.
-% We then use an internal macro in each environment type to insert the
-% processing code. Each of these is slightly different, so we cannot use a
-% simple loop here. The test for \cs{split@tag} is required as the
-% \texttt{split} environment internally uses \texttt{gather} \emph{when not
-% within an \pkg{amsmath}} environment, for example inside \texttt{equation}.
-% Without the precaution, we'd get two copies of the grabbed math, the second
-% of which would start with \cs{split@tag}.
% \begin{macrocode}
-
-
-
-\tl_gput_right:Nn \@kernel@before@begindocument {
-%
-\renewenvironment{gather*}{%
- \start@gather\st@rredtrue
-}
-{%
-% this redirection doesn't work if we alter "gather"!
- % \endgather
-% so replace it with its real meaning
- \math@cr \black@\totwidth@ \egroup
- $$\ignorespacesafterend
-}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\def\common@align@ending {
- \math@cr \black@\totwidth@
- \egroup
- \ifingather@
- \restorealignstate@
- \egroup
- \nonumber
- \ifnum0=`{\fi\iffalse}\fi
- \else
- $$%
- \fi
- \ignorespacesafterend
-}
-\renewenvironment{alignat}{%
- \start@align\z@\st@rredfalse
-}{%
- \common@align@ending
-}
-\renewenvironment{alignat*}{%
- \start@align\z@\st@rredtrue
-}{%
- \common@align@ending
-}
-\renewenvironment{xalignat}{%
- \start@align\@ne\st@rredfalse
-}{%
- \common@align@ending
-}
-\renewenvironment{xalignat*}{%
- \start@align\@ne\st@rredtrue
-}{%
- \common@align@ending
-}
-\renewenvironment{xxalignat}{%
- \start@align\tw@\st@rredtrue
-}{%
- \common@align@ending
-}
-\renewenvironment{align}{%
- \start@align\@ne\st@rredfalse\m@ne
-}{%
- \common@align@ending
-}
-\renewenvironment{align*}{%
- \start@align\@ne\st@rredtrue\m@ne
-}{%
- \common@align@ending
-}
-\renewenvironment{flalign}{%
- \start@align\tw@\st@rredfalse\m@ne
-}{%
- \common@align@ending
-}
-\renewenvironment{flalign*}{%
- \start@align\tw@\st@rredtrue\m@ne
-}{%
- \common@align@ending
-}
-%
-\renewenvironment{multline*}{\start@multline\st@rredtrue}
-{%
- \iftagsleft@ \@xp\lendmultline@ \else \@xp\rendmultline@ \fi
- \ignorespacesafterend
-}
-% \end{macrocode}
-% Also for "false?"
-% \begin{macrocode}
-\def\measuring@true{\let\ifmeasuring@\iftrue\tag_suspend:n{\measuring}}
-% \end{macrocode}
-%
-% \begin{macrocode}
-%
- \math_register_halign_env:nn {align}{}
- \math_register_halign_env:nn {align*}{}
- \math_register_halign_env:nn {alignat}{}
- \math_register_halign_env:nn {alignat*}{}
- \math_register_halign_env:nn {flalign}{}
- \math_register_halign_env:nn {flalign*}{}
- \math_register_halign_env:nn {gather}{}
- \math_register_halign_env:nn {gather*}{}
- \math_register_halign_env:nn {multline}{}
- \math_register_halign_env:nn {multline*}{}
- \math_register_halign_env:nn {xalignat}{}
- \math_register_halign_env:nn {xalignat*}{}
- \math_register_halign_env:nn {xxalignat}{}
- %
- \@namedef{maketag @ @ @} #1{%
-% \typeout{--->maketag @ @ @}
- \ifmeasuring@
- \hbox{\m@th\normalfont#1}%
- \else
- \tagmcend \tagstructbegin{tag=Lbl}%
- \tagmcbegin{tag=Lbl}%
- \hbox{\m@th\normalfont#1}%
- \tagmcend \tagstructend \tagmcbegin{}%
- \fi
+\sys_if_engine_luatex:T
+ {
+ \def\mathpalette#1#2{%
+ \ifcase\mathstyle
+ #1\displaystyle{#2}\or
+ #1\displaystyle{#2}\or
+ #1\textstyle{#2}\or
+ #1\textstyle{#2}\or
+ #1\scriptstyle{#2}\or
+ #1\scriptstyle{#2}\or
+ #1\scriptscriptstyle{#2}\or
+ #1\scriptscriptstyle{#2}
+ \fi}
}
% \end{macrocode}
+% \end{macro}
%
%
+% \begin{macro}{\mathsm@sh}
+% Similar to the phantom commands in latex-lab-text, \cs{mathsm@sh} must be
+% redefined to include luamml sockets.
% \begin{macrocode}
-\@namedef{math@cr @ @ @ gather}{%
- \ifst@rred\nonumber\fi
- &\relax
- \make@display@tag
-%
- \maybestartnewformulatag
-%
- \ifst@rred\else\global\@eqnswtrue\fi
- \global\advance\row@\@ne
- \cr
-}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\@namedef{math@cr @ @ @ align}{%
- \ifst@rred\nonumber\fi
- \if@eqnsw \global\tag@true \fi
- \global\advance\row@\@ne
- \add@amps\maxfields@
- \omit
- \kern-\alignsep@
- \iftag@
- \setboxz@h{\@lign\strut@{\make@display@tag}}%
- \place@tag
- \fi
-%
- \maybestartnewformulatag
-%
- \ifst@rred\else\global\@eqnswtrue\fi
- \global\lineht@\z@
- \cr
-}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\def\restore@math@cr{\@namedef{math@cr @ @ @}{
-%
- \maybestartnewformulatag
-%
- \cr}}
-\restore@math@cr
-% \end{macrocode}
-%
-% \begin{macrocode}
-}
+\def\mathsm@sh#1#2{%
+ \setbox\z@\hbox{$\m@th#1{#2}
+ \UseTaggingSocket{math/luamml/save/nNn}{{mathsmash} #1 {mpadded}}
+ $}%
+ \UseTaggingSocket{math/luamml/finsm@sh}{}{{}\finsm@sh}}
% \end{macrocode}
% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
%
+% \subsection{Disable math grabbing in the begindocument hook}
+% For example amsart uses math to measure text there.
%
-%
-
-% \begin{macro}{\@@_split_at_nl:NN}
-% This splits grabbed math at newlines.
-%
-% \begin{macrocode}
-\cs_new:Npn \@@_split_at_nl:NN #1#2 {
- \tl_set:Nf \l_@@_tmpa_tl {
- \exp_after:wN \@@_split_at_nl_first:w #1 \\ \q_nil \\ \s_stop }
- \exp_after:wN \@@_split_at_nl_aux:nnNN \l_@@_tmpa_tl #1 #2
-}
-% \end{macrocode}
-% and the auxiliary commands
% \begin{macrocode}
-\cs_new:Npn \@@_split_at_nl_first:w #1 \\ #2 \\ #3 \s_stop
- {
- \quark_if_nil:nTF {#2}
- { {#1} { } }
- {
- \@@_split_chk_if_begin:ww #1 \begin \q_nil \s_mark
- #2 \\ #3 \s_stop
- }
- }
-
-\cs_new_protected:Npn \@@_split_at_nl_aux:nnNN #1 #2 #3 #4
- {
- \tl_gset:Nn #4 {#1}
- \tl_gset:Nn #3 {#2}
- }
-
-\cs_new:Npn \@@_split_chk_if_begin:ww
- #1 \begin #2 #3 \s_mark #4 \\ \q_nil \\ \s_stop
- {
- \quark_if_nil:nTF {#2}
- { {#1} {#4} }
- {
- \exp_after:wN \@@_split_collect_one_end:w
- \@@_split_cleanup_begin_q_nil:w #1 \begin{#2} #3 \\ #4 \s_stop
- { } { 1 }
- }
- }
-
-\cs_new:Npn \@@_split_cleanup_begin_q_nil:w #1 \begin \q_nil {#1}
-
-\cs_new:Npn \@@_split_collect_one_end:w #1 \end #2 #3 \s_stop #4 #5
- {
- \exp_args:Nf \@@_split_check_count_begins:nnnn
- { \@@_split_count_begins:n { #4 #1 } } {#5}
- { #4 #1 \end{#2} } {#3}
- }
-\cs_new:Npn \@@_split_count_begins:n #1
- { \int_eval:n { 0 \@@_split_count_begins:w #1 \begin \q_nil } }
-
-\cs_new:Npn \@@_split_count_begins:w #1 \begin #2
- { \quark_if_nil:nF {#2} { +1 \@@_split_count_begins:w } }
-
-\cs_new:Npn \@@_split_check_count_begins:nnnn #1 #2 #3 #4
- {
- \int_compare:nNnTF {#1} = {#2}
- {
- \exp_last_unbraced:Nf \@@_split_final_cleanup:nn
- { \@@_split:n { \@@_split_guard:n {#3} #4 } }
- }
- {
- \exp_args:No \use_ii_i:nn
- { \exp_after:wN { \int_value:w \int_eval:n { #2 + 1 } } }
- { \@@_split_collect_one_end:w #4 \s_stop {#3} }
- }
- }
-\cs_new:Npn \@@_split_final_cleanup:nn #1 #2
- {
- \exp:w \@@_split_final_cleanup:w #1
- \@@_split_guard:n \q_nil \s_mark { }
- {#2}
- }
-\cs_new:Npn \@@_split_final_cleanup:w #1 \@@_split_guard:n #2 #3 \s_mark #4
+\tl_gput_right:Nn\@kernel@before@begindocument
{
- \quark_if_nil:nTF {#2}
- { \exp_end: { #4 #1 } }
- { \@@_split_final_cleanup:w #3 \s_mark { #4 #1 #2 } }
+ \bool_set_true:N\l_@@_collected_bool
}
-
-\cs_new:Npn \@@_split:n #1 {
- \@@_split_at_nl_first:w #1 \\ \q_nil \\ \s_stop }
-
-% this looks unused.
-%\NewDocumentCommand \splitnl { mm +m }
-% {
-% \tl_set:Nf \l_@@_tmpa_tl { \split:n {#3} }
-% \show \l_@@_tmpa_tl
-% \exp_after:wN \__splitnl_aux:nnNN \l_@@_tmpa_tl #1 #2
-% }
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\maybestartnewformulatag}
-%
-% \begin{macrocode}
-
-\newif\if@subformulas
-\tl_new:N \result
-
-\cs_new_protected:Npn\grabaformulapartandstart {
- \@@_split_at_nl:NN \g_@@_grabbed_math_tl \result
- \typeout{====>first-result=\meaning\result}
- \typeout{====>first-tmpmathcontent=\meaning\g_@@_grabbed_math_tl}
- \tl_if_empty:NTF \g_@@_grabbed_math_tl
- {
- \typeout{====>formula~ has~ no~ subparts}
- \global\@subformulasfalse
- }
- {
- \typeout{====>formula~ has~ subparts}
- \global\@subformulastrue
- \edef\resulttitle{\g_@@_grabbed_env_tl\space (part)}
- \tagstructbegin{tag=Formula,
-% \end{macrocode}
-% For now we don't put real content in /alt or /ActualText on subformulas
-% but we add a short text to satisfy the pdf/ua-2 validator
-% \begin{macrocode}
-% alt=\result,
- alt = subformula,
- title-o=\resulttitle
- }
- }
- \tagmcbegin{}
-}
-
-\cs_new_protected:Npn\grabaformulapartandmayberestart {
- \@@_split_at_nl:NN \g_@@_grabbed_math_tl \result
- \typeout{====>result=\meaning\result}
- \typeout{====>tmpmathcontent=\meaning\g_@@_grabbed_math_tl}
-% \tl_if_empty:NTF \g_@@_grabbed_math_tl
-% {
-% \typeout{====>tmpmathcontent=empty}
-% }
-% {
-% \typeout{====>tmpmathcontent=not-empty}
- \edef\resulttitle{\g_@@_grabbed_env_tl\space (part)}
- \tagstructbegin{tag=Formula,
- alt=\result,
- title-o=\resulttitle
- }
-% }
- \tagmcbegin{}
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-% \begin{macrocode}
-\def\maybestartnewformulatag {
-\if@subformulas
- \ifmeasuring@\else
-%
- \tl_if_empty:NF \g_@@_grabbed_math_tl
- {
- \tagmcend
- \tagstructend
- \grabaformulapartandmayberestart
- }
- \fi
-\fi
-}
+\tl_gput_right:Nn\@kernel@after@begindocument
+ {
+ \bool_set_false:N\l_@@_collected_bool
+ }
% \end{macrocode}
%
-% The breqn packages changes catcodes and that isn't yet covered
-% by our mechanism.
-% \begin{macrocode}
-%\AddToHook{package/breqn/after}{
-% \typeout{===>~ in~ hook}
-% \math_register_halign_env:nn {dmath}{}
-% \math_register_halign_env:nn {dgroup*}{}
-%}
-% \end{macrocode}
%
% \begin{macrocode}
\ExplSyntaxOff
diff --git a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-mathintent.dtx b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-mathintent.dtx
new file mode 100644
index 00000000000..b9c80a6232d
--- /dev/null
+++ b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-mathintent.dtx
@@ -0,0 +1,109 @@
+% \iffalse meta-comment
+%
+%% File: latex-lab-mathintent.dtx
+%
+% Copyright (C) 2025 The LaTeX Project
+%
+% It may be distributed and/or modified under the conditions of the
+% LaTeX Project Public License (LPPL), either version 1.3c of this
+% license or (at your option) any later version. The latest version
+% of this license is in the file
+%
+% https://www.latex-project.org/lppl.txt
+%
+%
+% The development version of the bundle can be found below
+%
+% https://github.com/latex3/latex2e/required/latex-lab
+%
+% for those people who are interested or want to report an issue.
+%
+%<*driver>
+\documentclass{l3doc}
+\EnableCrossrefs
+\CodelineIndex
+\begin{document}
+ \DocInput{latex-lab-mathintent.dtx}
+\end{document}
+%</driver>
+%
+% \fi
+%
+%
+% \title{The \texttt{latex-lab-mathintent} code\thanks{}}
+% \author{\LaTeX{} Project}
+%
+% \maketitle
+%
+% \newcommand\fmi[1]{\begin{quote} TODO: \itshape #1\end{quote}}
+% \newcommand\NEW[1]{\marginpar{\mbox{}\hfill\fbox{New: #1}}}
+% \providecommand\class[1]{\texttt{#1.cls}}
+% \providecommand\pkg[1]{\texttt{#1}}
+% \providecommand\hook[1]{\texttt{#1}}
+%
+% \begin{abstract}
+% \end{abstract}
+%
+% \tableofcontents
+%
+% \section{Introduction}
+%
+% This file implements Experiments with the MathML4 \texttt{intent} feature.
+% Initially to give readings for invisible times and function application.
+%
+% \MaybeStop{\setlength\IndexMin{200pt} \PrintIndex }
+%
+% \section{The Implementation}
+%
+% \begin{macrocode}
+%<@@=math>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<*kernel>
+% \end{macrocode}
+%
+% \subsection{File declaration}
+% \begin{macrocode}
+\ProvidesFile{latex-lab-mathintent.ltx}
+ [2025-01-17 v0.1a intent experiments]
+% \end{macrocode}
+%
+% \subsection{Invisible ops}
+% \begin{macrocode}
+\ExplSyntaxOn
+% \end{macrocode}
+%
+% \begin{macrocode}
+\protected\def\invisibletimes{
+\if_cs_exist:N\luamml_annotate:en
+ \luamml_annotate:en {
+ core = {[0] = 'mo', intent="times","^^^^2062"},
+}{
+ \latelua{}
+}
+\fi:
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\protected\def\functionapplication{
+\if_cs_exist:N\luamml_annotate:en
+ \luamml_annotate:en {
+ core = {[0] = 'mo', intent="applied_to","^^^^2061"},
+}{
+ \latelua{}
+}
+\fi:
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\ExplSyntaxOff
+% \end{macrocode}
+% \begin{macrocode}
+%</kernel>
+% \end{macrocode}
+% \subsection{Wrapper files for testphase key}
+% \Finale
+%
diff --git a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-mathpkg.dtx b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-mathpkg.dtx
index 31e7d31ef62..b6b1aa438a1 100644
--- a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-mathpkg.dtx
+++ b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-mathpkg.dtx
@@ -2,7 +2,7 @@
%
%% File: latex-lab-mathpkg.dtx
%
-% Copyright (C) 2022-2024 The LaTeX Project
+% Copyright (C) 2022-2025 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
diff --git a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-mathtools.dtx b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-mathtools.dtx
index ed8b6e467e7..a52b89e0d20 100644
--- a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-mathtools.dtx
+++ b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-mathtools.dtx
@@ -2,7 +2,7 @@
%
%% File: latex-lab-mathtools.dtx
%
-% Copyright (C) 2022-2024 The LaTeX Project
+% Copyright (C) 2022-2025 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
@@ -89,136 +89,174 @@
% \begin{macrocode}
\ExplSyntaxOn
\tl_new:N\l_@@_mathtools_init_tl
-\AddToHook{package/mathtools/after}
- {%
- \cs_if_eq:NNTF\intertext@ \MT_intertext:
- {
- \tl_set:Nn \l_@@_mathtools_init_tl {\MT_orig_intertext_false:}
- }
- {
- \tl_set:Nn \l_@@_mathtools_init_tl {\MT_orig_intertext_true:}
- }
- \cs_if_eq:NNTF\shortintertext@ \MT_shortintertext:n
- {
- \tl_put_right:Nn \l_@@_mathtools_init_tl
- {\MT_orig_shortintertext_false:}
- }
- {
- \tl_put_right:Nn \l_@@_mathtools_init_tl
- {\MT_orig_shortintertext_true:}
- }
- \def\MT_intertext: {%
- \def\intertext##1{%
- \ifvmode\else\\\@empty\fi
- \noalign{%
- \penalty\postdisplaypenalty\vskip-\belowdisplayskip
- \vskip-\lineskiplimit % CCS
- \vskip\normallineskiplimit % CCS
- \vskip\l_MT_above_intertext_sep
- \vbox{%
+\cs_if_eq:NNTF\intertext@ \MT_intertext:
+ {
+ \tl_set:Nn \l_@@_mathtools_init_tl {\MT_orig_intertext_false:}
+ }
+ {
+ \tl_set:Nn \l_@@_mathtools_init_tl {\MT_orig_intertext_true:}
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_if_eq:NNTF\shortintertext@ \MT_shortintertext:n
+ {
+ \tl_put_right:Nn \l_@@_mathtools_init_tl
+ {\MT_orig_shortintertext_false:}
+ }
+ {
+ \tl_put_right:Nn \l_@@_mathtools_init_tl
+ {\MT_orig_shortintertext_true:}
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\MT_intertext: {%
+ \def\intertext##1{%
+ \ifvmode\else\\\@empty\fi
+ \noalign{%
+ \penalty\postdisplaypenalty\vskip-\belowdisplayskip
+ \vskip-\lineskiplimit % CCS
+ \vskip\normallineskiplimit % CCS
+ \vskip\l_MT_above_intertext_sep
+ \vbox{%
% \end{macrocode}
% Stop tagging when measuring:
% \begin{macrocode}
- \ifmeasuring@\tag_suspend:n{\measuring}\fi
- \normalbaselines
- \ifdim
- \ifdim\@totalleftmargin=\z@
- \linewidth
- \else
- -\maxdimen
- \fi
- =\columnwidth
- \else \parshape\@ne \@totalleftmargin \linewidth
- \fi
+ \ifmeasuring@\tag_suspend:n{\measuring}\fi
+ \normalbaselines
+ \ifdim
+ \ifdim\@totalleftmargin=\z@
+ \linewidth
+ \else
+ -\maxdimen
+ \fi
+ =\columnwidth
+ \else \parshape\@ne \@totalleftmargin \linewidth
+ \fi
% \end{macrocode}
% End the previous mc:
% \begin{macrocode}
- \tag_mc_end_push:
+ \tag_mc_end_push:
% \end{macrocode}
% We are already in a par so we change now to Span:
% \begin{macrocode}
- \tagpdfsetup{para/tag=Span}
- \noindent\ignorespaces##1\par
+ \tagpdfsetup{para/tag=Span}
+ \noindent\ignorespaces##1\par
% \end{macrocode}
% Restart the MC
% \begin{macrocode}
- \tag_mc_begin_pop:n{}}%
- \penalty\predisplaypenalty\vskip\abovedisplayskip%
- \vskip-\lineskiplimit % CCS
- \vskip\normallineskiplimit % CCS
- \vskip\l_MT_below_intertext_sep
- }%
- }%
- \MH_let:NwN \shortintertext \shortintertext@
- }
-% \end{macrocode}
-% \begin{macrocode}
- \def\MT_orig_shortintertext:n #1{%
- \ifvmode\else\\\@empty\fi
- \noalign{%
- \penalty\postdisplaypenalty\vskip\abovedisplayshortskip
- \vbox{%
- \ifmeasuring@\tag_suspend:n{\measuring}\fi
- \normalbaselines
- \MH_if_dim:w
- \MH_if_dim:w \@totalleftmargin=\z@
- \linewidth
- \MH_else:
- -\maxdimen
- \MH_fi:
- =\columnwidth
- \MH_else:
- \parshape\@ne \@totalleftmargin \linewidth
- \MH_fi:
- \tag_mc_end_push:
- \tagpdfsetup{para/tag=Span}
- \tagpdfparaOn
- \noindent\ignorespaces#1\par
- \tag_mc_begin_pop:n{}}
- \penalty\predisplaypenalty\vskip\abovedisplayshortskip%
- }%
- }
-
- \def\MT_shortintertext:n #1{%
- \ifvmode\else\\\@empty\fi
- \noalign{%
- \penalty\postdisplaypenalty\vskip\abovedisplayshortskip
- \vskip-\lineskiplimit
- \vskip\normallineskiplimit
- \vskip\l_MT_above_shortintertext_sep
- \vbox{%
- \ifmeasuring@\tag_suspend:n{\measuring}\fi
- \normalbaselines
- \MH_if_dim:w
- \MH_if_dim:w \@totalleftmargin=\z@
- \linewidth
- \MH_else:
- -\maxdimen
- \MH_fi:
- =\columnwidth
- \MH_else:
- \parshape\@ne \@totalleftmargin \linewidth
- \MH_fi:
- \tag_mc_end_push:
- \tagpdfsetup{para/tag=P}
+ \tag_mc_begin_pop:n{}}%
+ \penalty\predisplaypenalty\vskip\abovedisplayskip%
+ \vskip-\lineskiplimit % CCS
+ \vskip\normallineskiplimit % CCS
+ \vskip\l_MT_below_intertext_sep
+ }%
+ }%
+ \MH_let:NwN \shortintertext \shortintertext@
+}
+% \end{macrocode}
+% \begin{macrocode}
+\def\MT_orig_shortintertext:n #1{%
+ \ifvmode\else\\\@empty\fi
+ \noalign{%
+ \penalty\postdisplaypenalty\vskip\abovedisplayshortskip
+ \vbox{%
+ \ifmeasuring@\tag_suspend:n{\measuring}\fi
+ \normalbaselines
+ \MH_if_dim:w
+ \MH_if_dim:w \@totalleftmargin=\z@
+ \linewidth
+ \MH_else:
+ -\maxdimen
+ \MH_fi:
+ =\columnwidth
+ \MH_else:
+ \parshape\@ne \@totalleftmargin \linewidth
+ \MH_fi:
+ \tag_mc_end_push:
+ \tagpdfsetup{para/tag=Span}
+ \tagpdfparaOn
+ \noindent\ignorespaces#1\par
+ \tag_mc_begin_pop:n{}}
+ \penalty\predisplaypenalty\vskip\abovedisplayshortskip%
+ }%
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\MT_shortintertext:n #1{%
+ \ifvmode\else\\\@empty\fi
+ \noalign{%
+ \penalty\postdisplaypenalty\vskip\abovedisplayshortskip
+ \vskip-\lineskiplimit
+ \vskip\normallineskiplimit
+ \vskip\l_MT_above_shortintertext_sep
+ \vbox{%
+ \ifmeasuring@\tag_suspend:n{\measuring}\fi
+ \normalbaselines
+ \MH_if_dim:w
+ \MH_if_dim:w \@totalleftmargin=\z@
+ \linewidth
+ \MH_else:
+ -\maxdimen
+ \MH_fi:
+ =\columnwidth
+ \MH_else:
+ \parshape\@ne \@totalleftmargin \linewidth
+ \MH_fi:
+ \tag_mc_end_push:
+ \tagpdfsetup{para/tag=P}
% \end{macrocode}
% Why is it needed to enable paratagging??
% \begin{macrocode}
- \tagpdfparaOn
- \noindent\ignorespaces#1\par
- \tag_mc_begin_pop:n{}}%
- \penalty\predisplaypenalty\vskip\abovedisplayshortskip%
- \vskip-\lineskiplimit
- \vskip\normallineskiplimit
- \vskip\l_MT_below_shortintertext_sep
- }%
- }
-
+ \tagpdfparaOn
+ \noindent\ignorespaces#1\par
+ \tag_mc_begin_pop:n{}}%
+ \penalty\predisplaypenalty\vskip\abovedisplayshortskip%
+ \vskip-\lineskiplimit
+ \vskip\normallineskiplimit
+ \vskip\l_MT_below_shortintertext_sep
+ }%
+}
+% \end{macrocode}
+% see https://github.com/latex3/tagging-project/issues/734. The multlined environment
+% still creates a few unneeded structure, perhaps triggered by empty tags.
+% \begin{macrocode}
+ \renewcommand*\MT_mult_internal:n [1]{
+ \MH_if_boolean:nF {outer_mult}{\alignedspace@left} %<-- requires amsmath 2016/11/05
+ \MT_next:
+ \bgroup
+ \Let@
+ \def\l_MT_multline_lastline_fint{0 }
+ \chardef\dspbrk@context\@ne \restore@math@cr
+ \MH_let:NwN \math@cr@@\MT_mult_mathcr_atat:w
+ \MH_let:NwN \shoveleft\MT_shoveleft:wn
+ \MH_let:NwN \shoveright\MT_shoveright:wn
+ \spread@equation
+ \MH_set_boolean_F:n {mult_firstline}
+ \MT_measure_mult:n {#1}
+ \MH_if_dim:w \l_MT_multwidth_dim<\l_MT_multline_measure_fdim
+ \MH_setlength:dn \l_MT_multwidth_dim{\l_MT_multline_measure_fdim}
+ \fi
+ \MH_set_boolean_T:n {mult_firstline}
+ \MH_if_num:w \l_MT_multline_lastline_fint=\@ne
+ \MH_let:NwN \math@cr@@ \MT_mult_firstandlast_mathcr:w
+ \MH_fi:
+ \ialign\bgroup
+ \hfil\strut@$\m@th\displaystyle{}##
+ \UseTaggingSocket{math/luamml/save/nNn}{ {} \displaystyle {mtd}}
+ $
+ \UseTaggingSocket{math/luamml/mtable/finalizecol}{last}
+ \hfil
+ \crcr
+ \hfilneg
+ #1
+ }
% \end{macrocode}
% end hook
% \begin{macrocode}
- \l_@@_mathtools_init_tl
-}
+ \l_@@_mathtools_init_tl
\ExplSyntaxOff
% \end{macrocode}
%
diff --git a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-minipage.dtx b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-minipage.dtx
index eed595a5318..6d466a8f7fe 100644
--- a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-minipage.dtx
+++ b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-minipage.dtx
@@ -2,7 +2,7 @@
%
%% File: latex-lab-minipage.dtx
%%
-% Copyright (C) 2023-2024 LaTeX Project
+% Copyright (C) 2023-2025 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
diff --git a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-namespace.dtx b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-namespace.dtx
index d76dd8d4893..84eeb9bb7b7 100644
--- a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-namespace.dtx
+++ b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-namespace.dtx
@@ -2,7 +2,7 @@
%
%% File: latex-lab-namespace.dtx
%%
-% Copyright (C) 2023-2024 LaTeX Project
+% Copyright (C) 2023-2025 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
@@ -26,7 +26,7 @@
% \fi
% \title{Prototype reimplementation of \LaTeXe{}'s role mapping}
% \author{\LaTeX{} Project, initial implementation Ulrike Fischer}
-% \date{v0.8b 2024-07-05}
+% \date{v0.8d 2025-02-13}
%
% \maketitle
%
@@ -52,6 +52,7 @@
%
% \end{documentation}
% \begin{implementation}
+% \changes{v0.8c}{2025/01/12}{changed mapping of verbatim to Code as Sub is now allowed inside Code}
% \begin{macrocode}
%<*ns-latex-lab>
%% \ProvidesExplFile {tagpdf-ns-latex-lab.def} {2023-09-04} {0.8}
@@ -88,7 +89,7 @@ enumerate, L, pdf2,
description, L, pdf2,
quote, BlockQuote,pdf,
quotation, BlockQuote,pdf,
-verbatim, Div, pdf2, % overwritten by block
+verbatim, Code, pdf, % overwritten by block
item, LI, pdf2,
itemlabel, Lbl, pdf2,
itembody, LBody, pdf2,
@@ -98,10 +99,14 @@ footnotelabel,Lbl, pdf2,
text-unit, Part, pdf2,
text, P, pdf2,
% \end{macrocode}
+% \subsection{From sec code}
+% \begin{macrocode}
+section-number, Span, pdf2,
+% \end{macrocode}
% \subsection{From block code}
% \begin{macrocode}
theorem-like, Sect, pdf2,
-verbatim, P, pdf2,
+verbatim, Code, pdf,
codeline, Sub, pdf2,
% \end{macrocode}
% \subsection{From float code}
diff --git a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-new-or-1.dtx b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-new-or-1.dtx
index 4d4994262fd..6ff81f9ea02 100644
--- a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-new-or-1.dtx
+++ b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-new-or-1.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-%% File: latex-lab-new-or-1.dtx (C) Copyright 2020-2024 Frank Mittelbach
+%% File: latex-lab-new-or-1.dtx (C) Copyright 2020-2025 Frank Mittelbach
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -9,8 +9,8 @@
%
% https://www.latex-project.org/lppl.txt
%
-\def\ltlabneworIdate{2024-11-12}
-\def\ltlabneworIversion{0.85b}
+\def\ltlabneworIdate{2025-02-11}
+\def\ltlabneworIversion{0.85c}
%<*driver>
\documentclass{l3doc}
@@ -35,15 +35,9 @@
%
% \section{Introduction}
%
-% This file contains a few patches of internal \LaTeX{} commands
-% to support paragraph tagging across
-% page boundaries (in \pdfTeX) and improve the behaviour of links across page breaks.
-%
-% Until this get properly integrated with the kernel code this has
-% to be taken as a prototype and code, interfaces as well as
-% behavior may change without notice and certainly without any
-% backwards compatibility!
-%
+% This file contained the initial patches to the OR. All of this
+% has be resolved now or moved to
+% \pkg{latex-lab-new-or-2}. Eventually, it will be fully removed.
%
% \StopEventually{\setlength\IndexMin{200pt} \PrintIndex }
%
@@ -56,127 +50,14 @@
% \begin{macrocode}
\ProvidesPackage{latex-lab-testphase-new-or-1}
[\ltlabneworIdate\space v\ltlabneworIversion\space
- Temporary output patches for tagging and better link support]
-\RequirePackage{etoolbox}
-% \end{macrocode}
-%
-%
-% \subsection{Patching the OR}
-% This adds hooks around header and footer, in \cs{@makecol} and in multicol.
-% At first initialize some of the hooks. We use providecommand to avoid problems if
-% the kernel changes here and provides them directly.
-% \begin{macrocode}
-\providecommand\@kernel@before@head{}
-\providecommand\@kernel@before@foot{}
-\providecommand\@kernel@after@head{}
-\providecommand\@kernel@after@foot{}
-\providecommand\@mult@ptagging@hook{}% should be replaced with a socket, eventually
-% \end{macrocode}
-%
-% \begin{macrocode}
-
-\patchcmd\@outputpage
- {\vfil\color@hbox\normalcolor\hb@xt@\textwidth{\@thehead}\color@endbox}
- {\vfil\@kernel@before@head\color@hbox\normalcolor\hb@xt@\textwidth{\@thehead}\color@endbox\@kernel@after@head}
- {\typeout{Patching header in \string\@outputpage}}{\PATCHerror }
-
-
-\patchcmd\@outputpage
- {\color@hbox\normalcolor\hb@xt@\textwidth{\@thefoot}\color@endbox}
- {\@kernel@before@foot\color@hbox\normalcolor\hb@xt@\textwidth{\@thefoot}\color@endbox\@kernel@after@foot}
- {\typeout{Patching footer in \string\@outputpage}}{\PATCHerror }
-% \end{macrocode}
-%
-% \begin{macro}{\@makecol}
-% We have to patch \cs{@makecol} in two places:
-% \begin{itemize}
-% \item
-% update 255 up front to add missing tmb/tme if necessary
-% \item
-% update the \cs{footins} stream if that one got split
-% \end{itemize}
-%
-% We patch \cs{@makecol}, if new-or-2 is loaded too it will overwrite that again.
-% \begin{macrocode}
-\providecommand\@kernel@before@footins{}
-\providecommand\@kernel@tagsupport@@makecol{}
-
-\patchcmd\@makecol
- {\vskip\skip\footins}
- {\vskip\skip\footins\@kernel@before@footins}
- {\typeout{Patching \string\@makecol\space for tagging}}{\PATCHerror }
-
-\patchcmd\@makecol
- {\let\@elt\relax}
- {\@kernel@tagsupport@@makecol\let\@elt\relax}
- {\typeout{Patching \string\@makecol\space for tagging}}{\PATCHerror }
-
-\AddToHook{package/footmisc/after}
- {%
- \def\@makecol{%
- \setbox\@outputbox \box\@cclv
- \@outputbox@removebskip
- \@kernel@tagsupport@@makecol
- \let\@elt\relax
- \xdef\@freelist{\@freelist\@midlist}%
- \global \let \@midlist \@empty
- \@makecol@appendblocks
- \ifvbox\@kludgeins
- \@makespecialcolbox
- \else
- \@makenormalcolbox
- \fi
- \global \maxdepth \@maxdepth}
-}
+ Temporary output patches for tagging and better link support -- no longer active]
% \end{macrocode}
-% \end{macro}
%
-% \subsection{\pkg{multicol} adjustments}
-%
-% The patches for pkg{multicol} are fairly minimal:
-% \begin{itemize}
-% \item At the start of the environment anything already on the
-% page is picked up and stored in \cs{partial@page}, we may need to add
-% a TMB to that (it should have a proper TME). This has to happen
-% in the \enquote{main} stream context.
-% \item
-% \item
-% \end{itemize}
-%
-% This is now directly provided in \pkg{multicol} so the patch below is no longer necessary.
%
% \begin{macrocode}
-%\AddToHook{package/multicol/after}
-% {% multicol needs later loading
-% \end{macrocode}
-%
-% \begin{macrocode}
-% \patchcmd\page@sofar
-% {\global\dimen\tw@\dp\z@}%
-% {%
-% \global\dimen\tw@\dp\z@
-% \@mult@ptagging@hook
-% }%
-% {\typeout{Patching \string\page@sofar\space for tagging}}{\PATCHerror}%
-%}
-% \end{macrocode}
-%
-% \subsection{Interrupt hooks}
-% This requires the l3pdfannot module!
-% We add the code here and not in hyperref, as it should also work with links
-% created directly with the l3pdfannot commands. The file is only
-% loaded by the pdfmanagement, so no need to test if the commands exist.
-% \begin{macrocode}
-\ExplSyntaxOn
-\def\@kernel@before@head{\pdfannot_link_off:}
-\def\@kernel@before@foot{\pdfannot_link_off:}
-\def\@kernel@after@head {\pdfannot_link_on:}
-\def\@kernel@after@foot {\pdfannot_link_on:}
-\ExplSyntaxOff
-% \end{macrocode}
-% \begin{macrocode}
%</package>
% \end{macrocode}
+%
% \begin{macrocode}
%<*latex-lab>
\ProvidesFile{new-or-1-latex-lab-testphase.ltx}
diff --git a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-new-or-2.dtx b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-new-or-2.dtx
index ee20331a8f4..414737bc8ce 100644
--- a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-new-or-2.dtx
+++ b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-new-or-2.dtx
@@ -1,7 +1,7 @@
% \iffalse meta-comment
%
%% File: latex-lab-new-or-2.dtx
-% Copyright (C) 2022-2024 The LaTeX Project
+% Copyright (C) 2022-2025 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
@@ -17,8 +17,8 @@
%
% for those people who are interested or want to report an issue.
%
-\def\ltlabneworIIdate{2023-09-04}
-\def\ltlabneworIIversion{0.85c}
+\def\ltlabneworIIdate{2025-02-12}
+\def\ltlabneworIIversion{0.86b}
%<*driver>
\documentclass{l3doc}
@@ -32,7 +32,7 @@
% \fi
%
%
-% \title{The \texttt{latex-lab-testphase-new-or-2} code\thanks{}}
+% \title{The \texttt{latex-lab-testphase-new-or-2} code}
% \author{Frank Mittelbach, \LaTeX{} Project}
% % \date{v\ltlabneworIIversion\ \ltlabneworIIdate}
% \maketitle
@@ -61,146 +61,8 @@
% \section{Introduction}
%
%
-% \section{Hooks and replaceable code blocks}
%
%
-% \subsubsection{Replaceable code blocks (sockets)}
-%
-% To cater for different layouts with respect to text, footnotes,
-% and bottom-floats placements there are two sockets for
-% now.
-% \begin{description}
-% \item[\socket{@makecol/outputbox} (0 arguments)]
-%
-% In code for this socket the \cs{@outputbox} (holding the
-% galley text for the current column or page) is augmented by
-% attaching floats and footnote areas together with appropriate
-% spacing.
-%
-% Prior to calling the socket the output routine has already
-% decided which floats go into which area and which get deferred.
-% Therefore, the assumption is that the code in the socket attaches all
-% areas that contain floats. If this is not done, then the order
-% of floats is likely to be screwed up unless unused floats
-% are moved to the defer list in an appropriate way (for now we
-% don't offer any interface for that scenario).
-%
-% Before the code in the socket is run, any existing glue at the bottom
-% of the \cs{@outputbox} is removed and stored in a safe
-% place. If needed, it can be reinserted with one of the helper
-% commands.
-%
-% To support setting this up the following helper commands are available:
-% \begin{description}
-% \item[\cs{@outputbox@append} (1 argument)]
-%
-% \DescribeMacro[noprint]{@outputbox@append}
-%
-% This general purpose command alters the \cs{@outputbox} box by
-% appending material to it.
-%
-% \item[\cs{@outputbox@appendfootnotes} (0 arguments)]
-%
-% \DescribeMacro[noprint]{@outputbox@appendfootnotes}
-%
-% This command appends the footnotes to the \cs{@outputbox} (if
-% there are any). If not, then it does nothing.
-%
-% \item[\cs{@outputbox@attachfloats} (0 arguments)]
-% \item[\cs{@outputbox@attachtopfloats} (0 arguments)]
-% \item[\cs{@outputbox@attachbottomfloats} (0 arguments)]
-%
-% \DescribeMacro[noprint]{@outputbox@attachfloats}
-% \DescribeMacro[noprint]{@outputbox@attachtopfloats}
-% \DescribeMacro[noprint]{@outputbox@attachbottomfloats}
-%
-% Attaching top and bottom floats can usually be done in one
-% go, but for special layouts we might want more control so we
-% provide also separate commands.
-%
-% \item[\cs{@outputbox@reinsertbskip} (0 arguments)]
-%
-% \DescribeMacro[noprint]{@outputbox@reinsertbskip}
-%
-% Reinsert the bottom skip of the \cs{@outputbox} that was
-% saved before.
-%
-% \item[Testing for existence of material]
-%
-% \DescribeMacro[noprint]{@if@footnotes@TF}
-% \DescribeMacro[noprint]{@if@bfloats@TF}
-%
-% There are a number of helpers to run conditional code
-% depending on whether or not there are footnotes or bottom
-% floats. They are \cs{@if@footnotes@TF} and
-% \cs{@if@bfloats@TF}
-% (names are likely to change).
-%
-% \end{description}
-%
-% \fmi{Decide on names for these helper commands. We could keep
-% them similar to the above (because they are only supposed to be
-% used by a few packages). However, we could alternatively use
-% CamelCase names, under the assumption that classes may also
-% directly define a plug for the socket, instead of loading a
-% support package such as \pkg{footmisc} (or in addition
-% to). --- decide}
-%
-% This socket cannot be empty but needs appropriate code; a set
-% of suitable plugs for it are already given in the kernel. These
-% are
-% \begin{description}
-% \item[\plug{space-footnotes-floats}]
-%
-% After the galley text there is a vertical \cs{vfill}
-% followed by any footnotes followed by the bottom floats, if any.
-%
-% \item[\plug{floats-footnotes-space}]
-%
-% As before but the \cs{vfill} is at the bottom (page is
-% ragged bottom).
-%
-% \item[\plug{footnotes-space-floats}]
-%
-% As before but the \cs{vfill} is between footnotes and floats.
-%
-% \item[\plug{space-floats-footnotes}]
-%
-% Here the footnotes come last.\footnote{There are two more
-% permutations, but neither of them has ever been requested so
-% they aren't set up by default --- doing that in a class
-% would be trivial though.}
-%
-% \item[\plug{floats-footnotes}]
-%
-% All excess space has to be distributed across the existing
-% glue on the page, e.g., within the text galley, the
-% separation between blocks, etc.
-% The order is text, floats, footnotes.
-%
-% \item[\plug{footnotes-floats}]
-%
-% As the previous one but floats and footnotes are
-% swapped. This is the \LaTeX{} default, i.e., this plug is
-% assigned to the socket.
-%
-% \end{description}
-%
-%-----------------------
-%
-% \item[\socket{@makecol/footnotes} (0 arguments)]
-%
-% This socket is used to manipulate the footnote
-% material inside \cs{box}\cs{footins}. It if contains code, it
-% is supposed to do some processing of that box and then write
-% the result back into it (and nothing else!). By default it
-% does nothing, i.e., has the \plug{noop} assigned.
-%
-% If (short) footnotes are run as a paragraph this socket gets
-% the plug \plug{para} assigned which is defined elsewhere.
-%
-% \end{description}
-%
% \StopEventually{\setlength\IndexMin{200pt} \PrintIndex }
%
%
@@ -219,301 +81,14 @@
%
% \subsection{\cs{@makecol} reimplementation}
%
-% In order for other packages to prepend or append code to
-% \cs{@makecol} the generic command hooks
-% \texttt{cmd/@makecol/before} and \texttt{cmd/@makecol/after} can
-% be used, so for now there is nothing we need to do for this.
-%
-%
-% \begin{macro}{\@makecol}
-% \cs{@makecol} is shortened a lot, basically all the hardwired
-% code in the middle has moved into a socket.
-% \begin{macrocode}
-\def \@makecol {%
-% \end{macrocode}
-% Save away box 255 as \cs{@outputbox} to make it available for further adjustments.
-% \begin{macrocode}
- \setbox\@outputbox \box\@cclv
-% \end{macrocode}
-% The only real addition is the next command which either does
-% nothing or removes an infinite glue from the bottom of the
-% \cs{@outputbox}.
-% \begin{macrocode}
- \@outputbox@removebskip
-% \end{macrocode}
-% Now a kernel hook for tagging.
-% \fmi{The name is likely to change and it probably will eventually
-% be replaced with a socket.}
-% \begin{macrocode}
- \@kernel@tagsupport@@makecol
-% \end{macrocode}
-% When this code is run any ``here'' floats in the \cs{@outputbox} are already handled, so we
-% recycle their registers and put them back to the \cs{@freelist}.
-% \begin{macrocode}
- \let\@elt\relax
- \xdef\@freelist{\@freelist\@midlist}%
- \global \let \@midlist \@empty
-% \end{macrocode}
-% Here we have the configurable part. This socket is supposed to add floats,
-% footnotes and stretchable vertical space as appropriate to the \cs{@outputbox}.
-% \begin{macrocode}
- \UseSocket{@makecol/outputbox}%
-% \end{macrocode}
-% Then we deal with any \cs{enlargethispage} or run the normal code
-% to build a column.
-% \begin{macrocode}
- \ifvbox\@kludgeins
- \@make@specialcolbox
- \else
- \@make@normalcolbox
- \fi
- \global \maxdepth \@maxdepth
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\@outputbox@depth}
-% We need to know the depth of \cs{@outputbox} once in a
-% while. Rather than using a temp dimen (as it was done in the
-% past), we give it a proper register.
-% \begin{macrocode}
-\newdimen\@outputbox@depth
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@make@normalcolbox}
-% Taken out of \cs{@makecol} for readability.
+% \begin{plugdecl}{footnote-floats}
+% If \cs{DocumentMetadata} is used we use \plug{footnotes-floats}
+% as the default. In 2e compatibility mode this should be changed to
+% \plug{footnotes-floats-legacy}.
% \begin{macrocode}
-\def \@make@normalcolbox {%
- \setbox\@outputbox \vbox to\@colht {%
- \@texttop
- \@outputbox@depth \dp\@outputbox
- \unvbox \@outputbox
- \vskip -\@outputbox@depth
- \@textbottom
- }%
-}
+\AssignSocketPlug {build/column/outputbox}{footnotes-floats}
% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\@make@specialcolbox}
-% Make the colbox when \cs{enlargethispage} was used.
-% \begin{macrocode}
-\def \@make@specialcolbox {%
- \@outputbox@append {\vskip-\@outputbox@depth}%
- \@tempdima \@colht
- \ifdim \wd\@kludgeins>\z@
- \advance \@tempdima -\ht\@outputbox
- \advance \@tempdima \pageshrink
- \setbox\@outputbox \vbox to \@colht {%
- \unvbox\@outputbox
- \vskip \@tempdima
- \@textbottom
- }%
- \else
- \advance \@tempdima -\ht\@kludgeins
- \setbox \@outputbox \vbox to \@colht {%
- \vbox to \@tempdima {%
- \unvbox\@outputbox
- \@textbottom}%
- \vss}%
- \fi
- {\setbox \@tempboxa \box \@kludgeins}%
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\@outputbox@removebskip}
-%
-% This is really a bug fix for the kernel but one we only
-% automatically make in new documents that are using \cs{DocumentMetadata}.
-% \fmi{may make optional for legacy docs}
-% If
-% \cs{raggedbottom} is in force, footnotes get attached to the main
-% galley at a distance of \cs{footskip} on all pages except on
-% those that are ended by \cs{newpage} or \cs{clearpage} where the
-% \cs{vfil} from \cs{newpage} pushes the footnotes to the very bottom.
-%
-% This is kind of a weird difference to a page ending with
-% \cs{pagebreak}---in that case the page is also run
-% short, but the footnotes are not pushed to the bottom.
-%
-% In \pkg{footmisc} \cs{@outputbox@removebskip} is only applied when
-% \pkg{footmisc} is called with an option specifying the
-% footnote placement, i.e., not in the default case.
-% In new documents we apply it always.
-% \begin{macrocode}
-\def\@outputbox@removebskip{%
-% \end{macrocode}
-% We first test if we are in a \cs{raggedbottom} layout. If not we
-% do nothing, but we don't disable the code because
-% \cs{raggedbottom} may get used only for some parts of the
-% document.
-% \begin{macrocode}
- \ifx\@textbottom\relax \else
-% \end{macrocode}
-% We then append some negative glue at the end of \cs{@outputbox}
-% provided it has a glue stretch order of 1 or more (i.e., contains
-% a \texttt{fil} or \texttt{fill} part).
-% \begin{macrocode}
- \@outputbox@append{%
- \@tempskipa\lastskip
- \ifnum \gluestretchorder\@tempskipa>\z@
- \vskip-\@tempskipa
-% \end{macrocode}
-%
-% \begin{macro}{\@outputbox@reinsertbskip}
-% We also record the value so that it can be reinserted
-% elsewhere. As we have to do this globally, we also need to
-% explicitly reset it if we don't find any such glue.
-% \begin{macrocode}
- \xdef\@outputbox@reinsertbskip
- {\noexpand\@outputbox@append{\vskip\the\@tempskipa}}%
- \else
- \global\let\@outputbox@reinsertbskip\relax
- \fi
- }%
- \fi
-}
-% \end{macrocode}
-% We need a trivial top-level definition for
-% \cs{@outputbox@reinsertbskip} in case the first page has no
-% bottom glue and the command gets called.
-% \begin{macrocode}
-\let\@outputbox@reinsertbskip\relax
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-%
-%
-% \begin{macro}{\@kernel@before@cclv,
-% \@kernel@before@footins}
-% These two commands are internal kernel hooks intended for tagging
-% support in case that is active. They should not be altered by package code!
-% By default they do nothing (and
-% may have been defined already by \cs{DocumentMetadata}).
-% \fmi{The names might change and perhaps each of them is turned
-% into a socket named something like \socket{tagsupport/before/cclv}
-% or similar.}
-% \begin{macrocode}
-\providecommand\@kernel@before@cclv{}
-\providecommand\@kernel@before@footins{}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-% \subsection{The output routine configuration components}
-%
-% Here we provide the components that are used to define code for the
-% \socket{@makecol/outputbox} socket.
-%
-%
-% \begin{macro}{\@outputbox@append}
-%
-% This general purpose command alters the \cs{@outputbox} box by
-% appending material to it. As this is a box typesetting operation
-% we make sure that the last line of the box reflects the true
-% depth of the last line (in case that is needed later). We also
-% expose the current depth of \cs{@outputbox} as
-% \cs{@outputbox@depth} before unboxing so that its value can be
-% used by \verb=#1= if wanted.
-% \begin{macrocode}
-\def\@outputbox@append #1{%
-% \if!\detokenize{#1}!\else
- \setbox\@outputbox \vbox {%
- \boxmaxdepth \@maxdepth
- \@outputbox@depth\dp\@outputbox % if needed in #1
- \unvbox \@outputbox
- #1%
- }%
-% \fi
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%
-% \begin{macro}{\@outputbox@appendfootnotes}
-%
-% This command appends the footnotes to the \cs{@outputbox} (if
-% there are any). If not, then it does nothing.
-% \begin{macrocode}
-\def\@outputbox@appendfootnotes {%
- \ifvoid\footins \else
-% \end{macrocode}
-% First come two configuration points: what to do if we are in a split
-% footnote situation and a second one that does some manipulation
-% of the \cs{footins} box before it gets appended.
-% \fmi{The code for handling split footnotes will get revised as part of socket handling in the future}
-% \begin{macrocode}
- \@makecol@handlesplitfootnotes
-% \end{macrocode}
-%
-% \begin{macrocode}
- \UseSocket{@makecol/footnotes}%
-% \end{macrocode}
-% Then the footnotes are appended:
-% \begin{macrocode}
- \@outputbox@append{%
- \vskip \skip\footins
-% \end{macrocode}
-% This is a kernel hook for tagging.
-% \fmi{The name is likely to change and it probably will eventually
-% be replaced with a socket.}
-% \begin{macrocode}
- \@kernel@before@footins
-% \end{macrocode}
-%
-% \begin{macrocode}
- \color@begingroup
- \normalcolor
- \footnoterule
-% \end{macrocode}
-% Support for \pkg{pdfcolfoot}, eventually this can go once color
-% is properly supported. The csname is constructed in case it
-% doesn't exist.
-% \begin{macrocode}
- \csname pdfcolfoot@current\endcsname
- \unvbox \footins
- \color@endgroup
- }%
- \fi
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-% \begin{macro}{\@outputbox@attachfloats}
-% \begin{macro}{\@outputbox@attachtopfloats}
-% \begin{macro}{\@outputbox@attachbottomfloats}
-% Attaching top and bottom floats can usually be done in one go,
-% but for special layouts we might want more control so we provide
-% also separate commands.
-% \begin{macrocode}
-\let \@outputbox@attachfloats \@combinefloats
-% \end{macrocode}
-%
-% \begin{macrocode}
-\def \@outputbox@attachtopfloats {%
- \ifx \@toplist\@empty \else \@cflt \fi
-}
-\def \@outputbox@attachbottomfloats {%
- \ifx \@botlist\@empty \else \@cflb \fi
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
+% \end{plugdecl}
%
%
%
@@ -545,182 +120,84 @@
%
%
%
-% \begin{socketdecl}{@makecol/footnote}
-%
-% The socket allowing the manipulation of \cs{footins} box
-% (result needs to be moved back in there). Used when footnotes are
-% reformatted into a single paragraph by the
-% \texttt{para} option of \pkg{footmisc}. By default it does nothing.
-% \begin{macrocode}
-\NewSocket{@makecol/footnotes}{0}
-% \end{macrocode}
-% \end{socketdecl}
-%
%
%
-% \fmi{Some temp interfaces until configuration points are available.}
%
-% \begin{macro}{\@if@flushbottom@TF}
-% Test for \cs{flushbottom} (currently not used).
-% \begin{macrocode}
-\def\@if@flushbottom@TF{%
- \ifx\@textbottom\relax
- \expandafter\@firstoftwo
- \else
- \expandafter\@secondoftwo
- \fi
-}
-% \end{macrocode}
-% \end{macro}
+% \subsection{\cs{@outputpage} reimplementation}
%
+% We still have to deal with various plug setting for tagging:
+% This needs documentation and moving.
%
-% \begin{macro}{\@if@footnotes@TF}
-% Test if footnotes are present on the current page.
+% \begin{plugdecl}{default}
% \begin{macrocode}
-\def\@if@footnotes@TF{%
- \ifvoid\footins
- \expandafter\@secondoftwo
- \else
- \expandafter\@firstoftwo
- \fi
-}
+\ExplSyntaxOn
% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\@if@bfloats@TF}
-% Test if bottom floats are around.
+% \fmi{where should these plug declarations go? tagpdf?}
% \begin{macrocode}
-\def\@if@bfloats@TF{%
- \ifx \@botlist\@empty
- \expandafter\@secondoftwo
- \else
- \expandafter\@firstoftwo
- \fi
-}
+\NewSocketPlug{tagsupport/build/page/header}{default}
+ {
+ \__tag_hook_kernel_before_head:
+ #2
+ \__tag_hook_kernel_after_head:
+ }
% \end{macrocode}
-% \end{macro}
-%
-%
-%
-% \subsection{The \cs{@makecol} configuration}
-%
-%
-% \begin{socketdecl}{@makecol/outputbox}
-% We have one socket that is supposed to augment the \cs{@outputbox}
-% by attaching floats and footnotes with appropriate spacing.
-%
+%
% \begin{macrocode}
-\NewSocket{@makecol/outputbox}{0}
+\AssignSocketPlug{tagsupport/build/page/header}{default}
% \end{macrocode}
-% \end{socketdecl}
-%
-% The following plugs are available for
-% this socket:
%
-% \begin{plugdecl}{space-footnotes-floats}
-% After the galley text there is a vertical \cs{vfill} followed by
-% any footnotes followed by the bottom floats, if any.
-% \begin{macrocode}
-\NewSocketPlug {@makecol/outputbox}{space-footnotes-floats} {%
- \@if@footnotes@TF
- {\@outputbox@append{\vfill}}%
- {\@if@bfloats@TF
- {\@outputbox@append{\vfill}}%
- {\@outputbox@reinsertbskip}%
- }%
- \@outputbox@appendfootnotes
- \@outputbox@attachfloats
-}
-% \end{macrocode}
% \end{plugdecl}
%
-% \begin{plugdecl}{floats-footnotes-space}
-% As before but the \cs{vfill} is at the bottom (page is ragged
-% bottom).
+
+
+% \begin{plugdecl}{default}
% \begin{macrocode}
-\NewSocketPlug {@makecol/outputbox}{floats-footnotes-space} {%
- \@outputbox@attachfloats
- \@if@footnotes@TF
- {\@outputbox@append{\vfill}}%
- {\@outputbox@reinsertbskip}%
- \@outputbox@appendfootnotes
-}
+\NewSocketPlug{tagsupport/build/page/footer}{default}
+ {
+ \__tag_hook_kernel_before_foot:
+ #2
+ \__tag_hook_kernel_after_foot:
+ }
% \end{macrocode}
-% \end{plugdecl}
%
-% \begin{plugdecl}{footnotes-space-floats}
-% As before but the \cs{vfill} is between footnotes and floats.
% \begin{macrocode}
-\NewSocketPlug {@makecol/outputbox}{footnotes-space-floats} {%
- \@outputbox@appendfootnotes
- \@if@bfloats@TF
- {\@outputbox@append{\vfill}}%
- {\@outputbox@reinsertbskip}%
- \@outputbox@attachfloats
-}
+\AssignSocketPlug{tagsupport/build/page/footer}{default}
% \end{macrocode}
-% \end{plugdecl}
%
-% \begin{plugdecl}{space-floats-footnotes}
-% Here the footnotes come last.\footnote{There are two more
-% permutations, but neither of them has ever been requested so
-% they aren't set up by default --- doing that in a class
-% would be trivial though.}
-% \begin{macrocode}
-\NewSocketPlug {@makecol/outputbox}{space-floats-footnotes} {%
- \@if@footnotes@TF
- {\@outputbox@append{\vfill}}%
- {\@if@bfloats@TF
- {\@outputbox@append{\vfill}}%
- {\@outputbox@reinsertbskip}}%
- \@outputbox@attachfloats
- \@outputbox@appendfootnotes
-}
-% \end{macrocode}
% \end{plugdecl}
%
-%
-%
-% \begin{plugdecl}{floats-footnotes}
-% All excess space has to be distributed across the existing
-% glue on the page, e.g., within the text galley, the
-% separation between blocks, etc.
-% The order is text, floats, footnotes.
-% \begin{macrocode}
-\NewSocketPlug {@makecol/outputbox}{floats-footnotes} {%
- \@outputbox@attachfloats
- \@outputbox@appendfootnotes
-% \end{macrocode}
-% We do reinsert the bottom skip from \cs{newpage} if it
-% was taken out earlier. This is, strictly speaking, not necessary
-% in most cases, but it is a \cs{vfil} while \cs{raggedbottom} is
-% only generating \verb=\vspace{0pt plus .0001fil}=, so if you have
-% several \cs{vfil} on the page before the \cs{newpage} you would
-% alter the space distribution if one is taken out.
+
+
+
+
+% \begin{plugdecl}{default}
% \begin{macrocode}
- \@outputbox@reinsertbskip
-}
+\NewSocketPlug{tagsupport/build/column/outputbox}{default}
+ {
+ \__tag_check_typeout_v:n { ====>~In~\token_to_str:N \@makecol
+ \c_space_tl\the\c@page }
+ \tag_mc_add_missing_to_stream:Nn \@outputbox {main}
+ }
% \end{macrocode}
%
-% \end{plugdecl}
-%
-% \begin{plugdecl}{footnotes-floats}
+% \begin{plugdecl}{default}
% \begin{macrocode}
-\NewSocketPlug {@makecol/outputbox}{footnotes-floats} {%
- \@outputbox@appendfootnotes
- \@outputbox@attachfloats
- \@outputbox@reinsertbskip
-}
+\NewSocketPlug{tagsupport/build/column/footins}{default}
+ { \tag_mc_add_missing_to_stream:Nn \footins {footnote} }
% \end{macrocode}
-% The \texttt{footnote-floats} plug is the default used by
-% \LaTeX{}; it can be overwritten either through \pkg{footmisc} or
-% by assigning any of the other plugs (or by coding yet another
-% plug for the socket).
+% The two sockets do nothing (default \plug{noop}) if we
+% are in lua mode. If not they get the \plug{default} assigned
% \begin{macrocode}
-\AssignSocketPlug {@makecol/outputbox}{footnotes-floats}
+\sys_if_engine_luatex:F
+ {
+ \AssignSocketPlug{tagsupport/build/column/outputbox}{default}
+ \AssignSocketPlug{tagsupport/build/column/footins}{default}
+ }
+\ExplSyntaxOff
+
% \end{macrocode}
% \end{plugdecl}
+% \end{plugdecl}
%
%
%
diff --git a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-sec.dtx b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-sec.dtx
index 936eee9ed21..e1aaeffc99d 100644
--- a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-sec.dtx
+++ b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-sec.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-%% File: latex-lab-sec.dtx (C) Copyright 2022-2024 LaTeX Project
+%% File: latex-lab-sec.dtx (C) Copyright 2022-2025 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
@@ -16,8 +16,8 @@
%
% for those people who are interested or want to report an issue.
%
-\def\ltlabsecdate{2024-10-04}
-\def\ltlabsecversion{0.84f}
+\def\ltlabsecdate{2025-02-18}
+\def\ltlabsecversion{0.84i}
%<*driver>
\documentclass[kernel]{l3doc}
\EnableCrossrefs
@@ -47,100 +47,102 @@
% \begin{abstract}
% The following code implements a first draft for the tagging of sectioning commands.
% \end{abstract}
-%
+%
% \section{Limitations}
-%
-% Sectioning commands are in not defined by the format but by the classes.
-% Their implementation vary: some are defined with the help of \cs{@startsection},
-% some are like \cs{chapter} handcrafted,
-% some build with the help of extension packages or as in the KOMA classes
+%
+% Sectioning commands are in not defined by the format but by the classes.
+% Their implementation vary: some are defined with the help of \cs{@startsection},
+% some are like \cs{chapter} handcrafted,
+% some build with the help of extension packages or as in the KOMA classes
% with class code that extends the \cs{@startsection} functionality.
-%
+%
% The following code can therefore currently be used \emph{only} with the standard classes
% or with classes which do not overwrite the changed definitions.
-%
-%
-%
+%
+%
+%
% \section{Introduction}
-%
+%
% Tagging of sectioning commands consist of two parts:
-%
+%
% \begin{itemize}
-% \item The heading/title text of the section should be surrounded by a
+% \item The heading/title text of the section should be surrounded by a
% heading tag, typically \texttt{Hn} with some value of \texttt{n}.
-% The number of the section command can optionally be put in a \texttt{Lbl}.
-% The number of the \texttt{Hn} tag should reflect the \enquote{natural} level.
+% In theory, one could put the number of the section command in an \texttt{Lbl}.
+% However, current AT doesn't handle this well, so
+% we use a tag \texttt{section-number} that is mapped to \texttt{Span}.
+% The number of the \texttt{Hn} tag should reflect the \enquote{natural} level.
% So in an article \cs{section} will use \texttt{H1}, in a book \cs{chapter} will use
-% \texttt{H1} and \cs{section} \texttt{H2}.
+% \texttt{H1} and \cs{section} \texttt{H2}.
% Titles of \cs{part} are a bit out of this system as they are normally
% not part of the hierarchy: often only some chapters are grouped under a part.
-% Their title is therefore tagged as \texttt{Title}.
-% \item
+% Their title is therefore tagged as \texttt{Title}.
+% \item
% The whole section should normally be surrounded by
-% a \texttt{Sect} tag. Parts should be surrounded by \texttt{Part}.
-% It is a bit unclear if the headings should be inside or outside of these
-% structures---the best practice guide puts them outside---but on the whole
+% a \texttt{Sect} tag. Parts should be surrounded by \texttt{Part}.
+% It is a bit unclear if the headings should be inside or outside of these
+% structures---the best practice guide puts them outside---but on the whole
% it sounds more logical to group the heading with the text inside the \texttt{Sect}.
% For the part this is actually required, as there can be only one \texttt{Title}
-% in a structure, so the part title can't be at the same level as the
+% in a structure, so the part title can't be at the same level as the
% document \texttt{Title}.
-%
-% Starting such an enclosing \texttt{Sect} structure is rather easy,
-% but closing it requires code in various place,
-% for example the commands \cs{mainmatter}, \cs{backmatter},
-% \cs{frontmatter} and \cs{appendix} should typically close everything.
-% Following sectioning commands should close all previous structures
+%
+% Starting such an enclosing \texttt{Sect} structure is rather easy,
+% but closing it requires code in various place,
+% for example the commands \cs{mainmatter}, \cs{backmatter},
+% \cs{frontmatter} and \cs{appendix} should typically close everything.
+% Following sectioning commands should close all previous structures
% with a level equal or higher than their own level.
% \end{itemize}
-%
+%
% \section{Technical details and problems}
-%
+%
% The implementation has to take care of various details.
-%
+%
% \begin{itemize}
-%
-% \item As sections in \LaTeX{} are not environments, the
+%
+% \item As sections in \LaTeX{} are not environments, the
% \texttt{<Sect>} structures can be wrongly nested with other structures. For example
-% if a document puts a sectioning command into a list or a trivlist or
+% if a document puts a sectioning command into a list or a trivlist or
% a minipage then it can no longer close previous \texttt{<Sect>} structures correctly.
-% The problem can be detected by checking the structure stack
+% The problem can be detected by checking the structure stack
% and a warning can be issued, but the author then has to close the structures
-% manually before the list or minipage.
-%
+% manually before the list or minipage.
+%
% Thus there have to be user interfaces to handle such cases.
% It should also be possible not to create all the \texttt{<Sect>} structures
% automatically but to tag only the headings so that the author can handle special
-% cases manually.
-%
+% cases manually.
+%
% \item If hyperref is used, targets for links should be inserted, either with
% \cs{refstepcounter} or manually with \cs{MakeLinkTarget}. These targets must be
% in the correct structure for the structure destinations. They replace some
% of the current patches in hyperref.
-%
-% \item With lualatex the mc-commands set attributes \emph{locally}, so the
+%
+% \item With lualatex the mc-commands set attributes \emph{locally}, so the
% commands must be at the right grouping level.
% \end{itemize}
-%
+%
% \subsection{Functions and keys}
%
% \begin{function}{\tag_tool:n,\tagtool}
-%
+%
% \end{function}
-%
+%
% \subsection{TODO}
-%
+%
% \begin{itemize}
-% \item A dedicated command to close a sectioning unit should be provided.
-%
-% \item A dedicated command to open a sectioning unit should be provided too.
-%
+% \item A dedicated command to close a sectioning unit should be provided.
+%
+% \item A dedicated command to open a sectioning unit should be provided too.
+%
% \item It should also be possible to suppress the sectioning unit in sectioning commands
% to allow e.g. to put an epigraph or similar in front.
-%
-% \item The number in \cs{part} and \cs{chapter} is currently not correctly
-% tagged as a \texttt{Lbl} as this requires to redefine the internal (class dependent)
+%
+% \item The number in \cs{part} and \cs{chapter} is currently not correctly
+% tagged as a \texttt{section-number} as this requires to redefine the internal (class dependent)
% commands too.
-%
+%
% \end{itemize}
%
% \begin{macrocode}
@@ -152,16 +154,16 @@
\ProvidesExplPackage {latex-lab-testphase-sec} {\ltlabsecdate} {\ltlabsecversion}
{Code related to the tagging of sectioning commands}
% \end{macrocode}
-%
-% \subsection{Surrounding by \texttt{Sect} structures}
+%
+% \subsection{Surrounding by \texttt{Sect} structures}
% We use a stack to record the levels of the open \texttt{Sect}. The first item
% has level -100. A sectioning command will take a record from the stack. If its level is
% greater or equal it closes this structure and takes the next record from the stack.
% If the record has a smaller level then it puts it back and stops.
-% The stack is compared with the main structure stack, if they don't match
-% it means we can't safely close the \texttt{Sect} and so we issue a warning
-% and do nothing.
-%
+% The stack is compared with the main structure stack, if they don't match
+% it means we can't safely close the \texttt{Sect} and so we issue a warning
+% and do nothing.
+%
% \subsubsection{Loading general kernel changes}
% [kernel?]
% Also loaded in the toc-tagging code.
@@ -172,23 +174,23 @@
%</package>
% \end{macrocode}
% \subsubsection{Glyphtounicode improvements}
-%
+%
% As lualatex runs with legacy encodings in the test files, we enable and
% load glyphtounicode. For the math we load additional definitions.
-%
+%
% \begin{macrocode}
%<*kernelchange>
\ifdefined\directlua
- \ifnum\outputmode > 0
+ \ifnum\outputmode > 0
\pdfvariable gentounicode =1
\protected\def\pdfglyphtounicode {\pdfextension glyphtounicode }
- \protected\edef\pdfgentounicode {\pdfvariable gentounicode}
+ \protected\edef\pdfgentounicode {\pdfvariable gentounicode}
\input{glyphtounicode}
\fi
\fi
\ifdefined\pdfglyphtounicode
\input{glyphtounicode-cmex}
-\fi
+\fi
%</kernelchange>
% \end{macrocode}
%
@@ -197,7 +199,7 @@
%
% We must ensure that manual targets (e.g. in unnumbered sections)
% correctly update \cs{@currentHref}. For this we extend the kernel definition of
-% \cs{MakeLinkTarget}
+% \cs{MakeLinkTarget}
% TODO: remove after release 2024/11
% \begin{macrocode}
%<*kernelchange>
@@ -221,11 +223,11 @@
{
\int_gincr:N\g__kernel_target_int
\tl_gset:Ne \@currentHref {target*.\int_use:N\g__kernel_target_int}
- }
+ }
}
}
-\ExplSyntaxOff
-%</kernelchange>
+\ExplSyntaxOff
+%</kernelchange>
% \end{macrocode}
%
% \begin{macrocode}
@@ -242,7 +244,7 @@
\seq_gpush:Nn\g_@@_sec_stack_seq {{Document}{-100}{2}}
% \end{macrocode}
% \end{variable}
-%
+%
% \begin{macro}{\@@_get_data_current_Sect:}
% This allows to retrieve the number of the current Sect structure (or
% Document if we are outside any Sect) with |\tag_get:n{current_Sect}|
@@ -254,7 +256,7 @@
% \end{macrocode}
% \end{macro}
% \begin{variable}{\l_@@_sec_Sect_bool}
-% This boolean controls if a Sect structure is opened.
+% This boolean controls if a Sect structure is opened.
% \begin{macrocode}
\bool_new:N \l_@@_sec_Sect_bool
\bool_set_true:N\l_@@_sec_Sect_bool
@@ -262,23 +264,23 @@
% \end{variable}
%
% \begin{macro}{\@@_sec_begin:nn}
-% This starts a sectioning structure.
+% This starts a sectioning structure.
% Currently the tag is fix, either Sect or Part, depending on the level,
% but this will perhaps change. The second argument is currently unused.
% \begin{macrocode}
\cs_new_protected:Npn\@@_sec_begin:nn #1 #2 %#1 level #2 keyval
{
- \tag_struct_begin:n
+ \tag_struct_begin:n
{
tag= {\int_compare:nNnTF {#1}={-1}{Part}{Sect}}
,#2
- }
- \seq_gpush:Ne \g_@@_sec_stack_seq
- {{\g_@@_struct_tag_tl}{\int_eval:n{#1}}{\g_@@_struct_stack_current_tl}}
+ }
+ \seq_gpush:Ne \g_@@_sec_stack_seq
+ {{\g_@@_struct_tag_tl}{\int_eval:n{#1}}{\g_@@_struct_stack_current_tl}}
}
% \end{macrocode}
% \end{macro}
-%
+%
% \begin{macro}{\@@_sec_end:n}
% \begin{macrocode}
\msg_new:nnn { tag } {wrong-sect-nesting}
@@ -294,32 +296,32 @@
{
\seq_get:NN\g_@@_struct_tag_stack_seq \l_@@_tmpb_tl
\exp_args:Nee
- \tl_if_eq:nnTF
+ \tl_if_eq:nnTF
{\exp_last_unbraced:NV\use_i:nnn\l_@@_tmpa_tl}
{\exp_last_unbraced:NV\use_i:nn\l_@@_tmpb_tl}
{
\seq_gpop:NN \g_@@_sec_stack_seq \l_@@_tmpa_tl
\tag_struct_end:
- \@@_sec_end:n {#1}
+ \@@_sec_end:n {#1}
}
- {
+ {
\msg_warning:nnee {tag}{wrong-sect-nesting}
{ \exp_last_unbraced:NV\use_i:nnn \l_@@_tmpa_tl }
- { \exp_last_unbraced:NV\use_i:nn \l_@@_tmpb_tl }
+ { \exp_last_unbraced:NV\use_i:nn \l_@@_tmpb_tl }
}
- }
- }
+ }
+ }
% \end{macrocode}
% \end{macro}
% \begin{macro}{\@@_tool_para_split:}
-% Runin-sectioning command must separate the heading from the following text.
-%
+% Runin-sectioning command must separate the heading from the following text.
+%
% \begin{macrocode}
\cs_new_protected:Npn \@@_tool_para_split:
{
\tag_mc_end:
- \tag_struct_end:
+ \tag_struct_end:
\tag_struct_begin:n{tag=\l_@@_para_tag_default_tl}
\tag_mc_begin:n{}
\@@_setup_restore_para_default:
@@ -329,8 +331,8 @@
% \begin{macro}{\@@_setup_restore_para_default:}
% We change the para tagging in the sectioning code.
-% This here restores the default. Currently it only resets the
-% the tag, but perhaps more will be needed later.
+% This here restores the default. Currently it only resets the
+% the tag, but perhaps more will be needed later.
% \begin{macrocode}
\cs_new_protected:Npn \@@_setup_restore_para_default:
{
@@ -339,7 +341,7 @@
}
% \end{macrocode}
% \end{macro}
-%
+%
% \begin{macro}{\@@_sec_end_display:}
% \begin{macrocode}
\cs_new_protected:Npn \@@_sec_end_display:
@@ -354,21 +356,22 @@
% be done before tagpdf closes the Document structure.
% \begin{macrocode}
\hook_gput_code:nnn{tagpdf/finish/before}{tagpdf/sec}{\@@_sec_end:n{-10}}
-\hook_gset_rule:nnnn {tagpdf/finish/before}{tagpdf/sec}{before}{tagpdf}
+\hook_gset_rule:nnnn {tagpdf/finish/before}{tagpdf/sec}{before}{tagpdf}
% \end{macrocode}
%
% The commands \cs{mainmatter}, \cs{backmatter}, \cs{frontmatter} and
% \cs{appendix} close all \texttt{Sect} and \texttt{Part} structures.
+% \changes{v0.84g}{2025/01/05}{ensure that paragraph is ended (tagging/777)}
% \begin{macrocode}
-\AddToHook{cmd/frontmatter/before}{\@@_sec_end:n{-10}}
-\AddToHook{cmd/mainmatter/before} {\@@_sec_end:n{-10}}
-\AddToHook{cmd/backmatter/before} {\@@_sec_end:n{-10}}
-\AddToHook{cmd/appendix/before} {\@@_sec_end:n{-10}}
+\AddToHook{cmd/frontmatter/before}{\par\@@_sec_end:n{-10}}
+\AddToHook{cmd/mainmatter/before} {\par\@@_sec_end:n{-10}}
+\AddToHook{cmd/backmatter/before} {\par\@@_sec_end:n{-10}}
+\AddToHook{cmd/appendix/before} {\par\@@_sec_end:n{-10}}
% \end{macrocode}
%
% \subsection{Tagging tools}
% We need to provide user and package level commands
-%
+%
% \begin{macrocode}
\cs_if_free:NT \tag_tool:n
{
@@ -376,24 +379,24 @@
{
\tag_if_active:T { \keys_set:nn {tag / tool}{#1} }
}
- \cs_set_eq:NN\tagtool\tag_tool:n
- }
-\keys_define:nn { tag / tool}
+ \cs_set_eq:NN\tagtool\tag_tool:n
+ }
+\keys_define:nn { tag / tool}
{
- ,sec-start-part .code:n =
+ ,sec-start-part .code:n =
{
\bool_if:NT\l_@@_sec_Sect_bool
{
- \@@_sec_end:n {-1}
+ \@@_sec_end:n {-1}
\@@_sec_begin:nn{-1}{tag=Part}
- }
+ }
\tag_struct_begin:n{tag=part,title=#1}
% \end{macrocode}
% We remap here the text-unit from the paragraph to NonStruct.
% It would be better to suppress it completely as with the other
% sectioning commands, but this would require to redefine \cs{@spart}
% and \cs{@part}, as there is the grouping, and these commands are
-% all slightly different in the standard classes. So this is delayed
+% all slightly different in the standard classes. So this is delayed
% to the time when sectioning commands are redefined with templates.
% \begin{macrocode}
\tl_set:Nn\l_@@_para_main_tag_tl {NonStruct}
@@ -404,9 +407,9 @@
{
\bool_if:NT\l_@@_sec_Sect_bool
{
- \@@_sec_end:n {0}
+ \@@_sec_end:n {0}
\@@_sec_begin:nn{0}{tag=Sect}
- }
+ }
\tag_struct_begin:n{tag=chapter,title=#1}
% \end{macrocode}
% similar to part we remap to NonStruct for now ...
@@ -414,35 +417,35 @@
\tl_set:Nn\l_@@_para_main_tag_tl {NonStruct}
\tl_set:Nn\l_@@_para_tag_tl {Span}
}
- ,sec-stop-chapter .meta:n = { sec-stop-part}
- ,sec-start .code:n = % #1 is a name like "section"
- {
+ ,sec-stop-chapter .meta:n = { sec-stop-part}
+ ,sec-start .code:n = % #1 is a name like "section"
+ {
\bool_if:NT\l_@@_sec_Sect_bool
- {
- \@@_sec_end:n {\cs_if_exist_use:c{toclevel@#1}+0}
+ {
+ \@@_sec_end:n {\cs_if_exist_use:c{toclevel@#1}+0}
\@@_sec_begin:nn {\cs_if_exist_use:c{toclevel@#1}+0}{tag=Sect}
- }
+ }
\tl_set:Nn\l_@@_para_tag_tl{#1}
- }
- ,sec-start .value_required:n = true
+ }
+ ,sec-start .value_required:n = true
,sec-split-para .code:n = {\@@_tool_para_split:}
,restore-para .code:n = {\@@_setup_restore_para_default:}
- ,sec-stop .code:n =
+ ,sec-stop .code:n =
{
\par\@@_sec_end:n {\cs_if_exist_use:c{toclevel@#1}+0}
}
- ,sec-stop .value_required:n = true
+ ,sec-stop .value_required:n = true
,sec-add-grouping .bool_set:N = \l_@@_sec_Sect_bool
- }
+ }
% \end{macrocode}
%
%
% \section{Sectioning commands}
-%
+%
% \subsection{\cs{part} and \cs{chapter}}
%
-% \cs{part} and \cs{chapter} are defined by the classes.
-% To tag them we redefine the user commands.
+% \cs{part} and \cs{chapter} are defined by the classes.
+% To tag them we redefine the user commands.
% This will probably break with various classes and with titlesec.
% The tagging inside relies on the para tagging.
% We do not yet use keyval in the optional argument, as this requires latex-dev
@@ -475,34 +478,34 @@
% This adds a manual target if the part is unnumbered or starred.
% It replaces the hyperref patches.
% \begin{macrocode}
- \bool_lazy_any:nT
+ \bool_lazy_any:nT
{
- { #1 }
- {
- \int_compare_p:nNn {\c@secnumdepth}<{-1}
- }
- }
+ { #1 }
+ {
+ \int_compare_p:nNn {\c@secnumdepth}<{-1}
+ }
+ }
{
\MakeLinkTarget[part]{}
}
% \end{macrocode}
-% The main call to the underlying commands.
+% The main call to the underlying commands.
% \begin{macrocode}
- \IfBooleanTF
+ \IfBooleanTF
{#1}
{ \@spart {#3} }
{ \@part [{#2}]{#3} }
% \end{macrocode}
% and now the closing command for the tagging of the title.
% \begin{macrocode}
- \tag_tool:n {sec-stop-part}
+ \tag_tool:n {sec-stop-part}
}
- }
+ }
}
% \end{macrocode}
% Redefinitions for book and report
% \begin{macrocode}
- {
+ {
\RenewDocumentCommand\chapter{ s O{#3} m }
{
\if@openright\cleardoublepage\else\clearpage\fi
@@ -512,42 +515,42 @@
% \end{macrocode}
% This are the tagging commands needed at the begin. They open a Sect structure
% and the structure for the title of the heading.
-% \begin{macrocode}
- \tag_tool:n { sec-start-chapter= #2 }
+% \begin{macrocode}
+ \tag_tool:n { sec-start-chapter= #2 }
% \end{macrocode}
% This adds a manual target if the chapter is unnumbered or starred.
% It replaces the hyperref patches.
-% \begin{macrocode}
- \bool_lazy_any:nT
+% \begin{macrocode}
+ \bool_lazy_any:nT
{
- { #1 }
- {
- \int_compare_p:nNn {\c@secnumdepth}<{0}
- }
+ { #1 }
+ {
+ \int_compare_p:nNn {\c@secnumdepth}<{0}
+ }
{
%in book target also needed in frontmatter
- \bool_lazy_and_p:nn
- { \cs_if_exist_p:c { @mainmattertrue } }
+ \bool_lazy_and_p:nn
+ { \cs_if_exist_p:c { @mainmattertrue } }
{ ! \legacy_if_p:n { @mainmatter } }
}
- }
+ }
{
% \end{macrocode}
% The relation target-struct is stored internally by the MakeLinkTarget commands
% \begin{macrocode}
\MakeLinkTarget[chapter]{}
- }
+ }
% \end{macrocode}
-% The main call to the underlying commands.
-% \begin{macrocode}
- \IfBooleanTF
+% The main call to the underlying commands.
+% \begin{macrocode}
+ \IfBooleanTF
{#1}
{ \@schapter {#3} }
{ \@chapter [{#2}]{#3} }
% \end{macrocode}
% and now the closing command for the tagging of the title.
-% \begin{macrocode}
- \tag_tool:n {sec-stop-chapter}
+% \begin{macrocode}
+ \tag_tool:n {sec-stop-chapter}
}
% \end{macrocode}
% and similar for \cs{part}
@@ -570,67 +573,67 @@
% \end{macrocode}
% This are the tagging commands needed at the begin. They open a Part structure
% and the structure for the title of the heading.
-% \begin{macrocode}
- \tag_tool:n {sec-start-part=#2}
+% \begin{macrocode}
+ \tag_tool:n {sec-start-part=#2}
% \end{macrocode}
% This adds a manual target if the part is unnumbered or starred.
% It replaces the hyperref patches.
-% \begin{macrocode}
- \bool_lazy_any:nT
+% \begin{macrocode}
+ \bool_lazy_any:nT
{
- { #1 }
- {
- \int_compare_p:nNn {\c@secnumdepth}<{-1}
- }
+ { #1 }
+ {
+ \int_compare_p:nNn {\c@secnumdepth}<{-1}
+ }
{
%in book target also needed in frontmatter
- \bool_lazy_and_p:nn
- { \cs_if_exist_p:c { @mainmattertrue } }
+ \bool_lazy_and_p:nn
+ { \cs_if_exist_p:c { @mainmattertrue } }
{ ! \legacy_if_p:n { @mainmatter } }
}
- }
+ }
{
\MakeLinkTarget[part]{}
}
% \end{macrocode}
-% The main call to the underlying commands.
-% \begin{macrocode}
- \IfBooleanTF
+% The main call to the underlying commands.
+% \begin{macrocode}
+ \IfBooleanTF
{#1}
{ \@spart {#3} }
{ \@part [{#2}]{#3} }
% \end{macrocode}
% and now the closing command for the tagging of the title.
-% \begin{macrocode}
- \tag_tool:n{sec-stop-part}
- }
+% \begin{macrocode}
+ \tag_tool:n{sec-stop-part}
+ }
}
- }
+ }
% \end{macrocode}
%
% \subsection{Sectioning commands based on \cs{@startsection}}
-%
-% The tagging relies again on the para tagging:
+%
+% The tagging relies again on the para tagging:
% we simply exchange the tag name by the one given as \#1.
% This assumes that a tag with the name of the sectioning type is defined.
-% We don't try to pass the title, this will be done together with
+% We don't try to pass the title, this will be done together with
% the new keyval handling in the user command.
-%
+%
% \subsubsection{Hyperref code}
-% hyperref has to insert anchors. If the sectioning is numbered this is done by
-% \cs{refstepcounter} (and so in vmode). For unnumbered section hyperref
-% injects the anchor in hmode before the text, it also inserts a
-% kern to compensate the indent.
-%
+% hyperref has to insert anchors. If the sectioning is numbered this is done by
+% \cs{refstepcounter} (and so in vmode). For unnumbered section hyperref
+% injects the anchor in hmode before the text, it also inserts a
+% kern to compensate the indent.
+%
% This means that the target of numbered and unnumbered sectioning commands
-% differ, both regarding the location and in relation to the
+% differ, both regarding the location and in relation to the
% tagging structure: The anchor from the \cs{refstepcounter} is outside of
% the structure created by the heading title if the para tags are used,
-% while the other anchors are inside and so the structure destinations are different.
-%
+% while the other anchors are inside and so the structure destinations are different.
+%
% We unify this by suppressing the anchor from the refstepcounter.
% Also we only go back if the indent is positive.
-%
+%
% At first suppress all hyperref patches related to sectioning:
% \begin{macrocode}
\def\hyper@nopatch@sectioning{}
@@ -638,13 +641,15 @@
%
% \begin{macro}{\@hyp@section@target@nnn}
% A simple internal command. There is no need for something public,
-% as packages defining their own version of \cs{@startsection} will
-% probably need something slightly different based on \cs{MakeLinkTarget}.
+% as packages defining their own version of \cs{@startsection} will
+% probably need something slightly different based on \cs{MakeLinkTarget}.
+% \changes{v0.84i}{2025/02/13}{Wrapped all use inside \cs{NoCaseChange},
+% tagging-project issue \#787}
% \begin{macrocode}
\cs_new_protected:Npn \@hyp@section@target@nnn #1 #2 #3 %#1 optarg #2 name/counter, #3 indent
{
\makebox[0pt][l]
- {
+ {
\skip_set:Nn \@tempskipa {#3}
\dim_compare:nNnF {\@tempskipa}<{0pt}{\kern-\@tempskipa}
\MakeLinkTarget#1{#2}
@@ -652,7 +657,7 @@
}
% \end{macrocode}
% \end{macro}
-%
+%
% \subsection{Adaption of the heading commands}
% We add to \cs{@startsection} the commands to open the \texttt{Sect}
% structure and to change the para tag.
@@ -674,19 +679,23 @@
\tag_tool:n { sec-start=#1}%new
\@ifstar
{\@ssect{#3}{#4}{#5}{#6}}%
- {\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}}
+ {\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}}
% \end{macrocode}
-% To be able to correctly tag the number we need a special
+% To be able to correctly tag the number we need a special
% \cs{@hangfrom} variant. This is a bit tricky:
-% As the paragraph starts after the \cs{setbox} luatex attributes
+% As the paragraph starts after the \cs{setbox} luatex attributes
% are not set yet and numbers are unmarked if one doesn't pay attention.
% The code assumes that we are in vmode!
+% 2025-01-20: Until the redefinition is gone from tagpdf we have to empty the hook:
+% \begin{macrocode}
+\RemoveFromHook{package/latex-lab-testphase-sec/after}[tagpdf]
+% \end{macrocode}
% \begin{macrocode}
\cs_new_protected:Npn \@kernel@tag@hangfrom #1
{
\tagstructbegin{tag=\l_@@_para_tag_tl}
\cs_if_exist_use:N \@@_gincr_para_begin_int:
- \tagstructbegin{tag=Lbl}
+ \tagstructbegin{tag=section-number}
\setbox\@tempboxa
\hbox
{
@@ -696,12 +705,12 @@
\bool_lazy_and:nnT
{\tag_if_active_p:}
{\g_@@_mode_lua_bool}
- {\tagmcbegin{tag=Lbl}}
+ {\tagmcbegin{tag=section-number}}
{#1}
}
% \end{macrocode}
% We stop tagging now, to avoid that the \cs{noindent} triggers
-% the paratagging. We do not disable paratagging completely, to
+% the paratagging. We do not disable paratagging completely, to
% avoid that the numbering goes wrong.
% \begin{macrocode}
\tag_suspend:n{hangfrom}
@@ -714,31 +723,31 @@
% \end{macrocode}
% This command is used to tag the numbers of runin. We do not try
% to avoid the empty container from the paratagging, this would require
-% more changes.
+% more changes.
% \begin{macrocode}
\cs_new_protected:Npn \@kernel@tag@svsec
{
- \tag_mc_end_push:
- \tag_struct_begin:n{tag=Lbl}
- \tag_mc_begin:n{}
+ \tag_mc_end_push:
+ \tag_struct_begin:n{tag=section-number}
+ \tag_mc_begin:n{}
\@svsec
\tag_mc_end:
\tag_struct_end:
\tag_mc_begin_pop:n{}
- }
+ }
% \end{macrocode}
% \cs{@sect} is only changed to replace the hyperref patches
% and to use the new \cs{@kernel@tag@hangfrom} and \cs{@kernel@tag@svsec}
% \begin{macrocode}
%<@@=>
-\def\@sect#1#2#3#4#5#6[#7]#8{%
+\def\@sect#1#2#3#4#5#6[#7]#8{%
\ifnum #2>\c@secnumdepth
- \def\@svsec{\@hyp@section@target@nnn{[section]}{}{#3}}
+ \def\@svsec{\NoCaseChange{\@hyp@section@target@nnn{[section]}{}{#3}}}
\else
\LinkTargetOff
\refstepcounter{#1}%
\LinkTargetOn
- \protected@edef\@svsec{\@hyp@section@target@nnn{}{#1}{#3}\@seccntformat{#1}\relax}%
+ \protected@edef\@svsec{\NoCaseChange{\@hyp@section@target@nnn{}{#1}{#3}}\@seccntformat{#1}\relax}%
\fi
\@tempskipa #5\relax
\ifdim \@tempskipa>\z@
@@ -747,9 +756,9 @@
#6{%
\ifnum #2>\c@secnumdepth
\@hangfrom {\hskip #3\relax\@svsec}%
- \else
+ \else
\@kernel@tag@hangfrom{\hskip #3\relax\@svsec}%
- \fi
+ \fi
\interlinepenalty \@M #8\@@par}%
\endgroup
\csname #1mark\endcsname{#7}%
@@ -763,7 +772,7 @@
#6{\hskip #3\relax
\ifnum #2>\c@secnumdepth
\@svsec
- \else
+ \else
\@kernel@tag@svsec
\fi #8}%
\csname #1mark\endcsname{#7}%
@@ -783,16 +792,16 @@
\begingroup
\tagtool{para-flattened=true}
#4{%
- \@hangfrom{\hskip #1\relax\@hyp@section@target@nnn{[section]}{}{#1}}%
+ \@hangfrom{\hskip #1\relax\NoCaseChange{\@hyp@section@target@nnn{[section]}{}{#1}}}%
\interlinepenalty \@M #5\@@par}%
\endgroup
\else
- \def\@svsechd{#4{\hskip #1\relax\@hyp@section@target@nnn{[section]}{}{#3}\relax #5}}%
+ \def\@svsechd{#4{\hskip #1\relax\NoCaseChange{\@hyp@section@target@nnn{[section]}{}{#3}}\relax #5}}%
\fi
- \@xsect{#3}}
+ \@xsect{#3}}
% \end{macrocode}
% At last \cs{@xsect} needs code in two places. For display headings it has to
-% restore the default para code, for run in headings it has to separated the
+% restore the default para code, for run in headings it has to separated the
% heading from the following text.
% \begin{macrocode}
\def\@xsect#1{%
@@ -820,14 +829,14 @@
\everypar{}%
\fi}%
\fi
- \ignorespaces}
-%</package>
+ \ignorespaces}
+%</package>
% \end{macrocode}
% \begin{macrocode}
%<*latex-lab>
\ProvidesFile{sec-latex-lab-testphase.ltx}
- [\ltlabsecdate\space v\ltlabsecversion\space latex-lab wrapper sec]
+ [\ltlabsecdate\space v\ltlabsecversion\space latex-lab wrapper sec]
\RequirePackage{latex-lab-testphase-sec}
%</latex-lab>
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-table.dtx b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-table.dtx
index c65667e8ed3..c10352f096a 100644
--- a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-table.dtx
+++ b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-table.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-%% File: latex-lab-table.dtx (C) Copyright 2023-2024 LaTeX Project
+%% File: latex-lab-table.dtx (C) Copyright 2023-2025 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
@@ -16,8 +16,8 @@
%
% for those people who are interested or want to report an issue.
%
-\def\ltlabtbldate{2024-09-18}
-\def\ltlabtblversion{0.85n}
+\def\ltlabtbldate{2025-01-05}
+\def\ltlabtblversion{0.85p}
%<*driver>
\documentclass{l3doc}
\EnableCrossrefs
@@ -138,17 +138,24 @@
% as a layout to ensure that the content is properly aligned
% or because it is a not yet (fully) supported table structure,
% the tagging can be disabled with
-% \verb|\tagpdfsetup{table/tagging=false}| or with \verb|\tagpdfsetup{table/tagging=presentation}|%
+% \verb|\tagpdfsetup{table/tagging=false}| or changed with
+% \verb|\tagpdfsetup{table/tagging=presentation}| or \verb|\tagpdfsetup{table/tagging=div}|%
% \footnote{The key has been renamed. The old name `table-tagging` still works but is
% deprecated. The value \texttt{presentation} refers to the ARIA role \enquote{presentation}.}
% The first option disables the table tagging code and the content of the tabular
% is then treated more or less like running text. This works ok for simple tables using
% only hmode-cells (l/c/r) with normal text content, but fails if the table uses vmode-cells
-% (p/m/b). In such cases the second option works better: it keeps the tagging code active
-% but changes the tag names to \texttt{Div} and the grouping structure \texttt{NonStruct}. It also
-% (re)sets the \texttt{table/header-rows} key to empty.
-% The key should currently only be used in a group as there is no key (yet) to reset to the default
-% tag names.
+% (p/m/b). In such cases the second option works better: it keeps the tagging code active,
+% but adds an ARIA-role as attribute to indicate that this is a presentation table.
+% When deriving to html this gives the best result
+% as it keeps the layout.
+% The last option changes the tag names and creates simply a number of DIV structures.
+% Both options also
+% (re)set the \texttt{table/header-rows} and \texttt{table/header-columns} keys to empty.
+%
+% To reset to the normal tagging in the current group (e.g. inside a presentation
+% table) one can use \verb|\tagpdfsetup{table/tagging=true}| (and if needed reenable the headers).
+%
%
% \subsection{Header rows and columns}
% There is some basic support\footnote{This is not meant to be the
@@ -228,7 +235,8 @@
% \item Not every table should be tagged as a Table structure, often they are
% only used as layout help, e.g. to align authors in a title pages. In such uses
% the tagging of the table must be deactivated with \verb|\tagpdfsetup{table/tagging=false}|
-% or \verb|\tagpdfsetup{table/tagging=presentation}|.
+% or changed with \verb|\tagpdfsetup{table/tagging=presentation}| or
+% \verb|\tagpdfsetup{table/tagging=div}|.
%
% \item Only simple header rows and columns are currently supported. Complex headers with
% subheaders will be handled later as that needs some syntax changes. Tables
@@ -359,7 +367,7 @@
% The following two sockets are defined in lttagging, but we check
% for their existence until the release 11/2024.
% \begin{macrocode}
-\str_if_exist:cF { l__socket_tagsupport/tbl/init/celldata_plug_str }
+\socket_if_exist:nF {tagsupport/tbl/init/celldata}
{
\NewSocket{tagsupport/tbl/init/celldata}{0}
\NewSocket{tagsupport/tbl/restore/celldata}{0}
@@ -827,9 +835,6 @@
% \end{macrocode}
% \end{plugdecl}
%
-%
-%
-%
% \begin{plugdecl}{Table}
% \begin{macrocode}
\NewSocketPlug{tagsupport/tbl/hmode/begin}{Table}
@@ -847,6 +852,26 @@
}
% \end{macrocode}
% \end{plugdecl}
+%
+% \begin{plugdecl}{LayoutTable}
+% \changes{v0.85p}{2025/01/05}{new plugs for layout tables (tagging/778)}
+% This plug is meant for presentation tables, it sets the ARIA role.
+% \begin{macrocode}
+\NewSocketPlug{tagsupport/tbl/hmode/begin}{LayoutTable}
+ {
+ \tag_mc_end_push:
+% \end{macrocode}
+% Close the P-chunk. This assumes that para-tagging is active.
+% For nested tables that is not necessarily true, so we test for it.
+% \begin{macrocode}
+ \bool_lazy_and:nnT
+ { \bool_if_exist_p:N \l__tag_para_bool } { \l__tag_para_bool }
+ { \tag_struct_end:n { text } }
+ \tag_struct_begin:n {tag=\l_@@_tabletag_tl,attribute-class=ARIA-role-presentation}
+ \tl_gset:Ne \g_@@_struct_table_tl { \tag_get:n {struct_num} }
+ }
+% \end{macrocode}
+% \end{plugdecl}
%
% \begin{plugdecl}{Table}
% \begin{macrocode}
@@ -874,6 +899,17 @@
}
% \end{macrocode}
% \end{plugdecl}
+%
+% \begin{plugdecl}{Table}
+% \begin{macrocode}
+\NewSocketPlug{tagsupport/tbl/vmode/begin}{LayoutTable}
+ {
+ \tag_struct_begin:n {tag=\l_@@_tabletag_tl,attribute-class=ARIA-role-presentation}
+ \tl_gset:Ne \g_@@_struct_table_tl { \tag_get:n {struct_num} }
+ }
+% \end{macrocode}
+% \end{plugdecl}
+%
%
% \begin{plugdecl}{Table}
% \begin{macrocode}
@@ -1015,26 +1051,58 @@
}
% \end{macrocode}
% \end{macro}
+%
+% \begin{macro}{\@@_init_tagnames_default:,\@@_init_tagnames_div:}
+% These commands are used to switch the tagnames.
+% \begin{macrocode}
+\cs_new_protected:Npn\@@_init_tagnames_default:
+ {
+ \tl_set:Nn\l_@@_rowtag_tl {TR}
+ \tl_set:Nn\l_@@_pcelltag_tl {TD}
+ \tl_set:Nn\l_@@_celltag_tl {TD}
+ \tl_set:Nn\l_@@_tabletag_tl {Table}
+ }
+
+\cs_new_protected:Npn\@@_init_tagnames_div:
+ {
+ \tl_set:Nn\l_@@_rowtag_tl {NonStruct}
+ \tl_set:Nn\l_@@_pcelltag_tl {NonStruct}
+ \tl_set:Nn\l_@@_celltag_tl {text}
+ \tl_set:Nn\l_@@_tabletag_tl {Div}
+ }
+% \end{macrocode}
+% \end{macro}
% \begin{macrocode}
% See tagpdfsetup-keys.md in tagpdf/doc for the naming scheme.
\keys_define:nn { __tag / setup }
{
table/tagging .choices:nn = { true, on }
- { \__tag_tbl_enable: },
+ {
+ \__tag_tbl_enable:
+ \@@_init_tagnames_default:
+ },
table/tagging .choices:nn = { false, off }
{ \__tag_tbl_disable: },
table/tagging .choice:,
table/tagging / presentation .code:n =
- {
- \__tag_tbl_enable:
- \tl_set:Nn\l_@@_rowtag_tl {NonStruct}
- \tl_set:Nn\l_@@_pcelltag_tl {NonStruct}
- \tl_set:Nn\l_@@_celltag_tl {text}
- \tl_set:Nn\l_@@_tabletag_tl {Div}
- \clist_clear:N \l_@@_header_rows_clist
- \clist_clear:N \l_@@_header_columns_clist
- },
+ {
+ \__tag_tbl_enable:
+ \@@_init_tagnames_default:
+ \AssignSocketPlug{tagsupport/tbl/hmode/begin}{LayoutTable}
+ \AssignSocketPlug{tagsupport/tbl/vmode/begin}{LayoutTable}
+ \clist_clear:N \l_@@_header_rows_clist
+ \clist_clear:N \l_@@_header_columns_clist
+ },
+ table/tagging / div .code:n =
+ {
+ \__tag_tbl_enable:
+ \@@_init_tagnames_div:
+ \AssignSocketPlug{tagsupport/tbl/hmode/begin}{LayoutTable}
+ \AssignSocketPlug{tagsupport/tbl/vmode/begin}{LayoutTable}
+ \clist_clear:N \l_@@_header_rows_clist
+ \clist_clear:N \l_@@_header_columns_clist
+ },
table/tagging .default:n = true,
table/tagging .initial:n = true
}
@@ -1071,6 +1139,7 @@
% At first we define attributes for the three standard cases:
% We delay to begin document
% as we can't know if tagpdf is already loaded.
+% \changes{v0.85p}{2025/01/05}{add ARIA-role for presentation (tagging/778)}
% \begin{macrocode}
\AddToHook{begindocument}
{
@@ -1084,6 +1153,8 @@
{TH-row}{/O /Table /Scope /Row},
role/new-attribute =
{TH-both}{/O /Table /Scope /Both},
+ role/new-attribute =
+ {ARIA-role-presentation}{/O /ARIA-1.1/role (presentation)}
}
% \end{macrocode}
%
diff --git a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-testphase.dtx b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-testphase.dtx
index 1134654cd6b..7623da48448 100644
--- a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-testphase.dtx
+++ b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-testphase.dtx
@@ -1,7 +1,7 @@
% \iffalse meta-comment
%
%% File: latex-lab-testphase.dtx
-% Copyright (C) 2021-2024 The LaTeX Project
+% Copyright (C) 2021-2025 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
@@ -145,11 +145,13 @@
% \begin{macrocode}
%<*math-package>
\ProvidesPackage{latex-lab-testphase-math}
- [2023-07-20 v0.8a code related to the math tagging]
+ [2025-01-24 v0.8c code related to the math tagging]
\input{latex-lab-math.ltx}
-\input{latex-lab-amsmath.ltx}
-\input{latex-lab-mathtools.ltx}
+\AddToHook{package/amsmath/after}{\input{latex-lab-amsmath.ltx}}
+\AddToHook{package/mathtools/after}{\input{latex-lab-mathtools.ltx}}
\input{latex-lab-mathpkg.ltx}
+\input{latex-lab-mathintent.ltx}
+\AddToHook{package/unicode-math/after}{\input{latex-lab-unicode-math.ltx}}
%</math-package>
% \end{macrocode}
% \Finale
diff --git a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-text.dtx b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-text.dtx
index 7ca99191dcd..3e8b35aeb68 100644
--- a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-text.dtx
+++ b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-text.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-%% File: latex-lab-text.dtx (C) Copyright 2023-2024 LaTeX Project
+%% File: latex-lab-text.dtx (C) Copyright 2023-2025 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
@@ -16,11 +16,16 @@
%
% for those people who are interested or want to report an issue.
%
-\def\ltlabtextdate{2024-09-18}
-\def\ltlabtextversion{0.85b}
+\def\ltlabtextdate{2025-02-18}
+\def\ltlabtextversion{0.85e}
%<*driver>
\documentclass{l3doc}
+% for the phoneme argument
+\DeclareUnicodeCharacter{02C8}{\texttt{\textquotesingle}}
+\DeclareUnicodeCharacter{02D0}{\texttt{:}}
+\DeclareUnicodeCharacter{025B}{$\epsilon$}
+
\EnableCrossrefs
\CodelineIndex
\begin{document}
@@ -51,13 +56,13 @@
%
% The followings contains small changes to improve the tagging of
% (inline) text commands.
-%
+%
% While the tagging of the \LaTeX{} logo is quite straightforward, tagging of
% \cs{emph} as \texttt{EM} and \cs{textbf} as \texttt{Strong}
% can have unwanted side-effect as both tags are inline tags and so not every inner
% structure is allowed. Probably both commands will need an optional argument or a
% starred variant which suppress the tagging.
-%
+%
% \section{Implementation}
% \begin{macrocode}
%<*package>
@@ -76,12 +81,12 @@
{
\mode_leave_vertical:
\tag_mc_end_push:
- \tag_struct_begin:n{tag=Span,actualtext=LaTeX}
+ \tag_struct_begin:n{tag=Span,actualtext=LaTeX,phoneme=[ˈlaːtɛx]}
\tag_mc_begin:n{}
\tag_suspend:n{LaTeX}
}
\AddToHook{cmd/LaTeX/after}
- {
+ {
\tag_resume:n{LaTeX}
\tag_mc_end:
\tag_struct_end:
@@ -102,7 +107,7 @@
}
% \end{macrocode}
%
-% \subsection{Emphasizing}
+% \subsection{Emphasizing}
% We tag \cs{emph} but leave commands like \cs{textbf} alone, as it is not
% clear if they always have a semantic meaning.
% \begin{macrocode}
@@ -121,6 +126,77 @@
\tag_mc_begin_pop:n{}
}
% \end{macrocode}
+%
+% \subsection{cs{mbox}}
+% When used in math and when luamml is active \cs{mbox} has to be correctly annoted.
+% For this we add a socket that luamml can activate.
+% We test for the socket until 2025-06-01.
+% \changes{v0.85c}{2024-12-03}{Add luamml socket to \cs{mbox}}
+% \begin{macrocode}
+\DeclareRobustCommand\mbox[1]
+ {
+ \leavevmode
+ \tag_socket_use:nnn {math/luamml/hbox}
+ {}{ \hbox{#1} }
+ }
+% \end{macrocode}
+% And the same for \cs{makebox}
+% \begin{macrocode}
+\long\def\@imakebox[#1][#2]#3{%
+ \tag_socket_use:nnn {math/luamml/hbox}{}
+ {
+ \@begin@tempboxa\hbox{#3}%
+ \setlength\@tempdima{#1}% support calc
+ \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
+ }}
+% \end{macrocode}
+%
+% \subsection{phantom commands}
+%
+% In text mode we do not want the content of a phantom command to create a structure,
+% so we suspend tagging
+% \changes{0.85d}{2025-01-27}{Suspend tagging in \cs{makeph@nt}}
+% TODO: consider if it makes sense to set measuring to true instead.
+% \cs{mathsm@sh} is redefined in latex-lab-math.
+% \begin{macro}{\makeph@nt}
+% \begin{macrocode}
+\def\makeph@nt#1{%
+ \setbox\z@\hbox
+ {\SuspendTagging{\makeph@nt}%
+ \color@begingroup#1\color@endgroup\ResumeTagging{\makeph@nt}}\finph@nt}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@kernel@mathph@nt,\mathph@nt}
+% \begin{macrocode}
+\def\@kernel@mathph@nt#1#2{%
+ \setbox\z@\hbox{\SuspendTagging{\mathph@nt}$\m@th#1{#2}$\ResumeTagging{\mathph@nt}}\finph@nt}
+\def\mathph@nt#1#2
+ {
+ \setbox \z@ = \hbox {
+ $
+ \m@th
+ #1
+ {
+% nested phantoms should not be processed by luamml
+ \let\mathph@nt\@kernel@mathph@nt
+ #2
+ }
+ \UseTaggingSocket{math/luamml/save/nNn}{{mathphant} #1 {mphantom}}
+ $
+ }
+ \UseTaggingSocket{math/luamml/finph@nt}{}{\finph@nt}
+ }
+% \end{macrocode}
+% \end{macro}
% \begin{macrocode}
%</package>
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-title.dtx b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-title.dtx
index 757bb284a45..cd6a0e6e679 100644
--- a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-title.dtx
+++ b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-title.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-%% File: latex-lab-title.dtx (C) Copyright 2023-2024 LaTeX Project
+%% File: latex-lab-title.dtx (C) Copyright 2023-2025 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
@@ -16,7 +16,7 @@
%
% for those people who are interested or want to report an issue.
%
-\def\ltlabtitledate{2024-02-09}
+\def\ltlabtitledate{2024-12-12}
\def\ltlabtitleversion{0.85c}
%<*driver>
@@ -106,7 +106,7 @@
% \begin{itemize}
% \item Writing into the Info dictionary needs to convert the input into a PDF string.
% This is here done with a simple version of hyperref's \cs{pdfstringdef}, similar code
-% exist also in in the generic hyperref driver. This should be moved into a better place
+% exist also in the generic hyperref driver. This should be moved into a better place
% module.
%
% \item Is it sensible to enhance \cs{author} and \cs{title} with an optional argument as done here?
diff --git a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-toc-hyperref-changes.dtx b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-toc-hyperref-changes.dtx
index ff9dd950b76..ab2a35849dc 100644
--- a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-toc-hyperref-changes.dtx
+++ b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-toc-hyperref-changes.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-%% File: latex-lab-toc-hyperref-changes.dtx (C) Copyright 2022-2024 LaTeX Project
+%% File: latex-lab-toc-hyperref-changes.dtx (C) Copyright 2022-2025 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
diff --git a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-toc-kernel-changes.dtx b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-toc-kernel-changes.dtx
index 2934a261685..7722a2a64a9 100644
--- a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-toc-kernel-changes.dtx
+++ b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-toc-kernel-changes.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-%% File: latex-lab-toc-kernel-changes.dtx (C) Copyright 2022-2024 LaTeX Project
+%% File: latex-lab-toc-kernel-changes.dtx (C) Copyright 2022-2025 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
@@ -17,8 +17,8 @@
% for those people who are interested or want to report an issue.
%
% dates for latex-lab-kernel-changes.sty (pulled from various sources, see ins)
-\def\ltlabkerneldate{2024-07-11}
-\def\ltlabkernelversion{0.85d}
+\def\ltlabkerneldate{2024-12-27}
+\def\ltlabkernelversion{0.85e}
%<*driver>
\documentclass{l3doc}
\EnableCrossrefs
@@ -154,7 +154,7 @@
% the next main release, so for now we test if they are in the
% format and if not define them now.
% \begin{macrocode}
-\str_if_exist:cF { l__socket_tagsupport/toc/contentsline/before_plug_str }
+\socket_if_exist:nF {tagsupport/toc/contentsline/before}
{
\NewSocket{tagsupport/toc/contentsline/before}{1}
\NewSocket{tagsupport/toc/contentsline/after}{1}
@@ -203,7 +203,7 @@
% the next main release, so for now we test if they are in the
% format and if not define them now.
% \begin{macrocode}
-\str_if_exist:cF { l__socket_tagsupport/toc/starttoc/before_plug_str }
+\socket_if_exist:nF {tagsupport/toc/starttoc/before}
{
\NewSocket{tagsupport/toc/starttoc/before}{1}
\NewSocket{tagsupport/toc/starttoc/after}{1}
@@ -270,7 +270,7 @@
% the next main release, so for now we test if they are in the
% format and if not define them now.
% \begin{macrocode}
-\str_if_exist:cF { l__socket_tagsupport/toc/leaders/before_plug_str }
+\socket_if_exist:nF {tagsupport/toc/leaders/before}
{
\NewSocket{tagsupport/toc/leaders/before}{0}
\NewSocket{tagsupport/toc/leaders/after}{0}
diff --git a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-toc.dtx b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-toc.dtx
index 15dd403bdf1..98a6621b4f2 100644
--- a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-toc.dtx
+++ b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-toc.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-%% File: latex-lab-toc.dtx (C) Copyright 2022-2024 LaTeX Project
+%% File: latex-lab-toc.dtx (C) Copyright 2022-2025 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
@@ -16,7 +16,7 @@
%
% for those people who are interested or want to report an issue.
%
-\def\ltlabtocdate{2024-09-26}
+\def\ltlabtocdate{2024-12-27}
\def\ltlabtocversion{0.85e}
%<*driver>
\documentclass{l3doc}
@@ -114,7 +114,7 @@
% Defined by tagpdf.
% \end{variable}
%
-% We have to to store the relation between
+% We have to store the relation between
% destination names/\cs{@currentHref} and structure numbers.
% With a current kernel this is done in \cs{refstepcounter}
% through the |recordtarget| socket. If that doesn't exist yet
@@ -341,7 +341,7 @@
% \end{plugdecl}
%
% \subsection{Tagging of the content}
-% This need discussion.
+% This needs discussion.
%
% \begin{macrocode}
\AddToHook{contentsline/text/before}[tagpdf]{%
diff --git a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-unicode-math.dtx b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-unicode-math.dtx
new file mode 100644
index 00000000000..5895a07c29d
--- /dev/null
+++ b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-unicode-math.dtx
@@ -0,0 +1,175 @@
+% \iffalse meta-comment
+%
+%% File: latex-lab-unicode-math.dtx
+%
+% Copyright (C) 2024 The LaTeX Project
+%
+% It may be distributed and/or modified under the conditions of the
+% LaTeX Project Public License (LPPL), either version 1.3c of this
+% license or (at your option) any later version. The latest version
+% of this license is in the file
+%
+% https://www.latex-project.org/lppl.txt
+%
+%
+% The development version of the bundle can be found below
+%
+% https://github.com/latex3/latex2e/required/latex-lab
+%
+% for those people who are interested or want to report an issue.
+%
+%<*driver>
+\documentclass{l3doc}
+\EnableCrossrefs
+\CodelineIndex
+\begin{document}
+ \DocInput{latex-lab-unicode-math.dtx}
+\end{document}
+%</driver>
+%
+% \fi
+%
+%
+% \title{The \texttt{latex-lab-unicode-math} code\thanks{}}
+% \author{\LaTeX{} Project}
+%
+% \maketitle
+%
+% \newcommand\fmi[1]{\begin{quote} TODO: \itshape #1\end{quote}}
+% \newcommand\NEW[1]{\marginpar{\mbox{}\hfill\fbox{New: #1}}}
+% \providecommand\class[1]{\texttt{#1.cls}}
+% \providecommand\pkg[1]{\texttt{#1}}
+% \providecommand\hook[1]{\texttt{#1}}
+%
+% \begin{abstract}
+% \end{abstract}
+%
+% \tableofcontents
+%
+% \section{Introduction}
+%
+% This file implements temporary adaptations to the \pkg{unicode-math} package needed for
+% the tagging project.
+%
+% \MaybeStop{\setlength\IndexMin{200pt} \PrintIndex }
+%
+% \section{The Implementation}
+%
+% \begin{macrocode}
+%<@@=math>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<*kernel>
+% \end{macrocode}
+%
+% \subsection{File declaration}
+% \begin{macrocode}
+\ProvidesExplFile
+ {latex-lab-unicode-math.ltx}
+ {2025-02-00}
+ {0.1b}
+ {unicode-math adaptions}
+% \end{macrocode}
+% \subsection{Sockets}
+% Unicode glyphs like a root sign should be marked as artifacts to avoid duplication
+% in derivation if mathml structure elements are used. This is done with a luamml socket.
+% \begin{macrocode}
+\str_if_exist:cF { l__socket_tagsupport/math/luamml/artifact_plug_str }
+ {
+ \NewSocket{tagsupport/math/luamml/artifact}{0}
+ }
+% \end{macrocode}
+%
+% \subsection{Delimiters}
+%
+% Extensible delimiters set with \cs{bigl}, \cs{Bigl}, etc.\ use boxes in their
+% definitions. This gives wrong structure elements if used with luamml.
+% We therefore redefine the internal amsmath command
+% to make use of the luatex primitive.
+% \changes{v0.1b}{2025-02-10}{redefine \cs{bBigg@}}
+% \begin{macro}{\bBigg@}
+% \begin{macrocode}
+\def\bBigg@#1#2
+ {{\ensuremath {\Uvextensible height~#1 \big@size axis~exact~#2}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{varlim-commands}
+%
+% The commands \cs{varinjlim}, \cs{varliminf}, \cs{varprojlim} and \cs{varlimisup}
+% use boxes that confuse luamml. We redefine them to use luatex primitives. This slightly
+% changes the look!
+% \begin{macrocode}
+\protected\def\varinjlim
+ {{\Udelimiterunder 0 "2192 {\qopname\relax o{\luamml_ignore:\mathstrut lim}}}}
+\protected\def\varprojlim
+ {{\Udelimiterunder 0 "2190 {\qopname\relax o{\luamml_ignore:\mathstrut lim}}}}
+\protected\def\varlimsup
+ {{\overline{\qopname\relax o{\luamml_ignore:\mathstrut lim}}}}
+\protected\def\varliminf
+ {{\underline{\qopname\relax o{lim}}}}
+% \end{macrocode}
+%
+% \subsection{Roots}
+% Roots have two problems in tagging: At first, if mathml structure elements are
+% used, the root symbol is given twice: as Unicode char and through the \texttt{msqrt}
+% or \texttt{mroot} mathml structure element. In derivation this leads to duplications.
+% The glyph should be tagged as artifact in this case.
+% At second, in some cases complicated box constructions instead of the
+% luatex primitives are used which leads to wrong tagging.
+% We redefine \cs{sqrtsign} and add the artifact socket for the first problem.
+%
+% TODO: A root with empty argument should be tagged differently.
+% \begin{macrocode}
+\AtBeginDocument
+ {
+ \cs_gset_protected_nopar:Npn \sqrtsign
+ {
+ \tag_socket_use:n {math/luamml/artifact}
+ \tex_Uradical:D \symoperators "0221A\scan_stop:
+ }
+ }
+% \end{macrocode}
+% TODO: Tagging of \verb+\sqrt[\leftroot{-2}\uproot{2}\beta]{y}+ is currently incorrect,
+% but setting \cs{Umathradicaldegreeraise} and \cs{Umathradicaldegreeafter} does not
+% work, so another solution must be found (or a warning must be issued).
+% \begin{macrocode}
+\cs_set_nopar:Npn \plainroot@ #1 \of #2
+ {
+ \bool_if:nTF
+ {
+ \__um_int_if_zero_p:n \uproot@ && \__um_int_if_zero_p:n \leftroot@
+ }
+ {
+ \tag_socket_use:n {math/luamml/artifact}
+ \Uroot \c__um_radical_sqrt_tl { #1 } { #2 }
+ }
+ {
+ \hbox_set:Nn \rootbox
+ {
+ \c_math_toggle_token \m@th
+ \scriptscriptstyle { #1 }
+ \c_math_toggle_token
+ }
+ \mathchoice
+ { \r@@@@t \displaystyle { #2 } }
+ { \r@@@@t \textstyle { #2 } }
+ { \r@@@@t \scriptstyle { #2 } }
+ { \r@@@@t \scriptscriptstyle { #2 } }
+ }
+ \c_group_end_token
+ }
+% \end{macrocode}
+% \subsection{Fractions}
+% Similar to roots in fractions the rule must be marked as artifact.
+% \begin{macrocode}
+\DeclareRobustCommand {\frac}[2]
+ {{\tag_socket_use:n{math/luamml/artifact}\Ustack{\begingroup#1\endgroup\@@@@over#2}}}
+% \end{macrocode}
+% \begin{macrocode}
+%</kernel>
+% \end{macrocode}
+%
+% \Finale
+%
diff --git a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab.ins b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab.ins
index 7071ed6e3dc..9089292c269 100644
--- a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab.ins
+++ b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab.ins
@@ -3,7 +3,7 @@
%% driver files from the dtx file(s) in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright (C) 2021-2023 The LaTeX Project
+%% Copyright (C) 2021-2025 The LaTeX Project
%%
%%
%% This file is part of the `LaTeX-lab Bundle' for LaTeX.
@@ -35,7 +35,7 @@
This is a generated file.
-Copyright 2021-2023 LaTeX Project
+Copyright 2021-2025 LaTeX Project
This file was generated from file(s) of the `LaTeX-lab Bundle'.
------------------------------------------------------------------------------------
@@ -97,6 +97,8 @@ where one can also log issues in case there are any.
\generate{\file{latex-lab-amsmath.ltx}{\from{latex-lab-amsmath.dtx}{kernel}}}
\generate{\file{latex-lab-mathtools.ltx}{\from{latex-lab-mathtools.dtx}{kernel}}}
\generate{\file{latex-lab-mathpkg.ltx}{\from{latex-lab-mathpkg.dtx}{kernel}}}
+\generate{\file{latex-lab-mathintent.ltx}{\from{latex-lab-mathintent.dtx}{kernel}}}
+\generate{\file{latex-lab-unicode-math.ltx}{\from{latex-lab-unicode-math.dtx}{kernel}}}
% kernel changes need by more than one module
\generate{\file{latex-lab-kernel-changes.sty}
diff --git a/Master/texmf-dist/source/latex-dev/tools/afterpage.dtx b/Master/texmf-dist/source/latex-dev/tools/afterpage.dtx
index 72df39402c9..ca5de5a4ad9 100644
--- a/Master/texmf-dist/source/latex-dev/tools/afterpage.dtx
+++ b/Master/texmf-dist/source/latex-dev/tools/afterpage.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
diff --git a/Master/texmf-dist/source/latex-dev/tools/afterpage.ins b/Master/texmf-dist/source/latex-dev/tools/afterpage.ins
index 17792ddfa13..a0d5c3f0b12 100644
--- a/Master/texmf-dist/source/latex-dev/tools/afterpage.ins
+++ b/Master/texmf-dist/source/latex-dev/tools/afterpage.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright (C) 1993-2024
+%% Copyright (C) 1993-2025
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -45,7 +45,7 @@ The source is maintained by the LaTeX Project team and bug
reports for it can be opened at https://latex-project.org/bugs/
(but please observe conditions on bug reports sent to that address!)
-Copyright (C) 1993-2024
+Copyright (C) 1993-2025
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/Master/texmf-dist/source/latex-dev/tools/array.dtx b/Master/texmf-dist/source/latex-dev/tools/array.dtx
index f4c8ab28d8d..74c78d02736 100644
--- a/Master/texmf-dist/source/latex-dev/tools/array.dtx
+++ b/Master/texmf-dist/source/latex-dev/tools/array.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
@@ -39,7 +39,7 @@
% \begin{macrocode}
%<+package>\NeedsTeXFormat{LaTeX2e}[2024/06/01]
%<+package>\ProvidesPackage{array}
-%<+package> [2024/10/17 v2.6g Tabular extension package (FMi)]
+%<+package> [2025/02/18 v2.6h Tabular extension package (FMi)]
%
% \fi
%
@@ -1862,7 +1862,19 @@ Bug reports can be opened (category \texttt{#1}) at\\%
% \end{macrocode}
% \end{macro}
%
-%
+% \changes{v2.6h}{2024/12/02}{Add tagging sockets for luamml support}
+% Until the sockets are in the release we test for existence
+% and declare them
+% \begin{macrocode}
+\str_if_exist:cF { l__socket_tagsupport/math/luamml/array/save_plug_str }
+ {
+ \NewSocket{tagsupport/math/luamml/array/save}{0}
+ \NewSocket{tagsupport/math/luamml/array/finalize}{0}
+ \NewSocket{tagsupport/math/luamml/array/initcol}{0}
+ \NewSocket{tagsupport/math/luamml/array/finalizecol}{1}
+ \AssignSocketPlug{tagsupport/math/luamml/array/finalizecol}{noop}
+ }
+% \end{macrocode}
% \begin{macro}{\@classz}
% If the character class of the last \textsf{token} is $0$ we have
% \texttt{c}, \texttt{l}, \texttt{r} or an argument of \texttt{m},
@@ -1918,7 +1930,7 @@ Bug reports can be opened (category \texttt{#1}) at\\%
% Now we insert the contents of the two \textsf{token} registers
% and the symbol
% for the column entry (i.e.\ =#= or
-% more precise =\@sharp=) using =\insert@column=.
+% more precise =\@sharp=) using =\insert@column=.
% \begin{macrocode}
\insert@column
% \end{macrocode}
@@ -1927,7 +1939,8 @@ Bug reports can be opened (category \texttt{#1}) at\\%
% The strut to enforce a regular row height is placed between the two.
% \changes{v2.4e}{2016/10/07}{Fixing SX68732}
% \begin{macrocode}
- \d@llarend \do@row@strut \hfil \or
+ \d@llarend
+ \do@row@strut \hfil \or
% \end{macrocode}
% The templates for \texttt{l} and \texttt{r} (i.e.\ =\@chnum= $1$
% or $2$) are generated the same way. Since one =\hfil= is
@@ -1944,8 +1957,10 @@ Bug reports can be opened (category \texttt{#1}) at\\%
% {Change both \cs{kern}\cs{z@} to \cs{hskip}1sp for latex/2160}
% \changes{v2.4e}{2016/10/07}{Fixing SX68732}
% \begin{macrocode}
- \hskip1sp\d@llarbegin \insert@column \d@llarend \do@row@strut \hfil \or
- \hfil\hskip1sp\d@llarbegin \insert@column \d@llarend \do@row@strut \or
+ \hskip1sp\d@llarbegin\insert@column\d@llarend
+ \do@row@strut \hfil \or
+ \hfil\hskip1sp\d@llarbegin\insert@column\d@llarend
+ \do@row@strut \or
% \end{macrocode}
% The templates for \texttt{p}, \texttt{m} and \texttt{b} mainly
% consist of a \textsf{box}. In case of \texttt{m} it is generated
@@ -2242,7 +2257,7 @@ Bug reports can be opened (category \texttt{#1}) at\\%
%
%
%
-% \begin{macro}{\@startpbox}
+% \begin{macro}{\@startpbox,\@startpbox@action}
% In =\@classz= the macro =\@startpbox= is used.
% The width of the \textsf{parbox} is passed as an argument.
% =\vcenter=, =\vtop= or =\vbox= are already in the
@@ -2286,6 +2301,19 @@ Bug reports can be opened (category \texttt{#1}) at\\%
\everypar{}}%
}
% \end{macrocode}
+%
+% \changes{v2.6h}{2024/12/17}{New \cs{@startpbox@action} to do the real work
+% after the preamble is built (gh/1585)}
+% Starting with 2.6h, \cs{@startpbox} is used only during the
+% built-up of the preamble and then changed to \cs{@startpbox@action}
+% which does the real work. For an explanation of this code see
+% the documentation in \cs{@mkpream}. We keep the \cs{@startpbox}
+% definition on top-level in case there are tabular packages that
+% built the preamble differently and expect that it contains
+% \cs{@startpbox} (\pkg{longtable} at the moment).
+% \begin{macrocode}
+\let\@startpbox@action\@startpbox
+% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@endpbox}
@@ -2817,9 +2845,23 @@ Bug reports can be opened (category \texttt{#1}) at\\%
% Our new definition of =\array= then reads:
% \changes{v2.0d}{1990/08/20}{`d@llar local to preamble.}
% \changes{v2.4d}{2016/10/06}{\cs{@halignto} set locally (pr/4488)}
+% In math mode we additionally add also the tagging sockets for luamml.
+% \changes{v2.6h}{2024/12/02}{Add tagging sockets for luamml support}.
+% The =math/luamml/array/finalizecol= takes as argument a number (0, 1, 2)
+% that should represent the alignment (c,l,r).
+% TODO: instead of =\the\@chnum= a proper tl should be used.
+% TODO: the w and W columntypes must be redefined - currently they
+% insert stray mtext columns.
% \begin{macrocode}
\def\array{\col@sep\arraycolsep
- \def\d@llarbegin{$}\let\d@llarend\d@llarbegin\def\@halignto{}%
+ \def\d@llarbegin{$\tag_socket_use:n { math/luamml/array/initcol }}
+ \def\d@llarend
+ {
+ \tag_socket_use:nn { math/luamml/save/nn }{{}{mtd}}
+ $
+ \tag_socket_use:nn { math/luamml/array/finalizecol}{\the\@chnum}
+ }
+ \def\@halignto{}%
% \end{macrocode}
% Since there might be an optional argument we call another
% macro which is also used by the other environments.
@@ -2868,6 +2910,9 @@ Bug reports can be opened (category \texttt{#1}) at\\%
% \begin{macro}{\@tabular}
% The rest of the job is carried out by the =\@tabular= macro:
% \begin{macrocode}
+\providecommand\MathCollectTrue{}
+\providecommand\MathCollectFalse{}
+\providecommand\@kernel@tabular@init{}
\def\@tabular{%
% \end{macrocode}
% First of all we have to make sure that we start out in
@@ -2887,10 +2932,17 @@ Bug reports can be opened (category \texttt{#1}) at\\%
% insert a =$= and then assign the correct values to =\col@sep= and
% =\d@llar...=.
% \changes{v2.0d}{1990/08/20}{`d@llar local to preamble.}
+% \changes{v2.6h}{2025/02/18}{Surround dollar with \cs{MathCollectTrue}/\cs{MathCollectFalse}}%
% \begin{macrocode}
- \hbox \bgroup $\col@sep\tabcolsep \let\d@llarbegin\begingroup
+ \hbox \bgroup
+ \MathCollectFalse$\MathCollectTrue
+ \col@sep\tabcolsep \let\d@llarbegin\begingroup
\let\d@llarend\endgroup
% \end{macrocode}
+% \changes{v2.6h}{2025/02/18}{Add internal kernel hook to switch math collection method}%
+% \begin{macrocode}
+ \@kernel@tabular@init
+% \end{macrocode}
% Now everything \textsf{tabular} specific is done and we are able to
% call the =\@tabarray= macro.
% \begin{macrocode}
@@ -2899,10 +2951,6 @@ Bug reports can be opened (category \texttt{#1}) at\\%
% \end{macro}
%
% \begin{macro}{\endarray}
-% \emph{The code below has been replaced long time ago by an
-% extended version further down but the code and its documentation
-% was left here for reference. It is now commented out to avoid
-% confusion.}
%
% When the processing of \textsf{array} is finished we have to
% close the =\halign=
@@ -2914,10 +2962,13 @@ Bug reports can be opened (category \texttt{#1}) at\\%
% To handle cell indexes, we do not use \cs{crcr} but a variant
% that also handles missing cells as necessary.
% \changes{v2.6a}{2023/12/11}{Support for tagged PDF}
+% \changes{v2.6h}{2024/12/02}{Add tagging sockets for luamml support}%
% \begin{macrocode}
\def\endarray {
- \tbl_crcr:n{endarray} \egroup
- \UseTaggingSocket{tbl/finalize}
+ \tbl_crcr:n{endarray}
+ \tag_socket_use_expandable:n { math/luamml/array/save }
+ \egroup
+ \tag_socket_use:n { tbl/finalize }
% \end{macrocode}
%
% If tables are nested into another then it is necessary to
@@ -2937,6 +2988,7 @@ Bug reports can be opened (category \texttt{#1}) at\\%
%
% \begin{macrocode}
\egroup
+ \tag_socket_use:n { math/luamml/array/finalize }
\@arrayright \gdef\@preamble{}%
}
% \end{macrocode}
@@ -3277,20 +3329,31 @@ Bug reports can be opened (category \texttt{#1}) at\\%
\let\@sharp\relax
% \end{macrocode}
%
-% \changes{v2.4j}{2018/11/13}{Do not expand argument of
-% \cs{@startpbox} while building the tabular preamble (sx/459285)}
% The "\@startpbox" (which is called for "p", "m" or "b" columns)
% receives a user supplied argument: the width of the
% paragraph-column. Normally that is something harmless like a length or a
% simple length expression, but with the calc package involved it
% could break under an "\edef" operation, which is how the preamble
% is constructed. We now make use of "\unexpanded" here to prevent that. The
-% "\expandafter" gymnastics is necessary to expand the "#1" at least
+% "\expandafter" gymnastics are necessary to expand the "#1" exactly
% once (since it will get "\@nextchar" as its value and need its
-% content!
+% content). However, once added to the preamble, no further
+% expansion should happen if the preamble is extended. Therefore we
+% change from \cs{@startpbox} to \cs{@startpbox@action}. The latter
+% then has a trivial definition and expands (including its
+% argument) to itself while the preamble is being built. Outside of this
+% preamble build up \cs{@startpbox@action} does the actual work.
+%
+% \changes{v2.4j}{2018/11/13}{Do not expand argument of
+% \cs{@startpbox} while building the tabular preamble (sx/459285)}
+% \changes{v2.6h}{2024/12/17}{Expand argument of \cs{@startpbox}
+% exactly once while the preamble is being built, and use
+% \cs{@startpbox@action} later to do the real work (gh/1585)}
% \begin{macrocode}
\def\@startpbox##1{\unexpanded\expandafter{\expandafter
- \@startpbox\expandafter{##1}}}\let\@endpbox\relax
+ \@startpbox@action\expandafter{##1}}}%
+ \def\@startpbox@action##1{\unexpanded{\@startpbox@action{##1}}}%
+ \let\@endpbox\relax
\let\do@row@strut\relax
\let\ar@align@mcell\relax
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex-dev/tools/bm.dtx b/Master/texmf-dist/source/latex-dev/tools/bm.dtx
index d7d6eb54ee2..cc4b16fdf9b 100644
--- a/Master/texmf-dist/source/latex-dev/tools/bm.dtx
+++ b/Master/texmf-dist/source/latex-dev/tools/bm.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
diff --git a/Master/texmf-dist/source/latex-dev/tools/bm.ins b/Master/texmf-dist/source/latex-dev/tools/bm.ins
index c0c8125d101..8b627e4e2a1 100644
--- a/Master/texmf-dist/source/latex-dev/tools/bm.ins
+++ b/Master/texmf-dist/source/latex-dev/tools/bm.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright (C) 1993-2024
+%% Copyright (C) 1993-2025
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -45,7 +45,7 @@ The source is maintained by the LaTeX Project team and bug
reports for it can be opened at https://latex-project.org/bugs/
(but please observe conditions on bug reports sent to that address!)
-Copyright (C) 1993-2024
+Copyright (C) 1993-2025
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/Master/texmf-dist/source/latex-dev/tools/calc.dtx b/Master/texmf-dist/source/latex-dev/tools/calc.dtx
index 414d04df8c3..5e194256d71 100644
--- a/Master/texmf-dist/source/latex-dev/tools/calc.dtx
+++ b/Master/texmf-dist/source/latex-dev/tools/calc.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
diff --git a/Master/texmf-dist/source/latex-dev/tools/dcolumn.dtx b/Master/texmf-dist/source/latex-dev/tools/dcolumn.dtx
index feb3096ccec..c9ccf1ec39d 100644
--- a/Master/texmf-dist/source/latex-dev/tools/dcolumn.dtx
+++ b/Master/texmf-dist/source/latex-dev/tools/dcolumn.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
diff --git a/Master/texmf-dist/source/latex-dev/tools/delarray.dtx b/Master/texmf-dist/source/latex-dev/tools/delarray.dtx
index 61d40b5c744..6647089acb2 100644
--- a/Master/texmf-dist/source/latex-dev/tools/delarray.dtx
+++ b/Master/texmf-dist/source/latex-dev/tools/delarray.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
diff --git a/Master/texmf-dist/source/latex-dev/tools/enumerate.dtx b/Master/texmf-dist/source/latex-dev/tools/enumerate.dtx
index c3889a9157a..07384d8dff6 100644
--- a/Master/texmf-dist/source/latex-dev/tools/enumerate.dtx
+++ b/Master/texmf-dist/source/latex-dev/tools/enumerate.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
diff --git a/Master/texmf-dist/source/latex-dev/tools/fileerr.dtx b/Master/texmf-dist/source/latex-dev/tools/fileerr.dtx
index 0e8eeb1ffb1..44994957d66 100644
--- a/Master/texmf-dist/source/latex-dev/tools/fileerr.dtx
+++ b/Master/texmf-dist/source/latex-dev/tools/fileerr.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
diff --git a/Master/texmf-dist/source/latex-dev/tools/fontsmpl.dtx b/Master/texmf-dist/source/latex-dev/tools/fontsmpl.dtx
index 6e9835e20eb..5b2c1967530 100644
--- a/Master/texmf-dist/source/latex-dev/tools/fontsmpl.dtx
+++ b/Master/texmf-dist/source/latex-dev/tools/fontsmpl.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
diff --git a/Master/texmf-dist/source/latex-dev/tools/ftnright.dtx b/Master/texmf-dist/source/latex-dev/tools/ftnright.dtx
index a3826376dbb..87dc5478a48 100644
--- a/Master/texmf-dist/source/latex-dev/tools/ftnright.dtx
+++ b/Master/texmf-dist/source/latex-dev/tools/ftnright.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
diff --git a/Master/texmf-dist/source/latex-dev/tools/hhline.dtx b/Master/texmf-dist/source/latex-dev/tools/hhline.dtx
index b2d833d965d..cb4d5a40b9c 100644
--- a/Master/texmf-dist/source/latex-dev/tools/hhline.dtx
+++ b/Master/texmf-dist/source/latex-dev/tools/hhline.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
diff --git a/Master/texmf-dist/source/latex-dev/tools/indentfirst.dtx b/Master/texmf-dist/source/latex-dev/tools/indentfirst.dtx
index 9bbe1871e15..394c9bb7924 100644
--- a/Master/texmf-dist/source/latex-dev/tools/indentfirst.dtx
+++ b/Master/texmf-dist/source/latex-dev/tools/indentfirst.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
diff --git a/Master/texmf-dist/source/latex-dev/tools/l3sys-query.dtx b/Master/texmf-dist/source/latex-dev/tools/l3sys-query.dtx
index 3cba5da4a62..cfec0da5f9e 100644
--- a/Master/texmf-dist/source/latex-dev/tools/l3sys-query.dtx
+++ b/Master/texmf-dist/source/latex-dev/tools/l3sys-query.dtx
@@ -1,6 +1,6 @@
% \iffalse
%% Source File: l3sys-query.dtx
-%% Copyright (C) 2024
+%% Copyright (C) 2024-2025
%%
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
diff --git a/Master/texmf-dist/source/latex-dev/tools/l3sys-query.ins b/Master/texmf-dist/source/latex-dev/tools/l3sys-query.ins
index 163eec0058c..7ae54c8b89a 100644
--- a/Master/texmf-dist/source/latex-dev/tools/l3sys-query.ins
+++ b/Master/texmf-dist/source/latex-dev/tools/l3sys-query.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright (C) 1993-2024
+%% Copyright (C) 1993-2025
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -45,7 +45,7 @@ The source is maintained by the LaTeX Project team and bug
reports for it can be opened at https://latex-project.org/bugs/
(but please observe conditions on bug reports sent to that address!)
-Copyright (C) 1993-2024
+Copyright (C) 1993-2025
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/Master/texmf-dist/source/latex-dev/tools/layout.dtx b/Master/texmf-dist/source/latex-dev/tools/layout.dtx
index a2fc87a6a51..a35009319bc 100644
--- a/Master/texmf-dist/source/latex-dev/tools/layout.dtx
+++ b/Master/texmf-dist/source/latex-dev/tools/layout.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
diff --git a/Master/texmf-dist/source/latex-dev/tools/longtable.dtx b/Master/texmf-dist/source/latex-dev/tools/longtable.dtx
index 061d7b56102..c104f41cb87 100644
--- a/Master/texmf-dist/source/latex-dev/tools/longtable.dtx
+++ b/Master/texmf-dist/source/latex-dev/tools/longtable.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
@@ -38,7 +38,7 @@
%<driver> \ProvidesFile{longtable.drv}
% \fi
% \ProvidesFile{longtable.dtx}
- [2024-10-27 v4.22 Multi-page Table package (DPC)]
+ [2024-12-18 v4.23 Multi-page Table package (DPC)]
%
% \iffalse
%<*driver>
@@ -1249,10 +1249,13 @@
% \package{array} V2.0h. We do not need to set "\d@llarbegin" and
% "\d@llarend" as the \package{array} package gives them the correct
% values at the top level.
+% \changes{v4.23}{2024/12/17}{Initialize \cs{@startpbox@action} instead
+% of \cs{@startpbox} to match array change (gh/1585)}
% \begin{macrocode}
\advance\@tempdima\extrarowheight
\col@sep\tabcolsep
- \let\@startpbox\LT@startpbox\let\LT@LL@FM@cr\@arraycr
+ \let\@startpbox@action\LT@startpbox
+ \let\LT@LL@FM@cr\@arraycr
\fi
% \end{macrocode}
% The rest of this macro is mainly based on \package{array} package, but
diff --git a/Master/texmf-dist/source/latex-dev/tools/longtable.ins b/Master/texmf-dist/source/latex-dev/tools/longtable.ins
index 60b74615718..12d2d8aca83 100644
--- a/Master/texmf-dist/source/latex-dev/tools/longtable.ins
+++ b/Master/texmf-dist/source/latex-dev/tools/longtable.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright (C) 1993-2024
+%% Copyright (C) 1993-2025
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -45,7 +45,7 @@ The source is maintained by the LaTeX Project team and bug
reports for it can be opened at https://latex-project.org/bugs/
(but please observe conditions on bug reports sent to that address!)
-Copyright (C) 1993-2024
+Copyright (C) 1993-2025
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/Master/texmf-dist/source/latex-dev/tools/multicol.dtx b/Master/texmf-dist/source/latex-dev/tools/multicol.dtx
index 1cb322ea6d6..7325b734a21 100644
--- a/Master/texmf-dist/source/latex-dev/tools/multicol.dtx
+++ b/Master/texmf-dist/source/latex-dev/tools/multicol.dtx
@@ -20,7 +20,7 @@
% \iffalse This is a METACOMMENT
%
%% Package `multicol' to use with LaTeX2e
-%% Copyright 1989-2024 Frank Mittelbach
+%% Copyright 1989-2025 Frank Mittelbach
%%
%% In addition to the terms of LPPL any distributed version
%% (unchanged or modified) of multicol has to keep the statement
@@ -99,7 +99,7 @@
%<driver> \ProvidesFile{multicol.drv}
% \fi
% \ProvidesFile{multicol.dtx}
- [2024/11/21 v2.0a multicolumn formatting (FMi)]
+ [2024/11/27 v2.0a multicolumn formatting (FMi)]
%
%
%
@@ -4628,7 +4628,7 @@
% float sockets. By now they are part of the kernel and their plugs
% are currently defined by \pkg{tagpdf}.
% \begin{macrocode}
-%\str_if_exist:cF { l__socket_tagsupport/float/end_plug_str }
+%\IfSocketExistsF {tagsupport/float/end}
% {
% \NewSocket{tagsupport/float/end}{0}
% \NewSocket{tagsupport/float/hmode/end}{0}
diff --git a/Master/texmf-dist/source/latex-dev/tools/multicol.ins b/Master/texmf-dist/source/latex-dev/tools/multicol.ins
index 7a7ef27d248..f88f2fb89ea 100644
--- a/Master/texmf-dist/source/latex-dev/tools/multicol.ins
+++ b/Master/texmf-dist/source/latex-dev/tools/multicol.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright (C) 1993-2024
+%% Copyright (C) 1993-2025
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -45,7 +45,7 @@ The source is maintained by the LaTeX Project team and bug
reports for it can be opened at https://latex-project.org/bugs/
(but please observe conditions on bug reports sent to that address!)
-Copyright (C) 1993-2024
+Copyright (C) 1993-2025
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/Master/texmf-dist/source/latex-dev/tools/rawfonts.dtx b/Master/texmf-dist/source/latex-dev/tools/rawfonts.dtx
index 3ffa2032c38..1d259cc1a67 100644
--- a/Master/texmf-dist/source/latex-dev/tools/rawfonts.dtx
+++ b/Master/texmf-dist/source/latex-dev/tools/rawfonts.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
diff --git a/Master/texmf-dist/source/latex-dev/tools/shellesc.dtx b/Master/texmf-dist/source/latex-dev/tools/shellesc.dtx
index 8a556de9229..61047e2dfbe 100644
--- a/Master/texmf-dist/source/latex-dev/tools/shellesc.dtx
+++ b/Master/texmf-dist/source/latex-dev/tools/shellesc.dtx
@@ -1,6 +1,6 @@
% \iffalse
%% Source File: shellesc.dtx
-%% Copyright (C) 2015-2024
+%% Copyright (C) 2015-2025
%%
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
diff --git a/Master/texmf-dist/source/latex-dev/tools/showkeys.dtx b/Master/texmf-dist/source/latex-dev/tools/showkeys.dtx
index b6717950a77..5e1ab87fb4a 100644
--- a/Master/texmf-dist/source/latex-dev/tools/showkeys.dtx
+++ b/Master/texmf-dist/source/latex-dev/tools/showkeys.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
@@ -22,7 +22,7 @@
% \fi
% \iffalse
%% File: showkeys.dtx Copyright (C) 1992-1997 David Carlisle
-%% File: showkeys.dtx Copyright (C) 2006-2024 David Carlisle, LaTeX Project
+%% File: showkeys.dtx Copyright (C) 2006-2025 David Carlisle, LaTeX Project
%
%<*dtx>
\ProvidesFile{showkeys.dtx}
diff --git a/Master/texmf-dist/source/latex-dev/tools/somedefs.dtx b/Master/texmf-dist/source/latex-dev/tools/somedefs.dtx
index 156621d70e2..483897ec66b 100644
--- a/Master/texmf-dist/source/latex-dev/tools/somedefs.dtx
+++ b/Master/texmf-dist/source/latex-dev/tools/somedefs.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
diff --git a/Master/texmf-dist/source/latex-dev/tools/tabularx.dtx b/Master/texmf-dist/source/latex-dev/tools/tabularx.dtx
index 52ee62cad90..b0d9859343a 100644
--- a/Master/texmf-dist/source/latex-dev/tools/tabularx.dtx
+++ b/Master/texmf-dist/source/latex-dev/tools/tabularx.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
diff --git a/Master/texmf-dist/source/latex-dev/tools/tabularx.ins b/Master/texmf-dist/source/latex-dev/tools/tabularx.ins
index fdce598d379..954c6139558 100644
--- a/Master/texmf-dist/source/latex-dev/tools/tabularx.ins
+++ b/Master/texmf-dist/source/latex-dev/tools/tabularx.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright (C) 1993-2024
+%% Copyright (C) 1993-2025
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -45,7 +45,7 @@ The source is maintained by the LaTeX Project team and bug
reports for it can be opened at https://latex-project.org/bugs/
(but please observe conditions on bug reports sent to that address!)
-Copyright (C) 1993-2024
+Copyright (C) 1993-2025
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/Master/texmf-dist/source/latex-dev/tools/theorem.dtx b/Master/texmf-dist/source/latex-dev/tools/theorem.dtx
index 3fbba473ba2..1dc5065d804 100644
--- a/Master/texmf-dist/source/latex-dev/tools/theorem.dtx
+++ b/Master/texmf-dist/source/latex-dev/tools/theorem.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
diff --git a/Master/texmf-dist/source/latex-dev/tools/tools.ins b/Master/texmf-dist/source/latex-dev/tools/tools.ins
index 776215ff2e6..01f369e99fb 100644
--- a/Master/texmf-dist/source/latex-dev/tools/tools.ins
+++ b/Master/texmf-dist/source/latex-dev/tools/tools.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright (C) 1993-2024
+%% Copyright (C) 1993-2025
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -49,7 +49,7 @@ reports for it can be opened at https://latex-project.org/bugs/
(but please observe conditions on bug reports sent to that address!)
-Copyright (C) 1993-2024
+Copyright (C) 1993-2025
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/Master/texmf-dist/source/latex-dev/tools/trace.dtx b/Master/texmf-dist/source/latex-dev/tools/trace.dtx
index 27a39c776b4..390c8fea9dd 100644
--- a/Master/texmf-dist/source/latex-dev/tools/trace.dtx
+++ b/Master/texmf-dist/source/latex-dev/tools/trace.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
diff --git a/Master/texmf-dist/source/latex-dev/tools/varioref.dtx b/Master/texmf-dist/source/latex-dev/tools/varioref.dtx
index 40b3038074f..8b96d9f056a 100644
--- a/Master/texmf-dist/source/latex-dev/tools/varioref.dtx
+++ b/Master/texmf-dist/source/latex-dev/tools/varioref.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
@@ -41,7 +41,7 @@
%<package>\DeclareCurrentRelease{}{2019-10-01}
%<package>
%<package>\ProvidesPackage{varioref}
-%<package> [2024/05/23 v1.6g package for extended references (FMi)]
+%<package> [2025/01/14 v1.6g package for extended references (FMi)]
% \fi
%
%%
@@ -452,6 +452,11 @@
% one argument, the symbolic reference string, so that one can make
% use of |\pageref| in its replacement text.
%
+% In the somewhat unusual case that you want to make some or all of
+% the |\reftext...| texts empty, it is necessary to get rid of the
+% space that is automatically put in front of them. You can do this by
+% defining them to expand to |\unskip|.
+%
%
%\DescribeMacro\reftextvario To allow a bit random variation in the
% generated strings one can use the command |\reftextvario| inside the
diff --git a/Master/texmf-dist/source/latex-dev/tools/varioref.ins b/Master/texmf-dist/source/latex-dev/tools/varioref.ins
index 88527a20ba1..9cf89a76fff 100644
--- a/Master/texmf-dist/source/latex-dev/tools/varioref.ins
+++ b/Master/texmf-dist/source/latex-dev/tools/varioref.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright (C) 1993-2024
+%% Copyright (C) 1993-2025
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -45,7 +45,7 @@ The source is maintained by the LaTeX Project team and bug
reports for it can be opened at https://latex-project.org/bugs/
(but please observe conditions on bug reports sent to that address!)
-Copyright (C) 1993-2024
+Copyright (C) 1993-2025
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/Master/texmf-dist/source/latex-dev/tools/verbatim.dtx b/Master/texmf-dist/source/latex-dev/tools/verbatim.dtx
index 468dead3e83..1d0a245d6c2 100644
--- a/Master/texmf-dist/source/latex-dev/tools/verbatim.dtx
+++ b/Master/texmf-dist/source/latex-dev/tools/verbatim.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
diff --git a/Master/texmf-dist/source/latex-dev/tools/xr.dtx b/Master/texmf-dist/source/latex-dev/tools/xr.dtx
index daa0778b363..eaae768bad6 100644
--- a/Master/texmf-dist/source/latex-dev/tools/xr.dtx
+++ b/Master/texmf-dist/source/latex-dev/tools/xr.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
@@ -21,13 +21,13 @@
%
% \fi
% \iffalse
-%% File: xr.dtx Copyright (C) 1993-2024 David Carlisle
+%% File: xr.dtx Copyright (C) 1993-2025 David Carlisle
%
%<package>\NeedsTeXFormat{LaTeX2e}
%<package>\DeclareRelease{v5}{2023-07-04}{xr-2023-07-04.sty}
-%<package>\DeclareCurrentRelease{}{2024-04-10}
+%<package>\DeclareCurrentRelease{}{2024-12-22}
%<package>\ProvidesPackage{xr}
-%<package> [2024-04-10 v6.00 eXternal References (DPC)]
+%<package> [2024-12-22 v6.00 eXternal References (DPC)]
%
%<*driver>
\documentclass{l3doc}
@@ -156,7 +156,13 @@ Bug reports can be opened (category \texttt{#1}) at\\%
% \meta{prefix}:
% \begin{verbatim}
% \externaldocument[][nocite]{aaa}
-% \end{verbatim}
+% \end{verbatim}
+%
+% Problems with citing references from an external document
+% are more likely if the documents are using different citation packages.
+% So if possible, it is best to ensure that the documents use compatible
+% packages so that the citation data works without error when imported from
+% the external document.
%
% The `document' referred to by the main argument \meta{document} is the file
% \file{document.aux} which must be somewhere on TeX's input path.
diff --git a/Master/texmf-dist/source/latex-dev/tools/xspace.dtx b/Master/texmf-dist/source/latex-dev/tools/xspace.dtx
index be20fc9e522..ab9921a0344 100644
--- a/Master/texmf-dist/source/latex-dev/tools/xspace.dtx
+++ b/Master/texmf-dist/source/latex-dev/tools/xspace.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2024
+% Copyright (C) 1993-2025
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.