
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 "
latexmk
se llama dos veces y es sencillo ponerlo en un script contenedor. Sin embargo, tengo curiosidad por saber si también es posible configurar un .latexmkrc
archivo 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 .latexmkrc
archivo 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 latexmk
el mencionadohttps://www.ntg.nl/maps/45/06.pdfSe realizó sin investigar en detalle cómo llegar latexmk
a realizar la tarea de generar múltiples archivos de salida a partir de un archivo fuente.
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 apdflatex
. Dado que todas las opciones son compatibles conlatexmk
, es más sencillo (y creo que mejor) 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
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 paralatexmk
opdflatex
.
En este caso, myfile_solution.tex
podría ser
\newcommand{\version}{}
\input{myfile}
También me equiparía myfile.tex
con algo que daría un comportamiento adecuado si \version
no está definido. Por ejemplo, la primera línea podría ser
\providecommand{\version}{noanswer}
que sólo define \version
si 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.