使用枚举包随机打乱枚举列表

使用枚举包随机打乱枚举列表

我正在构建一个用于编写考试的模板,我想在编译时随机打乱我的枚举列表。 这个问题的答案为此目的而工作,但是我正在使用其他功能以便在“学生视图”和“密钥”视图之间切换,并且提供的解决方案不适用于enumerate我在构建其他功能时使用的包的功能。

这是一个 MWE,没有随机化功能

\documentclass{article}
\usepackage[dvipsnames]{xcolor}
\usepackage{amsmath, enumerate, ifthen, multicol, tikz}

\newif\ifgrading

\newcommand*\circleAns[1]{\tikz[baseline=(char.base)]{
            \node[shape=circle,draw,inner sep=2pt,color=ForestGreen] (char) {#1};}}

\makeatletter        
\newcommand{\itemAns}{
    \ifgrading
        \stepcounter{enum\romannumeral\@enumdepth}
        \item[\circleAns{\textcolor{ForestGreen}{\@nameuse{label\@enumctr}}}]
    \else \item
    \fi
}
\makeatother

\begin{document}

\begin{multicols}{2}
\gradingtrue
\begin{enumerate}[a)]
    \itemAns
    \item 
    \item
\end{enumerate}


\gradingfalse
\begin{enumerate}[a)]
    \itemAns
    \item 
    \item
\end{enumerate}
\end{multicols}

\end{document}

产生输出:

理想情况下,随机化功能将允许我继续使用\begin{enumerate}[<options>]\itemAns,并且还允许我为随机生成过程设置种子以实现可重复性。提前感谢您的帮助。

答案1

以下是通过固定种子以可重复的方式打乱答案的方法。根据要作为种子输入的学生编号设计一个公式。

\documentclass{article}
%\usepackage{xparse} % not needed with LaTeX 2020-10-01 or later
\usepackage{enumitem} % much more powerful than enumerate
\usepackage[dvipsnames]{xcolor}
\usepackage{tikz}

\newcommand*\circleanswer[1]{%
  \smash{\tikz[baseline=(char.base)]{%
    \node[shape=circle,draw,inner sep=2pt,color=ForestGreen] (char) {#1};
  }}%
}


\ExplSyntaxOn
\sys_gset_rand_seed:n { 43221+32 } % a fixed number + the student number

\NewDocumentEnvironment{answers}{+b}
 {
  \begin{enumerate}[label=\__shaun_answers_maybecorrect:n {\alph*})]
  \shaun_answers:n { #1 }
  \end{enumerate}
 }{}

\NewDocumentCommand{\grading}{}
 {
  \bool_gset_true:N \g_shaun_answers_grading_bool
 }
\NewDocumentCommand{\notgrading}{}
 {
  \bool_gset_false:N \g_shaun_answers_grading_bool
 }

\seq_new:N \l__shaun_answers_seq
\bool_new:N \l__shaun_answers_correct_bool
\bool_new:N \g_shaun_answers_grading_bool

\cs_new_protected:Nn \shaun_answers:n
 {
  \seq_set_split:Nnn \l__shaun_answers_seq { \item } { #1 }
  \seq_pop_left:NN \l__shaun_answers_seq \l_tmpa_tl
  \seq_shuffle:N \l__shaun_answers_seq
  \exp_last_unbraced:Ne \__shaun_answers_item:
   { \seq_use:Nn \l__shaun_answers_seq { \__shaun_answers_item: } }
 }

\cs_new_protected:Nn \__shaun_answers_item:
 {
  \peek_charcode_remove:NTF +
   { \bool_set_true:N \l__shaun_answers_correct_bool \item }
   { \bool_set_false:N \l__shaun_answers_correct_bool \item }
 }

\cs_new_protected:Nn \__shaun_answers_maybecorrect:n
 {
  \bool_if:NTF \l__shaun_answers_correct_bool
   {
    \bool_if:NTF \g_shaun_answers_grading_bool { \circleanswer{#1} } { #1 }
   }
   {
    #1
   }
 }

\ExplSyntaxOff

\begin{document}

%\grading
\notgrading

\subsection*{First question}
\begin{answers}
\item+ Correct
\item Incorrect (1)
\item Incorrect (2)
\item Incorrect (3)
\end{answers}

\subsection*{Second question}
\begin{answers}
\item+ Correct
\item Incorrect (1)
\item Incorrect (2)
\item Incorrect (3)
\end{answers}

\end{document}

等级

在此处输入图片描述

不评分

在此处输入图片描述

相关内容