在 McExam 中修复最后两个问题

在 McExam 中修复最后两个问题

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选项,但这包括修补或添加更多代码,因此这可能是一个可接受的解决方案。

相关内容