如何构建 Makefile,在一次运行中构建具有依赖项的 LaTeX 文档

如何构建 Makefile,在一次运行中构建具有依赖项的 LaTeX 文档

我正在尝试为我的论文创建一个 Makefile,我只需键入内容make,它就会一次性编译所有内容。这篇论文有几个图表是由脚本生成的。然而,我尝试过的所有方法都需要多次运行make才能运行脚本和论文本身。

我开始基于这个答案

all: paper.pdf

paper.pdf:

%.pdf: %.tex
    $(LATEXMK) -lualatex -halt-on-error -pdf -M -MP -MF $*.d $*

some-plot.pgf:
    script_to_generate_plot.py

-include *.d

但是,从干净的构建开始,或者每当我添加一个图时,这都需要运行make两次,一次用于生成文件.d,一次用于实际构建论文。令人恼火的是,第一次你只需要绕过烦人的“文件未找到”提示。

然后我注意到latexmk有一个标志可以用来make构建丢失的文件,所以我尝试这样做:

all: paper.pdf

paper.pdf:

%.pdf: %.tex
    $(LATEXMK) -lualatex -interaction=nonstopmode -pdf -dvi- -ps- -use-make $*

some-plot.pgf:
    python script_to_generate_plot.py

现在它所做的是找到一个缺失的图,构建它,然后失败

Latexmk: 'pdflatex': source file 'some-plot.pgf' doesn't exist. I'll try making it...
------------
Running 'make "some-plot.pgf"'
------------
python script_to_generate_plot.py
Latexmk: Summary of warnings:
  Latex failed to resolve 1 reference(s)
Latexmk: Errors, so I did not complete making targets
Collected error summary (may duplicate other messages):
  pdflatex: Command for 'pdflatex' gave return code 256
Latexmk: Use the -f option to force complete processing,
 unless error was exceeding maximum runs of latex/pdflatex.
make: *** [paper.pdf] Error 12

如果我make再次运行,该地块已构建,但它会对另一个地块执行同样的事情。

如果我继续运行,make它最终会逐一构建我的所有图(我有几个图,其中一些需要一段时间才能生成,所以我想保留脚本来单独生成它们)。

我怎样才能让它一次性构建所有内容,而不管需要重新生成哪些文件和多少个文件?

编辑我想我忘了提到我的另一个目标是避免在我的 Makefile 中手动声明每个 .tex/.pgf/.pdf 文件依赖关系。如果我这样做,使用 latexmk 就没有意义了。我以前做过手动 Makefile,但每当我添加新文件或重新排列内容时,我总是忘记更新依赖关系图。我的理解是 latexmk 的优势在于它可以自动解决这些问题。如果我能得到能做到这一点的东西,那就太理想了。这样 latexmk 就会根据需要多次自动重建论文和 bib 文件。

编辑2 我尝试使用输出中的建议,使用标志-flatexmk这将构建大约 5 个图,然后出现错误

Rule 'pdflatex': File changes, etc:
   Changed files, or newly in use since previous run(s):
      'origen-meeseeks.pgf'
Latexmk: Maximum runs of pdflatex reached without getting stable files
Failure to make 'paper.pdf'
Latexmk: Errors, in force_mode: so I tried finishing targets
Collected error summary (may duplicate other messages):
  pdflatex: Command for 'pdflatex' gave return code 256
Latexmk: Did not finish processing file 'paper':
   'pdflatex' needed too many passes
make: *** [paper.pdf] Error 12
transmutagen-papermaster*=$latexmk -

所以它几乎满足了我的要求。如何增加最大传递次数?

答案1

正如我在编辑中提到的,如果将标志添加-flatexmk,它会在生成每个图后继续并再次尝试。

不幸的是,这些“重新运行”被计入 latexmk 调用 latex 构建文档的次数。默认情况下,它只执行其中的 5 次,但您可以使用配置参数进行修改。在.latexmkrc包含 tex 文件的目录中创建一个文件,然后添加

$max_repeat = 10

10用比您拥有的地块数量更大的数字替换,可能至少比该数量多 5 个)。

我个人认为这些是 latexmk 中的错误(用 构建多个东西make不应该需要-f,每次调用make都不应该算作max_repeat)。

您还需要在 Makefile 中手动添加文件依赖项

paper.pdf: some-plot.pgf

我不知道是否有办法让 latexmk 中的 -MF 内容仅通过一次 Make 运行(生成并使用它们)正常工作。

相关内容