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