Pergunta

Pergunta

Fundo

A latexmkferramenta pode ser usada para processar automaticamente seus arquivos LaTeX vezes suficientes para gerar a saída. Conforme discutidoaquieaqui, latexmkagora oferece suporte à configuração out_dirque transmite e -output-directorycoloca pdflatexprodutos de construção neste local alternativo. Infelizmente, isso dificulta o uso latexmkcom feynmp.

Pergunta

Como posso configurar latexmkpara chamar mposto processamento de diagramas de Feynman gerados por feynmp? Principalmente usando a nova out_dirconfiguração?

Resposta Parcial 1

Pode-se tentar adicionar uma regra personalizada ao latexmkrcarquivo como

add_cus_dep('mp', '1', 0, 'mpost');
sub mpost {
    system("mpost $_[0]");
}

mas isso falha de três maneiras: 1) se houver múltiplas imagens, as extensões .1mudam e não fica claro como especificar todas as dependências. 2) Não sei dizer latexmkque pdflatexprecisa ser executado novamente após a geração da figura. 3) Mesmo que out_dirseja especificado, latexmkainda executa o mpostcomando no diretório de origem, perdendo assim os .mparquivos gerados.

Resposta Parcial 2

Como sugeridonesta resposta, pode-se utilizar a -shell-escapeopção de pdflatexpermitir que os valores sejam processados ​​pela chamada para pdflatex. Infelizmente, a chamada para mpostainda ocorre no diretório de nível superior. Existe alguma maneira de -output-directorygarantir que os comandos do shell sejam executados no local apropriado?

Aqui está um MWE demonstrando esta segunda tentativa:

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}

Responder1

Há uma atualização para o latexmk, v. 4.30a, que resolve alguns problemas com o uso da -output-directoryopção. Eu recomendaria atualizar.

Aqui está uma solução que funciona com a versão 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 deve ser colocado em um latexmkrcarquivo.

O código acima resolve o problema de persuadir mposta colocar seus arquivos de saída no diretório apropriado. A nova versão do latexmkresolve o outro problema que em uma primeira execução, quando o .1arquivo não existe, latexmkera necessário detectar a condição do arquivo ausente e executar o mpost.

Pelo que eu sei, não causa problema que, se houver várias imagens, mpostgere arquivos com extensões como .NNN, onde NNNé um número inteiro. Nesta situação, ainda existe um arquivo com extensão .1, e isso é suficiente para acionar o uso correto de mpost.

informação relacionada