Tutoriales de redacción con clase de documento de examen, con y sin soluciones.

Tutoriales de redacción con clase de documento de examen, con y sin soluciones.

Me gustaría escribir algunos tutoriales para mis alumnos y para ello estoy usando la examclase de documento y el solutionentorno.

ahora el problema es que tengo una declaración

\printanswers

que necesito comentar para el tutorial y descomentar para la solución.

Esperaba que hubiera alguna forma de compilarlo una sola vez y que el archivo fuente (por ejemplo, tutorial.tex) creara dos archivos PDF:

  1. tutorial.pdf (sin soluciones)
  2. tutorialSolution.pdf (con soluciones)

El siguiente es mi código fuente:

\documentclass{exam} 
%\printanswers
\usepackage[T1]{fontenc}
\usepackage{pslatex}
 \usepackage[pdftex]{color}  
 \usepackage[pdftex]{graphicx}     

\begin{document}
\begin{questions}

\vskip 0.5 cm \question Question header \vskip 0.5cm
Question text

\begin{solution}
Solution text
\end{solution}

\end{questions}
\end{document}

Gracias por cualquier ayuda que usted nos pueda proporcionar. gaurav

Respuesta1

Esto es lo que tenía en mente para un método que podría utilizar para gestionar este tipo de flujo de trabajo.

Creas 3 archivos. El primero es su archivo principal, tutorial.texdigamos:

\usepackage[T1]{fontenc}
\usepackage{pslatex}
 \usepackage[pdftex]{color}  
 \usepackage[pdftex]{graphicx}     

\begin{document}
\begin{questions}

\vskip 0.5 cm \question Question header \vskip 0.5cm
Question text

\begin{solution}
Solution text
\end{solution}

\end{questions}
\end{document}

Los otros dos son envoltorios. Por ejemplo, estos podrían ser tutorialQuestions.tex:

\documentclass{exam} 
\input{tutorial}

y tutorialSolutions.tex:

\documentclass{exam} 
\printanswers
\input{tutorial}

Luego puede compilar tutorialSolutions.texy tutorialQuestions.texpor separado sin sobrescribir la otra versión. O podría utilizar un script para gestionar esto por usted. (Cómo hacerlo depende de su sistema operativo). También es posible utilizar varios asistentes con TeX para hacer mucho de esto y/o hacer que su IDE automatice las cosas. Sin embargo, lo anterior es la idea básica que luego puedes incorporar de la manera que mejor se adapte a tus herramientas preferidas.

Respuesta2

MientrascfrLa respuesta de es muy buena y general. También me encontré con este problema y quería presentar una solución específica usando un IDE.TeXstudio.

Para lograr esto, definí uncomando de usuario( Preferences > Build > User Commands) como

"/path/to/script/compile-exam.py" %.tex -f | txs:///pdflatex | mv %.pdf %Solutions.pdf | mv %.synctex.gz %Solutions.synctex.gz | "/path/to/script/compile-exam.py" %.tex | txs:///pdflatex | txs:///view-pdf-internal "?m)Solutions.pdf"

¿Dónde compile-exam.pyestá un script en Python que escribí (disponible?aquí):

from argparse import ArgumentParser
import re
from shutil import copyfile

parser = ArgumentParser()
parser.add_argument('filename')
parser.add_argument('-f', '--forward', action='store_true')

args = parser.parse_args()
copyfile(args.filename, args.filename+'.bak')

basename = re.match(r".+(?=\.tex)", args.filename).group(0)

if args.forward:
    contents = []
    with open(args.filename, 'r') as in_file:
        for line in in_file:
            if r'\printanswers' in line:
                contents.append('\printanswers\n')
            else:
                contents.append(line)
    with open(args.filename, 'w') as out_file:
        for line in contents:
            out_file.write(line)
else:
    contents = []
    with open(args.filename, 'r') as in_file:
        for line in in_file:
            if r'\printanswers' in line:
                contents.append('%\printanswers\n')
            else:
                contents.append(line)
    with open(args.filename, 'w') as out_file:
        for line in contents:
            out_file.write(line)

Desde aquí, defino un atajo de teclado para ejecutar el comando ( Preferences > Shortcuts > Tools > User)


Usando este atajo de teclado, el compilador producirá exam1.pdfy exam1Solutions.pdfmostrará el archivo de Soluciones en el visor integrado (aún con la capacidad de desplazarse a la ubicación de la última edición, etc.).

También tenga en cuenta que deberá llamar pythonprimero o hacer que el script sea ejecutable y agregar algo como #!/usr/bin/pythonen la primera línea.

Obviamente, esta no es una solución general y requiere llamar a un programa externo, pero funciona bien y en un período de tiempo razonable.

información relacionada