包含/输入文件时递归搜索父目录

包含/输入文件时递归搜索父目录

我想知道是否可以修改 \input 命令的功能,例如

\input{macros}

将以递归方式工作。

变体 1

  1. 检查macros.tex当前目录中是否存在。如果是,则包含它并退出算法。否则转到步骤 2。
  2. 回到上级目录并返回步骤1。

如果当前目录中存在 macros.tex 文件,则使用该文件,否则将返回到下一个存在的父级文件。这已经很棒了,但对于我的目的来说,更好的是使用稍微复杂一点的版本:

变体 2

  1. 检查macros.tex当前目录中是否存在。如果是,则包含它。无论如何,转到步骤 2。
  2. 检查我们是否已经到达某个预先指定的“根”目录(我们不想进一步搜索该目录)。如果没有,则转到父目录并返回步骤 1。

这是类似的,但继续包括全部直到我们到达某个指定的根目录为止存在的宏文件。

答案1

如果当前目录是

/users/SollteSoSein/something/latex/document

然后

TEXINPUTS=.:/users/SollteSoSein/something/latex:/users/SollteSoSein/something:/users/SollteSoSein:  pdflatex myfile.tex

会按照你的要求去做,不会高于用户/SollteSoSein

这是 bash 语法,使用:作为路径分隔符,您可以在 Windows 中执行等效操作,设置 TEXINPUTS 环境变量并使用适合 Windows 命令 shell 的语法(仍然使用 / 但带有 ;)

答案2

我使用下面一段代码。

该命令在目录中(在文件编译的目录中)\loadPreambule{myFile.tex}查找该文件;如果不存在,它将在父文件夹中查找,等等。myFile.tex_aux_files.tex

这对我来说相当丑陋:所以如果有人能提出更好的解决方案,我将不胜感激。

\RequirePackage{import}

\newcommand{\loadPreambule}[1]
{
\def\namePreambule{_aux_files/}
\IfFileExists{../_aux_files/#1.tex}
    {\def\namePreambule{../_aux_files/}}
    {\IfFileExists{../../_aux_files/#1.tex}
            {\def\namePreambule{../../_aux_files/}}
            {\IfFileExists{../../../_aux_files/#1.tex}
                    {\def\namePreambule{../../../_aux_files/}}
                    {\IfFileExists{../../../../_aux_files/#1.tex}
                        {\def\namePreambule{../../../../_aux_files/}}
                        {}}}}
%
\subimport{\namePreambule}{#1.tex}
}

相关内容