[latex3-commits] [git/LaTeX3-latex3-luaotfload] master: add filehook.sty for now (282266b)
Ulrike Fischer
fischer at troubleshooting-tex.de
Mon Aug 19 19:08:17 CEST 2019
Repository : https://github.com/latex3/luaotfload
On branch : master
Link : https://github.com/latex3/luaotfload/commit/282266b020a58d176ec98758448ab4aa5c4a22e6
>---------------------------------------------------------------
commit 282266b020a58d176ec98758448ab4aa5c4a22e6
Author: Ulrike Fischer <fischer at troubleshooting-tex.de>
Date: Mon Aug 19 19:08:17 2019 +0200
add filehook.sty for now
>---------------------------------------------------------------
282266b020a58d176ec98758448ab4aa5c4a22e6
texmf/tex/latex/filehook/filehook.sty | 832 ++++++++++++++++++++++++++++++++++
1 file changed, 832 insertions(+)
diff --git a/texmf/tex/latex/filehook/filehook.sty b/texmf/tex/latex/filehook/filehook.sty
new file mode 100644
index 0000000..c4eed36
--- /dev/null
+++ b/texmf/tex/latex/filehook/filehook.sty
@@ -0,0 +1,832 @@
+% \begin{macrocode}
+%<!COPYRIGHT>
+\NeedsTeXFormat{LaTeX2e}[1999/12/01]
+\ProvidesPackage{filehook}[%
+%<!DATE>
+%<!VERSION>
+%<*DRIVER>
+ 2099/01/01 develop
+%</DRIVER>
+ Hooks for input files]
+% \end{macrocode}
+%
+%
+% \subsection{Options}
+% \begin{macrocode}
+\newif\iffilehook at force
+\DeclareOption{force}{\filehook at forcetrue}
+\ProcessOptions\relax
+% \end{macrocode}
+%
+%
+% \subsection{Initialisation of Hooks}
+% The general hooks are initialised to call the file specific hooks.
+%
+%
+% \begin{macro}{\filehook at csuse}
+% \begin{macrocode}
+\begingroup
+\gdef\filehook at csuse#1{\ifcsname #1\endcsname\csname #1\expandafter\endcsname\fi}
+\expandafter\ifx\csname csuse\endcsname\relax
+ \expandafter\ifx\csname ifcsname\endcsname\relax
+ \gdef\filehook at csuse#1{\expandafter\ifx\csname #1\endcsname\relax\else\csname #1\expandafter\endcsname\fi}
+ \fi
+\else
+ \global\let\filehook at csuse\csuse
+\fi
+\endgroup
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook at include@atbegin}
+% \begin{macrocode}
+\def\filehook at include@atbegin#1{%
+ \let\InputIfFileExists\filehook@@InputIfFileExists
+ \filehook at csuse{\filehook at include@atbegin@#1}%
+ \filehook at include@@atbegin
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook at include@@atbegin}
+% \begin{macrocode}
+\def\filehook at include@@atbegin{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook at include@atend}
+% \begin{macrocode}
+\def\filehook at include@atend#1{%
+ \filehook at include@@atend
+ \filehook at csuse{\filehook at include@atend@#1}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook at include@@atend}
+% \begin{macrocode}
+\def\filehook at include@@atend{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook at include@after}
+% \begin{macrocode}
+\def\filehook at include@after#1{%
+ \filehook at include@@after
+ \filehook at csuse{\filehook at include@after@#1}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook at include@@after}
+% \begin{macrocode}
+\def\filehook at include@@after{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook at input@atbegin}
+% \begin{macrocode}
+\def\filehook at input@atbegin#1{%
+ \let\InputIfFileExists\filehook@@InputIfFileExists
+ \filehook at csuse{\filehook at input@atbegin@\filehook at ensureext{#1}}%
+ \filehook at input@@atbegin
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook at input@@atbegin}
+% \begin{macrocode}
+\def\filehook at input@@atbegin{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook at input@atend}
+% \begin{macrocode}
+\def\filehook at input@atend#1{%
+ \filehook at input@@atend
+ \filehook at csuse{\filehook at input@atend@\filehook at ensureext{#1}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook at input@@atend}
+% \begin{macrocode}
+\def\filehook at input@@atend{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook at atbegin}
+% \begin{macrocode}
+\def\filehook at atbegin#1{%
+ \filehook at csuse{\filehook at atbegin@\filehook at ensureext{#1}}%
+ \filehook@@atbegin
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook@@atbegin}
+% \begin{macrocode}
+\def\filehook@@atbegin{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook at atend}
+% \begin{macrocode}
+\def\filehook at atend#1{%
+ \filehook@@atend
+ \filehook at csuse{\filehook at atend@\filehook at ensureext{#1}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook@@atend}
+% \begin{macrocode}
+\def\filehook@@atend{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook at every@atbegin}
+% \begin{macrocode}
+\def\filehook at every@atbegin#1{%
+ \filehook at every@@atbegin
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook at every@@atbegin}
+% \begin{macrocode}
+\def\filehook at every@@atbegin{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook at every@atend}
+% \begin{macrocode}
+\def\filehook at every@atend#1{%
+ \filehook at every@@atend
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook at every@@atend}
+% \begin{macrocode}
+\def\filehook at every@@atend{}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsection{Hook Modification Macros}
+% The following macros are used to modify the hooks, i.e.\ to prefix or append code to them.
+%
+%
+% \subsubsection*{Internal Macros}
+%
+% The macro prefixes for the file specific hooks are stored in macros to reduce the number of
+% tokens in the following macro definitions.
+% \begin{macrocode}
+\def\filehook at include@atbegin@{filehook at include@atbegin@}
+\def\filehook at include@atend@{filehook at include@atend@}
+\def\filehook at include@after@{filehook at include@after@}
+\def\filehook at input@atbegin@{filehook at input@atbegin@}
+\def\filehook at input@atend@{filehook at input@atend@}
+\def\filehook at input@after@{filehook at input@after@}
+\def\filehook at atbegin@{filehook at atbegin@}
+\def\filehook at atend@{filehook at atend@}
+\def\filehook at after@{filehook at after@}
+% \end{macrocode}
+%
+%
+% \begin{macro}{\filehook at append}
+% Uses default \LaTeX{} macro.
+% \begin{macrocode}
+\def\filehook at append{\g at addto@macro}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook at appendwarg}
+% Appends code with one macro argument. The |\@tempa| intermediate step is required because of the
+% included |##1| which wouldn't correctly expand otherwise.
+% \begin{macrocode}
+\long\def\filehook at appendwarg#1#2{%
+ \begingroup
+ \toks@\expandafter{#1{##1}#2}%
+ \edef\@tempa{\the\toks@}%
+ \expandafter\gdef\expandafter#1\expandafter##\expandafter1\expandafter{\@tempa}%
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook at prefix}
+% Prefixes code to a hook.
+% \begin{macrocode}
+\long\def\filehook at prefix#1#2{%
+ \begingroup
+ \@temptokena{#2}%
+ \toks@\expandafter{#1}%
+ \xdef#1{\the\@temptokena\the\toks@}%
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook at prefixwarg}
+% Prefixes code with an argument to a hook.
+% \begin{macrocode}
+\long\def\filehook at prefixwarg#1#2{%
+ \begingroup
+ \@temptokena{#2}%
+ \toks@\expandafter{#1{##1}}%
+ \edef\@tempa{\the\@temptokena\the\toks@}%
+ \expandafter\gdef\expandafter#1\expandafter##\expandafter1\expandafter{\@tempa}%
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook at addtohook}[3]{Macro which should be used to add the material to the hook}{Macro name prefix}{End of macro name (file name)}
+% The macro first expands the file name (|#3|) to flatten all included macros. An extension is added if missing, as well as the prefix.
+% All modifications of |\@tempa| are made inside a group to keep them local.
+% \begin{macrocode}
+\def\filehook at addtohook#1#2#3{%
+ \begingroup
+ \edef\@tempa{#3}%
+ \edef\@tempa{#2\filehook at ensureext{\@tempa}}%
+ \@ifundefined{\@tempa}{\global\@namedef{\@tempa}{}}{}%
+ \expandafter\endgroup
+ \expandafter#1\csname\@tempa\endcsname
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection*{User Level Macros}
+% The user level macros simple use the above defined macros on the appropriate hook.
+%
+% \begin{macro}{\AtBeginOfIncludes}
+% \begin{macrocode}
+\newcommand*\AtBeginOfIncludes{%
+ \filehook at append\filehook at include@@atbegin
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AtEndOfIncludes}
+% \begin{macrocode}
+\newcommand*\AtEndOfIncludes{%
+ \filehook at prefix\filehook at include@@atend
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AfterIncludes}
+% \begin{macrocode}
+\newcommand*\AfterIncludes{%
+ \filehook at prefix\filehook at include@@after
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AtBeginOfIncludeFile}
+% \begin{macrocode}
+\newcommand*\AtBeginOfIncludeFile[1]{%
+ \filehook at addtohook\filehook at append\filehook at include@atbegin@{\filehook at ensuretex{#1}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AtEndOfIncludeFile}
+% \begin{macrocode}
+\newcommand*\AtEndOfIncludeFile[1]{%
+ \filehook at addtohook\filehook at prefix\filehook at include@atend@{\filehook at ensuretex{#1}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AfterIncludeFile}
+% \begin{macrocode}
+\newcommand*\AfterIncludeFile[1]{%
+ \filehook at addtohook\filehook at prefix\filehook at include@after@{\filehook at ensuretex{#1}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AtBeginOfInputs}
+% \begin{macrocode}
+\newcommand*\AtBeginOfInputs{%
+ \filehook at append\filehook at input@@atbegin
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AtEndOfInputs}
+% \begin{macrocode}
+\newcommand*\AtEndOfInputs{%
+ \filehook at prefix\filehook at input@@atend
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AtBeginOfInputFile}
+% \begin{macrocode}
+\newcommand*\AtBeginOfInputFile{%
+ \filehook at addtohook\filehook at append\filehook at input@atbegin@
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AtEndOfInputFile}
+% \begin{macrocode}
+\newcommand*\AtEndOfInputFile{%
+ \filehook at addtohook\filehook at prefix\filehook at input@atend@
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AtBeginOfFiles}
+% \begin{macrocode}
+\newcommand*\AtBeginOfFiles{%
+ \filehook at append\filehook@@atbegin
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AtEndOfFiles}
+% \begin{macrocode}
+\newcommand*\AtEndOfFiles{%
+ \filehook at prefix\filehook@@atend
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AtBeginOfEveryFile}
+% \begin{macrocode}
+\newcommand*\AtBeginOfEveryFile{%
+ \filehook at append\filehook at every@@atbegin
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AtEndOfEveryFile}
+% \begin{macrocode}
+\newcommand*\AtEndOfEveryFile{%
+ \filehook at prefix\filehook at every@@atend
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AtBeginOfFile}
+% \begin{macrocode}
+\newcommand*\AtBeginOfFile{%
+ \filehook at addtohook\filehook at append\filehook at atbegin@
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AtEndOfFile}
+% \begin{macrocode}
+\newcommand*\AtEndOfFile{%
+ \filehook at addtohook\filehook at prefix\filehook at atend@
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\AtBeginOfClassFile}
+% \begin{macrocode}
+\newcommand*\AtBeginOfClassFile{%
+ \@ifnextchar*
+ {\AtBeginOfXFile at star\@clsextension}%
+ {\AtBeginOfXFile at normal\@clsextension}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AtBeginOfPackageFile}
+% \begin{macrocode}
+\newcommand*\AtBeginOfPackageFile{%
+ \@ifnextchar*
+ {\AtBeginOfXFile at star\@pkgextension}%
+ {\AtBeginOfXFile at normal\@pkgextension}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AtBeginOfXFile at star}[2]{extension}{name}
+% If the class or package is already loaded the code is executed right away.
+% Otherwise it is installed normally.
+% \begin{macrocode}
+\def\AtBeginOfXFile at star#1*#2{%
+ \@ifl at aded{#1}{#2}%
+ {\@firstofone}%
+ {\AtBeginOfXFile at normal{#1}{#2}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AtBeginOfXFile at normal}[2]{extension}{name}
+% \begin{macrocode}
+\def\AtBeginOfXFile at normal#1#2{%
+ \AtBeginOfFile{#2.#1}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\AtEndOfClassFile}
+% \begin{macrocode}
+\newcommand*\AtEndOfClassFile{%
+ \@ifnextchar*
+ {\AtEndOfXFile at star\@clsextension}%
+ {\AtEndOfXFile at normal\@clsextension}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AtEndOfPackageFile}
+% \begin{macrocode}
+\newcommand*\AtEndOfPackageFile{%
+ \@ifnextchar*
+ {\AtEndOfXFile at star\@pkgextension}%
+ {\AtEndOfXFile at normal\@pkgextension}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\AtEndOfXFile at star}[2]{extension}{name}
+% If the class or package is already loaded the code is executed right away.
+% Otherwise it is installed normally.
+% \begin{macrocode}
+\def\AtEndOfXFile at star#1*#2{%
+ \@ifl at aded{#1}{#2}%
+ {\@firstofone}%
+ {\AtEndOfXFile at normal{#1}{#2}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AtEndOfXFile at normal}[2]{extension}{name}
+% Note that \Macro\AtEndOfClass is identical to \Macro\AtEndOfPackage, so no
+% differentiation between classes and packages is needed here.
+% \begin{macrocode}
+\long\def\AtEndOfXFile at normal#1#2#3{%
+ \AtEndOfFile{#2.#1}{\AtEndOfPackage{#3}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ClearHook}
+% Clears the hook by temporary redefining the prefix and append macros
+% to do a simple definition to empty.
+% \begin{macrocode}
+\newcommand*\ClearHook{%
+ \begingroup
+ \def\filehook at prefix##1##2{%
+ \gdef##1{}%
+ \endgroup
+ }%
+ \let\filehook at append\filehook at prefix
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+% \subsection{Installation of Hooks}
+% The \Macro\@input@ and \Macro\@iinput macros from |latex.ltx| are redefined to install the hooks.
+%
+% First the original definitions are saved away.
+% \begin{macro}{\filehook at orig@@input@}
+% \begin{macrocode}
+\let\filehook at orig@@input@\@input@
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook at orig@@iinput}
+% \begin{macrocode}
+\let\filehook at orig@@iinput\@iinput
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@input@}
+% This macro is redefined for the \Macro\include file hooks.
+% Checks if the next command is \Macro\clearpage which indicates that we are inside \Macro\@include.
+% If so the hooks are installed, otherwise the original macro is used unchanged.
+% For the `after' hook an own \Macro\clearpage is inserted and the original one is gobbled.
+%
+% \begin{macrocode}
+\def\@input@#1{%
+ \@ifnextchar\clearpage
+ {%
+ \filehook at every@atbegin{#1}%
+ \filehook at include@atbegin{#1}%
+ \filehook at orig@@input@{#1}%
+ \filehook at include@atend{#1}%
+ \clearpage
+ \filehook at include@after{#1}%
+ \filehook at every@atend{#1}%
+ \@gobble
+ }%
+ {\filehook at orig@@input@{#1}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@iinput}
+% This macro is redefined for the \Macro\input file hooks.
+% it simply surrounds the original macro with the hooks.
+% \begin{macrocode}
+\def\filehook@@iinput#1{%
+ \filehook at every@atbegin{#1}%
+ \filehook at input@atbegin{#1}%
+ \filehook at orig@@iinput{#1}%
+ \filehook at input@atend{#1}%
+ \filehook at every@atend{#1}%
+}
+\let\@iinput\filehook@@iinput
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook at swap}
+% Auxiliary macro which swaps the two arguments. This is needed to expand
+% \Macro\@filef at und, which is given as first argument but needed then as the second one.
+% \begin{macrocode}
+\def\filehook at swap#1#2{#2#1}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook at ensureext}
+% This macro ensures the existence of a file name extension. If non is given `|.tex|' is
+% added.
+% \begin{macrocode}
+\def\filehook at ensureext#1{%
+ \expandafter\filehook@@ensureext#1\empty.tex\empty\empty
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook@@ensureext}
+% \begin{macrocode}
+\def\filehook@@ensureext#1.#2\empty#3\empty{#1.#2}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\filehook at ensuretex}
+% Ensures a `|.tex|' extension, i.e. adds it if missing, even if there is a different one.
+% \begin{macrocode}
+\def\filehook at ensuretex#1{%
+ \expandafter\filehook@@ensuretex#1\empty.tex\empty\empty
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook@@ensuretex}
+% \begin{macrocode}
+\def\filehook@@ensuretex#1.tex\empty#2\empty{#1.tex}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% The |filehook| default definition of \Macro\InputIfFileExists is defined here
+% together with alternatives definitions for comparison.
+% There are stored first in a token register and later stored in a macro which is expanded if required.
+% This is always done inside a group to keep them temporary only.
+% The token register is used to avoid doubling of macro argument characters.
+%
+% \begin{macro}{\oldlatex at InputIfFileExists}
+% Original standard \LaTeX\ definition of \Macro\InputIfFileExists.
+% \begin{macrocode}
+\long\def\oldlatex at InputIfFileExists#1#2{%
+ \IfFileExists{#1}%
+ {#2\@addtofilelist{#1}%
+ \@@input\@filef at und
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\latex at InputIfFileExists}
+% Standard \`LaTeX\ definition of \Macro\InputIfFileExists starting from LaTeX Kernal 2019/02/07 v1.1n.
+% \begin{macrocode}
+\long\def\newlatex at InputIfFileExists#1#2{%
+ \IfFileExists{#1}%
+ {%
+ \expandafter\@swaptwoargs\expandafter
+ {\@filef at und}{#2\@addtofilelist{#1}\@@input}}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\latex at InputIfFileExists}
+% Standard \`LaTeX\ definition of \Macro\InputIfFileExists starting from LaTeX Kernal 2019/02/07 v1.1n.
+% \begin{macrocode}
+\@ifundefined{swap at args}{%
+ \let\latex at InputIfFileExists\oldlatex at InputIfFileExists
+}{%
+ \let\latex at InputIfFileExists\newlatex at InputIfFileExists
+}%
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\filehook at default@InputIfFileExists}
+% \begin{macrocode}
+\long\gdef\filehook at default@InputIfFileExists#1#2{%
+ \IfFileExists{#1}%
+ {\expandafter\filehook at swap
+ \expandafter{\@filef at und}%
+ {#2\@addtofilelist{#1}%
+ \filehook at every@atbegin{#1}%
+ \filehook at atbegin{#1}%
+ \@@input}%
+ \filehook at atend{#1}%
+ \filehook at every@atend{#1}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook@@default at InputIfFileExists}
+% \begin{macrocode}
+\long\gdef\filehook@@default at InputIfFileExists#1#2{%
+ \let\InputIfFileExists\filehook at InputIfFileExists
+ \IfFileExists{#1}%
+ {\expandafter\filehook at swap
+ \expandafter{\@filef at und}%
+ {#2\@addtofilelist{#1}%
+ \filehook at atbegin{#1}%
+ \@@input}%
+ \filehook at atend{#1}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\scrlfile at InputIfFileExists}
+% \begin{macrocode}
+\long\def\scrlfile at InputIfFileExists#1#2{%
+ \begingroup\expandafter\expandafter\expandafter\endgroup
+ \expandafter\ifx\csname #1- at alias\endcsname\relax
+ \expandafter\@secondoftwo
+ \else
+ \scr at replacefile@msg{\csname #1- at alias\endcsname}{#1}%
+ \expandafter\@firstoftwo
+ \fi
+ {%
+ \expandafter\InputIfFileExists\expandafter{\csname
+ #1- at alias\endcsname}{#2}%
+ }%
+ {\IfFileExists{#1}{%
+ \scr at load@hook{before}{#1}%
+ #2\@addtofilelist{#1}%
+ \@@input \@filef at und
+ \scr at load@hook{after}{#1}%
+ }}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook at scrlfile@InputIfFileExists}
+% \begin{macrocode}
+\long\def\filehook at scrlfile@InputIfFileExists#1#2{%
+ \begingroup\expandafter\expandafter\expandafter\endgroup
+ \expandafter\ifx\csname #1- at alias\endcsname\relax
+ \expandafter\@secondoftwo
+ \else
+ \scr at replacefile@msg{\csname #1- at alias\endcsname}{#1}%
+ \expandafter\@firstoftwo
+ \fi
+ {%
+ \expandafter\InputIfFileExists\expandafter{\csname
+ #1- at alias\endcsname}{#2}%
+ }%
+ {\IfFileExists{#1}{%
+ \expandafter\filehook at swap
+ \expandafter{\@filef at und}%
+ {\scr at load@hook{before}{#1}%
+ #2\@addtofilelist{#1}%
+ \filehook at every@atbegin{#1}%
+ \filehook at atbegin{#1}%
+ \@@input}%
+ \filehook at atend{#1}%
+ \filehook at every@atend{#1}%
+ \scr at load@hook{after}{#1}%
+ }}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook@@scrlfile at InputIfFileExists}
+% \begin{macrocode}
+\long\def\filehook@@scrlfile at InputIfFileExists#1#2{%
+ \let\InputIfFileExists\filehook at InputIfFileExists
+ \begingroup\expandafter\expandafter\expandafter\endgroup
+ \expandafter\ifx\csname #1- at alias\endcsname\relax
+ \expandafter\@secondoftwo
+ \else
+ \scr at replacefile@msg{\csname #1- at alias\endcsname}{#1}%
+ \expandafter\@firstoftwo
+ \fi
+ {%
+ \expandafter\InputIfFileExists\expandafter{\csname
+ #1- at alias\endcsname}{#2}%
+ }%
+ {\IfFileExists{#1}{%
+ \expandafter\filehook at swap
+ \expandafter{\@filef at und}%
+ {\scr at load@hook{before}{#1}%
+ #2\@addtofilelist{#1}%
+ \filehook at atbegin{#1}%
+ \@@input}%
+ \filehook at atend{#1}%
+ \scr at load@hook{after}{#1}%
+ }}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\InputIfFileExists}
+% First we test for the |scrlfile| package. The test macro adds the necessary patches if so.
+% In order to also support it when it is loaded afterwards the two hooks below are used to revert the definition
+% before the package and patch it afterwards.
+% \begin{macrocode}
+\AtBeginOfPackageFile*{scrlfile}{%
+ \let\InputIfFileExists\latex at InputIfFileExists
+}%
+\AtEndOfPackageFile*{scrlfile}{%
+ \RequirePackage{filehook-scrlfile}%
+}%
+% \end{macrocode}
+% Fink:
+% \begin{macrocode}
+\AtBeginOfPackageFile*{fink}{%
+ \RequirePackage{kvoptions}%
+ \begingroup
+ \let\InputIfFileExists\latex at InputIfFileExists
+}%
+\AtEndOfPackageFile*{fink}{%
+ \edef\@tempa{\noexpand\PassOptionsToPackage{mainext=\fnk at mainext,maindir=\fnk at maindir}{currfile}}%
+ \expandafter\endgroup\@tempa
+ \RequirePackage{filehook-fink}%
+}%
+% \end{macrocode}
+% If |memoir| is detected its hooks
+% are added to the appropriate `At...OfFiles' hooks. This works fine because its hooks have the
+% exact same position. Please note that the case when |memoir| is used together with |scrlfile| is not explicitly covered.
+% In this case the |scrlfile| package will overwrite |memoir|s definition.
+% \begin{macrocode}
+\AtBeginOfClassFile*{memoir}{%
+ \let\filehook@@InputIfFileExists\latex at InputIfFileExists
+ \let\InputIfFileExists\latex at InputIfFileExists
+ \let\@iinput\filehook at orig@@iinput
+}%
+\AtEndOfClassFile*{memoir}{%
+ \let\@iinput\filehook@@iinput
+ \RequirePackage{filehook-memoir}%
+}%
+% \end{macrocode}
+%
+% Finally, if no specific alternate definition is detected the original \LaTeX\ definition is checked for and a
+% error is given if any other unknown definition is detected.
+% The \opt{force} option will change the error into a warning and overwrite the macro with the default.
+% \begin{macrocode}
+\ifcase
+ \ifx\InputIfFileExists\filehook at InputIfFileExists 0\else
+ \ifx\InputIfFileExists\newlatex at InputIfFileExists 1\else
+ \ifx\InputIfFileExists\oldlatex at InputIfFileExists 1\else
+ 9%
+ \fi\fi\fi
+\relax% 0
+\or% 1
+ \let\filehook at InputIfFileExists\filehook at default@InputIfFileExists
+ \let\filehook@@InputIfFileExists\filehook@@default at InputIfFileExists
+ \let\InputIfFileExists\filehook at InputIfFileExists
+\else
+ \iffilehook at force
+ \let\filehook at InputIfFileExists\filehook at default@InputIfFileExists
+ \let\filehook@@InputIfFileExists\filehook@@default at InputIfFileExists
+ \let\InputIfFileExists\filehook at InputIfFileExists
+ \PackageWarning{filehook}{Detected unknown definition of \string\InputIfFileExists.^^J%
+ The 'force' option of 'filehook' is in effect. Macro is overwritten with default!}%
+ \else
+ \PackageError{filehook}{Detected unknown definition of \string\InputIfFileExists.^^J%
+ Use the 'force' option of 'filehook' to overwrite it.}{}%
+ \fi
+\fi
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\AtBeginDocument{%
+ \ifx\InputIfFileExists\filehook at InputIfFileExists\else
+ \PackageWarning{filehook}{Macro \string\InputIfFileExists\space got redefined after 'filehook' was loaded.^^J%
+ Certain file hooks might now be dysfunctional!}
+ \fi
+}
+% \end{macrocode}
+%
More information about the latex3-commits
mailing list