构建工具latexmk
被广泛使用。xxx.tex
使用 进行编译时latexmk xxx
,会创建一个中间文件xxx.fdb_latexmk
。虽然我可以弄清楚该文本文件的一些属性,但我想确定一下。我研究了源代码,该源代码latexmk
可在https://github.com/debian-tex/latexmk/blob/master/latexmk.pl但是我的 perl 知识太薄弱了,所以我...嗯,我真的不明白。
我已经明白了:
- 第一行
# Fdb version 4
可以参考 latexmk 版本,在我的情况下是 4.xxx。 - 其余部分如下所述。有些情况只有一个部分。
每个部分都有一定的形式:
- 第一行是唯一没有缩进的行。可以是这样的
["lualatex"] 1702989679 "bewerbung.tex" "bewerbung.pdf" "bewerbung" 1702989681 0
似乎指的是一条规则,所以我称之为规则线。
- 直到行之后的每一行都
(generated)
引用一个源,因此我称之为源行。 - 然后出现一行
(generated)
, (generated)
直到行之后的每一行(rewritten before read)
似乎都指向一个目标,因此我称之为目标行。- 该部分的最后一行是
(rewritten before read)
问题:
- 上述列表是通用形式还是仅适用于我的文件?
- 规则行似乎以 [“规则名称”] 开头,其中规则名称可以是用户定义的或内置的。该行的其余部分,特别是许多数字,对我来说不清楚。
- 源代码行似乎以
"file path"
引用源文件开始。然后是一个我无法解释的数字,然后是文件的大小和一个哈希值,很可能是为了识别更改,然后是引号中的某些内容:如果未创建源文件,则为空,否则为创建文件的规则的名称。 - 目标行看起来很清晰:引号中的生成文件的名称。
谁能帮我了解一下详情?
答案1
Latexmk 维护者在这里。由于 .fdb_latexmk 文件旨在供 latexmk 内部使用,因此(目前)没有官方文档。这个答案是最接近文档的方法。
在 latexmk 源代码中,相当短的子程序 rdb_write 通过显示写入的内容有效地定义了格式。写入值的变量的名称给出了含义的指示。
第一行中的版本只是 .fdb_latexmk 文件所用布局的版本号。每当我发现需要更改这些文件中的信息类型时,我都会更新版本号。当 latexmk 读取 .fdb_latexmk 文件时,它会检查 fdb 版本号,如果版本号与当前版本号不同,则放弃读取。(该文件显然是由不同版本的 latexmk 创建的。)当前 fdb 版本为 4。
缩进纯粹是为了方便人们阅读文件,当 latexmk 读取文件时,缩进会被忽略。空白行和注释行会被忽略(除了给出 fdb 版本号的初始注释行)。注释行以可能的空格开头,后跟“#”或“%”。
整体结构和你看到的一模一样。
对于每条规则,都有一个部分,该部分由以规则名称开头的行 ["..."] 引入。同一行后面的字段包括:
- 上次运行规则时的系统时间。
- 主要源文件,例如 pdflatex 文档的 .tex 文件。
- 主要目标文件(如果有),例如 pdflatex 的输出 .pdf 文件。
- 文件的基本名称,例如日志文件等。
- 上次检查规则是否需要重新运行的系统时间。
- 上次运行的状态代码:0 表示成功。目前,其他可能的值包括:1(如果规则未能创建预期的输出文件)或 2(如果出现其他类型的错误)。
规则行后面是规则的每个(已知)源文件的一行:每行包含文件的名称(在双引号中),然后是修改时间、文件大小和 md5 签名(在规则运行前测量)。最后是生成文件的规则的名称(如果有),在双引号中。
之后是规则数据的另一部分,以包含“(生成)”的行开头。这是规则运行期间生成的文件的文件名列表(用双引号括起来,每行一个)。
规则数据的最后一部分以包含“(读取前重写)”的行开头。后面是文件名列表(同样用双引号引起来,每行一个)。通常此列表为空。此处的任何文件在运行开始时都存在,并在运行期间被读取,但它们在第一次读取之前就被重写了。
我应该补充一点,当遇到非 ASCII 文件名时,它们会被编码为 UTF-8。