我的文档包含由 PlantUML 生成的几个 PDF 文件。这些文件存储在文档目录下的不同目录中。到目前为止,我已经使用 shell 脚本和 Makefile 的组合创建了这些文件。今天我了解了 latexmk 的自定义依赖项。
我已将以下内容添加到我的.latexmkrc
:
add_cus_dep('puml', 'pdf', 0, 'puml2pdf');
sub puml2pdf { system( "plantuml -Djava.awt.headless=true -charset UTF-8 -tpdf \"$_[0].puml\" \"$_[0].pdf\" "); }
现在 latexmk 应该在第一次运行时检测到缺失的 PDF 文件,并且自定义依赖项应该按照定义启动运行plantuml
。不幸的是,它没有。lualatex
失败并出现错误,并且自定义依赖项永远不会写入.fls
文件:
LaTeX Warning: File `signservice_isignaturecore.pdf' not found on input line 529.
! Package luatex.def Error: File `signservice_isignaturecore.pdf' not found: using draft setting.
See the luatex.def package documentation for explanation.
Type H <return> for immediate help.
...
l.529 ...sinf.opmon.ieventsenderforoperationmonitor}
Try typing <return> to proceed.
If that doesn't work, type X <return> to quit.
! Output loop---200 consecutive dead cycles.
\AP@clearpage ...e \m@ne {}\vbox {}\penalty -\@Mi
l.529 ...sinf.opmon.ieventsenderforoperationmonitor}
I've concluded that your \output is awry; it never does a
\shipout, so I'm shipping \box\outputbox out myself. Next time
increase \maxdeadcycles if you want me to be more patient!
该错误可能是由以下构造引起的,在该构造中我旋转页面并尝试确保浮动元素不会距离引用它的文本太远:
\afterpage{%
\clearpage% Flush earlier floats (otherwise order might not be correct)
\begin{landscape}% Landscape page
\centering % Center table
{
\begin{figure}[htbp]
\hypertarget{fig:mod.signservice.core.isignaturecore}{%
\includegraphics[width=0.75\columnwidth,keepaspectratio]{signservice_isignaturecore.pdf}
\caption{Klassenhierarchie für \java{IsignatureCore}}
\label{fig:mod.signservice.core.isignaturecore}}
\end{figure}
}
\end{landscape}
\clearpage% Flush page
}
现在出现了两个问题:
尽管出现错误,我怎样才能说服
latexmk
将丢失的依赖项写入文件?.fls
为了
latexmk
首先识别依赖关系,它必须在-silent
模式下启动,否则lualatex
会停止并需要用户输入,这是正确的吗?在这种情况下,如果没有用户交互,latexmk 就不能在 CI/CD 环境中使用。
答案1
事实证明 latexmk 没有正确选择依赖项来运行自定义规则。发生这种情况的原因是\includegraphics
命令没有包含 PDF 文件的完整路径。以前这是不必要的,因为\graphicspath
文件顶部有一个宏。当然,latexmk 不知道\graphicspath
,所以它无法计算 PDF 源文件的正确位置。一旦我更改了它,就会找到正确的源文件,latexmk 就可以调用自定义依赖项。