Pregunta

Pregunta

Fondo

La latexmkherramienta se puede utilizar para procesar automáticamente sus archivos LaTeX suficientes veces para generar el resultado. Como se discutioaquíyaquí, latexmkahora admite la configuración out_dirque pasa -output-directoryy pdflatexcoloca los productos de compilación en esta ubicación alternativa. Desafortunadamente, esto dificulta su uso latexmkcon feynmp.

Pregunta

¿Cómo puedo configurar latexmkpara solicitar mpostel procesamiento de diagramas de Feynman generados por feynmp? ¿Especialmente usando la nueva out_dirconfiguración?

Respuesta parcial 1

Se puede intentar agregar una regla personalizada al latexmkrcarchivo 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 .1cambian y no está claro cómo especificar todas las dependencias. 2) No sé cómo saber latexmksi pdflatexes necesario ejecutarlo nuevamente después de generar la figura. 3) Incluso si out_dirse especifica, latexmkaún ejecuta el mpostcomando en el directorio de origen, por lo que faltan los .mparchivos generados.

Respuesta parcial 2

Como se sugiereen esta respuesta, se puede utilizar la -shell-escapeopción de pdflatexpara permitir que las cifras sean procesadas mediante la llamada a pdflatex. Lamentablemente, la llamada a mposttodavía se realiza en el directorio de nivel superior. ¿Existe alguna forma de utilizarlo -output-directorypara 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 latexmkla versión 4.30a que resuelve algunos problemas con el uso de la -output-directoryopció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 latexmkrcarchivo.

El código anterior resuelve el problema de persuadir mpostpara que coloque sus archivos de salida en el directorio apropiado. La nueva versión de latexmkresuelve el otro problema que en una primera ejecución, cuando el .1archivo no existe, latexmknecesitaba detectar la condición del archivo faltante y ejecutarlo mpost.

Hasta donde puedo decir, no causa problema que si hay varias imágenes, mpostgenere archivos con extensiones como .NNN, donde NNNes 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.

información relacionada