diff options
Diffstat (limited to 'macros/latex/contrib/ximera/src/choice.dtx')
-rw-r--r-- | macros/latex/contrib/ximera/src/choice.dtx | 226 |
1 files changed, 226 insertions, 0 deletions
diff --git a/macros/latex/contrib/ximera/src/choice.dtx b/macros/latex/contrib/ximera/src/choice.dtx new file mode 100644 index 0000000000..70770cd24e --- /dev/null +++ b/macros/latex/contrib/ximera/src/choice.dtx @@ -0,0 +1,226 @@ +% \subsubsection{Multiple choice and the like} +% \DescribeEnv{multipleChoice}{Multiple choice} +% \begin{macrocode} +%<*classXimera> +% Jim: Originally this was \renewcommand{\theenumi}{$(\mathrm{\alph{enumi}})$} +% but that breaks tex4ht because mathmode can only be processed by mathjax. +% so now I made this just italicized. +% \end{macrocode} +% \subsubsection{Options} +% \begin{macrocode} +\define@key{choice}{value}[]{\def\choice@value{#1}} +% \end{macrocode} +% This flags the answer as the correct answer +% \begin{macrocode} +\define@boolkey{choice}{correct}[true]{\def\choice@correct{#1}} +% \end{macrocode} +% Use an ID to refer to the choice. +% \begin{macrocode} +\define@key{multipleChoice}{id}{\def\mc@id{#1}} +% \end{macrocode} +% |\otherchoice| outputs the item if correct and nothing if incorrect. +% \begin{macrocode} +\define@key{otherchoice}{value}[]{\def\otherchoice@value{#1}} +\define@boolkey{otherchoice}{correct}[true]{\def\otherchoice@correct{#1}} +% \end{macrocode} +% Default key choices for multiple choice options. +% Default for choice pairs. +% Default: answers without the option "correct=true" is "incorrect". +% \begin{macrocode} +\setkeys{choice}{correct=false,value=} +% \end{macrocode} +% Defaults for multipleChoice pairs. +% Default to no id? -- Jason +% \begin{macrocode} +\setkeys{multipleChoice}{id=} +% \end{macrocode} +% Defaults for otherchoice pairs. +% Default "otherchoice" to behave like "choice" for error checking. +% \begin{macrocode} +\setkeys{otherchoice}{correct=false,value=} +%</classXimera> +% \end{macrocode} +% +% \subsubsection{Choices} +% \DescribeMacro{\choice}{Like |\item| but for choice environments.} +% choice command denotes a possible answer choice for the multiple choice question. +% \begin{macrocode} +%<*classXimera> +\newcommand{\choice}[2][]{% +\setkeys{choice}{#1}% +\item{#2} +\ifthenelse{\boolean{\choice@correct}} + {% Begin then result + \ifhandout% if it's a handout do nothing. + \else% otherwise place a checkmark when you select the "correct choice"... maybe? -- Jason + \,\checkmark\,\setkeys{choice}{correct=false} + \fi + }% End then result + {}% Begin/End else result. +} + +%Define an expandable version of choice Not really meant to be used outside this package (used in wordChoice) +% Is there a reason we can't just always use this as default? -- Jason +\newcommand{\choiceEXP}[2][]{% + \expandafter\setkeys\expandafter{choice}{#1}% + \item{#2} + \ifthenelse{\boolean{\choice@correct}} + {% Begin then result + \ifhandout + \else + \,\checkmark\,\setkeys{choice}{correct=false} + \fi + }% End then result + {}% Begin/End else result. + } %% note all the {} are needed in case the choice has [] in it. + +% \otherchoice is the \choice used in wordChoice command. +\newcommand{\otherchoice}[2][]{% +\ignorespaces% +\setkeys{otherchoice}{#1}% +\ifthenelse{\boolean{\otherchoice@correct}}% +{% Start then result +#2\ignorespaces\setkeys{otherchoice}{correct=false}\ignorespaces% +}% End then result +{}% Start/End else result +\ignorespaces% +}% +\newcommand{\inlinechoice}[2][]{% +\setkeys{choice}{#1}% +\iffirstinlinechoice +(\hspace{-.25em} +\firstinlinechoicefalse +\else +/ +\fi +#2 +\ifthenelse{\boolean{\choice@correct}}% +{% Start then result +\ifhandout\else\checkmark\ignorespaces\setkeys{choice}{correct=false}\ignorespaces\fi% +}% End then result +{}% Start/End else result +\hspace{-.25em}\ignorespaces% +} + +%</classXimera> +% \end{macrocode} +% On the HTML side, |\choice| emits |<span>|s. +% \begin{macrocode} +%<*htXimera> +\newcounter{choiceId} +\renewcommand{\choice}[2][]{% +\setkeys{choice}{correct=false}% +\setkeys{choice}{#1}% +\stepcounter{choiceId}\IgnorePar% +\HCode{<span class="choice }% +\ifthenelse{\boolean{\choice@correct}}{\HCode{correct}}{} +\HCode{" } +\ifthenelse{\equal{\choice@value}{}}{}{\HCode{data-value="\choice@value" }} +\HCode{id="choice\arabic{choiceId}">}% +#2\HCode{</span>}} +\let\inlinechoice\choice +%</htXimera> +% \end{macrocode} + +% \subsubsection{Environment(s)} +% The environment |multipleChoice@| is for internal use only. +% \DescribeEnv{multipleChoice}{Wrap |\choice|s in a |multipleChoice| environment to make a multiple choice question.} +% \begin{macrocode} +%<*classXimera> +\newenvironment{multipleChoice}[1][] + {% Environment Start Code + \setkeys{multipleChoice}{#1}% + \recordvariable{\mc@id}% + \begin{trivlist} + \item[\hskip \labelsep\small\bfseries Multiple Choice:]\hfil + \begin{enumerate} + }% Note this means that \item has to be the first line after \begin{multipleChoice}. + {% Environment End Code + \end{enumerate} + \end{trivlist} + } + +%multipleChoice@ is for internal use only! (used in wordChoice) +%this is simply a wrapper for the sole showing (other)choice. +\newenvironment{multipleChoice@}[1][]{}{)} +%</classXimera> +% \end{macrocode} + + + +% On the web, you might also expect these to be "problem environments" +% but they aren't -- they're respondables. You might expect a +% |\setcounter{choiceId}{0}| here --- that would be wrong, because then +% the generated IDs would no longer be unique. +% \begin{macrocode} +%<*htXimera> +\renewenvironment{multipleChoice}[1][] +{\setkeys{multipleChoice}{#1}% +\stepcounter{identification}\ifvmode \IgnorePar\fi \EndP\HCode{<div class="multiple-choice" }% +\ifthenelse{\equal{\mc@id}{}}{}{\HCode{data-id="\mc@id" }}% +\HCode{id="problem\arabic{identification}">}% +}{\HCode{</div>}\IgnoreIndent} +\ConfigureEnv{multipleChoice}{}{}{}{} +%</htXimera> +% \end{macrocode} + +% \subsection{Word choice} +% \DescribeMacro{\wordChoice}{An in-line version of multipleChoice: +% uses enumitem package note, it is coded as a single line to avoid +% unwanted spaces in ``given'' mode.} +% \begin{macrocode} +%<*classXimera> +\newcommand{\wordChoice}[1]{% +\let\choicetemp\choice% Assign a "choicetemp" command to duplicate choice. +\ifwordchoicegiven% If wordchoice option is on, we need to juggle around some definitions. +\let\choice\otherchoice% +%\begin{multipleChoice@}% -unnecessary (REMOVE THIS LINE IF THE YEAR IS 2019 or Beyond) +#1 +%\end{multipleChoice@}% -unnecessary (REMOVE THIS LINE IF THE YEAR IS 2019 or Beyond) +\else% If it isn't the regular "choice" command should work. +\let\choice\inlinechoice% +\begin{multipleChoice@}% +#1% +\end{multipleChoice@}% +\fi% +\let\choice\choicetemp% Now that choicetmp has been manipulated to what we want, replace choice with it. +}% + + +%</classXimera> +% \end{macrocode} +% This is actually just word choice +% \begin{macrocode} +%<*htXimera> +\renewenvironment{multipleChoice@}{\refstepcounter{problem}}{}% +\ConfigureEnv{multipleChoice@}{\stepcounter{identification}\IgnorePar\HCode{<span class="word-choice" id="word-choice\arabic{identification}">}}{\HCode{</span>}\IgnoreIndent}{}{} +%</htXimera> +% \end{macrocode} + +% \subsection{Select all} +% \DescribeEnv{selectAll}{A multiple-multiple choice question} +% \begin{macrocode} +%<*classXimera> +\newenvironment{selectAll}[1][] +{\begin{trivlist}\item[\hskip \labelsep\small\bfseries Select All Correct Answers:]\hfil\begin{enumerate}} + {\end{enumerate}\end{trivlist}} +%</classXimera> +% \end{macrocode} + +% In the future we need this to (optionally) be displayed in the +% problem, while the actual code lives in the solution. Here is how +% this could be implemented: Like the title/maketitle commands, the +% multiple-choice could be stored in |\themultiplechoice|, flip a +% boolean, and execute |\makemultiplechoice| at the |\end| of the +% problem. We should also make a command called |\showchoices| that +% will show choices in the handout. + +% On the web, |selectAll| is handled just like |multipleChoice|. +% \begin{macrocode} +%<*htXimera> +\renewenvironment{selectAll}{\refstepcounter{problem}}{}% +\ConfigureEnv{selectAll}{\stepcounter{identification}\ifvmode \IgnorePar\fi \EndP\HCode{<div class="select-all" id="problem\arabic{identification}">}}{\HCode{</div>}\IgnoreIndent}{}{} +%</htXimera> +% \end{macrocode} + + |