![在文档的任何地方使用 filecontents(包括“\end{document}”之后)](https://linux22.com/image/311827/%E5%9C%A8%E6%96%87%E6%A1%A3%E7%9A%84%E4%BB%BB%E4%BD%95%E5%9C%B0%E6%96%B9%E4%BD%BF%E7%94%A8%20filecontents%EF%BC%88%E5%8C%85%E6%8B%AC%E2%80%9C%5Cend%7Bdocument%7D%E2%80%9D%E4%B9%8B%E5%90%8E%EF%BC%89.png)
根据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}
。
平子笔记:
document
LaTeX 会使用一些技巧来通过环境代码摆脱组。否则,当 TeX 想要在组之后恢复所有本地分配时,将文档放入组中会引发内存问题。但由于这\end{document}
是 TeX 作业的结束,因此事后恢复分配毫无意义。
我仍然愿意说,尝试从 LaTeX 中设计出这种行为是徒劳的,或者至少,最好花点时间问问为什么需要这种行为。