summaryrefslogtreecommitdiff
path: root/macros/latex/required/latex-lab
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2022-06-09 03:01:00 +0000
committerNorbert Preining <norbert@preining.info>2022-06-09 03:01:00 +0000
commit16559ce13a74c7a182875559b379cac00b07efda (patch)
tree6ee63e6aadfabf9a7334e6667fa32646fd812667 /macros/latex/required/latex-lab
parentb3aac3ae7b628835121d1f485fd49998308170e7 (diff)
CTAN sync 202206090300
Diffstat (limited to 'macros/latex/required/latex-lab')
-rw-r--r--macros/latex/required/latex-lab/README.md42
-rw-r--r--macros/latex/required/latex-lab/changes.txt27
-rw-r--r--macros/latex/required/latex-lab/documentmetadata-support-code.pdfbin0 -> 512020 bytes
-rw-r--r--macros/latex/required/latex-lab/documentmetadata-support-code.tex4
-rw-r--r--macros/latex/required/latex-lab/documentmetadata-support-doc.pdfbin0 -> 375907 bytes
-rw-r--r--macros/latex/required/latex-lab/documentmetadata-support-doc.tex6
-rw-r--r--macros/latex/required/latex-lab/documentmetadata-support.dtx418
-rw-r--r--macros/latex/required/latex-lab/latex-lab-footnotes.dtx1822
-rw-r--r--macros/latex/required/latex-lab/latex-lab-footnotes.pdfbin0 -> 614594 bytes
-rw-r--r--macros/latex/required/latex-lab/latex-lab-new-or.dtx545
-rw-r--r--macros/latex/required/latex-lab/latex-lab-new-or.pdfbin0 -> 529091 bytes
-rw-r--r--macros/latex/required/latex-lab/latex-lab-testphase.dtx84
-rw-r--r--macros/latex/required/latex-lab/latex-lab-testphase.pdfbin0 -> 290879 bytes
-rw-r--r--macros/latex/required/latex-lab/latex-lab.ins82
-rw-r--r--macros/latex/required/latex-lab/usage-of-@footnotemark.txt186
-rw-r--r--macros/latex/required/latex-lab/usage-of-@footnotetext.txt842
-rw-r--r--macros/latex/required/latex-lab/usage-of-kern-kern.txt80
17 files changed, 4138 insertions, 0 deletions
diff --git a/macros/latex/required/latex-lab/README.md b/macros/latex/required/latex-lab/README.md
new file mode 100644
index 0000000000..410292cda5
--- /dev/null
+++ b/macros/latex/required/latex-lab/README.md
@@ -0,0 +1,42 @@
+# LaTeX laboratory
+
+Release 2022-06-01 pre-release 4
+
+## Overview
+
+This bundle holds optional files that are loaded in certain situations
+by kernel code (if available). For example, the new (as of 2021/12)
+`\DocumentMetadata` command in the kernel loads a file from here holding
+the real payload. While this code is still in development and the use
+is experimental and mainly for the tagging project, the code is stored
+outside the format so that there can be intermediate releases not
+affecting the production use of LaTeX.
+
+
+Once the code is finalized and properly tested it will eventually move
+to the kernel and the corresponding file in this bundle will
+vanish. Note that none of these files are directly user accessible in
+documents (i.e., they aren't packages) so the process is transparent
+to documents already using the new functionality.
+
+
+## Current support code in the bundle
+
+### Support for `\DocumentMetadata`
+
+### New output routine code (under development)
+
+ - so far there is a first implementation of footnote support
+
+
+## License
+
+The license is LPPL 1.3c.
+
+
+## Copyright
+
+This README file is
+
+Copyright (C) 2021-2022
+The LaTeX Project
diff --git a/macros/latex/required/latex-lab/changes.txt b/macros/latex/required/latex-lab/changes.txt
new file mode 100644
index 0000000000..80b3b4a22c
--- /dev/null
+++ b/macros/latex/required/latex-lab/changes.txt
@@ -0,0 +1,27 @@
+2022-05-28 Joseph Wright <Joseph.Wright@latex-project.org>
+
+ * latex-lab-prototype.dtx
+ Removed
+
+2022-14-04 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
+
+ * documentmeta-support.dtx:
+ add key A-4 for first steps to support pdf/A-4
+
+2022-03-08 Joseph Wright <Joseph.Wright@latex-project.org>
+
+ * latex-lab-prototype.dtx
+ New file re-implementing ideas from on xtemplate.dtx using updated
+ keyval support
+
+2021-12-30 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
+
+ * documentmeta-support.dtx:
+ cleaned up keys and bundle name
+ * added latex-lab-testphase.dtx for wrappers for the testphase
+ key.
+
+2021-12-16 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * README.md:
+ Add the bundle to support project work.
diff --git a/macros/latex/required/latex-lab/documentmetadata-support-code.pdf b/macros/latex/required/latex-lab/documentmetadata-support-code.pdf
new file mode 100644
index 0000000000..a6dadb2e9c
--- /dev/null
+++ b/macros/latex/required/latex-lab/documentmetadata-support-code.pdf
Binary files differ
diff --git a/macros/latex/required/latex-lab/documentmetadata-support-code.tex b/macros/latex/required/latex-lab/documentmetadata-support-code.tex
new file mode 100644
index 0000000000..c051960ab9
--- /dev/null
+++ b/macros/latex/required/latex-lab/documentmetadata-support-code.tex
@@ -0,0 +1,4 @@
+% this will typeset documentation + code
+
+\AtBeginDocument{\AlsoImplementation}
+\input{documentmetadata-support.dtx}
diff --git a/macros/latex/required/latex-lab/documentmetadata-support-doc.pdf b/macros/latex/required/latex-lab/documentmetadata-support-doc.pdf
new file mode 100644
index 0000000000..1cfe4cdaf7
--- /dev/null
+++ b/macros/latex/required/latex-lab/documentmetadata-support-doc.pdf
Binary files differ
diff --git a/macros/latex/required/latex-lab/documentmetadata-support-doc.tex b/macros/latex/required/latex-lab/documentmetadata-support-doc.tex
new file mode 100644
index 0000000000..dcf45514d6
--- /dev/null
+++ b/macros/latex/required/latex-lab/documentmetadata-support-doc.tex
@@ -0,0 +1,6 @@
+% this will typeset only documentation but not the code
+
+\AtBeginDocument{\OnlyDescription
+ \let\tableofcontents\relax
+ }
+\input{documentmetadata-support.dtx}
diff --git a/macros/latex/required/latex-lab/documentmetadata-support.dtx b/macros/latex/required/latex-lab/documentmetadata-support.dtx
new file mode 100644
index 0000000000..23053a484a
--- /dev/null
+++ b/macros/latex/required/latex-lab/documentmetadata-support.dtx
@@ -0,0 +1,418 @@
+% \iffalse meta-comment
+%
+%% File: documentmetadata-support.dtx
+% Copyright (C) 2021-2022 The LaTeX Project
+%
+% It may be distributed and/or modified under the conditions of the
+% LaTeX Project Public License (LPPL), either version 1.3c of this
+% license or (at your option) any later version. The latest version
+% of this license is in the file
+%
+% https://www.latex-project.org/lppl.txt
+%
+%
+% The development version of the bundle can be found below
+%
+% https://github.com/latex3/latex2e
+%
+% for those people who are interested or want to report an issue.
+%
+% \begin{macrocode}
+\def\documentmetadatasupportversion{1.0b}
+\def\documentmetadatasupportdate{2022-14-04}
+% \end{macrocode}
+%
+%
+%<*driver>
+\documentclass{l3doc}
+\EnableCrossrefs
+\CodelineIndex
+\begin{document}
+ \DocInput{documentmetadata-support.dtx}
+\end{document}
+%</driver>
+%
+% \fi
+%
+%
+%\NewDocElement[macrolike = false ,
+% toplevel = true,
+% idxtype = key ,
+% noprint = true ,
+% idxgroup = metadata keys ,
+% printtype = \textit{key}
+% ]{Mkey}{mkey}
+%
+%
+% \title{The \texttt{documentmetadata-support} code\thanks{This file
+% has version \documentmetadatasupportversion\ dated
+% \documentmetadatasupportdate, \copyright\ \LaTeX\
+% Project.}}
+% \author{Frank Mittelbach, Ulrike Fischer, \LaTeX{} Project}
+%
+% \maketitle
+%
+%
+% \section{Introduction}
+%
+% The kernel command \cs{DocumentMetadata}, which can be used as
+% the very first declaration in a document (i.e., before
+% \cs{documentclass}), defines metadata and other configuration
+% data that applies to the document as a whole (using a key/value
+% syntax).
+%
+% While the underlying functionality is still under
+% development (e.g., further keys will be added over time and keys
+% marked temporary may vanish again) the code for
+% \cs{DocumentMetadata} is place in a separate bundle, so that it
+% is easier to update it without the need to build a full \LaTeX{}
+% release. Over time the functionality will move fully into the
+% kernel.
+%
+% From a process perspective \cs{DocumentMetadata} loads the
+% \pkg{pdfmanagement} code the first time it is called and then
+% redefines itself to only manage key/value pairs in case it is
+% called more than once. In particular, this means that a document
+% without a \cs{DocumentMetadata} declaration has no code available
+% for extended management of PDF output as needed for various
+% features developed as part of the multi-year ``Tagged PDF''
+% project~\cite{blueprint}.
+%
+%
+%
+% \section{Currently supported key/values}
+%
+%
+% Currently the following keys are implemented for \cs{DocumentMetadata}:
+% \DescribeMkey{colorprofiles}
+% \DescribeMkey{debug}
+% \DescribeMkey{lang}
+% \DescribeMkey{pdfstandard}
+% \DescribeMkey{pdfversion}
+% \DescribeMkey{testphase}
+% \DescribeMkey{uncompress}
+%
+% \begin{description}
+% \item[\texttt{backend}] Passes the backend name to expl3. This is
+% needed only if the needed backend can't be automatically
+% determined or if the workflow used requires a special backend.
+%
+%^^A This will probably be extended to pass the value also to
+%^^A packages.
+%
+% \item[\texttt{pdfversion}] Sets the PDF version explicitly, e.g., \texttt{pdfversion=1.7}
+% \item[\texttt{uncompress}] (no value) Forces an uncompressed pdf
+% --- mainly for debugging purposes.
+%
+% \item[\texttt{lang}] Explicitly sets the Lang entry in the Catalog,
+% e.g., \texttt{lang=de-DE}. If not given the default value used is |en-US|.
+%
+% \item[\texttt{pdfstandard}] Choice key to set the pdf standard.
+% Currently |A-1b|, |A-2a|, |A-2b|, |A-2u|, |A-3a|, |A-3b|, |A-3u| and |A-4| are accepted as
+% values. The casing is irrelevant, |a-1b| works too.
+% The underlying code to ensure the requirements (as far as they
+% can be ensured) is still incomplete, but a color profile is included and the
+% \texttt{/OutputIntent} is set. The |u| variants for example do not force unicode,
+% but they will pass the information to hyperref and hyperxmp. The |a| variants
+% do \emph{not} enforce (or even test) a tagged pdf yet. The |A-4| support is
+% currently incomplete.
+% More information can be found in the documentation
+% of \pkg{l3pdfmeta}.
+%
+% \item[\texttt{colorprofiles}] This allows to load icc-colorprofiles. Details
+% are described in the documentation of \pkg{l3pdfmeta}.
+%
+% \item[\texttt{testphase}] This key is used to load testphase code. The values it accepts
+% and their effect will change over time, when testphase packages are added or
+% removed or when the code is moved into the kernel.
+% \begin{description}
+% \item[\texttt{phase-I}]
+% This value loads code implementing the first phase of the project~\cite{blueprint}, i.e., it
+% will load the tagpdf package. It will also activate tagging by issuing
+% |\tagpdfsetup{activate,interwordspace}|. This phase
+% is frozen.
+% \item[\texttt{phase-II}]
+% This is the current development phase.
+% Currently it differs from \texttt{phase-I} only in one point: It will
+% additionally activate tagging of paragraphs with
+% |\tagpdfsetup{paratagging}|. In the upcoming months it will
+% also enable automatic tagging of other basic document elements.
+% \end{description}
+% The |testphase| key can only be used in the first \cs{DocumentMetadata}.
+%
+% \item[\texttt{debug}] This key activates some debug options. It takes a list of key-values
+% as value. Currently the following keys are known:
+% \begin{description}
+% \item[\texttt{para}] with the default and only value |show|. It will activate the |paratagging-show|
+% option of \pkg{tagpdf},
+% \item[\texttt{log}] with the values as described in the documentation \pkg{tagpdf},
+% \item[\texttt{uncompress}] which does the same as |uncompress| as main key
+% \item[\texttt{pdfmanagement}] a boolean which allows to deactivate the pdfmanagement.
+% \item[\texttt{firstaidoff}] This accepts a comma lists of keywords and disables the patches
+% related to them. More information can be found in the documentation of
+% \pkg{pdfmanagement-firstaid}.
+% \end{description}
+% \end{description}
+%
+% \bibliographystyle{plain}
+%
+% \begin{thebibliography}{9}
+%
+% \bibitem{blueprint} Frank Mittelbach and Chris Rowley:
+% \emph{\LaTeX{} Tagged PDF\,---\,A blueprint for a large project}.
+% \url{https://latex-project.org/publications/indexbyyear/2020/}
+%
+% \end{thebibliography}
+%
+%
+%
+% \MaybeStop{\setlength\IndexMin{200pt} \PrintIndex }
+%
+% \begin{implementation}
+%
+% \section{The Implementation}
+%
+%
+% \begin{macrocode}
+%<@@=pdfmanagement>
+%<*code>
+% \end{macrocode}
+%
+% \begin{macrocode}
+
+\RequirePackage{pdfmanagement-testphase}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\ExplSyntaxOn\makeatletter
+% \end{macrocode}
+
+
+
+% \begin{macro}{\DocumentMetadata}
+%
+% \cs{DocumentMetadata} should not be used after
+% \cs{documentclass} so we error in this case.
+% It can be used more than once
+% but follow-up calls should not do the initialization code.
+% \begin{macrocode}
+\cs_set_protected:Npn \DocumentMetadata #1
+ {
+ \cs_if_eq:NNTF \documentclass \@twoclasseserror
+ { \msg_error:nn { meta } { after-class } }
+ {
+% \end{macrocode}
+%
+% The wanted backend must be detected first, we read the init
+% key and then force the loading of the backend.
+% The backend can contain management commands, so the boolean should
+% be set to true first.
+% \begin{macrocode}
+ \bool_gset_true:N \g_@@_active_bool
+ \keys_set_groups:nnn { document / metadata} {init}{ #1 }
+ %if no backend has been loaded force it now:
+ \str_if_exist:NF \c_sys_backend_str
+ {
+ \sys_load_backend:n {}
+ }
+% \end{macrocode}
+% Now we load the extra backend code:
+% \begin{macrocode}
+ \ExplSyntaxOn\makeatletter
+ \file_input:n {l3backend-testphase-\c_sys_backend_str.def}
+ \ExplSyntaxOff\makeatother
+% \end{macrocode}
+% Set the default language (this requires that the backend has been loaded),
+% process the rest of the keys,
+% and setup the generic driver.
+% \begin{macrocode}
+ \keys_set_filter:nnn { document / metadata } { init } { lang=en-US, #1 }
+ \bool_if:NT \g_@@_active_bool
+ {
+ \PassOptionsToPackage{customdriver=hgeneric-testphase}{hyperref}
+ }
+% \end{macrocode}
+% \cs{pdfmanagement_add:nnn} has collected values in this hook.
+% \begin{macrocode}
+ \hook_use_once:n {pdfmanagement/add}
+% \end{macrocode}
+% Now we redefine \cs{DocumentMetadata} so that it only process the
+% keys on any further calls.
+%
+% We need to update the hyperref option if the active status changes.
+% \begin{macrocode}
+ \cs_set_protected:Npn \DocumentMetadata ##1
+ {
+ \keys_set_filter:nnn { document / metadata } { init } { ##1 }
+ \str_remove_all:cn {opt@hyperref.sty}{customdriver=hgeneric-testphase}
+ \bool_if:NT \g__pdfmanagement_active_bool
+ {
+ \PassOptionsToPackage{customdriver=hgeneric-testphase}{hyperref}
+ }
+ }
+% \end{macrocode}
+% Load more modules, the testphase code and the firstaid code. The code is only
+% loaded in the first \cs{DocumentMetadata} call!
+% \begin{macrocode}
+ \g_@@_testphase_tl
+ \RequirePackage{pdfmanagement-firstaid}
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+
+
+
+
+% \begin{macrocode}
+%FMi defined elsewhere
+%FMi
+%FMi \clist_new:N \g_@@_firstaidoff_clist
+%FMi \tl_new:N \g_@@_testphase_tl
+% UFi should the definition move to here?
+\keys_define:nn { document / metadata }
+ {
+ backend .choices:nn =
+ { dvipdfmx , dvips , dvisvgm , luatex , pdftex , pdfmode , xdvipdfmx , xetex }
+ {
+ \sys_load_backend:n {#1}
+ },
+ backend .groups:n = { init } ,
+ }
+
+\keys_define:nn { document / metadata }
+ {
+ ,pdfversion .code:n =
+ {
+ \pdf_version_gset:n { #1 }
+ \AddToDocumentProperties[document]{pdfversion}{#1}
+ }
+ ,uncompress .code:n =
+ {
+ \pdf_uncompress:
+ }
+ ,uncompress .value_forbidden:n = true
+ ,lang .code:n =
+ {
+ \pdfmanagement_add:nnn {Catalog} {Lang}{(#1)}
+ \AddToDocumentProperties[document]{lang}{#1}
+ }
+ %,xmpmeta .bool_gset:N = \g_pdfmeta_xmp_bool %see pdfmeta unused and undefined for now!
+ % this uses internal command from pdfmeta, it should probably move there ...
+ ,pdfstandard .code:n =
+ {
+ \exp_args:Nnx
+ \keys_set:nn {document / metadata} {_pdfstandard=\str_uppercase:n{#1}}
+ }
+ ,_pdfstandard .choices:nn =
+ {A-1B,A-2A,A-2B,A-2U,A-3A,A-3B,A-3U,A-4}
+ {
+ \prop_if_exist:cT { g__pdfmeta_standard_pdf/#1_prop }
+ {
+ \prop_gset_eq:Nc \g__pdfmeta_standard_prop { g__pdfmeta_standard_pdf/#1 _prop }
+ }
+ \AddToDocumentProperties [document]{pdfstandard}{#1}
+ }
+ ,_pdfstandard / unknown .code:n =
+ {
+ \msg_warning:nnn{pdf}{unknown-standard}{#1}
+ }
+ ,testphase .multichoice:
+ ,testphase / tagpdf .code:n =
+ {
+ \tl_gput_right:Nn\g_@@_testphase_tl
+ {
+ \file_if_exist_input:nF {tagpdf-latex-lab-testphase.ltx}
+ {
+ \RequirePackage{tagpdf}
+ \AddToDocumentProperties [document]{testphase/tagpdf}{loaded}
+ \tagpdfsetup{activate,paratagging,interwordspace}
+ \AddToDocumentProperties [document]{tagging}{active}
+ \AddToDocumentProperties [document]{tagging/para}{active}
+ \AddToDocumentProperties [document]{tagging/interwordspace}{active}
+ }
+ }
+ }
+ ,testphase / unknown .code:n =
+ {
+ \tl_gput_right:Nn\g_@@_testphase_tl
+ {
+ \AddToDocumentProperties [document]{testphase/#1}{loaded}
+ \file_if_exist_input:nF {#1-latex-lab-testphase.ltx}
+ {
+ \msg_warning:nnn{meta}{latex-lab-pkg-missing}{#1}
+ \AddToDocumentProperties [document]{testphase/#1}{missing}
+ }
+ }
+ }
+ ,activate .multichoice:
+ ,activate / tagging .code:n =
+ {
+ \PackageWarning{pdfmanagement-testphase}
+ {The~activate~key~is~deprecated.\MessageBreak
+ Tagging~is~activated~with~'testphase=tagpdf'~directly}{}
+ }
+ ,debug .code:n =
+ {
+ \keys_set:nn { document / metadata / debug } {#1}
+ }
+ ,debug / para .code:n =
+ {
+ \AddToHook
+ {
+ package/tagpdf/after
+ }
+ {
+ \tagpdfsetup{paratagging-show}
+ }
+ }
+ ,debug / log .code:n =
+ {
+ \AddToHook
+ {
+ package/tagpdf/after
+ }
+ {
+ \tagpdfsetup{log=#1}
+ }
+ }
+ ,debug / uncompress .code:n =
+ {
+ \pdf_uncompress:
+ }
+ ,debug / pdfmanagement .bool_gset:N = \g_@@_active_bool
+ ,debug / firstaidoff .clist_gset:N = \g_@@_firstaidoff_clist
+ }
+
+
+% \end{macrocode}
+% \subsection{Messages}
+% \begin{macrocode}
+%UFi is meta the right module name here?
+\prop_gput:Nnn \g_msg_module_type_prop { meta } { LaTeX }
+\prop_gput:Nnn \g_msg_module_name_prop { meta } { DocumentMetadata }
+
+\msg_new:nnn { meta } { after-class }
+ {
+ \token_to_str:N \DocumentMetadata \c_space_tl
+ should~be~used~only~before~\token_to_str:N\documentclass
+ }
+\msg_new:nnn { meta } { latex-lab-pkg-missing }
+ {
+ LaTeX-lab~package~'#1'~not~found.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\ExplSyntaxOff\makeatother
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+%</code>
+% \end{macrocode}
+%
+% \end{implementation}
+%
+% \Finale
+%
diff --git a/macros/latex/required/latex-lab/latex-lab-footnotes.dtx b/macros/latex/required/latex-lab/latex-lab-footnotes.dtx
new file mode 100644
index 0000000000..330ae7b0cc
--- /dev/null
+++ b/macros/latex/required/latex-lab/latex-lab-footnotes.dtx
@@ -0,0 +1,1822 @@
+% \iffalse meta-comment
+%
+%% File: latex-lab-footnotes.dtx
+% Copyright (C) 2022 The LaTeX Project
+%
+% It may be distributed and/or modified under the conditions of the
+% LaTeX Project Public License (LPPL), either version 1.3c of this
+% license or (at your option) any later version. The latest version
+% of this license is in the file
+%
+% https://www.latex-project.org/lppl.txt
+%
+%
+% The development version of the bundle can be found below
+%
+% https://github.com/latex3/latex2e/required/latex-lab
+%
+% for those people who are interested or want to report an issue.
+%
+%<*driver>
+\documentclass{l3doc}
+\EnableCrossrefs
+\CodelineIndex
+\begin{document}
+ \DocInput{latex-lab-footnotes.dtx}
+\end{document}
+%</driver>
+%
+% \fi
+%
+%
+% \title{The \texttt{latex-lab-footnotes} code\thanks{}}
+% \author{Frank Mittelbach, \LaTeX{} Project}
+%
+% \maketitle
+%
+% \newcommand\fmi[1]{\begin{quote} TODO: \itshape #1\end{quote}}
+% \newcommand\NEW[1]{\marginpar{\mbox{}\hfill\fbox{New: #1}}}
+% \providecommand\class[1]{\texttt{#1.cls}}
+% \providecommand\pkg[1]{\texttt{#1}}
+% \providecommand\hook[1]{\texttt{#1}}
+%
+% \begin{abstract}
+% \emph{to be written}
+% \end{abstract}
+%
+% \tableofcontents
+%
+%
+% \section{Introduction}
+%
+% This code reimplements the footnote interfaces for \LaTeX{}
+% offering configurable methods for layout and functionality
+% adjustments that avoid overwriting each other when used in
+% classes as well as in packages (as far as possible --- obviously
+% some adjustments are mutally exclusive). This is achieved by
+% providing a a larger number of hooks (for areas where different
+% packages/classes can easily coexist with their adjustments) and a
+% number of configuration points to which only one class or package
+% can write to successfully (in case of multiple changes the the
+% last one wins). The latter are for special functionality, e.g.,
+% if footnote text is typeset as a single paragraph, it can't be configured
+% the same time to be typeset vertically with one footnote below
+% each other.
+%
+% The interfaces are set up to support tagged PDF, but in order
+% for this to work, all packages altering the fontnote setup should
+% use the inferfaces provided here and not do it through the
+% legacy methods (though there is some support for the latter as
+% well, but if will not work in a cases).
+%
+% \subsection{Configuration methods}
+%
+% Historically, the footnote setup in \LaTeX{} was done by
+% providing definitions for \cs{@makefnmark} (format the footnote
+% mark in running text and in front of the footnote text) and
+% \cs{@makefntext} (formatting the footnote text and placing a mark
+% in front of it).
+%
+% There was a default definition for \cs{@makefnmark} in the format
+% that was used by most document classes,
+% but \cs{@makefntext} had to be defined in the class itself because
+% the format didn't provide a default. As a result you will find
+% definitions for the latter in all document classes and defintions
+% for \cs{@makefnmark} only in very few.
+%
+% Furthermore, to enable special footnote layouts or provide
+% additional functionality a few packages (and a few classes)
+% overwrote other internal commands of \LaTeX's footnote
+% mechanism. The commands affected in this way are mainly
+% \cs{@footnotemark} and \cs{@footnotetext}. These overwrites could
+% not be used in combination, so either the packages/classes had to
+% be aware of being loaded together (which they sometimes did or
+% tried to) or they would fail by overwriting each other
+% unconditionally.
+%
+% The present rewrite is an attempt to improve this situation, but
+% of course, it will only work if all packages/classes make use of
+% the new interfaces. Fortunately, the number of problematical
+% packages altering these internal commands are fairly small so
+% arranging for updates is a realistic goal --- to achieve properly
+% tagged PDF it is a requirement.
+%
+%
+%
+% \section{Hooks and configuration points}
+%
+% Note: the configuration points do not have an interface mechanism
+% yet and all their names are temporary right now.
+% Also note that configuration points are of interest only to very
+% few specialized packages, mainly \pkg{footmisc}, and packages
+% providing similar functionality---the current documentation is
+% therefore fairly sketchy.
+%
+% In contrast the hooks are of interest to many classes to provide
+% their layout alterations in a way that it works smoothly with
+% other packages handling aspects of foonote formatting.
+%
+%
+% \subsection{Formatting the mark in the main text}
+%
+% This implements formatting the mark\footnote{Like this one.} and
+% its relation to surrounding text, e.g., if several marks appear
+% in the same place, etc.
+%
+%
+% \subsubsection{Configuration points}
+%
+% None: everything is implemented through a single definition for
+% \cs{@footnotemark} that offers a number of hooks that can be used
+% by packages to implement handling of multiple marks and the
+% formatting of marks.
+%
+%
+% \subsubsection{Hooks}
+%
+% The hooks to customize the marks in the text are the following:
+% \begin{description}
+% \item[\hook{fnmark/before}]
+%
+% Executed at the very beginning of \cs{footnotemark}. Currently
+% there are two packages (\pkg{bibarts} and \pkg{chextras}) that
+% prepend material at this point (not ncessarily correctly, e.g.,
+% they do not all check that they are in horizontal mode).
+%
+% This hook is paired with hook \hook{fnmark/after}.
+%
+% \item[\hook{fnmark}]
+%
+% Executed in horizontal mode and after the current space factor
+% has been saved away for reuse. This is where currently code for multiple
+% marks does its preparation (as done by \pkg{footmisc} and
+% others).
+%
+% The hook is only executed in hmode, i.e., not if the mark is
+% generated in math --- maybe that means the multiple handling
+% should happen later?
+%
+% After the hook \cs{nobreak} is executed, so any
+% ``material'' added in the hook is tied to the following mark
+% unless it contains its own permissible penalty.
+%
+% \item[\hook{fnmark/begin}]
+%
+% This hook is executed directly in front of the typeset mark.
+% This is the place where \pkg{hyperref} adds part of its code,
+% i.e., after the \cs{nobreak} mentioned above. With a closer
+% integration of \pkg{hyperref} this hook may not be necessary at
+% all.
+%
+% \item[\hook{fnmark/end}]
+%
+% This hook is executed directly after the typeset mark. It is
+% used by \pkg{hyperref}, \pkg{memhfixc}, \pkg{scrlttr2}, and
+% \pkg{footmisc}. Used, for example, to implement support for
+% multiple marks in succession.
+%
+% It is \emph{not} a reversed hook.
+%
+%
+% \item[\hook{fnmark/after}]
+%
+% This hook is executed at the very end of the \cs{footnotemark} command.
+%
+% It is a reversed hook to pair with \hook{fnmark/before}
+% \end{description}
+%
+%
+%
+%
+% \subsubsection{Additional configuration possibilities}
+%
+% The actual formatting is done through \cs{@makefnmark} --- no
+% special customization support for now.
+%
+%
+%
+% \subsection{Formatting the footnote text}
+%
+% This implements the formatting of the footnote text the way it
+% appears at the bottom of the page (default case), or possibly
+% elsewhere, e.g. in the margin.
+%
+% \subsubsection{Configuration points}
+%
+% To cater for different layout configurations there are four
+% configuration points which can be set only by one package or
+% class, if two packages/classes set them they are mutually
+% incompatible.
+% These are:
+% \begin{description}
+% \item[\cs{@footnotetext@cfgpoint} (1 argument)]
+%
+% This receives all material that is to be processed (or stored)
+% including color protection code and what have you. The default
+% definition is to run \cs{insert}\cs{footins}.
+%
+% \item[\cs{@footnotetext@cfgpointii} (1 argument)]
+%
+% The default definition runs \cs{@makefntext} which contains
+% various hooks for customization. For most scenarios this is
+% sufficient. However, when running all footnotes as a single
+% paragraph at the bottom, then each footnote needs to be
+% prepared prior to storing in the insert and this configuration
+% point allows running extra code to do that.
+%
+% \item[\cs{@footnotetext@cfgpointiii} (no argument)]
+%
+% By default this configuration point adds a strut to the
+% footnote material. so that consecutive footnotes are properly
+% spaced vertically. In some use cases this is not appropriate
+% (e.g., when running all footnotes s a single paragraph) and so
+% this configuration point can cancel the action or do something
+% else instead.
+%
+% The configuration point is executed near the start of the
+% argument for the configuration point
+% \cs{@footnotetext@cfgpointii}.
+%
+% \item[\cs{@footnotetext@cfgpointiv} (no argument)]
+%
+% This configuration point is executed at the very end of the
+% argument passed to \cs{@footnotetext@cfgpointii}.
+% By default it adds a final strut as long as we are still in
+% horizontal mode (i.e., processing the footnote text paragraph.
+% When running several footnotes in one paragraph some additional
+% material (some horizontal glue) needs adding at this point.
+%
+% \end{description}
+% The configuration point \cs{@footnotetext@cfgpointii} runs
+% \cs{@makefntext} and this command contains two further
+% configuration points (and a few hooks):
+% \begin{description}
+% \item[\cs{@makefntext@cfgpoint} (1 argument)]
+%
+% This configuration point receives the material to typeset the
+% footnote mark. By default, all it does is running \cs{indent}
+% to get a paragraph indentation (if one is set up---in most
+% layouts it is 0~points) and then typesets the mark, but in
+% some designs it executes more elaborate code.
+%
+% If tagging is produced this configuration point is also
+% responsible for surrounding the mark with the appropriate tags
+% marking the mark as an Lbl. It does this using the command \cs{tag@FELbl}.
+%
+% \item[\cs{@makefntext@cfgpointii} (1 argument)]
+%
+% This configuration point manages the formatting of the footnote
+% text once the mark has been typeset.
+%
+% If tagging is produced this configuration point is also
+% responsible for surrounding the mark with the appropriate tags
+% marking the mark as an MC of type FENote. It does this using
+% the command \cs{tag@FENote}.
+%
+% \end{description}
+%
+%
+% The above configuration points are sufficient to implement all
+% commonly used footnote layouts assuming L-R typesetting. For R-L
+% typesetting they or may or may not need some extension (though
+% that is not clear right now).
+%
+%
+%
+% \subsubsection{Hooks}
+%
+% \begin{description}
+% \item[\hook{fntext/before}]
+%
+% Executed at the very beginning of \cs{footnotetext}. Currently
+% there is on package (\pkg{linguex}) that
+% prepends material at this point.
+%
+% This hook is paired with hook \hook{fnmark/after}.
+%
+% \item[\hook{fntext}]
+%
+% Executed at the beginning of the material passed to the first
+% configuration point. Typically used to set any baseline
+% stretch for the footnote text, e.g., by \pkg{setspace},
+% \pkg{footmisc}, \class{uathesis} and others. Could be done in a
+% later hook but is a bit more efficient here.
+%
+% After the hook has run, the font is established, i.e., it can't
+% be used to set a different font size.
+%
+% \item[\hook{fntext/para}]
+%
+% After the font is set default paragraph parameters are set up
+% including \cs{interlinepenalty}, \cs{hsize}, \cs{parindent} and
+% a number of others, as some of them depend on the font
+% size. Then the \hook{fntext/para} is run. If one wants to
+% change the font size, it is probably necessary to reset these
+% other parameters too, e.g., \cs{parindent}, which can be done
+% here.
+%
+% The configuration point \cs{@footnotetext@cfgpointii} normally
+% runs the command \cs{@makefntext} or some code that eventually
+% runs this command, and this then produces the footnote mark (in
+% front of the footnote text) and the formatted footnote text. In
+% front of both the mark and the footnote text some classes have
+% placed paragraph parameter adjustments in their redefinition of
+% \cs{@makefntext}. However, there is no need to place it there
+% it could equally well go into the \hook{fntext/para} hook. We
+% therefore do not provide another hook at this point.
+%
+% \item[\hook{fntext/begin} \& \hook{fntext/end}]
+%
+% The footnote text itself is surrounded by the hooks
+% \hook{fntext/begin} and \hook{fntext/end}. The two hooks are
+% not paired as they are typically used independently.
+%
+% \item[\hook{fntext/after}]
+%
+% At the very end of \cs{footnotetext} we execute the hook
+% \hook{fntext/after} which is a reversed hook paired with
+% \hook{fntext/before}. Some packages, e.g., \pkg{linuex}, have
+% code in that position.
+%
+% \end{description}
+%
+%
+%
+%
+% \subsubsection{Additional configuration possibilities}
+%
+% The formatting of the footnote mark in front of the footnote
+% texts is influenced by the setting of the dimen parameter
+% \cs{footnotemargin}. By default its value is 1.8em in the current
+% text font (or \texttt{-}\cs{maxdimen} when the para option is
+% chosen). The following rules apply:
+% \begin{itemize}
+% \item
+%
+% If it has the value \texttt{-}\cs{maxdimen} then the mark is
+% generated by \cs{@makefnmark}.
+%
+% \item
+%
+% Otherwise, if the value is
+% negative then the mark is placed into an \cs{llap} left aligned
+% in a box of size \texttt{-}\cs{footnotemargin}.
+%
+% \item
+%
+% If the value is zero an \cs{llap} is used without an inner box.
+%
+% \item
+%
+% If the value is greater zero (but less than \cs{maxdimen}) the
+% mark is placed right aligned into a box of size
+% \cs{footnotemargin}.
+%
+% \item
+%
+% The value \cs{maxdimen} is used as a marker to indicate that
+% no value was given and that the default should be used,
+% i.e. 1.8em or \texttt{-}\cs{maxdimen} depending on the chosen
+% option.
+% \end{itemize}
+%
+%
+% \section{Tagging support}
+%
+% \emph{To be documented}
+%
+%
+%
+%
+% \MaybeStop{\setlength\IndexMin{200pt} \PrintIndex }
+%
+%
+% \section{The Implementation}
+%
+% All this is very rough and misses a lot of documentation.
+%
+% \begin{macrocode}
+%<*kernel>
+%<@@=fnote>
+% \end{macrocode}
+%
+% \subsection{File declaration}
+% \begin{macrocode}
+\ProvidesFile{latex-lab-footnotes.ltx}
+ [2022-03-10 v0.6a changes to the footnote interfaces]
+% \end{macrocode}
+%
+% \begin{macrocode}
+
+% latex.ltx
+
+ % 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:
+% \end{macrocode}
+% Note that this is a local assignment even though \LaTeX{}
+% counters are normally globally changed. This is the way it was in
+% 2e and so far we haven't changed it. The alternative would be to
+% store the current value and restore it after \cs{@thefnmark} is
+% altered.
+% \begin{macrocode}
+ \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:
+ }
+}
+
+%-------------------------------------
+
+% the debugging code is just temp
+\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 \@@_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 \@@_debug_footnotemark: \prg_do_nothing:
+ }
+}
+
+
+\cs_new_protected:Npn \fnote_footnotemark: {
+ \@@_debug_footnotemark:
+%-------
+% bibarts
+% chextras --- actually in the wrong place does an \unskip
+ \UseHook{fnmark/before}
+%-------
+ \leavevmode
+ \ifhmode
+ \edef\@x@sf{\the\spacefactor}
+%-------
+% bxjsja-minimal.def --- what they do could be done at ``bibarts''
+% (a bit less efficient)
+% memhfixc.sty
+% footmisc.sty
+ \UseHook{fnmark}
+%-------
+ \nobreak
+ \fi
+%-------
+% hyperref.sty
+ \UseHook{fnmark/begin}
+%-------
+ \@kernel@process@makefnmark
+ \@makefnmark
+%-------
+% \end{macrocode}
+% If a footnote mark is placed by its own then it should finish by
+% executing \hook{fnmark/end}, resetting the space factor, and
+% finishing with \hook{fnmark/after}. However, inf a complete
+% footnote these actions have to happen only after we have handled
+% the footnote text (e.g., by placing it into an \cs{insert}. In
+% such a situation \cs{_@@_footmark_finish:} below does nothing
+% and the action is carried out later.
+% \begin{macrocode}
+ \@@_footnotemark_finish:
+}
+
+
+\cs_new:Npn \@@_finish: {
+% hyperref.sty
+% memhfixc.sty --- could move fnmark/after
+% scrlttr2.cls --- could vanish if footmisc uses a hook
+% footmisc.sty
+ \UseHook{fnmark/end}
+%-------
+ \ifhmode
+ \spacefactor \@x@sf \relax
+ \fi
+%
+%-------
+ \UseHook{fnmark/after}
+%-------
+}
+
+
+\cs_new_eq:NN \@@_footnotemark_finish: \@@_finish:
+
+
+
+% Not a public config point but the kernel hook to add tagging
+\def \@kernel@process@makefnmark { }
+
+
+% alterations not covered:
+%
+% ./arabtex/afoot.sty --- too different (and probably too old)
+
+
+% Provide the name \LaTeXe{} is used to.
+
+\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 \@@_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}
+% \end{macrocode}
+% Show the info only once (if at all).
+% \begin{macrocode}
+ \cs_gset_eq:NN \@@_debug_footnotetext: \prg_do_nothing:
+ }
+ }
+
+\cs_new_protected:Npn \fnote_footnotetext:n #1 {
+ \@@_debug_footnotetext:
+%-------
+% ./linguex/linguex.sty
+ \UseHook{fntext/before}
+%-------
+ \@kernel@process@footnotetext
+ \@footnotetext@cfgpoint { % config point
+%-------
+% resetting baselinestretch ... (could be done further down)
+% ./uafthesis/uafthesis.cls
+% ./setspace/setspace.sty
+% ./footmisc/footmisc.sty (normal)
+ \UseHook{fntext}
+%-------
+ \reset@font
+ \footnotesize
+%-------
+% some classes use a different font size, e.g.,
+% ./nrc/nrc1.cls ./nrc/nrc2.cls
+% but those could be done in fntext/para instead
+%-------
+% \end{macrocode}
+% In case of sidenotes the next settings are pointless, but as they
+% do not hurt (except for the \cs{hsize} setting) and are needed
+% for all other cases we make them here and overwrite them for side notes
+% \begin{macrocode}
+ \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 }
+%-------
+% for altering para parameters ...
+% code for resphilosophica came earlier but it could go here.
+% Has the advantage that one can also overwrite \cs{@currentcounter}
+% and \cs{@currentlabel} is that is necessary.
+%
+% ./resphilosophica/resphilosophica.cls
+ \UseHook{fntext/para}
+%-------
+ \color@begingroup
+%-------
+% fnpara wants to replace \@makefntext{...} and para and side option of footmisc etc too ...
+% so we make this a config point
+%-------
+ \@footnotetext@cfgpointii % config point
+ {
+%-------
+% ./resphilosophica/resphilosophica.cls
+%-------
+ \@footnotetext@cfgpointiii % config point
+%-------
+% bibarts
+% fnbreak.sty
+ \UseHook{fntext/begin}
+%-------
+ \ignorespaces
+ #1
+%-------
+% bibarts
+% fnbreak.sty
+ \UseHook{fntext/end}
+%-------
+ \@footnotetext@cfgpointiv % config point
+ }
+ \par
+ \color@endgroup
+ }
+%-------
+% ./linguex/linguex.sty
+ \UseHook{fntext/after}
+%-------
+}
+
+% default for config point (1 arg)
+\cs_new_protected:Npn \@footnotetext@cfgpoint { \insert\footins }
+
+% default for config point (1 arg)
+\cs_new_protected:Npn \@footnotetext@cfgpointii { \@makefntext }
+
+
+% default for config point (0 args)
+\cs_new_protected:Npn \@footnotetext@cfgpointiii { \rule\z@\footnotesep }
+
+% default for config point (0 args)
+\cs_new_protected:Npn \@footnotetext@cfgpointiv { \@finalstrut\strutbox }
+
+
+% kernel hook for tagging (2 args)
+\cs_new_protected:Npn \@kernel@process@footnotetext {}
+
+% Provide the name \LaTeXe{} is used to and do this unconditionally
+% (no patching of class code if any). This means that if a class provides it own
+% definition that gets lost and if necessary needs to be handled
+% with firstaid (or updating of the class.
+
+\AddToHook{begindocument}{
+ \cs_set_eq:NN \@footnotetext \fnote_footnotetext:n
+}
+
+% alterations not covered:
+%
+% ./revtex4-1/revtex4-1.cls ./revtex/ltxutil.sty ./revtex/revtex4-2.cls ... (need analysis)
+% ./bigfoot/bigfoot.sty
+
+
+
+% \footnotemargin is the logic implemented by footmisc. Perhaps we
+% don't want to do this like that in the kernel but for now I have
+% used this interface unchanged.
+
+
+\newdimen\footnotemargin
+\footnotemargin\maxdimen % no value given
+
+\AtBeginDocument{
+ \ifdim \footnotemargin=\maxdimen
+ \setlength\footnotemargin{1.8em}
+ \fi
+}
+
+
+\cs_new_protected:Npn \fnote_makefntext:n #1 {
+% \end{macrocode}
+% Some classes in their redefinition for \cs{@makefntext} have
+% places some paragraph parameters at this point, but those can
+% equally well go into the hook \hook{fntext/para}. We therefore do
+% not provide a further hook at this point.
+% \begin{macrocode}
+ \@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 }
+}
+
+
+
+
+% default for config point (1 arg)
+\cs_new_protected:Npn \@makefntext@cfgpoint { \noindent }
+
+% default for config point (1 arg)
+\cs_new_protected:Npn \@makefntext@cfgpointii #1 { #1 }
+% \end{macrocode}
+%
+%
+%
+% If the definition for \cs{@makefntext} is that of the standard
+% classes then replace it with \cs{fnote_makefntext:n}, otherwise
+% try to patch the definition.
+%
+% Here is the the definition the way it is in
+% \texttt{classes.dtx}. Notice that (for saving space) there is no
+% space after \texttt{em} to terminate the assignment. We need to
+% mimic that, otherwise a test would return false even if the
+% definition has not been modified.
+%
+% \begin{macrocode}
+\newcommand\old@std@class@makefntext[1]{%
+ \parindent 1em%
+ \noindent
+ \hb@xt@1.8em{\hss\@makefnmark}#1}
+
+% \end{macrocode}
+% Here is the messy code for patching. Note that this is only there
+% to help classes along that aren't updated yet so it does some
+% minimal patching to hopefully add configuration points in the
+% right place.
+%
+% What it does is roughly the
+% following: It look for a definition of \cs{@makefntext} of the form
+%\begin{verbatim}
+% {AAA \hbox BBB { CCC } DDD #1 EEE }
+%\end{verbatim}
+% where ``BBB'' is something like \texttt{to 1em} or similar. It then
+% replaces that with
+%\begin{verbatim}
+% {AAA \@makefntext@cfgpoint{\hbox BBB { CCC }} DDD
+% \@makefntext@cfgpointii{#1} EEE }
+%\end{verbatim}
+% The patching is not very careful, i.e., it assumes there is only
+% one \verb=#1= in the replacement text and that a \cs{hbox} found
+% is the right one to patch. But that is enough to cater for all
+% definitions of \cs{@makefntext} out there in the TL distribution.
+%
+% If \cs{hbox} is not found it tries the same looking for
+% \cs{hb@xt@} which is what some classes use and if that is not
+% found either it assume that this is a version that uses
+% \cs{@makefnmark} without surrounding it in a box and if that
+% fails it gives up with an \cs{ERROR} (which needs to get a proper definition).
+% \begin{macrocode}
+
+\tl_new:N \l_@@_patch_tl
+\cs_new_eq:NN \@@_tmp:w \ERROR
+
+\cs_new_protected:Npn \@@_patch:
+ {
+ \tl_set:No \l_@@_patch_tl { \@makefntext { \@makefntext@cfgpointii{##1} } }
+ \tl_if_in:NnTF \l_@@_patch_tl { \hbox }
+ { \cs_set_eq:NN \@@_tmp:w \@@_patch_hbox:w }
+ {
+ \tl_if_in:NnTF \l_@@_patch_tl { \hb@xt@ }
+ { \cs_set_eq:NN \@@_tmp:w \@@_patch_hb@xt@:w }
+ {
+ \tl_if_in:NnTF \l_@@_patch_tl { \@makefnmark }
+ { \cs_set_eq:NN \@@_tmp:w \@@_patch_@makefnmark:w }
+ { \ERROR
+ \cs_set_eq:NN \@@_tmp:w \exp_stop_f: }
+ }
+ }
+ \tl_set:Nf \l_@@_patch_tl
+ { \exp_after:wN \@@_tmp:w \l_@@_patch_tl }
+ \cs_set:Npn \@@_tmp:w { \long \def \@makefntext ####1 }
+ \exp_after:wN \@@_tmp:w \exp_after:wN { \l_@@_patch_tl }
+ }
+% \end{macrocode}
+%
+% If \cs{@makefntext} contains \cs{hbox} then grab ``AAA'' as
+% \verb=#1= and ``BBB'' (up to the open \verb={=) and return it as
+%\begin{verbatim}
+% AAA \@makefntext@processX { \hbox BBB }
+%\end{verbatim}
+% \begin{macrocode}
+\cs_new:Npn \@@_patch_hbox:w #1 \hbox #2 #
+ { \exp_stop_f: #1 \@makefntext@processX { \hbox #2 } }
+% \end{macrocode}
+% Same for the other cases.
+% \begin{macrocode}
+\cs_new:Npn \@@_patch_hb@xt@:w #1 \hb@xt@ #2 #
+ { \exp_stop_f: #1 \@makefntext@processX { \hb@xt@ #2 } }
+\cs_new:Npn \@@_patch_@makefnmark:w #1 \@makefnmark
+ { \exp_stop_f: #1 \@makefntext@processX { \use:n } { \@makefnmark } }
+% \end{macrocode}
+%
+% The code provided by Bruno above expects 2 arguments but we need a
+% different structure so this is a simple reshuffling. Would be
+% better if we can patch the right structure in directly, but I'm
+% not a patch person, so this is the simple way out for now:
+%
+% \begin{macrocode}
+\cs_new:Npn \@makefntext@processX #1#2{\@makefntext@cfgpoint{#1{#2}}}
+% \end{macrocode}
+% At \verb=\begin{document}= check if the current definition is
+% that of the standard classes and if so replace it by
+% \cs{fnote_makefntext:n} otherwise try and patch the definition
+% using the approach above.
+% \begin{macrocode}
+
+\AddToHook{begindocument}{
+ \cs_if_eq:NNTF \@makefntext \old@std@class@makefntext
+ {
+ \cs_set_eq:NN \@makefntext \fnote_makefntext:n
+ }
+ {
+ \@@_patch:
+ }
+}
+
+
+% possibly add the following to check for multiple \hbox in
+% the definition:
+%
+% \seq_set_split:NnV \l_@@_patch_seq { \hbox } \l_@@_patch_tl
+% \int_compare:nT { \seq_count:N \l_@@_patch_seq } > 2 \ERROR
+%
+% \end{macrocode}
+%
+%
+%
+%
+% \subsection{Document-level commands}
+%
+% \begin{macrocode}
+
+\DeclareDocumentCommand\footnotetext {om} {
+ \fnote_set_fnmark:nn {#1} \@mpfn
+ \@footnotetext {#2}
+}
+
+
+%-------------------------------------
+
+
+\DeclareDocumentCommand\footnote {om} {
+ \fnote_step_fnmark:nn {#1} \@mpfn
+ \cs_set_eq:NN \@@_footnotemark_finish: \prg_do_nothing:
+ \@footnotemark
+ \cs_set_eq:NN \@@_footnotemark_finish: \@@_finish:
+ \@footnotetext {#2}
+ \@@_footnotemark_finish:
+}
+
+%-------------------------------------
+
+
+\DeclareDocumentCommand\footnotemark {o} {
+ \fnote_step_fnmark:nn {#1} { footnote }
+ \@footnotemark
+}
+
+
+%-------------------------------------
+
+\DeclareDocumentCommand\footref {m}{%
+ \begingroup
+ \unrestored@protected@xdef\@thefnmark{\ref{#1}}%
+ \endgroup
+ \@footnotemark
+}
+
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<@@=>
+% \end{macrocode}
+%
+%
+%
+%
+%
+%
+% \subsection{Firstaid for packages and classes}
+%
+% \subsubsection{\pkg{setspace}}
+%
+% It should not overwrite it any longer but use a hook, so for now we
+% do just that here.
+% \begin{macrocode}
+\AddToHook{package/setspace/after}
+ {\let \@footnotetext \fnote_footnotetext:n
+ \AddToHook{fntext}[setspace]{\let\baselinestretch\setspace@singlespace}}
+% \end{macrocode}
+%
+%
+%
+%
+% \subsubsection{\pkg{hyperref}}
+%
+% Prevent hyperref from redefining footnote stuff --- this is a
+% temp solution.
+% \begin{macrocode}
+\AddToHook{package/hyperref/after}{
+ \let\H@@footnotetext\fnote_footnotetext:n
+ \let\H@@footnotemark\fnote_footnotemark:
+ \let \@footnotetext \fnote_footnotetext:n
+ \let \@footnotemark \fnote_footnotemark:
+}
+
+
+
+% \end{macrocode}
+%
+% \subsection{Stuff that needs cleanup and documentation}
+%
+% \begin{macrocode}
+
+
+%-------------------------------------
+
+% use of kerns to mark h-mode positions (unit sp)
+%
+% 1 = CJK
+% 2 = CJK
+% 3 = multiple footnotes (footmisc, koma, eledmac, tufte, memoir,
+% parnotes, sidenotes)
+% 3 = outer kern in letter spacing (letterspace)
+% 3 = beginning of list (examdesign.cls)
+% 4 = CJK pigin
+% 5 = CJK ruby
+
+% 1-4 = polyglossia for korean
+
+%-------------------------------------
+
+
+
+%-------------------------------------
+% Tagging
+%-------------------------------------
+
+% hyperref support only when loaded (improve integration)
+
+\newcounter{absfootnote}
+\AddToHook{fnmark/begin}{\stepcounter{absfootnote}} % too simple (fails with opt args)
+
+
+
+% this is rubbish and should be handled better:
+
+\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 }
+}
+
+% to be done next round around:
+%
+% \the\c@absfootnote should be replaced directly by some command with default meaning
+% \the\c@absfootnote so that the actual reference can be changed from the outside.
+%
+% there are several instances that are curently hardwired.
+
+\cs_set_eq:NN \@kernel@process@makefnmark \tag@FEMark
+
+
+
+% kernel hook for tagging (2 args)
+\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
+%</kernel>
+% \end{macrocode}
+%
+%
+% \section{Reimplementing the \pkg{footmisc} package}
+%
+% \begin{macrocode}
+%<*footmisc>
+%%
+%% Copyright (c) 1995-2011 Robin Fairbairns
+%% Copyright (c) 2018-2022 Robin Fairbairns, Frank Mittelbach
+%%
+%% This file is part 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
+%% https://www.latex-project.org/lppl.txt
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2008 or later.
+%%
+%% This work has the LPPL maintenance status 'maintained'.
+%%
+%%
+%% File: footmisc.dtx (C) Copyright 1995-2011 Robin Fairbairns
+%% (C) Copyright 2018-2022 Frank Mittelbach
+\NeedsTeXFormat{LaTeX2e}
+\providecommand\DeclareRelease[3]{}
+\providecommand\DeclareCurrentRelease[2]{}
+
+\DeclareRelease{v5}{2011-06-06}{footmisc-2011-06-06.sty}
+\DeclareCurrentRelease{}{2022-02-14}
+\ProvidesPackage{latex-lab-footmisc}%
+ [2022/03/08 v6.0d
+ a miscellany of footnote facilities -- latex-lab version%
+ ]
+
+\NeedsTeXFormat{LaTeX2e}[2020/10/01]
+\newtoks\FN@temptoken
+\providecommand\protected@writeaux{%
+ \protected@write\@auxout
+}
+\def\l@advance@macro{\@@dvance@macro\edef}
+\def\@@dvance@macro#1#2#3{\expandafter\@tempcnta#2\relax
+ \advance\@tempcnta#3\relax
+ #1#2{\the\@tempcnta}%
+}
+\let\@advance@macro\l@advance@macro
+\DeclareOption{symbol}{\renewcommand\thefootnote{\fnsymbol{footnote}}}
+\newif\ifFN@robust \FN@robustfalse
+\DeclareOption{symbol*}{%
+ \renewcommand\thefootnote{\@fnsymbol\c@footnote}%
+ \FN@robusttrue
+ \AtEndOfPackage{\setfnsymbol{lamport*-robust}}%
+}
+\newif\ifFN@para \FN@parafalse
+\DeclareOption{para}{%
+% \end{macrocode}
+% Options are executed in the order of declaration, thus no point in
+% checking for side option as footmisc did in the past
+% \begin{macrocode}
+% \PackageError{footmisc}{Option "\CurrentOption" incompatible with
+% option "side"}%
+% {I shall ignore "\CurrentOption"}%
+ \FN@paratrue
+ \setlength\footnotemargin{-\maxdimen} % default when para is used
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareOption{side}{\ifFN@para
+ \PackageError{footmisc}{Option "\CurrentOption" incompatible with
+ option "para"}%
+ {I shall ignore "\CurrentOption"}%
+ \else
+ \def\@footnotetext@cfgpoint {\marginpar}
+ \AddToHook{fntext/para}{%
+ \hsize\marginparwidth % correct the default \hsize
+ \footnotesep\z@ % don't add a default separation
+ }
+ \def\@footnotetext@cfgpointii {\@makefntext}
+ \def\@footnotetext@cfgpointiii {}
+ \def\@footnotetext@cfgpointiv {}
+ \fi
+}
+\let\footnotelayout\@empty
+\DeclareOption{ragged}{%
+ \@ifundefined{RaggedRight}%
+ {\renewcommand\footnotelayout{\linepenalty50 \raggedright}}%
+ {\renewcommand\footnotelayout{\linepenalty50 \RaggedRight}}%
+}
+\newif\ifFN@perpage
+\FN@perpagefalse
+\DeclareOption{perpage}{%
+ \FN@perpagetrue
+}
+\newif\ifFN@fixskip \FN@fixskipfalse
+
+\let\FN@bottomcases\thr@@
+\newif\ifFN@abovefloats \FN@abovefloatstrue
+\DeclareOption{bottom}{%
+ \let\FN@bottomcases\@ne
+ \FN@abovefloatsfalse
+ \FN@fixskiptrue
+}
+\DeclareOption{bottomfloats}{%
+ \let\FN@bottomcases\tw@
+ \FN@abovefloatstrue \FN@fixskiptrue
+}
+\DeclareOption{abovefloats}{\FN@abovefloatstrue \FN@fixskiptrue}
+\DeclareOption{belowfloats}{\FN@abovefloatsfalse \FN@fixskiptrue}
+\DeclareOption{marginal}{%
+ \footnotemargin-0.8em\relax
+}
+\DeclareOption{flushmargin}{%
+ \footnotemargin0pt\relax
+}
+\newif\ifFN@hangfoot \FN@hangfootfalse
+\DeclareOption{hang}{%
+ \FN@hangfoottrue
+}
+\newcommand*\hangfootparskip{0.5\baselineskip}
+\newcommand*\hangfootparindent{0em}%
+\DeclareOption{norule}{%
+ \renewcommand\footnoterule{}%
+ \advance\skip\footins 4\p@\@plus2\p@\relax
+}
+\DeclareOption{splitrule}{%
+ \gdef\split@prev{0}
+ \let\pagefootnoterule\footnoterule
+ \let\mpfootnoterule\footnoterule
+ \def\splitfootnoterule{\kern-3\p@ \hrule \kern2.6\p@}
+ \def\footnoterule{\relax
+ \ifx \@listdepth\@mplistdepth
+ \mpfootnoterule
+ \else
+ \ifnum\split@prev=\z@
+ \pagefootnoterule
+ \else
+ \splitfootnoterule
+ \fi
+ \xdef\split@prev{\the\insertpenalties}%
+ \fi
+ }%
+}
+\newif\ifFN@stablefootnote \FN@stablefootnotefalse
+\DeclareOption{stable}{\FN@stablefootnotetrue}
+\newif\ifFN@multiplefootnote \FN@multiplefootnotefalse
+\DeclareOption{multiple}{\FN@multiplefootnotetrue}
+\ProcessOptions
+% \end{macrocode}
+% This version of \pkg{footmisc} can assume that the new OR code is
+% already available, thus nothing needs loading at this
+% point. However, as long as we use this code also in a package
+% version that can be loaded by other package while we are in a
+% transition phase it is not clear whether not the kernel code is
+% already available for other packages.
+% \begin{macrocode}
+%\@ifundefined{@kernel@before@cclv}
+% {\input{latex-lab-new-or.ltx}}{}
+% \end{macrocode}
+%
+% Footnote box layout for para footnotes;
+% this would also be the hook to support dblfootnotes (from the
+% \texttt{dblfnote} package if we integrate that).
+% \begin{macrocode}
+\ifFN@para
+ \def\@makecol@cfgpointii {%
+ \global\setbox\footins\vbox{\FN@makefootnoteparagraph}%
+ }
+\fi
+% \end{macrocode}
+%
+% \begin{macrocode}
+\ifFN@fixskip
+ \def\@outputbox@removebskip{%
+ \ifx\@textbottom\relax \else
+ \@outputbox@append{%
+ \@tempskipa\lastskip
+ \ifnum \gluestretchorder\@tempskipa>\z@
+ \vskip-\@tempskipa
+ \xdef\@outputbox@reinsertbskip
+ {\noexpand\@outputbox@append{\vskip\the\@tempskipa}}%
+ \else
+ \global\let\@outputbox@reinsertbskip\relax
+ \fi
+ }%
+ \fi
+ }
+\let\@outputbox@reinsertbskip\relax
+\else
+ \let\@outputbox@removebskip \relax
+ \let\@outputbox@reinsertbskip\relax
+\fi
+% \end{macrocode}
+%
+%
+%
+% \begin{macrocode}
+\ifcase \FN@bottomcases\relax
+\ERROR
+\or
+ \ifFN@abovefloats
+ \def\@makecol@cfgpoint {%
+ \@if@footnotes@TF
+ {\@outputbox@append{\vfill}}%
+ {\@if@bfloats@TF{\@outputbox@append{\vfill}}%
+ {\@outputbox@reinsertbskip}}%
+ \@outputbox@appendfootnotes
+ \@outputbox@attachfloats
+ }
+ \else
+ \def\@makecol@cfgpoint {%
+ \@outputbox@attachfloats
+ \@if@footnotes@TF
+ {\@outputbox@append{\vfill}}%
+ {\@outputbox@reinsertbskip}%
+ \@outputbox@appendfootnotes
+ }
+ \fi
+\or
+ \ifFN@abovefloats
+ \def\@makecol@cfgpoint {%
+ \@outputbox@appendfootnotes
+ \@if@bfloats@TF
+ {\@outputbox@append{\vfill}}%
+ {\@outputbox@reinsertbskip}%
+ \@outputbox@attachfloats
+ }
+ \else
+ \def\@makecol@cfgpoint {%
+ \@if@footnotes@TF
+ {\@outputbox@append{\vfill}}%
+ {\@if@bfloats@TF{\@outputbox@append{\vfill}}%
+ {\@outputbox@reinsertbskip}}%
+ \@outputbox@attachfloats
+ \@outputbox@appendfootnotes
+ }
+ \fi
+\or
+ \ifFN@abovefloats
+ \def\@makecol@cfgpoint {%
+ \@outputbox@appendfootnotes
+ \@outputbox@attachfloats
+ \@outputbox@reinsertbskip
+ }
+ \else
+ \def\@makecol@cfgpoint {%
+ \@outputbox@attachfloats
+ \@outputbox@appendfootnotes
+ \@outputbox@reinsertbskip
+}
+ \fi
+\else
+\ERROR
+\fi
+
+% next can be dropped when cleaned up
+\newif\ifFN@setspace
+\@ifpackageloaded{setspace}%
+ {%
+ \FN@setspacetrue
+ \@ifclassloaded{memoir}%
+ {%
+ \AddToHook{fntext}{\let\baselinestretch\m@m@singlespace}%
+ \let\FN@baselinestretch\m@m@singlespace
+ }%
+ {%
+% \AddToHook{fntext}{\let\baselinestretch\setspace@singlespace}%
+ \let\FN@baselinestretch\setspace@singlespace
+ }%
+ }%
+ {%
+ \FN@setspacefalse
+ }
+
+
+
+\ifFN@para
+ \def\@footnotetext@cfgpoint {\insert\footins}
+
+ \long\def\@footnotetext@cfgpointii #1{%
+ \setbox\FN@tempboxa\hbox{\@makefntext{#1}}%
+ \dp\FN@tempboxa\z@
+ \ht\FN@tempboxa
+ \dimexpr\wd\FN@tempboxa *%
+ \footnotebaselineskip /\columnwidth\relax
+ \box\FN@tempboxa
+ }
+
+
+ \def\@footnotetext@cfgpointiii {}
+ \def\@footnotetext@cfgpointiv {% config point
+ \strut
+ \penalty-10\relax
+ \hskip\footglue
+ }
+\fi
+
+
+
+\ifFN@para
+ \let\FN@tempboxa\@tempboxa
+ \newbox\FN@tempboxb
+ \newbox\FN@tempboxc
+ \newskip\footglue \footglue=1em plus.3em minus.3em
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \newdimen\footnotebaselineskip
+
+ % establish late:
+
+\AddToHook{begindocument/before} {%
+ {%
+ \footnotesize
+ \global\footnotebaselineskip=\normalbaselineskip
+ }%
+}
+% \end{macrocode}
+% The coding is based on David Kastrup's improvement to Don Knuth's
+% original implementation. You find in the \TeX{}book if you own
+% the latest edition.
+% \begin{macrocode}
+
+ \long\def\FN@makefootnoteparagraph{%
+ \FN@setfootnoteparawidth
+ \@parboxrestore
+ \baselineskip=\footnotebaselineskip
+ \unvbox\footins \FN@removehboxes
+ \RawParEnd
+ }
+ \def\FN@removehboxes{\setbox\FN@tempboxa\lastbox
+ \ifhbox\FN@tempboxa{\FN@removehboxes}%
+ \unhbox\FN@tempboxa
+ \else
+ \RawNoindent
+ \rule\z@\footnotesep
+ \fi
+ }
+\fi
+
+
+\@ifpackageloaded{multicol}
+ {\def\FN@setfootnoteparawidth
+ {\hsize\ifnum\doublecol@number>\@ne
+ \textwidth
+ \else \columnwidth \fi}}
+ {\def\FN@setfootnoteparawidth{\hsize\columnwidth}}
+
+\ifFN@perpage
+ \RequirePackage{perpage}
+ \MakePerPage{footnote}
+% \end{macrocode}
+% Fix a bug in perpage \ldots
+% \begin{macrocode}
+ \def\@stpelt#1{\global\csname c@#1\endcsname \m@ne
+ \stepcounter{#1}%
+ \pp@fix@MakePerPage{#1}%
+ }
+ \def\pp@fix@MakePerPage#1{%
+ \ifnum \value{#1}>\z@
+ \addtocounter{#1}\m@ne\fi
+ }
+% \end{macrocode}
+% The above code may look a bit odd: the \cs{stepcounter} sets the
+% counter to zero and then we alter it if it is not zero. The
+% reason is that \cs{stepcounter} resets other counters and when
+% perpage is loaded this results in updating counters on the reset
+% list to 1 (or to a higher starting value if \cs{MakePerPage} is
+% used with an optional argument, which is precisely the problem
+% here. By subtracting 1 in that case we set it back to 1 lower
+% than the starting value.
+%
+% But to make this fully work we also need to update a support
+% command in \pkg{perpage}:
+% \begin{macrocode}
+ \def\pp@cl@end@iii\stepcounter#1\pp@fix@MakePerPage#2{}
+\fi
+
+
+\ifFN@para
+
+% This can use the default interface, except that a negative value for
+% \footnotemargin makes little sense, so we test for this and warn if
+% necessary. But -\maxdimen is ok again, so would need to be a litte bit more elaborate.
+%
+
+%\AddToHook{fntext/para}{
+% \ifdim \footnotemargin >\z@ \else
+% \PackageWarningNoline{footmisc}{Option 'para' needs positive \noexpand\footnotemargin}%
+% \footnotemargin 1.8em\relax
+% \fi
+%}
+
+
+\AddToHook{fntext/begin}{\nobreak \hspace{.2em}}
+
+
+
+
+\else
+
+ \ifFN@hangfoot
+ \long\def\@makefntext#1{%
+ \bgroup
+ \setbox\@tempboxa\hbox{%
+ \ifdim\footnotemargin>\z@
+ \hb@xt@\footnotemargin{\@makefnmark\hss}%
+ \else
+ \@makefnmark
+ \fi
+ }%
+ \leftmargin\wd\@tempboxa
+ \rightmargin\z@
+ \linewidth \columnwidth
+ \advance \linewidth -\leftmargin
+ \parshape \@ne \leftmargin \linewidth
+ \footnotesize
+ \@setpar{{\@@par}}%
+ \leavevmode
+ \llap{\box\@tempboxa}%
+ \parskip\hangfootparskip\relax
+ \parindent\hangfootparindent\relax
+ \footnotelayout#1%
+ \par
+ \egroup
+ }
+
+ \else
+
+% This is now using the default interface:
+%
+% \long\def\@makefntext#1{%
+% \parindent1em
+% \noindent
+% \ifdim\footnotemargin>\z@
+% \hb@xt@ \footnotemargin{\hss\@makefnmark}%
+% \else
+% \ifdim\footnotemargin=\z@
+% \llap{\@makefnmark}%
+% \else
+% \llap{\hb@xt@ -\footnotemargin{\@makefnmark\hss}}%
+% \fi
+% \fi
+% \footnotelayout#1%
+% }
+
+ \fi
+\fi
+
+
+
+
+\ifFN@multiplefootnote
+ \providecommand*{\multiplefootnotemarker}{3sp}
+ \providecommand*{\multfootsep}{,}
+ \AddToHook{fnmark} {\FN@mf@check}
+ \AddToHook{fnmark/end} {\FN@mf@prepare}
+%
+ \def\FN@mf@prepare{%
+ \kern-\multiplefootnotemarker
+ \kern\multiplefootnotemarker\relax
+ }
+ \def\FN@mf@check{%
+ \ifdim\lastkern=\multiplefootnotemarker\relax
+%?? is that necessary or even correct ??
+ \edef\@x@sf{\the\spacefactor}%
+%?? shouldn't that be 2 unkerns ?? (none would also be ok)
+ \unkern % new
+ \unkern
+ \textsuperscript{\multfootsep}%
+ \spacefactor\@x@sf\relax
+ \fi
+ }
+\else
+ \let\FN@mf@prepare\relax
+\fi
+\ifFN@stablefootnote
+\let\FN@sf@@footnote\footnote
+\def\footnote{\ifx\protect\@typeset@protect
+ \expandafter\FN@sf@@footnote
+ \else
+ \expandafter\FN@sf@gobble@opt
+ \fi
+}
+\edef\FN@sf@gobble@opt{\noexpand\protect
+ \expandafter\noexpand\csname FN@sf@gobble@opt \endcsname}
+\expandafter\def\csname FN@sf@gobble@opt \endcsname{%
+ \@ifnextchar[%]
+ \FN@sf@gobble@twobracket
+ \@gobble
+}
+\def\FN@sf@gobble@twobracket[#1]#2{}
+\let\FN@sf@@footnotemark\footnotemark
+\def\footnotemark{\ifx\protect\@typeset@protect
+ \expandafter\FN@sf@@footnotemark
+ \else
+ \expandafter\FN@sf@gobble@optonly
+ \fi
+}
+\edef\FN@sf@gobble@optonly{\noexpand\protect
+ \expandafter\noexpand\csname FN@sf@gobble@optonly \endcsname}
+\expandafter\def\csname FN@sf@gobble@optonly \endcsname{%
+ \@ifnextchar[%]
+ \FN@sf@gobble@bracket
+ {}%
+}
+\def\FN@sf@gobble@bracket[#1]{}
+\fi
+\newcommand\setfnsymbol[1]{%
+ \@bsphack
+ \@ifundefined{FN@fnsymbol@#1}%
+ {%
+ \PackageError{footmisc}{Symbol style "#1" not known}%
+ \@eha
+ }{%
+ \expandafter\let\expandafter\@fnsymbol\csname
+ FN@fnsymbol@#1\endcsname
+ }%
+ \@esphack
+}
+\let\FN@fnsymbol@lamport\@fnsymbol
+\newif\if@tempswb
+\DeclareDocumentCommand\DefineFNsymbols {smO{text}m}{%
+ \expandafter\ifx\csname FN@fnsymbol@#2\endcsname\relax
+ \PackageInfo{footmisc}{Declaring symbol style #2}%
+ \else
+ \PackageWarning{footmisc}{Redeclaring symbol style #2}%
+ \fi
+ \toks@{}%
+ \def\@tempb{\end}%
+ \FN@build@symboldef#4\end
+ \def\@tempc{math}%
+ \def\@tempd{#3}%
+ \expandafter\xdef\csname FN@fnsymbol@#2\endcsname##1{%
+ \ifx\@tempc\@tempd
+ \noexpand\ensuremath
+ \else
+ \noexpand\nfss@text
+ \fi
+ {%
+ \noexpand\ifcase##1%
+ \the\toks@
+ \noexpand\else
+ \IfBooleanTF#1{\noexpand\@ctrerr}%
+ {\noexpand\FN@orange##1}%
+ \noexpand\fi
+ }%
+ }%
+}
+\def\FN@build@symboldef#1{%
+ \def\@tempa{#1}%
+ \ifx\@tempa\@tempb
+ \else
+ \toks@\expandafter{\the\toks@\or#1}%
+ \expandafter\FN@build@symboldef
+ \fi
+}
+\DeclareDocumentCommand\DefineFNsymbolsTM {smm}{%
+ \expandafter\ifx\csname FN@fnsymbol@#2\endcsname\relax
+ \PackageInfo{footmisc}{Declaring symbol style #2}%
+ \else
+ \PackageWarning{footmisc}{Redeclaring symbol style #2}%
+ \fi
+ \toks@{}%
+ \def\@tempb{\end}%
+ \FN@build@symboldefTM#3\end\@null
+ \expandafter\xdef\csname FN@fnsymbol@#2\endcsname##1{%
+ \noexpand\ifcase##1%
+ \the\toks@
+ \noexpand\else
+ \IfBooleanTF#1{\noexpand\@ctrerr}%
+ {\noexpand\FN@orange##1}%
+ \noexpand\fi
+ }%
+}
+\def\FN@build@symboldefTM#1#2{%
+ \def\@tempa{#1}%
+ \ifx\@tempa\@tempb
+ \else
+ \toks@\expandafter{\the\toks@\or\TextOrMath{#1}{#2}}%
+ \expandafter\FN@build@symboldefTM
+ \fi
+}
+\def\FN@orange#1{%
+ \ifFN@robust
+ \@arabic#1%
+ \@bsphack
+ \PackageInfo{footmisc}{Footnote number \number#1 out of range}%
+ \protect\@fnsymbol@orange
+ \@esphack
+ \else \@ctrerr \fi
+}
+\global\let\@diagnose@fnsymbol@orange\relax
+\AtEndDocument{\@diagnose@fnsymbol@orange}
+\def\@fnsymbol@orange{%
+ \gdef\@diagnose@fnsymbol@orange{%
+ \PackageWarningNoLine{footmisc}{Some footnote number(s)
+ were out of range
+ \MessageBreak
+ see log for details%
+ }%
+ }%
+}
+\DefineFNsymbolsTM{bringhurst}{%
+ \textasteriskcentered *%
+ \textdagger \dagger
+ \textdaggerdbl \ddagger
+ \textsection \mathsection
+ \textbardbl \|%
+ \textparagraph \mathparagraph
+}%
+\DefineFNsymbolsTM{chicago}{%
+ \textasteriskcentered *%
+ \textdagger \dagger
+ \textdaggerdbl \ddagger
+ \textsection \mathsection
+ \textbardbl \|%
+ \#\#%
+}%
+\DefineFNsymbolsTM{wiley}{%
+ \textasteriskcentered *%
+ {\textasteriskcentered\textasteriskcentered}{**}%
+ \textdagger \dagger
+ \textdaggerdbl \ddagger
+ \textsection \mathsection
+ \textparagraph \mathparagraph
+ \textbardbl \|%
+}%
+\DefineFNsymbolsTM{lamport-robust}{%
+ \textasteriskcentered *%
+ \textdagger \dagger
+ \textdaggerdbl \ddagger
+ \textsection \mathsection
+ \textparagraph \mathparagraph
+ \textbardbl \|%
+ {\textasteriskcentered\textasteriskcentered}{**}%
+ {\textdagger\textdagger}{\dagger\dagger}%
+ {\textdaggerdbl\textdaggerdbl}{\ddagger\ddagger}%
+}
+\DefineFNsymbolsTM*{lamport*}{%
+ \textasteriskcentered *%
+ \textdagger \dagger
+ \textdaggerdbl \ddagger
+ \textsection \mathsection
+ \textparagraph \mathparagraph
+ \textbardbl \|%
+ {\textasteriskcentered\textasteriskcentered}{**}%
+ {\textdagger\textdagger}{\dagger\dagger}%
+ {\textdaggerdbl\textdaggerdbl}{\ddagger\ddagger}%
+ {\textsection\textsection}{\mathsection\mathsection}%
+ {\textparagraph\textparagraph}{\mathparagraph\mathparagraph}%
+ {\textasteriskcentered\textasteriskcentered\textasteriskcentered}{***}%
+ {\textdagger\textdagger\textdagger}{\dagger\dagger\dagger}%
+ {\textdaggerdbl\textdaggerdbl\textdaggerdbl}{\ddagger\ddagger\ddagger}%
+ {\textsection\textsection\textsection}%%
+ {\mathsection\mathsection\mathsection}%
+ {\textparagraph\textparagraph\textparagraph}%%
+ {\mathparagraph\mathparagraph\mathparagraph}%
+}
+\setfnsymbol{lamport*}
+\DefineFNsymbolsTM{lamport*-robust}{%
+ \textasteriskcentered *%
+ \textdagger \dagger
+ \textdaggerdbl \ddagger
+ \textsection \mathsection
+ \textparagraph \mathparagraph
+ \textbardbl \|%
+ {\textasteriskcentered\textasteriskcentered}{**}%
+ {\textdagger\textdagger}{\dagger\dagger}%
+ {\textdaggerdbl\textdaggerdbl}{\ddagger\ddagger}%
+ {\textsection\textsection}{\mathsection\mathsection}%
+ {\textparagraph\textparagraph}{\mathparagraph\mathparagraph}%
+ {\textasteriskcentered\textasteriskcentered\textasteriskcentered}{***}%
+ {\textdagger\textdagger\textdagger}{\dagger\dagger\dagger}%
+ {\textdaggerdbl\textdaggerdbl\textdaggerdbl}{\ddagger\ddagger\ddagger}%
+ {\textsection\textsection\textsection}%%
+ {\mathsection\mathsection\mathsection}%
+ {\textparagraph\textparagraph\textparagraph}%%
+ {\mathparagraph\mathparagraph\mathparagraph}%
+}
+\newcommand\mpfootnotemark{%
+ \@ifnextchar[%
+ \@xmpfootnotemark
+ {%
+ \stepcounter\@mpfn
+ \protected@xdef\@thefnmark{\thempfn}%
+ \@footnotemark
+ }%
+}
+\def\@xmpfootnotemark[#1]{%
+ \begingroup
+ \csname c@\@mpfn\endcsname #1\relax
+ \unrestored@protected@xdef\@thefnmark{\thempfn}%
+ \endgroup
+ \@footnotemark
+}
+% \end{macrocode}
+% TEMP PATCHES FOR TESTING
+% \begin{macrocode}
+
+\endinput
+%</footmisc>
+% \end{macrocode}
+% \Finale
+%
diff --git a/macros/latex/required/latex-lab/latex-lab-footnotes.pdf b/macros/latex/required/latex-lab/latex-lab-footnotes.pdf
new file mode 100644
index 0000000000..2e35bfb74e
--- /dev/null
+++ b/macros/latex/required/latex-lab/latex-lab-footnotes.pdf
Binary files differ
diff --git a/macros/latex/required/latex-lab/latex-lab-new-or.dtx b/macros/latex/required/latex-lab/latex-lab-new-or.dtx
new file mode 100644
index 0000000000..08b58a7286
--- /dev/null
+++ b/macros/latex/required/latex-lab/latex-lab-new-or.dtx
@@ -0,0 +1,545 @@
+% \iffalse meta-comment
+%
+%% File: latex-lab-new-or.dtx
+% Copyright (C) 2022 The LaTeX Project
+%
+% It may be distributed and/or modified under the conditions of the
+% LaTeX Project Public License (LPPL), either version 1.3c of this
+% license or (at your option) any later version. The latest version
+% of this license is in the file
+%
+% https://www.latex-project.org/lppl.txt
+%
+%
+% The development version of the bundle can be found below
+%
+% https://github.com/latex3/latex2e/required/latex-lab
+%
+% for those people who are interested or want to report an issue.
+%
+%<*driver>
+\documentclass{l3doc}
+\EnableCrossrefs
+\CodelineIndex
+\begin{document}
+ \DocInput{latex-lab-new-or.dtx}
+\end{document}
+%</driver>
+%
+% \fi
+%
+%
+% \title{The \texttt{latex-lab-new-or} code\thanks{}}
+% \author{Frank Mittelbach, \LaTeX{} Project}
+%
+% \maketitle
+%
+% \newcommand\fmi[1]{\begin{quote} TODO: \itshape #1\end{quote}}
+% \newcommand\NEW[1]{\marginpar{\mbox{}\hfill\fbox{New: #1}}}
+% \providecommand\pkg[1]{\texttt{#1}}
+%
+% \begin{abstract}
+% \end{abstract}
+%
+% \section{Introduction}
+%
+% This code implements changes to the output routine.
+%
+%
+%
+%
+% \section{Hooks and configuration points}
+%
+% Note: the configuration points do not have an interface mechanism
+% yet and all their names are temporary right now.
+%
+%
+% \subsubsection{Configuration points}
+%
+% To cater for different layouts with respect to text, footnotes,
+% and bottom-floats placements there are two configuration points for
+% now.
+% \begin{description}
+% \item[\cs{@makecol@cfgpoint} (0 arguments)]
+%
+% In this configuration point the \cs{@outputbox} (holding the
+% galley text for the current column or page) is augmented by
+% attaching floats and footnote areas together with appropriate
+% spacing. Before the code is run any existing glue at the bottom
+% of the \cs{@outputbox} is removed and stored in a safe
+% place. If needed, it can be reinserted with one of the helper
+% commands.
+%
+% To support setting this up the following helper commands are available:
+% \begin{description}
+% \item[\cs{@outputbox@append} (1 argument)]
+%
+% This general purpose command alters the \cs{@outputbox} box by
+% appending material to it.
+%
+% \item[\cs{@outputbox@appendfootnotes} (0 arguments)]
+%
+% This command appends the footnotes to the \cs{@outputbox} (if
+% there are any). If not, then it does nothing.
+%
+% \item[\cs{@outputbox@attachfloats} (0 arguments)]
+% \item[\cs{@outputbox@attachtopfloats} (0 arguments)]
+% \item[\cs{@outputbox@attachbottomfloats} (0 arguments)]
+%
+% Attaching top and bottom floats can usually be done in one
+% go, but for special layouts we might want more control so we
+% provide also separate commands.
+%
+% \item[\cs{@outputbox@reinsertbskip} (0 arguments)]
+%
+% Reinsert the bottom skip of the \cs{@outputbox} that was
+% saved before.
+%
+% \item[Testing for existence of material]
+%
+% There are a number of helpers to run conditional code
+% depending on whether or not there are footnotes or bottom
+% floats. They are \cs{@if@footnotes@TF} and
+% \cs{@if@bfloats@TF}
+% (names are likely to change).
+%
+% \end{description}
+% This configuration point needs an appropriate definition; a
+% default is already given in the kernel.
+%
+% \item[\cs{@makecol@cfgpointii} (0 arguments)]
+%
+% This configuration point is used to manipulate the footnote
+% material inside \cs{box}\cs{footins}. It if contains code, it
+% is supposed to do some processing of that box and then write
+% the result back into it (and nothing else!). By default it
+% does nothing.
+%
+% \end{description}
+%
+% \StopEventually{\setlength\IndexMin{200pt} \PrintIndex }
+%
+%
+% \section{The Implementation}
+%
+% \begin{macrocode}
+%<*code>
+% \end{macrocode}
+%
+% \subsection{File declaration}
+% \begin{macrocode}
+\ProvidesFile{latex-lab-new-or.ltx}
+ [2022-03-09 v0.1b changes to the output routine]
+% \end{macrocode}
+% \subsection{\cs{@makecol} reimplementation}
+%
+% In order for other packages to prepend or append code to
+% \cs{@makecol}, they can use the generic command hooks
+% \texttt{cmd/@makecol/before} and \texttt{cmd/@makecol/after}, so
+% there is nothing we need to do here.
+%
+%
+% \begin{macro}{\@makecol}
+% \cs{@makecol} is shortened a lot, basically all the hardwired
+% code in the middle has moved into a configuration point.
+% \begin{macrocode}
+\def \@makecol {%
+ \@kernel@before@cclv
+ \setbox\@outputbox \box\@cclv
+% \end{macrocode}
+% The only real addition is the next command which either does
+% nothing or removes an infinite glue from the bottom of the
+% \cs{@outputbox}.
+% \begin{macrocode}
+ \@outputbox@removebskip
+% \end{macrocode}
+% Any ``here'' floats in the \cs{@outputbox} are now handled so we
+% recycle their registers and put them back to the \cs{@freelist}.
+% \begin{macrocode}
+ \let\@elt\relax
+ \xdef\@freelist{\@freelist\@midlist}%
+ \global \let \@midlist \@empty
+% \end{macrocode}
+% Here we have the configurable part.
+% \fmi{Interface to configuration points will change in the future}
+% \begin{macrocode}
+ \@makecol@cfgpoint
+% \end{macrocode}
+% The we deal with any \cs{enlargethispage} or run the normal code
+% to build a column.
+% \begin{macrocode}
+ \ifvbox\@kludgeins
+ \@makespecialcolbox
+ \else
+ \@makenormalcolbox
+ \fi
+ \global \maxdepth \@maxdepth
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@outputbox@depth}
+% We need to know the depth of \cs{@outputbox} once in a
+% while. Rather than using a temp dimen (as it was done in the
+% past), we give it a proper register.
+% \begin{macrocode}
+\newdimen\@outputbox@depth
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@makenormalcolbox}
+% Taken out of \cs{@makecol} for readability.
+% \begin{macrocode}
+\def \@makenormalcolbox {%
+ \setbox\@outputbox \vbox to\@colht {%
+ \@texttop
+ \@outputbox@depth \dp\@outputbox
+ \unvbox \@outputbox
+ \vskip -\@outputbox@depth
+ \@textbottom
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@makespecialcolbox}
+% Make the colbox when \cs{enlargethispage} was used.
+% \begin{macrocode}
+\def \@makespecialcolbox {%
+ \@outputbox@append {\vskip-\@outputbox@depth}%
+ \@tempdima \@colht
+ \ifdim \wd\@kludgeins>\z@
+ \advance \@tempdima -\ht\@outputbox
+ \advance \@tempdima \pageshrink
+ \setbox\@outputbox \vbox to \@colht {%
+ \unvbox\@outputbox
+ \vskip \@tempdima
+ \@textbottom
+ }%
+ \else
+ \advance \@tempdima -\ht\@kludgeins
+ \setbox \@outputbox \vbox to \@colht {%
+ \vbox to \@tempdima {%
+ \unvbox\@outputbox
+ \@textbottom}%
+ \vss}%
+ \fi
+ {\setbox \@tempboxa \box \@kludgeins}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@outputbox@removebskip}
+%
+% This is really a bug fix for the kernel but one we only
+% automatically make in new documents using \cs{DocumentMetadata}.
+% \fmi{may make optional for legacy docs}
+% If
+% \cs{raggedbottom} is in force, footnotes get attached to the main
+% galley at a distance of \cs{footskip} on all pages except on
+% those that are ended by \cs{newpage} or \cs{clearpage} where the
+% \cs{vfil} from \cs{newpage} pushes the footnotes to the very bottom.
+%
+% This is kind of a weird difference to a page ending with
+% \cs{pagebreak}---in that case the page is also run
+% short, but the footnotes are not pushed to the bottom.
+%
+% In \pkg{footmisc} \cs{@outputbox@removebskip} is only applied when
+% \pkg{footmisc} is called with with an option specifying the
+% footnote placement, i.e., not in the default case.
+% In new documents we apply it always.
+% \begin{macrocode}
+\def\@outputbox@removebskip{%
+% \end{macrocode}
+% We first test if we are in a \cs{raggedbottom} layout. If not we
+% do nothing, but we don't disable the code because
+% \cs{raggedbottom} may get used only for some parts of the
+% document.
+% \begin{macrocode}
+ \ifx\@textbottom\relax \else
+% \end{macrocode}
+% We then append some negative glue at the end of \cs{@outputbox}
+% provided it has a glue stretch order of 1 or more (i.e., contains
+% a \texttt{fil} or \texttt{fill} part).
+% \begin{macrocode}
+ \@outputbox@append{%
+ \@tempskipa\lastskip
+ \ifnum \gluestretchorder\@tempskipa>\z@
+ \vskip-\@tempskipa
+% \end{macrocode}
+% \begin{macro}{\@outputbox@reinsertbskip}
+% We also record the value so that it can be reinserted
+% elsewhere. As we have to do this globally, we also need to
+% explicitly reset it if we don't find any such glue.
+% \begin{macrocode}
+ \xdef\@outputbox@reinsertbskip
+ {\noexpand\@outputbox@append{\vskip\the\@tempskipa}}%
+ \else
+ \global\let\@outputbox@reinsertbskip\relax
+ \fi
+ }%
+ \fi
+}
+% \end{macrocode}
+% We need a trivial top-level definition for
+% \cs{@outputbox@reinsertbskip} in case the first page has no
+% bottom glue and the command gets called.
+% \begin{macrocode}
+\let\@outputbox@reinsertbskip\relax
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\@kernel@before@cclv}
+% \begin{macro}{\@kernel@before@footins}
+% These two commands are internal kernel hooks intended for tagging
+% support in case that is active. By default they do nothing (and
+% may have been defined already by \cs{DocumentMetadata}).
+% \begin{macrocode}
+\providecommand\@kernel@before@cclv{}
+\providecommand\@kernel@before@footins{}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+% \subsection{The output routine configuration components}
+%
+% Here we provide the components that are used to define
+% \cs{@makecol@cfgpoint}.
+%
+%
+% \begin{macro}{\@outputbox@append}
+%
+% This general purpose command alters the \cs{@outputbox} box by
+% appending material to it. As this is a box typesetting operation
+% we make sure that the last line of the box reflects the true
+% depth of the last line (in case that is needed later). We also
+% expose the current depth of \cs{@outputbox} as
+% \cs{@outputbox@depth} before unboxing so that its value can be
+% used by \verb=#1= if wanted.
+% \begin{macrocode}
+\def\@outputbox@append #1{%
+% \if!\detokenize{#1}!\else
+ \setbox\@outputbox \vbox {%
+ \boxmaxdepth \@maxdepth
+ \@outputbox@depth\dp\@outputbox % if needed in #1
+ \unvbox \@outputbox
+ #1%
+ }%
+% \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%
+% \begin{macro}{\@outputbox@appendfootnotes}
+%
+% This command appends the footnotes to the \cs{@outputbox} (if
+% there are any). If not then it does nothing.
+% \begin{macrocode}
+\def\@outputbox@appendfootnotes {%
+ \ifvoid\footins \else
+% \end{macrocode}
+% First come two configuration points: what to do if we are in a split
+% footnote situation and a second one that does some manipulation
+% of the \cs{footins} box before it gets appended.
+% \fmi{this code will get revised as part of CP handling in the future}
+% \begin{macrocode}
+ \@makecol@handlesplitfootnotes
+ \@makecol@cfgpointii
+% \end{macrocode}
+% Then the footnotes are appended:
+% \begin{macrocode}
+ \@outputbox@append{%
+ \vskip \skip\footins
+ \@kernel@before@footins
+ \color@begingroup
+ \normalcolor
+ \footnoterule
+% \end{macrocode}
+% Support for \pkg{pdfcolfoot}, eventually this can go once color
+% is properly supported.
+% \begin{macrocode}
+ \csname pdfcolfoot@current\endcsname
+ \unvbox \footins
+ \color@endgroup
+ }%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\@outputbox@attachfloats}
+% \begin{macro}{\@outputbox@attachtopfloats}
+% \begin{macro}{\@outputbox@attachbottomfloats}
+% Attaching top and bottom floats can usually be done in one go,
+% but for special layouts we might want more control so we provide
+% also separate commands.
+% \begin{macrocode}
+\let \@outputbox@attachfloats \@combinefloats
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def \@outputbox@attachtopfloats {%
+ \ifx \@toplist\@empty \else \@cflt \fi
+}
+\def \@outputbox@attachbottomfloats {%
+ \ifx \@botlist\@empty \else \@cflb \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+% \begin{macro}{\@makecol@handlesplitfootnotes}
+% \begin{macro}{\@makecol@splitfootnotemessagehook}
+% This is only an early draft and doesn't do much.
+% Contains incomplete preparation for tagging commented out.
+% \fmi{Interfaces and code will change in the future}
+% \begin{macrocode}
+\def\@makecol@handlesplitfootnotes {%
+% \ifx\splitfootnote@continuation\@empty \else
+% \setbox\footins\vbox{\splitfootnote@continuation\unvbox\footins}%
+% \global\let\splitfootnote@continuation\@empty
+% \fi
+ \ifnum\insertpenalties>\z@
+ \@makecol@splitfootnotemessagehook
+% \setbox\footins\vbox{\unvbox\footins --- END at split}%
+% \gdef\splitfootnote@continuation {--- START after split}%
+ \fi
+}
+%\def\splitfootnote@continuation{}
+% \end{macrocode}
+% This could issue warning if split footnotes are encountered.
+% \begin{macrocode}
+\let \@makecol@splitfootnotemessagehook \@empty
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\@makecol@cfgpointii}
+%
+% Configuration point to support manipulation of footins box
+% (result needs to be moved back in there). Used by the
+% \texttt{para} option.
+% \fmi{Interface will change in the future}
+% \begin{macrocode}
+\let \@makecol@cfgpointii \@empty
+% \end{macrocode}
+%
+% \end{macro}
+%
+%
+%
+% \fmi{Some temp interfaces until configuration points are available.}
+%
+% \begin{macro}{\@if@flushbottom@TF}
+% Test for \cs{flushbottom} (currently not used).
+% \begin{macrocode}
+\def\@if@flushbottom@TF{%
+ \ifx\@textbottom\relax
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@if@footnotes@TF}
+% Test if footnotes are present on the current page.
+% \begin{macrocode}
+\def\@if@footnotes@TF{%
+ \ifvoid\footins
+ \expandafter\@secondoftwo
+ \else
+ \expandafter\@firstoftwo
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@if@bfloats@TF}
+% Test if bottom floats are around.
+% \begin{macrocode}
+\def\@if@bfloats@TF{%
+ \ifx \@botlist\@empty
+ \expandafter\@secondoftwo
+ \else
+ \expandafter\@firstoftwo
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsection{The \cs{@makecol} configuration}
+%
+%
+% \begin{macro}{\@makecol@cfgpoint}
+%
+% Here is only the configuration for the default case for now,
+% others are provided by \pkg{footmisc}.
+%
+% \begin{macrocode}
+ \def\@makecol@cfgpoint {%
+ \@outputbox@appendfootnotes
+ \@outputbox@attachfloats
+% \end{macrocode}
+% We do, however, reinsert the bottom skip from \cs{newpage} if it
+% was taken out earlier. This is, strictly speaking, not necessary
+% in most cases, but it is a \cs{vfil} while \cs{raggedbottom} is
+% only generating \verb=\vspace{0pt plus .0001fil}=, so if you have
+% several \cs{vfil} on the page before the \cs{newpage} you would
+% alter the space distribution if one is taken out.
+% \begin{macrocode}
+ \@outputbox@reinsertbskip
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \section {Replacement for the \pkg{footmisc} package}
+%
+% The replacement for \pkg{footmisc}. If the new code is used, we must replace
+% the package if it is loaded by the user:
+% \begin{macrocode}
+\declare@file@substitution{footmisc.sty}{latex-lab-footmisc.ltx}
+% \end{macrocode}
+%
+%
+%
+% \section {Temp stuff that is related but should go to the kernel}
+%
+% \begin{macrocode}
+\input{latex-lab-footnotes.ltx}
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+%</code>
+% \end{macrocode}
+%
+% \Finale
+%
diff --git a/macros/latex/required/latex-lab/latex-lab-new-or.pdf b/macros/latex/required/latex-lab/latex-lab-new-or.pdf
new file mode 100644
index 0000000000..ad45673c55
--- /dev/null
+++ b/macros/latex/required/latex-lab/latex-lab-new-or.pdf
Binary files differ
diff --git a/macros/latex/required/latex-lab/latex-lab-testphase.dtx b/macros/latex/required/latex-lab/latex-lab-testphase.dtx
new file mode 100644
index 0000000000..d8d9c671c3
--- /dev/null
+++ b/macros/latex/required/latex-lab/latex-lab-testphase.dtx
@@ -0,0 +1,84 @@
+% \iffalse meta-comment
+%
+%% File: latex-lab-testphase.dtx
+% Copyright (C) 2021-2022 The LaTeX Project
+%
+% It may be distributed and/or modified under the conditions of the
+% LaTeX Project Public License (LPPL), either version 1.3c of this
+% license or (at your option) any later version. The latest version
+% of this license is in the file
+%
+% https://www.latex-project.org/lppl.txt
+%
+%
+% The development version of the bundle can be found below
+%
+% https://github.com/latex3/latex2e/required/latex-lab
+%
+% for those people who are interested or want to report an issue.
+%
+%<*driver>
+\documentclass{l3doc}
+\EnableCrossrefs
+\CodelineIndex
+\begin{document}
+ \DocInput{latex-lab-testphase.dtx}
+\end{document}
+%</driver>
+%
+% \fi
+%
+
+% \title{The \texttt{latex-lab-testphase} code\thanks{}}
+% \author{Ulrike Fischer \LaTeX{} Project}
+%
+% \maketitle
+%
+%
+% \begin{abstract}
+% \end{abstract}
+%
+% \section{Introduction}
+%
+% This code implements small files which can be loaded with the |testphase|
+% key of \cs{DocumentMetadata}. This will be extended to allow user to load
+% well defined parts of the tagged PDF project.
+% Currently the values |phase-I|, |phase-II| and |new-or| are provided.
+% |tagpdf| is an undocumented alias for |phase-II| which is kept for compability.
+%
+%
+% \StopEventually{\setlength\IndexMin{200pt} \PrintIndex }
+%
+%
+% \section{The Implementation}
+% New output routine code is loaded in phase-II and new-or:
+% \begin{macrocode}
+%<*tagpdf|phase-II|new-or>
+\IfFileExists{latex-lab-testphase-new-or.sty}
+ {
+ \RequirePackage{latex-lab-testphase-new-or}
+ }
+ {}
+%</tagpdf|phase-II|new-or>
+% \end{macrocode}
+% \begin{macrocode}
+%<*tagpdf|phase-I|phase-II>
+% \end{macrocode}
+%
+% \begin{macrocode}
+\RequirePackage{tagpdf}
+\AddToDocumentProperties [document]{testphase/tagpdf}{loaded}
+%</tagpdf|phase-I|phase-II>
+%<tagpdf|phase-II>\tagpdfsetup{activate,paratagging,interwordspace}
+%<phase-I>\tagpdfsetup{activate,interwordspace}
+%<*tagpdf|phase-I|phase-II>
+\AddToDocumentProperties [document]{tagging}{active}
+\AddToDocumentProperties [document]{tagging/para}{active}
+\AddToDocumentProperties [document]{tagging/interwordspace}{active}
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</tagpdf|phase-I|phase-II>
+% \end{macrocode}
+% \Finale
+%
diff --git a/macros/latex/required/latex-lab/latex-lab-testphase.pdf b/macros/latex/required/latex-lab/latex-lab-testphase.pdf
new file mode 100644
index 0000000000..6ab6a28554
--- /dev/null
+++ b/macros/latex/required/latex-lab/latex-lab-testphase.pdf
Binary files differ
diff --git a/macros/latex/required/latex-lab/latex-lab.ins b/macros/latex/required/latex-lab/latex-lab.ins
new file mode 100644
index 0000000000..bc668a71e1
--- /dev/null
+++ b/macros/latex/required/latex-lab/latex-lab.ins
@@ -0,0 +1,82 @@
+%%
+%% This file will generate fast loadable files and documentation
+%% driver files from the dtx file(s) in this package when run through
+%% LaTeX or TeX.
+%%
+%% Copyright (C) 2021-2022 The LaTeX Project
+%%
+%%
+%% This file is part of the `LaTeX-lab Bundle' for LaTeX.
+%% -------------------------------------------------------------------
+%%
+%% 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.
+%%
+%% In particular, NO PERMISSION is granted to modify the contents of this
+%% file since it contains the legal notices that are placed in the files
+%% it generates.
+%%
+%%
+%%
+%% --------------- start of docstrip commands ------------------
+%%
+\input docstrip
+
+\keepsilent
+
+\usedir{tex/latex/contrib/latex-lab}
+
+\preamble
+
+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.
+
+
+\endpreamble
+
+
+\generate{\file{documentmetadata-support.ltx}{\from{documentmetadata-support.dtx}{code}}}
+
+% files that should be loadable with the testphase key should use the naming scheme
+% #1-latex-lab-testphase.ltx
+\generate{\file{phase-I-latex-lab-testphase.ltx}{\from{latex-lab-testphase.dtx}{phase-I}}}
+\generate{\file{phase-II-latex-lab-testphase.ltx}{\from{latex-lab-testphase.dtx}{phase-II}}}
+
+\generate{\file{tagpdf-latex-lab-testphase.ltx}{\from{latex-lab-testphase.dtx}{tagpdf}}}
+\generate{\file{new-or-latex-lab-testphase.ltx}{\from{latex-lab-testphase.dtx}{new-or}}}
+
+% support files (the new-or code is a private package to make life easier)
+
+\generate{\file{latex-lab-testphase-new-or.sty}{\from{latex-lab-new-or.dtx}{code}}}
+\generate{\file{latex-lab-footmisc.ltx}{\from{latex-lab-footnotes.dtx}{footmisc}}}
+\generate{\file{latex-lab-footnotes.ltx}{\from{latex-lab-footnotes.dtx}{kernel}}}
+
+
+\endbatchfile
diff --git a/macros/latex/required/latex-lab/usage-of-@footnotemark.txt b/macros/latex/required/latex-lab/usage-of-@footnotemark.txt
new file mode 100644
index 0000000000..684a695faa
--- /dev/null
+++ b/macros/latex/required/latex-lab/usage-of-@footnotemark.txt
@@ -0,0 +1,186 @@
+% packages that alter \@footnotemark ...
+
+
+% bibarts
+
+\let\ba@footnmark=\@footnotemark
+\def\@footnotemark{\ifhmode{\nobreak \hskip 0.04em plus 0.01em}\else\leavevmode\fi\ba@footnmark}%
+
+
+% ./bxjscls/bxjsja-minimal.def
+
+\def\bxjs@cjk@loaded{%
+ \def\@footnotemark{%
+ \leavevmode
+ \ifhmode
+ \edef\@x@sf{\the\spacefactor}%
+ \ifdim\lastkern>\z@\ifdim\lastkern<5sp\relax
+ \unkern\unkern
+ \ifdim\lastskip>\z@ \unskip \fi
+ \fi\fi
+ \nobreak
+ \fi
+ \@makefnmark
+ \ifhmode \spacefactor\@x@sf \fi
+ \relax}%
+ \let\bxjs@cjk@loaded\relax
+}
+
+% ./arabtex/afoot.sty
+
+\let \a@@footnotemark \@footnotemark
+
+\def \a@footnotemark {% inside Arabic environment
+\iftrans \unskip \unskip \nobreak \@makefnmark \fi
+\ifarab \a@spacefalse \putwordb@x \@makefnmark \a@spacetrue \fi }
+
+% ./hyperref/hyperref.sty
+
+ \def\@footnotemark{%
+ \leavevmode
+ \ifhmode\edef\@x@sf{\the\spacefactor}\nobreak\fi
+ \stepcounter{Hfootnote}%
+ \global\let\Hy@saved@currentHref\@currentHref
+ \hyper@makecurrent{Hfootnote}%
+ \global\let\Hy@footnote@currentHref\@currentHref
+ \global\let\@currentHref\Hy@saved@currentHref
+ \hyper@linkstart{link}{\Hy@footnote@currentHref}%
+ \@makefnmark
+ \hyper@linkend
+ \ifhmode\spacefactor\@x@sf\fi
+ \relax
+ }%
+
+
+% ./hypdvips/hypdvips.sty
+
+ \def\@footnotemark{%
+ \leavevmode
+ \ifhmode\edef\@x@sf{\the\spacefactor}\nobreak\fi
+ \stepcounter{Hfootnote}%
+ \global\let\Hy@saved@currentHref\@currentHref
+ \hyper@makecurrent{Hfootnote}%
+ \global\let\Hy@footnote@currentHref\@currentHref
+ \global\let\@currentHref\Hy@saved@currentHref
+ \ifHy@draft%
+ \@makefnmark%
+ \else%
+ \pp@hyperfootnote%
+ \fi%
+ \ifhmode\spacefactor\@x@sf\fi
+ \relax
+ }
+
+ \newcommand{\pp@hyperfootnote}{%
+ \ifx\pp@activerect\pp@true%
+ \@makefnmark%
+ \else%
+ \ifpp@smallfootnotes%
+ \let\pp@backup@@thefnmark\@thefnmark%
+ \renewcommand{\@thefnmark}{\pdf@rect{\pp@backup@@thefnmark}}%
+ \Hy@colorlink\@footnotecolor%
+ \@makefnmark%
+ \Hy@endcolorlink%
+ \pdfmark{%
+ pdfmark=/ANN,%
+ linktype=footnote,%
+ Subtype=/Link,%
+ AcroHighlight=\@pdfhighlight,%
+ Border=\@pdfborder,%
+ BorderStyle=\@pdfborderstyle,%
+ Color=\@footnotebordercolor,%
+ Dest=\Hy@footnote@currentHref,%
+ Raw=H.B%
+ }%
+ \let\@thefnmark\pp@backup@@thefnmark%
+ \else%
+ \pdfmark[\@makefnmark]{%
+ pdfmark=/ANN,%
+ linktype=footnote,%
+ Subtype=/Link,%
+ AcroHighlight=\@pdfhighlight,%
+ Border=\@pdfborder,%
+ BorderStyle=\@pdfborderstyle,%
+ Color=\@footnotebordercolor,%
+ Dest=\Hy@footnote@currentHref%
+ }%
+ \fi%
+ \fi%
+ }
+
+
+% ./memoir/memhfixc.sty
+
+\ifHy@hyperfootnotes
+ \def\@footnotemark{%
+ \leavevmode
+ \ifhmode\edef\@x@sf{\the\spacefactor}%
+ \m@mmf@check% <--- added
+ \nobreak\fi
+ \stepcounter{Hfootnote}%
+ \global\let\Hy@saved@currentHref\@currentHref
+ \hyper@makecurrent{Hfootnote}%
+ \global\let\Hy@footnote@currentHref\@currentHref
+ \global\let\@currentHref\Hy@saved@currentHref
+ \hyper@linkstart{link}{\Hy@footnote@currentHref}%
+ \@makefnmark
+ \hyper@linkend
+ \m@mmf@prepare% <--- added
+ \ifhmode\spacefactor\@x@sf\fi
+ \relax
+ }%
+\fi
+
+
+% caption3.sty
+
+% this is altering the top-level when inside a float
+
+
+% ./koma-script/scrlttr2.cls
+
+\newcommand*{\scr@footnotemark}{%
+ \leavevmode
+ \ifhmode\edef\@x@sf{\the\spacefactor}\FN@mf@check\nobreak\fi
+ \@makefnmark
+ \csname FN@mf@prepare\endcsname
+ \ifhmode\spacefactor\@x@sf\fi
+ \relax}
+
+% tested against this ...
+
+\newcommand*{\scr@saved@footnotemark}{%
+ \leavevmode
+ \ifhmode\edef\@x@sf{\the\spacefactor}\nobreak\fi
+ \@makefnmark
+ \ifhmode\spacefactor\@x@sf\fi
+ \relax}
+
+
+% ./chextras/chextras.sty
+
+\ifstd@notes\else
+ \let\std@footnotemark\@footnotemark
+ \def\alt@footnotemark{\unskip\thinspace\std@footnotemark}
+ \let\@footnotemark\alt@footnotemark
+
+% footmisx.sty
+
+ \newcommand*\@footmisxnotemark{%
+ \leavevmode
+ \ifhmode
+ \edef\@x@sf{\the\spacefactor}%
+ \FN@mf@check
+ \nobreak
+ \fi
+ \@footmicx@makefnmark
+ \ifFN@pp@towrite
+ \FN@pp@writetemp
+ \FN@pp@towritefalse
+ \fi
+ \FN@mf@prepare
+ \ifhmode\spacefactor\@x@sf\fi
+ \relax
+ }
+
+
diff --git a/macros/latex/required/latex-lab/usage-of-@footnotetext.txt b/macros/latex/required/latex-lab/usage-of-@footnotetext.txt
new file mode 100644
index 0000000000..48a3172843
--- /dev/null
+++ b/macros/latex/required/latex-lab/usage-of-@footnotetext.txt
@@ -0,0 +1,842 @@
+
+% ./bibarts/bibarts.sty
+
+\let\ba@footnotetext=\@footnotetext
+\long\def\@footnotetext#1{\ba@footnotetext{%
+ \global\let\thisto@ba=-%
+ \global\let\thisti@ba=-%
+ \global\let\thisp@ba=-%
+ \global\let\thisvol@ba=-%
+ \global\let\thiss@ba=-%
+ \global\let\thisn@ba=-%
+ \global\let\pos@ba=0%
+ \kern 0.1em\nulskip@ba{\@footnotetrue\ignorespaces
+ #1\nulskip@ba\ba@textmode}\global\let\lastto@ba=\thisto@ba
+ \global\let\lastti@ba=\thisti@ba
+ \global\let\lastp@ba=\thisp@ba
+ \global\let\lastvol@ba=\thisvol@ba
+ \global\let\lasts@ba=\thiss@ba
+ \global\let\lastn@ba=\thisn@ba}}%
+
+
+% ./fnbreak/fnbreak.sty
+
+ \let\fnb@orig@footnotetext\@footnotetext
+ \long\def\@footnotetext#1{\fnb@orig@footnotetext{\fnb@fnstart#1\fnb@fnend}}%
+
+
+% ./revtex4-1/revtex4-1.cls ./revtex/ltxutil.sty ./revtex/revtex4-2.cls ...
+
+\long\def\@footnotetext{%
+ \insert\footins\bgroup
+ \make@footnotetext
+}%
+\long\def\@mpfootnotetext{%
+ \minipagefootnote@pick
+ \make@footnotetext
+}%
+\long\def\make@footnotetext#1{%
+ \set@footnotefont
+ \set@footnotewidth
+ \@parboxrestore
+ \protected@edef\@currentlabel{%
+ \csname p@\@mpfn\endcsname\@thefnmark
+ }%
+ \color@begingroup
+ \@makefntext{%
+ \rule\z@\footnotesep\ignorespaces#1%
+ \@finalstrut\strutbox\vadjust{\vskip\z@skip}%
+ }%
+ \color@endgroup
+ \minipagefootnote@drop
+}%
+
+
+% ./nrc/nrc1.cls ./nrc/nrc2.cls
+
+% this is missing the \par at the end and \@currentcounter
+
+\long\def\@footnotetext#1{%
+ \insert\footins{%
+ \reset@font\smallt
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\footnotesep
+ \splitmaxdepth \dp\strutbox \floatingpenalty \@MM
+ \hsize\columnwidth \@parboxrestore
+ \protected@edef\@currentlabel{%
+ \csname p@footnote\endcsname\@thefnmark
+ }%
+ \color@begingroup
+ \@makefntext{%
+ \rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox
+ }%
+ \color@endgroup
+ }%
+}%
+
+%-------------------------------------
+
+% ./bigfoot/bigfoot.sty
+
+ \def\@footnotetext{\Footnotetextdefault{}}%
+
+%-------------------------------------
+
+
+% ./uafthesis/uafthesis.cls
+
+% this is missing the \par at the end and \@currentcounter
+
+%% this little gem provides for single-spaced footnotes
+\long\def\@footnotetext#1{\insert\footins{%
+ \ssp
+ \reset@font\footnotesize
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\footnotesep
+ \splitmaxdepth \dp\strutbox \floatingpenalty \@MM
+ \hsize\columnwidth \@parboxrestore
+ \edef\@currentlabel{\csname p@footnote\endcsname\@thefnmark}\@makefntext
+ {\rule{\z@}{\footnotesep}\ignorespaces
+ #1\strut}}}
+
+%-------------------------------------
+
+
+
+% ./resphilosophica/resphilosophica.cls
+
+% I wonder if this \, is really intended below ...
+
+\long\def\@footnotetext#1{%
+ \insert\footins{%
+ \normalfont\footnotesize
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\footnotesep \splitmaxdepth \dp\strutbox
+ \floatingpenalty\@MM \hsize\columnwidth
+ \@parboxrestore \parindent\normalparindent \sloppy
+ \protected@edef\@currentlabel{%
+ \csname p@footnote\endcsname\@thefnmark}%
+ \@makefntext{%
+ \,\rule\z@\footnotesep\ignorespaces#1\unskip\strut\par}}}
+
+%-------------------------------------
+
+
+
+% ./setspace/setspace.sty
+
+% this is missing the \par at the end and \@currentcounter
+
+\long\def\@footnotetext#1{%
+ \insert\footins{%
+% GT: Next line added. Hook desired here!
+ \def\baselinestretch {\setspace@singlespace}%
+ \reset@font\footnotesize
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\footnotesep
+ \splitmaxdepth \dp\strutbox \floatingpenalty \@MM
+ \hsize\columnwidth
+ \@parboxrestore
+ \protected@edef\@currentlabel{%
+ \csname p@footnote\endcsname\@thefnmark
+ }%
+ \color@begingroup
+ \@makefntext{%
+ \rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox}%
+ \color@endgroup}}
+
+%-------------------------------------
+
+
+
+% ./linguex/linguex.sty
+
+
+\let\predefinedfootnotetext=\@footnotetext
+\long\def\@footnotetext#1{\@noftnotefalse\predefinedfootnotetext{#1}%
+ \@noftnotetrue}
+
+
+%-------------------------------------
+
+
+% ./fnpara/fnpara.sty
+
+\long\def\@footnotetext#1{\insert\footins{%
+ \reset@font\footnotesize
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\footnotesep
+ \splitmaxdepth \dp\strutbox \floatingpenalty \@MM
+ \hsize\columnwidth \@parboxrestore
+ \protected@edef\@currentlabel{%
+ \csname p@footnote\endcsname\@thefnmark
+ }%
+ \color@begingroup
+ \setbox0=\hbox{%
+ \@makefntext{%
+ \rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox
+ \penalty -10
+ \hskip\footglue
+ }%
+ }%
+ \dp0=0pt \ht0=\fudgefactor\wd0 \box0
+ \color@endgroup}}
+
+%-------------------------------------
+
+
+% ./footmisc/footmisc.sty (para option)
+
+% this is missing the \par at the end and \@currentcounter
+
+ \long\def\FN@footnotetext#1{%
+ \insert\footins{%
+ \ifFN@setspace
+ \let\baselinestretch\FN@baselinestretch
+ \fi
+ \reset@font\footnotesize
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\footnotesep
+ \splitmaxdepth \dp\strutbox
+ \floatingpenalty\@MM
+ \hsize\columnwidth
+ \@parboxrestore
+ \protected@edef\@currentlabel{\csname p@footnote\endcsname\@thefnmark}%
+ \color@begingroup
+ \setbox\FN@tempboxa\hbox{%
+ \@makefntext{\ignorespaces#1\strut
+ \penalty-10\relax
+ \hskip\footglue
+ }% end of \@makefntext parameter
+ }% end of \hbox
+ \dp\FN@tempboxa\z@
+ \ht\FN@tempboxa\dimexpr\wd\FN@tempboxa *%
+ \footnotebaselineskip / \columnwidth\relax
+ \box\FN@tempboxa
+ \color@endgroup
+ }%
+ \FN@mf@prepare
+ }
+
+%-------------------------------------
+
+
+% ./footmisc/footmisc.sty (normal)
+
+% this is missing the \par at the end and \@currentcounter
+
+ \long\def\FN@footnotetext#1{%
+ \insert\footins{%
+ \ifFN@setspace
+ \let\baselinestretch\FN@baselinestretch
+ \fi
+ \reset@font\footnotesize
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\footnotesep
+ \splitmaxdepth \dp\strutbox
+ \floatingpenalty\@MM
+ \hsize\columnwidth
+ \@parboxrestore
+ \protected@edef\@currentlabel{%
+ \csname p@footnote\endcsname\@thefnmark
+ }%
+ \color@begingroup
+ \@makefntext{%
+ \rule\z@\footnotesep
+ \ignorespaces#1\@finalstrut\strutbox
+ }%
+ \color@endgroup
+ }%
+ \FN@mf@prepare
+ }%
+
+
+
+%-------------------------------------
+
+
+% ./footmisc/footmisc.sty (side option)
+
+ \long\def\FN@footnotetext#1{%
+ \marginpar{%
+ \ifFN@setspace
+ \let\baselinestretch\FN@baselinestretch
+ \fi
+ \reset@font\footnotesize
+ \protected@edef\@currentlabel{%
+ \csname p@footnote\endcsname\@thefnmark
+ }%
+ \color@begingroup
+ \@makefntext{%
+ \ignorespaces#1%
+ }%
+ \color@endgroup
+ }%
+ \FN@mf@prepare
+ }%
+
+
+
+%-------------------------------------
+
+
+
+% ./bxjscls/bxjsarticle.cls ./bxjscls/bxjsbook.cls ...
+
+\long\def\@footnotetext{%
+ \insert\footins\bgroup
+ \normalfont\footnotesize
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\footnotesep
+ \splitmaxdepth \dp\strutbox \floatingpenalty \@MM
+ \hsize\columnwidth \@parboxrestore
+ \protected@edef\@currentlabel{%
+ \csname p@footnote\endcsname\@thefnmark
+ }%
+ \color@begingroup
+ \@makefntext{%
+ \rule\z@\footnotesep\ignorespaces}%
+ \futurelet\jsc@next\jsc@fo@t}
+\def\jsc@fo@t{\ifcat\bgroup\noexpand\jsc@next \let\jsc@next\jsc@f@@t
+ \else \let\jsc@next\jsc@f@t\fi \jsc@next}
+\def\jsc@f@@t{\bgroup\aftergroup\jsc@@foot\let\jsc@next}
+\def\jsc@f@t#1{#1\jsc@@foot}
+\def\jsc@@foot{\@finalstrut\strutbox\color@endgroup\egroup
+ \ifx\pltx@foot@penalty\@undefined\else
+ \ifhmode\null\fi
+ \ifnum\pltx@foot@penalty=\z@\else
+ \penalty\pltx@foot@penalty
+ \pltx@foot@penalty\z@
+ \fi
+ \fi}
+
+
+not covered so far supports \footnote{ catcode changes ...} but also
+\foonote A --- the latter is questionable I would say
+
+
+%-------------------------------------
+
+
+% ./fn2end/fn2end.sty
+
+obsolete I guess, ignored in evaluation
+
+
+%-------------------------------------
+
+
+% ./hyperref/hyperref.sty
+
+ \long\def\@footnotetext#1{%
+ \H@@footnotetext{%
+ \ifHy@nesting
+ \expandafter\ltx@firstoftwo
+ \else
+ \expandafter\ltx@secondoftwo
+ \fi
+ {%
+ \expandafter\hyper@@anchor\expandafter{%
+ \Hy@footnote@currentHref
+ }{\ignorespaces #1}%
+ }{%
+ \Hy@raisedlink{%
+ \expandafter\hyper@@anchor\expandafter{%
+ \Hy@footnote@currentHref
+ }{\relax}%
+ }%
+ \let\@currentHref\Hy@footnote@currentHref
+ \let\@currentlabelname\@empty
+ \ignorespaces #1%
+ }%
+ }%
+ }%
+
+
+Handling of anchors (in nested context) I guess. This needs to be
+married with the anchor setting that the tagging currently does and
+the latter improved/adjusted
+
+
+%-------------------------------------
+
+% ./biblatex-gb7714-2015/gb7714-2015ms.bbx ./biblatex-gb7714-2015/gb7714-2015mx.bbx ...
+
+ \long\def\@footnotetext##1{\insert\footins{%
+ \reset@font\footnotesize
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\footnotesep
+ \splitmaxdepth \dp\strutbox \floatingpenalty \@MM
+ \hsize\columnwidth \@parboxrestore
+ \protected@edef\@currentlabel{%
+ \csname p@footnote\endcsname\@thefnmark
+ }%
+ \color@begingroup
+ \leftskip \footbibmargin%增加的左侧缩进
+ \@makefntext{%
+ \rule\z@\footnotesep\ignorespaces##1\@finalstrut\strutbox%
+ }%
+ \color@endgroup}}%
+
+fits the structure
+%-------------------------------------
+
+
+% ./amscls/amsbook.cls ./amscls/amsproc.cls ./amscls/amsart.cls ...
+
+\long\def\@footnotetext#1{%
+ \insert\footins{%
+ \normalfont\footnotesize
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\footnotesep \splitmaxdepth \dp\strutbox
+ \floatingpenalty\@MM \hsize\columnwidth
+ \@parboxrestore \parindent\normalparindent \sloppy
+ \protected@edef\@currentlabel{%
+ \csname p@footnote\endcsname\@thefnmark}%
+ \@makefntext{%
+ \rule\z@\footnotesep\ignorespaces#1\unskip\strut\par}}}
+
+fits the structure
+%-------------------------------------
+
+
+% ./umich-thesis/umich-thesis.cls
+
+% change LaTeX's footnotes to get vertical spacing correct
+\skip\footins \baselinestretch2\skip\footins
+\long\def\@footnotetext#1{%
+ \insert\footins{%
+ \def\baselinestretch {\setspace@singlespace}%
+ \reset@font\footnotesize
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\footnotesep
+ \splitmaxdepth \dp\strutbox \floatingpenalty \@MM
+ \hsize\columnwidth
+ \@parboxrestore
+ \vskip 1.2\baselineskip
+ \protected@edef\@currentlabel{%
+ \csname p@footnote\endcsname\@thefnmark
+ }%
+ \color@begingroup
+ \@makefntext{%
+ \rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox}%
+ \color@endgroup}}
+
+fits the structure
+%-------------------------------------
+
+
+% ./nostarch/nostarch.cls
+
+\long\def\@footnotetext#1{\insert\footins{%
+ \reset@font\footnotesize
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\footnotesep
+ \splitmaxdepth \dp\strutbox \floatingpenalty \@MM
+ \hsize\columnwidth \@parboxrestore
+ \protected@edef\@currentlabel{%
+ \csname p@footnote\endcsname\@thefnmark
+ }%
+ \color@begingroup
+ \@makefntext{%
+ \rule\z@{13.5pt}\ignorespaces#1}%
+ \color@endgroup}}%
+
+fixed \footsep, probably very old
+fits the structure
+%-------------------------------------
+
+
+
+% ./coursepaper/coursepaper.cls
+
+\long\def\@footnotetext#1{%
+ \insert\footins{%
+ \def\baselinestretch {1}%
+ \reset@font\footnotesize
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\footnotesep
+ \splitmaxdepth \dp\strutbox \floatingpenalty \@MM
+ \hsize\columnwidth
+ \@parboxrestore
+ \protected@edef\@currentlabel{%
+ \csname p@footnote\endcsname\@thefnmark
+ }%
+ \color@begingroup
+ \@makefntext{%
+ \rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox}%
+ \color@endgroup}}
+
+fits the structure
+%-------------------------------------
+
+
+
+% ./ucthesis/ucthesis.cls
+
+% Single-space footnotes.
+\long\def\@footnotetext#1{\insert\footins{\ssp\reset@font\footnotesize
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\footnotesep
+ \splitmaxdepth \dp\strutbox \floatingpenalty \@MM
+ \hsize\columnwidth \@parboxrestore
+ \edef\@currentlabel{\csname p@footnote\endcsname\@thefnmark}\@makefntext
+ {\rule{\z@}{\footnotesep}\ignorespaces
+ #1\strut}}}
+
+fits the structure
+%-------------------------------------
+
+
+
+% ./jura/jura.cls
+
+\long\def\@footnotetext#1{\insert\footins{%
+ \linespread{\J@FootnoteSpread}\reset@font\footnotesize
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\footnotesep
+ \splitmaxdepth \dp\strutbox \floatingpenalty \@MM
+ \hsize\columnwidth \@parboxrestore
+ \protected@edef\@currentlabel{%
+ \csname p@footnote\endcsname\@thefnmark
+ }%
+ \color@begingroup
+ \@makefntext{%
+ \rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox}%
+ \color@endgroup}}%
+
+fits the structure
+%-------------------------------------
+
+
+% ./asaetr/asaesub.sty
+
+2.09
+
+%-------------------------------------
+
+
+% ./lineno/fnlineno.sty
+
+%% |\FNLN@@text| stores the `\@footnotetext' found,
+%% we might check if it is `\FNLN@ltx@fntext' ... %% TODO
+\let\FNLN@@text\@footnotetext
+\def\@footnotetext{%
+ \ifLineNumbers \expandafter \FNLN@text
+ \else \expandafter \FNLN@@text
+ \fi}
+
+
+\def \FNLN@text {% %% 2010/12/31 arg read later
+ \vadjust{\penalty-\FNLN@M@swap@codepen}%
+%% Standard \LaTeX's `\@footnotetext' expands `\@thefnmark'
+%% to produce the footnote mark at the page bottom,
+%% right after it has been determined for the mark
+%% in the main text. \emph{Here} the footnote text
+%% will be typeset only when \emph{other} footnote marks
+%% may have been formed for typesetting the main text
+%% paragraph before.
+%% %%% (TODO clearer wording)
+%% In the \strong{footnote list}
+%% macro |\FNLN@list|, the (\dqtd{`&\protect'ed})
+%% \emph{current} expansion <mark> of `\@thefnmark'
+%% is stored as an item preceding the footnote text
+%% <text>. One footnote entry in `\FNLN@list'
+%% thus has the form \lq`<mark>\@lt<text>\@lt'\rq.
+%% \LaTeX's internal `\g@addto@macro' is used to \emph{append}
+%% an entry to the list (at the right). The OTR will later
+%% take the entries from the left of the list.
+%%
+%% The argument of the auxiliary/temporary `\@tempa'
+%% will contain the footnote text and thus must be able to
+%% carry `\par' tokens. We therefore need a `\long' version of
+%% `\protected@edef':
+ \let\@@protect\protect
+ \let\protect\@unexpandable@protect
+ \afterassignment\restore@protect
+ \long \edef \@tempa ##1{%
+ \noexpand\g@addto@macro \noexpand\FNLN@list {%
+ \@thefnmark \noexpand\@lt ##1\noexpand \@lt}}%
+%% ... issuing
+%% \lq`\g@addto@macro\FNLN@list{<mark>\elt<text>\@lt}'\rq\ ...
+ \@tempa %% reads arg
+}
+%% Here we initialize |\FNLN@list|:
+\let\FNLN@list\@empty
+
+
+
+probably continues working but needs separate checking
+
+%-------------------------------------
+
+
+
+% ./jurabib/jurabib.sty
+
+ \long\def\@footnotetext#1{%
+ \Orig@tabularx@footnotetext{%
+ \jb@fntrue
+ #1%
+ \setcounter{jb@cites@in@footnote}{0}%
+ }%
+ }%
+
+ \let\jbsaved@footnotetext\@footnotetext
+ \long\def\@footnotetext#1{%
+ \begingroup
+ \jb@fntrue
+ \jbsaved@footnotetext{#1}%
+ \setcounter{jb@cites@in@footnote}{0}%
+ \endgroup
+ }%
+
+
+first is table notes, second
+fits the structure
+%-------------------------------------
+
+
+
+% ./york-thesis/york-thesis.cls
+
+\long\def\@footnotetext#1{%
+ \insert\footins{%
+ \def\baselinestretch {1}%
+ \reset@font\footnotesize
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\footnotesep
+ \splitmaxdepth \dp\strutbox \floatingpenalty \@MM
+ \hsize\columnwidth
+ \@parboxrestore
+ \protected@edef\@currentlabel{%
+ \csname p@footnote\endcsname\@thefnmark}%
+ \color@begingroup
+ \@makefntext{%
+ \rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox}%
+ \color@endgroup}}
+
+fits the structure
+%-------------------------------------
+
+
+% ./ucdavisthesis/ucdavisthesis.cls
+
+\long\def\@footnotetext#1{\insert\footins{\renewcommand\baselinestretch{1}
+ \footnotesize
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\footnotesep
+ \splitmaxdepth \dp\strutbox \floatingpenalty \@MM
+ \hsize\columnwidth \@parboxrestore
+ \edef\@currentlabel{\csname p@footnote\endcsname\@thefnmark}\@makefntext
+ {\rule{\z@}{\footnotesep}\ignorespaces
+ #1\strut}\renewcommand\baselinestretch{\@spacing}}}
+
+looks old ...
+fits the structure
+%-------------------------------------
+
+
+% ./ledmac/afoot.sty
+
+fairly old and buggy in some aspects
+
+%%% Make the LaTeX \cs{footnote} catcode-safe, like in Plain TeX.
+
+\def \@footnotetext {% new, do not yet read footnote text
+ \insert \footins \bgroup
+ \ifx \footglue \undefined % prepare normal footnote
+ \interlinepenalty \interfootnotelinepenalty \floatingpenalty \@MM
+ \splittopskip \footnotesep \splitmaxdepth \dp \strutbox
+ \else
+ \global\long\def \@makefntext ##1{{$^{\@thefnmark }$}##1\nobreak }%
+ \setbox0=\hbox \bgroup % fnpara.sty is present
+ \floatingpenalty=20000 \footnotesize
+ \fi
+ \edef\@currentlabel{\csname p@footnote\endcsname\@thefnmark}%
+ \a@fntext }
+
+
+%-------------------------------------
+
+
+% ./toptesi/toptesi.sty
+
+
+\long\def\@footnotetext#1{\insert\footins{\linespread{1}\footnotesize
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\footnotesep
+ \splitmaxdepth \dp\strutbox \floatingpenalty \@MM
+ \hsize\columnwidth \@parboxrestore
+ \edef\@currentlabel{\csname p@footnote\endcsname\@thefnmark}%
+ \@makefntext{\rule{\z@}{\footnotesep}\ignorespaces#1\strut}}}
+
+
+fits the structure
+%-------------------------------------
+
+
+% ./gb4e/gb4e.sty
+
+\let\@gbsaved@footnotetext=\@footnotetext
+\long\def\@footnotetext#1{%
+ \@noftnotefalse\setcounter{fnx}{0}%
+ \@gbsaved@footnotetext{#1}%
+ \@noftnotetrue}
+
+fits the structure
+%-------------------------------------
+
+
+
+% ./koma-script/scrlttr2.cls ./koma-script/scrextend.sty ./koma-script/scrreprt.cls ...
+
+same bug as footmisc: the @prepare is in the wrong place
+
+fits the structure
+%-------------------------------------
+
+
+
+% ./tabu/tabu.sty
+
+not checked what that does
+
+
+%-------------------------------------
+
+
+% ./uwthesis/uwthesis.cls
+
+does chapter notes -- ignore for now
+
+%-------------------------------------
+
+
+% ./tools/multicol.sty
+
+\long\def\mult@footnotetext#1{\begingroup
+ \columnwidth\textwidth
+ \orig@footnotetext{#1}\endgroup}
+
+
+fits the structure, but need to think what makes sense here as this a
+temporary redefinition for the environment only
+
+%-------------------------------------
+
+
+% ./fancyvrb/fancyvrb.sty
+
+\long\def\V@footnotetext{%
+ \afterassignment\V@@footnotetext
+ \let\@tempa}
+\def\V@@footnotetext{%
+ \insert\footins\bgroup
+ \csname reset@font\endcsname
+ \footnotesize
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\footnotesep
+ \splitmaxdepth\dp\strutbox
+ \floatingpenalty \@MM
+ \hsize\columnwidth
+ \@parboxrestore
+ \def\@currentcounter{footnote}%
+ \edef\@currentlabel{\csname p@footnote\endcsname\@thefnmark}%
+ \@makefntext{}%
+ \rule{\z@}{\footnotesep}%
+ \bgroup
+ \aftergroup\V@@@footnotetext
+ \ignorespaces}
+\def\V@@@footnotetext{\strut\egroup}
+
+
+another one of the footnote commands that do not read they argument as an argument
+
+%-------------------------------------
+
+
+% ./savefnmark/savefnmark.sty
+
+obsolete
+
+%-------------------------------------
+
+
+% ./changebar/changebar.sty
+
+\let\ltx@footnotetext\@footnotetext
+\long\def\cb@footnotetext#1{%
+ \cb@trace@stack{end footnote on page \the\c@page}%
+ \cb@pop\cb@currentstack
+ \ifnum\cb@topleft=\cb@nil
+ \ltx@footnotetext{#1}%
+ \else
+ \cb@push\cb@currentstack
+ \edef\cb@temp{\the\cb@curbarwd}%
+ \ltx@footnotetext{\cb@start[\cb@temp]#1\cb@end}%
+ \fi}
+\let\@footnotetext\cb@footnotetext
+
+
+% ./eledmac/eledmac.sty
+
+\apptocmd{\@footnotetext}{\m@mmf@prepare}{}{}
+\pretocmd{\@footnotetext}{%
+ \ifnumberedpar@
+ \edtext{}{\l@dbfnote{#1}}%
+ \else
+ }{}{}
+\apptocmd{\@footnotetext}{\fi}{}{}%
+
+
+% ./yafoot/dblfnote.sty
+
+\long\def\dfn@footnotetext#1{{\setbox\dfn@boxa\vbox{
+ \let\insert\dfn@gobble
+ \columnwidth\DFNcolumnwidth \hbadness\c@DFNsloppiness
+ \def\@makefnmark{\smash{\dfn@makefnmark}}
+ \dfn@latex@footnotetext{#1}\par \boxmaxdepth\dfn@fnmaxdp}%
+ \dfn@dima\ht\dfn@boxa \advance\dfn@dima\dp\dfn@boxa
+ \ifdim\dfn@dima>\z@\else
+ \dfn@dima1sp\relax
+ \setbox\dfn@boxa\vbox{\vbox to1sp{\unvbox\dfn@boxa\vfil}}\fi
+ \global\setbox\dfn@ins\vbox{\boxmaxdepth\dfn@fnmaxdp
+ \ifvoid\dfn@ins\else
+ \unvbox\dfn@ins \allowbreak \nointerlineskip \fi
+ \ifdfn@allowcbreak \unvbox \else \box \fi \dfn@boxa}%
+ \setbox\dfn@boxa\copy\dfn@ins
+ \dfn@split{.5\ht\dfn@boxa}\dfn@boxa\dfn@boxb\dfn@fnmaxdp\footnotesep
+ \advance\@tempdima\@tempdimb \@tempdimb\@tempdima
+ \advance\@tempdima-\dfn@fnht \global\dfn@fnht\@tempdimb
+ \insert\footins{\floatingpenalty\@MM \vbox to\@tempdima{}}%
+ \xdef\dfn@list{\dfn@list\@elt{\number\dfn@dima}{\number\@tempdima}}}}
+\let\dfn@latex@footnotetext\@footnotetext
+\let\@footnotetext\dfn@footnotetext
+
+
+% ./ftnxtra/ftnxtra.sty
+
+not checked what this does
+
+
+% ./acmart/acmart.cls
+
+\if@ACM@sigchiamode
+\long\def\@footnotetext#1{\marginpar{%
+ \reset@font\small
+ \interlinepenalty\interfootnotelinepenalty
+ \protected@edef\@currentlabel{%
+ \csname p@footnote\endcsname\@thefnmark
+ }%
+ \color@begingroup
+ \@makefntext{%
+ \rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox}%
+ \color@endgroup}}%
+\fi
+
+
+% ./memoir/memoir.cls
+
+ this needs some further analysis
+
diff --git a/macros/latex/required/latex-lab/usage-of-kern-kern.txt b/macros/latex/required/latex-lab/usage-of-kern-kern.txt
new file mode 100644
index 0000000000..e119197b70
--- /dev/null
+++ b/macros/latex/required/latex-lab/usage-of-kern-kern.txt
@@ -0,0 +1,80 @@
+
+ \ifdim\lastkern>\z@\ifdim\lastkern<5sp\relax
+./bxjscls/bxjsja-minimal.def
+
+
+
+ \ifdim\lastkern=-3sp \unkern
+ \ifdim\lastkern=3sp \kern-3sp
+ {\kern\MT@outer@kern\kern3sp\kern-3sp\relax}%
+./microtype/letterspace.sty
+
+
+ \ifdim\lastkern=-3sp \unkern
+ \ifdim\lastkern=3sp \kern-3sp
+ {\kern\MT@outer@kern\kern3sp\kern-3sp\relax}%
+./microtype/microtype-pdftex.def
+
+
+ \ifdim\lastkern=-3sp \unkern
+ \ifdim\lastkern=3sp \kern-3sp
+ {\kern\MT@outer@kern\kern3sp\kern-3sp\relax}%
+./microtype/microtype-luatex.def
+
+
+
+\providecommand*{\multiplefootnotemarker}{3sp}
+./eledmac/eledmac.sty
+
+
+
+\providecommand*{\multiplefootnotemarker}{3sp}
+./reledmac/reledmac.sty
+
+
+\edef\CJK@kern{\kern -2sp\kern 2sp}
+\edef\CJK@CJK{\kern -1sp\kern 1sp}
+./cjk/texinput/CJK.sty
+
+
+\edef\ruby@kern{\kern -5sp\kern 5sp}
+./cjk/texinput/ruby.sty
+
+
+% hyphenation between pinyin syllables. Values 1sp-3sp are already used
+\edef\py@sp{\kern -4sp\kern 4sp}
+./cjk/texinput/pinyin.sty
+
+
+\providecommand*{\multiplefootnotemarker}{3sp}
+./tufte-latex/tufte-common.def
+
+
+
+\newcommand*{\multiplefootnotemarker}{3sp}
+./memoir/memoir.cls
+
+
+\providecommand*{\multiplefootnotemarker}{3sp}
+./parnotes/parnotes.sty
+
+
+\providecommand*{\multiplefootnotemarker}{3sp}
+./lwarp/lwarp-footmisc.sty
+
+
+ \bgroup \kern-3sp\kern3sp % kerns so I can test for beginning of list
+./examdesign/examdesign.cls
+
+
+ \kern-1sp \kern1sp }
+ \kern-2sp \kern2sp }
+ \kern-3sp \kern3sp }
+ \kern-4sp \kern4sp }
+./polyglossia/gloss-korean.ldf
+
+
+
+\NewDocumentCommand \@sidenotes@multisign { } {3sp}
+./sidenotes/sidenotes.sty
+