% \iffalse
%<*copyright>
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Exerquiz.sty package,             2000-8-16          %%
%% Copyright (C) 1999-2004  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.      %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%</copyright>
%<package>\NeedsTeXFormat{LaTeX2e}
%<package>\ProvidesPackage{exerquiz}
%<package> [2007/05/05 v6.08 Exerquiz Exercises and Quizzes for LaTeX/PDF package (dps)]
%<*driver>
\documentclass{ltxdoc}
\usepackage[dviwindo,colorlinks,hyperindex]{hyperref}
\pdfstringdefDisableCommands{\let\\\textbackslash}
\OnlyDescription  % comment out for implementation details
\EnableCrossrefs
\CodelineIndex
\begin{document}
  \GetFileInfo{exerquiz.sty}
  \title{Exerquiz: Exercises and Quizzes for \LaTeX/PDF}
  \author{D. P. Story\\
    Email: \texttt{dpstory@uakron.edu}}
  \date{processed \today}
  \maketitle
  \tableofcontents
  \let\Email\texttt
  \DocInput{exerquiz.dtx}
  \PrintIndex
\end{document}
%</driver>
% \fi
%
% \MakeShortVerb{|}
%
% \DoNotIndex{\def,\edef,\gdef,\xdef,\global,\long,\let}
% \DoNotIndex{\expandafter,\string,\the,\ifx,\else,\fi}
% \DoNotIndex{\csname,\endcsname,\relax,\begingroup,\endgroup}
% \DoNotIndex{\DeclareTextCommand,\DeclareTextCompositeCommand}
% \DoNotIndex{\space,\@empty,\special}
%
%    \begin{macrocode}
%<*package>
%    \end{macrocode}
% \newpage
% \section{Change History}
%  \makeatletter
%  \renewenvironment{theglossary}{%
%
%    \let\efill=\relax
%    \begin{itemize}}%
%   {\end{itemize}}
%  \global\c@GlossaryColumns = 1
%  \makeatother
%  \PrintChanges
% \section{Package options and setup}\label{options}
%
% Introduce a number of useful options for \textsl{exerquiz}.
% \subsection{Options for paper, solutions, JavaScript and preview}
%    \begin{macrocode}
\IfFileExists{xcolor.sty}%
{\def\eq@ColorPackage{xcolor}\PassOptionsToPackage{table,hyperref}{xcolor}}
{\def\eq@ColorPackage{color}}
\DeclareOption{noxcolor}{\def\eq@ColorPackage{color}}
%    \end{macrocode}
%    \begin{macro}{forpaper}
%    \begin{macro}{forcolorpaper}
%    Pass the |monochrome| option to the color package
%\changes{v6.06a}{2007/04/09}
%{
%   Added  the \texttt{forcolorpaper} option for those using \textsf{exerquiz} without \textsf{web}.
%}
%    \begin{macrocode}
\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}
}
%    \end{macrocode}
%    \end{macro}
%    \end{macro}
%    \begin{macro}{preview}
% With this option, the bounding boxes of all form fields appear in the
% dvi preview. Use this option of properly positioning your fields, then
% remove this option on the final build of the document. This option is no
% appropriate for the \texttt{pdftex} option which does not have a dvi preview.
%    \begin{macrocode}
\DeclareOption{preview}{\PassOptionsToPackage{preview}{eforms}}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{nosolutions}
%    With the option, the solutions to the exercises are not
%    included in the typeset document.
%    \begin{macrocode}
\DeclareOption{nosolutions}{\eq@nosolutionstrue\eq@nolinktrue}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{noquizolutions}
% No solutions for quizzes (shortquiz and quiz environments).
%    \begin{macrocode}
\DeclareOption{noquizsolutions}{\eq@noquizsolutionstrue\eq@nolinktrue}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{online}
% An \texttt{online} options.
%    \begin{macrocode}
\DeclareOption{online}{\let\eq@online=y}
\let\eq@online=n
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{nohiddensolutions}
% Overrides any hidden solutions specified with the \texttt{exercise}
% environment.
%    \begin{macrocode}
\DeclareOption{nohiddensolutions}{\eq@globalshowsolutionstrue}
\DeclareOption{noHiddensolutions}%
    {\eq@globalshowsolutionstrue\AtBeginDocument{\def\Hidesymbol{h}}}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{solutionsafter}
%    Solutions will appear after the statement of the exercise.
%    \begin{macrocode}
\DeclareOption{solutionsafter}{\eq@solutionsaftertrue\eq@nolinktrue}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{nocorrections}
%    The code for correcting the |quiz| environment is
%    not written; this results in a smaller file.
%    \begin{macrocode}
\DeclareOption{nocorrections}{\eq@nocorrectionstrue}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{proofing}
%    An option for marking the correct answers for shortquiz and quiz
%    \begin{macrocode}
\DeclareOption{proofing}{\eq@proofingtrue}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{showgrayletters}
% When this option is in effect, capital letters in gray appear under
% the multiple choice question boxes of quizzes.
%    \begin{macrocode}
\newif\ifaebshowgrayletters\aebshowgraylettersfalse
\DeclareOption{showgrayletters}{\aebshowgrayletterstrue}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{nodljs}
%    An option for excluding all DLJS from the document. Useful with the
%    \texttt{forpaper} option, or a document destined to be printed. Pass
%    on to insdljs package.
%    \begin{macrocode}
\DeclareOption{nodljs}{\PassOptionsToPackage{nodljs}{insdljs}%
     \AtEndOfPackage{\let\importdljs=y}}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{execAfter}
% Execute any JS defined within the \texttt{execJS} environment. Works only for
% authors using Acrobat 5.0 or Acrobat Approval.
%    \begin{macrocode}
\DeclareOption{execJS}{\PassOptionsToPackage{execJS}{insdljs}}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{exercisesonly}
% If the document author wants only to create a series of exercises, no quizzes, there is no
% need for the Document-level JavaScript. So, we have a couple of convenience options.
%    \begin{macrocode}
\DeclareOption{exercisesonly}{\PassOptionsToPackage{nodljs}{insdljs}}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{debug}
%    An option for debugging JavaScript. Pass on to insdljs package.
%    \begin{macrocode}
\DeclareOption{debug}{\PassOptionsToPackage{debug}{insdljs}}
%    \end{macrocode}
%    \end{macro}
%    \subsection{Driver Options}
%     The \textsf{web} package passes these driver options to \textsf{exerquiz}.
%    These options are needed is \textsf{exerquiz} is used without
%    \textsf{web}; in this case, the options below must explicitly included.
%    \begin{macro}{dvipsone}
%    Set the driver dependent code for the |quiz| environments.
%    \begin{macrocode}
% \def\eq@drivernum{5} % 5 = no choice
\DeclareOption{dvipsone}{\def\eq@drivernum{0}%
    \PassOptionsToPackage{dvipsone}{eforms}
%    \PassOptionsToPackage{dvipsone}{insdljs}
}
\DeclareOption{dvips}{\def\eq@drivernum{0}%
    \PassOptionsToPackage{dvips}{eforms}
    \PassOptionsToPackage{dvips}{insdljs}}
