在文档的任何地方使用 filecontents(包括“\end{document}”之后)

在文档的任何地方使用 filecontents(包括“\end{document}”之后)

根据filecontents'手册(版本号v1.3,最后修订于2011/10/08,第1页):

(关于 filecontents 仅在 \documentclass 之前有效的评论实际上是不正确的。filecontents 可以在文档序言中的任何位置使用。)

filecontents 包提供了 filecontents 和 filecontents* 环境的改进版本,它解除了上述两个限制,即现有文件永远不会被覆盖,并且 filecontents 必须在 \documentclass 声明(实际上是 \begin{document})之前使用。因此,与 LaTeX 2ε 内核默认提供的相比,filecontents 是一种从 LaTeX 文档内部写入外部文件的更方便的方法。

但是,以下代码:

\begin{filecontents}{a}
a
\end{filecontents}
\documentclass{article}
\usepackage{filecontents}
\begin{filecontents}{b}
b
\end{filecontents}
\begin{document}
\begin{filecontents}{c}
c
\end{filecontents}
This is a test.
\end{document}
\begin{filecontents}{d}
d
\end{filecontents}

只会生成三个文件和三个警告:

LaTeX Warning: Writing file `./a'.
LaTeX Warning: Writing file `./b'.
LaTeX Warning: Writing file `./c'.

之后的所有内容都会\end{document}被丢弃吗?有什么方法可以绕过这个限制吗?的文档不应该filecontents更具体吗?

答案1

正如其他人在评论中所说,\end{document}通过调用导致 TeX 执行结束\@@end,正如我们在中看到的那样latex.ltx:3900

\def\enddocument{%
   \let\AtEndDocument\@firstofone
   \@enddocumenthook
   \@checkend{document}%
   \clearpage
   \begingroup
     % 24 lines omitted
   \endgroup
   \deadcycles\z@\@@end}

\@@end被查看/扩展/处理后,TeX 就停止读取文件。最终文件{filecontents}将无法被查看。

Heiko 在评论中指出,你可以耍个花招让 TeX 在 之后继续运行\end{document},但要小心 – 这里就有巨龙 :)

\documentclass{article}
\usepackage{filecontents}
\begin{document}
hello, world

\makeatletter
\let\@@sean@end\@@end
\let\@@end\begingroup
\end{document}
\begin{filecontents}{d}
d
\end{filecontents}
\@@sean@end

这将创建四个文件:./{a,b,c,d}

平子笔记:

documentLaTeX 会使用一些技巧来通过环境代码摆脱组。否则,当 TeX 想要在组之后恢复所有本地分配时,将文档放入组中会引发内存问题。但由于这\end{document}是 TeX 作业的结束,因此事后恢复分配毫无意义。

我仍然愿意说,尝试从 LaTeX 中设计出这种行为是徒劳的,或者至少,最好花点时间问问为什么需要这种行为。

相关内容