Frage

Frage

Hintergrund

Mit dem latexmkTool können Sie Ihre LaTeX-Dateien so oft automatisch verarbeiten, dass die Ausgabe generiert wird. Wie bereits besprochenHierUndHier, latexmkunterstützt jetzt Einstellungen , die an out_dirübergeben und Build-Produkte an diesem alternativen Ort platzieren. Leider erschwert dies die Verwendung mit .-output-directorypdflatexlatexmkfeynmp

Frage

Wie kann ich latexmkden Aufruf mpostzur Verarbeitung der von generierten Feynman-Diagramme konfigurieren feynmp? Insbesondere mit der neuen out_dirKonfiguration?

Teilantwort 1

Man kann versuchen, der Datei eine benutzerdefinierte Regel hinzuzufügen, latexmkrcwie

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, latexmkdass es pdflatexnach der Generierung des Bildes erneut ausgeführt werden muss. 3) Auch wenn out_dirangegeben ist, latexmkwird der mpostBefehl trotzdem im Quellverzeichnis ausgeführt, wodurch die generierten .mpDateien fehlen.

Teilantwort 2

Wie vorgeschlagenin dieser Antwortkann man die -shell-escapeOption von verwenden pdflatex, um die Verarbeitung der Zahlen durch den Aufruf von zu ermöglichen pdflatex. Leider mposterfolgt der Aufruf von immer noch im obersten Verzeichnis. Gibt es eine Möglichkeit, mit -output-directorysicherzustellen, 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 latexmkv. 4.30a, das einige Probleme bei der Verwendung der -output-directoryOption 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, mpostdie Ausgabedateien in das entsprechende Verzeichnis zu legen. Die neue Version von latexmklöst das andere Problem, dass beim ersten Ausführen, wenn die .1Datei nicht existiert, latexmkder Zustand der fehlenden Datei erkannt und ausgeführt werden musste mpost.

Soweit ich das beurteilen kann, verursacht es kein Problem, dass bei mehreren Bildern mpostDateien mit Erweiterungen wie generiert werden .NNN, wobei es NNNsich 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.

verwandte Informationen