summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2023-06-08 19:50:11 +0000
committerKarl Berry <karl@freefriends.org>2023-06-08 19:50:11 +0000
commitc4a353064f802d0c980714ce1578e24a40834cbb (patch)
tree211a7adf1cefd87a1d2c461c7513f0a0b2fa82ff /Master/texmf-dist/tex
parent92cec824af2c643ec0cb870e5243eee8923ae13e (diff)
examz (8jun23)
git-svn-id: svn://tug.org/texlive/trunk@67303 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex')
-rw-r--r--Master/texmf-dist/tex/latex/examz/examz.cls288
1 files changed, 288 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/examz/examz.cls b/Master/texmf-dist/tex/latex/examz/examz.cls
new file mode 100644
index 00000000000..a8898a62c87
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/examz/examz.cls
@@ -0,0 +1,288 @@
+%%
+%% This is file `examz.cls',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% examz.dtx (with options: `class')
+%%
+%% This is a generated file.
+%%
+%% `examz' --- 2023/05/30 Version 1.0.0
+%%
+%% Copyright (C) 2023 by Christopher McClain
+%% E-mail: christopher.mcclain@mail.wvu.edu
+%%
+%% This file may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either
+%% version 1.3c 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.3c or later is part of all distributions of
+%% LaTeX version 2008 or later.
+%%
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesClass{examz}
+ [2023/06/07 v1.0.0 Randomized exams with multiple versions]
+\RequirePackage{environ}
+\RequirePackage{xpatch}
+\RequirePackage{counterz}
+\newbool{@examz@complete}
+\boolfalse{@examz@complete}
+\DeclareOption{complete}{\booltrue{@examz@complete}}
+\randomizectr
+\DeclareOption{randomize}{\randomizectr}
+\DeclareOption{norandomize}{\norandomizectr}
+\newbool{@examz@prompt}
+\boolfalse{@examz@prompt}
+\DeclareOption{prompt}{\booltrue{@examz@prompt}}
+\newcommand{\promptrandomexam}{%
+ \promptrandomizectr[\EnterResponse]{%
+ ^^J Enter 1 to randomize document.
+ ^^J Enter 2 to update without new randomization.
+ }{%
+ 1%
+ }%
+}%
+\DeclareOption*{%
+ \PassOptionsToClass{\CurrentOption}{exam}
+}%
+\ProcessOptions\relax
+\LoadClass{exam}
+\xpatchcmd{\endcoverpages}{\setcounter{num@coverpages}{\value{page}}}{%
+ \ifbool{@twoside}{%
+ \ifnumodd{\value{page}}{%
+ % Do Nothing
+ }{%
+ \newpage
+ \null
+ \newpage
+ }%
+ }{%
+ % Do nothing
+ }%
+ \setcounter{num@coverpages}{\value{page}}%
+}{}{}%
+\AtBeginDocument{%
+ \ifbool{@examz@prompt}{%
+ \promptrandomexam
+ }{%
+ }%
+ \ifrandomizectr{%
+ \opencountersfile
+ }{%
+ \inputcountersfile
+ }%
+}%
+\newcounter{numversions}
+\setcounter{numversions}{1}
+\newcommand{\promptversions}{%
+ \typein[\NumberOfVersions]{%
+ ^^J How many versions?
+ }%
+ \setcounter{numversions}{\NumberOfVersions}
+ \savecounter{numversions}
+}%
+\newcounter{version}
+\setcounter{version}{1}
+\xpatchcmd{\find@latestques}
+ {@\arabic{question}}
+ {@\arabic{version}\ifbool{printanswers}{S}{}@\arabic{question}}
+ {}{}
+\xpatchcmd{\decr@latest@ques}
+ {question@}
+ {question@\arabic{version}\ifbool{printanswers}{S}{}@}
+ {}{}
+\xpatchcmd{\chk@incompi}
+ {question@}
+ {question@\arabic{version}\ifbool{printanswers}{S}{}@}
+ {}{}
+\xpatchcmd{\questions}
+ {@\arabic{question}}
+ {@\arabic{version}\ifbool{printanswers}{S}{}@\arabic{question}}
+ {}{}
+\xpatchcmd{\parts}
+ {@\arabic{question}}
+ {@\arabic{version}\ifbool{printanswers}{S}{}@\arabic{question}}
+ {}{}
+\xpatchcmd{\subparts}
+ {@\arabic{question}}
+ {@\arabic{version}\ifbool{printanswers}{S}{}@\arabic{question}}
+ {}{}
+\xpatchcmd{\subsubparts}
+ {@\arabic{question}}
+ {@\arabic{version}\ifbool{printanswers}{S}{}@\arabic{question}}
+ {}{}
+\xpatchcmd{\setup@point@toks}
+ {@\arabic{question}}
+ {@\arabic{version}\ifbool{printanswers}{S}{}@\arabic{question}}
+ {}{}
+\xpatchcmd{\refto@index}
+ {question@}
+ {question@\arabic{version}\ifbool{printanswers}{S}{}@}
+ {}{}
+\newcommand{\@examz@versions}[1]{%
+ \ifrandomizectr{%
+ \ifbool{@examz@prompt}{%
+ \promptversions
+ }{%
+ % Do Nothing
+ }%
+ }{%
+ % Do Nothing
+ }%
+ \ifbool{@examz@complete}{%
+ \noprintanswers
+ }{%
+ % Do Nothing
+ }%
+ \whileboolexpr{%
+ test{\ifnumless{\value{version}}{1+\value{numversions}}}
+ }{%
+ \ifbool{@twoside}{%
+ \ifnumodd{\value{page}}{%
+ % Do Nothing
+ }{%
+ \newpage
+ \null
+ \thispagestyle{empty}
+ \newpage
+ }%
+ }{%
+ % Do Nothing
+ }%
+ \setcounter{page}{1}
+ \setcounter{numquestions}{0}
+ \setcounter{numparts}{0}
+ \setcounter{numsubparts}{0}
+ \setcounter{numsubsubparts}{0}
+ \setcounter{numpoints}{0}
+ \setcounter{numbonuspoints}{0}
+ #1
+ \newpage
+ \notbool{@examz@complete}{%
+ \addtocounter{version}{1}
+ }{%
+ \notbool{printanswers}{%
+ \printanswers
+ }{%
+ \noprintanswers
+ \addtocounter{version}{1}
+ }%
+ }%
+ }%
+}%
+\newenvironment{versions}[1][1]{%
+ \ifrandomizectr{%
+ \setcounter{numversions}{#1}
+ \savecounter{numversions}
+ }{%
+ % Do Nothing
+ }%
+ \Collect@Body\@examz@versions
+}{%
+ % Empty
+}%
+\AtEndDocument{%
+ \typeout{%
+ This document contains \thenumversions\space
+ version\ifnumequal{\value{numversions}}{1}{}{s} of the exam
+ \ifbool{@examz@complete}{%
+ with and without solutions.
+ }{%
+ \ifbool{printanswers}{%
+ with solutions.
+ }{%
+ without solutions.
+ }%
+ }%
+ }%
+}%
+\newcommand{\@examz@questionpath}{}
+\newcommand{\setquestionpath}[1]{%
+ \renewcommand{\@examz@questionpath}{#1}
+}%
+\newcommand{\questionfrombank}[2][]{%
+ \question[#1]
+ \setcounterprefix{#2_Version_\arabic{version}_}
+ \input{\@examz@questionpath #2}
+ \clearcounterprefix
+}%
+\newcounter{@examz@qbsize}
+\newcommand{\setnumberofquestions}[1]{%
+ \setcounter{@examz@qbsize}{#1}
+}%
+\newenvironment{questionbank}{%
+ \xrandprovidecounter{Random_Question}{1}{\value{@examz@qbsize}}
+}{%
+ \endinput
+}
+\NewEnviron{qbitem}[1]{%
+\ifnumequal{\xvalue{Random_Question}}{#1}{%
+\BODY
+}{%
+}
+}
+\newcommand{\@examz@solutionspace}{1cm}
+\newcommand{\setsolutionspace}[1]{%
+ \renewcommand{\@examz@solutionspace}{#1}
+}%
+\NewEnviron{qbsolution}{%
+ \begin{solution}[\@examz@solutionspace]
+ \BODY
+ \end{solution}
+}%
+\NewEnviron{qbsolutionbox}{%
+\begin{solutionbox}{\@examz@solutionspace}
+\BODY
+\end{solutionbox}
+}%
+\NewEnviron{qbsolutionorbox}{%
+\begin{solutionorbox}[\@examz@solutionspace]
+\BODY
+\end{solutionorbox}
+}%
+\NewEnviron{qbsolutionorlines}{%
+\begin{solutionorlines}[\@examz@solutionspace]
+\BODY
+\end{solutionorlines}
+}%
+\NewEnviron{qbsolutionordottedlines}{%
+\begin{solutionordottedlines}[\@examz@solutionspace]
+\BODY
+\end{solutionordottedlines}
+}%
+\NewEnviron{qbsolutionorgrid}{%
+\begin{solutionorgrid}[\@examz@solutionspace]
+\BODY
+\end{solutionorgrid}
+}%
+\newcommand{\instructorname}{Instructor Name}
+\newcommand{\coursename}{Course Name}
+\newcommand{\examname}{Exam Name}
+\newcommand{\termname}{Term Name}
+\newcommand{\namespace}{Name:~\makebox[5cm]{\hrulefill}}
+\newcommand{\instructions}{Instructions Here}
+\newcommand{\covernoanswers}{}
+\newcommand{\coveranswers}{\covernoanswers}
+\newcommand{\workspace}{}
+\newcommand{\setinstructorname}[1]{\renewcommand{\instructorname}{#1}}
+\newcommand{\setcoursename}[1]{\renewcommand{\coursename}{#1}}
+\newcommand{\setexamname}[1]{\renewcommand{\examname}{#1}}
+\newcommand{\settermname}[1]{\renewcommand{\termname}{#1}}
+\newcommand{\setnamespace}[1]{\renewcommand{\namespace}{#1}}
+\newcommand{\setinstructions}[1]{\renewcommand{\instructions}{#1}}
+\newcommand{\setcovernoanswers}[1]{\renewcommand{\covernoanswers}{#1}}
+\newcommand{\setcoveranswers}[1]{\renewcommand{\coveranswers}{#1}}
+\newcommand{\setworkspace}[1]{\renewcommand{\workspace}{#1}}
+\newcommand{\printcover}{%
+ \ifbool{printanswers}{\coveranswers}{\covernoanswers}
+}%
+\newcommand{\printworkspace}{%
+ \ifbool{printanswers}{}{\workspace}
+}%
+\endinput
+%%
+%% End of file `examz.cls'.