9

Makefile用来从.tex文件生成 PDF。

在我的 LaTeX 文件中使用参考时。有时我会得到类似的东西

LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right.

我知道重新运行 LaTeX 编译命令可以解决这个引用问题,但在我的Makefile,%.pdf仅依赖于%.tex,因此make再次运行并不能解决问题(.tex文件中没有任何更改)。我需要make clean重新生成 PDF。

这是我的Makefile

TEX := $(wildcard *.tex)
default: $(TEX:.tex=.pdf)
%.pdf: %.tex
    xelatex $<
.PHONY: clean
clean:
    rm -v *.aux *.toc *.log *.out

如何解决这个问题呢?谢谢你。

更新:

这是我从谷歌找到的一些想法

  1. 将目标更改default.PHONY. 这不是一个很好的解决方案(因为那里可能有乳胶文件,我只需要重新编译一个文件)
  2. %.pdf将 的依赖项更改为 include %.aux。但我不知道在 GNU make 中是否可行?(取决于%.aux文件是否存在,否则忽略对 的依赖%.aux
  3. grep对文件执行.log操作并找到特定的警告。如果存在,重新运行编译命令。
4

2 回答 2

12

我在我所有的 LaTeX 生成文件中都使用了简单的规则

.DELETE_ON_ERROR:

%.pdf %.aux %.idx: %.tex
        pdflatex $<
        while grep 'Rerun to get ' $*.log ; do pdflatex $< ; done

这会根据需要经常重复 pdflatex。我发现所有要求重新运行的不同 LaTeX 消息在日志文件中都包含公共字符串“Rerun to get”,因此您可以在 while 循环中使用 grep 测试它的存在。

".DELETE_ON_ERROR:" 设置很重要:它确保当 TeX 因错误中止时 make 会自动删除任何剩余的不完整的 pdf/aux/idx 文件,这样下次调用它时它们就不会混淆 make 了。

当我使用 DVI 而不是 PDF 作为输出格式时,我等效地使用

%.dvi %.aux %.idx: %.tex
        latex $<
        while grep 'Rerun to get ' $*.log ; do latex $< ; done
        -killall -USR1 -r xdvi || true

最后一行导致任何正在运行的 xdvi 重新加载其输入文件,以进行即时视觉检查。

于 2013-01-30T09:50:39.483 回答
0

要么使“默认”成为虚假目标(将“默认”添加到以 .PHONY 开头的行),要么构建更复杂的依赖结构,它会自动重新运行(无法说明如何做到这一点,抱歉)。

于 2012-09-09T22:18:41.067 回答