Вызов двух заданий из latexmk автоматически

Вызов двух заданий из latexmk автоматически

Вотвечатьна вопрос о компиляции двух версий документа из источника Latex со stackoverflow для решения проблемы используется следующая команда:

latexmk -pdf -pdflatex="pdflatex -synctex=1 -interaction=nonstopmode -shell-escape" -jobname=myfile -pretex="\newcommand{\version}{noanswer}" -usepretex myfile.tex | latexmk -pdf -pdflatex="pdflatex -synctex=1 -interaction=nonstopmode -shell-escape" -jobname=myfile_solution -pretex="\newcommand{\version}{}" -usepretex myfile.tex "

latexmkвызывается дважды, и его просто поместить в скрипт-обертку. Однако мне интересно, возможно ли также настроить файл .latexmkrcтаким образом, чтобы он автоматически выполнял обе задачи при вызове latexmk file.tex. Возможно ли также, чтобы обе задачи выполнялись параллельно (для использования нескольких ядер вашего процессора)?

Итак, как мне настроить .latexmkrcфайл, чтобы это сделать? Это может быть возможно, указаноздесь(стр. 105, Последствия).

решение1

Я не знаю способа сделать это чисто внутри latexmk, конечно, ничего, что было бы легко и просто. Я подозреваю, что комментарий о latexmkв упомянутомhttps://www.ntg.nl/maps/45/06.pdfбыло сделано без детального исследования того, как выполнить latexmkзадачу генерации нескольких выходных файлов из одного исходного файла.

  1. Скрипт-обертка действительно является наиболее очевидным способом сделать то, что нужно. Однако я вижу, что данная командная строка использует опцию latexmk's -pdflatex=...для предоставления опций pdflatex. Поскольку все опции поддерживаются latexmk, поэтому проще (и я думаю лучше) использовать

     latexmk -pdf -synctex=1 -interaction=nonstopmode -shell-escape -jobname=myfile -pretex="\newcommand{\version}{noanswer}" -usepretex myfile.tex
     latexmk -pdf -synctex=1 -interaction=nonstopmode -shell-escape -jobname=myfile_solution -pretex="\newcommand{\version}{}" -usepretex myfile.tex
    
  2. Другой метод, который я использовал, — это иметь файл драйвера .tex, который просто устанавливает соответствующую переменную (в данном случае \version), а затем вводит основной файл. Я нашел это довольно удобным. Это позволяет избежать дублирования кода TeX, в то время как наличие двух файлов .tex делает более прозрачным то, как создается версия решения. Это также позволяет избежать необходимости использовать специальную командную строку для latexmkили pdflatex.

В этом случае myfile_solution.texможет быть

    \newcommand{\version}{}
    \input{myfile}

Я бы также снабдил myfile.texчем-то, что давало бы правильное поведение, если \versionне определено. Например, первая строка могла бы быть

  \providecommand{\version}{noanswer}

который определяет только \versionто, что еще не определено.

решение2

Я использую latexmkrc для автоматического создания 2 версий из одного и того же источника tex. В моем случае я использую пакет экзамена. Одна версия — это ключ к ответу, а другая — это экзамен, тест или контрольная работа.

В моем исходном тексте есть строка, которая выбирает версию документа для компиляции. Команда \noprintanswers предоставляется пакетом экзамена.

\ifdefined\answersflag\noprintanswers\else\printanswers \fi

Это соответствующая часть моего .latexmkrc, которая находится в той же папке, что и мой исходный текст tex.

my $filename = $ARGV[-1];
($base_name, $path, $ext) = fileparseB( $filename );
if  ($ext ne '.tex' ) {
   $file = "$base_name$ext";
}
else {
   $file = $base_name;
}

$tmp = 'blanks.tmp';
if (-e $tmp) {
   system( "rm $tmp" );
} else {
   system( "touch $tmp" );
   system( "latexmk -jobname=${file}blank -usepretex=\"\\def\\answersflag{}\" ${file} > ${file}blank.log &" );
}

Работы выполняются параллельно. Это работает для меня, и вы можете адаптировать это к своему случаю.

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