我想知道是否可以修改 \input 命令的功能,例如
\input{macros}
将以递归方式工作。
变体 1
- 检查
macros.tex
当前目录中是否存在。如果是,则包含它并退出算法。否则转到步骤 2。 - 回到上级目录并返回步骤1。
如果当前目录中存在 macros.tex 文件,则使用该文件,否则将返回到下一个存在的父级文件。这已经很棒了,但对于我的目的来说,更好的是使用稍微复杂一点的版本:
变体 2
- 检查
macros.tex
当前目录中是否存在。如果是,则包含它。无论如何,转到步骤 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}
}