我正在处理一个大型文档,其中包含多个技术组件的描述。我编写了几个宏,用于在 lualatex 编译文档期间触发“.uml”文件的自动创建。之后,这些文件可以传递给 plantUml,然后它会创建漂亮的“.png”图片,然后可以将其包含在文档中。所有这些都运行良好。
但是,我现在希望自动化这个过程,以便创建和包含图表不需要两次不同的 lualatex 调用,也不需要可能在“.tex”文件中添加“\includegraphics{}”。
为此,我尝试使用以下配置的 latexmk:
$pdflatex = 'lualatex %O %S ';
$pdf_mode = 1;
$postscript_mode = $dvi_mode = 0;
add_cus_dep('glo', 'gls', 0, 'run_makeglossaries');
add_cus_dep('acn', 'acr', 0, 'run_makeglossaries');
add_cus_dep('uml', 'png', 0, 'uml2png');
sub uml2png {
system( "java -cp plantuml.jar net.sourceforge.plantuml.Run -failfast2 -nbtread auto -charset UTF-8 -o . -v -tpng \"$_[0].uml\" \"$_[0].png\"" );
}
sub run_makeglossaries {
if ( $silent ) {
system( "makeglossaries -q \"$_[0]\"" );
}
else {
system( "makeglossaries -q \"$_[0]\"" );
};
}
push @generated_exts, 'uml', 'png';
push @generated_exts, 'glo', 'gls', 'glg';
push @generated_exts, 'acn', 'acr', 'alg';
$clean_ext .= ' %R.ist %R.xdy';
现在,当我尝试包含可以从“graph.uml”计算出来的“graph.png”时,“graph.uml”将在文档上第一次运行 lualatex 结束时创建,latexmk 中止告诉我该文件不存在。
为什么会发生这种情况? 如果我正确理解了 latexmk 的文档,则应该通过将“0”作为必需参数传递给来处理这种情况add_cus_dep(from, to, must, conv)
。
当然,当我提前创建所需的“uml”文件时,它们会正确转换,并且不会出现任何错误,但这缺乏自动化。调用lualatex -interaction=nonstopmode
也可以,但也不是一种选择。
您能帮我找到其他解决方案或解释该行为吗?
提前致谢。
编辑:
我通过检查 uml 文件是否已经存在(使用IfFileExists
)解决了该问题,即推迟包含生成的图形:
\newcommand{\generateDiagram}[1]{%
\IfFileExists{%
#1.uml%
}{%
\begin{figure}%
\includegraphics[width=\textwidth]{#1.png}%
\end{figure}%
}{%
\typeout{Error. No file #1.}%
}%
}%
在第二次运行中,自定义依赖关系被正确解析,并从.uml 文件创建所需的图片。
我现在面临的问题是,如果文件没有存储在主目录中,latexmk 似乎无法解析我的自定义依赖项。更准确地说,我有以下结构:
MAIN
|- FOO (uml goes here)
|- BAR
我调整了我的add_cus_dep
,以便从 MAIN/FOO 读取数据并存储在 MAIN/BAR 中。现在,假设pic.uml
在第一次运行中生成了一个,并且应该通过包含在第二次运行中\generateDiagram{pic}
。Latexmk 停止并告诉我pic.png
不存在(当然不存在),甚至没有查看依赖项。你能告诉我我哪里出错了吗?