summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex-dev
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2022-03-15 20:08:23 +0000
committerKarl Berry <karl@freefriends.org>2022-03-15 20:08:23 +0000
commit269db182a3b5d6df307e49e15092cbd1dd26d898 (patch)
tree3291c66dc473e571ccd897b781c5c39f776ba720 /Master/texmf-dist/source/latex-dev
parent664dc1f78cafa6dae96ff3bad0b0c4a5906dc9c2 (diff)
latex-dev (15mar22)
git-svn-id: svn://tug.org/texlive/trunk@62725 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/latex-dev')
-rw-r--r--Master/texmf-dist/source/latex-dev/amsmath/amsmath.dtx25
-rw-r--r--Master/texmf-dist/source/latex-dev/amsmath/amsopn.dtx12
-rw-r--r--Master/texmf-dist/source/latex-dev/base/latexrelease.dtx38
-rw-r--r--Master/texmf-dist/source/latex-dev/base/latexrelease.ins2
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltbibl.dtx37
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltcmd.dtx34
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltexpl.dtx20
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltfilehook.dtx51
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltfinal.dtx34
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltkeys.dtx119
-rw-r--r--Master/texmf-dist/source/latex-dev/base/ltvers.dtx22
-rw-r--r--Master/texmf-dist/source/latex-dev/base/utf8ienc.dtx46
-rw-r--r--Master/texmf-dist/source/latex-dev/firstaid/latex2e-first-aid-for-external-files.dtx61
-rw-r--r--Master/texmf-dist/source/latex-dev/graphics/graphics.dtx53
-rw-r--r--Master/texmf-dist/source/latex-dev/graphics/mathcolor.dtx16
-rw-r--r--Master/texmf-dist/source/latex-dev/tools/array.dtx10
16 files changed, 426 insertions, 154 deletions
diff --git a/Master/texmf-dist/source/latex-dev/amsmath/amsmath.dtx b/Master/texmf-dist/source/latex-dev/amsmath/amsmath.dtx
index d810e921db4..52509f95449 100644
--- a/Master/texmf-dist/source/latex-dev/amsmath/amsmath.dtx
+++ b/Master/texmf-dist/source/latex-dev/amsmath/amsmath.dtx
@@ -86,7 +86,7 @@ Bug reports can be opened (category \texttt{#1}) at\\%
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesPackage{amsmath}[2021/10/15 v2.17l AMS math features]
+\ProvidesPackage{amsmath}[2022/02/03 v2.17m AMS math features]
% \end{macrocode}
%
% \section{Catcode defenses}
@@ -6130,15 +6130,16 @@ Cannot use `split' here;\MessageBreak trying to recover with `aligned'}%
% in his \fn{amstex.doc} Spivak indicates those commands should never
% be used on a first or last line. Perhaps better to leave the
% question open unless/until real-life examples turn up.
+% \changes{v2.17m}{2022/02/03}{Make \cs{shoveright} robust (if def is not trival)}
% \begin{macrocode}
\iftagsleft@
- \def\shoveright#1{%
+ \protected\def\shoveright#1{%
#1%
\hfilneg
\hskip\multlinegap
}
\else
- \def\shoveright#1{%
+ \protected\def\shoveright#1{%
#1%
\hfilneg
\iftag@
@@ -6153,12 +6154,14 @@ Cannot use `split' here;\MessageBreak trying to recover with `aligned'}%
\fi
}
\fi
-
+% \end{macrocode}
+% \changes{v2.17m}{2022/02/03}{Make \cs{shoveleft} robust (if def is not trival)}
+% \begin{macrocode}
\if@fleqn
\def\shoveleft#1{#1}%
\else
\iftagsleft@
- \def\shoveleft#1{%
+ \protected\def\shoveleft#1{%
\setboxz@h{$\m@th\displaystyle{}#1$}%
\setbox\@ne\hbox{$\m@th\displaystyle#1$}%
\hfilneg
@@ -6173,17 +6176,23 @@ Cannot use `split' here;\MessageBreak trying to recover with `aligned'}%
\hskip\multlinegap
\fi
\hskip.5\wd\@ne
- \hskip-.5\wdz@
+% \end{macrocode}
+% \changes{v2.17m}{2022/02/03}{Added missing \cs{relax} for (gh/716)}
+% \begin{macrocode}
+ \hskip-.5\wdz@ \relax
#1%
}
\else
- \def\shoveleft#1{%
+ \protected\def\shoveleft#1{%
\setboxz@h{$\m@th\displaystyle{}#1$}%
\setbox\@ne\hbox{$\m@th\displaystyle#1$}%
\hfilneg
\hskip\multlinegap
\hskip.5\wd\@ne
- \hskip-.5\wdz@
+% \end{macrocode}
+% \changes{v2.17m}{2022/02/03}{Added missing \cs{relax} for (gh/716)}
+% \begin{macrocode}
+ \hskip-.5\wdz@ \relax
#1%
}
\fi
diff --git a/Master/texmf-dist/source/latex-dev/amsmath/amsopn.dtx b/Master/texmf-dist/source/latex-dev/amsmath/amsopn.dtx
index 20e63b63d78..22801e8cf13 100644
--- a/Master/texmf-dist/source/latex-dev/amsmath/amsopn.dtx
+++ b/Master/texmf-dist/source/latex-dev/amsmath/amsopn.dtx
@@ -58,7 +58,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 December 1994 or later
-\ProvidesPackage{amsopn}[2021/08/26 v2.02 operator names]
+\ProvidesPackage{amsopn}[2022/01/20 v2.03 operator names]
% \end{macrocode}
%
% What \cs{nolimits@} does is keep a \cn{limits} typed by the user
@@ -198,8 +198,16 @@ Bug reports can be opened (category \texttt{#1}) at\\%
% more accessible so that users can call this font for use in special
% constructs that are not ordinary operator names but conceptually
% related.
+%
+% \cs{operator@font} is also declared by the \LaTeX{} kernel (for
+% at least 14 years), thus defining it here effectively means
+% ``resetting it'' to the kernel value, which is counterproductive
+% in situations where the user (or a class) has altered its
+% definition and at a later point \pkg{amsopn} got added.
+% \changes{v2.03}{2022/01/20}{Do not reset \cs{operator@font} it is
+% already defined in the LaTeX kernel (gh/734)}
% \begin{macrocode}
-\def\operator@font{\mathgroup\symoperators}
+%\def\operator@font{\mathgroup\symoperators} % commented out in 2.03
\def\operatorfont{\operator@font}
% \end{macrocode}
% \end{macro}
diff --git a/Master/texmf-dist/source/latex-dev/base/latexrelease.dtx b/Master/texmf-dist/source/latex-dev/base/latexrelease.dtx
index efdfa8c418f..294007553d3 100644
--- a/Master/texmf-dist/source/latex-dev/base/latexrelease.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/latexrelease.dtx
@@ -40,7 +40,7 @@
%<*latexrelease>
% \fi
% \ProvidesFile{latexrelease.dtx}
- [2021/04/29 v1.0n LaTeX release emulation and tests
+ [2022/02/28 v1.0o LaTeX release emulation and tests
(including releases up to \latexreleaseversion)]
% \iffalse
%</latexrelease>
@@ -487,10 +487,9 @@
% \begin{macro}{\sourceLaTeXdate}
% \changes{v1.0l}{2021/01/23}{\cs{sourceLaTeXdate} added}
% \changes{v1.0m}{2021/03/18}{Define \cs{sourceLaTeXdate} conditionally}
-% Store the original \LaTeX{} format version
-% as a number in the format |YYYYMMDD|. This macro has to
-% be defined conditionally, so that it isn't changed in case
-% \file{latexrelease.sty} is loaded twice (for tests), but it
+% Store the original \LaTeX{} format version as a number in the format
+% |YYYYMMDD |. This macro has to be defined conditionally, so that it
+% isn't changed in case \file{latexrelease.sty} is reloaded, but it
% can't be defined in the kernel only, otherwise
% \file{latexrelease.sty} wouldn't work in older \LaTeX{} due
% to the missing macro.
@@ -619,7 +618,7 @@ of this package available from CTAN}
\catcode58=11 % :
\catcode126=10 % ~
\catcode32=09 % <space>
- \xdef\latexrelease@postexpl{\unexpanded{%
+ \xdef\latexrelease@postltexpl{\unexpanded{%
%<@@=latexrelease>
% \end{macrocode}
%
@@ -691,14 +690,13 @@ of this package available from CTAN}
% store each in \cs{l_@@_restores_tl}, save a copy, and redefine each.
% \begin{macrocode}
\tl_clear_new:N \l_@@_restores_tl
-\cs_gset:Npn \@@_tmp:w #1 #2
+\cs_gset:Npn \@@_redefines:w #1 #2
{
- \quark_if_recursion_tail_stop_do:Nn #1
- { \cs_undefine:N \@@_tmp:w }
+ \quark_if_recursion_tail_stop:N #1
\tl_put_right:Nn \l_@@_restores_tl {#1}
\cs_set_eq:cN { @@_ \cs_to_str:N #1 } #1
\cs_set_eq:NN #1 #2
- \@@_tmp:w
+ \@@_redefines:w
}
% \end{macrocode}
%
@@ -731,12 +729,12 @@ of this package available from CTAN}
% \end{description}
% And here we go:
% \begin{macrocode}
-\@@_tmp:w
+\@@_redefines:w
\__kernel_chk_if_free_cs:N \use_none:n
\e@alloc \@@_e@alloc:NnnnnN
\__kernel_msg_error:nnx \use_none:nnn
\msg_new:nnnn \msg_gset:nnnn
- \NewDocumentCommand \DeclareDocumentCommand
+ % \NewDocumentCommand \DeclareDocumentCommand % after ltcmd.dtx
\newcommand \@@_declare_command:w
% \end{macrocode}
% Temp addition \ldots
@@ -752,6 +750,22 @@ of this package available from CTAN}
\msg_redirect_name:nnn { hooks } { exists } { 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
+% the \cs{latexrelease@postltexpl} actions above:
+% \changes{v1.0o}{2022/02/28}
+% {Move most redefinitions to right after ltexpl.dtx}
+% \begin{macrocode}
+\cs_gset_protected:Npn \latexrelease@postltcmd
+ {
+ \@@_redefines:w
+ \NewDocumentCommand \DeclareDocumentCommand
+ \q_recursion_tail \q_recursion_tail
+ \q_recursion_stop
+ }
+% \end{macrocode}
+%
% \begin{macrocode}
}}%
\endgroup
diff --git a/Master/texmf-dist/source/latex-dev/base/latexrelease.ins b/Master/texmf-dist/source/latex-dev/base/latexrelease.ins
index 42cb5885685..cfba0f5c6e0 100644
--- a/Master/texmf-dist/source/latex-dev/base/latexrelease.ins
+++ b/Master/texmf-dist/source/latex-dev/base/latexrelease.ins
@@ -93,7 +93,7 @@ extension .ins) which are part of the distribution.
\from{ltluatex.dtx} {latexrelease}% empty
\from{ltexpl.dtx} {latexrelease}% empty
\from{ltdefns.dtx} {latexrelease}%
- \from{ltcmd.dtx} {latexrelease}%
+ \from{ltcmd.dtx} {latexrelease}% L3 layer module
\from{lthooks.dtx} {latexrelease}% L3 layer module
\from{ltcmdhooks.dtx} {latexrelease}% L3 layer module
\from{ltalloc.dtx} {latexrelease}% empty
diff --git a/Master/texmf-dist/source/latex-dev/base/ltbibl.dtx b/Master/texmf-dist/source/latex-dev/base/ltbibl.dtx
index 9824ca539fd..4c219657b87 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltbibl.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltbibl.dtx
@@ -32,7 +32,7 @@
%<*driver>
% \fi
\ProvidesFile{ltbibl.dtx}
- [2020/12/10 v1.1s LaTeX Kernel (Bibliography)]
+ [2022/03/10 v1.1t LaTeX Kernel (Bibliography)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltbibl.dtx}
@@ -199,8 +199,41 @@
% \begin{macro}{\cite}
% \changes{v1.1j}{1995/10/16}{(DPC) Make robust}
% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2022/06/01}%
+%<latexrelease> {\cite}{check for blank}%
\DeclareRobustCommand\cite{%
- \@ifnextchar [{\@tempswatrue\@citex}{\@tempswafalse\@citex[]}}
+ \@ifnextchar [{\@tempswatrue\@citex@checkblank}{\@tempswafalse\@citex@checkblank[]}}
+% \end{macrocode}
+% Due to the way \cs{@for} as used in \cs{@citex} behaves an empty
+% argument to \cs{cite} did not produce any warning for a missing
+% citation. So we now inject a command before calling \cs{@citex} that
+% does the checking for us. It is not done in \cs{@citex} directly,
+% because that command is altered by a number of packages/classes
+% and this way it is more likely that the check survives.
+% \changes{v1.1t}{2022/03/10}{Ensure that an empty argument generates
+% a warning (gh/790)}
+% \begin{macrocode}
+\def\@citex@checkblank[#1]#2{%
+ \IfBlankTF {#2}%
+ {\@citex[#1]{\space}}%
+ {\@citex[#1]{#2}}%
+}
+%</2ekernel|latexrelease>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\cite}{check for blank}%
+%<latexrelease>
+%<latexrelease>\DeclareRobustCommand\cite{%
+%<latexrelease> \@ifnextchar [{\@tempswatrue\@citex}{\@tempswafalse\@citex[]}}
+%<latexrelease>\let\@citex@checkblank\@undefined
+%<latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
% \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 bf7ae4ea246..f52b32479ed 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltcmd.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltcmd.dtx
@@ -34,8 +34,8 @@
%%% From File: ltcmd.dtx
%
% \begin{macrocode}
-\def\ltcmdversion{v1.0j}
-\def\ltcmddate{2021-12-31}
+\def\ltcmdversion{v1.0k}
+\def\ltcmddate{2022-02-28}
% \end{macrocode}
%
%<*driver>
@@ -4716,6 +4716,27 @@
% \end{macrocode}
% \end{macro}
%
+%
+% \begin{macro}{\IfBlankT, \IfBlankF, \IfBlankTF}
+% Another simple re-naming.
+% \changes{v1.0k}{2022/02/19}{Added \cs{IfBlankTF} and friends}
+% \begin{macrocode}
+%<latexrelease>\IncludeInRelease{2022/06/01}%
+%<latexrelease> {\IfBlankTF}{Testing~for~empty~or~blank}%
+\cs_new_eq:NN \IfBlankF \tl_if_blank:nF
+\cs_new_eq:NN \IfBlankT \tl_if_blank:nT
+\cs_new_eq:NN \IfBlankTF \tl_if_blank:nTF
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{2021/11/15}%
+%<latexrelease> {\IfBlankTF}{Testing~for~empty~or~blank}%
+%<latexrelease>\cs_undefine:N \IfBlankF
+%<latexrelease>\cs_undefine:N \IfBlankT
+%<latexrelease>\cs_undefine:N \IfBlankTF
+%<latexrelease>
+%<latexrelease>\EndIncludeInRelease
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\ProcessedArgument}
% Processed arguments are returned using this name, which is reserved
% here although the definition will change.
@@ -4779,7 +4800,14 @@
%<latexrelease>
%<latexrelease>\EndModuleRelease
\ExplSyntaxOff
-%<latexrelease>\@ifundefined{ExplSyntaxOff}{}{\latexrelease@postexpl}
+% \end{macrocode}
+%
+% Now in |latexrelease| mode, redefine \cs{NewDocumentCommand} to not
+% complain on commands already defined.
+% \changes{v1.0k}{2022-02-28}
+% {Move latexrelease redefinitions from ltcmd.dtx}
+% \begin{macrocode}
+%<latexrelease>\@ifundefined{ExplSyntaxOff}{}{\latexrelease@postltcmd}
%<latexrelease>\catcode`\^^@=\@latexrelease@catcode@null\relax
%</2ekernel|latexrelease>
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex-dev/base/ltexpl.dtx b/Master/texmf-dist/source/latex-dev/base/ltexpl.dtx
index e6a83d57250..aab189bec28 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltexpl.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltexpl.dtx
@@ -33,7 +33,7 @@
%<*driver>
% \fi
\ProvidesFile{ltexpl.dtx}
- [2022/01/06 v1.3e LaTeX Kernel (expl3-dependent code)]
+ [2022/02/28 v1.3f LaTeX Kernel (expl3-dependent code)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltexpl.dtx}
@@ -288,6 +288,14 @@
%<latexrelease>\EndIncludeInRelease
% \end{macrocode}
%
+% Now in |latexrelease| mode, redefine a few commands to avoid ``already
+% defined'' errors.
+% \changes{v1.3f}{2022/02/28}
+% {Move latexrelease redefinitions from ltcmd.dtx}
+% \begin{macrocode}
+%<latexrelease>\@ifundefined{ExplSyntaxOff}{}{\latexrelease@postltexpl}
+% \end{macrocode}
+%
% \changes{v1.3a}{2021/01/21}
% {Move \pkg{xparse} rollback code to \texttt{ltcmd.dtx}}
%
@@ -432,17 +440,17 @@
%<latexrelease>\IncludeInRelease{2022/06/01}%
%<latexrelease> {\fpeval}{fp and int calculations}%
\ExplSyntaxOn
-\cs_new_eq:NN \fpeval \fp_eval:n
+\cs_new_eq:NN \fpeval \fp_eval:n
% \end{macrocode}
% And a few more, this time wrappers around the e\TeX{} primitives.
% \begin{macrocode}
-\cs_new_eq:NN \inteval \int_eval:n
+\cs_new_eq:NN \inteval \int_eval:n
% \end{macrocode}
%
% \changes{v1.3d}{2021/12/07}{Added \cs{dimeval} and \cs{skipeval} (gh/711)}
% \begin{macrocode}
-\cs_new_eq:NN \dimeval \dim_eval:n
-\cs_new_eq:NN \skipeval \skip_eval:n
+\cs_new_eq:NN \dimeval \dim_eval:n
+\cs_new_eq:NN \skipeval \skip_eval:n
\ExplSyntaxOff
% \end{macrocode}
% \end{macro}
@@ -452,7 +460,6 @@
%<latexrelease>\EndIncludeInRelease
%<latexrelease>\IncludeInRelease{0000/00/00}%
%<latexrelease> {\fpeval}{fp and int calculations}%
-
%<latexrelease>
%<latexrelease>\let\fpeval\@undefined
%<latexrelease>\let\inteval\@undefined
@@ -503,7 +510,6 @@
%<latexrelease>\EndIncludeInRelease
%<latexrelease>\IncludeInRelease{0000/00/00}%
%<latexrelease> {\ExpandArgs}{Some pre-expansion commands}%
-
%<latexrelease>
%<latexrelease>\let\UseName\@undefined
%<latexrelease>\let\ExpandArgs\@undefined
diff --git a/Master/texmf-dist/source/latex-dev/base/ltfilehook.dtx b/Master/texmf-dist/source/latex-dev/base/ltfilehook.dtx
index 533aacbf2ba..af503b262f5 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltfilehook.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltfilehook.dtx
@@ -31,8 +31,8 @@
%%% From File: ltfilehook.dtx
%
% \begin{macrocode}
-\providecommand\ltfilehookversion{v1.0l}
-\providecommand\ltfilehookdate{2021/08/27}
+\providecommand\ltfilehookversion{v1.0m}
+\providecommand\ltfilehookdate{2022/03/10}
% \end{macrocode}
%
%<*driver>
@@ -1046,7 +1046,8 @@
%
% \subsection{Selecting a file (\cs{set@curr@file})}
%
-% \begin{macro}{\set@curr@file,\@curr@file,\@curr@file@reqd}
+% \begin{macro}{\set@curr@file,\set@curr@file@nosearch}
+% \begin{macro}{\@curr@file,\@curr@file@reqd}
% \changes{v1.0f}{2021/01/31}{set \cs{protect} to \cs{string} gh/481}
% Now we hook into \cs{set@curr@file} to resolve a possible file
% substitution, and add \cs{@expl@@@filehook@set@curr@file@@nNN}
@@ -1070,13 +1071,23 @@
% control sequence.
% \changes{v1.0i}{2021/04/20}
% {Make \string~ expand to a string (tracks change in l3kernel)}
+% \changes{v1.0m}{2022/03/10}
+% {Add \cs{set@curr@file@nosearch} for \pkg{graphicx}}
% \begin{macrocode}
%</2ekernel>
%<*2ekernel|latexrelease>
-%<latexrelease>\IncludeInRelease{2021/06/01}%
+%<latexrelease>\IncludeInRelease{2022/06/01}%
%<latexrelease> {\set@curr@file}{Setting current file name}%
-\def\set@curr@file#1{%
+\def\set@curr@file{%
+ \begingroup
+ \set@curr@file@aux}
+\edef\set@curr@file@nosearch{%
\begingroup
+ \let\noexpand\input@path\noexpand\@empty
+ \csname seq_clear:N\endcsname
+ \expandafter\noexpand\csname l_file_search_path_seq\endcsname
+ \noexpand\set@curr@file@aux}
+\def\set@curr@file@aux#1{%
\escapechar\m@ne
\let\protect\string
\edef~{\string~}%
@@ -1117,6 +1128,32 @@
% \end{macrocode}
%
% \begin{macrocode}
+%<latexrelease>\IncludeInRelease{2021/06/01}%
+%<latexrelease> {\set@curr@file}{Setting current file name}%
+%<latexrelease>\def\set@curr@file#1{%
+%<latexrelease> \begingroup
+%<latexrelease> \escapechar\m@ne
+%<latexrelease> \let\protect\string
+%<latexrelease> \edef~{\string~}%
+%<latexrelease> \expandafter\def\csname\expandafter\endcsname
+%<latexrelease> \expandafter{\csname\endcsname}%
+%<latexrelease> \@expl@@@filehook@if@no@extension@@nTF{#1}%
+%<latexrelease> {\@tempswatrue}{\@tempswafalse}%
+%<latexrelease> \@kernel@make@file@csname\@curr@file
+%<latexrelease> \@expl@@@filehook@resolve@file@subst@@w {#1}%
+%<latexrelease> \@expl@@@filehook@if@file@replaced@@TF
+%<latexrelease> {\@kernel@make@file@csname\@curr@file@reqd
+%<latexrelease> \@expl@@@filehook@normalize@file@name@@w{#1}%
+%<latexrelease> \if@tempswa \@expl@@@filehook@drop@extension@@N\@curr@file@reqd \fi}%
+%<latexrelease> {\if@tempswa \@expl@@@filehook@drop@extension@@N\@curr@file \fi
+%<latexrelease> \global\let\@curr@file@reqd\@curr@file}%
+%<latexrelease> \@expl@@@filehook@clear@replacement@flag@@
+%<latexrelease> \endgroup}
+%<latexrelease>\let\set@curr@file@nosearch\@undefined
+%<latexrelease>\EndIncludeInRelease
+% \end{macrocode}
+%
+% \begin{macrocode}
%<latexrelease>\IncludeInRelease{2020/10/01}%
%<latexrelease> {\set@curr@file}{Setting current file name}%
%<latexrelease>\def\set@curr@file#1{%
@@ -1136,6 +1173,7 @@
%<latexrelease> \global\let\@curr@file@reqd\@curr@file}%
%<latexrelease> \@expl@@@filehook@clear@replacement@flag@@
%<latexrelease> \endgroup}
+%<latexrelease>\let\set@curr@file@nosearch\@undefined
%<latexrelease>\EndIncludeInRelease
% \end{macrocode}
%
@@ -1152,6 +1190,7 @@
%<latexrelease> \csname\@firstofone#1\@empty\endcsname}}%
%<latexrelease> \endgroup
%<latexrelease>}
+%<latexrelease>\let\set@curr@file@nosearch\@undefined
%<latexrelease>\EndIncludeInRelease
% \end{macrocode}
%
@@ -1159,10 +1198,12 @@
%<latexrelease>\IncludeInRelease{0000/00/00}%
%<latexrelease> {\set@curr@file}{Setting current file name}%
%<latexrelease>\let\set@curr@file\@undefined
+%<latexrelease>\let\set@curr@file@nosearch\@undefined
%<latexrelease>\EndIncludeInRelease
%<*2ekernel>
% \end{macrocode}
% \end{macro}
+% \end{macro}
%
%
%
diff --git a/Master/texmf-dist/source/latex-dev/base/ltfinal.dtx b/Master/texmf-dist/source/latex-dev/base/ltfinal.dtx
index 46c7ded4aac..4f3b3f15a15 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltfinal.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltfinal.dtx
@@ -33,7 +33,7 @@
%<*driver>
% \fi
\ProvidesFile{ltfinal.dtx}
- [2021/12/07 v2.2q LaTeX Kernel (Final Settings)]
+ [2022/02/20 v2.2r LaTeX Kernel (Final Settings)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltfinal.dtx}
@@ -1037,10 +1037,14 @@
% \begin{macro}{\MakeUppercase}
% \begin{macro}{\MakeUppercase}
% \begin{macro}{\@uclclist}
+% \begin{macro}{\@expl@text@lowercase@@n}
+% \begin{macro}{\@expl@text@uppercase@@n}
+% \begin{macro}{\@uclclist}
+%
%
% \changes{v1.1a}{1997/10/20}{Removed \cs{aa} and \cs{AA} from
% \cs{@uclclist} as these are macros.}
-%
+% \changes{v2.2r}{2022/02/20}{use \cs{text_lowercase:n}}%
% And whilst we're doing things with uc/lc tables, here are two
% commands to upper- and lower-case a string.
%
@@ -1051,7 +1055,18 @@
% mathematics, environment names, labels, etc. A much better
% long-term solution is to use all-caps fonts, but these aren't
% generally available.
+%
+% Two wrappers around the L3 case changing functions.
+% |\protected| to make them mostly safe as replacements for |uppercase|
+% and |\lowercase|.
% \begin{macrocode}
+\ExplSyntaxOn
+\protected\def\@expl@text@lowercase@@n{\text_lowercase:n}
+\protected\def\@expl@text@uppercase@@n{\text_uppercase:n}
+\ExplSyntaxOff
+% \end{macrocode}
+
+%% \begin{macrocode}
\DeclareRobustCommand{\MakeUppercase}[1]{{%
\def\i{I}\def\j{J}%
\def\reserved@a##1##2{\let##1##2\reserved@a}%
@@ -1059,20 +1074,16 @@
% \end{macrocode}
% Tell UTF-8 processing to process chars even though we are in an \cs{protected@edef}.
% \changes{v2.1h}{2019/09/14}{Expand UTF8 chars when case changing (github/177)}
+% \changes{v2.2r}{2022/02/20}
+% {Use \cs{@expl@text@uppercase@@n}, removing local redefinition of \cs{UTF@two@octets@noexpand}}%
% \begin{macrocode}
- \let\UTF@two@octets@noexpand\@empty
- \let\UTF@three@octets@noexpand\@empty
- \let\UTF@four@octets@noexpand\@empty
- \protected@edef\reserved@a{\uppercase{#1}}%
+ \protected@edef\reserved@a{\@expl@text@uppercase@@n{#1}}%
\reserved@a
}}
\DeclareRobustCommand{\MakeLowercase}[1]{{%
\def\reserved@a##1##2{\let##2##1\reserved@a}%
\expandafter\reserved@a\@uclclist\reserved@b{\reserved@b\@gobble}%
- \let\UTF@two@octets@noexpand\@empty
- \let\UTF@three@octets@noexpand\@empty
- \let\UTF@four@octets@noexpand\@empty
- \protected@edef\reserved@a{\lowercase{#1}}%
+ \protected@edef\reserved@a{\@expl@text@lowercase@@n{#1}}%
\reserved@a
}}
% \end{macrocode}
@@ -1108,6 +1119,9 @@
% \end{macro}
% \end{macro}
% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
%
% \changes{v1.0h}{1994/05/13}{Added output enc stuff}
% \changes{v1.0i}{1994/05/16}{moved output enc stuff to lfonts}
diff --git a/Master/texmf-dist/source/latex-dev/base/ltkeys.dtx b/Master/texmf-dist/source/latex-dev/base/ltkeys.dtx
index 0ff3d9cfa38..c606d8284d2 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltkeys.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltkeys.dtx
@@ -33,7 +33,7 @@
%<*driver>
% \fi
\ProvidesFile{ltkeys.dtx}
- [2022/02/04 v1.0b LaTeX Kernel (Kevyal options)]
+ [2022/02/21 v1.0e LaTeX Kernel (Kevyal options)]
% \iffalse
\documentclass{l3doc}
\GetFileInfo{ltkeys.dtx}
@@ -103,6 +103,17 @@
% \cs{ProcessKeyOptions}/\cs{ProcessKeyPackageOptions} act as package options.
% \end{function}
%
+% \begin{function}{\DeclareUnknownKeyHandler}
+% \begin{syntax}
+% \cs{DeclareUnknownKeyHandler} \oarg{family} \marg{code}
+% \end{syntax}
+% The function \cs{DeclareUnknownKeyHandler} may be used to define
+% the behavior when an undefined key is encountered. The \meta{code}
+% will receive the unknown key name as |#1| and the value as |#2|.
+% These can then be processed as appropriate, e.g.~by forwarding
+% to another package.
+% \end{function}
+%
% \begin{function}{\ProcessKeyOptions}
% \begin{syntax}
% \cs{ProcessKeyOptions} \oarg{family}
@@ -153,6 +164,10 @@
% \subsection{Key properties}
%
% \begin{macro}{.code, .if, .store, .usage}
+% \changes{v1.0b}{2022/02/05}
+% {Create properties in \texttt{ltlkeys}}
+% \changes{v1.0c}{2022/02/07}
+% {Correct \texttt.{.code} property}
% \begin{macrocode}
\group_begin:
\cs_set_protected:Npn \@@_tmp:nn #1#2
@@ -164,7 +179,7 @@
\@@_tmp:nn
}
\@@_tmp:nn
- { code } { code }
+ { code:n } { code }
{ legacy_if_set:n } { if }
{ tl_set:N } { store }
{ usage:n } { usage }
@@ -196,7 +211,8 @@
% \end{macrocode}
% \end{variable}
%
-% \begin{macro}{\@@_options:Nn, \@@_options:NV}
+% \begin{macro}{\@@_options:Nn}
+% \begin{macro}{\@@_options:nN}
% \changes{v1.0b}{2022/01/15}
% {Clear option list in end-of-package hook}
% \begin{macro}{\@@_options_end:}
@@ -211,15 +227,17 @@
% in all cases.
% \begin{macrocode}
\cs_new_protected:Npn \@@_options:Nn #1#2
+ { \@@_options_expand_module:Nn \@@_options:nN {#2} #1 }
+\cs_new_protected:Npn \@@_options:nN #1#2
{
- \cs_gset_nopar:cpn { opt@fam@\@currname.\@currext } {#2}
+ \cs_gset_nopar:cpn { opt@fam@\@currname.\@currext } {#1}
\cs_set_protected:Npn \@@_option_end: { }
\clist_clear:N \l_@@_options_clist
- \@@_options_global:Nn #1 {#2}
+ \@@_options_global:Nn #2 {#1}
\@@_options_local:
- \keys_if_exist:nnF {#2} { unknown }
+ \keys_if_exist:nnF {#1} { unknown }
{
- \keys_define:nn {#2}
+ \keys_define:nn {#1}
{
unknown .code:n =
{
@@ -228,16 +246,15 @@
}
}
\cs_set_protected:Npn \@@_option_end:
- { \keys_define:nn {#2} { unknown .undefine: } }
+ { \keys_define:nn {#1} { unknown .undefine: } }
}
\bool_set_true:N \l_@@_options_loading_bool
- \keys_set:nV {#2} \l_@@_options_clist
+ \keys_set:nV {#1} \l_@@_options_clist
\bool_set_false:N \l_@@_options_loading_bool
\AtEndOfPackage { \cs_set_eq:NN \@unprocessedoptions \scan_stop: }
\@@_option_end:
- \@@_options_loaded:n {#2}
+ \@@_options_loaded:n {#1}
}
-\cs_generate_variant:Nn \@@_options:Nn { NV }
\msg_new:nnnn { keys } { option-unknown }
{ Unknown~option~'#1'~for~package~#2. }
{
@@ -247,6 +264,7 @@
% \end{macrocode}
% \end{macro}
% \end{macro}
+% \end{macro}
%
% \begin{macro}{\@@_options_global:Nn}
% Global (class) options are handled differently for \LaTeXe{} packages
@@ -355,38 +373,72 @@
%
% \subsection{The document interfaces}
%
+% \begin{macrocode}
+\cs_generate_variant:Nn \keys_define:nn { nx }
+% \end{macrocode}
+%
+% \begin{macro}{\@@_options_expand_module:Nn}
+% \changes{v1.0e}{2022/02/21}
+% {Faster approach to module expansion}
+% \begin{macro}{\@@_options_expand_module:nN}
+% To deal with active characters inside the module argument whilst also
+% expanding that argument, we use a combination of \texttt{c}- and
+% \texttt{f}-type expansion. This works as the definitions for active
+% UTF-8 bytes contain an \cs{ifincsname} test.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_options_expand_module:Nn #1#2
+ {
+ \cs:w @@_options_expand_module:nN \use:e { \cs_end: {#2} } #1
+ }
+\cs_new_protected:Npn \@@_options_expand_module:nN #1#2
+ { #2 {#1} }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
% \begin{macro}{\DeclareKeys}
+% \changes{v1.0c}{2022/02/15}{Expand module argument}
+% \changes{v1.0d}{2022/02/16}{Allow for active characters in module argument}
% Defining key options is quite straight-forward: we have an intermediate
% function to allow for potential set-up steps.
% \begin{macrocode}
-\NewDocumentCommand \DeclareKeys { o +m }
+\NewDocumentCommand \DeclareKeys { O { \@currname } +m }
+ { \@@_options_expand_module:Nn \keys_define:nn {#1} {#2} }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\DeclareUnknownKeyHandler}
+% \changes{v1.0c}{2022/02/15}{Added \cs{DeclareUnknownKeysHandler}}
+% \changes{v1.0d}{2022/02/16}{Allow for active characters in module argument}
+% \changes{v1.0d}{2022/02/16}
+% {Rename \cs{DeclareUnknownKeysHandler} to \cs{DeclareUnknownKeyHandler}}
+% \begin{macrocode}
+\NewDocumentCommand \DeclareUnknownKeyHandler { O { \@currname } +m }
{
- \IfNoValueTF {#1}
- { \exp_args:NV \keys_define:nn \@currname }
- { \keys_define:nn {#1} }
- {#2}
+ \cs_set_protected:cpn { @@_unknown_handler_ #1 :nn } ##1##2 {#2}
+ \@@_options_expand_module:Nn \keys_define:nx {#1}
+ {
+ unknown .code:n =
+ \exp_not:N \exp_args:NV
+ \exp_not:c { @@_unknown_handler_ #1 :nn }
+ \exp_not:N \l_keys_key_str {####1}
+ }
}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ProcessKeyOptions, \ProcessKeyPackageOptions}
+% \changes{v1.0c}{2022/02/15}{Expand module argument}
+% \changes{v1.0d}{2022/02/16}{Allow for active characters in module argument}
% We need to deal with the older interface from \pkg{l3keys2e} here: it had
% a mandatory argument. We can mop that up using a look-ahead, and then
% exploit that information to determine whether the package option handling
% is set up for the new approach for clash handling.
% \begin{macrocode}
-\NewDocumentCommand \ProcessKeyOptions { o }
- {
- \IfNoValueTF {#1}
- { \@@_options:NV \c_true_bool \@currname }
- { \@@_options:Nn \c_true_bool {#1} }
- }
-\NewDocumentCommand \ProcessKeyPackageOptions { o }
- {
- \IfNoValueTF {#1}
- { \@@_options:NV \c_false_bool \@currname }
- { \@@_options:Nn \c_false_bool {#1} }
- }
+\NewDocumentCommand \ProcessKeyOptions { O { \@currname } }
+ { \@@_options:Nn \c_true_bool {#1} }
+\NewDocumentCommand \ProcessKeyPackageOptions { O { \@currname } }
+ { \@@_options:Nn \c_false_bool {#1} }
\@onlypreamble \ProcessKeyOptions
\@onlypreamble \ProcessKeyPackageOptions
% \end{macrocode}
@@ -462,15 +514,12 @@
% \subsection{General key setting}
%
% \begin{macro}{\SetKeys}
+% \changes{v1.0c}{2022/02/15}{Expand module argument}
+% \changes{v1.0d}{2022/02/16}{Allow for active characters in module argument}
% A simple wrapper.
% \begin{macrocode}
-\NewDocumentCommand \SetKeys { o +m }
- {
- \IfNoValueTF {#1}
- { \keys_set:Vn \@currname }
- { \keys_set:nn {#1} }
- {#2}
- }
+\NewDocumentCommand \SetKeys { O { \@currname } +m }
+ { \@@_options_expand_module:Nn \keys_set:nn {#1} {#2} }
% \end{macrocode}
% \end{macro}
%
diff --git a/Master/texmf-dist/source/latex-dev/base/ltvers.dtx b/Master/texmf-dist/source/latex-dev/base/ltvers.dtx
index 0bf753f210b..e46851de01a 100644
--- a/Master/texmf-dist/source/latex-dev/base/ltvers.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/ltvers.dtx
@@ -33,7 +33,7 @@
%<*driver>
% \fi
\ProvidesFile{ltvers.dtx}
- [2021/08/10 v1.1h LaTeX Kernel (Version Info)]
+ [2022/02/28 v1.1i LaTeX Kernel (Version Info)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltvers.dtx}
@@ -115,7 +115,7 @@
{2022-06-01}
%</2ekernel|latexrelease>
%<*2ekernel>
-\def\patch@level{-2}
+\def\patch@level{-3}
% \end{macrocode}
%
% \begin{macro}{\development@branch@name}
@@ -365,6 +365,8 @@
% \changes{v1.1f}{2021/03/18}{Added \cs{NewModuleRelease}.}
% \changes{v1.1g}{2021/04/16}
% {\cs{NewModuleRelease} with the same arguments as \cs{IncludeInRelease}.}
+% \changes{v1.1i}{2022/02/28}
+% {Detect a missing \cs{IncludeInRelease}\texttt{\{0000/00/00\}}.}
% \begin{macrocode}
\let\if@skipping@module\iffalse
\def\@skipping@moduletrue{\let\if@skipping@module\iftrue}
@@ -379,7 +381,7 @@
\GenericInfo{}{BEGIN module: \new@modulename\space (\new@moduledate)}%
\GenericInfo{}{ \@spaces\@spaces\@spaces\space#3\@gobble}%
\ifnum\sourceLaTeXdate<%
- \expandafter\@parse@version\new@moduledate//00\@nil\relax
+ \expandafter\@parse@version\new@moduledate//00\@nil\relax
\ifnum\expandafter\@parse@version\fmtversion//00\@nil<%
\expandafter\@parse@version\new@moduledate//00\@nil\relax
\GenericInfo{}{Skipping module \new@modulename}%
@@ -394,7 +396,19 @@
\@skipping@moduletrue
\expandafter\new@module@skip
\fi}
-\long\def\new@module@skip#1\IncludeInRelease{\IncludeInRelease}
+\long\def\new@module@skip#1\IncludeInRelease{%
+ \long\def\reserved@a##1\EndModuleRelease{}%
+ \if\relax\detokenize\expandafter{\reserved@a#1{}{}\EndModuleRelease}\relax
+ \else
+ \@latex@error{Missing mandatory \string\IncludeInRelease{0000/00/00}}\@ehc
+ \expandafter\@secondoftwo
+ \fi
+ \@gobble
+ {\@expandtwoargs\IncludeInRelease
+ {0000/00/00}{\new@modulename}%
+ {ERROR! Emergency recovery}%
+ #1}%
+ \IncludeInRelease}
\def\EndModuleRelease{%
\ifx\new@modulename\@empty
\@latex@error{Extra \string\EndModuleRelease.}\@eha
diff --git a/Master/texmf-dist/source/latex-dev/base/utf8ienc.dtx b/Master/texmf-dist/source/latex-dev/base/utf8ienc.dtx
index a0c96357a03..8789dd35efd 100644
--- a/Master/texmf-dist/source/latex-dev/base/utf8ienc.dtx
+++ b/Master/texmf-dist/source/latex-dev/base/utf8ienc.dtx
@@ -216,7 +216,7 @@
%<+ts1> \ProvidesFile{ts1enc.dfu}
%<+x2> \ProvidesFile{x2enc.dfu}
%<+all> \ProvidesFile{utf8enc.dfu}
-%<-utf8-2018> [2021/12/13 v1.2o UTF-8 support]
+%<-utf8-2018> [2022/02/13 v1.3a UTF-8 support]
% \end{macrocode}
%
% \begin{macrocode}
@@ -363,11 +363,12 @@
% \begin{macro}{\UTFviii@two@octets@noexpand}
% \begin{macro}{\UTFviii@three@octets@noexpand}
% \begin{macro}{\UTFviii@four@octets@noexpand}
+% \changes{v1.3a}{2022/02/19}{Use \cs{unexpanded} rather than \cs{noexpand} so only takes one expansion step}%
% These temporarily prevent the active chars from expanding.
% \begin{macrocode}
-\long\def\UTF@two@octets@noexpand#1#2{\noexpand#2\noexpand}
-\long\def\UTF@three@octets@noexpand#1#2#3{\noexpand#2\noexpand#3\noexpand}
-\long\def\UTF@four@octets@noexpand#1#2#3#4{\noexpand#2\noexpand#3\noexpand#4\noexpand}
+\long\def\UTF@two@octets@noexpand#1#2#3{\unexpanded{#2#3}}
+\long\def\UTF@three@octets@noexpand#1#2#3#4{\unexpanded{#2#3#4}}
+\long\def\UTF@four@octets@noexpand#1#2#3#4#5{\unexpanded{#2#3#4#5}}
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -376,11 +377,12 @@
% \begin{macro}{\UTFviii@two@octets@string}
% \begin{macro}{\UTFviii@three@octets@string}
% \begin{macro}{\UTFviii@four@octets@string}
+% \changes{v1.3a}{2022/02/19}{Use \cs{detokenize} rather than \cs{string} so only takes one expansion step}%
% And the same with \cs{string} for use in \cs{csname} constructions.
% \begin{macrocode}
-\long\def\UTF@two@octets@string#1#2{\string#2\string}
-\long\def\UTF@three@octets@string#1#2#3{\string#2\string#3\string}
-\long\def\UTF@four@octets@string#1#2#3#4{\string#2\string#3\string#4\string}
+\long\def\UTF@two@octets@string#1#2#3{\detokenize{#2#3}}
+\long\def\UTF@three@octets@string#1#2#3#4{\detokenize{#2#3#4}}
+\long\def\UTF@four@octets@string#1#2#3#4#5{\detokenize{#2#3#4#5}}
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -542,15 +544,24 @@
% |\count@| and ending at |\@tempcnta|${} - 1$, each time executing
% the code in |\UTFviii@tmp|.
%
-% All this is done in a group so that temporary catcode changes
-% etc.~vanish after everything is set up.
+% Store current settings so can restore after the loops without using a group (gh/762).
+%
+% \begin{macrocode}
+\edef\reserved@a{%
+\catcode`\noexpand\~=\the\catcode`\~\relax
+\catcode`\noexpand\"=\the\catcode`\"\relax
+\uccode`\noexpand\~=\the\uccode`\~\relax
+\count@=\the\count@\relax
+\@tempcnta=\the\@tempcnta\relax
+\let\noexpand\reserved@a\relax}
+% \end{macrocode}
%
% \begin{macrocode}
-\begingroup
\catcode`\~13
\catcode`\"12
% \end{macrocode}
%
+% \changes{v1.3a}{2022/02/19}{Use local protected definitions in the character definitions}%
% \begin{macrocode}
\def\UTFviii@loop{%
\uccode`\~\count@
@@ -566,7 +577,7 @@
% C0 controls are valid UTF-8 but defined to give the ``Character not defined error''
% They may be defined with |\DeclareUnicodeCharacter|.
% \begin{macrocode}
- \def\UTFviii@tmp{\xdef~{\noexpand\UTFviii@undefined@err{:\string~}}}
+ \def\UTFviii@tmp{\protected\edef~{\noexpand\UTFviii@undefined@err{:\string~}}}
% 0 ^^@ null
\count@"1
\@tempcnta9
@@ -588,7 +599,7 @@
% \begin{macrocode}
\count@"80
\@tempcnta"C2
- \def\UTFviii@tmp{\xdef~{\noexpand\UTFviii@invalid@err\string~}}
+ \def\UTFviii@tmp{\protected\edef~{\noexpand\UTFviii@invalid@err\string~}}
\UTFviii@loop
% \end{macrocode}
%
@@ -597,7 +608,7 @@
% \begin{macrocode}
\count@"C2
\@tempcnta"E0
- \def\UTFviii@tmp{\xdef~{\noexpand\UTFviii@two@octets\noexpand~}}
+ \def\UTFviii@tmp{\protected\edef~{\noexpand\UTFviii@two@octets\noexpand~}}
\UTFviii@loop
% \end{macrocode}
%
@@ -605,7 +616,7 @@
% \begin{macrocode}
\count@"E0
\@tempcnta"F0
- \def\UTFviii@tmp{\xdef~{\noexpand\UTFviii@three@octets\noexpand~}}
+ \def\UTFviii@tmp{\protected\edef~{\noexpand\UTFviii@three@octets\noexpand~}}
\UTFviii@loop
% \end{macrocode}
%
@@ -614,7 +625,7 @@
% \begin{macrocode}
\count@"F0
\@tempcnta"F5
- \def\UTFviii@tmp{\xdef~{\noexpand\UTFviii@four@octets\noexpand~}}
+ \def\UTFviii@tmp{\protected\edef~{\noexpand\UTFviii@four@octets\noexpand~}}
\UTFviii@loop
% \end{macrocode}
%
@@ -623,12 +634,13 @@
% \begin{macrocode}
\count@"F5
\@tempcnta"100
- \def\UTFviii@tmp{\xdef~{\noexpand\UTFviii@invalid@err\string~}}
+ \def\UTFviii@tmp{\protected\edef~{\noexpand\UTFviii@invalid@err\string~}}
\UTFviii@loop
% \end{macrocode}
%
+% Restore values after the loops.
% \begin{macrocode}
-\endgroup
+\reserved@a
% \end{macrocode}
%
% \end{macro}
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 fb8d3401373..1e6e286a737 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-2021
+%% File: latex2e-first-aid-for-external-files.dtx (C) Copyright 2020-2022
%%
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
@@ -99,7 +99,7 @@
% release we have to make and distribute also a matching
% development release.
%
-% \StopEventually{\setlength\IndexMin{200pt} \PrintIndex }
+% \MaybeStop{\setlength\IndexMin{200pt} \PrintIndex }
%
%
% \section{The Implementation}
@@ -111,8 +111,8 @@
% \end{macrocode}
%
% \begin{macrocode}
-\def\LaTeXFirstAidDate{2021/11/11}
-\def\LaTeXFirstAidVersion{v1.0q}
+\def\LaTeXFirstAidDate{2022/02/20}
+\def\LaTeXFirstAidVersion{v1.0r}
% \end{macrocode}
%
% \begin{macrocode}
@@ -311,11 +311,12 @@
%<*kernel>
% \end{macrocode}
%
+% Bidi is now ar a new version: patches are no longer needed.
% \begin{macrocode}
-\AddToHook{file/biditools.sty/after}[firstaid]{%
- \FirstAidNeededT{biditools}{sty}%
- {2020/05/13 v2 Programming tools for bidi package}%
- {%
+%\AddToHook{file/biditools.sty/after}[firstaid]{%
+% \FirstAidNeededT{biditools}{sty}%
+% {2020/05/13 v2 Programming tools for bidi package}%
+% {%
% \end{macrocode}
% \pkg{bidi} adds some code to the beginning of \cs{document} which
% contains \cs{endgroup} and \cs{begingroup} which is no longer
@@ -324,20 +325,20 @@
% Patching \cs{document} using \cs{bidi@patchcmd} doesn't work so
% we take the extra groups out by hand:
% \begin{macrocode}
- \def\firstaid@bidi@document@patch
- \endgroup#1\begingroup#2\firstaid@bidi@document@patch
- {\unexpanded{#1#2}}%
- \edef\document{\expandafter\firstaid@bidi@document@patch\document
- \firstaid@bidi@document@patch}%
+% \def\firstaid@bidi@document@patch
+% \endgroup#1\begingroup#2\firstaid@bidi@document@patch
+% {\unexpanded{#1#2}}%
+% \edef\document{\expandafter\firstaid@bidi@document@patch\document
+% \firstaid@bidi@document@patch}%
% \end{macrocode}
% There are also some patches into \cs{enddocument}, some continue
% to go in but one fails, so we add that now into the right place.
% \begin{macrocode}
- \AddToHook{enddocument/info}%
- {\let\bidi@AfterEndDocumentCheckLabelsRerun\@firstofone
- \bidi@afterenddocumentchecklabelsrerunhook}%
- }%
-}
+% \AddToHook{enddocument/info}%
+% {\let\bidi@AfterEndDocumentCheckLabelsRerun\@firstofone
+% \bidi@afterenddocumentchecklabelsrerunhook}%
+% }%
+%}
% \end{macrocode}
%
%
@@ -559,6 +560,30 @@
}
% \end{macrocode}
%
+% \subsection{The \pkg{german} class first aid}
+%
+% Handling of \cs{protected} UTF-8
+% \begin{macrocode}
+\AddToHook{file/german.sty/after}[firstaid]{%
+ \FirstAidNeededT{german}{sty}{1998/07/08 v2.5e Support for writing german texts (br)}
+ {%
+\let\grmn@active@dq@\@active@dq
+\def\@active@dq{\protect\grmn@active@dq@}%
+\germanTeX
+}%
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\AddToHook{file/ngerman.sty/after}[firstaid]{%
+ \FirstAidNeededT{ngerman}{sty}{1998/07/08 v2.5e Support for writing german texts (br)}
+ {%
+\let\grmn@active@dq@\@active@dq
+\def\@active@dq{\protect\grmn@active@dq@}%
+\ngermanTeX
+}%
+}
+% \end{macrocode}
%
%
%
diff --git a/Master/texmf-dist/source/latex-dev/graphics/graphics.dtx b/Master/texmf-dist/source/latex-dev/graphics/graphics.dtx
index c9b381adad7..92b3c8f335a 100644
--- a/Master/texmf-dist/source/latex-dev/graphics/graphics.dtx
+++ b/Master/texmf-dist/source/latex-dev/graphics/graphics.dtx
@@ -27,7 +27,7 @@
%<driver> \ProvidesFile{graphics.drv}
% \fi
% \ProvidesFile{graphics.dtx}
- [2021/03/04 v1.4d Standard LaTeX Graphics (DPC,SPQR)]
+ [2022/03/10 v1.4e Standard LaTeX Graphics (DPC,SPQR)]
%
% \iffalse
%<*driver>
@@ -1053,33 +1053,39 @@
% \edef{macrocode}
% \end{macro}
%
-% \begin{macro}{\set@curr@file}
+% \begin{macro}{\Gin@set@curr@file}
% \begin{macro}{\quote@name}
% \changes{v1.3c}{2019/10/08}
% {Definitions added for old formats}
+% \changes{v1.4e}{2022/03/10}
+% {Use \cs{Gin@set@curr@file}, and define it appropriately}
+% We have to cope with older formats (rollback as far as 2019-10-01)
+% and Plain. Define a minimal \cs{Gin@set@curr@file} first:
% \begin{macrocode}
-\def\Gin@temp#1{%
- \begingroup
- \escapechar\m@ne
- \xdef\@curr@file{\expandafter\string\csname #1\endcsname}%
- \endgroup
-}
-\ifx\set@curr@file\@Gin@temp
- \let\set@curr@file\@undefined
-\fi
-% \end{macrocode}
-%
-% \begin{macrocode}
-\ifx\set@curr@file\@undefined
-\def\set@curr@file#1{%
+\def\Gin@set@curr@file#1{%
\begingroup
\escapechar\m@ne
\xdef\@curr@file{\expandafter\string\csname\@firstofone#1\@empty\endcsname}%
- \endgroup
-}
-\def\quote@name#1{"\quote@@name#1\@gobble""}
-\def\quote@@name#1"{#1\quote@@name}
-\def\unquote@name#1{\quote@@name#1\@gobble"}
+ \endgroup}
+% \end{macrocode}
+% Then, if \cs{set@curr@file@nosearch} is undefined, we're before
+% 2022-06-01, and if \cs{set@curr@file} is undefined, we're before
+% 2019-10-01 (aka Plain, as far as these tests are concerned). Make
+% \cs{Gin@set@curr@file} be a copy of the most recent macro:
+% \cs{set@curr@file@nosearch} if it exists, and \cs{set@curr@file}
+% otherwise. If neither exist, we also need to define
+% \cs{quote@name} et~al.
+% \begin{macrocode}
+\ifx\set@curr@file@nosearch\@undefined
+ \ifx\set@curr@file\@undefined
+ \def\quote@name#1{"\quote@@name#1\@gobble""}
+ \def\quote@@name#1"{#1\quote@@name}
+ \def\unquote@name#1{\quote@@name#1\@gobble"}
+ \else
+ \let\Gin@set@curr@file\set@curr@file
+ \fi
+\else
+ \let\Gin@set@curr@file\set@curr@file@nosearch
\fi
% \end{macrocode}
% \end{macro}
@@ -1114,8 +1120,11 @@
%
% \changes{v1.3d}{2019/11/01}
% {\cs{curr@name} now unquoted}
+% \changes{v1.4e}{2022/03/10}
+% {Use \cs{set@curr@file@nosearch} to avoid premature inclusion of
+% path from \cs{graphicspath}}
% \begin{macrocode}
- \set@curr@file{#1}%
+ \Gin@set@curr@file{#1}%
\expandafter\filename@parse\expandafter{\@curr@file}%
% \end{macrocode}
% If extension is |.gz| tack on to previous extension, eg |.eps.gz| if available.
diff --git a/Master/texmf-dist/source/latex-dev/graphics/mathcolor.dtx b/Master/texmf-dist/source/latex-dev/graphics/mathcolor.dtx
index 6ed53f8f618..2341e71e284 100644
--- a/Master/texmf-dist/source/latex-dev/graphics/mathcolor.dtx
+++ b/Master/texmf-dist/source/latex-dev/graphics/mathcolor.dtx
@@ -14,8 +14,8 @@
%%% From File: mathcolor.dtx
%
% \begin{macrocode}
-\def\mathcolorversion{v1.0a}
-\def\mathcolordate{2022/01/07}
+\def\mathcolorversion{v1.0b}
+\def\mathcolordate{2022/01/28}
% \end{macrocode}
%<*driver>
\documentclass{l3doc}
@@ -165,7 +165,17 @@
% \begin{macrocode}
\DeclareDocumentCommand \mathcolor { o m m } {
% \end{macrocode}
-% First action is to save the current color value on a stack
+% The \cs{mathcolor} is only supported in math mode because in text
+% mode it has problems scanning away a space after it, for example.
+% We therefore raise an error if it executes
+% anywhere else. The \LaTeXe{} error command is a
+% bit strangely named, because in the kernel it is only used for
+% math alphabets, but the message it gives is fine.
+% \changes{v1.0b}{2022/01/28}{Restrict command to math mode}
+% \begin{macrocode}
+ \mode_if_math:F { \non@alpherr {\mathcolor\space} }
+% \end{macrocode}
+% First real action is to save the current color value on a stack
% (needed if the command is nested or contains some further color
% changes with \cs{color} inside).
% \begin{macrocode}
diff --git a/Master/texmf-dist/source/latex-dev/tools/array.dtx b/Master/texmf-dist/source/latex-dev/tools/array.dtx
index acee0ce5053..c9f77d77a35 100644
--- a/Master/texmf-dist/source/latex-dev/tools/array.dtx
+++ b/Master/texmf-dist/source/latex-dev/tools/array.dtx
@@ -33,7 +33,7 @@
%<+package>\DeclareCurrentRelease{}{2020-10-01}
%<+package>
%<+package>\ProvidesPackage{array}
-%<+package> [2021/10/04 v2.5f Tabular extension package (FMi)]
+%<+package> [2022/03/10 v2.5f Tabular extension package (FMi)]
%
% \fi
%
@@ -890,8 +890,8 @@
% c & 0 & 0 \\
% l & 0 & 1 \\
% r & 0 & 2 \\
-% p-arg & 0 & 3 \\
-% t-arg & 0 & 4 \\
+% m-arg & 0 & 3 \\
+% p-arg & 0 & 4 \\
% b-arg & 0 & 5 \\
% | & 1 & 0 \\
% !-arg & 1 & 1 \\
@@ -907,8 +907,8 @@
% @ & 7 & --- \\
% < & 8 & --- \\
% > & 9 & --- \\
-% p & 10 & 3 \\
-% t & 10 & 4 \\
+% m & 10 & 3 \\
+% p & 10 & 4 \\
% b & 10 & 5
% \end{tabular}
% \end{center}