diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/currfile/currfile.dtx |
Initial commit
Diffstat (limited to 'macros/latex/contrib/currfile/currfile.dtx')
-rw-r--r-- | macros/latex/contrib/currfile/currfile.dtx | 1231 |
1 files changed, 1231 insertions, 0 deletions
diff --git a/macros/latex/contrib/currfile/currfile.dtx b/macros/latex/contrib/currfile/currfile.dtx new file mode 100644 index 0000000000..de45aa8853 --- /dev/null +++ b/macros/latex/contrib/currfile/currfile.dtx @@ -0,0 +1,1231 @@ +% \iffalse meta-comment +%<=*COPYRIGHT> +%% +%% Copyright (c) 2010-2011 by Martin Scharrer <martin@scharrer.me> +%% --------------------------------------------------------------- +%% +%% This work may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3c +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% +%% http://www.latex-project.org/lppl.txt +%% +%% and version 1.3c or later is part of all distributions of LaTeX +%% version 2008/05/04 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 currfile.dtx, currfile.ins +%% and currfile.sty. +%% +%<=/COPYRIGHT> +% \fi +% +% \iffalse +%<*driver> +\NeedsTeXFormat{LaTeX2e}[1999/12/01] +\ProvidesFile{currfile.dtx}[% +%<=*DATE> + 2015/04/23 +%<=/DATE> +%<=*VERSION> + v0.7c +%<=/VERSION> + DTX file for currfile package] + +\documentclass{ydoc}[2011/03/19] +\usepackage{currfile}[2011/09/18] +\usepackage{ifpdf} +\usepackage{booktabs} +\usepackage{hyperref} +\usepackage{flafter} +\EnableCrossrefs +\CodelineIndex +\RecordChanges +\let\IncludeImplementation\relax +%\let\IncludeImplementation\empty %^^A Enable implementation +\ifx\IncludeImplementation\relax + \OnlyDescription +\fi +\let\cnt\env +\begin{document} + \DocInput{currfile.dtx} + \PrintChanges + \PrintIndex +\end{document} +%</driver> +% \fi +% +% \CheckSum{1114} +% +% \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/04/10}{Now work for all files, not only for \cs{input} and \cs{include} files. +% Added package option 'fink' to define the same macros as the 'fink' package. +% } +% \changes{v0.3}{2011/01/03}{Update to use new version of filehook.} +% \changes{v0.4}{2011/01/09}{Added if-macros and sanitized currfile macros.} +% \changes{v0.5}{2011/09/18}{Added support for \cs{input@path} and files with multiple dots.} +% \changes{v0.6}{2012/05/06}{Added support for absolute file paths.} +% \changes{v0.7}{2012/05/15}{Added support for parent file paths.} +% \changes{v0.7a}{2012/10/28}{Fixed issue with \pkg{enumitem} package which redefines \cs{value}.} +% \changes{v0.7b}{2013/02/01}{Support for \cs{\subinput*} etc.\ from the \pkg{import} package which requires a different path search order.} +% \changes{v0.7c}{2015/04/23}{Removed stack underflow warning if loaded by other package. Set default file name in this case to main file name.} +% +% \GetFileInfo{currfile.dtx} +% +% \DoNotIndex{\newcommand,\newenvironment,\fi,\relax,\def,\gdef,\xdef} +% \DoNotIndex{\RequirePackage,\space,\PackageError,\PackageWarning,\let} +% \DoNotIndex{\ifx,\global,\long,\dindent,\else,\empty,\expandafter} +% \DoNotIndex{\csname,\endcsname,\DeclareBoolOption,\DeclareStringOption} +% \DoNotIndex{\SetupKeyvalOptions,\begingroup,\endgroup,\@gobble,\edef} +% \DoNotIndex{\message,\jobname,\@namedef} +% +% \author{Martin Scharrer} +% \email{martin@scharrer-online.de} +% \repository{https://bitbucket.org/martin_scharrer/currfile/} +% \maketitle +% +% \begin{abstract} +% This small package provides the file name and path information of the current input file as \LaTeX{} macros. +% It properly supports file names with multiple dots and the \cs{input@path} feature used by some packages like \pkg{import}. +% Optionally also the absolute location of current input file can be provided if a special compiler option is enabled. +% \end{abstract} +% +% \tableofcontents +% +% \section{Important notice} +% This package relies heavily on the package \pkg{filehook} by the same author and installs at-begin and at-end hooks for all files. +% The provided macros for the file names \emph{will only work for files loaded \emph{after} the package}. +% This means only for files which are getting opened afterwards and where not yet opened, as the at-begin hook is required to run. +% The macros will therefore not work correctly in a package which loaded \pkg{currfile}, but for all further loaded packages. +% +% The options \opt{abspath} and \opt{realmainfile} may be used to improve the behavior in such cases. +% +% However, it is simply recommended to load \pkg{currfile} as early as possible. It can even be loaded before the class using +% \Macro\RequirePackage{currfile}. +% +% \section{Usage} +% +% \DescribeMacro{\currfiledir} +% \DescribeMacro{\currfilebase} +% \DescribeMacro{\currfileext} +% \DescribeMacro{\currfilename} +% \DescribeMacro{\currfilepath} +% The directory, base (name without extension), extension (without dot), name (=base+`|.|'+ext) and path (=dir+name) of the current file are provided by these macros. +% This means that the macros returns the file information of the file they are used in. All macros are fully expanded, i.e.\ only hold +% text and not further macros. They are also ``sanitized'' to ensure that all characters, especially special ones like `|_|', are taken verbatim. +% However this special characters might not be displayed correctly in all fonts. A good font is text-type (\Macro\ttfamily, \Macro\texttt{\ldots}), +% but other fonts can be used using the \pkg{url} package, e.g.: |\urlstyle{rm}\expandafter\nolinkurl\expandafter{\currfilename}|. +% Note that the directory separator is always `|/|' even under MS Windows. +% +% Special care is taken to keep the file information of \Macro\included files till the final \Macro\clearpage command, so that page header and footer of the last page +% will hold the correct data. +% +% Since v0.2 all files are are taken into account, i.e.\ files read using \Macro\input, \Macro\include, \Macro\InputIfFileExists, \Macro\usepackage, \Macro\RequirePackage and even +% \Macro\LoadClass and similar macros. Before v0.2 only \Macro\input or \Macro\include and the main file were taken into account. +% +% This package uses the \pkg{filehook} package written by the same author. See there for possible incompatibilities with classes or other packages. +% +% If required more detailed information can be found in the implementation section \ifx\IncludeImplementation\relax(compile this manual with \Macro\AlsoImplementation)\else +% \unskip~\ref{sec:impl}\fi. +% +% \begingroup +% \let\DescribeCounter\DescribeKey +% \let\keydescstyle\macrodescstyle +% \DescribeCounter{currfiledepth} +% This\marginpar{\raggedright New in v0.7 from 2012/05/15} \LaTeX\ counter provides the nesting depth of the current input file. +% For the main file name it has a value of 0. +% Inside a sub-file of the main file it has a value of 1, while in a sub-file to that file it has a value of 2, etc. +% Like all \LaTeX\ counter it can be typeset using \Macro\arabic{currfiledepth} and its numeric value can be accessed +% using \Macro\value{currfiledepth}. +% \endgroup +% +% \DescribeMacro{\ifcurrfiledir}{<text>}{<true>}{<false>} +% \DescribeMacro{\ifcurrfilebase}{<text>}{<true>}{<false>} +% \DescribeMacro{\ifcurrfileext}{<text>}{<true>}{<false>} +% \DescribeMacro{\ifcurrfilename}{<text>}{<true>}{<false>} +% \DescribeMacro{\ifcurrfilepath}{<text>}{<true>}{<false>} +% This\marginpar{\raggedright New in v0.4 from 2011/01/09} if-macros allow the comparison of \meta{text} with the current file directory, base, extension, name and path, respectively. +% The \meta{text} is fully expanded and sanitized for the comparison. Example: |\ifcurrfileext{cfg}{I'm in a config file}{No config file!}| +% +% \DescribeMacro{\ifcurrfile}{<currfile macro or text>}{<text>}{<true>}{<false>} +% Compares the given \meta{currfile macro or text} with \meta{text}. Both are taken as file name parts and are fully expanded and sanitized before the comparison. +% This general macro is a little slower then the specialised macros above but might be useful to compare different file names/paths where non of the two is the current file. +% Note that the all comparisons are done insensitive to the catcodes of the texts, which is what users want. Different comparision macros (|\ifx|, \pkg{ifthenelse}) might not do this. +% +% \subsection{Package Options} +% The package provides the following options: +% +% The string options \opt{mainext} and \opt{maindir} can be used to provide the extension (without the dot) and directory of the main file. +% This is required if the above macros should be used for the main file itself and if this does has a file extension other than `|.tex|' (e.g.\ a |.dtx| file) +% or is not located in the current directory. The \opt{mainext} is by default `|tex|' and the \opt{maindir} is the empty +% string. See also the related \pkg{realmainfile} option. +% +% To provide support for the macros defined by the \pkg{fink} package (see section~\ref{sec:fink}) a boolean \opt{fink} option exists. +% If the \pkg{fink} package is loaded before \pkg{currfile} this option is automatically enabled to provide +% compatibility. The \opt{mainext} and \opt{maindir} options are then automatically set to the values of the identical +% options of \pkg{fink}. Note that \pkg{fink} is now officially declared deprecated by its author in favour of +% \pkg{currfile}. +% +% Using the boolean \opt{abspath} option\marginpar{\raggedright New in v0.6 from 2012/05/06} +% the support for absolute directories and paths is enabled. This loads the +% sub-package \pkg{currfile-abspath}. +% This requires the compiler option `|-recorder|' to be used. +% See \autoref{sec:abspath} for more details. +% This option will also enabled the related option \opt{realmainfile} if it isn't explicitly used. +% +% If the boolean \opt{realmainfile} option\marginpar{\raggedright New in v0.6 from 2012/05/06} +% is enabled the real main file path is determined using the sub-package \pkg{currfile-abspath}. +% This option is very useful if the job-name is set to something else then the main file base name, e.g.\ using the +% `|-jobname|' compiler option. Note that this option requires the correct file extension being set using \opt{mainext} +% (without the dot). If the main file has the default extension `|.tex|' then no extra efford is required. For `|.dtx|' files +% |mainext=dtx| must also be used, otherwise the correct file name can't be determined. +% This option requires the compiler option `|-recorder|' to be used in order to work correctly. +% See \autoref{sec:abspath} for more details. +% +% Using the boolean \opt{parent} option\marginpar{\raggedright New in v0.7 from 2012/05/15} +% additional macros are set for the parent file of the current file. +% See \autoref{sec:parent} for more details. +% +% \section{Absolute paths}\label{sec:abspath} +% If\marginpar{\raggedright New in v0.6 from 2012/05/06} +% required also the absolute path and directory of the current input file can be provided. +% This feature is implemented by the sub-package \pkg{currfile-abspath} which is automatically loaded by the +% \opt{abspath} option. +% The absolute path information are read from the `|\jobname.fls|' file produced by the `|-recorder|' compiler option +% (i.e.\ compile with `|pdflatex -recorder file.tex|'). +% Without this compiler option a warning is produced and the related macros stay empty. +% Note that TeX Live under Linux and Windows is able to read the currently produced `|.fls|' file while with MiKTeX +% the file of the last run is still active. The means that the information is not available with MiKTeX in the very +% first compiler run and every time the `|.fls|' file is deleted. Also, changes in the file structure are taking +% two compiler runs in order to be noticed. With TeX Live the `|.fls|' file and its information is always current. +% +% +% \subsection{Additional \pkg{currfile} macros for absolute dir and path} +% Using the \opt{abspath} package option of \pkg{currfile} the following macros with absolute directories and paths are enabled. +% +% \DescribeMacro{\currfileabsdir} +% \DescribeMacro{\currfileabspath} +% Hold the absolute directory and path (directory plus filename) of the current input file, respectively. +% Both macros will always be empty if the `|.fls|' file is not available. +% +% \DescribeMacro{\ifcurrfileabsdir}{<text>}{<true>}{<false>} +% \DescribeMacro{\ifcurrfileabspath}{<text>}{<true>}{<false>} +% These if-macros allow the comparison of \meta{text} with the current absolute file directory and path, respectively. +% The \meta{text} is fully expanded and sanitized for the comparison. +% +% \subsection{Stand-alone usage of \pkg{currfile-abspath}} +% The sub-package \pkg{currfile-abspath} can also be used on its own and provides the following lower-level macros: +% +% \DescribeMacro\getpwd +% \DescribeMacro\thepwd +% The parent working directory (PWD) is read by \Macro\getpwd from the `|.fls|' file and stored in \Macro\thepwd. +% All characters of the directory will have catcode 12 (other) except spaces which still have catcode 10 (space). +% If the PWD could not be determined, because there was not `|.fls|' file, then `\Macro\thepwd` will be empty. +% Note that \Macro\getmainfile and \Macro\getabspath both also set \Macro\thepwd while reading the `|.fls|' file. +% +% \DescribeMacro\getmainfile +% \DescribeMacro\themainfile +% With \Macro\getmainfile the name of the main file is read from the `|.fls|' file and stored in \Macro\themainfile. +% All characters of the file name will have catcode 12 (other) except spaces which still have catcode 10 (space). +% If the main file name could not be determined, because there was not `|.fls|' file, then `\Macro\themainfile` will be empty. +% +% Here it is assumed that the first read file with the `|.tex|' extension is the main file. There is currently no user interface for this +% sub-package to change this extension (to e.g.\ `|.dtx|'). However, this can be done using the \opt{mainext} option +% of the main package \pkg{currfile}. +% +% \DescribeMacro\getabspath{<file name>} +% \DescribeMacro\getabspath{<dir/file name>} +% \DescribeMacro\theabspath +% \DescribeMacro\theabsdir +% With \Macro\getabspath{<file name>} the absolute path of the given file is read from the `|.fls|' file and stored in \Macro\theabspath. +% The directory component (path without file name) is stored in \Macro\theabsdir. +% The directory always ends in a `|/|' (even under MS Windows), so that a file name can be appended directly. +% All characters of both macros will have catcode 12 (other) except spaces which still have catcode 10 (space). +% Note that \meta{file name} must include the full extension but can include a directory component (e.g.\ `|subdir/file.tex|'). +% If a directory component is given it will not be part of \Macro\theabsdir. +% For example \Macro\getabspath{'subdir/file.tex'} will return \Macro\theabspath as `|/absolute/path/subdir/file.tex|' +% and \Macro\theabsdir as `|/absolute/path/|'. This differs from \Macro\currfileabsdir which will always includes all directory +% elements, which is done by appending \Macro\currfiledir after \Macro\theabsdir. +% +% The given file must be directly accessible by \TeX, i.e.\ from the current directory or using the |TEXMF| tree, +% otherwise it the absolute location can not be determined. If the file can't be found in the `|.fls|' file the macros +% \Macro\theabspath and \Macro\theabsdir are empty. +% +% \section{Parent file macros}\label{sec:parent} +% If\marginpar{\raggedright New in v0.7 from 2012/05/15} +% the \opt{parent} package option is enabled the following macros are provided. +% They are no direct |\if...| macros for these but the general \Macro\ifcurrfile macro can be used with them. +% +% \DescribeMacro{\parentfiledir} +% \DescribeMacro{\parentfilebase} +% \DescribeMacro{\parentfileext} +% \DescribeMacro{\parentfilename} +% \DescribeMacro{\parentfilepath} +% These macros are analog to the |\currfile...| macros but for the parent file of the current file. +% They are all empty for the main file which does not have a parent file. +% +% \DescribeMacro{\parentfileabsdir} +% \DescribeMacro{\parentfileabspath} +% These macros are provided if the \opt{abspath} option is used in addition to \opt{parent}. +% They are also empty for the main file. +% +% +% \section{Access all parent files}\label{sec:parents} +% If\marginpar{\raggedright New in v0.7 from 2012/05/15} +% the \opt{parents} package option is enabled the following macros are provided. +% Note that this option does not enable the \opt{parent} option. +% +% \DescribeMacro{\currfilegetparents} +% This macro locally defines file name macros for all parent files of the current input file: +% The macros are named like the ones of the \opt{parent} option, but also include a trailing +% roman number to indicate the parent file level, starting with `i` for the first parent file: +% +% \begin{DescribeMacrosTab}{llll} +% \Macro{\parentfilediri} & \Macro{\parentfiledirii} & $\ldots$ \\ +% \Macro{\parentfilebasei} & \Macro{\parentfilebaseii} & $\ldots$ \\ +% \Macro{\parentfileexti} & \Macro{\parentfileextii} & $\ldots$ \\ +% \Macro{\parentfilenamei} & \Macro{\parentfilenameii} & $\ldots$ \\ +% \Macro{\parentfilepathi} & \Macro{\parentfilepathii} & $\ldots$ \\ +% \Macro{\parentfileabsdiri} & \Macro{\parentfileabsdirii} & $\ldots$ \\ +% \Macro{\parentfileabspathi} & \Macro{\parentfileabspathii} & $\ldots$ \\ +% \end{DescribeMacrosTab} +% Note that these macros are only defined in the current group and not globally like all other file name macros. +% The number of the highest parent file is given by the \cnt{currfiledepth} counter. +% +% For example, if \Macro\currfilegetparents is used in a sub-sub-sub-file the \cnt{currfiledepth} counter is 3 +% and \Macro\parentfilenameiii is the name of the main document file. +% +% \section{Usage inside file hooks} +% This package uses the `EveryFile' hooks of the \pkg{filehook} package to update its macros. +% Special care is taken to do this in a way so that the macros can be used safely inside other hook code, including other `EveryFile' hooks. +% Please note that the `AtEndOfPackageFile' and `AtEndOfClassFile' hooks are executed after `AtEndOfEveryFile' +% and therefore the |currfile| macros will hold the values of the parent file, not of that package or class file. +% +% \section{Compatibility with the \texttt{fink} package}\label{sec:fink} +% The \pkg{fink} package (\emph{fi}le \emph{n}ame \emph{k}eeper) provides a similar functionality. It has inspired this package in several points (e.g.\ package +% options). However, it does not exclude package and other preamble files and does not take care to change the filename \emph{after} the \Macro\clearpage of +% \Macro\include. The author of \texttt{fink} is now discontinuing it in favour of this package. +% Existing documents which use \pkg{fink} should either rename the related macros as shown by Table~\ref{tab:fink} or use the \pkg{fink} option of \pkg{currfile} which defines +% the \pkg{fink} macros to use the \pkg{currfile} ones. +% +% Because both packages do basically the same thing, especially patch the same macros, there are incompatible and should not be loaded at the same time. +% In consent with the \pkg{fink} package author this package will undo most of the \pkg{fink} code if it was already loaded or prevent it from being loaded afterwards. +% +% \begin{table} +% \belowcaptionskip=\abovecaptionskip +% \abovecaptionskip=0pt +% \caption{Conversion from \texttt{fink} package to \texttt{currfile}.} +% \label{tab:fink} +% \centering +% \begin{tabular}{lll} +% \toprule +% \texttt{fink} & \texttt{currfile} & Example Result \\ +% \midrule +% \cs{finkdir} & \cs{currfiledir} & \ttfamily\currfiledir \\ +% \cs{finkbase} & \cs{currfilebase} & \ttfamily\currfilebase \\ +% \cs{finkext} & \cs{currfileext} & \ttfamily\currfileext \\ +% \cs{finkfile} & \cs{currfilename} & \ttfamily\currfilename \\ +% \cs{finkpath} & \cs{currfilepath} & \ttfamily\currfilepath \\ +% \bottomrule +% \end{tabular} +% \end{table} +% +% \StopEventually{} +% +% \section{Implementation}\label{sec:impl} +% +% \iffalse +%<*currfile.sty> +% \fi +% +% \subsection{Package \pkg{currfile}} +% +% \subsubsection{Package header} +% +% \begin{macrocode} +\NeedsTeXFormat{LaTeX2e}[1999/12/01] +\ProvidesPackage{currfile}[% +%<!DATE> +%<!VERSION> +%<*DRIVER> + 2099/01/01 develop +%</DRIVER> + Provides the file path elements of the current input file] +% \end{macrocode} +% +% \subsubsection{Options} +% +% \begin{macrocode} +\RequirePackage{kvoptions} +\SetupKeyvalOptions{family=currfile,prefix=currfile@} + +\@ifpackageloaded{fink}{% + \DeclareStringOption[\fnk@mainext]{mainext}% + \DeclareStringOption[\fnk@maindir]{maindir}% + \DeclareBoolOption[true]{fink}% + \PackageWarning{currfile}{Deprecated package 'fink' detected. % + The 'fink' option will default to 'true'.^^J% + If set to 'false' no 'fink' macros will be changed but they will stop + working correctly!}% +}{% + \DeclareStringOption[tex]{mainext}% + \DeclareStringOption[\@currdir]{maindir}% + \DeclareBoolOption[false]{fink}% +}% +\DeclareVoidOption{force}{\PassOptionsToPackage{force}{filehook}} +\DeclareBoolOption[false]{parent} +\DeclareBoolOption[false]{parents} +\DeclareBoolOption[false]{realmainfile}% +\let\ifcurrfile@realmainfile\relax +\DeclareBoolOption[false]{abspath}% +\RequirePackage{filehook}[2011/01/09] +\ProcessKeyvalOptions*\relax + +\begingroup +\xdef\currfile@mainext{\currfile@mainext}% +\xdef\currfile@maindir{\currfile@maindir}% +\def\@tempa{./}% +\ifx\@tempa\currfile@maindir + \global\let\currfile@maindir\@empty +\fi +\endgroup + +% \end{macrocode} +% Check if \opt{realmainfile} option was used. If not it is determined +% by the \opt{abspath} option. +% \begin{macrocode} +\expandafter\ifx\csname ifcurrfile@realmainfile\endcsname\relax + \ifcurrfile@abspath + \currfile@realmainfiletrue + \else + \currfile@realmainfilefalse + \fi +\fi + +\ifcurrfile@abspath + \RequirePackage{currfile-abspath} +\else +\ifcurrfile@realmainfile + \RequirePackage{currfile-abspath} +\fi\fi +% \end{macrocode} +% +% +% \subsubsection{File Hooks} +% The \pkg{filehook} package is used to execute the macros at the correct places. +% However it must be loaded before the option processed because the |fink| compatibility +% code in |filehook-fink| will modify the option list. +% The internal interface, not the user-interface, is used to make sure that the file names are valid for all other hooks. +% +% \begin{macrocode} +\filehook@prefixwarg\filehook@every@atbegin{% + \currfile@push + \currfile@set{#1}% +} +\filehook@appendwarg\filehook@every@atend{% + \currfile@pop +} +% \end{macrocode} +% +% +% \subsubsection{Set Current Values} +% +% \begin{macro}{\currfile@set} +% Sets the file information which are parsed by \LaTeX's \Macro\filename@parse. +% \changes{2011/09/18}{v0.5}{Now supports path elements from \cs{input@path}.} +% \changes{2011/09/18}{v0.5}{Now supports multiple dots in the file name.} +% \begin{macrocode} +\def\currfile@set#1{% + \begingroup + \currfile@setparent + \edef\@filef@und{#1}% + \ifx\input@path\@undefined\else + \currfile@checkpath + \fi + \@onelevel@sanitize\@filef@und + \let\filename@simple\currfile@parseext + \let\filename@base\@gobble + \expandafter\filename@parse\expandafter{\@filef@und}% + \global\let\currfiledir\filename@area + \global\let\currfilebase\filename@base + \global\let\currfileext\filename@ext + \xdef\currfilename{\currfilebase\ifx\currfileext\@empty\else.\currfileext\fi}% + \xdef\currfilepath{\currfiledir\currfilename}% + \ifcurrfile@abspath + \getabspath\currfilepath + \global\let\currfileabspath\theabspath + \xdef\currfileabsdir{\theabsdir\currfiledir}% + \fi + \global\advance\c@currfiledepth by\@ne + \endgroup +%<debug> \expandafter\gdef\expandafter\dindent\expandafter{\dindent\space}% +%<debug> \message{^^JDEBUG: \dindent\empty Entering file '\currfilename' ^^J }% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\currfile@parent} +% Sets the current file data as parent file data. Must be called directly before +% updating the current file data. +% \begin{macrocode} +\ifcurrfile@parent +\ifcurrfile@abspath +\def\currfile@setparent{% + \global\let\parentfiledir\currfiledir + \global\let\parentfilebase\currfilebase + \global\let\parentfileext\currfileext + \global\let\parentfilename\currfilename + \global\let\parentfilepath\currfilepath + \global\let\parentfileabspath\currfileabspath + \global\let\parentfileabsdir\currfileabsdir +} +\else +\def\currfile@setparent{% + \global\let\parentfiledir\currfiledir + \global\let\parentfilebase\currfilebase + \global\let\parentfileext\currfileext + \global\let\parentfilename\currfilename + \global\let\parentfilepath\currfilepath +} +\fi +\else +\let\currfile@setparent\relax +\fi +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\currfile@checkpath} +% This loop is placed in an own macro for efficiency reasons. +% In the majority of cases it should not be needed and having it as +% a macro avoids the need to skip over this code as part of a conditional clause +% for every read file. +% \changes{2011/09/18}{v0.5}{New macro as part of the \cs{input@path} support.} +% \begin{macrocode} +\def\currfile@checkpath{% + \openin\@inputcheck\@filef@und\relax + \ifeof\@inputcheck + \currfile@check@inputpath + \fi + \closein\@inputcheck +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\currfile@check@inputpath} +% Check all paths in the \cs{input@path} macro. +% \begin{macrocode} +\def\currfile@check@inputpath{% + \expandafter\@tfor + \expandafter\@tempb + \expandafter:\expandafter=\input@path\do{% + \openin\@inputcheck\@tempb\@filef@und\relax + \ifeof\@inputcheck\else + \edef\@filef@und{\@tempb\@filef@und}% + \@break@tfor + \fi + }% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\currfile@checkpath} +% Special version for the \pkg{import} package. +% \begin{macrocode} +\AtEndOfPackageFile*{import}{% +\def\currfile@checkpath{% + \ifx\IfFileExists\@iffileonpath + \currfile@check@inputpath + \else + \openin\@inputcheck\@filef@und\relax + \ifeof\@inputcheck + \currfile@check@inputpath + \fi + \fi + \closein\@inputcheck +}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\currfile@parseext} +% Replacement for \Macro\filename@simple to allow multiple dots in a filename. +% This needs |\let\filename@base\@gobble| before it is called. +% \changes{2011/09/18}{v0.5}{New macro as part of the multi-dot support.} +% \begin{macrocode} +\begingroup +\@makeother{.} +\gdef\currfile@parseext#1.#2\\{% + \ifx\\#2\\% + \ifx\filename@base\@gobble + \def\filename@base{#1}% + \let\filename@ext\currfile@defaultext% + \else + \def\filename@ext{#1}% + \fi + \else + \edef\filename@base{\filename@base.#1}% + \def\@tempa{\currfile@parseext#2\\}% + \expandafter\@tempa + \fi +} +\endgroup +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\currfile@defaultext} +% Holds the default extension `|tex|' with catcode \emph{other} like \Macro\jobname. +% \changes{2011/09/18}{v0.5}{New macro as part of the multi-dot support.} +% \begin{macrocode} +\def\currfile@defaultext{tex} +\@onelevel@sanitize\currfile@defaultext +% \end{macrocode} +% \end{macro} +% +% \subsubsection{File Stack} +% The file information are pushed and popped on a stack to save and restore them when +% entering and leaving a sub-file, respectively. This is quite similar to the way +% \LaTeX\ saves file base names and extension as well as the `@' status (letter or other) for +% package and class files. +% +% \begin{macro}{\currfile@push} +% \begin{macrocode} +\ifcurrfile@abspath +\def\currfile@push{% + \xdef\currfile@stack{% + {\currfiledir}% + {\currfilebase}% + {\currfileext}% + {\currfileabsdir}% + \currfile@stack + }% +} +\else +\def\currfile@push{% + \xdef\currfile@stack{% + {\currfiledir}% + {\currfilebase}% + {\currfileext}% + \currfile@stack + }% +} +\fi +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\currfile@pop} +% \begin{macrocode} +\def\currfile@pop{% +%<debug> \message{^^JDEBUG: \dindent\empty Leaving file '\currfilename' ^^J }% + \ifcase0% + \ifx\currfile@stack\empty 1\else + \ifnum\c@currfiledepth<\@ne 1\fi\fi + \relax + \global\advance\c@currfiledepth by\m@ne + \else + \global\let\currfile@stack\currfile@stackinit + \global\c@currfiledepth=\z@ + \fi + \expandafter\currfile@pop@\currfile@stack\relax + \relax\relax\relax\relax\relax\relax\relax +%<debug> \message{^^JDEBUG: \dindent\empty Restoring file '\currfilename' ^^J }% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\currfile@pop@} +% \begin{macrocode} +\ifcurrfile@abspath +\def\currfile@pop@#1#2#3#4{% + \gdef\currfiledir{#1}% + \gdef\currfilebase{#2}% + \gdef\currfileext{#3}% + \xdef\currfilename{\currfilebase\ifx\currfileext\empty\else.\currfileext\fi}% + \xdef\currfilepath{\currfiledir\currfilename}% + \gdef\currfileabsdir{#4}% + \xdef\currfileabspath{\ifx\currfileabsdir\@empty\else\currfileabsdir\currfilename\fi}% + \currfile@updatestack +} +\else +\def\currfile@pop@#1#2#3{% + \gdef\currfiledir{#1}% + \gdef\currfilebase{#2}% + \gdef\currfileext{#3}% + \xdef\currfilename{\currfilebase\ifx\currfileext\empty\else.\currfileext\fi}% + \xdef\currfilepath{\currfiledir\currfilename}% + \currfile@updatestack +} +\fi +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\currfile@updatestack} +% \begin{macrocode} +\ifcurrfile@parent +\ifcurrfile@abspath +\def\currfile@updatestack#1#2#3#4#5\relax{% + \gdef\parentfiledir{#1}% + \gdef\parentfilebase{#2}% + \gdef\parentfileext{#3}% + \xdef\parentfilename{\parentfilebase\ifx\parentfileext\empty\else.\parentfileext\fi}% + \xdef\parentfilepath{\parentfiledir\parentfilename}% + \gdef\parentfileabsdir{#4}% + \xdef\parentfileabspath{\ifx\parentfileabsdir\@empty\else\parentfileabsdir\parentfilename\fi}% + \gdef\currfile@stack{{#1}{#2}{#3}{#4}#5}% +} +\else +\def\currfile@updatestack#1#2#3#4\relax{% + \gdef\parentfiledir{#1}% + \gdef\parentfilebase{#2}% + \gdef\parentfileext{#3}% + \xdef\parentfilename{\parentfilebase\ifx\parentfileext\empty\else.\parentfileext\fi}% + \xdef\parentfilepath{\parentfiledir\parentfilename}% + \gdef\currfile@stack{{#1}{#2}{#3}#4}% +} +\fi +\else +\def\currfile@updatestack#1\relax{% + \gdef\currfile@stack{#1}% +} +\fi +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\ifcurrfile@parents +% \end{macrocode} +% +% \begin{macro}{\currfilegetparents} +% \begin{macrocode} +\newcommand*\currfilegetparents{% + \@tempcnta\@ne + \expandafter\currfile@getparents\currfile@stack\relax + \relax\relax\relax\relax\relax\relax\relax +} +\ifcurrfile@abspath +\def\currfile@getparents#1#2#3#4{% + \@namedef{parentfiledir\romannumeral\@tempcnta}{#1}% + \@namedef{parentfilebase\romannumeral\@tempcnta}{#2}% + \@namedef{parentfileext\romannumeral\@tempcnta}{#3}% + \expandafter\edef\csname parentfilename\romannumeral\@tempcnta\endcsname{#2\ifx\empty#3\empty\else.#3\fi}% + \expandafter\edef\csname parentfilepath\romannumeral\@tempcnta\endcsname{#1\csname parentfilename\romannumeral\@tempcnta\endcsname}% + \@namedef{parentfileabsdir\romannumeral\@tempcnta}{#4}% + \expandafter\edef\csname parentfileabspath\romannumeral\@tempcnta\endcsname{% + \expandafter\ifx\csname parentfileabsdir\romannumeral\@tempcnta\endcsname\@empty\else + \csname parentfileabsdir\romannumeral\@tempcnta\endcsname + \csname parentfilename\romannumeral\@tempcnta\endcsname + \fi + }% + \ifnum\@tempcnta<\c@currfiledepth + \advance\@tempcnta\@ne + \expandafter\currfile@getparents + \fi +} +\else +\def\currfile@getparents#1#2#3{% + \@namedef{parentfiledir\romannumeral\@tempcnta}{#1}% + \@namedef{parentfilebase\romannumeral\@tempcnta}{#2}% + \@namedef{parentfileext\romannumeral\@tempcnta}{#3}% + \expandafter\edef\csname parentfilename\romannumeral\@tempcnta\endcsname{#2\ifx\empty#3\empty\else.#3\fi}% + \expandafter\edef\csname parentfilepath\romannumeral\@tempcnta\endcsname{#1\csname parentfilename\romannumeral\@tempcnta\endcsname}% + \ifnum\@tempcnta<\c@currfiledepth + \advance\@tempcnta\@ne + \expandafter\currfile@getparents + \fi +} +\fi +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\parentfile}[2]{file path part}{number} +% Expands to the \Macro\parentfile<part><roman number> macro. +% \begin{macrocode} +\newcommand\parentfile[2]{% + \csname parentfile#1\romannumeral#2\endcsname +} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\fi +% \end{macrocode} +% +% \iffalse +%<debug> \def\dindent{} +% \fi +% +% \begin{macro}{\currfile@stack} +% \begin{macro}{\currfile@stackinit} +% Initialise the stack with empty values and set the main file values. +% \begin{macrocode} +\let\currfile@stack\@empty +\let\currfiledir\@empty +\let\currfilebase\@empty +\let\currfileext\@empty +\let\currfilename\@empty +\let\currfilepath\@empty +\let\currfileabspath\@empty +\let\currfileabsdir\@empty +\newcounter{currfiledepth} +\global\c@currfiledepth\m@ne +\ifcurrfile@realmainfile + \getmainfile + \ifx\themainfile\@empty + \currfile@set{\currfile@maindir\jobname.\currfile@mainext} + \else + \currfile@set{\themainfile} + \fi +\else + \currfile@set{\currfile@maindir\jobname.\currfile@mainext} +\fi +\currfile@push +\let\currfile@stackinit\currfile@stack +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% Disable the change of the \opt{abspath} option at this point +% in order to freeze the stack format. +% \begin{macrocode} +\let\currfile@abspathfalse\relax +\let\currfile@abspathtrue\relax +% \end{macrocode} +% +% \subsubsection{If Macros} +% \begin{macro}{\ifcurrfilename} +% \begin{macrocode} +\newcommand*\ifcurrfilename{\begingroup\currfile@if\currfilename} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ifcurrfilebase} +% \begin{macrocode} +\newcommand*\ifcurrfilebase{\begingroup\currfile@if\currfilebase} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ifcurrfileext} +% \begin{macrocode} +\newcommand*\ifcurrfileext{\begingroup\currfile@if\currfileext} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ifcurrfiledir} +% \begin{macrocode} +\newcommand*\ifcurrfiledir{\begingroup\currfile@if\currfiledir} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ifcurrfilepath} +% \begin{macrocode} +\newcommand*\ifcurrfilepath{\begingroup\currfile@if\currfilepath} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\ifcurrfile@abspath +% \end{macrocode} +% +% \begin{macro}{\ifcurrfileabspath} +% \begin{macrocode} +\newcommand*\ifcurrfileabspath{\begingroup\currfile@if\currfileabspath} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ifcurrfileabsdir} +% \begin{macrocode} +\newcommand*\ifcurrfileabsdir{\begingroup\currfile@if\currfileabsdir} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\fi +% \end{macrocode} +% +% \begin{macro}{\ifcurrfile}[1]{currfile macro or text} +% Expands and sanitizes the first argument and then calls the internal if-macro +% with the result. +% \begin{macrocode} +\newcommand*\ifcurrfile[1]{% + \begingroup + \edef\@tempb{#1}% + \@onelevel@sanitize\@tempb + \currfile@if\@tempb +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\currfile@if}[2]{currfile macro to compare}{compare text} +% Expands the text and sanitize it to ensure correct neutral catcodes. +% Then it temp macro is compared to the given currfile macro. +% \begin{macrocode} +\def\currfile@if#1#2{% + \edef\@tempa{#2}% + \@onelevel@sanitize\@tempa + \ifx\@tempa#1% + \endgroup + \expandafter\@firstoftwo + \else + \endgroup + \expandafter\@secondoftwo + \fi +} +% \end{macrocode} +% \end{macro} +% +% +% \subsubsection{Fink Macros} +% +% The \pkg{fink} option defines all \pkg{fink} package macros to use the ones provided +% by this package. If the \pkg{fink} package was loaded beforehand the restoration +% of these macros must be avoided at the end of this file +% (\pkg{fink}s \Macro\InputIfFileExists was then used to load this package). +% If the package was not loaded its version is set to a dummy value and its +% options to this package options. If \pkg{fink} is attempted to be loaded later +% it will trigger an package option clash if different option are used. +% Otherwise it will be taken as already loaded and not loaded ``again''. +% +% \begin{macrocode} +\ifcurrfile@fink + \def\finkfile{\currfilename}% + \def\finkdir{\currfiledir}% + \def\finkpath{\currfilepath}% + \def\finkbase{\currfilebase}% + \def\finkext{\currfileext}% + \@ifpackageloaded{fink}{% + \def\fink@restore#1{}% + }{% + \@namedef{ver@fink.sty}{2011/01/09}% + \expandafter\edef\csname opt@fink.sty\endcsname{% + maindir=\currfile@maindir,mainext=\currfile@mainext + }% + }% +\else + \@ifpackageloaded{fink}{}{% + \AtBeginOfPackageFile{fink}{% + \PackageError{currfile}{The 'fink' package is now deprecated. % + Load 'currfile' with the 'fink' option or see the upgrade guide in the manual}{}% + }% + }% +\fi +% \end{macrocode} +% +% \iffalse +%</currfile.sty> +% \fi +% +% \iffalse +%<*currfile-abspath.sty> +% \fi +% \subsection{Sub-package \pkg{currfile-abspath}} +% +% \subsubsection{Package header} +% +% \begin{macrocode} +\NeedsTeXFormat{LaTeX2e}[1999/12/01] +\ProvidesPackage{currfile-abspath}[% +%<!DATE> +%<!VERSION> +%<*DRIVER> + 2099/01/01 develop +%</DRIVER> + Provides absolute file paths, the parent working directory and the main file name] +% \end{macrocode} +% +% +% \subsubsection{Preliminary Code} +% +% Declare and init macros +% \begin{macrocode} +\newcommand*\thepwd{} +\newcommand*\theabspath{} +\newcommand*\theabsdir{} +\newcommand*\themainfile{} +% \end{macrocode} +% Long, empty: +% \begin{macrocode} +\newif\ifcurrfile@abspath@windows +% \end{macrocode} +% +% Ensure that the main file extension is defined and not empty. +% \begin{macrocode} +\providecommand\currfile@mainext{tex} +\ifx\currfile@mainext\@empty + \PackageError{currfile-abspath} + {Empty main file extension is not supported}{}% +\fi +% \end{macrocode} +% +% \iffalse +%\edef\themainfile{\jobname.\currfile@mainext} +%\@onelevel@sanitize\themainfile +% \fi +% +% +% \begin{macro}{\currfile@abspath@noflswarning} +% +% \begin{macrocode} +\def\currfile@abspath@noflswarning{% + \PackageWarning{currfile-abspath} + {The required recorder file (.fls) was not found.\MessageBreak + Please compile with the '-recorder' option.\MessageBreak + Note that MikTeX requires two compiler runs.\MessageBreak + Occurred}% + \global\let\currfile@abspath@noflswarning\relax + \global\csname currfile@abspathfalse\endcsname +}% +% \end{macrocode} +% \end{macro} +% +% +% \subsubsection{Parent Working Directory (PWD)} +% Opens the |\jobname.fls| file and checks for the `|PWD|' line (should be the very first one). +% \begin{macro}{\getpwd} +% \begin{macrocode} +\newcommand\getpwd{% + \begingroup + \let\thepwd\@empty + \IfFileExists{\jobname.fls}{% + \openin\@inputcheck=\jobname.fls\relax + \endlinechar\m@ne + \loop + \readline\@inputcheck to \line + \@onelevel@sanitize\line + \expandafter\currfile@checkpwd\line\relax\relax\relax\relax\relax + \ifeof\@inputcheck\else + \repeat + \closein\@inputcheck + } + \currfile@abspath@noflswarning + \edef\@tempa{% + \def\noexpand\thepwd{\thepwd}% + }% + \expandafter + \endgroup + \@tempa +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\currfile@checkpwd} +% Checks if the read line starts with `|PWD|' and stores the rest +% of the line in \Macro\thepwd. The space after `|PWD|' is skipped by +% \TeX\ when looking for |#4|. +% \begin{macrocode} +\def\currfile@checkpwd#1#2#3#4#5\relax{% + \edef\@tempa{#1#2#3}% + \edef\@tempb{PWD}% + \@onelevel@sanitize\@tempb + \ifx\@tempa\@tempb + \edef\thepwd{#4#5/}% + \def\@tempa{#4}% + \def\@tempb{/}% + \ifx\@tempa\@tempb + \currfile@abspath@windowsfalse + \else + \currfile@abspath@windowstrue + \fi + \let\iterate\relax + \fi +} +% \end{macrocode} +% \end{macro} +% +% +% \subsubsection{Absolute Path} +% +% \begin{macro}{\getabspath} +% Opens the |\jobname.fls| file and checks for the first `|INPUT|' line +% which lists the given filename. +% \begin{macrocode} +\newcommand\getabspath[1]{% + \begingroup + \edef\filename{#1}% + \@onelevel@sanitize\filename% + \let\theabspath\@empty + \let\theabsdir\@empty + \IfFileExists{\filename}{% + \IfFileExists{\jobname.fls}{% + \openin\@inputcheck=\jobname.fls\relax + \endlinechar\m@ne + \expandafter\currfile@abspath@defs\expandafter{\filename}% + \readline\@inputcheck to \line + \@onelevel@sanitize\line + \expandafter\currfile@checkpwd\line\relax\relax\relax\relax\relax + \loop + \readline\@inputcheck to \line + \@onelevel@sanitize\line + \expandafter\currfile@abspath@getabspath\expandafter{\line}% + \ifeof\@inputcheck\else + \repeat + \closein\@inputcheck + }\currfile@abspath@noflswarning + }{}% + \edef\@tempa{% + \def\noexpand\theabspath{\theabspath}% + \def\noexpand\theabsdir{\theabsdir}% + \def\noexpand\thepwd{\thepwd}% + }% + \expandafter + \endgroup + \@tempa +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\getmainfile} +% Opens the |\jobname.fls| file and checks for the first `|INPUT|' line +% which lists a file with the main file extension (usually `|.tex|'). +% \begin{macrocode} +\newcommand\getmainfile{% + \begingroup + \let\themainfile\@empty + \IfFileExists{\jobname.fls}{% + \openin\@inputcheck=\jobname.fls\relax + \endlinechar\m@ne + \readline\@inputcheck to \line + \@onelevel@sanitize\line + \expandafter\currfile@checkpwd\line\relax\relax\relax\relax\relax + \loop + \readline\@inputcheck to \line + \@onelevel@sanitize\line + \expandafter\currfile@abspath@getmainfile\expandafter{\line}% + \ifeof\@inputcheck\else + \repeat + \closein\@inputcheck + }% + \currfile@abspath@noflswarning + \edef\@tempa{% + \def\noexpand\themainfile{\themainfile}% + \def\noexpand\thepwd{\thepwd}% + }% + \expandafter + \endgroup + \@tempa +} +% \end{macrocode} +% \end{macro} +% +% +% \subsubsection{Line scanning macros for abspath and mainfile} +% +% +% \begin{macro}{\currfile@abspath@testfname} +% Test if directory is empty because the file is only listed by name, i.e. is in the PWD +% or because the searched path was an absolute one and no further path elements are therefore listed +% In the first case set \Macro\theabsdir to \Macro\thepwd, in the second case keep it empty. +% \begin{macrocode} +\def\currfile@abspath@testfname#1#2#3\relax{% + \ifcurrfile@abspath@windows + \def\@tempa{#2}% + \def\@tempb{:}% + \else + \def\@tempa{#1}% + \def\@tempb{/}% + \fi + \ifx\@tempa\@tempb\else + \let\theabsdir\thepwd + \fi +} +% \end{macrocode} +% \end{macro} +% +% Change catcodes for `|INPUT|' to 12 (\emph{other}), because we need +% them this way in the parameter lists of the following macros. +% \begin{macrocode} +\begingroup +\catcode`I=12 +\catcode`N=12 +\catcode`P=12 +\catcode`U=12 +\catcode`T=12 +% \end{macrocode} +% +% \begin{macro}{\currfile@abspath@defs} +% Dynamically defines the macros needed to find the line with the requested file name. +% \begin{macrocode} +\gdef\currfile@abspath@defs#1{% + \def\currfile@abspath@checkabspath ##1INPUT ##2#1\relax##3\relax##4\@nnil{% + \ifx\@empty##4\@empty\else + \def\theabsdir{##2}% + \ifx\theabsdir\@empty + \currfile@abspath@testfname#1\@empty\@empty\relax + \fi + \edef\theabspath{\theabsdir#1}% + \let\iterate\relax + \fi + }% + \def\currfile@abspath@getabspath##1{% + \currfile@abspath@checkabspath##1\relax INPUT \@empty#1\relax{}\relax\@nnil + }% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\currfile@abspath@checkmainfile} +% \begin{macro}{\currfile@abspath@getmainfile} +% These two macros are defined with the main file extension given by +% \Macro\currfile@mainext in their parameter texts. To insert the extension +% with the correct catcode 12 two temporary auxiliary macros are utilized. +% The |get| macro places the line content before the |check| macro with a suitable +% fallback code so that the search text is always found and no \TeX\ error is raised. +% The |check| macro tests if the fallback has occurred and stores the read path +% if this was not the case. +% \begin{macrocode} +\def\@tempa#1{% + \gdef\currfile@abspath@checkmainfile ##1INPUT ##2#1\relax##3\relax##4\@nnil{% + \ifx\@empty##4\@empty\else + \def\themainfile{##2#1}% + \let\iterate\relax + \fi + }% + \gdef\currfile@abspath@getmainfile##1{% + \currfile@abspath@checkmainfile##1\relax INPUT \@empty#1\relax{}\relax\@nnil + }% +} +\edef\@tempb{.\currfile@mainext} +\@onelevel@sanitize\@tempb +\expandafter\@tempa\expandafter{\@tempb} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% Ends catcode changes: +% \begin{macrocode} +\endgroup +% \end{macrocode} +% +% \iffalse +%</currfile-abspath.sty> +% \fi +% +% \iffalse +% \fi +% +% \Finale +\endinput |