diff options
author | Norbert Preining <norbert@preining.info> | 2021-02-01 13:14:30 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2021-02-01 13:14:30 +0900 |
commit | a979a969ee8a924408ebeb767035b9e4f48f7efa (patch) | |
tree | 04ad221758f0fb7f3c3cb8bb13db45763032f7f3 /texmf-dist/source | |
parent | 272af43327ca6868322c4781c0b2dd979391a08a (diff) |
acrotex (2021-02-01)
Diffstat (limited to 'texmf-dist/source')
-rw-r--r-- | texmf-dist/source/latex/acrotex/eforms.dtx | 1445 | ||||
-rw-r--r-- | texmf-dist/source/latex/acrotex/exerquiz.dtx | 4025 | ||||
-rw-r--r-- | texmf-dist/source/latex/acrotex/insdljs.dtx | 1033 | ||||
-rw-r--r-- | texmf-dist/source/latex/acrotex/web.dtx | 3920 |
4 files changed, 5463 insertions, 4960 deletions
diff --git a/texmf-dist/source/latex/acrotex/eforms.dtx b/texmf-dist/source/latex/acrotex/eforms.dtx index 7133e60f..bc21d96c 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-2019 D. P. Story %% +%% Copyright (C) 2002-2020 D. P. Story %% %% dpstory@uakron.edu %% %% %% %% This program can redistributed and/or modified under %% @@ -16,10 +16,11 @@ %</copyright> %<package>\NeedsTeXFormat{LaTeX2e} %<package>\ProvidesPackage{eforms} -%<package> [2019/10/23 v2.3.2 Provides general eforms support (dps)] +%<package> [2020/12/14 v2.4.1 Provides general eforms support (dps)] %<*driver> \documentclass{ltxdoc} \usepackage[colorlinks,hyperindex=false]{hyperref}[2012/10/12] +\usepackage{fancyvrb} \pdfstringdefDisableCommands{\let\\\textbackslash} \OnlyDescription \EnableCrossrefs @@ -31,14 +32,20 @@ \let\env\texttt \let\opt\texttt \let\app\textsf +\let\key\texttt +\let\uif\textsf \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}}}} \def\ltag{<}\def\rtag{>} \let\app\textsf\let\pkg\textsf +\let\tops\texorpdfstring +\makeatletter +\let\@latex@warning\@gobble +\makeatother \InputIfFileExists{aebdocfmt.def}{\PackageInfo{eforms}{Inputting aebdocfmt.def}} - {\def\IndexOpt{\DescribeMacro}\def\IndexKey{\DescribeMacro} \let\setupFullwidth\relax + {\def\IndexOpt{\DescribeMacro}\def\IndexKey{\DescribeMacro}\let\setupFullwidth\relax \PackageInfo{eforms}{aebdocfmt.def cannot be found}} \begin{document} \GetFileInfo{eforms.sty} @@ -70,13 +77,12 @@ % % \section{Introduction} % -% This {\LaTeX} code was originally part of the \textsf{exerquiz} package. -% I decided it would be useful to others if I separated the two and make -% the forms part of \pkg{exerquiz} into a separate package. The -% \pkg{eforms} package is now a part of the \textsf{{Acro\TeX} eDucation -% Bundle} and is called by \pkg{exerquiz}, but it is now a stand alone -% package for others who may want to use PDF form fields and JavaScript -% interactivity. +% \textbf{Form Response Files.} +% The \pkg{eforms} package supports the creation of \app{Acrobat} \hyperref[formsSupport]{form fields}, +% as well as the creation of \hyperref[linkSupport]{link annotations}. Most all features of fields and links are supported, though +% for some features, such as signatures and tabbing, the \app{Acrobat/\allowbreak Distiller} pair is needed. +% Inserting PDF form fields into your document creates a \emph{Form Response File}, to use the latest +% nomenclature of \app{Adobe}. % % \section{Package Options} % @@ -161,7 +167,7 @@ \def\eq@drivercode{edvipdfm.def}\def\ef@driver{xetex}% } % \end{macrocode} -% \IndexOpt{textures} +% \leavevmode\IndexOpt{textures}^^A% % This option, and testing are due to Ross Moore 3/6/02 % \begin{macrocode} \DeclareOption{textures}{% @@ -243,7 +249,7 @@ }% } % \end{macrocode} -% \begin{macrocode} +% \begin{macrocode}` \ProcessOptions \ifx\ef@driver\@empty \PackageError{eforms}% @@ -258,18 +264,31 @@ \edef\ef@CatChngs{\the\catcode`\$} \@makeother\$\relax \newlength\eflength +% \end{macrocode} +% 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}} +% \begin{macrocode} \@ifundefined{ifpdfmarkup}{\newif\ifpdfmarkup}{}\pdfmarkupfalse -\ifpdf\else\ifxetex\else\pdfmarkuptrue\fi\fi +\ifpdf\else\ifnum\eq@drivernum=2\relax\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. % \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} -\ifxetex\else\ifpdf\pdflinkmargin1bp\relax\else +\ifnum\eq@drivernum=2\relax +\else + \ifpdf\pdflinkmargin1bp\relax + \else \g@addto@macro\Hy@FirstPageHook{% \headerps@out{/HyperBorder {1.00375 PDFToDvips} def}} -\fi\fi + \fi +\fi % \end{macrocode} % Changed the requirement for \textsf{insdljs} % \changes{v2.9a}{2016/06/09}{Change in \string\textsf{insdljs} package} @@ -279,17 +298,17 @@ % \end{macrocode} % \changes{v1.0a}{2006/10/03} % { -% If \string\textsf{exerquiz} is not loaded, we do an automatic begin and end of Form. +% 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\textsf{exerquiz}; otherwise, we set the default to 0 +% \string\pkg{exerquiz}; otherwise, we set the default to 0 % (\string\texttt{dvipsone}/\string\texttt{dvips}). % } -% If exerquiz is not loaded, we insert |\begin{Form}| and |\end{Form}|, +% If \pkg{exerquiz} is not loaded, we insert |\begin{Form}| and |\end{Form}|, % and if undefined, we set the default driver. % \begin{macrocode} \@ifpackageloaded{exerquiz}{}{% - \AtBeginDocument{\Form} - \AtEndDocument{\csname endForm\endcsname} + \AtBeginDocument{\Form}% + \AtEndDocument{\@nameuse{endForm}} } \@ifpackageloaded{aeb_pro}{}{% \newcommand{\taggedPDF}{% @@ -312,12 +331,19 @@ % \end{macrocode} % When the \texttt{preview} option is used, draw a frame box % around the \textit{inner} bounding rectangle. +% +% \paragraph*{Utility commands, boxes, dimension and token registers} % \begin{macrocode} %<*package> \def\csarg#1#2{\expandafter#1\csname#2\endcsname} \@ifundefined{eq@tmpbox}{\newsavebox{\eq@tmpbox}}{} \@ifundefined{eq@tmpdima}{\newdimen\eq@tmpdima}{} \@ifundefined{eq@tmpdimb}{\newdimen\eq@tmpdimb}{} +% \end{macrocode} +% Define new dimension of \cs{b@} which is assigned a value of 1bp. +% \changes{v2.3.6}{2020/10/10}{Defined new dimension \string\cs{b@} (1bp)} +% \begin{macrocode} +\newdimen\b@ \b@=1bp \newlength\ef@dimena \newtoks\ef@scratchtoks % \end{macrocode} @@ -391,31 +417,7 @@ % The public version of \cs{ef@Bbox} is simply \DescribeMacro\Bbox\cs{Bbox}. % \begin{macrocode} \let\Bbox\ef@Bbox -%</package> % \end{macrocode} -% \section{eForms Support} -% \begin{macrocode} -%<*package> -% \end{macrocode} -% Listed below are the various types of form objects available in PDF. -%\begin{itemize} -% \item \hyperref[button]{Button} -% \begin{itemize} -% \item \hyperref[pushbutton]{Push buttons} -% \item \hyperref[checkbox]{Check boxes} -% \item \hyperref[radiobutton]{Radio Buttons} -% \end{itemize} -% \item \hyperref[textfield]{Text Fields} -% \item \hyperref[choice]{Choice Fields} -% \begin{itemize} -% \item \hyperref[listbox]{list box} -% \item \hyperref[combobox]{combo box} -% \end{itemize} -%\item \hyperref[sigfield]{Signature Fields} -%\end{itemize} -% \normalcolor -% -% \subsection{Some utility commands} % The following two commands were created as a convenience to changing the definition of certain % JavaScript actions. Use \cs{efsave} to save the original definition of the action, then redefine the action, % the later, restore the JS action to its original definition.\par\medskip\noindent @@ -438,6 +440,37 @@ % 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). +% \begin{macrocode} +%</package> +% \end{macrocode} +% \section{\tops{\app}{}{Adobe} Forms Support}\label{formsSupport} +% \begin{macrocode} +%<*package> +% \end{macrocode} +% Listed below are the various types of form objects available in PDF. +%\par\medskip\noindent +%\begin{minipage}{.67\linewidth}\raggedcolumns +%\begin{multicols}{2} +%\begin{itemize} +% \item \hyperref[button]{Button} +% \begin{itemize} +% \item \hyperref[pushbutton]{Push buttons} +% \item \hyperref[checkbox]{Check boxes} +% \item \hyperref[radiobutton]{Radio Buttons} +% \end{itemize} +% \item \hyperref[textfield]{Text Fields} +% \item \hyperref[choice]{Choice Fields} +% \begin{itemize} +% \item \hyperref[listbox]{list box} +% \item \hyperref[combobox]{combo box} +% \end{itemize} +%\item \hyperref[sigfield]{Signature Fields} +%\end{itemize} +%\end{multicols} +%\end{minipage} +% +%\bigskip +% % % \subsection{Process Key-Value Pairs: Main Macro}\label{procArgs} % @@ -455,10 +488,10 @@ % \cs{@eq\ameta{name}\darg{\ameta{arg}}}. Each of the macros \cs{@eq\ameta{name}} must be % defined. Such a macro defines another macro as follows % \cs{def\string\eq@\ameta{name}\darg{\ameta{arg}}}. For example if the user enters the token -% pair |\RC{Users}|, \cmd{\processAppArgs} will construct -% |\@eqRC|, with argument |{Users}|, this macro will be -% executed, which expands to |\def\eq@RC{Users}|. The macro -% \cmd{\eq@RC} may then be used within the construction of the +% pair |\TU{|\ameta{text}|}|, \cmd{\processAppArgs} will construct +% |\@eqTU|, with argument |{|\ameta{text}|}|, this macro will be +% executed, which expands to |\def\eq@TU{/TU(|\ameta{text}|)}| (a simplified definition). The macro +% \cmd{\eq@TU} is then be used within the construction of the % widget object.\medskip % % \noindent @@ -478,11 +511,7 @@ % and there is no user redefinition of that form field attribute allowed. Normally, % this is done for \cs{A} and \cs{AA} to prevent overwriting critical functionality. % \begin{macrocode} - \ifx#1\@empty -% \@getCmdName{#1}\PackageWarning{eforms} -% {Redefining the \eqbs\@CmdName\space key is not allowed}% - \def\ef@next{\processAppArgs}% - \else + \ifx#1\@empty\def\ef@next{\processAppArgs}\else % \end{macrocode} % This is the user interface to the new optional argument of links and forms. If % the key is \cs{ui}, we pass its argument to |\setkeys{eforms}{#2}| to process @@ -563,7 +592,7 @@ % the argument of \cs{presets} is a macro of the form \cs{csname}/\cs{endcsname}. % An ordinary \cs{presets} does not work, we must use \cs{epresets}: %\begin{verbatim} -% \expandafter\def\csname fld1\endcsname#1{\protect\BG{#1}} +% \csarg\def{fld1}#1{\protect\BG{#1}} % \textField[\epresets{\nameuse{fld1}{yellow}}]{mytxt}{2in}{13bp} %\end{verbatim} %In the above example we use \cs{nameuse} rather than \cs{@nameuse}, since in a recent @@ -572,7 +601,7 @@ %\begin{verbatim} % \protectedKeys{pKeys}{\BG{red}\BC{blue}} %% \nameuse is expanded within the argument below, where it is defined -% \expandafter\def\csname fld2\endcsname{\nameuse{pKeys}} +% \csarg\def{fld2}{\nameuse{pKeys}} % \pushButton[\CA{Push Me}\epresets{\nameuse{fld2}}]{pb1}{}{13bp} %\end{verbatim} %where \cs{protectedKeys} is used to protected each of the keys in its argument. @@ -582,7 +611,7 @@ \ifx\arg@epresets\@CmdName \def\ef@next{\let\protect\noexpand \edef\x{#2}\set@typeset@protect\expandafter - \processAppArgs\x}% dps27 + \processAppArgs\x}% \else % \end{macrocode} % This is the last, and the most frequent case. We process an ordinary key, one @@ -604,16 +633,13 @@ % Process the field defaults and the `every' changes. Build up the required command % in a token list, then execute. % \begin{macrocode} -\def\@processEvery{\edef\eqtemp{}\toks0={}\@@processEvery} -\def\@@processEvery#1{% - \ifx#1\end\def\ef@next{\the\toks0 }% - \else - \edef\eqtemp{\the\toks0 }% - \toks0=\expandafter{\eqtemp - \expandafter\processAppArgs#1\end\@nil}% - \def\ef@next{\@@processEvery}% - \fi - \ef@next +\def\@processEvery{\edef\eqtemp{}\toks@={}\@@processEvery} +\def\@@processEvery#1{\ifx#1\end + \def\ef@next{\the\toks@}\else + \edef\eqtemp{\the\toks@}% + \toks@=\expandafter{\eqtemp\expandafter + \processAppArgs#1\end\@nil}% + \def\ef@next{\@@processEvery}\fi\ef@next } % \end{macrocode} % \begin{macrocode} @@ -625,36 +651,79 @@ % inline form fields.} % \begin{macrocode} \def\centerWidget#1{% - \ifeq@inlineCenter + \ifeq@inlineCenter % \end{macrocode} % Inline form field, do a better job at centering it. % \begin{macrocode} - \eqcenterWidget=#1\relax - \eqcenterWidget=.5\eqcenterWidget - \ifnum\eq@textSize=0\relax - \dimen@=-\eq@textSizeDefault bp\else - \dimen@=-\eq@textSize bp\fi - \dimen@=0.9167\dimen@ % 11/12 - \dimen@=.5\dimen@ - \advance\dimen@\eq@W@value bp - \ifx\eq@S\@empty\else - \def\eq@S@cmp{B}% - \ifx\eq@S@value\eq@S@cmp - \advance\dimen@ by \eq@W@value bp - \else - \def\eq@S@cmp{I}% - \ifx\eq@S@value\eq@S@cmp - \advance\dimen@ by \eq@W@value bp - \else\advance\dimen@ by 1bp - \fi\fi\fi - \advance\eqcenterWidget by \dimen@ + \eqcenterWidget=#1\relax + \eqcenterWidget=.5\eqcenterWidget + \ifnum\eq@textSize=0\relax + \dimen@=-\eq@textSizeDefault\b@\else + \dimen@=-\eq@textSize\b@\fi + \dimen@=0.9167\dimen@ % 11/12 + \dimen@=.5\dimen@ + \advance\dimen@\eq@W@value\b@ + \ifx\eq@S\@empty\else + \def\eq@S@cmp{B}% + \ifx\eq@S@value\eq@S@cmp + \advance\dimen@ by \eq@W@value\b@ + \else + \def\eq@S@cmp{I}% + \ifx\eq@S@value\eq@S@cmp + \advance\dimen@ by \eq@W@value\b@ + \else\advance\dimen@\b@ + \fi\fi\fi + \advance\eqcenterWidget\dimen@ + \else + \eqcenterWidget=#1\relax + \eqcenterWidget=.5\eqcenterWidget + \advance\eqcenterWidget-4\b@ + \fi +} +% \end{macrocode} +% \begin{macro}{\ef@optscale} +% This macro supports the \texttt{width}, \texttt{height}, and \texttt{scale} option keys for forms. +% We obey these three keys in the order listed above. +% \changes{v2.3.5}{2020/09/15}{Added \string\cs{ef@optscale}} +% \begin{macrocode} +\def\ef@optscale{% + \ifx\eq@width\@empty + \ifx\eq@height\@empty + \ifx\eq@scalefactor\@empty + \else +% \end{macrocode} +% Re-scale using scale factor of \cs{eq@scale}. +% \begin{macrocode} + \@tempdima\eq@scalefactor\p@ + \ifdim\@tempdima<\z@\edef\eq@scalefactor{-\eq@scalefactor}\fi + \setlength{\eflength}{\eq@rectH*\real{\eq@scalefactor}}% + \edef\eq@rectH{\the\eflength}% + \setlength{\eflength}{\eq@rectW*\real{\eq@scalefactor}}% + \xdef\eq@rectW{\the\eflength}% + \fi \else - \eqcenterWidget=#1\relax - \eqcenterWidget=.5\eqcenterWidget - \advance\eqcenterWidget by -4bp +% \end{macrocode} +% Re-scale according to height. +% \begin{macrocode} + \setlength{\eflength}{\eq@rectH}% + \ifdim\eflength>\z@ + \setlength{\eflength}{\eq@height*\ratio{\eq@rectW}{\eq@rectH}}% + \edef\eq@rectW{\the\eflength}\edef\eq@rectH{\eq@height}% + \fi \fi + \else +% \end{macrocode} +% Re-scale according to width. +% \begin{macrocode} + \setlength{\eflength}{\eq@rectW}% + \ifdim\eflength>\z@ + \setlength{\eflength}{\eq@width*\ratio{\eq@rectH}{\eq@rectW}}% + \edef\eq@rectH{\the\eflength}\edef\eq@rectW{\eq@width}% + \fi + \fi } % \end{macrocode} +% \end{macro} % % \subsection{\textsf{eforms} key-values}\label{eformvariables} % @@ -694,17 +763,23 @@ \ifx\eq@W\@empty\let\link@BS\@empty\fi }\def\link@BS{} % \end{macrocode} -% \changes{v1.0e}{2008/03/04} -% { -% Added a \string\cs{presets} key to make it easier to dynamically change options% -% } +% \noindent\DescribeMacro{\presets}\hskip-\marginparsep\texttt{\darg{\meta{\cs{cmd}}}} +% We define the \cs{presets} key. The argument of \key{presets} is a macro (\meta{\cs{cmd}}) consisting of key-value pairs. +% The macro \meta{\cs{cmd}} expanded by \cs{expandafter} +% and put back into the parsing stream.\par\medskip +% \changes{v1.0e}{2008/03/04}{% +% Added a \string\cs{presets} key to make it easier to dynamically change options} % -% \noindent\DescribeMacro{\presets} We define the \cs{presets} key. The argument of presets is a macro, that is -% expanded and put back into the parsing stream. The \DescribeMacro{\epresets}\cs{epresets} keys is used -% when the properties are to be expanded early. (properties need to be protected \cs{protect}\cs{BG}) -% \changes{v2.9.23}{2019/01/22}{Added \string\cs{epresets} key} +% \noindent \DescribeMacro{\epresets}\hskip-\marginparsep\texttt{\darg{\meta{\cs{cmd}}}} The \cs{epresets} key is used +% when the properties are to be expanded early. The command argument \meta{\cs{cmd}} is fully expanded within +% an \cs{edef}; as a result, the keys need to be protected, for example, |\epresets{\protect\BC{red}}|. +% The command \cs{protectedKeys} can be used to protect the keys to all the key-value pairs. +% \changes{v2.9.23}{2019/01/22}{Added \string\cs{epresets} key}\par\medskip +% +% \noindent Both \cs{presets} and \cs{epresets} are handled within the \cs{proccessAppArgs} macro; +% the definitions below actually do nothing and are never expanded. % \begin{macrocode} -\def\@eqpresets#1{#1}% +\def\@eqpresets#1{#1} \def\@eqepresets#1{#1} % \end{macrocode} % \DescribeMacro{\W} The width of the boundary line. @@ -716,9 +791,9 @@ % (2016/12/22) Add a global value for boundary width, used to adjust the spacing between form fields % \changes{v2.9d}{2016/12/22}{Add a global value for boundary width} % \begin{macrocode} - \xdef\g@eq@W@value@bp{\eq@W@value bp}} + \xdef\g@eq@W@value@bp{\eq@W@value\b@}} \def\eq@W{}\def\eq@W@value{0} -\def\g@eq@W@valu@bp{0bp} % dps 12/22 +\def\g@eq@W@valu@bp{0bp} % \end{macrocode} % \DescribeMacro{\S} Line style, values are \texttt{S} (solid), \texttt{D} (dashed), % \texttt{B} (beveled), \texttt{I} (inset), \texttt{U} (underlined) @@ -897,24 +972,81 @@ \def\@eqmlLink#1{\def\eq@arg{#1}\ifx\eq@arg\ef@true \let\ef@mlLink\ef@One\else\let\ef@mlLink\ef@Zero\fi} % \end{macrocode} -% \DescribeMacro{\Lock} The Lock key is used with signature fields, currently, there is -% no nice user interface to this key. Typical entries are -%\begin{verbatim} -% \Lock{/Action/All} % all fields in the doc -% \Lock{/Action/Include % include all fields listed in Fields -% /Fields [(field1)(field2)...]} -% \Lock{/Action/Exclude % exclude all fields listed in Fields -% /Fields [(field1)(field2)...]} -%\end{verbatim} +% \DescribeMacro{\Lock} The \cs{Lock} key is used with signature fields. +% We allow the document author to either use raw PDF markup, or the simplified +% \pkg{eforms} key-value or UF key-values. To do this, we determine if +% \texttt{/Action} appears somewhere in the argument, if yes, then it is raw; +% otherwise, it is key-value markup. +% \begin{macrocode} +\def\ef@searchAction#1/Action#2\@nil{\def + \ef@argii{#2}\ifx\ef@argii\ef@end\let\ef@Action\ef@One\else + \let\ef@Action\ef@Zero\fi} +% \end{macrocode} +% The definition of \cs{@eqLock}, we determine if raw or KV-Pairs. % \begin{macrocode} \def\@eqLock#1{\def\eq@arg{#1}\ifx\eq@arg\@empty - \let\eq@Lock\@empty\else\def\eq@Lock{/Lock <<#1>>}\fi} -\def\eq@Lock{} + \let\eq@Lock\@empty\else\def\lckArgs{#1}% + \ef@searchAction#1/Action\end\@nil + \ifx\ef@Action\ef@One\def\ef@next{\let\Action\lckAction#1}\else + \let\ef@next\relax\fi\ef@next + \def\eq@Lock{/Lock <<\lckArgs>>}\fi} +\let\eq@Lock\@empty +% \end{macrocode} +%Various examples using \emph{raw PDF markup} follow: +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={!~@},codes={\catcode`\%=9}] +%\Lock{/Action/All} !% !textsf~all fields in the doc@ +%\Lock{/Action/Include !% !textsf~include all fields listed in Fields@ +% /Fields [(field1)(field2)...]} +%\Lock{/Action/Exclude !% !textsf~exclude all fields listed in Fields@ +% /Fields [(field1)(field2)...]} +%\end{Verbatim} +% A simplified syntax for the arguments of \cs{Lock}; sample +% syntax for the same three examples above are, +%\changes{v2.3.6}{2020/10/10}{Addition support for the \string\cs{Lock} key} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={!~@},codes={\catcode`\%=9}] +%\Lock{\Action\All} +%\Lock{\Action\IncludeFields{field1,field2,...}} +%\Lock{\Action\ExcludeFields{field1,field2,...}} +%\end{Verbatim} +%The code for the simplified markup for the \cs{Lock} key. +% \begin{macrocode} +\def\lckAll{\All} +\def\lckIncludeFields{\IncludeFields} +\def\lckExcludeFields{\ExcludeFields} +\def\lckActionTst#1{\let\X\ef@Yes#1}% +\def\lckAction#1{\def\@rgi{#1}\ifx\@rgi\lckAll + \def\lckArgs{/Action/All}\let\ef@next\relax\else + \ifx\@rgi\lckIncludeFields + \def\ef@next{\lckGetFieldsFor{Include}}\else + \ifx\@rgi\lckExcludeFields + \def\ef@next{\lckGetFieldsFor{Exclude}}\else + \PackageWarning{eforms}% + {The argument of the \string\Lock key\MessageBreak + is not correctly expressed. Review the documentation}% + \fi + \fi +\fi\ef@next +} +\def\lckGetFieldsFor#1#2{\@temptokena={}\@for\@fld:={#2}\do + {\edef\@etmp{\the\@temptokena(\@fld)}% + \@temptokena=\expandafter{\@etmp}% + }\edef\lckArgs{/Action/#1/Fields[\the\@temptokena]}% +} % \end{macrocode} +% Another option that is included in the Signed tab is titled ``This script executes +% when field is signed.'' +% This is an option that, through the user interface, is mutually exclusive from +% locking fields. This option appears to be implemented through the format event. +% For example, +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%codes={\catcode`\%=9}] +%\AAformat={app.alert("Thank you for signing this field.");} +%\end{Verbatim} %\paragraph*{Additional Actions.} -% We search for \cs{AACalculate}. -% The \cs{ef@searchCalc} searches for \cs{AACalculate}. If, for some reason, -% \cs{AA\-Cal\-cu\-late} is within a pair of braces, this search will not find it, +% \cs{ef@searchCalc} searches for the \cs{AACalculate} token. If, for some reason, +% \cs{AACalculate} is within a pair of braces, this search will not find it, % so don't group \cs{AACalculate} within braces, there is no reason to do so % anyway. If we find \cs{AACalculate}, we set \cs{isCalculate} to \texttt{true}, which is normally % \texttt{false}. @@ -1058,16 +1190,26 @@ \def\@eqDA#1{\def\eq@DA{#1}} \def\eq@DA{\eq@textFont\space\eq@textSize\space Tf \eq@textColor}% % \end{macrocode} -% \DescribeMacro{\textFont} PDF form font +% \DescribeMacro{\textFont} PDF form font. This is a simple assignment; we define +% \DescribeMacro{\textFontDefault}\cs{textFontDefault} to conveniently change the default font over +% all form fields, with the exception of checkboxes and radio button fields. The default +% is \uif{Helv}. +% \changes{v2.4.1}{2020/12/14}{Defined \string\cs{eqtextFontDefault}} % \begin{macrocode} \def\@eqtextFont#1{\def\eq@textFont{/#1}} -\def\eq@textFont{/Helv} +\def\textFontDefault#1{\def\eq@textFontDefault{#1} + \def\eq@textFont{/#1}} +\textFontDefault{Helv} % \end{macrocode} -% \DescribeMacro{\textSize} PDF form text size +% \DescribeMacro{\textSize} PDF form text size. This is a simple assignment; we define +% \DescribeMacro{\textSizeDefault}\cs{textSizeDefault} to conveniently change the default font size for all +% form fields, including checkboxes and radio buttons. The default is 9 (points). +% \changes{v2.4.1}{2020/12/14}{Defined \string\cs{eqtextSizeDefault}} % \begin{macrocode} \def\@eqtextSize#1{\def\eq@textSize{#1}} -\def\eq@textSizeDefault{9} -\edef\eq@textSize{\eq@textSizeDefault} +\def\textSizeDefault#1{\def\eq@textSizeDefault{#1} + \def\eq@textSize{#1}} +\textSizeDefault{9} % \end{macrocode} % \DescribeMacro{\RV} Rich text value %\changes{v2.5l}{2011/01/28}{% @@ -1135,8 +1277,6 @@ % of the combo box (only), the code below \cs{let}s \cs{eq@DV} to \cs{@empty} in enhanced % preview mode, for combo boxes only. % \begin{macrocode} -% \ifx\annot@type\annot@type@combobox -% \ifefpmpv\let\eq@DV\@empty\fi\fi \makespecialJS\fi\fi}\def\eq@DV{} % \end{macrocode} % \DescribeMacro{\nuDV} \cs{@eqnuDV} is the old definition of DV. This version does not @@ -1248,7 +1388,9 @@ \let\eq@Ff\@empty\else\def\eq@Ff{/Ff #1}\fi} \def\eq@Ff{} % \end{macrocode} -% \paragraph*{keys specific to text fields:} \texttt{MaxLen} +% \goodbreak +% \paragraph*{Keys specific to text fields:} The following keys are specific to +% text fields. % \begin{macrocode} % \end{macrocode} % \DescribeMacro{\MaxLen} text fields only. Restricts number of characters @@ -1259,15 +1401,16 @@ \def\eq@MaxLen{} % \end{macrocode} % \DescribeMacro{\H} Highlight, used in button fields and link annotation. Possible values -% are None, Push, Outline, Invert (respectively, \verb!\H{N}!, \verb!\H{P}!, -% \verb!\H{O}!, \verb!\H{I}!) -% The default highlighting is invert (I). +% are None, Push, Outline, Invert (respectively, |\H{N}|, |\H{P}|, +% |\H{O}|, |\H{I}|) +% The default highlighting is invert (\texttt{I}). % \begin{macrocode} \def\@eqH#1{\def\eq@arg{#1}\ifx\eq@arg\@empty \let\eq@H\@empty\else\def\eq@H{/H/#1}\fi}\def\eq@H{} % \end{macrocode} % \paragraph*{Appearance characteristics dictionary:} -% \texttt{MK=R, BC, BG, CA, RC, AC, I, RI, IX, IF, TP} +% \texttt{MK\,=\,R,\,BC,\,BG,\,CA,\,RC,\,AC,\,I,\,RI,\allowbreak\,IX,\,IF,^^A +% \,TP} % \begin{macrocode} % \end{macrocode} % \DescribeMacro{\MK} A dictionary containing other keys @@ -1596,7 +1739,8 @@ % \end{macrocode} % \begin{macro}{\rectH} % \begin{macro}{\rectW} -% Use to set the height and width of a widget. +% Used to set the height and width of a widget, useful when the width and height arguments +% of the widget is not accessible. % \begin{macrocode} \def\@eqrectH#1{\def\eq@rectH{#1}\ifx\eq@rectH\@empty\else \setlength\eflength\eq@rectH\edef\eq@rectH{\the\eflength}\fi} @@ -1605,6 +1749,29 @@ % \end{macrocode} % \end{macro} % \end{macro} +% \begin{macro}{\width} +% Re-scale the widget to have a specified width, keeping the height in proportion +% \changes{v2.3.5}{2020/09/15}{Added \string\pkg{eforms} keys \string\texttt{width}, \string\texttt{height}, +% and \string\texttt{scale}} +% \begin{macrocode} +\def\@eqwidth#1{\def\eq@width{#1}} +\let\eq@width\@empty +% \end{macrocode} +% \begin{macro}{\height} +% Re-scale the widget to have a specified height, keeping the height in proportion +% \begin{macrocode} +\def\@eqheight#1{\def\eq@height{#1}} +\let\eq@height\@empty +% \end{macrocode} +% \begin{macro}{\scale} +% Re-scale the widget by a scale factor. +% \begin{macrocode} +\def\@eqscalefactor#1{\def\eq@scalefactor{#1}} +\let\eq@scalefactor\@empty +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} % \DescribeMacro{\objdef} Insert an indirect reference (ps only drivers). The value of this % key must be unique throughout the whole document. % This is a \textbf{pdfmark} feature that inserts a references to this COS object, @@ -1766,33 +1933,37 @@ \def\eq@protect#1{\let#1\@empty} % \end{macrocode} % \leavevmode -% \DescribeMacro{\protectedKeys}\hskip-\marginparsep\texttt{\darg{\ameta{cmd-name}}\darg{\ameta{KV-pairs}}} -% is a key that protects each key in a \pkg{eforms} key-value list; eg, it replaces -% \cs{BG\darg{red}} with \cs{protect\cs{BG\darg{red}}}. The results are saved under the command +% \DescribeMacro{\protectedKeys}\hskip-\marginparsep\texttt{*\darg{\ameta{cmd-name}}\darg{\ameta{KV-pairs}}} +% is a command that protects each key in a \pkg{eforms} key-value list; eg, it replaces +% \cs{BC\darg{red}} with \cs{protect\cs{BC\darg{red}}}. The results are saved under the command % name \cs{\ameta{cmd-name}}. Designed to be used with the \cs{epresets} key, which expands its arguments % early; the keys are not defined so we prevent them from expanding prior to being passed to -% the parsing mechanism. \cs{protectedKeys} is used in the \pkg{bargraph-js} package. +% the parsing mechanism. \cs{protectedKeys} is used in the \pkg{bargraph-js} package. If \cs{\ameta{cmd-name}} +% is already defined, a warning message is written to the TEX LOG, unless the \texttt*-option is taken. % \changes{v2.10}{2019/03/16}{Added \string\cs{protectedKeys}} % \begin{macrocode} -% \end{macrocode} -% \DescribeMacro{\multigroupradios} Declares whether there are multiple sets of radio button groups -% with the same names and values, -% \begin{macrocode} -\def\@eqmultigroupradios#1{\let\ef@multigroupradios\ef@YES} -\let\ef@multigroupradios\ef@NO -% \end{macrocode} -% \begin{macrocode} -\def\ef@stop{\relax} %\def\ef@relax{\relax} -\def\protectedKeys#1#2{\ef@scratchtoks={}% - \@ifundefined{#1}{}{\PackageWarning{eforms} +\def\ef@stop{\relax} +\let\isst@r\ef@NO +\def\protectedKeys{\@ifstar + {\let\isst@r\ef@YES\protectedKeys@i} + {\let\isst@r\ef@NO\protectedKeys@i}% +} +\def\protectedKeys@i#1#2{\ef@scratchtoks={}% + \@ifundefined{#1}{}{\ifx\isst@r\ef@NO\PackageWarning{eforms} {Be aware command name #1 is already\MessageBreak - in use}}\protectedKeys@gettwo#2\ef@stop\relax - \expandafter\edef\csname #1\endcsname{\the\ef@scratchtoks}} + in use}\fi}\protectedKeys@gettwo#2\ef@stop\relax + \csarg\edef{#1}{\the\ef@scratchtoks}} \def\protectedKeys@gettwo#1#2{% \ifx#1\ef@stop\else\ef@scratchtoks=\expandafter {\the\ef@scratchtoks\protect#1{#2}}\expandafter \protectedKeys@gettwo\fi} % \end{macrocode} +% \DescribeMacro{\multigroupradios} Declares whether there are multiple sets of +% radio button groups with the same names and values, +% \begin{macrocode} +\def\@eqmultigroupradios#1{\let\ef@multigroupradios\ef@YES} +\let\ef@multigroupradios\ef@NO +% \end{macrocode} % % \subsubsection{Support for Hex escapes in PDF names} % \changes{v2.9p}{2017/10/10}{rework the support for Hex escapes in PDF names} @@ -2258,13 +2429,14 @@ % % \begin{macro}{\JS} % \begin{macro}{\Named} -% \begin{macro}{\URI} % \begin{macro}{\Next} % \begin{macro}{\toggleAttachmentsPanel} % Convenience commands for writing JavaScript and for executing named events. +% \changes{v2.3.5}{2020/11/20}{Remove \string\cs{URI} from \string\pkg{eforms}, already +% defined in \string\pkg{insdljs}. (Jason G.)} % \begin{macrocode} \providecommand{\JS}[1]{/S/JavaScript/JS(#1)} -\newcommand{\URI}[1]{/S/URI/URI(#1)} +%\newcommand{\URI}[1]{/S/URI/URI(#1)} \providecommand{\Named}[1]{/S/Named/N/#1} \newcommand{\Next}[1]{/Next<<#1>>} \providecommand{\toggleAttachmentsPanel}[2]{% @@ -2275,7 +2447,6 @@ % \end{macro} % \end{macro} % \end{macro} -% \end{macro} % When entering triggers into the AA dictionary, use these commands (all the ones of % the form \cs{AA<Name>}. These all have one argument, the action to take, usually % a JavaScript action. There is now a routine in the parsing of the AA dictionary @@ -2382,7 +2553,7 @@ %Hidden (and does not print) &|\F\FHidden| %\end{tabular} % -%\subsubsection{Field Flags /Ff Definitions}\label{Ff} +%\subsubsection{Field Flags \texttt{/Ff} Definitions}\label{Ff} % \begin{macrocode} \def\FfReadOnly{1} % all \def\FfRequired{2} % all @@ -2485,8 +2656,8 @@ \edef\eq@rectH{\the\eflength}% \fi } -\def\ef@djXPD{\ifxetex\ifmakeXasPD\ef@adjrectWH{2bp}\fi - \else\ifmakePDasX\ef@adjrectWH{-2bp}\fi\fi} +\def\ef@djXPD{\ifxetex\ifmakeXasPD\ef@adjrectWH{2\b@}\fi + \else\ifmakePDasX\ef@adjrectWH{-2\b@}\fi\fi} % \end{macrocode} % \begin{macro}{\eq@setButtonProps} % This macro measure the width of the largest text on defined for the @@ -2496,10 +2667,14 @@ % #1 is the driver specific macro to build the button widget % #2 are the button properties %\end{verbatim} +%\DescribeMacro\btnSpcr\hskip-\marginparsep\texttt{\darg{\ameta{content}}} Adds space on either +%side of a pushbutton caption; the amount of the spacing is the width of \ameta{content} in the current +%current font, the fontsize is the one determined by the \cs{textSize} key. %\changes{v2.5m}{2012/01/27}{Added \string\cs{ef@btnspcr} to give user % ability to adjust the spacing around text for a button.} +% \changes{v2.3.5}{2020/09/15}{Added \string\cs{tbnSpcr} to populate \string\cs{eq@btnspcr}} % \begin{macrocode} -%\def\ef@btnspcr{\ } +\def\btnSpcr#1{\def\ef@btnspcr{#1}} \def\ef@btnspcr{} % \end{macrocode} % \subsubsection{Enhanced preview}\label{pmpv} @@ -2562,10 +2737,35 @@ % \changes{v2.11}{2019/05/24}{Enhanced preview introduced} % % \subsubsection{Set push button properties} -% \begin{macrocode} +% \leavevmode\DescribeMacro\ef@adjcapfont^^A +% When \cs{pmpvOn} is expanded, the caption text is previewed, we try to adjust +% the typeset caption font size to match the font size used by the push button. +% \changes{v2.3.5}{2020/09/15}{Added \string\cs{ef@adjcapfont}} +% \begin{macrocode} +\def\ef@adjcapfont{% + \dimen@=\eq@textSize\b@ + \dimen@1.00375\dimen@ + \edef\eq@textSize@pt{\strip@pt\dimen@}% + \fontsize{\eq@textSize@pt}{0}\selectfont +} \def\eq@setButtonProps#1#2{\makeJSspecials \processAppArgs#2\end\@nil % set widget properties % \end{macrocode} +% If \cs{eq@rectW} is not a positive dimension, mark it as empty. +% \changes{v2.3.5}{2020/09/15}{If \string\cs{rectW} is not a positive dimension, +% make it empty for push buttons.} +% \begin{macrocode} + \ifx\eq@rectW\@empty\else + \ifdim\eq@rectW>0pt \else\let\eq@rectW\@empty\fi\fi +% \end{macrocode} +% Re-scale dimensions as requested. If \cs{eq@rectW} is empty, then the width is calculated +% from the \cs{CA} key; re-scaling is ignored in this case. +% \changes{v2.3.5}{2020/09/15}{Added \string\cs{ef@optscale}} +% \changes{v2.3.5}{2020/09/15}{If \string\cs{rectW} is not a positive dimension, +% make it empty for push buttons.} +% \begin{macrocode} + \ifx\eq@rectW\@empty\else\expandafter\ef@optscale\fi +% \end{macrocode} % Coordinate the values of \cs{BC} and \cs{W}, if one is empty % the other is too. % \changes{v2.9f}{2017/01/01}{BC=empty iff W=0 or empty} @@ -2576,22 +2776,19 @@ \ifx\eq@rectW\@empty \ifnum\eq@textSize=0 \else % \end{macrocode} -% If \cs{rectW} is nonempty, and \cs{textSize} is not zero, we calculate with +% If \cs{rectW} is empty and \cs{textSize} is not zero, we calculate with % width of the caption on the button by first adjusting the font size % to properly gauge the width of the text. This may not be really accurate % because the font used by tex will no doubt be different from the font used % by the button. % \begin{macrocode} - \dimen@=\eq@textSize bp - \dimen@1.00375\dimen@ - \edef\eq@textSize@pt{\strip@pt\dimen@}% - \fontsize{\eq@textSize@pt}{0}\selectfont + \ef@adjcapfont \fi % \end{macrocode} % If the button is beveled, we pad the width by 2 times the width of the border, % the beveled edge taking up a width approx equal to the border. % \begin{macrocode} - \dimen@\eq@W@value bp + \dimen@\eq@W@value\b@ \def\eq@S@B{B}\ifx\eq@S@value\eq@S@B \def\eq@btn@sp{\hbox to2\dimen@{\hfill}}% \else @@ -2612,7 +2809,7 @@ % (2017/01/22) If X-like, increase by 2bp % \changes{v2.9k}{2017/01/22}{If X-like, increase by 2bp} % \begin{macrocode} - \ifmakePDasX\advance\eq@tmpdima2bp\fi + \ifmakePDasX\advance\eq@tmpdima2\b@\fi \wd\eq@tmpbox=\eq@tmpdima \else % if \eq@rectW is not \@empty \wd\eq@tmpbox=\eq@rectW @@ -2629,7 +2826,10 @@ % \begin{macrocode} \ifx\ef@isBGtransparent\ef@YES \let\ef@kvCA\@empty\fi - \ifx\ef@CApv\ef@YES\PMPV{\eq@CA}\fi\fi +% \end{macrocode} +% Adjust the font size for the preview text. +% \begin{macrocode} + \ifx\ef@CApv\ef@YES\ef@adjcapfont\PMPV{\eq@CA}\fi\fi \ef@djXPD#1% } % \end{macrocode} @@ -2652,6 +2852,11 @@ % \changes{v2.9f}{2017/01/01}{BC=empty iff W=0 or empty} % \begin{macrocode} \ifx\annot@type@link\annot@type\else +% \end{macrocode} +% Re-scale dimensions as requested +% \changes{v2.3.5}{2020/09/15}{Added \string\cs{ef@optscale}} +% \begin{macrocode} + \ef@optscale \ifx\eq@BC\@empty\@eqW{}\else \if\eq@W@value0\let\eq@BC\@empty\fi\fi \fi @@ -2701,13 +2906,14 @@ % \begin{macro}{\efKern} % A convenience macro to adjust spacing between fields. %\begin{itemize} -% \item \texttt{\#1} is the spacing for ps/pdftex drivers -% \item \texttt{\#2} is the spacing for xetex +% \item \texttt{\#1} is the spacing for non-\app{xelatex} apps +% \item \texttt{\#2} is the spacing for \app{xelatex} %\end{itemize} -%Unlike ps/pdftex, xetex includes the border width as part of the bounding rectangle -%dimensions. As a result, this wider boundary is known to {\TeX} as it lays out the line. For -% ps/pdftex, the boundary width is invisible to {\TeX}. The command \cs{ef@adjHWxetex} tries to -% adjust the dimensions for xetex so the form field dimensions are the over all platforms. The boundary +% The \app{xelatex} application includes the border width as part of the bounding rectangle +%dimensions; all other PDF creators do not include the border as part of the dimensions +%of the bounding rectangle. As a result, this wider boundary is known to {\TeX} as it lays out the line. For +% non-\app{xelatex} applications, the boundary width is \emph{invisible} to {\TeX}. The command \cs{ef@adjHWxetex} tries to +% adjust the dimensions for \app{xelatex} so the form field dimensions are the same over all platforms. The boundary % is still ``visible'' in {\TeX} space. % %\paragraph*{Sample uses:} @@ -2721,6 +2927,7 @@ \newcommand\efKern[2]{\ifxetex\kern#2\else\kern#1\fi} % \end{macrocode} % \end{macro} +% The use of \cs{efKern} has been largely subsumed by \cs{olBdry} and \cs{cgBdry}, however. % \DescribeMacro{\olBdry}\cs{olBdry} and \DescribeMacro{\cgBdry}\cs{cgBdry} % are convenience commands to setting the gap between two contiguous fields. % \cs{olBdry} gives positions the fields so that the boundary lines overlap @@ -2729,19 +2936,23 @@ % \changes{v2.9d}{2016/12/22}{Added \string\cs{olBdry} and\string\cs{cgBdry}} % \begin{macrocode} \newcommand\olBdry{\bgroup\ifxetex - \@tempdima-\g@eq@W@value@bp\relax - \edef\@mtkern{\the\@tempdima}\else - \@tempdima2bp\relax\advance\@tempdima-\g@eq@W@value@bp\relax % 12/26 - \edef\@mtkern{\the\@tempdima}\fi\kern\@mtkern\egroup + \@tempdima-\g@eq@W@value@bp + \edef\@mtkern{\the\@tempdima}\else + \@tempdima2\b@\advance\@tempdima-\g@eq@W@value@bp + \edef\@mtkern{\the\@tempdima}\fi\kern\@mtkern\egroup } % \end{macrocode} -% (2017/01/15) Add optional argument to \cs{cgBdry} +% \DescribeMacro\cgBdry\hskip-\marginparsep\texttt{[\ameta{length}]} +% This command inserts spacing between to fields so they are +% contiguous (boundary-to-boundary); it insert additional space based in the +% optional argument \ameta{length}. Normally, when the boundaries are the same +% color, \cs{olBdry} is used; otherwise, \cs{cgBdry} looks best. % \changes{v2.9h}{2017/01/15}{Add optional argument to \string\cs{cgBdry}} % \begin{macrocode} -\newcommand\cgBdry[1][0bp]{\bgroup\def\ef@rgi{#1}\ifx\ef@rgi\@empty - \def\ef@rgi{0bp}\fi\setlength{\@tempdima}{\ef@rgi}% - \ifxetex\else\addtolength{\@tempdima}{2bp}\fi - \kern\@tempdima\egroup\ignorespaces} +\newcommand\cgBdry[1][0\b@]{\bgroup\def\ef@rgi{#1}\ifx\ef@rgi\@empty + \def\ef@rgi{0\b@}\fi\setlength{\@tempdima}{\ef@rgi}% + \ifxetex\else\addtolength{\@tempdima}{2\b@}\fi + \kern\@tempdima\egroup\ignorespaces} % \end{macrocode} % \DescribeMacro{\volBdry}\cs{volBdry} and \DescribeMacro{\vcgBdry}\cs{vcgBdry} % are convenience commands to setting the gap between two vertically oriented fields. @@ -2749,11 +2960,13 @@ % (ol) and \cs{vcgBdry} positions the field so the boundary lines are % contiguous (cg). % \changes{v2.9h}{2017/01/15}{Added \string\cs{volBdry} and\string\cs{vcgBdry}} -% \changes{v2.9n}{2017/09/04}{Added \string\cs{efSupprIndent}}. +% \changes{v2.9n}{2017/09/04}{Added \string\cs{efSupprIndent}} +% \changes{v2.3.3}{2020/04/15}{Use \string\cs{toks@} in \string\cs{efSupprIndent}; +% use of \string\cs{ef@scratchtoks} proved to be a problem.} % \begin{macrocode} -\newcommand{\efSupprIndent}{\ef@scratchtoks=\expandafter{\the\everypar}% +\newcommand{\efSupprIndent}{\toks@=\expandafter{\the\everypar}% \everypar{{\setbox\z@\lastbox}\clubpenalty\@M - \everypar=\expandafter{\the\ef@scratchtoks}}} + \everypar=\expandafter{\the\toks@}}} \newcommand\volBdry{\bgroup\parskip0pt\relax\@@par\nointerlineskip \olBdry\egroup\efSupprIndent} \newcommand\vcgBdry{\@ifstar{\edef\ef@offset{\the\parskip}\vcgBdry@i} @@ -2908,13 +3121,30 @@ \ef@pdfstrCLOpti} % \end{macrocode} % \subsubsection{List Box}\label{listbox} +% +%\changes{v2.4}{2020/11/28}{Allow \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 % the optional argument, the following aliases are used: \cs{nameuse} for \cs{@nameuse} % and \cs{tops} for \cs{texorpdfstring}. +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars=!(),codes={\catcode`\%=9}] +%#1 = !textsf(optional, used to enter any modification of the appearance/actions) +%#2 = !textsf(the title of the button field) +%#3 = !textsf(the width of the bounding rectangle) +%#4 = !textsf(the height of the bounding rectangle) +%#5 = !textsf(list of key-values for list/combo box) +%#6 = !textsf(not used) +%#7 = !textsf(set props and driver macros) +%#8 = !textsf(every macros) +%\end{Verbatim} % \begin{macrocode} \def\annot@type@listbox{listbox} -\newcommand\list@@Box[8]{\begingroup +\bgroup\obeyspaces +\gdef\list@@Box{\begingroup\global\let =\pdfSP +\ef@sanitize@toks\list@@@Box}\egroup +\newcommand\list@@@Box[8]{\endgroup\begingroup \let\nameuse\@nameuse\let\tops\texorpdfstring \edef\annot@type{\annot@type@listbox}% \pdfstringdef\Fld@name{#2}\dl@paramlocal @@ -2926,22 +3156,20 @@ \eqf@setDimens{#3}{#4}% \def\eq@DA{\eq@textFont\space\eq@textSize\space Tf \eq@textColor}% \@processEvery#8\end\noindent#6#7{#1}} -% \end{macrocode} -% \DescribeMacro restores the obey spaces space to its default, -% saved earlier. This command is placed at the end of each of the form field -% commands to reverse the earlier change to \cs{pdfSP}. -% \begin{macrocode} \bgroup\obeyspaces \gdef\listBox{\global\let =\dl@sp@ce}\egroup % \end{macrocode} -% \begin{macro}{\listBox} -%\begin{verbatim} -% #1 = optional, used to enter any modification of the appearance/actions -% #2 = the title of the list box field -% #3 = the width of the bounding rectangle -% #4 = the height of the bounding rectangle -% #5 = the face values/export values of list. -%\end{verbatim} +% \begin{macro}{\listBox}\hskip-\marginparsep +% \texttt{[\ameta{options}]\darg{\ameta{fld-name}}\darg{\ameta{wd}}^^A +% \darg{\ameta{ht}}\darg{\ameta{face-export-list}}} The user interface to creating a list box field. +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars=!(),codes={\catcode`\%=9}] +%#1 = !textsf(optional, used to enter any modification of the appearance/actions) +%#2 = !textsf(the title of the list box field) +%#3 = !textsf(the width of the bounding rectangle) +%#4 = !textsf(the height of the bounding rectangle) +%#5 = !textsf(the face values/export values of list) +%\end{Verbatim} %\noindent Below are the default settings for the list box % \begin{macrocode} \def\listBoxDefaults{\W{1}\S{I}\F{\FPrint}\BC{0 0 0}} @@ -2962,11 +3190,28 @@ % \end{macrocode} % \end{macro} % \subsubsection{Combo Box}\label{combobox} +% +%\changes{v2.4}{2020/11/28}{Allow \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}. +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars=!(),codes={\catcode`\%=9}] +%#1 = !textsf(optional, used to enter any modification of the appearance/actions) +%#2 = !textsf(the title of the button field) +%#3 = !textsf(the width of the bounding rectangle) +%#4 = !textsf(the height of the bounding rectangle) +%#5 = !textsf(list of key-values for list/combo box) +%#6 = !textsf(not used) +%#7 = !textsf(set props and driver macros) +%#8 = !textsf(every macros) +%\end{Verbatim} % \begin{macrocode} \def\annot@type@combobox{combobox} -\newcommand\combo@@Box[8]{\begingroup +\bgroup\obeyspaces +\gdef\combo@@Box{\begingroup\global\let =\pdfSP +\ef@sanitize@toks\combo@@@Box}\egroup +\newcommand\combo@@@Box[8]{\endgroup\begingroup \let\nameuse\@nameuse\let\tops\texorpdfstring \edef\annot@type{\annot@type@combobox}% \@eqFf{\FfCombo}\pdfstringdef\Fld@name{#2}\dl@paramlocal @@ -2979,15 +3224,18 @@ \def\eq@DA{\eq@textFont\space\eq@textSize\space Tf \eq@textColor}% \@processEvery#8\end\noindent#6#7{#1}} % \end{macrocode} -% \begin{macro}{\comboBox} +% \begin{macro}{\comboBox}\hskip-\marginparsep +% \texttt{[\ameta{options}]\darg{\ameta{fld-name}}\darg{\ameta{wd}}^^A +% \darg{\ameta{ht}}\darg{\ameta{face-export-list}}}\\ % A general combo box command. -%\begin{verbatim} -% #1 = optional, used to enter any modification of the appearance/actions -% #2 = the title of the radio field -% #3 = the width of the bounding rectangle -% #4 = the height of the bounding rectangle -% #5 = the face values/export values of combo box. -%\end{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars=!(),codes={\catcode`\%=9}] +%#1 = !textsf(optional, used to enter any modification of the appearance/actions) +%#2 = !textsf(the title of the radio field) +%#3 = !textsf(the width of the bounding rectangle) +%#4 = !textsf(the height of the bounding rectangle) +%#5 = !textsf(the face values/export values of combo box) +%\end{Verbatim} %\noindent The default settings for the \cs{comboBox} % \begin{macrocode} \def\comboBoxDefaults{\W{1}\S{I}\F{\FPrint}\BC{0 0 0}} @@ -3124,26 +3372,44 @@ % when setting the dimensions of this widget. Made the same % changes for all AcroForm elements and for linking. %} +%\changes{v2.4}{2020/11/28}{Rewrite of \string\cs{push@@Button} to support \string\cs{pdfSpacesOn}} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars=!(),codes={\catcode`\%=9}] +%#1 = !textsf(optional, used to enter any modification of the appearance/actions) +%#2 = !textsf(the title of the button field) +%#3 = !textsf(the width of the bounding rectangle) +%#4 = !textsf(the height of the bounding rectangle) +%#5 = !textsf(not used) +%#6 = !textsf(set props and driver macros) +%#7 = !textsf(every macros) +%\end{Verbatim} % \begin{macrocode} \def\annot@type@button{pushbtn} -\newcommand\push@@Button[7]{\begingroup - \let\nameuse\@nameuse\let\tops\texorpdfstring +\bgroup\obeyspaces +\gdef\push@@Button{\begingroup\global\let =\pdfSP +\ef@sanitize@toks\push@@@Button}\egroup +\newcommand\push@@@Button[7]{\endgroup\begingroup + \let\nameuse\@nameuse\let\tops\texorpdfstring% \edef\annot@type{\annot@type@button}% - \pdfstringdef\Fld@name{#2}\dl@paramlocal - \makeJSspecials\ef@preProcDefns + \pdfstringdef\Fld@name{#2}\dl@paramlocal% + \makeJSspecials\ef@preProcDefns% \def\eq@Ff{/Ff \FfPushButton}% \def\eq@DA{\eq@textFont\space\eq@textSize\space Tf \eq@textColor}% \eqf@setDimens{#3}{#4}% \@processEvery#7\end\noindent#5#6{#1}} + % \end{macrocode} % \begin{macro}{\pushButton} -%\begin{verbatim} -%#1 = optional, used to enter any modification of the appearance/actions -%#2 = the title of the button field -%#3 = the width of the bounding rectangle -%#4 = the height of the bounding rectangle -%\end{verbatim} -%\noindent The default for \cs{pushButton} +% \hskip-\marginparsep\texttt{[\ameta{options}]\darg{\ameta{fld-name}}\darg{\ameta{wd}}\darg{\ameta{ht}}} +% The user command for creating a push button form field. +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars=!(),codes={\catcode`\%=9}] +%#1 = !textsf(optional, used to enter any modification of the appearance/actions) +%#2 = !textsf(the title of the button field) +%#3 = !textsf(the width of the bounding rectangle) +%#4 = !textsf(the height of the bounding rectangle) +%\end{Verbatim} +%The defaults for \cs{pushButton} % \begin{macrocode} \def\pushButtonDefaults{% \W{1}\S{B}\F{\FPrint}\BC{0 0 0} @@ -3168,11 +3434,28 @@ % The basic command for creating check boxes. For \emph{enhanced preview} we define % \DescribeMacro\pmpvMrk\cs{pmpvMrk\darg{mrk}}, which defines \cs{pmpv@mrk} that is eventually % used in the core of \cs{ef@Bbox}. +%\changes{v2.4}{2020/11/28}{Rewrite of \string\cs{check@@Box} to support \string\cs{pdfSpacesOn}} % \begin{macrocode} \def\pmpvMrk#1{\def\pmpv@mrk{#1}} \pmpvMrk{X} +% \end{macrocode} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars=!(),codes={\catcode`\%=9}] +%#1 = !textsf(optional, used to enter any modification of the appearance/actions) +%#2 = !textsf(the title of the button field) +%#3 = !textsf(the width of the bounding rectangle) +%#4 = !textsf(the height of the bounding rectangle) +%#5 = !textsf(the `on' value, usually Yes) +%#6 = !textsf(not used) +%#7 = !textsf(set props and driver macros) +%#8 = !textsf(every macros) +%\end{Verbatim} +% \begin{macrocode} \def\annot@type@checkbox{checkbox} -\newcommand\check@@Box[8]{\begingroup +\bgroup\obeyspaces +\gdef\check@@Box{\begingroup\global\let =\pdfSP +\ef@sanitize@toks\check@@@Box}\egroup +\newcommand\check@@@Box[8]{\endgroup\begingroup \let\nameuse\@nameuse\let\tops\texorpdfstring \let\#\ef@Hx\edef\annot@type{\annot@type@checkbox}% \pdfstringdef\Fld@name{#2}\@eqAS{Off}\dl@paramlocal @@ -3195,13 +3478,17 @@ \@processEvery#8\end\noindent#6#7{#1}} % \end{macrocode} % \begin{macro}{\checkBox} -%\begin{verbatim} -%#1 = optional, used to enter any modification of the appearance/actions -%#2 = the title of the check box field -%#3 = the width of the bounding rectangle -%#4 = the height of the bounding rectangle -%#5 = the 'on value' or export value, the default is "Yes". -%\end{verbatim} +% \hskip-\marginparsep\texttt{[\ameta{options}]\darg{\ameta{fld-name}}\darg{\ameta{wd}}^^A +% \darg{\ameta{ht}}\darg{\ameta{on-value}}} +% The user interface for creating a check box. +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars=!(),codes={\catcode`\%=9}] +%#1 = !textsf(optional, used to enter any modification of the appearance/actions) +%#2 = !textsf(the title of the check box field) +%#3 = !textsf(the width of the bounding rectangle) +%#4 = !textsf(the height of the bounding rectangle) +%#5 = !textsf(the `on value' or export value, the default is "Yes") +%\end{Verbatim} %\noindent The default for \cs{checkBox} % \begin{macrocode} \def\checkBoxDefaults{\F{\FPrint}\W{1}\S{S}\BC{0 0 0}} @@ -3226,7 +3513,7 @@ % is available when \DescribeMacro\useNewRadiosOff\cmd{\useNewRadiosOff} is expanded. This is the default. % % When \DescribeMacro\useNewRadiosOn\cmd{\useNewRadiosOn} is expanded, the new code for radio buttons is used. -% As a result, you need t\emph{hree compiles} to bring the AUX files up to date. The AUX files now +% As a result, you need \emph{three compiles} to bring the AUX files up to date. The AUX files now % contain PDF object references to radio buttons. Because this new scheme degrades the experience % of creating radio buttons (heavy I/O usage), use this option if you and the consumers of your PDF\emph{ do not use} % Adobe PDF viewers (on a desktop/laptop). @@ -3234,6 +3521,7 @@ % Use the default setting (\cmd{\useNewRadiosOff}) when you will view the PDF in AA/AR and save it; otherwise, if the PDF is to be viewed in non-conforming % PDF readers, never having been saved using AA/AR, use the \cmd{\useNewRadiosOn} setting. % \changes{v2.3}{2019/06/14}{Rewrote radio buttons so they work in non-conforming PDF readers} +% \changes{v2.4}{2020/11/28}{Rewrite of \string\cs{radio@@Button} to support \string\cs{pdfSpacesOn}} % % \medskip\noindent\textbf{Discussion.} The default scheme is to create the radio buttons \begin{quote}\footnotesize % \cs{radioButton\darg{\ameta{name}}\darg{\ameta{width}}\darg{\ameta{height}}} ...\\ @@ -3287,38 +3575,33 @@ % \begin{macrocode} \def\ef@NewRadiosLateOpts{% % \end{macrocode} -% We do nothing if the new scheme is not being used. -% \begin{macrocode} - \ifuseNewRadios -% \end{macrocode} % If this is a multi-group radio button field that work independently, we adjust the `on' value, as in this case, % the `on' value is referenced by an index, 0, 1, 2,... % \begin{macrocode} - \@nameuse{multigroup@\Fld@name}% - \ifx\ef@multigroupradios\ef@YES - \ifpdfmarkup - \def\eq@On{(\@nameuse{radioindex@\Fld@name}) cvn }\else - \def\eq@On{/\@nameuse{radioindex@\Fld@name}}\fi - \expandafter\ifx\csname OnVal@\Fld@name\endcsname\relax - \@eqAS{Off}\else % today - \ifnum\@nameuse{OnVal@\Fld@name}=% - \@nameuse{radioindex@\Fld@name}\relax - \@eqAS{\@nameuse{radioindex@\Fld@name}}\else\@eqAS{Off}\fi\fi - \else - \edef\x{\@nameuse{OnVal@\Fld@name}}% - \ifx\x\ef@thisChoice\@eqAS{\@nameuse{OnVal@\Fld@name}}\else - \@eqAS{Off}\fi - \fi + \@nameuse{multigroup@\Fld@name}% + \ifx\ef@multigroupradios\ef@YES + \ifpdfmarkup + \def\eq@On{(\@nameuse{radioindex@\Fld@name}) cvn }\else + \def\eq@On{/\@nameuse{radioindex@\Fld@name}}\fi + \expandafter\ifx\csname OnVal@\Fld@name\endcsname\relax + \@eqAS{Off}\else % today + \ifnum\@nameuse{OnVal@\Fld@name}=% + \@nameuse{radioindex@\Fld@name}\relax + \@eqAS{\@nameuse{radioindex@\Fld@name}}\else\@eqAS{Off}\fi\fi + \else + \edef\x{\@nameuse{OnVal@\Fld@name}}% + \ifx\x\ef@thisChoice\@eqAS{\@nameuse{OnVal@\Fld@name}}\else + \@eqAS{Off}\fi + \fi % \end{macrocode} % If these are groups of radio button fields that light up in unison, we % take to get the \cs{/AS} entry right. % \begin{macrocode} - \@nameuse{uniradios@\Fld@name}% - \ifx\isRadiosInUnison\ef@YES - \edef\x{\@nameuse{value@\Fld@name}}% - \ifx\x\ef@thisChoice\expandafter\@eqAS - \expandafter{\ef@thisChoice}\else\@eqAS{Off}\fi - \fi + \@nameuse{uniradios@\Fld@name}% + \ifx\isRadiosInUnison\ef@YES + \edef\x{\@nameuse{value@\Fld@name}}% + \ifx\x\ef@thisChoice\expandafter\@eqAS + \expandafter{\ef@thisChoice}\else\@eqAS{Off}\fi \fi } % \end{macrocode} @@ -3359,8 +3642,23 @@ % \end{macrocode} % Finally, we arrive at the low-level radio button command, where % changes for the 2019/06/14 version have been made. +%The arguments for this command are, +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars=!(),codes={\catcode`\%=9}] +%#1 = !textsf(optional, used to enter any modification of the appearance/actions) +%#2 = !textsf(the title of the button field) +%#3 = !textsf(the width of the bounding rectangle) +%#4 = !textsf(the height of the bounding rectangle) +%#5 = !textsf(the `on' value, usually Yes) +%#6 = !textsf(not used) +%#7 = !textsf(set props and driver macros) +%#8 = !textsf(every macros) +%\end{Verbatim} % \begin{macrocode} -\newcommand\radio@@Button[8]{\begingroup\let\#\ef@Hx +\bgroup\obeyspaces +\gdef\radio@@Button{\begingroup\global\let =\pdfSP +\ef@sanitize@toks\radio@@@Button}\egroup +\newcommand\radio@@@Button[8]{\endgroup\begingroup\let\#\ef@Hx \let\nameuse\@nameuse\let\tops\texorpdfstring \edef\annot@type{\annot@type@radio}% \pdfstringdef\Fld@name{#2}% @@ -3419,15 +3717,18 @@ \@eqMK{\eq@R\eq@BC\eq@BG/CA(\symbol@choice)\eq@mkIns}% \@processEvery#8\end\noindent#6#7{#1}} % \end{macrocode} -% \begin{macro}{\radioButton} -%\begin{verbatim} -%#1 = optional, used to enter any modification of the appearance/actions -%#2 = the title of the radio button field -%#3 = the width of the bounding rectangle -%#4 = the height of the bounding rectangle -%#5 = the 'on value' or export value, the default is "Yes" -%\end{verbatim} -%\noindent The default for \cs{radioButton} +% \begin{macro}{\radioButton}\hskip-\marginparsep\texttt{[\ameta{options}]\darg{\ameta{fld-name}}\darg{\ameta{wd}}^^A +% \darg{\ameta{ht}}\darg{\ameta{on-value}}} +% User interface to creating a radio button. +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars=!(),codes={\catcode`\%=9}] +%#1 = !textsf(optional, used to enter any modification of the appearance/actions) +%#2 = !textsf(the title of the radio button field) +%#3 = !textsf(the width of the bounding rectangle) +%#4 = !textsf(the height of the bounding rectangle) +%#5 = !textsf(the `on value' or export value, the default is "Yes") +%\end{Verbatim} +%The default for \cs{radioButton} % \begin{macrocode} \def\radioButtonDefaults{\W{1}\S{S}\BC{0 0 0}\F{\FPrint}} % \end{macrocode} @@ -3451,6 +3752,7 @@ % The template for a text field. Within % the optional argument, the following aliases are used: \cs{nameuse} for \cs{@nameuse} % and \cs{tops} for \cs{texorpdfstring}. +%\changes{v2.4}{2020/11/28}{Rewrite of \string\cs{text@@Field} to support \string\cs{pdfSpacesOn}} % \begin{macrocode} \def\common@TextFieldCode {% @@ -3472,9 +3774,23 @@ } % \end{macrocode} % The basic text field macro for constructing all other text fields. +%The arguments for this command are, +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars=!(),codes={\catcode`\%=9}] +%#1 = !textsf(optional, used to enter any modification of the appearance/actions) +%#2 = !textsf(the title of the button field) +%#3 = !textsf(the width of the bounding rectangle) +%#4 = !textsf(the height of the bounding rectangle) +%#5 = !textsf(not used) +%#6 = !textsf(set props and driver macros) +%#7 = !textsf(every macros) +%\end{Verbatim} % \begin{macrocode} \def\annot@type@text{textfld} -\newcommand\text@@Field[7]{\begingroup +\bgroup\obeyspaces +\gdef\text@@Field{\begingroup\global\let =\pdfSP +\ef@sanitize@toks\text@@@Field}\egroup +\newcommand\text@@@Field[7]{\endgroup\begingroup \let\nameuse\@nameuse\let\tops\texorpdfstring \edef\annot@type{\annot@type@text}% \pdfstringdef\Fld@name{#2}\dl@paramlocal @@ -3482,14 +3798,17 @@ \def\eq@DA{\eq@textFont\space\eq@textSize\space Tf \eq@textColor}% \@processEvery#7\end\noindent#5#6{#1}} % \end{macrocode} -% \begin{macro}{\textField} -%\begin{verbatim} -%#1 = optional, used to enter any modification of the appearance/actions -%#2 = the title of the text field -%#3 = the width of the bounding rectangle -%#4 = the height of the bounding rectangle -%\end{verbatim} -%\noindent The default for \cs{textField} +% \begin{macro}{\textField}\hskip-\marginparsep +% \texttt{[\ameta{options}]\darg{\ameta{fld-name}}\darg{\ameta{wd}}^^A +% \darg{\ameta{ht}}} The user interface to creating a text field. +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars=!(),codes={\catcode`\%=9}] +%#1 = !textsf(optional, used to enter any modification of the appearance/actions) +%#2 = !textsf(the title of the text field) +%#3 = !textsf(the width of the bounding rectangle) +%#4 = !textsf(the height of the bounding rectangle) +%\end{Verbatim} +%\noindent The defaults for \cs{textField} % \begin{macrocode} \def\textFieldDefaults{\F{\FPrint}\BC{0 0 0}\W{1}\S{S}} % \end{macrocode} @@ -3519,6 +3838,7 @@ % The template for a signature field. Within % the optional argument, the following aliases are used: \cs{nameuse} for \cs{@nameuse} % and \cs{tops} for \cs{texorpdfstring}. +%\changes{v2.4}{2020/11/28}{Rewrite of \string\cs{sig@@Field} to support \string\cs{pdfSpacesOn}} % \begin{macrocode} \def\common@SigFieldCode {% @@ -3536,9 +3856,23 @@ } % \end{macrocode} % The basic text field macro for constructing all other text fields. +%The arguments for this command are, +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars=!(),codes={\catcode`\%=9}] +%#1 = !textsf(optional, used to enter any modification of the appearance/actions) +%#2 = !textsf(the title of the button field) +%#3 = !textsf(the width of the bounding rectangle) +%#4 = !textsf(the height of the bounding rectangle) +%#5 = !textsf(not used) +%#6 = !textsf(set props and driver macros) +%#7 = !textsf(every macros) +%\end{Verbatim} % \begin{macrocode} \def\annot@type@sig{sigfld} -\newcommand\sig@@Field[7]{\begingroup +\bgroup\obeyspaces +\gdef\sig@@Field{\begingroup\global\let =\pdfSP +\ef@sanitize@toks\sig@@@Field}\egroup +\newcommand\sig@@@Field[7]{\endgroup\begingroup \let\nameuse\@nameuse\let\tops\texorpdfstring \edef\annot@type{\annot@type@sig}% \pdfstringdef\Fld@name{#2}\dl@paramlocal @@ -3546,14 +3880,17 @@ \def\eq@DA{\eq@textFont\space\eq@textSize\space Tf \eq@textColor}% \@processEvery#7\end\noindent#5#6{#1}} % \end{macrocode} -% \begin{macro}{\sigField} -%\begin{verbatim} -%#1 = optional, used to enter any modification of the appearance/actions -%#2 = the title of the text field -%#3 = the width of the bounding rectangle -%#4 = the height of the bounding rectangle -%\end{verbatim} -%\noindent Defaults for \cs{sigField} +% \begin{macro}{\sigField}\hskip-\marginparsep +% \texttt{[\ameta{options}]\darg{\ameta{fld-name}}\darg{\ameta{wd}}^^A +% \darg{\ameta{ht}}} The user interface to creating a signature field. +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars=!(),codes={\catcode`\%=9}] +%#1 = !textsf(optional, used to enter any modification of the appearance/actions) +%#2 = !textsf(the title of the text field) +%#3 = !textsf(the width of the bounding rectangle) +%#4 = !textsf(the height of the bounding rectangle) +%\end{Verbatim} +%Defaults for \cs{sigField} % \begin{macrocode} \def\sigFieldDefaults{\F{\FPrint}\BC{}\BG{}\W{1}\S{S}} % \end{macrocode} @@ -3568,12 +3905,13 @@ % \end{macrocode} % \end{macro} % -% \section{Additional Link Support} +% \section{Additional Link Support}\label{linkSupport} % % The links in \textsf{hyperref} are not sufficiently general to % allow actions other than jumping. I've included a general link % that increases the usage of the links provided by % \textsf{hyperref}. +%\changes{v2.4}{2020/11/28}{Rewrite of \string\cs{set@@Link} to support \string\cs{pdfSpacesOn}} % \paragraph{Common Link Code.} All the link commands eventually come back % to this template for constructing a link annotation. % \begin{macrocode} @@ -3588,7 +3926,7 @@ % \end{macrocode} % \cs{set@@Link} is the low-level link command and is the building block of all the % other, more user-friendly link commands. Takes seven parameters: -%\begin{enumerate} +%\begin{enumerate}\sffamily %\item[\texttt{\#1}:] Optional arguments to modify the appearance and actions of the link. %\item[\texttt{\#2}:] The width of the bounding rectangle. %\item[\texttt{\#3}:] The height of the bounding rectangle. @@ -3599,7 +3937,10 @@ %\end{enumerate} % \begin{macrocode} \def\annot@type@link{link} -\newcommand\set@@Link[7]{\begingroup +\bgroup\obeyspaces +\gdef\set@@Link{\begingroup\global\let =\pdfSP +\ef@sanitize@toks\set@@@Link}\egroup +\newcommand\set@@@Link[7]{\endgroup\begingroup \let\nameuse\@nameuse\let\tops\texorpdfstring \dl@paramlocal \makeJSspecials @@ -3628,18 +3969,19 @@ \let\ef@colorthislink\relax\fi} \AtBeginDocument{\setDef@ultLinkColor} % \end{macrocode} -% \begin{macro}{\setLink} +% \begin{macro}{\setLink}\hskip-\marginparsep\texttt{[\ameta{options}]\darg{\ameta{text}}} % \cs{setLink} is the basic high-level link command, it is used to surround text % with a link annotation. -% \begin{macro}{\setLinkText} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={!~@},codes={\catcode`\%=9}] +%\setLink[\A{\JS{this.pageNum=6;}}\Color{1 0 0}]{Go There!} +%\end{Verbatim} +% \begin{macro}{\setLinkText}\hskip-\marginparsep\texttt{[\ameta{options}]\darg{\ameta{text}}} % \cs{setLinkText} is a synonym for \cs{setLink}. -% \begin{macro}{\mlhypertext} +% \begin{macro}{\mlhypertext}\hskip-\marginparsep\texttt{[\ameta{options}]\darg{\ameta{text}}} % A command defined in the \pkg{aeb\_mlink} package. -% \begin{macro}{\mlsetLink} +% \begin{macro}{\mlsetLink}\hskip-\marginparsep\texttt{[\ameta{options}]\darg{\ameta{text}}} % \cs{mlsetLink} expands to \cs{mlhypertext} -%\begin{verbatim} -% \setLink[\A{\JS{this.pageNum=6;}}\Color{1 0 0}]{Go There!} -%\end{verbatim} % \paragraph{Link Parameters.} These high-level links takes two parameters, one of which % is optional. %\begin{enumerate} @@ -3723,12 +4065,13 @@ % \end{macro} % \begin{macro}{\setLinkBbox} % Set a link around a |\parbox|. -%\begin{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%codes={\catcode`\%=9}] %\setLinkBbox [\Color{1 0 0}}]{50bp}{30bp}[b]{\centering Press Me!} -%\end{verbatim} +%\end{Verbatim} % \paragraph{Link Parameters.} There are four parameters, two of which % are optional. -%\begin{enumerate} +%\begin{enumerate}\sffamily %\item[\texttt{[\#1]}:] Optional key-value pairs to change the appearance or action % of this link. %\item[\texttt{\#2}:] The width of the \cs{parbox}. @@ -3806,10 +4149,6 @@ % \begin{macrocode} %<*userinterface> % \end{macrocode} -% Let's bring in the \textsf{xkeyval} package. -% \begin{macrocode} -%\usepackage{xkeyval} -% \end{macrocode} % The |\ui| interface is undefined if the \texttt{useui} option is not taken. We use this fact % to send a message to the user that using |\ui| most accompany the \texttt{useui}. % \begin{macrocode} @@ -3829,7 +4168,7 @@ % \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}} + {\aeb@exiii\@fourthoffive\csname r@#1\endcsname}} \def\aeb@exiii{\expandafter\expandafter\expandafter} \newtoks\ef@flagtoks \newtoks\ef@jstoks @@ -3847,25 +4186,25 @@ % \begin{macrocode} \define@choicekey{eforms}{border}[\val\nr]{visible,invisible} {% - \ifcase\nr + \ifcase\nr % \end{macrocode} % Author has chosen a visible border |\eq@W@buffered|. % \begin{macrocode} - \def\eq@visibleborder{1}% - \ifx\eq@W\@empty - \ifx\eq@W@buffered\@empty\@eqW{1}\else - \@eqW{\eq@W@buffered}\fi - \else - \ifnum\eq@W@value=0 \@eqW{1}\fi - \ifx\eq@W@buffered\@empty\else - \@eqW{\eq@W@buffered}\fi - \fi - \@eqBorder{0 0 \eq@W@value}% - \or - % author has chosen invisible border - \def\eq@visibleborder{0}\@eqW{}% - \@eqBorder{0 0 0}\@eqBC{}% + \def\eq@visibleborder{1}% + \ifx\eq@W\@empty + \ifx\eq@W@buffered\@empty\@eqW{1}\else + \@eqW{\eq@W@buffered}\fi + \else + \ifnum\eq@W@value=0 \@eqW{1}\fi + \ifx\eq@W@buffered\@empty\else + \@eqW{\eq@W@buffered}\fi \fi + \@eqBorder{0 0 \eq@W@value}% + \or + % author has chosen invisible border + \def\eq@visibleborder{0}\@eqW{}% + \@eqBorder{0 0 0}\@eqBC{}% + \fi } % \end{macrocode} % This choice key is for the \texttt{linewidth}\IndexKey{linewidth} of a link or form. The user interface choices @@ -3874,62 +4213,66 @@ % \begin{macrocode} \define@choicekey{eforms}{linewidth}[\val\nr]{thin,medium,thick} {% - \ifx\annot@type\annot@type@link + \ifx\annot@type\annot@type@link % \end{macrocode} % This is a link, so, depending on whether the color package is loaded, we show or don't % show the boundary, depending on the explicate choices of the author % \begin{macrocode} - \ifx\eq@visibleborder\@empty + \ifx\eq@visibleborder\@empty % \end{macrocode} % Author has not committed to a border type, so we'll assume the default % \begin{macrocode} - \ifnum\eq@bordervisibledefault=0 + \ifnum\eq@bordervisibledefault=0 % \end{macrocode} % A color package is loaded, use invisible border by default. % \begin{macrocode} - \edef\eq@W@buffered{\ifcase\nr 1\or2\or3\fi}% - \@eqW{}% - \else + \edef\eq@W@buffered{\ifcase\nr 1\or2\or3\fi}% + \@eqW{}% + \else % \end{macrocode} % No color is loaded, show the border. % \begin{macrocode} - \ifcase\nr \@eqW{1}\or\@eqW{2}\or - \@eqW{3}\else\@eqW{1}\fi\@eqBorder{0 0 \eq@W@value}% - \fi - \else + \ifcase\nr\@eqW{1}\or\@eqW{2}\or + \@eqW{3}\else\@eqW{1}\fi + \@eqBorder{0 0 \eq@W@value}% + \fi + \else % \end{macrocode} % Author has set the border type before line width, we'll do what the % author wants. If invisible, ignore |\W|, if visible obey |\W|. % \begin{macrocode} - \ifnum\eq@visibleborder=1 % visible border - \ifcase\nr \@eqW{1}\or\@eqW{2}\or - \@eqW{3}\else\@eqW{1}\fi\@eqBorder{0 0 \eq@W@value}% - \fi - \fi - \else + \ifnum\eq@visibleborder=1 % visible border + \ifcase\nr\@eqW{1}\or\@eqW{2}\or + \@eqW{3}\else\@eqW{1}\fi + \@eqBorder{0 0 \eq@W@value}% + \fi + \fi + \else % \end{macrocode} % This is not a link, its a form, so things are easier. The invisible border will override % the linewidth. If the author wants a border, s/he better get her/his act together and % remove \texttt{border=invisible}. % \begin{macrocode} - \ifx\eq@visibleborder\@empty + \ifx\eq@visibleborder\@empty % \end{macrocode} % If the value of |\eq@visibleborder|, author has not used the border key at this time, % so just set the \texttt{linewidth} as stated. % \begin{macrocode} - \ifcase\nr \@eqW{1}\or\@eqW{2}\or - \@eqW{3}\else\@eqW{1}\fi\@eqBorder{0 0 \eq@W@value}% - \edef\eq@W@buffered{\ifcase\nr 1\or2\or3\fi}% - \else + \ifcase\nr \@eqW{1}\or\@eqW{2}\or + \@eqW{3}\else\@eqW{1}\fi + \@eqBorder{0 0 \eq@W@value}% + \edef\eq@W@buffered{\ifcase\nr1\or2\or3\fi}% + \else % \end{macrocode} % The author has used the border key, so we don't need to save this value. % \begin{macrocode} - \ifnum\eq@visibleborder>0 - \ifcase\nr \@eqW{1}\or\@eqW{2}\or - \@eqW{3}\else\@eqW{1}\fi\@eqBorder{0 0 \eq@W@value}% - \fi - \fi + \ifnum\eq@visibleborder>0 + \ifcase\nr \@eqW{1}\or\@eqW{2}\or + \@eqW{3}\else\@eqW{1}\fi + \@eqBorder{0 0 \eq@W@value}% + \fi \fi + \fi } \let\eq@visibleborder\@empty \let\eq@W@buffered\@empty @@ -3995,7 +4338,7 @@ % of the field can be set, such visibility, printability, readonly, % orientation, captions (for button), values, default values, etc. % can be set. -% +%\par\medskip\noindent % The \texttt{annotflags}\IndexKey{annotflags} is a bit field, possible values are \texttt{hidden}, \texttt{print}, % \texttt{-print}, \texttt{noview}, and \texttt{lock}. Multiple values can % be specified. The values are ``or-ed'' together. Most all forms are printable @@ -4004,19 +4347,19 @@ % locked, so the field cannot be moved through the UI. % \begin{macrocode} \define@key{eforms}{annotflags}[]{\ef@flagtoks={}% - \setkeys{annotflags}{#1}} + \setkeys{annotflags}{#1}} \@tfor\ef@flagopts:={{hidden}{FHidden}}{{print}{FPrint}}{{noprint}% - {FNoPrint}}{{-print}{FNoPrint}}{{noview}{FNoView}}{{lock}{FLock}}% - \do{\expandafter\getargs\ef@flagopts - \edef\temp@expand@def{% - \noexpand\define@key{annotflags}{\aeb@argi}[true]{% - \noexpand\ef@flagtoks=% - \noexpand\expandafter{\noexpand\ef@passedArgs}% - \noexpand\edef\noexpand\ef@passedArgs{\noexpandiii% - \F{\noexpandiii\csname\aeb@argii\noexpandiii\endcsname}% - \noexpand\the\noexpand\ef@flagtoks}% - }% - }\temp@expand@def + {FNoPrint}}{{-print}{FNoPrint}}{{noview}{FNoView}}{{lock}{FLock}}% + \do{\expandafter\getargs\ef@flagopts + \edef\temp@expand@def{\noexpand + \define@key{annotflags}{\aeb@argi}[true]{% + \noexpand\ef@flagtoks=\noexpand + \expandafter{\noexpand\ef@passedArgs}% + \noexpand\edef\noexpand\ef@passedArgs{\noexpandiii + \F{\noexpandiii\@nameuse{\aeb@argii\noexpandiii}}% + \noexpand\the\noexpand\ef@flagtoks}% + }% + }\temp@expand@def } % \end{macrocode} % A large number of fields that sets a number of properties of a field. Some of these @@ -4024,40 +4367,39 @@ % These appear in the first of the paired groups listed below. Normally, a document % author would not specify \texttt{radio}, \texttt{pushbutton} or \texttt{combo}. % These properties are used -% by eforms to construct a radio button field, a push button and a combo box. +% by \pkg{eforms} to construct a radio button field, a push button and a combo box. % The others can be used as appropriate. % \begin{macrocode} \define@key{eforms}{fieldflags}[]{\ef@flagtoks={}% - \setkeys{fieldflags}{#1}} + \setkeys{fieldflags}{#1}} \@tfor\ef@flagopts:={{readonly}{FfReadOnly}}{{required}{FfRequired}}% - {{noexport}{FfNoExport}}{{multiline}{FfMultiline}}% - {{password}{FfPassword}}{{notoggleoff}{FfNoToggleToOff}}% - {{radio}{FfRadio}}{{pushbutton}{FfPushButton}}{{combo}{FfCombo}}% - {{edit}{FfEdit}}{{sort}{FfSort}}{{fileselect}{FfFileSelect}}% - {{multiselect}{FfMultiSelect}}{{nospellcheck}{FfDoNotSpellCheck}}% - {{noscrolling}{FfDoNotScroll}}{{comb}{FfComb}}% - {{radiosinunison}{FfRadiosInUnison}}% - {{commitonchange}{FfCommitOnSelChange}}{{richtext}{FfRichText}}\do{% - \expandafter\getargs\ef@flagopts - \edef\temp@expand@def{% - \noexpand\define@key{fieldflags}{\aeb@argi}[true]% - {% - \noexpand\ef@flagtoks=\noexpand\expandafter{% - \noexpand\ef@passedArgs}% - \noexpand\edef\noexpand\ef@passedArgs{\noexpandiii% - \Ff{\noexpandiii\csname\aeb@argii\noexpandiii\endcsname}% - \noexpand\the\noexpand\ef@flagtoks}% - }% - }\temp@expand@def + {{noexport}{FfNoExport}}{{multiline}{FfMultiline}}% + {{password}{FfPassword}}{{notoggleoff}{FfNoToggleToOff}}% + {{radio}{FfRadio}}{{pushbutton}{FfPushButton}}{{combo}{FfCombo}}% + {{edit}{FfEdit}}{{sort}{FfSort}}{{fileselect}{FfFileSelect}}% + {{multiselect}{FfMultiSelect}}{{nospellcheck}{FfDoNotSpellCheck}}% + {{noscrolling}{FfDoNotScroll}}{{comb}{FfComb}}% + {{radiosinunison}{FfRadiosInUnison}}% + {{commitonchange}{FfCommitOnSelChange}}{{richtext}{FfRichText}}\do{% + \expandafter\getargs\ef@flagopts + \edef\temp@expand@def{\noexpand + \define@key{fieldflags}{\aeb@argi}[true]{\noexpand + \ef@flagtoks=\noexpand\expandafter{\noexpand + \ef@passedArgs}\noexpand + \edef\noexpand\ef@passedArgs{\noexpandiii + \Ff{\noexpandiii\@nameuse{\aeb@argii\noexpandiii}}% + \noexpand\the\noexpand\ef@flagtoks}% + }% + }\temp@expand@def } % \end{macrocode} % Enter a text value to appear as a tool tip\IndexKey{tooltip}. For example, -% \texttt{tooltip={Hi, press me and see what happens!}}. Enclose in +% \texttt{tooltip={\darg{\textsf{Hi, press me and see what happens!}}}}. Enclose in % parentheses if the text string contains a comma. % \begin{macrocode} \define@key{eforms}{tooltip}{\@eqTU{#1}} % \end{macrocode} -% The default value\IndexKey{default}\IndexKey{defaultstyle} of a field (text, list, combobox) what is used +% The default value\IndexKey{default}\IndexKey{defaultstyle} of a field (text, list, combo box) what is used % when the field is reset. Example: \texttt{default=Name} % \begin{macrocode} \define@key{eforms}{default}{\@eqDV{#1}} @@ -4111,14 +4453,7 @@ % The color of the text\IndexKey{textcolor} in the field. This can be in \textsf{G}, \textsf{RGB} or \textsf{CMYK} color % space. % \begin{macrocode} -\define@key{eforms}{textcolor}{% - \@eqtextColor{#1}% -% \aeb@cntargs#1 \\\relax -% \ifcase\aeb@nArgs\relax\or -% \@eqtextColor{#1 g}\or\or -% \@eqtextColor{#1 rg}\or -% \@eqtextColor{#1 k}\fi -} +\define@key{eforms}{textcolor}{\@eqtextColor{#1}} % \end{macrocode} % Use \texttt{maxlength}\IndexKey{maxlength} to limit the number of characters input into a text field. % Example: \texttt{maxlength=12}. @@ -4133,43 +4468,44 @@ \define@key{eforms}{rollappr}{\@eqRI{#1}} \define@key{eforms}{downappr}{\@eqIX{#1}} \define@choicekey{eforms}{layout}[\val\nr]{labelonly,icononly,% - icontop,iconbottom,iconleft,iconright,labelover}{% - \ifx\annot@type\annot@type@button - \expandafter\@eqTP\expandafter{\nr}\fi}{} + icontop,iconbottom,iconleft,iconright,labelover}{% + \ifx\annot@type\annot@type@button\expandafter + \@eqTP\expandafter{\nr}\fi}{} % \end{macrocode} % Scaling keys, \texttt{scalewhen}\IndexKey{scalewhen} and \texttt{scale}\IndexKey{scale} % \begin{macrocode} \define@choicekey{eforms}{scalewhen}[\val\nr]{always,never,% - iconbig,iconsmall}{% - \ifx\annot@type\annot@type@button - \ifcase\nr\relax - \def\eq@@SW{A}\or - \def\eq@@SW{N}\or - \def\eq@@SW{B}\or - \def\eq@@SW{S}\else - \def\eq@@SW{A}\fi - \expandafter\@eqSW\expandafter{\eq@@SW}\fi}{} + iconbig,iconsmall}{% + \ifx\annot@type\annot@type@button + \ifcase\nr\relax + \def\eq@@SW{A}\or + \def\eq@@SW{N}\or + \def\eq@@SW{B}\or + \def\eq@@SW{S}\else + \def\eq@@SW{A}\fi + \expandafter\@eqSW\expandafter{\eq@@SW}\fi}{} \define@choicekey{eforms}{scale}[\val\nr]{proportional,% - nonproportional}{% - \ifx\annot@type\annot@type@button - \ifcase\nr\relax - \def\eq@@ST{P}\or - \def\eq@@ST{A}\else - \def\eq@@ST{P}\fi - \expandafter\@eqST\expandafter{\eq@@ST}\fi}{} + nonproportional}{% + \ifx\annot@type\annot@type@button + \ifcase\nr\relax + \def\eq@@ST{P}\or + \def\eq@@ST{A}\else + \def\eq@@ST{P}\fi + \expandafter\@eqST\expandafter{\eq@@ST}\fi}{} % \end{macrocode} % Positioning keys, \texttt{position}\IndexKey{position} and \texttt{fitbounds}\IndexKey{fitbounds} % \begin{macrocode} \define@key{eforms}{position}{\@eqPA{#1}} \define@choicekey{eforms}{fitbounds}[\val\nr]{true,false}[true]{% - \ifx\annot@type\annot@type@button + \ifx\annot@type\annot@type@button \ifcase\nr\relax - \def\eq@@FB{true}\or - \def\eq@@FB{false}\else - \def\eq@@FB{false}\fi - \expandafter\@eqFB\expandafter{\eq@@FB}\fi}{} + \def\eq@@FB{true}\or + \def\eq@@FB{false}\else + \def\eq@@FB{false}\fi + \expandafter\@eqFB\expandafter{\eq@@FB}\fi}{} % \end{macrocode} -% This set of key-values\IndexKey{norm}\IndexKey{roll}\IndexKey{down} are designed to fill in the AP dictionary for the check box +% This set of key-values\IndexKey{norm}\IndexKey{roll}\IndexKey{down} are +% designed to fill in the AP dictionary for the check box % and the radio button field. %\begin{verbatim} % appr={norm={on={},off={}}},roll={on={},off={}}},down={on={},off={}}}} @@ -4180,10 +4516,10 @@ \define@key{efappr}{roll}[]{\def\efappr@roll{#1}} \define@key{efappr}{down}[]{\def\efappr@down{#1}} \setkeys{efappr}{norm,roll,down} -\define@key{efappr@state}{on}[]{% - \expandafter\def\csname \ef@state @on\endcsname{#1}} -\define@key{efappr@state}{off}[]{% - \expandafter\def\csname \ef@state @off\endcsname{#1}} +\define@key{efappr@state}{on}[]{\expandafter + \def\csname \ef@state @on\endcsname{#1}} +\define@key{efappr@state}{off}[]{\expandafter + \def\csname \ef@state @off\endcsname{#1}} \let\norm@on\@empty\let\norm@off\@empty \let\roll@on\@empty\let\roll@off\@empty \let\down@on\@empty\let\down@off\@empty @@ -4192,22 +4528,22 @@ % and the radio button field. %\begin{macrocode} \define@key{eforms}{appr}{\setkeys{efappr}{#1}% - \def\ef@state{norm}% - \edef\ef@edef@tmp{\noexpand\setkeys{efappr@state}{\efappr@norm}}% - \ef@edef@tmp\def\ef@state{roll}% - \edef\ef@edef@tmp{\noexpand\setkeys{efappr@state}{\efappr@roll}}% - \ef@edef@tmp\def\ef@state{down}% - \edef\ef@edef@tmp{\noexpand\setkeys{efappr@state}{\efappr@down}}% - \ef@edef@tmp\def\eq@AP{% - /AP<< - \ifx\efappr@norm\@empty\else/N << - \eq@On\space{\norm@on}/Off {\norm@off}>>\fi - \ifx\efappr@roll\@empty\else/R << - \eq@On\space{\roll@on}/Off {\roll@off}>>\fi - \ifx\efappr@down\@empty\else/D << - \eq@On\space{\down@on}/Off {\down@off}>>\fi - \space>> - }% + \def\ef@state{norm}% + \edef\ef@edef@tmp{\noexpand\setkeys{efappr@state}{\efappr@norm}}% + \ef@edef@tmp\def\ef@state{roll}% + \edef\ef@edef@tmp{\noexpand\setkeys{efappr@state}{\efappr@roll}}% + \ef@edef@tmp\def\ef@state{down}% + \edef\ef@edef@tmp{\noexpand\setkeys{efappr@state}{\efappr@down}}% + \ef@edef@tmp\def\eq@AP{% + /AP<<% + \ifx\efappr@norm\@empty\else/N <<% + \eq@On\space{\norm@on}/Off {\norm@off}>>\fi + \ifx\efappr@roll\@empty\else/R <<% + \eq@On\space{\roll@on}/Off {\roll@off}>>\fi + \ifx\efappr@down\@empty\else/D <<% + \eq@On\space{\down@on}/Off {\down@off}>>\fi + \space>> + }% } % \end{macrocode}% % \subsection{Miscellaneous keys} @@ -4216,31 +4552,31 @@ % \begin{macrocode} \define@choicekey{eforms}{autocenter}[\val\nr]{yes,no} {% - \ifcase\nr\relax\@eqautoCenter{y}\or - \@eqautoCenter{n}\fi + \ifcase\nr\relax\@eqautoCenter{y}\or + \@eqautoCenter{n}\fi }{} \define@choicekey{eforms}{inline}[\val\nr]{yes,no} {% - \ifcase\nr\relax\@eqinline{y}\or - \@eqinline{n}\fi + \ifcase\nr\relax\@eqinline{y}\or + \@eqinline{n}\fi }{} \define@choicekey{eforms}{mlfix}[\val\nr]{yes,no} {% - \ifcase\nr\relax\@eqmlfix{y}\or - \@eqmlfix{n}\fi + \ifcase\nr\relax\@eqmlfix{y}\or + \@eqmlfix{n}\fi }{} \define@choicekey{eforms}{importicons}[\val\nr]{yes,no} {% - \ifcase\nr\relax\@eqimportIcons{y}\or - \@eqimportIcons{n}\fi + \ifcase\nr\relax\@eqimportIcons{y}\or + \@eqimportIcons{n}\fi }{} \define@key{eforms}{mlstrut}[\strut]{\@eqmlstrut{#1}} \define@key{eforms}{mlcrackat}[]{\@eqmlcrackat{#1}} \define@key{eforms}{mlcrackinat}[]{\@eqmlcrackinsat{#1}} \define@choicekey{eforms}{mlhyph}[\val\nr]{yes,no} {% - \ifcase\nr\relax\@eqmlhyph{y}\or - \@eqmlhyph{n}\fi + \ifcase\nr\relax\@eqmlhyph{y}\or + \@eqmlhyph{n}\fi }{} % \end{macrocode} % \changes{v2.10}{2019/03/16}{Added \string\cs{cmd} to optional args of forms} @@ -4279,33 +4615,77 @@ \ef@temp@expand } % \end{macrocode} -% \texttt{symbolchoice}\IndexKey{symbolchoice}is used with a checkbox or radio button field. This sets the symbol +% \texttt{symbolchoice}\IndexKey{symbolchoice} is used with a checkbox or radio button field. This sets the symbol % that appears in the field with the box is checked, choices are % \texttt{check}, \texttt{circle}, \texttt{cross}, \texttt{diamond}, % \texttt{square}, and \texttt{star}. % \begin{macrocode} \define@choicekey{eforms}{symbolchoice}[\val\nr]% - {check,circle,cross,diamond,square,star} - {\expandafter\@eqsymbolchoice\expandafter{\val}}{} + {check,circle,cross,diamond,square,star} + {\expandafter\@eqsymbolchoice\expandafter{\val}}{} +% \end{macrocode} +%\paragraph*{Set rectangle keys} +%The dimensions of the bounding rectangle is generally passed to the widget +%using required arguments; however, for \pkg{exerquiz}, those arguments are +%not directly accessible. The \IndexKey{rectW}\key{rectW} and \IndexKey{rectH}\key{rectH} +%may be used to pass the dimensions of the rectangle through the optional +%optional argument of the field. +% \begin{macrocode} +\define@key{eforms}{rectW}{\@eqrectW{#1}} +\define@key{eforms}{rectH}{\@eqrectH{#1}} +% \end{macrocode} +%\paragraph*{Resizing keys} +%These keys resize the field while preserving the aspect ratio; these are +%\IndexKey{width}\key{width}, \IndexKey{height}\key{height}, and \IndexKey{scalefactor}\key{scalefactor} +% \begin{macrocode} +\define@key{eforms}{width}{\@eqwidth{#1}} +\define@key{eforms}{height}{\@eqheight{#1}} +\define@key{eforms}{scalefactor}{\@eqscalefactor{#1}} % \end{macrocode} % % \subsection{The Signed Tab} % % A signature field has a signed tab. On that tab is an option to mark a set of fields -% as readonly (locked). The locked key controls that option. +% as readonly (locked). The locked key controls that option.\medskip % -% The \texttt{lock}\IndexKey{lock} key is used with signature fields, currently, there is -% no nice user interface to this key. Typical entries are -%\begin{verbatim} -% lock={/Action/All} % lock all fields in the doc -% lock={/Action/Include % lock all fields listed in Fields -% /Fields [(field1)(field2)...]} -% lock={/Action/Exclude % lock all fields not listed in Fields -% /Fields [(field1)(field2)...]} -%\end{verbatim} +% {\noindent}The \texttt{lock}\IndexKey{lock} key is used with signature fields. +% Typical entries, using \emph{raw PDF markup}, are, +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={!~@},codes={\catcode`\%=9}] +%lock={/Action/All} !% !textsf~lock all fields in the doc@ +%lock={/Action/Include !% !textsf~lock all fields listed in Fields@ +% /Fields [(field1)(field2)...]} +%lock={/Action/Exclude !% !textsf~lock all fields not listed in Fields@ +% /Fields [(field1)(field2)...]} +%\end{Verbatim} +%Simplified syntax for UF key-values: +%\changes{v2.3.6}{2020/10/10}{Addition support for the \string\texttt{lock} key} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={!~@},codes={\catcode`\%=9}] +%lock={action=all} !% !textsf~lock all fields in the doc@ +%lock={action=include, +% fields={field1,field2,...}}!% !textsf~lock all fields listed in Fields@ +%lock={action=exclude, +% fields{field1,field2,...}} !% !textsf~lock all fields not listed in Fields@ +%\end{Verbatim} % % \begin{macrocode} -\define@key{eforms}{lock}{\@eqLock{#1}} +\define@key{eforms}{lock}{\setkeys{lckflds}{#1}% + \ifx\lckFlds\@empty + \edef\ActnArgs{\noexpand\Action\noexpand\All}\else + \edef\ActnArgs{\noexpand\Action\expandafter + \noexpand\lckActnArg{\lckFlds}}\fi + \expandafter\@eqLock\expandafter{\ActnArgs}% +} +\define@choicekey{lckflds}{action}[\val\nr]{all,include,exclude} +{% + \ifcase\nr\relax + \def\lckActnArg{\All}\or + \def\lckActnArg{\IncludeFields}\or + \def\lckActnArg{\ExcludeFields}\fi +}{} +\define@key{lckflds}{fields}{\def\lckFlds{#1}} +\let\lckFlds\@empty % \end{macrocode} % % Another option that is included in the Signed tab is titled ``This script executes @@ -4344,18 +4724,13 @@ % Jump within the file \def\ef@subtype{/S/GoTo }% \ifcase\eq@drivernum - \def\ef@formatpage{{Page\ef@page}}% - \or - \def\ef@formatpage{\pdfpageref\ef@page\space\space 0 R}% - \or - \def\ef@formatpage{@page\ef@page}% - \fi + \def\ef@formatpage{{Page\ef@page}}\or + \def\ef@formatpage{\pdfpageref\ef@page\space\space 0 R}\or + \def\ef@formatpage{@page\ef@page}\fi \let\ef@open\@empty \let\ef@formatfile\@empty \else % Jump to another PDF -% \ifx\ef@linktxtcolor@set0% -% \def\ef@thislinkcolor{\@filecolor}\fi \def\ef@subtype{/S/GoToR }% \count0=\ef@page\advance\count0by-1 \edef\ef@formatpage{\the\count0 }% @@ -4364,25 +4739,21 @@ \ifx\ef@goto@targetdest\@empty \ifx\ef@labeldest\@empty % we will jump to a page, it might be the default page - \expandafter\@eqA\expandafter{\ef@subtype - /D[\ef@formatpage\ef@view]% - \ef@formatfile\ef@open}% - \else + \expandafter\@eqA\expandafter{\ef@subtype + /D[\ef@formatpage\ef@view]\ef@formatfile\ef@open}\else % jump to a label - \expandafter\@eqA\expandafter{\ef@subtype% - /D (\labelRef{\ef@labeldest})% - \ef@formatfile\ef@open}% - \fi + \expandafter\@eqA\expandafter{\ef@subtype% + /D (\labelRef{\ef@labeldest})% + \ef@formatfile\ef@open}\fi \else % jump to a target - \expandafter\@eqA\expandafter{\ef@subtype% - /D (\ef@goto@targetdest)% - \ef@formatfile\ef@open}% + \expandafter\@eqA\expandafter{\ef@subtype% + /D (\ef@goto@targetdest)\ef@formatfile\ef@open}% \fi \else % go to url \ifx\ef@goto@openparams\@empty - \@eqA{/S/URI/URI(\ef@goto@url)}\else - \@eqA{/S/URI/URI(\ef@goto@url\#\ef@goto@openparams)}% + \@eqA{/S/URI/URI(\ef@goto@url)}\else + \@eqA{/S/URI/URI(\ef@goto@url\#\ef@goto@openparams)}% \fi \fi } @@ -4458,7 +4829,7 @@ % \begin{macrocode} \define@choicekey{efgoto}{open}[\val\nr]{userpref,new,existing} {% - \ifcase\nr\relax + \ifcase\nr\relax \let\ef@open\@empty\or \def\ef@open{/NewWindow true }\or \def\ef@open{/NewWindow false }\fi @@ -4479,20 +4850,20 @@ % (2017/01/03) Use \cs{cxkvsetkeys} for \texttt{launch} % \changes{v2.9g}{2017/01/03}{Use \string\cs{cxkvsetkeys} for \string\texttt{launch}} % \begin{macrocode} - \cxkvsetkeys{eflaunch}{#1}% - \@eqA{/S/Launch\ifx\ef@launch@file\@empty\else - /F(\ef@launch@file)\fi\ef@launch@open - \ifx\ef@launch@win\@empty\else - /Win<<\ifx\ef@launchwin@file\@empty - /F(\ef@launch@file)\else/F(\ef@launchwin@file)\fi - \ifx\ef@launchwin@params\@empty\else - /P(\ef@launchwin@params)\fi - \ifx\ef@launchwin@open\@empty\else - /O(\ef@launchwin@open)\fi - \ifx\ef@launchwin@dir\@empty\else - /D(\ef@launchwin@dir)\fi>> - \fi - }% + \cxkvsetkeys{eflaunch}{#1}% + \@eqA{/S/Launch\ifx\ef@launch@file\@empty\else + /F(\ef@launch@file)\fi\ef@launch@open + \ifx\ef@launch@win\@empty\else + /Win<<\ifx\ef@launchwin@file\@empty + /F(\ef@launch@file)\else/F(\ef@launchwin@file)\fi + \ifx\ef@launchwin@params\@empty\else + /P(\ef@launchwin@params)\fi + \ifx\ef@launchwin@open\@empty\else + /O(\ef@launchwin@open)\fi + \ifx\ef@launchwin@dir\@empty\else + /D(\ef@launchwin@dir)\fi>> + \fi + }% } % \end{macrocode} % The value of the \texttt{file} key can be an application or a file. If a @@ -4510,7 +4881,7 @@ % \begin{macrocode} \define@choicekey{eflaunch}{open}[\val\nr]{userpref,new,existing} {% - \ifcase\nr\relax + \ifcase\nr\relax \let\ef@launch@open\@empty\or \def\ef@launch@open{/NewWindow true }\or \def\ef@launch@open{/NewWindow false }\fi @@ -4558,7 +4929,7 @@ % The \texttt{js}\IndexKey{js} key is used to execute JavaScript actions on a mouse up trigger. % The argument is a JavaScript text string: |js={app.alert("Hello World!"}|. % The value of \texttt{js} may be a macro containing JavaScript, which would include -% a macro created by the \texttt{defineJS} environment of \textsf{insdljs}. +% a macro created by the \env{defineJS} environment of \textsf{insdljs}. % \begin{macrocode} \define@key{eforms}{js}[]{\@eqA{\JS{#1}}} % \end{macrocode} @@ -4586,18 +4957,18 @@ % \end{itemize} % \begin{macrocode} \@tfor\ef@AActions:={{mouseup}{AAmouseup}}{{mousedown}{AAmousedown}}% - {{onenter}{AAmouseenter}}{{onexit}{AAmouseexit}}% - {{onfocus}{AAonfocus}}{{onblur}{AAonblur}}% - {{format}{AAformat}}{{keystroke}{AAkeystroke}}% - {{validate}{AAvalidate}}{{calculate}{AAcalculate}}% - {{pageopen}{AApageopen}}{{pageclose}{AApageclose}}% - {{pagevisible}{AApagevisible}}% - {{pageinvisible}{AApageinvisible}}\do{% - \expandafter\getargs\ef@AActions\ef@jstoks={#1}% - \edef\temp@expand@def{\noexpand\define@key{eforms}{\aeb@argi}[]% - {\noexpand\csname @eq\aeb@argii\noexpand\endcsname% - {\the\ef@jstoks}}}% - \temp@expand@def + {{onenter}{AAmouseenter}}{{onexit}{AAmouseexit}}% + {{onfocus}{AAonfocus}}{{onblur}{AAonblur}}% + {{format}{AAformat}}{{keystroke}{AAkeystroke}}% + {{validate}{AAvalidate}}{{calculate}{AAcalculate}}% + {{pageopen}{AApageopen}}{{pageclose}{AApageclose}}% + {{pagevisible}{AApagevisible}}% + {{pageinvisible}{AApageinvisible}}\do{% + \expandafter\getargs\ef@AActions\ef@jstoks={#1}% + \edef\temp@expand@def{\noexpand\define@key{eforms}{\aeb@argi}[]% + {\noexpand\csname @eq\aeb@argii\noexpand\endcsname% + {\the\ef@jstoks}}}% + \temp@expand@def } % \end{macrocode} % The \texttt{objdef}\IndexKey{objdef} key is used to create indirect references to the form field. @@ -4612,13 +4983,9 @@ % \end{macrocode} % % \section{Input Driver Specific Code} -% Now bring in driver dependent macros. The macros defined are -% the answer macros for the \texttt{shortquiz} environment and most all -% for the \texttt{quiz} environment. These macros make heavy use of -% JavaScript. The method of introducing these JavaScripts and -% PDF code related elements depends on the driver. -% \changes{v2.9j}{2017/01/22}{\string\cs{eq@rectH} and \string\cs{eq@rectW} pass through \string\cs{setlength} -% to enable arithmetic for the arguments of those commands} +% Now bring in driver dependent macros that support form fields. +% \changes{v2.9j}{2017/01/22}{\string\cs{eq@rectH} and \string\cs{eq@rectW} pass +% through \string\cs{setlength} to enable arithmetic for the arguments of those commands} % \begin{macrocode} %<*package> % \end{macrocode} @@ -4746,7 +5113,7 @@ \fi \fi \fi - \ef@NewRadiosLateOpts + \ifuseNewRadios\expandafter\ef@NewRadiosLateOpts\fi \ifx\eq@rectW\@empty\def\eq@rectW{\wd\eq@tmpbox}\fi \pdf@rect{\lower\eqcenterWidget\ef@Bbox{\eq@rectW}{\eq@rectH}}% \literalps@out{\AEB@psMrk @@ -4988,7 +5355,7 @@ \fi \fi \fi - \ef@NewRadiosLateOpts + \ifuseNewRadios\expandafter\ef@NewRadiosLateOpts\fi \ifx\eq@rectW\@empty\def\eq@rectW{\wd\eq@tmpbox}\fi \hbox{\pdfstartlink user{\common@RadioCode}% \lower\eqcenterWidget\ef@Bbox{\eq@rectW}{\eq@rectH}\pdfendlink}% @@ -5159,7 +5526,7 @@ \fi \fi \fi - \ef@NewRadiosLateOpts + \ifuseNewRadios\expandafter\ef@NewRadiosLateOpts\fi \ifx\eq@rectW\@empty\def\eq@rectW{\wd\eq@tmpbox}\fi \HyField@AdvanceAnnotCount \setbox\pdfm@box=% @@ -5262,42 +5629,42 @@ var debugCalc=false; ef_setCalcOrder.lastIndex=0; function ef_setCalcOrder (a) { - var o1, o2, f; - while ( a.length > 0) { - if (a.length > 1) { - f=a.shift(); - o1=this.getField(f); - if ( o1 == null ) { - ef_CalcOrderErr(f); - continue; - } - f = a[0]; - o2=this.getField(f); - if ( o2 == null ) { - ef_CalcOrderErr(f); - a.shift(); - continue; - } - if ( o2.calcOrderIndex < o1.calcOrderIndex ) { - o2.calcOrderIndex=o1.calcOrderIndex+1; - ef_setCalcOrder.lastIndex=o2.calcOrderIndex; - } - } else { - f=a.shift(); - o1=this.getField(f); - if ( o1 == null ) { - ef_CalcOrderErr(f); - continue; - } - o1.calcOrderIndex=ef_setCalcOrder.lastIndex; - } + var o1, o2, f; + while ( a.length > 0) { + if (a.length > 1) { + f=a.shift(); + o1=this.getField(f); + if ( o1 == null ) { + ef_CalcOrderErr(f); + continue; + } + f = a[0]; + o2=this.getField(f); + if ( o2 == null ) { + ef_CalcOrderErr(f); + a.shift(); + continue; + } + if ( o2.calcOrderIndex < o1.calcOrderIndex ) { + o2.calcOrderIndex=o1.calcOrderIndex+1; + ef_setCalcOrder.lastIndex=o2.calcOrderIndex; + } + } else { + f=a.shift(); + o1=this.getField(f); + if ( o1 == null ) { + ef_CalcOrderErr(f); + continue; + } + o1.calcOrderIndex=ef_setCalcOrder.lastIndex; } + } } function ef_CalcOrderErr(f) { - console.show(); app.beep(0); - console.println("calcOrder: the field \""+ f - + "\" does not exist in this document, skipping it.\n\n" - + "calcOrder: Check the case sensitive spelling of the field."); + console.show(); app.beep(0); + console.println("calcOrder: the field \""+ f + + "\" does not exist in this document, skipping it.\n\n" + + "calcOrder: Check the case sensitive spelling of the field."); } var _EfCalcOrder=\efCalcOrder; ef_setCalcOrder(_EfCalcOrder); diff --git a/texmf-dist/source/latex/acrotex/exerquiz.dtx b/texmf-dist/source/latex/acrotex/exerquiz.dtx index d75879e0..f478c87f 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> [2020/03/14 v8.5.10 % +%<package|driver|aebjs|eqexam|randomize|sumrytbls|template> [2021/01/20 v8.6.2 % %<package> Exerquiz: Exercises and Quizzes for LaTeX/PDF package (dps)] %<driver> Exerquiz documentation driver file (dps)] %<aebjs> Exerquiz document level JavaScript (dps)] @@ -51,6 +51,7 @@ \let\env\texttt \let\opt\texttt \let\app\textsf +\let\uif\textsf \def\nmpsep#1{\hskip-\marginparsep\texttt{#1}} \def\visispace{\symbol{32}} \def\ameta#1{\ensuremath{\langle\textit{\texttt{#1}}\rangle}} @@ -98,15 +99,21 @@ % \end{macrocode} %\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'. -% This is a major addition, changes are marked by \texttt{dps17} for future reference in case something goes wrong. % \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} % +% \section{Introduction} +% +% The \pkg{exerquiz} package provides support for the creation of exercises and quizzes +% with or without solutions. These are PDF form and link based. The packages provides ``intelligent'' evaluation +% of the students' responses. This package also provides code for the \pkg{eqexam} package so that these +% two packages are consistent in their approach. +% % \section{Package options and setup}\label{options} % -% Introduce a number of useful options for \textsl{exerquiz}. +% Introduce a number of useful options for \pkg{exerquiz}. % \subsection{Options for paper, solutions, JavaScript and preview} % \begin{macrocode} % Begin package segment @@ -121,16 +128,17 @@ \RequirePackage{ifluatex} \@ifundefined{exqtable}{\def\exqtable{table}}{} \IfFileExists{xcolor.sty}{% - \def\eq@ColorPackage{xcolor}% - \PassOptionsToPackage{\exqtable,hyperref}{xcolor}} - {\def\eq@ColorPackage{color}} + \def\eq@ColorPackage{xcolor}% + \PassOptionsToPackage{\exqtable,hyperref}{xcolor}} + {\def\eq@ColorPackage{color}} % \end{macrocode} -% \IndexOpt{noxcolor} An option to force +% \leavevmode\IndexOpt{noxcolor}^^A +% An option to force % the use of the \textsf{color} package. % \begin{macrocode} \DeclareOption{noxcolor}{\def\eq@ColorPackage{color}} % \end{macrocode} -% \IndexOpt{forpaper}\IndexOpt{forcolorpaper} +% \leavevmode\IndexOpt{forpaper}\IndexOpt{forcolorpaper}^^A % Pass the |monochrome| option to the color package %\changes{v6.06a}{2007/04/09} %{ @@ -146,7 +154,7 @@ \AtBeginDocument{\ifnum\eq@drivernum=4 \else\AllowPeeking\fi} } % \end{macrocode} -% \IndexOpt{preview} +% \leavevmode\IndexOpt{preview}^^A % With this option, the bounding boxes of all form fields appear in the % dvi preview. Use this option of properly positioning your fields, then % remove this option on the final build of the document. This option is no @@ -154,13 +162,13 @@ % \begin{macrocode} \DeclareOption{preview}{\PassOptionsToPackage{preview}{eforms}} % \end{macrocode} -% \IndexOpt{nosolutions} +% \leavevmode\IndexOpt{nosolutions}^^A % With the option, the solutions to the exercises are not % included in the typeset document. % \begin{macrocode} \DeclareOption{nosolutions}{\eq@nosolutionstrue\eq@nolinktrue} % \end{macrocode} -% \IndexOpt{noquizolutions} +% \leavevmode\IndexOpt{noquizolutions}^^A % No solutions for quizzes (shortquiz and quiz environments). % \begin{macrocode} \DeclareOption{noquizsolutions}{\eq@noquizsolutionstrue\eq@nolinktrue} @@ -177,7 +185,7 @@ \DeclareOption{online}{\let\eq@online\eq@YES} \let\eq@online\eq@NO % \end{macrocode} -% \IndexOpt{nohiddensolutions}\IndexOpt{noHiddensolutions} +% \leavevmode\IndexOpt{nohiddensolutions}\IndexOpt{noHiddensolutions}^^A % Overrides any hidden solutions specified with the \texttt{exercise} % environment. % \begin{macrocode} @@ -185,12 +193,12 @@ \DeclareOption{noHiddensolutions}% {\eq@globalshowsolutionstrue\AtBeginDocument{\def\Hidesymbol{h}}} % \end{macrocode} -% \IndexOpt{solutionsafter} +% \leavevmode\IndexOpt{solutionsafter}^^A % Solutions will appear after the statement of the exercise. % \begin{macrocode} \DeclareOption{solutionsafter}{\eq@solutionsaftertrue\eq@nolinktrue} % \end{macrocode} -% \IndexOpt{solutionsonly} +% \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} % \begin{macrocode} @@ -202,7 +210,7 @@ \newif\ifsolutionsonly\solutionsonlyfalse \@ifundefined{ifanswerkey}{\newif\ifanswerkey\answerkeyfalse}{} % \end{macrocode} -% \IndexOpt{contsolns} +% \leavevmode\IndexOpt{contsolns}^^A % This option requires both \textsf{web} and \textsf{exerquiz}. The package % tests for the presence of the \textsf{web} and whether webheadings pagestyle % is used. @@ -214,25 +222,25 @@ \def\contsolnsErrorMsg{\PackageWarning{exerquiz}{contsolns option, cannot find file contsolns.def}} % \end{macrocode} -% \IndexOpt{nocorrections} +% \leavevmode\IndexOpt{nocorrections}^^A % The code for correcting the |quiz| environment is % not written; this results in a smaller file. % \begin{macrocode} \DeclareOption{nocorrections}{\nocorrectionstrue} % \end{macrocode} -% \IndexOpt{proofing} +% \leavevmode\IndexOpt{proofing}^^A % An option for marking the correct answers for shortquiz and quiz % \begin{macrocode} \DeclareOption{proofing}{\eq@proofingtrue} % \end{macrocode} -% \IndexOpt{showgrayletters} +% \leavevmode\IndexOpt{showgrayletters}^^A % When this option is in effect, capital letters in gray appear under % the multiple choice question boxes of quizzes. % \begin{macrocode} \newif\ifaebshowgrayletters\aebshowgraylettersfalse \DeclareOption{showgrayletters}{\aebshowgrayletterstrue} % \end{macrocode} -% \IndexOpt{vspacewithsolns} +% \leavevmode\IndexOpt{vspacewithsolns}^^A % This is for the \texttt{vspacewithsolns} option designed for % \textsf{eqexam}, but can be used in \textsf{exerquiz}. The switch % \cs{ifvspacewithsolns} is defined in \textsf{eqexam}, and we only @@ -253,7 +261,7 @@ \providecommand\displayworkareaOn{\displayworkareatrue} \providecommand\displayworkareaOff{\displayworkareafalse} % \end{macrocode} -% \IndexOpt{nodljs} +% \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. @@ -261,24 +269,24 @@ \DeclareOption{nodljs}{\PassOptionsToPackage{nodljs}{insdljs}% \AtEndOfPackage{\let\importdljs\eq@YES}} % \end{macrocode} -% \IndexOpt{execAfter} +% \leavevmode\IndexOpt{execAfter}^^A % Execute any JS defined within the \texttt{execJS} environment. Works only for % authors using Acrobat 5.0 or Acrobat Approval. % \begin{macrocode} \DeclareOption{execJS}{\PassOptionsToPackage{execJS}{insdljs}} % \end{macrocode} -% \IndexOpt{exercisesonly} +% \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. % \begin{macrocode} \DeclareOption{exercisesonly}{\PassOptionsToPackage{nodljs}{insdljs}} % \end{macrocode} -% \IndexOpt{debug} +% \leavevmode\IndexOpt{debug}^^A % An option for debugging JavaScript. Pass on to insdljs package. % \begin{macrocode} \DeclareOption{debug}{\PassOptionsToPackage{debug}{insdljs}} % \end{macrocode} -% \IndexOpt{allowrandomize} +% \leavevmode\IndexOpt{allowrandomize}^^A % Beginning with version 6.1 of \textsf{exerquiz}, it is possible to randomize % the choices in a multiple choice question. These choices must be set off % by the command \cs{bChoices}/\cs{eChoices} pair. The command \cs{bChoices} now has @@ -289,7 +297,8 @@ {\PackageInfo{exerquiz}{inputting aebrandom.def}} {cannot find aebrandom.def}} % \end{macrocode} -% \IndexOpt{usesumrytbls} +% \leavevmode\IndexOpt{usesumrytbls}^^A +% The declare the use of summary tables % \begin{macrocode} \newif \ifusesumrytbls \usesumrytblsfalse \DeclareOption{usesumrytbls}{\usesumrytblstrue @@ -365,7 +374,7 @@ \PassOptionsToPackage{xetex}{eforms}% } % \end{macrocode} -% \IndexOpt{textures} +% \leavevmode\IndexOpt{textures}^^A % This option, and testing are due to Ross Moore 3/6/02 % \begin{macrocode} \DeclareOption{textures}{\def\eq@drivernum{3}% @@ -374,7 +383,7 @@ \PassOptionsToPackage{textures}{eforms}% } % \end{macrocode} -% \IndexOpt{dviwindo} +% \leavevmode\IndexOpt{dviwindo}^^A % Set \cmd{\eq@noformstrue}, this inserts an \cmd{\endinput} just after % the end of the |exercise| environment. No quizzes for % \texttt{dviwindo}. @@ -388,7 +397,7 @@ % \def\eq@drivernum{5} % \def\eq@driver{dvipsone/dvips} % \def\eq@driver{no driver specified} -% \IndexOpt{unicode} +% \leavevmode\IndexOpt{unicode}^^A % Passes the unicode option to \textsf{hyperref}. % \changes{v6.3}{2008/03/19} % { @@ -397,7 +406,7 @@ % \begin{macrocode} \DeclareOption{unicode}{\PassOptionsToPackage{unicode}{hyperref}} % \end{macrocode} -% \IndexOpt{useui} +% \leavevmode\IndexOpt{useui}^^A % Passes the useui option to eforms. With this option, % the key-value pairs \textsl{\'{a} la xkeyval} can be used. % \changes{v6.3}{2008/03/19} @@ -419,7 +428,7 @@ % \begin{macrocode} \let\LangRedefinitions\relax % \end{macrocode} -% \IndexOpt{french} +% \leavevmode\IndexOpt{french}^^A % Translations due to Jean-Michel SARLAT. % \begin{macrocode} \DeclareOption{french}{% @@ -428,7 +437,7 @@ {\PackageInfo{exerquiz}{French Option: Cannot find the file eqfr.def, using the default, English.}}}} % \end{macrocode} -% \IndexOpt{german} +% \leavevmode\IndexOpt{german}^^A % Translation due to Michael Wiedmann. % \begin{macrocode} \DeclareOption{german}{% @@ -437,7 +446,7 @@ {\PackageInfo{exerquiz}{German Option: Kann die Datei eqde.def nicht finden, benutze Default, Englisch.}}}} % \end{macrocode} -% \IndexOpt{norsk} +% \leavevmode\IndexOpt{norsk}^^A % Translation due to Hans Fredrik Nordhaug. % \begin{macrocode} \DeclareOption{norsk}{% @@ -446,7 +455,7 @@ {\PackageInfo{exerquiz}{Norsk Option: Cannot find the file eqno.def, using the default, English.}}}} % \end{macrocode} -% \IndexOpt{dutch} +% \leavevmode\IndexOpt{dutch}^^A % Translation due to Henny Wilbrink % \begin{macrocode} \DeclareOption{dutch}{% @@ -455,7 +464,7 @@ {\PackageInfo{exerquiz}{Dutch Option: Kan bestand eqnl.def niet vinden, gebruik default, Engels.}}}} % \end{macrocode} -% \IndexOpt{spanish} +% \leavevmode\IndexOpt{spanish}^^A % Translation due to Pedro Luis Luque % \begin{macrocode} \DeclareOption{spanish}{% @@ -464,7 +473,7 @@ {\PackageInfo{exerquiz}{Spanish Option: Opci\'on Espa\~nola: no puede encontrar el fichero eqes.def, usar\'a por defecto, English.}}}} % \end{macrocode} -% \IndexOpt{italian} +% \leavevmode\IndexOpt{italian}^^A % Translation due to PierLuigi Zezza % \begin{macrocode} \DeclareOption{italian}{% @@ -473,7 +482,7 @@ {\PackageInfo{exerquiz}{pzione Italiano: Non trovo il file eqit.def, utilizzo quello di default, English.}}}} % \end{macrocode} -% \IndexOpt{russian} +% \leavevmode\IndexOpt{russian}^^A % Translation due to Sergei V. Znamenskii % \begin{macrocode} \DeclareOption{russian}{% @@ -486,7 +495,7 @@ {\PackageInfo{exerquiz}{Russian Option: Cannot find the file eqru.def, using the default, English.}}}} % \end{macrocode} -% \IndexOpt{dansk} +% \leavevmode\IndexOpt{dansk}^^A % Translation due to Erik Leimand % \begin{macrocode} \DeclareOption{dansk}{% @@ -495,7 +504,7 @@ {\PackageInfo{exerquiz}{Dansk Option: Cannot find the file eqda.def, using the default, English.}}}} % \end{macrocode} -% \IndexOpt{polish} +% \leavevmode\IndexOpt{polish}^^A % Translation due to Jerzy Mycielski % \begin{macrocode} \DeclareOption{polish}{% @@ -504,7 +513,7 @@ {\PackageInfo{exerquiz}{Polish Option: Cannot find the file eqpo.def, using the default, English.}}}} % \end{macrocode} -% \IndexOpt{finnish} +% \leavevmode\IndexOpt{finnish}^^A % Translation due to Paivi Porras % \begin{macrocode} \DeclareOption{finnish}{% @@ -513,7 +522,7 @@ {\PackageInfo{exerquiz}{Finnish Option: Cannot find the file eqfin.def, using the default, English.}}}} % \end{macrocode} -% \IndexOpt{catalan} +% \leavevmode\IndexOpt{catalan}^^A % Translation due to Ramon Ballester % \begin{macrocode} \DeclareOption{catalan}{% @@ -522,7 +531,7 @@ {\PackageInfo{exerquiz}{Catalan Option: Cannot find the file eqcat.def, using the default, English.}}}} % \end{macrocode} -% \IndexOpt{czech} +% \leavevmode\IndexOpt{czech}^^A % Translation due to Robert Marik % \begin{macrocode} \DeclareOption{czech}{% @@ -531,7 +540,7 @@ {\PackageInfo{exerquiz}{Czech Option: Cannot find the file eqcz.def, using the default, English.}}}} % \end{macrocode} -% \IndexOpt{brazil} +% \leavevmode\IndexOpt{brazil}^^A % Translation due to Koichi Sameshima % \begin{macrocode} \DeclareOption{brazil}{% @@ -541,7 +550,7 @@ n\~ao foi poss\'ivel encontrar o arquivo eqbr.def, usaremos o padr\~ao, English.}}}} % \end{macrocode} -% \IndexOpt{turkish} +% \leavevmode\IndexOpt{turkish}^^A % Translation due to Mahmut Ko\c{c}ak % \begin{macrocode} \DeclareOption{turkish}{% @@ -690,6 +699,7 @@ % \begin{macrocode} \newif\ifeq@randomizeChoices \eq@randomizeChoicesfalse \newif\ifeq@randomizeallChoices \eq@randomizeallChoicesfalse +\newif\if@DoNotRandomize \@DoNotRandomizefalse % \end{macrocode} % \begin{macro}{\turnOnRandomize} % \begin{macro}{\obeyLocalRandomize} @@ -705,6 +715,20 @@ % \end{macrocode} % \end{macro} % \end{macro} +% \begin{macro}{\doNotRandomizeChoices} +% \begin{macro}{\allowRandomizedChoices} +% These two commands allow for finer control over whether to randomize choices +% or not. Expanding \cs{doNoRandomizeChoices} overrides the \opt{allowrandomize} +% option; whereas \cs{allowRandomizedChoices} restores the original behavior +% set by the \opt{allowrandomize} option. +% \changes{v8.6.2}{2021/01/20}{Added \string\cs{doNoRandomizeChoices} and +% \string\cs{allowRandomizedChoices}} +% \begin{macrocode} +\def\doNotRandomizeChoices{\@DoNotRandomizetrue} +\def\allowRandomizedChoices{\@DoNotRandomizefalse} +% \end{macrocode} +% \end{macro} +% \end{macro} % These\DescribeMacro{\saveRandomSeed}\DescribeMacro{\inputRandomSeed} two % commands are used when the \texttt{allowrandomize} option is in effect, Until % then, they do nothing. See the definition in \autoref{randomize}. @@ -3717,8 +3741,8 @@ % \section{Common code for quizzes.} % Here, we include a few commands common to both % quiz environments. -% -% Colors used by \textsf{exerquiz}: \texttt{webgreen} normally defined in \textsf{web} +%\medskip\par\noindent +% Colors used by \textsf{exerquiz}: \texttt{webgreen} normally defined in \textsf{web}. % \begin{macrocode} \definecolor{webgreen}{rgb}{0,.6,0} % \end{macrocode} @@ -3786,23 +3810,25 @@ \define@key{props@ques}{labelwidth}[]{\def\propQ@labelwidth{#1}} \let\propQ@labelwidth\@empty % \end{macrocode} -% \IndexKey{topsep}\texttt{topsep}, \IndexKey{partopsep}\texttt{partopsep}, +% \leavevmode\IndexKey{topsep}^^A +% \texttt{topsep}, \IndexKey{partopsep}\texttt{partopsep}, % \IndexKey{parsep}\texttt{parsep}, and \IndexKey{itemsep}\texttt{itemsep}. % \begin{macrocode} \define@key{props@ques}{topsep}[\the\topsep]{\edef\propQ@topsep{#1}} \define@key{props@ques}{partopsep}[\the\partopsep]% - {\edef\propQ@partopsep{#1}} + {\edef\propQ@partopsep{#1}} \define@key{props@ques}{parsep}[\the\parsep]{\edef\propQ@parsep{#1}} \define@key{props@ques}{itemsep}[\the\itemsep]{\edef\propQ@itemsep{#1}} % \end{macrocode} -% \IndexKey{labelsepTo}\texttt{labelsepTo} and \IndexKey{labelsep}\texttt{labelsep} +% \leavevmode\IndexKey{labelsepTo}\texttt{labelsepTo} and \IndexKey{labelsep}\texttt{labelsep} % \begin{macrocode} \define@key{props@ques}{labelsepTo}[\normalsize\normalfont\ ]% - {\def\propQ@labelsepTo{#1}} + {\def\propQ@labelsepTo{#1}} \define@key{props@ques}{labelsep}[\@empty]{\def\propQ@labelsep{#1}} \let\propQ@labelsep\@empty % \end{macrocode} -% \IndexKey{color}\texttt{color} +% \leavevmode\IndexKey{color}^^A +% A color key set the color of the numbers in a question environment. % \begin{macrocode} \define@key{props@ques}{color}[blue]{\quesNumColor{#1}} % \end{macrocode} @@ -3814,42 +3840,41 @@ % Now we begin the \texttt{questions} environment. There is an optional parameter % wherein we pass the key-value pairs defined above. % \begin{macrocode} -\newenvironment{questions}[1][] -{% - \ifnum\@eqquestiondepth>\tw@\@toodeep\else - \advance\@eqquestiondepth\@ne\fi - \def\@quesctr{eqquestionno\romannumeral\the\@eqquestiondepth}% - \toks@=\expandafter\expandafter\expandafter{#1}\expandafter - \xdef\csname quesOpts\@quesctr\endcsname{\the\toks@}% - \edef\tempexp{\noexpand\setkeys{props@ques}{\the\toks@}}\tempexp - \list{\qMark@Hook\prior@questionsHook - \insE@rlyAtQues\gdef\eqPTs{1}% - \global\let\eqQT\eq@na% +\newenvironment{questions}[1][]{% + \ifnum\@eqquestiondepth>\tw@\@toodeep\else + \advance\@eqquestiondepth\@ne\fi + \def\@quesctr{eqquestionno\romannumeral\the\@eqquestiondepth}% + \toks@=\expandafter\expandafter\expandafter{#1}\expandafter + \xdef\csname quesOpts\@quesctr\endcsname{\the\toks@}% + \edef\tempexp{\noexpand\setkeys{props@ques}{\the\toks@}}\tempexp + \list{\qMark@Hook\prior@questionsHook + \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. % \begin{macrocode} - {\@tempcnta=0 \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 - }\xdef\@currentQues{\@thispr@b}}% - \makebox[\labelwidth][r]{\normalfont\@nameuse{label\@quesctr}}% - \xdef\eq@pageThisQ{\the\c@page}% - \post@questionsHook}{\usecounter{\@quesctr}% + {\@tempcnta=0 \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 + }\xdef\@currentQues{\@thispr@b}}% + \makebox[\labelwidth][r]{\normalfont\@nameuse{label\@quesctr}}% + \xdef\eq@pageThisQ{\the\c@page}% + \post@questionsHook}{\usecounter{\@quesctr}% % \end{macrocode} % We set the list parameter for the \texttt{questions} environment. % \begin{macrocode} \ifx\propQ@labelsep\@empty - \settowidth{\labelsep}{\propQ@labelsepTo}\else - \setlength{\labelsep}{\propQ@labelsep}\fi + \settowidth{\labelsep}{\propQ@labelsepTo}\else + \setlength{\labelsep}{\propQ@labelsep}\fi \ifx\propQ@labelwidth\@empty - \settowidth{\labelwidth}% - {\propQ@labelwidthTo\hspace{\labelsep}}\else - \settowidth{\labelwidth}{\hspace{\propQ@labelwidth}% - \hspace{\labelsep}}\fi + \settowidth{\labelwidth}% + {\propQ@labelwidthTo\hspace{\labelsep}}\else + \settowidth{\labelwidth}{\hspace{\propQ@labelwidth}% + \hspace{\labelsep}}\fi \setlength{\topsep}{\propQ@topsep}% \setlength{\partopsep}{\propQ@partopsep}% \ifdim\parskip>\z@\addtolength{\topsep}{-\parskip}\fi @@ -3951,10 +3976,10 @@ % \begin{macrocode} \newenvironment{shortquiz*} {% - \xdef\eq@pageThisQ{\the\c@page}% - {\eqtmpcnta\@shortquizCnt\relax\advance\eqtmpcnta\@ne - \xdef\@shortquizCnt{\the\eqtmpcnta}}% - \sqForms\@shortquiz + \xdef\eq@pageThisQ{\the\c@page}% + {\eqtmpcnta\@shortquizCnt\relax\advance\eqtmpcnta\@ne + \xdef\@shortquizCnt{\the\eqtmpcnta}}% + \sqForms\@shortquiz }{\aeb@endshortquiz} % \end{macrocode} % Determines if the next argument is optional, if yes, we pass to @@ -3962,7 +3987,7 @@ % continue to \cs{@@shortquiz}. % \begin{macrocode} \def\@shortquiz{\@ifnextchar[% - {\@@shortquiz}{\@@shortquiz[\@sqGenBaseName]}} + {\@@shortquiz}{\@@shortquiz[\@sqGenBaseName]}} % \end{macrocode} % \end{environment} % \cs{@@shortquiz} continues the parsing of \texttt{shortquiz} and \texttt{shortquiz*}. @@ -3970,8 +3995,8 @@ % as a delimited parameter \texttt{\#1}. % \begin{macrocode} \def\sq@setCLN#1{\ifx\aebTitleQuiz\@empty - \protected@edef\@currentlabelname{#1}\else - \protected@edef\@currentlabelname{\@currentlabelname}\fi + \protected@edef\@currentlabelname{#1}\else + \protected@edef\@currentlabelname{\@currentlabelname}\fi } % \end{macrocode} % (2013/09/29) Added \cs{isQZ} and \cs{isSQZ} @@ -3979,37 +4004,53 @@ \let\isQZ=q \let\isSQZ=s %</package|eqexam> %<*package> -\def\sq@IDTxtField{\makebox[0pt][l]{\textField[\autoCenter{n}\BC{}\BG{} - \S{S}\textSize{0}\Ff{\FfReadOnly} - \AA{\AAFormat{% - if (typeof \oField=="undefined")\r\t - var \oField=new Object;\r - \oField.Grp={}; - \ifx\defaultColorJSLoc\@empty\else\r - \oField.DefaultColorJSLoc=\defaultColorJSLoc;\fi - \ifx\rghtColorJSLoc\@empty\else\r - \oField.RightColorJSLoc=\rghtColorJSLoc;\fi - \ifx\wrngColorJSLoc\@empty\else\r - \oField.WrongColorJSLoc=\wrngColorJSLoc;\fi - \ifx\rghtAnsSymbJSLoc\@empty\else\r - \oField.RightAnsSymbJSLoc=\rghtAnsSymbJSLoc;\fi - \ifx\wrngAnsSymbJSLoc\@empty\else\r - \oField.WrongAnsSymbJSLoc=\wrngAnsSymbJSLoc;\fi -}}]{sqID\oField}{2bp}{2bp}}% -} -\def\qz@IDTxtField{\makebox[0pt][l]{\textField[\autoCenter{n}\BC{}\BG{} +% \end{macrocode} +% The hidden ID field for a short-quiz +% \begin{macrocode} +\def\sq@IDTxtField{\makebox[0pt][l]{% + \textField[\autoCenter{n}\BC{}\BG{} \S{S}\textSize{0}\Ff{\FfReadOnly} - \AA{\AAFormat{if(typeof aQuizzesInDoc=="undefined")\r\t - var aQuizzesInDoc=new Array();\r - if (aQuizzesInDoc.indexOf("\oField")) - aQuizzesInDoc.push("\oField");\r + \AA{\AAFormat{% + if\eqSP(typeof\eqSP\oField=="undefined")\eqSP + var\eqSP\oField=new\eqSP Object;\r + \oField.Grp={};% + \ifx\defaultColorJSLoc\@empty\else\r + \oField.DefaultColorJSLoc=\defaultColorJSLoc;\fi + \ifx\rghtColorJSLoc\@empty\else\r + \oField.RightColorJSLoc=\rghtColorJSLoc;\fi + \ifx\wrngColorJSLoc\@empty\else\r + \oField.WrongColorJSLoc=\wrngColorJSLoc;\fi + \ifx\rghtAnsSymbJSLoc\@empty\else\r + \oField.RightAnsSymbJSLoc=\rghtAnsSymbJSLoc;\fi + \ifx\wrngAnsSymbJSLoc\@empty\else\r + \oField.WrongAnsSymbJSLoc=\wrngAnsSymbJSLoc;\fi + }}]{sqID\oField}{2bp}{2bp}}% +} +% \end{macrocode} +% The \uif{Format} code for the hidden quiz ID text field. +%\changes{v8.6}{2020/11/29}{\string\cs{qz@IDTxtField}: Format code now in \string\env{defineJS}} +% \begin{macrocode} +\begin{defineJS}[\makeesc\!\makecmt\%]{\qzIDFmt} +if(typeof aQuizzesInDoc=="undefined") + var aQuizzesInDoc=new Array(); +if (aQuizzesInDoc.indexOf("!oField")) + aQuizzesInDoc.push("!oField"); % \end{macrocode} % (2019/06/22) Added in declaration of quiz object. %\changes{v8.2.12}{2019/06/22}{Added declaration of quiz object} % \begin{macrocode} - if (typeof \oField=="undefined")\r\t - var \oField=new Object;\r - }}]{qzID\oField}{2bp}{2bp}}} +if (typeof !oField=="undefined") + var !oField=new Object; +\end{defineJS} +% \end{macrocode} +% The hidden text field for quizzes. The role of this field is to initialize things +% for the associated quiz. This field has \uif{Format} code (\cs{qzIDFmt}), and the \app{Reader} will +% execute this code when the page is opened. The code creates a new array \texttt{aQuizzesInDoc}, if needed, +% and adds this quiz to the list of quizzes in the doc. Refer to \cs{qzIDFmt} above. +% \begin{macrocode} +\def\qz@IDTxtField{\makebox[0pt][l]{\textField[\autoCenter{n}\BC{}\BG{} + \S{S}\textSize{0}\Ff{\FfReadOnly} + \AA{\AAFormat{\qzIDFmt}}]{qzID\oField}{2bp}{2bp}}} %</package> %<*package|eqexam> \let\eqQuizType\relax @@ -4030,7 +4071,7 @@ \let\@Ans\Ans@sq@f \ifx\oField\@empty \typeout{^^JExerquiz: Base field name required when using - shortquiz with '*' option}% + shortquiz with '*' option}% \PackageInfo{exerquiz}{Assuming link style^^J}% \let\@Ans\Ans@sq@l \fi @@ -4060,21 +4101,21 @@ % a \cs{@gobbletwo}, this eats up the next two tokens that immediately % follow \cs{sqlabel} in the beginning of the \texttt{shortquiz} environment. % \begin{macrocode} - \def\sqlabel{\aebtitleQuiz\@gobbletwo}% + \def\sqlabel{\aebtitleQuiz\@gobbletwo}% \fi % \end{macrocode} % When the online (or email) options are used in eqexam, the \cs{hypertarget} % command is adding vertical space. Normally \cs{sqlabel} is empty, so we don't % need \cs{hypertarget} in this case here. % \begin{macrocode} - \sq@aboveskip\sq@priorhook - \@ifundefined{PointsOnLeft}% - {\sq@setCLN{\eq@defaultShortQuizLabelName}% - \ifx\sqlabel\@empty\else\noindent\fi - \hypertarget{sqH\@currentHref}{}\sq@IDTxtField - \ifx\sqlabel\@empty\else\expandafter - \sqlabel\expandafter\sqhspace\fi - {\set@typeset@protect\aebtitleQuiz}}{}\ignorespaces + \sq@aboveskip\sq@priorhook + \@ifundefined{PointsOnLeft}% + {\sq@setCLN{\eq@defaultShortQuizLabelName}% + \ifx\sqlabel\@empty\else\noindent\fi + \hypertarget{sqH\@currentHref}{}\sq@IDTxtField + \ifx\sqlabel\@empty\else\expandafter + \sqlabel\expandafter\sqhspace\fi + {\set@typeset@protect\aebtitleQuiz}}{}\ignorespaces %</package> %<eqexam> \sq@aboveskip\sq@priorhook\ignorespaces %<*package|eqexam> @@ -4336,19 +4377,19 @@ % \begin{macrocode} \let\prior@quizSolnHeaderHook\@empty \newcommand\quizSolnHeader[3][]{% - \prior@quizSolnHeaderHook - \ifeqforpaper\else\webnewpage\fi\noindent + \prior@quizSolnHeaderHook + \ifeqforpaper\else\webnewpage\fi\noindent %</package|eqexam> %<*package> - \def\eq@argi{#1}% - \ifx\eq@argi\@empty\else\noPeek#1\fi - \hypertarget{#2}{#3}\relax + \def\eq@argi{#1}% + \ifx\eq@argi\@empty\else\noPeek#1\fi + \hypertarget{#2}{#3}\relax %</package> %<*eqexam> - #2% + #2% %</eqexam> %<*package|eqexam> - \solnspace + \solnspace } %</package|eqexam> %<*package> @@ -4378,7 +4419,7 @@ % when he is not authorized to). % \begin{macrocode} \def\noPeekAction#1#2{% - /AA <</O<</S/JavaScript/JS(noPeek("#1",#2))>> >> + /AA <</O<</S/JavaScript/JS(noPeek("#1",#2))>> >> } %</package> %<*package|eqexam> @@ -4399,14 +4440,14 @@ % \cmd{\relax}. % \begin{macrocode} \def\includequizsolutions{\@ifstar - {\let\resetQZtsolns\relax\includequizsolutionsi} - {\def\resetQZtsolns{\global\let\include@quizsolutions\relax}% - \includequizsolutionsi}} + {\let\resetQZtsolns\relax\includequizsolutionsi} + {\def\resetQZtsolns{\global\let\include@quizsolutions\relax}% + \includequizsolutionsi}} \newcommand{\includequizsolutionsi}[1][]{% - \filterFor{#1}\includequizsolutionsii} + \filterFor{#1}\includequizsolutionsii} \def\includequizsolutionsii{\include@quizsolutions - \resetQZtsolns - \let\eqFilterArg\@empty} + \resetQZtsolns + \let\eqFilterArg\@empty} %</package|eqexam> %<*package> % \end{macrocode} @@ -4460,11 +4501,11 @@ % \begin{macrocode} \newcommand{\quizSolnInput} {% - \global\let\webnewpage\relax - \bgroup\OKToWriteExamDatatrue - \writeT@QzSolns{\string\endinput}\egroup - \immediate\closeout\quiz@solns - \ifeq@noquizsolutions\else + \global\let\webnewpage\relax + \bgroup\OKToWriteExamDatatrue + \writeT@QzSolns{\string\endinput}\egroup + \immediate\closeout\quiz@solns + \ifeq@noquizsolutions\else % \end{macrocode} % If there are quiz solutions, we start a new page, and clear the right mark. % We execute \cmd{\eq@normallheader} which sets the running left header, @@ -4473,30 +4514,30 @@ % with \cmd{\sqslsecrunhead}, makes it easier to define running headers % when solutions are filtered. % \begin{macrocode} - \iftherearequizsolutions\newpage\markright{}% - \eq@normallheader\markright{\sqslsecrunhead}% - \ifx\webnewpage\relax - \def\webnewpage{\global\let\webnewpage\newpage}\fi + \iftherearequizsolutions\newpage\markright{}% + \eq@normallheader\markright{\sqslsecrunhead}% + \ifx\webnewpage\relax + \def\webnewpage{\global\let\webnewpage\newpage}\fi % \end{macrocode} % Here we have various prior commands, and the setting of the % section title. % \begin{macrocode} - \priorsqslsectitle\quizSolnsHeadnToc\priorsqslinput + \priorsqslsectitle\quizSolnsHeadnToc\priorsqslinput % \end{macrocode} % Now input the solution file \cmd{\jobname.qsl}. % \begin{macrocode} - \InputIfFileExists{\jobname.qsl}{}% - {!!! Solutions to quizzes not found} + \InputIfFileExists{\jobname.qsl}{}% + {!!! Solutions to quizzes not found} % \end{macrocode} % A hook for hanging things % \begin{macrocode} - \eqqzsolutionshook + \eqqzsolutionshook % \end{macrocode} % Reset the running header cleanly % \begin{macrocode} - \newpage\eq@defaultlheader - \fi + \newpage\eq@defaultlheader \fi + \fi } % \end{macrocode} % The internal command that insert solutions. This command @@ -4540,35 +4581,35 @@ % \cs{defaultquiztype}. % \begin{macrocode} \newcommand{\quiztype}[1]{% - \def\@quiztype{#1}\def\aeb@FLOverride{#1}} + \def\@quiztype{#1}\def\aeb@FLOverride{#1}} \let\@quiztype\@empty \newcommand{\defaultquiztype}{\let\@quiztype\@empty - \let\aeb@FLOverride\relax} + \let\aeb@FLOverride\relax} \let\aeb@FLOverride\relax % \end{macrocode} % \end{macro} % \end{macro} % \begin{macrocode} \def\@setFormLinkType{% - \if\qstar*% - \ifx\aeb@FLOverride\relax% - \def\@@quiztype{f}% - \else - \if\aeb@FLOverride l\def\@@quiztype{l}\else - \def\@@quiztype{f}\fi - \fi + \if\qstar*% + \ifx\aeb@FLOverride\relax% + \def\@@quiztype{f}% \else - \ifx\aeb@FLOverride\relax - \def\@@quiztype{l}% - \else - \if\aeb@FLOverride f\def\@@quiztype{f}\else - \def\@@quiztype{l}\fi - \fi + \if\aeb@FLOverride l\def\@@quiztype{l}\else + \def\@@quiztype{f}\fi \fi + \else + \ifx\aeb@FLOverride\relax + \def\@@quiztype{l}% + \else + \if\aeb@FLOverride f\def\@@quiztype{f}\else + \def\@@quiztype{l}\fi + \fi + \fi } \def\setdefault@Ans{\@setFormLinkType - \expandafter\global\expandafter - \let\expandafter\@Ans\expandafter=\csname Ans@\@@quiztype\endcsname + \expandafter\global\expandafter + \let\expandafter\@Ans\expandafter=\csname Ans@\@@quiztype\endcsname } % \end{macrocode} % \begin{macro}{\useForms} @@ -4626,36 +4667,36 @@ % question label, i.e., \texttt{2(a)(ii)}. These two lines are repeated for % the \texttt{oQuestion} and \texttt{shortquiz} environments. % \begin{macrocode} - \xdef\eq@pageThisQ{\the\c@page}% - \let\@currentQues\@empty - \global\let\eqQzQuesList\@empty - \global\let\pointValuesArray\@empty + \xdef\eq@pageThisQ{\the\c@page}% + \let\@currentQues\@empty + \global\let\eqQzQuesList\@empty + \global\let\pointValuesArray\@empty % \end{macrocode} % Initialize \texttt{ptypeArray} to track problem types better % \changes{v7.7m}{2016/07/04}{Initialize \string\texttt{ptypeArray} to track problem types better} % \begin{macrocode} - \global\let\ptypeArray\@empty + \global\let\ptypeArray\@empty % \end{macrocode} % Initialize \texttt{corrAnsArray} to track the correct answers % \changes{v7.7n}{2016/07/06}{Initialize \string\texttt{ptypeArray} to track problem types better} % \begin{macrocode} - \global\let\corrAnsArray\@empty + \global\let\corrAnsArray\@empty % \end{macrocode} % Update the internal quiz counter. % \begin{macrocode} - {\eqtmpcnta\@quizCnt\advance\eqtmpcnta\@ne - \xdef\@quizCnt{\the\eqtmpcnta}}% + {\eqtmpcnta\@quizCnt\advance\eqtmpcnta\@ne + \xdef\@quizCnt{\the\eqtmpcnta}}% % \end{macrocode} % We try to support {\LaTeX}'s cross-referencing system by defining % \cs{@currentlabel}, \cs{@currentHlabel}, and \cs{@currentlabelname}. % \begin{macrocode} - \edef\@currentlabel{\@quizCnt}% - \edef\@currentHref{quiz.\@quizCnt}% - \sq@setCLN{\eq@defaultQuizLabelName}% - \setcounter{eqpointvalue}{0}\setcounter{questionno}{0}% - \eq@initializeServerSubmit - \global\let\eqQuizType\isQZ %\tabcolsep=0pt - \gdef\eqPTs{1}\global\let\eqQT\eq@na + \edef\@currentlabel{\@quizCnt}% + \edef\@currentHref{quiz.\@quizCnt}% + \sq@setCLN{\eq@defaultQuizLabelName}% + \setcounter{eqpointvalue}{0}\setcounter{questionno}{0}% + \eq@initializeServerSubmit + \global\let\eqQuizType\isQZ %\tabcolsep=0pt + \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 @@ -4663,31 +4704,32 @@ % Add \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}% - \gdef\quiz@total{#2}\xdef\curr@quiz{#2}\xdef\oField{#2}% - \xdef\currQuiz{#2}\xdef\currQuizStartPage{\thepage}% - \xdef\aPointType{0}% + \g@addto@macro\ListOfQuizNames{,#2}% + \gdef\quiz@total{#2}\xdef\curr@quiz{#2}\xdef\oField{#2}% + \xdef\currQuiz{#2}\xdef\currQuizStartPage{\thepage}% + \xdef\aPointType{0}% % \end{macrocode} % (2013/12/20) Pass \cs{bqlabelISO} through \cs{pdfstringdef}. % \begin{macrocode} - \def\fieldJSStr@CMD{\fieldJSStr*[noquotes]\bqlabelISO}% - \expandafter\fieldJSStr@CMD\expandafter{\bqlabelISO}% - \ifx\@quiztype\@empty\gdef\@@quiztype{#1}\else - \xdef\@@quiztype{\@quiztype}\fi - \let\@qzsolndest\@empty - \let\answers\answers@q\let\endanswers\endanswers@q - \let\manswers\manswers@q\let\endmanswers\endanswers@q - \let\solution\solution@sq\let\endsolution\endsolution@sq - \expandafter% - \xdef\csname titleOf\currQuiz\endcsname{\aebTitleQuiz}% + \def\fieldJSStr@CMD{\flJSStr*[noquotes]\bqlabelISO}% + \expandafter\fieldJSStr@CMD\expandafter{\bqlabelISO}% + \ifx\@quiztype\@empty\gdef\@@quiztype{#1}\else + \xdef\@@quiztype{\@quiztype}\fi + \let\@qzsolndest\@empty + \let\answers\answers@q\let\endanswers\endanswers@q + \let\manswers\manswers@q\let\endmanswers\endanswers@q + \let\solution\solution@sq\let\endsolution\endsolution@sq + \expandafter + \xdef\csname titleOf\currQuiz\endcsname{\aebTitleQuiz}% % \end{macrocode} % Modified the destination name of \cs{hypertarget} to avoid deplicate % destinations. Did the same thing for the \texttt{shortquiz}. % \changes{v7.8a}{2016/12/07}{Modified destination name of \string\cs{hypertarget}} % \begin{macrocode} - \q@aboveskip\q@priorhook\noindent\hypertarget{qzH\@currentHref}{}% - \eq@beginQuiz\qhspace{\set@typeset@protect\aebtitleQuiz}% - \ignorespaces} + \q@aboveskip\q@priorhook\noindent\hypertarget{qzH\@currentHref}{}% + \eq@beginQuiz\qhspace{\set@typeset@protect\aebtitleQuiz}% + \ignorespaces +} % \end{macrocode} % Here is the end for the \texttt{quiz} and \texttt{quiz*} environments. The % \cs{eq@prior@endQuiz} can be used for whatever purposes a @@ -4740,78 +4782,114 @@ % Use a button instead of a link for begin quiz % \begin{macrocode} \newcommand\useBeginQuizButton[1][] - {\renewcommand\eq@beginQuiz{\eq@BeginQuizButton[#1]}} + {\renewcommand\eq@beginQuiz{\eq@BeginQuizButton[#1]}} % \end{macrocode} % \end{macro} % \begin{macro}{\useEndQuizButton} % Use a button instead of a link for end quiz % \begin{macrocode} \newcommand\useEndQuizButton[1][] - {\renewcommand\eq@endQuiz{\eq@EndQuizButton[#1]}} + {\renewcommand\eq@endQuiz{\eq@EndQuizButton[#1]}} % \end{macrocode} % \end{macro} % \begin{macro}{\useBeginQuizLink} % Use a link begin quiz (the default) % \begin{macrocode} \newcommand\useBeginQuizLink - {\renewcommand\eq@beginQuiz{\eq@BeginQuizLink}} + {\renewcommand\eq@beginQuiz{\eq@BeginQuizLink}} % \end{macrocode} % \end{macro} % \begin{macro}{\useEndQuizLink} % Use a link end quiz (the default) % \begin{macrocode} \newcommand\useEndQuizLink - {\renewcommand\eq@endQuiz{\eq@EndQuizLink}} + {\renewcommand\eq@endQuiz{\eq@EndQuizLink}} % \end{macrocode} % \end{macro} -% \begin{macrocode} -%\def\listOfQuizzes{} -%\def\listOfSubmitQuizzes{} -%\def\initializeAllSubmitQuizzes{} -% \end{macrocode} % \begin{macro}{\@initQuiz} -% \begin{macro}{\priorInitQuiz} -% \begin{macro}{\postInitQuiz} % \cs{@initQuiz} is executed when you click on `Begin Quiz'. Included here are some % macro hooks for insert code prior to, and after the quiz initialization. This % command appears in the commands \cs{eq@@BeginQuizLinkActions} and \cs{eq@@BeginQuizButtonActions} below. %\changes{v7.0}{2014/11/05}{Added some JS: lstOfQuizzes is an object % listing all quizzes in the document, the value is the quiz object. We add properties % isSubmitted and initializeWith to the quiz object.} +%\changes{v8.6.1}{2020/12/30}{Changed the comparison method for \string\cs{priorInitQuiz} and +% \string\cs{postInitQuiz} to reflect their \string\cs{newcommand} definition.} % \begin{macrocode} \newcommand\@initQuiz{% - var \curr@quiz=new Object();\jsR - lstOfQuizzes["\curr@quiz"]=\curr@quiz;\jsR - \curr@quiz.oAlertCheck={bAfterValue:false};\jsR - \curr@quiz.Grp={}; - \ifx\defaultColorJSLoc\@empty\else\jsR - \oField.DefaultColorJSLoc=\defaultColorJSLoc;\fi - \ifx\rghtColorJSLoc\@empty\else\jsR - \oField.RightColorJSLoc=\rghtColorJSLoc;\fi - \ifx\wrngColorJSLoc\@empty\else\jsR - \oField.WrongColorJSLoc=\wrngColorJSLoc;\fi - \ifx\partialColorJSLoc\@empty\else\jsR - \oField.PartialColorJSLoc=\partialColorJSLoc;\fi - \ifx\rghtAnsSymbJSLoc\@empty\else\jsR - \oField.RightAnsSymbJSLoc=\rghtAnsSymbJSLoc;\fi - \ifx\wrngAnsSymbJSLoc\@empty\else\jsR - \oField.WrongAnsSymbJSLoc=\wrngAnsSymbJSLoc;\fi - \ifx\corrAnsSymbJSLoc\@empty\else\jsR - \oField.CorrAnsSymbJSLoc=\corrAnsSymbJSLoc;\fi - \ifx\eqGradeScaleLoc\@empty\else\jsR - \oField.GradeScaleLoc=new Array(\eqGradeScaleLoc);\fi - \ifx\eqCorrLocalChoiceFully\@empty\else\jsR % dpsf07 - \oField.fullyCorrectLoc=\eqCorrLocalChoiceFully;\fi - \ifx\priorInitQuiz\@empty\else\jsR\priorInitQuiz\fi %\jsR - InitializeQuiz("\curr@quiz",\ifnocorrections0\else1\fi); - \ifx\eq@CGI\@empty\jsR\curr@quiz.isSubmitted=false;\else - \jsR\curr@quiz.isSubmitted=true;\fi - \jsR\curr@quiz.initializeWith=% -'InitializeQuiz("\curr@quiz",\ifnocorrections0\else1\fi);' - \ifx\postInitQuiz\@empty\else\jsR\postInitQuiz\fi -} -% \end{macrocode} -% \cs{priorInitQuiz} and \cs{postInitQuiz} are hooks that allow a document author to + var\eqSP\curr@quiz=new Object();\jsR + lstOfQuizzes["\curr@quiz"]=\curr@quiz;\jsR + \curr@quiz.oAlertCheck={bAfterValue:false};\jsR + \curr@quiz.Grp={};% + \ifx\defaultColorJSLoc\@empty\else\jsR + \oField.DefaultColorJSLoc=\defaultColorJSLoc;\fi + \ifx\rghtColorJSLoc\@empty\else\jsR + \oField.RightColorJSLoc=\rghtColorJSLoc;\fi + \ifx\wrngColorJSLoc\@empty\else\jsR + \oField.WrongColorJSLoc=\wrngColorJSLoc;\fi + \ifx\partialColorJSLoc\@empty\else\jsR + \oField.PartialColorJSLoc=\partialColorJSLoc;\fi + \ifx\rghtAnsSymbJSLoc\@empty\else\jsR + \oField.RightAnsSymbJSLoc=\rghtAnsSymbJSLoc;\fi + \ifx\wrngAnsSymbJSLoc\@empty\else\jsR + \oField.WrongAnsSymbJSLoc=\wrngAnsSymbJSLoc;\fi + \ifx\corrAnsSymbJSLoc\@empty\else\jsR + \oField.CorrAnsSymbJSLoc=\corrAnsSymbJSLoc;\fi + \ifx\eqGradeScaleLoc\@empty\else\jsR + \oField.GradeScaleLoc=new Array(\eqGradeScaleLoc);\fi + \ifx\eqCorrLocalChoiceFully\@empty\else\jsR + \oField.fullyCorrectLoc=\eqCorrLocalChoiceFully;\fi + \if$\priorInitQuiz$\else\jsR\priorInitQuiz\fi\jsR + InitializeQuiz("\curr@quiz",\ifnocorrections0\else1\fi);% + \ifx\eq@CGI\@empty\jsR\curr@quiz.isSubmitted=false;\else + \jsR\curr@quiz.isSubmitted=true;\fi + \jsR\curr@quiz.initializeWith=% + 'InitializeQuiz("\curr@quiz",\ifnocorrections0\else1\fi);';% + \if$\postInitQuiz$\else\jsR\postInitQuiz\fi% +} +% \end{macrocode} +% The following is the \env{defineJS} version of \cs{@initQuiz}. This is experiemental +% for now, not yet implemented. +%\begin{verbatim} +%\begin{defineJS}[\makeesc\!\makecmt\%]{\@initQuiz} +%var !curr@quiz=new Object(); +%lstOfQuizzes["!curr@quiz"]=!curr@quiz; +%!curr@quiz.oAlertCheck={bAfterValue:false}; +%!curr@quiz.Grp={};% +%!ifx!defaultColorJSLoc!@empty!else +%!oField.DefaultColorJSLoc=!defaultColorJSLoc;!fi% +%!ifx!rghtColorJSLoc!@empty!else +%!oField.RightColorJSLoc=!rghtColorJSLoc;!fi% +%!ifx!wrngColorJSLoc!@empty!else +%!oField.WrongColorJSLoc=!wrngColorJSLoc;!fi% +%!ifx!partialColorJSLoc!@empty!else +%!oField.PartialColorJSLoc=!partialColorJSLoc;!fi% +%!ifx!rghtAnsSymbJSLoc!@empty!else +%!oField.RightAnsSymbJSLoc=!rghtAnsSymbJSLoc;!fi% +%!ifx!wrngAnsSymbJSLoc!@empty!else +%!oField.WrongAnsSymbJSLoc=!wrngAnsSymbJSLoc;!fi% +%!ifx!corrAnsSymbJSLoc!@empty!else +%!oField.CorrAnsSymbJSLoc=!corrAnsSymbJSLoc;!fi% +%!ifx!eqGradeScaleLoc!@empty!else +%!oField.GradeScaleLoc=new Array(!eqGradeScaleLoc);!fi% +%!ifx!eqCorrLocalChoiceFully!@empty!else +%!oField.fullyCorrectLoc=!eqCorrLocalChoiceFully;!fi% +%!if$!priorInitQuiz$!else +%!priorInitQuiz!fi% +%InitializeQuiz("!curr@quiz",!ifnocorrections0!else1!fi);% +%!ifx!eq@CGI!@empty +%!curr@quiz.isSubmitted=false;!else +%!curr@quiz.isSubmitted=true;!fi +%!curr@quiz.initializeWith=% +%'InitializeQuiz("!curr@quiz",!ifnocorrections0!else1!fi);';% +%!if$!postInitQuiz$!else +%!postInitQuiz!fi +%\end{defineJS} +%\end{verbatim} +% \end{macro} +% \begin{macro}{\priorInitQuiz} +% \begin{macro}{\postInitQuiz} +% These two commands are hooks that allow a document author to % execute JavaScript just prior to initializing the quiz and just after. These appear in % \cs{eq@@BeginQuizLinkActions} and \cs{eq@@BeginQuizButtonActions} below. % \begin{macrocode} @@ -4820,24 +4898,32 @@ % \end{macrocode} % \end{macro} % \end{macro} -% \end{macro} -% Here are a couple of macros used with `End Quiz', and are used for +% Here are a couple\DescribeMacro{\eq@submitURL}\DescribeMacro{\eq@insertHiddenFields}{} +% of macros that appear in `\uif{End Quiz}', and are used for % submitting quiz results to a web server. % \begin{macrocode} \let\eq@submitURL\@empty \let\eq@insertHiddenFields\@empty % \end{macrocode} +% \begin{macro}{\priorSubmitQuiz} +% \begin{macro}{\postSubmitQuiz} +% These two commands are defined in this package, but are use in \pkg{eq2db}. +% \begin{macrocode} +\newcommand\priorSubmitQuiz{} +\newcommand\postSubmitQuiz{} +% \end{macrocode} +% \end{macro} +% \end{macro} % % \subsubsection{With Links} % % \begin{macro}{\eq@BeginQuizLink} -% Begin quiz with links +% `\uif{Begin Quiz}' with links % \begin{macrocode} \def\eq@@BeginQuizLinkActions{\A{\JS{\@initQuiz}}} \def\eq@BeginQuizLinkDefaults{\Border{0 0 0}} \let\bqlabelFmt\@empty -\def\eq@BeginQuizLink{% - \qz@IDTxtField +\def\eq@BeginQuizLink{\qz@IDTxtField \set@@Link{}{}{}{\color{\@linkcolor}\bqlabelFmt\bqlabel}{}% {\eq@setWidgetProps\setLink@driver}% {\eq@BeginQuizLinkDefaults\eq@@BeginQuizLinkActions\every@Link}% @@ -4846,47 +4932,22 @@ % \end{macro} % \begin{macro}{\eq@EndQuizLink} % Code the the link version of `End Quiz'. +% \changes{v8.6}{2020/11/29}{Action for End Quiz Lnk now a \string\env{defineJS} env} % \begin{macrocode} -\newcommand\priorSubmitQuiz{} -\newcommand\postSubmitQuiz{} -\def\eq@@EndQuizLinkActions{\A{\JS{% - if (!isQuizInitialized("\curr@quiz"))\jsR\jsT - eqAppAlert(InitMsg("\bqlabelISO"),3);\jsR - else {\jsR\jsT - if (\minQuizResp(\thequestionno)) {\jsR\jsT\jsT - \curr@quiz.PtValues=new % - Array(\pointValuesArray);\jsR\jsT\jsT - ProbType = [\ptypeArray];\jsR\jsT\jsT -\if@inclkey - \curr@quiz.CorrAns=(new % - Array(\corrAnsArray));\jsR\jsT\jsT -\fi - DisplayQuizResults("\curr@quiz",\theeqpointvalue,% - \thequestionno);\jsR\jsT\jsT - var h=this.getField("ScoreData.\curr@quiz");\jsR\jsT\jsT - h.value=Score+";"+NQuestions+";"% - +ptScore+";"+NPointTotal;\jsR\jsT\jsT - \eq@submitURL - \postSubmitQuiz - \jsT\jsT resetQuiz("\curr@quiz");\jsR\jsT - }\jsR - }}}% -} +\def\eq@@EndQuizLinkActions{\A{\JS{\eQzBtnActns}}} \def\eq@EndQuizLinkDefaults{\Border{0 0 0}} \let\eqlabelFmt\@empty -\def\eq@EndQuizLink -{% - \ifx\eq@CGI\@empty - \let\eq@submitURL\@empty - \let\eq@insertHiddenFields\@empty - \fi - \set@@Link{}{}{}{\color{\@linkcolor}\eqlabelFmt\eqlabel}{}% - {\eq@setWidgetProps\setLink@driver}% - {\eq@EndQuizLinkDefaults\eq@@EndQuizLinkActions\every@Link}% - \makebox[0pt][r]{\textField[\BC{}\autoCenter{n}]% - {htxtfld.\curr@quiz}{2bp}{2bp}}% - \makebox[0pt][r]{\eq@hiddenScoreData\eq@insertHiddenFields}% - \global\let\eq@CGI\@empty\ignorespaces +\def\eq@EndQuizLink{% + \ifx\eq@CGI\@empty + \let\eq@submitURL\@empty + \let\eq@insertHiddenFields\@empty\fi + \set@@Link{}{}{}{\color{\@linkcolor}\eqlabelFmt\eqlabel}{}% + {\eq@setWidgetProps\setLink@driver}% + {\eq@EndQuizLinkDefaults\eq@@EndQuizLinkActions\every@Link}% + \makebox[0pt][r]{\textField[\BC{}\autoCenter{n}]% + {htxtfld.\curr@quiz}{2bp}{2bp}}% + \makebox[0pt][r]{\eq@hiddenScoreData\eq@insertHiddenFields}% + \global\let\eq@CGI\@empty\ignorespaces } % \end{macrocode} % \end{macro} @@ -4896,10 +4957,11 @@ % \begin{macro}{\eq@BeginQuizButton} % This is the button when the user wants button rather than link for the % \texttt{quiz} environment. +% \changes{v8.6}{2020/11/29}{Action for End Quiz Btn now a \string\env{defineJS} env} % \begin{macrocode} \def\BeginQuizButtonDefaults{% - \CA{\bqlabel}\H{P}\F{\FPrint} - \BC{1 0 0}\BG{.7529 .7529 .7529}\W{1}\S{B}} + \CA{\bqlabel}\H{P}\F{\FPrint} + \BC{1 0 0}\BG{.7529 .7529 .7529}\W{1}\S{B}} \def\eq@@BeginQuizButtonActions{\A{\JS{\@initQuiz}}} \newcommand\eq@BeginQuizButton[1][]{% \mbox{\qz@IDTxtField\push@@Button{#1}{beginQuiz.\curr@quiz}{}% @@ -4910,41 +4972,41 @@ % \end{macrocode} % \end{macro} % \begin{macro}{\eq@EndQuizButton} -% The `End Quiz' code for Links -% \begin{macrocode} -\def\EndQuizButtonDefaults{% - \CA{\eqlabel}\F{\FPrint}\BC{1 0 0} - \BG{.7529 .7529 .7529}\W{1}\S{B}\H{P}} -\def\eq@@EndQuizButtonActions{\A{\JS{% - if (!isQuizInitialized("\curr@quiz"))\jsR\jsT - eqAppAlert(InitMsg("\bqlabelISO"),3);\jsR - else {\jsR\jsT - if (\minQuizResp(\thequestionno)&&_ModalNotOn){\jsR\jsT\jsT - \curr@quiz.PtValues=(new % - Array(\pointValuesArray));\jsR\jsT\jsT - ProbType=[\ptypeArray];\jsR\jsT\jsT -\if@inclkey - \curr@quiz.CorrAns=(new % - Array(\corrAnsArray));\jsR\jsT\jsT -\fi - DisplayQuizResults("\curr@quiz",\theeqpointvalue,% - \thequestionno);\jsR\jsT\jsT - var h=this.getField("ScoreData.\curr@quiz");\jsR\jsT\jsT - h.value=Score+";"+NQuestions+";"% - +ptScore+";"+NPointTotal;\jsR\jsT\jsT - \eq@submitURL - \postSubmitQuiz - \jsT\jsT resetQuiz("\curr@quiz");\jsR\jsT - }\jsR - }}}% +% The `End Quiz' code +% \begin{macrocode} +\begin{defineJS}[\makeesc\*\makecmt\%]{\eQzBtnActns} +if (!isQuizInitialized("*curr@quiz")) + eqAppAlert(InitMsg("*bqlabelISO"),3); +else { + if (*minQuizResp(*thequestionno)&&_ModalNotOn){ + *curr@quiz.PtValues=new Array(*pointValuesArray); + ProbType=[*ptypeArray];% +*if@inclkey + *curr@quiz.CorrAns=new Array(*corrAnsArray);*fi + DisplayQuizResults("*curr@quiz",*theeqpointvalue,% +*thequestionno); + var h=this.getField("ScoreData.*curr@quiz"); + h.value=Score+";"+NQuestions+";"% ++ptScore+";"+NPointTotal;% +*ifx*eq@submitURL*empty*else + *eq@submitURL*fi% +*if$*postSubmitQuiz$*else + *postSubmitQuiz*fi + resetQuiz("*curr@quiz"); + } } +\end{defineJS} +\def\EndQuizButtonDefaults{% + \CA{\eqlabel}\F{\FPrint}\BC{1 0 0} + \BG{.7529 .7529 .7529}\W{1}\S{B}\H{P}} +\def\eq@@EndQuizButtonActions{% + \A{\JS{\eQzBtnActns}}} \newcommand{\eq@hiddenScoreData}{\makebox[0pt][r]{% \textField[\BC{}\F{\FHidden}]{ScoreData.\curr@quiz}{2bp}{2bp}}} \newcommand\eq@EndQuizButton[1][]{% \ifx\eq@CGI\@empty \let\eq@submitURL\@empty - \let\eq@insertHiddenFields\@empty - \fi + \let\eq@insertHiddenFields\@empty\fi \mbox{\push@@Button{#1}{endQuiz.\curr@quiz}{}% {\DefaultHeightOfWidget}{\eq@protect\A}% {\eq@setButtonProps\eq@Button@driver}% @@ -4959,8 +5021,8 @@ % \begin{macro}{\eqCGI} % \begin{macro}{\eqSubmit} % These four commands give general support for submitting quiz data -% to a web server for storage in a database. Use in my \textsf{eq2db} Package -% which I have not completed yet. (2014/09/14) Sanitized first argument of \cs{eqSubmit}. +% to a web server for storage in a database. Use in the \pkg{eq2db} package. +% (2014/09/14) Sanitized first argument of \cs{eqSubmit}. % \begin{macrocode} \newcommand\databaseName[1]{\gdef\db@Name{#1}}\def\db@Name{} \newcommand\tableName[1]{\gdef\db@Table{#1}}\def\db@Table{} @@ -5974,24 +6036,22 @@ if (isEndQuizPushed("@eqBaseName")){ % here, then goes to |\Ans@sq@l@driver| the rest of the code that depends on the % driver. % \begin{macrocode} -\def\sqWrongRespJS{OnBlurRespBox( false, "\oField" );} -\def\sqRightRespJS{OnBlurRespBox( true, "\oField" );} +\def\sqWrongRespJS{OnBlurRespBox(false,"\oField");} +\def\sqRightRespJS{OnBlurRespBox(true,"\oField");} \def\Ans@sq@l@Actions {% - \A{\if\Ans@choice1 - \JS{\sqRightRespJS} - \ifx\@qzsolndest\@empty\else - \ifeq@solutionsafter\else - /Next <</S/GoTo/D(\@qzsolndest)>> - \fi + \A{\if\Ans@choice\eq@One\JS{\sqRightRespJS} + \ifx\@qzsolndest\@empty\else + \ifeq@solutionsafter\else + /Next <</S/GoTo/D(\@qzsolndest)>> \fi + \fi \else \JS{\sqWrongRespJS\jsR \ifx\oField\@empty\else - updateTally("\oField.\thequestionno"); - \fi}% + updateTally("\oField.\thequestionno");\fi}% \fi - }% + }% } % \end{macrocode} % \end{macro} @@ -6047,6 +6107,7 @@ if (isEndQuizPushed("@eqBaseName")){ % \end{macrocode} % \end{macro} % \subsubsection{Form Style} +% \subsubsection{Answers for the \texttt{answers} and \texttt{manswers} Environment} % \begin{macro}{\Ans@sq@f} % 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 @@ -6073,28 +6134,46 @@ if (isEndQuizPushed("@eqBaseName")){ \def\sqNoCorrections{\let\@sqAlertsOnly\eq@One} \def\sqCorrections{\let\@sqAlertsOnly\eq@Zero} \sqNoCorrections -\def\Ans@sq@f@ActionsTrue{% - \if\@sqTurnOffAlerts1OnBlurRespBox(true,"\oField");\jsR\fi - \ifx\@qzsolndest\@empty\else\ifeq@solutionsafter\else - jmpToNamedDest("\oField","\@qzsolndest",% - \if\@sqTurnOffAlerts00\else1\fi);\fi - \fi\eqAddAAMouseUpMC} -\def\Ans@sq@f@ActionsFalse{% - \if\@sqTurnOffAlerts1OnBlurRespBox(false,"\oField" );\jsR\fi - \ifx\oField\@empty\else - updateTally("\oField.\thequestionno"); - \fi\jsR\eqAddAAMouseUpMC} +% \end{macrocode} +% JavaScript code for the mouse up action for the \emph{correct} choice of the radio button field +% (\texttt{mc.\ameta{fld-name}.\ameta{q-num}}) for the form version of a multiple choice question of a \texttt{shortquiz}. +% \begin{macrocode} +\begin{defineJS}[\makeesc\*\makecmt\%]{\Ans@sq@f@ActionsTrue} +*ifx*@sqTurnOffAlerts*eq@One% +OnBlurRespBox(true,"*oField"); +*fi% +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{defineJS} +% \end{macrocode} +% JavaScript code for the mouse up action for the \emph{incorrect} choice of the radio button field +% (\texttt{mc.\ameta{fld-name}.q-num}) for the form version of a multiple choice question of a \texttt{shortquiz}. +% \begin{macrocode} +\begin{defineJS}[\makeesc\*\makecmt\%]{\Ans@sq@f@ActionsFalse} +*ifx*@sqTurnOffAlerts*eq@One% +OnBlurRespBox(false,"*oField"); +*fi% +var qzSolnDest="*@qzsolndest"; +if( qzSolnDest!="") updateTally("*oField.*thequestionno");% +*ifx*eqAddAAMouseUpMC*empty*else +*eqAddAAMouseUpMC*fi +\end{defineJS} % \end{macrocode} % The actions for the form version of a multiple choice question of a \texttt{shortquiz}. % \begin{macrocode} -\def\Ans@sq@f@Actions{\A{\if\Ans@choice\eq@One - \JS{\Ans@sq@f@ActionsTrue}\else - \JS{\Ans@sq@f@ActionsFalse}\fi}% - \AAmousedown{updateTally.downState=!!event.target.isBoxChecked% - (\arabic{quizno}-1);}} +\def\Ans@sq@f@Actions{\AAmouseup{\if\Ans@choice\eq@One + \Ans@sq@f@ActionsTrue\else\Ans@sq@f@ActionsFalse\fi} + \AAmousedown{updateTally.downState=!!event.target.isBoxChecked% + (\arabic{quizno}-1);}} \def\Ans@proofing#1{\ifeq@proofing\if\Ans@choice1\relax - \llap{\@proofingsymbol\,\hskip#1\relax}% - \fi\fi} + \llap{\@proofingsymbol\,\hskip#1\relax}\fi\fi} % \end{macrocode} %\DescribeMacro{\sqRghtSymbChoice}\DescribeMacro{\sqRghtSymbColor} for the \texttt{shortquiz} % environment, these first two commands assign the right symbol (default check) and @@ -6102,19 +6181,19 @@ if (isEndQuizPushed("@eqBaseName")){ % does the same thing for the wrong answer. % \begin{macrocode} \def\sqRghtSymbChoice#1{\chooseJSsymbol*{#1}% - \ifx\eq@retnStyle\@empty - \edef\sq@corrsymch{\sqRghtSymbChoiceDef}\else - \edef\sq@corrsymch{#1}\fi} + \ifx\eq@retnStyle\@empty + \edef\sq@corrsymch{\sqRghtSymbChoiceDef}\else + \edef\sq@corrsymch{#1}\fi} \def\sqRghtSymbColor#1{\edef\eq@arg{#1}\ifx\eq@arg\@empty - \edef\sq@corrsymcol{\sqRghtSymbColorDef}\else - \edef\sq@corrsymcol{#1}\fi} + \edef\sq@corrsymcol{\sqRghtSymbColorDef}\else + \edef\sq@corrsymcol{#1}\fi} \def\sqWrngSymbChoice#1{\chooseJSsymbol*{#1}% - \ifx\eq@retnStyle\@empty - \edef\sq@wrgsymch{\sqWrngSymbChoiceDef}\else - \edef\sq@wrgsymch{#1}\fi} + \ifx\eq@retnStyle\@empty + \edef\sq@wrgsymch{\sqWrngSymbChoiceDef}\else + \edef\sq@wrgsymch{#1}\fi} \def\sqWrngSymbColor#1{\edef\eq@arg{#1}\ifx\eq@arg\@empty - \edef\sq@wrgsymcol{\sqWrngSymbColorDef}\else - \edef\sq@wrgsymcol{#1}\fi} + \edef\sq@wrgsymcol{\sqWrngSymbColorDef}\else + \edef\sq@wrgsymcol{#1}\fi} \def\sqRghtSymbChoiceDef{check} \def\sqRghtSymbColorDef{0 .6 0 rg} \def\sqWrngSymbChoiceDef{cross} @@ -6124,8 +6203,8 @@ if (isEndQuizPushed("@eqBaseName")){ \edef\sq@wrgsymch{\sqWrngSymbChoiceDef} \edef\sq@wrgsymcol{\sqWrngSymbColorDef} \def\sqResetSymbToDef{% - \sqRghtSymbChoice{}\sqRghtSymbColor{}% - \sqWrngSymbChoice{}\sqWrngSymbColor{}% + \sqRghtSymbChoice{}\sqRghtSymbColor{}% + \sqWrngSymbChoice{}\sqWrngSymbColor{}% } % \end{macrocode} %\DescribeMacro{\qChoiceSymb}\DescribeMacro{\qChoiceColor} for the \texttt{quiz} @@ -6133,12 +6212,12 @@ if (isEndQuizPushed("@eqBaseName")){ % color (default webgreen). % \begin{macrocode} \def\qChoiceSymb#1{\chooseJSsymbol*{#1}% - \ifx\eq@retnStyle\@empty - \edef\qz@chksymb{\qChoiceSymbDef}\else - \edef\qz@chksymb{#1}\fi} + \ifx\eq@retnStyle\@empty + \edef\qz@chksymb{\qChoiceSymbDef}\else + \edef\qz@chksymb{#1}\fi} \def\qChoiceColor#1{\edef\eq@arg{#1}\ifx\eq@arg\@empty - \edef\qz@chksymbcol{\qChoiceColorDef}\else - \edef\qz@chksymbcol{#1}\fi} + \edef\qz@chksymbcol{\qChoiceColorDef}\else + \edef\qz@chksymbcol{#1}\fi} \def\qChoiceSymbDef{check} \def\qChoiceColorDef{0 0 0 rg} \edef\qz@chksymb{\qChoiceSymbDef} @@ -6146,43 +6225,44 @@ if (isEndQuizPushed("@eqBaseName")){ %</package> %<*package|eqexam> \let\rbf@Opts\@empty -\def\Ans@sq@f{% - \if\eq@listType\eq@One\stepcounter{quizno}\else - \@ifundefined{ifwithinsoldoc}{\refstepcounter{quizno}} - {\ifwithinsoldoc\stepcounter{quizno}\else - \refstepcounter{quizno}\fi}\fi\PBS\raggedright +\def\Ans@sq@f{\if\eq@listType\eq@One + \stepcounter{quizno}\else + \@ifundefined{ifwithinsoldoc}{\refstepcounter{quizno}} + {\ifwithinsoldoc\stepcounter{quizno}\else + \refstepcounter{quizno}\fi}\fi + \PBS\raggedright %</package|eqexam> % \end{macrocode} %\changes{v6.7d}{2013/05/27}{added \cs{rbf@Opts} to hardwire choices.} % \begin{macrocode} %<*package> - \if\Ans@choice\eq@One - \def\rbf@Opts{\symbolchoice{\sq@corrsymch}% - \textColor{\sq@corrsymcol}}\else - \def\rbf@Opts{\symbolchoice{\sq@wrgsymch}% - \textColor{\sq@wrgsymcol}}\fi + \if\Ans@choice\eq@One + \def\rbf@Opts{\symbolchoice{\sq@corrsymch}% + \textColor{\sq@corrsymcol}}\else + \def\rbf@Opts{\symbolchoice{\sq@wrgsymch}% + \textColor{\sq@wrgsymcol}}\fi %</package> %<*package|eqexam> - \settowidth{\eq@tmplength}{\eq@lw@f}% - \eq@tmpdima=\wd\eq@tmpbox% - \hangindent=\eq@tmplength\hangafter=1\relax - \insertGrayLetters % 6.3d + \settowidth{\eq@tmplength}{\eq@lw@f}% + \eq@tmpdima=\wd\eq@tmpbox% + \hangindent=\eq@tmplength\hangafter=1\relax + \insertGrayLetters %</package|eqexam> %<*eqexam> - \Ans@sq@f@driver + \Ans@sq@f@driver %</eqexam> %<*package> - \mbox{\expandafter\radio@@Button\expandafter{\rbf@Opts}% - {mc.\oField.\thequestionno}% - {\RadioFieldSize}{\RadioFieldSize}% - {\Ans@choice\alph{quizno}}{\eq@protect\A}% - {\eq@setWidgetProps\eq@Radio@driver}% - {\@@Ans@sq@f@Defaults\Ans@sq@f@Actions\every@RadioButton - \every@sqRadioButton}}% - \Ans@proofing{\RadioFieldSize}% + \mbox{\expandafter\radio@@Button\expandafter{\rbf@Opts}% + {mc.\oField.\thequestionno}% + {\RadioFieldSize}{\RadioFieldSize}% + {\Ans@choice\alph{quizno}}{\eq@protect\A}% + {\eq@setWidgetProps\eq@Radio@driver}% + {\@@Ans@sq@f@Defaults\Ans@sq@f@Actions\every@RadioButton + \every@sqRadioButton}}% + \Ans@proofing{\RadioFieldSize}% %</package> %<*package|eqexam> -\eq@hspanner\ignorespaces} + \eq@hspanner\ignorespaces} %</package|eqexam> %<*package> % \end{macrocode} @@ -6194,87 +6274,108 @@ if (isEndQuizPushed("@eqBaseName")){ % %</package> %<*eqexam> -% dps 4/16/05 \let\Ans@ck@sq@f\Ans@sq@f %</eqexam> %<*package> -\def\@@Ans@ck@sq@f@Defaults -{% - \BC{0 0 0}\Ff{\FfNoToggleToOff} - \F{\FPrint}\textSize{12}\textColor{0 g}\W{1} +\def\@@Ans@ck@sq@f@Defaults{% + \BC{0 0 0}\Ff{\FfNoToggleToOff} + \F{\FPrint}\textSize{12}\textColor{0 g}\W{1} } \begingroup \catcode`\&=12 \gdef\eq@AND{&&} \endgroup -\def\Ans@ck@sq@f@ActionsTrue{% - var fName=event.target.name;\jsR - var g=this.getField("mc.\oField.\thequestionno");\jsR - var a=g.getArray();\jsR - for (var i=0; i<a.length; i++)\jsR\jsT - if ( a[i].isBoxChecked(0) \eq@AND\space - a[i].value.charAt(0)==0)\jsR\jsT\jsT - a[i].checkThisBox(0,false);\jsR - \if\@sqTurnOffAlerts1OnBlurRespBox(% - true,"\oField");\jsR\fi - \ifx\@qzsolndest\@empty\else - \ifeq@solutionsafter\else - % if all correct answers are check, jump to solution - for (var i=0; i<a.length; i++){\jsR\jsT - if ( a[i].exportValues[0].charAt(0)==1 \eq@AND\space - !a[i].isBoxChecked(0))\jsR\jsT\jsT - break;\jsR - }\jsR - if (i>=a.length) jmpToNamedDest("\oField","\@qzsolndest",% - \if\@sqTurnOffAlerts00\else1\fi); - \fi - \fi\eqAddAAMouseUpMS} -\def\Ans@ck@sq@f@ActionsFalse{% - var fName=event.target.name;\jsR - var g=this.getField("mc.\oField.\thequestionno");\jsR - var a=g.getArray();\jsR - for (var i=0; i<a.length; i++)\jsR - {\jsR\jsT - if (a[i].value.charAt(0)==0) {\jsR\jsT\jsT - if ( fName != a[i].name )\jsR\jsT\jsT\jsT - a[i].checkThisBox(0,false);\jsR\jsT - }\jsR - }\jsR - \if\@sqTurnOffAlerts1OnBlurRespBox( false, "\oField" );\fi - \ifx\oField\@empty\else - updateTally("\oField.\thequestionno"); - \fi\eqAddAAMouseUpMS} +% \end{macrocode} +% Mouse up action for a \emph{correct answer box} (a checkbox) to MS question of short-quiz +% (field name: \texttt{mc.\ameta{fld-name}.\ameta{ques-num}}.\ameta{choice-num}) +% \begin{macrocode} +\begin{defineJS}[\makeesc\*\makecmt\%]{\Ans@ck@sq@f@ActionsTrue} +var fName=event.target.name; +var g=this.getField("mc.*oField.*thequestionno"); +var a=g.getArray(); +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"); +*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) && % +(!a[i].isBoxChecked(0))) break; + } +} +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 +% (field name: \texttt{mc.\ameta{fld-name}.\ameta{ques-num}}.\ameta{choice-num}) +% \begin{macrocode} +\begin{defineJS}[\makeesc\*\makecmt\%]{\Ans@ck@sq@f@ActionsFalse} +var fName=event.target.name; +var g=this.getField("mc.*oField.*thequestionno"); +var a=g.getArray(); +for (var i=0; i<a.length; i++) { + if (a[i].value.charAt(0)==0) { + if ( fName != a[i].name ) + a[i].checkThisBox(0,false); + } +}% +*ifx*@sqTurnOffAlerts*eq@One% +OnBlurRespBox(false,"*oField"); +*fi% +*ifx*oField*@empty*else +updateTally("*oField.*thequestionno");*fi% +*ifx*eqAddAAMouseUpMS*empty*else +*eqAddAAMouseUpMS*fi +\end{defineJS} +% \end{macrocode} +% Set all actions for check box for a MS question of a short-quiz +% (field name: \texttt{mc.\ameta{fld-name}.\ameta{ques-num}}.\ameta{choice-num}) +% \begin{macrocode} \def\Ans@ck@sq@f@Actions{% - \A{\if\Ans@choice\eq@One - \JS{\Ans@ck@sq@f@ActionsTrue}\else - \JS{\Ans@ck@sq@f@ActionsFalse}\fi}% + \AAmouseup{\if\Ans@choice\eq@One + \Ans@ck@sq@f@ActionsTrue\else + \Ans@ck@sq@f@ActionsFalse\fi} \AAmousedown{updateTally.downState=!!event.target.isBoxChecked(0);}} -\def\Ans@ck@sq@f{% - \if\eq@listType\eq@One\stepcounter{quizno}\else - \@ifundefined{ifwithinsoldoc}{\refstepcounter{quizno}} - {\ifwithinsoldoc\stepcounter{quizno}\else - \refstepcounter{quizno}\fi}\fi\PBS\raggedright - \if\Ans@choice1% - \def\rbf@Opts{\symbolchoice{\sq@corrsymch}% - \textColor{\sq@corrsymcol}}\else - \def\rbf@Opts{\symbolchoice{\sq@wrgsymch}% - \textColor{\sq@wrgsymcol}}\fi - \settowidth{\eq@tmplength}{\eq@lw@f}% - \eq@tmpdima=\wd\eq@tmpbox% - \hangindent=\eq@tmplength\hangafter=1\relax - \insertGrayLetters % 6.3d - \mbox{\expandafter\check@@Box\expandafter{\rbf@Opts}% - {mc.\oField.\thequestionno.\arabic{quizno}}% - {\RadioFieldSize}{\RadioFieldSize} - {\Ans@choice\alph{quizno}}{\eq@protect\A}% - {\eq@setWidgetProps\eq@Check@driver}% - {\@@Ans@ck@sq@f@Defaults\Ans@ck@sq@f@Actions\every@CheckBox - \every@sqCheckBox}}% - \Ans@proofing{\RadioFieldSize}% -\eq@hspanner\ignorespaces} % \end{macrocode} -% \end{macro} -% \subsection{For \texttt{quiz}} +% The check boxes to a MS question in an \env{manswers} environment of a short-quiz; the name of this field +% |mc.\oField.\thequestionno.\arabic{quizno}|. +% \begin{macrocode} +\def\Ans@ck@sq@f{\if\eq@listType\eq@One + \stepcounter{quizno}\else + \@ifundefined{ifwithinsoldoc}{\refstepcounter{quizno}} + {\ifwithinsoldoc\stepcounter{quizno}\else + \refstepcounter{quizno}\fi}\fi\PBS\raggedright + \if\Ans@choice\eq@One + \def\rbf@Opts{\symbolchoice{\sq@corrsymch}% + \textColor{\sq@corrsymcol}}\else + \def\rbf@Opts{\symbolchoice{\sq@wrgsymch}% + \textColor{\sq@wrgsymcol}}\fi + \settowidth{\eq@tmplength}{\eq@lw@f}\eq@tmpdima\wd\eq@tmpbox + \hangindent\eq@tmplength\hangafter\@ne % dps + \insertGrayLetters % 6.3d + \mbox{\expandafter\check@@Box\expandafter{\rbf@Opts}% + {mc.\oField.\thequestionno.\arabic{quizno}}% + {\RadioFieldSize}{\RadioFieldSize} + {\Ans@choice\alph{quizno}}{\eq@protect\A}% + {\eq@setWidgetProps\eq@Check@driver}% + {\@@Ans@ck@sq@f@Defaults\Ans@ck@sq@f@Actions\every@CheckBox + \every@sqCheckBox}}% + \Ans@proofing{\RadioFieldSize}% + \eq@hspanner\ignorespaces +} +% \end{macrocode} +% \end{macro} +% \subsection{For the \texttt{quiz} environment} % \subsubsection{The \texttt{answers} and \texttt{manswers} Environment} % \begin{macro}{answers} % This is the answers environment for the \texttt{quiz} @@ -6304,51 +6405,51 @@ if (isEndQuizPushed("@eqBaseName")){ \newif\ifeqshowOutOf \eqshowOutOffalse \def\showOutOfinSmryTbl{false} \def\eq@recordThesePTs{% - \ifx\pointValuesArray\@empty - \edef\ptsValue{\showOutOfinSmryTbl,\eqPTs}\else - \edef\ptsValue{,\eqPTs}\fi - \expandafter\g@addto@macro\expandafter\pointValuesArray - \expandafter{\ptsValue}} + \ifx\pointValuesArray\@empty + \edef\ptsValue{\showOutOfinSmryTbl,\eqPTs}\else + \edef\ptsValue{,\eqPTs}\fi + \expandafter\g@addto@macro\expandafter\pointValuesArray + \expandafter{\ptsValue}} % \end{macrocode} % \changes{v7.7m}{2016/07/04}{Added \string\texttt{ptypeArray} to track problem types better} % \begin{macrocode} \let\ptypeArray\@empty \def\eq@recordProbType{% - \ifx\ptypeArray\@empty - \edef\tmp@exp{\noexpand\g@addto@macro - \noexpand\ptypeArray{null,"\eqQT"}}\else - \edef\tmp@exp{\noexpand\g@addto@macro - \noexpand\ptypeArray{,"\eqQT"}}\fi - \tmp@exp + \ifx\ptypeArray\@empty + \edef\tmp@exp{\noexpand\g@addto@macro + \noexpand\ptypeArray{null,"\eqQT"}}\else + \edef\tmp@exp{\noexpand\g@addto@macro + \noexpand\ptypeArray{,"\eqQT"}}\fi + \tmp@exp } \let\corrAnsArray\@empty \def\eq@recordCorrAns#1{% - \ifx\corrAnsArray\@empty - \edef\tmp@exp{\noexpand\g@addto@macro - \noexpand\corrAnsArray{null,#1}}\else - \edef\tmp@exp{\noexpand\g@addto@macro - \noexpand\corrAnsArray{,#1}}\fi - \tmp@exp + \ifx\corrAnsArray\@empty + \edef\tmp@exp{\noexpand\g@addto@macro + \noexpand\corrAnsArray{null,#1}}\else + \edef\tmp@exp{\noexpand\g@addto@macro + \noexpand\corrAnsArray{,#1}}\fi + \tmp@exp } \def\aeb@answerType@r{r} \def\aeb@answerType@c{c} \newcommand\answers@q{% - \eq@AddProbToQzQuesList - \def\aeb@answerType{r}\setdefault@Ans\eq@recordThesePTs - \eq@recordProbType - \addtocounter{eqpointvalue}{\eqPTs}\stepcounter{questionno}% - \def\aeb@thisType{"mc"}\@ifnextchar[{\answers@@q}% - {\@ifstar{\answers@@q[\curr@quiz.\thequestionno]}{\answers@@q[]}}% + \eq@AddProbToQzQuesList + \def\aeb@answerType{r}\setdefault@Ans\eq@recordThesePTs + \eq@recordProbType + \addtocounter{eqpointvalue}{\eqPTs}\stepcounter{questionno}% + \def\aeb@thisType{"mc"}\@ifnextchar[{\answers@@q}% + {\@ifstar{\answers@@q[\curr@quiz.\thequestionno]}{\answers@@q[]}}% } \def\answers@@q[#1]#2{\global\let\eq@ansChoiceArray\@empty - \xdef\aeb@numCols{#2}\edef\eqtmp{\aPointType}% - \xdef\aPointType{\eqtmp,[\eqPTs,\aeb@thisType]}% - \ifx\q@hwdest\@empty - \xdef\@qzsolndest{#1}\else - \gdef\@qzsolndest{\q@hwdest}\fi - \ifnum\aeb@numCols=1 - \gdef\eq@listType{1}\expandafter\answers@q@list\else - \gdef\eq@listType{0}\expandafter\answers@q@tabular\fi{\aeb@numCols}% + \xdef\aeb@numCols{#2}\edef\eqtmp{\aPointType}% + \xdef\aPointType{\eqtmp,[\eqPTs,\aeb@thisType]}% + \ifx\q@hwdest\@empty + \xdef\@qzsolndest{#1}\else + \gdef\@qzsolndest{\q@hwdest}\fi + \ifnum\aeb@numCols=1 + \gdef\eq@listType{1}\expandafter\answers@q@list\else + \gdef\eq@listType{0}\expandafter\answers@q@tabular\fi{\aeb@numCols}% } % \end{macrocode} % \end{macro} @@ -6372,59 +6473,58 @@ if (isEndQuizPushed("@eqBaseName")){ % #2 = number of columns in the tabular environment %\end{verbatim} % \begin{macrocode} -\newcommand\manswers@q -{% - \eq@AddProbToQzQuesList - \def\aeb@answerType{c}\@setFormLinkType - \global\expandafter\let\expandafter\@Ans - \expandafter=\csname Ans@ck@\@@quiztype\endcsname - \eq@recordThesePTs\eq@recordProbType - \addtocounter{eqpointvalue}{\eqPTs}\stepcounter{questionno}% - \def\aeb@thisType{"ms"}\@ifnextchar[{\answers@@q}% - {\@ifstar{\answers@@q[\curr@quiz.\thequestionno]}{\answers@@q[]}}% +\newcommand\manswers@q{% + \eq@AddProbToQzQuesList + \def\aeb@answerType{c}\@setFormLinkType + \global\expandafter\let\expandafter\@Ans + \expandafter=\csname Ans@ck@\@@quiztype\endcsname + \eq@recordThesePTs\eq@recordProbType + \addtocounter{eqpointvalue}{\eqPTs}\stepcounter{questionno}% + \def\aeb@thisType{"ms"}\@ifnextchar[{\answers@@q}% + {\@ifstar{\answers@@q[\curr@quiz.\thequestionno]}{\answers@@q[]}}% } % \end{macrocode} % \end{macro} % \begin{macrocode} \newenvironment{answers@q@list}[1]{% - \ifx\aeb@answerType\eq@r - \let\endanswers\endanswers@q@list\else - \let\endmanswers\endanswers@q@list\fi - \list{\strut\@Ans}{% - \if\qstar*\relax - \if\aeb@FLOverride\eq@l - \settowidth{\labelwidth}{\eq@lw@l}\else - \settowidth{\labelwidth}{\eq@lw@f}\fi - \else - \if\aeb@FLOverride\eq@f - \settowidth{\labelwidth}{\eq@lw@f}\else - \settowidth{\labelwidth}{\eq@lw@l}\fi - \fi - \setlength{\topsep}{-\parskip+\aboveanswersSkip}% - \setlength{\parsep}{0pt}\setlength{\itemindent}{0pt}% - \setlength{\listparindent}{\parindent}% - \setlength{\leftmargin}{\labelwidth}% - \setlength{\labelsep}{0pt}% - \def\Ans{\Ans@list}% - }% + \ifx\aeb@answerType\eq@r + \let\endanswers\endanswers@q@list\else + \let\endmanswers\endanswers@q@list\fi + \list{\strut\@Ans}{% + \if\qstar*\relax + \if\aeb@FLOverride\eq@l + \settowidth{\labelwidth}{\eq@lw@l}\else + \settowidth{\labelwidth}{\eq@lw@f}\fi + \else + \if\aeb@FLOverride\eq@f + \settowidth{\labelwidth}{\eq@lw@f}\else + \settowidth{\labelwidth}{\eq@lw@l}\fi + \fi + \setlength{\topsep}{-\parskip+\aboveanswersSkip}% + \setlength{\parsep}{0pt}\setlength{\itemindent}{0pt}% + \setlength{\listparindent}{\parindent}% + \setlength{\leftmargin}{\labelwidth}% + \setlength{\labelsep}{0pt}% + \def\Ans{\Ans@list}% + }% }{\endlist\setcounter{quizno}{0}% - \eq@answersEndHook - \setdefault@Ans - \ifx\aeb@answerType\aeb@answerType@r + \eq@answersEndHook + \setdefault@Ans + \ifx\aeb@answerType\aeb@answerType@r % \end{macrocode} % If this is a MC question, we record the author's correct answer % \begin{macrocode} - \eq@recordCorrAns{\eq@ansChoiceArray}\ifwithinMCFI + \eq@recordCorrAns{\eq@ansChoiceArray}\ifwithinMCFI % \end{macrocode} % If within a \cs{bMCFI}/\cs{eMCFI} command pair, we also record % the author's correct answer. % \begin{macrocode} - \eq@recordCorrAns{\s@veCorrAnsMCFI}\fi\else + \eq@recordCorrAns{\s@veCorrAnsMCFI}\fi\else % \end{macrocode} % If this is a MS question, we record the author's correct answer as an array % \begin{macrocode} - \eq@recordCorrAns{[\eq@ansChoiceArray]}\fi - \global\let\eqlimselTo\@empty + \eq@recordCorrAns{[\eq@ansChoiceArray]}\fi + \global\let\eqlimselTo\@empty } % \end{macrocode} % \begin{macrocode} @@ -6433,52 +6533,50 @@ if (isEndQuizPushed("@eqBaseName")){ \qztabsep{1.5pt} \def\qzTabPos#1{\def\qz@TabPos{[#1]}}\qzTabPos{} \def\answers@q@tabular#1{% - \ifinner\else\par\removelastparskip\vspace{\aboveanswersSkip}\fi - \eq@tmpdima=\linewidth - \@tempcnta#1\relax + \ifinner\else\par\removelastparskip\vspace{\aboveanswersSkip}\fi + \eq@tmpdima=\linewidth + \@tempcnta#1\relax % n-1 - \advance\@tempcnta-1\relax + \advance\@tempcnta\m@ne % 2(n-1) - \multiply\@tempcnta by2 - \@tempdima\qz@tabsep\relax + \multiply\@tempcnta\tw@ + \@tempdima\qz@tabsep\relax % 2*(n-1)*\qz@tabsep - \multiply\@tempdima\@tempcnta + \multiply\@tempdima\@tempcnta % \linewidth-(n-1)*\qz@tabsep - \advance\eq@tmpdima-\@tempdima + \advance\eq@tmpdima-\@tempdima % (\linewidth-(n-1)*\qz@tabsep)/n - \divide\eq@tmpdima by#1 -% \begin{macrocode} - \tabcolsep\qz@tabsep\relax - \def\Ans{\Ans@tabular}% - \ifx\aeb@answerType\eq@r - \let\endanswers\endanswers@q@tabular\else - \let\endmanswers\endanswers@q@tabular\fi - \noindent\expandafter - \tabular\qz@TabPos{@{}*{#1}{p{\eq@tmpdima}}@{}}% + \divide\eq@tmpdima by#1 + \tabcolsep\qz@tabsep\relax + \def\Ans{\Ans@tabular}% + \ifx\aeb@answerType\eq@r + \let\endanswers\endanswers@q@tabular\else + \let\endmanswers\endanswers@q@tabular\fi + \noindent\expandafter + \tabular\qz@TabPos{@{}*{#1}{p{\eq@tmpdima}}@{}}% } % \end{macrocode} % \begin{macro}{\endanswers} % Again, we put \verb+\let\endanswers=\endanswers@q+. % \begin{macrocode} -\def\endanswers@q@tabular -{% - \endtabular\setcounter{quizno}{0}% - \eq@answersEndHook - \setdefault@Ans - \ifx\aeb@answerType\aeb@answerType@r +\def\endanswers@q@tabular{% + \endtabular\setcounter{quizno}{0}% + \eq@answersEndHook + \setdefault@Ans + \ifx\aeb@answerType\aeb@answerType@r % \end{macrocode} % If this is a MC question, we record the author's correct answer % \begin{macrocode} - \eq@recordCorrAns{\eq@ansChoiceArray}\ifwithinMCFI + \eq@recordCorrAns{\eq@ansChoiceArray}\ifwithinMCFI % \end{macrocode} % If within the MCFI command pair, we record the author's fill-in as well. % \begin{macrocode} - \eq@recordCorrAns{\s@veCorrAnsMCFI}\fi\else + \eq@recordCorrAns{\s@veCorrAnsMCFI}\fi\else % \end{macrocode} % If this is a MS question, we record the author's correct answer as an array % \begin{macrocode} - \eq@recordCorrAns{[\eq@ansChoiceArray]}\fi - \global\let\eqlimselTo\@empty + \eq@recordCorrAns{[\eq@ansChoiceArray]}\fi + \global\let\eqlimselTo\@empty } % \end{macrocode} % \end{macro} @@ -6489,75 +6587,73 @@ if (isEndQuizPushed("@eqBaseName")){ % \begin{macrocode} \let\qRadionActionsHook\@empty \def\Ans@@l@Actions{\A{\JS{% - this.getField("mc.\curr@quiz.\thequestionno").value - = "\Ans@choice\alph{quizno}";\jsR + this.getField("mc.\curr@quiz.\thequestionno").value\eqSP + =\eqSP"\Ans@choice\alph{quizno}";\jsR RecordPointValue([0,\eqPTs,\eq@pPTs],\thequestionno);\jsR RecordProblemType("\eqQT",\thequestionno);\jsR ProcessQuestion(\Ans@choice,"\alph{quizno}",\thequestionno,% -\arabic{quizno},"\curr@quiz",0,\ifnocorrections0\else1\fi,% -"\bqlabelISO"\if\eqQuizType\isQZ\ifx\eq@online\eq@YES -\ifeq@noquizsolutions\else,1\fi\fi\fi);\qRadionActionsHook}}% + \arabic{quizno},"\curr@quiz",0,\ifnocorrections0\else1\fi,% + "\bqlabelISO"\if\eqQuizType\isQZ\ifx\eq@online\eq@YES + \ifeq@noquizsolutions\else,1\fi\fi\fi);\qRadionActionsHook}}% } -\def\Ans@r@l@Defaults -{% - \BC{}\S{S}\W{1}\Ff{\FfNoToggleToOff}\F{\FPrint} - \textSize{12}\textColor{0 g}\Ff{\FfReadOnly} +\def\Ans@r@l@Defaults{% + \BC{}\S{S}\W{1}\Ff{\FfNoToggleToOff}\F{\FPrint} + \textSize{12}\textColor{0 g}\Ff{\FfReadOnly} } \def\Ans@l{\leavevmode\if\eq@listType1\stepcounter{quizno}% - \else\refstepcounter{quizno}\fi\PBS\raggedright - \settowidth{\eq@tmplength}{\eq@lw@l}\sbox{\eq@tmpbox}{\eq@l@l}% - \hangindent=\eq@tmplength\hangafter=1\relax - \eq@tmpdima=\wd\eq@tmpbox - \def\link@@Content{(\hfil\linkContentFormat\hfil)}% -% begin dps changes 12/19/03 -% \end{macrocode} -% (2013/10/24) Imperative that radio button has no boundary line. -% \begin{macrocode} - \def\late@options{\BC{}}% -\if\Ans@choice1\relax\eq@recordAnsChoice\fi - \makebox[0pt][l]{\radio@@Button{}{mc.\curr@quiz.\thequestionno}% - {\eq@tmpdima}{\RadioFieldSize}{\Ans@choice\alph{quizno}}% - {\eq@protect\A}{\eq@setWidgetProps\eq@l@check@driver}% - {\Ans@r@l@Defaults\every@RadioButton - \every@qRadioButton\late@options}}% -% end dps changes 12/19/03 - \set@@Link{}{}{}% + \else\refstepcounter{quizno}\fi\PBS\raggedright + \settowidth{\eq@tmplength}{\eq@lw@l}\sbox{\eq@tmpbox}{\eq@l@l}% + \hangindent=\eq@tmplength\hangafter=1\relax + \eq@tmpdima=\wd\eq@tmpbox + \def\link@@Content{(\hfil\linkContentFormat\hfil)}% +% \end{macrocode} +% (2013/10/24) Imperative that radio button have no boundary line. +% \begin{macrocode} + \def\late@options{\BC{}}% + \if\Ans@choice\eq@One\relax\eq@recordAnsChoice\fi + \makebox[0pt][l]{\radio@@Button{}{mc.\curr@quiz.\thequestionno}% + {\eq@tmpdima}{\RadioFieldSize}{\Ans@choice\alph{quizno}}% + {\eq@protect\A}{\eq@setWidgetProps\eq@l@check@driver}% + {\Ans@r@l@Defaults\every@RadioButton + \every@qRadioButton\late@options}}% + \set@@Link{}{}{}% {\makebox[\eq@tmpdima]{\color{\@linkcolor}\link@@Content}}% {\eq@protect\A}{\eq@setWidgetProps\setLink@driver}% {\set@LinkTextDefaults\Ans@@l@Actions\every@Link}% - \ifnocorrections\else - \if\Ans@choice1\relax - \edef\Ans@c@l@Choice{\noexpand\DV{Yes}% - \ifx\@qzsolndest\@empty - \noexpand\Ff{\FfReadOnly}% - \else % there is a solution - \ifeq@noquizsolutions - \noexpand\Ff{\FfReadOnly}% - \else - \noexpand\A{\noexpand\quiz@SolutionActionHook}% - \fi - \fi - }% - \else - \def\Ans@c@l@Choice{\Ff{\FfReadOnly}\BC{}}% - \fi - \def\late@options{\BC{}}% - \if\Ans@choice1\relax - \ifx\@qzsolndest\@empty\else - \ifeq@noquizsolutions\else - \edef\late@options{\noexpand\BC{\solution@Color}}% - \fi - \fi + \ifnocorrections\else + \if\Ans@choice\eq@One + \edef\Ans@c@l@Choice{\noexpand\DV{Yes}% + \ifx\@qzsolndest\@empty + \noexpand\Ff{\FfReadOnly}% + \else % there is a solution + \ifeq@noquizsolutions\noexpand + \Ff{\FfReadOnly}% + \else\noexpand + \A{\noexpand\quiz@SolutionActionHook}% + \fi + \fi + }% + \else + \def\Ans@c@l@Choice{\Ff{\FfReadOnly}\BC{}}% + \fi + \def\late@options{\BC{}}% + \if\Ans@choice\eq@One + \ifx\@qzsolndest\@empty\else + \ifeq@noquizsolutions\else + \edef\late@options{\noexpand\BC{\solution@Color}}% + \fi \fi - \makebox[0pt][r]{\check@@Box{}% - {mcq.\curr@quiz.\thequestionno.\arabic{quizno}}% - {\eq@tmpdima}{0pt}{Yes}{}% \@tempdimb - {\eq@setWidgetProps\eq@l@check@driver}% - {\Ans@c@f@Defaults\Ans@c@l@Choice\every@RadioButton - \every@qRadioButton\late@options}}% \fi - \Ans@proofing{\eq@tmpdima}% -\eq@hspanner\ignorespaces} + \makebox[0pt][r]{\check@@Box{}% + {mcq.\curr@quiz.\thequestionno.\arabic{quizno}}% + {\eq@tmpdima}{0pt}{Yes}{}% \@tempdimb + {\eq@setWidgetProps\eq@l@check@driver}% + {\Ans@c@f@Defaults\Ans@c@l@Choice\every@RadioButton + \every@qRadioButton\late@options}}% + \fi + \Ans@proofing{\eq@tmpdima}\eq@hspanner + \ignorespaces +} % \end{macrocode} % \end{macro} % Now for the code to support the \texttt{manswers} environment for link style. @@ -6566,74 +6662,75 @@ if (isEndQuizPushed("@eqBaseName")){ % a checkbox, on top of that a link (that the user interacts with) and on top another check box. % \begin{macrocode} \def\Ans@ck@@l@Actions{\A{\JS{% - var ckfName="mck.\curr@quiz.\thequestionno.\arabic{quizno}";\jsR - var ckf = this.getField(ckfName);\jsR - ckf.checkThisBox(0,!ckf.isBoxChecked(0));\jsR - var _bOK=true;\jsR -\ifx\eqlimselTo\@empty\else _bOK = LimitSelection(\eqlimselTo,% -"mck.\curr@quiz.\thequestionno","\arabic{quizno}");\jsR\fi -if (_bOK) {\jsR\jsT - var aPMSretn=ProcessMultiSelection(\Ans@choice,"\alph{quizno}",% -\thequestionno,\arabic{quizno},"\curr@quiz",\eqPTs,\eq@pPTs);\jsR\jsT - RecordProblemType("\eqQT",\thequestionno);\jsR\jsT - ProcessQuestion(aPMSretn[0],aPMSretn[1],\thequestionno,% -\arabic{quizno},"\curr@quiz",0,\ifnocorrections0\else1\fi,% -"\bqlabelISO"\if\eqQuizType\isQZ\ifx\eq@online\eq@YES -\ifeq@noquizsolutions\else,1\fi\fi\fi);\jsR -} - }} -} -\def\Ans@ck@l@Defaults -{% - \BC{}\S{S}\W{1}\H{N}\Ff{\FfNoToggleToOff} - \textSize{12}\textColor{0 g}\Ff{\FfReadOnly} + var\eqSP ckfName="mck.\curr@quiz.\thequestionno.\arabic{quizno}";\jsR + var\eqSP ckf = this.getField(ckfName);\jsR + ckf.checkThisBox(0,!ckf.isBoxChecked(0));\jsR + var\eqSP _bOK=true;\jsR +\ifx\eqlimselTo\@empty\else + _bOK=LimitSelection(\eqlimselTo,% + "mck.\curr@quiz.\thequestionno","\arabic{quizno}");\jsR +\fi + if(_bOK)\eqSP{\jsR\jsT + var\eqSP aPMSretn=ProcessMultiSelection(\Ans@choice,"\alph{quizno}",% + \thequestionno,\arabic{quizno},"\curr@quiz",% + \eqPTs,\eq@pPTs);\jsR\jsT + RecordProblemType("\eqQT",\thequestionno);\jsR\jsT + ProcessQuestion(aPMSretn[0],aPMSretn[1],\thequestionno,% + \arabic{quizno},"\curr@quiz",0,\ifnocorrections0\else1\fi,% + "\bqlabelISO"\if\eqQuizType\isQZ\ifx\eq@online\eq@YES + \ifeq@noquizsolutions\else,1\fi\fi\fi);\jsR + }}}% } -\def\Ans@ck@l{% - \leavevmode\if\eq@listType1\stepcounter{quizno}% - \else\refstepcounter{quizno}\fi - \if\Ans@choice1\eq@recordAnsChoice\fi\PBS\raggedright - \settowidth{\eq@tmplength}{\eq@lw@l}\sbox{\eq@tmpbox}{\eq@l@l}% - \hangindent=\eq@tmplength\hangafter=1\relax - \eq@tmpdima=\wd\eq@tmpbox - \def\link@@Content{(\hfil\linkContentFormat\hfil)}% -% begin dps changes 12/19/03 - \makebox[0pt][l]{% - \check@@Box{}{mck.\curr@quiz.\thequestionno.\arabic{quizno}}% - {\eq@tmpdima}{\RadioFieldSize}{\Ans@choice\alph{quizno}}% - {\eq@protect\A}{\eq@setWidgetProps\eq@l@check@driver}% - {\Ans@ck@l@Defaults\every@RadioButton - \every@qckCheckbox}}% -% end dps changes 12/19/03 - \set@@Link{}{}{}% +\def\Ans@ck@l@Defaults{% + \BC{}\S{S}\W{1}\H{N}\Ff{\FfNoToggleToOff} + \textSize{12}\textColor{0 g}\Ff{\FfReadOnly} +} +\def\Ans@ck@l{\leavevmode + \if\eq@listType1\stepcounter{quizno}% + \else\refstepcounter{quizno}\fi + \if\Ans@choice\eq@One\eq@recordAnsChoice\fi + \PBS\raggedright + \settowidth{\eq@tmplength}{\eq@lw@l}\sbox{\eq@tmpbox}{\eq@l@l}% + \hangindent\eq@tmplength\hangafter\@ne + \eq@tmpdima\wd\eq@tmpbox + \def\link@@Content{(\hfil\linkContentFormat\hfil)}% + \makebox[0pt][l]{% + \check@@Box{}{mck.\curr@quiz.\thequestionno.\arabic{quizno}}% + {\eq@tmpdima}{\RadioFieldSize}{\Ans@choice\alph{quizno}}% + {\eq@protect\A}{\eq@setWidgetProps\eq@l@check@driver}% + {\Ans@ck@l@Defaults\every@RadioButton + \every@qckCheckbox}}% + \set@@Link{}{}{}% {\makebox[\eq@tmpdima]{\color{\@linkcolor}\link@@Content}}% {\eq@protect\A}{\eq@setWidgetProps\setLink@driver}% {\set@LinkTextDefaults\Ans@ck@@l@Actions\every@Link}% - \ifnocorrections\else - \if\Ans@choice1\relax - \edef\Ans@c@l@Choice{\noexpand\DV{Yes}% - \ifx\@qzsolndest\@empty\noexpand\BC{}% - \noexpand\Ff{\FfReadOnly}% - \else % there is a solution - \ifeq@noquizsolutions - \noexpand\BC{}\noexpand\Ff{\FfReadOnly}% - \else - \noexpand\BC{\solution@Color}% - \noexpand\A{\noexpand\quiz@SolutionActionHook}% - \fi - \fi - }% - \else - \def\Ans@c@l@Choice{\Ff{\FfReadOnly}\BC{}}% + \ifnocorrections\else + \if\Ans@choice\eq@One + \edef\Ans@c@l@Choice{\noexpand\DV{Yes}% + \ifx\@qzsolndest\@empty\noexpand\BC{}% + \noexpand\Ff{\FfReadOnly}% + \else % there is a solution + \ifeq@noquizsolutions + \noexpand\BC{}\noexpand\Ff{\FfReadOnly}% + \else + \noexpand\BC{\solution@Color}% + \noexpand\A{\noexpand\quiz@SolutionActionHook}% + \fi \fi - \makebox[0pt][r]{\check@@Box{}% - {mcq.\curr@quiz.\thequestionno.\arabic{quizno}}% - {\eq@tmpdima}{0pt}{Yes}{}% - {\eq@setWidgetProps\eq@l@check@driver}% - {\Ans@c@f@Defaults\Ans@c@l@Choice\every@RadioButton - \every@qRadioButton}}% + }% + \else + \def\Ans@c@l@Choice{\Ff{\FfReadOnly}\BC{}}% \fi - \Ans@proofing{\eq@tmpdima}% -\eq@hspanner\ignorespaces} + \makebox[0pt][r]{\check@@Box{}% + {mcq.\curr@quiz.\thequestionno.\arabic{quizno}}% + {\eq@tmpdima}{0pt}{Yes}{}% + {\eq@setWidgetProps\eq@l@check@driver}% + {\Ans@c@f@Defaults\Ans@c@l@Choice\every@RadioButton + \every@qRadioButton}}% + \fi + \Ans@proofing{\eq@tmpdima}\eq@hspanner + \ignorespaces +} % \end{macrocode} % \end{macro} % \subsubsection{Form Style} @@ -6642,32 +6739,35 @@ if (_bOK) {\jsR\jsT % here, then goes to |\Ans@f@driver| the rest of the code that depends on the % driver. % \begin{macrocode} -\def\Ans@f{\leavevmode\if\eq@listType1\stepcounter{quizno}% - \else\refstepcounter{quizno}\fi - \PBS\raggedright\Ans@@f} -\def\Ans@r@f@Defaults -{% - \BC{0 0 0}\S{S}\W{1}\Ff{\FfNoToggleToOff} - \F{\FPrint}\textSize{12}\textColor{0 g} +\def\Ans@f{\leavevmode + \if\eq@listType1\stepcounter{quizno}\else + \refstepcounter{quizno}\fi + \PBS\raggedright\Ans@@f} +\def\Ans@r@f@Defaults{% + \BC{0 0 0}\S{S}\W{1}\Ff{\FfNoToggleToOff} + \F{\FPrint}\textSize{12}\textColor{0 g} } +% \end{macrocode} % Action of the radio button field +% \begin{macrocode} \def\Ans@r@f@Actions{\A{\JS{% - RecordPointValue([0,\eqPTs,\eq@pPTs],\thequestionno);\jsR - RecordProblemType("\eqQT",\thequestionno);\jsR - ProcessQuestion(\Ans@choice,"\alph{quizno}",\thequestionno,% - \arabic{quizno},"\curr@quiz",0,\ifnocorrections0\else1\fi,% - "\bqlabelISO"\if\eqQuizType\isQZ\ifx\eq@online\eq@YES - \ifeq@noquizsolutions\else,1\fi\fi\fi);\qRadionActionsHook}} + RecordPointValue([0,\eqPTs,\eq@pPTs],\thequestionno);\jsR + RecordProblemType("\eqQT",\thequestionno);\jsR + ProcessQuestion(\Ans@choice,"\alph{quizno}",\thequestionno,% + \arabic{quizno},"\curr@quiz",0,\ifnocorrections0\else1\fi,% + "\bqlabelISO"\if\eqQuizType\isQZ\ifx\eq@online\eq@YES + \ifeq@noquizsolutions\else,1\fi\fi\fi);\qRadionActionsHook}} } +% \end{macrocode} % Action of the check box underlying the radio button field +% \begin{macrocode} \def\quiz@SolutionActionHook{% - /S/GoTo/D(\@qzsolndest)/Next<<\JS{this.resetForm(% - ["mcq.\curr@quiz.\thequestionno.\arabic{quizno}"]);}>> + /S/GoTo/D(\@qzsolndest)/Next<<\JS{this.resetForm(% + ["mcq.\curr@quiz.\thequestionno.\arabic{quizno}"]);}>> } -\def\Ans@c@f@Defaults -{% - \BC{0 0 0}\S{S}\W{1}\F{\FHidden}\textSize{12} - \textColor{0 g}\symbolchoice{circle} +\def\Ans@c@f@Defaults{% + \BC{0 0 0}\S{S}\W{1}\F{\FHidden}\textSize{12} + \textColor{0 g}\symbolchoice{circle} } % \end{macrocode} % \changes{v6.05d}{2007/04/14} @@ -6687,64 +6787,60 @@ if (_bOK) {\jsR\jsT % \begin{macrocode} \providecommand\graylettersColor{gray} \def\insertGrayLetters{\ifaebshowgrayletters - \rlap{\makebox[\RadioFieldSize]% - {\textcolor{\graylettersColor}{\Alph{quizno}}}}\else\relax\fi} + \rlap{\makebox[\RadioFieldSize]% + {\textcolor{\graylettersColor}{\Alph{quizno}}}}\else\relax\fi} %</package|eqexam> %<*package> -\def\Ans@@f -{% - \settowidth{\eq@tmplength}{\eq@lw@f}% - \hangindent=\eq@tmplength\hangafter=1 - \bottomOfAnsfStack\insertGrayLetters -% dps add - \edef\rbf@Opts{\ifaeb@usecircles\else - \noexpand\symbolchoice{\qz@chksymb}\fi - \noexpand\textColor{\qz@chksymbcol}}% - \if\Ans@choice1\eq@recordAnsChoice\fi - \mbox{\expandafter\radio@@Button\expandafter{\rbf@Opts}% - {mc.\curr@quiz.\thequestionno}% - {\RadioFieldSize}{\RadioFieldSize}{\Ans@choice\alph{quizno}}% - {\eq@protect\A}{\eq@setWidgetProps\eq@Radio@driver}% - {\Ans@r@f@Defaults\Ans@r@f@Actions\every@RadioButton - \every@qRadioButton\insert@circlesymbol}}% - \let\late@options\@empty - \ifnocorrections\else - \if\Ans@choice1\relax - \edef\Ans@c@f@Choice{\noexpand\DV{Yes}% - \ifx\@qzsolndest\@empty\noexpand\Ff{\FfReadOnly}% - \else - \ifeq@noquizsolutions - \noexpand\Ff{\FfReadOnly}% - \else - \noexpand\A{\noexpand\quiz@SolutionActionHook}% - \fi - \fi - }% - \else - \def\Ans@c@f@Choice{\Ff{\FfReadOnly}}% +\def\Ans@@f{% + \settowidth{\eq@tmplength}{\eq@lw@f}% + \hangindent=\eq@tmplength\hangafter=1 + \bottomOfAnsfStack\insertGrayLetters + \edef\rbf@Opts{\ifaeb@usecircles\else + \noexpand\symbolchoice{\qz@chksymb}\fi + \noexpand\textColor{\qz@chksymbcol}}% + \if\Ans@choice\eq@One\eq@recordAnsChoice\fi + \mbox{\expandafter\radio@@Button\expandafter{\rbf@Opts}% + {mc.\curr@quiz.\thequestionno}% + {\RadioFieldSize}{\RadioFieldSize}{\Ans@choice\alph{quizno}}% + {\eq@protect\A}{\eq@setWidgetProps\eq@Radio@driver}% + {\Ans@r@f@Defaults\Ans@r@f@Actions\every@RadioButton + \every@qRadioButton\insert@circlesymbol}}% + \let\late@options\@empty + \ifnocorrections\else + \if\Ans@choice\eq@One + \edef\Ans@c@f@Choice{\noexpand\DV{Yes}% + \ifx\@qzsolndest\@empty\noexpand\Ff{\FfReadOnly}\else + \ifeq@noquizsolutions + \noexpand\Ff{\FfReadOnly}\else + \noexpand\A{\noexpand\quiz@SolutionActionHook}\fi \fi + }% + \else + \def\Ans@c@f@Choice{\Ff{\FfReadOnly}}% + \fi % \end{macrocode} % \changes{v6.7h}{2013/08/19}{When the \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.} % \begin{macrocode} - \ifaeb@usecircles\def\late@options{\BC{}}\fi - \if\Ans@choice1\relax - \ifx\@qzsolndest\@empty\else - \ifeq@noquizsolutions\else - \edef\late@options{\noexpand\BC{\solution@Color}}% - \fi - \fi + \ifaeb@usecircles\def\late@options{\BC{}}\fi + \if\Ans@choice\eq@One + \ifx\@qzsolndest\@empty\else + \ifeq@noquizsolutions\else + \edef\late@options{\noexpand\BC{\solution@Color}}% \fi - \makebox[0pt][r]{\check@@Box{}% - {mcq.\curr@quiz.\thequestionno.\arabic{quizno}}% - {\RadioFieldSize}{\RadioFieldSize}{Yes}{}% - {\eq@setWidgetProps\eq@Check@driver}% - {\Ans@c@f@Defaults\Ans@c@f@Choice\every@CheckBox - \every@qCheckBox\late@options}}% + \fi \fi - \Ans@proofing{\RadioFieldSize}% -\eq@hspanner\ignorespaces} + \makebox[0pt][r]{\check@@Box{}% + {mcq.\curr@quiz.\thequestionno.\arabic{quizno}}% + {\RadioFieldSize}{\RadioFieldSize}{Yes}{}% + {\eq@setWidgetProps\eq@Check@driver}% + {\Ans@c@f@Defaults\Ans@c@f@Choice\every@CheckBox + \every@qCheckBox\late@options}}% + \fi + \Ans@proofing{\RadioFieldSize}\eq@hspanner + \ignorespaces +} % \end{macrocode} % \DescribeMacro{\limitSelectionTo} limits the selection to the number specified % by its argument for multiple selection questions. @@ -6755,108 +6851,108 @@ if (_bOK) {\jsR\jsT % \begin{macro}{\Ans@ck@f} % The support for multiple selection answers within the \texttt{manswers} environment. % \begin{macrocode} -\def\Ans@ck@f{\leavevmode\if\eq@listType1\stepcounter{quizno}% - \else\refstepcounter{quizno}\fi - \if\Ans@choice1\eq@recordAnsChoice\fi - \PBS\raggedright\Ans@@ck@f} -\def\Ans@ck@f@Defaults -{% - \BC{0 0 0}\S{S}\W{1}\Ff{\FfNoToggleToOff} - \textSize{12}\textColor{0 g} +\def\Ans@ck@f{\leavevmode + \if\eq@listType1\stepcounter{quizno}% + \else\refstepcounter{quizno}\fi + \if\Ans@choice\eq@One\eq@recordAnsChoice\fi + \PBS\raggedright\Ans@@ck@f} +\def\Ans@ck@f@Defaults{% + \BC{0 0 0}\S{S}\W{1}\Ff{\FfNoToggleToOff} + \textSize{12}\textColor{0 g} } +% \end{macrocode} % Action of the radio button field -\def\Ans@ck@f@Actions -{% - \A{\JS{% +% \begin{macrocode} +\def\Ans@ck@f@Actions{% + \A{\JS{% % \end{macrocode} % Here is limit the number of selections. If \cs{eqlimselTo} is nonempty, % we call \texttt{LimitSelection()} to count the number of checks in this % current field. If too many, we uncheck the current effort and inform the % user. % \begin{macrocode} - var _bOK=true;\jsR -\ifx\eqlimselTo\@empty\else _bOK = LimitSelection(\eqlimselTo,% -"mck.\curr@quiz.\thequestionno","\arabic{quizno}");\jsR\fi + var\eqSP_bOK=true;\jsR +\ifx\eqlimselTo\@empty\else + _bOK\eqSP=\eqSP LimitSelection(\eqlimselTo,% + "mck.\curr@quiz.\thequestionno","\arabic{quizno}");\jsR\fi % \end{macrocode} % As a result of the previous changes, we make this a condition: % if the JavaScript function \texttt{LimitSelection()} returns false, we do not execute. The default % value is \texttt{\_bOK=true}. % \begin{macrocode} -if (_bOK) {\jsR\jsT - var aPMSretn=ProcessMultiSelection(\Ans@choice,"\alph{quizno}",% -\thequestionno,\arabic{quizno},"\curr@quiz",\eqPTs,\eq@pPTs);\jsR\jsT - RecordProblemType("\eqQT",\thequestionno);\jsR\jsT - ProcessQuestion(aPMSretn[0],aPMSretn[1],\thequestionno,% -\arabic{quizno},"\curr@quiz",0,\ifnocorrections0\else1\fi,% -"\bqlabelISO"\if\eqQuizType\isQZ\ifx\eq@online\eq@YES -\ifeq@noquizsolutions\else,1\fi\fi\fi);\jsR -}}}% + if(_bOK)\eqSP{\jsR\jsT + var aPMSretn=ProcessMultiSelection(\Ans@choice,"\alph{quizno}",% + \thequestionno,\arabic{quizno},"\curr@quiz",% + \eqPTs,\eq@pPTs);\jsR\jsT + RecordProblemType("\eqQT",\thequestionno);\jsR\jsT + ProcessQuestion(aPMSretn[0],aPMSretn[1],\thequestionno,% + \arabic{quizno},"\curr@quiz",0,\ifnocorrections0\else1\fi,% + "\bqlabelISO"\if\eqQuizType\isQZ\ifx\eq@online\eq@YES + \ifeq@noquizsolutions\else,1\fi\fi\fi);\jsR + }}}% } +% \end{macrocode} % Action of the check box underlying the radio button field -\def\quiz@SolutionActionHook{% - /S/GoTo/D(\@qzsolndest)/Next<<\JS{this.resetForm(% -["mcq.\curr@quiz.\thequestionno.\arabic{quizno}"]);}>> +% \begin{macrocode} +\def\quiz@SolutionActionHook{/S/GoTo/D(\@qzsolndest)% + /Next<<\JS{this.resetForm([% + "mcq.\curr@quiz.\thequestionno.\arabic{quizno}"]);}>> } % \end{macrocode} % \cs{Ans@@ck@f} is the definition of the \cs{Ans} command within the % \texttt{manswers} environment. % \begin{macrocode} -\def\Ans@@ck@f -{% - \settowidth{\eq@tmplength}{\eq@lw@f}% - \hangindent=\eq@tmplength\hangafter=1 - \bottomOfAnsfStack\insertGrayLetters +\def\Ans@@ck@f{% + \settowidth{\eq@tmplength}{\eq@lw@f}% + \hangindent\eq@tmplength\hangafter\@ne + \bottomOfAnsfStack\insertGrayLetters % \end{macrocode} % The bottom most checkbox % \begin{macrocode} - \bottomOfAnsfStack\insertGrayLetters -% dps add -\def\cbf@Opts{\symbolchoice{\qz@chksymb}% + \bottomOfAnsfStack\insertGrayLetters + \def\cbf@Opts{\symbolchoice{\qz@chksymb}% \textColor{\qz@chksymbcol}}% - \mbox{\expandafter\check@@Box\expandafter{\cbf@Opts}% - {mck.\curr@quiz.\thequestionno.\arabic{quizno}}% - {\RadioFieldSize}{\RadioFieldSize}{\Ans@choice\alph{quizno}}% - {\eq@protect\A}{\eq@setWidgetProps\eq@Check@driver}% - {\Ans@ck@f@Defaults\Ans@ck@f@Actions\every@RadioButton - \every@qckCheckbox}}% - \ifnocorrections\else - \if\Ans@choice1\relax - \edef\Ans@c@f@Choice{\noexpand\DV{Yes}% - \ifx\@qzsolndest\@empty\noexpand\Ff{\FfReadOnly}% - \else - \ifeq@noquizsolutions - \noexpand\Ff{\FfReadOnly}% - \else - \noexpand\A{\noexpand\quiz@SolutionActionHook}% - \fi - \fi - }% - \else - \def\Ans@c@f@Choice{\Ff{\FfReadOnly}}% - \fi - \let\late@options\@empty - \if\Ans@choice1\relax - \ifx\@qzsolndest\@empty\else - \ifeq@noquizsolutions\else - \edef\late@options{\noexpand\BC{\solution@Color}}% - \fi - \fi + \mbox{\expandafter\check@@Box\expandafter{\cbf@Opts}% + {mck.\curr@quiz.\thequestionno.\arabic{quizno}}% + {\RadioFieldSize}{\RadioFieldSize}{\Ans@choice\alph{quizno}}% + {\eq@protect\A}{\eq@setWidgetProps\eq@Check@driver}% + {\Ans@ck@f@Defaults\Ans@ck@f@Actions\every@RadioButton + \every@qckCheckbox}}% + \ifnocorrections\else + \if\Ans@choice\eq@One + \edef\Ans@c@f@Choice{\noexpand\DV{Yes}% + \ifx\@qzsolndest\@empty\noexpand\Ff{\FfReadOnly}\else + \ifeq@noquizsolutions + \noexpand\Ff{\FfReadOnly}\else + \noexpand\A{\noexpand\quiz@SolutionActionHook}\fi \fi + }% + \else + \def\Ans@c@f@Choice{\Ff{\FfReadOnly}}% + \fi + \let\late@options\@empty + \if\Ans@choice\eq@One + \ifx\@qzsolndest\@empty\else + \ifeq@noquizsolutions\else + \edef\late@options{\noexpand\BC{\solution@Color}}\fi + \fi + \fi % \end{macrocode} % The top most checkbox % \begin{macrocode} - \makebox[0pt][r]{\check@@Box{}% - {mcq.\curr@quiz.\thequestionno.\arabic{quizno}}% - {\RadioFieldSize}{\RadioFieldSize}{Yes}{}% - {\eq@setWidgetProps\eq@Check@driver}% - {\Ans@c@f@Defaults\Ans@c@f@Choice\every@CheckBox + \makebox[0pt][r]{\check@@Box{}% + {mcq.\curr@quiz.\thequestionno.\arabic{quizno}}% + {\RadioFieldSize}{\RadioFieldSize}{Yes}{}% + {\eq@setWidgetProps\eq@Check@driver}% + {\Ans@c@f@Defaults\Ans@c@f@Choice\every@CheckBox % \end{macrocode} % (2012/12/22) Replace \cs{every@qRadioButton} with \cs{every@qCheckBox}. % \begin{macrocode} - \every@qCheckBox\late@options}}% - \fi - \Ans@proofing{\RadioFieldSize}% -\eq@hspanner\ignorespaces} + \every@qCheckBox\late@options}}% + \fi + \Ans@proofing{\RadioFieldSize}\eq@hspanner + \ignorespaces +} % \end{macrocode} % \end{macro} % \begin{macrocode} @@ -6914,9 +7010,9 @@ if (_bOK) {\jsR\jsT % \begin{macrocode} \define@key{bchoice}{nCols}{\def\bChoiceNumCols{#1}} \@for\eqi:=1,2,3,4,5,6,7,8,9,10 \do{\edef\temp@expand@def{% - \noexpand\define@key{bchoice}{\eqi}[\eqi]{% - \noexpand\def\noexpand\bChoiceNumCols{\eqi}}% - }\temp@expand@def + \noexpand\define@key{bchoice}{\eqi}[\eqi]{% + \noexpand\def\noexpand\bChoiceNumCols{\eqi}}% + }\temp@expand@def } % \end{macrocode} % The number of columns specified in the answers environment is saved as the value @@ -6927,8 +7023,8 @@ if (_bOK) {\jsR\jsT % This is the definition of the random key\IndexKey{random}, a boolean. % \begin{macrocode} \define@key{bchoice}{random}[true]{% - \csname if#1\endcsname\eq@randomizeChoicestrue - \else\eq@randomizeChoicesfalse\fi + \csname if#1\endcsname\eq@randomizeChoicestrue + \else\eq@randomizeChoicesfalse\fi } % \end{macrocode} % \changes{v6.3x}{2011/04/05}{% @@ -6949,20 +7045,19 @@ if (_bOK) {\jsR\jsT % \end{macrocode} % If \cs{numCols} is $1$, we use a list environment, otherwise, a tabular is used. % \begin{macrocode} -\def\@ansChoices[#1]% -{% +\def\@ansChoices[#1]{% % \end{macrocode} % We initialize some variables that the new label option uses. % \begin{macrocode} - \global\let\@tempholdSaveAns\@empty %4/5 - \global\let\@tempholdSaveChoice\@empty %4/5 - \global\let\bChoiceLabel\@empty %4/5 - \setkeys{bchoice}{#1}% - \global\eq@tabColCnt=0 - \ifnum\aeb@numCols=1 % list mode - \def\eq@next{\@layoutListAns}\else % tabular mode - \def\eq@next{\@layoutTabularAns{\bChoiceNumCols}}\fi - \eq@next + \global\let\@tempholdSaveAns\@empty %4/5 + \global\let\@tempholdSaveChoice\@empty %4/5 + \global\let\bChoiceLabel\@empty %4/5 + \setkeys{bchoice}{#1}% + \global\eq@tabColCnt=\z@ + \ifnum\aeb@numCols=\@ne % list mode + \def\eq@next{\@layoutListAns}\else % tabular mode + \def\eq@next{\@layoutTabularAns{\bChoiceNumCols}}\fi + \eq@next } \let\eChoices\relax % \end{macrocode} @@ -6973,7 +7068,7 @@ if (_bOK) {\jsR\jsT % should be \cs{eChoices}.) % \begin{macrocode} \def\@layoutListAns{\@ifnextchar\Ans{\@getListAns}% - {\@lookforendansChoices{\@layoutListAns}}% + {\@lookforendansChoices{\@layoutListAns}}% } % \end{macrocode} % \changes{v6.3x}{2011/04/05}{% @@ -6989,11 +7084,11 @@ if (_bOK) {\jsR\jsT % to \cs{@@@SaveAns}; otherwise, it gobbles all leftovers. % \begin{macrocode} \newcommand{\eq@saveAns}[2][]{% - \let\eq@next\@@@SaveAnsGobbleAns - \ifx\bChoiceLabel\@empty\else - \def\eq@savedAnsOpt{#1}\def\eq@savedAnsZO{#2}% - \if\eq@savedAnsZO1 \let\eq@next\@@@SaveAns\fi - \fi\eq@next + \let\eq@next\@@@SaveAnsGobbleAns + \ifx\bChoiceLabel\@empty\else + \def\eq@savedAnsOpt{#1}\def\eq@savedAnsZO{#2}% + \if\eq@savedAnsZO1\let\eq@next\@@@SaveAns\fi + \fi\eq@next } % \end{macrocode} % \cs{@@@SaveAns} collects the answer to the problem, and placed @@ -7001,21 +7096,21 @@ if (_bOK) {\jsR\jsT % the alternative letter as well in \cs{@tempholdSaveChoice}. % \begin{macrocode} \long\def\@@@SaveAns#1\eAns{% 4/5 - \g@addto@macro\@tempholdSaveAns{\\{\ignorespaces#1}}% + \g@addto@macro\@tempholdSaveAns{\\{\ignorespaces#1}}% % \end{macrocode} % This code is expanded before the \cs{Ans} command is, so we'll simulate % incrementing the \texttt{quizno} counter, \dots % \begin{macrocode} - \addtocounter{quizno}{1}% - \edef\temp@expand{\noexpand\g@addto@macro\noexpand + \addtocounter{quizno}{1}% + \edef\temp@expand{\noexpand\g@addto@macro\noexpand \@tempholdSaveChoice{% - \noexpand\\{\ifx\sqstar\@empty\aebChoiceAltFmt\else - \ifaebshowgrayletters\Alph{quizno}\else - \linkContentFormat\fi\fi}}}\temp@expand + \noexpand\\{\ifx\sqstar\@empty\aebChoiceAltFmt\else + \ifaebshowgrayletters\Alph{quizno}\else + \linkContentFormat\fi\fi}}}\temp@expand % \end{macrocode} % and decrement when we are finished adding to the token list. % \begin{macrocode} - \addtocounter{quizno}{-1}% + \addtocounter{quizno}{-1}% } % \end{macrocode} % \cs{eq@displayAns} is \cs{let} to \verb!\\!. Definition and name may change. @@ -7035,29 +7130,30 @@ if (_bOK) {\jsR\jsT \def\oxfordCommaOn{\oxfordcommatrue} \def\oxfordCommaOff{\oxfordcommafalse} \def\eq@insertComma{% - \ifx\eq@comma\@empty - \ifnum\@nameuse{NumAns\eq@namearg}>2\relax - \def\eq@comma{,}\fi - \else\ifx\eq@insertAnd\@empty\eq@comma\space - \else\ifnum\@tempcnta=\@nameuse{NumAns\eq@namearg}% - \ifoxfordcomma\eq@comma\fi\else\eq@comma\fi\space - \fi + \ifx\eq@comma\@empty + \ifnum\@nameuse{NumAns\eq@namearg}>\tw@ + \def\eq@comma{,}\fi + \else\ifx\eq@insertAnd\@empty\eq@comma\space + \else\ifnum\@tempcnta=\@nameuse{NumAns\eq@namearg}% + \ifoxfordcomma\eq@comma\fi\else\eq@comma\fi\space \fi + \fi } \newcommand\eqAnd{and}\def\eq@insertAnd{% - \ifnum\@nameuse{NumAns\eq@namearg}<2\relax\else - \ifnum\@nameuse{NumAns\eq@namearg}>2\relax - \else\leavevmode\space\fi\eqAnd\space\fi} -\long\def\eq@displayAns#1{\advance\@tempcnta1\relax - \eq@insertComma - \ifnum\@tempcnta=\@nameuse{NumAns\eq@namearg}\eq@insertAnd\fi#1} + \ifnum\@nameuse{NumAns\eq@namearg}<\tw@\else + \ifnum\@nameuse{NumAns\eq@namearg}>\tw@\relax + \else\leavevmode\space\fi\eqAnd\space\fi +} +\long\def\eq@displayAns#1{\advance\@tempcnta\@ne + \eq@insertComma + \ifnum\@tempcnta=\@nameuse{NumAns\eq@namearg}\eq@insertAnd\fi#1} \def\eq@displayAlts#1{\advance\@tempcnta1 - \eq@insertComma - \ifnum\@tempcnta=\@nameuse{NumAns\eq@namearg}\eq@insertAnd\fi - \savedAltFmt{#1}} + \eq@insertComma + \ifnum\@tempcnta=\@nameuse{NumAns\eq@namearg}\eq@insertAnd\fi + \savedAltFmt{#1}} \def\eq@displayAltsAns#1{\advance\@tempcnta1\relax - \eq@insertComma - \ifnum\@tempcnta=\@nameuse{NumAns\eq@namearg}\eq@insertAnd\fi#1} + \eq@insertComma + \ifnum\@tempcnta=\@nameuse{NumAns\eq@namearg}\eq@insertAnd\fi#1} % \end{macrocode} % \begin{macro}{\useSavedAns} % \begin{macro}{\useSavedAlts} @@ -7073,35 +7169,35 @@ if (_bOK) {\jsR\jsT % \begin{macrocode} \newcommand{\savedAltFmt}[1]{(#1)} \newcommand{\useSavedAns}{\bgroup\@ifstar{\useSavedAns@i} - {\let\eq@insertAnd\@empty\useSavedAns@i}} + {\let\eq@insertAnd\@empty\useSavedAns@i}} \newcommand{\useSavedAns@i}[2][]{\@tempcnta=0\relax - \def\eq@namearg{#2}\let\label\@gobble - \def\eq@argi{#1}\ifx\eq@argi\@empty - \let\eq@comma\@empty - \let\\\eq@displayAns\@nameuse{SavedAns#2}\else - \@nameuse{SavedAns#2-Idx#1}\fi - \egroup + \def\eq@namearg{#2}\let\label\@gobble + \def\eq@argi{#1}\ifx\eq@argi\@empty + \let\eq@comma\@empty + \let\\\eq@displayAns\@nameuse{SavedAns#2}\else + \@nameuse{SavedAns#2-Idx#1}\fi + \egroup } \newcommand{\useSavedAlts}{\bgroup\@ifstar{\useSavedAlts@i} - {\let\eq@insertAnd\@empty\useSavedAlts@i}} + {\let\eq@insertAnd\@empty\useSavedAlts@i}} \newcommand{\useSavedAlts@i}[2][]{\@tempcnta=0\relax - \def\eq@namearg{#2}\@nameuse{caseFor#2}% - \def\eq@argi{#1}\ifx\eq@argi\@empty - \let\eq@comma\@empty - \let\\\eq@displayAlts\@nameuse{SavedAlts#2}\else - \savedAltFmt{\@nameuse{SavedAlts#2-Idx#1}}\fi - \egroup + \def\eq@namearg{#2}\@nameuse{caseFor#2}% + \def\eq@argi{#1}\ifx\eq@argi\@empty + \let\eq@comma\@empty + \let\\\eq@displayAlts\@nameuse{SavedAlts#2}\else + \savedAltFmt{\@nameuse{SavedAlts#2-Idx#1}}\fi + \egroup } \newcommand{\useSavedAltsAns}{\bgroup\@ifstar{\useSavedAltsAns@i} - {\let\eq@insertAnd\@empty\useSavedAltsAns@i}} + {\let\eq@insertAnd\@empty\useSavedAltsAns@i}} \newcommand{\useSavedAltsAns@i}[2][]{\@tempcnta=0\relax - \def\eq@namearg{#2}\@nameuse{caseFor#2}\let\label\@gobble - \def\eq@argi{#1}\ifx\eq@argi\@empty - \let\eq@comma\@empty - \let\\\eq@displayAltsAns\@nameuse{SavedAltsAns#2}\else - \savedAltFmt{\@nameuse{SavedAlts#2-Idx#1}} - \@nameuse{SavedAns#2-Idx#1}\fi - \egroup + \def\eq@namearg{#2}\@nameuse{caseFor#2}\let\label\@gobble + \def\eq@argi{#1}\ifx\eq@argi\@empty + \let\eq@comma\@empty + \let\\\eq@displayAltsAns\@nameuse{SavedAltsAns#2}\else + \savedAltFmt{\@nameuse{SavedAlts#2-Idx#1}} + \@nameuse{SavedAns#2-Idx#1}\fi + \egroup } \newcommand{\useSavedNumAns}[1]{\@nameuse{NumAns#1}} % \end{macrocode} @@ -7110,21 +7206,21 @@ if (_bOK) {\jsR\jsT % \end{macro} % \end{macro} % \begin{macrocode} -\long\def\@@@SaveAnsGobbleAns#1\eAns{} % 4/5 +\long\def\@@@SaveAnsGobbleAns#1\eAns{} % \end{macrocode} % This command gets, and sets the list of alternatives % \begin{macrocode} -\long\def\@getListAns\Ans#1\eAns{%\@@par %start new paragraph +\long\def\@getListAns\Ans#1\eAns{%\@@par % \end{macrocode} % We record the list as we process each item. % \begin{macrocode} - \eq@saveAns#1\eAns % 4/5 - \Ans#1\vspace{\@rowskip}% - \@layoutListAns + \eq@saveAns#1\eAns + \Ans#1\vspace{\@rowskip}% + \@layoutListAns } \long\def\@lookforendansChoices#1{% - \@ifnextchar\eChoices{\rowsep{\rowsep@default}% - \expandafter\@findendans\@gobble}{\expandafter#1\@gobble}% + \@ifnextchar\eChoices{\rowsep{\rowsep@default}% + \expandafter\@findendans\@gobble}{\expandafter#1\@gobble}% } % \end{macrocode} % The argument is the number of columns to typeset, this number @@ -7132,10 +7228,10 @@ if (_bOK) {\jsR\jsT % environment. % \begin{macrocode} \def\@layoutTabularAns#1{% - \let\eq@tabSep\@empty - \xdef\numShortCols{#1}% - \ifnum#1>\aeb@numCols \xdef\numShortCols{\aeb@numCols}\fi - \@@layoutTabularAns + \let\eq@tabSep\@empty + \xdef\numShortCols{#1}% + \ifnum#1>\aeb@numCols \xdef\numShortCols{\aeb@numCols}\fi + \@@layoutTabularAns } % \end{macrocode} % If the next token is \cs{Ans} we grab its all stuff between @@ -7145,98 +7241,99 @@ if (_bOK) {\jsR\jsT % should be \cs{eChoices}.) % \begin{macrocode} \def\@@layoutTabularAns{% - \@ifnextchar\Ans{\@getTabAns}% - {\@lookforendansChoices{\@@layoutTabularAns}}% + \@ifnextchar\Ans{\@getTabAns}% + {\@lookforendansChoices{\@@layoutTabularAns}}% } \def\rowsep#1{\gdef\@rowsep{[#1]}\gdef\@rowskip{#1}}% \rowsep{\rowsep@default} \def\rowsepDefault#1{\def\rowsep@default{#1}} \def\rowsep@default{0pt} \long\def\@getTabAns\Ans#1\eAns{% - \eq@saveAns#1\eAns - \global\advance\eq@tabColCnt1 - \let\@save@tabSep=\eq@tabSep - \ifnum\eq@tabColCnt=\numShortCols - \global\eq@tabColCnt=0 - \xdef\eq@tabSep{\noexpand\\\noalign{\kern\@rowskip\relax}}% - \else - \gdef\eq@tabSep{&}% - \fi - \@ifnextchar\eChoices{\@save@tabSep\Ans#1\rowsep{\rowsep@default} - \expandafter\@findendans\@gobble}% - {\@save@tabSep\Ans#1\@@layoutTabularAns}% + \eq@saveAns#1\eAns + \global\advance\eq@tabColCnt1 + \let\@save@tabSep=\eq@tabSep + \ifnum\eq@tabColCnt=\numShortCols + \global\eq@tabColCnt=0 + \xdef\eq@tabSep{\noexpand\\\noalign{\kern\@rowskip\relax}}% + \else + \gdef\eq@tabSep{&}% + \fi + \@ifnextchar\eChoices{\@save@tabSep\Ans#1\rowsep{\rowsep@default} + \expandafter\@findendans\@gobble}% + {\@save@tabSep\Ans#1\@@layoutTabularAns}% } % \end{macrocode} % This command, I think, is executed after we've found the \cs{eChoices}. % \begin{macrocode} -\def\@findendans{\@ifnextchar\end{% 4/5 +\def\@findendans{\@ifnextchar\end{% % \end{macrocode} % If there is a \cs{bChoiceLabel} we process the alternatives. % \begin{macrocode} - \ifx\bChoiceLabel\@empty\else - \processLabeledAns\fi - }{\expandafter\@findendans\@gobble}}% + \ifx\bChoiceLabel\@empty\else + \processLabeledAns\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 % a nasty bug. Reported by Christopher C.} % \begin{macrocode} \def\defineEachAns#1{\advance\eqtmpcnta\@ne - \@temptokena={#1}\csarg\xdef - {SavedAns\bChoiceLabel-Idx\the\eqtmpcnta}{\the\@temptokena}% - \ifsolutionsonly\else - {\let\\\relax\eq@IWDefs{\string - \csarg\string\gdef{SavedAns\bChoiceLabel-Idx\the\eqtmpcnta}% - {\the\@temptokena}}}\fi + \@temptokena={#1}\csarg\xdef + {SavedAns\bChoiceLabel-Idx\the\eqtmpcnta}{\the\@temptokena}% + \ifsolutionsonly\else + {\let\\\relax\eq@IWDefs{\string + \csarg\string\gdef{SavedAns\bChoiceLabel-Idx\the\eqtmpcnta}% + {\the\@temptokena}}}% + \fi } \def\defineEachChoice#1{\advance\eqtmpcnta\@ne - \@temptokena={#1}\csarg\xdef - {SavedAlts\bChoiceLabel-Idx\the\eqtmpcnta}% - {\the\@temptokena}\ifsolutionsonly\else - {\let\\\relax\eq@IWDefs{\string - \csarg\string - \gdef{SavedAlts\bChoiceLabel-Idx\the\eqtmpcnta}% - {\the\@temptokena}}}\fi + \@temptokena={#1}\csarg\xdef + {SavedAlts\bChoiceLabel-Idx\the\eqtmpcnta}% + {\the\@temptokena}\ifsolutionsonly\else + {\let\\\relax\eq@IWDefs{\string + \csarg\string + \gdef{SavedAlts\bChoiceLabel-Idx\the\eqtmpcnta}% + {\the\@temptokena}}}\fi } \def\processLabeledAns{% - \bgroup - \let\label\@gobble + \bgroup + \let\label\@gobble % \end{macrocode} % \changes{v7.7c}{2015/10/08}{Added memory for the case} % \begin{macrocode} -\if\aeb@FLOverride\eq@l - \global\@namedef{caseFor\bChoiceLabel}{\graylettersOff}\else - \ifaebshowgrayletters + \if\aeb@FLOverride\eq@l + \global\@namedef{caseFor\bChoiceLabel}{\graylettersOff}\else + \ifaebshowgrayletters \global\@namedef{caseFor\bChoiceLabel}{\graylettersOn}\else \global\@namedef{caseFor\bChoiceLabel}{\graylettersOff}\fi -\fi - \toks@=\expandafter{\@tempholdSaveAns}\csarg - \xdef{SavedAns\bChoiceLabel}{\the\toks@}% - \ifsolutionsonly\else{\let\\\relax\eq@IWDefs{\string - \csarg\string\gdef{SavedAns\bChoiceLabel}{\the\toks@}}}\fi - \eqtmpcnta\z@\let\\\defineEachAns\the\toks@ - \xdef\@currNCntAns{\the\eqtmpcnta}\csarg - \xdef{NumAns\bChoiceLabel}{\@currNCntAns}% - \ifsolutionsonly\else{\eq@IWDefs{\string - \csarg\string\gdef{NumAns\bChoiceLabel}{\the\eqtmpcnta}}}\fi - \toks@=\expandafter{\@tempholdSaveChoice}\csarg - \xdef{SavedAlts\bChoiceLabel}{\the\toks@}% - \ifsolutionsonly\else{\let\\\relax\eq@IWDefs{\string - \csarg\string\gdef{SavedAlts\bChoiceLabel}{\the\toks@}}}\fi - \eqtmpcnta\z@\relax\let\\\defineEachChoice\the\toks@ - \eqtmpcnta\@ne\toks@={}%{\ignorespaces\@gobble}% - \loop - \edef\temp@exp{\the\toks@\noexpand\\{% - \noexpand\useSavedAlts[\the\eqtmpcnta]{\bChoiceLabel} - \noexpand\useSavedAns[\the\eqtmpcnta]{\bChoiceLabel}}}% - \toks@=\expandafter{\temp@exp}% - \ifnum\eqtmpcnta<\@currNCntAns\relax - \advance\eqtmpcnta\@ne - \repeat - \csarg\xdef{SavedAltsAns\bChoiceLabel}{\the\toks@}% - \ifsolutionsonly\else{\let\\\relax\eq@IWDefs{\string - \csarg\string\gdef{SavedAltsAns\bChoiceLabel}{\the\toks@}}}\fi - \egroup + \fi + \toks@=\expandafter{\@tempholdSaveAns}\csarg + \xdef{SavedAns\bChoiceLabel}{\the\toks@}% + \ifsolutionsonly\else{\let\\\relax\eq@IWDefs{\string + \csarg\string\gdef{SavedAns\bChoiceLabel}{\the\toks@}}}\fi + \eqtmpcnta\z@\let\\\defineEachAns\the\toks@ + \xdef\@currNCntAns{\the\eqtmpcnta}\csarg + \xdef{NumAns\bChoiceLabel}{\@currNCntAns}% + \ifsolutionsonly\else{\eq@IWDefs{\string + \csarg\string\gdef{NumAns\bChoiceLabel}{\the\eqtmpcnta}}}\fi + \toks@=\expandafter{\@tempholdSaveChoice}\csarg + \xdef{SavedAlts\bChoiceLabel}{\the\toks@}% + \ifsolutionsonly\else{\let\\\relax\eq@IWDefs{\string + \csarg\string\gdef{SavedAlts\bChoiceLabel}{\the\toks@}}}\fi + \eqtmpcnta\z@\relax\let\\\defineEachChoice\the\toks@ + \eqtmpcnta\@ne\toks@={}%{\ignorespaces\@gobble}% + \loop + \edef\temp@exp{\the\toks@\noexpand\\{% + \noexpand\useSavedAlts[\the\eqtmpcnta]{\bChoiceLabel} + \noexpand\useSavedAns[\the\eqtmpcnta]{\bChoiceLabel}}}% + \toks@=\expandafter{\temp@exp}% + \ifnum\eqtmpcnta<\@currNCntAns\relax + \advance\eqtmpcnta\@ne + \repeat + \csarg\xdef{SavedAltsAns\bChoiceLabel}{\the\toks@}% + \ifsolutionsonly\else{\let\\\relax\eq@IWDefs{\string + \csarg\string\gdef{SavedAltsAns\bChoiceLabel}{\the\toks@}}}\fi + \egroup } % \end{macrocode} % \end{macro} @@ -7264,7 +7361,7 @@ if (_bOK) {\jsR\jsT % We redefine \cs{nextrandom} from \texttt{random.tex} to save the initializing seed. % \begin{macrocode} \def\nextrandom{\begingroup - \ifnum\randomi<\@ne % then initialize with time + \ifnum\randomi<\@ne % then initialize with time \global\randomi\time \global\multiply\randomi388 \global\advance\randomi\year \global\multiply\randomi31 \global\advance\randomi\day @@ -7276,16 +7373,16 @@ if (_bOK) {\jsR\jsT % \changes{v6.7f}{2013/08/03}{Save the initial seed value to \cs{eqInitSeedValue}.} % \begin{macrocode} \xdef\InitSeedValue{\the\randomi}% - \fi - \count@ii\randomi - \divide\count@ii 127773 % modulus = multiplier * 127773 + 2836 - \count@\count@ii - \multiply\count@ii 127773 - \global\advance\randomi-\count@ii % random mod 127773 - \global\multiply\randomi 16807 - \multiply\count@ 2836 - \global\advance\randomi-\count@ - \ifnum\randomi<\z@ \global\advance\randomi 2147483647\relax\fi + \fi + \count@ii\randomi + \divide\count@ii 127773 % modulus = multiplier * 127773 + 2836 + \count@\count@ii + \multiply\count@ii 127773 + \global\advance\randomi-\count@ii % random mod 127773 + \global\multiply\randomi 16807 + \multiply\count@ 2836 + \global\advance\randomi-\count@ + \ifnum\randomi<\z@\global\advance\randomi 2147483647\relax\fi \endgroup } % \end{macrocode} @@ -7311,29 +7408,31 @@ if (_bOK) {\jsR\jsT % Added support for randomizing the multiple choices, requires the use of \cs{bChoices} % and \cs{eChoices}. % } -% \begin{macrocode} -\def\@ansChoices[#1]% -{% - \global\let\@tempholdSaveAns\@empty % 5/24 - \global\let\@tempholdSaveChoice\@empty % 5/24 - \global\let\bChoiceLabel\@empty % 5/24 - \ifeq@randomizeallChoices - \setkeys{bchoice}{#1,random=true}\else - \setkeys{bchoice}{#1}\fi - \global\eq@tabColCnt=0 - \ifeq@randomizeChoices\expandafter\@@bChoices - \else\expandafter\@@ansChoices\fi +% \changes{v8.6.2}{2021/01/20}{Incorporated \string\cs{if@DoNotRandomize} +% into the \string\cs{@ansChoices} macro for MC and MS questions} +% \begin{macrocode} +\def\@ansChoices[#1]{% + \global\let\@tempholdSaveAns\@empty + \global\let\@tempholdSaveChoice\@empty + \global\let\bChoiceLabel\@empty + \ifeq@randomizeallChoices + \setkeys{bchoice}{#1,random=true}\else + \setkeys{bchoice}{#1}\fi + \global\eq@tabColCnt=\z@ + \if@DoNotRandomize\eq@randomizeChoicesfalse\fi + \ifeq@randomizeChoices\expandafter\@@bChoices + \else\expandafter\@@ansChoices\fi } % \end{macrocode} % This is actually the old \cs{@ansChoices} only slightly modified. % \begin{macrocode} \def\@@ansChoices{% - \ifnum\aeb@numCols=1 % list mode - \def\eq@next{\@layoutListAns}% - \else % tabular mode - \edef\eq@next{\noexpand\@layoutTabularAns{\bChoiceNumCols}}% - \fi - \eq@next + \ifnum\aeb@numCols=\@ne % list mode + \def\eq@next{\@layoutListAns}% + \else % tabular mode + \edef\eq@next{\noexpand\@layoutTabularAns{\bChoiceNumCols}}% + \fi + \eq@next } % \end{macrocode} % The following are some registers to hold integers and tokens. @@ -7348,21 +7447,21 @@ if (_bOK) {\jsR\jsT % otherwise, we're finished. % \begin{macrocode} \def\@@bChoices{\gdef\@temphold{}\gdef\@tempholdrandom{}% - \gdef\@tempholdfreeze{}\aeb@searchfortoken{\@getAns}% + \gdef\@tempholdfreeze{}\aeb@searchfortoken{\@getAns}% } \def\aeb@searchfortoken#1{% - \@ifnextchar\Ans{\advance\aeb@numChoices1\relax#1} - {\@ifnextchar\eFreeze{\expandafter\@getFreezeAns\@gobble} - {\@ifnextchar\par{\def\@@temp{\aeb@searchfortoken{#1}}% - \expandafter\@@temp\@gobble}{\@eChoices}}}% + \@ifnextchar\Ans{\advance\aeb@numChoices1\relax#1} + {\@ifnextchar\eFreeze{\expandafter\@getFreezeAns\@gobble} + {\@ifnextchar\par{\def\@@temp{\aeb@searchfortoken{#1}}% + \expandafter\@@temp\@gobble}{\@eChoices}}}% } % \end{macrocode} % The non-frozen questions will be held in the macro \cs{@temphold}. % We keep track of the number of choices using the counter \cs{aeb@numChoices}. % \begin{macrocode} \long\def\@getAns\Ans#1\eAns{% - \g@addto@macro\@temphold{{\Ans#1\eAns}}% - \aeb@searchfortoken{\@getAns}% + \g@addto@macro\@temphold{{\Ans#1\eAns}}% + \aeb@searchfortoken{\@getAns}% } % \end{macrocode} % We've encountered \cs{eFreeze}, if the next token is \cs{Ans}, go get the @@ -7374,14 +7473,14 @@ if (_bOK) {\jsR\jsT % in the macro \cs{@tempholdfreeze}. % \begin{macrocode} \long\def\@@getFreezeAns\Ans#1\eAns{% - \g@addto@macro\@tempholdfreeze{\Ans#1\eAns}% - \aeb@searchfortoken{\@@getFreezeAns}% + \g@addto@macro\@tempholdfreeze{\Ans#1\eAns}% + \aeb@searchfortoken{\@@getFreezeAns}% } % \end{macrocode} % When we are finished finding all the choices, we come here to randomize the choices. % \begin{macrocode} \long\def\@eChoices#1\eChoices{% - \aeb@randomizeChoices{\the\aeb@numChoices}% + \aeb@randomizeChoices{\the\aeb@numChoices}% } % \end{macrocode} % The routine that randomizes the choices. Basically, we use \texttt{random.tex} to get @@ -7391,46 +7490,46 @@ if (_bOK) {\jsR\jsT % here \cs{aeb@hold} is used as a scratch token register. % \begin{macrocode} \def\aeb@randomizeChoices#1{% - \setrannum{\aeb@ranChoice}{1}{#1} - \eqtmpcnta\z@\aeb@hold=\expandafter{\@temphold}\def\@temphold{}% - \expandafter\@tfor\expandafter - \@temp\expandafter:\expandafter=\the\aeb@hold \do {% - \advance\eqtmpcnta\@ne - \ifnum\eqtmpcnta=\aeb@ranChoice\relax - \aeb@hold=\expandafter\expandafter\expandafter - {\expandafter\@tempholdrandom\@temp}% - \edef\@tempholdrandom{\the\aeb@hold}% - \else - \aeb@hold=\expandafter\expandafter\expandafter - {\expandafter\@temphold\expandafter{\@temp}}% - \edef\@temphold{\the\aeb@hold}% - \fi - }% + \setrannum{\aeb@ranChoice}{1}{#1} + \eqtmpcnta\z@\aeb@hold=\expandafter{\@temphold}\def\@temphold{}% + \expandafter\@tfor\expandafter + \@temp\expandafter:\expandafter=\the\aeb@hold \do {% + \advance\eqtmpcnta\@ne + \ifnum\eqtmpcnta=\aeb@ranChoice\relax + \aeb@hold=\expandafter\expandafter\expandafter + {\expandafter\@tempholdrandom\@temp}% + \edef\@tempholdrandom{\the\aeb@hold}% + \else + \aeb@hold=\expandafter\expandafter\expandafter + {\expandafter\@temphold\expandafter{\@temp}}% + \edef\@temphold{\the\aeb@hold}% + \fi + }% % \end{macrocode} % We repeat this process a total of \cs{aeb@numChoices}, the original count of the number % of choices. Once finished, we go to \cs{aeb@finishedRandomizing} to lay out the % randomized choices for typesetting. % \begin{macrocode} - \aeb@numChoices=#1 - \advance\aeb@numChoices-1 - \ifnum\aeb@numChoices=0\relax - \def\aeb@next{\aeb@finishedRandomizing}\else - \def\aeb@next{\aeb@randomizeChoices{\the\aeb@numChoices}}\fi - \aeb@next + \aeb@numChoices=#1 + \advance\aeb@numChoices\m@ne + \ifnum\aeb@numChoices=\z@ + \def\aeb@next{\aeb@finishedRandomizing}\else + \def\aeb@next{\aeb@randomizeChoices{\the\aeb@numChoices}}\fi + \aeb@next } % \end{macrocode} % This command assembles the questions held in random order in the command \cs{@tempholdrandom} and % the frozen ones held in \cs{@tempholdfreeze}, and lays out the choices for typesetting. % \begin{macrocode} \def\aeb@finishedRandomizing{% - \aeb@hold=\expandafter\expandafter\expandafter - {\expandafter\@tempholdrandom\@tempholdfreeze}% - \gdef\@temphold{}\gdef\@tempholdrandom{}\gdef\@tempholdfreeze{}% - \edef\finished@Randomizing{% - \noexpand\@@ansChoices - \the\aeb@hold - \noexpand\eChoices}% - \finished@Randomizing + \aeb@hold=\expandafter\expandafter\expandafter + {\expandafter\@tempholdrandom\@tempholdfreeze}% + \gdef\@temphold{}\gdef\@tempholdrandom{}\gdef\@tempholdfreeze{}% + \edef\finished@Randomizing{% + \noexpand\@@ansChoices + \the\aeb@hold + \noexpand\eChoices}% + \finished@Randomizing } % \end{macrocode} % \begin{macro}{\saveRandomSeed} @@ -7455,21 +7554,20 @@ if (_bOK) {\jsR\jsT % by \textsf{ran\_toks}. Now, there share a common aux file and common initial and final % seeds. % \begin{macrocode} -%\def\saveRandomSeed{\AtEndDocument{\eq@writeRandomData}} \def\saveRandomSeed{\PackageInfo{exerquiz} - {The command \string\saveRandomSeed\space - is deprecated.\MessageBreak Seed automatically saved}} + {The command \string\saveRandomSeed\space + is deprecated.\MessageBreak Seed automatically saved}} % \end{macrocode} % I \cs{let} the commands in this file to the companion commands in \textsf{ran\_toks} file. % The user can use either set of commands \cs{inputRandomSeed} or \cs{useLastSeed} as one % pair and \cs{useRandomSeed} and \cs{useThisSeed} as the other pair. % \begin{macrocode} \@ifpackageloaded{ran_toks}{% - \let\inputRandomSeed\useLastAsSeed - \let\useRandomSeed\useThisSeed + \let\inputRandomSeed\useLastAsSeed + \let\useRandomSeed\useThisSeed }{% - \def\inputRandomSeed{\eq@readRandomData}% - \def\useRandomSeed#1{\saveseedfalse\randomi=#1}% + \def\inputRandomSeed{\eq@readRandomData}% + \def\useRandomSeed#1{\saveseedfalse\randomi=#1}% } \def\InitSeedValue{\the\randomi} % dps \@ifundefined{ifsaveseed}{\newif\ifsaveseed\saveseedtrue}{} % dps @@ -7478,40 +7576,39 @@ if (_bOK) {\jsR\jsT % \end{macro} % \end{macro} % \begin{macrocode} -\def\eq@writeRandomData -{% - \ifsaveseed - \@ifundefined{saveseedinfo}{\newwrite\saveseedinfo}{} - \immediate\openout \saveseedinfo \jobname_rt.sav - \let\verbatim@out\saveseedinfo - \def\eqrt@msgi{initializing seed value}% - \def\eqrt@msgii{last random number used}% - \uccode`c=`\%\uppercase{% - \immediate\write\verbatim@out - {\InitSeedValue\space c \eqrt@msgi}% - \immediate\write\verbatim@out - {\the\randomi\space c \eqrt@msgii}% - }\immediate\closeout\saveseedinfo - \fi +\def\eq@writeRandomData{% + \ifsaveseed + \@ifundefined{saveseedinfo}{\newwrite\saveseedinfo}{} + \immediate\openout \saveseedinfo \jobname_rt.sav + \let\verbatim@out\saveseedinfo + \def\eqrt@msgi{initializing seed value}% + \def\eqrt@msgii{last random number used}% + \uccode`c=`\%\uppercase{% + \immediate\write\verbatim@out + {\InitSeedValue\space c \eqrt@msgi}% + \immediate\write\verbatim@out + {\the\randomi\space c \eqrt@msgii}% + }\immediate\closeout\saveseedinfo + \fi } \AtEndDocument{\eq@writeRandomData} % \end{macrocode} % Save the data to the file \cs{jobname\_ran.sav}. % \begin{macrocode} \def\eq@readRandomData{\IfFileExists{\jobname_rt.sav}{% - \PackageInfo{exerquiz}{Inputting \jobname_rt.sav}% - \@ifundefined{readsavfile}{\newread\readsavfile}{}% - \openin\readsavfile=\jobname_rt.sav - \read\readsavfile to \InitSeedValue - \read\readsavfile to \eqlastRandomNum - \closein\readsavfile - \randomi=\eqlastRandomNum - \xdef\InitSeedValue{\the\randomi}% - \immediate\closeout\readsavfile + \PackageInfo{exerquiz}{Inputting \jobname_rt.sav}% + \@ifundefined{readsavfile}{\newread\readsavfile}{}% + \openin\readsavfile=\jobname_rt.sav + \read\readsavfile to \InitSeedValue + \read\readsavfile to \eqlastRandomNum + \closein\readsavfile + \randomi=\eqlastRandomNum + \xdef\InitSeedValue{\the\randomi}% + \immediate\closeout\readsavfile }{% - \PackageInfo{exerquiz}{\jobname_rt.sav cannot - be found, \MessageBreak - using the random initializer}% + \PackageInfo{exerquiz}{\jobname_rt.sav cannot + be found, \MessageBreak + using the random initializer}% }} % \end{macrocode} % \begin{macrocode} @@ -7551,27 +7648,27 @@ if (_bOK) {\jsR\jsT %} % \begin{macrocode} \def\REF{\@ifstar{\let\isREFstar\eq@One\aeb@REFstar} - {\let\isREFstar\eq@Zero\aeb@REF}} + {\let\isREFstar\eq@Zero\aeb@REF}} \def\aeb@REFstar#1{\@ifundefined{r@#1}{\hbox{\reset@font\bfseries ??}} - {\ifaebshowgrayletters\aeb@buildUpperCaseRef{#1}% - \else\ref*{#1}\fi}% + {\ifaebshowgrayletters\aeb@buildUpperCaseRef{#1}% + \else\ref*{#1}\fi}% } \def\aeb@REF#1{\@ifundefined{r@#1}{\hbox{\reset@font\bfseries ??}} - {\ifaebshowgrayletters\aeb@buildUpperCaseRef{#1}% - \else\ref{#1}\fi}% + {\ifaebshowgrayletters\aeb@buildUpperCaseRef{#1}% + \else\ref{#1}\fi}% } %</package|eqexam> %<*eqexam> \def\aeb@buildUpperCaseRef#1{% - \xdef\tmp@expand{\aeb@exiii\@firstoftwo\csname r@#1\endcsname}% - \xdef\tmp@expand{\uppercase{\tmp@expand}}\tmp@expand + \xdef\tmp@expand{\aeb@exiii\@firstoftwo\csname r@#1\endcsname}% + \xdef\tmp@expand{\uppercase{\tmp@expand}}\tmp@expand } %</eqexam> %<*package> \def\aeb@buildUpperCaseRef#1{% - \xdef\tmp@expand{\aeb@exiii\@firstoffive\csname r@#1\endcsname}% - \xdef\tmp@expand{\uppercase{\tmp@expand}}% - \if\isREFstar\eq@One\tmp@expand\else\hyperref[#1]{\tmp@expand}\fi + \xdef\tmp@expand{\aeb@exiii\@firstoffive\csname r@#1\endcsname}% + \xdef\tmp@expand{\uppercase{\tmp@expand}}% + \if\isREFstar\eq@One\tmp@expand\else\hyperref[#1]{\tmp@expand}\fi } % \end{macrocode} % \end{macro} @@ -7600,10 +7697,10 @@ if (_bOK) {\jsR\jsT % \begin{macrocode} \let\insert@circlesymbol\@empty \def\useMCCircles{\useForms - \ifaeb@usecircles\else - \global\aeb@usecirclestrue - \gdef\insert@circlesymbol{\symbolchoice{circle}}% - \fi + \ifaeb@usecircles\else + \global\aeb@usecirclestrue + \gdef\insert@circlesymbol{\symbolchoice{circle}}% + \fi } % \end{macrocode} % \end{macro} @@ -7613,9 +7710,9 @@ if (_bOK) {\jsR\jsT % to their values prior to the last invocation of \cs{useMCCircles}. % \begin{macrocode} \def\useMCRects{\useForms - \ifaeb@usecircles\global\aeb@usecirclesfalse - \global\let\insert@circlesymbol\@empty - \fi + \ifaeb@usecircles\global\aeb@usecirclesfalse + \global\let\insert@circlesymbol\@empty + \fi } \let\useMCCRects\useMCRects % \end{macrocode} @@ -7667,26 +7764,25 @@ if (_bOK) {\jsR\jsT % question label, i.e., \texttt{2(a)(ii)}. These two lines are repeated for % the \texttt{shortquiz} and \texttt{quiz} environments. % \begin{macrocode} - \let\@currentQues\@empty - \xdef\eq@pageThisQ{\the\c@page}% - \global\let\eqQzQuesList\@empty - \xdef\oField{#1}\xdef\curr@quiz{#1}\xdef\currQuiz{#1}% - \g@addto@macro\ListOfSQuizNames{,#1}\let\@qzsolndest\@empty -% \stepcounter{questionno}% - \let\eqQuizType\isSQZ\gdef\eqPTs{1}\global\let\eqQT\eq@na - \let\answers\answers@sq - \let\endanswers\endanswers@sq - \let\manswers\manswers@sq - \let\endmanswers\endmanswers@sq - \let\solution\solution@sq - \let\endsolution\endsolution@sq - \noindent\oqpriorhook\sq@IDTxtField\ifx\aebTitleQuiz\@empty - \else\aebtitleQuiz\fi\ignorespaces + \let\@currentQues\@empty + \xdef\eq@pageThisQ{\the\c@page}\global + \let\eqQzQuesList\@empty + \xdef\oField{#1}\xdef\curr@quiz{#1}\xdef\currQuiz{#1}% + \g@addto@macro\ListOfSQuizNames{,#1}\let\@qzsolndest\@empty + \let\eqQuizType\isSQZ\gdef\eqPTs{1}\global\let\eqQT\eq@na + \let\answers\answers@sq + \let\endanswers\endanswers@sq + \let\manswers\manswers@sq + \let\endmanswers\endmanswers@sq + \let\solution\solution@sq + \let\endsolution\endsolution@sq + \noindent\oqpriorhook\sq@IDTxtField\ifx\aebTitleQuiz\@empty + \else\aebtitleQuiz\fi\ignorespaces }{% - \global\let\aebtitleQuiz\@empty - \global\let\aebTitleQuiz\@empty - \global\let\eq@tq@star\relax - \aftergroup\ignorespaces + \global\let\aebtitleQuiz\@empty + \global\let\aebTitleQuiz\@empty + \global\let\eq@tq@star\relax + \aftergroup\ignorespaces } \def\oSolution#1{\edef\@qzsolndest{#1}} % \end{macrocode} @@ -7833,11 +7929,11 @@ if (_bOK) {\jsR\jsT % \begin{macrocode} \def\eq@rpl#1#2{_rplVarsBy('#1','#2')@} % dps17 % \end{macrocode} -% A variation on the objective style math problem, is to initially populate the response box with an +% \textbf{Correcting an incorrect entry.} A variation on the objective style math problem is to initially populate the response box with an % incorrect answer and ask the student to correct it. (Good for future teachers.) The problem type set % straightforward when multi-variables are not used, just specify the \cs{V} and \cs{DV} keys in the -% optional argument of \cs{RespBoxMath}. When multi-variables are used, we have to precede the question -% with \DescribeMacro{\setInitAltAppr}\cs{setInitAltAppr}. There are two variations, the first is for +% optional argument of \cs{RespBoxMath}. When multi-variables are used, we enclose the question +% with \DescribeMacro{\bInitAltAppr}\cs{bInitAltAppr}/\allowbreak\DescribeMacro{\eInitAltAppr}\cs{eInitAltAppr}. There are two variations, the first is for % a non-\app{dvips/Distiller} workflow (document JavaScript are embedded at the creation of the PDF; % the second variation is with Distiller, where the document JavaScript is embedded with \app{Acrobat} % after the creation of the PDF. In the latter case, the JavaScript functions used below (\texttt{processMathVars}, @@ -7845,13 +7941,17 @@ if (_bOK) {\jsR\jsT % opened in \app{Acrobat}. As a result, an exception is thrown. When the exception is thrown, % \texttt{app.setTimeOut} gives a delay and the field is reset after 25 milliseconds, this causes % the \emph{initial} alternate appearance to appear, if that is desired. -% \changes{v8.1a}{2017/09/03}{Add \string\cs{setInitAltAppr} for setting the initial alternate appearance} +% \changes{v8.1a}{2017/09/03}{Added \string\cs{bInitAltAppr}/\string\allowbreak\string\cs{eInitAltAppr} +% command pair for setting the initial alternate appearance} +% \begin{macrocode} +\ifnum\eq@drivernum=\z@ + \def\RorRT{\r\t}\else\def\RorRT{\r}\fi +% \end{macrocode} +% The following commands are in support of the \cs{bInitAltAppr}/\allowbreak\cs{eInitAltAppr} command pair. % \begin{macrocode} -\ifnum\eq@drivernum=0\def\RorRT{\r\t}\else\def\RorRT{\r}\fi \def\toAltApprCnt{0}\def\toAltApprVar{_toAltAppr\toAltApprCnt} \def\toAltApprCntInc{{\@tempcnta=\toAltApprCnt\relax - \advance\@tempcnta1\relax - \xdef\toAltApprCnt{\the\@tempcnta}}} + \advance\@tempcnta\@ne\xdef\toAltApprCnt{\the\@tempcnta}}} \def\setCoreInitAltAppr{% var\eqSP_substVars=\indepVars;\RorRT var\eqSP_mathVars=processMathVars(_substVars);\RorRT @@ -7859,10 +7959,18 @@ if (_bOK) {\jsR\jsT event.value=RespBoxAppr(event);\RorRT getSubstValue.aSubsts=[];% } +% \end{macrocode} +% \leavevmode\DescribeMacro{\bInitAltAppr}\DescribeMacro{\eInitAltAppr} This command pair +% are used to set the initial value of a \cs{RespBoxMath} field. +% See the {Acro\negthinspace\TeX} article \url{http://www.acrotex.net/blog/?p=1335} +% for a discussion of the use of \cs{bInitAltAppr}/\allowbreak +% \cs{bInitAltAppr}. +% An alternate method is to use \cs{formatInitAltApprs} directly +% \begin{macrocode} \def\bInitAltAppr{\ifShowAppr \def\ShowApprSAVE{true}\toAltApprCntInc\ShowApprfalse - \def\eqAddAAFormat{\ifnum\eq@drivernum=0try\eqLBr\RorRT\fi - \setCoreInitAltAppr\ifnum\eq@drivernum=0 \r\eqRBr catch(e){\RorRT + \def\eqAddAAFormat{\ifnum\eq@drivernum=\z@ try\eqLBr\RorRT\fi + \setCoreInitAltAppr\ifnum\eq@drivernum=\z@\r\eqRBr catch(e){\RorRT var\eqSP\toAltApprVar=% app.setTimeOut('this.resetForm("'+event.target.name+'");% app.clearTimeOut(\toAltApprVar);',250);\r}\fi}\else @@ -7875,61 +7983,85 @@ if (_bOK) {\jsR\jsT % \changes{v6.4c}{2011/07/01}{\cs{RespBoxMath} now records its lists of % independent variables under the global variable \texttt{\_mathVars}.} % \begin{macrocode} -\def\AAKqRespBoxMath{% +\begin{defineJS}[\makeesc\*\makecmt\%]{\AAKqRespBoxMath} % \end{macrocode} % \cs{AAKqRespBoxMath} is the default keystroke action script for \cs{RespBoxMath} % \begin{macrocode} - if(event.willCommit){\r\t - RecordPointValue(\eqPTs,\thequestionno\ifx\grpquestions1,% -\thegrpquestionno,\grpPointValue,\grpTotalWeight,% -"\grpEvalFunction"\fi);\r\t - RecordProblemType("\eqQT",\thequestionno);\r\t +if(event.willCommit){ + RecordPointValue(*eqPTs,*thequestionno*ifx*grpquestions*eq@One,% +*thegrpquestionno,*grpPointValue,*grpTotalWeight,% +"*grpEvalFunction"*fi); + RecordProblemType("*eqQT",*thequestionno); % \end{macrocode} % If there are substitute variables, \cs{ifSubstVars} is true, and the script below % are the lines developed in support of multi-letter variables. % \begin{macrocode} -\ifSubstVars % dps17 - var\eqSP_substVars=\indepVars;\r\t - var\eqSP_mathVars=processMathVars(_substVars);\r\t - var\eqSP_substValue=getSubstValue(_substVars,event.value);\r\t - var\eqSP_substAns=getSubstValue(_substVars,"\eqCorrectAns");\r\t - var\eqSP retn=\processJSfunc(\rbArgs,% - \compareJSfunc,_substValue);\r\t -\else - var\eqSP_mathVars=\indepVars;\r\t - var\eqSP retn=\processJSfunc(\rbArgs,\compareJSfunc);\r\t -\fi - ProcUserResp(retn,event.value,\thequestionno,% -0\ifx\grpquestions1,\thegrpquestionno\fi);\r - }\r - if (!isQuizInitialized("\currQuiz")) {\r\t - \eqObjAlert eqAppAlert(InitMsg("\bqlabelISO"),3);\r\t - event.rc = false;\r - } +*ifSubstVars% + var _substVars=*indepVars; + var _mathVars=processMathVars(_substVars); + var _substValue=getSubstValue(_substVars,event.value); + var _substAns=getSubstValue(_substVars,"*eqCorrectAns"); + var retn=*processJSfunc(*rbArgs,% + *compareJSfunc,_substValue);*else% + var _mathVars=*indepVars; + var retn=*processJSfunc(*rbArgs,*compareJSfunc);*fi + ProcUserResp(retn,event.value,*thequestionno,0% +*ifx*grpquestions*eq@One,*thegrpquestionno*fi); +} +if (!isQuizInitialized("*currQuiz")) { + *eqObjAlert*eqAppAlert(InitMsg("*bqlabelISO"),3); + event.rc = false;% +*ifx*eqAddAAKeystroke*@empty*else +*eqAddAAKeystroke*fi } -\def\RespBoxMathDefaults -{% - \BC{0 0 0}\S{S}\textColor{0 g}\F{\FPrint}\W{1} +\end{defineJS} +\def\RespBoxMathDefaults{% + \BC{0 0 0}\S{S}\textColor{0 g}\F{\FPrint}\W{1} } -\def\moreRespBoxMathDefaults -{% - \edef\@moreRespBoxMathDefaults{% - \if\eqQuizType\isQZ\ifx\eq@online\eq@YES - \ifeq@noquizsolutions - \else\noexpand\Ff{\FfReadOnly}\fi\fi\fi - }% +\def\moreRespBoxMathDefaults{% + \edef\@moreRespBoxMathDefaults{% + \if\eqQuizType\isQZ\ifx\eq@online\eq@YES + \ifeq@noquizsolutions + \else\noexpand\Ff{\FfReadOnly}\fi\fi\fi + }% } \let\eqAddAAFormat\@empty % \end{macrocode} % \DescribeMacro{\eqSP}\cs{eqSP} is a space character to keep \textsf{dvips} from breaking lines at space. % \begin{macrocode} -\def\eqSP{\string\040} % dps17 +\def\eqSP{\string\040} \def\eqLBr{\string\173} \def\eqRBr{\string\175} +% \end{macrocode} +% Keystroke action for \cs{RespBoxMath}. +% \begin{macrocode} +\begin{defineJS}[\makeesc\!\makecmt\%]{\rbmAAKey} +if(event.willCommit) { +!ifSubstVars% +% \end{macrocode} +% If there are multi-letter variables (\cs{SubstVarstrue}), we insert the code developed. +% \begin{macrocode} + var _substVars=!indepVars; + var _mathVars=processMathVars(_substVars); + var _substValue=getSubstValue(_substVars,event.value); + var _substAns=getSubstValue(_substVars,"!eqCorrectAns"); + var retn=!processJSfunc(!rbArgs,% +!compareJSfunc,_substValue);!else% + var _mathVars=!indepVars; + var retn=!processJSfunc(!rbArgs,!compareJSfunc);!fi% +!ifx!@sqTurnOffAlerts!eq@One + OnBlurRespBox(retn,"!curr@quiz");!fi% +!ifx!eqAddAAKeystroke!@empty!else +!eqAddAAKeystroke!fi +} +\end{defineJS} +% \end{macrocode} +% The actions of \cs{RespBoxMath} +% \begin{macrocode} \def\@@RespBoxMathActions{% \AA{\if\eqQuizType\isQZ - \AAKeystroke{\AAKqRespBoxMath\eqAddAAKeystroke} - \AAFormat{\ifShowAppr\ifSubstVars\ifarrowDelim % dps17 + \AAKeystroke{\AAKqRespBoxMath} + \AAFormat{\ifShowAppr\ifSubstVars\ifarrowDelim % \end{macrocode} % The \texttt{RespBoxApp()} JavaScript function replaces the multi-letter variable (\texttt{alpha}, for example) % with its appearance (|\\u03B1|, eg). @@ -7937,31 +8069,8 @@ if (_bOK) {\jsR\jsT try{event.value=RespBoxAppr(event);}catch(e){}\r \fi\fi\fi\eqAddAAFormat} \else - \AAKeystroke{if(event.willCommit) {\r\t -\ifSubstVars% -% \end{macrocode} -% If there are multi-letter variables (\cs{SubstVarstrue}), we insert the code developed. -% \begin{macrocode} - var\eqSP_substVars=\indepVars;\r\t - var\eqSP_mathVars=processMathVars(_substVars);\r\t - var\eqSP_substValue=getSubstValue(_substVars,event.value);\r\t - var\eqSP_substAns=getSubstValue(_substVars,"\eqCorrectAns");\r\t - var\eqSP retn=\processJSfunc(\rbArgs,% - \compareJSfunc,_substValue);\r\t -\else - var\eqSP_mathVars=\indepVars;\r\t - var\eqSP retn=\processJSfunc(\rbArgs,\compareJSfunc); -\fi -\if\@sqTurnOffAlerts1% - OnBlurRespBox(retn,"\curr@quiz"); -\fi -% \end{macrocode} -% Moved \cs{eqAAKeystrokArg} from the conditional to the position below. -% \changes{v7.8i}{2017/07/21}{Moved \string\cs{eqAAKeystrokArg}} -% \begin{macrocode} - \eqAddAAKeystroke\r - }} - \AAFormat{\ifShowAppr\ifSubstVars\ifarrowDelim % dps17 + \AAKeystroke{\rbmAAKey} + \AAFormat{\ifShowAppr\ifSubstVars\ifarrowDelim try{event.value=RespBoxAppr(event);}catch(e){}\r\fi\fi\fi \eqAddAAFormat}% \AAOnFocus{\JS{var retn = null;}}% @@ -8052,13 +8161,13 @@ if (_bOK) {\jsR\jsT \def\defaultRDPrecision#1{\def\eq@defaultRDPrecision{#1}} \defaultRDPrecision{1E-14} % \end{macrocode} -% dps/change 02/23/07 Here we try to implement a suggest of Bruce Wagner. If the tolerance +% dps/change 02/23/07 Here we try to implement a suggestion of Bruce Wagner. If the tolerance % is set to zero, then use \texttt{reldiffCompare} as the default compare, and set the tolerance % to some small value. Here, the small value is the value of the command % \cs{eq@defaultRDPrecision} which can be set by \cs{defaultRDPrecision}. The default definition % is \verb!\defaultRDPrecision{1E-14}!. % \begin{macrocode} -\newif\ifarrowDelim\arrowDelimfalse % dps17 +\newif\ifarrowDelim\arrowDelimfalse % \end{macrocode} % The problem is to detect when \cs{indepVars} contains the arrow notation (\verb~->~), this signals % that the appearance of the user's response is to be replaced by another appearance. The command @@ -8198,32 +8307,40 @@ if (_bOK) {\jsR\jsT % \cs{RespBoxMath} continues here % \begin{macrocode} \def\@eq@RespB@x#1(#2)[#3]#4#5#6{\xdef\@qzsolndest{#3}% dps17 - \gdef\indepVars{"#2"}\isFrstrpl#2\@nil\if\frstIsrpl\eq@YES - \def\@IVi{#2}\else\expandafter\def\expandafter - \@IVi\expandafter{#2}\fi\edef\@IVii{#2}\ifx\@IVi\@IVii + \gdef\indepVars{"#2"}\isFrstrpl#2\@nil + \if\frstIsrpl\eq@YES + \def\@IVi{#2}\else\expandafter\def\expandafter + \@IVi\expandafter{#2}\fi + \edef\@IVii{#2}% + \ifx\@IVi\@IVii % \end{macrocode} % If \cs{indepVars} (\texttt{\#2}) does not contain \cs{rpl}, the two versions % of \cs{@IVi} and \cs{@IVii} should compare favorably. If they differ, the difference % is due to the presence of \cs{rpl}. % \begin{macrocode} - \global\SubstVarsfalse\else\global\SubstVarstrue - \isAltApprSpec{#2}\fi + \global\SubstVarsfalse + \else + \global\SubstVarstrue + \isAltApprSpec{#2}% + \fi % \end{macrocode} % \textbf{Counting number of variables.} We count the number of independent variables. % \begin{macrocode} - \cntVars{#2}\def\eq@precision{#5}% - \ifx\eq@precision\eq@ZERO - \def\eq@defaultCompare{reldiffCompare}% + \cntVars{#2}\def\eq@precision{#5}% + \ifx\eq@precision\eq@ZERO + \def\eq@defaultCompare{reldiffCompare}% % \end{macrocode} % (2017/01/11) Replace \texttt{\#1} by \cs{eqCorrectAns} to delay expansion % \changes{v7.8d}{2017/01/11}{Replace \string\texttt{\#1} by \string\cs{eqCorrectAns} to delay expansion} % \begin{macrocode} - \def\rbArgstmp{\rbFlag,% dps17 - \ifSubstVars_substAns\else"#1"\fi,#4,% - \eq@defaultRDPrecision}\else - \def\eq@defaultCompare{diffCompare}% - \def\rbArgstmp{\rbFlag,% dps17 - \ifSubstVars_substAns\else"#1"\fi,#4,#5}\fi + \def\rbArgstmp{\rbFlag,% + \ifSubstVars_substAns\else"#1"\fi,#4,% + \eq@defaultRDPrecision}% + \else + \def\eq@defaultCompare{diffCompare}% + \def\rbArgstmp{\rbFlag,% + \ifSubstVars_substAns\else"#1"\fi,#4,#5}% + \fi % \end{macrocode} % We have arrived at the first of possibly two parameters that define the interval(s) % from which to sample random points. There are two forms, the old style (deprecated) @@ -8232,7 +8349,7 @@ if (_bOK) {\jsR\jsT % (10/10/11) To support \cs{viidna}, we expand \texttt{\#6} first before passing it % to the command \cs{@checkforInterval}. % \begin{macrocode} - \edef\eq@ixparam{#6}\expandafter\eq@chkivIntrvls\eq@ixparam\\% + \edef\eq@ixparam{#6}\expandafter\eq@chkivIntrvls\eq@ixparam\\% } % \end{macrocode} % \DescribeMacro{\viidna} is used with the \texttt{satisfyEq} for the seventh parameter, @@ -8240,7 +8357,6 @@ if (_bOK) {\jsR\jsT % stop compilation. % \begin{macrocode} \def\viidna{[0,1]} -%\def\viidna{[]} % \end{macrocode} % If the next token is a `\texttt[', then that signals the beginning of an interval % such as \texttt{[a,b]}, must be the new style. The second parameter is not @@ -8319,10 +8435,8 @@ if (_bOK) {\jsR\jsT % \changes{v8.2}{2018/03/18}{Corrected \string\cs{eq@recordCorrAns}} % \changes{v8.2.1}{2018/03/19}{If not a math group, record this data} % \begin{macrocode} -\ifx\grpquestions\eq@Zero - \eq@recordCorrAns{"\eqCorrectAns"}% 2018/03/18 -% \eq@recordCorrAns{("\eqCorrectAns")}% 01/11 -\fi + \ifx\grpquestions\eq@Zero + \eq@recordCorrAns{"\eqCorrectAns"}\fi \ifeq@proofing\makebox[0pt][l]{\space\math@correctAnswer}\fi \eq@TextField % send to the driver-dependent macro % \end{macrocode} @@ -8394,71 +8508,74 @@ if (_bOK) {\jsR\jsT % Pick up any parameters that would modify the appearance of this text field. % \begin{macrocode} \def\RespBoxTxtOnBlur{OnBlurRespBox(% - \if\@sqTurnOffAlerts1retn\else null\fi,"\curr@quiz");} + \ifx\@sqTurnOffAlerts\eq@One + retn\else null\fi,"\curr@quiz");} +\def\eqObjAlertIfFalse{if (false) } \def\eqObjAlert{% \ifx\eqQuizType\isQZ\ifx\eq@online\eq@YES\ifeq@noquizsolutions - \else if (false) \fi\fi\fi} -\begin{defineJS}[% - \catcode`\@=0\relax\catcode`\%=14\relax]{\AAKqRespBoxTxt} + \else\eqObjAlertIfFalse\fi\fi\fi} +\def\eqAppAlert{eqAppAlert} +% \end{macrocode} +% Keystroke action for \cs{RespBoxTxt} +% \begin{macrocode} +\begin{defineJS}[\makeesc\*\makecmt\%]{\AAKqRespBoxTxt} if(event.willCommit){ - RecordPointValue(@eqPTs,@thequestionno@ifx@grpquestions1,% -@thegrpquestionno,@grpPointValue,@grpTotalWeight,% -"@grpEvalFunction"@fi); - RecordProblemType("@eqQT",@thequestionno); - var retn = ProcRespTxt(@rbTxtAlt); - ProcUserResp(retn,event.value,@thequestionno,% -0@ifx@grpquestions1,@thegrpquestionno@fi); -} -if (!isQuizInitialized("@currQuiz")) { - @eqObjAlert@space eqAppAlert(InitMsg("@bqlabelISO"),3); + RecordPointValue(*eqPTs,*thequestionno*ifx*grpquestions*eq@One,% +*thegrpquestionno,*grpPointValue,*grpTotalWeight,% +"*grpEvalFunction"*fi); + RecordProblemType("*eqQT",*thequestionno); + var retn = ProcRespTxt(*rbTxtAlt); + ProcUserResp(retn,event.value,*thequestionno,0% +*ifx*grpquestions*eq@One,*thegrpquestionno*fi); +} +if (!isQuizInitialized("!currQuiz")) { + *eqObjAlert*eqAppAlert(InitMsg("*bqlabelISO"),3); event.rc = false; } \end{defineJS} -\def\RespBoxTxtDefaults -{% +\def\RespBoxTxtDefaults{% \BC{0 0 0}\W{1}\S{S}\textColor{0 g}\F{\FPrint}% } -\def\moreRespBoxTxtDefaults -{% +\def\moreRespBoxTxtDefaults{% \edef\@moreRespBoxTxtDefaults{% \if\eqQuizType\isQZ\ifx\eq@online\eq@YES \ifeq@noquizsolutions\else \noexpand\Ff{\FfReadOnly}\fi\fi\fi }% } -\def\@@RespBoxTxtActions -{% +\begin{defineJS}[\makeesc\!\makecmt\%]{\rbtAAKey} +if(event.willCommit) { + var retn = ProcRespTxt(!rbTxtAlt);% +!ifx!@sqTurnOffAlerts!eq@One + !RespBoxTxtOnBlur!fi% +!ifx!eqAddAAKeystroke!@empty!else +!eqAddAAKeystroke!fi +} +\end{defineJS} +\def\@@RespBoxTxtActions{% \AA{\if\eqQuizType\isQZ % \end{macrocode} -% Added \cs{eqAAKeystrokArg} to \cs{@@RespBoxTxtActions} -% \changes{v7.8i}{2017/07/21}{Added \string\cs{eqAAKeystrokArg} to \string\cs{@@RespBoxTxtActions}} +% Added \cs{eqAddAAKeystroke} to \cs{@@RespBoxTxtActions} +% \changes{v7.8i}{2017/07/21}{Added \string\cs{eqAddAAKeystroke} to \string\cs{@@RespBoxTxtActions}} % \begin{macrocode} \AAKeystroke{\AAKqRespBoxTxt\eqAddAAKeystroke} \AAFormat{\eqAddAAFormat} \else - \AAKeystroke{% - if(event.willCommit) {\r\t - retn = ProcRespTxt(\rbTxtAlt);\r - \if\@sqTurnOffAlerts1 - \t\RespBoxTxtOnBlur\r\fi - \eqAddAAKeystroke\r - }% - } + \AAKeystroke{\rbtAAKey} \AAFormat{\eqAddAAFormat} - \AAOnFocus{\JS{var retn = null;}} + \AAOnFocus{\JS{var\eqSP retn=null;}} % \end{macrocode} % (2005/12/02) A fix for Acro7.0, a change in the blur event, must % move this event to keystroke so behavior is the same as in previous % versions. % \begin{macrocode} - \if\@sqTurnOffAlerts0% + \ifx\@sqTurnOffAlerts\eq@Zero \AAOnBlur{\JS{\RespBoxTxtOnBlur}}\fi \fi } } \def\annot@subtype@rbt{rbt} -\newcommand\@RespBoxTxt[1][] -{% +\newcommand\@RespBoxTxt[1][]{% \edef\annot@subtype{\annot@subtype@rbt}% \eq@AddProbToQzQuesList \ifx\grpquestions\eq@Zero\addtocounter{eqpointvalue}{\eqPTs}\fi @@ -8511,7 +8628,7 @@ if (!isQuizInitialized("@currQuiz")) { \def\eq@argi{-1}\fi\fi\fi \def\eq@argii{#2}\ifx\eq@argii\eq@ONE\else\def\eq@argii{0}\fi \begingroup - \ifnum\eq@argii=1\relax + \ifnum\eq@argii=\@ne % \end{macrocode} % local definitions: \DescribeMacro{\rexpStr}\cs{rexpStr}, % \DescribeMacro{\\<RegEXP>}|\\|, and \DescribeMacro{\word}\cs{word}. @@ -8528,37 +8645,37 @@ if (!isQuizInitialized("@currQuiz")) { #4\space instead}{Enter a positive integer.}\fi } \def\@argRead#1{\xdef\jsTempArgs{\txtAltList}% - \ifx\txtAltList\@empty\xdef\txtAltList{"#1"}\else - \xdef\txtAltList{\jsTempArgs,"#1"}\fi\@@argRead} + \ifx\txtAltList\@empty\xdef\txtAltList{"#1"}\else + \xdef\txtAltList{\jsTempArgs,"#1"}\fi\@@argRead} \def\@@argRead{\advance\eqtmpcnta\m@ne - \ifnum\eqtmpcnta=\z@ - \def\eq@next{\endgroup - \xdef\rbTxtAlt{\rbTxtAlt,\txtAltList}% - \if\grpquestions\eq@Zero - \ifwithinMCFI - \xdef\s@veCorrAnsMCFI{[\txtAltList]}\else - \eq@recordCorrAns{[\txtAltList]}\fi - \else + \ifnum\eqtmpcnta=\z@ + \def\eq@next{\endgroup + \xdef\rbTxtAlt{\rbTxtAlt,\txtAltList}% + \if\grpquestions\eq@Zero + \ifwithinMCFI + \xdef\s@veCorrAnsMCFI{[\txtAltList]}\else + \eq@recordCorrAns{[\txtAltList]}\fi + \else % \end{macrocode} % \changes{v7.8a}{2016/11/18}{Fixed a typo, \string\texttt{...AnsArrayi} should be % \string\texttt{...AnsGrpAnsArray}} % Fixed typo, changed \cs{eq@recordGrpAnsArrayi} to \cs{eq@recordGrpAnsArray}. % \begin{macrocode} - \eq@recordGrpAnsArray{[\txtAltList]}% - \fi - \eq@@RespBoxTxt - }% - \else - \def\eq@next{\@argRead}% - \fi\eq@next + \eq@recordGrpAnsArray{[\txtAltList]}% + \fi + \eq@@RespBoxTxt + }% + \else + \def\eq@next{\@argRead}% + \fi\eq@next } \def\eq@@RespBoxTxt{% - \ifeq@proofing\makebox[0pt][l]{\space\txt@correctAnswer}\fi - \eq@TextField + \ifeq@proofing\makebox[0pt][l]{\space\txt@correctAnswer}\fi + \eq@TextField % \end{macrocode} % Closing of the \cs{hbox} begun above. % \begin{macrocode} - \egroup + \egroup } % \end{macrocode} % If the \texttt{proofing} option is specified, then we type out the author's list of @@ -8566,8 +8683,8 @@ if (!isQuizInitialized("@currQuiz")) { % \begin{macrocode} \def\gobbleTxt#1>#2,#3,#4,{} \gdef\txt@correctAnswer{\ttfamily\color{\@proofingsymbolColor}% - \spaceskip=2pt\xspaceskip=2pt - \expandafter\gobbleTxt\meaning\rbTxtAlt + \spaceskip=2pt\xspaceskip=2pt + \expandafter\gobbleTxt\meaning\rbTxtAlt } % \end{macrocode} % \end{macro} @@ -8607,134 +8724,160 @@ if (!isQuizInitialized("@currQuiz")) { % that $4$ alternatives follow.) % \end{description} % \begin{macrocode} -\begin{defineJS}[% - \catcode`\@=0\relax\catcode`\%=14\relax]{\AAKqRespBoxTxtPC} +\begin{defineJS}[\makeesc\*\makecmt\%]{\AAKqRespBoxTxtPC} if(event.willCommit){ - RecordPointValue(@eqPTs,@thequestionno@ifx@grpquestions1,% -@thegrpquestionno,@grpPointValue,@grpTotalWeight,% -"@grpEvalFunction"@fi); - RecordProblemType("@eqQT",@thequestionno); - var retn = ProcRespTxtPC(@rbTxtAlt); -@ifx@grpquestions1% -ProbValue[@thequestionno][3+@thegrpquestionno]% -=ProcRespTxtPC.txtPCpCr;@else% -ProbValue[@thequestionno]=ProcRespTxtPC.txtPCpCr;@fi - ProcUserResp(retn,event.value,@thequestionno,0% -@ifx@grpquestions1,@thegrpquestionno@fi); -} -if (!isQuizInitialized("@currQuiz")) { - @eqObjAlert@space eqAppAlert(InitMsg("@bqlabelISO"),3); - event.rc = false; + RecordPointValue(*eqPTs,*thequestionno*ifx*grpquestions*eq@One,% +*thegrpquestionno,*grpPointValue,*grpTotalWeight,% +"*grpEvalFunction"*fi); + RecordProblemType("*eqQT",*thequestionno); + var retn = ProcRespTxtPC(*rbTxtAlt); +*ifx*grpquestions*eq@One% + ProbValue[*thequestionno][3+*thegrpquestionno]% +=ProcRespTxtPC.txtPCpCr;*else% + ProbValue[*thequestionno]=ProcRespTxtPC.txtPCpCr;*fi + ProcUserResp(retn,event.value,*thequestionno,0% +*ifx*grpquestions*eq@One,*thegrpquestionno*fi); +} +if (!isQuizInitialized("*currQuiz")) { + *eqObjAlert*eqAppAlert(InitMsg("*bqlabelISO"),3); + event.rc = false; } \end{defineJS} -\def\@@RespBoxTxtPCActions -{% - \AA{\if\eqQuizType\isQZ - \AAKeystroke{\AAKqRespBoxTxtPC} - \else - \AAKeystroke{% - if(event.willCommit) {\r\t - retn = ProcRespTxtPC(\rbTxtAlt);\r -\if\@sqTurnOffAlerts1% - \t\RespBoxTxtOnBlur\r -\fi - }% - } - \AAOnFocus{\JS{var retn = null;}} -\if\@sqTurnOffAlerts0% - \AAOnBlur{\JS{\RespBoxTxtOnBlur}}% -\fi - \fi - } +\begin{defineJS}[\makeesc\!\makecmt\%]{\rbtPCAAKey} +if(event.willCommit) { + retn = ProcRespTxtPC(!rbTxtAlt);% +!ifx!@sqTurnOffAlerts!eq@One + !RespBoxTxtOnBlur!fi% +} +\end{defineJS} +\def\@@RespBoxTxtPCActions{% + \AA{% + \if\eqQuizType\isQZ + \AAKeystroke{\AAKqRespBoxTxtPC} + \else + \AAKeystroke{\rbtPCAAKey} + \AAOnFocus{\JS{var\eqSP retn=null;}} + \ifx\@sqTurnOffAlerts\eq@Zero + \AAOnBlur{\JS{\RespBoxTxtOnBlur}}\fi + \fi + } } % \end{macrocode} % Here is the beginning of \cs{RespBoxTxtPC}. % \begin{macrocode} \newcommand{\RespBoxTxtPC}{\def\rbFlag{0}\@RespBoxTxtPC} \def\annot@subtype@rbtpc{rbtpc} -\newcommand\@RespBoxTxtPC[1][] -{% - \edef\annot@subtype{\annot@subtype@rbtpc}% - \eq@AddProbToQzQuesList - \smallskip\ifx\grpquestions\eq@Zero - \addtocounter{eqpointvalue}{\eqPTs}\fi - \if\eqQuizType\isQZ\def\rbFlag{1}\global\IsRespBoxtrue - \ifx\grpquestions\eq@One - \stepcounter{grpquestionno}% - \def\Fld@name{% - grpobj.\curr@quiz.\thequestionno.\thegrpquestionno}% - \else - \eq@recordThesePTs\eq@recordProbType - \edef\eqtmp{\aPointType}% - \xdef\aPointType{\eqtmp,[\eqPTs,"text"]}% - \stepcounter{questionno}% - \def\Fld@name{obj.\curr@quiz.\thequestionno}% - \fi +\newcommand\@RespBoxTxtPC[1][]{% + \edef\annot@subtype{\annot@subtype@rbtpc}% + \eq@AddProbToQzQuesList + \smallskip\ifx\grpquestions\eq@Zero + \addtocounter{eqpointvalue}{\eqPTs}\fi + \if\eqQuizType\isQZ\def\rbFlag{1}\global\IsRespBoxtrue + \ifx\grpquestions\eq@One + \stepcounter{grpquestionno}% + \def\Fld@name{% + grpobj.\curr@quiz.\thequestionno.\thegrpquestionno}% \else - \stepcounter{questionno}% - \def\Fld@name{obj.\oField.\thequestionno}% + \eq@recordThesePTs\eq@recordProbType + \edef\eqtmp{\aPointType}% + \xdef\aPointType{\eqtmp,[\eqPTs,"text"]}% + \stepcounter{questionno}% + \def\Fld@name{obj.\curr@quiz.\thequestionno}% \fi - \moreRespBoxTxtDefaults - \leavevmode\hbox\bgroup\text@@Field{#1}{\Fld@name}% - {\RBW}{\DefaultHeightOfWidget}% - {\eq@protect\AA}{\eq@setWidgetProps\@@RespBoxTxtPC}% - {\RespBoxTxtDefaults\@moreRespBoxTxtDefaults - \@@RespBoxTxtPCActions\every@eqTextField\every@RespBoxTxt}% + \else + \stepcounter{questionno}% + \def\Fld@name{obj.\oField.\thequestionno}% + \fi + \moreRespBoxTxtDefaults + \leavevmode\hbox\bgroup\text@@Field{#1}{\Fld@name}% + {\RBW}{\DefaultHeightOfWidget}% + {\eq@protect\AA}{\eq@setWidgetProps\@@RespBoxTxtPC}% + {\RespBoxTxtDefaults\@moreRespBoxTxtDefaults + \@@RespBoxTxtPCActions\every@eqTextField\every@RespBoxTxt}% } \def\@@RespBoxTxtPC#1{\@ifnextchar[{\@@@RespBoxTxtPC{#1}} - {\@ifstar{\@@@RespBoxTxtPC{#1}[\curr@quiz.\thequestionno]}% - {\@@@RespBoxTxtPC{#1}[]}}} + {\@ifstar{\@@@RespBoxTxtPC{#1}[\curr@quiz.\thequestionno]}% + {\@@@RespBoxTxtPC{#1}[]}}} \def\@@@RespBoxTxtPC#1[#2]#3{\xdef\@qzsolndest{#2}% \begingroup % \end{macrocode} % We make special definitions for retrieving the parameters. % \begin{macrocode} - \def\rexpStr##1{\eqbs\eqbs\eqbs\eqbs##1}% - \def\\##1{\eqbs\eqbs\eqbs\eqbs##1}% - \def\word##1{\\b##1\\b}\def\any{@any@} - \gdef\rbTxtAlt{\rbFlag,#1,1}% force sub-string match - \global\let\txtAltList\@empty - \eqtmpcnta=#3\relax\ifnum\eqtmpcnta>\z@\expandafter\@argReadPC\else - \PackageError{exerquiz}{% - The third required parameter of - \string\RespBoxTxtPC\MessageBreak - is required to be a positive integer. - You entered\MessageBreak #3\space instead} - {Enter a positive integer.}\fi + \def\rexpStr##1{\eqbs\eqbs\eqbs\eqbs##1}% + \def\\##1{\eqbs\eqbs\eqbs\eqbs##1}% + \def\word##1{\\b##1\\b}\def\any{@any@} + \gdef\rbTxtAlt{\rbFlag,#1,1}% force sub-string match + \global\let\txtAltList\@empty + \eqtmpcnta=#3\relax\ifnum\eqtmpcnta>\z@\expandafter\@argReadPC\else + \PackageError{exerquiz}{% + The third required parameter of + \string\RespBoxTxtPC\MessageBreak + is required to be a positive integer. + You entered\MessageBreak #3\space instead} + {Enter a positive integer.}\fi } % \end{macrocode} % \texttt{\#1=<num>}, partial credit for this answer, \texttt{\#2=word}. % \begin{macrocode} \newcommand\@argReadPC[2][0]{\xdef\jsTempArgs{\txtAltList}% - \ifx\txtAltList\@empty\xdef\txtAltList{["#2",#1]}\else - \xdef\txtAltList{\jsTempArgs,["#2",#1]}\fi\@@argReadPC} + \ifx\txtAltList\@empty\xdef\txtAltList{["#2",#1]}\else + \xdef\txtAltList{\jsTempArgs,["#2",#1]}\fi\@@argReadPC} \def\@@argReadPC{\advance\eqtmpcnta\m@ne - \ifnum\eqtmpcnta=\z@ - \def\eq@next{\endgroup - \xdef\rbTxtAlt{\rbTxtAlt,\txtAltList}% - \if\grpquestions\eq@Zero - \ifwithinMCFI - \xdef\s@veCorrAnsFCFI{[\txtAltList]}\else - \eq@recordCorrAns{[\txtAltList]}\fi - \else - \eq@recordGrpAnsArray{[\txtAltList]}% - \fi - \eq@@RespBoxTxtPC - }% - \else - \def\eq@next{\@argReadPC}% - \fi\eq@next + \ifnum\eqtmpcnta=\z@ + \def\eq@next{\endgroup + \xdef\rbTxtAlt{\rbTxtAlt,\txtAltList}% + \if\grpquestions\eq@Zero + \ifwithinMCFI + \xdef\s@veCorrAnsFCFI{[\txtAltList]}\else + \eq@recordCorrAns{[\txtAltList]}\fi + \else + \eq@recordGrpAnsArray{[\txtAltList]}% + \fi + \eq@@RespBoxTxtPC + }% + \else + \def\eq@next{\@argReadPC}% + \fi\eq@next } -\def\eq@@RespBoxTxtPC{% - \ifeq@proofing\makebox[0pt][l]{\space\txt@correctAnswer}\fi - \eq@TextField +\def\eq@@RespBoxTxtPC{\ifeq@proofing + \makebox[0pt][l]{\space\txt@correctAnswer}\fi + \eq@TextField % \end{macrocode} % Closing of the \cs{hbox} begun above. % \begin{macrocode} - \egroup + \egroup } % \end{macrocode} % \end{macro} +% \begin{macro}{\SpellCheck}\hskip-\marginparsep\texttt{[\ameta{options}]} +% This command is designed to be used with text fill-in questions; the action of this button +% allows the user to correct spelling, but it does record the number of initially misspelled words. +% The placement of this field is after the text field (\cs{RespBoxTxt} or \cs{RespBoxTxtPC}) so +% it can pick up on the field name. The root name of this field is \texttt{spl}. Two helper commands +% are defined: \DescribeMacro{\splChkCA}\cmd{\splChkCA} and \DescribeMacro{\splChkTU}\cmd{\splChkTU}. +% \changes{v8.5.11}{2020/11/11}{Added \string\cs{SpellCheck}} +% \begin{macrocode} +\def\afterSplChkActn#1{\def\@fterSplChkActn{\r #1}} +\let\@fterSplChkActn\@empty +\newcommand{\splChkCA}{Check} +\newcommand{\splChkTU}{Check spelling} +\newcommand\SpellCheck[1][]{% + \pushButton[\CA{\splChkCA}\TU{\splChkTU}\S{S} + #1\A{\JS{% + \ifx\grpquestions\eq@One + var targetFldName=% + "grpobj.\curr@quiz.\thequestionno.\thegrpquestionno"; + \else + \ifx\annot@subtype\annot@subtype@rbe + var targetFldName="essay.\curr@quiz.\thequestionno"; + \else + var targetFldName="obj.\curr@quiz.\thequestionno"; + \fi + \fi\r + var splErrors=checkTheSpelling(targetFldName);\@fterSplChkActn + }}]{spl.\curr@quiz.\thequestionno}{}{11bp}} +% \end{macrocode} +% \end{macro} %\subsection{Essay Fill-In} % \begin{macro}{\RespBoxEssay} % Here is a simple text field with a multi-line attribute for entering @@ -8747,7 +8890,7 @@ if (!isQuizInitialized("@currQuiz")) { % \string\RespBoxEssay[\ameta{opts}]*\darg{\ameta{wd}}\darg{\ameta{ht}} % \end{quote} % The second argument declares the problem has a \env{solution} file; we define the target -% of the solution twh ways: an explicite \ameta{dest} string, or an star (\texttt*), where +% of the solution twh ways: an explicit \ameta{dest} string, or an star (\texttt*), where % the destination is automatically named. If you use \ameta{dest}, you must have % a frist optional, even if its only \texttt{[]}, to correctly parse this construction. % \changes{v8.3}{2019/08/13}{\string\env{solution} environment now defined for @@ -8757,47 +8900,46 @@ if (!isQuizInitialized("@currQuiz")) { {% \BC{0 0 0}\W{1}\S{S}\Ff{\FfMultiline}\rawPDF{}% } -\def\@@RespBoxEssayActions -{% - \AA{\if\eqQuizType\isQZ - \AAKeystroke{% - if(event.willCommit){\jsR\jsT - RecordPointValue(\eqPTs,\thequestionno);\jsR\jsT - RecordProblemType("\eqQT",\thequestionno);\jsR %\jsT - }\jsR - if (!isQuizInitialized("\curr@quiz")) {\jsR\jsT - \eqObjAlert\space eqAppAlert(% - InitMsg("\bqlabelISO"),3);\jsR\jsT - event.rc = false;\jsR - }% - }% - \fi - } +\def\@@RespBoxEssayActions{\AA{% + \if\eqQuizType\isQZ + \AAKeystroke{% + if(event.willCommit){\jsR\jsT + RecordPointValue(\eqPTs,\thequestionno);\jsR\jsT + RecordProblemType("\eqQT",\thequestionno);\jsR %\jsT + }\jsR + if (!isQuizInitialized("\curr@quiz")) {\jsR\jsT + \eqObjAlert\space eqAppAlert(% + InitMsg("\bqlabelISO"),3);\jsR\jsT + event.rc = false;\jsR + }% + }% + \fi}% } % \RespBoxEssay[opt][dest]|*{wd}{ht} -\newcommand\RespBoxEssay[1][]{\def\rbe@rgi{#1}\RespBoxEssay@i} +\def\annot@subtype@rbe{rbe} +\newcommand\RespBoxEssay[1][]{\edef\annot@subtype{\annot@subtype@rbe}% + \def\rbe@rgi{#1}\RespBoxEssay@i} \def\RespBoxEssay@i{\@ifnextchar[%] {\RespBoxEssay@ii} {\@ifstar{\RespBoxEssay@ii[\curr@quiz.\thequestionno]}}% {\RespBoxEssay@ii[]}% } % \RespBoxEssay#1[dest]{wd}{ht} -\newcommand\RespBoxEssay@ii[3][] -{% - \smallskip\addtocounter{eqpointvalue}{\eqPTs}% +\newcommand\RespBoxEssay@ii[3][]{% + \smallskip\addtocounter{eqpointvalue}{\eqPTs}% % \end{macrocode} % (2019/06/26) Added \cs{eq@AddProbToQzQuesList} for \cs{RespBoxEssay} % \changes{v8.2.13}{2019/06/26}{Added \string\cs{eq@AddProbToQzQuesList} for \string\cs{RespBoxEssay}} % \begin{macrocode} - \eq@AddProbToQzQuesList - \stepcounter{questionno}% - \xdef\@qzsolndest{#1}% - \edef\eqtmp{\aPointType}\xdef\aPointType{\eqtmp,[\eqPTs,"essay"]}% - \expandafter\mbox\expandafter{\expandafter\text@@Field - \expandafter{\rbe@rgi}{essay.\curr@quiz.\thequestionno}{#2}{#3}% - {\eq@protect\AA}{\eq@setWidgetProps - \eq@TextField}{\RespBoxEssayDefaults\@@RespBoxEssayActions - \every@eqTextField}}% + \eq@AddProbToQzQuesList + \stepcounter{questionno}% + \xdef\@qzsolndest{#1}% + \edef\eqtmp{\aPointType}\xdef\aPointType{\eqtmp,[\eqPTs,"essay"]}% + \expandafter\mbox\expandafter{\expandafter\text@@Field + \expandafter{\rbe@rgi}{essay.\curr@quiz.\thequestionno}{#2}{#3}% + {\eq@protect\AA}{\eq@setWidgetProps + \eq@TextField}{\RespBoxEssayDefaults\@@RespBoxEssayActions + \every@eqTextField}}% } % \end{macrocode} % \end{macro} @@ -8812,21 +8954,19 @@ if (!isQuizInitialized("@currQuiz")) { \@ifundefined{calcOrder}{% \ifpdf\def\@@sqTallyBoxActions{% \AA{\AAValidate{getTotalTally("\oField");}}}\fi}{} -\def\sqTallyBoxDefaults -{% +\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 + \AA{\AAValidate{getTotalTally("\oField");}}}\else + \let\@@sqTallyBoxActions\@empty \fi -\newcommand\sqTallyBox[1][] -{% - \mbox{\text@@Field{#1}{tally.\oField.\thequestionno}% - {\TBW}{\DefaultHeightOfWidget}% - {}{\eq@setWidgetProps\eq@TextField}% - {\sqTallyBoxDefaults\@@sqTallyBoxActions\every@eqTextField - \every@sqTallyBox}}% +\newcommand\sqTallyBox[1][]{% + \mbox{\text@@Field{#1}{tally.\oField.\thequestionno}% + {\TBW}{\DefaultHeightOfWidget}% + {}{\eq@setWidgetProps\eq@TextField}% + {\sqTallyBoxDefaults\@@sqTallyBoxActions\every@eqTextField + \every@sqTallyBox}}% } % \end{macrocode} % \end{macro} @@ -8835,28 +8975,24 @@ if (!isQuizInitialized("@currQuiz")) { % \texttt{shortquiz} environment. Takes on optional parameter; this % parameter can be used to modify the appearance of the fields. % \begin{macrocode} -\def\sqTallyTotalDefaults -{% - \rawPDF{}\W{1}\BC{0 0 0}\S{I}\textColor{1 0 0 rg}% - \Q{2}\Ff{\FfReadOnly}% +\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")); - }} -} -\newcommand\sqTallyTotal[1][] -{% - \mbox{\text@@Field{#1}{tallytotal.\oField}{\TBW}% - {\DefaultHeightOfWidget}{\eq@protect\AA}% -% {\eq@setWidgetProps\eq@calcTextField}% - {\eq@setWidgetProps\eq@TextField}% - {\sqTallyTotalDefaults\@@sqTallyTotalActions\every@eqTextField - \every@sqTallyTotal}}% +\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")); + }}% +} +\newcommand\sqTallyTotal[1][]{% + \mbox{\text@@Field{#1}{tallytotal.\oField}{\TBW}% + {\DefaultHeightOfWidget}{\eq@protect\AA}% + {\eq@setWidgetProps\eq@TextField}% + {\sqTallyTotalDefaults\@@sqTallyTotalActions\every@eqTextField + \every@sqTallyTotal}}% } % \end{macrocode} % \end{macro} @@ -8888,96 +9024,95 @@ if (!isQuizInitialized("@currQuiz")) { %\end{verbatim} % Here, we call a function to evaluate the answer for us. % \begin{macrocode} -\def\CorrAnsButtonDefaults -{% - \CA{\eq@local@CorrAnsButton}\W{1}\S{S} - \BC{0 0 0}\BG{.7529 .7529 .7529}\H{P} +\def\CorrAnsButtonDefaults{% + \CA{\eq@local@CorrAnsButton}\W{1}\S{S} + \BC{0 0 0}\BG{.7529 .7529 .7529}\H{P} } \def\normalCABtnBC{0 0 0} \def\qCorrAnsButtonActionHook{\JS{% \ifx\@qzsolndest\@empty\else - if (event.shift)\jsR\jsT + if(event.shift)\jsR\jsT this.gotoNamedDest("\@qzsolndest");\jsR else {\jsR\jsT\fi % \end{macrocode} % The script for the \cs{CorrAnsButton} accommodates multi-letter variables % \begin{macrocode} -\ifShowAppr % dps17 +\ifShowAppr \ifarrowDelim - if (typeof event.target.appr=="undefined")\r\JST\t + if(typeof event.target.appr=="undefined")\r\JST\t event.target.appr=false;\r\JST event.target.appr=!event.target.appr;\r\JST - if (event.target.appr) {\r\t\JST - var _substVars=\indepVars;\r\t\JST - var _substAns=getSubstValue(_substVars,"\CorrectAns");\r\t\JST - var value=RespBoxAppr("\CorrectAns");\r\JST - } else value="\CorrectAns";\r\JST + if(event.target.appr) {\r\t\JST + var\eqSP_substVars=\indepVars;\r\t\JST + var\eqSP_substAns=getSubstValue(_substVars,"\CorrectAns");\r\t\JST + var\eqSP value=RespBoxAppr("\CorrectAns");\r\JST + } else\eqSP var\eqSP value="\CorrectAns";\r\JST \else - value="\CorrectAns";\r\JST + var\eqSP value="\CorrectAns";\r\JST \fi \else - value="\CorrectAns";\r\JST + var\eqSP value="\CorrectAns";\r\JST \fi \processJSfunc("Ans.\curr@quiz",value,\currQuiz);\r -\ifx\@qzsolndest\@empty\else % dps17 +\ifx\@qzsolndest\@empty\else }\fi }} - \def\sqCorrAnsButtonActionHook - {% - \JS{% % \end{macrocode} -% Allow local definition the reset color for response boxes. The reset color -% is normally black (\cs{eqDefaultColor}). Now if \cs{sqCorrAnsResetBC} is none -% empty, we put it in as a property of the \cs{oField} object. +% \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} +% \begin{macrocode} +\begin{defineJS}[\makeesc\!\makecmt\%]{\sqCorrAnsCode} +!ifx!@qzsolndest!@empty% +!processJSfunc("obj.!oField.!thequestionno","!CorrectAns",% +!currQuiz);!else% +if (event.shift) this.gotoNamedDest("!@qzsolndest"); +else !processJSfunc("obj.!oField.!thequestionno","!CorrectAns",% +!currQuiz);!fi +\end{defineJS} +\def\sqCorrAnsButtonActionHook{\JS{\sqCorrAnsCode}} +% \end{macrocode} +% \leavevmode\DescribeMacro{\CorrAnsButton} +% The definition of \cs{CorrAnsButton} % \begin{macrocode} - \ifx\@qzsolndest\@empty\else - if (event.shift)\jsR\jsT - this.gotoNamedDest("\@qzsolndest");\jsR - else\jsR\jsT - \fi - \processJSfunc("obj.\oField.\thequestionno","\CorrectAns",% -\currQuiz); - }% - } \newcommand\CorrAnsButton[1][]{\eq@@CorrAnsButton{#1}} \def\eq@@CorrAnsButton#1#2{\bgroup\makeJSspecials % 1/12 - \@ifstar{\eq@@@CorrAnsButton{#1}{#2}}{% - \eq@@@CorrAnsButton{#1}{#2}{DisplayAnswer}}% -} + \@ifstar{\eq@@@CorrAnsButton{#1}{#2}}{% + \eq@@@CorrAnsButton{#1}{#2}{DisplayAnswer}}} \def\eq@@@CorrAnsButton#1#2#3{\gdef\CorrectAns{#2}% - \def\processJSfunc{#3}\ifx\@qzsolndest\@empty\let\JST\@empty\else - \let\JST\jsT\fi % dps17 - \ifx\eq@ProcRespIntervals\g@processJSfunc % 01/11 - \let\@inmathwarn@SAVE\@inmathwarn\let\@inmathwarn\@gobble + \def\processJSfunc{#3}\ifx\@qzsolndest\@empty\let\JST\@empty\else + \let\JST\jsT\fi % dps17 + \ifx\eq@ProcRespIntervals\g@processJSfunc % 01/11 + \let\@inmathwarn@SAVE\@inmathwarn\let\@inmathwarn\@gobble % \end{macrocode} % When the response function is \texttt{ProcRespIntervals}, there may be unbalanced parentheses, we'll % pass \cs{CorrectAns} through \cs{pdfstringdef} to escape them. % \begin{macrocode} - \pdfstringdef{\CorrectAns}{\CorrectAns}% - \let\@inmathwarn\@inmathwarn@SAVE\fi + \pdfstringdef{\CorrectAns}{\CorrectAns}% + \let\@inmathwarn\@inmathwarn@SAVE\fi \if\eqQuizType\isQZ\def\Fld@name{corr.\curr@quiz.\thequestionno}% \else\def\Fld@name{corr.\oField.\thequestionno}\fi \if\eqQuizType\isQZ - \edef\@@CorrAnsButtonActions{\noexpand\F{\FHidden}% - \ifx\@qzsolndest\@empty%\noexpand\BC{\normalCABtnBC}% - \else\noexpand\BC{\solution@Color}\fi - \noexpand\A{\noexpand\qCorrAnsButtonActionHook}}% - \ifeq@noquizsolutions\else % dps17 (\let\rpl\eq@rpl) - \mbox{\let\rpl\eq@rpl - \push@@Button{#1}{\Fld@name}{}{\DefaultHeightOfWidget}% - {\eq@protect\A}{\eq@setButtonProps\eq@Button@driver}% - {\CorrAnsButtonDefaults\@@CorrAnsButtonActions - \every@ButtonField\every@CorrAnsButton}}% - \fi + \edef\@@CorrAnsButtonActions{\noexpand\F{\FHidden}% + \ifx\@qzsolndest\@empty%\noexpand\BC{\normalCABtnBC}% + \else\noexpand\BC{\solution@Color}\fi + \noexpand\A{\noexpand\qCorrAnsButtonActionHook}}% + \ifeq@noquizsolutions\else % dps17 (\let\rpl\eq@rpl) + \mbox{\let\rpl\eq@rpl + \push@@Button{#1}{\Fld@name}{}{\DefaultHeightOfWidget}% + {\eq@protect\A}{\eq@setButtonProps\eq@Button@driver}% + {\CorrAnsButtonDefaults\@@CorrAnsButtonActions + \every@ButtonField\every@CorrAnsButton}}% + \fi \else \edef\@@CorrAnsButtonActions{% \ifx\@qzsolndest\@empty%\noexpand\BC{\normalCABtnBC} \else\noexpand\BC{\solution@Color}\fi \noexpand\A{\noexpand\sqCorrAnsButtonActionHook}}% \mbox{\push@@Button{#1}{\Fld@name}{}{\DefaultHeightOfWidget}% - {\eq@protect\A}{\eq@setButtonProps\eq@Button@driver}% - {\CorrAnsButtonDefaults\@@CorrAnsButtonActions - \every@ButtonField\every@CorrAnsButton}}% + {\eq@protect\A}{\eq@setButtonProps\eq@Button@driver}% + {\CorrAnsButtonDefaults\@@CorrAnsButtonActions + \every@ButtonField\every@CorrAnsButton}}% \fi \egroup } @@ -9003,41 +9138,40 @@ if (!isQuizInitialized("@currQuiz")) { } % \end{macrocode} % In an attempt to supply some custom colors for the shortquiz, we -% define \cmd{\sqRespBoxResetColor}. It determines the clear -% \begin{macrocode} -\def\@@sqClearButtonActions -{% - \A{\JS{ProcessIt = false;\jsR - if ( typeof \oField\space== "undefined" )\jsR\jsT - \oField\space= new Object;\jsR - if (typeof appAlerts["\oField"] == "undefined")\jsR\jsT - appAlerts["\oField"] = new Object;\jsR - this.resetForm(new Array("mc.\oField","obj.\oField",% - "tally.\oField","grpobj.\oField"));\jsR - var f = this.getField("obj.\oField");\jsR +% 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;\jsR - f = this.getField("grpobj.\oField");\jsR - if ( f != null ) f.strokeColor=\ifx\defaultColorJSLoc\@empty -\defaultColorJS\else\defaultColorJSLoc\fi;\jsR - f = this.getField("rbmarkup.\oField");\jsR - if ( f != null ) f.display=display.hidden;\jsR - \oField.Grp = {};\jsR - appAlerts["\oField"].bAfterValue=false;\jsR - ProcessIt=true;}% - } -} -\newcommand\sqClearButton[1][] -{% - \mbox{\push@@Button{#1}{clear.\oField}{}{\DefaultHeightOfWidget}% - {\eq@protect\A}{\eq@setButtonProps\eq@Button@driver}% - {\sqClearButtonDefaults\@@sqClearButtonActions\every@ButtonField - \every@sqClearButton}}% +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} @@ -9048,49 +9182,43 @@ if (!isQuizInitialized("@currQuiz")) { % the student cannot enter another answer in the text field, and the input that is already % there will be the one that is counted has the student's response. % \begin{macrocode} -\def\PromptButtonDefaults -{% - \CA{\eq@local@CorrAnsButton}\W{1}\S{S}\BC{0 0 0} - \BG{.7529 .7529 .7529}\H{P} +\def\PromptButtonDefaults{% + \CA{\eq@local@CorrAnsButton}\W{1}\S{S}\BC{0 0 0} + \BG{.7529 .7529 .7529}\H{P} } \newcommand{\promptButtonMsg}{% - "Would you like to see the correct answer at this time? "\r\t\t - + "Your current answer will be the one that will be scored. "\r\t\t - + "If you click on \\"Yes\\", - you will not be able to change your answer." + "Would you like to see the correct answer at this time? "\r\t\t + + "Your current answer will be the one that will be scored. "\r\t\t + + "If you click on \\"Yes\\", + you will not be able to change your answer." } \newcommand{\AnsPromptBtnStr}{Answer:\space} -\def\PromptButtonActionHook -{% - \JS{% - if (!isQuizInitialized("\currQuiz")) {\r\t - eqAppAlert(InitMsg("\bqlabelISO"),3);\r\t - event.rc=false;\r - } else {\r\t - if ( !\currQuiz.oAlertCheck.bAfterValue ) {\r\t - var resp=eqAppAlert({\r\t\t - cMsg:\promptButtonMsg,\r\t\t - nIcon: 2, nType: 2,\r\t\t - cTitle: ("AcroTeX Prompt Message"),\r\t\t - oCheckbox: \currQuiz.oAlertCheck\r\t - });\r\t - }\r +\begin{defineJS}[\makeesc\*\makecmt\%]{\PromptButtonActionCode} +if (!isQuizInitialized("*currQuiz")) { + eqAppAlert(InitMsg("*bqlabelISO"),3); + event.rc=false; +} else { + if ( !*currQuiz.oAlertCheck.bAfterValue ) { + var resp=eqAppAlert({ + cMsg:*promptButtonMsg, + nIcon: 2, nType: 2, + cTitle: ("AcroTeX Prompt Message"), + oCheckbox: *currQuiz.oAlertCheck + }); + } % \end{macrocode} % Correction to the if condition below % \changes{v7.8d}{2017/01/11}{Correction to the if condition in \string\cs{PromptButtonActionHook}} % \begin{macrocode} - if ( promptQuiz.oAlertCheck.bAfterValue || resp==4 )\r\t - {\r\t\t - var field=this.getField(% - "obj.\currQuiz.\thequestionno");\r\t\t - field.readonly=true;\r\t\t - field=this.getField("Ans.\currQuiz");\r\t\t - if (field!=null) - field.value = "\AnsPromptBtnStr\PromptAns";\r\t - }\r - } - }% + if ( promptQuiz.oAlertCheck.bAfterValue || resp==4 ) { + var field=this.getField("obj.*currQuiz.*thequestionno"); + field.readonly=true; + field=this.getField("Ans.*currQuiz"); + if (field!=null) field.value = ("*AnsPromptBtnStr*PromptAns"); + } } +\end{defineJS} +\def\PromptButtonActionHook{\JS{\PromptButtonActionCode}} % \end{macrocode} % This button takes the standard two arguments % \begin{flushleft} @@ -9098,22 +9226,21 @@ if (!isQuizInitialized("@currQuiz")) { % \texttt{\#2}: Prompt answer % \end{flushleft} % \begin{macrocode} -\newcommand\@PromptButton[2][] -{% - \def\PromptAns{#2}\if\eqQuizType\isQZ - \def\Fld@name{promptButton.\curr@quiz.\thequestionno}% - \else\def\Fld@name{promptButton.\oField.\thequestionno}\fi - \if\eqQuizType\isQZ - \def\@@PromptButtonActions{% - \A{\PromptButtonActionHook}}% - \mbox{\push@@Button{#1}{\Fld@name}{}% - {\DefaultHeightOfWidget}{\eq@protect\A}% - {\eq@setButtonProps\eq@Button@driver}% - {\PromptButtonDefaults\@@PromptButtonActions - \every@ButtonField\every@CorrAnsButton}}% - \else\PackageWarning{exerquiz}{The \string\PromptButton - is for quiz questions only.} - \fi +\newcommand\@PromptButton[2][]{% + \def\PromptAns{#2}\if\eqQuizType\isQZ + \def\Fld@name{promptButton.\curr@quiz.\thequestionno}% + \else\def\Fld@name{promptButton.\oField.\thequestionno}\fi + \if\eqQuizType\isQZ + \def\@@PromptButtonActions{% + \A{\PromptButtonActionHook}}% + \mbox{\push@@Button{#1}{\Fld@name}{}% + {\DefaultHeightOfWidget}{\eq@protect\A}% + {\eq@setButtonProps\eq@Button@driver}% + {\PromptButtonDefaults\@@PromptButtonActions + \every@ButtonField\every@CorrAnsButton}}% + \else\PackageWarning{exerquiz}{The \string\PromptButton + is for quiz questions only.} + \fi } % \end{macrocode} % \end{macro} @@ -9122,7 +9249,7 @@ if (!isQuizInitialized("@currQuiz")) { % \cs{CorrAnsButton} as the answer provided by the author. % \begin{macrocode} \newcommand{\PromptButton}{\makebox[0pt][r] % assumes xcolor - {\@PromptButton[\textColor{1 0 0 rg}]{\CorrectAns}}} + {\@PromptButton[\textColor{1 0 0 rg}]{\CorrectAns}}} % \end{macrocode} % \begin{environment}{mathGrp} % An environment for enclosing a collection of math/text fill-ins that are to be grouped @@ -9138,162 +9265,128 @@ if (!isQuizInitialized("@currQuiz")) { % \begin{macrocode} \let\eq@ansGrpArray\@empty \def\eq@recordGrpAnsArray#1{% - \ifx\eq@ansGrpArray\@empty - \edef\tmp@exp{\noexpand\g@addto@macro - \noexpand\eq@ansGrpArray{#1}}\else - \edef\tmp@exp{\noexpand\g@addto@macro - \noexpand\eq@ansGrpArray{,#1}}\fi - \tmp@exp + \ifx\eq@ansGrpArray\@empty + \edef\tmp@exp{\noexpand\g@addto@macro + \noexpand\eq@ansGrpArray{#1}}\else + \edef\tmp@exp{\noexpand\g@addto@macro + \noexpand\eq@ansGrpArray{,#1}}\fi + \tmp@exp } \let\grpquestions\eq@Zero \def\mathGrp{\global\let\eq@ansGrpArray\@empty - \@ifnextchar[{\@imathGrp}{\@imathGrp[groupEval]}} + \@ifnextchar[{\@imathGrp}{\@imathGrp[groupEval]}} \def\@imathGrp[#1]{\def\argi{#1}% - \@ifnextchar[{\@iimathGrp}{\@iimathGrp[]}} + \@ifnextchar[{\@iimathGrp}{\@iimathGrp[]}} \def\@iimathGrp[#1]{\def\argii{#1}% - \eq@AddProbToQzQuesList - \global\let\grpquestions\eq@One - \setcounter{grpquestionno}{0}% - \stepcounter{questionno}% - \xdef\beginGrp{\thequestionno}% - \xdef\grpPointValue{\eqPTs}% - \eq@recordThesePTs\eq@recordProbType - \if\eqQuizType\isQZ - \edef\eqtmp{\aPointType}% - \xdef\aPointType{\eqtmp,[\eqPTs,"grp"]}\fi - \addtocounter{eqpointvalue}{\eqPTs}% - \ifx\argii\@empty - \xdef\grpTotalWeight{\eqPTs}% - \xdef\grpEvalFunction{\argi}% - \else - \xdef\grpTotalWeight{\argi}% - \xdef\grpEvalFunction{\argii}% - \fi + \eq@AddProbToQzQuesList + \global\let\grpquestions\eq@One + \setcounter{grpquestionno}{0}% + \stepcounter{questionno}% + \xdef\beginGrp{\thequestionno}% + \xdef\grpPointValue{\eqPTs}% + \eq@recordThesePTs\eq@recordProbType + \if\eqQuizType\isQZ + \edef\eqtmp{\aPointType}% + \xdef\aPointType{\eqtmp,[\eqPTs,"grp"]}\fi + \addtocounter{eqpointvalue}{\eqPTs}% + \ifx\argii\@empty + \xdef\grpTotalWeight{\eqPTs}% + \xdef\grpEvalFunction{\argi}% + \else + \xdef\grpTotalWeight{\argi}% + \xdef\grpEvalFunction{\argii}% + \fi } \def\endmathGrp{\global\let\grpquestions\eq@Zero - \eq@recordCorrAns{[\eq@ansGrpArray]}% - \xdef\endGrp{\thequestionno}} + \eq@recordCorrAns{[\eq@ansGrpArray]}% + \xdef\endGrp{\thequestionno}} % \end{macrocode} % \end{environment} % \begin{macro}{\CorrAnsButtonGrp} % The correct answer button for grouped questions. +% \changes{v8.6}{2020/11/29}{Action for group answer btn now a \string\env{defineJS} env} % \begin{macrocode} -\def\CorrAnsButtonGrpDefaults -{% - \CA{\eq@local@CorrAnsButton}\W{1}\S{S}\BC{0 0 0} - \BG{.7529 .7529 .7529}\H{P} +\def\CorrAnsButtonGrpDefaults{% + \CA{\eq@local@CorrAnsButton}\W{1}\S{S}\BC{0 0 0} + \BG{.7529 .7529 .7529}\H{P} } -\def\CorrAnsButtonGrpActionHook{\JS{% -\ifx\@qzsolndest\@empty\else - if (event.shift)\jsR\jsT - this.gotoNamedDest("\@qzsolndest");\jsR - else\jsR -\fi - {\jsR\jsT - var aCorrectAns=\CorrectAns;\jsR\jsT - var beginGrp = 1;\jsR\jsT - grpOffset = beginGrp;\jsR\jsT -% if ( typeof \currQuiz == "undefined" ) {\jsR\jsT\jsT -% \currQuiz = new Object;\jsR\jsT\jsT -% \currQuiz.Grp = {};\jsR\jsT -% }\jsR\jsT - if ( \currQuiz.Grp==null ) \currQuiz.Grp = {};\jsR\jsT - if (typeof \currQuiz.Grp["\thequestionno"]=="undefined")\jsR\jsT - {\jsR\jsT\jsT - \currQuiz.Grp["\thequestionno"] = {offset: 0};\jsR\jsT\jsT - var f = this.getField(% - "grpobj.\curr@quiz.\thequestionno." - + grpOffset)\jsR\jsT\jsT +\begin{defineJS}[\makeesc\!\makecmt\%]{\cabGrpActn} +!ifx!@qzsolndest!@empty!else% +if (event.shift) this.gotoNamedDest("!@qzsolndest"); +else !fi% +{ + var aCorrectAns=!CorrectAns; + var beginGrp=1; + var grpOffset=beginGrp; + if(!currQuiz.Grp==null)!currQuiz.Grp={}; + if(typeof !currQuiz.Grp["!thequestionno"]=="undefined") + { + !currQuiz.Grp["!thequestionno"]={offset:0}; + } else { + !currQuiz.Grp["!thequestionno"].offset=% +++(!currQuiz.Grp["!thequestionno"].offset)!%aCorrectAns.length; + grpOffset=beginGrp% ++!currQuiz.Grp["!thequestionno"].offset; + } + var f=this.getField("grpobj.!curr@quiz.!thequestionno." % ++ grpOffset); % \end{macrocode} % When the field is readonly, then we cannot set the focus. We'll remove the readonly, set focus, then -% reset readonly to true again; however, we must wait a little for \texttt{setFocus} to finish. -% \begin{macrocode} - if ( f.readonly ) {\jsR\jsT\jsT - f.readonly = false;\jsR\jsT\jsT - f.setFocus();\jsR\jsT\jsT - eqDelay = app.setTimeOut(% - "f.readonly = true; - app.clearTimeOut(eqDelay);",10);\jsR\jsT - } else f.setFocus();\jsR\jsT - }\jsR\jsT - else \jsR\jsT - {\jsR\jsT\jsT - \currQuiz.Grp["\thequestionno"].offset = - ++\currQuiz.Grp["\thequestionno"].offset - \% aCorrectAns.length;\jsR\jsT\jsT - grpOffset = beginGrp - + \currQuiz.Grp["\thequestionno"].offset;\jsR\jsT\jsT - var f = this.getField("grpobj.\curr@quiz.\thequestionno." - + grpOffset);\jsR\jsT\jsT - if ( f.readonly ) {\jsR\jsT\jsT - f.readonly = false;\jsR\jsT\jsT - f.setFocus();\jsR\jsT\jsT - eqDelay = app.setTimeOut("f.readonly = true; - app.clearTimeOut(eqDelay);",10);\jsR\jsT - } else f.setFocus();\jsR\jsT - }\jsR\jsT -\if\eqQuizType\isQZ - DisplayAnswer("Ans.\curr@quiz", - aCorrectAns[\currQuiz.Grp["\thequestionno"].offset],% -\currQuiz); -%\ifx\sqCorrAnsResetBC\@empty\else,\currQuiz\fi);\jsR -\else -% \end{macrocode} -% Allow local definition the reset color for response boxes. The reset color -% is normally black (\cs{eqDefaultColor}). Now if \cs{sqCorrAnsResetBC} is none -% empty, we put it in as a property of the \cs{oField} object. -% \begin{macrocode} -%\ifx\sqCorrAnsResetBC\@empty\else -% if ( typeof \oField=="undefined")\jsR\jsT\jsT -% var \oField = new Object;\jsR\jsT -% \oField.CorrAnsResetBC=\sqCorrAnsResetBC;\jsR\jsT -%\fi - DisplayAnswer("grpobj.\oField.\thequestionno."+ grpOffset, - aCorrectAns[\currQuiz.Grp["\thequestionno"].offset],% -\oField);\jsR -\fi - } -}} -\newcommand\CorrAnsButtonGrp[2][] -{% - \makeStringArray{#2}% - \edef\CorrectAns{\stringArray}% - \if\eqQuizType\isQZ\def\Fld@name{corr.\curr@quiz.\thequestionno}% - \else\edef\currQuiz{\oField}% +% reset readonly to true again; however, we must wait a little for !texttt{setFocus} to finish. +% \begin{macrocode} + if(f.readonly){ + f.readonly=false; + f.setFocus(); + eqDelay=app.setTimeOut(% +"f.readonly=true;app.clearTimeOut(eqDelay);",10); + } else f.setFocus(); +!if!eqQuizType!isQZ% + DisplayAnswer("Ans.!curr@quiz",% +aCorrectAns[!currQuiz.Grp["!thequestionno"].offset],!currQuiz);!else% + DisplayAnswer("grpobj.!oField.!thequestionno."+ grpOffset,% +aCorrectAns[!currQuiz.Grp["!thequestionno"].offset],!oField);!fi +} +\end{defineJS} +\def\CorrAnsButtonGrpActionHook{\JS{\cabGrpActn}} +\newcommand\CorrAnsButtonGrp[2][]{% + \makeStringArray{#2}% + \edef\CorrectAns{\stringArray}% + \if\eqQuizType\isQZ\def\Fld@name{corr.\curr@quiz.\thequestionno}% + \else\edef\currQuiz{\oField}% \def\Fld@name{corr.\oField.\thequestionno}\fi - \if\eqQuizType\isQZ - \edef\@@CorrAnsButtonGrpActions{\noexpand\F{\FHidden}% - \ifx\@qzsolndest\@empty%\noexpand\BC{\normalCABtnBC} - \else\noexpand\BC{\solution@Color}\fi - \noexpand\A{\noexpand\CorrAnsButtonGrpActionHook}}% - \ifeq@noquizsolutions\else - \mbox{\push@@Button{#1}{\Fld@name}{}{\DefaultHeightOfWidget}% - {\eq@protect\A}{\eq@setButtonProps\eq@Button@driver}% - {\CorrAnsButtonGrpDefaults\@@CorrAnsButtonGrpActions - \every@ButtonField\every@CorrAnsButton}}% - \fi - \else - \edef\@@CorrAnsButtonGrpActions{% - \ifx\@qzsolndest\@empty%\noexpand\BC{\normalCABtnBC} - \else\noexpand\BC{\solution@Color}\fi - \noexpand\A{\noexpand\CorrAnsButtonGrpActionHook}}% - \mbox{\push@@Button{#1}{\Fld@name}{}{\DefaultHeightOfWidget}% - {\eq@protect\A}{\eq@setButtonProps\eq@Button@driver}% - {\CorrAnsButtonGrpDefaults\@@CorrAnsButtonGrpActions - \every@ButtonField\every@CorrAnsButton}}% - \fi + \if\eqQuizType\isQZ + \edef\@@CorrAnsButtonGrpActions{\noexpand\F{\FHidden}% + \ifx\@qzsolndest\@empty + \else\noexpand\BC{\solution@Color}\fi + \noexpand\A{\noexpand\CorrAnsButtonGrpActionHook}}% + \ifeq@noquizsolutions\let\x\relax\else + \def\x{\mbox{\push@@Button{#1}{\Fld@name}{}% + {\DefaultHeightOfWidget}{\eq@protect\A}% + {\eq@setButtonProps\eq@Button@driver}% + {\CorrAnsButtonGrpDefaults\@@CorrAnsButtonGrpActions + \every@ButtonField\every@CorrAnsButton}}}\fi\x + \else + \edef\@@CorrAnsButtonGrpActions{% + \ifx\@qzsolndest\@empty%\noexpand\BC{\normalCABtnBC} + \else\noexpand\BC{\solution@Color}\fi + \noexpand\A{\noexpand\CorrAnsButtonGrpActionHook}}% + \mbox{\push@@Button{#1}{\Fld@name}{}{\DefaultHeightOfWidget}% + {\eq@protect\A}{\eq@setButtonProps\eq@Button@driver}% + {\CorrAnsButtonGrpDefaults\@@CorrAnsButtonGrpActions + \every@ButtonField\every@CorrAnsButton}}% + \fi } \def\makeStringArray#1{\def\stringArray{[}\@makeStringArray#1,\@nil} \def\@makeStringArray#1,#2\@nil{% - \edef\eq@temp{\stringArray}\def\argii{#2}% - \ifx\argii\@empty - \edef\stringArray{\eq@temp"#1"]}% - \def\eq@next{}% - \else - \edef\stringArray{\eq@temp"#1",}% - \def\eq@next{\@makeStringArray#2\@nil}% - \fi - \eq@next + \edef\eq@temp{\stringArray}\def\argii{#2}% + \ifx\argii\@empty + \edef\stringArray{\eq@temp"#1"]}% + \def\eq@next{}% + \else + \edef\stringArray{\eq@temp"#1",}% + \def\eq@next{\@makeStringArray#2\@nil}% + \fi + \eq@next } % \end{macrocode} % \end{macro} @@ -9314,15 +9407,14 @@ if (!isQuizInitialized("@currQuiz")) { \let\@currentQues\@empty \let\eqQzQuesList\@empty \def\eq@AddProbToQzQuesList{% - \edef\eq@tmpExp{\noexpand\g@addto@macro% + \edef\eq@tmpExp{\noexpand\g@addto@macro% % \end{macrocode} % Cosmetic change replaced \cs{noexpand} with \cs{string}. % \changes{v8.2.15}{2019/08/06}{replace \string\cs{noexpand} with \string\cs{string}} % \changes{v8.5.4}{2019/11/03}{Reverted to \string\cs{noexpand}} % \begin{macrocode} - \noexpand\eqQzQuesList{\noexpand - \@eqListExp{\@currentQues}{\the\c@page}}}% -% \@eqListExp{\@currentQues}{\thepage}}}% + \noexpand\eqQzQuesList{\noexpand + \@eqListExp{\@currentQues}{\the\c@page}}}% % \end{macrocode} % We add to the list only if we are not within a \texttt{mathGrp} environment. % \begin{macrocode} @@ -9348,9 +9440,9 @@ if (!isQuizInitialized("@currQuiz")) { % the page that contains the button, the JS is executes. % \begin{macrocode} \def\pbPopulateSumTable{\pushButton[\W0\BG{}\BC{}\S{S}\autoCenter{n} - \TU{\thequestionno}\Ff{\FfReadOnly} - \AA{\AAPageVisible{try{popVisitsTbl("\currQuiz",\thequestionno)}% - catch(e){}}}]{\currQuiz activateSC}{0pt}{0pt}} + \TU{\thequestionno}\Ff{\FfReadOnly} + \AA{\AAPageVisible{try{popVisitsTbl("\currQuiz",\thequestionno)}% + catch(e){}}}]{\currQuiz activateSC}{0pt}{0pt}} % \end{macrocode} % (2013/12/29) Here are some ideas to think about. Each change in the response to a question % can execute the following code. I've put the needed information in the tooltip @@ -9411,28 +9503,28 @@ if (!isQuizInitialized("@currQuiz")) { %\end{description} % \begin{macrocode} \define@key{smrytbl}{ntables}{% - \@tempcntb=#1 - \ifnum\@tempcntb<1 \@tempcntb=1 \fi - \ifnum\@tempcntb>3 \@tempcntb=3 \fi - \edef\smrytbl@ntables{\the\@tempcntb}% + \@tempcntb=#1 + \ifnum\@tempcntb<\@ne\@tempcntb=\@ne\fi + \ifnum\@tempcntb>\thr@@\@tempcntb=\thr@@\fi + \edef\smrytbl@ntables{\the\@tempcntb}% } \def\smrytbl@ntables{2} \define@key{smrytbl}{showmarkup}[true]{% - \csname if#1\endcsname\eqshowmarkuptrue - \else\eqshowmarkupfalse\fi + \csname if#1\endcsname\eqshowmarkuptrue + \else\eqshowmarkupfalse\fi } \newif\ifsmrytbl@corrections\smrytbl@correctionstrue \define@key{smrytbl}{nocorrections}[true]{% - \csname if#1\endcsname\smrytbl@correctionsfalse - \else\smrytbl@correctionstrue\fi + \csname if#1\endcsname\smrytbl@correctionsfalse + \else\smrytbl@correctionstrue\fi } \define@key{smrytbl}{showOutOf}[true]{% - \csname if#1\endcsname\eqshowOutOftrue\def\stfmtType{OO}% - \gdef\showOutOfinSmryTbl{true}\let\stmarkupbox\relax - \else - \eqshowOutOffalse\let\stfmtType\@empty - \gdef\showOutOfinSmryTbl{false}% - \fi + \csname if#1\endcsname\eqshowOutOftrue\def\stfmtType{OO}% + \gdef\showOutOfinSmryTbl{true}\let\stmarkupbox\relax + \else + \eqshowOutOffalse\let\stfmtType\@empty + \gdef\showOutOfinSmryTbl{false}% + \fi } \let\stfmtType\@empty \define@key{smrytbl}{setDimens}[]{#1} @@ -9442,61 +9534,60 @@ if (!isQuizInitialized("@currQuiz")) { % Finally we come to the definition of \cs{displaySumryTbl}. % \begin{macrocode} \newcommand{\displaySumryTbl}[2][]{% - \begingroup\edef\currQuiz{#2}\edef\oField{#2}\edef\curr@quiz{#2}% - \setkeys{smrytbl}{#1}% - \eqtmpcnta\smrytbl@ntables\relax + \begingroup\edef\currQuiz{#2}\edef\oField{#2}\edef\curr@quiz{#2}% + \setkeys{smrytbl}{#1}% + \eqtmpcnta\smrytbl@ntables\relax % \end{macrocode} % We accept only 1 or 2 as an argument, we put it in \cs{count0}, % if not an integer, we'll stop the compile. If the argument is not 1, % we force a value of 2. % \begin{macrocode} -% \ifnum\eqtmpcnta=\@ne\else\eqtmpcnta\tw@\fi - \eq@rowcnt\z@\@tempcntb=\value{questionno}% + \eq@rowcnt\z@\@tempcntb=\value{questionno}% % \end{macrocode} % We calculate the number of rows in the first column, in case % of a two column table. When the number of questions is odd, % the the left-hand table will have one more entry than the right-hand % column. % \begin{macrocode} - \ifnum\eqtmpcnta=\tw@ - \divide\@tempcntb\tw@ - \advance\@tempcntb\ifodd\value{questionno}2\else1\fi - \xdef\@beginSecCol{\the\@tempcntb}% - \advance\@tempcntb-1\relax - \fi + \ifnum\eqtmpcnta=\tw@ + \divide\@tempcntb\tw@ + \advance\@tempcntb\ifodd\value{questionno}\tw@\else\@ne\fi + \xdef\@beginSecCol{\the\@tempcntb}\advance + \@tempcntb\m@ne + \fi % \end{macrocode} % Three table support % \begin{macrocode} - \ifnum\eqtmpcnta=\thr@@ - \edef\eq@n{\the\@tempcntb}% - \divide\@tempcntb\eqtmpcnta - \edef\eq@q{\the\@tempcntb}% - \@tempcnta=\@tempcntb\multiply\@tempcnta3 - \edef\eq@p{\the\@tempcnta}% - \@tempcnta=\eq@n - \advance\@tempcnta-\eq@p\relax - \ifnum\@tempcnta=\z@ - \@tempcntb=\eq@q \advance\@tempcntb\@ne - \xdef\@beginSecCol{\the\@tempcntb}% - \advance\@tempcntb\eq@q\relax - \xdef\@beginThrdCol{\the\@tempcntb}% - \else\ifnum\@tempcnta=\@ne - \@tempcntb=\eq@q \advance\@tempcntb\@ne - \edef\nB@lCols{\the\@tempcntb}% - \advance\@tempcntb\@ne - \xdef\@beginSecCol{\the\@tempcntb}% - \advance\@tempcntb\eq@q\relax - \xdef\@beginThrdCol{\the\@tempcntb}% - \else\ifnum\@tempcnta=2\relax - \@tempcntb=\eq@q \advance\@tempcntb1 - \edef\nB@lCols{\the\@tempcntb}% - \advance\@tempcntb\@ne - \xdef\@beginSecCol{\the\@tempcntb}% - \advance\@tempcntb\nB@lCols - \xdef\@beginThrdCol{\the\@tempcntb}% - \fi\fi\fi - \@tempcntb=\eq@n - \fi + \ifnum\eqtmpcnta=\thr@@ + \edef\eq@n{\the\@tempcntb}% + \divide\@tempcntb\eqtmpcnta + \edef\eq@q{\the\@tempcntb}% + \@tempcnta=\@tempcntb\multiply\@tempcnta3 + \edef\eq@p{\the\@tempcnta}% + \@tempcnta=\eq@n + \advance\@tempcnta-\eq@p\relax + \ifnum\@tempcnta=\z@ + \@tempcntb=\eq@q \advance\@tempcntb\@ne + \xdef\@beginSecCol{\the\@tempcntb}% + \advance\@tempcntb\eq@q\relax + \xdef\@beginThrdCol{\the\@tempcntb}% + \else\ifnum\@tempcnta=\@ne + \@tempcntb=\eq@q \advance\@tempcntb\@ne + \edef\nB@lCols{\the\@tempcntb}% + \advance\@tempcntb\@ne + \xdef\@beginSecCol{\the\@tempcntb}% + \advance\@tempcntb\eq@q\relax + \xdef\@beginThrdCol{\the\@tempcntb}% + \else\ifnum\@tempcnta=\tw@ + \@tempcntb=\eq@q \advance\@tempcntb\@ne + \edef\nB@lCols{\the\@tempcntb}% + \advance\@tempcntb\@ne + \xdef\@beginSecCol{\the\@tempcntb}% + \advance\@tempcntb\nB@lCols + \xdef\@beginThrdCol{\the\@tempcntb}% + \fi\fi\fi + \@tempcntb=\eq@n + \fi % \end{macrocode} % We \cs{let} \cs{@eqListExp} to \cs{@@eqListExp}, defined below. % \begin{macrocode} @@ -9513,9 +9604,9 @@ if (!isQuizInitialized("@currQuiz")) { % This is a definition of \cs{@eqListExp}. It appears in the % token list \cs{eqQzQuesList}. A typical entry in \cs{eqQzQuesList} is % of the form -%\begin{verbatim} -% \@eqListExp{<question_label>}{\thepage} -%\end{verbatim} +%\begin{quote}\ttfamily +%\string\@eqListExp\darg{\ameta{question\_label}}\darg{\string\thepage} +%\end{quote} % We use the two arguments to construct a table of three columns: Question (consisting % of the question label); Responded (a checkbox that is checked if that question was answered); % and Page (a hypertext link to the page containing he question). The command may be redefined @@ -9525,8 +9616,8 @@ if (!isQuizInitialized("@currQuiz")) { % headings (may be redefined). % \begin{macrocode} \def\eq@begintab{% - \begin{tabular}[t]{lcc}\sumryTblQ&\sumryTblR&\sumryTblP\\\sthline - {\Large\strut}} + \begin{tabular}[t]{lcc}\sumryTblQ&\sumryTblR&\sumryTblP\\\sthline + {\Large\strut}} % \end{macrocode} % \DescribeMacro{\sthline}\cmd{\sthline} % is a user hook to change the appearance of the horizontal line, such @@ -9563,12 +9654,13 @@ if (!isQuizInitialized("@currQuiz")) { % and stMarkup text field. % \begin{macrocode} \def\st@scndclmn{% - \checkBox[\Ff{\FfReadOnly}]% - {\ccatCurrQzWith(SanityCheck).\the\eq@rowcnt}% - {\markupHeight}{\markupHeight}{Yes}\ifeqshowmarkup - \stmarkupbox{\sumrytblCkMUsep\textField[% - \Ff\FfReadOnly\BC{}\textColor{\pcMarkupColor}% - \textSize{\stmarkupTextSize}\autoCenter{n}% + \checkBox[\Ff{\FfReadOnly}] + {\ccatCurrQzWith(SanityCheck).\the\eq@rowcnt} + {\markupHeight}{\markupHeight}{Yes}% + \ifeqshowmarkup + \stmarkupbox{\sumrytblCkMUsep\textField[% + \Ff\FfReadOnly\BC{}\textColor{\pcMarkupColor} + \textSize{\stmarkupTextSize}\autoCenter{n}] % \end{macrocode} % Key to being able to have duplicated summary fields with different \texttt{showOutOf} % options is the naming of the text field. If \texttt{showOutOf=false}, the default, @@ -9576,18 +9668,19 @@ if (!isQuizInitialized("@currQuiz")) { % text field is named \cs{currQuizSanityCheckOOPts}. When the Correct button is pressed, % the JavaScript function \texttt{correctSumryTbl()} checks for the existence of each of % these two fields, and populates them properly formatted. The command \cs{stfmtType} is -% either \cs{empty} or \cs{OO}. +% either \cs{@empty} or \cs{OO}. % \begin{macrocode} - ]{\ccatCurrQzWith(SanityCheck\stfmtType Pts).\the\eq@rowcnt}% - {\stmarkupWidth}{\stmarkupHeight}}\fi + {\ccatCurrQzWith(SanityCheck\stfmtType Pts).\the\eq@rowcnt}% + {\stmarkupWidth}{\stmarkupHeight}}% + \fi } % \end{macrocode} % \textbf{Third column.} The third column of the table consisting of a link to the % page that contains the question. % \begin{macrocode} \def\st@thrdclmn#1{% - \setLink[\linktxtcolor{\@linkcolor} - \A{\JS{this.pageNum=(#1-1)}}]{\sumrytbllinkHook{#1}}} + \setLink[\linktxtcolor{\@linkcolor} + \A{\JS{this.pageNum=(#1-1)}}]{\sumrytbllinkHook{#1}}} % \end{macrocode} % Now for the definition of \cs{@@eqListExp} which does the work in the table. % \begin{macrocode} @@ -9597,20 +9690,20 @@ if (!isQuizInitialized("@currQuiz")) { % when the page becomes visible, and we expand \cs{eq@begintab}, which % is a \texttt{tabular} environment. % \begin{macrocode} - \ifnum\eq@rowcnt=\@ne - \pbPopulateSumTable\ifsmrytbl@corrections\else - \pbDoNoCorrectSumryTbl\fi\expandafter\eq@begintab\fi + \ifnum\eq@rowcnt=\@ne + \pbPopulateSumTable\ifsmrytbl@corrections\else + \pbDoNoCorrectSumryTbl\fi\expandafter\eq@begintab\fi % \end{macrocode} % If it is the two table solution, and the row number equals the calculated % value of the first row of the second table, we emit another % \cs{eq@begintab}. % \begin{macrocode} - \ifnum\eqtmpcnta>\@ne\ifnum\eq@rowcnt=\@beginSecCol\relax - \eq@endtab\expandafter\sumrytablesep\expandafter\eq@begintab - \fi\fi - \ifnum\eqtmpcnta=\thr@@\ifnum\eq@rowcnt=\@beginThrdCol\relax - \eq@endtab\expandafter\sumrytablesep\expandafter\eq@begintab - \fi\fi + \ifnum\eqtmpcnta>\@ne\ifnum\eq@rowcnt=\@beginSecCol\relax + \eq@endtab\expandafter\sumrytablesep\expandafter\eq@begintab + \fi\fi + \ifnum\eqtmpcnta=\thr@@\ifnum\eq@rowcnt=\@beginThrdCol\relax + \eq@endtab\expandafter\sumrytablesep\expandafter\eq@begintab + \fi\fi % \end{macrocode} % We layout a row of the table, problem label, checkbox, and page. % \begin{macrocode} @@ -9619,9 +9712,7 @@ if (!isQuizInitialized("@currQuiz")) { % We set the \cs{eq@endtab} at the bottom of the first table, % and at the bottom of the second table. % \begin{macrocode} -% \ifnum\count0=\tw@\ifnum\eq@rowcnt=\@tempcntb -% \expandafter\eq@endtab\fi\fi - \ifnum\eq@rowcnt=\thequestionno\relax\expandafter\eq@endtab\fi + \ifnum\eq@rowcnt=\value{questionno}\expandafter\eq@endtab\fi } % \end{macrocode} % @@ -9640,18 +9731,18 @@ if (!isQuizInitialized("@currQuiz")) { % total number of questions. % \begin{macrocode} \def\writeProListAux{% - \eq@IWAuxOut{\string - \csarg\string\gdef{\currQuiz QzQuesList}{\eqQzQuesList}}% - \eq@IWAuxOut{\string - \csarg\string\gdef{\currQuiz nQuestions}{\thequestionno}}% + \eq@IWAuxOut{\string + \csarg\string\gdef{\currQuiz QzQuesList}{\eqQzQuesList}}% + \eq@IWAuxOut{\string + \csarg\string\gdef{\currQuiz nQuestions}{\thequestionno}}% } % \end{macrocode} % \end{macro} % \begin{macrocode} \def\setParamSumryTblAux{% - \edef\eqQzQuesList{\@nameuse{\currQuiz QzQuesList}}% - \@ifundefined{\currQuiz nQuestions}{}{% - \value{questionno}=\@nameuse{\currQuiz nQuestions}}% + \edef\eqQzQuesList{\@nameuse{\currQuiz QzQuesList}}% + \@ifundefined{\currQuiz nQuestions}{}{% + \value{questionno}=\@nameuse{\currQuiz nQuestions}}% } % \end{macrocode} % \begin{environment}{sumryTblAux} @@ -9676,7 +9767,7 @@ if (!isQuizInitialized("@currQuiz")) { % quiz. % \begin{macrocode} \newenvironment{sumryTblAux}[1]{% - \DeclareQuiz{#1}\setParamSumryTblAux}{}% + \DeclareQuiz{#1}\setParamSumryTblAux}{}% % \end{macrocode} % \end{environment} % \begin{macrocode} @@ -9686,41 +9777,40 @@ if (!isQuizInitialized("@currQuiz")) { % \end{macrocode} % \subsection{Posing MC/math fill-in questions} % \begin{macrocode} -\def\bMCFI{% - \withinMCFItrue - \ifx\qRadionActionsHook\@empty - \let\qRadionActionsHook@SAVE\@empty - \def\qRadionActionsHook{\jsR - qRadioButtonMCFI(\Ans@choice,"\currQuiz",\thequestionno);}\else - \let\qRadionActionsHook@SAVE\qRadionActionsHook - \def\qRadionActionsHook{\qRadionActionsHook@SAVE\jsR - qRadioButtonMCFI(\Ans@choice,"\currQuiz",\thequestionno);}\fi - \ifx\every@RespBoxMath\@empty - \let\every@RespBoxMath@SAVE\@empty - \def\every@RespBoxMath{% - \AddAAKeystroke{mcfiKeyStroke("\currQuiz",\thequestionno);}}% - \else - \let\every@RespBoxMath@SAVE\every@RespBoxMath - \expandafter\def\expandafter\every@RespBoxMath\expandafter{% - \every@RespBoxMath@SAVE - \AddAAKeystroke{mcfiKeyStroke("\currQuiz",\thequestionno);}}% - \fi +\def\bMCFI{\withinMCFItrue + \ifx\qRadionActionsHook\@empty + \let\qRadionActionsHook@SAVE\@empty + \def\qRadionActionsHook{\jsR + qRadioButtonMCFI(\Ans@choice,"\currQuiz",\thequestionno);}\else + \let\qRadionActionsHook@SAVE\qRadionActionsHook + \def\qRadionActionsHook{\qRadionActionsHook@SAVE\jsR + qRadioButtonMCFI(\Ans@choice,"\currQuiz",\thequestionno);}\fi + \ifx\every@RespBoxMath\@empty + \let\every@RespBoxMath@SAVE\@empty + \def\every@RespBoxMath{% + \AddAAKeystroke{mcfiKeyStroke("\currQuiz",\thequestionno);}}% + \else + \let\every@RespBoxMath@SAVE\every@RespBoxMath + \expandafter\def\expandafter\every@RespBoxMath\expandafter + {\every@RespBoxMath@SAVE + \AddAAKeystroke{mcfiKeyStroke("\currQuiz",\thequestionno);}}% + \fi } \def\eMCFI{% - \ifx\qRadionActionsHook@SAVE\@empty - \let\qRadionActionsHook\@empty\else - \let\qRadionActionsHook\qRadionActionsHook@SAVE\fi - \ifx\every@RespBoxMath@SAVE\@empty - \let\every@RespBoxMath\@empty\else - \let\every@RespBoxMath\every@RespBoxMath@SAVE\fi - \withinMCFIfalse + \ifx\qRadionActionsHook@SAVE\@empty + \let\qRadionActionsHook\@empty\else + \let\qRadionActionsHook\qRadionActionsHook@SAVE\fi + \ifx\every@RespBoxMath@SAVE\@empty + \let\every@RespBoxMath\@empty\else + \let\every@RespBoxMath\every@RespBoxMath@SAVE\fi + \withinMCFIfalse } \def\eqNA{-43252452452} \@ifundefined{text}{\let\MCFIMarkup@BOX\mbox}{\let\MCFIMarkup@BOX\text} \newcommand\mcfiMarkupfmt{\cgBdry - ${}^{\MCFIMarkup@BOX{\aeb@creditmarkup}}$} + ${}^{\MCFIMarkup@BOX{\aeb@creditmarkup}}$} \def\mcfiMarkup{\addtocounter{questionno}{-1}\mcfiMarkupfmt - \stepcounter{questionno}} + \stepcounter{questionno}} %</mcfi> %<*package> % \end{macrocode} @@ -9748,8 +9838,8 @@ if (!isQuizInitialized("@currQuiz")) { % the color without commas. For example |\solutionColor{0 .6 0}| % \begin{macrocode} \newcommand{\solutionColor}[1]{\def\eq@argi{#1}\ifx\eq@argi\@empty - \def\solution@Color{\solutionColorDef}\else - \def\solution@Color{#1}\fi} + \def\solution@Color{\solutionColorDef}\else + \def\solution@Color{#1}\fi} \newcommand{\solutionColorDef}{0 .6 0} \solutionColor{\solutionColorDef} % \end{macrocode} @@ -9766,19 +9856,19 @@ if (!isQuizInitialized("@currQuiz")) { \def\eq@getCmdName#1#2{\edef#1{\expandafter\@gobble\string#2}} \def\eq@getfirst#1#2\@nil{\def\eq@argi{#1}} \def\eq@checkValidityModel#1{% - \if#1g\else\if#1r\else\if#1c\else - \PackageError{exerquiz} - {JavaScript does not support this model} - {Use a named color from one of the models gray, rgb, or cmyk.} - \fi\fi\fi + \if#1g\else\if#1r\else\if#1c\else + \PackageError{exerquiz} + {JavaScript does not support this model} + {Use a named color from one of the models gray, rgb, or cmyk.} + \fi\fi\fi } \def\eq@jsSetColorMsg#1#2{\PackageWarning{exerquiz} - {The argument `#2' of \string#1\MessageBreak - is not of the right form.\MessageBreak Using the default}} + {The argument `#2' of \string#1\MessageBreak + is not of the right form.\MessageBreak Using the default}} \def\eqModelInfo#1#2{% - \uppercase{\def\eq@ucmodel{#1}}\def\eq@modelspec{#2}% - \eq@getfirst#1\@nil\eq@ResetModelForGray{\eq@argi}% - \eq@checkValidityModel{\eq@argi}% + \uppercase{\def\eq@ucmodel{#1}}\def\eq@modelspec{#2}% + \eq@getfirst#1\@nil\eq@ResetModelForGray{\eq@argi}% + \eq@checkValidityModel{\eq@argi}% } \def\eq@ResetModelForGray#1{\if#1g\def\eq@ucmodel{G}\fi} % \end{macrocode} @@ -9786,40 +9876,40 @@ if (!isQuizInitialized("@currQuiz")) { % as the first two tokens. % \begin{macrocode} \def\eq@checkRawJSColor#1{% - \edef\eq@argi{#1}\ifx\eq@argi\@empty - \def\eq@next{\let\eq@rawJSCol\eq@YES}\else - \def\eq@next{\expandafter\eq@@checkRawJSColor#1\@nil}\fi\eq@next + \edef\eq@argi{#1}\ifx\eq@argi\@empty + \def\eq@next{\let\eq@rawJSCol\eq@YES}\else + \def\eq@next{\expandafter\eq@@checkRawJSColor#1\@nil}\fi\eq@next } \def\eq@@checkRawJSColor#1#2#3\@nil{\let\eq@rawJSCol\eq@NO - \let\eqpredefineJSCol\eq@NO - \if[#1\if#2"\let\eq@rawJSCol\eq@YES\fi\fi - \ifx\eq@rawJSCol\eq@NO\if#1c\if#2o\let\eq@rawJSCol\eq@YES - \let\eqpredefineJSCol\eq@YES\fi\fi\fi + \let\eqpredefineJSCol\eq@NO + \if[#1\if#2"\let\eq@rawJSCol\eq@YES\fi\fi + \ifx\eq@rawJSCol\eq@NO\if#1c\if#2o\let\eq@rawJSCol\eq@YES + \let\eqpredefineJSCol\eq@YES\fi\fi\fi } \def\eq@jsColorWXColori#1#2{\edef\eq@colorDefn{#2}% - \ifx\eq@colorDefn\@empty - \ifx\is@Defined\eq@YES - \edef\eq@colorDefn{\csname\cmdName Def\endcsname}\else - \PackageError{exerquiz}{JS color \string#1 has an - empty definition}{}\fi - \fi - \eq@checkRawJSColor{\eq@colorDefn}% - \ifx\eq@rawJSCol\eq@NO - \extractcolorspec{\eq@colorDefn}{\eq@tmp@color}% - \expandafter\eqModelInfo\eq@tmp@color - \edef#1{["\eq@ucmodel",\eq@modelspec]}% - \else\edef#1{\eq@colorDefn}\fi + \ifx\eq@colorDefn\@empty + \ifx\is@Defined\eq@YES + \edef\eq@colorDefn{\csname\cmdName Def\endcsname}\else + \PackageError{exerquiz}{JS color \string#1 has an + empty definition}{}\fi + \fi + \eq@checkRawJSColor{\eq@colorDefn}% + \ifx\eq@rawJSCol\eq@NO + \extractcolorspec{\eq@colorDefn}{\eq@tmp@color}% + \expandafter\eqModelInfo\eq@tmp@color + \edef#1{["\eq@ucmodel",\eq@modelspec]}% + \else\edef#1{\eq@colorDefn}\fi } \def\eq@jsColorWOXColori#1#2{\def\eq@colorDefn{#2}% - \ifx\eq@colorDefn\@empty - \ifx\is@Defined\eq@YES - \edef\eq@colorDefn{\csname cmdName Def\endcsname}\else - \PackageError{exerquiz}{JS color \string#1 has an - empty definition}{}\fi - \fi - \eq@checkRawJSColor{\eq@colorDefn}% - \ifx\eq@rawJSCol\eq@YES\edef#1{\eq@colorDefn}\else - \eq@jsSetColorMsg{#1}{#2}\fi + \ifx\eq@colorDefn\@empty + \ifx\is@Defined\eq@YES + \edef\eq@colorDefn{\csname cmdName Def\endcsname}\else + \PackageError{exerquiz}{JS color \string#1 has an + empty definition}{}\fi + \fi + \eq@checkRawJSColor{\eq@colorDefn}% + \ifx\eq@rawJSCol\eq@YES\edef#1{\eq@colorDefn}\else + \eq@jsSetColorMsg{#1}{#2}\fi } % \end{macrocode} % \DescribeMacro{\jsColor} General command for defining a JavaScript Color, and support commands for @@ -9837,13 +9927,13 @@ if (!isQuizInitialized("@currQuiz")) { % When \textsf{xcolor} is not used, only the JavaScript format is allowed. % \begin{macrocode} \def\jsColor#1#2{\eq@getCmdName{\cmdName}{#1}% - \let\is@Defined\eq@YES - \expandafter\ifx\csname\cmdName\endcsname\relax - \PackageWarning{exerquiz}{\string#1 is not a command used by - exerquiz.\MessageBreak Will define it anyway}% - \let\is@Defined\eq@NO\fi - \HyColor@IfXcolor{\eq@jsColorWXColori{#1}{#2}}% - {\eq@jsColorWOXColori{#1}{#2}}% + \let\is@Defined\eq@YES + \expandafter\ifx\csname\cmdName\endcsname\relax + \PackageWarning{exerquiz}{\string#1 is not a command used by + exerquiz.\MessageBreak Will define it anyway}% + \let\is@Defined\eq@NO\fi + \HyColor@IfXcolor{\eq@jsColorWXColori{#1}{#2}}% + {\eq@jsColorWOXColori{#1}{#2}}% } % \end{macrocode} % \begin{macrocode} @@ -9855,10 +9945,10 @@ if (!isQuizInitialized("@currQuiz")) { % (\string\texttt{eqcolor})} % \begin{macrocode} \@ifundefined{jsColor}{% - \InputIfFileExists{eqcolor.def}{\PackageInfo{exerquiz} - {Inputting eqcolor.def}} - {\PackageError{exerquiz}{cannot find eqcolor.def} - {Refresh your file name database and try again.}} + \InputIfFileExists{eqcolor.def}{\PackageInfo{exerquiz} + {Inputting eqcolor.def}} + {\PackageError{exerquiz}{cannot find eqcolor.def} + {Refresh your file name database and try again.}} }{} % \end{macrocode} % @@ -9897,26 +9987,26 @@ if (!isQuizInitialized("@currQuiz")) { % These must be declared in the preamble. % \begin{macrocode} \def\chooseJSsymbol{\@ifstar{\let\eq@isstar\eq@YES\chooseJSsymboli} - {\let\eq@isstar\eq@NO\chooseJSsymboli}} + {\let\eq@isstar\eq@NO\chooseJSsymboli}} \def\chooseJSsymboli#1{\lowercase{\edef\eq@arg{#1}}% - \def\eq@carg{check}\ifx\eq@arg\eq@carg - \def\eq@retnStyle{style.ch}\else - \def\eq@carg{cross}\ifx\eq@arg\eq@carg - \def\eq@retnStyle{style.cr}\else - \def\eq@carg{diamond}\ifx\eq@arg\eq@carg - \def\eq@retnStyle{style.di}\else - \def\eq@carg{circle}\ifx\eq@arg\eq@carg - \def\eq@retnStyle{style.ci}\else - \def\eq@carg{star}\ifx\eq@arg\eq@carg - \def\eq@retnStyle{style.st}\else - \def\eq@carg{square}\ifx\eq@arg\eq@carg - \def\eq@retnStyle{style.sq}\else - \let\eq@retnStyle\@empty - \ifx\eq@isstar\eq@NO\PackageWarning{exerquiz} - {Argument `#1' not recognized.\MessageBreak - Permissible values are check, cross, diamond,\MessageBreak - circle, star, square. Will use the default}\fi - \fi\fi\fi\fi\fi\fi + \def\eq@carg{check}\ifx\eq@arg\eq@carg + \def\eq@retnStyle{style.ch}\else + \def\eq@carg{cross}\ifx\eq@arg\eq@carg + \def\eq@retnStyle{style.cr}\else + \def\eq@carg{diamond}\ifx\eq@arg\eq@carg + \def\eq@retnStyle{style.di}\else + \def\eq@carg{circle}\ifx\eq@arg\eq@carg + \def\eq@retnStyle{style.ci}\else + \def\eq@carg{star}\ifx\eq@arg\eq@carg + \def\eq@retnStyle{style.st}\else + \def\eq@carg{square}\ifx\eq@arg\eq@carg + \def\eq@retnStyle{style.sq}\else + \let\eq@retnStyle\@empty + \ifx\eq@isstar\eq@NO\PackageWarning{exerquiz} + {Argument `#1' not recognized.\MessageBreak + Permissible values are check, cross, diamond,\MessageBreak + circle, star, square. Will use the default}\fi + \fi\fi\fi\fi\fi\fi } % \end{macrocode} % \begin{macro}{\setRightAnsSymb} @@ -9928,41 +10018,38 @@ if (!isQuizInitialized("@currQuiz")) { % The check style when the use chooses the incorrect answer. % (def: \texttt{style.cr}) % \begin{macrocode} -%\def\defineAnsStyle#1#2{% -% \eq@getCmdName{\cmdName}{#1}\let\is@Defined\eq@YES -%} \newcommand\setRghtAnsSymb[1]{\chooseJSsymbol{#1}% - \ifx\eq@retnStyle\@empty\else - \edef\rghtAnsSymbJS{\eq@retnStyle}% - \edef\rghtAnsSymb{\eq@carg}\fi} + \ifx\eq@retnStyle\@empty\else + \edef\rghtAnsSymbJS{\eq@retnStyle}% + \edef\rghtAnsSymb{\eq@carg}\fi} \def\rghtAnsSymbJS{style.ch} \def\rghtAnsSymb{check} \newcommand\setCorrAnsSymb[1]{\chooseJSsymbol{#1}% - \ifx\eq@retnStyle\@empty\else - \edef\corrAnsSymbJS{\eq@retnStyle}% - \edef\corrAnsSymb{\eq@carg}\fi} + \ifx\eq@retnStyle\@empty\else + \edef\corrAnsSymbJS{\eq@retnStyle}% + \edef\corrAnsSymb{\eq@carg}\fi} \def\corrAnsSymbJS{style.ci} \def\corrAnsSymb{circle} \newcommand\setWrngAnsSymb[1]{\chooseJSsymbol{#1}% - \ifx\eq@retnStyle\@empty\else - \edef\wrngAnsSymbJS{\eq@retnStyle}% - \edef\wrngAnsSymb{\eq@carg}\fi} + \ifx\eq@retnStyle\@empty\else + \edef\wrngAnsSymbJS{\eq@retnStyle}% + \edef\wrngAnsSymb{\eq@carg}\fi} \def\wrngAnsSymbJS{style.cr} \def\wrngAnsSymb{cross} \def\setRghtAnsSymbLoc#1{\chooseJSsymbol*{#1}% - \ifx\eq@retnStyle\@empty - \let\rghtAnsSymbJSLoc\@empty\else - \edef\rghtAnsSymbJSLoc{\eq@retnStyle}\fi + \ifx\eq@retnStyle\@empty + \let\rghtAnsSymbJSLoc\@empty\else + \edef\rghtAnsSymbJSLoc{\eq@retnStyle}\fi } \def\setCorrAnsSymbLoc#1{\chooseJSsymbol*{#1}% - \ifx\eq@retnStyle\@empty - \let\corrAnsSymbJSLoc\@empty\else - \edef\corrAnsSymbJSLoc{\eq@retnStyle}\fi + \ifx\eq@retnStyle\@empty + \let\corrAnsSymbJSLoc\@empty\else + \edef\corrAnsSymbJSLoc{\eq@retnStyle}\fi } \def\setWrngAnsSymbLoc#1{\chooseJSsymbol*{#1}% - \ifx\eq@retnStyle\@empty - \let\wrngAnsSymbJSLoc\@empty\else - \edef\wrngAnsSymbJSLoc{\eq@retnStyle}\fi + \ifx\eq@retnStyle\@empty + \let\wrngAnsSymbJSLoc\@empty\else + \edef\wrngAnsSymbJSLoc{\eq@retnStyle}\fi } \let\rghtAnsSymbJSLoc\@empty \let\rghtAnsSymbJSLocDef\@empty @@ -10078,6 +10165,7 @@ if (!isQuizInitialized("@currQuiz")) { %\end{flushleft} % Define a special value (\cs{formatInitAltApprs}) for \cs{AddAAFormat} used in initializing \cs{RespBoxMath} problems, % where there are alternate appearances. +% See \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} @@ -10170,7 +10258,7 @@ if (!isQuizInitialized("@currQuiz")) { %} % \begin{macrocode} \def\@eqAddAAKeystroke#1{\def\argi{#1}\ifx\argi\@empty - \def\eqAddAAKeystroke{}\else\def\eqAddAAKeystroke{#1}\fi} %\r + \def\eqAddAAKeystroke{}\else\def\eqAddAAKeystroke{#1}\fi} %\r \def\eqAddAAKeystroke{} % \end{macrocode} % \end{macro} @@ -10182,10 +10270,10 @@ if (!isQuizInitialized("@currQuiz")) { % and \string\cs{@eqAddAAMouseUpMS}} % \begin{macrocode} \def\@eqAddAAMouseUpMC#1{\def\argi{#1}\ifx\argi\@empty - \def\eqAddAAMouseUpMC{}\else\def\eqAddAAMouseUpMC{#1}\fi} + \def\eqAddAAMouseUpMC{}\else\def\eqAddAAMouseUpMC{#1}\fi} \def\eqAddAAMouseUpMC{} \def\@eqAddAAMouseUpMS#1{\def\argi{#1}\ifx\argi\@empty - \def\eqAddAAMouseUpMS{}\else\def\eqAddAAMouseUpMS{#1}\fi} + \def\eqAddAAMouseUpMS{}\else\def\eqAddAAMouseUpMS{#1}\fi} \def\eqAddAAMouseUpMS{} % \end{macrocode} % \end{macro} @@ -10203,17 +10291,15 @@ if (!isQuizInitialized("@currQuiz")) { % #4 = the height of the bounding rectangle %\end{verbatim} % \begin{macrocode} -\def\eqIconDefaults -{% - \rawPDF{}\S{}\mkIns{/TP 1}\W{} - \CA{}\RC{}\AC{}\BC{}\BG{}\H{N} - \textColor{0 g}\Ff{\FfReadOnly} +\def\eqIconDefaults{% + \rawPDF{}\S{}\mkIns{/TP 1}\W{} + \CA{}\RC{}\AC{}\BC{}\BG{}\H{N} + \textColor{0 g}\Ff{\FfReadOnly} } -\newcommand\eqIcon[4][] -{% - \mbox{\push@@Button{#1}{#2}{#3}{#4}{}{\eq@setButtonProps - \eq@Button@driver}{\eqIconDefaults\every@ButtonField - \every@eqIcon}}% +\newcommand\eqIcon[4][]{% + \mbox{\push@@Button{#1}{#2}{#3}{#4}{}{\eq@setButtonProps + \eq@Button@driver}{\eqIconDefaults\every@ButtonField + \every@eqIcon}}% } % \end{macrocode} % \end{macro} @@ -10235,15 +10321,8 @@ if (!isQuizInitialized("@currQuiz")) { % \begin{macrocode} \def\aeb@array{new Array} % \end{macrocode} -% The following definitions are associated with \texttt{requireForm()}, the JS function -% defined below. -% \begin{macrocode} -%\newcommand{\defaultReqFormMsg}{% -% "The expression is not in the expected form."} -% \end{macrocode} % (07/16/11) Some definitions that may be used by \texttt{requireForm}, a \cs{RespMathBox} filter % \begin{macrocode} -%\def\refac(#1){\\(#1\\)}\def\regrp(#1){(#1)}\def\rechrclass(#1){[#1]} \def\refac#1{\\(#1\\)}\def\regrp#1{(#1)}\def\rechrclass#1{[#1]} \def\redm{\\.}\def\remul{\\*}\def\rediv{\\/}\def\repow{\\^} \def\redigit{\\d}\def\reany{.}\def\rebstr{\string^}\def\reestr{\string$} @@ -10254,9 +10333,6 @@ if (!isQuizInitialized("@currQuiz")) { % (10/07/11) Some convenience commands to simplifying the use of the \texttt{priorParse} % and \texttt{postParse} filters. % \begin{macrocode} -%\def\preDenyForm(#1){\Array(denyForm,#1)} -%\def\preReqForm(#1){\Array(requireForm,#1)} -%\def\postDenyForm(#1){\Array(requireFormNot,#1)} \def\preReqForm{\Array(requireForm,\@gobble} \def\preDenyForm{\Array(denyForm,\@gobble} \def\postDenyForm{\Array(requireFormNot,\@gobble} @@ -10268,7 +10344,7 @@ if (!isQuizInitialized("@currQuiz")) { % of the no peeking alert box. % \begin{macrocode} \newcommand{\noPeekArgs}[1]{% - \def\NoPeekAlert{eqAppAlert(#1)}}\def\newNoPeekArgs{} + \def\NoPeekAlert{eqAppAlert(#1)}}\def\newNoPeekArgs{} \def\NoPeekAlert{eqAppAlert(\noPeekMsg,3)} % \end{macrocode} % \begin{macrocode} @@ -10281,7 +10357,7 @@ if (!isQuizInitialized("@currQuiz")) { \def\corrChoiceFullyOff{\def\eqCorrChoiceFully{false}} \corrChoiceFullyOn % \end{macrocode} -% Implement a local version of full corrections of MS and MS +% Implement a local version of full corrections of MC and MS % \changes{v8.1l}{2018/02/07}{Add local version of \string\cs{corrChoiceFullOn}} % \begin{macrocode} \def\corrLocalChoiceFullyOn{\def\eqCorrLocalChoiceFully{true}} @@ -10354,7 +10430,6 @@ var pi = Math.PI; var replaceExclaim = \replaceexclaim; var negPointsAllowed = \negpointsallowed; var negPointsMarkupAllowed = \negpointsmarkupallowed; -%var aQuizControl = new Array(); var aQuizControl = new Object; var RightWrong=new Array(); var ProbValue = new Array(); @@ -11745,6 +11820,38 @@ function eqFilter(filterMethod) { return this.toString(); } } +% \end{macrocode} +% JavaScript support of spell checking command |\SpellCheck| +% \changes{v8.5.11}{2020/11/11}{JavaScript support of spell checking command \string\cs{SpellCheck}}. +% Returns the number of misspelled words, but allows user to to correct. +% \begin{macrocode} +function checkTheSpelling(targetFieldName) { + var spellChkCnt=0; +% var thisName=event.target.name; +% \end{macrocode} +% The root name of the \cs{SpellCheck} field is \texttt{spl}. Here we replace +% the root name with \texttt{obj} to get the field name of the previous \cs{RespBoxTxt(PC)} +% 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,""); + if ( valueStrip != "" ) { + aBrk=value.split(/\s+/); + for (var i=0; i<aBrk.length; i++){ + var word=aBrk[i]; + var aRetnSC=spell.checkWord(word); + if (aRetnSC!=null) spellChkCnt++; + } + var corrdStr=spell.checkText(value); + f.value=corrdStr; + } + return spellChkCnt; +} \end{newsegment} % \end{macrocode} % \subsection{Multiple Choice Questions} @@ -11836,12 +11943,12 @@ function InitializeQuiz(qtfield,mark) { ProcessIt = false; aQuizControl[qtfield] = 1; this.resetForm(["ScoreField." + qtfield,"mc."+qtfield, - "obj."+qtfield,"mck."+qtfield,"Ans."+qtfield, - "PointsField."+qtfield,"PercentField."+qtfield, - "essay."+qtfield,"GradeField."+qtfield, - "grpobj."+qtfield,"qMark."+qtfield, qtfield+"SanityCheck", - qtfield+"SanityCheckPts",qtfield+"SanityCheckOOPts", - "rbmarkup."+qtfield]); + "obj."+qtfield,"mck."+qtfield,"Ans."+qtfield, + "PointsField."+qtfield,"PercentField."+qtfield, + "essay."+qtfield,"GradeField."+qtfield, + "grpobj."+qtfield,"qMark."+qtfield, qtfield+"SanityCheck", + qtfield+"SanityCheckPts",qtfield+"SanityCheckOOPts", + "rbmarkup."+qtfield]); ProcessIt = true; var f = this.getField("qMark."+qtfield); if ( f != null ) f.display = display.hidden; @@ -11990,16 +12097,16 @@ function DisplayQuizResults(qtfield,nPointTotal,nQuestions) NPointTotal=nPointTotal; NQuestions=nQuestions; for (var i=1; i < RightWrong.length; i++) { - if ( (typeof RightWrong[i] == "object" ) % -&& ( RightWrong[i][0] == "grp" ) ) { + if ( (typeof RightWrong[i] == "object" ) && % +( RightWrong[i][0] == "grp" ) ) { // grouped question - Score += GrpRight(RightWrong[i], i, qtfield); - var aWeights = ProbValue[i].slice(2); - var evalGrpJS = eval(ProbValue[i][1]); - var evalGrpJSValue = evalGrpJS(this,qtfield,i, - RightWrong[i],aWeights); - ProbDist[i] = evalGrpJSValue; - ptScore = ptScore + evalGrpJSValue; + Score += GrpRight(RightWrong[i], i, qtfield); + var aWeights = ProbValue[i].slice(2); + var evalGrpJS = eval(ProbValue[i][1]); + var evalGrpJSValue = evalGrpJS(this,qtfield,i, + RightWrong[i],aWeights); + ProbDist[i] = evalGrpJSValue; + ptScore = ptScore + evalGrpJSValue; } else { if (typeof RightWrong[i] == "object") { if ( RightWrong[i][0] == 1 ) { @@ -12018,20 +12125,21 @@ function DisplayQuizResults(qtfield,nPointTotal,nQuestions) % If the user receives negative points, we change it to zero points. % \changes{v8.5.9}{2020/02/21}{If the user receives negative points, we change it to zero points.} % \begin{macrocode} - if (!negPointsAllowed && !negPointsMarkupAllowed) if (ProbDist[i]<0) ProbDist[i]=0 + if (!negPointsAllowed && % +!negPointsMarkupAllowed && (ProbDist[i]<0) ) ProbDist[i]=0; } ptScore += (1*ProbDist[i]); } } else { if (RightWrong[i]==1) { Score++; - ProbDist[i] = ( typeof ProbValue[i] == "object") ? - 1*ProbValue[i][1] : 1*ProbValue[i]; + ProbDist[i] = ( typeof ProbValue[i] == "object") ? % +1*ProbValue[i][1] : 1*ProbValue[i]; ptScore += (1*ProbDist[i]); } else { - ProbDist[i] = ( typeof ProbValue[i] == "object") ? - 1*ProbValue[i][2] : 0; + ProbDist[i] = ( typeof ProbValue[i] == "object") ? % +1*ProbValue[i][2] : 0; ptScore += (1*ProbDist[i]); } } @@ -12158,7 +12266,7 @@ function ProcessQuestion (key,letterresp,probno, function correctQuiz(qtfield,nQuestions) { % \end{macrocode} -% (2019/10/14) If \texttt{oRecordOfQuizData} is present (from \pkg{eq-save}, we use that data from the quiz. +% (2019/10/14) If \texttt{oRecordOfQuizData} is present (from \pkg{eq-save}), we use that data from the quiz. % \changes{v8.5.1}{2019/10/14}{Incorporated oRecordOfQuizData into correctQuiz()} % \begin{macrocode} var bROQD=(typeof oRecordOfQuizData=="object"); @@ -12439,6 +12547,12 @@ quizno,qtfield,pts,ppts) { var retn = [ [ scoreThisProblem, passKey ], letterResponses ] ; return retn; } +% \end{macrocode} +% \leavevmode\IndexJS{LimitSelection}\hskip-\marginparsep\texttt{(\ameta{n},\ameta{fname},\ameta{index}} +% This function supports the \cs{limitSelectionTo\darg{\ameta{n}}} command. The function determines +% whether the user has chosen more than \ameta{n} in a MS choice field. The widget that activated this +% function is \texttt{\ameta{fname}.\ameta{index}}. +% \begin{macrocode} function LimitSelection(n,fname,k) { var f = this.getField(fname); var g = f.getArray(); @@ -12941,6 +13055,9 @@ function qRadioButtonMCFI(key,qname,n) { R\texorpdfstring{\'}{\string\351}ponses} \renewcommand\eq@local@RC{Correctes} \renewcommand\eq@local@AC{SVP !} +\dlJSStr*[noquotes]{\limSelWarningMsg}{"Pour cette question, + vous \u00EAtes autoris\'{e} \`{a} faire au plus " + + n + " s\'{e}lections."} %</eqfr> % \end{macrocode} % \subsection{German} @@ -13060,7 +13177,7 @@ function qRadioButtonMCFI(key,qname,n) { + " sonst wird diese Antwort als falsch gewertet."} \dlJSStr*[noquotes]{\limSelWarningMsg}{"F\"{u}r diese Aufgabe k\"{o}nnen sie h\"{o}chstens " + n + " ausw\string\344hlen."} -\fieldJSStr*[noquotes]{\promptButtonMsg}{% +\flJSStr*[noquotes]{\promptButtonMsg}{% "M\"{o}chten Sie die richtige Antwort jetzt sehen?" + " Ihre derzeitige Antwort ist diejenige, die gewertet wird." + " Wenn Sie auf \\"Yes\\" klicken, k\"{o}nnen Sie ihre Antwort @@ -13131,6 +13248,9 @@ function qRadioButtonMCFI(key,qname,n) { \renewcommand\eq@local@AC{% V\texorpdfstring{\ae}{\string\346}r s\texorpdfstring{\r}{\string\345}snill!} +\dlJSStr*[noquotes]{\limSelWarningMsg}{"For dette sp\string\370rsm\string\345let + har du lov til \string\345 gj\string\370re p\string\345 det meste " + + n + " valg."} %</eqno> % \end{macrocode} % \subsection{Dutch} @@ -13219,6 +13339,8 @@ function qRadioButtonMCFI(key,qname,n) { \renewcommand\eq@local@CA{Corrigeer} \renewcommand\eq@local@RC{Mijn Antwoorden!} \renewcommand\eq@local@AC{AUB!} +\dlJSStr*[noquotes]{\limSelWarningMsg}{"Voor deze vraag mag je maximaal " + + n + " selecties maken."} %</eqnl> % \end{macrocode} % \subsection{Spanish} @@ -13304,6 +13426,9 @@ function qRadioButtonMCFI(key,qname,n) { \renewcommand\eq@local@CA{Correctas} \renewcommand\eq@local@RC{Mis Respuestas!} \renewcommand\eq@local@AC{Por Favor!} +\dlJSStr*[noquotes]{\limSelWarningMsg}{"Para esta pregunta, + se le permite hacer como m\'{a}ximo " + + n + " selecciones."} %</eqes> % \end{macrocode} % \subsection{Italian} @@ -13393,6 +13518,9 @@ function qRadioButtonMCFI(key,qname,n) { \renewcommand\eq@local@CA{Correggere} \renewcommand\eq@local@RC{Le mie risposte!} \renewcommand\eq@local@AC{Per favore!} +\dlJSStr*[noquotes]{\limSelWarningMsg}{"Per questa domanda, + \`{e} possibile effettuare al massimo " + + n + " selezioni."} %</eqit> % \end{macrocode} % \subsection{Russian} @@ -13483,12 +13611,9 @@ function qRadioButtonMCFI(key,qname,n) { \renewcommand\eq@sqslrtnlabel{\^{a}{\aa}ð\'{\i}\'{o}\`{o}\"{u}\~{n}\"{y}} % User access to shortquiz label \renewcommand\sqslrtnlabel{\eq@sqslrtnlabel} - \cyrCommand\eqsqslrtnlabel{\^{E} \^{o}\^{\i}ð\`{\i}\'{o}\"{e}% \`{e}ð\^{\i}\^{a}\^{e}{\aa} \c{c}\`{a}\"{a}\`{a}\'{\i}\`{e}\"{y}} \renewcommand\eq@sqslrtnlabel{\eqsqslrtnlabel} - - % Here is the default quiz label. % No formatting allowed % For Example: \renewcommand\eq@bqlabel{D\'ebut} (French) @@ -13693,6 +13818,9 @@ function qRadioButtonMCFI(key,qname,n) { \renewcommand\eq@local@AC{% V\texorpdfstring{\ae}{\string\346}r s\texorpdfstring{\r}{\string\345}god!} +\dlJSStr*[noquotes]{\limSelWarningMsg}{"Til dette sp\string\370rgsm\string\345l, + er du lov til at g\string\370re h\string\370jst " + + n + " valg."} %</eqda> % \end{macrocode} % \subsection{Polish} @@ -13779,6 +13907,9 @@ function qRadioButtonMCFI(key,qname,n) { \renewcommand\eq@local@RC{Moje odpowiedzi!} \renewcommand\eq@local@AC{Prosze!} %\renewcommand\eq@local@AC{Prosz\k{e}!} +\dlJSStr*[noquotes]{\limSelWarningMsg}{"Na to pytanie, + mo\u017Cesz dokona\u0107 co najwy\u017Cej " + + n + " wybor\string\363w."} %</eqpo> % \end{macrocode} % \subsection{Finnish} @@ -13840,6 +13971,9 @@ function qRadioButtonMCFI(key,qname,n) { \renewcommand\eq@local@CA{Oikein} \renewcommand\eq@local@RC{Omat vastaukset!} \renewcommand\eq@local@AC{Ole hyv\string\344!}} +\dlJSStr*[noquotes]{\limSelWarningMsg}{"T\string\344h\string\344n + kysymykseen, voit tehd\string\344 enint\string\344\string\344n " + + n + " valintoja."} %</eqfin> % \end{macrocode} % \subsection{catalan} @@ -13925,6 +14059,9 @@ function qRadioButtonMCFI(key,qname,n) { \renewcommand\eq@local@CA{Correctes} \renewcommand\eq@local@RC{Les meves Respostes!} \renewcommand\eq@local@AC{Si us plau!} +\dlJSStr*[noquotes]{\limSelWarningMsg}{"Per a aquesta pregunta, + se li permet fer com a m\`{a}xim " + + n + " seleccions."} %</eqcat> % \end{macrocode} % @@ -14050,6 +14187,9 @@ function qRadioButtonMCFI(key,qname,n) { + "Kliknete-li na \\"Yes\\", uvidite spravnou odpoved, ale svou stavajici odpoved na tuto otazku uz nebudete moct zmenit." } +\dlJSStr*[noquotes]{\limSelWarningMsg}{"Pro tuto ot\string\341zku + m\u016F\u017Eete prov\'{e}st maxim\'{a}ln\u011B " + + n + " v\u00FDb\u0115ry."} %</eqcz> % \end{macrocode} % \subsection{brazil} @@ -14141,6 +14281,9 @@ function qRadioButtonMCFI(key,qname,n) { \renewcommand\eq@local@CA{Corretas} \renewcommand\eq@local@RC{Minhas Respostas!} \renewcommand\eq@local@AC{Por Favor!} +\dlJSStr*[noquotes]{\limSelWarningMsg}{"Pro tuto ot\string\341zku + m\u016F\u017Eete prov\'{e}st maxim\'{a}ln\u011B " + + n + " v\u00FDb\u0115ry."} %</eqbr> % \end{macrocode} % \subsection{turkish} @@ -14233,6 +14376,8 @@ function qRadioButtonMCFI(key,qname,n) { \renewcommand\eq@local@CA{Dogru} \renewcommand\eq@local@RC{Benim Cevaplar\protect\u0131m!} \renewcommand\eq@local@AC{L\protect\374tfen!} +\dlJSStr*[noquotes]{\limSelWarningMsg}{"Bu soru i\u00E7in, en fazla " + + n + " se\u00E7im yapmak i\u00E7in izin verilir."} %</eqtr> % \end{macrocode} % \Finale diff --git a/texmf-dist/source/latex/acrotex/insdljs.dtx b/texmf-dist/source/latex/acrotex/insdljs.dtx index 12b507ce..d53aeb6b 100644 --- a/texmf-dist/source/latex/acrotex/insdljs.dtx +++ b/texmf-dist/source/latex/acrotex/insdljs.dtx @@ -4,7 +4,7 @@ %<*copyright> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% insdljs.sty package, %% -%% Copyright (C) 2001-2019 D. P. Story %% +%% Copyright (C) 2001-2020 D. P. Story %% %% dpstory@uakron.edu %% %% %% %% This program can redistributed and/or modified under %% @@ -16,7 +16,7 @@ %</copyright> %<package>\NeedsTeXFormat{LaTeX2e} %<package>\ProvidesPackage{insdljs} -%<package> [2019/10/30 v2.4.8 Insert Document Level JavaScripts (dps)] +%<package> [2020/12/20 v2.5 Insert Document Level JavaScripts (dps)] %<*driver> \documentclass{ltxdoc} \usepackage[colorlinks,hyperindex=false]{hyperref} @@ -470,7 +470,7 @@ % \begin{macrocode} \let\isOpenAction\dl@NO % \end{macrocode} -% \IndexOpt{nodljs} +% \leavevmode\IndexOpt{nodljs}^^A % Option to cancel the insertion of DLJS, useful for a document meant to be % printed only, or one that does not use the \texttt{shortquiz} or % \texttt{quiz} environments, for example. @@ -483,7 +483,7 @@ \let\firstdljs\dl@YES \let\dljspresent\dl@NO % \end{macrocode} -% \IndexOpt{debug} +% \leavevmode\IndexOpt{debug}^^A % Use this option to help debug DLJS. % \begin{macrocode} \DeclareOptionX{debug}{\let\dljs@debug\dl@YES} @@ -507,24 +507,24 @@ % We set the driver, according to the following algorithm. % \begin{macrocode} \@ifpackageloaded{web}{% - \ExecuteOptionsX{\eq@driver@name}% + \ExecuteOptionsX{\eq@driver@name}% }{% - \@ifpackageloaded{eforms}{% - \ExecuteOptionsX{\ef@driver}% - }{% - \ifpdf\ExecuteOptionsX{pdftex}\else - \ifxetex\ExecuteOptionsX{xetex}\else - \@ifundefined{l@tex@@@@driver}{\ExecuteOptionsX{dvips}} - {\ExecuteOptionsX{dvipsone}}\fi\fi - }% + \@ifpackageloaded{eforms}{% + \ExecuteOptionsX{\ef@driver}% + }{% + \ifpdf\ExecuteOptionsX{pdftex}\else + \ifxetex\ExecuteOptionsX{xetex}\else + \@ifundefined{l@tex@@@@driver}{\ExecuteOptionsX{dvips}} + {\ExecuteOptionsX{dvipsone}}\fi\fi + }% } % \end{macrocode} -% \leavevmode\IndexOpt{reqjs} +% \leavevmode\IndexOpt{reqjs}^^A % Beginning with PDF 1.7, a document can specify requirements, here we declare % the document uses JavaScripts. The option \texttt{reqjs} is taken by default, % that is, JavaScripts are required for this document -% -% \DescribeMacro{!reqjs} +% \medskip\par\noindent +% \DescribeMacro{!reqjs}^^A % 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. @@ -545,10 +545,10 @@ % the usealtadobe option} % \begin{macrocode} \DeclareOptionX{usealtadobe}{\let\usedAdbFuncs\dl@YES - \def\inputAltAdbFncs{\InputIfFileExists{altadbfncs.def} - {\PackageInfo{insdljs}{Inputting code for usealtadobe option}} - {\PackageWarning{insdljs}{Cannot find altadbfncs.def.\MessageBreak - Reinstall or refresh your file name database.}}}} +\def\inputAltAdbFncs{\InputIfFileExists{altadbfncs.def} + {\PackageInfo{insdljs}{Inputting code for usealtadobe option}} + {\PackageWarning{insdljs}{Cannot find altadbfncs.def.\MessageBreak + Reinstall or refresh your file name database.}}}} \let\usedAdbFuncs\dl@NO \let\inputAltAdbFncs\relax % \end{macrocode} @@ -564,14 +564,13 @@ % \end{macrocode} % Issue a package error if there is no driver specified or implied. % \begin{macrocode} -\@ifundefined{dljs@drivernum}{% - \PackageError{insdljs}% - {You have not specified dvips, dvipsone, pdftex,\MessageBreak - dvipdfm, dvipdfmx, or xetex in the option list - \MessageBreak of the insdljs package} - {Place one of the drivers dvips, dvipsone, pdftex, dvipdfm, - dvipdfmx, or xetex - \MessageBreak in the option list of the insdljs package.} +\@ifundefined{dljs@drivernum}{\PackageError{insdljs}% + {You have not specified dvips, dvipsone, pdftex,\MessageBreak + dvipdfm, dvipdfmx, or xetex in the option list + \MessageBreak of the insdljs package} + {Place one of the drivers dvips, dvipsone, pdftex, dvipdfm, + dvipdfmx, or xetex + \MessageBreak in the option list of the insdljs package.} }{} % \end{macrocode} % \subsection{Required Packages} @@ -583,7 +582,6 @@ % \begin{macrocode} \@ifundefined{ifpdfmarkup}{\newif\ifpdfmarkup}{}\pdfmarkupfalse \ifpdf\else\ifxetex\else\pdfmarkuptrue\fi\fi -% \begin{macrocode} \RequirePackage{hyperref} % \end{macrocode} % LuaTeX v0.85 has made some changes to primitives, the definition below follows @@ -593,8 +591,8 @@ % \changes{v2.3a}{2016/07/31}{Added luatex85 definition of \string\cs{pdfpageref}} % \begin{macrocode} \ifpdf\ifx\pdfextension\@undefined\else - \protected\def\pdfnames{\pdfextension names } - \def\pdfpageref{\pdffeedback pageref}\fi\fi + \protected\def\pdfnames{\pdfextension names } + \def\pdfpageref{\pdffeedback pageref}\fi\fi \RequirePackage{verbatim} % \end{macrocode} %\changes{v2.4.1}{2019/02/11}{Save \string\cs{comment}\space as \string\cs{dlcomment}} @@ -612,37 +610,37 @@ % Last minute adjustments in the driver. % \begin{macrocode} \@ifundefined{dljs@drivernum}{% - \@ifundefined{eq@drivernum}{% - \PackageWarning{insdljs} - {No driver specified, will check for pdftex.} - \@ifundefined{pdfoutput}{% - \@ifundefined{@pdfm@mark}{\def\eq@drivernum{2}% - \def\dljs@drivernum{1}\let\isOpenAction\dl@NO - \PackageWarning{insdljs}{No pdftex, but detected dvipdfm}}% - {\PackageWarning{insdljs}{Neither pdftex nor dvipdfm, - assuming dvips/dvipsone.}% - \def\eq@drivernum{0}\def\dljs@drivernum{0}% - \let\isOpenAction\dl@YES} - }{% - \ifcase\pdfoutput - \def\eq@drivernum{1}\def\dljs@drivernum{1}% - \let\isOpenAction\dl@NO - \PackageInfo{insdljs}{Pdftex detected.}% - \else - \def\eq@drivernum{0}\def\dljs@drivernum{0}% - \let\isOpenAction\dl@YES - \PackageWarning{insdljs}{Pdftex engine detected, - but is outputting dvi. Assuming dvips as the driver.}% - \fi - }% + \@ifundefined{eq@drivernum}{% + \PackageWarning{insdljs} + {No driver specified, will check for pdftex.} + \@ifundefined{pdfoutput}{% + \@ifundefined{@pdfm@mark}{\def\eq@drivernum{2}% + \def\dljs@drivernum{1}\let\isOpenAction\dl@NO + \PackageWarning{insdljs}{No pdftex, but detected dvipdfm}}% + {\PackageWarning{insdljs}{Neither pdftex nor dvipdfm, + assuming dvips/dvipsone.}% + \def\eq@drivernum{0}\def\dljs@drivernum{0}% + \let\isOpenAction\dl@YES} }{% - \begingroup - \count0=\eq@drivernum - \xdef\dljs@drivernum{\ifcase\count0 0\or1\or2\or0\else0\fi} - \ifnum\dljs@drivernum=0\global\let\isOpenAction\dl@YES - \else\global\let\isOpenAction\dl@NO\fi - \endgroup + \ifcase\pdfoutput + \def\eq@drivernum{1}\def\dljs@drivernum{1}% + \let\isOpenAction\dl@NO + \PackageInfo{insdljs}{Pdftex detected.}% + \else + \def\eq@drivernum{0}\def\dljs@drivernum{0}% + \let\isOpenAction\dl@YES + \PackageWarning{insdljs}{Pdftex engine detected, + but is outputting dvi. Assuming dvips as the driver.}% + \fi }% + }{% + \begingroup + \count0=\eq@drivernum + \xdef\dljs@drivernum{\ifcase\count0 0\or1\or2\or0\else0\fi} + \ifnum\dljs@drivernum=0\global\let\isOpenAction\dl@YES + \else\global\let\isOpenAction\dl@NO\fi + \endgroup + }% }{} % \end{macrocode} % I've always had problems with the pdftex option and inserting open page actions. @@ -653,7 +651,7 @@ % This approach seems to work. % \begin{macrocode} \ifnum\dljs@drivernum=1\relax - \RequirePackage{everyshi} + \RequirePackage{everyshi} \fi % \end{macrocode} % If \texttt{reqjs} is in effect, we execute the following code, otherwise, we @@ -663,10 +661,10 @@ \def\AEB@psMrk{[%] \space} \ifx\dl@reqJS\dl@YES - \def\dl@@reqJS{/Type/Requirement/S/EnableJavaScripts} - \ifpdf\pdfcatalog{\dl@@reqJS}\else - \ifxetex\immediate\@pdfm@mark{put @catalog <<\dl@@reqJS>>}\else - \literalps@out{\AEB@psMrk{Catalog} <<\dl@@reqJS>> /PUT pdfmark}\fi\fi + \def\dl@@reqJS{/Type/Requirement/S/EnableJavaScripts} + \ifpdf\pdfcatalog{\dl@@reqJS}\else + \ifxetex\immediate\@pdfm@mark{put @catalog <<\dl@@reqJS>>}\else + \literalps@out{\AEB@psMrk{Catalog} <<\dl@@reqJS>> /PUT pdfmark}\fi\fi \fi % \end{macrocode} % Added switch to mark whether djs is inserted @@ -789,18 +787,62 @@ % %\subsection{Begin Code} % -% Some control sequences that are useful for formatting JavaScript. -% \begin{macro}{\JS} -% \begin{macro}{\Named} -% A convenience command for writing JavaScript. +% Some control sequences that are useful for various +% actions. All appear within the \cs{A} key, eg, |\A{\JS{var x=17;}}|. Note the arguments +% of some are delimited by parentheses, others by braces. Sorry for the inconsistency, +% but these evolved over a period of years. Some keys require additional arguments which +% are typically inserted in raw form; eg, |\A{\GoToR(|\ameta{dest}|)/F(example.pdf)}|. +% \begin{macro}{\JS}\hskip-\marginparsep\texttt{\darg{\ameta{code}}} +% A convenience command for writing a JavaScript action % \begin{macrocode} \providecommand\JS[1]{/S/JavaScript/JS(#1)} -\providecommand\Named[1]{/S/Named/N/#1} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\Named}\hskip-\marginparsep\texttt{\darg{\ameta{name}}} +% A named action, eg, |\A{\Named{NextPage}}| +% \begin{macrocode} +\providecommand{\Named}[1]{/S/Named/N/#1} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\GoTo}\hskip-\marginparsep\texttt{(\ameta{name})} +% A go-to-action; eg, |\A{\GoTo(|\ameta{dest}|)}|. The argument can actually be a name +% (enclosed in parentheses), a byte string, or an array. +% \begin{macrocode} \providecommand{\GoTo}{/S/GoTo/D} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\GoToD}\hskip-\marginparsep\texttt{(\ameta{name})} +% A go-to-action destination; eg, |\A{\GoToD(|\ameta{dest}|)}| (same as \cs{GoTo}) +% \begin{macrocode} \providecommand{\GoToD}{/S/GoTo/D} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\GoToR}\hskip-\marginparsep\texttt{(\ameta{name})/F(\ameta{file-spec})} A go-to-remote action, +% where \ameta{name} is the destination in the remote file \ameta{file-spec}; eg, |\A{\GoToR(|\ameta{dest}|)/F(example.pdf)}| +% +% \begin{macrocode} \providecommand{\GoToR}{/S/GoToR} % \end{macrocode} % \end{macro} +% \begin{macro}{\Thread}\hskip-\marginparsep\texttt{\darg{\ameta{thread-title}}} +% \changes{v2.4.9}{2020/07/09}{Added \string\Thread} +% A thread action; this command is used in the \pkg{artthreads} package. +% \begin{macrocode} +\providecommand{\Thread}[1]{/S/Thread/D(#1)} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\URI}\hskip-\marginparsep\texttt{\darg{\ameta{string}}} +% A URI action, eg, |\A{\URI{http://www.example.com}}| +% \begin{macrocode} +\providecommand{\URI}[1]{/S/URI/URI(#1)} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\Launch}\hskip-\marginparsep\texttt{\darg{\ameta{file-spec}}} +% \changes{v2.5}{2020/12/20}{Added \string\Launch} +% A launch action +% \begin{macrocode} +\providecommand{\Launch}[1]{/Launch/F(#1)} +% \end{macrocode} % \end{macro} % \begin{macrocode} \def\previewMiKTeX{\def\jsR{\string\r}\def\jsT{\string\t}} @@ -808,16 +850,30 @@ \gdef\js@@R{\noexpand }} % \end{macrocode} -% We define space\DescribeMacro\pdfSp, left\DescribeMacro\pdfLBr\space and right\DescribeMacro\pdfRBr\space +% We define space\DescribeMacro\pdfSp, left\DescribeMacro\pdfLBr, and right \DescribeMacro\pdfRBr % braces in pdf (PDFDocEncoding); these are also defined % in \pkg{exerquiz} but under different names (\cs{eqSP}, \cs{eqLBr}, and \cs{eqRBr}). % \changes{v2.4.2}{2019/03/16}{Added \string\cs{pdfSP}, and others, and \string\cs{dl@sp@ce}} +% \changes{v2.4.10}{2020/11/28}{\string\cs{pdfSpacesOn} on by default, +% only for \string\app{dvips}; otherwise, \string\cs{pdfSpacesOff}} % \begin{macrocode} \def\pdfSPDef{\string\040} -\let\pdfSP\pdfSPDef +\def\dl@sp@ce{ } +% \end{macrocode} +% Beginning with \pkg{insdljs} dated 2019/03/16, we solve an age-old problem with \app{dvips}: This problem +% is that is wraps code around to the next line, according to some unknown algorithm. Normally this is not +% a problem, but occasionally it will wrap some JavaScript code that breaks the code. Solve this problem, +% we make the space character active, and replace it with \cs{pdfSP} (\cs{040}), which is octal for the space +% character. Now there are no free spaces for \app{dvips} to break the line at in the PS file. The feature +% is turned on by default, and may be turned off with \DescribeMacro\pdfSpacesOff\cs{pdfSpacesOff} +% and back on by \DescribeMacro\pdfSpacesOn\cs{pdfSpacesOn}. +% \begin{macrocode} +\def\pdfSpacesOn{\let\pdfSP\pdfSPDef} +\def\pdfSpacesOff{\let\pdfSP\dl@sp@ce} +\pdfSpacesOff +\ifpdf\else\ifxetex\else\pdfSpacesOn\fi\fi \def\pdfLBr{\string\173} \def\pdfRBr{\string\175} -\def\dl@sp@ce{ } % \end{macrocode} % \DescribeMacro\dl@restorespcs restores the obey spaces space to its default, % saved earlier. This command is placed at the end of each of the form field @@ -826,18 +882,24 @@ \bgroup\obeyspaces \gdef\dl@restorespcs{\global\let =\dl@sp@ce}\egroup % \end{macrocode} +% \cs{dljstfor} is used in the \texttt{cc4js} segment. % \begin{macrocode} \let\dljstfor\@tfor % \end{macrocode} -% 2012/06/20 Change the following code so there are no special cases. +% \leavevmode\DescribeMacro{\dfnJSCR}\hskip-\marginparsep\texttt{\darg{\ameta{eol}}} +% 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.} % \begin{macrocode} +\def\dfnJSCR#1{\gdef\dfnJSR{#1}\gdef\defineJSjsR{#1}} +\def\dfnJSCRDef{\dfnJSCR{\string\r\eqbs^^J}} +\dfnJSCRDef \def\jsR{\string\r\string\n} -%\def\jsR{\string\r\eqbs\js@@R} -\def\defineJSjsR{\string\r\eqbs^^J} % \end{macrocode} -% \changes{v2.0l}{2012/11/10}{Added \cs{jsN}} % \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} is those situations. +% 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}} % \begin{macrocode} \def\jsN{\string\n} {\catcode`\^^I\active % @@ -872,7 +934,7 @@ % \begin{macrocode} \def\dl@lparen{(}\def\dl@rparen{)} \def\genericNL{^^J} -\def\defjsLB{\expandafter\pdfmarkLB\@gobblefour} +\def\defjsLB{\gobiv} \def\genericLB{\eqbs\eqbs^^J} \def\pdfmarkLB{\eqbs^^J} \def\jscsDflt{\let\protect\noexpand\let\jslit\string @@ -1014,13 +1076,12 @@ % This verbatim is used internally to write the \texttt{.djs} files, containing % the JavaScript. % \begin{macrocode} -\newenvironment{js@verbatimwrite}% writes to current \js@verbatim@out - {% - \@bsphack - \let\do\@makeother\dospecials\catcode`\^^M\active - \def\verbatim@processline{% - \immediate\write\js@verbatim@out{\the\verbatim@line}}% - \verbatim@start}{\@esphack} +\newenvironment{js@verbatimwrite}{% writes to current \js@verbatim@out + \@bsphack + \let\do\@makeother\dospecials\catcode`\^^M\active + \def\verbatim@processline{\immediate + \write\js@verbatim@out{\the\verbatim@line}}\verbatim@start +}{\@esphack} % \end{macrocode} % Unlike the example of verbatimwrite in the \texttt{verbatim} package, we do not % automatically close the stream when we finish out \texttt{js@verbatimwrite} environment. @@ -1066,39 +1127,38 @@ \begingroup \catcode`\~=\active \lccode`\~=`\^^M \lowercase{\endgroup - \def\eqverbatim@#1~{\verbatim@@#1*end\@nil}% - \def\eqverbatim@@#1*end{% - \verbatim@addtoline{#1}% - \futurelet\dl@next\eqverbatim@@@}% - \def\eqverbatim@@@#1\@nil{% - \ifx\dl@next\@nil - \verbatim@processline - \verbatim@startline - \let\dl@next\eqverbatim@ - \else - \def\@tempa##1*end\@nil{##1}% - \@temptokena{*end}% - \def\dl@next{\expandafter\verbatim@test\@tempa#1\@nil~}% - \fi\dl@next}% + \def\eqverbatim@#1~{\verbatim@@#1*end\@nil}% + \def\eqverbatim@@#1*end{% + \verbatim@addtoline{#1}% + \futurelet\dl@next\eqverbatim@@@}% + \def\eqverbatim@@@#1\@nil{% + \ifx\dl@next\@nil + \verbatim@processline + \verbatim@startline + \let\dl@next\eqverbatim@ + \else + \def\@tempa##1*end\@nil{##1}% + \@temptokena{*end}% + \def\dl@next{\expandafter\verbatim@test\@tempa#1\@nil~}% + \fi\dl@next}% }% \def\jsexpverbatimwrite {% writes to current \js@verbatim@out - \@bsphack -% \escapechar=-1% - \ccpdfmark - \catcode`\<=12 \catcode`\>=12 - \input{dljscc.def}% -% Attempt to redefine some macros from the the verbatim package - \let\verbatim@=\eqverbatim@ - \let\verbatim@@=\eqverbatim@@ - \let\verbatim@@@=\eqverbatim@@@ + \@bsphack + \ccpdfmark + \catcode`\<=12 \catcode`\>=12 + \input{dljscc.def}% +% Attempt to redefine some macros from the verbatim package + \let\verbatim@=\eqverbatim@ + \let\verbatim@@=\eqverbatim@@ + \let\verbatim@@@=\eqverbatim@@@ % end redefine of verbatim package - \let\do\@makeother\eqdospecials% - \catcode`\^^M=\active\catcode`\^^I=12% - \def\verbatim@processline{% - \edef\expVerb{\the\verbatim@line}% - \immediate\write\js@verbatim@out{\expVerb}}% - \verbatim@start% + \let\do\@makeother\eqdospecials% + \catcode`\^^M=\active\catcode`\^^I=12% + \def\verbatim@processline{% + \edef\expVerb{\the\verbatim@line}% + \immediate\write\js@verbatim@out{\expVerb}}% + \verbatim@start% } \def\endjsexpverbatimwrite{\immediate\closeout\js@verbatim@out\@esphack} % \end{macrocode} @@ -1140,21 +1200,21 @@ \gdef\dl@tilda<\string~> \gdef\dl@sup<\string^> \endgroup \def\makeJSspecials{% - \def\\{\eqbs\eqbs}% % define \\ to be \\ - \let\jslit\string + \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`\}}} % 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 + \let\{\dl@lBrace\let\}\dl@rBrace % \end{macrocode} % \changes{v2.1}{2015/07/12}{\cs{let} \cs{u} to \cs{@empty}.} % \cs{let} \cs{u} to \cs{@empty}. % \begin{macrocode} - \let\u\@empty - \def\({\eqbs(}\def\){\eqbs)}% - \makespecialJS % make \r=\jsR and \t=\jsT + \let\u\@empty + \def\({\eqbs(}\def\){\eqbs)}% + \makespecialJS % make \r=\jsR and \t=\jsT } % \end{macrocode} % \subsection{Open Document Actions}\label{opendocactions} @@ -1180,12 +1240,12 @@ \def\dl@inheritzoom{/XYZ 0 0 0} \def\dl@mag#1{/XYZ null null #1} \edef\dl@Page#1{\ifcase\dljs@drivernum - {Page#1}\or\noexpand\pdfpageref#1\space\space 0 R\or - @page#1\fi} + {Page#1}\or\noexpand\pdfpageref#1\space\space 0 R\or + @page#1\fi} \def\dl@preProcDefns{\let\Page\dl@Page\let\mag\dl@mag - \let\fitpage\dl@fitpage\let\actualsize\dl@actualsize - \let\fitwidth\dl@fitwidth\let\fitheight\dl@fitheight - \let\fitvisible\dl@fitvisible\let\inheritzoom\dl@inheritzoom + \let\fitpage\dl@fitpage\let\actualsize\dl@actualsize + \let\fitwidth\dl@fitwidth\let\fitheight\dl@fitheight + \let\fitvisible\dl@fitvisible\let\inheritzoom\dl@inheritzoom } \let\aeb@additionalOpenAction\@empty \let\aeb@addActionCode\@empty @@ -1205,42 +1265,42 @@ %\end{verbatim} % \begin{macrocode} \newcommand{\addToDocOpen}[1]{% - \ifx\aebpFA\dl@NO - \g@addto@macro\aebpopentoks{#1}% - \def\aeb@additionalOpenAction{/Next {pubAddToDocOpen}}% + \ifx\aebpFA\dl@NO + \g@addto@macro\aebpopentoks{#1}% + \def\aeb@additionalOpenAction{/Next {pubAddToDocOpen}}% \ifpdf - \def\aeb@addActionCode{\immediate\pdfobj{<< - \aebpopentoks\aebp@rightDelimiters >>}% - \edef\addActionObj{\the\pdflastobj\space 0 R}}% + \def\aeb@addActionCode{\immediate\pdfobj{<< + \aebpopentoks\aebp@rightDelimiters >>}% + \edef\addActionObj{\the\pdflastobj\space 0 R}}% \else\ifxetex - \def\aeb@addActionCode{\immediate - \@pdfm@mark{obj @objAddActionObj - << \aebpopentoks\aebp@rightDelimiters >> }}% - \def\addActionObj{@objAddActionObj}% + \def\aeb@addActionCode{\immediate + \@pdfm@mark{obj @objAddActionObj + << \aebpopentoks\aebp@rightDelimiters >> }}% + \def\addActionObj{@objAddActionObj}% \else % postscript - \def\aeb@addActionCode{\literalps@out{% - \AEB@psMrk/_objdef {pubAddToDocOpen} - /type/dict /OBJ pdfmark^^J% - \AEB@psMrk{pubAddToDocOpen} << - \aebpopentoks\aebp@rightDelimiters >> /PUT pdfmark}}% - \def\addActionObj{{pubAddToDocOpen}}% + \def\aeb@addActionCode{\literalps@out{% + \AEB@psMrk/_objdef {pubAddToDocOpen} + /type/dict /OBJ pdfmark^^J% + \AEB@psMrk{pubAddToDocOpen} << + \aebpopentoks\aebp@rightDelimiters >> /PUT pdfmark}}% + \def\addActionObj{{pubAddToDocOpen}}% \fi\fi - \global\let\aebpFA\dl@YES - \let\@pdfstartview\@empty - \else - \edef\aebp@dljstmp{\aebp@rightDelimiters}% - \xdef\aebp@rightDelimiters{\aebp@dljstmp >> }% - \g@addto@macro\aebpopentoks{/Next << #1 }% - \fi + \global\let\aebpFA\dl@YES + \let\@pdfstartview\@empty + \else + \edef\aebp@dljstmp{\aebp@rightDelimiters}% + \xdef\aebp@rightDelimiters{\aebp@dljstmp >> }% + \g@addto@macro\aebpopentoks{/Next << #1 }% + \fi } \def\dljs@OpenActions{/OpenAction \addActionObj} \def\dljs@setOpenActions{\bgroup\makeJSspecials\dl@preProcDefns - \aeb@addActionCode - \ifpdf\pdfcatalog{\dljs@OpenActions}\else - \ifxetex\immediate - \@pdfm@mark{put @catalog <<\dljs@OpenActions>>}\else - \literalps@out{\AEB@psMrk - {Catalog} <<\dljs@OpenActions>> /PUT pdfmark}\fi\fi\egroup} + \aeb@addActionCode + \ifpdf\pdfcatalog{\dljs@OpenActions}\else + \ifxetex\immediate + \@pdfm@mark{put @catalog <<\dljs@OpenActions>>}\else + \literalps@out{\AEB@psMrk + {Catalog} <<\dljs@OpenActions>> /PUT pdfmark}\fi\fi\egroup} % \end{macrocode} % 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 @@ -1248,8 +1308,8 @@ % \changes{v2.3d}{2017/01/08}{Use \cs{aebpFA} to detect open actions} % \begin{macrocode} \@ifpackageloaded{aeb_pro}{} - {\AtBeginDocument{\ifx\aebpFA\dl@YES\expandafter - \dljs@setOpenActions\fi}} + {\AtBeginDocument{\ifx\aebpFA\dl@YES\expandafter + \dljs@setOpenActions\fi}} % \end{macrocode} % % \subsection{Open Page Actions}\label{openaction} @@ -1267,18 +1327,17 @@ % \begin{macrocode} \let\@CloseAction\@empty \def\@OAction@pdfmark{\literalps@out{% - \AEB@psMrk{ThisPage} << /AA << /O << \theFirstAction\space - \opentoks\@rightDelimiters >> \@CloseAction >> >> /PUT pdfmark}} + \AEB@psMrk{ThisPage} << /AA << /O << \theFirstAction\space + \opentoks\@rightDelimiters >> \@CloseAction >> >> /PUT pdfmark}} \def\@POAction@pdfmark{\literalps@out{% - \AEB@psMrk{ThisPage} << /AA << \@thisOpenAction - \@thisCloseAction >> >> /PUT pdfmark}% + \AEB@psMrk{ThisPage} << /AA << \@thisOpenAction + \@thisCloseAction >> >> /PUT pdfmark}% } \def\@OAction@pdftex{% - \ifx\isOpenAction\dl@YES - \xdef\pdftexOAction{/AA << /O << \theFirstAction\space - \opentoks\@rightDelimiters >> \@CloseAction >>}% - \AtNextShipout{\pdfpageattr=\expandafter{\pdftexOAction}}% - \fi + \ifx\isOpenAction\dl@YES + \xdef\pdftexOAction{/AA << /O << \theFirstAction\space + \opentoks\@rightDelimiters >> \@CloseAction >>}% + \AtNextShipout{\pdfpageattr=\expandafter{\pdftexOAction}}\fi } \def\@POAction@pdftex{% \xdef\thisPageActionpdftex{/AA << \@thisOpenAction @@ -1289,29 +1348,29 @@ % For \textsf{dvipdfm} % \begin{macrocode} \def\@OAction@dvipdfm{\ifx\isOpenAction\dl@YES - \@pdfm@mark{put @thispage << /AA << /O << \theFirstAction\space - \opentoks\@rightDelimiters >> \@CloseAction >> >>}\fi + \@pdfm@mark{put @thispage << /AA << /O << \theFirstAction\space + \opentoks\@rightDelimiters >> \@CloseAction >> >>}\fi } \def\@POAction@dvipdfm{% - \@pdfm@mark{put @thispage << /AA << \@thisOpenAction - \@thisCloseAction >> >>}% + \@pdfm@mark{put @thispage << /AA << \@thisOpenAction + \@thisCloseAction >> >>}% } % \end{macrocode} % Now we choose the one appropriate to the user's driver option. % \begin{macrocode} \ifcase\dljs@drivernum - \let\@OAction\@OAction@pdfmark - \let\@POAction\@POAction@pdfmark - \gdef\theFirstAction{/S/JavaScript/JS (\the\importfdftoks)} - \let\isOpenAction\dl@YES + \let\@OAction\@OAction@pdfmark + \let\@POAction\@POAction@pdfmark + \gdef\theFirstAction{/S/JavaScript/JS (\the\importfdftoks)} + \let\isOpenAction\dl@YES \or - \let\@OAction\@OAction@pdftex - \let\@POAction\@POAction@pdftex - \AtBeginDocument{\@OAction@pdftex} + \let\@OAction\@OAction@pdftex + \let\@POAction\@POAction@pdftex + \AtBeginDocument{\@OAction@pdftex} \or - \let\@OAction\@OAction@dvipdfm - \let\@POAction\@POAction@dvipdfm - \AtBeginDocument{\@OAction@dvipdfm} + \let\@OAction\@OAction@dvipdfm + \let\@POAction\@POAction@dvipdfm + \AtBeginDocument{\@OAction@dvipdfm} \fi % \end{macrocode} % \begin{macro}{\OpenAction} @@ -1350,7 +1409,6 @@ %\end{verbatim} %\cs{opentoks} accumulates the ``action''. % \begin{macrocode} -%\newtoks\opentoks \opentoks={} \def\opentoks{} % \end{macrocode} % The open action is really not meant for anything too fancy, such as searching using regular @@ -1360,14 +1418,14 @@ % open page action. % \begin{macrocode} \def\makespecialJS{% - \let\r\jsR\let\t\jsT\let\n\jsN} + \let\r\jsR\let\t\jsT\let\n\jsN} \def\@rightDelimiters{} % \end{macrocode} % If the next token is \cs{Next} then we gobble it up, and begin \cs{@OpenAction} % otherwise we begin \cs{@OpenAction}. This allows the ``chaining'' as illustrated above. % \begin{macrocode} \def\OpenAction{\@ifnextchar\Next - {\expandafter\@OpenAction\@gobble}{\@OpenAction}} + {\expandafter\@OpenAction\@gobble}{\@OpenAction}} % \end{macrocode} % \cs{@OpenAction}: This is the macro that actually does the work. We differentiate between whether the % current argument \texttt{\#1} is the first of all open actions, or not. If the former, @@ -1376,23 +1434,23 @@ % the \cs{opentoks} token register. % \begin{macrocode} \def\@OpenAction#1{% - \ifx\isOpenAction\dl@NO - {\makespecialJS\xdef\theFirstAction{#1}}% - \global\let\isOpenAction\dl@YES - \else - \edef\dljstmp{\@rightDelimiters}% - \xdef\@rightDelimiters{\dljstmp >> }% - {\makespecialJS\xdef\dljstmp{\opentoks /Next << #1 }}% - \xdef\opentoks{\dljstmp}% - \fi - \@nextOpenAction + \ifx\isOpenAction\dl@NO + {\makespecialJS\xdef\theFirstAction{#1}}% + \global\let\isOpenAction\dl@YES + \else + \edef\dljstmp{\@rightDelimiters}% + \xdef\@rightDelimiters{\dljstmp >> }% + {\makespecialJS\xdef\dljstmp{\opentoks /Next << #1 }}% + \xdef\opentoks{\dljstmp}% + \fi + \@nextOpenAction } % \end{macrocode} % As its last act, \cs{@OpenAction} calls \cs{@nextOpenAction}, which is nearly identical to % \cs{OpenAction}, except if there is no \cs{Next} token, the macro terminates. % \begin{macrocode} \def\@nextOpenAction{\@ifnextchar\Next{\expandafter - \@OpenAction\@gobble}{}} + \@OpenAction\@gobble}{}} % \end{macrocode} % \end{macro} % Here is a last example that uses the \texttt{insDLJS} environment and the \cs{OpenAction} command. This code @@ -1427,58 +1485,56 @@ % The first argument is on open page action, the second one is a closed page action. % \begin{macrocode} \def\protectJSCtrls{\def\r{\string\r\string\n}% - \def\t{\string\t}\def\n{\string\n}} + \def\t{\string\t}\def\n{\string\n}} \def\dljs@tstlp{\@ifnextchar\bgroup - {\let\dljs@multi\dl@YES\dljs@tstlpi}% - {\let\dljs@multi\dl@NO\dljs@tstlpi}} + {\let\dljs@multi\dl@YES\dljs@tstlpi}% + {\let\dljs@multi\dl@NO\dljs@tstlpi}} \def\dljs@tstlpi#1\@nil{}% % #1=arg, #2=O|C, #3=cmd -\def\dljs@bldScript#1#2#3{{% - \dljs@tstlp#1\@nil - \ifx\dljs@multi\dl@NO{\protectJSCtrls\xdef#3{/#2<<#1>>}}\else - \toks0={}\let\dljs@rAngles\@empty\count0=0 - \@tfor\dljs@arg:=#1\do{% - \ifnum\count0=0 - \toks0=\expandafter{\dljs@arg}\else - \toks2=\expandafter{\dljs@arg}% - \edef\holdtokstmp{\the\toks0 - /Next<<\the\toks2 }% - \edef\dljs@rAngles{\dljs@rAngles\space>>}% - \toks0=\expandafter{\holdtokstmp}% - \fi - \advance\count0by1 - }% - {\protectJSCtrls\xdef#3{/#2<<\the\toks0 \dljs@rAngles>>}% - \xdef#3{#3}}% - \fi -}} +\def\dljs@bldScript#1#2#3{\bgroup + \dljs@tstlp#1\@nil + \ifx\dljs@multi\dl@NO{\protectJSCtrls\xdef#3{/#2<<#1>>}}\else + \toks0={}\let\dljs@rAngles\@empty\count0=0 + \@tfor\dljs@arg:=#1\do{% + \ifnum\count0=0 + \toks0=\expandafter{\dljs@arg}\else + \toks2=\expandafter{\dljs@arg}% + \edef\holdtokstmp{\the\toks0 + /Next<<\the\toks2 }% + \edef\dljs@rAngles{\dljs@rAngles\space>>}% + \toks0=\expandafter{\holdtokstmp}% + \fi + \advance\count0by\@ne + }{\protectJSCtrls\xdef#3{/#2<<\the\toks0 \dljs@rAngles>>}% + \xdef#3{#3}}% + \fi +\egroup} \newcommand{\thisPageAction}[2]{% - \let\@CloseAction\@empty - \let\@thisOpenAction\@empty - \let\@thisCloseAction\@empty - \def\dljs@argi{#1}\def\dljs@argii{#2}% + \let\@CloseAction\@empty + \let\@thisOpenAction\@empty + \let\@thisCloseAction\@empty + \def\dljs@argi{#1}\def\dljs@argii{#2}% % \end{macrocode} % On the first page, \cs{OpenAction} is used to process the open action % \begin{macrocode} - \ifnum\value{page}=1\relax - \ifx\dljs@argii\@empty\else - \dljs@bldScript{#2}{C}{\@CloseAction}\fi - \ifx\dljs@argi\@empty\else\dljs@tstlp#1\@nil - \ifx\dljs@multi\dl@NO\OpenAction{#1}\else - \@tfor\dljs@arg:=#1\do{\expandafter - \OpenAction\expandafter{\dljs@arg}% - }\fi - \fi - \else + \ifnum\value{page}=1\relax + \ifx\dljs@argii\@empty\else + \dljs@bldScript{#2}{C}{\@CloseAction}\fi + \ifx\dljs@argi\@empty\else\dljs@tstlp#1\@nil + \ifx\dljs@multi\dl@NO\OpenAction{#1}\else + \@tfor\dljs@arg:=#1\do{\expandafter + \OpenAction\expandafter{\dljs@arg}% + }\fi\fi + \else % \end{macrocode} % If this is not the first page, we just populate the \texttt{/O} dictionary % \begin{macrocode} - \ifx\dljs@argi\@empty\else - \dljs@bldScript{#1}{O}{\@thisOpenAction}\fi - \ifx\dljs@argii\@empty\else - \dljs@bldScript{#2}{C}{\@thisCloseAction}\fi - \@POAction - \fi + \ifx\dljs@argi\@empty\else + \dljs@bldScript{#1}{O}{\@thisOpenAction}\fi + \ifx\dljs@argii\@empty\else + \dljs@bldScript{#2}{C}{\@thisCloseAction}\fi + \@POAction + \fi } % \end{macrocode} % \subsection{The \texttt{insDLJS} Environments} @@ -1544,10 +1600,10 @@ \let\insdljsloadVar\@empty \newenvironment{insDLJS}[3][] {% - \gdef\detectdljs{#1}\gdef\dljsBase{#2}% - \ifxetex{\def\1{\string\1}\def\2{\string2}% - \def\3{\string\3}\xdef\dljsName{#3}}\else - \Hy@unicodefalse\pdfstringdef{\dljsName}{#3}\fi + \gdef\detectdljs{#1}\gdef\dljsBase{#2}% + \ifxetex{\def\1{\string\1}\def\2{\string2}% + \def\3{\string\3}\xdef\dljsName{#3}}\else + \Hy@unicodefalse\pdfstringdef{\dljsName}{#3}\fi % \end{macrocode} % If the optional argument is not passed, % we generate one for the user. @@ -1555,32 +1611,32 @@ % we generate one for the user.} % \begin{macrocode} \ifx\detectdljs\@empty - \stepcounter{dljs@cnt}% - \xdef\detectdljs{_bInsdljsload\arabic{dljs@cnt}}% - \edef\insdljsloadVar{var \detectdljs=true;}% - \addtocounter{dljs@cnt}{-1}% + \stepcounter{dljs@cnt}% + \xdef\detectdljs{_bInsdljsload\arabic{dljs@cnt}}% + \edef\insdljsloadVar{var \detectdljs=true;}% + \addtocounter{dljs@cnt}{-1}% \fi - \global\let\multisegments\dl@NO\setcounter{dljssegs}{2}% - \global\dljsobjtoks={}% - \expandafter\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 - \or - \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 - \fi - \insert@DLJS + \global\let\multisegments\dl@NO\setcounter{dljssegs}{2}% + \global\dljsobjtoks={}\expandafter + \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 + \or + \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 + \fi + \insert@DLJS }{} % \end{macrocode} % @@ -1634,7 +1690,7 @@ % \begin{macrocode} \newenvironment{insDLJS*}[2][] {% - \gdef\detectdljs{#1}\gdef\dljsBase{#2}% + \gdef\detectdljs{#1}\gdef\dljsBase{#2}% % \end{macrocode} % If the optional argument is not passed, % we generate one for the user. @@ -1642,43 +1698,40 @@ % we generate one for the user.} % \begin{macrocode} \ifx\detectdljs\@empty - \stepcounter{dljs@cnt}% - \xdef\detectdljs{_bInsdljsload\arabic{dljs@cnt}}% - \edef\insdljsloadVar{var \detectdljs=true;}% - \addtocounter{dljs@cnt}{-1}% + \stepcounter{dljs@cnt}% + \xdef\detectdljs{_bInsdljsload\arabic{dljs@cnt}}% + \edef\insdljsloadVar{var \detectdljs=true;}% + \addtocounter{dljs@cnt}{-1}% \fi - \global\let\multisegments\dl@YES\setcounter{dljssegs}{2}% - \global\dljsobjtoks={}% - \expandafter\ifx\csname dljs\dljsBase\endcsname\relax - \else\@insjserrDuplicate\fi - \ifcase\dljs@drivernum - \let\insert@DLJS=\insert@DLJS@pdfmark - \expandafter - \let\csname endinsDLJS*\endcsname\endinsert@DLJS@pdfmark - \let\newsegment=\newsegment@pdfmark - \let\endnewsegment=\endnewsegment@pdfmark - \or - \let\insert@DLJS=\insert@DLJS@pdftex - \expandafter - \let\csname endinsDLJS*\endcsname\endinsert@DLJS@pdftex - \let\newsegment=\newsegment@pdftex - \let\endnewsegment=\endnewsegment@pdftex - \or - \let\insert@DLJS=\insert@DLJS@dvipdfm - \expandafter - \let\csname endinsDLJS*\endcsname\endinsert@DLJS@dvipdfm - \let\newsegment=\newsegment@dvipdfm - \let\endnewsegment=\endnewsegment@dvipdfm - \fi - \insert@DLJS + \global\let\multisegments\dl@YES\setcounter{dljssegs}{2}% + \global\dljsobjtoks={}% + \expandafter\ifx\csname dljs\dljsBase\endcsname\relax + \else\@insjserrDuplicate\fi + \ifcase\dljs@drivernum + \let\insert@DLJS=\insert@DLJS@pdfmark\expandafter + \let\csname endinsDLJS*\endcsname\endinsert@DLJS@pdfmark + \let\newsegment=\newsegment@pdfmark + \let\endnewsegment=\endnewsegment@pdfmark + \or + \let\insert@DLJS=\insert@DLJS@pdftex\expandafter + \let\csname endinsDLJS*\endcsname\endinsert@DLJS@pdftex + \let\newsegment=\newsegment@pdftex + \let\endnewsegment=\endnewsegment@pdftex + \or + \let\insert@DLJS=\insert@DLJS@dvipdfm\expandafter + \let\csname endinsDLJS*\endcsname\endinsert@DLJS@dvipdfm + \let\newsegment=\newsegment@dvipdfm + \let\endnewsegment=\endnewsegment@dvipdfm + \fi + \insert@DLJS }{} \def\@insjserrDuplicate{% - \typeout{^^J! insdljs Package error.} - \typeout{! insDLJS environment: On line number \the\inputlineno,} - \typeout{! the base name `\dljsBase' has already been chosen.} - \typeout{! A DLJS earlier defined has been overwritten!} - \typeout{! Choose another name for the first required argument} - \typeout{! of the insDLJS environment.^^J} + \typeout{^^J! insdljs Package error.} + \typeout{! insDLJS environment: On line number \the\inputlineno,} + \typeout{! the base name `\dljsBase' has already been chosen.} + \typeout{! A DLJS earlier defined has been overwritten!} + \typeout{! Choose another name for the first required argument} + \typeout{! of the insDLJS environment.^^J} } % \end{macrocode} % \end{macro} @@ -1708,18 +1761,18 @@ % \begin{macrocode} \let\DLspecialDefs\@empty \def\fdfAfterheader#1{% - \iwvo{\string\begingroup\string\efdlspecials} - \iwvo{\string\DLspecialDefs\string#1} - \iwvo{\string\isdljstrue} - \iwvo{\string\makeatletter} - \iwvo{\string\immediate\string\openout\string + \iwvo{\string\begingroup\string\efdlspecials} + \iwvo{\string\DLspecialDefs\string#1} + \iwvo{\string\isdljstrue} + \iwvo{\string\makeatletter} + \iwvo{\string\immediate\string\openout\string \js@verbatim@out=\string\js@Path\space\dljsBase.fdf}% - \iwvo{\string\begin{jsexpverbatimwrite}} - \iwvo{\string\firstFDFline} - \iwvo{1 0 obj} - \iwvo{<< /FDF << /JavaScript << /Doc 2 0 R /After 3 0 R >> >> >> } - \iwvo{endobj} - \iwvo{2 0 obj} + \iwvo{\string\begin{jsexpverbatimwrite}} + \iwvo{\string\firstFDFline} + \iwvo{1 0 obj} + \iwvo{<< /FDF << /JavaScript << /Doc 2 0 R /After 3 0 R >> >> >> } + \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} @@ -1753,34 +1806,34 @@ \def\restoreDLspecialDefs{\let\DLspecialDefs\@empty} \newenvironment{execJS}[2][\relax] {% - \def\x{#1}\ifx\x\@empty\def\x{\relax}\fi - \gdef\detectdljs{\string_#2}\gdef\dljsBase{#2}% - \global\dljsobjtoks={}% - \expandafter\gdef\csname dljs\dljsBase\endcsname{}% - \ifx\importdljs\dl@YES\ifx\execjs\dl@YES - \ifx\dl@gopro\dl@YES - \ifnum\dljs@drivernum=0\relax - \addImportAnFDF\importAnFDFTemplate - \else - \OpenAction{/S/JavaScript/JS (\importAnFDFTemplate)}% - \fi\fi + \def\x{#1}\ifx\x\@empty\def\x{\relax}\fi + \gdef\detectdljs{\string_#2}\gdef\dljsBase{#2}% + \global\dljsobjtoks={}% + \expandafter\gdef\csname dljs\dljsBase\endcsname{}% + \ifx\importdljs\dl@YES\ifx\execjs\dl@YES + \ifx\dl@gopro\dl@YES + \ifnum\dljs@drivernum=0\relax + \addImportAnFDF\importAnFDFTemplate + \else + \OpenAction{/S/JavaScript/JS (\importAnFDFTemplate)}% \fi\fi - \immediate\openout \js@verbatim@out \js@Path\dljsBase.djs - \expandafter\fdfAfterheader\expandafter{\x}% - \js@verbatimwrite + \fi\fi + \immediate\openout \js@verbatim@out \js@Path\dljsBase.djs + \expandafter\fdfAfterheader\expandafter{\x}% + \js@verbatimwrite }{% - \fdfendstreamobj - \endjs@verbatimwrite - \fdftrailer + \fdfendstreamobj + \endjs@verbatimwrite + \fdftrailer % \end{macrocode} % Added \cs{restoreDLspecialsDefs} to restore \cs{DLspecialDefs} to its default of \cs{@empty}. % \changes{v2.4.4}{2019/07/14}{Added \string\cs{restoreDLspecialsDefs}} % \begin{macrocode} - \iwvo{\string\restoreDLspecialDefs}% - \closejs@verbatim@out - \expandafter\xdef\csname\dljsBase OBJ\endcsname{\the\dljsobjtoks}% - \edef\@dljstmp{\noexpand\AtBeginDocument{% - \noexpand\input{\js@Path\dljsBase.djs}}}\@dljstmp + \iwvo{\string\restoreDLspecialDefs}% + \closejs@verbatim@out + \expandafter\xdef\csname\dljsBase OBJ\endcsname{\the\dljsobjtoks}% + \edef\@dljstmp{\noexpand\AtBeginDocument{% + \noexpand\input{\js@Path\dljsBase.djs}}}\@dljstmp % \end{macrocode} %\changes{v2.2g}{2016/05/11}{Removed \string\cs{AtBeginDocument} code %from the \string\texttt{execJS} environment. This causes problems with @@ -1825,7 +1878,7 @@ % of the environment. (Note, within the body, there is no escape character unless you change catcode of another character % within the optional argument of the \env{defineJS} environments.) %\begin{verbatim} -% \begin{defineJS}[\catcode`\!=0\relax]{\myCode} +% \begin{defineJS}[\makeesc\!]{\myCode} % var p1=!p(1), p2=!p(2); % app.alert("p1 + p2 = " + Number(p1+p2) ); % \end{defineJS} @@ -1882,58 +1935,61 @@ \JStoks=\expandafter{\x}\expandafter \edef\csname\p@r@m\the\c@dljs@cnt\endcsname{\the\JStoks}}} % \end{macrocode} -% Beginning with \pkg{insdljs} dated 2019/03/16, we solve an age-old problem with \app{dvips}: This problem -% is that is wraps code around to the next line, according to some unknown algorithm. Normally this is not -% a problem, but occassionally it will wrap some JavaScript code that breaks the code. Solve this problem, -% we make the space character active, and replace it with \cs{pdfSP} (\cs{040}), which is octal for the space -% character. Now there are no free spaces for \app{dvips} to break the line at in the PS file. The feature -% is turned on by default, and may be turned off with \DescribeMacro\pdfSpacesOff\cs{pdfSpacesOff} -% and back on by \DescribeMacro\pdfSpacesOn\cs{pdfSpacesOn}. -% \begin{macrocode} -\def\pdfSpacesOn{\let\pdfSP\pdfSPDef} -\def\pdfSpacesOff{\let\pdfSP\dl@sp@ce} -% \end{macrocode} % \DescribeMacro{\dlcombine}\hskip-\marginparsep\texttt{(\#1)(\#2)} -% Within the \env{defineJS} environment, spaces are obeyed, at time, we want to says -% \verb*|@currQuiz MyField|, for example. which within \env{defineJS} gets expanded to +% (In this discussion, it is assumed `\texttt{@}' is the escape character +% within \env{defineJS}.) +% Within the \env{defineJS} environment, spaces are obeyed; at times, we want to say +% \verb*|@currQuiz MyField|, for example, which within \env{defineJS} gets expanded to % \verb*|q1 MyField|, not \texttt{q1MyField} as it should be. To solve this and other % problems like it, use \verb|@dlcombine(@currQuiz)(MyField)| which does expand -% to the intended expression. (In this discussion, it is assumed \texttt{@} is the escape character -% within \env{defineJS}.) +% to the intended expression. % \changes{v2.4.3}{2019/06/27}{Added \string\cs{dlcombine}} % \begin{macrocode} \def\dlcombine(#1)(#2){#1#2} % \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}. +% \begin{macrocode} +\def\dlcontig(#1){#1} +% \end{macrocode} % When you declare a character to be an escape within the optional argument of \env{defineJS}, -% that character may be needed in the code; for example if we say |\catcode`\!=0\relax|, and -% within the JavaScript code you have \texttt{if (x != 0 ) ...}, there is a problem: the JavaScript +% that character may be needed in the code; for example if we declare |\makeesc\!|, and +% within the JavaScript code we have \texttt{if (x != 0 )...}, the JavaScript % code is broken. As a fix for this problem, you can declare \DescribeMacro\escIs|\escIs{!}|, -% which in turn defines \DescribeMacro\Eschr\cs{Eschr}. the above code -% should then be written as \texttt{if (x !Eschr= 0 ) ...}; messy, but it works. The lines -% below is the recommended method of declaring \cs{escIs}: +% which in turn defines \DescribeMacro\Eschr\cs{Eschr} to expand to `\texttt!'. The above code +% may then be written as \texttt{if (x !Eschr= 0 )...}; messy, but it works. The lines +% below are the recommended method of declaring \cs{escIs}: %\begin{verbatim} % \pushButton[\cmd{\escIs{!}\bParams{77}{11}\eParams} % \A{\JS{\myCode}}]{pbfld2}{.5in}{11bp} %\end{verbatim} -% These declarations makes everything local to the group within which the button is built. +% These declarations make everything local to the group within which the button is built. % \begin{macrocode} \def\escIs#1{\def\Eschr{#1}} % \end{macrocode} % \DescribeMacro\makeesc\hskip-\marginparsep\texttt{\cs{\ameta{char}}} % \cs{dl@makeesc} is a helper command that sets the escape character, -% Within the \env{defineJS} environments, it is \cs{let} to \DescribeMacro\makeesc\cs{makeesc}; -% eg, |\makeesc\@| +% Within the \env{defineJS} environments, it is \cs{let} to \cs{makeesc}; +% eg, |\makeesc\!|. % \changes{v2.4.3}{2019/06/27}{Added \string\cs{dl@makeesc}} % \begin{macrocode} \def\dl@makeesc#1{\catcode`#1=0\relax} % \end{macrocode} -% \leavevmode\DescribeMacro\dlgobToFi Used to format \env{defineJS} content -% when a conditional leaves an empty space; for example, +% \DescribeMacro\makecmt\hskip-\marginparsep\texttt{\cs{\ameta{char}}} Likewise, +% you can conviently declare the comment character, if any; eg, |\makecmt\%|. +% \changes{v2.4.10}{2020/11/28}{Added \string\cs{dl@makecmt}} +% \begin{macrocode} +\def\dl@makecmt#1{\catcode`#1=14\relax} +% \end{macrocode} +% \paragraph*{Incorporating {\LaTeX} conditionals in \env{defineJS}.} {\LaTeX} conditionals +% 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\*\catcode`\%=14\relax]{\X} -%var w=1; -%*ifx*Y*@empty*dlgobToFi*else% +%\begin{defineJS}[\makeesc\*\makecmt\%]{\X} +%var w=1;% +%*ifx*Y*@empty*else %var x=1; %var y=1;*fi %var z=1; @@ -1951,59 +2007,97 @@ %var y=1; %var z=1; %\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} % \begin{macrocode} -\def\dlgobToFi#1\fi{\defjsLB} +\def\dlgobToFi#1\fi{\fi\defjsLB} +\let\gobiv\@gobblefour % \end{macrocode} -% Finally, we get to the definition of \env{defineJS}, and its compatriates. +% \textbf{Typesetting content with the \cs{typeset} keyword macro.} +% To aid typesetting the contents of a \env{defineJS} environment, +% the keyword macro \DescribeMacro{\typeset}\cs{typeset}, which is defined only within the environment, +% can be used. Pass \cs{typeset} to \env{defineJS} through the optional argument. +% \changes{v2.5}{2020/12/20}{Added the command \string\cs{typeset} to typeset the +% contents of the \string\env{defineJS} environment} % \begin{macrocode} -\newenvironment{defineJS}[2][]{% - \let\makeesc\dl@makeesc - \expandafter\@ifundefined\expandafter{% - \expandafter\@gobble\string#2}{}{% - \PackageWarning{insdljs}{The command - \string#2 already defined}}% - \gdef\defineJSArg{#2}\JStoks={}% - \def\verbatim@processline{% - \xdef\JS@temp{\the\JStoks\the\verbatim@line\defineJSjsR}% - \global\JStoks=\expandafter{\JS@temp}}% - \let\do\@makeother\dospecials\catcode`\^^M\active +\newif\ifdlfortypeset \dlfortypesetfalse +% \end{macrocode} +% 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. +% \begin{macrocode} +\def\dl@typesetthis{\global\dlfortypesettrue + \dfnJSCR{\hfil\break\null}} +% \end{macrocode} +% Next, we define some components common to all define-js environments. First, we initialize +% the environment with several \cs{let}s. +% \begin{macrocode} +\def\@initdfnJS{\let\jsFrstLne\dl@One\let\makeesc\dl@makeesc + \let\makecmt\dl@makecmt\let\typeset\dl@typesetthis} +% \end{macrocode} +% (2020/12/20) Insert \cs{defineJSJsR} (an alias of \cs{dfnJSR}) at the \emph{beginning} of the second line +% onward. This gives better formatting of the code within the editor, without +% an empty final line. +% \changes{v2.5}{2020/12/20}{Modified \string\cs{verbatim@line} in \string\env{defineJS}} +% \begin{macrocode} +\def\@vrbsetupdfnJS{\def\verbatim@processline{\ifx\jsFrstLne\dl@One + \let\jsFrstLne\dl@Zero + \xdef\JS@temp{\the\JStoks\the\verbatim@line}\else + \xdef\JS@temp{\the\JStoks\defineJSjsR\the\verbatim@line}\fi + \global\JStoks=\expandafter{\JS@temp}}% + \let\do\@makeother\dospecials\catcode`\^^M\active} +% \end{macrocode} +% We \cs{let} \cs{space} to \cs{pdfSP}, and declare \cs{obeyspaces}, in this way, the space +% character is active and is equal to \cs{040} (space). Start the verbatim environment. +% \begin{macrocode} +\def\b@vrbdfnJS#1{\global\let\space\pdfSP\makeatletter\obeyspaces% +% \end{macrocode} +% Pass the first argument here. If this environment is for typesetting, +% initialize the tokens \cs{JStoks} to be in a group, and such. The insertion +% of \cs{dl@paramlocal} is to support the \cs{bParams}/\allowbreak\cs{eParams} construct. +% \begin{macrocode} + #1\ifdlfortypeset\global\JStoks={\bgroup\leavevmode\dl@paramlocal}\fi% + \verbatim@start} % \end{macrocode} -% We let \cs{space} to \cs{pdfSP}, and declare \cs{obeyspaces}, in this way, the space -% character is active and is equal to \cs{040} (space). +% The end of the environment code % \begin{macrocode} - \global\let\space\pdfSP\makeatletter\obeyspaces - #1% - \verbatim@start -}{\gdef\eq@JStemp{\expandafter\edef\defineJSArg{\the\JStoks}}% - \global\let\space\dl@sp@ce\aftergroup\eq@JStemp} +\def\e@vrbdfnJS{\gdef\eq@JStemp{\ifdlfortypeset\global + \JStoks=\expandafter{\the\JStoks\egroup}\fi\expandafter + \edef\defineJSArg{\the\JStoks}\global + \dlfortypesetfalse}\global\let\space\dl@sp@ce\aftergroup\eq@JStemp} +% \end{macrocode} +% Finally, we get to the definition of \env{defineJS}, and its compatriates. +% \begin{macrocode} +\newenvironment{defineJS}[2][]{\@initdfnJS + \expandafter\@ifundefined\expandafter{% + \expandafter\@gobble\string#2}{}{\PackageWarning{insdljs} + {The command \string#2 already defined}}% + \gdef\defineJSArg{#2}\global\JStoks={}% + \@vrbsetupdfnJS + \b@vrbdfnJS{#1}}{\e@vrbdfnJS} % \end{macrocode} % \end{environment} % \begin{environment}{@defineJS} % Silent version of \texttt{defineJS}, can repeatedly be used to redefine the same -% macro. +% macro. Note: |\makeesc\@| cannot be declared with the \env{@defineJS} environment. % \begin{macrocode} -\newenvironment{@defineJS}[2][] -{% - \let\makeesc\dl@makeesc - \gdef\defineJSArg{#2}\JStoks={}% - \def\verbatim@processline{% - \xdef\JS@temp{\the\JStoks\the\verbatim@line\defineJSjsR}% - \global\JStoks=\expandafter{\JS@temp}}% - \let\do\@makeother\dospecials\catcode`\^^M\active - \global\let\space\pdfSP\makeatletter\obeyspaces - #1% - \verbatim@start -}{\gdef\eq@JStemp{\expandafter\edef\defineJSArg{\the\JStoks}}% - \global\let\space\dl@sp@ce\aftergroup\eq@JStemp} +\newenvironment{@defineJS}[2][]{\@initdfnJS + \gdef\defineJSArg{#2}\global\JStoks={}% + \@vrbsetupdfnJS + \b@vrbdfnJS{#1}}{\e@vrbdfnJS} % \end{macrocode} % \end{environment} % \begin{environment}{defineJS*} -% We declare a public version of \env{@defineJS} +% A silent public version of \env{defineJS}. +% The \env{defineJS*} environment cannot use |\makeesc\*| in its optional argument. % \changes{v2.4.2}{2019/03/16}{define \string\env{defineJS*} a public version of \string\env{@defineJS}} % \begin{macrocode} -\newenvironment{defineJS*}{\@defineJS}{\end@defineJS} +\newenvironment{defineJS*}[2][]{\@initdfnJS + \gdef\defineJSArg{#2}\global\JStoks={}% + \@vrbsetupdfnJS + \b@vrbdfnJS{#1}}{\e@vrbdfnJS} % \end{macrocode} % \end{environment} % An author might want these definitions to be local in definition, so the @@ -2050,33 +2144,33 @@ {\end@defineJS} \let\did@Print\@empty \def\dljs@willDidActions{/AA << - \ifx\test@will@Close\@empty\else/WC << - \JS{\will@Close} >>\fi - \ifx\test@will@Save\@empty\else/WS << - \JS{\will@Save} >>\fi - \ifx\test@did@Save\@empty\else/DS << - \JS{\did@Save} >>\fi - \ifx\test@will@Print\@empty\else/WP << - \JS{\will@Print} >>\fi - \ifx\test@did@Print\@empty\else/DP << - \JS{\did@Print} >>\fi - >> + \ifx\test@will@Close\@empty\else/WC << + \JS{\will@Close} >>\fi + \ifx\test@will@Save\@empty\else/WS << + \JS{\will@Save} >>\fi + \ifx\test@did@Save\@empty\else/DS << + \JS{\did@Save} >>\fi + \ifx\test@will@Print\@empty\else/WP << + \JS{\will@Print} >>\fi + \ifx\test@did@Print\@empty\else/DP << + \JS{\did@Print} >>\fi + >> } \newcommand\dljs@setDocActions{% - \edef\test@will@Close{\will@Close}% - \edef\test@will@Save{\will@Save}% - \edef\test@did@Save{\did@Save}% - \edef\test@will@Print{\will@Print}% - \edef\test@did@Print{\did@Print}% + \edef\test@will@Close{\will@Close}% + \edef\test@will@Save{\will@Save}% + \edef\test@did@Save{\did@Save}% + \edef\test@will@Print{\will@Print}% + \edef\test@did@Print{\did@Print}% % \end{macrocode} % Driver dependent code to put any document actions into the additional actions % dictionary of the document catalog. % \begin{macrocode} - \ifpdf\pdfcatalog{\dljs@willDidActions}\else - \ifxetex\immediate - \@pdfm@mark{put @catalog <<\dljs@willDidActions>>}\else - \literalps@out{\AEB@psMrk - {Catalog} <<\dljs@willDidActions>> /PUT pdfmark}\fi\fi + \ifpdf\pdfcatalog{\dljs@willDidActions}\else + \ifxetex\immediate + \@pdfm@mark{put @catalog <<\dljs@willDidActions>>}\else + \literalps@out{\AEB@psMrk + {Catalog} <<\dljs@willDidActions>> /PUT pdfmark}\fi\fi } \@ifpackageloaded{aeb_pro}{} {\AtBeginDocument{\dljs@setDocActions}} @@ -2107,7 +2201,7 @@ \iwvo{\string\isdljstrue} \iwvo{\string\makeatletter} \iwvo{\string\immediate\string\openout\string - \js@verbatim@out=\string\js@Path\space\dljsBase.fdf}% + \js@verbatim@out=\string\js@Path\space\dljsBase.fdf}% \iwvo{\string\begin{jsexpverbatimwrite}} \iwvo{\string\firstFDFline} \iwvo{1 0 obj} @@ -2115,7 +2209,7 @@ \iwvo{endobj} \iwvo{2 0 obj} \iwvo{[ \string\csname\string\@gobble\space\dljsBase% - OBJ\string\endcsname]} + OBJ\string\endcsname]} \iwvo{endobj} } \def\fdfbeginstreamobj @@ -2130,10 +2224,9 @@ %\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}.} % \begin{macrocode} - \ifx\insdljsloadVar\@empty\else - \iwvo{\insdljsloadVar} - \global\let\insdljsloadVar\@empty - \fi + \ifx\insdljsloadVar\@empty\else + \iwvo{\insdljsloadVar} + \global\let\insdljsloadVar\@empty\fi } \def\fdfendstreamobj{% \iwvo{endstream} @@ -2174,20 +2267,18 @@ if(typeof \detectdljs\space == "undefined")\jsR\jsT % through a trusted function. %} % \begin{macrocode} - ( app.viewerVersion > 8 ) ? % - aebTrustedFunctions( this, aebImportAnFDF, % - "\js@Path\dljsBase.fdf") : % - this.importAnFDF("\js@Path\dljsBase.fdf");\jsR + ( app.viewerVersion > 8 ) ? % + aebTrustedFunctions( this, aebImportAnFDF, % + "\js@Path\dljsBase.fdf") : % + this.importAnFDF("\js@Path\dljsBase.fdf");\jsR } % \end{macrocode} % Add in another template into \cmd{\importfdftoks}. % \begin{macrocode} \def\addImportAnFDF#1{% - \ifx\importdljs\dl@YES -% \let\jsR\relax\let\jsT\relax - \edef\importAnFDFtmp{\the\importfdftoks#1}% - \global\importfdftoks=\expandafter{\importAnFDFtmp}% - \fi + \ifx\importdljs\dl@YES + \edef\importAnFDFtmp{\the\importfdftoks#1}% + \global\importfdftoks=\expandafter{\importAnFDFtmp}\fi } % \end{macrocode} % This is used by \texttt{insert@DLJS@pdfmark} and is placed @@ -2201,47 +2292,47 @@ if(typeof \detectdljs\space == "undefined")\jsR\jsT % authorized way. % \begin{macrocode} \newenvironment{newsegment@pdfmark}[1]{% - \addtocounter{dljssegs}{1}% - \addtocounter{dljs@cnt}{1}% - \Hy@unicodefalse\pdfstringdef{\dljsName}{#1}% - \edef\@dljstmp{\the\dljsobjtoks(\dljsName) - \thedljssegs\space 0 R\space} - \global\dljsobjtoks=\expandafter{\@dljstmp} - \fdfbeginstreamobj - \js@verbatimwrite + \addtocounter{dljssegs}{1}\addtocounter{dljs@cnt}{1}% + \Hy@unicodefalse\pdfstringdef{\dljsName}{#1}% + \edef\@dljstmp{\the\dljsobjtoks(\dljsName) + \thedljssegs\space 0 R\space}% + \global\dljsobjtoks=\expandafter{\@dljstmp}% + \fdfbeginstreamobj + \js@verbatimwrite }{% - \fdfendstreamobj - \endjs@verbatimwrite + \fdfendstreamobj + \endjs@verbatimwrite } \def\insert@DLJS@pdfmark{% - \global\let\dljspresent\dl@YES - \expandafter\gdef\csname dljs\dljsBase\endcsname{}% - \ifx\importdljs\dl@YES\ifx\dl@gopro\dl@YES - \addImportAnFDF\importAnFDFTemplate - \fi\fi - \immediate\openout \js@verbatim@out \js@Path\dljsBase.djs - \fdfheader - \ifx\multisegments\dl@NO\expandafter - \newsegment\expandafter{\expandafter\dljsName\expandafter}\fi + \global\let\dljspresent\dl@YES + \expandafter\gdef\csname dljs\dljsBase\endcsname{}% + \ifx\importdljs\dl@YES\ifx\dl@gopro\dl@YES + \addImportAnFDF\importAnFDFTemplate\fi\fi + \immediate\openout \js@verbatim@out \js@Path\dljsBase.djs + \fdfheader + \ifx\multisegments\dl@NO\expandafter + \newsegment\expandafter{\expandafter\dljsName\expandafter}\fi } \def\endinsert@DLJS@pdfmark{% - \ifx\importdljs\dl@YES - \ifx\multisegments\dl@NO\expandafter\endnewsegment\fi - \fdftrailer - \closejs@verbatim@out - \expandafter\xdef\csname\dljsBase% - OBJ\endcsname{\the\dljsobjtoks}% - \edef\@dljstmp{\noexpand\AtBeginDocument{% - \noexpand\input{\js@Path\dljsBase.djs}}}% - \@dljstmp - \ifx\firstdljs\dl@YES - \AtBeginDocument{\edef\@dljstmp{\importAnFDF}% - \@dljstmp}\global\let\firstdljs\dl@NO - \fi + \ifx\importdljs\dl@YES + \ifx\multisegments\dl@NO\expandafter\endnewsegment\fi + \fdftrailer + \closejs@verbatim@out + \expandafter\xdef\csname\dljsBase% + OBJ\endcsname{\the\dljsobjtoks}% + \edef\@dljstmp{\noexpand\AtBeginDocument{% + \noexpand\input{\js@Path\dljsBase.djs}}}% + \@dljstmp + \ifx\firstdljs\dl@YES + \AtBeginDocument{\edef\@dljstmp{\importAnFDF}% + \@dljstmp}\global\let\firstdljs\dl@NO \fi + \fi } % \end{macrocode} +% % \subsection{For \texttt{pdftex}/\texttt{dvipdfm}} +% % Again, we break the problem of creating DLJS into four parts: \cmd{\begindljs}, % \cmd{\enddljs}, the code itself, driver dependent material, \cmd{\write@pdftex@obj} % and \cmd{\write@dvipdfm@obj}. @@ -2358,9 +2449,8 @@ if(typeof \detectdljs\space == "undefined")\jsR\jsT % of the PDF document. This code is inserted into the document in \texttt{insert@DLJS@pdftex} % using \cmd{\AtEndDocument}. % \begin{macrocode} -\def\setDLJSRef@pdftex -{% - \noexpand\immediate\noexpand\pdfobj {% +\def\setDLJSRef@pdftex{\noexpand + \immediate\noexpand\pdfobj {% << /Names [\the\importfdftoks] >> }% \edef\noexpand\objNames{\noexpand\the\noexpand\pdflastobj\space 0 R}% \pdfnames {/JavaScript \noexpand\objNames}% @@ -2371,8 +2461,7 @@ if(typeof \detectdljs\space == "undefined")\jsR\jsT % \begin{macrocode} \newenvironment{newsegment@dvipdfm}[1] {% - \addtocounter{dljssegs}{1}% - \addtocounter{dljs@cnt}{1}% + \addtocounter{dljssegs}{1}\addtocounter{dljs@cnt}{1}% \edef\tmp{^^J\string\immediate\string \csname\space @pdfm@mark\string\endcsname {obj @obj\dljsBase\roman{dljssegs}\space << /S/JavaScript% diff --git a/texmf-dist/source/latex/acrotex/web.dtx b/texmf-dist/source/latex/acrotex/web.dtx index 473c39cc..0704cade 100644 --- a/texmf-dist/source/latex/acrotex/web.dtx +++ b/texmf-dist/source/latex/acrotex/web.dtx @@ -25,8 +25,19 @@ %<*driver> \documentclass{ltxdoc} \usepackage[colorlinks,hyperindex=false]{hyperref} -%\def\texorpdfstring#1#2{#1} -%\pdfstringdefDisableCommands{\let\\\textbackslash} +\usepackage{fancyvrb} +\gdef\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\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}}}} \OnlyDescription % comment out for implementation details \EnableCrossrefs \CodelineIndex @@ -35,9 +46,6 @@ {\def\IndexOpt{\DescribeMacro}\def\IndexKey{\DescribeMacro}\let\setupFullwidth\relax \PackageInfo{web}{aebdocfmt.def cannot be found}} \begin{document} -\def\CMD#1{\textbackslash#1} -\let\pkg\textsf -\let\opt\texttt \addtolength{\marginparwidth}{3pt} \GetFileInfo{web.sty} \title{Web: A Screen Design Package} @@ -85,8 +93,8 @@ % \subsection{Drivers Supported} % \begin{macrocode} \IfFileExists{xcolor.sty}{% - \def\eq@ColorPackage{xcolor}% - \PassOptionsToPackage{xcolor}{table,hyperref}% + \def\eq@ColorPackage{xcolor}% + \PassOptionsToPackage{xcolor}{table,hyperref}% }{\def\eq@ColorPackage{color}} % \end{macrocode} % Force package to use \textsf{color}.\IndexOpt{noxcolor} @@ -106,20 +114,21 @@ \let\i@web@ddtoHyOpts\@empty \let\eq@driver@name\@empty \let\web@YES=y \let\web@NO=n +\let\web@One=1 \let\web@Zero=0 % \end{macrocode} -% \textsf{dvipsone}\IndexOpt{dvipsone}\space is the dvi-to-ps driver of the YandY system that I still +% \leavevmode\IndexOpt{dvipsone}\textsf{dvipsone} is the dvi-to-ps driver of the YandY system that I still % use, I hate to give it up. Even I have not used the \IndexOpt{dviwindo}\texttt{dviwindo} option % for many years, and is obsolete. % \begin{macrocode} \DeclareOptionX{dvipsone}{% - \def\eq@drivernum{0}\def\eq@driver@name{dvipsone}% + \def\eq@drivernum{0}\def\eq@driver@name{dvipsone}% % \end{macrocode} % 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}}% +% \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 @@ -127,48 +136,45 @@ % The revised definition of \cs{web@set@paper}, we now set the papersize % at the beginning of the document. % \begin{macrocode} - \let\web@set@paper\@empty - \@namedef{papersize@for@\eq@driver@name}{\AtBeginDocument{% - \special{papersize=\the\paperwidth,\the\paperheight}}}% + \let\web@set@paper\@empty + \@namedef{papersize@for@\eq@driver@name}{\AtBeginDocument + {\special{papersize=\the\paperwidth,\the\paperheight}}}% } \DeclareOptionX{dviwindo}{% - \def\eq@drivernum{4}\def\eq@driver@name{dviwindo}% - \@namedef{papersize@for@\eq@driver@name}{\def\web@set@paper{% - \special{papersize=\the\paperwidth,\the\paperheight}}}% + \def\eq@drivernum{4}\def\eq@driver@name{dviwindo}% + \@namedef{papersize@for@\eq@driver@name}{\def\web@set@paper + {\special{papersize=\the\paperwidth,\the\paperheight}}}% } % \end{macrocode} % Various extensions of \textsf{dvipdfm}, the dvi-to-pdf driver.\IndexOpt{dvipdfm}\IndexOpt{dvipdfmx}\IndexOpt{xetex} % \begin{macrocode} \DeclareOptionX{dvipdfm}{% - \def\eq@drivernum{2}\def\eq@driver@name{dvipdfm}% - \web@opts@xdvipdfmx + \def\eq@drivernum{2}\def\eq@driver@name{dvipdfm}\web@opts@xdvipdfmx } % \end{macrocode} %\changes{v4.3}{2012/06/20}{Added \string\texttt{dvipdfmx} and \string\texttt{xetex} options} % \begin{macrocode} \DeclareOptionX{dvipdfmx}{% - \def\eq@drivernum{2}\def\eq@driver@name{dvipdfmx}% - \web@opts@xdvipdfmx + \def\eq@drivernum{2}\def\eq@driver@name{dvipdfmx}\web@opts@xdvipdfmx } % \end{macrocode} % \begin{macrocode} \DeclareOptionX{xetex}{% - \def\eq@drivernum{2}\def\eq@driver@name{xetex}% - \web@opts@xdvipdfmx + \def\eq@drivernum{2}\def\eq@driver@name{xetex}\web@opts@xdvipdfmx } % \end{macrocode} % \begin{macrocode} \newcommand{\web@opts@xdvipdfmx}{% - \@namedef{papersize@for@\eq@driver@name}% - {\def\web@set@paper{\AtBeginDvi{% - \special{papersize=\the\paperwidth,\the\paperheight}}}}% + \@namedef{papersize@for@\eq@driver@name}% + {\def\web@set@paper{\AtBeginDvi + {\special{papersize=\the\paperwidth,\the\paperheight}}}}% } % \end{macrocode} % \texttt{dvips}\IndexOpt{dvips} is the dvi-to-ps driver. % \begin{macrocode} \DeclareOptionX{dvips}{% - \def\eq@drivernum{0}\def\eq@driver@name{dvips}% - \def\i@web@ddtoHyOpts{setpagesize=false}% + \def\eq@drivernum{0}\def\eq@driver@name{dvips}% + \def\i@web@ddtoHyOpts{setpagesize=false}% % \end{macrocode} % The old definition of \cs{web@set@paper} %\begin{verbatim} @@ -177,9 +183,9 @@ %\end{verbatim} % New definitions (\texttt{v4.2j}). See comments for the \texttt{dvipsone} option. % \begin{macrocode} - \let\web@set@paper\@empty - \@namedef{papersize@for@\eq@driver@name}{\AtBeginDocument{% - \special{papersize=\the\paperwidth,\the\paperheight}}}% + \let\web@set@paper\@empty + \@namedef{papersize@for@\eq@driver@name}{\AtBeginDocument + {\special{papersize=\the\paperwidth,\the\paperheight}}}% } % \end{macrocode} % \texttt{pdftex}\IndexOpt{pdftex} is for users of \textsf{pdflatex}. @@ -201,19 +207,17 @@ % The `\texttt{textures}\IndexOpt{textures}' option was contributed by Ross Moore. {(2003/3/6)} % \begin{macrocode} \DeclareOptionX{textures}{% - \def\eq@drivernum{3}\def\eq@driver@name{textures}% - \@namedef{papersize@for@\eq@driver@name}% - {\def\web@set@paper{\bgroup - \dimen2=\origpaperheight \advance\dimen2 by -\topmargin - \dimen0\dimen2 \advance\dimen0-\paperheight - \xdef\@pdfpagescrop{0 \strip@pt\dimen0 \space - \strip@pt\paperwidth\space \strip@pt\dimen2}% - \egroup}% - \AtEndOfPackage{% - \edef\origpaperwidth{\the\paperwidth}% - \edef\origpaperheight{\the\paperheight}% - }% - }% + \def\eq@drivernum{3}\def\eq@driver@name{textures}% + \@namedef{papersize@for@\eq@driver@name}% + {\def\web@set@paper{\bgroup + \dimen2=\origpaperheight \advance\dimen2 by -\topmargin + \dimen0\dimen2 \advance\dimen0-\paperheight + \xdef\@pdfpagescrop{0 \strip@pt\dimen0 \space + \strip@pt\paperwidth\space \strip@pt\dimen2}% + \egroup}\AtEndOfPackage + {\edef\origpaperwidth{\the\paperwidth}% + \edef\origpaperheight{\the\paperheight}}% + }% } % \end{macrocode} %\subsection{Paper Option} @@ -240,15 +244,15 @@ % \IndexOpt{nobullets}^^A % \begin{macrocode} \DeclareOptionX{latexlayout}{% - \let\web@layout\web@NO\ExecuteOptionsX{forcolorpaper}} + \let\web@layout\web@NO\ExecuteOptionsX{forcolorpaper}} \DeclareOptionX{uselatexsectioning}{% - \web@sectioningfalse + \web@sectioningfalse } \newif\ifweb@sectioning \web@sectioningtrue \DeclareOptionX{weblikeclass}{% - \ExecuteOptionsX{latexlayout}% - \ExecuteOptionsX{nobullets}% - \ExecuteOptionsX{uselatexsectioning}% + \ExecuteOptionsX{latexlayout}% + \ExecuteOptionsX{nobullets}% + \ExecuteOptionsX{uselatexsectioning}% } \DeclareOptionX{nodirectory}{\let\web@directory@option\web@NO} \DeclareOptionX{usedirectory}{\let\web@directory@option\web@YES} @@ -266,48 +270,46 @@ % of parameters). % \begin{macrocode} \def\web@MargScrDimOpts#1#2#3#4#5#6{% - \margins{#1}{#2}{#3}{#4} % left,right,top, bottom - \screensize{#5}{#6} % height, width + \margins{#1}{#2}{#3}{#4} % left,right,top, bottom + \screensize{#5}{#6} % height, width % \end{macrocode} % We save the current settings, then change \cs{margins} and \cs{screensize} % to gobble their arguments up if used again. % \begin{macrocode} -% \let\margins@web@save\margins -% \let\screensize@web@save\screensize - \let\margins\@@margins\let\screensize\@gobbletwo + \let\margins\@@margins\let\screensize\@gobbletwo } % \end{macrocode} % The original design concept for various dimensions.\IndexOpt{designi...designvix} % \begin{macrocode} \DeclareOptionX{designi}{\AtEndOfPackage{% - \web@MargScrDimOpts{.25in}{.25in}{24pt}{.25in}{3.736in}{4.67in}}} + \web@MargScrDimOpts{.25in}{.25in}{24pt}{.25in}{3.736in}{4.67in}}} \DeclareOptionX{designii}{\AtEndOfPackage{% - \web@MargScrDimOpts{.25in}{.25in}{24pt}{.25in}{4.5in}{5in}}} + \web@MargScrDimOpts{.25in}{.25in}{24pt}{.25in}{4.5in}{5in}}} \DeclareOptionX{designiii}{\AtEndOfPackage{% - \web@MargScrDimOpts{.25in}{.25in}{24pt}{.25in}{5in}{6in}}} + \web@MargScrDimOpts{.25in}{.25in}{24pt}{.25in}{5in}{6in}}} \DeclareOptionX{designiv}{\AtEndOfPackage{% - \web@MargScrDimOpts{.25in}{.25in}{24pt}{.25in}{4in}{5in}}} + \web@MargScrDimOpts{.25in}{.25in}{24pt}{.25in}{4in}{5in}}} \DeclareOptionX{designv}{\AtEndOfPackage{% - \web@MargScrDimOpts{.25in}{.25in}{24pt}{.25in}{4.5in}{6in}}} + \web@MargScrDimOpts{.25in}{.25in}{24pt}{.25in}{4.5in}{6in}}} \DeclareOptionX{designvi}{\AtEndOfPackage{% - \web@MargScrDimOpts{.25in}{.25in}{24pt}{.25in}{4.17in}{4.67in}}} + \web@MargScrDimOpts{.25in}{.25in}{24pt}{.25in}{4.17in}{4.67in}}} \DeclareOptionX{designvii}{\AtEndOfPackage{% - \web@MargScrDimOpts{.5in}{.5in}{24pt}{.5in}{7.5in}{10in}}} + \web@MargScrDimOpts{.5in}{.5in}{24pt}{.5in}{7.5in}{10in}}} \DeclareOptionX{designviii}{\AtEndOfPackage{% - \web@MargScrDimOpts{.5in}{.5in}{24pt}{.5in}{3.75in}{6.67in}}} + \web@MargScrDimOpts{.5in}{.5in}{24pt}{.5in}{3.75in}{6.67in}}} \DeclareOptionX{designix}{\AtEndOfPackage{% - \web@MargScrDimOpts{.5in}{.5in}{24pt}{.5in}{3.75in}{6in}}} + \web@MargScrDimOpts{.5in}{.5in}{24pt}{.5in}{3.75in}{6in}}} % \end{macrocode} % The \texttt{usesf}\IndexOpt{usesf} option makes the default font sans serif. % Popular for presentations. % \begin{macrocode} \DeclareOptionX{usesf}{% - \def\aeb@defaultfamily{\sffamily} - \def\itdefault{sl} - \renewcommand{\familydefault}{\sfdefault} - \selectfont - \renewcommand\labelitemi{\textrm{\textbullet}} - \AtEndOfPackage{\def\web@copyright@symbol{\textrm{\copyright}}} + \def\aeb@defaultfamily{\sffamily} + \def\itdefault{sl} + \renewcommand{\familydefault}{\sfdefault} + \selectfont + \renewcommand\labelitemi{\textrm{\textbullet}} + \AtEndOfPackage{\def\web@copyright@symbol{\textrm{\copyright}}} } \def\aeb@defaultfamily{\rmfamily} % \end{macrocode} @@ -339,19 +341,19 @@ % \changes{v6.0m}{2016/08/19}{Added \string\texttt{addtoHyOpts*} option} % \begin{macrocode} \define@choicekey+{webHyOpts}{pdfencoding}[\val\nr]% - {auto,pdfdoc,unicode}[pdfdoc]{\edef\web@Hypdfencoding{\val}} - {\PackageWarning{web}{Bad choice for pdfencoding, - permissible values\MessageBreak - are auto, pdfdoc, and unicode.\MessageBreak Try again}} + {auto,pdfdoc,unicode}[pdfdoc]{\edef\web@Hypdfencoding{\val}} + {\PackageWarning{web}{Bad choice for pdfencoding, + permissible values\MessageBreak + are auto, pdfdoc, and unicode.\MessageBreak Try again}} \let\web@Hypdfencoding\@empty \let\u@web@ddtoHyOpts\@empty \let\u@web@ddtoHySetup\@empty \def\web@addtoHyOpts#1{\g@addto@macro\u@web@ddtoHyOpts{#1}} \def\web@addtoHySetup#1{\g@addto@macro\u@web@ddtoHySetup{#1}} \define@key{web.sty}{addtoHyOpts}[]{% - \setkeys*{webHyOpts}{#1}\web@addtoHyOpts{#1}} + \setkeys*{webHyOpts}{#1}\web@addtoHyOpts{#1}} \define@key{web.sty}{addtoHyOpts*}[]{% - \setkeys*{webHyOpts}{#1}\web@addtoHySetup{#1}} + \setkeys*{webHyOpts}{#1}\web@addtoHySetup{#1}} % \end{macrocode} % \end{macro} % \end{macro} @@ -388,7 +390,6 @@ \let\webpro@loaded\web@NO \def\loadwebpro{\InputIfFileExists{webpro.def}{}{}} % \end{macrocode} -% % When you take the \texttt{draft}\IndexOpt{draft} option, graphic overlays are not allowed. This is useful % when you rely heavily on graphic overlays, but during the development phase, % don't need to read and re-read your overlays. The defined background colors @@ -407,9 +408,9 @@ % \begin{macrocode} \DeclareOptionX{usetemplates}{\def\@usetemplates{1}} \DeclareOptionX{leftpanel}% - {\def\@panelconfig{1}\def\@usetemplates{1}} + {\def\@panelconfig{1}\def\@usetemplates{1}} \DeclareOptionX{rightpanel}% - {\def\@panelconfig{2}\def\@usetemplates{1}} + {\def\@panelconfig{2}\def\@usetemplates{1}} % \end{macrocode} % Normally, the templates feature is removed % when the \texttt{forpaper} or \texttt{forcolorpaper} open is used. There may be @@ -418,24 +419,21 @@ % \begin{macrocode} \newif\iftemplatesforpaper \templatesforpaperfalse \DeclareOptionX{templatesforpaper}{\templatesforpapertrue - \ExecuteOptionsX{forcolorpaper}} + \ExecuteOptionsX{forcolorpaper}} % \end{macrocode} % Here we come to a couple of options, \IndexOpt{rightpanelprt}\IndexOpt{leftpanelprt} % \texttt{rightpanelprt} and \texttt{leftpanelprt}, I remember nothing about. % apparently, these are \texttt{rightpanel} and \texttt{leftpanel} options for screen mode only. % \begin{macrocode} -\DeclareOptionX{rightpanelprt}{% - \ifeqforpaper\else\ExecuteOptionsX{rightpanel}\fi -} -\DeclareOptionX{leftpanelprt}{% - \ifeqforpaper\else\ExecuteOptionsX{leftpanel}\fi -} +\DeclareOptionX{rightpanelprt}{\ifeqforpaper\else + \ExecuteOptionsX{rightpanel}\fi} +\DeclareOptionX{leftpanelprt}{\ifeqforpaper\else + \ExecuteOptionsX{leftpanel}\fi} % \end{macrocode} % \DescribeMacro{\templatedefaults} sets the defaults for the template code. % \begin{macrocode} \def\templatedefaults{\def\@panelsep{0pt}\def\@usetemplates{0}% - \def\@panelconfig{0}\def\@textX{0}\def\@panelX{0}% -} + \def\@panelconfig{0}\def\@textX{0}\def\@panelX{0}} \templatedefaults % \end{macrocode} % \subsection{Miscellaneous Options} @@ -462,10 +460,10 @@ % definitions are used. % \begin{macrocode} \DeclareOptionX{uselatexparts}{% - \AtEndOfPackage{\@ifundefined{part}{}{\let\part\web@save@part}}} + \AtEndOfPackage{\@ifundefined{part}{}{\let\part\web@save@part}}} \DeclareOptionX{uselatexchapters}{% - \AtEndOfPackage{\@ifundefined{chapter}{} - {\let\chapter\web@save@chapter}}} + \AtEndOfPackage{\@ifundefined{chapter}{} + {\let\chapter\web@save@chapter}}} % \end{macrocode} % \subsection{Language Options} % The \texttt{french}\IndexOpt{french} option @@ -515,8 +513,7 @@ % \end{macrocode} % The \texttt{norsk}\IndexOpt{norsk} option % \begin{macrocode} -\DeclareOptionX{norsk}{% - \AtEndOfPackage{% +\DeclareOptionX{norsk}{\AtEndOfPackage{% \def\today{\ifcase\month\or Januar \or Februar \or Mars \or April \or Mai \or Juni \or Juli \or August @@ -537,68 +534,65 @@ % \end{macrocode} % The \texttt{dutch}\IndexOpt{dutch} option % \begin{macrocode} -\DeclareOptionX{dutch}{% - \AtEndOfPackage{% +\DeclareOptionX{dutch}{\AtEndOfPackage{% \def\today{\the\day~\ifcase\month\or januari - \or februari \or maart \or april - \or mei \or juni \or juli \or augustus - \or september \or oktober \or november - \or december \fi \space \the\year} - \def\web@versionlabel{Versie} - \def\web@toc{Inhoudsopgave} - \def\web@continued{vervolg} - \def\web@article{Begin \hyperlink{\web@Start.1}{Artikel}} - \def\web@directory{Overzicht} - \def\web@revision{Laatste wijziging:} - \def\web@copyright{Copyright} - \def\web@section{Sectie} - \def\web@back{Terug} - \def\web@doc{Doc}} + \or februari \or maart \or april + \or mei \or juni \or juli \or augustus + \or september \or oktober \or november + \or december \fi \space \the\year} + \def\web@versionlabel{Versie} + \def\web@toc{Inhoudsopgave} + \def\web@continued{vervolg} + \def\web@article{Begin \hyperlink{\web@Start.1}{Artikel}} + \def\web@directory{Overzicht} + \def\web@revision{Laatste wijziging:} + \def\web@copyright{Copyright} + \def\web@section{Sectie} + \def\web@back{Terug} + \def\web@doc{Doc}} \PassOptionsToPackage{dutch}{exerquiz} } % \end{macrocode} % The \texttt{spanish}\IndexOpt{spanish} option % \begin{macrocode} -\DeclareOptionX{spanish}{% - \AtEndOfPackage{% - \def\today{\the\day\ de \ifcase\month\or Enero - \or Febrero \or Marzo \or Abril - \or Mayo \or Junio \or Julio \or Agosto - \or Septiembre \or Octubre \or Noviembre - \or Deciembre \fi de \the\year} - \renewcommand\web@versionlabel{Versi\noexpand\'{o}n} - \renewcommand\web@toc{Tabla de Contenido} - \renewcommand\web@continued{cont.} - \renewcommand\web@article{Inicio - \hyperlink{\web@Start.1}{Art\'{\i}culo}} - \renewcommand\web@directory{Directorio} - \renewcommand\web@revision{Actualizado el:} - \renewcommand\web@copyright{Copyright} - \renewcommand\web@section{Secci\'on} - \renewcommand\web@back{Volver} - \renewcommand\web@doc{Doc}} +\DeclareOptionX{spanish}{\AtEndOfPackage{% + \def\today{\the\day\ de \ifcase\month\or Enero + \or Febrero \or Marzo \or Abril + \or Mayo \or Junio \or Julio \or Agosto + \or Septiembre \or Octubre \or Noviembre + \or Deciembre \fi de \the\year} + \renewcommand\web@versionlabel{Versi\noexpand\'{o}n} + \renewcommand\web@toc{Tabla de Contenido} + \renewcommand\web@continued{cont.} + \renewcommand\web@article{Inicio + \hyperlink{\web@Start.1}{Art\'{\i}culo}} + \renewcommand\web@directory{Directorio} + \renewcommand\web@revision{Actualizado el:} + \renewcommand\web@copyright{Copyright} + \renewcommand\web@section{Secci\'on} + \renewcommand\web@back{Volver} + \renewcommand\web@doc{Doc}} \PassOptionsToPackage{spanish}{exerquiz} } % \end{macrocode} % The \texttt{italian}\IndexOpt{italian} option % \begin{macrocode} -\DeclareOptionX{italian}{% - \AtEndOfPackage{% - \def\today{\ifcase\month\or Gennaio - \or Febbraio \or Marzo \or Aprile - \or Maggio \or Giugno \or Luglio \or Agosto - \or Settembre \or Ottobre \or Novembre - \or Dicembre \fi \the\day, \the\year} - \renewcommand\web@versionlabel{Versione} - \renewcommand\web@toc{Indice} - \renewcommand\web@continued{cont.} - \renewcommand\web@article{Inizio \hyperlink{\web@Start.1}{Articolo}} - \renewcommand\web@directory{Directory} - \renewcommand\web@revision{Data Ultima Revisione:} - \renewcommand\web@copyright{Copyright} - \renewcommand\web@section{Sezione} - \renewcommand\web@back{Back} - \renewcommand\web@doc{Doc}} +\DeclareOptionX{italian}{\AtEndOfPackage{% + \def\today{\ifcase\month\or Gennaio + \or Febbraio \or Marzo \or Aprile + \or Maggio \or Giugno \or Luglio \or Agosto + \or Settembre \or Ottobre \or Novembre + \or Dicembre \fi \the\day, \the\year} + \renewcommand\web@versionlabel{Versione} + \renewcommand\web@toc{Indice} + \renewcommand\web@continued{cont.} + \renewcommand\web@article{Inizio \hyperlink{\web@Start.1}{Articolo}} + \renewcommand\web@directory{Directory} + \renewcommand\web@revision{Data Ultima Revisione:} + \renewcommand\web@copyright{Copyright} + \renewcommand\web@section{Sezione} + \renewcommand\web@back{Back} + \renewcommand\web@doc{Doc}} \PassOptionsToPackage{italian}{exerquiz} } % \end{macrocode} @@ -613,28 +607,27 @@ % \CYRN,\cyra,\cyrch,\cyra,\cyrl,\cyro,\CYRS,\CYRP,\CYRV,\CYRN,\CYRCH, % \cyrp,\cyrz,\cyrz,\cyrzh,\CYRK,\cyrishrt,\cyrsftsn} % \begin{macrocode} -\DeclareOptionX{russian}{% - \ExecuteOptionsX{unicode}% +\DeclareOptionX{russian}{\ExecuteOptionsX{unicode}% \AtEndOfPackage{% \def\today{\the\day\ \ifcase\month - \or \cyrya\cyrn\cyrv\cyra\cyrr\cyrya - \or \cyrf\cyre\cyrv\cyrr\cyra\cyrl\cyrya - \or \cyrm\cyra\cyrr\cyrt\cyra - \or \cyra\cyrp\cyrr\cyre\cyrl\cyrya - \or \cyrm\cyra\cyrya - \or \cyri\cyryu\cyrn\cyrya - \or \cyri\cyryu\cyrl\cyrya - \or \cyra\cyrv\cyrg\cyru\cyrs\cyrt\cyra - \or \cyrs\cyre\cyrn\cyrt\cyrya\cyrb\cyrr\cyrya - \or \cyro\cyrk\cyrt\cyrya\cyrb\cyrr\cyrya - \or \cyrn\cyro\cyrya\cyrb\cyrr\cyrya - \or \cyrd\cyre\cyrk\cyrya\cyrb\cyrr\cyrya \fi{ }% - \the\year\ \cyrg.} + \or \cyrya\cyrn\cyrv\cyra\cyrr\cyrya + \or \cyrf\cyre\cyrv\cyrr\cyra\cyrl\cyrya + \or \cyrm\cyra\cyrr\cyrt\cyra + \or \cyra\cyrp\cyrr\cyre\cyrl\cyrya + \or \cyrm\cyra\cyrya + \or \cyri\cyryu\cyrn\cyrya + \or \cyri\cyryu\cyrl\cyrya + \or \cyra\cyrv\cyrg\cyru\cyrs\cyrt\cyra + \or \cyrs\cyre\cyrn\cyrt\cyrya\cyrb\cyrr\cyrya + \or \cyro\cyrk\cyrt\cyrya\cyrb\cyrr\cyrya + \or \cyrn\cyro\cyrya\cyrb\cyrr\cyrya + \or \cyrd\cyre\cyrk\cyrya\cyrb\cyrr\cyrya \fi{ }% + \the\year\ \cyrg.} \gdef\eq@protected##1##2{{\ifhmode ##2\else - \ifvmode ##2\else\ifinner##2\else\noexpand ##1\fi\fi\fi}}% + \ifvmode ##2\else\ifinner##2\else\noexpand ##1\fi\fi\fi}}% \def\cyrCommand##1##2{\def##1{\eq@protected##1{##2}}}% \cyrCommand\web@toc{\CYRO\cyrg\cyrl\cyra\cyrv\cyrl\cyre\cyrn% - \cyri\cyre} + \cyri\cyre} \cyrCommand\web@continued{\cyrp\cyrr\cyro\cyrd\cyro\cyrl% \cyrzh\cyre\cyrn\cyri\cyre} \cyrCommand\web@article{\CYRN\cyra\cyrch\cyra\cyrl\cyro{ }% @@ -645,8 +638,6 @@ \cyrCommand\web@revision{\CYRP\cyro\cyrs\cyrl\cyre\cyrd\cyrn% \cyrya\cyrya{ }\cyrr\cyre\cyrv\cyri\cyrz\cyri\cyrya:} \let\web@copyright\@gobble -% \cyrCommand\web@copyright{%\CYRK\cyro\cyrp\cyri\cyrr\cyra% -% \cyrishrt\cyrt}%In Russian publications only the symbol presents \cyrCommand\web@versionlabel{\CYRV\cyre\cyrr\cyrs\cyri\cyrya} \cyrCommand\web@back{\CYRN\cyra\cyrz\cyra\cyrd} \cyrCommand\web@section{\CYRCH\cyra\cyrs\cyrt\cyrsftsn}} @@ -655,8 +646,7 @@ % \end{macrocode} % The \texttt{dansk}\IndexOpt{dansk} option % \begin{macrocode} -\DeclareOptionX{dansk}{% - \AtEndOfPackage{% +\DeclareOptionX{dansk}{\AtEndOfPackage{% \def\today{\ifcase\month\or Januar \or Februar \or Marts \or April \or Maj \or Juni \or Juli \or August @@ -678,33 +668,31 @@ % \end{macrocode} % The \texttt{polish}\IndexOpt{polish} option % \begin{macrocode} -\DeclareOptionX{polish}{% - \AtEndOfPackage{% - \def\today{\ifcase\month\or {Stycze\'{n}} - \or Luty \or Marzec \or {Kwiecie\'{n}} - \or Maj \or Czerwiec \or Lipiec \or {\'{S}ierpie\'{n}} - \or {Wrzesie\'{n}} \or {Pa\'{z}dziernik} \or Listopad - \or {Grudzie\'{n}} \fi \the\day, \the\year} - \renewcommand\web@versionlabel{Wersja} - \renewcommand\web@toc{Spis Tre\'{s}ci} - \renewcommand\web@continued{verte} - \renewcommand\web@article{Pocz\k{a}tek do - \hyperlink{\web@Start.1}{Tekstu}} - \renewcommand\web@directory{Zawarto\'{s}\'{c}} - \renewcommand\web@revision{Ostatnia zmiana:} - \renewcommand\web@copyright{Copyright} - \renewcommand\web@section{Cze\'{s}\'{c}} - % Label Navibar - \renewcommand\web@back{Wstecz} - \renewcommand\web@doc{Dok}} % restricted to three characters - \PassOptionsToPackage{polish}{exerquiz} +\DeclareOptionX{polish}{\AtEndOfPackage{% + \def\today{\ifcase\month\or {Stycze\'{n}} + \or Luty \or Marzec \or {Kwiecie\'{n}} + \or Maj \or Czerwiec \or Lipiec \or {\'{S}ierpie\'{n}} + \or {Wrzesie\'{n}} \or {Pa\'{z}dziernik} \or Listopad + \or {Grudzie\'{n}} \fi \the\day, \the\year} + \renewcommand\web@versionlabel{Wersja} + \renewcommand\web@toc{Spis Tre\'{s}ci} + \renewcommand\web@continued{verte} + \renewcommand\web@article{Pocz\k{a}tek do + \hyperlink{\web@Start.1}{Tekstu}} + \renewcommand\web@directory{Zawarto\'{s}\'{c}} + \renewcommand\web@revision{Ostatnia zmiana:} + \renewcommand\web@copyright{Copyright} + \renewcommand\web@section{Cze\'{s}\'{c}} +% Label Navibar + \renewcommand\web@back{Wstecz} + \renewcommand\web@doc{Dok}}% restricted to three characters + \PassOptionsToPackage{polish}{exerquiz} } % \end{macrocode} % The \texttt{finnish}\IndexOpt{finnish} option % \begin{macrocode} -\DeclareOptionX{finnish}{% - \AtEndOfPackage{% - % Recouvrement de \today +\DeclareOptionX{finnish}{\AtEndOfPackage{% +% Recouvrement de \today \def\today{\the\day\ \ifcase\month\or Tammikuu \or Helmikuu \or Maaliskuu \or Huhtikuu \or Toukokuu \or Kes\"{a}kuu \or Hein\"{a}kuu \or Elokuu @@ -724,30 +712,28 @@ % \end{macrocode} % The \texttt{catalan}\IndexOpt{catalan} option % \begin{macrocode} -\DeclareOptionX{catalan}{% - \AtEndOfPackage{% - \def\today{\the\day\ de \ifcase\month\or Gener - \or Febrer \or Mar\c{c} \or Abril - \or Maig \or Juny \or Juliol \or Agost - \or Setembre \or Octubre \or Novembre - \or Desembre \fi de \the\year} - \renewcommand\web@versionlabel{Versi\noexpand\'{o}} - \renewcommand\web@toc{Taula de Contingut} - \renewcommand\web@continued{cont.} - \renewcommand\web@article{Inici \hyperlink{\web@Start.1}{Article}} - \renewcommand\web@directory{Directori} - \renewcommand\web@revision{Actualizat el:} - \renewcommand\web@copyright{Copyright} - \renewcommand\web@section{Secci\'o} - \renewcommand\web@back{Tornar} - \renewcommand\web@doc{Doc}} - \PassOptionsToPackage{catalan}{exerquiz} +\DeclareOptionX{catalan}{\AtEndOfPackage{% + \def\today{\the\day\ de \ifcase\month\or Gener + \or Febrer \or Mar\c{c} \or Abril + \or Maig \or Juny \or Juliol \or Agost + \or Setembre \or Octubre \or Novembre + \or Desembre \fi de \the\year} + \renewcommand\web@versionlabel{Versi\noexpand\'{o}} + \renewcommand\web@toc{Taula de Contingut} + \renewcommand\web@continued{cont.} + \renewcommand\web@article{Inici \hyperlink{\web@Start.1}{Article}} + \renewcommand\web@directory{Directori} + \renewcommand\web@revision{Actualizat el:} + \renewcommand\web@copyright{Copyright} + \renewcommand\web@section{Secci\'o} + \renewcommand\web@back{Tornar} + \renewcommand\web@doc{Doc}} + \PassOptionsToPackage{catalan}{exerquiz} } % \end{macrocode} % The \texttt{czech}\IndexOpt{czech} option % \begin{macrocode} -\DeclareOptionX{czech}{% - \AtEndOfPackage{% +\DeclareOptionX{czech}{\AtEndOfPackage{% \def\today{\number\day. \ifcase\month\or ledna\or \'unora\or b\v{r}ezna\or dubna\or kv\v{e}tna\or \v{c}ervna\or \v{c}ervence\or srpna\or z\'a\v{r}\'\i\or \v{r}\'{\i}jna\or listopadu\or prosince\fi @@ -767,31 +753,29 @@ % \end{macrocode} % The \texttt{brazil}\IndexOpt{brazil} option % \begin{macrocode} -\DeclareOptionX{brazil}{% - \AtEndOfPackage{% - \def\today{\the\day\ de \ifcase\month\or janeiro - \or fevereiro \or mar\c{c}o \or abril - \or maio \or junho \or julho \or agosto - \or setembro \or outubro \or novembro - \or dezembro \fi de \the\year} - \renewcommand\web@versionlabel{Vers\~{a}o} - \renewcommand\web@toc{Tabela de Conte\'{u}do} - \renewcommand\web@continued{cont.} - \renewcommand\web@article{Inicie o - \hyperlink{\web@Start.1}{Artigo}} - \renewcommand\web@directory{Diret\'{o}rio} - \renewcommand\web@revision{Atualizado em:} - \renewcommand\web@copyright{Copyright} - \renewcommand\web@section{Se\c{c}\noexpand\~{a}o} - \renewcommand\web@back{Voltar} - \renewcommand\web@doc{Doc}} +\DeclareOptionX{brazil}{\AtEndOfPackage{% + \def\today{\the\day\ de \ifcase\month\or janeiro + \or fevereiro \or mar\c{c}o \or abril + \or maio \or junho \or julho \or agosto + \or setembro \or outubro \or novembro + \or dezembro \fi de \the\year} + \renewcommand\web@versionlabel{Vers\~{a}o} + \renewcommand\web@toc{Tabela de Conte\'{u}do} + \renewcommand\web@continued{cont.} + \renewcommand\web@article{Inicie o + \hyperlink{\web@Start.1}{Artigo}} + \renewcommand\web@directory{Diret\'{o}rio} + \renewcommand\web@revision{Atualizado em:} + \renewcommand\web@copyright{Copyright} + \renewcommand\web@section{Se\c{c}\noexpand\~{a}o} + \renewcommand\web@back{Voltar} + \renewcommand\web@doc{Doc}} \PassOptionsToPackage{brazil}{exerquiz} } % \end{macrocode} % The \texttt{turkish}\IndexOpt{turkish} option % \begin{macrocode} -\DeclareOptionX{turkish}{% - \ExecuteOptionsX{unicode}% +\DeclareOptionX{turkish}{\ExecuteOptionsX{unicode}% \AtEndOfPackage{% %======> Modification : Mahmut Ko\c{c}ak \def\today{\the\day\ \ifcase\month\or Ocak @@ -816,23 +800,20 @@ % Unknown options are passed to the color package % \begin{macrocode} \DeclareOptionX*{\PassOptionsToPackage{\CurrentOption} - {\eq@ColorPackage}} + {\eq@ColorPackage}} % \end{macrocode} % We use \textsf{xcolor} if available. % \begin{macrocode} -\@ifpackageloaded{xcolor}% -{% - \@ifpackagelater{xcolor}{2004/07/04}{} - {% - \PackageError{web}{% - *************************************************\MessageBreak - * Your Version of `xcolor.sty' is too old!\MessageBreak - * You need the version from 2004/07/04 or newer\MessageBreak - * or use: \string\usepackage[noxcolor]{web}\MessageBreak - * or \string\documentclass[noxcolor]{article}\MessageBreak - *************************************************}{}% - }% -}{} +\@ifpackageloaded{xcolor}{% + \@ifpackagelater{xcolor}{2004/07/04}{}{% + \PackageError{web}{% + *************************************************\MessageBreak + * Your Version of `xcolor.sty' is too old!\MessageBreak + * You need the version from 2004/07/04 or newer\MessageBreak + * or use: \string\usepackage[noxcolor]{web}\MessageBreak + * or \string\documentclass[noxcolor]{article}\MessageBreak + *************************************************}{}% +}}{} % \end{macrocode} % \section{Main Code} % \subsection{Switches} @@ -862,11 +843,10 @@ % a bullet. This is only obeyed when the \texttt{pro} option is in effect. % \begin{macrocode} \newif\if@defaultsubsubding \@defaultsubsubdingtrue -\def\forceSubSubNumbers{% - \ifx\web@latextoc\web@YES\else - \PackageWarning{webpro}{\string\forSubSubNumbers\space - requested,\MessageBreak I'm adding the option of latextoc}\fi - \let\web@latextoc\web@YES\@defaultsubsubdingfalse +\def\forceSubSubNumbers{\ifx\web@latextoc\web@YES\else + \PackageWarning{webpro}{\string\forSubSubNumbers\space + requested,\MessageBreak I'm adding the option of latextoc}\fi + \let\web@latextoc\web@YES\@defaultsubsubdingfalse } % \end{macrocode} % \end{macro} @@ -962,7 +942,7 @@ % then ignore the \texttt{unicode} option. % \begin{macrocode} \ifx\web@Hypdfencoding\@empty\else - \let\aeb@useunicode\@gobble\fi + \let\aeb@useunicode\@gobble\fi % \end{macrocode} % We use a utility command, taken and renamed from the \texttt{comment} package. % \begin{macrocode} @@ -1008,20 +988,20 @@ % (2016/07/22) We do not pass the driver to \pkg{hyperref} in the cases the driver % is \texttt{pdftex} or \texttt{xetex}. % \begin{macrocode} - \ifpdf\else\ifxetex\else\eq@driver@name,\fi\fi - bookmarks,bookmarksnumbered,bookmarksopen,% - colorlinks,\aeb@useunicode,linkcolor=webgreen,% - filecolor=webbrown,citecolor=webgreen,% - urlcolor=webbrown,pagebackref,pdfpagemode=UseNone,% - pdfstartview=Fit,pdfpagelayout=SinglePage% + \ifpdf\else\ifxetex\else\eq@driver@name,\fi\fi + bookmarks,bookmarksnumbered,bookmarksopen,% + colorlinks,\aeb@useunicode,linkcolor=webgreen,% + filecolor=webbrown,citecolor=webgreen,% + urlcolor=webbrown,pagebackref,pdfpagemode=UseNone,% + pdfstartview=Fit,pdfpagelayout=SinglePage% % \end{macrocode} % (2016/08/19) Moved the following code to the end of the option list so these options can override % earlier options in the list. % \changes{v6.0m}{2016/08/19}{Moved user and internal options for \string\pkg{hyperref} to end of option list so they % can override earlier options.} % \begin{macrocode} - \ifx\u@web@ddtoHyOpts\@empty\else,\u@web@ddtoHyOpts\fi - \ifx\i@web@ddtoHyOpts\@empty\else,\i@web@ddtoHyOpts\fi]{hyperref}% + \ifx\u@web@ddtoHyOpts\@empty\else,\u@web@ddtoHyOpts\fi + \ifx\i@web@ddtoHyOpts\@empty\else,\i@web@ddtoHyOpts\fi]{hyperref}% } % \end{macrocode} % If the option \texttt{xhyperref} is taken, \textsf{hyperref} is not input by this @@ -1030,10 +1010,10 @@ % and its placement in \string\cs{w@isHyLoaded}.} % \begin{macrocode} \def\w@isHyLoaded{\@ifpackageloaded{hyperref}{}{\PackageError{web} - {The xhyperref option used, but hyperref is not\MessageBreak - already loaded. Will load hyperref with the options\MessageBreak - chosen by web}{Remove xhyperref or load hyperref prior to the web - package.}\web@RequireHyperref}% + {The xhyperref option used, but hyperref is not\MessageBreak + already loaded. Will load hyperref with the options\MessageBreak + chosen by web}{Remove xhyperref or load hyperref prior to the web + package.}\web@RequireHyperref}% } % \end{macrocode} % Now if the \opt{xhyperref} option \emph{is not taken}, we load \pkg{hyperref}; otherwise, if \pkg{hyperref} @@ -1041,10 +1021,10 @@ % options. % \begin{macrocode} \if@web@hyperref\expandafter\web@RequireHyperref\else - \expandafter\w@isHyLoaded\fi + \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} @@ -1062,14 +1042,14 @@ % 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=1\relax +\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=1\relax - \RequirePackage{eso-pic} +\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 @@ -1078,28 +1058,24 @@ % 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=2\relax - \def\web@set@paper{\AddToShipoutPicture*{% - \special{papersize=\the\paperwidth,\the\paperheight}}}% + \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 + \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}} @@ -1109,38 +1085,38 @@ % 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 - }% - }% - \fi + \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 % \end{macrocode} % A useful command for separating two arguments. Use in \texttt{webpro} section, and by \texttt{aeb\_pro} as well. @@ -1196,24 +1172,20 @@ % \end{macrocode} % Modified version of the \cs{InitLayout} macro from pdfscreen. % \begin{macrocode} -\def\InitLayout -{% - \ifeqforpaper\else - \setlength\headheight{\websetheadheight} - \hoffset=0pt \voffset=0pt - \fi - \ifeqforpaper\else +\def\InitLayout{% + \ifeqforpaper\else + \setlength\headheight{\websetheadheight} + \hoffset=0pt \voffset=0pt {\@tempdima=\paperwidth - \addtolength{\@tempdima}{-\@Leftmargin}% - \addtolength{\@tempdima}{-\@Rightmargin}% - \xdef\fullscreenwidth{\the\@tempdima}}% - \fi - \ifx\web@layout\web@YES\else\templatedefaults\fi - \ifeqforpaper\else - \setlength{\textwidth}{\paperwidth} - \setlength{\textheight}{\paperheight} - \addtolength{\textheight}{-\@Topmargin} - \addtolength{\textheight}{-\@Bottommargin} + \addtolength{\@tempdima}{-\@Leftmargin}% + \addtolength{\@tempdima}{-\@Rightmargin}% + \xdef\fullscreenwidth{\the\@tempdima}}\fi + \ifx\web@layout\web@YES\else\templatedefaults\fi + \ifeqforpaper\else + \setlength{\textwidth}{\paperwidth} + \setlength{\textheight}{\paperheight} + \addtolength{\textheight}{-\@Topmargin} + \addtolength{\textheight}{-\@Bottommargin} % \end{macrocode} %\begin{verbatim} %\topmargin = \web@Topmargin - 1in @@ -1221,57 +1193,57 @@ % so \headsep = \@Topmargin - \headheight - \web@Topmargin (\topmargin) %\end{verbatim} % \begin{macrocode} - \setlength{\headsep}{\@Topmargin} - \addtolength\headsep{-\headheight} - \setlength{\topmargin}{\web@Topmargin} - \addtolength\headsep{-\topmargin} - \addtolength\headsep{\web@additionalheadsep} - \addtolength{\topmargin}{-1in} - \setlength\footskip{\@Bottommargin} - \addtolength{\footskip}{-\web@footskip} % depth of navibar - \ifcase\@panelconfig - \setlength{\oddsidemargin}{\@Leftmargin} - \setlength{\evensidemargin}{\@Leftmargin} - \or - \setlength{\oddsidemargin}{\@panelwidth} - \setlength{\evensidemargin}{\@panelwidth} - \or - \setlength{\oddsidemargin}{\@Leftmargin} - \setlength{\evensidemargin}{\@Leftmargin} - \fi - \addtolength{\evensidemargin}{-1in} - \addtolength{\oddsidemargin}{-1in} + \setlength{\headsep}{\@Topmargin} + \addtolength\headsep{-\headheight} + \setlength{\topmargin}{\web@Topmargin} + \addtolength\headsep{-\topmargin} + \addtolength\headsep{\web@additionalheadsep} + \addtolength{\topmargin}{-1in} + \setlength\footskip{\@Bottommargin} + \addtolength{\footskip}{-\web@footskip} % depth of navibar + \ifcase\@panelconfig + \setlength{\oddsidemargin}{\@Leftmargin} + \setlength{\evensidemargin}{\@Leftmargin} + \or + \setlength{\oddsidemargin}{\@panelwidth} + \setlength{\evensidemargin}{\@panelwidth} + \or + \setlength{\oddsidemargin}{\@Leftmargin} + \setlength{\evensidemargin}{\@Leftmargin} + \fi + \addtolength{\evensidemargin}{-1in} + \addtolength{\oddsidemargin}{-1in} \fi \ifx\web@layout\web@YES - \ifcase\@panelconfig - \addtolength{\textwidth}{-\@Leftmargin} - \addtolength{\textwidth}{-\@Rightmargin} - \or % leftpanel - \addtolength{\textwidth}{-\@panelwidth} - \addtolength{\textwidth}{-\@Rightmargin} - \or % rightpanel - \addtolength{\textwidth}{-\@panelwidth} - \addtolength{\textwidth}{-\@Leftmargin} + \ifcase\@panelconfig + \addtolength{\textwidth}{-\@Leftmargin} + \addtolength{\textwidth}{-\@Rightmargin} + \or % leftpanel + \addtolength{\textwidth}{-\@panelwidth} + \addtolength{\textwidth}{-\@Rightmargin} + \or % rightpanel + \addtolength{\textwidth}{-\@panelwidth} + \addtolength{\textwidth}{-\@Leftmargin} + \fi + \ifnum\@usetemplates=\@ne + \setlength{\textscreenwidth}{\paperwidth} + \def\@textX{0} + \ifnum\@panelconfig=\@ne % leftpanel + \addtolength{\textwidth}{-\@panelsep} + \addtolength{\oddsidemargin}{\@panelsep} + \addtolength{\evensidemargin}{\@panelsep} + \addtolength{\textscreenwidth}{-\@panelwidth} + \def\@textX{\strip@pt\@panelwidth} + \def\@panelX{0} \fi - \ifnum\@usetemplates=1\relax - \setlength{\textscreenwidth}{\paperwidth} - \def\@textX{0} - \ifnum\@panelconfig=1 % leftpanel - \addtolength{\textwidth}{-\@panelsep} - \addtolength{\oddsidemargin}{\@panelsep} - \addtolength{\evensidemargin}{\@panelsep} - \addtolength{\textscreenwidth}{-\@panelwidth} - \def\@textX{\strip@pt\@panelwidth} - \def\@panelX{0} - \fi - \ifnum\@panelconfig=2 % rightpanel - \addtolength{\textwidth}{-\@panelsep} - \addtolength{\textscreenwidth}{-\@panelwidth} - \def\@textX{0} - \def\@panelX{\strip@pt\textscreenwidth} - \fi - \calculatefullwidth + \ifnum\@panelconfig=\tw@ % rightpanel + \addtolength{\textwidth}{-\@panelsep} + \addtolength{\textscreenwidth}{-\@panelwidth} + \def\@textX{0} + \def\@panelX{\strip@pt\textscreenwidth} \fi + \calculatefullwidth + \fi \fi } % \end{macrocode} @@ -1300,30 +1272,26 @@ % % The commands seems only effect with the \textsf{dvipsone} driver. % \begin{macrocode} -\def\@convLtoP#1#2{% - \afterassignment\@convLtoP@i\dimen@#2bp\relax{#1}{#2}} +\def\@convLtoP#1#2{\afterassignment + \@convLtoP@i\dimen@#2bp\relax{#1}{#2}} \def\@convLtoP@i#1\relax#2#3{% - \if!#1!% - \def#2{#3}% - \else - \dimen@.99626\dimen@ - \edef#2{\strip@pt\dimen@}% - \fi} + \if!#1!\def#2{#3}\else + \dimen@.99626\dimen@\edef#2{\strip@pt\dimen@}\fi} \providecommand\setPageDevice[3][600]{\bgroup - \@convLtoP{\width}{#2}\@convLtoP{\height}{#3} - \ifpdfmarkup\headerps@out{<< /HWResolution [#1 #1] % - /PageSize [\width\space\height] >> setpagedevice}\else - \PackageWarning{web}{This is a distiller only command,\MessageBreak + \@convLtoP{\width}{#2}\@convLtoP{\height}{#3} + \ifpdfmarkup\headerps@out{<< /HWResolution [#1 #1] % + /PageSize [\width\space\height] >> setpagedevice}\else + \PackageWarning{web}{This is a distiller only command,\MessageBreak ignoring \string\setPageDevice}\fi\egroup} % \end{macrocode} %\DescribeMacro\allowTransparency sets the \textbf{AllowTransparency} key of % the distiller to \textbf{true}. We do this with \texttt{setdistillerparams}. % \begin{macrocode} \providecommand\allowTransparency{\bgroup - \ifpdfmarkup\headerps@out{<< % - /AllowTransparency true >> setdistillerparams}\else - \PackageWarning{web}{This is a distiller only command,\MessageBreak - ignoring \string\allowTransparency}\fi\egroup} + \ifpdfmarkup\headerps@out{<< % + /AllowTransparency true >> setdistillerparams}\else + \PackageWarning{web}{This is a distiller only command,\MessageBreak + ignoring \string\allowTransparency}\fi\egroup} \@onlypreamble\setPageDevice \@onlypreamble\allowTransparency % \end{macrocode} @@ -1342,29 +1310,27 @@ %\end{verbatim} % \begin{macrocode} \def\screensize#1#2{% - \def\webSaveSSDim{{#1}{#2}}% - \begingroup + \def\webSaveSSDim{{#1}{#2}}% + \begingroup \ifeqforpaper - \ifx\web@layout\web@YES - \setlength{\@tempdima}{#2}% - \global\textwidth\@tempdima - \addtolength{\@tempdima}{-\@Leftmargin}% - \addtolength{\@tempdima}{-\@Rightmargin}% - \xdef\fullscreenwidth{\the\@tempdima}% - \else - \xdef\fullscreenwidth{\the\textwidth}% - \fi + \ifx\web@layout\web@YES + \setlength{\@tempdima}{#2}\global + \textwidth\@tempdima + \addtolength{\@tempdima}{-\@Leftmargin}% + \addtolength{\@tempdima}{-\@Rightmargin}% + \xdef\fullscreenwidth{\the\@tempdima}\else + \xdef\fullscreenwidth{\the\textwidth}\fi \else - \setlength{\@tempdima}{#1}% - \global\paperheight\@tempdima - \setlength{\@tempdima}{#2}% - \global\paperwidth\@tempdima + \setlength{\@tempdima}{#1}\global + \paperheight\@tempdima + \setlength{\@tempdima}{#2}\global + \paperwidth\@tempdima \fi - \endgroup - \web@papersize@settrue - \web@set@paper % dps modified - \let\screensize\@gobbletwo - \InitLayout + \endgroup + \web@papersize@settrue + \web@set@paper + \let\screensize\@gobbletwo + \InitLayout } % \end{macrocode} % Save a secret copy of screensize for use by APB @@ -1403,9 +1369,9 @@ % } % \begin{macrocode} \newcommand{\setScreensizeFromGraphic}[2][]{% - \getDimsFromGraphic[#1]{#2}% + \getDimsFromGraphic[#1]{#2}% {\web@graphicScreenWidth}{\web@graphicScreenHeight}% - \screensize{\web@graphicScreenHeight}{\web@graphicScreenWidth}% + \screensize{\web@graphicScreenHeight}{\web@graphicScreenWidth}% } \@onlypreamble\setScreensizeFromGraphic % \end{macrocode} @@ -1414,7 +1380,7 @@ % This command uses the graphicx package. It loads a graphic % into a box and measures its dimensions. % \changes{v4.1a}{2008/07/06} -% { +% {% % Added the command \string\cs{getDimsFromGraphic} as a helper command for % \string\cs{setScreensizeFromGraphic}, but also useful as % stand alone as well. @@ -1422,17 +1388,17 @@ % %\medskip\noindent The parameters are: %\begin{enumerate} -% \item[]\texttt{[\#1]}: Optional argument that is passed to \cs{graphicx} package +% \item[]\texttt{[\#1]}: Optional argument that is passed to \cs{includegraphics} command % \item[]\texttt{\#2}: The path to the graph to be read % \item[]\texttt{\#3}: A control sequence to be used to hold the width % \item[]\texttt{\#4}: A control sequence to be used to hold the height %\end{enumerate} % \begin{macrocode} -\newcommand{\getDimsFromGraphic}[4][]{{% - \setbox0=\hbox{\includegraphics[draft,#1]{#2}}% - \dimen@=\dp0 \advance\dimen@\ht0 - \xdef#3{\the\wd0 }\xdef#4{\the\dimen@}% -}} +\newcommand{\getDimsFromGraphic}[4][]{\bgroup + \setbox\z@=\hbox{\includegraphics[draft,#1]{#2}}% + \dimen@=\dp\z@ \advance\dimen@\ht\z@ + \xdef#3{\the\wd\z@ }\xdef#4{\the\dimen@}\egroup +} % \end{macrocode} % \end{macro} % \begin{macro}{\addtoWebHeight} @@ -1446,34 +1412,34 @@ % \begin{macrocode} \def\web@getSSDims#1#2{\edef\web@@height{#1}\edef\web@@width{#2}} \def\addToWebHWError{\PackageError{web}{% - You must declare screen size first by using\MessageBreak - the \string\screensize\space command, or by declaring \MessageBreak - a design in the web option list}% - {Do as is suggested in error message!}} + You must declare screen size first by using\MessageBreak + the \string\screensize\space command, or by declaring \MessageBreak + a design in the web option list}% + {Do as is suggested in error message!}} \newcommand{\addtoWebHeight}[1]{% % \end{macrocode} % If the \cmd{\screensize} has already been set, it has been % \cmd{\let} to \cmd{\@gobbletwo}. We use this to detect the error % of not already declaring page dimensions. % \begin{macrocode} - \ifx\screensize\@gobbletwo - \expandafter\web@getSSDims\webSaveSSDim + \ifx\screensize\@gobbletwo + \expandafter\web@getSSDims\webSaveSSDim % \end{macrocode} % Even though \cmd{\screensize} has already been expanded and is now % \cs{let} to \cs{@gobbletwo}, we can use our saved version of % \cs{screensize} that no one knows about. % \begin{macrocode} - \screensize@web@save{\web@@height+#1}{\web@@width}% - \else\addToWebHWError\fi + \screensize@web@save{\web@@height+#1}{\web@@width}% + \else\addToWebHWError\fi } % \end{macrocode} % \cs{addtoWebWidth} works the same way as \cmd{\addtoWebHeight}. % \begin{macrocode} \newcommand{\addtoWebWidth}[1]{% - \ifx\screensize\@gobbletwo - \expandafter\web@getSSDims\webSaveSSDim - \screensize@web@save{\web@@height}{\web@@width+#1}% - \else\addToWebHWError\fi + \ifx\screensize\@gobbletwo + \expandafter\web@getSSDims\webSaveSSDim + \screensize@web@save{\web@@height}{\web@@width+#1}% + \else\addToWebHWError\fi } % \end{macrocode} % Expand in preamble only. @@ -1496,18 +1462,17 @@ % #5 = bottom margin %\end{verbatim} % \begin{macrocode} -\newcommand{\@margins}[5][\web@minpanelwidth] -{% - \def\webSaveMargDim{[#1]{#2}{#3}{#4}{#5}}% - \setlength{\@panelwidth}{#1}% - \ifdim\@panelwidth<\web@minpanelwidth - \setlength{\@panelwidth}{\web@minpanelwidth}\fi - \setlength{\@Leftmargin}{#2}% - \setlength{\@Rightmargin}{#3}% - \setlength{\@Topmargin}{#4}% - \setlength{\@Bottommargin}{#5}% - \web@margins@settrue - \InitLayout +\newcommand{\@margins}[5][\web@minpanelwidth]{% + \def\webSaveMargDim{[#1]{#2}{#3}{#4}{#5}}% + \setlength{\@panelwidth}{#1}% + \ifdim\@panelwidth<\web@minpanelwidth + \setlength{\@panelwidth}{\web@minpanelwidth}\fi + \setlength{\@Leftmargin}{#2}% + \setlength{\@Rightmargin}{#3}% + \setlength{\@Topmargin}{#4}% + \setlength{\@Bottommargin}{#5}% + \web@margins@settrue + \InitLayout } \let\margins\@margins \let\margins@web@save\margins @@ -1528,40 +1493,40 @@ % This line adds .25in to each of the side margins. % \begin{macrocode} \newcommand\get@MargDim[5][]{% - \def\currPanelWidth{#1}% - \def\currLeftMarg{#2}\def\currRightMarg{#3}% - \def\currTopMarg{#4}\def\currBottomMarg{#5}} + \def\currPanelWidth{#1}% + \def\currLeftMarg{#2}\def\currRightMarg{#3}% + \def\currTopMarg{#4}\def\currBottomMarg{#5}} \newcommand{\resetmargins}[5][\web@minpanelwidth]{% - \expandafter\get@MargDim\webSaveMargDim - \begingroup - \let\incby\currPanelWidth - \def\web@arg{#1}\ifx\web@arg\@empty - \setlength{\@tempdima}{\currPanelWidth}\else - \setlength{\@tempdima}{#1}\fi - \xdef\newPanelWidth{\the\@tempdima}% - \let\incby\currLeftMarg - \def\web@arg{#2}\ifx\web@arg\@empty - \setlength{\@tempdima}{\currLeftMarg}\else - \setlength{\@tempdima}{#2}\fi - \xdef\newLeftMarg{\the\@tempdima}% - \let\incby\currRightMarg - \def\web@arg{#3}\ifx\web@arg\@empty - \setlength{\@tempdima}{\currRightMarg}\else - \setlength{\@tempdima}{#3}\fi - \xdef\newRightMarg{\the\@tempdima}% - \let\incby\currTopMarg - \def\web@arg{#4}\ifx\web@arg\@empty - \setlength{\@tempdima}{\currTopMarg}\else - \setlength{\@tempdima}{#4}\fi - \xdef\newTopMarg{\the\@tempdima}% - \let\incby\currBottomMarg - \def\web@arg{#4}\ifx\web@arg\@empty - \setlength{\@tempdima}{\currBottomMarg}\else - \setlength{\@tempdima}{#5}\fi - \xdef\newBottomMarg{\the\@tempdima}% - \endgroup - \margins@web@save[\newPanelWidth]{\newLeftMarg}{\newRightMarg} - {\newTopMarg}{\newBottomMarg} + \expandafter\get@MargDim\webSaveMargDim + \begingroup + \let\incby\currPanelWidth + \def\web@arg{#1}\ifx\web@arg\@empty + \setlength{\@tempdima}{\currPanelWidth}\else + \setlength{\@tempdima}{#1}\fi + \xdef\newPanelWidth{\the\@tempdima}% + \let\incby\currLeftMarg + \def\web@arg{#2}\ifx\web@arg\@empty + \setlength{\@tempdima}{\currLeftMarg}\else + \setlength{\@tempdima}{#2}\fi + \xdef\newLeftMarg{\the\@tempdima}% + \let\incby\currRightMarg + \def\web@arg{#3}\ifx\web@arg\@empty + \setlength{\@tempdima}{\currRightMarg}\else + \setlength{\@tempdima}{#3}\fi + \xdef\newRightMarg{\the\@tempdima}% + \let\incby\currTopMarg + \def\web@arg{#4}\ifx\web@arg\@empty + \setlength{\@tempdima}{\currTopMarg}\else + \setlength{\@tempdima}{#4}\fi + \xdef\newTopMarg{\the\@tempdima}% + \let\incby\currBottomMarg + \def\web@arg{#4}\ifx\web@arg\@empty + \setlength{\@tempdima}{\currBottomMarg}\else + \setlength{\@tempdima}{#5}\fi + \xdef\newBottomMarg{\the\@tempdima}% + \endgroup + \margins@web@save[\newPanelWidth]{\newLeftMarg}{\newRightMarg} + {\newTopMarg}{\newBottomMarg}% } \@onlypreamble\resetscreensize % \end{macrocode} @@ -1574,7 +1539,6 @@ % \cs{maketitle} and ends up in the doc info section of the PDF file. % \begin{macrocode} \let\web@save@title\title -%\def\title{\@ifnextchar[{\@title}{\@title[]}} \def\title{\@ifnextchar[{\@web@title}{\@web@title[]}} % \end{macrocode} % \begin{macro}{\webtitle} @@ -1584,8 +1548,8 @@ % \begin{macrocode} %\def\@title[#1]#2{\gdef\webtitle{#2}\hypersetup{pdftitle={#2}}% \def\@web@title[#1]#2{\gdef\webtitle{#2}\hypersetup{pdftitle={#2}}% - \def\webArg{#1}\ifx\webArg\@empty\gdef\shortwebtitle{#2}\else - \gdef\shortwebtitle{#1}\fi\web@save@title{#2}} + \def\webArg{#1}\ifx\webArg\@empty\gdef\shortwebtitle{#2}\else + \gdef\shortwebtitle{#1}\fi\web@save@title{#2}} % \end{macrocode} % \end{macro} % \end{macro} @@ -1595,7 +1559,6 @@ % doc info of the PDF file. % \begin{macrocode} \let\web@saved@author\author -%\def\author#1{\gdef\webauthor{#1}\hypersetup{pdfauthor={#1}}} \def\author#1{\gdef\webauthor{#1}\hypersetup{pdfauthor={#1}}% \web@saved@author{#1}} % \end{macrocode} @@ -1606,9 +1569,9 @@ % \begin{macrocode} \def\subject{\@ifnextchar[{\@subject}{\@subject[]}} \def\@subject[#1]#2{% - \def\webArg{#1}\ifx\webArg\@empty\gdef\shortwebsubject{#2}\else - \gdef\shortwebsubject{#1}\fi\gdef\websubject{#2}% - \hypersetup{pdfsubject={#2}}} + \def\webArg{#1}\ifx\webArg\@empty\gdef\shortwebsubject{#2}\else + \gdef\shortwebsubject{#1}\fi\gdef\websubject{#2}% + \hypersetup{pdfsubject={#2}}} % \end{macrocode} % \end{macro} % \begin{macro}{\email} @@ -1639,9 +1602,9 @@ % A version or revision number. % \begin{macrocode} \def\version#1{\gdef\web@version@value{#1}% - \edef\webversion{\ifx\web@version@value\@empty\else - \noexpand\web@versionlabel\noexpand\ - \noexpand\web@version@value\fi}% + \edef\webversion{\ifx\web@version@value\@empty\else + \noexpand\web@versionlabel\noexpand\ + \noexpand\web@version@value\fi}% } \let\web@version@value\@empty \def\versionLabel#1{\def\web@versionlabel{#1}} @@ -1729,16 +1692,16 @@ \providecommand\FALSEACTIONii{\aftergroup\SETTEMPBOXi} \providecommand\FALSEACTIONiia{\aftergroup\SHOWTEMPBOXi} \providecommand\SETTEMPBOXi{\IF@AorBswitch\else - \afterassignment\TRUEACTIONia\fi - \setbox\webtempboxi=\hbox} + \afterassignment\TRUEACTIONia\fi + \setbox\webtempboxi=\hbox} \providecommand\SETTEMPBOXii{\IF@AorBswitch - \afterassignment\FALSEACTIONiia\fi - \setbox\webtempboxii=\hbox} + \afterassignment\FALSEACTIONiia\fi + \setbox\webtempboxii=\hbox} \def\prtscrV{\let\IF@AorBswitch\ifeqforpaper - \ifeqforpaper - \def\web@next{\afterassignment\TRUEACTIONi\SETTEMPBOXi}\else - \def\web@next{\afterassignment\FALSEACTIONii\SETTEMPBOXii}\fi - \web@next} + \ifeqforpaper + \def\web@next{\afterassignment\TRUEACTIONi\SETTEMPBOXi}\else + \def\web@next{\afterassignment\FALSEACTIONii\SETTEMPBOXii}\fi + \web@next} % \end{macrocode} % \end{macro} %\subsubsection{\texorpdfstring{\protect\cs{optionalPageMatter}}{\CMD{optionalPageMatter}}} @@ -1754,8 +1717,7 @@ \newcommand{\web@aboveOptPgMatDef}{\minimumskip\vspace{\stretch{1}}} \newcommand{\aboveOPMvspace}{\web@aboveOptPgMatDef} \newcommand{\optionalPageMatter}[2][\web@aboveOptPgMatDef]{% - \def\aboveOPMvspace{#1}\def\optionalpagematter{#2}% -} + \def\aboveOPMvspace{#1}\def\optionalpagematter{#2}} \def\optionalpagematter{} % \end{macrocode} % \end{macro} @@ -1765,7 +1727,7 @@ % to adjust the hyperlink target appropriately. % \begin{macrocode} \@ifundefined{thechapter} - {\def\web@Start{section}}{\def\web@Start{chapter}} + {\def\web@Start{section}}{\def\web@Start{chapter}} % \end{macrocode} % \subsubsection{\texorpdfstring{\protect\cs{maketitle}}{\CMD{maketitle}} and the Directory} % In this section we define \cs{maketitle}. You can \cs{renewcommand} this @@ -1806,15 +1768,14 @@ % \begin{macrocode} \newcommand{\trailerFontSize}{\footnotesize} \def\maketitle@trailer@ul{\web@copyright\ \web@copyright@symbol\ - \webcopyrightyears} + \webcopyrightyears} \def\maketitle@trailer@ll{\web@revision\ \@date} \def\maketitle@trailer@ur{\thewebemail} \def\maketitle@trailer@lr{\webversion} -\newcommand{\titlepageTrailer} -{% - \makebox[\linewidth]{\parbox{\linewidth}{% - \maketitle@trailer@ul\hfill\maketitle@trailer@ur\\ - \maketitle@trailer@ll\hfill\maketitle@trailer@lr}}% +\newcommand{\titlepageTrailer}{% + \makebox[\linewidth]{\parbox{\linewidth}{% + \maketitle@trailer@ul\hfill\maketitle@trailer@ur\\ + \maketitle@trailer@ll\hfill\maketitle@trailer@lr}}% } % \end{macrocode} % \end{macro} @@ -1832,21 +1793,21 @@ % \begin{macro}{\afterDirMatter} % The code that places the directory on the title page. % \begin{macrocode} -\newcommand{\webdirectory}{% - \par\ifeqforpaper\else\minimumskip\fi\vspace{\stretch{1}}% - \web@priorDirMatter - \begin{flushleft}{\web@formatWordDirectory\web@directory}% - \web@priorDirList - \vspace{\vspaceAfterDirName}% - \begin{itemize}\setlength{\itemsep}{-3pt}\web@formatDirectoryItems - \ifx\web@removeDirTOC\web@YES\else\item\relax\dirTOCItem\fi - \ifx\web@removeDirArticle\web@YES\else - \item\relax\dirArticleItem\fi - \web@addtoDirList - \end{itemize} - \web@afterDirList - \end{flushleft} - \web@afterDirMatter +\newcommand{\webdirectory}{\par + \ifeqforpaper\else\minimumskip\fi\vspace{\stretch{1}}% + \web@priorDirMatter + \begin{flushleft}{\web@formatWordDirectory\web@directory}% + \web@priorDirList + \vspace{\vspaceAfterDirName}% + \begin{itemize}\setlength{\itemsep}{-3pt}\web@formatDirectoryItems + \ifx\web@removeDirTOC\web@YES\else\item\relax\dirTOCItem\fi + \ifx\web@removeDirArticle\web@YES\else + \item\relax\dirArticleItem\fi + \web@addtoDirList + \end{itemize} + \web@afterDirList + \end{flushleft} + \web@afterDirMatter } % \end{macrocode} % (02/10/2009) We include some additional commands to give control over the @@ -1921,32 +1882,33 @@ % \begin{macro}{\topTitlePage} % The top of the title page. This command lays out the university, the title and the author. % \begin{macrocode} -\newcommand{\topTitlePage} -{% +\newcommand{\topTitlePage}{% % \end{macrocode} % Have \cs{webuniversity} centered across the top of the title page. % \begin{macrocode} - \vglue\web@aboveTopTitleSkip - \noindent\makebox[\linewidth]{% - \parbox{\hproportionwebuniversity\linewidth}% - {\bfseries\color{\webuniversity@color}\ifeqforpaper\large\fi - \centering\webuniversity}}\par\ifeqforpaper\else\minimumskip\fi - \vspace{\stretch{1}}% + \vglue\web@aboveTopTitleSkip + \noindent\makebox[\linewidth]{% + \parbox{\hproportionwebuniversity\linewidth}% + {\bfseries\color{\webuniversity@color}\ifeqforpaper\large\fi + \centering\webuniversity}}\par\ifeqforpaper\else\minimumskip\fi + \vspace{\stretch{1}}\noindent % \end{macrocode} % Now place the title (\cs{webtitle}) % \begin{macrocode} - \noindent\makebox[\linewidth]{% - \parbox{\hproportionwebtitle\linewidth}% - {\bfseries\color{\webtitle@color}\ifeqforpaper\Large\else - \large\fi\centering\webtitle}}\par\ifeqforpaper - \vspace{2\baselineskip}\else\minimumskip\vspace{\stretch{1}}\fi + \makebox[\linewidth]{% + \parbox{\hproportionwebtitle\linewidth}% + {\bfseries\color{\webtitle@color}\ifeqforpaper\Large\else + \large\fi\centering\webtitle}}\par + \ifeqforpaper + \vspace{2\baselineskip}\else\minimumskip\vspace{\stretch{1}}\fi + \noindent % \end{macrocode} % Now place the author (\cs{webauthor}) % \begin{macrocode} - \noindent\makebox[\linewidth]{% - \parbox{\hproportionwebauthor\linewidth}% - {\bfseries\color{\webauthor@color}\ifeqforpaper - \large\fi\centering\webauthor}} + \makebox[\linewidth]{% + \parbox{\hproportionwebauthor\linewidth}% + {\bfseries\color{\webauthor@color}\ifeqforpaper + \large\fi\centering\webauthor}} } % \end{macrocode} % \end{macro} @@ -1958,39 +1920,36 @@ \newcommand{\allowHeadingsTitlePage}{\let\web@titlepagestyle\@gobble} \def\web@titlepagestyle#1{#1} \newcommand{\coverpagemargin}{1in} -\newcommand{\maketitlepreamble} -{% - \web@titlepagestyle{\thispagestyle{empty}}% - \ifeqforpaper\if@centertitlepage - \begingroup +\newcommand{\maketitlepreamble}{% + \web@titlepagestyle{\thispagestyle{empty}}% + \ifeqforpaper\if@centertitlepage + \begingroup % closes in \maketitlepostamble % \end{macrocode} % We center the content on the title page, much better than before. % \changes{v4.4}{2012/08/26}{No code to center the cover page content.} % \begin{macrocode} - \if@centertitlepagefull - \@tempdima=\coverpagemargin - \else - \@tempdima\paperwidth - \advance\@tempdima-\textwidth - \@tempdima=.5\@tempdima - \edef\coverpagemargin{\the\@tempdima}% - \fi - \@tempdimb\paperwidth - \addtolength{\@tempdimb}{-2\@tempdima}% - \edef\fullscreenwidth{\the\@tempdimb}% - \linewidth\fullscreenwidth - \textwidth\fullscreenwidth - \hfuzz\linewidth - \setlength{\oddsidemargin}{\coverpagemargin-1in}% - \setlength{\evensidemargin}{\oddsidemargin}% - \marginparsep=0pt - \marginparwidth=0pt - \parindent0pt + \if@centertitlepagefull + \@tempdima=\coverpagemargin + \else + \@tempdima\paperwidth + \advance\@tempdima-\textwidth + \@tempdima=.5\@tempdima + \edef\coverpagemargin{\the\@tempdima}% + \fi + \@tempdimb\paperwidth + \addtolength{\@tempdimb}{-2\@tempdima}% + \edef\fullscreenwidth{\the\@tempdimb}% + \linewidth\fullscreenwidth + \textwidth\fullscreenwidth + \hfuzz\linewidth + \setlength{\oddsidemargin}{\coverpagemargin-1in}% + \setlength{\evensidemargin}{\oddsidemargin}% + \marginparsep=0pt + \marginparwidth=0pt + \parindent0pt \fi\fi } -\newcommand{\maketitlepostamble} -{% - \newpage +\newcommand{\maketitlepostamble}{\newpage \ifeqforpaper\if@centertitlepage\endgroup\fi\fi } % \end{macrocode} @@ -2000,40 +1959,39 @@ % Redefining \LaTeX's \cs{maketitle}. Looks a little complicated, but this is only because % we have the forpaper design as well as the screen design defined here. % \begin{macrocode} -\newcommand{\web@maketitle} -{% - \maketitlepreamble - \ifeqforpaper\vspace*{2\baselineskip}\else +\newcommand{\web@maketitle}{% + \maketitlepreamble + \ifeqforpaper\vspace*{2\baselineskip}\else % \end{macrocode} % If not for paper, restrict title and author to \cs{titleauthorproportion} of the page % \begin{macrocode} - \vbox to\titleauthorproportion\textheight\bgroup\fi + \vbox to\titleauthorproportion\textheight\bgroup\fi % \end{macrocode} % \begin{macrocode} - \topTitlePage + \topTitlePage % \end{macrocode} % \begin{macrocode} - \ifeqforpaper\else\egroup\fi % end of \vbox for title and author + \ifeqforpaper\else\egroup\fi % end of \vbox for title and author % \end{macrocode} % Now place the \cs{optionalpagematter} % \begin{macrocode} - \ifx\optionalpagematter\@empty\par\else - \begingroup\par - \aboveOPMvspace - \noindent\parbox{\linewidth}{\optionalpagematter}% - \par\endgroup\fi - \vspace{\stretch{1}} + \ifx\optionalpagematter\@empty\par\else + \begingroup\par + \aboveOPMvspace + \noindent\parbox{\linewidth}{\optionalpagematter}% + \par\endgroup\fi + \vspace{\stretch{1}} % \end{macrocode} % Insert the directory, as desired. % \begin{macrocode} - \ifx\web@directory@option\web@YES\web@directory@hook\webdirectory\fi - \par\ifeqforpaper\else\minimumskip\fi\vspace{\stretch{1}} + \ifx\web@directory@option\web@YES\web@directory@hook\webdirectory\fi + \par\ifeqforpaper\else\minimumskip\fi\vspace{\stretch{1}} % \end{macrocode} % Insert the ``bottom matter''. % \begin{macrocode} - \vfill\noindent\begingroup - \trailerFontSize\titlepageTrailer\par\endgroup - \maketitlepostamble + \vfill\noindent\begingroup + \trailerFontSize\titlepageTrailer\par\endgroup + \maketitlepostamble } \let\web@save@maketitle\maketitle \let\maketitle\web@maketitle @@ -2046,28 +2004,26 @@ % A convenience command for making a simple in line title. %} % \begin{macrocode} -\newcommand{\makeinlinetitle} -{% - \noindent\makebox[\linewidth][c]{% - \bfseries\color{\webtitle@color}\webtitle} - \makebox[\linewidth]{% - \shortstack[l]{\strut\\ - \makebox[0pt][l]{\webuniversity}\\ - \makebox[0pt][l]{% - \@ifundefined{aeb@prepared} - {\@date}{\aeb@prepared}% - }% - }\hfill - \shortstack[c]{\strut\webauthor\\\strut}\hfill - \shortstack[r]{\strut\makebox[0pt][r]{\thewebemail}\\ - \makebox[0pt][r]{% - \@ifundefined{aeb@talksite}{\webversion} - {\ifx\aeb@talksite\@empty\webversion - \else\aeb@talksite\fi}% - }% - }% +\newcommand{\makeinlinetitle}{\noindent + \makebox[\linewidth][c]{% + \bfseries\color{\webtitle@color}\webtitle} + \makebox[\linewidth]{% + \shortstack[l]{\strut\\ + \makebox[0pt][l]{\webuniversity}\\ + \makebox[0pt][l]{\@ifundefined{aeb@prepared} + {\@date}{\aeb@prepared}% + }% + }\hfill + \shortstack[c]{\strut\webauthor\\\strut}\hfill + \shortstack[r]{\strut\makebox[0pt][r]{\thewebemail}\\ + \makebox[0pt][r]{% + \@ifundefined{aeb@talksite}{\webversion} + {\ifx\aeb@talksite\@empty\webversion + \else\aeb@talksite\fi}% + }% }% - \bigskip + }% + \bigskip } % \end{macrocode} % \end{macro} @@ -2079,9 +2035,7 @@ % Try to squeeze a little more in per page. % \begin{macrocode} \ifeqforpaper\else - \clubpenalty=50 - \widowpenalty=50 -\fi + \clubpenalty=50 \widowpenalty=50 \fi % \end{macrocode} % \subsection{Tight Settings} % @@ -2103,142 +2057,142 @@ \def\w@ppp#1#2#3{#1\p@ \@plus#2\p@ \@minus#3\p@} \def\w@zpp#1#2{\z@ \@plus#1\p@ \@minus#2\p@} \def\tightsettings@z{% - \setlength\partopsep{\w@ppp{2}{}{}} % unchanged - \def\web@listi{\leftmargin\leftmargini - \parsep \w@ppp{2}{2}{}% 4+2-1 - \topsep \w@ppp{2}{1}{}% 8+2-4 - \itemsep\w@ppp{2}{1}{}}% 4+2-1 - \let\@listi\web@listi - \let\@listI\@listi - \@listi - \def\web@listii {\leftmargin\leftmarginii - \labelwidth\leftmarginii - \advance\labelwidth-\labelsep - \topsep \w@zpp{}{}% 4+2-1 - \parsep \w@zpp{}{}% 2+1-1 - \itemsep \parsep}% unchanged - \def\web@listiii{\leftmargin\leftmarginiii - \labelwidth\leftmarginiii - \advance\labelwidth-\labelsep - \topsep \w@zpp{}{}% 2+1-1 + \setlength\partopsep{\w@ppp{2}{}{}} % unchanged + \def\web@listi{\leftmargin\leftmargini + \parsep \w@ppp{2}{2}{}% 4+2-1 + \topsep \w@ppp{2}{1}{}% 8+2-4 + \itemsep\w@ppp{2}{1}{}}% 4+2-1 + \let\@listi\web@listi + \let\@listI\@listi + \@listi + \def\web@listii {\leftmargin\leftmarginii + \labelwidth\leftmarginii + \advance\labelwidth-\labelsep + \topsep \w@zpp{}{}% 4+2-1 + \parsep \w@zpp{}{}% 2+1-1 + \itemsep \parsep}% unchanged + \def\web@listiii{\leftmargin\leftmarginiii + \labelwidth\leftmarginiii + \advance\labelwidth-\labelsep + \topsep \w@zpp{}{}% 2+1-1 % \end{macrocode} % Uncommented text now commented out. % \changes{v6.0o}{2017/01/20}{Uncommented text, now commented out} % \begin{macrocode} - \parsep \z@ % unchanged - \partopsep \w@ppp{}{}{}% unchanged - \itemsep \topsep}% unchanged - \let\@listii\web@listii - \let\@listiii\web@listiii - \renewcommand\web@normalsize{% - \@setfontsize\normalsize\@xpt\@xiipt - \abovedisplayskip \w@ppp{5}{3}{}% 10+2-5 - \abovedisplayshortskip \w@zpp{3}{0}% unchanged - \belowdisplayshortskip \w@ppp{3}{2}{2}% 6+3-3 - \belowdisplayskip \abovedisplayskip - \let\@listi\@listI}% - \let\normalsize\web@normalsize - \normalsize + \parsep \z@ % unchanged + \partopsep \w@ppp{}{}{}% unchanged + \itemsep \topsep + }% unchanged + \let\@listii\web@listii + \let\@listiii\web@listiii + \renewcommand\web@normalsize{% + \@setfontsize\normalsize\@xpt\@xiipt + \abovedisplayskip \w@ppp{5}{3}{}% 10+2-5 + \abovedisplayshortskip \w@zpp{3}{0}% unchanged + \belowdisplayshortskip \w@ppp{3}{2}{2}% 6+3-3 + \belowdisplayskip \abovedisplayskip + \let\@listi\@listI}% + \let\normalsize\web@normalsize + \normalsize } % \end{macrocode} % \paragraph*{Tight settings for \texttt{11pt}} % \begin{macrocode} \def\tightsettings@i{% - \setlength\partopsep{\w@ppp{2}{}{}}% 3+1-1 - \def\web@listi{\leftmargin\leftmargini - \parsep \w@ppp{2.5}{2}{}% 4.5+2-1 - \topsep \w@ppp{4.5}{1.5}{2.5}% 9+3-5 - \itemsep \w@ppp{2.5}{}{}}% 4.5+2-1 - \let\@listi\web@listi - \let\@listI\@listi - \@listi - \def\web@listii {\leftmargin\leftmarginii - \labelwidth\leftmarginii - \advance\labelwidth-\labelsep - \topsep \w@ppp{}{}{}% 4.5+2-1 - \parsep \w@ppp{}{}{}% 2+1-1 - \itemsep \parsep}% unchanged - \def\web@listiii{\leftmargin\leftmarginiii - \labelwidth\leftmarginiii - \advance\labelwidth-\labelsep - \topsep \w@ppp{}{}{}% 2+1-1 - \parsep \z@ % unchanged - \partopsep \w@ppp{}{}{}% unchanged - \itemsep \topsep}% unchanged - \let\@listii\web@listii - \let\@listiii\web@listiii - \renewcommand\web@normalsize{% - \@setfontsize\normalsize\@xipt{13.6}% - \abovedisplayskip \w@ppp{5.5}{3}{3}% 11+3-6 - \abovedisplayshortskip \w@zpp{}{0}% unchanged - \belowdisplayshortskip \w@ppp{4}{2}{2}% 6.5+3.5-3 - \belowdisplayskip \abovedisplayskip - \let\@listi\@listI}% - \let\normalsize\web@normalsize - \normalsize + \setlength\partopsep{\w@ppp{2}{}{}}% 3+1-1 + \def\web@listi{\leftmargin\leftmargini + \parsep \w@ppp{2.5}{2}{}% 4.5+2-1 + \topsep \w@ppp{4.5}{1.5}{2.5}% 9+3-5 + \itemsep \w@ppp{2.5}{}{}}% 4.5+2-1 + \let\@listi\web@listi + \let\@listI\@listi + \@listi + \def\web@listii {\leftmargin\leftmarginii + \labelwidth\leftmarginii + \advance\labelwidth-\labelsep + \topsep \w@ppp{}{}{}% 4.5+2-1 + \parsep \w@ppp{}{}{}% 2+1-1 + \itemsep \parsep}% unchanged + \def\web@listiii{\leftmargin\leftmarginiii + \labelwidth\leftmarginiii + \advance\labelwidth-\labelsep + \topsep \w@ppp{}{}{}% 2+1-1 + \parsep \z@ % unchanged + \partopsep \w@ppp{}{}{}% unchanged + \itemsep \topsep}% unchanged + \let\@listii\web@listii + \let\@listiii\web@listiii + \renewcommand\web@normalsize{% + \@setfontsize\normalsize\@xipt{13.6}% + \abovedisplayskip \w@ppp{5.5}{3}{3}% 11+3-6 + \abovedisplayshortskip \w@zpp{}{0}% unchanged + \belowdisplayshortskip \w@ppp{4}{2}{2}% 6.5+3.5-3 + \belowdisplayskip \abovedisplayskip + \let\@listi\@listI}% + \let\normalsize\web@normalsize + \normalsize } % \end{macrocode} % \paragraph*{Tight settings for \texttt{12pt}} % \begin{macrocode} \def\tightsettings@ii{% - \setlength\partopsep{\w@ppp{3}{2}{2}}% unchanged - \def\web@listi{\leftmargin\leftmargini - \parsep \w@ppp{3}{2}{}% 5+2.5-1 - \topsep \w@ppp{5}{2}{3}% 10+4-6 - \itemsep\w@ppp{2.5}{}{}}% 5+2.5-1 - \let\@listi\web@listi - \let\@listI\@listi - \@listi - \def\web@listii {\leftmargin\leftmarginii - \labelwidth\leftmarginii - \advance\labelwidth-\labelsep - \topsep \w@ppp{2.5}{}{}% 5+2.5-1 - \parsep \w@ppp{2}{}{}% 2.5+1-1 - \itemsep \parsep}% unchanged - \def\web@listiii{\leftmargin\leftmarginiii - \labelwidth\leftmarginiii - \advance\labelwidth-\labelsep - \topsep \w@ppp{1.5}{}{}% 2.5+1-1 - \parsep \z@ % unchanged - \partopsep \w@ppp{}{}{}% unchanged - \itemsep \topsep}% unchanged - \let\@listii\web@listii - \let\@listiii\web@listiii - \renewcommand\web@normalsize{% - \@setfontsize\normalsize\@xiipt{14.5}% - \abovedisplayskip \w@ppp{6}{1.5}{3.5}% 12+3-7 - \abovedisplayshortskip \w@zpp{3}{0}% unchanged - \belowdisplayshortskip \w@ppp{4}{2}{2}% 6.5+3.5-3 - \belowdisplayskip \abovedisplayskip - \let\@listi\@listI}% - \let\normalsize\web@normalsize - \normalsize + \setlength\partopsep{\w@ppp{3}{2}{2}}% unchanged + \def\web@listi{\leftmargin\leftmargini + \parsep \w@ppp{3}{2}{}% 5+2.5-1 + \topsep \w@ppp{5}{2}{3}% 10+4-6 + \itemsep\w@ppp{2.5}{}{}}% 5+2.5-1 + \let\@listi\web@listi + \let\@listI\@listi + \@listi + \def\web@listii {\leftmargin\leftmarginii + \labelwidth\leftmarginii + \advance\labelwidth-\labelsep + \topsep \w@ppp{2.5}{}{}% 5+2.5-1 + \parsep \w@ppp{2}{}{}% 2.5+1-1 + \itemsep \parsep}% unchanged + \def\web@listiii{\leftmargin\leftmarginiii + \labelwidth\leftmarginiii + \advance\labelwidth-\labelsep + \topsep \w@ppp{1.5}{}{}% 2.5+1-1 + \parsep \z@ % unchanged + \partopsep \w@ppp{}{}{}% unchanged + \itemsep \topsep}% unchanged + \let\@listii\web@listii + \let\@listiii\web@listiii + \renewcommand\web@normalsize{% + \@setfontsize\normalsize\@xiipt{14.5}% + \abovedisplayskip \w@ppp{6}{1.5}{3.5}% 12+3-7 + \abovedisplayshortskip \w@zpp{3}{0}% unchanged + \belowdisplayshortskip \w@ppp{4}{2}{2}% 6.5+3.5-3 + \belowdisplayskip \abovedisplayskip + \let\@listi\@listI}% + \let\normalsize\web@normalsize + \normalsize } % \end{macrocode} % Select \DescribeMacro{\tightsettings}\cs{tightsettings} according to point size % \begin{macrocode} \def\tightsettings{\@ifstar{\ifeqforpaper\else\tightsettings@cont\fi} - {\tightsettings@cont}} + {\tightsettings@cont}} \def\tightsettings@cont{\let\web@tight\web@YES - \ifcase\@ptsize - \tightsettings@z\or - \tightsettings@i\or - \tightsettings@ii - \fi + \ifcase\@ptsize + \tightsettings@z\or + \tightsettings@i\or + \tightsettings@ii\fi } % \end{macrocode} % Restore to normal document class settings using % \DescribeMacro{\restorenormalsettings}\cs{restorenormalsettings}. % \begin{macrocode} \def\restorenormalsettings{\let\web@tight\web@NO - \let\@listi\web@save@listi - \let\@listii\web@save@listii - \let\@listiii\web@save@listiii - \let\normalsize\web@save@normalsize - \let\partopsep\web@save@partopsep - \let\@listI\@listi - \@listi - \normalsize + \let\@listi\web@save@listi + \let\@listii\web@save@listii + \let\@listiii\web@save@listiii + \let\normalsize\web@save@normalsize + \let\partopsep\web@save@partopsep + \let\@listI\@listi + \@listi + \normalsize } % \end{macrocode} % \subsection{Navgation Aids} @@ -2259,15 +2213,14 @@ % \end{macrocode} % \end{macro} % \begin{macrocode} -\newcommand{\newNaviIcon}[1][\@empty] -{% - \ifx#1m\let\web@next\@newNaviIconMenu - \else\ifx#1j\let\web@next\@newNaviIconJS - \else\ifx#1l\let\web@next\@newNaviIconLink - \else\ifx#1\@empty\let\web@next\@newNaviIconLink - \else\let\web@next\relax - \PackageWarning{web}{\string\newNaviIcon: unknown first parameter} - \fi\fi\fi\fi\web@next +\newcommand{\newNaviIcon}[1][\@empty]{% + \ifx#1m\let\web@next\@newNaviIconMenu + \else\ifx#1j\let\web@next\@newNaviIconJS + \else\ifx#1l\let\web@next\@newNaviIconLink + \else\ifx#1\@empty\let\web@next\@newNaviIconLink + \else\let\web@next\relax + \PackageWarning{web}{\string\newNaviIcon: unknown first parameter} + \fi\fi\fi\fi\web@next } % \end{macrocode} % \begin{macro}{\@newNaviIconMenu} @@ -2287,15 +2240,14 @@ % is determined by \cs{@menuBgColor}. % \begin{macrocode} \def\web@colorbox@w@transparency#1{% - \ifx#1\@empty\setlength{\fboxrule}{0pt}\let\aeb@next\fbox\else - \def\aeb@next{\colorbox{#1}}\fi\aeb@next} -\newcommand{\@newNaviIconMenu}[6][I] -{% - \def#2{{\setlength{\fboxsep}{0pt}\def\@pdfhighlight{/#1}% - \Acrobatmenu{#6}{\web@colorbox@w@transparency{\@menuBgColor}{% - \parbox[c][#4][c]{#3}% - {\normalsize\centering\color{\@menucolor}#5}}}% - }}% + \ifx#1\@empty\setlength{\fboxrule}{0pt}\let\aeb@next\fbox\else + \def\aeb@next{\colorbox{#1}}\fi\aeb@next} +\newcommand{\@newNaviIconMenu}[6][I]{% + \def#2{{\setlength{\fboxsep}{0pt}\def\@pdfhighlight{/#1}% + \Acrobatmenu{#6}{\web@colorbox@w@transparency{\@menuBgColor}{% + \parbox[c][#4][c]{#3}% + {\normalsize\centering\color{\@menucolor}#5}}}% + }}% } % \end{macrocode} % \end{macro} @@ -2314,44 +2266,43 @@ % The color of the text is controlled by \cs{navibarTextColor}, and the background color % is determined by \cs{@menuBgColor}. % \begin{macrocode} -\newcommand{\@newNaviIconJS}[6][I] -{% - \ifcase\eq@drivernum - \def#2{{\setlength{\fboxsep}{0pt}% - \pdf@rect{\web@colorbox@w@transparency{\@menuBgColor}% - {\parbox[c][#4][c]{#3}% - {\normalsize\centering\color{\@menucolor}#5}}}% - \literalps@out{% - [ /Rect [pdf@llx pdf@lly pdf@urx pdf@ury] - /Border [ 0 0 0 ]/H/#1\space - /Action <</S/JavaScript/JS (#6) >> - /Subtype/Link - /ANN pdfmark}% - }}% - \or - \def#2{{\setlength{\fboxsep}{0pt}% - \leavevmode\pdfstartlink - attr {/Border [0 0 0 ] /H/#1}% - user{ /Subtype /Link - /A << /S/JavaScript/JS (#6) >>}% - \web@colorbox@w@transparency{\@menuBgColor}% - {\parbox[c][#4][c]{#3}% - {\normalsize\centering\color{\@menucolor}#5}}% - \pdfendlink - }}% - \or - \def#2{{\setlength{\fboxsep}{0pt}% - \@pdfm@mark{bann - << - /Border [0 0 0 ] /H/#1\space - /Subtype /Link - /A << /S/JavaScript/JS (#6) >> - >>}\web@colorbox@w@transparency{\@menuBgColor}% - {\parbox[c][#4][c]{#3}% - {\normalsize\centering\color{\@menucolor}#5}}% - \@pdfm@mark{eann}% - }}% - \fi +\newcommand{\@newNaviIconJS}[6][I]{% + \ifcase\eq@drivernum + \def#2{{\setlength{\fboxsep}{0pt}% + \pdf@rect{\web@colorbox@w@transparency{\@menuBgColor}% + {\parbox[c][#4][c]{#3}% + {\normalsize\centering\color{\@menucolor}#5}}}% + \literalps@out{% + [ /Rect [pdf@llx pdf@lly pdf@urx pdf@ury] + /Border [ 0 0 0 ]/H/#1\space + /Action <</S/JavaScript/JS (#6) >> + /Subtype/Link + /ANN pdfmark}% + }}% + \or + \def#2{{\setlength{\fboxsep}{0pt}% + \leavevmode\pdfstartlink + attr {/Border [0 0 0 ] /H/#1}% + user{ /Subtype /Link + /A << /S/JavaScript/JS (#6) >>}% + \web@colorbox@w@transparency{\@menuBgColor}% + {\parbox[c][#4][c]{#3}% + {\normalsize\centering\color{\@menucolor}#5}}% + \pdfendlink + }}% + \or + \def#2{{\setlength{\fboxsep}{0pt}% + \@pdfm@mark{bann + << + /Border [0 0 0 ] /H/#1\space + /Subtype /Link + /A << /S/JavaScript/JS (#6) >> + >>}\web@colorbox@w@transparency{\@menuBgColor}% + {\parbox[c][#4][c]{#3}% + {\normalsize\centering\color{\@menucolor}#5}}% + \@pdfm@mark{eann}% + }}% + \fi } % \end{macrocode} % \end{macro} @@ -2374,13 +2325,12 @@ % The color of the text is controlled by \cs{navibarTextColor}, and the background color % is determined by \cs{@menuBgColor}. % \begin{macrocode} -\newcommand{\@newNaviIconLink}[6][I] -{% - \def#2{{\setlength{\fboxsep}{0pt}\def\@pdfhighlight{/#1}% - #6{\web@colorbox@w@transparency{\@menuBgColor}% - {\parbox[c][#4][c]{#3}% - {\normalsize\centering\color{\@menucolor}#5}}}% - }}% +\newcommand{\@newNaviIconLink}[6][I]{% + \def#2{{\setlength{\fboxsep}{0pt}\def\@pdfhighlight{/#1}% + #6{\web@colorbox@w@transparency{\@menuBgColor}% + {\parbox[c][#4][c]{#3}% + {\normalsize\centering\color{\@menucolor}#5}}}% + }}% } % \end{macrocode} % \begin{macrocode} @@ -2388,7 +2338,7 @@ \def\insert@webtoc{\web@TOC\ } \def\web@TocText{Toc} \newNaviIcon[l]{\web@TOC}{\web@nb@width}{\web@nb@height} - {\footnotesize\web@TocText}{\hyperlink{webtoc}} + {\footnotesize\web@TocText}{\hyperlink{webtoc}} % \end{macrocode} % Some icon definitions that are used in the navigation bar that appears at the bottom of the page. % \begin{macrocode} @@ -2396,80 +2346,81 @@ \newcommand\navibariconHeight[1]{\def\web@nb@height{#1}} \navibariconWidth{34pt}\navibariconHeight{10pt} \@newNaviIconMenu{\web@FirstPage}{\web@nb@width}{\web@nb@height} - {\web@FirstPageText}{FirstPage} + {\web@FirstPageText}{FirstPage} \def\web@FirstPageText{$\blacktriangleleft\blacktriangleleft$} \@newNaviIconMenu{\web@LastPage}{\web@nb@width}{\web@nb@height} - {\web@LastPageText}{LastPage} + {\web@LastPageText}{LastPage} \def\web@LastPageText{$\blacktriangleright\blacktriangleright$} \@newNaviIconMenu{\web@PrevPage}{\web@nb@width}{\web@nb@height} - {\web@PrevPageText}{PrevPage} + {\web@PrevPageText}{PrevPage} \def\web@PrevPageText{$\blacktriangleleft$} \@newNaviIconMenu{\web@NextPage}{\web@nb@width}{\web@nb@height} - {\web@NextPageText}{NextPage} + {\web@NextPageText}{NextPage} \def\web@NextPageText{$\blacktriangleright$} \@newNaviIconMenu{\web@GoBack}{\web@nb@width}{\web@nb@height} - {\footnotesize\web@back}{GoBack} + {\footnotesize\web@back}{GoBack} \@newNaviIconMenu{\web@GoBackDoc}{\web@nb@width}{\web@nb@height} - {$\blacktriangleleft$\ \footnotesize\web@doc}{GoBackDoc} + {$\blacktriangleleft$\ \footnotesize\web@doc}{GoBackDoc} \@newNaviIconMenu{\web@GoForwardDoc}{\web@nb@width}{\web@nb@height} - {\footnotesize\web@doc\ \normalsize$\blacktriangleright$} - {GoForwardDoc} + {\footnotesize\web@doc\ \normalsize$\blacktriangleright$} + {GoForwardDoc} \@newNaviIconMenu{\web@FS}{\web@nb@width}{\web@nb@height} - {\footnotesize\web@FSText}{FullScreen} + {\footnotesize\web@FSText}{FullScreen} \def\web@FSText{FS} \@newNaviIconMenu{\web@GoToPage}{\web@nb@width}{\web@nb@height} - {\footnotesize\web@GoToPageText}{GoToPage} + {\footnotesize\web@GoToPageText}{GoToPage} \def\web@GoToPageText{Page...} % \end{macrocode} % \begin{macro}{\web@navigationbar} % The navigation bar, this can be redefined. % \begin{macrocode} \newcommand\web@navigationbar{% -\hfil\bfseries\footnotesize -\insertwebtoc -\web@FirstPage\ -\web@LastPage\ -\web@PrevPage\ -\web@NextPage\ -\web@GoBack -%\web@GoBackDoc\ -%\web@GoForwardDoc -\hfil} + \hfil\bfseries\footnotesize + \insertwebtoc + \web@FirstPage\ + \web@LastPage\ + \web@PrevPage\ + \web@NextPage\ + \web@GoBack + %\web@GoBackDoc\ + %\web@GoForwardDoc + \hfil +} % \end{macrocode} % \end{macro} % Here are some icon buttons for the panel, if a panel is desired. % \begin{macrocode} -\newcommand{\panelgroupWidth}[1]{% - \global\let\chkpanelgroup\web@chkpanelgroup - \def\web@pg@width{#1}} -\newcommand{\panelgroupHeight}[1]{% - \global\let\chkpanelgroup\web@chkpanelgroup - \def\web@pg@height{#1}} -\newcommand{\panelgroupSep}[1]{% - \global\let\chkpanelgroup\web@chkpanelgroup - \def\web@pg@sep{#1}} +\newcommand{\panelgroupWidth}[1]{\global + \let\chkpanelgroup\web@chkpanelgroup + \def\web@pg@width{#1}} +\newcommand{\panelgroupHeight}[1]{\global + \let\chkpanelgroup\web@chkpanelgroup + \def\web@pg@height{#1}} +\newcommand{\panelgroupSep}[1]{\global + \let\chkpanelgroup\web@chkpanelgroup + \def\web@pg@sep{#1}} \@newNaviIconMenu{\panel@FirstPage}{\web@pg@width}{\web@pg@height} - {\web@FirstPageText}{FirstPage} + {\web@FirstPageText}{FirstPage} \@newNaviIconMenu{\panel@LastPage}{\web@pg@width}{\web@pg@height} - {\web@LastPageText}{LastPage} + {\web@LastPageText}{LastPage} \@newNaviIconMenu{\panel@PrevPage}{\web@pg@width}{\web@pg@height} - {\web@PrevPageText}{PrevPage} + {\web@PrevPageText}{PrevPage} \@newNaviIconMenu{\panel@NextPage}{\web@pg@width}{\web@pg@height} - {\web@NextPageText}{NextPage} + {\web@NextPageText}{NextPage} \@newNaviIconMenu{\panel@GoBack}{\web@pg@width}{\web@pg@height} - {\footnotesize\web@back}{GoBack} + {\footnotesize\web@back}{GoBack} \@newNaviIconMenu{\panel@GoBackDoc}{\web@pg@width}{\web@pg@height} - {$\blacktriangleleft$\,\footnotesize\web@doc}{GoBackDoc} + {$\blacktriangleleft$\,\footnotesize\web@doc}{GoBackDoc} \@newNaviIconMenu{\panel@GoForwardDoc}{\web@pg@width}{\web@pg@height} - {\footnotesize\web@doc\,\normalsize$\blacktriangleright$} - {GoForwardDoc} + {\footnotesize\web@doc\,\normalsize$\blacktriangleright$} + {GoForwardDoc} \@newNaviIconMenu{\panel@Close}{\web@pg@width}{\web@pg@height} - {\footnotesize Close}{Close} + {\footnotesize Close}{Close} \def\web@CloseText{Close} \@newNaviIconMenu{\panel@FS}{\web@pg@width}{\web@pg@height} - {\footnotesize\web@FSText}{FullScreen} + {\footnotesize\web@FSText}{FullScreen} \@newNaviIconMenu{\panel@GoToPage}{\web@pg@width}{\web@pg@height} - {\footnotesize\web@GoToPageText}{GoToPage} + {\footnotesize\web@GoToPageText}{GoToPage} % \end{macrocode} % A check to see if the panel group is too wide. % \begin{macrocode} @@ -2478,7 +2429,8 @@ \ifdim\@tempdima>\@panelwidth\PackageError{web}{Width of \string\panelNaviGroup\space is wider than the panel}{}\else \xdef\panelNavigroupWidth{\the\@tempdima}\fi - \egroup\global\let\chkpanelgroup\@empty + \egroup + \global\let\chkpanelgroup\@empty } \panelgroupWidth{28pt}\panelgroupHeight{15pt} \panelgroupSep{2pt} @@ -2487,15 +2439,13 @@ % Standard navigation group for a panel. % \begin{macrocode} \newcommand\panelNaviGroup{\chkpanelgroup - \parbox[c]{\panelNavigroupWidth}{% - \offinterlineskip - \panelIconGroup - }% -} + \parbox[c]{\panelNavigroupWidth}{% + \offinterlineskip + \panelIconGroup}} \newcommand{\panelIconGroup}{% - \panel@FirstPage\hfill\panel@LastPage\\[\panelrowsep] - \panel@PrevPage\hfill\panel@NextPage\\[\panelrowsep] - \panel@GoBack\hfill\panel@Close + \panel@FirstPage\hfill\panel@LastPage\\[\panelrowsep] + \panel@PrevPage\hfill\panel@NextPage\\[\panelrowsep] + \panel@GoBack\hfill\panel@Close } % \end{macrocode} % \begin{macro}{\insNaviBar} @@ -2524,37 +2474,37 @@ % \begin{macrocode} \def\web@ifOnThisPage#1#2{\ifnum\c@page=\@thispage\relax #1\else#2\fi} -\newcommand{\insertnaviiconhere}[1] -{% - \xdef\@thispage{\the\c@page}% - \def\web@insToRight{% - \ifeqforpaper\makebox[0pt][l]{\ifdim\marginparsep>0pt\relax - \hspace{\marginparsep}\else\ \fi#1}\else - \makebox[0pt][l]{% - \ifnum\@panelconfig=2\relax - \hspace{\@panelsep}\else - \hspace{\@Rightmargin}\fi - \makebox[0pt][r]{#1}}\fi - }\expandafter\rheader\expandafter - {\expandafter\web@ifOnThisPage - \expandafter{\web@rightheader\web@insToRight}% - {\web@defaultrightheader}}% +\newcommand{\insertnaviiconhere}[1]{% + \xdef\@thispage{\the\c@page}% + \def\web@insToRight{% + \ifeqforpaper + \makebox[0pt][l]{\ifdim\marginparsep>\z@ + \hspace{\marginparsep}\else\ \fi#1}\else + \makebox[0pt][l]{% + \ifnum\@panelconfig=\tw@ + \hspace{\@panelsep}\else + \hspace{\@Rightmargin}\fi + \makebox[0pt][r]{#1}}\fi + }\expandafter\rheader\expandafter + {\expandafter\web@ifOnThisPage + \expandafter{\web@rightheader\web@insToRight}% + {\web@defaultrightheader}}% } % \end{macrocode} % \end{macro} % \begin{macro}{\insertnaviiconhereafter} % Inserts a direction icon on the current page, and every page thereafter. % \begin{macrocode} -%\def\insertnaviiconhereafter#1{\lheader{#1}} \def\insertnaviiconhereafter#1{\def\web@insToLeft{% - \ifeqforpaper\makebox[0pt][r]{#1\ifdim\marginparsep>0pt\relax - \hspace{\marginparsep}\else\ \fi}\else + \ifeqforpaper + \makebox[0pt][r]{#1\ifdim\marginparsep>\z@ + \hspace{\marginparsep}\else\ \fi}\else \makebox[0pt][r]{\makebox[0pt][l]{#1}% - \ifnum\@panelconfig=1\relax - \hspace{\@panelsep}\else - \hspace{\@Leftmargin}\fi}\fi - }\expandafter\lheader\expandafter - {\expandafter\web@insToLeft\web@lhead}} + \ifnum\@panelconfig=\@ne + \hspace{\@panelsep}\else + \hspace{\@Leftmargin}\fi}\fi + }\expandafter\lheader\expandafter + {\expandafter\web@insToLeft\web@lhead}} % \end{macrocode} % \end{macro} % \begin{macro}{\removehereaftericon} @@ -2571,23 +2521,21 @@ %\insertnaviiconhere{\ArrowUp{\href{http://www.adobe.com/}}} %\end{verbatim} % \begin{macrocode} -\newcommand\ArrowUp[1] -{% - \normalsize\ifeqforpaper - \setlength{\fboxsep}{6pt}\else - \setlength{\fboxsep}{4pt}\fi - \raisebox{\depth-\fboxsep}[0pt][0pt]{% - #1{\web@colorbox@w@transparency{\web@directionIconBgColor}% - {\textcolor{\web@directionIconTextColor}{$\bigl\Uparrow$}}}}% -} -\newcommand\ArrowDown[1] -{% - \normalsize\ifeqforpaper - \setlength{\fboxsep}{6pt}\else - \setlength{\fboxsep}{4pt}\fi - \raisebox{\depth-\fboxsep}[0pt][0pt]{% - #1{\web@colorbox@w@transparency{\web@directionIconBgColor}% - {\textcolor{\web@directionIconTextColor}{$\bigl\Downarrow$}}}}% +\newcommand\ArrowUp[1]{% + \normalsize\ifeqforpaper + \setlength{\fboxsep}{6pt}\else + \setlength{\fboxsep}{4pt}\fi + \raisebox{\depth-\fboxsep}[0pt][0pt]{% + #1{\web@colorbox@w@transparency{\web@directionIconBgColor}% + {\textcolor{\web@directionIconTextColor}{$\bigl\Uparrow$}}}}% +} +\newcommand\ArrowDown[1]{% + \normalsize\ifeqforpaper + \setlength{\fboxsep}{6pt}\else + \setlength{\fboxsep}{4pt}\fi + \raisebox{\depth-\fboxsep}[0pt][0pt]{% + #1{\web@colorbox@w@transparency{\web@directionIconBgColor}% + {\textcolor{\web@directionIconTextColor}{$\bigl\Downarrow$}}}}% } % \end{macrocode} % \end{macro} @@ -2657,25 +2605,25 @@ % Here we offer a simple mechanism for saving and restoring running headers. % \begin{macrocode} \newcommand{\clearHeaders}{% - \let\web@lhead@save\web@lhead - \let\web@chead@save\web@chead - \let\web@rightheader@save\web@rightheader - \let\web@lhead\@empty\let\web@chead\@empty - \let\web@rightheader\@empty} + \let\web@lhead@save\web@lhead + \let\web@chead@save\web@chead + \let\web@rightheader@save\web@rightheader + \let\web@lhead\@empty\let\web@chead\@empty + \let\web@rightheader\@empty} \newcommand{\restoreHeaders}{% - \let\web@lhead\web@lhead@save - \let\web@chead\web@chead@save - \let\web@rightheader\web@rightheader@save} + \let\web@lhead\web@lhead@save + \let\web@chead\web@chead@save + \let\web@rightheader\web@rightheader@save} \newcommand{\clearFooters}{% - \let\web@lfoot@save\web@lfoot - \let\web@cfoot@save\web@cfoot - \let\web@rfoot@save\web@lfoot - \let\web@lfoot\@empty\let\web@cfoot\@empty - \let\web@rfoot\@empty} + \let\web@lfoot@save\web@lfoot + \let\web@cfoot@save\web@cfoot + \let\web@rfoot@save\web@lfoot + \let\web@lfoot\@empty\let\web@cfoot\@empty + \let\web@rfoot\@empty} \newcommand{\restoreFooters}{% - \let\web@lfoot\web@lfoot@save - \let\web@cfoot\web@cfoot@save - \let\web@rfoot\web@rfoot@save} + \let\web@lfoot\web@lfoot@save + \let\web@cfoot\web@cfoot@save + \let\web@rfoot\web@rfoot@save} % \end{macrocode} % You can use this command to insert additional formatting into the running header. % For example, \verb!\headerformat{\bfseries\color{red}}!. @@ -2700,18 +2648,17 @@ \let\webfootwrapper\@empty \newcommand{\headWrapper}[1]{\def\webheadwrapper##1{#1}} \newcommand{\footWrapper}[1]{\def\webfootwrapper##1{#1}} -\newcommand{\ps@webheadings} -{% - \renewcommand{\@oddhead}{\webheadwrapper{% - \normalfont\ifeqforpaper\else\footnotesize\fi - \web@headerprivate\web@headerhook\web@lhead\hfil\web@chead\hfil - \web@rightheader}} - \renewcommand{\@evenhead}{\@oddhead} - \renewcommand{\@oddfoot}{\webfootwrapper{% - \normalfont\ifeqforpaper\else\footnotesize\fi - \web@footerprivate\web@footerhook\web@lfoot\hfil - \web@cfoot\hfil\web@rfoot}} - \renewcommand{\@evenfoot}{\@oddfoot} +\newcommand{\ps@webheadings}{% + \renewcommand{\@oddhead}{\webheadwrapper{% + \normalfont\ifeqforpaper\else\footnotesize\fi + \web@headerprivate\web@headerhook\web@lhead\hfil\web@chead\hfil + \web@rightheader}} + \renewcommand{\@evenhead}{\@oddhead} + \renewcommand{\@oddfoot}{\webfootwrapper{% + \normalfont\ifeqforpaper\else\footnotesize\fi + \web@footerprivate\web@footerhook\web@lfoot\hfil + \web@cfoot\hfil\web@rfoot}} + \renewcommand{\@evenfoot}{\@oddfoot} } % \end{macrocode} % \end{macro} @@ -2719,7 +2666,7 @@ % header % \begin{macrocode} \renewcommand{\sectionmark}[1]{% - \markboth{}{\web@section\ \thesection: #1}} + \markboth{}{\web@section\ \thesection: #1}} % \end{macrocode} % \begin{macro}{\noHeadersOnSectionPage} % \begin{macro}{\headersOnSectionPage} @@ -2739,18 +2686,18 @@ % on the same page as the beginning of a section. % \begin{macrocode} \newcommand{\noHeadersOnSectionPage}{% - \gdef\web@headerpolicy{% - \expandafter\aeb@gettopmark\topmark{}{}% - \expandafter\aeb@getbotmark\botmark{}{}% - \ifx\aeb@topmark\aeb@botmark\rightmark\fi - }% + \gdef\web@headerpolicy{% + \expandafter\aeb@gettopmark\topmark{}{}% + \expandafter\aeb@getbotmark\botmark{}{}% + \ifx\aeb@topmark\aeb@botmark\rightmark\fi + }% } % \end{macrocode} % The default is to show no headers on a page with a section in it. % \begin{macrocode} \noHeadersOnSectionPage \newcommand{\headersOnSectionPage}{% - \gdef\web@headerpolicy{\rightmark}% + \gdef\web@headerpolicy{\rightmark}% } \def\aeb@gettopmark#1#2{\def\aeb@topmark{#2}} \def\aeb@getbotmark#1#2{\def\aeb@botmark{#2}} @@ -2768,10 +2715,10 @@ % \changes{v4.4a}{2012/08/31}{Introduce \string\cs{ifweb@sectioning} switch} % \begin{macrocode} \newcommand{\sectionColor}[1]{\def\web@sectionsColorOld{#1} - \def\aeb@sectioncolor{#1}} + \def\aeb@sectioncolor{#1}} \sectionColor{blue} \def\web@inputsectiondefs{\InputIfFileExists{websec.def}{} - {\PackageError{web}{Cannot find the file websec.def}{}} + {\PackageError{web}{Cannot find the file websec.def}{}} } \ifweb@sectioning\expandafter\web@inputsectiondefs\fi %</package> @@ -2780,26 +2727,26 @@ \renewcommand*\thesubsection{\thesection.\arabic{subsection}} \renewcommand*{\thesubsubsection}{\textbullet} \renewcommand{\section}{\renewcommand{\@seccntformat}[1]{% - \@nameuse{the##1}\web@finalDot\enspace}% - \@startsection{section}{1}{\z@}% - {-3ex\@plus -1ex \@minus-.2ex}% - {1ex\@plus .2ex}% 6pt - {\noindent\normalfont\normalsize\bfseries - \color{\web@sectionsColorOld}}}% + \@nameuse{the##1}\web@finalDot\enspace}% + \@startsection{section}{1}{\z@}% + {-3ex\@plus -1ex \@minus-.2ex}% + {1ex\@plus .2ex}% 6pt + {\noindent\normalfont\normalsize\bfseries + \color{\web@sectionsColorOld}}}% \renewcommand{\subsection}{\renewcommand{\@seccntformat}[1]{% - \@nameuse{the##1}\web@finalDot\enspace}% - \@startsection{subsection}{2}{\z@}% - {-2.5ex\@plus -1ex \@minus -.2ex}% - {1ex\@plus .2ex}% - {\noindent\normalfont\normalsize\bfseries - \color{\web@sectionsColorOld}}} + \@nameuse{the##1}\web@finalDot\enspace}% + \@startsection{subsection}{2}{\z@}% + {-2.5ex\@plus -1ex \@minus -.2ex}% + {1ex\@plus .2ex}% + {\noindent\normalfont\normalsize\bfseries + \color{\web@sectionsColorOld}}} \renewcommand{\subsubsection}{% - \renewcommand{\@seccntformat}[1]{\color{\web@sectionsColorOld}\large - $\bullet$\enspace}% - \@startsection{subsubsection}{3}{\z@}% - {-2ex\@plus -1ex \@minus -.2ex}% - {.5ex\@plus .2ex}% - {\noindent\normalfont\normalsize\bfseries}} + \renewcommand{\@seccntformat}[1]{\color{\web@sectionsColorOld}\large + $\bullet$\enspace}% + \@startsection{subsubsection}{3}{\z@}% + {-2ex\@plus -1ex \@minus -.2ex}% + {.5ex\@plus .2ex}% + {\noindent\normalfont\normalsize\bfseries}} % \end{macrocode} % We define our own \cs{part} command, and reserve it as \cs{@webpart}. % Commands for handing the \cs{part} format. The formatting of @@ -2808,8 +2755,7 @@ \def\tocPartTitle#1{\def\web@tocPartTitle##1{#1}} \tocPartTitle{\thepart\hspace{1em}#1} \newcommand\@webpart{\secdef\web@@part\web@@spart} -\def\web@@part[#1]#2{% - \newpage +\def\web@@part[#1]#2{\newpage \def\@currentlabelname{#1}% \ifnum\Hy@secnum@part>\c@secnumdepth \phantomsection @@ -2826,14 +2772,13 @@ \@afterheading } \def\web@@spart#1{% - \Hy@GlobalStepCount\Hy@linkcounter - \xdef\@currentHref{part*.\the\Hy@linkcounter}% - \Hy@raisedlink{% - \hyper@anchorstart{\@currentHref}\hyper@anchorend - }{\web@makesparthead{#1}}% - \nobreak - \vskip 1ex - \@afterheading + \Hy@GlobalStepCount\Hy@linkcounter + \xdef\@currentHref{part*.\the\Hy@linkcounter}% + \Hy@raisedlink{\hyper@anchorstart{\@currentHref}\hyper@anchorend + }{\web@makesparthead{#1}}% + \nobreak + \vskip 1ex + \@afterheading } \let\web@save@part\part \let\part\@webpart @@ -2846,29 +2791,28 @@ % looks in the document. % \begin{macrocode} \newcommand{\formatPartTitle}[1]{% - \def\web@formatPartTitle##1{#1}} -\def\web@defaultFormatPartTitle#1{% - \large\bfseries - \ifnum \c@secnumdepth >\m@ne - \partname~\thepart:\space - \fi#1} + \def\web@formatPartTitle##1{#1}} +\def\web@defaultFormatPartTitle#1{\large\bfseries + \ifnum \c@secnumdepth >\m@ne + \partname~\thepart:\space + \fi#1} \let\web@formatPartTitle\web@defaultFormatPartTitle \newcommand{\restorePartTitleFormat}{% - \let\web@formatPartTitle\web@defaultFormatPartTitle} + \let\web@formatPartTitle\web@defaultFormatPartTitle} \def\noPartNumbers{\formatPartTitle{\large\bfseries##1}% - \tocPartTitle{##1}} + \tocPartTitle{##1}} \def\web@makeparthead#1{% - \parindent\z@\raggedright - \interlinepenalty \@M - \normalfont - \web@formatPartTitle{#1}% - \markboth{}{}\par + \parindent\z@\raggedright + \interlinepenalty \@M + \normalfont + \web@formatPartTitle{#1}% + \markboth{}{}\par } \def\web@makesparthead#1{% - \parindent\z@\raggedright - \interlinepenalty \@M - \normalfont - \large\bfseries #1\par + \parindent\z@\raggedright + \interlinepenalty \@M + \normalfont + \large\bfseries #1\par } % \end{macrocode} % \end{macro} @@ -2878,94 +2822,91 @@ % Here's the same thing for \cs{chapter}. % \begin{macrocode} \@ifundefined{chapter}{}{% - \newcommand\@webchapter{% - \global\@topnum\z@ - \@afterindentfalse - \secdef\web@@chapter\web@@schapter - } - \let\web@save@chapter\chapter - \let\chapter\@webchapter - \def\web@@chapter[#1]#2{% - \def\@currentlabelname{#1}% - \def\Hy@next{% - \Hy@GlobalStepCount\Hy@linkcounter - \xdef\@currentHref{\Hy@chapapp*.\the\Hy@linkcounter}% - \Hy@raisedlink{% - \hyper@anchorstart{\@currentHref}\hyper@anchorend - }% - }% - \ifnum\c@secnumdepth>\m@ne - \@ifundefined{if@mainmatter}% - \iftrue{\@nameuse{if@mainmatter}}% - \let\Hy@next\relax - \fi - \fi - \Hy@next - \ifnum \c@secnumdepth >\m@ne - \if@mainmatter - \refstepcounter{chapter}% - \typeout{\@chapapp\space\thechapter.}% - \addcontentsline{toc}{chapter}% - {\protect\numberline{\thechapter}#1}% - \else - \addcontentsline{toc}{chapter}{{}{}#1}% - \fi - \else - \addcontentsline{toc}{chapter}{{}{}#1}% - \fi - \chaptermark{#1}% - \addtocontents{lof}{\protect\addvspace{10\p@}}% - \addtocontents{lot}{\protect\addvspace{10\p@}}% - \if@twocolumn - \@topnewpage[\web@makechapterhead{#2}]% - \else - \web@makechapterhead{#2}% - \@afterheading - \fi - } - \def\web@@schapter#1{% - \if@twocolumn - \@topnewpage[\@makeschapterhead{#1}]% - \else - \web@makeschapterhead{#1}% - \@afterheading - \fi - } + \newcommand\@webchapter{% + \global\@topnum\z@ + \@afterindentfalse + \secdef\web@@chapter\web@@schapter + } + \let\web@save@chapter\chapter + \let\chapter\@webchapter + \def\web@@chapter[#1]#2{% + \def\@currentlabelname{#1}% + \def\Hy@next{% + \Hy@GlobalStepCount\Hy@linkcounter + \xdef\@currentHref{\Hy@chapapp*.\the\Hy@linkcounter}% + \Hy@raisedlink{% + \hyper@anchorstart{\@currentHref}\hyper@anchorend + }% + }% + \ifnum\c@secnumdepth>\m@ne + \@ifundefined{if@mainmatter}% + \iftrue{\@nameuse{if@mainmatter}}% + \let\Hy@next\relax + \fi + \fi + \Hy@next + \ifnum \c@secnumdepth >\m@ne + \if@mainmatter + \refstepcounter{chapter}% + \typeout{\@chapapp\space\thechapter.}% + \addcontentsline{toc}{chapter}% + {\protect\numberline{\thechapter}#1}% + \else + \addcontentsline{toc}{chapter}{{}{}#1}% + \fi + \else + \addcontentsline{toc}{chapter}{{}{}#1}% + \fi + \chaptermark{#1}% + \addtocontents{lof}{\protect\addvspace{10\p@}}% + \addtocontents{lot}{\protect\addvspace{10\p@}}% + \if@twocolumn + \@topnewpage[\web@makechapterhead{#2}]% + \else + \web@makechapterhead{#2}% + \@afterheading + \fi + } + \def\web@@schapter#1{% + \if@twocolumn + \@topnewpage[\@makeschapterhead{#1}]% + \else + \web@makeschapterhead{#1}% + \@afterheading + \fi + } % \end{macrocode} % \begin{macro}{\web@makechapterhead} % \begin{macro}{\web@makeschapterhead} % These commands can be redefined to format who the part text % looks in the document. % \begin{macrocode} - \long\def\formatChapterNumber#1{\def\web@formatChapterNumber{#1}} - \formatChapterNumber{\large\bfseries - \@chapapp\space\thechapter\par\nobreak} - \long\def\formatChapterTitle#1{\def\web@formatChapterTitle##1{#1}} - \formatChapterTitle{% - \interlinepenalty\@M - \noindent\hspace{1em}\large\bfseries#1\par\nobreak - } - \def\web@makechapterhead#1{% - \vspace{3\p@}{% - \parindent\z@ \raggedright \normalfont - \ifnum \c@secnumdepth >\m@ne - \if@mainmatter - \web@formatChapterNumber - \fi - \fi - \web@formatChapterTitle{#1}% - \vskip 12\p@ - }% - } - \def\web@makeschapterhead#1{% - \vspace{3\p@}{% - \parindent\z@\raggedright - \normalfont - \interlinepenalty\@M - \large\bfseries #1\par\nobreak - \vskip 12\p@ - }% - } + \long\def\formatChapterNumber#1{\def\web@formatChapterNumber{#1}} + \formatChapterNumber{\large\bfseries + \@chapapp\space\thechapter\par\nobreak} + \long\def\formatChapterTitle#1{\def\web@formatChapterTitle##1{#1}} + \formatChapterTitle{% + \interlinepenalty\@M + \noindent\hspace{1em}\large\bfseries#1\par\nobreak + } + \def\web@makechapterhead#1{% + \vspace{3\p@}{% + \parindent\z@ \raggedright \normalfont + \ifnum \c@secnumdepth >\m@ne + \if@mainmatter\web@formatChapterNumber\fi + \fi + \web@formatChapterTitle{#1}\vskip 12\p@ + }% + } + \def\web@makeschapterhead#1{% + \vspace{3\p@}{% + \parindent\z@\raggedright + \normalfont + \interlinepenalty\@M + \large\bfseries #1\par\nobreak + \vskip 12\p@ + }% + } % \end{macrocode} % \end{macro} % \end{macro} @@ -2976,16 +2917,14 @@ % \end{macrocode} % \begin{macrocode} \def\aebwritelastpage{% - \immediate\write\@auxout{% -% \string\expandafter\string\gdef -% \string\csname\space aebLastPage\string\endcsname{\arabic{page}}}% - \string\w@csarg\string\gdef{aebLastPage}{\arabic{page}}}% + \immediate\write\@auxout{% + \string\w@csarg\string\gdef{aebLastPage}{\arabic{page}}}% } % \end{macrocode} % \begin{macrocode} \AtEndDocument{% - \clearpage\addtocounter{page}{-1}\aebwritelastpage - \addtocounter{page}{1}} + \clearpage\addtocounter{page}{-1}\aebwritelastpage + \addtocounter{page}{1}} % \end{macrocode} % \subsection{\texorpdfstring{\protect\cs{useFullWidthForPaper}}{\CMD{useFullWidthForPaper}}} % @@ -3011,12 +2950,12 @@ \def\useFullWidthForPaper{\ifeqforpaper \setlength{\textwidth}{\paperwidth-2in} \setlength{\textheight} - {\paperheight-2in-\footskip-\topmargin-\headheight-\headsep} + {\paperheight-2in-\footskip-\topmargin-\headheight-\headsep} \oddsidemargin=0pt \evensidemargin=0pt \marginparsep=0pt \marginparwidth=0pt - \fi + \fi } % \end{macrocode} % \end{macro} @@ -3025,23 +2964,24 @@ % option is used, and the \texttt{templatesforpaper} option is not taken. % \begin{macrocode} \def\maxtextscreentext{% - \iftemplatesforpaper\else\ifeqforpaper - \ifnum\@usetemplates=1 - \ifnum\@panelconfig=1 % left panel - \setlength{\oddsidemargin}% - {\@panelwidth+\@panelsep-1in}% - \setlength{\textwidth}% - {\paperwidth-\@panelwidth-\@panelsep-% - \marginparwidth-\marginparsep}% - \else\ifnum\@panelconfig=2 % right panel - \setlength{\oddsidemargin}{0in}% - \setlength{\textwidth}% - {\paperwidth-\@panelwidth-\@panelsep-% - \oddsidemargin-\marginparwidth-\marginparsep}% - \else - \useFullWidthForPaper - \fi\fi\fi - \fi\fi + \iftemplatesforpaper\else\ifeqforpaper + \ifnum\@usetemplates=\@ne + \ifnum\@panelconfig=\@ne % left panel + \setlength{\oddsidemargin}% + {\@panelwidth+\@panelsep-1in}% + \setlength{\textwidth}% + {\paperwidth-\@panelwidth-\@panelsep-% + \marginparwidth-\marginparsep}% + \else + \ifnum\@panelconfig=\tw@ % right panel + \setlength{\oddsidemargin}{0in}% + \setlength{\textwidth}% + {\paperwidth-\@panelwidth-\@panelsep-% + \oddsidemargin-\marginparwidth-\marginparsep}% + \else + \useFullWidthForPaper + \fi\fi\fi + \fi\fi } % \end{macrocode} % @@ -3053,11 +2993,11 @@ % \changes{v4.4}{2012/08/26}{Added the command \string\cs{centertextonpage}} % \begin{macrocode} \newcommand{\centertextonpage}{% - \ifeqforpaper\AtBeginDocument{\web@centertextonpage}\fi} + \ifeqforpaper\AtBeginDocument{\web@centertextonpage}\fi} \def\web@centertextonpage{% - \setlength{\oddsidemargin}{\paperwidth-\textwidth-2in}% - \oddsidemargin=.5\oddsidemargin - \evensidemargin=\oddsidemargin + \setlength{\oddsidemargin}{\paperwidth-\textwidth-2in}% + \oddsidemargin=.5\oddsidemargin + \evensidemargin=\oddsidemargin } % \end{macrocode} % \end{macro} @@ -3098,13 +3038,15 @@ % If the user asks for the \texttt{latextoc} option, but wants bullets, we % adjust things so the bullets look good. % \begin{macrocode} -\ifx\web@latextoc\web@YES\ifx\web@bullets\web@YES% +\ifx\web@latextoc\web@YES + \ifx\web@bullets\web@YES \@ifundefined{chapter} {% - \renewcommand*\l@subsubsection{\@dottedtocline{3}{3.8em}{1.2em}} + \renewcommand*\l@subsubsection{\@dottedtocline{3}{3.8em}{1.2em}} }{% - \renewcommand*\l@subsubsection{\@dottedtocline{3}{7.0em}{1.2em}} + \renewcommand*\l@subsubsection{\@dottedtocline{3}{7.0em}{1.2em}} }% -\fi\fi + \fi +\fi % \end{macrocode} % \begin{macrocode} \def\tocColor#1{\def\web@tocColor{#1}\def\aeb@toccolor{#1}} @@ -3122,59 +3064,58 @@ \def\web@Tocpagestyle#1{#1} \let\web@latextoc@save\tableofcontents \ifx\web@bullets\web@YES -\def\tableofcontents -{% - \global\let\insertwebtoc\insert@webtoc + \def\tableofcontents{\global + \let\insertwebtoc\insert@webtoc \def\contentsname{\web@toc}% \pdfbookmark[1]{\web@toc}{toc}% - \web@Tocpagestyle{\thispagestyle{empty}}% - \markright{{\normalfont\small \web@toc\ (\web@continued)}}% - \@ifundefined{sectionToc}{% - \begin{center}\hypertarget{webtoc}{}% - \normalfont\bfseries\Large\color{\web@tocColor}% - \contentsname - \end{center} - }{\sectionToc{\web@toc}}\par + \web@Tocpagestyle{\thispagestyle{empty}}% + \markright{{\normalfont\small \web@toc\ (\web@continued)}}% + \@ifundefined{sectionToc}{% + \begin{center}\hypertarget{webtoc}{}% + \normalfont\bfseries\Large\color{\web@tocColor}% + \contentsname + \end{center} + }{\sectionToc{\web@toc}}\par \ifx\web@latextoc\web@YES - \@starttoc{toc}% LaTeX toc listing with page numbers + \@starttoc{toc}% LaTeX toc listing with page numbers \else - \noindent\webtableofcontents + \noindent\webtableofcontents \fi \newpage -} + } \else - \PackageInfo{web}{No Bullets Requested} - \def\tableofcontents{% - \begingroup - \def\contentsname{\web@toc}% - \let\web@save@mkboth\@mkboth - \def\@mkboth{\protect\hypertarget{webtoc}{}\web@save@mkboth}% - \ifx\web@finalDot\@empty\else - \def\numberline##1{\hb@xt@\@tempdima{##1.\hfil}}\fi - \web@latextoc@save - \endgroup\newpage - } - \renewcommand\subsubsection{\renewcommand{\@seccntformat}[1]{% - \@nameuse{the##1}\web@finalDot\enspace} - \@startsection{subsubsection}{3}{\z@}% - {-2ex\@plus -1ex \@minus -.2ex}{.5ex \@plus .2ex}% - {\noindent\normalfont\normalsize\bfseries}} - \renewcommand*{\thesubsubsection} - {\thesubsection.\arabic{subsubsection}} + \PackageInfo{web}{No Bullets Requested} + \def\tableofcontents{% + \begingroup + \def\contentsname{\web@toc}% + \let\web@save@mkboth\@mkboth + \def\@mkboth{\protect\hypertarget{webtoc}{}\web@save@mkboth}% + \ifx\web@finalDot\@empty\else + \def\numberline##1{\hb@xt@\@tempdima{##1.\hfil}}\fi + \web@latextoc@save + \endgroup + \newpage + } + \renewcommand\subsubsection{\renewcommand{\@seccntformat}[1]{% + \@nameuse{the##1}\web@finalDot\enspace} + \@startsection{subsubsection}{3}{\z@}% + {-2ex\@plus -1ex \@minus -.2ex}{.5ex \@plus .2ex}% + {\noindent\normalfont\normalsize\bfseries}} + \renewcommand*{\thesubsubsection} + {\thesubsection.\arabic{subsubsection}} \fi % \end{macrocode} % \DescribeMacro{\widestNumber}\DescribeMacro{\tocIndent} % \DescribeMacro{\tocIndentByNumber} These are used for % setting the amount of indentation for the \cs{webtableofcontents} % \begin{macrocode} -\def\widestNumber#1{% - \def\widest@Number{#1\ }} +\def\widestNumber#1{\def\widest@Number{#1\ }} \widestNumber{0.0.} \newcommand{\tocIndent}[1]{\def\toc@indent{#1}} \tocIndent{20pt} \def\tocIndentByNumber#1{{% - \settowidth{\@tempdima}{\normalfont\textbf{#1\ }}% - \xdef\toc@indent{\the\@tempdima}% + \settowidth{\@tempdima}{\normalfont\textbf{#1\ }}% + \xdef\toc@indent{\the\@tempdima}% }} \tocIndentByNumber{00.} % \end{macrocode} @@ -3186,21 +3127,20 @@ % \DescribeMacro{\webtableofcontents} is the table of contents for % the \texttt{web} package. % \begin{macrocode} -\def\webtableofcontents -{% - \begingroup +\def\webtableofcontents{% + \begingroup % \end{macrocode} % Sample line from .aux %\begin{verbatim} -% \contentsline {section}{\numberline {1}Introduction}{4}{section.1} -% \contentsline {section}{\numberline {}References}{56}{section*.1} +% \contentsline {section}{\numberline {1}Introduction}{4}{section.1} +% \contentsline {section}{\numberline {}References}{56}{section*.1} % #1 #2 #3 %\end{verbatim} % \begin{macrocode} \global\let\isChapter\web@NO \parskip0pt\parindent\toc@indent\relax \settowidth{\@tempdima}{\normalfont - \textbf{\widest@Number}}% + \textbf{\widest@Number}}% \@tempdimb\@tempdima \advance\@tempdimb by\parindent \edef\web@subsubSecIndent{\the\@tempdimb}% @@ -3208,19 +3148,20 @@ \let\numberline\web@numberline \let\contentsline\web@contentsline \def\web@section##1##2##3{\web@parse##1\\% - \web@toc@section{##1}{##2}{##3}}% + \web@toc@section{##1}{##2}{##3}}% \def\web@subsection##1##2##3{\web@parse##1\\% - \web@toc@subsection{##1}{##2}{##3}}% + \web@toc@subsection{##1}{##2}{##3}}% \def\web@subsubsection##1##2##3{\web@parse##1\\% - \web@toc@subsubsection{##1}{##2}{##3}}% + \web@toc@subsubsection{##1}{##2}{##3}}% \def\web@part##1##2##3{\web@toc@part{##1}{##2}{##3}}% \def\web@chapter##1##2##3{\web@parse##1\\% - \web@toc@chapter{##1}{##2}{##3}}% + \web@toc@chapter{##1}{##2}{##3}}% \@starttoc{toc}% \setlength{\@tempdimb}{\ifx\isChapter\web@YES - \parindent+\web@subsubSecIndent\else\web@subsubSecIndent\fi}% + \parindent+\web@subsubSecIndent\else\web@subsubSecIndent\fi}% \leftskip\@tempdimb - \par\endgroup + \par + \endgroup } % \end{macrocode} % \begin{macro}{\web@toc@part} @@ -3234,85 +3175,72 @@ % \begin{macrocode} \def\web@numberline#1{\makebox[0pt]{#1\enspace}}% \def\web@contentsline#1#2#3#4{% - \@nameuse{web@#1}{#2}{#3}{#4}}% + \@nameuse{web@#1}{#2}{#3}{#4}}% \def\web@parse#1#2#3\\{% - \def\web@title{#3}\def\numberline{#2}}% + \def\web@title{#3}\def\numberline{#2}}% \def\web@toc@part#1#2#3{\par\noindent - {\bfseries\hyperlink{#3}{#1}}\par\smallskip} + {\bfseries\hyperlink{#3}{#1}}\par\smallskip} \def\web@toc@chapter#1#2#3{\global\let\isChapter\web@YES - \par\mbox{}{\bfseries - \ifx\numberline\@empty - \@ifundefined{d@DingToc}{\hyperlink{#3}{\web@title}} - {% - \ifx\d@DingToc\@empty - \hyperlink{#3}{\web@title}% - \else - \if\aeb@use@section@numbers0\relax - \makebox[0pt][r]{\color{\d@DingTocColor}% - \d@DingToc\space}\hyperlink{#3}{\web@title}% - \else - \hyperlink{#3}{\web@title}% - \fi - \fi - }% + \par\mbox{}{\bfseries + \ifx\numberline\@empty + \@ifundefined{d@DingToc}{\hyperlink{#3}{\web@title}}{% + \ifx\d@DingToc\@empty + \hyperlink{#3}{\web@title}% \else - \makebox[0pt][r]{\hyperlink{#3}{% - \numberline\web@finalDot}\space}\web@title - \fi}\par\smallskip + \if\aeb@use@section@numbers\web@Zero + \makebox[0pt][r]{\color{\d@DingTocColor}% + \d@DingToc\space}\hyperlink{#3}{\web@title}\else + \hyperlink{#3}{\web@title}\fi + \fi + }% + \else + \makebox[0pt][r]{\hyperlink{#3}{% + \numberline\web@finalDot}\space}\web@title + \fi}\par\smallskip } -%\def\web@toc@chapter#1#2#3{\global\let\isChapter\web@YES -% \par\mbox{}{\bfseries\makebox[0pt][r]{\hyperlink{#3}% -% {\numberline\web@finalDot}\space}\web@title}\par\smallskip -%} \def\web@toc@section#1#2#3{\penalty-500\par - \hspace*{\if\isChapter y\parindent\else0pt\fi}\mbox{}{\bfseries - \ifx\numberline\@empty - \@ifundefined{d@DingToc}{\hyperlink{#3}{\web@title}} - {% - \ifx\d@DingToc\@empty - \hyperlink{#3}{\web@title}% - \else - \if\aeb@use@section@numbers0\relax - \makebox[0pt][r]{\color{\d@DingTocColor}% - \d@DingToc\space}\hyperlink{#3}{\web@title}% - \else - \hyperlink{#3}{\web@title}% - \fi - \fi - }% - \else - \makebox[0pt][r]{\hyperlink{#3}{% - \numberline\web@finalDot}\space}\web@title - \fi}\endgraf + \hspace*{\if\isChapter y\parindent\else0pt\fi}\mbox{}{\bfseries + \ifx\numberline\@empty + \@ifundefined{d@DingToc}{\hyperlink{#3}{\web@title}}{% + \ifx\d@DingToc\@empty + \hyperlink{#3}{\web@title}% + \else + \if\aeb@use@section@numbers\web@Zero + \makebox[0pt][r]{\color{\d@DingTocColor}% + \d@DingToc\space}\hyperlink{#3}{\web@title}\else + \hyperlink{#3}{\web@title}\fi + \fi + }% + \else + \makebox[0pt][r]{\hyperlink{#3}{% + \numberline\web@finalDot}\space}\web@title + \fi}\endgraf }% \def\web@toc@subsection#1#2#3{\par - \setlength{\@tempdimb}{\ifx\isChapter\web@YES - \parindent+\@tempdima\else\@tempdima\fi}% - \penalty-50 \hspace*{\@tempdimb}\mbox{}{\bfseries - \ifx\numberline\@empty - \@ifundefined{dd@DingToc}{\hyperlink{#3}{\web@title}} - {% - \ifx\dd@DingToc\@empty - \hyperlink{#3}{\web@title}% - \else - \makebox[0pt][r]{\color{\dd@DingTocColor}% - \dd@DingToc\space}\hyperlink{#3}{\web@title}% - \fi - }% - \else - \makebox[0pt][r]{\makebox[\@tempdima][l]% - {\hyperlink{#3}{\numberline\web@finalDot}}}\web@title - \fi}\endgraf -}% + \setlength{\@tempdimb}{\ifx\isChapter\web@YES + \parindent+\@tempdima\else\@tempdima\fi}% + \penalty-50 \hspace*{\@tempdimb}\mbox{}{\bfseries + \ifx\numberline\@empty + \@ifundefined{dd@DingToc}{\hyperlink{#3}{\web@title}}{% + \ifx\dd@DingToc\@empty + \hyperlink{#3}{\web@title}\else + \makebox[0pt][r]{\color{\dd@DingTocColor}% + \dd@DingToc\space}\hyperlink{#3}{\web@title}\fi + }% + \else + \makebox[0pt][r]{\makebox[\@tempdima][l]% + {\hyperlink{#3}{\numberline\web@finalDot}}}\web@title + \fi}\endgraf +} \def\web@toc@subsubsection#1#2#3{% - \def\numberline{\strut$\bullet$}% - \setlength{\@tempdimb}{\ifx\isChapter\web@YES - \parindent+\web@subsubSecIndent\else\web@subsubSecIndent\fi}% - \leftskip\@tempdimb\noindent\unskip\mbox{}\penalty-50 - \@ifundefined{ddd@DingToc}{}{% - \if\aeb@use@section@numbers0\relax\ifx\ddd@DingToc\@empty\else + \def\numberline{\strut$\bullet$}% + \setlength{\@tempdimb}{\ifx\isChapter\web@YES + \parindent+\web@subsubSecIndent\else\web@subsubSecIndent\fi}% + \leftskip\@tempdimb\noindent\unskip\mbox{}\penalty-50 + \@ifundefined{ddd@DingToc}{}{% + \if\aeb@use@section@numbers\web@Zero\ifx\ddd@DingToc\@empty\else \def\numberline{\color{\ddd@DingTocColor}\strut\ddd@DingToc}% -\fi\fi}\hyperlink{#3}{\numberline}~\web@title\ + \fi\fi}\hyperlink{#3}{\numberline}~\web@title\ }% % \end{macrocode} % \end{macro} @@ -3362,14 +3290,12 @@ % background. The command \cs{template} defines \cs{web@template}, which is a text macro % that actually holds the name of the current graphic. % \begin{macrocode} -\newcommand{\template}[2][] -{% - \ifweb@allowtemplates - \def\web@argi{#1}\ifx\web@argi\@empty - \xdef\web@template@opt@args{\web@addtotemplateArgs}% - \else\xdef\web@template@opt@args{\web@addtotemplateArgs,#1}% - \fi\gdef\web@template{#2}% - \fi +\newcommand{\template}[2][]{% + \ifweb@allowtemplates + \def\web@argi{#1}\ifx\web@argi\@empty + \xdef\web@template@opt@args{\web@addtotemplateArgs}\else + \xdef\web@template@opt@args{\web@addtotemplateArgs,#1}\fi + \gdef\web@template{#2}\fi } % \end{macrocode} % The text macro \cs{web@template} holds the name of the current graphic. It starts off as @@ -3408,36 +3334,34 @@ % background. % \begin{macrocode} \let\listAddToTemplates\@empty -\newcommand{\AddToTemplate}[1] -{% - \global\w@csarg\let{eqTmpl#1}\web@YES - {\toks@=\expandafter{\listAddToTemplates}% - \xdef\listAddToTemplates{\the\toks@\noexpand\\{#1}}}% - \ifweb@allowtemplates - \@AddToTextTemplate{% +\newcommand{\AddToTemplate}[1]{% + \global\w@csarg\let{eqTmpl#1}\web@YES + {\toks@=\expandafter{\listAddToTemplates}% + \xdef\listAddToTemplates{\the\toks@\noexpand\\{#1}}}% + \ifweb@allowtemplates + \@AddToTextTemplate{% + \w@csarg\ifx{eqTmpl#1}\web@YES + \fboxsep=0pt\setlength{\unitlength}{1pt}% + \put(\@textX,0){\@nameuse{#1}}% + \fi + }% + \else + \w@csarg\ifx{#1}\BGColorAndGraphic + \@AddToTextTemplate{% \w@csarg\ifx{eqTmpl#1}\web@YES - \fboxsep=0pt\setlength{\unitlength}{1pt}% - \put(\@textX,0){\@nameuse{#1}}% - \fi - }% - \else - \w@csarg\ifx{#1}\BGColorAndGraphic - \@AddToTextTemplate{% - \w@csarg\ifx{eqTmpl#1}\web@YES - \fboxsep=0pt\setlength{\unitlength}{1pt}% - \put(\@textX,0){\@nameuse{#1}}% - \fi - }% - \fi - \w@csarg\ifx{#1}\BGColorAndGraphicFullWidth - \@AddToTextTemplate{% - \w@csarg\ifx{eqTmpl#1}\web@YES - \fboxsep=0pt\setlength{\unitlength}{1pt}% - \put(\@textX,0){\@nameuse{#1}}% - \fi - }% + \fboxsep=0pt\setlength{\unitlength}{1pt}% + \put(\@textX,0){\@nameuse{#1}}% \fi + }% \fi + \w@csarg\ifx{#1}\BGColorAndGraphicFullWidth + \@AddToTextTemplate{% + \w@csarg\ifx{eqTmpl#1}\web@YES + \fboxsep=0pt\setlength{\unitlength}{1pt}% + \put(\@textX,0){\@nameuse{#1}}\fi + }% + \fi + \fi } % \end{macrocode} % \end{macro} @@ -3454,15 +3378,15 @@ % passing the empty argument (\verb~{}~) yields the default for \cs{xBld}. % \begin{macrocode} \newcommand\placeTemplateInLayer[2][webTextBG]{% - \@ifpackageloaded{aeb_pro} - {\@ifundefined{xBld}{\PackageWarning{web} - {The uselayers option - of aeb_pro is\MessageBreak required with - \string\placeTemplateInLayer}} - {\def\b@webTextLayer{\xBld[#2]{#1}}% - \def\e@webTextLayer{\eBld}}}% - {\PackageWarning{web}{\string\placeTemplateInLayer\space - requires the\MessageBreak aeb_pro package}}% + \@ifpackageloaded{aeb_pro} + {\@ifundefined{xBld}{\PackageWarning{web} + {The uselayers option + of aeb_pro is\MessageBreak required with + \string\placeTemplateInLayer}} + {\def\b@webTextLayer{\xBld[#2]{#1}}% + \def\e@webTextLayer{\eBld}}}% + {\PackageWarning{web}{\string\placeTemplateInLayer\space + requires the\MessageBreak aeb_pro package}}% } \let\b@webTextLayer\@empty \let\e@webTextLayer\@empty \newcommand{\BGColorAndGraphic}{% @@ -3471,20 +3395,20 @@ % up the first argument of the \cs{colorbox}, which is the color. This is what \cs{gobblembox} % does, it gobbles up the next token, and inserts a \cs{mbox}. % \begin{macrocode} - \b@webTextLayer\web@colorbox@w@transparency{\web@textBgColor}% + \b@webTextLayer\web@colorbox@w@transparency{\web@textBgColor}% + {% + \parbox[b][\paperheight]{\textscreenwidth}% {% - \parbox[b][\paperheight]{\textscreenwidth}% - {% - \ifx\web@template\@empty - \hfill\vfill - \else - \hfuzz=1pt\vfuzz=1pt\expandafter - \includegraphics\expandafter[\web@template@opt@args,% - width=\textscreenwidth,height=\paperheight]% - {\web@template} - \fi - }% - }\e@webTextLayer + \ifx\web@template\@empty + \hfill\vfill + \else + \hfuzz=1pt\vfuzz=1pt\expandafter + \includegraphics\expandafter[\web@template@opt@args,% + width=\textscreenwidth,height=\paperheight]% + {\web@template} + \fi + }% + }\e@webTextLayer } % \end{macrocode} % \end{macro} @@ -3509,33 +3433,32 @@ % background. % \begin{macrocode} \let\listAddToPanelTemplates=\@empty -\newcommand{\AddToPanelTemplate}[1] -{% - \global\w@csarg\let{eqPanTmpl#1}\web@YES - {\toks@=\expandafter{\listAddToPanelTemplates}% - \xdef\listAddToPanelTemplates{\the\toks@\noexpand\\{#1}}}% - \ifweb@allowtemplates +\newcommand{\AddToPanelTemplate}[1]{% + \global\w@csarg\let{eqPanTmpl#1}\web@YES + {\toks@=\expandafter{\listAddToPanelTemplates}% + \xdef\listAddToPanelTemplates{\the\toks@\noexpand\\{#1}}}% + \ifweb@allowtemplates \@AddToPanelTemplate{% \w@csarg\ifx{eqPanTmpl#1}\web@YES \fboxsep=0pt\setlength{\unitlength}{1pt}% \put(\@panelX,0){\@nameuse{#1}}\fi }% - \else - \w@csarg\ifx{#1}\stdPanelBG - \@AddToPanelTemplate{% - \w@csarg\ifx{eqPanTmpl#1}\web@YES - \fboxsep=0pt\setlength{\unitlength}{1pt}% - \put(\@panelX,0){\@nameuse{#1}}\fi - }% - \fi - \w@csarg\ifx{#1}\stdbldpanel - \@AddToPanelTemplate{% - \w@csarg\ifx{eqPanTmpl#1}\web@YES - \fboxsep=0pt\setlength{\unitlength}{1pt}% - \put(\@panelX,0){\@nameuse{#1}}\fi - }% - \fi + \else + \w@csarg\ifx{#1}\stdPanelBG + \@AddToPanelTemplate{% + \w@csarg\ifx{eqPanTmpl#1}\web@YES + \fboxsep=0pt\setlength{\unitlength}{1pt}% + \put(\@panelX,0){\@nameuse{#1}}\fi + }% + \fi + \w@csarg\ifx{#1}\stdbldpanel + \@AddToPanelTemplate{% + \w@csarg\ifx{eqPanTmpl#1}\web@YES + \fboxsep=0pt\setlength{\unitlength}{1pt}% + \put(\@panelX,0){\@nameuse{#1}}\fi + }% \fi + \fi } % \end{macrocode} % \end{macro} @@ -3545,17 +3468,15 @@ % case, we use \texttt{natwidth} and \texttt{natheight} as the width and height parameters % in \cs{includegraphics}. % \begin{macrocode} -\newcommand{\paneltemplate}[2][] -{% - \ifweb@allowtemplates\def\web@argi{#1}% - \ifx\web@argi\@empty - \edef\web@paneltemplate@opt@args{% - \web@addtopaneltemplateArgs}% - \else - \edef\web@paneltemplate@opt@args{% - \web@addtopaneltemplateArgs,#1}% - \fi\gdef\web@paneltemplate{#2}% - \fi +\newcommand{\paneltemplate}[2][]{% + \ifweb@allowtemplates\def\web@argi{#1}% + \ifx\web@argi\@empty + \edef\web@paneltemplate@opt@args + {\web@addtopaneltemplateArgs}\else + \edef\web@paneltemplate@opt@args + {\web@addtopaneltemplateArgs,#1}\fi + \gdef\web@paneltemplate{#2}% + \fi } % \end{macrocode} % \end{macro} @@ -3570,7 +3491,7 @@ % \begin{macrocode} \def\addtopaneltemplateArgs#1{\gdef\web@addtopaneltemplateArgs{#1}} \def\clearpaneltemplateArgs{% - \global\let\web@addtopaneltemplateArgs=\@empty} + \global\let\web@addtopaneltemplateArgs=\@empty} \let\web@addtopaneltemplateArgs=\@empty \let\panel@scaletype\@empty % \end{macrocode} @@ -3581,9 +3502,8 @@ % Use this command to override the default. % \begin{macrocode} \newcommand\panelsep[1]{\bgroup - \setlength\@tempdima{#1}% - \xdef\@panelsep{\the\@tempdima}\egroup} -%\def\@panelsep{10bp} + \setlength\@tempdima{#1}% + \xdef\@panelsep{\the\@tempdima}\egroup} \panelsep{10bp} \def\panelSep{\@panelsep} % \end{macrocode} @@ -3595,44 +3515,44 @@ % |\panelwidth{1in}| % \begin{macrocode} \newcommand{\panelwidth}[1]{% - \let\web@next\relax - \iftemplatesforpaper\else\ifnum\@panelconfig>0 + \let\web@next\relax + \iftemplatesforpaper\else\ifnum\@panelconfig>\z@ % \end{macrocode} % (2013/09/13) This command only has effect if there is a panel option and if the \cs{templates\-for\-paper} % option is not in effect. % \begin{macrocode} - \ifnum\@panelconfig=1 % left panel + \ifnum\@panelconfig=\@ne % left panel % \end{macrocode} % (2013/09/13) One of the problems that I've just overcome it with the \cs{panelwidth} command. % there was always problems about changing the widths of the panel. The solutions is to % reverse the current effects of the last \cs{InitLayout} before calling \cs{InitLayout} % with the new panel width. Seems to work. We do this for the left panel and the right panel. % \begin{macrocode} - \ifx\web@layout\web@YES - \addtolength{\textwidth}{\@panelwidth}% - \addtolength{\textwidth}{\@Rightmargin}% - \fi - \addtolength{\textwidth}{\@panelsep}% - \addtolength{\oddsidemargin}{-\@panelsep}% - \addtolength{\evensidemargin}{-\@panelsep}% - \addtolength{\textscreenwidth}{\@panelwidth}% - \fi - \ifnum\@panelconfig=2 % panel right - \ifx\web@layout\web@YES - \addtolength{\textwidth}{\@panelwidth}% - \addtolength{\textwidth}{\@Leftmargin}% - \fi - \addtolength{\textwidth}{\@panelsep}% - \addtolength{\textscreenwidth}{\@panelwidth}% - \fi + \ifx\web@layout\web@YES + \addtolength{\textwidth}{\@panelwidth}% + \addtolength{\textwidth}{\@Rightmargin}% + \fi + \addtolength{\textwidth}{\@panelsep}% + \addtolength{\oddsidemargin}{-\@panelsep}% + \addtolength{\evensidemargin}{-\@panelsep}% + \addtolength{\textscreenwidth}{\@panelwidth}% + \fi + \ifnum\@panelconfig=\tw@ % panel right + \ifx\web@layout\web@YES + \addtolength{\textwidth}{\@panelwidth}% + \addtolength{\textwidth}{\@Leftmargin}% + \fi + \addtolength{\textwidth}{\@panelsep}% + \addtolength{\textscreenwidth}{\@panelwidth}% + \fi % \end{macrocode} % Now record the new panel width and call \cs{InitLayout} % \begin{macrocode} - \setlength{\@panelwidth}{#1}% - \ifdim\@panelwidth<\web@minpanelwidth - \setlength{\@panelwidth}{\web@minpanelwidth}\fi - \def\web@next{\InitLayout}% - \fi\fi\web@next + \setlength{\@panelwidth}{#1}% + \ifdim\@panelwidth<\web@minpanelwidth + \setlength{\@panelwidth}{\web@minpanelwidth}\fi + \def\web@next{\InitLayout}% + \fi\fi\web@next } % \end{macrocode} % \end{macro} @@ -3647,26 +3567,25 @@ % need for a background color. % \begin{macrocode} \newcommand\placePanelTemplateInLayer[2][webPanelBG]{% - \@ifpackageloaded{aeb_pro} - {\@ifundefined{xBld}{\PackageWarning{web} - {The uselayers option - of aeb_pro is\MessageBreak required with - \string\placePanelTemplateInLayer}} - {\def\b@webPanelLayer{\xBld[#2]{#1}}% - \def\e@webPanelLayer{\eBld}}}% - {\PackageWarning{web}{\string\placePanelTemplateInLayer\space - requires the\MessageBreak aeb_pro package}}% + \@ifpackageloaded{aeb_pro} + {\@ifundefined{xBld}{\PackageWarning{web} + {The uselayers option + of aeb_pro is\MessageBreak required with + \string\placePanelTemplateInLayer}} + {\def\b@webPanelLayer{\xBld[#2]{#1}}% + \def\e@webPanelLayer{\eBld}}}% + {\PackageWarning{web}{\string\placePanelTemplateInLayer\space + requires the\MessageBreak aeb_pro package}}% } \let\b@webPanelLayer\@empty \let\e@webPanelLayer\@empty -\newcommand\stdPanelBG -{% - \b@webPanelLayer\web@colorbox@w@transparency{\web@panelBgColor}% - {\parbox[b][\paperheight]{\@panelwidth}% - {\ifx\web@paneltemplate\@empty\hfill\vfill\else - \hfuzz=1pt\vfuzz=1pt\expandafter - \includegraphics\expandafter[\web@paneltemplate@opt@args,% - width=\@panelwidth,height=\paperheight]% - {\web@paneltemplate}\fi}}\e@webPanelLayer +\newcommand\stdPanelBG{% + \b@webPanelLayer\web@colorbox@w@transparency{\web@panelBgColor}% + {\parbox[b][\paperheight]{\@panelwidth}% + {\ifx\web@paneltemplate\@empty\hfill\vfill\else + \hfuzz=1pt\vfuzz=1pt\expandafter + \includegraphics\expandafter[\web@paneltemplate@opt@args,% + width=\@panelwidth,height=\paperheight]% + {\web@paneltemplate}\fi}}\e@webPanelLayer } % \end{macrocode} % Enter \cs{stdPanelBG} into the panel template stack. Any @@ -3683,19 +3602,16 @@ % The \cs{stdbldpanel} is the macro that actually builds the objects on top of the % background. % \begin{macrocode} -\newcommand{\buildpanel}[1] -{% - \gdef\stdbldpanel - {% - \parbox[b][\paperheight]{\@panelwidth}% - {% - \normalsfcodes\normalfont\normalsize - \spaceskip=0pt\xspaceskip=0pt - \par\medskip\vfil - \centering#1% - \par\medskip\vfil - }% +\newcommand{\buildpanel}[1]{% + \gdef\stdbldpanel{% + \parbox[b][\paperheight]{\@panelwidth}{% + \normalsfcodes\normalfont\normalsize + \spaceskip=0pt\xspaceskip=0pt + \par\medskip\vfil + \centering#1% + \par\medskip\vfil }% + }% } % \end{macrocode} % \end{macro} @@ -3711,13 +3627,13 @@ % top (for logo); middle (for other content); bottom (for navigation panel) % \begin{macrocode} \newcommand{\useStandardPanel}{% - \buildpanel{% - \web@panel@top - \par\vspace{\stretch{1}}% - \web@panel@middle - \par\vspace{\stretch{1}}% - \web@panel@bottom - }% + \buildpanel{% + \web@panel@top + \par\vspace{\stretch{1}}% + \web@panel@middle + \par\vspace{\stretch{1}}% + \web@panel@bottom + }% } \newcommand{\panelTop}[1]{\def\web@panel@top{#1}} \panelTop{} @@ -3730,20 +3646,18 @@ % \begin{macro}{\ClearTextTemplate} % Clear the text template % \begin{macrocode} -\newcommand{\ClearTextTemplate} -{% - \global\let\web@textBgColor\@empty - \global\let\web@template\@empty +\newcommand{\ClearTextTemplate}{% + \global\let\web@textBgColor\@empty + \global\let\web@template\@empty } % \end{macrocode} % \end{macro} % \begin{macro}{\ClearPanelTemplate} % Clear the panel template % \begin{macrocode} -\newcommand{\ClearPanelTemplate} -{% - \global\let\web@panelBgColor\@empty - \global\let\web@paneltemplate\@empty +\newcommand{\ClearPanelTemplate}{% + \global\let\web@panelBgColor\@empty + \global\let\web@paneltemplate\@empty } % \end{macrocode} % \end{macro} @@ -3751,25 +3665,24 @@ % Clear the panel template % \begin{macrocode} \newcommand{\ClearBuildPanel} - {\global\let\stdbldpanel\@empty} + {\global\let\stdbldpanel\@empty} % \end{macrocode} % \end{macro} % \begin{macro}{\ClearAllTemplates} % Clear both text and panel templates % \begin{macrocode} -\newcommand{\ClearAllTemplates} -{% - \ClearTextTemplate - \ClearPanelTemplate +\newcommand{\ClearAllTemplates}{% + \ClearTextTemplate + \ClearPanelTemplate } % \end{macrocode} % \end{macro} % \begin{macrocode} \newcommand{\ClearTextTemplateBuffer} - {\global\let\web@textTemplate\@empty} + {\global\let\web@textTemplate\@empty} \newcommand{\ClearPanelTemplateBuffer} - {\global\let\web@panelTemplate\@empty} + {\global\let\web@panelTemplate\@empty} % \end{macrocode} % (06/15/05) The following two commands save and clears all design elements, and enables % the restoring of the design state. @@ -3781,30 +3694,29 @@ % respectively. The twist here is that even though these basic elements have been redefined, % there original ones can be restored using \cs{restoreElements}. % \begin{macrocode} -\newcommand{\saveElements}[1] -{% - \begingroup - \global\w@csarg\let{web@SaveTmpls#1}\@empty - \toks@={}% - \def\web@addtoSaveToks##1{% - \edef\web@let{\global\expandafter - \let\expandafter\noexpand\csname#1##1\endcsname=% - \expandafter\noexpand\csname##1\endcsname}% - \web@let - \edef\web@SaveTmpls{\the\toks@\noexpand\\{##1}% - \expandafter\noexpand\csname#1##1\endcsname}% - \toks@=\expandafter{\web@SaveTmpls}% - }% - \web@addtoSaveToks{web@textBgColor}% - \web@addtoSaveToks{web@template}% - \web@addtoSaveToks{stdbldpanel}% - \web@addtoSaveToks{web@panelBgColor}% - \web@addtoSaveToks{web@paneltemplate}% - \w@csarg\xdef{web@SaveTmpls#1}{\the\toks@}% - \endgroup +\newcommand{\saveElements}[1]{% + \begingroup + \global\w@csarg\let{web@SaveTmpls#1}\@empty + \toks@={}% + \def\web@addtoSaveToks##1{% + \edef\web@let{\global\expandafter + \let\expandafter\noexpand\csname#1##1\endcsname=% + \expandafter\noexpand\csname##1\endcsname}% + \web@let + \edef\web@SaveTmpls{\the\toks@\noexpand\\{##1}% + \expandafter\noexpand\csname#1##1\endcsname}% + \toks@=\expandafter{\web@SaveTmpls}% + }% + \web@addtoSaveToks{web@textBgColor}% + \web@addtoSaveToks{web@template}% + \web@addtoSaveToks{stdbldpanel}% + \web@addtoSaveToks{web@panelBgColor}% + \web@addtoSaveToks{web@paneltemplate}% + \w@csarg\xdef{web@SaveTmpls#1}{\the\toks@}% + \endgroup } \newcommand{\saveClearElements}[1]{% - \saveElements{#1}\ClearAllTemplates\ClearBuildPanel + \saveElements{#1}\ClearAllTemplates\ClearBuildPanel } % \end{macrocode} % \end{macro} @@ -3814,11 +3726,11 @@ % a name. % \begin{macrocode} \newcommand{\restoreElements}[1]{% - \ClearAllTemplates\ClearBuildPanel - \begingroup - \toks@=\expandafter{\csname web@SaveTmpls#1\endcsname}% - \def\\##1##2{\global\w@csarg\let{##1}=##2}\the\toks@ - \endgroup + \ClearAllTemplates\ClearBuildPanel + \begingroup + \toks@=\expandafter{\csname web@SaveTmpls#1\endcsname}% + \def\\##1##2{\global\w@csarg\let{##1}=##2}\the\toks@ + \endgroup } % \end{macrocode} % \end{macro} @@ -3828,18 +3740,17 @@ % only those templates added in by \cs{AddToTemplate}. % \changes{v6.0k}{2016/06/14}{Fixed error in def of \string\cs{\string\cs{}}} % \begin{macrocode} -\newcommand{\disableScreens}[1] -{% - \begingroup +\newcommand{\disableScreens}[1]{% + \begingroup \toks@=\expandafter{\listAddToTemplates}% \toks2={}% \def\\##1{\w@csarg\ifx{eqTmpl##1}\web@YES - \disableTemplate{##1}% - \xdef\web@saveAddTo{\the\toks2 \noexpand\\{##1}}% - \toks2=\expandafter{\web@saveAddTo}\fi}% + \disableTemplate{##1}% + \xdef\web@saveAddTo{\the\toks2 \noexpand\\{##1}}% + \toks2=\expandafter{\web@saveAddTo}\fi}% \the\toks@ - \endgroup - \w@csarg\let{web@DisabledTmpls#1}\web@saveAddTo + \endgroup + \w@csarg\let{web@DisabledTmpls#1}\web@saveAddTo } % \end{macrocode} % \end{macro} @@ -3848,12 +3759,11 @@ % under a name, the required argument. Includes % only those templates added in by \cs{AddToTemplate}. % \begin{macrocode} -\newcommand{\restoreScreens}[1] -{% - \begingroup - \toks@=\expandafter{\csname web@DisabledTmpls#1\endcsname}% - \def\\##1{\enableTemplate{##1}}\the\toks@ - \endgroup +\newcommand{\restoreScreens}[1]{% + \begingroup + \toks@=\expandafter{\csname web@DisabledTmpls#1\endcsname}% + \def\\##1{\enableTemplate{##1}}\the\toks@ + \endgroup } % \end{macrocode} % \end{macro} @@ -3862,18 +3772,17 @@ % saves the list under a name, the required argument. Includes % only those templates added in by \cs{AddToPanelTemplate}. % \begin{macrocode} -\newcommand{\disablePanels}[1] -{% - \begingroup +\newcommand{\disablePanels}[1]{% + \begingroup \toks@ = \expandafter{\listAddToPanelTemplates}% \toks2 = {}% \def\\##1{\w@csarg\ifx{eqPanTmpl##1}\web@YES - \disablePanelTemplate{##1}% - \xdef\web@saveAddTo{\the\toks2 \noexpand\\{##1}}% - \toks2 =\expandafter{\web@saveAddTo}\fi}% + \disablePanelTemplate{##1}% + \xdef\web@saveAddTo{\the\toks2 \noexpand\\{##1}}% + \toks2 =\expandafter{\web@saveAddTo}\fi}% \the\toks@ - \endgroup - \global\w@csarg\let{web@DisabledPanelTmpls#1}\web@saveAddTo + \endgroup + \global\w@csarg\let{web@DisabledPanelTmpls#1}\web@saveAddTo } % \end{macrocode} % \end{macro} @@ -3882,24 +3791,23 @@ % under a name, the required argument. Includes % only those templates added in by \cs{AddToPanelTemplate}. % \begin{macrocode} -\newcommand{\restorePanels}[1] -{% - \begingroup - \toks@=\expandafter{\csname web@DisabledPanelTmpls#1\endcsname}% - \def\\##1{\enablePanelTemplate{##1}}\the\toks@ - \endgroup +\newcommand{\restorePanels}[1]{% + \begingroup + \toks@=\expandafter{\csname web@DisabledPanelTmpls#1\endcsname}% + \def\\##1{\enablePanelTemplate{##1}}\the\toks@ + \endgroup } % \end{macrocode} % \end{macro} % \begin{macrocode} \newcommand{\disableTemplate}[1]{{% - \global\w@csarg\let{eqTmpl#1}\web@NO}} + \global\w@csarg\let{eqTmpl#1}\web@NO}} \newcommand{\enableTemplate}[1]{{% - \global\w@csarg\let{eqTmpl#1}\web@YES}} + \global\w@csarg\let{eqTmpl#1}\web@YES}} \newcommand{\disablePanelTemplate}[1]{{% - \global\w@csarg\let{eqPanTmpl#1}\web@NO}} + \global\w@csarg\let{eqPanTmpl#1}\web@NO}} \newcommand{\enablePanelTemplate}[1]{{% - \global\w@csarg\let{eqPanTmpl#1}\web@YES}} + \global\w@csarg\let{eqPanTmpl#1}\web@YES}} % \end{macrocode} % \subsubsection{Support for full-width pages} % (2013/01/10) When one of the panel options is taken the with of the text screen is reduced. @@ -3912,19 +3820,19 @@ % We calculate some adjustment values that depend on whether we are left or right panel. % \begin{macrocode} \def\calculatefullwidth{% - \ifeqforpaper - \let\fullscreenwidthadj\@empty - \else - \ifnum\@panelconfig=1\relax % leftpanel - \bgroup + \ifeqforpaper + \let\fullscreenwidthadj\@empty + \else + \ifnum\@panelconfig=\@ne % leftpanel + \bgroup \setlength{\@tempdima}{-\@panelwidth-\@panelsep+\@Leftmargin}% \xdef\web@leftMargAdj{\the\@tempdima}% \setlength{\@tempdima}{-\@panelwidth-\@panelsep+\@Rightmargin}% \xdef\web@rightMargAdj{\the\@tempdima}% - \egroup - \def\fullscreenwidthadj{\hspace{\web@leftMargAdj}}% - \fi + \egroup + \def\fullscreenwidthadj{\hspace{\web@leftMargAdj}}% \fi + \fi } % \end{macrocode} % \DescribeMacro{\makeFullwidthhead} @@ -3933,19 +3841,19 @@ % \cs{fullscreenwidthadj}. % \begin{macrocode} \newcommand{\makeFullwidthhead}{% - \global\let\web@save@oddhead\@oddhead - \renewcommand{\@oddhead}{\fullscreenwidthadj - \hbox to\fullscreenwidth{\normalfont\footnotesize - \web@headerhook\web@lhead\hfil\web@chead\hfil - \web@rightheader}\hss}% + \global\let\web@save@oddhead\@oddhead + \renewcommand{\@oddhead}{\fullscreenwidthadj + \hbox to\fullscreenwidth{\normalfont\footnotesize + \web@headerhook\web@lhead\hfil\web@chead\hfil + \web@rightheader}\hss}% } % \end{macrocode} % \DescribeMacro{\restoreSavedHead} restores previously saved header % (saved by \cs{makeFullwidthhead}. % \begin{macrocode} \newcommand{\restoreSavedHead}{% - \global\let\@oddhead\web@save@oddhead - \let\web@save@oddhead\@empty + \global\let\@oddhead\web@save@oddhead + \let\web@save@oddhead\@empty } % \end{macrocode} % \begin{environment}{Fullwidthtext} @@ -3955,31 +3863,32 @@ % in the \textsf{eqexam} package. % \begin{macrocode} \def\webNotPaneledWarning{% - The Fullwidthtext environment is valid only\MessageBreak - for a paneled document, ignoring this\MessageBreak - environment} + The Fullwidthtext environment is valid only\MessageBreak + for a paneled document, ignoring this\MessageBreak + environment} \newenvironment{Fullwidthtext}{% - \ifnum\@panelconfig=0\relax - \PackageWarning{web}{\webNotPaneledWarning}% - \let\web@next\relax - \else - \def\web@next{% - \enableTemplate{BGColorAndGraphicFullWidth}% - \list{}{% - \setlength{\textwidth}{\fullscreenwidth}% - \setlength{\linewidth}{\fullscreenwidth}% - \setlength{\itemindent}{0pt}\setlength{\itemsep}{0pt}% - \setlength{\topsep}{0pt}\setlength{\parsep}{0pt}% - \setlength{\listparindent}{\parindent}% - \setlength{\leftmargin}{\web@leftMargAdj}% - \setlength{\rightmargin}{-\web@rightMargAdj}% - }\item\relax}% - \fi\web@next + \ifnum\@panelconfig=\@ne + \PackageWarning{web}{\webNotPaneledWarning}% + \let\web@next\relax + \else + \def\web@next{% + \enableTemplate{BGColorAndGraphicFullWidth}% + \list{}{% + \setlength{\textwidth}{\fullscreenwidth}% + \setlength{\linewidth}{\fullscreenwidth}% + \setlength{\itemindent}{0pt}\setlength{\itemsep}{0pt}% + \setlength{\topsep}{0pt}\setlength{\parsep}{0pt}% + \setlength{\listparindent}{\parindent}% + \setlength{\leftmargin}{\web@leftMargAdj}% + \setlength{\rightmargin}{-\web@rightMargAdj}% + }\item\relax}% + \fi\web@next }{% - \ifnum\@panelconfig=0\relax\let\web@next\relax\else - \def\web@next{\endlist\newpage - \disableTemplate{BGColorAndGraphicFullWidth}}% - \fi\web@next + \ifnum\@panelconfig=\z@ + \let\web@next\relax\else + \def\web@next{\endlist\newpage + \disableTemplate{BGColorAndGraphicFullWidth}}% + \fi\web@next } % \end{macrocode} % \end{environment} @@ -3987,24 +3896,24 @@ % ``full page mode.'' % \begin{macrocode} \newcommand{\pushToFullWidthPage}{% - \ifnum\@panelconfig>0\relax - \disableScreens{gofullwidth}% - \disablePanels{gofullwidth}% - \makeFullwidthhead - \let\web@save@footwrapper\webfootwrapper - \def\webfootwrapper{\fullscreenwidthadj - \makebox[\fullscreenwidth]}% - \fi - \begin{Fullwidthtext} + \ifnum\@panelconfig>\z@ + \disableScreens{gofullwidth}% + \disablePanels{gofullwidth}% + \makeFullwidthhead + \let\web@save@footwrapper\webfootwrapper + \def\webfootwrapper{\fullscreenwidthadj + \makebox[\fullscreenwidth]}% + \fi + \begin{Fullwidthtext} } \newcommand{\popFromFullWidthPage}{% - \end{Fullwidthtext} - \ifnum\@panelconfig>0\relax - \restoreScreens{gofullwidth}% - \restorePanels{gofullwidth}% - \restoreSavedHead - \let\webfootwrapper\web@save@footwrapper - \fi + \end{Fullwidthtext} + \ifnum\@panelconfig>\z@ + \restoreScreens{gofullwidth}% + \restorePanels{gofullwidth}% + \restoreSavedHead + \let\webfootwrapper\web@save@footwrapper + \fi } % \end{macrocode} % \DescribeMacro{\addtofullwidthtemplateArgs}\DescribeMacro{\clearfullwidthtemplateArgs} @@ -4024,41 +3933,39 @@ % \end{macrocode} % \begin{macrocode} \let\web@fullwidthtemplate\@empty -\newcommand{\fullwidthtemplate}[2][] -{% - \ifweb@allowtemplates - \def\web@arg{#1}\ifx\web@argi\@empty - \xdef\web@fullwidthtemplate@opt@args - {\web@addtofullwidthtemplateArgs}% - \else - \xdef\web@fullwidthtemplate@opt@args - {\web@addtofullwidthtemplateArgs,#1}% - \fi\gdef\web@fullwidthtemplate{#2}% - \fi +\newcommand{\fullwidthtemplate}[2][]{% + \ifweb@allowtemplates + \def\web@arg{#1}\ifx\web@argi\@empty + \xdef\web@fullwidthtemplate@opt@args + {\web@addtofullwidthtemplateArgs}% + \else + \xdef\web@fullwidthtemplate@opt@args + {\web@addtofullwidthtemplateArgs,#1}% + \fi\gdef\web@fullwidthtemplate{#2}% + \fi } % \end{macrocode} % \DescribeMacro{\B{GColorAndGraphicFullWidth}} handles the full-width page % when left or right panels are in effect. % \begin{macrocode} -\newcommand\BGColorAndGraphicFullWidth -{% - \put(-\@textX,0){% - \web@colorbox@w@transparency{\web@fullwidthBgColor}% - {% - \parbox[b][\paperheight]{\paperwidth}% - {% - \ifx\web@fullwidthtemplate\@empty - \hfill\vfill - \else - \hfuzz=1pt\vfuzz=1pt - \expandafter\includegraphics\expandafter - [\web@fullwidthtemplate@opt@args,% - width=\paperwidth,height=\paperheight]% - {\web@fullwidthtemplate}% - \fi - }% - }% +\newcommand\BGColorAndGraphicFullWidth{% + \put(-\@textX,0){% + \web@colorbox@w@transparency{\web@fullwidthBgColor}% + {% + \parbox[b][\paperheight]{\paperwidth}% + {% + \ifx\web@fullwidthtemplate\@empty + \hfill\vfill + \else + \hfuzz=1pt\vfuzz=1pt + \expandafter\includegraphics\expandafter + [\web@fullwidthtemplate@opt@args,% + width=\paperwidth,height=\paperheight]% + {\web@fullwidthtemplate}% + \fi + }% }% + }% } % \end{macrocode} % Here we ``register'' this template with the ``template handler'', and then @@ -4070,19 +3977,19 @@ % \end{macrocode} % \subsubsection{\texorpdfstring{\protect\cs{AddToShipoutPicture}}{\CMD{AddToShipoutPicture}}} % \begin{macrocode} -\ifnum\@usetemplates>0 - \ifnum\@panelconfig>0 +\ifnum\@usetemplates>\z@ + \ifnum\@panelconfig>\z@ % \end{macrocode} % If the user calls for a left or right panel, then we issue separate templates. % \begin{macrocode} - \AtBeginDocument{% - \AddToShipoutPicture{\web@textTemplate\web@panelTemplate}} - \else + \AtBeginDocument{% + \AddToShipoutPicture{\web@textTemplate\web@panelTemplate}} + \else % \end{macrocode} % otherwise, we use only the \cs{web@textTemplate} % \begin{macrocode} - \AtBeginDocument{\AddToShipoutPicture{\web@textTemplate}} - \fi + \AtBeginDocument{\AddToShipoutPicture{\web@textTemplate}} + \fi \fi % \end{macrocode} % \begin{macrocode} @@ -4118,7 +4025,7 @@ %\end{verbatim} % \begin{macrocode} \newcommand{\DeclareDocInfo}[1]{\setkeys{aebDocInfo}{#1}% - \ifx\web@talkdate@value\@empty\else\let\webversion\webtalkdate\fi} + \ifx\web@talkdate@value\@empty\else\let\webversion\webtalkdate\fi} \@onlypreamble\DeclareDocInfo % \end{macrocode} % \end{macro} @@ -4171,27 +4078,27 @@ % \changes{v4.2h}{2012/01/13}{Added new keys for this set} % \begin{macrocode} \define@key{aebDocInfo}{Title}[]% - {\@ifpackageloaded{aebxmp}{\Title{#1}}{}} + {\@ifpackageloaded{aebxmp}{\Title{#1}}{}} \define@key{aebDocInfo}{authors}[]% - {\@ifpackageloaded{aebxmp}{\Authors{#1}}{}} + {\@ifpackageloaded{aebxmp}{\Authors{#1}}{}} \define@key{aebDocInfo}{Subject}[]% - {\@ifpackageloaded{aebxmp}{\Subject{#1}}{\subject{#1}}} + {\@ifpackageloaded{aebxmp}{\Subject{#1}}{\subject{#1}}} \define@key{aebDocInfo}{Keywords}[]% - {\@ifpackageloaded{aebxmp}{\Keywords{#1}}{\keywords{#1}}} + {\@ifpackageloaded{aebxmp}{\Keywords{#1}}{\keywords{#1}}} \define@key{aebDocInfo}{lang}[]% - {\@ifpackageloaded{aebxmp}{\metaLang{#1}}{}} + {\@ifpackageloaded{aebxmp}{\metaLang{#1}}{}} \define@key{aebDocInfo}{copyrightStatus}[]% - {\@ifpackageloaded{aebxmp}{\copyrightStatus{#1}}{}} + {\@ifpackageloaded{aebxmp}{\copyrightStatus{#1}}{}} \define@key{aebDocInfo}{copyrightNotice}[]% - {\@ifpackageloaded{aebxmp}{\copyrightNotice{#1}}{}} + {\@ifpackageloaded{aebxmp}{\copyrightNotice{#1}}{}} \define@key{aebDocInfo}{copyrightInfoURL}[]% - {\@ifpackageloaded{aebxmp}{\copyrightInfoURL{#1}}{}} + {\@ifpackageloaded{aebxmp}{\copyrightInfoURL{#1}}{}} \define@key{aebDocInfo}{authortitle}[]% - {\@ifpackageloaded{aebxmp}{\authortitle{#1}}{}} + {\@ifpackageloaded{aebxmp}{\authortitle{#1}}{}} \define@key{aebDocInfo}{descriptionwriter}[]% - {\@ifpackageloaded{aebxmp}{\descriptionwriter{#1}}{}} + {\@ifpackageloaded{aebxmp}{\descriptionwriter{#1}}{}} \define@key{aebDocInfo}{customProperties}[]% - {\@ifpackageloaded{aebxmp}{\customProperties{#1}}{}} + {\@ifpackageloaded{aebxmp}{\customProperties{#1}}{}} % \end{macrocode} % % \subsection{\texorpdfstring{\protect\cs{DeclarePageLayout}}{\CMD{DeclarePageLayout}}} @@ -4221,39 +4128,35 @@ % footer. % \begin{macrocode} \newcommand{\DeclarePageLayout}[1]{\save@prtscr - \setkeys{web@pl}{topmargin,headheight,marginparsep,% - marginparwidth,marginparpush,webfootskip}% -% \setkeys{web@pl}{#1}% - \protected@edef\web@temp{\noexpand\setkeys{web@pl}{#1}}% - \web@temp\save@prtscr -% \setkeys{web@pl}{#1}% - \ifx\web@pl@screensize\@empty\else - \expandafter\screensize\web@pl@screensize\fi - \ifx\web@pl@margins\@empty\else - \expandafter\margins\web@pl@margins\fi - \ifeqforpaper\else - \ifdim\@Leftmargin<\@Rightmargin - \ifdim\marginparwidth>\@Leftmargin - \setlength{\marginparwidth} - {\@Leftmargin-2\marginparsep}% - \fi - \else - \ifdim\marginparwidth>\@Rightmargin - \setlength{\marginparwidth} - {\@Rightmargin-2\marginparsep}% - \fi - \fi - \fi - \ifeqforpaper\else - \ifdim\@Bottommargin<\web@footskip\relax\PackageError{web}{% - Error in the value of the webfootskip key\MessageBreak - of the \string\DeclarePageLayout\space command.\MessageBreak - The bottom margin must be larger then\MessageBreak - the value of webfootskip}{% - Increase the size of the bottom margin,\MessageBreak - or decrease the value of webfootskip.}\else - \fi + \setkeys{web@pl}{topmargin,headheight,marginparsep,% + marginparwidth,marginparpush,webfootskip}% + \protected@edef\web@temp{\noexpand\setkeys{web@pl}{#1}}% + \web@temp\save@prtscr + \ifx\web@pl@screensize\@empty\else + \expandafter\screensize\web@pl@screensize\fi + \ifx\web@pl@margins\@empty\else + \expandafter\margins\web@pl@margins\fi + \ifeqforpaper\else + \ifdim\@Leftmargin<\@Rightmargin + \ifdim\marginparwidth>\@Leftmargin + \setlength{\marginparwidth} + {\@Leftmargin-2\marginparsep}\fi + \else + \ifdim\marginparwidth>\@Rightmargin + \setlength{\marginparwidth} + {\@Rightmargin-2\marginparsep}\fi \fi + \fi + \ifeqforpaper\else + \ifdim\@Bottommargin<\web@footskip\relax\PackageError{web}{% + Error in the value of the webfootskip key\MessageBreak + of the \string\DeclarePageLayout\space command.\MessageBreak + The bottom margin must be larger then\MessageBreak + the value of webfootskip}{% + Increase the size of the bottom margin,\MessageBreak + or decrease the value of webfootskip.}\fi + \fi + \InitLayout } \@onlypreamble\DeclarePageLayout % \end{macrocode} @@ -4270,8 +4173,8 @@ \define@key{web@pl}{margins}[]{\def\web@pl@margins{#1}} \let\web@pl@margins\@empty \define@choicekey+{web@pl}{design}[\val\nr]{designi,designii,% - designiii,designiv,designv,designvi,designvii,designviii,designix}{% - \ifcase\nr\relax + designiii,designiv,designv,designvi,designvii,designviii,designix}{% + \ifcase\nr\relax \web@MargScrDimOpts{.25in}{.25in}{24pt}{.25in}{3.736in}{4.67in}\or \web@MargScrDimOpts{.25in}{.25in}{24pt}{.25in}{4.5in}{5in}\or \web@MargScrDimOpts{.25in}{.25in}{24pt}{.25in}{5in}{6in}\or @@ -4281,22 +4184,22 @@ \web@MargScrDimOpts{.5in}{.5in}{24pt}{.5in}{7.5in}{10in}\or \web@MargScrDimOpts{.5in}{.5in}{24pt}{.5in}{3.75in}{6.67in}\or \web@MargScrDimOpts{.5in}{.5in}{24pt}{.5in}{3.75in}{6in}\fi - }{\PackageWarning{webpro}{% - Bad choice for design, use designi--designvix. Try again}} + }{\PackageWarning{webpro}{% + Bad choice for design, use designi--designvix. Try again}} \define@choicekey+{web@pl}{screensizeOf}[\val\nr]{designi,designii,% - designiii,designiv,designv,designvi,designvii,designviii,designix}{% - \ifcase\nr\relax - \screensize{3.736in}{4.67in}\or - \screensize{4.5in}{5in}\or - \screensize{5in}{6in}\or - \screensize{4in}{5in}\or - \screensize{4.5in}{6in}\or - \screensize{4.17in}{4.67in}\or - \screensize{7.5in}{10in}\or - \screensize{3.75in}{6.67in}\or - \screensize{3.75in}{6in}\fi - }{\PackageWarning{webpro}{% - Bad choice for screensizeOf, use designi--designvix. Try again}} + designiii,designiv,designv,designvi,designvii,designviii,designix}{% + \ifcase\nr\relax + \screensize{3.736in}{4.67in}\or + \screensize{4.5in}{5in}\or + \screensize{5in}{6in}\or + \screensize{4in}{5in}\or + \screensize{4.5in}{6in}\or + \screensize{4.17in}{4.67in}\or + \screensize{7.5in}{10in}\or + \screensize{3.75in}{6.67in}\or + \screensize{3.75in}{6in}\fi + }{\PackageWarning{webpro}{% + Bad choice for screensizeOf, use designi--designvix. Try again}} \define@key{web@pl}{headheight}[8pt]{\def\websetheadheight{#1}} % \end{macrocode} %Key-values of \cs{DeclarePageLayout} continues. @@ -4307,20 +4210,18 @@ %\IndexKey{evensidemargin} % \begin{macrocode} \define@key{web@pl}{topmargin}[\prtscr{\the\topmargin}{8pt}]{% - \edef\web@argi{#1}\ifx\web@argi\@empty - \edef\web@argi{\prtscr{\the\topmargin}{8pt}}\fi - \ifeqforpaper - \setlength{\topmargin}{\web@argi}% - \else - \setlength{\web@Topmargin}{\web@argi}% - \fi} + \edef\web@argi{#1}\ifx\web@argi\@empty + \edef\web@argi{\prtscr{\the\topmargin}{8pt}}\fi + \ifeqforpaper + \setlength{\topmargin}{\web@argi}\else + \setlength{\web@Topmargin}{\web@argi}\fi} \define@key{web@pl}{textwidth}[345pt]{\setlength{\textwidth}{#1}} \define@key{web@pl}{textheight}[43\baselineskip]% - {\setlength{\textheight}{#1}} + {\setlength{\textheight}{#1}} \define@key{web@pl}{oddsidemargin}[63pt]% - {\setlength{\oddsidemargin}{#1}} + {\setlength{\oddsidemargin}{#1}} \define@key{web@pl}{evensidemargin}[63pt]% - {\setlength{\evensidemargin}{#1}} + {\setlength{\evensidemargin}{#1}} % \end{macrocode} % More key-values of \cs{DeclarePageLayout}. %\IndexKey{marginparsep} @@ -4333,23 +4234,23 @@ %\IndexKey{additionalheadsep} % \begin{macrocode} \define@key{web@pl}{marginparsep}[\prtscr{\the\marginparsep}{11pt}]{% - \edef\web@argi{#1}\ifx\web@argi\@empty - \edef\web@argi{\prtscr{\the\marginparsep}{11pt}}\fi - \setlength{\marginparsep}{\web@argi}} + \edef\web@argi{#1}\ifx\web@argi\@empty + \edef\web@argi{\prtscr{\the\marginparsep}{11pt}}\fi + \setlength{\marginparsep}{\web@argi}} \define@key{web@pl}{marginparwidth}% - [\prtscr{\the\marginparwidth}{.25in}]{% - \edef\web@argi{#1}\ifx\web@argi\@empty - \edef\web@argi{\prtscr{\the\marginparwidth}{.25in}}\fi - \setlength{\marginparwidth}{\web@argi}} + [\prtscr{\the\marginparwidth}{.25in}]{% + \edef\web@argi{#1}\ifx\web@argi\@empty + \edef\web@argi{\prtscr{\the\marginparwidth}{.25in}}\fi + \setlength{\marginparwidth}{\web@argi}} \define@key{web@pl}{marginparpush}[5pt]{% - \setlength{\marginparpush}{#1}} + \setlength{\marginparpush}{#1}} \define@key{web@pl}{webfootskip}[4pt]{% - \def\web@footskip{#1}} + \def\web@footskip{#1}} \define@key{web@pl}{footskip}[30pt]{\setlength{\footskip}{#1}} \define@key{web@pl}{panelwidth}[1in]{\panelwidth{#1}} \define@key{web@pl}{panelsep}[10pt]{\panelsep{#1}} \define@key{web@pl}{additionalheadsep}[0pt]% - {\def\web@additionalheadsep{#1}} + {\def\web@additionalheadsep{#1}} % \end{macrocode} % \end{macro} % @@ -4369,32 +4270,32 @@ % default. The alignment is set by \cs{halignuniversity}. The UI for this % value is the \texttt{xhalign} key of \cs{universityLayout}. % \begin{macrocode} - \vglue\web@aboveTopTitleSkip - \noindent\makebox[\linewidth][\halignuniversity]{\parbox{% - \hproportionwebuniversity\linewidth}% - {\sectionUniversity{\webuniversity}}}% - \par\ifeqforpaper\else\minimumskip\fi - \vspace{\stretch{1}}% + \vglue\web@aboveTopTitleSkip\noindent + \makebox[\linewidth][\halignuniversity]{\parbox{% + \hproportionwebuniversity\linewidth}% + {\sectionUniversity{\webuniversity}}}\par + \ifeqforpaper\else\minimumskip\fi + \vspace{\stretch{1}}\noindent % \end{macrocode} % Have \cs{webtitle} centered across the top of the title page, by % default. The alignment is set by \cs{haligntitle}. The UI for this % value is the \texttt{xhalign} key of \cs{titleLayout}. % \begin{macrocode} - \noindent\makebox[\linewidth][\haligntitle]% - {\parbox{\hproportionwebtitle\linewidth}% - {\sectionTitle{\webtitle}}}% - \par\ifeqforpaper\vspace{2\baselineskip}\else - \minimumskip\vspace{\stretch{1}}\fi + \makebox[\linewidth][\haligntitle]% + {\parbox{\hproportionwebtitle\linewidth}% + {\sectionTitle{\webtitle}}}% + \par\ifeqforpaper\vspace{2\baselineskip}\else + \minimumskip\vspace{\stretch{1}}\fi\noindent % \end{macrocode} % Have \cs{webauthor} centered across the top of the title page, by % default. The alignment is set by \cs{halignauthor}. The UI for this % value is the \texttt{xhalign} key of \cs{authorLayout}. % \begin{macrocode} - \noindent\makebox[\linewidth][\halignauthor]% - {\parbox{\hproportionwebauthor\linewidth}% - {\sectionAuthor{\webauthor}}} - \par\ifeqforpaper\vspace{2\baselineskip}\else - \minimumskip\vspace{\stretch{1}}\fi + \makebox[\linewidth][\halignauthor]% + {\parbox{\hproportionwebauthor\linewidth}% + {\sectionAuthor{\webauthor}}} + \par\ifeqforpaper\vspace{2\baselineskip}\else + \minimumskip\vspace{\stretch{1}}\fi } \newcommand{\topTitlePageProportion}[1]{\def\titleauthorproportion{#1}} % \end{macrocode} @@ -4408,13 +4309,13 @@ % \begin{macrocode} \renewcommand{\titlepageTrailer} {% - \webtpTrailerWrapper{\makebox[\web@tp@linewidth]{% - \parbox{\web@tp@linewidth}{% - \ifx\tpTrailer@textcolor\@empty\else - \color{\tpTrailer@textcolor}\fi\web@tpTrailer@formatting - \maketitle@trailer@ul\hfill\maketitle@trailer@ur\\ - \maketitle@trailer@ll\hfill\maketitle@trailer@lr - }}}% + \webtpTrailerWrapper{\makebox[\web@tp@linewidth]{% + \parbox{\web@tp@linewidth}{% + \ifx\tpTrailer@textcolor\@empty\else + \color{\tpTrailer@textcolor}\fi\web@tpTrailer@formatting + \maketitle@trailer@ul\hfill\maketitle@trailer@ur\\ + \maketitle@trailer@ll\hfill\maketitle@trailer@lr + }}}% } % \end{macrocode} % \end{macro} @@ -4423,7 +4324,7 @@ % the default. % \begin{macrocode} \def\maketitle@trailer@ul{\web@copyright\ \web@copyright@symbol\ - \webcopyrightyears\ \thewebemail} + \webcopyrightyears\ \thewebemail} \def\maketitle@trailer@ll{\aeb@Prepared} \def\maketitle@trailer@ur{\aeb@talksite} \def\maketitle@trailer@lr{\webversion} @@ -4438,12 +4339,12 @@ \def\web@tp@linewidth{\linewidth} % \end{macrocode} % Key-values of \cmd{\DesignTitlePageTrailer} -% \IndexKey{ul} -% \IndexKey{ll} -% \IndexKey{ur} -% \IndexKey{lr} -% \IndexKey{textColor} -% \IndexKey{bgColor} +% \IndexKey{ul}^^A +% \IndexKey{ll}^^A +% \IndexKey{ur}^^A +% \IndexKey{lr}^^A +% \IndexKey{textColor}^^A +% \IndexKey{bgColor}^^A % \begin{macrocode} \define@key{tpTrailer}{ul}{\def\maketitle@trailer@ul{#1}} \define@key{tpTrailer}{ll}{\def\maketitle@trailer@ll{#1}} @@ -4452,12 +4353,12 @@ \define@key{tpTrailer}{textColor}{\def\tpTrailer@textcolor{#1}} \define@key{tpTrailer}{bgColor}{\def\web@tpTrailerBgColor{#1}} % \end{macrocode} -% Key-values of \cmd{\DesignTitlePageTrailer} -% \IndexKey{borderColor} -% \IndexKey{fboxsep} -% \IndexKey{fboxrule} -% \IndexKey{graphic} -% \IndexKey{namedgraphic} +% More key-values of \cmd{\DesignTitlePageTrailer} +% \IndexKey{borderColor}^^A +% \IndexKey{fboxsep}^^A +% \IndexKey{fboxrule}^^A +% \IndexKey{graphic}^^A +% \IndexKey{namedgraphic}^^A % \begin{macrocode} \define@key{tpTrailer}{borderColor}{\def\web@tpTrailerBorderColor{#1}} \define@key{tpTrailer}{fboxsep}{\def\web@tpTrailerfboxsep{#1}} @@ -4466,71 +4367,71 @@ \define@key{tpTrailer}{namedgraphic}{% \def\web@tpTrailer@namedgraphic{#1}} % \end{macrocode} -% Key-values of \cmd{\DesignTitlePageTrailer} -% \IndexKey{fontSize} +% Key-values of \cmd{\DesignTitlePageTrailer}, continued. +% \IndexKey{fontSize}^^A % \IndexKey{formatting} -% \IndexKey{raise} +% \IndexKey{raise}^^A % \begin{macrocode} \define@key{tpTrailer}{fontSize}{\renewcommand{\trailerFontSize}{#1}} \define@key{tpTrailer}{formatting}{\def\web@tpTrailer@formatting{#1}} \define@key{tpTrailer}{raise}{\def\web@tpTrailer@raise{#1}} \newcommand{\DesignTitlePageTrailer}[1] {% - \setkeys{tpTrailer}{fboxsep=3pt,fboxrule=.4pt}% - \setkeys{tpTrailer}{#1}% - \setlength{\fboxsep}{\web@tpTrailerfboxsep}% - \setlength{\fboxrule}{\web@tpTrailerfboxrule}% - \let\web@tp@graphic\web@NO - \ifx\web@tpTrailer@graphic\@empty - \ifx\web@tpTrailer@namedgraphic\@empty\else - \let\web@tp@graphic\web@YES\fi - \else\let\web@tp@graphic\web@YES\fi - \ifx\web@tp@graphic\web@NO\relax - \ifx\web@tpTrailerBgColor\@empty - \def\grfbox@spec##1{##1}% - \else - \ifx\web@tpTrailerBorderColor\@empty - \def\web@tp@linewidth{\linewidth-2\fboxsep}% - \def\grfbox@spec{\colorbox{\web@tpTrailerBgColor}}% - \else - \def\web@tp@linewidth{% - \linewidth-2\fboxsep-2\fboxrule}% - \def\grfbox@spec{\fcolorbox{\web@tpTrailerBorderColor}% - {\web@tpTrailerBgColor}}% - \fi - \fi - \def\webtpTrailerWrapper##1{\smash{\raisebox - {\web@tpTrailer@raise}{\grfbox@spec{##1}}}}% + \setkeys{tpTrailer}{fboxsep=3pt,fboxrule=.4pt}% + \setkeys{tpTrailer}{#1}% + \setlength{\fboxsep}{\web@tpTrailerfboxsep}% + \setlength{\fboxrule}{\web@tpTrailerfboxrule}% + \let\web@tp@graphic\web@NO + \ifx\web@tpTrailer@graphic\@empty + \ifx\web@tpTrailer@namedgraphic\@empty\else + \let\web@tp@graphic\web@YES\fi + \else\let\web@tp@graphic\web@YES\fi + \ifx\web@tp@graphic\web@NO\relax + \ifx\web@tpTrailerBgColor\@empty + \def\grfbox@spec##1{##1}% \else - \@ifundefined{graphicxbox}{\begingroup - \gdef\webtpTrailerWrapper##1{% - \edef\web@tmp@opt{\ifx\web@tpTrailer@namedgraphic\@empty\else - name=\web@tpTrailer@namedgraphic,\fi}% - \def\web@tp@linewidth{\linewidth-2\fboxsep}% - \setbox0=\hbox{##1}% - \noindent\makebox[0pt][l]{% - \smash{\raisebox{-\dp0-\fboxsep+\web@tpTrailer@raise}{% - \expandafter\includegraphics\expandafter[\web@tmp@opt - width=\wd0+2\fboxsep,% - height=\dp0+\ht0+2\fboxsep]{\web@tpTrailer@graphic}}% - }}\kern\fboxsep\smash{% - \raisebox{\web@tpTrailer@raise}{\unhbox0\relax}}% - }% - \endgroup}{% - \xdef\grfbox@spec{% - \ifx\web@tpTrailerBorderColor\@empty - \noexpand\graphicxbox\else - \noexpand\fgraphicxbox{\web@tpTrailerBorderColor}\fi - \ifx\web@tpTrailer@namedgraphic\@empty\else - [name=\web@tpTrailer@namedgraphic]\fi}% - \gdef\webtpTrailerWrapper##1{% - \edef\web@tp@linewidth{% - \linewidth-2\fboxsep\ifx\web@tpTrailerBorderColor\@empty - \else-2\fboxrule\fi}% - \smash{\raisebox{\web@tpTrailer@raise}{% - \grfbox@spec{\web@tpTrailer@graphic}{##1}}}}% - }% + \ifx\web@tpTrailerBorderColor\@empty + \def\web@tp@linewidth{\linewidth-2\fboxsep}% + \def\grfbox@spec{\colorbox{\web@tpTrailerBgColor}}% + \else + \def\web@tp@linewidth{% + \linewidth-2\fboxsep-2\fboxrule}% + \def\grfbox@spec{\fcolorbox{\web@tpTrailerBorderColor}% + {\web@tpTrailerBgColor}}% + \fi \fi + \def\webtpTrailerWrapper##1{\smash{\raisebox + {\web@tpTrailer@raise}{\grfbox@spec{##1}}}}% + \else + \@ifundefined{graphicxbox}{\begingroup + \gdef\webtpTrailerWrapper##1{% + \edef\web@tmp@opt{\ifx\web@tpTrailer@namedgraphic\@empty\else + name=\web@tpTrailer@namedgraphic,\fi}% + \def\web@tp@linewidth{\linewidth-2\fboxsep}% + \setbox0=\hbox{##1}% + \noindent\makebox[0pt][l]{% + \smash{\raisebox{-\dp0-\fboxsep+\web@tpTrailer@raise}{% + \expandafter\includegraphics\expandafter[\web@tmp@opt + width=\wd0+2\fboxsep,% + height=\dp0+\ht0+2\fboxsep]{\web@tpTrailer@graphic}}% + }}\kern\fboxsep\smash{% + \raisebox{\web@tpTrailer@raise}{\unhbox0\relax}}% + }% + \endgroup}{% + \xdef\grfbox@spec{% + \ifx\web@tpTrailerBorderColor\@empty + \noexpand\graphicxbox\else + \noexpand\fgraphicxbox{\web@tpTrailerBorderColor}\fi + \ifx\web@tpTrailer@namedgraphic\@empty\else + [name=\web@tpTrailer@namedgraphic]\fi}% + \gdef\webtpTrailerWrapper##1{% + \edef\web@tp@linewidth{% + \linewidth-2\fboxsep\ifx\web@tpTrailerBorderColor\@empty + \else-2\fboxrule\fi}% + \smash{\raisebox{\web@tpTrailer@raise}{% + \grfbox@spec{\web@tpTrailer@graphic}{##1}}}}% + }% + \fi } % \end{macrocode} % \end{macro} @@ -4547,36 +4448,36 @@ % This value can be set by direct definition, or through the helper command % \cs{topTitlePageProportion}. % \begin{macrocode} - \maketitlepreamble + \maketitlepreamble % \end{macrocode} % \begin{macrocode} - \ifeqforpaper\vspace*{2\baselineskip}\else + \ifeqforpaper\vspace*{2\baselineskip}\else \vbox to\titleauthorproportion\textheight\bgroup\fi % \end{macrocode} % \begin{macrocode} - \topTitlePage + \topTitlePage % \end{macrocode} % \begin{macrocode} - \ifeqforpaper\else\egroup\fi % end of \vbox for title and author + \ifeqforpaper\else\egroup\fi % end of \vbox for title and author % \end{macrocode} % Now place the \cs{optionalpagematter} % \begin{macrocode} - \begingroup\par - \aboveOPMvspace - \noindent\parbox{\linewidth}{\optionalpagematter}% - \par\endgroup - \par\vspace{\stretch{1}} + \begingroup\par + \aboveOPMvspace\noindent + \parbox{\linewidth}{\optionalpagematter}\par + \endgroup + \par\vspace{\stretch{1}} % \end{macrocode} % Insert the directory, as desired. % \begin{macrocode} - \ifx\web@directory@option\web@YES\web@directory@hook\webdirectory\fi - \par\ifeqforpaper\else\minimumskip\fi\vspace{\stretch{1}} + \ifx\web@directory@option\web@YES\web@directory@hook\webdirectory\fi + \par\ifeqforpaper\else\minimumskip\fi\vspace{\stretch{1}}% % \end{macrocode} % Insert the ``bottom matter''. % \begin{macrocode} - \vfill\noindent\begingroup\trailerFontSize\titlepageTrailer - \par\endgroup - \maketitlepostamble + \vfill\noindent\begingroup\trailerFontSize\titlepageTrailer + \par\endgroup + \maketitlepostamble } \let\web@maketitle@save\maketitle \let\maketitle\web@maketitle @@ -4601,7 +4502,7 @@ % to describe where this talk occurred. % \begin{macrocode} \def\talkdate#1{\gdef\web@talkdate@value{#1}% - \edef\webtalkdate{\ifx\web@talkdate@value\@empty + \edef\webtalkdate{\ifx\web@talkdate@value\@empty \else\noexpand\web@talkdatelabel\ #1\fi}} \let\web@talkdate@value\@empty %\def\talkdateLabel#1{\def\web@versionlabel{#1}} @@ -4618,48 +4519,50 @@ % \IndexKey{reset} % \begin{macrocode} \define@choicekey+{aebsection}{reset}[\val\nr]{font,all}{% - \ifcase\nr\relax - \aeb@reset@section@fonts\or - \aeb@reset@section@all\fi + \ifcase\nr\relax + \aeb@reset@section@fonts\or + \aeb@reset@section@all + \fi }{\PackageWarning{webpro}{Bad choice for reset, permissible values are font and all. Try again}} % \end{macrocode} % Section headings -% \IndexKey{type} -% \IndexKey{special} +% \IndexKey{type}^^A +% \IndexKey{special}^^A % \begin{macrocode} \define@choicekey+{aebsection}{type}[\val\nr]{section,subsection,% - subsubsection,university,title,author,toc}% + subsubsection,university,title,author,toc}% {% - \edef\aeb@section@type{#1}% - \edef\aeb@section@typeIndex{\nr}% + \edef\aeb@section@type{#1}% + \edef\aeb@section@typeIndex{\nr}% }{}{} \define@key{aebsection}{special}{% - \edef\aeb@temp@expand{% - \noexpand\XKV@cc+[\noexpand\val\noexpand\nr]{#1}}% - \aeb@temp@expand{shadow,framebox,colorbox,fcolorbox,frameboxfit,% - colorboxfit,fcolorboxfit,colorboxfitrule,custom,default}% + \edef\aeb@temp@expand{% + \noexpand\XKV@cc+[\noexpand\val\noexpand\nr]{#1}}% + \aeb@temp@expand{shadow,framebox,colorbox,fcolorbox,frameboxfit,% + colorboxfit,fcolorboxfit,colorboxfitrule,custom,default}% {% \ifcase\nr\relax - \w@csarg\let{aeb@\aeb@section@type @special}\aeb@shadowHead\or - \w@csarg\let{aeb@\aeb@section@type @special}\aeb@frameboxHead\or - \w@csarg\let{aeb@\aeb@section@type @special}\aeb@colorboxHead\or - \w@csarg\let{aeb@\aeb@section@type @special}\aeb@fcolorboxHead\or - \w@csarg\let{aeb@\aeb@section@type @special}\aeb@frameboxfitHead\or - \w@csarg\let{aeb@\aeb@section@type @special}\aeb@colorboxfitHead\or - \w@csarg\let{aeb@\aeb@section@type @special} - \aeb@fcolorboxfitHead\or - \w@csarg\let{aeb@\aeb@section@type @special} - \aeb@colorboxfitruleHead\or - \edef\aeb@temp{\noexpand\def\expandafter\noexpand + \w@csarg\let{aeb@\aeb@section@type @special}\aeb@shadowHead\or + \w@csarg\let{aeb@\aeb@section@type @special}\aeb@frameboxHead\or + \w@csarg\let{aeb@\aeb@section@type @special}\aeb@colorboxHead\or + \w@csarg\let{aeb@\aeb@section@type @special}\aeb@fcolorboxHead\or + \w@csarg\let{aeb@\aeb@section@type @special}\aeb@frameboxfitHead\or + \w@csarg\let{aeb@\aeb@section@type @special}\aeb@colorboxfitHead\or + \w@csarg\let{aeb@\aeb@section@type @special} + \aeb@fcolorboxfitHead\or + \w@csarg\let{aeb@\aeb@section@type @special} + \aeb@colorboxfitruleHead\or + \edef\aeb@temp{\noexpand\def\expandafter\noexpand \csname aeb@\aeb@section@type @special\endcsname{\expandafter - \noexpand\csname aeb@\aeb@section@type @customHead\endcsname}}% - \aeb@temp\or - \w@csarg\let{aeb@\aeb@section@type @special}\@empty\fi + \noexpand\csname aeb@\aeb@section@type @customHead\endcsname}}% + \aeb@temp\or + \w@csarg\let{aeb@\aeb@section@type @special}\@empty + \fi }{% - \PackageWarning{webpro}{Bad choice for special, permissible values - are shadow, framebox, colorbox, fcolorbox, custom and default. - Try again}}% + \PackageWarning{webpro}{Bad choice for special, permissible values + are shadow, framebox, colorbox, fcolorbox, custom and default. + Try again}}% } \@tfor\@@tmp:={section}{subsection}{subsubsection}% {university}{title}{author}{toc}\do{% @@ -4693,86 +4596,87 @@ % The command\DescribeMacro{\aeb@frameboxHead} for \texttt{special=framebox}. % \begin{macrocode} \def\aeb@frameboxHead#1{% - \begingroup + \begingroup \@tempdima=\linewidth \advance\@tempdima-2\fboxsep \advance\@tempdima-2\fboxrule \edef\@@aeb@sectionframecolor - {\@nameuse{aeb@\aeb@section@type framecolor}}% + {\@nameuse{aeb@\aeb@section@type framecolor}}% \edef\@@aeb@sectioncolor - {\@nameuse{aeb@\aeb@section@type color}}% - \setbox0\vbox{\hsize=\@tempdima#1}\color{\@@aeb@sectionframecolor}% - \framebox{\color{\@@aeb@sectioncolor}\copy0}% - \endgroup + {\@nameuse{aeb@\aeb@section@type color}}% + \setbox\z@\vbox{\hsize=\@tempdima#1}% + \color{\@@aeb@sectionframecolor}% + \framebox{\color{\@@aeb@sectioncolor}\copy\z@}% + \endgroup } % \end{macrocode} % The command\DescribeMacro{\aeb@colorboxHead} for \texttt{special=colorbox}. % \begin{macrocode} \def\aeb@colorboxHead#1{% - \begingroup + \begingroup \@tempdima=\linewidth \advance\@tempdima-2\fboxsep - \setbox0\vbox{\hsize=\@tempdima#1}% + \setbox\z@\vbox{\hsize=\@tempdima#1}% \edef\@@aeb@sectionbgcolor {\@nameuse{aeb@\aeb@section@type bgcolor}}% - \colorbox{\@@aeb@sectionbgcolor}{\copy0}% - \endgroup + \colorbox{\@@aeb@sectionbgcolor}{\copy\z@}% + \endgroup } % \end{macrocode} % The command\DescribeMacro{\aeb@fcolorboxHead} for \texttt{special=fcolorbox}. % \begin{macrocode} \def\aeb@fcolorboxHead#1{% - \begingroup - \@tempdima=\linewidth + \begingroup + \@tempdima=\linewidth \advance\@tempdima-2\fboxsep \advance\@tempdima-2\fboxrule - \setbox0\vbox{\hsize=\@tempdima#1}% + \setbox\z@\vbox{\hsize=\@tempdima#1}% \edef\@@aeb@sectionbgcolor - {\@nameuse{aeb@\aeb@section@type bgcolor}}% + {\@nameuse{aeb@\aeb@section@type bgcolor}}% \fcolorbox{\aeb@sectionframecolor}% - {\@@aeb@sectionbgcolor}{\copy0} - \endgroup + {\@@aeb@sectionbgcolor}{\copy\z@} + \endgroup } % \end{macrocode} % The command\DescribeMacro{\aeb@frameboxfitHead} for \texttt{special=frameboxfit}. % \begin{macrocode} \def\aeb@frameboxfitHead#1{% - \begingroup + \begingroup \edef\@@aeb@sectionframecolor - {\@nameuse{aeb@\aeb@section@type framecolor}}% + {\@nameuse{aeb@\aeb@section@type framecolor}}% \edef\@@aeb@sectioncolor - {\@nameuse{aeb@\aeb@section@type color}}% + {\@nameuse{aeb@\aeb@section@type color}}% \vbox{\color{\@@aeb@sectionframecolor}% \framebox{\color{\@@aeb@sectioncolor}#1}}% - \endgroup + \endgroup } % \end{macrocode} % The command\DescribeMacro{\aeb@colorboxfitHead} for \texttt{special=colorboxfit}. % \begin{macrocode} \def\aeb@colorboxfitHead#1{% - \begingroup + \begingroup \edef\@@aeb@sectioncolor - {\@nameuse{aeb@\aeb@section@type color}}% + {\@nameuse{aeb@\aeb@section@type color}}% \edef\@@aeb@sectionbgcolor - {\@nameuse{aeb@\aeb@section@type bgcolor}}% + {\@nameuse{aeb@\aeb@section@type bgcolor}}% \vbox{\colorbox{\@@aeb@sectionbgcolor}% - {\color{\@@aeb@sectioncolor}#1}}% - \endgroup + {\color{\@@aeb@sectioncolor}#1}}% + \endgroup } % \end{macrocode} % The command\DescribeMacro{\aeb@fcolorboxfitHead} for \texttt{special=fcolorboxfit}. % \begin{macrocode} \def\aeb@fcolorboxfitHead#1{% - \begingroup + \begingroup \edef\@@aeb@sectioncolor - {\@nameuse{aeb@\aeb@section@type color}}% + {\@nameuse{aeb@\aeb@section@type color}}% \edef\@@aeb@sectionbgcolor - {\@nameuse{aeb@\aeb@section@type bgcolor}}% + {\@nameuse{aeb@\aeb@section@type bgcolor}}% \edef\@@aeb@sectionframecolor - {\@nameuse{aeb@\aeb@section@type framecolor}}% + {\@nameuse{aeb@\aeb@section@type framecolor}}% \vbox{\fcolorbox{\@@aeb@sectionframecolor}{\@@aeb@sectionbgcolor}% - {\color{\@@aeb@sectioncolor}#1}}% - \endgroup + {\color{\@@aeb@sectioncolor}#1}}% + \endgroup } % \end{macrocode} % Here we define \DescribeMacro{\shadowhoffset}\cs{shadowhoffset} and @@ -4786,95 +4690,95 @@ % \end{macrocode} % The command\DescribeMacro{\aeb@shadowHead} for \texttt{special=shadow}. % \begin{macrocode} -\def\aeb@shadowHead#1{% dps1 - \begingroup +\def\aeb@shadowHead#1{% + \begingroup \edef\@@aeb@sectionshadowcolor - {\@nameuse{aeb@\aeb@section@type shadowcolor}}% + {\@nameuse{aeb@\aeb@section@type shadowcolor}}% \edef\@@aeb@sectioncolor - {\@nameuse{aeb@\aeb@section@type color}}% - \setbox0\vbox{\Shadowtrue\hsize=\linewidth #1}% - \wd0\z@\dp0\z@\relax\raisebox{\aeb@shadowvoffset}% + {\@nameuse{aeb@\aeb@section@type color}}% + \setbox\z@\vbox{\Shadowtrue\hsize=\linewidth #1}% + \wd\z@\z@\dp\z@\z@\raisebox{\aeb@shadowvoffset}% {\hbox to\z@{\kern\aeb@shadowhoffset% \Shadowtrue\color{\@@aeb@sectionshadowcolor} - \box0\hss}}% - \setbox0\vbox{\Shadowfalse\hsize=\linewidth #1}\box0 - \endgroup + \box\z@\hss}}\setbox\z@ + \vbox{\Shadowfalse\hsize=\linewidth #1}\box\z@ + \endgroup } % \end{macrocode} % \texttt{usefont}\IndexKey{usefont} allows for a custom shift in font for the title. % it takes four argument, each of which are enclosed in braces: -%\begin{verbatim} -% {<fontencoding>}{<fontfamily>}{<fontseries>}{<fontshape>} -% {{<fontsize>}{<skip>}} -%\end{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small, +%commandchars={!()},codes={\catcode`\%=9}] +% {!ameta(fontencoding)}{!ameta(fontfamily)}{!ameta(fontseries)}{!ameta(fontshape)} +% {{!ameta(fontsize)}{!ameta(skip)}} +%\end{Verbatim} % \begin{macrocode} \define@key{aebsection}{usefont}{% - \w@csarg\def{aeb@\aeb@section@type @usefont}{\aeb@usefont#1}} + \w@csarg\def{aeb@\aeb@section@type @usefont}{\aeb@usefont#1}} \@tfor\@@tmp:={section}{subsection}{subsubsection} -{university}{title}{author}{toc}\do{% + {university}{title}{author}{toc}\do{% \w@csarg\let{aeb@\@@tmp @usefont}\@empty} \def\aeb@usefont#1#2#3#4#5{\def\aeb@usefontargv{#5}% - \ifx\aeb@usefontargv\@empty + \ifx\aeb@usefontargv\@empty % \end{macrocode} % If the fifth parameter is empty, no font size is specified, we'll % use the default sizes. We gobble up the next three tokens in the % definition of \cs{section}, excluding the token that sets size. % \begin{macrocode} - \def\aeb@next{\expandafter\@gobble\@gobbletwo}% - \else + \def\aeb@next{\expandafter\@gobble\@gobbletwo}% + \else % \end{macrocode} % If the fifth parameter is not empty, font size is specified, % we'll gobble up the next four tokens in the % definition of \cs{section}, including the token that sets size. % \begin{macrocode} - \def\aeb@next{\expandafter\@gobbletwo\@gobbletwo}% - \fi - \fontencoding{#1}\fontfamily{#2}% - \fontseries{#3}\fontshape{#4}\ifx\aeb@usefontargv\@empty\else - \fontsize#5\fi\selectfont\aeb@next + \def\aeb@next{\expandafter\@gobbletwo\@gobbletwo}% + \fi + \fontencoding{#1}\fontfamily{#2}% + \fontseries{#3}\fontshape{#4}\ifx\aeb@usefontargv\@empty\else + \fontsize#5\fi\selectfont\aeb@next } % \end{macrocode} % Font related keys.\IndexKey{fontfamily}\IndexKey{fontseries}\IndexKey{fontshape} % \begin{macrocode} \define@key{aebsection}{fontfamily}{% - \edef\aeb@temp@expand{\noexpand\XKV@cc+{#1}}% - \aeb@temp@expand{rmfamily,sffamily,ttfamily}{% - \w@csarg\def{aeb@\aeb@section@type @fontfamily}{\@nameuse{#1}}% + \edef\aeb@temp@expand{\noexpand\XKV@cc+{#1}}% + \aeb@temp@expand{rmfamily,sffamily,ttfamily}{% + \w@csarg\def{aeb@\aeb@section@type @fontfamily}{\@nameuse{#1}}% }{\PackageWarning{webpro}{Bad choice for fontfamily, permissible values - are rmfamily, sffamily and ttfamily. Try again}}% -} + are rmfamily, sffamily and ttfamily. Try again}}} \@tfor\@@tmp:={section}{subsection}{subsubsection}{university}{title}% -{author}{toc}\do{\w@csarg\let{aeb@\@@tmp @fontfamily}\aeb@defaultfamily} + {author}{toc}\do + {\w@csarg\let{aeb@\@@tmp @fontfamily}\aeb@defaultfamily} \define@key{aebsection}{fontseries}{% - \edef\aeb@temp@expand{\noexpand\XKV@cc+{#1}}% - \aeb@temp@expand{bfseries,mdseries}{% - \w@csarg\def{aeb@\aeb@section@type @fontseries}{\@nameuse{#1}}% + \edef\aeb@temp@expand{\noexpand\XKV@cc+{#1}}% + \aeb@temp@expand{bfseries,mdseries}{% + \w@csarg\def{aeb@\aeb@section@type @fontseries}{\@nameuse{#1}}% }{\PackageWarning{webpro}{Bad choice for fontseries, permissible values - are bfseries and mdseries. Try again}}% -} + are bfseries and mdseries. Try again}}} \@tfor\@@tmp:={section}{subsection}{subsubsection}{university}{title}% -{author}{toc}\do{\w@csarg\let{aeb@\@@tmp @fontseries}\bfseries} + {author}{toc}\do{\w@csarg\let{aeb@\@@tmp @fontseries}\bfseries} \define@key{aebsection}{fontshape}{% - \edef\aeb@temp@expand{\noexpand\XKV@cc+{#1}}% - \aeb@temp@expand{upshape,itshape,scshape,slshape}{% - \w@csarg\def{aeb@\aeb@section@type @fontshape}{\@nameuse{#1}}% + \edef\aeb@temp@expand{\noexpand\XKV@cc+{#1}}% + \aeb@temp@expand{upshape,itshape,scshape,slshape}{% + \w@csarg\def{aeb@\aeb@section@type @fontshape}{\@nameuse{#1}}% }{\PackageWarning{webpro}{Bad choice for fontshape, permissible values are upshape, itshape, scshape and slshape. Try again}}% } \@tfor\@@tmp:={section}{subsection}{subsubsection}{university}{title}% -{author}{toc}\do{\w@csarg\let{aeb@\@@tmp @fontshape}\upshape} + {author}{toc}\do{\w@csarg\let{aeb@\@@tmp @fontshape}\upshape} \define@key{aebsection}{fontsize}{% - \edef\aeb@temp@expand{\noexpand\XKV@cc+{#1}}% - \aeb@temp@expand{tiny,scriptsize,footnotesize,% - small,normalsize,large,Large,LARGE,huge,Huge}{% - \w@csarg\def{aeb@\aeb@section@type @fontsize}{\@nameuse{#1}}% + \edef\aeb@temp@expand{\noexpand\XKV@cc+{#1}}% + \aeb@temp@expand{tiny,scriptsize,footnotesize,% + small,normalsize,large,Large,LARGE,huge,Huge}{% + \w@csarg\def{aeb@\aeb@section@type @fontsize}{\@nameuse{#1}}% }{\PackageWarning{webpro}{Bad choice for fontsize, permissible values - are tiny, scriptsize, footnotesize, small, normalsize, - large, Large, LARGE, huge and Huge. Try again}}% + are tiny, scriptsize, footnotesize, small, normalsize, + large, Large, LARGE, huge and Huge. Try again}}% } \@tfor\@@tmp:={{section}{\normalsize}}{{subsection}{\normalsize}}% -{{subsubsection}{\normalsize}}{{university}{\normalsize}}% -{{title}{\large}}{{author}{\normalsize}}{{toc}{\small}}\do{% + {{subsubsection}{\normalsize}}{{university}{\normalsize}}% + {{title}{\large}}{{author}{\normalsize}}{{toc}{\small}}\do{% \expandafter\getargs\@@tmp \edef\aeb@temp{\global\noexpand \let\expandafter\noexpand\csname aeb@\aeb@argi @fontsize\endcsname @@ -4884,23 +4788,22 @@ % Alignment related keys\IndexKey{halign} % \begin{macrocode} \define@key{aebsection}{halign}{% - \edef\aeb@temp@expand{% - \noexpand\XKV@cc+[\noexpand\val\noexpand\nr]{#1}}% - \aeb@temp@expand{l,c,r}{% - \ifcase\nr\relax - \w@csarg\let{aeb@\aeb@section@type @halign}\raggedright\or - \w@csarg\let{aeb@\aeb@section@type @halign}\centering\or - \w@csarg\let{aeb@\aeb@section@type @halign}\raggedleft\fi + \edef\aeb@temp@expand{\noexpand + \XKV@cc+[\noexpand\val\noexpand\nr]{#1}}% + \aeb@temp@expand{l,c,r}{% + \ifcase\nr\relax + \w@csarg\let{aeb@\aeb@section@type @halign}\raggedright\or + \w@csarg\let{aeb@\aeb@section@type @halign}\centering\or + \w@csarg\let{aeb@\aeb@section@type @halign}\raggedleft\fi }{\PackageWarning{webpro}{Bad choice for halign, permissible values are l, c and r. Try again}}% } \@tfor\@@tmp:={\aeb@section@halign\raggedright} -{\aeb@subsection@halign\raggedright} -{\aeb@subsubsection@halign\raggedright} -{\aeb@university@halign\centering} -{\aeb@title@halign\centering}{\aeb@author@halign\centering}% -{\aeb@toc@halign\centering}\do -{% + {\aeb@subsection@halign\raggedright} + {\aeb@subsubsection@halign\raggedright} + {\aeb@university@halign\centering} + {\aeb@title@halign\centering}{\aeb@author@halign\centering}% + {\aeb@toc@halign\centering}\do{% \expandafter\getargs\@@tmp \edef\aeb@temp{\noexpand\let\expandafter\noexpand\aeb@argi \expandafter\noexpand\aeb@argii}\aeb@temp @@ -4909,20 +4812,20 @@ % Color, rule, and ding related keys\IndexKey{ding}\IndexKey{color}\IndexKey{ruleheight}% % \IndexKey{ruleheigtht}\IndexKey{numdingcolor} % \begin{macrocode} -\define@key{aebsection}{ding}{\if\aeb@use@section@numbers0 - \webtoksi=\expandafter{\expandafter\protect - \expandafter\web@sel@sec@col\expandafter{\aeb@section@type}#1\ }% - \w@csarg\edef{aeb@\aeb@section@type Num}##1{\the\webtoksi}% - \else\PackageWarning{webpro}{The ding key is not available with a - section numbering system,\MessageBreak - ignoring request for a ding.}\fi +\define@key{aebsection}{ding}{\if\aeb@use@section@numbers\web@Zero + \webtoksi=\expandafter{\expandafter\protect + \expandafter\web@sel@sec@col\expandafter{\aeb@section@type}#1\ }% + \w@csarg\edef{aeb@\aeb@section@type Num}##1{\the\webtoksi}% + \else\PackageWarning{webpro}{The ding key is not available with a + section numbering system,\MessageBreak + ignoring request for a ding.}\fi } \define@key{aebsection}{color}{% - \w@csarg\def{aeb@\aeb@section@type color}{#1}} + \w@csarg\def{aeb@\aeb@section@type color}{#1}} \define@key{aebsection}{ruleheight}{% - \w@csarg\def{aeb@\aeb@section@type ruleheight}{#1}} + \w@csarg\def{aeb@\aeb@section@type ruleheight}{#1}} \define@key{aebsection}{numdingcolor}{% - \w@csarg\def{aeb@\aeb@section@type numdingcolor}{#1}} + \w@csarg\def{aeb@\aeb@section@type numdingcolor}{#1}} % \end{macrocode} % Section color defaults % \begin{macrocode} @@ -4966,7 +4869,7 @@ \def\aeb@authorframecolor{blue} \def\aeb@tocframecolor{blue} \define@key{aebsection}{bgcolor}{% - \w@csarg\def{aeb@\aeb@section@type bgcolor}{#1}} + \w@csarg\def{aeb@\aeb@section@type bgcolor}{#1}} \def\aeb@sectionbgcolor{cornsilk} \def\aeb@subsectionbgcolor{cornsilk} \def\aeb@subsubsectionbgcolor{cornsilk} @@ -4975,7 +4878,7 @@ \def\aeb@authorbgcolor{cornsilk} \def\aeb@tocbgcolor{cornsilk} \define@key{aebsection}{shadowcolor}{% - \w@csarg\def{aeb@\aeb@section@type shadowcolor}{#1}} + \w@csarg\def{aeb@\aeb@section@type shadowcolor}{#1}} \def\aeb@sectionshadowcolor{black} \def\aeb@subsectionshadowcolor{black} \def\aeb@subsubsectionshadowcolor{black} @@ -4987,9 +4890,9 @@ % Indent\IndexKey{indent} % \begin{macrocode} \define@key{aebsection}{indent}[0pt]{% - \edef\web@argi{#1}\ifx\web@argi\@empty - \def\web@argi{0pt}\fi - \w@csarg\edef{aeb@\aeb@section@type @indent}{\web@argi}} + \edef\web@argi{#1}\ifx\web@argi\@empty + \def\web@argi{0pt}\fi + \w@csarg\edef{aeb@\aeb@section@type @indent}{\web@argi}} \def\aeb@section@indent{\z@} \def\aeb@subsection@indent{\z@} \def\aeb@subsubsection@indent{\z@} @@ -5001,7 +4904,7 @@ %Other keys\IndexKey{beforeskip}\IndexKey{afterskip} % \begin{macrocode} \define@key{aebsection}{beforeskip}{% - \w@csarg\def{aeb@\aeb@section@type @beforeskip}{#1}} + \w@csarg\def{aeb@\aeb@section@type @beforeskip}{#1}} \def\aeb@section@beforeskip{-3ex\@plus -1ex \@minus-.2ex} \def\aeb@subsection@beforeskip{-2.5ex\@plus -1ex \@minus -.2ex} \def\aeb@subsubsection@beforeskip{-2ex\@plus -1ex \@minus -.2ex} @@ -5010,7 +4913,7 @@ \def\aeb@author@beforeskip{-1ex\@plus -1ex \@minus-.2ex} \def\aeb@toc@beforeskip{-3ex\@plus -1ex \@minus-.2ex} \define@key{aebsection}{afterskip}{% - \w@csarg\def{aeb@\aeb@section@type @afterskip}{#1}} + \w@csarg\def{aeb@\aeb@section@type @afterskip}{#1}} \def\aeb@section@afterskip{1ex\@plus .2ex} \def\aeb@subsection@afterskip{1ex\@plus .2ex} \def\aeb@subsubsection@afterskip{.5ex\@plus .2ex} @@ -5032,9 +4935,9 @@ % the title or author. This alignment will be across the width of the text region. % \begin{macrocode} \define@key{aebsection}{xhalign}{% - \edef\aeb@temp@expand{\noexpand\XKV@cc+{#1}}% - \aeb@temp@expand{l,c,r}{% - \w@csarg\def{halign\aeb@section@type}{#1}% + \edef\aeb@temp@expand{\noexpand\XKV@cc+{#1}}% + \aeb@temp@expand{l,c,r}{% + \w@csarg\def{halign\aeb@section@type}{#1}% }{\PackageWarning{webpro}{Bad choice for xhalign, permissible values are l, c and r. Try again}}% } @@ -5053,58 +4956,56 @@ % \end{macrocode} % Commands that hold the reset values. % \begin{macrocode} -\def\aeb@reset@section@fonts{% - \normalfont\normalsize - \ifcase\aeb@section@typeIndex\relax - \let\aeb@section@usefont\@empty - \let\aeb@section@fontfamily\aeb@defaultfamily - \let\aeb@section@fontseries\bfseries - \let\aeb@section@fontshape\upshape - \let\aeb@section@fontsize\Large - \or - \let\aeb@subsection@usefont\@empty - \let\aeb@subsection@fontfamily\aeb@defaultfamily - \let\aeb@subsection@fontseries\bfseries - \let\aeb@subsection@fontshape\upshape - \let\aeb@subsection@fontsize\large - \or - \let\aeb@subsubsection@usefont\@empty - \let\aeb@subsubsection@fontfamily\aeb@defaultfamily - \let\aeb@subsubsection@fontseries\bfseries - \let\aeb@subsubsection@fontshape\upshape - \let\aeb@subsubsection@fontsize\normalsize - \fi +\def\aeb@reset@section@fonts{\normalfont\normalsize + \ifcase\aeb@section@typeIndex\relax + \let\aeb@section@usefont\@empty + \let\aeb@section@fontfamily\aeb@defaultfamily + \let\aeb@section@fontseries\bfseries + \let\aeb@section@fontshape\upshape + \let\aeb@section@fontsize\Large + \or + \let\aeb@subsection@usefont\@empty + \let\aeb@subsection@fontfamily\aeb@defaultfamily + \let\aeb@subsection@fontseries\bfseries + \let\aeb@subsection@fontshape\upshape + \let\aeb@subsection@fontsize\large + \or + \let\aeb@subsubsection@usefont\@empty + \let\aeb@subsubsection@fontfamily\aeb@defaultfamily + \let\aeb@subsubsection@fontseries\bfseries + \let\aeb@subsubsection@fontshape\upshape + \let\aeb@subsubsection@fontsize\normalsize + \fi } -\def\aeb@reset@section@all{% - \aeb@reset@section@fonts - \ifcase\aeb@section@typeIndex\relax - \let\aeb@section@halign\raggedright - \def\aeb@sectioncolor{blue}% - \def\aeb@sectionshadowcolor{black}% - \let\aeb@section@special=\@empty - \def\aeb@section@beforeskip{-3ex\@plus -1ex \@minus-.2ex}% - \def\aeb@section@afterskip{1ex\@plus .2ex}% - \def\aeb@sectionframecolor{blue}% - \def\aeb@sectionframecolor{cornsilk}% - \or - \let\aeb@subsection@halign\raggedright - \def\aeb@subsectioncolor{blue}% - \def\aeb@subsectionshadowcolor{black}% - \let\aeb@subsection@special=\@empty - \def\aeb@subsection@beforeskip{-2.5ex\@plus-1ex \@minus-.2ex}% - \def\aeb@subsection@afterskip{1ex\@plus .2ex}% - \def\aeb@subsectionframecolor{blue}% - \def\aeb@subsectionframecolor{cornsilk}% - \or - \let\aeb@subsubsection@halign\raggedright - \def\aeb@subsubsectioncolor{blue}% - \def\aeb@subsubsectionshadowcolor{black}% - \let\aeb@subsubsection@special=\@empty - \def\aeb@subsubsection@beforeskip{-2ex\@plus-1ex \@minus-.2ex}% - \def\aeb@subsubsection@afterskip{1ex\@plus .2ex}% - \def\aeb@subsubsectionframecolor{blue}% - \def\aeb@subsubsectionframecolor{cornsilk}% - \fi +\def\aeb@reset@section@all{\aeb@reset@section@fonts + \ifcase\aeb@section@typeIndex\relax + \let\aeb@section@halign\raggedright + \def\aeb@sectioncolor{blue}% + \def\aeb@sectionshadowcolor{black}% + \let\aeb@section@special=\@empty + \def\aeb@section@beforeskip{-3ex\@plus -1ex \@minus-.2ex}% + \def\aeb@section@afterskip{1ex\@plus .2ex}% + \def\aeb@sectionframecolor{blue}% + \def\aeb@sectionframecolor{cornsilk}% + \or + \let\aeb@subsection@halign\raggedright + \def\aeb@subsectioncolor{blue}% + \def\aeb@subsectionshadowcolor{black}% + \let\aeb@subsection@special=\@empty + \def\aeb@subsection@beforeskip{-2.5ex\@plus-1ex \@minus-.2ex}% + \def\aeb@subsection@afterskip{1ex\@plus .2ex}% + \def\aeb@subsectionframecolor{blue}% + \def\aeb@subsectionframecolor{cornsilk}% + \or + \let\aeb@subsubsection@halign\raggedright + \def\aeb@subsubsectioncolor{blue}% + \def\aeb@subsubsectionshadowcolor{black}% + \let\aeb@subsubsection@special=\@empty + \def\aeb@subsubsection@beforeskip{-2ex\@plus-1ex \@minus-.2ex}% + \def\aeb@subsubsection@afterskip{1ex\@plus .2ex}% + \def\aeb@subsubsectionframecolor{blue}% + \def\aeb@subsubsectionframecolor{cornsilk}% + \fi } % \end{macrocode} % Here I've taken the \cs{section} command, as defined in \textsf{web}, @@ -5112,91 +5013,92 @@ % This helps to keep track of the page of the current section; used % with the panel table of contents. % \begin{macrocode} -\renewcommand{\section}{% dps1 - \renewcommand{\@seccntformat}[1]{\aeb@sectionNum{##1}}% - \@startsection{section}{1}{\aeb@section@indent}% - {\aeb@section@beforeskip}{\aeb@section@afterskip}% - {\noindent\xdef\aeb@sectionpage{\the\c@page}% - \def\aeb@section@type{section}% - \aeb@section@usefont\aeb@section@fontfamily\aeb@section@fontseries - \aeb@section@fontshape\aeb@section@fontsize\aeb@section@halign - \color{\aeb@sectioncolor}\aeb@section@special}} -\renewcommand\subsection{% dps1 - \renewcommand{\@seccntformat}[1]{\aeb@subsectionNum{##1}}% - \@startsection{subsection}{2}{\aeb@subsection@indent}% - {\aeb@subsection@beforeskip}{\aeb@subsection@afterskip}% - {\noindent\def\aeb@section@type{subsection}% - \aeb@subsection@usefont\aeb@subsection@fontfamily - \aeb@subsection@fontseries\aeb@subsection@fontshape - \aeb@subsection@fontsize\aeb@subsection@halign - \color{\aeb@subsectioncolor}\aeb@subsection@special}} +\renewcommand{\section}{% + \renewcommand{\@seccntformat}[1]{\aeb@sectionNum{##1}}% + \@startsection{section}{1}{\aeb@section@indent}% + {\aeb@section@beforeskip}{\aeb@section@afterskip}% + {\noindent\xdef\aeb@sectionpage{\the\c@page}% + \def\aeb@section@type{section}% + \aeb@section@usefont\aeb@section@fontfamily\aeb@section@fontseries + \aeb@section@fontshape\aeb@section@fontsize\aeb@section@halign + \color{\aeb@sectioncolor}\aeb@section@special}} +\renewcommand\subsection{% + \renewcommand{\@seccntformat}[1]{\aeb@subsectionNum{##1}}% + \@startsection{subsection}{2}{\aeb@subsection@indent}% + {\aeb@subsection@beforeskip}{\aeb@subsection@afterskip}% + {\noindent\def\aeb@section@type{subsection}% + \aeb@subsection@usefont\aeb@subsection@fontfamily + \aeb@subsection@fontseries\aeb@subsection@fontshape + \aeb@subsection@fontsize\aeb@subsection@halign + \color{\aeb@subsectioncolor}\aeb@subsection@special}} \def\subsubDefaultDing#1{\def\web@subsubDefaultDing{{#1}}} \subsubDefaultDing{\textrm\textbullet} -\renewcommand\subsubsection{% dps1 - \renewcommand{\@seccntformat}[1]{\aeb@subsubsectionNum{##1}}% - \@startsection{subsubsection}{3}{\aeb@subsubsection@indent}% - {\aeb@subsubsection@beforeskip}{\aeb@subsubsection@afterskip}% - {\noindent\def\aeb@section@type{subsubsection}% - \aeb@subsubsection@usefont\aeb@subsubsection@fontfamily - \aeb@subsubsection@fontseries\aeb@subsubsection@fontshape - \aeb@subsubsection@fontsize\aeb@subsubsection@halign - \color{\aeb@subsubsectioncolor}\aeb@subsubsection@special}} +\renewcommand\subsubsection{% + \renewcommand{\@seccntformat}[1]{\aeb@subsubsectionNum{##1}}% + \@startsection{subsubsection}{3}{\aeb@subsubsection@indent}% + {\aeb@subsubsection@beforeskip}{\aeb@subsubsection@afterskip}% + {\noindent\def\aeb@section@type{subsubsection}% + \aeb@subsubsection@usefont\aeb@subsubsection@fontfamily + \aeb@subsubsection@fontseries\aeb@subsubsection@fontshape + \aeb@subsubsection@fontsize\aeb@subsubsection@halign + \color{\aeb@subsubsectioncolor}\aeb@subsubsection@special}} \renewcommand*\thesection{% - \if\aeb@use@section@numbers1\arabic{section}\fi} + \if\aeb@use@section@numbers\web@One\arabic{section}\fi} \renewcommand*\thesubsection{% - \if\aeb@use@section@numbers1\thesection.\arabic{subsection}\fi} + \if\aeb@use@section@numbers\web@One\thesection.\arabic{subsection}\fi} \renewcommand*{\thesubsubsection}{% - \if\aeb@use@section@numbers1% - \if@defaultsubsubding\web@subsubDefaultDing - \else\thesubsection.\arabic{subsubsection}\fi - \fi} + \if\aeb@use@section@numbers\web@One + \if@defaultsubsubding\web@subsubDefaultDing + \else\thesubsection.\arabic{subsubsection}\fi + \fi +} % \end{macrocode} % We attempt to format the university, title and author in the same way as % we do the sections % \begin{macrocode} \newcommand{\sectionTitle}{\aeb@sectionTitle*} \newcommand{\aeb@sectionTitle}{% - \renewcommand{\@seccntformat}[1]{\aeb@titleNum{##1}}% - \@startsection{section}{1}{\aeb@title@indent}% - {\aeb@title@beforeskip}{\aeb@title@afterskip}% - {\xdef\aeb@titlepage{\the\c@page}\def\aeb@section@type{title}% - \aeb@title@usefont\aeb@title@fontfamily\aeb@title@fontseries - \aeb@title@fontshape\aeb@title@fontsize\aeb@title@halign - \ifx\webtitle@color\@empty\else\color{\aeb@titlecolor}\fi - \aeb@title@special}} + \renewcommand{\@seccntformat}[1]{\aeb@titleNum{##1}}% + \@startsection{section}{1}{\aeb@title@indent}% + {\aeb@title@beforeskip}{\aeb@title@afterskip}% + {\xdef\aeb@titlepage{\the\c@page}\def\aeb@section@type{title}% + \aeb@title@usefont\aeb@title@fontfamily\aeb@title@fontseries + \aeb@title@fontshape\aeb@title@fontsize\aeb@title@halign + \ifx\webtitle@color\@empty\else\color{\aeb@titlecolor}\fi + \aeb@title@special}} \newcommand{\sectionAuthor}{\aeb@sectionAuthor*} \newcommand{\aeb@sectionAuthor}{% - \renewcommand{\@seccntformat}[1]{\aeb@authorNum{##1}}% - \@startsection{section}{1}{\aeb@author@indent}% - {\aeb@author@beforeskip}{\aeb@author@afterskip}% - {\xdef\aeb@titlepage{\the\c@page}\def\aeb@section@type{author}% - \aeb@author@usefont\aeb@author@fontfamily\aeb@author@fontseries - \aeb@author@fontshape\aeb@author@fontsize\aeb@author@halign - \ifx\webauthor@color\@empty\else\color{\aeb@authorcolor}\fi - \aeb@author@special}} + \renewcommand{\@seccntformat}[1]{\aeb@authorNum{##1}}% + \@startsection{section}{1}{\aeb@author@indent}% + {\aeb@author@beforeskip}{\aeb@author@afterskip}% + {\xdef\aeb@titlepage{\the\c@page}\def\aeb@section@type{author}% + \aeb@author@usefont\aeb@author@fontfamily\aeb@author@fontseries + \aeb@author@fontshape\aeb@author@fontsize\aeb@author@halign + \ifx\webauthor@color\@empty\else\color{\aeb@authorcolor}\fi + \aeb@author@special}} \newcommand{\sectionUniversity}{\aeb@sectionUniversity*} \newcommand{\aeb@sectionUniversity}{% - \renewcommand{\@seccntformat}[1]{\aeb@universityNum{##1}}% - \@startsection{section}{1}{\aeb@university@indent}% - {\aeb@university@beforeskip}{\aeb@university@afterskip}% - {\xdef\aeb@titlepage{\the\c@page}\def\aeb@section@type{university}% - \aeb@university@usefont\aeb@university@fontfamily - \aeb@university@fontseries\aeb@university@fontshape - \aeb@university@fontsize\aeb@university@halign - \ifx\webuniversity@color\@empty\else - \color{\aeb@universitycolor}\fi\aeb@university@special}} + \renewcommand{\@seccntformat}[1]{\aeb@universityNum{##1}}% + \@startsection{section}{1}{\aeb@university@indent}% + {\aeb@university@beforeskip}{\aeb@university@afterskip}% + {\xdef\aeb@titlepage{\the\c@page}\def\aeb@section@type{university}% + \aeb@university@usefont\aeb@university@fontfamily + \aeb@university@fontseries\aeb@university@fontshape + \aeb@university@fontsize\aeb@university@halign + \ifx\webuniversity@color\@empty\else + \color{\aeb@universitycolor}\fi\aeb@university@special}} \newcommand{\sectionToc}{\aeb@sectionToc*} \newcommand{\aeb@sectionToc}{% - \renewcommand{\@seccntformat}[1]{\aeb@tocNum{##1}}% - \@startsection{section}{1}{\aeb@toc@indent}% - {\aeb@toc@beforeskip}{\aeb@toc@afterskip}% - {\hypertarget{webtoc}{}% - \xdef\aeb@titlepage{\the\c@page}\def\aeb@section@type{toc}% - \aeb@toc@usefont\aeb@toc@fontfamily - \aeb@toc@fontseries\aeb@toc@fontshape - \aeb@toc@fontsize\aeb@toc@halign - \ifx\aeb@toccolor\@empty\else - \color{\aeb@toccolor}\fi\aeb@toc@special}} + \renewcommand{\@seccntformat}[1]{\aeb@tocNum{##1}}% + \@startsection{section}{1}{\aeb@toc@indent}% + {\aeb@toc@beforeskip}{\aeb@toc@afterskip}% + {\hypertarget{webtoc}{}% + \xdef\aeb@titlepage{\the\c@page}\def\aeb@section@type{toc}% + \aeb@toc@usefont\aeb@toc@fontfamily + \aeb@toc@fontseries\aeb@toc@fontshape + \aeb@toc@fontsize\aeb@toc@halign + \ifx\aeb@toccolor\@empty\else + \color{\aeb@toccolor}\fi\aeb@toc@special}} % \end{macrocode} % % \subsection{Layout Commands}\label{sectionLayout} @@ -5213,20 +5115,20 @@ % globally reset the values. Here we process the keys devoted to the section layout. % \begin{macrocode} \def\save@prtscr{\global\let\prtscr@save\prtscr - \global\let\prtscr\prtscrA} + \global\let\prtscr\prtscrA} \def\restore@prtscr{\global\let\prtscr\prtscr@save} \newcommand{\sectionLayout}[1]{\save@prtscr - \setkeys{aebsection}{type=section,color=blue,ruleheight=1pt}% - \protected@edef\aeb@temp{\noexpand\setkeys{aebsection}{#1}}% - \aeb@temp\restore@prtscr} + \setkeys{aebsection}{type=section,color=blue,ruleheight=1pt}% + \protected@edef\x{\noexpand\setkeys{aebsection}{#1}}\x + \aeb@temp\restore@prtscr} \newcommand{\subsectionLayout}[1]{\save@prtscr - \setkeys{aebsection}{type=subsection,color=blue,ruleheight=1pt}% - \protected@edef\aeb@temp{\noexpand\setkeys{aebsection}{#1}}% - \aeb@temp\restore@prtscr} + \setkeys{aebsection}{type=subsection,color=blue,ruleheight=1pt}% + \protected@edef\x{\noexpand\setkeys{aebsection}{#1}}\x + \aeb@temp\restore@prtscr} \newcommand{\subsubsectionLayout}[1]{\save@prtscr - \setkeys{aebsection}{type=subsubsection,color=blue,ruleheight=1pt}% - \protected@edef\aeb@temp{\noexpand\setkeys{aebsection}{#1}}% - \aeb@temp\restore@prtscr} + \setkeys{aebsection}{type=subsubsection,color=blue,ruleheight=1pt}% + \protected@edef\x{\noexpand\setkeys{aebsection}{#1}}\x + \aeb@temp\restore@prtscr} % \end{macrocode} % \end{macro} % \end{macro} @@ -5239,24 +5141,24 @@ % title and author on the title page of the presentation. % \begin{macrocode} \newcommand{\universityLayout}[1]{\save@prtscr - \setkeys{aebsection}{type=university}% - \protected@edef\aeb@temp{\noexpand\setkeys{aebsection}{#1}}% - \aeb@temp\restore@prtscr} + \setkeys{aebsection}{type=university}% + \protected@edef\x{\noexpand\setkeys{aebsection}{#1}}\x + \aeb@temp\restore@prtscr} \universityLayout{fontsize={\prtscrA{large}{normalsize}}} \newcommand{\titleLayout}[1]{\save@prtscr - \setkeys{aebsection}{type=title}% - \protected@edef\aeb@temp{\noexpand\setkeys{aebsection}{#1}}% - \aeb@temp\restore@prtscr} + \setkeys{aebsection}{type=title}% + \protected@edef\x{\noexpand\setkeys{aebsection}{#1}}\x + \aeb@temp\restore@prtscr} \titleLayout{fontsize={\prtscrA{Large}{normalsize}}} \newcommand{\authorLayout}[1]{\save@prtscr - \setkeys{aebsection}{type=author}% - \protected@edef\aeb@temp{\noexpand\setkeys{aebsection}{#1}}% - \aeb@temp\restore@prtscr} + \setkeys{aebsection}{type=author}% + \protected@edef\x{\noexpand\setkeys{aebsection}{#1}}\x + \aeb@temp\restore@prtscr} \authorLayout{fontsize={\prtscrA{large}{normalsize}}} \newcommand{\tocLayout}[1]{\save@prtscr - \setkeys{aebsection}{type=toc,color=\web@tocColor}% - \protected@edef\aeb@temp{\noexpand\setkeys{aebsection,aebToc}{#1}}% - \aeb@temp\restore@prtscr} + \setkeys{aebsection}{type=toc,color=\web@tocColor}% + \protected@edef\x{\noexpand\setkeys{aebsection,aebToc}{#1}}\x + \aeb@temp\restore@prtscr} \tocLayout{fontsize=Large} % \end{macrocode} % \end{macro} @@ -5274,8 +5176,8 @@ % below, and also in the \texttt{ding} key from the \texttt{aebsection} family. % \begin{macrocode} \def\web@sel@sec@col#1{\ifShadow - \color{\@nameuse{aeb@#1shadowcolor}}\else - \color{\@nameuse{aeb@#1numdingcolor}}\fi} + \color{\@nameuse{aeb@#1shadowcolor}}\else + \color{\@nameuse{aeb@#1numdingcolor}}\fi} % \end{macrocode} % \begin{macro}{\useSectionNumbers} % \begin{macro}{\noSectionNumbers} @@ -5285,29 +5187,29 @@ % value at no, i.e., I've executed \cs{noSectionNumbers}. % \begin{macrocode} \newcommand{\useSectionNumbers} -{% dps1 - \let\aeb@use@section@numbers1\relax - \def\aeb@sectionNum##1{\protect\web@sel@sec@col{section}% - \@nameuse{the##1}\web@finalDot\ }% - \def\aeb@subsectionNum##1{\protect\web@sel@sec@col{subsection}% - \@nameuse{the##1}\web@finalDot\ }% - \def\aeb@subsubsectionNum##1{% - \protect\web@sel@sec@col{subsubsection}% +{% + \let\aeb@use@section@numbers\web@One + \def\aeb@sectionNum##1{\protect + \web@sel@sec@col{section}\@nameuse{the##1}\web@finalDot\ }% + \def\aeb@subsectionNum##1{\protect + \web@sel@sec@col{subsection}\@nameuse{the##1}\web@finalDot\ }% + \def\aeb@subsubsectionNum##1{\protect + \web@sel@sec@col{subsubsection}% \@nameuse{the##1}\if@defaultsubsubding\else\web@finalDot\fi\ }% \def\sectionmark##1{\markright{##1}}% } \newcommand{\noSectionNumbers} {% - \ifx\web@latextoc\web@YES - \PackageInfo{web}{The nobullets or latextoc option - taken,\MessageBreak - ignoring \string\noSectionNumbers}% - \else - \let\aeb@use@section@numbers0\relax - \let\aeb@sectionNum\@gobble - \let\aeb@subsectionNum\@gobble - \let\aeb@subsubsectionNum\@gobble - \fi + \ifx\web@latextoc\web@YES + \PackageInfo{web}{The nobullets or latextoc option + taken,\MessageBreak + ignoring \string\noSectionNumbers}% + \else + \let\aeb@use@section@numbers\web@Zero + \let\aeb@sectionNum\@gobble + \let\aeb@subsectionNum\@gobble + \let\aeb@subsubsectionNum\@gobble + \fi } \useSectionNumbers % \end{macrocode} @@ -5331,11 +5233,11 @@ % \IndexKey{urlColor} % \begin{macrocode} \define@key{aebcolordesign}{universityColor}{\universityColor{#1}} - \def\aeb@universitycolor{\webuniversity@color} + \def\aeb@universitycolor{\webuniversity@color} \define@key{aebcolordesign}{titleColor}{\titleColor{#1}} - \def\aeb@titlecolor{\webtitle@color} + \def\aeb@titlecolor{\webtitle@color} \define@key{aebcolordesign}{authorColor}{\authorColor{#1}} - \def\aeb@authorcolor{\webauthor@color} + \def\aeb@authorcolor{\webauthor@color} \define@key{aebcolordesign}{textBgColor}{\textBgColor{#1}} \define@key{aebcolordesign}{panelBgColor}{\panelBgColor{#1}} \define@key{aebcolordesign}{linkColor}{\def\@linkcolor{#1}} @@ -5391,7 +5293,7 @@ \ddDingTocColor{blue} \dddDingTocColor{webgreen} \@tfor\@@tmp:={d@DingToc}{dd@DingToc}{ddd@DingToc}\do - {\w@csarg\let{\@@tmp}\@empty} + {\w@csarg\let{\@@tmp}\@empty} % \end{macrocode} % \begin{macro}{\selectTocDings} % This is an \textsf{xkeyval} interface to setting the dings used by @@ -5411,9 +5313,9 @@ % the dings there. % \begin{macrocode} \def\@setTocDings{% - \ifx\d@DingToc\@empty\else\dDing{\d@DingToc}\fi - \ifx\dd@DingToc\@empty\else\ddDing{\dd@DingToc}\fi - \ifx\ddd@DingToc\@empty\else\dddDing{\ddd@DingToc}\fi + \ifx\d@DingToc\@empty\else\dDing{\d@DingToc}\fi + \ifx\dd@DingToc\@empty\else\ddDing{\dd@DingToc}\fi + \ifx\ddd@DingToc\@empty\else\dddDing{\ddd@DingToc}\fi } % \end{macrocode} % \end{macro}% Now, if for paper\dots @@ -5426,9 +5328,9 @@ % comment environments one \texttt{forpaper} and another for % \texttt{forscreen}. % \begin{macrocode} - \includecomment{forpaper}\excludecomment{forscreen} + \includecomment{forpaper}\excludecomment{forscreen} \else - \includecomment{forscreen}\excludecomment{forpaper} + \includecomment{forscreen}\excludecomment{forpaper} \fi % \end{macrocode} % \end{environment} @@ -5444,16 +5346,16 @@ % D. P. Story % \newcommand{\setupFullwidth}{% - \setlength{\textwidth}{\paperwidth}% - \advance\textwidth-2in - \setlength{\linewidth}{\textwidth}% - \setlength{\columnseprule}{0pt}% - \setlength{\oddsidemargin}{0in}% - \setlength{\evensidemargin}{0in}% + \setlength{\textwidth}{\paperwidth}% + \advance\textwidth-2in + \setlength{\linewidth}{\textwidth}% + \setlength{\columnseprule}{0pt}% + \setlength{\oddsidemargin}{0in}% + \setlength{\evensidemargin}{0in}% } \makeatletter \def\clindx{\ifcodeline@index\expandafter\@firstoftwo\else - \expandafter\@secondoftwo\fi} + \expandafter\@secondoftwo\fi} \GlossaryPrologue{\section{Change History}} \IndexPrologue{\section{Index}\hfuzz\linewidth \parbox{\linewidth}{Numbers written in italic |