
Fondo
La latexmk
herramienta se puede utilizar para procesar automáticamente sus archivos LaTeX suficientes veces para generar el resultado. Como se discutioaquíyaquí, latexmk
ahora admite la configuración out_dir
que pasa -output-directory
y pdflatex
coloca los productos de compilación en esta ubicación alternativa. Desafortunadamente, esto dificulta su uso latexmk
con feynmp
.
Pregunta
¿Cómo puedo configurar latexmk
para solicitar mpost
el procesamiento de diagramas de Feynman generados por feynmp
? ¿Especialmente usando la nueva out_dir
configuración?
Respuesta parcial 1
Se puede intentar agregar una regla personalizada al latexmkrc
archivo como
add_cus_dep('mp', '1', 0, 'mpost');
sub mpost {
system("mpost $_[0]");
}
pero esto falla de tres maneras: 1) si hay varias imágenes, entonces las extensiones .1
cambian y no está claro cómo especificar todas las dependencias. 2) No sé cómo saber latexmk
si pdflatex
es necesario ejecutarlo nuevamente después de generar la figura. 3) Incluso si out_dir
se especifica, latexmk
aún ejecuta el mpost
comando en el directorio de origen, por lo que faltan los .mp
archivos generados.
Respuesta parcial 2
Como se sugiereen esta respuesta, se puede utilizar la -shell-escape
opción de pdflatex
para permitir que las cifras sean procesadas mediante la llamada a pdflatex
. Lamentablemente, la llamada a mpost
todavía se realiza en el directorio de nivel superior. ¿Existe alguna forma de utilizarlo -output-directory
para garantizar que los comandos de Shell se ejecuten en el lugar apropiado?
Aquí hay un MWE que demuestra este segundo intento:
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}
Respuesta1
Hay una actualización de latexmk
la versión 4.30a que resuelve algunos problemas con el uso de la -output-directory
opción. Recomiendo actualizar.
Aquí hay una solución que funciona con la versión 4.30a de 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;
}
que se va a poner en un latexmkrc
archivo.
El código anterior resuelve el problema de persuadir mpost
para que coloque sus archivos de salida en el directorio apropiado. La nueva versión de latexmk
resuelve el otro problema que en una primera ejecución, cuando el .1
archivo no existe, latexmk
necesitaba detectar la condición del archivo faltante y ejecutarlo mpost
.
Hasta donde puedo decir, no causa problema que si hay varias imágenes, mpost
genere archivos con extensiones como .NNN
, donde NNN
es un número entero. En esta situación, todavía hay un archivo con extensión .1
, y esto es suficiente para activar el uso correcto de mpost
.