
Вотвечатьна вопрос о компиляции двух версий документа из источника 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
задачу генерации нескольких выходных файлов из одного исходного файла.
Скрипт-обертка действительно является наиболее очевидным способом сделать то, что нужно. Однако я вижу, что данная командная строка использует опцию
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
Другой метод, который я использовал, — это иметь файл драйвера .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 &" );
}
Работы выполняются параллельно. Это работает для меня, и вы можете адаптировать это к своему случаю.