
Фон
Thelatexmk
может быть использован для автоматической обработки файлов LaTeX достаточное количество раз для генерации выходных данных. Как обсуждалосьздесьиздесь, latexmk
теперь поддерживает настройку out_dir
, которая передает -output-directory
to 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
Есть обновление для latexmk
v. 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
.