diff options
author | Karl Berry <karl@freefriends.org> | 2021-05-04 22:31:00 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2021-05-04 22:31:00 +0000 |
commit | 79249345968fdf93852a9d6288e11ed512f00847 (patch) | |
tree | cedebc871343326014bcad24d68e3bb84ad99093 /Master/texmf-dist/tex/latex-dev/base/latex.ltx | |
parent | 89ad34326c4bcdee034f82558a4be360d599e6d9 (diff) |
latex-dev (5may21)
git-svn-id: svn://tug.org/texlive/trunk@59080 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex-dev/base/latex.ltx')
-rw-r--r-- | Master/texmf-dist/tex/latex-dev/base/latex.ltx | 935 |
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 |