我有一个包含以下内容的文件test.tex
:
\input{missing}
\input{present}
当我运行 PDFLaTeX 时,--interaction=nonstopmode
它在第一个缺少的输入文件后停止:
$ pdflatex --interaction=nonstopmode test
This is pdfTeXk, Version 3.1415926-1.40.9 (Web2C 7.5.7)
%&-line parsing enabled.
entering extended mode
(./test.tex
LaTeX2e <2005/12/01>
Babel <v3.8l> and hyphenation patterns for english, usenglishmax, dumylang, nohyphenation, german-x-2008-06-18, ngerman-x-2008-06-18, ancientgreek, ibycus, arabic, basque, bulgarian, catalan, pinyin, coptic, croatian, czech, danish, dutch, esperanto, estonian, farsi, finnish, french, galician, german, ngerman, monogreek, greek, hungarian, icelandic, indonesian, interlingua, irish, italian, latin, lithuanian, mongolian, mongolian2a, bokmal, nynorsk, polish, portuguese, romanian, russian, sanskrit, serbian, slovak, slovenian, spanish, swedish, turkish, ukenglish, ukrainian, uppersorbian, welsh, loaded.
! LaTeX Error: File `missing.tex' not found.
Type X to quit or <RETURN> to proceed,
or enter new name. (Default extension: tex)
Enter file name:
! Emergency stop.
<read *>
l.1 \input{missing}
^^M
! ==> Fatal error occurred, no output PDF file produced!
Transcript written on test.log.
即使missing.tex
不存在,我如何才能让 PDFLaTeX 继续运行?我想使用命令行选项或可以放在任意源文件开头的代码来执行此操作,而不更改源文件的主体。
答案1
LaTeX 宏
\IfFileExists{<filename>}{<true code>}{<false code>}
就是您要寻找的内容,如下所示:
\IfFileExists{missing.tex}{\input{missing}}{}
上述内容的缩写版本形式如下:
\InputIfFileExists{<filename>}{<before code>}
简而言之,以上默认为
\IfFileExists{<filename>}{<before code>\input{<filename>}}
编辑:在您的评论中,您提到,如果没有提供,您有兴趣附加.tex
到missing
仅有的然后。为此,xstring
包裹规定如果以 结尾则执行,否则\IfEndWith{<string>}{<substr>}{<true code>}{<false code>}
执行。我在以下代码中使用了for :<true code>
<string>
<substr>
<false code>
.tex
<substr>
\usepackage{xstring}% http://ctan.org/pkg/xstring
\let\OldInputIfFileExists\InputIfFileExists
\renewcommand{\InputIfFileExists}[2]{%
\IfFileExists{#1}%
{\OldInputIfFileExists{#1}{#2}}%
{\IfEndWith{#1}{.tex}{\typeout{INPUT #1}}{\typeout{INPUT #1.tex}}}%
}
答案2
\documentclass[a4paper]{article}
\makeatletter
\def\input@message{\typeout{\if@tempswa INPUT\else MISSING\fi\space
\filename@base.\ifx\filename@ext\relax tex\else\filename@ext\fi}}
\renewcommand*\@iinput[1]{%
\filename@parse{#1}%
\InputIfFileExists {#1}{\@tempswatrue}{\@tempswafalse}%
\input@message
}
\makeatother
\begin{document}
\input{hoffman1}%existent
\input{hoffman2.dat}%existent
\input{hoffman3}%non existent
\end{document}
日志文件的相关部分是
(./hoffman1.tex)
INPUT hoffman1.tex
(./hoffman2.dat)
INPUT hoffman2.dat
MISSING hoffman3.tex
\@iinput
\input
是当其后跟一个开括号时调用的宏。
答案3
这似乎有效,因为 LaTeX在后台\input
调用:\InputIfFileExists
\let\OldInputIfFileExists\InputIfFileExists
\renewcommand{\InputIfFileExists}[3]{\IfFileExists{#1}{\OldInputIfFileExists{#1}{#2}{#3}}{\typeout{INPUT #1}}}
感谢 Werner 指出这些命令的存在。
我剩下的唯一问题是,我希望在适当的时候将其\typeout
添加.tex
到文件名中,但仅限于此。例如,我想将其更改为:
\input{missing.tex}
\input{missing}
将导致日志行
INPUT missing.tex
INPUT missing.tex
但我想那是另一个问题。