我目前正在使用以下代码来制作以选项作为 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
该选项。就像我需要上面的代码一样,但
\correctchoice #1
当定义一个命令时,例如\mcqa
使用相同的 5 个参数,其中 A 是正确答案。\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}