
背景
這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
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
.