%\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. %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % %\NeedsTeXFormat{LaTeX2e}[1997/12/01] %\ProvidesPackage{ecards} % [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} % % \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[,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[,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 % % \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} % % \end{macrocode} \endinput