%% %% This is file `latex-lab-footnotes.ltx', %% generated with the docstrip utility. %% %% The original source files were: %% %% latex-lab-footnotes.dtx (with options: `kernel') %% %% This is a generated file. %% %% Copyright 2021,2022 LaTeX Project %% %% This file was generated from file(s) of the `LaTeX-lab Bundle'. %% ------------------------------------------------------------------------------------ %% %% It may be distributed and/or modified under the %% conditions of the LaTeX Project Public License, either version 1.3c %% of this license or (at your option) any later version. %% The latest version of this license is in %% http://www.latex-project.org/lppl.txt %% and version 1.3c or later is part of all distributions of LaTeX %% version 2008 or later. %% %% This file may only be distributed together with a copy of the LaTeX %% `LaTeX-lab Bundle'. You may however distribute the `LaTeX-lab Bundle' %% without such generated files. %% %% The newest sources can be found below %% %% https://github.com/latex3/latex2e/required/latex-lab %% %% where one can also log issues in case there are any. %% %% %% File: latex-lab-footnotes.dtx \ProvidesFile{latex-lab-footnotes.ltx} [2022-03-10 v0.6a changes to the footnote interfaces] % not looked at yet \long\def\@mpfootnotetext#1{% \global\setbox\@mpfootins\vbox{% \unvbox\@mpfootins \reset@font\footnotesize \hsize\columnwidth \@parboxrestore \def\@currentcounter{mpfootnote}% \protected@edef\@currentlabel {\csname p@mpfootnote\endcsname\@thefnmark}% \color@begingroup \@makefntext{% \rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox}% \par \color@endgroup}} \def\@makefnmark{\hbox{\@textsuperscript{\normalfont\@thefnmark}}} \def\@mpfn{footnote} \def\thempfn{\thefootnote} \ExplSyntaxOn \cs_new_protected:Npn \fnote_step_fnmark:nn #1#2 { \tl_if_novalue:nTF {#1} { \stepcounter {#2} \protected@xdef \@thefnmark { \use:c { the#2 } } } { \group_begin: \int_set:cn { c@#2 }{ #1 } \unrestored@protected@xdef \@thefnmark { \use:c { the#2 } } \group_end: } } \cs_new_protected:Npn \fnote_set_fnmark:nn #1#2 { \tl_if_novalue:nTF {#1} { \protected@xdef \@thefnmark { \use:c { the#2 } } } { \group_begin: \int_set:cn { c@#2 }{ #1 } \unrestored@protected@xdef \@thefnmark { \use:c { the#2 } } \group_end: } } \bool_new:N \g_fnote_debug_bool \bool_gset_true:N \g_fnote_debug_bool % for now we have debugging turned on by default \NewMirroredHookPair{fnmark/before}{fnmark/after} \NewHook{fnmark} \NewHook{fnmark/begin} \NewHook{fnmark/end} \cs_new:Npn \__fnote_debug_footnotemark: { \bool_if:NT \g_fnote_debug_bool { \LogHook{fnmark/before} \LogHook{fnmark} \LogHook{fnmark/begin} \LogHook{fnmark/end} \LogHook{fnmark/after} \cs_gset_eq:NN \__fnote_debug_footnotemark: \prg_do_nothing: } } \cs_new_protected:Npn \fnote_footnotemark: { \__fnote_debug_footnotemark: \UseHook{fnmark/before} \leavevmode \ifhmode \edef\@x@sf{\the\spacefactor} \UseHook{fnmark} \nobreak \fi \UseHook{fnmark/begin} \@kernel@process@makefnmark \@makefnmark \__fnote_footnotemark_finish: } \cs_new:Npn \__fnote_finish: { \UseHook{fnmark/end} \ifhmode \spacefactor \@x@sf \relax \fi \UseHook{fnmark/after} } \cs_new_eq:NN \__fnote_footnotemark_finish: \__fnote_finish: \def \@kernel@process@makefnmark { } \cs_set_eq:NN \@footnotemark \fnote_footnotemark: \NewMirroredHookPair{fntext/before}{fntext/after} \NewHook{fntext} \NewHook{fntext/para} \NewHook{fntext/begin} \NewHook{fntext/end} \cs_new:Npn \__fnote_debug_footnotetext: { \bool_if:NT \g_fnote_debug_bool { \cs_log:N\@footnotetext@cfgpoint \cs_log:N\@footnotetext@cfgpointii \cs_log:N\@footnotetext@cfgpointiii \cs_log:N\@footnotetext@cfgpointiv \cs_log:N\@makefntext@cfgpoint \cs_log:N\@makefntext@cfgpointii \LogHook{fntext/before} \LogHook{fntext} \LogHook{fntext/para} \LogHook{fntext/begin} \LogHook{fntext/end} \LogHook{fntext/after} \cs_gset_eq:NN \__fnote_debug_footnotetext: \prg_do_nothing: } } \cs_new_protected:Npn \fnote_footnotetext:n #1 { \__fnote_debug_footnotetext: \UseHook{fntext/before} \@kernel@process@footnotetext \@footnotetext@cfgpoint { % config point \UseHook{fntext} \reset@font \footnotesize \interlinepenalty\interfootnotelinepenalty \splittopskip\footnotesep \splitmaxdepth \dp\strutbox \floatingpenalty \@MM \hsize\columnwidth \@parboxrestore \parindent 1em % typical default used in \@makefntext moved up here \def\@currentcounter{footnote} \protected@edef \@currentlabel { \p@footnote \@thefnmark } \UseHook{fntext/para} \color@begingroup \@footnotetext@cfgpointii % config point { \@footnotetext@cfgpointiii % config point \UseHook{fntext/begin} \ignorespaces #1 \UseHook{fntext/end} \@footnotetext@cfgpointiv % config point } \par \color@endgroup } \UseHook{fntext/after} } \cs_new_protected:Npn \@footnotetext@cfgpoint { \insert\footins } \cs_new_protected:Npn \@footnotetext@cfgpointii { \@makefntext } \cs_new_protected:Npn \@footnotetext@cfgpointiii { \rule\z@\footnotesep } \cs_new_protected:Npn \@footnotetext@cfgpointiv { \@finalstrut\strutbox } \cs_new_protected:Npn \@kernel@process@footnotetext {} \AddToHook{begindocument}{ \cs_set_eq:NN \@footnotetext \fnote_footnotetext:n } \newdimen\footnotemargin \footnotemargin\maxdimen % no value given \AtBeginDocument{ \ifdim \footnotemargin=\maxdimen \setlength\footnotemargin{1.8em} \fi } \cs_new_protected:Npn \fnote_makefntext:n #1 { \@makefntext@cfgpoint { \ifdim\footnotemargin>\z@ \hb@xt@ \footnotemargin{\hss\@makefnmark} \else \ifdim\footnotemargin=\z@ \llap{\@makefnmark} \else \ifdim\footnotemargin=-\maxdimen \@makefnmark \else \llap{\hb@xt@ -\footnotemargin{\@makefnmark\hss}} \fi \fi \fi } \@makefntext@cfgpointii { #1 } } \cs_new_protected:Npn \@makefntext@cfgpoint { \noindent } \cs_new_protected:Npn \@makefntext@cfgpointii #1 { #1 } \newcommand\old@std@class@makefntext[1]{% \parindent 1em% \noindent \hb@xt@1.8em{\hss\@makefnmark}#1} \tl_new:N \l__fnote_patch_tl \cs_new_eq:NN \__fnote_tmp:w \ERROR \cs_new_protected:Npn \__fnote_patch: { \tl_set:No \l__fnote_patch_tl { \@makefntext { \@makefntext@cfgpointii{##1} } } \tl_if_in:NnTF \l__fnote_patch_tl { \hbox } { \cs_set_eq:NN \__fnote_tmp:w \__fnote_patch_hbox:w } { \tl_if_in:NnTF \l__fnote_patch_tl { \hb@xt@ } { \cs_set_eq:NN \__fnote_tmp:w \__fnote_patch_hb@xt@:w } { \tl_if_in:NnTF \l__fnote_patch_tl { \@makefnmark } { \cs_set_eq:NN \__fnote_tmp:w \__fnote_patch_@makefnmark:w } { \ERROR \cs_set_eq:NN \__fnote_tmp:w \exp_stop_f: } } } \tl_set:Nf \l__fnote_patch_tl { \exp_after:wN \__fnote_tmp:w \l__fnote_patch_tl } \cs_set:Npn \__fnote_tmp:w { \long \def \@makefntext ####1 } \exp_after:wN \__fnote_tmp:w \exp_after:wN { \l__fnote_patch_tl } } \cs_new:Npn \__fnote_patch_hbox:w #1 \hbox #2 # { \exp_stop_f: #1 \@makefntext@processX { \hbox #2 } } \cs_new:Npn \__fnote_patch_hb@xt@:w #1 \hb@xt@ #2 # { \exp_stop_f: #1 \@makefntext@processX { \hb@xt@ #2 } } \cs_new:Npn \__fnote_patch_@makefnmark:w #1 \@makefnmark { \exp_stop_f: #1 \@makefntext@processX { \use:n } { \@makefnmark } } \cs_new:Npn \@makefntext@processX #1#2{\@makefntext@cfgpoint{#1{#2}}} \AddToHook{begindocument}{ \cs_if_eq:NNTF \@makefntext \old@std@class@makefntext { \cs_set_eq:NN \@makefntext \fnote_makefntext:n } { \__fnote_patch: } } \DeclareDocumentCommand\footnotetext {om} { \fnote_set_fnmark:nn {#1} \@mpfn \@footnotetext {#2} } \DeclareDocumentCommand\footnote {om} { \fnote_step_fnmark:nn {#1} \@mpfn \cs_set_eq:NN \__fnote_footnotemark_finish: \prg_do_nothing: \@footnotemark \cs_set_eq:NN \__fnote_footnotemark_finish: \__fnote_finish: \@footnotetext {#2} \__fnote_footnotemark_finish: } \DeclareDocumentCommand\footnotemark {o} { \fnote_step_fnmark:nn {#1} { footnote } \@footnotemark } \DeclareDocumentCommand\footref {m}{% \begingroup \unrestored@protected@xdef\@thefnmark{\ref{#1}}% \endgroup \@footnotemark } \AddToHook{package/setspace/after} {\let \@footnotetext \fnote_footnotetext:n \AddToHook{fntext}[setspace]{\let\baselinestretch\setspace@singlespace}} \AddToHook{package/hyperref/after}{ \let\H@@footnotetext\fnote_footnotetext:n \let\H@@footnotemark\fnote_footnotemark: \let \@footnotetext \fnote_footnotetext:n \let \@footnotemark \fnote_footnotemark: } \newcounter{absfootnote} \AddToHook{fnmark/begin}{\stepcounter{absfootnote}} % too simple (fails with opt args) \cs_new_protected:Npn \tag_if_loaded:TF { \cs_if_exist:NTF \tag_struct_begin:n } \cs_new_protected:Npn \tag@FEMark #1 { \tag_if_loaded:TF { \tag_mc_end_push: \exp_args:Nx \tag_struct_begin:n{tag=Lbl,ref=fn.\the\c@absfootnote} \tag_mc_begin:n{tag=Lbl} \IfPackageLoadedTF{hyperref}{ \hyper@linkstart {link}{fn.\the\c@absfootnote} }{} #1 \IfPackageLoadedTF{hyperref}{ \hyper@linkend }{} \tag_mc_end: \tag_struct_end: \tag_mc_begin_pop:n{} } { #1 } } \cs_set_eq:NN \@kernel@process@makefnmark \tag@FEMark \cs_set:Npn \@kernel@process@footnotetext #1#2 { \tag_if_loaded:TF { \tag_mc_end_push: \tag_struct_begin:n { tag=FENote,label=fn.\the\c@absfootnote } #1 {#2} \tag_struct_end: \tag_mc_begin_pop:n{} } { #1 {#2} } } \cs_set:Npn \@makefntext@cfgpoint #1 { \noindent \cs_if_exist:NT \tag_struct_begin:n { \tag_mc_end_push: } \tag@FELbl { #1 } } \cs_set:Npn \@makefntext@cfgpointii #1 { \tag@FENote { #1 } \cs_if_exist:NT \tag_struct_begin:n { \tag_mc_begin_pop:n{} } } \cs_new_protected:Npn \tag@FELbl #1 { \tag_if_loaded:TF { % target should perhaps be raised ... \IfPackageLoadedTF{hyperref}{ \hypertarget{fn.\the\c@absfootnote}{} }{} %\tag_struct_begin:n { tag=FENote,label=fn.\the\c@absfootnote } %alternativ location for structure \tag_struct_begin:n { tag=Lbl } \tag_mc_begin:n { tag=Lbl } #1 \tag_mc_end: \tag_struct_end: } { #1 } } \cs_new_protected:Npn \tag@FENote #1 { \tag_if_loaded:TF { \tag_mc_begin:n{tag=FENote} #1 \tag_mc_end: %\tag_struct_end: %alternative location for structure end but ends inside a P } { #1 } } \ExplSyntaxOff \endinput %% %% End of file `latex-lab-footnotes.ltx'.