summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/base/latex.ltx
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/latex/base/latex.ltx')
-rw-r--r--Master/texmf-dist/tex/latex/base/latex.ltx1204
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}