\NeedsTeXFormat{LaTeX2e}% LaTeX 2.09 can't be used (nor non-LaTeX) [1994/12/01]% LaTeX date must December 1994 or later \ProvidesClass{exams}[2013/03/01 LRT test macros] \RequirePackage{ifthen} %% This package is essential. \usepackage{etex} %% This version is very inefficient with boxes and counts and without etex %% final exams will run out of boxes and/or counters. %% The code is written so as to be easy to maintain, not necessarily to be efficient. \RequirePackage[total={6.5in,8.75in}, top=1.2in, left=0.9in, includefoot]{geometry} % You can set page material yourself. %: Some defaults \gdef\defaultMarks{abcdefghj}%% expand as needed or change labels all together. \gdef\defaultMultipleChoicePts{(6pts)} \gdef\defaultPartialCreditPts{(10pts)} \gdef\coverSheetMultipleChoiceItemMark#1{(#1)} \gdef\coverSheetMarkedMultipleChoiceItemMark#1{($\bullet$)} \gdef\examMultipleChoiceItemMark#1{(#1)} \makeatletter \gdef\IFexists#1#2#3{\@ifundefined{#1}{#3}{#2}} % \namedArgs arguments of form {'name'}->{'value'} \def\gobbleat#1@{} \def\LRTargs#1#2->#3#4@{% \expandafter\gdef\csname #1.#2\endcsname{#3}% \gdef\LRTargsXX{{#1}#4@}% \def\LRTydyd{{#1}@}% \ifx\LRTydyd\LRTargsXX\relax% \let\LRTYYnext=\gobbleat\else\let\LRTYYnext =\LRTargs\fi% \expandafter\LRTYYnext\LRTargsXX} \def\namedArgs#1#2{% \ifempty{#2}{}{\expandafter\LRTargs{#1}#2@}% } \long\def\boxit#1#2#3{\vbox{\hrule\hbox{\vrule\kern#2 \vbox{\hsize=#3\kern#2#1\kern#2}\kern#2\vrule}\hrule}} %: \forloop keeps its index in the #4 counter % The loop exits with the smallest #2 + k(#1) which is greater than #3 in the counter #4 % If #3<\value{#4} at start, then the counter #4 remains unchanged \providecommand{\forloop}[5][1]{% \setcounter{#4}{#2}% \ifthenelse{\value{#4}<#3 }% {#5\addtocounter{#4}{#1}\forloop[#1]{\value{#4}}{#3}{#4}{#5}}% {\ifnum\value{#4}=#3\relax#5\addtocounter{#4}{#1}\fi}} %: The \new's \newdimen\betweenProblemAndAnswers\betweenProblemAndAnswers=10pt \newdimen\aboveSolution\aboveSolution=10pt \newdimen\betweenAnswerLines\betweenAnswerLines=10pt \newdimen\basic@LRTSkip \newif\ifNoVersionFile \newif\ifmarkedAnswerSheet \newif\ifPartialCredit \newcounter{VERSION} \newcounter{COVERSHEETS} \newcounter{SHOWSOLUTIONS} \newcounter{tmpLRTC} \newcounter{tmpLRTY} \newcounter{tmpLRTCounter} \newcounter{answerCounter} \newcounter{breakCounter} \newcounter{LRTArrayCount} \newcounter{write problem number} \newcounter{writeCounterA} \newcounter{tmpLRTCounterB} \newcounter{tmpLRTMCL} \newcounter{tmpLRTCA} \newcounter{answerCounterInv} % checks to see if #1 is empty. If it is, do #2, if not do #3 \def\ifempty#1#2#3{\def\LRTxx{#1}\def\LRTempty{}\ifx\LRTxx\LRTempty#2\else#3\fi} % If there is no version file, set up to do defaults as we read the problems % This means \WriteNewVersion{\d} needs to be sure there is a version file. \def\XX@LRTgetVersionEtc#1.#2.#3.#4@{% \gdef\versionFile{}% \global\NoVersionFiletrue% \ifempty{#1}{\setcounter{VERSION}{0}}{\setcounter{VERSION}{#1}}% \ifnum\value{VERSION}>0 % \IfFileExists{\jobname.\number\value{VERSION}.ver}{% \global\NoVersionFilefalse% \xdef\versionFile{\jobname.\number\value{VERSION}.ver}}{}% \fi% % \ifempty{#3}{\ifNoVersionFile% \ifempty{#1}{\setcounter{SHOWSOLUTIONS}{1}}{\setcounter{SHOWSOLUTIONS}{0}}\fi}% {\setcounter{SHOWSOLUTIONS}{#3}}% \ifNoVersionFile \else\input\versionFile\relax\fi% % \ifempty{#2}{\setcounter{COVERSHEETS}{0}}{% \ifnum\value{VERSION}=0 \setcounter{COVERSHEETS}{0}\else% \setcounter{COVERSHEETS}{#2}\fi}% } \def\@LRTgetVersionEtc#1.#2.#3.#4@{% \ifempty{#1}{\setcounter{VERSION}{0}}{\setcounter{VERSION}{#1}}% \ifempty{#2}{\setcounter{COVERSHEETS}{0}}{\setcounter{COVERSHEETS}{#2}}% \ifempty{#3}{% \ifempty{#1}{\setcounter{SHOWSOLUTIONS}{1}}{\setcounter{SHOWSOLUTIONS}{0}}}% {\setcounter{SHOWSOLUTIONS}{#3}}% } \newcommand\getVersionEtc[1][0.0.1]{% \@LRTgetVersionEtc#1......@} \def\makeLRTArray#1#2#3@{% \ifnum\value{LRTArrayCount}<\value{#1} % \else% \expandafter\gdef\csname#1.\number\value{#1}\endcsname{#2}\addtocounter{#1}{1}% \ifempty{#3}{}{\makeLRTArray{#1}#3@}\fi% } \gdef\defaultArrayStart{1} %\makeArray #2 is name of array, #3 is a list of vaules - typically {{x_1}{x_2}{x_3}{x_4}...} % creates a counter named #1 which has the number of elements in the array - 1 % and entries \csname #2.1\endcsname, \csname #1.2\endcsname, etc. % The optional argument #1 is an upper bound to the number of elements alloted. % The routine allocates elements until it finds an empty one or until there are #1 elements. \newcommand\makeArray[3][200]{% \setcounter{LRTArrayCount}{#1}% \@ifundefined{c@#2}{\newcounter{#2}}{}% \setcounter{#2}{\defaultArrayStart}% \xdef\xLRTyx{{#2}#3}% \expandafter\makeLRTArray\xLRTyx{}@% \addtocounter{#2}{-1}% } \def\LRTcover{\IfFileExists{\jobname.cover.\number\value{VERSION}.page}% {\xdef\coverFile{\jobname.cover.\number\value{VERSION}.page}}% {\IfFileExists{\jobname.cover.page}{\xdef\coverFile{\jobname.cover.page}}{}}% \setcounter{page}{0}\input\coverFile% } \def\coverSheet{\global\markedAnswerSheetfalse\LRTcover} \def\markedCoverSheet{\global\markedAnswerSheettrue\LRTcover} %: exam environment % At the end there is a box for each problem problem.problem_number % a box for each answer, answer.problem_number.answer_number and a count of number of answers in answer.problem_number.count % a box for each solution % a box for 'before problem.problem_number' % a box for 'after problem.problem_number' % The last line goes to the write routines, \writeVersionZero or \writePositiveVersions % but you colud make this smarter. \newenvironment{exam}[1][]{\getVersionEtc[#1]% \newcounter{file problem number}% \setcounter{file problem number}{0}% \xdef\versionFile{\jobname.\number\value{VERSION}.ver} \IfFileExists{\versionFile}{\input \versionFile}{}% }% {\xdef\numberOfProblemsInFile{\number\value{file problem number}}% \ifnum\value{VERSION}=0\relax\writeVersionZero\else\writePositiveVersions\fi} %: 'before problem' environment \newenvironment{before problem}{% \addtocounter{file problem number}{1}% \edef\LRTbeforeBox{\csname before problem.\number\value{file problem number}\endcsname}% \addtocounter{file problem number}{-1}% \global\expandafter\newbox\LRTbeforeBox% \global\expandafter\setbox\LRTbeforeBox=\vbox\bgroup}% {\egroup} %: 'after problem' environment \newenvironment{after problem}{% \edef\LRTafterBox{\csname after problem.\number\value{file problem number}\endcsname}% \global\expandafter\newbox\LRTafterBox% \global\expandafter\setbox\LRTafterBox=\vbox\bgroup}% {\egroup} %: problem environment % Boxes problem into box problem.problem_number % Sets counter answer.problem_number.count to 0 % prepends problem_number.ProblemData.pts to the box before it collects the problem text \newenvironment{problem}{\addtocounter{file problem number}{1}% \newcounter{answer.\number\value{file problem number}.count}% \setcounter{answer.\number\value{file problem number}.count}{0}% \edef\LRTproblemTag{\csname \number\value{file problem number}.ProblemData.pts\endcsname}% \expandafter\newbox\csname problem.\number\value{file problem number}\endcsname% \global\expandafter\setbox\csname problem.\number\value{file problem number}\endcsname=\vtop% \bgroup\noindent\LRTproblemTag}{\egroup} \def\IFLRTblankyy{ } \long\def\IFblank#1#2#3{% \def\IFLRTblankxx{#1}% \ifx\IFLRTblankxx\IFLRTblankyy{#2}\else{#3}\fi% } \long\gdef\@@LRTgetAnswers#1\\#2!{% \IFblank{#1}{}{% \addtocounter{answer.\number\value{file problem number}.count}{1}% \xdef\xLRTx{\number\csname c@answer.\number\value{file problem number}.count\endcsname}% \expandafter\newbox\csname answer.\number\value{file problem number}.\xLRTx\endcsname% \global\expandafter\setbox\csname answer.\number\value{file problem number}.\xLRTx\endcsname=\hbox{#1}% }% \IFblank{#2}{}{\@@LRTgetAnswers#2!}% } \long\def\LRTGetAnswers#1\end{% \@@LRTgetAnswers#1\\ !% \end} %: answers environment % Boxes each answer in box answer.problem_number.answer_number % Increments answer.problem_number.count % Boxes which would be blank are not done \newenvironment{answers}{% \LRTGetAnswers}{} %: solution environment % Boxes each solution in box solution.problem_number with space prepended for Solution. \newenvironment{solution}{% \expandafter\newbox\csname solution.\number\value{file problem number}\endcsname% \global\expandafter\setbox\csname solution.\number\value{file problem number}\endcsname=\vtop\bgroup\noindent \textbf{Solution.} }{\egroup} %%% WRITES %: write exam with and without version file. % If no version file make and write a default one and then use it. %: \writeVersionZero \gdef\writeVersionZero{% \makeArray{defaultMarksArray}{\defaultMarks}%% converts the \defaultMarks into an array \gdef\finalNumberOfProblems{{\tiny need a version file to be set correctly}}% \gdef\finalNumberOfPages{{\tiny need a version file to be set correctly}}% \gdef\finalNumberOfProblemsInFile{100}% \writeCoverSheets% \forloop{1}{\numberOfProblemsInFile}{write problem number}{% \writeVersionZeroProblem{\number\value{write problem number}}}% \ifnum\value{SHOWSOLUTIONS}=2\relax\newpage\writeSolutionsAtBackVersionZero\fi% } %: \writeVersionZeroProblem \def\writeVersionZeroProblem#1{%#1 is number of problem in file to be printed. \expandafter\@ifundefined{before problem.#1}{}{% \expandafter\copy\csname before problem.#1\endcsname}% \par\noindent% \llap{\textbf{\number\value{write problem number}.}}\noindent\expandafter\copy\csname problem.#1\endcsname% \writeVersionZeroAnswers{#1}% \expandafter\@ifundefined{after problem.#1}{}{% \expandafter\copy\csname after problem.#1\endcsname}% \ifnum\value{SHOWSOLUTIONS}=1\writeAtProblemSolutionVersionZero{#1}\fi% \par\vskip 10pt\noindent\vrule width \textwidth depth .1pt height 0pt\par\vskip 10pt% } %: \writeVersionZeroAnswers \def\writeVersionZeroAnswers#1{% \ifnum\value{answer.#1.count}=0 %No answers for this problem \else{% \vskip\betweenProblemAndAnswers% \par\noindent% \forloop{1}{\value{answer.#1.count}}{answerCounter}{% \@ifundefined{answer.#1.\number\value{answerCounter}}{}{% \penalty-1\hbox{\examMultipleChoiceItemMark{\expandafter\csname defaultMarksArray.\number\value{answerCounter}% \endcsname}\ % \edef\LRTlocalAnswerBox{\csname answer.#1.\number\value{answerCounter}\endcsname}% \expandafter\copy\LRTlocalAnswerBox\hskip 4pt}}\hfill\null}}% \fi} %: \writePositiveVersions \gdef\writePositiveVersions{% \xdef\versionFile{\jobname.\number\value{VERSION}.ver} \IfFileExists{\versionFile}{}{\makeVersionFile}% \loadVersionFile% \writePDF% } %: \makeVersionFile \gdef\makeVersionFile{% \newwrite\outFile% \immediate\openout\outFile=\versionFile% % \makeArray{defaultMarksArray}{\defaultMarks} \forloop{1}{\numberOfProblemsInFile}{tmpLRTC}{% \ifnum\value{answer.\number\value{tmpLRTC}.count}>0{% \edef\LRTNoA{\number\value{answer.\number\value{tmpLRTC}.count}}% \edef\LRTlocal{}% \forloop{1}{\LRTNoA}{tmpLRTCA}{% \edef\LRTlocal{\LRTlocal{\number\value{tmpLRTCA}}}% } \edef\dLRTd{\string\namedArgs{\number\value{tmpLRTC}.AnswerData}{{Perm}->{\LRTlocal}}}% \immediate\write\outFile{\dLRTd}}\fi}% % % \forloop{1}{\numberOfProblemsInFile}{tmpLRTC}{% \ifnum\value{answer.\number\value{tmpLRTC}.count}>0{% \edef\dLRTd{\string\namedArgs{\number\value{tmpLRTC}.AnswerData}{{perLine}->{3}}}% \immediate\write\outFile{\dLRTd}}\fi}% % % \forloop{1}{\numberOfProblemsInFile}{tmpLRTC}{% \ifnum\value{answer.\number\value{tmpLRTC}.count}>0{% \edef\LRTlocal{}\edef\LRTNoA{\number\value{answer.\number\value{tmpLRTC}.count}}% \forloop{1}{\LRTNoA}{tmpLRTCA}{% \edef\LRTlocal{\LRTlocal{\csname defaultMarksArray.\number\value{tmpLRTCA}\endcsname}}}% \edef\dLRTd{\string\namedArgs{\number\value{tmpLRTC}.AnswerData}{{Marks}->{\LRTlocal}{skip}->{\vskip 10pt}}}% \immediate\write\outFile{\dLRTd}}\fi}% % % \forloop{1}{\numberOfProblemsInFile}{tmpLRTC}{% \ifnum\value{answer.\number\value{tmpLRTC}.count}>0% \edef\LRTlocal{\defaultMultipleChoicePts}% \else\edef\LRTlocal{\defaultPartialCreditPts}% \fi% \edef\dLRTd{\string\namedArgs{\number\value{tmpLRTC}.ProblemData}{{pts}->{\LRTlocal}}}% \immediate\write\outFile{\dLRTd}}% % % \forloop{1}{\numberOfProblemsInFile}{tmpLRTC}{% \edef\LRTlocal{\number\value{tmpLRTC}}% \let\eject=\relax \def\LRTlocalA{\vfill\eject}% \edef\dLRTd{\string\namedArgs{\number\value{tmpLRTC}.PermutedProblemData}% {{fileProblem}->{\LRTlocal}{spaceAfter}->{\LRTlocalA}}}% \immediate\write\outFile{\dLRTd}}% % \immediate\closeout\outFile% } %: \loadVersionFile \gdef\loadVersionFile{% \input \versionFile\relax% \setcounter{tmpLRTC}{\numberOfProblemsInFile}% \@ifundefined{\number\value{tmpLRTC}.PermutedProblemData.fileProblem}{\errmessage{Version file has too few problems}}{\addtocounter{tmpLRTC}{1}\@ifundefined{\number\value{tmpLRTC}.PermutedProblemData.fileProblem}{}{\errmessage{Version file has too many problems}}}% % \forloop{1}{\numberOfProblemsInFile}{tmpLRTC}{% \edef\LRTpdfNumber{\csname\number\value{tmpLRTC}.PermutedProblemData.fileProblem\endcsname}% \expandafter\ifnum\csname\number\value{tmpLRTC}.PermutedProblemData.fileProblem\endcsname=0 \else{% % - make pdf.Problem.# = box for problem \@ifundefined{pdf.Problem.\number\value{tmpLRTC}}% {\global\expandafter\newbox\csname pdf.Problem.\number\value{tmpLRTC}\endcsname}{}% \edef\boxLRTname{\csname problem.\LRTpdfNumber\endcsname}% \global\expandafter\setbox\csname pdf.Problem.\number\value{tmpLRTC}\endcsname=\copy\boxLRTname% % - make pdf.before problem.# = box if needed \@ifundefined{before problem.\LRTpdfNumber}{}{% \@ifundefined{pdf.before problem.\number\value{tmpLRTC}}% {\expandafter\newbox\csname pdf.before problem.\number\value{tmpLRTC}\endcsname}{}% \edef\boxLRTname{\csname before problem.\LRTpdfNumber\endcsname}% \global\expandafter\setbox\csname pdf.before problem.\number\value{tmpLRTC}\endcsname=\copy\boxLRTname% }% % - make pdf.after problem.# = box if needed \@ifundefined{after problem.\LRTpdfNumber}{}{% \@ifundefined{pdf.after problem.\number\value{tmpLRTC}}% {\expandafter\newbox\csname pdf.after problem.\number\value{tmpLRTC}\endcsname}{}% \edef\boxLRTname{\csname after problem.\LRTpdfNumber\endcsname}% \global\expandafter\setbox\csname pdf.after problem.\number\value{tmpLRTC}\endcsname=\copy\boxLRTname% }% % - make pdf.Solution.# = box if needed \@ifundefined{solution.\LRTpdfNumber}{}{% \@ifundefined{pdf.Solution.\number\value{tmpLRTC}}% {\expandafter\newbox\csname pdf.Solution.\number\value{tmpLRTC}\endcsname}{}% \edef\boxLRTname{\csname solution.\LRTpdfNumber\endcsname}% \global\expandafter\setbox\csname pdf.Solution.\number\value{tmpLRTC}\endcsname=\copy\boxLRTname% }% % - make answer data into pdf.answer data \@ifundefined{c@pdf.Answer.\number\value{tmpLRTC}.count}% {\newcounter{pdf.Answer.\number\value{tmpLRTC}.count}}{}% \setcounter{pdf.Answer.\number\value{tmpLRTC}.count}{\value{answer.\LRTpdfNumber.count}}% \ifnum\value{answer.\LRTpdfNumber.count}>0{% \expandafter\xdef\csname pdf.AnswerData.perLine.\number\value{tmpLRTC}\endcsname% {\csname \LRTpdfNumber.AnswerData.perLine\endcsname}% \expandafter\xdef\csname pdf.AnswerData.skip.\number\value{tmpLRTC}\endcsname% {\csname \LRTpdfNumber.AnswerData.skip\endcsname}% % \makeArray[\value{answer.\LRTpdfNumber.count}]% {\number\value{tmpLRTC}.answerPermArray}% {\csname\LRTpdfNumber.AnswerData.Perm\endcsname}% \makeArray[\value{answer.\LRTpdfNumber.count}]% {\number\value{tmpLRTC}.pdf.answerMarksArray}% {\csname\LRTpdfNumber.AnswerData.Marks\endcsname}% % invert the perm \invertPerm{\number\value{pdf.Answer.\number\value{tmpLRTC}.count}}% {\number\value{tmpLRTC}.answerPermArray}% {\number\value{tmpLRTC}.pdf.answerPermArray}% % \expandafter\xdef\csname pdf.Answer.correct.\number\value{tmpLRTC}\endcsname{% \csname\number\value{tmpLRTC}.answerPermArray.1\endcsname}% \forloop{1}{\value{answer.\LRTpdfNumber.count}}{tmpLRTY}{% \@ifundefined{pdf.Answer.\number\value{tmpLRTC}.\number\value{tmpLRTY}}% {\expandafter\newbox\csname pdf.Answer.\number\value{tmpLRTC}.\number\value{tmpLRTY}\endcsname}{}% \edef\LRTPerm{\csname\number\value{tmpLRTC}.pdf.answerPermArray.\number\value{tmpLRTY}\endcsname}% \edef\boxLRTname{\csname answer.\LRTpdfNumber.\LRTPerm\endcsname}% \global\expandafter\setbox\csname pdf.Answer.\number\value{tmpLRTC}.\number\value{tmpLRTY}\endcsname=\copy\boxLRTname}% }\fi}\fi}% } \newcounter{PermCounterA}\newcounter{PermCounterB} \def\invertPerm#1#2#3{%#1 length of perm #2 name of perm #3 name of inverse \forloop{1}{#1}{PermCounterA}{% \forloop{1}{#1}{PermCounterB}{% \expandafter\ifnum\csname #2.\number\value{PermCounterB}\endcsname=\number\value{PermCounterA}% \expandafter\xdef\csname #3.\number\value{PermCounterA}\endcsname{\number\value{PermCounterB}}% \fi}}% } \def\writeProblemNumber{\llap{\textbf{\number\value{write problem number}.}}} %: \writePDF \def\writePDF{% \@ifundefined{finalNumberOfPages}{\gdef\finalNumberOfPages{0}}{}% \@ifundefined{finalNumberOfProblems}{\xdef\finalNumberOfProblems{\number\value{file problem number}}}{}% \def\LRTstartPageNumber{1}% \gdef\LRTcorrectMark{\correctMark}% \ifnum\value{COVERSHEETS}=1 % \coverSheet% \def\LRTstartPageNumber{2}% \else% \ifnum\value{COVERSHEETS}=2 % \gdef\LRTcorrectMark{\correctMarkA}% \markedCoverSheet% \def\LRTstartPageNumber{2}% \else% \ifnum\value{COVERSHEETS}=21 % \markedCoverSheet% \coverSheet% \def\LRTstartPageNumber{2}% \fi\fi\fi% % \setcounter{page}{\LRTstartPageNumber}% \setcounter{write problem number}{1}% \forloop{1}{\numberOfProblemsInFile}{write problem number}{% \writePositiveVersionProblem{\number\value{write problem number}} }% \newpage% \addtocounter{page}{-1}% \xdef\numberOfPages{\number\value{page}}% \addtocounter{page}{1}% \addtocounter{write problem number}{-1}% \xdef\numberOfProblems{\number\value{write problem number}}% \ifnum\value{SHOWSOLUTIONS}=2\relax\newpage\writeSolutionsAtBackVersionPositive\fi% \write@aux% } \def\writeProblemNumber{\llap{\textbf{\number\value{write problem number}.}}} %: \writePositiveVersionProblem \def\writePositiveVersionProblem#1{% \expandafter\ifnum\csname #1.PermutedProblemData.fileProblem\endcsname=0 \else% \expandafter\@ifundefined{pdf.before problem.#1}{}{% \expandafter\copy\csname pdf.before problem.#1\endcsname}% \par\noindent% \writeProblemNumber% \noindent\expandafter\copy\csname pdf.Problem.#1\endcsname% \ifnum\value{pdf.Answer.#1.count}>0\relax\writePositiveVersionAnswers{#1}\fi% \expandafter\@ifundefined{pdf.after problem.#1}{}{% \expandafter\copy\csname pdf.after problem.#1\endcsname}% \par\noindent% \ifnum\value{SHOWSOLUTIONS}=1\writeAtProblemSolutionVersionPositive{#1}\fi% \csname \number\value{write problem number}.PermutedProblemData.spaceAfter\endcsname% \fi} %: \writePositiveVersionAnswers \def\writePositiveVersionAnswers#1{ \vskip\betweenProblemAndAnswers% \setcounter{breakCounter}{\csname pdf.AnswerData.perLine.#1\endcsname}% \basic@LRTSkip=\textwidth\relax\divide\basic@LRTSkip by \csname pdf.AnswerData.perLine.#1\endcsname\relax% \forloop{1}{\value{pdf.Answer.#1.count}}{answerCounter}{% \noindent% \@ifundefined{pdf.Answer.#1.\number\value{answerCounter}}{}{% \leavevmode\hbox to\basic@LRTSkip{\examMultipleChoiceItemMark{% \csname #1.pdf.answerMarksArray.\number\value{answerCounter}\endcsname}\ % \edef\LRTlocalAnswerBox{\csname pdf.Answer.#1.\number\value{answerCounter}\endcsname}% \expandafter\copy\LRTlocalAnswerBox\hfil\null}% \ifnum\value{answerCounter}= \value{breakCounter}% \par\csname pdf.AnswerData.skip.#1\endcsname\noindent \addtocounter{breakCounter}{\csname pdf.AnswerData.perLine.#1\endcsname}% \fi% }}% } %: \writeAtProblemSolutionVersionZero \def\writeAtProblemSolutionVersionZero#1{% \@ifundefined{solution.#1}{}{ \vskip\aboveSolution% \par\noindent% \hbox to 0pt{\textbf{Solution. }\hss}% \expandafter\copy\csname solution.#1\endcsname}% } %: \writeSolutionsAtBackVersionZero \gdef\writeSolutionsAtBackVersionZero{% \setcounter{write problem number}{1}% \forloop{1}{\numberOfProblemsInFile}{write problem number}{% \@ifundefined{solution.\number\value{write problem number}}{}{% \vskip\aboveSolution% \par\noindent% \llap{\textbf{\number\value{write problem number}.}\ }% \expandafter\copy\csname solution.\number\value{write problem number}\endcsname% \par\vskip 10pt\noindent\vrule width \textwidth depth .1pt height 0pt\par\vskip 10pt}}% } %: \writeAtProblemSolutionVersionPositive \def\writeAtProblemSolutionVersionPositive#1{% \@ifundefined{pdf.Solution.#1}{}{% \vskip\aboveSolution% \par\noindent% \hbox to 0pt{\textbf{Solution. }\hss}% \expandafter\copy\csname pdf.Solution.#1\endcsname}% } %: \writeSolutionsAtBackVersionPositive \gdef\writeSolutionsAtBackVersionPositive{% \setcounter{write problem number}{1}% \forloop{1}{\numberOfProblemsInFile}{write problem number}{% \@ifundefined{pdf.Solution.\number\value{write problem number}}{}{% \vskip\aboveSolution% \par\noindent% \llap{\textbf{\number\value{write problem number}.}\ }% \expandafter\copy\csname pdf.Solution.\number\value{write problem number}\endcsname% \par\vskip 10pt\noindent\vrule width \textwidth depth .1pt height 0pt\par\vskip 10pt}}% } %: \writeCoverSheets \gdef\writeCoverSheets{% \ifnum\value{COVERSHEETS}=1 % \coverSheet% \else% \ifnum\value{COVERSHEETS}=2 % \gdef\LRTcorrectMark{\correctMarkA}% \markedCoverSheet% \else% \ifnum\value{COVERSHEETS}=21 % \markedCoverSheet% \coverSheet% \fi\fi\fi% \def\LRTstartPageNumber{2}% } \gdef\write@aux{ \edef\dLRTd{\string\gdef\string\finalNumberOfPages{\numberOfPages}}% \immediate\write\@auxout{\dLRTd}% \edef\dLRTd{\string\gdef\string\finalNumberOfProblems{\numberOfProblems}}% \immediate\write\@auxout{\dLRTd}% \edef\dLRTd{\string\gdef\string\finalNumberOfProblemsInFile{\numberOfProblemsInFile}}% \immediate\write\@auxout{\dLRTd}%% } %: \itemMark \gdef\itemMark#1#2{% #1 - pdf file problem number; #2 - answer number from 1- whatever for that problem. \ifcsname \number#1.PermutedProblemData.fileProblem\endcsname\relax{% \expandafter\ifnum\csname#1.PermutedProblemData.fileProblem\endcsname=0\relax\else{% \ifmarkedAnswerSheet{% \edef\LRTcorrect{\csname pdf.Answer.correct.#1\endcsname}% \ifnum\LRTcorrect=\number#2 {% \coverSheetMarkedMultipleChoiceItemMark{\csname#1.pdf.answerMarksArray.#2\endcsname}}% \else{% \coverSheetMultipleChoiceItemMark{\csname#1.pdf.answerMarksArray.#2\endcsname}}\fi}% \else{% \coverSheetMultipleChoiceItemMark{\csname#1.pdf.answerMarksArray.#2\endcsname}}% \fi}\fi}\fi}% %: \multipleChoiceLine \gdef\multipleChoiceLine#1#2{%#1 - pdf file problem number; #2 - width of line. \ifcsname \number#1.PermutedProblemData.fileProblem\endcsname\relax{% \expandafter\ifnum\csname#1.PermutedProblemData.fileProblem\endcsname=0\relax\else% {\edef\@LRTactualProblemNumberInFile{\csname \number#1.PermutedProblemData.fileProblem\endcsname}% \ifcsname \number\@LRTactualProblemNumberInFile.AnswerData.Perm\endcsname\relax% {% \setcounter{tmpLRTMCL}{\value{pdf.Answer.#1.count}}% \addtocounter{tmpLRTMCL}{-1}% \ifnum\value{tmpLRTMCL}=0 \setcounter{tmpLRTMCL}{1}\fi% \basic@LRTSkip#2 % \advance\basic@LRTSkip by -30pt% \divide\basic@LRTSkip by \value{tmpLRTMCL}\relax% \edef\@LRTnumberOfAnswers{\number\value{pdf.Answer.#1.count}}% \edef\LRTcorrect{\csname pdf.Answer.correct.#1\endcsname}% \mbox{}\hbox to 30pt{\ \hbox to 12pt{\hfill#1}.\hfill}% \forloop{1}{\@LRTnumberOfAnswers}{tmpLRTMCL}{% \ifmarkedAnswerSheet% {% \ifnum\value{tmpLRTMCL}=\LRTcorrect % \mbox{}\hbox to \basic@LRTSkip{\coverSheetMarkedMultipleChoiceItemMark{% \csname#1.pdf.answerMarksArray.\number\value{tmpLRTMCL}\endcsname}\hfill}% \else% \mbox{}\hbox to \basic@LRTSkip{\coverSheetMultipleChoiceItemMark{% \csname#1.pdf.answerMarksArray.\number\value{tmpLRTMCL}\endcsname}\hfill}% \fi}% \else{% \mbox{}\hbox to \basic@LRTSkip{\coverSheetMultipleChoiceItemMark{% \csname#1.pdf.answerMarksArray.\number\value{tmpLRTMCL}\endcsname}% \hfill}}% \fi}%-- end of loop }\fi% }\fi}\fi} %: \isPartialCredit \gdef\isPartialCredit#1{%#1 - pdf file problem number \global\PartialCreditfalse% \ifcsname \number#1.PermutedProblemData.fileProblem\endcsname\relax% \edef\@LRTactualProblemNumberInFile{\csname \number#1.PermutedProblemData.fileProblem\endcsname}% \edef\@LRTnumberOfAnswers{\number\value{answer.\@LRTactualProblemNumberInFile.count}}% \ifnum\number\@LRTnumberOfAnswers > 0 \global\PartialCreditfalse\else\global\PartialCredittrue\fi% \fi% \ifPartialCredit} %: \WriteNewVersion \def\WriteNewVersion#1{% \getVersionEtc[#1]% \xdef\versionFile{\jobname.\number\value{VERSION}.ver}% \IfFileExists{\loadVersionFile\writePDF}{}% } %: \writeSOLS \def\writeSOLS{% \@ifundefined{finalNumberOfPages}{\gdef\finalNumberOfPages{0}}{}% \@ifundefined{finalNumberOfProblems}{\xdef\finalNumberOfProblems{\number\value{file problem number}}}{}% \def\LRTstartPageNumber{1}% \markedCoverSheet% \def\LRTstartPageNumber{2}% % \pagestyle{empty}\thispagestyle{empty}% \setcounter{page}{\LRTstartPageNumber}% \writeSolutionsAtBackVersionPositive% } %: \writeJustSolutions \gdef\writeJustSolutions#1{% \getVersionEtc[#1]% \xdef\versionFile{\jobname.\number\value{VERSION}.ver}% \IfFileExists{\versionFile}{\loadVersionFile\writeSOLS}{\errmessage{I need a version file.}}% } \makeatother \pagestyle{empty} \thispagestyle{empty}