Вопрос

Вопрос

Фон

Thelatexmk может быть использован для автоматической обработки файлов LaTeX достаточное количество раз для генерации выходных данных. Как обсуждалосьздесьиздесь, latexmkтеперь поддерживает настройку out_dir, которая передает -output-directoryto pdflatexи размещает продукты сборки в этом альтернативном месте. К сожалению, это затрудняет использование latexmkс feynmp.

Вопрос

Как настроить latexmkвызов mpostдля обработки диаграмм Фейнмана, сгенерированных feynmp? Особенно с использованием новой out_dirконфигурации?

Частичный ответ 1

Можно попробовать добавить пользовательское правило в latexmkrcфайл, например

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

но это не срабатывает по трем причинам: 1) если изображений несколько, то расширения .1меняются, и непонятно, как указать все зависимости. 2) Я не знаю, как определить, latexmkчто pdflatexнужно запустить снова после генерации рисунка. 3) Даже если out_dirуказано , команда latexmkвсе равно запускается mpostв исходном каталоге, тем самым пропуская сгенерированные .mpфайлы.

Частичный ответ 2

Как и предполагалосьв этом ответе, можно использовать -shell-escapeопцию , pdflatexчтобы разрешить обработку цифр вызовом pdflatex. К сожалению, вызов mpostвсе еще происходит в каталоге верхнего уровня. Есть ли какой-либо способ использования , -output-directoryчтобы гарантировать, что команды оболочки выполняются в соответствующем месте?

Вот MWE, демонстрирующий эту вторую попытку:

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}

решение1

Есть обновление для latexmkv. 4.30a, которое решает некоторые проблемы с использованием -output-directoryопции. Я бы рекомендовал обновиться.

Вот решение, которое работает с версией 4.30a 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;
}
который должен быть помещен в latexmkrcфайл.

Приведенный выше код решает проблему убеждения mpostпоместить выходные файлы в соответствующий каталог. Новая версия latexmkрешает другую проблему, которая заключается в том, что при первом запуске, когда .1файл не существует, latexmkнеобходимо обнаружить условие отсутствия файла и запустить mpost.

Насколько я могу судить, это не вызывает проблемы, если есть несколько изображений, mpostгенерирует файлы с расширениями типа .NNN, где NNN— целое число. В этой ситуации все еще есть файл с расширением .1, и этого достаточно, чтобы запустить правильное использование mpost.

Связанный контент