参照这个问题,我发现在生成的文档中拥有多个自定义生成的文件latexmk
对我来说实际上不起作用。
操作方式是latexmk
运行pdflatex
,检查 noteable 的输出是否存在缺少文件的错误,然后生成该文件,然后重新运行pdflatex
。
然而,我已经许多这样生成的文件,上述过程的每一步都只生成一(然后重新运行,查找下一个丢失的文件,生成那,重新运行...直到latexmk
由于重新运行次数过多而放弃。)
显然我做错了什么,漏掉了一个关键的命令行选项或类似的东西。但仔细阅读手册并没有给我启发。请帮忙,好吗?
编辑:我知道我可以使用通用的 Makefile 规则来生成不受控制的文件latexmk
,而文档则依赖于生成的文件。但我想知道如何做到这一点没有将依赖项添加到 Makefile,可以手动添加,也可以通过或()`或类似方法latexmk
打印 Makefile 规则。-use-make
add_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
设计目的)。