LaTeX参考和Makefile

yeg*_*gle 8 latex makefile

我正在使用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)

如何解决这个问题呢?谢谢.

更新:

以下是我从谷歌发现的一些想法

  1. default目标改为a .PHONY.这不是一个很好的解决方案(因为那里可能有乳胶文件,我只需要重新编译一个文件)
  2. 改变%.pdf对依赖的依赖%.aux.但我不知道GNU make是否可行?(取决于%.aux文件是否存在,否则忽略依赖%.aux)
  3. 做一个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重新加载其输入文件,以进行即时视觉检查.


Jos*_*ost 0

要么将“default”设置为虚假目标(将“default”添加到以 .PHONY 开头的行中),要么构建一个更复杂的依赖结构,该结构会自动重新运行(抱歉,无法说出如何执行此操作)。