diff options
Diffstat (limited to 'Master/texmf-dist/tex/latex/base/latex.ltx')
-rw-r--r-- | Master/texmf-dist/tex/latex/base/latex.ltx | 1204 |
1 files changed, 935 insertions, 269 deletions
diff --git a/Master/texmf-dist/tex/latex/base/latex.ltx b/Master/texmf-dist/tex/latex/base/latex.ltx index daf5ff1c8ef..d8c3df4c6d7 100644 --- a/Master/texmf-dist/tex/latex/base/latex.ltx +++ b/Master/texmf-dist/tex/latex/base/latex.ltx @@ -61,7 +61,7 @@ %% (but please observe conditions on bug reports sent to that address!) %% %% -%% Copyright (C) 1993-2022 +%% Copyright (C) 1993-2023 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -432,6 +432,7 @@ \def\extrafloats#1{% \ifnum#1>\z@ \count@\numexpr\float@count-1\relax + \ifnum\count@<266 \ch@ck0\m@ne\insert\fi \ch@ck0\count@\count \ch@ck1\count@\dimen \ch@ck2\count@\skip @@ -440,8 +441,7 @@ \global\expandafter\e@alloc@chardef \csname bx@\the\float@count\endcsname\float@count \@cons\@freelist{\csname bx@\the\float@count\endcsname}% -\expandafter -\extrafloats\expandafter{\numexpr#1-1\relax}% +\expandafter\extrafloats\expandafter{\the\numexpr#1-1\expandafter}% \fi}% \fi \def\alloc@#1#2#3#4{\e@alloc#2#3{\count1#1}#4\float@count} @@ -705,8 +705,8 @@ %%% From File: ltvers.dtx \def\fmtname{LaTeX2e} \edef\fmtversion - {2022-11-01} -\def\patch@level{1} + {2023-06-01} +\def\patch@level{0} \edef\development@branch@name{} \iffalse \def\reserved@a#1/#2/#3\@nil{% @@ -732,19 +732,22 @@ \fi \let\reserved@a\relax \fi +\newtoks\LaTeXReleaseInfo +\everyjob\expandafter{\the\everyjob\the\LaTeXReleaseInfo} +\let\show@release@info\typeout \ifnum0\ifnum\patch@level=0 \ifx\development@branch@name\@empty 1\fi\fi>0 % - \everyjob\expandafter{\the\everyjob - \typeout{\fmtname\space <\fmtversion>}} + \LaTeXReleaseInfo\expandafter{\the\LaTeXReleaseInfo + \show@release@info{\fmtname\space <\fmtversion>}} \immediate \write16{\fmtname \space<\fmtversion>} \else\ifnum\patch@level>0 - \everyjob\expandafter{\the\everyjob - \typeout{\fmtname\space <\fmtversion> patch level \patch@level}} + \LaTeXReleaseInfo\expandafter{\the\LaTeXReleaseInfo + \show@release@info{\fmtname\space <\fmtversion> patch level \patch@level}} \immediate \write16{\fmtname\space <\fmtversion> patch level \patch@level} \else - \everyjob\expandafter{\the\everyjob - \typeout{\fmtname\space <\fmtversion> + \LaTeXReleaseInfo\expandafter{\the\LaTeXReleaseInfo + \show@release@info{\fmtname\space <\fmtversion> pre-release-\number-\patch@level\space \ifx\development@branch@name\@undefined \else \ifx\development@branch@name\@empty \else @@ -1519,13 +1522,35 @@ \long\def\declare@commandcopy#1#2#3#4{% \edef\reserved@a{\@expl@cs@to@str@@N#3}% \@ifundefined\reserved@a{#1}{#2}% - {\robust@command@act - \@declarecommandcopylisthook#4% - \declare@commandcopy@let{#3#4}}} + {\declare@commandcopy@do{#3}{#4}}} +\long\def\declare@commandcopy@do#1#2{% + \robust@command@act + \@declarecommandcopylisthook#2% + \declare@commandcopy@let{#1#2}} \def\@declarecommandcopylisthook{% {\@if@DeclareRobustCommand \@copy@DeclareRobustCommand}% {\@if@newcommand \@copy@newcommand}} \long\def\declare@commandcopy@let#1#2{\let#1=#2\relax} +\def\NewEnvironmentCopy{% + \declare@environmentcopy + {\@firstofone}% + {\@firstoftwo\@notdefinable}} +\def\RenewEnvironmentCopy{% + \declare@environmentcopy + {\@latex@error{Environment \reserved@a\space undefined}\@ehc + \@firstofone}% + {\@firstofone}} +\def\DeclareEnvironmentCopy{% + \declare@environmentcopy + {\@firstofone}% + {\@firstofone}} +\long\def\declare@environmentcopy#1#2#3#4{% + \edef\reserved@a{\@ifundefined{#3}{end#3}{#3}}% + \@ifundefined\reserved@a + {\def\reserved@a{#3}#1}% + {\def\reserved@a{#3}#2}% + {\ExpandArgs{cc}\declare@commandcopy@do{#3}{#4}% + \ExpandArgs{cc}\declare@commandcopy@do{end#3}{end#4}}} \long\def\ShowCommand#1{% \robust@command@act \@showcommandlisthook#1% @@ -1585,9 +1610,10 @@ \robust@command@chk@safe#1% {\@if@newcommand#1% {\@show@newcommand}% - {\show}}% - {\show}% + {\@show@macro}}% + {\@show@macro}% #1} +\let\@show@macro\show \long\def\@if@newcommand#1{% \edef\reserved@a{% \noexpand\@protected@testopt @@ -1615,13 +1641,59 @@ \typeout{->\@expl@cs@replacement@spec@@N#1.^^J}% \expandafter\@show@newcommand@aux \csname\@backslashchar\@expl@cs@to@str@@N#1\expandafter\endcsname - \expandafter{#1}} -\long\def\@show@newcommand@aux#1#2{% + \expandafter{#1}\@show@tokens} +\long\def\@show@newcommand@aux#1#2#3{% \typeout{> \string#1=\@expl@cs@prefix@spec@@N#1macro:}% - \edef\reserved@a{% - default \string##1=\expandafter\detokenize\@gobblethree#2.^^J% - \@expl@cs@argument@spec@@N#1->\@expl@cs@replacement@spec@@N#1}% - \showtokens\expandafter\expandafter\expandafter{\expandafter\reserved@a}} + #3{default \string##1=\expandafter\detokenize\@gobblethree#2.^^J% + \@expl@cs@argument@spec@@N#1->\@expl@cs@replacement@spec@@N#1}} +\long\def\@show@tokens#1{% + \edef\reserved@a{#1}% + \showtokens\expandafter + \expandafter\expandafter{\expandafter\reserved@a}} +\def\ShowEnvironment#1{% + \expandafter\@show@environment\csname #1\endcsname} +\long\def\@show@environment#1{% + \robust@command@act + \@showenvironmentlisthook#1% + \@show@normalenv#1} +\def\@showenvironmentlisthook{% + {\@if@DeclareRobustCommand \@show@DeclareRobustCommand@env}% + {\@if@newcommand \@show@newcommand@env}} +\long\def\@show@newcommand@env#1{% + \@show@environment@begin#1% + \expandafter\@show@newcommand@aux + \csname\@backslashchar\@expl@cs@to@str@@N#1\expandafter\endcsname + \expandafter{#1}\@show@typeout + \@show@environment@end#1} +\long\def\@show@DeclareRobustCommand@env#1{% + \@show@environment@begin#1% + \begingroup + \let\@show@tokens\@show@typeout + \let\@show@macro\@show@nonstop + \expandafter\show@kernel@robust@command + \csname\@expl@cs@to@str@@N#1 \endcsname + \endgroup + \@show@environment@end#1} +\long\def\@show@environment@begin#1{% + \typeout{> \string\begin{\@expl@cs@to@str@@N#1}=environment:}% + \typeout{\@expl@cs@argument@spec@@N#1->% + \@expl@cs@replacement@spec@@N#1.^^J}} +\long\def\@show@normalenv#1{% + \@show@environment@begin#1% + \@show@environment@end#1} +\long\def\@show@environment@end#1{% + \expandafter\@show@environment@end@aux + \csname end\@expl@cs@to@str@@N#1\endcsname#1} +\long\def\@show@environment@end@aux#1#2{% + \@show@tokens{\string\end{\@expl@cs@to@str@@N#2}% + \ifx\relax#1=undefined% + \else:^^J\@expl@cs@argument@spec@@N#1->% + \@expl@cs@replacement@spec@@N#1% + \fi}} +\def\@show@nonstop#1{% + \typeout{> \string#1=\@expl@cs@prefix@spec@@N#1macro:^^J% + \@expl@cs@argument@spec@@N#1->\@expl@cs@replacement@spec@@N#1.}} +\def\@show@typeout#1{\typeout{> #1.^^J}} \def\@ifundefined#1{% \ifcsname#1\endcsname\@ifundefin@d@i\else\@ifundefin@d@ii\fi{#1}} \long\def\@ifundefin@d@i#1\fi#2{\fi @@ -1731,8 +1803,8 @@ \xdef#1{\the\toks@}% \endgroup} %%% From File: ltcmd.dtx -\def\ltcmdversion{v1.1a} -\def\ltcmddate{2022-08-16} +\def\ltcmdversion{v1.1e} +\def\ltcmddate{2023-05-26} \message{document commands,} \ExplSyntaxOn \tl_new:N \l__cmd_arg_spec_tl @@ -2014,10 +2086,10 @@ \int_zero:N \l__cmd_current_arg_int \__cmd_tl_mapthread_function:NNN \l__cmd_args_tl \l__cmd_defaults_tl \__cmd_defaults_def:nn - \cs_generate_from_arg_count:NNVo \__cmd_tmp:w \cs_set:Npn + \cs_generate_from_arg_count:NNno \__cmd_tmp:w \cs_set:Npn \l__cmd_current_arg_int \l__cmd_tmpa_tl } -\cs_generate_variant:Nn \cs_generate_from_arg_count:NNnn { NNVo } +\cs_generate_variant:Nn \cs_generate_from_arg_count:NNnn { NNno } \cs_new_protected:Npn \__cmd_defaults_def:nn { \int_incr:N \l__cmd_current_arg_int @@ -2801,7 +2873,9 @@ \__cmd_set_eq_if_exist:cc { #1 ~ \c_space_tl } { #2 ~ \c_space_tl } \__cmd_set_eq_if_exist:cc { #1 ~ defaults } { #2 ~ defaults } \exp_after:wN \__cmd_copy_expandable_signature:NnNNNNnnn #4 {#1} {#2} - \cs_set_nopar:Npx #3 + \token_if_protected_macro:NTF #4 + { \cs_set_protected_nopar:Npx }{ \cs_set_nopar:Npx } + #3 { \exp_after:wN \__cmd_copy_expandable:NnNNNNnnn #4 {#1} {#2} } } \cs_new:Npn \__cmd_copy_expandable:NnNNNNnnn #1 #2 #3 #4 #5 #6 #7 #8 #9 @@ -2938,19 +3012,26 @@ \cs_new_protected:Npn \__cmd_show_command:N #1 { \exp_after:wN \__cmd_show_command:NnNNwN #1 \q__cmd #1 } \cs_new_protected:Npn \__cmd_show_command:NnNNwN #1 #2 #3 #4 #5 \q__cmd #6 - { \__cmd_show_command_aux:nNNn { document~command } #6 #4 {#2} } + { + \__cmd_show_command_aux:NnNNn \tl_show:x + { document~command } #6 #4 {#2} + } \cs_new_protected:Npn \__cmd_show_expandable:N #1 { \exp_after:wN \__cmd_show_expandable:NnNNNNnN #1 #1 } \cs_new_protected:Npn \__cmd_show_expandable:NnNNNNnN #1 #2 #3 #4 #5 #6 #7 #8 - { \__cmd_show_command_aux:nNNn { expandable~document~command } #8 #5 {#2} } -\cs_new_protected:Npn \__cmd_show_command_aux:nNNn #1 #2 #3 #4 { - \__cmd_split_signature:n {#4} - \tl_show:x + \exp_args:NNe \__cmd_show_command_aux:NnNNn \tl_show:x + { \token_if_protected_macro:NF #8 { expandable~ } document~command } + #8 #5 {#2} + } +\cs_new_protected:Npn \__cmd_show_command_aux:NnNNn #1 #2 #3 #4 #5 + { + \__cmd_split_signature:n {#5} + #1 { - \token_to_str:N #2 = #1: \iow_newline: + \token_to_str:N #3 = #2: \iow_newline: \tl_use:N \l__cmd_tmpa_tl - -> \cs_replacement_spec:N #3 + -> \cs_replacement_spec:N #4 } } \cs_new_protected:Npn \__cmd_show_environment:N #1 @@ -2967,12 +3048,14 @@ { \use:x { - \__cmd_show_command_aux:nNNn { document~environment } + \__cmd_show_command_aux:NnNNn \__cmd_show:x { document~environment } { \exp_not:N \begin {#3} } \exp_not:c { environment~ #3 ~ code } {#2} } } +\cs_new_protected:Npn \__cmd_show:x #1 + { \iow_term:x { > ~ #1 . \iow_newline: } } \cs_new_protected:Npn \__cmd_show_environment_end:N #1 { \exp_args:NNx \__cmd_check_end:Nn \l__cmd_tmpa_tl { \cs_to_str:N #1 } @@ -2980,6 +3063,8 @@ } \tl_gput_right:Nn \@showcommandlisthook { { \__kernel_cmd_if_xparse:NTF \__cmd_show:N } } +\tl_gput_right:Nn \@showenvironmentlisthook + { { \__kernel_cmd_if_xparse:NTF \__cmd_show:N } } \cs_new_protected:Npn \__cmd_split_signature:n #1 { \int_set:Nn \l__cmd_current_arg_int { 1 } @@ -3390,6 +3475,7 @@ \tl_set:Nn \l__cmd_signature_tl {#1} \group_begin: \tex_escapechar:D = 92 \scan_stop: + \tex_endlinechar:D = `\^^M \scan_stop: \tl_clear:N \l__cmd_v_arg_tl \peek_remove_spaces:n { @@ -3407,8 +3493,8 @@ } \cs_new_protected:Npn \__cmd_grab_v_group_end: { - \exp_args:NNNo - \group_end: + \exp_args:NNNo + \group_end: \tl_set:Nn \l__cmd_v_arg_tl { \l__cmd_v_arg_tl } } \cs_new_protected:Npn \__cmd_grab_v_aux_test:N #1 @@ -3486,7 +3572,6 @@ { \cs_set_eq:NN \do \char_set_catcode_other:N \dospecials - \tex_endlinechar:D = `\^^M \scan_stop: \bool_if:NTF \l__cmd_long_bool { \char_set_catcode_other:n { \tex_endlinechar:D } } { \char_set_catcode_parameter:n { \tex_endlinechar:D } } @@ -4535,8 +4620,8 @@ \ExplSyntaxOff %%% From File: lthooks.dtx -\def\lthooksversion{v1.0v} -\def\lthooksdate{2022/06/15} +\def\lthooksversion{v1.1e} +\def\lthooksdate{2023/06/06} \ExplSyntaxOn \bool_new:N \g__hook_debug_bool \cs_new_eq:NN \__hook_debug:n \use_none:n @@ -4567,61 +4652,77 @@ \tl_new:N \g__hook_hook_curr_name_tl \seq_new:N \g__hook_name_stack_seq \cs_new_eq:NN \__hook_tmp:w ? +\tl_const:Nn \c__hook_empty_tl { } +\tl_const:Nn \c__hook_nine_parameters_tl { #1#2#3#4#5#6#7#8#9 } \cs_generate_variant:Nn \tl_gremove_once:Nn { Nx } \cs_generate_variant:Nn \tl_show:n { x } \cs_generate_variant:Nn \tl_log:n { x } +\cs_generate_variant:Nn \tl_set:Nn { Ne } +\cs_generate_variant:Nn \cs_replacement_spec:N { c } +\cs_generate_variant:Nn \prop_put:Nnn { Nne } +\cs_generate_variant:Nn \str_count:n { e } \scan_new:N \s__hook_mark -\cs_new:Npn \__hook_clean_to_scan:w #1 \s__hook_mark { } -\cs_new_protected:Npn \__hook_tl_set:Nn #1#2 - { \cs_set_nopar:Npx #1 { \__kernel_exp_not:w {#2} } } -\cs_new_protected:Npn \__hook_tl_set:Nx #1#2 - { \cs_set_nopar:Npx #1 {#2} } -\cs_generate_variant:Nn \__hook_tl_set:Nn { c } -\cs_generate_variant:Nn \__hook_tl_set:Nx { c } +\cs_new:Npn \__hook_use_none_delimit_by_s_mark:w #1 \s__hook_mark { } +\cs_new:Npn \__hook_use_i_delimit_by_s_mark:nw #1 #2 \s__hook_mark {#1} +\cs_new_protected:Npn \__hook_tl_set:cn #1#2 + { \cs_set_nopar:cpx {#1} { \__kernel_exp_not:w {#2} } } \cs_new_protected:Npn \__hook_tl_gset:Nn #1#2 { \cs_gset_nopar:Npx #1 { \__kernel_exp_not:w {#2} } } -\cs_new_protected:Npn \__hook_tl_gset:No #1#2 - { \cs_gset_nopar:Npx #1 { \__kernel_exp_not:w \exp_after:wN {#2} } } \cs_new_protected:Npn \__hook_tl_gset:Nx #1#2 { \cs_gset_nopar:Npx #1 {#2} } -\cs_generate_variant:Nn \__hook_tl_gset:Nn { c } -\cs_generate_variant:Nn \__hook_tl_gset:No { c } +\cs_generate_variant:Nn \__hook_tl_gset:Nn { c, co } \cs_generate_variant:Nn \__hook_tl_gset:Nx { c } \cs_new_protected:Npn \__hook_tl_gput_right:Nn #1#2 { \__hook_tl_gset:Nx #1 { \__kernel_exp_not:w \exp_after:wN { #1 #2 } } } -\cs_generate_variant:Nn \__hook_tl_gput_right:Nn { No, cn } +\cs_generate_variant:Nn \__hook_tl_gput_right:Nn { Ne, cn } \cs_new_protected:Npn \__hook_tl_gput_left:Nn #1#2 { \__hook_tl_gset:Nx #1 { \__kernel_exp_not:w {#2} \__kernel_exp_not:w \exp_after:wN {#1} } } -\cs_generate_variant:Nn \__hook_tl_gput_left:Nn { No } \cs_new_eq:NN \__hook_tl_gset_eq:NN \tl_gset_eq:NN \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_normalize_hook_args:Nn \__hook_new:nn {#1} { 0 } } +\cs_new_protected:Npn \hook_new_with_args:nn #1 #2 + { \__hook_normalize_hook_args:Nn \__hook_new:nn {#1} {#2} } +\cs_new_protected:Npn \__hook_new:nn #1 #2 { \__hook_if_declared:nTF {#1} { \msg_error:nnn { hooks } { exists } {#1} } { \tl_new:c { g__hook_#1_declared_tl } - \__hook_make_usable:n {#1} + \cs_undefine:c { __hook~#1 } + \cs_undefine:c { c__hook_#1_parameter_tl } + \__hook_make_usable:nn {#1} {#2} + \__hook_update_hook_code:n {#1} } } -\cs_new_protected:Npn \__hook_make_usable:n #1 +\cs_new_protected:Npn \__hook_make_usable:nn #1 #2 { - \tl_if_exist:cF { __hook~#1 } + \__hook_if_usable:nF {#1} { \seq_gput_right:Nn \g__hook_all_seq {#1} - \tl_new:c { __hook~#1 } + \__kernel_cs_parm_from_arg_count:nnF + { \tl_const:cn { c__hook_#1_parameter_tl } } {#2} + { + \msg_error:nnnn { hooks } { too-many-args } {#1} {#2} + \tl_const:cx { c__hook_#1_parameter_tl } + { \exp_not:V \c__hook_nine_parameters_tl } + } + \__hook_normalise_cs_args:nn { _toplevel } {#1} + \__hook_normalise_cs_args:nn { _next } {#1} + \__hook_code_gset:nn {#1} { } \__hook_init_structure:n {#1} - \clist_new:c { g__hook_#1_labels_clist } - \tl_new:c { g__hook_#1_reversed_tl } + \__hook_normalise_code_pool:n {#1} + \clist_if_exist:cF { g__hook_#1_labels_clist } + { + \clist_new:c { g__hook_#1_labels_clist } + \tl_new:c { g__hook_#1_reversed_tl } + } \__hook_include_legacy_code_chunk:n {#1} } } @@ -4630,27 +4731,53 @@ \__hook_if_structure_exist:nF {#1} { \prop_new:c { g__hook_#1_code_prop } - \tl_new:c { __hook_toplevel~#1 } - \tl_new:c { __hook_next~#1 } + \__hook_toplevel_gset:nn {#1} { } + \__hook_next_gset:nn {#1} { } } } \cs_new_protected:Npn \hook_new_reversed:n #1 - { \__hook_normalize_hook_args:Nn \__hook_new_reversed:n {#1} } -\cs_new_protected:Npn \__hook_new_reversed:n #1 + { \__hook_normalize_hook_args:Nn \__hook_new_reversed:nn {#1} { 0 } } +\cs_new_protected:Npn \hook_new_reversed_with_args:nn #1 #2 + { \__hook_normalize_hook_args:Nn \__hook_new_reversed:nn {#1} {#2} } +\cs_new_protected:Npn \__hook_new_reversed:nn #1 #2 { - \__hook_new:n {#1} - \tl_gset:cn { g__hook_#1_reversed_tl } { - } + \__hook_if_declared:nTF {#1} + { \msg_error:nnn { hooks } { exists } {#1} } + { + \__hook_new:nn {#1} {#2} + \tl_gset:cn { g__hook_#1_reversed_tl } { - } + } } \cs_new_protected:Npn \hook_new_pair:nn #1#2 - { \hook_new:n {#1} \hook_new_reversed:n {#2} } + { \__hook_normalize_hook_args:Nnn \__hook_new_pair:nnn {#1} {#2} { 0 } } +\cs_new_protected:Npn \hook_new_pair_with_args:nnn #1#2#3 + { \__hook_normalize_hook_args:Nnn \__hook_new_pair:nnn {#1} {#2} {#3} } +\cs_new_protected:Npn \__hook_new_pair:nnn #1 #2 #3 + { + \__hook_if_declared:nTF {#1} + { \msg_error:nnn { hooks } { exists } {#1} } + { + \__hook_if_declared:nTF {#2} + { \msg_error:nnn { hooks } { exists } {#2} } + { + \__hook_new:nn {#1} {#3} + \__hook_new_reversed:nn {#2} {#3} + } + } + } \cs_new_protected:Npn \__hook_include_legacy_code_chunk:n #1 { \tl_if_exist:cT { @#1hook } { \tl_if_empty:cF { @#1hook } { - \exp_args:Nnnv \__hook_hook_gput_code_do:nnn {#1} - { legacy } { @#1hook } + \__hook_replacing_args_false: + \use:e + { + \__hook_hook_gput_code_do:nnn {#1} { legacy } + { \exp_not:v { @#1hook } } + } + \__hook_replacing_args_reset: \__hook_tl_gclear:c { @#1hook } } } @@ -4666,7 +4793,7 @@ { \bool_lazy_and:nnTF { \tl_if_exist_p:c { g__hook_#1_declared_tl } } - { ! \tl_if_exist_p:c { __hook~#1 } } + { ! \cs_if_exist_p:c { __hook~#1 } } { \prg_return_true: } { \prg_return_false: } } @@ -4680,7 +4807,7 @@ \__hook_if_declared:nF {#1} { \tl_new:c { g__hook_#1_declared_tl } - \__hook_make_usable:n {#1} + \__hook_make_usable:nn {#1} { 0 } \tl_gset:cx { g__hook_#1_reversed_tl } { \__hook_if_generic_reversed:nT {#1} { - } } \__hook_update_hook_code:n {#1} @@ -4827,23 +4954,45 @@ } { \tl_gset:Nn \g__hook_hook_curr_name_tl {#1} } } -\cs_new_protected:Npn \hook_gput_code:nnn #1 #2 - { \__hook_normalize_hook_args:Nnn \__hook_gput_code:nnn {#1} {#2} } +\cs_new_protected:Npn \hook_gput_code:nnn #1 #2 #3 + { + \__hook_replacing_args_false: + \__hook_normalize_hook_args:Nnn \__hook_gput_code:nnn {#1} {#2} {#3} + \__hook_replacing_args_reset: + } +\cs_new_protected:Npn \hook_gput_code_with_args:nnn #1 #2 #3 + { + \__hook_replacing_args_true: + \__hook_normalize_hook_args:Nnn \__hook_gput_code:nnn {#1} {#2} {#3} + \__hook_replacing_args_reset: + } \cs_new_protected:Npn \__hook_gput_code:nnn #1 #2 #3 { + \__hook_chk_args_allowed:nn {#1} { AddToHook } \__hook_if_execute_immediately:nTF {#1} - {#3} { - \__hook_if_usable:nTF {#1} + \__hook_if_replacing_args:TF { - \__hook_hook_gput_code_do:nnn {#1} {#2} {#3} - \__hook_update_hook_code:n {#1} - } - { - \__hook_if_disabled:nTF {#1} - { \msg_error:nnn { hooks } { hook-disabled } {#1} } - { \__hook_try_declaring_generic_hook:nnn {#1} {#2} {#3} } + \msg_error:nnnn { hooks } { one-time-args } + {#1} { AddToHook } } + { } + \use:n + } + { \__hook_gput_code_store:nnn {#1} {#2} } + {#3} + } +\cs_new_protected:Npn \__hook_gput_code_store:nnn #1 #2 #3 + { + \__hook_if_usable:nTF {#1} + { + \__hook_hook_gput_code_do:nnn {#1} {#2} {#3} + \__hook_update_hook_code:n {#1} + } + { + \__hook_if_disabled:nTF {#1} + { \msg_error:nnn { hooks } { hook-disabled } {#1} } + { \__hook_try_declaring_generic_hook:nnn {#1} {#2} {#3} } } } \cs_new_protected:Npn \__hook_hook_gput_code_do:nnn #1 #2 #3 @@ -4857,18 +5006,57 @@ \str_if_eq:eeTF { top-level } { \__hook_currname_or_default: } { \__hook_init_structure:n {#1} - \__hook_tl_gput_right:cn { __hook_toplevel~#1 } {#3} + \__hook_cs_gput_right:nnn { _toplevel } {#1} {#3} } { \msg_error:nnn { hooks } { misused-top-level } {#1} } } { - \prop_get:cnNTF { g__hook_#1_code_prop } {#2} \l__hook_return_tl + \exp_args:Nx \__hook_prop_gput_labeled_cleanup:nnn + { + \__hook_if_replacing_args:TF + { \exp_not:n } + { \__hook_double_hashes:n } + {#3} + } + {#1} {#2} + } + } +\cs_new_protected:Npn \__hook_prop_gput_labeled_cleanup:nnn #1 #2 #3 + { + \tl_set:Nn \l__hook_return_tl {#1} + \__hook_if_replacing_args:TF + { + \__hook_if_usable:nT {#2} { - \prop_gput:cno { g__hook_#1_code_prop } {#2} - { \l__hook_return_tl #3 } + \__hook_set_normalise_fn:nn {#2} + { Invalid~code~added~\msg_line_context: } + \__hook_normalise_fn:nn {#3} {#1} + \prop_get:NnN \l__hook_work_prop {#3} \l__hook_return_tl } - { \prop_gput:cnn { g__hook_#1_code_prop } {#2} {#3} } } + { } + \exp_args:NcV \__hook_prop_gput_labeled_do:Nnn + { g__hook_#2_code_prop } \l__hook_return_tl {#3} + } +\cs_new_protected:Npn \__hook_prop_gput_labeled_do:Nnn #1 #2 #3 + { + \prop_get:NnNTF #1 {#3} \l__hook_return_tl + { \prop_gput:Nno #1 {#3} { \l__hook_return_tl #2 } } + { \prop_gput:Nnn #1 {#3} {#2} } + } +\cs_new_protected:Npn \__hook_chk_args_allowed:nn #1 #2 + { + \__hook_if_replacing_args:TF + { + \__hook_if_declared:nT {#1} + { \tl_if_empty:cT { c__hook_#1_parameter_tl } { \use_ii:nn } } + \use_none:n + { + \msg_error:nnnn { hooks } { without-args } {#1} {#2} + \__hook_replacing_args_false: + } + } + { } } \cs_new_protected:Npn \__hook_gput_undeclared_hook:nnn #1 #2 #3 { @@ -4878,14 +5066,14 @@ \cs_new_protected:Npn \__hook_try_declaring_generic_hook:nnn #1 { \__hook_try_declaring_generic_hook:wnTF #1 / / / \scan_stop: {#1} - \hook_gput_code:nnn + \__hook_gput_code:nnn \__hook_gput_undeclared_hook:nnn {#1} } \cs_new_protected:Npn \__hook_try_declaring_generic_next_hook:nn #1 { \__hook_try_declaring_generic_hook:wnTF #1 / / / \scan_stop: {#1} - \hook_gput_next_code:nn + \__hook_gput_next_code:nn \__hook_gput_next_do:nn {#1} } @@ -4897,8 +5085,12 @@ \__hook_if_usable:nF {#5} { \str_if_eq:nnT {#1} { cmd } - { \__hook_try_put_cmd_hook:n {#5} } - \__hook_make_usable:n {#5} + { + \__hook_try_put_cmd_hook:n {#5} + \__hook_make_usable:nn {#5} { 9 } + \use_none:nnn + } + \__hook_make_usable:nn {#5} { 0 } } \__hook_if_generic_reversed:nT {#5} { \tl_gset:cn { g__hook_#5_reversed_tl } { - } } @@ -4938,17 +5130,6 @@ { #3 / #5 / #4 } #1 #2 { #3 / #5 / #4 } } -\prg_new_conditional:Npnn \__hook_if_file_hook:w - #1 / #2 \s__hook_mark #3 { TF } - { - \__hook_if_generic:nTF {#3} - { - \str_if_eq:nnTF {#1} { file } - { \prg_return_true: } - { \prg_return_false: } - } - { \prg_return_false: } - } \clist_map_inline:nn { cmd , env , file , package , class , include } { \tl_const:cn { c__hook_generic_#1/./before_tl } { + } @@ -4964,6 +5145,8 @@ \tl_const:cn { c__hook_deprecated_#1/./after_tl } { } } \tl_const:cn { c__hook_deprecated_include/./end_tl } { } +\tl_const:cn { c__hook_parameter_cmd/./before_tl } { #1#2#3#4#5#6#7#8#9 } +\tl_const:cn { c__hook_parameter_cmd/./after_tl } { #1#2#3#4#5#6#7#8#9 } \cs_new_protected:Npn \hook_gremove_code:nn #1 #2 { \__hook_normalize_hook_args:Nnn \__hook_gremove_code:nn {#1} {#2} } \cs_new_protected:Npn \__hook_gremove_code:nn #1 #2 @@ -4973,12 +5156,12 @@ \str_if_eq:nnTF {#2} {*} { \prop_gclear:c { g__hook_#1_code_prop } - \__hook_tl_gclear:c { __hook_toplevel~#1 } - \__hook_tl_gclear:c { __hook_next~#1 } + \__hook_toplevel_gset:nn {#1} { } + \__hook_next_gset:nn {#1} { } } { \str_if_eq:nnTF {#2} { top-level } - { \__hook_tl_gclear:c { __hook_toplevel~#1 } } + { \__hook_toplevel_gset:nn {#1} { } } { \prop_gpop:cnNF { g__hook_#1_code_prop } {#2} \l__hook_return_tl { \msg_warning:nnnn { hooks } { cannot-remove } {#1} {#2} } @@ -4996,9 +5179,206 @@ { \msg_warning:nnnn { hooks } { cannot-remove } {#1} {#2} } } } -\prop_new:c {g__hook_??_code_prop} -\prop_new:c {__hook~??} -\tl_new:c {g__hook_??_reversed_tl} +\cs_new_protected:Npn \__hook_cs_gput_right:nnn #1 #2 + { + \if:w T + \__hook_if_declared:nF {#2} { F } + \tl_if_empty:cF { c__hook_#2_parameter_tl } { F } + T + \exp_after:wN \__hook_cs_gput_right_fast:nnn + \else: + \exp_after:wN \__hook_cs_gput_right_slow:nnn + \fi: + {#1} {#2} + } +\cs_new_protected:Npn \__hook_cs_gput_right_fast:nnn #1 #2 #3 + { \cs_gset:cpx { __hook#1~#2 } { \exp_not:v { __hook#1~#2 } \exp_not:n {#3} } } +\cs_new_protected:Npn \__hook_cs_gput_right_slow:nnn #1 #2 #3 + { + \cs_if_exist:cF { __hook#1~#2 } + { \__hook_code_gset_aux:nnn {#1} {#2} { } } + \__hook_code_gset_auxi:eeen + { + \__hook_if_declared:nTF {#2} + { \tl_use:c { c__hook_#2_parameter_tl } } + { + \__hook_if_generic:nTF {#2} + { \__hook_generic_parameter:n {#2} } + { \c__hook_nine_parameters_tl } + } + } + { + \exp_args:NNo \exp_args:No \__hook_double_hashes:n + { + \cs:w __hook#1~#2 \exp_last_unbraced:Ne \cs_end: + { \__hook_braced_cs_parameter:n { __hook#1~#2 } } + } + } + { + \__hook_if_replacing_args:TF + { \exp_not:n } + { \__hook_double_hashes:n } + {#3} + } + { __hook#1~#2 } + } +\cs_new_protected:Npn \__hook_code_gset_auxi:nnnn #1 #2 #3 #4 + { \cs_gset:cpn {#4} #1 { #2 #3 } } +\cs_generate_variant:Nn \__hook_code_gset_auxi:nnnn { eeen } +\cs_new_protected:Npn \__hook_code_gset:nn + { \__hook_code_gset_aux:nnn { } } +\cs_new_protected:Npn \__hook_toplevel_gset:nn + { \__hook_code_gset_aux:nnn { _toplevel } } +\cs_new_protected:Npn \__hook_next_gset:nn + { \__hook_code_gset_aux:nnn { _next } } +\cs_new_protected:Npn \__hook_code_gset_aux:nnn #1 #2 #3 + { + \cs_gset:cpn { __hook#1~#2 \exp_last_unbraced:Ne } + { \__hook_parameter:n {#2} } + {#3} + } +\cs_generate_variant:Nn \__hook_code_gset:nn { ne } +\cs_new_protected:Npn \__hook_normalise_cs_args:nn #1 #2 + { + \cs_if_exist:cT { __hook#1~#2 } + { + \__hook_code_gset_auxi:eeen + { \tl_use:c { c__hook_#2_parameter_tl } } + { + \exp_args:NNo \exp_args:No \__hook_double_hashes:n + { + \cs:w __hook#1~#2 \exp_last_unbraced:Ne \cs_end: + { \__hook_braced_cs_parameter:n { __hook#1~#2 } } + } + } + { } + { __hook#1~#2 } + } + } +\cs_new_protected:Npn \__hook_normalise_code_pool:n #1 + { + \__hook_set_normalise_fn:nn {#1} { Offending~label:~'##1' } + \prop_clear:N \l__hook_work_prop + \prop_map_function:cN { g__hook_#1_code_prop } \__hook_normalise_fn:nn + \prop_gset_eq:cN { g__hook_#1_code_prop } \l__hook_work_prop + } +\cs_new_protected:Npn \__hook_set_normalise_fn:nn #1 #2 + { + \cs_set:Npn \__hook_tmp:w ##1##2##3##4##5##6##7##8##9 { } + \tl_set:Ne \l__hook_tmpb_tl + { \__hook_braced_cs_parameter:n { __hook_tmp:w } } + \group_begin: + \__hook_tl_set:cn { c__hook_hash_tl } { \exp_not:N \c__hook_hashes_tl } + \use:e + { + \group_end: + \tl_set:Nn \exp_not:N \l__hook_tmpb_tl { \l__hook_tmpb_tl } + } + \exp_last_unbraced:NNf + \cs_set:Npn \__hook_tmp:w { \__hook_parameter:n {#1} } { } + \tl_set:Ne \l__hook_tmpa_tl { \__hook_braced_cs_parameter:n { __hook_tmp:w } } + \cs_gset_protected:Npx \__hook_normalise_fn:nn ##1 ##2 + { + \group_begin: + \int_set:Nn \tex_escapechar:D { -1 } + \cs_set:cpn + { + hook~'#1'. ^^J + (hooks) \prg_replicate:nn { 13 } { ~ } + #2 % more message text + } + \exp_not:v { c__hook_#1_parameter_tl } + {##2} + \group_end: + \cs_set:Npn \exp_not:N \__hook_tmp:w + \exp_not:V \c__hook_nine_parameters_tl + { + \prop_put:Nne \exp_not:N \l__hook_work_prop + {##1} { \exp_not:N \__hook_double_hashes:n {##2} } + } + \exp_not:N \__hook_tmp:w + \exp_not:V \l__hook_tmpa_tl + \exp_args:No \exp_not:o + { \exp_after:wN \__hook_tmp:w \l__hook_tmpb_tl } + } + } +\cs_new_eq:NN \__hook_normalise_fn:nn ? +\prg_new_conditional:Npnn \__hook_cs_if_empty:c #1 { p, T, F, TF } + { + \if:w \scan_stop: \__hook_replacement_spec:c {#1} \scan_stop: + \prg_return_true: + \else: + \prg_return_false: + \fi: + } +\cs_new:Npn \__hook_replacement_spec:c #1 + { + \exp_args:Nc \token_if_macro:NT {#1} + { \cs_replacement_spec:c {#1} } + } +\cs_new:Npn \__hook_braced_cs_parameter:n #1 + { + \exp_last_unbraced:Ne \__hook_braced_hidden_loop:w + { \exp_args:Nc \__hook_cs_parameter_count:N {#1} } ? \s__hook_mark + } +\cs_new:Npn \__hook_braced_hidden_loop:w #1 + { + \if:w ? #1 + \__hook_use_i_delimit_by_s_mark:nw + \fi: + { \exp_not:N \c__hook_hash_tl #1 } + \__hook_braced_hidden_loop:w + } +\cs_new:Npn \__hook_cs_parameter_count:N #1 + { + \exp_last_unbraced:Nf \__hook_cs_parameter_count:w + { \token_if_macro:NT #1 { \cs_parameter_spec:N #1 } } + ? \__hook_cs_end:w ? \__hook_cs_end:w ? \__hook_cs_end:w + ? \__hook_cs_end:w ? \__hook_cs_end:w ? \__hook_cs_end:w + ? \__hook_cs_end:w ? \__hook_cs_end:w ? \__hook_cs_end:w + \s__hook_mark + } +\cs_new:Npn \__hook_cs_parameter_count:w #1#2 #3#4 #5#6 #7#8 + { #2 #4 #6 #8 \__hook_cs_parameter_count:w } +\cs_new:Npn \__hook_cs_end:w #1 \s__hook_mark { } +\cs_new:Npn \__hook_braced_parameter:n #1 + { + \if_case:w + \int_eval:n + { \exp_args:Nv \str_count:n { c__hook_#1_parameter_tl } / 3 } + \exp_stop_f: + \or: {##1} + \or: {##1} {##2} + \or: {##1} {##2} {##3} + \or: {##1} {##2} {##3} {##4} + \or: {##1} {##2} {##3} {##4} {##5} + \or: {##1} {##2} {##3} {##4} {##5} {##6} + \or: {##1} {##2} {##3} {##4} {##5} {##6} {##7} + \or: {##1} {##2} {##3} {##4} {##5} {##6} {##7} {##8} + \or: {##1} {##2} {##3} {##4} {##5} {##6} {##7} {##8} {##9} + \else: + \msg_expandable_error:nnn { latex2e } { should-not-happen } + { Invalid~parameter~spec. } + \fi: + } +\cs_new:Npn \__hook_parameter:n #1 + { + \cs:w c__hook_ + \tl_if_exist:cTF { c__hook_#1_parameter_tl } + { #1_parameter } { empty } + _tl \cs_end: + } +\cs_new:Npn \__hook_generic_parameter:n #1 + { \__hook_generic_parameter:w #1 / / / \s__hook_mark } +\cs_new:Npn \__hook_generic_parameter:w #1 / #2 / #3 / #4 \s__hook_mark + { + \cs_if_exist_use:cF { c__hook_parameter_#1/./#3_tl } + { \c__hook_empty_tl } + } +\prop_new:c { g__hook_??_code_prop } +\prop_new:c { __hook~?? } +\tl_new:c { g__hook_??_reversed_tl } +\tl_const:cn { c__hook_??_parameter_tl } { } \cs_new_protected:Npn \hook_gset_rule:nnnn #1#2#3#4 { \__hook_normalize_hook_rule_args:Nnnnn \__hook_gset_rule:nnnn @@ -5011,13 +5391,13 @@ \__hook_deprecated_generic_warn:n {#1} \__hook_do_deprecated_generic:Nn \__hook_gset_rule:nnnn {#1} {#2} {#3} {#4} - \__hook_clean_to_scan:w + \__hook_use_none_delimit_by_s_mark:w } \__hook_if_execute_immediately:nT {#1} { \msg_error:nnnnnn { hooks } { rule-too-late } {#1} {#2} {#3} {#4} - \__hook_clean_to_scan:w + \__hook_use_none_delimit_by_s_mark:w } \__hook_init_structure:n {#1} \__hook_rule_gclear:nnn {#1} {#2} {#4} @@ -5082,23 +5462,29 @@ \cs_end: } \cs_new_eq:NN \__hook_update_hook_code:n \use_none:n -\cs_new_protected:Npn \__hook_initialize_all: { - \cs_gset_eq:NN \__hook_update_hook_code:n \__hook_initialize_hook_code:n - \__hook_debug:n { \prop_gclear:N \g__hook_used_prop } - \seq_map_inline:Nn \g__hook_all_seq +\cs_new_protected:Npn \__hook_initialize_all: + { + \cs_gset_eq:NN \__hook_update_hook_code:n \__hook_initialize_hook_code:n + \__hook_debug:n { \prop_gclear:N \g__hook_used_prop } + \seq_map_inline:Nn \g__hook_all_seq { + \tl_if_empty:cTF { c__hook_##1_parameter_tl } + { \__hook_replacing_args_false: } + { \__hook_replacing_args_true: } \__hook_update_hook_code:n {##1} + \__hook_replacing_args_reset: } - \__hook_debug:n - { \iow_term:x{^^JAll~ initialized~ (non-empty)~ hooks:} - \prop_map_inline:Nn \g__hook_used_prop - { \iow_term:x{^^J~ ##1~ ->~ - \exp_not:v {__hook~##1}~ } - } - } - \cs_gset_eq:NN \hook_use:n \__hook_use_initialized:n - \cs_gset_eq:NN \__hook_preamble_hook:n \use_none:n -} + \__hook_debug:n + { + \iow_term:x { ^^J All~initialized~(non-empty)~hooks: } + \prop_map_inline:Nn \g__hook_used_prop + { + \iow_term:x + { ^^J ~ ##1 ~ -> ~ \cs_replacement_spec:c { __hook~##1 } ~ } + } + } + \__hook_post_initialization_defs: + } \cs_new_protected:Npn \__hook_initialize_hook_code:n #1 { \__hook_debug:n @@ -5108,10 +5494,10 @@ { \prop_if_empty:cTF { g__hook_#1_code_prop } { - \__hook_tl_gset:co { __hook~#1 } + \__hook_code_gset:ne {#1} { - \cs:w __hook_toplevel~#1 \exp_after:wN \cs_end: - \cs:w __hook_next~#1 \cs_end: + \exp_not:c { __hook_toplevel~#1 } \__hook_braced_parameter:n {#1} + \exp_not:c { __hook_next~#1 } \__hook_braced_parameter:n {#1} } } { @@ -5202,8 +5588,15 @@ \__hook_debug_label_data:N \l__hook_work_prop \iow_term:x{====================} } - \exp_args:NNo \__hook_tl_gput:Nn #1 { \cs:w __hook_toplevel~#3 \cs_end: } - \__hook_tl_gput_right:No #1 { \cs:w __hook_next~#3 \cs_end: } + \exp_args:NNe \__hook_tl_gput:Nn #1 + { \exp_not:c { __hook_toplevel~#3 } \__hook_braced_parameter:n {#3} } + \__hook_tl_gput_right:Ne #1 + { \exp_not:c { __hook_next~#3 } \__hook_braced_parameter:n {#3} } + \use:e + { + \cs_gset:cpn { __hook~#3 } \use:c { c__hook_#3_parameter_tl } + { \exp_not:V #1 } + } } \cs_generate_variant:Nn \__hook_initialize_single:NNn { cc } \cs_new:Npn \__hook_tl_gput:Nn { \ERROR } @@ -5330,7 +5723,20 @@ } \__hook_preamble_hook:n {#1} \__hook_log_cmd:x - { ^^J ->~The~ \__hook_if_generic:nT {#1} { generic~ } hook~'#1': } + { + ^^J ->~The~ + \__hook_if_generic:nT {#1} { generic~ } + hook~'#1' + \__hook_if_disabled:nF {#1} + { + \exp_args:Nf \__hook_print_args:nn {#1} + { + \int_eval:n + { \str_count:e { \__hook_parameter:n {#1} } / 3 } + } + } + : + } \__hook_if_usable:nF {#1} { \__hook_log_line:x { The~hook~is~not~declared. } } \__hook_if_disabled:nT {#1} @@ -5343,7 +5749,12 @@ { \__hook_log_line_indent:x { --- } } { \prop_map_inline:cn { g__hook_#1_code_prop } - { \__hook_log_line_indent:x { ##1~->~\tl_to_str:n {##2} } } + { + \exp_after:wN \cs_set:Npn \exp_after:wN \__hook_tmp:w + \c__hook_nine_parameters_tl {##2} + \__hook_log_line_indent:x + { ##1~->~\cs_replacement_spec:N \__hook_tmp:w } + } } \__hook_log_line:x { @@ -5353,16 +5764,19 @@ } \__hook_log_line_indent:x { - \tl_if_empty:cTF { __hook_toplevel~#1 } + \__hook_cs_if_empty:cTF { __hook_toplevel~#1 } { --- } - { -> ~ \exp_args:Nv \tl_to_str:n { __hook_toplevel~#1 } } + { -> ~ \cs_replacement_spec:c { __hook_toplevel~#1 } } } \__hook_log_line:x { Extra~code~for~next~invocation: } \__hook_log_line_indent:x { - \tl_if_empty:cTF { __hook_next~#1 } + \__hook_cs_if_empty:cTF { __hook_next~#1 } { --- } - { ->~ \exp_args:Nv \__hook_log_next_code:n { __hook_next~#1 } } + { + -> ~ \exp_last_unbraced:Nf \__hook_log_next_code:w + { \cs_replacement_spec:c { __hook_next~#1 } } + } } \__hook_log_line:x { Rules: } \bool_set_true:N \l__hook_tmpa_bool @@ -5397,7 +5811,7 @@ \@spaces \clist_if_empty:cTF { g__hook_#1_labels_clist } { --- } - { \clist_use:cn {g__hook_#1_labels_clist} { ,~ } } + { \clist_use:cn { g__hook_#1_labels_clist } { ,~ } } } } { @@ -5411,8 +5825,19 @@ } } } -\cs_new:Npn \__hook_log_next_code:n #1 - { \exp_args:No \tl_to_str:n { \use_none:nn #1 } } +\exp_last_unbraced:NNNNo +\cs_new:Npn \__hook_log_next_code:w #1 \c_right_brace_str { } +\cs_new:Npn \__hook_print_args:nn #1 #2 + { + \int_compare:nNnT {#2} > { 0 } + { + \__hook_if_declared:nT {#1} { \use_none:nnn } + \__hook_if_cmd_hook:nT {#1} + { \use_i:nnn { ~ (unknown ~ } } + \use:n { ~ (#2 ~ } + argument \int_compare:nNnT {#2} > { 1 } { s } ) + } + } \cs_new_protected:Npn \__hook_list_rules:nn #1 #2 { \cs_set_protected:Npn \__hook_tmp:w ##1 ##2 ##3 {#2} @@ -5458,105 +5883,147 @@ } \exp_args:No \__hook_tmp:w { \use:nn { ~ } { ~ } } } -\cs_new_protected:Npn \hook_gput_next_code:nn #1 - { \__hook_normalize_hook_args:Nn \__hook_gput_next_code:nn {#1} } +\cs_new_protected:Npn \hook_gput_next_code:nn #1 #2 + { + \__hook_replacing_args_false: + \__hook_normalize_hook_args:Nn \__hook_gput_next_code:nn {#1} {#2} + \__hook_replacing_args_reset: + } +\cs_new_protected:Npn \hook_gput_next_code_with_args:nn #1 #2 + { + \__hook_replacing_args_true: + \__hook_normalize_hook_args:Nn \__hook_gput_next_code:nn {#1} {#2} + \__hook_replacing_args_reset: + } \cs_new_protected:Npn \__hook_gput_next_code:nn #1 #2 { \__hook_if_disabled:nTF {#1} { \msg_error:nnn { hooks } { hook-disabled } {#1} } { \__hook_if_structure_exist:nTF {#1} - { \__hook_gput_next_do:nn {#1} {#2} } - { \__hook_try_declaring_generic_next_hook:nn {#1} {#2} } + { \__hook_gput_next_do:nn } + { \__hook_try_declaring_generic_next_hook:nn } + {#1} {#2} } } \cs_new_protected:Npn \__hook_gput_next_do:nn #1 { - \exp_args:Nc \__hook_gput_next_do:Nnn - { __hook_next~#1 } {#1} - } -\cs_new_protected:Npn \__hook_gput_next_do:Nnn #1 #2 - { - \tl_if_empty:cT { __hook~#2 } - { \__hook_update_hook_code:n {#2} } - \tl_if_empty:NT #1 - { \__hook_tl_gset:Nn #1 { \__hook_clear_next:n {#2} } } - \__hook_tl_gput_right:Nn #1 + \__hook_init_structure:n {#1} + \__hook_chk_args_allowed:nn {#1} { AddToHookNext } + \__hook_cs_if_empty:cT { __hook~#1 } + { \__hook_update_hook_code:n {#1} } + \__hook_cs_if_empty:cT { __hook_next~#1 } + { \__hook_next_gset:nn {#1} { \__hook_clear_next:n {#1} } } + \__hook_cs_gput_right:nnn { _next } {#1} } \cs_new_protected:Npn \hook_gclear_next_code:n #1 { \__hook_normalize_hook_args:Nn \__hook_clear_next:n {#1} } \cs_new_protected:Npn \__hook_clear_next:n #1 - { \cs_gset_eq:cN { __hook_next~#1 } \c_empty_tl } + { \__hook_next_gset:nn {#1} { } } \cs_new_protected:Npn \hook_use:n #1 { - \tl_if_exist:cT { __hook~#1 } - { - \__hook_preamble_hook:n {#1} - \cs:w __hook~#1 \cs_end: - } + \__hook_preamble_hook:n {#1} + \__hook_use_initialized:n {#1} } \cs_new:Npn \__hook_use_initialized:n #1 { \if_cs_exist:w __hook~#1 \cs_end: - \cs:w __hook~#1 \exp_after:wN \cs_end: + \cs:w __hook~#1 \use_i:nn \fi: + \use_none:n + \cs_end: } \cs_new_protected:Npn \__hook_preamble_hook:n #1 - { \__hook_initialize_hook_code:n {#1} } + { + \if_cs_exist:w __hook~#1 \cs_end: + \__hook_initialize_hook_code:n {#1} + \fi: + } +\cs_new_protected:Npn \hook_use:nnw #1 + { + \__hook_preamble_hook:n {#1} + \__hook_use_initialized:nnw {#1} + } +\cs_new:Npn \__hook_use_initialized:nnw #1 #2 + { + \cs:w + \if_cs_exist:w __hook~#1 \cs_end: + __hook~#1 + \else: + use_none: \prg_replicate:nn {#2} { n } + \fi: + \cs_end: + } +\cs_new_protected:Npn \__hook_post_initialization_defs: + { + \cs_gset_eq:NN \hook_use:n \__hook_use_initialized:n + \cs_gset_eq:NN \hook_use:nnw \__hook_use_initialized:nnw + \cs_gset_eq:NN \__hook_preamble_hook:n \use_none:n + \cs_gset_eq:NN \__hook_post_initialization_defs: \prg_do_nothing: + } \cs_new_protected:Npn \hook_use_once:n #1 { \__hook_if_execute_immediately:nF {#1} - { \__hook_normalize_hook_args:Nn \__hook_use_once:n { \use:n {#1} } } + { \__hook_normalize_hook_args:Nn \__hook_use_once:nn { \use:n {#1} } { 0 } } + } +\cs_new_protected:Npn \hook_use_once:nnw #1 #2 + { + \__hook_if_execute_immediately:nF {#1} + { \__hook_normalize_hook_args:Nn \__hook_use_once:nn { \use:n {#1} } {#2} } } -\cs_new_protected:Npn \__hook_use_once:n #1 +\cs_new_protected:Npn \__hook_use_once:nn #1 #2 { \__hook_preamble_hook:n {#1} \__hook_use_once_set:n {#1} - \__hook_use_initialized:n {#1} - \__hook_use_once_clear:n {#1} + \__hook_replacing_args_false: + \__hook_cs_gput_right:nnn { _next } {#1} { \__hook_use_once_clear:n {#1} } + \__hook_replacing_args_reset: + \__hook_if_usable:nTF {#1} + { \__hook_use_initialized:n {#1} } + { + \int_compare:nNnT {#2} > { 0 } + { \use:c { use_none: \prg_replicate:nn {#2} { n } } } + } } \cs_new_protected:Npn \__hook_use_once_set:n #1 { \__hook_tl_gset:cn { g__hook_#1_reversed_tl } { I } } \cs_new_protected:Npn \__hook_use_once_clear:n #1 { - \__hook_tl_gclear:c { __hook~#1 } - \__hook_tl_gclear:c { __hook_next~#1 } - \__hook_tl_gclear:c { __hook_toplevel~#1 } + \__hook_code_gset:nn {#1} { } + \__hook_next_gset:nn {#1} { } + \__hook_toplevel_gset:nn {#1} { } \prop_gclear_new:c { g__hook_#1_code_prop } } \prg_new_conditional:Npnn \__hook_if_execute_immediately:n #1 { T, F, TF } { - \__hook_if_usable:nTF {#1} - { - \exp_after:wN \__hook_clean_to_scan:w - \if:w I \cs:w g__hook_#1_reversed_tl \cs_end: - \s__hook_mark \prg_return_true: - \else: - \s__hook_mark \prg_return_false: + \exp_after:wN \__hook_use_none_delimit_by_s_mark:w + \if:w I + \if_cs_exist:w g__hook_#1_reversed_tl \cs_end: + \cs:w g__hook_#1_reversed_tl \exp_after:wN \cs_end: \fi: - } - { \prg_return_false: } + X + \s__hook_mark \prg_return_true: + \else: + \s__hook_mark \prg_return_false: + \fi: } - \prg_new_conditional:Npnn \hook_if_empty:n #1 { p , T , F , TF } { - \__hook_if_structure_exist:nTF {#1} - { - \bool_lazy_and:nnTF - { \prop_if_empty_p:c { g__hook_#1_code_prop } } - { - \bool_lazy_and_p:nn - { \tl_if_empty_p:c { __hook_toplevel~#1 } } - { \tl_if_empty_p:c { __hook_next~#1 } } - } - { \prg_return_true: } - { \prg_return_false: } - } - { \prg_return_true: } + \if:w + T + \prop_if_exist:cT { g__hook_#1_code_prop } + { \prop_if_empty:cF { g__hook_#1_code_prop } { F } } + \__hook_cs_if_empty:cF { __hook_toplevel~#1 } { F } + \__hook_cs_if_empty:cF { __hook_next~#1 } { F } + T + \prg_return_true: + \else: + \prg_return_false: + \fi: } \prg_new_conditional:Npnn \__hook_if_usable:n #1 { p , T , F , TF } { - \tl_if_exist:cTF { __hook~#1 } + \cs_if_exist:cTF { __hook~#1 } { \prg_return_true: } { \prg_return_false: } } @@ -5574,7 +6041,7 @@ } \prg_new_conditional:Npnn \__hook_if_reversed:n #1 { p , T , F , TF } { - \exp_after:wN \__hook_clean_to_scan:w + \exp_after:wN \__hook_use_none_delimit_by_s_mark:w \if:w - \cs:w g__hook_#1_reversed_tl \cs_end: \s__hook_mark \prg_return_true: \else: @@ -5601,6 +6068,19 @@ } { \prg_return_false: } } +\prg_new_conditional:Npnn \__hook_if_cmd_hook:n #1 { T } + { \__hook_if_cmd_hook:w #1 / / / \s__hook_mark } +\cs_new:Npn \__hook_if_cmd_hook:w #1 / #2 / #3 / #4 \s__hook_mark + { + \if:w Y + \str_if_eq:nnF {#1} { cmd } { N } + \tl_if_exist:cF { c__hook_generic_#1/./#3_tl } { N } + Y + \prg_return_true: + \else: + \prg_return_false: + \fi: + } \prg_new_conditional:Npnn \__hook_if_generic_reversed:n #1 { T } { \__hook_if_generic_reversed:w #1 / / / \scan_stop: } \cs_new:Npn \__hook_if_generic_reversed:w #1 / #2 / #3 / #4 \scan_stop: @@ -5611,6 +6091,31 @@ \prg_return_false: \fi: } +\seq_new:N \g__hook_replacing_stack_seq +\cs_new:Npn \__hook_misused_if_replacing_args:nn #1 #2 + { + \msg_expandable_error:nnn { latex2e } { should-not-happen } + { Misused~\__hook_if_replacing_args:. } + } +\cs_new:Npn \__hook_if_replacing_args:TF + { \__hook_misused_if_replacing_args:nn } +\cs_new_protected:Npn \__hook_replacing_args_true: + { + \seq_gpush:No \g__hook_replacing_stack_seq + { \__hook_if_replacing_args:TF } + \cs_set:Npn \__hook_if_replacing_args:TF { \use_i:nn } + } +\cs_new_protected:Npn \__hook_replacing_args_false: + { + \seq_gpush:No \g__hook_replacing_stack_seq + { \__hook_if_replacing_args:TF } + \cs_set:Npn \__hook_if_replacing_args:TF { \use_ii:nn } + } +\cs_new_protected:Npn \__hook_replacing_args_reset: + { + \seq_gpop:NN \g__hook_replacing_stack_seq \l__hook_return_tl + \cs_gset_eq:NN \__hook_if_replacing_args:TF \l__hook_return_tl + } \prop_gput:Nnn \g_msg_module_type_prop { hooks } { LaTeX } \prop_gput:Nnn \g_msg_module_type_prop { latex2e } { LaTeX } \prop_gput:Nnn \g_msg_module_name_prop { latex2e } { kernel } @@ -5629,6 +6134,32 @@ { There~ already~ exists~ a~ hook~ declaration~ with~ this~ name.\\ Please~ use~ a~ different~ name~ for~ your~ hook.} +\msg_new:nnnn { hooks } { too-many-args } + { Too~many~arguments~for~hook~'#1'. } + { + You~tried~to~declare~a~hook~with~#2~arguments,~but~a~ + hook~can~only~have~up~to~nine.~LaTeX~will~define~this~ + hook~with~nine~arguments. + } +\msg_new:nnnn { hooks } { without-args } + { Hook~'#1'~has~no~arguments. } + { + You~tried~to~use~\iow_char:N\\#2WithArguments~ + on~a~hook~that~takes~no~arguments.\\ + Check~the~usage~of~the~hook~or~use~\iow_char:N\\#2~instead.\\ + \\ + LaTeX~will~use~\iow_char:N\\#2. + } +\msg_new:nnnn { hooks } { one-time-args } + { You~can't~have~arguments~in~used~one-time~hook~'#1'. } + { + You~tried~to~use~\iow_char:N\\#2WithArguments~ + on~a~one-time~hook~that~has~already~been~used.~ + You~have~to~add~the~code~before~the~hook~is~used,~ + or~add~the~code~without~arguments~using~\iow_char:N\\#2~instead.\\ + \\ + LaTeX~will~use~\iow_char:N\\#2. + } \msg_new:nnnn { hooks } { hook-disabled } { Cannot~add~code~to~disabled~hook~'#1'. } { @@ -5723,15 +6254,30 @@ Generic~hook~'#1/#2/#3'~is~deprecated. \\ Use~hook~'#1/#3/#2'~instead. } -\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 \ActivateGenericHook { m }{ \hook_activate_generic:n {#1} } -\NewDocumentCommand \DisableGenericHook { m }{ \hook_disable_generic:n {#1} } +\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 \NewHookWithArguments { mm } + { \hook_new_with_args:nn {#1} {#2} } +\NewDocumentCommand \NewReversedHookWithArguments { mm } + { \hook_new_reversed_with_args:nn {#1} {#2} } +\NewDocumentCommand \NewMirroredHookPairWithArguments { mmm } + { \hook_new_pair_with_args:nnn {#1} {#2} {#3} } +\NewDocumentCommand \ActivateGenericHook { m } + { \hook_activate_generic:n {#1} } +\NewDocumentCommand \DisableGenericHook { m } + { \hook_disable_generic:n {#1} } \NewDocumentCommand \AddToHook { m o +m } { \hook_gput_code:nnn {#1} {#2} {#3} } +\NewDocumentCommand \AddToHookWithArguments { m o +m } + { \hook_gput_code_with_args:nnn {#1} {#2} {#3} } \NewDocumentCommand \AddToHookNext { m +m } { \hook_gput_next_code:nn {#1} {#2} } +\NewDocumentCommand \AddToHookNextWithArguments { m +m } + { \hook_gput_next_code_with_args:nn {#1} {#2} } \NewDocumentCommand \ClearHookNext { m } { \hook_gclear_next_code:n {#1} } \NewDocumentCommand \RemoveFromHook { m o } @@ -5750,6 +6296,8 @@ } \cs_new:Npn \UseHook { \hook_use:n } \cs_new:Npn \UseOneTimeHook { \hook_use_once:n } +\cs_new:Npn \UseHookWithArguments { \hook_use:nnw } +\cs_new:Npn \UseOneTimeHookWithArguments { \hook_use_once:nnw } \cs_new_protected:Npn \ShowHook { \hook_show:n } \cs_new_protected:Npn \LogHook { \hook_log:n } \cs_new_protected:Npn \DebugHooksOn { \hook_debug_on: } @@ -5839,18 +6387,20 @@ \__hook_curr_name_pop: \ExplSyntaxOff %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% File: ltcmdhooks.dtx (C) Copyright 2020-2021 -%% Frank Mittelbach, Phelype Oleinik, LaTeX Team +%% File: ltcmdhooks.dtx +%% Copyright (C) 2020-2023 +%% Frank Mittelbach, Phelype Oleinik, The LaTeX Project %%% From File: ltcmdhooks.dtx -\def\ltcmdhooksversion{v1.0f} -\def\ltcmdhooksdate{2021/10/20} +\def\ltcmdhooksversion{v1.0h} +\def\ltcmdhooksdate{2023/05/21} \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_param_text_tl \tl_new:N \l__hook_replace_text_tl -\tl_const:Nn \c__hook_hash_tl { # # } +\tl_const:Nn \c__hook_hash_tl { # } +\tl_const:Nn \c__hook_hashes_tl { # # } \cs_new_eq:NN \__hook_exp_not:NN ? \cs_new_eq:NN \__hook_def_cmd:w ? \quark_new:N \q__hook_recursion_tail @@ -5998,10 +6548,10 @@ ##1 \l__hook_replace_text_tl { \__hook_exp_not:n {##2} } } \bool_if:NTF #1 - { \__hook_tmp:w \tl_set:Nx { [ \c__hook_hash_tl 1 ] } } - { \__hook_tmp:w \tl_set:Nx { { \c__hook_hash_tl 1 } } } + { \__hook_tmp:w \tl_set:Nx { [ \c__hook_hashes_tl 1 ] } } + { \__hook_tmp:w \tl_set:Nx { { \c__hook_hashes_tl 1 } } } \int_step_inline:nnn { 2 } { \l__hook_patch_num_args_int } - { \__hook_tmp:w \tl_put_right:Nx { { \c__hook_hash_tl ##1 } } } + { \__hook_tmp:w \tl_put_right:Nx { { \c__hook_hashes_tl ##1 } } } \tl_set:Nx \l__hook_replace_text_tl { \exp_not:N #2 \exp_not:V \l__hook_replace_text_tl } \tl_set:Nx \l__hook_replace_text_tl @@ -6028,16 +6578,24 @@ \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 + \__hook_disable:n { cmd / #3 / #4 } + \cs_undefine:c { c__hook_cmd / #3 / #4_parameter_tl } + \__hook_make_usable:nn { cmd / #3 / #4 } { \l__hook_patch_num_args_int } + \use:e { \__hook_redefine_with_hooks:Nnnn \exp_not:N #2 \str_if_eq:nnTF {#4} { after } { \use_ii_i:nn } { \use:nn } - { { \__hook_exp_not:NN \exp_not:N \UseHook { cmd / #3 / #4 } } } + { { + \__hook_exp_not:NN \exp_not:N \UseHookWithArguments + { cmd / #3 / #4 } { \int_use:N \l__hook_patch_num_args_int } + \__hook_braced_parameter:n { cmd / #3 / #4 } + } } { { } } { \__hook_exp_not:NN \exp_not:V \l__hook_replace_text_tl } } + \__hook_update_hook_code:n { cmd / #3 / #4 } } \cs_new_protected:Npn \__hook_redefine_with_hooks:Nnnn #1 #2 #3 #4 { @@ -6086,7 +6644,11 @@ \if_meaning:w \q__hook_recursion_tail #1 \__hook_double_hashes_stop:w \fi: - \if_meaning:w \c__hook_hash_tl #1 + \if:w ? + \if_meaning:w \c__hook_hash_tl #1 ! \fi: + \if_meaning:w \c__hook_hashes_tl #1 ! \fi: + ? + \else: \use_i:nnnn \fi: \use:n @@ -6108,10 +6670,10 @@ { ~ \__hook_double_hashes: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} } { + \__hook_patch_debug:x { ..~command~can~only~be~patched~by~rescanning } \tl_set:Nx \l__hook_tmpa_tl { \int_compare:nNnTF { \char_value_catcode:n {`\@ } } = { 12 } @@ -6149,7 +6711,7 @@ { \__hook_patch_debug:x { ++~macro~can~be~retokenized~cleanly } \__hook_patch_debug:x { ==~retokenizing~macro~now } - \__hook_patch_retokenize:Nnnn #1 {#2} {#3} {#4} + \__hook_patch_retokenize:Nnnn #1 { cmd / #2 / #3 } {#3} {#4} \use_i_delimit_by_q_recursion_stop:nw \use_none:n } { @@ -6184,8 +6746,41 @@ { \prg_return_true: } { \prg_return_false: } } +\cs_new_protected:Npn \__hook_guess_arg_count:NN #1 + { + \exp_after:wN \__hook_guess_arg_count:wN + \token_to_meaning:N #1 \s__hook_mark + } +\exp_last_unbraced:NNNNo +\cs_new_protected:Npx \__hook_guess_arg_count:wN + #1 { \tl_to_str:n { macro: } } #2 \s__hook_mark #3 + { + \int_set:Nn #3 + { + \exp_not:N \__hook_guess_arg_count:nw { 0 } #2 + \c_hash_str 0 \s__hook_mark + } + } +\use:e + { \cs_new:Npn \exp_not:N \__hook_guess_arg_count:nw #1 #2 \c_hash_str #3 } + { + \int_compare:nNnTF { #1 + 1 } = {#3} + { \__hook_guess_arg_count:nw {#3} } + { #1 \__hook_use_none_delimit_by_s_mark:w } + } \cs_new_protected:Npn \__hook_patch_retokenize:Nnnn #1 #2 #3 #4 { + \__hook_guess_arg_count:NN #1 \l__hook_patch_num_args_int + \__hook_disable:n {#2} + \cs_undefine:c { c__hook_#2_parameter_tl } + \__hook_make_usable:nn {#2} { \l__hook_patch_num_args_int } + \tl_set:Ne \l__hook_tmpa_tl + { \exp_args:Ne \tl_to_str:n { \__hook_braced_parameter:n {#2} } } + \use:x + { + \str_replace_all:Nnn \exp_not:N \l__hook_tmpa_tl + { #### } { \c_hash_str } + } \cs_set_eq:NN \kerneltmpDoNotUse \scan_stop: \cs_set_eq:NN \__hook_tmp:w \scan_stop: \use:x @@ -6196,10 +6791,18 @@ ####1 \def \kerneltmpDoNotUse ####2 { \str_if_eq:nnT {#3} { before } - { \token_to_str:N \UseHook { cmd / #2 / #3 } } + { + \token_to_str:N \UseHookWithArguments {#2} + { \int_use:N \l__hook_patch_num_args_int } + \l__hook_tmpa_tl + } ####3 \str_if_eq:nnT {#3} { after } - { \token_to_str:N \UseHook { cmd / #2 / #3 } } + { + \token_to_str:N \UseHookWithArguments {#2} + { \int_use:N \l__hook_patch_num_args_int } + \l__hook_tmpa_tl + } } } \tl_set:Nx \exp_not:N \l__hook_tmpa_tl @@ -6207,6 +6810,7 @@ } \tl_rescan:nV { #4 \__hook_patch_required_catcodes: } \l__hook_tmpa_tl \cs_gset_eq:NN #1 \kerneltmpDoNotUse + \__hook_update_hook_code:n {#2} } \msg_new:nnnn { hooks } { cant-patch } { @@ -6544,10 +7148,12 @@ 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 +%% File: ltpara.dtx +%% Copyright (C) 2020-2023 +%% Frank Mittelbach, The LaTeX Project %%% From File: ltpara.dtx -\def\ltparaversion{v1.0k} -\def\ltparadate{2022/05/13} +\def\ltparaversion{v1.0l} +\def\ltparadate{2023/01/30} \ExplSyntaxOn @@ -6568,7 +7174,8 @@ Type H <return> for immediate help.}% \hook_use:n {para/before} \group_begin: \tex_everypar:D {} - \skip_zero:N \tex_parskip:D + \skip_set:Nn \tex_parskip:D + { \if@minipage -\tex_parskip:D \else: \c_zero_skip \fi: } \tex_noindent:D \group_end: \tex_everypar:D{\g__para_standard_everypar_tl} @@ -6672,7 +7279,9 @@ Type H <return> for immediate help.}% \ExplSyntaxOff %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% File: ltmeta.dtx (C) Copyright 2021, 2022 +%% File: ltmeta.dtx +%% Copyright (C) 2021-2023 +%% Frank Mittelbach, The LaTeX Project %%% From File: ltmeta.dtx \def\ltmetaversion{v1.0b} \def\ltmetadate{2022/05/18} @@ -6710,6 +7319,7 @@ Type H <return> for immediate help.}% \DeclareRobustCommand\linebreak{\@testopt{\@no@lnbk-}4} \DeclareRobustCommand\nolinebreak{\@testopt\@no@lnbk4} \DeclareRobustCommand\samepage{\interlinepenalty\@M + \predisplaypenalty\@M \postdisplaypenalty\@M \interdisplaylinepenalty\@M \@beginparpenalty\@M @@ -7015,6 +7625,7 @@ Type H <return> for immediate help.}% \global\let\do\noexpand \UseOneTimeHook{begindocument/end}% \ignorespaces} +\let\do\noexpand \NewHook{begindocument} \NewHook{begindocument/before} \NewHook{begindocument/end} @@ -7159,21 +7770,24 @@ Type H <return> for immediate help.}% \set@curr@file{#1}% \expandafter\IfFileExists@\expandafter{\@curr@file}} \long\def \IfFileExists@#1#2#3{% - \openin\@inputcheck"#1" % - \ifeof\@inputcheck - \ifx\input@path\@undefined - \let\reserved@a\@secondoftwo + \edef\@filef@und{\IfFileExists@@{#1}}% + \ifx\@filef@und\@empty + \if\relax\detokenize{#1}\relax + \let\reserved@a\@firstoftwo + \def\@filef@und{".tex" }% \else - \def\reserved@a{\@iffileonpath{#1}}% + \let\reserved@a\@secondoftwo \fi \else - \closein\@inputcheck - \edef\@filef@und{"#1" }% \let\reserved@a\@firstoftwo + \edef\@filef@und{"\@filef@und" }% \fi \expandafter\def\expandafter\reserved@a \expandafter{\reserved@a{#2}{#3}}% \reserved@a} +\ExplSyntaxOn +\cs_new_eq:NN \IfFileExists@@ \file_full_name:n +\ExplSyntaxOff \long\def\@iffileonpath#1{% \let\reserved@a\@secondoftwo \expandafter\@tfor\expandafter\reserved@b\expandafter @@ -7923,6 +8537,11 @@ Type H <return> for immediate help.}% {\@nomath\mathversion \expandafter\ifx\csname mv@#1\endcsname\relax \@latex@error{Math version `#1' is not defined}\@eha\else + \ifcsname mv@\math@version @frozen\endcsname + \expandafter\let + \csname mv@\math@version @frozen\expandafter\endcsname + \csname mv@\math@version\endcsname + \fi \edef\math@version{#1}% \gdef\glb@currsize{}% \aftergroup\glb@settings @@ -11168,11 +11787,13 @@ Type H <return> for immediate help.}% \@latex@warning{Reference `#3' on page \thepage \space undefined}% \else - \expandafter#2#1\null + \expandafter#2#1\@empty\@empty\@empty\null \fi} -\def\@kernel@sref#1{\expandafter\@setref\csname r@#1\endcsname\@firstoftwo{#1}} +\long\def\@firstoffive#1#2#3#4#5{#1} +\long\def\@secondoffive#1#2#3#4#5{#2} +\def\@kernel@sref#1{\expandafter\@setref\csname r@#1\endcsname\@firstoffive{#1}} \def\@kernel@spageref#1{\expandafter\@setref\csname r@#1\endcsname - \@secondoftwo{#1}} + \@secondoffive{#1}} \let\@kernel@ref\@kernel@sref \let\@kernel@pageref\@kernel@spageref \NewDocumentCommand\ref{s} @@ -11193,9 +11814,17 @@ Type H <return> for immediate help.}% \def\newlabel{\@newl@bel r} \@onlypreamble\@newl@bel \let \@multiplelabels \relax +\providecommand\@currentlabelname{} +\providecommand\@currentHref{} +\providecommand\@kernel@reserved@label@data{} +\NewHookWithArguments{label}{1} \def\label#1{\@bsphack + \begingroup + \UseHookWithArguments{label}{1}{#1}% \protected@write\@auxout{}% - {\string\newlabel{#1}{{\@currentlabel}{\thepage}}}% + {\string\newlabel{#1}{{\@currentlabel}{\thepage}% + {\@currentlabelname}{\@currentHref}{\@kernel@reserved@label@data}}}% + \endgroup \@esphack} \def\@currentcounter{} \def\refstepcounter#1{\stepcounter{#1}% @@ -11246,6 +11875,13 @@ Type H <return> for immediate help.}% \NewHook{enddocument/end} \AddToHook{enddocument/info}[kernel/filelist]{\@dofilelist} \AddToHook{enddocument/info}[kernel/warnings]{\@enddocument@kernel@warnings} +\AddToHook{enddocument/info}[kernel/release]{% + \let\show@release@info\wlog + \show@release@info{ ***********}% + \the\LaTeXReleaseInfo + \show@release@info{ ***********}} + +\DeclareHookRule{enddocument/info}{kernel/release}{before}{kernel/filelist} \DeclareHookRule{enddocument/info}{kernel/filelist}{before}{kernel/warnings} \def\@enddocument@kernel@warnings{% \ifdim \font@submax >\fontsubfuzz\relax @@ -11751,6 +12387,10 @@ Type H <return> for immediate help.}% \ifx\mathdefaultsmode\@undefined\else \mathdefaultsmode=1 \fi +\let\@kernel@eqno\eqno +\let\@kernel@leqno\leqno +\protected\def\eqno{\@kernel@eqno\aftergroup\ignorespaces} +\protected\def\leqno{\@kernel@leqno\aftergroup\ignorespaces} %%% From File: ltlists.dtx \newskip\topsep \newskip\partopsep @@ -13690,7 +14330,9 @@ Type H <return> for immediate help.}% \def\@cite#1#2{[{#1\if@tempswa , #2\fi}]} \let\@cite@ofmt\hbox \def\@biblabel#1{[#1]} -%% File: ltmarks.dtx (C) Copyright 2022 +%% File: ltmarks.dtx +%% Copyright (C) 2022-2023 +%% Frank Mittelbach, The LaTeX Project %%% From File: ltmarks.dtx \def\ltmarksversion{v1.0d} \def\ltmarksdate{2022/06/01} @@ -14177,6 +14819,7 @@ Type H <return> for immediate help.}% \def\IfFormatAtLeastTF{\@ifl@t@r\fmtversion} \let\IfPackageAtLeastTF\@ifpackagelater \let\IfClassAtLeastTF\@ifclasslater +\def\IfFileAtLeastTF#1{\expandafter\@ifl@t@r\csname ver@#1\endcsname} \def\@ifl@ter#1#2{% \expandafter\@ifl@t@r \csname ver@#2.#1\endcsname} @@ -14686,7 +15329,7 @@ Type H <return> for immediate help.}% \csname filec@ntents@\reserved@a\endcsname \else \@latex@error{Unknown filecontents option \reserved@a}% - {Valid options are force (or overwrite), nosearch, noheader}% + {Valid options are force (or overwrite), nosearch, noheader, nowarn}% \fi}% \filec@ntents } @@ -14698,6 +15341,10 @@ Type H <return> for immediate help.}% \def\filec@ntents@where{in current directory}} \let\filec@ntents@checkdir\@empty \def\filec@ntents@where{exists on the system} +\def\filec@ntents@nowarn{% + \let\filec@ntents@warning\@latex@note@no@line +} +\let\filec@ntents@warning\@latex@warning@no@line \begingroup% \@tempcnta=1 \loop @@ -14742,8 +15389,8 @@ Type H <return> for immediate help.}% write to the file you are reading from!\MessageBreak% Data is written to screen instead.}% \else% - \@latex@warning@no@line% - {Writing or overwriting file `\@currdir\@curr@file'}% + \filec@ntents@warning% + {Writing or overwriting file `\@curr@file'}% \immediate\openout\reserved@c\q@curr@file\relax% \fi% \fi% @@ -15216,8 +15863,8 @@ Type H <return> for immediate help.}% { \__keys_options_expand_module:Nn \keys_set:nn {#1} {#2} } \ExplSyntaxOff %%% From File: ltfilehook.dtx -\providecommand\ltfilehookversion{v1.0n} -\providecommand\ltfilehookdate{2022/08/18} +\providecommand\ltfilehookversion{v1.0o} +\providecommand\ltfilehookdate{2023/04/02} \ExplSyntaxOn \tl_new:N \CurrentFile \tl_new:N \CurrentFilePath @@ -15386,7 +16033,7 @@ Type H <return> for immediate help.}% \def\@kernel@make@file@csname#1#2#3{% \xdef#1{\expandafter\@set@curr@file@aux \csname\expandafter#2\@firstofone#3\@nil\endcsname}} -\def\@set@curr@file@aux#1{% +\long\def\@set@curr@file@aux#1{% \expandafter\ifx\csname\endcsname#1% .tex\else\string#1\fi} \def\@filehook@set@CurrentFile{% @@ -15504,12 +16151,12 @@ Type H <return> for immediate help.}% \declare@file@substitution{atveryend.sty}{atveryend-ltx.sty} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% -%% Copyright (C) 2020-2022 -%% Frank Mittelbach, LaTeX Team +%% Copyright (C) 2020-2023 +%% Frank Mittelbach, The LaTeX Project %% %%% From File: ltshipout.dtx -\providecommand\ltshipoutversion{v1.0m} -\providecommand\ltshipoutdate{2022/08/26} +\providecommand\ltshipoutversion{v1.0n} +\providecommand\ltshipoutdate{2022/11/08} \ExplSyntaxOn \bool_new:N \g__shipout_debug_bool \cs_new_eq:NN \__shipout_debug:n \use_none:n @@ -15623,6 +16270,7 @@ Type H <return> for immediate help.}% \bool_gset_true:N \g__shipout_lastpage_handled_bool } } + \hook_use:n {shipout} \__shipout_finalize_box: \cs_set_eq:NN \protect \exp_not:N \tex_shipout:D \box_use:N \l_shipout_box @@ -15654,6 +16302,7 @@ Type H <return> for immediate help.}% \cs_gset_eq:NN \RawShipout \__shipout_execute_raw: \cs_new_eq:NN \__shipout_saved_protect: \protect \hook_new:n{shipout/before} +\hook_new:n{shipout} \hook_new:n{shipout/after} \hook_new:n{shipout/foreground} \hook_new:n{shipout/background} @@ -17350,6 +17999,17 @@ Type H <return> for immediate help.}% \lccode`\^^[=`\^^[ % oe in OT1 \fi % End of reset block for 8-bit engines \ExplSyntaxOn +\newcommand*\BCPdata[1]{ + \str_case:nn {#1} + { + { language } { en } + { region } { US } + { script } { Latn } + { tag } { en-US } + } +} +\ExplSyntaxOff +\ExplSyntaxOn \keys_define:nn { __kernel } { lang .str_set:N = \reserved@a , @@ -17359,26 +18019,17 @@ Type H <return> for immediate help.}% { \cs_set_nopar:Npn \reserved@a { } \tl_if_blank:nTF {#2} - { \@@text@case@aux@ } - { \keys_set:nn { __kernel } {#2} } - \use:c { text_ #1 case:Vn } \reserved@a {#3} - } -\cs_new_protected:Npn \@@text@case@aux@ { } -\tl_gput_right:Nn \@kernel@after@begindocument - { - \@ifpackageloaded { babel } { - \@ifpackagelater { babel } { 2020-01-15 } + \str_set:Nx \reserved@a + { \BCPdata { casing } } + \str_if_empty:NT \reserved@a { - \cs_gset_protected:Npn \@@text@case@aux@ - { - \str_set:Nx \reserved@a - { \localeinfo* { tag.bcp47 } } - } + \str_set:Nx \reserved@a + { \BCPdata { language } } } - { } } - { } + { \keys_set:nn { __kernel } {#2} } + \use:c { text_ #1 case:Vn } \reserved@a {#3} } \exp_args_generate:n { cnx } \cs_set_protected:Npn \reserved@a #1 @@ -17393,26 +18044,20 @@ Type H <return> for immediate help.}% \reserved@a { Lower } \reserved@a { Title } \cs_new_protected:cpn { MakeLowercase \c_space_tl \c_space_tl \c_space_tl } [#1] #2 - { - \let \kernel@saved@OE \OE + {{ \let \OE \oe \@@text@case@aux { lower } {#1} {#2} - \let \OE \kernel@saved@OE - } + }} \cs_new_protected:cpn { MakeUppercase \c_space_tl \c_space_tl \c_space_tl } [#1] #2 - { - \let \kernel@saved@oe \oe + {{ \let \oe \OE \@@text@case@aux { upper } {#1} {#2} - \let \oe \kernel@saved@oe - } + }} \cs_new_protected:cpn { MakeTitlecase \c_space_tl \c_space_tl \c_space_tl } [#1] #2 - { - \let \kernel@saved@oe \oe + {{ \let \oe \OE \@@text@case@aux { title } {#1} {#2} - \let \oe \kernel@saved@oe - } + }} \cs_new_protected_nopar:Npn\AddToNoCaseChangeList {\tl_put_right:Nn \l_text_case_exclude_arg_tl} \AddToNoCaseChangeList{ \NoCaseChange } @@ -17420,6 +18065,27 @@ Type H <return> for immediate help.}% \cs_new_eq:NN \CaseSwitch \text_case_switch:nnnn \cs_new_eq:NN \DeclareCaseChangeEquivalent \text_declare_case_equivalent:Nn +\NewDocumentCommand \DeclareLowercaseMapping { o m m } + { + \IfNoValueTF {#1} + { \text_declare_lowercase_mapping:nn } + { \text_declare_lowercase_mapping:nnn {#1} } + {#2} {#3} + } +\NewDocumentCommand \DeclareTitlecaseMapping { o m m } + { + \IfNoValueTF {#1} + { \text_declare_titlecase_mapping:nn } + { \text_declare_titlecase_mapping:nnn {#1} } + {#2} {#3} + } +\NewDocumentCommand \DeclareUppercaseMapping { o m m } + { + \IfNoValueTF {#1} + { \text_declare_uppercase_mapping:nn } + { \text_declare_uppercase_mapping:nnn {#1} } + {#2} {#3} + } \ExplSyntaxOff \def\@uclclist{\oe\OE\o\O\ae\AE \dh\DH\dj\DJ\l\L\ng\NG\ss\SS\ij\IJ\th\TH} |