如果能执行并收到 git 的拒绝,那就太好了git commit -m "some stupid broken commit"
,因为文档的最新版本尚未成功编译(即更改尚未测试)。git 方面非常简单,只是一个返回非零退出代码的 shell 脚本。但为了做到这一点,我需要能够检查 pdf 是否是最新的。显然这是可以做到的,因为如果我在latexmk
成功编译后运行,我会得到:
$ latexmk -pdf -f thesis
Latexmk: This is Latexmk, John Collins, 30 March 2012, version: 4.31.
**** Report bugs etc to John Collins <collins at phys.psu.edu>. ****
Latexmk: All targets (thesis.pdf) are up-to-date
这很好,我可以在脚本中使用它(假设它输出可用的退出代码)。但如果文档不是最新的,那么能够在没有 latexmk 编译文档的情况下做到这一点就太好了。
那么 latexmk 如何确定输出文件是最新的?或者,是否可以告诉 latexmk不是编译,然后只检查编译状态?
答案1
一个稍微好一点的解决方案是创建一个特殊的初始化文件,我将其称为latexmkrc-diagnose-change
,内容如下
$pdflatex = $latex = 'internal die_pdflatex %S';
sub die_notepdflatex {
# Stop now, otherwise latexmk will update its knowledge of the
# source files and not realize files are out-of-date on the next run.
die "I won't do anything, but just note that '$_[0]' is out of date\n";
}
然后latexmk
使用命令行调用latexmk -r latexmkrc-diagnose-change -pdf thesis
。如果文件已过期,您将收到一条适当的错误消息,并latexmk
以非零退出代码退出。
答案2
Latexmk 以连续模式保存所涉及文件的哈希值(默认情况下),jobname.fdb_latexmk
然后循环遍历这些文件并不时进行检查(如果我没记错的话,每 2 秒一次)。
关于你的钩子:
似乎 latexmk 更新了哈希值前编译。因此 latexmk 的第二次运行总是返回“最新”。
第一次,您可以使用类似 的东西latexmk -norc -latex=idonotexist jobname
。运行此操作将不起作用,因此 latexmk 将返回负值。将-norc
保护您免受设置文件的侵害,因此您不必使用-pdflatex
或其他任何东西。
但只有一次。然后你必须再次更改一些文件。这不能防止“它没有编译”,但可以防止“我甚至没有尝试编译”