
Я хотел бы написать несколько учебных пособий для своих студентов, и для этого я использую exam
класс документа и solution
среду.
теперь проблема в том, что у меня есть заявление
\printanswers
что мне нужно прокомментировать для руководства и раскомментировать для решения.
Я надеялся, что есть способ, с помощью которого я смогу скомпилировать его один раз, а исходный файл (например, tutorial.tex) создаст два PDF-файла -
- tutorial.pdf (без решений)
- tutorialSolution.pdf (с решениями)
Ниже приведен мой исходный код:
\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}
спасибо за любую помощь, которую вы можете оказать. Гаурав
решение1
Вот что я имел в виду в качестве одного из методов, который вы могли бы использовать для управления этим типом рабочего процесса.
Вы создаете 3 файла. Первый — ваш основной файл, tutorial.tex
например:
\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}
Другие два — это обертки. Например, это могут быть tutorialQuestions.tex
:
\documentclass{exam}
\input{tutorial}
и tutorialSolutions.tex
:
\documentclass{exam}
\printanswers
\input{tutorial}
Затем вы можете скомпилировать tutorialSolutions.tex
и tutorialQuestions.tex
отдельно, не перезаписывая другую версию. Или вы можете использовать скрипт, который будет управлять этим за вас. (Как это сделать, зависит от вашей ОС.) Также можно использовать различные помощники с TeX, чтобы сделать многое из этого и/или заставить вашу IDE автоматизировать вещи. Однако вышеизложенное — это основная идея, которую вы затем встраиваете способом, наилучшим образом подходящим для ваших предпочитаемых инструментов.
решение2
Покаcfrответ очень хороший и общий, я тоже столкнулся с этой проблемой и хотел представить конкретное решение с использованием одной IDE,TeXstudio.
Чтобы достичь этого, я определилпользовательская команда( Preferences > Build > User Commands
) как
"/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"
где compile-exam.py
находится скрипт на Python, который я написал (доступенздесь):
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)
Отсюда я определяю сочетание клавиш для запуска команды ( Preferences > Shortcuts > Tools > User
)
Используя это сочетание клавиш, компилятор создаст exam1.pdf
и exam1Solutions.pdf
отобразит файл Solutions во встроенном средстве просмотра (с возможностью прокрутки до места последнего редактирования и т. д.).
Также обратите внимание, что вам нужно будет либо python
сначала вызвать, либо сделать скрипт исполняемым и добавить что-то вроде этого #!/usr/bin/python
в первой строке.
Это, конечно, не универсальное решение и требует вызова внешней программы, но оно работает хорошо и за разумное время.