열거 패키지를 사용하여 무작위로 열거 목록을 섞습니다.

Nov 16 2020

시험 작성을위한 템플릿을 만들고 있으며 컴파일 타임에 열거 된 목록을 무작위로 섞고 싶습니다. 이 질문에 대한 답변 은 그 목적으로 작동했지만 'Student View'와 'Key'보기 사이를 전환 할 수있는 다른 기능을 사용하고 있으며 제공된 솔루션이 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 egreg Nov 16 2020 at 07:13

다음은 시드를 수정하여 반복 가능한 방식으로 답변을 섞는 방법입니다. 종자로 공급할 학생 수를 기준으로 공식을 고안하십시오.

\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}

채점

채점 안함