在使用考试类时,是否有办法编译所有问题并将它们放在文档开头?我希望最终结果看起来像以下代码的结果。首先是所有问题,然后是每个问题都有一个解决方案框。
\documentclass[answers]{exam}
\begin{document}
\begin{questions}
\question First Question
\question Second Question
\end{questions}
\newpage
\begin{questions}
\question First question
\begin{EnvFullwidth}
\begin{solutionbox}{2in}
This looks good,
\end{solutionbox}
\end{EnvFullwidth}
\question Second question
\begin{EnvFullwidth}
\begin{solutionbox}{2in}
Not so good.
\end{solutionbox}
\end{EnvFullwidth}
\end{questions}
\end{document}
有没有办法实现自动化,这样我只需要在一个地方输入问题,在编译时,它就会提取它们并创建第一部分?理想情况下,看起来像这样:
\documentclass[answers]{exam}
\begin{document}
\printallquestions
\newpage
\begin{questions}
\question First question
\begin{EnvFullwidth}
\begin{solutionbox}{2in}
This looks good,
\end{solutionbox}
\end{EnvFullwidth}
\question Second question
\begin{EnvFullwidth}
\begin{solutionbox}{2in}
Not so good.
\end{solutionbox}
\end{EnvFullwidth}
\end{questions}
\end{document}
答案1
以下方法似乎有效,尽管我预计可能会有更强大的解决方案。
将所有问题包含在一个命令中,然后在之后执行两次该命令\begin{document}
(一次使用,\noprintanswers
再次之后\printanswers
)。
我还添加了一个自定义环境,将每个解决方案包含在一个EnvFullwidth
环境中,这样您不必每次都手动执行此操作。
\documentclass{exam}
\newenvironment{mysolution}
{\begin{EnvFullwidth}
\begin{solution}
}
{
\end{solution}
\end{EnvFullwidth}
}
\newcommand{\myquestions}{%
\begin{questions}
\question First question
\begin{mysolution}
This looks good,
\end{mysolution}
\question Second question
\begin{mysolution}
Not so good.
\end{mysolution}
\end{questions}
}
\begin{document}
\noprintanswers
\myquestions
\newpage
\printanswers
\myquestions
\end{document}
答案2
使用 erik 的答案,我构建了我想要的 MWE,其中答案可以在第二部分显示或隐藏。但是,我仍然想要一个更干净的解决方案,比如将问题部分写入单独的文件。
\documentclass[answers]{exam}
\usepackage{environ}
\NewEnviron{mySol}[1][1in]{
\begin{EnvFullwidth}
\begin{solutionbox}{#1}
\BODY
\end{solutionbox}
\end{EnvFullwidth}}
\begin{document}
\newcommand\myquestions{
\begin{questions}
\question First question
\begin{mySol}
This looks good,
\end{mySol}
\clearpage
\question Second question
\begin{mySol}
Not so good.
\end{mySol}
\end{questions}}
{\RenewEnviron{mySol}[1][\relax]{\relax}
\renewcommand\newpage{\relax}
\renewcommand\clearpage{\relax}
\myquestions
}
\clearpage
\myquestions
\end{document}
答案3
我认为肯定存在设置某个变量\anslength
并在的参数中使用它solutionbox
并将其从交换到2in
的情况0in
然后在关闭答案的情况下进行编译,以生成仅包含问题而没有答案空间的副本,然后将 PDF 拼接在一起pdfpages
. 同样,我认为答案考试文件末尾的答案可以很容易地适应在问题末尾打印问题列表,并且必要的重新排序并不是一项繁重的手工任务。
对于 OP 给出的 MWE,以下内容可以完成工作。问题写给aux
(基于 egreg 的解决方案将 LaTeX3 变量写入辅助文件并恢复它) 然后检索,因此需要编译两次。 \PrintQuestions
在环境中打印问题questions
,这会导致标签重复,可能一个enumerate
环境就足够了。我不知道为什么\item[]
是必要的,但如果我不包含一个简单的\item
(\question
也完成了工作),LaTeX 会非常不高兴,因为[]
它隐藏了标签,不会造成太大的干扰。
\documentclass[answers]{exam}
\usepackage{xparse}
\ExplSyntaxOn
\seq_new:N \l_exam_beginprint_seq
\seq_new:N \g_exam_beginprint_seq
\NewDocumentCommand \WriteQuestion { +m } {
\seq_gput_right:Nx \l_exam_beginprint_seq { #1 }
\question #1
}
\NewDocumentCommand \PrintQuestions { } {
\begin{questions}
\seq_map_inline:Nn \g_exam_beginprint_seq { \question ~ ##1 }
\item[]
\end{questions}
}
\cs_new:Npn \QuestionFromAux #1 {
\seq_gput_right:Nn \g_exam_beginprint_seq { #1 }
}
\AtEndDocument {
\seq_map_inline:Nn \l_exam_beginprint_seq {
\iow_now:cx { @auxout } {
\token_to_str:N \QuestionFromAux { #1 }
^^J
}
}
}
\ExplSyntaxOff
\begin{document}
\PrintQuestions
\newpage
\begin{questions}
\WriteQuestion{First question}
\begin{EnvFullwidth}
\begin{solutionbox}{2in}
This looks good,
\end{solutionbox}
\end{EnvFullwidth}
\WriteQuestion{Second question}
\begin{EnvFullwidth}
\begin{solutionbox}{2in}
Not so good.
\end{solutionbox}
\end{EnvFullwidth}
\end{questions}
\end{document}