问题

问题

背景

latexmk工具可用于自动处理 LaTeX 文件足够多次以生成输出。如前所述这里这里,现在支持将传递到并将构建产品放置在此备用位置的latexmk设置。不幸的是,这使得它很难与一起使用。out_dir-output-directorypdflatexlatexmkfeynmp

问题

如何配置调用latexmkmpost处理生成的费曼图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

相关内容