diff options
Diffstat (limited to 'texmf-dist')
-rw-r--r-- | texmf-dist/doc/latex/acrotex/README.md | 8 | ||||
-rw-r--r-- | texmf-dist/doc/latex/acrotex/aeb_man.pdf | bin | 2254268 -> 2255476 bytes | |||
-rw-r--r-- | texmf-dist/doc/latex/acrotex/aeb_man.tex | 205 | ||||
-rw-r--r-- | texmf-dist/doc/latex/acrotex/eformman.pdf | bin | 999978 -> 999995 bytes | |||
-rw-r--r-- | texmf-dist/doc/latex/acrotex/eformman.tex | 2 | ||||
-rw-r--r-- | texmf-dist/doc/latex/acrotex/examples/jquiztst.pdf | bin | 354518 -> 126756 bytes | |||
-rw-r--r-- | texmf-dist/doc/latex/acrotex/examples/jquiztst.tex | 33 | ||||
-rw-r--r-- | texmf-dist/source/latex/acrotex/exerquiz.dtx | 299 | ||||
-rw-r--r-- | texmf-dist/source/latex/acrotex/insdljs.dtx | 6 | ||||
-rw-r--r-- | texmf-dist/tex/latex/acrotex/aebjs.def | 2 | ||||
-rw-r--r-- | texmf-dist/tex/latex/acrotex/aebrandom.def | 5 | ||||
-rw-r--r-- | texmf-dist/tex/latex/acrotex/aebsumrytbls.def | 2 | ||||
-rw-r--r-- | texmf-dist/tex/latex/acrotex/exerquiz.sty | 176 | ||||
-rw-r--r-- | texmf-dist/tex/latex/acrotex/insdljs.sty | 3 | ||||
-rw-r--r-- | texmf-dist/tex/latex/acrotex/template.def | 2 |
15 files changed, 464 insertions, 279 deletions
diff --git a/texmf-dist/doc/latex/acrotex/README.md b/texmf-dist/doc/latex/acrotex/README.md index c3b3e38f..e64297bc 100644 --- a/texmf-dist/doc/latex/acrotex/README.md +++ b/texmf-dist/doc/latex/acrotex/README.md @@ -1,6 +1,6 @@ The AcroTeX eDucation Bundle (AeB) Author: D. P. Story -Dated: 2021-05-10 +Dated: 2021-05-15 AeB contains the following: @@ -19,6 +19,12 @@ AeB contains the following: 6) Documentation for AeB (AcroTeX eDucatation Bundle) and eforms (including insdljs and dljslib). +What's New (2021-05-15) + exerquiz: Some bug fixes. + Defined the new insertAt key of the \bChoices command. See + http://www.acrotex.net/blog/?tag=enhanced-quizzes for discussion + and demo files. + What's New (2021-05-10) web: added navibar* option exerquiz: new option usealtadobe is passed to insdljs diff --git a/texmf-dist/doc/latex/acrotex/aeb_man.pdf b/texmf-dist/doc/latex/acrotex/aeb_man.pdf Binary files differindex 56bcb062..1e187364 100644 --- a/texmf-dist/doc/latex/acrotex/aeb_man.pdf +++ b/texmf-dist/doc/latex/acrotex/aeb_man.pdf diff --git a/texmf-dist/doc/latex/acrotex/aeb_man.tex b/texmf-dist/doc/latex/acrotex/aeb_man.tex index 917be858..0969156c 100644 --- a/texmf-dist/doc/latex/acrotex/aeb_man.tex +++ b/texmf-dist/doc/latex/acrotex/aeb_man.tex @@ -17,7 +17,7 @@ %%\usepackage{times} %\usepackage{timesNRMT} -%\previewOn\pmpvOn +% \previewOn\pmpvOn \usepackage{aeb_mlink} \usepackage{longtable,colortbl} @@ -243,10 +243,10 @@ \university{{\AcroT} Software Development Team} \email{dpstory@acrotex.net} \versionLabel{Dated:} -\version{2021/05/10} +\version{2021/05/15} \copyrightyears{1999-\the\year} \nocopyright -\prepared{2021/05/10} +\prepared{2021/05/15} \revisionLabel{Distribution Dated:} \copyrightStatus{True} @@ -4033,8 +4033,7 @@ this option. \subsection{Options passed through to the \tops{\protect\pkg}{}{insdljs} package} The following options are passed through to \pkg{insdljs}: \opt{nodljs}, -\opt{exercisesonly} (same as \opt{nodljs}), \opt{execAfter} (passes the -option \opt{execJS}), and \opt{usealtadobe}. +\opt{exercisesonly} (same as \opt{nodljs}), \opt{execJS}, and \opt{usealtadobe}. \begin{comment} If you are creating a document that is meant to be printed or your @@ -5505,14 +5504,25 @@ command. The commands \cs{bChoices} and \cs{eChoices} can be used within the \env{answers} or \env{manswers} environment as part of a \texttt{shortquiz} -or a \texttt{\hyperref[ss:GradedQuizzes]{quiz}} environment. +or a \texttt{\hyperref[ss:GradedQuizzes]{quiz}} environment. The full syntax of \cs{bChoices} +is as follows: +\begin{Verbatim}[commandchars=!(),xleftmargin=\amtIndent] +\bChoices[!ameta(n(!upshape|nCols=)n),random=!ameta(!upshape(true|false)), + insertAt=!ameta(n),label=!ameta(name)] +\end{Verbatim} +The \texttt{nCols} and \texttt{random} keys are discussed in +Section~\ref{s:random}. Read about the key \texttt{insertAt} on the +{\AcroTeX} Blog +\href{http://www.acrotex.net/blog/?tag=enhanced-quizzes}{here}. The +\texttt{label} key is used for cross referencing purposes and is not +currently documented. +\newtopic\indent Concerning the example above, the argument of the \texttt{answers} -environment is 4 which means we are going to use the tabular -environment with 4 columns. Now within those 4 columns we are -going to only use the first 2 columns (this is the optional -argument of \cs{bChoices}). If the optional argument is removed -from \cs{bChoices}, the choices are typeset in the with 4 +environment is 4 which means we are going to use the tabular environment with +4 columns. Now within those 4 columns we are going to only use the first 2 +columns (this is the optional argument of \cs{bChoices}). If the optional +argument is removed from \cs{bChoices}, the choices are typeset in the with 4 columns. If the argument of \texttt{answers} or \texttt{manswers} is changed to 1, the @@ -5876,11 +5886,12 @@ In this section, several commands are discussed that enhance the user experience One way of making the short-quiz more interesting to the respondent is through the tally box. -\bVerb\takeMeasure{\string\answersEndHook\darg{\ameta{content}}}% +\bVerb\takeMeasure{\string\setAnsEnvLinewidth\darg{\ameta{length}}}% \begin{dCmd}[commandchars=!()]{\bxSize} \sqTallyBox[!ameta(options)] \sqTallyTotal[!ameta(options)] \answersEndHook{!ameta(content)} +\setAnsEnvLinewidth{!ameta(length)} \sqClearButton[!ameta(options)] \end{dCmd} \eVerb The first (\cs{sqTallyBox}) tracks the number of times the respondent has @@ -5896,7 +5907,7 @@ The example below illustrates all four of the commands. Within the \begin{Verbatim}[xleftmargin=\amtIndent] \answersEndHook{\hfill\makebox[0pt][r]{\sqTallyBox}} \end{Verbatim} -which means \cs{sqTallyBox} is insert to the right of the choice field, push +which means \cs{sqTallyBox} is insert to the right of the choice field, pushed to the right margin, then moved to the left using the 0pt width \cs{makebox}. \begin{shortquiz*} Correctly respond to each, passing is not making a single incorrect choice. @@ -5958,13 +5969,14 @@ in a \env{shortquiz} environment. \begin{aebQuote} \begin{enumerate} \item[MC] Nothing happens after the respondent selects the correct answer, - s/he must press the new \uif{Ans} button to jump to the solution page. - If the respondent presses the \uif{Ans} button before selecting the - correct answer, an alert box appears with message determined by \cs{sqSolnMCMsg}. -\item[MS] When the user has selected \emph{all correct answers}, s/he must press - the new \uif{Ans} button in order to jump to the solution page. If the - user presses the \uif{Ans} button before selecting all correct - answers, an alert box appears with message determined by \cs{sqSolnMSMsg}. + the new \uif{Ans} button must be pressed to jump to the solution page. If + the respondent presses the \uif{Ans} button before selecting the correct + answer, an alert box appears with message determined by \cs{sqSolnMCMsg}. +\item[MS] When the user has selected \emph{all correct answers}, the new + \uif{Ans} button must be pressed in order to jump to the solution page. + If the user presses the \uif{Ans} button before selecting all correct + answers, an alert box appears with message determined by + \cs{sqSolnMSMsg}. \end{enumerate} If a MC or MS question does not have a solution, the \uif{Ans} button is not typeset into the document. @@ -5999,111 +6011,13 @@ also how \cs{sqTallyBox} is inserted. In this document, %!textsf( Alternate experience: Insert !cs(sqSolnBtn) and !cs(sqTallyBox)) \answersEndHook{\hfill\makebox[0pt][r]{\sqSolnBtn\sqTallyBox}} \end{Verbatim} -\begin{comment} -The \cs{olBdry} is used to overlay the contiguous boundaries of the two -button fields. Refer to the documentation, \texttt{eformman.pdf}, for the -\pkg{eforms} and \pkg{insdljs} packages, which come with the \pkg{acrotex} -bundle. \cs{answersEndHook} insert its content at the right margin, pushing -it to the left; as a result, the content may overlay the text of the choice -field. It is up to the document author, that's you, to design the layout of -the choice field so the \cs{sqTallyBox} and/or the \cs{sqSolnBtn} does not -overlay other content. - -\promoteNewPageHere[2\textheight] - -\paragraph*{A sample quiz to illustrate.} -These new commands are illustrated in the following short-quiz. - -\begin{shortquiz*} -Answer each of the following. Passing is to -complete the quiz without selecting any wrong answers. - -\answersEndHook{\hfill\makebox[0pt][r]{\sqTallyBox}} - -\medskip\noindent -Problems~1 and~2 are in the style \emph{traditional user experience} that has been -used since the very beginning of \pkg{exerquiz}. - -\begin{questions} - -\item\label{MC} In what year did Columbus sail the ocean blue? -\begin{answers}*{4} -\bChoices -\Ans0 1490\eAns -\Ans0 1491\eAns -\Ans1 1492\eAns -\Ans0 1493\eAns -\eChoices -\end{answers} -\begin{solution} -Columbus sailed the ocean in 1492. It rhymes. -\end{solution} - -\item\label{MS} Which of the following numbers are prime? -\begin{manswers}*{4}\rowsep{3pt} -\bChoices - \Ans0 1\eAns - \Ans1 2\eAns - \Ans1 3\eAns - \Ans0 4\eAns - \Ans1 5\eAns - \Ans0 6\eAns - \Ans1 7\eAns - \Ans0 8\eAns -\eChoices -\end{manswers} -\begin{solution} -Yes, 2, 3, 5, and 7; they are the first four prime numbers. -\end{solution} - -\pushquestions Problems~3 and~4 are in the style \emph{alternate user experience}. - -\popquestions - -\answersEndHook{\hfill\makebox[0pt][r]{\sqSolnBtn\olBdry\sqTallyBox}} -\item\label{Alt:MC} In what year did Columbus sail the ocean blue? -\begin{answers}*{4} -\bChoices -\Ans0 1490\eAns -\Ans0 1491\eAns -\Ans1 1492\eAns -\Ans0 1493\eAns -\eChoices -\end{answers} -\begin{solution} -Columbus sailed the ocean in 1492. It rhymes. -\end{solution} - -\item\label{Alt:MS} Which of the following numbers are prime? -\begin{manswers}*{4}\rowsep{3pt} -\bChoices - \Ans0 1\eAns - \Ans1 2\eAns - \Ans1 3\eAns - \Ans0 4\eAns - \Ans1 5\eAns - \Ans0 6\eAns - \Ans1 7\eAns - \Ans0 8\eAns -\eChoices -\end{manswers} -\begin{solution} -Yes, 2, 3, 5, and 7; they are the first four prime numbers. -\end{solution} -\end{questions} -\hfill\sqClearButton\olBdry\sqTallyTotal -\end{shortquiz*} -\end{comment} - % ?? revise after publication -\exAeBBlogPDF{p=803} The discussion of the alternate viewing experience discussed in this section -as well as the source markup for the above short quiz, can be found in the {\AcroTeX} Blog titled - -%Use the source file for -%\texttt{\href{\urlAcroTeXBlog/?p=803}{webeqtst.pdf}} as a prototype or -%template for your own document. +%\exAeBBlogPDF{p=1489} Additional information, as well as working +%examples of alternate viewing experiences, can be found in the {\AcroTeX} +%Blog article \emph{An alternate user experience for viewing solutions to MC/MS +%questions in a short-quiz.} \subsubsection{The concept of weak and strong pass levels} @@ -6123,18 +6037,18 @@ levels are set through the optional argument of \cs{sqTallyTotal}. \begin{description} \item[Weak passing level] Syntax: \cs{sqTallyTotal[\cs{weakpassing\darg{\ameta{n}}}]}\\[3pt] \textbf{User Experience.} As soon as the student makes more than -\ameta{n} errors, the following message appears in an alert box: +\ameta{n} errors, the following message appears in an alert dialog box: \begin{Verbatim} \flJSStr{\sqWeakMsg}{You have missed too many questions. After you finish, it is recommended you retake this quiz with fewer errors and greater understanding.} \end{Verbatim} -The student is allowed to continue the quiz, but with the knowledge that s/he -is not performing to the expected standard, as set by the instructor. +The student is allowed to continue the quiz, but with the knowledge the +performance is below the expected standard, as set by the instructor. \item[Strong passing level] Syntax: \cs{sqTallyTotal[\cs{strongpassing\darg{\ameta{n}}}]}\\[3pt] \textbf{User Experience.} As soon as the student makes more than \ameta{n} -errors, the following message appears in an alert box: +errors, the following message appears in an alert dialog box: \begin{Verbatim} \flJSStr{\sqStrongMsg}{You have missed too many questions. We are resetting the quiz. Start over, this time with @@ -6142,14 +6056,23 @@ fewer errors and greater understanding.} \end{Verbatim} After the student dismisses the alert dialog box, the short-quiz s/he is working is cleared. Perhaps this condition will inspire the student to -spend more time and think about his/her responses. +spend more time and think about the responses. \end{description} \end{aebQuote} In both cases, \ameta{n} is a nonnegative integer. % ?? revise after publication -\exAeBBlogPDF{p=803} The discussion of the alternate viewing experience discussed in this section -as well as the source markup for the above short quiz, can be found in the {\AcroTeX} Blog titled +%\exAeBBlogPDF{p=1493} The additional discussion of weak and strong passing, +%as well as working examples of each, can be found in the {\AcroTeX} Blog titled +%\emph{Setting the passing level in a short-quiz}. + +\exAeBBlogPDF{p=tag=enhanced-quizzes} There is a series of four articles on +enhancing the short-quiz on the {\AcroTeX} Blog. Follow the link set around +the icon in the margin to obtain a listing of these articles. Additionally, +the articles document two features of \pkg{exerquiz}: the \texttt{insertAt} +key of \cs{bChoices} and \cs{setAnsEnvLinewidth}. + + \subsection{Redesigning the \tops{\protect\texttt{shortquiz}}{shortquiz} Environment}\label{sss:redefinesq} @@ -6162,7 +6085,7 @@ titles and form elements. You can temporarily change the title for the \texttt{shortquiz} environment by redefining the macro \cs{sqlabel}; for example, the -default definition of this macro is +default definition of this macro is, \begin{Verbatim}[xleftmargin=\amtIndent] \newcommand\sqlabel{\textcolor{red}{Quiz.}} \end{Verbatim} @@ -8064,17 +7987,19 @@ for posing a \textit{single} question and will be used in this section to discuss in detail the macros for posing mathematical and text open questions. -The syntax for the \texttt{oQuestion} environment is -\begin{Verbatim}[xleftmargin=\amtIndent,commandchars=!()] +The syntax for the \texttt{oQuestion} environment is, +\bVerb\takeMeasure{\quad\ameta{A math or text open ended question}}% +\begin{dCmd}[commandchars=!()]{\bxSize} \begin{oQuestion}{!ameta(field_name)} - !ameta(A math or text open ended question.) +!quad!ameta(A math or text open ended question) \end{oQuestion} -\end{Verbatim} -\noindent The environment takes one required argument, a unique name for the +\end{dCmd} +\eVerb The environment takes one required argument, a unique name for the question. This name, \ameta{field\_name}, is used by other supporting macros. -The \env{oQuestion} environment has one hook \cs{oqpriorhook} that is -expanded just prior to the opening of the environment. If redefined, it is -used once, then reset to its default empty definition. +The \env{oQuestion} environment has one hook +\FmtMP{\cs{oqpriorhook}}\cs{oqpriorhook} that is expanded just prior to the +opening of the environment. If redefined, it is used once, then reset to its +default empty definition. \subsubsection{\tops{\protect\cs{RespBoxMath}} {\textbackslash RespBoxMath}: The Math Question}\label{ss:respbox} @@ -8842,7 +8767,7 @@ such a problem is marked by a human teacher, he/she may give full credit or may dock the credit slightly. Beginning with \pkg{exerquiz} dated 2020/11/11, the \cs{SpellCheck} command -and the JavaScript function \texttt{checkTheSpelling()} are +and the supporting JavaScript function \texttt{checkTheSpelling()} are defined.\footnote{This feature was suggested to me by Thorsten G.} This a feature allows the student to use the spell checking of \app{Adobe Reader} to inspect each word and to optionally change the word to one of the words @@ -9252,7 +9177,7 @@ KV-pairs of the \pkg{eforms} package. It only accepts these four keys: its argument (\ameta{code}) to the keystroke event of all response boxes (\cs{RespBoxMath}, \cs{RespBoxTxt}, and \cs{RespBoxTxtPC}). - To distinguish between \env{shortquiz} (and \env{oQuestions}) and + To distinguish between \env{shortquiz} (and \env{oQuestion}) and \env{quiz} environments, use the methods explained below in the description of the \cs{AddAAMouseUpMC} key. diff --git a/texmf-dist/doc/latex/acrotex/eformman.pdf b/texmf-dist/doc/latex/acrotex/eformman.pdf Binary files differindex 6a74f299..ef8900e6 100644 --- a/texmf-dist/doc/latex/acrotex/eformman.pdf +++ b/texmf-dist/doc/latex/acrotex/eformman.pdf diff --git a/texmf-dist/doc/latex/acrotex/eformman.tex b/texmf-dist/doc/latex/acrotex/eformman.tex index c56e1beb..bc472205 100644 --- a/texmf-dist/doc/latex/acrotex/eformman.tex +++ b/texmf-dist/doc/latex/acrotex/eformman.tex @@ -82,7 +82,7 @@ subject={Documentation for the eforms and insdljs packages}, talksite={\url{www.acrotex.net}}, version={2.0}, - prepared={2021/05/10}, + prepared={2021/05/15}, preparedLabel={Distribution Dated:}, keywords={LaTeX, hyperref, PDF, exercises, quizzes}, copyrightStatus=True, diff --git a/texmf-dist/doc/latex/acrotex/examples/jquiztst.pdf b/texmf-dist/doc/latex/acrotex/examples/jquiztst.pdf Binary files differindex 2646de18..7d18e4eb 100644 --- a/texmf-dist/doc/latex/acrotex/examples/jquiztst.pdf +++ b/texmf-dist/doc/latex/acrotex/examples/jquiztst.pdf diff --git a/texmf-dist/doc/latex/acrotex/examples/jquiztst.tex b/texmf-dist/doc/latex/acrotex/examples/jquiztst.tex index 28031e96..eba2884d 100644 --- a/texmf-dist/doc/latex/acrotex/examples/jquiztst.tex +++ b/texmf-dist/doc/latex/acrotex/examples/jquiztst.tex @@ -33,15 +33,14 @@ Department of Mathematics} % the quiz is evaluated. %\renewcommand\minQuizResp{highThreshold} -\font\hv=cmtt10 \def\hvperk{\char`^} -%\font\hv=hv at 9pt \def\hvperk{\char142 } +% The following is to create a \js command in which JavaScript code +% can be written, without the use of the \verb command. Merely cosmetic. +\def\hvperk{\char`^} {\catcode`\^=\active - \gdef\js{\bgroup\hv\catcode`\^=\active \let^=\hvperk \jsi} + \gdef\js{\bgroup\ttfamily\catcode`\^=\active \let^=\hvperk \jsi} }\def\jsi#1{#1\egroup} -\def\hr#1{\textcolor{red}{#1}} -\def\hb#1{\textcolor{blue}{#1}} - +% Some convenience commands for differentiation. \def\D{\dfrac {\text{d}}{\text{d}x}} \def\dPose#1{$\D#1=$ } @@ -115,7 +114,7 @@ typing error. The JavaScript routines will also check for unbalanced parentheses; thus, \js{((x^4+1) + sin(x)^2} will be flagged as a syntax error. -\medskip\noindent\hr{\textbf{Important:}} When you enter a function +\medskip\noindent\textcolor{red}{\textbf{Important:}} When you enter a function of a single variable---the only type currently supported---use as the independent variable implied by the statement of the problem. If the problem statement involves the variable $x$, use \js{x} as @@ -149,9 +148,12 @@ brief discussion. \subsection{Practice Example} -\noindent\hb{\textbf{Example:}} Consider the following sample question. +\noindent\textcolor{blue}{\textbf{Example:}} Consider the following sample question. Practice by typing in the answer: -\js{2*x^3*(x^4+1)^(-1/2)} +\js{2*x^3*(x^4+1)^(-1/2)}. + +You can also type \js{2x^3(x^4+1)^(-1/2)} since the +\texttt{ImplMulti} option is taken with the \textsf{dljslib} package. \medskip \begin{oQuestion}{example} @@ -162,17 +164,17 @@ Practice by typing in the answer: \noindent$\dfrac{\text{d}}{\text{d}x} {(x^4 + 1)^{1/2}} = \eqsanitize \underset{\text{\rotatebox{-45}{\rlap{The Response Box}}}} - {\underbrace{\STRUT\efKern{1bp}{0bp} - \RespBoxMath{2*x^3*(x^4+1)^(-1/2)}{4}{.0001}{[1,2]}\relax\efKern{1bp}{0bp}}}\kern-1bp + {\underbrace{\RespBoxMath{2*x^3*(x^4+1)^(-1/2)}{4}{.0001}{[1,2]}}} \underset{\text{\rotatebox{-45}{\rlap{Answer Button}}}} - {\underbrace{\STRUT\efKern{1bp}{0bp}\CorrAnsButton{2*x^3*(x^4+1)^(-1/2)}\efKern{1bp}{0bp}}}\kern-1bp + {\underbrace{\cgBdry\CorrAnsButton{2*x^3*(x^4+1)^(-1/2)}}} \underset{\text{\rotatebox{-45}{\rlap{Num.\ of incorrect tries}}}} - {\underbrace{\STRUT\efKern{1bp}{0bp}\sqTallyBox\relax\efKern{1bp}{0bp}}}\olBdry\efKern{-1bp}{0bp}\sqClearButton$ + {\underbrace{\olBdry\sqTallyBox\relax}}\olBdry\sqClearButton$ \end{oQuestion} \vspace{5\bigskipamount} +\noindent When a correct answer is input into the response box, the color of the border surrounding the response box changes to \textcolor{webgreen}{green}. The answer can also be expressed correctly using the \js{sqrt} @@ -227,12 +229,9 @@ Or, in the syntax of this quiz: \js{-2*t^(-3/2)}. \item $\displaystyle\int_0^\pi \sin(x)\,dx = \RespBoxMath{2}{1}{.0001}{[0,1]}$\hfill\CorrAnsButton{2}\olBdry\sqTallyBox \end{questions} +\hfill\sqClearButton\olBdry\sqTallyTotal \end{shortquiz*} -\begin{flushright} -\sqClearButton\olBdry\sqTallyTotal -\end{flushright} - \subsection{Quiz Environment}\label{s:quiz} diff --git a/texmf-dist/source/latex/acrotex/exerquiz.dtx b/texmf-dist/source/latex/acrotex/exerquiz.dtx index d73c3efd..3890683a 100644 --- a/texmf-dist/source/latex/acrotex/exerquiz.dtx +++ b/texmf-dist/source/latex/acrotex/exerquiz.dtx @@ -22,7 +22,7 @@ %<randomize>\ProvidesFile{aebrandom.def} %<sumrytbls>\ProvidesFile{aebsumrytbls.def} %<template>\ProvidesFile{template.def} -%<package|driver|aebjs|eqexam|randomize|sumrytbls|template> [2021/05/10 v8.7.7 % +%<package|driver|aebjs|eqexam|randomize|sumrytbls|template> [2021/05/15 v8.8 % %<package> Exerquiz: Exercises and Quizzes for LaTeX/PDF package (dps)] %<driver> Exerquiz documentation driver file (dps)] %<aebjs> Exerquiz document level JavaScript (dps)] @@ -74,6 +74,7 @@ \let\env\texttt\let\pkg\textsf \let\app\textsf \let\tops\texorpdfstring + \let\key\texttt \GetFileInfo{exerquiz.sty} \title{Exerquiz: Exercises and Quizzes for \LaTeX/PDF} \author{D. P. Story\\ @@ -277,7 +278,7 @@ \DeclareOption{nodljs}{\PassOptionsToPackage{nodljs}{insdljs}% \AtEndOfPackage{\let\importdljs\eq@YES}} % \end{macrocode} -% \leavevmode\IndexOpt{execAfter}^^A +% \leavevmode\IndexOpt{execJS}^^A % Execute any JS defined within the \env{execJS} environment. Works only for % authors using Acrobat 5.0 or Acrobat Approval. % \begin{macrocode} @@ -3945,6 +3946,96 @@ % % \section{The \texttt{shortquiz} and \texttt{shortquiz*} Environments} % +% \subsection{Preliminaries} +% Beginning with 2021/05/15 v8.7, we introduce several changes that affect +% both \env{shortquiz} and \env{quiz} environments. These definitions are +% placed here. +% \changes{v8.7}{2021/05/15}{Enhanced control over placement of \string\cs{eq@answersEndHook}} +% +% These definitions support the added control over the \ameta{content} placed by the +% command \cs{answersEndHook\darg{\ameta{content}}}. The \ameta{content} argument is +% usally a combination of \cs{sqTallyBox} and \cs{sqSolnBtn} commands, but can be anything. +% +% Another aspect of the change is the \cs{setAnsEnvLinewidth}. Through this command, the +% value of \cs{linewidth} can be changed within the \env{answers} and \env{manswers} environmnts. +% \begin{macro}{\setAnsEnvLinewidth}\hskip-\marginparsep\,\texttt{\darg{\ameta{length}}} Sets the +% \cs{linewidth} of the \env{answers} and \env{manswers} for both the \env{list} and \env{tabular} modes. +% It it not shown here, but within each of these envioronments, before the change is made +% the ``natural'' \cs{linewidth} is saved as \DescribeMacro\natlinewidth\cs{natlinewidth}, +% this value is available only locally, within the environments. +% +% All changes corresponding to enhanced control over placement of \ameta{content} are marked in the source +% by \texttt{dps21-5-15}, \texttt{dps21-5-16}, and \texttt{dps21-5-17}. +% \begin{macrocode} +\def\setAnsEnvLinewidth#1{\def\@nsLineWidth{#1}} % dps21-5-17 +\let\@nsLineWidth\@empty % dps21-5-17 +% \end{macrocode} +% \end{macro} +% \begin{macro}{\answersEndHook}\hskip-\marginparsep\,\texttt{\darg{\ameta{content}}} +% Internally, defines the text macro \cs{eq@answersEndHook} to expand to \ameta{content}. +% The command also defines text macro \cs{insertAnsEndHookHere} to expand to \ameta{content}. +% \cs{eq@answsersEndHook} is used when placing \ameta{content} in the default location; +% while \cs{insertAnsEndHookHere} is used to place \ameta{content} at the location specified +% by the value of the \texttt{insertAt} key of the \cs{bChoices} command. +% \begin{macrocode} +\newcommand\answersEndHook[1]{\def\eq@answersEndHook{#1}% + \ifx\eq@answersEndHook\@empty\else + \def\insertAnsEndHookHere{#1}% + \fi +} % dps21-5-15 +\let\eq@answersEndHook\@empty +\let\insertAnsEndHookHere\@empty % dps21-5-15 +% \end{macrocode} +% \end{macro} +% \begin{macrocode} +% \end{macrocode} +% At the end of each of the targeted envionments, we insert \ameta{content}, +% provided a value for \texttt{insertAt} has not been specified; otherwise, we +% do nothing as \ameta{content} has been inserted according to the value +% of \texttt{insertAt}. +% \begin{macrocode} +\def\@insertAndHookAtEndEnv{% dps21-5-16 + \ifx\insertAnsHookAt\@empty + \eq@answersEndHook + \else % dps21-5-16 + \ifnum\insertAnsHookAt>\aeb@RowCnt + \eq@answersEndHook + \PackageWarning{exerquiz}{insertAt=\insertAnsHookAt: + The value (\insertAnsHookAt) of insertAt is greater\MessageBreak + than the number of rows (\aeb@RowCnt). + Using the default\MessageBreak + positioning instead} + \else +% \end{macrocode} +% Reset the value of \cs{insertAnsHookAt} to its default value. The document +% author must specify \texttt{insertAt} for each \cs{eChoices} where a nondefault +% placement is wanted. +% \begin{macrocode} + \global\let\insertAnsHookAt\@empty + \fi + \fi +} +% \end{macrocode} +% \cs{@insertAnsHookAt} is inserted at the end of \cs{Ans}/\cs{eAns} pair; +% the \ameta{content} is placed just after the text of this item. +% \begin{macrocode} +\def\@insertAnsHookAt{% dps21-5-16 + \let\eqe@next\relax + \ifx\insertAnsHookAt\@empty\else + \ifnum\insertAnsHookAt=\aeb@RowCnt + \def\eqe@next{\insertAnsEndHookHere}\fi + \fi\eqe@next +} +% \end{macrocode} +% Repetitive code to increment the \cs{aeb@RowCnt} macro. +% \begin{macrocode} +\def\@incRowCnt{{\@tempcnta\aeb@RowCnt\advance\@tempcnta\@ne + \xdef\aeb@RowCnt{\the\@tempcnta}}% dps21-5-16 +} +% \end{macrocode} +% +% \subsection{The \texttt{shortquiz} environment} +% % This \texttt{shortquiz} environment sets up multiple choice % questions, with immediate feedback whether the user clicked on the % right or wrong answer. Solutions to the \texttt{shortquiz} may, @@ -5921,6 +6012,13 @@ if (isEndQuizPushed("@eqBaseName")){ \let\endanswers\endanswers@sq@list\else \let\endmanswers\endanswers@sq@list\fi \list{\strut\@Ans}{% +% \end{macrocode} +% Save the natural width of the line, then readjust the +% width if \cs{@nsLineWidth} is not empty. +% \begin{macrocode} + \edef\natlinewidth{\the\linewidth}% dps21-5-17 + \ifx\@nsLineWidth\@empty\else % dps21-5-17 + \setlength{\linewidth}{\@nsLineWidth}\fi \if\sqstar*\relax \settowidth{\labelwidth}{\eq@lw@f}\else \settowidth{\labelwidth}{\eq@lw@l}\fi @@ -5959,14 +6057,14 @@ if (isEndQuizPushed("@eqBaseName")){ % another for \texttt{exerquiz}. % to the following. % \begin{macrocode} -% Begin joint package and eqexam +% End joint package and eqexam %</package|eqexam> %<package> \setlength{\labelsep}{0pt}% %<eqexam> \setlength{\labelsep}{0pt}% %<*package|eqexam> \def\Ans{\Ans@list}% }% list -}{\eq@answersEndHook\endlist\setcounter{quizno}{0}} +}{\@insertAndHookAtEndEnv\endlist\setcounter{quizno}{0}} % dps21-5-16 % \end{macrocode} % Answers environment for a tabular environment. This command picks % up the arguments of \cs{Ans}, then passes on the \cs{@Ans} @@ -6010,13 +6108,19 @@ if (isEndQuizPushed("@eqBaseName")){ % In the next line, we adjust \cs{linewidth}, \cs{eqemargin} is \texttt{0pt} % in \textsf{exerquiz} and nonzero otherwise. % \begin{macrocode} -% \setlength{\linewidth}{\linewidth-\eqemargin}% - \eq@tmpdima=\linewidth +% \end{macrocode} +% Save the natural width of the line, then readjust the +% width if \cs{@nsLineWidth} is not empty. +% \begin{macrocode} + \edef\natlinewidth{\the\linewidth}% dps21-5-17 + \ifx\@nsLineWidth\@empty\else % dps21-5-17 + \setlength{\linewidth}{\@nsLineWidth}\fi + \eq@tmpdima\linewidth \@tempcnta#1\relax % n-1 - \advance\@tempcnta-1\relax + \advance\@tempcnta\m@ne\relax % 2(n-1) - \multiply\@tempcnta by2 + \multiply\@tempcnta\tw@ \@tempdima\sq@tabsep\relax % 2*(n-1)*\eq@partstabcolsep \multiply\@tempdima\@tempcnta @@ -6059,23 +6163,25 @@ if (isEndQuizPushed("@eqBaseName")){ % Close off \texttt{tabular} environment, and re-initialize the % \texttt{quizno} counter. Added \cs{answersEndHook}. % \begin{macrocode} -\newcommand\answersEndHook[1]{\def\eq@answersEndHook{#1}% - \ifx\eq@answersEndHook\@empty\else - \def\insertEndHookHere{#1}\fi} -\let\eq@answersEndHook\@empty \def\endanswers@sq{\endtabular\setcounter{quizno}{0}% - \eq@answersEndHook\reset@doendpe{\the\everypar}% - \ifinner\else%\par - \removelastskip -% \removelastparskip - \vspace{\aboveanswersSkip}\@endpetrue\fi + \@insertAndHookAtEndEnv % dps21-5-16 + \global\let\@nsLineWidth\@empty % dps21-5-17 + \reset@doendpe{\the\everypar}% + \ifinner\else%\par + \removelastskip +% \removelastparskip + \vspace{\aboveanswersSkip}\@endpetrue + \fi } \def\endmanswers@sq{\endtabular\setcounter{quizno}{0}% - \eq@answersEndHook\reset@doendpe{\the\everypar}% - \ifinner\else%\par - \removelastskip -% \removelastparskip - \vspace{\aboveanswersSkip}\@endpetrue\fi + \@insertAndHookAtEndEnv % dps21-5-16 + \global\let\@nsLineWidth\@empty % dps21-5-17 + \reset@doendpe{\the\everypar}% + \ifinner\else%\par + \removelastskip +% \removelastparskip + \vspace{\aboveanswersSkip}\@endpetrue + \fi } \def\popiiictm{\special{CTM: pop pop pop}} %</package|eqexam> @@ -6206,7 +6312,7 @@ false*fi; var f=this.getField("corr.*oField.*thequestionno"); if (f==null) { if ((qzSolnDest!="") && !solnAfter) % - jmpToNamedDest("*oField","*@qzsolndest",% +jmpToNamedDest("*oField","*@qzsolndest",% *ifx*@sqTurnOffAlerts*eq@Zero0*else1*fi);% *ifx*eqAddAAMouseUpMC*empty*else *eqAddAAMouseUpMC*fi @@ -6221,7 +6327,7 @@ if (f==null) { OnBlurRespBox(false,"*oField"); *fi% var qzSolnDest="*@qzsolndest"; -if( qzSolnDest!="") updateTally("*oField.*thequestionno");% +updateTally("*oField.*thequestionno");% *ifx*eqAddAAMouseUpMC*empty*else *eqAddAAMouseUpMC*fi \end{defineJS} @@ -6561,6 +6667,13 @@ updateTally("*oField.*thequestionno");*fi% \let\endanswers\endanswers@q@list\else \let\endmanswers\endanswers@q@list\fi \list{\strut\@Ans}{% +% \end{macrocode} +% Save the natural width of the line, then readjust the +% width if \cs{@nsLineWidth} is not empty. +% \begin{macrocode} + \edef\natlinewidth{\the\linewidth}% dps21-5-17 + \ifx\@nsLineWidth\@empty\else % dps21-5-17 + \setlength{\linewidth}{\@nsLineWidth}\fi \if\qstar*\relax \if\aeb@FLOverride\eq@l \settowidth{\labelwidth}{\eq@lw@l}\else @@ -6577,7 +6690,9 @@ updateTally("*oField.*thequestionno");*fi% \setlength{\labelsep}{0pt}% \def\Ans{\Ans@list}% }% -}{\eq@answersEndHook\endlist\setcounter{quizno}{0}% +}{\endlist\setcounter{quizno}{0}% + \@insertAndHookAtEndEnv % dps21-5-17 + \global\let\@nsLineWidth\@empty % dps21-5-17 \setdefault@Ans \ifx\aeb@answerType\aeb@answerType@r % \end{macrocode} @@ -6603,7 +6718,14 @@ updateTally("*oField.*thequestionno");*fi% \def\qzTabPos#1{\def\qz@TabPos{[#1]}}\qzTabPos{} \def\answers@q@tabular#1{% \ifinner\else\par\removelastparskip\vspace{\aboveanswersSkip}\fi - \eq@tmpdima=\linewidth +% \end{macrocode} +% Save the natural width of the line, then readjust the +% width if \cs{@nsLineWidth} is not empty. +% \begin{macrocode} + \edef\natlinewidth{\the\linewidth}% dps21-5-17 + \ifx\@nsLineWidth\@empty\else % dps21-5-17 + \setlength{\linewidth}{\@nsLineWidth}\fi + \eq@tmpdima\linewidth \@tempcnta#1\relax % n-1 \advance\@tempcnta\m@ne @@ -6630,7 +6752,8 @@ updateTally("*oField.*thequestionno");*fi% % \begin{macrocode} \def\endanswers@q@tabular{% \endtabular\setcounter{quizno}{0}% - \eq@answersEndHook + \@insertAndHookAtEndEnv % dps21-5-17 + \global\let\@nsLineWidth\@empty % dps21-5-17 \setdefault@Ans \ifx\aeb@answerType\aeb@answerType@r % \end{macrocode} @@ -7100,13 +7223,40 @@ updateTally("*oField.*thequestionno");*fi% } % \end{macrocode} % \changes{v6.3x}{2011/04/05}{% -% Added \string\texttt{label} parameter to \string\cs{bChoices}. +% Added \string\texttt{label} parameter to \string\cs{bChoices}. %} -% A new key, \IndexKey{label}\texttt{label}, if this label is specified, then we keep track of all the +% A new key, \IndexKey{label}\texttt{label=\ameta{name}}, if this label is specified, then we keep track of all the % correct alternatives, put them into a commands to make them accessible by the user. % \begin{macrocode} \define@key{bchoice}{label}[]{\xdef\bChoiceLabel{#1}} % \end{macrocode} +% New key, \IndexKey{insertAt}\texttt{insertAt=\ameta{n}} inserts the content of +% the \cs{answersEndHook\darg{\ameta{content}}} at line \ameta{n}. +% \begin{macrocode} +\def\rmFracPrt#1.#2\@nil{\gdef\intPrt{#1}} +\define@key{bchoice}{insertAt}[]{% + \let\insertAtMsg\relax + \def\rmFr@cPrt##1.##2\@nil{\def\intP@rt{##1}} + \def\@rgi{#1}\ifx\@rgi\@empty + \def\insertAtMsg{\PackageWarning{exerquiz} + {An empty value for insertAt, will use\MessageBreak + the default positioning}}% + \else + \rmFr@cPrt#1.\@nil + \expandafter\@tempcnta\intP@rt\relax + \ifnum\@tempcnta<\@ne + \def\insertAtMsg{\PackageWarning{exerquiz} + {insertAt=#1: The value (#1) of insertAt must be\MessageBreak + greater than zero. Using the default\MessageBreak + positioning instead}} + \else + \xdef\insertAnsHookAt{\the\@tempcnta} + \fi + \fi + \insertAtMsg +} % dps21-5-15 +\let\insertAnsHookAt\@empty +% \end{macrocode} % The \cs{bChoices} command is now processed by the \texttt{keyval} package. There % are two keys: \texttt{nCols} and \texttt{random}. The first key % sets the number of columns we are limited to; the second one obviously declares @@ -7121,11 +7271,11 @@ updateTally("*oField.*thequestionno");*fi% % \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=\z@ + \global\let\@tempholdSaveAns\@empty + \global\let\@tempholdSaveChoice\@empty + \global\let\bChoiceLabel\@empty + \setkeys{bchoice}{#1}% dps21-5-15 + \def\aeb@RowCnt{0}\global\eq@tabColCnt\z@ \ifnum\aeb@numCols=\@ne % list mode \def\eq@next{\@layoutListAns}\else % tabular mode \def\eq@next{\@layoutTabularAns{\bChoiceNumCols}}\fi @@ -7284,12 +7434,14 @@ updateTally("*oField.*thequestionno");*fi% % This command gets, and sets the list of alternatives % \begin{macrocode} \long\def\@getListAns\Ans#1\eAns{%\@@par + \@incRowCnt % dps21-5-16 % \end{macrocode} % We record the list as we process each item. % \begin{macrocode} \eq@saveAns#1\eAns - \Ans#1\vspace{\@rowskip}% - \@layoutListAns + \Ans#1% dps21-5-15 + \@insertAnsHookAt % dps21-5-16 + \vspace{\@rowskip}\@layoutListAns } \long\def\@lookforendansChoices#1{% \@ifnextchar\eChoices{\rowsep{\rowsep@default}% @@ -7301,8 +7453,17 @@ updateTally("*oField.*thequestionno");*fi% % environment. % \begin{macrocode} \def\@layoutTabularAns#1{% + \@incRowCnt % dps21-5-16 \let\eq@tabSep\@empty \xdef\numShortCols{#1}% +%\typeout{!! compare #1 with \aeb@numCols}% + \@tempcnta\aeb@numCols % dps21-5-16 + \advance\@tempcnta-#1 +%\typeout{!! need \the\@tempcnta\space more tabs}% + \global\let\nAddT@bs\@empty + \@whilenum\@tempcnta>\z@\do + {\g@addto@macro\nAddT@bs{&}\advance\@tempcnta\m@ne}% +%\toks@=\expandafter{\nAddT@bs}\typeout{!! \the\toks@}% \ifnum#1>\aeb@numCols \xdef\numShortCols{\aeb@numCols}\fi \@@layoutTabularAns } @@ -7323,16 +7484,21 @@ updateTally("*oField.*thequestionno");*fi% \def\rowsep@default{0pt} \long\def\@getTabAns\Ans#1\eAns{% \eq@saveAns#1\eAns - \global\advance\eq@tabColCnt1 - \let\@save@tabSep=\eq@tabSep + \global\advance\eq@tabColCnt\@ne % dps21-5-16 + \let\@save@tabSep\eq@tabSep % dps21-5-16 \ifnum\eq@tabColCnt=\numShortCols - \global\eq@tabColCnt=0 - \xdef\eq@tabSep{\noexpand\\\noalign{\kern\@rowskip\relax}}% + \global\eq@tabColCnt\z@ % dps21-5-16 + \xdef\eq@tabSep{% + \noexpand\nAddT@bs + \noexpand\@insertAnsHookAt + \noexpand\\ + \noalign{\kern\@rowskip\relax}\noexpand\@incRowCnt + }% \else - \gdef\eq@tabSep{&}% + \gdef\eq@tabSep{&}% \fi - \@ifnextchar\eChoices{\@save@tabSep\Ans#1\rowsep{\rowsep@default} - \expandafter\@findendans\@gobble}% + \@ifnextchar\eChoices{\@save@tabSep\Ans#1\rowsep{\rowsep@default}% + \nAddT@bs\@insertAnsHookAt\expandafter\@findendans\@gobble}% {\@save@tabSep\Ans#1\@@layoutTabularAns}% } % \end{macrocode} @@ -7472,7 +7638,7 @@ updateTally("*oField.*thequestionno");*fi% % that this list of choices should be randomized, a boolean. % % We redefine \cs{@ansChoices} above to take key-value optional arguments. -% We allow for a global override of the random key. If random is true, we +% We allow for a global override of the \key{random} key. If \key{random} is true, we % call \cs{@@bChoices}, which begins the process of randomization; otherwise % we call \cs{@@ansChoices} which is roughly equal to the earlier % \cs{@ansChoices}. @@ -7483,6 +7649,8 @@ updateTally("*oField.*thequestionno");*fi% % } % \changes{v8.6.2}{2021/01/20}{Incorporated \string\cs{if@DoNotRandomize} % into the \string\cs{@ansChoices} macro for MC and MS questions} +% \changes{v8.7}{2021/05/15}{Support for the \texttt{insertAt} key +% of \cs{bChoices}; initialize macro \string\cs{aeb@numRows}} % \begin{macrocode} \def\@ansChoices[#1]{% \global\let\@tempholdSaveAns\@empty @@ -7491,7 +7659,8 @@ updateTally("*oField.*thequestionno");*fi% \ifeq@randomizeallChoices \setkeys{bchoice}{#1,random=true}\else \setkeys{bchoice}{#1}\fi - \global\eq@tabColCnt=\z@ + \global\eq@tabColCnt\z@ + \def\aeb@RowCnt{0}% dps21-5-15 \if@DoNotRandomize\eq@randomizeChoicesfalse\fi \ifeq@randomizeChoices\expandafter\@@bChoices \else\expandafter\@@ansChoices\fi @@ -9028,7 +9197,7 @@ if(event.willCommit) { % \begin{macro}{\RespBoxEssay} % Here is a simple text field with a multi-line attribute for entering % essay-type questions. This question will not be graded by JavaScript, -% of course; ideally, the response will be submitted to a CGI for storage +% of course; ideally, the response will be submitted to a server-side script for storage % in a database. The instructor can later bring up the student's response % and assign a grade. Syntax: %\begin{quote}\ttfamily @@ -9036,15 +9205,15 @@ if(event.willCommit) { % \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 explicit \ameta{dest} string, or an star (\texttt*), where +% of the solution two ways: an explicit \ameta{dest} string or a 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. +% a first optional argument \ameta{opts}, even if its only empty (\texttt{[]}), to correctly +% parse this construction. % \changes{v8.3}{2019/08/13}{\string\env{solution} environment now defined for % \string\cs{RespBoxEssay}} % \begin{macrocode} -\def\RespBoxEssayDefaults -{% - \BC{0 0 0}\W{1}\S{S}\Ff{\FfMultiline}\rawPDF{}% +\def\RespBoxEssayDefaults{% + \BC{0 0 0}\W{1}\S{S}\Ff{\FfMultiline}\rawPDF{}% } \def\@@RespBoxEssayActions{\AA{% \if\eqQuizType\isQZ @@ -9061,7 +9230,9 @@ if(event.willCommit) { }% \fi}% } -% \RespBoxEssay[opt][dest]|*{wd}{ht} +% \end{macrocode} +% Begin the \cs{RespBoxEassay} command. +% \begin{macrocode} \def\annot@subtype@rbe{rbe} \newcommand\RespBoxEssay[1][]{\edef\annot@subtype{\annot@subtype@rbe}% \def\rbe@rgi{#1}\RespBoxEssay@i} @@ -9070,12 +9241,12 @@ if(event.willCommit) { {\@ifstar{\RespBoxEssay@ii[\curr@quiz.\thequestionno]}}% {\RespBoxEssay@ii[]}% } -% \RespBoxEssay#1[dest]{wd}{ht} \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}} +% \changes{v8.2.13}{2019/06/26}{Added \string\cs{eq@AddProbToQzQuesList} +% for \string\cs{RespBoxEssay}} % \begin{macrocode} \eq@AddProbToQzQuesList \stepcounter{questionno}% @@ -9100,14 +9271,8 @@ if(event.willCommit) { % question. This box is not required to appear. % \begin{macrocode} \let\@@sqTallyBoxActions\@empty -%\@ifundefined{calcOrder}{% -%\ifpdf\def\@@sqTallyBoxActions{% -% \AA{\AAValidate{getTotalTally("\oField");}}}\fi}{} -%\ifpdf\def\@@sqTallyBoxActions{% -% \AA{\AAValidate{getTotalTally("\oField");}}}\else -% \let\@@sqTallyBoxActions\@empty\fi \def\sqTallyBoxDefaults{% - \BC{0 0 0}\W{1}\textColor{1 0 0 rg}\S{I}\Q{2}\Ff{\FfReadOnly}} + \BC{0 0 0}\W{1}\textColor{1 0 0 rg}\S{I}\Q{2}\Ff{\FfReadOnly}} \newcommand\sqTallyBox[1][]{% \mbox{\text@@Field{#1}{tally.\oField.\thequestionno}% {\TBW}{\DefaultHeightOfWidget}% @@ -9119,7 +9284,7 @@ if(event.willCommit) { % \subsubsection{The \tops{\protect\cs}{\textbackslash}{sqTallyTotal} command} % \begin{macro}{\sqTallyTotal}\hskip-\marginparsep\texttt{[\ameta{options}]} % This text field stores the tally total. Only used within the -% \texttt{shortquiz} environment. Takes on optional parameter; this +% \env{shortquiz} environment. Takes on optional parameter; this % parameter can be used to modify the appearance of the fields. Two special % key-values are also recognized: \cs{weakpass\darg{\ameta{n}}} and \cs{strongpass\darg{\ameta{n}}} % \begin{macrocode} @@ -9144,10 +9309,11 @@ fewer errors and greater understanding.} % \end{macrocode} % The code that formats the field and if needed, responds to the weak-pass % or strong-pass parameter. +% \changes{v8.7.8}{2021/05/13}{Use try/catch (\string\cs{dlTC}) in number format.} % \begin{macrocode} \def\@@sqTallyTotalActions{\AA{% \AAKeystroke{\dl@EForAF4Number_Keystroke(0,0,0,0,"",true);} - \AAFormat{\dl@EForAF4Number_Format(0,0,0,0,"",true);} + \AAFormat{\dlTC{\dl@EForAF4Number_Format(0,0,0,0,"",true);}} \AACalculate{% \dl@EForAF4Simple_Calculate("SUM",new Array("tally.\oField"));\r var sqTlyTotl=event.value; @@ -9216,10 +9382,9 @@ fewer errors and greater understanding.} % now, we say \string\texttt{this.getField("obj.\string\cs{oField}")}. %} % \begin{macrocode} -\def\sqClearButtonDefaults -{% - \CA{\eq@local@sqClearButton}\textColor{0 g}\F{\FPrint} - \BC{0 0 0}\BG{.7529 .7529 .7529}\W{1}\S{B}\Ff{\FfNoExport} +\def\sqClearButtonDefaults{% + \CA{\eq@local@sqClearButton}\textColor{0 g}\F{\FPrint} + \BC{0 0 0}\BG{.7529 .7529 .7529}\W{1}\S{B}\Ff{\FfNoExport} } % \end{macrocode} % In an attempt to supply some custom colors for the shortquiz, we diff --git a/texmf-dist/source/latex/acrotex/insdljs.dtx b/texmf-dist/source/latex/acrotex/insdljs.dtx index 8df24984..7f848638 100644 --- a/texmf-dist/source/latex/acrotex/insdljs.dtx +++ b/texmf-dist/source/latex/acrotex/insdljs.dtx @@ -16,7 +16,7 @@ %</copyright> %<package>\NeedsTeXFormat{LaTeX2e} %<package>\ProvidesPackage{insdljs} -%<package> [2021/05/10 v2.5.3 Insert Document Level JavaScripts (dps)] +%<package> [2021/05/13 v2.5.4 Insert Document Level JavaScripts (dps)] %<*driver> \documentclass{ltxdoc} \usepackage[colorlinks,hyperindex=false]{hyperref} @@ -931,9 +931,11 @@ % \end{macrocode} % \paragraph*{Convenience command\DescribeMacro{\dl@EForAF4} that support \opt{usealtadobe} option.} This helper % command make it convenient to switch from the `AF' to the `EF' versions. -% \changes{v2.5.3}{2021/05/10} +% \changes{v2.5.3}{2021/05/10}{Added \string\cs{dl@EForAF4}} +% \changes{v2.5.4}{2021/05/13}{Added \string\cs{dl@EForAFMergeChange}} % \begin{macrocode} \def\dl@EForAF4#1_{\ifx\usedAdbFuncs\dl@YES EF\else AF\fi#1_} +\def\dl@EForAFMergeChange{\ifx\usedAdbFuncs\dl@YES EF\else AF\fi MergeChange} % \end{macrocode} % \subsection{Some JavaScript Support} % diff --git a/texmf-dist/tex/latex/acrotex/aebjs.def b/texmf-dist/tex/latex/acrotex/aebjs.def index a0fb5916..f8dd2dbc 100644 --- a/texmf-dist/tex/latex/acrotex/aebjs.def +++ b/texmf-dist/tex/latex/acrotex/aebjs.def @@ -18,7 +18,7 @@ %% License, or (at your option) any later version. %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \ProvidesFile{aebjs.def} - [2021/05/10 v8.7.7 % + [2021/05/15 v8.8 % Exerquiz document level JavaScript (dps)] \def\aeb@array{new Array} \def\refac#1{\\(#1\\)}\def\regrp#1{(#1)}\def\rechrclass#1{[#1]} diff --git a/texmf-dist/tex/latex/acrotex/aebrandom.def b/texmf-dist/tex/latex/acrotex/aebrandom.def index f648e885..856d4a69 100644 --- a/texmf-dist/tex/latex/acrotex/aebrandom.def +++ b/texmf-dist/tex/latex/acrotex/aebrandom.def @@ -18,7 +18,7 @@ %% License, or (at your option) any later version. %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \ProvidesFile{aebrandom.def} - [2021/05/10 v8.7.7 % + [2021/05/15 v8.8 % Exerquiz support for randomization (dps)] \@ifundefined{nextrandom}{\input{random.tex}}{} \def\nextrandom{\begingroup @@ -50,7 +50,8 @@ \ifeq@randomizeallChoices \setkeys{bchoice}{#1,random=true}\else \setkeys{bchoice}{#1}\fi - \global\eq@tabColCnt=\z@ + \global\eq@tabColCnt\z@ + \def\aeb@RowCnt{0}% dps21-5-15 \if@DoNotRandomize\eq@randomizeChoicesfalse\fi \ifeq@randomizeChoices\expandafter\@@bChoices \else\expandafter\@@ansChoices\fi diff --git a/texmf-dist/tex/latex/acrotex/aebsumrytbls.def b/texmf-dist/tex/latex/acrotex/aebsumrytbls.def index c4213d4d..e0c42972 100644 --- a/texmf-dist/tex/latex/acrotex/aebsumrytbls.def +++ b/texmf-dist/tex/latex/acrotex/aebsumrytbls.def @@ -18,7 +18,7 @@ %% License, or (at your option) any later version. %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \ProvidesFile{aebsumrytbls.def} - [2021/05/10 v8.7.7 % + [2021/05/15 v8.8 % Exerquiz support for summary tables (dps)] \def\ccatCurrQzWith(#1){\currQuiz#1} \def\pbPopulateSumTable{\pushButton[\W0\BG{}\BC{}\S{S}\autoCenter{n} diff --git a/texmf-dist/tex/latex/acrotex/exerquiz.sty b/texmf-dist/tex/latex/acrotex/exerquiz.sty index 2815e490..c1cd8eb8 100644 --- a/texmf-dist/tex/latex/acrotex/exerquiz.sty +++ b/texmf-dist/tex/latex/acrotex/exerquiz.sty @@ -19,7 +19,7 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{exerquiz} - [2021/05/10 v8.7.7 % + [2021/05/15 v8.8 % Exerquiz: Exercises and Quizzes for LaTeX/PDF package (dps)] \usepackage{keyval} \RequirePackage{ifpdf}[2006/02/20] @@ -1706,6 +1706,41 @@ \begin{questions}[\csname quesOpts\@quesctr\endcsname]% \setcounter{\@quesctr}{\csname save\@quesctr\endcsname}% \@ifnextchar\popquestions{\item[]}{\@ifnextchar\begin{\item[]}{}}} +\def\setAnsEnvLinewidth#1{\def\@nsLineWidth{#1}} % dps21-5-17 +\let\@nsLineWidth\@empty % dps21-5-17 +\newcommand\answersEndHook[1]{\def\eq@answersEndHook{#1}% + \ifx\eq@answersEndHook\@empty\else + \def\insertAnsEndHookHere{#1}% + \fi +} % dps21-5-15 +\let\eq@answersEndHook\@empty +\let\insertAnsEndHookHere\@empty % dps21-5-15 +\def\@insertAndHookAtEndEnv{% dps21-5-16 + \ifx\insertAnsHookAt\@empty + \eq@answersEndHook + \else % dps21-5-16 + \ifnum\insertAnsHookAt>\aeb@RowCnt + \eq@answersEndHook + \PackageWarning{exerquiz}{insertAt=\insertAnsHookAt: + The value (\insertAnsHookAt) of insertAt is greater\MessageBreak + than the number of rows (\aeb@RowCnt). + Using the default\MessageBreak + positioning instead} + \else + \global\let\insertAnsHookAt\@empty + \fi + \fi +} +\def\@insertAnsHookAt{% dps21-5-16 + \let\eqe@next\relax + \ifx\insertAnsHookAt\@empty\else + \ifnum\insertAnsHookAt=\aeb@RowCnt + \def\eqe@next{\insertAnsEndHookHere}\fi + \fi\eqe@next +} +\def\@incRowCnt{{\@tempcnta\aeb@RowCnt\advance\@tempcnta\@ne + \xdef\aeb@RowCnt{\the\@tempcnta}}% dps21-5-16 +} \newcommand{\priorsqhook}[1]{\def\sq@priorhook{#1}} \priorsqhook{} \newcommand{\abovesqskip}[1]{\def\sq@aboveskip{#1}} @@ -2557,6 +2592,9 @@ if (isEndQuizPushed("@eqBaseName")){ \let\endanswers\endanswers@sq@list\else \let\endmanswers\endanswers@sq@list\fi \list{\strut\@Ans}{% + \edef\natlinewidth{\the\linewidth}% dps21-5-17 + \ifx\@nsLineWidth\@empty\else % dps21-5-17 + \setlength{\linewidth}{\@nsLineWidth}\fi \if\sqstar*\relax \settowidth{\labelwidth}{\eq@lw@f}\else \settowidth{\labelwidth}{\eq@lw@l}\fi @@ -2576,7 +2614,7 @@ if (isEndQuizPushed("@eqBaseName")){ \setlength{\labelsep}{0pt}% \def\Ans{\Ans@list}% }% list -}{\eq@answersEndHook\endlist\setcounter{quizno}{0}} +}{\@insertAndHookAtEndEnv\endlist\setcounter{quizno}{0}} % dps21-5-16 \newcommand\Ans@tabular[2][0]{\gdef\eq@pPTs{#1}\xdef\Ans@choice{#2}% \leavevmode\@Ans } @@ -2592,10 +2630,13 @@ if (isEndQuizPushed("@eqBaseName")){ \vskip\aboveanswersSkip\fi \noindent\ifnum\exerwparts@cols>1\relax\parshape=0\fi \tabcolsep=0pt - \eq@tmpdima=\linewidth + \edef\natlinewidth{\the\linewidth}% dps21-5-17 + \ifx\@nsLineWidth\@empty\else % dps21-5-17 + \setlength{\linewidth}{\@nsLineWidth}\fi + \eq@tmpdima\linewidth \@tempcnta#1\relax - \advance\@tempcnta-1\relax - \multiply\@tempcnta by2 + \advance\@tempcnta\m@ne\relax + \multiply\@tempcnta\tw@ \@tempdima\sq@tabsep\relax \multiply\@tempdima\@tempcnta \advance\eq@tmpdima-\@tempdima @@ -2613,21 +2654,23 @@ if (isEndQuizPushed("@eqBaseName")){ \everypar{}\@endpefalse}\the\eq@scratchtoks }% } -\newcommand\answersEndHook[1]{\def\eq@answersEndHook{#1}% - \ifx\eq@answersEndHook\@empty\else - \def\insertEndHookHere{#1}\fi} -\let\eq@answersEndHook\@empty \def\endanswers@sq{\endtabular\setcounter{quizno}{0}% - \eq@answersEndHook\reset@doendpe{\the\everypar}% - \ifinner\else%\par - \removelastskip - \vspace{\aboveanswersSkip}\@endpetrue\fi + \@insertAndHookAtEndEnv % dps21-5-16 + \global\let\@nsLineWidth\@empty % dps21-5-17 + \reset@doendpe{\the\everypar}% + \ifinner\else%\par + \removelastskip + \vspace{\aboveanswersSkip}\@endpetrue + \fi } \def\endmanswers@sq{\endtabular\setcounter{quizno}{0}% - \eq@answersEndHook\reset@doendpe{\the\everypar}% - \ifinner\else%\par - \removelastskip - \vspace{\aboveanswersSkip}\@endpetrue\fi + \@insertAndHookAtEndEnv % dps21-5-16 + \global\let\@nsLineWidth\@empty % dps21-5-17 + \reset@doendpe{\the\everypar}% + \ifinner\else%\par + \removelastskip + \vspace{\aboveanswersSkip}\@endpetrue + \fi } \def\popiiictm{\special{CTM: pop pop pop}} \def\sqWrongRespJS{OnBlurRespBox(false,"\oField");} @@ -2689,7 +2732,7 @@ false*fi; var f=this.getField("corr.*oField.*thequestionno"); if (f==null) { if ((qzSolnDest!="") && !solnAfter) % - jmpToNamedDest("*oField","*@qzsolndest",% +jmpToNamedDest("*oField","*@qzsolndest",% *ifx*@sqTurnOffAlerts*eq@Zero0*else1*fi);% *ifx*eqAddAAMouseUpMC*empty*else *eqAddAAMouseUpMC*fi @@ -2700,7 +2743,7 @@ if (f==null) { OnBlurRespBox(false,"*oField"); *fi% var qzSolnDest="*@qzsolndest"; -if( qzSolnDest!="") updateTally("*oField.*thequestionno");% +updateTally("*oField.*thequestionno");% *ifx*eqAddAAMouseUpMC*empty*else *eqAddAAMouseUpMC*fi \end{defineJS} @@ -2920,6 +2963,9 @@ updateTally("*oField.*thequestionno");*fi% \let\endanswers\endanswers@q@list\else \let\endmanswers\endanswers@q@list\fi \list{\strut\@Ans}{% + \edef\natlinewidth{\the\linewidth}% dps21-5-17 + \ifx\@nsLineWidth\@empty\else % dps21-5-17 + \setlength{\linewidth}{\@nsLineWidth}\fi \if\qstar*\relax \if\aeb@FLOverride\eq@l \settowidth{\labelwidth}{\eq@lw@l}\else @@ -2936,7 +2982,9 @@ updateTally("*oField.*thequestionno");*fi% \setlength{\labelsep}{0pt}% \def\Ans{\Ans@list}% }% -}{\eq@answersEndHook\endlist\setcounter{quizno}{0}% +}{\endlist\setcounter{quizno}{0}% + \@insertAndHookAtEndEnv % dps21-5-17 + \global\let\@nsLineWidth\@empty % dps21-5-17 \setdefault@Ans \ifx\aeb@answerType\aeb@answerType@r \eq@recordCorrAns{\eq@ansChoiceArray}\ifwithinMCFI @@ -2950,7 +2998,10 @@ updateTally("*oField.*thequestionno");*fi% \def\qzTabPos#1{\def\qz@TabPos{[#1]}}\qzTabPos{} \def\answers@q@tabular#1{% \ifinner\else\par\removelastparskip\vspace{\aboveanswersSkip}\fi - \eq@tmpdima=\linewidth + \edef\natlinewidth{\the\linewidth}% dps21-5-17 + \ifx\@nsLineWidth\@empty\else % dps21-5-17 + \setlength{\linewidth}{\@nsLineWidth}\fi + \eq@tmpdima\linewidth \@tempcnta#1\relax \advance\@tempcnta\m@ne \multiply\@tempcnta\tw@ @@ -2968,7 +3019,8 @@ updateTally("*oField.*thequestionno");*fi% } \def\endanswers@q@tabular{% \endtabular\setcounter{quizno}{0}% - \eq@answersEndHook + \@insertAndHookAtEndEnv % dps21-5-17 + \global\let\@nsLineWidth\@empty % dps21-5-17 \setdefault@Ans \ifx\aeb@answerType\aeb@answerType@r \eq@recordCorrAns{\eq@ansChoiceArray}\ifwithinMCFI @@ -3273,13 +3325,36 @@ updateTally("*oField.*thequestionno");*fi% \else\eq@randomizeChoicesfalse\fi } \define@key{bchoice}{label}[]{\xdef\bChoiceLabel{#1}} +\def\rmFracPrt#1.#2\@nil{\gdef\intPrt{#1}} +\define@key{bchoice}{insertAt}[]{% + \let\insertAtMsg\relax + \def\rmFr@cPrt##1.##2\@nil{\def\intP@rt{##1}} + \def\@rgi{#1}\ifx\@rgi\@empty + \def\insertAtMsg{\PackageWarning{exerquiz} + {An empty value for insertAt, will use\MessageBreak + the default positioning}}% + \else + \rmFr@cPrt#1.\@nil + \expandafter\@tempcnta\intP@rt\relax + \ifnum\@tempcnta<\@ne + \def\insertAtMsg{\PackageWarning{exerquiz} + {insertAt=#1: The value (#1) of insertAt must be\MessageBreak + greater than zero. Using the default\MessageBreak + positioning instead}} + \else + \xdef\insertAnsHookAt{\the\@tempcnta} + \fi + \fi + \insertAtMsg +} % dps21-5-15 +\let\insertAnsHookAt\@empty \def\bChoices{\@ifnextchar[{\@ansChoices}{\@ansChoices[\aeb@numCols]}} \def\@ansChoices[#1]{% - \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@ + \global\let\@tempholdSaveAns\@empty + \global\let\@tempholdSaveChoice\@empty + \global\let\bChoiceLabel\@empty + \setkeys{bchoice}{#1}% dps21-5-15 + \def\aeb@RowCnt{0}\global\eq@tabColCnt\z@ \ifnum\aeb@numCols=\@ne % list mode \def\eq@next{\@layoutListAns}\else % tabular mode \def\eq@next{\@layoutTabularAns{\bChoiceNumCols}}\fi @@ -3369,17 +3444,25 @@ updateTally("*oField.*thequestionno");*fi% \newcommand{\useSavedNumAns}[1]{\@nameuse{NumAns#1}} \long\def\@@@SaveAnsGobbleAns#1\eAns{} \long\def\@getListAns\Ans#1\eAns{%\@@par + \@incRowCnt % dps21-5-16 \eq@saveAns#1\eAns - \Ans#1\vspace{\@rowskip}% - \@layoutListAns + \Ans#1% dps21-5-15 + \@insertAnsHookAt % dps21-5-16 + \vspace{\@rowskip}\@layoutListAns } \long\def\@lookforendansChoices#1{% \@ifnextchar\eChoices{\rowsep{\rowsep@default}% \expandafter\@findendans\@gobble}{\expandafter#1\@gobble}% } \def\@layoutTabularAns#1{% + \@incRowCnt % dps21-5-16 \let\eq@tabSep\@empty \xdef\numShortCols{#1}% + \@tempcnta\aeb@numCols % dps21-5-16 + \advance\@tempcnta-#1 + \global\let\nAddT@bs\@empty + \@whilenum\@tempcnta>\z@\do + {\g@addto@macro\nAddT@bs{&}\advance\@tempcnta\m@ne}% \ifnum#1>\aeb@numCols \xdef\numShortCols{\aeb@numCols}\fi \@@layoutTabularAns } @@ -3393,16 +3476,21 @@ updateTally("*oField.*thequestionno");*fi% \def\rowsep@default{0pt} \long\def\@getTabAns\Ans#1\eAns{% \eq@saveAns#1\eAns - \global\advance\eq@tabColCnt1 - \let\@save@tabSep=\eq@tabSep + \global\advance\eq@tabColCnt\@ne % dps21-5-16 + \let\@save@tabSep\eq@tabSep % dps21-5-16 \ifnum\eq@tabColCnt=\numShortCols - \global\eq@tabColCnt=0 - \xdef\eq@tabSep{\noexpand\\\noalign{\kern\@rowskip\relax}}% + \global\eq@tabColCnt\z@ % dps21-5-16 + \xdef\eq@tabSep{% + \noexpand\nAddT@bs + \noexpand\@insertAnsHookAt + \noexpand\\ + \noalign{\kern\@rowskip\relax}\noexpand\@incRowCnt + }% \else - \gdef\eq@tabSep{&}% + \gdef\eq@tabSep{&}% \fi - \@ifnextchar\eChoices{\@save@tabSep\Ans#1\rowsep{\rowsep@default} - \expandafter\@findendans\@gobble}% + \@ifnextchar\eChoices{\@save@tabSep\Ans#1\rowsep{\rowsep@default}% + \nAddT@bs\@insertAnsHookAt\expandafter\@findendans\@gobble}% {\@save@tabSep\Ans#1\@@layoutTabularAns}% } \def\@findendans{\@ifnextchar\end{% @@ -4109,9 +4197,8 @@ if(event.willCommit) { \fi\r var splErrors=checkTheSpelling(targetFldName);\@fterSplChkActn }}]{spl.\curr@quiz.\thequestionno}{}{11bp}} -\def\RespBoxEssayDefaults -{% - \BC{0 0 0}\W{1}\S{S}\Ff{\FfMultiline}\rawPDF{}% +\def\RespBoxEssayDefaults{% + \BC{0 0 0}\W{1}\S{S}\Ff{\FfMultiline}\rawPDF{}% } \def\@@RespBoxEssayActions{\AA{% \if\eqQuizType\isQZ @@ -4150,7 +4237,7 @@ if(event.willCommit) { } \let\@@sqTallyBoxActions\@empty \def\sqTallyBoxDefaults{% - \BC{0 0 0}\W{1}\textColor{1 0 0 rg}\S{I}\Q{2}\Ff{\FfReadOnly}} + \BC{0 0 0}\W{1}\textColor{1 0 0 rg}\S{I}\Q{2}\Ff{\FfReadOnly}} \newcommand\sqTallyBox[1][]{% \mbox{\text@@Field{#1}{tally.\oField.\thequestionno}% {\TBW}{\DefaultHeightOfWidget}% @@ -4169,7 +4256,7 @@ We are resetting the quiz. Start over, this time with fewer errors and greater understanding.} \def\@@sqTallyTotalActions{\AA{% \AAKeystroke{\dl@EForAF4Number_Keystroke(0,0,0,0,"",true);} - \AAFormat{\dl@EForAF4Number_Format(0,0,0,0,"",true);} + \AAFormat{\dlTC{\dl@EForAF4Number_Format(0,0,0,0,"",true);}} \AACalculate{% \dl@EForAF4Simple_Calculate("SUM",new Array("tally.\oField"));\r var sqTlyTotl=event.value; @@ -4201,10 +4288,9 @@ fewer errors and greater understanding.} {\sqTallyTotalDefaults\@@sqTallyTotalActions\every@eqTextField \every@sqTallyTotal}}% } -\def\sqClearButtonDefaults -{% - \CA{\eq@local@sqClearButton}\textColor{0 g}\F{\FPrint} - \BC{0 0 0}\BG{.7529 .7529 .7529}\W{1}\S{B}\Ff{\FfNoExport} +\def\sqClearButtonDefaults{% + \CA{\eq@local@sqClearButton}\textColor{0 g}\F{\FPrint} + \BC{0 0 0}\BG{.7529 .7529 .7529}\W{1}\S{B}\Ff{\FfNoExport} } \begin{defineJS}[\makeesc\*\makecmt\%]{\@@sqClearButtonJSCode} ProcessIt = false; diff --git a/texmf-dist/tex/latex/acrotex/insdljs.sty b/texmf-dist/tex/latex/acrotex/insdljs.sty index 1fb1faff..22769ae2 100644 --- a/texmf-dist/tex/latex/acrotex/insdljs.sty +++ b/texmf-dist/tex/latex/acrotex/insdljs.sty @@ -19,7 +19,7 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{insdljs} - [2021/05/10 v2.5.3 Insert Document Level JavaScripts (dps)] + [2021/05/13 v2.5.4 Insert Document Level JavaScripts (dps)] \usepackage{xkeyval} \RequirePackage{ifpdf}[2006/02/20] \RequirePackage{ifxetex}[2006/08/21] @@ -198,6 +198,7 @@ \newwrite\js@verbatim@out \def\iwvo#1{\immediate\write\js@verbatim@out{#1}} \def\dl@EForAF4#1_{\ifx\usedAdbFuncs\dl@YES EF\else AF\fi#1_} +\def\dl@EForAFMergeChange{\ifx\usedAdbFuncs\dl@YES EF\else AF\fi MergeChange} \def\dl@lparen{(}\def\dl@rparen{)} \def\genericNL{^^J} \def\defjsLB{\gobiv} diff --git a/texmf-dist/tex/latex/acrotex/template.def b/texmf-dist/tex/latex/acrotex/template.def index 371929e5..997fcd7e 100644 --- a/texmf-dist/tex/latex/acrotex/template.def +++ b/texmf-dist/tex/latex/acrotex/template.def @@ -18,7 +18,7 @@ %% License, or (at your option) any later version. %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \ProvidesFile{template.def} - [2021/05/10 v8.7.7 % + [2021/05/15 v8.8 % Exerquiz template for language support (dps)] %%------------- Instructions ------------------------------------ %% Make your language localizations to this file and rename it to |