![在 McExam 中修复最后两个问题](https://linux22.com/image/403877/%E5%9C%A8%20McExam%20%E4%B8%AD%E4%BF%AE%E5%A4%8D%E6%9C%80%E5%90%8E%E4%B8%A4%E4%B8%AA%E9%97%AE%E9%A2%98.png)
mcexam 包为 mcanswerslist 提供了一个“fixlast”选项,允许修复最后一个选项(例如“以上都不是”),同时将其他选项随机化。
我想要一个“fixlasttwo”选项,以便我可以指定“以上所有”后跟“以上都不是”。
下面是一个 MWE,显示了fixlasttwo
我想要的选项以及现有的fixlast
选项:
\documentclass{article}
\usepackage[output=exam
,numberofversions=1
,version=1
,seed=1
,randomizequestions=true
,randomizeanswers=true
,writeRfile=false
]{mcexam}
\begin{document}
\begin{mcquestions}
\question Is this going to be on the exam?
\begin{mcanswerslist}[fixlasttwo] % desired option
\answer Russell's antinomy
\answer Gödel's numbering
\answer Borges' library
\answer[correct] none of the above
\answer all of the above
\end{mcanswerslist}
\begin{mcanswerslist}[fixlast] % existing option
\answer Russell's antinomy
\answer Gödel's numbering
\answer Borges' library
\answer[correct] none of the above
\answer all of the above
\end{mcanswerslist}
\end{mcquestions}
\end{document}
答案1
mcexam
在选项的源中,fixlast
通过将可置换答案的数量定义为答案总数减一,然后在 1 和可置换答案的数量之间随机选择置换对来实现。因此,一个快速的解决方案是将可置换答案的数量定义为答案总数减二。
为了增加一点灵活性,\fixn
可以定义一个宏来存储需要修复的答案数量,并在选项的源代码中插入该宏而不是文字数字 1。fixlast
可以使用提供宏的etoolbox
包(已由 加载)动态修改源代码,该宏有五个参数:要修补的命令、该命令中需要修改的特定代码、替换代码以及修补成功或失败时分别执行的两个参数。mcexam
\patchcmd
梅威瑟:
\documentclass{article}
\usepackage[output=exam
,numberofversions=1
,version=1
,randomizequestions=false
,randomizeanswers=true
,seed=10
,writeRfile=false
]{mcexam}
\makeatletter
\patchcmd{\mc@randomizeAnswers@fixlast}%
{\numdef\@numberofpermuteanswers{\csuse{mc@totalNumberOfAnswersQ\q}-1}}%
{\numdef\@numberofpermuteanswers{\csuse{mc@totalNumberOfAnswersQ\q}-\fixn}}%
{\typeout{patch ok}}{\typeout{patch failed}}
\makeatother
\begin{document}
\begin{mcquestions}
\question Is this going to be on the exam?
\gdef\fixn{2}
\begin{mcanswerslist}[fixlast] % existing option
\answer Russell's antinomy
\answer G\"odel's numbering
\answer Borges' library
\answer[correct] none of the above
\answer all of the above
\end{mcanswerslist}
\end{mcquestions}
\end{document}
结果:
该\fixn
定义可以稍后更改,例如,如果对于下一个问题您只希望修复最后一个答案,那么您应该将其放在\gdef\fixn{1}
答案之前并fixlast
像以前一样使用。
或者,可以实现一个新的选项fixlasttwo
(如 OP 所要求的)或一个更通用的fixlastn
选项,但这包括修补或添加更多代码,因此这可能是一个可接受的解决方案。