Escrevendo tutoriais com aula de documentos de exame, com e sem soluções

Escrevendo tutoriais com aula de documentos de exame, com e sem soluções

Gostaria de escrever alguns tutoriais para meus alunos, e para isso estou utilizando a examclasse document e o solutionambiente.

agora o problema é que tenho uma declaração

\printanswers

que preciso comentar para o tutorial e descomentar para a solução.

Eu esperava que houvesse uma maneira de compilá-lo uma única vez, e o arquivo de origem (digamos tutorial.tex) criasse dois PDFs -

  1. tutorial.pdf (sem soluções)
  2. tutorialSolution.pdf (com soluções)

A seguir está meu código fonte -

\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}

obrigado por qualquer ajuda que você possa fornecer. Gaurav

Responder1

Aqui está o que eu tinha em mente para um método que você pode usar para gerenciar esse tipo de fluxo de trabalho.

Você cria 3 arquivos. O primeiro é o seu arquivo 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}

Os outros dois são invólucros. Por exemplo, estes podem ser tutorialQuestions.tex:

\documentclass{exam} 
\input{tutorial}

e tutorialSolutions.tex:

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

Você pode então compilar tutorialSolutions.texseparadamente tutorialQuestions.texsem substituir a outra versão. Ou você pode usar um script para gerenciar isso para você. (Como fazer isso depende do seu sistema operacional.) Também é possível usar vários auxiliares com o TeX para fazer muito disso e/ou fazer com que seu IDE automatize as coisas. No entanto, o que foi dito acima é a ideia básica que você incorpora da maneira que melhor se adapta às suas ferramentas preferidas.

Responder2

Enquantocfra resposta do é muito boa e genérica, também me deparei com esse problema e queria apresentar uma solução específica usando um IDE,TeXstudio.

Para conseguir isso, defini umcomando do usuário( 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"

onde compile-exam.pyestá um script python que escrevi (disponívelaqui):

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)

A partir daqui, defino um atalho de teclado para executar o comando ( Preferences > Shortcuts > Tools > User)


Usando este atalho de teclado, o compilador produzirá exam1.pdfe exam1Solutions.pdfexibirá o arquivo Solutions no visualizador integrado (ainda com a capacidade de rolar até o local da última edição, etc.).

Observe também que você precisará chamar pythonprimeiro ou tornar o script executável e adicionar algo como #!/usr/bin/pythonna primeira linha.

Obviamente, esta não é uma solução geral e requer a chamada de um programa externo, mas funciona bem e em um período de tempo razoável.

informação relacionada