如果我错了请纠正我,当 latexmk 确定是否需要再次运行时,除其他事项外,它会查看 fdb 文件,其中包含输入文件列表。它将每个文件的哈希值与存储的值进行比较以查看它是否已更改,如果是,则重新运行相关规则。
这对我来说,对于一种类型的文件,即 luaotfload 编写的 opentype 字体的缓存文件,一些编译的 luc 文件,造成了问题。(再次,如果我错了,请纠正我),luc 文件的内容将取决于使用该字体的文档的内容。因此,如果文档使用了一些尚未缓存的新功能或字形,缓存文件将会更改。并导致 latexmk 重新运行其 pdflatex 规则(我将自定义 $pdflatex 变量设置为使用 lualatex)。
到目前为止,这对于单个文档来说还算正常。最坏的情况是,由于缓存文件已更新,偶尔会导致出现一个原本不必要的额外文档。然而,真正的麻烦在于,它阻止了 lualtex 在多个文档上并行运行。
假设我有十几个文档,每个文档大约有 5000 多页。它们使用相同的字体。但除此之外,它们是独立的。并行编译多个文档非常有意义。使用 Arno Pro 并启用突起,在最近的四核 CPU 上,时间差别在 5 分钟多一点和半小时之间。但是因为 luaotfload 会想要为不同的文档写入缓存文件(其中一些会因为竞争条件而失败,但这实际上没问题)。而 latexmk 有时会看到 luc 文件不断更新。它会决定每个文档是否需要另一次运行,最终,每个文档都会以最大运行次数结束(默认值为 5),而不是只需要一次。
(抱歉,我对问题背景的解释太长了,如果我对流程的任何方面有误解,请纠正我)。
我认为一个可行的解决方案是让 latexmk 忽略缓存文件作为输入。但到目前为止我还没有找到令人满意的解决方案。这就是我的问题。
我想到的一件事是禁用记录器,但这是不可取的,因为在很多情况下它确实提高了依赖性检测的准确性。
答案1
有一个技巧可以忽略 luc 文件中的更改。这就是将
$hash_calc_ignore_pattern{'luc'}='^';
在初始化文件中。这指定了 latexmk 测试 luc 文件是否已更改时要忽略的行的模式(正则表达式)。此处的模式与每一行都匹配。