Llamar a dos trabajos desde latexmk automáticamente

Llamar a dos trabajos desde latexmk automáticamente

en unrespuestaa una pregunta sobre cómo compilar dos versiones de un documento desde una fuente de látex de stackoverflow, se usa el siguiente comando para resolver el 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 "

latexmkse llama dos veces y es sencillo ponerlo en un script contenedor. Sin embargo, tengo curiosidad por saber si también es posible configurar un .latexmkrcarchivo de tal manera que automáticamente haga ambos trabajos cuando lo llame latexmk file.tex. ¿También es posible que ambos trabajos se ejecuten en paralelo (para usar varios núcleos de su CPU)?

Entonces, ¿cómo puedo configurar un .latexmkrcarchivo para hacer esto? Eso es posible, está indicado.aquí(pág. 105, Consecuencias).

Respuesta1

No conozco ninguna manera de hacer esto puramente internamente latexmk, ciertamente nada que sea fácil y simple. Sospecho que el comentario sobre latexmkel mencionadohttps://www.ntg.nl/maps/45/06.pdfSe realizó sin investigar en detalle cómo llegar latexmka realizar la tarea de generar múltiples archivos de salida a partir de un archivo fuente.

  1. De hecho, un script contenedor es la forma más obvia de hacer lo que se necesita. Sin embargo, veo que la línea de comando dada usa la opción latexmk's' -pdflatex=...para proporcionar opciones a pdflatex. Dado que todas las opciones son compatibles con latexmk, es más sencillo (y creo que mejor) 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. Otro método que he usado es tener un archivo .tex de controlador que simplemente establece la variable relevante (en este caso \version) y luego ingresa el archivo principal. Lo he encontrado bastante conveniente. Evita la duplicación de código TeX, mientras que tener los dos archivos .tex hace que sea más transparente cómo se crea la versión de la solución. También evita tener que utilizar una línea de comando especial para latexmko pdflatex.

En este caso, myfile_solution.texpodría ser

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

También me equiparía myfile.texcon algo que daría un comportamiento adecuado si \versionno está definido. Por ejemplo, la primera línea podría ser

  \providecommand{\version}{noanswer}

que sólo define \versionsi aún no está definido.

Respuesta2

Utilizo latexmkrc para producir automáticamente 2 versiones de la misma fuente de texto. En mi caso, estoy usando el paquete de examen. Una versión es la clave de respuestas y la otra versión es el examen, prueba o prueba.

En mi fuente de texto, tengo una línea que selecciona la versión del documento a compilar. El comando \noprintanswers lo proporciona el paquete del examen.

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

Esta es la parte relevante de mi .latexmkrc que se encuentra en la misma carpeta que mi fuente 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 &" );
}

Los trabajos se ejecutan en paralelo. A mí me está funcionando y es posible que puedas adaptarlo a tu caso.

información relacionada