diff options
Diffstat (limited to 'Master/texmf-dist/source')
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. |