diff options
author | Karl Berry <karl@freefriends.org> | 2024-06-02 20:26:39 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2024-06-02 20:26:39 +0000 |
commit | b0c666dbd315af330424f5d34739d7d4134d0c17 (patch) | |
tree | 0b0a60149691348e9cea719bb797b2c1587adfc6 /Master/texmf-dist/tex/latex/base | |
parent | 5634f0473d32ab71b4fbaaf0a6870737c2cc6dcb (diff) |
latex2e (2jun24)
git-svn-id: svn://tug.org/texlive/trunk@71408 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/base')
65 files changed, 4244 insertions, 666 deletions
diff --git a/Master/texmf-dist/tex/latex/base/alltt.sty b/Master/texmf-dist/tex/latex/base/alltt.sty index a20612f5d37..78c5e6a9241 100644 --- a/Master/texmf-dist/tex/latex/base/alltt.sty +++ b/Master/texmf-dist/tex/latex/base/alltt.sty @@ -49,7 +49,7 @@ %% \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{alltt} - [2021/01/29 v2.0g defines alltt environment] + [2024/02/08 v2.0g defines alltt environment] \begingroup \lccode`\~=`\' \lowercase{\endgroup diff --git a/Master/texmf-dist/tex/latex/base/ansinew.def b/Master/texmf-dist/tex/latex/base/ansinew.def index 83698b1e849..071d9a49f8c 100644 --- a/Master/texmf-dist/tex/latex/base/ansinew.def +++ b/Master/texmf-dist/tex/latex/base/ansinew.def @@ -43,7 +43,7 @@ %% extension .ins) which are part of the distribution. \ProvidesFile{ansinew.def} - [2021/02/14 v1.3d Input encoding file] + [2024/02/08 v1.3d Input encoding file] \ProvideTextCommandDefault{\textdegree}{\ensuremath{{^\circ}}} \ProvideTextCommandDefault{\textonehalf}{\ensuremath{\frac12}} \ProvideTextCommandDefault{\textonequarter}{\ensuremath{\frac14}} diff --git a/Master/texmf-dist/tex/latex/base/applemac.def b/Master/texmf-dist/tex/latex/base/applemac.def index 6d96c23caa6..85032040d8c 100644 --- a/Master/texmf-dist/tex/latex/base/applemac.def +++ b/Master/texmf-dist/tex/latex/base/applemac.def @@ -43,7 +43,7 @@ %% extension .ins) which are part of the distribution. \ProvidesFile{applemac.def} - [2021/02/14 v1.3d Input encoding file] + [2024/02/08 v1.3d Input encoding file] \ProvideTextCommandDefault{\textdegree}{\ensuremath{{^\circ}}} \ProvideTextCommandDefault{\textflorin}{\textit{f}} \ProvideTextCommandDefault{\textcent} diff --git a/Master/texmf-dist/tex/latex/base/article.cls b/Master/texmf-dist/tex/latex/base/article.cls index 9a3615247a5..869bdc0db41 100644 --- a/Master/texmf-dist/tex/latex/base/article.cls +++ b/Master/texmf-dist/tex/latex/base/article.cls @@ -43,7 +43,7 @@ %% extension .ins) which are part of the distribution. \NeedsTeXFormat{LaTeX2e}[1995/12/01] \ProvidesClass{article} - [2023/05/17 v1.4n + [2024/02/08 v1.4n Standard LaTeX document class] \newcommand\@ptsize{} \newif\if@restonecol diff --git a/Master/texmf-dist/tex/latex/base/ascii.def b/Master/texmf-dist/tex/latex/base/ascii.def index 1c924fc48dc..0f08f8091f8 100644 --- a/Master/texmf-dist/tex/latex/base/ascii.def +++ b/Master/texmf-dist/tex/latex/base/ascii.def @@ -43,7 +43,7 @@ %% extension .ins) which are part of the distribution. \ProvidesFile{ascii.def} - [2021/02/14 v1.3d Input encoding file] + [2024/02/08 v1.3d Input encoding file] \@inpenc@test \endinput %% diff --git a/Master/texmf-dist/tex/latex/base/atbegshi-ltx.sty b/Master/texmf-dist/tex/latex/base/atbegshi-ltx.sty index 034d1d13290..992a4278526 100644 --- a/Master/texmf-dist/tex/latex/base/atbegshi-ltx.sty +++ b/Master/texmf-dist/tex/latex/base/atbegshi-ltx.sty @@ -46,8 +46,6 @@ %% Frank Mittelbach, The LaTeX Project %% %%% From File: ltshipout.dtx -\providecommand\ltshipoutversion{v1.0n} -\providecommand\ltshipoutdate{2022/11/08} \ProvidesPackage{atbegshi-ltx} [2021/01/10 v1.0c Emulation of the original atbegshi^^Jpackage with kernel methods] diff --git a/Master/texmf-dist/tex/latex/base/atveryend-ltx.sty b/Master/texmf-dist/tex/latex/base/atveryend-ltx.sty index add6997a565..76d4e001d38 100644 --- a/Master/texmf-dist/tex/latex/base/atveryend-ltx.sty +++ b/Master/texmf-dist/tex/latex/base/atveryend-ltx.sty @@ -42,8 +42,6 @@ %% and covered by LPPL is defined by the unpacking scripts (with %% extension .ins) which are part of the distribution. %%% From File: ltfilehook.dtx -\providecommand\ltfilehookversion{v1.0o} -\providecommand\ltfilehookdate{2023/07/10} \ProvidesPackage{atveryend-ltx} [2020/08/19 v1.0a Emulation of the original atveryend package^^Jwith kernel methods] diff --git a/Master/texmf-dist/tex/latex/base/bk10.clo b/Master/texmf-dist/tex/latex/base/bk10.clo index 2de6c941b56..ba4701bead9 100644 --- a/Master/texmf-dist/tex/latex/base/bk10.clo +++ b/Master/texmf-dist/tex/latex/base/bk10.clo @@ -42,7 +42,7 @@ %% and covered by LPPL is defined by the unpacking scripts (with %% extension .ins) which are part of the distribution. \ProvidesFile{bk10.clo} - [2023/05/17 v1.4n + [2024/02/08 v1.4n Standard LaTeX file (size option)] \renewcommand\normalsize{% \@setfontsize\normalsize\@xpt\@xiipt diff --git a/Master/texmf-dist/tex/latex/base/bk11.clo b/Master/texmf-dist/tex/latex/base/bk11.clo index 9cac5edf370..c0a4a4420f1 100644 --- a/Master/texmf-dist/tex/latex/base/bk11.clo +++ b/Master/texmf-dist/tex/latex/base/bk11.clo @@ -42,7 +42,7 @@ %% and covered by LPPL is defined by the unpacking scripts (with %% extension .ins) which are part of the distribution. \ProvidesFile{bk11.clo} - [2023/05/17 v1.4n + [2024/02/08 v1.4n Standard LaTeX file (size option)] \renewcommand\normalsize{% \@setfontsize\normalsize\@xipt{13.6}% diff --git a/Master/texmf-dist/tex/latex/base/bk12.clo b/Master/texmf-dist/tex/latex/base/bk12.clo index 79562d99a94..c4a5e3c2457 100644 --- a/Master/texmf-dist/tex/latex/base/bk12.clo +++ b/Master/texmf-dist/tex/latex/base/bk12.clo @@ -42,7 +42,7 @@ %% and covered by LPPL is defined by the unpacking scripts (with %% extension .ins) which are part of the distribution. \ProvidesFile{bk12.clo} - [2023/05/17 v1.4n + [2024/02/08 v1.4n Standard LaTeX file (size option)] \renewcommand\normalsize{% \@setfontsize\normalsize\@xiipt{14.5}% diff --git a/Master/texmf-dist/tex/latex/base/book.cls b/Master/texmf-dist/tex/latex/base/book.cls index 020a4877320..2838b7f1ce3 100644 --- a/Master/texmf-dist/tex/latex/base/book.cls +++ b/Master/texmf-dist/tex/latex/base/book.cls @@ -43,7 +43,7 @@ %% extension .ins) which are part of the distribution. \NeedsTeXFormat{LaTeX2e}[1995/12/01] \ProvidesClass{book} - [2023/05/17 v1.4n + [2024/02/08 v1.4n Standard LaTeX document class] \newcommand\@ptsize{} \newif\if@restonecol diff --git a/Master/texmf-dist/tex/latex/base/checkencodingsubset.tex b/Master/texmf-dist/tex/latex/base/checkencodingsubset.tex new file mode 100644 index 00000000000..02410ad693a --- /dev/null +++ b/Master/texmf-dist/tex/latex/base/checkencodingsubset.tex @@ -0,0 +1,419 @@ +%% +%% This is file `checkencodingsubset.tex', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% lttextcomp.dtx (with options: `TS1check') +%% +%% This is a generated file. +%% +%% The source is maintained by the LaTeX Project team and bug +%% 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 +%% The LaTeX Project and any individual authors listed elsewhere +%% in this file. +%% +%% This file was generated from file(s) of the LaTeX base system. +%% -------------------------------------------------------------- +%% +%% It may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3c +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% https://www.latex-project.org/lppl.txt +%% and version 1.3c or later is part of all distributions of LaTeX +%% version 2008 or later. +%% +%% This file has the LPPL maintenance status "maintained". +%% +%% This file may only be distributed together with a copy of the LaTeX +%% base system. You may however distribute the LaTeX base system without +%% such generated files. +%% +%% The list of all files belonging to the LaTeX base distribution is +%% given in the file `manifest.txt'. See also `legal.txt' for additional +%% information. +%% +%% The list of derived (unpacked) files belonging to the distribution +%% and covered by LPPL is defined by the unpacking scripts (with +%% extension .ins) which are part of the distribution. +%%% From File: lttextcomp.dtx +\Providesfile{checkencodingsubset.tex} + [2024/01/27 v0.5a Figure out safe TS1 encoding subsets] +\let\typeoutdetails\typeout +\def\doesglyphexist#1#2{\iffontchar\testFont #1 0\else 1\relax \fi} +\def\glyphmissingdetails#1#2{\iffontchar\testFont #1 \else + \typeoutdetails{\space\space\space ==> \string#2 (#1) is missing}\fi} +\newif\ifsafesubencodingfound +\newif\ifcoremisses +\def\testgroup#1#2#3{% + \ifnum 0 = #1% + \ifnum #2<0 + \typeoutdetails{All glyphs in core exist}% + \else + \typeoutdetails{All glyphs between sub-encoding #2 and #3 exist}% + \fi + \else + \ifnum #2<0 + \typeoutdetails{**********************************}% + \typeoutdetails{Some glyphs are missing from core:}% + \coremissestrue + \ifsafesubencodingfound \else + \def\subencodingresult{#2}% + \fi + \else + \typeoutdetails{Some glyphs are missing from sub-encoding #2:}% + \ifsafesubencodingfound \else + \def\subencodingresult{#3}% + \fi + \fi + {\let\doesglyphexist \glyphmissingdetails #1}% + \safesubencodingfoundtrue + \fi +} +\def\currsubencoding#1{\csname TS1:\ifcsname TS1:#1\endcsname #1\else ?\fi\endcsname} +\DeclareFixedFont\cmrFont{TS1}{cmr}{m}{n}{10pt} +\def\testallgroups#1{% + \DeclareFixedFont\testFont{TS1}{#1}{m}{n}{10pt}% + \ifx\testFont\cmrFont + \typeout{***** Font family #1 not found ****}% + \else + \safesubencodingfoundfalse + \coremissesfalse + \typeoutdetails{^^J-----------------------------------------}% + \typeoutdetails{Testing font family #1^^J(currently TS1-sub-encoding + \currsubencoding{#1})}% + \typeout{-----------------------------------------}% + \testgroup{% + \doesglyphexist{21}{\texttwelveudash}% + \doesglyphexist{22}{\textthreequartersemdash}% + \doesglyphexist{134}{\textbardbl}% + \doesglyphexist{137}{\textcelsius}% + \doesglyphexist{178}{\texttwosuperior}% + \doesglyphexist{179}{\textthreesuperior}% + \doesglyphexist{185}{\textonesuperior}% + }{8}{9}% + \testgroup{% + \doesglyphexist{32}{\textblank}% + \doesglyphexist{148}{\textinterrobang}% + \doesglyphexist{149}{\textinterrobangdown}% + \doesglyphexist{191}{\texteuro}% + }{7}{8}% + \testgroup{% + \doesglyphexist{47}{\textfractionsolidus}% + \doesglyphexist{61}{\textminus}% + \doesglyphexist{87}{\textohm}% + \doesglyphexist{181}{\textmu}% + }{6}{7}% + \testgroup{% + \doesglyphexist{140}{\textflorin}% + \doesglyphexist{164}{\textcurrency}% + }{5}{6}% + \testgroup{% + \doesglyphexist{155}{\textnumero}% + \doesglyphexist{157}{\textestimated}% + }{4}{5}% + \testgroup{% + \doesglyphexist{24}{\textleftarrow}% + \doesglyphexist{25}{\textrightarrow}% + \doesglyphexist{94}{\textuparrow}% + \doesglyphexist{95}{\textdownarrow}% + \doesglyphexist{141}{\textcolonmonetary}% + \doesglyphexist{142}{\textwon}% + \doesglyphexist{146}{\textlira}% + \doesglyphexist{150}{\textdong}% + }{3}{4}% + \testgroup{% + \doesglyphexist{60}{\textlangle}% + \doesglyphexist{62}{\textrangle}% + }{2}{3}% + \testgroup{% + \doesglyphexist{0}{\capitalgrave}% + \doesglyphexist{1}{\capitalacute}% + \doesglyphexist{2}{\capitalcircumflex}% + \doesglyphexist{3}{\capitaltilde}% + \doesglyphexist{4}{\capitaldieresis}% + \doesglyphexist{5}{\capitalhungarumlaut}% + \doesglyphexist{6}{\capitalring}% + \doesglyphexist{7}{\capitalcaron}% + \doesglyphexist{8}{\capitalbreve}% + \doesglyphexist{9}{\capitalmacron}% + \doesglyphexist{10}{\capitaldotaccent}% + \doesglyphexist{11}{\capitalcedilla}% + \doesglyphexist{12}{\capitalogonek}% + \doesglyphexist{26}{\t}% + \doesglyphexist{27}{\capitaltie}% + \doesglyphexist{28}{\newtie}% + \doesglyphexist{29}{\capitalnewtie}% + \doesglyphexist{45}{\textdblhyphen}% + \doesglyphexist{48}{\textzerooldstyle}% + \doesglyphexist{49}{\textoneoldstyle}% + \doesglyphexist{50}{\texttwooldstyle}% + \doesglyphexist{51}{\textthreeoldstyle}% + \doesglyphexist{52}{\textfouroldstyle}% + \doesglyphexist{53}{\textfiveoldstyle}% + \doesglyphexist{54}{\textsixoldstyle}% + \doesglyphexist{55}{\textsevenoldstyle}% + \doesglyphexist{56}{\texteightoldstyle}% + \doesglyphexist{57}{\textnineoldstyle}% + \doesglyphexist{77}{\textmho}% + \doesglyphexist{79}{\textbigcircle}% + \doesglyphexist{91}{\textlbrackdbl}% + \doesglyphexist{93}{\textrbrackdbl}% + \doesglyphexist{96}{\textasciigrave}% + \doesglyphexist{98}{\textborn}% + \doesglyphexist{99}{\textdivorced}% + \doesglyphexist{100}{\textdied}% + \doesglyphexist{108}{\textleaf}% + \doesglyphexist{109}{\textmarried}% + \doesglyphexist{110}{\textmusicalnote}% + \doesglyphexist{126}{\texttildelow}% + \doesglyphexist{127}{\textdblhyphenchar}% + \doesglyphexist{128}{\textasciibreve}% + \doesglyphexist{129}{\textasciicaron}% + \doesglyphexist{175}{\textasciimacron}% + \doesglyphexist{130}{\textacutedbl}% + \doesglyphexist{131}{\textgravedbl}% + \doesglyphexist{138}{\textdollaroldstyle}% + \doesglyphexist{139}{\textcentoldstyle}% + \doesglyphexist{143}{\textnaira}% + \doesglyphexist{144}{\textguarani}% + \doesglyphexist{145}{\textpeso}% + \doesglyphexist{147}{\textrecipe}% + \doesglyphexist{152}{\textpertenthousand}% + \doesglyphexist{153}{\textpilcrow}% + \doesglyphexist{154}{\textbaht}% + \doesglyphexist{156}{\textdiscount}% + \doesglyphexist{158}{\textopenbullet}% + \doesglyphexist{159}{\textservicemark}% + \doesglyphexist{160}{\textlquill}% + \doesglyphexist{161}{\textrquill}% + \doesglyphexist{168}{\textasciidieresis}% + \doesglyphexist{171}{\textcopyleft}% + \doesglyphexist{173}{\textcircledP}% + \doesglyphexist{180}{\textasciiacute}% + \doesglyphexist{184}{\textreferencemark}% + \doesglyphexist{187}{\textsurd}% + }{1}{2}% + \testgroup{% + \doesglyphexist{79}{\textcircled}% this is not a proper test because the symbol is + % usually available but not usable + }{0}{1}% + \testgroup{% + \doesglyphexist{13}{\textquotestraightbase}% + \doesglyphexist{18}{\textquotestraightdblbase}% + \doesglyphexist{23}{\textcapitalcompwordmark}% + \doesglyphexist{31}{\textascendercompwordmark}% + \doesglyphexist{36}{\textdollar}% + \doesglyphexist{39}{\textquotesingle}% + \doesglyphexist{42}{\textasteriskcentered}% + \doesglyphexist{132}{\textdagger}% + \doesglyphexist{133}{\textdaggerdbl}% + \doesglyphexist{135}{\textperthousand}% + \doesglyphexist{136}{\textbullet}% + \doesglyphexist{151}{\texttrademark}% + \doesglyphexist{162}{\textcent}% + \doesglyphexist{163}{\textsterling}% + \doesglyphexist{165}{\textyen}% + \doesglyphexist{166}{\textbrokenbar}% + \doesglyphexist{167}{\textsection}% + \doesglyphexist{169}{\textcopyright}% + \doesglyphexist{170}{\textordfeminine}% + \doesglyphexist{172}{\textlnot}% + \doesglyphexist{174}{\textregistered}% + \doesglyphexist{176}{\textdegree}% + \doesglyphexist{177}{\textpm}% + \doesglyphexist{182}{\textparagraph}% + \doesglyphexist{183}{\textperiodcentered}% + \doesglyphexist{186}{\textordmasculine}% + \doesglyphexist{188}{\textonequarter}% + \doesglyphexist{189}{\textonehalf}% + \doesglyphexist{190}{\textthreequarters}% + \doesglyphexist{214}{\texttimes}% + \doesglyphexist{246}{\textdiv}% + }{-1}{0}% + \ifsafesubencodingfound\else + \def\subencodingresult{0}% + \fi + \typeoutdetails{-----------------------------------------}% + \typeout{TS1 encoding subset for #1\ifcoremisses \space(ignoring core misses)\fi + \space (\ifnum\subencodingresult = + \currsubencoding{#1} ok\else bad\fi)}% + \typeout{Use sub-encoding \subencodingresult + \ifnum\subencodingresult = \currsubencoding{#1}\else + \space (not \currsubencoding{#1})\fi} + \typeout{-----------------------------------------^^J}% + \fi +} +\long\def\testallkerneldefinedfamilies{% +\testallgroups{ccr}% {0} +\testallgroups{cmbr}% {0} +%%\testallgroups{cmr}% {0} % don't test this one as it is the fallback + % thus reports that the family is not found +\testallgroups{cmss}% {0} +\testallgroups{cmtl}% {0} +\testallgroups{cmtt}% {0} +\testallgroups{cmvtt}% {0} +\testallgroups{pxr}% {0} +\testallgroups{pxss}% {0} +\testallgroups{pxtt}% {0} +\testallgroups{qag}% {0} +\testallgroups{qbk}% {0} +\testallgroups{qcr}% {0} +\testallgroups{qcs}% {0} +\testallgroups{qhvc}% {0} +\testallgroups{qhv}% {0} +\testallgroups{qpl}% {0} +\testallgroups{qtm}% {0} +\testallgroups{qzc}% {0} +\testallgroups{txr}% {0} +\testallgroups{txss}% {0} +\testallgroups{txtt}% {0} +\testallgroups{zi4}% {9} +%% not installed normally + +\testallgroups{lato-LF}% {0} % with a bunch of tofu inside --- should probably be changed +\testallgroups{opensans-TLF}%{0} % with a bunch of tofu inside --- should probably be changed +\testallgroups{cantarell-TLF}% {0} % with a bunch of tofu inside --- should probably be changed +\testallgroups{fbb-LF}% {0} % missing centoldstyle ---> 2 +\testallgroups{tli}% {1} % with lots of tofu inside --- should probably be changed +\testallgroups{Alegreya-OsF}% {2} +\testallgroups{AlegreyaSans-OsF}% {2} +\testallgroups{DejaVuSans-TLF}% {2} +\testallgroups{DejaVuSansCondensed-TLF}% {2} +\testallgroups{DejaVuSansMono-TLF}% {2} this is missing \textfractionsolidus which makes it 7 really +\testallgroups{EBGaramond-LF}% {2} +\testallgroups{Tempora-TLF}% {2} +\testallgroups{Tempora-TOsF}% {2} +\testallgroups{Arimo-TLF}% {3} +\testallgroups{Crlt-TLF}% {3} changed from Carlito- +\testallgroups{FiraSans-LF}% {3} should be 4 +\testallgroups{IBMPlexSans-TLF}% {3} +\testallgroups{Merriwthr-OsF}% {3} changed from Merriweather- and should be 2 +\testallgroups{Montserrat-LF}% {3} now 2 +\testallgroups{MontserratAlternates-LF}%{3} now 2 +\testallgroups{SourceCodePro-TLF}% {3} +\testallgroups{SourceCodePro-TOsF}% {3} +\testallgroups{SourceSansPro-OsF}% {3} +\testallgroups{SourceSerifPro-LF}% {3} +\testallgroups{Tinos-TLF}% {3} +\testallgroups{AccanthisADFStdNoThree-LF}%{4} +\testallgroups{Cabin-TLF}% {4} +\testallgroups{Caladea-TLF}% {4} +\testallgroups{Chivo-LF}% {4} +\testallgroups{ClearSans-TLF}% {4} +\testallgroups{Coelacanth-LF}% {4} +\testallgroups{CrimsonPro-LF}% {4} +\testallgroups{FiraMono-TLF}% {4} +\testallgroups{FiraMono-TOsF}% {4} +\testallgroups{Go-TLF}% {4} +\testallgroups{GoMono-TLF}% {4} +\testallgroups{InriaSans-LF}% {4} +\testallgroups{InriaSerif-LF}% {4} +\testallgroups{LibertinusSans-LF}% {4} +\testallgroups{LibertinusSerif-LF}% {4} +\testallgroups{LibreBodoni-TLF}% {4} +\testallgroups{LibreFranklin-TLF}% {4} +\testallgroups{LinguisticsPro-LF}% {4} +\testallgroups{LinguisticsPro-OsF}% {4} +\testallgroups{LinuxBiolinumT-LF}% {4} +\testallgroups{LinuxLibertineT-LF}% {4} +\testallgroups{MerriwthrSans-OsF}% {4} name change and now 2 +\testallgroups{MintSpirit-LF}% {4} +\testallgroups{MintSpiritNoTwo-LF}% {4} +\testallgroups{PTMono-TLF}% {4} +\testallgroups{PTSans-TLF}% {4} +\testallgroups{PTSansCaption-TLF}% {4} +\testallgroups{PTSansNarrow-TLF}% {4} +\testallgroups{PTSerif-TLF}% {4} +\testallgroups{PTSerifCaption-TLF}% {4} +\testallgroups{Raleway-TLF}% {4} +\testallgroups{Raleway-TOsF}% {4} +\testallgroups{Roboto-LF}% {4} +\testallgroups{RobotoMono-TLF}% {4} +\testallgroups{RobotoSlab-TLF}% {4} +\testallgroups{Rosario-LF}% {4} +\testallgroups{SticksTooText-LF}% {4} +\testallgroups{UniversalisADFStd-LF}%{4} +\testallgroups{Almndr-OsF}% {5} name change +\testallgroups{Baskervaldx-LF}% {5} +\testallgroups{BaskervilleF-LF}% {5} now 2 +\testallgroups{Bttr-TLF}% {5} name changed from Bitter-... +\testallgroups{Cinzel-LF}% {5} +\testallgroups{CinzelDecorative-LF}%{5} +\testallgroups{DejaVuSerif-TLF}% {5} +\testallgroups{DejaVuSerifCondensed-TLF}% {5} +\testallgroups{GilliusADF-LF}% {5} +\testallgroups{charssil-TLF} %% missing should be 5 +\testallgroups{GilliusADFCond-LF}%{5} +\testallgroups{GilliusADFNoTwo-LF}%{5} +\testallgroups{GilliusADFNoTwoCond-LF}%{5} +\testallgroups{Lbstr-LF}% {5} name change and should be 7 +\testallgroups{OldStandard-TLF}% {5} +\testallgroups{PlyfrDisplay-LF}%{5} name change +\testallgroups{PlyfrDisplay-OsF}% {5} name change +\testallgroups{TheanoDidot-TLF}% {5} +\testallgroups{TheanoDidot-TOsF}% {5} +\testallgroups{TheanoModern-TLF}% {5} +\testallgroups{TheanoModern-TOsF}%{5} +\testallgroups{TheanoOldStyle-TLF}%{5} +\testallgroups{TheanoOldStyle-TOsF}%{5} +\testallgroups{Crimson-TLF}% {6} +\testallgroups{IBMPlexMono-TLF}% {6} now 3 +\testallgroups{IBMPlexSerif-TLF}% {6} now 3 +\testallgroups{LibertinusMono-TLF}%{6} should be 8 +\testallgroups{LibertinusSerifDisplay-LF}%{6} +\testallgroups{LinuxLibertineDisplayT-LF}%{6} +\testallgroups{LinuxLibertineMonoT-LF}%{6} +\testallgroups{LinuxLibertineMonoT-TLF}%{6} +\testallgroups{Ovrlck-LF}% {6} name changed +\testallgroups{CormorantGaramond-LF}%{7} +\testallgroups{Heuristica-TLF}% {7} +\testallgroups{Heuristica-TOsF}% {7} +\testallgroups{IMFELLEnglish-TLF}%{7} +\testallgroups{LibreBskvl-LF}% {7} %% wrong name LibreBaskerville-TLF +\testallgroups{LibreCsln-LF}% {7} changed from LibreCaslon- +\testallgroups{Mrcls-LF}% {7} %% wrong name Marcellus-LF +\testallgroups{NotoSans-LF}% {7} +\testallgroups{NotoSansMono-TLF}%{7} now 2 +\testallgroups{NotoSansMono-TOsF}%{7} now 2 +\testallgroups{NotoSerif-LF}% {7} +\testallgroups{Quattro-LF}% {7} changed from Quattrocento- +\testallgroups{QuattroSans-LF}% {7} changed from QuattrocentoSans- +\testallgroups{XCharter-TLF}% {7} now 2 +\testallgroups{XCharter-TOsF}% {7} now 2 +\testallgroups{erewhon-LF}% {7} now 2 +\testallgroups{ComicNeue-TLF}% {7} +\testallgroups{ComicNeueAngular-TLF}%{7} +\testallgroups{Frm-LF}%{7} % the superiors are missing; name changed from Forum-LF +\testallgroups{Cochineal-TLF}% {8} now 5 +\testallgroups{AlgolRevived-TLF}%{9} +} +\typeout{^^J=====================================================================} +\typeout{| Enter font family to check (or <enter> for kernel defined families)} +\typeout{=====================================================================} +\typein[\FontFamilyToCheck]{} +\if!\FontFamilyToCheck! + \typeout{=====================================================================} + \typeout{| Detailed output? (default no)} + \typeout{=====================================================================} + \typein[\Details]{} + \if!\Details! + \def\typeoutdetails#1{} + \else + \let\typeoutdetails\typeout + \fi + \testallkerneldefinedfamilies +\else + \let\typeoutdetails\typeout + \testallgroups\FontFamilyToCheck +\fi +\stop + +\endinput +%% +%% End of file `checkencodingsubset.tex'. diff --git a/Master/texmf-dist/tex/latex/base/cp1250.def b/Master/texmf-dist/tex/latex/base/cp1250.def index ed155f74097..a4dfaed86d7 100644 --- a/Master/texmf-dist/tex/latex/base/cp1250.def +++ b/Master/texmf-dist/tex/latex/base/cp1250.def @@ -43,7 +43,7 @@ %% extension .ins) which are part of the distribution. \ProvidesFile{cp1250.def} - [2021/02/14 v1.3d Input encoding file] + [2024/02/08 v1.3d Input encoding file] \ProvideTextCommandDefault{\textdegree}{\ensuremath{{^\circ}}} \ProvideTextCommandDefault{\textcurrency} {\TextSymbolUnavailable\textcurrency} diff --git a/Master/texmf-dist/tex/latex/base/cp1252.def b/Master/texmf-dist/tex/latex/base/cp1252.def index 970c3a6f47f..ae5a89e75cc 100644 --- a/Master/texmf-dist/tex/latex/base/cp1252.def +++ b/Master/texmf-dist/tex/latex/base/cp1252.def @@ -43,7 +43,7 @@ %% extension .ins) which are part of the distribution. \ProvidesFile{cp1252.def} - [2021/02/14 v1.3d Input encoding file] + [2024/02/08 v1.3d Input encoding file] \ProvideTextCommandDefault{\textdegree}{\ensuremath{{^\circ}}} \ProvideTextCommandDefault{\textonehalf}{\ensuremath{\frac12}} \ProvideTextCommandDefault{\textonequarter}{\ensuremath{\frac14}} diff --git a/Master/texmf-dist/tex/latex/base/cp1257.def b/Master/texmf-dist/tex/latex/base/cp1257.def index 3b3575fb9e8..78fdbcbdf76 100644 --- a/Master/texmf-dist/tex/latex/base/cp1257.def +++ b/Master/texmf-dist/tex/latex/base/cp1257.def @@ -43,7 +43,7 @@ %% extension .ins) which are part of the distribution. \ProvidesFile{cp1257.def} - [2021/02/14 v1.3d Input encoding file] + [2024/02/08 v1.3d Input encoding file] \ProvideTextCommandDefault{\textdegree}{\ensuremath{{^\circ}}} \ProvideTextCommandDefault{\textonehalf}{\ensuremath{\frac12}} \ProvideTextCommandDefault{\textonequarter}{\ensuremath{\frac14}} diff --git a/Master/texmf-dist/tex/latex/base/cp437.def b/Master/texmf-dist/tex/latex/base/cp437.def index cdbe6aa24a2..17a2a2e7784 100644 --- a/Master/texmf-dist/tex/latex/base/cp437.def +++ b/Master/texmf-dist/tex/latex/base/cp437.def @@ -43,7 +43,7 @@ %% extension .ins) which are part of the distribution. \ProvidesFile{cp437.def} - [2021/02/14 v1.3d Input encoding file] + [2024/02/08 v1.3d Input encoding file] \ProvideTextCommandDefault{\textdegree}{\ensuremath{{^\circ}}} \ProvideTextCommandDefault{\textflorin}{\textit{f}} \ProvideTextCommandDefault{\textpeseta}{Pt} diff --git a/Master/texmf-dist/tex/latex/base/cp437de.def b/Master/texmf-dist/tex/latex/base/cp437de.def index 488e06030a8..edaccf6a2f4 100644 --- a/Master/texmf-dist/tex/latex/base/cp437de.def +++ b/Master/texmf-dist/tex/latex/base/cp437de.def @@ -43,7 +43,7 @@ %% extension .ins) which are part of the distribution. \ProvidesFile{cp437de.def} - [2021/02/14 v1.3d Input encoding file] + [2024/02/08 v1.3d Input encoding file] \ProvideTextCommandDefault{\textdegree}{\ensuremath{{^\circ}}} \ProvideTextCommandDefault{\textflorin}{\textit{f}} \ProvideTextCommandDefault{\textpeseta}{Pt} diff --git a/Master/texmf-dist/tex/latex/base/cp850.def b/Master/texmf-dist/tex/latex/base/cp850.def index 51cc234105e..40f3cb6eea9 100644 --- a/Master/texmf-dist/tex/latex/base/cp850.def +++ b/Master/texmf-dist/tex/latex/base/cp850.def @@ -43,7 +43,7 @@ %% extension .ins) which are part of the distribution. \ProvidesFile{cp850.def} - [2021/02/14 v1.3d Input encoding file] + [2024/02/08 v1.3d Input encoding file] %% %% If you need a Euro symbol, try cp858 instead. %% diff --git a/Master/texmf-dist/tex/latex/base/cp852.def b/Master/texmf-dist/tex/latex/base/cp852.def index 8e677f1ea39..0fc6c20a561 100644 --- a/Master/texmf-dist/tex/latex/base/cp852.def +++ b/Master/texmf-dist/tex/latex/base/cp852.def @@ -43,7 +43,7 @@ %% extension .ins) which are part of the distribution. \ProvidesFile{cp852.def} - [2021/02/14 v1.3d Input encoding file] + [2024/02/08 v1.3d Input encoding file] \ProvideTextCommandDefault{\textdegree}{\ensuremath{{^\circ}}} \ProvideTextCommandDefault{\textonehalf}{\ensuremath{\frac12}} \ProvideTextCommandDefault{\textonequarter}{\ensuremath{\frac14}} diff --git a/Master/texmf-dist/tex/latex/base/cp858.def b/Master/texmf-dist/tex/latex/base/cp858.def index e04cd77c2fd..5760e667642 100644 --- a/Master/texmf-dist/tex/latex/base/cp858.def +++ b/Master/texmf-dist/tex/latex/base/cp858.def @@ -43,7 +43,7 @@ %% extension .ins) which are part of the distribution. \ProvidesFile{cp858.def} - [2021/02/14 v1.3d Input encoding file] + [2024/02/08 v1.3d Input encoding file] \ProvideTextCommandDefault{\textdegree}{\ensuremath{{^\circ}}} \ProvideTextCommandDefault{\textonehalf}{\ensuremath{\frac12}} \ProvideTextCommandDefault{\textonequarter}{\ensuremath{\frac14}} diff --git a/Master/texmf-dist/tex/latex/base/cp865.def b/Master/texmf-dist/tex/latex/base/cp865.def index 97073d5503a..dc86f46bde3 100644 --- a/Master/texmf-dist/tex/latex/base/cp865.def +++ b/Master/texmf-dist/tex/latex/base/cp865.def @@ -43,7 +43,7 @@ %% extension .ins) which are part of the distribution. \ProvidesFile{cp865.def} - [2021/02/14 v1.3d Input encoding file] + [2024/02/08 v1.3d Input encoding file] \ProvideTextCommandDefault{\textdegree}{\ensuremath{{^\circ}}} \ProvideTextCommandDefault{\textflorin}{\textit{f}} \ProvideTextCommandDefault{\textpeseta}{Pt} diff --git a/Master/texmf-dist/tex/latex/base/decmulti.def b/Master/texmf-dist/tex/latex/base/decmulti.def index 4611a96d330..ae98cc99728 100644 --- a/Master/texmf-dist/tex/latex/base/decmulti.def +++ b/Master/texmf-dist/tex/latex/base/decmulti.def @@ -43,7 +43,7 @@ %% extension .ins) which are part of the distribution. \ProvidesFile{decmulti.def} - [2021/02/14 v1.3d Input encoding file] + [2024/02/08 v1.3d Input encoding file] \ProvideTextCommandDefault{\textdegree}{\ensuremath{{^\circ}}} \ProvideTextCommandDefault{\textonehalf}{\ensuremath{\frac12}} \ProvideTextCommandDefault{\textonequarter}{\ensuremath{\frac14}} diff --git a/Master/texmf-dist/tex/latex/base/doc.sty b/Master/texmf-dist/tex/latex/base/doc.sty index 2fc93c11646..ea693f4ff1d 100644 --- a/Master/texmf-dist/tex/latex/base/doc.sty +++ b/Master/texmf-dist/tex/latex/base/doc.sty @@ -43,9 +43,8 @@ %% extension .ins) which are part of the distribution. \NeedsTeXFormat{LaTeX2e}[1994/12/01] -\providecommand\DeclareRelease[3]{} -\providecommand\DeclareCurrentRelease[2]{} - +\DeclareRelease{}{1994-06-01} + {doc-2016-02-15.sty} \DeclareRelease{v2.1g}{2016-02-15} {doc-2016-02-15.sty} \DeclareRelease{v2}{2021-06-01} @@ -53,11 +52,11 @@ \DeclareCurrentRelease{v3}{2022-06-01} \ProvidesPackage{doc} - [2022/11/13 v3.0m + [2024/04/26 v3.0p Standard LaTeX documentation package V3 (FMi)] %% %% Package `doc' to use with LaTeX 2e -%% Copyright (C) 1989-2022 Frank Mittelbach, all rights reserved. +%% Copyright (C) 1989-2023 Frank Mittelbach, all rights reserved. @@ -119,7 +118,7 @@ \blank@linetrue\@@par \penalty\interlinepenalty} \obeylines - \let\do\do@noligs \verbatim@nolig@list + \@noligs \let\do\@makeother \dospecials \global\@newlistfalse \global\@minipagefalse @@ -1140,6 +1139,10 @@ Maybe you wanted to use '\string\NewDocElement'?}% } +\def\doc@ignoredinfo#1#2{% + \PackageInfo{doc}{Doc element '#1/#2' declaration + ignored}% +} \newcommand\NewDocElement[3][]{% \@ifundefined{Print#2Name}% {\@ifundefined{PrintDescribe#2}% @@ -1152,6 +1155,18 @@ }\doc@declareerror {#2}{#3}% } +\newcommand\ProvideDocElement[3][]{% + \@ifundefined{Print#2Name}% + {\@ifundefined{PrintDescribe#2}% + {\@ifundefined{#3}% + {\@ifundefined{end#3}% + {\@NewDocElement{#1}}% + \doc@ignoredinfo + }\doc@ignoredinfo + }\doc@ignoredinfo + }\doc@ignoredinfo + {#2}{#3}% +} \newcommand\RenewDocElement[3][]{% \@ifundefined{Print#2Name}\doc@notdeclarederror {\@ifundefined{PrintDescribe#2}\doc@notdeclarederror diff --git a/Master/texmf-dist/tex/latex/base/docstrip.tex b/Master/texmf-dist/tex/latex/base/docstrip.tex index f1f2648933b..e96e04ef127 100644 --- a/Master/texmf-dist/tex/latex/base/docstrip.tex +++ b/Master/texmf-dist/tex/latex/base/docstrip.tex @@ -46,7 +46,7 @@ \def\filename{docstrip.dtx} \def\fileversion{v2.6b} \def\filedate{2022-09-03} -\def\docdate {2023-10-10} +\def\docdate {2024-02-08} %% %% The docstrip program for use with TeX. %% Copyright (C) 1989-1991 Frank Mittelbach diff --git a/Master/texmf-dist/tex/latex/base/fontenc.sty b/Master/texmf-dist/tex/latex/base/fontenc.sty index 967d60869b2..0eb19b6f6a0 100644 --- a/Master/texmf-dist/tex/latex/base/fontenc.sty +++ b/Master/texmf-dist/tex/latex/base/fontenc.sty @@ -90,7 +90,11 @@ {}{\PackageError{fontenc}% {Encoding file `\reserved@f' not found.% \MessageBreak - You might have misspelt the name of the encoding}% + You might have misspelled the name of the encoding + \MessageBreak + or a required support package (e.g., cyrillic) is + \MessageBreak + missing in your installation}% {Necessary code for this encoding was not loaded.\MessageBreak Thus calling the encoding later on will diff --git a/Master/texmf-dist/tex/latex/base/fontmath.cfg b/Master/texmf-dist/tex/latex/base/fontmath.cfg index 97eb5d1b095..eca079d15b3 100644 --- a/Master/texmf-dist/tex/latex/base/fontmath.cfg +++ b/Master/texmf-dist/tex/latex/base/fontmath.cfg @@ -35,11 +35,11 @@ %% the system are in the document `cfgguide.tex'. %% %% -%%% From File: fontdef.dtx +%%% From File: fontdef.dtx \ProvidesFile{fontmath.cfg} - [2021/01/15 v3.0i LaTeX Kernel -(Uncustomized math - font setup)] + [2024/02/09 v3.0i LaTeX Kernel + (Uncustomized math font setup) +] %% %% %% diff --git a/Master/texmf-dist/tex/latex/base/fontmath.ltx b/Master/texmf-dist/tex/latex/base/fontmath.ltx index 9566229fa0c..a7dd9cc44ad 100644 --- a/Master/texmf-dist/tex/latex/base/fontmath.ltx +++ b/Master/texmf-dist/tex/latex/base/fontmath.ltx @@ -35,11 +35,11 @@ %% the system are in the document `cfgguide.tex'. %% %% -%%% From File: fontdef.dtx +%%% From File: fontdef.dtx \ProvidesFile{fontmath.ltx} - [2021/01/15 v3.0i LaTeX Kernel -(Math - font setup)] + [2024/02/09 v3.0i LaTeX Kernel + (Math font setup) +] \typeout{=== Don't modify this file, use a .cfg file instead ===^^J} \DeclareFontEncoding{OML}{}{} \DeclareFontEncoding{OMS}{}{} diff --git a/Master/texmf-dist/tex/latex/base/fonttext.cfg b/Master/texmf-dist/tex/latex/base/fonttext.cfg index 762ec16b6a0..b37c4407d63 100644 --- a/Master/texmf-dist/tex/latex/base/fonttext.cfg +++ b/Master/texmf-dist/tex/latex/base/fonttext.cfg @@ -35,11 +35,11 @@ %% the system are in the document `cfgguide.tex'. %% %% -%%% From File: fontdef.dtx +%%% From File: fontdef.dtx \ProvidesFile{fonttext.cfg} - [2021/01/15 v3.0i LaTeX Kernel -(Uncustomized text - font setup)] + [2024/02/09 v3.0i LaTeX Kernel + (Uncustomized text font setup) +] %% %% %% diff --git a/Master/texmf-dist/tex/latex/base/fonttext.ltx b/Master/texmf-dist/tex/latex/base/fonttext.ltx index 0dfc76fff84..ec6ce8ed910 100644 --- a/Master/texmf-dist/tex/latex/base/fonttext.ltx +++ b/Master/texmf-dist/tex/latex/base/fonttext.ltx @@ -35,11 +35,11 @@ %% the system are in the document `cfgguide.tex'. %% %% -%%% From File: fontdef.dtx +%%% From File: fontdef.dtx \ProvidesFile{fonttext.ltx} - [2021/01/15 v3.0i LaTeX Kernel -(Text - font setup)] + [2024/02/09 v3.0i LaTeX Kernel + (Text font setup) +] \typeout{=== Don't modify this file, use a .cfg file instead ===^^J} \input {omlenc.def} \input {omsenc.def} diff --git a/Master/texmf-dist/tex/latex/base/ifthen.sty b/Master/texmf-dist/tex/latex/base/ifthen.sty index b093138e992..780b457e3f0 100644 --- a/Master/texmf-dist/tex/latex/base/ifthen.sty +++ b/Master/texmf-dist/tex/latex/base/ifthen.sty @@ -44,12 +44,12 @@ %% %% File `ifthen.dtx'. %% Copyright (C) 1991 by Leslie Lamport -%% Copyright (C) 1994-2001 LaTeX project, David Carlisle +%% Copyright (C) 1994-2024 LaTeX project, David Carlisle %% all rights reserved. %% \NeedsTeXFormat{LaTeX2e}[1994/12/01] \ProvidesPackage{ifthen} - [2022/04/13 v1.1d Standard LaTeX ifthen package (DPC)] + [2024/03/16 v1.1e Standard LaTeX ifthen package (DPC)] \def\TE@throw{\@ne=\@ne\noexpand\fi} \def\boolean#1#2{% \TE@throw\expandafter\noexpand\csname if#1\endcsname#2} @@ -77,11 +77,24 @@ \let\ref\@kernel@ref@exp}} {\def\TE@ref@exp{\def\@setref##1##2##3{% \ifx##1\relax\z@\else\expandafter##2##1\fi}}} +\begingroup +\lccode`\~`\> % +\catcode`\+\active +\lccode`\+`\< % +\catcode`\!\active +\lccode`\!`\= % +\lowercase{\endgroup +\def\TE@repl@active{% + \TE@repl~>% + \TE@repl+<% + \TE@repl!=% +} \long\def\ifthenelse#1{% \toks@{#1}% \TE@repl\or\TE@or \TE@repl\and\TE@and \TE@repl\not\TE@neg + \TE@repl@active \TE@repl\OR\TE@or \TE@repl\AND\TE@and \TE@repl\NOT\TE@neg @@ -101,7 +114,8 @@ \expandafter\@firstoftwo \else \expandafter\@secondoftwo - \fi} + \fi}% +} \def\TE@eval{\noexpand\TE@negatefalse\noexpand\iftrue\noexpand\ifnum} \newif\ifTE@val \newif\ifTE@negate diff --git a/Master/texmf-dist/tex/latex/base/inputenc.sty b/Master/texmf-dist/tex/latex/base/inputenc.sty index 14d7f35db8b..8d4a01b46d2 100644 --- a/Master/texmf-dist/tex/latex/base/inputenc.sty +++ b/Master/texmf-dist/tex/latex/base/inputenc.sty @@ -44,7 +44,7 @@ \NeedsTeXFormat{LaTeX2e}[1995/12/01] \ProvidesPackage{inputenc} - [2021/02/14 v1.3d Input encoding file] + [2024/02/08 v1.3d Input encoding file] \def\DeclareInputMath#1{% \@inpenc@test \bgroup diff --git a/Master/texmf-dist/tex/latex/base/latex.ltx b/Master/texmf-dist/tex/latex/base/latex.ltx index a2f5b66b067..11b32e404fc 100644 --- a/Master/texmf-dist/tex/latex/base/latex.ltx +++ b/Master/texmf-dist/tex/latex/base/latex.ltx @@ -14,6 +14,7 @@ %% lthooks.dtx (with options: `2ekernel') %% ltcmdhooks.dtx (with options: `2ekernel') %% ltsockets.dtx (with options: `2ekernel') +%% lttemplates.dtx (with options: `2ekernel') %% ltalloc.dtx (with options: `2ekernel') %% ltcntrl.dtx (with options: `2ekernel') %% lterror.dtx (with options: `2ekernel') @@ -54,6 +55,7 @@ %% ltfilehook.dtx (with options: `2ekernel') %% ltshipout.dtx (with options: `2ekernel') %% ltoutput.dtx (with options: `2ekernel') +%% lttagging.dtx (with options: `2ekernel') %% ltfinal.dtx (with options: `2ekernel') %% %% This is a generated file. @@ -693,7 +695,7 @@ \tracinggroups\z@ \tracingparagraphs\z@ \tracingmacros\z@ - \tracinglostchars\@ne + \tracinglostchars\tw@ \tracingpages\z@ \tracingstats\z@ }% @@ -707,8 +709,8 @@ %%% From File: ltvers.dtx \def\fmtname{LaTeX2e} \edef\fmtversion - {2023-11-01} -\def\patch@level{1} + {2024-06-01} +\def\patch@level{0} \edef\development@branch@name{} \iffalse \def\reserved@a#1/#2/#3\@nil{% @@ -1158,7 +1160,10 @@ \cs_gset_eq:NN \@expl@cs@to@str@@N \cs_to_str:N \cs_gset_eq:NN \@expl@str@if@eq@@nnTF \str_if_eq:nnTF \cs_gset_eq:NN \@expl@cs@prefix@spec@@N \cs_prefix_spec:N -\cs_gset_eq:NN \@expl@cs@argument@spec@@N \cs_argument_spec:N +\cs_if_exist:NTF \cs_parameter_spec:N + { \cs_gset_eq:NN \@expl@cs@parameter@spec@@N \cs_parameter_spec:N } + { \cs_gset_eq:NN \@expl@cs@parameter@spec@@N \cs_argument_spec:N } +\cs_gset_eq:NN \__kernel_cs_parameter_spec:N \@expl@cs@parameter@spec@@N \cs_gset_eq:NN \@expl@cs@replacement@spec@@N \cs_replacement_spec:N \cs_gset_eq:NN \@expl@str@map@function@@NN \str_map_function:NN \cs_gset_eq:NN \@expl@char@generate@@nn \char_generate:nn @@ -1648,7 +1653,7 @@ \long\def\@show@newcommand@aux#1#2#3{% \typeout{> \string#1=\@expl@cs@prefix@spec@@N#1macro:}% #3{default \string##1=\expandafter\detokenize\@gobblethree#2.^^J% - \@expl@cs@argument@spec@@N#1->\@expl@cs@replacement@spec@@N#1}} + \@expl@cs@parameter@spec@@N#1->\@expl@cs@replacement@spec@@N#1}} \long\def\@show@tokens#1{% \edef\reserved@a{#1}% \showtokens\expandafter @@ -1679,7 +1684,7 @@ \@show@environment@end#1} \long\def\@show@environment@begin#1{% \typeout{> \string\begin{\@expl@cs@to@str@@N#1}=environment:}% - \typeout{\@expl@cs@argument@spec@@N#1->% + \typeout{\@expl@cs@parameter@spec@@N#1->% \@expl@cs@replacement@spec@@N#1.^^J}} \long\def\@show@normalenv#1{% \@show@environment@begin#1% @@ -1690,12 +1695,12 @@ \long\def\@show@environment@end@aux#1#2{% \@show@tokens{\string\end{\@expl@cs@to@str@@N#2}% \ifx\relax#1=undefined% - \else:^^J\@expl@cs@argument@spec@@N#1->% + \else:^^J\@expl@cs@parameter@spec@@N#1->% \@expl@cs@replacement@spec@@N#1% \fi}} \def\@show@nonstop#1{% \typeout{> \string#1=\@expl@cs@prefix@spec@@N#1macro:^^J% - \@expl@cs@argument@spec@@N#1->\@expl@cs@replacement@spec@@N#1.}} + \@expl@cs@parameter@spec@@N#1->\@expl@cs@replacement@spec@@N#1.}} \def\@show@typeout#1{\typeout{> #1.^^J}} \def\@ifundefined#1{% \ifcsname#1\endcsname\@ifundefin@d@i\else\@ifundefin@d@ii\fi{#1}} @@ -1806,8 +1811,8 @@ \xdef#1{\the\toks@}% \endgroup} %%% From File: ltcmd.dtx -\def\ltcmdversion{v1.2a} -\def\ltcmddate{2023-08-19} +\def\ltcmdversion{v1.2e} +\def\ltcmddate{2024-04-17} \message{document commands,} \ExplSyntaxOn \tl_new:N \l__cmd_arg_spec_tl @@ -1888,8 +1893,6 @@ \cs_new_protected:Npn \__cmd_declare_cmd_internal:Nnnn #1#2#3#4 { \tl_set:Nx \l__cmd_function_tl { \cs_to_str:N #1 } - \tl_set:Nx \l__cmd_fn_tl - { \exp_not:c { \l__cmd_function_tl \c_space_tl } } \__cmd_normalize_arg_spec:n {#2} \exp_args:No \__cmd_prepare_signature:n \l__cmd_arg_spec_tl \__cmd_declare_cmd_code:Nnn #1 {#2} {#3} @@ -1897,12 +1900,60 @@ \__cmd_break_point:n {#2} } \cs_new_eq:NN \__cmd_break_point:n \use_none:n -\cs_new_protected:Npn \__cmd_declare_cmd_code:Nnn +\cs_new:Npn \__cmd_all_m_check:n #1 + { \tl_map_function:nN {#1} \__cmd_all_m_check_aux:n } +\cs_new:Npn \__cmd_all_m_check_aux:n #1 { - \bool_if:NTF \l__cmd_grab_expandably_bool - { \__cmd_declare_cmd_code_expandable:Nnn } - { \__cmd_declare_cmd_code_aux:Nnn } + \str_if_eq:nnF {#1} { m } + { + \str_if_eq:nnF {#1} { + } + { X } + } + } +\cs_new_protected:Npn \__cmd_declare_cmd_code:Nnn #1#2 + { + \bool_lazy_any:nTF + { + { \l__cmd_environment_bool } + { + \bool_lazy_and_p:nn + { \l__cmd_some_short_bool } + { \l__cmd_some_long_bool } + } + { ! \tl_if_blank_p:e { \__cmd_all_m_check:n {#2} } } + } + { + \tl_set:Nx \l__cmd_fn_tl + { \exp_not:c { \l__cmd_function_tl \c_space_tl } } + \bool_if:NTF \l__cmd_grab_expandably_bool + { \__cmd_declare_cmd_code_expandable:Nnn } + { \__cmd_declare_cmd_code_aux:Nnn } + } + { \__cmd_declare_cmd_optimized:Nnn } + #1 {#2} } +\cs_new_protected:Npn \__cmd_declare_cmd_optimized:Nnn #1#2#3 + { + \bool_if:NTF \l__cmd_expandable_bool + { \cs_set_nopar:Npe } + { \cs_set_protected_nopar:Npe } + #1 + { + \exp_not:N \__cmd_start_optimized: + \exp_not:c { \l__cmd_function_tl \c_space_tl code } + } + \exp_args:Ncc \cs_generate_from_arg_count:NNnn + { \l__cmd_function_tl \c_space_tl code } + { + cs_set + \bool_if:NF \l__cmd_expandable_bool { _protected } + \bool_if:NF \l__cmd_some_long_bool { _nopar } + :Npn + } + \l__cmd_current_arg_int + {#3} + } +\cs_new:Npn \__cmd_start_optimized: { } \cs_new_protected:Npn \__cmd_declare_cmd_code_aux:Nnn #1#2#3 { \cs_generate_from_arg_count:cNnn @@ -2504,7 +2555,12 @@ \bool_if:NT \l__cmd_some_obey_spaces_bool { \msg_error:nnxx { cmd } { invalid-bang } - { \__cmd_environment_or_command: } { \tl_to_str:n {#1} } + { \__cmd_environment_or_command: } + { + \bool_if:NTF \l__cmd_obey_spaces_bool + { \tl_to_str:n {'#1'} } + { an~optional~argument~before~mandatory~ \tl_to_str:n {'#1'} } + } \__cmd_bad_def:wn } \tl_clear:N \l__cmd_last_delimiters_tl @@ -2826,9 +2882,10 @@ \use:x { \int_set:Nn \tex_escapechar:D { 92 } - \exp_not:N \__cmd_cmd_type_cases:NnnnnF \exp_not:N #2 + \exp_not:N \__cmd_cmd_type_cases:NnnnnnF \exp_not:N #2 { \__cmd_copy_command:nnNN } { \__cmd_copy_expandable:nnNN } + { \__cmd_copy_optimized:nnNN } { \__cmd_copy_environment:nnNN } { \__cmd_copy_environment_end:nnNN } { \__cmd_cant_copy:nwn { non-ltcmd } } @@ -2881,6 +2938,18 @@ #3 { \exp_after:wN \__cmd_copy_expandable:NnNNNNnnn #4 {#1} {#2} } } +\cs_new_protected:Npn \__cmd_copy_optimized:nnNN #1#2#3#4 + { + \cs_set_eq:cc { #1 ~ code } { #2 ~ code } + \token_if_protected_macro:NTF #4 + { \cs_set_protected_nopar:Npe } + { \cs_set_nopar:Npe } + #3 + { + \exp_not:N \__cmd_start_optimized: + \exp_not:c { #1 ~ code } + } + } \cs_new:Npn \__cmd_copy_expandable:NnNNNNnnn #1 #2 #3 #4 #5 #6 #7 #8 #9 { \exp_not:N #1 \exp_not:n { {#2} } @@ -3001,9 +3070,10 @@ \use:x { \int_set:Nn \tex_escapechar:D { 92 } - \exp_not:N \__cmd_cmd_type_cases:NnnnnF \exp_not:N #1 + \exp_not:N \__cmd_cmd_type_cases:NnnnnnF \exp_not:N #1 { \__cmd_show_command:N } { \__cmd_show_expandable:N } + { \__cmd_show_optimized:N } { \__cmd_show_environment:N } { \__cmd_show_environment_end:N } { \__cmd_cant_copy:nwn { non-ltcmd } } @@ -3037,6 +3107,43 @@ -> \cs_replacement_spec:N #4 } } +\cs_new_protected:Npn \__cmd_show_optimized:N #1 + { + \exp_args:Nc \__cmd_show_optimized:NN + { \cs_to_str:N #1 \c_space_tl code } + #1 + } +\cs_new_protected:Npn \__cmd_show_optimized:NN #1#2 + { + \cs_set:Npe \__cmd_show_optimized_aux:N ##1 + { + \c_space_tl \c_space_tl \c_hash_str ##1 : + \bool_lazy_or:nnT + { \token_if_long_macro_p:N #1 } + { \token_if_protected_long_macro_p:N #1 } + { + } m + \iow_newline: + } + \tl_show:e + { + \token_to_str:N #2 = + \bool_lazy_or:nnF + { \token_if_protected_macro_p:N #1 } + { \token_if_protected_long_macro_p:N #1 } + { expandable ~ } document~command: + \iow_newline: + \int_step_function:nN + { + \int_div_truncate:nn + { \tl_count:e { \cs_parameter_spec:N #1 } } + { 2 } + } + \__cmd_show_optimized_aux:N + -> + \cs_replacement_spec:N #1 + } + } +\cs_generate_variant:Nn \tl_count:n { e } \cs_new_protected:Npn \__cmd_show_environment:N #1 { \exp_after:wN \__cmd_show_environment:Nnnw #1 \q__cmd @@ -3604,7 +3711,12 @@ \tl_put_right:Nx \l__cmd_v_arg_tl { \token_if_active:NTF #1 - { \exp_not:N #1 } { \token_to_str:N #1 } + { \exp_not:N #1 } + { + \int_compare:nNnTF {`#1} = \tex_endlinechar:D + { \exp_not:N \obeyedline } + { \token_to_str:N #1 } + } } } \cs_new_protected:Npn \__cmd_grab_v_token_if_char:NTF #1 @@ -4075,30 +4187,31 @@ #1 {#2} {#4} \__cmd_tl_mapthread_loop:w #1#3 \q_mark } -\cs_new_protected:Npn \__cmd_cmd_type_cases:NnnnnF #1 #2 #3 #4 #5 #6 +\cs_new_protected:Npn \__cmd_cmd_type_cases:NnnnnnF #1 #2 #3 #4 #5 #6 #7 { \exp_args:Ne \str_case_e:nnF { - \exp_args:Nf \tl_if_empty:nT { \cs_argument_spec:N #1 } + \exp_args:Nf \tl_if_empty:nT { \__kernel_cs_parameter_spec:N #1 } { \exp_not:N \exp_not:n { \exp_not:e { \tl_head:N #1 } } } } { { \exp_not:N \__cmd_start:nNNnnn } {#2} { \exp_not:N \__cmd_start_expandable:nNNNNn } {#3} - { \exp_not:N \__cmd_start_env:nnnnn } {#4} + { \exp_not:N \__cmd_start_optimized: } {#4} + { \exp_not:N \__cmd_start_env:nnnnn } {#5} { \exp_after:wN \exp_not:N \cs:w environment~ \exp_last_unbraced:Ne \use_none:nnn { \cs_to_str:N #1 } ~end~aux \cs_end: - } {#5} + } {#6} } - {#6} + {#7} } \cs_new_protected:Npn \__kernel_cmd_if_xparse:NTF #1 { - \__cmd_cmd_type_cases:NnnnnF #1 - { } { } { } { } { \use_iii:nnn } + \__cmd_cmd_type_cases:NnnnnnF #1 + { } { } { } { } { } { \use_iii:nnn } \use_i:nn } \cs_new_protected:Npn \__cmd_peek_nonspace:NTF @@ -4154,10 +4267,8 @@ \bool_if:NTF \l__cmd_environment_bool { environment ~ ' \l__cmd_environment_str ' } { - command ~ ' - \exp_args:Nf \tl_trim_spaces:n - { \exp_after:wN \token_to_str:N \l__cmd_fn_tl } - ' + command ~ + ' \c_backslash_str \tl_to_str:N \l__cmd_function_tl ' } } \msg_new:nnnn { cmd } { arg-after-body } @@ -4249,7 +4360,7 @@ { Invalid~argument~prefix~'!'~in~#1. } { The~prefix~'!'~is~only~allowed~for~trailing~optional~arguments.~ - You~tried~to~apply~it~to~'#2'. + You~tried~to~apply~it~to~#2. \c__cmd_ignore_def_tl } \msg_new:nnnn { cmd } { not-definable } @@ -4539,8 +4650,6 @@ \ExplSyntaxOff %%% From File: lthooks.dtx -\def\lthooksversion{v1.1f} -\def\lthooksdate{2023/10/02} \ExplSyntaxOn \bool_new:N \g__hook_debug_bool \cs_new_eq:NN \__hook_debug:n \use_none:n @@ -4862,7 +4971,8 @@ \msg_error:nnnnn { hooks } { set-top-level } { for } { SetDefaultHookLabel } {#1} } - { \exp_args:Nx \__hook_set_default_label:n { \__hook_make_name:n {#1} } } + { \exp_args:Nx + \__hook_set_default_label:n { \__hook_make_name:n {#1} } } } \cs_new_protected:Npn \__hook_set_default_label:n #1 { @@ -4996,7 +5106,8 @@ \__hook_gput_next_do:nn {#1} } -\prg_new_protected_conditional:Npnn \__hook_try_declaring_generic_hook:wn +\prg_new_protected_conditional:Npnn + \__hook_try_declaring_generic_hook:wn #1 / #2 / #3 / #4 \scan_stop: #5 { TF } { \__hook_if_generic:nTF {#5} @@ -5082,7 +5193,8 @@ \str_if_eq:nnTF {#2} { top-level } { \__hook_toplevel_gset:nn {#1} { } } { - \prop_gpop:cnNF { g__hook_#1_code_prop } {#2} \l__hook_return_tl + \prop_gpop:cnNF { g__hook_#1_code_prop } + {#2} \l__hook_return_tl { \msg_warning:nnnn { hooks } { cannot-remove } {#1} {#2} } } } @@ -5093,7 +5205,8 @@ \__hook_if_deprecated_generic:nTF {#1} { \__hook_deprecated_generic_warn:n {#1} - \__hook_do_deprecated_generic:Nn \__hook_gremove_code:nn {#1} {#2} + \__hook_do_deprecated_generic:Nn + \__hook_gremove_code:nn {#1} {#2} } { \msg_warning:nnnn { hooks } { cannot-remove } {#1} {#2} } } @@ -5111,7 +5224,8 @@ {#1} {#2} } \cs_new_protected:Npn \__hook_cs_gput_right_fast:nnn #1 #2 #3 - { \cs_gset:cpx { __hook#1~#2 } { \exp_not:v { __hook#1~#2 } \exp_not:n {#3} } } + { \cs_gset:cpx { __hook#1~#2 } + { \exp_not:v { __hook#1~#2 } \exp_not:n {#3} } } \cs_new_protected:Npn \__hook_cs_gput_right_slow:nnn #1 #2 #3 { \cs_if_exist:cF { __hook#1~#2 } @@ -5195,7 +5309,8 @@ } \exp_last_unbraced:NNf \cs_set:Npn \__hook_tmp:w { \__hook_parameter:n {#1} } { } - \tl_set:Ne \l__hook_tmpa_tl { \__hook_braced_cs_parameter:n { __hook_tmp:w } } + \tl_set:Ne \l__hook_tmpa_tl + { \__hook_braced_cs_parameter:n { __hook_tmp:w } } \cs_gset_protected:Npx \__hook_normalise_fn:nn ##1 ##2 { \group_begin: @@ -5333,27 +5448,34 @@ } \cs_new_protected:Npn \__hook_rule_before_gset:nnn #1#2#3 { - \__hook_tl_gset:cx { g__hook_#1_rule_ \__hook_label_pair:nn {#2} {#3} _tl } + \__hook_tl_gset:cx + { g__hook_#1_rule_ \__hook_label_pair:nn {#2} {#3} _tl } { \__hook_label_ordered:nnTF {#2} {#3} { < } { > } } } \cs_new_eq:cN { __hook_rule_<_gset:nnn } \__hook_rule_before_gset:nnn \cs_new_protected:Npn \__hook_rule_after_gset:nnn #1#2#3 { - \__hook_tl_gset:cx { g__hook_#1_rule_ \__hook_label_pair:nn {#3} {#2} _tl } + \__hook_tl_gset:cx + { g__hook_#1_rule_ \__hook_label_pair:nn {#3} {#2} _tl } { \__hook_label_ordered:nnTF {#3} {#2} { < } { > } } } \cs_new_eq:cN { __hook_rule_>_gset:nnn } \__hook_rule_after_gset:nnn \cs_new_protected:Npn \__hook_rule_voids_gset:nnn #1#2#3 { - \__hook_tl_gset:cx { g__hook_#1_rule_ \__hook_label_pair:nn {#2} {#3} _tl } + \__hook_tl_gset:cx + { g__hook_#1_rule_ \__hook_label_pair:nn {#2} {#3} _tl } { \__hook_label_ordered:nnTF {#2} {#3} { -> } { <- } } } \cs_new_protected:cpn { __hook_rule_incompatible-error_gset:nnn } #1#2#3 - { \__hook_tl_gset:cn { g__hook_#1_rule_ \__hook_label_pair:nn {#2} {#3} _tl } - { xE } } + { \__hook_tl_gset:cn + { g__hook_#1_rule_ \__hook_label_pair:nn {#2} {#3} _tl } + { xE } + } \cs_new_protected:cpn { __hook_rule_incompatible-warning_gset:nnn } #1#2#3 - { \__hook_tl_gset:cn { g__hook_#1_rule_ \__hook_label_pair:nn {#2} {#3} _tl } - { xW } } + { \__hook_tl_gset:cn + { g__hook_#1_rule_ \__hook_label_pair:nn {#2} {#3} _tl } + { xW } + } \cs_new_protected:Npn \__hook_rule_unrelated_gset:nnn #1#2#3 { } \cs_new_protected:Npn \__hook_rule_gclear:nnn #1#2#3 { \cs_undefine:c { g__hook_#1_rule_ \__hook_label_pair:nn {#2} {#3} _tl } } @@ -5415,8 +5537,10 @@ { \__hook_code_gset:ne {#1} { - \exp_not:c { __hook_toplevel~#1 } \__hook_braced_parameter:n {#1} - \exp_not:c { __hook_next~#1 } \__hook_braced_parameter:n {#1} + \exp_not:c { __hook_toplevel~#1 } + \__hook_braced_parameter:n {#1} + \exp_not:c { __hook_next~#1 } + \__hook_braced_parameter:n {#1} } } { @@ -5493,7 +5617,8 @@ \int_compare:nNnT { \cs:w \__hook_tl_csname:n {##1} \cs_end: } = 0 { - \tl_set:cn { \__hook_tl_csname:n { \l__hook_rear_tl } } {##1} + \tl_set:cn + { \__hook_tl_csname:n { \l__hook_rear_tl } } {##1} \tl_set:Nn \l__hook_rear_tl {##1} } } @@ -5648,7 +5773,7 @@ hook~'#1' \__hook_if_disabled:nF {#1} { - \exp_args:Nf \__hook_print_args:nn {#1} + \exp_args:Nne \__hook_print_args:nn {#1} { \int_eval:n { \str_count:e { \__hook_parameter:n {#1} } / 3 } @@ -5883,19 +6008,22 @@ \cs_new_protected:Npn \hook_use_once:n #1 { \__hook_if_execute_immediately:nF {#1} - { \__hook_normalize_hook_args:Nn \__hook_use_once:nn { \use:n {#1} } { 0 } } + { \__hook_normalize_hook_args:Nn \__hook_use_once:nn + { \use:n {#1} } { 0 } } } \cs_new_protected:Npn \hook_use_once:nnw #1 #2 { \__hook_if_execute_immediately:nF {#1} - { \__hook_normalize_hook_args:Nn \__hook_use_once:nn { \use:n {#1} } {#2} } + { \__hook_normalize_hook_args:Nn \__hook_use_once:nn + { \use:n {#1} } {#2} } } \cs_new_protected:Npn \__hook_use_once:nn #1 #2 { \__hook_preamble_hook:n {#1} \__hook_use_once_set:n {#1} \__hook_replacing_args_false: - \__hook_cs_gput_right:nnn { _next } {#1} { \__hook_use_once_clear:n {#1} } + \__hook_cs_gput_right:nnn { _next } {#1} + { \__hook_use_once_clear:n {#1} } \__hook_replacing_args_reset: \__hook_if_usable:nTF {#1} { \__hook_use_initialized:n {#1} } @@ -6083,7 +6211,8 @@ { Cannot~add~code~to~disabled~hook~'#1'. } { The~hook~'#1'~you~tried~to~add~code~to~was~previously~disabled~ - with~\iow_char:N\\hook_disable_generic:n~or~\iow_char:N\\DisableGenericHook,~so~ + with~\iow_char:N\\hook_disable_generic:n~or~ + \iow_char:N\\DisableGenericHook,~so~ it~cannot~have~code~added~to~it. } \msg_new:nnn { hooks } { empty-label } @@ -6306,12 +6435,10 @@ \__hook_curr_name_pop: \ExplSyntaxOff %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% File: ltcmdhooks.dtx +%% From File: ltcmdhooks.dtx %% Copyright (C) 2020-2024 %% Frank Mittelbach, Phelype Oleinik, The LaTeX Project -%%% From File: ltcmdhooks.dtx -\def\ltcmdhooksversion{v1.0i} -\def\ltcmdhooksdate{2023/06/16} +%%% From File: lthooks.dtx \ExplSyntaxOn \tl_new:N \g_hook_patch_action_list_tl \int_new:N \l__hook_patch_num_args_int @@ -6449,7 +6576,7 @@ \__hook_patch_debug:x { ++~command~can~be~patched~without~rescanning } \int_set:Nn \l__hook_patch_num_args_int { - \exp_args:Nf \str_count:n { \cs_argument_spec:N #2 } / 2 + \exp_args:Nf \str_count:n { \__kernel_cs_parameter_spec:N #2 } / 2 \bool_if:NT #1 { -1 } } \int_compare:nNnTF { \l__hook_patch_num_args_int } > { \c_zero_int } @@ -6589,7 +6716,7 @@ { ~ \__hook_double_hashes:w } \cs_new_protected:Npn \__hook_retokenize_patch:Nnn #1 #2 #3 { - \str_if_eq:eeTF { \cs_argument_spec:N #1 } { } + \str_if_eq:eeTF { \__kernel_cs_parameter_spec:N #1 } { } { \__hook_patch_expand_redefine:NNnn \c_false_bool #1 {#2} {#3} } { \__hook_patch_debug:x { ..~command~can~only~be~patched~by~rescanning } @@ -6752,8 +6879,6 @@ \ExplSyntaxOff %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% From File: ltsockets.dtx -\def\ltsocketsversion{0.9a} -\def\ltsocketsdate{2023-08-21} \ExplSyntaxOn \bool_new:N \g__socket_debug_bool \cs_new_eq:NN \__socket_debug:n \use_none:n @@ -6926,6 +7051,1187 @@ \cs_new_eq:NN \DebugSocketsOff \socket_debug_off: \ExplSyntaxOff %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% From File: lttemplates.dtx +\message{templates,} +\ExplSyntaxOn +\tl_const:Nn \c__template_code_root_tl { template~code~>~ } +\tl_const:Nn \c__template_defaults_root_tl { template~defaults~>~ } +\tl_const:Nn \c__template_instances_root_tl { template~instance~>~ } +\tl_const:Nn \c__template_keytypes_root_tl { template~key~types~>~ } +\tl_const:Nn \c__template_key_order_root_tl { template~key~order~>~ } +\tl_const:Nn \c__template_values_root_tl { template~values~>~ } +\tl_const:Nn \c__template_vars_root_tl { template~vars~>~ } +\seq_const_from_clist:Nn \c__template_keytypes_arg_seq + { choice , function , instance } +\prop_new:N \g__template_type_prop +\tl_new:N \l__template_assignments_tl +\tl_new:N \l__template_default_tl +\bool_new:N \l__template_error_bool +\bool_new:N \l__template_global_bool +\tl_new:N \l__template_key_name_tl +\tl_new:N \l__template_keytype_tl +\tl_new:N \l__template_keytype_arg_tl +\tl_new:N \l__template_value_tl +\tl_new:N \l__template_var_tl +\prop_new:N \l__template_keytypes_prop +\seq_new:N \l__template_key_order_seq +\prop_new:N \l__template_values_prop +\prop_new:N \l__template_vars_prop +\clist_new:N \l__template_tmp_clist +\dim_new:N \l__template_tmp_dim +\int_new:N \l__template_tmp_int +\muskip_new:N \l__template_tmp_muskip +\skip_new:N \l__template_tmp_skip +\tl_new:N \l__template_tmp_tl +\scan_new:N \s__template_mark +\scan_new:N \s__template_stop +\quark_new:N \q__template_nil +\__kernel_quark_new_conditional:Nn \__template_quark_if_nil:N { F } +\cs_new_protected:Npn \__template_execute_if_arg_agree:nnT #1#2#3 + { + \prop_get:NnN \g__template_type_prop {#1} \l__template_tmp_tl + \int_compare:nNnTF {#2} = \l__template_tmp_tl + {#3} + { + \msg_error:nneee { template } { argument-number-mismatch } + {#1} { \l__template_tmp_tl } {#2} + } + } +\cs_new_protected:Npn \__template_execute_if_code_exist:nnT #1#2#3 + { + \cs_if_exist:cTF { \c__template_code_root_tl #1 / #2 } + {#3} + { \msg_error:nnnn { template } { no-template-code } {#1} {#2} } + } +\cs_new_protected:Npn \__template_execute_if_keytype_exist:nT #1#2 + { + \cs_if_exist:cTF { __template_store_value_ #1 :n } + {#2} + { \msg_error:nnn { template } { unknown-keytype } {#1} } + } +\cs_generate_variant:Nn \__template_execute_if_keytype_exist:nT { V } +\cs_new_protected:Npn \__template_execute_if_type_exist:nT #1#2 + { + \prop_if_in:NnTF \g__template_type_prop {#1} + {#2} + { \msg_error:nnn { template } { unknown-type } {#1} } + } +\cs_new_protected:Npn \__template_if_keys_exist:nnT #1#2#3 + { + \cs_if_exist:cTF { \c__template_keytypes_root_tl #1 / #2 } + {#3} + { \msg_error:nnnn { template } { unknown-template } {#1} {#2} } + } +\prg_new_conditional:Npnn \__template_if_key_value:n #1 { T , F , TF } + { + \str_if_eq:noTF { \KeyValue } { \tl_head:w #1 \q_nil \q_stop } + \prg_return_true: + \prg_return_false: + } +\prg_generate_conditional_variant:Nnn \__template_if_key_value:n { V } { T , F , TF } +\prg_new_conditional:Npnn \__template_if_instance_exist:nn #1#2 { T, F, TF } + { + \cs_if_exist:cTF { \c__template_instances_root_tl #1 / #2 } + \prg_return_true: + \prg_return_false: + } +\prg_new_conditional:Npnn \__template_if_use_template:n #1 { TF } + { + \str_if_eq:noTF { \UseTemplate } { \tl_head:w #1 \q_nil \q_stop } + \prg_return_true: + \prg_return_false: +} +\cs_new_protected:Npn \__template_store_defaults:nn #1#2 + { + \debug_suspend: + \prop_gclear_new:c { \c__template_defaults_root_tl #1 / #2 } + \prop_gset_eq:cN { \c__template_defaults_root_tl #1 / #2 } + \l__template_values_prop + \debug_resume: + } +\cs_new_protected:Npn \__template_store_keytypes:nn #1#2 + { + \debug_suspend: + \prop_if_exist:cTF { \c__template_keytypes_root_tl #1 / #2 } + { + \msg_info:nnnn { template } { declare-template-interface } {#1} {#2} + \prop_gclear:c { \c__template_keytypes_root_tl #1 / #2 } + } + { \prop_new:c { \c__template_keytypes_root_tl #1 / #2 } } + \prop_gset_eq:cN { \c__template_keytypes_root_tl #1 / #2 } + \l__template_keytypes_prop + \seq_gclear_new:c { \c__template_key_order_root_tl #1 / #2 } + \seq_gset_eq:cN { \c__template_key_order_root_tl #1 / #2 } + \l__template_key_order_seq + \debug_resume: + } +\cs_new_protected:Npn \__template_store_values:nn #1#2 + { + \debug_suspend: + \prop_clear_new:c { \c__template_values_root_tl #1 / #2 } + \prop_set_eq:cN { \c__template_values_root_tl #1 / #2 } + \l__template_values_prop + \debug_resume: + } +\cs_new_protected:Npn \__template_store_vars:nn #1#2 + { + \debug_suspend: + \prop_gclear_new:c { \c__template_vars_root_tl #1 / #2 } + \prop_gset_eq:cN { \c__template_vars_root_tl #1 / #2 } + \l__template_vars_prop + \debug_resume: + } +\cs_new_protected:Npn \__template_recover_defaults:nn #1#2 + { + \prop_if_exist:cTF + { \c__template_defaults_root_tl #1 / #2 } + { + \prop_set_eq:Nc \l__template_values_prop + { \c__template_defaults_root_tl #1 / #2 } + } + { \prop_clear:N \l__template_values_prop } + } +\cs_new_protected:Npn \__template_recover_keytypes:nn #1#2 + { + \prop_if_exist:cTF + { \c__template_keytypes_root_tl #1 / #2 } + { + \prop_set_eq:Nc \l__template_keytypes_prop + { \c__template_keytypes_root_tl #1 / #2 } + } + { \prop_clear:N \l__template_keytypes_prop } + \seq_if_exist:cTF { \c__template_key_order_root_tl #1 / #2 } + { + \seq_set_eq:Nc \l__template_key_order_seq + { \c__template_key_order_root_tl #1 / #2 } + } + { \seq_clear:N \l__template_key_order_seq } + } +\cs_new_protected:Npn \__template_recover_values:nn #1#2 + { + \prop_if_exist:cTF + { \c__template_values_root_tl #1 / #2 } + { + \prop_set_eq:Nc \l__template_values_prop + { \c__template_values_root_tl #1 / #2 } + } + { \prop_clear:N \l__template_values_prop } + } +\cs_new_protected:Npn \__template_recover_vars:nn #1#2 + { + \prop_if_exist:cTF + { \c__template_vars_root_tl #1 / #2 } + { + \prop_set_eq:Nc \l__template_vars_prop + { \c__template_vars_root_tl #1 / #2 } + } + { \prop_clear:N \l__template_vars_prop } + } +\cs_new_protected:Npn \__template_define_type:nn #1#2 + { + \prop_if_in:NnTF \g__template_type_prop {#1} + { \msg_error:nnn { template } { type-already-defined } {#1} } + { \__template_declare_type:nn {#1} {#2} } + } +\cs_new_protected:Npn \__template_declare_type:nn #1#2 + { + \int_set:Nn \l__template_tmp_int {#2} + \int_compare:nTF { 0 <= \l__template_tmp_int <= 9 } + { + \msg_info:nnnV { template } { declare-type } + {#1} \l__template_tmp_int + \prop_gput:NnV \g__template_type_prop {#1} + \l__template_tmp_int + } + { + \msg_error:nnnV { template } { bad-number-of-arguments } + {#1} \l__template_tmp_int + } + } +\cs_new_protected:Npn \__template_declare_template_keys:nnnn #1#2#3#4 + { + \__template_execute_if_type_exist:nT {#1} + { + \__template_execute_if_arg_agree:nnT {#1} {#3} + { + \prop_clear:N \l__template_values_prop + \prop_clear:N \l__template_keytypes_prop + \seq_clear:N \l__template_key_order_seq + \keyval_parse:NNn + \__template_parse_keys_elt:n \__template_parse_keys_elt:nn {#4} + \__template_store_defaults:nn {#1} {#2} + \__template_store_keytypes:nn {#1} {#2} + } + } + } +\cs_new_protected:Npn \__template_parse_keys_elt:n #1 + { + \__template_split_keytype:n {#1} + \bool_if:NF \l__template_error_bool + { + \__template_execute_if_keytype_exist:VT \l__template_keytype_tl + { + \seq_map_function:NN \c__template_keytypes_arg_seq + \__template_parse_keys_elt_aux:n + \bool_if:NF \l__template_error_bool + { + \seq_if_in:NoTF \l__template_key_order_seq + \l__template_key_name_tl + { + \msg_error:nnV { template } { duplicate-key-interface } + \l__template_key_name_tl + } + { \__template_parse_keys_elt_aux: } + } + } + } + } +\cs_new_protected:Npn \__template_parse_keys_elt_aux:n #1 + { + \str_if_eq:VnT \l__template_keytype_tl {#1} + { + \tl_if_empty:NT \l__template_keytype_arg_tl + { + \msg_error:nnn { template } { keytype-requires-argument } {#1} + \bool_set_true:N \l__template_error_bool + \seq_map_break: + } + } + } +\cs_new_protected:Npn \__template_parse_keys_elt_aux: + { + \tl_set:Ne \l__template_tmp_tl + { + \l__template_keytype_tl + \tl_if_empty:NF \l__template_keytype_arg_tl + { { \l__template_keytype_arg_tl } } + } + \prop_put:NVV \l__template_keytypes_prop \l__template_key_name_tl + \l__template_tmp_tl + \seq_put_right:NV \l__template_key_order_seq \l__template_key_name_tl + \str_if_eq:VnT \l__template_keytype_tl { choice } + { + \clist_if_in:NnT \l__template_keytype_arg_tl { unknown } + { \msg_error:nn { template } { choice-unknown-reserved } } + } + } +\cs_new_protected:Npn \__template_parse_keys_elt:nn #1#2 + { + \__template_parse_keys_elt:n {#1} + \use:c { __template_store_value_ \l__template_keytype_tl :n } {#2} + } +\cs_new_protected:Npe \__template_split_keytype:n #1 + { + \exp_not:N \bool_set_false:N \exp_not:N \l__template_error_bool + \tl_set:Nn \exp_not:N \l__template_tmp_tl {#1} + \tl_replace_all:Nnn \exp_not:N \l__template_tmp_tl { : } { \token_to_str:N : } + \tl_if_in:VnTF \exp_not:N \l__template_tmp_tl { \token_to_str:N : } + { + \exp_not:n + { + \tl_clear:N \l__template_key_name_tl + \exp_after:wN \__template_split_keytype_aux:w + \l__template_tmp_tl \s__template_stop + } + } + { + \exp_not:N \bool_set_true:N \exp_not:N \l__template_error_bool + \msg_error:nnn { template } { missing-keytype } {#1} + } + } +\use:e + { + \cs_new_protected:Npn \exp_not:N \__template_split_keytype_aux:w + #1 \token_to_str:N : #2 \s__template_stop + { + \tl_put_right:Ne \exp_not:N \l__template_key_name_tl + { + \exp_not:N \tl_trim_spaces:e + { \exp_not:N \tl_to_str:n {#1} } + } + \tl_if_in:nnTF {#2} { \token_to_str:N : } + { + \tl_put_right:Nn \exp_not:N \l__template_key_name_tl + { \token_to_str:N : } + \exp_not:N \__template_split_keytype_aux:w #2 \s__template_stop + } + { + \exp_not:N \tl_if_empty:NTF \exp_not:N \l__template_key_name_tl + { + \msg_error:nnn { template } { empty-key-name } + { \token_to_str:N : #2 } + } + { \exp_not:N \__template_split_keytype_arg:n {#2} } + } + } + } +\cs_new_protected:Npn \__template_split_keytype_arg:n #1 + { + \tl_set:Ne \l__template_keytype_tl { \tl_trim_spaces:n {#1} } + \tl_clear:N \l__template_keytype_arg_tl + \cs_set_protected:Npn \__template_split_keytype_arg_aux:n ##1 + { + \tl_if_in:nnT {#1} {##1} + { + \cs_set:Npn \__template_split_keytype_arg_aux:w + ####1 ##1 ####2 \s__template_stop + { + \tl_if_blank:nT {####1} + { + \tl_set:Ne \l__template_keytype_tl + { \tl_trim_spaces:n {##1} } + \tl_if_blank:nF {####2} + { + \tl_set:Ne \l__template_keytype_arg_tl + { \use:n ####2 } + } + \seq_map_break: + } + } + \__template_split_keytype_arg_aux:w #1 \s__template_stop + } + } + \seq_map_function:NN \c__template_keytypes_arg_seq + \__template_split_keytype_arg_aux:n + } +\cs_generate_variant:Nn \__template_split_keytype_arg:n { V } +\cs_new:Npn \__template_split_keytype_arg_aux:n #1 { } +\cs_new:Npn \__template_split_keytype_arg_aux:w #1 \s__template_stop { } +\cs_new_protected:Npn \__template_store_value_boolean:n #1 + { \prop_put:Non \l__template_values_prop \l__template_key_name_tl {#1} } +\cs_new_protected:Npn \__template_store_value:n #1 + { \prop_put:Non \l__template_values_prop \l__template_key_name_tl {#1} } +\cs_new_eq:NN \__template_store_value_choice:n \__template_store_value:n +\cs_new_eq:NN \__template_store_value_function:n \__template_store_value:n +\cs_new_eq:NN \__template_store_value_instance:n \__template_store_value:n +\cs_new_protected:Npn \__template_store_value_aux:Nn #1#2 + { \prop_put:Non \l__template_values_prop \l__template_key_name_tl {#2} } +\cs_new_protected:Npn \__template_store_value_integer:n + { \__template_store_value_aux:Nn \int_eval:n } +\cs_new_protected:Npn \__template_store_value_length:n + { \__template_store_value_aux:Nn \dim_eval:n } +\cs_new_protected:Npn \__template_store_value_muskip:n + { \__template_store_value_aux:Nn \muskip_eval:n } +\cs_new_protected:Npn \__template_store_value_real:n + { \__template_store_value_aux:Nn \fp_eval:n } +\cs_new_protected:Npn \__template_store_value_skip:n + { \__template_store_value_aux:Nn \skip_eval:n } +\cs_new_protected:Npn \__template_store_value_tokenlist:n + { \__template_store_value_aux:Nn \use:n } +\cs_new_eq:NN \__template_store_value_commalist:n \__template_store_value_tokenlist:n +\cs_new_protected:Npn \__template_declare_template_code:nnnnn #1#2#3#4#5 + { + \__template_execute_if_type_exist:nT {#1} + { + \__template_execute_if_arg_agree:nnT {#1} {#3} + { + \__template_if_keys_exist:nnT {#1} {#2} + { + \__template_store_key_implementation:nnn {#1} {#2} {#4} + \regex_match:nnTF { \c { AssignTemplateKeys } } {#5} + { \__template_declare_template_code:nnnn {#1} {#2} {#3} {#5} } + { + \__template_declare_template_code:nnnn + {#1} {#2} {#3} { \AssignTemplateKeys #5 } + } + } + } + } + } +\cs_new_protected:Npn \__template_declare_template_code:nnnn #1#2#3#4 + { + \cs_if_exist:cT { \c__template_code_root_tl #1 / #2 } + { \msg_info:nnnn { template } { declare-template-code } {#1} {#2} } + \cs_generate_from_arg_count:cNnn + { \c__template_code_root_tl #1 / #2 } + \cs_gset_protected:Npn {#3} {#4} + } +\cs_new_protected:Npn \__template_store_key_implementation:nnn #1#2#3 + { + \__template_recover_defaults:nn {#1} {#2} + \__template_recover_keytypes:nn {#1} {#2} + \prop_clear:N \l__template_vars_prop + \keyval_parse:nnn + { \__template_parse_vars_elt:n } { \__template_parse_vars_elt:nnn { #1 / #2 } } {#3} + \__template_store_vars:nn {#1} {#2} + \prop_map_inline:Nn \l__template_keytypes_prop + { \msg_error:nnnnn { template } { key-not-implemented } {##1} {#2} {#1} } + } +\cs_new_protected:Npn \__template_parse_vars_elt:n #1 + { \msg_error:nnn { template } { key-no-variable } {#1} } +\cs_new_protected:Npn \__template_parse_vars_elt:nnn #1#2#3 + { + \tl_set:Ne \l__template_key_name_tl + { \tl_trim_spaces:e { \tl_to_str:n {#2} } } + \prop_get:NVNTF \l__template_keytypes_prop + \l__template_key_name_tl + \l__template_keytype_tl + { + \__template_split_keytype_arg:V \l__template_keytype_tl + \__template_parse_vars_elt_aux:nn {#1} {#3} + \prop_remove:NV \l__template_keytypes_prop \l__template_key_name_tl + } + { \msg_error:nnn { template } { unknown-key } {#2} } + } +\cs_new_protected:Npn \__template_parse_vars_elt_aux:nn #1#2 + { + \__template_parse_vars_elt_aux:nw {#1} #2 global global \s__template_stop + } +\cs_new_protected:Npn \__template_parse_vars_elt_aux:nw + #1#2 global #3 global #4 \s__template_stop + { + \tl_if_blank:nTF {#4} + { \__template_parse_vars_elt_aux:nnn {#1} { } {#2} } + { + \tl_if_blank:nTF {#2} + { + \__template_parse_vars_elt_aux:nne + {#1} { global } { \tl_trim_spaces:n {#3} } + } + { \msg_error:nnn { template } { bad-variable } { #2 global #3 } } + } + } +\cs_new_protected:Npn \__template_parse_vars_elt_aux:nnn #1#2#3 + { + \str_case:VnF \l__template_keytype_tl + { + { choice } { \__template_implement_choices:nn {#1} {#3} } + { function } + { + \cs_if_exist:NF #3 + { \cs_new:Npn #3 { } } + \__template_parse_vars_elt_key:nn {#1} + { + .code:n = + { + \cs_generate_from_arg_count:NNnn + \exp_not:N #3 + \exp_not:c + { cs_ \str_if_eq:nnT {#1} { global } { g } set:Npn } + { \exp_not:V \l__template_keytype_arg_tl } + {##1} + } + } + \prop_put:NVn \l__template_vars_prop + \l__template_key_name_tl {#2#3} + } + { instance } + { + \__template_parse_vars_elt_key:nn {#1} + { + .code:n = + { + \exp_not:c + { cs_ \str_if_eq:nnT {#1} { global } { g } set:Npn } + \exp_not:N #3 { \UseInstance {##1} } + } + } + \prop_put:NVn \l__template_vars_prop + \l__template_key_name_tl {#2#3} + } + } + { + \tl_if_single:nTF {#3} + { + \cs_if_exist:NF #3 + { \use:c { \__template_map_var_type: _new:N } #3 } + \__template_parse_vars_elt_key:nn {#1} + { + . \__template_map_var_type: + _ \str_if_eq:nnT {#1} { global } { g } set:N + = \exp_not:N #3 + } + \prop_put:NVn \l__template_vars_prop + \l__template_key_name_tl {#2#3} + } + { \msg_error:nnn { template } { bad-variable } {#2#3} } + } + } +\cs_generate_variant:Nn \__template_parse_vars_elt_aux:nnn { nne } +\cs_new_protected:Npn \__template_parse_vars_elt_key:nn #1#2 + { + \keys_define:ne { template / #1 } + { \l__template_key_name_tl #2 } + } +\cs_new:Npn \__template_map_var_type: + { + \str_case:Vn \l__template_keytype_tl + { + { boolean } { bool } + { commalist } { clist } + { integer } { int } + { length } { dim } + { muskip } { muskip } + { real } { fp } + { skip } { skip } + { tokenlist } { tl } + } + } +\cs_new_protected:Npn \__template_implement_choices:nn #1#2 + { + \clist_set:NV \l__template_tmp_clist \l__template_keytype_arg_tl + \prop_put:NVn \l__template_vars_prop \l__template_key_name_tl { } + \keys_define:ne { template / #1 } { \l__template_key_name_tl .choice: } + \keyval_parse:nnn + { \__template_implement_choice_elt:n } + { \__template_implement_choice_elt:nnn {#1} } + {#2} + \prop_get:NVNT \l__template_values_prop \l__template_key_name_tl + \l__template_tmp_tl + { \__template_implement_choices_default: } + \clist_if_empty:NF \l__template_tmp_clist + { + \clist_map_inline:Nn \l__template_tmp_clist + { \msg_error:nnn { template } { choice-not-implemented } {##1} } + } + } +\cs_new_protected:Npn \__template_implement_choices_default: + { + \tl_set:Ne \l__template_tmp_tl + { \l__template_key_name_tl \c_space_tl \l__template_tmp_tl } + \prop_if_in:NVF \l__template_vars_prop \l__template_tmp_tl + { + \tl_set:Ne \l__template_tmp_tl + { \l__template_key_name_tl \c_space_tl \l__template_tmp_tl } + \prop_if_in:NVF \l__template_vars_prop \l__template_tmp_tl + { + \prop_get:NVN \l__template_keytypes_prop \l__template_key_name_tl + \l__template_tmp_tl + \__template_split_keytype_arg:V \l__template_tmp_tl + \prop_get:NVN \l__template_values_prop \l__template_key_name_tl + \l__template_tmp_tl + \msg_error:nnVV { template } { unknown-default-choice } + \l__template_key_name_tl + \l__template_key_name_tl + } + } + } +\cs_new_protected:Npn \__template_implement_choice_elt:nnn #1#2#3 + { + \clist_if_empty:NTF \l__template_tmp_clist + { + \str_if_eq:nnTF {#2} { unknown } + { \__template_implement_choice_elt_aux:nnn {#1} {#2} {#3} } + { \__template_implement_choice_elt_aux:n {#2} } + } + { + \clist_if_in:NnTF \l__template_tmp_clist {#2} + { + \clist_remove_all:Nn \l__template_tmp_clist {#2} + \__template_implement_choice_elt_aux:nnn {#1} {#2} {#3} + } + { \__template_implement_choice_elt_aux:n {#2} } + } + } +\cs_new_protected:Npn \__template_implement_choice_elt_aux:n #1 + { + \prop_get:NVN \l__template_keytypes_prop \l__template_key_name_tl + \l__template_tmp_tl + \__template_split_keytype_arg:V \l__template_tmp_tl + \msg_error:nnVn { template } { unknown-choice } \l__template_key_name_tl {#1} + } +\cs_new_protected:Npn \__template_implement_choice_elt_aux:nnn #1#2#3 + { + \keys_define:ne { template / #1 } + { \l__template_key_name_tl / #2 .code:n = { \exp_not:n {#3} } } + \tl_set:Ne \l__template_tmp_tl + { \l__template_key_name_tl \c_space_tl #2 } + \prop_put:NVn \l__template_vars_prop \l__template_tmp_tl {#3} + } +\cs_new_protected:Npn \__template_implement_choice_elt:n #1 + { + \msg_error:nnVn { template } { choice-requires-code } + \l__template_key_name_tl {#1} + } +\cs_new_protected:Npn \__template_edit_defaults:nnn #1#2#3 + { + \__template_if_keys_exist:nnT {#1} {#2} + { + \__template_recover_defaults:nn {#1} {#2} + \__template_parse_values:nnn {#1} {#2} {#3} + \__template_store_defaults:nn {#1} {#2} + } + } +\cs_new_protected:Npn \__template_parse_values:nnn #1#2#3 + { + \__template_recover_keytypes:nn {#1} {#2} + \keyval_parse:NNn + \__template_parse_values_elt:n \__template_parse_values_elt:nn {#3} + } +\cs_new_protected:Npn \__template_parse_values_elt:n #1 + { + \bool_set_true:N \l__template_error_bool + \msg_error:nnn { template } { key-no-value } {#1} + } +\cs_new_protected:Npn \__template_parse_values_elt:nn #1#2 + { + \tl_set:Ne \l__template_key_name_tl + { \tl_trim_spaces:e { \tl_to_str:n {#1} } } + \prop_get:NVNTF \l__template_keytypes_prop \l__template_key_name_tl + \l__template_tmp_tl + { \__template_parse_values_elt_aux:n {#2} } + { \msg_error:nnV { template } { unknown-key } \l__template_key_name_tl } + } +\cs_new_protected:Npn \__template_parse_values_elt_aux:n #1 + { + \__template_split_keytype_arg:V \l__template_tmp_tl + \use:c { __template_store_value_ \l__template_keytype_tl :n } {#1} + } +\cs_new_protected:Npn \__template_template_set_eq:nnn #1#2#3 + { + \__template_recover_defaults:nn {#1} {#3} + \__template_store_defaults:nn {#1} {#2} + \__template_recover_keytypes:nn {#1} {#3} + \__template_store_keytypes:nn {#1} {#2} + \__template_recover_vars:nn {#1} {#3} + \__template_store_vars:nn {#1} {#2} + \cs_if_exist:cT { \c__template_code_root_tl #1 / #2 } + { \msg_info:nnnn { template } { declare-template-code } {#1} {#2} } + \cs_gset_eq:cc { \c__template_code_root_tl #1 / #2 } + { \c__template_code_root_tl #1 / #3 } + } +\cs_new_protected:Npn \__template_declare_instance:nnnn #1#2#3#4 + { + \__template_execute_if_code_exist:nnT {#1} {#2} + { + \__template_recover_defaults:nn {#1} {#2} + \__template_recover_vars:nn {#1} {#2} + \__template_declare_instance_aux:nnnn {#1} {#2} {#3} {#4} + } + } +\cs_new_protected:Npn \__template_declare_instance_aux:nnnn #1#2#3#4 + { + \bool_set_false:N \l__template_error_bool + \__template_parse_values:nnn {#1} {#2} {#4} + \bool_if:NF \l__template_error_bool + { + \prop_put:Nnn \l__template_values_prop { from~template } {#2} + \__template_store_values:nn {#1} {#3} + \__template_convert_to_assignments: + \cs_if_exist:cT { \c__template_instances_root_tl #1 / #3 } + { \msg_info:nnnn { template } { declare-instance } {#3} {#1} } + \cs_set_protected:cpe { \c__template_instances_root_tl #1 / #3 } + { + \exp_not:N \__template_assignments_push:n + { \exp_not:V \l__template_assignments_tl } + \exp_not:c { \c__template_code_root_tl #1 / #2 } + } + } + } +\cs_new_protected:Npn \__template_instance_set_eq:nnn #1#2#3 + { + \__template_if_instance_exist:nnTF {#1} {#3} + { + \__template_recover_values:nn {#1} {#3} + \__template_store_values:nn {#1} {#2} + \cs_if_exist:cT { \c__template_instances_root_tl #1 / #2 } + { \msg_info:nnnn { template } { declare-instance } {#2} {#1} } + \cs_set_eq:cc { \c__template_instances_root_tl #1 / #2 } + { \c__template_instances_root_tl #1 / #3 } + } + { \msg_error:nnnn { template } { unknown-instance } {#1} {#3} } + } +\cs_new_protected:Npn \__template_edit_instance:nnn #1#2#3 + { + \__template_if_instance_exist:nnTF {#1} {#2} + { + \__template_recover_values:nn {#1} {#2} + \prop_get:NnN \l__template_values_prop { from~template } + \l__template_tmp_tl + \__template_edit_instance_aux:nVnn + {#1} \l__template_tmp_tl {#2} {#3} + } + { \msg_error:nnnn { template } { unknown-instance } {#1} {#2} } + } +\cs_new_protected:Npn \__template_edit_instance_aux:nnnn #1#2#3#4 + { + \__template_recover_vars:nn {#1} {#2} + \__template_declare_instance_aux:nnnn {#1} {#2} {#3} {#4} + } +\cs_generate_variant:Nn \__template_edit_instance_aux:nnnn { nV } +\cs_new_protected:Npn \__template_convert_to_assignments: + { + \tl_clear:N \l__template_assignments_tl + \seq_map_function:NN \l__template_key_order_seq + \__template_convert_to_assignments_aux:n + } +\cs_new_protected:Npn \__template_convert_to_assignments_aux:n #1 + { + \prop_get:NnN \l__template_keytypes_prop {#1} \l__template_tmp_tl + \__template_convert_to_assignments_aux:nV {#1} \l__template_tmp_tl + } +\cs_new_protected:Npn \__template_convert_to_assignments_aux:nn #1#2 + { + \prop_get:NnNT \l__template_values_prop {#1} \l__template_value_tl + { + \prop_get:NnNTF \l__template_vars_prop {#1} \l__template_var_tl + { + \__template_split_keytype_arg:n {#2} + \str_if_eq:VnF \l__template_keytype_tl { choice } + { + \str_if_eq:VnF \l__template_keytype_tl { code } + { \__template_find_global: } + } + \tl_set:Nn \l__template_key_name_tl {#1} + \cs_if_exist_use:cF { __template_assign_ \l__template_keytype_tl : } + { \__template_assign_variable: } + } + { \msg_error:nnn { template } { unknown-attribute } {#1} } + } + } +\cs_generate_variant:Nn \__template_convert_to_assignments_aux:nn { nV } +\cs_new_protected:Npn \__template_find_global: + { + \bool_set_false:N \l__template_global_bool + \tl_if_in:onT \l__template_var_tl { global } + { + \exp_after:wN \__template_find_global_aux:w \l__template_var_tl \s__template_stop + } + } +\cs_new_protected:Npn \__template_find_global_aux:w #1 global #2 \s__template_stop + { + \tl_set:Nn \l__template_var_tl {#2} + \bool_set_true:N \l__template_global_bool + } +\cs_new_protected:Npn \__template_use_template:nnn #1#2#3 + { + \__template_execute_if_code_exist:nnT {#1} {#2} + { + \__template_recover_defaults:nn {#1} {#2} + \__template_recover_vars:nn {#1} {#2} + \__template_parse_values:nnn {#1} {#2} {#3} + \__template_convert_to_assignments: + \use:c { \c__template_code_root_tl #1 / #2 } + } + } +\cs_new_protected:Npn \__template_assign_boolean: + { + \bool_if:NTF \l__template_global_bool + { \__template_assign_boolean_aux:n { bool_gset } } + { \__template_assign_boolean_aux:n { bool_set } } + } +\cs_new_protected:Npn \__template_assign_boolean_aux:n #1 + { + \__template_if_key_value:VTF \l__template_value_tl + { + \__template_key_to_value: + \tl_put_right:Ne \l__template_assignments_tl + { + \exp_not:c { #1 _eq:NN } + \exp_not:V \l__template_var_tl + \exp_not:V \l__template_value_tl + } + } + { + \tl_put_right:Ne \l__template_assignments_tl + { + \exp_not:c { #1 _ \l__template_value_tl :N } + \exp_not:V \l__template_var_tl + } + } + } +\cs_new_protected:Npn \__template_assign_choice: + { + \__template_assign_choice_aux:eF + { \l__template_key_name_tl \c_space_tl \l__template_value_tl } + { + \__template_assign_choice_aux:eF + { \l__template_key_name_tl \c_space_tl unknown } + { + \prop_get:NVN \l__template_keytypes_prop \l__template_key_name_tl + \l__template_tmp_tl + \__template_split_keytype_arg:V \l__template_tmp_tl + \msg_error:nnVV { template } { unknown-choice } + \l__template_key_name_tl + \l__template_value_tl + } + } + } +\cs_new_protected:Npn \__template_assign_choice_aux:nF #1 + { + \prop_get:NnNTF \l__template_vars_prop {#1} \l__template_tmp_tl + { \tl_put_right:NV \l__template_assignments_tl \l__template_tmp_tl } + } +\cs_generate_variant:Nn \__template_assign_choice_aux:nF { e } +\cs_new_protected:Npn \__template_assign_function: + { + \bool_if:NTF \l__template_global_bool + { \__template_assign_function_aux:N \cs_gset:Npn } + { \__template_assign_function_aux:N \cs_set:Npn } + } +\cs_new_protected:Npn \__template_assign_function_aux:N #1 + { + \tl_put_right:Ne \l__template_assignments_tl + { + \cs_generate_from_arg_count:NNnn + \exp_not:V \l__template_var_tl + \exp_not:N #1 + { \exp_not:V \l__template_keytype_arg_tl } + { \exp_not:V \l__template_value_tl } + } + } +\cs_new_protected:Npn \__template_assign_instance: + { + \bool_if:NTF \l__template_global_bool + { \__template_assign_instance_aux:N \cs_gset_protected:Npn } + { \__template_assign_instance_aux:N \cs_set_protected:Npn } + } +\cs_new_protected:Npn \__template_assign_instance_aux:N #1 + { + \tl_put_right:Ne \l__template_assignments_tl + { + \exp_not:N #1 \exp_not:V \l__template_var_tl + { + \__template_use_instance:nn + { \exp_not:V \l__template_keytype_arg_tl } + { \exp_not:V \l__template_value_tl } + } + } + } +\cs_new_protected:Npn \__template_assign_variable: + { + \__template_assign_variable:c + { + \__template_map_var_type: _ + \bool_if:NT \l__template_global_bool { g } set:Nn + } + } +\cs_new_protected:Npn \__template_assign_variable:N #1 + { + \__template_if_key_value:VT \l__template_value_tl + { \__template_key_to_value: } + \tl_put_right:Ne \l__template_assignments_tl + { + #1 \exp_not:V \l__template_var_tl + { \exp_not:V \l__template_value_tl } + } + } +\cs_generate_variant:Nn \__template_assign_variable:N { c } +\cs_new_protected:Npn \__template_key_to_value: + { \exp_after:wN \__template_key_to_value_auxi:w \l__template_value_tl } +\cs_new_protected:Npn \__template_key_to_value_auxi:w \KeyValue #1 + { + \tl_set:Ne \l__template_tmp_tl { \tl_trim_spaces:e { \tl_to_str:n {#1} } } + \prop_get:NVNTF \l__template_vars_prop \l__template_tmp_tl + \l__template_value_tl + { + \exp_after:wN \__template_key_to_value_auxii:w \l__template_value_tl + \s__template_mark global \q__template_nil \s__template_stop + } + { \msg_error:nnV { template } { unknown-attribute } \l__template_tmp_tl } + } +\cs_new_protected:Npn \__template_key_to_value_auxii:w #1 global #2#3 \s__template_stop + { + \__template_quark_if_nil:NF #2 + { \tl_set:Nn \l__template_value_tl {#2} } + } +\cs_new_protected:Npn \__template_use_instance:nn #1#2 + { + \__template_if_use_template:nTF {#2} + { \__template_use_instance_aux:nNnnn {#1} #2 } + { \__template_use_instance_aux:nn {#1} {#2} } + } +\cs_new_protected:Npn \__template_use_instance_aux:nNnnn #1#2#3#4#5 + { + \str_if_eq:nnTF {#1} {#3} + { \__template_use_template:nnn {#3} {#4} {#5} } + { \msg_error:nnnn { template } { type-mismatch } {#1} {#3} } +} +\cs_new_protected:Npn \__template_use_instance_aux:nn #1#2 + { + \__template_if_instance_exist:nnTF {#1} {#2} + { \use:c { \c__template_instances_root_tl #1 / #2 } } + { \msg_error:nnnn { template } { unknown-instance } {#1} {#2} } + } +\cs_new:Npn \__template_assignments_pop: { \l__template_assignments_tl } +\cs_new_protected:Npn \__template_assignments_push:n #1 + { \tl_set:Nn \l__template_assignments_tl {#1} } +\cs_new_protected:Npn \__template_show_code:nn #1#2 + { \cs_show:c { \c__template_code_root_tl #1 / #2 } } +\cs_new_protected:Npn \__template_show_defaults:nn #1#2 + { + \__template_if_keys_exist:nnT {#1} {#2} + { + \__template_recover_defaults:nn {#1} {#2} + \__template_show:Nnnn \l__template_values_prop + {#1} {#2} { default~values } + } + } +\cs_new_protected:Npn \__template_show_keytypes:nn #1#2 + { + \__template_if_keys_exist:nnT {#1} {#2} + { + \__template_recover_keytypes:nn {#1} {#2} + \__template_show:Nnnn \l__template_keytypes_prop + {#1} {#2} { interface } + } + } +\cs_new_protected:Npn \__template_show_vars:nn #1#2 + { + \__template_execute_if_code_exist:nnT {#1} {#2} + { + \__template_recover_vars:nn {#1} {#2} + \__template_show:Nnnn \l__template_vars_prop + {#1} {#2} { variable~mapping } + } + } +\cs_new_protected:Npn \__template_show:Nnnn #1#2#3#4 + { + \msg_show:nneeee { template } { show-attribute } + { \tl_to_str:n {#2} } + { \tl_to_str:n {#3} } + { \tl_to_str:n {#4} } + { \prop_map_function:NN #1 \msg_show_item_unbraced:nn } + } +\cs_new_protected:Npn \__template_show_values:nn #1#2 + { + \__template_if_instance_exist:nnT {#1} {#2} + { + \__template_recover_values:nn {#1} {#2} + \msg_show:nneee { template } { show-values } + { \tl_to_str:n {#1} } + { \tl_to_str:n {#2} } + { + \prop_map_function:NN \l__template_values_prop + \msg_show_item_unbraced:nn + } + } + } +\msg_new:nnnn { template } { argument-number-mismatch } + { Template~type~'#1'~takes~#2~argument(s). } + { + Templates~of~type~'#1'~require~#2~argument(s).\\ + You~have~tried~to~make~a~template~for~'#1'~ + with~#3~argument(s),~which~is~not~possible:~ + the~number~of~arguments~must~agree. + } +\msg_new:nnnn { template } { bad-number-of-arguments } + { Bad~number~of~arguments~for~template~type~'#1'. } + { + A~template~may~accept~between~0~and~9~arguments.\\ + You~asked~to~use~#2~arguments:~this~is~not~supported. + } +\msg_new:nnnn { template } { bad-variable } + { Incorrect~variable~description~'#1'. } + { + The~argument~'#1'~is~not~of~the~form \\ + ~~'<variable>'\\ + ~or~\\ + ~~'global~<variable>'.\\ + It~must~be~given~in~one~of~these~formats~to~be~used~in~a~template. + } +\msg_new:nnnn { template } { choice-not-implemented } + { The~choice~'#1'~has~no~implementation. } + { + Each~choice~listed~in~the~interface~for~a~template~must~ + have~an~implementation. + } +\msg_new:nnnn { template } { choice-no-code } + { The~choice~'#1'~requires~implementation~details. } + { + When~creating~template~code~using~\DeclareTemplateCode,~ + each~choice~name~must~have~an~associated~implementation.\\ + This~should~be~given~after~a~'='~sign:~LaTeX~did~not~find~one. + } +\msg_new:nnnn { template } { choice-requires-code } + { The~choice~'#2'~for~key~'#1'~requires~an~implementation. } + { + You~should~have~put:\\ + \ \ #1~:~choice~{~#2 = <code> ~} \\ + but~LaTeX~did~not~find~any~<code>. + } +\msg_new:nnnn { template } { duplicate-key-interface } + { Key~'#1'~appears~twice~in~interface~definition~\msg_line_context:. } + { + Each~key~can~only~have~one~interface~declared~in~a~template.\\ + LaTeX~found~two~interfaces~for~'#1'. + } +\msg_new:nnnn { template } { keytype-requires-argument } + { The~key~type~'#1'~requires~an~argument~\msg_line_context:. } + { + You~should~have~put:\\ + \ \ <key-name>~:~#1~{~<argument>~} \\ + but~LaTeX~did~not~find~an~<argument>. + } +\msg_new:nnnn { template } { invalid-keytype } + { The~key~'#1'~is~missing~a~key-type~\msg_line_context:. } + { + Each~key~in~a~template~requires~a~key-type,~given~in~the~form:\\ + \ \ <key>~:~<key-type>\\ + LaTeX~could~not~find~a~<key-type>~in~your~input. + } +\msg_new:nnnn { template } { key-no-value } + { The~key~'#1'~has~no~value~\msg_line_context:. } + { + When~creating~an~instance~of~a~template~ + every~key~listed~must~include~a~value:\\ + \ \ <key>~=~<value> + } +\msg_new:nnnn { template } { key-no-variable } + { The~key~'#1'~requires~implementation~details~\msg_line_context:. } + { + When~creating~template~code~using~\DeclareTemplateCode,~ + each~key~name~must~have~an~associated~implementation.\\ + This~should~be~given~after~a~'='~sign:~LaTeX~did~not~find~one. + } +\msg_new:nnnn { template } { key-not-implemented } + { Key~'#1'~has~no~implementation~\msg_line_context:. } + { + The~definition~of~key~implementations~for~template~'#2'~ + of~template~type~'#3'~does~not~include~any~details~for~key~'#1'.\\ + The~key~was~declared~in~the~interface~definition,~ + and~so~an~implementation~is~required. + } +\msg_new:nnnn { template } { missing-keytype } + { The~key~'#1'~is~missing~a~key-type~\msg_line_context:. } + { + Key~interface~definitions~should~be~of~the~form\\ + \ \ #1~:~<key-type>\\ + but~LaTeX~could~not~find~a~<key-type>. + } +\msg_new:nnnn { template } { no-template-code } + { + The~template~'#2'~of~type~'#1'~is~unknown~ + or~has~no~implementation. + } + { + There~is~no~code~available~for~the~template~name~given.\\ + This~should~be~given~using~\DeclareTemplateCode. + } +\msg_new:nnnn { template } { type-already-defined } + { Template~type~'#1'~already~defined. } + { + You~have~used~\NewTemplateType~ + with~a~template~type~that~has~already~been~defined. + } +\msg_new:nnnn { template } { type-mismatch } + { Template~types~'#1'~and~'#2'~do~not~agree. } + { + You~are~trying~to~use~a~template~directly~with~\UseInstance + (or~a~similar~function),~but~the~template~types~do~not~match. + } +\msg_new:nnnn { template } { unknown-attribute } + { The~template~attribute~'#1'~is~unknown. } + { + There~is~a~definition~in~the~current~template~reading\\ + \ \ \token_to_str:N \KeyValue {~#1~} \\ + but~there~is~no~key~called~'#1'. + } +\msg_new:nnnn { template } { unknown-choice } + { The~choice~'#2'~was~not~declared~for~key~'#1'. } + { + The~key~'#1'~takes~a~fixed~list~of~choices~ + and~this~list~does~not~include~'#2'. + } +\msg_new:nnnn { template } { unknown-default-choice } + { The~default~choice~'#2'~was~not~declared~for~key~'#1'. } + { + The~key~'#1'~takes~a~fixed~list~of~choices~ + and~this~list~does~not~include~'#2'. + } +\msg_new:nnnn { template } { unknown-instance } + { The~instance~'#2'~of~type~'#1'~is~unknown. } + { + You~have~asked~to~use~an~instance~'#2',~ + but~this~has~not~been~created. + } +\msg_new:nnnn { template } { unknown-key } + { Unknown~template~key~'#1'. } + { + The~key~'#1'~was~not~declared~in~the~interface~ + for~the~current~template. + } +\msg_new:nnnn { template } { unknown-keytype } + { The~key-type~'#1'~is~unknown. } + { + Valid~key-types~are:\\ + -~boolean;\\ + -~choice;\\ + -~commalist;\\ + -~function;\\ + -~instance;\\ + -~integer;\\ + -~length;\\ + -~muskip;\\ + -~real;\\ + -~skip;\\ + -~tokenlist. + } +\msg_new:nnnn { template } { unknown-type } + { The~template~type~'#1'~is~unknown. } + { + A~template~type~needs~to~be~defined~with~\NewTemplateType + prior~to~using~it. + } +\msg_new:nnnn { template } { unknown-template } + { The~template~'#2'~of~type~'#1'~is~unknown. } + { + No~interface~has~been~declared~for~a~template~ + '#2'~of~template~type~'#1'. + } +\msg_new:nnn { template } { declare-instance } + { Declaring~instance~~'#1'~of~type~#2~\msg_line_context:. } +\msg_new:nnn { template } { declare-template-code } + { Declaring~code~for~template~'#2'~of~template~type~'#1'~\msg_line_context:. } +\msg_new:nnn { template } { declare-template-interface } + { + Declaring~interface~for~template~'#2'~of~template~type~'#1'~ + \msg_line_context:. + } +\msg_new:nnn { template } { declare-type } + { Declaring~template~type~'#1'~taking~#2~argument(s)~\msg_line_context:. } +\msg_new:nnn { template } { show-attribute } + { + The~template~'#2'~of~type~'#1'~has~ + \tl_if_empty:nTF {#4} { no~#3. } { #3 : #4 } + } +\msg_new:nnn { template } { show-values } + { + The~instance~'#2'~of~type~'#1'~has~ + \tl_if_empty:nTF {#3} { no~values. } { values: #3 } + } +\prop_gput:Nnn \g_msg_module_type_prop { template } { LaTeX } +\cs_new_protected:Npn \NewTemplateType #1#2 + { \__template_define_type:nn {#1} {#2} } +\cs_new_protected:Npn \DeclareTemplateInterface #1#2#3#4 + { \__template_declare_template_keys:nnnn {#1} {#2} {#3} {#4} } +\cs_new_protected:Npn \DeclareTemplateCode #1#2#3#4#5 + { \__template_declare_template_code:nnnnn {#1} {#2} {#3} {#4} {#5} } +\cs_new_protected:Npn \DeclareTemplateCopy #1#2#3 + { \__template_template_set_eq:nnn {#1} {#2} {#3} } +\cs_new_protected:Npn \EditTemplateDefaults #1#2#3 + { \__template_edit_defaults:nnn {#1} {#2} {#3} } +\cs_new_protected:Npn \UseTemplate #1#2#3 + { \__template_use_template:nnn {#1} {#2} {#3} } +\cs_new_protected:Npn \DeclareInstance #1#2#3#4 + { \__template_declare_instance:nnnn {#1} {#3} {#2} {#4} } +\cs_new_protected:Npn \DeclareInstanceCopy #1#2#3 + { \__template_instance_set_eq:nnn {#1} {#2} {#3} } +\cs_new_protected:Npn \EditInstance #1#2#3 + { \__template_edit_instance:nnn {#1} {#2} {#3} } +\cs_new_protected:Npn \UseInstance #1#2 + { \__template_use_instance:nn {#1} {#2} } +\cs_new_protected:Npn \ShowTemplateCode #1#2 + { \__template_show_code:nn {#1} {#2} } +\cs_new_protected:Npn \ShowTemplateDefaults #1#2 + { \__template_show_defaults:nn {#1} {#2} } +\cs_new_protected:Npn \ShowTemplateInterface #1#2 + { \__template_show_keytypes:nn {#1} {#2} } +\cs_new_protected:Npn \ShowTemplateVariables #1#2 + { \__template_show_vars:nn {#1} {#2} } +\cs_new_protected:Npn \ShowInstanceValues #1#2 + { \__template_show_values:nn {#1} {#2} } +\cs_new:Npn \IfInstanceExistsTF #1#2 + { \__template_if_instance_exist:nnTF {#1} {#2} } +\cs_new:Npn \IfInstanceExistsT #1#2 + { \__template_if_instance_exist:nnT {#1} {#2} } +\cs_new:Npn \IfInstanceExistsF #1#2 + { \__template_if_instance_exist:nnF {#1} {#2} } +\cs_new_protected:Npn \KeyValue #1 {#1} +\cs_new_protected:Npn \AssignTemplateKeys { \__template_assignments_pop: } +\cs_new_protected:Npn \SetTemplateKeys #1#2#3 + { \keys_set_known:nnN { template / #1 / #2 } {#3} \l__template_tmp_clist } +\ExplSyntaxOff %%% From File: ltalloc.dtx \chardef\@xxxii=32 \mathchardef\@Mi=10001 @@ -7246,8 +8552,6 @@ Type H <return> for immediate help.}% %% Copyright (C) 2020-2024 %% Frank Mittelbach, The LaTeX Project %%% From File: ltpara.dtx -\def\ltparaversion{v1.0l} -\def\ltparadate{2023/01/30} \ExplSyntaxOn @@ -7276,7 +8580,7 @@ Type H <return> for immediate help.}% \@kernel@before@para@begin \hook_use:n {para/begin} \if_mode_horizontal: \else: - \msg_error:nnnn { hooks }{ para-mode }{begin}{vertical} \fi: + \msg_error:nnnn { hooks }{ para-mode }{begin}{horizontal} \fi: \__para_handle_indent: } \tex_everypar:D{\g__para_standard_everypar_tl} @@ -7347,7 +8651,7 @@ Type H <return> for immediate help.}% \cs_set_eq:NN \par \para_end: \cs_set_eq:NN \@@par \para_end: \cs_set_eq:NN \endgraf \para_end: -\everypar{\@nodocument} %% To get an error if text appears before the +\everypar{\@nodocument} %% To get an error if text appears before the \document \msg_new:nnnn { hooks } { para-mode } { Illegal~mode~ change~ in~ hook~ 'para/#1'.\\ @@ -7377,8 +8681,6 @@ Type H <return> for immediate help.}% %% Copyright (C) 2021-2024 %% Frank Mittelbach, The LaTeX Project %%% From File: ltmeta.dtx -\def\ltmetaversion{v1.0b} -\def\ltmetadate{2022/05/18} \let \IfDocumentMetadataTF \@secondoftwo \protected\def\DocumentMetadata{% \InputIfFileExists{documentmetadata-support.ltx}% @@ -7963,7 +9265,15 @@ Type H <return> for immediate help.}% \@latex@warning@no@line{inputting `#1' instead of obsolete `#2'}} \@onlypreamble\@obsoletefile \let\@filelist\@gobble -\def\listfiles{% +\ExplSyntaxOn +\keys_define:nn { __kernel / listfiles } + { + hashes .legacy_if_set:n = @listfiles@hashes , + sizes .legacy_if_set:n = @listfiles@sizes + } +\ExplSyntaxOff +\NewDocumentCommand\listfiles{O{}}{% + \SetKeys[__kernel/listfiles]{#1}% \let\listfiles\relax \def\@listfiles##1##2##3##4##5##6##7##8##9\@@{% \def\reserved@d{\\}% @@ -7988,8 +9298,30 @@ Type H <return> for immediate help.}% \filename@area\filename@base\\\\\\\\\\\\\\\\\\\@@ \typeout{% \filename@area\reserved@a - \ifx\reserved@b\relax\else\@spaces\reserved@b\fi}}% + \ifx\reserved@b\relax\else\@spaces\reserved@b\fi + \ifnum0% + \if@listfiles@hashes1\fi + \if@listfiles@sizes1\fi + >0 % + ^^J\@spaces + (% + \if@listfiles@sizes + size \@dofilelist@size\@currname + \if@listfiles@hashes + , % + \fi + \fi + \if@listfiles@hashes + hash \@dofilelist@hash\@currname + \fi + )% + \fi + }}% \typeout{ ***********^^J}}} +\ExplSyntaxOn +\cs_new_eq:NN \@dofilelist@hash \file_mdfive_hash:n +\cs_new_eq:NN \@dofilelist@size \file_size:n +\ExplSyntaxOff \@onlypreamble\listfiles \let\@dofilelist\relax %%% From File: ltoutenc.dtx @@ -8294,8 +9626,14 @@ Type H <return> for immediate help.}% \@addtoreset{#1}{@ckpt}% \global\expandafter\let\csname p@#1\endcsname\@empty \expandafter - \gdef\csname the#1\expandafter\endcsname\expandafter - {\expandafter\@arabic\csname c@#1\endcsname}} + \ifx\csname the#1\endcsname\relax + \expandafter + \gdef\csname the#1\expandafter\endcsname\expandafter + {\expandafter\@arabic\csname c@#1\endcsname}% + \else + \@latex@warning{Command `\string\the#1' already + defined -- not changed}% + \fi} \def\@addtoreset#1#2{\expandafter\@cons\csname cl@#2\endcsname {{#1}}} \def\@removefromreset#1#2{% \@ifundefined{c@#2}\relax @@ -8918,7 +10256,7 @@ Type H <return> for immediate help.}% \def\@xxvpt{24.88} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% From File: ltfssaxes.dtx -%% Copyright (C) 1999-2020 Frank Mittelbach +%% Copyright (C) 2019-2020 Frank Mittelbach \def\DeclareFontSeriesChangeRule#1#2#3#4{% \@namedef{series@#1@#2}{{#3}{#4}}} \DeclareFontSeriesChangeRule {bc}{b}{bc}{} @@ -11691,8 +13029,7 @@ Type H <return> for immediate help.}% \DeclareEncodingSubset{TS1}{lmss} {1} \DeclareEncodingSubset{TS1}{lmssq} {1} \DeclareEncodingSubset{TS1}{lmvtt} {1} -\DeclareEncodingSubset{TS1}{lmtt} {1} % missing TM, SM and - % pertenthousand for some reason +\DeclareEncodingSubset{TS1}{lmtt} {1} % missing TM, SM and pertenthousand \DeclareEncodingSubset{TS1}{ptmx} {2} \DeclareEncodingSubset{TS1}{ptmj} {2} \DeclareEncodingSubset{TS1}{ul8} {2} @@ -11730,23 +13067,31 @@ Type H <return> for immediate help.}% \DeclareEncodingSubset{TS1}{lato-*} {0} % with a bunch of tofu inside \DeclareEncodingSubset{TS1}{opensans-*} {0} % with a bunch of tofu inside \DeclareEncodingSubset{TS1}{cantarell-*} {0} % with a bunch of tofu inside -\DeclareEncodingSubset{TS1}{fbb-*} {0} % missing centoldstyle \DeclareEncodingSubset{TS1}{tli} {1} % with lots of tofu inside +\DeclareEncodingSubset{TS1}{fbb-*} {2} % missing centoldstyle \DeclareEncodingSubset{TS1}{Alegreya-*} {2} \DeclareEncodingSubset{TS1}{AlegreyaSans-*} {2} +\DeclareEncodingSubset{TS1}{BaskervilleF-*} {2} \DeclareEncodingSubset{TS1}{DejaVuSans-TLF} {2} \DeclareEncodingSubset{TS1}{DejaVuSansCondensed-TLF} {2} \DeclareEncodingSubset{TS1}{DejaVuSansMono-TLF} {2} \DeclareEncodingSubset{TS1}{EBGaramond-*} {2} +\DeclareEncodingSubset{TS1}{Merriwthr-OsF} {2} +\DeclareEncodingSubset{TS1}{MerriwthrSans-OsF} {2} +\DeclareEncodingSubset{TS1}{Montserrat-*} {2} +\DeclareEncodingSubset{TS1}{MontserratAlternates-*} {2} +\DeclareEncodingSubset{TS1}{NotoSansMono-TLF} {2} +\DeclareEncodingSubset{TS1}{NotoSansMono-TOsF} {2} \DeclareEncodingSubset{TS1}{Tempora-TLF} {2} \DeclareEncodingSubset{TS1}{Tempora-TOsF} {2} +\DeclareEncodingSubset{TS1}{XCharter-TLF} {2} +\DeclareEncodingSubset{TS1}{XCharter-TOsF} {2} +\DeclareEncodingSubset{TS1}{erewhon-*} {2} \DeclareEncodingSubset{TS1}{Arimo-TLF} {3} -\DeclareEncodingSubset{TS1}{Carlito-*} {3} -\DeclareEncodingSubset{TS1}{FiraSans-*} {3} +\DeclareEncodingSubset{TS1}{Crlt-*} {3} +\DeclareEncodingSubset{TS1}{IBMPlexMono-TLF} {3} \DeclareEncodingSubset{TS1}{IBMPlexSans-TLF} {3} -\DeclareEncodingSubset{TS1}{Merriweather-OsF} {3} -\DeclareEncodingSubset{TS1}{Montserrat-*} {3} -\DeclareEncodingSubset{TS1}{MontserratAlternates-*} {3} +\DeclareEncodingSubset{TS1}{IBMPlexSerif-TLF} {3} \DeclareEncodingSubset{TS1}{SourceCodePro-TLF} {3} \DeclareEncodingSubset{TS1}{SourceCodePro-TOsF} {3} \DeclareEncodingSubset{TS1}{SourceSansPro-*} {3} @@ -11761,6 +13106,7 @@ Type H <return> for immediate help.}% \DeclareEncodingSubset{TS1}{CrimsonPro-*} {4} \DeclareEncodingSubset{TS1}{FiraMono-TLF} {4} \DeclareEncodingSubset{TS1}{FiraMono-TOsF} {4} +\DeclareEncodingSubset{TS1}{FiraSans-*} {4} \DeclareEncodingSubset{TS1}{Go-TLF} {4} \DeclareEncodingSubset{TS1}{GoMono-TLF} {4} \DeclareEncodingSubset{TS1}{InriaSans-*} {4} @@ -11773,7 +13119,6 @@ Type H <return> for immediate help.}% \DeclareEncodingSubset{TS1}{LinguisticsPro-OsF} {4} \DeclareEncodingSubset{TS1}{LinuxBiolinumT-*} {4} \DeclareEncodingSubset{TS1}{LinuxLibertineT-*} {4} -\DeclareEncodingSubset{TS1}{MerriweatherSans-OsF} {4} \DeclareEncodingSubset{TS1}{MintSpirit-*} {4} \DeclareEncodingSubset{TS1}{MintSpiritNoTwo-*} {4} \DeclareEncodingSubset{TS1}{PTMono-TLF} {4} @@ -11790,57 +13135,50 @@ Type H <return> for immediate help.}% \DeclareEncodingSubset{TS1}{Rosario-*} {4} \DeclareEncodingSubset{TS1}{SticksTooText-*} {4} \DeclareEncodingSubset{TS1}{UniversalisADFStd-LF} {4} -\DeclareEncodingSubset{TS1}{Almendra-OsF} {5} +\DeclareEncodingSubset{TS1}{Almndr-OsF} {5} \DeclareEncodingSubset{TS1}{Baskervaldx-*} {5} -\DeclareEncodingSubset{TS1}{BaskervilleF-*} {5} -\DeclareEncodingSubset{TS1}{Bitter-TLF} {5} +\DeclareEncodingSubset{TS1}{Bttr-TLF} {5} \DeclareEncodingSubset{TS1}{Cinzel-LF} {5} \DeclareEncodingSubset{TS1}{CinzelDecorative-LF} {5} +\DeclareEncodingSubset{TS1}{Cochineal-*} {5} \DeclareEncodingSubset{TS1}{DejaVuSerif-TLF} {5} \DeclareEncodingSubset{TS1}{DejaVuSerifCondensed-TLF} {5} \DeclareEncodingSubset{TS1}{GilliusADF-LF} {5} \DeclareEncodingSubset{TS1}{GilliusADFCond-LF} {5} \DeclareEncodingSubset{TS1}{GilliusADFNoTwo-LF} {5} \DeclareEncodingSubset{TS1}{GilliusADFNoTwoCond-LF} {5} -\DeclareEncodingSubset{TS1}{LobsterTwo-LF} {5} \DeclareEncodingSubset{TS1}{OldStandard-TLF} {5} -\DeclareEncodingSubset{TS1}{PlayfairDisplay-TLF} {5} -\DeclareEncodingSubset{TS1}{PlayfairDisplay-TOsF} {5} +\DeclareEncodingSubset{TS1}{PlyfrDisplay-TLF} {5} +\DeclareEncodingSubset{TS1}{PlyfrDisplay-TOsF} {5} \DeclareEncodingSubset{TS1}{TheanoDidot-TLF} {5} \DeclareEncodingSubset{TS1}{TheanoDidot-TOsF} {5} \DeclareEncodingSubset{TS1}{TheanoModern-TLF} {5} \DeclareEncodingSubset{TS1}{TheanoModern-TOsF} {5} \DeclareEncodingSubset{TS1}{TheanoOldStyle-TLF} {5} \DeclareEncodingSubset{TS1}{TheanoOldStyle-TOsF} {5} +\DeclareEncodingSubset{TS1}{charssil-TLF} {5} \DeclareEncodingSubset{TS1}{Crimson-TLF} {6} -\DeclareEncodingSubset{TS1}{IBMPlexMono-TLF} {6} -\DeclareEncodingSubset{TS1}{IBMPlexSerif-TLF} {6} -\DeclareEncodingSubset{TS1}{LibertinusMono-TLF} {6} \DeclareEncodingSubset{TS1}{LibertinusSerifDisplay-LF}{6} \DeclareEncodingSubset{TS1}{LinuxLibertineDisplayT-*} {6} \DeclareEncodingSubset{TS1}{LinuxLibertineMonoT-LF} {6} \DeclareEncodingSubset{TS1}{LinuxLibertineMonoT-TLF} {6} -\DeclareEncodingSubset{TS1}{Overlock-LF} {6} +\DeclareEncodingSubset{TS1}{Ovrlck-LF} {6} +\DeclareEncodingSubset{TS1}{ComicNeue-TLF} {7} +\DeclareEncodingSubset{TS1}{ComicNeueAngular-TLF} {7} \DeclareEncodingSubset{TS1}{CormorantGaramond-*} {7} \DeclareEncodingSubset{TS1}{Heuristica-TLF} {7} \DeclareEncodingSubset{TS1}{Heuristica-TOsF} {7} \DeclareEncodingSubset{TS1}{IMFELLEnglish-TLF} {7} -\DeclareEncodingSubset{TS1}{LibreBaskerville-TLF} {7} -\DeclareEncodingSubset{TS1}{LibreCaslon-*} {7} -\DeclareEncodingSubset{TS1}{Marcellus-LF} {7} +\DeclareEncodingSubset{TS1}{LibreBskrvl-TLF} {7} +\DeclareEncodingSubset{TS1}{LibreCsln-*} {7} +\DeclareEncodingSubset{TS1}{Lbstr-LF} {7} +\DeclareEncodingSubset{TS1}{Mrcls-LF} {7} \DeclareEncodingSubset{TS1}{NotoSans-*} {7} -\DeclareEncodingSubset{TS1}{NotoSansMono-TLF} {7} -\DeclareEncodingSubset{TS1}{NotoSansMono-TOsF} {7} \DeclareEncodingSubset{TS1}{NotoSerif-*} {7} -\DeclareEncodingSubset{TS1}{Quattrocento-TLF} {7} -\DeclareEncodingSubset{TS1}{QuattrocentoSans-TLF} {7} -\DeclareEncodingSubset{TS1}{XCharter-TLF} {7} -\DeclareEncodingSubset{TS1}{XCharter-TOsF} {7} -\DeclareEncodingSubset{TS1}{erewhon-*} {7} -\DeclareEncodingSubset{TS1}{ComicNeue-TLF} {7} -\DeclareEncodingSubset{TS1}{ComicNeueAngular-TLF} {7} -\DeclareEncodingSubset{TS1}{Forum-LF} {7} % the superiors are missing -\DeclareEncodingSubset{TS1}{Cochineal-*} {8} +\DeclareEncodingSubset{TS1}{Quattro-LF} {7} +\DeclareEncodingSubset{TS1}{QuattroSans-LF} {7} +\DeclareEncodingSubset{TS1}{Frm-LF} {7} % the superiors are missing +\DeclareEncodingSubset{TS1}{LibertinusMono-TLF} {8} \DeclareEncodingSubset{TS1}{AlgolRevived-TLF} {9} \def\UseLegacyTextSymbols{% \DeclareTextSymbolDefault{\textasteriskcentered}{OMS}% @@ -11874,7 +13212,6 @@ Type H <return> for immediate help.}% \DeclareTextSymbolDefault{\textlegacysection}{OMS} - %%% From File: ltpageno.dtx \message{page nos.,} \countdef\c@page=0 \c@page=1 @@ -11949,12 +13286,7 @@ Type H <return> for immediate help.}% \NewDocumentCommand\Ref{s} {\IfBooleanTF{#1}{\@kernel@sRef}{\@kernel@Ref}} \def\@currentlabel{} -%% File: ltproperties.dtx -\def\ltpropertiesversion{1.0c} -\def\ltpropertiesdate{2023-10-15} - - - +%%% From File: ltproperties.dtx \ExplSyntaxOn \cs_new_protected:Npn \property_new:nnnn #1#2#3#4 { @@ -12007,7 +13339,7 @@ Type H <return> for immediate help.}% { \legacy_if:nT { @filesw } { - \iow_shipout_x:Nx \@auxout + \protected@write \@auxout {} { \token_to_str:N \new@label@record {#1} @@ -12119,7 +13451,9 @@ Type H <return> for immediate help.}% } } \prg_generate_conditional_variant:Nnn \property_if_exist:n {e} {TF} -\cs_new_eq:NN \IfPropertyExistTF \property_if_exist:eTF +\cs_new_eq:NN \IfPropertyExistsTF \property_if_exist:eTF +\cs_new:Npn \IfPropertyExistsT #1#2 {\property_if_exist:eTF {#1}{#2}{} } +\cs_new:Npn \IfPropertyExistsF #1 {\property_if_exist:eTF {#1}{} } \prg_new_conditional:Npnn \property_if_recorded:n #1 { p , T , F, TF } % #1 label { @@ -12132,7 +13466,9 @@ Type H <return> for immediate help.}% } } \prg_generate_conditional_variant:Nnn \property_if_recorded:n {e} {TF} -\cs_new_eq:NN \IfLabelExistTF \property_if_recorded:eTF +\cs_new_eq:NN \IfLabelExistsTF \property_if_recorded:eTF +\cs_new:Npn \IfLabelExistsT #1#2 {\property_if_exist:eTF {#1}{#2}{} } +\cs_new:Npn \IfLabelExistsF #1 {\property_if_exist:eTF {#1}{} } \prg_new_conditional:Npnn \property_if_recorded:nn #1#2 { p , T , F, TF } % #1 label #2 property { @@ -13334,7 +14670,16 @@ Type H <return> for immediate help.}% \box\@tempboxa \@end@tempboxa} \def\@finalstrut#1{% - \unskip\ifhmode\nobreak\fi\vrule\@width\z@\@height\z@\@depth\dp#1} + \unskip + \ifhmode \nobreak \vrule + \else + \ifdim \prevdepth=-\@m\p@ + \else + \vskip-\prevdepth + \fi + \hrule + \fi + \@width\z@\@height\z@\@depth\dp#1} \def\@@line{\hb@xt@\hsize} \DeclareRobustCommand\leftline[1]{\@@line{#1\hss}} \DeclareRobustCommand\rightline[1]{\@@line{\hss#1}} @@ -14129,7 +15474,7 @@ Type H <return> for immediate help.}% \global\@namedef{#1}{\@thm{#2}{#3}}% \global\@namedef{end#1}{\@endtheorem}}}} \def\@thm#1#2{% - \refstepcounter{#1}% + \@kernel@refstepcounter{#1}% \@ifnextchar[{\@ythm{#1}{#2}}{\@xthm{#1}{#2}}} \def\@xthm#1#2{% \@begintheorem{#2}{\csname the#1\endcsname}\ignorespaces} @@ -14138,9 +15483,9 @@ Type H <return> for immediate help.}% \def\@thmcounter#1{\noexpand\arabic{#1}} \def\@thmcountersep{.} \def\@begintheorem#1#2{\trivlist - \item[\hskip \labelsep{\bfseries #1\ #2}]\itshape} + \item[\MakeLinkTarget{\@currentcounter}\hskip \labelsep{\bfseries #1\ #2}]\itshape} \def\@opargbegintheorem#1#2#3{\trivlist - \item[\hskip \labelsep{\bfseries #1\ #2\ (#3)}]\itshape} + \item[\MakeLinkTarget{\@currentcounter}\hskip \labelsep{\bfseries #1\ #2\ (#3)}]\itshape} \def\@endtheorem{\endtrivlist} %%% From File: ltsect.dtx \message{title,} @@ -14731,8 +16076,6 @@ Type H <return> for immediate help.}% %% Copyright (C) 2022-2024 %% Frank Mittelbach, The LaTeX Project %%% From File: ltmarks.dtx -\def\ltmarksversion{v1.0d} -\def\ltmarksdate{2022/06/01} %% \end{function} \ExplSyntaxOn @@ -14770,42 +16113,87 @@ Type H <return> for immediate help.}% \tl_new:c { g__mark_last-column_top_ #1 _tl } \tl_new:c { g__mark_last-column_first_ #1 _tl } \tl_new:c { g__mark_last-column_last_ #1 _tl } + \tl_set:cn { g__mark_page_top_ #1 _tl }{ \__mark_id:n{0} } + \tl_set:cn { g__mark_page_first_ #1 _tl }{ \__mark_id:n{0} } + \tl_set:cn { g__mark_page_last_ #1 _tl }{ \__mark_id:n{0} } + \tl_set:cn { g__mark_previous-page_top_ #1 _tl }{ \__mark_id:n{0} } + \tl_set:cn { g__mark_previous-page_first_ #1 _tl }{ \__mark_id:n{0} } + \tl_set:cn { g__mark_previous-page_last_ #1 _tl }{ \__mark_id:n{0} } + \tl_set:cn { g__mark_column_top_ #1 _tl }{ \__mark_id:n{0} } + \tl_set:cn { g__mark_column_first_ #1 _tl }{ \__mark_id:n{0} } + \tl_set:cn { g__mark_column_last_ #1 _tl }{ \__mark_id:n{0} } + \tl_set:cn { g__mark_previous-column_top_ #1 _tl }{ \__mark_id:n{0} } + \tl_set:cn { g__mark_previous-column_first_ #1 _tl }{ \__mark_id:n{0} } + \tl_set:cn { g__mark_previous-column_last_ #1 _tl }{ \__mark_id:n{0} } + \tl_set:cn { g__mark_first-column_top_ #1 _tl }{ \__mark_id:n{0} } + \tl_set:cn { g__mark_first-column_first_ #1 _tl }{ \__mark_id:n{0} } + \tl_set:cn { g__mark_first-column_last_ #1 _tl }{ \__mark_id:n{0} } + \tl_set:cn { g__mark_last-column_top_ #1 _tl }{ \__mark_id:n{0} } + \tl_set:cn { g__mark_last-column_first_ #1 _tl }{ \__mark_id:n{0} } + \tl_set:cn { g__mark_last-column_last_ #1 _tl }{ \__mark_id:n{0} } } \box_new:N \l__mark_box +\box_new:N \l__mark_ii_box \tl_new:N \g__mark_tmp_tl \tl_new:N \g__mark_new_top_tl -\cs_new_protected:Npn \__mark_update_structure:nn #1#2 - { - \__mark_update_structure_alias:nn { previous-#1 } {#1} +\cs_new_protected:Npn \__mark_extract_and_handle_marks:nn #1#2 { \group_begin: \dim_set_eq:NN \tex_splitmaxdepth:D \c_max_dim \int_set_eq:NN \tex_vbadness:D \c_max_int \dim_set_eq:NN \tex_vfuzz:D \c_max_dim - \vbox_set_to_ht:Nnn \l__mark_box { -.5\c_max_dim } + \__mark_prepare_and_extract:nn {#1} {#2} + \group_end: + } +\cs_new_protected:Npn \__mark_prepare_and_extract:nn #1#2 { + \vbox_set:Nn \l__mark_box + { + #2 + \tex_unskip:D + \box_set_to_last:N \l__mark_box + \int_compare:nNnT \tex_lastnodetype:D < 0 { - #2 - \tex_unskip:D - \box_set_to_last:N \l__mark_box - \int_compare:nNnT \tex_lastnodetype:D < 0 - { - \box_if_vertical:NT \l__mark_box - { - \vbox_set_to_ht:Nnn \l__mark_box { -.5\c_max_dim } - { - \vbox_unpack:N \l__mark_box - \tex_kern:D \c_zero_dim % ensure that box - % is not empty - } - \int_compare:nNnT \tex_badness:D > 0 - { \vbox_unpack:N \l__mark_box } - } - } - \tex_kern:D \c_zero_dim + \box_if_vertical:NT \l__mark_box + { \vbox_unpack:N \l__mark_box } } - \int_compare:nNnTF \tex_badness:D > 0 - { - \vbox_set_split_to_ht:NNn \l__mark_box \l__mark_box \c_max_dim - \seq_map_inline:Nn \g__mark_classes_seq + } + \__mark_vbox_set_split_to_maxdimen:NN \l__mark_ii_box \l__mark_box + \box_if_empty:NTF \l__mark_box + { #1 } + { + \__mark_debug:n { \iow_term:x + { Marks:~ mark~ extraction~needs~ recursion~ + \msg_line_context: } } + \__mark_prepare_and_extract:nn {#1} + { \vbox_unpack:N \l__mark_ii_box + \vbox_unpack:N \l__mark_box } + } +} +\cs_set_eq:cN {Infinite~shrink~error~above~ignored~!}\c_max_dim +\cs_new_protected:Npx \__mark_vbox_set_split_to_maxdimen:NN #1#2 { + \tl_set:Ne \exp_not:N \l__mark_saved_parameters_tl + { + \tex_interactionmode:D + \exp_not:N \int_use:N \tex_interactionmode:D \scan_stop: + \tex_escapechar:D + \exp_not:N \int_use:N \tex_escapechar:D \scan_stop: + } + \tex_escapechar:D -1 \scan_stop: + \tex_interactionmode:D 0 \scan_stop: + \tex_setbox:D #1 \tex_vsplit:D #2 to + \exp_not:N \use:n { + \use:c{Infinite~shrink~error~above~ignored~!} + } + \exp_not:N \l__mark_saved_parameters_tl +} +\tl_new:N \l__mark_saved_parameters_tl +\cs_new_protected:Npn \__mark_update_structure_from_material:nn #1#2 { + \__mark_extract_and_handle_marks:nn + { \__mark_update_structure_from_splitmarks:n {#1} } + { #2 } +} +\cs_new_protected:Npn \__mark_update_structure_from_splitmarks:n #1 { + \__mark_update_structure_alias:nn { previous-#1 } {#1} + \seq_map_inline:Nn \g__mark_classes_seq { \tl_gset_eq:Nc \g__mark_new_top_tl { g__mark_#1_last_##1_tl } \tl_gset_eq:cN { g__mark_#1_top_##1_tl } \g__mark_new_top_tl @@ -14827,19 +16215,49 @@ Type H <return> for immediate help.}% } } } - } - { - \msg_error:nnn { mark } { infinite-shrinkage } {#1} - \seq_map_inline:Nn \g__mark_classes_seq +} +\cs_new_protected:Npn \__mark_get_marks_for_reinsertion:nNN #1#2#3 { + \tl_clear:N \g__mark_first_marks_tl + \tl_clear:N \g__mark_last_marks_tl + \__mark_extract_and_handle_marks:nn + \__mark_get_from_splitmarks: + { #1 } + \tl_set_eq:NN #2 \g__mark_first_marks_tl + \tl_set_eq:NN #3 \g__mark_last_marks_tl +} +\cs_new_protected:Npn \__mark_get_from_splitmarks: { + \seq_map_inline:Nn \g__mark_classes_seq { - \tl_gset_eq:cc { g__mark_#1_top_ ##1_tl } - { g__mark_#1_last_ ##1_tl } - \tl_gset_eq:cc { g__mark_#1_first_##1_tl } - { g__mark_#1_last_ ##1_tl } + \tl_gset:No \g__mark_tmp_tl + { \tex_splitbotmarks:D \use:c { c__mark_class_##1_mark } } + + \tl_if_empty:NTF \g__mark_tmp_tl + { + \__mark_debug:n { \iow_term:x { Marks:~no~ marks~ + for~ class~ '##1'~\msg_line_context: } } + } + { + \__mark_debug:n { \iow_term:x { Marks:~ extract~ last~ + mark~ for~ class~ '##1'~ =~ \g__mark_tmp_tl } } + \tl_gput_right:Ne \g__mark_last_marks_tl + { \mark_insert:nn {##1} { \g__mark_tmp_tl } } + \__mark_debug:n { \iow_term:x { Marks:~ extract~ first~ + mark~ for~ class~ '##1'~ =~ + \tex_splitfirstmarks:D + \use:c { c__mark_class_##1_mark } + } } + \tl_gput_right:Ne \g__mark_first_marks_tl + { \mark_insert:nn {##1} + { + \tex_splitfirstmarks:D + \use:c { c__mark_class_##1_mark } + } + } + } } - } - \group_end: - } +} +\tl_new:N \g__mark_first_marks_tl +\tl_new:N \g__mark_last_marks_tl \cs_new_protected:Npn \__mark_update_structure_alias:nn #1#2 { \seq_map_inline:Nn \g__mark_classes_seq { @@ -14869,14 +16287,16 @@ Type H <return> for immediate help.}% \group_begin: \@kernel@before@insertmark \hook_use:n { insertmark } - \unrestored@protected@xdef \g__mark_tmp_tl {#2} + \unrestored@protected@xdef \g__mark_tmp_tl + { + \__mark_id:n{ \int_use:N\g__mark_int } + #2 + } \__mark_debug:n{ \iow_term:x { Marks:~ set~#1~<-~ '\tl_to_str:V \g__mark_tmp_tl' ~ \msg_line_context: } } \tex_marks:D \use:c { c__mark_class_ #1 _mark } { - \tl_if_empty:NTF \g__mark_tmp_tl - { \exp_not:n { \prg_do_nothing: } } - { \exp_not:o { \g__mark_tmp_tl } } + \exp_not:o { \g__mark_tmp_tl } } \group_end: \if@nobreak\ifvmode\nobreak\fi\fi @@ -14886,15 +16306,23 @@ Type H <return> for immediate help.}% { \tl_to_str:n {#1} } } } +\cs_new_protected:Npn \__mark_id:n #1 { } +\int_new:N \g__mark_int \cs_new:Npn \@kernel@before@insertmark { \cs_set_eq:NN \label \scan_stop: \cs_set_eq:NN \index \scan_stop: \cs_set_eq:NN \glossary \scan_stop: + \int_compare:nNnTF \g__mark_int < {99999} + { \int_gincr:N \g__mark_int } + { \int_gzero:N \g__mark_int } + } \hook_new:n {insertmark} -\cs_new:Npn \mark_use_first:nn #1#2 { \exp_not:v { g__mark_#1_first_#2_tl } } -\cs_new:Npn \mark_use_last:nn #1#2 { \exp_not:v { g__mark_#1_last_#2_tl } } -\cs_new:Npn \mark_use_top:nn #1#2 { \exp_not:v { g__mark_#1_top_#2_tl } } +\cs_new:Npn \mark_use_first:nn #1#2 { \__mark_use:v { g__mark_#1_first_#2_tl } } +\cs_new:Npn \mark_use_last:nn #1#2 { \__mark_use:v { g__mark_#1_last_#2_tl } } +\cs_new:Npn \mark_use_top:nn #1#2 { \__mark_use:v { g__mark_#1_top_#2_tl } } +\cs_new:Npn \__mark_use:n #1 { \exp_not:o { \use_none:nn #1 } } +\cs_generate_variant:Nn \__mark_use:n { v } \prg_new_conditional:Npnn \mark_if_eq:nnnn #1#2#3#4 { T , F , TF } { \tl_if_eq:ccTF { g__mark_ #1 _#3_ #2 _tl } @@ -14934,15 +16362,6 @@ Type H <return> for immediate help.}% all~columns~have~been~assembled. \c__msg_return_text_tl } -\msg_new:nnnn { mark } { infinite-shrinkage } - { Infinite~shrinkage~found~in~'#1'. } - { - \c__msg_coding_error_text_tl - The~mark~region~'#1'~contains~some~infinite~negative~glue~ - allowing~it~to~shrink~to~an~arbitrary~size.~ - This~makes~it~impossible~to~split~the~region~apart~to~ - get~at~its~marks.~They~are~lost. - } \bool_new:N \g__mark_debug_bool \cs_new_eq:NN \__mark_debug:n \use_none:n \cs_new_protected:Npn \mark_debug_on: @@ -14995,6 +16414,9 @@ Type H <return> for immediate help.}% \seq_map_inline:Nn \g__mark_classes_seq { \__mark_class_status:nn {#1} {##1} } } +\cs_new_protected:Npn \ShowMarksAt #1 { + \__mark_debug:n { \__mark_status:n {#1} } +} \cs_new_eq:NN \NewMarkClass \mark_new_class:n \@onlypreamble \NewMarkClass \cs_new_eq:NN \InsertMark \mark_insert:nn @@ -15010,11 +16432,11 @@ Type H <return> for immediate help.}% \cs_new_protected:Npn \__mark_update_singlecol_structures: { \box_if_vertical:NTF \@outputbox { - \__mark_update_structure:nn {page} + \__mark_update_structure_from_material:nn {page} { \vbox_unpack:N \@outputbox } } { - \__mark_update_structure:nn {page} + \__mark_update_structure_from_material:nn {page} { \hbox_unpack:N \@outputbox } } \__mark_update_structure_alias:nn {previous-column}{previous-page} @@ -15038,11 +16460,11 @@ Type H <return> for immediate help.}% \cs_new_protected:Npn \__mark_update_dblcol_structures: { \box_if_vertical:NTF \@outputbox { - \__mark_update_structure:nn {column} + \__mark_update_structure_from_material:nn {column} { \vbox_unpack:N \@outputbox } } { - \__mark_update_structure:nn {column} + \__mark_update_structure_from_material:nn {column} { \hbox_unpack:N \@outputbox } } \legacy_if:nTF {@firstcolumn} @@ -15062,10 +16484,19 @@ Type H <return> for immediate help.}% { g__mark_page_last_ ##1 _tl } \tl_gset_eq:cc { g__mark_page_top_ ##1 _tl } { g__mark_first-column_top_ ##1 _tl } - \tl_gset_eq:cc { g__mark_ page_first_ ##1 _tl } + + \tl_if_eq:ccTF { g__mark_first-column_top_ ##1 _tl } { g__mark_first-column_first_ ##1 _tl } - \tl_gset_eq:cc { g__mark_page_last_ ##1 _tl } - { g__mark_last-column_last_ ##1 _tl } + { + \tl_gset_eq:cc { g__mark_page_first_ ##1 _tl } + { g__mark_last-column_first_ ##1 _tl } + } + { + \tl_gset_eq:cc { g__mark_page_first_ ##1 _tl } + { g__mark_first-column_first_ ##1 _tl } + } + \tl_gset_eq:cc { g__mark_page_last_ ##1 _tl } + { g__mark_last-column_last_ ##1 _tl } } } \__mark_debug:n @@ -15255,6 +16686,30 @@ Type H <return> for immediate help.}% \let \IfClassLoadedTF \@ifclassloaded \let \IfPackageLoadedWithOptionsTF \@ifpackagewith \let \IfClassLoadedWithOptionsTF \@ifclasswith +\def\IfPackageLoadedT #1#2{\IfPackageLoadedTF{#1}{#2}{}} +\def\IfPackageLoadedF #1{\IfPackageLoadedTF{#1}{}} +\def\IfClassLoadedT #1#2{\IfClassLoadedTF{#1}{#2}{}} +\def\IfClassLoadedF #1{\IfClassLoadedTF{#1}{}} +\def\IfPackageAtLeastT#1#2#3{\IfPackageAtLeastTF{#1}{#2}{#3}{}} +\def\IfPackageAtLeastF #1#2{\IfPackageAtLeastTF{#1}{#2}{}} +\def\IfClassAtLeastT #1#2#3{\IfClassAtLeastTF{#1}{#2}{#3}{}} +\def\IfClassAtLeastF #1#2{\IfClassAtLeastTF{#1}{#2}{}} +\def\IfFileAtLeastT #1#2#3{\IfFileAtLeastTF{#1}{#2}{#3}{}} +\def\IfFileAtLeastF #1#2{\IfFileAtLeastTF{#1}{#2}{}} +\def\IfFormatAtLeastT #1#2{\IfFormatAtLeastTF{#1}{#2}{}} +\def\IfFormatAtLeastF #1{\IfFormatAtLeastTF{#1}{}} +\def\IfPackageLoadedWithOptionsT #1#2#3{\IfPackageLoadedWithOptionsTF{#1}{#2}{#3}{}} +\def\IfPackageLoadedWithOptionsF #1#2{\IfPackageLoadedWithOptionsTF{#1}{#2}{}} +\def\IfClassLoadedWithOptionsT #1#2#3{\IfClassLoadedWithOptionsTF{#1}{#2}{#3}{}} +\def\IfClassLoadedWithOptionsF #1#2{\IfClassLoadedWithOptionsTF{#1}{#2}{}} +\def\IfFileLoadedTF#1{% + \expandafter\ifx\csname ver@#1\endcsname\relax + \expandafter\@secondoftwo + \else + \expandafter\@firstoftwo + \fi} +\def\IfFileLoadedT#1#2{\IfFileLoadedTF{#1}{#2}{}} +\def\IfFileLoadedF #1{\IfFileLoadedTF{#1}{}} \def\ProvidesPackage#1{% \xdef\@gtempa{#1}% \@expandtwoargs\@expl@str@if@eq@@nnTF @@ -15305,11 +16760,11 @@ Type H <return> for immediate help.}% \expandafter\let \csname opt@#3.#1\expandafter\endcsname \csname opt@\reserved@a\endcsname - \@ifundefined{@raw@opt@#3.#1}% - {\expandafter\gdef\csname @raw@opt@#3.#1\expandafter\endcsname - \expandafter{#2}}% - {\expandafter\g@addto@macro\csname @raw@opt@#3.#1\expandafter\endcsname - \expandafter{\expandafter,#2}}% + \@ifundefined{@raw@opt@#3.#1}% + {\expandafter\gdef\csname @raw@opt@#3.#1\expandafter\endcsname + \expandafter{#2}}% + {\expandafter\g@addto@macro\csname @raw@opt@#3.#1\expandafter\endcsname + \expandafter{\expandafter,#2}}% } \@onlypreamble\@pass@ptions \def\PassOptionsToPackage{\@pass@ptions\@pkgextension} @@ -15474,6 +16929,11 @@ Type H <return> for immediate help.}% \ifx#2\@empty\else\expandafter\zap@space\fi #2} \def\@fileswithoptions#1{% + \ifnum\currentgrouplevel>\z@ + \@latex@error + {Loading a class or package in a group}% + {Classes and packages should only be loaded at the top level}% + \fi \@ifnextchar[%] {\@fileswith@ptions#1}% {\@fileswith@ptions#1[]}} @@ -15524,9 +16984,12 @@ Type H <return> for immediate help.}% \@ifundefined{opt@handler@\@currname.\@currext} {\@onefilewithoptions@clashchk{#2}} {% - \expandafter\protected@edef\csname opt@\@currname.\@currext\endcsname + \expandafter\protected@edef + \csname opt@\@currname.\@currext\endcsname {\zap@space#2 \@empty}% - \@namedef{@raw@opt@\@currname.\@currext}{#2}% + \expandafter\def + \csname @raw@opt@\@currname.\@currext\expandafter\endcsname + \expandafter{#2}% \@nameuse{opt@handler@\@currname.\@currext}% }% }% @@ -16260,8 +17723,6 @@ Type H <return> for immediate help.}% { \__keys_options_expand_module:Nn \keys_set:nn {#1} {#2} } \ExplSyntaxOff %%% From File: ltfilehook.dtx -\providecommand\ltfilehookversion{v1.0o} -\providecommand\ltfilehookdate{2023/07/10} \ExplSyntaxOn \tl_new:N \CurrentFile \tl_new:N \CurrentFilePath @@ -16551,8 +18012,6 @@ Type H <return> for immediate help.}% %% Frank Mittelbach, The LaTeX Project %% %%% From File: ltshipout.dtx -\providecommand\ltshipoutversion{v1.0n} -\providecommand\ltshipoutdate{2022/11/08} \ExplSyntaxOn \bool_new:N \g__shipout_debug_bool \cs_new_eq:NN \__shipout_debug:n \use_none:n @@ -18070,6 +19529,198 @@ Type H <return> for immediate help.}% \let\topfigrule=\relax \let\botfigrule=\relax \let\dblfigrule=\relax +%%% From File: lttagging.dtx +\ExplSyntaxOn +\cs_new_eq:NN \SuspendTagging \use_none:n +\cs_new_eq:NN \ResumeTagging \use_none:n +\AddToHook{begindocument/before}{ + \cs_if_exist:NT \tag_stop:n + { + \cs_set:Npn \SuspendTagging #1 { + \tag_stop:n {#1} + } + \cs_set:Npn \ResumeTagging #1 { \tag_start:n {#1} } + } +} +\AddToHook{begindocument}[kernel]{ + \cs_if_exist:NF \tag_if_active:T + { + \prg_new_conditional:Npnn \tag_if_active: { p , T , TF, F } + { \prg_return_false: } + } +} +\cs_new_protected:Npn \tag_socket_use:n #1 { } +\cs_new_protected:Npn \tag_socket_use:nn #1#2 { } +\cs_new_protected:Npn \UseTaggingSocket #1 { + \int_case:nnF + { \int_use:c { c__socket_tagsupport/#1_args_int } } + { + 0 \prg_do_nothing: + 1 \use_none:n + 2 \use_none:nn + } + \ERRORusetaggingsocket % that should get a proper error message +} +\ExplSyntaxOff +\NewSocket{tagsupport/tbl/cell/begin}{0} +\NewSocket{tagsupport/tbl/cell/end}{0} +\NewSocket{tagsupport/tbl/row/begin}{0} +\NewSocket{tagsupport/tbl/row/end}{0} +\NewSocket{tagsupport/tbl/pcell/begin}{0} +\NewSocket{tagsupport/tbl/pcell/end}{0} +\NewSocket{tagsupport/tbl/init}{0} +\NewSocket{tagsupport/tbl/finalize}{0} + +\NewSocket{tagsupport/tbl/colspan}{1} + +\NewSocket{tagsupport/tbl/hmode/begin}{0} +\NewSocket{tagsupport/tbl/hmode/end}{0} +\NewSocket{tagsupport/tbl/vmode/begin}{0} +\NewSocket{tagsupport/tbl/vmode/end}{0} +\NewSocket{tagsupport/tbl/longtable/init}{0} +\NewSocket{tagsupport/tbl/longtable/finalize}{0} +\NewSocket{tagsupport/tbl/longtable/head}{0} +\NewSocket{tagsupport/tbl/longtable/foot}{0} +\ExplSyntaxOn +\int_new:N \g__tbl_col_int +\int_new:N \g__tbl_row_int +\tl_new:N \g__tbl_span_tl +\tl_new:N \g__tbl_table_cols_tl + +\tl_gset:Nn \g__tbl_span_tl {1} +\tl_gset:Nn \g__tbl_table_cols_tl {0} % indicates outer level +\tl_new:N \l__tbl_saved_col_tl +\tl_new:N \l__tbl_saved_row_tl +\tl_new:N \l__tbl_saved_span_tl +\tl_new:N \l__tbl_saved_table_cols_tl + +\tl_set:Nn \l__tbl_saved_col_tl{0} +\tl_set:Nn \l__tbl_saved_row_tl{0} +\tl_set:Nn \l__tbl_saved_span_tl{1} +\tl_set:Nn \l__tbl_saved_table_cols_tl{0} % indicates outer level +\int_new:N \g__tbl_missing_cells_int +\def\DebugTablesOn{ + \cs_set_eq:NN \__tbl_trace:n \typeout +} +\def\DebugTablesOff{ + \cs_set_eq:NN \__tbl_trace:n \use_none:n +} +\cs_new_eq:NN \__tbl_trace:n \use_none:n +\cs_new_protected:Npn \tbl_update_cell_data: { + \int_gadd:Nn \g__tbl_col_int { \g__tbl_span_tl } + \tl_gset:Nn \g__tbl_span_tl {1} +} +\cs_new:Npn \tbl_count_table_cols: { + \seq_set_split:NnV\l__tbl_tmpa_seq {&}\@preamble + \tl_gset:Ne \g__tbl_table_cols_tl { \seq_count:N \l__tbl_tmpa_seq } + \__tbl_trace:n { ==>~ Table~ has~ \g__tbl_table_cols_tl \space columns } +} +\seq_new:N \l__tbl_tmpa_seq +\cs_new:Npn \tbl_count_missing_cells:n #1 { + \tag_if_active:T { + \int_compare:nNnT \g__tbl_col_int > 0 + { + \int_gset:Nn \g__tbl_missing_cells_int + { + \g__tbl_table_cols_tl + - \g__tbl_col_int + - \g__tbl_span_tl + + 1 + } + \int_compare:nNnT \g__tbl_missing_cells_int < 0 \ERRORmissingcells % should not happen + \__tbl_trace:n{==>~ + (#1)~ + This~ row~ needs~ + \int_use:N \g__tbl_missing_cells_int \space + additional~ cell(s) + } + } + } +} +\cs_new_protected:Npn \tbl_save_outer_table_cols: { + \tl_set_eq:NN \l__tbl_saved_table_cols_tl \g__tbl_table_cols_tl +} +\cs_new_protected:Npn \tbl_init_cell_data_for_table: { + \tl_set:No \l__tbl_saved_col_tl {\int_use:N \g__tbl_col_int } + \tl_set:No \l__tbl_saved_row_tl {\int_use:N \g__tbl_row_int } + \tl_set_eq:NN \l__tbl_saved_span_tl \g__tbl_span_tl + \__tbl_trace:n { ==>~ saved~cell~data:~ + \l__tbl_saved_row_tl, + \l__tbl_saved_col_tl, + \l__tbl_saved_span_tl \space + ( + \int_compare:nNnTF \l__tbl_saved_table_cols_tl = 0 + { outer~ level } + { max:~ \l__tbl_saved_table_cols_tl } + ) + } + \int_gzero:N \g__tbl_row_int + \int_gzero:N \g__tbl_col_int + \tl_gset:Nn \g__tbl_span_tl {1} +} +\cs_new_protected:Npn \tbl_update_cell_data_for_next_row: { + \int_gincr:N \g__tbl_row_int % this row about to start + \int_gzero:N \g__tbl_col_int % we are before first col +} +\cs_new_protected:Npn \tbl_init_cell_data_for_row: { + \int_gset:Nn \g__tbl_col_int {1} + \tl_gset:Nn \g__tbl_span_tl {1} +} +\cs_new:Npn \tbl_if_row_was_started:T { + \int_compare:nNnT \g__tbl_col_int > 0 +} +\cs_new:Npn \tbl_if_row_was_started:TF { + \int_compare:nNnTF \g__tbl_col_int > 0 +} +\cs_new_protected:Npn \tbl_gzero_row_count: { + \int_gzero:N \g__tbl_row_int +} +\cs_new_protected:Npn \tbl_gincr_row_count: { + \int_gincr:N \g__tbl_row_int +} +\cs_new_protected:Npn \tbl_gdecr_row_count: { + \int_gdecr:N \g__tbl_row_int +} +\cs_new_protected:Npn \tbl_inbetween_rows: { + \int_gzero:N \g__tbl_col_int +} +\cs_new_protected:Npn \tbl_restore_outer_cell_data: { + \int_gset:Nn \g__tbl_col_int { \l__tbl_saved_col_tl } + \int_gset:Nn \g__tbl_row_int { \l__tbl_saved_row_tl } + \tl_gset_eq:NN \g__tbl_span_tl \l__tbl_saved_span_tl + \tl_gset_eq:NN \g__tbl_table_cols_tl \l__tbl_saved_table_cols_tl + \__tbl_trace:n { ==>~ restored~cell~data:~ + \int_use:N \g__tbl_row_int, + \int_use:N \g__tbl_col_int, + \l__tbl_saved_span_tl \space + ( + \int_compare:nNnTF \g__tbl_table_cols_tl = 0 + { outer~ level } + { max:~ \g__tbl_table_cols_tl } + ) + } +} +\cs_new_protected:Npn \tbl_update_multicolumn_cell_data:n #1 { + \int_compare:nNnTF \g__tbl_col_int = 0 + { + \UseTaggingSocket{tbl/row/begin} + \int_gset:Nn \g__tbl_col_int {1} + } + { + \int_gadd:Nn \g__tbl_col_int { \g__tbl_span_tl } + } + \tl_gset:Nn \g__tbl_span_tl {#1} +} +\cs_new:Npn \tbl_crcr:n #1 { + \int_compare:nNnT \g__tbl_col_int > 0 + { + \tbl_count_missing_cells:n {#1} + \cr + } +} +\ExplSyntaxOff +\let\@kernel@refstepcounter\refstepcounter +\def\hyper@nopatch@longtable{} %%% From File: ltfinal.dtx \tracingstats1 \newcount\@lowpenalty diff --git a/Master/texmf-dist/tex/latex/base/latexrelease.sty b/Master/texmf-dist/tex/latex/base/latexrelease.sty index 0c2d1a5bd96..efd9d37b40a 100644 --- a/Master/texmf-dist/tex/latex/base/latexrelease.sty +++ b/Master/texmf-dist/tex/latex/base/latexrelease.sty @@ -16,6 +16,7 @@ %% lthooks.dtx (with options: `latexrelease') %% ltcmdhooks.dtx (with options: `latexrelease') %% ltsockets.dtx (with options: `latexrelease') +%% lttemplates.dtx (with options: `latexrelease') %% ltalloc.dtx (with options: `latexrelease') %% ltcntrl.dtx (with options: `latexrelease') %% lterror.dtx (with options: `latexrelease') @@ -292,7 +293,7 @@ } %%% From File: ltvers.dtx \edef\latexreleaseversion - {2023-11-01} + {2024-06-01} \newif\if@includeinrelease \@includeinreleasefalse \def\IncludeInRelease#1{% @@ -570,25 +571,6 @@ of this package available from CTAN} "luatex", tex.extraprimitives("core","omega", "aleph", "luatex") ) - local i - local t = { } - for _,i in pairs(tex.extraprimitives("luatex")) do - if not string.match(i,"^U") then - if not string.match(i, "^luatex") then - table.insert(t,i) - end - else - if string.match(i,"^Uchar$") then - table.insert(t,i) - end - end - end - for _,i in pairs(t) do - tex.print( - "\noexpand\\let\noexpand\\" .. i - .. "\noexpand\\undefined" - ) - end } \EndIncludeInRelease \fi @@ -985,7 +967,7 @@ of this package available from CTAN} \tracinggroups\z@ \tracingparagraphs\z@ \tracingmacros\z@ - \tracinglostchars\@ne + \tracinglostchars\tw@ \tracingpages\z@ \tracingstats\z@ }% @@ -1362,7 +1344,10 @@ of this package available from CTAN} \cs_gset_eq:NN \@expl@cs@to@str@@N \cs_to_str:N \cs_gset_eq:NN \@expl@str@if@eq@@nnTF \str_if_eq:nnTF \cs_gset_eq:NN \@expl@cs@prefix@spec@@N \cs_prefix_spec:N -\cs_gset_eq:NN \@expl@cs@argument@spec@@N \cs_argument_spec:N +\cs_if_exist:NTF \cs_parameter_spec:N + { \cs_gset_eq:NN \@expl@cs@parameter@spec@@N \cs_parameter_spec:N } + { \cs_gset_eq:NN \@expl@cs@parameter@spec@@N \cs_argument_spec:N } +\cs_gset_eq:NN \__kernel_cs_parameter_spec:N \@expl@cs@parameter@spec@@N \cs_gset_eq:NN \@expl@cs@replacement@spec@@N \cs_replacement_spec:N \cs_gset_eq:NN \@expl@str@map@function@@NN \str_map_function:NN \cs_gset_eq:NN \@expl@char@generate@@nn \char_generate:nn @@ -1373,7 +1358,7 @@ of this package available from CTAN} \let \@expl@cs@to@str@@N \@undefined \let \@expl@str@if@eq@@nnTF \@undefined \let \@expl@cs@prefix@spec@@N \@undefined -\let \@expl@cs@argument@spec@@N \@undefined +\let \@expl@cs@parameter@spec@@N \@undefined \let \@expl@cs@replacement@spec@@N \@undefined \let \@expl@str@map@function@@NN \@undefined \EndIncludeInRelease @@ -1796,7 +1781,7 @@ of this package available from CTAN} \long\def\@show@newcommand@aux#1#2#3{% \typeout{> \string#1=\@expl@cs@prefix@spec@@N#1macro:}% #3{default \string##1=\expandafter\detokenize\@gobblethree#2.^^J% - \@expl@cs@argument@spec@@N#1->\@expl@cs@replacement@spec@@N#1}} + \@expl@cs@parameter@spec@@N#1->\@expl@cs@replacement@spec@@N#1}} \long\def\@show@tokens#1{% \edef\reserved@a{#1}% \showtokens\expandafter @@ -1844,7 +1829,7 @@ of this package available from CTAN} \@show@environment@end#1} \long\def\@show@environment@begin#1{% \typeout{> \string\begin{\@expl@cs@to@str@@N#1}=environment:}% - \typeout{\@expl@cs@argument@spec@@N#1->% + \typeout{\@expl@cs@parameter@spec@@N#1->% \@expl@cs@replacement@spec@@N#1.^^J}} \long\def\@show@normalenv#1{% \@show@environment@begin#1% @@ -1855,12 +1840,12 @@ of this package available from CTAN} \long\def\@show@environment@end@aux#1#2{% \@show@tokens{\string\end{\@expl@cs@to@str@@N#2}% \ifx\relax#1=undefined% - \else:^^J\@expl@cs@argument@spec@@N#1->% + \else:^^J\@expl@cs@parameter@spec@@N#1->% \@expl@cs@replacement@spec@@N#1% \fi}} \def\@show@nonstop#1{% \typeout{> \string#1=\@expl@cs@prefix@spec@@N#1macro:^^J% - \@expl@cs@argument@spec@@N#1->\@expl@cs@replacement@spec@@N#1.}} + \@expl@cs@parameter@spec@@N#1->\@expl@cs@replacement@spec@@N#1.}} \def\@show@typeout#1{\typeout{> #1.^^J}} \EndIncludeInRelease \IncludeInRelease{0000-00-00}{\ShowEnvironment} @@ -1997,8 +1982,8 @@ of this package available from CTAN} \EndIncludeInRelease %%% From File: ltcmd.dtx -\def\ltcmdversion{v1.2a} -\def\ltcmddate{2023-08-19} +\def\ltcmdversion{v1.2e} +\def\ltcmddate{2024-04-17} \edef\@latexrelease@catcode@null{\the\catcode`\^^@ } \catcode`\^^@=12 \ExplSyntaxOn @@ -2082,8 +2067,6 @@ of this package available from CTAN} \cs_new_protected:Npn \__cmd_declare_cmd_internal:Nnnn #1#2#3#4 { \tl_set:Nx \l__cmd_function_tl { \cs_to_str:N #1 } - \tl_set:Nx \l__cmd_fn_tl - { \exp_not:c { \l__cmd_function_tl \c_space_tl } } \__cmd_normalize_arg_spec:n {#2} \exp_args:No \__cmd_prepare_signature:n \l__cmd_arg_spec_tl \__cmd_declare_cmd_code:Nnn #1 {#2} {#3} @@ -2091,12 +2074,60 @@ of this package available from CTAN} \__cmd_break_point:n {#2} } \cs_new_eq:NN \__cmd_break_point:n \use_none:n -\cs_new_protected:Npn \__cmd_declare_cmd_code:Nnn +\cs_new:Npn \__cmd_all_m_check:n #1 + { \tl_map_function:nN {#1} \__cmd_all_m_check_aux:n } +\cs_new:Npn \__cmd_all_m_check_aux:n #1 { - \bool_if:NTF \l__cmd_grab_expandably_bool - { \__cmd_declare_cmd_code_expandable:Nnn } - { \__cmd_declare_cmd_code_aux:Nnn } + \str_if_eq:nnF {#1} { m } + { + \str_if_eq:nnF {#1} { + } + { X } + } + } +\cs_new_protected:Npn \__cmd_declare_cmd_code:Nnn #1#2 + { + \bool_lazy_any:nTF + { + { \l__cmd_environment_bool } + { + \bool_lazy_and_p:nn + { \l__cmd_some_short_bool } + { \l__cmd_some_long_bool } + } + { ! \tl_if_blank_p:e { \__cmd_all_m_check:n {#2} } } + } + { + \tl_set:Nx \l__cmd_fn_tl + { \exp_not:c { \l__cmd_function_tl \c_space_tl } } + \bool_if:NTF \l__cmd_grab_expandably_bool + { \__cmd_declare_cmd_code_expandable:Nnn } + { \__cmd_declare_cmd_code_aux:Nnn } + } + { \__cmd_declare_cmd_optimized:Nnn } + #1 {#2} } +\cs_new_protected:Npn \__cmd_declare_cmd_optimized:Nnn #1#2#3 + { + \bool_if:NTF \l__cmd_expandable_bool + { \cs_set_nopar:Npe } + { \cs_set_protected_nopar:Npe } + #1 + { + \exp_not:N \__cmd_start_optimized: + \exp_not:c { \l__cmd_function_tl \c_space_tl code } + } + \exp_args:Ncc \cs_generate_from_arg_count:NNnn + { \l__cmd_function_tl \c_space_tl code } + { + cs_set + \bool_if:NF \l__cmd_expandable_bool { _protected } + \bool_if:NF \l__cmd_some_long_bool { _nopar } + :Npn + } + \l__cmd_current_arg_int + {#3} + } +\cs_new:Npn \__cmd_start_optimized: { } \cs_new_protected:Npn \__cmd_declare_cmd_code_aux:Nnn #1#2#3 { \cs_generate_from_arg_count:cNnn @@ -2698,7 +2729,12 @@ of this package available from CTAN} \bool_if:NT \l__cmd_some_obey_spaces_bool { \msg_error:nnxx { cmd } { invalid-bang } - { \__cmd_environment_or_command: } { \tl_to_str:n {#1} } + { \__cmd_environment_or_command: } + { + \bool_if:NTF \l__cmd_obey_spaces_bool + { \tl_to_str:n {'#1'} } + { an~optional~argument~before~mandatory~ \tl_to_str:n {'#1'} } + } \__cmd_bad_def:wn } \tl_clear:N \l__cmd_last_delimiters_tl @@ -3022,9 +3058,10 @@ of this package available from CTAN} \use:x { \int_set:Nn \tex_escapechar:D { 92 } - \exp_not:N \__cmd_cmd_type_cases:NnnnnF \exp_not:N #2 + \exp_not:N \__cmd_cmd_type_cases:NnnnnnF \exp_not:N #2 { \__cmd_copy_command:nnNN } { \__cmd_copy_expandable:nnNN } + { \__cmd_copy_optimized:nnNN } { \__cmd_copy_environment:nnNN } { \__cmd_copy_environment_end:nnNN } { \__cmd_cant_copy:nwn { non-ltcmd } } @@ -3100,6 +3137,18 @@ of this package available from CTAN} \IncludeInRelease{2020/10/01}{\__cmd_copy_expandable:nnNN}% {Support~\NewCommandCopy~in~ltcmd} \EndIncludeInRelease +\cs_new_protected:Npn \__cmd_copy_optimized:nnNN #1#2#3#4 + { + \cs_set_eq:cc { #1 ~ code } { #2 ~ code } + \token_if_protected_macro:NTF #4 + { \cs_set_protected_nopar:Npe } + { \cs_set_nopar:Npe } + #3 + { + \exp_not:N \__cmd_start_optimized: + \exp_not:c { #1 ~ code } + } + } \IncludeInRelease{2021/11/15}{\__cmd_copy:NN (part 2)}% {Support~\NewCommandCopy~in~ltcmd} \cs_new:Npn \__cmd_copy_expandable:NnNNNNnnn #1 #2 #3 #4 #5 #6 #7 #8 #9 @@ -3228,9 +3277,10 @@ of this package available from CTAN} \use:x { \int_set:Nn \tex_escapechar:D { 92 } - \exp_not:N \__cmd_cmd_type_cases:NnnnnF \exp_not:N #1 + \exp_not:N \__cmd_cmd_type_cases:NnnnnnF \exp_not:N #1 { \__cmd_show_command:N } { \__cmd_show_expandable:N } + { \__cmd_show_optimized:N } { \__cmd_show_environment:N } { \__cmd_show_environment_end:N } { \__cmd_cant_copy:nwn { non-ltcmd } } @@ -3284,6 +3334,43 @@ of this package available from CTAN} -> \cs_replacement_spec:N #4 } } +\cs_new_protected:Npn \__cmd_show_optimized:N #1 + { + \exp_args:Nc \__cmd_show_optimized:NN + { \cs_to_str:N #1 \c_space_tl code } + #1 + } +\cs_new_protected:Npn \__cmd_show_optimized:NN #1#2 + { + \cs_set:Npe \__cmd_show_optimized_aux:N ##1 + { + \c_space_tl \c_space_tl \c_hash_str ##1 : + \bool_lazy_or:nnT + { \token_if_long_macro_p:N #1 } + { \token_if_protected_long_macro_p:N #1 } + { + } m + \iow_newline: + } + \tl_show:e + { + \token_to_str:N #2 = + \bool_lazy_or:nnF + { \token_if_protected_macro_p:N #1 } + { \token_if_protected_long_macro_p:N #1 } + { expandable ~ } document~command: + \iow_newline: + \int_step_function:nN + { + \int_div_truncate:nn + { \tl_count:e { \cs_parameter_spec:N #1 } } + { 2 } + } + \__cmd_show_optimized_aux:N + -> + \cs_replacement_spec:N #1 + } + } +\cs_generate_variant:Nn \tl_count:n { e } \cs_new_protected:Npn \__cmd_show_environment:N #1 { \exp_after:wN \__cmd_show_environment:Nnnw #1 \q__cmd @@ -3850,6 +3937,24 @@ of this package available from CTAN} \__cmd_add_arg:o \c_novalue_tl } } +\IncludeInRelease{2024/06/01}{\__cmd_grab_v_aux_put:N}% + {Endlines~as~\obeyedline} +\cs_new_protected:Npn \__cmd_grab_v_aux_put:N #1 + { + \tl_put_right:Nx \l__cmd_v_arg_tl + { + \token_if_active:NTF #1 + { \exp_not:N #1 } + { + \int_compare:nNnTF {`#1} = \tex_endlinechar:D + { \exp_not:N \obeyedline } + { \token_to_str:N #1 } + } + } + } +\EndIncludeInRelease +\IncludeInRelease{2020/10/01}{\__cmd_grab_v_aux_put:N}% + {Endlines~as~\obeyedline} \cs_new_protected:Npn \__cmd_grab_v_aux_put:N #1 { \tl_put_right:Nx \l__cmd_v_arg_tl @@ -3858,6 +3963,7 @@ of this package available from CTAN} { \exp_not:N #1 } { \token_to_str:N #1 } } } +\EndIncludeInRelease \cs_new_protected:Npn \__cmd_grab_v_token_if_char:NTF #1 { \str_if_eq:eeTF { } { \str_tail:n {#1} } } \cs_new_protected:Npn \__cmd_add_arg:n #1 @@ -4326,30 +4432,31 @@ of this package available from CTAN} #1 {#2} {#4} \__cmd_tl_mapthread_loop:w #1#3 \q_mark } -\cs_new_protected:Npn \__cmd_cmd_type_cases:NnnnnF #1 #2 #3 #4 #5 #6 +\cs_new_protected:Npn \__cmd_cmd_type_cases:NnnnnnF #1 #2 #3 #4 #5 #6 #7 { \exp_args:Ne \str_case_e:nnF { - \exp_args:Nf \tl_if_empty:nT { \cs_argument_spec:N #1 } + \exp_args:Nf \tl_if_empty:nT { \__kernel_cs_parameter_spec:N #1 } { \exp_not:N \exp_not:n { \exp_not:e { \tl_head:N #1 } } } } { { \exp_not:N \__cmd_start:nNNnnn } {#2} { \exp_not:N \__cmd_start_expandable:nNNNNn } {#3} - { \exp_not:N \__cmd_start_env:nnnnn } {#4} + { \exp_not:N \__cmd_start_optimized: } {#4} + { \exp_not:N \__cmd_start_env:nnnnn } {#5} { \exp_after:wN \exp_not:N \cs:w environment~ \exp_last_unbraced:Ne \use_none:nnn { \cs_to_str:N #1 } ~end~aux \cs_end: - } {#5} + } {#6} } - {#6} + {#7} } \cs_new_protected:Npn \__kernel_cmd_if_xparse:NTF #1 { - \__cmd_cmd_type_cases:NnnnnF #1 - { } { } { } { } { \use_iii:nnn } + \__cmd_cmd_type_cases:NnnnnnF #1 + { } { } { } { } { } { \use_iii:nnn } \use_i:nn } \cs_new_protected:Npn \__cmd_peek_nonspace:NTF @@ -4405,10 +4512,8 @@ of this package available from CTAN} \bool_if:NTF \l__cmd_environment_bool { environment ~ ' \l__cmd_environment_str ' } { - command ~ ' - \exp_args:Nf \tl_trim_spaces:n - { \exp_after:wN \token_to_str:N \l__cmd_fn_tl } - ' + command ~ + ' \c_backslash_str \tl_to_str:N \l__cmd_function_tl ' } } \msg_new:nnnn { cmd } { arg-after-body } @@ -4500,7 +4605,7 @@ of this package available from CTAN} { Invalid~argument~prefix~'!'~in~#1. } { The~prefix~'!'~is~only~allowed~for~trailing~optional~arguments.~ - You~tried~to~apply~it~to~'#2'. + You~tried~to~apply~it~to~#2. \c__cmd_ignore_def_tl } \msg_new:nnnn { cmd } { not-definable } @@ -4809,8 +4914,6 @@ of this package available from CTAN} \catcode`\^^@=\@latexrelease@catcode@null\relax %%% From File: lthooks.dtx -\def\lthooksversion{v1.1f} -\def\lthooksdate{2023/10/02} \ExplSyntaxOn \NewModuleRelease{2020/10/01}{lthooks} {The~hook~management~system} @@ -5281,7 +5384,8 @@ of this package available from CTAN} \msg_error:nnnnn { hooks } { set-top-level } { for } { SetDefaultHookLabel } {#1} } - { \exp_args:Nx \__hook_set_default_label:n { \__hook_make_name:n {#1} } } + { \exp_args:Nx + \__hook_set_default_label:n { \__hook_make_name:n {#1} } } } \cs_new_protected:Npn \__hook_set_default_label:n #1 { @@ -5388,7 +5492,8 @@ of this package available from CTAN} \IncludeInRelease{2020/10/01}{\hook_gput_code:nnn} {Providing~hooks} \cs_gset_protected:Npn \hook_gput_code:nnn #1 #2 - { \__hook_normalize_hook_args:Nnn \__hook_gput_code:nnn {#1} {#2} } + { \__hook_normalize_hook_args:Nnn + \__hook_gput_code:nnn {#1} {#2} } \cs_gset_protected:Npn \__hook_gput_code:nnn #1 #2 #3 { \__hook_if_execute_immediately:nTF {#1} @@ -5402,7 +5507,8 @@ of this package available from CTAN} { \__hook_if_disabled:nTF {#1} { \msg_error:nnn { hooks } { hook-disabled } {#1} } - { \__hook_try_declaring_generic_hook:nnn {#1} {#2} {#3} } + { \__hook_try_declaring_generic_hook:nnn + {#1} {#2} {#3} } } } } @@ -5414,7 +5520,8 @@ of this package available from CTAN} \on@line\space <-~ \tl_to_str:n{#3}} } \str_if_eq:nnTF {#2} { top-level } { - \str_if_eq:eeTF { top-level } { \__hook_currname_or_default: } + \str_if_eq:eeTF { top-level } + { \__hook_currname_or_default: } { \__hook_init_structure:n {#1} \__hook_tl_gput_right:cn { __hook_toplevel~#1 } {#3} @@ -5422,7 +5529,8 @@ of this package available from CTAN} { \msg_error:nnn { hooks } { misused-top-level } {#1} } } { - \prop_get:cnNTF { g__hook_#1_code_prop } {#2} \l__hook_return_tl + \prop_get:cnNTF + { g__hook_#1_code_prop } {#2} \l__hook_return_tl { \prop_gput:cno { g__hook_#1_code_prop } {#2} { \l__hook_return_tl #3 } @@ -5458,7 +5566,8 @@ of this package available from CTAN} \__hook_init_structure:n {#1} \__hook_hook_gput_code_do:nnn {#1} {#2} {#3} } -\IncludeInRelease{2023/06/01}{\__hook_try_declaring_generic_hook:nnn} +\IncludeInRelease{2023/06/01} + {\__hook_try_declaring_generic_hook:nnn} {Hooks~with~args} \cs_new_protected:Npn \__hook_try_declaring_generic_hook:nnn #1 { @@ -5475,54 +5584,66 @@ of this package available from CTAN} {#1} } \EndIncludeInRelease -\IncludeInRelease{2021/11/15}{\__hook_try_declaring_generic_hook:nnn} +\IncludeInRelease{2021/11/15} + {\__hook_try_declaring_generic_hook:nnn} {Standardise~generic~hook~names} \cs_gset_protected:Npn \__hook_try_declaring_generic_hook:nnn #1 { - \__hook_try_declaring_generic_hook:wnTF #1 / / / \scan_stop: {#1} + \__hook_try_declaring_generic_hook:wnTF #1 / / / \scan_stop: + {#1} \hook_gput_code:nnn \__hook_gput_undeclared_hook:nnn {#1} } -\cs_gset_protected:Npn \__hook_try_declaring_generic_next_hook:nn #1 +\cs_gset_protected:Npn + \__hook_try_declaring_generic_next_hook:nn #1 { - \__hook_try_declaring_generic_hook:wnTF #1 / / / \scan_stop: {#1} + \__hook_try_declaring_generic_hook:wnTF #1 / / / \scan_stop: + {#1} \hook_gput_next_code:nn \__hook_gput_next_do:nn {#1} } \EndIncludeInRelease -\IncludeInRelease{2020/10/01}{\__hook_try_declaring_generic_hook:nnn} +\IncludeInRelease{2020/10/01} + {\__hook_try_declaring_generic_hook:nnn} {Standardise~generic~hook~names} -\cs_new_protected:Npn \__hook_try_declaring_generic_hook:nnn #1 +\cs_new_protected:Npn + \__hook_try_declaring_generic_hook:nnn #1 { \__hook_try_declaring_generic_hook:nNNnn {#1} \hook_gput_code:nnn \__hook_gput_undeclared_hook:nnn } -\cs_new_protected:Npn \__hook_try_declaring_generic_next_hook:nn #1 +\cs_new_protected:Npn + \__hook_try_declaring_generic_next_hook:nn #1 { \__hook_try_declaring_generic_hook:nNNnn {#1} \hook_gput_next_code:nn \__hook_gput_next_do:nn } \cs_new_protected:Npn \__hook_try_declaring_generic_hook:nNNnn #1 { - \__hook_if_file_hook:wTF #1 / \s__hook_mark + \__hook_if_file_hook:wTF #1 / / \s__hook_mark { - \exp_args:Ne \__hook_try_declaring_generic_hook_split:nNNnn + \exp_args:Ne + \__hook_try_declaring_generic_hook_split:nNNnn { \exp_args:Ne \__hook_file_hook_normalize:n {#1} } } { \__hook_try_declaring_generic_hook_split:nNNnn {#1} } } -\cs_new_protected:Npn \__hook_try_declaring_generic_hook_split:nNNnn #1 #2 #3 +\cs_new_protected:Npn + \__hook_try_declaring_generic_hook_split:nNNnn #1 #2 #3 { - \__hook_try_declaring_generic_hook:wnTF #1 / / / \scan_stop: {#1} + \__hook_try_declaring_generic_hook:wnTF #1 / / / \scan_stop: + {#1} { #2 } { #3 } {#1} } \EndIncludeInRelease -\IncludeInRelease{2023/06/01}{\__hook_try_declaring_generic_hook:wn} +\IncludeInRelease{2023/06/01} + {\__hook_try_declaring_generic_hook:wn} {Hooks~with~args} -\prg_new_protected_conditional:Npnn \__hook_try_declaring_generic_hook:wn +\prg_new_protected_conditional:Npnn + \__hook_try_declaring_generic_hook:wn #1 / #2 / #3 / #4 \scan_stop: #5 { TF } { \__hook_if_generic:nTF {#5} @@ -5576,9 +5697,11 @@ of this package available from CTAN} #1 #2 { #3 / #5 / #4 } } \EndIncludeInRelease -\IncludeInRelease{2021/11/15}{\__hook_try_declaring_generic_hook:wn} +\IncludeInRelease{2021/11/15} + {\__hook_try_declaring_generic_hook:wn} {Standardise~generic~hook~names} -\prg_new_protected_conditional:Npnn \__hook_try_declaring_generic_hook:wn +\prg_new_protected_conditional:Npnn + \__hook_try_declaring_generic_hook:wn #1 / #2 / #3 / #4 \scan_stop: #5 { TF } { \__hook_if_generic:nTF {#5} @@ -5604,9 +5727,11 @@ of this package available from CTAN} } } \EndIncludeInRelease -\IncludeInRelease{2021/06/01}{\__hook_try_declaring_generic_hook:wn} +\IncludeInRelease{2021/06/01} + {\__hook_try_declaring_generic_hook:wn} {Support~cmd~hooks} -\prg_new_protected_conditional:Npnn \__hook_try_declaring_generic_hook:wn +\prg_new_protected_conditional:Npnn + \__hook_try_declaring_generic_hook:wn #1 / #2 / #3 / #4 \scan_stop: #5 { TF } { \tl_if_empty:nTF {#2} @@ -5620,10 +5745,12 @@ of this package available from CTAN} { \__hook_try_put_cmd_hook:n {#5} } \__hook_make_usable:n {#5} } - \prop_if_in:NnTF \c__hook_generics_reversed_ii_prop {#2} + \prop_if_in:NnTF + \c__hook_generics_reversed_ii_prop {#2} { \tl_gset:cn { g__hook_#5_reversed_tl } { - } } { - \prop_if_in:NnT \c__hook_generics_reversed_iii_prop {#3} + \prop_if_in:NnT + \c__hook_generics_reversed_iii_prop {#3} { \tl_gset:cn { g__hook_#5_reversed_tl } { - } } } \prg_return_true: @@ -5632,9 +5759,11 @@ of this package available from CTAN} } } \EndIncludeInRelease -\IncludeInRelease{2020/10/01}{\__hook_try_declaring_generic_hook:wn} +\IncludeInRelease{2020/10/01} + {\__hook_try_declaring_generic_hook:wn} {Support~cmd~hooks} -\prg_new_protected_conditional:Npnn \__hook_try_declaring_generic_hook:wn +\prg_new_protected_conditional:Npnn + \__hook_try_declaring_generic_hook:wn #1 / #2 / #3 / #4 \scan_stop: #5 { TF } { \tl_if_empty:nTF {#2} @@ -5643,10 +5772,12 @@ of this package available from CTAN} \prop_if_in:NnTF \c__hook_generics_prop {#1} { \__hook_if_declared:nF {#5} { \hook_new:n {#5} } - \prop_if_in:NnTF \c__hook_generics_reversed_ii_prop {#2} + \prop_if_in:NnTF + \c__hook_generics_reversed_ii_prop {#2} { \tl_gset:cn { g__hook_#5_reversed_tl } { - } } { - \prop_if_in:NnT \c__hook_generics_reversed_iii_prop {#3} + \prop_if_in:NnT + \c__hook_generics_reversed_iii_prop {#3} { \tl_gset:cn { g__hook_#5_reversed_tl } { - } } } \prg_return_true: @@ -5687,11 +5818,11 @@ of this package available from CTAN} { \__hook_strip_double_slash:n {#1} } \cs_new:Npn \__hook_strip_double_slash:n #1 { \__hook_strip_double_slash:w #1 // \s__hook_mark } -\cs_new:Npn \__hook_strip_double_slash:w #1/#2/#3 // #4 \s__hook_mark +\cs_new:Npn \__hook_strip_double_slash:w #1/#2/#3//#4\s__hook_mark { \tl_if_empty:nTF {#4} { #1/#2/#3 } - { \__hook_strip_double_slash:w #1/#2/#3 / #4 \s__hook_mark } + { \__hook_strip_double_slash:w #1/#2/#3 /#4\s__hook_mark } } \EndIncludeInRelease \IncludeInRelease{2021/11/15}{\c__hook_generics_prop} @@ -5722,9 +5853,12 @@ of this package available from CTAN} \EndIncludeInRelease \IncludeInRelease{2020/10/01}{\c__hook_generics_reversed_ii_prop} {Standardise~generic~hook~names} -\prop_const_from_keyval:Nn \c__hook_generics_reversed_ii_prop {after=,end=} -\prop_const_from_keyval:Nn \c__hook_generics_reversed_iii_prop {after=} -\prop_const_from_keyval:Nn \c__hook_generics_file_prop {before=,after=} +\prop_const_from_keyval:Nn + \c__hook_generics_reversed_ii_prop {after=,end=} +\prop_const_from_keyval:Nn + \c__hook_generics_reversed_iii_prop {after=} +\prop_const_from_keyval:Nn + \c__hook_generics_file_prop {before=,after=} \EndIncludeInRelease \IncludeInRelease{2023/06/01}{\c__hook_parameter_cmd/./before_tl} {Hooks~with~args} @@ -5752,7 +5886,8 @@ of this package available from CTAN} \str_if_eq:nnTF {#2} { top-level } { \__hook_toplevel_gset:nn {#1} { } } { - \prop_gpop:cnNF { g__hook_#1_code_prop } {#2} \l__hook_return_tl + \prop_gpop:cnNF { g__hook_#1_code_prop } + {#2} \l__hook_return_tl { \msg_warning:nnnn { hooks } { cannot-remove } {#1} {#2} } } } @@ -5763,7 +5898,8 @@ of this package available from CTAN} \__hook_if_deprecated_generic:nTF {#1} { \__hook_deprecated_generic_warn:n {#1} - \__hook_do_deprecated_generic:Nn \__hook_gremove_code:nn {#1} {#2} + \__hook_do_deprecated_generic:Nn + \__hook_gremove_code:nn {#1} {#2} } { \msg_warning:nnnn { hooks } { cannot-remove } {#1} {#2} } } @@ -5785,8 +5921,10 @@ of this package available from CTAN} \str_if_eq:nnTF {#2} { top-level } { \__hook_tl_gclear:c { __hook_toplevel~#1 } } { - \prop_gpop:cnNF { g__hook_#1_code_prop } {#2} \l__hook_return_tl - { \msg_warning:nnnn { hooks } { cannot-remove } {#1} {#2} } + \prop_gpop:cnNF { g__hook_#1_code_prop } + {#2} \l__hook_return_tl + { \msg_warning:nnnn { hooks } { cannot-remove } + {#1} {#2} } } } \__hook_if_usable:nT {#1} @@ -5796,9 +5934,11 @@ of this package available from CTAN} \__hook_if_deprecated_generic:nTF {#1} { \__hook_deprecated_generic_warn:n {#1} - \__hook_do_deprecated_generic:Nn \__hook_gremove_code:nn {#1} {#2} + \__hook_do_deprecated_generic:Nn + \__hook_gremove_code:nn {#1} {#2} } - { \msg_warning:nnnn { hooks } { cannot-remove } {#1} {#2} } + { \msg_warning:nnnn { hooks } { cannot-remove } + {#1} {#2} } } } \EndIncludeInRelease @@ -5817,7 +5957,8 @@ of this package available from CTAN} {#1} {#2} } \cs_new_protected:Npn \__hook_cs_gput_right_fast:nnn #1 #2 #3 - { \cs_gset:cpx { __hook#1~#2 } { \exp_not:v { __hook#1~#2 } \exp_not:n {#3} } } + { \cs_gset:cpx { __hook#1~#2 } + { \exp_not:v { __hook#1~#2 } \exp_not:n {#3} } } \cs_new_protected:Npn \__hook_cs_gput_right_slow:nnn #1 #2 #3 { \cs_if_exist:cF { __hook#1~#2 } @@ -5928,7 +6069,8 @@ of this package available from CTAN} } \exp_last_unbraced:NNf \cs_set:Npn \__hook_tmp:w { \__hook_parameter:n {#1} } { } - \tl_set:Ne \l__hook_tmpa_tl { \__hook_braced_cs_parameter:n { __hook_tmp:w } } + \tl_set:Ne \l__hook_tmpa_tl + { \__hook_braced_cs_parameter:n { __hook_tmp:w } } \cs_gset_protected:Npx \__hook_normalise_fn:nn ##1 ##2 { \group_begin: @@ -6114,8 +6256,8 @@ of this package available from CTAN} \__hook_if_deprecated_generic:nT {#1} { \__hook_deprecated_generic_warn:n {#1} - \__hook_do_deprecated_generic:Nn \__hook_gset_rule:nnnn {#1} - {#2} {#3} {#4} + \__hook_do_deprecated_generic:Nn \__hook_gset_rule:nnnn + {#1} {#2} {#3} {#4} \exp_after:wN \use_none:nnnnnnnnn \use_none:n } \__hook_init_structure:n {#1} @@ -6133,27 +6275,34 @@ of this package available from CTAN} \EndIncludeInRelease \cs_new_protected:Npn \__hook_rule_before_gset:nnn #1#2#3 { - \__hook_tl_gset:cx { g__hook_#1_rule_ \__hook_label_pair:nn {#2} {#3} _tl } + \__hook_tl_gset:cx + { g__hook_#1_rule_ \__hook_label_pair:nn {#2} {#3} _tl } { \__hook_label_ordered:nnTF {#2} {#3} { < } { > } } } \cs_new_eq:cN { __hook_rule_<_gset:nnn } \__hook_rule_before_gset:nnn \cs_new_protected:Npn \__hook_rule_after_gset:nnn #1#2#3 { - \__hook_tl_gset:cx { g__hook_#1_rule_ \__hook_label_pair:nn {#3} {#2} _tl } + \__hook_tl_gset:cx + { g__hook_#1_rule_ \__hook_label_pair:nn {#3} {#2} _tl } { \__hook_label_ordered:nnTF {#3} {#2} { < } { > } } } \cs_new_eq:cN { __hook_rule_>_gset:nnn } \__hook_rule_after_gset:nnn \cs_new_protected:Npn \__hook_rule_voids_gset:nnn #1#2#3 { - \__hook_tl_gset:cx { g__hook_#1_rule_ \__hook_label_pair:nn {#2} {#3} _tl } + \__hook_tl_gset:cx + { g__hook_#1_rule_ \__hook_label_pair:nn {#2} {#3} _tl } { \__hook_label_ordered:nnTF {#2} {#3} { -> } { <- } } } \cs_new_protected:cpn { __hook_rule_incompatible-error_gset:nnn } #1#2#3 - { \__hook_tl_gset:cn { g__hook_#1_rule_ \__hook_label_pair:nn {#2} {#3} _tl } - { xE } } + { \__hook_tl_gset:cn + { g__hook_#1_rule_ \__hook_label_pair:nn {#2} {#3} _tl } + { xE } + } \cs_new_protected:cpn { __hook_rule_incompatible-warning_gset:nnn } #1#2#3 - { \__hook_tl_gset:cn { g__hook_#1_rule_ \__hook_label_pair:nn {#2} {#3} _tl } - { xW } } + { \__hook_tl_gset:cn + { g__hook_#1_rule_ \__hook_label_pair:nn {#2} {#3} _tl } + { xW } + } \cs_new_protected:Npn \__hook_rule_unrelated_gset:nnn #1#2#3 { } \cs_new_protected:Npn \__hook_rule_gclear:nnn #1#2#3 { \cs_undefine:c { g__hook_#1_rule_ \__hook_label_pair:nn {#2} {#3} _tl } } @@ -6211,7 +6360,8 @@ of this package available from CTAN} {Hooks~with~args} \cs_gset_protected:Npn \__hook_initialize_all: { - \cs_gset_eq:NN \__hook_update_hook_code:n \__hook_initialize_hook_code:n + \cs_gset_eq:NN \__hook_update_hook_code:n + \__hook_initialize_hook_code:n \__hook_debug:n { \prop_gclear:N \g__hook_used_prop } \seq_map_inline:Nn \g__hook_all_seq { \__hook_update_hook_code:n {##1} } @@ -6221,7 +6371,8 @@ of this package available from CTAN} \prop_map_inline:Nn \g__hook_used_prop { \iow_term:x - { ^^J ~ ##1 ~ -> ~ \cs_replacement_spec:c { __hook~##1 } ~ } + { ^^J ~ ##1 ~ -> ~ + \cs_replacement_spec:c { __hook~##1 } ~ } } } \cs_gset_eq:NN \hook_use:n \__hook_use_initialized:n @@ -6243,8 +6394,10 @@ of this package available from CTAN} { \__hook_code_gset:ne {#1} { - \exp_not:c { __hook_toplevel~#1 } \__hook_braced_parameter:n {#1} - \exp_not:c { __hook_next~#1 } \__hook_braced_parameter:n {#1} + \exp_not:c { __hook_toplevel~#1 } + \__hook_braced_parameter:n {#1} + \exp_not:c { __hook_next~#1 } + \__hook_braced_parameter:n {#1} } } { @@ -6267,7 +6420,8 @@ of this package available from CTAN} \cs_gset_protected:Npn \__hook_initialize_hook_code:n #1 { \__hook_debug:n - { \iow_term:x { ^^J Update~code~for~hook~'#1' \on@line :^^J } } + { \iow_term:x { ^^J Update~code~for~hook~'#1' + \on@line :^^J } } \__hook_include_legacy_code_chunk:n {#1} \__hook_if_usable:nT {#1} { @@ -6281,15 +6435,21 @@ of this package available from CTAN} } { \__hook_if_reversed:nTF {#1} - { \cs_set_eq:NN \__hook_tl_gput:Nn \__hook_tl_gput_left:Nn - \cs_set_eq:NN \__hook_clist_gput:NV \clist_gput_left:NV } - { \cs_set_eq:NN \__hook_tl_gput:Nn \__hook_tl_gput_right:Nn - \cs_set_eq:NN \__hook_clist_gput:NV \clist_gput_right:NV } - \prop_set_eq:Nc \l__hook_work_prop { g__hook_#1_code_prop } + { \cs_set_eq:NN \__hook_tl_gput:Nn + \__hook_tl_gput_left:Nn + \cs_set_eq:NN \__hook_clist_gput:NV + \clist_gput_left:NV } + { \cs_set_eq:NN \__hook_tl_gput:Nn + \__hook_tl_gput_right:Nn + \cs_set_eq:NN \__hook_clist_gput:NV + \clist_gput_right:NV } + \prop_set_eq:Nc \l__hook_work_prop + { g__hook_#1_code_prop } \__hook_initialize_single:ccn { __hook~#1 } { g__hook_#1_labels_clist } {#1} \__hook_debug:n - { \exp_args:NNx \prop_gput:Nnn \g__hook_used_prop {#1} { } } + { \exp_args:NNx \prop_gput:Nnn \g__hook_used_prop + {#1} { } } } } } @@ -6356,7 +6516,8 @@ of this package available from CTAN} \int_compare:nNnT { \cs:w \__hook_tl_csname:n {##1} \cs_end: } = 0 { - \tl_set:cn { \__hook_tl_csname:n { \l__hook_rear_tl } } {##1} + \tl_set:cn + { \__hook_tl_csname:n { \l__hook_rear_tl } } {##1} \tl_set:Nn \l__hook_rear_tl {##1} } } @@ -6407,42 +6568,50 @@ of this package available from CTAN} {#3} } } - \__hook_debug:n { \__hook_debug_label_data:N \l__hook_work_prop } + \__hook_debug:n + { \__hook_debug_label_data:N \l__hook_work_prop } \tl_set:Nn \l__hook_rear_tl { 0 } \tl_set:cn { \__hook_tl_csname:n { 0 } } { 0 } \seq_map_inline:Nn \l__hook_labels_seq { - \int_compare:nNnT { \cs:w \__hook_tl_csname:n {##1} \cs_end: } = 0 - { - \tl_set:cn { \__hook_tl_csname:n { \l__hook_rear_tl } }{##1} - \tl_set:Nn \l__hook_rear_tl {##1} - } + \int_compare:nNnT + { \cs:w \__hook_tl_csname:n {##1} \cs_end: } = 0 + { + \tl_set:cn { \__hook_tl_csname:n + { \l__hook_rear_tl } } {##1} + \tl_set:Nn \l__hook_rear_tl {##1} + } } \tl_set_eq:Nc \l__hook_front_tl { \__hook_tl_csname:n { 0 } } \__hook_tl_gclear:N #1 \clist_gclear:N #2 - \bool_while_do:nn { ! \str_if_eq_p:Vn \l__hook_front_tl { 0 } } + \bool_while_do:nn + { ! \str_if_eq_p:Vn \l__hook_front_tl { 0 } } { \int_decr:N \l__hook_labels_int - \prop_get:NVN \l__hook_work_prop \l__hook_front_tl \l__hook_return_tl + \prop_get:NVN \l__hook_work_prop + \l__hook_front_tl \l__hook_return_tl \exp_args:NNV \__hook_tl_gput:Nn #1 \l__hook_return_tl \__hook_clist_gput:NV #2 \l__hook_front_tl - \__hook_debug:n{ \iow_term:x{Handled~ code~ for~ \l__hook_front_tl} } - \seq_map_inline:cn { \__hook_seq_csname:n { \l__hook_front_tl } } + \__hook_debug:n{ \iow_term:x + {Handled~ code~ for~ \l__hook_front_tl} } + \seq_map_inline:cn + { \__hook_seq_csname:n { \l__hook_front_tl } } { \tl_set:cx { \__hook_tl_csname:n {##1} } - { \int_eval:n - { \cs:w \__hook_tl_csname:n {##1} \cs_end: - 1 } - } + { \int_eval:n + { \cs:w \__hook_tl_csname:n {##1} \cs_end: - 1 } + } \int_compare:nNnT - { \cs:w \__hook_tl_csname:n {##1} \cs_end: } = 0 - { - \tl_set:cn { \__hook_tl_csname:n { \l__hook_rear_tl } } {##1} - \tl_set:Nn \l__hook_rear_tl {##1} - } + { \cs:w \__hook_tl_csname:n {##1} \cs_end: } = 0 + { + \tl_set:cn { \__hook_tl_csname:n + { \l__hook_rear_tl } } {##1} + \tl_set:Nn \l__hook_rear_tl {##1} + } } \tl_set_eq:Nc \l__hook_front_tl - { \__hook_tl_csname:n { \l__hook_front_tl } } + { \__hook_tl_csname:n { \l__hook_front_tl } } } \int_compare:nNnF \l__hook_labels_int = 0 { @@ -6451,7 +6620,8 @@ of this package available from CTAN} \__hook_debug_label_data:N \l__hook_work_prop \iow_term:x{====================} } - \exp_args:NNo \__hook_tl_gput:Nn #1 { \cs:w __hook_toplevel~#3 \cs_end: } + \exp_args:NNo \__hook_tl_gput:Nn #1 + { \cs:w __hook_toplevel~#3 \cs_end: } \__hook_tl_gput_right:No #1 { \cs:w __hook_next~#3 \cs_end: } } \cs_generate_variant:Nn \__hook_tl_gput_right:Nn { No } @@ -6588,7 +6758,7 @@ of this package available from CTAN} hook~'#1' \__hook_if_disabled:nF {#1} { - \exp_args:Nf \__hook_print_args:nn {#1} + \exp_args:Nne \__hook_print_args:nn {#1} { \int_eval:n { \str_count:e { \__hook_parameter:n {#1} } / 3 } @@ -6697,7 +6867,8 @@ of this package available from CTAN} } \__hook_preamble_hook:n {#1} \__hook_log_cmd:x - { ^^J ->~The~ \__hook_if_generic:nT {#1} { generic~ } hook~'#1': } + { ^^J ->~The~ \__hook_if_generic:nT + {#1} { generic~ } hook~'#1': } \__hook_if_usable:nF {#1} { \__hook_log_line:x { The~hook~is~not~declared. } } \__hook_if_disabled:nT {#1} @@ -6710,26 +6881,30 @@ of this package available from CTAN} { \__hook_log_line_indent:x { --- } } { \prop_map_inline:cn { g__hook_#1_code_prop } - { \__hook_log_line_indent:x { ##1~->~\tl_to_str:n {##2} } } + { \__hook_log_line_indent:x + { ##1~->~\tl_to_str:n {##2} } } } \__hook_log_line:x { Document-level~(top-level)~code \__hook_if_usable:nT {#1} - { ~(executed~\__hook_if_reversed:nTF {#1} {first} {last} ) } : + { ~(executed~ + \__hook_if_reversed:nTF {#1} {first} {last} ) } : } \__hook_log_line_indent:x { \tl_if_empty:cTF { __hook_toplevel~#1 } { --- } - { -> ~ \exp_args:Nv \tl_to_str:n { __hook_toplevel~#1 } } + { -> ~ \exp_args:Nv \tl_to_str:n + { __hook_toplevel~#1 } } } \__hook_log_line:x { Extra~code~for~next~invocation: } \__hook_log_line_indent:x { \tl_if_empty:cTF { __hook_next~#1 } { --- } - { ->~ \exp_args:Nv \__hook_log_next_code:n { __hook_next~#1 } } + { ->~ \exp_args:Nv \__hook_log_next_code:n + { __hook_next~#1 } } } \__hook_log_line:x { Rules: } \bool_set_true:N \l__hook_tmpa_bool @@ -6753,7 +6928,8 @@ of this package available from CTAN} { Execution~order \bool_if:NTF \l__hook_tmpa_bool - { \__hook_if_reversed:nT {#1} { ~(after~reversal) } } + { \__hook_if_reversed:nT + {#1}{ ~(after~reversal) } } { ~(after~ \__hook_if_reversed:nT {#1} { reversal~and~ } applying~rules) @@ -6764,16 +6940,19 @@ of this package available from CTAN} \@spaces \clist_if_empty:cTF { g__hook_#1_labels_clist } { --- } - { \clist_use:cn { g__hook_#1_labels_clist } { ,~ } } + { \clist_use:cn + { g__hook_#1_labels_clist } { ,~ } } } } { \__hook_log_line:x { Execution~order: } #2 { - \@spaces Not~set~because~the~hook~ \__hook_if_usable:nTF {#1} + \@spaces Not~set~because~the~hook~ + \__hook_if_usable:nTF {#1} { code~pool~is~empty } - { is~\__hook_if_disabled:nTF {#1} {disabled} {undeclared} } + { is~\__hook_if_disabled:nTF + {#1} {disabled} {undeclared} } } } } @@ -6863,7 +7042,8 @@ of this package available from CTAN} \IncludeInRelease{2020/10/01}{\hook_gput_next_code:nn} {Hooks~with~args} \cs_gset_protected:Npn \hook_gput_next_code:nn #1 - { \__hook_normalize_hook_args:Nn \__hook_gput_next_code:nn {#1} } + { \__hook_normalize_hook_args:Nn + \__hook_gput_next_code:nn {#1} } \cs_gset_protected:Npn \hook_gput_next_code_with_args:nn #1 #2 { } \EndIncludeInRelease \cs_new_protected:Npn \__hook_gput_next_code:nn #1 #2 @@ -6979,7 +7159,8 @@ of this package available from CTAN} \fi: \cs:w __hook~#1 \__hook_use_end: } -\cs_new:Npn \__hook_use_undefined:w #1 #2 __hook~#3 \__hook_use_end: +\cs_new:Npn \__hook_use_undefined:w + #1 #2 __hook~#3 \__hook_use_end: { #1 % fi \__hook_use:wn #3 / \s__hook_mark {#3} @@ -7039,12 +7220,13 @@ of this package available from CTAN} } \cs_new_protected:Npn \__hook_try_file_hook:n #1 { - \__hook_if_file_hook:wTF #1 / \s__hook_mark + \__hook_if_file_hook:wTF #1 / / \s__hook_mark { \exp_args:Ne \__hook_if_usable_use:n { \exp_args:Ne \__hook_file_hook_normalize:n {#1} } } - { \__hook_if_usable_use:n {#1} } % file/ generic hook (e.g. file/before) + { \__hook_if_usable_use:n {#1} } + % file/ generic hook (e.g. file/before) } \cs_new_protected:Npn \__hook_if_usable_use:n #1 { @@ -7060,12 +7242,14 @@ of this package available from CTAN} \cs_new_protected:Npn \hook_use_once:n #1 { \__hook_if_execute_immediately:nF {#1} - { \__hook_normalize_hook_args:Nn \__hook_use_once:nn { \use:n {#1} } { 0 } } + { \__hook_normalize_hook_args:Nn \__hook_use_once:nn + { \use:n {#1} } { 0 } } } \cs_new_protected:Npn \hook_use_once:nnw #1 #2 { \__hook_if_execute_immediately:nF {#1} - { \__hook_normalize_hook_args:Nn \__hook_use_once:nn { \use:n {#1} } {#2} } + { \__hook_normalize_hook_args:Nn \__hook_use_once:nn + { \use:n {#1} } {#2} } } \EndIncludeInRelease \IncludeInRelease{2020/10/01}{\hook_use_once:nnw} @@ -7073,7 +7257,8 @@ of this package available from CTAN} \cs_gset_protected:Npn \hook_use_once:n #1 { \__hook_if_execute_immediately:nF {#1} - { \__hook_normalize_hook_args:Nn \__hook_use_once:n { \use:n {#1} } } + { \__hook_normalize_hook_args:Nn \__hook_use_once:n + { \use:n {#1} } } } \cs_gset:Npn \hook_use_once:nnw #1 #2 { \use:c { use_none: \prg_replicate:nn {#2} { n } } } @@ -7085,7 +7270,8 @@ of this package available from CTAN} \__hook_preamble_hook:n {#1} \__hook_use_once_set:n {#1} \__hook_replacing_args_false: - \__hook_cs_gput_right:nnn { _next } {#1} { \__hook_use_once_clear:n {#1} } + \__hook_cs_gput_right:nnn { _next } {#1} + { \__hook_use_once_clear:n {#1} } \__hook_replacing_args_reset: \__hook_if_usable:nTF {#1} { \__hook_use_initialized:n {#1} } @@ -7333,7 +7519,8 @@ of this package available from CTAN} { Cannot~add~code~to~disabled~hook~'#1'. } { The~hook~'#1'~you~tried~to~add~code~to~was~previously~disabled~ - with~\iow_char:N\\hook_disable_generic:n~or~\iow_char:N\\DisableGenericHook,~so~ + with~\iow_char:N\\hook_disable_generic:n~or~ + \iow_char:N\\DisableGenericHook,~so~ it~cannot~have~code~added~to~it. } \msg_new:nnn { hooks } { empty-label } @@ -7442,7 +7629,7 @@ of this package available from CTAN} {Hooks~with~args} \cs_new_protected:Npn \NewHookWithArguments #1 #2 { } \cs_new_protected:Npn \NewReversedHookWithArguments #1 #2 { } -\cs_new_protected:Npn \NewMirroredHookPairWithArguments #1 #2 #3 { } +\cs_new_protected:Npn \NewMirroredHookPairWithArguments #1 #2 #3{} \EndIncludeInRelease \IncludeInRelease{2021/06/01}{\ActivateGenericHook} {Providing~hooks} @@ -7644,7 +7831,8 @@ of this package available from CTAN} \exp_args:No \exp_not:o { \cs:w __hook#1~#2 \exp_last_unbraced:Ne \cs_end: - { \__hook_braced_cs_parameter:n { __hook#1~#2 } } + { \__hook_braced_cs_parameter:n + { __hook#1~#2 } } } } } @@ -7659,12 +7847,10 @@ of this package available from CTAN} } \ExplSyntaxOff %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% File: ltcmdhooks.dtx +%% From File: ltcmdhooks.dtx %% Copyright (C) 2020-2024 %% Frank Mittelbach, Phelype Oleinik, The LaTeX Project -%%% From File: ltcmdhooks.dtx -\def\ltcmdhooksversion{v1.0i} -\def\ltcmdhooksdate{2023/06/16} +%%% From File: lthooks.dtx \ExplSyntaxOn \NewModuleRelease{2021/06/01}{ltcmdhooks} {The~hook~management~system~for~commands} @@ -7823,7 +8009,7 @@ of this package available from CTAN} \__hook_patch_debug:x { ++~command~can~be~patched~without~rescanning } \int_set:Nn \l__hook_patch_num_args_int { - \exp_args:Nf \str_count:n { \cs_argument_spec:N #2 } / 2 + \exp_args:Nf \str_count:n { \__kernel_cs_parameter_spec:N #2 } / 2 \bool_if:NT #1 { -1 } } \int_compare:nNnTF { \l__hook_patch_num_args_int } > { \c_zero_int } @@ -7898,7 +8084,7 @@ of this package available from CTAN} \__hook_patch_debug:x { ++~command~can~be~patched~without~rescanning } \int_set:Nn \l__hook_patch_num_args_int { - \exp_args:Nf \str_count:n { \cs_argument_spec:N #2 } / 2 + \exp_args:Nf \str_count:n { \__kernel_cs_parameter_spec:N #2 } / 2 \bool_if:NT #1 { -1 } } \int_compare:nNnTF { \l__hook_patch_num_args_int } > { \c_zero_int } @@ -8031,7 +8217,7 @@ of this package available from CTAN} { ~ \__hook_double_hashes:w } \cs_new_protected:Npn \__hook_retokenize_patch:Nnn #1 #2 #3 { - \str_if_eq:eeTF { \cs_argument_spec:N #1 } { } + \str_if_eq:eeTF { \__kernel_cs_parameter_spec:N #1 } { } { \__hook_patch_expand_redefine:NNnn \c_false_bool #1 {#2} {#3} } { \__hook_patch_debug:x { ..~command~can~only~be~patched~by~rescanning } @@ -8274,8 +8460,6 @@ of this package available from CTAN} \ExplSyntaxOff %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% From File: ltsockets.dtx -\def\ltsocketsversion{0.9a} -\def\ltsocketsdate{2023-08-21} \ExplSyntaxOn \NewModuleRelease{2023/11/01}{ltsockets} {The~socket~management~system} @@ -8465,6 +8649,1192 @@ of this package available from CTAN} \EndModuleRelease \ExplSyntaxOff %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% From File: lttemplates.dtx +\ExplSyntaxOn +\NewModuleRelease{2024/06/01}{lttemplates} + {Prototype~document~commands}% +\tl_const:Nn \c__template_code_root_tl { template~code~>~ } +\tl_const:Nn \c__template_defaults_root_tl { template~defaults~>~ } +\tl_const:Nn \c__template_instances_root_tl { template~instance~>~ } +\tl_const:Nn \c__template_keytypes_root_tl { template~key~types~>~ } +\tl_const:Nn \c__template_key_order_root_tl { template~key~order~>~ } +\tl_const:Nn \c__template_values_root_tl { template~values~>~ } +\tl_const:Nn \c__template_vars_root_tl { template~vars~>~ } +\seq_const_from_clist:Nn \c__template_keytypes_arg_seq + { choice , function , instance } +\prop_new:N \g__template_type_prop +\tl_new:N \l__template_assignments_tl +\tl_new:N \l__template_default_tl +\bool_new:N \l__template_error_bool +\bool_new:N \l__template_global_bool +\tl_new:N \l__template_key_name_tl +\tl_new:N \l__template_keytype_tl +\tl_new:N \l__template_keytype_arg_tl +\tl_new:N \l__template_value_tl +\tl_new:N \l__template_var_tl +\prop_new:N \l__template_keytypes_prop +\seq_new:N \l__template_key_order_seq +\prop_new:N \l__template_values_prop +\prop_new:N \l__template_vars_prop +\clist_new:N \l__template_tmp_clist +\dim_new:N \l__template_tmp_dim +\int_new:N \l__template_tmp_int +\muskip_new:N \l__template_tmp_muskip +\skip_new:N \l__template_tmp_skip +\tl_new:N \l__template_tmp_tl +\scan_new:N \s__template_mark +\scan_new:N \s__template_stop +\quark_new:N \q__template_nil +\__kernel_quark_new_conditional:Nn \__template_quark_if_nil:N { F } +\cs_new_protected:Npn \__template_execute_if_arg_agree:nnT #1#2#3 + { + \prop_get:NnN \g__template_type_prop {#1} \l__template_tmp_tl + \int_compare:nNnTF {#2} = \l__template_tmp_tl + {#3} + { + \msg_error:nneee { template } { argument-number-mismatch } + {#1} { \l__template_tmp_tl } {#2} + } + } +\cs_new_protected:Npn \__template_execute_if_code_exist:nnT #1#2#3 + { + \cs_if_exist:cTF { \c__template_code_root_tl #1 / #2 } + {#3} + { \msg_error:nnnn { template } { no-template-code } {#1} {#2} } + } +\cs_new_protected:Npn \__template_execute_if_keytype_exist:nT #1#2 + { + \cs_if_exist:cTF { __template_store_value_ #1 :n } + {#2} + { \msg_error:nnn { template } { unknown-keytype } {#1} } + } +\cs_generate_variant:Nn \__template_execute_if_keytype_exist:nT { V } +\cs_new_protected:Npn \__template_execute_if_type_exist:nT #1#2 + { + \prop_if_in:NnTF \g__template_type_prop {#1} + {#2} + { \msg_error:nnn { template } { unknown-type } {#1} } + } +\cs_new_protected:Npn \__template_if_keys_exist:nnT #1#2#3 + { + \cs_if_exist:cTF { \c__template_keytypes_root_tl #1 / #2 } + {#3} + { \msg_error:nnnn { template } { unknown-template } {#1} {#2} } + } +\prg_new_conditional:Npnn \__template_if_key_value:n #1 { T , F , TF } + { + \str_if_eq:noTF { \KeyValue } { \tl_head:w #1 \q_nil \q_stop } + \prg_return_true: + \prg_return_false: + } +\prg_generate_conditional_variant:Nnn \__template_if_key_value:n { V } { T , F , TF } +\prg_new_conditional:Npnn \__template_if_instance_exist:nn #1#2 { T, F, TF } + { + \cs_if_exist:cTF { \c__template_instances_root_tl #1 / #2 } + \prg_return_true: + \prg_return_false: + } +\prg_new_conditional:Npnn \__template_if_use_template:n #1 { TF } + { + \str_if_eq:noTF { \UseTemplate } { \tl_head:w #1 \q_nil \q_stop } + \prg_return_true: + \prg_return_false: +} +\cs_new_protected:Npn \__template_store_defaults:nn #1#2 + { + \debug_suspend: + \prop_gclear_new:c { \c__template_defaults_root_tl #1 / #2 } + \prop_gset_eq:cN { \c__template_defaults_root_tl #1 / #2 } + \l__template_values_prop + \debug_resume: + } +\cs_new_protected:Npn \__template_store_keytypes:nn #1#2 + { + \debug_suspend: + \prop_if_exist:cTF { \c__template_keytypes_root_tl #1 / #2 } + { + \msg_info:nnnn { template } { declare-template-interface } {#1} {#2} + \prop_gclear:c { \c__template_keytypes_root_tl #1 / #2 } + } + { \prop_new:c { \c__template_keytypes_root_tl #1 / #2 } } + \prop_gset_eq:cN { \c__template_keytypes_root_tl #1 / #2 } + \l__template_keytypes_prop + \seq_gclear_new:c { \c__template_key_order_root_tl #1 / #2 } + \seq_gset_eq:cN { \c__template_key_order_root_tl #1 / #2 } + \l__template_key_order_seq + \debug_resume: + } +\cs_new_protected:Npn \__template_store_values:nn #1#2 + { + \debug_suspend: + \prop_clear_new:c { \c__template_values_root_tl #1 / #2 } + \prop_set_eq:cN { \c__template_values_root_tl #1 / #2 } + \l__template_values_prop + \debug_resume: + } +\cs_new_protected:Npn \__template_store_vars:nn #1#2 + { + \debug_suspend: + \prop_gclear_new:c { \c__template_vars_root_tl #1 / #2 } + \prop_gset_eq:cN { \c__template_vars_root_tl #1 / #2 } + \l__template_vars_prop + \debug_resume: + } +\cs_new_protected:Npn \__template_recover_defaults:nn #1#2 + { + \prop_if_exist:cTF + { \c__template_defaults_root_tl #1 / #2 } + { + \prop_set_eq:Nc \l__template_values_prop + { \c__template_defaults_root_tl #1 / #2 } + } + { \prop_clear:N \l__template_values_prop } + } +\cs_new_protected:Npn \__template_recover_keytypes:nn #1#2 + { + \prop_if_exist:cTF + { \c__template_keytypes_root_tl #1 / #2 } + { + \prop_set_eq:Nc \l__template_keytypes_prop + { \c__template_keytypes_root_tl #1 / #2 } + } + { \prop_clear:N \l__template_keytypes_prop } + \seq_if_exist:cTF { \c__template_key_order_root_tl #1 / #2 } + { + \seq_set_eq:Nc \l__template_key_order_seq + { \c__template_key_order_root_tl #1 / #2 } + } + { \seq_clear:N \l__template_key_order_seq } + } +\cs_new_protected:Npn \__template_recover_values:nn #1#2 + { + \prop_if_exist:cTF + { \c__template_values_root_tl #1 / #2 } + { + \prop_set_eq:Nc \l__template_values_prop + { \c__template_values_root_tl #1 / #2 } + } + { \prop_clear:N \l__template_values_prop } + } +\cs_new_protected:Npn \__template_recover_vars:nn #1#2 + { + \prop_if_exist:cTF + { \c__template_vars_root_tl #1 / #2 } + { + \prop_set_eq:Nc \l__template_vars_prop + { \c__template_vars_root_tl #1 / #2 } + } + { \prop_clear:N \l__template_vars_prop } + } +\cs_new_protected:Npn \__template_define_type:nn #1#2 + { + \prop_if_in:NnTF \g__template_type_prop {#1} + { \msg_error:nnn { template } { type-already-defined } {#1} } + { \__template_declare_type:nn {#1} {#2} } + } +\cs_new_protected:Npn \__template_declare_type:nn #1#2 + { + \int_set:Nn \l__template_tmp_int {#2} + \int_compare:nTF { 0 <= \l__template_tmp_int <= 9 } + { + \msg_info:nnnV { template } { declare-type } + {#1} \l__template_tmp_int + \prop_gput:NnV \g__template_type_prop {#1} + \l__template_tmp_int + } + { + \msg_error:nnnV { template } { bad-number-of-arguments } + {#1} \l__template_tmp_int + } + } +\cs_new_protected:Npn \__template_declare_template_keys:nnnn #1#2#3#4 + { + \__template_execute_if_type_exist:nT {#1} + { + \__template_execute_if_arg_agree:nnT {#1} {#3} + { + \prop_clear:N \l__template_values_prop + \prop_clear:N \l__template_keytypes_prop + \seq_clear:N \l__template_key_order_seq + \keyval_parse:NNn + \__template_parse_keys_elt:n \__template_parse_keys_elt:nn {#4} + \__template_store_defaults:nn {#1} {#2} + \__template_store_keytypes:nn {#1} {#2} + } + } + } +\cs_new_protected:Npn \__template_parse_keys_elt:n #1 + { + \__template_split_keytype:n {#1} + \bool_if:NF \l__template_error_bool + { + \__template_execute_if_keytype_exist:VT \l__template_keytype_tl + { + \seq_map_function:NN \c__template_keytypes_arg_seq + \__template_parse_keys_elt_aux:n + \bool_if:NF \l__template_error_bool + { + \seq_if_in:NoTF \l__template_key_order_seq + \l__template_key_name_tl + { + \msg_error:nnV { template } { duplicate-key-interface } + \l__template_key_name_tl + } + { \__template_parse_keys_elt_aux: } + } + } + } + } +\cs_new_protected:Npn \__template_parse_keys_elt_aux:n #1 + { + \str_if_eq:VnT \l__template_keytype_tl {#1} + { + \tl_if_empty:NT \l__template_keytype_arg_tl + { + \msg_error:nnn { template } { keytype-requires-argument } {#1} + \bool_set_true:N \l__template_error_bool + \seq_map_break: + } + } + } +\cs_new_protected:Npn \__template_parse_keys_elt_aux: + { + \tl_set:Ne \l__template_tmp_tl + { + \l__template_keytype_tl + \tl_if_empty:NF \l__template_keytype_arg_tl + { { \l__template_keytype_arg_tl } } + } + \prop_put:NVV \l__template_keytypes_prop \l__template_key_name_tl + \l__template_tmp_tl + \seq_put_right:NV \l__template_key_order_seq \l__template_key_name_tl + \str_if_eq:VnT \l__template_keytype_tl { choice } + { + \clist_if_in:NnT \l__template_keytype_arg_tl { unknown } + { \msg_error:nn { template } { choice-unknown-reserved } } + } + } +\cs_new_protected:Npn \__template_parse_keys_elt:nn #1#2 + { + \__template_parse_keys_elt:n {#1} + \use:c { __template_store_value_ \l__template_keytype_tl :n } {#2} + } +\cs_new_protected:Npe \__template_split_keytype:n #1 + { + \exp_not:N \bool_set_false:N \exp_not:N \l__template_error_bool + \tl_set:Nn \exp_not:N \l__template_tmp_tl {#1} + \tl_replace_all:Nnn \exp_not:N \l__template_tmp_tl { : } { \token_to_str:N : } + \tl_if_in:VnTF \exp_not:N \l__template_tmp_tl { \token_to_str:N : } + { + \exp_not:n + { + \tl_clear:N \l__template_key_name_tl + \exp_after:wN \__template_split_keytype_aux:w + \l__template_tmp_tl \s__template_stop + } + } + { + \exp_not:N \bool_set_true:N \exp_not:N \l__template_error_bool + \msg_error:nnn { template } { missing-keytype } {#1} + } + } +\use:e + { + \cs_new_protected:Npn \exp_not:N \__template_split_keytype_aux:w + #1 \token_to_str:N : #2 \s__template_stop + { + \tl_put_right:Ne \exp_not:N \l__template_key_name_tl + { + \exp_not:N \tl_trim_spaces:e + { \exp_not:N \tl_to_str:n {#1} } + } + \tl_if_in:nnTF {#2} { \token_to_str:N : } + { + \tl_put_right:Nn \exp_not:N \l__template_key_name_tl + { \token_to_str:N : } + \exp_not:N \__template_split_keytype_aux:w #2 \s__template_stop + } + { + \exp_not:N \tl_if_empty:NTF \exp_not:N \l__template_key_name_tl + { + \msg_error:nnn { template } { empty-key-name } + { \token_to_str:N : #2 } + } + { \exp_not:N \__template_split_keytype_arg:n {#2} } + } + } + } +\cs_new_protected:Npn \__template_split_keytype_arg:n #1 + { + \tl_set:Ne \l__template_keytype_tl { \tl_trim_spaces:n {#1} } + \tl_clear:N \l__template_keytype_arg_tl + \cs_set_protected:Npn \__template_split_keytype_arg_aux:n ##1 + { + \tl_if_in:nnT {#1} {##1} + { + \cs_set:Npn \__template_split_keytype_arg_aux:w + ####1 ##1 ####2 \s__template_stop + { + \tl_if_blank:nT {####1} + { + \tl_set:Ne \l__template_keytype_tl + { \tl_trim_spaces:n {##1} } + \tl_if_blank:nF {####2} + { + \tl_set:Ne \l__template_keytype_arg_tl + { \use:n ####2 } + } + \seq_map_break: + } + } + \__template_split_keytype_arg_aux:w #1 \s__template_stop + } + } + \seq_map_function:NN \c__template_keytypes_arg_seq + \__template_split_keytype_arg_aux:n + } +\cs_generate_variant:Nn \__template_split_keytype_arg:n { V } +\cs_new:Npn \__template_split_keytype_arg_aux:n #1 { } +\cs_new:Npn \__template_split_keytype_arg_aux:w #1 \s__template_stop { } +\cs_new_protected:Npn \__template_store_value_boolean:n #1 + { \prop_put:Non \l__template_values_prop \l__template_key_name_tl {#1} } +\cs_new_protected:Npn \__template_store_value:n #1 + { \prop_put:Non \l__template_values_prop \l__template_key_name_tl {#1} } +\cs_new_eq:NN \__template_store_value_choice:n \__template_store_value:n +\cs_new_eq:NN \__template_store_value_function:n \__template_store_value:n +\cs_new_eq:NN \__template_store_value_instance:n \__template_store_value:n +\cs_new_protected:Npn \__template_store_value_aux:Nn #1#2 + { \prop_put:Non \l__template_values_prop \l__template_key_name_tl {#2} } +\cs_new_protected:Npn \__template_store_value_integer:n + { \__template_store_value_aux:Nn \int_eval:n } +\cs_new_protected:Npn \__template_store_value_length:n + { \__template_store_value_aux:Nn \dim_eval:n } +\cs_new_protected:Npn \__template_store_value_muskip:n + { \__template_store_value_aux:Nn \muskip_eval:n } +\cs_new_protected:Npn \__template_store_value_real:n + { \__template_store_value_aux:Nn \fp_eval:n } +\cs_new_protected:Npn \__template_store_value_skip:n + { \__template_store_value_aux:Nn \skip_eval:n } +\cs_new_protected:Npn \__template_store_value_tokenlist:n + { \__template_store_value_aux:Nn \use:n } +\cs_new_eq:NN \__template_store_value_commalist:n \__template_store_value_tokenlist:n +\cs_new_protected:Npn \__template_declare_template_code:nnnnn #1#2#3#4#5 + { + \__template_execute_if_type_exist:nT {#1} + { + \__template_execute_if_arg_agree:nnT {#1} {#3} + { + \__template_if_keys_exist:nnT {#1} {#2} + { + \__template_store_key_implementation:nnn {#1} {#2} {#4} + \regex_match:nnTF { \c { AssignTemplateKeys } } {#5} + { \__template_declare_template_code:nnnn {#1} {#2} {#3} {#5} } + { + \__template_declare_template_code:nnnn + {#1} {#2} {#3} { \AssignTemplateKeys #5 } + } + } + } + } + } +\cs_new_protected:Npn \__template_declare_template_code:nnnn #1#2#3#4 + { + \cs_if_exist:cT { \c__template_code_root_tl #1 / #2 } + { \msg_info:nnnn { template } { declare-template-code } {#1} {#2} } + \cs_generate_from_arg_count:cNnn + { \c__template_code_root_tl #1 / #2 } + \cs_gset_protected:Npn {#3} {#4} + } +\cs_new_protected:Npn \__template_store_key_implementation:nnn #1#2#3 + { + \__template_recover_defaults:nn {#1} {#2} + \__template_recover_keytypes:nn {#1} {#2} + \prop_clear:N \l__template_vars_prop + \keyval_parse:nnn + { \__template_parse_vars_elt:n } { \__template_parse_vars_elt:nnn { #1 / #2 } } {#3} + \__template_store_vars:nn {#1} {#2} + \prop_map_inline:Nn \l__template_keytypes_prop + { \msg_error:nnnnn { template } { key-not-implemented } {##1} {#2} {#1} } + } +\cs_new_protected:Npn \__template_parse_vars_elt:n #1 + { \msg_error:nnn { template } { key-no-variable } {#1} } +\cs_new_protected:Npn \__template_parse_vars_elt:nnn #1#2#3 + { + \tl_set:Ne \l__template_key_name_tl + { \tl_trim_spaces:e { \tl_to_str:n {#2} } } + \prop_get:NVNTF \l__template_keytypes_prop + \l__template_key_name_tl + \l__template_keytype_tl + { + \__template_split_keytype_arg:V \l__template_keytype_tl + \__template_parse_vars_elt_aux:nn {#1} {#3} + \prop_remove:NV \l__template_keytypes_prop \l__template_key_name_tl + } + { \msg_error:nnn { template } { unknown-key } {#2} } + } +\cs_new_protected:Npn \__template_parse_vars_elt_aux:nn #1#2 + { + \__template_parse_vars_elt_aux:nw {#1} #2 global global \s__template_stop + } +\cs_new_protected:Npn \__template_parse_vars_elt_aux:nw + #1#2 global #3 global #4 \s__template_stop + { + \tl_if_blank:nTF {#4} + { \__template_parse_vars_elt_aux:nnn {#1} { } {#2} } + { + \tl_if_blank:nTF {#2} + { + \__template_parse_vars_elt_aux:nne + {#1} { global } { \tl_trim_spaces:n {#3} } + } + { \msg_error:nnn { template } { bad-variable } { #2 global #3 } } + } + } +\cs_new_protected:Npn \__template_parse_vars_elt_aux:nnn #1#2#3 + { + \str_case:VnF \l__template_keytype_tl + { + { choice } { \__template_implement_choices:nn {#1} {#3} } + { function } + { + \cs_if_exist:NF #3 + { \cs_new:Npn #3 { } } + \__template_parse_vars_elt_key:nn {#1} + { + .code:n = + { + \cs_generate_from_arg_count:NNnn + \exp_not:N #3 + \exp_not:c + { cs_ \str_if_eq:nnT {#1} { global } { g } set:Npn } + { \exp_not:V \l__template_keytype_arg_tl } + {##1} + } + } + \prop_put:NVn \l__template_vars_prop + \l__template_key_name_tl {#2#3} + } + { instance } + { + \__template_parse_vars_elt_key:nn {#1} + { + .code:n = + { + \exp_not:c + { cs_ \str_if_eq:nnT {#1} { global } { g } set:Npn } + \exp_not:N #3 { \UseInstance {##1} } + } + } + \prop_put:NVn \l__template_vars_prop + \l__template_key_name_tl {#2#3} + } + } + { + \tl_if_single:nTF {#3} + { + \cs_if_exist:NF #3 + { \use:c { \__template_map_var_type: _new:N } #3 } + \__template_parse_vars_elt_key:nn {#1} + { + . \__template_map_var_type: + _ \str_if_eq:nnT {#1} { global } { g } set:N + = \exp_not:N #3 + } + \prop_put:NVn \l__template_vars_prop + \l__template_key_name_tl {#2#3} + } + { \msg_error:nnn { template } { bad-variable } {#2#3} } + } + } +\cs_generate_variant:Nn \__template_parse_vars_elt_aux:nnn { nne } +\cs_new_protected:Npn \__template_parse_vars_elt_key:nn #1#2 + { + \keys_define:ne { template / #1 } + { \l__template_key_name_tl #2 } + } +\cs_new:Npn \__template_map_var_type: + { + \str_case:Vn \l__template_keytype_tl + { + { boolean } { bool } + { commalist } { clist } + { integer } { int } + { length } { dim } + { muskip } { muskip } + { real } { fp } + { skip } { skip } + { tokenlist } { tl } + } + } +\cs_new_protected:Npn \__template_implement_choices:nn #1#2 + { + \clist_set:NV \l__template_tmp_clist \l__template_keytype_arg_tl + \prop_put:NVn \l__template_vars_prop \l__template_key_name_tl { } + \keys_define:ne { template / #1 } { \l__template_key_name_tl .choice: } + \keyval_parse:nnn + { \__template_implement_choice_elt:n } + { \__template_implement_choice_elt:nnn {#1} } + {#2} + \prop_get:NVNT \l__template_values_prop \l__template_key_name_tl + \l__template_tmp_tl + { \__template_implement_choices_default: } + \clist_if_empty:NF \l__template_tmp_clist + { + \clist_map_inline:Nn \l__template_tmp_clist + { \msg_error:nnn { template } { choice-not-implemented } {##1} } + } + } +\cs_new_protected:Npn \__template_implement_choices_default: + { + \tl_set:Ne \l__template_tmp_tl + { \l__template_key_name_tl \c_space_tl \l__template_tmp_tl } + \prop_if_in:NVF \l__template_vars_prop \l__template_tmp_tl + { + \tl_set:Ne \l__template_tmp_tl + { \l__template_key_name_tl \c_space_tl \l__template_tmp_tl } + \prop_if_in:NVF \l__template_vars_prop \l__template_tmp_tl + { + \prop_get:NVN \l__template_keytypes_prop \l__template_key_name_tl + \l__template_tmp_tl + \__template_split_keytype_arg:V \l__template_tmp_tl + \prop_get:NVN \l__template_values_prop \l__template_key_name_tl + \l__template_tmp_tl + \msg_error:nnVV { template } { unknown-default-choice } + \l__template_key_name_tl + \l__template_key_name_tl + } + } + } +\cs_new_protected:Npn \__template_implement_choice_elt:nnn #1#2#3 + { + \clist_if_empty:NTF \l__template_tmp_clist + { + \str_if_eq:nnTF {#2} { unknown } + { \__template_implement_choice_elt_aux:nnn {#1} {#2} {#3} } + { \__template_implement_choice_elt_aux:n {#2} } + } + { + \clist_if_in:NnTF \l__template_tmp_clist {#2} + { + \clist_remove_all:Nn \l__template_tmp_clist {#2} + \__template_implement_choice_elt_aux:nnn {#1} {#2} {#3} + } + { \__template_implement_choice_elt_aux:n {#2} } + } + } +\cs_new_protected:Npn \__template_implement_choice_elt_aux:n #1 + { + \prop_get:NVN \l__template_keytypes_prop \l__template_key_name_tl + \l__template_tmp_tl + \__template_split_keytype_arg:V \l__template_tmp_tl + \msg_error:nnVn { template } { unknown-choice } \l__template_key_name_tl {#1} + } +\cs_new_protected:Npn \__template_implement_choice_elt_aux:nnn #1#2#3 + { + \keys_define:ne { template / #1 } + { \l__template_key_name_tl / #2 .code:n = { \exp_not:n {#3} } } + \tl_set:Ne \l__template_tmp_tl + { \l__template_key_name_tl \c_space_tl #2 } + \prop_put:NVn \l__template_vars_prop \l__template_tmp_tl {#3} + } +\cs_new_protected:Npn \__template_implement_choice_elt:n #1 + { + \msg_error:nnVn { template } { choice-requires-code } + \l__template_key_name_tl {#1} + } +\cs_new_protected:Npn \__template_edit_defaults:nnn #1#2#3 + { + \__template_if_keys_exist:nnT {#1} {#2} + { + \__template_recover_defaults:nn {#1} {#2} + \__template_parse_values:nnn {#1} {#2} {#3} + \__template_store_defaults:nn {#1} {#2} + } + } +\cs_new_protected:Npn \__template_parse_values:nnn #1#2#3 + { + \__template_recover_keytypes:nn {#1} {#2} + \keyval_parse:NNn + \__template_parse_values_elt:n \__template_parse_values_elt:nn {#3} + } +\cs_new_protected:Npn \__template_parse_values_elt:n #1 + { + \bool_set_true:N \l__template_error_bool + \msg_error:nnn { template } { key-no-value } {#1} + } +\cs_new_protected:Npn \__template_parse_values_elt:nn #1#2 + { + \tl_set:Ne \l__template_key_name_tl + { \tl_trim_spaces:e { \tl_to_str:n {#1} } } + \prop_get:NVNTF \l__template_keytypes_prop \l__template_key_name_tl + \l__template_tmp_tl + { \__template_parse_values_elt_aux:n {#2} } + { \msg_error:nnV { template } { unknown-key } \l__template_key_name_tl } + } +\cs_new_protected:Npn \__template_parse_values_elt_aux:n #1 + { + \__template_split_keytype_arg:V \l__template_tmp_tl + \use:c { __template_store_value_ \l__template_keytype_tl :n } {#1} + } +\cs_new_protected:Npn \__template_template_set_eq:nnn #1#2#3 + { + \__template_recover_defaults:nn {#1} {#3} + \__template_store_defaults:nn {#1} {#2} + \__template_recover_keytypes:nn {#1} {#3} + \__template_store_keytypes:nn {#1} {#2} + \__template_recover_vars:nn {#1} {#3} + \__template_store_vars:nn {#1} {#2} + \cs_if_exist:cT { \c__template_code_root_tl #1 / #2 } + { \msg_info:nnnn { template } { declare-template-code } {#1} {#2} } + \cs_gset_eq:cc { \c__template_code_root_tl #1 / #2 } + { \c__template_code_root_tl #1 / #3 } + } +\cs_new_protected:Npn \__template_declare_instance:nnnn #1#2#3#4 + { + \__template_execute_if_code_exist:nnT {#1} {#2} + { + \__template_recover_defaults:nn {#1} {#2} + \__template_recover_vars:nn {#1} {#2} + \__template_declare_instance_aux:nnnn {#1} {#2} {#3} {#4} + } + } +\cs_new_protected:Npn \__template_declare_instance_aux:nnnn #1#2#3#4 + { + \bool_set_false:N \l__template_error_bool + \__template_parse_values:nnn {#1} {#2} {#4} + \bool_if:NF \l__template_error_bool + { + \prop_put:Nnn \l__template_values_prop { from~template } {#2} + \__template_store_values:nn {#1} {#3} + \__template_convert_to_assignments: + \cs_if_exist:cT { \c__template_instances_root_tl #1 / #3 } + { \msg_info:nnnn { template } { declare-instance } {#3} {#1} } + \cs_set_protected:cpe { \c__template_instances_root_tl #1 / #3 } + { + \exp_not:N \__template_assignments_push:n + { \exp_not:V \l__template_assignments_tl } + \exp_not:c { \c__template_code_root_tl #1 / #2 } + } + } + } +\cs_new_protected:Npn \__template_instance_set_eq:nnn #1#2#3 + { + \__template_if_instance_exist:nnTF {#1} {#3} + { + \__template_recover_values:nn {#1} {#3} + \__template_store_values:nn {#1} {#2} + \cs_if_exist:cT { \c__template_instances_root_tl #1 / #2 } + { \msg_info:nnnn { template } { declare-instance } {#2} {#1} } + \cs_set_eq:cc { \c__template_instances_root_tl #1 / #2 } + { \c__template_instances_root_tl #1 / #3 } + } + { \msg_error:nnnn { template } { unknown-instance } {#1} {#3} } + } +\cs_new_protected:Npn \__template_edit_instance:nnn #1#2#3 + { + \__template_if_instance_exist:nnTF {#1} {#2} + { + \__template_recover_values:nn {#1} {#2} + \prop_get:NnN \l__template_values_prop { from~template } + \l__template_tmp_tl + \__template_edit_instance_aux:nVnn + {#1} \l__template_tmp_tl {#2} {#3} + } + { \msg_error:nnnn { template } { unknown-instance } {#1} {#2} } + } +\cs_new_protected:Npn \__template_edit_instance_aux:nnnn #1#2#3#4 + { + \__template_recover_vars:nn {#1} {#2} + \__template_declare_instance_aux:nnnn {#1} {#2} {#3} {#4} + } +\cs_generate_variant:Nn \__template_edit_instance_aux:nnnn { nV } +\cs_new_protected:Npn \__template_convert_to_assignments: + { + \tl_clear:N \l__template_assignments_tl + \seq_map_function:NN \l__template_key_order_seq + \__template_convert_to_assignments_aux:n + } +\cs_new_protected:Npn \__template_convert_to_assignments_aux:n #1 + { + \prop_get:NnN \l__template_keytypes_prop {#1} \l__template_tmp_tl + \__template_convert_to_assignments_aux:nV {#1} \l__template_tmp_tl + } +\cs_new_protected:Npn \__template_convert_to_assignments_aux:nn #1#2 + { + \prop_get:NnNT \l__template_values_prop {#1} \l__template_value_tl + { + \prop_get:NnNTF \l__template_vars_prop {#1} \l__template_var_tl + { + \__template_split_keytype_arg:n {#2} + \str_if_eq:VnF \l__template_keytype_tl { choice } + { + \str_if_eq:VnF \l__template_keytype_tl { code } + { \__template_find_global: } + } + \tl_set:Nn \l__template_key_name_tl {#1} + \cs_if_exist_use:cF { __template_assign_ \l__template_keytype_tl : } + { \__template_assign_variable: } + } + { \msg_error:nnn { template } { unknown-attribute } {#1} } + } + } +\cs_generate_variant:Nn \__template_convert_to_assignments_aux:nn { nV } +\cs_new_protected:Npn \__template_find_global: + { + \bool_set_false:N \l__template_global_bool + \tl_if_in:onT \l__template_var_tl { global } + { + \exp_after:wN \__template_find_global_aux:w \l__template_var_tl \s__template_stop + } + } +\cs_new_protected:Npn \__template_find_global_aux:w #1 global #2 \s__template_stop + { + \tl_set:Nn \l__template_var_tl {#2} + \bool_set_true:N \l__template_global_bool + } +\cs_new_protected:Npn \__template_use_template:nnn #1#2#3 + { + \__template_execute_if_code_exist:nnT {#1} {#2} + { + \__template_recover_defaults:nn {#1} {#2} + \__template_recover_vars:nn {#1} {#2} + \__template_parse_values:nnn {#1} {#2} {#3} + \__template_convert_to_assignments: + \use:c { \c__template_code_root_tl #1 / #2 } + } + } +\cs_new_protected:Npn \__template_assign_boolean: + { + \bool_if:NTF \l__template_global_bool + { \__template_assign_boolean_aux:n { bool_gset } } + { \__template_assign_boolean_aux:n { bool_set } } + } +\cs_new_protected:Npn \__template_assign_boolean_aux:n #1 + { + \__template_if_key_value:VTF \l__template_value_tl + { + \__template_key_to_value: + \tl_put_right:Ne \l__template_assignments_tl + { + \exp_not:c { #1 _eq:NN } + \exp_not:V \l__template_var_tl + \exp_not:V \l__template_value_tl + } + } + { + \tl_put_right:Ne \l__template_assignments_tl + { + \exp_not:c { #1 _ \l__template_value_tl :N } + \exp_not:V \l__template_var_tl + } + } + } +\cs_new_protected:Npn \__template_assign_choice: + { + \__template_assign_choice_aux:eF + { \l__template_key_name_tl \c_space_tl \l__template_value_tl } + { + \__template_assign_choice_aux:eF + { \l__template_key_name_tl \c_space_tl unknown } + { + \prop_get:NVN \l__template_keytypes_prop \l__template_key_name_tl + \l__template_tmp_tl + \__template_split_keytype_arg:V \l__template_tmp_tl + \msg_error:nnVV { template } { unknown-choice } + \l__template_key_name_tl + \l__template_value_tl + } + } + } +\cs_new_protected:Npn \__template_assign_choice_aux:nF #1 + { + \prop_get:NnNTF \l__template_vars_prop {#1} \l__template_tmp_tl + { \tl_put_right:NV \l__template_assignments_tl \l__template_tmp_tl } + } +\cs_generate_variant:Nn \__template_assign_choice_aux:nF { e } +\cs_new_protected:Npn \__template_assign_function: + { + \bool_if:NTF \l__template_global_bool + { \__template_assign_function_aux:N \cs_gset:Npn } + { \__template_assign_function_aux:N \cs_set:Npn } + } +\cs_new_protected:Npn \__template_assign_function_aux:N #1 + { + \tl_put_right:Ne \l__template_assignments_tl + { + \cs_generate_from_arg_count:NNnn + \exp_not:V \l__template_var_tl + \exp_not:N #1 + { \exp_not:V \l__template_keytype_arg_tl } + { \exp_not:V \l__template_value_tl } + } + } +\cs_new_protected:Npn \__template_assign_instance: + { + \bool_if:NTF \l__template_global_bool + { \__template_assign_instance_aux:N \cs_gset_protected:Npn } + { \__template_assign_instance_aux:N \cs_set_protected:Npn } + } +\cs_new_protected:Npn \__template_assign_instance_aux:N #1 + { + \tl_put_right:Ne \l__template_assignments_tl + { + \exp_not:N #1 \exp_not:V \l__template_var_tl + { + \__template_use_instance:nn + { \exp_not:V \l__template_keytype_arg_tl } + { \exp_not:V \l__template_value_tl } + } + } + } +\cs_new_protected:Npn \__template_assign_variable: + { + \__template_assign_variable:c + { + \__template_map_var_type: _ + \bool_if:NT \l__template_global_bool { g } set:Nn + } + } +\cs_new_protected:Npn \__template_assign_variable:N #1 + { + \__template_if_key_value:VT \l__template_value_tl + { \__template_key_to_value: } + \tl_put_right:Ne \l__template_assignments_tl + { + #1 \exp_not:V \l__template_var_tl + { \exp_not:V \l__template_value_tl } + } + } +\cs_generate_variant:Nn \__template_assign_variable:N { c } +\cs_new_protected:Npn \__template_key_to_value: + { \exp_after:wN \__template_key_to_value_auxi:w \l__template_value_tl } +\cs_new_protected:Npn \__template_key_to_value_auxi:w \KeyValue #1 + { + \tl_set:Ne \l__template_tmp_tl { \tl_trim_spaces:e { \tl_to_str:n {#1} } } + \prop_get:NVNTF \l__template_vars_prop \l__template_tmp_tl + \l__template_value_tl + { + \exp_after:wN \__template_key_to_value_auxii:w \l__template_value_tl + \s__template_mark global \q__template_nil \s__template_stop + } + { \msg_error:nnV { template } { unknown-attribute } \l__template_tmp_tl } + } +\cs_new_protected:Npn \__template_key_to_value_auxii:w #1 global #2#3 \s__template_stop + { + \__template_quark_if_nil:NF #2 + { \tl_set:Nn \l__template_value_tl {#2} } + } +\cs_new_protected:Npn \__template_use_instance:nn #1#2 + { + \__template_if_use_template:nTF {#2} + { \__template_use_instance_aux:nNnnn {#1} #2 } + { \__template_use_instance_aux:nn {#1} {#2} } + } +\cs_new_protected:Npn \__template_use_instance_aux:nNnnn #1#2#3#4#5 + { + \str_if_eq:nnTF {#1} {#3} + { \__template_use_template:nnn {#3} {#4} {#5} } + { \msg_error:nnnn { template } { type-mismatch } {#1} {#3} } +} +\cs_new_protected:Npn \__template_use_instance_aux:nn #1#2 + { + \__template_if_instance_exist:nnTF {#1} {#2} + { \use:c { \c__template_instances_root_tl #1 / #2 } } + { \msg_error:nnnn { template } { unknown-instance } {#1} {#2} } + } +\cs_new:Npn \__template_assignments_pop: { \l__template_assignments_tl } +\cs_new_protected:Npn \__template_assignments_push:n #1 + { \tl_set:Nn \l__template_assignments_tl {#1} } +\cs_new_protected:Npn \__template_show_code:nn #1#2 + { \cs_show:c { \c__template_code_root_tl #1 / #2 } } +\cs_new_protected:Npn \__template_show_defaults:nn #1#2 + { + \__template_if_keys_exist:nnT {#1} {#2} + { + \__template_recover_defaults:nn {#1} {#2} + \__template_show:Nnnn \l__template_values_prop + {#1} {#2} { default~values } + } + } +\cs_new_protected:Npn \__template_show_keytypes:nn #1#2 + { + \__template_if_keys_exist:nnT {#1} {#2} + { + \__template_recover_keytypes:nn {#1} {#2} + \__template_show:Nnnn \l__template_keytypes_prop + {#1} {#2} { interface } + } + } +\cs_new_protected:Npn \__template_show_vars:nn #1#2 + { + \__template_execute_if_code_exist:nnT {#1} {#2} + { + \__template_recover_vars:nn {#1} {#2} + \__template_show:Nnnn \l__template_vars_prop + {#1} {#2} { variable~mapping } + } + } +\cs_new_protected:Npn \__template_show:Nnnn #1#2#3#4 + { + \msg_show:nneeee { template } { show-attribute } + { \tl_to_str:n {#2} } + { \tl_to_str:n {#3} } + { \tl_to_str:n {#4} } + { \prop_map_function:NN #1 \msg_show_item_unbraced:nn } + } +\cs_new_protected:Npn \__template_show_values:nn #1#2 + { + \__template_if_instance_exist:nnT {#1} {#2} + { + \__template_recover_values:nn {#1} {#2} + \msg_show:nneee { template } { show-values } + { \tl_to_str:n {#1} } + { \tl_to_str:n {#2} } + { + \prop_map_function:NN \l__template_values_prop + \msg_show_item_unbraced:nn + } + } + } +\msg_new:nnnn { template } { argument-number-mismatch } + { Template~type~'#1'~takes~#2~argument(s). } + { + Templates~of~type~'#1'~require~#2~argument(s).\\ + You~have~tried~to~make~a~template~for~'#1'~ + with~#3~argument(s),~which~is~not~possible:~ + the~number~of~arguments~must~agree. + } +\msg_new:nnnn { template } { bad-number-of-arguments } + { Bad~number~of~arguments~for~template~type~'#1'. } + { + A~template~may~accept~between~0~and~9~arguments.\\ + You~asked~to~use~#2~arguments:~this~is~not~supported. + } +\msg_new:nnnn { template } { bad-variable } + { Incorrect~variable~description~'#1'. } + { + The~argument~'#1'~is~not~of~the~form \\ + ~~'<variable>'\\ + ~or~\\ + ~~'global~<variable>'.\\ + It~must~be~given~in~one~of~these~formats~to~be~used~in~a~template. + } +\msg_new:nnnn { template } { choice-not-implemented } + { The~choice~'#1'~has~no~implementation. } + { + Each~choice~listed~in~the~interface~for~a~template~must~ + have~an~implementation. + } +\msg_new:nnnn { template } { choice-no-code } + { The~choice~'#1'~requires~implementation~details. } + { + When~creating~template~code~using~\DeclareTemplateCode,~ + each~choice~name~must~have~an~associated~implementation.\\ + This~should~be~given~after~a~'='~sign:~LaTeX~did~not~find~one. + } +\msg_new:nnnn { template } { choice-requires-code } + { The~choice~'#2'~for~key~'#1'~requires~an~implementation. } + { + You~should~have~put:\\ + \ \ #1~:~choice~{~#2 = <code> ~} \\ + but~LaTeX~did~not~find~any~<code>. + } +\msg_new:nnnn { template } { duplicate-key-interface } + { Key~'#1'~appears~twice~in~interface~definition~\msg_line_context:. } + { + Each~key~can~only~have~one~interface~declared~in~a~template.\\ + LaTeX~found~two~interfaces~for~'#1'. + } +\msg_new:nnnn { template } { keytype-requires-argument } + { The~key~type~'#1'~requires~an~argument~\msg_line_context:. } + { + You~should~have~put:\\ + \ \ <key-name>~:~#1~{~<argument>~} \\ + but~LaTeX~did~not~find~an~<argument>. + } +\msg_new:nnnn { template } { invalid-keytype } + { The~key~'#1'~is~missing~a~key-type~\msg_line_context:. } + { + Each~key~in~a~template~requires~a~key-type,~given~in~the~form:\\ + \ \ <key>~:~<key-type>\\ + LaTeX~could~not~find~a~<key-type>~in~your~input. + } +\msg_new:nnnn { template } { key-no-value } + { The~key~'#1'~has~no~value~\msg_line_context:. } + { + When~creating~an~instance~of~a~template~ + every~key~listed~must~include~a~value:\\ + \ \ <key>~=~<value> + } +\msg_new:nnnn { template } { key-no-variable } + { The~key~'#1'~requires~implementation~details~\msg_line_context:. } + { + When~creating~template~code~using~\DeclareTemplateCode,~ + each~key~name~must~have~an~associated~implementation.\\ + This~should~be~given~after~a~'='~sign:~LaTeX~did~not~find~one. + } +\msg_new:nnnn { template } { key-not-implemented } + { Key~'#1'~has~no~implementation~\msg_line_context:. } + { + The~definition~of~key~implementations~for~template~'#2'~ + of~template~type~'#3'~does~not~include~any~details~for~key~'#1'.\\ + The~key~was~declared~in~the~interface~definition,~ + and~so~an~implementation~is~required. + } +\msg_new:nnnn { template } { missing-keytype } + { The~key~'#1'~is~missing~a~key-type~\msg_line_context:. } + { + Key~interface~definitions~should~be~of~the~form\\ + \ \ #1~:~<key-type>\\ + but~LaTeX~could~not~find~a~<key-type>. + } +\msg_new:nnnn { template } { no-template-code } + { + The~template~'#2'~of~type~'#1'~is~unknown~ + or~has~no~implementation. + } + { + There~is~no~code~available~for~the~template~name~given.\\ + This~should~be~given~using~\DeclareTemplateCode. + } +\msg_new:nnnn { template } { type-already-defined } + { Template~type~'#1'~already~defined. } + { + You~have~used~\NewTemplateType~ + with~a~template~type~that~has~already~been~defined. + } +\msg_new:nnnn { template } { type-mismatch } + { Template~types~'#1'~and~'#2'~do~not~agree. } + { + You~are~trying~to~use~a~template~directly~with~\UseInstance + (or~a~similar~function),~but~the~template~types~do~not~match. + } +\msg_new:nnnn { template } { unknown-attribute } + { The~template~attribute~'#1'~is~unknown. } + { + There~is~a~definition~in~the~current~template~reading\\ + \ \ \token_to_str:N \KeyValue {~#1~} \\ + but~there~is~no~key~called~'#1'. + } +\msg_new:nnnn { template } { unknown-choice } + { The~choice~'#2'~was~not~declared~for~key~'#1'. } + { + The~key~'#1'~takes~a~fixed~list~of~choices~ + and~this~list~does~not~include~'#2'. + } +\msg_new:nnnn { template } { unknown-default-choice } + { The~default~choice~'#2'~was~not~declared~for~key~'#1'. } + { + The~key~'#1'~takes~a~fixed~list~of~choices~ + and~this~list~does~not~include~'#2'. + } +\msg_new:nnnn { template } { unknown-instance } + { The~instance~'#2'~of~type~'#1'~is~unknown. } + { + You~have~asked~to~use~an~instance~'#2',~ + but~this~has~not~been~created. + } +\msg_new:nnnn { template } { unknown-key } + { Unknown~template~key~'#1'. } + { + The~key~'#1'~was~not~declared~in~the~interface~ + for~the~current~template. + } +\msg_new:nnnn { template } { unknown-keytype } + { The~key-type~'#1'~is~unknown. } + { + Valid~key-types~are:\\ + -~boolean;\\ + -~choice;\\ + -~commalist;\\ + -~function;\\ + -~instance;\\ + -~integer;\\ + -~length;\\ + -~muskip;\\ + -~real;\\ + -~skip;\\ + -~tokenlist. + } +\msg_new:nnnn { template } { unknown-type } + { The~template~type~'#1'~is~unknown. } + { + A~template~type~needs~to~be~defined~with~\NewTemplateType + prior~to~using~it. + } +\msg_new:nnnn { template } { unknown-template } + { The~template~'#2'~of~type~'#1'~is~unknown. } + { + No~interface~has~been~declared~for~a~template~ + '#2'~of~template~type~'#1'. + } +\msg_new:nnn { template } { declare-instance } + { Declaring~instance~~'#1'~of~type~#2~\msg_line_context:. } +\msg_new:nnn { template } { declare-template-code } + { Declaring~code~for~template~'#2'~of~template~type~'#1'~\msg_line_context:. } +\msg_new:nnn { template } { declare-template-interface } + { + Declaring~interface~for~template~'#2'~of~template~type~'#1'~ + \msg_line_context:. + } +\msg_new:nnn { template } { declare-type } + { Declaring~template~type~'#1'~taking~#2~argument(s)~\msg_line_context:. } +\msg_new:nnn { template } { show-attribute } + { + The~template~'#2'~of~type~'#1'~has~ + \tl_if_empty:nTF {#4} { no~#3. } { #3 : #4 } + } +\msg_new:nnn { template } { show-values } + { + The~instance~'#2'~of~type~'#1'~has~ + \tl_if_empty:nTF {#3} { no~values. } { values: #3 } + } +\prop_gput:Nnn \g_msg_module_type_prop { template } { LaTeX } +\cs_new_protected:Npn \NewTemplateType #1#2 + { \__template_define_type:nn {#1} {#2} } +\cs_new_protected:Npn \DeclareTemplateInterface #1#2#3#4 + { \__template_declare_template_keys:nnnn {#1} {#2} {#3} {#4} } +\cs_new_protected:Npn \DeclareTemplateCode #1#2#3#4#5 + { \__template_declare_template_code:nnnnn {#1} {#2} {#3} {#4} {#5} } +\cs_new_protected:Npn \DeclareTemplateCopy #1#2#3 + { \__template_template_set_eq:nnn {#1} {#2} {#3} } +\cs_new_protected:Npn \EditTemplateDefaults #1#2#3 + { \__template_edit_defaults:nnn {#1} {#2} {#3} } +\cs_new_protected:Npn \UseTemplate #1#2#3 + { \__template_use_template:nnn {#1} {#2} {#3} } +\cs_new_protected:Npn \DeclareInstance #1#2#3#4 + { \__template_declare_instance:nnnn {#1} {#3} {#2} {#4} } +\cs_new_protected:Npn \DeclareInstanceCopy #1#2#3 + { \__template_instance_set_eq:nnn {#1} {#2} {#3} } +\cs_new_protected:Npn \EditInstance #1#2#3 + { \__template_edit_instance:nnn {#1} {#2} {#3} } +\cs_new_protected:Npn \UseInstance #1#2 + { \__template_use_instance:nn {#1} {#2} } +\cs_new_protected:Npn \ShowTemplateCode #1#2 + { \__template_show_code:nn {#1} {#2} } +\cs_new_protected:Npn \ShowTemplateDefaults #1#2 + { \__template_show_defaults:nn {#1} {#2} } +\cs_new_protected:Npn \ShowTemplateInterface #1#2 + { \__template_show_keytypes:nn {#1} {#2} } +\cs_new_protected:Npn \ShowTemplateVariables #1#2 + { \__template_show_vars:nn {#1} {#2} } +\cs_new_protected:Npn \ShowInstanceValues #1#2 + { \__template_show_values:nn {#1} {#2} } +\cs_new:Npn \IfInstanceExistsTF #1#2 + { \__template_if_instance_exist:nnTF {#1} {#2} } +\cs_new:Npn \IfInstanceExistsT #1#2 + { \__template_if_instance_exist:nnT {#1} {#2} } +\cs_new:Npn \IfInstanceExistsF #1#2 + { \__template_if_instance_exist:nnF {#1} {#2} } +\cs_new_protected:Npn \KeyValue #1 {#1} +\cs_new_protected:Npn \AssignTemplateKeys { \__template_assignments_pop: } +\cs_new_protected:Npn \SetTemplateKeys #1#2#3 + { \keys_set_known:nnN { template / #1 / #2 } {#3} \l__template_tmp_clist } +\IncludeInRelease{0000/00/00}{lttemplates}% + {Prototype~document~commands}% + +\EndModuleRelease +\ExplSyntaxOff %%% From File: ltalloc.dtx %%% From File: ltcntrl.dtx %%% From File: lterror.dtx @@ -8514,8 +9884,6 @@ of this package available from CTAN} %% Copyright (C) 2020-2024 %% Frank Mittelbach, The LaTeX Project %%% From File: ltpara.dtx -\def\ltparaversion{v1.0l} -\def\ltparadate{2023/01/30} \ExplSyntaxOn @@ -8548,7 +9916,7 @@ of this package available from CTAN} \@kernel@before@para@begin \hook_use:n {para/begin} \if_mode_horizontal: \else: - \msg_error:nnnn { hooks }{ para-mode }{begin}{vertical} \fi: + \msg_error:nnnn { hooks }{ para-mode }{begin}{horizontal} \fi: \__para_handle_indent: } \EndIncludeInRelease @@ -8572,7 +9940,7 @@ of this package available from CTAN} \@kernel@before@para@begin \hook_use:n {para/begin} \if_mode_horizontal: \else: - \msg_error:nnnn { hooks }{ para-mode }{begin}{vertical} \fi: + \msg_error:nnnn { hooks }{ para-mode }{begin}{horizontal} \fi: \__para_handle_indent: } \cs_set:Npn \__para_tmp:w #1#2#3#4#5 { } @@ -8651,7 +10019,7 @@ of this package available from CTAN} \cs_set_eq:NN \par \para_end: \cs_set_eq:NN \@@par \para_end: \cs_set_eq:NN \endgraf \para_end: -\everypar{\@nodocument} %% To get an error if text appears before the +\everypar{\@nodocument} %% To get an error if text appears before the \document \msg_new:nnnn { hooks } { para-mode } { Illegal~mode~ change~ in~ hook~ 'para/#1'.\\ @@ -8698,8 +10066,6 @@ of this package available from CTAN} %% Copyright (C) 2021-2024 %% Frank Mittelbach, The LaTeX Project %%% From File: ltmeta.dtx -\def\ltmetaversion{v1.0b} -\def\ltmetadate{2022/05/18} \NewModuleRelease{2022/06/01}{ltmeta} {Document Metadata handling} \let \IfDocumentMetadataTF \@secondoftwo @@ -10346,7 +11712,7 @@ of this package available from CTAN} \EndIncludeInRelease %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% From File: ltfssaxes.dtx -%% Copyright (C) 1999-2020 Frank Mittelbach +%% Copyright (C) 2019-2020 Frank Mittelbach \IncludeInRelease{2020/02/02}% {\DeclareFontSeriesChangeRule}{Series change rules}% \def\DeclareFontSeriesChangeRule#1#2#3#4{% @@ -12227,7 +13593,7 @@ of this package available from CTAN} \let\@defaultfamilyhook\@undefined \EndIncludeInRelease -%%% From File: fontdef.dtx +%%% From File: fontdef.dtx \IncludeInRelease{2017/01/01}% {\encodingdefault}{TU encoding default}% \ifx\Umathcode\@undefined @@ -12725,8 +14091,7 @@ of this package available from CTAN} \DeclareEncodingSubset{TS1}{lmss} {1} \DeclareEncodingSubset{TS1}{lmssq} {1} \DeclareEncodingSubset{TS1}{lmvtt} {1} -\DeclareEncodingSubset{TS1}{lmtt} {1} % missing TM, SM and - % pertenthousand for some reason +\DeclareEncodingSubset{TS1}{lmtt} {1} % missing TM, SM and pertenthousand \DeclareEncodingSubset{TS1}{ptmx} {2} \DeclareEncodingSubset{TS1}{ptmj} {2} \DeclareEncodingSubset{TS1}{ul8} {2} @@ -12764,23 +14129,31 @@ of this package available from CTAN} \DeclareEncodingSubset{TS1}{lato-*} {0} % with a bunch of tofu inside \DeclareEncodingSubset{TS1}{opensans-*} {0} % with a bunch of tofu inside \DeclareEncodingSubset{TS1}{cantarell-*} {0} % with a bunch of tofu inside -\DeclareEncodingSubset{TS1}{fbb-*} {0} % missing centoldstyle \DeclareEncodingSubset{TS1}{tli} {1} % with lots of tofu inside +\DeclareEncodingSubset{TS1}{fbb-*} {2} % missing centoldstyle \DeclareEncodingSubset{TS1}{Alegreya-*} {2} \DeclareEncodingSubset{TS1}{AlegreyaSans-*} {2} +\DeclareEncodingSubset{TS1}{BaskervilleF-*} {2} \DeclareEncodingSubset{TS1}{DejaVuSans-TLF} {2} \DeclareEncodingSubset{TS1}{DejaVuSansCondensed-TLF} {2} \DeclareEncodingSubset{TS1}{DejaVuSansMono-TLF} {2} \DeclareEncodingSubset{TS1}{EBGaramond-*} {2} +\DeclareEncodingSubset{TS1}{Merriwthr-OsF} {2} +\DeclareEncodingSubset{TS1}{MerriwthrSans-OsF} {2} +\DeclareEncodingSubset{TS1}{Montserrat-*} {2} +\DeclareEncodingSubset{TS1}{MontserratAlternates-*} {2} +\DeclareEncodingSubset{TS1}{NotoSansMono-TLF} {2} +\DeclareEncodingSubset{TS1}{NotoSansMono-TOsF} {2} \DeclareEncodingSubset{TS1}{Tempora-TLF} {2} \DeclareEncodingSubset{TS1}{Tempora-TOsF} {2} +\DeclareEncodingSubset{TS1}{XCharter-TLF} {2} +\DeclareEncodingSubset{TS1}{XCharter-TOsF} {2} +\DeclareEncodingSubset{TS1}{erewhon-*} {2} \DeclareEncodingSubset{TS1}{Arimo-TLF} {3} -\DeclareEncodingSubset{TS1}{Carlito-*} {3} -\DeclareEncodingSubset{TS1}{FiraSans-*} {3} +\DeclareEncodingSubset{TS1}{Crlt-*} {3} +\DeclareEncodingSubset{TS1}{IBMPlexMono-TLF} {3} \DeclareEncodingSubset{TS1}{IBMPlexSans-TLF} {3} -\DeclareEncodingSubset{TS1}{Merriweather-OsF} {3} -\DeclareEncodingSubset{TS1}{Montserrat-*} {3} -\DeclareEncodingSubset{TS1}{MontserratAlternates-*} {3} +\DeclareEncodingSubset{TS1}{IBMPlexSerif-TLF} {3} \DeclareEncodingSubset{TS1}{SourceCodePro-TLF} {3} \DeclareEncodingSubset{TS1}{SourceCodePro-TOsF} {3} \DeclareEncodingSubset{TS1}{SourceSansPro-*} {3} @@ -12795,6 +14168,7 @@ of this package available from CTAN} \DeclareEncodingSubset{TS1}{CrimsonPro-*} {4} \DeclareEncodingSubset{TS1}{FiraMono-TLF} {4} \DeclareEncodingSubset{TS1}{FiraMono-TOsF} {4} +\DeclareEncodingSubset{TS1}{FiraSans-*} {4} \DeclareEncodingSubset{TS1}{Go-TLF} {4} \DeclareEncodingSubset{TS1}{GoMono-TLF} {4} \DeclareEncodingSubset{TS1}{InriaSans-*} {4} @@ -12807,7 +14181,6 @@ of this package available from CTAN} \DeclareEncodingSubset{TS1}{LinguisticsPro-OsF} {4} \DeclareEncodingSubset{TS1}{LinuxBiolinumT-*} {4} \DeclareEncodingSubset{TS1}{LinuxLibertineT-*} {4} -\DeclareEncodingSubset{TS1}{MerriweatherSans-OsF} {4} \DeclareEncodingSubset{TS1}{MintSpirit-*} {4} \DeclareEncodingSubset{TS1}{MintSpiritNoTwo-*} {4} \DeclareEncodingSubset{TS1}{PTMono-TLF} {4} @@ -12824,57 +14197,50 @@ of this package available from CTAN} \DeclareEncodingSubset{TS1}{Rosario-*} {4} \DeclareEncodingSubset{TS1}{SticksTooText-*} {4} \DeclareEncodingSubset{TS1}{UniversalisADFStd-LF} {4} -\DeclareEncodingSubset{TS1}{Almendra-OsF} {5} +\DeclareEncodingSubset{TS1}{Almndr-OsF} {5} \DeclareEncodingSubset{TS1}{Baskervaldx-*} {5} -\DeclareEncodingSubset{TS1}{BaskervilleF-*} {5} -\DeclareEncodingSubset{TS1}{Bitter-TLF} {5} +\DeclareEncodingSubset{TS1}{Bttr-TLF} {5} \DeclareEncodingSubset{TS1}{Cinzel-LF} {5} \DeclareEncodingSubset{TS1}{CinzelDecorative-LF} {5} +\DeclareEncodingSubset{TS1}{Cochineal-*} {5} \DeclareEncodingSubset{TS1}{DejaVuSerif-TLF} {5} \DeclareEncodingSubset{TS1}{DejaVuSerifCondensed-TLF} {5} \DeclareEncodingSubset{TS1}{GilliusADF-LF} {5} \DeclareEncodingSubset{TS1}{GilliusADFCond-LF} {5} \DeclareEncodingSubset{TS1}{GilliusADFNoTwo-LF} {5} \DeclareEncodingSubset{TS1}{GilliusADFNoTwoCond-LF} {5} -\DeclareEncodingSubset{TS1}{LobsterTwo-LF} {5} \DeclareEncodingSubset{TS1}{OldStandard-TLF} {5} -\DeclareEncodingSubset{TS1}{PlayfairDisplay-TLF} {5} -\DeclareEncodingSubset{TS1}{PlayfairDisplay-TOsF} {5} +\DeclareEncodingSubset{TS1}{PlyfrDisplay-TLF} {5} +\DeclareEncodingSubset{TS1}{PlyfrDisplay-TOsF} {5} \DeclareEncodingSubset{TS1}{TheanoDidot-TLF} {5} \DeclareEncodingSubset{TS1}{TheanoDidot-TOsF} {5} \DeclareEncodingSubset{TS1}{TheanoModern-TLF} {5} \DeclareEncodingSubset{TS1}{TheanoModern-TOsF} {5} \DeclareEncodingSubset{TS1}{TheanoOldStyle-TLF} {5} \DeclareEncodingSubset{TS1}{TheanoOldStyle-TOsF} {5} +\DeclareEncodingSubset{TS1}{charssil-TLF} {5} \DeclareEncodingSubset{TS1}{Crimson-TLF} {6} -\DeclareEncodingSubset{TS1}{IBMPlexMono-TLF} {6} -\DeclareEncodingSubset{TS1}{IBMPlexSerif-TLF} {6} -\DeclareEncodingSubset{TS1}{LibertinusMono-TLF} {6} \DeclareEncodingSubset{TS1}{LibertinusSerifDisplay-LF}{6} \DeclareEncodingSubset{TS1}{LinuxLibertineDisplayT-*} {6} \DeclareEncodingSubset{TS1}{LinuxLibertineMonoT-LF} {6} \DeclareEncodingSubset{TS1}{LinuxLibertineMonoT-TLF} {6} -\DeclareEncodingSubset{TS1}{Overlock-LF} {6} +\DeclareEncodingSubset{TS1}{Ovrlck-LF} {6} +\DeclareEncodingSubset{TS1}{ComicNeue-TLF} {7} +\DeclareEncodingSubset{TS1}{ComicNeueAngular-TLF} {7} \DeclareEncodingSubset{TS1}{CormorantGaramond-*} {7} \DeclareEncodingSubset{TS1}{Heuristica-TLF} {7} \DeclareEncodingSubset{TS1}{Heuristica-TOsF} {7} \DeclareEncodingSubset{TS1}{IMFELLEnglish-TLF} {7} -\DeclareEncodingSubset{TS1}{LibreBaskerville-TLF} {7} -\DeclareEncodingSubset{TS1}{LibreCaslon-*} {7} -\DeclareEncodingSubset{TS1}{Marcellus-LF} {7} +\DeclareEncodingSubset{TS1}{LibreBskrvl-TLF} {7} +\DeclareEncodingSubset{TS1}{LibreCsln-*} {7} +\DeclareEncodingSubset{TS1}{Lbstr-LF} {7} +\DeclareEncodingSubset{TS1}{Mrcls-LF} {7} \DeclareEncodingSubset{TS1}{NotoSans-*} {7} -\DeclareEncodingSubset{TS1}{NotoSansMono-TLF} {7} -\DeclareEncodingSubset{TS1}{NotoSansMono-TOsF} {7} \DeclareEncodingSubset{TS1}{NotoSerif-*} {7} -\DeclareEncodingSubset{TS1}{Quattrocento-TLF} {7} -\DeclareEncodingSubset{TS1}{QuattrocentoSans-TLF} {7} -\DeclareEncodingSubset{TS1}{XCharter-TLF} {7} -\DeclareEncodingSubset{TS1}{XCharter-TOsF} {7} -\DeclareEncodingSubset{TS1}{erewhon-*} {7} -\DeclareEncodingSubset{TS1}{ComicNeue-TLF} {7} -\DeclareEncodingSubset{TS1}{ComicNeueAngular-TLF} {7} -\DeclareEncodingSubset{TS1}{Forum-LF} {7} % the superiors are missing -\DeclareEncodingSubset{TS1}{Cochineal-*} {8} +\DeclareEncodingSubset{TS1}{Quattro-LF} {7} +\DeclareEncodingSubset{TS1}{QuattroSans-LF} {7} +\DeclareEncodingSubset{TS1}{Frm-LF} {7} % the superiors are missing +\DeclareEncodingSubset{TS1}{LibertinusMono-TLF} {8} \DeclareEncodingSubset{TS1}{AlgolRevived-TLF} {9} \def\UseLegacyTextSymbols{% \DeclareTextSymbolDefault{\textasteriskcentered}{OMS}% @@ -13112,7 +14478,6 @@ of this package available from CTAN} \EndModuleRelease - %%% From File: ltpageno.dtx %%% From File: ltxref.dtx \IncludeInRelease{2023/06/01}% @@ -13260,12 +14625,7 @@ of this package available from CTAN} \let\Ref\@undefined \EndIncludeInRelease -%% File: ltproperties.dtx -\def\ltpropertiesversion{1.0c} -\def\ltpropertiesdate{2023-10-15} - - - +%%% From File: ltproperties.dtx \ExplSyntaxOn \NewModuleRelease{2023/11/01}{ltproperties} {Cross-referencing~properties} @@ -13320,7 +14680,7 @@ of this package available from CTAN} { \legacy_if:nT { @filesw } { - \iow_shipout_x:Nx \@auxout + \protected@write \@auxout {} { \token_to_str:N \new@label@record {#1} @@ -13432,7 +14792,9 @@ of this package available from CTAN} } } \prg_generate_conditional_variant:Nnn \property_if_exist:n {e} {TF} -\cs_new_eq:NN \IfPropertyExistTF \property_if_exist:eTF +\cs_new_eq:NN \IfPropertyExistsTF \property_if_exist:eTF +\cs_new:Npn \IfPropertyExistsT #1#2 {\property_if_exist:eTF {#1}{#2}{} } +\cs_new:Npn \IfPropertyExistsF #1 {\property_if_exist:eTF {#1}{} } \prg_new_conditional:Npnn \property_if_recorded:n #1 { p , T , F, TF } % #1 label { @@ -13445,7 +14807,9 @@ of this package available from CTAN} } } \prg_generate_conditional_variant:Nnn \property_if_recorded:n {e} {TF} -\cs_new_eq:NN \IfLabelExistTF \property_if_recorded:eTF +\cs_new_eq:NN \IfLabelExistsTF \property_if_recorded:eTF +\cs_new:Npn \IfLabelExistsT #1#2 {\property_if_exist:eTF {#1}{#2}{} } +\cs_new:Npn \IfLabelExistsF #1 {\property_if_exist:eTF {#1}{} } \prg_new_conditional:Npnn \property_if_recorded:nn #1#2 { p , T , F, TF } % #1 label #2 property { @@ -13534,8 +14898,8 @@ of this package available from CTAN} \let \RefProperty \@undefined \let \RefUndefinedWarn \@undefined -\let \IfPropertyExistTF \@undefined -\let \IfLabelExistTF \@undefined +\let \IfPropertyExistsTF \@undefined +\let \IfLabelExistsTF \@undefined \let \IfPropertyRecordedTF \@undefined \let\new@label@record \@undefined @@ -14651,6 +16015,27 @@ of this package available from CTAN} \@ifnextchar[{\@rsbox{#1}}{\@irsbox{#1}[]}} \expandafter\let\csname raisebox \endcsname\@undefined \EndIncludeInRelease +\IncludeInRelease{2024/06/01}% + {\@finalstrut}{final strut correction}% +\def\@finalstrut#1{% + \unskip + \ifhmode \nobreak \vrule + \else + \ifdim \prevdepth=-\@m\p@ + \else + \vskip-\prevdepth + \fi + \hrule + \fi + \@width\z@\@height\z@\@depth\dp#1} +\EndIncludeInRelease +\IncludeInRelease{0000/00/00}% + {\@finalstrut}{final strut correction}% +\def\@finalstrut#1{% + \unskip\ifhmode\nobreak\fi + \vrule\@width\z@\@height\z@\@depth\dp#1} + +\EndIncludeInRelease %%% From File: lttab.dtx \IncludeInRelease{2020/10/01}% {\@itabcr}{Tabbing calc syntax}% @@ -15283,6 +16668,32 @@ of this package available from CTAN} \EndIncludeInRelease %%% From File: ltthm.dtx +\IncludeInRelease{2024/03/18}% + {\@thm}{no link target}% +\def\@thm#1#2{% + \@kernel@refstepcounter{#1}% + \@ifnextchar[{\@ythm{#1}{#2}}{\@xthm{#1}{#2}}} +\EndIncludeInRelease +\IncludeInRelease{0000/00/00}% + {\@thm}{no link target}% +\def\@thm#1#2{% + \refstepcounter{#1}% + \@ifnextchar[{\@ythm{#1}{#2}}{\@xthm{#1}{#2}}} +\EndIncludeInRelease +\IncludeInRelease{2024/03/18}% + {\@begintheorem}{add link targets}% +\def\@begintheorem#1#2{\trivlist + \item[\MakeLinkTarget{\@currentcounter}\hskip \labelsep{\bfseries #1\ #2}]\itshape} +\def\@opargbegintheorem#1#2#3{\trivlist + \item[\MakeLinkTarget{\@currentcounter}\hskip \labelsep{\bfseries #1\ #2\ (#3)}]\itshape} +\EndIncludeInRelease +\IncludeInRelease{0000/00/00}% + {\@begintheorem}{add link targets}% +\def\@begintheorem#1#2{\trivlist + \item[\hskip \labelsep{\bfseries #1\ #2}]\itshape} +\def\@opargbegintheorem#1#2#3{\trivlist + \item[\hskip \labelsep{\bfseries #1\ #2\ (#3)}]\itshape} +\EndIncludeInRelease %%% From File: ltsect.dtx \IncludeInRelease{2019/10/01}% {\title}{Make commands robust}% @@ -15773,8 +17184,6 @@ of this package available from CTAN} %% Copyright (C) 2022-2024 %% Frank Mittelbach, The LaTeX Project %%% From File: ltmarks.dtx -\def\ltmarksversion{v1.0d} -\def\ltmarksdate{2022/06/01} %% \end{function} \ExplSyntaxOn @@ -15813,42 +17222,84 @@ of this package available from CTAN} \tl_new:c { g__mark_last-column_top_ #1 _tl } \tl_new:c { g__mark_last-column_first_ #1 _tl } \tl_new:c { g__mark_last-column_last_ #1 _tl } + \tl_set:cn { g__mark_page_top_ #1 _tl }{ \__mark_id:n{0} } + \tl_set:cn { g__mark_page_first_ #1 _tl }{ \__mark_id:n{0} } + \tl_set:cn { g__mark_page_last_ #1 _tl }{ \__mark_id:n{0} } + \tl_set:cn { g__mark_previous-page_top_ #1 _tl }{ \__mark_id:n{0} } + \tl_set:cn { g__mark_previous-page_first_ #1 _tl }{ \__mark_id:n{0} } + \tl_set:cn { g__mark_previous-page_last_ #1 _tl }{ \__mark_id:n{0} } + \tl_set:cn { g__mark_column_top_ #1 _tl }{ \__mark_id:n{0} } + \tl_set:cn { g__mark_column_first_ #1 _tl }{ \__mark_id:n{0} } + \tl_set:cn { g__mark_column_last_ #1 _tl }{ \__mark_id:n{0} } + \tl_set:cn { g__mark_previous-column_top_ #1 _tl }{ \__mark_id:n{0} } + \tl_set:cn { g__mark_previous-column_first_ #1 _tl }{ \__mark_id:n{0} } + \tl_set:cn { g__mark_previous-column_last_ #1 _tl }{ \__mark_id:n{0} } + \tl_set:cn { g__mark_first-column_top_ #1 _tl }{ \__mark_id:n{0} } + \tl_set:cn { g__mark_first-column_first_ #1 _tl }{ \__mark_id:n{0} } + \tl_set:cn { g__mark_first-column_last_ #1 _tl }{ \__mark_id:n{0} } + \tl_set:cn { g__mark_last-column_top_ #1 _tl }{ \__mark_id:n{0} } + \tl_set:cn { g__mark_last-column_first_ #1 _tl }{ \__mark_id:n{0} } + \tl_set:cn { g__mark_last-column_last_ #1 _tl }{ \__mark_id:n{0} } } \box_new:N \l__mark_box +\box_new:N \l__mark_ii_box \tl_new:N \g__mark_tmp_tl \tl_new:N \g__mark_new_top_tl -\cs_new_protected:Npn \__mark_update_structure:nn #1#2 - { - \__mark_update_structure_alias:nn { previous-#1 } {#1} +\cs_new_protected:Npn \__mark_extract_and_handle_marks:nn #1#2 { \group_begin: \dim_set_eq:NN \tex_splitmaxdepth:D \c_max_dim \int_set_eq:NN \tex_vbadness:D \c_max_int \dim_set_eq:NN \tex_vfuzz:D \c_max_dim - \vbox_set_to_ht:Nnn \l__mark_box { -.5\c_max_dim } + \__mark_prepare_and_extract:nn {#1} {#2} + \group_end: + } +\cs_new_protected:Npn \__mark_prepare_and_extract:nn #1#2 { + \vbox_set:Nn \l__mark_box + { + #2 + \tex_unskip:D + \box_set_to_last:N \l__mark_box + \int_compare:nNnT \tex_lastnodetype:D < 0 { - #2 - \tex_unskip:D - \box_set_to_last:N \l__mark_box - \int_compare:nNnT \tex_lastnodetype:D < 0 - { - \box_if_vertical:NT \l__mark_box - { - \vbox_set_to_ht:Nnn \l__mark_box { -.5\c_max_dim } - { - \vbox_unpack:N \l__mark_box - \tex_kern:D \c_zero_dim % ensure that box - % is not empty - } - \int_compare:nNnT \tex_badness:D > 0 - { \vbox_unpack:N \l__mark_box } - } - } - \tex_kern:D \c_zero_dim + \box_if_vertical:NT \l__mark_box + { \vbox_unpack:N \l__mark_box } } - \int_compare:nNnTF \tex_badness:D > 0 - { - \vbox_set_split_to_ht:NNn \l__mark_box \l__mark_box \c_max_dim - \seq_map_inline:Nn \g__mark_classes_seq + } + \__mark_vbox_set_split_to_maxdimen:NN \l__mark_ii_box \l__mark_box + \box_if_empty:NTF \l__mark_box + { #1 } + { + \__mark_prepare_and_extract:nn {#1} + { \vbox_unpack:N \l__mark_ii_box + \vbox_unpack:N \l__mark_box } + } +} +\cs_set_eq:cN {Infinite~shrink~error~above~ignored~!}\c_max_dim +\cs_new_protected:Npx \__mark_vbox_set_split_to_maxdimen:NN #1#2 { + \tl_set:Ne \exp_not:N \l__mark_saved_parameters_tl + { + \tex_interactionmode:D + \exp_not:N \int_use:N \tex_interactionmode:D \scan_stop: + \tex_escapechar:D + \exp_not:N \int_use:N \tex_escapechar:D \scan_stop: + } + \tex_escapechar:D -1 \scan_stop: + \tex_interactionmode:D 0 \scan_stop: + \tex_setbox:D #1 \tex_vsplit:D #2 to + \exp_not:N \use:n { + \use:c{Infinite~shrink~error~above~ignored~!} + } + \exp_not:N \l__mark_saved_parameters_tl +} +\tl_new:N \l__mark_saved_parameters_tl +\cs_new_protected:Npn \__mark_update_structure_from_material:nn #1#2 { + \__mark_extract_and_handle_marks:nn + { \__mark_update_structure_from_splitmarks:n {#1} } + { #2 } +} +\cs_new_protected:Npn \__mark_update_structure_from_splitmarks:n #1 { + \__mark_update_structure_alias:nn { previous-#1 } {#1} + \seq_map_inline:Nn \g__mark_classes_seq { \tl_gset_eq:Nc \g__mark_new_top_tl { g__mark_#1_last_##1_tl } \tl_gset_eq:cN { g__mark_#1_top_##1_tl } \g__mark_new_top_tl @@ -15870,19 +17321,40 @@ of this package available from CTAN} } } } - } - { - \msg_error:nnn { mark } { infinite-shrinkage } {#1} - \seq_map_inline:Nn \g__mark_classes_seq +} +\cs_new_protected:Npn \__mark_get_marks_for_reinsertion:nNN #1#2#3 { + \tl_clear:N \g__mark_first_marks_tl + \tl_clear:N \g__mark_last_marks_tl + \__mark_extract_and_handle_marks:nn + \__mark_get_from_splitmarks: + { #1 } + \tl_set_eq:NN #2 \g__mark_first_marks_tl + \tl_set_eq:NN #3 \g__mark_last_marks_tl +} +\cs_new_protected:Npn \__mark_get_from_splitmarks: { + \seq_map_inline:Nn \g__mark_classes_seq { - \tl_gset_eq:cc { g__mark_#1_top_ ##1_tl } - { g__mark_#1_last_ ##1_tl } - \tl_gset_eq:cc { g__mark_#1_first_##1_tl } - { g__mark_#1_last_ ##1_tl } + \tl_gset:No \g__mark_tmp_tl + { \tex_splitbotmarks:D \use:c { c__mark_class_##1_mark } } + + \tl_if_empty:NTF \g__mark_tmp_tl + { + } + { + \tl_gput_right:Ne \g__mark_last_marks_tl + { \mark_insert:nn {##1} { \g__mark_tmp_tl } } + \tl_gput_right:Ne \g__mark_first_marks_tl + { \mark_insert:nn {##1} + { + \tex_splitfirstmarks:D + \use:c { c__mark_class_##1_mark } + } + } + } } - } - \group_end: - } +} +\tl_new:N \g__mark_first_marks_tl +\tl_new:N \g__mark_last_marks_tl \cs_new_protected:Npn \__mark_update_structure_alias:nn #1#2 { \seq_map_inline:Nn \g__mark_classes_seq { @@ -15912,12 +17384,14 @@ of this package available from CTAN} \group_begin: \@kernel@before@insertmark \hook_use:n { insertmark } - \unrestored@protected@xdef \g__mark_tmp_tl {#2} + \unrestored@protected@xdef \g__mark_tmp_tl + { + \__mark_id:n{ \int_use:N\g__mark_int } + #2 + } \tex_marks:D \use:c { c__mark_class_ #1 _mark } { - \tl_if_empty:NTF \g__mark_tmp_tl - { \exp_not:n { \prg_do_nothing: } } - { \exp_not:o { \g__mark_tmp_tl } } + \exp_not:o { \g__mark_tmp_tl } } \group_end: \if@nobreak\ifvmode\nobreak\fi\fi @@ -15927,15 +17401,23 @@ of this package available from CTAN} { \tl_to_str:n {#1} } } } +\cs_new_protected:Npn \__mark_id:n #1 { } +\int_new:N \g__mark_int \cs_new:Npn \@kernel@before@insertmark { \cs_set_eq:NN \label \scan_stop: \cs_set_eq:NN \index \scan_stop: \cs_set_eq:NN \glossary \scan_stop: + \int_compare:nNnTF \g__mark_int < {99999} + { \int_gincr:N \g__mark_int } + { \int_gzero:N \g__mark_int } + } \hook_new:n {insertmark} -\cs_new:Npn \mark_use_first:nn #1#2 { \exp_not:v { g__mark_#1_first_#2_tl } } -\cs_new:Npn \mark_use_last:nn #1#2 { \exp_not:v { g__mark_#1_last_#2_tl } } -\cs_new:Npn \mark_use_top:nn #1#2 { \exp_not:v { g__mark_#1_top_#2_tl } } +\cs_new:Npn \mark_use_first:nn #1#2 { \__mark_use:v { g__mark_#1_first_#2_tl } } +\cs_new:Npn \mark_use_last:nn #1#2 { \__mark_use:v { g__mark_#1_last_#2_tl } } +\cs_new:Npn \mark_use_top:nn #1#2 { \__mark_use:v { g__mark_#1_top_#2_tl } } +\cs_new:Npn \__mark_use:n #1 { \exp_not:o { \use_none:nn #1 } } +\cs_generate_variant:Nn \__mark_use:n { v } \prg_new_conditional:Npnn \mark_if_eq:nnnn #1#2#3#4 { T , F , TF } { \tl_if_eq:ccTF { g__mark_ #1 _#3_ #2 _tl } @@ -15975,15 +17457,6 @@ of this package available from CTAN} all~columns~have~been~assembled. \c__msg_return_text_tl } -\msg_new:nnnn { mark } { infinite-shrinkage } - { Infinite~shrinkage~found~in~'#1'. } - { - \c__msg_coding_error_text_tl - The~mark~region~'#1'~contains~some~infinite~negative~glue~ - allowing~it~to~shrink~to~an~arbitrary~size.~ - This~makes~it~impossible~to~split~the~region~apart~to~ - get~at~its~marks.~They~are~lost. - } \bool_new:N \g__mark_debug_bool \cs_new_eq:NN \__mark_debug:n \use_none:n \cs_new_protected:Npn \mark_debug_on: @@ -16003,6 +17476,8 @@ of this package available from CTAN} } \cs_new_eq:NN \DebugMarksOn \mark_debug_on: \cs_new_eq:NN \DebugMarksOff \mark_debug_off: +\cs_new_protected:Npn \ShowMarksAt #1 { +} \cs_new_eq:NN \NewMarkClass \mark_new_class:n \@onlypreamble \NewMarkClass \cs_new_eq:NN \InsertMark \mark_insert:nn @@ -16018,11 +17493,11 @@ of this package available from CTAN} \cs_new_protected:Npn \__mark_update_singlecol_structures: { \box_if_vertical:NTF \@outputbox { - \__mark_update_structure:nn {page} + \__mark_update_structure_from_material:nn {page} { \vbox_unpack:N \@outputbox } } { - \__mark_update_structure:nn {page} + \__mark_update_structure_from_material:nn {page} { \hbox_unpack:N \@outputbox } } \__mark_update_structure_alias:nn {previous-column}{previous-page} @@ -16033,11 +17508,11 @@ of this package available from CTAN} \cs_new_protected:Npn \__mark_update_dblcol_structures: { \box_if_vertical:NTF \@outputbox { - \__mark_update_structure:nn {column} + \__mark_update_structure_from_material:nn {column} { \vbox_unpack:N \@outputbox } } { - \__mark_update_structure:nn {column} + \__mark_update_structure_from_material:nn {column} { \hbox_unpack:N \@outputbox } } \legacy_if:nTF {@firstcolumn} @@ -16057,10 +17532,19 @@ of this package available from CTAN} { g__mark_page_last_ ##1 _tl } \tl_gset_eq:cc { g__mark_page_top_ ##1 _tl } { g__mark_first-column_top_ ##1 _tl } - \tl_gset_eq:cc { g__mark_ page_first_ ##1 _tl } + + \tl_if_eq:ccTF { g__mark_first-column_top_ ##1 _tl } { g__mark_first-column_first_ ##1 _tl } - \tl_gset_eq:cc { g__mark_page_last_ ##1 _tl } - { g__mark_last-column_last_ ##1 _tl } + { + \tl_gset_eq:cc { g__mark_page_first_ ##1 _tl } + { g__mark_last-column_first_ ##1 _tl } + } + { + \tl_gset_eq:cc { g__mark_page_first_ ##1 _tl } + { g__mark_first-column_first_ ##1 _tl } + } + \tl_gset_eq:cc { g__mark_page_last_ ##1 _tl } + { g__mark_last-column_last_ ##1 _tl } } } } @@ -16323,15 +17807,15 @@ of this package available from CTAN} }% \reserved@a} \EndIncludeInRelease -\IncludeInRelease{2021/11/15}% - {\IfPackageLoadedtTF}{Test package loading}% +\IncludeInRelease{2024/06/01}% + {\IfPackageLoadedTF}{Test package loading}% \let \IfPackageLoadedTF \@ifpackageloaded \let \IfClassLoadedTF \@ifclassloaded \let \IfPackageLoadedWithOptionsTF \@ifpackagewith \let \IfClassLoadedWithOptionsTF \@ifclasswith \EndIncludeInRelease \IncludeInRelease{0000/00/00}% - {\IfPackageLoadedtTF}{Test package loading}% + {\IfPackageLoadedTF}{Test package loading}% \let \IfPackageLoadedTF \@ifpackageloaded \let \IfClassLoadedTF \@ifclassloaded @@ -16339,6 +17823,63 @@ of this package available from CTAN} \let \IfClassLoadedWithOptionsTF \@ifclasswith \EndIncludeInRelease +\IncludeInRelease{2024/06/01}% + {\IfPackageLoadedT}{More conditionals}% +\def\IfPackageLoadedT #1#2{\IfPackageLoadedTF{#1}{#2}{}} +\def\IfPackageLoadedF #1{\IfPackageLoadedTF{#1}{}} +\def\IfClassLoadedT #1#2{\IfClassLoadedTF{#1}{#2}{}} +\def\IfClassLoadedF #1{\IfClassLoadedTF{#1}{}} +\def\IfPackageAtLeastT#1#2#3{\IfPackageAtLeastTF{#1}{#2}{#3}{}} +\def\IfPackageAtLeastF #1#2{\IfPackageAtLeastTF{#1}{#2}{}} +\def\IfClassAtLeastT #1#2#3{\IfClassAtLeastTF{#1}{#2}{#3}{}} +\def\IfClassAtLeastF #1#2{\IfClassAtLeastTF{#1}{#2}{}} +\def\IfFileAtLeastT #1#2#3{\IfFileAtLeastTF{#1}{#2}{#3}{}} +\def\IfFileAtLeastF #1#2{\IfFileAtLeastTF{#1}{#2}{}} +\def\IfFormatAtLeastT #1#2{\IfFormatAtLeastTF{#1}{#2}{}} +\def\IfFormatAtLeastF #1{\IfFormatAtLeastTF{#1}{}} +\def\IfPackageLoadedWithOptionsT #1#2#3{\IfPackageLoadedWithOptionsTF{#1}{#2}{#3}{}} +\def\IfPackageLoadedWithOptionsF #1#2{\IfPackageLoadedWithOptionsTF{#1}{#2}{}} +\def\IfClassLoadedWithOptionsT #1#2#3{\IfClassLoadedWithOptionsTF{#1}{#2}{#3}{}} +\def\IfClassLoadedWithOptionsF #1#2{\IfClassLoadedWithOptionsTF{#1}{#2}{}} +\def\IfFileLoadedTF#1{% + \expandafter\ifx\csname ver@#1\endcsname\relax + \expandafter\@secondoftwo + \else + \expandafter\@firstoftwo + \fi} +\def\IfFileLoadedT#1#2{\IfFileLoadedTF{#1}{#2}{}} +\def\IfFileLoadedF #1{\IfFileLoadedTF{#1}{}} +\EndIncludeInRelease +\IncludeInRelease{0000/00/00}% + {\IfPackageLoadedT}{More conditionals}% + +\def\IfPackageLoadedT #1#2{\IfPackageLoadedTF{#1}{#2}{}} +\def\IfPackageLoadedF #1{\IfPackageLoadedTF{#1}{}} +\def\IfClassLoadedT #1#2{\IfClassLoadedTF{#1}{#2}{}} +\def\IfClassLoadedF #1{\IfClassLoadedTF{#1}{}} +\def\IfPackageAtLeastT#1#2#3{\IfPackageAtLeastTF{#1}{#2}{#3}{}} +\def\IfPackageAtLeastF #1#2{\IfPackageAtLeastTF{#1}{#2}{}} +\def\IfClassAtLeastT #1#2#3{\IfClassAtLeastTF{#1}{#2}{#3}{}} +\def\IfClassAtLeastF #1#2{\IfClassAtLeastTF{#1}{#2}{}} +\def\IfFileAtLeastT #1#2#3{\IfFileAtLeastTF{#1}{#2}{#3}{}} +\def\IfFileAtLeastF #1#2{\IfFileAtLeastTF{#1}{#2}{}} +\def\IfFormatAtLeastT #1#2{\IfFormatAtLeastTF{#1}{#2}{}} +\def\IfFormatAtLeastF #1{\IfFormatAtLeastTF{#1}{}} +\def\IfPackageLoadedWithOptionsT #1#2#3{\IfPackageLoadedWithOptionsTF{#1}{#2}{#3}{}} +\def\IfPackageLoadedWithOptionsF #1#2{\IfPackageLoadedWithOptionsTF{#1}{#2}{}} +\def\IfClassLoadedWithOptionsT #1#2#3{\IfClassLoadedWithOptionsTF{#1}{#2}{#3}{}} +\def\IfClassLoadedWithOptionsF #1#2{\IfClassLoadedWithOptionsTF{#1}{#2}{}} + +\def\IfFileLoadedTF#1{% + \expandafter\ifx\csname ver@#1\endcsname\relax + \expandafter\@secondoftwo + \else + \expandafter\@firstoftwo + \fi} +\def\IfFileLoadedT#1#2{\IfFileLoadedTF{#1}{#2}{}} +\def\IfFileLoadedF #1{\IfFileLoadedTF{#1}{}} + +\EndIncludeInRelease \IncludeInRelease{2020/10/01}% {\ProvidesPackage}{Check name with \strcmp}% \def\ProvidesPackage#1{% @@ -16425,11 +17966,11 @@ of this package available from CTAN} \expandafter\let \csname opt@#3.#1\expandafter\endcsname \csname opt@\reserved@a\endcsname - \@ifundefined{@raw@opt@#3.#1}% - {\expandafter\gdef\csname @raw@opt@#3.#1\expandafter\endcsname - \expandafter{#2}}% - {\expandafter\g@addto@macro\csname @raw@opt@#3.#1\expandafter\endcsname - \expandafter{\expandafter,#2}}% + \@ifundefined{@raw@opt@#3.#1}% + {\expandafter\gdef\csname @raw@opt@#3.#1\expandafter\endcsname + \expandafter{#2}}% + {\expandafter\g@addto@macro\csname @raw@opt@#3.#1\expandafter\endcsname + \expandafter{\expandafter,#2}}% } \EndIncludeInRelease \IncludeInRelease{2020/10/01}{\@pass@ptions} @@ -16607,6 +18148,25 @@ of this package available from CTAN} \AtEndOfPackage{\let\@unprocessedoptions\relax}% \@loadwithoptions\@pkgextension\RequirePackage} \EndIncludeInRelease +\IncludeInRelease{2024/06/01}% + {\@fileswithoptions}{Check Group}% +\def\@fileswithoptions#1{% + \ifnum\currentgrouplevel>\z@ + \@latex@error + {Loading a class or package in a group}% + {Classes and packages should only be loaded at the top level}% + \fi + \@ifnextchar[%] + {\@fileswith@ptions#1}% + {\@fileswith@ptions#1[]}} +\EndIncludeInRelease +\IncludeInRelease{0000/00/00}% + {\@fileswithoptions}{Check Group}% +\def\@fileswithoptions#1{% + \@ifnextchar[%] + {\@fileswith@ptions#1}% + {\@fileswith@ptions#1[]}} +\EndIncludeInRelease \IncludeInRelease{2020/10/01}% {\@fileswith@pti@ns}{ifx tests in \@fileswith@pti@ns}% \def\@fileswith@pti@ns#1[#2]#3[#4]{% @@ -16707,9 +18267,12 @@ of this package available from CTAN} \@ifundefined{opt@handler@\@currname.\@currext} {\@onefilewithoptions@clashchk{#2}} {% - \expandafter\protected@edef\csname opt@\@currname.\@currext\endcsname + \expandafter\protected@edef + \csname opt@\@currname.\@currext\endcsname {\zap@space#2 \@empty}% - \@namedef{@raw@opt@\@currname.\@currext}{#2}% + \expandafter\def + \csname @raw@opt@\@currname.\@currext\expandafter\endcsname + \expandafter{#2}% \@nameuse{opt@handler@\@currname.\@currext}% }% }% @@ -17255,8 +18818,6 @@ of this package available from CTAN} \endgroup% \EndIncludeInRelease %%% From File: ltfilehook.dtx -\providecommand\ltfilehookversion{v1.0o} -\providecommand\ltfilehookdate{2023/07/10} \IncludeInRelease{2020/10/01}% {\CurrentFile}{Hook management file}% \ExplSyntaxOn @@ -17744,8 +19305,6 @@ of this package available from CTAN} %% Frank Mittelbach, The LaTeX Project %% %%% From File: ltshipout.dtx -\providecommand\ltshipoutversion{v1.0n} -\providecommand\ltshipoutdate{2022/11/08} \IncludeInRelease{2020/10/01}% {\shipout}{Hook management (shipout)}% \ExplSyntaxOn diff --git a/Master/texmf-dist/tex/latex/base/latin1.def b/Master/texmf-dist/tex/latex/base/latin1.def index d67159ac7a1..b4784628978 100644 --- a/Master/texmf-dist/tex/latex/base/latin1.def +++ b/Master/texmf-dist/tex/latex/base/latin1.def @@ -43,7 +43,7 @@ %% extension .ins) which are part of the distribution. \ProvidesFile{latin1.def} - [2021/02/14 v1.3d Input encoding file] + [2024/02/08 v1.3d Input encoding file] \ProvideTextCommandDefault{\textdegree}{\ensuremath{{^\circ}}} \ProvideTextCommandDefault{\textonehalf}{\ensuremath{\frac12}} \ProvideTextCommandDefault{\textonequarter}{\ensuremath{\frac14}} diff --git a/Master/texmf-dist/tex/latex/base/latin10.def b/Master/texmf-dist/tex/latex/base/latin10.def index 2798bafe20c..457b7112ab5 100644 --- a/Master/texmf-dist/tex/latex/base/latin10.def +++ b/Master/texmf-dist/tex/latex/base/latin10.def @@ -43,7 +43,7 @@ %% extension .ins) which are part of the distribution. \ProvidesFile{latin10.def} - [2021/02/14 v1.3d Input encoding file] + [2024/02/08 v1.3d Input encoding file] \ProvideTextCommandDefault{\textdegree}{\ensuremath{{^\circ}}} \ProvideTextCommandDefault{\texteuro} {\TextSymbolUnavailable\texteuro} diff --git a/Master/texmf-dist/tex/latex/base/latin2.def b/Master/texmf-dist/tex/latex/base/latin2.def index 4a9f180b85d..764c5d0de5d 100644 --- a/Master/texmf-dist/tex/latex/base/latin2.def +++ b/Master/texmf-dist/tex/latex/base/latin2.def @@ -43,7 +43,7 @@ %% extension .ins) which are part of the distribution. \ProvidesFile{latin2.def} - [2021/02/14 v1.3d Input encoding file] + [2024/02/08 v1.3d Input encoding file] \ProvideTextCommandDefault{\textdegree}{\ensuremath{{^\circ}}} \ProvideTextCommandDefault{\textcurrency} {\TextSymbolUnavailable\textcurrency} diff --git a/Master/texmf-dist/tex/latex/base/latin3.def b/Master/texmf-dist/tex/latex/base/latin3.def index 6494fa8d0c9..04e1030b37c 100644 --- a/Master/texmf-dist/tex/latex/base/latin3.def +++ b/Master/texmf-dist/tex/latex/base/latin3.def @@ -43,7 +43,7 @@ %% extension .ins) which are part of the distribution. \ProvidesFile{latin3.def} - [2021/02/14 v1.3d Input encoding file] + [2024/02/08 v1.3d Input encoding file] \ProvideTextCommandDefault{\textdegree}{\ensuremath{{^\circ}}} \ProvideTextCommandDefault{\textonehalf}{\ensuremath{\frac12}} \ProvideTextCommandDefault{\textcurrency} diff --git a/Master/texmf-dist/tex/latex/base/latin4.def b/Master/texmf-dist/tex/latex/base/latin4.def index 756b13c5b17..6e2739c8704 100644 --- a/Master/texmf-dist/tex/latex/base/latin4.def +++ b/Master/texmf-dist/tex/latex/base/latin4.def @@ -43,7 +43,7 @@ %% extension .ins) which are part of the distribution. \ProvidesFile{latin4.def} - [2021/02/14 v1.3d Input encoding file] + [2024/02/08 v1.3d Input encoding file] \ProvideTextCommandDefault{\textdegree}{\ensuremath{{^\circ}}} \ProvideTextCommandDefault{\textcurrency} {\TextSymbolUnavailable\textcurrency} diff --git a/Master/texmf-dist/tex/latex/base/latin5.def b/Master/texmf-dist/tex/latex/base/latin5.def index 1a7a910dc84..8a6fb46905b 100644 --- a/Master/texmf-dist/tex/latex/base/latin5.def +++ b/Master/texmf-dist/tex/latex/base/latin5.def @@ -43,7 +43,7 @@ %% extension .ins) which are part of the distribution. \ProvidesFile{latin5.def} - [2021/02/14 v1.3d Input encoding file] + [2024/02/08 v1.3d Input encoding file] \ProvideTextCommandDefault{\textdegree}{\ensuremath{{^\circ}}} \ProvideTextCommandDefault{\textonehalf}{\ensuremath{\frac12}} \ProvideTextCommandDefault{\textonequarter}{\ensuremath{\frac14}} diff --git a/Master/texmf-dist/tex/latex/base/latin9.def b/Master/texmf-dist/tex/latex/base/latin9.def index 7ab2e06defe..35e87e2e564 100644 --- a/Master/texmf-dist/tex/latex/base/latin9.def +++ b/Master/texmf-dist/tex/latex/base/latin9.def @@ -43,7 +43,7 @@ %% extension .ins) which are part of the distribution. \ProvidesFile{latin9.def} - [2021/02/14 v1.3d Input encoding file] + [2024/02/08 v1.3d Input encoding file] \ProvideTextCommandDefault{\textdegree}{\ensuremath{{^\circ}}} \ProvideTextCommandDefault{\textcent} {\TextSymbolUnavailable\textcent} diff --git a/Master/texmf-dist/tex/latex/base/ltluatex.tex b/Master/texmf-dist/tex/latex/base/ltluatex.tex index fe226566c4e..2747e4f56f3 100644 --- a/Master/texmf-dist/tex/latex/base/ltluatex.tex +++ b/Master/texmf-dist/tex/latex/base/ltluatex.tex @@ -46,9 +46,9 @@ \ProvidesFile\undefined\begingroup\def\ProvidesFile #1#2[#3]{\endgroup\immediate\write-1{File: #1 #3}} \fi -\ProvidesFile{ltluatex.tex}% -[2023/08/03 v1.2c - LuaTeX support for plain TeX (core) +\ProvidesFile{ltluatex.tex} +[2024/02/11 v1.2c + LuaTeX support for plain TeX (core)% ] \edef\etatcatcode{\the\catcode`\@} \catcode`\@=11 diff --git a/Master/texmf-dist/tex/latex/base/ltxdoc.cls b/Master/texmf-dist/tex/latex/base/ltxdoc.cls index 04b523685c2..adee1bf9604 100644 --- a/Master/texmf-dist/tex/latex/base/ltxdoc.cls +++ b/Master/texmf-dist/tex/latex/base/ltxdoc.cls @@ -43,7 +43,7 @@ %% extension .ins) which are part of the distribution. \NeedsTeXFormat{LaTeX2e} \ProvidesClass{ltxdoc} - [2023/03/28 v2.1j Standard LaTeX documentation class] + [2024/02/08 v2.1j Standard LaTeX documentation class] \DeclareOption{a5paper}{\@latexerr{Option not supported}% {}} \newif\ifltxdoc@load@cfg@ \ltxdoc@load@cfg@true diff --git a/Master/texmf-dist/tex/latex/base/macce.def b/Master/texmf-dist/tex/latex/base/macce.def index 91b44e7c300..49b810b1320 100644 --- a/Master/texmf-dist/tex/latex/base/macce.def +++ b/Master/texmf-dist/tex/latex/base/macce.def @@ -43,7 +43,7 @@ %% extension .ins) which are part of the distribution. \ProvidesFile{macce.def} - [2021/02/14 v1.3d Input encoding file] + [2024/02/08 v1.3d Input encoding file] \ProvideTextCommandDefault{\textdegree}{\ensuremath{{^\circ}}} \ProvideTextCommandDefault{\textdiv} {\TextSymbolUnavailable\textdiv} diff --git a/Master/texmf-dist/tex/latex/base/next.def b/Master/texmf-dist/tex/latex/base/next.def index 838ef3a1e85..6cc4d6aaae7 100644 --- a/Master/texmf-dist/tex/latex/base/next.def +++ b/Master/texmf-dist/tex/latex/base/next.def @@ -43,7 +43,7 @@ %% extension .ins) which are part of the distribution. \ProvidesFile{next.def} - [2021/02/14 v1.3d Input encoding file] + [2024/02/08 v1.3d Input encoding file] \ProvideTextCommandDefault{\textdegree}{\ensuremath{{^\circ}}} \ProvideTextCommandDefault{\textonehalf}{\ensuremath{\frac12}} \ProvideTextCommandDefault{\textonequarter}{\ensuremath{\frac14}} diff --git a/Master/texmf-dist/tex/latex/base/nfssfont.tex b/Master/texmf-dist/tex/latex/base/nfssfont.tex index e842311231d..464b881ffbb 100644 --- a/Master/texmf-dist/tex/latex/base/nfssfont.tex +++ b/Master/texmf-dist/tex/latex/base/nfssfont.tex @@ -41,8 +41,8 @@ %% The list of derived (unpacked) files belonging to the distribution %% and covered by LPPL is defined by the unpacking scripts (with %% extension .ins) which are part of the distribution. -\def\nfssfontfileversion{v2.2e} -\def\nfssfontfiledate{2020/11/26} +\def\nfssfontfileversion{v2.2f} +\def\nfssfontfiledate{2023/11/07} \documentclass{article} @@ -100,7 +100,7 @@ {\PackageWarningNoLine{nfssfont}% {Encoding file `\next' not found.% \MessageBreak - You might have misspelt the name of the encoding + You might have misspelled the name of the encoding \MessageBreak or perhaps this encoding is not a text encoding, \MessageBreak diff --git a/Master/texmf-dist/tex/latex/base/omllcmm.fd b/Master/texmf-dist/tex/latex/base/omllcmm.fd index e618dc4dba9..322903455a3 100644 --- a/Master/texmf-dist/tex/latex/base/omllcmm.fd +++ b/Master/texmf-dist/tex/latex/base/omllcmm.fd @@ -46,7 +46,7 @@ %% making successful document exchange impossible. %% \ProvidesFile{omllcmm.fd} - [2019/07/09 v2.2f Standard LaTeX slide font definitions] + [2023/12/02 v2.2f Standard LaTeX slide font definitions] \DeclareFontFamily{OML}{lcmm}{\skewchar\font'177} \DeclareFontShape{OML}{lcmm}{m}{it}{% <7><8><10><12><13.82><16.59><19.907><23.89><28.66><34.4><41.28>cmmi8% diff --git a/Master/texmf-dist/tex/latex/base/omslcmsy.fd b/Master/texmf-dist/tex/latex/base/omslcmsy.fd index 228771692bf..89295e21cd7 100644 --- a/Master/texmf-dist/tex/latex/base/omslcmsy.fd +++ b/Master/texmf-dist/tex/latex/base/omslcmsy.fd @@ -46,7 +46,7 @@ %% making successful document exchange impossible. %% \ProvidesFile{omslcmsy.fd} - [2019/07/09 v2.2f Standard LaTeX slide font definitions] + [2023/12/02 v2.2f Standard LaTeX slide font definitions] \DeclareFontFamily{OMS}{lcmsy}{\skewchar\font'60} \DeclareFontShape{OMS}{lcmsy}{m}{n}{% <7><8><10><12><13.82><16.59><19.907><23.89><28.66><34.4><41.28>cmsy8% diff --git a/Master/texmf-dist/tex/latex/base/omxlcmex.fd b/Master/texmf-dist/tex/latex/base/omxlcmex.fd index bece1a61196..12315a1fceb 100644 --- a/Master/texmf-dist/tex/latex/base/omxlcmex.fd +++ b/Master/texmf-dist/tex/latex/base/omxlcmex.fd @@ -46,7 +46,7 @@ %% making successful document exchange impossible. %% \ProvidesFile{omxlcmex.fd} - [2019/07/09 v2.2f Standard LaTeX slide font definitions] + [2023/12/02 v2.2f Standard LaTeX slide font definitions] \DeclareFontFamily{OMX}{lcmex}{} \DeclareFontShape{OMX}{lcmex}{m}{n}{% <->sfixed*[17.28]cmex10% diff --git a/Master/texmf-dist/tex/latex/base/ot1lcmss.fd b/Master/texmf-dist/tex/latex/base/ot1lcmss.fd index 07ce6b86fd7..d7a5cb11f79 100644 --- a/Master/texmf-dist/tex/latex/base/ot1lcmss.fd +++ b/Master/texmf-dist/tex/latex/base/ot1lcmss.fd @@ -46,7 +46,7 @@ %% making successful document exchange impossible. %% \ProvidesFile{ot1lcmss.fd} - [2019/07/09 v2.2f Standard LaTeX slide font definitions] + [2023/12/02 v2.2f Standard LaTeX slide font definitions] \DeclareFontFamily{OT1}{lcmss}{\hyphenchar\font45 } \DeclareFontShape{OT1}{lcmss}{m}{n}{% <7><8><10><12><13.82><16.59><19.907><23.89><28.66><34.4><41.28>% diff --git a/Master/texmf-dist/tex/latex/base/ot1lcmtt.fd b/Master/texmf-dist/tex/latex/base/ot1lcmtt.fd index cf1d558b503..2d6d825ffe8 100644 --- a/Master/texmf-dist/tex/latex/base/ot1lcmtt.fd +++ b/Master/texmf-dist/tex/latex/base/ot1lcmtt.fd @@ -46,7 +46,7 @@ %% making successful document exchange impossible. %% \ProvidesFile{ot1lcmtt.fd} - [2019/07/09 v2.2f Standard LaTeX slide font definitions] + [2023/12/02 v2.2f Standard LaTeX slide font definitions] \DeclareFontFamily{OT1}{lcmtt}{\hyphenchar\font\m@ne} \DeclareFontShape{OT1}{lcmtt}{m}{n}{% <13.82><16.59><19.907><23.89><28.66><34.4><41.28>% diff --git a/Master/texmf-dist/tex/latex/base/preload.cfg b/Master/texmf-dist/tex/latex/base/preload.cfg index ff607f13ddd..2e89d1f4e74 100644 --- a/Master/texmf-dist/tex/latex/base/preload.cfg +++ b/Master/texmf-dist/tex/latex/base/preload.cfg @@ -35,11 +35,11 @@ %% the system are in the document `cfgguide.tex'. %% %% -%%% From File: fontdef.dtx +%%% From File: fontdef.dtx \ProvidesFile{preload.cfg} - [2021/01/15 v3.0i LaTeX Kernel -(Uncustomized preload - font setup)] + [2024/02/09 v3.0i LaTeX Kernel + (Uncustomized preload font setup) +] %% %% %% diff --git a/Master/texmf-dist/tex/latex/base/report.cls b/Master/texmf-dist/tex/latex/base/report.cls index e4225d68c30..cb7a32f536d 100644 --- a/Master/texmf-dist/tex/latex/base/report.cls +++ b/Master/texmf-dist/tex/latex/base/report.cls @@ -43,7 +43,7 @@ %% extension .ins) which are part of the distribution. \NeedsTeXFormat{LaTeX2e}[1995/12/01] \ProvidesClass{report} - [2023/05/17 v1.4n + [2024/02/08 v1.4n Standard LaTeX document class] \newcommand\@ptsize{} \newif\if@restonecol diff --git a/Master/texmf-dist/tex/latex/base/sfonts.def b/Master/texmf-dist/tex/latex/base/sfonts.def index d87f757630a..f95ded8243e 100644 --- a/Master/texmf-dist/tex/latex/base/sfonts.def +++ b/Master/texmf-dist/tex/latex/base/sfonts.def @@ -36,7 +36,7 @@ %% %% \ProvidesFile{sfonts.def} - [2019/07/09 v2.2f Standard LaTeX slide font definitions] + [2023/12/02 v2.2f Standard LaTeX slide font definitions] \DeclareErrorFont{OT1}{lcmss}{m}{n}{19.907} \DeclareFontSubstitution{OT1}{lcmss}{m}{n} \input ot1lcmss.fd diff --git a/Master/texmf-dist/tex/latex/base/shortvrb.sty b/Master/texmf-dist/tex/latex/base/shortvrb.sty index 59c0d09a811..c0266dd6930 100644 --- a/Master/texmf-dist/tex/latex/base/shortvrb.sty +++ b/Master/texmf-dist/tex/latex/base/shortvrb.sty @@ -43,11 +43,11 @@ %% extension .ins) which are part of the distribution. \NeedsTeXFormat{LaTeX2e}[1994/12/01] \ProvidesPackage{shortvrb} - [2022/11/13 v3.0m + [2024/04/26 v3.0p Standard LaTeX documentation package V3 (FMi)] %% %% Package `doc' to use with LaTeX 2e -%% Copyright (C) 1989-2022 Frank Mittelbach, all rights reserved. +%% Copyright (C) 1989-2023 Frank Mittelbach, all rights reserved. diff --git a/Master/texmf-dist/tex/latex/base/size10.clo b/Master/texmf-dist/tex/latex/base/size10.clo index 9b20cf04dc8..11be942b3e9 100644 --- a/Master/texmf-dist/tex/latex/base/size10.clo +++ b/Master/texmf-dist/tex/latex/base/size10.clo @@ -42,7 +42,7 @@ %% and covered by LPPL is defined by the unpacking scripts (with %% extension .ins) which are part of the distribution. \ProvidesFile{size10.clo} - [2023/05/17 v1.4n + [2024/02/08 v1.4n Standard LaTeX file (size option)] \renewcommand\normalsize{% \@setfontsize\normalsize\@xpt\@xiipt diff --git a/Master/texmf-dist/tex/latex/base/size11.clo b/Master/texmf-dist/tex/latex/base/size11.clo index 090d88bb534..a36fb7931ba 100644 --- a/Master/texmf-dist/tex/latex/base/size11.clo +++ b/Master/texmf-dist/tex/latex/base/size11.clo @@ -42,7 +42,7 @@ %% and covered by LPPL is defined by the unpacking scripts (with %% extension .ins) which are part of the distribution. \ProvidesFile{size11.clo} - [2023/05/17 v1.4n + [2024/02/08 v1.4n Standard LaTeX file (size option)] \renewcommand\normalsize{% \@setfontsize\normalsize\@xipt{13.6}% diff --git a/Master/texmf-dist/tex/latex/base/size12.clo b/Master/texmf-dist/tex/latex/base/size12.clo index f83b35a0ebd..aa9f0808f73 100644 --- a/Master/texmf-dist/tex/latex/base/size12.clo +++ b/Master/texmf-dist/tex/latex/base/size12.clo @@ -42,7 +42,7 @@ %% and covered by LPPL is defined by the unpacking scripts (with %% extension .ins) which are part of the distribution. \ProvidesFile{size12.clo} - [2023/05/17 v1.4n + [2024/02/08 v1.4n Standard LaTeX file (size option)] \renewcommand\normalsize{% \@setfontsize\normalsize\@xiipt{14.5}% diff --git a/Master/texmf-dist/tex/latex/base/source2edoc.cls b/Master/texmf-dist/tex/latex/base/source2edoc.cls index 5f731af7ae8..48ae49b29a2 100644 --- a/Master/texmf-dist/tex/latex/base/source2edoc.cls +++ b/Master/texmf-dist/tex/latex/base/source2edoc.cls @@ -2,12 +2,12 @@ % This class is buggy and needs fixing \ProvidesClass{source2edoc} - [2022/04/03 v0.2c Quick hack to typeset source2.tex + [2024/02/14 v0.2e Quick hack to typeset source2.tex (not usable for anything else and buggy -- will vanish again)!] -\LoadClass{l3doc} +\LoadClass[kernel]{l3doc} \RemoveFromHook{begindocument}[l3doc] % drop the standard setting making " a shortverb \AddToHook{begindocument}{\MakeShortVerb \|} % but readd | as one @@ -50,84 +50,6 @@ } - -% some l3doc's def are buggy (already fixed there but not distributed yet) - -\RenewDocumentCommand \DocInclude { m } - { - \relax\clearpage - \docincludeaux - \IfFileExists{#1.fdd} - { \cs_set:Npn \currentfile{#1.fdd} } - { \cs_set:Npn \currentfile{#1.dtx} } - \int_compare:nNnTF \@auxout = \@partaux - { \@latexerr{\string\include\space cannot~be~nested}\@eha } - { \@docinclude {#1} } % <--- braces needed! - \int_compare:nNnF { \tex_currentgrouplevel:D } = { 0 } - { - \int_compare:nNnT { \tex_interactionmode:D } = { 0 } - { \int_set:Nn \tex_interactionmode:D { 1 } } - \msg_fatal:nnn { source2edoc } { missing-endgroup } {#1} - } - } -\msg_new:nnn { source2edoc } { missing-endgroup } - { - \str_if_eq:VnTF \@currenvir { document } - { - There~are~\int_use:N \tex_currentgrouplevel:D - \c_space_tl unclosed~groups~in~#1.dtx. - } - { - The~\@currenvir \c_space_tl environment~on~line~\@currenvline - \c_space_tl doesn't~have~a~matching~\iow_char:N\\end{\@currenvir}. - } - } -\cs_gset:Npn \@docinclude #1 - { - \clearpage - \immediate\write\@mainaux{\string\@input{#1.aux}} - \@tempswatrue - \if@partsw - \@tempswafalse - \cs_set:Npx \@tempb {#1} - \clist_map_inline:Nn \@partlist - { - \if_meaning:w \@tempa \@tempb - \@tempswatrue - \fi: - } - \fi - \if@tempswa - \cs_set_eq:NN \@auxout \@partaux - \immediate\openout\@partaux #1.aux - \immediate\write\@partaux{\relax} - \cs_set_eq:NN \@ltxdoc@PrintIndex \PrintIndex - \cs_set_eq:NN \PrintIndex \relax - \cs_set_eq:NN \@ltxdoc@PrintChanges \PrintChanges - \cs_set_eq:NN \PrintChanges \relax - \cs_set_eq:NN \@ltxdoc@theglossary \theglossary - \cs_set_eq:NN \@ltxdoc@endtheglossary \endtheglossary - \part{\currentfile} - { - \cs_set_eq:NN \ttfamily\relax - \cs_gset:Npx \filekey - { \filekey,~ \thepart = { \ttfamily \currentfile } } % <-- mising spaces considered harmful - } - \DocInput{\currentfile} - \cs_set_eq:NN \PrintIndex \@ltxdoc@PrintIndex - \cs_set_eq:NN \PrintChanges \@ltxdoc@PrintChanges - \cs_set_eq:NN \theglossary \@ltxdoc@theglossary - \cs_set_eq:NN \endtheglossary \@ltxdoc@endtheglossary - \clearpage - \@writeckpt{#1} - \immediate \closeout \@partaux - \else - \@nameuse{cp@#1} - \fi - \cs_set_eq:NN \@auxout \@mainaux - } - - % change the setup here: we have a lot of long names so better run raggeded \cs_set_protected:Npn \__codedoc_macro_end_style:n #1 @@ -176,7 +98,7 @@ dd% \else\@ctrerr\fi} \def\docincludeaux{% - \def\thepart{\aalph{part}}\def\filesep{\thepart-}% + \def\thepart{\ifnum\value{part}<10 0\fi\arabic{part}}\def\filesep{\thepart-}% \let\filekey\@gobble \g@addto@macro\index@prologue{% \gdef\@oddfoot{\parbox[t]{\textwidth}{\strut\footnotesize @@ -303,6 +225,9 @@ Bug reports can be opened (category \texttt{#1}) at\\% \AddToHook{cmd/tableofcontents/after}{\global\let\tableofcontents\relax} +% pages > 1000 +\renewcommand\@pnumwidth{2em} + \InputIfFileExists{ltxdoc.cfg} {\typeout{*************************************^^J% * Local config file ltxdoc.cfg used^^J% diff --git a/Master/texmf-dist/tex/latex/base/structuredlog.sty b/Master/texmf-dist/tex/latex/base/structuredlog.sty index 030d37d849e..6473fbc96fd 100644 --- a/Master/texmf-dist/tex/latex/base/structuredlog.sty +++ b/Master/texmf-dist/tex/latex/base/structuredlog.sty @@ -42,8 +42,8 @@ %% and covered by LPPL is defined by the unpacking scripts (with %% extension .ins) which are part of the distribution. %%% From File: ltfilehook.dtx -\providecommand\ltfilehookversion{v1.0o} -\providecommand\ltfilehookdate{2023/07/10} +\def\ltfilehookdate{2024/03/13} +\def\ltfilehookversion{v1.0o} \ProvidesExplPackage {structuredlog}{\ltfilehookdate}{\ltfilehookversion} {Structuring the TeX transcript file} diff --git a/Master/texmf-dist/tex/latex/base/syntonly.sty b/Master/texmf-dist/tex/latex/base/syntonly.sty index 7f813b145c5..4d8aa24f88f 100644 --- a/Master/texmf-dist/tex/latex/base/syntonly.sty +++ b/Master/texmf-dist/tex/latex/base/syntonly.sty @@ -43,7 +43,7 @@ %% extension .ins) which are part of the distribution. %% \ProvidesPackage{syntonly} - [2017/06/30 v2.1e Standard LaTeX2e package] + [2024/02/08 v2.1e Standard LaTeX2e package] \font\dummyft@=dummy \relax \newif\ifsyntax@ \syntax@false diff --git a/Master/texmf-dist/tex/latex/base/t1lcmss.fd b/Master/texmf-dist/tex/latex/base/t1lcmss.fd index cd217b339df..17e05a62eb5 100644 --- a/Master/texmf-dist/tex/latex/base/t1lcmss.fd +++ b/Master/texmf-dist/tex/latex/base/t1lcmss.fd @@ -46,7 +46,7 @@ %% making successful document exchange impossible. %% \ProvidesFile{t1lcmss.fd} - [2019/07/09 v2.2f Standard LaTeX slide font definitions] + [2023/12/02 v2.2f Standard LaTeX slide font definitions] \DeclareFontFamily{T1}{lcmss}{} \DeclareFontShape{T1}{lcmss}{m}{n}{% <7><8><10><12><13.82><16.59><19.907><23.89><28.66><34.4><41.28>% diff --git a/Master/texmf-dist/tex/latex/base/t1lcmtt.fd b/Master/texmf-dist/tex/latex/base/t1lcmtt.fd index faaff8c4bd6..72ad4664b2e 100644 --- a/Master/texmf-dist/tex/latex/base/t1lcmtt.fd +++ b/Master/texmf-dist/tex/latex/base/t1lcmtt.fd @@ -46,7 +46,7 @@ %% making successful document exchange impossible. %% \ProvidesFile{t1lcmtt.fd} - [2019/07/09 v2.2f Standard LaTeX slide font definitions] + [2023/12/02 v2.2f Standard LaTeX slide font definitions] \DeclareFontFamily{T1}{lcmtt}{\hyphenchar\font\m@ne} \DeclareFontShape{T1}{lcmtt}{m}{n}{% <13.82><16.59><19.907><23.89><28.66><34.4><41.28>% diff --git a/Master/texmf-dist/tex/latex/base/textcomp-2018-08-11.sty b/Master/texmf-dist/tex/latex/base/textcomp-2018-08-11.sty index 252b6ff9790..b611d19a427 100644 --- a/Master/texmf-dist/tex/latex/base/textcomp-2018-08-11.sty +++ b/Master/texmf-dist/tex/latex/base/textcomp-2018-08-11.sty @@ -408,7 +408,6 @@ {\PackageInfo{textcomp}{Local configuration file used}}{} \fi - \endinput %% %% End of file `textcomp-2018-08-11.sty'. diff --git a/Master/texmf-dist/tex/latex/base/textcomp.sty b/Master/texmf-dist/tex/latex/base/textcomp.sty index ef41c70c0b8..df0d53634de 100644 --- a/Master/texmf-dist/tex/latex/base/textcomp.sty +++ b/Master/texmf-dist/tex/latex/base/textcomp.sty @@ -42,14 +42,12 @@ %% and covered by LPPL is defined by the unpacking scripts (with %% extension .ins) which are part of the distribution. %%% From File: lttextcomp.dtx -\providecommand\DeclareRelease[3]{} -\providecommand\DeclareCurrentRelease[2]{} - +\DeclareRelease{}{1997-12-01}{textcomp-2018-08-11.sty} \DeclareRelease{}{2018-08-11}{textcomp-2018-08-11.sty} \DeclareCurrentRelease{}{2020-02-02} \ProvidesPackage{textcomp} - [2020/02/02 v2.0n Standard LaTeX package] + [2024/04/24 v2.1b Standard LaTeX package] \NeedsTeXFormat{LaTeX2e}[2020/02/02] \DeclareOption{full}{\DeclareEncodingSubset{TS1}{?}{0}} \DeclareOption{almostfull}{\DeclareEncodingSubset{TS1}{?}{1}} @@ -74,12 +72,10 @@ {#1{#2}}{#3}% #5}% } -\ExecuteOptions{info} \ProcessOptions\relax \InputIfFileExists{textcomp.cfg} {\PackageInfo{textcomp}{Local configuration file used}}{} - \endinput %% %% End of file `textcomp.sty'. diff --git a/Master/texmf-dist/tex/latex/base/ullasy.fd b/Master/texmf-dist/tex/latex/base/ullasy.fd index 3dd0dfe4cbb..f244ab86e46 100644 --- a/Master/texmf-dist/tex/latex/base/ullasy.fd +++ b/Master/texmf-dist/tex/latex/base/ullasy.fd @@ -46,7 +46,7 @@ %% making successful document exchange impossible. %% \ProvidesFile{ullasy.fd} - [2019/07/09 v2.2f Standard LaTeX slide font definitions] + [2023/12/02 v2.2f Standard LaTeX slide font definitions] \DeclareFontFamily{U}{llasy}{} \DeclareFontShape{U}{llasy}{m}{n}{% <12><13.82><16.59><19.907><23.89><28.66><34.4><41.28>lasy8% |