diff options
Diffstat (limited to 'texmf-dist/source/latex/ecards/ecards.dtx')
-rw-r--r-- | texmf-dist/source/latex/ecards/ecards.dtx | 1331 |
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 |