%% %% This is file `acromemory.sty', %% generated with the docstrip utility. %% %% The original source files were: %% %% acromemory.dtx (with options: `copyright,package') %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% acromemory.sty package, %% %% Copyright (C) 2006--2020 D. P. Story %% %% dpstory@acrotex.net %% %% %% %% This program can redistributed and/or modified under %% %% the terms of the LaTeX Project Public License %% %% Distributed from CTAN archives in directory %% %% macros/latex/base/lppl.txt; either version 1.2 of %% %% the License, or (at your option) any later version. %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{acromemory} [2020/06/23 v2.0 AcroMemory (dps)] \RequirePackage{xkeyval} \DeclareOptionX{acromemory1}{\acromemoryitrue} \DeclareOptionX{acromemory2}{\acromemoryifalse} \DeclareOptionX{includehelp}{\includehelptrue} \DeclareOptionX{draft}{\PassOptionsToPackage{draft}{graphicx}} \newif\ifincludehelp \includehelpfalse \newif\ifacromemoryi \acromemoryifalse \ProcessOptionsX\relax \@ifpackageloaded{eforms}{\execJSOn} {\RequirePackage[execJS]{eforms}} \RequirePackage{aeb-comment} \ifxetex\makeXasPDOff\fi \RequirePackage{icon-appr} \RequirePackage{multido} \RequirePackage{graphicx} \ifacromemoryi \def\RanIdentifier{\@gobble} \includecomment{acromemory1} \excludecomment{acromemory2} \includehelpfalse \else \def\RanIdentifier{R\@gobble} \includecomment{acromemory2} \excludecomment{acromemory1} \fi \newcount\am@nCnt \def\bDebug{\def\memDebug{true}} \def\memDebug{false} \newif\if@isPackaged\@isPackagedfalse \def\isPackage{\@isPackagedtrue} \let\amIconObjs\@gobble \newcommand{\amEmbedTiles}[4][]{\begingroup \gdef\amNumImages{#3}% \csarg\gdef{amGraphicPath#2}{#4}% \gdef\imageImportPath{#4}% \ifacromemoryi \@tempcnta=#3\relax \multiply\@tempcnta\tw@ \xdef\nTotalTiles{\the\@tempcnta}\else \gdef\nTotalTiles{#3}\fi \def\@Ext{#1}\ifx\@Ext\@empty\def\@Ext{.pdf}\else\def\@Ext{.#1}\fi \@tempcnta\z@ \let\@embedList\@empty \let\AMIndxList\@gobble \edef\z{\noexpand\g@addto@macro\noexpand \amIconObjs{,"#2":\amNumImages}}\z \@whilenum \@tempcnta < \amNumImages \do{% \am@nCnt\@tempcnta\advance\am@nCnt\@ne \ifnum\am@nCnt<10\relax\edef\x{0\the\am@nCnt}\else \edef\x{\the\am@nCnt}\fi \edef\z{\noexpand\g@addto@macro\noexpand\AMIndxList{,"#2pic\x"}}\z \ifxetex\if@isPackaged \PackageWarning{acromemory} {There is no support for embedding packaged\MessageBreak PDFs with xelatex. Ignoring the \string\isPackage\MessageBreak command}% \@isPackagedfalse \fi\fi \ifacromemoryi \@tempcntb\@tempcnta \multiply\@tempcntb\tw@ \advance\@tempcntb\@ne \edef\z{\the\@tempcntb}\advance\@tempcntb\@ne \edef\zi{\the\@tempcntb}% \if@isPackaged \ifpdf \edef\y{\noexpand \embedIcon[name=#2pic\x,% hyopts={page=\x}]{#4_package.pdf}}% \else \edef\y{\noexpand \embedIcon[name=#2pic\x,% placement={[1]Membutton.\z,[1]Membutton.\zi},% page=\x-1]{#4_package.pdf}}% \fi \else \edef\y{\noexpand \embedIcon[name=#2pic\x,% placement={[1]Membutton.\z,[1]Membutton.\zi}]{#4_\x\@Ext}}% \fi \else \ifincludehelp\embedIcon[name=helpimage,% placement={[1]memoryhelp}]{#4\@Ext}\fi \edef\z{\the\am@nCnt}% \if@isPackaged \ifpdf \edef\y{\noexpand \embedIcon[name=#2pic\x,% hyopts={page=\x}]{#4_package.pdf}}% \else \edef\y{\noexpand \embedIcon[name=#2pic\x,% placement={[1]MemLbutton.\z,[1]MemRbutton.\z},% page=\x-1]{#4_package.pdf}}% \fi \else \edef\y{\noexpand \embedIcon[name=#2pic\x,% placement={[1]MemLbutton.\z,[1]MemRbutton.\z}% ]{#4_\x\@Ext}}% \fi \fi \expandafter\g@addto@macro\expandafter \@embedList\expandafter{\y}% \@tempcnta\am@nCnt }% do \toks@=\expandafter{\@embedList}\the\toks@ %%\typeout{!! \the\toks@}% \endgroup \global\@isPackagedfalse } \newcommand{\amIconPic}[4][]{% \I{\csOf{name}} required \pushButton[\BG{}\W{1}\S{S}#1\TP{1}%\F{\FHidden} ]{#2}{#3}{#4}} \newcommand\insertTiles[4]{\begingroup \@tempdima#2\relax \divide\@tempdima #4\relax \setbox\z@\hbox{\includegraphics[draft,width=\@tempdima]% {\@nameuse{amGraphicPath#1}}}% \edef\amTileWd{\the\wd\z@}% \setlength\@tempdima{\ht\z@+\dp\z@}% \setbox\z@\box\voidb@x \edef\amTileHt{\the\@tempdima}% \@tempdima\amTileWd\relax \multiply\@tempdima #4\relax \edef\tot@lWd{\the\@tempdima}% \@tempcnta#3\relax \multiply\@tempcnta #4\relax \divide\@tempcnta\tw@ \edef\tot@lHalfTiles{\the\@tempcnta}% \begin{minipage}{\tot@lWd}% \offinterlineskip\hbadness=10000\@tempcnta\z@ \leavevmode \rlap{\amIconPic[\BC{}\BG{}]{nullIconBtn}{0bp}{0bp}}% \multido{\i=1+1}{\tot@lHalfTiles}{% \advance\@tempcnta\@ne \edef\y{\the\@tempcnta}% \ifnum\i<10\relax \edef\x{0\i}\else \edef\x{\i}\fi \edef\iconPresets{\noexpand\IX{\noexpand\csOf{#1pic\x}}}% \amIconPic[\AAmouseup{selectTile();}\FB{true} \presets{\iconPresets}\presets{\amtile@KVs} ]{Membutton.\y}{\amTileWd}{\amTileHt}\allowbreak \advance\@tempcnta\@ne \edef\y{\the\@tempcnta}% \edef\iconPresets{\noexpand\IX{\noexpand\csOf{#1pic\x}}}% \amIconPic[\AAmouseup{selectTile();}\FB{true} \presets{\iconPresets}\presets{\amtile@KVs} ]{Membutton.\y}{\amTileWd}{\amTileHt}\allowbreak }% multido \end{minipage}% \endgroup } \def\amtileKVs#1{\def\amtile@KVs{#1}} \amtileKVs{} \newcommand\insertTilesii[5]{\begingroup \def\@rgv{#5}\def\as@L{L}% \@tempdima#2\relax \setbox\z@\hbox{\includegraphics[draft,width=\@tempdima]{% \@nameuse{amGraphicPath#1}}}% \edef\amImageWd{\the\wd\z@}% \setlength\@tempdima{\ht\z@+\dp\z@}% \setbox\z@\box\voidb@x \edef\amImageHt{\the\@tempdima}% \@tempdima\amImageWd\relax \divide\@tempdima#4\relax \edef\amTileWd{\the\@tempdima}% \@tempdima\amImageHt\relax \divide\@tempdima#3\relax \edef\amTileHt{\the\@tempdima}% \@tempcnta#3\relax \multiply\@tempcnta#4\relax \edef\Tot@lTiles{\the\@tempcnta}% \begin{minipage}{\amImageWd}% \offinterlineskip\hbadness=10000\@tempcnta\z@ \leavevmode \rlap{\amIconPic[\BC{}\BG{}]{nullIconBtn}{0bp}{0bp}}% \multido{\i=1+1}{\Tot@lTiles}{% \advance\@tempcnta\@ne \edef\y{\the\@tempcnta}% \ifnum\i<10\relax \edef\x{0\i}\else \edef\x{\i}\fi \ifx\@rgv\as@L \def\muAction{nRowsAM=#3;nColsAM=#4;\string\r selectNonRandomTile(\y,\y);}\else \def\muAction{nRowsAM=#3;nColsAM=#4;\string\r selectRandomTile(randomAM[\y],\y);}\fi \edef\iconPresets{\noexpand\AAmouseup{\muAction}\noexpand \IX{\noexpand\csOf{#1pic\x}}}% \amIconPic[\presets{\iconPresets} %\FB{true} \presets{\amtile@KVs} ]{Mem#5button.\y}{\amTileWd}{\amTileHt}\allowbreak }% multido \end{minipage}\endgroup } \newcommand\insertTilesL[4]{\ifacromemoryi \def\AM@next{\PackageWarning{acromemory} {The use of \string\insertTilesL\space is supported\MessageBreak only for the acromemory2 option}}\else \def\AM@next{\insertTilesii{#1}{#2}{#3}{#4}{L}}\fi\AM@next} \newcommand\insertTilesR[4]{\ifacromemoryi \def\AM@next{\PackageWarning{acromemory} {The use of \string\insertTilesR\space is supported\MessageBreak only for the acromemory2 option}}\else \def\AM@next{\insertTilesii{#1}{#2}{#3}{#4}{R}}\fi\AM@next} \newcommand{\helpImage}[2][]{% \ifincludehelp{\setbox\z@\hbox{% \includegraphics[draft,width=#2]{\imageImportPath}}% \dimen\z@=\ht\z@\advance\dimen\z@14bp\ht\z@=\dimen\z@ \pushButton[\IX{\csOf{helpimage}}\TP{2} %\CA{\helpCaption} \Ff\FfReadOnly\BC{}\BG{}\S{S}#1]% {memoryhelp}{\the\wd\z@}{\the\ht\z@}}\fi } \newcommand{\rolloverHelpButton}[3][]{% \ifincludehelp \pushButton[\CA{Help}\BC{0 0 1}\BG{0.89 0.9 0.9} \AA{\AAMouseEnter{\JS{% var f = this.getField("memoryhelp");\r oIcon = f.buttonGetIcon(1);\r f.buttonPosition = position.iconTextV;\r f.buttonSetIcon(oIcon,0);\r f.buttonSetCaption({cCaption: "\helpCaption"});\r f.textColor=color.blue;\r }}% \AAMouseExit{\JS{% var f = this.getField("memoryhelp");\r f.buttonPosition = position.iconOnly;\r f.buttonSetIcon(nullIcon,0); }}}#1]{checkhelp}{#2}{#3}% \fi } \def\theHelpCaption#1{\def\helpCaption{#1}} \theHelpCaption{A little help} \newcommand{\messageBox}[3][]{% \textField[#1\Ff\FfMultiline]{MsgBox}{#2}{#3}} \newcommand{\playItAgain}[3][]{\ifacromemoryi \pushButton[\CA{Play again}#1\AAmouseup{playagain();}]% {playAgain}{#2}{#3}\fi } \newcommand{\tryItAgain}[3][]{\ifacromemoryi\else \pushButton[\CA{Test Your Memory}#1\AAmouseup{tryAgain();}]% {testYourMemory}{#2}{#3}\fi } \newcommand{\initFirstiMsg}{"Press the 'Play again' button to initialize the puzzle"} \newcommand{\initFirstiiMsg}{"Press the 'Test Your Memory' button to initialize the puzzle"} \begin{insDLJS*}{memjs} \begin{newsegment}{AcroMemory 1: Global Data and Initialization} // Global Data: var isRandomized=false; var randomAM = new Array(\nTotalTiles+1); var imageNames = new Array(\AMIndxList); imageNames.push(\AMIndxList); imageNames.unshift("null"); var dpsl = randomAM.length; var timeout = 10; var shutdown, rAE; var ok2Continue = true; var nRowsAM, nColsAM; var nCorrectAM = 0; var nAttemptsAM = 0; for (i=1; i<=\nTotalTiles; i++) randomAM[i]=i; var f=this.getField("nullIconBtn"); var nullIcon=f.buttonGetIcon(); var debug = \memDebug; \end{newsegment} \begin{acromemory1} \begin{newsegment}{AcroMemory 2: Initialize Pic Names} var currentChoice = ""; var currentIconName = ""; \end{newsegment} \end{acromemory1} \begin{acromemory2} \begin{newsegment}{AcroMemory 2: Initialize Pic Names} var LcurrentChoice = 0; var LcurrentTile = 0; var RcurrentChoice = 0; var RcurrentTile = 0; \end{newsegment} \end{acromemory2} \begin{newsegment}{AcroMemory 3: Bubble Sort} function clearAM() { for ( var i=1; i<=\nTotalTiles; i++ ) { var f = this.getField("Mem\RanIdentifier button."+i); f.buttonSetIcon(nullIcon); } } function mixupAM() { var i, rand; for (i=1; i<= \nTotalTiles; i++) { var rand = Math.random(); rand *= dpsl*dpsl; rand = Math.ceil(rand); rand = rand \% dpsl; if (rand == 0 ) rand = 1; temp = randomAM[i]; randomAM[i]=randomAM[rand]; randomAM[rand]=temp; } } function showAM() { for ( var i=1; i<=\nTotalTiles; i++ ) { var oIcon = this.getIcon(imageNames[randomAM[i]]); var f = this.getField("Mem\RanIdentifier button."+i); f.buttonSetIcon(oIcon); } } // Begin bubble sort function sortoutAM() { outerLoop(randomAM.length-1); } function outerLoop(i) { if ( ok2Continue && (i >= 0) ) shutdown = % app.setTimeOut("app.clearTimeOut(shutdown); % innerLoop("+i+",1);", timeout); } function innerLoop(i,j) { if ( j <= i ) { if (randomAM[j-1] > randomAM[j]) { var temp = randomAM[j-1]; randomAM[j-1] = randomAM[j]; randomAM[j] = temp; var oIcon = this.getIcon(imageNames[randomAM[j-1]]); var f = this.getField("Mem\RanIdentifier button."+(j-1)); f.buttonSetIcon(oIcon); var oIcon = this.getIcon(imageNames[randomAM[j]]); var f = this.getField("Mem\RanIdentifier button."+j); f.buttonSetIcon(oIcon); } j++ if ( ok2Continue ) shutdown = % app.setTimeOut("app.clearTimeOut(shutdown); % innerLoop("+i+","+j+");", timeout); } else { i--; outerLoop(i); } } function randomizePuzzle() { mixupAM(); for ( var i=1; i<=\nTotalTiles; i++) { var g = this.getField("Mem\RanIdentifier button."+i); var oIcon = this.getIcon(imageNames[randomAM[i]]); g.buttonSetIcon(oIcon,1); if (debug) g.buttonSetIcon(oIcon,0); } isRandomized=true; } \end{newsegment} \begin{acromemory1} \begin{newsegment}{AcroMemory 4: Tile Processing} var currentIndex=""; var currentName=""; var _bOK1=true; function selectTile() // right side randomly arranged { if(!isRandomized){ app.alert(\initFirstiMsg); return; } if (!_bOK1) return; var f = event.target; var oIcon = f.buttonGetIcon(1); f.buttonSetIcon(oIcon,0); var fname = f.name; var re1 = /Membutton\.(\d+)/; var index = re1.exec(fname); if (debug) console.println("index = " + index[1]); var thisiconName = imageNames[randomAM[index[1]]]; if (debug) console.println("thisiconName = " + thisiconName); if ( currentChoice == "" ) { currentChoice = fname; currentIconName = thisiconName; return; } if ( (thisiconName == currentIconName) ) { // right choice nCorrectAM++; nAttemptsAM++ f.readonly = true; var g = this.getField(currentChoice); g.readonly = true; reportProgress(nCorrectAM,nAttemptsAM); resetCountersAM(); } else { // wrong choice nAttemptsAM++ _bOK1=false; reportProgress(nCorrectAM,nAttemptsAM); rAE = app.setTimeOut(% "resetAfterError(\""+currentChoice+"\",\""+fname+"\");% _bOK1=true;", 1000); resetCountersAM(); } } function resetCountersAM () { currentChoice = ""; currentIconName = ""; } function resetAfterError(l,r) { try { app.clearTimeOut(rAE); } catch(e) {}; var f = this.getField(l); var g = this.getField(r); if (!debug) g.buttonSetIcon(nullIcon,0); if (!debug) f.buttonSetIcon(nullIcon,0); } function executePostGameEffects() {return;} function playagain() { for ( var i=1; i<=\nTotalTiles; i++) { var g = this.getField("Membutton."+i); g.buttonSetIcon(nullIcon,0); } g = this.getField("Membutton"); g.readonly=false; resetCountersAM(); nCorrectAM = 0; nAttemptsAM = 0; reportProgress(nCorrectAM,nAttemptsAM); randomizePuzzle(); } \end{newsegment} \end{acromemory1} \begin{acromemory2} \begin{newsegment}{AcroMemory 4: Tile Processing} // save original positions of fields var aLRect=new Array(); var aRRect=new Array(); aLRect.push("null"); aRRect.push("null"); var f=this.getField("MemLbutton"); var g=f.getArray(); for (var i=0; i