
Ich möchte einige Tutorials für meine Studenten schreiben und verwende hierfür die exam
Dokumentklasse und die solution
Umgebung.
jetzt ist das Problem, ich habe eine Aussage
\printanswers
dass ich für das Tutorial einen Kommentar hinterlassen und für die Lösung die Kommentare entfernen muss.
Ich hatte gehofft, dass es eine Möglichkeit gibt, es einmal zu kompilieren und die Quelldatei (sagen wir tutorial.tex) zwei PDFs erstellt -
- tutorial.pdf (ohne Lösungen)
- tutorialSolution.pdf (mit Lösungen)
Nachfolgend mein Quellcode -
\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}
Vielen Dank für jede Hilfe, die Sie leisten können. Gaurav
Antwort1
Hier ist eine Methode, die mir für die Verwaltung dieser Art von Arbeitsablauf vorschwebte.
Sie erstellen 3 Dateien. Die erste ist Ihre Hauptdatei, tutorial.tex
sagen wir:
\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}
Die anderen beiden sind Wrapper. Dies könnten beispielsweise sein tutorialQuestions.tex
:
\documentclass{exam}
\input{tutorial}
Und tutorialSolutions.tex
:
\documentclass{exam}
\printanswers
\input{tutorial}
Sie können dann separat kompilieren tutorialSolutions.tex
, tutorialQuestions.tex
ohne die andere Version zu überschreiben. Oder Sie können ein Skript verwenden, das dies für Sie erledigt. (Wie das geht, hängt von Ihrem Betriebssystem ab.) Es ist auch möglich, verschiedene Helfer mit TeX zu verwenden, um vieles davon zu erledigen und/oder Ihre IDE Dinge automatisieren zu lassen. Das Obige ist jedoch die Grundidee, die Sie dann auf die Weise einbetten, die am besten zu Ihren bevorzugten Tools passt.
Antwort2
WährendcfrDie Antwort von ist sehr schön und allgemein gehalten, ich bin auch auf dieses Problem gestoßen und wollte eine spezifische Lösung mit einer IDE vorstellen,TeXstudio.
Um dies zu erreichen, habe ich eineBenutzerbefehl( Preferences > Build > User Commands
) als
"/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"
wo compile-exam.py
ist ein Python-Skript, das ich geschrieben habe (verfügbarHier):
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)
Von hier aus definiere ich eine Tastenkombination zum Ausführen des Befehls ( Preferences > Shortcuts > Tools > User
)
Mit dieser Tastenkombination erstellt der Compiler die Lösungsdatei exam1.pdf
und exam1Solutions.pdf
zeigt sie im integrierten Viewer an (mit der Möglichkeit, weiterhin zum Speicherort der letzten Bearbeitung usw. zu scrollen).
Beachten Sie auch, dass Sie entweder zuerst aufrufen python
oder das Skript ausführbar machen und #!/usr/bin/python
in der ersten Zeile etwas wie hinzufügen müssen.
Dies ist offensichtlich keine allgemeine Lösung und erfordert den Aufruf eines externen Programms, aber es funktioniert gut und in angemessener Zeit.