IfFileExists 和 filecontents 导致错误

IfFileExists 和 filecontents 导致错误

我想filecontents在我的文档中使用该环境。我收到警告

LaTeX Warning: File `test.txt' already exists on the system. 
Not generating it from this source.

pdfLaTeX如果我多次运行以下操作

\documentclass{article}
\begin{filecontents}{\jobname.txt}
  Hello World
\end{filecontents}
\begin{document}
  \input{\jobname.txt}
\end{document}

警告很明显,第一遍创建了文件,所以后续的遍历会导致警告。我以为我可以用 来消除警告IfFileExists。问题是

\documentclass{article}
\IfFileExists{\jobname.txt}{}{
  \begin{filecontents}{\jobname.txt}
    Hello World
  \end{filecontents}
}
\begin{document}
  \input{\jobname.txt}
\end{document}

出现错误

! LaTeX Error: Missing \begin{document}.

在第一遍和后续的几遍中。我做错了什么?

答案1

您可以使用此技巧来避免将filecontents环境放在括号内,这是导致错误的原因:

\begingroup\newif\ifmy
\IfFileExists{\jobname.txt}{}{\mytrue}
\ifmy
\begin{filecontents}{\jobname.txt}
  Hello World
\end{filecontents}
\fi\endgroup

答案2

这可能并不完全是你想要的,因为你的问题更多的是关于“如何做”而不是“完成它”。然而,在感兴趣的问题中,这里有一种覆盖现有文件的方法,而不必担心 LaTeX 发出的覆盖警告:

\documentclass{article}
\usepackage{filecontents}% http://ctan.org/pkg/filecontents
\usepackage{silence}% http://ctan.org/pkg/silence
\WarningFilter{latex}{Overwriting file}% Remove LaTeX warnings starting with "Overwriting file"
\begin{filecontents*}{\jobname.txt}
  Hello World
\end{filecontents*}
\begin{document}
  \input{\jobname.txt}
\end{document}​

filecontents包裹提供filecontents*覆盖文件(如果文件已存在)的功能。silence包裹通过以下方式吞噬 LaTeX 中以“覆盖文件”开头的警告

\WarningFilter{latex}{Overwriting file}

尽管使用了,但写作filecontents仍然是与 LaTeX 相关的警告。

相关内容