我正在使用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
Run Code Online (Sandbox Code Playgroud)
如何解决这个问题呢?谢谢.
更新:
以下是我从谷歌发现的一些想法
default目标改为a .PHONY.这不是一个很好的解决方案(因为那里可能有乳胶文件,我只需要重新编译一个文件)%.pdf对依赖的依赖%.aux.但我不知道GNU make是否可行?(取决于%.aux文件是否存在,否则忽略依赖%.aux)grep对.log文件并找到特定的警告.如果存在,请重新运行compile命令.Mar*_*uhn 11
我在所有的LaTeX makefile中都使用了简单的规则
.DELETE_ON_ERROR:
%.pdf %.aux %.idx: %.tex
pdflatex $<
while grep 'Rerun to get ' $*.log ; do pdflatex $< ; done
Run Code Online (Sandbox Code Playgroud)
这会根据需要重复pdflatex.我发现所有需要重新运行的不同LaTeX消息都包含日志文件中的公共字符串"Rerun to get",因此您可以在while循环中使用grep测试其存在性.
".DELETE_ON_ERROR:"设置很重要:它确保make会在TeX中止错误时自动删除任何剩余的不完整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
Run Code Online (Sandbox Code Playgroud)
最后一行导致任何正在运行的xdvi重新加载其输入文件,以进行即时视觉检查.
要么将“default”设置为虚假目标(将“default”添加到以 .PHONY 开头的行中),要么构建一个更复杂的依赖结构,该结构会自动重新运行(抱歉,无法说出如何执行此操作)。