为什么在文档末尾创建 .toc 文件?

为什么在文档末尾创建 .toc 文件?

要创建目录(例如),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 来说并不经济,事实上对于任何系统来说都是如此。因此,它不是由于内存小而成为历史遗留物,而是一种普遍的必需品。

相关内容