\DeclareOption{pdftex}{\def\eq@drivernum{1}%
   \def\eq@driver{pdftex}%
   \PassOptionsToPackage{pdftex}{\eq@ColorPackage}
   \PassOptionsToPackage{pdftex}{eforms}
   \PassOptionsToPackage{pdftex}{insdljs}
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{dvipdfm}
%    Set the driver dependent code for the \texttt{quiz} and \texttt{quiz}
%    environments.
%    \begin{macrocode}
\DeclareOption{dvipdfm}{\def\eq@drivernum{2}%
     \def\eq@driver{dvipdfm}%
     \PassOptionsToPackage{dvipdfm}{\eq@ColorPackage}
     \PassOptionsToPackage{dvipdfm}{eforms}
     \PassOptionsToPackage{dvipdfm}{insdljs}
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{textures}
% This option, and testing are due to Ross Moore  3/6/02
%    \begin{macrocode}
\DeclareOption{textures}{\def\eq@drivernum{3}%
  \def\eq@driver{textures}%
  \PassOptionsToPackage{textures}{\eq@ColorPackage}%
  \PassOptionsToPackage{textures}{eforms}
  \PassOptionsToPackage{textures}{insdljs}%
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{dviwindo}
%    Set \cmd{\eq@noformstrue}, this inserts an \cmd{\endinput} just after
%    the end of the |exercise| environment.  No quizzes for
%    \texttt{dviwindo}.
%    \begin{macrocode}
\DeclareOption{dviwindo}{\def\eq@drivernum{4}\def\eq@driver{dviwindo}%
    \eq@noformstrue\PassOptionsToPackage{nodljs}{insdljs}}
%    \end{macrocode}
%    \end{macro}
% If no driver is passed to \textsf{exerquiz}, assume it is
% dvipsone or dvips---\textsf{hyperref} defines the specials.
% Default driver dvipsone/dvips
%    \begin{macrocode}
% \def\eq@drivernum{5}
% \def\eq@driver{dvipsone/dvips}
% \def\eq@driver{no driver specified}
%    \end{macrocode}
% \subsection{Language Options}
%    \textsf{exerquiz} uses many language dependent typeset labels
%    and JavaScript messages.  These messages are defined in the
%    English language in Section~\ref{ss:ldm}. The language options
%    defines the macro \cmd{\LangRedefinition} to input language
%    dependent redefinitions of these messages.  Initially,
%    \cmd{\LangRedefinition} is set to relax and no redefinition files
%    are input.
%    \begin{macrocode}
\let\LangRedefinitions=\relax
%    \end{macrocode}
%    \begin{macro}{french}
%    Translations due to Jean-Michel SARLAT.
%    \begin{macrocode}
\DeclareOption{french}{%
   \def\LangRedefinitions{\InputIfFileExists{eqfr.def}%
     {\typeout{exerquiz: Inputting French Option}}%
     {\typeout{exerquiz: French Option: Cannot find the file eqfr.def,
      using the default, English.}}}}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{german}
%    Translation due to Michael Wiedmann.
%    \begin{macrocode}
\DeclareOption{german}{%
   \def\LangRedefinitions{\InputIfFileExists{eqde.def}%
   {\typeout{exerquiz: Inputting German Option}}%
   {\typeout{exerquiz: German Option: Kann die Datei eqde.def
     nicht finden, benutze Default, Englisch.}}}}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{norsk}
%    Translation due to Hans Fredrik Nordhaug.
%    \begin{macrocode}
\DeclareOption{norsk}{%
   \def\LangRedefinitions{\InputIfFileExists{eqno.def}%
   {\typeout{exerquiz: Inputting Norsk Option}}%
   {\typeout{exerquiz: Norsk Option: Cannot find the file eqno.def,
   using the default, English.}}}}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{dutch}
%    Translation due to Henny Wilbrink
%    \begin{macrocode}
\DeclareOption{dutch}{%
   \def\LangRedefinitions{\InputIfFileExists{eqnl.def}%
   {\typeout{exerquiz: Inputting Dutch Option}}%
   {\typeout{exerquiz: Dutch Option: Kan bestand eqnl.def niet vinden,
   gebruik default, Engels.}}}}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{spanish}
%    Translation due to Pedro Luis Luque
%    \begin{macrocode}
\DeclareOption{spanish}{%
   \def\LangRedefinitions{\InputIfFileExists{eqes.def}%
   {\typeout{exerquiz: Inputting Spanish Option}}%
   {\typeout{exerquiz: Spanish Option: Opci\'on Espa\~nola: no puede
    encontrar el fichero eqes.def, usar\'a por defecto, English.}}}}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{italian}
%    Translation due to PierLuigi Zezza
%    \begin{macrocode}
\DeclareOption{italian}{%
   \def\LangRedefinitions{\InputIfFileExists{eqit.def}%
   {\typeout{exerquiz: Opzione Lingua Italiana}}%
   {\typeout{exerquiz, Opzione Italiano: Non trovo il file eqit.def,
    utilizzo  quello di default, English.}}}}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{russian}
%    Translation due to Sergei V. Znamenskii
%    \begin{macrocode}
\DeclareOption{russian}{%
   \def\LangRedefinitions{\InputIfFileExists{eqru.def}%
   {\typeout{exerquiz: Inputting Russian Option}}%
   {\typeout{exerquiz: Russian Option: Cannot find the file  eqru.def,
   using the default, English.}}}}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{dansk}
%    Translation due to Erik Leimand
%    \begin{macrocode}
\DeclareOption{dansk}{%
   \def\LangRedefinitions{\InputIfFileExists{eqda.def}%
   {\typeout{exerquiz: Inputting Dansk Option}}%
   {\typeout{exerquiz: Dansk Option: Cannot find the file eqda.def,
   using the default, English.}}}}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{polish}
%    Translation due to Jerzy Mycielski
%    \begin{macrocode}
\DeclareOption{polish}{%
   \def\LangRedefinitions{\InputIfFileExists{eqpo.def}%
   {\typeout{exerquiz: Inputting Polish Option}}%
   {\typeout{exerquiz: Polish Option: Cannot find the file
    eqpo.def, using the default, English.}}}}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{finnish}
% Translation due to Paivi Porras
%    \begin{macrocode}
\DeclareOption{finnish}{%
   \def\LangRedefinitions{\InputIfFileExists{eqfin.def}%
   {\typeout{exerquiz: Inputting Finnish Option}}%
   {\typeout{exerquiz: Finnish Option: Cannot find the file eqfin.def,
   using the default, English.}}}}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{catalan}
% Translation due to Ramon Ballester
%    \begin{macrocode}
\DeclareOption{catalan}{%
   \def\LangRedefinitions{\InputIfFileExists{eqcat.def}%
   {\typeout{exerquiz: Inputting Catalan Option}}%
   {\typeout{exerquiz: Catalan Option: Cannot find the file eqcat.def,
   using the default, English.}}}}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{czech}
% Translation due to Robert Marik
%    \begin{macrocode}
\DeclareOption{czech}{%
   \def\LangRedefinitions{\InputIfFileExists{eqcz.def}%
   {\typeout{exerquiz: Inputting Czech Option}}%
   {\typeout{exerquiz: Czech Option: Cannot find the file eqcz.def,
   using the default, English.}}}}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{brazil}
%    Translation due to Koichi Sameshima
%    \begin{macrocode}
\DeclareOption{brazil}{%
   \def\LangRedefinitions{\InputIfFileExists{eqbr.def}%
   {\typeout{exerquiz: Inputting Brazilian Portuguese Option}}%
   {\typeout{exerquiz: Portuguese Option: Opc\~ao Portugu\^es: n\~ao foi poss\'ivel
    encontrar o arquivo eqbr.def, usaremos o padr\~ao, English.}}}}
%    \end{macrocode}
%    \end{macro}
%    \begin{macrocode}
\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
    *************************************************}{}%
    }%
}{}
%    \end{macrocode}
% \subsection{Switches}
%    Boolean switches used by the declared options.
%    \begin{macrocode}
%\newif\ifpreview \previewfalse
\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
\newif\ifeqforpaper \eqforpaperfalse
%</package>
%<*package|eqexam>
%\newif\ifeqforpaper \eqforpaperfalse
\newif\ifeq@noforms \eq@noformsfalse
%\newif\ifeq@nosolutions \eq@nosolutionsfalse
\newif\ifeq@noquizsolutions \eq@noquizsolutionsfalse % dps new
%\newif\ifeq@solutionsafter \eq@solutionsafterfalse
\newif\ifeq@nocorrections \eq@nocorrectionsfalse
%\newif\ifeq@proofing \eq@proofingfalse
\newif\ifeq@nolink \eq@nolinkfalse
%\newif\ifeq@globalshowsolutions \eq@globalshowsolutionsfalse
%\newif\ifeq@hidesolution \eq@hidesolutionfalse
\def\eq@ckglobalhide{\ifeq@globalshowsolutions\eq@hidesolutionfalse\fi}
\def\hidesymbol{h}\def\Hidesymbol{H}
%    \end{macrocode}
% When the first solution is written, \cs{therearesolutions} is
% made true.  When the solutions are input back into the file, and
% this switch is still false, then no exercise header is typeset;
% this avoids an empty exercise section with only the header.
%    \begin{macrocode}
\newif\iftherearesolutions \therearesolutionsfalse
%    \end{macrocode}
%    \begin{macro}{\SolutionsAfter}
%    \begin{macro}{\SolutionsAtEnd}
% Some macros to turn \cs{eq@solutionsafter} on or off
%    \begin{macrocode}
\def\SolutionsAfter{\eq@solutionsaftertrue\eq@nolinktrue}
\def\SolutionsAtEnd{\eq@solutionsafterfalse\eq@nolinkfalse}
\def\NoSpaceToWork{\let\eq@insertverticalspace=n}
\def\SpaceToWork{\let\eq@insertverticalspace=y}
\SpaceToWork
%</package|eqexam>
%<*package>
%    \end{macrocode}
%    \end{macro}
%    \end{macro}
%    \begin{macro}{\CorrectionsOn}
%    \begin{macro}{\CorrectionsOff}
%    Use these macros to locally turn on or off the inclusion
%    of the correction code.
%    \begin{macrocode}
\def\CorrectionsOn{\global\eq@nocorrectionsfalse}
\def\CorrectionsOff{\global\eq@nocorrectionstrue}
%    \end{macrocode}
%    \end{macro}
%    \end{macro}
%    \subsection{Process Options and Require Packages}
% The \texttt{quiz} environments use Acrobat forms and JavaScript
% so we need to load in the AcroForm Dictionary---unless the
% \texttt{dviwindo} (\cmd{\eq@noformstrue}) option is requested.
%    \begin{macrocode}
\AtBeginDocument{\ifeq@noforms\else\begin{Form}\fi}
\AtEndDocument
{%
    \include@solutions
    \ifeq@noforms\else
        \include@quizsolutions
    \fi
    \end{Form}
%    \end{macrocode}
% (04/12/07) I put a \cs{clearpage} for some good reason, can't remember, I think
% it had to do with templates, but dvipdfm has problems with this. The document
% level JavaScript are not inserted, they are cleared out by the \cs{clearpage}.
% So, we'll only to a \cs{clearpage} if the driver is not dvipdfm.
%    \begin{macrocode}
    \if\eq@drivernum2\else\clearpage\fi
}
%    \end{macrocode}
% \subsection{Load Configuration File: exerquiz.cfg}
% Look for configuration file, exerquiz.cfg.
%\begin{verbatim}
%    \ExecuteOptions{noquizsolutions,nocorrections}
%\end{verbatim}
% sets several options.
%    \begin{macrocode}
\InputIfFileExists{exerquiz.cfg}{}{}
%    \end{macrocode}
%    \begin{macrocode}
\ProcessOptions
%\def\eq@xcolor{xcolor}\ifx\eq@ColorPackage\eq@xcolor
%\def\eq@coloropts{hyperref,table}\else\def\eq@coloropts{}\fi
%\RequirePackage[\eq@coloropts]{\eq@ColorPackage}
\RequirePackage{\eq@ColorPackage}
%\RequirePackage{color}
\RequirePackage{verbatim}
\RequirePackage{hyperref}
\RequirePackage{insdljs}
\RequirePackage{eforms}
%    \end{macrocode}
%    \begin{macrocode}
\@ifundefined{eq@drivernum}{%
    \PackageError{Exerquiz}%
        {You  have not specified dvips, dvipsone, pdftex or dvipdfm
        \MessageBreak in the option list of the exerquiz package}
        {Place one of the driver names dvips, dvipsone, pdftex or dvipdfm
        \MessageBreak in the option list of the exerquiz package.}
}{}
%    \end{macrocode}
%    \begin{macrocode}
%</package>
%    \end{macrocode}
% \subsection{The Template \& Language dependent messages}\label{ss:ldm}
% The following define labels and messages for the exercise and
% various quiz environments. They are all redefined when a
% language option is used.  All of them can be redefined to
% customize a users document.
%
% In attempt to better manage the language localizations, I've placed the
% template for Web and Exerquiz in the Exerquiz.dtx file.
%    \begin{macrocode}
%<template>
%<template>%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%<template>%% Web.sty                                            %%
%<template>%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%<template>% Language dependent definitions for Web.sty
%<*template>
\DeclareOption{newlanguage}{%
  \AtEndOfPackage{%
    \def\today{\ifcase\month\or January
            \or February \or March \or April
            \or May \or June  \or July  \or August
            \or September  \or October  \or November
            \or December \fi \the\day,  \the\year}
    \def\web@versionlabel{Version}
    \def\web@toc{Table of Contents}
    \def\web@continued{cont.}
    \def\web@article{Begin \hyperlink{section.1}{Article}}
    \def\web@directory{Directory}
    \def\web@revision{Last Revision Date:}
    \def\web@copyright{Copyright}
    \def\web@section{Section}
    % Label Navibar
    \def\web@back{Back}
    \def\web@doc{Doc}} % restricted to three characters
    \PassOptionsToPackage{newlanguage}{exerquiz}
}
%</template>
%    \end{macrocode}
%    \begin{macrocode}
%<template>%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%<template>%% Exerquiz.sty                                       %%
%<template>%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%<template>\DeclareOption{newlanguage}{%
%<template>   \def\LangRedefinitions{\InputIfFileExists{eqlang.def}%
%<template>   {\typeout{exerquiz: Inputting a New Language Option}}%
%<template>   {\typeout{exerquiz: Language Option: Cannot find the file
%<template>    eqpo.def, using the default, English.}}}}
%<template>
%<package>\def\eqretnSymb{$\blacksquare$}%{\rule{6bp}{6.8bp}}
% The exercise label
%<package>\newcommand\exlabel{Exercise}
%<package>\newcommand\exlabelsol{\exlabel}
%<template>% The exercise label
%<template>% Accents: \renewcommand\exlabel{\"Ubung} (German)
%<template>\renewcommand\exlabel{Exercise}
%<template>% The value of this macro is written to \jobname.sol,
%<template>% accented characters must be protected with a \noexpand
%<template>% E.g., \renewcommand\exlabelsol{\noexpand\"Ubung} (German)
%<template>\renewcommand\exlabelsol{\exlabel}
%    \end{macrocode}
%    \begin{macrocode}
% Title of exercise solution section
%<package>\newcommand\exsectitle{Solutions to \exlabel s}
%<package>\newcommand\exsecrunhead{\exsectitle} %% change to @ form
%<template>
%<template>% Title of exercise solution section
%<template>% E.g.: \renewcommand\exsectitle
%<template>%            {L\"osungen der \exlabel en} (German)
%<template>\renewcommand\exsectitle{Solutions to \exlabel s}
%<template>\renewcommand\exsecrunhead{\exsectitle} %% change to @ form
%    \end{macrocode}
%    \begin{macrocode}
%<*package|eqexam>
%    \end{macrocode}
%    \begin{macro}{\exsolafter}
%    \begin{macro}{\exsolafterDefault}
%    \begin{macro}{\renameSolnAfterTo}
%    \begin{macro}{\resetSolnAfterToDefault}
%\changes{v6.05g}{2007/01/28}
%{
% Added to commands for use in exerquiz or in eqexam. They are
% \cs{renameSolnAfterTo} for conveniently changing the solution
% after label, and \cs{resetSolnAfterToDefault} for resetting
% back to the default.
%}
% Solution label for solutionafter option for exercise
%    \begin{macrocode}
\newcommand{\exsolafter}{\eq@exsolafterDefault}
\newcommand{\eq@exsolafterDefault}{\textit{Solution}:}
\newcommand{\renameSolnAfterTo}[1]{\def\exsolafter{#1}}
\newcommand{\resetSolnAfterToDefault}{\def\exsolafter{\eq@exsolafterDefault}}
%    \end{macrocode}
%    \end{macro}
%    \end{macro}
%    \end{macro}
%    \end{macro}
%    \begin{macrocode}
%</package|eqexam>
%<template>
%<template>% Solution label for solutionafter option for exercise
%<template>\renewcommand\exsolafter{\textit{Solution}:}
%    \end{macrocode}
%    \begin{macrocode}
% Title of quiz solution section
%<package>\newcommand\eq@sqslsectitle{Solutions to Quizzes}
%<package>\newcommand\sqslsectitle{\eq@sqslsectitle}
%<template>
%<template>% Title of short quiz solution section
%<template>% Example: \renewcommand\eq@sqslsectitle
%<template>%               {L\"osungen der Aufgaben} (German)
%<template>\renewcommand\eq@sqslsectitle{Solutions to Quizzes}
%<template>\renewcommand\sqslsectitle{\eq@sqslsectitle}
%    \end{macrocode}
%    \begin{macrocode}
% Running header/section title for solutions to short quizzes
%<package>\newcommand\eq@sqslsecrunhead{Solutions to Quizzes}
% User access
%<package>\newcommand\sqslsecrunhead{\eq@sqslsecrunhead}
%<template>
%<template>% Running header/section title for solutions to short quizzes
%<template>\renewcommand\eq@sqslsecrunhead{Solutions to Quizzes}
%<template>% User access
%<template>\renewcommand\sqslsecrunhead{\eq@sqslsecrunhead}
%    \end{macrocode}
%    \begin{macrocode}
% Label for solutions to quizzes, appears in solutions sections
%<package>\newcommand\eq@sqsllabel{\string\textbf{Solution to Quiz:}}
% User access
%<package>\newcommand\sqsllabel{\eq@sqsllabel}
%<template>
%<template>% Label for solutions to short quizzes, appears
%<template>% in solutions sections
%<template>% Protect accents with \noexpand
%<template>% E.g.: \renewcommand\eq@sqsllabel
%<template>%       {\string\textbf{L\noexpand\"osung zu Aufgabe:}} (German)
%<template>\renewcommand\eq@sqsllabel{\string\textbf{Solution to Quiz:}}
%<template>% User access
%<template>\renewcommand\sqsllabel{\eq@sqsllabel}
%    \end{macrocode}
%    \begin{macrocode}
% Solution label for solutionafter option for shortquiz
%<package>\newcommand\sqsolafter{\textit{Solution}:}
%<template>
%<template>% Solution label for solutionafter option for shortquiz
%<template>\renewcommand\sqsolafter{\textit{Solution}:}
%    \end{macrocode}
%    \begin{macrocode}
% Here is the default short quiz label.
%<package>\newcommand\eq@sqlabel{\textcolor{red}{Quiz}}
% User access to shortquiz label
%<package>\newcommand\sqlabel{\eq@sqlabel}
%<template>
%<template>% Here is the default short quiz label.
%<template>\renewcommand\eq@sqlabel{\textcolor{red}{Quiz.}}
%<template>% User access to shortquiz label
%<template>\renewcommand\sqlabel{\eq@sqlabel}
%    \end{macrocode}
%    \begin{macrocode}
% Here is the default short quiz return label
% No formatting allowed
%<package>\newcommand\eq@sqslrtnlabel
%<package>   {\ifeq@solutionsafter\else\expandafter\string\fi\eqretnSymb}
% User access to shortquiz label
%<package>\newcommand\sqslrtnlabel{\eq@sqslrtnlabel}
%<template>
%<template>% Here is the default short quiz return label
%<template>% No formatting allowed
%<template>\renewcommand\eq@sqslrtnlabel{End Quiz}
%<template>% User access to shortquiz label
%<template>\renewcommand\sqslrtnlabel{\eq@sqslrtnlabel}
%    \end{macrocode}
%    \begin{macrocode}
% Short quiz feedback messages
%<package>\newcommand\eqsqrtmsg{"Right!"}
%<package>\newcommand\eqsqwgmsg{"Wrong!"}
%<template>
%<template>% Short quiz feedback messages
%<template>\renewcommand\eq@sqrtmsg{"Right!"}
%<template>\renewcommand\eq@sqwgmsg{"Wrong!"}
%    \end{macrocode}
%    \begin{macrocode}
% Here is the default quiz label.
%<package>\newcommand\eq@bqlabel{Begin Quiz}
% User access to quiz label
%<package>\newcommand\bqlabel{\eq@bqlabel}
% Used for writing JavaScript Messages on screen
%<package>\newcommand\eq@bqlabelISO{\eq@bqlabel}
%<package>\newcommand\bqlabelISO{\eq@bqlabelISO}
%<template>
%<template>% Here is the default quiz label.
%<template>% No formatting allowed
%<template>% For Example: \renewcommand\eq@bqlabel{D\'ebut}  (French)
%<template>\renewcommand\eq@bqlabel{Begin Quiz}
%<template>% User access to shortquiz label
%<template>\renewcommand\bqlabel{\eq@bqlabel}
%<template>% Used for writing JavaScript Messages on screen.
%<template>% Use PDFDocEncoding
%<template>% For Example:
%<template>% \renewcommand\eq@bqlabelISO{D\string\351but}  (French)
%<template>% Use \string not \noexpand, this helps out
%<template>% TeX4ht by Eitan Gurari.
%<template>\renewcommand\eq@bqlabelISO{\eq@bqlabel}
%<template>\renewcommand\bqlabelISO{\eq@bqlabel}
%    \end{macrocode}
%    \begin{macrocode}
% Here is the default quiz label.
% No formatting allowed
%<package>\newcommand\eq@eqlabel{End Quiz}
% User access to shortquiz label
%<package>\newcommand\eqlabel{\eq@eqlabel}
%<template>
%<template>% Here is the default quiz label.
%<template>% No formatting allowed
%<template>\renewcommand\eq@eqlabel{End Quiz}
%<template>% User access to shortquiz label
%<template>\renewcommand\eqlabel{\eq@eqlabel}
%    \end{macrocode}
%    \begin{macrocode}
% JavaScript Messages for Quiz Environments
%<package>\newcommand\eq@Score{Score:}\newcommand\eq@OutOf{out of}
%<package>\newcommand\eqScore{\eq@Score}\newcommand\eqOutOf{\eq@OutOf}
%<template>
%<template>% JavaScript Messages for Quiz Environments. Use PDFDocEncoding
%<template>% Note: Use  \string rather than \noexpand for escape codes,
%<template>% i.e. \string\374
%<template>%
%<template>% In the Text Field showing the score, there is the default
%<template>% phrase in English
%<template>% Score: 2 out of 3, the word "Score" and "out of" needs
%<template>% translation.
%<template>\renewcommand\eq@Score{Score:}\renewcommand\eq@OutOf{out of}
%    \end{macrocode}
%    \begin{macrocode}
%<package>\newcommand\eqInitQuizMsg{%
%<package>  "You must initialize the Quiz! Click on "+msg+"."}
%<template>
%<template>% If you are taking a quiz and click on an alternative without
%<template>% initializing the quiz
%<template>% first, this message appears.
%<template>% This string is placed in the DLJS, so the escape sequences
%<template>% need to be protected more. Instead of \string\340 we need
%<template>% \string\\340.
%<template>% Example: \renewcommand\eqInitQuizMsg{%    (German)
%<template>%   "Sie m\string\\374ssen die Aufgaben initialisieren!
%<template>%    Bitte klicken Sie auf "+msg+"."}
%<template>\renewcommand\eqInitQuizMsg{%
%<template>  "You must initialize the Quiz! Click on "+msg+"."}
%    \end{macrocode}
%    \begin{macrocode}
%<package>\newcommand\eqQuizTotalMsg{%
%<package>  "\eqScore\space"+Score+" \eqOutOf\space"+nQuestions}
%<package>\newcommand\eqQuizPointsMsg{%
%<package>  "\eqScore\space"+ptScore+" \eqOutOf\space"+nPointTotal}
%<package>\newcommand\eqQuizPercentMsg{pcScore+"\%"}
%<package>\newcommand\eqQuizGradeMsg{quizGrade}
%<template>
%<template>% This macro doesn't usually need translation, it uses \eqScore
%<template>% and \eqOutOf. However, if the sentence "Score: 2 out of 3"
%<template>% does not translate conveniently into a particular language,
%<template>% this macro may have to be modified.  It's the one that puts
%<template>% the message in the message box.
%<template>\renewcommand\eqQuizTotalMsg
%<template>% {"\eqScore\space"+Score+" \eqOutOf\space"+nQuestions}
%<template>\renewcommand\eqQuizPointsMsg{%
%<template>  "\eqScore\space"+ptScore+" \eqOutOf\space"+nPointTotal}
%<template>\renewcommand\eqQuizPercentMsg{pcScore+"\%"}
%<template>\renewcommand\eqQuizGradeMsg{quizGrade}
%    \end{macrocode}
%    \begin{macrocode}
%<package>\newcommand\eqMadeChoice{%
%<package>  "You have already made a choice.
%<package>   Your choice was ("+Responses[probno]+").
%<package>   Do you want to change it?"}
%<template>
%<template>% In the link form of a quiz, of you change your choice,
%<template>% this message appears. This string is placed in the
%<template>% DLJS, so the escape sequences need to be protected more.
%<template>% Instead of \string\340 we need \string\\340.
%<template>% For Example: \renewcommand\eqMadeChoice{%
%<template>% "Vous avez d\string\\351j\string\\340 fait un choix,
%<template>%   ce choix est ("+Responses[probno]+").
%<template>%   Souhaitez vous le modifier ?"}  (French)
%<template>\renewcommand\eqMadeChoice{%
%<template>  "You have already made a choice.
%<template>   Your choice was ("+Responses[probno]+").
%<template>   Do you want to change it?"}
%    \end{macrocode}
% Default language phrases used by \cmd{\eqButton}. These are overwritten by the
% language options.
%    \begin{macrocode}
%<package>\newcommand\eq@local@CA{Correct}
%<package>\newcommand\eq@local@RC{My Answers!}
%<package>\newcommand\eq@local@AC{Please!}
%<template>% Default button labels for \eqButton
%<template>% Accents are handled as above:
%<template>% A French Language Example
%<template>% \renewcommand\eq@local@CA{R\string\351ponses}
%<template>% \renewcommand\eq@local@RC{Correctes}
%<template>% \renewcommand\eq@local@AC{SVP !}
%<template>\renewcommand\eq@local@CA{Correct}
%<template>\renewcommand\eq@local@RC{My Answers!}
%<template>\renewcommand\eq@local@AC{Please!}
%    \end{macrocode}
% Default language phrases used by \cmd{\CorrAnsButton}. These are overwritten by the
% language options.
%    \begin{macrocode}
%<package>\newcommand\eq@local@CorrAnsButton{Ans}
%<template>
%<template>% Default button label of \CorrAnsButton.
%<template>\renewcommand\eq@local@CorrAnsButton{Ans}
%    \end{macrocode}
% The following are (error) messages generated from the math fill-in questions.
%    \begin{macrocode}
%<*package>
\newcommand\eqerrABS{"Absolute values not balanced. Please correct."}
\newcommand\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."}
%</package>
%<template>
%<template>% These (error) messages are generated when the user enters an
%<template>% invalid math expression into a math fill-in response box.
%<template>% The messages come in the form of an app.alert() so
%<template>% PDFDocEncoding needs to be used.
%<*template>
\renewcommand\eqerrABS{"Absolute values not balanced. Please correct."}
\renewcommand\eqerrBadMathFunc{"The expression `"+aF[i]+"' is neither
    a defined " +"function, nor a valid math expression."}
\renewcommand\eqParens{"Parentheses"}
\renewcommand\eqBrackets{"Brackets"}
\renewcommand\eqBraces{"Braces"}
\renewcommand\eqerrDelimNotBal{aGroup[i][2] + " not balanced.
    Please correct."}
\renewcommand\eqerrBadExp{"Invalid mathematical expression.
    A problem with one of the exponents. Please correct."}
\renewcommand\eqerrUnfinishQuiz{"There is an unfinished quiz,
    please finish before moving on to another."}
\renewcommand\noPeekMsg{"Viewing Solutions to quizzes is not allowed
    until you take or finish this quiz!"}
\renewcommand\highThresholdMsg{"You are required to respond to all
    questions before the quiz is evaluated."}
\renewcommand\eqSyntaxErrorUndefVar{"Syntax Error: Possibly an
    undefined variable present."}
%</template>
%<*template>
%%%%%%%%%%%%%%%%%%%%%% End Message Section %%%%%%%%%%%%%
%% Some typeout messages                              %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% In exerquiz.sty
\typeout{Inputting French Option}
\typeout{French Option: Cannot find the file eqfr.def, using the
    default, English.}
\typeout{Solutions not allowed with this option}
\typeout{Check: `#1' is not an acceptable option, inserting
    default, `check'.}
%</template>
%    \end{macrocode}
%
% Announce driver option
%    \begin{macrocode}
%<*package>
\typeout{^^Jexerquiz: * Using \eq@driver\space option *^^J}
%    \end{macrocode}
%    \subsection{Handles, counters and such}
% Handles to write solutions to quizzes and exercises to a file.
%    \begin{macrocode}
%</package>
%<*package|eqexam>
\newwrite \ex@solns \immediate\openout \ex@solns \jobname.sol
\newwrite \quiz@solns \immediate\openout \quiz@solns \jobname.qsl
%    \end{macrocode}
% Counters to keep track of exercise questions.
%    \begin{macrocode}
\newcounter{eqexno} \setcounter{eqexno}{0}
\newcounter{@exno} \setcounter{@exno}{0}  % running exno
%    \end{macrocode}
% Counter to keep track of quiz questions.
%    \begin{macrocode}
\newcounter{quizno} \setcounter{quizno}{0}
\renewcommand\thequizno{\alph{quizno}}
%</package|eqexam>
%<*package>
\renewcommand\theHquizno{\curr@quiz.\theeqquestionnoi.\alph{quizno}}
%</package>
%<*package|eqexam>
%    \end{macrocode}
% Keep track of point values of quizzes
%    \begin{macrocode}
\newcounter{eqpointvalue} \setcounter{eqpointvalue}{0}
%    \end{macrocode}
% Some scratch registers and boxes.
%    \begin{macrocode}
%\newsavebox{\eq@tmpbox} % defined in eqforms
%\newdimen\eq@tmpdima    % defined in eqforms
\newlength\eq@tmplength
%    \end{macrocode}
%    \begin{macro}{eqquestionno}
% The counter that keeps track of the question number. Used by the \texttt{questions }[environment
%    \begin{macrocode}
\newcounter{eqquestionnoi}
\newcounter{eqquestionnoii}
\newcounter{eqquestionnoiii}
\newcount\@eqquestiondepth \@eqquestiondepth=0
\newcounter{questionno}
%</package|eqexam>
%<*package>
\newcounter{grpquestionno}
%</package>
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{partno}
%    This counter keeps track of the parts of an exercise, when the *-option
%    is used.
%    \begin{macrocode}
%<*package|eqexam>
\newcounter{partno}
\renewcommand\thepartno{\alph{partno}}
%\newcounter{list@partno}
%\renewcommand\thelist@partno{\alph{list@partno}}
%    \end{macrocode}
%    \end{macro}
%    \subsection{Write to a file}
% We must have a way to write the solutions of our exercises and
% quizzes to a file.  The following \cmd{\verbatimwrite} was
% taken from the \texttt{moreverb} package, it uses the
% \texttt{verbatim} package.
%
%    \begin{macrocode}
\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}
%    \end{macrocode}
%    \section{The \texttt{exercise} Environment}
%
% We use \cmd{\raggedright} within a \texttt{tabular} environment,
% so we must use a little trick, illustrated in the \textsl{\LaTeX\
% Companion} by M. Goossens et al. This macro is used with \texttt{exercise}
% with parts, \texttt{shortquiz} and \texttt{quiz} environments.
%    \begin{macrocode}
\providecommand\PBS[1]{\let\temp=\\#1\let\\=\temp}
%\newcommand\PBS[1]{\let\temp=\\#1\let\\=\temp}
%</package|eqexam>
%<*package>
%    \end{macrocode}
% Define some formatting commands.  These can all be redefined to
% customize the document.
%    \begin{macro}{\exlabelformat}
%    This is the formatted label for the exercise environment.
%    \begin{macrocode}
\newcommand\exlabelformat{{\scshape\exlabel\ \theeqexno.}}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\exlabelformatwp}
%    This is the formatted label for the exercise environment with parts.
%    When an exercises has parts, the word `Exercise' is not a link,
%    so we color this word for emphasis.
%    \begin{macrocode}
\newcommand\exlabelformatwp{{\scshape\exlabel\ \theeqexno.}}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\exsllabelformat}
%    This is the formatted solution label.
%    \begin{macrocode}
\newcommand\exsllabelformat{\noexpand\textbf{\exlabelsol\ \theeqexno.}}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\exsllabelformatwp}
%    This is the formatted solution when the *-options is use, that is,
%    when there are multiple parts to the question.
%    \begin{macrocode}
\newcommand\exsllabelformatwp
     {\noexpand\textbf{\exlabelsol\ \theeqexno(\thepartno)}}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\exrtnlabelformat}
%    This is the formatted return label (return from the solution).
%    \begin{macrocode}
\newcommand\exrtnlabelformat{\exlabelsol\ \theeqexno}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\exrtnlabelformat}
%    This is the formatted return label (return from the solution),
%    for an exercise with parts.
%    \begin{macrocode}
\newcommand\exrtnlabelformatwp{$\square$}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\eqexerskip}
% Amount of skip before and after exercise environment
%    \begin{macrocode}
%</package>
%<*package|eqexam>
\newcommand{\eqexerskip}[1]{\def\eq@exerskip{\vskip#1}}
\eqexerskip{\medskipamount}
\newcommand{\priorexskip}[1]{\def\eq@priorexskip{\vspace{#1}}}
\priorexskip{\medskipamount}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\eqafterexersolnskip}
% Amount of skip after solutions, this one is written to a file, so
% we must protect it from early expansion.
%    \begin{macrocode}
\newcommand\eqafterexersolnskip{\string\medskip}
%</package|eqexam>
%<*package>
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\nolinkcolor}
% This is the color to paint the word 'Exercise' with parts;
% or it colors all the 'Exercise's when the nosolutions option
% has been used
% \changes{v6.05a}{2006/05/08}
% {
%   Changed \cs{nolinkcolor} into a text fill-in. Now, the command \cs{nolinkcolor}
%   fills in \cs{@nolinkcolor}, which holds the named color.
% }
%    \begin{macrocode}
\newcommand{\nolinkcolor}[1]{\def\@nolinkcolor{#1}}
\nolinkcolor{blue}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\proofingsymbol}
%    \begin{macro}{\proofingsymbolColor}
% Proofing symbol and accompanying color (little green bullet)
% \changes{v6.05b}{2006/05/12}
% {
% added a command to change the color of the proofing symbol
% changed the definition of \cs{proofingsymbol} to a text fillin. This creates the command
% \cs{@proofingsymbol}. Can now control the symbol and the color (through \cs{proofingsymbolColor}
% }
%    \begin{macrocode}
\newcommand{\proofingsymbolColor}[1]{\def\@proofingsymbolColor{#1}}
\proofingsymbolColor{webgreen}
\newcommand{\proofingsymbol}[1]{\def\@proofingsymbol{\textcolor{\@proofingsymbolColor}{#1}}}
\proofingsymbol{$\bullet$}
%\newcommand{\proofingsymbol}{\textcolor{\@proofingsymbolColor}{$\bullet$}}
%    \end{macrocode}
%    \end{macro}
%    \end{macro}
%    \subsection{Define \texttt{exercise} Environment}
% Defines the \texttt{exercise} environment for writing exercises,
% and solutions.  The solutions are written to the file
% \cmd{\jobname.sol}, and input at the end of the file.  Hypertext
% links connect the statement of the exercise with its solution.
%
%\smallskip\noindent\textbf{Basic usage}
%\begin{verbatim}
%\begin{exercise}
%The exercise question is posed.
%\begin{solution}
%The solution to exercise goes here.
%\end{solution}
%\end{exercise}
%\end{verbatim}
% These environments should be nested as illustrated above.
%
% The \texttt{exercise} environment has three optional arguments. The syntax
% for an exercise without parts is\dots
%\begin{verbatim}
%   \begin{exercise}[<ctr>][h|H] ...\end{exercise}
%\end{verbatim}%
%
% (1) The value of this first optional argument, \texttt{<ctr>}, is a counter.
% You can use the \texttt{exercise}
% environment then to create other environments with their own
% counters.  A special value of zero (0) for this optional argument,
% means not to associate any counter with the environment.  These
% features can be used in combination with the \cs{SolutionsAfter}
% and \cs{SolutionsAtEnd} commands to obtain different effects,
% see the manual for examples
%
% (2) The second optional argument is an `\texttt{h}' or an \texttt{H}, this signals that the
% solution to the exercise should not be written to the \cmd{\jobname.sol}
% file.  See manual for examples.
%
% The \texttt{exercise} environment has three optional arguments. The syntax
% for an exercise with parts is\dots
%\begin{verbatim}
%   \begin{exercise}[<ctr>]* ...\end{exercise}
%   \begin{exercise*}[<ctr>] ...\end{exercise*}
%\end{verbatim}%
%
% (1) The value of this first optional argument, \texttt{<ctr>}, is a counter.
% You can use the \texttt{exercise}
% environment then to create other environments with their own
% counters.  A special value of zero (0) for this optional argument,
% means not to associate any counter with the environment.  These
% features can be used in combination with the \cs{SolutionsAfter}
% and \cs{SolutionsAtEnd} commands to obtain different effects,
% see the manual for examples
%
% (2) The second argument is a star \texttt{*}.  The presence of a * signals
% that this exercise has multiple parts.  See the manual for the proper
% syntax.
%
% Beginning with version 6.07, there is now a \texttt{exercise*}
% environment, this is what I should have done originally, but now its
% done.  The \texttt{exercise*} signals an exercise with parts. It takes
% one optional parameter, the name of a counter \texttt{<ctr>} that is to
% be used.
%    \begin{macro}{\exerSolnInExtFile}
% With the exercises, you have the option of including them in the main document, or putting them
% in an external document.  The \cs{exerSolnsInExtFile} command lets you specify an external file name.
% Just use the \textit{basename}, hyperref will add the extension.  If an external file is specified, all
% solution links are changed to links between documents. Usage:
%\begin{verbatim}
%\exerSolnsInExtFile{myExSonls}
%\end{verbatim}
%    \begin{macrocode}
\newcommand{\exerSolnsInExtFile}[2][]
    {\let\exerSolns@ExtFile=y\gdef\eq@exerSolns@fileName{#2}%
     \gdef\exerSolns@ReturnPath{#1}}
\let\exerSolns@ExtFile=n
\def\exerSolns@ReturnPath{}
%    \end{macrocode}
%    \end{macro}
%    \begin{macrocode}
%</package>
%<*package|eqexam>
\def\marginparpriorhook{} % used to material before the exercise
\def\marginparafterhook{} % used to material after the exercise
\let\afterlabelhskip=\space
%    \end{macrocode}
% Inserted in the header of each exercise solution. May be used for inserting
% addition text or macros in the solution.
%    \begin{macrocode}
\let\exersolnheadhook=\@empty
%    \end{macrocode}
%    \begin{macro}{\eqexheader}
%    \begin{macro}{\eqexheader@wrapper}
% \cs{eqexheader} typesets `Exercise xx'. \cs{eqexheader@wrapper} creates a hypertarget
% at the heading. Portions of \cs{eqexheader} is also used by \textsf{eqExam}.
%    \begin{macrocode}
\newcommand{\eqexheader}
{%
%</package|eqexam>
%<*package>
    \ifeq@nolink   % no link to solution
%</package>
%<*package|eqexam>
        \hbox{\color{\@nolinkcolor}\if\exerstar*\exlabelformatwp\else
        \exlabelformat\fi}%
%</package|eqexam>
%<*package>
    \else
        \if\exerSolns@ExtFile y%
            \hbox{\href{\eq@exerSolns@fileName\#ex.\the@exno}%
                {\exlabelformat}}%
        \else
            \hbox{\hyperlink{ex.\the@exno}{\exlabelformat}}%
        \fi
    \fi
%</package>
%<*package|eqexam>
}
\def\eqexheader@wrapper{\hypertarget{qex.\the@exno}{\eqexheader}}
%    \end{macrocode}
%    \end{macro}
%    \end{macro}
%    \begin{macro}{\eqexlisttabheader}
% \cs{eqexlisttabheader} typesets `(a)' when we have exercises with parts.
% Portions are also used by \textsf{eqExam}.
%    \begin{macrocode}
\newcommand{\eqexlisttabheader}
{%
%</package|eqexam>
%<*package>
    \ifeq@nolink
%</package>
%<*package|eqexam>
      \color{\@nolinkcolor}(\hfil\thepartno\hfil)%
%</package|eqexam>
%<*package>
    \else
      \if\exerSolns@ExtFile y%
        \href{\eq@exerSolns@fileName\#ex.\the@exno\thepartno}%
            {(\hfil\thepartno\hfil)}%
        \else
            \hyperlink{ex.\the@exno\thepartno}{(\hfil\thepartno\hfil)}%
        \fi
    \fi
%</package>
%<*package|eqexam>
}
%    \end{macrocode}
%    \end{macro}
%    \begin{environment}{exercise}
% With some of the preliminaries out of the way, we begin the exercise `environment'.
%    \begin{macrocode}
\newenvironment{exercise}
{%
    \par\eq@priorexskip\noindent%\begingroup % set defaults
    \def\eq@argi{eqexno}%  % use eqexno counter
%   \def\exerstar{x}%      % default, no *
    \if\eq@exerstarEnv*\def\exerstar{*}\else\def\exerstar{x}\fi % default, no *
    \def\currhideopt{x}%
    \@ifnextchar[{\exercise@}{%
    \if\exerstar*%
        \def\eq@next{\@exercise}% was \exercise@@@
    \else
        \def\eq@next{\exercise@@}%
    \fi\eq@next}%
}{\par\global\eq@exerciseheadingtrue\eq@exerskip}
%   \@ifnextchar[{\exercise@}{\exercise@@[\eq@argi]}}
\def\exercise@[#1]{\def\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}%
            \if\exerstar*%
                \def\eq@next{\def\eq@argi{#1}\@exercise}% was \exercise@@
            \else
                \def\eq@next{\def\eq@argi{#1}\exercise@@}%
            \fi
        \fi
    \fi
\eq@next}
%    \end{macrocode}
% specified counter, test for *
%    \begin{macrocode}
\def\exercise@@{\@ifstar{\def\exerstar{*}\@exercise}% was \exercise@@@
   {\exercise@@@}}%
%    \end{macrocode}
% we have recorded the presence of a star, is there
% another optional argument, h
%    \begin{macrocode}
\def\exercise@@@{%
\@ifnextchar[{\exercise@@@@}{\@exercise}}
\def\exercise@@@@[#1]{\def\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}%
            \typeout{The option #1 is not recognized}
            \let\eq@next=\relax
        \fi
    \fi
\eq@next}
%    \end{macrocode}
%    \begin{macro}{\exerSolnHeader}
% When a solution is written to the .sol file, there is a header line that contains formatting information.
% This command can be redefined as desired.  We also introduce to markers, \cs{eqEXt} and \cs{endeqEXt} which
% can be used in any way your imaginations can conjure up. Basically, the mark the beginning and ending of the solution.
%    \begin{macrocode}
\newif\ifeq@exerciseheading \eq@exerciseheadingtrue
\newcommand\exerSolnHeader[3]
{%
    \ifeqforpaper\else\webnewpage\fi\markright{#1}\par\noindent%
%</package|eqexam>
%<*package>
    \hypertarget{#2}{#3}\relax
%</package>
%<*eqexam>
    #3%
%</eqexam>
%<*package|eqexam>
    \solnhspace
}
%    \end{macrocode}
% These two mark the beginning and end of solution to an exercise.
%    \begin{macrocode}
\let\eqEXt=\relax
\let\endeqEXt=\relax
%    \end{macrocode}
%    \end{macro}
%    \begin{macrocode}
\let\eq@writeexheader\@empty
\def\@exercise
{%
    \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
%    \end{macrocode}
% Here's where we write the header to the .sol file.
%    \begin{macrocode}
                    \gdef\eq@writeexheader{%
                    \immediate\write\verbatim@out{\string\eqEXt
                    \string\exerSolnHeader{\exsecrunhead}{ex.\the@exno}%
                    {\exsllabelformat}\exersolnheadhook\string\relax}%
                    }%
                \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@exerskip
%    \end{macrocode}
% Here is where `Exercise' is typeset; the commands \cs{marginparpriorhook} and \cs{marginpartafterhook}
% can be used to insert content in before and after the `Exercise'.
%    \begin{macrocode}
    \ifeq@exerciseheading
    \prior@questionsHook\marginparpriorhook\noindent\eqexheader@wrapper
    \afterlabelhskip\marginparafterhook\ignorespaces
    \fi
}
%    \end{macrocode}
%    \end{environment}
%    \subsection{Define \texttt{solution} Environment for \texttt{exercise}}
%    \begin{macro}{solution}
%    This is the \texttt{solution} environment for
%    \texttt{exercise}; either start \cmd{\verbatim} or,
%    \cmd{\eq@solutionsaftertrue} write the label \cmd{\exsolafter}.
%
% The solution macro for the \texttt{exercise} environment now takes an optional
% argument. This argument must be a vertical skip ( i.e., [1in] ).  When the solution
% does not correspond to a tabular multi-part question, a vertical skip
% |\vspace{#1}| is introduced when the \texttt{nosolutions} is in effect and when
% \texttt{solutionsafter} is not.  This feature may be useful for constructing
% tests in this space is left for the student to write in the answer; yet, later
% when \texttt{solutionsafter} is true, the solutions appear instead of the vertical
% white space.
%    \begin{macrocode}
\let\solnhspace=\space
\def\solnexer@woparts{\def\bLeaveVspace{x}% = no vertical space added
    \def\next{\@ifnextchar[{\solnexer@@woparts}%
        {\solnexer@@woparts[\null]}}%
    \ifx\endparts\endexercise@parts@tabular
        \def\next{\solnexer@@@woparts}%
    \fi
    \next}
\let\eqPriorVspace\@gobble
\def\solnexer@@woparts[#1]{%
    \ifx#1\null
    \else
        \gdef\sameVspace{#1}%
        \ifeq@nosolutions
            \ifeq@solutionsafter\else
                \let\bLeaveVspace=\@empty
                \def\leavevspace{%
                    \ifx\eq@insertverticalspace y\par\eqPriorVspace{#1}%
                        {\nobreak\parbox[b][#1][t]{\linewidth}{\vfill}}%
                    \fi
                }%
            \fi
        \fi
    \fi
    \solnexer@@@woparts
}
\def\solutionsafterSkip{\smallskip}
\def\solnexer@@@woparts
{%
    \def\exerwparts@cols{x}%
    \let\verbatim@out=\ex@solns
    \if\currhideopt H%
        \let\procsoln=\comment
        \let\endprocsoln=\endcomment
        \def\eq@next{\procsoln}%
    \else
        \eq@ckglobalhide
        \ifeq@hidesolution
            \let\procsoln=\comment
            \let\endprocsoln=\endcomment
        \else
            \ifx\bLeaveVspace\@empty\leavevspace\fi
            \let\procsoln=\verbatimwrite
            \let\endprocsoln=\endverbatimwrite
        \fi
        \def\eq@next{%
            \ifeq@solutionsafter
                \par\solutionsafterSkip
                \noindent\exsolafter\space\ignorespaces
            \else
                \eq@writeexheader % write the solution header 11/03/05
                \global\let\eq@writeexheader\@empty
                \global\therearesolutionstrue\expandafter\procsoln
            \fi
        }%
    \fi
\eq@next}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\endsolnexer@woparts}
%    Unless \cmd{\eq@solutionsaftertrue}, then \cmd{\endverbitim},
%    and write return labels.
%    \begin{macrocode}
\def\endsolnexerhook{}
\def\endsolnexerhookaux{}
%    \end{macrocode}
% This macro attempts to insert the return link at the end of the
% last paragraph of the solutions, this makes the return label
% look nice, and saves a little space.
%    \begin{macrocode}
\def\eq@fititin{\noindent\unskip\nobreak\hfill\penalty50
    \hskip2em\hbox{}\nobreak\hfill}
\let\eqfititin=\eq@fititin
%</package|eqexam>
%<*package>
\def\ReturnTo#1#2{\eq@fititin\hyperlink{#1}{#2}}
\def\xReturnTo#1#2{\eq@fititin\href{#1}{#2}}
%</package>
%    \end{macrocode}
%    \begin{macro}{\eqExerSolnTrailer}
% The material that follows the solution in the .sol file.
%    \begin{macrocode}
%<*package|eqexam>
\newcommand\eqExerSolnTrailer
{%
%</package|eqexam>
%<*package>
    \if\exerSolns@ExtFile y\string\xReturnTo
        {\exerSolns@ReturnPath\jobname\#qex.\the@exno}%
    \else
        \string\ReturnTo{qex.\the@exno}%
    \fi
    {\hbox{\if\exerstar*\exrtnlabelformatwp\else\exrtnlabelformat\fi}}%
    \string\endeqEXt\ifeqforpaper\string\par\eqafterexersolnskip\fi^^J
%</package>
%<*eqexam>
    \string\ReturnTo{page.\the\c@page}%
    {\hbox{\if\exerstar*\exrtnlabelformatwp\else\exrtnlabelformat\fi}}%
    \string\endeqEXt\ifeqforpaper\string\par\eqafterexersolnskip\fi^^J
%</eqexam>
%<*package|eqexam>
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macrocode}
\def\endsolnexer@woparts
{%
    \if\currhideopt H%
        \csname endprocsoln\endcsname
    \else
        \ifeq@solutionsafter
            \eq@fititin\hbox{\exrtnlabelformat}%
        \else
            \endprocsoln
            \eq@ckglobalhide
            \ifeq@hidesolution\else
                \endsolnexerhookaux
%    \end{macrocode}
% Here's were we write the trailer for the solution
%    \begin{macrocode}
                \immediate\write\verbatim@out{\eqExerSolnTrailer}%
            \fi
        \fi
    \fi
\endsolnexerhook}
%    \end{macrocode}
%    \end{macro}
% \subsection{The \texttt{exercise*} Environment: Exercises with Parts}
% Exercises with parts are enclosed within a \texttt{parts} environment. There are two types
% of parts listing: list-type and tabular-type.
%    \begin{environment}{exercise*}
% For the exercise* environment, we set a flag to indicate that the \cs{exerstar}
% has been set in the star environment, the begin the \cs{exercise} and finished with
% \cs{endexercise}.
%\changes{v6.07}{2007/05/05}
%{
%   Created the \texttt{exercise*} environment, this is equivalent to the \texttt{*} option of the
%   \texttt{exercise} environment. You can use either version, but now, \texttt{exercise*} is preferred.
%}
%    \begin{macrocode}
\let\eq@exerstarEnv\relax
\newenvironment{exercise*}{\def\eq@exerstarEnv{*}\exercise}
{\endexercise}
%    \end{macrocode}
%    \end{environment}
%    \begin{macro}{parts}
%    Initially, we see if there is an optional argument, if yes, the
%    tabular environment is used, the argument is the number of columns
%    requested.  Otherwise, we use a list environment.
%    \begin{macrocode}
\def\exercise@parts{\@@par\ifdim\parskip>\z@\vskip-\parskip\fi
  \def\exerwparts@cols{x}\@ifnextchar[%
  {\let\endparts=\endexercise@parts@tabular\exercise@parts@tabular@}%
  {\let\endparts=\endexercise@parts@list\exercise@parts@list}}
%    \end{macrocode}
% \subsubsection{List-type Parts Question}
%    This is a redesigned \texttt{list} environment.  Meant to be used with the
%    \texttt{exercise} environment with the *-option.
%    \begin{macrocode}
\def\eq@extralabelsep{0pt}
\newenvironment{exercise@parts@list}
{\settowidth{\eq@tmplength}{\normalfont(d)}%
\eq@nolinkfalse
\begin{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
%    \end{macrocode}
% Write the solution header to .sol for list type question.
%    \begin{macrocode}
                    \gdef\eq@writeexheader{%
                    \immediate\write\verbatim@out{\string\eqEXt
                    \string\exerSolnHeader{\exsecrunhead}%
                    {ex.\the@exno\thepartno}{\exsllabelformatwp}\relax}%
                    }%
                \fi
            \fi
        \fi
    \fi
    \makebox[\eq@tmplength]{\eqexlisttabheader}%
}{%
    \usecounter{partno}%
    \setlength{\topsep}{3pt}%
    \setlength{\partopsep}{0pt plus 1pt minus 1pt}%
    \setlength{\parsep}{0pt}\setlength{\itemindent}{0pt}%
    \setlength{\listparindent}{\parindent}%
    \settowidth{\labelsep}{\normalfont\ }%
    \addtolength{\labelsep}{\eq@extralabelsep}%
    \settowidth{\labelwidth}{\normalfont(d)}%
    \setlength{\leftmargin}{\labelwidth}%
    \addtolength{\leftmargin}{\labelsep}%
    \let\eq@item=\item
    \def\item{\def\currhideopt{x}\eq@hidesolutionfalse\eq@nolinkfalse%
    \@ifnextchar[\@ckhide\eq@item}}%
}{\end{list}}
%    \end{macrocode}
% \subsubsection{Tabular-type Parts Question}
% Now for the tabular style of multi-part exercise, the argument
% \#1 is the number of columns requested.
%    \begin{macrocode}
\def\exercise@parts@tabular@[#1]{%
  \def\exerwparts@cols{#1}\exercise@parts@tabular}
%    \end{macrocode}
%    Set up the tabular environment, after making a lot of decisions.
%    \begin{macrocode}
\newenvironment{exercise@parts@tabular}
{%
    \setcounter{partno}{0}%
    \settowidth{\eq@tmplength}{\normalfont(d)\ }\sbox{\eq@tmpbox}{(d)}%
    \let\eq@item=\item@part@tabular
    \def\item{\eq@hidesolutionfalse\eq@nolinkfalse
        \@ifnextchar[\@ckhide\eq@item}\eq@nolinkfalse
    \eq@tmpdima=\linewidth \divide\eq@tmpdima by\exerwparts@cols
    \vskip\partopsep\noindent\normalbaselines\tabcolsep=0pt
    \begin{tabular}{*{\exerwparts@cols}{p{\eq@tmpdima}}}%
}{\end{tabular}}
%    \end{macrocode}
%    Redefine \verb+\item+, could be risky
%    \begin{macrocode}
\def\item@part@tabular{\leavevmode\refstepcounter{partno}%
  \eq@solutionsafterfalse % no solutionsafter are allowed
  \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
%    \end{macrocode}
% Write the solution header to .sol for tabular type question.
%    \begin{macrocode}
      \gdef\eq@writeexheader{%
        \immediate\write\verbatim@out{%
        \string\eqEXt\string\exerSolnHeader{\exsecrunhead}%
            {ex.\the@exno\thepartno}{\exsllabelformatwp}\relax}%
      }%
  \fi\fi\fi
  \PBS\raggedright
  \settowidth{\eq@tmplength}{\normalfont(d)\ }%
  \sbox{\eq@tmpbox}{\normalfont(d)}%
  \eq@tmpdima=\wd\eq@tmpbox
  \addtolength\eq@tmplength{\eq@extralabelsep}%
  \hangindent=\eq@tmplength\hangafter=1\relax
  \makebox[\eq@tmpdima]{\eqexlisttabheader}\ \ignorespaces
}
%    \end{macrocode}
%    \begin{macrocode}
\def\@ckhide[#1]{\def\eq@arg{#1}%
    \def\currhideopt{x}%
    \if\eq@arg H%
        \eq@hidesolutiontrue\eq@nolinktrue%
        \edef\currhideopt{\Hidesymbol}%
    \else
        \ifeq@globalshowsolutions\else
            \if\eq@arg h%
                \eq@hidesolutiontrue\eq@nolinktrue%
                \def\currhideopt{h}%
            \fi
        \fi
    \fi
    \eq@item
}
%    \end{macrocode}
%    \end{macro}
%    \subsection{Including the \texttt{exercise} Solutions}
% Include solutions to the exercises back into the file.  This
% section also handles solutions to quizzes as well. This macro
% was taken from the \TeX book.
%    \begin{macro}{\includeexersolutions}
% This macro inserts the solutions to the exercises, if there are
% any solutions.  If a user uses this macro to insert the solutions
% elsewhere, \cmd{\include@solutions} is called, then put is to
% \cmd{\relax}.
%    \begin{macrocode}
\def\includeexersolutions
{%
%</package|eqexam>
%<*package>
   \if\exerSolns@ExtFile n%
%</package>
%<*package|eqexam>
       \include@solutions\let\include@solutions=\relax
%</package|eqexam>
%<*package>
   \fi
%</package>
%<*package|eqexam>
}
%    \end{macrocode}
%    \end{macro}
% The internal command that insert solutions.  This command
% appears at the end of document, where it will insert the
% solutions, unless it has been redefined to \cmd{\relax} by
% \cmd{\includesolutions}.
%    \begin{macrocode}
\let\eqsolutionshook\@empty
\let\priorexsectitle\@empty
\let\priorexslinput\@empty
\def\exerSolnsHeadnToc{\section*{\exsectitle}%
    \addcontentsline{toc}{section}{\protect\numberline{}\exsectitle}}
\newcommand{\exerSolnInput}
{%
    \let\webnewpage=\relax
    \immediate\closeout\ex@solns
    \ifeq@nosolutions\else
        % changed from \exsecrunhead, 6/1/05
        \iftherearesolutions\newpage\markright{\exsectitle}%
            \ifx\webnewpage\relax
                \def\webnewpage{\let\webnewpage=\newpage}%
            \fi
            \priorexsectitle\exerSolnsHeadnToc\priorexslinput
            \input{\jobname.sol}%
            \eqsolutionshook
        \fi
    \fi
}
\def\include@solutions
{%
%</package|eqexam>
%<*package>
    \if\exerSolns@ExtFile n%
%</package>
%<*package|eqexam>
        \exerSolnInput
%</package|eqexam>
%<*package>
    \fi
%</package>
%<*package|eqexam>
}
%</package|eqexam>
%<*package>
%    \end{macrocode}
%    \section{Early end of input}
% There is no support for the Acrobat Forms features with the
% texttt{dviwindo} option by \textsf{hyperref}; therefore there is
% none here as well.  \textsf{dviwindo} can use the
% \texttt{exercise} environment, but not the quizzes, so end here.
%    \begin{macrocode}
\ifeq@noforms\endinput\fi
%    \end{macrocode}
% Begin the Quiz Part of Exerquiz
%    \section{The \texttt{shortquiz} Environment}
%    \subsection{The \texttt{questions} Environment}
% The \texttt{questions} environment is used inside the
% \texttt{shortquiz} and \texttt{quiz} environments, though it can
% also be used a stand alone list. Beginning with version 5.5, the \texttt{questions}
% environment can be nested three deep.
%    \begin{macro}{questions}
%    This is a redesigned \texttt{list} environment.
%    \begin{macrocode}
%</package>
%<*package|eqexam>
\newcommand{\prior@questionsHook}{}
\newcommand{\post@questionsHook}{}
\renewcommand{\theeqquestionnoi}{\arabic{eqquestionnoi}}
\newcommand{\labeleqquestionnoi}{\color{blue}\bfseries\theeqquestionnoi.}
\renewcommand{\theeqquestionnoii}{\alph{eqquestionnoii}}
\newcommand{\labeleqquestionnoii}{\color{blue}\bfseries(\theeqquestionnoii)}
\renewcommand{\theeqquestionnoiii}{\roman{eqquestionnoiii}}
\newcommand{\labeleqquestionnoiii}{\color{blue}\bfseries(\theeqquestionnoiii)}
\newenvironment{questions}
{%
    \ifnum\@eqquestiondepth>\tw@\@toodeep\else\advance\@eqquestiondepth\@ne\fi
    \def\@quesctr{eqquestionno\romannumeral\the\@eqquestiondepth}%
    \begin{list}{\prior@questionsHook\gdef\eqPTs{1}\global\let\eqQT=\eq@na%
    \makebox[\labelwidth][r]{\normalfont\bfseries\csname label\@quesctr\endcsname}%
        \post@questionsHook}%
    {\usecounter{\@quesctr}%
%    \setcounter{eqpointvalue}{0}%\setcounter{questionno}{0}%
    \settowidth{\labelwidth}{\normalfont\bfseries00.\ }%
    \setlength{\topsep}{3pt}\setlength{\parsep}{0pt}%
    \setlength{\itemindent}{0pt}\setlength{\itemsep}{3pt}%
    \setlength{\leftmargin}{\labelwidth}%
%    \setlength{\labelsep}{0pt}}%
    \settowidth{\labelsep}{\ }}

}{\end{list}}
%    \end{macrocode}
%    \end{macro}
%    \subsection{The \texttt{shortquiz} and \texttt{shortquiz*} Environments}
% This \texttt{shortquiz} environment sets up multiple choice
% questions, with immediate feedback whether the user clicked on the
% right or wrong answer.  Solutions to the \texttt{shortquiz} may,
% or may not be included.
%    \begin{macro}{shortquiz}
% The shortquiz environment, really just a shell to define the
% \cmd{\Ans} macro and the \texttt{solution} environment that go with
% the \texttt{shortquiz}
%    \begin{macrocode}
\def\sq@priorhook{\medskip\noindent}
\def\@shortquizCnt{0}
\def\@sqGenBaseName{eqSqBn\@shortquizCnt}
\newenvironment{shortquiz}
{%
    {\count0=\@shortquizCnt\advance\count0by1\relax
        \xdef\@shortquizCnt{\the\count0 }}%
    \goodbreak\@ifstar{\gdef\sqstar{*}\@shortquiz}
        {\gdef\sqstar{}\@shortquiz}%
}{\aeb@endshortquiz}
\newenvironment{shortquiz*}
{%
    {\count0=\@shortquizCnt\advance\count0by1\relax
        \xdef\@shortquizCnt{\the\count0 }}%
    \gdef\sqstar{*}\@shortquiz
}{\aeb@endshortquiz}
\def\@shortquiz{\@ifnextchar[%
    {\@@shortquiz}{\@@shortquiz[\@sqGenBaseName]}}
%    \end{macrocode}
% \#1: unique name to be used for defining objective style questions.
%      Required if there are objective question; use this parameter
%      if there are objective questions. Also required if
%      using the * option (forms)
%    \begin{macrocode}
\def\@@shortquiz[#1]{%\begingroup
  \gdef\oField{#1}\gdef\curr@quiz{#1}\gdef\currQuiz{#1}%
  \global\let\eqQuizType=s\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}
        \typeout{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
%    \end{macrocode}
% Lay down the question header. \cs{sqlabel} defaults to a red ``Quiz''.
%    \begin{macrocode}
  \sq@priorhook\sqlabel\space\ignorespaces
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\aeb@endshortquiz}
%    \begin{macro}{\aftershortquizskip}
% We reset the labels to the default in case the author
% of the document has redefined them temporarily. The author can
% avoid this reset, by redefining the global variables.
%    \begin{macrocode}
\def\aftershortquizskip{\medskip}
\def\aeb@endshortquiz{\setcounter{quizno}{0}%
  \global\let\sqlabel=\eq@sqlabel
  \global\let\sqslrtnlabel=\eq@sqslrtnlabel
  \global\let\sqsllabel=\eq@sqsllabel
  \par\aftershortquizskip%\endgroup
}
%    \end{macrocode}
%    \end{macro}
%    \end{macro}
%    \begin{macro}{\sqLinks}
%    \begin{macro}{\sqForms}
% (01/01/05) Use these two commands to locally change the style of multiple choice
% questions: link or form.
%    \begin{macrocode}
\def\sqLinks{\gdef\sqstar{}}\sqLinks{}
\def\sqForms{\gdef\sqstar{*}}
%    \end{macrocode}
%    \end{macro}
%    \end{macro}
%    \begin{macrocode}
%</package|eqexam>
%<*package>
%    \end{macrocode}
% The \texttt{shortquiz} contains two other environments, each nested inside
% the next: The \texttt{answers} environment and the \texttt{solution}
% environment. The latter environment is optional.
%
% \smallskip\noindent\textbf{Basic Usage for the \texttt{shortquiz} environment}
%\begin{verbatim}
%No solutions included             With Solutions
%\begin{shortquiz}                 \begin{shortquiz}
%The question                      The question
%\begin{answers}                   \begin{answers}[qz:mysoln]
%\Ans1 ... &\Ans0 &... &\Ans0 ...  \Ans1 ... &\Ans0 &... &\Ans0 ...
%\end{answers}                     \begin{solution}
%\end{shortquiz}                   .....
%                                  \end{solution}
%                                  \end{answers}
%                                  \end{shortquiz}
%\end{verbatim}
% To further complicate matters, the \texttt{shortquiz} can be
% used with the \texttt{questions} environment to create a series of
% numbered short question quizzes. See the manual for examples.
% \texttt{solution} environment is defined next.
%    \begin{macro}{solution}
% The \texttt{solution} environment does double duty, it is used by both
% the \texttt{shortquiz} and \texttt{quiz} environments.
% The macro \cmd{\solution@sq} is the one that actually does the work
% of \cmd{\solution}: It  writes the solutions to the file
% \cmd{\jobname.qsl}.  This macro obeys the \texttt{forpaper}
% option. In this case, solutions are separated by a
% \cmd{\medskip} rather then put on a separate page.  It also
% obeys the \texttt{solutionsafter} option
%    \begin{macrocode}
%</package>
%<*package|eqexam>
\def\solution@sq{\let\eq@next=\relax
  \ifx\@qzsolndest\@empty
    \typeout{exerquiz: * Solutions unexpected here *}%
    \typeout{exerquiz: * Will assume 'solutionsafter' option *}%
    \eq@solutionsaftertrue
  \fi
  \ifeq@solutionsafter
    \par\smallskip\noindent
    \sqsolafter
  \else
    \global\therearequizsolutionstrue\let\verbatim@out=\quiz@solns
    \immediate\write\verbatim@out{%
%    \end{macrocode}
% Mark in the solutions files whether this is a quiz or a shortquiz solution.
%    \begin{macrocode}
      \ifx\eqQuizType q\string\eqQt\else\string\eqSQt\fi%
      \string\quizSolnHeader\ifx\eqQuizType q\ifx\allow@peek n%
        [{\curr@quiz}{\currQuizStartPage}]\fi\fi%
        {\@qzsolndest}{\sqsllabel}\relax}%
    \expandafter\verbatimwrite\fi
}
\def\solutionsAfterSkip{\par\bigskip}
\def\endsolution@sq
{%
    \ifeq@solutionsafter
        \eq@fititin\hbox{\sqslrtnlabel}\solutionsAfterSkip
    \else
        \endverbatimwrite
        \ifx\@qzsolndest\@empty\else
            \immediate\write\verbatim@out{\eqSqSolnTrailer}%
        \fi
    \fi
    \global\let\@qzsolndest=\@empty
}
%</package|eqexam>
%<*package>
%    \end{macrocode}
%    \begin{macro}{\saveDest}
%    \begin{macro}{\useDest}
% These two macros are used, as needed to save the destination name of a solution, then
% re-emitting it later, just prior to the solution. Useful for grouped questions.
%    \begin{macrocode}
\def\saveDest{\xdef\holdDest{\@qzsolndest}}
\def\useDest{\def\@qzsolndest{\holdDest}}
%    \end{macrocode}
%    \end{macro}
%    \end{macro}
%    \begin{macrocode}
%</package>
%<*package|eqexam>
\def\fpAfterSolutionsSkip{\par\medskip}
\newcommand\eqSqSolnTrailer{%
    \ifx\eqQuizType q%
        \string\ReturnTo{page.\the\c@page}%
            {\hbox{\sqslrtnlabel}}\string\endeqQt
    \else
        \string\ReturnTo{page.\the\c@page}%
            {\hbox{\sqslrtnlabel}}\string\endeqSQt
    \fi
    \ifeqforpaper\string\fpAfterSolutionsSkip\fi^^J%
}
%</package|eqexam>
%<*package>
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\eqQt}
% The \cmd{\eqQt} is a marker at the beginning of each quiz
% solution. It takes one argument: 0 if the solution is from a
% short quiz; 1 if the solution is from a quiz.  If you want to
% input the \texttt{*.qsl} file and typeset the solutions, separate
% from the generating document, you can redefine this command
% for various purposes, for  example, to strip of the shortquiz
% solutions. Here's an example:
%\begin{verbatim}
%\makeatletter
%\renewcommand\eqQt[1]{\ifx#10\expandafter\eqQtSQ\fi}
%\long\def\eqQtSQ#1\ReturnTo{\@gobbletwo}
%\makeatother
%\begin{document}
%\input{mydoc.qsl}
%\end{document}
%\end{verbatim}
%\noindent The default action of \cmd{eqQt} is to do nothing and to eat its argument.
%    \begin{macrocode}
%\let\eqQt=\@gobble
%</package>
%<*package|eqexam>
\let\eqSQt=\relax
\let\endeqSQt=\relax
\let\eqQt=\relax
\let\endeqQt=\relax
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\quizSolnHeader}
%  Each solution begins with \cmd{\quizSolnHeader}. This can be redefined
%  for whatever reason. It takes three arguments, one of which is optional.
%  \#1 is the \cmd{\noPeek} parameters; \#2 is the named destination to this
%  solution; \#3 is the \cmd{\sqsllabel}.
%
% If you want to typeset solutions separately, you could redefine
% \cmd{\quizSolnHeader} as desired, and used in conjunction with
% \cmd{eqQt}.
%    \begin{macrocode}
\newcommand\quizSolnHeader[3][]{%
    \ifeqforpaper\else\webnewpage\fi\noindent
%</package|eqexam>
%<*package>
    \ifx#1\empty\else\noPeek#1\fi
    \hypertarget{#2}{#3}\relax
%</package>
%<*eqexam>
    #2%
%</eqexam>
%<*package|eqexam>
    \solnhspace
}
%</package|eqexam>
%<*package>
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\NoPeeking}
%    \begin{macro}{\AllowPeeking}
% A \texttt{quiz} solution has an additional (optional) feature. If
% \cmd{\NoPeeking} is executed, then an open action is placed on the opening
% page of each solution. This open action simply changes the page back to
% the page of the quiz. This is an attempt at keeping students from ``peeking''
% at the solutions before, or while they are taking a quiz. \cmd{\AllowPeeking}
% is the default.
%    \begin{macrocode}
\def\AllowPeeking{\global\let\allow@peek=y}\AllowPeeking
\def\NoPeeking{\global\let\allow@peek=n}
%    \end{macrocode}
%    \end{macro}
%    \end{macro}
%    \begin{macro}{\noPeekAction}
% The default definition of \cmd{quizSolnHeader} contains a macro called
% \cmd{\noPeek}. This is the action that \cmd{\noPeek} performs. The actual
% definition of \cmd{\noPeek} is driver dependent, and is listed elsewhere.
% An open page action will be created with a JavaScript action, which calls
% a DLJS function \texttt{noPeek("\#1",\#2)}. The first parameter is the base
% name of the quiz; the second parameter is the page number the quiz starts from
% (so that we can return to that page when the student tries to view the solution
% when he is not authorized to).
%    \begin{macrocode}
\def\noPeekAction#1#2{%
    /AA <</O<</S/JavaScript/JS(noPeek("#1",#2))>> >>
}
%    \end{macrocode}
%    \end{macro}
%    \subsection{The \texttt{shortquiz} Solutions}
% When the first solution is written, \cmd{\therearequizsolutions} is
% made true.  When the solutions are input back into the file, and
% this switch is still false, then no quiz header is typeset;
% this avoids an empty quiz solutions section with only the header.
%    \begin{macrocode}
%</package>
%<*package|eqexam>
\newif\iftherearequizsolutions \therearequizsolutionsfalse
%    \end{macrocode}
%    \begin{macro}{\includequizsolutions}
% This macro inserts the solutions to the short quizzes, if there are
% any solutions.  If a user uses this macro to insert the solutions
% elsewhere, \cmd{\include@quizsolutions} is called, then put is to
% \cmd{\relax}.
%    \begin{macrocode}
\def\includequizsolutions
{%
        \include@quizsolutions
        \let\include@quizsolutions=\relax
}
%</package|eqexam>
%<*package>
%    \end{macrocode}
%    \end{macro}
% Commands executed at the beginning of the page of quiz solutions
%    \begin{macrocode}
\let\eqqzsolutionshook\@empty
\let\priorsqslsectitle\@empty
\let\priorsqslinput\@empty
\def\quizSolnsHeadnToc{\section*{\sqslsectitle}%
    \addcontentsline{toc}{section}{\protect\numberline{}\sqslsectitle}}
\newcommand{\quizSolnInput}
{%
    \let\webnewpage=\relax
    \immediate\closeout\quiz@solns
    \ifeq@noquizsolutions\else
        \iftherearequizsolutions\newpage\markright{\eq@sqslsecrunhead}%
            \ifx\webnewpage\relax
                \def\webnewpage{\let\webnewpage=\newpage}%
            \fi
            \priorsqslsectitle\quizSolnsHeadnToc\priorsqslinput
            \input{\jobname.qsl}\eqqzsolutionshook
        \fi
    \fi
}
%    \end{macrocode}
% The internal command that insert solutions.  This command
% appears at the end of document, where it will insert the
% solutions, unless it has been redefined to \cmd{\relax} by
% \cmd{\includequizsolutions}.
%    \begin{macrocode}
\def\include@quizsolutions{\quizSolnInput}
%    \end{macrocode}
%
%    \section{The \texttt{quiz} and \texttt{quiz*} Environments}
%
% In this section we introduce the \texttt{quiz} environment, and all its
% supporting elements.
%
%    \subsection{Define the \texttt{quiz} Environment}
%
%    \begin{macrocode}
\def\q@priorhook{\par\medskip}
\let\eq@initializeServerSubmit\@empty
%    \end{macrocode}
%    \begin{macro}{\quiztype}
%    \begin{macro}{\defaultquiztype}
% The command \cs{quiztype} can be used to force subsequent quizzes to be link
% style or form style, independent of the environment. Recognized values are
% \texttt{f} and \texttt{l}.  Once the override \cs{quiztype} has been used,
% you can recover the default behavior of the quizzes by expanding
% \cs{defaultquiztype}.
%    \begin{macrocode}
\newcommand{\quiztype}[1]{\def\@quiztype{#1}}\let\@quiztype\@empty
\newcommand{\defaultquiztype}{\let\@quiztype=\@empty}
%    \end{macrocode}
%    \end{macro}
%    \end{macro}
% begin dps 12/20/03
%    \begin{macrocode}
\def\setdefault@Ans{\expandafter\global\expandafter
    \let\expandafter\@Ans\expandafter=\csname Ans@\@@quiztype\endcsname
}
% end dps 12/20/03
%    \end{macrocode}
%    \begin{macro}{\useForms}
%    \begin{macro}{\useLinks}
% For multiple choice questions, here we give the option of using a mixture of links
% and forms.
%    \begin{macrocode}
% dps 12/20/03
\newcommand\useForms{\let\@Ans=\Ans@f}
\newcommand\useLinks{\let\@Ans=\Ans@l}
%    \end{macrocode}
%    \end{macro}
%    \end{macro}
%    \begin{environment}{quiz}
% The \texttt{quiz} environment takes an optional `\texttt*'
% and one required argument.  There are two styles of quizzes:
% links or checkboxes. Beginning with v6.08, the use of the \texttt*-option
% is discouraged, use the quiz* environment instead.
%\begin{verbatim}
%\begin{quiz}[*]{<base_name>}
% ...
%\end{quiz}
%\end{verbatim}
% \begin{itemize}
% \item optional \texttt{*} $=$ use checkboxes, otherwise use links
% \item \texttt{<base\_name>}: required argument $=$ base name of quiz.
% \end{itemize}
%    \begin{macrocode}
\newenvironment{quiz}
{\goodbreak\@ifstar{\def\qstar{*}\@quiz*f}{\def\qstar{x}\@quiz*l}}
    {\aeb@endquiz}
\def\@quiz*#1#2%
{%
    \setcounter{eqpointvalue}{0}\setcounter{questionno}{0}%
    \eq@initializeServerSubmit
    \global\let\eqQuizType=q\tabcolsep=0pt
    \gdef\eqPTs{1}\global\let\eqQT\eq@na
    \gdef\quiz@total{#2}\gdef\curr@quiz{#2}%
    \gdef\currQuiz{#2}\xdef\currQuizStartPage{\thepage}%
    \xdef\aPointType{0}%
    \ifx\@quiztype\@empty
        \gdef\@@quiztype{#1}%
    \else
        \xdef\@@quiztype{\@quiztype}%
    \fi
    \setdefault@Ans
    \let\@qzsolndest=\@empty
    \let\answers=\answers@q\let\endanswers=\endanswers@q
    \let\solution=\solution@sq\let\endsolution=\endsolution@sq
    \q@priorhook\eq@beginQuiz\space\ignorespaces
}
%    \end{macrocode}
% Here is the end for the \texttt{quiz} and \texttt{quiz*} environments. The
% \cs{eq@prior@endQuiz} can be used for whatever purposes a
% developer wants.
%    \begin{macrocode}
\let\eq@prior@endQuiz\@empty
\def\aeb@endquiz
{%
    \eq@prior@endQuiz
    \eq@endQuiz
    \global\let\bqlabel=\eq@bqlabel % reset beginning label to default
    \global\let\eqlabel=\eq@eqlabel % reset ending label to default
    \global\let\bqlabelISO=\eq@bqlabelISO
}
%    \end{macrocode}
%    \end{environment}
%    \begin{environment}{quiz*}
% This environment is more latexy, \texttt{quiz*} environment is for quizzes with forms. Equivalent
% to \verb!\begin{quiz}*...\end{quiz}!/
%    \begin{macrocode}
\newenvironment{quiz*}{\goodbreak\def\qstar{*}\@quiz*f}{\aeb@endquiz}
%    \end{macrocode}
%    \end{environment}
%    \begin{macro}{\Quiz}
%   A convenience macro for setting the name of the quiz. This command defines the
%   text macro \cs{thisQuiz} which contains the quiz name. Can be used in conjunction
%   with \cs{floatQuiz} and \cs{startQuizHere}.
% \changes{v6.05c}{2006/05/19}
% {
%   Added a convenience macro for setting the name of the quiz. This command defines the
%   text macro \cs{thisQuiz} which contains the quiz name. Can be used in conjunction
%   with \cs{floatQuiz} and \cs{startQuizHere}.
% }
%
%    \begin{macrocode}
\def\Quiz#1{%
    \def\thisQuiz{#1}%
    \def\curr@quiz{\thisQuiz}%
    \def\currQuiz{\curr@quiz}%
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\floatQuiz}
%    \begin{macro}{\dockQuiz}
% Use \cs{floatQuiz} to create commands \cs{startQuizHere} and \cs{endQuizHere}. These commands expand to the
% `Begin Quiz' button or link (`End Quiz' button or link).  But these commands can be placed anywhere before the
% \texttt{quiz} environment (after the \texttt{quiz} environment). Use \cs{dockQuiz} to return to the default behavior of the
% \texttt{quiz} environment.
% \changes{v6.05c}{2006/05/19}
% {
%   Added \cs{floatQuiz}, \cs{dockQuiz} and \cs{startQuizHere} to start a quiz in an
%   arbitrary place prior to the beginning of the quiz.
% }
%\par\medskip\noindent Usage:
%\begin{verbatim}
%\Quiz{myQuiz}
%\floatQuiz
%........
%\begin{center}
%\startQuizHere
%\end{center}
%....
%\begin{quiz*}{\thisQuiz}
%....
%\end{quiz*}
%....
%\endQuizHere
% ...
%\docQuiz
%\begin{quiz}{anotherQuiz}
%....
%\end{verbatim}
%    \begin{macrocode}
\def\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\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
}
%    \end{macrocode}
%    \end{macro}
%    \end{macro}
%
%    \subsection{Begin/End Quiz with Link or Buttons}
%
% Redefine this macro to \cmd{\eq@BeginQuizButton} to get a form button
% for the \texttt{quiz} environment. Pressing on the link or button
% initializes the quiz. The default is `link': \cmd{\eq@BeginQuizLink}.
%    \begin{macrocode}
\newcommand\eq@beginQuiz{\eq@BeginQuizLink}
%    \end{macrocode}
% Redefine this macro to |\eq@EndQuizButton| to get a form button
% for the \texttt{quiz} environment. Pressing on the link or button
% will score the quiz. The default is `link': |\eq@EndQuizLink|.
%    \begin{macrocode}
\newcommand\eq@endQuiz{\eq@EndQuizLink}
%    \end{macrocode}
%    \begin{macro}{\useBeginQuizButton}
% Use a button instead of a link for begin quiz
%    \begin{macrocode}
\newcommand\useBeginQuizButton[1][]
    {\renewcommand\eq@beginQuiz{\eq@BeginQuizButton[#1]}}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\useEndQuizButton}
% Use a button instead of a link for end quiz
%    \begin{macrocode}
\newcommand\useEndQuizButton[1][]
    {\renewcommand\eq@endQuiz{\eq@EndQuizButton[#1]}}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\useBeginQuizLink}
% Use a link begin quiz (the default)
%    \begin{macrocode}
\newcommand\useBeginQuizLink
    {\renewcommand\eq@beginQuiz{\eq@BeginQuizLink}}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\useEndQuizLink}
% Use a link end quiz (the default)
%    \begin{macrocode}
\newcommand\useEndQuizLink
    {\renewcommand\eq@endQuiz{\eq@EndQuizLink}}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\@initQuiz}
%    \begin{macro}{\priorInitQuiz}
%    \begin{macro}{\postInitQuiz}
% \cs{@initQuiz} is executed when you click on `Begin Quiz'. Included here are some
% macro hooks for insert code prior to, and after the quiz initialization. This
% command appears in the commands \cs{eq@@BeginQuizLinkActions} and \cs{eq@@BeginQuizButtonActions} below.
%    \begin{macrocode}
\newcommand\@initQuiz
    {InitializeQuiz("\curr@quiz",\ifeq@nocorrections0\else1\fi);\jsR
    var \curr@quiz = new Object();\jsR
    \curr@quiz.oAlertCheck = { bAfterValue: false };\jsR
    \curr@quiz.Grp = {};\jsR
}
%    \end{macrocode}
% \cs{priorInitQuiz} and \cs{postInitQuiz} are hooks that allow a document author to
% execute JavaScript just prior to submittal and just after. These appear in
% \cs{eq@@BeginQuizLinkActions} and \cs{eq@@BeginQuizButtonActions} below.
%    \begin{macrocode}
\newcommand{\priorInitQuiz}{}
\newcommand{\postInitQuiz}{}
%    \end{macrocode}
%    \end{macro}
%    \end{macro}
%    \end{macro}
% Here are a couple of macros used with `End Quiz', and are used for
% submitting quiz results to a web server.
%    \begin{macrocode}
\let\eq@submitURL=\@empty
\let\eq@insertHiddenFields=\@empty
%    \end{macrocode}
%
% \subsubsection{With Links}
%
%    \begin{macro}{\eq@BeginQuizLink}
% Begin quiz with links
%    \begin{macrocode}
\def\eq@@BeginQuizLinkActions
{%
    \A{\JS{%
      \priorInitQuiz
      \@initQuiz
      \postInitQuiz}}%
}
\def\eq@BeginQuizLinkDefaults{\Border{0 0 0}}
\def\eq@BeginQuizLink
{%
    \set@@Link{}{}{}{\color{\@linkcolor}\bqlabel}{}%
    {\eq@setWidgetProps\setLink@driver}%
    {\eq@BeginQuizLinkDefaults\eq@@BeginQuizLinkActions\every@Link}%
    \space\ignorespaces
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\eq@EndQuizLink}
% Code the the link version of `End Quiz'.
%    \begin{macrocode}
\newcommand\priorSubmitQuiz{}
\newcommand\postSubmitQuiz{}
\def\eq@@EndQuizLinkActions
{%
    \A{\JS{%
        if (!isQuizInitialized("\curr@quiz"))\jsR\jsT
            app.alert(InitMsg("\bqlabelISO"),3);\jsR
        else {\jsR\jsT
            if (\minQuizResp(\thequestionno)) {\jsR\jsT\jsT
                DisplayQuizResults("\curr@quiz",\theeqpointvalue,%
                    \thequestionno);\jsR\jsT\jsT
                \eq@submitURL
                \postSubmitQuiz
                resetQuiz("\curr@quiz");\jsR\jsT
            }\jsR
            }}}%
}
\def\eq@EndQuizLinkDefaults{\Border{0 0 0}}
\def\eq@EndQuizLink
{%
    \ifx\eq@CGI\@empty
        \let\eq@submitURL=\@empty
        \let\eq@insertHiddenFields=\@empty
    \fi
    \set@@Link{}{}{}{\color{\@linkcolor}\eqlabel}{}%
    {\eq@setWidgetProps\setLink@driver}%
    {\eq@EndQuizLinkDefaults\eq@@EndQuizLinkActions\every@Link}%
    \makebox[0pt][r]{\eq@insertHiddenFields}\gdef\eq@CGI{}%
    \ignorespaces
}
%    \end{macrocode}
%    \end{macro}
%
% \subsubsection{With Buttons}
%
%    \begin{macro}{\eq@BeginQuizButton}
% This is the button when the user wants button rather than link for the
% \texttt{quiz} environment.
%    \begin{macrocode}
\def\eq@BeginQuizButtonDefaults
{%
    \CA{\bqlabel}\RC{\bqlabel}\AC{\bqlabel}\H{P}\F{\FPrint}
    \BC{1 0 0}\BG{.7529 .7529 .7529}\W{1}\S{B}
}
\def\eq@@BeginQuizButtonActions
{%
    \A{\JS{%
        \priorInitQuiz
        \@initQuiz
        \postInitQuiz}%
    }%
}
\newcommand\eq@BeginQuizButton[1][]
{%
    \push@@Button{#1}{beginQuiz.\curr@quiz}{}{\DefaultHeightOfWidget}%
    {\eq@protect\A}{\eq@setButtonProps\eq@Button@driver}%
    {\eq@BeginQuizButtonDefaults\eq@@BeginQuizButtonActions\every@ButtonField
     \every@BeginQuizButton}%
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\eq@EndQuizButton}
% The `End Quiz' code for Links
%    \begin{macrocode}
\def\eq@EndQuizButtonDefaults
{%
    \CA{\eqlabel}\RC{\eqlabel}\AC{\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
            app.alert(InitMsg("\bqlabelISO"),3);\jsR
        else {\jsR\jsT
            if (\minQuizResp(\thequestionno)) {\jsR\jsT\jsT
                DisplayQuizResults("\curr@quiz",\theeqpointvalue,%
                    \thequestionno);\jsR\jsT\jsT
                \eq@submitURL
                \postSubmitQuiz
                resetQuiz("\curr@quiz");\jsR\jsT
            }\jsR
            }}%
    }
}
\newcommand\eq@EndQuizButton[1][]
{%
    \ifx\eq@CGI\@empty
        \let\eq@submitURL=\@empty
        \let\eq@insertHiddenFields=\@empty
    \fi
    \push@@Button{#1}{endQuiz.\curr@quiz}{}{\DefaultHeightOfWidget}%
        {\eq@protect\A}{\eq@setButtonProps\eq@Button@driver}%
        {\eq@EndQuizButtonDefaults\eq@@EndQuizButtonActions\every@ButtonField
         \every@EndQuizButton}%
    \makebox[0pt][r]{\eq@insertHiddenFields}\gdef\eq@CGI{}%
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\databaseName}
%    \begin{macro}{\tableName}
%    \begin{macro}{\eqCGI}
%    \begin{macro}{\eqSubmit}
% These four commands give general support for submitting quiz data
% to a web server for storage in a database.  Use in my \textsf{eq2db} Package
% which I have not completed yet.
%    \begin{macrocode}
\newcommand\databaseName[1]{\def\db@Name{#1}}\def\db@Name{}
\newcommand\tableName[1]{\def\db@Table{#1}}\def\db@Table{}
\newcommand\eqCGI[1]{\def\eq@CGI{#1}}\def\eq@CGI{}
\newcommand\eqSubmit[3]{\eqCGI{"#1"}\databaseName{#2}\tableName{#3}}
%    \end{macrocode}
%    \end{macro}
%    \end{macro}
%    \end{macro}
%    \end{macro}
% The next two commands are used in the \textsf{eq2db} package. We make the
% definitions here so that they can be used even if the package is not loaded.
% In this way, a self-contained quiz can be submitted just by loading the
% package.
%    \begin{macrocode}
\newcommand\addHiddenTextField[3][]{}
\newcommand\populateHiddenField[2]{}
%    \end{macrocode}
%    \subsection{Correcting the Quiz}
%
%    \begin{macro}{\eqButton}
% Use this button to correct the quiz. Can be customize with
% optional arguments.
% section.
%\begin{verbatim}
% #1 = optional attributes of button
% #2 = title of textfield that contains the score.
%\end{verbatim}
%    \begin{macrocode}
\def\eqButtonDefaults
{%
    \CA{\eq@local@CA}\RC{\eq@local@RC}
    \AC{\eq@local@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);}%
    }%
}
\newcommand\eqButton[2][]
{%
%    \end{macrocode}
% If nocorrections is true, then this button does not appear.
%    \begin{macrocode}
    \ifeq@nocorrections\else
        \medskip\def\eqBaseName{#2}%
        \push@@Button{#1}{correct.#2}{}{\DefaultHeightOfWidget}%
        {\eq@protect\A}{\eq@setButtonProps\eq@Button@driver}%
        {\eqButtonDefaults\@@eqButtonActions\every@ButtonField
        \every@eqButton}%
    \fi
}
%    \end{macrocode}
%    \end{macro}
%
%    \subsection{Measuring Quiz Results}
%
%    \begin{macro}{\minQuizResp}
% Define the threshold level. The two permissible values are \texttt{lowTreshold}
% and \texttt{highThreshold}. These are names of DLJS. New threshold functions
% can be defined and specified.
%    \begin{macrocode}
\newcommand\minQuizResp{lowThreshold}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\PTs}
% Use this macro to assign weights to the quiz questions. Use only within
% the \texttt{questions} environment, just after an \cmd{\item}. If
% \cmd{\PTs} does not appear, then a weight of $1$ is assumed.
%\par\noindent|#1 = number of points for the current question.|
%    \begin{macrocode}
\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
% begin dps 12/20/03
%    \end{macrocode}
%    \begin{macro}{\QT}
% \cs{QT} is used for entering the ``question type'' for the question (optional).
% This question type is entered into the ``\texttt{tagged}'' data, and is meant to be
% used for classifying and in tracking the problem types. Example: \verb+\QT{limits}+.
%    \begin{macrocode}
\newcommand\QT[1]
{%
    \gdef\eq@qT{#1}\ifx\eq@qT\@empty\global\let\eq@qT=\eq@na\fi% not applicable
    \global\let\eqQT=\eq@qT\global\let\eq@qT=\eq@na
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macrocode}
\def\eq@na{na} % not applicable
\let\eq@qT=\eq@na
% end dps 12/20/03
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\PTsHook}
% Used to typeset the number of points.
%    \begin{macrocode}
\newcommand\PTsHook[1]{\def\PTs@Hook{#1}}
\let\PTs@Hook=\@empty
\let\eq@PTs=\@empty
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\eqGradeScale}
% This is an array of letter grades and grade ranges. This macro is use as the argument
% of the JS function \texttt{GetGrade}.
%    \begin{macrocode}
\newcommand\eqGradeScale{%
    "A",[90, 100],"B",[80,90],"C",[70,80],"D",[60,70],"F",[0,60]}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\ScoreField}
%     This text field will receive the scores
%     of a quiz.  The command \cmd{\eqScore} was defined
%     in Section~\ref{ss:ldm}.  This command takes an optional
%     argument and a required argument.
%\begin{verbatim}
%#1 = one or more commands that will customize the design of the
%     field.  See the manual for examples.
%#2 = Base name of the quiz
%\end{verbatim}
%    \begin{macrocode}
\def\ScoreFieldDefaults
{%
    \Ff{\FfReadOnly}\BC{1 0 0}\BG{}\S{N}
    \DV{\eqScore}\V{\eqScore}
}
\newcommand\ScoreField[2][]
{%
    \medskip\text@@Field{#1}{ScoreField.#2}{\SFW}%
        {\DefaultHeightOfWidget}{}{\eq@setWidgetProps\eq@TextField}%
        {\ScoreFieldDefaults\every@eqTextField\every@ScoreField}%
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\GradeField}
% This command creates a text field that shows the letter grade of the user's
% effort on the current quiz.
%    \begin{macrocode}
\def\GradeFieldDefaults
{%
    \textColor{0 0 1 rg}
    \BC{1 0 0}\BG{1 1 1}\S{N}
    \Ff{\FfReadOnly}\Q{1}
}
\newcommand\GradeField[2][]
{%
    \medskip\text@@Field{#1}{GradeField.#2}{20bp}%
        {\DefaultHeightOfWidget}{}{\eq@setWidgetProps\eq@TextField}%
        {\GradeFieldDefaults\every@eqTextField\every@GradeField}%
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\AnswerField}
% This command creates a text field to receive the answers to the
% fill-in questions.
%    \begin{macrocode}
\def\AnswerFieldDefaults
{%
   \BC{0 0 0}\S{N}\Ff{\FfReadOnly}
 }
\newcommand\AnswerField[2][]
{%
    \text@@Field{#1}{Ans.#2}{\RBW}{\DefaultHeightOfWidget}%
        {}{\eq@setWidgetProps\eq@TextField}%
        {\AnswerFieldDefaults\every@eqTextField\every@AnswerField}%
}
%    \end{macrocode}
%    \end{macro}
% Now let's define some additional text fields for the quiz environment.
%    \begin{macro}{\PointsField}
% This command creates a text field which displays the number of points in the
% quiz scored by the user of the \texttt{quiz}.
%    \begin{macrocode}
\def\PointsFieldDefaults
{%
   \rawPDF{}\BC{1 0 0}\BG{}\S{N}\Ff{\FfReadOnly}
 }
\newcommand\PointsField[2][]
{%
    \medskip\text@@Field{#1}{PointsField.#2}{\SFW}%
        {\DefaultHeightOfWidget}{}{\eq@setWidgetProps\eq@TextField}%
        {\PointsFieldDefaults\every@eqTextField\every@PointsField}%
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\PercentField}
% This command creates a text field which displays user's score in percent
% form.
%    \begin{macrocode}
\def\PercentFieldDefaults
{%
    \rawPDF{}\BC{1 0 0}\BG{}\S{N}\Ff{\FfReadOnly}%
}
\newcommand\PercentField[2][]
{%
    \medskip\text@@Field{#1}{PercentField.#2}{\SFW}%
        {\DefaultHeightOfWidget}{}{\eq@setWidgetProps\eq@TextField}%
        {\PercentFieldDefaults\every@eqTextField\every@PercentField}%
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\RestoreScoreField}
% Reset the score field to its default, in case some author
% changed things.
%    \begin{macrocode}
\newcommand\RestoreScoreField
{%
    \global\let\eqScore=\eq@Score
    \global\let\eqOutOf=\eq@OutOf
}
%    \end{macrocode}
%    \end{macro}
%
% \section{Multiple Choice Alternatives}
% \subsection{For \texttt{shortquiz}}
% \subsubsection{The \texttt{answers} Environment}
%    \begin{macro}{\answers}
% The alternatives of a multiple choice question are enclosed in
% the \texttt{answers} environment.
% This environment takes an optional argument, and one
% required argument.  The required parameter is the number of
% columns to  construct in the underlying \texttt{tabular}
% environment; the presence of the optional argument means the author
% wants to include the solution to this quiz question.  The value of
% the optional parameter is the named destination of the solution.
% The optional parameter for the named destination can also be a
% `\texttt*', in which case a name of \texttt{\string\curr@quiz.\string\thequestionno}
% is assigned.
%    \begin{macrocode}
%</package>
%<*package|eqexam>
\def\answers@sq{\stepcounter{questionno}%
    \if\sqstar*\relax\let\@Ans=\Ans@sq@f\else\let\@Ans=\Ans@sq@l\fi
    \def\answerType{r}%
    \@ifnextchar[{\answers@@sq}%
    {\@ifstar{\answers@@sq[\curr@quiz.\thequestionno]}{\answers@@sq[]}}}
% dps 4/16/05
\def\manswers@sq{\stepcounter{questionno}%
    \if\sqstar*\relax\let\@Ans=\Ans@ck@sq@f\else\let\@Ans=\Ans@ck@sq@l\fi
    \def\answerType{c}%
    \@ifnextchar[{\answers@@sq}%
    {\@ifstar{\answers@@sq[\curr@quiz.\thequestionno]}{\answers@@sq[]}}}
%    \end{macrocode}
%    \end{macro}
%\begin{verbatim}
% #1 = named destination to be associated with solution
% #2 = number of columns in the tabular environment
%\end{verbatim}
% If the number of columns specified, then we use a list environment.
%    \begin{macrocode}
\let\sq@hwdest=\@empty % hard-wired destination
\def\answers@@sq[#1]#2{%
    \gdef\numCols{#2}%
    \ifx\sq@hwdest\@empty
        \xdef\@qzsolndest{#1}%
    \else
        \gdef\@qzsolndest{\sq@hwdest}%
    \fi
    \ifx#21\gdef\eq@listType{1}\expandafter\answers@sq@list\else
    \gdef\eq@listType{0}\expandafter\answers@@sq@tabular\fi{#2}%
}
%    \end{macrocode}
%    \begin{macro}{\setMClabelsep}
% \changes{v6.05e}{2006/18/06 v6.05e}
% {
%   Added control over the separation between the MC label and subsequent text:
%   \cs{setMClabelsep} and \cs{resetMClabelsep}.
% }
%    \begin{macro}{\resetMClabelsep}
%    \begin{macro}{\eq@hspanner}
%    \begin{macro}{\eq@hspanner@default}
% Some convenience macros for computing the width of labels. The command \cs{setMClabelsep}
% can be used to set the separation between the MC label and the beginning of text.  The
% argument for this command is anything that takes up horizontal space. The command sets
% the value of \cs{eq@hspanner}. The default value % of the separation is given by \cs{eq@hspanner@default}.
% The default value can be restored by executing \cs{resetMClabelsep}.
%    \begin{macrocode}
\def\eq@hspanner{\ }
\def\eq@hspanner@default{\ }
\def\eq@lw@l{\eq@l@l\eq@hspanner}
\def\setMClabelsep#1{\def\eq@hspanner{#1}}
\def\resetMClabelsep{\let\eq@hspanner\eq@hspanner@default}
%    \end{macrocode}
% For the link-style MC question, the default width, \cs{eq@l@l}, of the label is the normalsize width of
% `(d)'. For a form checkbox or radiobutton bux, the default width, cs{eq@lw@f}, is \cs{RadioFieldSize},
% normally defined as \texttt{11bp}.
%    \begin{macrocode}
\def\eq@l@l{\normalsize\normalfont(d)}
\def\eq@lw@f{\kern\RadioFieldSize\eq@hspanner}
%    \end{macrocode}
%    \end{macro}
%    \end{macro}
%    \end{macro}
%    \end{macro}
% This macro will pick up the 0 (false) or 1 (true) of the \cs{Ans} command.
%    \begin{macrocode}
%\newcommand\Ans@list[2][0]{\gdef\eq@pPTs{#1}%
%    \xdef\Ans@choice{#2}\item\relax}
\newcommand\Ans@list[2][0]{\gdef\eq@pPTs{#1}%
    \xdef\Ans@choice{#2}\item\relax\if\eq@listType1%
    \addtocounter{quizno}{-1}\refstepcounter{quizno}\fi}
%    \end{macrocode}
% Answers environment for a list environment.
%    \begin{macrocode}
\newenvironment{answers@sq@list}[1]
{%
    \if\answerType r
        \let\endanswers=\endanswers@sq@list
    \else
        \let\endmanswers=\endanswers@sq@list
    \fi
    \vskip\aboveanswersSkip
    \begin{list}{\strut\@Ans}%\begin{list}{\strut\@Ans\ }
    {%
%        \usecounter{list@partno}%
        \if\sqstar*\relax
            \settowidth{\labelwidth}{\eq@lw@f}%
        \else
            \settowidth{\labelwidth}{\eq@lw@l}%
        \fi
        \setlength{\parsep}{0pt}\setlength{\itemindent}{0pt}%
        \setlength{\topsep}{0pt}\setlength{\partopsep}{0pt}%
        \setlength{\listparindent}{\parindent}%
        \setlength{\leftmargin}{\labelwidth}%
        \setlength{\labelsep}{0pt}%
        \def\Ans{\Ans@list}%
%       \def\Ans{\item\relax\eq@Ans}%
    }%
}%
{\end{list}\setcounter{quizno}{0}}
%    \end{macrocode}
% Answers environment for a tabular environment.
%    \begin{macrocode}
\newcommand\Ans@tabular[2][0]{\gdef\eq@pPTs{#1}%
    \xdef\Ans@choice{#2}\leavevmode\@Ans
}
\def\answers@@sq@tabular#1{%
    \vskip\aboveanswersSkip\noindent\tabcolsep=0pt
    \eq@tmpdima=\linewidth \divide \eq@tmpdima by#1 %
    \def\Ans{\Ans@tabular}%
    \begin{tabular}{*{#1}{p{\eq@tmpdima}}}}%
%    \end{macrocode}
%    \begin{macro}{\endanswers}
%    Close off \texttt{tabular} environment, and reinitialize the
%    \texttt{quizno} counter.
%    \begin{macrocode}
\def\endanswers@sq{\end{tabular}\setcounter{quizno}{0}}%
\def\endmanswers@sq{\end{tabular}\setcounter{quizno}{0}}%
\def\popiiictm{\special{CTM: pop pop pop}}
%</package|eqexam>
%<*package>
%    \end{macrocode}
%    \end{macro}
% \subsubsection{Link Style}
%    \begin{macro}{\Ans@sq@l}
% For the link multiple choice type question. The driver independent stuff starts
% here, then goes to |\Ans@sq@l@driver| the rest of the code that depends on the
% driver.
%    \begin{macrocode}
%\def\sqWrongRespJS{app.alert(\eqsqwgmsg,3);}
%\def\sqRightRespJS{app.alert(\eqsqrtmsg,3);}
\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 <</S/GoTo/D(\@qzsolndest)>>
            \fi
        \fi
    \else
        \JS{\sqWrongRespJS\jsR
        \ifx\oField\@empty\else
            updateTally("\oField.\thequestionno");
        \fi}%
    \fi
    }%
}
\def\linkContentFormat{\alph{quizno}}
%</package>
%<*eqexam>
\def\linkContentFormat{%
    \if\probstar*\arabic{quizno}\else\alph{quizno}\fi}
%</eqexam>
%<*package|eqexam>
%\def\linkContentFormat{\alph{quizno}}
\def\linkContentWrapper{(\hfil\linkContentFormat\hfil)}%
\def\Ans@sq@l{%
    \leavevmode\if\eq@listType1\stepcounter{quizno}%
    \else\refstepcounter{quizno}\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
%</package|eqexam>
%<*eqexam>
    \Ans@sq@l@driver
%</eqexam>
%<*package>
    \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}%
%</package>
%<*package|eqexam>
\eq@hspanner\ignorespaces}
%</package|eqexam>
%<*package>
%    \begin{macro}{\Ans@ck@sq@l}
% Created in support of eqExam to give multiple selection for the
% online and email options.  Otherwise, it defaults to a radio button field.
%    \begin{macrocode}
%</package>
%<*package|eqexam>
% dps 4/16/05
\let\Ans@ck@sq@l=\Ans@sq@l
%</package|eqexam>
%<*package>
%    \end{macrocode}
%    \end{macro}
% \subsubsection{Form Style}
%    \begin{macro}{\Ans@sq@f}
% For the link multiple choice type question. The driver independent stuff starts
% here, then goes to |\Ans@sq@f@driver| the rest of the code that depends on the
% driver.
%    \begin{macrocode}
\def\@@Ans@sq@f@Defaults
{%
    \BC{0 0 0}\Ff{\FfNoToggleToOff}
    \textSize{12}\textColor{0 g}
}
%    \end{macrocode}
% For short quizzes, refine the type of responses: turn off the alert message (the default is on);
% or have a (red) `\texttt{x}' make an incorrect answer, and a (green) check mark a correct answer.
%    \begin{macrocode}
\def\sqTurnOffAlerts{\let\@sqTurnOffAlerts=0}
\def\sqTurnOnAlerts{\let\@sqTurnOffAlerts=1}
\sqTurnOnAlerts
\def\sqNoCorrections{\let\@sqAlertsOnly=1}
\def\sqCorrections{\let\@sqAlertsOnly=0}
\sqNoCorrections
%    \end{macrocode}
% The actions for the form version of a multiple choice question of a shortquiz.
%    \begin{macrocode}
\def\Ans@sq@f@Actions
{%
    \A{\if\Ans@choice1%
        \JS{event.target.textColor=\correctColor;\jsR
            event.target.style=style.ch;\jsR
            \if\@sqTurnOffAlerts1OnBlurRespBox( true, "\oField" );\fi}%
        \ifx\@qzsolndest\@empty\else
            \ifeq@solutionsafter\else
                /Next <</S/GoTo/D(\@qzsolndest)>>
            \fi
        \fi%
    \else
        \JS{event.target.textColor=\wrongColor;\jsR
            event.target.style=style.cr;\jsR
            \if\@sqTurnOffAlerts1OnBlurRespBox( false, "\oField" );\fi
        \ifx\oField\@empty\else\jsR
            updateTally("\oField.\thequestionno");
        \fi}%
    \fi%
    }%
}
\def\Ans@proofing
#1{%
    \ifeq@proofing\if\Ans@choice1\relax
        \llap{\@proofingsymbol\,\hskip#1\relax}%
    \fi\fi
}
%</package>
%<*package|eqexam>
\def\Ans@sq@f{%
    \if\eq@listType1\stepcounter{quizno}%
    \else\refstepcounter{quizno}\fi\PBS\raggedright
    \settowidth{\eq@tmplength}{\eq@lw@f}%
    \eq@tmpdima=\wd\eq@tmpbox%
    \hangindent=\eq@tmplength\hangafter=1\relax
%</package|eqexam>
%<*eqexam>
    \Ans@sq@f@driver
%</eqexam>
%<*package>
    \insertGrayLetters\radio@@Button{}{mc.\oField.\thequestionno}{\RadioFieldSize}%dps 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}%
%</package>
%<*package|eqexam>
\eq@hspanner\ignorespaces}
%</package|eqexam>
%<*package>
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\Ans@ck@sq@f}
% Created in support of eqExam to give multiple selection for the
% online and email options.  Otherwise, it defaults to a radio button field.
%    \begin{macrocode}
%</package>
%<*package|eqexam>
% dps 4/16/05
\let\Ans@ck@sq@f=\Ans@sq@f
%</package|eqexam>
%<*package>
%    \end{macrocode}
%    \end{macro}
% \subsection{For \texttt{quiz}}
% \subsubsection{The \texttt{answers} Environment}
%    \begin{macro}{\answers}
% This is the answers environment for the \texttt{quiz}
% environment.  The \texttt{quiz} environment states
% \verb+\let\answers=\answers@q+.  This is to avoid a conflict
% with \texttt{shortquiz}, which also as an \texttt{answers}
% environment.
%\begin{verbatim}
% #1 = named destination to be associated with solution
% #2 = number of columns in the tabular environment
%\end{verbatim}
% If the number of columns is $1$, then we use a list environment,
% else, we use a tabular environment.
%    \begin{macrocode}
%</package>
%<*package|eqexam>
\newlength\aboveanswersSkip
\setlength\aboveanswersSkip{3pt}
%</package|eqexam>
%<*package>
\let\q@hwdest=\@empty % hard-wired destination
\newcommand\answers@q
{%
    \addtocounter{eqpointvalue}{\eqPTs}\stepcounter{questionno}%
    \@ifnextchar[{\answers@@q}%
    {\@ifstar{\answers@@q[\curr@quiz.\thequestionno]}{\answers@@q[]}}%
}
\def\answers@@q[#1]#2%
{%
    \gdef\numCols{#2}%
    \edef\eqtmp{\aPointType}\xdef\aPointType{\eqtmp,[\eqPTs,"mc"]}%
        \ifx\q@hwdest\@empty
            \xdef\@qzsolndest{#1}%
        \else
            \gdef\@qzsolndest{\q@hwdest}%
        \fi
    \ifx#21\gdef\eq@listType{1}\expandafter\answers@q@list\else
    \gdef\eq@listType{0}\expandafter\answers@q@tabular\fi{#2}%
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macrocode}
\newenvironment{answers@q@list}[1]
{%
    \let\endanswers=\endanswers@q@list
    \vskip\aboveanswersSkip
    \begin{list}{\strut\@Ans}%\
    {%
%        \usecounter{list@partno}%
%        \if\qstar*\relax
        \ifx\@Ans\Ans@f
            \settowidth{\labelwidth}{\eq@lw@f}%
        \else
            \settowidth{\labelwidth}{\eq@lw@l}%
        \fi
        \setlength{\parsep}{0pt}\setlength{\itemindent}{0pt}%
        \setlength{\listparindent}{\parindent}
        \setlength{\leftmargin}{\labelwidth}%
        \setlength{\labelsep}{0pt}
        \def\Ans{\Ans@list}%
        %\def\Ans{\item\relax\eq@Ans}%
    }%
}{\end{list}\setcounter{quizno}{0}%
% dps 12/20/03
    \setdefault@Ans
}
%    \end{macrocode}
%    \begin{macrocode}
\def\answers@q@tabular#1{%
    \vskip\aboveanswersSkip\noindent\tabcolsep=0pt
    \eq@tmpdima=\linewidth \advance\eq@tmpdima-\leftskip
        \divide\eq@tmpdima by#1
    \def\Ans{\Ans@tabular}%
    \let\endanswers=\endanswers@q@tabular
    \begin{tabular}{*{#1}{p{\eq@tmpdima}}}%
}
%    \end{macrocode}
%    \begin{macro}{\endanswers}
% Again, we put \verb+\let\endanswers=\endanswers@q+.
%    \begin{macrocode}
\def\endanswers@q@tabular
{%
    \end{tabular}\setcounter{quizno}{0}%
% dps 12/20/03
    \setdefault@Ans
}
%    \end{macrocode}
%    \end{macro}
% \subsubsection{Link Style}
%    \begin{macro}{\Ans@l}
% For the forms version of the \texttt{quiz} environment.
%    \begin{macrocode}
% \#1 = 0 or 1 (wrong or right)
% dps 12/19/03 removed the notify because we are not embedding a radio button field
\def\Ans@@l@Actions
{%
    \A{\JS{%
       this.getField("mc.\curr@quiz.\thequestionno").value = "\Ans@choice\alph{quizno}";\jsR
       RecordPointValue([0,\eqPTs,\eq@pPTs],\thequestionno);\jsR
       RecordProblemType("\eqQT",\thequestionno);\jsR
       ProcessQuestion(\Ans@choice,"\alph{quizno}",\thequestionno,%
       \arabic{quizno},"\curr@quiz",0,\ifeq@nocorrections0\else1\fi,%
       "\bqlabelISO"\ifx\eqQuizType q\ifx\eq@online y\ifeq@noquizsolutions\else,1\fi\fi\fi)}%
    }
}
\def\Ans@r@l@Defaults
{%
    \BC{}\S{S}\W{1}\Ff{\FfNoToggleToOff}
    \textSize{12}\textColor{0 g}
}
\def\Ans@l{%
    \leavevmode\if\eq@listType1\stepcounter{quizno}%
    \else\refstepcounter{quizno}\fi\PBS\raggedright
    \settowidth{\eq@tmplength}{\eq@lw@l}\sbox{\eq@tmpbox}{\eq@l@l}%
    \hangindent=\eq@tmplength\hangafter=1\relax
    \eq@tmpdima=\wd\eq@tmpbox
    \def\link@@Content{(\hfil\linkContentFormat\hfil)}%
% begin dps changes 12/19/03
    \makebox[0pt][l]{\radio@@Button{}{mc.\curr@quiz.\thequestionno}%
        {\eq@tmpdima}{\RadioFieldSize}{\Ans@choice\alph{quizno}}%
        {\eq@protect\A}{\eq@setWidgetProps\eq@l@check@driver}%
        {\Ans@r@l@Defaults\every@RadioButton\every@qRadioButton}}%
% end dps changes 12/19/03
    \set@@Link{}{}{}%
    {\makebox[\eq@tmpdima]{\color{\@linkcolor}\link@@Content}}%
    {\eq@protect\A}{\eq@setWidgetProps\setLink@driver}%
    {\set@LinkTextDefaults\Ans@@l@Actions\every@Link}%
    \ifeq@nocorrections\else
        \if\Ans@choice1\relax
            \edef\Ans@c@l@Choice{\noexpand\DV{Yes}%
                \ifx\@qzsolndest\@empty\noexpand\BC{}\noexpand\Ff{\FfReadOnly}%
                \else % there is a solution to this multiple choice question
                    \ifeq@noquizsolutions
                        \noexpand\BC{}\noexpand\Ff{\FfReadOnly}%
                    \else
                        \noexpand\BC{0 .6 0}\noexpand\A{\noexpand\quiz@SolutionActionHook}%
                    \fi
                \fi
            }%
        \else
            \def\Ans@c@l@Choice{\Ff{\FfReadOnly}\BC{}}%
        \fi
        \makebox[0pt][r]{\check@@Box{}%
            {mcq.\curr@quiz.\thequestionno.\arabic{quizno}}%
            {\eq@tmpdima}{0pt}{Yes}{}% \@tempdimb
            {\eq@setWidgetProps\eq@l@check@driver}% \eq@RadioCheck@driver
            {\Ans@c@f@Defaults\Ans@c@l@Choice\every@RadioButton
             \every@qRadioButton}}%
    \fi
    \Ans@proofing{\eq@tmpdima}%
\eq@hspanner\ignorespaces}
%    \end{macrocode}
%    \end{macro}
% \subsubsection{Form Style}
%    \begin{macro}{\Ans@f}
% For the form button multiple choice type question. The driver independent stuff starts
% here, then goes to |\Ans@f@driver| the rest of the code that depends on the
% driver.
%    \begin{macrocode}
%\def\Ans@f{\leavevmode\refstepcounter{quizno}\PBS\raggedright\Ans@@f}
\def\Ans@f{\leavevmode\if\eq@listType1\stepcounter{quizno}%
    \else\refstepcounter{quizno}\fi\PBS\raggedright\Ans@@f}
\def\Ans@r@f@Defaults
{%
    \BC{0 0 0}\S{S}\W{1}\Ff{\FfNoToggleToOff}
    \textSize{12}\textColor{0 g}
}
% Action of the radio button field
\def\Ans@r@f@Actions
{%
    \A{\JS{%
        RecordPointValue([0,\eqPTs,\eq@pPTs],\thequestionno);\jsR
        RecordProblemType("\eqQT",\thequestionno);\jsR
        ProcessQuestion(\Ans@choice,"\alph{quizno}",\thequestionno,%
        \arabic{quizno},"\curr@quiz",0,\ifeq@nocorrections0\else1\fi,%
        "\bqlabelISO"\ifx\eqQuizType q\ifx\eq@online y\ifeq@noquizsolutions\else,1\fi\fi\fi);}%
    }
}
% Action of the check box underlying the radio button field
\def\quiz@SolutionActionHook{%
    /S/GoTo/D(\@qzsolndest)/Next<<\JS
    {this.resetForm(["mcq.\curr@quiz.\thequestionno.\arabic{quizno}"]);}>>
}
\def\Ans@c@f@Defaults
{%
    \BC{0 0 0}\S{S}\W{1}\F{\FHidden}\textSize{12}\textColor{0 .6 0 rg}
    \symbolchoice{circle}
}
%    \end{macrocode}
% \changes{v6.05d}{2007/04/14}
% {
%   Added the command \cs{insertGrayLetters}. This can be defined to place symbols under
%   the multiple choice form boxes. The command \cs{bottomOfAnsfStack} is there as a
%   hook for whatever purposes are desired.
% }
%    \begin{macrocode}
\let\bottomOfAnsfStack\relax
\def\insertGrayLetters{\ifaebshowgrayletters
    \rlap{\makebox[\RadioFieldSize]{\textcolor{gray}{\Alph{quizno}}}}\else\relax\fi}
\def\Ans@@f
{%
    \settowidth{\eq@tmplength}{\eq@lw@f}%
    \hangindent=\eq@tmplength\hangafter=1
    \bottomOfAnsfStack\insertGrayLetters
    \radio@@Button{}{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}%
    \ifeq@nocorrections\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\BC{0 .6 0}\noexpand\A{\noexpand\quiz@SolutionActionHook}%
                    \fi
                \fi
            }%
        \else
            \def\Ans@c@f@Choice{\Ff{\FfReadOnly}}%
        \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@RadioButton
             \every@qRadioButton}}%
    \fi
    \Ans@proofing{\RadioFieldSize}%
\eq@hspanner\ignorespaces}
%</package>
%<*package|eqexam>
%    \end{macrocode}
%\subsection{The \cs{bChoices}/\cs{eChoices} Pair}
% (2/15/05) This pair of macros is not really an environment, the
% \cs{eChoices} really does nothing other than to act as an ending marker. The idea
%behind this pair of macros twofold: (1) To provide a convenient way of listing
%alternate choices for a multiple choice questions, the ``environment'' makes it
%easy to change the number of columns, or to change from tabular to list (or visa-versa);
%(2) Laying out the alternatives in a list style, makes it easy to develop techniques
%of randomizing the alternatives. Here is an example of usage:
%\begin{verbatim}
%\begin{answers}{4}
%\bChoices[2]
%    \Ans0 a choice\eAns
%    \Ans1 another choice\eAns
%    \Ans0 still another choice\eAns
%    \Ans0 another\eAns
%    \Ans0 incoming\eAns
%    \Ans0 more choices\eAns
%    \Ans0 another still\eAns
%    \Ans0 too many\eAns
%    \Ans0 choices\eAns
%\eChoices
%\end{answers}
%\end{verbatim}
%\noindent The argument of the \texttt{answers} environment is $4$ which means we are
%going to use the tabular environment with $4$ columns. Now within those $4$ we are going
%to only use the first $2$ columns ( this is the optional argument of \cs{bChoices}.
%
% If the optional argument is removed from \cs{bChoices}, the choices are typeset
% in the with $4$ columns. If the argument of \cs{answers} is changed to $1$, then the
% optional argument of \cs{bChoices} is ignored, and the alternatives are typeset in a
% one column list environment.
%
% By changing the two parameters (one for \cs{answers} and one for \cs{bChoices})
% you can easily modify how the alternatives are typeset.
%\par\medskip\noindent
% This counter tracts the column number we are in.
%    \begin{macrocode}
\newcount\eq@tabColCnt
%    \end{macrocode}
%    \begin{macro}{\bChoices}
% This command has one optional argument, the number of columns to use.
%    \begin{macrocode}
\def\bChoices{\@ifnextchar[{\@ansChoices}{\@ansChoices[\numCols]}}
%    \end{macrocode}
% If \cs{numCols} is $1$, we use a list environment, otherwise, a tabular is used.
%    \begin{macrocode}
\def\@ansChoices[#1]%
{%
    \global\eq@tabColCnt=0
    \ifnum\numCols=1 % list mode
        \def\eq@next{\@layoutListAns}%
    \else % tabular mode
         \def\eq@next{\@layoutTabularAns{#1}}%
    \fi
    \eq@next
}
\let\eChoices=\relax
%    \end{macrocode}
%    \end{macro}
% If the next token is \cs{Ans} we grab its all stuff between
% \cs{Ans} and \cs{eAns} and typeset it. We continue until the
% next token is not \cs{Ans}. (This last token
% should be \cs{eChoices}.)
%    \begin{macrocode}
\def\@layoutListAns{\@ifnextchar\Ans{\@getListAns}%
    {\@lookforendansChoices{\@layoutListAns}}%
}
\long\def\@getListAns\Ans#1\eAns{%
    \Ans#1\vspace{\@rowskip}%
    \@layoutListAns
}
\long\def\@lookforendansChoices#1{%
    \@ifnextchar\eChoices{\rowsep{\rowsep@default}%
        \expandafter\@findendans\@gobble}{\expandafter#1\@gobble}%
}
%    \end{macrocode}
% The argument is the number of columns to typeset, this number
% is forced to be \texttt{<=} to the number of columns specified in the \texttt{answers}
% environment.
%    \begin{macrocode}
\def\@layoutTabularAns#1{%
    \let\eq@tabSep=\@empty
    \gdef\numShortCols{#1}%
    \ifnum#1>\numCols \xdef\numShortCols{\numCols}\fi
    \@@layoutTabularAns
}
%    \end{macrocode}
% If the next token is \cs{Ans} we grab its all stuff between
% \cs{Ans} and \cs{eAns} and typeset it and insert the appropriate
% token, either \texttt{\&} or \texttt{\string\cr}.
% We continue until the next token is not \cs{Ans}. (This last token
% should be \cs{eChoices}.)
%    \begin{macrocode}
\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{%
    \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}}%
%        \global\eq@tabColCnt=0 \xdef\eq@tabSep{\noexpand\\\@rowsep}%
    \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{}{\expandafter\@findendans\@gobble}}
%</package|eqexam>
%    \end{macrocode}
%    \end{macro}
%\subsection{In Support of showgrayletters}
% This is a hack to reference multiple choice questions when the \texttt{showgrayletters}
% option is in effect. We define \cs{REF} to return the uppercase version of the letters.
%    \begin{macrocode}
\def\aeb@exiii{\expandafter\expandafter\expandafter}
%    \end{macrocode}
%    \begin{macro}{\REF}
% Same syntax as \cs{ref}, including a \texttt{*} option. the \texttt{*} version does
% not create a link. If \texttt{showgrayletters} is not in effect, then \cs{REF} is equivalent to
% \cs{ref}.
%\changes{v6.06c}{2007/04/26}
%{
%   Added \cs{REF} in support of the \texttt{showgrayletters} option.
%}
%    \begin{macrocode}
\def\REF{\@ifstar{\aeb@REFstar}{\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}}\tmp@expand
}
%    \end{macrocode}
%    \end{macro}
%    \section{Objective Style Questions}
% The code for objective style questions is very simple. The
% evaluation of the  user's response is done by JavaScript. The
% JavaScript is inserted into the PDF file through DLJS. For
% authors using \textsf{pdftex} or \textsf{dvipdfm}, this process
% is automatic; for authors using the distiller (hence, would use
% the \texttt{dvips} or \texttt{dvipsone} option), the solution is
% also automatic if you  use \textbf{Acrobat 5.0}. If you do not have
% the latest version  of Acrobat, the DLJS must be inserted
% manually using the \texttt{Document > Insert Pages} menu item. See
% paragraphs below for a little more detail, or see the manual.
%
% There are two kinds of questions that can be posed (actually only one type):
% (1) a question that has a numerical answer;
% (2) a question that has a symbolic answer in one variable,
% $x$. The symbolic answer must reduce, however, to a numerical value when
% $x$ is given a numerical value.  Thus, only questions whose answers can
% be reduced to numerical values can be posed.
%
% If the author has Acrobat 5.0, the \textsf{exerquiz} package should be
% built using the \texttt{Acrobatv} option in the
% \textsf{exerquiz.ins} file. In this case, Document level
% Javascript will be input when the newly distilled file is
% first opened in the Acrobat Viewer. If the function ``CkBalP'' is
% undefined, the we input the FDF file contained the Doc Level JS.
% The file needs to be saved (Save As) for the Doc Level JS to
% remain in the PDF file.
%
% In the case of the author using Acrobat 4.0, he/she needs to load manually
% insert the \texttt{eq\_DLJS.pdf} file. If only exercises are used, this insertion is not needed.
%    \begin{macrocode}
%<*package>
%    \end{macrocode}
%    \begin{macro}{\oQuestion}
% This was my first attempt and I have not deleted it from the package yet.
% Useful for posing a single question only. The argument is the (unique) name
% of this question. This name is used to define the macro \cmd{\oField} which is used
% by support macros.  The \texttt{shortquiz} environment can also be used for
% single/multiple questions as well.
%    \begin{macrocode}
\newenvironment{oQuestion}[1]
{%
    \gdef\oField{#1}\gdef\curr@quiz{#1}\def\currQuiz{#1}%
    \let\@qzsolndest=\@empty
%    \setcounter{questionno}{0}
    \stepcounter{questionno}%
    \let\eqQuizType=s\gdef\eqPTs{1}\global\let\eqQT=\eq@na%
    \let\solution=\solution@sq
    \let\endsolution=\endsolution@sq
}{}
\def\oSolution#1{\edef\@qzsolndest{#1}}
%    \end{macrocode}
%    \end{macro}
%    \subsection{Math Fill-In Questions}
%    \begin{macro}{\RespBox}
%    \begin{macro}{\RespBoxMath}
%    \begin{macro}{\RespBoxNT}
% \cmd{\RespBox} and \cmd{\RespBoxNT} lay out a text box, into which the
% user enters his/her response to the question. \cmd{\RespBox} expects the presence
% of \cmd{\sqTallyBox}, whereas \cmd{\RespBoxNT} does not (NT = No Tally ).
%\par\medskip
% Usage: |\RespBox[#1]#2(#3)[#4]#5#6#7#8[#9]*#10|
% \begin{description}
% \item[\ttfamily\#1 :] Optional parameter used to modify the appearance of the
%     text field.
% \item[\ttfamily\#2 :] The correct answer to the question.
%     This must be a numerical value, or a function of one variable.
%     JavaScript Note:
%     In JavaScript, functions such as \texttt{sin(x)} and \texttt{cos(x)} are
%     methods of the \texttt{Math} object.  It is not necessary, however, to
%     type \texttt{Math.sin(x)} or \texttt{Math.cos(x)}; this is done by inserting
%     the expression into a \texttt{with(Math)} group.
% \item[\ttfamily\#3 :] An optional parameter, \textit{delimited by parentheses},
% that defines the independent variable; \texttt{x}, is the default value. Note
% that this parameter is set off by parentheses.  For a multivariate question, just
% list the variables in juxtaposition, \texttt{(xyz)}.  An alternate method is to
% delimit with commas \texttt{(x,y,n)} and include the type of the variables
% \texttt{(r:x,r:y,i:n)}, where \texttt{"r"} means a real variable and \texttt{"i"}
% means an integer variable.  The variables must be either of the old style (no commas, no typing)
% or the new style. Do  not mix the styles.
% \item[\ttfamily\#4 :] Optional, a named destination to the solution to the
% question. If this parameter appears, then a solution must follow the
% question, enclosed in a \texttt{solution} environment.
% Alternately, the fourth parameter can be a `\texttt*', in which case, we have
% automatic naming of the destination, namely, \texttt{[\string\curr@quiz.\string\thequestionno]}
% \item[\ttfamily\#5 :] The number of samples points to be used, usually $3$ or $4$ is
% sufficient.
% \item[\ttfamily\#6 :] Precision required, the $\epsilon$ value, if you will.
% \item[\ttfamily\#7 :] Parameters \#7 and \#8 are  used to define the interval from
% which to draw the sample points. There are two forms: (1) \#7 is the left-hand endpoint
% of the interval and \#8 is the right-hand endpoint (the use of \#7 and \#8 in this form
% is deprecated); (2) the interval is defined by standard interval notation, \texttt{[a,b]}.
% For a multivariate question---one where parameter \#2 lists more than one variable,
% separate the intervals for each variable by a `x', \texttt{[0,2]x[1,2]x[3,4]}.
% \item[\ttfamily\#8 :] (1) \#8 is the right-hand endpoint of the interval (the use of this
% parameter is deprecated); (2) in the second
% case, \#8 is not used.
% \item[\ttfamily\#9 :] This optional parameter is either the name of a customized
% comparison function \textit{or} a JavaScript object with at most two properties:
% \texttt{priorParse} and \texttt{comp}. See the demo file \texttt{integer\_tst.tex} for
% examples of usage.
% \item[\ttfamily\#10:] (Only detected if following an asterisk, `\texttt*')
% The name of a JavaScript function that is to be used to process the user input.
% \end{description}
% Example:
%\begin{flushleft}\footnotesize
%|\RespBoxMath{<exp(t), 2*t, sin(t)>}(t)[soln]{3}{.0001}{[0,1]}[compare]*{ProcVec}|
%\end{flushleft}
% or (the deprecated form)
%\begin{flushleft}\footnotesize
%|\RespBoxMath{<exp(t), 2*t, sin(t)>}(t)[soln]{3}{.0001}{0}{1}[compare]*{ProcVec}|
%\end{flushleft}
%    \begin{macrocode}
\newcommand\RespBoxNT{\def\rbFlag{0}\@RespBox}
\newcommand\RespBox{\def\rbFlag{0}\@RespBox}
\newcommand\RespBoxMath{\def\rbFlag{0}\@RespBox}
%    \end{macrocode}
% These commands can be used define the default appearance of the \cs{RespBoxMath},
% \cs{RespBoxTxt} et al.  This first set controls all standard text fields.
%    \begin{macrocode}
%    \end{macrocode}
% Get any changes in the appearance of the text box
%    \begin{macrocode}
\begin{defineJS}[\catcode`\@=0\relax]{\AAKqRespBoxMath}
if(event.willCommit){
    RecordPointValue(@eqPTs,@thequestionno@ifx@grpquestions1,@thegrpquestionno,@grpPointValue,@grpTotalWeight,"@grpEvalFunction"@fi);
    RecordProblemType("@eqQT",@thequestionno);
    var retn = @processJSfunc(@rbArgs,@compareJSfunc);
    if (retn != null)
        ProcUserResp(retn,event.value,@thequestionno,0@ifx@grpquestions1,@thegrpquestionno@fi);
}
if (!isQuizInitialized("@currQuiz")) {
    @eqObjAlert@space app.alert(InitMsg("@bqlabelISO"),3);
    event.rc = false;
}
\end{defineJS}
\def\RespBoxMathDefaults
{%
    \BC{0 0 0}\S{N}\F{\FPrint}%
}
\def\moreRespBoxMathDefaults
{%
    \edef\@moreRespBoxMathDefaults{%
        \ifx\eqQuizType q\ifx\eq@online y\ifeq@noquizsolutions\else\noexpand\Ff{\FfReadOnly}\fi\fi\fi
    }%
}
\let\eqFormatArg\@empty
\def\@@RespBoxMathActions
{%
    \AA{\ifx\eqQuizType q%
            \AAKeystroke{\AAKqRespBoxMath}
            \AAFormat{\eqFormatArg}
        \else
            \AAKeystroke{if(event.willCommit) {\r\t
                retn = \processJSfunc(\rbArgs,\compareJSfunc);\r
\if\@sqTurnOffAlerts1
                \t OnBlurRespBox(\if\@sqTurnOffAlerts1retn\else null\fi,"\curr@quiz");\r
\fi
                }%
            }
            \AAFormat{\eqFormatArg}%
            \AAOnFocus{\JS{var retn = null;}}%
% dps 2/12/05 A fix for Acro7.0, a change in the blur event, must move this event to
%             keystroke so behavior is the same as in previous versions.
\if\@sqTurnOffAlerts0
            \AAOnBlur{\JS{OnBlurRespBox(\if\@sqTurnOffAlerts1retn\else null\fi,"\curr@quiz");}}%
\fi
        \fi
    }
}
\newcommand\@RespBox[1][]
{%
    \smallskip\ifx\grpquestions0\addtocounter{eqpointvalue}{\eqPTs}\fi
    \ifx\eqQuizType q%
        \def\rbFlag{1}%
        \ifx\grpquestions1%
            \stepcounter{grpquestionno}%
            \def\Fld@name{grpobj.\curr@quiz.\thequestionno.\thegrpquestionno}%
        \else
            \edef\eqtmp{\aPointType}\xdef\aPointType{\eqtmp,[\eqPTs,"math"]}%
            \stepcounter{questionno}%
            \def\Fld@name{obj.\curr@quiz.\thequestionno}%
        \fi
    \else % shortquiz
        \ifx\grpquestions1%
            \stepcounter{grpquestionno}%
            \def\Fld@name{grpobj.\oField.\thequestionno.\thegrpquestionno}%
        \else
            \stepcounter{questionno}%
            \def\Fld@name{obj.\oField.\thequestionno}%dps change from \oField to obj.\oField
        \fi
    \fi
        \moreRespBoxMathDefaults
        \text@@Field{#1}{\Fld@name}{\RBW}{\DefaultHeightOfWidget}%
        {\eq@protect\AA}{\eq@setWidgetProps\eq@RespBox}%
        {\RespBoxMathDefaults\@moreRespBoxMathDefaults\@@RespBoxMathActions\every@eqTextField
        \every@RespBoxMath}%
}
%\newcommand\@RespBox[1][]
%{%
%    \smallskip\addtocounter{eqpointvalue}{\eqPTs}\refstepcounter{questionno}%
%    \ifx\eqQuizType q\def\Fld@name{obj.\curr@quiz.\thequestionno}%
%    \def\rbFlag{1}\edef\eqtmp{\aPointType}\xdef\aPointType{\eqtmp,[\eqPTs,"math"]}%
%    \else\def\Fld@name{\oField.\thequestionno}\fi\moreRespBoxMathDefaults
%    \text@@Field{#1}{\Fld@name}{\RBW}{\DefaultHeightOfWidget}%
%    {\eq@protect\AA}{\eq@setWidgetProps\eq@RespBox}%
%    {\RespBoxMathDefaults\@moreRespBoxMathDefaults\@@RespBoxMathActions\every@eqTextField
%     \every@RespBoxMath}%
%}
%    \end{macrocode}
% Get the second parameter, which is the correct answer to the question, and
% test to see if there is a specification for the optional third parameter,
% which is the variable list, `\texttt x' is the default.
%    \begin{macrocode}
\def\eq@RespBox#1{\gdef\eq@currentAns{#1}%
    \@ifnextchar({\@eq@RespBox{#1}}{\@eq@RespBox{#1}(x)}}
%    \end{macrocode}
% Pick up the optional third parameter, then test whether the optional fourth parameter is there.
% There are two forms: the [mydest] an explicit destination for the solution to the problem, or
% a `\texttt*', in which case, we have automatic naming, the name is
% \texttt{[\string\curr@quiz.\string\thequestionno]}.
%    \begin{macrocode}
\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)[]}}}
%    \end{macrocode}
% Now get the next three parameters: the number of samples, the precision, and the first of the
% two interval parameters.
%    \begin{macrocode}
\def\eq@Zero{0}
\def\defaultRDPrecision#1{\def\eq@defaultRDPrecision{#1}}
\defaultRDPrecision{1E-14}
%    \end{macrocode}
% dps/change 02/23/07 Here we try to implement a suggest of Bruce Wagner. If the tolerance
% is set to zero, then use \texttt{reldiffCompare} as the default compare, and set the tolerance
% to some small value. Here, the small value is the value of the command
% \cs{eq@defaultRDPrecision} which can be set by \cs{defaultRDPrecision}. The default definition
% is \verb!\defaultRDPrecision{1E-14}!.
%    \begin{macrocode}
\def\@eq@RespB@x#1(#2)[#3]#4#5#6{%
    \xdef\@qzsolndest{#3}\def\indepVar{"#2"}%
    \def\eq@precision{#5}\ifx\eq@precision\eq@Zero
    \def\eq@defaultCompare{reldiffCompare}%
        \def\rbArgstmp{\rbFlag,"#1",#4,\eq@defaultRDPrecision}%
    \else
        \def\eq@defaultCompare{diffCompare}\def\rbArgstmp{\rbFlag,"#1",#4,#5}%
    \fi
%    \end{macrocode}
% We have arrived at the first of possibly two parameters that define the interval(s)
% from which to sample random points. There are two forms, the old style (deprecated)
% and the new style. We must detect which form this is.
%    \begin{macrocode}
    \@checkforInterval#6\\%
}
%    \end{macrocode}
% If the next token is a `\texttt[', then that signals the beginning of an interval
% such as \texttt{[a,b]}, must be the new style. The second parameter is not
% needed, and not expected in this case. It would be a mistake to include it.
%    \begin{macrocode}
\def\@checkforInterval{%
    \@ifnextchar[{\@checkforIntervali}{\@checkforIntervalii}}
%    \end{macrocode}
% This is the case of the new style of defining the interval. We insert it into the
%  arguments list, and continue on to the next stage.
%    \begin{macrocode}
\def\@checkforIntervali#1\\{%
    \def\rbArgs{\rbArgstmp,"#1",\indepVar}%
    \@ifnextchar[{\@eq@@RespBox}{\@eq@@RespBox[\eq@defaultCompare]}%
}
%    \end{macrocode}
% This is assumed to be the old style for defining the interval. In this case, the next
% token is the right-hand endpoint of the interval, we need it.  It would be a mistake
% \texttt{not} to include it. We also test for the presence of the optional
% of a customized comparison function, parameter \texttt{\#9}
%    \begin{macrocode}
\def\@checkforIntervalii#1\\#2{%
    \def\rbArgs{\rbArgstmp,"[#1,#2]",\indepVar}%
    \@ifnextchar[{\@eq@@RespBox}{\@eq@@RespBox[\eq@defaultCompare]}%
}
%    \end{macrocode}
% Finally, we see if there will be a 10th parameter by seeing if `\texttt*' comes
% next. We change the catcodes here, so we can have a left and right brace in the
% optional argument \#9. Hope it works. dps 12/30/03
%    \begin{macrocode}
%\begingroup
%\catcode`\<=1\relax\catcode`\>=2\relax\catcode`\{=12\relax\catcode`\}=12\relax
\def\@eq@@RespBox{\begingroup\catcode`\<=1\relax\catcode`\>=2\relax
    \catcode`\{=12\relax\catcode`\}=12\relax\@eq@@@RespBox}
\def\@eq@@@RespBox[#1]{\endgroup\@ifstar{\jsRespBox[#1]}{\jsRespBox[#1]{ProcResp}}}
%\gdef\@eq@@RespBox<\begingroup\catcode`\<=1\relax\catcode`\>=2\relax\catcode`\{=12\relax\catcode`\}=12\relax
%    \@eq@@@RespBox>
%\gdef\@eq@@@RespBox[#1]<\endgroup\@ifstar<\jsRespBox[#1]><\jsRespBox[#1]<ProcResp>>>
%\def\@eq@@RespBox[#1]{\@ifstar{\jsRespBox[#1]}{\jsRespBox[#1]{ProcResp}}}
%\endgroup
\def\jsRespBox[#1]#2{%
    \def\compareJSfunc{#1}\def\processJSfunc{#2}%
    \ifeq@proofing\makebox[0pt][l]{\space\math@correctAnswer}\fi
    \eq@TextField % send to the driver-dependent macro
}
%    \end{macrocode}
% The primitive \cs{meaning} is used to get a typeset version of the answer for the \texttt{proofing}
% option. I found it a difficult problem because once the answer is scanned, it has catcodes attached.
% Once that is done, it is impossible to use standard methods to make a typeset the answer in
% verbatim mode.  This trick appears in the \TeX book.  \cs{meaning} inserts additional spaces on occasion,
% for example, following a period (`.'). Oh, well.
%    \begin{macrocode}
\def\gobbleMacro#1>{}
\gdef\math@correctAnswer{%
    \ttfamily\color{webgreen}\spaceskip=2pt\xspaceskip=2pt%
    \expandafter\gobbleMacro\meaning\eq@currentAns
}
%    \end{macrocode}
%    \end{macro}
%    \end{macro}
%    \end{macro}
%\subsection{Text Fill-In}
%    \begin{macro}{\RespBoxTxt}
%    \begin{macro}{\RespBoxTxtNT}
% These two macros process open-ended questions that require a text response.
% There are several ways to customize these macros; as described below.
% \par\medskip
% \noindent Usage: |\RespBoxTxt[#1]#2#3[#4]#5<plus listing of alternatives>|
% \begin{description}
% \item[\ttfamily\#1 :] Optional parameter used to modify the appearance of the
%     text field.
% \item[\ttfamily\#2 :] This required parameter is a number that indicates
% the filtering method to be used. Permissible values of this parameter are
% \begin{description}
%     \item[\ttfamily -1: ] (The default) The author's and user's answers are not filtered
%     in any way. (Spaces, case, and punctuation are preserved.)
%     \item[\ttfamily 0: ] The author's and user's answers are converted to
%     lower case, any white space and non-word characters are removed.
%     \item[\ttfamily 1: ] The author's and user's answers are converted to
%     lower case, any white space is removed.
%     \item[\ttfamily 2: ] The author's and user's answers are stripped of any
%     white space.
% \end{description}
% \item[\ttfamily\#3 :] This parameter a number that indicates the compare
% method to be used. Permissible values of this parameter are
% \begin{description}
%     \item[\ttfamily 0: ] (The default) The author's and user's answers are
%     compared for an exact match. (These answers are filtered before they are
%     compared.)
%     \item[\ttfamily 1: ] The user's response is searched in an attempt to
%     get a substring match with the author's alternatives. Additional comparison
%     methods may be added.
% \end{description}
% \item[\ttfamily\#4 :] Optional, a named destination to the solution to the
% question. If this parameter appears, then a solution must follow the
% question, enclosed in a \texttt{solution} environment.
% \item[\ttfamily\#5 :] This required parameter is the number of alternative
% answers that are acceptable. The alternative answers are listed
% immediately after this parameter. (The example above specified
% that $4$ alternatives follow.)
% \end{description}
%    \begin{macrocode}
\newcommand\RespBoxTxtNT{\def\rbFlag{0}\@RespBoxTxt}
\newcommand\RespBoxTxt{\def\rbFlag{0}\@RespBoxTxt}
%    \end{macrocode}
% Pick up any parameters that would modify the appearance of this text field.
%    \begin{macrocode}
\def\RespBoxTxtOnBlur{OnBlurRespBox(\if\@sqTurnOffAlerts1retn\else null\fi,"\curr@quiz");}
\def\eqObjAlert{%
    \ifx\eqQuizType q\ifx\eq@online y\ifeq@noquizsolutions\else if (false)\fi\fi\fi
}
\begin{defineJS}[\catcode`\@=0\relax]{\AAKqRespBoxTxt}
if(event.willCommit){
    RecordPointValue(@eqPTs,@thequestionno@ifx@grpquestions1,@thegrpquestionno,@grpPointValue,@grpTotalWeight,"@grpEvalFunction"@fi);
    RecordProblemType("@eqQT",@thequestionno);
    var retn = ProcRespTxt(@rbTxtAlt);
    if (retn != null)
        ProcUserResp(retn,event.value,@thequestionno,0@ifx@grpquestions1,@thegrpquestionno@fi);
}
if (!isQuizInitialized("@currQuiz")) {
    @eqObjAlert@space app.alert(InitMsg("@bqlabelISO"),3);
    event.rc = false;
}
\end{defineJS}
\def\RespBoxTxtDefaults
{%
    \BC{0 0 0}\W{1}\S{N}\textColor{0 g}\F{\FPrint}%
}
\def\moreRespBoxTxtDefaults
{%
    \edef\@moreRespBoxTxtDefaults{%
        \ifx\eqQuizType q\ifx\eq@online y\ifeq@noquizsolutions\else\noexpand\Ff{\FfReadOnly}\fi\fi\fi
    }%
}
\def\@@RespBoxTxtActions
{%
    \AA{\ifx\eqQuizType q%
            \AAKeystroke{\AAKqRespBoxTxt}
        \else
            \AAKeystroke{%
                if(event.willCommit) {\r\t
                    retn = ProcRespTxt(\rbTxtAlt);\r
\if\@sqTurnOffAlerts1
                \t\RespBoxTxtOnBlur\r
\fi
                }%
            }
            \AAOnFocus{\JS{var retn = null;}}
% dps 2/12/05 A fix for Acro7.0, a change in the blur event, must move this event to
%             keystroke so behavior is the same as in previous versions.
\if\@sqTurnOffAlerts0
            \AAOnBlur{\JS{\RespBoxTxtOnBlur}}%
\fi
        \fi
    }
}
\newcommand\@RespBoxTxt[1][]
{%
    \smallskip\ifx\grpquestions0\addtocounter{eqpointvalue}{\eqPTs}\fi
    \ifx\eqQuizType q%
        \def\rbFlag{1}%
        \ifx\grpquestions1%
            \stepcounter{grpquestionno}%
            \def\Fld@name{grpobj.\curr@quiz.\thequestionno.\thegrpquestionno}%
        \else
            \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}%%dps change from \oField to obj.\oField
    \fi
    \moreRespBoxTxtDefaults
    \text@@Field{#1}{\Fld@name}{\RBW}{\DefaultHeightOfWidget}%
    {\eq@protect\AA}{\eq@setWidgetProps\@@RespBoxTxt}%
    {\RespBoxTxtDefaults\@moreRespBoxTxtDefaults\@@RespBoxTxtActions\every@eqTextField
     \every@RespBoxTxt}%
}
%\newcommand\@RespBoxTxt[1][]
%{%
%    \smallskip\addtocounter{eqpointvalue}{\eqPTs}\refstepcounter{questionno}%
%    \ifx\eqQuizType q\def\Fld@name{obj.\curr@quiz.\thequestionno}%
%    \def\rbFlag{1}\edef\eqtmp{\aPointType}\xdef\aPointType{\eqtmp,[\eqPTs,"text"]}%
%    \else\def\Fld@name{\oField.\thequestionno}\fi\moreRespBoxTxtDefaults
%    \text@@Field{#1}{\Fld@name}{\RBW}{\DefaultHeightOfWidget}%
%    {\eq@protect\AA}{\eq@setWidgetProps\@@RespBoxTxt}%
%    {\RespBoxTxtDefaults\@moreRespBoxTxtDefaults\@@RespBoxTxtActions\every@eqTextField
%     \every@RespBoxTxt}%
%}
%    \end{macrocode}
% Now get the next two required parameters. Also, see if there is going to be a solution.
% This can be specified in two ways: (1) By inserting an explicit named destination \texttt{[mydest]}
% or (2) by specifying a `\texttt*', in which case, automatic naming is performed. The name is
% \texttt{\string\curr@quiz.\string\thequestionno}, \texttt{[\string\curr@quiz.\string\thequestionno]]} is inserted
% as the parameter.
%    \begin{macrocode}
\def\@@RespBoxTxt#1#2{%
    \@ifnextchar[{\@@@RespBoxTxt{#1}{#2}}
        {\@ifstar{\@@@RespBoxTxt{#1}{#2}[\curr@quiz.\thequestionno]}%
            {\@@@RespBoxTxt{#1}{#2}[]}}}
\def\@@@RespBoxTxt#1#2[#3]#4{%
    \xdef\@qzsolndest{#3}%
    \def\numArgs{#4}% check whether this is a positive integer?
    \begingroup
    \gdef\rbTxtAlt{\rbFlag,#1,#2}%
    \count0 = #4 \ifnum\count0 > 0 \expandafter\@argRead\fi
}
\def\@argRead#1{\edef\jsTemp{\rbTxtAlt}\xdef\rbTxtAlt{\jsTemp,"#1"}%
    \@@argRead}
\def\@@argRead{\advance\count0 by-1\relax
    \ifnum\count0=0\relax\def\next{\endgroup\eq@@RespBoxTxt}%
    \else\def\next{\@argRead}%
    \fi\next
}
\def\eq@@RespBoxTxt{%
    \ifeq@proofing\makebox[0pt][l]{\space\txt@correctAnswer}\fi
    \eq@TextField
}
%    \end{macrocode}
% If the \texttt{proofing} option is specified, then we type out the author's list of
% acceptable answers.  Again, we use \cs{meaning}, probably not needed here.
%    \begin{macrocode}
\def\gobbleTxt#1>#2,#3,#4,{}
\gdef\txt@correctAnswer{\ttfamily\color{webgreen}\spaceskip=2pt
    \xspaceskip=2pt\expandafter\gobbleTxt\meaning\rbTxtAlt
}
%    \end{macrocode}
%    \end{macro}
%    \end{macro}
%\subsection{Essay Fill-In}
%    \begin{macro}{\RespBoxEssay}
% Here is a simple text field with a multi-line attribute for entering
% essay-type questions. This question will not be graded by JavaScript,
% of course; ideally, the response will be submitted to a CGI for storage
% in a database. The instructor can later bring up the student's response
% and assign a grade.
%    \begin{macrocode}
\def\RespBoxEssayDefaults
{%
    \BC{0 0 0}\W{1}\S{N}\Ff{\FfMultiline}\rawPDF{}%
}
\def\@@RespBoxEssayActions
{%
    \AA{\ifx\eqQuizType q%
        \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 app.alert(InitMsg("\bqlabelISO"),3);\jsR\jsT
                event.rc = false;\jsR
            }%
        }%
    \fi
    }
}
\newcommand\RespBoxEssay[3][]
{%
    \smallskip\addtocounter{eqpointvalue}{\eqPTs}\stepcounter{questionno}%
    \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}%
}
%    \end{macrocode}
%    \end{macro}
%\subsection{Fields that Support the Fill-Ins}
%    \begin{macro}{\sqTallyBox}
% The \cmd{\sqTallyBox} holds the number of incorrect responses to the
% question. This box is not required to appear. If it does not
% appear, use \cmd{\RespBoxNT} to prevent the doc level JavaScript
% from trying to write a nonexistent text field.
%    \begin{macrocode}
\def\sqTallyBoxDefaults
{%
    \BC{0 0 0}\textColor{1 0 0 rg}\S{I}\Q{2}\Ff{\FfReadOnly}
}
\newcommand\sqTallyBox[1][]
{%
    \text@@Field{#1}{tally.\oField.\thequestionno}%
        {\tally@width}{\DefaultHeightOfWidget}%
        {}{\eq@setWidgetProps\eq@TextField}%
        {\sqTallyBoxDefaults\every@eqTextField\every@sqTallyBox}%
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\sqTallyTotal}
% This text field stores the tally total. Only used within the
% \texttt{shortquiz} environment. Takes on optional parameter; this
% parameter can be used to modify the appearance of the fields.
%    \begin{macrocode}
\def\sqTallyTotalDefaults
{%
    \rawPDF{}\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][]
{%
    \text@@Field{#1}{tallytotal.\oField}{\tally@width}{\DefaultHeightOfWidget}%
        {\eq@protect\AA}{\eq@setWidgetProps\eq@calcTextField}%
        {\sqTallyTotalDefaults\@@sqTallyTotalActions\every@eqTextField
         \every@sqTallyTotal}%
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\CorrAnsButton}
% The \cmd{\CorrAnsButton} is a button macro which, when pressed, will
% display the correct answer for the user. This button is again
% optional. This macro takes one parameter and one optional parameter
%\begin{verbatim}
%#1 : the correct answer as the user should enter it.
%\end{verbatim}
% The value if \texttt{\#1} may be different from the parameter
% \texttt{\#2} in \cmd{\RespBox}; for example, if the answer is
% $x^2$, then \texttt{\#2} of \cmd{\RespBox} would be
% \texttt{pow(x,2)}; but the user would enter |x^2|.
%
% The optional parameter is specified by a star * followed by a
% name of a JavaScript function. The arguments of this JS function
% is the same as that of DisplayAnswer. For example,
%\begin{verbatim}
%\CorrAnsButton{convertFrac('#1','#2')}*{EvalCorrAnsButton}}
%\end{verbatim}
% The JavaScript function might be
%\begin{verbatim}
%function EvalCorrAnsButton(fieldname,theanswer)
%{
%    theanswer = eval(theanswer);
%    DisplayAnswer(fieldname,theanswer);
%}
%\end{verbatim}
% Here, we call a function to evaluate the answer for us.
%    \begin{macrocode}
\def\CorrAnsButtonDefaults
{%
   \CA{\eq@local@CorrAnsButton}\W{1}\S{N}
    \BC{0 0 0}\BG{.7529 .7529 .7529}\H{P}
 }
 \def\qCorrAnsButtonActionHook
 {%
     \JS{%
        \ifx\@qzsolndest\@empty\else
            if (event.shift)\jsR\jsT
                this.gotoNamedDest("\@qzsolndest");\jsR
            else\jsR\jsT
        \fi
        \processJSfunc("Ans.\curr@quiz","\CorrectAns");
     }%
 }
 \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");
     }%
 }
\newcommand\CorrAnsButton[1][]
{%
%    \@ifstar{\let\cabStar=y}{\let\cabStar=n}%
    \eq@CorrAnsButton{#1}%
}
\def\eq@CorrAnsButton#1{\@ifstar{\let\cabStar=y\eq@@CorrAnsButton{#1}}%
    {\let\cabStar=n\eq@@CorrAnsButton{#1}}}
\def\eq@@CorrAnsButton#1#2{%
    \@ifstar{\eq@@@CorrAnsButton{#1}{#2}}{\eq@@@CorrAnsButton{#1}{#2}{DisplayAnswer}}%
}
\def\eq@@@CorrAnsButton#1#2#3{%
    \def\CorrectAns{#2}\def\processJSfunc{#3}%
    \ifx\eqQuizType q\def\Fld@name{corr.\curr@quiz.\thequestionno}%
    \else\def\Fld@name{corr.\oField.\thequestionno}\fi
    \ifx\eqQuizType q%
        \edef\@@CorrAnsButtonActions{\noexpand\F{\FHidden}%
            \ifx\@qzsolndest\@empty\noexpand\BC{0 0 0}\else\noexpand\BC{0 .6 0}\fi
            \noexpand\A{\noexpand\qCorrAnsButtonActionHook}}%
        \ifeq@noquizsolutions\else
            \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{0 0 0}\else\noexpand\BC{0 .6 0}\fi
        \noexpand\A{\noexpand\sqCorrAnsButtonActionHook}}%
        \push@@Button{#1}{\Fld@name}{}{\DefaultHeightOfWidget}%
            {\eq@protect\A}{\eq@setButtonProps\eq@Button@driver}%
            {\CorrAnsButtonDefaults\@@CorrAnsButtonActions\every@ButtonField
            \every@CorrAnsButton}%
    \fi
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\sqClearButton}
% This button will clear the tallyfields and change the color of
% the \cmd{\RespBox} back to \cmd{\eqDefaultColor}. The button clears the fields
% based on the current value of \cmd{\oField}. This text macro is
% given its value when the optional parameter in the
% \texttt{shortquiz} environment is specified.
%    \begin{macrocode}
\def\sqClearButtonDefaults
{%
    \CA{Clear}\RC{}\AC{}\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
           this.resetForm(new Array("mc.\oField","obj.\oField","tally.\oField","grpobj.\oField"));\jsR
           var f = this.getField("\oField");\jsR
           if ( f != null ) f.strokeColor=\eqDefaultColor;\jsR
           f = this.getField("grpobj.\oField");\jsR
           if ( f != null ) f.strokeColor=\eqDefaultColor;\jsR
           \oField = new Object;\jsR
           \oField.Grp = {};\jsR
           appAlerts["\oField"] = {bAfterValue: false};\jsR
           ProcessIt=true;}%
    }
}
\newcommand\sqClearButton[1][]
{%
    \push@@Button{#1}{clear.\oField}{}{\DefaultHeightOfWidget}%
        {\eq@protect\A}{\eq@setButtonProps\eq@Button@driver}%
        {\sqClearButtonDefaults\@@sqClearButtonActions\every@ButtonField
         \every@sqClearButton}%
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\@PromptButton}
% The \cs{@PromptButton} is used to create a ``progressive-style'' question (for math fill-in).
% Some series of questions build on one another. You can use this button to show the solution
% for one problem, so the student can try the next problem. On clicking on the prompt button,
% the student cannot enter another answer in the text field, and the input that is already
% there will be the one that is counted has the student's response.
%    \begin{macrocode}
\def\PromptButtonDefaults
{%
   \CA{Ans}\W{1}\S{N}
    \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."
}
\def\PromptButtonActionHook
{%
     \JS{%
        if (!isQuizInitialized("\currQuiz")) {\r\t
            app.alert(InitMsg("\bqlabelISO"),3);\r\t
            event.rc = false;\r
        } else {\r\t
            if ( ! \currQuiz.oAlertCheck.bAfterValue ) {\r\t
                var resp = app.alert({\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 ( resp == 4 )\r\t
            {\r\t\t
                var field = this.getField("obj.\currQuiz.\thequestionno");\r\t\t
                field.readonly = true;\r\t\t
                this.getField("Ans.\currQuiz").value = "Answer: \PromptAns";\r\t
            }\r
        }
    }%
}
%    \end{macrocode}
% This button takes the standard two arguments
% \begin{flushleft}
% \texttt{\#1}: Optional parameters to change the appearance of the field\\
% \texttt{\#2}: Base name of the current quiz.
% \end{flushleft}
%    \begin{macrocode}
\newcommand\@PromptButton[2][]
{%
    \def\PromptAns{#2}%
    \ifx\eqQuizType q\def\Fld@name{promptButton.\curr@quiz.\thequestionno}%
    \else\def\Fld@name{promptButton.\oField.\thequestionno}\fi
    \ifx\eqQuizType q%
        \edef\@@PromptButtonActions{%
            \noexpand\A{\noexpand\PromptButtonActionHook}}%
            \push@@Button{#1}{\Fld@name}{}{\DefaultHeightOfWidget}%
                {\eq@protect\A}{\eq@setButtonProps\eq@Button@driver}%
                {\PromptButtonDefaults\@@PromptButtonActions\every@ButtonField
                \every@CorrAnsButton}%
        \else \typeout{The \string\PromptButton is for quiz questions only.}
    \fi
}
%    \end{macrocode}
%    \end{macro}
%    \begin{environment}{mathGrp}
% An environment for enclosing a collection of math/text fill-ins that are to be grouped
% together. This grouping should not cross a begin or end of another environment, or include more
% an \cs{item}. This environment has two optional arguments:
%\begin{description}
% \item[\texttt{[\#1]}] : total weight (needed when sum of weight is greater than total number of points
% \item[\texttt{[\#2]}] : evaluation function, a JavaScript function to evaluate the user's responses.
% The default evaluation function is \texttt{groupEval}.
%\end{description}
% The way the parsing of the parameters works out, to specify \texttt{\#1}, you must specify
%\texttt{\#2}.
%    \begin{macrocode}
\let\grpquestions=0
\def\mathGrp{\@ifnextchar[{\@imathGrp}{\@imathGrp[groupEval]}}
\def\@imathGrp[#1]{\def\argi{#1}\@ifnextchar[{\@iimathGrp}{\@iimathGrp[]}}
\def\@iimathGrp[#1]{\def\argii{#1}%
    \global\let\grpquestions=1
    \setcounter{grpquestionno}{0}%
    \stepcounter{questionno}%
    \xdef\beginGrp{\thequestionno}%
    \xdef\grpPointValue{\eqPTs}%
\ifx\eqQuizType q%
    \edef\eqtmp{\aPointType}%
    \xdef\aPointType{\eqtmp,[\eqPTs,"grp"]}%
\fi
    \addtocounter{eqpointvalue}{\eqPTs}%
%    \xdef\grpTotalWeight{#1}%
%    \xdef\grpEvalFunction{#2}%
    \ifx\argii\@empty
        \xdef\grpTotalWeight{\eqPTs}%
        \xdef\grpEvalFunction{\argi}%
    \else
        \xdef\grpTotalWeight{\argi}%
        \xdef\grpEvalFunction{\argii}%
    \fi
}
%\newcommand\objGrp[2][\eqPTs]{%
%    \global\let\grpquestions=1
%    \setcounter{grpquestionno}{0}%
%    \refstepcounter{questionno}%
%    \xdef\grpPointValue{\eqPTs}%
%    \addtocounter{eqpointvalue}{\eqPTs}%
%    \xdef\grpTotalWeight{#1}%
%    \xdef\grpEvalFunction{#2}%
%    \xdef\beginGrp{\thequestionno}%
%}
\def\endmathGrp{\global\let\grpquestions=0\xdef\endGrp{\thequestionno}}
%    \end{macrocode}
%    \end{environment}
%    \begin{macro}{\CorrAnsButtonGrp}
%    \begin{macrocode}
\def\CorrAnsButtonGrpDefaults
{%
   \CA{Ans}\W{1}\S{N}
    \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
%                var beginGrp = 1*\beginGrp+1;\jsR\jsT
%                var endGrp = \endGrp;\jsR\jsT
                grpOffset = beginGrp;\jsR\jsT
                if ( typeof \currQuiz == "undefined" ) {\jsR\jsT\jsT
                    \currQuiz = new Object;\jsR\jsT\jsT
                    \currQuiz.Grp = {};\jsR\jsT
                }\jsR\jsT
                if ( typeof \currQuiz.Grp["\thequestionno"] == "undefined" )\jsR\jsT
                {\jsR\jsT\jsT
                    \currQuiz.Grp["\thequestionno"] = {offset: 0};\jsR\jsT\jsT
%                    \currQuiz.Grp["\thegrpquestionno"].offset = 0;\jsR\jsT\jsT
                    var f = this.getField("grpobj.\curr@quiz.\thequestionno." + grpOffset)\jsR\jsT\jsT
%    \end{macrocode}
% When the field is readonly, then we cannot set the focus. We'll remove the readonly, set focus, then
% reset readonly to true again; however, we must wait a little for \texttt{setFocus} to finish.
%    \begin{macrocode}
                    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
\ifx\eqQuizType q%
                DisplayAnswer("Ans.\curr@quiz", aCorrectAns[\currQuiz.Grp["\thequestionno"].offset]);\jsR
\else
                DisplayAnswer("grpobj.\oField.\thequestionno."+ grpOffset, aCorrectAns[\currQuiz.Grp["\thequestionno"].offset]);\jsR
\fi
            }
    }%
 }
\newcommand\CorrAnsButtonGrp[2][]
{%
    \makeStringArray{#2}%
%    \def\CorrectAns{#2}%
    \edef\CorrectAns{\stringArray}%
    \ifx\eqQuizType q\def\Fld@name{corr.\curr@quiz.\thequestionno}%
    \else\def\currQuiz{\oField}\def\Fld@name{corr.\oField.\thequestionno}\fi
    \ifx\eqQuizType q%
        \edef\@@CorrAnsButtonGrpActions{\noexpand\F{\FHidden}%
            \ifx\@qzsolndest\@empty\noexpand\BC{0 0 0}\else\noexpand\BC{0 .6 0}\fi
            \noexpand\A{\noexpand\CorrAnsButtonGrpActionHook}}%
        \ifeq@noquizsolutions\else
            \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{0 0 0}\else\noexpand\BC{0 .6 0}\fi
            \noexpand\A{\noexpand\CorrAnsButtonGrpActionHook}}%
        \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\next{}%
    \else
        \edef\stringArray{\eq@temp"#1",}%
        \def\next{\@makeStringArray#2\@nil}%
    \fi
    \next
}
%    \end{macrocode}
%    \end{macro}
%    \section{Input Driver Specific Code}
%
% Here is were we make the redefinitions of the above commands if
% a language option is specified.
%    \begin{macrocode}
\LangRedefinitions
%    \end{macrocode}
% Now bring in driver dependent macros.  The macros defined are
% the answer macros for the \texttt{shortquiz} environment and most all
% for the \texttt{quiz} environment.  These macros make heavy use of
% JavaScript.  The method of introducing these JavaScripts and
% PDF code related elements depends on the driver.
%    \begin{macrocode}
\input{aebjs.def}
%    \end{macrocode}
%    \begin{macrocode}
%</package>
%    \end{macrocode}
%    \section{eForms Support}
%    \begin{macrocode}
%<*package>
%    \end{macrocode}
%    \begin{macro}{\solutionColor}
% This color is introduced at the pdfmark/rawPDF level. Define
% the color without commas. For example |\solutionColor{0 .6 0}|
%    \begin{macrocode}
\newcommand\solutionColor[1]{\def\solution@Color{#1}}
\def\solution@Color{0 .6 0}
%    \end{macrocode}
%    \end{macro}
% \subsubsection{``Every'' Definitions}
%    \begin{macrocode}
\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\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{}
%    \end{macrocode}
%Here is the definition of \cs{AddAAFormat}. This macro can be used
%in \cs{RespBoxMath} to add in formatting of the answer. This macro is
%necessary because the \cs{AA} actions for the \textsf{exerquiz} quiz macros
%are ``protected''; the document author cannot accidently overwrite my
%JavaScript for processing the user's answer.
%\begin{flushleft}
%Example: In the preamble
%\begin{verbatim}
%\begin{defineJS}{\formatAsSet}
%if (event.value.replace(/\\s/g,"") != "")
%    event.value =  "{ " + event.value + " }";
%\end{defineJS}
%\end{verbatim}
%and in the body of a \texttt{quiz} environment,
%\begin{verbatim}
%$x^2 - 3x + 2 = 0$, $S = \RespBoxMath[\AddAAFormat{\formatAsSet}
%    \rectW{.75in}\textSize{0}]{1,2}{1}{.0001}{[0,1]}*{ProcRespSetNum}$
%\end{verbatim}
%\end{flushleft}
%    \begin{macrocode}
\def\@eqAddAAFormat#1{\def\eqFormatArg{#1}}
\def\eq@AddAAFormat{}
%    \end{macrocode}
% Here, you can control the appearance of all the standard checkboxes, also
% effects radio fields of shortquiz and quiz.
%    \begin{macrocode}
\newcommand\everysqRadioButton[1]{\def\every@sqRadioButton{#1}}
\def\every@sqRadioButton{}
\newcommand\everyqRadioButton[1]{\def\every@qRadioButton{#1}}
\def\every@qRadioButton{}
%    \end{macrocode}
% Here, you can control the appearance of all the standard buttons.
%    \begin{macrocode}
\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}}
\def\every@eqButton{}
\newcommand\everyBeginQuizButton[1]{\def\every@BeginQuizButton{#1}}
\def\every@BeginQuizButton{}
\newcommand\everyEndQuizButton[1]{\def\every@EndQuizButton{#1}}
\def\every@EndQuizButton{}
% Replace everyeqGenButten with everyPushButton
\let\everyeqGenButton=\everyPushButton
\let\every@eqGenButton=\every@PushButton
\newcommand\everyeqIcon[1]{\def\every@eqIcon{#1}}
\def\every@eqIcon{}
% dps new
\let\eqGenButton = \pushButton
%    \end{macrocode}
%    \begin{macro}{\eqIcon}
% Create a push button for displaying an icon. I've set this on read only, this
%can be removed by saying \verb+\Ff{-\FfReadOnly}+/
%\begin{verbatim}
%#1 = optional, used to enter any modification of the appearance/actions
%#2 = the title of the button field
%#3 = the width of the bounding rectangle
%#4 = the height of the bounding rectangle
%\end{verbatim}%    \begin{macrocode}
\def\eqIconDefaults
{%
    \rawPDF{}\S{}\mkIns{/TP 1}
    \CA{}\RC{}\AC{}\BC{}\BG{}\H{N}
    \textColor{0 g}\Ff{\FfReadOnly}
}
\newcommand\eqIcon[4][]
{%
    \push@@Button{#1}{#2}{#3}{#4}{}{\eq@setButtonProps\eq@Button@driver}%
        {\eqIconDefaults\every@ButtonField\every@eqIcon}%
}
%    \end{macrocode}
%    \end{macro}
%    \begin{macrocode}
%</package>
%    \end{macrocode}
%    \section{Document Level JavaScripts}
% The \texttt{insDLJS} package is used to insert the JavaScript at
% the document level. This package makes all necessary
% driver-dependent conversions, we just write the JavaScript code,
% which is hard enough.
%    \begin{macrocode}
%<*aebjs>
%    \end{macrocode}
%    \begin{macrocode}
\begin{insDLJS*}[exerquizLoaded]{exerquiz}
%    \end{macrocode}
% \subsection{Global Data}
% Global data and some miscellaneous definitions
%    \begin{macrocode}
\begin{newsegment}{AeB: AcroTeX eDucation Bundle}
/*
        Document Level JavaScript
        AcroTeX eDucation Bundle
        D. P. Story copyright 2000-\the\year
*/
var exerquizLoaded = true;
this.disclosed = true;
\end{newsegment}
\begin{newsegment}{Eq: Global Data}
var ok2Continue = true;
%    \end{macrocode}
%The global variable \texttt{ProcessIt} is really used only once. In the
%function \texttt{DisplayAnswer()}. The function is called by the correct
%answer button. It sets \texttt{ProcessIt = false}, then it inserts the correct
%answer into the text field. A \texttt{false} value of \texttt{ProcessIt}
%prevents the \texttt{ProcResp} (and others) from from processing the answer.
%    \begin{macrocode}
var ProcessIt = true;
var retn;
var Score=0;
var ptScore=0;
var pcScore=0;
var quizGrade="C";
var e = Math.E;
var pi = Math.PI;
var aQuizControl = new Array();
var RightWrong=new Array();
var ProbValue = new Array();
var ProbDist = new Array();
var ProbType = new Array();
var Responses=new Array();
var appAlerts = new Object;
%    \end{macrocode}
% JSf is an array of supported mathematical functions.
%\changes{v6.06}{2007/02/23}
%{
% Separated the \texttt{JSf} array into \texttt{JSfBuiltIn} and \texttt{JSfCustom}. This
% allows us to identify the built-in JavaScript functions. I concatenate these two
% into \texttt{JSf}.
%}
%    \begin{macrocode}
var JSfBuiltIn = new Array
    ( "abs","acos","asin","atan","ceil","cos","exp",
      "log","max","min","pow","random","round","sin",
      "sqrt","tan");
var JSfCustom = new Array
    ( "arctan", "logc", "arcsin", "arccos", "ln","sec",
      "csc","cot","C","P","fact","pi");
var JSf = new Array();
JSf = JSf.concat(JSfBuiltIn, JSfCustom);
%var JSf = new Array
%    ( "abs","acos","asin","atan","ceil","cos","exp",
%      "log","max","min","pow","random","round","sin", "arctan", "logc",
%      "arcsin", "arccos", "sqrt","tan","ln","sec","csc","cot","C","P","fact","pi"
%    );
var JSc = new Array("PI","E")
%    \end{macrocode}
% Additional functions that I've defined.
%    \begin{macrocode}
function ln(x) { return Math.log(x); }
function sec(x) { return 1/Math.cos(x); }
function csc(x) { return 1/Math.sin(x);}
function cot(x) { return Math.cos(x)/Math.sin(x); }
function arctan(x) { return Math.atan(x); }
function arcsin(x) { return Math.asin(x); }
function arccos(x) { return Math.acos(x); }
function logc(x) { return Math.LOG10E * Math.log(x); }
function C(x,y) {return ch(x,y);}
function P(x,y) {return perm(x,y);}
%    \end{macrocode}
% The aGroup array lists left and right grouping delimiters. This array is
% used by ParseInput() to call CkBalP().
%    \begin{macrocode}
var aGroup = new Array
    ( ["\(","\)",\eqParens],
      ["[","]",\eqBrackets],
      ["{","}",\eqBraces]
    );
\end{newsegment}
%    \end{macrocode}
% \subsection{Math Fill-in}
% This section of the code is primarily dedicated to processing the math fill-in questions.
%    \begin{macrocode}
\begin{newsegment}{Eq: Support for Math Fill-in}
%    \end{macrocode}
% Description: Checks for balanced grouping delimiters.
% Arguments:
%   UserInput: A string
%   lDelimiter: left delimiter
%   rDelimiter: right delimiter
% Returns: true (if balanced); false (if not)
%    \begin{macrocode}
function CkBalP(UserInput,lDelimiter,rDelimiter)
{
    var Lcount=0, Rcount=0;
    for (var k=0; k < UserInput.length; k++)
    {
        if (UserInput.charAt(k) == lDelimiter) Lcount++;
        else if (UserInput.charAt(k) == rDelimiter) Rcount++;
    }
    return (Lcount==Rcount);
}
%    \end{macrocode}
% Description: This function simply determines if there are an even number of
% `\verb+|+' chars.  Used for parsing absolute value.
% \verb=| x+2 | --> abs(x+2)=.
% Arguments:
%   UserInput: a string
%   Returns: true (if even); false (if odd)
%    \begin{macrocode}
function CkBalVert(UserInput)
{
    var Lcount=0;
    for (var k=0; k < UserInput.length; k++)
        if (UserInput.charAt(k)=="|") Lcount++;
    return (Lcount \% 2 == 0);
}
%    \end{macrocode}
% Description: This function searches for alpha words and matches them against supported
% mathematical functions.
% Arguments:
%   UserInput: a string
%   Returns: 1 (if there is a match); 0 (if no match)
%       also sets the global variable ok2Continue to false.
%    \begin{macrocode}
function Ckfuncs(UserInput)
{
    var re, regexp;
    re = /[a-zA-Z]{2,}/g;
    aF = UserInput.match(re);
    if (  aF == null ) return true;
    for (var i=0; i < aF.length; i++)
    {
        for(var j=0; j < JSf.length; j++)
            if ( aF[i].indexOf(JSf[j]) != -1 ) break;
        if (j < JSf.length) continue;
        for(var j=0; j < JSc.length; j++)
            if ( aF[i].indexOf(JSc[j]) != -1 ) break;
        if(j==JSc.length)
        {
            app.alert(\eqerrBadMathFunc,3);
            return false;
        }
    }
    return true;
}
%    \end{macrocode}
% This function displays the answer.
%    \begin{macrocode}
function DisplayAnswer(fieldname,theanswer)
{
    ProcessIt = false;
    try {
    this.getField(fieldname).value=(theanswer);
    this.getField(fieldname).strokeColor=\eqDefaultColor;
    } catch(e) {}
%    event.rc=false;
    ProcessIt = true;
}
%    \end{macrocode}
% Finds and returns the position of the matching parentheses.
%    \begin{macrocode}
function FindBalP(UserInput,Poff,Forward)
{
    var depth;
    if (Forward)
    {
        for (depth=-1, j=Poff+1; depth !=0; j++)
        {
            if (UserInput.charAt(j)=="\(") depth--;
            else if (UserInput.charAt(j)=="\)") depth++;
        }
        j--
    }
    else
    {
        for (depth=-1, j=Poff-1; depth !=0; j--)
        {
            if (UserInput.charAt(j)=="\)") depth--;
            else if (UserInput.charAt(j)=="\(") depth++;
        }
        j++
    }
    return j;
}
%    \end{macrocode}
% This is the tricky one. First get rid of all whitespace. Then
% check for balanced parentheses followed by checking for known
% or unknown math functions.
%
% The power function is \texttt{pow}; thus, |x^2| is pow(x,2). Rather than
% make students write pow(x,2) we try to code things so they can enter
% |x^2| instead, much easier for them.  Now we must scan through for different
% patterns. The patterns are: |x^n|, |(expr)^n|, |x^(expr)| and |(expr1)^(expr1)|. We
% search through looking for these patterns and replace them appropriately:
% |pow(x,n)|, |pow(expr,n)|, |pow(x,expr)| and |pow (expr1,expr2)|. To do this, we
% must find balanced parentheses.
%
%    \begin{macrocode}
function stripWhiteSpace (UserInput)
{
    UserInput = UserInput.replace(/\s/g,"");
    if(UserInput==null || UserInput.length==0)
    {
        ok2Continue = false;
        return false;
    } else return UserInput;
}
%    \end{macrocode}
% This function takes its argument, and adds in the suffix of \texttt{Math.}
% in front of every recognizable JS built-in functions.
%    \begin{macrocode}
function addMathObject(UserInput)
{
    for ( var i=0; i < JSfBuiltIn.length; i++) {
        var re = new RegExp("\\b("+JSfBuiltIn[i]+")\\b","g");
        UserInput = UserInput.replace(re,"Math.$1");
    }
    re = /\b(PI)\b/g;
    UserInput = UserInput.replace(re,"Math.$1");
    return UserInput;
}
%    \end{macrocode}
% This is the very heart of parsing the user's input.  This function takes the
% \texttt{UserInput} and works it over and places it in a proper JavaScript expression
% for the JavaScript interpreter to evaluate.
%
% For those who have Acrobat 5.0, you can call this function from the console, something
% I do quite a lot when developing new scripts. From the console, enter, for example,
% \verb+ParseInput("xycos(xy^3)")+, and the return value of this function will be
% displayed in the console.  An author can check the syntax of his/her answer.
%    \begin{macrocode}
function ParseInput(UserInput)
{
    var re;
    UserInput = stripWhiteSpace (UserInput);
    if (!ok2Continue) return null;
%    \end{macrocode}
% See if there are matching `\texttt{[]}', `\texttt{\{\}}' and `\texttt{()}'.
%    \begin{macrocode}
    for(var i=0; i< aGroup.length; i++)
    {
        if(!CkBalP(UserInput, aGroup[i][0], aGroup[i][1]))
        {
            app.alert(\eqerrDelimNotBal,3);
            ok2Continue = false;
            return false;
        }
    }
%    \end{macrocode}
% Replace `\texttt{[]}' and `\texttt{\{\}}' with `\texttt{()}'; only parentheses
% are used in JavaScript for grouping.
%    \begin{macrocode}
    UserInput = UserInput.replace(/\[|\{/g, "\(");
    UserInput = UserInput.replace(/\]|\}/g, "\)");
%    \end{macrocode}
% Check to see if there are an even number of absolute value symbols, `\verb+|+'.
%    \begin{macrocode}
    if (!CkBalVert(UserInput))
    {
        app.alert(\eqerrABS,3);
        ok2Continue = false;
        return false;
    }
%    \end{macrocode}
% Now try to insert the multiplication operator where applicable.
%    \begin{macrocode}
    if (typeof(Ck4Exponents) == "undefined") if(!Ckfuncs(UserInput)) return false;
    if (typeof(Ck4Exponents) != "undefined") UserInput = Ck4Exponents(UserInput);
    if (typeof(Ck4Products) != "undefined" ) UserInput = Ck4Products(UserInput);
    ok2Continue = true;
%    \end{macrocode}
% Convert any occurrence of log to log10 (known internally as logc). We are now (12/22/06) going to use log for
% common log even though log in JS is natural log. This may break a few things.
% \changes{v6.05f}{2006/12/22 }
% {
%   Added support for common logarithms.  log is now common logs, and ln is
%   natural logs.
% }
%    \begin{macrocode}
    re = /\b(log)\b/g;
    UserInput = UserInput.replace(re, "logc");
%    \end{macrocode}
% Search for occurrences of \verb!|<exp>|! and replace with \texttt{abs(<exp>)}.
%    \begin{macrocode}
    while (/\|/.test(UserInput)&&(ok2Continue))
    {
        re = /(\|)([^\|]*)(\|)([-\+\/\*\^\)\|])/;
        if (re.test(UserInput))
            if (re.exec(UserInput)[4] == '^')
                UserInput = UserInput.replace(re, "(abs($2))$4");
            else
                UserInput = UserInput.replace(re, "abs($2)$4");
        else
        {
            re = /(\|)([^\|]*)(\|$)/;
            if (re.test(UserInput))
                UserInput = UserInput.replace(re, "abs($2)");
        }
    }
    while (/\^/.test(UserInput)&&(ok2Continue))
    {
        if (/\)\^\(/.test(UserInput))
        {
            aP = /\)\^\(/.exec(UserInput);
            LeftP=FindBalP(UserInput,aP.index,0); // backward search
            RightP=FindBalP(UserInput,aP.index+2,1); // forward search
            re = new RegExp("\\((.{"+eval(aP.index-LeftP-1)+"})\\)\\^\\((.{"+eval(RightP-aP.index-3)+"})\\)");
            if (re.test(UserInput)) UserInput=UserInput.replace(re,"pow($1,$2)");
            else ok2Continue=false;
        }
        else if (/\)\^/.test(UserInput))
        {
            aP =/\)\^/.exec(UserInput);
            LeftP=FindBalP(UserInput,aP.index,0); // backward search
            re = new RegExp("\\((.{"+eval(aP.index-LeftP-1)+"})\\)\\^([a-zA-Z]|[\+-]?\\d+\\.?\\d*|[\+-]?\\d*\\.?\\d+)");
            if (re.test(UserInput)) UserInput=UserInput.replace(re,"pow($1,$2)");
            else ok2Continue=false;
        }
        else if (/\^\(/.test(UserInput))
        {
            aP = /\^\(/.exec(UserInput);
            RightP=FindBalP(UserInput,aP.index+1,1); // forward search
            re = new RegExp("([a-zA-Z]|\\d*\\.?\\d*)\\^\\((.{"+eval(RightP-aP.index-2)+"})\\)");
            if (re.test(UserInput)) UserInput=UserInput.replace(re,"pow($1,$2)");
            else ok2Continue=false;
        }
        else if (/\^/.test(UserInput))
        {
            re=/([a-zA-Z]|\d*\.?\d*)\^([a-zA-Z]|[\+-]?\d+\.?\d*|[\+-]?\d*\.?\d+)/;
            if (re.test(UserInput)) UserInput=UserInput.replace(re,"pow($1,$2)");
            else ok2Continue=false;
        }
    }
    if (!ok2Continue)
    {
        app.alert(\eqerrBadExp,3);
\db     console.println("Bad UserInput: " + UserInput);\db%
        return false;
    }
    else {
%    \end{macrocode}
%\changes{v6.06}{2007/02/23}
%{
% Now, just before we return the parsed expression, we append all built-in
% JavaScript functions and constants with \texttt{Math.}, this is to avoid
% having to use the \texttt{with(Math)} construct. These changes are in support
% of using scientific notation.
%}
%    \begin{macrocode}
        UserInput=addMathObject(UserInput);
        return UserInput;
    }
}
%    \end{macrocode}
% Process the user's response.  Here, we randomly choose, $n$,
% points from the selected interval $[a,b]$. The correct answer (as
% supplied by the author of the document and the answer provided by
% the user are evaluated at each of the $n$ points. If any of the
% evaluations differs by more than \texttt{epsilon}, the answer is
% considered wrong.
%
% The idea for evaluating user input in this way comes from  Drs.\
% Wlodzimierz Bryc and Stephan Pelikan of The University of
% Cincinnati.  These two have developed an \texttt{html} based
% \textbf{Online Exercise System} which can  evaluate objective
% type questions. This evaluation, however, takes place on the
% \emph{server-side}. This implementation is on \emph{the client-side}.
%
%    \begin{macro}{TypeParameters}
% is either a comma delimited list of variables "x,y,z" or just a list "xyz"
% this function types each untyped variable that is not typed. Currently, there
% are only two data types: "r" and "i".  "r:x" means "x" is a real variable,
% "i:x" means "x" is an integer varaible.
%    \begin{macrocode}
function TypeParameters(v)
{
    var aV;
%    \end{macrocode}
% If \texttt{v} has a colon in it, we take that as a signal that the variables are comma
% delimited.
%    \begin{macrocode}
    aV = ( (v.indexOf(":") == -1) && (v.indexOf(",") == -1) ) ? v.split("") : v.split(",");
    for ( var i=0; i < aV.length; i++)
        if ( aV[i].indexOf(":") == -1 )
            aV[i] = "r:"+aV[i];
    return aV.join(",")
}
%    \end{macro}
%    \begin{macro}{ProcResp}
% This function handles numerical answers or function of a single variable, x,
% that evaluate to a number.
function ProcResp(flag,CorrAns,n,epsilon,a,indepVar,oComp)
{
    if (!ProcessIt) return null;
    var fieldname = event.target.name;
    var UserAns = event.value;
    var success = _ProcResp(flag,CorrAns,UserAns,n,epsilon,a,indepVar,oComp);
    if ( success == -1 ) return null;
    if ( success == null ) { return syntaxError(), null; }
    return notifyField(success, flag, fieldname);
}
function _ProcResp(flag,CorrAns,UserAns,n,epsilon,a,indepVar,oComp) // changed name of var comp -> oComp
{
    ok2Continue = true;
%    \end{macrocode}
% Implement an "undefined" answer. Due to Ross-Griffin. This can be accomplished
% by preprocessing.
%    \begin{macrocode}
%    if (UserAns == "undefined") {
%        success = (CorrAns == UserAns);
%        return notifyField(success, flag, fieldname);
%    }
    CorrAns = ParseInput(CorrAns);
\db console.println("ParseInput: CorrAns = " + CorrAns);\db%
    if (!ok2Continue) {
        app.alert("Syntax error in author's answer! Check console.", 3);
\db     console.println("Syntax Error: " + CorrAns);\db%
        return null;
    }
%    \end{macrocode}
% If \texttt{oComp} is an object, then see if it has a \texttt{comp} property
%    \begin{macrocode}
    var comp = ( typeof oComp == "object" ) ?
       (typeof oComp.comp == "undefined" ) ? diffCompare : oComp.comp : oComp;
%    \end{macrocode}
% The \texttt{comp} parameter, which has been changed to \texttt{oComp} can now be
% an object. One property of this object is \texttt{comp}, handled above. Another
% property is \texttt{priorParse}, this is a function that returns \texttt{null}
% or \texttt{true}. This \texttt{priorParse} function allows for additional
% filtering of the \texttt{UserAns} before parsing. If it returns \texttt{true},
% we are ok to continue, if \texttt{null}, we don't like something the user has entered,
% and ask him/her to change it.
%    \begin{macrocode}
    if ( typeof oComp == "object" && typeof oComp.priorParse != "undefined" )
    {
%    \end{macrocode}
% Let's go ahead and allow \texttt{oComp.priorParse} be an array of functions.
%    \begin{macrocode}
        if ( typeof oComp.priorParse == "object" )
        {
            for ( var i=0; i < oComp.priorParse.length; i++)
            {
                var retn = oComp.priorParse[i](UserAns);
                if ( retn == null ) return -1; // -1 signals an alert has already been made, silent from here
            }
        } else {
            var retn = oComp.priorParse(UserAns);
            if ( retn == null ) return -1;
        }
    }
    UserAns = ParseInput(UserAns);
%    \end{macrocode}
% Originally, the value of \texttt{indepVar} is a string of variables "xyz". You can
% now have variables of the form "r:x,i:n,r:y". Where the identifier "r:" indicates a
% real variable and "i:" indicates an integer variable. \texttt{indepVar} must be either
% of the old style, or the new style, not a mixture of both, e.g. "xyi:n".
%    \begin{macrocode}
    indepVar = TypeParameters(indepVar);
    if (!ok2Continue) return null;
    var success=randomPointCompare (n,a,indepVar,epsilon,CorrAns,UserAns,comp);
    return success;
}
%    \end{macrocode}
%    \end{macro}
% This function randomly selects points from the interval [a,b]
% and calls the 'comp' function to compare results.
% Returns: null if the expression is bad, no penalty.
%          true if the error of the random comparison is less than epsilon
%          false if the error of the random comparison is greater than epsilon
%    \begin{macrocode}
function randomPointCompare (n,a,indepVar,epsilon,CorrAns,userAns,comp)
{
    var error, i, j, k;
    var aXY = new Array();
    a = a.replace(/[\[\]\s]/g, "");
    var aIntervals = a.split("&");
    for (k=0; k < aIntervals.length; k++)
    {
        var aInterval = aIntervals[k].split("x");
        nI = aInterval.length;
%        var nV = indepVar.length;
        with (Math) {
            for (j=0; j < n; j++)
            {
                for (i=0; i < nI; i++)
                {
                    var endpoints = aInterval[i].split(",");
                    aXY[i] = eval(endpoints[0])-0+(eval(endpoints[1])-eval(endpoints[0]))*random();
                }
                var cXY = aXY.toString();
                error = comp(a,cXY,indepVar,CorrAns,userAns);
                if (error == null) return null;
                if ( (error == -1) || (error > epsilon) ) {j=-1; break;}
            }
        }
        if (j!=n) return false;
    }
    return true;
}
%    \end{macrocode}
% \texttt{diffCompare}: A simple comparison function, we evaluate the two input function `\texttt{\_F}'
% and `\texttt{\_G}' and the point `\texttt{\_c}' and return the absolute difference.
%
% Returns: Absolute difference between `\texttt{\_F}' and `\texttt{\_G}'
%          null if expression was not valid
%          -1 if expression is not a number
%    \begin{macrocode}
function diffCompare(_a,_c,_v,_F,_G) {
    var aXY = _c.split(",");
    var _V = _v.split(",");  // e.g. _V[0] = "i:x"
    var _n = aXY.length;
%    with(Math) { // dps/change 02/23/07
%    \end{macrocode}
% For each of the independent variables, we set them equal to a randomly chosen value
% from the specified interval.
%    \begin{macrocode}
    for (var _i=0; _i < _n; _i++)
    {
%            var nTyped = _v.match(/(.?:.?)/g);
%            var nV = indepVar.length - 2*nTyped;
            if (_V[_i].charAt(0) == "r" )
                eval ( "var "+ _V[_i].charAt(2) + " = " + aXY[_i] + ";");
%                eval ( "var "+_v[i] + " = " + aXY[i] + ";");
            else // assume type "i"
                eval ( "var "+ _V[_i].charAt(2) + " = " + ceil(aXY[_i]) + ";");
    }
%    \end{macrocode}
% The \texttt{\_F} is the author's answer, we assume this is  well formed JavaScript
% and do not test it for possible errors. The author can correct before s/he distributes
% the document.
%    \begin{macrocode}
    _F = eval(_F);
%    \end{macrocode}
% Now we try to protect our code from bad input. We use \texttt{try/catch} to try and
% thrown exceptions. However, \texttt{try/catch} is not valid in any version of the
% Acrobat Reader prior to version 5.
%    \begin{macrocode}
    if ( app.viewerVersion >= 5)
    {
%    \end{macrocode}
% This code, which uses \texttt{eval()} and \texttt{try/catch} is an attempt to write
% code that both works for Acro5 (or higher) and Acro4.05/4.0.  In Acro4.x, \texttt{try/catch}
% are reserved words, so we can't use them even in a conditional. However, within a string
% the JavaScript interpreter does not see them. The other complication is that Acro5 objects
% to having a \texttt{return} within an \texttt{eval()}, so we work around that with a
% \texttt{rtnCode}. The returns are executed outside the \texttt{eval()}.
%    \begin{macrocode}
        var rtnCode = 0;
        eval("try { if(isNaN(_G = eval(_G))) rtnCode=-1; } catch (e) { rtnCode=1; }");
        switch(rtnCode)
        {
            case  0: break;
            case  1: return null;
            case -1: return -1;
        }
    }
    else
%    \end{macrocode}
% For Acro4/4.05, all we can do is detect whether \texttt{\_G} is a number or not. If the user
% enters an undefined symbol, for example, we cannot catch this as we can with Acro5. Oh, well.
%    \begin{macrocode}
        if(isNaN(_G = eval(_G))) return -1;
%    \end{macrocode}
%
% The function \texttt{G} is the user's input expression. There may be syntax errors
% that prevent the successful numerical evaluation of the expression. We try to
% prevent problems.
%
% If the user enters a function such as \texttt{sqrt( 1 - x )}, and this function is
% evaluated at a x = 2, for example, we are outside the domain of the function. The \texttt{isNaN}
% function will catch this type of error.  A return of \texttt{-1} signals an error
% at this of this type. This is considered to be an error by the user, and will be scored as an
% incorrect answer.
%
% The error described above does not throw an exception. What will throw an exception
% is if the users function has some undefined variables in it. For example, suppose
% we are expecting a response that is a function of \texttt{x} and the user enters a
% function of \texttt{t} instead. This will throw an exception as \texttt{t} is undefined.
% In this case, we do not treat this as an error, and expect the user to correct the
% input. This kind of error is signaled by returning a \texttt{null}.
%
%    \begin{macrocode}
    return Math.abs ( _F - _G );
%    }  // dps/change 02/23/07
}
%    \end{macrocode}
% This function is the same as above, but returns the relative absolute error.
%    \begin{macrocode}
function reldiffCompare(_a,_c,_v,_F,_G) {
    var aXY = _c.split(",");
    var n = aXY.length
%    with(Math) { // dps/change 02/23/07
    for (var i=0; i< n; i++)
            eval ( "var "+_v[i] + " = " + aXY[i] + ";");
    _F = eval(_F);
    if ( app.viewerVersion >= 5)
    {
        var rtnCode = 0;
        eval("try { if(isNaN(_G = eval(_G))) rtnCode=-1; } catch (e) { rtnCode=1; }");
        switch(rtnCode)
        {
            case  0: break;
            case  1: return null;
            case -1: return -1;
        }
    }
    else
        if(isNaN(_G = eval(_G))) return -1;

    return Math.abs ( (_F - _G)/_G );
%    } // dps/change 02/23/07
}
\end{newsegment}
%    \end{macrocode}
% \subsection{Text Fill-in}
% Now the JS functions that process text fill-in questions.
%    \begin{macrocode}
\begin{newsegment}{Eq: Support Text Fill-in}
%    \end{macrocode}
% This function processes fill-in problems that require only a text
% response. It takes a variable number of arguments, which are retrieved
% using the arguments[] array
%    \begin{macrocode}
function ProcRespTxt() {
    var i, success, authorAnswer, userAnswer = event.value;
    var fieldname=event.target.name;
    var flag = arguments[0];
    var filterMethod = arguments[1];
    var compareMethod = arguments[2];
    if ( !ProcessIt || userAnswer == "" ) return null;
    for (i = 3; i < arguments.length; i++)
        if ( (success = compareTxt(userAnswer, arguments[i], filterMethod, compareMethod)) == true) break;
    return notifyField(success, flag, fieldname);
}
%    \end{macrocode}
% \texttt{compareTxt} actually compares the \texttt{userAnswer} with the \texttt{authorAnswer}.
% there are options for various types of comparisons.
% Returns true or false.
%    \begin{macrocode}
function compareTxt(userAnswer, authorAnswer, filterMethod, compareMethod)
{
    userAnswer = new String(userAnswer).filter(filterMethod)
    switch(compareMethod) {
        case 1:
            var AuthorAnswer;
            var aAuthorAnswer = authorAnswer.split(/\s+/);
            for (var j=0; j < aAuthorAnswer.length; j++) {
                AuthorAnswer = new String(aAuthorAnswer[j]).filter(filterMethod);
                AuthorAnswer = AuthorAnswer.replace(/\./g, "\\.");
                var re = new RegExp(AuthorAnswer, "g");
                if (!re.test(userAnswer)) return false;
            }
            return true;
        default:
            authorAnswer = new String(authorAnswer).filter(filterMethod)
            return (userAnswer == authorAnswer) ? true : false;
    }
}
%    \end{macrocode}
% Various string prototypes. This function is called by compareTxt.
% The function returns the 'filtered' string.
%    \begin{macrocode}
String.prototype.filter = eqFilter;
function eqFilter(filterMethod) {
    switch (filterMethod) {
        case 0:
            var re = /\W/g;
            return this.replace(re,"").toLowerCase();
        case 1:
            var re = /\s/g;
            return this.replace(re,"").toLowerCase();
        case 2:
            var re = /\s/g;
            return this.replace(re,"");
        default:
            return this;
    }
}
\end{newsegment}
%    \end{macrocode}
% \subsection{Multiple Choice Questions}
% These are the routines for processing multiple choice questions.
%    \begin{macrocode}
\begin{newsegment}{Eq: Quiz Management}
function InitMsg(msg) { return (\eqInitQuizMsg) }
function syntaxError() { app.alert(\eqSyntaxErrorUndefVar,3); }
%    \end{macrocode}
% There are four required parameters, if there is a fifth, that means
% we have a grouped question, parameter 5 will be the group sub-problem number.
%    \begin{macrocode}
function ProcUserResp(key,userresp,probno,notify)
{
    if ( arguments.length > 4 ) {
        if ( typeof RightWrong[probno] == "undefined" ) {
            RightWrong[probno] = new Array();
            Responses[probno] = new Array();
        }
        RightWrong[probno][arguments[4]] = (!!key) ? 1 : 0;
        Responses[probno][arguments[4]] = userresp;
    } else {
        RightWrong[probno] = (!!key) ? 1 : 0;
        Responses[probno] = userresp;
    }
}
function InitializeQuiz(qtfield,mark)
{
    Score=0;
    retn = null;
    if (!isQuizInitialized(qtfield)&&!isAQuizUnfinished()) return null;
    neutralizeQuizzes();
    ProcessIt = false;
    aQuizControl[qtfield] = 1;
    this.resetForm(["ScoreField." + qtfield,"mc."+qtfield,"obj."+qtfield,
        "Ans."+qtfield,"PointsField."+qtfield,"PercentField."+qtfield,
        "essay."+qtfield,"GradeField."+qtfield, "grpobj."+qtfield,"qMark"]);
    ProcessIt = true;
    var f = this.getField("qMark");
    if ( f != null ) f.display = display.hidden;
    f = this.getField("obj." + qtfield);
    if ( f != null ) f.readonly = false;
    RightWrong=new Array();
    Responses=new Array();
    ProbValue=new Array();
    ProbDist=new Array();
    ProbType=new Array();
    if (mark==1)
    {
        var f = this.getField("mcq." + qtfield);
        if (f != null) {
            f.delay=true;
            f.display=display.hidden;
            this.resetForm([f.name]);
            if (typeof app.formsVersion != "undefined" && app.formsVersion >=4.0)
                f.textColor = \correctColor;
            else
                f.fgColor = \correctColor;
            var a = f.getArray();
            for (var i=0; i<a.length; i++) a[i].style=style.ci;
            f.delay=false;
        }
        f = this.getField("obj." + qtfield);
        if ( f != null )
            f.strokeColor = \eqDefaultColor;
        f = this.getField("grpobj." + qtfield);
        if ( f != null )
            f.strokeColor = \eqDefaultColor;
        f = this.getField("corr." + qtfield);
        if ( f != null )
            f.display = display.hidden;
    }
    return null;
}
function neutralizeQuizzes()
{
    for ( var qtfield in aQuizControl ) aQuizControl[qtfield] = 0;
}
function isAQuizUnfinished()
{
    for ( var qtfield in aQuizControl )
        if ( aQuizControl[qtfield] == 1 )
        {
            app.alert(\eqerrUnfinishQuiz, 3);
            return false;
        }
    return true;
}
function isQuizInitialized(qtfield)
{
    if (typeof (aQuizControl[qtfield]) == "undefined")
    {
%    \end{macrocode}
%There is one complication.  In the Acrobat/Reader 4.05 versions,
%when the document is first opened, (almost) all format script is
%read and executed. As a result, when the doc is first opened, this
%function is called, and would normally return a 'false' which causes an alert box to
%appear stating that the user must initiate the quiz. The
%work around for this is to test whether we are in that situation,
%and if yes, return true (but only if the aQuizControl array has
%not been modified).  We manually modify the array (so the code below is
%not a factor again), and return true.
%    \begin{macrocode}
        if ( (app.viewerVersion < 5 )&& (app.viewerVersion > 4) && (aQuizControl.length == 0) )
        {
            aQuizControl[0] = -1;
            return true;
        }
        return false;
    }
    else
        return (aQuizControl[qtfield] == 1);
}
% old version of isQuizInitialized() before fix to Reader 4.05 problem
%function isQuizInitialized(qtfield)
%{
%    if (typeof (aQuizControl[qtfield]) == "undefined")
%        return false;
%    else
%        return (aQuizControl[qtfield] == 1);
%}
function isEndQuizPushed(qtfield)
{
    if (typeof (aQuizControl[qtfield]) == "undefined")
        return false;
    else
        return (aQuizControl[qtfield] == -1);
}
function resetQuiz(qtfield)
{
    aQuizControl[qtfield] = -1;
}
%    \end{macrocode}
% The function RecordPointValue has two required parameters. For a grouped question,
% there are three more parameters, they are, in order (2) grpquestionno (3) grpPointValue
% (4) total weight (5) grpEvalFunction, a JS function that evaluates the group.
% The elements of the ProbValue array are as follows:
%\begin{enumerate}
%    \item If multiple choice, then the entry is \texttt{[0, point value, partial credit]}
%    \item If objective type question that is not part of a group, the entry is a number \texttt{point value}
%    \item total weight of the group, significant only if greater than point value
%    \item If objective grouped-type question, the entry is \texttt{[1,EvalJS,grpPointValue,list of points for each part]}
%\end{enumerate}
%    \begin{macrocode}
function RecordPointValue(ptvalue,probno)
{
    if (arguments.length > 2) {
        if ( typeof ProbValue[probno] == "undefined" ) {
            ProbValue[probno] = [1,arguments[5],arguments[3],arguments[4]];
            ProbValue[probno][3+arguments[2]] = ptvalue;
        } else ProbValue[probno][3+arguments[2]] = ptvalue;
    }
    else
        ProbValue[probno]=ptvalue;
}
function RecordProblemType(qType,probno)
{
    ProbType[probno]=qType;
}
function GrpRight( a, nProb, qtfield )
{
    var f = this.getField("grpobj."+qtfield+"."+nProb);
    var l = f.getArray().length
    var prod = 1;
    for ( var i=1; i <= l; i++) prod *= !!a[i];
    return prod;

}
function DisplayQuizResults(qtfield,nPointTotal,nQuestions)
{
    Score = 0; ptScore = 0;
    for (var i=1; i < RightWrong.length; i++)
    {
        if (typeof RightWrong[i] == "object") {
            // grouped question
                Score += GrpRight(RightWrong[i], i, qtfield);
                var aWeights = ProbValue[i].slice(2);
                var evalGrpJS = eval(ProbValue[i][1]);
                var evalGrpJSValue = evalGrpJS(this,qtfield,i,RightWrong[i],aWeights);
                ProbDist[i] = evalGrpJSValue;
                ptScore = ptScore + evalGrpJSValue;
        } else {
            if (RightWrong[i]==1) {
                Score++;
                ProbDist[i] = ( typeof ProbValue[i] == "object") ? ProbValue[i][1] : ProbValue[i];
                ptScore += ProbDist[i];
            }
            else {
                ProbDist[i] = ( typeof ProbValue[i] == "object") ? ProbValue[i][2] : 0;
                ptScore += ProbDist[i];
            }
        }
    }
    if (ptScore == nPointTotal) pcScore = 100;
    else pcScore = util.printf("\%.1f", (100 * ptScore) / nPointTotal);
    quizGrade = GetGrade(\eqGradeScale);
    var f = this.getField("ScoreField."+qtfield);
    if ( f != null ) f.value=(\eqQuizTotalMsg);
    f = this.getField("PointsField."+qtfield);
    if ( f != null) f.value=(\eqQuizPointsMsg);
    f = this.getField("PercentField."+qtfield);
    if ( f != null) f.value=(\eqQuizPercentMsg);
    f = this.getField("GradeField."+qtfield);
    if ( f != null) f.value=(\eqQuizGradeMsg);
}
function GetGrade()
{
    var cGrade, aRange;
    if (pcScore >=100) return arguments[0];
    for (var i=0; i<arguments.length/2; i++)
    {
        cGrade = arguments[2*i];
        aRange = arguments[2*i+1];
        if ( (pcScore >= arguments[2*i+1][0]) && (pcScore < arguments[2*i+1][1]))
            return cGrade;
    }
    return null;
}
function ProcessQuestion (key,letterresp,probno,quizno,qtfield,notify,mark,msg)
{
    var silent = ( arguments.length > 8 ) ? true : false;
    if (!isQuizInitialized(qtfield))
    {
        if (!silent) app.alert(InitMsg(msg),3);
        this.resetForm(["mc."+qtfield+"."+probno]);
    }
    else
    {
        ProcUserResp(key,letterresp,probno,notify);
        if (mark==1)
        {
            this.getField("mcq."+qtfield+"."+probno).delay=true;
            this.resetForm(["mcq."+qtfield+"."+probno]);
            var f = this.getField("mcq."+qtfield+"."+probno);
            var a = f.getArray();
            for (var i=0; i < a.length; i++)
                if (a[i].style == style.ch)
                {
                    a[i].style = style.ci;
                    a[i].textColor = \correctColor;
                }
            var qr=this.getField("mcq."+qtfield+"."+probno+"."+quizno);
            if (typeof app.formsVersion != "undefined" && app.formsVersion >=4.0)
                qr.textColor = key ? \checkColor\space : \crossColor;
            else
                qr.fgColor = key ? \checkColor\space : \crossColor;
            qr.style = key ? style.ch : style.cr;
            qr.value="Yes"; // gr.checkThisBox(0);  // ver 5.0
            this.getField("mcq."+qtfield+"."+probno).delay=false;
        }
    }
}
%    \end{macrocode}
% Dependencies: \texttt{RightWrong}, \texttt{ProbDist} (if \texttt{qMark} is present).
%    \begin{macrocode}
function correctQuiz(qtfield,nQuestions)
{
    var f = this.getField("mcq." + qtfield);
    if ( f != null) f.display = display.visible;
    f = this.getField("obj." + qtfield);
    if ( f != null ) {
        var a = f.getArray();
        for (var i = 0; i < a.length; i++) {
            var probno = a[i].name.replace(/.*\./g,"")
            if ( RightWrong[probno] == 1 )
                a[i].strokeColor = \correctColor;
            else
                a[i].strokeColor = \crossColor;
        }
    }
    f = this.getField("grpobj." + qtfield);
    if ( f != null ) {
        var a = f.getArray();
        for ( var i = 0; i < a.length; i++) {
            var aX = a[i].name.split(".");
            var probno = 1*aX[aX.length-2];
            var grpProbno = 1*aX[aX.length-1];
            if ( ( RightWrong[probno] != undefined ) && ( RightWrong[probno][grpProbno] == 1 ) )
                a[i].strokeColor = \correctColor;
            else
                a[i].strokeColor = \crossColor;
        }
    }
    f = this.getField("Ans." + qtfield);
    if ( f != null ) f.strokeColor = \eqDefaultColor;
    f = this.getField("promptButton." + qtfield)
    if ( f != null ) f.display = display.hidden;
    f = this.getField("corr." + qtfield);
    if ( f != null ) f.display = display.noPrint;
%    \end{macrocode}
% dps (01/01/04) If there are qMark fields, then write marks for each question
% to them.
%    \begin{macrocode}
    f = this.getField("qMark");
    if ( f != null )
    {
%        console.println("ProbDist = " + ProbDist.toSource() );
        for ( var i = 1; i <= nQuestions; i++)
        {
            if ( ProbValue[i] == undefined ) ProbValue[i]=0
            f = this.getField("qMark."+qtfield+"."+(i-1));
            if ( f != null )
            {
%    \end{macrocode}
% (3/22/04) This is code to account for grouping
%    \begin{macrocode}
                // find the next non-null field
                for ( var j=i; j <= nQuestions; j++)
                {
                    var h = this.getField("qMark."+qtfield+"."+j);
                    if ( h != null ) break;
                }
                var g = f.getArray();
                var qpts = ( ProbDist[i] == undefined ) ? 0 : ProbDist[i];
%console.println("qpts = " + qpts);
                g[0].value = qpts + (( qpts == 1 ) ? "pt " : " pts");
%                g[0].value = qpts + " pts";
            }
        }
        this.getField("qMark").display = display.visible;
    }
}
\end{newsegment}
%    \end{macrocode}
% \subsection{Miscellaneous JS}
%    \begin{macrocode}
\begin{newsegment}{Eq: Miscellaneous JS}
%    \end{macrocode}
% This function notifies the calling field of the results. If flag=0,
% it changes the color of the field and updates the tally field.
%    \begin{macrocode}
function notifyField(success, flag, fieldname) {
    if (success) {
        if (flag == 0) {
            this.getField(fieldname).strokeColor = \correctColor;
        }
        return true;
    }
    else {
        if (flag == 0) {
            updateTally(fieldname);
            this.getField(fieldname).strokeColor = \wrongColor;
        }
        return false;
    }
    return null;
}
%    \end{macrocode}
%    \begin{macrocode}
function updateTally(fieldname)
{
    var objre = /^obj\./;
    var grpre = /^grpobj\./;
%    \end{macrocode}
% If the question is part of a group of questions, then it has a root name of ``grpobj''.
% This root needs to be removed, as well as the sub-group number.
%    \begin{macrocode}
    if ( grpre.test(fieldname) ) {
        fieldname = fieldname.replace(grpre,"");
        var pos = fieldname.lastIndexOf(".");
        fieldname = fieldname.substring(0,pos);
    } else if ( objre.test(fieldname) ) fieldname = fieldname.replace(objre,"");
    var f = this.getField("tally."+fieldname)
    if ( f != null ) {
        f.value += 1;
        return true;
    } else return false;

}
function noPeek(qtfield,rtnPage)
{
    if ( (typeof (aQuizControl[qtfield]) == "undefined") || (aQuizControl[qtfield] != -1) )
    {
        this.pageNum = rtnPage-1;
        app.alert(\noPeekMsg,3);
    }
}
%    \end{macrocode}
% When the user exits a fill-in shortquiz field, this function is called.
% It immediately notifies notifies user of whether their answer is right
% or wrong, and changes the color of the boundary field.
%    \begin{macrocode}
function OnBlurRespBox (retn)
{
    var respMsg;
    var cTitle = "AcroTeX eDucation Bundle";
    if (retn != null) {
        if ( typeof appAlerts[arguments[1]] == "undefined")
            appAlerts[arguments[1]] = {bAfterValue: false};

        var respMsg = (retn) ? \eqsqrtmsg : \eqsqwgmsg;

        if (event.target == this)
            app.alert({ cMsg: respMsg, nIcon: 3, cTitle: cTitle });
        else {
            if ( ! appAlerts[arguments[1]].bAfterValue )
                app.alert({ cMsg: respMsg, nIcon: 3, cTitle: cTitle,
                oCheckbox: appAlerts[arguments[1]]});
        }
    }
    else {
        var str = event.target.value.toString();
        if (str.replace(/\s/g,"") == "")
            event.target.strokeColor = \eqDefaultColor;
    }
}
%    \end{macrocode}
% Description: This is the default function for determining whether
%   the minimal requirements for finishing a quiz have been met. The
%   default is that there is no minimal requirement.
% Arguments: qtfield = name of the field.
% Returns: true if minimum threshold is met, false otherwise.
%    \begin{macrocode}
function lowThreshold(nQuestions)
{
    return true;
}
%    \end{macrocode}
% Description: This is the default function for determining whether
%   the minimal requirements for finishing a quiz have been met. Here
%   the requirements are to answer all the questions.
% Arguments: qtfield = name of the field.
% Returns: true if minimum threshold is met, false otherwise.
%
% \noindent You can define this function as the default threshold function by
% typing\par
%\begin{verbatim}
%\renewcommand\minQuizResp{highThreshold}
%\end{verbatim}
%    \begin{macrocode}
function highThreshold(nQuestions)
{
    if (Responses.length <= nQuestions)
        app.alert(\highThresholdMsg,3)
    return (Responses.length > nQuestions);
}
\end{newsegment}
%    \end{macrocode}
% \subsection{Support for Grouped Questions}
% These function can be called by the \texttt{mathGrp} environment to score the user's
% responses to the grouped questions.
%    \begin{macrocode}
\begin{newsegment}{Eq: Support for Grouped Questions}
function groupEval(doc,qtfield,probno,aKey,aWeights)
{
    var totalGrpPts = aWeights[0];
    var totalWeight = aWeights[1];
    var total=0;
    for ( var i=1; i< aKey.length; i++ )
        if (aKey[i] != undefined) total += aKey[i]*aWeights[i+1];
    return total;
}
function WeightedEval(doc,qtfield,probno,aKey,aWeights)
{
    var f = doc.getField("grpobj." + qtfield + "." + probno);
    var nGrpQno = f.getArray().length;
    var totalGrpPts = aWeights[0];
    var totalWeight = aWeights[1];
    var total=0;
    for ( var i=1; i < aKey.length; i++ )
        if (aKey[i] != undefined) total += aKey[i]*aWeights[i+1];
    total /= totalWeight;
    total = Math.floor( total * totalGrpPts );
    return total;
}
\end{newsegment}
\end{insDLJS*}
%</aebjs>
%    \end{macrocode}
%    \section{Language Definitions}
% \StopEventually{Comment out \cs{OnlyDescription}
%   at the beginning of this file to see the language code.}
%    \subsection{French}
%    \begin{macrocode}
%<*eqfr>
%    \end{macrocode}
%    \begin{macrocode}
%%%%%%%%%%%%%%%%%%%%%%% eqfr.def %%%%%%%%%%%%%%%%%%%%%%%
%% Foreign language support for the exerquiz package. %%
%% Name of translator: Jean-Michel SARLAT             %%
%% Language: French                                   %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Exercise label
\renewcommand\exlabel{Exercice}
% The value of this macro is written to \jobname.sol,
% accented characters must be protected with a \noexpand
\renewcommand\exlabelsol{\exlabel}

% Solution label for solutionafter option for exercise
\renewcommand\exsolafter{\textit{Solution} :}

% Title of exercise solution section
\renewcommand\exsectitle{Solutions des \exlabelsol s}
\renewcommand\exsecrunhead{\exsectitle}

% Title of quiz solution section
\renewcommand\eq@sqslsectitle{Les r\'{e}ponses aux questionnaires}
\renewcommand\sqslsectitle{\eq@sqslsectitle}

% Running header/section title for solutions to quizzes
\renewcommand\eq@sqslsecrunhead{Les r\'{e}ponses aux questionnaires}
% User access
\renewcommand\sqslsecrunhead{\eq@sqslsecrunhead}

% Label for solutions to quizzes, appears in solutions sections
\renewcommand\eq@sqsllabel{%
   \string\textbf{R\noexpand\'{e}ponse :}}
\renewcommand\sqsllabel{\eq@sqsllabel}% User access

% Solution label for solutionafter option for shortquiz
\renewcommand\sqsolafter{\textit{Solution} :}

% Here is the default short quiz label.
\renewcommand\eq@sqlabel{\textcolor{red}{Question.}}
% User access to shortquiz label
\renewcommand\sqlabel{\eq@sqlabel}

% Here is the default short quiz return label
% No formatting allowed
\renewcommand\eq@sqslrtnlabel{Retour au questionnaire.}
% User access to shortquiz label
\renewcommand\sqslrtnlabel{\eq@sqslrtnlabel}

% Short quiz feedback messages
\renewcommand\eqsqrtmsg{"Exact !"}
\renewcommand\eqsqwgmsg{"Faux !"}

% Here is the default quiz label. No formatting allowed!
\renewcommand\eq@bqlabel{D\'ebut}
% User access to shortquiz label
\renewcommand\bqlabel{\eq@bqlabel}
%==> modif JMS <==%
% Les modifications du contenu de \eqlabel ne seront pas prises en
% compte dans les messages de javascript (pb pour faire passer les
% accents dans le code !). Ceci justifie pour moi l'introduction de
% la variable \bqlabelISO ou le label de debut de questionnaire est
% cod\'{e}  ISO (octal). Cela parce que je veux utiliser le mot D\'ebut.
% Use \string\351, this helps out TeX4ht by Eitan Gurari
\renewcommand\eq@bqlabelISO{D\string\351but}
\renewcommand\bqlabelISO{\eq@bqlabelISO}

% Here is the default quiz label.
\renewcommand\eq@eqlabel{Fin}
% User access to shortquiz label
\renewcommand\eqlabel{\eq@eqlabel}
%
% JavaScript Messages for Quiz Environments
\renewcommand\eq@Score{Score :}\renewcommand\eq@OutOf{sur}
\renewcommand\eqInitQuizMsg{%
   "Vous devez initialiser le questionnaire ! Clicker sur "+msg+"."}
\renewcommand\eqMadeChoice{
   "Vous avez d\string\\351j\string\\340 fait un choix,
    ce choix est ("+Responses[probno]+").
    Souhaitez vous le modifier ?"}
%
% Valeur "Yes" d'Acrobat
%
% Default button labels for \eqButton
%\renewcommand\eq@local@CA{R\string\351ponses}
\renewcommand\eq@local@CA{%
    R\texorpdfstring{\'}{\string\351}ponses}
\renewcommand\eq@local@RC{Correctes}
\renewcommand\eq@local@AC{SVP !}
%</eqfr>
%    \end{macrocode}
%    \subsection{German}
%    \begin{macrocode}
%<*eqde>
%    \end{macrocode}
%    \begin{macrocode}
%%%%%%%%%%%%%%%%%%%% eqde.def %%%%%%%%%%%%%%%%%%%%%%%%%%
%% Foreign language support for the exerquiz package. %%
%% Name of translator: Michael Wiedmann               %%
%% e-mail address: michael.wiedmann@detewe.de         %%
%% Language: German                                   %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% The exercise label
\renewcommand\exlabel{\"Ubung}
% The value of this macro is written to \jobname.sol,
% accented characters must be protected with a \noexpand
\renewcommand\exlabelsol{\noexpand\"Ubung}

% Title of exercise solution section
\renewcommand\exsectitle{L\"osungen der \exlabel en}
\renewcommand\exsecrunhead{L\noexpand\"osungen der \exlabelsol en}

% Solution label for solutionafter option
\renewcommand\exsolafter{\textit{L\"osung}:}

% Title of quiz solution section
\renewcommand\eq@sqslsectitle{L\"osungen der Aufgaben}
\renewcommand\sqslsectitle{\eq@sqslsectitle}

% Running header/section title for solutions to quizzes
%\renewcommand\eq@sqslsecrunhead{L\"osungen der \"Ubungen}
\renewcommand\eq@sqslsecrunhead{L\"osungen der Aufgaben}
% User access
\renewcommand\sqslsecrunhead{\eq@sqslsecrunhead}

% Label for solutions to quizzes, appears in solutions sections
\renewcommand\eq@sqsllabel{%
   \string\textbf{L\noexpand\"osung zu Aufgabe:}}
% User access
\renewcommand\sqsllabel{\eq@sqsllabel}

% Solution label for solutionafter option for shortquiz
\renewcommand\sqsolafter{\textit{L\"osung}:}

% Here is the default short quiz label.
\renewcommand\eq@sqlabel{\textcolor{red}{Aufgabe}}
% User access to shortquiz label
\renewcommand\sqlabel{\eq@sqlabel}

% Here is the default short quiz return label
%\renewcommand\eq@sqslrtnlabel{Ende Aufgabe}
\renewcommand\eq@sqslrtnlabel{Test beenden}
% User access to shortquiz label
\renewcommand\sqslrtnlabel{\eq@sqslrtnlabel}

% Short quiz feedback messages
\renewcommand\eqsqrtmsg{"Richtig!"}
\renewcommand\eqsqwgmsg{"Falsch!"}

% Here is the default quiz label.
%\renewcommand\eq@bqlabel{Beginn Aufgabe}
\renewcommand\eq@bqlabel{Test starten}
% User access to quiz label
\renewcommand\bqlabel{\eq@bqlabel}
% Used for writing JavaScript Messages on screen. Use PDFDocEncoding
\renewcommand\eq@bqlabelISO{\eq@bqlabel}
\renewcommand\bqlabelISO{\eq@bqlabelISO}

% Here is the default quiz label.
%\renewcommand\eq@eqlabel{Ende Aufgabe}
\renewcommand\eq@eqlabel{Test beenden}
% User access to quiz label
\renewcommand\eqlabel{\eq@eqlabel}

% JavaScript Messages for Quiz Environments. Use PDFDocEncoding
%
\renewcommand\eq@Score{Punkte:}\renewcommand\eq@OutOf{von}
%\renewcommand\eqInitQuizMsg{%
%   "Sie m\string\374ssen die Aufgaben initialisieren!"
%   +" Bitte klicken Sie auf "+msg+"."}
\renewcommand\eqInitQuizMsg{%
   "Sie m\string\374ssen die Aufgaben zuerst initialisieren!"
   +" Bitte klicken Sie hierf\string\374r auf "+msg+" am Anfang des Tests."}
\renewcommand\eqMadeChoice{%
   "Sie haben bereits geantwortet.
    Ihre Antwort war ("+Responses[probno]+").
    Wollen Sie dies \string\344ndern?"}
%
% Default button labels for \eqButton
\renewcommand\eq@local@CA{Richtig}
\renewcommand\eq@local@RC{Meine Antworten!}
\renewcommand\eq@local@AC{Bitte!}

\renewcommand\eqerrABS{"Betr\string\344ge sind nicht ausgeglichen. Bitte korrigieren
    Sie das."}
\renewcommand\eqerrBadMathFunc{"Der Ausdruck `"+aF[i]+"' ist weder
    eine definierte Funktion noch ein g\string\374ltiger mathematischer Ausdruck."}
\renewcommand\eqParens{"runde Klammern"} % ( )
\renewcommand\eqBrackets{"eckige Klammern"} % [ ]
\renewcommand\eqBraces{"geschweifte Klammern"} % { }
\renewcommand\eqerrDelimNotBal{aGroup[i][2] + " sind nicht ausgeglichen.
    Bitte korrigieren Sie das."}
\renewcommand\eqerrBadExp{"Ung\string\374ltiger mathematischer Ausdruck.
    Es gibt ein Problem mit einem der Exponenten. Bitte korrigieren Sie das."}
\renewcommand\eqerrUnfinishQuiz{"Sie haben einen Test nicht beendet.
    Bitte beenden Sie diesen, bevor Sie einen neuen Test beginnen."}
\renewcommand\noPeekMsg{"Bevor Sie den Test nicht beendet haben, ist es
    nicht erlaubt, die Lösungen anzuschauen!"}
\renewcommand\highThresholdMsg{"Sie m\string\374ssen alle Fragen beantworten, bevor
    der Test ausgewertet wird."}
\renewcommand\eqSyntaxErrorUndefVar{"Syntax Error: Es existiert
    möglicherweise eine undefinierte Variable oder ein Ausdruck ist nicht im
    erwarteten Format geschrieben."}
%</eqde>
%    \end{macrocode}
%    \subsection{Norwegian}
%    \begin{macrocode}
%<*eqno>
%%%%%%%%%%%%%%%%%%%% eqno.def %%%%%%%%%%%%%%%%%%%%%%%%%%
%% Foreign language support for the exerquiz package. %%
%% Name of translator: Hans Fredrik Nordhaug          %%
%% e-mail address: hansfn@mi.uib.no                   %%
%% Language: Norwegian                                %%
%%                                                    %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\renewcommand\exlabel{{\O}velse}
\renewcommand\exlabelsol{{\noexpand\O}velse}

\renewcommand\exsectitle{L{\o}sning p{\aa} {\o}velsene}
\renewcommand\exsecrunhead{L{\noexpand\o}sning p{\noexpand\aa}
   {\noexpand\o}velsene}

\renewcommand\exsolafter{\textit{L{\o}sning}:}

\renewcommand\eq@sqslsectitle{L{\o}sning p{\aa} oppgavene}
\renewcommand\sqslsectitle{\eq@sqslsectitle}

\renewcommand\eq@sqslsecrunhead{L{\o}sning p{\aa} oppgavene}
\renewcommand\sqslsecrunhead{\eq@sqslsecrunhead}

\renewcommand\eq@sqsllabel{%
    \string\textbf{L{\noexpand\o}sning p{\noexpand\aa} oppgave:}}
\renewcommand\sqsllabel{\eq@sqsllabel}

\renewcommand\sqsolafter{\textit{L{\o}sning}:}

\renewcommand\eq@sqlabel{\textcolor{red}{Oppgave}}
\renewcommand\sqlabel{\eq@sqlabel}

\renewcommand\eq@sqslrtnlabel{Slutt}
\renewcommand\sqslrtnlabel{\eq@sqslrtnlabel}

\renewcommand\eqsqrtmsg{"Rett!"}
\renewcommand\eqsqwgmsg{"Feil!"}

\renewcommand\eq@bqlabel{Start oppgaver}
\renewcommand\bqlabel{\eq@bqlabel}
\renewcommand\eq@bqlabelISO{\eq@bqlabel}
\renewcommand\bqlabelISO{\eq@bqlabel}

\renewcommand\eq@eqlabel{Slutt}
\renewcommand\eqlabel{\eq@eqlabel}

\renewcommand\eqScore{Poeng:}\renewcommand\eqOutOf{av}
\renewcommand\eqInitQuizMsg{"Du m\string\\345 initialisere testen!"
+" Klikk p\string\\345 "+msg+"."}
\renewcommand\eqMadeChoice{%
    "Du har allerede gjort et valg.
     Valget var ("+Responses[probno]+").
     Vil du endre det?"}
\renewcommand\eq@local@CA{Rett}
\renewcommand\eq@local@RC{mine svar!}
%\renewcommand\eq@local@AC{V\string\346r s\string\345 snill!}}
\renewcommand\eq@local@AC{%
    V\texorpdfstring{\ae}{\string\346}r s\texorpdfstring{\r}{\string\345}snill!}
%</eqno>
%    \end{macrocode}
%    \subsection{Dutch}
%    \begin{macrocode}
%<*eqnl>
%%%%%%%%%%%%%%%%%%% eqnl.def %%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Foreign language support for the exerquiz package. %%
%% Name of translator: Henny Wilbrink                 %%
%% e-mail address: wsdwhw@win.tue.nl                  %%
%% Language: Dutch                                    %%
%%                                                    %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% The exercise label
\renewcommand\exlabel{Opgave}
\renewcommand\exlabelsol{\exlabel}

% Title of exercise solution section
\renewcommand\exsectitle{Oplossingen van de Opgaven}
\renewcommand\exsecrunhead{\exsectitle}

% Solution label for solutionafter option for exercise
\renewcommand\exsolafter{\textit{Oplossing}:}

% Title of short quiz solution section
\renewcommand\eq@sqslsectitle{Oplossingen van de Toetsen}
\renewcommand\sqslsectitle{\eq@sqslsectitle}

% Running header/section title for solutions to short quizzes
\renewcommand\eq@sqslsecrunhead{Oplossingen van de Toetsen}
% User access
\renewcommand\sqslsecrunhead{\eq@sqslsecrunhead}

% Solution label for solutionafter option
\renewcommand\exsolafter{\textit{Oplossing}:}

% Label for solutions to short quizzes, appears in solutions sections
\renewcommand\eq@sqsllabel{\string\textbf{Oplossing van Toets:}}
% User access
\renewcommand\sqsllabel{\eq@sqsllabel}

% Solution label for solutionafter option for shortquiz
\renewcommand\sqsolafter{\textit{Oplossing}:}

% Here is the default short quiz label.
\renewcommand\eq@sqlabel{\textcolor{red}{Toets.}}
% User access to shortquiz label
\renewcommand\sqlabel{\eq@sqlabel}

% Here is the default short quiz return label
\renewcommand\eq@sqslrtnlabel{Terug naar Toets}
% User access to shortquiz label
\renewcommand\sqslrtnlabel{\eq@sqslrtnlabel}

% Short quiz feedback messages
\renewcommand\eqsqrtmsg{"Goed!"}
\renewcommand\eqsqwgmsg{"Fout!"}

% Here is the default quiz label.
\renewcommand\eq@bqlabel{Begin Toets}
% User access to shortquiz label
\renewcommand\bqlabel{\eq@bqlabel}
% Used for writing JavaScript Messages on screen. Use PDFDocEncoding
\renewcommand\eq@bqlabelISO{\eq@bqlabel}
\renewcommand\bqlabelISO{\eq@bqlabel}

% Here is the default quiz label.
% No formatting allowed
\renewcommand\eq@eqlabel{Einde Toets}
% User access to shortquiz label
\renewcommand\eqlabel{\eq@eqlabel}

%
% JavaScript Messages for Quiz Environments. Use PDFDocEncoding
%
\renewcommand\eq@Score{Score:}\renewcommand\eq@OutOf{van de}

\renewcommand\eqInitQuizMsg{%
  "U moet de Toets initialiseren! Klik op "+msg+"."}
\renewcommand\eqMadeChoice{%
   "U hebt al een keuze gemaakt.
    Uw keuze was ("+Responses[probno]+").
    Wil u dit veranderen?"}
%
% Default button labels for \eqButton
\renewcommand\eq@local@CA{Corrigeer}
\renewcommand\eq@local@RC{Mijn Antwoorden!}
\renewcommand\eq@local@AC{AUB!}
%</eqnl>
%    \end{macrocode}
%    \subsection{Spanish}
%    \begin{macrocode}
%<*eqes>
%%%%%%%%%%%%%%%%%%% eqes.def %%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Foreign language support for the exerquiz package. %%
%% Name of translator: Pedro Luis Luque               %%
%% e-mail address: calvo@cica.es                      %%
%% Language:  (spanish)                               %%
%%                                                    %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% The exercise label
\renewcommand\exlabel{Ejercicio}
% The value of this macro is written to \jobname.sol,
\renewcommand\exlabelsol{\exlabel}

% Title of exercise solution section
\renewcommand\exsectitle{Soluciones a los \exlabel s}
\renewcommand\exsecrunhead{\exsectitle} %% change to @ form

% Solution label for solutionafter option for exercise
\renewcommand\exsolafter{\textit{Soluci\'{o}n}:}

% Title of short quiz solution section
\renewcommand\eq@sqslsectitle{Soluciones a los Tests}
\renewcommand\sqslsectitle{\eq@sqslsectitle}

% Running header/section title for solutions to short quizzes
\renewcommand\eq@sqslsecrunhead{Soluciones a los Tests}
% User access
\renewcommand\sqslsecrunhead{\eq@sqslsecrunhead}

% Label for solutions to short quizzes, appears in solutions sections
\renewcommand\eq@sqsllabel{%
  \string\textbf{Soluci\noexpand\'{o}n al Test:}}
% User access
\renewcommand\sqsllabel{\eq@sqsllabel}

% Solution label for solutionafter option for shortquiz
\renewcommand\sqsolafter{\textit{Soluci\'{o}n}:}

% Here is the default short quiz label.
\renewcommand\eq@sqlabel{\textcolor{red}{Test.}}
% User access to shortquiz label
\renewcommand\sqlabel{\eq@sqlabel}

% Here is the default short quiz return label
\renewcommand\eq@sqslrtnlabel{Final del Test}
% User access to shortquiz label
\renewcommand\sqslrtnlabel{\eq@sqslrtnlabel}

% Short quiz feedback messages
\renewcommand\eqsqrtmsg{"Correcto!"}
\renewcommand\eqsqwgmsg{"Incorrecto!"}

% Here is the default quiz label.
\renewcommand\eq@bqlabel{Inicio del Test}
% User access to shortquiz label
\renewcommand\bqlabel{\eq@bqlabel}
% Used for writing JavaScript Messages on screen. Use PDFDocEncoding
\renewcommand\eq@bqlabelISO{\eq@bqlabel}
\renewcommand\bqlabelISO{\eq@bqlabel}

% Here is the default quiz label.
% No formatting allowed
\renewcommand\eq@eqlabel{Final del Test}
% User access to shortquiz label
\renewcommand\eqlabel{\eq@eqlabel}
%
% JavaScript Messages for Quiz Environments. Use PDFDocEncoding
%
\renewcommand\eq@Score{Puntos:}\renewcommand\eq@OutOf{de}
\renewcommand\eqInitQuizMsg{"Debes inicializar el Test! Click sobre "+msg+"."}
\renewcommand\eqMadeChoice{%
   "Ya has elegido una respuesta.
    Tu respuesta fue ("+Responses[probno]+").
    Quieres cambiarla?"}
%
% Default button labels for \eqButton
\renewcommand\eq@local@CA{Correctas}
\renewcommand\eq@local@RC{Mis Respuestas!}
\renewcommand\eq@local@AC{Por Favor!}
%</eqes>
%    \end{macrocode}
%    \subsection{Italian}
%    \begin{macrocode}
%<*eqit>
%%%%%%%%%%%%%%%%%%% eqit.def %%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Foreign language support for the exerquiz package. %%
%% Name of translator:  PierLuigi Zezza               %%
%% e-mail address:  pzezza@cce.unifi.it               %%
%% Language: Italian                                  %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% The exercise label
\renewcommand\exlabel{Esercizio}
%
% The value of this macro is written to \jobname.sol,
\renewcommand\exlabelsol{\exlabel}
%
% Title of exercise solution section
\renewcommand\exsectitle{Soluzioni degli Esercizi }
\renewcommand\exsecrunhead{\exsectitle}
%
% Solution label for solutionafter option for exercise
\renewcommand\exsolafter{\textit{Soluzione}:}
%
% Title of short quiz solution section
\renewcommand\eq@sqslsectitle{Soluzioni dei Quiz}
\renewcommand\sqslsectitle{\eq@sqslsectitle}
%
% Running header/section title for solutions to short quizzes
\renewcommand\eq@sqslsecrunhead{Soluzioni dei Quiz}
%
% User access
\renewcommand\sqslsecrunhead{\eq@sqslsecrunhead}
%
% Label for solutions to short quizzes, appears in solutions sections
\renewcommand\eq@sqsllabel{\string\textbf{Soluzione del Quiz:}}
%
% User access
\renewcommand\sqsllabel{\eq@sqsllabel}
%
% Solution label for solutionafter option for shortquiz
\renewcommand\sqsolafter{\textit{Soluzione}:}
%
% Here is the default short quiz label.
\renewcommand\eq@sqlabel{\textcolor{red}{Quiz.}}
%
% User access to shortquiz label
\renewcommand\sqlabel{\eq@sqlabel}
%
% Here is the default short quiz return label
\renewcommand\eq@sqslrtnlabel{Fine Quiz}
%
% User access to shortquiz label
\renewcommand\sqslrtnlabel{\eq@sqslrtnlabel}
%
% Short quiz feedback messages
\renewcommand\eqsqrtmsg{"Giusto!"}
\renewcommand\eqsqwgmsg{"Sbagliato!"}
%
% Here is the default quiz label.
% No formatting allowed
\renewcommand\eq@bqlabel{Inizio Test}
%
% User access to shortquiz label
\renewcommand\bqlabel{\eq@bqlabel}
\renewcommand\eq@bqlabelISO{\eq@bqlabel}
\renewcommand\bqlabelISO{\eq@bqlabel}
%
% Here is the default quiz label.
% No formatting allowed
\renewcommand\eq@eqlabel{Fine Test}
%
% User access to shortquiz label
\renewcommand\eqlabel{\eq@eqlabel}
%
% JavaScript Messages for Quiz Environments. Use PDFDocEncoding
%
\renewcommand\eq@Score{Punteggio:}\renewcommand\eq@OutOf{su}
\renewcommand\eqInitQuizMsg{"Dovete inizializzare il Quiz! Click su "+msg+"."}
\renewcommand\eqMadeChoice{%
   "Avete gi\string\\340 fatto una scelta.
    La vostra scelta era ("+Responses[probno]+").
    Volete cambiarla ?"}
%
% Default button labels for \eqButton
\renewcommand\eq@local@CA{Correggere}
\renewcommand\eq@local@RC{Le mie risposte!}
\renewcommand\eq@local@AC{Per favore!}
%</eqit>
%    \end{macrocode}
%    \subsection{Russian}
%    \begin{macrocode}
%<*eqru>
%%%%%%%%%%%%%%%%%%% eqru.def %%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Foreign language support for the exerquiz package. %%
%% Name of translator:  Sergei V. Znamenskii          %%
%% e-mail address:  znamensk@rustex.botik.ru          %%
%% Language: Russian                                  %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\edef\restoreAtCatcode{\noexpand\catcode64 =\the\catcode64 }%
\catcode`\@=11
\gdef\eq@protected#1#2{{\ifhmode #2\else
    \ifvmode #2\else\ifinner#2\else\noexpand #1\fi\fi\fi}}%
\def\cyrCommand#1#2{\def#1{\eq@protected#1{#2}}}%
%
% The exercise label
\cyrCommand\exlabel{\CYRU\cyrp\cyrr\cyra\cyrzh\cyrn
        \cyre\cyrn\cyri\cyre}%
% The value of this macro is written to \jobname.sol,
\cyrCommand\exlabelsol{\CYRK{ }\cyru\cyrp\cyrr\cyra\cyrzh\cyrn
        \cyre\cyrn\cyri\cyryu}%
%
% Title of exercise solution section
\cyrCommand\exsectitle{\CYRR\cyre\cyrsh\cyre\cyrn\cyri\cyrya{ }%
        \cyru\cyrp\cyrr\cyra\cyrzh\cyrn\cyre\cyrn\cyri\cyrishrt}%
\renewcommand\exsecrunhead{\exsectitle}
%
% Solution label for solutionafter option for exercise
\cyrCommand\exsolafter{\textit{\CYRR\cyre\cyrsh\cyre\cyrn\cyri\cyre}:}%
%
% Title of short quiz solution section
\cyrCommand\eq@sqslsectitle{\CYRO\cyrt\cyrv\cyre\cyrt\cyrery{ }%
        \cyrk{ }\cyrt\cyre\cyrs\cyrt\cyra\cyrm}%
\renewcommand\sqslsectitle{\eq@sqslsectitle}
% Running header/section title for solutions to short quizzes
\renewcommand\eq@sqslsecrunhead{\eq@sqslsectitle}%
% User access
\renewcommand\sqslsecrunhead{\eq@sqslsecrunhead}
% Label for solutions to short quizzes, appears in solutions sections
\cyrCommand\eqSqsllabel{\textbf{\CYRO\cyrt\cyrv\cyre\cyrt}:}%
\renewcommand\eq@sqsllabel{\eqSqsllabel}%
% User access
\renewcommand\sqsllabel{\eq@sqsllabel}
% Solution label for solutionafter option for shortquiz
\cyrCommand\sqsolafter{\textit{\CYRR\cyre\cyrsh\cyre
        \cyrn\cyri\cyre}:}% ??
% Here is the default short quiz label.
\cyrCommand\eq@sqlabel{\textcolor{red}{\CYRV\cyro\cyrp\cyrr\cyro\cyrs}}%
% User access to shortquiz label
\renewcommand\sqlabel{\eq@sqlabel}
% Here is the default short quiz return label
\cyrCommand\eqsqslrtnlabel{\CYRK{ }%
        \cyrf\cyro\cyrr\cyrm\cyru\cyrl\cyri\cyrr\cyro\cyrv\cyrk\cyre{ }%
        \cyrv\cyro\cyrp\cyrr\cyro\cyrs\cyra}%
% User access to shortquiz label
\renewcommand\eq@sqslrtnlabel{\eqsqslrtnlabel}
% Short quiz feedback messages
\renewcommand\eqsqrtmsg{"BEPHO !!! "}%
\renewcommand\eqsqwgmsg{"HEBEPHO !!! "}%
% Here is the default quiz label.
\renewcommand\eq@bqlabel{CTAPT!}%
% User access to shortquiz label
\renewcommand\bqlabel{\eq@bqlabel}
% Used for writing JavaScript Messages on screen. Use PDFDocEncoding
\renewcommand\eq@bqlabelISO{\eq@bqlabel}
\renewcommand\bqlabelISO{\eq@bqlabel}
% Here is the default quiz label.
% No formatting allowed
\cyrCommand\eq@eqlabel{CYRI\CYRT\CYRO\CYRG\CYRO:}%
% User access to shortquiz label
\renewcommand\eqlabel{\eq@eqlabel}
%
% JavaScript Messages for Quiz Environments. Use PDFDocEncoding
%
\renewcommand\eq@Score{ ?}\renewcommand\eq@OutOf{}
\renewcommand\eqInitQuizMsg{"HA CTAPT !!! "}%
\renewcommand\eqMadeChoice{"AX, HE TAK ?"}%
% \renewcommand\eqQuizTotalMsg{%
%   "\space"+Score+"/\thequestionno\space"}%
\renewcommand\eqQuizTotalMsg{%
  "\space"+Score+"/"+nQuestions\space"}%
% Russian letters on outlines should be transliterated.
% It is the best choice for them
\DeclareTextCommand{\cyra    }{PD1}{a} % Cyrillic letter
\DeclareTextCommand{\cyrb    }{PD1}{b} % Cyrillic letter
\DeclareTextCommand{\cyrv    }{PD1}{v} % Cyrillic letter
\DeclareTextCommand{\cyrg    }{PD1}{g} % Cyrillic letter
\DeclareTextCommand{\cyrd    }{PD1}{d} % Cyrillic letter
\DeclareTextCommand{\cyre    }{PD1}{e} % Cyrillic letter
\DeclareTextCommand{\cyryo   }{PD1}{yo} % Cyrillic letter
\DeclareTextCommand{\cyrzh   }{PD1}{zh} % Cyrillic letter
\DeclareTextCommand{\cyrz    }{PD1}{z} % Cyrillic letter
\DeclareTextCommand{\cyri    }{PD1}{i} % Cyrillic letter
\DeclareTextCommand{\cyrishrt}{PD1}{i} % Cyrillic letter
\DeclareTextCommand{\cyrk    }{PD1}{k} % Cyrillic letter
\DeclareTextCommand{\cyrl    }{PD1}{l} % Cyrillic letter
\DeclareTextCommand{\cyrm    }{PD1}{m} % Cyrillic letter
\DeclareTextCommand{\cyrn    }{PD1}{n} % Cyrillic letter
\DeclareTextCommand{\cyro    }{PD1}{o} % Cyrillic letter
\DeclareTextCommand{\cyrp    }{PD1}{p} % Cyrillic letter
\DeclareTextCommand{\cyrr    }{PD1}{r} % Cyrillic letter
\DeclareTextCommand{\cyrs    }{PD1}{s} % Cyrillic letter
\DeclareTextCommand{\cyrt    }{PD1}{t} % Cyrillic letter
\DeclareTextCommand{\cyru    }{PD1}{u} % Cyrillic letter
\DeclareTextCommand{\cyrf    }{PD1}{f} % Cyrillic letter
\DeclareTextCommand{\cyrh    }{PD1}{h} % Cyrillic letter
\DeclareTextCommand{\cyrc    }{PD1}{c} % Cyrillic letter
\DeclareTextCommand{\cyrch   }{PD1}{ch} % Cyrillic letter
\DeclareTextCommand{\cyrsh   }{PD1}{sh} % Cyrillic letter
\DeclareTextCommand{\cyrshch }{PD1}{shch} % Cyrillic letter
\DeclareTextCommand{\cyrhrdsn}{PD1}{"} % Cyrillic letter
\DeclareTextCommand{\cyrery  }{PD1}{y} % Cyrillic letter
\DeclareTextCommand{\cyrsftsn}{PD1}{'} % Cyrillic letter
\DeclareTextCommand{\cyrerev }{PD1}{e1} % Cyrillic letter
\DeclareTextCommand{\cyryu   }{PD1}{yu} % Cyrillic letter
\DeclareTextCommand{\cyrya   }{PD1}{ya} % Cyrillic letter
\DeclareTextCommand{\CYRA    }{PD1}{A} % Cyrillic letter
\DeclareTextCommand{\CYRB    }{PD1}{B} % Cyrillic letter
\DeclareTextCommand{\CYRV    }{PD1}{V} % Cyrillic letter
\DeclareTextCommand{\CYRG    }{PD1}{G} % Cyrillic letter
\DeclareTextCommand{\CYRD    }{PD1}{D} % Cyrillic letter
\DeclareTextCommand{\CYRE    }{PD1}{E} % Cyrillic letter
\DeclareTextCommand{\CYRYO   }{PD1}{YO} % Cyrillic letter
\DeclareTextCommand{\CYRZH   }{PD1}{ZH} % Cyrillic letter
\DeclareTextCommand{\CYRZ    }{PD1}{Z} % Cyrillic letter
\DeclareTextCommand{\CYRI    }{PD1}{I} % Cyrillic letter
\DeclareTextCommand{\CYRISHRT}{PD1}{I} % Cyrillic letter
\DeclareTextCommand{\CYRK    }{PD1}{K} % Cyrillic letter
\DeclareTextCommand{\CYRL    }{PD1}{L} % Cyrillic letter
\DeclareTextCommand{\CYRM    }{PD1}{M} % Cyrillic letter
\DeclareTextCommand{\CYRN    }{PD1}{N} % Cyrillic letter
\DeclareTextCommand{\CYRO    }{PD1}{O} % Cyrillic letter
\DeclareTextCommand{\CYRP    }{PD1}{P} % Cyrillic letter
\DeclareTextCommand{\CYRR    }{PD1}{R} % Cyrillic letter
\DeclareTextCommand{\CYRS    }{PD1}{S} % Cyrillic letter
\DeclareTextCommand{\CYRT    }{PD1}{T} % Cyrillic letter
\DeclareTextCommand{\CYRU    }{PD1}{U} % Cyrillic letter
\DeclareTextCommand{\CYRF    }{PD1}{F} % Cyrillic letter
\DeclareTextCommand{\CYRH    }{PD1}{H} % Cyrillic letter
\DeclareTextCommand{\CYRC    }{PD1}{C} % Cyrillic letter
\DeclareTextCommand{\CYRCH   }{PD1}{CH} % Cyrillic letter
\DeclareTextCommand{\CYRSH   }{PD1}{SH} % Cyrillic letter
\DeclareTextCommand{\CYRSHCH }{PD1}{SHCH} % Cyrillic letter
\DeclareTextCommand{\CYRHRDSN}{PD1}{"} % Cyrillic letter
\DeclareTextCommand{\CYRERY  }{PD1}{Y} % Cyrillic letter
\DeclareTextCommand{\CYRSFTSN}{PD1}{'} % Cyrillic letter
\DeclareTextCommand{\CYREREV }{PD1}{E1} % Cyrillic letter
\DeclareTextCommand{\CYRYU   }{PD1}{YU} % Cyrillic letter
\DeclareTextCommand{\CYRYA   }{PD1}{YA} % Cyrillic letter
\restoreAtCatcode
%
% Default button labels for \eqButton
\renewcommand\eq@local@CA{KOPPEKTOP}
\renewcommand\eq@local@RC{KOPPEKTOP}
\renewcommand\eq@local@AC{KOPPEKTOP}
%</eqru>
%    \end{macrocode}
%    \subsection{Danish}
%    \begin{macrocode}
%<*eqda>
%%%%%%%%%%%%%%%%%%%% eqda.def %%%%%%%%%%%%%%%%%%%%%%%%%%
%% Foreign language support for the exerquiz package. %%
%% Name of translator: Erik Leimand                   %%
%% e-mail address: buhlleimand@worldonline.dk         %%
%% Language: Danish                                   %%
%%                                                    %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\renewcommand\exlabel{{\O}velse}
\renewcommand\exlabelsol{{\noexpand\O}velse}

\renewcommand\exsectitle{L{\o}sning p{\aa} {\o}velserne}
\renewcommand\exsecrunhead{L{\noexpand\o}sning p{\noexpand\aa}
   {\noexpand\o}velserne}

\renewcommand\exsolafter{\textit{L{\o}sning}:}

\renewcommand\eq@sqslsectitle{L{\o}sning p{\aa} opgaverne}
\renewcommand\sqslsectitle{\eq@sqslsectitle}

\renewcommand\eq@sqslsecrunhead{L{\o}sning p{\aa} opgaverne}
\renewcommand\sqslsecrunhead{\eq@sqslsecrunhead}

\renewcommand\eq@sqsllabel{%
    \string\textbf{L{\noexpand\o}sning p{\noexpand\aa} opgave:}}
\renewcommand\sqsllabel{\eq@sqsllabel}

\renewcommand\sqsolafter{\textit{L{\o}sning}:}

\renewcommand\eq@sqlabel{\textcolor{red}{Opgave.}}
\renewcommand\sqlabel{\eq@sqlabel}

\renewcommand\eq@sqslrtnlabel{Slut}
\renewcommand\sqslrtnlabel{\eq@sqslrtnlabel}

\renewcommand\eqsqrtmsg{"Rigtigt!"}
\renewcommand\eqsqwgmsg{"Forkert!"}

\renewcommand\eq@bqlabel{Start opgaver}
\renewcommand\bqlabel{\eq@bqlabel}
\renewcommand\eq@bqlabelISO{\eq@bqlabel}
\renewcommand\bqlabelISO{\eq@bqlabel}

\renewcommand\eq@eqlabel{Slut}
\renewcommand\eqlabel{\eq@eqlabel}

\renewcommand\eq@Score{Score:}\renewcommand\eq@OutOf{ud af}
%\renewcommand\eqQuizTotalMsg{"\eqScore\space"+Score+" \eqOutOf\space"+"\thequestionno"}
\renewcommand\eqQuizTotalMsg{"\eqScore\space"+Score+" \eqOutOf\space"+nQuestions}
\renewcommand\eqInitQuizMsg{"Du skal starte testen! Klik p\string\\345 "+msg+"."}
\renewcommand\eqMadeChoice{%
   "Du har allerede valgt.
    Du valgte ("+Responses[probno]+").
    Vil du \string\\346ndre det?"}
\renewcommand\eq@local@CA{Ret}
\renewcommand\eq@local@RC{Mine svar!}
%\renewcommand\eq@local@AC{V\string\346r s\string\345 god!}}
\renewcommand\eq@local@AC{%
    V\texorpdfstring{\ae}{\string\346}r s\texorpdfstring{\r}{\string\345}god!}
%</eqda>
%    \end{macrocode}
%    \subsection{Polish}
%    \begin{macrocode}
%<*eqpo>
%%%%%%%%%%%%%%%%%%%% eqpo.def %%%%%%%%%%%%%%%%%%%%%%%%%%
%% Foreign language support for the exerquiz package. %%
%% Name of translator: Jerzy Mycielski                %%
%% e-mail address: jmyc@poczta.onet.pl                %%
%% Language: Polish                                   %%
%%                                                    %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% The polish accented characters included in pdfendconding is
%% lslash and oacute, not included are zacute, zdot, cacute,
%% nacute, sacute, aogonek, eogonek and corresponding capital characters.
%  Z   \'{Z}  \u0179
%  a   \k{a}  \u0105
%  c   \'{c}  \u0107
%  l   \l     \u0142
%  s   \'{s}  \u015B
%  z   \.{z}  \u017C
%  ó   \'{o}  \u00F3
\renewcommand\exlabel{Zadanie}
\renewcommand\exlabelsol{\exlabel}

\renewcommand\exsectitle{Rozwi\k{a}zania Zada\'{n}}
\renewcommand\exsecrunhead{\noexpand\exsectitle}

\renewcommand\exsolafter{\textit{Rozwi\k{a}znie}:}

\renewcommand\eq@sqslsectitle{Rozwi\k{a}zania Test\'{o}w}
\renewcommand\sqslsectitle{\eq@sqslsectitle}

\renewcommand\eq@sqslsecrunhead{Rozwi\noexpand\k{a}zania Test\noexpand\'{o}w}
\renewcommand\sqslsecrunhead{\eq@sqslsecrunhead}

\renewcommand\eq@sqsllabel{\string\textbf{Rozwi\noexpand\k{a}zanie Testu:}}
\renewcommand\sqsllabel{\eq@sqsllabel}

\renewcommand\sqsolafter{\textit{Rozwi\k{a}zanie}:}

\renewcommand\eq@sqlabel{\textcolor{red}{Test.}}
\renewcommand\sqlabel{\eq@sqlabel}

%\renewcommand\eq@sqslrtnlabel{Zako\noexpand\'{n}cz Test}
\renewcommand\eq@sqslrtnlabel{Zako\ifeq@solutionsafter\else\expandafter\noexpand\fi\'{n}cz Test}
\renewcommand\sqslrtnlabel{\eq@sqslrtnlabel}

\renewcommand\eqsqrtmsg{"Dobrze!"}
\renewcommand\eqsqwgmsg{"\string\\u0179le!"}
%\renewcommand\eqsqwgmsg{"\'{Z}le!"}

\renewcommand\eq@bqlabel{Rozpocznij Test}
\renewcommand\bqlabel{\eq@bqlabel}
\renewcommand\eq@bqlabelISO{\eq@bqlabel}
\renewcommand\bqlabelISO{\eq@bqlabel}

\renewcommand\eq@eqlabel{Zakoncz Test}
% \renewcommand\eq@eqlabel{Zako\'{n}cz Test}
\renewcommand\eqlabel{\eq@eqlabel}

\renewcommand\eq@Score{Punkt\'{o}w:}\renewcommand\eq@OutOf{z mozliwych}
%\renewcommand\eq@Score{Punkt\'{o}w:}\renewcommand\eq@OutOf{z mo\'{z}liwych}
\renewcommand\eqQuizTotalMsg{"\eqScore\space"+Score+" \eqOutOf\space"+nQuestions}

\renewcommand\eqInitQuizMsg{"Musisz rozpoczac Test! Kliknij na "+msg+"."}
%\renewcommand\eqInitQuizMsg{"Musisz rozpocz\'{a}c Test! Kliknij na "+msg+"."}

\renewcommand\eqMadeChoice{%
   "Juz dokonal\string\\233e\string\\u015B wyboru.
    Twoim wyborem by\string\\233o ("+Responses[probno]+").
    Czy chcesz go zmieni\string\\u0107?"}
%\renewcommand\eqMadeChoice{%
%"Ju\.{z} dokona\string\233e\'{s} wyboru. Twoim wyborem"
%+" by\string\233o ("+Responses[probno]+")."+" Czy chcesz go zmieni\'{c}?"}

\renewcommand\eq@local@CA{Popraw}
\renewcommand\eq@local@RC{Moje odpowiedzi!}
\renewcommand\eq@local@AC{Prosze!}
%\renewcommand\eq@local@AC{Prosz\k{e}!}
%</eqpo>
%    \end{macrocode}
%    \subsection{Finnish}
%    \begin{macrocode}
%<*eqfin>
%%%%%%%%%%%%%%%%%%%% eqfin.def %%%%%%%%%%%%%%%%%%%%%%%%%%
%% Foreign language support for the exerquiz package.  %%
%% Name of translator: Paivi Porras                    %%
%% e-mail address: paivi.porras@lut.fi                 %%
%% Language: Finnish                                   %%
%%                                                     %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\renewcommand\exlabel{Harjoitus}
\renewcommand\exlabelsol{Harjoitus}

\renewcommand\exsectitle{Ratkaisut}
\renewcommand\exsecrunhead{Ratkaisu \exlabelsol }

\renewcommand\exsolafter{\textit{Ratkaisu}:}

\renewcommand\eq@sqslsectitle{Vastaukset testikysymyksiin}
\renewcommand\sqslsectitle{\eq@sqslsectitle}

\renewcommand\eq@sqslsecrunhead{Vastaukset testikysymyksiin}
\renewcommand\sqslsecrunhead{\eq@sqslsecrunhead}

\renewcommand\eq@sqsllabel{%
   \string\textbf{Vastaus testikysymykseen:}}
\renewcommand\sqsllabel{\eq@sqsllabel}

\renewcommand\sqsolafter{\textit{Ratkaisu}:}

\renewcommand\eq@sqlabel{\textcolor{red}{Testikysymys}}
\renewcommand\sqlabel{\eq@sqlabel}

\renewcommand\eq@sqslrtnlabel{Lopeta testi}
\renewcommand\sqslrtnlabel{\eq@sqslrtnlabel}

\renewcommand\eqsqrtmsg{"Oikein!"} %muokattu
\renewcommand\eqsqwgmsg{"V\string\344\string\344rin!"} %m
%\renewcommand\eqsqwgmsg{"V\"a\"arin!"} %m

\renewcommand\eq@bqlabel{Aloita testi}
\renewcommand\bqlabel{\eq@bqlabel}
\renewcommand\eq@bqlabelISO{\eq@bqlabel}
\renewcommand\bqlabelISO{\eq@bqlabelISO}

\renewcommand\eq@eqlabel{Lopeta testi}
\renewcommand\eqlabel{\eq@eqlabel}

\renewcommand\eq@Score{Pisteet:}\renewcommand\eq@OutOf{/}
\renewcommand\eqInitQuizMsg{%m
   "Testi on aloitettava painamalla  "+msg+"."}
\renewcommand\eqMadeChoice{%m
   "Olet jo kerran valinnut.
    Valintasi oli ("+Responses[probno]+")."
+" Haluatko vaihtaa?"}
\AtEndOfPackage{%
\renewcommand\eq@local@CA{Oikein}
\renewcommand\eq@local@RC{Omat vastaukset!}
\renewcommand\eq@local@AC{Ole hyv\string\344!}}
%</eqfin>
%    \end{macrocode}
%    \subsection{catalan}
%    \begin{macrocode}
%<*eqcat>
%%%%%%%%%%%%%%%%%%% eqcat.def %%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Foreign language support for the exerquiz package.  %%
%% Name of translator: Ramon Ballester                 %%
%% e-mail address: ramon.ballester@udg.es              %%
%% Language:  (catalan)                                %%
%%                                                     %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% The exercise label
\renewcommand\exlabel{Exercici}
% The value of this macro is written to \jobname.sol,
\renewcommand\exlabelsol{\exlabel}

% Title of exercise solution section
\renewcommand\exsectitle{Solucions als \exlabel s}
\renewcommand\exsecrunhead{\exsectitle} %% change to @ form

% Solution label for solutionafter option for exercise
\renewcommand\exsolafter{\textit{Soluci\'o}:}

% Title of short quiz solution section
\renewcommand\eq@sqslsectitle{Solucions als Tests}
\renewcommand\sqslsectitle{\eq@sqslsectitle}

% Running header/section title for solutions to short quizzes
\renewcommand\eq@sqslsecrunhead{Solucions als Tests}
% User access
\renewcommand\sqslsecrunhead{\eq@sqslsecrunhead}

% Label for solutions to short quizzes, appears in solutions sections
\renewcommand\eq@sqsllabel{%
   \string\textbf{Soluci\noexpand\'{o} al Test:}}
% User access
\renewcommand\sqsllabel{\eq@sqsllabel}

% Solution label for solutionafter option for shortquiz
\renewcommand\sqsolafter{\textit{Soluci\'o}:}

% Here is the default short quiz label.
\renewcommand\eq@sqlabel{\textcolor{red}{Test.}}
% User access to shortquiz label
\renewcommand\sqlabel{\eq@sqlabel}

% Here is the default short quiz return label
\renewcommand\eq@sqslrtnlabel{Final del Test}
% User access to shortquiz label
\renewcommand\sqslrtnlabel{\eq@sqslrtnlabel}

% Short quiz feedback messages
\renewcommand\eqsqrtmsg{"Correcte!"}
\renewcommand\eqsqwgmsg{"Incorrecte!"}

% Here is the default quiz label.
\renewcommand\eq@bqlabel{Inici del Test}
% User access to shortquiz label
\renewcommand\bqlabel{\eq@bqlabel}
% Used for writing JavaScript Messages on screen. Use PDFDocEncoding
\renewcommand\eq@bqlabelISO{\eq@bqlabel}
\renewcommand\bqlabelISO{\eq@bqlabel}

% Here is the default quiz label.
% No formatting allowed
\renewcommand\eq@eqlabel{Final del Test}
% User access to shortquiz label
\renewcommand\eqlabel{\eq@eqlabel}
%
% JavaScript Messages for Quiz Environments. Use PDFDocEncoding
%
\renewcommand\eq@Score{Punts:}\renewcommand\eq@OutOf{de}
\renewcommand\eqInitQuizMsg{"Has d'iniciar el Test! Prem sobre "+msg+"."}
\renewcommand\eqMadeChoice{%
    "Ja has elegit una resposta.
     La teva resposta ha estat ("+Responses[probno]+").
     Vols canviar--la?"}
%
% Default button labels for \eqButton
\renewcommand\eq@local@CA{Correctes}
\renewcommand\eq@local@RC{Les meves Respostes!}
\renewcommand\eq@local@AC{Si us plau!}
%</eqcat>
%    \end{macrocode}
%--------------------------------------------------------
%    \subsection{Czech}
%    \begin{macrocode}
%<*eqcz>
%%%%%%%%%%%%%%%%%%% eqcat.def %%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Foreign language support for the exerquiz package.  %%
%% Name of translator: Robert Marik                    %%
%% e-mail address: marik@mendelu.cz                    %%
%% Language:  (czech)                                  %%
%%                                                     %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\AtBeginDocument{\everyScoreField{\rectW{1.75in}}}

% The exercise label
\renewcommand\exlabel{Cvi\v{c}en\'{\i}}
% The value of this macro is written to \jobname.sol,
\renewcommand\exlabelsol{Cvi\noexpand\v{c}en\noexpand\'{\noexpand\i}}

% Title of exercise solution section
\renewcommand\exsectitle{\texorpdfstring{\v{R}e\v{s}en\'{\i} ke cvi\v{c}en\'{\i}m}
    {Resen\355{} ke cvicen\355m}} %% change to @ form
\renewcommand\exsecrunhead{\string\v{R}e\string\v{s}en\string\'{\string\i} ke cvi\string\v{c}en\string\'{\string\i}m}

% Solution label for solutionafter option for exercise
\renewcommand\exsolafter{\textit{\v{R}e\v{s}en\'\i}:}

% Title of short quiz solution section
\renewcommand\eq@sqslsectitle{\texorpdfstring{\v{R}e\v{s}en\'{\i} kv\'{\i}z\r{u}}{Resen\355{} kv\355zu}}
\renewcommand\sqslsectitle{\eq@sqslsectitle}

% Running header/section title for solutions to short quizzes
\renewcommand\eq@sqslsecrunhead{\v{R}e\v{s}en\'{\i} kv\'{\i}z\r{u}}
% User access
\renewcommand\sqslsecrunhead{\eq@sqslsecrunhead}

% Label for solutions to short quizzes, appears in solutions sections
\renewcommand\eq@sqsllabel{\string\textbf{\string\v{R}e\string\v{s}en\string\'{\string\i} kv\string\'{\string\i}zu:}}
% User access
\renewcommand\sqsllabel{\eq@sqsllabel}

% Solution label for solutionafter option for shortquiz
\renewcommand\sqsolafter{\textit{\v{R}e\v{s}en\'{\i}}:}

% Here is the default short quiz label.
\renewcommand\eq@sqlabel{\textcolor{red}{Kv\'{\i}z.}}
% User access to shortquiz label
\renewcommand\sqlabel{\eq@sqlabel}

% Here is the default short quiz return label
%\renewcommand\eq@sqslrtnlabel{Konec kv\string\'{\string\i}zu}
\renewcommand\eq@sqslrtnlabel{Zp\string\v{e}t na ot\string\'{a}zky}
% User access to shortquiz label
\renewcommand\sqslrtnlabel{\eq@sqslrtnlabel}

% Short quiz feedback messages
\renewcommand\eqsqrtmsg{"Spravne !"}
\renewcommand\eqsqwgmsg{"Spatne !"}

% Here is the default quiz label.
\renewcommand\eq@bqlabel{Zacatek kvizu}
% User access to shortquiz label
\renewcommand\bqlabel{\eq@bqlabel}
% Used for writing JavaScript Messages on screen. Use PDFDocEncoding
\renewcommand\eq@bqlabelISO{Zacatek kvizu}
\renewcommand\bqlabelISO{Zacatek kvizu}

% Here is the default quiz label.
% No formatting allowed
\renewcommand\eq@eqlabel{Konec kvizu}
% User access to shortquiz label
\renewcommand\eqlabel{\eq@eqlabel}
%
% JavaScript Messages for Quiz Environments. Use PDFDocEncoding
%
%\renewcommand\eq@Score{Hodnoceni:}
\renewcommand\eq@Score{}
\renewcommand\eq@OutOf{z celkovych}
\renewcommand\eqInitQuizMsg{%
  "Chcete-li pracovat s kvizem, musite jej nejprve spustit! Kliknete na "+msg+"."}
\renewcommand\eqMadeChoice{%
  "Uz jste si jednou odpoved vybral(a). Vase odpoved byla ("+Responses[probno]+").
   Chcete ji opravdu zmenit?"}
%
% Default button labels for \eqButton
\renewcommand\eq@local@CA{Opravit}
\renewcommand\eq@local@RC{odpovedi!}
\renewcommand\eq@local@AC{Prosim!}
% Messages for math fill-in questions
\renewcommand\eqerrABS{"Spatne uzavrena absolutni hodnota. Opravte prosim."}
\renewcommand\eqerrBadMathFunc{"Vyraz `"+aF[i]+"' neni ani definovanou funkci ani  " +", ani platnym matematickym vyrazem."}
\renewcommand\eqParens{"Zavorky (kulate)"}
\renewcommand\eqBrackets{"Hranate zavorky"}
\renewcommand\eqBraces{"Slozene zavorky"}
\renewcommand\eqerrDelimNotBal{aGroup[i][2] + " nejsou parove. Opravte je prosim."}
\renewcommand\eqerrBadExp{"Spatny matematicky vyraz - problem v nekterem exponentu. Opravte jej prosim."}
\renewcommand\eqerrUnfinishQuiz{"Chyba: Nektery kviz mate nedokonceny. Musite jej dokoncit, nez budete pokracovat u dalsiho kvizu. Pokud si nepamatuje, ktery kviz jste nechali rozpracovany, zavrete cely soubor, znovu jej otevrete a k testu, ktery chcete vyplnovat, se vratte."}
\renewcommand\noPeekMsg{"Prohlizeni reseni neni povoleno pred dokoncenim kvizu!"}
\renewcommand\highThresholdMsg{"Musite odpovedet na vsechny otazky, nez ukoncite kviz."}
\renewcommand\eqSyntaxErrorUndefVar{"Chyba: Pravdepodobne pouzivate nespravnou promennou nebo mate preklep ve jmenu nektere funkce."}
\renewcommand{\promptButtonMsg}{%
        "Chcete ted videt spravnou odpoved? "\r\t\t
        + "Hodnocena bude Vase soucasna odpoved. "\r\t\t
        + "Kliknete-li na \\"Yes\\", uvidite spravnou odpoved, ale svou stavajici
           odpoved na tuto otazku uz nebudete moct zmenit."
}
%</eqcz>
%    \end{macrocode}
%    \subsection{brazil}
%    \begin{macrocode}
%<*eqbr>
%%%%%%%%%%%%%%%%%%% eqbr.def %%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Foreign language support for the exerquiz package. %%
%% Name of translator: Koichi Sameshima               %%
%% e-mail address: ksameshi@usp.br                    %%
%% Language:  (brazil)                                %%
%%                                                    %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% The exercise label
\renewcommand\exlabel{Exerc\texorpdfstring{\'{\i}}{\string\355}cio}
% The value of this macro is written to \jobname.sol,
\renewcommand\exlabelsol{Exerc\string\'{\string\i}cio}

% Title of exercise solution section
\renewcommand\exsectitle{Solu\texorpdfstring{\c{c}}{\string\347}\texorpdfstring{\~{o}}{%
    \string\365}es dos  Exerc\texorpdfstring{\'{\i}}{\string\355}cios}
    %{Solu\string\\347\string\\363es dos Exerc\string\\355cios}}
\renewcommand\exsecrunhead{%
    Solu\noexpand\c{c}\noexpand\~{o}es dos Exerc\noexpand\'{i}cios} %% change to @ form

% Solution label for solutionafter option for exercise
\renewcommand\exsolafter{\textit{Solu\c{c}\~{a}o}:}

% Title of short quiz solution section
\renewcommand\eq@sqslsectitle{Solu\c{c}\~{o}es dos Testes}
\renewcommand\sqslsectitle{\eq@sqslsectitle}

% Running header/section title for solutions to short quizzes
\renewcommand\eq@sqslsecrunhead{Solu\noexpand\c{c}\noexpand\~{o}es dos Testes}
% User access
\renewcommand\sqslsecrunhead{\eq@sqslsecrunhead}

% Label for solutions to short quizzes, appears in solutions sections
\renewcommand\eq@sqsllabel{%
  \string\textbf{Solu\noexpand\c{c}\noexpand\~{a}o do Teste:}}
% User access
\renewcommand\sqsllabel{\eq@sqsllabel}

% Solution label for solutionafter option for shortquiz
\renewcommand\sqsolafter{\textit{Solu\noexpand\c{c}\noexpand\~{a}o}:}

% Here is the default short quiz label.
\renewcommand\eq@sqlabel{\textcolor{red}{Teste.}}
% User access to shortquiz label
\renewcommand\sqlabel{\eq@sqlabel}

% Here is the default short quiz return label
\renewcommand\eq@sqslrtnlabel{Finaliza Teste}
% User access to shortquiz label
\renewcommand\sqslrtnlabel{\eq@sqslrtnlabel}

% Short quiz feedback messages
\renewcommand\eqsqrtmsg{"Correto!"}
\renewcommand\eqsqwgmsg{"Incorreto!"}

% Here is the default quiz label.
\renewcommand\eq@bqlabel{Inicia Teste}
% User access to shortquiz label
\renewcommand\bqlabel{\eq@bqlabel}
% Used for writing JavaScript Messages on screen. Use PDFDocEncoding
\renewcommand\eq@bqlabelISO{\eq@bqlabel}
\renewcommand\bqlabelISO{\eq@bqlabel}

% Here is the default quiz label.
% No formatting allowed
\renewcommand\eq@eqlabel{Finaliza Teste}
% User access to shortquiz label
\renewcommand\eqlabel{\eq@eqlabel}
%
% JavaScript Messages for Quiz Environments. Use PDFDocEncoding
%
\renewcommand\eq@Score{Pontos:}\renewcommand\eq@OutOf{de}
\renewcommand\eqInitQuizMsg{% ******
   "Voc\string\352 precisa iniciar o Teste! Clique sobre "+msg+"."}
\renewcommand\eqMadeChoice{%
   "Voc\string\352 j\string\341 respondeu.
    Sua resposta foi ("+Responses[probno]+").
    Quer alter\string\341-la?"}
%
% Default button labels for \eqButton
\renewcommand\eq@local@CA{Corretas}
\renewcommand\eq@local@RC{Minhas Respostas!}
\renewcommand\eq@local@AC{Por Favor!}
%</eqbr>
%    \end{macrocode}
%  \Finale
\endinput
