From d929e40413ebfcbeaadd7e5469ed1eb0d867ba97 Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Wed, 28 Apr 2021 03:01:33 +0000 Subject: CTAN sync 202104280301 --- macros/latex/contrib/eq-save/eq-save.dtx | 85 +++++++++++++++++++------------- 1 file changed, 52 insertions(+), 33 deletions(-) (limited to 'macros/latex/contrib/eq-save/eq-save.dtx') diff --git a/macros/latex/contrib/eq-save/eq-save.dtx b/macros/latex/contrib/eq-save/eq-save.dtx index dbdf6b4868..531995f8b3 100644 --- a/macros/latex/contrib/eq-save/eq-save.dtx +++ b/macros/latex/contrib/eq-save/eq-save.dtx @@ -14,7 +14,7 @@ % %\NeedsTeXFormat{LaTeX2e}[1997/12/01] %\ProvidesPackage{eq-save} -% [2021/02/17 v1.2 eq-save: save exerquiz quizzes and resume (dps)] +% [2021/04/27 v1.2.5 eq-save: save exerquiz quizzes and resume (dps)] %<*driver> \documentclass{ltxdoc} \usepackage[colorlinks,hyperindex=false]{hyperref} @@ -213,11 +213,21 @@ } % \end{macrocode} % \paragraph*{Open Page Action} We add a page open event to restore the data as needed. We only do this once -% per document session. -% \begin{macrocode} -\thisPageAction{\JS{if(!restoreQuizData.hasRestoredData)\r\t - var rqdTO=(app.setTimeOut("restoreQuizData();app.clearTimeOut(rqdTO);% - restoreQuizData.hasRestoredData=true",1000));}}{} +% per document session. The script used in contained in the command \DescribeMacro\restoreQD\cs{restoreQD}. +% \changes{v1.2.3}{2019/27/07}{Made the open doc script into a macro \string\cs{resoreQD}} +% \changes{v1.2.4}{2019/08/01}{Changed to page open} +% \changes{v1.2.5}{2019/08/07}{added dirty=false to \string\cs{restoreQD}} +% \begin{macrocode} +\def\restoreQD{if(!restoreQuizData.hasRestoredData)\r\t + var rqdTO=(app.setTimeOut("try{restoreQuizData()}catch(e){};% + app.clearTimeOut(rqdTO);% + restoreQuizData.hasRestoredData=true;dirty=false;",1000));} +%\addToDocOpen{\JS{\restoreQD}} +\thisPageAction{\JS{\restoreQD}}{} +%\thisPageAction{\JS{if(!restoreQuizData.hasRestoredData)\r\t +% var rqdTO=(app.setTimeOut("restoreQuizData();% +% app.clearTimeOut(rqdTO);% +% restoreQuizData.hasRestoredData=true",1000));}}{} % \end{macrocode} % \paragraph*{Action prior to saving} It is important to save the quiz data, we can only do that if we save % it to a field, the value of the field will be saved. We save the data to a hidden text field @@ -366,10 +376,9 @@ cntCorrectResponses.nOutOfInDoc=0; cntCorrectResponses.nPtsCorrectInDoc=0; cntCorrectResponses.nPtsOutOfInDoc=0; % \end{macrocode} -%\leavevmode\IndexJS{cntCorrectResponses()}^^A -% The workhorse of \pkg{eq-save}. It keeps tabs on the -% total number of correct answers and the total number of questions. All \env{shortquiz}es are known immediately, - %but results from \env{quiz} environments are not known until the student presses the `End Quiz' button. +%\leavevmode\IndexJS{cntCorrectResponses()}is the workhorse of \pkg{eq-save}. It keeps tabs on the +%total number of correct answers and the total number of questions. All \env{shortquiz}es are known immediately, +%but results from \env{quiz} environments are not known until the student presses the `End Quiz' button. % \begin{macrocode} function cntCorrectResponses() { var f=this.getField("\eqsroot"); @@ -414,6 +423,7 @@ function cntCorrectResponses() { % included when they should. % \changes{v1.1}{2018/04/07}{Removed test for isCorrect} % \begin{macrocode} +% if (typeof f.isCorrect=="undefined") continue; cntCorrectResponses.nOutOfInDoc+=1; if (f.isCorrect==1) { cntCorrectResponses.nCorrectInDoc+=1; @@ -471,11 +481,10 @@ function cntCorrectResponses() { (cntCorrectResponses.nPtsOutOfInDoc)); } % \end{macrocode} -% \leavevmode\IndexJS{addInQuizResults()}^^A -% Called by \texttt{cntCorrectResponses()} to add in the results +% \leavevmode\IndexJS{addInQuizResults()} is called by \texttt{cntCorrectResponses()} to add in the results % from the quizzes, if known. Because `Begin Quiz' and `End Quiz' can be links (not recommended) we save % the results of the quiz as the value of the field \texttt{ScoreData.\ameta{quizName}}. \pkg{exerquiz} -% package saved the quiz data in the form \texttt{"Score;\penalty0NQuestions;\penalty0ptScore;\penalty0NPointTotal"}. +% package save the quiz data in the form \texttt{"Score;\penalty0NQuestions;\penalty0ptScore;\penalty0NPointTotal"}. % This string can be split and the individual % values may be retrieved. % \begin{macrocode} @@ -502,8 +511,7 @@ cntCorrectResponses.nCorrectInDoc; } } % \end{macrocode} -% \leavevmode\IndexJS{clearAllSQElements()}^^A -% Clears all the quiz fields (all types). Much of the code +% \leavevmode\IndexJS{clearAllSQElements()} clears all the quiz fields (all types). Much of the code % here is copied from \pkg{exerquiz}. % \begin{macrocode} function clearAllSQElements() { @@ -543,8 +551,7 @@ function clearAllSQElements() { oRecordOfQuizData=new Object(); } % \end{macrocode} -% \leavevmode\IndexJS{chk4PassToQuestions()}^^A -% This function is used in the keystroke and format +% \leavevmode\IndexJS{chk4PassToQuestions()} This function is used in the keystroke and format % phase of the \cs{nameField} command. If the student/user clears the field or changes the value % of the field once it has been committed, \texttt{chk4PassToQuestions()} then calls \texttt{clearAllSQElements()} % to clear all fields. @@ -574,8 +581,7 @@ function chk4PassToQuestions(event) { } } % \end{macrocode} -% \leavevmode\IndexJS{collectQuizData()}^^A -% Called by the \texttt{willSave} event. It saves +% \leavevmode\IndexJS{collectQuizData()} is called by the \texttt{willSave} event. It save % the object \texttt{oRecordOfQuizData} to the field \texttt{holdScoreData} as a string. % \begin{macrocode} function collectQuizData() { @@ -583,9 +589,10 @@ function collectQuizData() { f.value=(oRecordOfQuizData.toSource()); } % \end{macrocode} -% \leavevmode\IndexJS{restoreQuizData()}^^A -% Called when the document is opened and attempts to +% \leavevmode\IndexJS{restoreQuizData()} is called when the document is opened and attempts to % transfer the value of \texttt{holdScoreData} back into \texttt{oRecordOfQuizData}. +% \changes{v1.2}{2019/07/02}{Added ProbDist array} +% \changes{v1.2.1}{2019/07/05}{Added RightWrong array} % \begin{macrocode} restoreQuizData.hasRestoredData=false; function restoreQuizData() { @@ -597,26 +604,38 @@ function restoreQuizData() { // name of field is endQuiz.qzname var pos=fname.indexOf("."); var qzName=fname.substring(pos+1); -% \end{macrocode} + var qzRoot=fname.substring(0,pos); + % \end{macrocode} % (2021/02/17) Conditional to handle \texttt{ScoreData} only, this enables other % data that are objects to be present in \texttt{oRecordOfQuizData}. % \changes{v1.2}{2021/02/17}{Added conditional to process \texttt{ScoreData} only} -% \begin{macrocode} - if (fname.indexOf("ScoreData.")) { - lstOfQuizzes[qzName]=eval(qzName); - Score=1*oRecordOfQuizData[fname][0]; - NQuestions=1*oRecordOfQuizData[fname][1]; - ptScore=1*oRecordOfQuizData[fname][2]; - NPointTotal=1*oRecordOfQuizData[fname][3]; - var h=this.getField("ScoreData."+qzName); - h.value=Score+";"+NQuestions+";"+ptScore+";"+NPointTotal; +% \changes{v1.2.5}{2021/04/27}{Added a switch (JS) for more complex decision within +% \string\texttt{restoreQuizData}} +% \begin{macrocode} + switch(qzRoot) { + case "ScoreData": + lstOfQuizzes[qzName]=eval(qzName); + Score=1*oRecordOfQuizData[fname][0]; + NQuestions=1*oRecordOfQuizData[fname][1]; + ptScore=1*oRecordOfQuizData[fname][2]; + NPointTotal=1*oRecordOfQuizData[fname][3]; + var h=this.getField("ScoreData."+qzName); + h.value=Score+";"+NQuestions+";"+ptScore+";"+NPointTotal; + break; + case "ProbDist": + ProbDist=eval(oRecordOfQuizData[fname]); + break; + case "RightWrong": + RightWrong=eval(oRecordOfQuizData[fname]); + break; + default: + console.println("name not recognized:"+fname); } } else f.isCorrect=oRecordOfQuizData[fname]; } } % \end{macrocode} -% \leavevmode\IndexJS{IhrNameFormat()}^^A -% The format script for the \cs{nameField} command. +% \leavevmode\IndexJS{IhrNameFormat()} is the format script for the \cs{nameField} command. % \begin{macrocode} function IhrNameFormat(event){ if(event.value!="") { -- cgit v1.2.3