diff options
author | Norbert Preining <norbert@preining.info> | 2021-05-14 06:36:17 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2021-05-14 06:36:17 +0900 |
commit | 4ac795a4cbc17927bd3bc444849a5144d23ba43f (patch) | |
tree | 8948edec442783553a0424e591502f58d919dc69 /texmf-dist/source | |
parent | a44c31f2888612f90f4ebcf97cc95e89b0047714 (diff) |
acrotex (May14)
Diffstat (limited to 'texmf-dist/source')
-rw-r--r-- | texmf-dist/source/latex/acrotex/acrotex.ins | 1 | ||||
-rw-r--r-- | texmf-dist/source/latex/acrotex/dljslib.dtx | 321 | ||||
-rw-r--r-- | texmf-dist/source/latex/acrotex/eforms.dtx | 78 | ||||
-rw-r--r-- | texmf-dist/source/latex/acrotex/exerquiz.dtx | 1273 | ||||
-rw-r--r-- | texmf-dist/source/latex/acrotex/exerquiz.ins | 3 | ||||
-rw-r--r-- | texmf-dist/source/latex/acrotex/insdljs.dtx | 551 | ||||
-rw-r--r-- | texmf-dist/source/latex/acrotex/web.dtx | 259 |
7 files changed, 1457 insertions, 1029 deletions
diff --git a/texmf-dist/source/latex/acrotex/acrotex.ins b/texmf-dist/source/latex/acrotex/acrotex.ins index 3afd02ab..63c2cf08 100644 --- a/texmf-dist/source/latex/acrotex/acrotex.ins +++ b/texmf-dist/source/latex/acrotex/acrotex.ins @@ -61,6 +61,7 @@ \file{aebrandom.def}{\from{exerquiz.dtx}{copyright,randomize}} \file{aebsumrytbls.def}{\from{exerquiz.dtx}{copyright,sumrytbls}} \file{usemcfi.def}{\from{exerquiz.dtx}{copyright,mcfi}} + \file{rbmintrvl.def}{\from{exerquiz.dtx}{copyright,rbmIntrvl}} \file{eqcolor.def}{\from{exerquiz.dtx}{copyright,eqcolor}} \file{template.def}{\from{exerquiz.dtx}{copyright,template}} \file{eqfr.def}{\from{exerquiz.dtx}{copyright,eqfr}} diff --git a/texmf-dist/source/latex/acrotex/dljslib.dtx b/texmf-dist/source/latex/acrotex/dljslib.dtx index 9d1d1dfe..53f7f5d6 100644 --- a/texmf-dist/source/latex/acrotex/dljslib.dtx +++ b/texmf-dist/source/latex/acrotex/dljslib.dtx @@ -2,7 +2,7 @@ %<*copyright> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% dljsLib.sty package, %% -%% Copyright (C) 2001-2018 D. P. Story %% +%% Copyright (C) 2001-2021 D. P. Story %% %% dpstory@uakron.edu %% %% %% %% This program can redistributed and/or modified under %% @@ -14,7 +14,7 @@ %</copyright> %<package>\NeedsTeXFormat{LaTeX2e} %<package>\ProvidesPackage{dljslib} -%<package> [2017/08/11 v2.1 Manage a Library of Document Level JavaScripts (dps)] +%<package> [2021/04/04 v2.2 Manage a Library of Document Level JavaScripts (dps)] %<*driver> \documentclass{ltxdoc} \usepackage[colorlinks,hyperindex=false]{hyperref} @@ -23,6 +23,23 @@ \EnableCrossrefs \CodelineIndex \RecordChanges +\makeatletter +\let\@latex@warning@no@line\@gobble +\makeatother +\def\darg#1{\texttt{\char123\relax#1\char125\relax}} +\def\CMD#1{\textbackslash#1} +\let\pkg\textsf +\let\opt\texttt +\let\env\texttt +\let\app\textsf +\let\uif\textsf +\def\STRUT{\rule{0pt}{14pt}} +\def\negSTRUT{\rule[-8pt]{0pt}{0pt}} +\def\nmpsep#1{\hskip-\marginparsep\texttt{#1}} +\def\visispace{\symbol{32}} +\def\ameta#1{\ensuremath{\langle\textit{\texttt{#1}}\rangle}} +\def\meta#1{\textsl{\texttt{#1}}} +\def\SUB#1{\ensuremath{{}_{\mbox{\scriptsize\ttfamily#1}}}} \InputIfFileExists{aebdocfmt.def}{\PackageInfo{dljslib}{Inputting aebdocfmt.def}} {\def\IndexOpt{\DescribeMacro}\def\IndexKey{\DescribeMacro}\let\setupFullwidth\relax \PackageInfo{dljslib}{aebdocfmt.def cannot be found}} @@ -88,12 +105,17 @@ % \begin{macrocode} \dljsRegister[y]{dljslib} % \end{macrocode} -% \subsection{Library Card Catalog} -% \IndexOpt{equations} -% \IndexOpt{vectors} -% \IndexOpt{indefIntegral} -% \IndexOpt{ImplMulti} -% \IndexOpt{nodec} +% \subsection{Library Card Catalog}\leavevmode +% \IndexOpt{equations}^^A% +% \IndexOpt{vectors}^^A% +% \IndexOpt{indefIntegral}^^A% +% \IndexOpt{ImplMulti}^^A% +% \IndexOpt{nodec}^^A% +% \IndexOpt{noBinFac}^^A% +% \IndexOpt{limitArith}^^A% +% \IndexOpt{combinatorics}^^A% +% \IndexOpt{setSupport}^^A% +% \noindent % The arguments of the \cs{DeclareAndRegister} command are the options of this package, and % their names represent JavaScript functions in the library. % \begin{macrocode} @@ -102,41 +124,38 @@ \DeclareAndRegister{indefIntegral} \DeclareAndRegister{ImplMulti} \DeclareAndRegister{nodec} -% \end{macrocode} -% \IndexOpt{noBinFac} -% \IndexOpt{limitArith} -% \IndexOpt{combinatorics} -% \IndexOpt{setSupport} -% More options. -% \begin{macrocode} \DeclareAndRegister{noBinFac} \DeclareAndRegister{limitArith} \DeclareAndRegister{combinatorics} \DeclareAndRegister{setSupport} % \end{macrocode} -% \IndexOpt{unordered} -% \IndexOpt{complex} -% \IndexOpt{satisfyEq} -% \IndexOpt{useGermanNums} -% \IndexOpt{factors} -% More options still. +% \leavevmode +% Additional registered names. +% \IndexOpt{unordered}^^A% +% \IndexOpt{complex}^^A% +% \IndexOpt{satisfyEq}^^A% +% \IndexOpt{useGermanNums}^^A% +% \IndexOpt{useDeNums}^^A% +% \IndexOpt{useEnNums}^^A +% \IndexOpt{factors}^^A% +% \IndexOpt{point}^^A% +% \IndexOpt{intervals}^^A% % \begin{macrocode} \DeclareOption{unordered}{\PackageWarning{dljslib} - {The `unordered' option is now combined with the\MessageBreak - `setSupport' option, will use the `setSupport' option\MessageBreak - instead}\ExecuteOptions{setSupport}} + {The `unordered' option is now combined with the\MessageBreak + `setSupport' option, will use the `setSupport' option\MessageBreak + instead}\ExecuteOptions{setSupport}} %\DeclareAndRegister{unordered} \DeclareAndRegister{complex} \DeclareAndRegister{satisfyEq} \DeclareAndRegister{useGermanNums} +\DeclareOption{useDeNums}{\ExecuteOptions{useGermanNums}} +\DeclareAndRegister{useEnNums} \DeclareAndRegister{factors} -% \end{macrocode} -% \IndexOpt{point} -% \IndexOpt{intervals} -% The final set of options. -% \begin{macrocode} \DeclareAndRegister{point} \DeclareAndRegister{intervals} +% \end{macrocode} +% \begin{macrocode} \def\includeOptions#1{\@for\@option:=#1\do{\dljsRegister[y]{\@option}}} \InputIfFileExists{libcusopt.opt}{}{} % \end{macrocode} @@ -238,6 +257,8 @@ % this of this as the ``front wrapper'' or ``front cover'' of your library selections. It contains the % ``name'' of the library from which you checked out your selections. % \begin{macrocode} +\newcommand{\SyntaxErrorAuthor}{"Syntax error in author's answer! + Check console."} \begin{library@holding}{dljslib} \begin{insDLJS*}[dljslib]{dljslib} \begin{newsegment}{dljslib: AcroTeX DLJS Library} @@ -333,7 +354,7 @@ function ProcRespEq(flag,CorrAns,n,epsilon,domain,indepVars,oComp) } zCorrAns = ParseInput(zCorrAns); if (!ok2Continue) { - eqAppAlert("Syntax error in author's answer! Check console.", 3); + eqAppAlert(\SyntaxErrorAuthor,3); console.println("Syntax Error: " + CorrAns); return null; } @@ -341,10 +362,10 @@ function ProcRespEq(flag,CorrAns,n,epsilon,domain,indepVars,oComp) if (!ok2Continue) return null; % convert vars to new format, if needed indepVars = TypeParameters(indepVars); - var lambda = getNonZeroRatio (domain, indepVars, zCorrAns, zUserAns); + var lambda = getNonZeroRatio(domain,indepVars,zCorrAns,zUserAns); if ( lambda == null ) { eqAppAlert(\eqSyntaxErrorUndefVar,3); return null; }; - if ( !ok2Continue ) return notifyField(false, flag, fieldname); + if ( !ok2Continue ) return notifyField(false,flag,fieldname); zCorrAns = lambda + "*(" + zCorrAns + ")"; success=randomPointCompare (n,domain,indepVars,epsilon, zCorrAns,zUserAns,comp) @@ -508,7 +529,7 @@ typeof oComp.priorParse != "undefined" ) { for (i=0; i<aCorrAns.length; i++) { aCorrAns[i] = ParseInput(aCorrAns[i]); if (!ok2Continue) { - eqAppAlert("Author Syntax error!", 3); + eqAppAlert(\SyntaxErrorAuthor, 3); return null; } aUserAns[i] = ParseInput(aUserAns[i]); @@ -1204,7 +1225,6 @@ domain,indepVars,oComp) { % \end{macrocode} % Modified for multi-letter variables: remove one line, insert two. (2017/08/09) % \begin{macrocode} -% dps17 var UserAns=(arguments.length>7)?arguments[7]:event.value; var retn=_ProcRespEvalEq(false,flag,CorrAns,n,epsilon, indepVars,UserAns); @@ -1273,7 +1293,6 @@ indepVars,oComp) { % \end{macrocode} % Modified for multi-letter variables: remove one line, insert two. (2017/08/09) % \begin{macrocode} -% dps17 var UserAns=(arguments.length>7)?arguments[7]:event.value; var retn=_ProcRespEvalEqList(true,flag,CorrAns,n,epsilon,% indepVars,UserAns); @@ -1446,15 +1465,74 @@ return syntaxError(), null; \end{newsegment} \end{library@holding} % \end{macrocode} -% \subsubsection{\texttt{useGermanNums}} +% \subsubsection{\texttt{useGermanNums} (\texttt{useDeNums})} +% \leavevmode % \IndexOpt{useGermanNums}A simple \texttt{ProcResp()} for processing numbers entered in a German format: 1234,56. % The Germans have a block delimiter of period or space (1.234,56 or 1 234,56). % The period is not supported and causes an alert box. %\changes{v1.9g}{2014/01/14}{Added a proc to accept the comma for the decimal mark} +%\changes{v2.2}{2021/04/04}{Modified useGermanNums, created alias useDeNums} +%\changes{v2.2}{2021/04/04}{Modified proc to warn about English decimal point only} % \begin{macrocode} \@ifcheckedout{useGermanNums} -\newcommand{\noDecPtGerMsg}{"A period (.) is not allowed in answer, - use German notation for numbers"} +% \end{macrocode} +%\leavevmode\DescribeMacro{\noDecPtDeMsg} A general alert message for responses that +% contain a point (.). +% \begin{macrocode} + \dlJSStr[noquotes]{\noDecPtDeMsg}{% + "German Notation Syntax Error: A point (.) was found + in your response \"" + UserAns + "\". + Please remove the point, or this answer will be marked as wrong."} +% \end{macrocode} +% \DescribeMacro{\MsgDei} An alert message when German decimal notation +% is expected. +% \begin{macrocode} + \flJSStr*[noquotes]{\MsgDei}{"German decimal notation is expected, +for example: 12,3456."} + \flJSStr*[noquotes]{\MsgDeiAlt}{"German decimal notation is expected, +for example: 12,3456." +((warnDecDeOnly)?"\n\n +The English decimal notation (12.2345) is also accepted, +however.":"")} +% \end{macrocode} +% \DescribeMacro{\MsgDeii} An alert message when two decimal places are expected. +% \begin{macrocode} + \flJSStr*[noquotes]{\MsgDeii}{"A decimal number is required, +rounded to two decimal places, for example: 12,34"} +% \end{macrocode} +% When \DescribeMacro{\warnDecDeOnlyOn}\cs{warnDefDeOnlyOn} is declared in the preamble, the use of +% the decimal point (.) is accepted but a warning message appears. On the downside, +% the student can enter \texttt{1.00,10}, which will, no doubt, lead to an +% incorrect answer. +% \begin{macrocode} + \def\warnDecDeOnlyOn{\def\warnDecDeOnly{true}} + \def\warnDefDeOnlyOff{\def\warnDecDeOnly{false}} + \warnDefDeOnlyOff +% \end{macrocode} +% \DescribeMacro{\numDe}\nmpsep{\darg{\ameta{Msg}}} is a command that supports +% the German decimal notation point (,). For this command, the decimal point (,) +% is optional; that is, an integer response is accepted. \ameta{Msg} is a message +% that appears on error of syntax. +% \begin{macrocode} + \def\numDe#1{{priorParse:\Array(% + \preReqForm(/\rebstr\rechrclass{+-}?\redigit*,?% + \redigit*\reestr/,(#1)))}} +% \end{macrocode} +% \DescribeMacro{\rndNumDeReq}\nmpsep{\darg{\ameta{nDec-pl}}\darg{\ameta{Msg}}} +% For numbers that are required to be rounded to \emph{exactly} \ameta{nDec-pl} decimal places. +% \ameta{Msg} is an error message. Decimal point (,) is required. +% \begin{macrocode} + \def\rndNumDeReq#1#2{{priorParse:\Array(% + \preReqForm(/\rebstr\rechrclass{+-}?\redigit*,% + \redigit{#1}\reestr/,(#2)))}} +% \end{macrocode} +% \DescribeMacro{\rndNumDeOpt}\nmpsep{\darg{\ameta{nDec-pl}}\darg{\ameta{Msg}}} +% For numbers that are required to be rounded to \emph{at most} \ameta{nDec-pl} decimal places. +% \ameta{Msg} is an error message. Decimal point (,) optional (integer respose +% accepted). +% \begin{macrocode} + \def\rndNumDeOpt#1#2{{priorParse:\Array(% at most two decimal places + \preReqForm(/\rebstr\rechrclass{+-}?% + \redigit*,?\redigit{0,#1}\reestr/,(#2)))}} \fi \begin{library@holding}{useGermanNums} \begin{newsegment} @@ -1463,6 +1541,7 @@ return syntaxError(), null; % \DescribeMacro{ProcRespNumsDe} This segment only has one ProcResp function in it, % this is named \texttt{ProcRespNumsDe}. % \begin{macrocode} +var warnDecDeOnly=\warnDecDeOnly; function ProcRespNumsDe (flag,CorrAns,n,epsilon,% domain,indepVars,oComp) { if (!ProcessIt) return null; @@ -1471,8 +1550,7 @@ domain,indepVars,oComp) { % \end{macrocode} % Modified for multi-letter variables: remove one line, insert two. (2017/08/09) % \begin{macrocode} -% var UserAns = event.value; - var bSubstVars=(arguments.length>7); // dps17 + var bSubstVars=(arguments.length>7); var UserAns=(bSubstVars)?arguments[7]:event.value; % \end{macrocode} % This is the only change over the \texttt{ProcResp}, we call @@ -1489,7 +1567,7 @@ domain,indepVars,oComp) { ok2Continue = true; CorrAns = ParseInput(CorrAns); if (!ok2Continue) { - eqAppAlert("Syntax error in author's answer! Check console.", 3); + eqAppAlert(\SyntaxErrorAuthor,3); return null; } % \end{macrocode} @@ -1502,8 +1580,8 @@ domain,indepVars,oComp) { % \end{macrocode} % Deny use of the traditional decimal point (.) % \begin{macrocode} - if ( reDec.test(UserAns) ) { - eqAppAlert(\noDecPtGerMsg,3); + if ( (!warnDecDeOnly) && (reDec.test(UserAns)) ) { + eqAppAlert(\noDecPtDeMsg,3); return -1; } % \end{macrocode} @@ -1519,13 +1597,13 @@ domain,indepVars,oComp) { % We pass \texttt{UserAnsSave} in case author uses \texttt{priorParse} etc. % \begin{macrocode} var retn=processSpecialParse(oComp.priorParse,UserAnsSave); - if (retn==null) return -1; - } - var reComma=/,/; - if ( reComma.test(UserAns) ) { - eqAppAlert(\eqSyntaxErrorComma,3); - return -1; + if ( (!warnDecDeOnly) && (retn==null) ) return -1; } +% var reComma=/,/; +% if ( reComma.test(UserAns) ) { +% eqAppAlert(\eqSyntaxErrorComma,3); +% return -1; +% } UserAns = ParseInput(UserAns); indepVars = TypeParameters(indepVars); if (!ok2Continue) return null; @@ -1542,6 +1620,59 @@ epsilon,CorrAns,UserAns,comp); % The following functions, which are \texttt{ProcResp}-types, were written for an online % grading system being developed by Drs.\ Bruce Wagner and David Arnold, and Mr. % Jacob Miles-Prystowsky. The descriptions given below were provided by the authors. +% +% \subsubsection{\texttt{useEnNums}} +% \leavevmode +% \IndexOpt{useEnNums}A simple \texttt{ProcResp()} for processing numbers entered in a EN-U format: 1234.56. +% \begin{macrocode} +\@ifcheckedout{useEnNums} +% \end{macrocode} +%\leavevmode\DescribeMacro{\noDecPtEnMsg} A general alert message for responses that +% contain a comma (,). +% \begin{macrocode} + \dlJSStr[noquotes]{\noDecPtEnMsg}{% + "Syntax Error: A comma (,) was found + in your response \"" + UserAns + "\". + Please remove the comma, or this answer will be marked as wrong."} +% \end{macrocode} +% \DescribeMacro{\MsgEni} An alert message when German decimal notation +% is expected. +% \begin{macrocode} + \flJSStr*[noquotes]{\MsgEni}{"English decimal notation is expected, +for example: 12.3456."} +% \end{macrocode} +% \DescribeMacro{\MsgEnii} An alert message when two decimal places are expected. +% \begin{macrocode} + \flJSStr*[noquotes]{\MsgEnii}{"A decimal number is required, +rounded to two decimal places, for example: 12.34"} +% \end{macrocode} +% \DescribeMacro{\numEn}\nmpsep{\darg{\ameta{Msg}}} is a command that supports +% the En decimal notation point (.). For this command, the decimal point (.) +% is optional; that is, an integer response is accepted. \ameta{Msg} is a message +% that appears on error of syntax. +% \begin{macrocode} + \def\numEn#1{{priorParse:\Array(% + \preReqForm(/\rebstr\rechrclass{+-}?\redigit*\\.?% + \redigit*\reestr/,(#1)))}} +% \end{macrocode} +% \DescribeMacro{\rndNumEnReq}\nmpsep{\darg{\ameta{nDec-pl}}\darg{\ameta{Msg}}} +% For numbers that are required to be rounded to \emph{exactly} \ameta{nDec-pl} decimal places. +% \ameta{Msg} is an error message. Decimal point (.) is required. +% \begin{macrocode} + \def\rndNumEnReq#1#2{{priorParse:\Array(% + \preReqForm(/\rebstr\rechrclass{+-}?\redigit*\\.% + \redigit{#1}\reestr/,(#2)))}} +% \end{macrocode} +% \DescribeMacro{\rndNumEnOpt}\nmpsep{\darg{\ameta{nDec-pl}}\darg{\ameta{Msg}}} +% For numbers that are required to be rounded to \emph{at most} \ameta{nDec-pl} decimal places. +% \ameta{Msg} is an error message. Decimal point (.) optional (integer response +% accepted). +% \begin{macrocode} + \def\rndNumEnOpt#1#2{{priorParse:\Array(% at most two decimal places + \preReqForm(/\rebstr\rechrclass{+-}?% + \redigit*\\.?\redigit{0,#1}\reestr/,(#2)))}} +\fi +% \end{macrocode} % \begin{macrocode} \begin{library@holding}{unordered} % \end{macrocode} @@ -1895,7 +2026,7 @@ function ProcPoint(flag,CorrAns,n,epsilon,domain,indepVars,oComp) for (i=0; i<aCorrAns.length; i++) { aCorrAns[i] = ParseInput(aCorrAns[i]); if (!ok2Continue) { - eqAppAlert("Author Syntax error!", 3); + eqAppAlert(\SyntaxErrorAuthor, 3); return null; } aUserAns[i] = ParseInput(aUserAns[i]); @@ -1961,7 +2092,8 @@ function ProcPoint(flag,CorrAns,n,epsilon,domain,indepVars,oComp) %\end{flushleft} % \begin{macrocode} \begin{newsegment}{dljslib: Contrib - Processing Interval Responses} -function ProcRespIntervals(flag,CorrAns,n,epsilon,domain,indepVars,oComp) +function ProcRespIntervals(flag,CorrAns,n,epsilon,domain,% +indepVars,oComp) { ok2Continue = true; if (!ProcessIt) return null; @@ -2341,57 +2473,56 @@ function NoExpAllowed (UserAns) { % \begin{macrocode} function NoTrigAllowed (UserAns) { - UserAns = stripWhiteSpace(UserAns); - if ( !ok2Continue ) return null; - var aTrigfuncs = new Array - ( "acos","asin","atan","cos", "sin", "tan","sec","csc","cot", - "arcsin", "arccos", "arctan" - ); - var re, regexp; - re = /[a-zA-Z]{2,}/g; - aF = UserAns.match(re); - if ( aF != null ) { - for (var i=0; i < aF.length; i++) - { - for(var j=0; j < aTrigfuncs.length; j++) { - if ( aF[i].indexOf(aTrigfuncs[j]) != -1 ) - return eqAppAlert(\NoTrigAllowedErrorMsg,3), null; - } - } - } - return true; + UserAns = stripWhiteSpace(UserAns); + if ( !ok2Continue ) return null; + var aTrigfuncs = new Array + ( "acos","asin","atan","cos", "sin", "tan","sec","csc","cot", + "arcsin", "arccos", "arctan" + ); + var re, regexp; + re = /[a-zA-Z]{2,}/g; + aF = UserAns.match(re); + if ( aF != null ) { + for (var i=0; i < aF.length; i++) { + for(var j=0; j < aTrigfuncs.length; j++) { + if ( aF[i].indexOf(aTrigfuncs[j]) != -1 ) + return eqAppAlert(\NoTrigAllowedErrorMsg,3), null; + } + } + } + return true; } function NoPiAllowed(UserAns) { - UserAns = stripWhiteSpace(UserAns); - if ( !ok2Continue ) return null; - var re=/PI|pi/; - if ( re.test(UserAns) ) - return eqAppAlert(\NoPiAllowedErrorMsg,3), null; - return true; + UserAns = stripWhiteSpace(UserAns); + if ( !ok2Continue ) return null; + var re=/PI|pi/; + if ( re.test(UserAns) ) + return eqAppAlert(\NoPiAllowedErrorMsg,3), null; + return true; } function NoTrigLogAllowed (UserAns) { - UserAns = stripWhiteSpace(UserAns); - if ( !ok2Continue ) return null; - var aTrigfuncs = new Array - ( "acos","asin","atan","cos", "sin", - "tan","sec","csc","cot", "arcsin", "arccos", "arctan", - "logc","log", "ln" - ); - var re, regexp; - re = /[a-zA-Z]{2,}/g; - aF = UserAns.match(re); - if ( aF != null ) { - for (var i=0; i < aF.length; i++) - { - for(var j=0; j < aTrigfuncs.length; j++) { - if ( aF[i].indexOf(aTrigfuncs[j]) != -1 ) - return eqAppAlert(\NoTrigLogAllowedErrorMsg,3), null; - } - } + UserAns = stripWhiteSpace(UserAns); + if ( !ok2Continue ) return null; + var aTrigfuncs = new Array + ( "acos","asin","atan","cos", "sin", + "tan","sec","csc","cot", "arcsin", "arccos", "arctan", + "logc","log", "ln" + ); + var re, regexp; + re = /[a-zA-Z]{2,}/g; + aF = UserAns.match(re); + if ( aF != null ) { + for (var i=0; i < aF.length; i++) + { + for(var j=0; j < aTrigfuncs.length; j++) { + if ( aF[i].indexOf(aTrigfuncs[j]) != -1 ) + return eqAppAlert(\NoTrigLogAllowedErrorMsg,3), null; + } } - return true; + } + return true; } % \end{macrocode} %\changes{v1.9a}{2011/07/15}{Added \texttt{sciNotResp} and \texttt{SciNotResp}} diff --git a/texmf-dist/source/latex/acrotex/eforms.dtx b/texmf-dist/source/latex/acrotex/eforms.dtx index bc21d96c..61e21b17 100644 --- a/texmf-dist/source/latex/acrotex/eforms.dtx +++ b/texmf-dist/source/latex/acrotex/eforms.dtx @@ -4,7 +4,7 @@ %<*copyright> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% eForms package, %% -%% Copyright (C) 2002-2020 D. P. Story %% +%% Copyright (C) 2002-2021 D. P. Story %% %% dpstory@uakron.edu %% %% %% %% This program can redistributed and/or modified under %% @@ -16,7 +16,7 @@ %</copyright> %<package>\NeedsTeXFormat{LaTeX2e} %<package>\ProvidesPackage{eforms} -%<package> [2020/12/14 v2.4.1 Provides general eforms support (dps)] +%<package> [2021/05/10 v2.4.3 Provides general eforms support (dps)] %<*driver> \documentclass{ltxdoc} \usepackage[colorlinks,hyperindex=false]{hyperref}[2012/10/12] @@ -95,18 +95,19 @@ % \textsf{web}; in this case, the options below must explicitly included. % Set the driver dependent code for the |quiz| environments. % -% \changes{v2.2v2.2}{2019/06/12}{Added fields to fields dict, conforming to hyperref} +% \changes{v2.4.3}{2021/05/10}{Changed date for sync with \string\pkg{insdljs}} +% \changes{v2.2v2.2}{2019/06/12}{Added fields to fields dict, conforming to \string\pkg{hyperref}} % \changes{v2.13}{2019/06/10}{Added various fields to the fields dictionary so they % can get appearances in non-conforming PDF viewers.} -% \changes{v2.5o}{2012/06/18}{Added required package \string\textsf{ifpdf}} -% \changes{v2.9m}{2017/09/03}{Added the ifluatex package} +% \changes{v2.5o}{2012/06/18}{Added required package \string\pkg{ifpdf}} +% \changes{v2.9m}{2017/09/03}{Added the \string\pkg{ifluatex} package} % \begin{macrocode} \RequirePackage{ifpdf}[2006/02/20] \RequirePackage{ifxetex}[2006/08/21] \RequirePackage{ifluatex} % \end{macrocode} % The \pkg{calc} package is now required (2014/02/18). -% \changes{v2.6c}{2014/02/18}{Added the \string\textsf{calc} package as required package.} +% \changes{v2.6c}{2014/02/18}{Added the \string\pkg{calc} package as required package.} % \begin{macrocode} \RequirePackage{calc} % \end{macrocode} @@ -131,7 +132,7 @@ } % \end{macrocode} % Set the driver for \texttt{pdftex}\IndexOpt{pdftex} -% \changes{v2.9b}{2016/07/22}{Do not pass pdftex driver to insdljs or hyperref} +% \changes{v2.9b}{2016/07/22}{Do not pass pdftex driver to \string\pkg{insdljs} or \string\pkg{hyperref}} % \begin{macrocode} \DeclareOption{pdftex}{% \def\eq@drivernum{1}\def\eq@driver{pdftex}% @@ -139,7 +140,7 @@ } % \end{macrocode} % Added \textsf{luatex} option -% \changes{v2.9m}{2017/09/03}{Add luatex option} +% \changes{v2.9m}{2017/09/03}{Add \string\opt{luatex} option} % \begin{macrocode} \DeclareOption{luatex}{% \def\eq@drivernum{1}\def\eq@driver{luatex}% @@ -190,7 +191,7 @@ % The \texttt{preview}\IndexOpt{preview} option displays the bounding box of each form field with a frame box. % Useful for laying out field with a dvi previewer. % \changes{v2.5n}{2012/04/30}{Changed \string\cs{ifpreview} to a conditional -% definition; this allows the \string\textsf{spdef} package to control the state +% definition; this allows the \string\pkg{spdef} package to control the state % of \cs{ifpreview}.} % \begin{macrocode} \DeclareOption{preview}{\previewtrue} @@ -211,7 +212,7 @@ % Use\IndexOpt{useui} the \textsf{xkeyval} package to specify the options for the links and % forms, key-values are enclosed in the \cs{ui} command inside the option list. % \changes{v2.0}{2008/03/14} -% { +% {% % Added the \string\texttt{useui} option, which inputs \string\textsf{xkeyval} package, % and defines a user-friendly interface to the option arguments. % } @@ -268,18 +269,15 @@ % To support a variations of \app{dvipdfm}, we change the logic from % \cs{ifxetex} to |\ifnum\eq@drivernum=2\relax|, a driver number of 2 % includes \app{dvipdfm} and all its variants. -% \changes{v2.3.4}{2020/07/05}{Change logic from \string\cs{ifxetex} to -% \string\cs{ifnum}\string\cs{eq@drivernum=2\string\relax}} +% \changes{v2.3.4}{2020/07/05}{Change logic for \string\cs{ifxetex}} % \begin{macrocode} \@ifundefined{ifpdfmarkup}{\newif\ifpdfmarkup}{}\pdfmarkupfalse -\ifpdf\else\ifnum\eq@drivernum=2\relax\else\pdfmarkuptrue\fi\fi +\ifpdf\else\ifnum\eq@drivernum=\tw@\else\pdfmarkuptrue\fi\fi \RequirePackage{hyperref} % \end{macrocode} -% Changed \textsf{hyperref} definitions/parameters to add \texttt{1bp} rather than \texttt{1pt} around a form field -% or link. +% Changed \textsf{hyperref} definitions/parameters to add \texttt{1bp} +% rather than \texttt{1pt} around a form field or link. % \changes{v2.9e}{2016/12/22}{Changed hyperref to add 1bp rather than 1pt} -% \changes{v2.3.4}{2020/07/05}{Change logic from \string\cs{ifxetex} to -% \string\cs{ifnum}\string\cs{eq@drivernum=2\string\relax}} % \begin{macrocode} \ifnum\eq@drivernum=2\relax \else @@ -297,7 +295,7 @@ \RequirePackage{insdljs}[2019/02/11] % incl conv-xkv % \end{macrocode} % \changes{v1.0a}{2006/10/03} -% { +% {% % If \string\pkg{exerquiz} is not loaded, we do an automatic begin and end of Form. % Also, if \string\textsf{exerquiz} is loaded, then we use the driver declared in % \string\pkg{exerquiz}; otherwise, we set the default to 0 @@ -320,11 +318,11 @@ \let\ef@YES=y \let\ef@NO=n \let\ef@One=1 \let\ef@Zero=0 \ifnum\eq@drivername<2\relax -\let\to@usepdfmark\ef@One -\RequirePackage[structure]{taborder}\else -\let\to@usepdfmark\ef@Zero -\RequirePackage{taborder} -\fi + \let\to@usepdfmark\ef@One + \def\reqPkg{\RequirePackage[structure]{taborder}}\else + \let\to@usepdfmark\ef@Zero + \def\reqPkg{\RequirePackage{taborder}}\fi +\reqPkg % \end{macrocode} % \begin{macrocode} %</package> @@ -439,11 +437,25 @@ % For example, expanding |\efsave\x\as\y| (eg, |\let\y\x|), the definition of the macro |\y| % has the same definition as |\x| does. Now |\x| is free to be redefined. Later in the document, % we can say |\efrestore\x\from\y| (eg, |\let\x\y|). Now the -% definition of |\x| has its original definition (at the time when it was saved). +% definition of |\x| has its original definition (at the time when it was saved).\medskip +% +% \noindent The two commands \DescribeMacro\txtRef\cs{txtRef} and \DescribeMacro\labelRef\cs{labelRef} +% return pure text: The first returns the value of \cs{ref} as plain text; similarly, \cs{labelRef} returns +% the true destination name of a reference. +% \changes{v2.4.2}{2021/03/11}{Defined \string\cs{txtRef}, also defined in \string\pkg{exerquiz}; +% moved \string\cs{labelRef} from the \string\textsf{userinterface} section of this DTX.} +% \begin{macrocode} +\def\txtRef#1{\@ifundefined{r@#1} + {??}{\aeb@exiii\@firstoffive\csname r@#1\endcsname}} +\def\labelRef#1{\@ifundefined{r@#1}{Doc-Start} + {\aeb@exiii\@fourthoffive\csname r@#1\endcsname}} +\def\aeb@exiii{\expandafter\expandafter\expandafter} +\def\noexpandiii{\noexpand\noexpand\noexpand} +% \end{macrocode} % \begin{macrocode} %</package> % \end{macrocode} -% \section{\tops{\app}{}{Adobe} Forms Support}\label{formsSupport} +% \section{\tops{\protect\app}{}{Adobe} Forms Support}\label{formsSupport} % \begin{macrocode} %<*package> % \end{macrocode} @@ -1213,7 +1225,7 @@ % \end{macrocode} % \DescribeMacro{\RV} Rich text value %\changes{v2.5l}{2011/01/28}{% -% Wrap the \cs{RV} key in an XHTML \string\texttt{{\string\ltag}body\string\rtag} element, part of adding +% Wrap the \string\cs{RV} key in an XHTML \string\texttt{{\string\ltag}body\string\rtag} element, part of adding % better support for rich text strings for form fields. %} % \begin{macrocode} @@ -1255,7 +1267,7 @@ % we pass the argument through \cs{pdfstringdef} to get the octal encoding, % which is the method hyperref uses. % \changes{v2.7}{2014/07/08}{Removed the use of \string\cs{ifHy@unicode}, now pass all PDF text strings -% through \cs{pdfstringdef}.} +% through \string\cs{pdfstringdef}.} % \changes{v2.8a}{2015/07/12}{Added \string\cs{ef@isunicode} to automatically detect % unicode} % (2015/07/12) Added \cs{ef@isunicode} to automatically detect @@ -1850,7 +1862,7 @@ %multi-line hyperlinks. Recognizable values are \texttt{y} and \texttt{n}. contiguous boxes %are combined by default. There are command versions of \cs{mlfix}, these are %\DescribeMacro{\mlfixOn} and \DescribeMacro{\mlfixOff} -%\changes{v2.9.16}{2018/03/08}{Added \string\cs{mlfix} for multiline links} +%\changes{v2.9.16}{2018/03/08}{Added \string\cs{mlfix} for multi-line links} %\changes{v2.9.19}{2018/03/22}{Added \string\cs{relax} following width dimension % in \string\cs{@eqmlstrut}} % \begin{macrocode} @@ -3028,7 +3040,7 @@ \long\def\g@addto@macrogobble#1#2{\g@addto@macro{#1}{#2}\@gobbleto@@nil} % \end{macrocode} % \changes{v2.8a}{2015/07/15}{New def for \string\cs{passthruCLOpts}, and modified -% \cs{ef@pdfstrCLOpts} and its spawn.} +% \string\cs{ef@pdfstrCLOpts} and its spawn.} % (2015/07/15) New def for \cs{passthruCLOpts}, and modified \cs{ef@pdfstrCLOpts} and its spawn. % \begin{macrocode} \def\passthruCLOpts{*} @@ -3122,7 +3134,7 @@ % \end{macrocode} % \subsubsection{List Box}\label{listbox} % -%\changes{v2.4}{2020/11/28}{Allow \cs{list@@Box} to obey \string\cs{pdfStringsOn}} +%\changes{v2.4}{2020/11/28}{Allow \string\cs{list@@Box} to obey \string\cs{pdfStringsOn}} % % The main list box code that can be used to build list box commands, such as % \cs{listBox}, defined below. Within @@ -3191,7 +3203,7 @@ % \end{macro} % \subsubsection{Combo Box}\label{combobox} % -%\changes{v2.4}{2020/11/28}{Allow \cs{combo@@Box} to obey \string\cs{pdfStringsOn}} +%\changes{v2.4}{2020/11/28}{Allow \string\cs{combo@@Box} to obey \string\cs{pdfStringsOn}} % % Within the optional argument, the following aliases are used: \cs{nameuse} for \cs{@nameuse} % and \cs{tops} for \cs{texorpdfstring}. @@ -4167,12 +4179,8 @@ % we'll define them here as well. % \begin{macrocode} \def\getargs#1#2{\def\aeb@argi{#1}\def\aeb@argii{#2}} -\def\labelRef#1{\@ifundefined{r@#1}{Doc-Start} - {\aeb@exiii\@fourthoffive\csname r@#1\endcsname}} -\def\aeb@exiii{\expandafter\expandafter\expandafter} \newtoks\ef@flagtoks \newtoks\ef@jstoks -\def\noexpandiii{\noexpand\noexpand\noexpand} % \end{macrocode} % % \subsection{The Appearance Tab} diff --git a/texmf-dist/source/latex/acrotex/exerquiz.dtx b/texmf-dist/source/latex/acrotex/exerquiz.dtx index e1adc713..d73c3efd 100644 --- a/texmf-dist/source/latex/acrotex/exerquiz.dtx +++ b/texmf-dist/source/latex/acrotex/exerquiz.dtx @@ -22,7 +22,7 @@ %<randomize>\ProvidesFile{aebrandom.def} %<sumrytbls>\ProvidesFile{aebsumrytbls.def} %<template>\ProvidesFile{template.def} -%<package|driver|aebjs|eqexam|randomize|sumrytbls|template> [2021/02/17 v8.6.4 % +%<package|driver|aebjs|eqexam|randomize|sumrytbls|template> [2021/05/10 v8.7.7 % %<package> Exerquiz: Exercises and Quizzes for LaTeX/PDF package (dps)] %<driver> Exerquiz documentation driver file (dps)] %<aebjs> Exerquiz document level JavaScript (dps)] @@ -47,6 +47,7 @@ %<*driver> \documentclass{ltxdoc} \usepackage[colorlinks,hyperindex=false]{hyperref} +\usepackage{fancyvrb} \gdef\darg#1{\texttt{\char123\relax#1\char125\relax}} \let\env\texttt \let\opt\texttt @@ -55,8 +56,9 @@ \def\nmpsep#1{\hskip-\marginparsep\texttt{#1}} \def\visispace{\symbol{32}} \def\ameta#1{\ensuremath{\langle\textit{\texttt{#1}}\rangle}} -\def\meta#1{\textsl{\texttt{#1}}} +\def\meta#1{\textit{\texttt{#1}}} \def\SUB#1{\ensuremath{{}_{\mbox{\scriptsize\ttfamily#1}}}} +\def\GT{\string>} \pdfstringdefDisableCommands{\let\\\textbackslash} \OnlyDescription % comment out for implementation details \EnableCrossrefs @@ -71,6 +73,7 @@ \begin{document} \let\env\texttt\let\pkg\textsf \let\app\textsf + \let\tops\texorpdfstring \GetFileInfo{exerquiz.sty} \title{Exerquiz: Exercises and Quizzes for \LaTeX/PDF} \author{D. P. Story\\ @@ -100,11 +103,11 @@ %\changes{v8.6.3}{2021/01/31}{Updated documentation, informing users of \string\app{Acrobat DC} that % it is necessary to change their \string\uif{Security (Enhanced)} preferences.} %\changes{v8.2.8}{2018/12/13}{The SOL file is now written entirely when there is no solution option specified} -% (v8.0 dated 2017/08/08) This version introduces multi-letter variables and what I'll term `alternate appearances'. +% (2017/08/08) This version introduces multi-letter variables and what I'll term `alternate appearances'. % \changes{v8.0}{2017/08/08}{Introduce multi-letter variables and alternate appearances. Changes % made are marked by `\texttt{dps17}' throughout the DTX.} % \changes{v7.7k}{2016/04/18}{Minor bug fixes, improved driver recognition} -% \changes{v7.7j}{2016/04/05}{Change in eforms to 2016/04/05 v2.8f} +% \changes{v7.7j}{2016/04/05}{Change in \string\pkg{eforms} to 2016/04/05 v2.8f} % % \section{Introduction} % @@ -118,11 +121,11 @@ % Introduce a number of useful options for \pkg{exerquiz}. % \subsection{Options for paper, solutions, JavaScript and preview} % \begin{macrocode} -% Begin package segment %<*package> \usepackage{keyval} % \end{macrocode} -%\changes{v6.4t}{2012/06/18}{Added ifpdf as a required package} +% Some early required packages. +%\changes{v6.4t}{2012/06/18}{Added \string\pkg{ifpdf} as a required package} %\changes{v8.1a}{2017/09/03}{Added check for luatex} % \begin{macrocode} \RequirePackage{ifpdf}[2006/02/20] @@ -140,21 +143,24 @@ % \begin{macrocode} \DeclareOption{noxcolor}{\def\eq@ColorPackage{color}} % \end{macrocode} -% \leavevmode\IndexOpt{forpaper}\IndexOpt{forcolorpaper}^^A -% Pass the |monochrome| option to the color package +% \leavevmode\IndexOpt{forpaper}^^A +% Pass the \opt{monochrome} option to the color package %\changes{v6.06a}{2007/04/09} %{ -% Added the \texttt{forcolorpaper} option for those using -% \textsf{exerquiz} without \textsf{web}. +% Added the \string\texttt{forcolorpaper} option for those using +% \string\textsf{exerquiz} without \string\textsf{web}. %} % \begin{macrocode} \DeclareOption{forpaper}{% \eqforpapertrue\PassOptionsToPackage{monochrome}{\eq@ColorPackage} - \AtBeginDocument{\ifnum\eq@drivernum=4 \else\AllowPeeking\fi} -} -\DeclareOption{forcolorpaper}{\eqforpapertrue % for print - \AtBeginDocument{\ifnum\eq@drivernum=4 \else\AllowPeeking\fi} -} + \AtBeginDocument{\AllowPeeking}} +% \end{macrocode} +% \leavevmode\IndexOpt{forcolorpaper}^^A +% The \opt{forcolorpaper} is the same as \opt{forpaper}, but does not +% pass the \pkg{monochrome} option to the color package. +% \begin{macrocode} +\DeclareOption{forcolorpaper}{\eqforpapertrue + \AtBeginDocument{\AllowPeeking}} % \end{macrocode} % \leavevmode\IndexOpt{preview}^^A % With this option, the bounding boxes of all form fields appear in the @@ -193,7 +199,7 @@ % \begin{macrocode} \DeclareOption{nohiddensolutions}{\eq@globalshowsolutionstrue} \DeclareOption{noHiddensolutions}% - {\eq@globalshowsolutionstrue\AtBeginDocument{\def\Hidesymbol{h}}} + {\eq@globalshowsolutionstrue\AtBeginDocument{\def\Hidesymbol{h}}} % \end{macrocode} % \leavevmode\IndexOpt{solutionsafter}^^A % Solutions will appear after the statement of the exercise. @@ -202,10 +208,10 @@ % \end{macrocode} % \leavevmode\IndexOpt{solutionsonly}^^A % Here is a highly specialized option, put in at the request of a former friend. -%\changes{v6.2f}{2007/12/21}{Added a solutionsonly option} +%\changes{v6.2f}{2007/12/21}{Added a \string\opt{solutionsonly} option} % \begin{macrocode} \DeclareOption{solutionsonly}{\solutionsonlytrue\answerkeytrue - \therearesolutionstrue\AtEndOfPackage{\let\exerSolnsHeadnToc\relax}} + \therearesolutionstrue\AtEndOfPackage{\let\exerSolnsHeadnToc\relax}} % \end{macrocode} % \changes{v8.1k}{2018/02/04}{Added \string\cs{ifanswerkey} switch} % \begin{macrocode} @@ -218,11 +224,11 @@ % is used. % \begin{macrocode} \DeclareOption{contsolns}{\AtEndOfPackage{\InputIfFileExists - {contsolns.def}{\contsolnsInputMsg}{\contsolnsErrorMsg}}} + {contsolns.def}{\contsolnsInputMsg}{\contsolnsErrorMsg}}} \def\contsolnsInputMsg{\PackageInfo{exerquiz}{contsolns option, - inputting file contsolns.def}} + inputting file contsolns.def}} \def\contsolnsErrorMsg{\PackageWarning{exerquiz}{contsolns option, - cannot find file contsolns.def}} + cannot find file contsolns.def}} % \end{macrocode} % \leavevmode\IndexOpt{nocorrections}^^A % The code for correcting the |quiz| environment is @@ -247,11 +253,11 @@ % \textsf{eqexam}, but can be used in \textsf{exerquiz}. The switch % \cs{ifvspacewithsolns} is defined in \textsf{eqexam}, and we only % define it here if \textsf{eqexam} is not loaded. -% \changes{v6.3x}{2011/04/05}{Added \texttt{vspacewithsolns}} +% \changes{v6.3x}{2011/04/05}{Added \string\opt{vspacewithsolns}} % \begin{macrocode} \@ifundefined{ifvspacewithsolns}{% - \DeclareOption{vspacewithsolns}{\vspacewithsolnstrue} - \newif\ifvspacewithsolns\vspacewithsolnsfalse + \DeclareOption{vspacewithsolns}{\vspacewithsolnstrue} + \newif\ifvspacewithsolns\vspacewithsolnsfalse }{} % \end{macrocode} % \changes{v8.1m}{2018/02/09}{\string\cs{ifdisplayworkarea} conditionally defined} @@ -266,17 +272,23 @@ % \leavevmode\IndexOpt{nodljs}^^A % An option for excluding all DLJS from the document. Useful with the % \texttt{forpaper} option, or a document destined to be printed. Pass -% on to insdljs package. +% on to \pkg{insdljs} package. % \begin{macrocode} \DeclareOption{nodljs}{\PassOptionsToPackage{nodljs}{insdljs}% - \AtEndOfPackage{\let\importdljs\eq@YES}} + \AtEndOfPackage{\let\importdljs\eq@YES}} % \end{macrocode} % \leavevmode\IndexOpt{execAfter}^^A -% Execute any JS defined within the \texttt{execJS} environment. Works only for +% Execute any JS defined within the \env{execJS} environment. Works only for % authors using Acrobat 5.0 or Acrobat Approval. % \begin{macrocode} \DeclareOption{execJS}{\PassOptionsToPackage{execJS}{insdljs}} % \end{macrocode} +% \leavevmode\IndexOpt{usealtadobe}^^A +% Pass the \opt{usealtadobe} to \pkg{insdljs} as a convenience option. +% \changes{v8.7.7}{2021/05/10}{Pass \string\opt{usealtadobe} option to \string\pkg{insdljs}} +% \begin{macrocode} +\DeclareOption{usealtadobe}{\PassOptionsToPackage{usealtadobe}{insdljs}} +% \end{macrocode} % \leavevmode\IndexOpt{exercisesonly}^^A % If the document author wants only to create a series of exercises, no quizzes, there is no % need for the Document-level JavaScript. So, we have a couple of convenience options. @@ -296,26 +308,26 @@ % \begin{macrocode} \DeclareOption{allowrandomize}{\AtEndOfPackage{\inputRandomizeChoices}} \def\inputRandomizeChoices{\InputIfFileExists{aebrandom.def} - {\PackageInfo{exerquiz}{inputting aebrandom.def}} - {cannot find aebrandom.def}} + {\PackageInfo{exerquiz}{inputting aebrandom.def}} + {cannot find aebrandom.def}} % \end{macrocode} % \leavevmode\IndexOpt{usesumrytbls}^^A % The declare the use of summary tables % \begin{macrocode} \newif \ifusesumrytbls \usesumrytblsfalse \DeclareOption{usesumrytbls}{\usesumrytblstrue - \def\inputSumryTblCode{\InputIfFileExists{aebsumrytbls.def} - {\PackageInfo{exerquiz}{inputting aebsumrytbls.def}}% - {cannot find aebsumrytbls.def}}} + \def\inputSumryTblCode{\InputIfFileExists{aebsumrytbls.def} + {\PackageInfo{exerquiz}{inputting aebsumrytbls.def}}% + {cannot find aebsumrytbls.def}}} \let\inputSumryTblCode\relax % \end{macrocode} % The \IndexOpt{usemcfi}\texttt{usemcfi} option inputs special code for creating a MC/math fill-in question, a type % of question suggested to me by Stefka K.\ of Bulgaria. % \begin{macrocode} \DeclareOption{usemcfi}{% - \def\inputMCFICode{\InputIfFileExists{usemcfi.def} - {\PackageInfo{exerquiz}{inputting usemcfi.def}}% - {cannot find usemcfi.def}}} + \def\inputMCFICode{\InputIfFileExists{usemcfi.def} + {\PackageInfo{exerquiz}{inputting usemcfi.def}}% + {cannot find usemcfi.def}}} \let\inputMCFICode\relax % \end{macrocode} % \changes{v7.7o}{2016/07/08}{Added switch \string\cs{ifwithinMCFI}} @@ -324,7 +336,17 @@ % \begin{macrocode} \newif\ifwithinMCFI\withinMCFIfalse % \end{macrocode} -% +% The \IndexOpt{userbmintrvl}\opt{userbmintrvl} option defines \cs{rbmIntrvl} command, which +% is a special \cs{RespBoxMath} command were some of the parameters are set by an +% interval. Refer to Section~\ref{ss:rbmi} for details. +% \changes{v8.7}{2021/04/24}{Added the option \string\opt{userbmintrvl}} +% \begin{macrocode} +\DeclareOption{userbmintrvl}{% + \def\inputRBMICode{\InputIfFileExists{rbmintrvl.def} + {\PackageInfo{exerquiz}{Inputting rbmintrvl.def}}% + {cannot find rbmintrvl.def}}} +\let\inputRBMICode\relax +% \end{macrocode} % \subsection{Driver Options} % The \textsf{web} package passes these driver options to \textsf{exerquiz}. % These options are needed is \textsf{exerquiz} is used without @@ -334,12 +356,12 @@ % \begin{macrocode} % \def\eq@drivernum{5} % 5 = no choice \DeclareOption{dvipsone}{% - \def\eq@drivernum{0}\def\eq@driver{dvipsone}% - \PassOptionsToPackage{dvipsone}{eforms} + \def\eq@drivernum{0}\def\eq@driver{dvipsone} + \PassOptionsToPackage{dvipsone}{eforms} } \DeclareOption{dvips}{% - \def\eq@drivernum{0}\def\eq@driver{dvips}% - \PassOptionsToPackage{dvips}{eforms} + \def\eq@drivernum{0}\def\eq@driver{dvips} + \PassOptionsToPackage{dvips}{eforms} } \DeclareOption{pdftex}{% \def\eq@drivernum{1}\def\eq@driver{pdftex}% @@ -351,7 +373,7 @@ %\changes{v8.1a}{2017/09/03}{Added a \string\texttt{luatex} option} % \begin{macrocode} \DeclareOption{luatex}{% - \def\eq@drivernum{1}\def\eq@driver{luatex}% + \def\eq@drivernum{1}\def\eq@driver{luatex} \PassOptionsToPackage{luatex}{\eq@ColorPackage} \PassOptionsToPackage{luatex}{eforms} } @@ -361,49 +383,51 @@ % environments. % \begin{macrocode} \DeclareOption{dvipdfm}{% - \def\eq@drivernum{2}\def\eq@driver{dvipdfm}% - \PassOptionsToPackage{dvipdfm}{\eq@ColorPackage}% + \def\eq@drivernum{2}\def\eq@driver{dvipdfm} + \PassOptionsToPackage{dvipdfm}{\eq@ColorPackage} \PassOptionsToPackage{dvipdfm}{eforms}% } \DeclareOption{dvipdfmx}{% - \def\eq@drivernum{2}\def\eq@driver{dvipdfmx}% - \PassOptionsToPackage{dvipdfmx}{\eq@ColorPackage}% - \PassOptionsToPackage{dvipdfmx}{eforms}% + \def\eq@drivernum{2}\def\eq@driver{dvipdfmx} + \PassOptionsToPackage{dvipdfmx}{\eq@ColorPackage} + \PassOptionsToPackage{dvipdfmx}{eforms} } \DeclareOption{xetex}{% - \def\eq@drivernum{2}\def\eq@driver{xetex}% + \def\eq@drivernum{2}\def\eq@driver{xetex} \PassOptionsToPackage{xetex}{\eq@ColorPackage} - \PassOptionsToPackage{xetex}{eforms}% + \PassOptionsToPackage{xetex}{eforms} } % \end{macrocode} % \leavevmode\IndexOpt{textures}^^A % This option, and testing are due to Ross Moore 3/6/02 % \begin{macrocode} -\DeclareOption{textures}{\def\eq@drivernum{3}% - \def\eq@driver{textures}% - \PassOptionsToPackage{textures}{\eq@ColorPackage}% - \PassOptionsToPackage{textures}{eforms}% +\DeclareOption{textures}{\def\eq@drivernum{3} + \def\eq@driver{textures} + \PassOptionsToPackage{textures}{\eq@ColorPackage} + \PassOptionsToPackage{textures}{eforms} } % \end{macrocode} % \leavevmode\IndexOpt{dviwindo}^^A % Set \cmd{\eq@noformstrue}, this inserts an \cmd{\endinput} just after -% the end of the |exercise| environment. No quizzes for +% the end of the \env{exercise} environment. No quizzes for % \texttt{dviwindo}. % \begin{macrocode} -\DeclareOption{dviwindo}{\def\eq@drivernum{4}\def\eq@driver{dviwindo}% - \eq@noformstrue\PassOptionsToPackage{nodljs}{insdljs}} +\DeclareOption{dviwindo}{\def\eq@drivernum{4}\def\eq@driver{dviwindo} + \eq@noformstrue\PassOptionsToPackage{nodljs}{insdljs}} % \end{macrocode} -% If no driver is passed to \textsf{exerquiz}, assume it is -% dvipsone or dvips---\textsf{hyperref} defines the specials. +% If no driver is passed to \pkg{exerquiz}, assume it is +% dvipsone or dvips---\pkg{hyperref} defines the specials. % Default driver dvipsone/dvips -% \def\eq@drivernum{5} -% \def\eq@driver{dvipsone/dvips} -% \def\eq@driver{no driver specified} +% \begin{macrocode} +\def\eq@drivernum{5} +\def\eq@driver{dvipsone/dvips} +\def\eq@driver@nodriver{no driver specified} +% \end{macrocode} % \leavevmode\IndexOpt{unicode}^^A % Passes the unicode option to \textsf{hyperref}. % \changes{v6.3}{2008/03/19} % { -% Added the \texttt{unicode} option, which is passed to hyperref. +% Added the \string\opt{unicode} option, which is passed to \string\pkg{hyperref}. % } % \begin{macrocode} \DeclareOption{unicode}{\PassOptionsToPackage{unicode}{hyperref}} @@ -413,7 +437,7 @@ % the key-value pairs \textsl{\'{a} la xkeyval} can be used. % \changes{v6.3}{2008/03/19} % { -% Added the \texttt{useui} option, which is passed to eforms. +% Added the \string\opt{useui} option, which is passed to eforms. % } % \begin{macrocode} \DeclareOption{useui}{\PassOptionsToPackage{useui}{eforms}} @@ -611,7 +635,7 @@ \@ifundefined{if@eqalignfilllinestoleft} {\newif\if@eqalignfilllinestoleft\@eqalignfilllinestoleftfalse}{} % \end{macrocode} -% \changes{v6.3z}{2011/04/28}{Created a switch \cs{ifkeepdeclaredvspacing}, +% \changes{v6.3z}{2011/04/28}{Created a switch \string\cs{ifkeepdeclaredvspacing}, % used primarily by \textsf{eqexam}} % (4/28/11) A switch to control whether the declared vertical space % for the \texttt{solution} environment is preserved during the \texttt{answerkey} @@ -755,9 +779,9 @@ % so we need to load in the AcroForm Dictionary---unless the % \texttt{dviwindo} (\cmd{\eq@noformstrue}) option is requested. %\changes{v6.3y}{2011/04/23}{% -% As per Heiko's suggestion, I've change the \texttt{Form} environment +% As per Heiko's suggestion, I've change the \string\env{Form} environment % no longer creates a grouping. This was causing problems with -% the \textsf{atveryend} package. +% the \string\pkg{atveryend} package. %} % \begin{macrocode} \AtBeginDocument{\ifeq@noforms\else\Form\fi} @@ -804,7 +828,7 @@ \ProcessOptions % \end{macrocode} % Input required packages. -% \changes{v7.03}{2015/03/02}{Added the \texttt{array} package, mostly +% \changes{v7.03}{2015/03/02}{Added the \string\pkg{array} package, mostly % for use in the tabular setup of parts in tabular mode.} % \begin{macrocode} \RequirePackage{array} @@ -824,7 +848,12 @@ \RequirePackage{verbatim} \RequirePackage{hyperref} \RequirePackage{amssymb}% used for return symbols -\RequirePackage{eforms}[2019/10/23] +% \end{macrocode} +% (2021/05/10) Newer version of \pkg{eforms} required, as this package uses +% \cs{dl@EForAF4}, which is defined by \pkg{insdljs} of the same date. +% \changes{v8.7.7}{2021/05/10}{Now require \string\pkg{eforms} dated 2021/05/10} +% \begin{macrocode} +\RequirePackage{eforms}[2021/05/10] \dlSetPkgInfo % \end{macrocode} % \begin{macrocode} @@ -839,7 +868,7 @@ }{} % \end{macrocode} % \begin{macrocode} -\edef\eq@restoreCats{% dps17 +\edef\eq@restoreCats{% \catcode`\noexpand\"=\the\catcode`\"\relax \catcode`\noexpand\'=\the\catcode`\'\relax \catcode`\noexpand\,=\the\catcode`\,\relax @@ -860,7 +889,7 @@ {\def\fleqnOn{\@fleqntrue}\def\fleqnOff{\@fleqnfalse}} % \end{macrocode} % \changes{v7.7o}{2016/07/08}{Added Boolean \string\cs{if@inclkey} in support of the -% \string\textsf{eq2db} package} +% \string\pkg{eq2db} package} % \begin{macrocode} \@ifundefined{if@inclkey}{\newif\if@inclkey\@inclkeytrue}{} %</package> @@ -959,9 +988,9 @@ % not change the default value. %\changes{v6.05g}{2007/01/28} %{ -% Added to commands for use in exerquiz or in \textsf{eqexam}. They are -% \cs{renameSolnAfterTo} for conveniently changing the solution -% after label, and \cs{resetSolnAfterToDefault} for resetting +% Added to commands for use in exerquiz or in \string\pkg{eqexam}. They are +% \string\cs{renameSolnAfterTo} for conveniently changing the solution +% after label, and \string\cs{resetSolnAfterToDefault} for resetting % back to the default. %} % \begin{macrocode} @@ -1324,7 +1353,8 @@ \ifOKToWriteExamData \set@display@protect \immediate\write\ex@solns{#1}\set@typeset@protect - \fi\fi}% + \fi\fi +} \ifsolutionsonly \InputIfFileExists{\jobname_xdefs.cut}{% \typeout{^^JExerquiz|Eqexam: Reading \jobname_xdefs.cut^^J}} @@ -1363,13 +1393,14 @@ % to close off the conditional. Where, \ameta{wrt-cmd} is either \cs{writeToSolnFile} (or \cs{writeToExSolns}), or % \cs{writeToQzSolns}. % For example, -%\begin{verbatim} -% \bHideSolns\writeToSolnFile % for eqexam -% \begin{exam}{test} -% ... -% \end{exam} -% \eHideSolns\writeToSolnFile -%\end{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={!()},codes={\catcode`\%=9}] +%\bHideSolns\writeToSolnFile % for eqexam +%\begin{exam}{test} +%... +%\end{exam} +%\eHideSolns\writeToSolnFile +%\end{Verbatim} %Now this exam has no footprint within the solution file. % \begin{macrocode} \@ifundefined{ifOKToWriteExamData}{\newif\ifOKToWriteExamData @@ -1393,8 +1424,9 @@ % use of \cs{count0}/\cs{count\cs{z@}}, possibly not used within a group. As a fix, % replaced this usage with the counter \cs{eqtmpcnta}. % \changes{v8.5.7}{2020/01/01}{added public counter \string\cs{eqtmpcnta}} -% \changes{v8.5.8}{2020/01/01}{Replaced \string\cs{count\cs{z@}} and \cs{count0} with \string\cs{eqtmpcnta}, -% this fixed the page number leakage problem} +% \changes{v8.5.8}{2020/01/01}{Replaced \string\cs{count\string\cs{z@}} and +% \string\cs{count0} with \string\cs{eqtmpcnta}, this fixed the page number +% leakage problem} % \begin{macrocode} \newcount\eqtmpcnta %</package|eqexam> @@ -1445,11 +1477,12 @@ % (2017/01/11) Added \DescribeMacro{\numberParts}\cs{numberParts} to change how this counter is displayed % as a number. The default is \DescribeMacro{\alphaParts}\cs{alphaParts} to display the \texttt{partno} % counter as a letter. -%\begin{verbatim} -% \renewcommand{\partnoFmt}{\arabic} -% \setPartsWidth{(00)} -% \partsformat{\makebox[\widthOfParts][c]{(\hfil\thepartno\hfil)}} -%\end{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={!()},codes={\catcode`\%=9}] +%\renewcommand{\partnoFmt}{\arabic} +%\setPartsWidth{(00)} +%\partsformat{\makebox[\widthOfParts][c]{(\hfil\thepartno\hfil)}} +%\end{Verbatim} % With this code, the items in the \texttt{parts} environment are numbered. % \changes{v7.8d}{2017/01/11}{Added \string\cs{partnoFmt} to change how this counter is displayed} % \begin{macrocode} @@ -1562,7 +1595,7 @@ \newcommand\belowexsolnskip{\protect\medskip} %\let\eqafterexersolnskip\belowexsolnskip % \end{macrocode} -% \changes{v7.4}{2015/03/23}{added \cmd\removelastparskip} +% \changes{v7.4}{2015/03/23}{added \string\cs{removelastparskip}} % \DescribeMacro\removelastparskip removes last \cmd\parskip, as needed. % \begin{macrocode} \def\removelastparskip{\ifdim\parskip>0pt\vskip-\parskip\fi} @@ -1576,8 +1609,8 @@ % has been used % \changes{v6.05a}{2006/05/08} % { -% Changed \cs{nolinkcolor} into a text fill-in. Now, the command \cs{nolinkcolor} -% fills in \cs{@nolinkcolor}, which holds the named color. +% Changed \string\cs{nolinkcolor} into a text fill-in. Now, the command \string\cs{nolinkcolor} +% fills in \string\cs{@nolinkcolor}, which holds the named color. % } % \begin{macrocode} \newcommand{\nolinkcolor}[1]{\def\@nolinkcolor{#1}} @@ -1591,22 +1624,25 @@ % links connect the statement of the exercise with its solution. % %\smallskip\noindent\textbf{Basic usage} -%\begin{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={!()},codes={\catcode`\%=9}] %\begin{exercise} %The exercise question is posed. %\begin{solution} %The solution to exercise goes here. %\end{solution} %\end{exercise} -%\end{verbatim} +%\end{Verbatim} % These environments should be nested as illustrated above. % % The \texttt{exercise} environment has three optional arguments. The syntax % for an exercise without parts is\dots -%\begin{verbatim} -% \begin{exercise}[<ctr>][h|H] ...\end{exercise} -%\end{verbatim}% -% +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={!()},codes={\catcode`\%=9}] +%\begin{exercise}[!ameta(ctr)][h|H] +%... +%\end{exercise} +%\end{Verbatim} % (1) The value of this first optional argument, \texttt{<ctr>}, is a counter. % You can use the \texttt{exercise} % environment then to create other environments with their own @@ -1622,11 +1658,11 @@ % % The \texttt{exercise} environment has three optional arguments. The syntax % for an exercise with parts is\dots -%\begin{verbatim} -% \begin{exercise}[<ctr>]* ...\end{exercise} -% \begin{exercise*}[<ctr>] ...\end{exercise*} -%\end{verbatim}% -% +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={!()},codes={\catcode`\%=9}] +%\begin{exercise}[!ameta(ctr)]* ...\end{exercise} +%\begin{exercise*}[!ameta(ctr)] ...\end{exercise*} +%\end{Verbatim} % (1) The value of this first optional argument, \texttt{<ctr>}, is a counter. % You can use the \texttt{exercise} % environment then to create other environments with their own @@ -1651,13 +1687,14 @@ % in an external document. The \cs{exerSolnsInExtFile} command lets you specify an external file name. % Just use the \textit{basename}, hyperref will add the extension. If an external file is specified, all % solution links are changed to links between documents. Usage: -%\begin{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={!()},codes={\catcode`\%=9}] %\exerSolnsInExtFile{myExSonls} -%\end{verbatim} +%\end{Verbatim} % \begin{macrocode} \newcommand{\exerSolnsInExtFile}[2][] - {\let\exerSolns@ExtFile\eq@YES\gdef\eq@exerSolns@fileName{#2}% - \gdef\exerSolns@ReturnPath{#1}} + {\let\exerSolns@ExtFile\eq@YES\gdef\eq@exerSolns@fileName{#2}% + \gdef\exerSolns@ReturnPath{#1}} \let\exerSolns@ExtFile\eq@NO \def\exerSolns@ReturnPath{} %</package> @@ -1753,16 +1790,17 @@ % The \env{cq} environment is \cs{let} to the \env{cq@CQ} environment at the beginning of % the \env{exercise} environment, \env{cq@CQ} begin the internal name of the environment. % \par\medskip\noindent\textbf{Example} -%\begin{verbatim} -% \begin{exercise} -% \begin{cq} -% This is the question -% \end{cq} -% \begin{solution} -% This is its solution -% \end{solution} -% \end{exercise} -%\end{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={!()},codes={\catcode`\%=9}] +%\begin{exercise} +%\begin{cq} +%!quad(This is the question) +%\end{cq} +%\begin{solution} +%!quad(This is the question) +%\end{solution} +%\end{exercise} +%\end{Verbatim} % \begin{macrocode} \let\cq@star\eq@NO % \end{macrocode} @@ -1877,7 +1915,8 @@ % formatting after the copied question; in the default definition, we skip a \cs{medskip} and do a \cs{indent}. % Trailing the string \cs{cqSStr}, the internal command defined by \cs{declCQSolnStr}, is a space and % an \cs{ignorespaces}. Use \cs{writeToExSolns} to make local changes, for example, -%\begin{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={!()},codes={\catcode`\%=9}] %... %\end{exercise} % Changed the string from Solution to Answer, do this prior to the @@ -1886,7 +1925,7 @@ % %\begin{exercise*} %... -%\end{verbatim} +%\end{Verbatim} %Best placed between exercises. % \begin{macrocode} \newcommand\declCQPre[1]{\def\cq@Pre{#1}} @@ -1907,7 +1946,7 @@ % \end{macrocode} % Inform the system that the definition of \cs{eqterminex} is changing. This to prevent % writing the same line multiple times. -% \changes{v8.2.8}{2018/12/13}{write \cs{declareterminex} only if not solutionsafter} +% \changes{v8.2.8}{2018/12/13}{write \string\cs{declareterminex} only if not solutionsafter} % \begin{macrocode} \global\terminexchangedtrue % dps cq \ifeq@solutionsafter\else @@ -1924,7 +1963,7 @@ % \end{macrocode} % \cs{restoreNormalSolns}\DescribeMacro{\restoreNormalSolns} restores \cs{eqterminex} to its % default definition. It is place between exercises. -% \changes{v8.2.8}{2018/12/13}{write \cs{declareterminex} only if not solutionsafter} +% \changes{v8.2.8}{2018/12/13}{write \string\cs{declareterminex} only if not \string\opt{solutionsafter}} % \begin{macrocode} \newcommand\restoreNormalSolns{\ifeq@solutionsafter\else \writeT@ExSolns{\protect\decleqterminex{\protect @@ -2016,7 +2055,7 @@ % \begin{macrocode} \newif\ifeq@exerciseheading \eq@exerciseheadingtrue % \end{macrocode} -% \changes{v6.7q}{2013/12/15}{Added this hook for use by \textsf{contsolns.dtx}} +% \changes{v6.7q}{2013/12/15}{Added this hook for use by \string\textsf{contsolns.dtx}} % \changes{v8.5.10}{2020/03/14}{Added \string\cs{priorexlabelheader} to support \string\pkg{eqexam}} % \begin{macrocode} \let\prior@exerSolnHeaderHook\@empty @@ -2040,22 +2079,16 @@ % package should be loaded after \textsf{eqexam} if the two are to be used % together, preferably by the \texttt{links} or \texttt{online} options of \textsf{eqexam}. % \begin{macrocode} -%\newif\iffirstitem \let\solnItemMngt\relax -%\def\eqeSolnItemMngt{\iffirstitem\global\firstitemfalse -% \let\eqe@next\@empty\else\let\eqe@next\item\fi\eqe@next\relax} -%\@ifpackageloaded{eqexam}{\let\solnItemMngt\eqeSolnItemMngt} -% {\let\solnItemMngt\relax} % \end{macrocode} % \end{macro} % \DescribeMacro{\eqEXt}These two mark the beginning and end of solution to an exercise. \cs{eqEXt} is % set up to have two required arguments, usually both empty. The arguments are % used for filtering. The first might be a number, so we can filter out even numbered % exercises from odd ones. The second one is a keyword, we can filter by keyword. -%\changes{v6.7}{2013/04/07}{Changing \cs{eqEXt} so that it has two +%\changes{v6.7}{2013/04/07}{Changing \string\cs{eqEXt} so that it has two %required arguments} % \begin{macrocode} -%\let\eqEXt\@gobble \let\eqEXt\@gobbletwo \let\endeqEXt\relax % \end{macrocode} @@ -2067,15 +2100,16 @@ \let\eqFilterArg\@empty % \end{macrocode} % The format of the solutions to exercises as they appear in the SOL file is, -%\begin{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={!()},codes={\catcode`\%=9}] %\eqEXt{\eqExtArg}{\eqFilterArg}\exerSolnHeader -% {\exsecrunhead}{ex.1}{\textbf{Exercise\ 1.}}\relax -% ... -% <solution content> -% ... +%!quad{\exsecrunhead}{ex.1}{\textbf{Exercise\ 1.}}\relax +%!quad... +%!quad!ameta(solution content) +%!quad... %\ReturnTo{qex.1}{\hbox {$\square $}}\endeqEXt\par\medskip -%\end{verbatim} -% \changes{v6.7a}{2013/05/03}{Change name of \cs{eq@writeexheader} to \cs{eqExerSolnHeader}} +%\end{Verbatim} +% \changes{v6.7a}{2013/05/03}{Change name of \string\cs{eq@writeexheader} to \string\cs{eqExerSolnHeader}} % \begin{macrocode} \let\eqExerSolnHeader\@empty % \end{macrocode} @@ -2084,7 +2118,7 @@ % \begin{macrocode} \let\solutionparshape\@empty % \end{macrocode} -%\changes{v7.2}{2015/03/22}{added \cs{setPrbSolnAftrIndent}} +%\changes{v7.2}{2015/03/22}{added \string\cs{setPrbSolnAftrIndent}} % \DescribeMacro{\setPrbSolnAftrIndent}\cmd{\setPrbSolnAftrIndent} sets the amount of indent % for the statement of problem and the solution-after solution. The command saves its argument % in \cs{eq@pslnaindnt} (default \texttt{0pt}) and sets the hook @@ -2094,11 +2128,11 @@ \def\eq@pslnaindnt{0pt} \let\eq@setPrbSolnAftrIndnt\relax \newcommand{\setPrbSolnAftrIndent}[1]{\ifdim#1=0pt - \def\eq@pslnaindnt{0pt}\let\eq@setPrbSolnAftrIndnt\relax\else - \edef\eq@pslnaindnt{#1}\edef\eq@setPrbSolnAftrIndnt{\expandafter - \noexpand\expandafter\parindent#1\noexpand\relax}\fi} + \def\eq@pslnaindnt{0pt}\let\eq@setPrbSolnAftrIndnt\relax\else + \edef\eq@pslnaindnt{#1}\edef\eq@setPrbSolnAftrIndnt{\expandafter + \noexpand\expandafter\parindent#1\noexpand\relax}\fi} % \end{macrocode} -%\changes{v7.2}{2015/03/22}{added \cs{restorejustify}} +%\changes{v7.2}{2015/03/22}{added \string\cs{restorejustify}} %The command \DescribeMacro\restorejustify\cmd{\restorejustify} is designed %for use in the \texttt{solution} environment of an \cs{item} within the %\texttt{parts} environment in \texttt{tabular} mode. By default, @@ -2183,7 +2217,7 @@ \def\eqterminexDEF{\relax\ignorespaces} \decleqterminex{\eqterminexDEF} % \end{macrocode} -%\changes{v6.7}{2013/04/07}{Inserted another argument into \cs{eqEXt}} +%\changes{v6.7}{2013/04/07}{Inserted another argument into \string\cs{eqEXt}} % (2013/04/07) Added another argument into \cs{eqEXt}, used for filtering.\par\medskip % \noindent % (2018/02/13) When solutions are written to the SOL file, they are not normally in a group. @@ -2210,7 +2244,7 @@ \immediate\write\verbatim@out{\eqExerSolnHeaderSngl}% \set@typeset@protect\fi\fi} % \end{macrocode} -%\changes{v6.7}{2013/04/07}{Inserted another argument into \cs{eqEXt}} +%\changes{v6.7}{2013/04/07}{Inserted another argument into \string\cs{eqEXt}} % Added another argument into \cs{eqEXt}, used for filtering. % \begin{macrocode} \def\eqExerSolnHeaderList{% @@ -2248,7 +2282,7 @@ % \cs{noSolnOpt} turns off the check for the option argument % of the \texttt{solution} environment for the \texttt{exercise} % environment. Designed for use with \textsf{eqexam}. -% \changes{v6.4v}{2012/07/27}{Added \cs{ckSolnOpt} and \cs{noSolnOpt} +% \changes{v6.4v}{2012/07/27}{Added \string\cs{ckSolnOpt} and \string\cs{noSolnOpt} % to switch on and off checking for the optional vertical space in the % \texttt{solution} environment.} % \begin{macrocode} @@ -2339,7 +2373,7 @@ }\expandafter\leavevspace \fi} % \end{macrocode} -% \changes{v6.8g}{2014/04/08}{Added key-val here for \textsf{eqexam}.} +% \changes{v6.8g}{2014/04/08}{Added key-val here for \string\pkg{eqexam}.} % New option for the \texttt{solution} environment, \IndexKey{nLines}\texttt{nLines}. % \begin{macrocode} \define@key{soln@keys}{nLines}[]{\def\soln@keys@nLines{#1}} @@ -2383,7 +2417,7 @@ \restoreNormalSolns\fi\fi % dps cq \global\cqIsActivefalse % \end{macrocode} -% \changes{v6.3z}{2011/04/28}{Added definition of \cs{sameVspace} for the cases +% \changes{v6.3z}{2011/04/28}{Added definition of \string\cs{sameVspace} for the cases % where there is no vertical space specified.} % Is the argument \cs{null}? If yes, same as \texttt{0pt}. % \begin{macrocode} @@ -2391,7 +2425,7 @@ \ifx\eq@argi\@empty\gdef\sameVspace{0pt}\else \ifx\eq@argi\eq@null\gdef\sameVspace{0pt}\else % \end{macrocode} -% \changes{v6.8g}{2014/04/08}{Added key-val here for \textsf{eqexam}.} +% \changes{v6.8g}{2014/04/08}{Added key-val here for \string\pkg{eqexam}.} % Now, if the optional argument is non-null, we must discern the argument: % is it a vertical space or a key-value? % \begin{macrocode} @@ -2456,8 +2490,8 @@ } % \end{macrocode} %\changes{v6.4b}{2011/06/30}{% -% Save the definitions of \cs{comment} and \cs{endcomment}. For some reason, -% yet to be determined, there are problems when using the \texttt{fortextbook} +% Save the definitions of \string\cs{comment} and \string\cs{endcomment}. For some reason, +% yet to be determined, there are problems when using the \string\opt{fortextbook} % option when hiding solutions. %} %\changes{v8.2.9}{2019/02/11}{\string\cs{eqSavedComment}\string\cs{dlcomment}, \string\cs{dlcomment}\space @@ -2466,7 +2500,7 @@ \let\eqSavedComment\dlcomment \let\endeqSavedComment\enddlcomment % \end{macrocode} -%\changes{v7.4}{2015/03/23}{added \cs{setTabulrSolnEnv}} +%\changes{v7.4}{2015/03/23}{added \string\cs{setTabulrSolnEnv}} % \begin{macrocode} \def\setTabulrSolnEnv{% \@ifundefined{@listii@SAVE}{\global\let\@listii@SAVE\@listii}{}% @@ -2663,7 +2697,7 @@ % the \texttt{flextended} option from \textsf{eqexam}. See the placement % of this command below its default definition of \cs{relax}. % \changes{v8.1i}{2018/01/20}{Added \string\cs{kdvsp@Restore} to support -% the \texttt{flextended} option from \string\textsf{eqexam}} +% the \string\opt{flextended} option from \string\pkg{eqexam}} % \begin{macrocode} \let\kdvsp@Restore\relax \def\eq@clearMrkCpy{\if@targetforextr @@ -2698,7 +2732,7 @@ % to preserve the vertical space declared by the \textsf{solution} environment when % \cs{ifeq@solutionsafter} is true. % \changes{v6.3z}{2011/04/28}{if \string\cs{ifkeepdeclaredvspacing} is true, we attempt -% to preserve the vertical space declared by the \textsf{solution} environment when +% to preserve the vertical space declared by the \string\env{solution} environment when % \string\cs{ifeq@solutionsafter} is true.} % \begin{macrocode} \ifx\minVspacet@bs\@empty @@ -2710,10 +2744,10 @@ \@tempdima\pagetotal \advance\@tempdima-\eq@startSoln % \end{macrocode} -% \changes{v6.4w}{2012/26/27}{Added \cs{relax} following the assignment.} +% \changes{v6.4w}{2012/26/27}{Added \string\cs{relax} following the assignment.} % {\TeX} was looking ahead looking for the rest of the dimension, this caused % problems because later code was expanded when it should not have been. Inserted -% \cs{relax}, \verb~\@tempdimb\sameVspace\relax~. +% \cs{relax}, |\@tempdimb\sameVspace\relax|. % \begin{macrocode} \@tempdimb\sameVspace\relax % \end{macrocode} @@ -2767,8 +2801,8 @@ % \cs{endexercise}. %\changes{v6.07}{2007/05/05} %{ -% Created the \texttt{exercise*} environment, this is equivalent to the \texttt{*} option of the -% \texttt{exercise} environment. You can use either version, but now, \texttt{exercise*} is preferred. +% Created the \string\texttt{exercise*} environment, this is equivalent to the \string\texttt{*} option of the +% \string\env{exercise} environment. You can use either version, but now, \string\env{exercise*} is preferred. %} % \begin{macrocode} \let\eq@exerstarEnv\relax @@ -2847,8 +2881,8 @@ % \begin{macro}{\setPartsWidth} % Convenience macro to set \cs{part@indent}. %\changes{v6.4h}{2011/07/28}{% -% Added \cs{setPartsWidth} to set \cs{part@indent}. Also -% defined \cs{eqe@prtsepPrb}. +% Added \string\cs{setPartsWidth} to set \string\cs{part@indent}. Also +% defined \string\cs{eqe@prtsepPrb}. %} % \begin{macrocode} \newcommand{\setPartsWidth}[1]{\def\parts@indent{\normalfont#1}% @@ -3042,11 +3076,11 @@ % Now for the tabular style of multi-part exercise, the argument % \#1 is the number of columns requested.\medskip % -% \noindent(2017/02/09) Added \pkg{xkeyval} to optional argument of \texttt{parts}. Syntax is now +% \noindent(2017/02/09) Added \pkg{xkeyval} to optional argument of \env{parts}. Syntax is now %\begin{verbatim} % \begin{parts}[<num>|nCols=<num>,minVspace=<length>] %\end{verbatim} -% \changes{v7.8e}{2017/02/09}{Added xkeyval to optional argument of \string\texttt{parts}} +% \changes{v7.8e}{2017/02/09}{Added xkeyval to optional argument of \string\env{parts}} % \begin{macrocode} \define@key{tabp@rts}{nCols}{\def\exerwparts@cols{#1}} \define@key{tabp@rts}{minVspace}{\def\minVspacet@bs{#1}} @@ -3217,9 +3251,9 @@ \noindent\normalbaselines\kern0pt \prior@parts@hook\abovepartshook % \end{macrocode} -%\changes{v7.03}{2015/03/02}{Added \texttt{>\{\cs{strut}\}}, this gives +%\changes{v7.03}{2015/03/02}{Added \string\texttt{\string\GT{\string\cs{strut}}}, this gives % better control over vertical spacing.}% -% \changes{v7.4}{2015/03/23}{inserted \cmd\setTabulrSolnEnv}% +% \changes{v7.4}{2015/03/23}{inserted \string\cs{setTabulrSolnEnv}}% % \begin{macrocode} \tablrIndent\tabular[t]{@{}*{\exerwparts@cols}{>{\setTabulrSolnEnv \parskip\eqeques@parsep\relax @@ -3229,7 +3263,7 @@ \global\let\@listii@SAVE\relax}% \post@parts@hook\belowpartshook % \end{macrocode} -% \changes{v7.4}{2015/03/23}{added an adjustment to the command \cs{endexercise@parts@tabular}} +% \changes{v7.4}{2015/03/23}{added an adjustment to the command \string\cs{endexercise@parts@tabular}} % A vertical space adjustment\par\medskip\noindent % (201/05/09) There is a problem of communicating the totals through % the \cs{mark} command (use in \textsf{eqexam}). In \textsf{eqexam} @@ -3308,9 +3342,9 @@ {\let\save@@xtabularcr\@xarraycr} {\let\save@@xtabularcr\@xtabularcr}} % \end{macrocode} -%\changes{v7.0}{2014/11/05}{Added \cs{tabControlOn} and \cs{tabControlOff}. +%\changes{v7.0}{2014/11/05}{Added \string\cs{tabControlOn} and \string\cs{tabControlOff}. % Tab control is interfering with regular tabular environments, or anywhere -% \texttt{d} is used.} +% \string\texttt{d} is used.} % \begin{macrocode} \def\tabControlOff{\@ifundefined{@xtabularcr} {\let\@xarraycr\save@@xtabularcr} @@ -3355,7 +3389,7 @@ % to \cs{setkeys}; therefore you can pass a command of key-value options through % the optional argument: % |\def\myOpts{topsep=0pt}|, |\begin{exEnumerate}[\myOpts]|. -% \changes{v8.2.6}{2018/12/03}{Inserted \string\cs{eqprior} prior to exEnumerate env} +% \changes{v8.2.6}{2018/12/03}{Inserted \string\cs{eqprior} prior to \string\env{exEnumerate} env} % The \cs{eqprior} command normally does nothing unless it is redefined. % \begin{macrocode} \newenvironment{exEnumerate}[1][]{\everypar{}% @@ -3545,7 +3579,7 @@ \fi } % \end{macrocode} -%\changes{v6.4q}{2012/03/23}{define \cs{eq@defaultlheader}} +%\changes{v6.4q}{2012/03/23}{define \string\cs{eq@defaultlheader}} % Determine whether \textsf{web} package is loaded, and define \cs{eq@normallheader} % and \cs{eq@defaultlheader}. These are designed to fix a problem of disappearing % headers in the solutions section of the document. @@ -3583,7 +3617,7 @@ % \end{macrocode} % If there are solutions and this is not the \texttt{solutionsonly} option, % we start a new page, clear the right mark and start a normal header. -% \changes{v6.4q}{2012/03/23}{Inserted \cs{eq@normalheader} after \cs{newpage} +% \changes{v6.4q}{2012/03/23}{Inserted \string\cs{eq@normalheader} after \string\cs{newpage} % to get running headers to appear on each page of solutions}% % Inserted |\markright{}| and \cs{eq@normalheader} to fix a problem with % disappearing running headers. @@ -3673,7 +3707,7 @@ % %\changes{v6.2a}{2007/11/10 } %{ -% Added \cs{expdfbookmark} to bookmark exercises. +% Added \string\cs{expdfbookmark} to bookmark exercises. %} % We have to increase the \texttt{tocdepth} so hyperref will create the bookmark at the % subsection level. @@ -3745,7 +3779,7 @@ % Here, we include a few commands common to both % quiz environments. %\medskip\par\noindent -% Colors used by \textsf{exerquiz}: \texttt{webgreen} normally defined in \textsf{web}. +% Colors used by \pkg{exerquiz}: \texttt{webgreen} normally defined in \pkg{web}. % \begin{macrocode} \definecolor{webgreen}{rgb}{0,.6,0} % \end{macrocode} @@ -3755,20 +3789,20 @@ % \changes{v6.05b}{2006/05/12} % { % added a command to change the color of the proofing symbol -% changed the definition of \cs{proofingsymbol} to a text fillin. This creates the command -% \cs{@proofingsymbol}. Can now control the symbol and the color (through \cs{proofingsymbolColor} +% changed the definition of \string\cs{proofingsymbol} to a text fillin. This creates the command +% \string\cs{@proofingsymbol}. Can now control the symbol and the color (through \string\cs{proofingsymbolColor} % } % \begin{macrocode} \newcommand{\proofingsymbolColor}[1]{\def\@proofingsymbolColor{#1}} \proofingsymbolColor{red} -\let\@proofsymbolredefined=0 -\newcommand{\proofingsymbol}[1]{\let\@proofsymbolredefined=1% - \def\@proofingsymbol{\textcolor{\@proofingsymbolColor}{#1}}} +\let\@proofsymbolredefined\eq@Zero +\newcommand{\proofingsymbol}[1]{\let\@proofsymbolredefined\eq@One + \def\@proofingsymbol{\textcolor{\@proofingsymbolColor}{#1}}} \def\@proofingsymbol{\textcolor{\@proofingsymbolColor}{\ding{52}}} -\def\setproofingsymbol{% - \if\@proofsymbolredefined1\else - \@ifpackageloaded{pifont}{\proofingsymbol{\ding{52}}} - {\proofingsymbol{$\bullet$}}\fi} +\def\setproofingsymbol{\ifx\@proofsymbolredefined\eq@One\else + \@ifpackageloaded{pifont}{\proofingsymbol{\ding{52}}} + {\proofingsymbol{$\bullet$}}\fi +} \AtBeginDocument{\setproofingsymbol} % \end{macrocode} % \end{macro} @@ -3794,22 +3828,22 @@ \newcommand{\quesNumColor}[1]{\def\eq@quesNumCol{#1}} \quesNumColor{blue} \renewcommand{\theeqquestionnoi}{\arabic{eqquestionnoi}} -\newcommand{\labeleqquestionnoi}{% - \color{\eq@quesNumCol}\bfseries\theeqquestionnoi.} +\newcommand{\labeleqquestionnoi}{\color{\eq@quesNumCol}\bfseries + \theeqquestionnoi.} \renewcommand\theeqquestionnoii{(\alph{eqquestionnoii})} -\newcommand{\labeleqquestionnoii}{% - \color{\eq@quesNumCol}\bfseries\theeqquestionnoii} +\newcommand{\labeleqquestionnoii}{\color{\eq@quesNumCol}\bfseries + \theeqquestionnoii} \renewcommand\theeqquestionnoiii{(\roman{eqquestionnoiii})} -\newcommand{\labeleqquestionnoiii}{% - \color{\eq@quesNumCol}\bfseries\theeqquestionnoiii} +\newcommand{\labeleqquestionnoiii}{\color{\eq@quesNumCol}\bfseries + \theeqquestionnoiii} % \end{macrocode} % \paragraph*{Properties of the questions environment.} (2013/07/10) These include % \IndexKey{labelwidthTo}\texttt{labelwidthTo} and % \IndexKey{labelwidth}\texttt{labelwidth}. % \begin{macrocode} \define@key{props@ques}{labelwidthTo}% - [\normalsize\normalfont\bfseries00.]% - {\def\propQ@labelwidthTo{#1}} + [\normalsize\normalfont\bfseries00.]% + {\def\propQ@labelwidthTo{#1}} \define@key{props@ques}{labelwidth}[]{\def\propQ@labelwidth{#1}} \let\propQ@labelwidth\@empty % \end{macrocode} @@ -3854,17 +3888,20 @@ \insE@rlyAtQues\gdef\eqPTs{1}% \global\let\eqQT\eq@na% % \end{macrocode} -% (06/06/10) We create a macro \cs{@currentQues} that holds the current -% problem number 2(a)(i), for example. +% (06/06/10) We create a macro, \cs{@currentQues}, that holds the current +% problem number; 2(a)(i), for example. +% \changes{v8.6.7}{2021/04/12}{Remove the misplaced \string\cs{endcsname} +% \string\cs{@thispr@b}, within the \string\env{questions} environment.} % \begin{macrocode} - {\@tempcnta=0 \let\@thispr@b\@empty + {\@tempcnta\z@\let\@thispr@b\@empty \@whilenum\@tempcnta<\@eqquestiondepth\do{\advance\@tempcnta\@ne - \ifx\@thispr@b\@empty\edef\@thispr@b{% - \csname theeqquestionno\romannumeral\the\@tempcnta\endcsname}\else - \edef\@thispr@b{\@thispr@b% - \csname theeqquestionno\romannumeral\the\@tempcnta\endcsname}\fi + \ifx\@thispr@b\@empty\edef\@thispr@b{\@nameuse + {theeqquestionno\romannumeral\the\@tempcnta}}\else + \edef\@thispr@b{\@thispr@b\@nameuse + {theeqquestionno\romannumeral\the\@tempcnta}}\fi }\xdef\@currentQues{\@thispr@b}}% - \makebox[\labelwidth][r]{\normalfont\@nameuse{label\@quesctr}}% + \makebox[\labelwidth][r]{\normalfont + \@nameuse{label\@quesctr}}% format label \xdef\eq@pageThisQ{\the\c@page}% \post@questionsHook}{\usecounter{\@quesctr}% % \end{macrocode} @@ -3918,9 +3955,10 @@ % the \texttt{shortquiz} %\par\medskip\noindent % After all the parsing is done, the parameters for this environment are -%\begin{verbatim} -% \begin{shortquiz}*[<basename>] -%\end{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={!()},codes={\catcode`\%=9}] +%\begin{shortquiz}*[!ameta(basename)] +%\end{Verbatim} %The `\texttt{*}' is optional and signals that forms should be used instead %of links. This option is regressed. The user should use the \texttt{shortquiz*} % environment. The \verb![<basename>]! is the basename of any form fields @@ -3936,7 +3974,7 @@ \abovesqskip{\par\medskip} % \end{macrocode} %\changes{v6.4a}{2011/05/11}{% -% Added \cs{sq@afterhook} for use by \textsf{eqexam}, but may be useful elsewhere. +% Added \string\cs{sq@afterhook} for use by \string\pkg{eqexam}, but may be useful elsewhere. %} %\DescribeMacro\endsqhook\cmd\endsqhook is a late hook % \begin{macrocode} @@ -3949,8 +3987,7 @@ % \begin{macrocode} \let\sqhspace\space \let\ListOfSQuizNames\@empty -\newenvironment{shortquiz} -{% +\newenvironment{shortquiz}{\def\eqPTs{1}% % \end{macrocode} % (06/08/10) The next two lines initialize the macros for registering the % question label, i.e., \texttt{2(a)(ii)}. These two lines are repeated for @@ -3970,15 +4007,15 @@ % The \texttt{shortquiz*} is a short quiz that uses forms. %\par\medskip\noindent % The parameter for this environment is -%\begin{verbatim} -% \begin{shortquiz}[<basename>] -%\end{verbatim} -% The \verb![<basename>]! is the basename of any form fields +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={!()},codes={\catcode`\%=9}] +%\begin{shortquiz}[!ameta(basename)] +%\end{Verbatim} +% The \texttt{[\ameta{basename}]} is the basename of any form fields % generated. If not present, an base fieldname is generated based on the % \cs{@shortquizCnt} macro (not a counter). The actual name is given in \cs{@sqGenBaseName}. % \begin{macrocode} -\newenvironment{shortquiz*} -{% +\newenvironment{shortquiz*}{% \xdef\eq@pageThisQ{\the\c@page}% {\eqtmpcnta\@shortquizCnt\relax\advance\eqtmpcnta\@ne \xdef\@shortquizCnt{\the\eqtmpcnta}}% @@ -4016,6 +4053,7 @@ \AA{\AAFormat{% if\eqSP(typeof\eqSP\oField=="undefined")\eqSP var\eqSP\oField=new\eqSP Object;\r + \oField.sqTlyTotCnt=0;\r \oField.Grp={};% \ifx\defaultColorJSLoc\@empty\else\r \oField.DefaultColorJSLoc=\defaultColorJSLoc;\fi @@ -4181,8 +4219,8 @@ if (typeof !oField=="undefined") % \end{answers} % \end{shortquiz} %\end{verbatim} -% To further complicate matters, the \texttt{shortquiz} can be -% used with the \texttt{questions} environment to create a series of +% To further complicate matters, the \env{shortquiz} can be +% used with the \env{questions} environment to create a series of % numbered short question quizzes. See the manual for examples. % \texttt{solution} environment is defined next. % \begin{macro}{solution} @@ -4194,8 +4232,8 @@ if (typeof !oField=="undefined") % option. In this case, solutions are separated by a % \cmd{\medskip} rather then put on a separate page. It also % obeys the \texttt{solutionsafter} option -% \changes{v6.4s}{2012/06/03}{Added hooks \cmd{\sqPostHeaderHook} and -% \cmd{\qPostHeaderHook}} +% \changes{v6.4s}{2012/06/03}{Added hooks \string\cs{sqPostHeaderHook} and +% \string\cs{qPostHeaderHook}} %\par\medskip\noindent % Hooks \DescribeMacro\sqPostHeaderHook\cmd{\sqPostHeaderHook}, % \DescribeMacro\qzPriorSolutionAfterHook\cmd\qzPriorSolutionAfterHook, @@ -4266,20 +4304,19 @@ if (typeof !oField=="undefined") \expandafter\verbatimwrite\fi } \let\qzSolutionsAfterHook\@empty -\def\endsolution@sq -{% - \ifeq@solutionsafter - \eq@fititin{\mbox{\sqslrtnlabel}}\par\qzSolutionsAfterHook - \aftergroup\ignorespaces - \else - \endverbatimwrite - \eq@clearMrkCpy - \ifx\@qzsolndest\@empty\else\set@display@protect - \immediate\write\verbatim@out{\eqSqSolnTrailer}% - \set@typeset@protect - \fi +\def\endsolution@sq{% + \ifeq@solutionsafter + \eq@fititin{\mbox{\sqslrtnlabel}}\par\qzSolutionsAfterHook + \aftergroup\ignorespaces + \else + \endverbatimwrite + \eq@clearMrkCpy + \ifx\@qzsolndest\@empty\else\set@display@protect + \immediate\write\verbatim@out{\eqSqSolnTrailer}% + \set@typeset@protect \fi - \global\let\@qzsolndest\@empty + \fi + \global\let\@qzsolndest\@empty } %</package|eqexam> %<*package> @@ -4288,9 +4325,9 @@ if (typeof !oField=="undefined") % a new page. The argument is a vertical skip. If there is \texttt{\#1} % or more space remaining on the page, the command does nothing, otherwise % it issues a \cs{newpage}. -% \changes{v6.4s}{2012/06/03}{Added \cs{promoteNewPageHere}} +% \changes{v6.4s}{2012/06/03}{Added \string\cs{promoteNewPageHere}} % \changes{v6.8a}{2014/01/01}{Made an optional argument, but test for required argument as swell.} -% \changes{v8.5.6}{2020/01/01}{\string\promoteNewPageHere: added condition, first arg must be greater +% \changes{v8.5.6}{2020/01/01}{\string\cs{promoteNewPageHere}: added condition, first arg must be greater % then 0pt; otherwise, do nothing} % \begin{macrocode} \newcommand\pnphDflt{.1\textheight} @@ -4313,9 +4350,9 @@ if (typeof !oField=="undefined") % re-emitting it later, just prior to the solution. Useful for grouped questions. % \begin{macrocode} \newcommand{\saveDest}[1][]{% - \def\sd@arg{#1}\ifx\sd@arg\@empty - \xdef\holdDest{\@qzsolndest}\else - \xdef\@qzsolndest{#1}\xdef\holdDest{#1}\fi} + \def\sd@arg{#1}\ifx\sd@arg\@empty + \xdef\holdDest{\@qzsolndest}\else + \xdef\@qzsolndest{#1}\xdef\holdDest{#1}\fi} \def\useDest{\def\@qzsolndest{\holdDest}} \let\holdDest\@empty %</package> @@ -4324,17 +4361,17 @@ if (typeof !oField=="undefined") \let\eqSqSolnTrailerHook\@empty \let\eqQzSolnTrailerHook\@empty \newcommand\eqSqSolnTrailer{% - \if\eqQuizType\isQZ - \eqQzSolnTrailerHook - \protect\ReturnTo{page.\eq@pageThisQ}% - {\protect\mbox{\sqslrtnlabel}}\string\endeqQt - \else - \eqSqSolnTrailerHook - \protect\ReturnTo{page.\eq@pageThisQ}% - {\protect\mbox{\sqslrtnlabel}}\string\endeqSQt% - \fi - \ifeqforpaper\protect\fpAfterSolutionsSkip\fi^^J% - \ifmakeQzSlLocal\protect\endgroup^^J\fi + \if\eqQuizType\isQZ + \eqQzSolnTrailerHook + \protect\ReturnTo{page.\eq@pageThisQ}% + {\protect\mbox{\sqslrtnlabel}}\string\endeqQt + \else + \eqSqSolnTrailerHook + \protect\ReturnTo{page.\eq@pageThisQ}% + {\protect\mbox{\sqslrtnlabel}}\string\endeqSQt% + \fi + \ifeqforpaper\protect\fpAfterSolutionsSkip\fi^^J% + \ifmakeQzSlLocal\protect\endgroup^^J\fi } %</package|eqexam> %<*package> @@ -4346,8 +4383,9 @@ if (typeof !oField=="undefined") % \begin{macro}{\endeqSQt} % The \cmd{\eqQt} and \cmd{\eqSQt} are markers at the beginning of each % quiz (short quiz, respectively) solution. These markers, along with -% ``end'' versions, \cmd{\endeqQt} and \cmd{\endeqSQt}, respectively, can be used to filter out the quiz solutions or the -% short quiz solutions. The following example removes all short quizzes. +% ``end'' versions, \cmd{\endeqQt} and \cmd{\endeqSQt}, respectively, +% can be used to filter out the quiz solutions or the +% short-quiz solutions. The following example removes all short quizzes. %\begin{verbatim} %\long\def\eqSQt#1\endeqSQt{} %\begin{document} @@ -4370,13 +4408,13 @@ if (typeof !oField=="undefined") % \begin{macro}{\quizSolnHeader} % Each solution begins with \cmd{\quizSolnHeader}. This can be redefined % for whatever reason. It takes three arguments, one of which is optional. -% \#1 is the \cmd{\noPeek} parameters; \#2 is the named destination to this -% solution; \#3 is the \cmd{\sqsllabel}. +% \texttt{\#1} is the \cmd{\noPeek} parameters; \texttt{\#2} is the named destination to this +% solution; \texttt{\#3} is the \cmd{\sqsllabel}. % % If you want to typeset solutions separately, you can redefine % \cmd{\quizSolnHeader} as desired, and used in conjunction with % \cmd{eqQt}. -% \changes{v6.7q}{2013/12/15}{Added this hook for use by \textsf{contsolns.dtx}} +% \changes{v6.7q}{2013/12/15}{Added this hook for use by \string\textsf{contsolns.dtx}} % \begin{macrocode} \let\prior@quizSolnHeaderHook\@empty \newcommand\quizSolnHeader[3][]{% @@ -4480,14 +4518,12 @@ if (typeof !oField=="undefined") % \end{macrocode} % \DescribeMacro{\quizSolnsHeadnToc} sets up the quiz solution title. % \begin{macrocode} -\def\quizSolnsHeadnToc -{% +\def\quizSolnsHeadnToc{% \edef\eq@mkCmd{\expandafter\noexpand \csname\eq@QzSolnsLevel\endcsname\eq@QzSolnsStar}% \eq@mkCmd{\sqslsectitle}\if!\eq@QzSolnsLabel!\else \label{\eq@QzSolnsLabel}\fi \if\eq@QzSolnsStar*% -% \addtocontents{toc}{\protect\def\protect\web@finalDot{}} \addcontentsline{toc}{\eq@QzSolnsLevel}{% \@ifundefined{web@latextoc}{}{% \ifx\web@latextoc\eq@YES\else @@ -4502,8 +4538,7 @@ if (typeof !oField=="undefined") % \changes{v8.2.6}{2018/12/03}{Placed \string\cs{endinput} at the end of % the quiz solutions file} % \begin{macrocode} -\newcommand{\quizSolnInput} -{% +\newcommand{\quizSolnInput}{% \global\let\webnewpage\relax \bgroup\OKToWriteExamDatatrue \writeT@QzSolns{\string\endinput}\egroup @@ -4638,24 +4673,27 @@ if (typeof !oField=="undefined") % The \texttt{quiz} environment takes an optional `\texttt*' % and one required argument. There are two styles of quizzes: % links or checkboxes. Beginning with v6.08, the use of the \texttt*-option -% is discouraged, use the quiz* environment instead. -%\begin{verbatim} -%\begin{quiz}[*]{<base_name>} +% is discouraged, use the \env{quiz*} environment instead. +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={!()},codes={\catcode`\%=9}] +%\begin{quiz}[*]{!ameta(base-name)} % ... %\end{quiz} -%\end{verbatim} +%\end{Verbatim} +%Brief description of parameters: % \begin{itemize} -% \item optional \texttt{*} $=$ use checkboxes, otherwise use links -% \item \texttt{<base\_name>}: required argument $=$ base name of quiz. +% \item optional \texttt{*} means to use checkboxes, otherwise use links; +% \item \texttt{\ameta{base-name}}: required argument is the base name of quiz. % \end{itemize} -% -% Note that I set \verb!\tabcolsep=0pt! in preparation for a tabular environment. +% Note that I set \cs{tabcolsep=0pt} in preparation for a tabular environment. % If authors wants to use a tabular environment within a question, he/she must -% reset this value to its default, \verb!\setlength{\tabcolsep}{6pt}!. +% reset this value to its default, |\setlength{\tabcolsep}{6pt}|. % \begin{macrocode} -\newenvironment{quiz} -{\goodbreak\@ifstar{\gdef\qstar{*}\@quiz*f}{\gdef\qstar{x}\@quiz*l}} - {\aeb@endquiz} +\newenvironment{quiz}{\goodbreak + \@ifstar + {\gdef\qstar{*}\@quiz*f} + {\gdef\qstar{x}\@quiz*l}% +}{\aeb@endquiz} \def\@quizCnt{0} % \end{macrocode} % \cs{ListOfQuizNames} and \cs{ListOfSQuizNames} are master lists of all @@ -4702,9 +4740,9 @@ if (typeof !oField=="undefined") \gdef\eqPTs{1}\global\let\eqQT\eq@na % \end{macrocode} % \changes{v6.3u}{2010/11/04}{% -% Added \cs{xdef}\cs{oField}\texttt{\{\#2\}}, this is -% needed for \textsf{apb.dtx}} -% Add \cs{listOfQuizNames} to track quizzes +% Added \string\cs{xdef}\string\cs{oField}\string\darg{\#2}, this is +% needed for \string\textsf{apb.dtx}} +% Add \string\cs{listOfQuizNames} to track quizzes % \changes{v7.8k}{2017/07/25}{Added \string\cs{listOfQuizNames} to track quizzes} % \begin{macrocode} \g@addto@macro\ListOfQuizNames{,#2}% @@ -4996,7 +5034,7 @@ else { % \begin{macrocode} DisplayQuizResults("*curr@quiz",*theeqpointvalue,% *thequestionno,bDisplaySilent); - bDisplaySilent=false; + bDisplaySilent=false; var h=this.getField("ScoreData.*curr@quiz"); h.value=Score+";"+NQuestions+";"% +ptScore+";"+NPointTotal;% @@ -5105,7 +5143,7 @@ if (isEndQuizPushed("@eqBaseName")){ \fi } % \end{macrocode} -% \changes{v6.7n}{2013/09/17}{\cs{CorrButton} is now an alias for \cs{eqButton}} +% \changes{v6.7n}{2013/09/17}{\string\cs{CorrButton} is now an alias for \string\cs{eqButton}} % \DescribeMacro{\CorrButton} is a name better suited for the task of this button % than the \cs{eqButton} name. % \begin{macrocode} @@ -5359,8 +5397,8 @@ if (isEndQuizPushed("@eqBaseName")){ % \changes{v6.05c}{2006/05/19} % { % Added a convenience macro for setting the name of the quiz. This command defines the -% text macro \cs{currQuiz} which contains the quiz name. Can be used in conjunction -% with \cs{floatQuiz} and \cs{startQuizHere}. +% text macro \string\cs{currQuiz} which contains the quiz name. Can be used in conjunction +% with \string\cs{floatQuiz} and \string\cs{startQuizHere}. % } % \changes{v8.1k}{2018/02/04}{Added \string\cs{oField} to list in \string\cs{DeclareQuiz}} % \begin{macrocode} @@ -5378,12 +5416,12 @@ if (isEndQuizPushed("@eqBaseName")){ % \texttt{quiz} environment. % \changes{v6.05c}{2006/05/19} % { -% Added \cs{floatQuiz}, \cs{dockQuiz} and \cs{startQuizHere} to start a quiz in an +% Added \string\cs{floatQuiz}, \string\cs{dockQuiz} and \string\cs{startQuizHere} to start a quiz in an % arbitrary place prior to the beginning of the quiz. % } %\par\medskip\noindent Usage: %\begin{verbatim} -%\Quiz{myQuiz} +%\DeclareQuiz{myQuiz} %\floatQuiz %........ %\begin{center} @@ -5512,8 +5550,8 @@ if (isEndQuizPushed("@eqBaseName")){ %quizzes only---the title of the quiz is used for the definition of %\cs{sqlabel}. Note that \cs{makeatletter} is invoked before the % parameters are read. -% \changes{v6.7o}{2013/11/25}{Changed \cs{aeb@@titleQuzi} to \cs{aebTitleQuiz}} -% \changes{v6.7p}{2013/12/11}{Added optional parameter to \cs{titleQuiz} +% \changes{v6.7o}{2013/11/25}{Changed \string\cs{aeb@@titleQuzi} to \string\cs{aebTitleQuiz}} +% \changes{v6.7p}{2013/12/11}{Added optional parameter to \string\cs{titleQuiz} % to execute a command, such as incrementing a counter.} % \begin{macrocode} \let\tqhspace\space @@ -5578,11 +5616,11 @@ if (isEndQuizPushed("@eqBaseName")){ % %\changes{v6.2c}{2007/11/14} %{ -% Added the commands \cs{showCreditMarkup} and \cs{hideCreditMarkup} to show partial credit markup +% Added the commands \string\cs{showCreditMarkup} and \string\cs{hideCreditMarkup} to show partial credit markup %} %\changes{v6.3k}{2008/01/09} %{ -% Added \cs{ptsLabel} and \cs{ptLabel} to localize the markup in the margin of a quiz +% Added \string\cs{ptsLabel} and \string\cs{ptLabel} to localize the markup in the margin of a quiz %} % \begin{macrocode} \newcounter{qMarkCnt} @@ -5709,7 +5747,7 @@ if (isEndQuizPushed("@eqBaseName")){ % within a quiz. %\changes{v6.2a}{2007/11/10} %{ -% Added \cs{quizpdfbookmark} to bookmark quizzes. +% Added \string\cs{quizpdfbookmark} to bookmark quizzes. %} % \begin{macrocode} \newcommand{\sqbookmarkfmt}{Short Quiz \@shortquizCnt.\space} @@ -5819,7 +5857,7 @@ if (isEndQuizPushed("@eqBaseName")){ % \changes{v6.05e}{2006/18/06 v6.05e} % { % Added control over the separation between the MC label and subsequent text: -% \cs{setMClabelsep} and \cs{resetMClabelsep}. +% \string\cs{setMClabelsep} and \string\cs{resetMClabelsep}. % } % \begin{macro}{\resetMClabelsep} % \begin{macro}{\eq@hspanner} @@ -5928,7 +5966,7 @@ if (isEndQuizPushed("@eqBaseName")){ %<*package|eqexam> \def\Ans{\Ans@list}% }% list -}{\endlist\setcounter{quizno}{0}\eq@answersEndHook} +}{\eq@answersEndHook\endlist\setcounter{quizno}{0}} % \end{macrocode} % Answers environment for a tabular environment. This command picks % up the arguments of \cs{Ans}, then passes on the \cs{@Ans} @@ -5994,7 +6032,7 @@ if (isEndQuizPushed("@eqBaseName")){ % \begin{macrocode} \expandafter\tabular\sq@TabPos{@{}*{#1}{p{\eq@tmpdima}}@{}}}% % \end{macrocode} -% \changes{v7.4}{2015/03/23}{added \cmd{\reset@doendpe}} +% \changes{v7.4}{2015/03/23}{added \string\cs{reset@doendpe}} % \DescribeMacro{\reset@doendpe} attempts to restore the \cs{parshape} % following a list environment. It appears in several locations, includeing % \cs{endanswers}, \cs{endmanswers}, and \cs{setTabulrSolnEnv}. @@ -6018,10 +6056,12 @@ if (isEndQuizPushed("@eqBaseName")){ % \end{macrocode} % % \begin{macro}{\endanswers} -% Close off \texttt{tabular} environment, and reinitialize the +% Close off \texttt{tabular} environment, and re-initialize the % \texttt{quizno} counter. Added \cs{answersEndHook}. % \begin{macrocode} -\newcommand\answersEndHook[1]{\def\eq@answersEndHook{#1}} +\newcommand\answersEndHook[1]{\def\eq@answersEndHook{#1}% + \ifx\eq@answersEndHook\@empty\else + \def\insertEndHookHere{#1}\fi} \let\eq@answersEndHook\@empty \def\endanswers@sq{\endtabular\setcounter{quizno}{0}% \eq@answersEndHook\reset@doendpe{\the\everypar}% @@ -6124,7 +6164,7 @@ if (isEndQuizPushed("@eqBaseName")){ % For the link multiple choice type question. The driver independent stuff starts % here, then goes to |\Ans@sq@f@driver| the rest of the code that depends on the % driver. -% \changes{v7.7d}{2015/11/15}{Changed mc.\cs{oFields} so it is printable} +% \changes{v7.7d}{2015/11/15}{Changed mc.\string\cs{oFields} so it is printable} % \begin{macrocode} \def\@@Ans@sq@f@Defaults {% @@ -6158,11 +6198,19 @@ var qzSolnDest="*@qzsolndest"; var solnAfter=*ifeq@solutionsafter% true*else% false*fi; -if ((qzSolnDest!="") && !solnAfter) % -jmpToNamedDest("*oField","*@qzsolndest",% -*ifx*@sqTurnOffAlerts*eq@Zero0*else1*fi);% -*ifx*eqAddAAMouseUpMC*empty*else -*eqAddAAMouseUpMC*fi +% \end{macrocode} +% Introduce changes in this code in response to \cs{sqSolnBtn} command. +% \changes{v8.7.5}{2021/05/05}{\string\cs{sqSolnBtn} changes: execute block +% if \string\cs{sqSolnBtn} not detected} +% \begin{macrocode} +var f=this.getField("corr.*oField.*thequestionno"); +if (f==null) { + if ((qzSolnDest!="") && !solnAfter) % + jmpToNamedDest("*oField","*@qzsolndest",% + *ifx*@sqTurnOffAlerts*eq@Zero0*else1*fi);% + *ifx*eqAddAAMouseUpMC*empty*else + *eqAddAAMouseUpMC*fi +} \end{defineJS} % \end{macrocode} % JavaScript code for the mouse up action for the \emph{incorrect} choice of the radio button field @@ -6237,6 +6285,9 @@ if( qzSolnDest!="") updateTally("*oField.*thequestionno");% %</package> %<*package|eqexam> \let\rbf@Opts\@empty +% \end{macrocode} +% The \cs{Ans} for a short-quiz, using forms. +% \begin{macrocode} \def\Ans@sq@f{\if\eq@listType\eq@One \stepcounter{quizno}\else \@ifundefined{ifwithinsoldoc}{\refstepcounter{quizno}} @@ -6245,7 +6296,7 @@ if( qzSolnDest!="") updateTally("*oField.*thequestionno");% \PBS\raggedright %</package|eqexam> % \end{macrocode} -%\changes{v6.7d}{2013/05/27}{added \cs{rbf@Opts} to hardwire choices.} +%\changes{v6.7d}{2013/05/27}{added \string\cs{rbf@Opts} to hardwire choices.} % \begin{macrocode} %<*package> \if\Ans@choice\eq@One @@ -6309,23 +6360,31 @@ for (var i=0; i<a.length; i++) if ( (a[i].isBoxChecked(0)) && % (a[i].value.charAt(0)==0) ) a[i].checkThisBox(0,false);% -*ifx*@sqTurnOffAlerts*eq@One% -OnBlurRespBox(true,"*oField"); +*ifx*@sqTurnOffAlerts*eq@One +OnBlurRespBox(true,"*oField");*else *fi% var qzSolnDest="*@qzsolndest"; var solnAfter=*ifeq@solutionsafter% true*else% false*fi; -if ( (qzSolnDest != "") && !solnAfter ) { - for (var i=0; i<a.length; i++){ - if ((a[i].exportValues[0].charAt(0)==1) && % +% \end{macrocode} +% Introduce changes in this code in response to \cs{sqSolnBtn} command. +% \changes{v8.7.5}{2021/05/05}{\string\cs{sqSolnBtn} changes: execute block +% if \string\cs{sqSolnBtn} not detected} +% \begin{macrocode} +var f=this.getField("corr.*oField.*thequestionno"); +if (f==null) { + if ( (qzSolnDest != "") && !solnAfter ) { + for (var i=0; i<a.length; i++){ + if ((a[i].exportValues[0].charAt(0)==1) && % (!a[i].isBoxChecked(0))) break; + } } + if (i>=a.length) jmpToNamedDest("*oField","*@qzsolndest",% + *ifx*@sqTurnOffAlerts*eq@Zero0*else1*fi);% + *ifx*eqAddAAMouseUpMS*empty*else + *eqAddAAMouseUpMS*fi } -if (i>=a.length) jmpToNamedDest("*oField","*@qzsolndest",% -*ifx*@sqTurnOffAlerts*eq@Zero0*else1*fi);% -*ifx*eqAddAAMouseUpMS*empty*else -*eqAddAAMouseUpMS*fi \end{defineJS} % \end{macrocode} % Mouse up action for a \emph{incorrect answer box} (a checkbox) to MS question of short-quiz @@ -6341,9 +6400,8 @@ for (var i=0; i<a.length; i++) { a[i].checkThisBox(0,false); } }% -*ifx*@sqTurnOffAlerts*eq@One% -OnBlurRespBox(false,"*oField"); -*fi% +*ifx*@sqTurnOffAlerts*eq@One +OnBlurRespBox(false,"*oField");*fi% *ifx*oField*@empty*else updateTally("*oField.*thequestionno");*fi% *ifx*eqAddAAMouseUpMS*empty*else @@ -6472,9 +6530,9 @@ updateTally("*oField.*thequestionno");*fi% % in the sections that follow. % \changes{v6.2}{2007/11/08 } %{ -% Added the \texttt{manswers} environment, and supporting elements, both {\LaTeX} -% and JavaScript. This \texttt{manswers} environment is for the \texttt{quiz} environment -% only. There is a \texttt{manswers} environment for the \texttt{shortquiz} environment, but +% Added the \string\texttt{manswers} environment, and supporting elements, both {\string\LaTeX} +% and JavaScript. This \string\texttt{manswers} environment is for the \string\texttt{quiz} environment +% only. There is a \string\texttt{manswers} environment for the \string\texttt{shortquiz} environment, but % this is used by \textsf{eqExam} only. %} % @@ -6519,8 +6577,7 @@ updateTally("*oField.*thequestionno");*fi% \setlength{\labelsep}{0pt}% \def\Ans{\Ans@list}% }% -}{\endlist\setcounter{quizno}{0}% - \eq@answersEndHook +}{\eq@answersEndHook\endlist\setcounter{quizno}{0}% \setdefault@Ans \ifx\aeb@answerType\aeb@answerType@r % \end{macrocode} @@ -6784,8 +6841,8 @@ updateTally("*oField.*thequestionno");*fi% % \end{macrocode} % \changes{v6.05d}{2007/04/14} % { -% Added the command \cs{insertGrayLetters}. This can be defined to place symbols under -% the multiple choice form boxes. The command \cs{bottomOfAnsfStack} is there as a +% Added the command \string\cs{insertGrayLetters}. This can be defined to place symbols under +% the multiple choice form boxes. The command \string\cs{bottomOfAnsfStack} is there as a % hook for whatever purposes are desired. % } % \begin{macrocode} @@ -6793,7 +6850,7 @@ updateTally("*oField.*thequestionno");*fi% %</package> %<*package|eqexam> % \end{macrocode} -% \changes{v7.7}{2015/06/04}{Added \cs{graylettersColor}} +% \changes{v7.7}{2015/06/04}{Added \string\cs{graylettersColor}} % \DescribeMacro\graylettersColor sets the color of the gray letters, the default is % \texttt{gray}. % \begin{macrocode} @@ -6803,9 +6860,12 @@ updateTally("*oField.*thequestionno");*fi% {\textcolor{\graylettersColor}{\Alph{quizno}}}}\else\relax\fi} %</package|eqexam> %<*package> +% \end{macrocode} +% The \cs{Ans} command for a quiz using forms. +% \begin{macrocode} \def\Ans@@f{% \settowidth{\eq@tmplength}{\eq@lw@f}% - \hangindent=\eq@tmplength\hangafter=1 + \hangindent=\eq@tmplength\hangafter=\@ne \bottomOfAnsfStack\insertGrayLetters \edef\rbf@Opts{\ifaeb@usecircles\else \noexpand\symbolchoice{\qz@chksymb}\fi @@ -6831,9 +6891,9 @@ updateTally("*oField.*thequestionno");*fi% \def\Ans@c@f@Choice{\Ff{\FfReadOnly}}% \fi % \end{macrocode} -% \changes{v6.7h}{2013/08/19}{When the \cs{useMCCircles} is used, the boundary +% \changes{v6.7h}{2013/08/19}{When the \string\cs{useMCCircles} is used, the boundary % color is transparent. We try a fix for this to show the colored solution -% boundary. The fix uses the \cs{late@options} commands.} +% boundary. The fix uses the \string\cs{late@options} commands.} % \begin{macrocode} \ifaeb@usecircles\def\late@options{\BC{}}\fi \if\Ans@choice\eq@One @@ -7040,7 +7100,7 @@ updateTally("*oField.*thequestionno");*fi% } % \end{macrocode} % \changes{v6.3x}{2011/04/05}{% -% Added \texttt{label} parameter to \cs{bChoices}. +% Added \string\texttt{label} parameter to \string\cs{bChoices}. %} % A new key, \IndexKey{label}\texttt{label}, if this label is specified, then we keep track of all the % correct alternatives, put them into a commands to make them accessible by the user. @@ -7084,8 +7144,9 @@ updateTally("*oField.*thequestionno");*fi% } % \end{macrocode} % \changes{v6.3x}{2011/04/05}{% -% Supporting commands that use the value of the \texttt{label} parameter -% of \cs{bChoices}: \cs{eq@saveAns}, \cs{eq@displayAns}, \cs{eq@displayAlts}, etc. +% Supporting commands that use the value of the \string\texttt{label} parameter +% of \string\cs{bChoices}: \string\cs{eq@saveAns}, \string\cs{eq@displayAns}, +% \string\cs{eq@displayAlts}, etc. %} % \texttt{4/5} We begin an experimental series of commands. The idea is to be able to % conveniently reference a multiple choice problem when the @@ -7172,7 +7233,7 @@ updateTally("*oField.*thequestionno");*fi% % \begin{macro}{\useSavedAltsAns} % \begin{macro}{\useSavedNumAns} % \changes{v6.3x}{2011/04/05}{% -% Added \cs{useSavedAns}, \cs{useSavedAlts}, and \cs{useSavedAltsAns}. +% Added \string\cs{useSavedAns}, \string\cs{useSavedAlts}, and \string\cs{useSavedAltsAns}. %} % These three commands hold the correct alternatives and answers to a multiple choice % or multiple selection problem. The optional first argument allows you to display @@ -7286,7 +7347,7 @@ updateTally("*oField.*thequestionno");*fi% }{\expandafter\@findendans\@gobble}}% % \end{macrocode} % The command that processes the alternatives. -% \changes{v6.7g}{2013/08/09}{Changed \texttt{\#1} to \cs{the}\cs{@temptokena} Fixing +% \changes{v6.7g}{2013/08/09}{Changed \string\texttt{\string\#1} to \string\cs{the}\string\cs{@temptokena} Fixing % a nasty bug. Reported by Christopher C.} % \begin{macrocode} \def\defineEachAns#1{\advance\eqtmpcnta\@ne @@ -7382,7 +7443,7 @@ updateTally("*oField.*thequestionno");*fi% \nextrandom \nextrandom \nextrandom % \end{macrocode} % Save the initial seed value to \cs{eqInitSeedValue}. -% \changes{v6.7f}{2013/08/03}{Save the initial seed value to \cs{eqInitSeedValue}.} +% \changes{v6.7f}{2013/08/03}{Save the initial seed value to \string\cs{eqInitSeedValue}.} % \begin{macrocode} \xdef\InitSeedValue{\the\randomi}% \fi @@ -7417,8 +7478,8 @@ updateTally("*oField.*thequestionno");*fi% % \cs{@ansChoices}. % \changes{v6.1}{2007/10/28} % {% -% Added support for randomizing the multiple choices, requires the use of \cs{bChoices} -% and \cs{eChoices}. +% Added support for randomizing the multiple choices, requires the use of \string\cs{bChoices} +% and \string\cs{eChoices}. % } % \changes{v8.6.2}{2021/01/20}{Incorporated \string\cs{if@DoNotRandomize} % into the \string\cs{@ansChoices} macro for MC and MS questions} @@ -7653,10 +7714,10 @@ updateTally("*oField.*thequestionno");*fi% % equivalent to \cs{ref}. %\changes{v6.06c}{2007/04/26} %{ -% Added \cs{REF} in support of the \texttt{showgrayletters} option. +% Added \string\cs{REF} in support of the \string\texttt{showgrayletters} option. %} %\changes{v6.4d}{2011/07/14}{% -% Correct \cs{REF} so that a link is created. +% Correct \string\cs{REF} so that a link is created. %} % \begin{macrocode} \def\REF{\@ifstar{\let\isREFstar\eq@One\aeb@REFstar} @@ -7698,7 +7759,7 @@ updateTally("*oField.*thequestionno");*fi% % %\changes{v6.3j}{2008/12/08} %{ -% Added \cs{useMCCircles} and \cs{useMCCRects}. +% Added \string\cs{useMCCircles} and \string\cs{useMCCRects}. %} % \par\medskip\noindent We use a switch to keep track of ``circle mode.'' If the % document author invokes \cs{useMCCircles} when we are already in circle mode, @@ -7794,6 +7855,11 @@ updateTally("*oField.*thequestionno");*fi% \global\let\aebtitleQuiz\@empty \global\let\aebTitleQuiz\@empty \global\let\eq@tq@star\relax +% \end{macrocode} +% (2021/05/07) Reset \cs{eqpriorhook} at end of \env{oQuestions} environment. +% \changes{v8.7.6}{2021/05/07}{Reset \string\cs{eqpriorhook} at end of \string\env{oQuestions} environment} +% \begin{macrocode} + \global\let\oqpriorhook\@empty \aftergroup\ignorespaces } \def\oSolution#1{\edef\@qzsolndest{#1}} @@ -7813,8 +7879,8 @@ updateTally("*oField.*thequestionno");*fi% % in the preamble, we allow the score to go below zero. %\changes{v6.3i}{2008/10/22} %{ -% Added \cs{negPointsAllowed} to allow negative scores on quizzes. This is only relevant -% when the quiz has a \texttt{manswers} environment. +% Added \string\cs{negPointsAllowed} to allow negative scores on quizzes. This is only relevant +% when the quiz has a \string\texttt{manswers} environment. %} % \begin{macrocode} \def\negPointsAllowed{\def\negpointsallowed{true}} @@ -7830,7 +7896,7 @@ updateTally("*oField.*thequestionno");*fi% % and multiple choice questions. %\changes{v6.3m}{2010/01/27} %{ -% Added \cs{requireAlertBox} to turn off the ``Do not show this message again'' checkbox for objective questions. +% Added \string\cs{requireAlertBox} to turn off the ``Do not show this message again'' checkbox for objective questions. %} %The alert box displays the message \cs{doNotShowAgainMsg} which by default is %``Do not show this message again'' @@ -7992,8 +8058,8 @@ updateTally("*oField.*thequestionno");*fi% \ifShowAppr\altApprOn\let\eqAddAAFormat\@empty\fi} % \end{macrocode} % Get any changes in the appearance of the text box -% \changes{v6.4c}{2011/07/01}{\cs{RespBoxMath} now records its lists of -% independent variables under the global variable \texttt{\_mathVars}.} +% \changes{v6.4c}{2011/07/01}{\string\cs{RespBoxMath} now records its lists of +% independent variables under the global variable \string\texttt{\_mathVars}.} % \begin{macrocode} \begin{defineJS}[\makeesc\*\makecmt\%]{\AAKqRespBoxMath} % \end{macrocode} @@ -8473,6 +8539,57 @@ if(event.willCommit) { % \end{macro} % \end{macro} % \end{macro} +% \begin{macrocode} +%</package> +%<*rbmIntrvl> +% \end{macrocode} +% \subsubsection{The \texorpdfstring{\protect\cs}{\textbackslash}{rbmIntrvl} command}\label{ss:rbmi} +% This code segment is input into \pkg{exerquiz} when the \opt{userbmintrvl} is specified. +% The commands of this section are motivated by an {Acro\negthinspace\TeX} user (Thor G). He +% wants to ask his students to make a series of calculations, the result of +% which is to be entered into a \cs{RespBoxMath} input box. He is willing to +% accept the response as correct if the response falls into a designated +% interval $[a,b]$. +% +% Two commands are defined, one internal (\cs{c@lcEPInfo}) and the other public {\cs{rbmIntrvl}}. +% +% The first command \cs{c@lcEPInfo} takes as its parameters an (closed) interval of numbers. +% It calculates the midpoint \DescribeMacro\intrCAns\cs{intrCAns} and +% \DescribeMacro\intrPrec\cs{intrPrec}. The first number can be used as a (representative) point +% value of the answer; the second is used as the precision parameter of \cs{RespBoxMath}. +% \changes{v8.7}{2021/04/24}{Added \string\cs{rbmIntrvl}} +% \begin{macrocode} +\def\c@lcEPInfo[#1,#2]{% + \setlength{\eflength}{(#1pt+#2pt)/2}% + \edef\intrCAns{\strip@pt\eflength}% + \setlength{\eflength}{(#2pt-#1pt)/2}% + \edef\intrPrec{\strip@pt\eflength}% +} +% \end{macrocode} +% \DescribeMacro\rbmIntrvl\hskip-\marginparsep\texttt{\darg{[\meta{a{\upshape,}b}]}} +% This macro takes as its first argument the interval you want the student response +% to fall into. The command expands \cs{c@lcEPInfo} then \cs{RespBoxMath}. Use \cs{intrCAns} and \cs{intrPrec} +% in the arguments of \cs{RespBoxMath}. +% \begin{macrocode} +\newcommand{\rbmIntrvl}[1]{\c@lcEPInfo#1\RespBoxMath} +% \end{macrocode} +% \cs{rbmIntrvl} has implied arguments, those of \cs{RespBoxMath}. Below is a simple example. +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small,codes={\catcode`\%=9}] +%\rbmIntrvl{[6.40,6.90]}{\intrCAns}{1}{\intrPrec}{[0,1]} +%\end{Verbatim} +%Following the interval declaration are the parameters of \cs{RespBoxMath}. The first +%one following the interval is the correct answer (\cs{intrCAns}), the midpoint of the interval; +%the third argument following the interval is the precision parameter of \cs{RespBoxMath}, +%which is taken to be \cs{intrPrec}, the half-width of the interval. +% \begin{macrocode} +%</rbmIntrvl> +%<*package> +% \end{macrocode} +% We input the definition of \cs{rbmIntrvl} here, if the \opt{userbmintrvl} +% option is taken. +% \begin{macrocode} +\inputRBMICode +% \end{macrocode} %\subsection{Text Fill-In} % \begin{macro}{\RespBoxTxt} % \begin{macro}{\RespBoxTxtNT} @@ -8528,7 +8645,7 @@ if(event.willCommit) { \else\eqObjAlertIfFalse\fi\fi\fi} \def\eqAppAlert{eqAppAlert} % \end{macrocode} -% Keystroke action for \cs{RespBoxTxt} +% Keystroke action for \cs{RespBoxTxt} for a quiz % \changes{v8.6.4}{2021/02/15}{Corrected coding of \string\cs{AAKqRespBoxTxt}, wrong % escape char} % \begin{macrocode} @@ -8557,6 +8674,11 @@ if (!isQuizInitialized("*currQuiz")) { \noexpand\Ff{\FfReadOnly}\fi\fi\fi }% } +% \end{macrocode} +% The keystroke action for \cs{RespBoxTxt} for a short-quiz +% \changes{v8.6.5}{2021/02/21}{Removed comment character from last line +% of \string\cs{rbtAAKey}} +% \begin{macrocode} \begin{defineJS}[\makeesc\!\makecmt\%]{\rbtAAKey} if(event.willCommit) { var retn = ProcRespTxt(!rbTxtAlt);% @@ -8564,7 +8686,7 @@ if(event.willCommit) { !RespBoxTxtOnBlur!fi }% !ifx!eqAddAAKeystroke!@empty!else% -!eqAddAAKeystroke!fi% +!eqAddAAKeystroke!fi \end{defineJS} \def\@@RespBoxTxtActions{% \AA{\if\eqQuizType\isQZ @@ -8705,8 +8827,8 @@ if(event.willCommit) { % \end{macro} % \DescribeMacro{\txtRef}\hskip-\marginparsep\texttt{\darg{\ameta{label}}} % The \cs{RespBoxTxt} can be used for a matching-type question. We define a special -% \cs{ref}-type command that produces plain text. Refer to demo file \texttt{qz-matching.tex} for -% details. +% \cs{ref}-type command that produces plain text. Refer to demo file +% \texttt{qz-matching.tex} for details. % \changes{v8.6.4}{2021/02/15}{Support for matching-type question based in % \string\cs{RespBoxTxt}} % \begin{macrocode} @@ -8967,51 +9089,109 @@ if(event.willCommit) { } % \end{macrocode} % \end{macro} -%\subsection{Fields that Support the Fill-Ins} -% \begin{macro}{\sqTallyBox} +% \section{Fields that play a supportive role} +% +% \subsection{Support for the short-quiz} +% +% \subsubsection{The \tops{\protect\cs}{\textbackslash}{sqTallyBox} command} +% +% \begin{macro}{\sqTallyBox}\hskip-\marginparsep\texttt{[\ameta{options}]} % The \cmd{\sqTallyBox} holds the number of incorrect responses to the -% question. This box is not required to appear. If it does not -% appear, use \cmd{\RespBoxNT} to prevent the doc level JavaScript -% from trying to write a nonexistent text field. +% question. This box is not required to appear. % \begin{macrocode} \let\@@sqTallyBoxActions\@empty -\@ifundefined{calcOrder}{% -\ifpdf\def\@@sqTallyBoxActions{% - \AA{\AAValidate{getTotalTally("\oField");}}}\fi}{} +%\@ifundefined{calcOrder}{% +%\ifpdf\def\@@sqTallyBoxActions{% +% \AA{\AAValidate{getTotalTally("\oField");}}}\fi}{} +%\ifpdf\def\@@sqTallyBoxActions{% +% \AA{\AAValidate{getTotalTally("\oField");}}}\else +% \let\@@sqTallyBoxActions\@empty\fi \def\sqTallyBoxDefaults{% - \BC{0 0 0}\W{1}\textColor{1 0 0 rg}\S{I}\Q{2}\Ff{\FfReadOnly} -} -\ifpdf\def\@@sqTallyBoxActions{% - \AA{\AAValidate{getTotalTally("\oField");}}}\else - \let\@@sqTallyBoxActions\@empty -\fi + \BC{0 0 0}\W{1}\textColor{1 0 0 rg}\S{I}\Q{2}\Ff{\FfReadOnly}} \newcommand\sqTallyBox[1][]{% \mbox{\text@@Field{#1}{tally.\oField.\thequestionno}% {\TBW}{\DefaultHeightOfWidget}% {}{\eq@setWidgetProps\eq@TextField}% {\sqTallyBoxDefaults\@@sqTallyBoxActions\every@eqTextField - \every@sqTallyBox}}% -} + \every@sqTallyBox}}} % \end{macrocode} % \end{macro} -% \begin{macro}{\sqTallyTotal} +% \subsubsection{The \tops{\protect\cs}{\textbackslash}{sqTallyTotal} command} +% \begin{macro}{\sqTallyTotal}\hskip-\marginparsep\texttt{[\ameta{options}]} % This text field stores the tally total. Only used within the % \texttt{shortquiz} environment. Takes on optional parameter; this -% parameter can be used to modify the appearance of the fields. +% parameter can be used to modify the appearance of the fields. Two special +% key-values are also recognized: \cs{weakpass\darg{\ameta{n}}} and \cs{strongpass\darg{\ameta{n}}} % \begin{macrocode} \def\sqTallyTotalDefaults{% - \rawPDF{}\W{1}\BC{0 0 0}\S{I}\textColor{1 0 0 rg}% - \Q{2}\Ff{\FfReadOnly}% -} -\def\@@sqTallyTotalActions{% - \AA{% - \AAKeystroke{AFNumber_Keystroke(0,0,0,0,"",true);} - \AAFormat{AFNumber_Format(0,0,0,0,"",true);} - \AACalculate{% - AFSimple_Calculate("SUM",new Array("tally.\oField")); - }}% + \rawPDF{}\W{1}\BC{0 0 0}\S{I}\textColor{1 0 0 rg} + \Q{2}\Ff{\FfReadOnly} } +% \end{macrocode} +% \DescribeMacro{\sqWeakMsg} The message that appears in an alert box +% when the use has exceeded the weak-pass limit. +% \begin{macrocode} +\flJSStr{\sqWeakMsg}{You have missed too many questions. +After you finish, it is recommended you retake this quiz +with fewer errors and greater understanding.} +% \end{macrocode} +% \DescribeMacro{\sqStrongMsg} The message that appears in an alert box +% when the use has exceeded the strong-pass limit. +% \begin{macrocode} +\flJSStr{\sqStrongMsg}{You have missed too many questions. +We are resetting the quiz. Start over, this time with +fewer errors and greater understanding.} +% \end{macrocode} +% The code that formats the field and if needed, responds to the weak-pass +% or strong-pass parameter. +% \begin{macrocode} +\def\@@sqTallyTotalActions{\AA{% + \AAKeystroke{\dl@EForAF4Number_Keystroke(0,0,0,0,"",true);} + \AAFormat{\dl@EForAF4Number_Format(0,0,0,0,"",true);} + \AACalculate{% + \dl@EForAF4Simple_Calculate("SUM",new Array("tally.\oField"));\r + var sqTlyTotl=event.value; + \ifx\eq@strongpass\@empty + \ifx\eq@weakpass\@empty\else\r +% \end{macrocode} +% \textbf{Weak pass:} When \uif{sqTlyTotl} exceeds \cs{eq@weakpass}, +% an alert message with a message of \cs{sqWeakMsg}. +% \begin{macrocode} + if(sqTlyTotl > \eq@weakpass) {\r\t + if (\oField.sqTlyTotCnt==0)\r\t\t + app.alert(\sqWeakMsg);\r\t + \oField.sqTlyTotCnt++;\r + } + \fi + \else\r +% \end{macrocode} +% \textbf{Strong pass:} When \uif{sqTlyTotl} exceeds \cs{eq@strongpass}, +% an alert message with a message of \cs{sqStrongMsg}, and the whole +% short-quiz is reset. +% \begin{macrocode} + if(sqTlyTotl > \eq@strongpass) {\r\t + app.alert(\sqStrongMsg);\r + \@@sqClearButtonJSCode\r + event.value=0;\r + } + \fi +}}} +% \end{macrocode} +% \begin{macrocode} +\def\@eqweakpass#1{\def\eq@weakpass{#1}} +\def\@eqstrongpass#1{\def\eq@strongpass{#1}} +\let\eq@weakpass\@empty +\let\eq@strongpass\@empty +% \end{macrocode} +% On 2021/05/07, the action of \cs{sqTallyTotal} is enhanced; two special keys-values +% are defined: \cs{weakpass\darg{\ameta{n}}} and \cs{strongpass\darg{\ameta{n}}}. +% For the weak pass, as soon as the student misses more than \ameta{n} questions, +% an alert box message; for the strong pass, an alert message appears and the quiz +% is reset. +% \changes{v8.7.6}{2021/05/07}{Enhanced capabilities of \string\cs{sqTallyTotal}} +% \begin{macrocode} \newcommand\sqTallyTotal[1][]{% + \processAppArgs#1\end\@nil \mbox{\text@@Field{#1}{tallytotal.\oField}{\TBW}% {\DefaultHeightOfWidget}{\eq@protect\AA}% {\eq@setWidgetProps\eq@TextField}% @@ -9020,6 +9200,160 @@ if(event.willCommit) { } % \end{macrocode} % \end{macro} +% +% \subsubsection{The \tops{\protect\cs}{\textbackslash}{sqClearButton} command} +% +% \begin{macro}{\sqClearButton} +% This button will clear the tallyfields and change the color of +% the \cmd{\RespBox} back to \cmd{\defaultColorJS}. The button clears the fields +% based on the current value of \cmd{\oField}. This text macro is +% given its value when the optional parameter in the +% \texttt{shortquiz} environment is specified. +%\changes{v6.3g}{2008/10/13} +%{% +% Fixed a problem with the clear button not setting the boundary color +% back to the default. I must have changed the name of an objective field, +% now, we say \string\texttt{this.getField("obj.\string\cs{oField}")}. +%} +% \begin{macrocode} +\def\sqClearButtonDefaults +{% + \CA{\eq@local@sqClearButton}\textColor{0 g}\F{\FPrint} + \BC{0 0 0}\BG{.7529 .7529 .7529}\W{1}\S{B}\Ff{\FfNoExport} +} +% \end{macrocode} +% In an attempt to supply some custom colors for the shortquiz, we +% define \cmd{\sqRespBoxResetColor}. It determines the clear color +% \changes{v8.6}{2020/11/29}{Rewrote SQ clear button using \string\env{defineJS} env} +% \begin{macrocode} +\begin{defineJS}[\makeesc\*\makecmt\%]{\@@sqClearButtonJSCode} +ProcessIt = false; +if ( typeof *oField == "undefined" ) + *oField = new Object; +if (typeof appAlerts["*oField"] == "undefined") + appAlerts["*oField"] = new Object; +this.resetForm(new Array("mc.*oField","obj.*oField",% +"tally.*oField","grpobj.*oField")); +var f = this.getField("obj.*oField"); +if ( f != null ) f.strokeColor=*ifx*defaultColorJSLoc*@empty% +*defaultColorJS*else*defaultColorJSLoc*fi; +f = this.getField("grpobj.*oField"); +% \end{macrocode} +% Here, we give the user an opportunity to designate the color +% of the response boxes when they are reset by the \cs{sqClearButton}. +% The default is to use \cs{eqDefaultColor}. +% \begin{macrocode} +if ( f != null ) f.strokeColor=*ifx*defaultColorJSLoc*@empty% +*defaultColorJS*else*defaultColorJSLoc*fi; +f = this.getField("rbmarkup.*oField"); +if ( f != null ) f.display=display.hidden; +*oField.Grp = {}; +appAlerts["*oField"].bAfterValue=false; +% \end{macrocode} +% \begin{macrocode} +*oField.sqTlyTotCnt=0; +ProcessIt=true; +\end{defineJS} +\def\@@sqClearButtonActions{\A{\JS{\@@sqClearButtonJSCode}}} +\newcommand\sqClearButton[1][]{% + \mbox{\push@@Button{#1}{clear.\oField}{}{\DefaultHeightOfWidget}% + {\eq@protect\A}{\eq@setButtonProps\eq@Button@driver}% + {\sqClearButtonDefaults\@@sqClearButtonActions\every@ButtonField + \every@sqClearButton}}% +} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{The \tops{\protect\cs}{\textbackslash}{sqSolnBtn} command} +% The default scheme for pointing the student to the soltuion to a MC or MS question +% is through the buttons themselves. For MC, when the student chooses the correct +% answer from the choice field, the page jumps to the soltution page automatically +% (assuming there is a solution); for MS, the same jump does not occur until all +% correct choices are made. +% +% In this section, we introduce an alternate scheme for handling jumps to MC and +% MS questions. +% \changes{v8.7.5}{2021/05/05}{Defined \string\cs{sqSolnBtn}} +% \par\medskip\noindent +% \DescribeMacro{\sqSolnMCMsg} Alert message for MC question +% \begin{macrocode} +\flJSStr{\sqSolnMCMsg}{You must first select the correct +answer to see the solution.} +% \end{macrocode} +% \DescribeMacro{\sqSolnMSMsg} Alert message for MS question +% \begin{macrocode} +\flJSStr{\sqSolnMSMsg}{You must first select all the correct +answers to see the solution.} +% \end{macrocode} +% \DescribeMacro{\sqCorrSolCodeMC} The code for \cs{sqSolnBtn} when the choice +% field is MC +% \begin{macrocode} +\begin{defineJS}[\makeesc\*\makecmt\%]{\sqCorrSolCodeMC} +var qzSolnDest="*@qzsolndest"; +var solnAfter=*ifeq@solutionsafter% +true*else% +false*fi; +var qzSolnDest="*@qzsolndest"; +var f=this.getField("mc.*oField.*thequestionno"); +if(f.value.charAt(0)=="1") { + if ((qzSolnDest!="") && !solnAfter) % +jmpToNamedDest("answer",qzSolnDest,1); +} else app.alert(*sqSolnMCMsg); +\end{defineJS} +% \end{macrocode} +% \DescribeMacro{\sqCorrSolCodeMS} The code for \cs{sqSolnBtn} when the choice +% field is MS +% \begin{macrocode} +\begin{defineJS}[\makeesc\*\makecmt\%]{\sqCorrSolCodeMS} +// multiple selection +var g=this.getField("mc.*oField.*thequestionno"); +var a=g.getArray(); +var qzSolnDest="*@qzsolndest"; +var solnAfter=*ifeq@solutionsafter% +true*else% +false*fi; +var qzSolnDest="*@qzsolndest"; +var f=this.getField("corr.*oField.*thequestionno"); +if ( (qzSolnDest != "") && !solnAfter ) { + for (var i=0; i<a.length; i++){ + if ((a[i].exportValues[0].charAt(0)==1) && % +(!a[i].isBoxChecked(0))) break; + } +} +if (i>=a.length) jmpToNamedDest("*oField","*@qzsolndest",% +*ifx*@sqTurnOffAlerts*eq@Zero0*else1*fi); +else app.alert(*sqSolnMSMsg); +\end{defineJS} +% \end{macrocode} +% The action for \cs{sqSolnBtn} as a function of whether +% this is a MC or MS button. +% \begin{macrocode} +\def\sqCorrSolButtonActionHook{\ifx\aeb@answerType + \aeb@answerType@r\JS{\sqCorrSolCodeMC}\else + \JS{\sqCorrSolCodeMS}\fi +} +% \end{macrocode} +% \DescribeMacro{\sqSolnBtn}\hskip-\marginparsep\texttt{[\ameta{options}]} The +% code for \cs{sqSolnBtn}. This command is usually inserted into the workflow +% through the \cs{answersEndHook} command. +% \begin{macrocode} +\newcommand{\sqSolnBtn}[1][]{% + \def\Fld@name{corr.\oField.\thequestionno}% + \edef\@@CorrSolButtonActions{\noexpand + \A{\noexpand\sqCorrSolButtonActionHook}}% +% \end{macrocode} +% The \cs{sqSolnBtn} button only appears when \cs{@qasolndest} is nonempty. +% \begin{macrocode} + \ifx\@qzsolndest\@empty\else + \mbox{\push@@Button{#1}{\Fld@name}{}{\DefaultHeightOfWidget}% + {\eq@protect\A}{\eq@setButtonProps\eq@Button@driver}% + {\CorrAnsButtonDefaults\@@CorrSolButtonActions + \every@ButtonField\every@CorrAnsButton}}\fi +} +% \end{macrocode} +% +% \subsection{The \tops{\protect\cs}{\textbackslash}{CorrAnsButton} buttons} +% % \begin{macro}{\CorrAnsButton} % The \cmd{\CorrAnsButton} is a button macro which, when pressed, will % display the correct answer for the user. This button is again @@ -9084,7 +9418,8 @@ if(event.willCommit) { % \end{macrocode} % \leavevmode\DescribeMacro{\sqCorrAnsCode} % The JavaScript code for \cs{CorrAnsButton} now in a \env{defineJS} env. -% \changes{v8.6}{2020/11/29}{code for \string\cs{CorrAnsButton} now in a \string\env{defineJS} env} +% \changes{v8.6}{2020/11/29}{code for \string\cs{CorrAnsButton} now in a +% \string\env{defineJS} env} % \begin{macrocode} \begin{defineJS}[\makeesc\!\makecmt\%]{\sqCorrAnsCode} !ifx!@qzsolndest!@empty% @@ -9142,63 +9477,9 @@ else !processJSfunc("obj.!oField.!thequestionno","!CorrectAns",% } % \end{macrocode} % \end{macro} -% \begin{macro}{\sqClearButton} -% This button will clear the tallyfields and change the color of -% the \cmd{\RespBox} back to \cmd{\defaultColorJS}. The button clears the fields -% based on the current value of \cmd{\oField}. This text macro is -% given its value when the optional parameter in the -% \texttt{shortquiz} environment is specified. -%\changes{v6.3g}{2008/10/13 } -%{% -% Fixed a problem with the clear button not setting the boundary color -% back to the default. I must have changed the name of an objective field, -% now, we say \texttt{this.getField("obj.\cs{oField}")}. -%} -% \begin{macrocode} -\def\sqClearButtonDefaults -{% - \CA{\eq@local@sqClearButton}\textColor{0 g}\F{\FPrint} - \BC{0 0 0}\BG{.7529 .7529 .7529}\W{1}\S{B}\Ff{\FfNoExport} -} -% \end{macrocode} -% In an attempt to supply some custom colors for the shortquiz, we -% define \cmd{\sqRespBoxResetColor}. It determines the clear color -% \changes{v8.6}{2020/11/29}{Rewrote SQ clear button using \string\env{defineJS} env} -% \begin{macrocode} -\begin{defineJS}[\makeesc\*\makecmt\%]{\@@sqClearButtonJSCode} -ProcessIt = false; -if ( typeof *oField == "undefined" ) - *oField = new Object; -if (typeof appAlerts["*oField"] == "undefined") - appAlerts["*oField"] = new Object; -this.resetForm(new Array("mc.*oField","obj.*oField",% -"tally.*oField","grpobj.*oField")); -var f = this.getField("obj.*oField"); -if ( f != null ) f.strokeColor=*ifx*defaultColorJSLoc*@empty% -*defaultColorJS*else*defaultColorJSLoc*fi; -f = this.getField("grpobj.*oField"); -% \end{macrocode} -% Here, we give the user an opportunity to designate the color -% of the response boxes when they are reset by the \cs{sqClearButton}. -% The default is to use \cs{eqDefaultColor}. -% \begin{macrocode} -if ( f != null ) f.strokeColor=*ifx*defaultColorJSLoc*@empty% -*defaultColorJS*else*defaultColorJSLoc*fi; -f = this.getField("rbmarkup.*oField"); -if ( f != null ) f.display=display.hidden; -*oField.Grp = {}; -appAlerts["*oField"].bAfterValue=false; -ProcessIt=true; -\end{defineJS} -\def\@@sqClearButtonActions{\A{\JS{\@@sqClearButtonJSCode}}} -\newcommand\sqClearButton[1][]{% - \mbox{\push@@Button{#1}{clear.\oField}{}{\DefaultHeightOfWidget}% - {\eq@protect\A}{\eq@setButtonProps\eq@Button@driver}% - {\sqClearButtonDefaults\@@sqClearButtonActions\every@ButtonField - \every@sqClearButton}}% -} -% \end{macrocode} -% \end{macro} +% +% \subsection{The \tops{\protect\cs}{\textbackslash}{@PromptButton} command} +% % \begin{macro}{\@PromptButton} % The \cs{@PromptButton} is used to create a ``progressive-style'' question (for math fill-in). % Some series of questions build on one another. You can use this button to show the solution @@ -9244,6 +9525,7 @@ if (!isQuizInitialized("*currQuiz")) { \end{defineJS} \def\PromptButtonActionHook{\JS{\PromptButtonActionCode}} % \end{macrocode} +% \DescribeMacro{\@PromptButton}\hskip-\marginparsep\texttt{[\ameta{options}]\darg{\ameta{answer}}} % This button takes the standard two arguments % \begin{flushleft} % \texttt{\#1}: Optional parameters to change the appearance of the field\\ @@ -9275,6 +9557,9 @@ if (!isQuizInitialized("*currQuiz")) { \newcommand{\PromptButton}{\makebox[0pt][r] % assumes xcolor {\@PromptButton[\textColor{1 0 0 rg}]{\CorrectAns}}} % \end{macrocode} +% +% \subsection{The \tops{\protect\env}{}{mathGrp} environment} +% % \begin{environment}{mathGrp} % An environment for enclosing a collection of math/text fill-ins that are to be grouped % together. This grouping should not cross a begin or end of another environment, or include more @@ -10189,7 +10474,7 @@ aCorrectAns[!currQuiz.Grp["!thequestionno"].offset],!oField);!fi %\end{flushleft} % Define a special value (\cs{formatInitAltApprs}) for \cs{AddAAFormat} used in initializing \cs{RespBoxMath} problems, % where there are alternate appearances. -% See the {Acro\!\TeX} Blog article \url{http://www.acrotex.net/blog/?p=1335} for a discussion of the use of \cs{formatInitAltApprs}. +% See the {Acro\negthinspace\TeX} Blog article \url{http://www.acrotex.net/blog/?p=1335} for a discussion of the use of \cs{formatInitAltApprs}. % \changes{v8.1a}{2017/09/03}{Define a special value (\string\cs{formatInitAltApprs}) for \string\cs{AddAAFormat}} % \begin{macrocode} \def\formatInitAltApprs{\formatInitAltApprs} @@ -10277,8 +10562,8 @@ aCorrectAns[!currQuiz.Grp["!thequestionno"].offset],!oField);!fi % %\changes{v6.3b}{2008/06/29} %{ -% Added the \cs{AddAAKeystroke} to the recognizable set of keys. This will be obeyed -% within the optional arguments of \cs{RespBoxMath} and \cs{RespBoxTxt}. +% Added the \string\cs{AddAAKeystroke} to the recognizable set of keys. This will be obeyed +% within the optional arguments of \string\cs{RespBoxMath} and \string\cs{RespBoxTxt}. %} % \begin{macrocode} \def\@eqAddAAKeystroke#1{\def\argi{#1}\ifx\argi\@empty @@ -10419,7 +10704,8 @@ var ok2Continue = true; % from the \texttt{manswer.tex} demo file. Question 1 is a multiple selection question; Question 2 % is a multiple choice question; Question 3 is a math fill-in question; and Question 4 % is a grouped question. (The \texttt{undefined} entries indicate an empty or a not used entry.) -%\begin{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={!()},codes={\catcode`\%=9}] %RightWrong.toSource() %[undefined, [0, 1, [undefined, undefined, 0, 1, 1, 0, 1]], 1, 1, % [undefined, 1, 1, 1, 0]] @@ -10440,7 +10726,7 @@ var ok2Continue = true; % %aPointType.toSource() % [undefined, [2, "mc"], [4, "ms"], [2, "text"], [4, "math"], [4, "grp"]] -%\end{verbatim} +%\end{Verbatim} % \begin{macrocode} var ProcessIt = true; var retn; @@ -10470,9 +10756,9 @@ var aDlLibSpecResp=new Array(\dlLibSpecRespJS); % JSf is an array of supported mathematical functions. %\changes{v6.06}{2007/02/23} %{ -% Separated the \texttt{JSf} array into \texttt{JSfBuiltIn} and \texttt{JSfCustom}. This +% Separated the \string\texttt{JSf} array into \string\texttt{JSfBuiltIn} and \string\texttt{JSfCustom}. This % allows us to identify the built-in JavaScript functions. I concatenate these two -% into \texttt{JSf}. +% into \string\texttt{JSf}. %} % \begin{macrocode} var JSfBuiltIn = new Array @@ -10495,7 +10781,7 @@ var JSfBuiltIn = new Array % recognized properly when implmulti from dljslib is active. I think that % the problem is caused by the fact that arcsin(x) follows sin(x) in the % field of known functions and converted into arc*sin(x) and then into -% a*r*c*sin(x). I enclose the patch for the exerquiz.dtx file which in my +% a*r*c*sin(x). I enclose the patch for the \textsf{exerquiz.dtx} file which in my % opinion solves the problem.'' %} % \begin{macrocode} @@ -10615,8 +10901,8 @@ function CkBalVert(UserInput) % \texttt{UserInput}: a string\\ % Returns: 1 (if there is a match); 0 (if no match) % also sets the global variable \texttt{ok2Continue} to \texttt{false}. -% \changes{v6.4c}{2011/07/01}{Ckfunc now uses a global variable \texttt{\_mathVars} which -% holds the variables of the current \cs{RespBoxMath} being processed. We search +% \changes{v6.4c}{2011/07/01}{Ckfunc now uses a global variable \string\texttt{\_mathVars} which +% holds the variables of the current \string\cs{RespBoxMath} being processed. We search % all substrings containing 2 or more letters; if it consists only of the variables % that substring is OK.} % \begin{macrocode} @@ -10674,10 +10960,7 @@ function DisplayAnswer(fieldname,theanswer) var oQName = new Object; var defaultColor=(typeof oQName.DefaultColorJSLoc=="undefined")% ?\defaultColorJS:oQName.DefaultColorJSLoc; - try { - this.getField(fieldname).value=(theanswer); -% this.getField(fieldname).strokeColor = defaultColor; - } catch(e) {} + try { this.getField(fieldname).value=(theanswer); } catch(e) {} ProcessIt = true; } function EvalCorrAnsButton(fieldname,theanswer) @@ -10867,11 +11150,8 @@ function ParseInput(UserInput) % \end{macrocode} % We make a rough check of the user input, if it has alpha-words of size two or greater % that do not match up against a recognizable function, it must be an error. -% -% (09/07/09) Comment this out so we check for function in both cases, get same alert message % \begin{macrocode} -% if (typeof(Ck4Exponents) == "undefined") - if(!Ckfuncs(UserInput)) return false; + if(!Ckfuncs(UserInput)) return false; % \end{macrocode} % Now try to insert the multiplication operator where applicable. % \begin{macrocode} @@ -10976,22 +11256,21 @@ function ParseInput(UserInput) default: ok2Continue=false; } -% console.println("working.."+UserInput); } if (!ok2Continue) { eqAppAlert(\eqerrBadExp,3); return false; - } - else { + } else { % \end{macrocode} -%\changes{v6.06}{2007/02/23} -%{ -% Now, just before we return the parsed expression, we append all built-in +%(2007/02/23) Just before we return the parsed expression, we append all built-in % JavaScript functions and constants with \texttt{Math.}, this is to avoid -% having to use the \texttt{with(Math)} construct. These changes are in support -% of using scientific notation. -%} +% having to use the \texttt{with(Math)} construct. +%\changes{v6.06}{2007/02/23}{% +% Now, just before we return the parsed expression, we append all built-in +% JavaScript functions and constants with \string\texttt{Math.}, this is to avoid +% having to use the \string\texttt{with(Math)} construct. These changes are in support +% of using scientific notation.} % \begin{macrocode} UserInput=addMathObject(UserInput); return UserInput; @@ -11240,8 +11519,6 @@ indepVars,oComp){ % the combinatorics functions \texttt{C(x,y)} and \texttt{P(x,y)}. % \begin{macrocode} var reCP=/((C|P)\(.+?)(,)(.+?\))/g -% str="P(12,4)" -% reCP.exec(str) UserAns=UserAns.replace(reCP,"$1@c@$4"); % \end{macrocode} % (2012/04/13) Bruce Wagner reports a problem with the user enters an answer containing @@ -11301,37 +11578,31 @@ function processSpecialParse(oParse,UserAns) { if (typeof(_o)=="function") { % \end{macrocode} % If \texttt{oParse} is an object (it should be an array), and the first entry is a function -% then we have: \texttt{priorParse: [myfunction, optional arguments]}. The function is +% then we have: \texttt{priorParse:\,[myfunction, optional arguments]}. The function is % evaluated with the args \texttt{(UserAns, optional args)}. In the code below, we remove % the name of the function at the beginning of the array, and insert the \texttt{UserAns} % in its place. Various syntax variations supported. -%\begin{verbatim} -% priorParse: nodec, -% priorParse: [nodec,noBinFac], -% priorParse: [nodec,noBinFac,[myFunc,arg1, arg2,..]], -%\end{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={!()},codes={\catcode`\%=9}] +%priorParse: nodec, +%priorParse: [nodec,noBinFac], +%priorParse: [nodec,noBinFac,[myFunc,arg1, arg2,..]], +%\end{Verbatim} % \begin{macrocode} -% _o=oParse.shift(); -% oParse.unshift(UserAns); retn=_o(UserAns); -% retn = _o.apply(null,oParse); if (retn==null) return retn; % \end{macrocode} % In this case, we break out of the loop, we don't expect any more properties % for \texttt{priorParse} or \texttt{postParse}. % \begin{macrocode} -% break; } else { % \end{macrocode} % If \texttt{oComp.priorParse[i]} is not a function, it is required to be an array. The first % element of the array is the function, the rest of the entries are the additional arguments % (in addition to \texttt{UserAns}). % \begin{macrocode} -% f=_o.shift(); -% _o.unshift(UserAns); -% retn=f.apply(null,_o); - retn=_o[0].apply(null, [ UserAns ].concat(_o.slice(1))); - if (retn==null) return null; + retn=_o[0].apply(null, [ UserAns ].concat(_o.slice(1))); + if (retn==null) return null; } } } else { @@ -11388,6 +11659,11 @@ CorrAns,userAns,comp) % null if expression was not valid % -1 if expression is not a number % \begin{macrocode} +var ckDZRe=/\b([^0-9]*)(\d*)\./g; +function ckDZReRepl(match,a,b,offset,string){ + if (b[0]!="0") return match; + else return util.printf(a+"\%d.",b); +} function diffCompare(_a,_c,_v,_F,_G) { var aXY = _c.split(","); var _V = _v.split(","); // e.g. _V[0] = "i:x" @@ -11423,10 +11699,31 @@ function diffCompare(_a,_c,_v,_F,_G) { % the JavaScript interpreter does not see them. The other complication is that Acro5 objects % to having a \texttt{return} within an \texttt{eval()}, so we work around that with a % \texttt{rtnCode}. The returns are executed outside the \texttt{eval()}. +% \changes{v8.7.4}{2021/05/03}{Changed logic in \string\texttt{diffCompare()} function} % \begin{macrocode} var rtnCode = 0; +% \end{macrocode} +% JavaScript has problems with numbers that are not properly written. +% If a number has a decimal point, the integer part of the decimal must be blank, a zero (0), +% or must begin with a non-zero number. In the \texttt{String.replace()} method below, +% the regular expression \texttt{ckDZRe} identifies leading digits, and the function +% \texttt{ckDZReRepl} is a replacement function that implements the requirements described above. +% The same changes is made in \texttt{reldiffCompare()} below. +% \begin{macrocode} + _G=_G.replace(ckDZRe,ckDZReRepl); eval("try {if(isNaN(_G = eval(_G))) rtnCode=-1; }" +"catch (e) { rtnCode=1; }"); +% \end{macrocode} +%Below is the code removed on 2021/05/01 for the above two lines. When |_G="00.00"|, for example. +%and |ifNaN(_G = eval(_G))| is executed, a exception is thrown and \texttt{null} is returned; +%even though the string does evaluate to a number, but JavaScript does not recognize it as such. +%As a result, we try an alternate strategy. The same change is made in the function +%\texttt{reldiffCompare()}, below. +%\begin{Verbatim}[xleftmargin=\parindent,codes={\catcode`\%=9}] +%eval("try {if(isNaN(_G = eval(_G))) rtnCode=-1; }" +% +"catch (e) { rtnCode=1; }"); +%\end{Verbatim} +% \begin{macrocode} switch(rtnCode) { case 0: break; @@ -11464,6 +11761,7 @@ function diffCompare(_a,_c,_v,_F,_G) { } % \end{macrocode} % This function is the same as above, but returns the relative absolute error. +% \changes{v8.7.1}{2021/05/01}{Changed logic in \string\texttt{reldiffCompare()} function} % \begin{macrocode} function reldiffCompare(_a,_c,_v,_F,_G) { var aXY = _c.split(","); @@ -11471,16 +11769,17 @@ function reldiffCompare(_a,_c,_v,_F,_G) { var _n = aXY.length for (var _i=0; _i < _n; _i++) { - if (_V[_i].charAt(0) == "r" ) - eval ("var "+_V[_i].charAt(2)+"="+aXY[_i]+";"); - else // assume type "i" - eval ("var "+_V[_i].charAt(2)+"="+Math.ceil(aXY[_i])+";"); + if (_V[_i].charAt(0) == "r" ) + eval ("var "+_V[_i].charAt(2)+"="+aXY[_i]+";"); + else // assume type "i" + eval ("var "+_V[_i].charAt(2)+"="+Math.ceil(aXY[_i])+";"); } _F = eval(_F); if ( app.viewerVersion >= 5) { var rtnCode = 0; - eval("try { if(isNaN(_G = eval(_G))) rtnCode=-1; }" + _G=_G.replace(ckDZRe,ckDZReRepl); + eval("try {if(isNaN(_G = eval(_G))) rtnCode=-1; }" +"catch (e) { rtnCode=1; }"); switch(rtnCode) { @@ -11512,7 +11811,7 @@ function reldiffCompare(_a,_c,_v,_F,_G) { % ]\CorrAnsButton{-4z^3(3z+4)^2} %\end{verbatim} % where \cs{refac}, \cs{repow}, \cs{redigit}, and \cs{rediv} are convenience macros defined -% earlier in \texttt{exerquiz.dtx}. The regular expression describe the form of the answer +% earlier in \textsf{exerquiz.dtx}. The regular expression describe the form of the answer % acceptable. % % There seems to be a redundancy in the usage of \cs{Array}, but this is by design. @@ -11548,7 +11847,6 @@ function denyForm(UserAns, regexpr) { var msg=\defaultReqFormMsg; UserAns = stripWhiteSpace (UserAns); if (!ok2Continue) return null; -% UserAns = stripOutMuli(UserAns); UserAns = ChngAllGrpsToParens(UserAns); if (arguments.length>2) msg=arguments[2]; if (typeof(regexpr.length)=="undefined") { @@ -11838,8 +12136,8 @@ function eqFilter(filterMethod) { case 3: default: % \end{macrocode} -%\changes{v6.4k}{2011/08/17}{Within the function eqFilter, changed \texttt{this} to -% \texttt{this.toString()}. The comparisons were returning false when they shouldn't +%\changes{v6.4k}{2011/08/17}{Within the function eqFilter, changed \string\texttt{this} to +% \string\texttt{this.toString()}. The comparisons were returning false when they shouldn't % this is because in this case, we were comparing objects to objects} % \begin{macrocode} return this.toString(); @@ -11859,9 +12157,6 @@ function checkTheSpelling(targetFieldName) { % field. For the \texttt{spell.checkWord()} method, \app{PDF-XChange Editor} returns \texttt{undefined}. % This (spell checking) is a AR/AA feature only. % \begin{macrocode} -% var fName = "obj"+thisName.substring(3); -% var f=this.getField(fName); -% if (f==null) fName="grpobj"+thisName.substring(3); var f=this.getField(targetFieldName); var value=f.value; var valueStrip = value.replace(/\s+/g,""); @@ -11933,23 +12228,31 @@ function ProcUserResp(key,userresp,probno,notify) fieldPopTbl(a[1]); } } +% \end{macrocode} +% (2021/04/04) Added try/catch to catch exceptions. +% \changes{v8.6.6}{2021/04/04}{Added some try/catch pairs to avoid tossing cookies} +% \begin{macrocode} function ProcUserNoResp(key,userresp,probno,notify) { if ( arguments.length > 4 ) { - RightWrong[probno][arguments[4]] = undefined; - Responses[probno][arguments[4]] = undefined; + try{ + RightWrong[probno][arguments[4]] = undefined; + Responses[probno][arguments[4]] = undefined; + } catch(e){}; var bVoidArray=true; - for (var i=0; i<Responses[probno].length; i++) { - if ( typeof Responses[probno][i] != "undefined") { - bVoidArray=false; - break; - } - } - if (bVoidArray) { - Responses[probno]=undefined; - RightWrong[probno]=undefined; + try { + for (var i=0; i<Responses[probno].length; i++) { + if ( typeof Responses[probno][i] != "undefined") { + bVoidArray=false; + break; + } + } + } catch(e){}; + if (bVoidArray) { + Responses[probno]=undefined; + RightWrong[probno]=undefined; ProbValue[probno]=undefined; - } + } } else { RightWrong[probno] = undefined; Responses[probno] = undefined; @@ -12182,8 +12485,8 @@ function DisplayQuizResults(qtfield,nPointTotal,nQuestions) % (2021/02/17) If there is a fourth argument for this function, it should % be either \texttt{true} or \texttt{false}; if \texttt{true}, \texttt{DisplayQuizResults()} % does not display quiz results; the default is \texttt{false}. This feature is used in the -% demo file \texttt{qz-pin-to-correct.tex} found on the {Acro\!\TeX} Blog. -% \changes{v8.6.4}{2021/02/17}{Added conditional (\texttt{\_bSilent})} +% demo file \texttt{qz-pin-to-correct.tex} found on the {Acro\negthinspace\TeX} Blog. +% \changes{v8.6.4}{2021/02/17}{Added conditional (\string\texttt{\_bSilent})} % \begin{macrocode} var _bSilent=(arguments.length > 3 ) ? arguments[3] : false; if (!_bSilent) { diff --git a/texmf-dist/source/latex/acrotex/exerquiz.ins b/texmf-dist/source/latex/acrotex/exerquiz.ins index f8e05e42..94dc361a 100644 --- a/texmf-dist/source/latex/acrotex/exerquiz.ins +++ b/texmf-dist/source/latex/acrotex/exerquiz.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright 1999-2020 D. P. Story +%% Copyright 1999-2021 D. P. Story %% %% This file is part of the `AcroTeX eDucation Bundle'. %% ------------------------------------------- @@ -50,6 +50,7 @@ \file{aebrandom.def}{\from{exerquiz.dtx}{copyright,randomize}} \file{aebsumrytbls.def}{\from{exerquiz.dtx}{copyright,sumrytbls}} \file{usemcfi.def}{\from{exerquiz.dtx}{copyright,mcfi}} + \file{rbmintrvl.def}{\from{exerquiz.dtx}{copyright,rbmIntrvl}} \file{eqcolor.def}{\from{exerquiz.dtx}{copyright,eqcolor}} \file{template.def}{\from{exerquiz.dtx}{copyright,template}} \file{eqfr.def}{\from{exerquiz.dtx}{copyright,eqfr}} diff --git a/texmf-dist/source/latex/acrotex/insdljs.dtx b/texmf-dist/source/latex/acrotex/insdljs.dtx index a13d72c4..8df24984 100644 --- a/texmf-dist/source/latex/acrotex/insdljs.dtx +++ b/texmf-dist/source/latex/acrotex/insdljs.dtx @@ -16,10 +16,15 @@ %</copyright> %<package>\NeedsTeXFormat{LaTeX2e} %<package>\ProvidesPackage{insdljs} -%<package> [2021/02/07 v2.5.2 Insert Document Level JavaScripts (dps)] +%<package> [2021/05/10 v2.5.3 Insert Document Level JavaScripts (dps)] %<*driver> \documentclass{ltxdoc} \usepackage[colorlinks,hyperindex=false]{hyperref} +\usepackage{fancyvrb} +\makeatletter +\let\@latex@warning@no@line\@gobble +\renewcommand{\paragraph}{\@startsection{paragraph}{4}{0pt}{6pt}{-3pt}{\bfseries}} +\makeatother \usepackage{makeidx} \makeindex \def\EXPT{!} @@ -33,6 +38,7 @@ \let\opt\texttt \let\app\textsf \let\pkg\textsf +\let\uif\textsf \def\visispace{\symbol{32}} \def\ameta#1{\ensuremath{\langle\textit{\texttt{#1}}\rangle}} \def\meta#1{\textsl{\texttt{#1}}} @@ -84,31 +90,26 @@ % \subsection{The \texttt{insDLJS} Environment} % % The following is a quick illustration of the use of the new environment. -% \begin{verbatim} -% \documentclass{article} -% \usepackage[pdftex]{hyperref} -% \usepackage[pdftex]{insdljs} -% -% \newcommand\tugHello{Welcome to TUG 2001!} -% -% \begin{insDLJS}[HelloWorld]{mydljs}{My Private DLJS} -% function HelloWorld() -% { -% app.alert("\tugHello", 3); -% } -% \end{insDLJS} -% \begin{document} -% \begin{Form} % needed for \PushButton -% -% \section{Test of the \texttt{insDLJS} Package} -% -% % use built in form button of hyperref -% Push \PushButton[name=myButton, -% onclick={HelloWorld();}]{Button} -% -% \end{Form} -% \end{document} -% \end{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={!~@},codes={\catcode`\%=9}] +%\documentclass{article} +%\usepackage{hyperref} +%\usepackage{insdljs} +%\newcommand\tugHello{Welcome to TUG 2001!} +%\begin{insDLJS}[HelloWorld]{mydljs}{My Private DLJS} +%function HelloWorld(){app.alert("\tugHello", 3);} +%\end{insDLJS} +%\begin{document} +%\begin{Form} !%!textsf~ needed for !cs~PushButton@@ +% +%\section{Test of the \textsf{insDLJS} Package} +% +%!%!textsf~ use the built-in form button of hyperref@ +%Push \PushButton[name=myButton,onclick={HelloWorld();}]{Button} +% +%\end{Form} +%\end{document} +%\end{Verbatim} % This environment takes three parameters, the first of which is required % for users of \texttt{dvips} and \texttt{dvipsone} and optional otherwise. % Within the environment, `|\|', is the escape character, and `|%|' is the comment @@ -122,16 +123,16 @@ % within the JavaScript. When the \texttt{debug} option is used, the markers % show up in the document level JavaScript; otherwise, they are not written % to the PDF document. Here is a simple example, -% \begin{verbatim} -%\begin{insDLJS}[HelloWorld]{mydljs}{My Private DLJS} -%function HelloWorld() -%{ -% app.alert("\tugHello", 3); -% var x = "\\"; -%\db console.println("Entered HelloWorld function and x = " + x);\db% +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={*~@},codes={\def\1{\quad}\catcode`\%=9}] +%\begin{insDLJS}{mydljs}{My Private DLJS} +%function HelloWorld() { +%*1app.alert("\tugHello", 3); +%*1var x = "\\"; +%\db console.println("Entered HelloWorld function and x = " + x);\db!% %} %\end{insDLJS} -%\end{verbatim} +%\end{Verbatim} % The last line of the function will appear in the DLJS if compiled under % the \texttt{debug} option; otherwise, it is removed. Additional discussion % of this debugging device is given below. @@ -141,34 +142,34 @@ % This package also defines an \cs{OpenAction} command to introduce actions that are % executed when the PDF document is opened on page~1. The open action command only % applies to page~1. -% \begin{flushleft} -% \textbf{Usage} -%\begin{verbatim} +%\paragraph*{Usage} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%codes={\catcode`\%=9}] %\OpenAction{/S/JavaScript/JS(app.alert("Hello World!");)} -%\end{verbatim} -% \end{flushleft} -% The package defines a |\JS| that takes one argument. The code |\JS{#1}| expands to -% |/S/JavaScript/JS (#1)|, and so the above example may be written as -% \begin{flushleft} -%\begin{verbatim} +%\end{Verbatim} +% The package defines a \cs{JS} command that takes one argument. The code |\JS{#1}| expands to +% |/S/JavaScript/JS (#1)|, and so the above example may be written as, +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%codes={\catcode`\%=9}] %\OpenAction{\JS{app.alert("Hello World!");}} -%\end{verbatim}% -%\end{flushleft} +%\end{Verbatim}% % Multiple JavaScript commands can be entered. For nice formatting use \cs{r} % and \cs{t} for carriage return and tab, respectively. %\goodbreak -%\begin{verbatim} -%\OpenAction{\JS{% -% app.alert("Hello World!");\r -% app.alert("Good Day to You!"); +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={*~@},codes={\def\1{\quad}\catcode`\%=9}] +%\OpenAction{\JS{*% +%*1app.alert("Hello World!");\r +%*1app.alert("Good Day to You!"); %}} -%\end{verbatim} +%\end{Verbatim} % The open actions are placed in a token list. Additional actions are added to the token list, so % you say -%\begin{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={*~@},codes={\def\1{\quad}\catcode`\%=9}] %\OpenAction{\JS{app.alert("Hello World!");}} %\OpenAction{\JS{app.alert("Good Day to You!");}} -%\end{verbatim} +%\end{Verbatim} % the two messages will appear each time you open page~1 of the document. % % In the case of users of the distiller, \textsf{insdljs} uses this mechanism to @@ -181,15 +182,15 @@ % % Let me describe in rough terms what goes on behind the scenes. In the discussion % below, the following example will be used: -%\begin{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={*~@},codes={\def\1{\quad}\catcode`\%=9}] %\newcommand\tugHello{"Hello World!"} -%\begin{insDLJS}[HelloWorld]{mydljs}{My Private DLJS} -%function HelloWorld() -%{ -% app.alert("\tugHello", 3); +%\begin{insDLJS}{mydljs}{My Private DLJS} +%function HelloWorld(){ +%*1app.alert("\tugHello", 3); %} %\end{insDLJS} -%\end{verbatim} +%\end{Verbatim} % % \subsubsection{For the \texttt{pdftex} and \texttt{dvipdfm} Options} % @@ -251,16 +252,16 @@ % that function. However, if you can declare variables and initialize them at the document level outside % of a function, these variables will have document wide scope. Throughout the document, the values of these % global variables are known. For example -%\begin{verbatim} -%\begin{insDLJS}[HelloWorld]{mydljs}{My Private DLJS} -%var myVar = 17; // defined outside a function, global scope -%function HelloWorld() -%{ -% var x = 3; // defined inside a function, local scope -% app.alert("\tugHello", 3); +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={*~@},codes={\def\1{\quad}\catcode`\%=9}] +%\begin{insDLJS}{mydljs}{My Private DLJS} +%var myVar = 17; //*textsf~ defined outside a function, global scope@ +%function HelloWorld(){ +%*1var x = 3; //*textsf~ defined inside a function, local scope@ +%*1app.alert("\tugHello", 3); %} -% \end{insDLJS} -%\end{verbatim} +%\end{insDLJS} +%\end{Verbatim} % Both the function \texttt{HelloWorld()} and the variable \texttt{myVar} are known throughout % the document. The function \texttt{HelloWorld()} can be called by a mouse up button action; % some form field, executing some JavaScript, may access the value of \texttt{myVar} and/or @@ -348,34 +349,36 @@ % % The following environment, defines a command \cs{myCmd} what expands to the verbatim % contents of the environment. -%\begin{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={!()},codes={\catcode`\%=9}] %\begin{defineJS}{\myCmd} -% ... -% <JavaScript code> -% ... +%... +%!ameta(JavaScript code) +%... %\end{defineJS} -%\end{verbatim} +%\end{Verbatim} % % There is also a \textsf{localJS} environment that makes any definitions within the % environment local. % %The following examples uses some macros from the \textsf{eforms} package: -%\begin{verbatim} -% % Define a text macro that will be expanded from within the -% % defineJS environment +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={*~$},codes={\def\1{\quad}\catcode`\%=9}] +%*%*uif~ Define a text macro that will be expanded from within$ +%*%*uif~ the *env~defineJS$ environment$ %\def\HelloWorld{Hello World} -% % Now define some JavaScript to execute with a button to be created. -% % We enclose the defineJS and the \pushButton in the localJS environment -% % That way, the macro definitions, \JSA, \JSAAE, \JSAAX will be local to -% % this group +%*%*uif~ Now define some JavaScript to execute with a button to be created.$ +%*%*uif~ We enclose the *env~defineJS$ and the *cs~pushButton$ in the *env~localJS$ environment$ +%*%*uif~ That way, the macro definitions, *cs~JSA$, *cs~JSAAE$, *cs~JSAAX$ will be local to$ +%*%*uif~ this group$ %\begin{localJS} -% % Make @ the escape so we can demonstrate the optional parameter. -%\begin{defineJS}[\catcode`\@=0\relax]{\JSA} +%*%*uif~ Make @ the escape so we can demonstrate the optional parameter.$ +%\begin{defineJS}[\makeesc\@]{\JSA} %var sum = 0; %for (var i = 0; i < 10; i++) %{ -% sum += i; -% console.println("@HelloWorld i = " + i ); +%*1sum += i; +%*1console.println("@HelloWorld i = " + i ); %} %console.println("sum = "+sum); %\end{defineJS} @@ -385,13 +388,14 @@ %\begin{defineJS}{\JSAAX} %console.println("Exiting the button area"); %\end{defineJS} -%\pushButton[% -% \A{\JS{\JSA}} -% \AA{\AAMouseEnter{\JS{\JSAAE}} -% \AAMouseExit{\JS{\JSAAX}}} +%\pushButton[*% +%*1\A{\JS{\JSA}} +%*1\AA{\AAMouseEnter{\JS{\JSAAE}} +%*1*1 \AAMouseExit{\JS{\JSAAX}} +%*1} %]{myButton}{30bp}{15bp} %\end{localJS} -%\end{verbatim} +%\end{Verbatim} % % See the section \Nameref{defineJS} for details of these two environments. % \section{Package Options and Requirements} @@ -445,6 +449,16 @@ \let\dl@YES=y \let\dl@NO=n \let\dl@One=1 \let\dl@Zero=0 \let\dljs@YES=y \let\dljs@NO=n +\edef\dl@restoreCats{% + \catcode`\noexpand\"=\the\catcode`\"\relax + \catcode`\noexpand\'=\the\catcode`\'\relax + \catcode`\noexpand\,=\the\catcode`\,\relax + \catcode`\noexpand\(=\the\catcode`\(\relax + \catcode`\noexpand\!=\the\catcode`\!\relax + \catcode`\noexpand\_=\the\catcode`\_\relax +} +\@makeother\"\@makeother\'\@makeother\,% +\@makeother\(\@makeother\!\@makeother\_ % \end{macrocode} % \leavevmode\DescribeMacro{\dlpkgInfo} A command to identify package date % from within document level Javascript @@ -531,7 +545,7 @@ % The option \texttt{!reqis} turns off this feature; that is, there is no notification % via the \textsf{YMB} (\textsf{Yellow Message Bar}) that Javascripts are used in the document, and the % document may not function as designed. -% \changes{v2.2d}{2016/04/06}{Added \texttt{reqjs} and \texttt{{\string\quotechar}reqjs}.} +% \changes{v2.2d}{2016/04/06}{Added \string\texttt{reqjs} and \string\texttt{{\string\EXPT}reqjs} options.} % \begin{macrocode} \DeclareOptionX{reqjs}{\let\dl@reqJS\dl@YES} \let\dljs@reqJS\dl@YES @@ -659,7 +673,7 @@ % \end{macrocode} % If \texttt{reqjs} is in effect, we execute the following code, otherwise, we % do not. The \textbf{\textsf{Requirements}} dictionary goes in the document \textbf{\textsf{Catalog}}. -% \changes{v2.2d}{2016/04/06}{Code to support \texttt{reqjs} and \texttt{{\string\EXPT}reqjs} options.} +% \changes{v2.2d}{2016/04/06}{Code to support \string\texttt{reqjs} and \string\texttt{{\string\EXPT}reqjs} options.} % \begin{macrocode} \def\AEB@psMrk{[%] \space} @@ -671,7 +685,7 @@ \fi % \end{macrocode} % Added switch to mark whether djs is inserted -% \changes{v2.4}{2018/07/21}{Added switch}{Added \cs{ifthereisdjs}} +% \changes{v2.4}{2018/07/21}{Added switch}{Added \string\cs{ifthereisdjs}} % \begin{macrocode} \newif\ifthereisdjs \thereisdjsfalse \def\applydljs#1{\ifthereisdjs\else#1 @@ -738,19 +752,16 @@ % % Again, both JavaScript and \TeX, certain punctuation marks have special meaning; in the case of % JavaScript, punctuation has a special meaning within regular expressions: -%\begin{flushleft} -%\textbf{Special Punctuation in Regular Expressions} +%\paragraph*{Special Punctuation in Regular Expressions} %\begin{verbatim} % ^ $ . * + ? = ! : | \ / ( ) [ ] { } %\end{verbatim} -%\end{flushleft} -% % Complications continued. The distiller method (the \texttt{dvipsone} or the % \texttt{dvips} option), and the \textsf{pdftex}/\textsf{dvipdfm} applications % handle the backslash differently. The following example illustrates the problem. % {\small %\begin{verbatim} -%dvipsone/dvips +%dvips %LaTeX Source As appears in PDF %var x = "\"; --> var x = "\"; (SyntaxError: Unterminated string literal) %var x = "\\"; --> var x = "\\"; (Correct) @@ -761,7 +772,7 @@ % `\verb+\\+' to get the single backslash. % {\small %\begin{verbatim} -%pdftex/dvipdfm +%pdftex/xetex %LaTeX Source As appears in PDF %var x = "\"; --> var x = ""; (\" is the literal ") %var x = "\\"; --> var x = "\"; (SyntaxError: Unterminated string literal) @@ -776,16 +787,17 @@ % and to adjust their definitions depending on the driver option. As a result, of these % background definitions, the JavaScript writer does not worry too much about these details, % for example -%\begin{verbatim} -%\begin{insDLJS}[HelloWorld]{mydljs}{My Private DLJS} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={*~@},codes={\def\1{\quad}\catcode`\%=9}] +%\begin{insDLJS}{mydljs}{My Private DLJS} %function HelloWorld() %{ -% app.alert("\tugHello", 3); -% var x = "\\"; -% app.alert("x = " + x); +%*1app.alert("\tugHello", 3); +%*1var x = "\\"; +%*1app.alert("x = " + x); %} %\end{insDLJS} -%\end{verbatim} +%\end{Verbatim} % So much for the complication. % %\subsection{Begin Code} @@ -828,7 +840,7 @@ % \end{macrocode} % \end{macro} % \begin{macro}{\Thread}\hskip-\marginparsep\texttt{\darg{\ameta{thread-title}}} -% \changes{v2.4.9}{2020/07/09}{Added \string\Thread} +% \changes{v2.4.9}{2020/07/09}{Added \string\cs{Thread}} % A thread action; this command is used in the \pkg{artthreads} package. % \begin{macrocode} \providecommand{\Thread}[1]{/S/Thread/D(#1)} @@ -841,7 +853,7 @@ % \end{macrocode} % \end{macro} % \begin{macro}{\Launch}\hskip-\marginparsep\texttt{\darg{\ameta{file-spec}}} -% \changes{v2.5}{2020/12/20}{Added \string\Launch} +% \changes{v2.5}{2020/12/20}{Added \string\cs{Launch}} % A launch action % \begin{macrocode} \providecommand{\Launch}[1]{/Launch/F(#1)} @@ -894,7 +906,7 @@ % A help macro to define \cs{dfnJSR} in a convenient way; \cs{dfnJSR} is % used in the \env{defineJS} environment. % \changes{v2.5}{2020/12/20}{Helper commands \string\cs{dfnJSCR} to define -% \string\cs{defineJSjsR} and \cs{dfnJSCRDef} to set default.} +% \string\cs{defineJSjsR} and \string\cs{dfnJSCRDef} to set default.} % \begin{macrocode} \def\dfnJSCR#1{\gdef\dfnJSR{#1}\gdef\defineJSjsR{#1}} \def\dfnJSCRDef{\dfnJSCR{\string\r\eqbs^^J}} @@ -903,7 +915,7 @@ % \end{macrocode} % \cs{r} is recognized by hyperref when \cs{pdfstringdef} is used. Hyperref % then modifies the expansion of \cs{r}. So, we'll use \cs{n} in those situations. -% \changes{v2.0l}{2012/11/10}{Added \cs{jsN}} +% \changes{v2.0l}{2012/11/10}{Added \string\cs{jsN}} % \begin{macrocode} \def\jsN{\string\n} {\catcode`\^^I\active % @@ -917,6 +929,12 @@ \newwrite\js@verbatim@out \def\iwvo#1{\immediate\write\js@verbatim@out{#1}} % \end{macrocode} +% \paragraph*{Convenience command\DescribeMacro{\dl@EForAF4} that support \opt{usealtadobe} option.} This helper +% command make it convenient to switch from the `AF' to the `EF' versions. +% \changes{v2.5.3}{2021/05/10} +% \begin{macrocode} +\def\dl@EForAF4#1_{\ifx\usedAdbFuncs\dl@YES EF\else AF\fi#1_} +% \end{macrocode} % \subsection{Some JavaScript Support} % % \begin{macro}{\flJSStr} @@ -931,10 +949,10 @@ % should the need arise. %\changes{v2.0b}{2008/06/19} %{ -% A simple command for creating JS strings with unicode \cs{uXXXX}. +% A simple command for creating JS strings with unicode \string\cs{uXXXX}. %} -% \changes{v2.0m}{2013/12/23}{Added \cs{jscsDflt} and \cs{jscsDLJS}, incorporated into \cs{dl@defJSStr}.} -% Added \cs{jscsDflt} and \cs{jscsDLJS}, incorporated them into \cs{dl@defJSStr}. +% \changes{v2.0m}{2013/12/23}{Added \string\cs{jscsDflt} and \string\cs{jscsDLJS}, incorporated into \string\cs{dl@defJSStr}.} +% Added \string\cs{jscsDflt} and \string\cs{jscsDLJS}, incorporated them into \string\cs{dl@defJSStr}. % \begin{macrocode} \def\dl@lparen{(}\def\dl@rparen{)} \def\genericNL{^^J} @@ -1043,9 +1061,10 @@ % \begin{macro}{\db}\hskip-\marginparsep{\,\texttt{...\cs{db}}} % The \cs{db} macro can be used within the \texttt{insDLJS} to insert % addition JS commands to help debug the code. Usage: -%\begin{verbatim} -% \db console.println("myVal = " + myVal);\db% -%\end{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={*~@},codes={\def\1{\quad}\catcode`\%=9}] +%\db console.println("myVal = " + myVal);\db*% +%\end{Verbatim} % Any material (on one line) that is between the two \verb+\db+ will either be % written to the DLJS (if \cmd{\dljs@debug} expands to \texttt y), or be removed from % the final output (if \cmd{\dljs@debug} does not expand to \texttt y). @@ -1171,9 +1190,10 @@ % direct (almost) all auxiliary files of insDLJS to the specified % path. The macro takes one parameter, a path on your local hard % disk. Usage: -%\begin{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={*~@},codes={\def\1{\quad}\catcode`\%=9}] %\insPath{c:/temp/} -%\end{verbatim} +%\end{Verbatim} % Be sure to use only forward slashes, and don't forget to finish % the string with a final forward slash, as illustrated above. % @@ -1195,7 +1215,7 @@ % or link (see \cs{eq@setButtonProps} and \cs{eq@setWidgetProps}). % They are used for formatting JavaScript code. The command % \cs{makespecialJS} is defined in \textsf{insdljs}. -% \changes{v2.1}{2015/06/15}{Moved \cs{makeJSspecials} from \textsf{eforms} +% \changes{v2.1}{2015/06/15}{Moved \string\cs{makeJSspecials} from \string\textsf{eforms} % to here.} % \begin{macrocode} \begingroup @@ -1207,13 +1227,13 @@ \def\\{\eqbs\eqbs}% % define \\ to be \\ \let\jslit\string % \end{macrocode} -% \changes{v2.0n}{2014/05/20}{Remake the definition of \cs{\char`\{} and \cs{\char`\}}} +% \changes{v2.0n}{2014/05/20}{Remake the definition of \string\cs{\char`\{} and \string\cs{\char`\}}} % In an attempt to avoid the use of \verb~\jslit\{~ and \verb~\jslit\}~, we remake % the definition of \verb~\{} and \verb~\}~. % \begin{macrocode} \let\{\dl@lBrace\let\}\dl@rBrace % \end{macrocode} -% \changes{v2.1}{2015/07/12}{\cs{let} \cs{u} to \cs{@empty}.} +% \changes{v2.1}{2015/07/12}{\string\cs{let} \string\cs{u} to \string\cs{@empty}.} % \cs{let} \cs{u} to \cs{@empty}. % \begin{macrocode} \let\u\@empty @@ -1226,8 +1246,8 @@ % various action-types may be executed. These actions occur before the document JavaScripts % are read and before any pages are opened. We give support for this event, originally part % of the \textsf{aeb\_pro} package. -%\changes{v2.1}{2015/06/15}{Moved definition of \cs{addToDocOpen} from -% \textsf{aeb\_pro} to \textsf{insdljs}, added support for \texttt{pdftex} and \texttt{xetex} +%\changes{v2.1}{2015/06/15}{Moved definition of \string\cs{addToDocOpen} from +% \textsf{aeb\_pro} to \textsf{insdljs}, added support for \string\texttt{pdftex} and \string\texttt{xetex} % options.} % \paragraph*{Page views} % The view can be set when the page key is used. Possible values are @@ -1263,10 +1283,11 @@ % with different action-types. Must be executed in the preamble or it has no effect. % It populates the value of the key \textbf{/OpenAction} in the \textbf{Catalog} of the % PDF file. -%\begin{verbatim} -% \addToDocOpen{\JS{console.println("Open the doc!");}} -% \addToDocOpen{/S/GoTo/D[\Page{2}\fitpage]} -%\end{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={*~@},codes={\def\1{\quad}\catcode`\%=9}] +%\addToDocOpen{\JS{console.println("Open the doc!");}} +%\addToDocOpen{/S/GoTo/D[\Page{2}\fitpage]} +%\end{Verbatim} % \begin{macrocode} \newcommand{\addToDocOpen}[1]{% \ifx\aebpFA\dl@NO @@ -1309,7 +1330,7 @@ % If \textsf{aeb\_pro} is not loaded, we set the open actions. If \textsf{aeb\_pro} % is loaded, we do nothing for \textsf{aeb\_pro} has its own contributions to the % PDF \textbf{Catalog}. -% \changes{v2.3d}{2017/01/08}{Use \cs{aebpFA} to detect open actions} +% \changes{v2.3d}{2017/01/08}{Use \string\cs{aebpFA} to detect open actions} % \begin{macrocode} \@ifpackageloaded{aeb_pro}{} {\AtBeginDocument{\ifx\aebpFA\dl@YES\expandafter @@ -1384,10 +1405,11 @@ % Distiller (dvipsone and dvips users of the distiller), if additional open page action % is needed on the first page, you can insert this action using the \cmd{\nextOAction} command. % -%\medskip\noindent Usage -%\begin{verbatim} -% \OpenAction{\JS{app.beep(-1); app.alert("Welcome to my Page!",3);}} -%\end{verbatim} +%\paragraph*{Usage} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={*~@},codes={\def\1{\quad}\catcode`\%=9}] +%\OpenAction{\JS{app.beep(-1); app.alert("Welcome to my Page!",3);}} +%\end{Verbatim} % The macro takes two parameters, the \cmd{\Next} followed by the desired action, in this % case it is a JavaScript action. % @@ -1395,17 +1417,19 @@ % is a \cmd{\Next}, additional code is entered into the open page action. Thus, for example, the % following code is effectively the same as the above example, but the individual lines are % listed separately in the GUI action dialog of Acrobat. -%\begin{verbatim} -% \OpenAction{\JS{app.beep(-1);}} -% \Next{\JS{app.alert("Welcome to my Page!",3);}} -%\end{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={*~@},codes={\def\1{\quad}\catcode`\%=9}] +%\OpenAction{\JS{app.beep(-1);}} +%\Next{\JS{app.alert("Welcome to my Page!",3);}} +%\end{Verbatim} % In the above example, several open page actions are ``chained'' together. % % You are not restricted to JavaScript actions, for example, you can perform a \texttt{Named} % action: -%\begin{verbatim} -% \OpenAction{/S/Named/N/Open} -%\end{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={*~@},codes={\def\1{\quad}\catcode`\%=9}] +%\OpenAction{/S/Named/N/Open} +%\end{Verbatim} % There is a |\Named| command that expands to |/S /Named /N#1|, so the above % example can be written %\begin{verbatim} @@ -1554,40 +1578,39 @@ % within the environment, eventually ends up in the DLJS section of the % PDF document % -% The environment takes the \texttt{<base\_name>} and writes the -% file \texttt{<base\_name>.djs}. This file contains a verbatim +% The environment takes the \texttt{\ameta{base\_name}} and writes the +% file \texttt{\ameta{base\_name}.djs}. This file contains a verbatim % listing of the JS within the environment, plus some changing of % catcodes. This file is then input back into the document at % \cmd{\AtBeginDocument} with the necessary code for % \textsf{pdftex} and \textsf{dvipdfm} properly place the JS. % % The case of \textsf{dvipsone} and \textsf{dvips} is a little different. A -% \texttt{<base\_name>.djs} is written and input back, and a second file -% \texttt{<base\_name>.fdf} is written. This second file is later input +% \texttt{\ameta{base\_name}.djs} is written and input back, and a second file +% \texttt{\ameta{base\_name}.fdf} is written. This second file is later input % into the PDF document after distillation. % % The syntax of usage for this environment, which takes three -% arguments, is given next. -%\begin{verbatim} -% \begin{insDLJS}[<function>]{<base_name>}{<script_name>} -% <JavaScript functions or exposed code> -% ... -% ... -% \end{insDLJS} -%\end{verbatim} +% arguments, is given next.\goodbreak +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={!()},codes={\def\1{\quad}\catcode`\%=9}] +%\begin{insDLJS}[!ameta(function)]{!ameta(base_name)}{!ameta(script_name)} +%!1!ameta(JavaScript functions or exposed code) +%\end{insDLJS} +%\end{Verbatim} % where, % \begin{description} -% \item[\texttt{\#1:}] This optional parameter, \texttt{<function>}, -% is \emph{required} for the \texttt{dvipsone} and \texttt{dvips} -% options; otherwise it is ignored. Its value must be the name of +% \item[\texttt{\#1:}] This optional legacy parameter, its use is discouraged. +% Its value must be the name of % one of the functions defined in the environment. This is used to -% detect whether the DLJS has already be loaded by Acrobat. -% \item[\texttt{\#2}:] This parameter, \texttt{<base\_name>}, is an +% detect whether the DLJS has already be loaded by Acrobat. This parameter +% is now automatically created. +% \item[\texttt{\#2}:] This parameter, \ameta{base\_name}, is an % alphabetic word with no spaces and limited to eight characters. It % is used to build the names of auxiliary files and to build the % names of macros used by the environment. -% \item[\texttt{\#3}:] The \texttt{<script\_name>} of your JavaScript. -% This title will appear in the Documentlevel JavaScript dialog of +% \item[\texttt{\#3}:] The \ameta{script\_name} of your JavaScript. +% This title will appear in the document-level JavaScript dialog of % Acrobat. % \end{description} % Within the insDLJS environment, there are two types of comment characters: @@ -1598,7 +1621,7 @@ % the percent character in a JavaScript statement, for example % |app.alert("\%.2f", 3.14159);|, this statement will appear within your JavaScript % code as |app.alert("%.2f", 3.14159);|. -% \changes{v2.2c}{2015/11/13}{Turned \cs{Hy@unicodefalse} so unicode is not written +% \changes{v2.2c}{2015/11/13}{Turned \string\cs{Hy@unicodefalse} so unicode is not written % in the name of the script.} % \begin{macrocode} \let\insdljsloadVar\@empty @@ -1625,20 +1648,20 @@ \ifx\csname dljs\dljsBase\endcsname\relax \else\@insjserrDuplicate\fi \ifcase\dljs@drivernum - \let\insert@DLJS=\insert@DLJS@pdfmark - \let\endinsDLJS=\endinsert@DLJS@pdfmark - \let\newsegment=\newsegment@pdfmark - \let\endnewsegment=\endnewsegment@pdfmark + \let\insert@DLJS\insert@DLJS@pdfmark + \let\endinsDLJS\endinsert@DLJS@pdfmark + \let\newsegment\newsegment@pdfmark + \let\endnewsegment\endnewsegment@pdfmark \or - \let\insert@DLJS=\insert@DLJS@pdftex - \let\endinsDLJS=\endinsert@DLJS@pdftex - \let\newsegment=\newsegment@pdftex - \let\endnewsegment=\endnewsegment@pdftex + \let\insert@DLJS\insert@DLJS@pdftex + \let\endinsDLJS\endinsert@DLJS@pdftex + \let\newsegment\newsegment@pdftex + \let\endnewsegment\endnewsegment@pdftex \or - \let\insert@DLJS=\insert@DLJS@dvipdfm - \let\endinsDLJS=\endinsert@DLJS@dvipdfm - \let\newsegment=\newsegment@dvipdfm - \let\endnewsegment=\endnewsegment@dvipdfm + \let\insert@DLJS\insert@DLJS@dvipdfm + \let\endinsDLJS\endinsert@DLJS@dvipdfm + \let\newsegment\newsegment@dvipdfm + \let\endnewsegment\endnewsegment@dvipdfm \fi \insert@DLJS }{} @@ -1659,23 +1682,22 @@ % different \textsl{script names}. % % The syntax is -%\begin{verbatim} -% \begin{insDLJS*}[<function>]{<base_name>} -% \begin{newsegment}{<script_name>} -% <JavaScript functions or exposed code> -% \end{newsegment} -% \begin{newsegment}{<script_name>} -% <JavaScript functions or exposed code> -% \end{newsegment} -% ... -% ... -% <JavaScript functions or exposed code> -% \end{newsegment} -% \begin{newsegment}{<name_name>} -% <JavaScript functions or exposed code> -% \end{newsegment} -% \end{insDLJS*} -%\end{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={!()},codes={\def\1{\quad}\catcode`\%=9}] +%\begin{insDLJS*}[!ameta(function)]{!ameta(base_name)} +%\begin{newsegment}{!ameta(script_name)} +%!1!ameta(JavaScript functions or exposed code) +%\end{newsegment} +%\begin{newsegment}{!ameta(script_name)} +%!1!ameta(JavaScript functions or exposed code) +%\end{newsegment} +%... +%... +%\begin{newsegment}{<script_name>} +%!1!ameta(JavaScript functions or exposed code) +%\end{newsegment} +%\end{insDLJS*} +%\end{Verbatim} % where, % \begin{description} % \item[\texttt{\#1:}] This optional parameter, \texttt{<function>}, @@ -1712,20 +1734,20 @@ \expandafter\ifx\csname dljs\dljsBase\endcsname\relax \else\@insjserrDuplicate\fi \ifcase\dljs@drivernum - \let\insert@DLJS=\insert@DLJS@pdfmark\expandafter + \let\insert@DLJS\insert@DLJS@pdfmark\expandafter \let\csname endinsDLJS*\endcsname\endinsert@DLJS@pdfmark - \let\newsegment=\newsegment@pdfmark - \let\endnewsegment=\endnewsegment@pdfmark + \let\newsegment\newsegment@pdfmark + \let\endnewsegment\endnewsegment@pdfmark \or - \let\insert@DLJS=\insert@DLJS@pdftex\expandafter + \let\insert@DLJS\insert@DLJS@pdftex\expandafter \let\csname endinsDLJS*\endcsname\endinsert@DLJS@pdftex - \let\newsegment=\newsegment@pdftex - \let\endnewsegment=\endnewsegment@pdftex + \let\newsegment\newsegment@pdftex + \let\endnewsegment\endnewsegment@pdftex \or - \let\insert@DLJS=\insert@DLJS@dvipdfm\expandafter + \let\insert@DLJS\insert@DLJS@dvipdfm\expandafter \let\csname endinsDLJS*\endcsname\endinsert@DLJS@dvipdfm - \let\newsegment=\newsegment@dvipdfm - \let\endnewsegment=\endnewsegment@dvipdfm + \let\newsegment\newsegment@dvipdfm + \let\endnewsegment\endnewsegment@dvipdfm \fi \insert@DLJS }{} @@ -1759,8 +1781,8 @@ \endgroup \def\ckivspace#1{\if\noexpand#1\space\else\expandafter#1\fi} % \end{macrocode} -% \changes{v2.2b}{2015/08/03}{Added a hook \cs{DLspecialDefs} into the DJS file} -% (2015/08/03) Added the \cs{DLspecialDefs} hook into the DJS file, used in +% \changes{v2.2b}{2015/08/03}{Added a hook \string\cs{DLspecialDefs} into the DJS file} +% (2015/08/03) Added the \string\cs{DLspecialDefs} hook into the DJS file, used in % \textsf{aeb\_pro}. % \begin{macrocode} \let\DLspecialDefs\@empty @@ -1778,8 +1800,8 @@ \iwvo{endobj} \iwvo{2 0 obj} % \end{macrocode} -% When a non-Distiller workflow, ensure execJSs are listed first. -% \changes{v2.2h}{2016/06/09}{When a non-Distiller workflow, ensure execJSs are listed first} +% When a non-Distiller workflow, ensure \env{execJS}s are listed first. +% \changes{v2.2h}{2016/06/09}{When a non-Distiller workflow, ensure \string\env{execJS}s are listed first} % \begin{macrocode} \let\x\@empty \applydljs{\def\x{^^Jvar _thereisdjs=true;}}% @@ -1953,7 +1975,7 @@ % \end{macrocode} % \DescribeMacro{\dlcontig}\hskip-\marginparsep\texttt{(\#1)} Perhaps a better method than % just described (\cs{dlcombine}) is to have a single argument delimited by parentheses. -% Thus \verb|@currQuiz@dlcontig(MyField)| also produces \texttt{q1MyField}. +% Thus |@currQuiz@dlcontig(MyField)| also produces \texttt{q1MyField}. % \begin{macrocode} \def\dlcontig(#1){#1} % \end{macrocode} @@ -1990,27 +2012,30 @@ % need to be handled carefull so as not to produce any specious spaces. Normally, there is % a comment character declared (|\makecmt\%|). Use the comment character to suppress the beginning % of a new line until it is known whether there is content on that next line. Eg, -%\begin{verbatim} -%\begin{defineJS}[\makeesc\*\makecmt\%]{\X} -%var w=1;% +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={!()},codes={\def\1{\quad}\catcode`\%=9}] +%\begin{defineJS}[\makeesc\*\makecmt\!%]{\X} +%var w=1;!% %*ifx*Y*@empty*else %var x=1; %var y=1;*fi %var z=1; %\end{defineJS} -%\end{verbatim} -%When \cs{Y} is empty, the content expands to -%\begin{verbatim} +%\end{Verbatim} +%When \cs{Y} is empty, the content expands to, +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={!()},codes={\def\1{\quad}\catcode`\%=9}] %var w=1; %var z=1; -%\end{verbatim} +%\end{Verbatim} %and when \cs{Y} is nonempty, it expands to, -%\begin{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={!()},codes={\def\1{\quad}\catcode`\%=9}] %var w=1; %var x=1; %var y=1; %var z=1; -%\end{verbatim} +%\end{Verbatim} % The following two commands are no longer used by this package. % \changes{v2.4.8}{2019/10/30}{Added \string\cs{dlgobToFi} to help format % \string\env{defineJS} code} @@ -2030,7 +2055,7 @@ % The macro \cs{dl@typesetthis} defined here, is the external version of the local command % \cs{typeset}. It globally sets the switch \cs{ifdlfortypeset} to true and defines the value % of \cs{dfnJSR} and the legacy command \cs{defineJSjsR}. For \cs{dfnJSCR}, we use only {\TeX} -% primitives to maintain compatibilty with the now defunct YandY System, which I still use. +% primitives to maintain compatibility with the now defunct YandY System, which I still use. % \begin{macrocode} \def\dl@typesetthis{\global\dlfortypesettrue \dfnJSCR{\hfil\break\null}} @@ -2231,7 +2256,7 @@ % If the user has not passed the optional % name, we generated one for him, now we insert it into the \texttt{stream}. %\changes{v2.0k}{2012/06/21}{If the user has not passed the optional -% name, we generated one for him, now we insert it into the \texttt{stream}.} +% name, we generated one for him, now we insert it into the \string\texttt{stream}.} % \begin{macrocode} \ifx\insdljsloadVar\@empty\else \iwvo{\insdljsloadVar} @@ -2363,14 +2388,6 @@ if(typeof \detectdljs\space == "undefined")\jsR\jsT {\uccode`c=`\%\uppercase{% \iwvo{\string\obeyspaces\string\obeylines \string\let\string^\string^M=\string\jsR c}}} -% \end{macrocode} -% (2014/08/09) For pdftex and xetex, this global let messages up -% the \texttt{Verbatim} environment. Not sure why this is global anyway -%\begin{verbatim} -% \iwvo{\string\obeyspaces\string\obeylines\string -% \global\string\let\string^\string^M=\string\jsR c}}} -%\end{verbatim} -% \begin{macrocode} {\escapechar=-1 \lccode`C=`\%\lowercase{% \iwvo{\string\\catcode`\string\\"=12C}}} } @@ -2387,7 +2404,7 @@ if(typeof \detectdljs\space == "undefined")\jsR\jsT \def\enddljs{\iwvo{\string\endgroup}} % \end{macrocode} %\changes{v2.0j}{2011/06/27}{made some changes as suggested by Christian Feuersaenger, who reported some -% problem clashes between \textsf{babel} (spanish) and \textsf{insdljs}.} +% problem clashes between \string\textsf{babel} (spanish) and \string\textsf{insdljs}.} % \begin{macrocode} \def\@roman#1{\romannumeral#1} \def\write@objs{% @@ -2579,20 +2596,22 @@ if(typeof \detectdljs\space == "undefined")\jsR\jsT % % The \cs{ckivspace} (``check for space'') macro sees whether the next token is a space, % if yes, it absorbs it, if not, it replaces it. I implemented this in order to get -% final output identical to the JavaScript. For example, the following is legal JavaScript -%\begin{verbatim} -% var str = "First line.\r\rSkip a line. // (1) -%\end{verbatim} +% final output identical to the JavaScript. For example, the following is legal JavaScript: +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%codes={\def\1{\quad}\catcode`\%=9}] +%var str = "First line.\r\rSkip a line. // (1) +%\end{Verbatim} % This is a problem for \TeX. In order to delimit the macro, \TeX{} users need to write the -% above line as -%\begin{verbatim} +% above line as, +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%codes={\def\1{\quad}\catcode`\%=9}] % var str = "First line.\r\r Skip a line. // (2) -%\end{verbatim} +%\end{Verbatim} % which then introduces a spurious space into the JavaScript code. The \cs{ckivspace} solves this % problem, I hope. With the definition of \cs{r} given below, after expansion of the line (2) % occurs, we have line (1), the space following the second \cs{r} gets absorbed. Note: (2014/05/20) % I moved this to the main code thread of \textsf{insdljs}. -% \changes{v2.0n}{2014/05/20}{Moved code for \cs{ckivspace} to main code thread of \textsf{insdljs}.} +% \changes{v2.0n}{2014/05/20}{Moved code for \string\cs{ckivspace} to main code thread of \string\textsf{insdljs}.} % \begin{macrocode} %\def\ckivspace#1{\if\noexpand#1\space\else\expandafter#1\fi} % \end{macrocode} @@ -2763,15 +2782,17 @@ if(typeof \detectdljs\space == "undefined")\jsR\jsT % Braces are a problem when they are unbalanced. In a regular expression, |\{| works properly, but |\\{| works % for the distiller options but not otherwise. For example, if I wanted to replace every instance % of \texttt{\{} with \texttt{(}, we can do this by -%\begin{verbatim} -% myString = myString.replace( /\{/, "\("); -%\end{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%codes={\def\1{\quad}\catcode`\%=9}] +%myString = myString.replace( /\{/, "\("); +%\end{Verbatim} % This works for all options, even though the braces are not balanced. However, when the constructor % function is used, we must double-escape: -%\begin{verbatim} -% var re = new RegExp("\\{", "g"); -% myString = myString.replace( re, "\("); -%\end{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%codes={\def\1{\quad}\catcode`\%=9}] +%var re = new RegExp("\\{", "g"); +%myString = myString.replace( re, "\("); +%\end{Verbatim} % This works for the distiller options, but not for \texttt{pdftex/dvipdfm}. The reason |\{| works is that % it is a control sequence, defined by the \cmd{\definebraces} command below. Where as |\\{| consists % of the control sequence |\\|, which is defined below, followed by a left brace. @@ -2789,16 +2810,18 @@ if(typeof \detectdljs\space == "undefined")\jsR\jsT % unbalanced braces, one workaround is to balance out the left % brace with a right brace in the form of a JavaScript comment. % This ``fools'' \TeX! For example, -%\begin{verbatim} -% var re = new RegExp("\\{", "g"); // } -% myString = myString.replace( re, "\("); -%\end{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%codes={\def\1{\quad}\catcode`\%=9}] +%var re = new RegExp("\\{", "g"); // } +%myString = myString.replace( re, "\("); +%\end{Verbatim} % Finally, we have\par\medskip % \noindent\textbf{The Recommended Workaround:} Use |\\\{| and |\\\}|, e.g., -%\begin{verbatim} -% var re = new RegExp("\\\{", "g"); -% myString = myString.replace( re, "\("); -%\end{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%codes={\def\1{\quad}\catcode`\%=9}] +%var re = new RegExp("\\\{", "g"); +%myString = myString.replace( re, "\("); +%\end{Verbatim} % This is more verbose than needed, but it works for all options! These comments are only for regular expression % strings within the constructor function. Note the replacement text, |\(|, is only escaped. % @@ -2815,39 +2838,44 @@ if(typeof \detectdljs\space == "undefined")\jsR\jsT % once again \textsf{pdftex} and \textsf{dvipdfm} are causing (me) problems. % % No problems when the regular expression uses the literal string format -%\begin{verbatim} -% myString = myString.replace(/\(/g, "\["); -%\end{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%codes={\def\1{\quad}\catcode`\%=9}] +%myString = myString.replace(/\(/g, "\["); +%\end{Verbatim} % The above code works for all options. However, for the constructor function we have some problems % in non-distiller options. If we type instead -%\begin{verbatim} -% var re = new RegExp("\\(", "g"); -% myString = myString.replace(re, "\["); -%\end{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%codes={\def\1{\quad}\catcode`\%=9}] +%var re = new RegExp("\\(", "g"); +%myString = myString.replace(re, "\["); +%\end{Verbatim} % The above code works for the distiller folks, but not for the % others. In the case of \textsf{pdftex}, I cannot access the UI to % the document level JavaScripts, and the script is undefined. I suspect % the lack of balanced parentheses is the curprit. For example, % consider the code -%\begin{verbatim} -% var re = new RegExp("\\(|\\)", "g"); -% myString = myString.replace(re, "\["); -%\end{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%codes={\def\1{\quad}\catcode`\%=9}] +%var re = new RegExp("\\(|\\)", "g"); +%myString = myString.replace(re, "\["); +%\end{Verbatim} % works. I can access the UI to the DLJS from Acrobat, and the script is defined. Another % example, we can fool the JavaScript interpreter as we did the \TeX{} compiler: -%\begin{verbatim} -% var re = new RegExp("\\(", "g"); // ) -% myString = myString.replace(re, "\["); -%\end{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%codes={\def\1{\quad}\catcode`\%=9}] +%var re = new RegExp("\\(", "g"); // ) +%myString = myString.replace(re, "\["); +%\end{Verbatim} % Here I have placed a balancing right parenthesis as a JavaScript comment. Both sets of code % work correctly. %\par\medskip %\noindent\texttt{Recommended Workaround:} As in the case of parentheses, a more verbose version % of the script works of all options. -%\begin{verbatim} -% var re = new RegExp("\\\(", "g"); -% myString = myString.replace(re, "\["); -%\end{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%codes={\def\1{\quad}\catcode`\%=9}] +%var re = new RegExp("\\\(", "g"); +%myString = myString.replace(re, "\["); +%\end{Verbatim} % This is only for the case of the constructor function. % \begin{macrocode} \def\({\eqesc\eqesci(} @@ -2943,6 +2971,7 @@ var EFMergeChange=AFMergeChange; % \begin{macrocode} %<*package> \inputAltAdbFncs +\dl@restoreCats %</package> % \end{macrocode} % \Finale diff --git a/texmf-dist/source/latex/acrotex/web.dtx b/texmf-dist/source/latex/acrotex/web.dtx index c143be3f..41dfdd4d 100644 --- a/texmf-dist/source/latex/acrotex/web.dtx +++ b/texmf-dist/source/latex/acrotex/web.dtx @@ -21,11 +21,14 @@ %</copyright> %<package>\NeedsTeXFormat{LaTeX2e}[1997/12/01] %<package>\ProvidesPackage{web} -%<package> [2021/02/06 v6.1.5 web: A Screen Design Package (dps)] +%<package> [2021/05/06 v6.1.7 web: A Screen Design Package (dps)] %<*driver> \documentclass{ltxdoc} \usepackage[colorlinks,hyperindex=false]{hyperref} \usepackage{fancyvrb} +\makeatletter +\let\@latex@warning@no@line\@gobble +\makeatother \gdef\darg#1{\texttt{\char123\relax#1\char125\relax}} \def\CMD#1{\textbackslash#1} \let\pkg\textsf @@ -33,6 +36,8 @@ \let\env\texttt \let\app\textsf \let\uif\textsf +\def\STRUT{\rule{0pt}{14pt}} +\def\negSTRUT{\rule[-8pt]{0pt}{0pt}} \def\nmpsep#1{\hskip-\marginparsep\texttt{#1}} \def\visispace{\symbol{32}} \def\ameta#1{\ensuremath{\langle\textit{\texttt{#1}}\rangle}} @@ -85,7 +90,7 @@ % \texttt{dvipdfm}, \texttt{dvipdfmx}, \texttt{xetex}, and \texttt{textures}. %\par\medskip\noindent % We introduce these two packages early. We use them to automatically -% detect pdftex and xetex. +% detect \app{pdf(la)tex} and \app{xe(la)tex}. %\changes{v4.2k}{2012/06/18}{New requirement \string\textsf{ifpdf}}% % \begin{macrocode} \RequirePackage{ifpdf}[2006/02/20] @@ -128,10 +133,10 @@ % Below is the original definition of \cs{web@set@paper}, this has now % changed with \texttt{v4.2j} to accommodate \cs{addtoWebHeight} and % \cs{addtoWebWidth}. -%\begin{verbatim} -% \def\web@set@paper{% -% \special{papersize=\the\paperwidth,\the\paperheight}}% -%\end{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={!()},codes={\catcode`\%=9}] +%\def\web@set@paper{\special{papersize=\the\paperwidth,\the\paperheight}}% +%\end{Verbatim} % \changes{v4.2j}{2012/05/11}{In support of \string\cs{addtoWebHeight}, we introduce % the pagesize special at the beginning of the document. Changes are in the % \string\texttt{dvipsone} and \string\texttt{dvips} options only.} @@ -179,10 +184,11 @@ \def\i@web@ddtoHyOpts{setpagesize=false}% % \end{macrocode} % The old definition of \cs{web@set@paper} -%\begin{verbatim} -% \def\web@set@paper{% -% \special{papersize=\the\paperwidth,\the\paperheight}} -%\end{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={!()},codes={\catcode`\%=9}] +%\def\web@set@paper{!% +%!quad\special{papersize=\the\paperwidth,\the\paperheight}} +%\end{Verbatim} % New definitions (\texttt{v4.2j}). See comments for the \texttt{dvipsone} option. % \begin{macrocode} \let\web@set@paper\@empty @@ -441,9 +447,13 @@ % \subsection{Miscellaneous Options} % % The \texttt{navibar}\IndexOpt{navibar} option places -% a set of navigation buttons on footer. +% a set of navigation buttons in footer. The \opt{navibar*}\IndexOpt{navibar*} places +% the navigation buttons in footer if for screen, and does not place the navigation +% buttons if for paper. +% \changes{v6.1.7}{2021/05/06}{Added \opt{navibar*} option} % \begin{macrocode} \DeclareOptionX{navibar}{\web@navibartrue} +\DeclareOptionX{navibar*}{\AtEndOfPackage{\ifeqforpaper\else\web@navibartrue\fi}} % \end{macrocode} % The \texttt{tight}\IndexOpt{tight} option reduces % the vertical spaces around equations and verbatim environments. The \texttt{tight*}\IndexOpt{tight*} @@ -877,9 +887,10 @@ % \end{macrocode} % \subsection{Load Configuration File: web.cfg} % Look for configuration file, \texttt{web.cfg}, for example -%\begin{verbatim} -% \ExecuteOptionsX{dvips} -%\end{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={!()},codes={\catcode`\%=9}] +%\ExecuteOptionsX{dvips} +%\end{Verbatim} % sets \texttt{dvips} as the default driver. % \begin{macro}{\minPanelWidth} % This definition is moved here so a user can set the minimal @@ -1026,7 +1037,7 @@ \expandafter\w@isHyLoaded\fi \ifx\u@web@ddtoHySetup\@empty\else\edef\x{\noexpand\hypersetup {\u@web@ddtoHySetup}}\expandafter\x\fi -% \end{macrocode} +% \end{macrocode} % We declare that `The AcroTeX eDucation Bundle' is the pdf creator. % \begin{macrocode} \def\@pdfcreator{The AcroTeX eDucation Bundle} @@ -1042,86 +1053,16 @@ \AtBeginDocument{\web@commentChkMsg} % \end{macrocode} % If the user specifies the use of templates, we assume they are going -% to do some graphical work, so we include \textsf{graphicx}. -% \begin{macrocode} -\ifnum\@usetemplates=\@ne\relax - \def\x{\RequirePackage{graphicx}}\expandafter\x\fi -% \end{macrocode} -% If the user specifies an option requiring templates, then we better -% load \textsf{eso-pic}, which itself requires \textsf{everyshi} or \textsf{atbegshi}. -% \begin{macrocode} -\ifnum\@usetemplates=\@ne - \RequirePackage{eso-pic} -% \end{macrocode} -% Here is a fix for \textsf{dvipdfm}. If using templates, then we need to -% redefine the way we set the page size using \textsf{eso-pic}. We also need -% to redefine the \textsf{eso-pic} macro \cs{@ShipoutPicture} so the order of -% execution of \cs{ESO@HookI} \cs{ESO@HookII} are reversed. The paper -% size special will be in the \cs{ESO@HookII} macro, it needs to -% execute (once) before \cs{ESO@HookI} is executed. -% \begin{macrocode} - \ifnum\eq@drivernum=\tw@ - \def\web@set@paper{\AddToShipoutPicture*{% - \special{papersize=\the\paperwidth,\the\paperheight}}}% -% \end{macrocode} -% We use some code from \textsf{hyperref} to set the page size. -% \begin{macrocode} - \AtBeginShipoutFirst{% - \begingroup - \@ifundefined{stockwidth}{% - \ifx\special@paper\@empty - \special{papersize=\the\paperwidth,\the\paperheight}\else - \special{papersize=\special@paper}\fi - }{% - \ifdim\stockwidth=\z@\else - \special{papersize=\the\stockwidth,\the\stockheight}\fi - }% - \endgroup - }% -% \end{macrocode} -% \changes{v4.2d}{2009/11/22}{Modifications to use -% new \string\textsf{eso-pic}} -% \begin{macrocode} - \@ifundefined{@ShipoutPicture}{}{% -% \end{macrocode} -% The new version of \textsf{eso-pic} does not define \cs{@ShipoutPicture}. -% If \cs{@Ship\-out\-Pic\-ture} defined, so we use some of the old code. -% \begin{macrocode} - \renewcommand{\@ShipoutPicture}{% - \bgroup - \@tempswafalse% - \ifx\ESO@HookI\@empty\else\@tempswatrue\fi% - \ifx\ESO@HookII\@empty\else\@tempswatrue\fi% - \if@tempswa% - \@tempdima=1in\@tempdimb=-\@tempdima% - \advance\@tempdimb\paperheight - \@ifundefined{stockwidth}{}{% - \advance\@tempdima+\trimedge% - \advance\@tempdima+\paperwidth% - \advance\@tempdima-\stockwidth% - \if@twoside\ifodd\c@page\else% - \advance\@tempdima-2\trimedge% - \advance\@tempdima-\paperwidth% - \advance\@tempdima+\stockwidth% - \fi\fi\advance\@tempdimb+\trimtop - }% - \unitlength=1pt% - \global\setbox\@cclv\vbox{% - \vbox{\let\protect\relax - \pictur@(0,0)% - (\strip@pt\@tempdima,\strip@pt\@tempdimb)% - \ESO@HookII\ESO@HookI\global\let\ESO@HookII\@empty% - \endpicture}% - \box\@cclv% - }% - \fi - \egroup - }% shipout - }% ifundefined shipout - \fi -\fi +% to do some graphical work, so we include \pkg{graphicx} and \pkg{eso-pic} +% packages. +% \changes{v6.1.6}{2021/02/28}{Removed legacy code concerning \pkg{everyshi}} +% \begin{macrocode} +\ifnum\@usetemplates=\@ne\def\x{% + \RequirePackage{graphicx} + \RequirePackage{eso-pic}}\expandafter\x\fi % \end{macrocode} -% A useful command for separating two arguments. Use in \texttt{webpro} section, and by \texttt{aeb\_pro} as well. +% A useful command for separating two arguments. +% Used in \texttt{webpro} section, and by \texttt{aeb\_pro} as well. % \begin{macrocode} \def\getargs#1#2{\def\aeb@argi{#1}\def\aeb@argii{#2}} \let\getargsii\getargs @@ -1189,11 +1130,12 @@ \addtolength{\textheight}{-\@Topmargin} \addtolength{\textheight}{-\@Bottommargin} % \end{macrocode} -%\begin{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={!~$},codes={\catcode`\%=9}] %\topmargin = \web@Topmargin - 1in %\@Topmargin = \web@Topmargin + \headheight + \headsep -% so \headsep = \@Topmargin - \headheight - \web@Topmargin (\topmargin) -%\end{verbatim} +%!textsf~so $\headsep = \@Topmargin - \headheight - \web@Topmargin (\topmargin) +%\end{Verbatim} % \begin{macrocode} \setlength{\headsep}{\@Topmargin} \addtolength\headsep{-\headheight} @@ -1255,24 +1197,23 @@ % \texttt{Oversized Pages\_20x20.joboptions}. However, the page size the distiller uses can be set % through the {\LaTeX} source file. For this purpose, we introduce the command % \DescribeMacro\setPageDevice\cmd\setPageDevice. The optional first argument is the resolution -% in dots per inch. The standard joboptions file has 600 as this value; the high quality and +% in dots per inch. The standard job-options file has 600 as this value; the high quality and % press quality have this parameter at 2400. The second and third parameters are the % width and height, respectively, of the \textbf{/PageSize}. For greatest accuracy, the values of % width and height should be entered in printers points (without dimensions). For example, -%\begin{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={!()},codes={\catcode`\%=9}] %\setPageDevice{1400}{1400} -%\end{verbatim} -% is preferred to -%\begin{verbatim} +%!STRUT!negSTRUT!textsf(is preferred to) %\setPageDevice{20in}{20in} -%\end{verbatim} +%\end{Verbatim} % \texttt{20in} gets converted to \texttt{1439.9965}. The conversion, if necessary, is done % by \cs{@convLtoP} % % The command \cs{@convLtoP} is taken from the \textsf{graphics} package and is based on % \cs{Gin@defaultbp}. % -% The commands seems only effect with the \textsf{dvipsone} driver. +% The command is only needed with the \textsf{dvipsone} driver. % \begin{macrocode} \def\@convLtoP#1#2{\afterassignment \@convLtoP@i\dimen@#2bp\relax{#1}{#2}} @@ -1305,11 +1246,12 @@ % and \cs{paperheight} will be the default values set by the class, but take \cs{textwidth} to be % the value of \#2. The second and third parameters are the width and height, respectively, as measured % in printer points ($72\,\mbox{points} = 1\,\mbox{inch}$, or measures in the \texttt{bp} points of \TeX.) -%\begin{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={!()},codes={\catcode`\%=9}] %Parameters: -% #1 = \paperheight (height of the display screen to be created) -% #2 = \paperwidth (width of the display screen to be created) -%\end{verbatim} +%!quad#1 = \paperheight (height of the display screen to be created) +%!quad#2 = \paperwidth (width of the display screen to be created) +%\end{Verbatim} % \begin{macrocode} \def\screensize#1#2{% \def\webSaveSSDim{{#1}{#2}}% @@ -1348,22 +1290,24 @@ % cannot be deformed to fit one of the standard designs. The solution is to % create a screen size matching the graphic, then using that graphic as a template. % Example usage, -%\begin{verbatim} -% \margins{1in}{1in}{24pt}{.25in} -% \setScreensizeFromGraphic{acro_30} -% \template{acro_30} -%\end{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={!()},codes={\catcode`\%=9}] +%!quad\margins{1in}{1in}{24pt}{.25in} +%!quad\setScreensizeFromGraphic{acro_30} +%!quad\template{acro_30} +%\end{Verbatim} % This command takes two arguments, the first is optional and is passed % to the \cs{includegraphics} command, the second it the path to the file. % % It may become necessary with some graphics to use the % \texttt{hiresbb} option for \cs{includegraphics}, both in % \cs{setScreensizeFromGraphic} and \cs{template} like so, -%\begin{verbatim} -% \margins{1in}{1in}{24pt}{.25in} -% \setScreensizeFromGraphic[hiresbb]{acro_30} -% \template[hiresbb]{acro_30} -%\end{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={!()},codes={\catcode`\%=9}] +%!quad\margins{1in}{1in}{24pt}{.25in} +%!quad\setScreensizeFromGraphic[hiresbb]{acro_30} +%!quad\template[hiresbb]{acro_30} +%\end{Verbatim} % \changes{v4.0f}{2007/06/11} % { % This command measures the dimensions of an EPS file, and sets the @@ -1454,7 +1398,8 @@ % \subsubsection{\texorpdfstring{\protect\cs{margins}}{\CMD{margins}}} % \begin{macro}{\margins} % Sets the left, right, top and bottom margins. -%\begin{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={!()},codes={\catcode`\%=9}] %Parameters: % [#1] = width of panel to be used if a panel option % is specified (default is 1in) @@ -1462,7 +1407,7 @@ % #3 = right margin % #4 = top margin % #5 = bottom margin -%\end{verbatim} +%\end{Verbatim} % \begin{macrocode} \newcommand{\@margins}[5][\web@minpanelwidth]{% \def\webSaveMargDim{[#1]{#2}{#3}{#4}{#5}}% @@ -1489,9 +1434,10 @@ % |\addtoWebWidth| and |\addtoWebHeight|, this command readjusts % the margins. Within the arguments \cs{incby} % refer to the current dimension. -%\begin{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={!()},codes={\catcode`\%=9}] %\resetsmargins{\incby+.25in}{\incby+.25in}{}{} -%\end{verbatim} +%\end{Verbatim} % This line adds .25in to each of the side margins. % \begin{macrocode} \newcommand\get@MargDim[5][]{% @@ -2228,7 +2174,8 @@ % \begin{macro}{\@newNaviIconMenu} % This command uses the hyperref command \cs{Acrobatmenu} to create navigation link button. The % action for this type is restricted to named menu actions. -%\begin{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={!()},codes={\catcode`\%=9}] %Parameters % [#1] = optional parameter for setting the highlight, N (none), % I (invert, the default), O (outline), P (push, also called Inset) @@ -2237,7 +2184,7 @@ % #4 = height of icon % #5 = text to appear in the center of the icon. % #6 = named menu action, e.g., NextPage, PrevPage, etc. -%\end{verbatim} +%\end{Verbatim} % The color of the text is controlled by \cs{navibarTextColor}, and the background color % is determined by \cs{@menuBgColor}. % \begin{macrocode} @@ -2255,7 +2202,8 @@ % \end{macro} % \begin{macro}{\@newNaviIconJS} % Another navigation icon/button, but this one allows for arbitrary JavaScript actions. -%\begin{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={!()},codes={\catcode`\%=9}] %Parameters % [#1] = optional parameter for setting the highlight, N (none), % I (invert, the default) O (outline), P (push, also called Inset) @@ -2264,7 +2212,7 @@ % #4 = height of icon % #5 = text to appear in the center of the icon. % #6 = JavaScript commands to be executed when the button is clicked. -%\end{verbatim} +%\end{Verbatim} % The color of the text is controlled by \cs{navibarTextColor}, and the background color % is determined by \cs{@menuBgColor}. % \begin{macrocode} @@ -2309,7 +2257,8 @@ % \end{macrocode} % \end{macro} % Another navigation icon/button, this one allows jumping to a named destination. -%\begin{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={!()},codes={\catcode`\%=9}] %Parameters % [#1] = optional parameter for setting the highlight, N (none), % I (invert, the default), O (outline), P (push, also called Inset) @@ -2318,12 +2267,13 @@ % #4 = height of icon % #5 = text to appear in the center of the icon. % #6 = \hyperlink or \href with its first argument -%\end{verbatim} +%\end{Verbatim} % For example, -%\begin{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={!()},codes={\catcode`\%=9}] %\newNaviIcon[l]{\Home}{40pt}{15pt}{\footnotesize Home} % {\href{http://www.math.uakron.edu/}} -%\end{verbatim} +%\end{Verbatim} % The color of the text is controlled by \cs{navibarTextColor}, and the background color % is determined by \cs{@menuBgColor}. % \begin{macrocode} @@ -2519,9 +2469,10 @@ % \begin{macro}{\ArrowUp} % \begin{macro}{\ArrowDown} % Pre-Fab Rule Icons \cs{Uparrow} and \cs{Downarrow}, for example, -%\begin{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={!()},codes={\catcode`\%=9}] %\insertnaviiconhere{\ArrowUp{\href{http://www.adobe.com/}}} -%\end{verbatim} +%\end{Verbatim} % \begin{macrocode} \newcommand\ArrowUp[1]{% \normalsize\ifeqforpaper @@ -3134,11 +3085,12 @@ \begingroup % \end{macrocode} % Sample line from .aux -%\begin{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={!()},codes={\catcode`\%=9}] % \contentsline {section}{\numberline {1}Introduction}{4}{section.1} % \contentsline {section}{\numberline {}References}{56}{section*.1} % #1 #2 #3 -%\end{verbatim} +%\end{Verbatim} % \begin{macrocode} \global\let\isChapter\web@NO \parskip0pt\parindent\toc@indent\relax @@ -3284,9 +3236,10 @@ % is optional. Use any of the \emph{boolean keys} of the % \cs{includegraphics} command. Do not use the \texttt{width} or % \texttt{height} keys in this optional argument. For example, -%\begin{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={!()},codes={\catcode`\%=9}] % \template[hiresbb]{myBG} -%\end{verbatim} +%\end{Verbatim} % Causes the driver to import the graphic using the high resolution bounding % box. % It is assumed that a graphic defined by \cs{template} is intended to fill the entire @@ -4015,8 +3968,9 @@ % in the \texttt{web} package. This command should appear in the preamble. % %\medskip\noindent Example usage: -%\begin{verbatim} -%\DeclareDocInfo{% +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={!()},codes={\catcode`\%=9}] +%\DeclareDocInfo{!% % title=My First Presentation, % author=D. P. Speaker, % university=My University, @@ -4025,7 +3979,7 @@ % talksite=The Talking University, % subject=The Art of Talking %} -%\end{verbatim} +%\end{Verbatim} % \begin{macrocode} \newcommand{\DeclareDocInfo}[1]{\setkeys{aebDocInfo}{#1}% \ifx\web@talkdate@value\@empty\else\let\webversion\webtalkdate\fi} @@ -4115,15 +4069,16 @@ % ignored when the \texttt{forpaper} option is in effect. % %\medskip\noindent Example usage: -%\begin{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={!()},codes={\catcode`\%=9}] %\DeclarePageLayout -%{% +%{!% % screensizeOf=designv, % margins={.75in}{.75in}{.75in}{.75in}, % topmargin=40pt, % webfootskip=30pt %} -%\end{verbatim} +%\end{Verbatim} % This sets the \texttt{\texttt{screensize}} to the same as the % \texttt{screensize} of \texttt{designv}. We then adjust the % margins, the \texttt{topmargin} key is used to position the running @@ -5253,9 +5208,10 @@ % The \cs{selectColors} is a convenience command for setting % many of the colors involved in the design of an \textsf{APB} document. % The default colors are \dots -%\begin{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={!()},codes={\catcode`\%=9}] %\selectColors -%{ +%{!% % universityColor = blue, % titleColor = black, % authorColor = black, @@ -5266,7 +5222,7 @@ % linkColor = webgreen, % fileColor = webbrown %} -%\end{verbatim} +%\end{Verbatim} % \begin{macrocode} \newcommand{\selectColors}[1]{\setkeys{aebcolordesign}{#1}} % \end{macrocode} @@ -5302,14 +5258,15 @@ % \begin{macro}{\selectTocDings} % This is an \textsf{xkeyval} interface to setting the dings used by % the structured lists and the table of contents. Usage: -%\begin{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={!()},codes={\catcode`\%=9}] %\selectTocDings -%{ +%{!% % dDing=\ding{082}, % ddDing=\ding{079}, % dddDing=\ding{254} %} -%\end{verbatim} +%\end{Verbatim} % \begin{macrocode} \newcommand{\selectTocDings}[1]{\setkeys{aebDings}{#1}} % \end{macrocode} @@ -5332,10 +5289,8 @@ % comment environments one \texttt{forpaper} and another for % \texttt{forscreen}. % \begin{macrocode} - \includecomment{forpaper}\excludecomment{forscreen} -\else - \includecomment{forscreen}\excludecomment{forpaper} -\fi + \includecomment{forpaper}\excludecomment{forscreen}\else + \includecomment{forscreen}\excludecomment{forpaper}\fi % \end{macrocode} % \end{environment} % \end{environment} |