%% %% This is file `exerquiz.sty', %% generated with the docstrip utility. %% %% The original source files were: %% %% exerquiz.dtx (with options: `copyright,package') %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Exerquiz.sty package, %% %% Copyright (C) 1999-2018 D. P. Story %% %% dpstory@uakron.edu %% %% %% %% This program can redistributed and/or modified under %% %% the terms of the LaTeX Project Public License %% %% Distributed from CTAN archives in directory %% %% macros/latex/base/lppl.txt; either version 1 of the %% %% License, or (at your option) any later version. %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{exerquiz} [2018/10/03 v8.2.5 % Exerquiz: Exercises and Quizzes for LaTeX/PDF package (dps)] \usepackage{keyval} \RequirePackage{ifpdf}[2006/02/20] \RequirePackage{ifxetex}[2006/08/21] \RequirePackage{ifluatex} \@ifundefined{exqtable}{\def\exqtable{table}}{} \IfFileExists{xcolor.sty}{% \def\eq@ColorPackage{xcolor}% \PassOptionsToPackage{\exqtable,hyperref}{xcolor}} {\def\eq@ColorPackage{color}} \DeclareOption{noxcolor}{\def\eq@ColorPackage{color}} \DeclareOption{forpaper}{% \eqforpapertrue\PassOptionsToPackage{monochrome}{\eq@ColorPackage} \AtBeginDocument{\ifnum\eq@drivernum=4 \else\AllowPeeking\fi} } \DeclareOption{forcolorpaper}{\eqforpapertrue % for print \AtBeginDocument{\ifnum\eq@drivernum=4 \else\AllowPeeking\fi} } \DeclareOption{preview}{\PassOptionsToPackage{preview}{eforms}} \DeclareOption{nosolutions}{\eq@nosolutionstrue\eq@nolinktrue} \DeclareOption{noquizsolutions}{\eq@noquizsolutionstrue\eq@nolinktrue} \let\eq@YES=y \let\eq@NO=n \let\eq@One=1 \let\eq@Zero=0 \def\eq@r{r}\let\eq@f=f \let\eq@l=l \DeclareOption{online}{\let\eq@online\eq@YES} \let\eq@online\eq@NO \DeclareOption{nohiddensolutions}{\eq@globalshowsolutionstrue} \DeclareOption{noHiddensolutions}% {\eq@globalshowsolutionstrue\AtBeginDocument{\def\Hidesymbol{h}}} \DeclareOption{solutionsafter}{\eq@solutionsaftertrue\eq@nolinktrue} \DeclareOption{solutionsonly}{\solutionsonlytrue\answerkeytrue \therearesolutionstrue\AtEndOfPackage{\let\exerSolnsHeadnToc\relax}} \newif\ifsolutionsonly\solutionsonlyfalse \@ifundefined{ifanswerkey}{\newif\ifanswerkey\answerkeyfalse}{} \DeclareOption{contsolns}{\AtEndOfPackage{\InputIfFileExists {contsolns.def}{\contsolnsInputMsg}{\contsolnsErrorMsg}}} \def\contsolnsInputMsg{\PackageInfo{exerquiz}{contsolns option, inputting file contsolns.def}} \def\contsolnsErrorMsg{\PackageWarning{exerquiz}{contsolns option, cannot find file contsolns.def}} \DeclareOption{nocorrections}{\nocorrectionstrue} \DeclareOption{proofing}{\eq@proofingtrue} \newif\ifaebshowgrayletters\aebshowgraylettersfalse \DeclareOption{showgrayletters}{\aebshowgrayletterstrue} \@ifundefined{ifvspacewithsolns}{% \DeclareOption{vspacewithsolns}{\vspacewithsolnstrue} \newif\ifvspacewithsolns\vspacewithsolnsfalse }{} \@ifundefined{ifdisplayworkarea}{\newif\ifdisplayworkarea \displayworkareafalse}{} \DeclareOption{nodljs}{\PassOptionsToPackage{nodljs}{insdljs}% \AtEndOfPackage{\let\importdljs\eq@YES}} \DeclareOption{execJS}{\PassOptionsToPackage{execJS}{insdljs}} \DeclareOption{exercisesonly}{\PassOptionsToPackage{nodljs}{insdljs}} \DeclareOption{debug}{\PassOptionsToPackage{debug}{insdljs}} \DeclareOption{allowrandomize}{\AtEndOfPackage{\inputRandomizeChoices}} \def\inputRandomizeChoices{\InputIfFileExists{aebrandom.def} {\PackageInfo{exerquiz}{inputting aebrandom.def}} {cannot find aebrandom.def}} \newif \ifusesumrytbls \usesumrytblsfalse \DeclareOption{usesumrytbls}{\usesumrytblstrue \def\inputSumryTblCode{\InputIfFileExists{aebsumrytbls.def} {\PackageInfo{exerquiz}{inputting aebsumrytbls.def}}% {cannot find aebsumrytbls.def}}} \let\inputSumryTblCode\relax \DeclareOption{usemcfi}{% \def\inputMCFICode{\InputIfFileExists{usemcfi.def} {\PackageInfo{exerquiz}{inputting usemcfi.def}}% {cannot find usemcfi.def}}} \let\inputMCFICode\relax \newif\ifwithinMCFI\withinMCFIfalse \DeclareOption{dvipsone}{% \def\eq@drivernum{0}\def\eq@driver{dvipsone}% \PassOptionsToPackage{dvipsone}{eforms} } \DeclareOption{dvips}{% \def\eq@drivernum{0}\def\eq@driver{dvips}% \PassOptionsToPackage{dvips}{eforms} } \DeclareOption{pdftex}{% \def\eq@drivernum{1}\def\eq@driver{pdftex}% \PassOptionsToPackage{pdftex}{\eq@ColorPackage} \PassOptionsToPackage{pdftex}{eforms} } \DeclareOption{luatex}{% \def\eq@drivernum{1}\def\eq@driver{luatex}% \PassOptionsToPackage{luatex}{\eq@ColorPackage} \PassOptionsToPackage{luatex}{eforms} } \DeclareOption{dvipdfm}{% \def\eq@drivernum{2}\def\eq@driver{dvipdfm}% \PassOptionsToPackage{dvipdfm}{\eq@ColorPackage}% \PassOptionsToPackage{dvipdfm}{eforms}% } \DeclareOption{dvipdfmx}{% \def\eq@drivernum{2}\def\eq@driver{dvipdfmx}% \PassOptionsToPackage{dvipdfmx}{\eq@ColorPackage}% \PassOptionsToPackage{dvipdfmx}{eforms}% } \DeclareOption{xetex}{% \def\eq@drivernum{2}\def\eq@driver{xetex}% \PassOptionsToPackage{xetex}{\eq@ColorPackage} \PassOptionsToPackage{xetex}{eforms}% } \DeclareOption{textures}{\def\eq@drivernum{3}% \def\eq@driver{textures}% \PassOptionsToPackage{textures}{\eq@ColorPackage}% \PassOptionsToPackage{textures}{eforms}% } \DeclareOption{dviwindo}{\def\eq@drivernum{4}\def\eq@driver{dviwindo}% \eq@noformstrue\PassOptionsToPackage{nodljs}{insdljs}} \DeclareOption{unicode}{\PassOptionsToPackage{unicode}{hyperref}} \DeclareOption{useui}{\PassOptionsToPackage{useui}{eforms}} \let\LangRedefinitions\relax \DeclareOption{french}{% \def\LangRedefinitions{\InputIfFileExists{eqfr.def}% {\PackageInfo{exerquiz}{Inputting French Option}}% {\PackageInfo{exerquiz}{French Option: Cannot find the file eqfr.def, using the default, English.}}}} \DeclareOption{german}{% \def\LangRedefinitions{\InputIfFileExists{eqde.def}% {\PackageInfo{exerquiz}{Inputting German Option}}% {\PackageInfo{exerquiz}{German Option: Kann die Datei eqde.def nicht finden, benutze Default, Englisch.}}}} \DeclareOption{norsk}{% \def\LangRedefinitions{\InputIfFileExists{eqno.def}% {\PackageInfo{exerquiz}{Inputting Norsk Option}}% {\PackageInfo{exerquiz}{Norsk Option: Cannot find the file eqno.def, using the default, English.}}}} \DeclareOption{dutch}{% \def\LangRedefinitions{\InputIfFileExists{eqnl.def}% {\PackageInfo{exerquiz}{Inputting Dutch Option}}% {\PackageInfo{exerquiz}{Dutch Option: Kan bestand eqnl.def niet vinden, gebruik default, Engels.}}}} \DeclareOption{spanish}{% \def\LangRedefinitions{\InputIfFileExists{eqes.def}% {\PackageInfo{exerquiz}{Inputting Spanish Option}}% {\PackageInfo{exerquiz}{Spanish Option: Opci\'on Espa\~nola: no puede encontrar el fichero eqes.def, usar\'a por defecto, English.}}}} \DeclareOption{italian}{% \def\LangRedefinitions{\InputIfFileExists{eqit.def}% {\PackageInfo{exerquiz}{Opzione Lingua Italiana}}% {\PackageInfo{exerquiz}{pzione Italiano: Non trovo il file eqit.def, utilizzo quello di default, English.}}}} \DeclareOption{russian}{% \@ifpackageloaded{hyperref}{% \ifHy@unicode\else\PackageWarning{exerquiz}{% The unicode option recommended for hyperref\MessageBreak}\fi }{\PassOptionsToPackage{unicode}{hyperref}} \def\LangRedefinitions{\InputIfFileExists{eqru.def}% {\PackageInfo{exerquiz}{Inputting Russian Option}}% {\PackageInfo{exerquiz}{Russian Option: Cannot find the file eqru.def, using the default, English.}}}} \DeclareOption{dansk}{% \def\LangRedefinitions{\InputIfFileExists{eqda.def}% {\PackageInfo{exerquiz}{Inputting Dansk Option}}% {\PackageInfo{exerquiz}{Dansk Option: Cannot find the file eqda.def, using the default, English.}}}} \DeclareOption{polish}{% \def\LangRedefinitions{\InputIfFileExists{eqpo.def}% {\PackageInfo{exerquiz}{Inputting Polish Option}}% {\PackageInfo{exerquiz}{Polish Option: Cannot find the file eqpo.def, using the default, English.}}}} \DeclareOption{finnish}{% \def\LangRedefinitions{\InputIfFileExists{eqfin.def}% {\PackageInfo{exerquiz}{Inputting Finnish Option}}% {\PackageInfo{exerquiz}{Finnish Option: Cannot find the file eqfin.def, using the default, English.}}}} \DeclareOption{catalan}{% \def\LangRedefinitions{\InputIfFileExists{eqcat.def}% {\PackageInfo{exerquiz}{Inputting Catalan Option}}% {\PackageInfo{exerquiz}{Catalan Option: Cannot find the file eqcat.def, using the default, English.}}}} \DeclareOption{czech}{% \def\LangRedefinitions{\InputIfFileExists{eqcz.def}% {\PackageInfo{exerquiz}{Inputting Czech Option}}% {\PackageInfo{exerquiz}{Czech Option: Cannot find the file eqcz.def, using the default, English.}}}} \DeclareOption{brazil}{% \def\LangRedefinitions{\InputIfFileExists{eqbr.def}% {\PackageInfo{exerquiz}{Inputting Brazilian Portuguese Option}}% {\PackageInfo{exerquiz}{Portuguese Option: Opc\~ao Portugu\^es: n\~ao foi poss\'ivel encontrar o arquivo eqbr.def, usaremos o padr\~ao, English.}}}} \DeclareOption{turkish}{% \@ifpackageloaded{hyperref}{% \ifHy@unicode\else\PackageWarning{exerquiz}{% The unicode option recommended for hyperref\MessageBreak}\fi }{\PassOptionsToPackage{unicode}{hyperref}} \def\LangRedefinitions{\InputIfFileExists{eqtr.def}% {\PackageInfo{exerquiz}{Inputting Turkish Option}}% {\PackageInfo{exerquiz}{Cannot find the file eqtk.def, using the default, English.}}}} \DeclareOption*{\PassOptionsToPackage{\CurrentOption}{\eq@ColorPackage}} \@ifpackageloaded{xcolor}% {% \@ifpackagelater{xcolor}{2004/07/04}{} {% \PackageError{exerquiz}{% *************************************************\MessageBreak * Your Version of `xcolor.sty' is too old!\MessageBreak * You need the version from 2004/07/04 or newer\MessageBreak * or use: \string\usepackage[noxcolor]{exerquiz}\MessageBreak *************************************************}{}% }% }{} \let\iterate\relax \newif\ifeq@solutionsafter \eq@solutionsafterfalse \newif\ifeq@hidesolution \eq@hidesolutionfalse \newif\ifeq@globalshowsolutions \eq@globalshowsolutionsfalse \newif\ifeq@nosolutions \eq@nosolutionsfalse \newif\ifeq@proofing \eq@proofingfalse \providecommand\turnProofingOn{\eq@proofingtrue} \providecommand\turnProofingOff{\eq@proofingfalse} \newif\ifeqforpaper \eqforpaperfalse \newif\ifeq@noforms \eq@noformsfalse \newif\ifeq@noquizsolutions \eq@noquizsolutionsfalse \newif\ifnocorrections \nocorrectionsfalse \@ifundefined{ifeqe@flextended}{\newif\ifeqe@flextended \eqe@flextendedfalse}{} \@ifundefined{ifcont@nnot}{\newif\ifcont@nnot \cont@nnotfalse}{} \@ifundefined{if@eqalignfilllinestoleft}{\newif\if@eqalignfilllinestoleft \@eqalignfilllinestoleftfalse}{} \newif\ifkeepdeclaredvspacing \keepdeclaredvspacingfalse \newif\ifeq@nolink \eq@nolinkfalse \def\eq@ckglobalhide{\ifeq@globalshowsolutions\eq@hidesolutionfalse\fi} \def\hidesymbol{h}\def\Hidesymbol{H} \newif\iftherearesolutions \therearesolutionsfalse \newif\ifIsRespBox \global\IsRespBoxfalse \def\SolutionsAfter{\eq@solutionsaftertrue\eq@nolinktrue} \newif\ifcqSA\cqSAfalse \def\SolutionsAtEnd{\eq@solutionsafterfalse\eq@nolinkfalse \displayworkareatrue\ifvspacewithsolns\eq@nosolutionsfalse\else \eq@nosolutionstrue\fi\eq@proofingfalse\answerkeyfalse} \def\NoSpaceToWork{\let\eq@insertverticalspace\eq@NO} \def\SpaceToWork{\let\eq@insertverticalspace\eq@YES} \SpaceToWork \long\def\ifNoSolutions#1#2{% \ifeq@nosolutions\expandafter#1\else \expandafter#2\fi } \newif\ifeq@randomizeChoices \eq@randomizeChoicesfalse \newif\ifeq@randomizeallChoices \eq@randomizeallChoicesfalse \def\turnOnRandomize{\eq@randomizeallChoicestrue} \def\obeyLocalRandomize{\eq@randomizeallChoicesfalse} \let\saveRandomSeed\relax \let\inputRandomSeed\relax \def\CorrectionsOn{\global\nocorrectionsfalse} \def\CorrectionsOff{\global\nocorrectionstrue} \AtBeginDocument{\ifeq@noforms\else\Form\fi} \AtEndDocument{% \include@solutions \ifeq@noforms\else\include@quizsolutions\fi \clearpage \csname endForm\endcsname \if\eq@drivernum2\else\clearpage\fi } \InputIfFileExists{exerquiz.cfg}{}{} \@ifpackageloaded{web}{% \ExecuteOptions{\eq@driver@name}% }{% \ifluatex\ExecuteOptions{luatex}\else \ifpdf\ExecuteOptions{pdftex}\else \ifxetex\ExecuteOptions{xetex}\else \InputIfFileExists{web.cfg}{} {\@ifundefined{l@tex@@@@driver}{\ExecuteOptions{dvips}} {\ExecuteOptions{dvipsone}}}\fi\fi\fi } \ProcessOptions \RequirePackage{array} \RequirePackage{\eq@ColorPackage} \RequirePackage{comment} \RequirePackage{verbatim} \RequirePackage{hyperref} \RequirePackage{amssymb}% used for return symbols \RequirePackage{eforms}[2012/06/20] \@ifundefined{eq@drivernum}{% \PackageError{exerquiz}% {You have not specified dvips, dvipsone, pdftex, dvipdfm, dvipdfmx, or xetex \MessageBreak in the option list of the exerquiz package} {Place one of the drivers dvips, dvipsone, pdftex, dvipdfm, dvipdfmx, or xetex \MessageBreak in the option list of the exerquiz package.} }{} \edef\eq@restoreCats{% dps17 \catcode`\noexpand\"=\the\catcode`\"\relax \catcode`\noexpand\'=\the\catcode`\'\relax \catcode`\noexpand\,=\the\catcode`\,\relax \catcode`\noexpand\(=\the\catcode`\(\relax \catcode`\noexpand\!=\the\catcode`\!\relax \catcode`\noexpand\_=\the\catcode`\_\relax } \@makeother\"\@makeother\'\@makeother\,% \@makeother\(\@makeother\!\@makeother\_ \@ifundefined{ifsolutionsAtEnd} {\newif\ifsolutionsAtEnd\solutionsAtEndtrue}{} \ifeq@nosolutions\solutionsAtEndfalse\fi \ifeq@solutionsafter\solutionsAtEndfalse\fi \@ifundefined{if@fleqn}{\let\fleqnOn\relax\let\fleqnOff\relax} {\def\fleqnOn{\@fleqntrue}\def\fleqnOff{\@fleqnfalse}} \@ifundefined{if@inclkey}{\newif\if@inclkey\@inclkeytrue}{} \def\eqretnSymb{$\blacksquare$}%{\rule{6bp}{6.8bp}} \newcommand\exlabel{Exercise} \newcommand\exlabelsol{\exlabel} \newcommand\exsectitle{Solutions to \exlabel s} \newcommand\exsecrunhead{\exsectitle} %% change to @ form \newcommand{\exsolafter}{\eq@exsolafterDefault} \newcommand{\resetSolnAfterToDefault}{% \def\exsolafter{\eq@exsolafterDefault}} \newcommand{\exsolafterDefault}[1]{\def\eq@exsolafterDefault{#1}% \def\exSolafterDefault{#1}\resetSolnAfterToDefault} \exsolafterDefault{\textit{Solution}:} \newcommand{\renameSolnAfterTo}[1]{\def\exsolafter{#1}} \newcommand{\adjDisplayBelow}{\vskip-\lastskip\vskip-\baselineskip} \newcommand{\adjDisplayBelowPlus}{\adjDisplayBelow\recoverDisplayBelow} \def\recoverDisplayBelow{\vskip\belowdisplayskip} \newcommand\eq@sqslsectitle{Solutions to Quizzes} \newcommand\sqslsectitle{\eq@sqslsectitle} \newcommand\eq@sqslsecrunhead{Solutions to Quizzes} \newcommand\sqslsecrunhead{\eq@sqslsecrunhead} \newcommand\eq@sqsllabel{\protect\textbf{Solution to Quiz:}} \newcommand\sqsllabel{\eq@sqsllabel} \newcommand\sqsolafter{\textit{Solution}:} \newcommand{\sqDefaultFmtTitle}[1]% {\def\eq@sqlabel{#1}\def\sqlabel{#1}} \newcommand\sqlabel{\eq@sqlabel} \sqDefaultFmtTitle{\textcolor{red}{Quiz}} \newcommand\eq@sqslrtnlabel{\protect\eqretnSymb} \newcommand\sqslrtnlabel{\eq@sqslrtnlabel} \newcommand\eqsqrtmsg{"Right!"} \newcommand\eqsqwgmsg{"Wrong!"} \newcommand\doNotShowAgainMsg{Do not show this message again} \newcommand\eq@bqlabel{Begin Quiz} \newcommand\bqlabel{\eq@bqlabel} \newcommand\eq@bqlabelISO{\eq@bqlabel} \newcommand\bqlabelISO{\eq@bqlabelISO} \newcommand\setDefShortQuizLabelName[1]% {\def\eq@defaultShortQuizLabelName{#1}} \setDefShortQuizLabelName{Quiz} \newcommand\setDefQuizLabelName[1] {\def\eq@defaultQuizLabelName{#1}} \setDefQuizLabelName{Quiz} \newcommand\eq@eqlabel{End Quiz} \newcommand\eqlabel{\eq@eqlabel} \newcommand\eq@Score{Score:}\newcommand\eq@OutOf{out of} \newcommand\eq@ptScore{Score:} \newcommand\stOutOf{of} \newcommand\eqScore{\eq@Score}\newcommand\eqOutOf{\eq@OutOf} \newcommand\eqptScore{\eq@ptScore} \newcommand\eqInitQuizMsg{% "You must initialize the Quiz! Click on "+msg+"."} \newcommand\eqQuizTotalMsg{% "\eqScore\space"+Score+" \eqOutOf\space"+nQuestions} \newcommand\eqQuizPointsMsg{% "\eqptScore\space"+ptScore+" \eqOutOf\space"+nPointTotal} \newcommand\eqQuizPercentMsg{pcScore+"\%"} \newcommand\eqQuizGradeMsg{quizGrade} \newcommand\eqMadeChoice{% "You have already made a choice." + " Your choice was ("+Responses[probno]+")." + " Do you want to change it?"} \newcommand\eq@local@CA{Correct} \newcommand\eq@local@RC{My Answers!} \newcommand\eq@local@AC{Please!} \newcommand\eq@local@CorrAnsButton{Ans} \newcommand{\eq@local@sqClearButton}{Clear} \newcommand\eqerrABS{"Absolute values not balanced. Please correct."} \dlJSStr[noquotes]\eqerrBadMathFunc{"The expression \""+aF[i] +"\" is neither a defined function nor a valid math expression."} \newcommand\eqParens{"Parentheses"} \newcommand\eqBrackets{"Brackets"} \newcommand\eqBraces{"Braces"} \newcommand\eqerrDelimNotBal{aGroup[i][2] + " not balanced. Please correct."} \newcommand\eqerrBadExp{"Invalid mathematical expression. A problem with one of the exponents. Please correct."} \newcommand\eqerrUnfinishQuiz{"There is an unfinished quiz, please finish before moving on to another."} \newcommand\noPeekMsg{"Viewing Solutions to quizzes is not allowed until you take or finish this quiz!"} \newcommand\highThresholdMsg{"You are required to respond to all questions before the quiz is evaluated."} \newcommand\eqSyntaxErrorUndefVar{"Syntax Error: Possibly an undefined variable present, or an expression is not written in an expected format."} \dlJSStr[noquotes]{\eqSyntaxErrorComma}{% "Syntax Error: A comma was found" + " in your response \"" + UserAns + "\". Please remove the comma, or this answer" + " will be marked as wrong."} \newcommand{\limSelWarningMsg}{"For this question, you are allowed to make at most " + n + " selections."} \newcommand{\defaultReqFormMsg}{% "The expression is not in the expected form."} \PackageInfo{exerquiz}{* Using \eq@driver\space option *} \ifsolutionsonly \InputIfFileExists{\jobname_xdefs.cut}{% \typeout{^^JExerquiz|Eqexam: Reading \jobname_xdefs.cut^^J}} {\PackageWarningNoLine{exerquiz|eqexam}{% \jobname_xdefs.cut not found.\MessageBreak Recompile file under the vspacewithsolns\MessageBreak option, then compile with the solutionsonly\MessageBreak option}} \else \newwrite\ex@solns \immediate\openout \ex@solns \jobname.sol \newcommand{\writeToExSolns}[1]{% \set@display@protect \immediate\write\ex@solns{#1}% \set@typeset@protect } \newwrite\eq@xrefdefns \immediate\openout\eq@xrefdefns\jobname_xdefs.cut \fi \newwrite\quiz@solns \immediate\openout \quiz@solns \jobname.qsl \newcommand{\writeToQzSolns}[1]{% \set@display@protect \immediate\write\quiz@solns{#1}% \set@typeset@protect } \def\eq@IWAuxOut#1{\immediate\write\@auxout{#1}} \def\eq@IWDefs#1{\immediate\write\eq@xrefdefns{#1}} \newcounter{eqexno} \setcounter{eqexno}{0} \newcounter{@exno} \setcounter{@exno}{0} % running exno \newcounter{quizno} \setcounter{quizno}{0} \renewcommand\thequizno{\alph{quizno}} \def\theHquizno{\curr@quiz.\theeqquestionnoi.% \ifcase\@eqquestiondepth\or\or\arabic{eqquestionnoii}.% \or\arabic{eqquestionnoii}.\roman{eqquestionnoiii}.% \else\fi\alph{quizno}} \newlength\eqemargin \eqemargin=0pt \newcounter{eqpointvalue} \setcounter{eqpointvalue}{0} \newlength\eq@tmplength \newlength\eqtmplength \newcounter{questionno} \newcounter{eqquestionnoi} \newcounter{eqquestionnoii} \newcounter{eqquestionnoiii} \newcount\@eqquestiondepth \@eqquestiondepth=0 \newcounter{grpquestionno} \newcounter{partno} \newif\ifuseNumForParts\useNumForPartsfalse \def\alphaParts{\def\partnoFmt{\alph}\useNumForPartsfalse}\alphaParts \def\numberParts{\def\partnoFmt{\arabic}\useNumForPartstrue} \renewcommand\thepartno{\partnoFmt{partno}} \newtoks\eq@scratchtoks \def\theHpartno{partno\the@exno\thepartno} \def\verbatimwrite{\@bsphack \let\do\@makeother\dospecials \catcode`\^^M\active \catcode`\^^I=12 \def\verbatim@processline{% \immediate\write\verbatim@out {\the\verbatim@line}}% \verbatim@start} \def\endverbatimwrite{\@esphack} \providecommand\PBS[1]{\let\temp=\\#1\let\\=\temp} \newcommand\exlabelformat{{\scshape\exlabel\ \theeqexno.}} \newcommand\exlabelformatwp{\exlabelformat} \newcommand\exsllabelformat{\protect\textbf{\exlabelsol\ \theeqexno.}} \newcommand\exsllabelformatwp {\protect\textbf{\exlabelsol\ \theeqexno(\thepartno)}} \newcommand\exrtnlabelformat{$\square$} \newcommand\exrtnlabelformatwp{$\square$} \newcommand{\belowexskip}[1]{\setlength{\eq@tmplength}{#1}% \edef\eq@exerskip{\noexpand\removelastparskip \noexpand\vskip\the\eq@tmplength\relax\kern0pt}} \let\eqexerskip\belowexskip \belowexskip{\medskipamount} \newcommand{\aboveexskip}[1]{\setlength{\eq@tmplength}{#1}% \edef\eq@priorexskip{\noexpand\vskip\the\eq@tmplength\relax \kern0pt}} \let\priorexskip\aboveexskip \aboveexskip{\medskipamount} \let\eq@postexerciseHook\relax \newcommand\belowexsolnskip{\protect\medskip} \def\removelastparskip{\ifdim\parskip>0pt\vskip-\parskip\fi} \newcommand{\nolinkcolor}[1]{\def\@nolinkcolor{#1}} \nolinkcolor{blue} \newcommand{\exerSolnsInExtFile}[2][] {\let\exerSolns@ExtFile\eq@YES\gdef\eq@exerSolns@fileName{#2}% \gdef\exerSolns@ReturnPath{#1}} \let\exerSolns@ExtFile\eq@NO \def\exerSolns@ReturnPath{} \let\marginparpriorhook\@empty % used to material before the exercise \let\marginparafterhook\@empty % used to material after the exercise \let\afterlabelhskip\space \let\exersolnheadhook\@empty \let\exer@solnheadhook\@empty \newcommand{\eqexheader} {% \ifeq@nolink % no link to solution \mbox{\color{\@nolinkcolor}\if\exerstar*\exlabelformatwp\else \exlabelformat\fi}% \else \if\exerSolns@ExtFile\eq@YES \mbox{\href{\eq@exerSolns@fileName\#ex.\the@exno}% {\exlabelformat}}% \else \mbox{\hyperlink{ex.\the@exno}{\exlabelformat}}% \fi \fi } \def\eqexheader@wrapper{\hypertarget{qex.\the@exno}{\eqexheader}} \newcommand{\partsformat}[1]{\def\eq@partsformat{#1}} \partsformat{(\hfil\thepartno\hfil)} \newcommand{\defaultpartsformat}{% \partsformat{(\hfil\thepartno\hfil)}} \let\exlisttabheaderpriorhook\@empty \let\exlisttabheaderafterhook\@empty \newcommand{\eqexlisttabheader} {% \exlisttabheaderpriorhook \ifeq@nolink \color{\@nolinkcolor}\eq@partsformat \else \if\exerSolns@ExtFile\eq@YES \href{\eq@exerSolns@fileName\#ex.\the@exno\thepartno}% {\eq@partsformat}% \else \hyperlink{ex.\the@exno\thepartno}{\eq@partsformat}% \fi \fi } \newcount\cq@Cnt \def\cq@CutName{cq-\the\cq@Cnt.cut} \let\cq@star\eq@NO \newif\ifcqqs \cqqstrue \newif\ifcqIsActive \cqIsActivefalse \def\cqQS{\@ifstar{\cqQSV}{\cqQSA}} \def\cqQSA#1#2{\ifcqqs#1\else#2\fi} \@ifpackageloaded{web}{\@ifundefined{IF@AorBswitch}{% \PackageWarningNoLine{A version of the web package dated\MessageBreak 2016/11/03 or later is required for \string\cqQS}}}{}% \@ifundefined{webtempboxi}{\newbox\webtempboxi \newbox\webtempboxii}{} \providecommand\SHOWTEMPBOXi{\unhbox\webtempboxi} \providecommand\TRUEACTIONi{\aftergroup\SETTEMPBOXii} \providecommand\TRUEACTIONia{\aftergroup\SHOWTEMPBOXi} \providecommand\FALSEACTIONii{\aftergroup\SETTEMPBOXi} \providecommand\FALSEACTIONiia{\aftergroup\SHOWTEMPBOXi} \providecommand\SETTEMPBOXi{\IF@AorBswitch\else \afterassignment\TRUEACTIONia\fi \setbox\webtempboxi=\hbox} \providecommand\SETTEMPBOXii{\IF@AorBswitch \afterassignment\FALSEACTIONiia\fi \setbox\webtempboxii=\hbox} \def\cqQSV{\let\IF@AorBswitch\ifcqqs \IF@AorBswitch \def\eq@next{\afterassignment\TRUEACTIONi\SETTEMPBOXi}\else \def\eq@next{\afterassignment\FALSEACTIONii\SETTEMPBOXii}\fi \eq@next} \def\eq@turnMessageOff{\let\save@message\message \let\message\@gobble} \def\eq@turnMessageOn{\let\message\save@message} \def\eqCQDeclarations{\cqqsfalse\eq@turnMessageOff \includecomment{sPage}\excludecomment{qPage}% \eq@turnMessageOn} \def\eqTopOfSolnPage{\cqSAfalse \eqCQDeclarations} \eq@turnMessageOff \includecomment{qPage}\excludecomment{sPage} \eq@turnMessageOn \def\writecqQSfalse{\writeToExSolns{\protect\eqTopOfSolnPage}} \AtBeginDocument{\writecqQSfalse} \newenvironment{cq@CQ} {% \global\cqIsActivetrue \global\advance\cq@Cnt1\relax \immediate\openout\CommentStream=\cq@CutName \let\verbatim@out\CommentStream \verbatimwrite }{% \endverbatimwrite \immediate\closeout\CommentStream \ifx\cq@star\eq@YES \xdef\cq@INPUTCUT{\noexpand\cqqstrue \noexpand\input{\cq@CutName}\noexpand \def@QuesToSoln}\else \xdef\cq@INPUTCUT{\noexpand\cqqstrue \noexpand\input{\cq@CutName}\noexpand \p@ssQuesToSoln}\fi \aftergroup\cq@INPUTCUT } \newenvironment{cqs@CQ}{\let\cq@star\eq@YES\cq@CQ}{\endcq@CQ} \def\declCQQuesStr#1{\def\cqQStr{#1}} \declCQQuesStr{Question} \def\declCQSolStr#1{\def\cqSStr{#1}} \declCQSolStr{Solution} \newcommand\declCQPre[1]{\def\cq@Pre{#1}} \declCQPre{\emph{\cqQStr}:\space} \newcommand\declCQPost[1]{\def\cq@Post{#1}} \declCQPost{\par\medskip\noindent\emph{\cqSStr}:\space\ignorespaces} \def\cqFmtPasteQues#1{\cq@Pre\input{#1}\cq@Post} \def\p@ssQuesToSoln{\ifeq@hidesolution\else \global\terminexchangedtrue % dps cq \writeToExSolns{\protect \decleqterminex{\protect\cqFmtPasteQues{\cq@CutName}}}\fi} \def\declCopyQues#1{\def\cqCopiedQues{#1}} \def\def@QuesToSoln{\restoreNormalSolns \global\terminexchangedfalse % dps cq \ifeq@hidesolution\else\writeToExSolns{\protect \declCopyQues{\protect\input{\cq@CutName}}}\fi} \newcommand\restoreNormalSolns{% \writeToExSolns{\protect\decleqterminex{\protect\eqterminexDEF}}} \newcommand{\eq@CommonCmd}[1]{\def\eq@@CommonCmd{#1}#1} \let\eq@@CommonCmd\@empty \newcommand\gExCommonCmd[1]{\gdef\gEx@CommonCmd{\eq@CommonCmd{#1}}} \let\gEx@CommonCmd\@empty \let\endexerhook\@empty \newenvironment{exercise} {% \let\cq\cq@CQ\let\endcq\endcq@CQ \csarg\let{cq*}\cqs@CQ \csarg\let{endcq*}\endcqs@CQ \par\removelastskip\eq@priorexskip\noindent \let\eqCommonCmd\eq@CommonCmd \def\eq@argi{eqexno}%% use eqexno counter \if\eq@exerstarEnv*\def\exerstar{*}\else\def\exerstar{x}\fi \def\currhideopt{x}% \@ifnextchar[{\exercise@}% {\if\exerstar*\def\eq@next{\@exercise}\else \def\eq@next{\exercise@@}\fi\eq@next}% }{\eq@postexerciseHook\endexerhook\par \global\eq@exerciseheadingtrue\removelastskip\eq@exerskip} \def\exercise@[#1]{\edef\eq@arg{#1}% \if\eq@arg h\def\currhideopt{h}% \eq@hidesolutiontrue\eq@nolinktrue% \ifeq@globalshowsolutions \eq@hidesolutionfalse\eq@nolinkfalse\fi \def\eq@next{\@exercise}% h, no *, no counter \else \if\eq@arg H% \edef\currhideopt{\Hidesymbol}% \eq@hidesolutiontrue\eq@nolinktrue% \ifeq@globalshowsolutions \eq@hidesolutionfalse\eq@nolinkfalse \fi \def\eq@next{\@exercise}% H, no *, no counter \else \def\currhideopt{x}% \ifx\eq@arg\@empty\else\def\eq@argi{#1}\fi \if\exerstar*\def\eq@next{\@exercise}\else \def\eq@next{\exercise@@}\fi \fi \fi \eq@next} \def\exercise@@{\@ifstar{\def\exerstar{*}\@exercise}{\exercise@@@}} \def\exercise@@@{\@ifnextchar[{\exercise@@@@}{\@exercise}} \def\exercise@@@@[#1]{\edef\eq@arg{#1}% \if\eq@arg h\def\currhideopt{h}% \eq@hidesolutiontrue\eq@nolinktrue \ifeq@globalshowsolutions \eq@hidesolutionfalse\eq@nolinkfalse\fi \def\eq@next{\@exercise}% h, no *, no counter \else \if\eq@arg H\edef\currhideopt{\Hidesymbol}% \eq@hidesolutiontrue\eq@nolinktrue% \def\eq@next{\@exercise}% h, no *, no counter \else \def\currhideopt{x}% \PackageWarning{exerquiz}{The option #1 is not recognized} \let\eq@next\relax \fi \fi \eq@next} \newif\ifeq@exerciseheading \eq@exerciseheadingtrue \let\prior@exerSolnHeaderHook\@empty \newcommand\exerSolnHeader[3]{% \prior@exerSolnHeaderHook \ifeqforpaper\else\webnewpage\fi\markright{#1}%\par\noindent% \noindent\hypertarget{#2}{#3}\relax \solnhspace } \let\solnItemMngt\relax \let\eqEXt\@gobbletwo \let\endeqEXt\relax \let\eqExtArg\@empty \let\eqFilterArg\@empty \let\eqExerSolnHeader\@empty \let\solutionparshape\@empty \def\eq@pslnaindnt{0pt} \let\eq@setPrbSolnAftrIndnt\relax \newcommand{\setPrbSolnAftrIndent}[1]{\ifdim#1=0pt \def\eq@pslnaindnt{0pt}\let\eq@setPrbSolnAftrIndnt\relax\else \edef\eq@pslnaindnt{#1}\edef\eq@setPrbSolnAftrIndnt{% \expandafter\noexpand\expandafter\parindent#1\noexpand\relax}\fi } \newif\if@restorejustify \@restorejustifyfalse \newcommand\restoreJustifyOn{\@restorejustifytrue} \newcommand\restoreJustifyOff{\@restorejustifyfalse} \def\restorejustify{\if@restorejustify \@rightskip\z@skip \rightskip\@rightskip \leftskip\z@skip \let\\\@normalcr\fi} \def\@exercise{% \global\let\solutionparshape\@empty \let\verbatim@out=\ex@solns \if\eq@argi0\else\refstepcounter{\eq@argi}\fi\stepcounter{@exno}% \if\exerstar*% if exercise with parts \eq@nolinktrue \else \if\currhideopt H% \else \ifeq@solutionsafter \eq@nolinktrue % no link to solution \else \eq@ckglobalhide % \ifeq@hidesolution\else \global\let\eqExerSolnHeader\eq@@writeexheader \fi \fi \fi \fi \ifvmode\ifdim\lastskip>\z@ \vskip-\lastskip \fi\fi \if\exerstar*% \let\solution\solnexer@woparts \let\endsolution\endsolnexer@woparts \let\parts\exercise@parts \let\endparts\endexercise@parts \else \let\solution\solnexer@woparts \let\endsolution\endsolnexer@woparts \let\parts\relax \let\endparts\relax \if\Hidesymbol h\eq@nolinkfalse\ifeq@solutionsafter \eq@nolinktrue\fi\fi \fi \eq@initializeContAnnot \ifeq@exerciseheading \prior@questionsHook\marginparpriorhook\noindent\eqexheader@wrapper \afterlabelhskip\marginparafterhook\gEx@CommonCmd \eq@setPrbSolnAftrIndnt\ignorespaces\fi } \newif\ifterminexchanged \terminexchangedfalse % dps cq \newcommand\decleqterminex[1]{\def\eqterminex{#1}} \def\eqterminexDEF{\relax\ignorespaces} \decleqterminex{\eqterminexDEF} \newif\ifmakeExSlLocal \makeExSlLocalfalse \def\makeExSolnsLocalOn{\makeExSlLocaltrue} \def\makeExSolnsLocalOff{\makeExSlLocalfalse} \def\eqExerSolnHeaderSngl{% \ifmakeExSlLocal\protect\begingroup^^J\fi \protect\eqEXt{\eqExtArg}{\eqFilterArg}\protect \solnItemMngt\protect\exerSolnHeader{\exsecrunhead}{ex.\the@exno}% {\exsllabelformat}\exer@solnheadhook \exersolnheadhook\protect\eqterminex } \def\eq@@writeexheader{\set@display@protect \immediate\write\verbatim@out{\eqExerSolnHeaderSngl}% \set@typeset@protect } \def\eqExerSolnHeaderList{% \ifmakeExSlLocal\protect\begingroup^^J\fi \protect\eqEXt{\eqExtArg}{\eqFilterArg}\protect \solnItemMngt\protect\exerSolnHeader{\exsecrunhead}% {ex.\the@exno\thepartno}{\exsllabelformatwp}% \exer@solnheadhook\exersolnheadhook\protect\eqterminex } \def\eq@@writeexheaderlist{\set@display@protect \immediate\write\verbatim@out{\eqExerSolnHeaderList}% \set@typeset@protect } \long\def\setsolnspace#1{\def\newsolnspace{#1}% \let\solnspace\newsolnspace} \newif\ifeq@ckSolnVspace \eq@ckSolnVspacetrue \def\ckSolnOpt{\global\eq@ckSolnVspacetrue} \def\noSolnOpt{\global\eq@ckSolnVspacefalse} \let\solnhspace\space \let\solnspace\space \let\exsolnonceonlytophook\relax \def\solnexer@woparts{% \ifanswerkey\ifeqe@flextended\ifcont@nnot \ifx\solutionparshape\@empty\else % dpsj8 \pushEnvir \everypar{}\if@eqalignfilllinestoleft\else \parshape=1 \leadinIndent \linewidth\fi \popEnvir \fi\fi\fi\fi\def\bLeaveVspace{x}% = no vertical space added \exsolnonceonlytophook % dps27 \global\let\exsolnonceonlytophook\relax \@ifundefined{KV@eqefillLines@bgonly}{} {\ifKV@eqefillLines@bgonly\ifvmode\else \par\leavevmode\strut\fi\fi \ifKV@eqefillLines@outlineonly\leavevmode\strut\fi}% \ifeq@ckSolnVspace \def\eq@next{\@ifnextchar[{\solnexer@@woparts}%] {\solnexer@@woparts[\null]}}\else \def\eq@next{\solnexer@@woparts[\null]}\fi \eq@next } \let\eqPriorVspace\@gobble \newif\if@eqlinedfiller \@eqlinedfillerfalse \newcommand{\vspaceFiller}[1]{\vfill} \newcommand{\vspaceFillerDefault}[1]{\vfill} \def\eqWriteLine{\hfill} \def\eq@linesXPgs{% \begingroup\offinterlineskip\parskip0pt \@tempcnta=0 \@whilenum\@tempcnta<\soln@keys@nLines\relax\do {\vskip0pt\penalty-50\vglue\wlVspace\eqWriteLine \advance\@tempcnta1\relax}\par\endgroup } \let\leavevspace\relax % dpsj5 \newcommand{\vspaceFmt}[1]{% \ifx\solutionparshape\@empty\else \advance\linewidth-\leadinIndentPrtSep\fi \ifdim\sameVspace>0pt \let\bLeaveVspace\@empty \def\leavevspace{% \ifx\eq@insertverticalspace\eq@YES\par\eq@quessolskip \eqPriorVspace{#1}{\nobreak\noindent \if@eqlinedfiller \ifx\soln@keys@nLines\@empty \def\eq@lines@next{\vspaceFiller{#1}}\else \def\eq@lines@next{\eq@linesXPgs}\fi \else \def\eq@lines@next{\parbox[b][#1][t]{\linewidth} {\vspaceFiller{#1}}}% \fi\eq@lines@next}% \fi }\expandafter\leavevspace % dpsj6 \fi } \define@key{soln@keys}{nLines}[]{\def\soln@keys@nLines{#1}} \let\soln@keys@nLines\@empty \def\eqKV@errx#1{\xdef\XKV@rm{\@tempa}} \def\eqSolnForEqexam#1{% \let\soln@keys@nLines\@empty \setkeys*{soln@keys}{#1}% \ifx\soln@keys@nLines\@empty \ifx\minVspacet@bs\@empty\xdef\sameVspace{\XKV@rm}\else \xdef\sameVspace{\minVspacet@bs}\fi \else \@tempdima\wlVspace \@tempdima=\soln@keys@nLines\@tempdima \xdef\sameVspace{\the\@tempdima}% \ifx\XKV@rm\@empty\else \if@equsedim\let\soln@keys@nLines\@empty \xdef\sameVspace{\XKV@rm}\fi \fi \fi \ifx\sameVspace\@empty\gdef\sameVspace{0pt}\fi } \def\solnexer@@woparts[#1]{% \ifcqIsActive\else\ifterminexchanged \restoreNormalSolns\fi\fi % dps cq \global\cqIsActivefalse \def\eq@argi{#1}\def\eq@null{\null}% \ifx\eq@argi\@empty\gdef\sameVspace{0pt}\else \ifx\eq@argi\eq@null\gdef\sameVspace{0pt}\else \@ifundefined{PointsOnLeft}{% \let\eqKV@errx@SAVE\KV@errx \let\KV@errx\eqKV@errx\let\XKV@rm\@empty \edef\temp@exp{\noexpand\setkeys*{soln@keys}{#1}}\temp@exp \let\KV@errx\eqKV@errx@SAVE \ifx\soln@keys@nLines\@empty\else \PackageInfo{exerquiz}{% nLines key detected in solution environment,\MessageBreak is not not recognized without eqexam,\MessageBreak will remove it}% \let\soln@keys@nLines\@empty\fi \xdef\sameVspace{\XKV@rm}% }{\eqSolnForEqexam{#1}}% \fi\fi \solnexer@@@woparts } \def\solnsafterSkip#1{\setlength{\@tempdima}{#1}% \edef\solnsafterSkipAmt{\the\@tempdima}% \def\solutionsafterSkip{\vskip\solnsafterSkipAmt\relax}} \solnsafterSkip{\smallskipamount} \def\@solnafterSkipOnce#1{\setlength{\@tempdima}{#1}% \xdef\@solnafterSkipOnceAmt{\the\@tempdima}}% \def\@@solnafterSkipOnce{\vskip\@solnafterSkipOnceAmt\relax %dpsj3 \gdef\@solnafterSkipOnceAmt{0pt}} \def\@solnafterSkipOnceAmt{0pt} \def\quessolSkip#1{\setlength{\@tempdima}{#1}% \edef\eq@quessolskip{\noexpand\vskip\the\@tempdima\relax}} \def\eq@quessolskip{\vskip\smallskipamount} \def\eqe@debugVertSkip#1{} \def\eqe@showEndHere#1{#1} \def\eqe@setStartSolns{% \xdef\eq@startSoln{\the\pagetotal}% \eqe@debugVertSkip{\marginpar{\smash{b[\sameVspace]}}}% } \let\eqSavedComment\comment \let\eqSavedEndCommet\endcomment \def\setTabulrSolnEnv{% \@ifundefined{@listii@SAVE}{\global\let\@listii@SAVE\@listii}{}% \expandafter\def\expandafter\@listii\expandafter{\@listii@SAVE \leftmargin\leftmarginii \labelwidth\leftmarginii \advance\labelwidth-\labelsep}% \def\everyparShape{\everypar{\parshape \@ne 0pt \linewidth}}% \reset@doendpe{\parshape \@ne 0pt \linewidth}% \parshape \@ne 0pt \linewidth \everyparShape } \newif\ifthereissolution \let\priorexsolafterList\@empty \let\priorexsolafterTab\@empty \let\priorexsolafterSngl\@empty \def\eq@Hid{H}\def\eq@hid{h} \def\solutionafterExCmds#1{\def\@rgi{#1}\ifx\@rgi\@empty \let\eqSolnExCmds\relax\else \def\eqSolnExCmds{#1}\fi} \let\eqSolnExCmds\relax \def\eq@b@ddCodeSpecialDef#1{#1}% dpsj4 \let\eq@b@ddCodeSpecial\eq@b@ddCodeSpecialDef % dpsj4 \def\solnexer@@@woparts{\ifeq@solutionsafter\else \expandafter\begingroup\fi %dpsj10 \global\thereissolutiontrue \global\let\procsoln\relax % dpsj6 \global\let\endprocsoln\relax % dpsj6 \def\exerwparts@cols{0}% \let\verbatim@out\ex@solns \if\currhideopt\eq@Hid \let\minVspacet@bs\@empty \let\procsoln\eqSavedComment \let\endprocsoln\eqSavedEndCommet \def\eq@next{\procsoln}% \else \eq@ckglobalhide \ifeq@hidesolution \let\procsoln\eqSavedComment \let\endprocsoln\eqSavedEndCommet \else \ifeq@solutionsafter\else \ifx\eq@@CommonCmd\@empty\else \set@display@protect \immediate\write\verbatim@out{\eq@@CommonCmd}% \set@typeset@protect \fi \fi \let\procsoln\verbatimwrite \let\endprocsoln\endverbatimwrite \fi \def\eq@next{% \ifeq@solutionsafter \let\procsoln\relax % dpsj6 \let\endprocsoln\relax \removelastskip\removelastparskip \cqSAtrue\eqCQDeclarations \declCopyQues{\input{\cq@CutName}}% \ifx\exsolafter\@empty \ifdim\sameVspace=0pt\eqe@setStartSolns \else \solutionsafterSkip \@@solnafterSkipOnce % dpsj3 \eqe@setStartSolns \fi \else\par\kern0pt \solutionsafterSkip \@@solnafterSkipOnce % dpsj3 \noindent\strut\eqe@setStartSolns \fi \parskip\eqeques@parsep \ifx\endparts\endexercise@parts@tabular \eq@setPrbSolnAftrIndnt \restorejustify \fi \ifx\endparts\endexercise@parts@tabular\expandafter \priorexsolafterTab\else \ifx\endparts\endexercise@parts@list\expandafter \priorexsolafterList\else\expandafter \priorexsolafterSngl\fi\fi \exsolafter\space\ignorespaces \solutionparshape \else \eqExerSolnHeader \global\let\eqExerSolnHeader\@empty \global\therearesolutionstrue\expandafter\procsoln \fi }% \fi \eq@b@ddCodeSpecial{\eq@next}% }% dpsj4 \let\endsolnexerhook\@empty \let\pkg@endsolnexerhook\@empty \let\endsolnexerhookaux\@empty \def\eq@fititin#1{\noindent\unskip\nobreak\hfill\penalty100 \hskip1em\hbox{}\nobreak\hfill#1}% \let\eqfititin\eq@fititin \def\ReturnTo#1#2{\eq@fititin{\hyperlink{#1}{#2}}} \def\xReturnTo#1#2{\eq@fititin{\href{#1}{#2}}} \newcommand\eqExerSolnTrailer{% \if\exerSolns@ExtFile\eq@YES\protect\xReturnTo {\exerSolns@ReturnPath\jobname\#qex.\the@exno}% \else\protect\ReturnTo{qex.\the@exno}\fi {\protect\mbox{\if\exerstar*\exrtnlabelformatwp\else \exrtnlabelformat\fi}}% \protect\endeqEXt\ifeqforpaper\protect\par{\belowexsolnskip}\fi^^J% \ifmakeExSlLocal\protect\endgroup^^J\fi } \let\eq@e@ddCodeSpecialDef\relax % dpsj4 \let\eq@e@ddCodeSpecial\eq@e@ddCodeSpecialDef % dpsj6 \let\kdvsp@Restore\relax % dpsj20 \def\endsolnexer@woparts{\endprocsoln\eq@e@ddCodeSpecial \pkg@endsolnexerhook % djsj8 moved from the end of the macro \ifeq@solutionsafter\else \expandafter\endgroup\fi % from \begingroup at \solnexer@@@woparts \global\let\exsolnonceonlytophook\relax \ifx\sameVspace\@empty\gdef\sameVspace{0pt}\fi % dpsj5 \ifvspacewithsolns\vspaceFmt{\sameVspace}\else \ifeq@nosolutions\ifeq@solutionsafter\else \vspaceFmt{\sameVspace}\fi\fi\fi \if\currhideopt H% \ifkeepdeclaredvspacing\vskip\sameVspace\fi \else \ifeq@solutionsafter \ifx\isitleadin\eq@YES\parshape=0 \fi % dpsj9 \if\exerstar*% \eq@fititin{\mbox{\exrtnlabelformatwp}}\else \eq@fititin{\mbox{\exrtnlabelformat}}\fi \ifx\istabularexer\eq@YES\unskip\kern0pt\else\par\fi % dpsj6 \ifx\minVspacet@bs\@empty \ifkeepdeclaredvspacing \@tempdima\pagetotal \advance\@tempdima-\eq@startSoln \@tempdimb\sameVspace\relax \ifdim\@tempdimb>1sp\relax \advance\@tempdimb-\@tempdima \ifdim\@tempdimb>0pt\vglue\@tempdimb\kern0pt \let\eqe@showEndHere\@gobble \edef\tmp@exp{\noexpand\marginpar{% \noexpand\smash{e: adj \the\@tempdimb}}}% \eqe@debugVertSkip{\tmp@exp}% \fi \fi \fi \eqe@showEndHere{\eqe@debugVertSkip{\marginpar{\smash{e}}}}% \fi \else \eq@ckglobalhide \ifeq@hidesolution\else \endsolnexerhookaux \let\verbatim@out\ex@solns \set@display@protect \immediate\write\verbatim@out{\eqExerSolnTrailer}% \set@typeset@protect \fi \fi \fi \kdvsp@Restore % dpsj20 \endsolnexerhook\penalty0\relax} \let\eq@exerstarEnv\relax \newenvironment{exercise*}{\def\eq@exerstarEnv{*}\exercise} {\endexercise} \def\exerwparts@cols{0} \let\topofpartshook\relax \let\@listiiredefined\eq@NO \let\itsExerParts\eq@NO \newif\if@tableadinitem\@tableadinitemfalse \newcommand{\tableadin@external}{\PackageError{exerquiz/eqexam} {The \string\tableadin\space command is designed\MessageBreak for the problem* environment of eqexam}{Use \string\tableadin\space in the problem* environment of eqexam.}% } \let\tableadin\tableadin@external \newcommand{\eq@tableadinparts}{\item\relax \PackageError{exerquiz/eqexam}{The \string\tableadin\space command is not allowed in the\MessageBreak parts environment}{Use \string\tableadin\space in the problem* environment of eqexam.}% } \let\istabularexer\eq@NO \def\exercise@parts{\let\rlspar\relax \ifx\solutionparshape\@empty \let\isitleadin\eq@NO \if@tableadinitem\let\rlspar\@gobbletwo\fi \else\let\isitleadin\eq@YES\fi \rlspar\removelastskip\par \if\isitleadin\eq@YES \def\eqparts@topsep{0pt}% \vskip\eqparts@itemsep\relax\fi \topofpartshook \let\itsExerParts\eq@YES \global\let\@listiiredefined\eq@NO \def\exerwparts@cols{0}\@ifnextchar[% {% \if@tableadinitem\else\removelastparskip\fi \let\endparts\endexercise@parts@tabular\exercise@parts@tabular@}% {\let\endparts\endexercise@parts@list\exercise@parts@list}} \def\eq@extralabelsep{0pt} \newcommand{\setPartsWidth}[1]{\def\parts@indent{\normalfont#1}% \bgroup\settowidth{\eq@tmpdima}{\parts@indent}% \xdef\widthOfParts{\the\eq@tmpdima}\egroup} \setPartsWidth{(d)} \def\eqe@prtsepPrb{\ } \providecommand{\prbPrtsep}[1]{\def\eqe@prtsepPrb{#1}} \providecommand{\exPrtsep}[1]{\def\eqe@prtsepPrb{#1}} \providecommand{\eqequesparsep}[1]{\def\eqeques@parsep{#1}} \eqequesparsep{0pt} \let\prior@parts@hook\@empty \let\post@parts@hook\@empty \let\abovepartshook\@empty \let\belowpartshook\@empty \let\eqp@rtc@lcm@rk\relax \let\eq@insertContAnnot\relax \def\eq@item@common{\eq@insertContAnnot\eqp@rtc@lcm@rk \def\currhideopt{x}\eq@hidesolutionfalse\eq@nolinkfalse \@ifnextchar[{\@ckhide}{\eq@item}} \newcommand{\partsitemsep}[1]{{% \setlength{\@tempdima}{#1}% \xdef\eqparts@itemsep{\the\@tempdima}}} \let\eqpartsitemsep\partsitemsep \def\eqparts@itemsep{0pt} \newcommand\partsparsep[1]{{% \setlength{\@tempdima}{#1}% \xdef\eqparts@parsep{\the\@tempdima}}} \def\eqparts@parsep{0pt} \newcommand\partstopsep[1]{{% \setlength{\@tempdima}{#1}% \xdef\eqparts@topsep{\the\@tempdima}}} \def\eqparts@topsep{3pt} \newcommand{\leadinitem@external}{\PackageError{exerquiz/eqexam} {The \string\leadinitem\space command is designed to be\MessageBreak the first item in the problem*\MessageBreak environment above the parts environment} {Use \string\leadinitem\space in the problem* environment.}% } \let\leadinitem\leadinitem@external \let\itsforleadinitem\eq@NO \newcommand{\eq@leadinitemparts}{\item\relax \PackageError{exerquiz/eqexam}{The \string\leadinitem\space command is not allowed in the\MessageBreak parts environment} {Use \string\leadinitem\space in the problem* environment.}% } \def\eq@handleOptArg[#1]{\def\eq@optArg{[#1]}\eq@handleOptArgi} \def\eq@handleOptArgi{\expandafter \eq@item@latex\eq@optArg\exlisttabheaderafterhook} \newif\ifwithinparts \let\ex@listtabheader@fterhook\@empty \newenvironment{exercise@parts@list}{% \settowidth{\eq@tmplength}{\parts@indent}% \edef\widthOfParts{\the\eq@tmplength}% \eq@initializeContAnnot\eq@nolinkfalse\prior@parts@hook \abovepartshook\list{\normalfont \if\Hidesymbol h\eq@nolinkfalse\ifeq@solutionsafter \eq@nolinktrue\fi\fi \if\currhideopt H% \else \ifeq@solutionsafter \eq@nolinktrue % no link to solution \else \ifeq@nosolutions \eq@nolinktrue % no link to solution \else \eq@ckglobalhide \ifeq@hidesolution\eq@nolinktrue\else \global\let\eqExerSolnHeader\eq@@writeexheaderlist \fi \fi \fi \fi \makebox[\widthOfParts][r]{\eqexlisttabheader}% }{% \usecounter{partno}% \if\isitleadin\eq@YES \settowidth{\eq@tmplength}{\parts@indent\eqe@prtsepPrb}% \xdef\prtsIndntSep{\the\eq@tmplength}% \if\itsforleadinitem\eqe@YES\setcounter{partno}{\fliPartNo}\else \setcounter{partno}{1}\fi\fi \let\leadinitem\eq@leadinitemparts \let\tableadin\eq@tableadinparts \global\let\solutionparshape\@empty \setlength{\topsep}{\eqparts@topsep}% \setlength{\parskip}{0pt}% \setlength{\partopsep}{0pt plus 1pt minus 1pt}% \ifdim\eqeques@parsep=0pt \setlength{\parsep}{\eqparts@parsep}% \else \setlength{\parsep}{\eqeques@parsep}% \fi \setlength{\itemsep}{\eqparts@itemsep-\parsep}% \setlength{\itemindent}{0pt}% \setlength{\listparindent}{\parindent}% \settowidth{\labelsep}{\normalfont\eqe@prtsepPrb}% \addtolength{\labelsep}{\eq@extralabelsep}% \settowidth{\labelwidth}{\parts@indent}% \setlength{\leftmargin}{\labelwidth}% \addtolength{\leftmargin}{\labelsep}% \let\eq@item@latex\item \def\eq@item{\@ifnextchar[{\eq@handleOptArg} {\eq@item@latex\ex@listtabheader@fterhook \exlisttabheaderafterhook}}% \def\eqthisenv{parts}\withinpartstrue \def\item{\ifx\@currenvir\eqthisenv \def\eq@next{\eq@item@common}\else \def\eq@next{\eq@item}\fi \eq@next}% }}{\endlist\global\let\leadinitem\leadinitem@external \post@parts@hook\belowpartshook} \def\eq@initializeContAnnot{\@ifundefined{eqequestions} {\global\let\eqeCurrProb\relax} {\xdef\eqeCurrProb{\theeqquestionnoi}}% \xdef\eq@currProbStartPage{\arabic{page}}% } \define@key{tabp@rts}{nCols}{\def\exerwparts@cols{#1}} \define@key{tabp@rts}{minVspace}{\def\minVspacet@bs{#1}} \let\minVspacet@bs\@empty \def\minVspacetabs#1{\def\minVspacet@bs{#1}} \def\priorexsolafterTab{\ifkeepdeclaredvspacing \ifeq@solutionsafter\ifx\minVspacet@bs\@empty\else \priorexsolafterTab@cont\fi\fi\fi} \def\priorexsolafterTab@cont{\let\exsolafter@save\exsolafter \let\exsolafter\@empty \makebox[0pt][r]{\parbox[t][\minVspacet@bs][t]{0pt} {\strut\hfill\vfill\strut}}% \minipage[t]{\linewidth}\exsolafter@save} \def\pkg@endsolnexerhook{\ifkeepdeclaredvspacing \ifeq@solutionsafter\ifx\minVspacet@bs\@empty\else \endminipage\fi\fi\fi} \def\exercise@parts@tabular@[#1]{% \inittabMark \let\eq@insertContAnnot\relax \let\exerwparts@cols\@empty \setkeys*{tabp@rts}{#1}\ifx\exerwparts@cols\@empty \edef\exerwparts@cols{\XKV@rm}\fi \ifx\minVspacet@bs\@empty\keepdeclaredvspacingfalse\fi \let\istabularexer\eq@YES \@tempcnta\exerwparts@cols\relax \ifnum\@tempcnta<2\relax \PackageError{exerquiz}{% The number of columns for parts\MessageBreak needs to be an integer greater than 1} {Enter an integer, 2 or larger}\fi \exercise@parts@tabular} \newcount\eq@extabColCnt \def\autotabOn{\let\eq@tabMarkChk\relax% \PackageInfo{exerquiz/eqexam}{Executing \string\autotabOn}} \def\autotabOff{\let\eq@tabMarkChk\@gobble \PackageInfo{exerquiz/eqexam}{Executing \string\autotabOff}} \autotabOff \def\inittabMark{\global\eq@extabColCnt=0 } \def\resettabMark{\global\eq@extabColCnt=1 } \newcommand\autotabnewline[1][\eqparts@tabrowsep]{% \ifnum\exerwparts@cols>0\relax \ifx\eq@tabMarkChk\@gobble \def\eq@atnext{\expandafter \tabularnewline\expandafter[#1]}\else \def\eq@atnext{\resettabMark\tabularnewline \noalign{\expandafter\kern#1}}\fi \expandafter\eq@atnext\fi} \def\eq@tabMark{% \ifnum\eq@extabColCnt=0\relax \global\advance\eq@extabColCnt1\relax \let\eq@next\relax \else \ifnum\eq@extabColCnt=1\relax \let\eq@next\relax \else \ifnum\eq@extabColCnt>\exerwparts@cols \let\eq@next\autotabnewline \else\def\eq@next{&}\fi \fi \fi \eq@next \global\advance\eq@extabColCnt1\relax } \newcommand\partstabcolsep[1]{\def\eq@partstabcolsep{#1}} \partstabcolsep{1.5pt} \newcommand\partstabtopsep[1]{\def\eq@partstabtopsep{#1}} \partstabtopsep{3pt} \def\eq@vpartstabtopsep{\vskip\eq@partstabtopsep\relax} \newcommand\partstabrowsep[1]{\setlength{\@tempdima}{#1}% \edef\eqparts@tabrowsep{\the\@tempdima}} \partstabrowsep{0pt} \newenvironment{exercise@parts@tabular}{% \setcounter{partno}{0}% \def\tablrIndent{\hglue\prtsIndntSep\relax}% \if\isitleadin\eq@YES \if$\the\everypar$\let\tablrIndent\relax\fi \setcounter{partno}{1}\fi \let\leadinitem\eq@leadinitemparts \let\tableadin\eq@tableadinparts \global\let\solutionparshape\@empty \settowidth{\eq@tmplength}{\parts@indent\eqe@prtsepPrb}% \xdef\prtsIndntSep{\the\eq@tmplength}% \sbox{\eq@tmpbox}{\parts@indent}% \let\eq@item@latex\item \let\eq@item\item@part@tabular \def\eqthisenv{parts}\withinpartstrue \def\item{\ifx\@currenvir\eqthisenv \def\eq@next{\eq@tabMarkChk\eq@tabMark\eq@item@common}\else \def\eq@next{\eq@item@latex}\fi \eq@next}\eq@nolinkfalse \@ifundefined{@xtabularcr}{\let\@xarraycr\eq@xtabularcr} {\let\@xtabularcr\eq@xtabularcr}% \eq@tmpdima=\linewidth \advance\eq@tmpdima-\prtsIndntSep\relax \@tempcnta\exerwparts@cols\relax \advance\@tempcnta-1\relax \multiply\@tempcnta2\relax \@tempdima\prtsIndntSep\relax \divide\@tempdima 2\relax \edef\halfWidth{\the\@tempdima}% \advance\@tempdima\eq@partstabcolsep\relax \tabcolsep\@tempdima \multiply\@tempdima\@tempcnta \advance\eq@tmpdima-\@tempdima \divide\eq@tmpdima by\exerwparts@cols\relax %dpsj3 \edef\widthOfPartsBox{\the\eq@tmpdima}% dpsj2 \if@tableadinitem\else\vskip\eq@partstabtopsep\relax\fi \noindent\normalbaselines\kern0pt \prior@parts@hook\abovepartshook \tablrIndent\tabular[t]{@{}*{\exerwparts@cols}{>{\setTabulrSolnEnv \parskip\eqeques@parsep\relax \parindent0pt\relax\strut}p{\eq@tmpdima}}@{\hidewidth}}% }{\endtabular\kern0pt \@ifundefined{@listii@SAVE}{}{\global\let\@listii\@listii@SAVE \global\let\@listii@SAVE\relax}% \post@parts@hook\belowpartshook \aftergroup\eqe@innermarkpts \aftergroup\eq@vpartstabtopsep} \let\eqe@innermarkpts\relax \def\item@part@tabular{\refstepcounter{partno}% \global\let\eqExerSolnHeader\@empty \ifeq@solutionsafter \eq@nolinktrue % no link to solution \else\ifeq@nosolutions \eq@nolinktrue % no link to solution \else \eq@ckglobalhide \ifeq@hidesolution\eq@nolinktrue\else \gdef\eqExerSolnHeader{\eq@@writeexheaderlist}% \fi\fi\fi \if@restorejustify\restorejustify\else\PBS\raggedright\fi \settowidth{\eq@tmplength}{\parts@indent\eqe@prtsepPrb}% \xdef\prtsIndntSep{\the\eq@tmplength}% \sbox{\eq@tmpbox}{\parts@indent}% \eq@tmpdima=\wd\eq@tmpbox \addtolength\eq@tmplength{\eq@extralabelsep}% \xdef\partshangamount{\the\eq@tmplength}% \parshape \@ne 0pt \linewidth \everypar{\parshape \@ne 0pt \linewidth}% \eq@setPrbSolnAftrIndnt \makebox[0pt][r]{\eqexlisttabheader\eqe@prtsepPrb}% \ex@listtabheader@fterhook \exlisttabheaderafterhook\ignorespaces } \def\@ckhide[#1]{\edef\eq@arg{#1}% \def\currhideopt{x}% \ifx\eq@arg\@empty\else \if\eq@arg\eq@Hid \eq@hidesolutiontrue\eq@nolinktrue% \edef\currhideopt{\Hidesymbol}% \else \ifeq@globalshowsolutions\else \if\eq@arg\eq@hid \eq@hidesolutiontrue\eq@nolinktrue% \def\currhideopt{h}% \fi \fi \fi\fi \eq@item } \def\tabControlOn{\@ifundefined{@xtabularcr} {\let\save@@xtabularcr\@xarraycr} {\let\save@@xtabularcr\@xtabularcr}} \def\tabControlOff{\@ifundefined{@xtabularcr} {\let\@xarraycr\save@@xtabularcr} {\let\@xtabularcr\save@@xtabularcr}} \AtBeginDocument{\tabControlOn} \def\eq@xtabularcr{\@ifnextchar[{\save@@xtabularcr} {\eqe@tab@parts@rowsep}}% \def\eqe@tab@parts@rowsep{\save@@xtabularcr \noalign{\expandafter\kern\eqparts@tabrowsep}}% \define@key{exEnum}{labelwidthTo}[\normalsize\normalfont\bfseries00.\ ]% {\def\exE@labelwidthTo{#1}} \define@key{exEnum}{labelwidth}[\@empty]{\def\exE@labelwidth{#1}} \let\exE@labelwidth\@empty \define@key{exEnum}{topsep}[3pt]{\def\exE@topsep{#1}} \define@key{exEnum}{parsep}[3pt]{\def\exE@parsep{#1}} \define@key{exEnum}{itemsep}[0pt]{\def\exE@itemsep{#1}} \define@key{exEnum}{labelsep}[\normalsize\normalfont\ ]% {\settowidth{\@tempdima}{#1}\edef\exE@labelsep{\the\@tempdima}} \define@key{exEnum}{continue}[]{\let\eq@ExEnumResetCnt\@empty} \def\eq@ExEnumResetCnt{\setcounter{questionno}{0}} \setkeys{exEnum}{labelwidthTo,topsep,parsep,itemsep,labelsep}% \newenvironment{exEnumerate}[1][]{\everypar{}% \toks@=\expandafter{#1}% \edef\tempexp{\noexpand\setkeys{exEnum}{\the\toks@}}\tempexp \eq@ExEnumResetCnt \let\afterlabelhskip\@empty \let\solnhspace\@empty \aboveexskip{0pt}\belowexskip{\exE@parsep}%\belowexskip{0pt}% \def\eqexheader@wrapper{\makebox[0pt][r]{% \hypertarget{qex.\the@exno}{\eqexheader}\hspace{\labelsep}}}% \def\exbookmarkfmt{\thequestionno.\space} \def\partbookmarkfmt{(\thepartno)\space} \def\setENum{\Elabel\if\exerstar*\thequestionno(\thepartno)\else \thequestionno\fi}% \ifExSolutionsSet\else \writeToExSolns{^^J\protect\begin{exEnumerate}^^J}\fi \list{}{% \ifx\exE@labelwidth\@empty \settowidth{\labelwidth}{\exE@labelwidthTo}\else \setlength{\labelwidth}{\exE@labelwidth}\fi \setlength{\topsep}{\exE@topsep}% \ifdim\parskip>\z@\addtolength{\topsep}{-\parskip}\fi \setlength{\parsep}{\exE@parsep}% \setlength{\itemsep}{\exE@itemsep}% \setlength{\itemindent}{0pt}% \setlength{\listparindent}{0pt}% \setlength{\itemindent}{0pt}% \settowidth{\labelsep}{\normalfont\ }% \setlength{\leftmargin}{\labelwidth}% }\item\relax}{\ifExSolutionsSet\else \writeToExSolns{\protect\end{exEnumerate}^^J}\fi \endlist} \newenvironment{enumex}{% \renewcommand\exlabelformat{\textbf{\thequestionno.}}% \renewcommand\exsllabelformat {\protect\makebox[0pt][r]{\protect\textbf{\thequestionno.\ }}}% \begin{exercise}[questionno]}{\end{exercise}} \newenvironment{enumex*}{% \renewcommand\exlabelformatwp{\textbf{\thequestionno.}}% \renewcommand\exsllabelformatwp {\protect\makebox[0pt][r]{\protect\textbf{\thequestionno.}\ }% \protect\textbf{(\thepartno)}\ }% \begin{exercise*}[questionno]}{\end{exercise*}} \def\includeexersolutions{\@ifstar {\let\resetEXsolns\relax\includeexersolutionsi} {\def\resetEXsolns{\global\let\include@solutions\relax}% \includeexersolutionsi}% } \newcommand{\includeexersolutionsi}[1][]{% \filterFor{#1}\includeexersolutionsii } \def\includeexersolutionsii{% \if\exerSolns@ExtFile\eq@NO \include@solutions \resetEXsolns \let\eqFilterArg\@empty \fi } \long\def\gobbleToEndEXt#1\endeqEXt{% \ifeqforpaper\expandafter\@gobbletwo\fi} \newcommand\filterFor[1]{\def\eqFilterArg{#1}} \newcommand\inclEXtFilter[2]{\def\eqargii{#2}\ifx\eqargii\eqFilterArg \else\expandafter\gobbleToEndEXt\fi} \newcommand\useEXtFilter{\let\eqEXt\inclEXtFilter} \let\eqsolutionshook\@empty \let\eq@solutionshook\@empty \let\priorexsectitle\@empty \let\priorexslinput\@empty \def\exerSolnsHeadnToc{\section*{\exsectitle}% \addcontentsline{toc}{section}{% \@ifundefined{web@latextoc}{}{% \ifx\web@latextoc\eq@YES\else \protect\numberline{}\fi}\exsectitle}} \@ifpackageloaded{web}{\def\eq@normallheader{\lheader{\rightmark}}} {\let\eq@normallheader\relax} \@ifpackageloaded{web}{\def\eq@defaultlheader{\lheader{\aeb@setmarks}}} {\let\eq@defaultlheader\relax} \newif\ifExSolutionsSet \ExSolutionsSetfalse \newcommand{\exerSolnInput} {% \@ifundefined{eqe@IWO}{}{\ifsolutionsAtEnd%\ifvspacewithsolns \eqe@IWO\@auxout{\string\expandafter\string\gdef \string\csname\space eqExamQuesLastPage\string\endcsname {\arabic{page}}}\fi} \let\webnewpage\relax \ifsolutionsonly\else\immediate\closeout\ex@solns\fi \ifeq@nosolutions\else \iftherearesolutions \ifsolutionsonly\eq@solutionshook \eqsolutionshook \else \newpage\eq@solutionshook \eqsolutionshook\markright{}\eq@normallheader \fi \markright{\exsectitle}% \ifx\webnewpage\relax \def\webnewpage{\global\let\webnewpage\newpage}% \fi \priorexsectitle\exerSolnsHeadnToc\priorexslinput \InputIfFileExists{\jobname.sol} {\global\ExSolutionsSettrue}{\PackageWarning{exerquiz} {!!! Solutions to exercises not found}}% \global\ExSolutionsSetfalse \newpage\eq@defaultlheader \fi \fi } \def\include@solutions{% \if\exerSolns@ExtFile\eq@NO \exerSolnInput \fi } \let\eqexpdfentry=0 \let\eq@postexerciseHook\relax \def\eq@postexerciseHook@BM{% \xdef\Hy@currentbookmarklevel{\eq@currentbookmarklevel}} {\count0=\value{tocdepth} \advance\count0by2 \xdef\eqbmkmrkdepth{\the\count0}} \@ifundefined{Hy@bookmarksdepth} {\setcounter{tocdepth}{\eqbmkmrkdepth}} {\hypersetup{bookmarksdepth=\eqbmkmrkdepth}} \newcommand{\exbookmarkfmt}{\exlabel\space\theeqexno.\space} \newcommand{\partbookmarkfmt}{(\thepartno)\space} \newcommand{\expdfbookmark}[1]{\relax \def\expdfbookmarktitle{#1}% \ifx\eq@postexerciseHook\relax \let\eq@postexerciseHook\eq@postexerciseHook@BM \else \let\eq@postexerciseHook@save\eq@postexerciseHook \def\eq@postexerciseHook@BM@plus{\eq@postexerciseHook@save \eq@postexerciseHook@BM}% \let\eq@postexerciseHook\eq@postexerciseHook@BM@plus \fi \if\exerstar*% \if\eqexpdfentry0\let\eqexpdfentry=1 \xdef\eq@currentbookmarklevel{\Hy@currentbookmarklevel}% \def\eqex@next{\subpdfbookmark{\exbookmarkfmt#1}% {qex.\the@exno}}% \else \def\eqex@next{\belowpdfbookmark{\partbookmarkfmt#1}% {qex.\the@exno.\thepartno}}% \fi \else \xdef\eq@currentbookmarklevel{\Hy@currentbookmarklevel}% \def\eqex@next{\subpdfbookmark{\exbookmarkfmt#1}% {qex.\the@exno}}% \fi \eqex@next\ignorespaces } \ifeq@noforms\endinput\fi \definecolor{webgreen}{rgb}{0,.6,0} \newcommand{\proofingsymbolColor}[1]{\def\@proofingsymbolColor{#1}} \proofingsymbolColor{red} \let\@proofsymbolredefined=0 \newcommand{\proofingsymbol}[1]{\let\@proofsymbolredefined=1% \def\@proofingsymbol{\textcolor{\@proofingsymbolColor}{#1}}} \def\@proofingsymbol{\textcolor{\@proofingsymbolColor}{\ding{52}}} \def\setproofingsymbol{% \if\@proofsymbolredefined1\else \@ifpackageloaded{pifont}{\proofingsymbol{\ding{52}}} {\proofingsymbol{$\bullet$}}\fi } \AtBeginDocument{\setproofingsymbol} \newcommand{\prior@questionsHook}{} \let\qMark@Hook\@empty \let\aebtitleQuiz\@empty \newcommand{\post@questionsHook}{} \newcommand{\quesNumColor}[1]{\def\eq@quesNumCol{#1}} \quesNumColor{blue} \renewcommand{\theeqquestionnoi}{\arabic{eqquestionnoi}} \newcommand{\labeleqquestionnoi}{% \color{\eq@quesNumCol}\bfseries\theeqquestionnoi.} \renewcommand\theeqquestionnoii{(\alph{eqquestionnoii})} \newcommand{\labeleqquestionnoii}{% \color{\eq@quesNumCol}\bfseries\theeqquestionnoii} \renewcommand\theeqquestionnoiii{(\roman{eqquestionnoiii})} \newcommand{\labeleqquestionnoiii}{% \color{\eq@quesNumCol}\bfseries\theeqquestionnoiii} \define@key{props@ques}{labelwidthTo}% [\normalsize\normalfont\bfseries00.]% {\def\propQ@labelwidthTo{#1}} \define@key{props@ques}{labelwidth}[]{\def\propQ@labelwidth{#1}} \let\propQ@labelwidth\@empty \define@key{props@ques}{topsep}[\the\topsep]{\edef\propQ@topsep{#1}} \define@key{props@ques}{partopsep}[\the\partopsep]% {\edef\propQ@partopsep{#1}} \define@key{props@ques}{parsep}[\the\parsep]{\edef\propQ@parsep{#1}} \define@key{props@ques}{itemsep}[\the\itemsep]{\edef\propQ@itemsep{#1}} \define@key{props@ques}{labelsepTo}[\normalsize\normalfont\ ]% {\def\propQ@labelsepTo{#1}} \define@key{props@ques}{labelsep}[\@empty]{\def\propQ@labelsep{#1}} \let\propQ@labelsep\@empty \define@key{props@ques}{color}[blue]{\quesNumColor{#1}} \setkeys{props@ques}{labelwidthTo,topsep,partopsep,parsep,% itemsep,labelsepTo,color}% \newenvironment{questions}[1][] {% \ifnum\@eqquestiondepth>\tw@\@toodeep\else \advance\@eqquestiondepth\@ne\fi \def\@quesctr{eqquestionno\romannumeral\the\@eqquestiondepth}% \toks@=\expandafter\expandafter\expandafter{#1}\expandafter \xdef\csname quesOpts\@quesctr\endcsname{\the\toks@}% \edef\tempexp{\noexpand\setkeys{props@ques}{\the\toks@}}\tempexp \list{\qMark@Hook\prior@questionsHook\gdef\eqPTs{1}% \global\let\eqQT\eq@na% {\@tempcnta=0 \let\@thispr@b\@empty \@whilenum\@tempcnta<\@eqquestiondepth\do{\advance\@tempcnta\@ne \ifx\@thispr@b\@empty\edef\@thispr@b{% \csname theeqquestionno\romannumeral\the\@tempcnta\endcsname}\else \edef\@thispr@b{\@thispr@b% \csname theeqquestionno\romannumeral\the\@tempcnta\endcsname}\fi }\xdef\@currentQues{\@thispr@b}}% \makebox[\labelwidth][r]{\normalfont\@nameuse{label\@quesctr}}% \xdef\eq@pageThisQ{\the\c@page}% \post@questionsHook}{\usecounter{\@quesctr}% \ifx\propQ@labelsep\@empty \settowidth{\labelsep}{\propQ@labelsepTo}\else \setlength{\labelsep}{\propQ@labelsep}\fi \ifx\propQ@labelwidth\@empty \settowidth{\labelwidth}% {\propQ@labelwidthTo\hspace{\labelsep}}\else \settowidth{\labelwidth}{\hspace{\propQ@labelwidth}% \hspace{\labelsep}}\fi \setlength{\topsep}{\propQ@topsep}% \setlength{\partopsep}{\propQ@partopsep}% \ifdim\parskip>\z@\addtolength{\topsep}{-\parskip}\fi \setlength{\parsep}{\propQ@parsep}% \setlength{\itemsep}{\propQ@itemsep}% \setlength{\itemindent}{0pt}% \setlength{\leftmargin}{\labelwidth}% }% }{\endlist} \def\pushquestions{\expandafter\xdef\csname save\@quesctr\endcsname {\expandafter\the\csname c@\@quesctr\endcsname}\end{questions}} \def\popquestions{% \begin{questions}[\csname quesOpts\@quesctr\endcsname]% \setcounter{\@quesctr}{\csname save\@quesctr\endcsname}% \@ifnextchar\popquestions{\item[]}{\@ifnextchar\begin{\item[]}{}}} \newcommand{\priorsqhook}[1]{\def\sq@priorhook{#1}} \priorsqhook{} \newcommand{\abovesqskip}[1]{\def\sq@aboveskip{#1}} \abovesqskip{\par\medskip} \long\def\endsqhook#1{\def\sq@afterhook{#1}} \endsqhook{} \def\@shortquizCnt{0} \def\@sqGenBaseName{eqSqBn\@shortquizCnt} \let\sqhspace\space \let\ListOfSQuizNames\@empty \newenvironment{shortquiz} {% \xdef\eq@pageThisQ{\the\c@page}% \let\@currentQues\@empty {\count0=\@shortquizCnt \advance\count0by1\relax \xdef\@shortquizCnt{\the\count0}}% \goodbreak\@ifstar{\sqForms\@shortquiz}% {\if\aeb@FLOverride\eq@f\def\sqstar{*}\else \def\sqstar{}\sqLinks\fi\@shortquiz}% }{\aeb@endshortquiz} \newenvironment{shortquiz*} {% \xdef\eq@pageThisQ{\the\c@page}% {\count0=\@shortquizCnt\advance\count0by1\relax \xdef\@shortquizCnt{\the\count0 }}% \sqForms\@shortquiz }{\aeb@endshortquiz} \def\@shortquiz{\@ifnextchar[% {\@@shortquiz}{\@@shortquiz[\@sqGenBaseName]}} \def\sq@setCLN#1{\ifx\aebTitleQuiz\@empty \protected@edef\@currentlabelname{#1}\else \protected@edef\@currentlabelname{\@currentlabelname}\fi } \let\isQZ=q \let\isSQZ=s \def\sq@IDTxtField{\makebox[0pt][l]{\textField[\autoCenter{n}\BC{}\BG{} \S{S}\textSize{0}\Ff{\FfReadOnly} \AA{\AAFormat{% var \oField=new Object;\r \oField.Grp={}; \ifx\defaultColorJSLoc\@empty\else\r \oField.DefaultColorJSLoc=\defaultColorJSLoc;\fi \ifx\rghtColorJSLoc\@empty\else\r \oField.RightColorJSLoc=\rghtColorJSLoc;\fi \ifx\wrngColorJSLoc\@empty\else\r \oField.WrongColorJSLoc=\wrngColorJSLoc;\fi \ifx\rghtAnsSymbJSLoc\@empty\else\r \oField.RightAnsSymbJSLoc=\rghtAnsSymbJSLoc;\fi \ifx\wrngAnsSymbJSLoc\@empty\else\r \oField.WrongAnsSymbJSLoc=\wrngAnsSymbJSLoc;\fi }}]{sqID\oField}{0bp}{0bp}}% } \def\qz@IDTxtField{\makebox[0pt][l]{\textField[\autoCenter{n}\BC{}\BG{} \S{S}\textSize{0}\Ff{\FfReadOnly} \AA{\AAFormat{if(typeof aQuizzesInDoc=="undefined")\r\t var aQuizzesInDoc=new Array();\r if (aQuizzesInDoc.indexOf("\oField")) aQuizzesInDoc.push("\oField"); }}]{qzID\oField}{0bp}{0bp}}} \let\eqQuizType\relax \def\@@shortquiz[#1]{%\begingroup \gdef\oField{#1}\gdef\curr@quiz{#1}\gdef\currQuiz{#1}% \edef\tmp@Exp{\noexpand\g@addto@macro\noexpand \ListOfSQuizNames{,#1}}\tmp@Exp \global\let\eqQzQuesList\@empty \let\eq@AddProbToQzQuesList\relax \edef\@currentlabel{\@shortquizCnt}% \edef\@currentHref{shortquiz.\@shortquizCnt}% \global\let\eqQuizType\isSQZ\let\@qzsolndest\@empty \if\sqstar*\relax \let\@Ans\Ans@sq@f \ifx\oField\@empty \typeout{^^JExerquiz: Base field name required when using shortquiz with '*' option}% \PackageInfo{exerquiz}{Assuming link style^^J}% \let\@Ans\Ans@sq@l \fi \else \let\@Ans\Ans@sq@l \fi \setcounter{questionno}{0}% \let\answers\answers@sq \let\endanswers\endanswers@sq \let\manswers\manswers@sq \let\endmanswers\endmanswers@sq \let\solution\solution@sq \let\endsolution\endsolution@sq \let\ifstaroption\eq@ifstaroption \if\eq@tq@star*% \def\sqlabel{\aebtitleQuiz\@gobbletwo}% \fi \sq@aboveskip\sq@priorhook \@ifundefined{PointsOnLeft}% {\sq@setCLN{\eq@defaultShortQuizLabelName}% \ifx\sqlabel\@empty\else\noindent\fi \hypertarget{sqH\@currentHref}{}\sq@IDTxtField \ifx\sqlabel\@empty\else\expandafter \sqlabel\expandafter\sqhspace\fi {\set@typeset@protect\aebtitleQuiz}}{}\ignorespaces } \newcommand\belowsqskip[1]{\def\aftershortquizskip{#1}} \belowsqskip{\medskip} \def\aeb@endshortquiz{\setcounter{quizno}{0}% \sq@afterhook \global\let\aebtitleQuiz\@empty \global\let\aebTitleQuiz\@empty \global\let\eq@tq@star\relax \global\let\sqlabel\eq@sqlabel \global\let\sqslrtnlabel\eq@sqslrtnlabel \global\let\sqsllabel\eq@sqsllabel \par\aftershortquizskip } \def\sqLinks{\def\sqstar{}}\sqLinks \def\sqForms{\def\sqstar{*}} \let\eq@tq@star\relax \def\qzPriorSolutionAfterHook{\smallskip} \let\sqPostHeaderHook\@empty \let\qPostHeaderHook\@empty \let\eq@sqPostHeaderHook\@empty \let\eq@qPostHeaderHook\@empty \let\prior@eqQt\@empty \let\prior@eqSQt\@empty \def\sqsolafterhspace{\space} \newif\ifmakeQzSlLocal \makeQzSlLocalfalse \def\makeQzSolnsLocalOn{\makeQzSlLocaltrue} \def\makeQzSolnsLocalOff{\makeQzSlLocalfalse} \def\solution@sq{\let\eq@next\relax \ifx\@qzsolndest\@empty \PackageWarning{exerquiz}% {* Solutions unexpected here, will *\MessageBreak * assume solutionsafter option *}% \eq@solutionsaftertrue \fi \ifeq@solutionsafter \par\qzPriorSolutionAfterHook\noindent \if!\sqsolafter!\else \sqsolafter\sqsolafterhspace\fi\ignorespaces \else \global\therearequizsolutionstrue\let\verbatim@out=\quiz@solns \set@display@protect \immediate\write\verbatim@out{% \ifmakeQzSlLocal\protect\begingroup^^J\fi \if\eqQuizType\isQZ \ifx\prior@eqQt\@empty\else\prior@eqQt\fi \protect\eqQt{\eqFilterArg}\else \ifx\prior@eqSQt\@empty\else\prior@eqSQt\fi \protect\eqSQt{\eqFilterArg}\fi \protect\quizSolnHeader\if\eqQuizType\isQZ\ifx\allow@peek\eq@NO [{\curr@quiz}{\currQuizStartPage}]\fi\fi {\@qzsolndest}{\sqsllabel}\protect\eqterminex \if\eqQuizType\isQZ\expandafter\eq@qPostHeaderHook \expandafter\qPostHeaderHook\else \expandafter\eq@sqPostHeaderHook \expandafter\sqPostHeaderHook\fi}% \set@typeset@protect \expandafter\verbatimwrite\fi } \let\qzSolutionsAfterHook\@empty \def\endsolution@sq {% \ifeq@solutionsafter \eq@fititin{\mbox{\sqslrtnlabel}}\par\qzSolutionsAfterHook \aftergroup\ignorespaces \else \endverbatimwrite \ifx\@qzsolndest\@empty\else\set@display@protect \immediate\write\verbatim@out{\eqSqSolnTrailer}% \set@typeset@protect \fi \fi \global\let\@qzsolndest\@empty } \newcommand\pnphDflt{.1\textheight} \newcommand{\promoteNewPageHere}[1][\pnphDflt]{% \@ifnextchar\bgroup{\eq@promoteNewPageHere} {\eq@promoteNewPageHere{#1}}% } \def\eq@promoteNewPageHere#1{\par \bgroup\@nobreakfalse\addpenalty{-500}% \setlength{\@tempdimb}{#1}% \@tempdima \pagegoal \advance \@tempdima -\pagetotal \ifdim \@tempdima<\@tempdimb\ifnum\col@number>\@ne\columnbreak \else\newpage\penalty1\fi\fi\egroup } \newcommand{\saveDest}[1][]{% \def\sd@arg{#1}\ifx\sd@arg\@empty \xdef\holdDest{\@qzsolndest}\else \xdef\@qzsolndest{#1}\xdef\holdDest{#1}\fi} \def\useDest{\def\@qzsolndest{\holdDest}} \let\holdDest\@empty \def\fpAfterSolutionsSkip{\par\medskip} \let\eqSqSolnTrailerHook\@empty \let\eqQzSolnTrailerHook\@empty \newcommand\eqSqSolnTrailer{% \if\eqQuizType\isQZ \eqQzSolnTrailerHook \protect\ReturnTo{page.\eq@pageThisQ}% {\protect\mbox{\sqslrtnlabel}}\string\endeqQt \else \eqSqSolnTrailerHook \protect\ReturnTo{page.\eq@pageThisQ}% {\protect\mbox{\sqslrtnlabel}}\string\endeqSQt% \fi \ifeqforpaper\protect\fpAfterSolutionsSkip\fi^^J% \ifmakeQzSlLocal\protect\endgroup^^J\fi } \let\eqSQt\@gobble \let\endeqSQt\relax \let\eqQt\@gobble \let\endeqQt\relax \let\prior@quizSolnHeaderHook\@empty \newcommand\quizSolnHeader[3][]{% \prior@quizSolnHeaderHook \ifeqforpaper\else\webnewpage\fi\noindent \def\eq@argi{#1}% \ifx\eq@argi\@empty\else\noPeek#1\fi \hypertarget{#2}{#3}\relax \solnspace } \def\AllowPeeking{\global\let\allow@peek\eq@YES}\AllowPeeking \def\NoPeeking{\global\let\allow@peek\eq@NO} \def\noPeekAction#1#2{% /AA <> >> } \newif\iftherearequizsolutions \therearequizsolutionsfalse \let\aeb@FLOverride\relax \def\includequizsolutions{\@ifstar {\let\resetQZtsolns\relax\includequizsolutionsi} {\def\resetQZtsolns{\global\let\include@quizsolutions\relax}% \includequizsolutionsi}% } \newcommand{\includequizsolutionsi}[1][]{% \filterFor{#1}\includequizsolutionsii } \def\includequizsolutionsii{% \include@quizsolutions \resetQZtsolns \let\eqFilterArg\@empty } \let\eqqzsolutionshook\@empty \let\priorsqslsectitle\@empty \let\priorsqslinput\@empty \def\quizSolnsHeadnToc{\section*{\sqslsectitle}% \addcontentsline{toc}{section}{% \@ifundefined{web@latextoc}{}{% \ifx\web@latextoc\eq@YES\else \protect\numberline{}\fi}\sqslsectitle}} \newcommand{\quizSolnInput} {% \global\let\webnewpage\relax \immediate\closeout\quiz@solns \ifeq@noquizsolutions\else \iftherearequizsolutions\newpage\markright{}% \eq@normallheader\markright{\sqslsecrunhead}% \ifx\webnewpage\relax \def\webnewpage{\global\let\webnewpage\newpage}\fi \priorsqslsectitle\quizSolnsHeadnToc\priorsqslinput \InputIfFileExists{\jobname.qsl}{}% {!!! Solutions to quizzes not found} \eqqzsolutionshook \newpage\eq@defaultlheader \fi \fi } \def\include@quizsolutions{\quizSolnInput} \newcommand{\priorqhook}[1]{\def\q@priorhook{#1}} \priorqhook{} \newcommand{\aboveqskip}[1]{\def\q@aboveskip{#1}} \aboveqskip{\par\medskip} \newcommand{\qhspace}{\space} \def\endqhook#1{\def\eq@prior@endQuiz{#1}} \endqhook{} \newcommand{\belowqHooknSkip}[1]{\def\eq@belowqskip{#1}} \belowqHooknSkip{\medskip} \def\belowqskip{\belowqHooknSkip} \let\eq@initializeServerSubmit\@empty \newcommand{\quiztype}[1]{% \def\@quiztype{#1}\def\aeb@FLOverride{#1}} \let\@quiztype\@empty \newcommand{\defaultquiztype}{\let\@quiztype\@empty \let\aeb@FLOverride\relax} \let\aeb@FLOverride\relax \def\@setFormLinkType{% \if\qstar*% \ifx\aeb@FLOverride\relax% \def\@@quiztype{f}% \else \if\aeb@FLOverride l\def\@@quiztype{l}\else \def\@@quiztype{f}\fi \fi \else \ifx\aeb@FLOverride\relax \def\@@quiztype{l}% \else \if\aeb@FLOverride f\def\@@quiztype{f}\else \def\@@quiztype{l}\fi \fi \fi } \def\setdefault@Ans{\@setFormLinkType \expandafter\global\expandafter \let\expandafter\@Ans\expandafter=\csname Ans@\@@quiztype\endcsname } \newcommand\useForms{\def\aeb@FLOverride{f}} \newcommand\useLinks{\def\aeb@FLOverride{l}} \newcommand\restoreFLTypeDefault{\global\let\aeb@FLOverride\relax} \let\aeb@FLOverride\relax \newenvironment{quiz} {\goodbreak\@ifstar{\gdef\qstar{*}\@quiz*f}{\gdef\qstar{x}\@quiz*l}} {\aeb@endquiz} \def\@quizCnt{0} \let\ListOfQuizNames\@empty \def\@quiz*#1#2{% \xdef\eq@pageThisQ{\the\c@page}% \let\@currentQues\@empty \global\let\eqQzQuesList\@empty \global\let\pointValuesArray\@empty \global\let\ptypeArray\@empty \global\let\corrAnsArray\@empty {\count0=\@quizCnt\advance\count0by1\relax \xdef\@quizCnt{\the\count0 }}% \edef\@currentlabel{\@quizCnt}% \edef\@currentHref{quiz.\@quizCnt}% \sq@setCLN{\eq@defaultQuizLabelName}% \setcounter{eqpointvalue}{0}\setcounter{questionno}{0}% \eq@initializeServerSubmit \global\let\eqQuizType\isQZ %\tabcolsep=0pt \gdef\eqPTs{1}\global\let\eqQT\eq@na \g@addto@macro\ListOfQuizNames{,#2}% \gdef\quiz@total{#2}\xdef\curr@quiz{#2}\xdef\oField{#2}% \xdef\currQuiz{#2}\xdef\currQuizStartPage{\thepage}% \xdef\aPointType{0}% \def\fieldJSStr@CMD{\fieldJSStr*[noquotes]\bqlabelISO}% \expandafter\fieldJSStr@CMD\expandafter{\bqlabelISO}% \ifx\@quiztype\@empty\gdef\@@quiztype{#1}\else \xdef\@@quiztype{\@quiztype}\fi \let\@qzsolndest\@empty \let\answers\answers@q\let\endanswers\endanswers@q \let\manswers\manswers@q\let\endmanswers\endanswers@q \let\solution\solution@sq\let\endsolution\endsolution@sq \expandafter% \xdef\csname titleOf\currQuiz\endcsname{\aebTitleQuiz}% \q@aboveskip\q@priorhook\noindent\hypertarget{qzH\@currentHref}{}% \eq@beginQuiz\qhspace{\set@typeset@protect\aebtitleQuiz}% \ignorespaces } \def\aeb@endquiz {% \eq@prior@endQuiz\noindent\eq@endQuiz \global\let\eqQuizType\relax \global\let\aebtitleQuiz\@empty \global\let\aebTitleQuiz\@empty \global\let\bqlabel\eq@bqlabel % reset beginning label to default \global\let\eqlabel\eq@eqlabel % reset ending label to default \global\let\sqsllabel\eq@sqsllabel \global\let\sqslrtnlabel\eq@sqslrtnlabel \global\let\bqlabelISO\eq@bqlabelISO \eq@belowqskip } \newenvironment{quiz*}{\goodbreak\gdef\qstar{*}\@quiz*f}{\aeb@endquiz} \newcommand\eq@beginQuiz{\eq@BeginQuizLink} \newcommand\eq@endQuiz{\eq@EndQuizLink} \newcommand\useBeginQuizButton[1][] {\renewcommand\eq@beginQuiz{\eq@BeginQuizButton[#1]}} \newcommand\useEndQuizButton[1][] {\renewcommand\eq@endQuiz{\eq@EndQuizButton[#1]}} \newcommand\useBeginQuizLink {\renewcommand\eq@beginQuiz{\eq@BeginQuizLink}} \newcommand\useEndQuizLink {\renewcommand\eq@endQuiz{\eq@EndQuizLink}} \newcommand\@initQuiz{% var \curr@quiz=new Object();\jsR lstOfQuizzes["\curr@quiz"]=\curr@quiz;\jsR \curr@quiz.oAlertCheck={bAfterValue:false};\jsR \curr@quiz.Grp={}; \ifx\defaultColorJSLoc\@empty\else\jsR \oField.DefaultColorJSLoc=\defaultColorJSLoc;\fi \ifx\rghtColorJSLoc\@empty\else\jsR \oField.RightColorJSLoc=\rghtColorJSLoc;\fi \ifx\wrngColorJSLoc\@empty\else\jsR \oField.WrongColorJSLoc=\wrngColorJSLoc;\fi \ifx\partialColorJSLoc\@empty\else\jsR \oField.PartialColorJSLoc=\partialColorJSLoc;\fi \ifx\rghtAnsSymbJSLoc\@empty\else\jsR \oField.RightAnsSymbJSLoc=\rghtAnsSymbJSLoc;\fi \ifx\wrngAnsSymbJSLoc\@empty\else\jsR \oField.WrongAnsSymbJSLoc=\wrngAnsSymbJSLoc;\fi \ifx\corrAnsSymbJSLoc\@empty\else\jsR \oField.CorrAnsSymbJSLoc=\corrAnsSymbJSLoc;\fi \ifx\eqGradeScaleLoc\@empty\else\jsR \oField.GradeScaleLoc=new Array(\eqGradeScaleLoc);\fi \ifx\eqCorrLocalChoiceFully\@empty\else\jsR % dpsf07 \oField.fullyCorrectLoc=\eqCorrLocalChoiceFully;\fi \ifx\priorInitQuiz\@empty\else\jsR\priorInitQuiz\fi %\jsR InitializeQuiz("\curr@quiz",\ifnocorrections0\else1\fi); \ifx\eq@CGI\@empty\jsR\curr@quiz.isSubmitted=false;\else \jsR\curr@quiz.isSubmitted=true;\fi \jsR\curr@quiz.initializeWith=% 'InitializeQuiz("\curr@quiz",\ifnocorrections0\else1\fi);' \ifx\postInitQuiz\@empty\else\jsR\postInitQuiz\fi } \newcommand{\priorInitQuiz}{} \newcommand{\postInitQuiz}{} \let\eq@submitURL\@empty \let\eq@insertHiddenFields\@empty \def\eq@@BeginQuizLinkActions {% \A{\JS{% \@initQuiz }}% } \def\eq@BeginQuizLinkDefaults{\Border{0 0 0}} \let\bqlabelFmt\@empty \def\eq@BeginQuizLink {% \qz@IDTxtField \set@@Link{}{}{}{\color{\@linkcolor}\bqlabelFmt\bqlabel}{}% {\eq@setWidgetProps\setLink@driver}% {\eq@BeginQuizLinkDefaults\eq@@BeginQuizLinkActions\every@Link}% \space\ignorespaces } \newcommand\priorSubmitQuiz{} \newcommand\postSubmitQuiz{} \def\eq@@EndQuizLinkActions{\A{\JS{% if (!isQuizInitialized("\curr@quiz"))\jsR\jsT eqAppAlert(InitMsg("\bqlabelISO"),3);\jsR else {\jsR\jsT if (\minQuizResp(\thequestionno)) {\jsR\jsT\jsT \curr@quiz.PtValues=new % Array(\pointValuesArray);\jsR\jsT\jsT ProbType = [\ptypeArray];\jsR\jsT\jsT \if@inclkey \curr@quiz.CorrAns=(new % Array(\corrAnsArray));\jsR\jsT\jsT \fi DisplayQuizResults("\curr@quiz",\theeqpointvalue,% \thequestionno);\jsR\jsT\jsT var h=this.getField("ScoreData.\curr@quiz");\jsR\jsT\jsT h.value=Score+";"+NQuestions+";"% +ptScore+";"+NPointTotal;\jsR\jsT\jsT \eq@submitURL \postSubmitQuiz \jsT\jsT resetQuiz("\curr@quiz");\jsR\jsT }\jsR }}}% } \def\eq@EndQuizLinkDefaults{\Border{0 0 0}} \let\eqlabelFmt\@empty \def\eq@EndQuizLink {% \ifx\eq@CGI\@empty \let\eq@submitURL\@empty \let\eq@insertHiddenFields\@empty \fi \set@@Link{}{}{}{\color{\@linkcolor}\eqlabelFmt\eqlabel}{}% {\eq@setWidgetProps\setLink@driver}% {\eq@EndQuizLinkDefaults\eq@@EndQuizLinkActions\every@Link}% \makebox[0pt][r]{\textField[\BC{}\autoCenter{n}]% {htxtfld.\curr@quiz}{0bp}{0bp}}% \makebox[0pt][r]{\eq@hiddenScoreData\eq@insertHiddenFields}% \global\let\eq@CGI\@empty\ignorespaces } \def\BeginQuizButtonDefaults {% \CA{\bqlabel}\H{P}\F{\FPrint} \BC{1 0 0}\BG{.7529 .7529 .7529}\W{1}\S{B} } \def\eq@@BeginQuizButtonActions {% \A{\JS{% \@initQuiz }}% } \newcommand\eq@BeginQuizButton[1][] {% \mbox{\qz@IDTxtField\push@@Button{#1}{beginQuiz.\curr@quiz}{}% {\DefaultHeightOfWidget}{\eq@protect\A}% {\eq@setButtonProps\eq@Button@driver}% {\BeginQuizButtonDefaults\eq@@BeginQuizButtonActions \every@ButtonField\every@BeginQuizButton}}% } \def\EndQuizButtonDefaults {% \CA{\eqlabel}\F{\FPrint}\BC{1 0 0} \BG{.7529 .7529 .7529}\W{1}\S{B}\H{P} } \def\eq@@EndQuizButtonActions{\A{\JS{% if (!isQuizInitialized("\curr@quiz"))\jsR\jsT eqAppAlert(InitMsg("\bqlabelISO"),3);\jsR else {\jsR\jsT if (\minQuizResp(\thequestionno)&&_ModalNotOn){\jsR\jsT\jsT \curr@quiz.PtValues=(new % Array(\pointValuesArray));\jsR\jsT\jsT ProbType=[\ptypeArray];\jsR\jsT\jsT \if@inclkey \curr@quiz.CorrAns=(new % Array(\corrAnsArray));\jsR\jsT\jsT \fi DisplayQuizResults("\curr@quiz",\theeqpointvalue,% \thequestionno);\jsR\jsT\jsT var h=this.getField("ScoreData.\curr@quiz");\jsR\jsT\jsT h.value=Score+";"+NQuestions+";"% +ptScore+";"+NPointTotal;\jsR\jsT\jsT \eq@submitURL \postSubmitQuiz \jsT\jsT resetQuiz("\curr@quiz");\jsR\jsT }\jsR }}}% } \newcommand{\eq@hiddenScoreData}{\makebox[0pt][r]{% \textField[\BC{}\F{\FHidden}]{ScoreData.\curr@quiz}{0bp}{0bp}}} \newcommand\eq@EndQuizButton[1][] {% \ifx\eq@CGI\@empty \let\eq@submitURL\@empty \let\eq@insertHiddenFields\@empty \fi \mbox{\push@@Button{#1}{endQuiz.\curr@quiz}{}% {\DefaultHeightOfWidget}{\eq@protect\A}% {\eq@setButtonProps\eq@Button@driver}% {\EndQuizButtonDefaults\eq@@EndQuizButtonActions \every@ButtonField\every@EndQuizButton}}% \makebox[0pt][r]{\eq@hiddenScoreData\eq@insertHiddenFields}% \global\let\eq@CGI\@empty } \newcommand\databaseName[1]{\gdef\db@Name{#1}}\def\db@Name{} \newcommand\tableName[1]{\gdef\db@Table{#1}}\def\db@Table{} \newcommand\eqCGI{\definePath{\eq@CGI}}\def\eq@CGI{} \newcommand\eqSubmit{\hyper@normalise\eqSubmiti} \def\eqSubmiti#1{\xdef\eq@CGI{"#1"}\eqSubmitii} \def\eqSubmitii#1#2{\databaseName{#1}\tableName{#2}} \providecommand{\rtnURL}{\definePath{\thisRtnURL}} \let\thisRtnURL\@empty \newcommand\addHiddenTextField[3][]{} \newcommand\populateHiddenField[2]{} \def\eqButtonDefaults {% \CA{\eq@local@CA}\AC{}\H{P}\W{1}\S{B} \BC{1 0 0}\BG{.7529 .7529 .7529} } \def\@@eqButtonActions {% \A{\JS{if (isEndQuizPushed("\eqBaseName")){\jsR\jsT% correctQuiz("\eqBaseName",\thequestionno);% \ifusesumrytbls\jsR\jsT\else\jsR\fi if (typeof correctSumryTbl == "function")\jsR\jsT\jsT correctSumryTbl("\eqBaseName",\thequestionno);\jsR } }}% } \newcommand\eqButton[2][] {% \ifnocorrections\else \def\eqBaseName{#2}% \mbox{\push@@Button{#1}{correct.#2}{}{\DefaultHeightOfWidget}% {\eq@protect\A}{\eq@setButtonProps\eq@Button@driver}% {\eqButtonDefaults\@@eqButtonActions\every@ButtonField \every@eqButton}}% \fi } \def\CorrButton{\eqButton} \def\rbMarkup@Defaults {% \BC{}\F{\FHidden}\Ff{\FfReadOnly}\textSize{12} \textColor{0 g}\symbolchoice{check}\W{} } \newcommand\rbMarkup[1][]{% \ifx\grpquestions\eq@One \def\Fld@name{% \oField.\thequestionno.\thegrpquestionno}\else \def\Fld@name{\oField.\thequestionno}\fi \mbox{\check@@Box{#1\V{Yes}\DV{Yes}}% {rbmarkup.\Fld@name}% {\RadioFieldSize}{\RadioFieldSize}{Yes}{}% {\eq@setWidgetProps\eq@RadioCheck@driver}% {\rbMarkup@Defaults\every@CheckBox\every@rbMarkup}}}% \newcommand\minQuizResp{lowThreshold} \newcommand\PTs{\@ifstar{\def\eq@star{*}\@PTs}{\def\eq@star{x}\@PTs}} \def\@PTs#1{\gdef\eq@PTs{#1}\ifx\eq@PTs\@empty\gdef\eq@PTs{1}\fi \global\let\eqPTs\eq@PTs\global\let\eq@PTs\@empty \if\eq@star*\else\PTs@Hook\fi} \def\eq@PTs{0} % initialize this variable \newcommand\QT[1] {% \gdef\eq@qT{#1}\ifx\eq@qT\@empty\global\let\eq@qT\eq@na\fi \global\let\eqQT\eq@qT\global\let\eq@qT\eq@na } \def\eq@na{na} % not applicable \let\eq@qT\eq@na \newcommand\PTsHook[1]{\def\PTs@Hook{#1}} \let\PTs@Hook\@empty \let\eq@PTs\@empty \newcommand\eqGradeScale{% "A",[90, 100],"B",[80,90],"C",[70,80],"D",[60,70],"F",[0,60]} \let\eqGradeScaleLoc\@empty \newcommand{\resetGradeScaleLoc}{\global\let\eqGradeScaleLoc\@empty} \def\tallywidth#1{\def\TBW{#1}} \def\TBW{15bp} \def\DefaultHeightOfWidget{11bp} \def\RadioFieldSize{11bp} \def\RBW{2in} % Response Box width (math,txt, txtpc, answer field) \def\SFW{1.5in} % Score Field Width \def\GFW{20pt} % Grade Field Width \def\PtFW{1.5in} % Point Field Width \def\PcFW{1.5in} % Percent Field Width \def\ScoreFieldDefaults {% \Ff{\FfReadOnly}\BC{1 0 0}\BG{}\S{S} \DV{\eqScore}\V{\eqScore}\W{1} } \newcommand\ScoreField[2][] {% \mbox{\text@@Field{#1}{ScoreField.#2}{\SFW}% {\DefaultHeightOfWidget}{}{\eq@setWidgetProps\eq@TextField}% {\ScoreFieldDefaults\every@eqTextField\every@ScoreField}}% } \def\GradeFieldDefaults {% \textColor{0 0 1 rg}\BC{1 0 0}\BG{1 1 1}\S{S} \Ff{\FfReadOnly}\Q{1}\W{1} } \newcommand\GradeField[2][] {% \mbox{\text@@Field{#1}{GradeField.#2}{\GFW}% {\DefaultHeightOfWidget}{}{\eq@setWidgetProps\eq@TextField}% {\GradeFieldDefaults\every@eqTextField\every@GradeField}}% } \def\AnswerFieldDefaults {% \BC{0 0 0}\S{S}\Ff{\FfReadOnly}\W{1}% \presets{\eq@resetAnsFieldOnClose}% } \let\eq@resetAnsFieldOnClose\@empty \newcommand{\noResetAnsFieldOnClose}{% \global\let\eq@resetAnsFieldOnClose\@empty} \newcommand{\resetAnsFieldOnClose}{% \gdef\eq@resetAnsFieldOnClose{% \AApageclose{this.resetForm(["\Fld@name"]);}}} \newcommand\AnswerField[2][] {% \mbox{\text@@Field{#1}{Ans.#2}{\RBW}{\DefaultHeightOfWidget}% {}{\eq@setWidgetProps\eq@TextField}% {\AnswerFieldDefaults\every@eqTextField\every@AnswerField}}% } \newcommand\autoAnswerField{% \@ifundefined{lfooter}{\def\eq@next{\eq@autoAnswerFieldgobble}% \PackageError{exerquiz}{The \string\autoAnswerField\space command\MessageBreak requires the web package}{Use web package} }{% \PackageInfo{exerquiz}{% For this auto answer field feature to run\MessageBreak the webheadings pagestyle of the web package\MessageBreak is required}\def\eq@next{\eq@autoAnswerField}% \ifx\web@lfoot\@empty\else \PackageWarning{exerquiz}{The left running footer already in use\MessageBreak Will overwrite what is there now. Better fix it.}\fi }% \eq@next } \newcommand\eq@autoAnswerFieldgobble[1][]{\relax} \newcommand\autoAnsFldRaiseBox[1]{\def\ef@aAFRB{#1}} \autoAnsFldRaiseBox{0pt} \let\autoAFOpts\@empty \newcommand\eq@autoAnswerField[1][]{\gdef\autoAFOpts{#1}% \def\eq@insertAnswerField{\AnswerField[#1]{\currQuiz}}% \eq@@autoAnswerField } \newcommand\eq@@autoAnswerField{\lfooter{\ifIsRespBox \raisebox{\ef@aAFRB}{\eq@insertAnswerField}% \global\IsRespBoxfalse\fi}% } \newcommand\manualAnswerField[1][\autoAFOpts]{% \expandafter\AnswerField\expandafter[#1]{\currQuiz}} \def\PointsFieldDefaults {% \rawPDF{}\BC{1 0 0}\BG{}\W{1}\S{S}\Ff{\FfReadOnly} } \newcommand\PointsField[2][] {% \mbox{\text@@Field{#1}{PointsField.#2}{\PtFW}% {\DefaultHeightOfWidget}{}{\eq@setWidgetProps\eq@TextField}% {\PointsFieldDefaults\every@eqTextField\every@PointsField}}% } \def\PercentFieldDefaults {% \rawPDF{}\BC{1 0 0}\BG{}\W{1}\S{S}\Ff{\FfReadOnly}% } \newcommand\PercentField[2][] {% \mbox{\text@@Field{#1}{PercentField.#2}{\PcFW}% {\DefaultHeightOfWidget}{}{\eq@setWidgetProps\eq@TextField}% {\PercentFieldDefaults\every@eqTextField\every@PercentField}}% } \newcommand\RestoreScoreField {% \global\let\eqScore\eq@Score \global\let\eqOutOf\eq@OutOf } \def\DeclareQuiz#1{\edef\oField{#1}% \edef\thisQuiz{#1}\edef\curr@quiz{#1}% \edef\currQuiz{#1}\edef\curr@quiz{#1}% } \let\Quiz\DeclareQuiz \def\aeb@noindgobble{\noindent\@gobbletwo} \let\startQuizHere\relax \let\endQuizHere\relax \let\dockQuiz\relax \newcommand\floatQuiz{% \global\let\eq@beginQuiz@saved\eq@beginQuiz \global\let\eq@endQuiz@saved\eq@endQuiz \global\let\startQuizHere\eq@beginQuiz \global\let\endQuizHere\eq@endQuiz \global\let\eq@beginQuiz\aeb@noindgobble \global\let\eq@endQuiz\@empty \global\let\dockQuiz\eq@dockQuiz } \newcommand\eq@dockQuiz{% \global\let\eq@beginQuiz\eq@beginQuiz@saved \global\let\eq@endQuiz\eq@endQuiz@saved \global\let\startQuizHere\relax \global\let\endQuizHere\relax \global\let\eq@beginQuiz@saved\relax \global\let\eq@endQuiz@saved \global\let\dockQuiz\relax } \def\fancyQuizHeaders{% \global\let\eq@sqsllabel@fancy@save\eq@sqsllabel \gdef\eq@sqsllabel{\eq@fancyQuizHeaders}} \def\eq@fancyQuizHeaders{% \if\eqQuizType\isQZ\expandafter\eq@fancyQuizHeadersfmt\else \expandafter\eq@fancyShrtQuizHeadersfmt\fi } \let\eq@sqsllabel@fancy@save\@empty \def\restoreDefaultQuizHeaders{% \global\let\eq@sqsllabel\eq@sqsllabel@fancy@save} \newcommand\fncyQHdrsColor{blue} \newcommand\FncyHdrsFmtNoTitleQuiz{Solution to Quiz:} \newcommand\FncyHdrsFmtQuestion{Question} \newcommand\dfltFncyQHdrsFmt{% \protect\bfseries\protect\color{\fncyQHdrsColor}% \ifx\aebTitleQuiz\@empty \ifnum\@eqquestiondepth>0\relax\FncyHdrsFmtNoTitleQuiz\fi \else\aebTitleQuiz:\ifnum\@eqquestiondepth=0\else\protect\ % \FncyHdrsFmtQuestion\fi\fi\ifcase\@eqquestiondepth \ifx\aebTitleQuiz\@empty\FncyHdrsFmtNoTitleQuiz\fi \or\space\arabic{eqquestionnoi}.% \or\space\arabic{eqquestionnoi}(\alph{eqquestionnoii})% \or\space\arabic{eqquestionnoi}(\alph{eqquestionnoii})% (\roman{eqquestionnoiii})\fi } \newcommand\dclrFncyQzHdrsFmt[1]{% \def\eq@fancyQuizHeadersfmt{{#1}}% } \dclrFncyQzHdrsFmt{\dfltFncyQHdrsFmt} \newcommand\dclrFncySqHdrsFmt[1]{% \def\eq@fancyShrtQuizHeadersfmt{{#1}}% } \dclrFncySqHdrsFmt{\dfltFncyQHdrsFmt} \let\tqhspace\space \newcommand\titleQuiz[1][]{#1\@titleQuizi} \def\@titleQuizi{\makeatletter \@ifstar{\def\eq@tq@star{*}\eq@titleQuiz}% {\def\eq@tq@star{x}\eq@titleQuiz}} \def\eq@titleQuiz#1{% \gdef\aebTitleQuiz{#1}\def\@currentlabelname{#1}% \gdef\aeb@@titleQuiz{#1}% \gdef\aebtitleQuiz{\mbox{\titleQuizfmt{#1}}\tqhspace}% \makeatother} \let\aebtitleQuiz\@empty \let\aebTitleQuiz\@empty \newcommand\titleQuizfmt{\bfseries} \def\ifQuizType#1#2{\if\eqQuizType\isQZ\def\qt@next{#1}% \else\def\qt@next{#2}\fi\qt@next} \def\eq@ifstaroption#1#2{\if\eq@tq@star*\def\sq@next{#1}% \else\def\sq@next{#2}\fi\sq@next} \let\eq@tq@star\relax \def\ifstaroption{\PackageWarning{exerquiz} {\protect\ifstaroption\space is only defined within the\MessageBreak shortquiz environment. Gobbling up its two\MessageBreak arguments, sorry. This occurred}% \@gobbletwo } \newcounter{qMarkCnt} \def\multipartquestion{\global\let\aeb@multipart\eq@One} \providecommand{\ptsLabel}[1]{\def\eqptsLabel{#1}}\ptsLabel{pts} \providecommand{\ptLabel}[1]{\def\eqptLabel{#1}}\ptLabel{pt} \let\aeb@multipart\eq@Zero \newcommand\pcMarkupColor{red} \def\markupWidth{12bp}\def\markupHeight{8bp}\def\markupTextSize{0} \newcommand{\aeb@creditmarkup}{% \textField[\Ff\FfReadOnly\BC{}\F\FHidden \textColor{\pcMarkupColor}\textSize{\markupTextSize}\autoCenter{n}% \DV{0 \eqptsLabel}\V{0 \eqptsLabel}]% {qMark.\currQuiz.\thequestionno.\arabic{qMarkCnt}}% {\markupWidth}{\markupHeight}% } \def\showCreditMarkup{% \def\qMark{\if\aeb@multipart\eq@Zero\aeb@creditmarkup \stepcounter{qMarkCnt}\else\global\let\aeb@multipart\eq@Zero\fi}% \def\qMark@Hook{\aeb@creditmarkupfmt}% } \def\hideCreditMarkup{\global\let\qMark@Hook\@empty} \newcommand{\aeb@creditmarkupfmt}{\makebox[0pt][r]{\qMark\hspace{-2bp}}} \long\def\gobbleToEndQt#1\endeqQt{\ifeqforpaper\expandafter\@gobble\fi} \long\def\gobbleToEndSQt#1\endeqSQt{% \ifeqforpaper\expandafter\@gobble\fi} \newcommand\inclQtFilter[1]{\def\eqarg{#1}\ifx\eqarg\eqFilterArg \else\expandafter\gobbleToEndQt\fi} \newcommand{\exclQt}[1]{\gobbleToEndQt} \newcommand{\useQtFilter}{% \let\eqQt\inclQtFilter\let\eqSQt\exclSQt } \newcommand\inclSQtFilter[1]{\def\eqarg{#1}\ifx\eqarg\eqFilterArg \else\expandafter\gobbleToEndSQt\fi} \newcommand{\exclSQt}[1]{\gobbleToEndSQt} \newcommand{\useSQtFilter}{\let\eqSQt\inclSQtFilter\let\eqQt\exclQt} \newcommand{\sqbookmarkfmt}{Short Quiz \@shortquizCnt.\space} \newcommand{\qzbookmarkfmt}{Quiz \@quizCnt.\space} \newcommand{\quizpdfbookmark}[1]{\relax\def\argi{#1}% \if\eqQuizType\isSQZ\edef\aeb@bmmrkdest{sqbm.\@shortquizCnt}% \def\aeb@thisbkmrkfmt{\sqbookmarkfmt}\else \edef\aeb@bmmrkdest{qzbm.\@quizCnt}% \def\aeb@thisbkmrkfmt{\qzbookmarkfmt}\fi \def\quizpdfbookmarktitle{#1}% \def\eqex@next{\belowpdfbookmark{\aeb@thisbkmrkfmt#1}% {\aeb@bmmrkdest}}% \ifx\aebTitleQuiz\@empty\else\ifx\argi\@empty \def\quizpdfbookmarktitle{\aebTitleQuiz}% \def\eqex@next{\belowpdfbookmark{\aebTitleQuiz}% {\aeb@bmmrkdest}}\fi\fi \eqex@next\ignorespaces } \def\pushEnvir{\xdef\eq@currenvir{\@currenvir}\endgroup} \def\popEnvir{\begingroup\@endpefalse \edef\@currenvir{\eq@currenvir}% \edef\@currenvline{\on@line}% } \def\answers@sq{\parindent0pt \ifx\solutionparshape\@empty\else \pushEnvir\par\noindent\expandafter\popEnvir\fi \stepcounter{questionno}% \if\sqstar*\relax \if\aeb@FLOverride\eq@l \let\@Ans\Ans@sq@l\else \let\@Ans\Ans@sq@f\fi \else \if\aeb@FLOverride\eq@f \let\@Ans\Ans@sq@f\else \let\@Ans\Ans@sq@l\fi \fi \def\aeb@answerType{r}\@ifnextchar[{\answers@@sq}% {\@ifstar{\answers@@sq[\curr@quiz.\thequestionno]}{\answers@@sq[]}}} \def\manswers@sq{\parindent0pt \@ifundefined{ifuserectforms}{} {\if\aeb@FLOverride\eq@f\ifuserectforms \useRectForMC\else\useCircForMC\fi\fi}% \ifx\solutionparshape\@empty\else \pushEnvir\par\noindent\expandafter\popEnvir\fi \stepcounter{questionno}% \if\sqstar*\relax \if\aeb@FLOverride\eq@l \let\@Ans\Ans@ck@sq@l\else \let\@Ans\Ans@ck@sq@f\fi \else \if\aeb@FLOverride\eq@f \let\@Ans\Ans@ck@sq@f\else \let\@Ans\Ans@ck@sq@l\fi \fi \def\aeb@answerType{c}\@ifnextchar[{\answers@@sq}% {\@ifstar{\answers@@sq[\curr@quiz.\thequestionno]}{\answers@@sq[]}}} \let\sq@hwdest\@empty % hard-wired destination \def\answers@@sq[#1]#2{% \xdef\aeb@numCols{#2}% \ifx\sq@hwdest\@empty \xdef\@qzsolndest{#1}\else \gdef\@qzsolndest{\sq@hwdest}\fi \if\aeb@numCols1\gdef\eq@listType{1}\expandafter\answers@sq@list \else \gdef\eq@listType{0}\expandafter\answers@@sq@tabular \fi{\aeb@numCols}% } \def\setMClabelsepDefault#1{\def\eq@hspanner@default{#1}} \def\setMClabelsep#1{\def\eq@hspanner{#1}} \setMClabelsep{\ }\setMClabelsepDefault{\ } \def\resetMClabelsep{\expandafter\setMClabelsep\expandafter {\eq@hspanner@default}} \def\eq@lw@l{\eq@l@l\eq@hspanner} \def\eq@l@l{\normalsize\normalfont(d)} \def\eq@lw@f{\kern\RadioFieldSize\eq@hspanner} \@ifundefined{ifwithsoldoc}{\newif\ifwithsoldoc\withsoldocfalse}{} \let\eq@ansChoiceArray\@empty \def\eq@recordAnsChoice{% \ifx\eq@ansChoiceArray\@empty \edef\tmp@exp{\noexpand\g@addto@macro \noexpand\eq@ansChoiceArray{"\alph{quizno}"}}\else \edef\tmp@exp{\noexpand\g@addto@macro \noexpand\eq@ansChoiceArray{,"\alph{quizno}"}}\fi \tmp@exp } \newcommand\Ans@list[2][0]{\gdef\eq@pPTs{#1}\xdef\Ans@choice{#2}% \item\relax\noindent\if\eq@listType\eq@One \addtocounter{quizno}{-1}\@ifundefined{ifwithsoldoc} {\refstepcounter{quizno}}{\ifwithsoldoc\stepcounter{quizno}\else \refstepcounter{quizno}\fi}\fi \ignorespaces} \newenvironment{answers@sq@list}[1] {% \ifx\aeb@answerType\eq@r \let\endanswers\endanswers@sq@list\else \let\endmanswers\endanswers@sq@list\fi \list{\strut\@Ans}{% \if\sqstar*\relax \settowidth{\labelwidth}{\eq@lw@f}\else \settowidth{\labelwidth}{\eq@lw@l}\fi \setlength{\topsep}{-\parskip+\aboveanswersSkip}% \setlength{\parsep}{0pt}\setlength{\itemindent}{0pt}% \setlength{\itemsep}{0pt}\setlength{\partopsep}{0pt}% \setlength{\listparindent}{\parindent}% \ifnum\exerwparts@cols>1\relax \ifx\itsExerParts\eq@YES \setlength{\leftmargin}{\labelwidth}\else \setlength{\leftmargin}{\labelwidth+\eqemargin}\fi \else \ifx\solutionparshape\@empty \setlength{\leftmargin}{\labelwidth}\else \setlength{\leftmargin}{\labelwidth+\eqemargin}\fi\fi \setlength{\labelsep}{0pt}% % \settowidth{\labelsep}{\eq@hspanner}% \def\Ans{\Ans@list}% }% }% {\endlist\setcounter{quizno}{0}\eq@answersEndHook} \newcommand\Ans@tabular[2][0]{\gdef\eq@pPTs{#1}\xdef\Ans@choice{#2}% \leavevmode\@Ans } \newcommand\sqtabsep[1]{\def\eq@argi{#1}\ifx\eq@argi\@empty \def\sq@tabsep{1.5pt}\else\def\sq@tabsep{#1}\fi} \sqtabsep{1.5pt} \def\sqTabPos#1{\def\sq@TabPos{[#1]}}\sqTabPos{} \def\answers@@sq@tabular#1{% \ifinner \ifx\itsExerParts\eq@YES\par\removelastskip \removelastparskip\vskip\aboveanswersSkip\fi \else\par\removelastskip\removelastparskip \vskip\aboveanswersSkip\fi \noindent\ifnum\exerwparts@cols>1\relax\parshape=0\fi \tabcolsep=0pt \eq@tmpdima=\linewidth \@tempcnta#1\relax \advance\@tempcnta-1\relax \multiply\@tempcnta by2 \@tempdima\sq@tabsep\relax \multiply\@tempdima\@tempcnta \advance\eq@tmpdima-\@tempdima \divide\eq@tmpdima by#1 \def\Ans{\Ans@tabular}% \tabcolsep\sq@tabsep\relax \expandafter\tabular\sq@TabPos{@{}*{#1}{p{\eq@tmpdima}}@{}}}% \let\eq@save@doendpe\@doendpe \def\reset@doendpe#1{\global\eq@scratchtoks=\expandafter{#1}% \gdef\@doendpe{\par\@endpetrue\global\let\@doendpe\eq@save@doendpe \def\par{\@restorepar \expandafter\everypar \expandafter{\the\eq@scratchtoks}\par\@endpefalse}% \everypar{{\setbox\z@\lastbox}% \everypar{}\@endpefalse}\the\eq@scratchtoks }% } \newcommand\answersEndHook[1]{\def\eq@answersEndHook{#1}} \let\eq@answersEndHook\@empty \def\endanswers@sq{\endtabular\setcounter{quizno}{0}% \eq@answersEndHook\reset@doendpe{\the\everypar}% \ifinner\else%\par \removelastskip \vspace{\aboveanswersSkip}\@endpetrue\fi } \def\endmanswers@sq{\endtabular\setcounter{quizno}{0}% \eq@answersEndHook\reset@doendpe{\the\everypar}% \ifinner\else%\par \removelastskip \vspace{\aboveanswersSkip}\@endpetrue\fi } \def\popiiictm{\special{CTM: pop pop pop}} \def\sqWrongRespJS{OnBlurRespBox( false, "\oField" );} \def\sqRightRespJS{OnBlurRespBox( true, "\oField" );} \def\Ans@sq@l@Actions {% \A{\if\Ans@choice1 \JS{\sqRightRespJS} \ifx\@qzsolndest\@empty\else \ifeq@solutionsafter\else /Next <> \fi \fi \else \JS{\sqWrongRespJS\jsR \ifx\oField\@empty\else updateTally("\oField.\thequestionno"); \fi}% \fi }% } \def\linkContentFormat{\alph{quizno}} \def\aebChoiceAltFmt{\noexpand\ifaebshowgrayletters \Alph{quizno}\noexpand\else\linkContentFormat\noexpand\fi} \def\linkContentWrapper{(\hfil\linkContentFormat\hfil)}% \def\Ans@sq@l{% \leavevmode\if\eq@listType\eq@One\stepcounter{quizno}\else \@ifundefined{ifwithsoldoc}{\refstepcounter{quizno}} {\ifwithsoldoc\stepcounter{quizno}\else \refstepcounter{quizno}\fi}\fi\PBS\raggedright \settowidth{\eq@tmplength}{\eq@lw@l}\sbox{\eq@tmpbox}{\eq@l@l}% \eq@tmpdima=\wd\eq@tmpbox \def\link@@Content{\linkContentWrapper}% \hangindent=\eq@tmplength\hangafter=1\relax \set@@Link{}{}{}% {\makebox[\eq@tmpdima]{\color{\@linkcolor}\link@@Content}} {\eq@protect\A}{\eq@setWidgetProps\setLink@driver}% {\set@LinkTextDefaults\Ans@sq@l@Actions\every@Link}% \Ans@proofing{\eq@tmpdima}% \eq@hspanner\ignorespaces} \def\Ans@ck@sq@l{\Ans@ck@sq@f} \def\@@Ans@sq@f@Defaults {% \BC{0 0 0}\Ff{\FfNoToggleToOff}\W{1} \F{\FPrint}\textSize{12}\textColor{0 g} } \def\sqTurnOffAlerts{\let\@sqTurnOffAlerts\eq@Zero} \def\sqTurnOnAlerts{\let\@sqTurnOffAlerts\eq@One} \sqTurnOnAlerts \def\sqNoCorrections{\let\@sqAlertsOnly\eq@One} \def\sqCorrections{\let\@sqAlertsOnly\eq@Zero} \sqNoCorrections \def\Ans@sq@f@ActionsTrue{% \if\@sqTurnOffAlerts1OnBlurRespBox(true,"\oField");\jsR\fi \ifx\@qzsolndest\@empty\else\ifeq@solutionsafter\else jmpToNamedDest("\oField","\@qzsolndest",% \if\@sqTurnOffAlerts00\else1\fi);\fi \fi\eqAddAAMouseUpMC} \def\Ans@sq@f@ActionsFalse{% \if\@sqTurnOffAlerts1OnBlurRespBox(false,"\oField" );\jsR\fi \ifx\oField\@empty\else updateTally("\oField.\thequestionno"); \fi\jsR\eqAddAAMouseUpMC} \def\Ans@sq@f@Actions{\A{\if\Ans@choice\eq@One \JS{\Ans@sq@f@ActionsTrue}\else \JS{\Ans@sq@f@ActionsFalse}\fi}% \AAmousedown{updateTally.downState=!!event.target.isBoxChecked% (\arabic{quizno}-1);}} \def\Ans@proofing#1{\ifeq@proofing\if\Ans@choice1\relax \llap{\@proofingsymbol\,\hskip#1\relax}% \fi\fi} \def\sqRghtSymbChoice#1{\chooseJSsymbol*{#1}% \ifx\eq@retnStyle\@empty \edef\sq@corrsymch{\sqRghtSymbChoiceDef}\else \edef\sq@corrsymch{#1}\fi} \def\sqRghtSymbColor#1{\edef\eq@arg{#1}\ifx\eq@arg\@empty \edef\sq@corrsymcol{\sqRghtSymbColorDef}\else \edef\sq@corrsymcol{#1}\fi} \def\sqWrngSymbChoice#1{\chooseJSsymbol*{#1}% \ifx\eq@retnStyle\@empty \edef\sq@wrgsymch{\sqWrngSymbChoiceDef}\else \edef\sq@wrgsymch{#1}\fi} \def\sqWrngSymbColor#1{\edef\eq@arg{#1}\ifx\eq@arg\@empty \edef\sq@wrgsymcol{\sqWrngSymbColorDef}\else \edef\sq@wrgsymcol{#1}\fi} \def\sqRghtSymbChoiceDef{check} \def\sqRghtSymbColorDef{0 .6 0 rg} \def\sqWrngSymbChoiceDef{cross} \def\sqWrngSymbColorDef{1 0 0 rg} \edef\sq@corrsymch{\sqRghtSymbChoiceDef} \edef\sq@corrsymcol{\sqRghtSymbColorDef} \edef\sq@wrgsymch{\sqWrngSymbChoiceDef} \edef\sq@wrgsymcol{\sqWrngSymbColorDef} \def\sqResetSymbToDef{% \sqRghtSymbChoice{}\sqRghtSymbColor{}% \sqWrngSymbChoice{}\sqWrngSymbColor{}% } \def\qChoiceSymb#1{\chooseJSsymbol*{#1}% \ifx\eq@retnStyle\@empty \edef\qz@chksymb{\qChoiceSymbDef}\else \edef\qz@chksymb{#1}\fi} \def\qChoiceColor#1{\edef\eq@arg{#1}\ifx\eq@arg\@empty \edef\qz@chksymbcol{\qChoiceColorDef}\else \edef\qz@chksymbcol{#1}\fi} \def\qChoiceSymbDef{check} \def\qChoiceColorDef{0 0 0 rg} \edef\qz@chksymb{\qChoiceSymbDef} \edef\qz@chksymbcol{\qChoiceColorDef} \let\rbf@Opts\@empty \def\Ans@sq@f{% \if\eq@listType\eq@One\stepcounter{quizno}\else \@ifundefined{ifwithsoldoc}{\refstepcounter{quizno}} {\ifwithsoldoc\stepcounter{quizno}\else \refstepcounter{quizno}\fi}\fi\PBS\raggedright \if\Ans@choice\eq@One \def\rbf@Opts{\symbolchoice{\sq@corrsymch}% \textColor{\sq@corrsymcol}}\else \def\rbf@Opts{\symbolchoice{\sq@wrgsymch}% \textColor{\sq@wrgsymcol}}\fi \settowidth{\eq@tmplength}{\eq@lw@f}% \eq@tmpdima=\wd\eq@tmpbox% \hangindent=\eq@tmplength\hangafter=1\relax \insertGrayLetters % 6.3d \mbox{\expandafter\radio@@Button\expandafter{\rbf@Opts}% {mc.\oField.\thequestionno}% {\RadioFieldSize}% 11/16/05 changed from \oField to mc.\oField {\RadioFieldSize}{\Ans@choice\alph{quizno}}{\eq@protect\A}% {\eq@setWidgetProps\eq@RadioCheck@driver}% {\@@Ans@sq@f@Defaults\Ans@sq@f@Actions\every@RadioButton \every@sqRadioButton}}% \Ans@proofing{\RadioFieldSize}% \eq@hspanner\ignorespaces} \def\@@Ans@ck@sq@f@Defaults {% \BC{0 0 0}\Ff{\FfNoToggleToOff} \F{\FPrint}\textSize{12}\textColor{0 g}\W{1} } \begingroup \catcode`\&=12 \gdef\eq@AND{&&} \endgroup \def\Ans@ck@sq@f@ActionsTrue{% var fName=event.target.name;\jsR var g=this.getField("mc.\oField.\thequestionno");\jsR var a=g.getArray();\jsR for (var i=0; i=a.length) jmpToNamedDest("\oField","\@qzsolndest",% \if\@sqTurnOffAlerts00\else1\fi); \fi \fi\eqAddAAMouseUpMS} \def\Ans@ck@sq@f@ActionsFalse{% var fName=event.target.name;\jsR var g=this.getField("mc.\oField.\thequestionno");\jsR var a=g.getArray();\jsR for (var i=0; i> } \def\Ans@c@f@Defaults {% \BC{0 0 0}\S{S}\W{1}\F{\FHidden}\textSize{12} \textColor{0 g}\symbolchoice{circle} } \let\bottomOfAnsfStack\relax \providecommand\graylettersColor{gray} \def\insertGrayLetters{\ifaebshowgrayletters \rlap{\makebox[\RadioFieldSize]% {\textcolor{\graylettersColor}{\Alph{quizno}}}}\else\relax\fi} \def\Ans@@f {% \settowidth{\eq@tmplength}{\eq@lw@f}% \hangindent=\eq@tmplength\hangafter=1 \bottomOfAnsfStack\insertGrayLetters \edef\rbf@Opts{\ifaeb@usecircles\else \noexpand\symbolchoice{\qz@chksymb}\fi \noexpand\textColor{\qz@chksymbcol}}% \if\Ans@choice1\eq@recordAnsChoice\fi \mbox{\expandafter\radio@@Button\expandafter{\rbf@Opts}% {mc.\curr@quiz.\thequestionno}% {\RadioFieldSize}{\RadioFieldSize}{\Ans@choice\alph{quizno}}% {\eq@protect\A}{\eq@setWidgetProps\eq@RadioCheck@driver}% {\Ans@r@f@Defaults\Ans@r@f@Actions\every@RadioButton \every@qRadioButton\insert@circlesymbol}}% \let\late@options\@empty \ifnocorrections\else \if\Ans@choice1\relax \edef\Ans@c@f@Choice{\noexpand\DV{Yes}% \ifx\@qzsolndest\@empty\noexpand\Ff{\FfReadOnly}% \else \ifeq@noquizsolutions \noexpand\Ff{\FfReadOnly}% \else \noexpand\A{\noexpand\quiz@SolutionActionHook}% \fi \fi }% \else \def\Ans@c@f@Choice{\Ff{\FfReadOnly}}% \fi \ifaeb@usecircles\def\late@options{\BC{}}\fi \if\Ans@choice1\relax \ifx\@qzsolndest\@empty\else \ifeq@noquizsolutions\else \edef\late@options{\noexpand\BC{\solution@Color}}% \fi \fi \fi \makebox[0pt][r]{\check@@Box{}% {mcq.\curr@quiz.\thequestionno.\arabic{quizno}}% {\RadioFieldSize}{\RadioFieldSize}{Yes}{}% {\eq@setWidgetProps\eq@RadioCheck@driver}% {\Ans@c@f@Defaults\Ans@c@f@Choice\every@CheckBox \every@qCheckBox\late@options}}% \fi \Ans@proofing{\RadioFieldSize}% \eq@hspanner\ignorespaces} \def\limitSelectionTo#1{\def\eqlimselTo{#1}} \let\eqlimselTo\@empty \def\Ans@ck@f{\leavevmode\if\eq@listType1\stepcounter{quizno}% \else\refstepcounter{quizno}\fi \if\Ans@choice1\eq@recordAnsChoice\fi \PBS\raggedright\Ans@@ck@f} \def\Ans@ck@f@Defaults {% \BC{0 0 0}\S{S}\W{1}\Ff{\FfNoToggleToOff} \textSize{12}\textColor{0 g} } \def\Ans@ck@f@Actions {% \A{\JS{% var _bOK=true;\jsR \ifx\eqlimselTo\@empty\else _bOK = LimitSelection(\eqlimselTo,% "mck.\curr@quiz.\thequestionno","\arabic{quizno}");\jsR\fi if (_bOK) {\jsR\jsT var aPMSretn=ProcessMultiSelection(\Ans@choice,"\alph{quizno}",% \thequestionno,\arabic{quizno},"\curr@quiz",\eqPTs,\eq@pPTs);\jsR\jsT RecordProblemType("\eqQT",\thequestionno);\jsR\jsT ProcessQuestion(aPMSretn[0],aPMSretn[1],\thequestionno,% \arabic{quizno},"\curr@quiz",0,\ifnocorrections0\else1\fi,% "\bqlabelISO"\if\eqQuizType\isQZ\ifx\eq@online\eq@YES \ifeq@noquizsolutions\else,1\fi\fi\fi);\jsR }}}% } \def\quiz@SolutionActionHook{% /S/GoTo/D(\@qzsolndest)/Next<<\JS{this.resetForm(% ["mcq.\curr@quiz.\thequestionno.\arabic{quizno}"]);}>> } \def\Ans@@ck@f {% \settowidth{\eq@tmplength}{\eq@lw@f}% \hangindent=\eq@tmplength\hangafter=1 \bottomOfAnsfStack\insertGrayLetters \bottomOfAnsfStack\insertGrayLetters \def\cbf@Opts{\symbolchoice{\qz@chksymb}% \textColor{\qz@chksymbcol}}% \mbox{\expandafter\check@@Box\expandafter{\cbf@Opts}% {mck.\curr@quiz.\thequestionno.\arabic{quizno}}% {\RadioFieldSize}{\RadioFieldSize}{\Ans@choice\alph{quizno}}% {\eq@protect\A}{\eq@setWidgetProps\eq@RadioCheck@driver}% {\Ans@ck@f@Defaults\Ans@ck@f@Actions\every@RadioButton \every@qckCheckbox}}% \ifnocorrections\else \if\Ans@choice1\relax \edef\Ans@c@f@Choice{\noexpand\DV{Yes}% \ifx\@qzsolndest\@empty\noexpand\Ff{\FfReadOnly}% \else \ifeq@noquizsolutions \noexpand\Ff{\FfReadOnly}% \else \noexpand\A{\noexpand\quiz@SolutionActionHook}% \fi \fi }% \else \def\Ans@c@f@Choice{\Ff{\FfReadOnly}}% \fi \let\late@options\@empty \if\Ans@choice1\relax \ifx\@qzsolndest\@empty\else \ifeq@noquizsolutions\else \edef\late@options{\noexpand\BC{\solution@Color}}% \fi \fi \fi \makebox[0pt][r]{\check@@Box{}% {mcq.\curr@quiz.\thequestionno.\arabic{quizno}}% {\RadioFieldSize}{\RadioFieldSize}{Yes}{}% {\eq@setWidgetProps\eq@RadioCheck@driver}% {\Ans@c@f@Defaults\Ans@c@f@Choice\every@CheckBox \every@qCheckBox\late@options}}% \fi \Ans@proofing{\RadioFieldSize}% \eq@hspanner\ignorespaces} \newcount\eq@tabColCnt \define@key{bchoice}{nCols}{\def\bChoiceNumCols{#1}} \@for\eqi:=1,2,3,4,5,6,7,8,9,10 \do{\edef\temp@expand@def{% \noexpand\define@key{bchoice}{\eqi}[\eqi]{% \noexpand\def\noexpand\bChoiceNumCols{\eqi}}% }\temp@expand@def } \def\bChoiceNumCols{\aeb@numCols} \define@key{bchoice}{random}[true]{% \csname if#1\endcsname\eq@randomizeChoicestrue \else\eq@randomizeChoicesfalse\fi } \define@key{bchoice}{label}[]{\xdef\bChoiceLabel{#1}} \def\bChoices{\@ifnextchar[{\@ansChoices}{\@ansChoices[\aeb@numCols]}} \def\@ansChoices[#1]% {% \global\let\@tempholdSaveAns\@empty %4/5 \global\let\@tempholdSaveChoice\@empty %4/5 \global\let\bChoiceLabel\@empty %4/5 \setkeys{bchoice}{#1}% \global\eq@tabColCnt=0 \ifnum\aeb@numCols=1 % list mode \def\eq@next{\@layoutListAns}\else % tabular mode \def\eq@next{\@layoutTabularAns{\bChoiceNumCols}}\fi \eq@next } \let\eChoices\relax \def\@layoutListAns{\@ifnextchar\Ans{\@getListAns}% {\@lookforendansChoices{\@layoutListAns}}% } \newcommand{\eq@saveAns}[2][]{% \let\eq@next\@@@SaveAnsGobbleAns \ifx\bChoiceLabel\@empty\else \def\eq@savedAnsOpt{#1}\def\eq@savedAnsZO{#2}% \if\eq@savedAnsZO1 \let\eq@next\@@@SaveAns\fi \fi\eq@next } \long\def\@@@SaveAns#1\eAns{% 4/5 \g@addto@macro\@tempholdSaveAns{\\{\ignorespaces#1}}% \addtocounter{quizno}{1}% \edef\temp@expand{\noexpand\g@addto@macro\noexpand \@tempholdSaveChoice{% \noexpand\\{\ifx\sqstar\@empty\aebChoiceAltFmt\else \ifaebshowgrayletters\Alph{quizno}\else \linkContentFormat\fi\fi}}}\temp@expand \addtocounter{quizno}{-1}% } \newif\ifoxfordcomma \oxfordcommatrue \def\oxfordCommaOn{\oxfordcommatrue} \def\oxfordCommaOff{\oxfordcommafalse} \def\eq@insertComma{% \ifx\eq@comma\@empty \ifnum\@nameuse{NumAns\eq@namearg}>2\relax \def\eq@comma{,}\fi \else\ifx\eq@insertAnd\@empty\eq@comma\space \else\ifnum\@tempcnta=\@nameuse{NumAns\eq@namearg}% \ifoxfordcomma\eq@comma\fi\else\eq@comma\fi\space \fi \fi } \newcommand\eqAnd{and}\def\eq@insertAnd{% \ifnum\@nameuse{NumAns\eq@namearg}<2\relax\else \ifnum\@nameuse{NumAns\eq@namearg}>2\relax \else\leavevmode\space\fi\eqAnd\space\fi} \long\def\eq@displayAns#1{\advance\@tempcnta1\relax \eq@insertComma \ifnum\@tempcnta=\@nameuse{NumAns\eq@namearg}\eq@insertAnd\fi#1} \def\eq@displayAlts#1{\advance\@tempcnta1 \eq@insertComma \ifnum\@tempcnta=\@nameuse{NumAns\eq@namearg}\eq@insertAnd\fi \savedAltFmt{#1}} \def\eq@displayAltsAns#1{\advance\@tempcnta1\relax \eq@insertComma \ifnum\@tempcnta=\@nameuse{NumAns\eq@namearg}\eq@insertAnd\fi#1} \newcommand{\savedAltFmt}[1]{(#1)} \newcommand{\useSavedAns}{\bgroup\@ifstar{\useSavedAns@i} {\let\eq@insertAnd\@empty\useSavedAns@i}} \newcommand{\useSavedAns@i}[2][]{\@tempcnta=0\relax \def\eq@namearg{#2}\let\label\@gobble \def\eq@argi{#1}\ifx\eq@argi\@empty \let\eq@comma\@empty \let\\\eq@displayAns\@nameuse{SavedAns#2}\else \@nameuse{SavedAns#2-Idx#1}\fi \egroup } \newcommand{\useSavedAlts}{\bgroup\@ifstar{\useSavedAlts@i} {\let\eq@insertAnd\@empty\useSavedAlts@i}} \newcommand{\useSavedAlts@i}[2][]{\@tempcnta=0\relax \def\eq@namearg{#2}\@nameuse{caseFor#2}% \def\eq@argi{#1}\ifx\eq@argi\@empty \let\eq@comma\@empty \let\\\eq@displayAlts\@nameuse{SavedAlts#2}\else \savedAltFmt{\@nameuse{SavedAlts#2-Idx#1}}\fi \egroup } \newcommand{\useSavedAltsAns}{\bgroup\@ifstar{\useSavedAltsAns@i} {\let\eq@insertAnd\@empty\useSavedAltsAns@i}} \newcommand{\useSavedAltsAns@i}[2][]{\@tempcnta=0\relax \def\eq@namearg{#2}\@nameuse{caseFor#2}\let\label\@gobble \def\eq@argi{#1}\ifx\eq@argi\@empty \let\eq@comma\@empty \let\\\eq@displayAltsAns\@nameuse{SavedAltsAns#2}\else \savedAltFmt{\@nameuse{SavedAlts#2-Idx#1}} \@nameuse{SavedAns#2-Idx#1}\fi \egroup } \newcommand{\useSavedNumAns}[1]{\@nameuse{NumAns#1}} \long\def\@@@SaveAnsGobbleAns#1\eAns{} % 4/5 \long\def\@getListAns\Ans#1\eAns{%\@@par %start new paragraph \eq@saveAns#1\eAns % 4/5 \Ans#1\vspace{\@rowskip}% \@layoutListAns } \long\def\@lookforendansChoices#1{% \@ifnextchar\eChoices{\rowsep{\rowsep@default}% \expandafter\@findendans\@gobble}{\expandafter#1\@gobble}% } \def\@layoutTabularAns#1{% \let\eq@tabSep\@empty \xdef\numShortCols{#1}% \ifnum#1>\aeb@numCols \xdef\numShortCols{\aeb@numCols}\fi \@@layoutTabularAns } \def\@@layoutTabularAns{% \@ifnextchar\Ans{\@getTabAns}% {\@lookforendansChoices{\@@layoutTabularAns}}% } \def\rowsep#1{\gdef\@rowsep{[#1]}\gdef\@rowskip{#1}}% \rowsep{\rowsep@default} \def\rowsepDefault#1{\def\rowsep@default{#1}} \def\rowsep@default{0pt} \long\def\@getTabAns\Ans#1\eAns{% \eq@saveAns#1\eAns \global\advance\eq@tabColCnt1 \let\@save@tabSep=\eq@tabSep \ifnum\eq@tabColCnt=\numShortCols \global\eq@tabColCnt=0 \xdef\eq@tabSep{\noexpand\\\noalign{\kern\@rowskip\relax}}% \else \gdef\eq@tabSep{&}% \fi \@ifnextchar\eChoices{\@save@tabSep\Ans#1\rowsep{\rowsep@default} \expandafter\@findendans\@gobble}% {\@save@tabSep\Ans#1\@@layoutTabularAns}% } \def\@findendans{\@ifnextchar\end{% 4/5 \ifx\bChoiceLabel\@empty\else \processLabeledAns\fi }{\expandafter\@findendans\@gobble}}% \def\defineEachAns#1{\advance\count0by1\relax \@temptokena={#1}\csarg\xdef {SavedAns\bChoiceLabel-Idx\the\count0}{\the\@temptokena}% \ifsolutionsonly\else {\let\\\relax\eq@IWDefs{\string \csarg\string\gdef{SavedAns\bChoiceLabel-Idx\the\count0}% {\the\@temptokena}}}\fi } \def\defineEachChoice#1{\advance\count0by1\relax \@temptokena={#1}\csarg\xdef {SavedAlts\bChoiceLabel-Idx\the\count0}% {\the\@temptokena}\ifsolutionsonly\else {\let\\\relax\eq@IWDefs{\string \csarg\string\gdef{SavedAlts\bChoiceLabel-Idx\the\count0}% {\the\@temptokena}}}\fi } \def\processLabeledAns{% \bgroup \let\label\@gobble \if\aeb@FLOverride\eq@l \global\@namedef{caseFor\bChoiceLabel}{\graylettersOff}\else \ifaebshowgrayletters \global\@namedef{caseFor\bChoiceLabel}{\graylettersOn}\else \global\@namedef{caseFor\bChoiceLabel}{\graylettersOff}\fi \fi \toks@=\expandafter{\@tempholdSaveAns}\csarg \xdef{SavedAns\bChoiceLabel}{\the\toks@}% \ifsolutionsonly\else{\let\\\relax\eq@IWDefs{\string \csarg\string\gdef{SavedAns\bChoiceLabel}{\the\toks@}}}\fi \count0=0\relax\let\\\defineEachAns\the\toks@ \xdef\@currNCntAns{\the\count0 }\csarg \xdef{NumAns\bChoiceLabel}{\@currNCntAns}% \ifsolutionsonly\else{\eq@IWDefs{\string \csarg\string\gdef{NumAns\bChoiceLabel}{\the\count0 }}}\fi \toks@=\expandafter{\@tempholdSaveChoice}\csarg \xdef{SavedAlts\bChoiceLabel}{\the\toks@}% \ifsolutionsonly\else{\let\\\relax\eq@IWDefs{\string \csarg\string\gdef{SavedAlts\bChoiceLabel}{\the\toks@}}}\fi \count0=0\relax\let\\\defineEachChoice\the\toks@ \count0=1\relax\toks@={}%{\ignorespaces\@gobble}% \loop \edef\temp@exp{\the\toks@\noexpand\\{% \noexpand\useSavedAlts[\the\count0]{\bChoiceLabel} \noexpand\useSavedAns[\the\count0]{\bChoiceLabel}}}% \toks@=\expandafter{\temp@exp}% \ifnum\count0<\@currNCntAns \advance\count0by1 \repeat \csarg\xdef{SavedAltsAns\bChoiceLabel}{\the\toks@}% \ifsolutionsonly\else{\let\\\relax\eq@IWDefs{\string \csarg\string\gdef{SavedAltsAns\bChoiceLabel}{\the\toks@}}}\fi \egroup } \def\graylettersOn{\aebshowgrayletterstrue} \def\graylettersOff{\aebshowgraylettersfalse} \def\aeb@exiii{\expandafter\expandafter\expandafter} \def\REF{\@ifstar{\let\isREFstar\eq@One\aeb@REFstar} {\let\isREFstar\eq@Zero\aeb@REF}} \def\aeb@REFstar#1{\@ifundefined{r@#1}{\hbox{\reset@font\bfseries ??}} {\ifaebshowgrayletters\aeb@buildUpperCaseRef{#1}% \else\ref*{#1}\fi}% } \def\aeb@REF#1{\@ifundefined{r@#1}{\hbox{\reset@font\bfseries ??}} {\ifaebshowgrayletters\aeb@buildUpperCaseRef{#1}% \else\ref{#1}\fi}% } \def\aeb@buildUpperCaseRef#1{% \xdef\tmp@expand{\aeb@exiii\@firstoffive\csname r@#1\endcsname}% \xdef\tmp@expand{\uppercase{\tmp@expand}}% \if\isREFstar\eq@One\tmp@expand\else\hyperref[#1]{\tmp@expand}\fi } \newif\ifaeb@usecircles\aeb@usecirclesfalse \let\insert@circlesymbol\@empty \def\useMCCircles{\useForms \ifaeb@usecircles\else \global\aeb@usecirclestrue \gdef\insert@circlesymbol{\symbolchoice{circle}}% \fi } \def\useMCRects{\useForms \ifaeb@usecircles\global\aeb@usecirclesfalse \global\let\insert@circlesymbol\@empty \fi } \let\useMCCRects\useMCRects \let\oqpriorhook\@empty \newenvironment{oQuestion}[1]{% \let\@currentQues\@empty \xdef\eq@pageThisQ{\the\c@page}% \global\let\eqQzQuesList\@empty \xdef\oField{#1}\xdef\curr@quiz{#1}\xdef\currQuiz{#1}% \g@addto@macro\ListOfSQuizNames{,#1}\let\@qzsolndest\@empty \let\eqQuizType\isSQZ\gdef\eqPTs{1}\global\let\eqQT\eq@na \let\answers\answers@sq \let\endanswers\endanswers@sq \let\manswers\manswers@sq \let\endmanswers\endmanswers@sq \let\solution\solution@sq \let\endsolution\endsolution@sq \noindent\oqpriorhook\sq@IDTxtField\ifx\aebTitleQuiz\@empty \else\aebtitleQuiz\fi\ignorespaces }{% \global\let\aebtitleQuiz\@empty \global\let\aebTitleQuiz\@empty \global\let\eq@tq@star\relax \aftergroup\ignorespaces } \def\oSolution#1{\edef\@qzsolndest{#1}} \def\replaceExclPt#1{\def\replaceexclaim{#1}} \replaceExclPt{false} \def\negPointsAllowed{\def\negpointsallowed{true}} \@onlypreamble{\negPointsAllowed} \def\negpointsallowed{false} \def\negPointsMarkupAllowed{\def\negpointsmarkupallowed{true}} \def\negpointsmarkupallowed{false} \@onlypreamble{\negPointsMarkupAllowed} \def\requireAlertBox{\def\bcheckboxused{false}} \def\allowNoAlertBox{\def\bcheckboxused{true}} \allowNoAlertBox \newcommand\RespBoxNT{\RespBoxMath} \newcommand\RespBox{\RespBoxMath} \def\eqsanitize{\@makeother\_\@makeother\^\@makeother\&} \newcommand\RespBoxMath{\def\rbFlag{0}\begingroup\Hy@unicodefalse \eqsanitize\@RespBox} \def\eq@rpl#1#2{_rplVarsBy('#1','#2')@} % dps17 \ifnum\eq@drivernum=0\def\RorRT{\r\t}\else\def\RorRT{\r}\fi \def\toAltApprCnt{0}\def\toAltApprVar{_toAltAppr\toAltApprCnt} \def\toAltApprCntInc{{\@tempcnta=\toAltApprCnt\relax \advance\@tempcnta1\relax \xdef\toAltApprCnt{\the\@tempcnta}}} \def\setCoreInitAltAppr{% var\eqSP_substVars=\indepVars;\RorRT var\eqSP_mathVars=processMathVars(_substVars);\RorRT var\eqSP_substValue=getSubstValue(_substVars,event.value);\RorRT event.value=RespBoxAppr(event);\RorRT getSubstValue.aSubsts=[];% } \def\bInitAltAppr{\ifShowAppr \def\ShowApprSAVE{true}\toAltApprCntInc\ShowApprfalse \def\eqAddAAFormat{\ifnum\eq@drivernum=0try\eqLBr\RorRT\fi \setCoreInitAltAppr\ifnum\eq@drivernum=0 \r\eqRBr catch(e){\RorRT var\eqSP\toAltApprVar=% app.setTimeOut('this.resetForm("'+event.target.name+'");% app.clearTimeOut(\toAltApprVar);',250);\r}\fi}\else \def\ShowApprSAVE{false}\fi } \def\eInitAltAppr{\@nameuse{ShowAppr\ShowApprSAVE}% \ifShowAppr\altApprOn\let\eqAddAAFormat\@empty\fi} \def\AAKqRespBoxMath{% if(event.willCommit){\r\t RecordPointValue(\eqPTs,\thequestionno\ifx\grpquestions1,% \thegrpquestionno,\grpPointValue,\grpTotalWeight,% "\grpEvalFunction"\fi);\r\t RecordProblemType("\eqQT",\thequestionno);\r\t \ifSubstVars % dps17 var\eqSP_substVars=\indepVars;\r\t var\eqSP_mathVars=processMathVars(_substVars);\r\t var\eqSP_substValue=getSubstValue(_substVars,event.value);\r\t var\eqSP_substAns=getSubstValue(_substVars,"\eqCorrectAns");\r\t var\eqSP retn=\processJSfunc(\rbArgs,% \compareJSfunc,_substValue);\r\t \else var\eqSP_mathVars=\indepVars;\r\t var\eqSP retn=\processJSfunc(\rbArgs,\compareJSfunc);\r\t \fi ProcUserResp(retn,event.value,\thequestionno,% 0\ifx\grpquestions1,\thegrpquestionno\fi);\r }\r if (!isQuizInitialized("\currQuiz")) {\r\t \eqObjAlert eqAppAlert(InitMsg("\bqlabelISO"),3);\r\t event.rc = false;\r } } \def\RespBoxMathDefaults {% \BC{0 0 0}\S{S}\textColor{0 g}\F{\FPrint}\W{1} } \def\moreRespBoxMathDefaults {% \edef\@moreRespBoxMathDefaults{% \if\eqQuizType\isQZ\ifx\eq@online\eq@YES \ifeq@noquizsolutions \else\noexpand\Ff{\FfReadOnly}\fi\fi\fi }% } \let\eqAddAAFormat\@empty \def\eqSP{\string\040} % dps17 \def\eqLBr{\string\173} \def\eqRBr{\string\175} \def\@@RespBoxMathActions{% \AA{\if\eqQuizType\isQZ \AAKeystroke{\AAKqRespBoxMath\eqAddAAKeystroke} \AAFormat{\ifShowAppr\ifSubstVars\ifarrowDelim % dps17 try{event.value=RespBoxAppr(event);}catch(e){}\r \fi\fi\fi\eqAddAAFormat} \else \AAKeystroke{if(event.willCommit) {\r\t \ifSubstVars% var\eqSP_substVars=\indepVars;\r\t var\eqSP_mathVars=processMathVars(_substVars);\r\t var\eqSP_substValue=getSubstValue(_substVars,event.value);\r\t var\eqSP_substAns=getSubstValue(_substVars,"\eqCorrectAns");\r\t var\eqSP retn=\processJSfunc(\rbArgs,% \compareJSfunc,_substValue);\r\t \else var\eqSP_mathVars=\indepVars;\r\t var\eqSP retn=\processJSfunc(\rbArgs,\compareJSfunc); \fi \if\@sqTurnOffAlerts1% OnBlurRespBox(retn,"\curr@quiz"); \fi \eqAddAAKeystroke\r }} \AAFormat{\ifShowAppr\ifSubstVars\ifarrowDelim % dps17 try{event.value=RespBoxAppr(event);}catch(e){}\r\fi\fi\fi \eqAddAAFormat}% \AAOnFocus{\JS{var retn = null;}}% \AAOnBlur{\JS{OnBlurRespBox(null,"\curr@quiz");}}% \fi } } \def\annot@subtype@rbm{rbm} \newcommand\@RespBox[1][] {% \edef\annot@subtype{\annot@subtype@rbm}% \eq@AddProbToQzQuesList \smallskip\ifx\grpquestions\eq@Zero \addtocounter{eqpointvalue}{\eqPTs}\fi \if\eqQuizType\isQZ \def\rbFlag{1}\global\IsRespBoxtrue \ifx\grpquestions\eq@One \stepcounter{grpquestionno}% \def\Fld@name{% grpobj.\curr@quiz.\thequestionno.\thegrpquestionno}% \else \eq@recordThesePTs\eq@recordProbType \edef\eqtmp{\aPointType}% \xdef\aPointType{\eqtmp,[\eqPTs,"math"]}% \stepcounter{questionno}% \def\Fld@name{obj.\curr@quiz.\thequestionno}% \fi \else % shortquiz \ifx\grpquestions\eq@One \stepcounter{grpquestionno}% \def\Fld@name{% grpobj.\oField.\thequestionno.\thegrpquestionno}% \else \stepcounter{questionno}% \def\Fld@name{% obj.\oField.\thequestionno}% \fi \fi \let\Array\aeb@array \moreRespBoxMathDefaults \leavevmode\hbox\bgroup\let\rpl\eq@rpl \text@@Field{#1}{\Fld@name}% {\RBW}{\DefaultHeightOfWidget}% {\eq@protect\AA}{\eq@setWidgetProps\eq@RespBox}% {\RespBoxMathDefaults\@moreRespBoxMathDefaults \@@RespBoxMathActions\every@eqTextField\every@RespBoxMath}% } \def\eq@RespBox#1{\pdfstringdef\eqCorrectAns{#1}% \gdef\eqCorrectAnsTeX{#1}\if\grpquestions\eq@Zero \ifwithinMCFI\gdef\s@veCorrAnsMCFI{"#1"}\fi \else \eq@recordGrpAnsArray{"#1"}\fi \@ifnextchar({\@eq@RespBox{#1}}{\@eq@RespBox{#1}(x)}} \def\@eq@RespBox#1(#2){\@ifnextchar[{\@eq@RespB@x{#1}(#2)}% {\@ifstar{\@eq@RespB@x{#1}(#2)[\curr@quiz.\thequestionno]}% {\@eq@RespB@x{#1}(#2)[]}}} \def\eq@ZERO{0} \def\defaultRDPrecision#1{\def\eq@defaultRDPrecision{#1}} \defaultRDPrecision{1E-14} \newif\ifarrowDelim\arrowDelimfalse % dps17 \def\rpl@#1#2{\rpl@i#1->\@nil} \def\rpl@i#1->#2\@nil{\def\argii{#2}\ifx\argii\@empty\else \global\arrowDelimtrue\fi} \def\GiiRpli#1{\global\arrowDelimfalse\GiiRplii#1\rpl{}{}\@nil} \def\GiiRplii#1\rpl#2#3#4\@nil{\def\argiv{#4}% \ifx\argiv\@empty\let\eq@next\relax\else \rpl@{#2}{#3}\ifarrowDelim\let\eq@next\relax\else \def\eq@next{\GiiRplii#4\@nil}\fi\fi \eq@next} \def\isAltApprSpec#1{\bgroup\if\frstIsrpl\eq@YES\GiiRpli{#1}\else \expandafter\GiiRpli\expandafter{#1}\fi\egroup} % dps17 \def\isFrstrpl#1#2\@nil{\ifx#1\rpl\let\frstIsrpl\eq@YES\else \let\frstIsrpl\eq@NO\fi} \def\cntComm@s#1{\@tempcnta\z@\expandafter\cntComm@si#1,,\@nil} \def\cntComm@si#1,#2,\@nil{\def\argii{#2}\ifx\argii\@empty \def\eq@next{\edef\nC{\the\@tempcnta}}\else \advance\@tempcnta\@ne\def\eq@next{\cntComm@si#2,\@nil}\fi \eq@next}\def\eq@SC{;}\def\rplSofT#1#2{#2} \def\cntVars#1{\let\rpl\rplSofT\edef\eV@rs{#1}\let\rpl\eq@rpl \cntComm@s{\eV@rs}\ifnum\nC>\z@ \@tempcnta\nC\relax\advance\@tempcnta\@ne \xdef\nV{\the\@tempcnta}\else\@tempcnta\z@ \expandafter\cntVarsi\eV@rs;\@nil\fi} \def\cntVarsi#1#2\@nil{\def\argii{#2}% \ifx\argii\eq@SC\def\eq@next{\advance\@tempcnta\@ne \edef\nV{\the\@tempcnta}}\else\advance\@tempcnta\@ne \def\eq@next{\cntVarsi#2\@nil}\fi \eq@next} \def\eq@X{x} \def\eq@isThereRept#1{\let\eq@isRept\eq@Zero\expandafter \eq@isThereRepti#1*\@nil} \def\eq@isThereRepti#1*#2\@nil{\def\argii{#2}\ifx\argii\@empty \let\eq@isRept\eq@Zero\else\let\eq@isRept\eq@One\fi} \def\eq@obeyReptOfIntrvls#1{% \expandafter\eq@isThereRept\expandafter{#1}% sets \eq@isRept \if\eq@isRept\eq@Zero\relax\let\eq@interv@ls\@empty\expandafter \g@addto@macro\expandafter\eq@interv@ls \expandafter{#1}\let\eq@next\relax\else\let\eq@interv@ls\@gobble \def\eq@next{\expandafter \eq@obeyReptOfIntrvlsi#1x[]x\@nil}\fi\eq@next} \def\eq@obeyReptOfIntrvlsi#1[#2]#3#4x#5\@nil{% \def\argi{#2}\def\argii{#3}\def\argiv{#5}% \ifx\argi\@empty\let\eq@next\relax\else \ifx\argii\eq@X\g@addto@macro\eq@interv@ls{x[#2]}% \def\eq@next{\eq@obeyReptOfIntrvlsi#4x#5x\@nil}\else % repetition of an interval \eq@ddtorepIntrvl{[#2]}{#4}% \def\eq@next{\eq@obeyReptOfIntrvlsi#5x\@nil}\fi \fi \eq@next } \def\eq@ddtorepIntrvl#1#2{\@tempcnta=#2 \eq@ddtorepIntrvli{#1}{#2}} \def\eq@ddtorepIntrvli#1#2{\@whilenum\@tempcnta>\z@\do {\g@addto@macro\eq@interv@ls{x#1}\advance\@tempcnta\m@ne}} \def\cntIv@ls#1{\@tempcnta\z@\expandafter\cntIv@lsi#1xxx\@nil}% \def\cntIv@lsi#1x#2x\@nil{\def\argii{#2}\ifx\argii\eq@X \advance\@tempcnta\@ne \edef\nI{\the\@tempcnta}\let\eq@next\relax\else \advance\@tempcnta\@ne\def\eq@next{\cntIv@lsi#2x\@nil}\fi \eq@next} \begingroup\@makeother\& \gdef\eq@ProcIntrvls#1{\expandafter \eq@ProcIntrvlsi#1&&\@nil} \gdef\eq@ProcIntrvlsi#1\@nil{\def\argii{#2}% \ifx\argii\@empty \eq@obeyReptOfIntrvls{#1}% \cntIv@ls{\eq@interv@ls}% \else \eq@obeyReptOfIntrvls{#1}% \edef\interv@ls{\eq@interv@ls}% \cntIv@ls{\eq@interv@ls}% \eq@obeyReptOfIntrvls{#2}% \edef\eq@interv@ls{\interv@ls&\eq@interv@ls}% \fi } \endgroup \def\@eq@RespB@x#1(#2)[#3]#4#5#6{\xdef\@qzsolndest{#3}% dps17 \gdef\indepVars{"#2"}\isFrstrpl#2\@nil\if\frstIsrpl\eq@YES \def\@IVi{#2}\else\expandafter\def\expandafter \@IVi\expandafter{#2}\fi\edef\@IVii{#2}\ifx\@IVi\@IVii \global\SubstVarsfalse\else\global\SubstVarstrue \isAltApprSpec{#2}\fi \cntVars{#2}\def\eq@precision{#5}% \ifx\eq@precision\eq@ZERO \def\eq@defaultCompare{reldiffCompare}% \def\rbArgstmp{\rbFlag,% dps17 \ifSubstVars_substAns\else"#1"\fi,#4,% \eq@defaultRDPrecision}\else \def\eq@defaultCompare{diffCompare}% \def\rbArgstmp{\rbFlag,% dps17 \ifSubstVars_substAns\else"#1"\fi,#4,#5}\fi \edef\eq@ixparam{#6}\expandafter\eq@chkivIntrvls\eq@ixparam\\% } \def\viidna{[0,1]} \def\eq@chkivIntrvls{\@ifnextchar[{\eq@chkivIntrvlsi}% {\eq@chkivIntrvlsii}} \def\eq@chkivIntrvlsi#1\\{\eq@ProcIntrvls{#1}% \def\rbArgs{\rbArgstmp,"\eq@interv@ls",_mathVars}% dps17 \@ifnextchar[{\@eq@@RespBox[ \expandafter\@gobble}% {\@eq@@RespBox[\eq@defaultCompare]}% } \def\eq@chkivIntrvlsii#1\\#2{\def\nI{1}% \def\rbArgs{\rbArgstmp,"[#1,#2]",_mathVars}% \@ifnextchar[{\@eq@@RespBox}{\@eq@@RespBox[\eq@defaultCompare]}% } \def\@eq@@RespBox[#1]{\@ifstar{\jsRespBox[#1]}% {\jsRespBox[#1]{ProcResp}}} \def\eq@ProcRespIntervals{ProcRespIntervals} \def\eq@ProcRespSetNum{ProcRespSetNum} \def\eq@ProcRespSetSym{ProcRespSetSym} \def\eq@ProcRespEvalEq{ProcRespEvalEq} \def\eq@ProcRespEvalEqNonZero{ProcRespEvalEqNonZero} \def\eq@ProcRespEvalEqList{ProcRespEvalEqList} \def\eq@ProcRespEvalEqListNonZero{ProcRespEvalEqListNonZero} \def\jsRespBox[#1]#2{\def\compareJSfunc{#1}% \def\processJSfunc{#2}\gdef\g@processJSfunc{#2}% 01/11 \ifnum\nV=\nI\relax\else \ifx\processJSfunc\eq@ProcRespSetNum\else \ifx\processJSfunc\eq@ProcRespSetSym\else \ifx\processJSfunc\eq@ProcRespEvalEq\else \ifx\processJSfunc\eq@ProcRespEvalEqNonZero\else \ifx\processJSfunc\eq@ProcRespEvalEqList\else \ifx\processJSfunc\eq@ProcRespEvalEqListNonZero\else \PackageWarning{exerquiz}{The number of variables does not match\MessageBreak the number of intervals. The problem\MessageBreak may not evaluate properly}\fi\fi\fi\fi\fi\fi\fi \ifx\eq@ProcRespIntervals\g@processJSfunc \let\@inmathwarn@SAVE\@inmathwarn\let\@inmathwarn\@gobble \pdfstringdef{\eqCorrectAns}{\eqCorrectAns}% \let\@inmathwarn\@inmathwarn@SAVE\fi \ifx\grpquestions\eq@Zero \eq@recordCorrAns{"\eqCorrectAns"}% 2018/03/18 \fi \ifeq@proofing\makebox[0pt][l]{\space\math@correctAnswer}\fi \eq@TextField % send to the driver-dependent macro \egroup % hbox \endgroup % \RespBoxMath } \def\gobbleMacro#1>{} \gdef\math@correctAnswer{\ttfamily \color{\@proofingsymbolColor}\spaceskip=2pt\xspaceskip=2pt% \expandafter\gobbleMacro\meaning\eqCorrectAnsTeX } \newcommand\RespBoxTxtNT{\def\rbFlag{0}\@RespBoxTxt} \newcommand\RespBoxTxt{\def\rbFlag{0}\@RespBoxTxt} \def\RespBoxTxtOnBlur{OnBlurRespBox(% \if\@sqTurnOffAlerts1retn\else null\fi,"\curr@quiz");} \def\eqObjAlert{% \ifx\eqQuizType\isQZ\ifx\eq@online\eq@YES\ifeq@noquizsolutions \else if (false) \fi\fi\fi} \begin{defineJS}[% \catcode`\@=0\relax\catcode`\%=14\relax]{\AAKqRespBoxTxt} if(event.willCommit){ RecordPointValue(@eqPTs,@thequestionno@ifx@grpquestions1,% @thegrpquestionno,@grpPointValue,@grpTotalWeight,% "@grpEvalFunction"@fi); RecordProblemType("@eqQT",@thequestionno); var retn = ProcRespTxt(@rbTxtAlt); ProcUserResp(retn,event.value,@thequestionno,% 0@ifx@grpquestions1,@thegrpquestionno@fi); } if (!isQuizInitialized("@currQuiz")) { @eqObjAlert@space eqAppAlert(InitMsg("@bqlabelISO"),3); event.rc = false; } \end{defineJS} \def\RespBoxTxtDefaults {% \BC{0 0 0}\W{1}\S{S}\textColor{0 g}\F{\FPrint}% } \def\moreRespBoxTxtDefaults {% \edef\@moreRespBoxTxtDefaults{% \if\eqQuizType\isQZ\ifx\eq@online\eq@YES \ifeq@noquizsolutions\else \noexpand\Ff{\FfReadOnly}\fi\fi\fi }% } \def\@@RespBoxTxtActions {% \AA{\if\eqQuizType\isQZ \AAKeystroke{\AAKqRespBoxTxt\eqAddAAKeystroke} \AAFormat{\eqAddAAFormat} \else \AAKeystroke{% if(event.willCommit) {\r\t retn = ProcRespTxt(\rbTxtAlt);\r \if\@sqTurnOffAlerts1 \t\RespBoxTxtOnBlur\r \fi \eqAddAAKeystroke\r }% } \AAFormat{\eqAddAAFormat} \AAOnFocus{\JS{var retn = null;}} \if\@sqTurnOffAlerts0 \AAOnBlur{\JS{\RespBoxTxtOnBlur}}% \fi \fi } } \def\annot@subtype@rbt{rbt} \newcommand\@RespBoxTxt[1][] {% \edef\annot@subtype{\annot@subtype@rbt}% \eq@AddProbToQzQuesList \ifx\grpquestions\eq@Zero\addtocounter{eqpointvalue}{\eqPTs}\fi \if\eqQuizType\isQZ \def\rbFlag{1}\global\IsRespBoxtrue \ifx\grpquestions\eq@One \stepcounter{grpquestionno}% \def\Fld@name{% grpobj.\curr@quiz.\thequestionno.\thegrpquestionno}% \else \eq@recordThesePTs\eq@recordProbType \edef\eqtmp{\aPointType}% \xdef\aPointType{\eqtmp,[\eqPTs,"text"]}% \stepcounter{questionno}% \def\Fld@name{obj.\curr@quiz.\thequestionno}% \fi \else \stepcounter{questionno}% \def\Fld@name{obj.\oField.\thequestionno}% \fi \moreRespBoxTxtDefaults \leavevmode\hbox\bgroup\text@@Field{#1}{\Fld@name}% {\RBW}{\DefaultHeightOfWidget}% {\eq@protect\AA}{\eq@setWidgetProps\@@RespBoxTxt}% {\RespBoxTxtDefaults\@moreRespBoxTxtDefaults \@@RespBoxTxtActions\every@eqTextField\every@RespBoxTxt}% } \def\@@RespBoxTxt#1#2{% \@ifnextchar[{\@@@RespBoxTxt{#1}{#2}} {\@ifstar{\@@@RespBoxTxt{#1}{#2}[\curr@quiz.\thequestionno]}% {\@@@RespBoxTxt{#1}{#2}[]}}} \def\eq@ZERO{0}\def\eq@ONE{1}\def\eq@TWO{2} \def\@@@RespBoxTxt#1#2[#3]#4{% \xdef\@qzsolndest{#3}% \def\eq@argi{#1}\ifx\eq@argi\eq@ZERO\else \ifx\eq@argi\eq@ONE\else\ifx\eq@argi\eq@TWO\else \def\eq@argi{-1}\fi\fi\fi \def\eq@argii{#2}\ifx\eq@argii\eq@ONE\else\def\eq@argii{0}\fi \begingroup \ifnum\eq@argii=1\relax \def\rexpStr##1{\eqbs\eqbs\eqbs\eqbs##1}% \def\\##1{\eqbs\eqbs\eqbs\eqbs##1}% \def\word##1{\\b##1\\b}\def\any{@any@}\fi \xdef\rbTxtAlt{\rbFlag,\eq@argi,\eq@argii}% \global\let\txtAltList\@empty \count0=#4 \ifnum\count0 > 0 \expandafter\@argRead\else \PackageError{exerquiz}{% The fourth required parameter of \string\RespBoxTxt\MessageBreak is required to be a positive integer. You entered\MessageBreak #4\space instead}{Enter a positive integer.}\fi } \def\@argRead#1{\xdef\jsTempArgs{\txtAltList}% \ifx\txtAltList\@empty\xdef\txtAltList{"#1"}\else \xdef\txtAltList{\jsTempArgs,"#1"}\fi\@@argRead} \def\@@argRead{\advance\count0 by-1\relax \ifnum\count0=0\relax \def\eq@next{\endgroup \xdef\rbTxtAlt{\rbTxtAlt,\txtAltList}% \if\grpquestions\eq@Zero \ifwithinMCFI \xdef\s@veCorrAnsMCFI{[\txtAltList]}\else \eq@recordCorrAns{[\txtAltList]}\fi \else \eq@recordGrpAnsArray{[\txtAltList]}% \fi \eq@@RespBoxTxt }% \else \def\eq@next{\@argRead}% \fi\eq@next } \def\eq@@RespBoxTxt{% \ifeq@proofing\makebox[0pt][l]{\space\txt@correctAnswer}\fi \eq@TextField \egroup } \def\gobbleTxt#1>#2,#3,#4,{} \gdef\txt@correctAnswer{\ttfamily\color{\@proofingsymbolColor}% \spaceskip=2pt\xspaceskip=2pt \expandafter\gobbleTxt\meaning\rbTxtAlt } \begin{defineJS}[% \catcode`\@=0\relax\catcode`\%=14\relax]{\AAKqRespBoxTxtPC} if(event.willCommit){ RecordPointValue(@eqPTs,@thequestionno@ifx@grpquestions1,% @thegrpquestionno,@grpPointValue,@grpTotalWeight,% "@grpEvalFunction"@fi); RecordProblemType("@eqQT",@thequestionno); var retn = ProcRespTxtPC(@rbTxtAlt); @ifx@grpquestions1% ProbValue[@thequestionno][3+@thegrpquestionno]% =ProcRespTxtPC.txtPCpCr;@else% ProbValue[@thequestionno]=ProcRespTxtPC.txtPCpCr;@fi ProcUserResp(retn,event.value,@thequestionno,0% @ifx@grpquestions1,@thegrpquestionno@fi); } if (!isQuizInitialized("@currQuiz")) { @eqObjAlert@space eqAppAlert(InitMsg("@bqlabelISO"),3); event.rc = false; } \end{defineJS} \def\@@RespBoxTxtPCActions {% \AA{\if\eqQuizType\isQZ \AAKeystroke{\AAKqRespBoxTxtPC} \else \AAKeystroke{% if(event.willCommit) {\r\t retn = ProcRespTxtPC(\rbTxtAlt);\r \if\@sqTurnOffAlerts1% \t\RespBoxTxtOnBlur\r \fi }% } \AAOnFocus{\JS{var retn = null;}} \if\@sqTurnOffAlerts0% \AAOnBlur{\JS{\RespBoxTxtOnBlur}}% \fi \fi } } \newcommand{\RespBoxTxtPC}{\def\rbFlag{0}\@RespBoxTxtPC} \def\annot@subtype@rbtpc{rbtpc} \newcommand\@RespBoxTxtPC[1][] {% \edef\annot@subtype{\annot@subtype@rbtpc}% \eq@AddProbToQzQuesList \smallskip\ifx\grpquestions\eq@Zero \addtocounter{eqpointvalue}{\eqPTs}\fi \if\eqQuizType\isQZ\def\rbFlag{1}\global\IsRespBoxtrue \ifx\grpquestions\eq@One \stepcounter{grpquestionno}% \def\Fld@name{% grpobj.\curr@quiz.\thequestionno.\thegrpquestionno}% \else \eq@recordThesePTs\eq@recordProbType \edef\eqtmp{\aPointType}% \xdef\aPointType{\eqtmp,[\eqPTs,"text"]}% \stepcounter{questionno}% \def\Fld@name{obj.\curr@quiz.\thequestionno}% \fi \else \stepcounter{questionno}% \def\Fld@name{obj.\oField.\thequestionno}% \fi \moreRespBoxTxtDefaults \leavevmode\hbox\bgroup\text@@Field{#1}{\Fld@name}% {\RBW}{\DefaultHeightOfWidget}% {\eq@protect\AA}{\eq@setWidgetProps\@@RespBoxTxtPC}% {\RespBoxTxtDefaults\@moreRespBoxTxtDefaults \@@RespBoxTxtPCActions\every@eqTextField\every@RespBoxTxt}% } \def\@@RespBoxTxtPC#1{\@ifnextchar[{\@@@RespBoxTxtPC{#1}} {\@ifstar{\@@@RespBoxTxtPC{#1}[\curr@quiz.\thequestionno]}% {\@@@RespBoxTxtPC{#1}[]}}} \def\@@@RespBoxTxtPC#1[#2]#3{\xdef\@qzsolndest{#2}% \begingroup \def\rexpStr##1{\eqbs\eqbs\eqbs\eqbs##1}% \def\\##1{\eqbs\eqbs\eqbs\eqbs##1}% \def\word##1{\\b##1\\b}\def\any{@any@} \gdef\rbTxtAlt{\rbFlag,#1,1}% force sub-string match \global\let\txtAltList\@empty \count0=#3 \ifnum\count0>0 \expandafter\@argReadPC\else \PackageError{exerquiz}{% The third required parameter of \string\RespBoxTxtPC\MessageBreak is required to be a positive integer. You entered\MessageBreak #3\space instead} {Enter a positive integer.}\fi } \newcommand\@argReadPC[2][0]{\xdef\jsTempArgs{\txtAltList}% \ifx\txtAltList\@empty\xdef\txtAltList{["#2",#1]}\else \xdef\txtAltList{\jsTempArgs,["#2",#1]}\fi\@@argReadPC} \def\@@argReadPC{\advance\count0 by-1\relax \ifnum\count0=0\relax \def\eq@next{\endgroup \xdef\rbTxtAlt{\rbTxtAlt,\txtAltList}% \if\grpquestions\eq@Zero \ifwithinMCFI \xdef\s@veCorrAnsFCFI{[\txtAltList]}\else \eq@recordCorrAns{[\txtAltList]}\fi \else \eq@recordGrpAnsArray{[\txtAltList]}% \fi \eq@@RespBoxTxtPC }% \else \def\eq@next{\@argReadPC}% \fi\eq@next } \def\eq@@RespBoxTxtPC{% \ifeq@proofing\makebox[0pt][l]{\space\txt@correctAnswer}\fi \eq@TextField \egroup } \def\RespBoxEssayDefaults {% \BC{0 0 0}\W{1}\S{S}\Ff{\FfMultiline}\rawPDF{}% } \def\@@RespBoxEssayActions {% \AA{\if\eqQuizType\isQZ \AAKeystroke{% if(event.willCommit){\jsR\jsT RecordPointValue(\eqPTs,\thequestionno);\jsR\jsT RecordProblemType("\eqQT",\thequestionno);\jsR\jsT }\jsR if (!isQuizInitialized("\curr@quiz")) {\jsR\jsT @eqObjAlert\space eqAppAlert(% InitMsg("\bqlabelISO"),3);\jsR\jsT event.rc = false;\jsR }% }% \fi } } \newcommand\RespBoxEssay[3][] {% \smallskip\addtocounter{eqpointvalue}{\eqPTs}% \stepcounter{questionno}% \mbox{\text@@Field{#1}{essay.\curr@quiz.\thequestionno}{#2}{#3}% \edef\eqtmp{\aPointType}\xdef\aPointType{\eqtmp,[\eqPTs,"essay"]}% {\eq@protect\AA}{\eq@setWidgetProps\@@RespBoxEssayActions \eq@TextField}{\RespBoxEssayDefaults\every@eqTextField}}% } \let\@@sqTallyBoxActions\@empty \@ifundefined{calcOrder}{% \ifpdf\def\@@sqTallyBoxActions{% \AA{\AAValidate{getTotalTally("\oField");}}}\fi}{} \def\sqTallyBoxDefaults {% \BC{0 0 0}\W{1}\textColor{1 0 0 rg}\S{I}\Q{2}\Ff{\FfReadOnly} } \ifpdf\def\@@sqTallyBoxActions{% \AA{\AAValidate{getTotalTally("\oField");}}}\else \let\@@sqTallyBoxActions\@empty \fi \newcommand\sqTallyBox[1][] {% \mbox{\text@@Field{#1}{tally.\oField.\thequestionno}% {\TBW}{\DefaultHeightOfWidget}% {}{\eq@setWidgetProps\eq@TextField}% {\sqTallyBoxDefaults\@@sqTallyBoxActions\every@eqTextField \every@sqTallyBox}}% } \def\sqTallyTotalDefaults {% \rawPDF{}\W{1}\BC{0 0 0}\S{I}\textColor{1 0 0 rg}% \Q{2}\Ff{\FfReadOnly}% } \def\@@sqTallyTotalActions {% \AA{% \AAKeystroke{AFNumber_Keystroke(0,0,0,0,"",true);} \AAFormat{AFNumber_Format(0,0,0,0,"",true);} \AACalculate{% AFSimple_Calculate("SUM",new Array("tally.\oField")); }} } \newcommand\sqTallyTotal[1][] {% \mbox{\text@@Field{#1}{tallytotal.\oField}{\TBW}% {\DefaultHeightOfWidget}{\eq@protect\AA}% {\eq@setWidgetProps\eq@TextField}% {\sqTallyTotalDefaults\@@sqTallyTotalActions\every@eqTextField \every@sqTallyTotal}}% } \def\CorrAnsButtonDefaults {% \CA{\eq@local@CorrAnsButton}\W{1}\S{S} \BC{0 0 0}\BG{.7529 .7529 .7529}\H{P} } \def\normalCABtnBC{0 0 0} \def\qCorrAnsButtonActionHook{\JS{% \ifx\@qzsolndest\@empty\else if (event.shift)\jsR\jsT this.gotoNamedDest("\@qzsolndest");\jsR else {\jsR\jsT\fi \ifShowAppr % dps17 \ifarrowDelim if (typeof event.target.appr=="undefined")\r\JST\t event.target.appr=false;\r\JST event.target.appr=!event.target.appr;\r\JST if (event.target.appr) {\r\t\JST var _substVars=\indepVars;\r\t\JST var _substAns=getSubstValue(_substVars,"\CorrectAns");\r\t\JST var value=RespBoxAppr("\CorrectAns");\r\JST } else value="\CorrectAns";\r\JST \else value="\CorrectAns";\r\JST \fi \else value="\CorrectAns";\r\JST \fi \processJSfunc("Ans.\curr@quiz",value,\currQuiz);\r \ifx\@qzsolndest\@empty\else % dps17 }\fi }} \def\sqCorrAnsButtonActionHook {% \JS{% \ifx\@qzsolndest\@empty\else if (event.shift)\jsR\jsT this.gotoNamedDest("\@qzsolndest");\jsR else\jsR\jsT \fi \processJSfunc("obj.\oField.\thequestionno","\CorrectAns",% \currQuiz); }% } \newcommand\CorrAnsButton[1][]{\eq@@CorrAnsButton{#1}} \def\eq@@CorrAnsButton#1#2{\bgroup\makeJSspecials % 1/12 \@ifstar{\eq@@@CorrAnsButton{#1}{#2}}{% \eq@@@CorrAnsButton{#1}{#2}{DisplayAnswer}}% } \def\eq@@@CorrAnsButton#1#2#3{\gdef\CorrectAns{#2}% \def\processJSfunc{#3}\ifx\@qzsolndest\@empty\let\JST\@empty\else \let\JST\jsT\fi % dps17 \ifx\eq@ProcRespIntervals\g@processJSfunc % 01/11 \let\@inmathwarn@SAVE\@inmathwarn\let\@inmathwarn\@gobble \pdfstringdef{\CorrectAns}{\CorrectAns}% \let\@inmathwarn\@inmathwarn@SAVE\fi \if\eqQuizType\isQZ\def\Fld@name{corr.\curr@quiz.\thequestionno}% \else\def\Fld@name{corr.\oField.\thequestionno}\fi \if\eqQuizType\isQZ \edef\@@CorrAnsButtonActions{\noexpand\F{\FHidden}% \ifx\@qzsolndest\@empty%\noexpand\BC{\normalCABtnBC}% \else\noexpand\BC{\solution@Color}\fi \noexpand\A{\noexpand\qCorrAnsButtonActionHook}}% \ifeq@noquizsolutions\else % dps17 (\let\rpl\eq@rpl) \mbox{\let\rpl\eq@rpl \push@@Button{#1}{\Fld@name}{}{\DefaultHeightOfWidget}% {\eq@protect\A}{\eq@setButtonProps\eq@Button@driver}% {\CorrAnsButtonDefaults\@@CorrAnsButtonActions \every@ButtonField\every@CorrAnsButton}}% \fi \else \edef\@@CorrAnsButtonActions{% \ifx\@qzsolndest\@empty%\noexpand\BC{\normalCABtnBC} \else\noexpand\BC{\solution@Color}\fi \noexpand\A{\noexpand\sqCorrAnsButtonActionHook}}% \mbox{\push@@Button{#1}{\Fld@name}{}{\DefaultHeightOfWidget}% {\eq@protect\A}{\eq@setButtonProps\eq@Button@driver}% {\CorrAnsButtonDefaults\@@CorrAnsButtonActions \every@ButtonField\every@CorrAnsButton}}% \fi \egroup } \def\sqClearButtonDefaults {% \CA{\eq@local@sqClearButton}\textColor{0 g}\F{\FPrint} \BC{0 0 0}\BG{.7529 .7529 .7529}\W{1}\S{B}\Ff{\FfNoExport} } \def\@@sqClearButtonActions {% \A{\JS{ProcessIt = false;\jsR if ( typeof \oField\space== "undefined" )\jsR\jsT \oField\space= new Object;\jsR if (typeof appAlerts["\oField"] == "undefined")\jsR\jsT appAlerts["\oField"] = new Object;\jsR this.resetForm(new Array("mc.\oField","obj.\oField",% "tally.\oField","grpobj.\oField"));\jsR var f = this.getField("obj.\oField");\jsR if ( f != null ) f.strokeColor=\ifx\defaultColorJSLoc\@empty \defaultColorJS\else\defaultColorJSLoc\fi;\jsR f = this.getField("grpobj.\oField");\jsR if ( f != null ) f.strokeColor=\ifx\defaultColorJSLoc\@empty \defaultColorJS\else\defaultColorJSLoc\fi;\jsR f = this.getField("rbmarkup.\oField");\jsR if ( f != null ) f.display=display.hidden;\jsR \oField.Grp = {};\jsR appAlerts["\oField"].bAfterValue=false;\jsR ProcessIt=true;}% } } \newcommand\sqClearButton[1][] {% \mbox{\push@@Button{#1}{clear.\oField}{}{\DefaultHeightOfWidget}% {\eq@protect\A}{\eq@setButtonProps\eq@Button@driver}% {\sqClearButtonDefaults\@@sqClearButtonActions\every@ButtonField \every@sqClearButton}}% } \def\PromptButtonDefaults {% \CA{\eq@local@CorrAnsButton}\W{1}\S{S}\BC{0 0 0} \BG{.7529 .7529 .7529}\H{P} } \newcommand{\promptButtonMsg}{% "Would you like to see the correct answer at this time? "\r\t\t + "Your current answer will be the one that will be scored. "\r\t\t + "If you click on \\"Yes\\", you will not be able to change your answer." } \newcommand{\AnsPromptBtnStr}{Answer:\space} \def\PromptButtonActionHook {% \JS{% if (!isQuizInitialized("\currQuiz")) {\r\t eqAppAlert(InitMsg("\bqlabelISO"),3);\r\t event.rc=false;\r } else {\r\t if ( !\currQuiz.oAlertCheck.bAfterValue ) {\r\t var resp=eqAppAlert({\r\t\t cMsg:\promptButtonMsg,\r\t\t nIcon: 2, nType: 2,\r\t\t cTitle: ("AcroTeX Prompt Message"),\r\t\t oCheckbox: \currQuiz.oAlertCheck\r\t });\r\t }\r if ( promptQuiz.oAlertCheck.bAfterValue || resp==4 )\r\t {\r\t\t var field=this.getField(% "obj.\currQuiz.\thequestionno");\r\t\t field.readonly=true;\r\t\t field=this.getField("Ans.\currQuiz");\r\t\t if (field!=null) field.value = "\AnsPromptBtnStr\PromptAns";\r\t }\r } }% } \newcommand\@PromptButton[2][] {% \def\PromptAns{#2}\if\eqQuizType\isQZ \def\Fld@name{promptButton.\curr@quiz.\thequestionno}% \else\def\Fld@name{promptButton.\oField.\thequestionno}\fi \if\eqQuizType\isQZ \def\@@PromptButtonActions{% \A{\PromptButtonActionHook}}% \mbox{\push@@Button{#1}{\Fld@name}{}% {\DefaultHeightOfWidget}{\eq@protect\A}% {\eq@setButtonProps\eq@Button@driver}% {\PromptButtonDefaults\@@PromptButtonActions \every@ButtonField\every@CorrAnsButton}}% \else\PackageWarning{exerquiz}{The \string\PromptButton is for quiz questions only.} \fi } \newcommand{\PromptButton}{\makebox[0pt][r] % assumes xcolor {\@PromptButton[\textColor{1 0 0 rg}]{\CorrectAns}}} \let\eq@ansGrpArray\@empty \def\eq@recordGrpAnsArray#1{% \ifx\eq@ansGrpArray\@empty \edef\tmp@exp{\noexpand\g@addto@macro \noexpand\eq@ansGrpArray{#1}}\else \edef\tmp@exp{\noexpand\g@addto@macro \noexpand\eq@ansGrpArray{,#1}}\fi \tmp@exp } \let\grpquestions\eq@Zero \def\mathGrp{\global\let\eq@ansGrpArray\@empty \@ifnextchar[{\@imathGrp}{\@imathGrp[groupEval]}} \def\@imathGrp[#1]{\def\argi{#1}% \@ifnextchar[{\@iimathGrp}{\@iimathGrp[]}} \def\@iimathGrp[#1]{\def\argii{#1}% \eq@AddProbToQzQuesList \global\let\grpquestions\eq@One \setcounter{grpquestionno}{0}% \stepcounter{questionno}% \xdef\beginGrp{\thequestionno}% \xdef\grpPointValue{\eqPTs}% \eq@recordThesePTs\eq@recordProbType \if\eqQuizType\isQZ \edef\eqtmp{\aPointType}% \xdef\aPointType{\eqtmp,[\eqPTs,"grp"]}\fi \addtocounter{eqpointvalue}{\eqPTs}% \ifx\argii\@empty \xdef\grpTotalWeight{\eqPTs}% \xdef\grpEvalFunction{\argi}% \else \xdef\grpTotalWeight{\argi}% \xdef\grpEvalFunction{\argii}% \fi } \def\endmathGrp{\global\let\grpquestions\eq@Zero \eq@recordCorrAns{[\eq@ansGrpArray]}% \xdef\endGrp{\thequestionno}} \def\CorrAnsButtonGrpDefaults {% \CA{\eq@local@CorrAnsButton}\W{1}\S{S}\BC{0 0 0} \BG{.7529 .7529 .7529}\H{P} } \def\CorrAnsButtonGrpActionHook{\JS{% \ifx\@qzsolndest\@empty\else if (event.shift)\jsR\jsT this.gotoNamedDest("\@qzsolndest");\jsR else\jsR \fi {\jsR\jsT var aCorrectAns=\CorrectAns;\jsR\jsT var beginGrp = 1;\jsR\jsT grpOffset = beginGrp;\jsR\jsT if ( \currQuiz.Grp==null ) \currQuiz.Grp = {};\jsR\jsT if (typeof \currQuiz.Grp["\thequestionno"]=="undefined")\jsR\jsT {\jsR\jsT\jsT \currQuiz.Grp["\thequestionno"] = {offset: 0};\jsR\jsT\jsT var f = this.getField(% "grpobj.\curr@quiz.\thequestionno." + grpOffset)\jsR\jsT\jsT if ( f.readonly ) {\jsR\jsT\jsT f.readonly = false;\jsR\jsT\jsT f.setFocus();\jsR\jsT\jsT eqDelay = app.setTimeOut(% "f.readonly = true; app.clearTimeOut(eqDelay);",10);\jsR\jsT } else f.setFocus();\jsR\jsT }\jsR\jsT else \jsR\jsT {\jsR\jsT\jsT \currQuiz.Grp["\thequestionno"].offset = ++\currQuiz.Grp["\thequestionno"].offset \% aCorrectAns.length;\jsR\jsT\jsT grpOffset = beginGrp + \currQuiz.Grp["\thequestionno"].offset;\jsR\jsT\jsT var f = this.getField("grpobj.\curr@quiz.\thequestionno." + grpOffset);\jsR\jsT\jsT if ( f.readonly ) {\jsR\jsT\jsT f.readonly = false;\jsR\jsT\jsT f.setFocus();\jsR\jsT\jsT eqDelay = app.setTimeOut("f.readonly = true; app.clearTimeOut(eqDelay);",10);\jsR\jsT } else f.setFocus();\jsR\jsT }\jsR\jsT \if\eqQuizType\isQZ DisplayAnswer("Ans.\curr@quiz", aCorrectAns[\currQuiz.Grp["\thequestionno"].offset],% \currQuiz); \else DisplayAnswer("grpobj.\oField.\thequestionno."+ grpOffset, aCorrectAns[\currQuiz.Grp["\thequestionno"].offset],% \oField);\jsR \fi } }} \newcommand\CorrAnsButtonGrp[2][] {% \makeStringArray{#2}% \edef\CorrectAns{\stringArray}% \if\eqQuizType\isQZ\def\Fld@name{corr.\curr@quiz.\thequestionno}% \else\edef\currQuiz{\oField}% \def\Fld@name{corr.\oField.\thequestionno}\fi \if\eqQuizType\isQZ \edef\@@CorrAnsButtonGrpActions{\noexpand\F{\FHidden}% \ifx\@qzsolndest\@empty%\noexpand\BC{\normalCABtnBC} \else\noexpand\BC{\solution@Color}\fi \noexpand\A{\noexpand\CorrAnsButtonGrpActionHook}}% \ifeq@noquizsolutions\else \mbox{\push@@Button{#1}{\Fld@name}{}{\DefaultHeightOfWidget}% {\eq@protect\A}{\eq@setButtonProps\eq@Button@driver}% {\CorrAnsButtonGrpDefaults\@@CorrAnsButtonGrpActions \every@ButtonField\every@CorrAnsButton}}% \fi \else \edef\@@CorrAnsButtonGrpActions{% \ifx\@qzsolndest\@empty%\noexpand\BC{\normalCABtnBC} \else\noexpand\BC{\solution@Color}\fi \noexpand\A{\noexpand\CorrAnsButtonGrpActionHook}}% \mbox{\push@@Button{#1}{\Fld@name}{}{\DefaultHeightOfWidget}% {\eq@protect\A}{\eq@setButtonProps\eq@Button@driver}% {\CorrAnsButtonGrpDefaults\@@CorrAnsButtonGrpActions \every@ButtonField\every@CorrAnsButton}}% \fi } \def\makeStringArray#1{\def\stringArray{[}\@makeStringArray#1,\@nil} \def\@makeStringArray#1,#2\@nil{% \edef\eq@temp{\stringArray}\def\argii{#2}% \ifx\argii\@empty \edef\stringArray{\eq@temp"#1"]}% \def\eq@next{}% \else \edef\stringArray{\eq@temp"#1",}% \def\eq@next{\@makeStringArray#2\@nil}% \fi \eq@next } \let\@eqListExp\relax \let\@currentQues\@empty \let\eqQzQuesList\@empty \def\eq@AddProbToQzQuesList{% \edef\eq@tmpExp{\noexpand\g@addto@macro% \noexpand\eqQzQuesList{% \noexpand\@eqListExp{\@currentQues}{\thepage}}}% \ifx\grpquestions\eq@Zero\eq@tmpExp\fi } \LangRedefinitions \input{aebjs.def} \inputSumryTblCode \inputMCFICode \newcommand{\solutionColor}[1]{\def\eq@argi{#1}\ifx\eq@argi\@empty \def\solution@Color{\solutionColorDef}\else \def\solution@Color{#1}\fi} \newcommand{\solutionColorDef}{0 .6 0} \solutionColor{\solutionColorDef} \@ifundefined{jsColor}{% \InputIfFileExists{eqcolor.def}{\PackageInfo{exerquiz} {Inputting eqcolor.def}} {\PackageError{exerquiz}{cannot find eqcolor.def} {Refresh your file name database and try again.}} }{} \newcommand\rghtColorJSDef{["RGB", 0, .6, 0]} \newcommand\rghtColorJS{\rghtColorJSDef} \newcommand\wrngColorJSDef{color.red} \newcommand\wrngColorJS{\wrngColorJSDef} \newcommand\partialColorJSDef{color.blue} \newcommand\partialColorJS{\partialColorJSDef} \newcommand\defaultColorJSDef{color.black} \newcommand\defaultColorJS{\defaultColorJSDef} \let\defaultColorJSLoc\@empty \let\defaultColorJSLocDef\@empty \let\rghtColorJSLoc\@empty \let\rghtColorJSLocDef\@empty \let\wrngColorJSLoc\@empty \let\wrngColorJSLocDef\@empty \let\partialColorJSLoc\@empty \let\partialColorJSLocDef\@empty \def\chooseJSsymbol{\@ifstar{\let\eq@isstar\eq@YES\chooseJSsymboli} {\let\eq@isstar\eq@NO\chooseJSsymboli}} \def\chooseJSsymboli#1{\lowercase{\edef\eq@arg{#1}}% \def\eq@carg{check}\ifx\eq@arg\eq@carg \def\eq@retnStyle{style.ch}\else \def\eq@carg{cross}\ifx\eq@arg\eq@carg \def\eq@retnStyle{style.cr}\else \def\eq@carg{diamond}\ifx\eq@arg\eq@carg \def\eq@retnStyle{style.di}\else \def\eq@carg{circle}\ifx\eq@arg\eq@carg \def\eq@retnStyle{style.ci}\else \def\eq@carg{star}\ifx\eq@arg\eq@carg \def\eq@retnStyle{style.st}\else \def\eq@carg{square}\ifx\eq@arg\eq@carg \def\eq@retnStyle{style.sq}\else \let\eq@retnStyle\@empty \ifx\eq@isstar\eq@NO\PackageWarning{exerquiz} {Argument `#1' not recognized.\MessageBreak Permissible values are check, cross, diamond,\MessageBreak circle, star, square. Will use the default}\fi \fi\fi\fi\fi\fi\fi } \newcommand\setRghtAnsSymb[1]{\chooseJSsymbol{#1}% \ifx\eq@retnStyle\@empty\else \edef\rghtAnsSymbJS{\eq@retnStyle}% \edef\rghtAnsSymb{\eq@carg}\fi} \def\rghtAnsSymbJS{style.ch} \def\rghtAnsSymb{check} \newcommand\setCorrAnsSymb[1]{\chooseJSsymbol{#1}% \ifx\eq@retnStyle\@empty\else \edef\corrAnsSymbJS{\eq@retnStyle}% \edef\corrAnsSymb{\eq@carg}\fi} \def\corrAnsSymbJS{style.ci} \def\corrAnsSymb{circle} \newcommand\setWrngAnsSymb[1]{\chooseJSsymbol{#1}% \ifx\eq@retnStyle\@empty\else \edef\wrngAnsSymbJS{\eq@retnStyle}% \edef\wrngAnsSymb{\eq@carg}\fi} \def\wrngAnsSymbJS{style.cr} \def\wrngAnsSymb{cross} \def\setRghtAnsSymbLoc#1{\chooseJSsymbol*{#1}% \ifx\eq@retnStyle\@empty \let\rghtAnsSymbJSLoc\@empty\else \edef\rghtAnsSymbJSLoc{\eq@retnStyle}\fi } \def\setCorrAnsSymbLoc#1{\chooseJSsymbol*{#1}% \ifx\eq@retnStyle\@empty \let\corrAnsSymbJSLoc\@empty\else \edef\corrAnsSymbJSLoc{\eq@retnStyle}\fi } \def\setWrngAnsSymbLoc#1{\chooseJSsymbol*{#1}% \ifx\eq@retnStyle\@empty \let\wrngAnsSymbJSLoc\@empty\else \edef\wrngAnsSymbJSLoc{\eq@retnStyle}\fi } \let\rghtAnsSymbJSLoc\@empty \let\rghtAnsSymbJSLocDef\@empty \let\corrAnsSymbJSLoc\@empty \let\corrAnsSymbJSLocDef\@empty \let\wrngAnsSymbJSLoc\@empty \let\wrngAnsSymbJSLocDef\@empty \newcommand\everyeqTextField[1]{\def\every@eqTextField{#1}} \def\every@eqTextField{} \newcommand\everyRespBoxMath[1]{\def\every@RespBoxMath{#1}} \def\every@RespBoxMath{} \newcommand\everyRespBoxTxt[1]{\def\every@RespBoxTxt{#1}} \def\every@RespBoxTxt{} \newcommand\everyrbMarkup[1]{\def\every@rbMarkup{#1}} \def\every@rbMarkup{} \newcommand\everysqTallyBox[1]{\def\every@sqTallyBox{#1}} \def\every@sqTallyBox{} \newcommand\everysqTallyTotal[1]{\def\every@sqTallyTotal{#1}} \def\every@sqTallyTotal{} \newcommand\everyScoreField[1]{\def\every@ScoreField{#1}} \def\every@ScoreField{} \newcommand\everyAnswerField[1]{\def\every@AnswerField{#1}} \def\every@AnswerField{} \newcommand\everyPointsField[1]{\def\every@PointsField{#1}} \def\every@PointsField{} \newcommand\everyPercentField[1]{\def\every@PercentField{#1}} \def\every@PercentField{} \newcommand\everyGradeField[1]{\def\every@GradeField{#1}} \def\every@GradeField{} \newcommand{\everysqRadioButton}[1]{\def\every@sqRadioButton{#1}} \def\every@sqRadioButton{} \newcommand{\everyqRadioButton}[1]{\def\every@qRadioButton{#1}} \def\every@qRadioButton{} \newcommand{\everyqckCheckBox}[1]{\def\every@qckCheckbox{#1}} \def\every@qckCheckbox{} \newcommand{\everyqCheckBox}[1]{\def\every@qCheckBox{#1}} \def\every@qCheckBox{} \newcommand{\everysqCheckBox}[1]{\def\every@sqCheckBox{#1}} \def\every@sqCheckBox{} \let\everyeqButtonField\everyButtonField \newcommand\everyCorrAnsButton[1]{\def\every@CorrAnsButton{#1}} \def\every@CorrAnsButton{} \newcommand\everysqClearButton[1]{\def\every@sqClearButton{#1}} \def\every@sqClearButton{} \newcommand\everyeqButton[1]{\def\every@eqButton{#1}} \newcommand\everyCorrButton{\everyeqButton} \def\every@eqButton{} \newcommand\everyBeginQuizButton[1]{\def\every@BeginQuizButton{#1}} \def\every@BeginQuizButton{} \newcommand\everyEndQuizButton[1]{\def\every@EndQuizButton{#1}} \def\every@EndQuizButton{} \let\everyeqGenButton\everyPushButton \let\every@eqGenButton\every@PushButton \let\eqGenButton\pushButton \newcommand\everyeqIcon[1]{\def\every@eqIcon{#1}} \def\every@eqIcon{} \def\formatInitAltApprs{\formatInitAltApprs} \def\@eqAddAAFormat#1{\def\@rgi{#1}\ifx\@rgi\formatInitAltApprs \bInitAltAppr\else\def\eqAddAAFormat{#1}\fi} \def\eqAddAAFormat{} \def\formatAsSet{try{formatAsSet()}catch(e){}} \def\formatAsVector{try{formatAsVector()}catch(e){}} \def\eq@SupActnLst{{\AddAAKeystroke}{\AddAAMouseUpMC}% {\AddAAMouseUpMS}{\AddAAFormat}} \newcommand\setActionKeys{\edef\catOfAt{\the\catcode`@}% \ifnum\catOfAt=11 \let\eq@CatTail\relax\else \makeatletter\let\eq@CatTail\makeatother\fi\setActionKeysi} \def\setActionKeysi#1{\let\eq@itsGood\eq@One \def\setActionKeys@cont{\processAppArgs#1\end\@nil}% \begingroup\eq@checkivValidKeys#1\end\ef@nil\endgroup\eq@CatTail} \def\eq@checkivValidKeys#1#2{\def\eq@GOOD{good}\expandafter \@tfor\expandafter \@ction\expandafter:\expandafter=\eq@SupActnLst\do{% \expandafter\def\@ction{good}}% \ifx\end#1% if #1=\end, #2=\ef@nil. \def\eq@next{\aftergroup\setActionKeys@cont}% \else \if\eq@itsGood\eq@One \let\itp@ss0\let\@@next\relax \expandafter\@tfor\expandafter \@ction\expandafter:\expandafter=\eq@SupActnLst\do{% \expandafter\ifx\expandafter#1\@ction \let\itp@ss\eq@One\@break@tfor \fi}% do \if\itp@ss\eq@Zero\let\eq@itsGood\eq@Zero \def\eq@next{\def\eq@lastArg{#1}\expandafter \eq@sqkErrorMsg\ef@gobbletonil}\else \let\eq@next\eq@checkivValidKeys\fi \else\let\eq@next\ef@gobbletonil\fi \fi %\ifx\end \eq@next } \def\eq@sqkErrorMsg#1{\PackageError{exerquiz}{The key \expandafter \string\eq@lastArg\space is not supported by \string\setActionKeys.\MessageBreak Remove the key or correct the spelling of the key}{}} \def\addToAction{\makeatletter\@ifstar{\let\isSt@r\eq@YES\@ddToAction} {\let\isSt@r\eq@NO\@ddToAction}} \def\@ddToAction#1#2{\let\eq@itsGood\eq@One \def\setActionKeys@cont{\@@ddToAction{#1}{#2}}\begingroup \eq@checkivValidKeys{#1}{#2}\end\ef@nil\endgroup\makeatother} \def\@@ddToAction#1#2{\@getCmdName{#1}% \if\isSt@r\eq@YES\toks2={#2}% \toks@=\aeb@exiii{\csname eq\@CmdName\endcsname}% \edef\tmp@tokshold{\the\toks2 \the\toks@}% \toks@=\expandafter{\tmp@tokshold}\else \toks@=\aeb@exiii{\csname eq\@CmdName\endcsname#2}\fi \expandafter\edef\csname eq\@CmdName\endcsname{\the\toks@}% } \def\@eqAddAAKeystroke#1{\def\argi{#1}\ifx\argi\@empty \def\eqAddAAKeystroke{}\else\def\eqAddAAKeystroke{#1}\fi} %\r \def\eqAddAAKeystroke{} \def\@eqAddAAMouseUpMC#1{\def\argi{#1}\ifx\argi\@empty \def\eqAddAAMouseUpMC{}\else\def\eqAddAAMouseUpMC{#1}\fi} \def\eqAddAAMouseUpMC{} \def\@eqAddAAMouseUpMS#1{\def\argi{#1}\ifx\argi\@empty \def\eqAddAAMouseUpMS{}\else\def\eqAddAAMouseUpMS{#1}\fi} \def\eqAddAAMouseUpMS{} \def\eqIconDefaults {% \rawPDF{}\S{}\mkIns{/TP 1}\W{} \CA{}\RC{}\AC{}\BC{}\BG{}\H{N} \textColor{0 g}\Ff{\FfReadOnly} } \newcommand\eqIcon[4][] {% \mbox{\push@@Button{#1}{#2}{#3}{#4}{}{\eq@setButtonProps \eq@Button@driver}{\eqIconDefaults\every@ButtonField \every@eqIcon}}% } \eq@restoreCats \endinput %% %% End of file `exerquiz.sty'.