summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex/filehook
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/source/latex/filehook')
-rw-r--r--Master/texmf-dist/source/latex/filehook/filehook.dtx1397
-rw-r--r--Master/texmf-dist/source/latex/filehook/filehook.ins8
2 files changed, 1077 insertions, 328 deletions
diff --git a/Master/texmf-dist/source/latex/filehook/filehook.dtx b/Master/texmf-dist/source/latex/filehook/filehook.dtx
index 2c385a7bac8..35398cb4fe1 100644
--- a/Master/texmf-dist/source/latex/filehook/filehook.dtx
+++ b/Master/texmf-dist/source/latex/filehook/filehook.dtx
@@ -1,5 +1,5 @@
% \iffalse meta-comment
-%% Copyright (c) 2010 by Martin Scharrer <martin@scharrer-online.de>
+%% Copyright (c) 2010-2011 by Martin Scharrer <martin@scharrer-online.de>
%% -----------------------------------------------------------------
%%
%% This work may be distributed and/or modified under the
@@ -19,7 +19,7 @@
%% This work consists of the files filehook.dtx, filehook.ins
%% and the derived file filehook.sty.
%%
-%% $Id: filehook.dtx 1926 2010-12-20 23:11:20Z martin $
+%% $Id: filehook.dtx 2005 2011-01-03 22:53:56Z martin $
% \fi
%
% \iffalse
@@ -29,18 +29,28 @@
%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%<package>\ProvidesPackage{filehook}
%<*package>
- [2010/12/20 v0.3 Hooks for input files]
+ [2011/01/03 v0.4 Hooks for input files]
%</package>
%
%<*driver>
-\documentclass{ydoc}[2010/12/20]
-\usepackage{filehook}[2010/12/08]
+\documentclass{ydoc}[2011/01/03]
+\usepackage{filehook}[2011/01/03]
\usepackage{ifpdf}
\usepackage{hyperref}
+\usepackage{array}
+\usepackage{booktabs}
\EnableCrossrefs
\CodelineIndex
\RecordChanges
\providecommand*\pkg{\texttt}
+\makeatletter
+\providecommand*\tablecaption{%
+ \@tempdima=\abovecaptionskip
+ \abovecaptionskip=\belowcaptionskip
+ \belowcaptionskip=\@tempdima
+ \caption
+}
+\makeatother
\listfiles
\begin{document}
\DocInput{filehook.dtx}
@@ -50,7 +60,7 @@
%</driver>
% \fi
%
-% \CheckSum{422}
+% \CheckSum{939}
%
% \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
@@ -72,6 +82,19 @@
% \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.
+% }
%
% \GetFileInfo{filehook.dtx}
%
@@ -98,82 +121,205 @@
% \vspace{1.2em}%
%
% \begin{abstract}
-% This small package provides hooks for input files. Document and package authors can use these hooks to
+% 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{Introduction}
% These package 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>}.
+% using \Macro\AtBeginDocument{<\TeX code>}.
%
-% \section{Usage}
-% This package provides several groups of hooks: for file read using \Macro{input}, for files read using \Macro{include} and for all read files (i.e.\ all files read using
-% \Macro{InputIfFileExists}, which includes package and class files and files falling into the first two groups). Since v0.3 from 2010/12/20 there are also hooks for package and class files.
-% All groups include a `AtBegin' and a `AtEnd' macro. The \Macro{include} group has 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
+%
+% 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.
%
-% The first three groups includes general and file specific hooks. The general hooks are executed for every file of this group and provide the file name as argument |#1|.
-% The file specific ones are only executed for a certain file. The package and class hocks are always specific to one file.
+% 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.
%
-% 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.
+% 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}{<file name>}}%
+% #1%
+% \hbox{\Hook{AtBeginOfFiles}}%
+% \hbox{\fbox{\emph{Content}}}%
+% \vspace{2pt}%
+% \hbox{\Hook{AtEndOfFiles}}%
+% \hbox{\Hook{AtEndOfFile}{<file name>}}%
+% }}}%
+% }}%
+% }%
+%
+% \def\DrawInputIf#1{%
+% \hbox{\vbox{%
+% \sffamily
+% \hbox{\Macro\InputIfFileExists:}%
+% \hbox{\fbox{\vbox{%
+% \hbox{\Hook{AtBeginOfEveryFile}}%
+% \hbox{\Hook{AtBeginOfFile}{<file name>}}%
+% #1%
+% \hbox{\Hook{AtBeginOfFiles}}%
+% \hbox{\fbox{\emph{Content}}}%
+% \vspace{2pt}%
+% \hbox{\Hook{AtEndOfFiles}}%
+% \hbox{\Hook{AtEndOfFile}{<file name>}}%
+% \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 (!).
+% For files read by \Macro\InputIfFileExists (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 \Macro\IfFileExists{<file name>}|{\@input\@filef@und}{}| instead.
+%
+% \DescribeMacro{\AtBeginOfFile}{<file name with extension>}{<\TeX\ code>}
+% \DescribeMacro{\AtEndOfFile}{<file name with extension>}{<\TeX\ code>}
+% Like the {\Macro{...OfIncludeFile}{<file name>}{<\TeX\ code>}} macros above, just for `all' read files. Here the \meta{file name} should include the file
+% extension!
+%
+% 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>}
-% All these macro take one argument (some \TeX{} code) which is added to the specific hook for files read using \Macro{include}.
-% The code can use the macro argument |#1|
-% which will be expanded to the include \meta{file name}, i.e.\ the hooks are macros with one argument which will be the file name.
-% As described above the `AtEnd' hook is executed before and the `After' hook is executed after the trailing \Macro{clearpage}.
-% Material which should be (still) valid in the page header or footer of the last page of such an
-% file should therefore use the `After' hook.
+% 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}{<file name>}{<\TeX\ code>}
% \DescribeMacro{\AtEndOfIncludeFile}{<file name>}{<\TeX\ code>}
% \DescribeMacro{\AfterIncludeFile}{<file name>}{<\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}. It is not allowed to use macro arguments inside the code.
-% The \meta{file name} should be identical to the name used for \Macro{include} and not include the `|.tex|' extension.
+% 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.
+%
+% 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}{<file name>}}%
+% \hbox{\Hook{AtBeginOfIncludes}}%
+% \hbox{\fbox{\DrawInputIfB{}}}%
+% \vspace{2pt}%
+% \hbox{\Hook{AtEndOfIncludes}}%
+% \hbox{\Hook{AtEndOfIncludeFile}{<file name>}}%
+% \hbox{\Macro\clearpage~~(implicit)}%
+% \hbox{\Hook{AfterIncludes}}%
+% \hbox{\Hook{AfterIncludeFile}{<file name>}}%
+% \hbox{\Hook{AtEndOfEveryFile}}%
+% }}}%
+% }}}
+%
%
% \subsection*{Input Files}
%
% \DescribeMacro{\AtBeginOfInputs}{<\TeX\ code>}
% \DescribeMacro{\AtEndOfInputs}{<\TeX\ code>}
-% Like the \Macro{...OfIncludes}\marg{code} macros above, just for file read using \Macro{input}. Again, the macro argument |#1| can be used inside the \meta{code} and
-% will be expanded to the <file name>.
+% Like the \Macro{...OfIncludes}{code} macros above, just for file read using \Macro\input.
%
% \DescribeMacro{\AtBeginOfInputFile}{<file name>}{<\TeX\ code>}
% \DescribeMacro{\AtEndOfInputFile}{<file name>}{<\TeX\ code>}
-% Like the \Macro{...OfIncludeFile}\marg{<file name>}\marg{code} macros above, just for file read using \Macro{input}. Here the \meta{file name} should include the file
-% extension! The \meta{code} must not include any macro arguments (|#1|).
+% Like the \Macro{...OfIncludeFile}{<file name>}{code} macros above, just for file read using \Macro\input. Here the \meta{file name} should include the file
+% extension!
+%
+% 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}{<file name>}}%
+% \hbox{\Hook{AtBeginOfInputs}}%
+% \hbox{\fbox{\DrawInputIfB{}}}%
+% \vspace{2pt}%
+% \hbox{\Hook{AtEndOfInputs}}%
+% \hbox{\Hook{AtEndOfInputFile}{<file name>}}%
+% \hbox{\Hook{AtEndOfEveryFile}}%
+% }}}%
+% }}}
%
-% \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 \Macro{IfFileExists}{<file name>}|{\@input\@filef@und}{}| instead.
-%
-% \DescribeMacro{\AtBeginOfFile}{<file name with extension>}{<\TeX\ code>}
-% \DescribeMacro{\AtEndOfFile}{<file name with extension>}{<\TeX\ code>}
-% Like the {\expandafter\Macro\csname...OfIncludeFile\endcsname{<file name>}{<\TeX\ code>}} macros above, just for `all' read files. Here the \meta{file name} should include the file
-% extension! The \meta{code} must not include any macro arguments (|#1|).
-%
-% 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.
%
%
% \subsection*{Package Files}
%
-% \DescribeMacro{\AtBeginOfPackageFile}{<package name>}{<\TeX\ code>}
+% \DescribeMacro{\AtBeginOfPackageFile}*{<package name>}{<\TeX\ code>}
% \DescribeMacro{\AtEndOfPackageFile}*{<package name>}{<\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{<package name>.sty}{<\TeX code>}.
@@ -182,59 +328,146 @@
% 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{<file name>})}}}}%
+% \vspace{2pt}%
+% \hbox{\Hook{AtEndOfPackage}~~(\LaTeX\ hook)}%
+% \hbox{\Hook{AtEndOfPackageFile}{<file name>}}%
+% }}}%
+% }}}
%
% \subsection*{Class Files}
%
-% \DescribeMacro{\AtBeginOfClassFile}{<class name>}{<\TeX\ code>}
+% \DescribeMacro{\AtBeginOfClassFile}*{<class name>}{<\TeX\ code>}
% \DescribeMacro{\AtEndOfClassFile}*{<class name>}{<\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\AtBeginOfClassFile simply executes \Macro\AtBeginOfFile{<class name>.cls}{<\TeX code>}.
+% The macro \Macro\AtBeginOfClassFile simply executes \Macro\AtBeginOfFile{<class name>.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\AtEndOfPackage.
+% using the \LaTeX\ macro \Macro\AtEndOfClass.
% 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{<file name>})}}}}%
+% \vspace{2pt}%
+% \hbox{\Hook{AtEndOfClass}~~(\LaTeX\ hook)}%
+% \hbox{\Hook{AtEndOfClassFile}{<file name>}}%
+% }}}%
+% }}}
%
-% \StopEventually{}
%
-% \section{Compatibility Issues with other Packages}
-% The |filehook| package might clash with other packages or classes which also redefine \Macro{InputIfFileExists}.
-% Special compatibility code is in place for the known packages listed below (in their current implementation).
-% If any other unknown definition 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.
+% \clearpage
+% \section{Compatibility Issues with Classes and other Packages}
+% 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 (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*{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.
+% \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.
%
-% \subsection*{memoir}
-% The |memoir| class redefines \Macro{InputIfFileExists} to add own hooks identical to the |At...OfFiles| hooks (there called \Macro{AtBeginFile} and \Macro{AtEndFile}).
+% \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.
-%
-% \subsection*{scrlfile}
-% The |scrlfile| package from the \emph{koma-script} bundle redefines \Macro{InputIfFileExists} to allow file name aliases and to also add hooks.
+% 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|.
%
-% \subsection*{fink}
+%
+% \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.
+% and both cannot be used successfully together as both redefine the \Macro\InputIfFileExists macro.
+%
%
-% \subsection*{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.
+% \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} (\TeX's \Macro{input}), \ldots) will be processed verbatim and typeset
-% as part of the listing. A known package suffering from this is \pkg{svn-multi} which loads |.svx| files for every |.tex| file.
-% A workaround for this issue is to temporally redefine \Macro{input} to \Macro{@input} for \Macro{lstinputlisting}: |{\let\input\@input\lstinputlisting{...}}|.
+% environment), any further code read using any input macro (\Macro\input, \Macro\@input, \Macro\@@input (\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}
+%
+% \clearpage
+% \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
@@ -248,234 +481,152 @@
\ProcessOptions\relax
% \end{macrocode}
%
-% \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.
+%
+% \subsection{Initialisation of Hooks}
+% The general hooks are initialised to call the file specific hooks.
+%
+% \begin{macro}{\filehook@include@atbegin}
% \begin{macrocode}
-\let\filehook@orig@@input@\@input@
-\let\filehook@orig@@iinput\@iinput
+\def\filehook@include@atbegin#1{%
+ \let\InputIfFileExists\filehook@@InputIfFileExists
+ \@nameuse{\filehook@include@atbegin@#1}%
+ \filehook@include@@atbegin
+}
% \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{macro}{\filehook@include@@atbegin}
+% \begin{macrocode}
+\def\filehook@include@@atbegin{}
+% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\filehook@include@atend}
% \begin{macrocode}
-\def\@input@#1{%
- \@ifnextchar\clearpage
- {\filehook@include@atbegin{#1}%
- \filehook@orig@@input@{#1}%
- \filehook@include@atend{#1}%
- \clearpage
- \filehook@include@after{#1}%
- \@gobble
- }%
- {\filehook@orig@@input@{#1}}%
+\def\filehook@include@atend#1{%
+ \filehook@include@@atend
+ \@nameuse{\filehook@include@atend@#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{macro}{\filehook@include@@atend}
% \begin{macrocode}
-\def\@iinput#1{%
- \filehook@input@atbegin{#1}%
- \filehook@orig@@iinput{#1}%
- \filehook@input@atend{#1}%
+\def\filehook@include@@atend{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook@include@after}
+% \begin{macrocode}
+\def\filehook@include@after#1{%
+ \filehook@include@@after
+ \@nameuse{\filehook@include@after@#1}%
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\InputIfFileExists}
-% This macro is redefined for the general file hooks.
-% The original definition is checked but is not saved away and called by the new definition, because
-% of the existing complexity. The hooks must be places around the actual input macro (\Macro{@@input}).
+% \begin{macro}{\filehook@include@@after}
+% \begin{macrocode}
+\def\filehook@include@@after{}
+% \end{macrocode}
+% \end{macro}
%
-% Alternatives definitions of \cs{InputIfFileExists} are defined here for comparison.
-% This is done inside a group to keep them only temporary.
+% \begin{macro}{\filehook@input@atbegin}
% \begin{macrocode}
-\begingroup
-
-\long\def\latex@InputIfFileExists#1#2{%
- \IfFileExists{#1}%
- {#2\@addtofilelist{#1}%
- \@@input\@filef@und
- }%
-}
-\long\def\memoir@InputIfFileExists#1#2{%
- \IfFileExists{#1}%
- {#2\@addtofilelist{#1}\m@matbeginf{#1}%
- \@@input \@filef@und
- \m@matendf{#1}%
- \killm@matf{#1}}%
-}
-\long\def\scrlfile@InputIfFileExists#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}{%
- \scr@load@hook{before}{#1}%
- #2\@addtofilelist{#1}%
- \@@input \@filef@und
- \scr@load@hook{after}{#1}%
- }}%
+\def\filehook@input@atbegin#1{%
+ \let\InputIfFileExists\filehook@@InputIfFileExists
+ \@nameuse{\filehook@input@atbegin@\filehook@ensureext{#1}}%
+ \filehook@input@@atbegin
}
% \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 should |scrlfile| ever change its \Macro{InputIfFileExists} macro this code will not be executed and
-% the general clause below will kick in.
+% \begin{macro}{\filehook@input@@atbegin}
% \begin{macrocode}
-\ifx\InputIfFileExists\scrlfile@InputIfFileExists
-
-\long\gdef\InputIfFileExists#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}{%
- \scr@load@hook{before}{#1}%
- #2\@addtofilelist{#1}%
- \filehook@atbegin{#1}%
- \@@input \@filef@und
- \filehook@atend{#1}%
- \scr@load@hook{after}{#1}%
- }}%
+\def\filehook@input@@atbegin{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook@input@atend}
+% \begin{macrocode}
+\def\filehook@input@atend#1{%
+ \filehook@input@@atend
+ \@nameuse{\filehook@input@atend@\filehook@ensureext{#1}}%
}
-
-\PackageInfo{filehook}{Package 'scrlfile' detected and compensated for.}
-
% \end{macrocode}
-% Otherwise the normal |filehook| definition will be set. 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.
+% \end{macro}
+%
+% \begin{macro}{\filehook@input@@atend}
% \begin{macrocode}
-\else
-
-\ifx\InputIfFileExists\memoir@InputIfFileExists
- \AtEndOfPackage{%
- \AtBeginOfFiles{\m@matbeginf{#1}}%
- \AtEndOfFiles{\m@matendf{#1}\killm@matf{#1}}%
- }
- \PackageInfo{filehook}{Detected 'memoir' class: the memoir hooks will be moved to the 'At...OfFiles' hooks.}
-\else
+\def\filehook@input@@atend{}
% \end{macrocode}
+% \end{macro}
%
-% Finally, if no specific alternate definition is detected the original \LaTeX\ definition is checked for and a
-% warning is given if any other unknown definition is detected. In this case it will be simply overwritten.
+% \begin{macro}{\filehook@atbegin}
% \begin{macrocode}
-\ifx\InputIfFileExists\latex@InputIfFileExists
-\else
- \@ifpackageloaded{scrlfile}{%
- \PackageWarning{filehook}{Detected 'scrlfile' package with unknown definition of \string\InputIfFileExists}%
- }{}%
-
- \@ifclassloaded{memoir}{%
- \PackageWarning{filehook}{Detected 'memoir' class with unknown definition of \string\InputIfFileExists}%
- }{}%
-
- \iffilehook@force
- \PackageWarning{filehook}
- {Changed definition of \string\InputIfFileExists\space detected!^^J%
- The 'force' option is in effect and therefore this macros is redefined.
- This might break other packages or code}%
- \else
- \PackageError{filehook}
- {Changed definition of \string\InputIfFileExists\space detected!^^J%
- Use the 'force' option to force the redefinition of this macro.^^J%
- This might break other packages or code}%
- \fi
-\fi
-\fi
-
-\long\gdef\InputIfFileExists#1#2{%
- \IfFileExists{#1}%
- {#2\@addtofilelist{#1}%
- \filehook@atbegin{#1}%
- \@@input\@filef@und
- \filehook@atend{#1}%
- }%
+\def\filehook@atbegin#1{%
+ \@nameuse{\filehook@atbegin@\filehook@ensureext{#1}}%
+ \filehook@@atbegin
}
-
-\fi
-
-\endgroup
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\filehook@@atbegin}
+% \begin{macrocode}
+\def\filehook@@atbegin{}
+% \end{macrocode}
+% \end{macro}
%
-% \subsection{Initialisation of Hooks}
-% The general hooks are initialised to call the file specific hooks.
-%
-% \begin{macro}{\filehook@include@atbegin}
-% \begin{macro}{\filehook@include@atend}
-% \begin{macro}{\filehook@include@after}
+% \begin{macro}{\filehook@atend}
% \begin{macrocode}
-\def\filehook@include@atbegin#1{%
- \@nameuse{\filehook@include@atbegin@#1}%
-}
-\def\filehook@include@atend#1{%
- \@nameuse{\filehook@include@atend@#1}%
-}
-\def\filehook@include@after#1{%
- \@nameuse{\filehook@include@after@#1}%
+\def\filehook@atend#1{%
+ \filehook@@atend
+ \@nameuse{\filehook@atend@\filehook@ensureext{#1}}%
}
% \end{macrocode}
% \end{macro}
-% \end{macro}
+%
+% \begin{macro}{\filehook@@atend}
+% \begin{macrocode}
+\def\filehook@@atend{}
+% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\filehook@input@atbegin}
-% \begin{macro}{\filehook@input@atend}
+% \begin{macro}{\filehook@every@atbegin}
% \begin{macrocode}
-\def\filehook@input@atbegin#1{%
- \@nameuse{\filehook@input@atbegin@#1}%
-}
-\def\filehook@input@atend#1{%
- \@nameuse{\filehook@input@atend@#1}%
+\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@atbegin}
-% \begin{macro}{\filehook@atend}
+% \begin{macro}{\filehook@every@atend}
% \begin{macrocode}
-\def\filehook@atbegin#1{%
- \@nameuse{\filehook@atbegin@#1}%
-}
-\def\filehook@atend#1{%
- \@nameuse{\filehook@atend@#1}%
+\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
@@ -501,7 +652,7 @@
% \end{macro}
%
% \begin{macro}{\filehook@appendwarg}
-% Appends code with one macro argument. The \Macro{@tempa} intermediate step is required because of the
+% 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{%
@@ -514,9 +665,8 @@
% \end{macrocode}
% \end{macro}
%
-%
% \begin{macro}{\filehook@prefix}
-% Prefixes code without an argument to a hook.
+% Prefixes code to a hook.
% \begin{macrocode}
\long\def\filehook@prefix#1#2{%
\begingroup
@@ -542,6 +692,20 @@
% \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.
@@ -549,7 +713,7 @@
% \begin{macro}{\AtBeginOfIncludes}
% \begin{macrocode}
\newcommand*\AtBeginOfIncludes{%
- \filehook@appendwarg\filehook@include@atbegin
+ \filehook@append\filehook@include@@atbegin
}
% \end{macrocode}
% \end{macro}
@@ -557,15 +721,15 @@
% \begin{macro}{\AtEndOfIncludes}
% \begin{macrocode}
\newcommand*\AtEndOfIncludes{%
- \filehook@prefixwarg\filehook@include@atend
+ \filehook@prefix\filehook@include@@atend
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\AfterOfIncludes}
+% \begin{macro}{\AfterIncludes}
% \begin{macrocode}
\newcommand*\AfterIncludes{%
- \filehook@prefixwarg\filehook@include@after
+ \filehook@prefix\filehook@include@@after
}
% \end{macrocode}
% \end{macro}
@@ -573,9 +737,7 @@
% \begin{macro}{\AtBeginOfIncludeFile}
% \begin{macrocode}
\newcommand*\AtBeginOfIncludeFile[1]{%
- \@ifundefined{\filehook@include@atbegin@#1.tex}%
- {\long\global\@namedef{\filehook@include@atbegin@#1.tex}}%
- {\expandafter\filehook@append\csname\filehook@include@atbegin@#1.tex\endcsname}%
+ \filehook@addtohook\filehook@append\filehook@include@atbegin@{\filehook@ensuretex{#1}}%
}
% \end{macrocode}
% \end{macro}
@@ -583,19 +745,15 @@
% \begin{macro}{\AtEndOfIncludeFile}
% \begin{macrocode}
\newcommand*\AtEndOfIncludeFile[1]{%
- \@ifundefined{\filehook@include@atend@#1.tex}%
- {\long\global\@namedef{\filehook@include@atend@#1.tex}}%
- {\expandafter\filehook@prefix\csname\filehook@include@atend@#1.tex\endcsname}%
+ \filehook@addtohook\filehook@prefix\filehook@include@atend@{\filehook@ensuretex{#1}}%
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\AfterOfIncludeFile}
+% \begin{macro}{\AfterIncludeFile}
% \begin{macrocode}
-\newcommand*\AfterOfIncludeFile[1]{%
- \@ifundefined{\filehook@include@after@#1.tex}%
- {\long\global\@namedef{\filehook@include@after@#1.tex}}%
- {\expandafter\filehook@prefix\csname\filehook@include@after@#1.tex\endcsname}%
+\newcommand*\AfterIncludeFile[1]{%
+ \filehook@addtohook\filehook@prefix\filehook@include@after@{\filehook@ensuretex{#1}}%
}
% \end{macrocode}
% \end{macro}
@@ -603,7 +761,7 @@
% \begin{macro}{\AtBeginOfInputs}
% \begin{macrocode}
\newcommand*\AtBeginOfInputs{%
- \filehook@appendwarg\filehook@input@atbegin
+ \filehook@append\filehook@input@@atbegin
}
% \end{macrocode}
% \end{macro}
@@ -611,27 +769,23 @@
% \begin{macro}{\AtEndOfInputs}
% \begin{macrocode}
\newcommand*\AtEndOfInputs{%
- \filehook@prefixwarg\filehook@input@atend
+ \filehook@prefix\filehook@input@@atend
}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\AtBeginOfInputFile}
% \begin{macrocode}
-\newcommand*\AtBeginOfInputFile[1]{%
- \@ifundefined{\filehook@input@atbegin@#1}%
- {\long\global\@namedef{\filehook@input@atbegin@#1}}%
- {\expandafter\filehook@append\csname\filehook@input@atbegin@#1\endcsname}%
+\newcommand*\AtBeginOfInputFile{%
+ \filehook@addtohook\filehook@append\filehook@input@atbegin@
}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\AtEndOfInputFile}
% \begin{macrocode}
-\newcommand*\AtEndOfInputFile[1]{%
- \@ifundefined{\filehook@input@atend@#1}%
- {\long\global\@namedef{\filehook@input@atend@#1}}%
- {\expandafter\filehook@prefix\csname\filehook@input@atend@#1\endcsname}%
+\newcommand*\AtEndOfInputFile{%
+ \filehook@addtohook\filehook@prefix\filehook@input@atend@
}
% \end{macrocode}
% \end{macro}
@@ -639,7 +793,7 @@
% \begin{macro}{\AtBeginOfFiles}
% \begin{macrocode}
\newcommand*\AtBeginOfFiles{%
- \filehook@appendwarg\filehook@atbegin
+ \filehook@append\filehook@@atbegin
}
% \end{macrocode}
% \end{macro}
@@ -647,121 +801,710 @@
% \begin{macro}{\AtEndOfFiles}
% \begin{macrocode}
\newcommand*\AtEndOfFiles{%
- \filehook@prefixwarg\filehook@atend
+ \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[1]{%
- \@ifundefined{\filehook@atbegin@#1}%
- {\long\global\@namedef{\filehook@atbegin@#1}}%
- {\expandafter\filehook@append\csname\filehook@atbegin@#1\endcsname}%
+\newcommand*\AtBeginOfFile{%
+ \filehook@addtohook\filehook@append\filehook@atbegin@
}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\AtEndOfFile}
% \begin{macrocode}
-\newcommand*\AtEndOfFile[1]{%
- \@ifundefined{\filehook@atend@#1}%
- {\long\global\@namedef{\filehook@atend@#1}}%
- {\expandafter\filehook@prefix\csname\filehook@atend@#1\endcsname}%
+\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}{\AtBeginOfPackageFile}[1]{package name}
-% Simply add the package extension and calls the general macro.
+% \begin{macro}{\AtBeginOfXFile@normal}[2]{extension}{name}
% \begin{macrocode}
-\newcommand*\AtBeginOfPackageFile[1]{%
- \AtBeginOfFile{#1.\@pkgextension}%
+\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*\AtEndOfPackageFile@star\AtEndOfPackageFile@normal
+ \@ifnextchar*
+ {\AtEndOfXFile@star\@pkgextension}%
+ {\AtEndOfXFile@normal\@pkgextension}%
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\AtEndOfPackageFile@star}[2]{package name}{code}
-% If the package is already loaded the code is executed right away.
+%
+% \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\AtEndOfPackageFile@star*#1#2{%
- \@ifpackageloaded{#1}%
- {#2}%
- {\AtEndOfPackageFile@normal{#1}{#2}}%
+\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
+% differenciation between classes and packages is needed here.
+% \begin{macrocode}
+\def\AtEndOfXFile@normal#1#2#3{%
+ \AtEndOfFile{#2.#1}{\AtEndOfPackage{#3}}%
+}
+% \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}{\AtEndOfPackageFile@normal}[2]{package name}{code}
-% Installs the code at the end of the package file inside a \Macro\AtEndOfPackage
-% command to ensure it is executed after any \Macro\AtEndOfPackage code installed
-% by the package itself.
+% \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}
%
-% Note if the package was already loaded or is not loaded at all the installed
-% code is never executed.
+% \begin{macro}{\filehook@ensureext}
+% This macro ensures the existence of a file name extension. If non is given `|.tex|' is
+% added.
% \begin{macrocode}
-\def\AtEndOfPackageFile@normal#1#2{%
- \AtEndOfFile{#1.\@pkgextension}{\AtEndOfPackage{#2}}%
+\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}{\AtBeginOfClassFile}[1]{class name}
-% Simply add the class extension and calls the general macro.
+%
+% \begin{macro}{\filehook@ensuretex}
+% Ensures a `|.tex|' extension, i.e. adds it if missing, even if there is a different one.
% \begin{macrocode}
-\newcommand*\AtBeginOfClassFile[1]{%
- \AtBeginOfFile{#1.\@clsextension}%
+\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}{\AtEndOfClassFile}[2]{class name}{code}
+%
+% 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}
-\newcommand*\AtEndOfClassFile{%
- \@ifnextchar*\AtEndOfClassFile@star\AtEndOfClassFile@normal
+\long\def\latex@InputIfFileExists#1#2{%
+ \IfFileExists{#1}%
+ {#2\@addtofilelist{#1}%
+ \@@input\@filef@und
+ }%
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\AtEndOfClassFile@star}[2]{class name}{code}
-% If the class is already loaded the code is executed right away.
-% Otherwise it is installed normally.
+%
+% \begin{macro}{\filehook@default@InputIfFileExists}
% \begin{macrocode}
-\def\AtEndOfClassFile@star*#1#2{%
- \@ifclassloaded{#1}%
- {#2}%
- {\AtEndOfClassFile@normal{#1}{#2}}%
+\long\gdef\filehook@default@InputIfFileExists#1#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}
% \end{macro}
%
-% \begin{macro}{\AtEndOfClassFile@normal}[2]{class name}{code}
-% Installs the code at the end of the class file inside a \Macro\AtEndOfClass
-% command to ensure it is executed after any \Macro\AtEndOfClass code installed
-% by the class itself.
+% \begin{macro}{\filehook@@default@InputIfFileExists}
+% \begin{macrocode}
+\long\gdef\filehook@@default@InputIfFileExists#1#2{%
+ \let\InputIfFileExists\filehook@InputIfFileExists
+ \IfFileExists{#1}%
+ {\expandafter\filehook@swap
+ \expandafter{\@filef@und}%
+ {#2\@addtofilelist{#1}%
+ \filehook@atbegin{#1}%
+ \@@input}%
+ \filehook@atend{#1}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
%
-% Note if the class was already loaded or is not loaded at all the installed
-% code is never executed.
+% \begin{macro}{\scrlfile@InputIfFileExists}
% \begin{macrocode}
-\def\AtEndOfClassFile@normal#1#2{%
- \AtEndOfFile{#1.\@clsextension}{\AtEndOfClass{#2}}%
+\long\def\scrlfile@InputIfFileExists#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}{%
+ \scr@load@hook{before}{#1}%
+ #2\@addtofilelist{#1}%
+ \@@input \@filef@und
+ \scr@load@hook{after}{#1}%
+ }}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook@scrlfile@InputIfFileExists}
+% \begin{macrocode}
+\long\def\filehook@scrlfile@InputIfFileExists#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\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}%
+ }}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook@@scrlfile@InputIfFileExists}
+% \begin{macrocode}
+\long\def\filehook@@scrlfile@InputIfFileExists#1#2{%
+ \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}%
+ }}%
}
% \end{macrocode}
% \end{macro}
%
+% \iffalse
+%</package>
+%<*memoir>
+% \fi
+%
+% \begin{macrocode}
+\ProvidesPackage{filehook-memoir}[2011/01/03 v0.1 filehook patch for memoir class]
+\RequirePackage{filehook}
+\begingroup
+% \end{macrocode}
+%
+% \begin{macro}{\memoir@InputIfFileExists}
+% \begin{macrocode}
+\long\def\memoir@InputIfFileExists#1#2{%
+ \IfFileExists{#1}%
+ {#2\@addtofilelist{#1}\m@matbeginf{#1}%
+ \@@input \@filef@und
+ \m@matendf{#1}%
+ \killm@matf{#1}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\ifcase
+ \ifx\InputIfFileExists\latex@InputIfFileExists 0\else
+ \ifx\InputIfFileExists\memoir@InputIfFileExists 0\else
+ 1%
+ \fi\fi
+\relax
+ \global\let\filehook@InputIfFileExists\filehook@default@InputIfFileExists
+ \global\let\filehook@@InputIfFileExists\filehook@@default@InputIfFileExists
+ \global\let\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
+ \global\let\filehook@InputIfFileExists\filehook@default@InputIfFileExists
+ \global\let\filehook@@InputIfFileExists\filehook@@default@InputIfFileExists
+ \global\let\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
+%</memoir>
+%<*listings>
+% \fi
+% \begin{macrocode}
+\ProvidesPackage{filehook-listings}[2011/01/02 v0.1 Patch for listings to avoid hooks for verbatim input files]
+\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
+%</listings>
+%<*scrlfile>
+% \fi
+%
+% \begin{macrocode}
+\ProvidesPackage{filehook-scrlfile}[2011/01/03 v0.1 filehook patch for scrlfile package]
+\RequirePackage{filehook}
+\begingroup
+% \end{macrocode}
+%
+% \begin{macro}{\scrlfile@InputIfFileExists}
+% \begin{macrocode}
+\long\def\scrlfile@InputIfFileExists#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}{%
+ \scr@load@hook{before}{#1}%
+ #2\@addtofilelist{#1}%
+ \@@input \@filef@und
+ \scr@load@hook{after}{#1}%
+ }}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook@scrlfile@InputIfFileExists}
+% \begin{macrocode}
+\long\def\filehook@scrlfile@InputIfFileExists#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\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}%
+ }}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook@@scrlfile@InputIfFileExists}
+% \begin{macrocode}
+\long\def\filehook@@scrlfile@InputIfFileExists#1#2{%
+ \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}%
+ }}%
+}
+% \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}
+\ifcase
+ \ifx\InputIfFileExists\latex@InputIfFileExists 0\else
+ \ifx\InputIfFileExists\scrlfile@InputIfFileExists 0\else
+ 1%
+ \fi\fi
+\relax
+ \global\let\filehook@InputIfFileExists\filehook@scrlfile@InputIfFileExists
+ \global\let\filehook@@InputIfFileExists\filehook@@scrlfile@InputIfFileExists
+ \global\let\InputIfFileExists\filehook@InputIfFileExists
+ \PackageInfo{filehook}{Package 'scrlfile' detected and compensated for}%
+\else
+ \iffilehook@force
+ \global\let\filehook@InputIfFileExists\filehook@default@InputIfFileExists
+ \global\let\filehook@@InputIfFileExists\filehook@@default@InputIfFileExists
+ \global\let\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
+%</scrlfile>
+%<*fink>
+% \fi
+%
+% \begin{macrocode}
+\ProvidesPackage{filehook-fink}[2011/01/03 v0.1 filehook compatibility code for fink package]
+\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
+%</fink>
+%<*package>
+% \fi
+%
+%
+% \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@InputIfFileExists
+}%
+\AtEndOfPackageFile*{scrlfile}{%
+ \RequirePackage{filehook-scrlfile}%
+}%
+% \end{macrocode}
+% Fink:
+% \begin{macrocode}
+\AtBeginOfPackageFile*{fink}{%
+ \RequirePackage{kvoptions}%
+ \begingroup
+ \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}{%
+ \let\filehook@@InputIfFileExists\latex@InputIfFileExists
+ \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}
+\ifcase
+ \ifx\InputIfFileExists\filehook@InputIfFileExists 0\else
+ \ifx\InputIfFileExists\latex@InputIfFileExists 1\else
+ \iffilehook@force 1\else
+ 9%
+ \fi\fi\fi
+\relax% 0
+\or% 1
+ \let\filehook@InputIfFileExists\filehook@default@InputIfFileExists
+ \let\filehook@@InputIfFileExists\filehook@@default@InputIfFileExists
+ \let\InputIfFileExists\filehook@InputIfFileExists
+ \iffilehook@force
+ \PackageWarning{filehook}{Detected unknown definition of \string\InputIfFileExists.^^J%
+ The 'force' option of 'filehook' is in effect. Macro is overwritten with default!}%
+ \fi
+\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{%
+ \ifx\InputIfFileExists\filehook@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}
%
% \iffalse
%</package>
diff --git a/Master/texmf-dist/source/latex/filehook/filehook.ins b/Master/texmf-dist/source/latex/filehook/filehook.ins
index 8f5a7b3a3ba..cbe6aa4c843 100644
--- a/Master/texmf-dist/source/latex/filehook/filehook.ins
+++ b/Master/texmf-dist/source/latex/filehook/filehook.ins
@@ -3,5 +3,11 @@
%
\input docstrip.tex
\keepsilent
-\generate{\nopreamble\file{filehook.sty}{\from{filehook.dtx}{package}}}
+\generate{%
+ \file{filehook.sty}{\nopreamble\from{filehook.dtx}{package}}%
+ \file{filehook-scrlfile.sty}{\nopreamble\from{filehook.dtx}{scrlfile}}%
+ \file{filehook-memoir.sty}{\nopreamble\from{filehook.dtx}{memoir}}%
+ \file{filehook-listings.sty}{\nopreamble\from{filehook.dtx}{listings}}%
+ \file{filehook-fink.sty}{\nopreamble\from{filehook.dtx}{fink}}%
+}
\endbatchfile