sebmcq.sty
我有优秀用户创建的文件弗洛朗·鲁贡、恩里科·格雷戈里奥生成带有答案的多项选择题。
% sebmcq.sty --- Multiple choice questions. Can print questions and proposed
% answers in a random order. Optionally show the correct
% answers.
%
% See <https://tex.stackexchange.com/a/529060/73317> for more information.
%
% Copyright (C) 2020 Florent Rougon, Enrico Gregorio
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
% of this license or (at your option) any later version.
% The latest version of this license is in
% http://www.latex-project.org/lppl.txt
% and version 1.3 can be found in the LICENSE file present in this
% distribution.
%
% This work has the LPPL maintenance status `maintained'.
%
% The Current Maintainer of this work is Florent Rougon.
%
% This work consists of only one file: sebmcq.sty.
\NeedsTeXFormat{LaTeX2e}[1995/12/01]
\RequirePackage{expl3}
\RequirePackage{xparse}
\RequirePackage{l3keys2e}
\RequirePackage{amssymb,bbding} % for the \checkmark
\ProvidesExplPackage{sebmcq}{2020-03-14}{0.6}
{Multiple choice questions}
\str_new:N \l_questionnaire_env_str
\seq_new:N \l__sebmcq_questions_seq
\tl_new:N \l__sebmcq_answers_tl
\tl_new:N \l__sebmcq_correctness_code_tl
\tl_new:N \l__sebmcq_answer_tl
\bool_new:N \l_sebmcq_shuffle_questions_bool
\bool_new:N \l_sebmcq_shuffle_answers_bool
\bool_new:N \l_sebmcq_show_correct_answers_bool
\bool_new:N \l__sebmcq_has_correct_answer_bool % parsing stage
\bool_new:N \l__sebmcq_correct_answer_marked_bool % rendering stage
\skip_new:N \l_sebmcq_after_answer_num_skip % horizontal skip
\msg_new:nnn { sebmcq } { invalid-answer-opt-arg }
{ Invalid~input~inside~brackets~before~answer:~'#1'. }
\msg_new:nnn { sebmcq } { empty-answer-opt-arg }
{ Empty~input~inside~brackets~before~answer. }
\msg_new:nnn { sebmcq } { question-cmd-used-outside-of-questionnaire-env }
{ \question command~used~outside~of~questionnaire~environment. }
% This is assumed to be illegal
\msg_new:nnn { sebmcq } { several-correct-answers }
{ Several~answers~have~been~marked~as~correct~for~a~question. }
\cs_new_protected:Npn \__sebmcq_read_answer_with_optarg:wn [#1]#2
{
\tl_if_empty:nTF {#1}
{ \msg_error:nn { sebmcq } { empty-answer-opt-arg } }
{
\str_if_in:nnTF { xX } {#1}
{
\bool_if:NTF \l__sebmcq_has_correct_answer_bool
{ \msg_error:nn { sebmcq } { several-correct-answers } }
{
\bool_set_true:N \l__sebmcq_has_correct_answer_bool
\tl_put_right:Nn \l__sebmcq_answers_tl
{ { { \correct } {#2} } }
}
}
{ \msg_error:nnn { sebmcq } { invalid-answer-opt-arg } {#1} }
}
\__sebmcq_read_answers:w % recurse
}
\cs_new_protected:Npn \__sebmcq_read_answer_without_optarg:n #1
{
% Incorrect answer
\tl_put_right:Nn \l__sebmcq_answers_tl { { { } {#1} } }
\__sebmcq_read_answers:w % recurse
}
\cs_new_protected:Npn \__sebmcq_read_answers:w
{
\peek_meaning_ignore_spaces:NTF \q_stop
{ \use_none:n }
{
\peek_meaning_ignore_spaces:NTF [
{ \__sebmcq_read_answer_with_optarg:wn }
{ \__sebmcq_read_answer_without_optarg:n }
}
}
\cs_new_protected:Npn \__sebmcq_maybe_mark_correct_answer:
{
% Little trick in the boolean expression: this allows us to automatically
% mark the freeform answer as correct if none of the explicitly given
% answers was declared as correct.
\bool_if:nT
{
\bool_if_p:N \l_sebmcq_show_correct_answers_bool &&
! \bool_if_p:N \l__sebmcq_correct_answer_marked_bool
}
{
\makebox[0pt][r] {\CheckmarkBold \skip_horizontal:n { 0.5em } }
% No other answer will be marked as correct for this question.
\bool_set_true:N \l__sebmcq_correct_answer_marked_bool
}
}
% Default function for formatting the question number
\cs_new_protected:Npn \sebmcq_format_question_number_default:n #1
{
\fbox { \makebox[\height]{ \int_to_Alph:n {#1} } }
}
% #1: empty means the answer is incorrect
% #2: answer number
% #3: answer text
\cs_new_protected:Npn \__sebmcq_print_proposed_answer:nnn #1#2#3
{
\tl_if_empty:nF {#1} { \__sebmcq_maybe_mark_correct_answer: }
\__sebmcq_format_question_number:n {#2}
\skip_horizontal:n { \l_sebmcq_after_answer_num_skip } {#3} \\[0.5ex]
}
\cs_generate_variant:Nn \__sebmcq_print_proposed_answer:nnn { VnV }
\cs_generate_variant:Nn \__sebmcq_format_question_number:n { x }
% Based on egreg's code: <https://tex.stackexchange.com/a/519972/73317>
% #1: question text; #2: proposed answers
\cs_new_protected:Npn \__sebmcq_read_question:nn #1#2
{
\tl_clear:N \l__sebmcq_answers_tl
\bool_set_false:N \l__sebmcq_has_correct_answer_bool
\__sebmcq_read_answers:w #2 \q_stop
\seq_put_right:Nx \l__sebmcq_questions_seq
{
{ \exp_not:n {#1} } % { question }
{ \exp_not:n \exp_after:wN { \l__sebmcq_answers_tl } } % { answers }
}
}
\seq_new:N \l__sebmcq_oq_answers_seq
% #1: question
% #2: answers, each of which being of the form
% { { \correct or empty } { answer text } }
\cs_new_protected:Npn \__sebmcq_output_question:nn #1#2
{
\seq_set_split:Nnn \l__sebmcq_oq_answers_seq { } {#2}
\bool_if:NT \l_sebmcq_shuffle_answers_bool
{ \seq_shuffle:N \l__sebmcq_oq_answers_seq }
\item {#1} \\[2ex] % question text
\bool_set_false:N \l__sebmcq_correct_answer_marked_bool
\seq_indexed_map_inline:Nn \l__sebmcq_oq_answers_seq
{
\seq_set_split:Nnn \l_tmpa_seq { } {##2}
\seq_pop_left:NN \l_tmpa_seq \l__sebmcq_correctness_code_tl
\seq_pop_left:NN \l_tmpa_seq \l__sebmcq_answer_tl
\__sebmcq_print_proposed_answer:VnV
\l__sebmcq_correctness_code_tl {##1}
\l__sebmcq_answer_tl
}
\__sebmcq_maybe_mark_correct_answer:
\__sebmcq_format_question_number:x
{ \int_eval:n { \seq_count:N \l__sebmcq_oq_answers_seq + 1 } }
\skip_horizontal:n { \l_sebmcq_after_answer_num_skip }
\hbox_to_wd:nn { 9em } { \hrulefill }
}
\cs_new_protected:Npn \__sebmcq_output_question:n #1
{ \__sebmcq_output_question:nn #1 }
\cs_new_protected:Npn \__sebmcq_output_questionnaire:
{
\bool_if:NT \l_sebmcq_shuffle_questions_bool
{ \seq_shuffle:N \l__sebmcq_questions_seq }
% I didn't use \seq_map_inline:Nn here because it would fail with l3kernel
% older than 2020-03-14 (this is due to a bug in \seq_shuffle:N
% <https://github.com/latex3/latex3/issues/687>, fixed in this commit:
% <https://github.com/latex3/latex3/commit/42c70c63fd83324c5792dd14538a39dd7e388a55>).
\seq_map_function:NN \l__sebmcq_questions_seq \__sebmcq_output_question:n
}
\NewDocumentCommand \question { }
{
\msg_error:nn { sebmcq } { question-cmd-used-outside-of-questionnaire-env }
}
\NewDocumentEnvironment { questionnaire } { O{} }
{
\keys_set:nn { sebmcq } {#1}
\cs_set_eq:NN \question \__sebmcq_read_question:nn
\tl_clear:N \l__sebmcq_questions_seq
\use:c { \str_use:N \l_questionnaire_env_str }
}
{
\__sebmcq_output_questionnaire:
\use:c { end \str_use:N \l_questionnaire_env_str }
}
\NewDocumentCommand \ShowCorrectAnswers { }
{
\bool_set_true:N \l_sebmcq_show_correct_answers_bool
}
\NewDocumentCommand \HideCorrectAnswers { }
{
\bool_set_false:N \l_sebmcq_show_correct_answers_bool
}
% Set the default question number formatter
\cs_new_eq:NN \__sebmcq_format_question_number:n
\sebmcq_format_question_number_default:n
\keys_define:nn { sebmcq }
{
after-answer-num-skip .skip_set:N = \l_sebmcq_after_answer_num_skip ,
after-answer-num-skip .value_required:n = true,
after-answer-num-skip .initial:n = { 0.9em },
%
answer-number-format .code:n = {
\cs_set_protected:Npn \__sebmcq_format_question_number:n ##1 {#1} },
answer-number-format .value_required:n = true,
%
questionnaire-env .code:n = {
\str_set:Nn \l_questionnaire_env_str {#1} },
questionnaire-env .value_required:n = true,
questionnaire-env .initial:n = { enumerate },
%
show-correct-answers .bool_set:N = \l_sebmcq_show_correct_answers_bool,
show-correct-answers .initial:n = { false },
show-correct-answers .default:n = { true },
%
shuffle-questions .bool_set:N = \l_sebmcq_shuffle_questions_bool,
shuffle-questions .initial:n = { false },
shuffle-questions .default:n = { true },
%
shuffle-answers .bool_set:N = \l_sebmcq_shuffle_answers_bool,
shuffle-answers .initial:n = { false },
shuffle-answers .default:n = { true },
}
\NewDocumentCommand \sebmcqSetup { m }
{
\keys_set:nn { sebmcq } {#1}
}
% Process LaTeX2e-style package options. This uses l3keys2e, see
% <https://tex.stackexchange.com/a/371754/73317> for explanations.
\ProcessKeysPackageOptions { sebmcq }
\endinput
当我创建一个多项选择题(例如)时,第一列包含问题编号。6 在第一列,A、B、C、D 和 E在第二列。
如何修改代码以产生问题和各个选项之间没有分栏符的问题?
梅威瑟:
\documentclass[leqno,12pt]{extarticle}
\usepackage[italian]{babel}
\usepackage{mathtools,amssymb}
%\usepackage{mathrsfs}
\usepackage{graphicx,multicol,array}
\graphicspath{ {img/} }
\usepackage{geometry}
\geometry{landscape,a3paper,
tmargin=0.6in,bmargin=0.35in,hmargin=0.35in}
\usepackage[italic,basic, default mathsizes]{mathastext}
\MTlettershape{sl}\Mathastext
\makeatletter
\@for\@tempa:=a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z\do{%
\MTsetmathskips{\@tempa}{0mu}{0.5mu}}%
\@for\@tempa:=A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z\do{%
\MTsetmathskips{\@tempa}{0mu}{0.5mu}}%
\makeatother
\usepackage{expl3} % for \int_to_alph:n
\usepackage{xparse} % only for the 'test' environment
\usepackage[shuffle-questions, shuffle-answers]{sebmcq}
\pagestyle{empty}
\ExplSyntaxOn
\NewDocumentEnvironment { test } { m +b }
{ \prg_replicate:nn { #1 } { #2 \clearpage } }
{ }
\ExplSyntaxOff
\ShowCorrectAnswers
\usepackage{fancyhdr}
\pagestyle{fancy}
\setlength{\headheight}{16pt}
\lhead{\sffamily\bfseries \textsc{ }}
\chead{\sffamily\bfseries a.s. 2021--2022}
\rhead{\sffamily\bfseries Test }
\usepackage{enumitem}
\usepackage{icomma}
\usepackage{tikz}
\begin{document}
\large
\begin{multicols}{2}
\begin{questionnaire}
\question{In notazione scientifica, il numero 0.00364
diventa}
{
{$3.64 \times 10^3$.}
{$3.64 \times 10^2$.}
{$3.64 \times 10^{-2}$.}
[X]{$3.64 \times 10^{-3}$.}
}
\question{Un volume di 10 cm$^3$ è uguale a:}
{
{0.1 dm$^3$.}
{100 mm$^3$.}
[X]{10000 mm$^3$.}
{0.00001 mm$^3$.}
}
\question{Quale unità SI è più appropriata per
misurare lo spessore di un foglio di carta?}
{
{il metro.}
[X]{il millimetro.}
{il decimetro.}
{il chilometro.}
}
\question{Sono grandezze fondamentali nel Sistema
Internazionale \ldots}
{
{volume, densità e peso specifico.}
{massa e densità.}
[X]{temperatura e massa.}
{volume e tempo.}
}
\question{Una grandezza fisica derivata \ldots }
{
{ha un'unità di misura definita dal rapporto tra le unità di misura di grandezze fondamentali.}
{non ha unità di misura.}
[X]{è definita attraverso una relazione con le grandezze fondamentali.}
{ha un'unità di misura definita dal prodotto delle unità di misura di grandezze fondamentali.}
}
\question{Quante sono le cifre significative nel
numero $2.50 \times 10^4$?}
{
{due.}
{quattro.}
[X]{tre.}
{sette.}
}
\question{Quale grandezza si può misurare con una bilancia a bracci uguali?}
{
{La quantità di sostanza.}
{Il peso.}
[X]{La massa.}
{La forza.}
}
\question{L'unità di misura della velocità nel S.I. è:}
{
{km/h.}
{km/s.}
[X]{m/s.}
{cm/s.}
}
\question{Quanti zeri sono significativi nel numero 40 400 302?}
{
{uno.}
{due.}
[X]{quattro.}
{tre.}
}
\question{La massa di un corpo \ldots}
{
{varia al variare della temperatura del corpo.}
{varia al variare della posizione del corpo.}
[X]{è un valore costante del corpo.}
{varia al variare della distanza del corpo dalla
Terra.}
}
\end{questionnaire}
\end{multicols}
\end{document}
答案1
最简单的方法是禁止在问题文本后分页/分栏,方法是替换
\item {#1} \\[2ex] % question text
和
\item {#1} \\*[2ex] % question text
bmargin=0.4in
为了重现这个问题,我必须稍微修改一下几何形状。
其他变化:
questionnaire-env .code:n = {
\str_set:Nn \l_questionnaire_env_str {#1} },
应该
questionnaire-env .str_set:N = \l_questionnaire_env_str,
和
\seq_put_right:Nx \l__sebmcq_questions_seq
{
{ \exp_not:n {#1} } % { question }
{ \exp_not:n \exp_after:wN { \l__sebmcq_answers_tl } } % { answers }
}
应该
\seq_put_right:Nx \l__sebmcq_questions_seq
{
{ \exp_not:n {#1} } % { question }
{ \exp_not:V \l__sebmcq_answers_tl } % { answers }
}
顺便说一句,我与该样式文件无关。也许我提出了一些建议,但绝对没有编写所有代码。
.sty
以下是该文件的编辑版本
% sebmcq.sty --- Multiple choice questions. Can print questions and proposed
% answers in a random order. Optionally show the correct
% answers.
%
% See <https://tex.stackexchange.com/a/529060/73317> for more information.
%
% Copyright (C) 2020 Florent Rougon, Enrico Gregorio
%%%
%%% Modified by egreg
%%%
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
% of this license or (at your option) any later version.
% The latest version of this license is in
% http://www.latex-project.org/lppl.txt
% and version 1.3 can be found in the LICENSE file present in this
% distribution.
%
% This work has the LPPL maintenance status `maintained'.
%
% The Current Maintainer of this work is Florent Rougon.
%
% This work consists of only one file: sebmcq.sty.
\NeedsTeXFormat{LaTeX2e}[1995/12/01]
\RequirePackage{expl3}
\RequirePackage{xparse}
\RequirePackage{l3keys2e}
\RequirePackage{amssymb,bbding} % for the \checkmark
\ProvidesExplPackage{sebmcq}{2020-03-14}{0.6}
{Multiple choice questions}
\str_new:N \l_questionnaire_env_str
\seq_new:N \l__sebmcq_questions_seq
\tl_new:N \l__sebmcq_answers_tl
\tl_new:N \l__sebmcq_correctness_code_tl
\tl_new:N \l__sebmcq_answer_tl
\bool_new:N \l_sebmcq_shuffle_questions_bool
\bool_new:N \l_sebmcq_shuffle_answers_bool
\bool_new:N \l_sebmcq_show_correct_answers_bool
\bool_new:N \l__sebmcq_has_correct_answer_bool % parsing stage
\bool_new:N \l__sebmcq_correct_answer_marked_bool % rendering stage
\skip_new:N \l_sebmcq_after_answer_num_skip % horizontal skip
\msg_new:nnn { sebmcq } { invalid-answer-opt-arg }
{ Invalid~input~inside~brackets~before~answer:~'#1'. }
\msg_new:nnn { sebmcq } { empty-answer-opt-arg }
{ Empty~input~inside~brackets~before~answer. }
\msg_new:nnn { sebmcq } { question-cmd-used-outside-of-questionnaire-env }
{ \question command~used~outside~of~questionnaire~environment. }
% This is assumed to be illegal
\msg_new:nnn { sebmcq } { several-correct-answers }
{ Several~answers~have~been~marked~as~correct~for~a~question. }
\cs_new_protected:Npn \__sebmcq_read_answer_with_optarg:wn [#1]#2
{
\tl_if_empty:nTF {#1}
{ \msg_error:nn { sebmcq } { empty-answer-opt-arg } }
{
\str_if_in:nnTF { xX } {#1}
{
\bool_if:NTF \l__sebmcq_has_correct_answer_bool
{ \msg_error:nn { sebmcq } { several-correct-answers } }
{
\bool_set_true:N \l__sebmcq_has_correct_answer_bool
\tl_put_right:Nn \l__sebmcq_answers_tl
{ { { \correct } {#2} } }
}
}
{ \msg_error:nnn { sebmcq } { invalid-answer-opt-arg } {#1} }
}
\__sebmcq_read_answers:w % recurse
}
\cs_new_protected:Npn \__sebmcq_read_answer_without_optarg:n #1
{
% Incorrect answer
\tl_put_right:Nn \l__sebmcq_answers_tl { { { } {#1} } }
\__sebmcq_read_answers:w % recurse
}
\cs_new_protected:Npn \__sebmcq_read_answers:w
{
\peek_meaning_ignore_spaces:NTF \q_stop
{ \use_none:n }
{
\peek_meaning_ignore_spaces:NTF [
{ \__sebmcq_read_answer_with_optarg:wn }
{ \__sebmcq_read_answer_without_optarg:n }
}
}
\cs_new_protected:Npn \__sebmcq_maybe_mark_correct_answer:
{
% Little trick in the boolean expression: this allows us to automatically
% mark the freeform answer as correct if none of the explicitly given
% answers was declared as correct.
\bool_if:nT
{
\bool_if_p:N \l_sebmcq_show_correct_answers_bool &&
! \bool_if_p:N \l__sebmcq_correct_answer_marked_bool
}
{
\makebox[0pt][r] {\CheckmarkBold \skip_horizontal:n { 0.5em } }
% No other answer will be marked as correct for this question.
\bool_set_true:N \l__sebmcq_correct_answer_marked_bool
}
}
% Default function for formatting the question number
\cs_new_protected:Npn \sebmcq_format_question_number_default:n #1
{
\fbox { \makebox[\height]{ \int_to_Alph:n {#1} } }
}
% #1: empty means the answer is incorrect
% #2: answer number
% #3: answer text
\cs_new_protected:Npn \__sebmcq_print_proposed_answer:nnn #1#2#3
{
\tl_if_empty:nF {#1} { \__sebmcq_maybe_mark_correct_answer: }
\__sebmcq_format_question_number:n {#2}
\skip_horizontal:n { \l_sebmcq_after_answer_num_skip } {#3} \\[0.5ex]
}
\cs_generate_variant:Nn \__sebmcq_print_proposed_answer:nnn { VnV }
\cs_generate_variant:Nn \__sebmcq_format_question_number:n { x }
% Based on egreg's code: <https://tex.stackexchange.com/a/519972/73317>
% #1: question text; #2: proposed answers
\cs_new_protected:Npn \__sebmcq_read_question:nn #1#2
{
\tl_clear:N \l__sebmcq_answers_tl
\bool_set_false:N \l__sebmcq_has_correct_answer_bool
\__sebmcq_read_answers:w #2 \q_stop
\seq_put_right:Nx \l__sebmcq_questions_seq
{
{ \exp_not:n {#1} } % { question }
{ \exp_not:V \l__sebmcq_answers_tl } % { answers }
}
}
\seq_new:N \l__sebmcq_oq_answers_seq
% #1: question
% #2: answers, each of which being of the form
% { { \correct or empty } { answer text } }
\cs_new_protected:Npn \__sebmcq_output_question:nn #1#2
{
\seq_set_split:Nnn \l__sebmcq_oq_answers_seq { } {#2}
\bool_if:NT \l_sebmcq_shuffle_answers_bool
{ \seq_shuffle:N \l__sebmcq_oq_answers_seq }
\item {#1} \\*[2ex] % question text
\bool_set_false:N \l__sebmcq_correct_answer_marked_bool
\seq_indexed_map_inline:Nn \l__sebmcq_oq_answers_seq
{
\seq_set_split:Nnn \l_tmpa_seq { } {##2}
\seq_pop_left:NN \l_tmpa_seq \l__sebmcq_correctness_code_tl
\seq_pop_left:NN \l_tmpa_seq \l__sebmcq_answer_tl
\__sebmcq_print_proposed_answer:VnV
\l__sebmcq_correctness_code_tl {##1}
\l__sebmcq_answer_tl
}
\__sebmcq_maybe_mark_correct_answer:
\__sebmcq_format_question_number:x
{ \int_eval:n { \seq_count:N \l__sebmcq_oq_answers_seq + 1 } }
\skip_horizontal:n { \l_sebmcq_after_answer_num_skip }
\hbox_to_wd:nn { 9em } { \hrulefill }
}
\cs_new_protected:Npn \__sebmcq_output_question:n #1
{ \__sebmcq_output_question:nn #1 }
\cs_new_protected:Npn \__sebmcq_output_questionnaire:
{
\bool_if:NT \l_sebmcq_shuffle_questions_bool
{ \seq_shuffle:N \l__sebmcq_questions_seq }
% I didn't use \seq_map_inline:Nn here because it would fail with l3kernel
% older than 2020-03-14 (this is due to a bug in \seq_shuffle:N
% <https://github.com/latex3/latex3/issues/687>, fixed in this commit:
% <https://github.com/latex3/latex3/commit/42c70c63fd83324c5792dd14538a39dd7e388a55>).
\seq_map_function:NN \l__sebmcq_questions_seq \__sebmcq_output_question:n
}
\NewDocumentCommand \question { }
{
\msg_error:nn { sebmcq } { question-cmd-used-outside-of-questionnaire-env }
}
\NewDocumentEnvironment { questionnaire } { O{} }
{
\keys_set:nn { sebmcq } {#1}
\cs_set_eq:NN \question \__sebmcq_read_question:nn
\tl_clear:N \l__sebmcq_questions_seq
\use:c { \str_use:N \l_questionnaire_env_str }
}
{
\__sebmcq_output_questionnaire:
\use:c { end \str_use:N \l_questionnaire_env_str }
}
\NewDocumentCommand \ShowCorrectAnswers { }
{
\bool_set_true:N \l_sebmcq_show_correct_answers_bool
}
\NewDocumentCommand \HideCorrectAnswers { }
{
\bool_set_false:N \l_sebmcq_show_correct_answers_bool
}
% Set the default question number formatter
\cs_new_eq:NN \__sebmcq_format_question_number:n
\sebmcq_format_question_number_default:n
\keys_define:nn { sebmcq }
{
after-answer-num-skip .skip_set:N = \l_sebmcq_after_answer_num_skip ,
after-answer-num-skip .value_required:n = true,
after-answer-num-skip .initial:n = { 0.9em },
%
answer-number-format .code:n = {
\cs_set_protected:Npn \__sebmcq_format_question_number:n ##1 {#1} },
answer-number-format .value_required:n = true,
%
questionnaire-env .str_set:N = \l_questionnaire_env_str,
questionnaire-env .value_required:n = true,
questionnaire-env .initial:n = { enumerate },
%
show-correct-answers .bool_set:N = \l_sebmcq_show_correct_answers_bool,
show-correct-answers .initial:n = { false },
show-correct-answers .default:n = { true },
%
shuffle-questions .bool_set:N = \l_sebmcq_shuffle_questions_bool,
shuffle-questions .initial:n = { false },
shuffle-questions .default:n = { true },
%
shuffle-answers .bool_set:N = \l_sebmcq_shuffle_answers_bool,
shuffle-answers .initial:n = { false },
shuffle-answers .default:n = { true },
}
\NewDocumentCommand \sebmcqSetup { m }
{
\keys_set:nn { sebmcq } {#1}
}
% Process LaTeX2e-style package options. This uses l3keys2e, see
% <https://tex.stackexchange.com/a/371754/73317> for explanations.
\ProcessKeysPackageOptions { sebmcq }
\endinput