
Em umresponderpara uma pergunta sobre a compilação de duas versões de um documento a partir de uma fonte de látex do stackoverflow, o seguinte comando é usado para resolver o problema:
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
é chamado duas vezes e é simples colocar isso em um script wrapper. Porém estou curioso para saber se também é possível configurar um .latexmkrc
arquivo de forma que ele execute automaticamente os dois trabalhos quando você ligar latexmk file.tex
. Também é possível que ambos os trabalhos sejam executados em paralelo (para usar vários núcleos da sua CPU)?
Então, como posso configurar um .latexmkrc
arquivo para fazer isso? Isso pode ser possível é indicadoaqui(pág. 105, Consequências).
Responder1
Não conheço nenhuma maneira de fazer isso puramente internamente latexmk
, certamente nada que seja fácil e simples. Suspeito que o comentário sobre latexmk
o referidohttps://www.ntg.nl/maps/45/06.pdffoi feito sem investigar em detalhes como realizar latexmk
a tarefa de gerar vários arquivos de saída a partir de um arquivo de origem.
Um script wrapper é de fato a maneira mais óbvia de fazer o que é necessário. No entanto, vejo que a linha de comando fornecida usa a opção
latexmk
's-pdflatex=...
para fornecer opções parapdflatex
. Como todas as opções são suportadas porlatexmk
, é mais simples (e acho melhor) de usarlatexmk -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
Outro método que usei é ter um arquivo .tex de driver que simplesmente define a variável relevante (neste caso
\version
) e depois insere o arquivo principal. Achei isso bastante conveniente. Evita código TeX duplicado, ao mesmo tempo que ter os dois arquivos .tex torna mais transparente como a versão da solução é feita. Também evita ter que usar uma linha de comando especial paralatexmk
oupdflatex
.
Neste caso, myfile_solution.tex
poderia ser
\newcommand{\version}{}
\input{myfile}
Eu também equiparia myfile.tex
algo que daria um comportamento adequado se \version
não estivesse definido. Por exemplo, a primeira linha poderia ser
\providecommand{\version}{noanswer}
que só define \version
se ainda não estiver definido.
Responder2
Eu uso um latexmkrc para produzir automaticamente 2 versões da mesma fonte de tex. No meu caso, estou usando o pacote de exames. Uma versão é a resposta e a outra versão é o exame, questionário ou teste.
Na minha fonte tex, tenho uma linha que seleciona a versão do documento a ser compilada. O comando \noprintanswers é fornecido pelo pacote do exame.
\ifdefined\answersflag\noprintanswers\else\printanswers \fi
Esta é a parte relevante do meu .latexmkrc que fica na mesma pasta da minha fonte 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 &" );
}
Os trabalhos são executados em paralelo. Está funcionando para mim e você pode adaptá-lo ao seu caso.