
Hintergrund
Mit dem latexmk
Tool können Sie Ihre LaTeX-Dateien so oft automatisch verarbeiten, dass die Ausgabe generiert wird. Wie bereits besprochenHierUndHier, latexmk
unterstützt jetzt Einstellungen , die an out_dir
übergeben und Build-Produkte an diesem alternativen Ort platzieren. Leider erschwert dies die Verwendung mit .-output-directory
pdflatex
latexmk
feynmp
Frage
Wie kann ich latexmk
den Aufruf mpost
zur Verarbeitung der von generierten Feynman-Diagramme konfigurieren feynmp
? Insbesondere mit der neuen out_dir
Konfiguration?
Teilantwort 1
Man kann versuchen, der Datei eine benutzerdefinierte Regel hinzuzufügen, latexmkrc
wie
add_cus_dep('mp', '1', 0, 'mpost');
sub mpost {
system("mpost $_[0]");
}
aber das schlägt auf drei Arten fehl: 1) wenn mehrere Bilder vorhanden sind, .1
ändern sich die Erweiterungen und es ist nicht klar, wie alle Abhängigkeiten angegeben werden sollen. 2) Ich weiß nicht, wie ich feststellen kann, latexmk
dass es pdflatex
nach der Generierung des Bildes erneut ausgeführt werden muss. 3) Auch wenn out_dir
angegeben ist, latexmk
wird der mpost
Befehl trotzdem im Quellverzeichnis ausgeführt, wodurch die generierten .mp
Dateien fehlen.
Teilantwort 2
Wie vorgeschlagenin dieser Antwortkann man die -shell-escape
Option von verwenden pdflatex
, um die Verarbeitung der Zahlen durch den Aufruf von zu ermöglichen pdflatex
. Leider mpost
erfolgt der Aufruf von immer noch im obersten Verzeichnis. Gibt es eine Möglichkeit, mit -output-directory
sicherzustellen, dass Shell-Befehle an der richtigen Stelle ausgeführt werden?
Hier ist ein MWE, das diesen zweiten Versuch demonstriert:
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}
Antwort1
Es gibt ein Update auf latexmk
v. 4.30a, das einige Probleme bei der Verwendung der -output-directory
Option behebt. Ich würde ein Upgrade empfehlen.
Hier ist eine Lösung, die mit Version 4.30a von funktioniert 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;
}
welches in einer Datei abgelegt werden soll latexmkrc
.
Der obige Code löst das Problem, mpost
die Ausgabedateien in das entsprechende Verzeichnis zu legen. Die neue Version von latexmk
löst das andere Problem, dass beim ersten Ausführen, wenn die .1
Datei nicht existiert, latexmk
der Zustand der fehlenden Datei erkannt und ausgeführt werden musste mpost
.
Soweit ich das beurteilen kann, verursacht es kein Problem, dass bei mehreren Bildern mpost
Dateien mit Erweiterungen wie generiert werden .NNN
, wobei es NNN
sich um eine Ganzzahl handelt. In dieser Situation gibt es immer noch eine Datei mit der Erweiterung .1
, und dies reicht aus, um die korrekte Verwendung von auszulösen mpost
.