summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex-dev/base/latex.ltx
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/latex-dev/base/latex.ltx')
-rw-r--r--Master/texmf-dist/tex/latex-dev/base/latex.ltx935
1 files changed, 772 insertions, 163 deletions
diff --git a/Master/texmf-dist/tex/latex-dev/base/latex.ltx b/Master/texmf-dist/tex/latex-dev/base/latex.ltx
index 2d22e178de4..942de9c0a35 100644
--- a/Master/texmf-dist/tex/latex-dev/base/latex.ltx
+++ b/Master/texmf-dist/tex/latex-dev/base/latex.ltx
@@ -12,10 +12,12 @@
%% ltdefns.dtx (with options: `2ekernel')
%% ltcmd.dtx (with options: `2ekernel')
%% lthooks.dtx (with options: `2ekernel')
+%% ltcmdhooks.dtx (with options: `2ekernel')
%% ltalloc.dtx (with options: `2ekernel')
%% ltcntrl.dtx (with options: `2ekernel')
%% lterror.dtx (with options: `2ekernel')
%% ltpar.dtx (with options: `2ekernel')
+%% ltpara.dtx (with options: `2ekernel')
%% ltspace.dtx (with options: `2ekernel')
%% ltlogos.dtx (with options: `2ekernel')
%% ltfiles.dtx (with options: `2ekernel')
@@ -484,6 +486,8 @@
\errmessage{No room for a new #3}%
\fi}
\def\newhelp#1#2{\newtoks#1#1\expandafter{\csname#2\endcsname}}
+\newread\@inputcheck
+\newwrite\@unused
\newdimen\maxdimen \maxdimen=16383.99999pt % the largest legal <dimen>
\newskip\hideskip \hideskip=-1000pt plus 1fill % negative but can grow
\newdimen\p@ \p@=1pt % this saves macro space and time
@@ -509,6 +513,12 @@
\finalhyphendemerits=5000
\adjdemerits=10000
\tracinglostchars=1
+\ifx\directlua\@undefined
+ % \tracingstacklevels=0 % added in 2021
+\else
+ \newcount\tracingstacklevels
+ % Code for \tracingstacklevels defined in ltfinal.dtx
+\fi
\uchyph=1
\defaulthyphenchar=`\-
\defaultskewchar=-1
@@ -633,54 +643,25 @@
\gdef\loggingoutput{\tracingoutput\@ne
\showboxbreadth\maxdimen\showboxdepth\maxdimen\errorstopmode}
\gdef\showoutput{\loggingoutput\showoverfull}
-\ifx\tracingscantokens\@undefined
-\gdef\loggingall{%
- \tracingstats\tw@
- \tracingpages\@ne
- \tracinglostchars\@ne
- \tracingparagraphs\@ne
- \errorcontextlines\maxdimen
- \loggingoutput
- \tracingmacros\tw@
- \tracingcommands\tw@
- \tracingrestores\@ne
- }%
-\else
-\gdef\loggingall{%
+\edef\loggingall{%
\tracingstats\tw@
\tracingpages\@ne
- \tracinglostchars\tw@
+ \tracinglostchars\thr@@
\tracingparagraphs\@ne
\tracinggroups\@ne
\tracingifs\@ne
\tracingscantokens\@ne
\tracingnesting\@ne
\errorcontextlines\maxdimen
- \loggingoutput
+ \ifdefined\tracingstacklevels \tracingstacklevels\maxdimen \fi
+ \noexpand \loggingoutput
\tracingmacros\tw@
\tracingcommands\thr@@
\tracingrestores\@ne
\tracingassigns\@ne
}%
-\fi
-\gdef\tracingall{\showoverfull\loggingall}
-\ifx\tracingscantokens\@undefined
-\def\tracingnone{%
- \tracingonline\z@
- \tracingcommands\z@
- \showboxdepth\m@ne
- \showboxbreadth\m@ne
- \tracingoutput\z@
- \errorcontextlines\m@ne
- \tracingrestores\z@
- \tracingparagraphs\z@
- \tracingmacros\z@
- \tracinglostchars\@ne
- \tracingpages\z@
- \tracingstats\z@
-}%
-\else
-\def\tracingnone{%
+\def\tracingall{\showoverfull\loggingall}
+\edef\tracingnone{%
\tracingassigns\z@
\tracingrestores\z@
\tracingonline\z@
@@ -689,6 +670,7 @@
\showboxbreadth\m@ne
\tracingoutput\z@
\errorcontextlines\m@ne
+ \ifdefined\tracingstacklevels \tracingstacklevels\z@ \fi
\tracingnesting\z@
\tracingscantokens\z@
\tracingifs\z@
@@ -699,7 +681,6 @@
\tracingpages\z@
\tracingstats\z@
}%
-\fi
\def\hideoutput{%
\tracingoutput\z@
\showboxbreadth\m@ne
@@ -710,8 +691,8 @@
%%% From File: ltvers.dtx
\def\fmtname{LaTeX2e}
\edef\fmtversion
- {2021-05-01}
-\def\patch@level{-2}
+ {2021-06-01}
+\def\patch@level{-3}
\edef\development@branch@name{develop \the\year-\the\month-\the\day}
\iffalse
\def\reserved@a#1/#2/#3\@nil{%
@@ -775,17 +756,37 @@
{There is an \string\EndIncludeRelease\space missing}%
\@includeinreleasefalse
\fi
- \kernel@ifnextchar[%
- {\@IncludeInRelease{#1}}
- {\@IncludeInRelease{#1}[#1]}}
+ \ifnum0%
+ \ifx\new@moduledate\@empty\else 1\fi
+ \ifnum \expandafter\@parse@version#1//00\@nil=0 1\fi
+ =11
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi
+ {\finish@module@release{#1}}%
+ {\kernel@ifnextchar[%
+ {\@IncludeInRelease{#1}}
+ {\@IncludeInRelease{#1}[#1]}}}
+\def\finish@module@release#1#2#3{%
+ \toks@{[#1] #3}%
+ \ifnum\expandafter\@parse@version\new@moduledate//00\@nil
+ >\expandafter\@parse@version\fmtversion//00\@nil
+ \GenericInfo{}{Applying: \the\toks@}%
+ \else
+ \GenericInfo{}{Skipping: \the\toks@}%
+ \expandafter\gobble@finish@module@release
+ \fi}
+\long\def\gobble@finish@module@release#1\EndModuleRelease{%
+ \EndModuleRelease}
\def\@IncludeInRelease#1[#2]{\@IncludeInRele@se{#2}}
\def\@IncludeInRele@se#1#2#3{%
\toks@{[#1] #3}%
\expandafter\ifx\csname\string#2+\@currname+IIR\endcsname\relax
\ifnum\expandafter\@parse@version#1//00\@nil
- >\expandafter\@parse@version\fmtversion//00\@nil
+ >\expandafter\@parse@version\fmtversion//00\@nil
\GenericInfo{}{Skipping: \the\toks@}%
- \expandafter\expandafter\expandafter\@gobble@IncludeInRelease
+ \expandafter\expandafter\expandafter\@gobble@IncludeInRelease
\else
\GenericInfo{}{Applying: \the\toks@}%
\@includeinreleasetrue
@@ -801,6 +802,9 @@
\@includeinreleasefalse
\else
\PackageError{latexrelease}{mis-matched EndIncludeInRelease}{}%
+\fi
+\if@skipping@module
+ \expandafter\new@module@skip
\fi}
\long\def\@gobble@IncludeInRelease#1\EndIncludeInRelease{%
\@includeinreleasefalse
@@ -810,6 +814,47 @@
#2#3\@end@check@IncludeInRelease{%
\ifx\@check@IncludeInRelease#2\else
\PackageError{latexrelease}{skipped IncludeInRelease for tag \string#2}{}%
+ \fi
+ \if@skipping@module
+ \expandafter\new@module@skip
+ \fi}
+\let\if@skipping@module\iffalse
+\def\@skipping@moduletrue{\let\if@skipping@module\iftrue}
+\def\@skipping@modulefalse{\let\if@skipping@module\iffalse}
+\let\new@modulename\@empty
+\let\new@moduledate\@empty
+\def\NewModuleRelease#1#2#3{%
+ \ifx\new@modulename\@empty \else
+ \@latex@error{Nested \noexpand\NewModuleRelease forbidden.}\@ehd \fi
+ \edef\new@moduledate{#1}%
+ \edef\new@modulename{#2}%
+ \GenericInfo{}{BEGIN module: \new@modulename\space (\new@moduledate)}%
+ \GenericInfo{}{ \@spaces\@spaces\@spaces\space#3\@gobble}%
+ \ifnum\sourceLaTeXdate<%
+ \expandafter\@parse@version\new@moduledate//00\@nil\relax
+ \ifnum\expandafter\@parse@version\fmtversion//00\@nil<%
+ \expandafter\@parse@version\new@moduledate//00\@nil\relax
+ \GenericInfo{}{Skipping module \new@modulename}%
+ \expandafter\expandafter
+ \expandafter\gobble@finish@module@release
+ \else
+ \GenericInfo{}{Applying module \new@modulename}
+ \@skipping@modulefalse
+ \fi
+ \else
+ \GenericInfo{}{Skipping module \new@modulename}
+ \@skipping@moduletrue
+ \expandafter\new@module@skip
+ \fi}
+\long\def\new@module@skip#1\IncludeInRelease{\IncludeInRelease}
+\def\EndModuleRelease{%
+ \ifx\new@modulename\@empty
+ \@latex@error{Extra \string\EndModuleRelease.}\@eha
+ \else
+ \GenericInfo{}{END module: \new@modulename\space (\new@moduledate)}%
+ \let\new@modulename\@empty
+ \let\new@moduledate\@empty
+ \@skipping@modulefalse
\fi}
%%% From File: ltluatex.dtx
\ifx\directlua\@undefined\else
@@ -991,8 +1036,12 @@
}
\fi
%%% From File: ltexpl.dtx
-\let\@kernel@after@enddocument\@empty
-\let\@kernel@after@enddocument@afterlastpage\@empty
+\ifx\@kernel@after@enddocument\@undefined
+ \let \@kernel@after@enddocument \@empty
+ \let \@kernel@after@enddocument@afterlastpage \@empty
+ \let \@kernel@before@begindocument \@empty
+ \let \@kernel@after@begindocument \@empty
+\fi
\def\reserved@a#1{\ifdefined#1\else\def#1{}\fi}
\reserved@a\@expl@sys@load@backend@@
\reserved@a\@expl@push@filename@@
@@ -1623,8 +1672,8 @@
\xdef#1{\the\toks@}%
\endgroup}
%%% From File: ltcmd.dtx
-\def\ltcmdversion{v1.0a}
-\def\ltcmddate{2021/01/21}
+\def\ltcmdversion{v1.0d}
+\def\ltcmddate{2021-04-19}
\message{document commands,}
\ExplSyntaxOn
\tl_new:N \l__cmd_arg_spec_tl
@@ -3330,7 +3379,7 @@
}
\cs_new_protected:Npn \__cmd_get_arg_spec:NTF #1#2#3
{
- \__cmd_cmd_if_xparse:NTF #1
+ \__kernel_cmd_if_xparse:NTF #1
{
\tl_set:Nx \ArgumentSpecification { \tl_item:Nn #1 { 2 } }
#2
@@ -3430,7 +3479,7 @@
#1 {#2} {#4}
\__cmd_tl_mapthread_loop:w #1#3 \q_mark
}
-\cs_new_protected:Npn \__cmd_cmd_if_xparse:NTF #1
+\cs_new_protected:Npn \__kernel_cmd_if_xparse:NTF #1
{
\exp_args:Nf \str_case_e:nnTF
{
@@ -3883,8 +3932,9 @@
\cs_new_eq:NN \ShowDocumentEnvironmentArgSpec \__cmd_show_arg_spec:n
\ExplSyntaxOff
%%% From File: lthooks.dtx
-\def\lthooksversion{v1.0h}
-\def\lthooksdate{2021/01/15}
+\def\lthooksversion{v1.0m}
+\def\lthooksdate{2021/04/29}
+
\ExplSyntaxOn
\bool_new:N \g__hook_debug_bool
\cs_new_eq:NN \__hook_debug:n \use_none:n
@@ -3949,24 +3999,34 @@
\cs_new_protected:Npn \__hook_tl_gclear:N #1
{ \__hook_tl_gset_eq:NN #1 \c_empty_tl }
\cs_generate_variant:Nn \__hook_tl_gclear:N { c }
+
+
\cs_new_protected:Npn \hook_new:n #1
{ \__hook_normalize_hook_args:Nn \__hook_new:n {#1} }
\cs_new_protected:Npn \__hook_new:n #1
{
- \hook_if_exist:nTF {#1}
- { \msg_error:nnn { hooks } { exists } {#1} }
+ \__hook_if_declared:nTF {#1}
+ { \__kernel_msg_error:nnn { hooks } { exists } {#1} }
+ {
+ \tl_new:c { g__hook_#1_declared_tl }
+ \__hook_make_usable:n {#1}
+ }
+ }
+\cs_new_protected:Npn \__hook_make_usable:n #1
+ {
+ \tl_if_exist:cF { __hook~#1 }
{
\seq_gput_right:Nn \g__hook_all_seq {#1}
\tl_new:c { __hook~#1 }
- \__hook_declare:n {#1}
- \clist_new:c {g__hook_#1_labels_clist}
+ \__hook_init_structure:n {#1}
+ \clist_new:c { g__hook_#1_labels_clist }
\tl_new:c { g__hook_#1_reversed_tl }
\__hook_include_legacy_code_chunk:n {#1}
- }
+ }
}
-\cs_new_protected:Npn \__hook_declare:n #1
+\cs_new_protected:Npn \__hook_init_structure:n #1
{
- \__hook_if_exist:nF {#1}
+ \__hook_if_structure_exist:nF {#1}
{
\prop_new:c { g__hook_#1_code_prop }
\tl_new:c { __hook_toplevel~#1 }
@@ -3994,6 +4054,44 @@
}
}
}
+\cs_new_protected:Npn \hook_disable:n #1
+ { \__hook_normalize_hook_args:Nn \__hook_disable:n {#1} }
+\cs_new_protected:Npn \__hook_disable:n #1
+ {
+ \tl_gclear_new:c { g__hook_#1_declared_tl }
+ \cs_undefine:c { __hook~#1 }
+ }
+\prg_new_conditional:Npnn \__hook_if_disabled:n #1 { p, T, F, TF }
+ {
+ \bool_lazy_and:nnTF
+ { \tl_if_exist_p:c { g__hook_#1_declared_tl } }
+ { ! \tl_if_exist_p:c { __hook~#1 } }
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+\cs_new_protected:Npn \hook_provide:n #1
+ { \__hook_normalize_hook_args:Nn \__hook_provide:nn {#1} { } }
+\cs_new_protected:Npn \hook_provide_reversed:n #1
+ { \__hook_normalize_hook_args:Nn \__hook_provide:nn {#1} { - } }
+\cs_new_protected:Npn \__hook_provide:nn #1 #2
+ {
+ \__hook_if_disabled:nTF {#1}
+ { \__kernel_msg_warning:nnn { hooks } { provide-disabled } {#1} }
+ {
+ \__hook_if_declared:nTF {#1}
+ {
+ \str_if_eq:eeF { \tl_use:c { g__hook_#1_reversed_tl } } {#2}
+ { \__kernel_msg_error:nnn { hooks } { provide-error } {#1} }
+ }
+ {
+ \tl_new:c { g__hook_#1_declared_tl }
+ \__hook_make_usable:n {#1}
+ \tl_gset:cn { g__hook_#1_reversed_tl } {#2}
+ }
+ }
+ }
+\cs_new_protected:Npn \hook_provide_pair:nn #1#2
+ { \hook_provide:n {#1} \hook_provide_reversed:n {#2} }
\cs_new:Npn \__hook_parse_label_default:n #1
{
\tl_if_novalue:nTF {#1}
@@ -4004,7 +4102,7 @@
{
\tl_if_empty:nTF {#1}
{
- \msg_expandable_error:nn { hooks } { empty-label }
+ \__kernel_msg_expandable_error:nn { hooks } { empty-label }
\__hook_currname_or_default:
}
{
@@ -4032,7 +4130,7 @@
{
\tl_if_empty:NTF \@currname
{
- \msg_expandable_error:nnn { hooks } { should-not-happen }
+ \__kernel_msg_expandable_error:nnn { hooks } { should-not-happen }
{ Empty~default~label. }
\__hook_make_name:n { label-missing }
}
@@ -4089,12 +4187,16 @@
\__hook_if_marked_removal:nnTF {#1} {#2}
{ \__hook_unmark_removal:nn {#1} {#2} }
{
- \hook_if_exist:nTF {#1}
+ \__hook_if_usable:nTF {#1}
{
\__hook_hook_gput_code_do:nnn {#1} {#2} {#3}
\__hook_update_hook_code:n {#1}
}
- { \__hook_try_declaring_generic_hook:nnn {#1} {#2} {#3} }
+ {
+ \__hook_if_disabled:nTF {#1}
+ { \__kernel_msg_error:nnn { hooks } { hook-disabled } {#1} }
+ { \__hook_try_declaring_generic_hook:nnn {#1} {#2} {#3} }
+ }
}
}
}
@@ -4102,17 +4204,17 @@
\cs_new_protected:Npn \__hook_hook_gput_code_do:nnn #1 #2 #3
{
\__hook_debug:n{\iow_term:x{****~ Add~ to~
- \hook_if_exist:nF {#1} { undeclared~ }
+ \__hook_if_usable:nF {#1} { undeclared~ }
hook~ #1~ (#2)
\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: }
{
- \__hook_declare:n {#1}
+ \__hook_init_structure:n {#1}
\__hook_tl_gput_right:cn { __hook_toplevel~#1 } {#3}
}
- { \msg_error:nnn { hooks } { misused-top-level } {#1} }
+ { \__kernel_msg_error:nnn { hooks } { misused-top-level } {#1} }
}
{
\prop_get:cnNTF { g__hook_#1_code_prop } {#2} \l__hook_return_tl
@@ -4125,7 +4227,7 @@
}
\cs_new_protected:Npn \__hook_gput_undeclared_hook:nnn #1 #2 #3
{
- \__hook_declare:n {#1}
+ \__hook_init_structure:n {#1}
\__hook_hook_gput_code_do:nnn {#1} {#2} {#3}
}
\cs_new_protected:Npn \__hook_try_declaring_generic_hook:nnn #1
@@ -4161,7 +4263,12 @@
{
\prop_if_in:NnTF \c__hook_generics_prop {#1}
{
- \hook_if_exist:nF {#5} { \hook_new:n {#5} }
+ \__hook_if_usable:nF {#5}
+ {
+ \str_if_eq:nnT {#1} { cmd }
+ { \__hook_try_put_cmd_hook:n {#5} }
+ \__hook_make_usable:n {#5}
+ }
\prop_if_in:NnTF \c__hook_generics_reversed_ii_prop {#2}
{ \tl_gset:cn { g__hook_#5_reversed_tl } { - } }
{
@@ -4201,7 +4308,7 @@
{ \__hook_strip_double_slash:w #1/#2/#3 / #4 \s__hook_mark }
}
\prop_const_from_keyval:Nn \c__hook_generics_prop
- {env=,file=,package=,class=,include=}
+ {cmd=,env=,file=,package=,class=,include=}
\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=}
@@ -4209,7 +4316,7 @@
{ \__hook_normalize_hook_args:Nnn \__hook_gremove_code:nn {#1} {#2} }
\cs_new_protected:Npn \__hook_gremove_code:nn #1 #2
{
- \__hook_if_exist:nTF {#1}
+ \__hook_if_structure_exist:nTF {#1}
{
\str_if_eq:nnTF {#2} {*}
{
@@ -4227,7 +4334,7 @@
{#1} {#2}
}
}
- \hook_if_exist:nT {#1}
+ \__hook_if_usable:nT {#1}
{ \__hook_update_hook_code:n {#1} }
}
{ \__hook_mark_removal:nn {#1} {#2} }
@@ -4262,14 +4369,14 @@
}
\cs_new_protected:Npn \__hook_gset_rule:nnnn #1#2#3#4
{
- \__hook_declare:n {#1}
+ \__hook_init_structure:n {#1}
\__hook_rule_gclear:nnn {#1} {#2} {#4}
\cs_if_exist_use:cTF { __hook_rule_#3_gset:nnn }
{
{#1} {#2} {#4}
\__hook_update_hook_code:n {#1}
}
- { \msg_error:nnnnnn { hooks } { unknown-rule }
+ { \__kernel_msg_error:nnnnnn { hooks } { unknown-rule }
{#1} {#2} {#3} {#4} }
}
\cs_new_protected:Npn \__hook_rule_before_gset:nnn #1#2#3
@@ -4310,7 +4417,7 @@
{
\if_int_compare:w \__hook_str_compare:nn {#1} {#2} > 0 \exp_stop_f:
\prg_return_true:
- \else
+ \else:
\prg_return_false:
\fi:
}
@@ -4344,7 +4451,7 @@
\__hook_debug:n{ \iow_term:x{^^JUpdate~ code~ for~ hook~
'#1' \on@line :^^J} }
\__hook_include_legacy_code_chunk:n {#1}
- \hook_if_exist:nT {#1}
+ \__hook_if_usable:nT {#1}
{
\prop_if_empty:cTF {g__hook_#1_code_prop}
{
@@ -4488,7 +4595,7 @@
\cs_new_protected:cpn { __hook_apply_rule_xE:nnn } #1#2#3
{
\__hook_debug:n { \__hook_msg_pair_found:nnn {#1} {#2} {#3} }
- \msg_error:nnnnnn { hooks } { labels-incompatible }
+ \__kernel_msg_error:nnnnnn { hooks } { labels-incompatible }
{#1} {#2} {#3} { 1 }
\use:c { __hook_apply_rule_->:nnn } {#1} {#2} {#3}
\use:c { __hook_apply_rule_<-:nnn } {#1} {#2} {#3}
@@ -4496,7 +4603,7 @@
\cs_new_protected:cpn { __hook_apply_rule_xW:nnn } #1#2#3
{
\__hook_debug:n { \__hook_msg_pair_found:nnn {#1} {#2} {#3} }
- \msg_warning:nnnnnn { hooks } { labels-incompatible }
+ \__kernel_msg_warning:nnnnnn { hooks } { labels-incompatible }
{#1} {#2} {#3} { 0 }
}
\cs_new_protected:cpn { __hook_apply_rule_->:nnn } #1#2#3
@@ -4564,8 +4671,10 @@
{
\__hook_preamble_hook:n {#1}
\__hook_log_cmd:x { ^^J ->~The~hook~'#1': }
- \hook_if_exist:nF {#1}
- { \__hook_log_line:x { is~not~declared! } }
+ \__hook_if_usable:nF {#1}
+ { \__hook_log_line:x { The~hook~is~not~declared. } }
+ \__hook_if_disabled:nT {#1}
+ { \__hook_log_line:x { The~hook~is~disabled. } }
\hook_if_empty:nTF {#1}
{ #2 { The~hook~is~empty } }
{
@@ -4579,7 +4688,7 @@
\__hook_log_line:x
{
Document-level~(top-level)~code
- \hook_if_exist:nT {#1}
+ \__hook_if_usable:nT {#1}
{ ~(executed~\__hook_if_reversed:nTF {#1} {first} {last} ) } :
}
\__hook_log_line_indent:x
@@ -4610,7 +4719,7 @@
\bool_if:NT \l__hook_tmpa_bool
{ \__hook_log_line_indent:x { --- } }
\bool_lazy_and:nnTF
- { \hook_if_exist_p:n {#1} }
+ { \__hook_if_usable_p:n {#1} }
{ ! \hook_if_empty_p:n {#1} }
{
\__hook_log_line:x
@@ -4632,10 +4741,12 @@
}
}
{
+ \__hook_log_line:x { Execution~order: }
#2
{
- Hook~ \hook_if_exist:nTF {#1}
- {code~pool~empty} {not~declared}
+ \@spaces Not~set~because~the~hook~ \__hook_if_usable:nTF {#1}
+ { code~pool~is~empty }
+ { is~\__hook_if_disabled:nTF {#1} {disabled} {undeclared} }
}
}
}
@@ -4691,10 +4802,14 @@
{ \__hook_normalize_hook_args:Nn \__hook_gput_next_code:nn {#1} }
\cs_new_protected:Npn \__hook_gput_next_code:nn #1 #2
{
- \__hook_declare:n {#1}
- \hook_if_exist:nTF {#1}
- { \__hook_gput_next_do:nn {#1} {#2} }
- { \__hook_try_declaring_generic_next_hook:nn {#1} {#2} }
+ \__hook_if_disabled:nTF {#1}
+ { \__kernel_msg_error:nnn { hooks } { hook-disabled } {#1} }
+ {
+ \__hook_init_structure:n {#1}
+ \__hook_if_usable:nTF {#1}
+ { \__hook_gput_next_do:nn {#1} {#2} }
+ { \__hook_try_declaring_generic_next_hook:nn {#1} {#2} }
+ }
}
\cs_new_protected:Npn \__hook_gput_next_do:nn #1
{
@@ -4746,12 +4861,12 @@
{
\__hook_if_file_hook:wTF #1 / / \s__hook_mark
{
- \exp_args:Ne \__hook_if_exist_use:n
+ \exp_args:Ne \__hook_if_usable_use:n
{ \exp_args:Ne \__hook_file_hook_normalize:n {#1} }
}
- { \__hook_if_exist_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_exist_use:n #1
+\cs_new_protected:Npn \__hook_if_usable_use:n #1
{
\tl_if_exist:cT { __hook~#1 }
{
@@ -4771,9 +4886,10 @@
}
\cs_new_protected:Npn \__hook_use_once_store:n #1
{ \prop_gput:Nnn \g__hook_execute_immediately_prop {#1} { } }
+
\prg_new_conditional:Npnn \hook_if_empty:n #1 { p , T , F , TF }
{
- \__hook_if_exist:nTF {#1}
+ \__hook_if_structure_exist:nTF {#1}
{
\bool_lazy_and:nnTF
{ \prop_if_empty_p:c { g__hook_#1_code_prop } }
@@ -4787,18 +4903,24 @@
}
{ \prg_return_true: }
}
-\prg_new_conditional:Npnn \hook_if_exist:n #1 { p , T , F , TF }
+\prg_new_conditional:Npnn \__hook_if_usable:n #1 { p , T , F , TF }
{
\tl_if_exist:cTF { __hook~#1 }
{ \prg_return_true: }
{ \prg_return_false: }
}
-\prg_new_conditional:Npnn \__hook_if_exist:n #1 { p , T , F , TF }
+\prg_new_conditional:Npnn \__hook_if_structure_exist:n #1 { p , T , F , TF }
{
\prop_if_exist:cTF { g__hook_#1_code_prop }
{ \prg_return_true: }
{ \prg_return_false: }
}
+\prg_new_conditional:Npnn \__hook_if_declared:n #1 { p, T, F, TF }
+ {
+ \tl_if_exist:cTF { g__hook_#1_declared_tl }
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
\prg_new_conditional:Npnn \__hook_if_reversed:n #1 { p , T , F , TF }
{
\if_int_compare:w \cs:w g__hook_#1_reversed_tl \cs_end: 1 < 0 \exp_stop_f:
@@ -4807,47 +4929,54 @@
\prg_return_false:
\fi:
}
-\msg_new:nnnn { hooks } { labels-incompatible }
+\__kernel_msg_new:nnnn { hooks } { labels-incompatible }
{
- Labels~`#1'~and~`#2'~are~incompatible
- \str_if_eq:nnF {#3} {??} { ~in~hook~`#3' } .~
+ Labels~'#1'~and~'#2'~are~incompatible
+ \str_if_eq:nnF {#3} {??} { ~in~hook~'#3' } .~
\int_compare:nNnTF {#4} = { 1 }
{ The~ code~ for~ both~ labels~ will~ be~ dropped. }
{ You~ may~ see~ errors~ later. }
}
{ LaTeX~found~two~incompatible~labels~in~the~same~hook.~
This~indicates~an~incompatibility~between~packages. }
-\msg_new:nnnn { hooks } { exists }
- { Hook~`#1'~ has~ already~ been~ declared. }
+\__kernel_msg_new:nnnn { hooks } { exists }
+ { Hook~'#1'~ has~ already~ been~ declared. }
{ There~ already~ exists~ a~ hook~ declaration~ with~ this~
name.\\
Please~ use~ a~ different~ name~ for~ your~ hook.}
-\msg_new:nnn { hooks } { empty-label }
+\__kernel_msg_new:nnnn { hooks } { hook-disabled }
+ { 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:n~or~\iow_char:N\\DisableHook,~so~
+ it~cannot~have~code~added~to~it.
+ }
+\__kernel_msg_new:nnn { hooks } { empty-label }
{
Empty~code~label~\msg_line_context:.~
- Using~`\__hook_currname_or_default:'~instead.
+ Using~'\__hook_currname_or_default:'~instead.
}
-\msg_new:nnn { hooks } { no-default-label }
+\__kernel_msg_new:nnn { hooks } { no-default-label }
{
Missing~(empty)~default~label~\msg_line_context:. \\
This~command~was~ignored.
}
-\msg_new:nnnn { hooks } { unknown-rule }
- { Unknown~ relationship~ `#3'~
- between~ labels~ `#2'~ and~ `#4'~
- \str_if_eq:nnF {#1} {??} { ~in~hook~`#1' }. ~
+\__kernel_msg_new:nnnn { hooks } { unknown-rule }
+ { Unknown~ relationship~ '#3'~
+ between~ labels~ '#2'~ and~ '#4'~
+ \str_if_eq:nnF {#1} {??} { ~in~hook~'#1' }. ~
Perhaps~ a~ missspelling?
}
{
The~ relation~ used~ not~ known~ to~ the~ system.~ Allowed~ values~ are~
- `before'~ or~ `<',~
- `after'~ or~ `>',~
- `incompatible-warning',~
- `incompatible-error',~
- `voids'~ or~
- `unrelated'.
+ 'before'~ or~ '<',~
+ 'after'~ or~ '>',~
+ 'incompatible-warning',~
+ 'incompatible-error',~
+ 'voids'~ or~
+ 'unrelated'.
}
-\msg_new:nnnn { hooks } { misused-top-level }
+\__kernel_msg_new:nnnn { hooks } { misused-top-level }
{
Illegal~\iow_char:N \\AddToHook{#1}[top-level]{...}.\\
'top-level'~is~reserved~for~the~user's~document.
@@ -4858,36 +4987,56 @@
'\__hook_currname_or_default:'~for~this~\@cls@pkg,~or~another~
suitable~label.
}
-\msg_new:nnn { hooks } { set-top-level }
+\__kernel_msg_new:nnn { hooks } { set-top-level }
{
- You~cannot~change~the~default~label~#1~`top-level'.~Illegal \\
+ You~cannot~change~the~default~label~#1~'top-level'.~Illegal \\
\use:nn { ~ } { ~ } \iow_char:N \\#2{#3} \\
\msg_line_context:.
}
-\msg_new:nnn { hooks } { ddhl-deprecated }
+\__kernel_msg_new:nnn { hooks } { ddhl-deprecated }
{
\iow_char:N \\DeclareDefaultHookLabel~is~deprecated.\\
Use~\iow_char:N \\SetDefaultHookLabel~instead.\\ \\
The~deprecated~name~will~be~removed~in~the~next~release.
}
-\msg_new:nnn { hooks } { extra-pop-label }
+\__kernel_msg_new:nnn { hooks } { extra-pop-label }
{
Extra~\iow_char:N \\PopDefaultHookLabel. \\
This~command~will~be~ignored.
}
-\msg_new:nnn { hooks } { missing-pop-label }
+\__kernel_msg_new:nnn { hooks } { missing-pop-label }
{
Missing~\iow_char:N \\PopDefaultHookLabel. \\
- The~label~`#1'~was~pushed~but~never~popped.~Something~is~wrong.
+ The~label~'#1'~was~pushed~but~never~popped.~Something~is~wrong.
}
-\msg_new:nnn { hooks } { should-not-happen }
+\__kernel_msg_new:nnn { hooks } { should-not-happen }
{
ERROR!~This~should~not~happen.~#1 \\
Please~report~at~https://github.com/latex3/latex2e.
}
+\__kernel_msg_new:nnn { hooks } { provide-disabled }
+ {
+ Can't~ provide~ hook~ '#1'~ because~ it~ is~ disabled!
+ }
+\__kernel_msg_new:nnnn { hooks } { provide-error }
+ {
+ Hook~'#1'~ already~ declared~ as~ a~
+ \__hook_if_reversed:nTF {#1} { reversed } { normal }~ hook!
+ }
+ {
+ You~ attempted~ to~ provide~ the~ hook~'#1'~ as~ a~
+ \__hook_if_reversed:nTF {#1} { normal } { reversed }~ hook,~ but~ it~
+ was~ already~ previously~ declared~ as~ a~
+ \__hook_if_reversed:nTF {#1} { reversed } { normal }~ hook.~
+ A~ redeclaration~ is~ not~ possible.
+ }
\NewDocumentCommand \NewHook { m }{ \hook_new:n {#1} }
\NewDocumentCommand \NewReversedHook { m }{ \hook_new_reversed:n {#1} }
\NewDocumentCommand \NewMirroredHookPair { mm }{ \hook_new_pair:nn {#1}{#2} }
+\NewDocumentCommand \ProvideHook { m }{ \hook_provide:n {#1} }
+\NewDocumentCommand \ProvideReversedHook { m }{ \hook_provide_reversed:n {#1} }
+\NewDocumentCommand \ProvideMirroredHookPair { mm }{ \hook_provide_pair:nn {#1}{#2} }
+\NewDocumentCommand \DisableHook { m }{ \hook_disable:n {#1} }
\NewDocumentCommand \AddToHook { m o +m }
{ \hook_gput_code:nnn {#1} {#2} {#3} }
\NewDocumentCommand \AddToHookNext { m +m }
@@ -4900,11 +5049,11 @@
\cs_new_protected:Npn \__hook_curr_name_push_aux:n #1
{
\tl_if_blank:nTF {#1}
- { \msg_error:nn { hooks } { no-default-label } }
+ { \__kernel_msg_error:nn { hooks } { no-default-label } }
{
\str_if_eq:nnTF {#1} { top-level }
{
- \msg_error:nnnnn { hooks } { set-top-level }
+ \__kernel_msg_error:nnnnn { hooks } { set-top-level }
{ to } { PushDefaultHookLabel } {#1}
}
{
@@ -4917,7 +5066,7 @@
{
\seq_gpop:NNTF \g__hook_name_stack_seq \l__hook_return_tl
{ \tl_gset_eq:NN \g__hook_hook_curr_name_tl \l__hook_return_tl }
- { \msg_error:nn { hooks } { extra-pop-label } }
+ { \__kernel_msg_error:nn { hooks } { extra-pop-label } }
}
\tl_gput_right:Nn \@kernel@after@enddocument@afterlastpage
{ \__hook_end_document_label_check: }
@@ -4925,7 +5074,7 @@
{
\seq_gpop:NNT \g__hook_name_stack_seq \l__hook_return_tl
{
- \msg_error:nnx { hooks } { missing-pop-label }
+ \__kernel_msg_error:nnx { hooks } { missing-pop-label }
{ \g__hook_hook_curr_name_tl }
\tl_gset_eq:NN \g__hook_hook_curr_name_tl \l__hook_return_tl
\__hook_end_document_label_check:
@@ -4935,7 +5084,7 @@
{
\seq_if_empty:NTF \g__hook_name_stack_seq
{
- \msg_error:nnnnn { hooks } { set-top-level }
+ \__kernel_msg_error:nnnnn { hooks } { set-top-level }
{ for } { SetDefaultHookLabel } {#1}
}
{ \exp_args:Nx \__hook_set_default_label:n { \__hook_make_name:n {#1} } }
@@ -4944,14 +5093,14 @@
{
\str_if_eq:nnTF {#1} { top-level }
{
- \msg_error:nnnnn { hooks } { set-top-level }
+ \__kernel_msg_error:nnnnn { hooks } { set-top-level }
{ to } { SetDefaultHookLabel } {#1}
}
{ \tl_gset:Nn \g__hook_hook_curr_name_tl {#1} }
}
\NewDocumentCommand \DeclareDefaultHookLabel { m }
{
- \msg_error:nn { hooks } { ddhl-deprecated }
+ \__kernel_msg_error:nn { hooks } { ddhl-deprecated }
\SetDefaultHookLabel {#1}
}
\NewDocumentCommand \PushDefaultHookLabel { m }
@@ -4977,15 +5126,328 @@
\@onlypreamble\DeclareDefaultHookRule
\NewDocumentCommand \ClearHookRule { m m m }
{ \hook_gset_rule:nnnn {#1}{#2}{unrelated}{#3} }
-\cs_new_eq:NN \IfHookExistsTF \hook_if_exist:nTF
\cs_new_eq:NN \IfHookEmptyTF \hook_if_empty:nTF
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5
+\cs_new_eq:NN \IfHookExistsTF \__hook_if_usable:nTF
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\cs_new_eq:NN \@expl@@@initialize@all@@
\__hook_initialize_all:
\cs_new_eq:NN \@expl@@@hook@curr@name@pop@@
\__hook_curr_name_pop:
\ExplSyntaxOff
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% File: ltcmdhooks.dtx (C) Copyright 2020-2021
+%% Frank Mittelbach, Phelype Oleinik, LaTeX Team
+%%% From File: ltcmdhooks.dtx
+\def\ltcmdhooksversion{v1.0a}
+\def\ltcmdhooksdate{2021/04/30}
+\ExplSyntaxOn
+\tl_new:N \g_hook_patch_action_list_tl
+\int_new:N \l__hook_patch_num_args_int
+\tl_new:N \l__hook_patch_prefixes_tl
+\tl_new:N \l__hook_patch_param_text_tl
+\tl_new:N \l__hook_patch_replacement_tl
+\prop_new:N \g__hook_delayed_patches_prop
+\cs_new_protected:Npn \__hook_patch_debug:x #1
+ { \__hook_debug:n { \iow_term:x { [lthooks]~#1 } } }
+\cs_generate_variant:Nn \tl_rescan:nn { nV }
+\cs_new_protected:Npn \__hook_try_put_cmd_hook:n #1
+ { \__hook_try_put_cmd_hook:w #1 / / / \s__hook_mark {#1} }
+\cs_new_protected:Npn \__hook_try_put_cmd_hook:w
+ #1 / #2 / #3 / #4 \s__hook_mark #5
+ {
+ \__hook_debug:n { \iow_term:n { ->~Adding~cmd~hook~to~'#2'~(#3): } }
+ \str_case:nnTF {#3}
+ { { before } { } { after } { } }
+ { \exp_args:Nc \__hook_patch_cmd_or_delay:Nnn {#2} {#2} {#3} }
+ { \__kernel_msg_error:nnn { hooks } { wrong-cmd-hook } {#2} {#3} }
+ }
+\cs_new_protected:Npn \__hook_patch_cmd_or_delay:Nnn #1 #2 #3
+ {
+ \__hook_debug:n { \iow_term:n { ->~Add~generic~cmd~hook~for~#2~(#3). } }
+ \__hook_debug:n
+ { \iow_term:n { !~In~the~preamble:~delaying. } }
+ \prop_gput:Nnn \g__hook_delayed_patches_prop { #2 / #3 }
+ { \__hook_cmd_try_patch:nn {#2} {#3} }
+ }
+\cs_new_protected:Npn \__hook_cmd_begindocument_code:
+ {
+ \cs_gset_eq:NN \__hook_patch_cmd_or_delay:Nnn \__hook_patch_command:Nnn
+ \prop_map_function:NN \g__hook_delayed_patches_prop { \use_ii:nn }
+ \prop_gclear:N \g__hook_delayed_patches_prop
+ \cs_undefine:N \__hook_cmd_begindocument_code:
+ }
+\g@addto@macro \@kernel@after@begindocument
+ { \__hook_cmd_begindocument_code: }
+\cs_new_protected:Npn \__hook_cmd_try_patch:nn #1 #2
+ {
+ \__hook_debug:n
+ { \iow_term:x { ->~\string\begin{document}~try~cmd / #1 / #2. } }
+ \__hook_if_declared:nTF { cmd / #1 / #2 }
+ {
+ \__hook_debug:n
+ { \iow_term:n { .->~Giving~up:~hook~already~created. } }
+ }
+ {
+ \cs_if_exist:cT {#1}
+ { \exp_args:Nc \__hook_patch_command:Nnn {#1} {#1} {#2} }
+ }
+ }
+\cs_new_protected:Npn \__hook_patch_command:Nnn #1 #2 #3
+ {
+ \__hook_patch_debug:x { analyzing~'\token_to_str:N #1' }
+ \__hook_patch_debug:x { \token_to_str:N #1 = \token_to_meaning:N #1 }
+ \__hook_patch_check:NNnn \cs_if_exist:NTF #1 { undef }
+ {
+ \__hook_patch_debug:x { ++~control~sequence~is~defined }
+ \__hook_patch_check:NNnn \token_if_macro:NTF #1 { macro }
+ {
+ \__hook_patch_debug:x { ++~control~sequence~is~a~macro }
+ \__hook_patch_check:NNnn \__hook_if_public_command:NTF #1 { expl3 }
+ {
+ \__hook_patch_debug:x { ++~macro~is~not~private }
+ \robust@command@act
+ \g_hook_patch_action_list_tl #1
+ \__hook_retokenize_patch:Nnn { #1 {#2} {#3} }
+ }
+ }
+ }
+ }
+\cs_new_protected:Npn \__hook_patch_check:NNnn #1 #2 #3 #4
+ {
+ #1 #2 {#4}
+ {
+ \__kernel_msg_error:nnxx { hooks } { cant-patch }
+ { \token_to_str:N #2 } {#3}
+ }
+ }
+\use:x
+ {
+ \prg_new_protected_conditional:Npnn
+ \exp_not:N \__hook_if_public_command:N ##1 { TF }
+ {
+ \exp_not:N \exp_last_unbraced:Nf
+ \exp_not:N \__hook_if_public_command:w
+ { \exp_not:N \cs_to_str:N ##1 }
+ \tl_to_str:n { _ _ } \s__hook_mark
+ }
+ }
+\exp_last_unbraced:NNNNo
+\cs_new_protected:Npn \__hook_if_public_command:w
+ #1 \tl_to_str:n { _ _ } #2 \s__hook_mark
+ {
+ \tl_if_empty:nTF {#2}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+\tl_gset:Nn \g_hook_patch_action_list_tl
+ {
+ { \@if@DeclareRobustCommand \__hook_patch_DeclareRobustCommand:Nnn }
+ { \@if@newcommand \__hook_patch_newcommand:Nnn }
+ { \__kernel_cmd_if_xparse:NTF \__hook_cmd_patch_xparse:Nnn }
+ }
+\cs_new_protected:Npn \__hook_patch_DeclareRobustCommand:Nnn #1
+ {
+ \exp_args:Nc \@if@newcommand { \cs_to_str:N #1 ~ }
+ { \exp_args:Nc \__hook_patch_newcommand:Nnn }
+ { \exp_args:NNc \__hook_patch_expand_redefine:NNnn \c_false_bool }
+ { \cs_to_str:N #1 ~ }
+ }
+\cs_new_protected:Npn \__hook_patch_newcommand:Nnn #1
+ {
+ \exp_args:NNc \__hook_patch_expand_redefine:NNnn \c_true_bool
+ { \c_backslash_str \cs_to_str:N #1 }
+ }
+\cs_new_protected:Npn \__hook_cmd_patch_xparse:Nnn #1
+ {
+ \exp_args:NNc \__hook_patch_expand_redefine:NNnn \c_false_bool
+ { \cs_to_str:N #1 ~ code }
+ }
+\cs_new_protected:Npn \__hook_patch_expand_redefine:NNnn #1 #2 #3 #4
+ {
+ \__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
+ \bool_if:NT #1 { -1 }
+ }
+ \int_compare:nNnTF { \l__hook_patch_num_args_int } > { \c_zero_int }
+ {
+ \tl_set:Nx \l__hook_patch_param_text_tl
+ { \bool_if:NTF #1 { [####1] } { ####1 } }
+ \tl_set:Nx \l__hook_patch_replacement_tl
+ { \bool_if:NTF #1 { [####1] } { {####1} } }
+ \int_step_inline:nnn { 2 } { \l__hook_patch_num_args_int }
+ {
+ \tl_put_right:Nn \l__hook_patch_param_text_tl { ## ####1 }
+ \tl_put_right:Nn \l__hook_patch_replacement_tl { { ## ####1 } }
+ }
+ }
+ {
+ \tl_clear:N \l__hook_patch_param_text_tl
+ \tl_clear:N \l__hook_patch_replacement_tl
+ }
+ \group_begin:
+ \int_set:Nn \tex_escapechar:D { `\/ }
+ \use:x
+ {
+ \group_end:
+ \tl_set:Nx \exp_not:N \l__hook_patch_prefixes_tl
+ { \exp_not:N \__hook_make_prefixes:w \cs_prefix_spec:N #2 / / }
+ }
+ \use:x
+ {
+ \l__hook_patch_prefixes_tl \tex_def:D
+ \exp_not:N #2 \exp_not:V \l__hook_patch_param_text_tl
+ {
+ \str_if_eq:nnT {#4} { before }
+ { \exp_not:N \UseHook { cmd / #3 / #4 } }
+ \exp_args:No \exp_not:o
+ { \exp_after:wN #2 \l__hook_patch_replacement_tl }
+ \str_if_eq:nnT {#4} { after }
+ { \exp_not:N \UseHook { cmd / #3 / #4 } }
+ }
+ }
+ }
+\cs_new:Npn \__hook_make_prefixes:w / #1 /
+ {
+ \tl_if_empty:nF {#1}
+ {
+ \exp_not:c { tex_ \tl_trim_spaces:n {#1} :D }
+ \__hook_make_prefixes:w /
+ }
+ }
+\cs_new_protected:Npn \__hook_retokenize_patch:Nnn #1 #2 #3
+ {
+ \__hook_patch_debug:x { ..~command~can~only~be~patched~by~rescanning }
+ \str_if_eq:eeTF { \cs_argument_spec:N #1 } { }
+ { \__hook_patch_expand_redefine:NNnn \c_false_bool #1 {#2} {#3} }
+ {
+ \tl_set:Nx \l__hook_tmpa_tl
+ {
+ \int_compare:nNnTF { \char_value_catcode:n {`\@ } } = { 12 }
+ { \exp_not:N \makeatletter } { \exp_not:N \makeatother }
+ }
+ \tl_set:Nx \l__hook_tmpb_tl
+ {
+ \bool_if:NTF \l__kernel_expl_bool
+ { \ExplSyntaxOff } { \ExplSyntaxOn }
+ }
+ \use:x
+ {
+ \exp_not:N \__hook_try_patch_with_catcodes:Nnnnw
+ \exp_not:n { #1 {#2} {#3} }
+ { \prg_do_nothing: }
+ { \exp_not:V \l__hook_tmpa_tl } % @
+ { \exp_not:V \l__hook_tmpb_tl } % _:
+ {
+ \exp_not:V \l__hook_tmpa_tl % @
+ \exp_not:V \l__hook_tmpb_tl % _:
+ }
+ }
+ \q_recursion_tail \q_recursion_stop
+ {
+ \__kernel_msg_error:nnxx { hooks } { cant-patch }
+ { \c_backslash_str #2 } { retok }
+ }
+ }
+ }
+\cs_new_protected:Npn \__hook_try_patch_with_catcodes:Nnnnw #1 #2 #3 #4
+ {
+ \quark_if_recursion_tail_stop_do:nn {#4} { \use:n }
+ \__hook_patch_debug:x { ++~trying~to~patch~by~retokenization }
+ \__hook_cmd_if_scanable:NnTF {#1} {#4}
+ {
+ \__hook_patch_debug:x { ++~macro~can~be~retokenized~cleanly }
+ \__hook_patch_debug:x { ==~retokenizing~macro~now }
+ \__hook_patch_retokenize:Nnnn #1 {#2} {#3} {#4}
+ \use_i_delimit_by_q_recursion_stop:nw \use_none:n
+ }
+ {
+ \__hook_patch_debug:x { --~macro~cannot~be~retokenized~cleanly }
+ \__hook_try_patch_with_catcodes:Nnnnw #1 {#2} {#3}
+ }
+ }
+\cs_new_eq:NN \kerneltmpDoNotUse !
+\cs_new_protected:Npn \__hook_patch_required_catcodes:
+ {
+ \char_set_catcode_escape:N \\
+ \char_set_catcode_group_begin:N \{
+ \char_set_catcode_group_end:N \}
+ \char_set_catcode_parameter:N \#
+ % \int_set:Nn \tex_endlinechar:D { -1 }
+ % \int_set:Nn \tex_newlinechar:D { -1 }
+ }
+\prg_new_protected_conditional:Npnn \__hook_cmd_if_scanable:Nn #1 #2 { TF }
+ {
+ \cs_set_eq:NN \kerneltmpDoNotUse \scan_stop:
+ \cs_set_eq:NN \__hook_tmp:w \scan_stop:
+ \use:x
+ {
+ \cs_set:Npn \__hook_tmp:w
+ ####1 \tl_to_str:n { macro: } ####2 -> ####3 \s__hook_mark
+ { ####1 \def \kerneltmpDoNotUse ####2 {####3} }
+ \tl_set:Nx \exp_not:N \l__hook_tmpa_tl
+ { \exp_not:N \__hook_tmp:w \token_to_meaning:N #1 \s__hook_mark }
+ }
+ \tl_rescan:nV { #2 \__hook_patch_required_catcodes: } \l__hook_tmpa_tl
+ \token_if_eq_meaning:NNTF #1 \kerneltmpDoNotUse
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+\cs_new_protected:Npn \__hook_patch_retokenize:Nnnn #1 #2 #3 #4
+ {
+ \cs_set_eq:NN \kerneltmpDoNotUse \scan_stop:
+ \cs_set_eq:NN \__hook_tmp:w \scan_stop:
+ \use:x
+ {
+ \cs_set:Npn \__hook_tmp:w
+ ####1 \tl_to_str:n { macro: } ####2 -> ####3 \s__hook_mark
+ {
+ ####1 \def \kerneltmpDoNotUse ####2
+ {
+ \str_if_eq:nnT {#3} { before }
+ { \token_to_str:N \UseHook { cmd / #2 / #3 } }
+ ####3
+ \str_if_eq:nnT {#3} { after }
+ { \token_to_str:N \UseHook { cmd / #2 / #3 } }
+ }
+ }
+ \tl_set:Nx \exp_not:N \l__hook_tmpa_tl
+ { \exp_not:N \__hook_tmp:w \token_to_meaning:N #1 \s__hook_mark }
+ }
+ \tl_rescan:nV { #4 \__hook_patch_required_catcodes: } \l__hook_tmpa_tl
+ \cs_set_eq:NN #1 \kerneltmpDoNotUse
+ }
+\__kernel_msg_new:nnnn { hooks } { wrong-cmd-hook }
+ {
+ Command~hook~`cmd/#1/#2'~invalid.\\
+ The~hook~should~be~`cmd/#1/before'~or~`cmd/#1/after'.
+ }
+ {
+ You~tried~to~add~a~hook~to~command~\iow_char:N \\#1,~but~`#2'~
+ is~an~invalid~position.~Only~`before'~or~`after'~are~allowed.
+ }
+\__kernel_msg_new:nnnn { hooks } { cant-patch }
+ {
+ Command~`#1'~cannot~have~hooks~because~it~
+ \__hook_unpatchable_cases:n {#2} .
+ }
+ {
+ You~tried~to~add~a~hook~to~`#1',~but~LaTeX~was~not~able~to~
+ add~the~hook~to~that~command~because~`#1'~
+ \__hook_unpatchable_cases:n {#2} .
+ }
+\cs_new:Npn \__hook_unpatchable_cases:n #1
+ {
+ \str_case:nn {#1}
+ {
+ { undef } { doesn't~exist }
+ { macro } { is~not~a~macro }
+ { expl3 } { is~a~private~expl3~macro }
+ { retok } { can't~be~retokenized~cleanly }
+ }
+ }
+\ExplSyntaxOff
%%% From File: ltalloc.dtx
\chardef\@xxxii=32
\mathchardef\@Mi=10001
@@ -5276,6 +5738,131 @@ Type H <return> for immediate help.}%
\def\@setpar#1{\def\par{#1}\def\@par{#1}}
\def\@par{\let\par\@@par\par}
\def\@restorepar{\def\par{\@par}}
+%% File: ltpara.dtx (C) Copyright 2020-2021
+%%% From File: ltpara.dtx
+\def\ltparaversion{v1.0f}
+\def\ltparadate{2021/04/16}
+
+
+\ExplSyntaxOn
+\hook_new_pair:nn{para/before}{para/after}
+\hook_new_pair:nn{para/begin}{para/end}
+\let \@kernel@before@para@before \@empty
+\let \@kernel@before@para@begin \@empty
+\let \@kernel@after@para@end \@empty
+\let \@kernel@after@para@after \@empty
+\tl_new:N \g__para_standard_everypar_tl
+\tl_gset:Nn \g__para_standard_everypar_tl {
+ \box_gset_to_last:N \g_para_indent_box
+ \group_begin:
+ \tex_par:D
+ \group_end:
+ \tex_everypar:D { \__kernel_msg_error:nnnn {para}{mode}{before}{vertical} }
+ \@kernel@before@para@before
+ \hook_use:n {para/before}
+ \group_begin:
+ \tex_everypar:D {}
+ \skip_zero:N \tex_parskip:D
+ \tex_noindent:D
+ \group_end:
+ \tex_everypar:D{\g__para_standard_everypar_tl}
+ \@kernel@before@para@begin
+ \hook_use:n {para/begin}
+ \if_mode_horizontal: \else:
+ \__kernel_msg_error:nnnn {para}{mode}{begin}{vertical} \fi:
+ \__para_handle_indent:
+}
+\tex_everypar:D{\g__para_standard_everypar_tl}
+\newtoks \everypar
+
+\tl_gput_right:Nx \g__para_standard_everypar_tl {
+ \exp_not:N \the
+ \exp_not:N \toks
+ \the \allocationnumber
+ \c_space_tl
+}
+\box_new:N \g_para_indent_box
+
+\cs_new:Npn \__para_handle_indent: {
+ \box_use_drop:N \g_para_indent_box
+}
+\cs_new:Npn \para_omit_indent: {
+ \box_gclear:N \g_para_indent_box
+}
+\cs_set_eq:NN \IndentBox \g_para_indent_box
+\cs_set_eq:NN \OmitIndent \para_omit_indent:
+\cs_new_protected:Npn \para_end: {
+ \mode_if_horizontal:TF {
+ \mode_if_inner:F {
+ \tex_unskip:D
+ \hook_use:n{para/end}
+ \@kernel@after@para@end
+ \mode_if_horizontal:TF {
+ \if_int_compare:w 0 < \tex_lastnodetype:D
+ \tex_kern:D \c_zero_dim
+ \fi:
+ \tex_par:D
+ \hook_use:n{para/after}
+ \@kernel@after@para@after
+ }
+ { \__kernel_msg_error:nnnn {para}{mode}{end}{horizontal} }
+ }
+ }
+ \tex_par:D
+}
+\cs_new:Npn \para_raw_indent: {
+ \mode_if_vertical:TF
+ {
+ \tex_everypar:D {
+ \box_gset_to_last:N \g_para_indent_box
+ \tex_everypar:D { \g__para_standard_everypar_tl }
+ \__para_handle_indent:
+ \the\everypar }
+ }
+ { \__kernel_msg_error:nn {para}{raw} }
+ \tex_indent:D
+}
+\cs_new:Npn \para_raw_noindent: {
+ \mode_if_vertical:TF
+ {
+ \tex_everypar:D {
+ \tex_everypar:D { \g__para_standard_everypar_tl }
+ \the\everypar }
+ }
+ { \__kernel_msg_error:nn {para}{raw} }
+ \tex_noindent:D
+}
+\cs_new_eq:NN \para_raw_end: \tex_par:D
+\cs_set_eq:NN \RawIndent \para_raw_indent:
+\cs_set_eq:NN \RawNoindent \para_raw_noindent:
+\cs_set_eq:NN \RawParEnd \para_raw_end:
+\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
+\__kernel_msg_new:nnnn {para} {mode}
+ {
+ Illegal~mode~ change~ in~ hook~ 'para/#1'.\\
+ Hook~ code~ did~ not~ remain~ in~ #2~ mode.
+ }
+ {
+ Paragraph~ hooks~ cannot~ change~ the~ TeX~ mode~ without~ causing~
+ endless~ recursion.~ The~ hook~ code~ in~ 'para/#1'~ needs~ to~ stay~
+ in~ #2~ mode,~ but~ it~ didn't.~ Examine~ the~ hook~
+ code~ with~ \ShowHook~ to~ find~ the~ issue.
+ }
+\__kernel_msg_new:nnnn {para} {raw}
+ {
+ Paragraph started while not in vertical mode.
+ }
+ {
+ Starting a paragraph with \RawIndent or \RawNoindent
+ (or \para_raw_indent: or \para_raw_noindent:) is only
+ allowed if LaTeX is in vertical mode.
+ }
+
+\ExplSyntaxOff
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% From File: ltspace.dtx
\message{spacing,}
\DeclareRobustCommand\pagebreak{\@testopt{\@no@pgbk-}4}
@@ -5523,8 +6110,6 @@ Type H <return> for immediate help.}%
\LaTeX\kern.15em2$_{\textstyle\varepsilon}$}}
%%% From File: ltfiles.dtx
\message{files,}
-\newread\@inputcheck
-\newwrite\@unused
\newwrite\@mainaux
\newwrite\@partaux
\newif\if@filesw \@fileswtrue
@@ -5597,8 +6182,6 @@ Type H <return> for immediate help.}%
\let\expandafter\noexpand\csname
__hook env/document/begin\endcsname
\noexpand\@empty}
-\let \@kernel@before@begindocument \@empty
-\let \@kernel@after@begindocument \@empty
\@onlypreamble\document
\let\normalsfcodes\@empty
@@ -5726,16 +6309,18 @@ Type H <return> for immediate help.}%
\openin\@inputcheck"#1" %
\ifeof\@inputcheck
\ifx\input@path\@undefined
- \def\reserved@a{#3}%
+ \let\reserved@a\@secondoftwo
\else
- \def\reserved@a{\@iffileonpath{#1}{#2}{#3}}%
+ \def\reserved@a{\@iffileonpath{#1}}%
\fi
\else
\closein\@inputcheck
\edef\@filef@und{"#1" }%
- \def\reserved@a{#2}%
+ \let\reserved@a\@firstoftwo
\fi
- \reserved@a}
+ \expandafter\def\expandafter\reserved@a
+ \expandafter{\reserved@a{#2}{#3}}%
+\reserved@a}
\long\def\@iffileonpath#1{%
\let\reserved@a\@secondoftwo
\expandafter\@tfor\expandafter\reserved@b\expandafter
@@ -6458,7 +7043,9 @@ Type H <return> for immediate help.}%
\DeclareRobustCommand\usefont[4]{\fontencoding{#1}%
\edef\f@family{#2}%
\set@target@series{#3}%
- \edef\f@shape{#4}\selectfont
+ \edef\f@shape{#4}%
+ \let\delayed@f@adjustment\@empty
+ \selectfont
\ignorespaces}
\DeclareRobustCommand\linespread[1]
{\set@fontsize{#1}\f@size\f@baselineskip}
@@ -7402,6 +7989,7 @@ Type H <return> for immediate help.}%
\fi
\let\delayed@f@adjustment\@empty
\fi
+ \@forced@seriesfalse
\xdef\font@name{%
\csname\curr@fontshape/\f@size\endcsname}%
\pickup@font
@@ -8832,6 +9420,7 @@ Type H <return> for immediate help.}%
\edef\f@family{\familydefault}%
\edef\f@series{\seriesdefault}%
\edef\f@shape{\shapedefault}%
+ \let\delayed@f@adjustment\@empty
\UseHook{normalfont}%
\@defaultfamilyhook % hookname from 2020/02 will vanish
\selectfont}
@@ -9063,7 +9652,6 @@ Type H <return> for immediate help.}%
\egroup
}
\def\textcompsubstdefault{\rmsubstdefault}
-
\def\DeclareEncodingSubset#1#2{%
\DeclareEncodingSubset@aux{#1}#2*\DeclareEncodingSubset@aux
}
@@ -10181,7 +10769,7 @@ Type H <return> for immediate help.}%
}
\let\@eqnsel=\relax
\def\nonumber{\global\@eqnswfalse}
-\def\@eqncr{%
+\protected\def\@eqncr{%
{\ifnum0=`}\fi
\@ifstar{%
\global\@eqpen\@M\@yeqncr
@@ -10203,7 +10791,7 @@ Type H <return> for immediate help.}%
\reserved@a \if@eqnsw\@eqnnum\stepcounter{equation}\fi
\global\@eqnswtrue\global\@eqcnt\z@\cr}
\let\@seqncr=\@eqncr
-\@namedef{eqnarray*}{\def\@eqncr{\nonumber\@seqncr}\eqnarray}
+\@namedef{eqnarray*}{\protected\def\@eqncr{\nonumber\@seqncr}\eqnarray}
\@namedef{endeqnarray*}{\nonumber\endeqnarray}
\def\lefteqn#1{\rlap{$\displaystyle #1$}}
\DeclareRobustCommand{\ensuremath}{%
@@ -10812,7 +11400,7 @@ Type H <return> for immediate help.}%
\def\@addfield{\global\setbox\@curline\hbox{\unhbox
\@curline\unhbox\@curfield}}
\def\@ifatmargin{\ifdim \wd\@curline =\z@}
-\def\@tabcr{\@stopline \@ifstar{\penalty \@M \@xtabcr}\@xtabcr}
+\protected\def\@tabcr{\@stopline \@ifstar{\penalty \@M \@xtabcr}\@xtabcr}
\def\@xtabcr{\@ifnextchar[\@itabcr{\@startline\ignorespaces}}
\def\@itabcr[#1]{\@vspace@calcify{#1}\@startline\ignorespaces}
\def\tabbing{\lineskip \z@skip\let\>\@rtab\let\<\@ltab\let\=\@settab
@@ -10930,14 +11518,14 @@ Type H <return> for immediate help.}%
\lineskip\z@skip\baselineskip\z@skip
\ifhmode \@preamerr\z@ \@@par\fi
\@preamble}
-\def\@arraycr{%
+\protected\def\@arraycr{%
${\ifnum0=`}\fi\@ifstar\@xarraycr\@xarraycr}
\def\@xarraycr{\@ifnextchar[\@argarraycr{\ifnum0=`{\fi}${}\cr}}
\def\@argarraycr[#1]{%
\ifnum0=`{\fi}${}\ifdim #1>\z@ \@xargarraycr{#1}\else
\@yargarraycr{#1}\fi}
\let\tabularnewline\relax
-\def\@tabularcr{%
+\protected\def\@tabularcr{%
{\ifnum0=`}\fi\@ifstar\@xtabularcr\@xtabularcr}
\def\@xtabularcr{\@ifnextchar[\@argtabularcr{\ifnum0=`{\fi}\cr}}
\def\@argtabularcr[#1]{%
@@ -11171,7 +11759,7 @@ Type H <return> for immediate help.}%
\let\\\@stackcr
\@ishortstack}
\def\@ishortstack#1{\ialign{\mb@l {##}\unskip\mb@r\cr #1\crcr}\egroup}
-\def\@stackcr{\@ifstar\@ixstackcr\@ixstackcr}
+\protected\def\@stackcr{\@ifstar\@ixstackcr\@ixstackcr}
\def\@ixstackcr{\@ifnextchar[\@istackcr{\cr\ignorespaces}}
\def\@istackcr[#1]{\cr\noalign{\@vspace@calcify{#1}}\ignorespaces}
\newif\if@negarg
@@ -12046,12 +12634,6 @@ Type H <return> for immediate help.}%
\endgroup
\@footnotemark
}
-%%<latexrelease>\IncludeInRelease{0000/00/00}%
-%%<latexrelease> {\footref}{Add footref}%
-%%<latexrelease>
-%%<latexrelease>\let\footref\@undefined
-%%<latexrelease>
-%%<latexrelease>\EndIncludeInRelease
%%% From File: ltidxglo.dtx
\message{index,}
\def\makeindex{%
@@ -12409,14 +12991,15 @@ Type H <return> for immediate help.}%
\@onlypreamble\@process@ptions
\def\@xprocess@ptions{%
\ifx\@currext\@clsextension\else
+ \ifx\@classoptionslist\relax\else
\@for\CurrentOption:=\@classoptionslist\do{%
\ifx\CurrentOption\@empty\else
- \@expandtwoargs\in@{,\CurrentOption,}{,\@declaredoptions,}%
- \ifin@
+ \@ifundefined{ds@\CurrentOption}{}{%
\@use@ption
\expandafter\let\csname ds@\CurrentOption\endcsname\@empty
- \fi
+ }%
\fi}%
+ \fi
\fi
\@process@pti@ns}
\@onlypreamble\@xprocess@ptions
@@ -12798,14 +13381,12 @@ Type H <return> for immediate help.}%
\let\write\@gobbletwo%
\let\closeout\@gobble%
\else%
- \edef\reserved@a{#1}%
- \edef\reserved@a{\detokenize\expandafter{\reserved@a}}%
\edef\reserved@b{\detokenize\expandafter{\jobname}}%
- \ifx\reserved@a\reserved@b%
+ \ifx\@curr@file\reserved@b%
\@fileswtrue%
\else%
\edef\reserved@b{\reserved@b\detokenize{.tex}}%
- \ifx\reserved@a\reserved@b
+ \ifx\@curr@file\reserved@b
\@fileswtrue%
\fi%
\fi%
@@ -13077,8 +13658,8 @@ Type H <return> for immediate help.}%
\fi
}
%%% From File: ltfilehook.dtx
-\providecommand\ltfilehookversion{v1.0g}
-\providecommand\ltfilehookdate{2021/02/08}
+\providecommand\ltfilehookversion{v1.0j}
+\providecommand\ltfilehookdate{2021/04/29}
\ExplSyntaxOn
\tl_new:N \CurrentFile
\tl_new:N \CurrentFilePath
@@ -13116,7 +13697,8 @@ Type H <return> for immediate help.}%
\cs_new:Npn \__filehook_drop_extension_aux:nnn #1 #2 #3
{ \tl_if_empty:nF {#1} { #1 / } #2 }
\tl_new:N \l__filehook_internal_tl
-\seq_new:N \g__filehook_input_file_seq
+\seq_if_exist:NF \g__filehook_input_file_seq
+ { \seq_new:N \g__filehook_input_file_seq }
\cs_new_protected:Npn \__filehook_file_push:
{
\seq_gpush:Nx \g__filehook_input_file_seq
@@ -13130,7 +13712,7 @@ Type H <return> for immediate help.}%
\seq_gpop:NNTF \g__filehook_input_file_seq \l__filehook_internal_tl
{ \exp_after:wN \__filehook_file_pop_assign:nnnn \l__filehook_internal_tl }
{
- \msg_error:nnn { hooks } { should-not-happen }
+ \__kernel_msg_error:nnn { hooks } { should-not-happen }
{ Tried~to~pop~from~an~empty~file~name~stack. }
}
}
@@ -13218,6 +13800,7 @@ Type H <return> for immediate help.}%
\begingroup
\escapechar\m@ne
\let\protect\string
+ \edef~{\string~}%
\expandafter\def\csname\expandafter\endcsname
\expandafter{\csname\endcsname}%
\@expl@@@filehook@if@no@extension@@nTF{#1}%
@@ -13340,7 +13923,7 @@ Type H <return> for immediate help.}%
\cs_new_eq:NN \@expl@@@filehook@drop@extension@@N
\__filehook_drop_extension:N
\cs_new_eq:NN \@expl@@@filehook@file@push@@
- \__filehook_file_push:
+ \__filehook_file_push:
\cs_new_eq:NN \@expl@@@filehook@file@pop@@
\__filehook_file_pop:
\cs_new_eq:NN \@expl@@@filehook@file@pop@assign@@nnnn
@@ -13354,7 +13937,7 @@ Type H <return> for immediate help.}%
%%
%%% From File: ltshipout.dtx
\providecommand\ltshipoutversion{v1.0i}
-\providecommand\ltshipoutdate{2021/01/25}
+\providecommand\ltshipoutdate{2021/03/17}
\ExplSyntaxOn
\bool_new:N \g__shipout_debug_bool
\cs_new_eq:NN \__shipout_debug:n \use_none:n
@@ -14865,6 +15448,33 @@ Type H <return> for immediate help.}%
\countdef\xe@alloc@intercharclass=257
\xe@alloc@intercharclass=\z@
\fi
+\ifx\directlua\@undefined
+\else
+ \expanded{%
+ \everyjob{\the\everyjob
+ \noexpand%\directlua
+ \directlua{%
+ local function trace_stack_levels (input_ptr)
+ local tracingstacklevels = tex.count.tracingstacklevels
+ if tex.tracingmacros > 0 or input_ptr < tracingstacklevels then
+ if tracingstacklevels > 0 then
+ if input_ptr < tracingstacklevels then
+ return "\string\n\string~" .. string.rep(".",input_ptr)
+ else
+ return "\string~\string~"
+ end
+ else
+ return "\string\n"
+ end
+ else
+ return ""
+ end
+ end
+ luatexbase.add_to_callback('input_level_string',
+ trace_stack_levels,'tracingstacklevels')
+ }%
+ }}%
+\fi
\unitlength = 1pt
\fboxsep = 3pt
\fboxrule = .4pt
@@ -15175,7 +15785,6 @@ Type H <return> for immediate help.}%
\let\@filelist\@gobble
\def\@addtofilelist#1{\xdef\@filelist{\@filelist,#1}}%
\@input{latex2e-first-aid-for-external-files.ltx}
-\@input{ltpara.ltx}
\makeatother
\errorstopmode
\dump