
Fundo
A latexmk
ferramenta pode ser usada para processar automaticamente seus arquivos LaTeX vezes suficientes para gerar a saída. Conforme discutidoaquieaqui, latexmk
agora oferece suporte à configuração out_dir
que transmite e -output-directory
coloca pdflatex
produtos de construção neste local alternativo. Infelizmente, isso dificulta o uso latexmk
com feynmp
.
Pergunta
Como posso configurar latexmk
para chamar mpost
o processamento de diagramas de Feynman gerados por feynmp
? Principalmente usando a nova out_dir
configuração?
Resposta Parcial 1
Pode-se tentar adicionar uma regra personalizada ao latexmkrc
arquivo 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 .1
mudam e não fica claro como especificar todas as dependências. 2) Não sei dizer latexmk
que pdflatex
precisa ser executado novamente após a geração da figura. 3) Mesmo que out_dir
seja especificado, latexmk
ainda executa o mpost
comando no diretório de origem, perdendo assim os .mp
arquivos gerados.
Resposta Parcial 2
Como sugeridonesta resposta, pode-se utilizar a -shell-escape
opção de pdflatex
permitir que os valores sejam processados pela chamada para pdflatex
. Infelizmente, a chamada para mpost
ainda ocorre no diretório de nível superior. Existe alguma maneira de -output-directory
garantir 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-directory
opçã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 latexmkrc
arquivo.
O código acima resolve o problema de persuadir mpost
a colocar seus arquivos de saída no diretório apropriado. A nova versão do latexmk
resolve o outro problema que em uma primeira execução, quando o .1
arquivo não existe, latexmk
era 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, mpost
gere 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
.