\InputIfFileExists 不再起作用了吗?

\InputIfFileExists 不再起作用了吗?

多年来,我在大多数 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.texmacros.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

相关内容