为什么Tex / Latex在后续运行中没有加速?

时间:2010-04-28 00:49:16

标签: latex tex pdflatex compilation-time

我真的很想知道,为什么即使最近的Tex / Latex系统也不使用任何缓存来加速以后的运行。每次修复一个逗号*时,调用Latex会花费我大约相同的时间,因为它需要加载并转换每个图片文件。

(*我知道即使更改一个微小的逗号也会影响整个结构,但当然,一个编写良好的缓存格式可以看到它的影响。此外,可能会出现不需要100%正确性的情况因为它很快。)

Tex的语言中是否存在使得复杂或无法实现的内容,或者仅仅是在Tex的原始实现中,没有必要(因为它本来是无论如何在这些大型计算机上都很慢?)

但另一方面,为什么这不会让其他人如此烦恼以至于他们已经启动了一个具有某种缓存的分支(或者将Tex文件透明地转换为格式哪个解析得更快??

我能做些什么来加速Latex的后续运行?除了将所有内容放入chapterXX.tex文件然后将它们评论出来之外?

6 个答案:

答案 0 :(得分:8)

让我们试着了解TeX的工作原理。写下以下内容会发生什么?

tex.exe myfile.tex

TeX逐字节读取您的文件。首先,TeX将每个char转换为对<category, ascii-code>。每个字符都有类别代码和ascii代码。类别代码表示该字符是左大括号({)或进入数学模式($),符号 - 宏(例如~)或字母({{1} }},A-Z)。

如果TeX获得类别代码为11(字母)或12(其他符号:数字,逗号,句号)的字符,TeX将启动一个段落。您想要缓存所有段落。

假设您更改了文档中的内容。 TeX如何检查更改后的所有段落是否相同?可能是你改变了一些char的类别。我是你改变了一些宏的含义。或者您已在某处删除a-z,从而更改了当前字体。

为了确保段落相同,您必须确保段落中的所有字符都相同,所有字符类别相同,当前字体相同,所有数学字体相同,以及某些字符的值内部变量是相同的(例如,}\hsize\vsize\pretolerance\tolerance\hypenpenaltyexhyphenpenalty\widowpenalty,...,........)

您可以确定只有在更改之前所有参数都相同。但在这种情况下,您必须在每个段落后保留所有州。

您的系统\spaceskip非常复杂。不是吗?

答案 1 :(得分:4)

如果您正在使用pdftex,那么您可以在命令行上使用--draftmode进行首次运行。这指示pdftex不生成PDF。

当然可以缓存很多东西(比如图形信息),但是TeX的工作方式很难做到。 TeX启动时有一个相当复杂的初始化,一个TeX运行总是意味着写出一个PDF。为了进行缓存,您需要将数据保存在内存中(以提高效率)。

您可以使用IPC并与守护进程通信以获取缓存的信息。但这将涉及大量编程。 TeX是出于正常目的而如此快速,这并没有真正获得太多。但另一方面,这是一个很好的问题,因为我已经看到LaTeX运行(在当前硬件上)运行&gt; 10小时可以从缓存中受益。

答案 2 :(得分:3)

另一个答案,并非严格相关:

您可以使用LaTeX宏\include{...}\includeonly{},您可以仅为子集重新运行文档。但这不是缓存,也不是为您提供完整的文档。

答案 3 :(得分:2)

有一些解决方案,例如preview-latex,它可以将内容预编译到专用格式文件中以实现速度目的。您需要记住TeX在本地优化页面。引擎级别的材料在特定页面上没有固定,因此您不能只是“重新TeX一页”。

答案 4 :(得分:1)

实际上,正确的答案是(IMO):LaTeX已经在其输出文件(.aux中缓存信息,其他包的附加文件)。因此,如果您添加逗号,则会重复使用此信息,因此排版运行比没有此.aux文件快得多。

答案 5 :(得分:1)

Tex 有一个缓存工具,命名为格式文件,我认为,按照Alexey对代表Tex状态的问题的宝贵总结,应该可以使用它们来允许在任何时候恢复编辑页面弹出。

主要问题是分页符会影响段落或浮点数,这些可能不会出现在文本中的某个特定点,但可能会在执行根据传递给它们的瞬态调用的宏时发生被调用。

因此,为了使创建“断点”的想法发挥作用,人们需要破解Tex内部以转储除格式文件中规范转储之外的其他信息,并将它们与辅助文件的状态打包在一起。鉴于约瑟夫对Tex片段预览器所说的话,为什么有人会讨厌黑客这样做呢?