需要使用 pgf foreach 为考试类添加第二个 \end{choices} 吗?

需要使用 pgf foreach 为考试类添加第二个 \end{choices} 吗?

我无法弄清楚这种奇怪现象的原因。如果我声明我的考试打印答案,我会收到一个错误,

! 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}

在此处输入图片描述

相关内容