%20del%20mismo%20archivo%20tex%20con%20arara.png)
Doy cursos universitarios y mi objetivo es poder generar dos pdf
del mismo tex
archivo:
- un conjunto de problemas
- Un conjunto de problemas con soluciones.
Ya hago esto manualmente llamando \newif
y luego configurando \soltrue
o \solfalse
en el encabezado dependiendo de si quiero generar soluciones o no. Luego rodeo las soluciones \ifsol
y \fi
nos vamos a las carreras. Es fantástico porque las ediciones del conjunto de problemas requieren cambios en un solo documento, no en dos. La única molestia es que tengo que compilarlo una vez, cambiar el pdf
nombre, luego cambiar el encabezado de \soltrue
a \solfalse
y luego volver a compilar para obtener ambos documentos. Me gustaría utilizar arara
para automatizar esto.
He estado siguiendo este excelente.cómoen crear una yaml
regla para poder arara
hacer lo que quiero. En el procedimiento, el autor (cmhughes) crea una regla para compilar un tex
documento en dos pdf
, uno con una columna y el otro con dos. Obviamente mi aplicación es ligeramente diferente.
He creado la siguiente solutions.yaml
regla:
!config
# Make two versions of document depending on if statement "sol"
# author: Shane Auerbach (based on work by Chris Hughes)
# requires arara 3.0+
#
# Sample usage
#
# % arara: solutions
# % arara: solutions: {solutions: true}
# % arara: solutions: {solutions: false}
#
identifier: solutions
name: Solutions
commands:
- <arara> pdflatex "\newif\ifsol\sol@{trigger}\input{@{file}}"
- <arara> @{ isWindows( "cmd /c move", "mv" ) } @{getBasename(file)}.pdf @{getBasename(file)}@{trigger.toUpperCase()}.pdf
arguments:
- identifier: trigger
flag: <arara> @{parameters.trigger}
default: false
Y este es el mytex.tex
archivo de prueba:
% arara: solutions: {trigger: true}
% arara: solutions: {trigger: false}
\documentclass{article}
\begin{document}
Question: What is $2+2$?
\ifsol \begin{quote} \textbf{Solution:} $2+2=3$ \end{quote} \fi
\end{document}
Funciona muy bien. Cuando ejecuto arara
el tex
archivo, genera dos pdf
, uno con la solución y otro sin ella, según se desee. Hay dos mejoras que me gustaría hacer pero no sé cómo implementarlas:
Tal como está, actualmente solo puedo compilar el
tex
archivo,arara
ya que el archivo en sí no tiene ni\soltrue
contenido\solfalse
. Me gustaría poder poner algo que lo configure si y solo si aún no lo ha configuradoarara
para poder compilarlo fuera dearara
también. Pero no quiero que sobrescribaarara
la configuración, ya que esto frustraría el propósito. ¿Algunas ideas?Actualmente los
pdf
archivos generados se llamanmytexTRUE.pdf
(con soluciones) ymytexFALSE.pdf
(sin soluciones). Preferiría tener algo comomytexS.pdf
(con soluciones) ymytexQ.pdf
(sin soluciones). La única forma en que se me ocurre implementar esto sería una declaración condicional ensolutions.yaml
, pero por lo que he leído,yaml
en realidad no está diseñado para declaraciones condicionales. ¿Alguna idea en este frente?
Si has leído hasta aquí, eres un verdadero héroe. ¡Gracias! Si te saltaste la mitad, tl;dr: ayuda a este extraño a hacer que su flujo de trabajo sea un poco más eficiente.
Respuesta1
Una posible forma de lograr la primera mejora es explotando \ifdefined
en lugar de depender de un \newif
, como en el código original. Veamos el nuevo código TeX:
\documentclass{article}
\begin{document}
Question: What is $2+2$?
\ifdefined\solutionflag\begin{quote} \textbf{Solution:} $2+2=3$ \end{quote}\fi
\end{document}
El plan aquí es sencillo: si \solutionflag
se define, se procesará ese extracto de código en particular. La idea es muy similar a usar \if<flag>
, pero no se queja si este artilugio no está configurado.:)
El código anterior normalmente se puede compilar con su motor favorito y no requiere arara
. Si desea imprimir las respuestas, simplemente escriba \def\solutionflag{}
en algún lugar del preámbulo y listo.
Actualizar:esta respuesta se actualiza con una regla para la versión 4.0+. Consulte el historial de ediciones para ver versiones anteriores.
Echemos un vistazo a esta regla mejorada:
!config
identifier: solutions
name: Solutions
authors:
- A duck
commands:
- name: The engine
command: >
@{
prefix = isTrue(solutions, '\\def\\solutionflag{}', '');
input = '\\input{' + reference.getName() + '}';
return getCommand(engine, prefix + input, options);
}
- name: The renaming procedure
command: >
@{
separator = java.io.File.separator;
prefix = [];
if (isUnix()) {
prefix = [ 'mv' ];
}
else {
prefix = [ 'cmd', '/c', 'move' ];
}
parent = reference.getParent();
input = parent + separator + getBasename(reference) + '.pdf';
output = parent + separator + name + '.pdf';
return getCommand(prefix, input, output);
}
arguments:
- identifier: engine
flag: >
@{
if ([ 'pdflatex', 'latex', 'xelatex',
'lualatex' ].contains(parameters.engine)) {
return parameters.engine;
}
else {
throwError('The provided engine is not valid');
}
}
default: pdflatex
- identifier: name
flag: >
@{
return parameters.name;
}
required: true
- identifier: solutions
flag: >
@{
return isTrue(parameters.solutions);
}
default: >
@{
return false
}
- identifier: options
flag: >
@{
if (isList(parameters.options)) {
return parameters.options;
}
else {
throwError('I was expecting a list of options.');
}
}
Los argumentos de la regla:
engine
: cadena, opcional, configura el motor. Las opciones posibles sonpdflatex
, ylatex
. Por defecto: .xelatex
lualatex
pdflatex
solutions
: booleano natural, opcional, establece si la macro de solución se definirá en el alcance del documento. Por defecto:false
.name
: cadena, obligatoria, establece el nombre del documento. El nombre del documento cambiará a este valor. No es necesario especificar la.pdf
extensión.options
: lista, opcional, establece la lista de parámetros de línea de comando adicionales que se proporcionarán al motor.
Una ejecución de muestra:
% arara: solutions: { solutions: true, name: 'answers' }
% arara: solutions: { solutions: false, name: 'questions' }
\documentclass{article}
\begin{document}
Question: What is $2+2$?
\ifdefined\solutionflag\begin{quote} \textbf{Solution:} $2+2=3$ \end{quote}\fi
\end{document}
Al ejecutarlo con arara
:
[paulo@cambridge ~] $ $ arara test.tex
__ _ _ __ __ _ _ __ __ _
/ _` | '__/ _` | '__/ _` |
| (_| | | | (_| | | | (_| |
\__,_|_| \__,_|_| \__,_|
Processing 'test.tex' (size: 264 bytes, last modified: 03/22/2020
06:54:54), please wait.
(Solutions) The engine .................................. SUCCESS
(Solutions) The renaming procedure ...................... SUCCESS
(Solutions) The engine .................................. SUCCESS
(Solutions) The renaming procedure ...................... SUCCESS
Total: 1.25 seconds
Obtenemos el siguiente resultado:
[paulo@cambridge ~] $ ls *.pdf
answers.pdf questions.pdf
Otra sugerencia interesante es mejorar la semántica de sus documentos creando un entorno para mostrar soluciones de forma selectiva. David Carlisle sugirió amablemente el siguiente código (le debo $5):
\newenvironment{solution}{\ifdefined\solutionflag\else\setbox0\vbox\fi\bgroup}{\par\egroup}
¡Espero eso ayude!:)