% \iffalse meta-comment %<=*COPYRIGHT> %% Copyright (c) 2011-2022 by Martin Scharrer %% ---------------------------------------------------------------------- %% This work may be distributed and/or modified under the %% conditions of the LaTeX Project Public License, either version 1.3 %% 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.3 or later is part of all distributions of LaTeX %% version 2005/12/01 or later. %% %% This work has the LPPL maintenance status `maintained'. %% %% The Current Maintainer of this work is Martin Scharrer. %% %% This work consists of the files filehook.dtx and filehook.ins %% and the derived files filehook.sty, filehook-fink.sty, %% filehook-listings.sty, filehook-memoir.sty, filehook-scrlfile.sty %% and pgf-filehook.sty %% %<=/COPYRIGHT> % \fi % % \iffalse %<*driver> \ProvidesFile{filehook.dtx}[% %<=*DATE> 2022/10/25 %<=/DATE> %<=*VERSION> v0.8b %<=/VERSION> Hooks for input files] \documentclass{ydoc} \GetFileInfo{filehook.dtx} \usepackage{filehook}[\filedate] \usepackage[utf8]{inputenc} \usepackage[TS1,T1]{fontenc} \EnableCrossrefs \CodelineIndex \RecordChanges \makeatletter \providecommand*\tablecaption{% \@tempdima=\abovecaptionskip \abovecaptionskip=\belowcaptionskip \belowcaptionskip=\@tempdima \caption } \makeatother \listfiles \begin{document} \DocInput{filehook.dtx} \PrintChanges \PrintIndex \end{document} % % \fi % % \CheckSum{1494} % % \CharacterTable % {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z % Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z % Digits \0\1\2\3\4\5\6\7\8\9 % Exclamation \! Double quote \" Hash (number) \# % Dollar \$ Percent \% Ampersand \& % Acute accent \' Left paren \( Right paren \) % Asterisk \* Plus \+ Comma \, % Minus \- Point \. Solidus \/ % Colon \: Semicolon \; Less than \< % Equals \= Greater than \> Question mark \? % Commercial at \@ Left bracket \[ Backslash \\ % Right bracket \] Circumflex \^ Underscore \_ % Grave accent \` Left brace \{ Vertical bar \| % Right brace \} Tilde \~} % % % \changes{v0.1}{2010/04/08}{Initial version} % \changes{v0.2}{2010/12/08}{Added support for 'memoir' class and 'scrlfile' package. Remove support for deprecated 'fink' package.} % \changes{v0.3}{2010/12/20}{Added hooks for package and class files. Changed a warning to an error and added the 'force' option to overwrite this.} % \changes{v0.4}{2011/01/03}{^^A % Improved support for 'memoir' class and 'scrlfile' package. % Added AtBeginOfEveryFile and AtEndOfEveryFile hooks. % Changed handling of macro arguments in hook code. % Added filename parsing code to support TeX files with and without extension. % Added AtBeginOfEveryFile/AtEndOfEveryFile hooks. % Fixes misspelled \string\AfterOfIncludeFile. % Added patch for listings \lstinputlistings to avoid hooks for verbatim files. % Added star argument for AtBeginOfClass and PackageFile. % Worked on scrlfile and memoir compatibility. % Readded fink compatibility code. % Updated documentation. % } % \changes{v0.5}{2011/01/09}{Added PGF key interface for hooks. Added macro to clear hooks.} % \changes{v0.5a}{2011/03/09}{Added required \string\long\space to an internal macro.} % \changes{v0.5b}{2011/07/18}{Replaced \cs{@nameuse} for use with eTeX code to avoid the definition of non-existing hooks to \cs{relax}.} % \changes{v0.5c}{2011/10/07}{Added fall-back code for non-eTeX compilers.} % \changes{v0.5d}{2011/10/12}{Fix for fall-back code.} % \changes{v0.5e}{2019/08/19}{Fix for new LaTeX format.} % \changes{v0.6}{2019/10/03}{Fix for InputIfFileExists for LaTeX format 2019/10/01.} % \changes{v0.7}{2020/02/03}{Further fixes for InputIfFileExists for LaTeX format 2019/10/01.} % \changes{v0.8}{2020/09/27}{Support for LaTeX format 2020/10/01.} % \changes{v0.8a}{2020/09/29}{Further fixes for LaTeX format 2020/10/01.} % \changes{v0.8b}{2022/10/25}{Updated package URLs. Added DEPENDS.txt file.} % % \GetFileInfo{filehook.dtx} % % \DoNotIndex{\newcommand,\newenvironment} % % \author{Martin Scharrer} % \email{martin.scharrer@web.de} % \github{MartinScharrer/filehook} % \maketitle % % \begin{abstract} % This package provides hooks for input files. Document and package authors can use these hooks to % execute code at begin or the end of specific or all input files. % \end{abstract} % % \section{Changes due to new \LaTeX\ core hooks} % With the \LaTeX\ release 2020/10/01 file hooks are now provided by the \LaTeX\ core. This package has been adjusted to use these hooks % while trying to provide the same interface and behaviour than before. Simpler usages should work without any differences but advanced % usages which rely on the exact hook order and position might see some unwanted changes. % Users should try to use the \LaTeX\ hooks instead for new documents. % Please see \LaTeX\ core filehook documentation % \href{http://mirrors.ctan.org/macros/latex-dev/base/ltfilehook-doc.pdf}{\texttt{ltfilehook-doc}} for % the new hook system. % % Support of other hooking systems in other packages and classes has been dropped as this package no longer installs own hooks. % % If this package is run under a \LaTeX\ release prior to 2020/10/01 the old implementation will be loaded. % For this switch two sub-packages \pkg{filehook-2019} and \pkg{filehook-2020} are used and loaded according to the \LaTeX\ release version. % Please do not load these packages directly as they might be changes or disappear on later releases. % % % \section{Introduction} % These package (under \LaTeX\ prior 2020/10/01) changes some internal \LaTeX{} macros used to load input files so that they include `hooks'. % A hook is an (internal) macro executed at specific points. Normally it is initially empty, but can be extended using % an user level macro. The most common hook in \LaTeX{} is the `At-Begin-Document' hook. Code can be added to this hook % using \Macro\AtBeginDocument{<\TeX\ code>}. % % % This package provides hooks for files read by the \LaTeX{} macros \Macro\input, \Macro\include and % \Macro\InputIfFileExists as well as (since v0.3 from 2010/12/20) for class and package files, % i.e. macros \Macro\documentclass, \Macro\LoadClassWithOptions and \Macro\LoadClass % as well as \Macro\usepackage, \Macro\RequirePackageWithOptions and \Macro\RequirePackage. % Note that \Macro\InputIfFileExists, and therefore its hooks, is used by the aforementioned macros. % In v0.4 from 2011/03/01 special hooks where added which are executed for every read file, but will not be % executed a second time by the internal \Macro\InputIfFileExists inside \Macro\input and \Macro\include. % % For all files a `AtBegin' and a `AtEnd' hook is installed. For \Macro\include files there is also a `After' hook which % it is executed \emph{after} the page break (\Macro\clearpage) is inserted by the \Macro\include code. % In contrast, the `AtEnd' hook is executed before the trailing page break % and the `AtBegin' hook is executed after the \emph{leading} page break. % The `AtBegin' hook can be used to set macros to file specific values. % These macros can be reset in the `AtEnd' hook to the parent file values. % If these macros appear in the page header or footer they need to be reset `After' hook % to ensure that the correct values are used for the last page. % % In addition to general hooks which are executed for all files of there type, % file specific one can be defined which are only executed for the named file. % The hooks for classes and packages are always specific to one file. % % Older versions of this package provided the file name as argument |#1| for the general hooks. % This has been changed in v0.4 from 2011/01/03: the hook code is stored and executed without modifications, % i.e.\ macro argument characters (|#|) are now handled like normal and don't have to be doubled. % See section~\ref{sec:upgrade} for information how to upgrade older documents. % % \section{Usage} % The below macros can be used to add material (\TeX{} code) to the related hooks. % All `AtBegin' macros will \emph{append} the code to the hooks, but the `AtEnd' and `After' macros will \emph{prefix} the code instead. % This ensures that two different packages adding material in `AtBegin'/`AtEnd' pairs do not overlap each other. % Instead the later used package adds the code closer to the file content, `inside' the material added by the first package. % Therefore it is safely possible to surround the content of a file with multiple \LaTeX{} environments using multiple `AtBegin'/`AtEnd' macro calls. % If required inside another package a different order can be enforced by using the internal hook macros shown in the implementation section. % %^^A Some internal macros to draw the hook positions: % \def\Hook#1{\textsf{Hook: #1}\MacroArgs} % % \def\DrawInputIfB#1{% % \hbox{\vbox{% % \sffamily % \hbox{\Macro\InputIfFileExists:}% % \hbox{\fbox{\vbox{% % \hbox{\Hook{AtBeginOfFile}{}}% % #1% % \hbox{\Hook{AtBeginOfFiles}}% % \hbox{\fbox{\emph{Content}}}% % \vspace{2pt}% % \hbox{\Hook{AtEndOfFiles}}% % \hbox{\Hook{AtEndOfFile}{}}% % }}}% % }}% % }% % % \def\DrawInputIf#1{% % \hbox{\vbox{% % \sffamily % \hbox{\Macro\InputIfFileExists:}% % \hbox{\fbox{\vbox{% % \hbox{\Hook{AtBeginOfEveryFile}}% % \hbox{\Hook{AtBeginOfFile}{}}% % #1% % \hbox{\Hook{AtBeginOfFiles}}% % \hbox{\fbox{\emph{Content}}}% % \vspace{2pt}% % \hbox{\Hook{AtEndOfFiles}}% % \hbox{\Hook{AtEndOfFile}{}}% % \hbox{\Hook{AtEndOfEveryFile}}% % }}}% % }}% % }% % % % \subsection*{Every File} % % \DescribeMacro{\AtBeginOfEveryFile}{<\TeX\ code>} % \DescribeMacro{\AtEndOfEveryFile}{<\TeX\ code>} % Sometime certain code should be executed at the begin and end of every read file, e.g.\ pushing and popping a file stack. % The `At...OfFiles' hooks already do a good job here. Unfortunately there is the issue with the \Macro\clearpage in \Macro\include. % The \Macro\AtEndOfFiles is executed before it, which can cause issues with page headers and footers. % A workaround, e.g.\ done by older versions of the \pkg{currfile} package, is to execute the code twice for include files: % once in the |include| related hooks and once in the |OfFiles| hooks. % % A better solution for this problem was added in v0.4 from 2011/01/03: % the |EveryFile| hooks will be executed exactly once for every file, independent if it is % read using \Macro\input, \Macro\include or \Macro\InputIfFileExists. % Special care is taken to suppress them for the \Macro\InputIfFileExists inside \Macro\input and \Macro\include. % % These hooks are located around the more specific hooks: % For \Macro\input files the `Begin' hook is executed before the \Macro\AtBeginOfInputs hook and the `End' hook after % the \Macro\AtEndOfInputs. % Similarly, for \Macro\include files the `Begin' hook is executed before the \Macro\AtBeginOfIncludes hook and the `End' hook after % the \Macro\AfterIncludes\relax (!). % For files read by \Macro\InputIfFileExists\relax (e.g. also for \Macro\usepackage, etc.) they are executed before and after the % \Macro\AtBeginOfFiles and \Macro\AtEndOfFiles hooks, respectively. % Note that the \Macro\AtBeginOfEveryFile hook is executed before the \Macro\AtBeginOfPackageFile/\Macro\AtBeginOfClassFile hooks % and that the \Macro\AtEndOfEveryFile hook is executed also before the hooks \Macro\AtEndOfPackageFile/\Macro\AtEndOfClassFile. % Therefore the `Every' and `PackageFile'/`ClassFile' hooks do not nest correctly like all other hooks do. % % % \subsection*{All Files} % % \DescribeMacro{\AtBeginOfFiles}{<\TeX\ code>} % \DescribeMacro{\AtEndOfFiles}{<\TeX\ code>} % These macros add the given \marg{code} to two hooks executed for all files read using the \Macro\InputIfFileExists macro. This macro is used internally by the % \Macro\input, \Macro\include and \Macro\usepackage/\Macro\RequirePackage macros. Packages and classes might use it to include additional or auxiliary files. % Authors can exclude those files from the hooks by using the following code instead:\\\hspace*{\bigskipamount}\Macro\IfFileExists{}'{\@input\@filef@und}{}' % % \DescribeMacro{\AtBeginOfFile}{}{<\TeX\ code>} % \DescribeMacro{\AtEndOfFile}{}{<\TeX\ code>} % Like the {\Macro{...OfIncludeFile}{}{<\TeX\ code>}} macros above, just for `all' read files. % If the \meta{file name} does not include a file extension it will be set to `|.tex|'. % % The `all files' hooks are closer to the file content than the \Macro\input and \Macro\include hook, i.e.\ the \Macro\AtBeginOfFiles comes \emph{after} the \Macro\AtBeginOfIncludes and % the \Macro\AtEndOfFiles comes \emph{before} the \Macro\AtEndOfIncludes hook. % % The following figure shows the positions of the hooks inside the macro:\par\medskip % \centerline{\DrawInputIf{}} % % % \subsection*{Include Files} % \DescribeMacro{\AtBeginOfIncludes}{<\TeX\ code>} % \DescribeMacro{\AtEndOfIncludes}{<\TeX\ code>} % \DescribeMacro{\AfterIncludes}{<\TeX\ code>} % As described above the `AtEnd' hook is executed before and the `After' hook is executed after the trailing \Macro\clearpage. % Note that material which appears in the page header or footer should be updated in the `After' hook, not the `AtEnd' hook, to ensure % that the old values are still valid for the last page. % % \DescribeMacro{\AtBeginOfIncludeFile}{}{<\TeX\ code>} % \DescribeMacro{\AtEndOfIncludeFile}{}{<\TeX\ code>} % \DescribeMacro{\AfterIncludeFile}{}{<\TeX\ code>} % These file-specific macros take the two arguments. The \meta{code} is only executed for the file with the given \meta{file name} % and only if it is read using \Macro\include. % The \meta{file name} should be identical to the name used for \Macro\include and not include the `|.tex|' extension. % Files with a different extension are neither supported by \Macro\include nor this hooks. % % The following figure shows the positions of the hooks inside the macro:\par\medskip % \centerline{\hbox{\vbox{% % \sffamily % \hbox{\Macro\include:}% % \hbox{\fbox{\vbox{% % \hbox{\Macro\clearpage~~(implicit)}% % \hbox{\Hook{AtBeginOfEveryFile}}% % \hbox{\Hook{AtBeginOfIncludeFile}{}}% % \hbox{\Hook{AtBeginOfIncludes}}% % \hbox{\fbox{\DrawInputIfB{}}}% % \vspace{2pt}% % \hbox{\Hook{AtEndOfIncludes}}% % \hbox{\Hook{AtEndOfIncludeFile}{}}% % \hbox{\Macro\clearpage~~(implicit)}% % \hbox{\Hook{AfterIncludes}}% % \hbox{\Hook{AfterIncludeFile}{}}% % \hbox{\Hook{AtEndOfEveryFile}}% % }}}% % }}} % % % \subsection*{Input Files} % % \DescribeMacro{\AtBeginOfInputs}{<\TeX\ code>} % \DescribeMacro{\AtEndOfInputs}{<\TeX\ code>} % Like the \Macro{...OfIncludes}{code} macros above, just for file read using \Macro\input. % % \DescribeMacro{\AtBeginOfInputFile}{}{<\TeX\ code>} % \DescribeMacro{\AtEndOfInputFile}{}{<\TeX\ code>} % Like the \Macro{...OfIncludeFile}{}{code} macros above, just for file read using \Macro\input. % If the \meta{file name} does not include a file extension it will be set to `|.tex|'. % % The following figure shows the positions of the hooks inside the macro:\par\medskip % \centerline{\hbox{\vbox{% % \sffamily % \hbox{\Macro\input:}% % \hbox{\fbox{\vbox{% % \hbox{\Hook{AtBeginOfEveryFile}}% % \hbox{\Hook{AtBeginOfInputFile}{}}% % \hbox{\Hook{AtBeginOfInputs}}% % \hbox{\fbox{\DrawInputIfB{}}}% % \vspace{2pt}% % \hbox{\Hook{AtEndOfInputs}}% % \hbox{\Hook{AtEndOfInputFile}{}}% % \hbox{\Hook{AtEndOfEveryFile}}% % }}}% % }}} % % % % \subsection*{Package Files} % % \DescribeMacro{\AtBeginOfPackageFile}*{}{<\TeX\ code>} % \DescribeMacro{\AtEndOfPackageFile}*{}{<\TeX\ code>} % This macros install the given \MacroArgs<\TeX\ code> in the `AtBegin' and `AtEnd' hooks of the given package file. % The \Macro\AtBeginOfPackageFile simply executes \Macro\AtBeginOfFile{.sty}{<\TeX code>}. % Special care is taken to ensure that the `AtEnd' code is executed \emph{after} any code installed by the package itself % using the \LaTeX\ macro \Macro\AtEndOfPackage. Note that it is therefore executed after the `AtEndOfEveryFile' hook. % If the starred version is used and the package is already loaded the code % is executed right away. % % The following figure shows the positions of the hooks inside the macros:\par\medskip % \centerline{\hbox{\vbox{% % \sffamily % \hbox{\Macro\usepackage/\Macro\RequirePackage/\Macro\RequirePackageWithOptions:}% % \hbox{\fbox{\vbox{% % \hbox{\fbox{\DrawInputIf{\hbox{ (includes AtBeginOfPackageFile\MacroArgs{})}}}}% % \vspace{2pt}% % \hbox{\Hook{AtEndOfPackage}~~(\LaTeX\ hook)}% % \hbox{\Hook{AtEndOfPackageFile}{}}% % }}}% % }}} % % \subsection*{Class Files} % % \DescribeMacro{\AtBeginOfClassFile}*{}{<\TeX\ code>} % \DescribeMacro{\AtEndOfClassFile}*{}{<\TeX\ code>} % This macros install the given \MacroArgs<\TeX\ code> in the `AtBegin' and `AtEnd' hooks of the given class file. % They work with classes loaded using \Macro\LoadClass, \Macro\LoadClassWithOptions and also \Macro\documentclass. % However, in the latter case |filehook| must be loaded using \Macro\RequirePackage beforehand. % The macro \Macro\AtBeginOfClassFile simply executes \Macro\AtBeginOfFile{.cls}{\ldots}. % Special care is taken to ensure that the `AtEnd' code is executed \emph{after} any code installed by the class itself % using the \LaTeX\ macro \Macro\AtEndOfClass. % Note that it is therefore executed after the `AtEndOfEveryFile' hook. % If the starred version is used and the class is already loaded the code % is executed right away. % % The following figure shows the positions of the hooks inside the macros:\par\medskip % \centerline{\hbox{\vbox{% % \sffamily % \hbox{\Macro\documentclass/\Macro\LoadClass/\Macro\LoadClassWithOptions:}% % \hbox{\fbox{\vbox{% % \hbox{\fbox{\DrawInputIf{\hbox{ (includes AtBeginOfClassFile\MacroArgs{})}}}}% % \vspace{2pt}% % \hbox{\Hook{AtEndOfClass}~~(\LaTeX\ hook)}% % \hbox{\Hook{AtEndOfClassFile}{}}% % }}}% % }}} % % \subsection{Clearing Hooks} % \DescribeMacro\ClearHook\AlsoMacro{At...Of...} % Using\marginpar{New in v0.5 2011/01/09} this macro existing hooks can be globally cleared, i.e.\ set to empty. % This should be used with care because it will also remove all (user level) hook code set % by packages into this hook. % Note that the special hook code installed by the packages \pkg{currfile} and \pkg{svn-multi} % as well as the compatibility code described in section~\ref{sec:comp} is not affected. % The syntax for this macro is the same as for the normal hook macros only with a leading \Macro\ClearHook, % where the \meta{code} argument is mandatory but its content is ignored. % Examples:\\ % \hspace*{\bigskipamount}\Macro\ClearHook\AlsoMacro\AtBeginOfInputFile{}{}\\ % \hspace*{\bigskipamount}\Macro\ClearHook\AlsoMacro\AtBeginOfFiles{} % % % % \clearpage % \section{PGF Key Interface} % An auxiliary package |pgf-filehook| is provided which adds support for the versatile \pkg{pgfkeys} interface. % This interface is heavily used by \pkg{pgf} (portable graphics format) and its higher level format Ti\textit{k}Z. % It allows the definition and execution of styles and commands (macros) using a \MacroArgs'=' format. % Main benefits over similar formats is the support for a ``directory structure'' inside the key and the ability % to call functions on the value before it gets processed by the key. The main way to define and execute keys % is the macro \Macro\pgfkeys{'='',...'}. Ti\textit{k}Z provides the similar macro \Macro\tikzstyle % which defaults to the main path `|/tikz|'. % More detailed information can be found in the official |pgfmanual|. % % All |filehook| macros described in the previous section (\Macro{AtXXXOfYYY}) can also be accessed using the % pgf keys directory `|/filehook|', where all hook type have an own sub-directory (|/filehook/YYY|) in which % the hooks for this type are located (|/filehook/YYY/AtXXX|). % For example {\Macro\AtBeginOfInputs{}} can also be % accessed using \\\hspace*{\parindent}\Macro\pgfkeys{'/filehook/Inputs/AtBegin='{}}\\ or \Macro\AfterIncludeFile{}{} as % \\\hspace*{\parindent}{\Macro\pgfkeys{'/filehook/IncludeFile/After='{}{}}}\\ as well as % \Macro\AtEndOfClassFile*{}{} as % \\\hspace*{\parindent}{\Macro\pgfkeys{'/filehook/ClassFile/AtEnd='*{}{}}.} % % \DescribeMacro\pgffilehook{'='',...'} % This macro is like \Macro\pgfkeys but defaults to the `|/filehook|' directory, so that it can be dropped from the % \meta{key}. Note that |pgfkeys| also supports to ``change the directory'' using \MacroArgs'/.cd', so that % it does not need to be included in further keys. All directories are defined as `\textit{is family}' so that the |/.cd| is % assumed if the directory is used on its own. % For example\\\centerline{\Macro\pgfkeys{'/filehook/Inputs/AtBegin='{}',/filehook/Inputs/AtEnd='{}}} % can be shorten as\\\centerline{\Macro\pgffilehook{'Inputs,AtBegin='{}',AtEnd='{}}.} % % \medskip % Some of the pgf key functions can become useful, e.g.\ if the hook code should be expanded before it is added to the hook:\\ % \hspace*{\parindent}\Macro\pgffilehook{'EveryFile/AtBegin/.expand once='{\AlsoMacro\headertext\space\AlsoMacro\currfilename}}\\ % will expand the first macro \Macro\headertext\relax (actually the first token) in the hook code once (using \Macro\expandafter), but % not any other tokens. In this example future changes of \Macro\headertext would not have any effect on the hook code, but % \Macro\currfilename will be expanded for every file. % Other useful functions are `|.expand twice|' (expand the first token twice) and `|.expanded|' (expand the whole hook code using \Macro\edef). % % \clearpage % \section{Compatibility Issues with Classes and other Packages}\label{sec:comp} % The |filehook| package might clash with other packages or classes which also redefine \Macro\InputIfFileExists % or internal macros used by \Macro\include and \Macro\input\relax (which are \Macro\@input@ and \Macro\@iinput). % Special compatibility code is in place for the packages listed below (in their current implementation). % If any other unknown definition of \Macro\InputIfFileExists is found an error will be raised. % The package option `|force|' can be used to prevent this and to force the redefinition of this macro. % Then any previous modifications will be lost, which will most likely break the other package. % Table~\ref{tab:incomp} lists all packages and classes which where found do be incompatible. % The packages \pkg{auxhook}, \pkg{stampinclude}, \pkg{rerunfilecheck} and \pkg{excludeonly} redefine % one or more of the above macros but have been found compatible with |filehook|. % Please do not hesitate to inform the author of |filehook| of any encountered problems with other packages. % % \subsection{Supported Classes and Packages} % The following classes and packages are actively supported and should work as normal when used together with |filehook|. % Please note that most of them are incompatible to each other, which |filehook| might not fix. % % \subsubsection*{memoir} % The |memoir| class redefines \Macro\InputIfFileExists to add own hooks identical to the `At...OfFiles' hooks (there called \Macro\AtBeginFile and \Macro\AtEndFile). % This hooks will be moved to the corresponding ones of |filehook| and will keep working as normal. % Since v0.4 from 2011/01/03 this modification will be also applied when the |filehook| package is loaded (using \Macro\RequirePackage) \emph{before} the % |memoir| class. However, the hooks from |filehook| need to be temporally disabled while reading the |memoir| class. % They will not be triggered for all files read directly by this class, like configuration and patch files. % Note that the `At...OfClassFile' hooks still work for the |memoir| class file itself. In fact they are used to restore the default definition of \Macro\InputIfFileExists % at the begin and patch it at the end of the class file. % The |filehook| package should be loaded either before the class (using \Macro\RequirePackage) or directly % after it. Because the |memoir| hook code is moved to the |filehook| hooks this class should then be % compatible with below packages if |memoir| and |filehook| are loaded before them. % % % \subsubsection*{scrlfile} % The |scrlfile| package from the \emph{koma-script} bundle redefines \Macro\InputIfFileExists to allow file name aliases and to also add hooks. % If required it should be loaded before |filehook|, which will add its hooks correctly to the modified definition. % Since v0.4 from 2011/01/03 this modification will be also applied when the |scrlfile| package is loaded after |filehook|. % % % \subsubsection*{fink} % The |filehook| and |currfile| packages where written as replacements for the |fink| package, where |filehook| provides the necessary hooks for |currfile|. % The |fink| package has now been deprecated in favour of |currfile| and should not be used anymore. The |fink| compatibility code has been removed from |filehook| % and both cannot be used successfully together as both redefine the \Macro\InputIfFileExists macro. % % % \subsubsection*{listings} % The \pkg{listings} package uses \Macro\input inside \Macro\lstinputlisting. Therefore the |InputFile|(|s|) and |File|(|s|) hooks are also triggered for these files. % Please note that this hooks are executing inside a verbatim environment. While the code in the hook is not affected (because it was added outside the verbatim % environment), any further code read using any input macro (\Macro\input, \Macro\@input, \Macro\@@input\relax (\TeX's \Macro\input), \ldots) will be processed verbatim and typeset % as part of the listing. % Since v0.4 this macro is automatically patched so \Macro\@input is used instead to avoid this issue. % % % \subsection{Other Classes and Packages} % % \subsubsection*{jmlrbook} % The |jmlrbook| class from the |jmlr| bundle temporary redefines \Macro\InputIfFileExists to import papers. % The `original' definition is saved away at load time of the package and is used internally by the new definition. % This means that the hooks will not be active for this imported files because |filehook| is loaded after the class. % This should not affect its normal usage. % Note that, in theory, the package could be loaded before \Macro\documentclass using \Macro\RequirePackage to enable the file hooks also for these files. % % \subsubsection*{\LaTeX's \textbackslash bibliography} % The standard \LaTeX\ macro \Macro\bibliography uses the same internal macro \Macro\@input@ to read a file % as \Macro\include does. % The `include' hooks will also be executed for this |.bbl| file if the macro is directly followed by \Macro\clearpage, % because the |filehook| code will assume it is executed inside \Macro\include. % This rare case can be easily avoided by placing a \Macro\relax after \Macro\bibliography{\ldots}. % % % \begin{table} % \centering % \tablecaption{Incompatible packages and classes} % \label{tab:incomp} % % \begin{tabular}{>{\ttfamily}llll} % \toprule % Name & Type & Note & Affected Hooks \\ % \midrule % paper & class & with \texttt{journal} option & All hocks for \Macro\include\unskip'd files \\ % journal & class & & All hocks for \Macro\include\unskip'd files \\ % gmparts & package & & \Macro\include hooks \\ % newclude & package & formally \texttt{includex} & All hocks for \Macro\include\unskip'd files \\ % \bottomrule % \end{tabular} % \end{table} % % \section{Upgrade Guide} % \label{sec:upgrade} % This sections gives information for users of older versions of this package which unfortunately might not be 100\% backwards compatible. % % \subsection*{Upgrade to v0.4 - 2011/01/03} % \begin{itemize} % \item The macro \Macro\AfterIncludeFile was misspelled as \Macro\AfterOfIncludeFile in the implementation of earlier versions, but not in the documentation. % This has now be corrected. Please adjust your code to use the correct name and to require the |filehook| package from 2011/01/03. % \item All general hooks (the one not taking a file argument) used to have an implicit argument |#1| which was expanded to the file name (i.e.\ the argument of \Macro\input etc.). % This has now be changed, so that macro arguments are not handled special in hook code, which e.g.\ simplifies macro definitions. % Older hook code might need to change |##| to |#| to compensate for this change. % If the file name is required the macros (e.g.\ \Macro\currfilename) of the partner package \pkg{currfile} should be used. % These macros are available everywhere including in all hocks. % \end{itemize} % % \StopEventually{} % \clearpage % \section{Implementation}\label{sec:impl} % % \iffalse %<*filehook.sty> % \fi % \begin{macrocode} % \NeedsTeXFormat{LaTeX2e}[1999/12/01] \ProvidesPackage{filehook}[% % % %<*DRIVER> 2099/01/01 develop % Hooks for input files] % \end{macrocode} % % % \subsection{Options} % \begin{macrocode} \DeclareOption{force}{\PassOptionsToPackage{force}{filehook-2019}} \ProcessOptions\relax % \end{macrocode} % % \subsection{Load actual package} % \begin{macrocode} \@ifl@t@r\fmtversion{2020/10/01}{\RequirePackage{filehook-2020}}{\RequirePackage{filehook-2019}} % \end{macrocode} % % \iffalse % % \fi % % \iffalse %<*filehook-2019.sty> % \fi % \begin{macrocode} % \NeedsTeXFormat{LaTeX2e}[1999/12/01] \ProvidesPackage{filehook-2019}[% filehook subpackage, do not load directly % % %<*DRIVER> 2099/01/01 develop % Hooks for input files] % \end{macrocode} % % % \subsection{Options} % \begin{macrocode} \newif\iffilehook@force \DeclareOption{force}{\filehook@forcetrue} \ProcessOptions\relax % \end{macrocode} % % \subsection{General stuff} % % \begin{macro}{\iffilehook@newfmt} % \begin{macrocode} \newif\iffilehook@newfmt \@ifl@t@r\fmtversion{2019/10/01}{\filehook@newfmttrue}{\filehook@newfmtfalse} % \end{macrocode} % \end{macro} % % \begin{macro}{\filehook@let}[2]{}{} % \begin{macrocode} \def\filehook@let#1#2{% \expandafter\ifx\csname #2\space\endcsname\relax \expandafter\let\csname #1\expandafter\endcsname\csname #2\endcsname \else \expandafter\def\csname #1\expandafter\endcsname\expandafter{\expandafter\protect\csname #1\space\endcsname}% \expandafter\let\csname #1\space\expandafter\endcsname\csname #2\space\endcsname \fi } % \end{macrocode} % \end{macro} % % \begin{macro}{\filehook@glet}[2]{}{} % \begin{macrocode} \def\filehook@glet#1#2{% \expandafter\ifx\csname #2\space\endcsname\relax \expandafter\global\expandafter\let\csname #1\expandafter\endcsname\csname #2\endcsname \else \expandafter\global\expandafter\def\csname #1\expandafter\endcsname\expandafter{\expandafter\protect\csname #1\space\endcsname}% \expandafter\global\expandafter\let\csname #1\space\expandafter\endcsname\csname #2\space\endcsname \fi } % \end{macrocode} % \end{macro} % % % \begin{macro}{\filehook@cmp}[2]{}{} % Compare two macros definition including its space form in case of robust macros. % \begin{macrocode} \def\filehook@cmp#1#2{% \expandafter\ifx\csname #2\space\endcsname\relax \expandafter\ifx\csname #1\expandafter\endcsname\csname #2\endcsname \expandafter\expandafter\expandafter\@firstoftwo \else \expandafter\expandafter\expandafter\@secondoftwo \fi \else \expandafter\ifx\csname #1\space\expandafter\endcsname\csname #2\space\endcsname \expandafter\expandafter\expandafter\@firstoftwo \else \expandafter\expandafter\expandafter\@secondoftwo \fi \fi } % \end{macrocode} % \end{macro} % % % \subsection{Initialisation of Hooks} % The general hooks are initialised to call the file specific hooks. % % \begin{macro}{\filehook@csuse} % \begin{macrocode} \begingroup \gdef\filehook@csuse#1{\ifcsname #1\endcsname\csname #1\expandafter\endcsname\fi} \expandafter\ifx\csname csuse\endcsname\relax \expandafter\ifx\csname ifcsname\endcsname\relax \gdef\filehook@csuse#1{\expandafter\ifx\csname #1\endcsname\relax\else\csname #1\expandafter\endcsname\fi} \fi \else \global\let\filehook@csuse\csuse \fi \endgroup % \end{macrocode} % \end{macro} % % \begin{macro}{\filehook@include@atbegin} % \begin{macrocode} \def\filehook@include@atbegin#1{% \filehook@let{InputIfFileExists}{filehook@@InputIfFileExists}% \filehook@csuse{\filehook@include@atbegin@#1}% \filehook@include@@atbegin } % \end{macrocode} % \end{macro} % % \begin{macro}{\filehook@include@@atbegin} % \begin{macrocode} \def\filehook@include@@atbegin{} % \end{macrocode} % \end{macro} % % \begin{macro}{\filehook@include@atend} % \begin{macrocode} \def\filehook@include@atend#1{% \filehook@include@@atend \filehook@csuse{\filehook@include@atend@#1}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\filehook@include@@atend} % \begin{macrocode} \def\filehook@include@@atend{} % \end{macrocode} % \end{macro} % % \begin{macro}{\filehook@include@after} % \begin{macrocode} \def\filehook@include@after#1{% \filehook@include@@after \filehook@csuse{\filehook@include@after@#1}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\filehook@include@@after} % \begin{macrocode} \def\filehook@include@@after{} % \end{macrocode} % \end{macro} % % \begin{macro}{\filehook@input@atbegin} % \begin{macrocode} \def\filehook@input@atbegin#1{% \filehook@let{InputIfFileExists}{filehook@@InputIfFileExists}% \filehook@csuse{\filehook@input@atbegin@\filehook@ensureext{#1}}% \filehook@input@@atbegin } % \end{macrocode} % \end{macro} % % \begin{macro}{\filehook@input@@atbegin} % \begin{macrocode} \def\filehook@input@@atbegin{} % \end{macrocode} % \end{macro} % % \begin{macro}{\filehook@input@atend} % \begin{macrocode} \def\filehook@input@atend#1{% \filehook@input@@atend \filehook@csuse{\filehook@input@atend@\filehook@ensureext{#1}}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\filehook@input@@atend} % \begin{macrocode} \def\filehook@input@@atend{} % \end{macrocode} % \end{macro} % % \begin{macro}{\filehook@atbegin} % \begin{macrocode} \def\filehook@atbegin#1{% \filehook@csuse{\filehook@atbegin@\filehook@ensureext{#1}}% \filehook@@atbegin } % \end{macrocode} % \end{macro} % % \begin{macro}{\filehook@@atbegin} % \begin{macrocode} \def\filehook@@atbegin{} % \end{macrocode} % \end{macro} % % \begin{macro}{\filehook@atend} % \begin{macrocode} \def\filehook@atend#1{% \filehook@@atend \filehook@csuse{\filehook@atend@\filehook@ensureext{#1}}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\filehook@@atend} % \begin{macrocode} \def\filehook@@atend{} % \end{macrocode} % \end{macro} % % \begin{macro}{\filehook@every@atbegin} % \begin{macrocode} \def\filehook@every@atbegin#1{% \filehook@every@@atbegin } % \end{macrocode} % \end{macro} % % \begin{macro}{\filehook@every@@atbegin} % \begin{macrocode} \def\filehook@every@@atbegin{} % \end{macrocode} % \end{macro} % % \begin{macro}{\filehook@every@atend} % \begin{macrocode} \def\filehook@every@atend#1{% \filehook@every@@atend } % \end{macrocode} % \end{macro} % % \begin{macro}{\filehook@every@@atend} % \begin{macrocode} \def\filehook@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@include@atbegin@{filehook@include@atbegin@} \def\filehook@include@atend@{filehook@include@atend@} \def\filehook@include@after@{filehook@include@after@} \def\filehook@input@atbegin@{filehook@input@atbegin@} \def\filehook@input@atend@{filehook@input@atend@} \def\filehook@input@after@{filehook@input@after@} \def\filehook@atbegin@{filehook@atbegin@} \def\filehook@atend@{filehook@atend@} \def\filehook@after@{filehook@after@} % \end{macrocode} % % % \begin{macro}{\filehook@append} % Uses default \LaTeX{} macro. % \begin{macrocode} \def\filehook@append{\g@addto@macro} % \end{macrocode} % \end{macro} % % \begin{macro}{\filehook@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@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@prefix} % Prefixes code to a hook. % \begin{macrocode} \long\def\filehook@prefix#1#2{% \begingroup \@temptokena{#2}% \toks@\expandafter{#1}% \xdef#1{\the\@temptokena\the\toks@}% \endgroup } % \end{macrocode} % \end{macro} % % \begin{macro}{\filehook@prefixwarg} % Prefixes code with an argument to a hook. % \begin{macrocode} \long\def\filehook@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@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@addtohook#1#2#3{% \begingroup \edef\@tempa{#3}% \edef\@tempa{#2\filehook@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@append\filehook@include@@atbegin } % \end{macrocode} % \end{macro} % % \begin{macro}{\AtEndOfIncludes} % \begin{macrocode} \newcommand*\AtEndOfIncludes{% \filehook@prefix\filehook@include@@atend } % \end{macrocode} % \end{macro} % % \begin{macro}{\AfterIncludes} % \begin{macrocode} \newcommand*\AfterIncludes{% \filehook@prefix\filehook@include@@after } % \end{macrocode} % \end{macro} % % \begin{macro}{\AtBeginOfIncludeFile} % \begin{macrocode} \newcommand*\AtBeginOfIncludeFile[1]{% \filehook@addtohook\filehook@append\filehook@include@atbegin@{\filehook@ensuretex{#1}}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\AtEndOfIncludeFile} % \begin{macrocode} \newcommand*\AtEndOfIncludeFile[1]{% \filehook@addtohook\filehook@prefix\filehook@include@atend@{\filehook@ensuretex{#1}}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\AfterIncludeFile} % \begin{macrocode} \newcommand*\AfterIncludeFile[1]{% \filehook@addtohook\filehook@prefix\filehook@include@after@{\filehook@ensuretex{#1}}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\AtBeginOfInputs} % \begin{macrocode} \newcommand*\AtBeginOfInputs{% \filehook@append\filehook@input@@atbegin } % \end{macrocode} % \end{macro} % % \begin{macro}{\AtEndOfInputs} % \begin{macrocode} \newcommand*\AtEndOfInputs{% \filehook@prefix\filehook@input@@atend } % \end{macrocode} % \end{macro} % % \begin{macro}{\AtBeginOfInputFile} % \begin{macrocode} \newcommand*\AtBeginOfInputFile{% \filehook@addtohook\filehook@append\filehook@input@atbegin@ } % \end{macrocode} % \end{macro} % % \begin{macro}{\AtEndOfInputFile} % \begin{macrocode} \newcommand*\AtEndOfInputFile{% \filehook@addtohook\filehook@prefix\filehook@input@atend@ } % \end{macrocode} % \end{macro} % % \begin{macro}{\AtBeginOfFiles} % \begin{macrocode} \newcommand*\AtBeginOfFiles{% \filehook@append\filehook@@atbegin } % \end{macrocode} % \end{macro} % % \begin{macro}{\AtEndOfFiles} % \begin{macrocode} \newcommand*\AtEndOfFiles{% \filehook@prefix\filehook@@atend } % \end{macrocode} % \end{macro} % % \begin{macro}{\AtBeginOfEveryFile} % \begin{macrocode} \newcommand*\AtBeginOfEveryFile{% \filehook@append\filehook@every@@atbegin } % \end{macrocode} % \end{macro} % % \begin{macro}{\AtEndOfEveryFile} % \begin{macrocode} \newcommand*\AtEndOfEveryFile{% \filehook@prefix\filehook@every@@atend } % \end{macrocode} % \end{macro} % % \begin{macro}{\AtBeginOfFile} % \begin{macrocode} \newcommand*\AtBeginOfFile{% \filehook@addtohook\filehook@append\filehook@atbegin@ } % \end{macrocode} % \end{macro} % % \begin{macro}{\AtEndOfFile} % \begin{macrocode} \newcommand*\AtEndOfFile{% \filehook@addtohook\filehook@prefix\filehook@atend@ } % \end{macrocode} % \end{macro} % % % % \begin{macro}{\AtBeginOfClassFile} % \begin{macrocode} \newcommand*\AtBeginOfClassFile{% \@ifnextchar* {\AtBeginOfXFile@star\@clsextension}% {\AtBeginOfXFile@normal\@clsextension}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\AtBeginOfPackageFile} % \begin{macrocode} \newcommand*\AtBeginOfPackageFile{% \@ifnextchar* {\AtBeginOfXFile@star\@pkgextension}% {\AtBeginOfXFile@normal\@pkgextension}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\AtBeginOfXFile@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@star#1*#2{% \@ifl@aded{#1}{#2}% {\@firstofone}% {\AtBeginOfXFile@normal{#1}{#2}}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\AtBeginOfXFile@normal}[2]{extension}{name} % \begin{macrocode} \def\AtBeginOfXFile@normal#1#2{% \AtBeginOfFile{#2.#1}% } % \end{macrocode} % \end{macro} % % % \begin{macro}{\AtEndOfClassFile} % \begin{macrocode} \newcommand*\AtEndOfClassFile{% \@ifnextchar* {\AtEndOfXFile@star\@clsextension}% {\AtEndOfXFile@normal\@clsextension}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\AtEndOfPackageFile} % \begin{macrocode} \newcommand*\AtEndOfPackageFile{% \@ifnextchar* {\AtEndOfXFile@star\@pkgextension}% {\AtEndOfXFile@normal\@pkgextension}% } % \end{macrocode} % \end{macro} % % % \begin{macro}{\AtEndOfXFile@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@star#1*#2{% \@ifl@aded{#1}{#2}% {\@firstofone}% {\AtEndOfXFile@normal{#1}{#2}}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\AtEndOfXFile@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@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@prefix##1##2{% \gdef##1{}% \endgroup }% \let\filehook@append\filehook@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@orig@@input@} % \begin{macrocode} \let\filehook@orig@@input@\@input@ % \end{macrocode} % \end{macro} % % \begin{macro}{\filehook@orig@@iinput} % \begin{macrocode} \let\filehook@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@every@atbegin{#1}% \filehook@include@atbegin{#1}% \filehook@orig@@input@{#1}% \filehook@include@atend{#1}% \clearpage \filehook@include@after{#1}% \filehook@every@atend{#1}% \@gobble }% {\filehook@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@every@atbegin{#1}% \filehook@input@atbegin{#1}% \filehook@orig@@iinput{#1}% \filehook@input@atend{#1}% \filehook@every@atend{#1}% } \let\@iinput\filehook@@iinput % \end{macrocode} % \end{macro} % % \begin{macro}{\filehook@swap} % Auxiliary macro which swaps the two arguments. This is needed to expand % \Macro\@filef@und, which is given as first argument but needed then as the second one. % \begin{macrocode} \def\filehook@swap#1#2{#2#1} % \end{macrocode} % \end{macro} % % \begin{macro}{\filehook@ensureext} % This macro ensures the existence of a file name extension. If non is given `|.tex|' is % added. % \begin{macrocode} \def\filehook@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@ensuretex} % Ensures a `|.tex|' extension, i.e. adds it if missing, even if there is a different one. % \begin{macrocode} \def\filehook@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}{\latex@InputIfFileExists} % Standard \LaTeX\ definition of \Macro\InputIfFileExists. % \begin{macrocode} \iffilehook@newfmt \expandafter\def\expandafter\latex@InputIfFileExists\expandafter{% \expandafter\protect\csname InputIfFileExists\space\endcsname } \expandafter\long\expandafter\def\csname latex@InputIfFileExists\space\endcsname#1#2{% \IfFileExists{#1}% {% \expandafter\@swaptwoargs\expandafter {\@filef@und}{#2\@addtofilelist{#1}\@@input}}} \else \long\def\latex@InputIfFileExists#1#2{% \IfFileExists{#1}% {#2\@addtofilelist{#1}% \@@input\@filef@und }% } \fi % \end{macrocode} % \end{macro} % % % \begin{macro}{\filehook@default@InputIfFileExists} % \begin{macrocode} \DeclareRobustCommand\filehook@default@InputIfFileExists[2]{% \IfFileExists{#1}% {\expandafter\filehook@swap \expandafter{\@filef@und}% {#2\@addtofilelist{#1}% \filehook@every@atbegin{#1}% \filehook@atbegin{#1}% \@@input}% \filehook@atend{#1}% \filehook@every@atend{#1}% }% } % \end{macrocode} % Make sure definition is global: % \begin{macrocode} \filehook@glet{filehook@default@InputIfFileExists}{filehook@default@InputIfFileExists}% % \end{macrocode} % \end{macro} % % \begin{macro}{\filehook@@default@InputIfFileExists} % \begin{macrocode} \DeclareRobustCommand\filehook@@default@InputIfFileExists[2]{% \filehook@let{InputIfFileExists}{filehook@InputIfFileExists}% \IfFileExists{#1}% {\expandafter\filehook@swap \expandafter{\@filef@und}% {#2\@addtofilelist{#1}% \filehook@atbegin{#1}% \@@input}% \filehook@atend{#1}% }% } % \end{macrocode} % Make sure definition is global: % \begin{macrocode} \filehook@glet{filehook@@default@InputIfFileExists}{filehook@@default@InputIfFileExists}% % \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}{% \filehook@glet{InputIfFileExists}{latex@InputIfFileExists}% }% \AtEndOfPackageFile*{scrlfile}{% \RequirePackage{filehook-scrlfile}% }% % \end{macrocode} % Fink: % \begin{macrocode} \AtBeginOfPackageFile*{fink}{% \RequirePackage{kvoptions}% \begingroup \filehook@let{InputIfFileExists}{latex@InputIfFileExists}% }% \AtEndOfPackageFile*{fink}{% \edef\@tempa{\noexpand\PassOptionsToPackage{mainext=\fnk@mainext,maindir=\fnk@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}{% \filehook@let{InputIfFileExists}{latex@InputIfFileExists}% \let\@iinput\filehook@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} \filehook@cmp{InputIfFileExists}{filehook@InputIfFileExists}% {}% already set up {% \filehook@cmp{InputIfFileExists}{latex@InputIfFileExists}% {% \filehook@let{filehook@InputIfFileExists}{filehook@default@InputIfFileExists}% \filehook@let{filehook@@InputIfFileExists}{filehook@@default@InputIfFileExists}% \filehook@let{InputIfFileExists}{filehook@InputIfFileExists}% }% {% \iffilehook@force \filehook@let{filehook@InputIfFileExists}{filehook@default@InputIfFileExists}% \filehook@let{filehook@@InputIfFileExists}{filehook@@default@InputIfFileExists}% \filehook@let{InputIfFileExists}{filehook@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 }% }% % \end{macrocode} % \end{macro} % % \begin{macrocode} \AtBeginDocument{% % Check if definition got changed again. For the new LaTeX format we check again \InputIfFileExists, % for the old format to \InputIfFileExists directly. \filehook@cmp{InputIfFileExists}{filehook@InputIfFileExists}{}{% \PackageWarning{filehook}{Macro \string\InputIfFileExists\space got redefined after 'filehook' was loaded.^^J% Certain file hooks might now be dysfunctional!}% }% } % \end{macrocode} % % \iffalse % % \fi % % \iffalse %<*filehook-2020.sty> % \fi % \begin{macrocode} % \NeedsTeXFormat{LaTeX2e}[1999/12/01] \ProvidesPackage{filehook-2020}[% filehook subpackage, do not load directly % % %<*DRIVER> 2099/01/01 develop % Hooks for input files] % \end{macrocode} % % % \subsection{Options} % \begin{macrocode} \DeclareOption{force}{} \ProcessOptions\relax % \end{macrocode} % % \subsection{General stuff} % % \subsection{Initialisation of Hooks} % The general hooks are initialised to call the file specific hooks. % % \begin{macro}{\filehook@csuse} % \begin{macrocode} \begingroup \gdef\filehook@csuse#1{\ifcsname #1\endcsname\csname #1\expandafter\endcsname\fi} \expandafter\ifx\csname csuse\endcsname\relax \expandafter\ifx\csname ifcsname\endcsname\relax \gdef\filehook@csuse#1{\expandafter\ifx\csname #1\endcsname\relax\else\csname #1\expandafter\endcsname\fi} \fi \else \global\let\filehook@csuse\csuse \fi \endgroup % \end{macrocode} % \end{macro} % % \begin{macro}{\filehook@include@atbegin} % \begin{macrocode} \def\filehook@include@atbegin#1{% \filehook@csuse{\filehook@include@atbegin@#1}% \filehook@include@@atbegin } % \end{macrocode} % \end{macro} % % \begin{macro}{\filehook@include@@atbegin} % \begin{macrocode} \def\filehook@include@@atbegin{} % \end{macrocode} % \end{macro} % % \begin{macro}{\filehook@include@atend} % \begin{macrocode} \def\filehook@include@atend#1{% \filehook@include@@atend \filehook@csuse{\filehook@include@atend@#1}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\filehook@include@@atend} % \begin{macrocode} \def\filehook@include@@atend{} % \end{macrocode} % \end{macro} % % \begin{macro}{\filehook@include@after} % \begin{macrocode} \def\filehook@include@after#1{% \filehook@include@@after \filehook@csuse{\filehook@include@after@#1}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\filehook@include@@after} % \begin{macrocode} \def\filehook@include@@after{} % \end{macrocode} % \end{macro} % % \begin{macro}{\filehook@input@atbegin} % \begin{macrocode} \def\filehook@input@atbegin#1{% \filehook@csuse{\filehook@input@atbegin@\filehook@ensureext{#1}}% \filehook@input@@atbegin } % \end{macrocode} % \end{macro} % % \begin{macro}{\filehook@input@@atbegin} % \begin{macrocode} \def\filehook@input@@atbegin{} % \end{macrocode} % \end{macro} % % \begin{macro}{\filehook@input@atend} % \begin{macrocode} \def\filehook@input@atend#1{% \filehook@input@@atend \filehook@csuse{\filehook@input@atend@\filehook@ensureext{#1}}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\filehook@input@@atend} % \begin{macrocode} \def\filehook@input@@atend{} % \end{macrocode} % \end{macro} % % \begin{macro}{\filehook@atbegin} % \begin{macrocode} \def\filehook@atbegin#1{% \filehook@csuse{\filehook@atbegin@\filehook@ensureext{#1}}% \filehook@@atbegin } % \end{macrocode} % \end{macro} % % \begin{macro}{\filehook@@atbegin} % \begin{macrocode} \def\filehook@@atbegin{} % \end{macrocode} % \end{macro} % % \begin{macro}{\filehook@atend} % \begin{macrocode} \def\filehook@atend#1{% \filehook@@atend \filehook@csuse{\filehook@atend@\filehook@ensureext{#1}}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\filehook@@atend} % \begin{macrocode} \def\filehook@@atend{} % \end{macrocode} % \end{macro} % % \begin{macro}{\filehook@every@atbegin} % \begin{macrocode} \def\filehook@every@atbegin#1{% \filehook@every@@atbegin } % \end{macrocode} % \end{macro} % % \begin{macro}{\filehook@every@@atbegin} % \begin{macrocode} \def\filehook@every@@atbegin{} % \end{macrocode} % \end{macro} % % \begin{macro}{\filehook@every@atend} % \begin{macrocode} \def\filehook@every@atend#1{% \filehook@every@@atend } % \end{macrocode} % \end{macro} % % \begin{macro}{\filehook@every@@atend} % \begin{macrocode} \def\filehook@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@include@atbegin@{filehook@include@atbegin@} \def\filehook@include@atend@{filehook@include@atend@} \def\filehook@include@after@{filehook@include@after@} \def\filehook@input@atbegin@{filehook@input@atbegin@} \def\filehook@input@atend@{filehook@input@atend@} \def\filehook@input@after@{filehook@input@after@} \def\filehook@atbegin@{filehook@atbegin@} \def\filehook@atend@{filehook@atend@} \def\filehook@after@{filehook@after@} % \end{macrocode} % % % \begin{macro}{\filehook@append} % Uses default \LaTeX{} macro. % \begin{macrocode} \def\filehook@append{\g@addto@macro} % \end{macrocode} % \end{macro} % % \begin{macro}{\filehook@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@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@prefix} % Prefixes code to a hook. % \begin{macrocode} \long\def\filehook@prefix#1#2{% \begingroup \@temptokena{#2}% \toks@\expandafter{#1}% \xdef#1{\the\@temptokena\the\toks@}% \endgroup } % \end{macrocode} % \end{macro} % % \begin{macro}{\filehook@prefixwarg} % Prefixes code with an argument to a hook. % \begin{macrocode} \long\def\filehook@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@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@addtohook#1#2#3{% \begingroup \edef\@tempa{#3}% \edef\@tempa{#2\filehook@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@append\filehook@include@@atbegin } % \end{macrocode} % \end{macro} % % \begin{macro}{\AtEndOfIncludes} % \begin{macrocode} \newcommand*\AtEndOfIncludes{% \filehook@prefix\filehook@include@@atend } % \end{macrocode} % \end{macro} % % \begin{macro}{\AfterIncludes} % \begin{macrocode} \newcommand*\AfterIncludes{% \filehook@prefix\filehook@include@@after } % \end{macrocode} % \end{macro} % % \begin{macro}{\AtBeginOfIncludeFile} % \begin{macrocode} \newcommand*\AtBeginOfIncludeFile[1]{% \filehook@addtohook\filehook@append\filehook@include@atbegin@{\filehook@ensuretex{#1}}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\AtEndOfIncludeFile} % \begin{macrocode} \newcommand*\AtEndOfIncludeFile[1]{% \filehook@addtohook\filehook@prefix\filehook@include@atend@{\filehook@ensuretex{#1}}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\AfterIncludeFile} % \begin{macrocode} \newcommand*\AfterIncludeFile[1]{% \filehook@addtohook\filehook@prefix\filehook@include@after@{\filehook@ensuretex{#1}}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\AtBeginOfInputs} % \begin{macrocode} \newcommand*\AtBeginOfInputs{% \filehook@append\filehook@input@@atbegin } % \end{macrocode} % \end{macro} % % \begin{macro}{\AtEndOfInputs} % \begin{macrocode} \newcommand*\AtEndOfInputs{% \filehook@prefix\filehook@input@@atend } % \end{macrocode} % \end{macro} % % \begin{macro}{\AtBeginOfInputFile} % \begin{macrocode} \newcommand*\AtBeginOfInputFile{% \filehook@addtohook\filehook@append\filehook@input@atbegin@ } % \end{macrocode} % \end{macro} % % \begin{macro}{\AtEndOfInputFile} % \begin{macrocode} \newcommand*\AtEndOfInputFile{% \filehook@addtohook\filehook@prefix\filehook@input@atend@ } % \end{macrocode} % \end{macro} % % \begin{macro}{\AtBeginOfFiles} % \begin{macrocode} \newcommand*\AtBeginOfFiles{% \filehook@append\filehook@@atbegin } % \end{macrocode} % \end{macro} % % \begin{macro}{\AtEndOfFiles} % \begin{macrocode} \newcommand*\AtEndOfFiles{% \filehook@prefix\filehook@@atend } % \end{macrocode} % \end{macro} % % \begin{macro}{\AtBeginOfEveryFile} % \begin{macrocode} \newcommand*\AtBeginOfEveryFile{% \filehook@append\filehook@every@@atbegin } % \end{macrocode} % \end{macro} % % \begin{macro}{\AtEndOfEveryFile} % \begin{macrocode} \newcommand*\AtEndOfEveryFile{% \filehook@prefix\filehook@every@@atend } % \end{macrocode} % \end{macro} % % \begin{macro}{\AtBeginOfFile} % \begin{macrocode} \newcommand*\AtBeginOfFile{% \filehook@addtohook\filehook@append\filehook@atbegin@ } % \end{macrocode} % \end{macro} % % \begin{macro}{\AtEndOfFile} % \begin{macrocode} \newcommand*\AtEndOfFile{% \filehook@addtohook\filehook@prefix\filehook@atend@ } % \end{macrocode} % \end{macro} % % % % \begin{macro}{\AtBeginOfClassFile} % \begin{macrocode} \newcommand*\AtBeginOfClassFile{% \@ifnextchar* {\AtBeginOfXFile@star\@clsextension}% {\AtBeginOfXFile@normal\@clsextension}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\AtBeginOfPackageFile} % \begin{macrocode} \newcommand*\AtBeginOfPackageFile{% \@ifnextchar* {\AtBeginOfXFile@star\@pkgextension}% {\AtBeginOfXFile@normal\@pkgextension}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\AtBeginOfXFile@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@star#1*#2{% \@ifl@aded{#1}{#2}% {\@firstofone}% {\AtBeginOfXFile@normal{#1}{#2}}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\AtBeginOfXFile@normal}[2]{extension}{name} % \begin{macrocode} \def\AtBeginOfXFile@normal#1#2{% \AtBeginOfFile{#2.#1}% } % \end{macrocode} % \end{macro} % % % \begin{macro}{\AtEndOfClassFile} % \begin{macrocode} \newcommand*\AtEndOfClassFile{% \@ifnextchar* {\AtEndOfXFile@star\@clsextension}% {\AtEndOfXFile@normal\@clsextension}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\AtEndOfPackageFile} % \begin{macrocode} \newcommand*\AtEndOfPackageFile{% \@ifnextchar* {\AtEndOfXFile@star\@pkgextension}% {\AtEndOfXFile@normal\@pkgextension}% } % \end{macrocode} % \end{macro} % % % \begin{macro}{\AtEndOfXFile@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@star#1*#2{% \@ifl@aded{#1}{#2}% {\@firstofone}% {\AtEndOfXFile@normal{#1}{#2}}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\AtEndOfXFile@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@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@prefix##1##2{% \gdef##1{}% \endgroup }% \let\filehook@append\filehook@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. % % \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\DEPRECATED@input@#1{% \@ifnextchar\clearpage {% \filehook@every@atbegin{#1}% \filehook@include@atbegin{#1}% \filehook@orig@@input@{#1}% \filehook@include@atend{#1}% \clearpage \filehook@include@after{#1}% \filehook@every@atend{#1}% \@gobble }% {\filehook@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@every@atbegin{#1}% \filehook@input@atbegin{#1}% \filehook@orig@@iinput{#1}% \filehook@input@atend{#1}% \filehook@every@atend{#1}% } %\let\@iinput\filehook@@iinput % \end{macrocode} % \end{macro} % % \begin{macro}{\filehook@ensureext} % This macro ensures the existence of a file name extension. If non is given `|.tex|' is % added. % \begin{macrocode} \def\filehook@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@ensuretex} % Ensures a `|.tex|' extension, i.e. adds it if missing, even if there is a different one. % \begin{macrocode} \def\filehook@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} % % \begin{macro}{\filehook@set@CurrentFile} % \begin{macrocode} \def\filehook@set@CurrentFile{% \edef\filehook@CurrentFile{% \ifx\CurrentFilePath\empty \else \CurrentFilePath/% \fi \CurrentFile }% } % \end{macrocode} % \end{macro} % % \begin{macro}{\Hook} % \begin{macrocode} \AddToHook{include/before}{% \filehook@set@CurrentFile \filehook@include@atbegin{\filehook@CurrentFile}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\Hook} % \begin{macrocode} \AddToHook{include/end}{% \filehook@set@CurrentFile \filehook@include@atend{\filehook@CurrentFile}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\Hook} % \begin{macrocode} \AddToHook{include/after}{% \filehook@set@CurrentFile \filehook@include@after{\filehook@CurrentFile}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\filehook@istexfile} % \begin{macrocode} \begingroup \edef\dottex{\expandafter\expandafter\expandafter\@gobble\expandafter\string\csname.tex\endcsname} \expandafter \gdef\expandafter\filehook@istexfile\expandafter#\expandafter1\expandafter{% \expandafter\expandafter\expandafter\filehook@istexfile@\expandafter#\expandafter1\expandafter\empty\dottex\empty\empty\@nil } % \end{macrocode} % \end{macro} % % \begin{macro}{\filehook@istexfile@} % \begin{macrocode} \expandafter\gdef\expandafter\filehook@istexfile@\expandafter#\expandafter1\dottex\empty#2\empty#3\@nil{% \begingroup \def\@tempa{#2}% \ifx\@tempa\empty \endgroup \expandafter\@secondoftwo \else \endgroup \expandafter\@firstoftwo \fi } \endgroup % \end{macrocode} % \end{macro} % % % \begin{macro}{\Hook} % \begin{macrocode} \AddToHook{file/before}{% \filehook@set@CurrentFile \filehook@every@atbegin{\filehook@CurrentFile}% \filehook@istexfile\filehook@CurrentFile{\filehook@input@atbegin{\filehook@CurrentFile}}{}% \filehook@atbegin{\filehook@CurrentFile}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\Hook} % \begin{macrocode} \AddToHook{file/after}{% \filehook@set@CurrentFile \filehook@atend{\filehook@CurrentFile}% \filehook@istexfile\filehook@CurrentFile{\filehook@input@atend{\filehook@CurrentFile}}{}% \filehook@every@atend{\filehook@CurrentFile}% } % \end{macrocode} % \end{macro} % % \iffalse % % \fi % % \iffalse %<*filehook-memoir.sty> % \fi % \begin{macrocode} % \NeedsTeXFormat{LaTeX2e}[1999/12/01] \ProvidesPackage{filehook-memoir}[2020/02/02 v0.2 filehook patch for memoir class] % \end{macrocode} % % \begin{macrocode} \RequirePackage{filehook} \begingroup % \end{macrocode} % % \begin{macro}{\memoir@InputIfFileExists} % The definition taken from memoir.cls. Copyright see there. % \begin{macrocode} \ifcsname InputIfFileExists\space\endcsname \DeclareRobustCommand \memoir@InputIfFileExists[2]{% \IfFileExists{#1}% {% \expandafter\@swaptwoargs\expandafter {\@filef@und\m@matendf{#1}\killm@matf{#1}}{% #2\@addtofilelist{#1}\m@matbeginf{#1}\@@input% }% }% } \else % Old definition \renewcommand{\memoir@InputIfFileExists}[2]{% \IfFileExists{#1}% {#2\@addtofilelist{#1}\m@matbeginf{#1}% \@@input \@filef@und \m@matendf{#1}% \killm@matf{#1}}% } \fi % \end{macrocode} % \end{macro} % % \begin{macrocode} \@tempswafalse \filehook@cmp{InputIfFileExists}{filehook@InputIfFileExists}% {\@tempswatrue}% {% \filehook@cmp{InputIfFileExists}{memoir@InputIfFileExists}% {\@tempswatrue}% {}% }% \if@tempswa \filehook@glet{filehook@InputIfFileExists}{filehook@default@InputIfFileExists}% \filehook@glet{filehook@@InputIfFileExists}{filehook@@default@InputIfFileExists}% \filehook@glet{InputIfFileExists}{filehook@InputIfFileExists}% \filehook@appendwarg\filehook@atbegin{\m@matbeginf{#1}}% \filehook@prefixwarg\filehook@atend{\m@matendf{#1}\killm@matf{#1}}% \PackageInfo{filehook}{Detected 'memoir' class: the memoir hooks will be moved to the `At...OfFiles' hooks} \else \iffilehook@force \filehook@glet{filehook@InputIfFileExists}{filehook@default@InputIfFileExists}% \filehook@glet{filehook@@InputIfFileExists}{filehook@@default@InputIfFileExists}% \filehook@glet{InputIfFileExists}{filehook@InputIfFileExists}% \PackageWarning{filehook}{Detected 'memoir' class with unknown definition of \string\InputIfFileExists.^^J% The 'force' option of 'filehook' is in effect. Macro is overwritten with default!}% \else \PackageError{filehook}{Detected 'memoir' class with unknown definition of \string\InputIfFileExists.^^J% Use the 'force' option of 'filehook' to overwrite it.}{}% \fi \fi % \end{macrocode} % % \begin{macrocode} \endgroup % \end{macrocode} % % \iffalse % % \fi % % \iffalse %<*filehook-listings.sty> % \fi % \begin{macrocode} % \NeedsTeXFormat{LaTeX2e}[1999/12/01] \ProvidesPackage{filehook-listings}[2011/01/02 v0.1 Patch for listings to avoid hooks for verbatim input files] % \end{macrocode} % % \begin{macrocode} \begingroup \long\def\patch#1\def\lst@next#2#3\endpatch{% \toks@{#2}% \edef\@tempa{\the\toks@}% \def\@tempb{\input{####1}}% \ifx\@tempa\@tempb \gdef\lst@InputListing##1{#1\def\lst@next{\@input{##1}}#3}% \else \PackageWarning{filehook-listings}{To-be-patched code in macro \string\lst@InputListing was not found!}% \fi } \@ifundefined{lst@InputListing}{% \PackageWarning{filehook-listings}{To-be-patched Macro \string\lst@InputListing not found!}% }{} \expandafter\patch\lst@InputListing{#1}\endpatch \endgroup % \end{macrocode} % % \iffalse % % \fi % % \iffalse %<*filehook-scrlfile.sty> % \fi % \begin{macrocode} % \NeedsTeXFormat{LaTeX2e}[1999/12/01] \ProvidesPackage{filehook-scrlfile}[2020/02/02 v0.2 filehook patch for scrlfile package] \RequirePackage{filehook} \begingroup % \end{macrocode} % % \begin{macro}{\scrlfile@InputIfFileExists} % \begin{macrocode} \expandafter\def\expandafter\sclrfile@InputIfFileExists\expandafter{% \expandafter\protect\csname InputIfFileExists\space\endcsname } \expandafter\long\expandafter\def\csname scrlfile@InputIfFileExists\space\endcsname#1#2{% \begingroup\expandafter\expandafter\expandafter\endgroup \expandafter\ifx\csname #1-@alias\endcsname\relax \expandafter\@secondoftwo \else \scr@replacefile@msg{\csname #1-@alias\endcsname}{#1}% \expandafter\@firstoftwo \fi {% \expandafter\InputIfFileExists\expandafter{\csname #1-@alias\endcsname}{#2}% }% {\IfFileExists{#1}{% \expandafter\scr@input@withhook\expandafter{\@filef@und}{#1}{#2}}% }% } % \end{macrocode} % \end{macro} % % % \begin{macro}{\filehook@scrlfile@InputIfFileExists} % \begin{macrocode} \DeclareRobustCommand\filehook@scrlfile@InputIfFileExists[2]{% \begingroup\expandafter\expandafter\expandafter\endgroup \expandafter\ifx\csname #1-@alias\endcsname\relax \expandafter\@secondoftwo \else \scr@replacefile@msg{\csname #1-@alias\endcsname}{#1}% \expandafter\@firstoftwo \fi {% \expandafter\InputIfFileExists\expandafter{\csname #1-@alias\endcsname}{#2}% }% {\IfFileExists{#1}{% \expandafter\filehook@swap \expandafter{\@filef@und}% {\scr@load@hook{before}{#1}% #2\@addtofilelist{#1}% \filehook@every@atbegin{#1}% \filehook@atbegin{#1}% \@@input}% \filehook@atend{#1}% \filehook@every@atend{#1}% \scr@load@hook{after}{#1}% }}% } \filehook@glet{filehook@scrlfile@InputIfFileExists}{filehook@scrlfile@InputIfFileExists}% % \end{macrocode} % \end{macro} % % % \begin{macro}{\filehook@@scrlfile@InputIfFileExists} % \begin{macrocode} \DeclareRobustCommand\filehook@@scrlfile@InputIfFileExists[2]{% \filehook@let{InputIfFileExists}{filehook@InputIfFileExists}% \begingroup\expandafter\expandafter\expandafter\endgroup \expandafter\ifx\csname #1-@alias\endcsname\relax \expandafter\@secondoftwo \else \scr@replacefile@msg{\csname #1-@alias\endcsname}{#1}% \expandafter\@firstoftwo \fi {% \expandafter\InputIfFileExists\expandafter{\csname #1-@alias\endcsname}{#2}% }% {\IfFileExists{#1}{% \expandafter\filehook@swap \expandafter{\@filef@und}% {\scr@load@hook{before}{#1}% #2\@addtofilelist{#1}% \filehook@atbegin{#1}% \@@input}% \filehook@atend{#1}% \scr@load@hook{after}{#1}% }}% } \filehook@glet{filehook@@scrlfile@InputIfFileExists}{filehook@@scrlfile@InputIfFileExists}% % \end{macrocode} % \end{macro} % % If the |scrlfile| package definition is detected the |filehook|s are added % to that definition. Unfortunately the \Macro\scr@load@hook{before} hook is placed \emph{before} % not after the |#2\@addtofilelist{#1}| code. Otherwise the |filehook|s could simply be added to these hooks. % Note that this will stop working if |scrlfile| ever changes its definition of the \Macro\InputIfFileExists macro. % \begin{macrocode} \@tempswafalse \filehook@cmp{InputIfFileExists}{filehook@InputIfFileExists}% {\@tempswatrue}% {% \filehook@cmp{InputIfFileExists}{scrlfile@InputIfFileExists}% {\@tempswatrue}% {}% }% \if@tempswa \filehook@glet{filehook@InputIfFileExists}{filehook@scrlfile@InputIfFileExists}% \filehook@glet{filehook@@InputIfFileExists}{filehook@@scrlfile@InputIfFileExists}% \filehook@glet{InputIfFileExists}{filehook@InputIfFileExists}% \PackageInfo{filehook}{Package 'scrlfile' detected and compensated for}% \else \iffilehook@force \filehook@glet{filehook@InputIfFileExists}{filehook@scrlfile@InputIfFileExists}% \filehook@glet{filehook@@InputIfFileExists}{filehook@@scrlfile@InputIfFileExists}% \filehook@glet{InputIfFileExists}{filehook@InputIfFileExists}% \PackageWarning{filehook}{Detected 'scrlfile' package with unknown definition of \string\InputIfFileExists.^^J% The 'force' option of 'filehook' is in effect. Macro is overwritten with default!}% \else \PackageError{filehook}{Detected 'scrlfile' package with unknown definition of \string\InputIfFileExists.^^J% Use the 'force' option of 'filehook' to overwrite it.}{}% \fi \fi % \end{macrocode} % % \begin{macrocode} \endgroup % \end{macrocode} % % % \iffalse % % \fi % % \iffalse %<*filehook-fink.sty> % \fi % \begin{macrocode} % \NeedsTeXFormat{LaTeX2e}[1999/12/01] \ProvidesPackage{filehook-fink}[011/01/03 v0.1 filehook compatibility code for fink package] % \end{macrocode} % % \begin{macrocode} \RequirePackage{filehook} \RequirePackage{currfile}% \begingroup \long\def\fink@old@InputIfFileExists#1#2{% \IfFileExists{#1}{% #2\@addtofilelist{#1}% \fink@prepare{#1}% \expandafter\fink@input% \expandafter\fink@restore\expandafter{\finkpath}}% } \long\def\fink@new@InputIfFileExists#1#2{% \IfFileExists{#1}{% #2\@addtofilelist{#1}% \edef\fink@before{\noexpand\fink@input{#1}}% \edef\fink@after{\noexpand\fink@restore{\finkpath}}% \expandafter\fink@before\fink@after}% } \ifcase \ifx\InputIfFileExists\filehook@InputIfFileExists 0\else \ifx\InputIfFileExists\latex@InputIfFileExists 1\else \ifx\InputIfFileExists\fink@new@InputIfFileExists 1\else \ifx\InputIfFileExists\fink@old@InputIfFileExists 1\else 1% \fi\fi\fi\fi \relax \or \global\let\filehook@InputIfFileExists\filehook@default@InputIfFileExists \global\let\filehook@@InputIfFileExists\filehook@@default@InputIfFileExists \global\let\InputIfFileExists\filehook@InputIfFileExists \PackageInfo{filehook-fink}{Package 'fink' detected and replaced by 'currfile'}% \else \iffilehook@force \global\let\filehook@InputIfFileExists\filehook@default@InputIfFileExists \global\let\filehook@@InputIfFileExists\filehook@@default@InputIfFileExists \global\let\InputIfFileExists\filehook@InputIfFileExists \PackageWarning{filehook-fink}{Detected 'fink' package with unknown definition of \string\InputIfFileExists.^^J% The 'force' option of 'filehook' is in effect. Macro is overwritten with default!}% \else \PackageError{filehook-fink}{Detected 'fink' package with unknown definition of \string\InputIfFileExists.^^J% Use the 'force' option of 'filehook' to overwrite it.}{}% \fi \fi \endgroup % \end{macrocode} % % \iffalse % % \fi % % \iffalse %<*pgf-filehook.sty> % \fi % % \subsection{Support for PGF Keys} % % \begin{macrocode} \ProvidesPackage{pgf-filehook}[2010/01/07 v1.0 PGF keys for the filehook package] \RequirePackage{filehook} \RequirePackage{pgfkeys} \pgfkeys{% /filehook/.is family, /filehook, % EveryFile/.is family, EveryFile/AtBegin/.code={\AtBeginOfEveryFile{#1}}, EveryFile/AtBegin/.value required, EveryFile/AtEnd/.code={\AtEndOfEveryFile{#1}}, EveryFile/AtEnd/.value required, % Files/.is family, Files/AtBegin/.code={\AtBeginOfFiles{#1}}, Files/AtBegin/.value required, Files/AtEnd/.code={\AtEndOfFiles{#1}}, Files/AtEnd/.value required, % File/.is family, File/AtBegin/.code 2 args={\AtBeginOfFile{#1}{#2}}, File/AtBegin/.value required, File/AtEnd/.code 2 args={\AtEndOfFile{#1}{#2}}, File/AtEnd/.value required, % Inputs/.is family, Inputs/AtBegin/.code={\AtBeginOfInputs{#1}}, Inputs/AtBegin/.value required, Inputs/AtEnd/.code={\AtEndOfInputs{#1}}, Inputs/AtEnd/.value required, % InputFile/.is family, InputFile/AtBegin/.code 2 args={\AtBeginOfInputFile{#1}{#2}}, InputFile/AtBegin/.value required, InputFile/AtEnd/.code 2 args={\AtEndOfInputFile{#1}{#2}}, InputFile/AtEnd/.value required, % Includes/.is family, Includes/AtBegin/.code={\AtBeginOfIncludes{#1}}, Includes/AtBegin/.value required, Includes/AtEnd/.code={\AtEndOfIncludes{#1}}, Includes/AtEnd/.value required, Includes/After/.code={\AfterIncludes{#1}}, Includes/After/.value required, % IncludeFile/.is family, IncludeFile/AtBegin/.code 2 args={\AtBeginOfIncludeFile{#1}{#2}}, IncludeFile/AtBegin/.value required, IncludeFile/AtEnd/.code 2 args={\AtEndOfIncludeFile{#1}{#2}}, IncludeFile/AtEnd/.value required, IncludeFile/After/.code 2 args={\AfterIncludeFile{#1}{#2}}, IncludeFile/After/.value required, % ClassFile/.is family, ClassFile/AtBegin/.code={\AtBeginOfClassFile#1}, ClassFile/AtBegin/.value required, ClassFile/AtEnd/.code={\AtEndOfClassFile#1}, ClassFile/AtEnd/.value required, % PackageFile/.is family, PackageFile/AtBegin/.code={\AtBeginOfPackageFile#1}, PackageFile/AtBegin/.value required, PackageFile/AtEnd/.code={\AtEndOfPackageFile#1}, PackageFile/AtEnd/.value required, } \newcommand{\pgffilehook}{\pgfqkeys{/filehook}} % \end{macrocode} % % \iffalse % % \fi % % \Finale \endinput