diff options
Diffstat (limited to 'texmf-dist/source/latex/acrotex')
-rw-r--r-- | texmf-dist/source/latex/acrotex/eforms.dtx | 126 | ||||
-rw-r--r-- | texmf-dist/source/latex/acrotex/exerquiz.dtx | 112 | ||||
-rw-r--r-- | texmf-dist/source/latex/acrotex/web.dtx | 4 |
3 files changed, 179 insertions, 63 deletions
diff --git a/texmf-dist/source/latex/acrotex/eforms.dtx b/texmf-dist/source/latex/acrotex/eforms.dtx index 8f5768ea..b7fecae8 100644 --- a/texmf-dist/source/latex/acrotex/eforms.dtx +++ b/texmf-dist/source/latex/acrotex/eforms.dtx @@ -16,7 +16,7 @@ %</copyright> %<package>\NeedsTeXFormat{LaTeX2e} %<package>\ProvidesPackage{eforms} -%<package> [2018/08/16 v2.9.20 Provides general eforms support (dps)] +%<package> [2018/11/27 v2.9.22 Provides general eforms support (dps)] %<*driver> \documentclass{ltxdoc} \usepackage[colorlinks,hyperindex=false]{hyperref}[2012/10/12] @@ -626,10 +626,24 @@ % \end{macrocode} % \DescribeMacro{\AP} Appearance dictionary, used mostly with check boxes % to define the `On' value. +% \changes{v2.9.21}{2018/11/10}{Modified \string\cs{@eqAP}, added two internal +% commands \string\cs{eq@@On} and \string\cs{eq@@Off}} +% Within \cs{@eqAP}, \DescribeMacro\Off\cs{Off} and \DescribeMacro\On\cs{On} are +% \cs{let} to \cs{eq@@Off} and \cs{eq@On} to make +% it `easy' to assign on and off values in the case of icon appearances. % \begin{macrocode} \def\@eqAP#1{\def\eq@arg{#1}\ifx\eq@arg\@empty - \let\eq@AP\@empty\else\def\eq@AP{/AP<<#1>>}\fi}% - \let\eq@AP\@empty + \let\eq@AP\@empty\else\let\Off\eq@@Off\let\On\eq@@On + \ifx\annot@type\annot@type@button + \let\N\eq@pb@N\else\let\N\eq@cbrb@N\fi + \edef\eq@AP{/AP<<#1>>}\fi}\let\eq@AP\@empty +\def\eq@pb@N#1{/N \ifpdf #1 \space 0 R\else + \ifxetex #1\else{#1}\fi\fi} +\def\eq@cbrb@N#1{/N <<#1>>} +\def\eq@@On#1#2{/#1 \ifpdf #2 \space 0 R\else + \ifxetex #2\else{#2}\fi\fi} +\def\eq@@Off#1{/Off \ifpdf #1 \space 0 R\else + \ifxetex #1\else{#1}\fi\fi} % \end{macrocode} % In the \texttt{AP} dictionary for checkboxes is the `On' value. % It is introduced into \texttt{AP} by passing a TeX parameter @@ -1192,49 +1206,74 @@ % \cs{eq@IconMK} is empty. % \begin{macrocode} \def\eq@define@IconMK{\def\eq@IconMK{\eq@I\eq@RI\eq@IX\eq@TP - /IF<<\eq@SW\eq@ST\eq@PA\eq@FB>>}} + /IF<<\eq@SW\eq@ST\eq@PA\eq@FB>>}} \let\eq@IconMK\@empty % \end{macrocode} % \DescribeMacro{\I} an indirect reference to a form XObject defining the % buttons's \emph{normal icon} % \changes{v2.9}{2016/05/09}{Modified \string\cs{I}, \string\cs{RI}, and % \string\cs{IX} to accommodate pdftex for null argument.} +% \changes{v2.9.21}{2018/11/10}{Modified \string\cs{@eqI}, \string\cs{@eqRI}, +% and \string\cs{@eqIX} in the case of pdftex} % \begin{macrocode} -\ifpdf\def\eq@relRef#1{0 0 R}\else %{#1\space 0 R} +\def\eq@relRef@null#1{0 0 R} +\ifluatex\def\eq@relRef#1{#1 \space 0 R}\else + \ifpdf\def\eq@relRef#1{#1\space 0 R}\else \ifxetex\def\eq@relRef#1{#1}\else - \def\eq@relRef#1{{#1}}\fi\fi + \def\eq@relRef#1{{#1}}\fi\fi\fi +\def\@eqimportIcons#1{\ifpdfmarkup\ifx\annot@type\annot@type@button + \def\ef@arg{#1}\ifx\ef@arg\ef@y + \ifx\eq@I\@empty\@eqI{null}\fi\fi\fi\fi} \def\ef@null{null} -\def\@eqI#1{\ifx\annot@type\annot@type@button - \def\eq@arg{#1}\ifx\eq@arg\@empty - \let\eq@I\@empty\else - \def\eq@I{/I \eq@relRef{#1}}% - \ifpdf\ifx\eq@arg\ef@null - \def\eq@I{/I 0 0 R}\fi\fi - \eq@define@IconMK\fi\fi} +\def\@eqI#1{% + \ifx\annot@type\annot@type@button + \def\eq@arg{#1}% + \ifx\eq@arg\@empty + \let\eq@I\@empty\else + \ifx\eq@arg\ef@null + \def\eq@I{/I \ef@null}\else + \def\eq@I{/I \eq@relRef{#1}}% + \fi + \fi + \eq@define@IconMK + \fi +} \def\eq@I{} % \end{macrocode} % \DescribeMacro{\RI} an indirect reference to a form XObject defining % the buttons's \emph{rollover icon} % \begin{macrocode} -\def\@eqRI#1{\ifx\annot@type\annot@type@button - \def\eq@arg{#1}\ifx\eq@arg\@empty - \let\eq@RI\@empty\else - \def\eq@RI{/RI \eq@relRef{#1}}% - \ifpdf\ifx\eq@arg\ef@null - \def\eq@RI{/RI 0 0 R}\fi\fi - \eq@define@IconMK\fi\fi} +\def\@eqRI#1{% + \ifx\annot@type\annot@type@button + \def\eq@arg{#1}% + \ifx\eq@arg\@empty + \let\eq@RI\@empty\else + \ifx\eq@arg\ef@null + \def\eq@RI{/RI \ef@null}\else + \def\eq@RI{/RI \eq@relRef{#1}}% + \fi + \fi + \eq@define@IconMK + \fi +} \def\eq@RI{} % \end{macrocode} % \DescribeMacro{\IX} an indirect reference to a form XObject defining % the buttons's \emph{down icon} % \begin{macrocode} -\def\@eqIX#1{\ifx\annot@type\annot@type@button - \def\eq@arg{#1}\ifx\eq@arg\@empty - \let\eq@IX\@empty\else - \def\eq@IX{/IX \eq@relRef{#1}}% - \ifpdf\ifx\eq@arg\ef@null - \def\eq@IX{/IX 0 0 R}\fi\fi - \eq@define@IconMK\fi\fi} +\def\@eqIX#1{% + \ifx\annot@type\annot@type@button + \def\eq@arg{#1}% + \ifx\eq@arg\@empty + \let\eq@IX\@empty\else + \ifx\eq@arg\ef@null + \def\eq@IX{/IX \ef@null}\else + \def\eq@IX{/IX \eq@relRef{#1}}% + \fi + \fi + \eq@define@IconMK + \fi +} \def\eq@IX{} % \end{macrocode} % \DescribeMacro{\TP} A code indicating the \texttt{layout} of the text and icon; these codes are @@ -1280,13 +1319,15 @@ % \begin{macrocode} \def\@eqmkIns#1{\def\eq@mkIns{#1}}\def\eq@mkIns{} % \end{macrocode} -% \paragraph*{Additional entries specific to choice fields:} \texttt{Opt, TI, I} +% \paragraph*{Additional entries specific to choice fields:} \texttt{Opt, TI, I}\par\medskip\noindent +% An array of options in the list % \begin{macrocode} -% an array of options in the list \def\@eqOpt#1{\def\eq@arg{#1}\ifx\eq@arg\@empty \let\eq@Opt\@empty\else\def\eq@Opt{/Opt [#1]}\fi} \def\eq@Opt{} -% for scrollable list boxes, the top index. +% \end{macrocode} +% For scrollable list boxes, the top index. +% \begin{macrocode} \def\@eqTI#1{\def\eq@arg{#1}\ifx\eq@arg\@empty \let\eq@TI\@empty\else\def\eq@TI{/TI #1}\fi} \def\eq@TI{} @@ -2607,8 +2648,15 @@ % \end{macrocode} % \end{macro} % \subsection{Button Fields}\label{button} -% Here is the field template for push button fields. +% Here is the field template for push button fields.\par\medskip\noindent +% +% (2018/11/10) \cs{eq@APX} determines if \cs{eq@I} is empty, if not we supply the normal appearance +% for the button to be the same appearance as set by \cs{eq@I}. +% \changes{v2.9.21}{2018/11/10}{Introduce \string\cs{eq@APX} an `intelligent' AP key} % \begin{macrocode} +\def\eq@APX{\ifx\eq@I\@empty\eq@AP\else + /AP<< \expandafter\get@NIR\eq@I\@nil\space>>\fi} +\def\get@NIR/#1 #2\@nil{/N #2} \def\common@pushButtonCode{% /Subtype/Widget /T (\Fld@name) @@ -2618,12 +2666,15 @@ \eq@H \eq@F /BS <<\eq@W\eq@S >> -\ifx\eq@AP\@empty +% \end{macrocode} +% (2018/11/10) Remove conditional \string\cs{eq@AP}, some PDF viewers +% use AP to build the normal appearance for buttons. +% \changes{v2.9.21}{2018/11/10}{Remove conditional \string\cs{eq@AP} +% in \string\cs{common@pushButtonCode}}. +% \begin{macrocode} /MK <<\eq@R\eq@BC\eq@BG% \ef@kvCA\ef@kvRC\ef@kvAC\eq@IconMK\eq@mkIns>> -\else - \eq@AP -\fi + \eq@APX /DA (\eq@DA) \eq@A\eq@AA \eq@rawPDF @@ -3617,6 +3668,11 @@ \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 +}{} \define@key{eforms}{mlstrut}[\strut]{\@eqmlstrut{#1}} \define@key{eforms}{mlcrackat}[]{\@eqmlcrackat{#1}} \define@key{eforms}{mlcrackinat}[]{\@eqmlcrackinsat{#1}} diff --git a/texmf-dist/source/latex/acrotex/exerquiz.dtx b/texmf-dist/source/latex/acrotex/exerquiz.dtx index 8ba26138..71fa5bb6 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> [2018/03/21 v8.2.2 % +%<package|driver|aebjs|eqexam|randomize|sumrytbls|template> [2018/10/03 v8.2.5 % %<package> Exerquiz: Exercises and Quizzes for LaTeX/PDF package (dps)] %<driver> Exerquiz documentation driver file (dps)] %<aebjs> Exerquiz document level JavaScript (dps)] @@ -2077,7 +2077,7 @@ %\changes{v6.7}{2013/04/07}{Inserted another argument into \cs{eqEXt}} % (2013/04/07) Added another argument into \cs{eqEXt}, used for filtering.\par\medskip % \noindent -% When solutions are written to the SOL file, they are not normally in a group. +% (2018/02/13) When solutions are written to the SOL file, they are not normally in a group. % If you execute \DescribeMacro\makeExSolnsLocalOn\cs{makeExSolnsLocalOn}, each solution % is written in a group. Undo this with \DescribeMacro\makeExSolnsLocalOff\cs{makeExSolnsLocalOff}, % which is the historic default. @@ -2521,8 +2521,11 @@ \exrtnlabelformat\fi}}% \protect\endeqEXt\ifeqforpaper\protect\par{\belowexsolnskip}\fi^^J% %</eqexam> - \ifmakeExSlLocal\protect\endgroup^^J\fi %<*package|eqexam> +% \end{macrocode} +% \changes{v8.2.5}{2018/10/03}{\string\cs{ifmakeExSlLocal} misplaced, corrected} +% \begin{macrocode} + \ifmakeExSlLocal\protect\endgroup^^J\fi } % \end{macrocode} % \end{macro} @@ -7725,9 +7728,12 @@ if (_bOK) {\jsR\jsT % \end{macrocode} % (2018/03/21) Exclude unicode from \cs{RespBoxMath} % \changes{v8.2.2}{2018/03/21}{Exclude unicode from \string\cs{RespBoxMath}} +% \changes{v8.2.3}{2018/09/12}{Made subscript catode 12 in \string\cs{RespBoxMath}} +% \changes{v8.2.4}{2018/09/24}{Defined \string\cs{eqsanitize} for \string\cs{RespBoxMath}} % \begin{macrocode} +\def\eqsanitize{\@makeother\_\@makeother\^\@makeother\&} \newcommand\RespBoxMath{\def\rbFlag{0}\begingroup\Hy@unicodefalse - \@makeother\^\@makeother\&\@RespBox} + \eqsanitize\@RespBox} % \end{macrocode} % Within \cs{RespBoxMath}, \cs{rpl} (\cs{rpl=\texttt{\underbar{r}e\underbar{pl}ace}}) is \cs{let} to \cs{eq@rpl}. The command \cs{rpl}, used % within the variable argument of \cs{RespBoxMath}, declares a multi-letter variable. There are @@ -7809,7 +7815,7 @@ if (_bOK) {\jsR\jsT 0\ifx\grpquestions1,\thegrpquestionno\fi);\r }\r if (!isQuizInitialized("\currQuiz")) {\r\t - \eqObjAlert\space eqAppAlert(InitMsg("\bqlabelISO"),3);\r\t + \eqObjAlert eqAppAlert(InitMsg("\bqlabelISO"),3);\r\t event.rc = false;\r } } @@ -7858,7 +7864,7 @@ if (_bOK) {\jsR\jsT var\eqSP_mathVars=\indepVars;\r\t var\eqSP retn=\processJSfunc(\rbArgs,\compareJSfunc); \fi -\if\@sqTurnOffAlerts1\r\t +\if\@sqTurnOffAlerts1% OnBlurRespBox(retn,"\curr@quiz"); \fi % \end{macrocode} @@ -8303,7 +8309,7 @@ if (_bOK) {\jsR\jsT \if\@sqTurnOffAlerts1retn\else null\fi,"\curr@quiz");} \def\eqObjAlert{% \ifx\eqQuizType\isQZ\ifx\eq@online\eq@YES\ifeq@noquizsolutions - \else if (false)\fi\fi\fi} + \else if (false) \fi\fi\fi} \begin{defineJS}[% \catcode`\@=0\relax\catcode`\%=14\relax]{\AAKqRespBoxTxt} if(event.willCommit){ @@ -11372,15 +11378,33 @@ function requireFormNot(UserAns, regexpr) { \begin{newsegment}{Eq: Support for multi-letter variables} if (!String.prototype.trim) { String.prototype.trim = function () { - return this.replace(/^[\s\string\uFEFF\string\xA0]+|% -[\s\string\uFEFF\string\xA0]+$/g, ''); + return this.replace(/^[\s\string\\uFEFF\string\\xA0]+|% +[\s\string\\uFEFF\string\\xA0]+$/g, ''); }; } +% \end{macrocode} +% \makebox[0pt][r]{\texttt{\_rplVarsBy\hskip\marginparsep}}\hskip-\marginparsep\texttt{(str1,str2)} +% replaces \texttt{str1} by \texttt{str2}; i.e., +% |_rplVarsBy('theta','x')|. The first argument is a multi-letter variable, +% the second is a single letter variable that \pkg{exerquiz} works with directly. +% \begin{macrocode} function _rplVarsBy(str1,str2) { var re=new RegExp(str1,"g"); var result=str1.replace(re,str2); return result; } +% \end{macrocode} +% \makebox[0pt][r]{\texttt{processMathVars\hskip\marginparsep}}\hskip-\marginparsep\texttt{(str)} +% searches through \texttt{str} for the string \texttt{\_rplVarsBy}; if found, it gets all string +% content up to the next \texttt{@} marker. It replaces the multi-letter with single letter and returns +% the \pkg{exerquiz} single-leter variable list. +%\begin{verbatim} +% var _substVars="a,_rplVarsBy('omega->\u03C9','y')@"; +% var _mathVars=processMathVars(_substVars); +% var _substValue=getSubstValue(_substVars,event.value); +% var _substAns=getSubstValue(_substVars,"a+omega"); +%\end{verbatim} +% \begin{macrocode} function processMathVars(str) { var pos1,pos2,lead,tmp; while ((pos1=str.indexOf("_rplVarsBy"))!=-1) { @@ -11388,34 +11412,55 @@ function processMathVars(str) { lead=str.substring(0,pos1); tmp=str.substring(pos1,pos2); str=str.substring(pos2+1); +% \end{macrocode} +% For example, for |tmp="_rplVarsBy('omega->\u03C9','y')"|, after \texttt{eval(tmp)}, \texttt{tmp} is then +% \texttt{y}. +% \begin{macrocode} tmp=eval(tmp); +% \end{macrocode} +% Combine this new result with the old, for example \texttt{str="a,y"}, for the example above. +% \begin{macrocode} str=lead+tmp+str; } str=str.replace(/\s/g,""); return str; } -getSubstValue.aSubsts=new Array(); // dps17 +% \end{macrocode} +% \makebox[0pt][r]{\texttt{getSubstValue}\hskip\marginparsep}\hskip-\marginparsep\texttt{(v,s)} +% Below is a two multi-letter variable example: +%\begin{verbatim} +% var _substVars= +% "c_rplVarsBy('theta->\u03B8','x')@_rplVarsBy('alpha->\u03B1','y')@"; +% var _mathVars=processMathVars(_substVars); +% var _substValue=getSubstValue(_substVars,event.value); +% var _substAns=getSubstValue(_substVars,"-c alpha sin(theta)"); +% var retn=ProcResp(0,_substAns,3,.0001,"[0,1]x[0,1]x[0,1]",% +% _mathVars,diffCompare,_substValue); +%\end{verbatim} +%The first argument is \texttt{v}, the variable list; it might be \texttt{"xyz"}, or +%if there are substitutions, it might be as above (see \texttt{\_substVars}). The second +%argument is \texttt{s}, the user's answer or the author's answer. +% \begin{macrocode} +getSubstValue.aSubsts=new Array(); function getSubstValue(v,s){ -/* - v=variable list, it may have the form "xyz", or if there - substitutions, it might look like "_rplVarsBy('theta','x')@"; - s=Either the user's answer or the author's answer. - - First develop an array of all variables are their substitutes. - ie, getSubstValue.aSubsts=[ "c","h", ["theta",x"], ["alpha",y],...]; -*/ var pos1,pos2,tmp,args,re,arg1,arg2; -/* - change new style to old - New style: v="c,_rplVarsBy('theta->\u03B8','r:x')@,% -_rplVarsBy('alpha->\u03B1','r:y')@"; - Old style: v="c_rplVarsBy('theta->\u03B8','x')@% -_rplVarsBy('alpha->\u03B1','y')@"; -*/ +% \end{macrocode} +% Change new style to old.\\ +% \textbf{New style} (commas):\\\null\quad|v="c,_rplVarsBy('theta->\u03B8','r:x')@,%|\\\null\qquad +%|_rplVarsBy('alpha->\u03B1','r:y')@";|\\ +% \textbf{Old style} (no commas):\\\null\quad|v="c_rplVarsBy('theta->\u03B8','x')@%|\\\null\qquad +%|_rplVarsBy('alpha->\u03B1','y')@";|\\ +%We want to remove the commas that are \emph{not preceded} by a single quote (\texttt'), as this type +%are inside the argument of \texttt{\_rplVarsBy}. We also remove things like \texttt{r:x}. +% \begin{macrocode} re=/([^'])(,)/g; v=v.replace(re,'$1'); re=/([ri]\string\:)+(\string\w)/g; v=v.replace(re,'$2'); +% \end{macrocode} +% Now, develop an array of all variables and their substitutes. +% ie,\\|getSubstValue.aSubsts=[ ["theta","\u03B8"], ["alpha","\u03B1"],...];| +% \begin{macrocode} getSubstValue.aSubsts=[]; // dps17 var start=0; while (true) { @@ -11438,6 +11483,21 @@ _rplVarsBy('alpha->\u03B1','y')@"; } return s; } +% \end{macrocode} +% \makebox[0pt][r]{\texttt{RespBoxAppr}\hskip\marginparsep}\hskip-\marginparsep\texttt{(e)} +% The variable is either an event object (when called from a format event) or is a string +% (when called from an Ans button). Assume \texttt{e="-c*alpha*sin(theta)"}. +% We go through the \texttt{etSubstValue.aSubsts}, and replace each variable +% developed by \texttt{getSubstValue()} by its substitute variable. Here a lines from +% an Ans button +%\begin{verbatim} +% var _substVars="c_rplVarsBy('theta->\u03B8','x')@ +% _rplVarsBy('alpha->\u03B1','y')@"; +% var _substAns=getSubstValue(_substVars,"-c*alpha*sin(theta)"); +% var value=RespBoxAppr("-c*alpha*sin(theta)"); +%\end{verbatim} +%We must call \texttt{getSubstValue()} prior to calling this function. +% \begin{macrocode} function RespBoxAppr(e){ var value=(typeof e=="object")?e.value:e; var re; @@ -12417,7 +12477,7 @@ oCheckbox: appAlerts[qname]}); if (str.replace(/\s/g,"") == "") { var defaultColor=% (typeof oQName.DefaultColorJSLoc=="undefined")% -?color.black:oQName.DefaultColorJSLoc; +?\defaultColorJS:oQName.DefaultColorJSLoc; if (isthereRBUP) g.display=display.hidden; event.target.strokeColor = defaultColor; } diff --git a/texmf-dist/source/latex/acrotex/web.dtx b/texmf-dist/source/latex/acrotex/web.dtx index 0fa68d7e..94032ce0 100644 --- a/texmf-dist/source/latex/acrotex/web.dtx +++ b/texmf-dist/source/latex/acrotex/web.dtx @@ -5450,8 +5450,8 @@ \string\ttfamily\space#1}\encapchar usage}\@esphack} \makeatother -\def\IndexOpt#1{\SpecialMainOptIndex{#1}% - \marginpar{\raggedleft\PrintDescribeMacro{#1}}} +\newcommand\IndexOpt[2][]{\SpecialMainOptIndex{#1#2}% + \marginpar{\raggedleft\PrintDescribeMacro{#2}}} \def\IndexKey#1{\SpecialMainKeyIndex{#1}% \marginpar{\raggedleft\PrintDescribeMacro{#1}}} \def\IndexJS#1{\SpecialMainJSIndex{#1}% |