12

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

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

Tex语言中是否有某些东西使这变得复杂或不可能完成,或者仅仅是在 Tex 的原始实现中,没有必要这样做(因为在那些大型计算机上它会一直很慢)?

但是另一方面,为什么这不会让其他人非常恼火,以至于他们开始了一个具有某种缓存(或将 Tex 文件透明转换为解析速度更快的格式)的分叉?

我能做些什么来加快 Latex 的后续运行吗?除了将所有内容放入chapterXX.tex 文件然后将它们注释掉?

4

6 回答 6

8

让我们尝试了解 TeX 是如何工作的。当您编写以下内容时会发生什么?

tex.exe myfile.tex

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

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

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

要确保段落相同,您必须确保段落中的所有字符都相同,所有字符类别相同,当前字体相同,所有数学字体相同,以及 some 的值内部变量相同(例如,\hsize, \vsize, \pretolerance, \tolerance, \hypenpenalty, exhyphenpenalty, \widowpenalty, \spaceskip, ..., ........)

您只能确保更改之前的所有段落都是相同的。但在这种情况下,您必须在每个段落之后保留所有状态。

你的系统SuperCachedTeX非常复杂。不是吗?

于 2010-04-28T11:50:34.167 回答
4

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

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

您可以使用 IPC 并与守护进程对话以获取缓存信息。但这将涉及大量编程。TeX 用于正常用途的速度非常快,这并没有真正获得很多。但另一方面,这是一个很好的问题,因为我已经看到 LaTeX 运行(在当前硬件上)运行时间超过 10 小时,这将受益于缓存。

于 2010-04-28T07:49:48.643 回答
3

另一个答案,不严格相关:

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

于 2010-04-28T12:18:57.813 回答
2

有诸如 preview-latex 之类的解决方案,可以将内容预编译为专用格式文件以提高速度。您需要记住,TeX 在本地基础上优化页面。在特定页面上固定材料的引擎级别没有概念,因此您不能只是“重新TeX一页”。

于 2010-04-28T06:10:17.817 回答
1

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

主要问题是分页符会影响段落或浮动,这些可能不会出现在文本中的特定点,但可能发生在宏的执行过程中,这些宏依赖于调用时传递给它们的瞬态状态而被调用。

因此,要使创建“断点”的想法发挥作用,需要破解 Tex 内部以转储额外信息,超出通常转储在格式文件中的信息,并将它们与辅助文件的状态打包在一起。鉴于 Joseph 对 Tex 片段预览器的评价,为什么有人会费心破解 Tex 来做到这一点?

于 2010-04-30T07:50:11.550 回答
1

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

于 2010-04-28T10:33:04.160 回答