\NeedsTeXFormat{LaTeX2e}[1999/12/01] \ProvidesPackage{currfile}[% 2024/03/14 v1.0 Provides the file path elements of the current input file] \RequirePackage{kvoptions} \SetupKeyvalOptions{family=currfile,prefix=currfile@} \@ifpackageloaded{currfile-abspath}{% \let\currfile@mainext\relax }{}% \@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 \expandafter\ifx\csname ifcurrfile@realmainfile\endcsname\relax \ifcurrfile@abspath \currfile@realmainfiletrue \else \currfile@realmainfilefalse \fi \fi \begingroup \@tempswafalse \ifcurrfile@abspath \@tempswatrue \else \ifcurrfile@realmainfile \@tempswatrue \fi\fi \if@tempswa \endgroup \@ifpackageloaded{currfile-abspath}{% \PackageWarning{currfile}{Sub-package 'currfile-abspath' already loaded beforehand. This might lead to wrong results when non-default options are used.}% }{}% \RequirePackage{currfile-abspath} \else \endgroup \fi \filehook@prefixwarg\filehook@every@atbegin{% \currfile@push \currfile@set{#1}% } \filehook@appendwarg\filehook@every@atend{% \currfile@pop } \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 } \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 \def\currfile@openin#1#2{% \openin#1="#2"\relax } \def\currfile@checkpath{% \currfile@openin{\@inputcheck}{\@filef@und}% \ifeof\@inputcheck \currfile@check@inputpath \fi \closein\@inputcheck } \def\currfile@check@inputpath{% \expandafter\@tfor \expandafter\@tempb \expandafter:\expandafter=\input@path\do{% \currfile@openin{\@inputcheck}{\@tempb\@filef@und}% \ifeof\@inputcheck\else \edef\@filef@und{\@tempb\@filef@und}% \@break@tfor \fi }% } \AtEndOfPackageFile*{import}{% \def\currfile@checkpath{% \ifx\IfFileExists\@iffileonpath \currfile@check@inputpath \else \currfile@openin{\@inputcheck}{\@filef@und}% \ifeof\@inputcheck \currfile@check@inputpath \fi \fi \closein\@inputcheck }% } \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 \def\currfile@defaultext{tex} \@onelevel@sanitize\currfile@defaultext \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 \def\currfile@pop{% \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 } \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 \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 \ifcurrfile@parents \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 \newcommand\parentfile[2]{% \csname parentfile#1\romannumeral#2\endcsname } \fi \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 \let\currfile@abspathfalse\relax \let\currfile@abspathtrue\relax \newcommand*\ifcurrfilename{\begingroup\currfile@if\currfilename} \newcommand*\ifcurrfilebase{\begingroup\currfile@if\currfilebase} \newcommand*\ifcurrfileext{\begingroup\currfile@if\currfileext} \newcommand*\ifcurrfiledir{\begingroup\currfile@if\currfiledir} \newcommand*\ifcurrfilepath{\begingroup\currfile@if\currfilepath} \ifcurrfile@abspath \newcommand*\ifcurrfileabspath{\begingroup\currfile@if\currfileabspath} \newcommand*\ifcurrfileabsdir{\begingroup\currfile@if\currfileabsdir} \fi \newcommand*\ifcurrfile[1]{% \begingroup \edef\@tempb{#1}% \@onelevel@sanitize\@tempb \currfile@if\@tempb } \def\currfile@if#1#2{% \edef\@tempa{#2}% \@onelevel@sanitize\@tempa \ifx\@tempa#1% \endgroup \expandafter\@firstoftwo \else \endgroup \expandafter\@secondoftwo \fi } \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 \endinput %% %% End of file `currfile.sty'.