summaryrefslogtreecommitdiff
path: root/texmf-dist/source/latex/ecards/ecards.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'texmf-dist/source/latex/ecards/ecards.dtx')
-rw-r--r--texmf-dist/source/latex/ecards/ecards.dtx1331
1 files changed, 1331 insertions, 0 deletions
diff --git a/texmf-dist/source/latex/ecards/ecards.dtx b/texmf-dist/source/latex/ecards/ecards.dtx
new file mode 100644
index 00000000..7eda9651
--- /dev/null
+++ b/texmf-dist/source/latex/ecards/ecards.dtx
@@ -0,0 +1,1331 @@
+%\iffalse
+%<*copyright>
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% ecards.sty package, %%
+%% Copyright (C) 1999-2016 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}[1997/12/01]
+%<package>\ProvidesPackage{ecards}
+%<package> [2016/09/03 v2.0e eCards: An electronic flash cards package (dps)]
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage[colorlinks,hyperindex=false]{hyperref}
+%\pdfstringdefDisableCommands{\let\\\textbackslash}
+\OnlyDescription % comment out for implementation details
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+\InputIfFileExists{aebdocfmt.def}{\PackageInfo{ecards}{Inputting aebdocfmt.def}}
+ {\def\IndexOpt{\DescribeMacro}\def\IndexKey{\DescribeMacro}\let\setupFullwidth\relax
+ \PackageInfo{ecards}{aebdocfmt.def cannot be found}}
+\let\pkg\textsf
+\let\env\texttt
+\begin{document}
+ \GetFileInfo{ecards.sty}
+ \title{eCards: Electronic Flash Cards}
+ \author{D. P. Story\\
+ Email: \texttt{dpstory@uakron.edu}}
+ \date{processed \today}
+ \maketitle
+ \tableofcontents
+ \let\Email\texttt
+ \DocInput{ecards.dtx}
+\IfFileExists{\jobname.ind}{\newpage\setupFullwidth\par\PrintIndex}{\paragraph*{Index} The index goes here.\\Execute
+ \texttt{makeindex -s gind.ist -o ecards.ind ecards.idx} on the command line and recompile
+ \texttt{ecards.dtx}.}
+\IfFileExists{\jobname.gls}{\PrintChanges}{\paragraph*{Change History} The list of changes goes here.\\Execute
+ \texttt{makeindex -s gglo.ist -o ecards.gls ecards.glo} on the command line and recompile
+ \texttt{ecards.dtx}.}
+\end{document}
+%</driver>
+% \fi
+% \MakeShortVerb{|}
+% \InputIfFileExists{aebdonotindex.def}{\PackageInfo{web}{Inputting aebdonotindex.def}}
+% {\PackageInfo{web}{cannot find aebdonotindex.def}}
+% \DoNotIndex{\kern}
+%
+% \begin{macrocode}
+%<*package>
+% \end{macrocode}
+%
+% \changes{v2.0e}{2016/09/03}{Improved documentation in \string\texttt{ecardsman.pdf}}
+%
+% \section{Introduction}
+%
+% The initial version of this package was developed at the request of
+% my colleague, Dr.\ Thomas Price, for use in the senior honors
+% project of Ms.\ Katie Jones on
+% \href{http://www.math.uakron.edu/~teprice/Trig/}{Trig Flash Cards}.
+% Upon completion of the honors project, I generalized and extended
+% the original package developed specifically for them.
+%
+% \section{Documentation}
+%
+% In this section, the major elements of this package are highlighted. For those
+% who want to know more, you can peruse the {\LaTeX} code, there are comments
+% contained there as well.
+%
+% \subsection{Preamble: Required Packages and Options}
+%
+% \subsubsection{Required Packages}
+%
+% This package depends heavily on the
+% \textbf{\href{http://www.math.uakron.edu/~dpstory/webeq.html}
+% {Acro\negthinspace\TeX{} eDucation Bundle}}: (1) the \textsf{web}
+% package provides page setup, backgrounds, and navigation
+% elements; (2) the \textsf{exerquiz} package allows you to author
+% the questions, both non-responsive and responsive (fill-in and
+% multiple choice); and (3) the \textsf{insdljs} packages is the
+% mechanism for introducing document-level JavaScripts into the
+% final document.
+%
+% Each of the packages listed above have their own required packages:
+% \textsf{hyperref}, \textsf{color}, \textsf{verbatim}, \textsf{everyshi}
+% and \textsf{eso-pic}. Theses are all available as part of the standard
+% distribution of {\LaTeX} or through any CTAN site.
+%
+% \subsubsection{Options}
+%
+% \paragraph{eCards options.}\hskip-\lastskip\
+% The \textsf{eCards} package really has only 4 options:
+% \begin{enumerate}
+% \item \texttt{nohints}: If you do not want to provide hints in your eCards,
+% use this option. See also the comments in \Nameref{hint}.
+% \item \texttt{listing}:\label{listing} This option gives you a printable version of your
+% eCards. In this way, you can proofread, check your questions, hints,
+% and answers. Suggested packages and options are given below:
+%\begin{verbatim}
+%\usepackage[<driver_option>,forpaper,tight,nodirectory]{web}
+%\usepackage[solutionsafter,proofing,preview]{exerquiz}
+%\usepackage[listing]{eCards}
+%\end{verbatim}
+% \item \texttt{memLogo}: The logo, if any, is read and re-read
+% for each page on which it appears. Using this option, the logo
+% is read once and saved in a box for use.
+% \item \texttt{custom}: If this option is chosen, the package
+% will look for and input a file \texttt{ecard.cus}. This file can
+% be used to customize the environments. This file should be kept
+% in the source directory, not in the {\LaTeX} search path.
+% \end{enumerate}
+%
+% \paragraph{Other options.}\hskip-\lastskip\
+% Selecting the various options of the \textsf{web} and
+% \textsf{exerquiz} packages can give you different looks. It is
+% important to be aware of all the options associated with these
+% two package; in the paragraphs below, various options are
+% discussed that may be useful in \textsf{eCards}.
+%
+%\paragraph{Useful Web Package Options.}\hskip-\lastskip\
+% There are three background/panel options: \texttt{usetemplates},
+% \texttt{rightpanel} and \texttt{leftpanel}. Using the
+% \texttt{usetemplates} option does not give you the vertical
+% navigation strip, but it does give you the background colors;
+% the \texttt{rightpanel} and \texttt{leftpanel} given you a
+% vertical panel on the right and left, respectively. Use one of
+% these three options only, if any at all. Using none of these three
+% will just get you the default white background.
+%
+%There are certain ``standard'' page designs, or you can create your own using
+%the \cs{margins} and \cs{screensize}; the demo document has
+%\begin{verbatim}
+%\margins{.25in}{.25in}{24pt}{.25in} % left,right,top, bottom
+%\screensize{3.72in}{366.24bp} % height, width
+%\end{verbatim}
+% See the \textsf{Web} package documentation for details on these and other
+% options.
+%
+% \paragraph{Useful Exerquiz Package Options.}\hskip-\lastskip\
+% If you are not using multiple choice or fill-in questions, you should use
+% the \texttt{exercisesonly} option. This removes much of the document level JavaScript
+% from the PDF document.
+%
+% For authors that use the full Acrobat~5.0, or the newer Acrobat
+% 6.0 Standard or Acrobat 6.0 Professional, you can use the
+% \texttt{execJS} option. If this option is taken, then when the
+% document is first loaded into Acrobat (following distillation, or
+% creation using \textsf{dvipdfm} or \textsf{pdftex}), the document
+% will be automatically saved; this saves any imported document
+% level JavaScript in the document. The document always needs to be saved
+% after creation so save the scripts with the document, this does it automatically
+% so you can't forget to do it---as one of my colleagues once did.
+%
+% The \texttt{nosolutions} option removes the \texttt{response} environment
+% leaving only the questions. The \texttt{proofing} and \texttt{preview} options
+% can be useful for proofreading, as described in the \texttt{\hyperref[listing]{listing}}
+% option described above.
+%
+% \subsection{\texorpdfstring{\protect\cs{begin\{document\}}}{\textbackslash begin\{document\}}: Start creating Cards}
+%
+% The process of creating these electronic cards is quite simple, the sections below
+% describe the various environments used.
+%
+% \subsubsection{The \texttt{card} Environment}
+%
+% The main environment is the \texttt{card} environment, which is used for posing
+% questions, offering a hint, and an answer. The \hypertarget{cardsyntax}{syntax} is
+%\begin{verbatim}
+%\begin{card}
+% < a question >
+% \begin{response}
+% \begin{hint}
+% < a hint >
+% \end{hint}
+% \begin{answer}
+% < an answer >
+% \end{answer}
+% \end{response}
+%\end{card}
+%\end{verbatim}
+% \textcolor{red}{Important.} You can pose a question which requires
+% a verbal response, or one for which there is a choice of
+% alternatives, or a fill-in the blank (math or text). See the demo
+% file \texttt{ecardstst.tex} for examples.
+%
+% \subsubsection{The \texttt{response} Environment}
+%
+% Immediately following and nested within the \texttt{card} environment is the \texttt{response}
+% environment. This sets things up for the responses to the question: the hint
+% and the answer.
+%
+% \subsubsection{The \texttt{hint} Environment}\label{hint}
+%
+% The first environment to appear within the \texttt{response} is
+% the \texttt{hint} environment. Here you can provide additional
+% information to help the student answer the question successfully.
+% I've you've posed a multiple choice or fill-in question, you can simply
+% copy the multiple choice or fill-in into the hint, just as I have done
+% in the demo file \texttt{ecardstst.tex}.
+%
+% In this release, hints can be provided for \textbf{all} of the questions or for
+% \textbf{none} of the questions. You can enter hints using the
+% \texttt{hint} environment, illustrated \hyperlink{cardsyntax}{above}, or not include a
+% \texttt{hint} environment. When you do not want to include
+% hints---whether you've entered the environments or not---use the
+% \texttt{nohints} package option. This will convert the
+% \texttt{hint} environment into a \texttt{comments}, and redefined
+% some of the navigation buttons.
+%
+% \subsubsection{\texttt{answer} Environment}
+%
+% After the hint environment comes the answer environment where the answer to the original question
+% can be presented. At the end of this environment, you need to back out of your nest:
+% \verb+\end{answer}+, \verb+\end{response}+ and \verb+\end{card}+.
+%
+% \subsection{\texorpdfstring{\protect\cs{end\{document\}}}{\textbackslash end\{document\}}}
+%
+% \section{Main Code}
+%
+% \subsection{Declare Options}
+%
+% This package builds upon the \textbf{Acro\negthinspace\TeX{} eDucation Bundle}, the options of the
+% \textsf{web} and \textsf{exerquiz} packages can be used with with \textsf{eCards}. Additional options
+% are declared below.
+% The logo, if any, is read and re-read for each page on which it appears. Using the \texttt{memLogo}\IndexOpt{memLogo}
+% option, the logo is read once and saved in a box for use.
+% \begin{macrocode}
+\let\ec@YES=y \let\ec@NO=n
+\DeclareOption{memLogo}{\let\@memLogo\ec@YES}
+\let\@memLogo\ec@NO
+% \end{macrocode}
+% The \texttt{listing}\IndexOpt{listing} gives a listing of questions, hints, and answers. When used in conjunction
+% with various \textsf{exerquiz} options, this option can be used to review all cards and answers.
+% Suggested options:
+%\begin{verbatim}
+%\usepackage[<driver_option>,forpaper,tight]{web}
+%\usepackage[solutionsafter,proofing]{exerquiz}
+%\usepackage[memLogo,listing]{ecards}
+%\end{verbatim}
+% The boolean switch \cs{ecListing} can be used to get a better looking listing by removing
+% graphics---see the demo file \texttt{ecardstst.tex}.
+% \begin{macrocode}
+\DeclareOption{listing}{\ecListingtrue}
+\newif\ifecListing \ecListingfalse
+% \end{macrocode}
+% If \texttt{custom}\IndexOpt{custom} option is chosen, the package will look for and input a file \texttt{ecard.cus}.
+% This file can be used to customize the environments. This file should be kept in the
+% source directory, not in the {\LaTeX} search path.
+% \begin{macrocode}
+\DeclareOption{custom}{\let\@ecCustom\ec@YES}
+\let\@ecCustom\ec@NO
+% \end{macrocode}
+% In some applications, the author may not want to have hints provided, so, compile
+% the document with the \texttt{nohints}\IndexOpt{nohints} option.
+% \begin{macrocode}
+\DeclareOption{nohints}{\def\opts@ecNoHints{nohint}%
+\def\defaultecNoHints{\useNoHints}\defaultecNoHints}
+\newif\ifisQues \isQuesfalse
+% \end{macrocode}
+% \DescribeMacro{\useNoHints} is a user accessible command for changing the default setting of whether
+% to provide a hint or not. It must be expanded outside the \env{card} environment. The \cs{useNoHints}
+% command starts a new page unless the \texttt{listing} option has been taken. The \cs{newpage} enables
+% the navigation panel to get state of the hint correctly.
+% \begin{macrocode}
+\def\useNoHints{\ifecListing\else\newpage\fi\ecUseNoHints}
+% \end{macrocode}
+% \changes{v2.0a}{2016/07/23}{For the Hint page, changed the address to conform to what works
+% in the new exerquiz, \cs{hintDest} (\string\texttt{ex\cs{exnoCard}} rather than \string\texttt{ex.\cs{exnoCard}}),
+% same for \cs{solnDest}}
+% Changed the destinations for \cs{hintDest} and \cs{solnDest}.
+%
+% The \cs{ecUseNoHints} is an ``internal'' command used within the \env{card}
+% environment and in the solutions file; it is also the continuation of \cs{useNoHints}.
+% \changes{v2.0d}{2016/08/02}{Added \string\cs{ecUseNoHints} and \string\cs{ecUseHints}}
+% \begin{macrocode}
+\def\ecUseNoHints{\ifisQues
+ \expandafter\def\else\expandafter\gdef\fi\opts@ecNoHints{nohint}%
+ \global\let\@ecNoHints\ec@YES
+ \gdef\hintDest{ex\exnoCard}\gdef\solnDest{ex\exnoCard.s}%
+ \gdef\hintDestJS{ex.\exnoCard}\gdef\quesDestJS{ex.\exnoCard}%
+}
+% \end{macrocode}
+% \DescribeMacro{\useHints} is a user accessible command for changing the default setting of whether
+% to provide a hint or not. It must be expanded outside the \env{card} environment. The \cs{useHints}
+% command starts a new page unless the \texttt{listing} option has been taken. The \cs{newpage} enables
+% the navigation panel to get state of the hint correctly.
+% \begin{macrocode}
+\def\useHints{\ifecListing\else\newpage\fi\ecUseHints}
+% \end{macrocode}
+% The \cs{ecUseHints} is an ``internal'' command used within the \env{card}
+% environment and in the solutions file; it is also the continuation of \cs{useHints}.
+% \begin{macrocode}
+\def\ecUseHints{\ifisQues
+ \expandafter\def\else\expandafter\gdef\fi\opts@ecNoHints{hint}%
+ \global\let\@ecNoHints\ec@NO
+ \gdef\hintDest{ex\exnoCard}\gdef\solnDest{ex\exnoCard.s}%
+ \gdef\hintDestJS{ex.\exnoCard}\gdef\quesDestJS{qex.\exnoCard}%
+}
+\def\opts@ecNoHints{hint}
+\def\defaultecNoHints{\useHints}
+\defaultecNoHints
+% \end{macrocode}
+% To present the cards are presented to the user in their natural order, rather
+% than in a randomized order, use the \texttt{notrandomized}\IndexOpt{notrandomized} option.
+% \begin{macrocode}
+\DeclareOption{notrandomized}{\def\israndomized{false}
+ \def\cbInitState{Off}}
+\def\israndomized{true}
+\def\cbInitState{randomOrder}
+% \end{macrocode}
+% \subsection{ProcessOptions and Required Packages}
+% \begin{macrocode}
+\ProcessOptions
+\RequirePackage{web}
+\RequirePackage{exerquiz}[2016/04/18]
+% \end{macrocode}
+% \subsection{String Data}
+% \begin{macro}{\cardsFinishedMsg}
+% When user finishes the cards, a message appears announcing that event. The
+% \cs{cardsFinishedMsg} holds the content of that message.
+% \begin{macrocode}
+\newcommand{\cardsFinishedMsg}[1]{\def\CARDSFINISHED{#1}}
+\cardsFinishedMsg{You've seen all the cards!}
+% \end{macrocode}
+% \end{macro}
+% \subsection{Colors for Backgrounds}
+% Some definitions for coloring the background page for the question page, the
+% hint page and the answer page.
+% \begin{macrocode}
+\textBgColor{cornsilk}
+\def\cardColor#1{\def\@cardColor{#1}}
+\def\hintColor#1{\def\@hintColor{#1}}
+\def\solnColor#1{\def\@solnColor{#1}}
+% \end{macrocode}
+% Default colors
+% \begin{macrocode}
+\cardColor{vlightblue}
+\hintColor{cornsilk}
+\solnColor{webyellow}
+% \end{macrocode}
+% \subsection{Modifying Exerquiz Environments}
+% \begin{macrocode}
+% \let\web@copyright\@gobble
+\let\exnoCard\the@exno
+\let\web@rightheader\@empty
+\def\io#1{\immediate\write\@auxout{#1}}
+% \end{macrocode}
+% \subsubsection{Modify the \texttt{exercise} Environment}
+% The \cs{endsolnexerhookaux} macro gets executed just prior to the end of the
+% solution environment, but before the final trailer is written to the .sol file. Here,
+% we use it to insert a navigation bar at the bottom of the solution page.
+% \begin{macrocode}
+\def\endsolnexerhookaux{%
+ \ifnum\@panelconfig=0\relax
+ \immediate\write\verbatim@out
+ {\string\insNaviBar*{\hfil\string\NextCard\string\ %
+ \string\PrevCard\string\ \string\ToggleOrder\hfil}}%
+ \fi
+}
+\def\include@solutions{%
+ \let\webnewpage\relax
+ \immediate\closeout\ex@solns
+ \ifeq@nosolutions\else
+ \iftherearesolutions\newpage\markright{\exsecrunhead}%
+ \ifx\webnewpage\relax
+ \def\webnewpage{\let\webnewpage\newpage}%
+ \fi
+ \eqsolutionshook
+ \addcontentsline{toc}{section}
+ {\protect\numberline{}\exsectitle}%
+ \input{\jobname.sol}%
+ \fi
+ \fi
+}
+% \end{macrocode}
+% Write the total number of questions (cards) to the aux file.
+% \begin{macrocode}
+\AtEndDocument{\io{\string\gdef\string\totalCards{\exnoCard}}\clearpage}
+% \end{macrocode}
+% This macro holds the number of cards composed.
+% \begin{macrocode}
+\def\theNumCards{\csname totalCards\endcsname}
+% \end{macrocode}
+% \cs{nMarker} identifies the type of page, 0 for a question, 1 for a hint, 2 for a solution
+% \begin{macrocode}
+\let\ec@Zero=0 \let\ec@One=1 \let\ec@Two=2
+\def\ec@Ques{0}\def\ec@Hint{1}\def\ec@Soln{2}
+\def\nMarkerSet#1{\gdef\nMarker{#1}}
+\nMarkerSet\ec@Ques
+% \end{macrocode}
+% Redefine \cs{ReturnTo} so there is no link, we encourage the user to use the navigation
+% buttons.
+% \begin{macrocode}
+\def\ReturnTo#1#2{\eq@fititin#2}
+% \end{macrocode}
+% Miscellaneous macro definitions associated with the \textsf{exercise} environment.
+% \begin{macrocode}
+\renewcommand\exsecrunhead{}
+\renewcommand\exlabel{}
+\renewcommand\exsectitle{}
+% \end{macrocode}
+%\changes{v2.0a}{2016/07/23}{Added modified formatting for the \string\texttt{proofing} option
+% of \string\textsf{exerquiz}}
+% Modified formatting for the \texttt{proofing} option of \textsf{exerquiz}. Added two new commands
+% \DescribeMacro{\leadAnsFmtForPaper}\cs{leadAnsFmtForPaper}
+% and \DescribeMacro\trailAnsFmtForPaper\cs{trailAnsFmtForPaper}.
+% \changes{v2.0c}{2016/07/29}{Added forpaper formatting}
+% \begin{macrocode}
+\newcommand{\leadAnsFmtForPaper}{\textbf{Ans:\thinspace[}}
+\newcommand{\trailAnsFmtForPaper}{\textbf{]}}
+\def\math@correctAnswer{\unskip\ifeqforpaper\leadAnsFmtForPaper\fi
+ {\ttfamily\color{\@proofingsymbolColor}\spaceskip=2pt\xspaceskip=2pt
+ \expandafter\gobbleMacro\meaning\eqCorrectAns}%
+ \ifeqforpaper\trailAnsFmtForPaper\fi
+}
+\def\txt@correctAnswer{\unskip\ifeqforpaper\textbf{Ans:\thinspace[}\fi
+ {\ttfamily\color{\@proofingsymbolColor}%
+ \spaceskip=2pt\xspaceskip=2pt
+ \expandafter\gobbleTxt\meaning\rbTxtAlt}\ifeqforpaper\textbf{]}\fi
+}
+% \end{macrocode}
+%
+% \subsubsection{The \texttt{multiChoice} Environment}
+%
+% The \texttt{multiChoice} environment is an \texttt{answer} environment (of \textsf{exerquiz} placed within
+% an \texttt{oQuestion} environment (\textsf{exerquiz}).
+%
+% \begin{environment}{multiChoice}
+% An environment for posing a multiple choice question, based on the \texttt{shortquiz} environment
+% of \textsf{exerquiz}.
+% \begin{macrocode}
+\newenvironment{multiChoice}[1]{\par
+ \if\nMarker\ec@Ques
+ \def\sqWrongRespJS{app.alert(\eqsqwgmsg,3);
+ this.gotoNamedDest("\hintDestJS");}%
+ \fi
+% \end{macrocode}
+% \changes{v2.0}{2016/07/20}{\string\cs{sq@IDTxtField} in the new \string\textsf{exerquiz} is enclosed in an \string\cs{makebox},
+% text normally follows it, but here is does not, so we'll have to compensate.}
+% \changes{v2.0}{2016/07/20}{Remove \string\texttt{shortquiz} environment, replace with \string\texttt{oQuestion}}
+% \cs{sq@IDTxtField} in the new \textsf{exerquiz} is enclosed in an \cs{makebox},
+% text normally follows it, but here is does not, so we'll have to compensate.
+% \begin{macrocode}
+ \vskip-\baselineskip % dps
+ \begin{oQuestion}{\if\nMarker\ec@Ques\hintDest
+ \ifisHint.h\fi\else\solnDest\fi}%
+ \begin{answers}[\solnDest]{#1}%
+}{%
+ \end{answers}
+ \end{oQuestion}
+}
+% \end{macrocode}
+% \end{environment}
+%
+% \subsubsection{The \texttt{fillIn} Environment}
+%
+% The \texttt{fillIn} environment is modified \texttt{oQuestion} environment (\textsf{exerquiz}),
+% within which the commands \cs{RespBoxMath} and \cs{RespBoxTxt} (\textsf{exerquiz}) are defined.
+%
+% Set the appearance of any text fields that the author might use.
+% \begin{macrocode}
+\ifecListing
+ \ifeq@proofing
+ \everyRespBoxTxt{\Ff\FfReadOnly\BG{}\BC{}}
+ \everyRespBoxMath{\Ff\FfReadOnly\BG{}\BC{}}\else
+ \everyRespBoxTxt{\BG{1 1 1}}\everyRespBoxMath{\BG{1 1 1}}\fi
+\else
+ \everyRespBoxTxt{\BG{1 1 1}}\everyRespBoxMath{\BG{1 1 1}}
+\fi
+% \end{macrocode}
+% \begin{environment}{fillIn}
+% The \texttt{fillIn} environment one to pose a fill in type question, either
+% text or math. Based on the \texttt{oQuestion} environment of \textsf{exerquiz}.
+% \begin{macrocode}
+\newenvironment{fillIn}{%
+ \def\RespBoxTxtOnBlur{ecOnBlurRespBox(retn, \exnoCard, \nMarker);}%
+ \begin{oQuestion}{\if\nMarker\ec@Ques\hintDest\else\solnDest\fi}%
+}{\end{oQuestion}}
+% \end{macrocode}
+% \end{environment}
+%
+% \subsection{New Environments}
+% \subsubsection{The \texttt{card} Environment}
+% \begin{environment}{card}
+% This is the main environment for writing questions, hints and answers. This environment
+% encloses all. It is based on the \texttt{exercise} environment of \textsf{exerquiz}.
+% \begin{macrocode}
+\def\ec@isHint{hint}
+\def\ec@isNoHint{nohint}
+\def\ec@HintsWarning{\PackageWarning{ecards}
+ {The use of \string\useHints\space and \string\useNoHints
+ \MessageBreak is prohibited, ignoring this use}}
+\def\ec@BadArgWarning{\PackageWarning{ecards}
+ {The argument `\ec@rgi' is not an acceptable option.\MessageBreak
+ Will use `hint' instead}}
+\def\ecInfoToSolns{\string\def\string\exnoCard{\exnoCard}%
+ \string\def\string\solndest{\solnDest}%
+ \expandafter\string\ec@thisHintOpt
+ \string\nMarkerSet{\ec@Hint}\string\defineSoln}
+\newenvironment{card}[1][\opts@ecNoHints]{\newpage\isQuestrue
+% \end{macrocode}
+% We redefine \cs{useHints} and \cs{useNoHints} to a warning message within the \env{card}
+% environment.
+% \begin{macrocode}
+ \let\useHints\ec@HintsWarning\let\useNoHints\ec@HintsWarning
+ \edef\ec@rgi{#1}\ifx\ec@rgi\ec@isHint
+ \def\ec@thisHintOpt{\ecUseHints}\else
+ \ifx\ec@rgi\ec@isNoHint
+ \def\ec@thisHintOpt{\ecUseNoHints}\else
+% \end{macrocode}
+% The user did not pass a recognized option (neither \texttt{hint} nor \texttt{nohint}),
+% use \texttt{hint} instead and send a warning to the log.
+% \begin{macrocode}
+ \def\ec@thisHintOpt{\ecUseHints}%
+ \ec@BadArgWarning
+ \fi
+ \fi
+ \xdef\ecLoc@lSt@te{\ec@rgi}%
+ \ec@thisHintOpt\nMarkerSet\ec@Ques
+ \def\eqexheader{\noindent}%
+ \renewcommand\exsllabelformat{\protect\noindent}%
+ \renewcommand\exrtnlabelformat{}%
+ \renewcommand\exsecrunhead{}%
+ \let\afterlabelhskip\@empty
+ \def\exersolnheadhook{\ecInfoToSolns}%
+ \begin{exercise}
+ \textBgColor{\@cardColor}%
+ \headCard
+}{%
+ \tailCard
+ \end{exercise}%
+ \ifnum\@panelconfig=0\relax\aftergroup\cardNaviBar\fi
+}
+% \end{macrocode}
+% \end{environment}
+% \DescribeMacro\headCard\cs{headCard} determines the design of the question page. Can re-design.
+% \changes{v2.0c}{2016/07/29}{Added after skips and widths for questions page}
+% Use \DescribeMacro\ecAfterQuesSkip\cs{ecAfterQuesSkip} to change the vertical distance after \textbf{QUESTIONS}
+% and the content below. Use \DescribeMacro\ecQuesWidth\cs{ecQuesWidth} to set the width of
+% the minipage on the question page.
+% \begin{macrocode}
+\def\ecAfterQuesSkip#1{{\setlength{\@tempdima}{#1}%
+ \xdef\ec@fterQuesSkip{\the\@tempdima}}}
+\ecAfterQuesSkip{.25in}
+\def\ecQuesWidth#1{\def\ec@QuesWidth{#1}}
+\ecQuesWidth{.85\linewidth}
+\def\ecSetQuesWidth{\setlength{\@tempdima}{\ec@QuesWidth}%
+ \edef\ec@QuesWidth{\the\@tempdima}}
+% \end{macrocode}
+% Use the \DescribeMacro{\ecQUESTION} command to format the question page.
+% \changes{v2.0c}{2016/07/29}{Added \string\cs{ecQUESTION}}
+% \begin{macrocode}
+\newcommand{\ecQUESTION}{\textbf{QUESTION}}
+\newcommand{\headCard}{%
+ \vspace*{\stretch{.1}}%
+ \begin{center}\ecSetQuesWidth
+ \Large\ecQUESTION\par\vspace*{\ec@fterQuesSkip}%
+ \begin{minipage}{\ec@QuesWidth}%
+ \large\noindent\ignorespaces
+}
+% \end{macrocode}
+% \begin{macro}{\tailCard}
+% Complete any environments begun by \cs{headCard}
+% \begin{macrocode}
+\newcommand{\tailCard}{%
+ \end{minipage}
+ \end{center}
+ \par\vspace{\stretch{2}}%
+}
+% \end{macrocode}
+% \end{macro}
+% \subsubsection{The \texttt{response} Environment}
+% \begin{environment}{response}
+% Nested within the \texttt{card} environment is the
+% \texttt{response} environment, which, in turn, contains the
+% \texttt{hint} and \texttt{answer} environments. This basically
+% the \texttt{solution} environment for an \texttt{exercise} of
+% \textsf{exerquiz}.
+% \begin{macrocode}
+\newenvironment{response}{\solnexer@woparts[]} %dps
+ {\endsolnexer@woparts}
+% \end{macrocode}
+% \end{environment}
+% \begin{environment}{hint}
+% Place this environment within the \texttt{response}
+% environment and \textit{before} the \texttt{answer} environment.
+% \begin{macrocode}
+\newif\ifisHint \isHintfalse
+\newenvironment{hint}{%
+ \isHinttrue
+ \if\@ecNoHints\ec@YES\textBgColor{\@hintColor}\headHint
+ \centering\noHintProvided\tailHint\expandafter\ec@comment@hint
+ \else\expandafter\ec@hint\fi}{%
+ \if\@ecNoHints\ec@YES\expandafter\endec@comment@hint
+ \else\expandafter\endec@hint\fi}
+% \end{macrocode}
+% \begin{macro}{\noHintProvided}
+% A short typeset message that appears on hint pages when there is no hint
+% available.
+% \begin{macrocode}
+\newcommand{\noHintProvided}{No hint provided for this question.}
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+\newenvironment{ec@comment@hint}{\comment}{%
+ \endcomment
+ \ifnum\@panelconfig=0\relax
+ \insNaviBar{\hfill\hintSoln\ \hintNextCard\ %
+ \PrevCard\ \ToggleOrder\hfill}\fi
+ \newpage\nMarkerSet{\ec@Soln}\noindent\hypertarget{\solndest}{}%
+}
+\newenvironment{ec@hint}{%
+ \textBgColor{\@hintColor}%
+ \headHint
+}{%
+ \tailHint
+ \ifnum\@panelconfig=0\relax
+ \insNaviBar{\hfill\hintSoln\ \hintNextCard\ %
+ \PrevCard\ \ToggleOrder\hfill}\fi
+ \newpage\nMarkerSet{\ec@Soln}\noindent\hypertarget{\solndest}{}%
+}
+% \end{macrocode}
+% \end{environment}
+% Use \DescribeMacro\headHint\cs{headHint} to design he hint page. \DescribeMacro{\ecAfterHintSkip}\cs{ecAfterHintSkip}
+% sets the vertical skip following the header (HINT). \DescribeMacro\ecHintWidth\cs{ecHintWidth} sets the width
+% of the minipage on the HINT page.
+% \changes{v2.0c}{2016/07/29}{Added after skips and widths for hints page}
+% \begin{macrocode}
+\def\ecAfterHintSkip#1{{\setlength{\@tempdima}{#1}%
+ \xdef\ec@fterHintSkip{\the\@tempdima}}}
+\ecAfterHintSkip{.25in}
+\def\ecHintWidth#1{\def\ec@HintWidth{#1}}
+\ecHintWidth{.85\linewidth}
+\def\ecSetHintWidth{\setlength{\@tempdima}{\ec@HintWidth}%
+ \edef\ec@HintWidth{\the\@tempdima}}
+% \end{macrocode}
+% Use the \DescribeMacro{\ecHINT}\cs{ecHint} command to format the hint page.
+% \changes{v2.0c}{2016/07/29}{Added \string\cs{ecHINT}}
+% \begin{macrocode}
+\newcommand{\ecHINT}{\textbf{HINT}}
+\newcommand{\headHint}{%
+ \vspace*{\stretch{.1}}%
+ \begin{center}\ecSetHintWidth
+ \Large\ecHINT\par\vspace*{\ec@fterHintSkip}%
+ \begin{minipage}{\ec@HintWidth}%
+ \large\noindent\ignorespaces
+}
+% \end{macrocode}
+% \begin{macro}{\tailHint}
+% Close any environments begun in \cs{headHint}
+% \begin{macrocode}
+\newcommand{\tailHint}{%
+ \end{minipage}
+ \end{center}
+ \par\vspace{\stretch{2}}%
+}
+% \end{macrocode}
+% \end{macro}
+% \subsubsection{The \texttt{answer} Environment}
+% \begin{environment}{answer}
+% The \texttt{answer} environment follows the \texttt{hint}, also listed within
+% the \texttt{response} environment.
+% \begin{macrocode}
+\newenvironment{answer}{%
+ \textBgColor{\@solnColor}%
+ \headAnswer
+}{\tailAnswer}
+% \end{macrocode}
+% \end{environment}
+% \DescribeMacro\headAnswer Use \cs{headAnswer} to design of the answer page. \DescribeMacro\ecAfterAnsSkip
+% \cs{ecAfterAnsSkip} sets the vertical skip following the header (ANSWER). \DescribeMacro\ecAnsWidth
+% sets the width of the minipage on the ANSWER page.
+% \changes{v2.0c}{2016/07/29}{Added after skips and widths for answers page}
+% \begin{macrocode}
+\def\ecAfterAnsSkip#1{{\setlength{\@tempdima}{#1}%
+ \xdef\ec@fterAnsSkip{\the\@tempdima}}}
+\ecAfterAnsSkip{.25in}
+\def\ecAnsWidth#1{\def\ec@AnsWidth{#1}}
+\ecAnsWidth{.85\linewidth}
+\def\ecSetAnsWidth{\setlength{\@tempdima}{\ec@AnsWidth}%
+ \edef\ec@AnsWidth{\the\@tempdima}}
+% \end{macrocode}
+% Use the \DescribeMacro{\ecANS} command to format the hint page.
+% \changes{v2.0c}{2016/07/29}{Added \string\cs{ecANS}}
+% \begin{macrocode}
+\newcommand{\ecANS}{\textbf{ANSWER}}
+\newcommand{\headAnswer}{%
+ \vspace*{\stretch{.1}}%
+ \begin{center}\ecSetAnsWidth
+ \Large\ecANS\par\vspace*{\ec@fterAnsSkip}%
+ \begin{minipage}[t]{\ec@AnsWidth}%
+ \large\noindent\ignorespaces}
+% \end{macrocode}
+% \begin{macro}{\tailAnswer}
+% Close any environments opened by \cs{headAnswer}
+% \begin{macrocode}
+\newcommand{\tailAnswer}{%
+ \end{minipage}
+ \end{center}
+ \vspace*{\stretch{2}}
+}
+% \end{macrocode}
+% \end{macro}
+% \subsection{Navigation Support}
+%
+% In this section we build navigation support. The \DescribeMacro\iconWidth\cs{iconWidth} and
+% \DescribeMacro\iconHeight\cs{iconHeight} are the width and height of the icons as they appear
+% on the bottom of the page. When using a panel option, the width vale is reset, see \cs{iconWidthPanel}
+% and \cs{panelGrpWidth}.
+% \begin{macrocode}
+\newcommand\iconWidth{40pt}\newcommand\iconHeight{15pt}
+% \end{macrocode}
+% \begin{macro}{\ecHomePage}
+% \begin{macro}{\ecLogo}
+% \begin{macro}{\ecLogoLink}
+% \cs{ecHomePage}, for the `Home' button, and \cs{ecLogo}, for the logo. The argument
+% for \cs{ecLogo} should be a LaTeX graphics command such as \cs{includegraphics}. See
+% the default for an example. With \cs{ecLogoLink}, you can optionally associate a link
+% with your logo.
+% \begin{macrocode}
+\def\ecHomePage{\hyper@normalise\ec@HomePage}
+\def\ec@HomePage#1{\def\@ecHomePage{#1}}
+\ecHomePage{http://www.math.uakron.edu/~dpstory/acrotex.html}
+\def\ecLogo#1{\def\@ecLogo{#1}}
+\ecLogo{\includegraphics[scale=.4]{graphics/uakron}}
+\def\ecLogoLink{\hyper@normalise\ec@LogoLink}
+\def\ec@LogoLink#1{\def\@ecLogoLink{#1}}
+\let\@ecLogoLink\@empty
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsubsection{Toggle between Random and Nonrandom Delivery}
+%
+% \begin{macro}{\toggleRandomize}
+% \begin{macro}{\randomizedMsg}
+% \begin{macro}{\nonrandomizedMsg}
+% \begin{macro}{\toggleRandomizeTU}
+% We provide a push button for toggling between random mode and nonrandom mode.
+% The button resets the cards and alerts the user.
+% \begin{macrocode}
+\newcommand{\randomizedMsg}{The cards will be delivered
+ to you in random order.}
+\newcommand{\nonrandomizedMsg}{The cards will be delivered
+ to you in their natural order.}
+\newcommand{\toggleRandomizeTU}{%
+ Click to toggle between random and natural order.}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsubsection{Define JS Actions for Icons}
+% Below are some JavaScript definitions that are used for navigation.
+% \begin{macrocode}
+\def\makeesc#1{\catcode`#1=0\relax}
+% \end{macrocode}
+% \DescribeMacro{\fsJS}\noindent
+% Action for the fullscreen button `FS'.
+% \begin{macrocode}
+\begin{defineJS}{\fsJS}
+if (app.viewerVersion < 5.0)
+ app.fullscreen = !app.fullscreen
+else {
+ app.fs.cursor = cursor.visible;
+ app.fs.defaultTransition = "";
+ app.fs.useTimer = false;
+ app.fs.isFullScreen = !app.fs.isFullScreen;
+}
+\end{defineJS}
+% \end{macrocode}
+% \subsubsection{Define Navigation Icons}
+% Some navigation icons, \cs{newNaviIcon} is defined in the \textsf{Web Package}.
+% \begin{macrocode}
+% if nohint option is used, this is the JS action when hint is clicked.
+\newcommand\noHintJSAction{}
+\def\NaviIconActionJS#1{\ifecListing
+ \if\nMarker\ec@Ques\else
+ this.gotoNamedDest("\quesDestJS");\fi
+ \else
+ #1;
+ \fi
+}
+% \end{macrocode}
+%\changes{v2.0c}{2016/07/29}{Added labels for navigation icons to make customization easier}
+% \begin{macro}{\ecSolnLabel}
+% \begin{macro}{\ecHintLabel}
+% \begin{macro}{\ecNextLabel}
+% \begin{macro}{\ecPrevLabel}
+% \begin{macro}{\ecHintNextLabel}
+% \begin{macro}{\ecHintSolnLabel}
+% \begin{macro}{\ecBeginLabel}
+% \begin{macro}{\ecHomeLabel}
+% \begin{macro}{\ecFinHomeLabel}
+% \begin{macro}{\ecFSLabel}
+% \begin{macro}{\ecCloseLabel}
+% \begin{macro}{\ecRandomLabel}
+% Define labels for navigation icons to make customization easier.
+% \begin{macrocode}
+\def\ec@defineLabel#1#2#3{\def#1{#2 #3}}
+\newcommand{\ecSolnLabel}[2][\footnotesize]
+ {\ec@defineLabel\ec@SolnLabel{#1}{#2}}
+\ecSolnLabel{Soln}
+\newcommand{\ecHintLabel}[2][\footnotesize]
+ {\ec@defineLabel\ec@HintLabel{#1}{#2}}
+\ecHintLabel{Hint}
+\newcommand{\ecNextLabel}[2][\footnotesize]
+ {\ec@defineLabel\ec@NextLabel{#1}{#2}}
+\ecNextLabel{Next}
+\newcommand{\ecPrevLabel}[2][\footnotesize]
+ {\ec@defineLabel\ec@PrevLabel{#1}{#2}}
+\ecPrevLabel{Prev}
+\newcommand{\ecHintNextLabel}[2][\footnotesize]
+ {\ec@defineLabel\ec@HintNextLabel{#1}{#2}}
+\ecHintNextLabel{Next}
+\newcommand{\ecHintSolnLabel}[2][\footnotesize]
+ {\ec@defineLabel\ec@HintSolnLabel{#1}{#2}}
+\ecHintSolnLabel{Soln}
+\newcommand{\ecBeginLabel}[2][\footnotesize]
+ {\ec@defineLabel\ec@BeginLabel{#1}{#2}}
+\ecBeginLabel{Begin}
+\newcommand{\ecHomeLabel}[2][\footnotesize]
+ {\ec@defineLabel\ec@HomeLabel{#1}{#2}}
+\ecHomeLabel{Home}
+\newcommand{\ecFinHomeLabel}[2][\footnotesize]
+ {\ec@defineLabel\ec@FinHomeLabel{#1}{#2}}
+\ecFinHomeLabel{Home}
+\newcommand{\ecFSLabel}[2][\footnotesize]
+ {\ec@defineLabel\ec@FSLabel{#1}{#2}}
+\ecFSLabel{FS}
+\newcommand{\ecCloseLabel}[2][\footnotesize]
+ {\ec@defineLabel\ec@CloseLabel{#1}{#2}}
+\ecCloseLabel{Close}
+\newcommand{\ecRandomLabel}[2][\footnotesize]
+ {\ec@defineLabel\ec@RandomLabel{#1}{#2}}
+\ecRandomLabel{Random}
+% \end{macrocode}
+% The definitions of the navigation icons, \cs{newNaviIcon} is defined in the \pkg{web} package.
+% \begin{macrocode}
+\newNaviIcon[j]{\Soln}\iconWidth\iconHeight{\ec@SolnLabel}
+ {\NaviIconActionJS{this.gotoNamedDest("\solnDest")}}
+\newNaviIcon[j]{\Hint}\iconWidth\iconHeight{\ec@HintLabel}
+ {\if\@ecNoHints\ec@YES\noHintJSAction\else
+ \NaviIconActionJS{this.gotoNamedDest("\hintDestJS")}\fi} % dps
+\newNaviIcon[j]{\NextCard}\iconWidth\iconHeight{\ec@NextLabel}
+ {\NaviIconActionJS{getNextCard()}}
+\newNaviIcon[j]{\PrevCard}\iconWidth\iconHeight{\ec@PrevLabel}
+ {\NaviIconActionJS{getPrevCard()}}
+\newNaviIcon[j]{\hintNextCard}\iconWidth\iconHeight
+ {\ec@HintNextLabel}{getNextCard();}
+\newNaviIcon[j]{\hintSoln}\iconWidth\iconHeight{\ec@HintSolnLabel}
+ {\NaviIconActionJS{this.gotoNamedDest("\solndest")}}
+\newNaviIcon[j]{\Begin}\iconWidth\iconHeight
+ {\ec@BeginLabel}{beginECards();}
+\newNaviIcon[l]{\Home}\iconWidth\iconHeight{\ec@HomeLabel}
+ {\ifnum\arabic{page}=1\relax\def\ec@next{\href{\@ecHomePage}}\else
+ \def\ec@next{\hyperlink{page.1}}\fi\ec@next}
+\newNaviIcon[j]{\Finished}\iconWidth\iconHeight{\ec@FinHomeLabel}
+ {resetToFirstPage();}
+\newNaviIcon[j]{\FullScreen}\iconWidth\iconHeight
+ {\ec@FSLabel}{\fsJS}
+\newNaviIcon[j]{\Close}\iconWidth\iconHeight{\ec@CloseLabel}
+ {closeCards=true; app.execMenuItem("Close")}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macrocode}
+\def\ec@CB@toggleOrder{%
+ \checkBox[\A{\JS{toggleOrder();}}\DV{\cbInitState}\V{\cbInitState}%
+ \TU{\toggleRandomizeTU}\textSize{0}\textColor{1 0 0}
+ \BC{0 0 .8}]{eccbtoggleorder}{9bp}{9bp}{randomOrder}}
+\providecommand{\nopNaviIcon}[4]{%
+ \def#1{{\setlength{\fboxsep}{0pt}%
+ \web@colorbox@w@transparency{\@menuBgColor}%
+ {\parbox[c][#3][c]{#2}%
+ {\normalsize\centering\color{\@menucolor}#4}}%
+ }}%
+}
+\nopNaviIcon{\fpToggleOrder}\iconWidth\iconHeight
+ {\ec@RandomLabel\space\ec@CB@toggleOrder}
+\nopNaviIcon{\ToggleOrder}\iconWidth\iconHeight
+ {\footnotesize\ec@CB@toggleOrder}
+% \end{macrocode}
+% If \cs{@memLogo} has a value of `y', then the logo is put in a box and copied
+% onto each page; otherwise, the logo is read from its file on each page.
+% \begin{macrocode}
+\edef\@@Logo{\if\@memLogo\ec@YES\relax
+ \noexpand\unhcopy\noexpand\Logo\else\noexpand\@ecLogo\fi}
+% \end{macrocode}
+% Build the button panel for the navigation bar. Can re-design as desired.
+% \changes{v2.0b}{2016/07/27}{Added \string\cs{iconWidthPanel} and \string\cs{panelGrpWidth}}
+% Use \DescribeMacro{\iconWidthPanel}\cs{iconWidthPanel} to set the width of a panel button, and
+% \DescribeMacro\panelGrpWidth\cs{panelGrpWidth} to set the width of the group of buttons.
+% \begin{macrocode}
+\newcommand\iconWidthPanel{28pt}
+\newcommand\panelGrpWidth{57pt}
+\ifnum\@panelconfig>0\relax
+% \end{macrocode}
+% if \cs{@panelconfig} (a macro defined in \textsf{web}, is positive, then the author has chosen
+% a left or a right navigation panel. So, we must build a panel.
+% \begin{macro}{\panelNaviGroup}
+% This is the group of panel buttons used for navigation purposes.
+% \begin{macrocode}
+ \renewcommand\panelNaviGroup {%
+ \def\iconWidth{\iconWidthPanel}%
+ \ifnum\thepage=1\relax
+ \parbox[c]{\panelGrpWidth}
+ {%
+ \Begin\hfill\FullScreen\\
+ \Close\hfill\Home\\
+ \let\iconWidth\linewidth
+ \fpToggleOrder
+ }%
+ \else
+ \parbox[c]{\panelGrpWidth}
+ {%
+ {\ifecListing\else\if\nMarker\ec@Ques
+ \if\@ecNoHints\ec@YES
+ \navibarTextColor{lightblue}\fi
+ \else
+ \navibarTextColor{lightblue}\fi\fi\Hint}\hfill
+ {\if\nMarker\ec@Soln
+ \navibarTextColor{lightblue}\fi\Soln}\\
+ \NextCard\hfill\PrevCard\\
+ \ToggleOrder\hfill\Finished
+ }%
+ \fi
+ }
+% \end{macrocode}
+% \end{macro}
+% If \cs{@memLogo} is `y', create a new box, read logo with \cs{@ecLogo}, and store
+% in box
+% \begin{macrocode}
+ \newbox\Logo
+ \if\@memLogo\ec@YES\relax
+ \AtBeginDocument{\global\setbox\Logo=\hbox{\@ecLogo}}%
+ \fi
+% \end{macrocode}
+% \begin{macro}{\buildpanel}
+% The \cs{buildpanel} command is defined in the \pkg{web} package and determines the layout of
+% the vertical navigation panel. You can re-design your own. \DescribeMacro{\raiseLogoBy}\cs{raiseLogoBy}
+% may be used to adjust the vertical position of the logo.
+% \changes{v2.0b}{2016/07/27}{Added \string\cs{raiseLogoBy}}
+% \begin{macrocode}
+\def\raiseLogoBy#1{{\setlength\@tempdima{#1}%
+ \xdef\r@iseLogoBy{\the\@tempdima}}}\raiseLogoBy{0pt}
+ \buildpanel{\raisebox{\r@iseLogoBy}{\ifx\@ecLogoLink\@empty\@@Logo
+ \else\href{\@ecLogoLink}{\@@Logo}\fi}%
+ \par\vspace{\stretch{1}}%
+ \rotatebox{-90}{\aebLogo}%
+ \par\vspace{\stretch{1}}%
+ \panelNaviGroup
+ }
+% \end{macrocode}
+% \end{macro}
+% Delay the expansion of the \cs{newNaviIcon} macro for the solution page
+% \begin{macrocode}
+ \def\defineSoln{\newNaviIcon[j]{\Soln}\iconWidth\iconHeight
+ {\ec@SolnLabel}{%
+ \NaviIconActionJS{this.gotoNamedDest("\solndest")}}%
+ \def\sqWrongRespJS{app.alert(\eqsqwgmsg,3);
+ this.gotoNamedDest("\solndest");}%
+ }
+\else
+% \end{macrocode}
+% \begin{macro}{\cardNavibar}
+% \cs{@panelconfig} must be zero, the author does not want a navigation panel, so well
+% put buttons at the bottom of each page to navigate by.
+% Standard navigation bar.
+% \begin{macrocode}
+ \def\cardNaviBar{\insNaviBar{\hfill
+ \if\@ecNoHints\ec@NO\Hint\ \fi\Soln\ \NextCard\
+ \PrevCard\ \ToggleOrder\ \Home\hfill}}
+ \def\defineSoln{\newNaviIcon[j]{\Soln}\iconWidth\iconHeight
+ {\ec@SolnLabel}{%
+ \NaviIconActionJS{this.gotoNamedDest("\solndest")}}%
+ \def\sqWrongRespJS{app.alert(\eqsqwgmsg,3);
+ this.gotoNamedDest("\solndest");}%
+ }
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+\fi
+% \end{macrocode}
+%
+%\subsection{Close Page Action}
+%
+% We tap into \textsf{eforms} through the \cs{@CloseAction} macro. If \texttt{aeb\_pro}
+% is used, the document author may overwrite this definition.
+%
+% \begin{macrocode}
+\newcommand{\pressBeginMsg}{Press the \eqbs\eqbs"Begin\eqbs\eqbs"
+ button to begin viewing the cards.}
+\ifecListing\else
+\thisPageAction{\JS{}}{\JS{if (!closeCards&&!beginPressed){\jsR\jsT
+ var b=app.setTimeOut("this.pageNum=0;
+ app.alert(pressBeginMsg);",50);\jsR}}}
+\fi
+% \end{macrocode}
+% \subsection{Document Level JavaScript}
+% Insert document level JavaScripts to get the functionality of randomly selected questions.
+%
+% \smallskip\noindent If author has used the \texttt{nodljs} or \texttt{exercises} only, then
+% we need to turn the \textsf{insdljs} package back on by emitting
+% \begin{macrocode}
+\let\importdljs=y
+% \end{macrocode}
+% This is the JavaScript to control the eCards action. Some global variables followed by the
+% \texttt{getNextCard()} method.
+% \begin{macrocode}
+\begin{insDLJS}[isCardloaded]{flashcrd}{Flash Card JS}
+var isCardloaded=true;
+var closeCards=false;
+var beginPressed=false;
+var maxNumberCards = Math.pow(10,Math.ceil(%
+Math.LOG10E*Math.log(\theNumCards)));
+var aCardsNaturalOrder=new Array();
+var aCardsRandomOrder=new Array();
+var aCardsViewOrder;
+var ptrCards=0;
+var cardsFinished = "\CARDSFINISHED";
+var pressBeginMsg = "\pressBeginMsg";
+var isRandomized=\israndomized;
+% \end{macrocode}
+% Get the next card, and notify the user if all cards have been viewed.
+% \begin{macrocode}
+function getNextCard() {
+ numCards = \theNumCards;
+ if ( ptrCards == numCards ) {
+ app.alert(cardsFinished,3);
+ resetToFirstPage();
+ } else {
+ ptrCards+=1;
+ this.gotoNamedDest("qex."+aCardsViewOrder[ptrCards]);
+ }
+}
+% \end{macrocode}
+% Get the previous card.
+% \begin{macrocode}
+function getPrevCard() {
+ if ( ptrCards <= 1 ) {
+% this.gotoNamedDest("page.1");
+ resetToFirstPage();
+ } else {
+ ptrCards-=1;
+ this.gotoNamedDest("qex."+aCardsViewOrder[ptrCards]);
+ }
+}
+% \end{macrocode}
+% We also define a function \texttt{ecOnBlurRespBox()} to
+% correctly control the page changes: If a wrong answer is given, then we go to
+% the hint or the solution depending on whether user is responding to the original
+% question or to the hint.
+% \begin{macrocode}
+function ecOnBlurRespBox (retn, exnoCard, nMarker) {
+ if (retn != null) {
+ if (retn) {
+ app.alert(\eqsqrtmsg,3);
+ var dest = "ex" + exnoCard + ".s"; // dps
+ this.gotoNamedDest(dest);
+ } else {
+ app.alert(\eqsqwgmsg,3);
+ if (nMarker==0) {
+ var dest = "ex." + exnoCard; // dps
+ this.gotoNamedDest(dest);
+ }
+ else {
+ var dest = "ex" + exnoCard + ".s"; // dps
+ this.gotoNamedDest(dest);
+ }
+ }
+ } else {
+ var str = event.target.value.toString();
+ if (str.replace(/\s/g,"") == "")
+ event.target.strokeColor = \defaultColorJSDef; // dps
+ }
+}
+% \end{macrocode}
+% This executes when the user clicks the begin link.
+% \begin{macrocode}
+function beginECards() {
+ PrepareViewingOrder();
+ beginPressed=true;
+ getNextCard();
+ var f, g, bState;
+ f=this.getField("eccbtoggleorder");
+ bState=f.isBoxChecked(0);
+ this.resetForm();
+ f.checkThisBox(0,bState);
+ for (var card=1; card<=\theNumCards; card++) {// dps
+ f = this.getField("obj.ex"+card);
+ if ( f != null ) {
+ g = f.getArray();
+ for (var i = 0; i < g.length; i++)
+ g[i].strokeColor = \defaultColorJSDef; // dps
+ }
+ }
+}
+% \end{macrocode}
+% Sets \texttt{ptrCards} to 0, then builds two new matrices,
+% \texttt{aCardsNaturalOrder} consisting of the numbers 1,2,...\cs{theNumCards},
+% and \texttt{aCardsRandomOrder}. If \texttt{isRandomized} is \texttt{true},
+% \texttt{aCardsViewOrder} is set to \texttt{aCardsRandomOrder}, otherwise it is set
+% to \texttt{aCardsNaturalOrder}.
+% \begin{macrocode}
+function PrepareViewingOrder() {
+ ptrCards=0;
+ var i, rand;
+ for (i=0; i<=\theNumCards; i++) {
+ aCardsNaturalOrder[i]=i;
+ aCardsRandomOrder[i]=i;
+ }
+% \end{macrocode}
+% We randomize the entries in \texttt{aCardsRandomOrder}, which at this moment
+% is the same as \texttt{aCardsNaturalOrder}.
+% \begin{macrocode}
+ for (i=1; i<=\theNumCards; i++) {
+ var rand = Math.random();
+ rand *= maxNumberCards;
+ rand = Math.ceil(rand);
+ rand = rand \% \theNumCards;
+ rand += 1;
+ temp = aCardsRandomOrder[i];
+ aCardsRandomOrder[i]=aCardsRandomOrder[rand];
+ aCardsRandomOrder[rand]=temp;
+ }
+ aCardsViewOrder=(isRandomized)?aCardsRandomOrder:aCardsNaturalOrder;
+}
+% \end{macrocode}
+% Toggles between viewing the cards in random order and their natural order.
+% \begin{macrocode}
+function toggleOrder() {
+ isRandomized=!isRandomized;
+ if (aCardsNaturalOrder.length==0) PrepareViewingOrder();
+ if (isRandomized) {
+ for (var i=1; i<=\theNumCards; i++)
+ if (aCardsRandomOrder[i]==ptrCards) break;
+ ptrCards=i;
+ aCardsViewOrder=aCardsRandomOrder;
+ app.alert("\randomizedMsg");
+ } else {
+ ptrCards=aCardsViewOrder[ptrCards];
+ aCardsViewOrder=aCardsNaturalOrder;
+ app.alert("\nonrandomizedMsg");
+ }
+}
+function resetToFirstPage() {
+ this.gotoNamedDest("page.1");
+ beginPressed=false;
+}
+\end{insDLJS}
+% \end{macrocode}
+% If we have the \texttt{listing} option taken, then we import the \texttt{ecardslist.def}
+% file to redefine portions of the \texttt{card} environment.
+% just the Adobe Reader.
+% \begin{macrocode}
+\ifecListing\input{ecardslist.def}\fi
+% \end{macrocode}
+% If document author wants to modify these environments, s/he can place redefinitions in
+% \texttt{ecard.cus}.
+% \begin{macrocode}
+\if\@ecCustom\ec@YES\InputIfFileExists{ecard.cus}{}{}\fi
+%</package>
+% \end{macrocode}
+% \subsection{Support for the \texttt{listing} option}
+% When the \texttt{listing} option is taken, we list out the questions, hints, and answers.
+% In this section, a number of environments and commands are defined, the name of each
+% begin with `\texttt{listing@}'. The document author can \cs{renewcommand} there to
+% create a printed listing of easy review. If you say
+%\begin{verbatim}
+%\usepackage[forpaper,tight]{web}
+%\usepackage[solutionsafter,proofing]{exerquiz}
+%\usepackage[memLogo,listing]{ecards}
+%\end{verbatim}
+% then the multiple choice and fill-in questions will display the correct answers. Place any
+% customizations in a text field named \texttt{ecard.cus}, and use the \texttt{custom}
+% option.
+% \subsubsection{The \texttt{card} Environment}
+% \begin{macrocode}
+%<*listing>
+% \end{macrocode}
+% \begin{environment}{card}
+% This is the main environment for writing questions, hints and answers. This environment
+% encloses all.
+% \begin{macrocode}
+\newcounter{ecCnt}
+\let\exsolafter\@empty
+\eqexerskip{0pt}
+\newenvironment{listing@card}[1][\opts@ecNoHints]{%
+ \isQuestrue\let\useHints\ec@HintsWarning
+ \let\useNoHint\ec@HintsWarning\edef\ec@rgi{#1}%
+ \ifx\ec@rgi\ec@isHint
+ \def\ec@thisHintOpt{\ecUseHints}\else
+ \ifx\ec@rgi\ec@isNoHint
+ \def\ec@thisHintOpt{\ecUseNoHints}\else
+ \def\ec@thisHintOpt{\ecUseHints}\ec@BadArgWarning
+ \fi\fi
+ \ec@thisHintOpt\nMarkerSet{\ec@Ques}%
+ \stepcounter{ecCnt}%
+ \def\eqexheader{\noindent}%
+ \renewcommand\exsllabelformat{\protect\noindent}%
+ \renewcommand\exrtnlabelformat{}%
+ \renewcommand\exsecrunhead{}%
+ \let\afterlabelhskip\@empty
+ \def\exersolnheadhook{\ecInfoToSolns}%
+ \begin{exercise}%
+ \textBgColor{\@cardColor}%
+ \headCard
+}{%
+ \tailCard
+ \end{exercise}%
+}
+% \end{macrocode}
+% \end{environment}
+% \begin{macro}{\headCard}
+% The design of the question page. Can re-design.
+% \begin{macrocode}
+\newcommand{\listing@headCard}{\ifeqforpaper
+ \makebox[0pt][r]{\textbf{\arabic{ecCnt}.\thinspace}}\else
+ \makebox[0pt][r]{\textbf{\hyperlink{ex.\exnoCard}%
+ {\arabic{ecCnt}.\thinspace}}}\fi\ignorespaces}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\tailCard}
+% Complete any environments begun by \cs{headCard}
+% \begin{macrocode}
+\newcommand{\listing@tailCard}{\removelastskip\par} % dps
+% \end{macrocode}
+% \end{macro}
+% \subsubsection{The \texttt{response} Environment}
+% \begin{environment}{response}
+% Nested within the \texttt{card} environment is the
+% \texttt{response} environment, which, in turn, contains the
+% \texttt{hint} and \texttt{answer} environments. This basically
+% the \texttt{solution} environment for an \texttt{exercise} of
+% \textsf{exerquiz}.
+% \begin{macrocode}
+\def\setSolutionsAfterSkip{\expandafter
+ \def\expandafter\solutionsafterSkip
+ \expandafter{\solutionsafterSkip\kern0pt}}
+\AtBeginDocument{\setSolutionsAfterSkip}
+\newenvironment{listing@response}
+ {\solutionsafterSkip\solnexer@woparts[]}{\endsolnexer@woparts}
+% \end{macrocode}
+% \end{environment}
+% \begin{environment}{hint}
+% Right now, a hint is required. Place this environment within the \texttt{response}
+% environment and \textit{before} the \texttt{answer} environment.
+% \begin{macrocode}
+\newenvironment{listing@hint}{%
+ \textBgColor{\@hintColor}%
+ \headHint
+}{\tailHint}
+% \end{macrocode}
+% \end{environment}
+% \begin{macro}{\headHint}
+% The design of the hint page. Can re-design.
+% \begin{macrocode}
+\newcommand{\listing@headHint}{%
+ \par\textit{Hint}:\space\ignorespaces}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\tailHint}
+% Close any environments begun in \cs{headHint}
+% \begin{macrocode}
+\newcommand{\listing@tailHint}{}
+% \end{macrocode}
+% \end{macro}
+% \subsubsection{The \texttt{answer} Environment}
+% \begin{macro}{\headAnswer}
+% The design of the answer page. Can re-design.
+% \end{macro}
+% \begin{environment}{answer}
+% The \texttt{answer} environment follows the \texttt{hint}, also listed within
+% the \texttt{response} environment.
+% \begin{macrocode}
+\newenvironment{listing@answer}{%
+ \textBgColor{\@solnColor}%
+ \headAnswer
+}{\tailAnswer}
+% \end{macrocode}
+% \end{environment}
+% \begin{macrocode}
+\newcommand{\listing@headAnswer}{%
+ \par\textit{Answer}:\space\ignorespaces}
+% \end{macrocode}
+% \begin{macro}{\tailAnswer}
+% Close any environments opened by \cs{headAnswer}
+% \begin{macrocode}
+\newcommand{\listing@tailAnswer}{}
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+\def\ec@redefForListing{%
+ \let\card\listing@card
+ \let\endcard\endlisting@card
+ \let\headCard\listing@headCard
+ \let\tailCard\listing@tailCard
+ \let\response\listing@response % dps
+ \let\endresponse\endlisting@response % dps
+ \let\headhint\listing@hint
+ \let\endhint\listing@endhint
+ \let\headHint\listing@headHint
+ \let\tailHint\listing@tailHint
+ \let\answer\listing@answer
+ \let\endanswer\listing@endanswer
+ \let\headAnswer\listing@headAnswer
+ \let\tailAnswer\listing@tailAnswer
+}
+\AtBeginDocument{\ec@redefForListing}
+%</listing>
+% \end{macrocode}
+\endinput