latexmk:多个自定义生成的文件和 \input

latexmk:多个自定义生成的文件和 \input

参照这个问题,我发现在生成的文档中拥有多个自定义生成的文件latexmk对我来说实际上不起作用。

操作方式是latexmk运行pdflatex,检查 noteable 的输出是否存在缺少文件的错误,然后生成该文件,然后重新运行pdflatex

然而,我已经许多这样生成的文件,上述过程的每一步都只生成(然后重新运行,查找下一个丢失的文件,生成,重新运行...直到latexmk由于重新运行次数过多而放弃。)

显然我做错了什么,漏掉了一个关键的命令行选项或类似的东西。但仔细阅读手册并没有给我启发。请帮忙,好吗?

编辑:我知道我可以使用通用的 Makefile 规则来生成不受控制的文件latexmk,而文档则依赖于生成的文件。但我想知道如何做到这一点没有将依赖项添加到 Makefile,可以手动添加,也可以通过或()`或类似方法latexmk打印 Makefile 规则。-use-makeadd_cus_dep

编辑2:对此的 MWE:

生成文件:

test.pdf:
    latexmk -pdf -pdflatex="pdflatex -interaction=nonstopmode" -use-make test.tex

%.tex:
    echo "Foo" > $@

clean:
    rm foo* test.pdf

测试.tex:

\documentclass{article}

\begin{document}

\input{foo1}
\input{foo2}
\input{foo3}
\input{foo4}
\input{foo5}
\input{foo6}

\end{document}

编辑3:附注:latexmk -CA不会删除生成。有一条消息“检查 foo1.log 中生成的文件”但foo1.tex仍然如此,这不是我所期望的“清晰全部“ 选项...

编辑4:这仅发生在\input如果我\include在上面的 MWE 中使用,一切都会按我预期的方式工作:所有自定义文件生成都会在第一遍中发生。我如何才能使用 获得这种行为\input

答案1

如果仔细查看运行的输出,您会发现在第一次运行时,pdflatex检测到第一个丢失的文件。由于使用了 nonstopmode,这会导致致命错误,并且pdflatex不会进一步发展。然后latexmk看到一条关于单个丢失文件的消息,生成它并重复运行。然后出现有关第二个丢失文件的错误,等等,出现您观察到的令人讨厌的现象。当\include使用 而不是 时,情况会有所不同\input。此宏的行为不同:丢失的文件不再是致命错误;相反,日志文件中有所有丢失文件的消息,所有这些都是在第一次运行时。

有两种解决方案。一种是运行pdflatex在正常模式下,它会停止并要求您更正文件名。只需按 Enter 键即可pdflatex继续,忽略丢失的文件。要自动执行此操作,请将第二行更改Makefile

latexmk -pdf -pdflatex="cat responses | pdflatex -interaction=nonstopmode" -use-make test.tex

其中responses是包含许多空白行的文件。

更系统的解决方案是\input用宏替换,当文件丢失时,它会发出警告而不是致命错误:

\documentclass{article}
\newcommand\inputA[1]{%
    \InputIfFileExists{#1}{}{\typeout{No file #1.}}%
}
\begin{document}
\inputA{foo1}
\inputA{foo2}
\inputA{foo3}
\inputA{foo4}
\inputA{foo5}
\inputA{foo6}
\end{document}

我已经用过这个技巧好几次了。

答案2

John Collins 的回答很好地概述了问题的原因。以下是他的修复更新。将 Makefile 中的行更改为

latexmk -pdf -pdflatex="yes '' | pdflatex -interaction=nonstopmode" -use-make test.tex

这就消除了对虚拟文件的需求(以及它的yes设计目的)。

相关内容