我无法弄清楚这种奇怪现象的原因。如果我声明我的考试打印答案,我会收到一个错误,
! LaTeX Error: \begin{choices} on input line 21 ended by \end{questions}
! LaTeX Error: \begin{questions} on input line 20 ended by \end{document}.
这个问题已经解决了,如果我简单地添加第二行
\end{choices}
对于我的新命令。如果我不打印答案,则第二个命令\end{choices}
不是必需的。
我在循环中编写了哪些不正确的内容,导致它忽略了第一个\end{choices}
?
我已经在 MWE 中包含了所有需要的行,但是我注释掉了打印答案部分和第二部分,\end{choices}
以便您可以看到它也能编译并正常工作。
% to see the error in action, comment this first documentclass command, and uncomment the one with [answers]
% to resolve the error generated when enabling the answers, uncomment the second \end{choices} command down in \newcommand{\newmpchoice}
\documentclass{exam}
%\documentclass[answers]{exam}
\usepackage{pgffor}
\newcommand{\printchoice}[3]{\ifnum\numexpr#1\relax=\numexpr#2\relax \CorrectChoice #3 \else \choice #3\fi}
\newcommand{\newmpchoice}[4]{
\question #1
\begin{choices}
\foreach \x[count=\xi] in {#3}
{ \printchoice{#2}{\xi}{\x}};
\end{choices}
%\end{choices}
\begin{solution}
#4
\end{solution}
}
\begin{document}
\begin{questions}
\newmpchoice{Test question}{1}{{Answer 1},{Answer 2},{Answer 3},{Answer 4},{Answer 5}}{Solution}
\end{questions}
\end{document}
答案1
通常的问题是\foreach
,执行组中的每个循环,这会破坏设置\CorrectChoice
,一旦循环结束并且组关闭,这些设置就会被遗忘。
您可以使用以下方法更轻松地完成此操作expl3
:
\documentclass[
answers % comment this line for not showing answers
]{exam}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\newmpchoice}{mmmm}
{
\question #1
\begin{choices}
\clist_map_inline:nn { #3 }
{
\int_compare:nTF { #2 = \value{choice}+1 } { \CorrectChoice } { \choice }
##1
}
\end{choices}
\begin{solution}
#4
\end{solution}
}
\ExplSyntaxOff
\begin{document}
\begin{questions}
\newmpchoice{Test question}{1}{{Answer 1},{Answer 2},{Answer 3},{Answer 4},{Answer 5}}{Solution}
\end{questions}
\end{document}
我利用这样一个事实:计数器在每个或命令choice
时递增(并在时重置为零),因此在其中一个命令之前,它的值比比较所需的值小一。\choice
\CorrectChoice
\begin{choices}
您也可以使用 来执行此操作\foreach
,但在这种情况下,您必须收集一些宏中的位,然后才能进行传递。
\documentclass[
answers % comment this line for not showing solutions
]{exam}
\usepackage{pgffor,etoolbox}
\newcommand{\newmpchoice}[4]{%
\question #1
\begin{choices}
\def\thesechoices{}%
\foreach \x[count=\xi] in {#3} {%
\ifnum\numexpr#2\relax=\numexpr\xi\relax
\xappto\thesechoices{\noexpand\CorrectChoice\expandonce{\x}}%
\else
\xappto\thesechoices{\noexpand\choice\expandonce{\x}}%
\fi
}%
\thesechoices
\end{choices}
\begin{solution}
#4
\end{solution}
}
\begin{document}
\begin{questions}
\newmpchoice{Test question}{1}{{Answer 1},{Answer 2},{Answer 3},{Answer 4},{Answer 5}}{Solution}
\end{questions}
\end{document}
您还可以通过修改第一个解决方案来容纳多个正确答案:
\documentclass[
answers % comment this line for not showing answers
]{exam}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\newmpchoice}{mmmm}
{
\question #1
\begin{choices}
\clist_map_inline:nn { #3 }
{
\clist_if_in:nxTF { #2 } { \int_to_arabic:n { \value{choice} + 1 } }
{ \CorrectChoice } { \choice }
##1
}
\end{choices}
\begin{solution}
#4
\end{solution}
}
\cs_generate_variant:Nn \clist_if_in:nnTF { nx }
\ExplSyntaxOff
\begin{document}
\begin{questions}
\newmpchoice{Test question}{1}{{Answer 1},{Answer 2},{Answer 3},{Answer 4},{Answer 5}}{Solution}
\newmpchoice{Test question}{1, 3}{{Answer 1},{Answer 2},{Answer 3},{Answer 4},{Answer 5}}{Solution}
\end{questions}
\end{document}