假设我正在教一门课,我想用这个exam
包来写一份家庭作业。我知道我可以编译两个不同的 PDF 文档——一个包含解决方案,使用\documentclass[answers]{exam}
,另一个不包含解决方案,使用\documentclass{exam}
。(或者,我可以制作带有和不带有指令的版本\printanswers
。)
然而,如果学生使用 LaTeX 排版自己的解决方案,理想的方法是创建两个不同的来源两个版本的 LaTeX 文件——一个有解决方案,一个没有。然后,我可以分发无解决方案版本的文件.tex
(也许除了无解决方案版本的文件之外.pdf
),学生就不必担心手动重新输入问题陈述。
考虑到这一点,是否有任何易于自动化的方法来创建已删除解决方案的给定 LaTeX 源文件的副本?
答案1
这是我的想法;我很好奇是否还有更简单或更强大的选择。
我的解决方案是针对 UNIX 的,并使用一个名为gpp
,尽管有可能用其他替代通用宏处理器喜欢m4
。
该文件input.tex
如下所示:
\documentclass[answers,12pt]{exam}
\begin{document}
\begin{questions}
\question Here is a question
\begin{solution}\hideSolution{
Here is a lengthy solution.
It may contain many paragraphs.
}\end{solution}
\end{questions}
\end{document}
那么相关命令为:
# To generate the with-solutions .tex file:
gpp input.tex -T -o solutions.tex -D'hideSolution(a)=\a'
# To generate the no-solutions .tex file:
gpp input.tex -T -o problems.tex -D'hideSolution(a)='
该-T
选项告诉gpp
使用 LaTeX 风格的宏(而不是 C 风格的宏)。
这种方法的主要缺点是您必须记住添加一个特殊命令,\hideSolution{...}
——否则解决方案实际上不会被删除。(因此,在分发给学生之前,最好实际运行pdflatex
无解决方案.tex
文件并预览结果。)另一个缺点是,input.tex
如果不先运行,LaTeX 就无法处理gpp
。
正如 vonbrand 提到的,更好的方法可能是编写 Perl 或 Python 脚本来预处理特定环境(如\begin{solution}...\end{solution}
),以便将其内容从“无解决方案”版本中删除。但这需要大量容易出错的自定义编码,如果存在解决方案,那么重用其他人的解决方案会很棒。
答案2
例如,您可以将问题和答案写入环境(您适当定义)中,然后使用外部脚本(例如 Perl 或 Python)去除答案,只向您的学生提供 LaTeX 中的问题。
或者使用类似将答案发送到新文件的软件包answers
,并分别排版问题和答案。只需将包含问题的 PDF 交给学生即可。
答案3
对于家庭作业(只有几个问题)来说,这太过分了。我只是制作了一份家庭作业讲义,并enumerate
给问题编号。每一项都有一条注释,标明其位置,例如% 20151h4
年份/学期/家庭作业/问题(a
如果有子问题,甚至等等)。答案我写在另一个文件中,以相同的方式标记(这样它们很容易匹配,以便以后收集问题和解决方案)。这样我就可以将排版的问题和相应的完整来源交给学生(供参考,如果他们需要复制符号等)。完整的解决方案可以稍后发布,并交给助教进行评分。在我看来,要求学生在交卷中重复问题是没有意义的。