summaryrefslogtreecommitdiff
path: root/texmf-dist/source
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2020-06-30 10:08:04 +0900
committerNorbert Preining <norbert@preining.info>2020-06-30 10:08:04 +0900
commitf2461d37fbf50a9a0469fd575362ab099d8e0390 (patch)
tree44d8d2ada1df96489789d9315014457d83ca23e2 /texmf-dist/source
parent538ad8d77209c259a60b9868ff0678eab818855b (diff)
acromemory update
Diffstat (limited to 'texmf-dist/source')
-rw-r--r--texmf-dist/source/latex/acromemory/acromemory.dtx1029
-rw-r--r--texmf-dist/source/latex/acromemory/aeb_pro/aeb_pro.js106
-rw-r--r--texmf-dist/source/latex/acromemory/doc/acromemory_man.tex510
3 files changed, 505 insertions, 1140 deletions
diff --git a/texmf-dist/source/latex/acromemory/acromemory.dtx b/texmf-dist/source/latex/acromemory/acromemory.dtx
index 8770f3c3..2fb7486d 100644
--- a/texmf-dist/source/latex/acromemory/acromemory.dtx
+++ b/texmf-dist/source/latex/acromemory/acromemory.dtx
@@ -2,7 +2,7 @@
%<*copyright>
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% acromemory.sty package, %%
-%% Copyright (C) 2006--2017 D. P. Story %%
+%% Copyright (C) 2006--2020 D. P. Story %%
%% dpstory@acrotex.net %%
%% %%
%% This program can redistributed and/or modified under %%
@@ -14,14 +14,29 @@
%</copyright>
%<package>\NeedsTeXFormat{LaTeX2e}
%<package>\ProvidesPackage{acromemory}
-%<package> [2017/02/23 v1.1 AcroMemory (dps)]
+%<package> [2020/06/23 v2.0 AcroMemory (dps)]
%<*driver>
\documentclass{ltxdoc}
-\usepackage[colorlinks,hyperindex]{hyperref}
+\usepackage[colorlinks,hyperindex=false]{hyperref}
\pdfstringdefDisableCommands{\let\\\textbackslash}%
-\EnableCrossrefs \CodelineIndex
-\OnlyDescription % comment out for implementation details
+\EnableCrossrefs \CodelineIndex \RecordChanges
+\InputIfFileExists{aebdocfmt.def}{\PackageInfo{acromemory}{Inputting aebdocfmt.def}}
+ {\def\IndexOpt{\DescribeMacro}\def\IndexKey{\DescribeMacro}\let\setupFullwidth\relax
+ \PackageInfo{acromemory}{aebdocfmt.def cannot be found}}
\begin{document}
+\bgroup\ttfamily
+\gdef\brpr#1{\char123\relax#1\char125\relax}\egroup
+\let\darg\brpr
+\let\env\texttt
+\let\opt\texttt
+\let\app\textsf
+\def\visispace{\symbol{32}}
+\def\ameta#1{\ensuremath{\langle\textit{\texttt{#1}}\rangle}}
+\def\meta#1{\textsl{\texttt{#1}}}
+\def\SUB#1{\ensuremath{{}_{\mbox{\scriptsize\ttfamily#1}}}}
+\def\ltag{<}\def\rtag{>}
+\def\EXCL{!}
+\let\app\textsf\let\pkg\textsf
\GetFileInfo{acromemory.sty}
\title{The \texttt{AcroMemory} Package\texorpdfstring{\\}{: }
A member of the AeB Pro family}
@@ -32,20 +47,20 @@
\tableofcontents
\let\Email\texttt
\DocInput{acromemory.dtx}
- \PrintIndex
+\IfFileExists{\jobname.ind}{\newpage\setupFullwidth\PrintIndex}{\paragraph*{Index} The index goes here.\\Execute
+ \texttt{makeindex -s gind.ist -o acromemory.ind acromemory.idx} on the command line and recompile
+ \texttt{acromemory.dtx}.}
+\IfFileExists{\jobname.gls}{\PrintChanges}{\paragraph*{Change History} The list of changes goes here.\\Execute
+ \texttt{makeindex -s gglo.ist -o acromemory.gls acromemory.glo} on the command line and recompile
+ \texttt{acromemory.dtx}.}
\end{document}
%</driver>
% \fi
-% \section{What is the AeB Pro Family?}
-% Through the years, I have tried to make my AeB software
-% ({Acro\negthinspace\TeX} eDucation Bundle) compatible with
-% \textsf{pdftex} and \textsf{dvipdfm}; however, during that time,
-% I've developed a number of techniques that require the use of
-% Acrobat and distiller. Therefore, I have set off in a new direction and
-% will be publishing a new line of {\LaTeX} packages, one that require the use
-% of Acrobat.
%
-% The current package, \textsf{AcroMemory}, requires the use of Acrobat Pro~7.0 or later.
+% \MakeShortVerb{|}
+% \InputIfFileExists{aebdonotindex.def}{\PackageInfo{eforms}{Inputting aebdonotindex.def}}
+% {\PackageInfo{eforms}{aebdonotindex.def cannot be found}}
+%
% \section{Introduction}
%
% At the instigation of my erstwhile friend, J\"{u}ergen, I present to you \textsf{AcroMemory}, and
@@ -79,184 +94,342 @@
% The demo files are \texttt{acromemory1.tex} and \texttt{acromemory2.tex}. These files show how to
% lay out the various elements of this package.
%
+% \paragraph*{What's New for version v2.0 (2020-06-23):} Rewrote the entire package to support all
+% \LaTeX\space workflows: \app{pdflatex}, \app{lualatex}, \app{xelatex}, and \app{dvips \texttt{->} distiller}.
+% \changes{v2.0}{2020/06/23}{Rewrote entire package in order to support all \string\LaTeX\space
+% workflows}
+%
% \section{Creating the Image Tiles}
%
-% There are a couple of ways you can package your image tiles: (1) place all tiles (all of identical size)
-% into a single PDF and use the \texttt{iconfile} option to tell AcroMemory you are using this method; (2)
-% each image file is a separate PDF. In the latter case, there is a naming convention that must be followed;
-% the files must be named \texttt{<basename>\_01.pdf}, \texttt{<basename>\_02.pdf}, \dots,
-% \texttt{<basename>\_10.pdf}, \texttt{<basename>\_11.pdf}, \dots. You'll note the consistent two digit
-% numbering system is used.
-
% For \texttt{acromemory2}, slicing of the image is at the very heart
% of this game. You can slice an image in to rectangular tiles using
-% any of several applications: \textsf{Adobe Illustrator},
-% \textsf{Photoshop} and \textsf{ImageReady}, for example. But these are
-% expensive applications and you have already bought \textsf{Acrobat Pro}. For this purpose,
-% AeB Pro provides the \textsf{AcroSlicing} batch sequence.
+% any of several applications: \app{Adobe Illustrator},
+% \app{Photoshop} and \textsf{ImageReady}, for example. But these are
+% expensive applications; a cheap method is to use the {\LaTeX} package
+% \pkg{tile-graphic}.\footnote{\url{https://ctan.org/pkg/tile-graphic}}
%
% \begin{macrocode}
%<*package>
\RequirePackage{xkeyval}
% \end{macrocode}
-% \begin{macro}{acromemory1}
+% \leavevmode\IndexOpt{acromemory1}
% One playing board, where you try to match identical icons.
% \begin{macrocode}
\DeclareOptionX{acromemory1}{\acromemoryitrue}
% \end{macrocode}
-% \end{macro}
-% \begin{macro}{acromemory2}
+% \leavevmode\IndexOpt{acromemory2}
% Two playing boards, one board randomized the other not. Try to find the matching icons,
% one from each of the two boards.
% \begin{macrocode}
\DeclareOptionX{acromemory2}{\acromemoryifalse}
% \end{macrocode}
-% \end{macro}
-% \begin{macro}{acromemory2}
-% Two playing boards, one board randomized the other not. Try to find the matching icons,
-% one from each of the two boards.
-% \begin{macrocode}
-\DeclareOptionX{iconfile}{\def\iconsInOneFile{true}}
-\def\iconsInOneFile{false}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{includehelp}
+% \leavevmode\IndexOpt{includehelp}
% Only valid when \texttt{acromemory2} is taken, this option allows you to provide a
% figure showing the completed puzzle.
% \begin{macrocode}
\DeclareOptionX{includehelp}{\includehelptrue}
% \end{macrocode}
-% \end{macro}
+% \leavevmode\IndexOpt{draft} Draft mode, works for \app{pdflatex} and \app{lualatex} only.
+% \begin{macrocode}
+\DeclareOptionX{draft}{\PassOptionsToPackage{draft}{graphicx}}
+% \end{macrocode}
+% Declare to booleans, and process options
% \begin{macrocode}
\newif\ifincludehelp \includehelpfalse
\newif\ifacromemoryi \acromemoryifalse
-\ProcessOptionsX
+\ProcessOptionsX\relax
+\@ifpackageloaded{eforms}{\execJSOn}
+ {\RequirePackage[execJS]{eforms}}
+\RequirePackage{aeb-comment}
+\ifxetex\makeXasPDOff\fi
+\RequirePackage{icon-appr}
+\RequirePackage{multido}
\RequirePackage{graphicx}
-\RequirePackage{comment}
\ifacromemoryi
\def\RanIdentifier{\@gobble}
\includecomment{acromemory1}
\excludecomment{acromemory2}
- \excludecomment{needhelp}
+ \includehelpfalse
\else
\def\RanIdentifier{R\@gobble}
\includecomment{acromemory2}
\excludecomment{acromemory1}
- \ifincludehelp
- \includecomment{needhelp}
- \else
- \excludecomment{needhelp}
- \fi
\fi
+\newcount\am@nCnt
% \end{macrocode}
% \section{Main Macro Code}
-% When setting up your AcroMemory document, you need to provide this package with
-% certain information, as listed below.
-% \begin{macro}{\theTotalTiles}
-% \begin{macro}{\theNumRows}
-% \begin{macro}{\theNumCols}
-% \begin{macro}{\theImportPath}
-% \begin{macro}{\theIconExt}
-% \begin{macro}{\theTeXImageWidth}
-% \begin{macro}{\provideDimensions}
-%\begin{itemize}
-% \item \cs{theTotalTiles}: The total number of tiles in the game board. For example,
-% \verb!\theTotalTiles{20}!. This parameter is required.
-% \item \cs{theNumRows}: The number of rows in the game board. For example,
-% \verb!\theNumRows{5}!. This parameter is required.
-% \item \cs{theNumCols}: The number of columns in the game board. For example,
-% \verb!\theNumCols{4}!. This parameter is required.
-% \item \cs{theImportPath}: The import path to the basename of the image. The path
-% should use the path specification as defined in the PDF Ref, and the file name should
-% have no extension. For example, \verb!\theImportPath{myFig/myimages}!. Required.
-% There is an optional argument that is typically used when the iconfile is in effect
-% with the acromemory2 option, and an image of the game board is different from the
-% path given by the optional argument; for example,
-%\begin{verbatim}
-% \theImportPath[dpsweb/dpsweb]{dpsweb/dpsweb_package}
-%\end{verbatim}
-% The required argument points the packaged icons, the optional argument points to
-% a file showing the entire image
-% \item \cs{theIconExt}: The extension of the image file(s), Required if different
-% from \texttt{pdf}.
-% \item \cs{theTeXImageWidth}: The scaled width of the rectangular game board. The
-% game board will be rescaled so that its width is equal to the value specified
-% by the argument of this command, e.g., \verb!\theTeXImageWidth{2in}!.
-% \item\cs{provideDimensions}: If the dimension of the game board is known, the width
-% and height can be entered with this command using the two parameters. For example,
-% \verb!\provideDimensions{2in}{2.5in}! (width, height).
-%\end{itemize}
+%
+% \begin{macro}{\bDebug}
+% A debugging command. When executed in the preamble, more is written to the Acrobat console
+% as the document is opened the first time, also, the icons are initially visible so you can
+% see the layout, and quickly play the game. This was used in development extensively to help
+% develop the JavaScript.
+% \begin{macrocode}
+\def\bDebug{\def\memDebug{true}}
+\def\memDebug{false}
+% \end{macrocode}
+% \end{macro}
+% \leavevmode\DescribeMacro\isPackage Placed prior to \cs{amEmbedTiles}, it signals
+% that the images are in a package file.
+% \begin{macrocode}
+\newif\if@isPackaged\@isPackagedfalse
+\def\isPackage{\@isPackagedtrue}
+\let\amIconObjs\@gobble
+% \end{macrocode}
+% \leavevmode\DescribeMacro\amEmbedTiles\hskip-\marginparsep\texttt
+% {[\ameta{ext}]\darg{\ameta{name}}\darg{\ameta{n-rows}}\darg{\ameta{n-cols}}\darg{\ameta{path}}}
+% Embed the required files for this puzzle. We require a \ameta{name}, in the off chance that some day
+% more than one puzzles are allowed.
+% \begin{macrocode}
+\newcommand{\amEmbedTiles}[4][]{\begingroup
+ \gdef\amNumImages{#3}%
+ \csarg\gdef{amGraphicPath#2}{#4}%
+ \gdef\imageImportPath{#4}%
+ \ifacromemoryi
+% \end{macrocode}
+% If \opt{acromemoryi} is in effect, then \texttt{\#3} is half the required icons,
+% each icon is placed twice, then mixed up. Anyway, we double this value going forward.
% \begin{macrocode}
-\def\theTotalTiles#1{\def\nTotalTiles{#1}}
-\def\theNumRows#1{\def\nRows{#1}}
-\def\theNumCols#1{\def\nCols{#1}}
-\newcommand{\theImportPath}[2][]{%
+ \@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
- \def\imageImportPath{#2}
- \def\importpath{#2}
+ \@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
- \def\argi{#1}\ifx\argi\@empty
- \def\imageImportPath{#2}
- \def\importpath{#2}
+ \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
- \def\imageImportPath{#1}
- \def\importpath{#2}
+ \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
}
-\def\theIconExt#1{\def\iconsExt{#1}}
-\def\iconsExt{pdf}
-\def\theTeXImageWidth#1{\def\texImageWidth{#1}%
- {\dimen0 = \texImageWidth \xdef\imageWidth{\strip@pt\dimen0 }}%
-}
-\newcommand{\provideDimensions}[3][]{%
- \def\argi{#1}\ifx\argi\@empty
- {\dimen0 = #2 \xdef\trueImageWidth{\strip@pt\dimen0 }%
- \dimen0 = #3 \xdef\trueImageHeight{\strip@pt\dimen0 }}%
- \else
- \def\trueImageWidth{#1}\def\trueImageHeight{#2}%
- \fi
- \def\bProvideDimen{true}%
+% \end{macrocode}
+% \leavevmode\DescribeMacro\amIconPic\hskip-\marginparsep\texttt
+% {[\ameta{opts}]\darg{\ameta{fname}}\darg{\ameta{wd}}\darg{\ameta{ht}}} A general
+% purpose push button that will have icon appearances.
+% \begin{macrocode}
+\newcommand{\amIconPic}[4][]{% \I{\csOf{name}} required
+ \pushButton[\BG{}\W{1}\S{S}#1\TP{1}%\F{\FHidden}
+ ]{#2}{#3}{#4}}
+% \end{macrocode}
+% \DescribeMacro\insertTiles\hskip-\marginparsep
+% \texttt{\darg{\ameta{name}}\darg{\ameta{width}}\darg{\ameta{rows}}\darg{\ameta{cols}}}
+% Command for placing the tiles of a picture. We assume that the pictures are numbered
+% consecutively across rows.
+% \begin{quote}
+% \begin{description}
+% \item[\ameta{name}] The name of the graphic (a JavaScript identifier)
+% \item[\ameta{width}] The width of the image, the height is scaled proportionally
+% \item[\ameta{rows}] The number of rows
+% \item[\ameta{cols}] The number of columns
+% \end{description}
+% \end{quote}
+% \begin{macrocode}
+\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{}
+% \end{macrocode}
+% \leavevmode\DescribeMacro\insertTilesii\hskip-\marginparsep\texttt
+% {\darg{\ameta{name}}\darg{\ameta{width}}\darg{\ameta{n-rows}}\darg{\ameta{n-cols}}\darg{\ameta{\upshape L\string|R}}}
+% \begin{quote}
+% \begin{description}
+% \item[\ameta{name}] The name of the graphic (a JavaScript identifier)
+% \item[\ameta{width}] The width of the image, the height is scaled proportionally
+% \item[\ameta{rows}] The number of rows
+% \item[\ameta{cols}] The number of columns
+% \item[\ameta{\upshape L\string|R}] Indicates for Left or Right Image
+% \end{description}
+% \end{quote}
+% Is the common code for \cs{insertTilesL} and \cs{insertTilesR}.
+% \begin{macrocode}
+\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}%
+% Now calculate wd and ht of a tile
+ \@tempdima\amImageWd\relax
+ \divide\@tempdima#4\relax
+ \edef\amTileWd{\the\@tempdima}%
+ \@tempdima\amImageHt\relax
+ \divide\@tempdima#3\relax
+ \edef\amTileHt{\the\@tempdima}%
+% Calculate total number of tiles
+ \@tempcnta#3\relax
+ \multiply\@tempcnta#4\relax
+ \edef\Tot@lTiles{\the\@tempcnta}%
+% Begin minipage of width \amImageWd
+ \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
}
-\def\bProvideDimen{false}%
-\def\trueImageWidth{0}\def\trueImageHeight{0}%
% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \begin{macro}{\bDebug}
-% A debugging command. When executed in the preamble, more is written to the Acrobat console
-% as the document is opened the first time, also, the icons are initially visible so you can
-% see the layout, and quickly play the game. This was used in development extensively to help
-% develop the JavaScript.
+% \leavevmode\DescribeMacro\insertTilesL\hskip-\marginparsep\texttt
+% {\darg{\ameta{name}}\darg{\ameta{width}}\darg{\ameta{n-rows}}\darg{\ameta{n-cols}}}
+% Inserts the left-hand tiles, which is the non-randomize version of the picture.
% \begin{macrocode}
-\def\bDebug{\def\memDebug{true}}
-\def\memDebug{false}
+\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}
% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\helpImage}
-% \begin{macro}{\rolloverHelpButton}
-% \begin{macro}{\setHelpImageWidth}
-% \begin{macro}{\theHelpCaption}
-% When \texttt{acromemory2} options and the \texttt{includehelp}
-% options are taken, these commands are available. The command
+% \leavevmode\DescribeMacro\insertTilesR\hskip-\marginparsep\texttt
+% {\darg{\ameta{name}}\darg{\ameta{width}}\darg{\ameta{n-rows}}\darg{\ameta{n-cols}}}
+% Inserts the right-hand tiles, which is the randomized version of the picture.
+% \begin{macrocode}
+\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}
+% \end{macrocode}
+% \begin{macro}{\helpImage}\hskip-\marginparsep\texttt
+% {[\ameta{eform-opts}]\darg{\ameta{width}}}
+% When \texttt{acromemory2} option and the \texttt{includehelp}
+% option are taken, these commands are available. The command
% \cs{helpImage} will contain an icon of the puzzle, and it width
% is set by the command \cs{setHelpImageWidth}. The image is normally
% hidden until the user rolls over the \cs{rolloverHelpButton}. The
% icons appears with an caption under it, the content of the caption
% can be entered using \cs{theHelpCaption}.
% \begin{macrocode}
-\newcommand{\helpImage}[1][]{{%
- \ifincludehelp{\setbox0 = \hbox{%
- \includegraphics[draft,width=\helpImageWidth]%
- {\imageImportPath}}%[\Ff\FfReadOnly]
- \dimen0=\ht0 \advance\dimen0by14bp\ht0=\dimen0
- \pushButton[\BC{}\BG{}\S{S}#1]{memoryhelp}{\the\wd0}{\the\ht0}}\fi
-}}
+\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
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\rolloverHelpButton}
+% \begin{macrocode}
\newcommand{\rolloverHelpButton}[3][]{%
\ifincludehelp
\pushButton[\CA{Help}\BC{0 0 1}\BG{0.89 0.9 0.9}
@@ -275,16 +448,16 @@
}}}#1]{checkhelp}{#2}{#3}%
\fi
}
-\newcommand{\setHelpImageWidth}[1]{\def\helpImageWidth{#1}}
-\def\helpImageWidth{1in}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\theHelpCaption}
+% \begin{macrocode}
\def\theHelpCaption#1{\def\helpCaption{#1}}
\theHelpCaption{A little help}
% \end{macrocode}
% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \begin{macro}{\messageBox}
+% \begin{macro}{\messageBox}\hskip-\marginparsep\texttt
+% {[\ameta{opts}]\darg{\ameta{wd}}\darg{\ameta{ht}}}
% A message text field, as the user works the puzzle, the progress is reported
% to this field.
% \begin{macrocode}
@@ -292,90 +465,52 @@
\textField[#1\Ff\FfMultiline]{MsgBox}{#2}{#3}}
% \end{macrocode}
% \end{macro}
-% \begin{macro}{\playItAgain}
-% For the \texttt{acromemory1} option, this button can be placed to reset
-% the game board, the icons are rearranged hand hidden again.
+% \begin{macro}{\playItAgain}\hskip-\marginparsep\texttt
+% {[\ameta{opts}]\darg{\ameta{wd}}\darg{\ameta{ht}}}
+% For the \texttt{acromemory2} option, this button can be placed to reset
+% the two memory boards, so the memory game can be played again.
% \begin{macrocode}
-\newcommand{\playItAgain}[3][]{\ifacromemoryi{\small
- \pushButton[\CA{Play again}#1\A{\JS{playagain();}}]%
- {playAgain}{#2}{#3}}%
- \fi
+\newcommand{\playItAgain}[3][]{\ifacromemoryi
+ \pushButton[\CA{Play again}#1\AAmouseup{playagain();}]%
+ {playAgain}{#2}{#3}\fi
}
% \end{macrocode}
% \end{macro}
-% \begin{macro}{\ulCornerHere}
-% \begin{macro}{\LulCornerHere}
-% \begin{macro}{\RulCornerHere}
-% \begin{macro}{\reserveSpaceByDimension}
-% \begin{macro}{\reserveSpaceByFile}
-% This group of buttons appear together. \cs{ulCornerHere} is used to
-% set the upper left corner of the game board in the case of the
-% \texttt{acromemory1} option; while \cs{LulCornerHere} and \cs{RulCornerHere}
-% do the same thing for the \texttt{acromemory2} option. One of the two commands
-% \cs{reserveSpaceByDimension} or \cs{reserveSpaceByFile} immediately follow
-% the `corner' commands.
-% \begin{macrocode}
-\def\ulCornerHere{\makebox[0pt][l]%
- {\pushButton[\autoCenter{n}]{ulcorner}{0pt}{0pt}%
- \pushButton[\autoCenter{n}\BC{}\BG{}\FB{true}\I{null}\TP{1}]{nullIconBtn}{0pt}{0pt}%
- }}
-\def\LulCornerHere{\makebox[0pt][l]%
- {\pushButton[\autoCenter{n}]{Lulcorner}{0pt}{0pt}%
- \pushButton[\autoCenter{n}\BC{}\BG{}\FB{true}\I{null}\TP{1}]{nullIconBtn}{0pt}{0pt}%
- }}
-\def\RulCornerHere{\makebox[0pt][l]%
- {\pushButton[\autoCenter{n}]{Rulcorner}{0pt}{0pt}}}
-% \end{macrocode}
-% The two arguments are $\texttt{\#1} = \mbox{width}$ and $\texttt{\#2} = \mbox{height}$.
+% \begin{macro}{\playItAgain}\hskip-\marginparsep\texttt
+% {[\ameta{opts}]\darg{\ameta{wd}}\darg{\ameta{ht}}}
+% For the \texttt{acromemory1} option, this button can be placed to reset
+% the game board, the icons are rearranged hand hidden again.
% \begin{macrocode}
-\def\reserveSpaceByDimension#1#2{%
- \hbox{\ifpreview\setlength\fboxrule{0.4pt}\setlength\fboxsep{0pt}%
- \@tempdima=#1\advance\@tempdima by-\fboxrule
- \@tempdimb=#2\advance\@tempdimb by-\fboxrule
- \fbox{\parbox[t][\@tempdimb][t]{\@tempdima}{\kern0pt\hfill\vfill}}%
- \else\parbox[t][#2][t]{#1}{\kern0pt\hfill\vfill}\fi}%
+\newcommand{\tryItAgain}[3][]{\ifacromemoryi\else
+ \pushButton[\CA{Test Your Memory}#1\AAmouseup{tryAgain();}]%
+ {testYourMemory}{#2}{#3}\fi
}
% \end{macrocode}
-% The optional argument can be used to insert a file that has the same aspect ratio as
-% the puzzle, the default is the one specified by the optional argument of
-% \cs{theImportPath}, which, if not specified, is the same as the required argument
-% of \cs{theImportPath}
-% \begin{macrocode}
-\newcommand{\reserveSpaceByFile}[1][\imageImportPath]%
- {{\setbox0=\hbox{\includegraphics[draft,width=\texImageWidth]{#1}}%
- \reserveSpaceByDimension{\wd0}{\ht0}}}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
% \end{macro}
+%
% \section{Document JavaScript for \textsf{AcroMemory}}
-% Most of the work of this package is done with document JavaScript, and here
-% it is.
-%\par\medskip\noindent
-%\StopEventually{JavaScript listing suppressed,
-% comment out \cs{OnlyDescription} at the beginning of this file to see
-% the JavaScript.}
+% Operational support is provide by JavaScript.
% \begin{macrocode}
-\begin{insDLJS*}[_MemLoaded]{memjs}
+\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:
-_MemLoaded=true;
-var randomDPS = new Array(\nTotalTiles+1);
-var imageNames = new Array();
-imageNames.push("null");
-
-var dpsl = randomDPS.length;
+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 nRows = \nRows;
-var nCols = \nCols;
-var nCorrect = 0;
-var nAttempts = 0;
-
-for (i=1; i<=\nTotalTiles; i++) randomDPS[i]=i;
+var nRowsAM, nColsAM;
+var nCorrectAM = 0;
+var nAttemptsAM = 0;
+for (i=1; i<=\nTotalTiles; i++) randomAM[i]=i;
% \end{macrocode}
% We get the push button with a null icon (nullIconBtn) We get the null icon object
% from it. This technique eliminates the previous need for the Acrobat application when
@@ -386,28 +521,14 @@ var f=this.getField("nullIconBtn");
var nullIcon=f.buttonGetIcon();
var debug = \memDebug;
\end{newsegment}
-
\begin{acromemory1}
\begin{newsegment}{AcroMemory 2: Initialize Pic Names}
-var nttl = \nTotalTiles/2;
-for ( var i = 1; i <= nttl; i++)
-{
- imageNames.push("pic"+i +".0");
- imageNames.push("pic"+i +".1");
-}
var currentChoice = "";
-var currentTile1 = 0;
-var currentTile2 = 0;
var currentIconName = "";
\end{newsegment}
\end{acromemory1}
\begin{acromemory2}
\begin{newsegment}{AcroMemory 2: Initialize Pic Names}
-var nttl = \nTotalTiles;
-for ( var i = 1; i <= nttl; i++)
-{
- imageNames.push("pic."+i);
-}
var LcurrentChoice = 0;
var LcurrentTile = 0;
var RcurrentChoice = 0;
@@ -415,9 +536,7 @@ var RcurrentTile = 0;
\end{newsegment}
\end{acromemory2}
\begin{newsegment}{AcroMemory 3: Bubble Sort}
-// Clear DPS:
-
-function clearDPS()
+function clearAM()
{
for ( var i=1; i<=\nTotalTiles; i++ )
{
@@ -425,9 +544,7 @@ function clearDPS()
f.buttonSetIcon(nullIcon);
}
}
-
-// Mixup DPS:
-function mixupDPS()
+function mixupAM()
{
var i, rand;
for (i=1; i<= \nTotalTiles; i++)
@@ -437,50 +554,51 @@ function mixupDPS()
rand = Math.ceil(rand);
rand = rand \% dpsl;
if (rand == 0 ) rand = 1;
- temp = randomDPS[i];
- randomDPS[i]=randomDPS[rand];
- randomDPS[rand]=temp;
+ temp = randomAM[i];
+ randomAM[i]=randomAM[rand];
+ randomAM[rand]=temp;
}
}
-
-// Show DPS:
-function showDPS()
+function showAM()
{
for ( var i=1; i<=\nTotalTiles; i++ )
{
- var oIcon = this.getIcon(imageNames[randomDPS[i]]);
+ var oIcon = this.getIcon(imageNames[randomAM[i]]);
var f = this.getField("Mem\RanIdentifier button."+i);
f.buttonSetIcon(oIcon);
}
}
-
-// Sortout DPS: begin bubble sort
-function sortoutDPS()
+// Begin bubble sort
+function sortoutAM()
{
- outerLoop(randomDPS.length-1);
+ outerLoop(randomAM.length-1);
}
function outerLoop(i)
{
- if ( ok2Continue && (i >= 0) ) shutdown = app.setTimeOut("app.clearTimeOut(shutdown); innerLoop("+i+",1);", timeout);
+ if ( ok2Continue && (i >= 0) ) shutdown = %
+app.setTimeOut("app.clearTimeOut(shutdown); %
+innerLoop("+i+",1);", timeout);
}
function innerLoop(i,j)
{
if ( j <= i )
{
- if (randomDPS[j-1] > randomDPS[j])
+ if (randomAM[j-1] > randomAM[j])
{
- var temp = randomDPS[j-1];
- randomDPS[j-1] = randomDPS[j];
- randomDPS[j] = temp;
- var oIcon = this.getIcon(imageNames[randomDPS[j-1]]);
+ 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[randomDPS[j]]);
+ 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);
+ if ( ok2Continue ) shutdown = %
+app.setTimeOut("app.clearTimeOut(shutdown); %
+innerLoop("+i+","+j+");", timeout);
}
else
{
@@ -489,19 +607,28 @@ function innerLoop(i,j)
}
}
function randomizePuzzle() {
- mixupDPS();
+ mixupAM();
for ( var i=1; i<=\nTotalTiles; i++) {
var g = this.getField("Mem\RanIdentifier button."+i);
- var oIcon = this.getIcon(imageNames[randomDPS[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);
@@ -509,41 +636,37 @@ function selectTile() // right side randomly arranged
var re1 = /Membutton\.(\d+)/;
var index = re1.exec(fname);
if (debug) console.println("index = " + index[1]);
- var thisiconName = imageNames[randomDPS[index[1]]];
+ var thisiconName = imageNames[randomAM[index[1]]];
if (debug) console.println("thisiconName = " + thisiconName);
- var re = /pic(\d+)\.(\d)/;
- var image = re.exec(thisiconName)
- if (debug) console.println("selected: " + image[1] + "." + image[2]);
if ( currentChoice == "" ) {
currentChoice = fname;
- currentTile1=image[1];
- currentTile2=image[2];
currentIconName = thisiconName;
return;
}
- if ( (image[1] == currentTile1) && (image[2] != currentTile2) )
+ if ( (thisiconName == currentIconName) )
{ // right choice
- nCorrect++;
- nAttempts++
+ nCorrectAM++;
+ nAttemptsAM++
f.readonly = true;
var g = this.getField(currentChoice);
g.readonly = true;
- reportProgress(nCorrect,nAttempts);
- resetCounters();
+ reportProgress(nCorrectAM,nAttemptsAM);
+ resetCountersAM();
} else { // wrong choice
- nAttempts++
- reportProgress(nCorrect,nAttempts);
- rAE = app.setTimeOut("resetAfterError(\""+currentChoice+"\",\""+fname+"\")", 1000);
- resetCounters();
+ nAttemptsAM++
+ _bOK1=false;
+ reportProgress(nCorrectAM,nAttemptsAM);
+ rAE = app.setTimeOut(%
+"resetAfterError(\""+currentChoice+"\",\""+fname+"\");%
+_bOK1=true;", 1000);
+ resetCountersAM();
}
}
-function resetCounters ()
+function resetCountersAM ()
{
currentChoice = "";
- currentTile1 = 0;
- currentTile2 = 0;
currentIconName = "";
}
function resetAfterError(l,r)
@@ -552,9 +675,7 @@ function resetAfterError(l,r)
var f = this.getField(l);
var g = this.getField(r);
if (!debug) g.buttonSetIcon(nullIcon,0);
-// g.strokeColor=color.black;
if (!debug) f.buttonSetIcon(nullIcon,0);
-// f.strokeColor=color.black;
}
function executePostGameEffects() {return;}
function playagain()
@@ -565,28 +686,49 @@ function playagain()
}
g = this.getField("Membutton");
g.readonly=false;
- resetCounters();
- nCorrect = 0;
- nAttempts = 0;
- reportProgress(nCorrect,nAttempts);
+ 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<g.length; i++)aLRect.push(g[i].rect);
+var f=this.getField("MemRbutton");
+var g=f.getArray();
+for (var i=0; i<g.length; i++)aRRect.push(g[i].rect);
+% \end{macrocode}
+% \begin{macrocode}
+var _bOK2=true;
function selectRandomTile(nCnt,n) // right side randomly arranged
{
+ if(!isRandomized){
+ app.alert(\initFirstiiMsg);
+ return;
+ }
+ if (!_bOK2) return;
if ( RcurrentChoice != 0 ) return;
RcurrentChoice = nCnt;
RcurrentTile = n;
- nAttempts++;
+ nAttemptsAM++;
var f = event.target;
f.strokeColor = ["RGB", 0, .6, 0];
var oIcon = f.buttonGetIcon(1);
f.buttonSetIcon(oIcon,0);
if ( LcurrentChoice != 0 ) {
- if (debug) console.println("LcurrentChoice = " + LcurrentChoice + ", RcurrentChoice = " + RcurrentChoice);
+ if (debug) console.println(%
+"LcurrentChoice = " + LcurrentChoice + ", RcurrentChoice = " %
++ RcurrentChoice);
if ( LcurrentChoice == nCnt ) {// right answer
// need to make right side hidden and readonly
// need to make this button readonly
@@ -595,20 +737,30 @@ function selectRandomTile(nCnt,n) // right side randomly arranged
g.readonly = true;
f.strokeColor=color.transparent;
f.readonly = true;
- if (++nCorrect == \nTotalTiles ) // game complete
+ if (++nCorrectAM == \nTotalTiles ) // game complete
executePostGameEffects();
- reportProgress(nCorrect,nAttempts);
- resetCounters();
+ reportProgress(nCorrectAM,nAttemptsAM);
+ resetCountersAM();
} else { // wrong answer
// need to set current choices back to zero
- reportProgress(nCorrect,nAttempts);
- rAE = app.setTimeOut("resetAfterError("+LcurrentTile+","+RcurrentTile+")", 1000);
- resetCounters();
+ reportProgress(nCorrectAM,nAttemptsAM);
+ _bOK2=false;
+ rAE = app.setTimeOut("resetAfterError(%
+"+LcurrentTile+","+RcurrentTile+");_bOK2=true;", 1000);
+ resetCountersAM();
}
}
}
-function selectNonRandomTile(nCnt,n) // left side, arranged in natural order
+% \end{macrocode}
+% \begin{macrocode}
+// left side, arranged in natural order
+function selectNonRandomTile(nCnt,n)
{
+ if(!isRandomized){
+ app.alert(\initFirstiiMsg);
+ return;
+ }
+ if (!_bOK2) return
if ( LcurrentChoice != 0 ) return;
LcurrentChoice = nCnt;
LcurrentTile = n;
@@ -617,7 +769,9 @@ function selectNonRandomTile(nCnt,n) // left side, arranged in natural order
var oIcon = f.buttonGetIcon(1);
f.buttonSetIcon(oIcon,0);
if ( RcurrentChoice != 0 ) {
- if (debug) console.println("LcurrentChoice = " + LcurrentChoice + ", RcurrentChoice = " + RcurrentChoice);
+ if (debug) console.println(%
+"LcurrentChoice = " + LcurrentChoice + ", RcurrentChoice = " %
++ RcurrentChoice);
if ( RcurrentChoice == nCnt ) {// right answer
// need to make right side hidden and readonly
// need to make this button readonly
@@ -626,25 +780,32 @@ function selectNonRandomTile(nCnt,n) // left side, arranged in natural order
g.readonly = true;
f.readonly = true;
f.strokeColor=color.transparent;
- if (++nCorrect == \nTotalTiles ) // game complete
+ if (++nCorrectAM == \nTotalTiles ) // game complete
executePostGameEffects();
- reportProgress(nCorrect,nAttempts);
- resetCounters();
+ reportProgress(nCorrectAM,nAttemptsAM);
+ resetCountersAM();
} else { // wrong answer
// need to set current choices back to zero
- reportProgress(nCorrect,nAttempts);
- rAE = app.setTimeOut("resetAfterError("+LcurrentTile+","+RcurrentTile+")", 1000);
- resetCounters();
+ reportProgress(nCorrectAM,nAttemptsAM);
+ _bOK2=false;
+ rAE = app.setTimeOut(%
+"resetAfterError("+LcurrentTile+","+RcurrentTile+");%
+_bOK2=true;", 1000);
+ resetCountersAM();
}
}
}
-function resetCounters ()
+% \end{macrocode}
+% \begin{macrocode}
+function resetCountersAM ()
{
LcurrentChoice = 0;
RcurrentChoice = 0;
LcurrentTile = 0;
RcurrentTile = 0;
}
+% \end{macrocode}
+% \begin{macrocode}
function resetAfterError(l,r)
{
try { app.clearTimeOut(rAE); } catch(e) {};
@@ -655,8 +816,38 @@ function resetAfterError(l,r)
if (!debug) f.buttonSetIcon(nullIcon,0);
f.strokeColor=color.black;
}
+% \end{macrocode}
+% \begin{macrocode}
+function tryAgain() {
+ nCorrectAM=0;
+ nAttemptsAM=0;
+ reportProgress(nCorrectAM,nAttemptsAM);
+% this.resetForm("MsgBox");
+ resetCountersAM();
+ this.delay=true;
+ for(var i=1; i<=20; i++) {
+ var f=this.getField("MemLbutton."+i);
+ var g=this.getField("MemRbutton."+i);
+ f.buttonSetIcon(nullIcon,0);
+ f.rect=aLRect[i];
+ g.buttonSetIcon(nullIcon,0);
+ g.rect=aRRect[i];
+ }
+ var f=this.getField("MemLbutton");
+ var g=this.getField("MemRbutton");
+ f.lineWidth=1;
+ f.strokeColor=color.black;
+ f.readonly=false;
+ g.lineWidth=1;
+ g.strokeColor=color.black;
+ g.readonly=false;
+ this.delay=false;
+ randomizePuzzle();
+}
+% \end{macrocode}
+% \begin{macrocode}
function executePostGameEffects() {
- sortoutDPS();
+ sortoutAM();
var fL = this.getField("MemLbutton.1");
var fR = this.getField("MemRbutton.1");
var LulCorner = fL.rect;
@@ -664,254 +855,44 @@ function executePostGameEffects() {
var mWidth = LulCorner[2]-LulCorner[0];
var mHeight = LulCorner[1]-LulCorner[3];
var nCnt = 0;
- for ( var i=0; i<nRows; i++) {
- for ( var j=0; j<nCols; j++ ) {
+ for ( var i=0; i<nRowsAM; i++) {
+ for ( var j=0; j<nColsAM; j++ ) {
nCnt++;
try {
var g = this.getField("MemLbutton."+nCnt);
- g.rect = [ LulCorner[0]+j*mWidth, LulCorner[1]-i*mHeight, LulCorner[0]+(j+1)*mWidth, LulCorner[1]-(i+1)*mHeight ]
+ g.rect = %
+[ LulCorner[0]+j*mWidth, LulCorner[1]-i*mHeight, %
+LulCorner[0]+(j+1)*mWidth, %
+LulCorner[1]-(i+1)*mHeight ]
g.lineWidth = 0;
g.strokeColor = color.transparent;
-
+% \end{macrocode}
+% \begin{macrocode}
var h = this.getField("MemRbutton."+nCnt);
- h.rect = [ RulCorner[0]+j*mWidth, RulCorner[1]-i*mHeight, RulCorner[0]+(j+1)*mWidth, RulCorner[1]-(i+1)*mHeight ]
+ h.rect = [ RulCorner[0]+j*mWidth, %
+RulCorner[1]-i*mHeight, %
+RulCorner[0]+(j+1)*mWidth, RulCorner[1]-(i+1)*mHeight ]
h.lineWidth = 0;
h.strokeColor = color.transparent;
-
- } catch(e) { console.println("set properties: " + e.toSource()) }
+ } catch(e) { %
+console.println("set properties: " + e.toSource()) }
}
}
}
\end{newsegment}
\end{acromemory2}
\begin{newsegment}{AcroMemory 5: Reporting}
-function reportProgress(nCorrect,nAttempts) {
+function reportProgress(nCorrectAM,nAttemptsAM) {
var Msg = this.getField("MsgBox")
if ( Msg != null ) {
- Msg.value = "Number matched = " + nCorrect
- + "\n Number of attempts = " + nAttempts;
+ Msg.value = "Number matched = " + nCorrectAM
+ + "\n Number of attempts = " + nAttemptsAM;
}
}
-try { randomizePuzzle(); } catch(e) {}
+%try { randomizePuzzle(); } catch(e) {}
+%var to=app.setTimeOut("randomizePuzzle();",1000);
\end{newsegment}
\end{insDLJS*}
-
-\begin{acromemory1}
-\begin{execJS}{acromemjs}
-var l = \nTotalTiles/2;
-var pt2bpScaleFactor = 72/72.27;
-if (\iconsInOneFile) {
- for ( var i = 0; i < l; i++)
- {
- try {
- aebTrustedFunctions(this, aebImportIcon, {cName: "pic"+(i+1) +".0", cDIPath: "\importpath.pdf", nPage: i }, this);
- aebTrustedFunctions(this, aebImportIcon, {cName: "pic"+(i+1) +".1", cDIPath: "\importpath.pdf", nPage: i }, this);
- }
- catch(e) {console.println("exception: " + e.toSource())}
- }
-} else {
- var index, j;
- for ( var i = 0; i < l; i++)
- {
- try {
- j = i+1;
- index = ( j < 10 ) ? "0"+j : ""+j;
- if (debug) console.println("Importing: \importpath_"+index+".\iconsExt")
- aebTrustedFunctions(this, aebImportIcon, {cName: "pic"+j+".0", cDIPath: "\importpath_"+index+".\iconsExt"}, this);
- aebTrustedFunctions(this, aebImportIcon, {cName: "pic"+j+".1", cDIPath: "\importpath_"+index+".\iconsExt"}, this);
- }
- catch(e) {console.println("import exception: " + e.toSource())}
- }
-}
-
-// Now lay out the icon fields.
-var f = this.getField("ulcorner");
-var ulCorner = f.rect;
-var nPage = f.page;
-this.removeField("ulcorner");
-
-if (\bProvideDimen) {
- var width = \trueImageWidth*pt2bpScaleFactor;
- var height =\trueImageHeight*pt2bpScaleFactor;
-} else {
- var doc = aebTrustedFunctions( this, aebAppOpenDoc, { cPath: "\importpath.pdf", oDoc: this });
- var aRect = doc.getPageBox({cBox:"Crop"})
- doc.closeDoc(true);
- var width = aRect[2]-aRect[0];
- var height = aRect[1]-aRect[3];
-}
-var scaleFactor = (\imageWidth*pt2bpScaleFactor)/width;
-
-var scaledWidth = width*scaleFactor;
-var scaledHeight = height*scaleFactor;
-
-if (debug) {
- console.println("scaleFactor = " + scaleFactor);
- console.println("scaledWidth = " + scaledWidth);
- console.println("scaledHeight = " + scaledHeight);
-}
-
-var mWidth = scaledWidth/nCols
-var mHeight = scaledHeight/nRows
-
-var nCnt = 0;
-
-for ( var i=0; i<nRows; i++) {
- for ( var j=0; j<nCols; j++ ) {
- nCnt++;
- try {
- var g = this.addField({
- cName: "Membutton."+nCnt,
- cFieldType: "button",
- nPageNum: nPage,
- oCoords: [ ulCorner[0]+j*mWidth, ulCorner[1]-i*mHeight, ulCorner[0]+(j+1)*mWidth, ulCorner[1]-(i+1)*mHeight ]
- });
- } catch(e) { console.println( e.toSource() ); }
- try {
- g.highlight=highlight.p
- g.buttonPosition = position.iconOnly;
- g.lineWidth = 1;
- g.strokeColor = color.black;
- g.setAction("MouseDown", "selectTile();")
- } catch(e) { console.println("set properties: " + e.toSource()) }
- try {
- var pNCnt = nCnt + 1;
- var index = parseInt( pNCnt/2)
- var oIcon = this.getIcon("pic"+index+"."+ ( pNCnt \% 2 ));
- g.buttonSetIcon(oIcon,1);
- if (debug) g.buttonSetIcon(oIcon,0);
- } catch(e) { console.println("set properties: " + e.toSource()) }
- }
-}
-try { randomizePuzzle(); } catch(e) { console.println("execJS--randomizePuzzle exceptions: " + e.toSource()) }
-var isRandomized = true;
-\end{execJS}
-\end{acromemory1}
-
-\begin{acromemory2}
-\begin{execJS}{execjs}
-var index;
-var pt2bpScaleFactor = 72/72.27;
-if (\iconsInOneFile) {
- for ( var i = 1; i <= \nTotalTiles; i++)
- {
- index = ( i < 10 ) ? "0"+i : ""+i;
- if (debug) console.println("\importpath_"+index+".\iconsExt")
- try { aebTrustedFunctions(this, aebImportIcon, {cName: "pic."+i, cDIPath: "\importpath.pdf", nPage: (i-1) }, this);
- }
- catch(e) {console.println("exception: " + e.toSource())}
- }
-} else {
- for ( var i = 1; i <= \nTotalTiles; i++)
- {
- index = ( i < 10 ) ? "0"+i : ""+i;
- if (debug) console.println("\importpath_"+index+".\iconsExt")
- try { aebTrustedFunctions(this, aebImportIcon, {cName: "pic."+i, cDIPath: "\importpath_"+index+".\iconsExt"}, this);
- }
- catch(e) {console.println("exception: " + e.toSource())}
- }
-}
-// Now lay out the icon fields.
-var f = this.getField("Lulcorner");
-var ulCorner = f.rect;
-var nPage = f.page;
-this.removeField("Lulcorner");
-
-if (\bProvideDimen) {
- var width = \trueImageWidth*pt2bpScaleFactor;
- var height =\trueImageHeight*pt2bpScaleFactor;
-} else {
- var doc = aebTrustedFunctions( this, aebAppOpenDoc, { cPath: "\imageImportPath.pdf", oDoc: this });
- var aRect = doc.getPageBox({cBox:"Crop"})
- doc.closeDoc(true);
- var width = aRect[2]-aRect[0];
- var height = aRect[1]-aRect[3];
-}
-var scaleFactor = (\imageWidth*pt2bpScaleFactor)/width;
-
-var scaledWidth = width*scaleFactor;
-var scaledHeight = height*scaleFactor;
-
-if (debug) {
- console.println("scaleFactor = " + scaleFactor);
- console.println("scaledWidth = " + scaledWidth);
- console.println("scaledHeight = " + scaledHeight);
-}
-
-var mWidth = scaledWidth/nCols
-var mHeight = scaledHeight/nRows
-
-%console.println("mWidth = " + mWidth);
-%console.println("mHeight = " + mHeight);
-
-var nCnt = 0;
-
-for ( var i=0; i<nRows; i++) {
- for ( var j=0; j<nCols; j++ ) {
- nCnt++;
- try {
- var g = this.addField({
- cName: "MemLbutton."+nCnt,
- cFieldType: "button",
- nPageNum: nPage,
- oCoords: [ ulCorner[0]+j*mWidth, ulCorner[1]-i*mHeight, ulCorner[0]+(j+1)*mWidth, ulCorner[1]-(i+1)*mHeight ]
- });
- } catch(e) { console.println( e.toSource()); }
- try {
- g.highlight=highlight.p
- g.buttonPosition = position.iconOnly;
- g.lineWidth = 1;
- g.strokeColor = color.black;
- g.setAction("MouseDown", "selectNonRandomTile("+nCnt+","+nCnt+");")
- } catch(e) { console.println("set properties: " + e.toSource()) }
- var oIcon = this.getIcon("pic."+nCnt);
- g.buttonSetIcon(oIcon,1);
- if (debug) g.buttonSetIcon(oIcon,0);
- }
-}
-// Now lay out the icon fields.
-var f = this.getField("Rulcorner");
-var ulCorner = f.rect;
-this.removeField("Rulcorner");
-
-var nCnt = 0;
-
-for ( var i=0; i<nRows; i++) {
- for ( var j=0; j<nCols; j++ ) {
- nCnt++;
- try {
- var g = this.addField({
- cName: "MemRbutton."+nCnt,
- cFieldType: "button",
- nPageNum: nPage,
- oCoords: [ ulCorner[0]+j*mWidth, ulCorner[1]-i*mHeight, ulCorner[0]+(j+1)*mWidth, ulCorner[1]-(i+1)*mHeight ]
- });
- } catch(e) { console.println( e.toSource()); }
- try {
- g.highlight=highlight.p
- g.buttonPosition = position.iconOnly;
- g.lineWidth = 1;
- g.strokeColor = color.black;
- g.setAction("MouseDown", "selectRandomTile(randomDPS["+nCnt+"],"+nCnt+");")
- } catch(e) { console.println("set properties: " + e.toSource()) }
- }
-}
-try { randomizePuzzle(); } catch(e) { console.println("randomizePuzzle exceptions: " + e.toSource()) }
-var isRandomized = true;
-\end{execJS}
-\end{acromemory2}
-\begin{needhelp}
-\begin{execJS}{helpjs}
-try {
- aebTrustedFunctions(this, aebImportIcon, {cName: "helpicon", cDIPath: "\imageImportPath.\iconsExt"}, this);
- var f = this.getField("memoryhelp");
- var oIcon = this.getIcon("helpicon");
- f.buttonPosition = position.iconOnly;
- f.buttonSetIcon(oIcon,1);
- f.buttonSetCaption({cCaption: "\helpCaption"});
-} catch(e) {console.println("exception: " + e.toSource())}
-\end{execJS}
-\end{needhelp}
%</package>
% \end{macrocode}
% \Finale
diff --git a/texmf-dist/source/latex/acromemory/aeb_pro/aeb_pro.js b/texmf-dist/source/latex/acromemory/aeb_pro/aeb_pro.js
deleted file mode 100644
index 02b1e658..00000000
--- a/texmf-dist/source/latex/acromemory/aeb_pro/aeb_pro.js
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- AEB Pro Document Assembly Methods
-
- Copyright (C) 2009 AcroTeX.Net
- D. P. Story
- http://www.acrotex.net
-
- Version 1.1
-*/
-
-if ( typeof aebTrustedFunctions == "undefined") {
- aebTrustedFunctions = app.trustedFunction( function ( doc, oFunction, oArgs )
- {
- app.beginPriv();
- var retn = oFunction( oArgs, doc )
- app.endPriv();
- return retn;
- });
-}
-aebAddWatermarkFromFile = app.trustPropagatorFunction( function ( oArgs, doc )
-{
- app.beginPriv();
- return retn = doc.addWatermarkFromFile(oArgs);
- app.endPriv();
-});
-aebImportIcon = app.trustPropagatorFunction( function ( oArgs, doc )
-{
- app.beginPriv();
- return retn = doc.importIcon(oArgs);
- app.endPriv();
-});
-aebInsertPages = app.trustPropagatorFunction( function ( oArgs, doc )
-{
- app.beginPriv();
- try { doc.insertPages(oArgs); } catch(e) {console.println("Error: " + e.toString());}
- app.endPriv();
-})
-aebAppOpenDoc = app.trustPropagatorFunction( function ( oArgs, doc )
-{
- app.beginPriv();
- try { var retn = app.openDoc(oArgs); } catch(e) {console.println("Error: " + e.toString());}
- app.endPriv();
- return retn;
-})
-aebImportSound = app.trustPropagatorFunction( function ( oArgs, doc )
-{
- app.beginPriv();
- return retn = doc.importSound(oArgs);
- app.endPriv();
-});
-aebSaveAs = app.trustPropagatorFunction( function ( oArgs, doc )
-{
- app.beginPriv();
- app.execMenuItem("Save");
- app.endPriv();
-});
-aebExtractPages = app.trustPropagatorFunction( function ( oArgs, doc )
-{
- app.beginPriv();
- return retn = doc.extractPages(oArgs);
- app.endPriv();
-});
-aebMailDoc = app.trustPropagatorFunction( function ( oArgs, doc )
-{
- app.beginPriv();
- return retn = doc.mailDoc(oArgs);
- app.endPriv();
-});
-aebImportDataObject = app.trustPropagatorFunction( function ( oArgs, doc )
-{
- app.beginPriv();
- return retn = doc.importDataObject(oArgs);
- app.endPriv();
-});
-aebSignatureSign = app.trustPropagatorFunction( function ( oArgs, field )
-{
- app.beginPriv();
- return retn = field.signatureSign(oArgs);
- app.endPriv();
-});
-aebSecurityHandlerLogin = app.trustPropagatorFunction( function ( oArgs, securityHandler )
-{
- app.beginPriv();
- return retn = securityHandler.login(oArgs);
- app.endPriv();
-});
-aebSecurityGetHandler = app.trustPropagatorFunction( function ( oArgs, security )
-{
- app.beginPriv();
- return retn = security.getHandler(oArgs);
- app.endPriv();
-});
-aebAppGetPath = app.trustPropagatorFunction( function ( oArgs, doc )
-{
- app.beginPriv();
- var retn = app.getPath(oArgs);
- app.endPriv();
- return retn;
-})
-aebSignatureSetSeedValue = app.trustPropagatorFunction( function ( oArgs, field )
-{
- app.beginPriv();
- return retn = field.signatureSetSeedValue(oArgs);
- app.endPriv();
-});
-
diff --git a/texmf-dist/source/latex/acromemory/doc/acromemory_man.tex b/texmf-dist/source/latex/acromemory/doc/acromemory_man.tex
deleted file mode 100644
index fd8869d5..00000000
--- a/texmf-dist/source/latex/acromemory/doc/acromemory_man.tex
+++ /dev/null
@@ -1,510 +0,0 @@
-\documentclass{article}
-\usepackage[fleqn]{amsmath}
-\usepackage[
- web={centertitlepage,designv,forcolorpaper,usesf,tight,latextoc,pro},
- eforms,
-% linktoattachments,
- aebxmp
-]{aeb_pro}
-%\usepackage{aeb_mlink}
-%\usepackage{myriadpro}
-%\usepackage[usecmtt]{myriadpro}
-\usepackage[altbullet]{lucidbry}
-\usepackage{acroman}
-
-%\usepackage{myriadpro}
-%\usepackage{acaslonpro}
-%\usepackage{ajensonpro}
-%\usepackage{minionpro}
-%\usepackage{newsgothicstd}
-%\usepackage{lucidbry}
-
-\university{\AcroTeX.Net\\The AeB Pro family}
-\title{The AcroMemory Package\texorpdfstring{\\}{: }Manual of Usage}
-\author{D. P. Story}
-\email{dpstory@acrotex.net}
-\subject{Documentation for AcroMemory, the memory game}
-\keywords{Adobe Acrobat, JavaScript, AcroSlicing, game}
-\copyrightStatus{True}
-\copyrightNotice{Copyright (C) \the\year, D. P. Story}
-\copyrightInfoURL{http://www.acrotex.net}
-
-\def\nhfootnote#1{\begin{NoHyper}\footnote{#1}\end{NoHyper}}
-
-\def\dps{$\hbox{$\mathfrak D$\kern-.3em\hbox{$\mathfrak P$}%
- \kern-.6em \hbox{$\mathcal S$}}$}
-
-
-\definePath\bgPath{"C:/Users/Public/Documents/ManualBGs/Manual_BG_Print_AeB.pdf"}
-\begin{docassembly}
-\addWatermarkFromFile({
- bOnTop:false,
- cDIPath:\bgPath
-});
-\executeSave();
-\end{docassembly}
-
-\begin{document}
-
-%\begingroup
-
-%\linewidth=\fullscreenwidth
-%\advance\linewidth\oddsidemargin
-%\setlength{\oddsidemargin}{0pt}
-\maketitle
-
-%\endgroup
-
-\changelinkcolorto{black}
-
-\tableofcontents
-
-\changelinkcolorto{webgreen}
-
-
-\section{What is the AeB Pro Family?}
-
- Through the years, I have tried to make my AeB software
- ({Acro\negthinspace\TeX} eDucation Bundle) compatible with
- \textsf{pdftex} and \textsf{dvipdfm}; however, during that time,
- I've developed a number of techniques that require the use of
- Acrobat and distiller. Therefore, I have set off in a new
- direction and will be publishing a new line of {\LaTeX} packages,
- ones that require the use of Acrobat.\nhfootnote{I will, however,
- continue to develop the original AeB, never fear!}
-
-\newtopic The current package, \textsf{AcroMemory}, requires the use
- of Acrobat Pro~7.0 or later.
-
-\section{Introduction}
-
-At the prompting and encouragement of my erstwhile friend,
-J\"{u}rgen, I present to you \textsf{AcroMemory}, and for the life
-of me, I can't remember why.
-
-Oh, yes, \textsf{AcroMemory} is a memory game in which you find the
-matching tiles. There are two versions---available as options of
-this package---for your enjoyment, \texttt{acromemory1} and
-\texttt{acromemory2} (the default).
-\begin{itemize}
- \item \texttt{acromemory1}: Here you have a single game board, a
- rectangular region divided by rows and columns. The total number
- of tiles should be even, each tile should have a matching twin.
- The game begins with all the tiles hidden. The user clicks a
- tile, then another. If the tiles do not match, they become
- hidden again (you did remember the position of those tiles,
- didn't you?); otherwise, they remain visible and are now
- read-only. The game is complete when the user, with a lot of time
- on his/her hands, matches all tiles. There is a running
- tabulation kept on the number of tries. There is also a button
- which resets the game and randomizes the tiles.
-
- \item \texttt{acromemory2}: For this game you have two identical
- rectangular images subdivided into tiles (or slices), which
- are arrayed in rows and columns. The tiles for one of the
- two images is randomly re-arranged. The object of the
- game is to find all the matching tiles by choosing a tile
- from one image and a tile from the other image. As in the
- first case, if the selected tiles do not match, they are
- hidden after a short interval of time (you did remember the
- position of those tiles, didn't you?); otherwise, they
- remain visible and are now read-only. The game is over when
- all tiles are matched; when this occurs, end-of-game special
- effects occur that will dazzle the senses. There is an
- option to view a small image to help you locate the matching
- tiles on the non-randomized; useful if the image is complex.
- There is no reset button at this time, to play again, the
- user must therefore close and open the document.
-\end{itemize}
-The demo files are \texttt{acromemory1\_1.tex},
-\texttt{acromemory1\_2.tex}, \texttt{acromemory2\_1.tex} and
-\texttt{acromemory2\_2.tex}. These files show how to lay out the
-various elements of this package.
-
-\newtopic\textbf{Requirements:} Acrobat~7 Professional.
-
-\section{Distribution and Installation}\label{installation}
-
-The distribution comes with the following files:
-\begin{itemize}
-
- \item \texttt{acromemory.dtx}, \texttt{acromemory.sty} and \texttt{acromemory.ins}:
- These are the program files. The file \texttt{acromemory.dtx} has additional documentation
- with more technical details than this manual.
-
- \item The files \texttt{acromemory1\_1.tex},
- \texttt{acromemory1\_2.tex}, \texttt{acromemory2\_1.tex} and
- \texttt{acromemory2\_2.tex}: The demo files for this package.
-
- \item \texttt{aeb\_pro.js}: A JavaScript file that contains
- security restricted methods.
-
- \item The \textsf{AeB Slicing} Batch Sequence: This is a batch
- sequence that slices a given image into a specified number of
- rows and columns. The documentation file name is
- \texttt{aebslicing\_sequ\_doc.pdf} and comes with the
- distribution. Installation details for \textsf{AeB Slicing}
- are contained in its documentation.
-
- \item Sample image files, \texttt{dinos} (for the
- \texttt{acromemory1} option) and \texttt{dpsweb} (this time
- for the \texttt{acromemory2} option), contained in their own folders.
-
-\end{itemize}
-
-\newtopic When you unzip \texttt{acromemory.zip}, the folder
-\texttt{acromemory} will be created, the entire distribution will be
-placed in this folder. This folder must be on your {\LaTeX} search
-path and you need to refresh your file name database if you are
-using a {\TeX} system, such as MIK\TeX, that has this database
-scheme. At the top level will be the {\LaTeX} package and demo
-files. The subfolders are
-\begin{itemize}
- \item \texttt{aeb\_pro}: In this folder is \texttt{aeb\_pro.js}, a
- JavaScript file that needs to be installed on your hard drive.
- Copy this file to the User's
- \texttt{JavaScripts} folder. To find this folder, execute the
- script
-\begin{Verbatim}[xleftmargin=20pt,fontsize=\fontsize{9}{11}\selectfont]
-app.getPath("user", "javascript");
-\end{Verbatim}
-in the JavaScript Debugger Console window.\nhfootnote{Place the cursor
-on the line containing this script and press the \texttt{Ctrl+Enter}
-key.} The return value of this is the path to the
-\texttt{JavaScripts} folder; for example, on my system it returns
-\begin{Verbatim}[xleftmargin=20pt,fontsize=\fontsize{9}{11}\selectfont]
-/C/Documents and Settings/dps/Application Data/
- Adobe/Acrobat/8.0/JavaScripts
-\end{Verbatim}
-For user's of Acrobat 10.1.1 (or later), the JavaScripts folder has moved,
-see my blog article \textsl{\href{http://www.acrotex.net/blog/?p=737}{Acrobat Security Changes in 10.1.1 and
-Acro\!\TeX}}.
-
-After placing \texttt{aeb\_pro.js}, restart Acrobat so it will read this file.
- \item \texttt{dpsweb}: Image files used in \texttt{acromemory2\_1.tex} and \texttt{acromemory2\_2.tex}.
- \item \texttt{dinos}: Image files used in \texttt{acromemory1\_1.tex} and \texttt{acromemory1\_2.tex}.
-\end{itemize}
-
-\newtopic Follow the installation instructions for the \textsf{AcroSlicing} batch sequence.
-
-\section{Package Options}
-
-There are a few options of this package:
-\begin{itemize}
- \item \texttt{acromemory1} and \texttt{acromemory2}: As described earlier. The \texttt{acromemory2} option
- is the default, so it need never be used, actually.
- \item \texttt{iconfile}: There are two methods of delivering the slices of the game board(s) to this package:
- \begin{enumerate}
- \item The default method is to have one file for each sliced
- image. There is a numbering system for the slices, the same system
- used by \textsf{Aeb Slicing} batch sequence, is to number them
- with a two digit number across rows:\smallskip
-
-\begin{Verbatim}[xleftmargin=20pt,fontsize=\fontsize{9}{11}\selectfont]
-\texttt{<basename>\_01}, \texttt{<basename>\_02}, ...
-\end{Verbatim}
-
- \item[]The demo files \texttt{acromemory1\_2.tex} and
- \texttt{acromemory2\_2.tex} illustrate this method.
-
- \item All slices are placed in a single PDF in the same order just
- described, that is listed by rows. There is an option in the
- \textsf{AeB Slicing} batch sequence for ``packaging'' the
- slices in this way. The demo files \texttt{acromemory1\_1.tex}
- and \texttt{acromemory2\_1.tex} illustrate this method.
- \end{enumerate}
- The \textsf{AcroMemory} package expects, by default, the first method
- described. By specifying the \texttt{iconfile} option,
- \textsf{AcroMemory} will get the slices for the single PDF.
-
- \item \texttt{includehelp}: When building a file with the acromemory2
- option, you can also include a help image, a small picture of the game
- board to help the user to match the randomized slices with the ones on
- the non-randomized game board. Useful if the image is very complex.
- The demo files \texttt{acromemory2\_1.tex} and
- \texttt{acromemory2\_2.tex} both contain the necessary code for
- producing the help feature, the commands only create the help feature
- if the \texttt{includehelp} option is taken.
-\end{itemize}
-
-\noindent\textbf{\color{red}Important.} You need to set the preferences of Acrobat as follows:
-\begin{enumerate}
- \item Start Acrobat, and select \texttt{Edit > Preferences}
- \item Choose Trust Manager from the Categories panel on the left
- \item Check the `Allow external content' check box
-\end{enumerate}
-\noindent The above settings allow the post-distillation assembly to take place.
-
-\section{Commands of the Package}
-
-This section describes the various commands available to you through
-this package. This section can be skipped on first reading, most of
-the commands are described less formally in subsequent sections.
-
-\newtopic The following commands are suitable for placement in the
-preamble of your document.
-
-\begin{itemize}
- \item \cs{theTotalTiles}: The total number of tiles in the game board. This parameter is required.
- For example, \verb!\theTotalTiles{20}!.
- \item \cs{theNumRows}: The number of rows in the game board. This parameter is required.
- For example, \verb!\theNumRows{5}!.
- \item \cs{theNumCols}: The number of columns in the game board.
- This parameter is required. For example, \verb!\theNumCols{4}!.
- \item \cs{theImportPath}: The import path to the base name of the image. The path
- should use the path specification as defined in the \emph{PDF Reference}, and the file name should
- have no extension. Required. For example,\smallskip
-\begin{Verbatim}[xleftmargin=20pt,fontsize=\fontsize{9}{11}\selectfont]
-\theImportPath{myFig/myimages}
-\end{Verbatim}
-
- There is an optional argument that is typically used when the \texttt{iconfile} is in effect
- with the \texttt{acromemory2} option, and an image of the game board is different from the
- path given by the optional argument; for example,
-\begin{verbatim}
- \theImportPath[dpsweb/dpsweb]{dpsweb/dpsweb_package}
-\end{verbatim}
- The required argument points the packaged icons, the optional argument points to
- a file showing the entire image. See \texttt{acromemory2\_1.tex} for an
- example of this situation.
- \item \cs{theIconExt}: The extension of the image file(s). Required if different
- from \texttt{pdf}. (Acrobat can make the conversion to PDF.)
- \item \cs{theTeXImageWidth}: The scaled width of the rectangular game board. The
- game board will be rescaled so that its width is equal to the value specified
- by the argument of this command, e.g., \verb!\theTeXImageWidth{2in}!.
- \item\cs{provideDimensions}: If the dimension of the game board is known, the width
- and height can be entered with this command using the two parameters. For example,
- \verb!\provideDimensions{2in}{2.5in}! (width, height).
-\item \cs{bDebug}: A debugging command. When executed in the
- preamble, more is written to the Acrobat console as the document is
- opened the first time, also, the icons are initially visible so you
- can see the layout, and quickly play the game. This was used in
- development extensively to help develop the JavaScript.
-
-\end{itemize}
-
-\newtopic The rest of the commands in this section are properly
-placed in the body of the document. They are the elements of the
-game board(s) and supporting elements.
-
-\newtopic\textbf{Game Board(s)}
-\begin{itemize}
-\item \cs{ulCornerHere}: Used with the \texttt{acromemory1} option,
-this command sets the upper left corner of the game board. It is
-followed by either of the two commands \cs{reserveSpaceByDimension} or
-\cs{reserveSpaceByFile}.
-
-\item \cs{LulCornerHere}, \cs{RulCornerHere}: Used with the
-\texttt{acromemory2} option, these commands set the upper left
-corner of the two game boards, on the left and the other on the
-right. Each of these two commands is immediately followed by one of
-the two commands \cs{reserveSpaceByDimension} or
-\cs{reserveSpaceByFile}.
-
-\item \cs{reserveSpaceByDimension}: If the size of the image is
-known, you can reserve space for it by using this command. It has
-two arguments: the first argument is the width of the image, the
-second is the height. This command is useful for
-\texttt{acromemory1} where the game board is made up of some many
-rows and columns of tiles whose dimensions you know.
-
-\item \cs{reserveSpaceByFile}: This command does an
-\cs{includegraphics} in draft mode to get the dimensions of the game
-board. The required space is made for the rescaled image. The
-optional argument can be used to insert a file that has the same
-aspect ratio as the puzzle, the default is the one specified by the
-optional argument of \cs{theImportPath}, which, if not specified, is
-the same as the required argument of \cs{theImportPath}.
-\end{itemize}
-
-\goodbreak
-\newtopic\textbf{Supporting fields}
-\begin{itemize}
-
-\item \cs{messageBox}: A message text field. As the user works the
-puzzle, the progress is reported to this field.
-\end{itemize}
-
-\newtopic The following button is only appropriate when the \texttt{acromemory1}
-option is taken.
-
-\begin{itemize}
-\item \cs{playItAgain}: For the \texttt{acromemory1} option, this
-button can be placed to reset the game board, the icons are
-rearranged and hidden again.
-\end{itemize}
-
-\newtopic When \texttt{acromemory2} and the \texttt{includehelp}
-options are taken, these commands are available. See the
-\texttt{acromemory.dtx} documentation for indications of modifying
-these commands.
-
-\begin{itemize}
-\item \cs{helpImage}: The button that will contain an icon of the
-puzzle. There is one optional argument used to modify the appearance
-of the button.
-
-\item \cs{setHelpImageWidth}: Used to set the width of the
-\cs{helpImage} button. The default width is 1 inch. For example,
-\verb!\setHelpImageWidth{1.5in}!.
-
-\item \cs{theHelpCaption}: Use this command to set the caption of
-the help image. For example, \verb!\theHelpCaption{I need help}!.
-
-Captions with accents and such, you need to use Unicode escape
-sequences, \verb!\uXXXX!, where \texttt{XXXX} are four hexadecimal
-digits. For example, the caption specified by
-\begin{Verbatim}[xleftmargin=20pt,fontsize=\fontsize{9}{11}\selectfont]
-\theHelpCaption{J\string\\u00FCrgen needs help}
-\end{Verbatim}
-will appear in the PDF document as `J\"{u}rgen needs help'. Notice the
-\verb!\string\\! sequence that is needed from the {\LaTeX} source.
-
-
-\item\cs{rolloverHelpButton}: The image is normally hidden until the
-user rolls over the \cs{rolloverHelpButton}. The icon appears with a
-caption under it, the content of the caption can be entered using
-\cs{theHelpCaption}. This command has three parameters, one of which
-is optional. The first (optional) parameter is used to change the
-appearance of the button; the next two required parameters are the
-width and height of the button.
-\end{itemize}
-
-
-\section{The \texttt{acromemory1} Option}
-
-In this game, there is only one game board with an even number of
-tiles. Each tile has an identical twin, and all the tiles are
-randomly rearranged. The object of the game is to find all the
-matching pairs. See the demo files \texttt{acromemory1\_1.tex} and
-\texttt{acromemory1\_2.tex} for examples of this game; the former
-file uses the \texttt{iconfile} option, whereas the latter does not.
-Both illustrate the \cs{reserveSpaceByDimension} and
-\cs{provideDimensions}. See the comments in these files for more
-details.
-
-The tiles for this game were created by a font that I have called
-`Mini Pics Lil Dinos'. The source file for the creation of the
-\texttt{myDinos.pdf}, the icon file, is \texttt{myDinos.tex}. In
-this \texttt{tex} file, the \textsf{web} package is used to create
-pages 2~inches by 2~inches. The \texttt{multido} package from
-\textsf{PSTricks} was used to produce the pages. See
-\texttt{myDinos.tex} for additional comments.
-
-To create your own icon file, you will need either a font set with
-nice images on it, or you can be creative, perhaps using
-\textsf{PSTricks} to create a series of figures.
-
-Given that you have created your icons in a single file, should you
-wish to save each page to a separate file, you can execute the
-following JavaScript in the console, while the icons file is open in
-Acrobat.\smallskip
-\begin{Verbatim}[xleftmargin=20pt,fontsize=\fontsize{9}{11}\selectfont]
-var thisPath = /.*\//i.exec(this.path)[0];
-var filename = this.documentFileName.replace(/\.pdf$/i,"");
-for (var i = 0; i < this.numPages; i++) {
- var j = i+1;
- var index = (j < 10 ) ? ("0"+j) : (""+j);
- this.extractPages({
- nStart: i,
- cPath: thisPath+filename+"_" + index +".pdf"
- });
-}
-\end{Verbatim}
-The code is included in the file \texttt{myDinos.tex}.
-
-
-\section{The \texttt{acromemory2} Option}
-
-This option was the original concept, it was only after I completed
-the two game board version did I decide to do the classic one game
-board version. This is why \texttt{acromemory2} is the default. The
-\texttt{acromemory2} version was much more interesting and
-challenging to create.
-
-For this option you don't have to have a fancy font, any
-(interesting) picture will do. The first step is to decide how many
-rows and columns you want and then slice the image appropriately.
-This is why I wrote the \textsf{AeB Slicing} batch sequence. Read
-the documentation for \textsf{AeB Slicing} and slice your picture.
-
-Not only do you need slices of your picture, you also need an \texttt{EPS}
-of your picture. This is used by latex to leave room for the game board.
-Acrobat can make the conversion for you, as follows:
-
-\newtopic\textbf{To convert your image to EPS}
-\begin{enumerate}
-\item Bring your image into Acrobat
-\item Click the \texttt{File > Save As} menu item
-\item In the Save As dialog box, choose \texttt{Encapsulated PostScript (*.eps)} from the Save as type list
-\item Navigate to the folder containing your tiles, and click the \texttt{Save} button
-\end{enumerate}
-
-\newtopic See the demo files \texttt{acromemory2\_1.tex} and
-\texttt{acromemory2\_2.tex} for examples of this game; the former
-file uses the \texttt{iconfile} option, whereas the latter does not.
-Both illustrate the \cs{reserveSpaceByFile}. See the comments in
-these files for more details.
-
-Use either of these two demo files as a template to create your own
-memory game. Don't forget that the \textsf{web} package has options
-to apply a background color or a graphic---this will jazz up your
-memory game.
-
-\section{Assembly}
-
-Try compiling one of the demo files. You must have the AeB already
-installed on your system, of course. Be sure to specify your dvi to
-postscript converter, for most of you that will be dvips. For example,
-the preamble of the demo docs, and later your own documents should
-appear as follows:\smallskip
-\begin{Verbatim}[xleftmargin=20pt,fontsize=\fontsize{9}{11}\selectfont]
-\documentclass{article}
-\usepackage[designv,nodirectory,dvips]{web} % <-- specify dvips or dvipsone
-\usepackage[execJS]{eforms}
-\usepackage{graphicx}
-\usepackage{acromemory}
-\end{Verbatim}
-
-\newtopic LaTeX your source file, then invoke your dvi-to-ps
-converter to obtain a postscript file.
-Now open Acrobat Distiller and distill the new postscript document.
-If all goes well, Acrobat will start, if not already, and the newly
-created PDF document will open in it. Notice that the hour glass
-cursor appears; this means that the post-assembly process is
-ongoing: You note the one or two little dots on the page (where the
-game boards should be), these are the fields creates by the commands
-\cs{ulCornerHere}, \cs{LulCornerHere} or \cs{RulCornerHere}. They
-are soon replaced by the game board(s). Amazing, simply amazing!
-
-After the hour glass cursor changes, perhaps to the hand tool, be
-sure to save your document, \emph{this is important}. By saving the
-document, the game board does not have to be rebuilt every
-time the file is opened. Once assembled and saved, the game can be
-played on Adobe Reader 7.0 or later.
-
-\newtopic\textbf{\color{red}Tip.} Use the \textsf{PDF Optimizer}, under the \textsf{Advance} menu, to
-reduce the size of the file.\nhfootnote{For Acrobat 10, \textsf{PDF Optimizer} is called the
-\textsf{Optimized PDF} under the \textsf{File \texttt{>} SaveAs}; also, you can use the \textsf{Reduced Size PDF}
-menu function} For example, the file size of \texttt{acromemory2\_2.pdf}
-after distillation was 462\,KB, but after running the
-PDF Optimizer on it, the file size was reduced to 85\,KB!
-
-
-\section{Final comments}
-
-Use any of the demo files as a template to create your own memory
-game. Don't forget (use your memory?) that the \textsf{web} package
-has options to apply a background color or a graphic---this will
-jazz up your memory game.
-
-I do hope you find this game package fun, and that you will be
-creative in its use. Perhaps you can apply the techniques of this
-package to create your own game package, there are many
-possibilities.
-
-\newtopic Now, I simply must get back to my retirement! \dps
-
-
-
-\end{document}