diff options
Diffstat (limited to 'Master/texmf-dist/tex/latex-dev/base/latex.ltx')
-rw-r--r-- | Master/texmf-dist/tex/latex-dev/base/latex.ltx | 576 |
1 files changed, 418 insertions, 158 deletions
diff --git a/Master/texmf-dist/tex/latex-dev/base/latex.ltx b/Master/texmf-dist/tex/latex-dev/base/latex.ltx index f3a554ce25c..52ab96c7ab0 100644 --- a/Master/texmf-dist/tex/latex-dev/base/latex.ltx +++ b/Master/texmf-dist/tex/latex-dev/base/latex.ltx @@ -55,7 +55,7 @@ %% (but please observe conditions on bug reports sent to that address!) %% %% -%% Copyright (C) 1993-2020 +%% Copyright (C) 1993-2021 %% The LaTeX3 Project and any individual authors listed elsewhere %% in this file. %% @@ -710,7 +710,7 @@ \def\fmtname{LaTeX2e} \edef\fmtversion {2021-05-01} -\def\patch@level{0} +\def\patch@level{-1} \edef\development@branch@name{develop \the\year-\the\month-\the\day} \iffalse \def\reserved@a#1/#2/#3\@nil{% @@ -988,6 +988,8 @@ } \fi %%% From File: ltexpl.dtx +\let\@kernel@after@enddocument\@empty +\let\@kernel@after@enddocument@afterlastpage\@empty \def\@expl@sys@load@backend@@{} \def\@expl@push@filename@@{} \def\@expl@push@filename@aux@@{} @@ -1625,11 +1627,11 @@ \xdef#1{\the\toks@}% \endgroup} %% -%% File: lthooks.dtx (C) Copyright 2020 Frank Mittelbach, +%% File: lthooks.dtx (C) Copyright 2020,2021 Frank Mittelbach, %% Phelype Oleinik & LaTeX Team %%% From File: lthooks.dtx -\def\lthooksversion{v1.0e} -\def\lthooksdate{2020/10/23} +\def\lthooksversion{v1.0h} +\def\lthooksdate{2021/01/07} \ExplSyntaxOn \bool_new:N \g__hook_debug_bool \cs_new_eq:NN \__hook_debug:n \use_none:n @@ -1666,6 +1668,34 @@ \cs_generate_variant:Nn \tl_show:n { x } \cs_generate_variant:Nn \tl_log:n { x } \scan_new:N \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_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: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_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 @@ -1686,6 +1716,7 @@ \__hook_if_exist:nF {#1} { \prop_new:c { g__hook_#1_code_prop } + \tl_new:c { __hook_toplevel~#1 } \tl_new:c { __hook_next~#1 } } } @@ -1700,59 +1731,58 @@ { \hook_new:n {#1} \hook_new_reversed:n {#2} } \cs_new_protected:Npn \__hook_include_legacy_code_chunk:n #1 { - \debug_suspend: \tl_if_exist:cT { @#1hook } { \tl_if_empty:cF { @#1hook } { \exp_args:Nnnv \__hook_hook_gput_code_do:nnn {#1} { legacy } { @#1hook } - \tl_gclear:c { @#1hook } + \__hook_tl_gclear:c { @#1hook } } } - \debug_resume: } \cs_new:Npn \__hook_parse_label_default:n #1 { \tl_if_novalue:nTF {#1} - { \__hook_currname_or_default:n { top-level } } - { - \tl_trim_spaces_apply:nN {#1} - \__hook_parse_dot_label:nn { top-level } - } + { \__hook_currname_or_default: } + { \tl_trim_spaces_apply:nN {#1} \__hook_parse_dot_label:n } } -\cs_new:Npn \__hook_parse_dot_label:nn #1 #2 +\cs_new:Npn \__hook_parse_dot_label:n #1 { \tl_if_empty:nTF {#1} { - \msg_expandable_error:nnn { hooks } { empty-label } {#2} - #2 + \msg_expandable_error:nn { hooks } { empty-label } + \__hook_currname_or_default: } { \str_if_eq:nnTF {#1} { . } - { \__hook_currname_or_default:n {#2} } - { \__hook_parse_dot_label:nw {#2} #1 ./ \s__hook_mark } + { \__hook_currname_or_default: } + { \__hook_parse_dot_label:w #1 ./ \s__hook_mark } } } -\cs_new:Npn \__hook_parse_dot_label:nw #1 #2 ./ #3 \s__hook_mark +\cs_new:Npn \__hook_parse_dot_label:w #1 ./ #2 \s__hook_mark { - \tl_if_empty:nTF {#2} - { \__hook_parse_dot_label_aux:nw {#1} #3 \s__hook_mark } + \tl_if_empty:nTF {#1} + { \__hook_parse_dot_label_aux:w #2 \s__hook_mark } { - \tl_if_empty:nTF {#3} - { \__hook_make_name:n {#2} } - { \__hook_parse_dot_label_cleanup:w #2 ./ #3 \s__hook_mark } + \tl_if_empty:nTF {#2} + { \__hook_make_name:n {#1} } + { \__hook_parse_dot_label_cleanup:w #1 ./ #2 \s__hook_mark } } } \cs_new:Npn \__hook_parse_dot_label_cleanup:w #1 ./ \s__hook_mark {#1} -\cs_new:Npn \__hook_parse_dot_label_aux:nw #1 #2 ./ \s__hook_mark - { \__hook_currname_or_default:n {#1} / \__hook_make_name:n {#2} } -\cs_new:Npn \__hook_currname_or_default:n #1 +\cs_new:Npn \__hook_parse_dot_label_aux:w #1 ./ \s__hook_mark + { \__hook_currname_or_default: / \__hook_make_name:n {#1} } +\cs_new:Npn \__hook_currname_or_default: { \tl_if_empty:NTF \g__hook_hook_curr_name_tl { \tl_if_empty:NTF \@currname - { \__hook_make_name:n {#1} } + { + \msg_expandable_error:nnn { hooks } { should-not-happen } + { Empty~default~label. } + \__hook_make_name:n { label-missing } + } { \@currname } } { \g__hook_hook_curr_name_tl } @@ -1822,12 +1852,23 @@ \hook_if_exist:nF {#1} { undeclared~ } hook~ #1~ (#2) \on@line\space <-~ \tl_to_str:n{#3}} } - \prop_get:cnNTF { g__hook_#1_code_prop } {#2} \l__hook_return_tl + \str_if_eq:nnTF {#2} { top-level } { - \prop_gput:cno { g__hook_#1_code_prop } {#2} - { \l__hook_return_tl #3 } + \str_if_eq:eeTF { top-level } { \__hook_currname_or_default: } + { + \__hook_declare:n {#1} + \__hook_tl_gput_right:cn { __hook_toplevel~#1 } {#3} + } + { \msg_error:nnn { hooks } { misused-top-level } {#1} } + } + { + \prop_get:cnNTF { g__hook_#1_code_prop } {#2} \l__hook_return_tl + { + \prop_gput:cno { g__hook_#1_code_prop } {#2} + { \l__hook_return_tl #3 } + } + { \prop_gput:cnn { g__hook_#1_code_prop } {#2} {#3} } } - { \prop_gput:cnn { g__hook_#1_code_prop } {#2} {#3} } } \cs_new_protected:Npn \__hook_gput_undeclared_hook:nnn #1 #2 #3 { @@ -1900,11 +1941,11 @@ { \__hook_strip_double_slash:n {#1} } \cs_new:Npn \__hook_strip_double_slash:n #1 { \__hook_strip_double_slash:w #1 // \s__hook_mark } -\cs_new:Npn \__hook_strip_double_slash:w #1 // #2 \s__hook_mark +\cs_new:Npn \__hook_strip_double_slash:w #1/#2/#3 // #4 \s__hook_mark { - \tl_if_empty:nTF {#2} - {#1} - { \__hook_strip_double_slash:w #1 / #2 \s__hook_mark } + \tl_if_empty:nTF {#4} + { #1/#2/#3 } + { \__hook_strip_double_slash:w #1/#2/#3 / #4 \s__hook_mark } } \prop_const_from_keyval:Nn \c__hook_generics_prop {env=,file=,package=,class=,include=} @@ -1918,12 +1959,20 @@ \__hook_if_exist:nTF {#1} { \str_if_eq:nnTF {#2} {*} - { \prop_gclear:c { g__hook_#1_code_prop } } { - \prop_get:cnNTF { g__hook_#1_code_prop } {#2} \l__hook_return_tl - { \__hook_gremove_code_do:nn } - { \__hook_mark_removal:nn } - {#1} {#2} + \prop_gclear:c { g__hook_#1_code_prop } + \__hook_tl_gclear:c { __hook_toplevel~#1 } + \__hook_tl_gclear:c { __hook_next~#1 } + } + { + \str_if_eq:nnTF {#2} { top-level } + { \__hook_tl_gclear:c { __hook_toplevel~#1 } } + { + \prop_get:cnNTF { g__hook_#1_code_prop } {#2} \l__hook_return_tl + { \__hook_gremove_code_do:nn } + { \__hook_mark_removal:nn } + {#1} {#2} + } } \hook_if_exist:nT {#1} { \__hook_update_hook_code:n {#1} } @@ -1962,7 +2011,6 @@ { \__hook_declare:n {#1} \__hook_rule_gclear:nnn {#1} {#2} {#4} - \debug_suspend: \cs_if_exist_use:cTF { __hook_rule_#3_gset:nnn } { {#1} {#2} {#4} @@ -1970,29 +2018,28 @@ } { \msg_error:nnnnnn { hooks } { unknown-rule } {#1} {#2} {#3} {#4} } - \debug_resume: } \cs_new_protected:Npn \__hook_rule_before_gset:nnn #1#2#3 { - \tl_gset:cx { g__hook_#1_rule_ \__hook_label_pair:nn {#2} {#3} _tl } + \__hook_tl_gset:cx { g__hook_#1_rule_ \__hook_label_pair:nn {#2} {#3} _tl } { \__hook_label_ordered:nnTF {#2} {#3} { < } { > } } } \cs_new_eq:cN { __hook_rule_<_gset:nnn } \__hook_rule_before_gset:nnn \cs_new_protected:Npn \__hook_rule_after_gset:nnn #1#2#3 { - \tl_gset:cx { g__hook_#1_rule_ \__hook_label_pair:nn {#3} {#2} _tl } + \__hook_tl_gset:cx { g__hook_#1_rule_ \__hook_label_pair:nn {#3} {#2} _tl } { \__hook_label_ordered:nnTF {#3} {#2} { < } { > } } } \cs_new_eq:cN { __hook_rule_>_gset:nnn } \__hook_rule_after_gset:nnn \cs_new_protected:Npn \__hook_rule_voids_gset:nnn #1#2#3 { - \tl_gset:cx { g__hook_#1_rule_ \__hook_label_pair:nn {#2} {#3} _tl } + \__hook_tl_gset:cx { g__hook_#1_rule_ \__hook_label_pair:nn {#2} {#3} _tl } { \__hook_label_ordered:nnTF {#2} {#3} { -> } { <- } } } \cs_new_protected:cpn { __hook_rule_incompatible-error_gset:nnn } #1#2#3 - { \tl_gset:cn { g__hook_#1_rule_ \__hook_label_pair:nn {#2} {#3} _tl } { xE } } + { \__hook_tl_gset:cn { g__hook_#1_rule_ \__hook_label_pair:nn {#2} {#3} _tl } { xE } } \cs_new_protected:cpn { __hook_rule_incompatible-warning_gset:nnn } #1#2#3 - { \tl_gset:cn { g__hook_#1_rule_ \__hook_label_pair:nn {#2} {#3} _tl } { xW } } + { \__hook_tl_gset:cn { g__hook_#1_rule_ \__hook_label_pair:nn {#2} {#3} _tl } { xW } } \cs_new_protected:Npn \__hook_rule_unrelated_gset:nnn #1#2#3 { } \cs_new_protected:Npn \__hook_rule_gclear:nnn #1#2#3 { \cs_undefine:c { g__hook_#1_rule_ \__hook_label_pair:nn {#2} {#3} _tl } } @@ -2039,30 +2086,32 @@ } \cs_new_protected:Npn \__hook_initialize_hook_code:n #1 { - \debug_suspend: \__hook_debug:n{ \iow_term:x{^^JUpdate~ code~ for~ hook~ '#1' \on@line :^^J} } \__hook_include_legacy_code_chunk:n {#1} \hook_if_exist:nT {#1} { \prop_if_empty:cTF {g__hook_#1_code_prop} - { \tl_gset:co { __hook~#1 } - { \cs:w __hook_next~#1 \cs_end: } } + { + \__hook_tl_gset:co { __hook~#1 } + { + \cs:w __hook_toplevel~#1 \exp_after:wN \cs_end: + \cs:w __hook_next~#1 \cs_end: + } + } { \__hook_if_reversed:nTF {#1} - { \cs_set_eq:NN \__hook_tl_gput:NV \tl_gput_left:NV + { \cs_set_eq:NN \__hook_tl_gput:Nn \__hook_tl_gput_left:Nn \cs_set_eq:NN \__hook_clist_gput:NV \clist_gput_left:NV } - { \cs_set_eq:NN \__hook_tl_gput:NV \tl_gput_right:NV + { \cs_set_eq:NN \__hook_tl_gput:Nn \__hook_tl_gput_right:Nn \cs_set_eq:NN \__hook_clist_gput:NV \clist_gput_right:NV } \prop_set_eq:Nc \l__hook_work_prop { g__hook_#1_code_prop } - \__hook_initialize_single:cccn - { __hook~#1 } { __hook_next~#1 } - { g__hook_#1_labels_clist } {#1} + \__hook_initialize_single:ccn + { __hook~#1 } { g__hook_#1_labels_clist } {#1} \__hook_debug:n{ \exp_args:NNx \prop_gput:Nnn \g__hook_used_prop {#1}{} } } } - \debug_resume: } \cs_new:Npn \__hook_tl_csname:n #1 { l__hook_label_#1_tl } \cs_new:Npn \__hook_seq_csname:n #1 { l__hook_label_#1_seq } @@ -2071,16 +2120,16 @@ \tl_new:N \l__hook_front_tl \tl_new:N \l__hook_rear_tl \tl_new:c { \__hook_tl_csname:n { 0 } } -\cs_new_protected:Npn \__hook_initialize_single:NNNn #1#2#3#4 +\cs_new_protected:Npn \__hook_initialize_single:NNn #1#2#3 { \seq_clear:N \l__hook_labels_seq \int_zero:N \l__hook_labels_int - \tl_set:Nn \l__hook_cur_hook_tl {#4} + \tl_set:Nn \l__hook_cur_hook_tl {#3} \prop_map_inline:Nn \l__hook_work_prop { \int_incr:N \l__hook_labels_int \seq_put_right:Nn \l__hook_labels_seq {##1} - \tl_set:cn { \__hook_tl_csname:n {##1} }{0} + \__hook_tl_set:cn { \__hook_tl_csname:n {##1} } { 0 } \seq_clear_new:c { \__hook_seq_csname:n {##1} } } \prop_map_inline:Nn \l__hook_work_prop @@ -2091,7 +2140,7 @@ { \prop_map_break: } { \__hook_apply_label_pair:nnn {##1} {####1} } { \__hook_apply_label_pair:nnn {####1} {##1} } - {#4} + {#3} } } \__hook_debug:n { \__hook_debug_label_data:N \l__hook_work_prop } @@ -2106,14 +2155,14 @@ } } \tl_set_eq:Nc \l__hook_front_tl { \__hook_tl_csname:n { 0 } } - \tl_gclear:N #1 - \clist_gclear:N #3 + \__hook_tl_gclear:N #1 + \clist_gclear:N #2 \bool_while_do:nn { ! \str_if_eq_p:Vn \l__hook_front_tl { 0 } } { \int_decr:N \l__hook_labels_int \prop_get:NVN \l__hook_work_prop \l__hook_front_tl \l__hook_return_tl - \__hook_tl_gput:NV #1 \l__hook_return_tl - \__hook_clist_gput:NV #3 \l__hook_front_tl + \exp_args:NNV \__hook_tl_gput:Nn #1 \l__hook_return_tl + \__hook_clist_gput:NV #2 \l__hook_front_tl \__hook_debug:n{ \iow_term:x{Handled~ code~ for~ \l__hook_front_tl} } \seq_map_inline:cn { \__hook_seq_csname:n { \l__hook_front_tl } } { @@ -2138,11 +2187,12 @@ \__hook_debug_label_data:N \l__hook_work_prop \iow_term:x{====================} } - \tl_gput_right:Nn #1 {#2} + \exp_args:NNo \__hook_tl_gput:Nn #1 { \cs:w __hook_toplevel~#3 \cs_end: } + \__hook_tl_gput_right:No #1 { \cs:w __hook_next~#3 \cs_end: } } -\cs_generate_variant:Nn \__hook_initialize_single:NNNn {ccc} -\cs_new:Npn \__hook_tl_gput:NV {\ERROR} -\cs_new:Npn \__hook_clist_gput:NV {\ERROR} +\cs_generate_variant:Nn \__hook_initialize_single:NNn { cc } +\cs_new:Npn \__hook_tl_gput:Nn { \ERROR } +\cs_new:Npn \__hook_clist_gput:NV { \ERROR } \cs_new_protected:Npn \__hook_apply_label_pair:nnn #1#2#3 { \__hook_label_if_exist_apply:nnnF {#1} {#2} {#3} @@ -2261,7 +2311,8 @@ \__hook_log_cmd:x { ^^J ->~The~hook~'#1': } \hook_if_exist:nF {#1} { \__hook_log_line:x { is~not~declared! } } - \__hook_if_exist:nTF {#1} + \hook_if_empty:nTF {#1} + { #2 { The~hook~is~empty } } { \__hook_log_line:x { Code~chunks: } \prop_if_empty:cTF { g__hook_#1_code_prop } @@ -2270,7 +2321,19 @@ \prop_map_inline:cn { g__hook_#1_code_prop } { \__hook_log_line_indent:x { ##1~->~\tl_to_str:n {##2} } } } - \__hook_log_line:x { Extra~code~for~next~invocation:} + \__hook_log_line:x + { + Document-level~(top-level)~code + \hook_if_exist:nT {#1} + { ~(executed~\__hook_if_reversed:nTF {#1} {first} {last} ) } : + } + \__hook_log_line_indent:x + { + \tl_if_empty:cTF { __hook_toplevel~#1 } + { --- } + { -> ~ \exp_args:Nv \tl_to_str:n { __hook_toplevel~#1 } } + } + \__hook_log_line:x { Extra~code~for~next~invocation: } \__hook_log_line_indent:x { \tl_if_empty:cTF { __hook_next~#1 } @@ -2321,7 +2384,6 @@ } } } - { #2 { The~hook~is~empty. } } } \cs_new:Npn \__hook_log_next_code:n #1 { \exp_args:No \tl_to_str:n { \use_none:nn #1 } } @@ -2342,7 +2404,7 @@ } \cs_new_protected:Npn \__hook_list_one_rule:nnn #1#2#3 { - \__hook_list_if_rule_exists:nnnF {#1} {#2} {#3} { } + \__hook_list_if_rule_exists:nnnF {#1} {#2} {#3} { \__hook_list_if_rule_exists:nnnF {#1} {#2} { ?? } { } } } \cs_new_protected:Npn \__hook_list_if_rule_exists:nnnF #1#2#3 @@ -2350,7 +2412,9 @@ \if_cs_exist:w g__hook_ #3 _rule_ #1 | #2 _tl \cs_end: \exp_args:Nv \__hook_tmp:w { g__hook_ #3 _rule_ #1 | #2 _tl } { #1 | #2 } {#3} + \exp_after:wN \use_none:nn \fi: + \use:n } \cs_new_protected:Npn \__hook_debug_print_rules:n #1 { @@ -2372,12 +2436,10 @@ { \__hook_normalize_hook_args:Nn \__hook_gput_next_code:nn {#1} } \cs_new_protected:Npn \__hook_gput_next_code:nn #1 #2 { - \debug_suspend: \__hook_declare:n {#1} \hook_if_exist:nTF {#1} { \__hook_gput_next_do:nn {#1} {#2} } { \__hook_try_declaring_generic_next_hook:nn {#1} {#2} } - \debug_resume: } \cs_new_protected:Npn \__hook_gput_next_do:nn #1 { @@ -2389,8 +2451,8 @@ \tl_if_empty:cT { __hook~#2 } { \__hook_update_hook_code:n {#2} } \tl_if_empty:NT #1 - { \tl_gset:Nn #1 { \__hook_clear_next:n {#2} } } - \tl_gput_right:Nn #1 + { \__hook_tl_gset:Nn #1 { \__hook_clear_next:n {#2} } } + \__hook_tl_gput_right:Nn #1 } \cs_new_protected:Npn \__hook_clear_next:n #1 { \cs_gset_eq:cN { __hook_next~#1 } \c_empty_tl } @@ -2460,7 +2522,11 @@ { \bool_lazy_and:nnTF { \prop_if_empty_p:c { g__hook_#1_code_prop } } - { \tl_if_empty_p:c { __hook_next~#1 } } + { + \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: } } @@ -2502,7 +2568,15 @@ name.\\ Please~ use~ a~ different~ name~ for~ your~ hook.} \msg_new:nnn { hooks } { empty-label } - { Empty~code~label~\msg_line_context:.~Using~`#1'~instead. } + { + Empty~code~label~\msg_line_context:.~ + Using~`\__hook_currname_or_default:'~instead. + } +\msg_new:nnn { hooks } { no-default-label } + { + Missing~(empty)~default~label~\msg_line_context:. \\ + This~command~was~ignored. + } \msg_new:nnnn { hooks } { unknown-rule } { Unknown~ relationship~ `#3'~ between~ labels~ `#2'~ and~ `#4'~ @@ -2518,6 +2592,39 @@ `voids'~ or~ `unrelated'. } +\msg_new:nnnn { hooks } { misused-top-level } + { + Illegal~\iow_char:N \\AddToHook{#1}[top-level]{...}.\\ + 'top-level'~is~reserved~for~the~user's~document. + } + { + The~'top-level'~label~is~meant~for~user~code~only,~and~should~only~ + be~used~(sparingly)~in~the~main~document.~Use~the~default~label~ + '\__hook_currname_or_default:'~for~this~\@cls@pkg,~or~another~ + suitable~label. + } +\msg_new:nnn { hooks } { set-top-level } + { + You~cannot~change~the~default~label~#1~`top-level'.~Illegal \\ + \use:nn { ~ } { ~ } \iow_char:N \\#2{#3} \\ + \msg_line_context:. + } +\msg_new:nnn { hooks } { ddhl-deprecated } + { + \iow_char:N \\DeclareDefaultHookLabel~is~deprecated.\\ + Use~\iow_char:N \\SetDefaultHookLabel~instead.\\ \\ + The~deprecated~name~will~be~removed~in~the~next~release. + } +\msg_new:nnn { hooks } { extra-pop-label } + { + Extra~\iow_char:N \\PopDefaultHookLabel. \\ + This~command~will~be~ignored. + } +\msg_new:nnn { hooks } { missing-pop-label } + { + Missing~\iow_char:N \\PopDefaultHookLabel. \\ + The~label~`#1'~was~pushed~but~never~popped.~Something~is~wrong. + } \msg_new:nnn { hooks } { should-not-happen } { ERROR!~This~should~not~happen.~#1 \\ @@ -2532,26 +2639,75 @@ { \hook_gput_next_code:nn {#1} {#2} } \NewDocumentCommand \RemoveFromHook { m o } { \hook_gremove_code:nn {#1} {#2} } -\seq_gpush:Nn \g__hook_name_stack_seq { } +\tl_gset:Nn \g__hook_hook_curr_name_tl { top-level } \cs_new_protected:Npn \__hook_curr_name_push:n #1 + { \exp_args:Nx \__hook_curr_name_push_aux:n { \__hook_make_name:n {#1} } } +\cs_new_protected:Npn \__hook_curr_name_push_aux:n #1 { - \seq_gpush:Nn \g__hook_name_stack_seq {#1} - \tl_gset:Nn \g__hook_hook_curr_name_tl {#1} + \tl_if_blank:nTF {#1} + { \msg_error:nn { hooks } { no-default-label } } + { + \str_if_eq:nnTF {#1} { top-level } + { + \msg_error:nnnnn { hooks } { set-top-level } + { to } { PushDefaultHookLabel } {#1} + } + { + \seq_gpush:NV \g__hook_name_stack_seq \g__hook_hook_curr_name_tl + \tl_gset:Nn \g__hook_hook_curr_name_tl {#1} + } + } } \cs_new_protected:Npn \__hook_curr_name_pop: { - \seq_gpop:NN \g__hook_name_stack_seq \l__hook_return_tl - \seq_get:NNTF \g__hook_name_stack_seq \l__hook_return_tl + \seq_gpop:NNTF \g__hook_name_stack_seq \l__hook_return_tl { \tl_gset_eq:NN \g__hook_hook_curr_name_tl \l__hook_return_tl } + { \msg_error:nn { hooks } { extra-pop-label } } + } +\tl_gput_right:Nn \@kernel@after@enddocument@afterlastpage + { \__hook_end_document_label_check: } +\cs_new_protected:Npn \__hook_end_document_label_check: + { + \seq_gpop:NNT \g__hook_name_stack_seq \l__hook_return_tl { - \msg_error:nnn { hooks } { should-not-happen } - { Tried~to~pop~from~an~empty~default~label~stack. } + \msg_error:nnx { hooks } { missing-pop-label } + { \g__hook_hook_curr_name_tl } + \tl_gset_eq:NN \g__hook_hook_curr_name_tl \l__hook_return_tl + \__hook_end_document_label_check: } } +\NewDocumentCommand \SetDefaultHookLabel { m } + { + \seq_if_empty:NTF \g__hook_name_stack_seq + { + \msg_error:nnnnn { hooks } { set-top-level } + { for } { SetDefaultHookLabel } {#1} + } + { \exp_args:Nx \__hook_set_default_label:n { \__hook_make_name:n {#1} } } + } +\cs_new_protected:Npn \__hook_set_default_label:n #1 + { + \str_if_eq:nnTF {#1} { top-level } + { + \msg_error:nnnnn { hooks } { set-top-level } + { to } { SetDefaultHookLabel } {#1} + } + { \tl_gset:Nn \g__hook_hook_curr_name_tl {#1} } + } \NewDocumentCommand \DeclareDefaultHookLabel { m } { - \seq_gpop:NN \g__hook_name_stack_seq \l__hook_return_tl - \__hook_curr_name_push:n {#1} + \msg_error:nn { hooks } { ddhl-deprecated } + \SetDefaultHookLabel {#1} + } +\NewDocumentCommand \PushDefaultHookLabel { m } + { \__hook_curr_name_push:n {#1} } +\NewDocumentCommand \PopDefaultHookLabel { } + { \__hook_curr_name_pop: } +\cs_gset_protected:Npn \@expl@push@filename@aux@@ #1#2#3 + { + \__hook_curr_name_push:n {#3} + \str_gset:Nx \g_file_curr_name_str {#3} + #1 #2 {#3} } \cs_new:Npn \UseHook { \hook_use:n } \cs_new:Npn \UseOneTimeHook { \hook_use_once:n } @@ -2571,8 +2727,6 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 \cs_new_eq:NN \@expl@@@initialize@all@@ \__hook_initialize_all: -\cs_new_eq:NN \@expl@@@hook@curr@name@push@@n - \__hook_curr_name_push:n \cs_new_eq:NN \@expl@@@hook@curr@name@pop@@ \__hook_curr_name_pop: \ExplSyntaxOff @@ -4048,7 +4202,7 @@ Type H <return> for immediate help.}% \DeclareRobustCommand\fontfamily[1]{\edef\f@family{#1}} \DeclareRobustCommand\usefont[4]{\fontencoding{#1}% \edef\f@family{#2}% - \edef\f@series{#3}% + \set@target@series{#3}% \edef\f@shape{#4}\selectfont \ignorespaces} \DeclareRobustCommand\linespread[1] @@ -4715,12 +4869,14 @@ Type H <return> for immediate help.}% \DeclareFontSeriesChangeRule {ulx}{?m}{ul}{} \DeclareFontSeriesChangeRule {ul}{?m}{ul}{} \DeclareFontSeriesChangeRule {x}{?m}{m}{} - - +\DeclareRobustCommand\fontseries[1]{\@forced@seriesfalse + \expandafter\def\expandafter\delayed@f@adjustment\expandafter + {\delayed@f@adjustment\delayed@merge@font@series{#1}}} +\let\delayed@f@adjustment\@empty +\DeclareRobustCommand\fontseriesforce[1]{\@forced@seriestrue + \expandafter\def\expandafter\delayed@f@adjustment\expandafter + {\delayed@f@adjustment\edef\f@series{#1}}} \newif\if@forced@series -\DeclareRobustCommand\fontseriesforce[1]{\@forced@seriestrue\edef\f@series{#1}} -\DeclareRobustCommand\fontseries[1]{\@forced@seriesfalse\merge@font@series{#1}} - \def\merge@font@series#1{% \expandafter\expandafter\expandafter \merge@font@series@ @@ -4728,13 +4884,11 @@ Type H <return> for immediate help.}% {#1}% \@nil } - \def\merge@font@series@#1#2#3\@nil{% \def\reserved@a{#3}% \ifx\reserved@a\@empty \set@target@series{#2}% \else - \maybe@load@fontshape \edef\reserved@a{\f@encoding /\f@family /#1/\f@shape}% \ifcsname \reserved@a \endcsname \set@target@series{#1}% @@ -4756,8 +4910,27 @@ Type H <return> for immediate help.}% using `\reserved@b' instead}% \fi } -\def\maybe@load@fontshape{\begingroup\try@load@fontshape\endgroup} -\DeclareFontSeriesChangeRule {m}{sc}{msc}{mc} +\def\merge@font@series@without@substitution#1{% + \expandafter\expandafter\expandafter + \merge@font@series@without@substitution@ + \csname series@\f@series @#1\endcsname + {#1}% + \@nil +} +\def\merge@font@series@without@substitution@#1#2#3\@nil{% + \def\reserved@a{#3}% + \ifx\reserved@a\@empty + \set@target@series{#2}% + \else + \set@target@series{#1}% + \fi +} +\let\delayed@merge@font@series\merge@font@series@without@substitution +\def\maybe@load@fontshape{% + \begingroup + \let \typeout \@font@info + \try@load@fontshape + \endgroup} \def\set@target@series#1{% \edef\f@series{#1}% \series@maybe@drop@one@m\f@series\f@series @@ -4836,8 +5009,13 @@ Type H <return> for immediate help.}% \DeclareFontShapeChangeRule {sw}{sc} {scsw} {} \DeclareFontShapeChangeRule {sw}{ulc} {sw} {} \DeclareFontShapeChangeRule {sw}{up} {n} {} -\DeclareRobustCommand\fontshape[1]{\merge@font@shape{#1}} -\DeclareRobustCommand\fontshapeforce[1]{\edef\f@shape{#1}} +\DeclareRobustCommand\fontshape[1] + {\expandafter\def\expandafter\delayed@f@adjustment\expandafter + {\delayed@f@adjustment\delayed@merge@font@shape{#1}}} +\DeclareRobustCommand\fontshapeforce[1] + {\expandafter\def\expandafter\delayed@f@adjustment\expandafter + {\delayed@f@adjustment\edef\f@shape{#1}}} + \def\merge@font@shape#1{% \expandafter\expandafter\expandafter \merge@font@shape@ @@ -4851,9 +5029,8 @@ Type H <return> for immediate help.}% \ifx\reserved@a\@empty \edef\f@shape{#2}% \else - \maybe@load@fontshape \edef\reserved@a{\f@encoding /\f@family /\f@series/#1}% - \ifcsname \reserved@a\endcsname + \ifcsname \reserved@a\endcsname \edef\f@shape{#1}% \else \ifcsname \f@encoding /\f@family /\f@series/#2\endcsname @@ -4866,6 +5043,22 @@ Type H <return> for immediate help.}% \fi \fi } +\def\merge@font@shape@without@substitution#1{% + \expandafter\expandafter\expandafter + \merge@font@shape@without@substitution@ + \csname shape@\f@shape @#1\endcsname + {#1}% + \@nil +} +\def\merge@font@shape@without@substitution@#1#2#3\@nil{% + \def\reserved@a{#3}% + \ifx\reserved@a\@empty + \edef\f@shape{#2}% + \else + \edef\f@shape{#1}% + \fi +} +\let\delayed@merge@font@shape\merge@font@shape@without@substitution \protected\def\normalshape {\not@math@alphabet\normalshape\relax \fontshape\shapedefault\selectfont}% @@ -4892,6 +5085,7 @@ Type H <return> for immediate help.}% {\not@math@alphabet\sscshape\relax \fontshape\sscdefault\selectfont}% } +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \g@addto@macro\@kernel@after@begindocument@before {\reinstall@nfss@defs\init@series@setup} %%% From File: ltfsstrc.dtx @@ -4930,17 +5124,38 @@ Type H <return> for immediate help.}% \get@external@font \fi\fi } + \DeclareRobustCommand\selectfont {% \ifx\f@linespread\baselinestretch \else \set@fontsize\baselinestretch\f@size\f@baselineskip \fi + \ifx\delayed@f@adjustment\@empty + \else + \let\f@shape@saved\f@shape + \let\f@series@saved\f@series + \delayed@f@adjustment + \maybe@load@fontshape + \ifcsname \f@encoding/\f@family/\f@series/\f@shape \endcsname + \else + \let\f@shape\f@shape@saved + \let\f@series\f@series@saved + \let\delayed@merge@font@shape\merge@font@shape + \let\delayed@merge@font@series\merge@font@series + \delayed@f@adjustment + \let\delayed@merge@font@shape\merge@font@shape@without@substitution + \let\delayed@merge@font@series\merge@font@series@without@substitution + \fi + \let\delayed@f@adjustment\@empty + \fi \xdef\font@name{% \csname\curr@fontshape/\f@size\endcsname}% \pickup@font \font@name + \UseHook{selectfont}% \size@update \enc@update } +\NewHook{selectfont} \def\set@fontsize#1#2#3{% \@defaultunits\@tempdimb#2pt\relax\@nnil \edef\f@size{\strip@pt\@tempdimb}% @@ -6389,8 +6604,8 @@ Type H <return> for immediate help.}% %% overwrite it in fontdef.cfg %% if necessary \fontfamily{cmr} -\fontseries{m} -\fontshape{n} +\def\f@series{m} % \fontseries{m} +\def\f@shape{n} % \fontshape{n} \fontsize{10}{10} \def\@fontenc@load@list{\@elt{T1,OT1}} \InputIfFileExists{fonttext.cfg} @@ -7126,6 +7341,7 @@ Type H <return> for immediate help.}% \@ignorefalse \let\ignorespacesafterend\@ignoretrue \def\enddocument{% + \@kernel@before@enddocument \UseOneTimeHook{enddocument}% \@kernel@after@enddocument \@checkend{document}% @@ -7153,8 +7369,6 @@ Type H <return> for immediate help.}% \AddToHook{enddocument/info}[kernel/filelist]{\@dofilelist} \AddToHook{enddocument/info}[kernel/warnings]{\@enddocument@kernel@warnings} \DeclareHookRule{enddocument/info}{kernel/filelist}{before}{kernel/warnings} -\let\@kernel@after@enddocument\@empty -\let\@kernel@after@enddocument@afterlastpage\@empty \def\@enddocument@kernel@warnings{% \ifdim \font@submax >\fontsubfuzz\relax \@font@warning{Size substitutions with differences\MessageBreak @@ -7177,6 +7391,7 @@ Type H <return> for immediate help.}% \fi \fi } +\def\@kernel@before@enddocument{\par} \def\@testdef #1#2#3{% \def\reserved@a{#3}\expandafter \ifx \csname #1@#2\endcsname \reserved@a \else \@tempswatrue \fi} @@ -9559,8 +9774,7 @@ Type H <return> for immediate help.}% \@ifundefined{b@\@citeb}{\G@refundefinedtrue \@latex@warning{Citation `\@citeb' undefined}}{}}% \else - \@latex@error{Cannot be used in preamble}\@eha - % \AtBeginDocument{\nocite{#1}} + \AddToHook{begindocument/end}[kernel]{\nocite{#1}}% \fi \@esphack} \expandafter\let\csname b@*\endcsname\@empty @@ -9635,6 +9849,7 @@ Type H <return> for immediate help.}% \let\@unusedoptionlist\@empty \@onlypreamble\@unusedoptionlist \let\CurrentOption\@empty +\let\@currpath\@empty \let\@currname\@empty \global\let\@currext=\@empty \def\@clsextension{cls} @@ -9642,17 +9857,20 @@ Type H <return> for immediate help.}% \@onlypreamble\@clsextension \@onlypreamble\@pkgextension \def\@pushfilename{% - \@expl@@@hook@curr@name@push@@n{}% \@expl@push@filename@@ \xdef\@currnamestack{% {\@currname}% {\@currext}% {\the\catcode`\@}% \@currnamestack}% + \xdef\@kernel@currpathstack{% + {\@currpath}% + \@kernel@currpathstack}% \@expl@push@filename@aux@@} \@onlypreamble\@pushfilename \def\@popfilename{\@expl@@@hook@curr@name@pop@@ \expandafter\@p@pfilename\@currnamestack\@nil + \expandafter\@p@pfilepath\@kernel@currpathstack\@nil \@expl@pop@filename@@} \@onlypreamble\@popfilename \def\@p@pfilename#1#2#3#4\@nil{% @@ -9663,6 +9881,11 @@ Type H <return> for immediate help.}% \@onlypreamble\@p@pfilename \gdef\@currnamestack{} \@onlypreamble\@currnamestack +\gdef\@kernel@currpathstack{} +\def\@p@pfilepath#1{% + \gdef\@currpath{#1}\@p@pfilepath@aux\@empty} +\def\@p@pfilepath@aux#1\@nil{% + \xdef\@kernel@currpathstack{#1}} \def\@ptionlist#1{% \@ifundefined{opt@#1}\@empty{\csname opt@#1\endcsname}} \@onlypreamble\@ptionlist @@ -9729,11 +9952,12 @@ Type H <return> for immediate help.}% \@onlypreamble\@if@pti@ns \def\ProvidesPackage#1{% \xdef\@gtempa{#1}% - \ifx\@gtempa\@currname\else + \@expandtwoargs\@expl@str@if@eq@@nnTF + {\@gtempa}{\@currpath\@currname}{}{% \@latex@warning@no@line{You have requested - \@cls@pkg\space`\@currname',\MessageBreak + \@cls@pkg\space`\@currpath\@currname',\MessageBreak but the \@cls@pkg\space provides `#1'}% - \fi + }% \@ifnextchar[\@pr@videpackage{\@pr@videpackage[]}}%] \@onlypreamble\ProvidesPackage \def\@pr@videpackage[#1]{% @@ -9768,10 +9992,14 @@ Type H <return> for immediate help.}% \@expl@@@filehook@set@curr@file@@nNN {\@expl@@@filehook@resolve@file@subst@@w #3.#1\@nil}% \reserved@a\reserved@b + \@expl@@@filehook@clear@replacement@flag@@ \expandafter\xdef\csname opt@\reserved@a\endcsname{% \@ifundefined{opt@\reserved@a}\@empty {\csname opt@\reserved@a\endcsname,}% - \zap@space#2 \@empty}} + \zap@space#2 \@empty}% + \expandafter\let + \csname opt@#3.#1\expandafter\endcsname + \csname opt@\reserved@a\endcsname} \@onlypreamble\@pass@ptions \def\PassOptionsToPackage{\@pass@ptions\@pkgextension} \def\PassOptionsToClass{\@pass@ptions\@clsextension} @@ -9965,8 +10193,14 @@ Type H <return> for immediate help.}% \reserved@a} \@onlypreamble\@fileswith@pti@ns \def\@onefilewithoptions#1[#2][#3]#4{% + \@expl@@@filehook@set@curr@file@@nNN{#1.#4}\reserved@a\reserved@b + \edef\reserved@c{\def\noexpand\reserved@c####1% + \detokenize\expandafter{\expanded{.#4}}% + \noexpand\@nil{\def\noexpand\reserved@a{####1}}}\reserved@c + \expandafter\reserved@c\reserved@a\@nil \@pushfilename - \xdef\@currname{#1}% + \xdef\@currname{\string@makeletter\reserved@a}% + \xdef\@currpath{\ifx\reserved@b\@empty\else\reserved@b/\fi}% \global\let\@currext#4% \@ifl@aded\@currext\@currname {\@if@ptions\@currext{\@currname}{#2}{}% @@ -9987,14 +10221,14 @@ Type H <return> for immediate help.}% \@firstofone}% {\makeatletter \@reset@ptions - \IfFileExists{\@currname.\@currext}{}% + \IfFileExists{\@currpath\@currname.\@currext}{}% {\@missing@onefilewithoptions{#2}}% \ifx\@currname\@empty \expandafter\@gobble \else \@disable@packageload@do{\@currname.\@currext}% {\@expl@@@filehook@file@push@@ - \set@curr@file{\@currname.\@currext}% + \set@curr@file{\@currpath\@currname.\@currext}% \@filehook@set@CurrentFile \expandafter\@swaptwoargs\expandafter {\expandafter{\@currpkg@reqd}}% @@ -10003,6 +10237,7 @@ Type H <return> for immediate help.}% \ifx\CurrentFile\CurrentFileUsed \else \filename@parse\@curr@file + \edef\@currpath{\string@makeletter\filename@area}% \edef\@currname{\string@makeletter\filename@base}% \edef\@currext{\string@makeletter\filename@ext}% \fi @@ -10027,14 +10262,18 @@ Type H <return> for immediate help.}% \@onlypreamble\@onefilewithoptions \let\@unprocessedoptions\@undefined \def\@missing@onefilewithoptions#1{% - \@missingfileerror\@currname\@currext - \xdef\@currname{\@missingfile@area\@missingfile@base}% + \@missingfileerror{\@currpath\@currname}\@currext + \global\let\@currpath\@missingfile@area + \global\let\@currname\@missingfile@base \global\let\@currext\@missingfile@ext} \def\load@onefile@withoptions#1{% \let\CurrentOption\@empty \@reset@ptions \def\reserved@a{% \@pass@ptions\@currext{#1}{\@currname}% + \expandafter\let + \csname opt@\@currpkg@reqd\expandafter\endcsname + \csname opt@\@currname.\@currext\endcsname \global\expandafter \let\csname ver@\@currname.\@currext\endcsname\@empty \expandafter\let\csname\@currname.\@currext-h@@k\endcsname\@empty @@ -10047,9 +10286,9 @@ Type H <return> for immediate help.}% \UseHook{class/before/\@currname}% \fi \fi - \InputIfFileExists{\@currpkg@reqd}{}% + \InputIfFileExists{\@currpath\@currpkg@reqd}{}% {\@latex@error - {The \@cls@pkg\space\@currpkg@reqd\space failed to load.}\@ehd}% + {The \@cls@pkg\space\@currpkg@reqd\space failed to load}\@ehd}% \expandafter\let\csname unprocessedoptions-\@currname.\@currext\endcsname \@@unprocessedoptions \csname\@currname.\@currext-h@@k\endcsname @@ -10427,10 +10666,10 @@ Type H <return> for immediate help.}% } \def\pkgcls@rollbackdate@error#1{% \@latex@error{Suspicious rollback date given}% - {The \@cls@pkg\space'\@currname' claims that it - came into existence on #1 which\MessageBreak + {The \@cls@pkg\space'\@currname' has no rollback data + before #1 which\MessageBreak is after your requested rollback date --- so - something is wrong here.\MessageBreak + something may be wrong here.\MessageBreak Continue and we use the earliest known release.}} \def\DeclareCurrentRelease#1#2{% \ifnum\pkgcls@targetdate>\z@ % some sort of rollback request @@ -10471,11 +10710,11 @@ Type H <return> for immediate help.}% \fi } %% -%% File: ltfilehook.dtx (C) Copyright 2020 Frank Mittelbach, +%% File: ltfilehook.dtx (C) Copyright 2020,2021 Frank Mittelbach, %% Phelype Oleinik & LaTeX Team %%% From File: ltfilehook.dtx -\providecommand\ltfilehookversion{v1.0c} -\providecommand\ltfilehookdate{2020/10/18} +\providecommand\ltfilehookversion{v1.0e} +\providecommand\ltfilehookdate{2021/01/07} \ExplSyntaxOn \tl_new:N \CurrentFile \tl_new:N \CurrentFilePath @@ -10543,36 +10782,44 @@ Type H <return> for immediate help.}% \DeclareRobustCommand \InputIfFileExists[2]{% \IfFileExists{#1}% {% - \@expl@@@filehook@file@push@@ - \@filehook@set@CurrentFile - \edef\reserved@a{\@filef@und - \@expl@@@filehook@file@pop@assign@@nnnn - {\CurrentFilePathUsed}% - {\CurrentFileUsed}% - {\CurrentFilePath}% - {\CurrentFile}}% + \@expl@@@filehook@file@push@@ + \@filehook@set@CurrentFile \expandafter\@swaptwoargs\expandafter - {\reserved@a}% - {% - #2% - \@addtofilelist{#1}% - \UseHook{file/before}% - \UseHook{file/before/\CurrentFile}% - \@@input - }% - \UseHook{file/after/\CurrentFile}% - \UseHook{file/after}% + {\expandafter\@input@file@exists@with@hooks + \expandafter{\@filef@und}}% + {#2}% \@expl@@@filehook@file@pop@@ }% } +\def\@input@file@exists@with@hooks#1{% + \edef\reserved@a{% + \@expl@@@filehook@file@pop@assign@@nnnn + {\CurrentFilePathUsed}% + {\CurrentFileUsed}% + {\CurrentFilePath}% + {\CurrentFile}}% + \expandafter\@swaptwoargs\expandafter{\reserved@a}% + {\edef\reserved@a{\unqu@tefilef@und#1\@nil}% + \@addtofilelist{\string@makeletter\reserved@a}% + \UseHook{file/before}% + \UseHook{file/before/\CurrentFile}% + \@@input #1% <- trailing space comes from \@filef@und + }% + \UseHook{file/after/\CurrentFile}% + \UseHook{file/after}} +\def\unqu@tefilef@und"#1" \@nil{#1} \ExplSyntaxOn \cs_new_protected:Npn \__filehook_subst_add:nn #1 #2 { \group_begin: \cs_set:cpx { } { \exp_not:o { \cs:w\cs_end: } } \int_set:Nn \tex_escapechar:D { -1 } - \cs_gset:cpx { @file-subst@ \__filehook_subst_file_normalize:n {#1} } - { \__filehook_subst_file_normalize:n {#2} } + \cs_gset:cpx + { + @file-subst@ + \__filehook_subst_file_normalize:Nn \use_ii_iii:nnn {#1} + } + { \__filehook_subst_file_normalize:Nn \__filehook_file_name_compose:nnn {#2} } \group_end: } \cs_new_protected:Npn \__filehook_subst_remove:n #1 @@ -10580,14 +10827,18 @@ Type H <return> for immediate help.}% \group_begin: \cs_set:cpx { } { \exp_not:o { \cs:w\cs_end: } } \int_set:Nn \tex_escapechar:D { -1 } - \cs_undefine:c { @file-subst@ \__filehook_subst_file_normalize:n {#1} } + \cs_undefine:c + { + @file-subst@ + \__filehook_subst_file_normalize:Nn \use_ii_iii:nnn {#1} + } \group_end: } -\cs_new:Npn \__filehook_subst_file_normalize:n #1 +\cs_new:Npn \__filehook_subst_file_normalize:Nn #1 #2 { \exp_after:wN \__filehook_subst_empty_name_chk:NN \cs:w \exp_after:wN \cs_end: - \cs:w \__filehook_file_parse_full_name:nN {#1} \use_ii_iii:nnn \cs_end: + \cs:w \__filehook_file_parse_full_name:nN {#2} #1 \cs_end: } \cs_new:Npn \__filehook_subst_empty_name_chk:NN #1 #2 { \if_meaning:w #1 #2 .tex \else: \token_to_str:N #2 \fi: } @@ -10613,6 +10864,7 @@ Type H <return> for immediate help.}% \if@tempswa \@expl@@@filehook@drop@extension@@N\@curr@file@reqd \fi}% {\if@tempswa \@expl@@@filehook@drop@extension@@N\@curr@file \fi \global\let\@curr@file@reqd\@curr@file}% + \@expl@@@filehook@clear@replacement@flag@@ \endgroup} \def\@kernel@make@file@csname#1#2#3{% \xdef#1{\expandafter\@set@curr@file@aux @@ -10651,7 +10903,9 @@ Type H <return> for immediate help.}% { \tl_if_empty:nF {#1} { #1 / } #2#3 } \flag_new:n { __filehook_file_replaced } \cs_new:Npn \__filehook_if_file_replaced:TF #1 #2 - { \flag_if_raised:nTF { __filehook_file_replaced } {#1} {#2} } + { \flag_if_raised:nTF { __filehook_file_replaced } {#1} {#2} } +\cs_new_protected:Npn \__filehook_clear_replacement_flag: + { \flag_clear:n { __filehook_file_replaced } } \cs_new:Npn \__filehook_file_subst_begin:nnn #1 #2 #3 { \__filehook_file_subst_tortoise_hare:nn { #2#3 } { #2#3 } @@ -10715,6 +10969,8 @@ Type H <return> for immediate help.}% \__filehook_normalize_file_name:w \cs_new_eq:NN \@expl@@@filehook@if@file@replaced@@TF \__filehook_if_file_replaced:TF +\cs_new_eq:NN \@expl@@@filehook@clear@replacement@flag@@ + \__filehook_clear_replacement_flag: \cs_new_eq:NN \@expl@@@filehook@drop@extension@@N \__filehook_drop_extension:N \cs_new_eq:NN \@expl@@@filehook@file@push@@ @@ -10727,11 +10983,11 @@ Type H <return> for immediate help.}% \declare@file@substitution{atveryend.sty}{atveryend-ltx.sty} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% -%% File: ltshipout.dtx (C) Copyright 2020 Frank Mittelbach, LaTeX Team +%% File: ltshipout.dtx (C) Copyright 2020,2021 Frank Mittelbach, LaTeX Team %% %%% From File: ltshipout.dtx -\providecommand\ltshipoutversion{v1.0c} -\providecommand\ltshipoutdate{2020/09/27} +\providecommand\ltshipoutversion{v1.0d} +\providecommand\ltshipoutdate{2020/12/06} \ExplSyntaxOn \bool_new:N \g__shipout_debug_bool \cs_new_eq:NN \__shipout_debug:n \use_none:n @@ -10796,13 +11052,17 @@ Type H <return> for immediate help.}% \hook_if_empty:nF {shipout/foreground} { \__shipout_add_foreground_picture:n { \hook_use:n {shipout/foreground} } } - \hook_if_empty:nF {shipout/background} + \bool_lazy_and:nnF + { \hook_if_empty_p:n {shipout/background} } + { \tl_if_empty_p:N \@kernel@before@shipout@background } { \__shipout_add_background_picture:n { \@kernel@before@shipout@background \hook_use:n {shipout/background} } } \__shipout_execute_firstpage_hook: \int_compare:nNnT \@abspage@last = \g_shipout_readonly_int - { \hook_if_empty:nF {shipout/lastpage} + { \bool_lazy_and:nnF + { \hook_if_empty_p:n {shipout/lastpage} } + { \tl_if_empty_p:N \@kernel@after@shipout@lastpage } { \__shipout_debug:n { \typeout{Executing~ lastpage~ hook~ on~ page~ \int_use:N \g_shipout_readonly_int } } \__shipout_add_foreground_box:n { \UseHook{shipout/lastpage} @@ -11050,7 +11310,7 @@ Type H <return> for immediate help.}% {\ifnum\@abspage@last<\maxdimen \xdef\PreviousTotalPages{\@abspage@last}\fi} \cs_new_eq:NN \DiscardShipoutBox \shipout_discard: -\cs_new_protected:Npn \AtBeginDvi {\__shipout_add_firstpage_material:Nn \AtBeginDvi} +\cs_set_protected:Npn \AtBeginDvi {\__shipout_add_firstpage_material:Nn \AtBeginDvi} \cs_new_eq:NN \DebugShipoutsOn \shipout_debug_on: \cs_new_eq:NN \DebugShipoutsOff \shipout_debug_off: \cs_set_eq:NN \@expl@@@shipout@add@firstpage@material@@Nn |