LaTeX 是否必须重新处理未改变的包含文件?

LaTeX 是否必须重新处理未改变的包含文件?

我已经包含了几个.tex文件(它们不包含文件类、开始和结束文档等标题代码)。当我使用包含文件时,\include一切都正常。但如果我重新编译代码,即使大多数包含(甚至全部)都没有改变,我仍然需要一段时间。

我处理这个问题的基本方法是注释掉我不想编译的包含内容,但我看不出为什么它们不能被“预编译”并每次都重复使用,除非文件.tex发生变化。

答案1

TeX 以线性方式处理输入文件,虽然有方法可以分割输入(最终基于原语\input),但这些方法只是为了方便作者。TeX 仍然以线性方式处理所有输入:一旦文件完成,\input就好像材料都放在一个大文件中一样。

同时,文档某一部分的更改可能会影响另一部分(例如,更改运行标题或页码的设置)。因此,不能简单地说“我可以跳过此输入”。编写输出也是一个线性过程:各个.tex文件与文档的某些部分之间没有直接联系,.dvi或者.pdfTeX 无法获取“旧”页面并“回收”它们。

LaTeX\include机制确实具有帮助处理较大文档的功能。使用\includeonly可以只编译文档的一部分,同时保留交叉引用等。但是,这样做会完全跳过未包含的文件,因此您无法获得文档的完整版本。

还有一些方法可以将文档的序言预编译为自定义格式,然后仅重新排版文档正文。例如,请参见mylatexformat

答案2

目前还没有办法做到这一点。唯一的方法是使用\includeand \includeonly(或\excludeonly)并直接跳过某些章节。

但是,如果文件没有更改,则可以从\include文件生成 PDF 并将其包含在内。我已经为其他应用程序编写了类似的代码:\includepdfstandalone。我已经为其他应用程序编写了这样的代码:可以在后台编译自己的文档以访问生成的 PDF,请参阅PDF完成并关闭后是否进行Shell逃逸?尤其是一个 TeX 文件可以输出为多个 PDF 文件吗?(均由 Ulrike Fischer 撰写)。可以使用我的filemod包检查文件更改:(La)TeX 可以比较两个外部文件的时间戳吗?

\include因此,只有文件发生变化时,新包才能重新定义以生成 PDF .tex。处理子文件和图像中的更改更加困难。然后使用组装文档pdfpages。但是,一个主要缺点是所有 PDF 注释(如超链接)都将消失,因为pdftex在包含的 PDF 文件中不支持它们。因此,这应该仅用作草稿模式的一种形式。


一个替代但类似的方法是使用一个脚本或 Makefile 检查文件更改并使用以下命令编译每个章节的文档:

pdflatex -jobname "chapt1" "\includeonly{chapter1}\input{main}"

然后,您就可以直接查看 PDF。也可以有一个主 PDF,其书签指向其他 PDF(包含章节),这样您就可以浏览整个文档。这也允许在章节 PDF 中使用超链接等。

答案3

我认为这种方法无法产生适用于广泛文档的结果。

在我看来,你的假设是错误的:.tex由于多种原因,文件没有改变并不意味着它的排版版本会保持不变。

  1. 当其他文件发生更改时,其中的交叉引用可能无法正确解析。

  2. 拨打电话\today可能会产生不同的日期。

  3. 先前文件的更改.tex可能会产生不同的章节或部分编号。

  4. 先前文件的更改.tex可能会产生不同的页码。

  5. 最重要的是,即使编号没有改变,根文件中命令定义的改变也可能会彻底改变输出。

您的流程会处理所有这些问题吗?与这些约束无关的文档最好作为单独的完整 TeX 文档进行管理,然后与外部实用程序(例如)合并pdftk。当然,您可以编写一个 Lua 脚本来包装这些文档的编译并进行合并。

答案4

以下是我执行此操作的方式:

我有一个主文档,其中输入了我的序言并将我的所有章节包含为 TEX 文件。

在草稿模式下,我会对那些我不想编写的章节进行评论。我还对目录和图表进行了评论。

相关内容