将答案作为多项选择的可选参数

将答案作为多项选择的可选参数

我目前正在使用以下代码来制作以选项作为 5 个参数的多项选择题。

\documentclass[a4paper,addpoints,answers,12pt]{exam}
\usepackage{graphicx,tabularx,caption,color,subcaption,amsmath,amssymb,lmodern,textcomp,gensymb,ifpdf,ifthen,xpatch}

\xpatchcmd{\oneparchoices}{\penalty -50\hskip 1em plus 1em\relax}{\hfill}{}{}
\xpatchcmd{\oneparchoices}{\penalty -50\hskip 1em plus 1em\relax}{\hfill}{}{}

\newcommand{\mcq}[5]{%
    \begin{oneparchoices}
        \choice #1
        \choice #2
        \choice #3
        \choice #4
        \choice #5
    \end{oneparchoices}
}
    \begin{document}
        \mcq{uihoo}{eifhw2u}{fiwuhr}{fjwhf}{fnweir}
    \end{document}

我想让答案也可以作为参数(第 6 个参数)给出,但目前我只能看到一种繁琐的方法,即创建 5 个不同的新命令,每个命令都有\correctchoice该选项。就像我需要上面的代码一样,但

  1. \correctchoice #1当定义一个命令时,例如\mcqa使用相同的 5 个参数,其中 A 是正确答案。
  2. \correctchoice #2当定义一个命令时,例如\mcqb使用相同的 5 个参数,其中 B 是正确答案....

有没有更紧凑的方法?尝试了 CTAN 上的所有软件包。我发现没有一个适合这个。

答案1

您可以在正确答案前面加上 * 并对其进行测试,用于\CorrectChoice这种情况和\choice其他情况;然后您可以使用标准exam功能来隐藏或显示正确的选择:删除该answers选项将隐藏正确答案。

\documentclass[
  a4paper,
  addpoints,
  answers,
  12pt
]{exam}
\usepackage{graphicx,tabularx,caption,color,subcaption,
  amsmath,amssymb,lmodern,textcomp,gensymb,ifpdf,ifthen,xpatch}

\xpatchcmd{\oneparchoices}{\penalty -50\hskip 1em plus 1em\relax}{\hfill}{}{}
\xpatchcmd{\oneparchoices}{\penalty -50\hskip 1em plus 1em\relax}{\hfill}{}{}

\makeatletter
\newcommand{\mcq}[5]{%
  \begin{oneparchoices}
  \check@choice #1\@nil
  \check@choice #2\@nil
  \check@choice #3\@nil
  \check@choice #4\@nil
  \check@choice #5\@nil
  \end{oneparchoices}
}
\def\check@choice#1#2\@nil{%
  \ifx*#1%
    \CorrectChoice #2%
  \else
    \choice #1#2%
  \fi
}
\makeatother

\begin{document}

\mcq{No}{*Yes}{No}{No}{No}

\mcq{*Lie}{Yes}{No}{No}{No}

\end{document}

在此处输入图片描述

答案2

你可以滥用xparse这个功能,假设第一个论点是正确的,并允许用星号*表示另一个正确答案。通过检查所有论点,你可以切换哪些是正确的。

请注意,此解决方案不稳定:它允许在选项 2-5 中出现多个正确答案,但每个选项都会导致选项 1 不正确。出于技术原因,命令中不能再添加选项。

这样做是可行的,但请不要对您的文档这样做。这是一种非常错误的思维方式,如果您继续使用 LaTeX,这将对您不利。

\documentclass[a4paper,addpoints,answers,12pt]{exam}
\usepackage{graphicx,tabularx,caption,color,subcaption,amsmath,amssymb,lmodern,textcomp,gensymb,ifpdf,ifthen,xpatch}

\xpatchcmd{\oneparchoices}{\penalty -50\hskip 1em plus 1em\relax}{\hfill}{}{}
\xpatchcmd{\oneparchoices}{\penalty -50\hskip 1em plus 1em\relax}{\hfill}{}{}

\usepackage{xparse}
\NewDocumentCommand{\mcq}{msmsmsmsm}{%
  \begin{oneparchoices}
    \IfBooleanTF{#2}{\choice}{%
      \IfBooleanTF{#4}{\choice}{%
        \IfBooleanTF{#6}{\choice}{%
          \IfBooleanTF{#8}{\choice}{\correctchoice}}}}
    \IfBooleanTF{#2}{\correctchoice}{\choice} #3
    \IfBooleanTF{#4}{\correctchoice}{\choice} #5
    \IfBooleanTF{#6}{\correctchoice}{\choice} #7
    \IfBooleanTF{#8}{\correctchoice}{\choice} #9
  \end{oneparchoices}}
\begin{document}
\mcq{uihoo}{eifhw2u}*{fiwuhr}{fjwhf}{fnweir}
\end{document}

相关内容