diff options
Diffstat (limited to 'texmf-dist/source/latex/popupmenu/popupmenu.dtx')
-rw-r--r-- | texmf-dist/source/latex/popupmenu/popupmenu.dtx | 431 |
1 files changed, 330 insertions, 101 deletions
diff --git a/texmf-dist/source/latex/popupmenu/popupmenu.dtx b/texmf-dist/source/latex/popupmenu/popupmenu.dtx index 4ca46a31..f454e67a 100644 --- a/texmf-dist/source/latex/popupmenu/popupmenu.dtx +++ b/texmf-dist/source/latex/popupmenu/popupmenu.dtx @@ -1,10 +1,9 @@ % \iffalse %<*copyright> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% popupmenu.sty package, 2009-10-15 %% -%% Copyright (C) 2009 D. P. Story %% +%% popupmenu.sty package, %% +%% Copyright (C) 2009--2020 %% %% dpstory@acrotex.net %% -%% storyd@nwfsc.edu %% %% %% %% This program can redistributed and/or modified under %% %% the terms of the LaTeX Project Public License %% @@ -15,13 +14,47 @@ %</copyright> %<package>\NeedsTeXFormat{LaTeX2e} %<package>\ProvidesPackage{popupmenu} -%<package> [2010/09/18 v1.0 Provides support for popup menus (dps)] +%<package> [2020/07/26 v1.2 Provides support for popup menus (dps)] %<*driver> \documentclass{ltxdoc} -\usepackage[colorlinks,hyperindex]{hyperref} -\pdfstringdefDisableCommands{\let\\\textbackslash}% -\EnableCrossrefs \CodelineIndex +\usepackage[colorlinks,hyperindex=false]{hyperref} +\usepackage{fancyvrb} +%\def\texorpdfstring#1#2{#1} +%\pdfstringdefDisableCommands{\let\\\textbackslash} \OnlyDescription % comment out for implementation details +\EnableCrossrefs +\CodelineIndex +\RecordChanges +\InputIfFileExists{aebdocfmt.def}{\PackageInfo{popupmenu}{Inputting aebdocfmt.def}} + {\def\IndexOpt{\DescribeMacro}\def\IndexKey{\DescribeMacro}\let\setupFullwidth\relax + \PackageInfo{popupmenu}{aebdocfmt.def cannot be found}} +\EnableCrossrefs \CodelineIndex \RecordChanges +\makeatletter +\renewcommand{\paragraph} + {\@startsection{paragraph}{4}{0pt}{6pt}{-3pt} + {\normalfont\normalsize\bfseries}} +\renewenvironment{quote}[1][] + {\def\@rgi{#1}\ifx\@rgi\@empty + \let\rghtm\@empty\else\def\rghtm{\rightmargin\leftmargin}\fi + \list{}{\rghtm} %{\rightmargin\leftmargin}% + \item\relax} + {\endlist} +\makeatother +\bgroup\ttfamily +\gdef\brpr#1{\char123\relax#1\char125\relax}\egroup +\let\darg\brpr +\let\env\texttt +\let\opt\texttt +\let\app\textsf +\let\tops\texorpdfstring +\def\nmpsep#1{\hskip-\marginparsep\texttt{#1}} +\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 \begin{document} \GetFileInfo{popupmenu.sty} \title{The \textsf{popupmenu} Package} @@ -32,95 +65,146 @@ \tableofcontents \let\Email\texttt \DocInput{popupmenu.dtx} - \PrintIndex +\IfFileExists{\jobname.ind}{\newpage\setupFullwidth\par\PrintIndex}{\paragraph*{Index} The index goes here. Execute,\\ + \texttt{popupmenu -s gind.ist -o popupmenu.ind popupmenu.idx} on the command line and recompile + \texttt{popupmenu.dtx}.} +\IfFileExists{\jobname.gls}{\PrintChanges}{\paragraph*{Change History} The list of changes goes here. Execute,\\ + \texttt{makeindex -s gglo.ist -o popupmenu.gls popupmenu.glo} on the command line and recompile + \texttt{popupmenu.dtx}.} \end{document} %</driver> % \fi +% \MakeShortVerb{|} +% \InputIfFileExists{aebdonotindex.def}{\PackageInfo{ltx4yt}{Inputting aebdonotindex.def}} +% {\PackageInfo{ltx4yt}{cannot find aebdonotindex.def}} +% \DoNotIndex{\g@addto@macro,\divide,\box,\setbox,\x,\y,\z} +% % \begin{macrocode} %<*package> % \end{macrocode} +% \section{Instroduction} % This is a short package that provides environments and commands for building % a popup menu using JavaScript. The command \cs{popUpMenu} uses the Acrobat JavaScript % method \texttt{app.popUpMenuEx}. This latter method requires you to pass to it a % structured menu listing of the menu items to be displayed in the popup menu, and the actions % to be taken when a menu item is selected. The environments \texttt{popupmenu} and % \texttt{submenu} are defined for the purpose of creating this hierarchical structure. +% \changes{v1.1}{2020/07/21}{explicitly require \string\pkg{eforms}} +% \changes{v1.2}{2020/07/26}{Added \string\opt{tracking} option} +% \section{Package Options} % \begin{macrocode} \RequirePackage{xkeyval} +\newif\iftrackingPU \trackingPUfalse +\DeclareOptionX{tracking}{\trackingPUtrue\def\puTracking{true}} +\DeclareOptionX{!tracking}{\trackingPUfalse\def\puTracking{false}} +\def\puTracking{false} +\ProcessOptionsX\relax +\edef\pu@restoreCats{% + \catcode`\noexpand\"=\the\catcode`\"\relax + \catcode`\noexpand\'=\the\catcode`\'\relax + \catcode`\noexpand\,=\the\catcode`\,\relax + \catcode`\noexpand\!=\the\catcode`\!\relax +} +\@makeother\"\@makeother\'\@makeother\,\@makeother\! % \end{macrocode} +% \section{Required packages} +% \begin{macrocode} +\RequirePackage{eforms} +% \end{macrocode} +% \section{The \texorpdfstring{\protect\env}{}{popupmenu} environment} % According to the JavaScript manual, the \texttt{app.popUpMenuEx} method takes % one or more \texttt{MenuItem} objects. The {\LaTeX} access to the properties of this object are documented -% as follows (taken verbatim from the JavaScript reference): -% \begin{macro}{title} +% as follows. This set of keys becomes the \pkg{xkeyval} family \texttt{menustruct} of keys for this package:\par\medskip\noindent +% \leavevmode\IndexKey{title}\nmpsep{=\ameta{string\upshape\string|-}} % The menu item name, which is the string to appear on the menu item. The value of -% \texttt{"-"} is reserved to draw a separator line in the menu. -% \begin{macro}{marked} +% \texttt{"-"} is reserved to draw a separator line in the menu.\par\medskip\noindent +% \leavevmode\IndexKey{marked}\nmpsep{=\ameta{\upshape{true\string|false}}} % (optional) A Boolean value specifying whether the item is to be marked with a -% check. The default is \texttt{false} (not marked). -% \begin{macro}{enabled} +% check. The default is \texttt{false} (not marked).\par\medskip\noindent +% \leavevmode\IndexKey{enabled}\nmpsep{=\ameta{\upshape{true\string|false}}} % (optional) A Boolean value specifying whether the item is to appear enabled or -% grayed out. The default is \texttt{true} (enabled). -% \begin{macro}{return} -% (optional) A string to be returned when the menu item is selected. The default is the -% value of cName. +% grayed out. The default is \texttt{true} (enabled).\par\medskip\noindent +% \leavevmode\IndexKey{return}\nmpsep{=\ameta{string}} +% (optional) A string to be returned when the menu item is selected. If \texttt{return} +% is not specified or has no value, the value of the \texttt{title} key is returned. +% \changes{v1.1}{2020/07/21}{Insert \string\cs{pdfstringdef} in title definition} % \begin{macrocode} -\define@key{menustruct}{title}[]{\def\menustruct@title{#1}} +\def\title@dash{-}\def\puNone{none} +\define@key{menustruct}{title}[]{\Hy@unicodefalse + \let\btitle@dash\ef@NO + \def\@rgi{#1}\ifx\@rgi\title@dash\let\btitle@dash\ef@YES\fi + \pdfstringdef\menustruct@title{#1}} \define@boolkey{menustruct}{marked}[true]{} \define@boolkey{menustruct}{enabled}[true]{} -\define@key{menustruct}{return}[]{\def\menustruct@return{#1}} +\define@key{menustruct}{return}[]{\def\menustruct@return{#1}\relax + \ifx\menustruct@return\puNone\def\menustruct@return{null}\fi} % \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} % We use the command \cs{pum@holdtoks} to hold the menu items as they are processed % in the environment, and use \cs{@AddToMenuToks} to add to the items. % \begin{macrocode} \let\pum@holdtoks\@empty -\newcommand{\@AddToMenuToks}{\g@addto@macro\pum@holdtoks} +\let\pum@holdtoksEx\@empty +\def\@AddToMenuToks{\g@addto@macro\pum@holdtoks} +\def\@AddToMenuToksEx{\g@addto@macro\pum@holdtoksEx} % \end{macrocode} -% \begin{environment}{popupmenu} +% \begin{environment}{popupmenu}\nmpsep{\,\darg{\ameta{name}}} The \ameta{name} argument should be +% consist of letters only, for \ameta{name} will be made into the command \cs{\ameta{name}}. The \ameta{name} +% has a duel rule, \cs{\ameta{name}} is a macro that expands to a JavaScript array of menu items; and +% the name itself \ameta{name} is the name of a JavaScript variable. % We begin by defining our menu structure using the % \texttt{popupmenu} environment. Within this environment, % we list the items in the menu using \cs{item} and -% the \texttt{submenu} menu if there are sub menus. +% the \texttt{submenu} menu if there are sub-menus. % % The \texttt{popupmenu} command requires one parameter, this command is % used to create both a command and a JavaScript variable. The name is % passed to the \cs{popUpMenu} command, while the command version of the -% name expands to the menu structure. The menu structure can be placed -% at the document level, or as part of a push button action. -% Here is an example of usage:\par -% \begin{verbatim} +% name expands to the menu structure (an array). +% +%There are two ways of passing the array that is the menu structure to \cs{popUpMenu}: +% \begin{enumerate} +% \item From the document level: The arrays are declared at the document level, the +% name of the array is passed as the argument of \cs{popUpMenu(\ameta{menu-array})}. +% \item From the field level: Within the script for a push button, for example, use +% the command version of the array name to expand first, then it can be referenced. +% \end{enumerate} +%\begin{Verbatim}[xleftmargin=\parindent,codes={\catcode`\%=9},commandchars={!()}] %\urlPath{\aebhome}{http://www.math.uakron.edu/~dpstory} %\begin{popupmenu}{myMenu} -% \item{title=AeB,return=\aebhome/webeq.html} -% \item{title=-} -% \begin{submenu}{title=AeB Pro Family} -% \item{title=Home page, return=\aebhome/aeb_pro.html} -% \item{title=Graphicxsp, return=\aebhome/graphicxsp.html} -% \end{submenu} -% \item{title=eqExam, return=\aebhome/eqexam.html} +% \item{title=AeB,return=\aebhome/webeq.html} +% \item{title=-} +% \begin{submenu}{title=AeB Pro Family} +% \item{title=Home page, return=\aebhome/aeb_pro.html} +% \item{title=Graphicxsp, return=\aebhome/graphicxsp.html} +% \end{submenu} +% \item{title=eqExam, return=\aebhome/eqexam.html} %\end{popupmenu} -%\end{verbatim} +%\puUseMenus{myMenu} !% preamble +%\end{Verbatim} +%The \cs{puUseMenus} declares that \texttt{myMenu} is to be embedded in the PDF as document JavaScript. +%If \cs{puUseMenus} is not expanded in the preamble %The above definition can be conveniently placed in the preamble, though it can % appear anywhere before it is used, obviously. Now to use the menu structure, % all we need is a push button or link to create a JavaScript action: -%\begin{verbatim} -% \pushButton[\CA{Packages}\AA{\AAMouseEnter{\JS{% -% \myMenu\r -% var cChoice = \popUpMenu(myMenu);\r -% if ( cChoice != null ) app.launchURL(cChoice); -% }}}]{menu}{}{11bp} -%\end{verbatim} +%\begin{Verbatim}[xleftmargin=\parindent,codes={\catcode`\%=9},commandchars={|~@}] +%\pushButton[\CA{Packages}\AAmouseenter{|% +% var cChoice = \popUpMenu(myMenu);\r +% if ( cChoice != null ) app.launchURL(cChoice); +%}]{menu}{}{11bp} +%\end{Verbatim} % The above example uses the \textsf{eforms} package, but a push button from \textsf{hyperref} will do too. % The \texttt{app.popUpMenuEx} method returns the return value, which we, in turn, process. In this % case, the return is a URL, which we launch. % -% If we have placed \cs{myMenu} at the document level, the line \verb!\myMenu\r! would not be needed. -% If you are using the same menu several times in the document, put it at the document level to reduce -% file size. -% +% Now, if we did not place \cs{puUseMenus\darg{myMenu}} in the preamble, it can be used at the field level. +% The push button above would then need to be, +%\begin{Verbatim}[xleftmargin=\parindent,codes={\catcode`\%=9},commandchars={|~@}] +%\pushButton[\CA{Packages}\AAmouseenter{|% +% \myMenu\r +% var cChoice = \popUpMenu(myMenu);\r +% if ( cChoice != null ) app.launchURL(cChoice); +%}]{menu}{}{11bp} +%\end{Verbatim} % Also, in the above example, you see how the name, \texttt{myMenu}, passed as an argument % of the popupmenu environment is used as a name and as a command: The name is passed to % \cs{popUpMenu}, while the command expands to the menu structure that is referenced by the name. @@ -131,7 +215,7 @@ % the index of the menu structure array; for example, % \cs{itemindex} might expand to \texttt{[0]}, \texttt{[1].oSubMenu[3]}, or \texttt{[2].oSubMenu[3].oSubMenu[0]}. % If \cs{itemindex} is included in the return value (possibly as an array entry), we can -% know the item the use selected +% know the item the user selected. %\begin{verbatim} %var aChoice=processMenu(AeBMenu); %if (aChoice!=null) { @@ -141,49 +225,79 @@ %} %\end{verbatim} % The above code gets the return array, then uses it to get the title of the item -% selected, +% selected. % \begin{macrocode} \newcount\pum@cnt \def\pum@updateindex{\global\advance\pum@cnt\@ne \edef\pum@rc{\pum@topindex[\the\pum@cnt]}\edef\itemindex{'\pum@rc'}} -\def\pum@initIndexMenu#1{\global\pum@cnt=-1\relax\edef\pum@rc{#1}% +\def\pum@initIndexMenu#1{\global\pum@cnt=\m@ne\edef\pum@rc{#1}% \edef\pum@topindex{\pum@rc}} % \end{macrocode} % \end{macro} % We are now ready to define the \texttt{popupmenu} environment. The environment % takes one required parameter, a name that is used as a JavaScript variable. % This name is also used to create a command. +% \changes{v1.1}{2020/07/21}{Local definition of \string\cs{Esc} and \string\cs{cs}} % \begin{macrocode} -\newenvironment{popupmenu}[1]{\pum@initIndexMenu{}% - \let\pum@holdtoks\@empty - \toks@={\pum@mytab}\@makeother\~ +\newcount\submenuLevel \submenuLevel\z@ +\newenvironment{popupmenu}[1]{\pum@initIndexMenu{}\submenuLevel\z@ + \ifpdfmarkup + \def\textbackslash{\eqbs}\relax + \def\Esc{\textbackslash}\relax + \def\csiv{\eqbs\eqbs}\relax + \def\cs##1{\csiv\csiv##1}\else + \def\Esc{\eqbs\eqbs}\def\cs{\Esc\Esc}\fi + \let\pum@holdtoks\@empty\let\pum@holdtoksEx\@empty + \toks@={\pum@mytab}\@temptokena={\pum@mytab}\@makeother\~% % \end{macrocode} % We initialize with a \cs{@gobble}, which eats up the leading comma (,) % that is placed there by the code below. % \begin{macrocode} - \gdef\msarg{#1}\@AddToMenuToks{\@gobble}% - \let\item\pum@item -}{% - \expandafter\xdef\csname\msarg\endcsname{% - var \msarg\space = [ \pum@holdtoks^^J];}% -} + \gdef\msarg{#1}\gdef\msargEx{#1Ex}\@AddToMenuToks{\@gobble}% + \@AddToMenuToksEx{\@gobble}\let\item\pum@item +\ignorespaces}{% + \csarg\xdef{\msarg}{var \msarg\space = [ \pum@holdtoks^^J];}% + \iftrackingPU + \csarg\xdef{\msargEx}{var \msargEx\space = [ \pum@holdtoksEx^^J];}\fi +\aftergroup\ignorespaces} % \end{macrocode} % \end{environment} -% \begin{macro}{\pum@item} -% At the startup of the \texttt{popupmenu} environment, we \verb|\let\item\pum@item|. -% The definition of \cs{pum@item} takes one argument, the properties described above. +% \begin{macro}{\item}\nmpsep{\small\,\darg{title=\ameta{string},marked=\ameta{\upshape{true\string|false}},enabled=\ameta{\upshape{true\string|false}},return=\ameta{string}}}\\ +% Below is the definition of \cs{pum@item}, at the startup of the +% \env{popupmenu} environment, we \verb|\let\item\pum@item|. +% The definition of \DescribeMacro\pum@item\cs{pum@item} takes one argument, the properties described above. % \begin{macrocode} \newcommand{\pum@item}[1]{\pum@updateindex - \edef\tmp@exp{\noexpand - \setkeys{menustruct}{title,marked=false,enabled,return,#1}}\tmp@exp - \edef\tmp@exp{,^^J\the\toks@ - {cName: "\menustruct@title"% - \ifKV@menustruct@marked, bMarked: true\fi% - \ifKV@menustruct@enabled\else, bEnabled: false\fi% - \ifx\menustruct@return\@empty\else, - cReturn: "\menustruct@return"\fi}}% - \expandafter\@AddToMenuToks\expandafter{\tmp@exp}% -} +% \edef\tmp@exp{\noexpand +% \setkeys{menustruct}{title,marked=false,enabled,return,#1}}\tmp@exp + \setkeys{menustruct}{title,marked=false,enabled,return,#1}\relax + \ifx\menustruct@title\@empty + \PackageWarning{popupmenu} + {A value of the key 'title' is required,\MessageBreak + putting in a place keeper title}% + \def\menustruct@title{This title is undefined}\fi + \edef\tmp@exp{,^^J\the\toks@ + {cName: "\menustruct@title"% + \ifKV@menustruct@marked, bMarked: true\fi% + \ifKV@menustruct@enabled\else, bEnabled: false\fi% +% \ifx\btitle@dash\ef@NO, cItem: \itemindex\fi% + \ifx\menustruct@return\@empty\else,% + cReturn: "\menustruct@return"\fi}}\expandafter + \@AddToMenuToks\expandafter{\tmp@exp}% +% \end{macrocode} +%\changes{v1.1}{2020/07/21}{create extended arrays} +% \begin{macrocode} + \edef\tmp@expEx{,^^J\the\@temptokena + {cName: "\menustruct@title"% + \ifKV@menustruct@marked, bMarked: true\fi% + \ifKV@menustruct@enabled\else, bEnabled: false\fi% +% \ifx\btitle@dash\ef@NO, cItem: \itemindex\fi% + \ifx\btitle@dash\ef@NO + \ifx\menustruct@return\@empty,% + cReturn:"[\itemindex,'\menustruct@title']"% + \else,cReturn:"[\itemindex,'\menustruct@return']"\fi\fi}}% + \expandafter\@AddToMenuToksEx\expandafter{\tmp@expEx}% +\ignorespaces} % \end{macrocode} % \end{macro} % Some technical matters, we need unmatched braces, so we define @@ -195,60 +309,175 @@ \endgroup \def\pum@mytab{\space\space\space\space} % \end{macrocode} -% \begin{environment}{submenu} +% \begin{environment}{submenu}\nmpsep{\,\darg{title=\ameta{title},marked=\ameta{\upshape{true\string|false}}}}\\ % Used to create a submenu of a menu item. The top level menu item has no return value, -% it can be marked but cannot be dis-enabled (\texttt{enabled=false}). +% it can be marked but cannot be disabled (\texttt{enabled=false}). % % The argument of \texttt{submenu} are any of the menu item properties, however, only % \texttt{title} and \texttt{marked} will be recognized. % % The JavaScript property, \texttt{oSubMenu}, of the menu structure passed to % the method \texttt{app.popUpMenuEx} has no {\LaTeX} counterpart. This property -% key-value pair is automatically inserted by the \texttt{submenu} +% key-value pair is automatically inserted by the \env{submenu} % environment. % \begin{macrocode} -\newenvironment{submenu}[1]{\pum@updateindex - \xdef\saved@pum@cnt{\the\pum@cnt}% - \pum@initIndexMenu{\pum@rc.oSubMenu}\edef\temp@toks{\the\toks@}% - \toks@=\expandafter{\temp@toks\pum@mytab}% - \setkeys{menustruct}{title,marked=false,enabled,return,#1}% - \edef\tmp@exp{,^^J\the\toks@ - \noexpand\pum@lbrace cName: "\menustruct@title"% - \ifKV@menustruct@marked, bMarked: true\fi% - \ifKV@menustruct@enabled\else, bEnabled: false\fi, - oSubMenu:^^J\the\toks@[}% +\newenvironment{submenu}[1]{\pum@updateindex\advance\submenuLevel\@ne + \csarg\xdef{pum@cntLevel\the\submenuLevel}{\the\pum@cnt}% +% \xdef\saved@pum@cnt{\the\pum@cnt}\relax + \pum@initIndexMenu{\pum@rc.oSubMenu}\edef\temp@toks{\the\toks@}% + \def\temp@toksEx{\the\@temptokena}% + \toks@=\expandafter{\temp@toks\pum@mytab}% + \@temptokena=\expandafter{\temp@toksEx\pum@mytab}% + \setkeys{menustruct}{title,marked=false,enabled,return,#1}% + \edef\tmp@exp{,^^J\the\toks@ + \noexpand\pum@lbrace cName: "\menustruct@title"% + \ifKV@menustruct@marked, bMarked: true\fi% + \ifKV@menustruct@enabled\else, bEnabled: false\fi, + oSubMenu:^^J\the\toks@[}% % \end{macrocode} % Again, we \cs{@gobble} up the leading comma (,). % \begin{macrocode} - \expandafter\@AddToMenuToks\expandafter{\tmp@exp\@gobble}% -}{% - \edef\tmp@exp{^^J\the\toks@ ]\pum@rbrace}% - \expandafter\@AddToMenuToks\expandafter{\tmp@exp}% - \global\pum@cnt\saved@pum@cnt -} + \expandafter\@AddToMenuToks\expandafter{\tmp@exp\@gobble}% +% \end{macrocode} +% \begin{macrocode} + \edef\tmp@expEx{,^^J\the\@temptokena + \noexpand\pum@lbrace cName: "\menustruct@title"% + \ifKV@menustruct@marked, bMarked: true\fi% + \ifKV@menustruct@enabled\else, bEnabled: false\fi, + oSubMenu:^^J\the\@temptokena[}% + \expandafter\@AddToMenuToksEx\expandafter{\tmp@expEx\@gobble}% +\ignorespaces}{% + \edef\tmp@exp{^^J\the\toks@ ]\pum@rbrace}% + \edef\tmp@expEx{^^J\the\@temptokena ]\pum@rbrace}% + \expandafter\@AddToMenuToks\expandafter{\tmp@exp}% + \expandafter\@AddToMenuToksEx\expandafter{\tmp@expEx}% + \global\pum@cnt\@nameuse{pum@cntLevel\the\submenuLevel}% +\aftergroup\ignorespaces} % \end{macrocode} % \end{environment} -% \begin{macro}{\popUpMenu} -% The \cs{popUpMenu} command takes one argument, the name pass to a -% popupmenu environment. The command expands to the \texttt{app.popUpMenuEx} -% method. The document author must then process the return value in some way. +% \begin{macro}{\popUpMenu}\nmpsep{(\ameta{name})} +% The \cs{popUpMenu} command takes one argument, the \ameta{name} that had +% earlier been passed to a \env{popupmenu} environment. The command expands to the +% \texttt{app.popUpMenuEx} method. The document author must then process the return value in some way. % The argument is enclosed in parentheses, this is so we can use \cs{popUpMenu} % at the document level, we can pass it an argument there. % \begin{macrocode} \def\popUpMenu(#1){app.popUpMenuEx.apply( app, #1 )} % \end{macrocode} % \end{macro} -% \begin{macro}{\urlPath} +% \begin{macro}{\puProcessMenu}\nmpsep{(\ameta{name})} +% When the \opt{tracking} option is taken, use the \cs{puProcessMenu} command to execute +% a menu item with tracking. If \opt{tracking} is not in effect, \cs{puProcessMenu} is the +% same as \cs{popUpMenu}. +% \begin{macrocode} +\def\puProcessMenu(#1){\iftrackingPU + puProcessMenu("#1")\else\popUpMenu(#1)\fi} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\urlPath}\nmpsep{\darg{\ameta{path}}} % A convenience command to save a url path. The string is normalized using % the \textsf{hyperref} command \cs{hyper@normalise}. Though we don't require -% any other packages, you can't do much unless you use \textsf{hyperref} as well. +% any other packages, you can't do much unless you use \textsf{hyperref}. % \begin{macrocode} \providecommand{\urlPath}[1]{\def\pum@urlName{#1}% - \hyper@normalise\pum@urlPath} + \hyper@normalise\pum@urlPath} +%\def\pum@urlPath#1{\csarg\xdef\pum@urlName{#1}} \def\pum@urlPath#1{\expandafter\xdef\pum@urlName{#1}} % \end{macrocode} % \end{macro} +% \leavevmode\DescribeMacro\puUseMenus\nmpsep{\ameta{list-arrays}}, where \ameta{list-arrays} +% is a comma-delimited list of \ameta{name}s that have been declared earlier as an argument +% of a \env{popupmenu} environment. The arrays listed in \ameta{list-arrays} will be defined at +% the document level. +% \begin{macrocode} +\def\puUseTheseMenus{// No pop-up data defined^^J} +\let\puMenuCmds\@empty +\newcommand{\puUseMenus}[1]{\bgroup + \@for\pu@menu:=#1\do{\ifx\puMenuCmds\@empty + \def\puUseTheseMenus{// popupmenu: Begin popup menu data^^J}\fi + \expandafter\g@addto@macro\expandafter + \puMenuCmds\expandafter{% + \csname\pu@menu\endcsname^^J}\relax +% \end{macrocode} +% \begin{macrocode} + \iftrackingPU + \expandafter\g@addto@macro\expandafter + \puMenuCmds\expandafter{% + \csname\pu@menu Ex\endcsname^^J}\relax + \fi +% \end{macrocode} +% \begin{macrocode} + \edef\x{\expandafter\noexpand\@nameuse{\pu@menu}}% + \toks@=\expandafter{\x^^J}% + \expandafter\g@addto@macro\expandafter + \puUseTheseMenus\expandafter{\the\toks@}% +% \end{macrocode} +% \begin{macrocode} + \iftrackingPU + \edef\x{\expandafter\noexpand\@nameuse{\pu@menu Ex}}% + \toks@=\expandafter{\x^^J}% + \expandafter\g@addto@macro\expandafter + \puUseTheseMenus\expandafter{\the\toks@}% + \fi + }\g@addto@macro\puUseTheseMenus + {// popupmenu: End of popup menu data}\egroup + \ifx\puUseTheseMenus\@empty + \def\puUseTheseMenus{// No pop-up data defined}\fi +} +% \end{macrocode} +% A small \env{insDLJS} environment to create the menu arrays at the document level. +% The command \cs{puUseTheseMenus} will expand to the array declarations. +% \begin{macrocode} +\iftrackingPU +\begin{insDLJS}{pujs}{Pop-up Menu Data} +\puUseTheseMenus +\end{insDLJS} +\@onlypreamble\puUseMenus +\begin{insDLJS*}{pumenu} +\begin{newsegment}{popupmenu: Menu tracking support} +var trackingPU=\puTracking; +var PUdebug=false; +var aPULastChoice=new Array; +var bPULastChoice=false; +var bIsMarked=false; +%var aChoice; // make local +function puProcessMenu(cMenu) { // aMenu->cMenu now a string + var cMenuEx=(trackingPU)?cMenu+"Ex":cMenu; + var aMenuEx=eval(cMenuEx); + var cChoice = app.popUpMenuEx.apply( app, aMenuEx ); + if (trackingPU) { + if ( cChoice != null ) { + aChoice=eval(cChoice); + if (aChoice[1]==""||aChoice[1]=="null") return null; + var puRtn=aChoice[1]; + var thisChoice=aChoice[0]; +// eval(cMenuEx+thisChoice).bMarked=true; + if (!bPULastChoice) { + eval(cMenuEx+aChoice[0]).bMarked=true; + } else { + var structLoc=aPULastChoice[1]; + if(aPULastChoice[0]+structLoc==cMenuEx+aChoice[0]) { + bIsMarked = eval(cMenuEx+aChoice[0]).bMarked; + eval(cMenuEx+aChoice[0]).bMarked=!(bIsMarked); + bPULastChoice=false; + if (bIsMarked) var puRtn=null + } else { + eval(aPULastChoice[0]+structLoc).bMarked=false; + eval(cMenuEx+aChoice[0]).bMarked=true; + } + } + aPULastChoice=[cMenuEx,aChoice[0]]; + bPULastChoice=true; + return puRtn; + } else return null; + } else return cChoice; +} +\end{newsegment} +\end{insDLJS*} +\fi +% \end{macrocode} % \begin{macrocode} +\pu@restoreCats %</package> % \end{macrocode} % \Finale |