多年来,我在大多数 LaTeX 文档中使用以下内容来输入位于我的 Mac 和 Linux 机器上不同文件夹中的宏文件:
\InputIfFileExists{/Mac/path/macros.tex}%
{\input{/Mac/path/macros.tex}}
{\input{/linux/path/macros.tex}}
它运行得非常好,直到我最近更新了我的 TeX 发行版。更新后,即使使用此 MWE,我也遇到了错误:
\documentclass{amsart}
\InputIfFileExists{/Mac/path/macros.tex}%
{\input{/Mac/path/macros.tex}}
{\input{/linux/path/macros.tex}}
\begin{document}
text
\end{document}
错误内容如下:
Command \first already defined. Or name \end... illegal, see p. 192 of the manual.
(这\first
是我的文件中定义的第一个命令macros.tex
。)
我现在明白,更改为 可以\IfFileExists
解决所有问题,我很乐意这么做。不过,我很好奇,为什么会\InputIfFileExists
抛出这个错误?
快速搜索某物\InputIfFileExists
并没有找到太多有用的信息,只是这个旧的 TeX.SE 问题。
答案1
TL;DR:你实际上正在寻找
\IfFileExists{/Mac/path/macros.tex}%
{\input{/Mac/path/macros.tex}}
{\input{/linux/path/macros.tex}}
该宏\InputIfFileExists{<file>}{<true>}{<false>}
有三个参数:要检查是否存在的文件、<true>
在找到文件之前要执行的代码以及<false>
文件不存在时要执行的代码。你使用它的方式让我认为你实际上是在寻找\IfFileExists
,这就是为什么当你切换到该符号时它会起作用。
在您的使用中
\InputIfFileExists{/Mac/path/macros.tex}%
{\input{/Mac/path/macros.tex}}
{\input{/linux/path/macros.tex}}
\InputIfFileExists{<one>}{<two>}{<three>}
检查是否存在<one>
。如果存在,它将一定执行\input{<one>}
。因此,如果/Mac/path/macros.tex
存在,你最终会尝试\input{/Mac/path/macros.tex}
两次。
\input{/linux/path/macros.tex}
当文件<one>
不存在时将执行该代码。
如果路径条件的唯一原因源于操作系统的选择,那么你可能有兴趣看看ifplatform
包裹。 看是否有一个宏可以告诉我们正在使用哪个操作系统?。
答案2
自 1995/05/25 以来没有任何变化,\InputIfFileExists
所以除非您很长时间没有升级,否则系统升级可能无关紧要。
然而,更好的、更便携的、更高效的标记是
\documentclass{amsart}
\input{macros}
\begin{document}
text
\end{document}
或者更好的是重命名macros.tex
并macros.sty
使用
\documentclass{amsart}
\usepackage{macros}
\begin{document}
text
\end{document}
正如您不必提供完整路径amsart.cls
然后在每台机器上自定义该路径一样,您也不必提供本地生成的文件的完整路径。
您只需确保macros.tex
(或macros.sty
) 位于 TEXINPUTS 路径中,方法是将位置添加到标准路径或将文件放入标准位置。因此,在 Linux 上,texlive~/texmf/tex/latex/mymacros/macro.sty
默认会工作(kpsexpand '$TEXMFHOME'
将显示 TEXMFHOME 的值,但默认为$HOME/texmf
)