Chame dois jobs do latexmk automaticamente

Chame dois jobs do latexmk automaticamente

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 .latexmkrcarquivo 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 .latexmkrcarquivo 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 latexmko referidohttps://www.ntg.nl/maps/45/06.pdffoi feito sem investigar em detalhes como realizar latexmka tarefa de gerar vários arquivos de saída a partir de um arquivo de origem.

  1. 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 para pdflatex. Como todas as opções são suportadas por latexmk, é mais simples (e acho melhor) de usar

     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. 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 para latexmkou pdflatex.

Neste caso, myfile_solution.texpoderia ser

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

Eu também equiparia myfile.texalgo que daria um comportamento adequado se \versionnão estivesse definido. Por exemplo, a primeira linha poderia ser

  \providecommand{\version}{noanswer}

que só define \versionse 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.

informação relacionada