背景
该latexmk
工具可用于自动处理 LaTeX 文件足够多次以生成输出。如前所述这里和这里,现在支持将传递到并将构建产品放置在此备用位置的latexmk
设置。不幸的是,这使得它很难与一起使用。out_dir
-output-directory
pdflatex
latexmk
feynmp
问题
如何配置调用latexmk
来mpost
处理生成的费曼图feynmp
?特别是使用新out_dir
配置?
部分答案 1
可以尝试向文件添加自定义规则,latexmkrc
例如
add_cus_dep('mp', '1', 0, 'mpost');
sub mpost {
system("mpost $_[0]");
}
但这在三个方面失败了:1)如果有多个图像,则扩展名.1
会发生变化,并且不清楚如何指定所有依赖项。2)我不知道如何判断在生成图形后latexmk
需要pdflatex
再次运行。3)即使out_dir
指定了,仍然会在源目录中latexmk
运行命令,从而丢失生成的文件。mpost
.mp
部分答案 2
根据建议在这个答案中,可以使用-shell-escape
选项pdflatex
允许通过调用来处理图形pdflatex
。不幸的是,对的调用mpost
仍然发生在顶级目录中。是否有某种使用方法来-output-directory
确保 shell 命令在适当的位置执行?
以下是演示第二次尝试的 MWE:
latexmkrc
mkdir _build;
$out_dir = '_build';
$pdflatex="pdflatex -shell-escape -interaction=nonstopmode %O %S";
tst.tex
\documentclass{scrbook}
\usepackage{feynmp}
\usepackage{etoolbox}
\DeclareGraphicsRule{*}{mps}{*}{}
\makeatletter
\show\endfmffile
\preto{\endfmffile}{\let\the@fmffile\thefmffile}
\appto{\endfmffile}{
\ifnum\pdfshellescape=\@ne
\immediate\write18{mpost \the@fmffile}%
\else
\message{
Run pdf(la)tex with -shell-escape to generate feynmp diagrams}
\fi
\let\the@fmffile\relax
}
\makeatother
\begin{document}
\begin{fmffile}{title}
\begin{fmfgraph}(40,25)
\fmfleft{i1,i2}
\fmfright{o1,o2}
\fmf{fermion}{i1,v1,o1}
\fmf{fermion}{i2,v2,o2}
\fmf{photon}{v1,v2}
\end{fmfgraph}
\end{fmffile}
\end{document}
答案1
有更新latexmk
版本 4.30a,解决了使用该-output-directory
选项的一些问题。我建议升级。
以下是适用于 v. 4.30a 的解决方案latexmk
:
$out_dir = 'output';
add_cus_dep('mp', '1', 0, 'mpost');
sub mpost {
my $file = $_[0];
my ($name, $path) = fileparse( $file );
pushd( $path );
my $return = system "mpost $name" ;
popd();
return $return;
}
将被放入latexmkrc
文件中。
上述代码解决了将mpost
其输出文件放入适当目录的问题。 的新版本latexmk
解决了另一个问题,即在第一次运行时,当文件.1
不存在时,latexmk
需要检测文件缺失情况并运行mpost
。
据我所知,如果有多张图片,mpost
生成带有扩展名的文件.NNN
(其中NNN
是整数)不会造成问题。在这种情况下,仍然有一个带有扩展名的文件.1
,这足以触发正确的使用mpost
。