問題

問題

背景

latexmk工具可用於自動處理您的 LaTeX 檔案足夠多次以產生輸出。正如所討論的這裡這裡latexmk現在支援out_dir將建置產品傳遞到-output-directory並將pdflatex建置產品放置在此備用位置的設定。不幸的是,這使得它很難latexmk與 一起使用feynmp

問題

如何配置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

v. 4.30a進行了更新latexmk,解決了使用該-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.

相關內容