summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/ecards/ecards.dtx
blob: 7eda9651c111267fcc6d7558379a957a822a1f24 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
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