要创建目录(例如),LaTeX2e 遵循以下步骤:
运行 1
.aux
文件是从头开始创建的\begin{document}
。- 处理节标题时,将相关的节信息写入文件
\addtocontents
。.aux
- 在文件
\end{document}
中,通过执行来生成文件。\input
.aux
\@writefile
\contentsline
.toc
运行 2
在 处
\begin{document}
,停用\@writefile
并重新输入.aux
文件。这将为当前编译生成标签信息等,并且不会对.toc
已生成的文件产生影响。之后
\begin{document}
,.aux
文件将打开进行写入,其内容将被清除。该过程重新开始。
消息2e
来源没有详细说明为什么系统以这种方式设计。由于写入寄存器有限,.toc
一次性写入所有信息可以最大限度地\end{document}
减少文档期间需要保持打开的文件数量。因此这方面是合理的。
但为什么.aux
文件输入在开头和文档末尾?难道不能.toc
生成文件吗\begin{document}
?
(一个区别是,如果“运行 1”过早终止,则根本.toc
不会生成任何文件,因此不会有目录。而如果文件.toc
是在创建的,\begin{document}
它将包含部分目录 - 但这可以说没有更好或更坏。并且您可以添加,比如说,\@finishedauxtrue
在插入一个标志\end{document}
以在必要时捕获这种情况。)
[[编辑:好吧,aux
最后加载文件可以检查标签是否已更改,等等。因此文件aux
确实总是需要加载两次;我想我的问题是当发生这种情况时,ToC 生成是否有任何差异。]]
答案1
当然,有几种方法可以在运行之间实现数据传输机制。LaTeX 的方法尽量节省资源。
它可以完成许多任务:
- 仅当文档要求目录时才会生成目录类型的文件。这只会在文档中的某个地方变得清晰(即不会自动可用
\begin{document}
),因此这有利于在末尾(而不是开头)编写目录文件。否则,您要么必须始终编写它们,要么将该信息从一次运行带到下一次运行(这无法通过辅助文件实现,因为必须在开始读取辅助文件时知道它)。 - 出于同样的原因,直接写入 TOC 文件(而不是使用辅助文件作为中间文件)是不可能的(除非您始终生成它们,并且目录位于文档的最开始或最末尾)。此外,重复使用部分目录数据(例如,用于章节目录)也将是不可能的。
- 最后重新读取辅助文件不仅是为了生成目录,也是为了对数据进行后期处理,例如交叉引用检查,所以在任何情况下都是需要的。
- 需要先读取辅助文件才能获取上次运行的数据(例如交叉引用)。
所以是的,一开始可以生成 TOC 类型的文件,但随后要么需要额外的机制来传递要生成哪些文件的信息,要么需要始终生成这些文件,即使没有 TOC 或 LOT 或... 被要求。简而言之,没有收获(只有损失)。
除非您想在内存中读取整个文档,否则无法避免多通道系统(即使那样也会是多通道),并且将整个文档保存在内存中对于 TeX 来说并不经济,事实上对于任何系统来说都是如此。因此,它不是由于内存小而成为历史遗留物,而是一种普遍的必需品。