diff options
Diffstat (limited to 'texmf-dist/source/latex/acrotex/insdljs.dtx')
-rw-r--r-- | texmf-dist/source/latex/acrotex/insdljs.dtx | 2622 |
1 files changed, 2622 insertions, 0 deletions
diff --git a/texmf-dist/source/latex/acrotex/insdljs.dtx b/texmf-dist/source/latex/acrotex/insdljs.dtx new file mode 100644 index 00000000..4194957b --- /dev/null +++ b/texmf-dist/source/latex/acrotex/insdljs.dtx @@ -0,0 +1,2622 @@ +% \iffalse +% makeindex -s gglo.ist -o insdljs.gls insdljs.glo +% makeindex -s gind.ist -o insdljs.ind insdljs.idx +%<*copyright> +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% insdljs.sty package, %% +%% Copyright (C) 2001-2017 D. P. Story %% +%% dpstory@uakron.edu %% +%% %% +%% This program can redistributed and/or modified under %% +%% the terms of the LaTeX Project Public License %% +%% Distributed from CTAN archives in directory %% +%% macros/latex/base/lppl.txt; either version 1 of the %% +%% License, or (at your option) any later version. %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%</copyright> +%<package>\NeedsTeXFormat{LaTeX2e} +%<package>\ProvidesPackage{insdljs} +%<package> [2017/03/02 v2.3f Insert Document Level JavaScripts (dps)] +%<*driver> +\documentclass{ltxdoc} +\usepackage[colorlinks,hyperindex=false]{hyperref} +\usepackage{makeidx} +\makeindex +\def\EXPT{!} +\pdfstringdefDisableCommands{\let\\\textbackslash}% +% \OnlyDescription % comment out for implementation details +\EnableCrossrefs +\CodelineIndex +\RecordChanges +\gdef\darg#1{\texttt{\char123\relax#1\char125\relax}} +\let\env\texttt +\let\opt\texttt +\let\app\textsf +\let\pkg\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}}}} + +\InputIfFileExists{aebdocfmt.def}{\PackageInfo{insdljs}{Inputting aebdocfmt.def}} + {\def\IndexOpt{\DescribeMacro}\def\IndexKey{\DescribeMacro}\let\setupFullwidth\relax + \PackageInfo{insdljs}{aebdocfmt.def cannot be found}} +\begin{document} + \GetFileInfo{insdljs.sty} + \title{The \texttt{insDLJS} Package} + \author{D. P. Story\\ + Email: \texttt{dpstory@uakron.edu}} + \date{processed \today} + \maketitle + \tableofcontents + \let\Email\texttt + \let\pkg\textsf + \DocInput{insdljs.dtx} +\IfFileExists{\jobname.ind}{\newpage\setupFullwidth\PrintIndex}{\paragraph*{Index} The index goes here.\\Execute + \texttt{makeindex -s gind.ist -o insdljs.ind insdljs.idx} on the command line and recompile + \texttt{insdljs.dtx}.} +\IfFileExists{\jobname.gls}{\PrintChanges}{\paragraph*{Change History} The list of changes goes here.\\Execute + \texttt{makeindex -s gglo.ist -o insdljs.gls insdljs.glo} on the command line and recompile + \texttt{insdljs.dtx}.} +\end{document} +%</driver> +% \fi +% +% \InputIfFileExists{aebdonotindex.def}{\PackageInfo{insdljs}{Inputting aebdonotindex.def}} +% {\PackageInfo{insdljs}{aebdonotindex.def cannot be found}} +% +% \section{Introduction} +% This package defines a new environment, \texttt{insDLJS}, used +% for inserting Acrobat JavaScript into a PDF file created from a +% \LaTeX{} source. This package works correctly for users of +% \textsf{pdftex} or \textsf{dvipdfm}. For those that use the +% \textsf{Acrobat Distiller} (specifically, those that use either +% \textsf{dvips} or \textsf{dvipsone} to produce a postscript file, +% which is then distilled), you are required to have Acrobat~5.0 (or +% later). +% +% \section{Features of the \textsf{insdljs} package} +% We present a few of the several features of the package to get some feel for its +% purpose. +% +% \subsection{The \texttt{insDLJS} Environment} +% +% The following is a quick illustration of the use of the new environment. +% \begin{verbatim} +% \documentclass{article} +% \usepackage[pdftex]{hyperref} +% \usepackage[pdftex]{insdljs} +% +% \newcommand\tugHello{Welcome to TUG 2001!} +% +% \begin{insDLJS}[HelloWorld]{mydljs}{My Private DLJS} +% function HelloWorld() +% { +% app.alert("\tugHello", 3); +% } +% \end{insDLJS} +% \begin{document} +% \begin{Form} % needed for \PushButton +% +% \section{Test of the \texttt{insDLJS} Package} +% +% % use built in form button of hyperref +% Push \PushButton[name=myButton, +% onclick={HelloWorld();}]{Button} +% +% \end{Form} +% \end{document} +% \end{verbatim} +% This environment takes three parameters, the first of which is required +% for users of \texttt{dvips} and \texttt{dvipsone} and optional otherwise. +% Within the environment, `|\|', is the escape character, and `|%|' is the comment +% character, as they are in \TeX{} and \LaTeX. +% See the documentation preceding the definition of the +% \texttt{\hyperlink{insDLJS}{insDLJS}} environment. +% +% \subsection{Debugging} +% +% Another feature of this package is the ability to place debugging markers +% within the JavaScript. When the \texttt{debug} option is used, the markers +% show up in the document level JavaScript; otherwise, they are not written +% to the PDF document. Here is a simple example, +% \begin{verbatim} +%\begin{insDLJS}[HelloWorld]{mydljs}{My Private DLJS} +%function HelloWorld() +%{ +% app.alert("\tugHello", 3); +% var x = "\\"; +%\db console.println("Entered HelloWorld function and x = " + x);\db% +%} +%\end{insDLJS} +%\end{verbatim} +% The last line of the function will appear in the DLJS if compiled under +% the \texttt{debug} option; otherwise, it is removed. Additional discussion +% of this debugging device is given below. +% +% \subsection{Open Action} +% +% This package also defines an \cs{OpenAction} command to introduce actions that are +% executed when the PDF document is opened on page~1. The open action command only +% applies to page~1. +% \begin{flushleft} +% \textbf{Usage} +%\begin{verbatim} +%\OpenAction{/S/JavaScript/JS(app.alert("Hello World!");)} +%\end{verbatim} +% \end{flushleft} +% The package defines a |\JS| that takes one argument. The code |\JS{#1}| expands to +% |/S/JavaScript/JS (#1)|, and so the above example may be written as +% \begin{flushleft} +%\begin{verbatim} +%\OpenAction{\JS{app.alert("Hello World!");}} +%\end{verbatim}% +%\end{flushleft} +% Multiple JavaScript commands can be entered. For nice formatting use \cs{r} +% and \cs{t} for carriage return and tab, respectively. +%\goodbreak +%\begin{verbatim} +%\OpenAction{\JS{% +% app.alert("Hello World!");\r +% app.alert("Good Day to You!"); +%}} +%\end{verbatim} +% The open actions are placed in a token list. Additional actions are added to the token list, so +% you say +%\begin{verbatim} +%\OpenAction{\JS{app.alert("Hello World!");}} +%\OpenAction{\JS{app.alert("Good Day to You!");}} +%\end{verbatim} +% the two messages will appear each time you open page~1 of the document. +% +% In the case of users of the distiller, \textsf{insdljs} uses this mechanism to +% define an open action. To avoid overwriting this definition, the \cs{OpenAction} +% command is necessary in insert additional actions. +% +% See \Nameref{openaction} for more details. +% +% \subsection{How \textsf{insdljs} Works} +% +% Let me describe in rough terms what goes on behind the scenes. In the discussion +% below, the following example will be used: +%\begin{verbatim} +%\newcommand\tugHello{"Hello World!"} +%\begin{insDLJS}[HelloWorld]{mydljs}{My Private DLJS} +%function HelloWorld() +%{ +% app.alert("\tugHello", 3); +%} +%\end{insDLJS} +%\end{verbatim} +% +% \subsubsection{For the \texttt{pdftex} and \texttt{dvipdfm} Options} +% +% Both \texttt{pdftex} and \texttt{dvipdfm} have primitives/macros for inserting +% JavaScript at the document level into the PDF document. The work of the package, +% in this case, is to take the JavaScript and place it into the correct form +% for the application (\textsf{pdftex} or \textsf{dvipdfm}). +% +% Material within the \texttt{insDLJS} environment is written verbatim to a file. +% The name of this file is \texttt{mydljs.djs}. The file base name comes from the +% first required parameter of the \texttt{insDLJS} environment, see example above. +% The file extension \texttt{.djs} stands for ``define javascript''. +% +% At begin document, the file \texttt{mydljs.djs} is input back into the document after +% special definitions have already been read. These special definitions are the content +% of the file \texttt{dljscc.def}. The script is placed in the appropriate construct +% for insertion by the application at the document level. +% +% For more information about \texttt{dljscc.def}, see documentation given in the Section~\ref*{dljscc}, +% \Nameref{dljscc}. +% +% \subsubsection{For the \texttt{dvipsone} and \texttt{dvips} Options} +% +% When you use the \texttt{dvipsone} or \texttt{dvips}, this means you are going to convert +% your document to postscript and distill it to create a PDF document. There is no \texttt{pdfmark} +% construct for inserting document level JavaScripts; however, the recent release of Acrobat~5.0 +% gives postscript users an avenue for inserting DLJS. +% +% The material within the \texttt{insDLJS} environment is written verbatim to the file +% \texttt{mydljs.djs}, as above. It is input back into the document where macros are allowed +% to expand, then written back out to another file. The name of this new file is \texttt{mydljs.fdf}. +% The file base name comes from the first required parameter of the \texttt{insDLJS} environment. +% The file extension \texttt{.fdf} stands for ``forms data format''. This is an extension defined +% and recognized by the Acrobat line of products. +% +% The file \texttt{mydljs.fdf} contains the document level JavaScript in a form that +% the Acrobat application (version~5.0 or later) can import. Part of the work of the package +% is to define an open page action. When the PDF document is opened for the first time in +% Acrobat, the JavaScript is imported. Usually, you open the document following distillation. +% After the \texttt{.fdf} file(s) have been imported, you need to save the document, usually using +% the ``SaveAs'' file option, this saves the JavaScript code with the file. (There is no need for the +% \texttt{.fdf} file(s) at this point.) +% +% \subsection{Comments on JavaScript} +% A few words on JavaScript. +% +% \subsubsection{What is Document Level JavaScript?} +% The document level is a location in the PDF document where script can be stored. +% When the PDF document is opened, the document level functions are scanned, and any +% ``exposed script'' is executed. +% +% Normally, the type of scripts you would place at the document level are +% general purpose JavaScript functions, functions that are called repeatedly or large special +% purpose functions. Functions at the document level +% are known throughout the document, so they can be called by links, form buttons, page open +% actions, etc. +% +% Variables declared within a JavaScript function have local scope, they are not known outside +% that function. However, if you can declare variables and initialize them at the document level outside +% of a function, these variables will have document wide scope. Throughout the document, the values of these +% global variables are known. For example +%\begin{verbatim} +%\begin{insDLJS}[HelloWorld]{mydljs}{My Private DLJS} +%var myVar = 17; // defined outside a function, global scope +%function HelloWorld() +%{ +% var x = 3; // defined inside a function, local scope +% app.alert("\tugHello", 3); +%} +% \end{insDLJS} +%\end{verbatim} +% Both the function \texttt{HelloWorld()} and the variable \texttt{myVar} are known throughout +% the document. The function \texttt{HelloWorld()} can be called by a mouse up button action; +% some form field, executing some JavaScript, may access the value of \texttt{myVar} and/or +% change its value. The variable \texttt{x} is not known outside of the \texttt{HelloWorld()} function. +% +% \subsubsection{Access and Debugging} +% For those who do not have \textsf{Acrobat}, the application, +% unless you are writing very simple code, writing and debugging +% JavaScript will be very difficult. From the Acrobat Reader, +% there is not access to the document level JavaScript. You will be +% pretty much writing blind. You can use the debug feature of +% \textsf{insdljs} and insert some debugging code to try to give you +% some insight into what is going wrong. Even so, debugging will be a problem. +% +% Normally, I develop the JavaScript from within Acrobat. The GUI editor does check for +% syntax errors, giving you a chance to correct some simple errors as you go. After I am satisfied +% with my code, I copy it from the editor and paste it into a \texttt{insDLJS} environemnt. This is +% how the JavaScript code of \textsf{exerquiz} was developed. +% +% In my opinion, if you want to develop rather complicated code, having the full Acrobat product +% is a must. (This implies that the Windows or Mac platform is needed!) +% +% \subsubsection{JavaScript References} +% The JavaScript used by Acrobat consists of the core JavaScript plus Acrobat's JavaScript extensions. +% Acrobat~5.0 uses core JavaScript~1.5, see +%\begin{quote} +% \footnotesize\url{https://developer.mozilla.org/en/JavaScript} +%\end{quote} +% and documentation of the Acrobat extensions can be found in the ``JavaScript for Acrobat API Reference,'' +% see +%\begin{quote} +%\href{http://livedocs.adobe.com/acrobat_sdk/9.1/Acrobat9_1_HTMLHelp/wwhelp/wwhimpl/common/html/wwhelp.htm?context=Acrobat9_HTMLHelp&file=JS_API_AcroJSPreface.87.1.html} +%{JavaScript for Acrobat API Reference} +%\end{quote} +% +% \subsection{The \textsf{execJS} Environment} +% This is an environment useful to PDF developers who want to tap into the power of JavaScript. +% To use this environment, the developer needs Acrobat~5.0 or higher, or Acrobat Approval~5.0 +% or higher. \textsf{pdftex} or \textsf{dvipdfm} can be used to produce the PDF document, but one of the +% applications (not the Reader) listed above is needed for this environment to do anything. +% +% The \texttt{execJS} is used primarily for post-distillation processing (post-creation processing, in the case of +% \textsf{pdftex} and \textsf{dvipdfm}). The \texttt{execJS} environment can be used, for example, to automatically import +% named icons into the document, which can, in turn, be used for an animation. +% +% The \textsf{execJS} is an environment in which you can write verbatim JavaScript code. This environment +% is a variation on \textsf{insdljs}, it writes a couple of auxiliary files to disk; in particular, the +% environment creates an \texttt{.fdf} file. When the newly produced PDF is loaded for the first time +% into the viewer (Acrobat or Approval, not Reader), the \texttt{.fdf} file generated by the \textsf{execJS} +% environment is imported, and the JavaScript executed. This JavaScript is \emph{not} saved with +% the document. +% +% The environment takes one required argument, the base name of the auxiliary files to be generated. +% +% +% For more details on this environment, see +% \Nameref{execJS}. Also, see the demo file \texttt{execjstst.tex} and \texttt{execjstst.pdf} for +% a short tutorial on the \texttt{execJS} environment, and an animation example, built entirely from +% {\LaTeX} commands. +% +% \paragraph*{Security Note:} Executing arbitrary +%JavaScript through a menu is potentially a security hole. If a +%malicious hacker knows that you have a menu item with the name of +%\texttt{MenuProc}, and that you use the variable +%\texttt{\_MenuProc} in the way described above, the hacker could +%distribute a PDF that executes (security restricted) JavaScript +%through the menu in this way. Therefore, you should select +%\texttt{private names} for \texttt{MenuProc} and \texttt{\_MenuProc}. +% +% \subsection{The \textsf{defineJS} Environment} +% +%When you create a form element (button, text field, etc.), you sometimes want to attach +%JavaScript. The \textsf{defineJS} environment aids you in writing your Field level JavaScript. +%It too is a verbatim environment, however, this environment does not write to this, but +%saves the contents in a token register. The contents of the register are used in defining +%a macro that expands to the verbatim listing. +% +% The \textsf{defineJS} environment takes two parameters, the first optional. +% the required parameter is the cmd name of the command you want to define. +% You can use the optional first parameter to modify the verbatim environment, +% as illustrated. The \textsf{defineJS} is a complete verbatim environment: no escape, +% and no comment characters are defined. You can use the optional parameter to create +% an escape character. You can pretty much use any character you wish, \emph{except} +% the usual one `\verb+\+', backslash. +% +% The following environment, defines a command \cs{myCmd} what expands to the verbatim +% contents of the environment. +%\begin{verbatim} +%\begin{defineJS}{\myCmd} +% ... +% <JavaScript code> +% ... +%\end{defineJS} +%\end{verbatim} +% +% There is also a \textsf{localJS} environment that makes any definitions within the +% environment local. +% +%The following examples uses some macros from the \textsf{eforms} package: +%\begin{verbatim} +% % Define a text macro that will be expanded from within the +% % defineJS environment +%\def\HelloWorld{Hello World} +% % Now define some JavaScript to execute with a button to be created. +% % We enclose the defineJS and the \pushButton in the localJS environment +% % That way, the macro definitions, \JSA, \JSAAE, \JSAAX will be local to +% % this group +%\begin{localJS} +% % Make @ the escape so we can demonstrate the optional parameter. +%\begin{defineJS}[\catcode`\@=0\relax]{\JSA} +%var sum = 0; +%for (var i = 0; i < 10; i++) +%{ +% sum += i; +% console.println("@HelloWorld i = " + i ); +%} +%console.println("sum = "+sum); +%\end{defineJS} +%\begin{defineJS}{\JSAAE} +%console.println("Enter the button area"); +%\end{defineJS} +%\begin{defineJS}{\JSAAX} +%console.println("Exiting the button area"); +%\end{defineJS} +%\pushButton[% +% \A{\JS{\JSA}} +% \AA{\AAMouseEnter{\JS{\JSAAE}} +% \AAMouseExit{\JS{\JSAAX}}} +%]{myButton}{30bp}{15bp} +%\end{localJS} +%\end{verbatim} +% +% See the section \Nameref{defineJS} for details of these two environments. +% \section{Package Options and Requirements} +% +% \subsection{Package Options} +% +% The options are \texttt{dvipsone}, \texttt{dvips}, \texttt{pdftex} and +% \texttt{dvipdfm}. The default is \texttt{dvipsone}/\texttt{dvips}. +% \begin{macrocode} +%<*package> +\usepackage{xkeyval} +\RequirePackage{ifpdf}[2006/02/20] +\RequirePackage{ifxetex}[2006/08/21] +% \end{macrocode} +% +% Standard driver options.\par\medskip\noindent +% \textbf{Those using Distiller} +% \IndexOpt{dvips} +% \IndexOpt{dvipsone} +% \IndexOpt{textures} +% \begin{macrocode} +\DeclareOptionX{dvipsone}{\def\dljs@drivernum{0}% + \AtBeginDocument{\dvips@marker}} +\DeclareOptionX{dvips}{\def\dljs@drivernum{0}% + \AtBeginDocument{\dvips@marker}} +\DeclareOptionX{textures}{\def\dljs@drivernum{0}% + \AtBeginDocument{\dvips@marker}} +% \end{macrocode} +%\textbf{Those not using Distiller} +% \IndexOpt{pdftex} +% \IndexOpt{dvipdfm} +% \IndexOpt{dvipdfmx} +% \IndexOpt{xetex} +% \begin{macrocode} +\DeclareOptionX{pdftex}{\def\dljs@drivernum{1}} +\DeclareOptionX{dvipdfm}{\def\dljs@drivernum{2}} +\DeclareOptionX{dvipdfmx}{\def\dljs@drivernum{2}} +\DeclareOptionX{xetex}{\def\dljs@drivernum{2}} +% \end{macrocode} +% Set the default value of the driver: assume the distiller is used. +% \begin{macrocode} +%\def\dljs@drivernum{0} +% \end{macrocode} +% Some switch definitions +% \begin{macrocode} +\let\dl@YES=y \let\dl@NO=n +\let\dl@One=1 \let\dl@Zero=0 +\let\dljs@YES=y \let\dljs@NO=n +% \end{macrocode} +% When using pdfmarks, the open action is initiated by the document JavaScript code, +% when there was not document JavaScript, the open action did not get executed. +% This was a bad idea, here is a work around. When the \texttt{insDLJS} environment is used, +% we |\let\dljspresent=y|, and if at the beginning of the document, \cs{dljspresent} is still +% \texttt{n}, we'll issue a special execution of \cs{@OAction}. +% \begin{macrocode} +\def\dvips@marker{\ifx\dljspresent\dl@NO\@OAction\fi} +% \end{macrocode} +% This command sequence will mark the passing of the first open event that is defined. The rest of the open events, +% if any, will be in a \texttt{Next} dictionary. +% \begin{macrocode} +\let\isOpenAction\dl@NO +% \end{macrocode} +% \IndexOpt{nodljs} +% Option to cancel the insertion of DLJS, useful for a document meant to be +% printed only, or one that does not use the \texttt{shortquiz} or +% \texttt{quiz} environments, for example. +% \begin{macrocode} +\DeclareOptionX{nodljs}{\let\importdljs\dl@NO} +\let\importdljs\dl@YES +% \end{macrocode} +% Need to place certain code only once. This switch will make sure of that. +% \begin{macrocode} +\let\firstdljs\dl@YES +\let\dljspresent\dl@NO +% \end{macrocode} +% \IndexOpt{debug} +% Use this option to help debug DLJS. +% \begin{macrocode} +\DeclareOptionX{debug}{\let\dljs@debug\dl@YES} +\let\dljs@debug\dl@NO +% \end{macrocode} +% \IndexOpt{execJS} +% If the execution of JavaScript code is permitted following distillation. The default is no. +% \begin{macrocode} +\DeclareOptionX{execJS}{\let\execjs\dl@YES} +\let\execjs\dl@NO +\DeclareOptionX{nopro}{\let\dl@gopro\dl@NO} +\let\dl@gopro\dl@YES +% \end{macrocode} +% \begin{macrocode} +\@ifpackageloaded{web}{% + \ExecuteOptionsX{\eq@driver@name}% +}{% + \@ifpackageloaded{eforms}{% + \ExecuteOptionsX{\ef@driver}% + }{% + \ifpdf\ExecuteOptionsX{pdftex}\else + \ifxetex\ExecuteOptionsX{xetex}\else + \@ifundefined{l@tex@@@@driver}{\ExecuteOptionsX{dvips}} + {\ExecuteOptionsX{dvipsone}}\fi\fi + }% +} +% \end{macrocode} +% \IndexOpt{reqjs} +% Beginning with PDF 1.7, a document can specify requirements, here we declare +% the document uses JavaScripts. The option \texttt{reqjs} is taken by default, +% that is, JavaScripts are required for this document +% +% \DescribeMacro{!reqjs} +% The option \texttt{!reqis} turns off this feature; that is, there is no notification +% via the \textsf{YMB} (\textsf{Yellow Message Bar}) that Javascripts are used in the document, and the +% document may not function as designed. +% \changes{v2.2d}{2016/04/06}{Added \texttt{reqjs} and \texttt{{\string\quotechar}reqjs}.} +% \begin{macrocode} +\DeclareOptionX{reqjs}{\let\dl@reqJS\dl@YES} +\let\dljs@reqJS\dl@YES +\DeclareOptionX{!reqjs}{\let\dl@reqJS\dl@NO} +% \end{macrocode} +% The \texttt{usealtadobe} option\IndexOpt{usealtadobe} defined alternate names +% for some of Adobe's formatting functions. This is useful only if the document +% author has the Adobe application and know how to use its form edit capabilities. +% The name of each of the selected function begins with `\texttt{AF}', the name of the new +% function is the same, but begins with `\texttt{EF}'. For example, the keystroke function +% \texttt{AFNumber\_Keystroke} is also known under the name of \texttt{EFNumber\_Keystroke}. +% See \hyperref[s:AltAdbFncs]{Section~\ref*{s:AltAdbFncs}} for the list of functions. +% \begin{macrocode} +\DeclareOptionX{usealtadobe}{\def\inputAltAdbFncs{% + \InputIfFileExists{altadbfncs.def}% + {\PackageInfo{insdljs}{Inputting code for usealtadobe option}}% + {\PackageWarning{insdljs}{Cannot find altadbfncs.def.\MessageBreak + Reinstall or refresh your file name database.}}}} +\let\inputAltAdbFncs\relax +% \paragraph*{Process the package options} +% \begin{macrocode} +\ProcessOptionsX +% \end{macrocode} +% This package uses the double quote as a double quote, other packages the make double quote +% an active character. +% \begin{macrocode} +\edef\dl@dquoteCat{\the\catcode`\"} +\catcode`\"=12\relax +% \end{macrocode} +% Issue a package error if there is no driver specified or implied. +% \begin{macrocode} +\@ifundefined{dljs@drivernum}{% + \PackageError{insdljs}% + {You have not specified dvips, dvipsone, pdftex,\MessageBreak + dvipdfm, dvipdfmx, or xetex in the option list + \MessageBreak of the insdljs package} + {Place one of the drivers dvips, dvipsone, pdftex, dvipdfm, + dvipdfmx, or xetex + \MessageBreak in the option list of the insdljs package.} +}{} +% \end{macrocode} +% \subsection{Required Packages} +% We need \texttt{hyperref} to provide some fundamental code for the +% various drivers and \texttt{verbatim} to help write verbatim code +% to a file. +% \changes{v2.2h}{2016/06/09}{Added \string\cs{ifpdfmarkup} to easily detect +% use of pdfmarks} +% \begin{macrocode} +\@ifundefined{ifpdfmarkup}{\newif\ifpdfmarkup}{}\pdfmarkupfalse +\ifpdf\else\ifxetex\else\pdfmarkuptrue\fi\fi +% \begin{macrocode} +\RequirePackage{hyperref} +% \end{macrocode} +% LuaTeX v0.85 has made some changes to primitives, the definition below follows +% the pattern of \texttt{hluatex.def} of \textsf{hyperref}. +% \changes{v2.3}{2016/06/09}{Fixed \string\cs{pdfnames} corresponding to +% changes in primitives of LuaTeX v0.85} +% \changes{v2.3a}{2016/07/31}{Added luatex85 definition of \string\cs{pdfpageref}} +% \begin{macrocode} +\ifpdf\ifx\pdfextension\@undefined\else + \protected\def\pdfnames{\pdfextension names } + \def\pdfpageref{\pdffeedback pageref}\fi\fi +\RequirePackage{verbatim} +% \end{macrocode} +% (2017/01/03) The \pkg{insdljs} package does not use \pkg{conv-xkv} but +% is fundamental to other packages (\pkg{eforms}, \pkg{aeb\_pro}) that require +% \pkg{insdljs} and \pkg{conv-xkv}. +% \changes{v2.3c}{2017/01/03}{Require \string\pkg{conv-xkv}} +% \begin{macrocode} +\usepackage{conv-xkv}[2017/01/03] +% \end{macrocode} +% Last minute adjustments in the driver. +% \begin{macrocode} +\@ifundefined{dljs@drivernum}{% + \@ifundefined{eq@drivernum}{% + \PackageWarning{insdljs} + {No driver specified, will check for pdftex.} + \@ifundefined{pdfoutput}{% + \@ifundefined{@pdfm@mark}{\def\eq@drivernum{2}% + \def\dljs@drivernum{1}\let\isOpenAction\dl@NO + \PackageWarning{insdljs}{No pdftex, but detected dvipdfm}}% + {\PackageWarning{insdljs}{Neither pdftex nor dvipdfm, + assuming dvips/dvipsone.}% + \def\eq@drivernum{0}\def\dljs@drivernum{0}% + \let\isOpenAction\dl@YES} + }{% + \ifcase\pdfoutput + \def\eq@drivernum{1}\def\dljs@drivernum{1}% + \let\isOpenAction\dl@NO + \PackageInfo{insdljs}{Pdftex detected.}% + \else + \def\eq@drivernum{0}\def\dljs@drivernum{0}% + \let\isOpenAction\dl@YES + \PackageWarning{insdljs}{Pdftex engine detected, + but is outputting dvi. Assuming dvips as the driver.}% + \fi + }% + }{% + \begingroup + \count0=\eq@drivernum + \xdef\dljs@drivernum{\ifcase\count0 0\or1\or2\or0\else0\fi} + \ifnum\dljs@drivernum=0\global\let\isOpenAction\dl@YES + \else\global\let\isOpenAction\dl@NO\fi + \endgroup + }% +}{} +% \end{macrocode} +% I've always had problems with the pdftex option and inserting open page actions. +% The problem is that the open page action, which is defined using the token list +% \cs{pdfpageattr} appears not only on the first page, but every page thereafter. +% To solve this problem, I've used \textsf{everyshi}, a nice and useful package by +% Martin Schr\"oder, to set the open page action with \cs{AtNextShipout}. +% This approach seems to work. +% \begin{macrocode} +\ifnum\dljs@drivernum=1\relax + \RequirePackage{everyshi} +\fi +% \end{macrocode} +% If \texttt{reqjs} is in effect, we execute the following code, otherwise, we +% do not. The \textbf{\textsf{Requirements}} dictionary goes in the document \textbf{\textsf{Catalog}}. +% \changes{v2.2d}{2016/04/06}{Code to support \texttt{reqjs} and \texttt{{\string\EXPT}reqjs} options.} +% \begin{macrocode} +\def\AEB@psMrk{[\space} +\ifx\dl@reqJS\dl@YES + \def\dl@@reqJS{/Type/Requirement/S/EnableJavaScripts} + \ifpdf\pdfcatalog{\dl@@reqJS}\else + \ifxetex\immediate\@pdfm@mark{put @catalog <<\dl@@reqJS>>}\else + \literalps@out{\AEB@psMrk{Catalog} <<\dl@@reqJS>> /PUT pdfmark}\fi\fi +\fi +% \end{macrocode} +% \section{Main Code} +% +% Before we begin, we need to document the problems that need to be addressed by this package. +% +% \subsection{Complications} +% +% There is a complication with writing JavaScript and \TeX{} together; they both use +% the backslash character, `|\|', as the escape character. The following two tables +% list escaped characters that have special meanings in different situations. These two tables +% were taken from the book \textsl{JavaScript, The Definitive Guide}, by David Flanagan, 4th Edition, +% O'Reilly publishers. +% +%\begin{flushleft} +%\begin{minipage}{\linewidth} +% \textbf{Escape Sequences in String Literals} +% +% \begin{tabular}{@{}ll@{}} +% Sequence & Character represented \\ +% \cs{0} & the NULL character (\cs{u0000}) \\ +% \cs{b} & backspace (\cs{u0008}) \\ +% \cs{t} & horizontal tab (\cs{u0009}) \\ +% \cs{n} & newline (\cs{u000A}) \\ +% \cs{v} & vertical tab (\cs{u000B}) \\ +% \cs{f} & form feed (\cs{u000C}) \\ +% \cs{r} & carriage return (\cs{u000D}) \\ +% \cs{"} & double quote (\cs{u0022}) \\ +% \cs{'} & apostrophe or single quote (\cs{u0027}) \\ +% |\\| & backslash (\cs{u005C})\\ +% \cs{xXX} & the Latin-1 character specified by the two hexadecimal digits \texttt{XX} \\ +% \cs{uXXXX}& the unicode character specified by the four hexadecimal digits \texttt{XXXX} \\ +% \cs{XXX} & the Latin-1 character specified by the octal digits \texttt{XXX}, between \\ +% & $1$ and $377$. \\ +% \end{tabular} +%\end{minipage} +%\end{flushleft} +% +%\begin{flushleft} +%\begin{minipage}{\linewidth} +% \textbf{Regular Expression Literal characters} +% +% \begin{tabular}{ll} +% Character & Matches \\ +% Alphanumeric & Itself \\ +% \cs{0} & the NULL character (\cs{u0000}) \\ +% \cs{t} & horizontal tab (\cs{u0009}) \\ +% \cs{n} & newline (\cs{u000A}) \\ +% \cs{v} & vertical tab (\cs{u000B}) \\ +% \cs{f} & form feed (\cs{u000C}) \\ +% \cs{r} & carriage return (\cs{u000D}) \\ +% \cs{xXX} & the Latin-1 character specified by the two hexadecimal\\ +% & digits \texttt{XX} \\ +% \cs{uXXXX}& the unicode character specified by the four hexadecimal\\ +% & digits \texttt{XXXX} \\ +% \cs{cXX} & the control character |^X| +% \end{tabular} +%\end{minipage} +%\end{flushleft} +% +% Again, both JavaScript and \TeX, certain punctuation marks have special meaning; in the case of +% JavaScript, punctuation has a special meaning within regular expressions: +%\begin{flushleft} +%\textbf{Special Punctuation in Regular Expressions} +%\begin{verbatim} +% ^ $ . * + ? = ! : | \ / ( ) [ ] { } +%\end{verbatim} +%\end{flushleft} +% +% Complications continued. The distiller method (the \texttt{dvipsone} or the +% \texttt{dvips} option), and the \textsf{pdftex}/\textsf{dvipdfm} applications +% handle the backslash differently. The following example illustrates the problem. +% {\small +%\begin{verbatim} +%dvipsone/dvips +%LaTeX Source As appears in PDF +%var x = "\"; --> var x = "\"; (SyntaxError: Unterminated string literal) +%var x = "\\"; --> var x = "\\"; (Correct) +%\end{verbatim}} +% When we type \texttt{"\string\"}, we are beginning a string (with the first +% double quotes, but then we have a literal \texttt{\string\"}, so we have not +% closed the opening string, hence the error message. We have to type +% `\verb+\\+' to get the single backslash. +% {\small +%\begin{verbatim} +%pdftex/dvipdfm +%LaTeX Source As appears in PDF +%var x = "\"; --> var x = ""; (\" is the literal ") +%var x = "\\"; --> var x = "\"; (SyntaxError: Unterminated string literal) +%var x = "\\\\"; --> var x = "\\"; (Correct) +%\end{verbatim}} +% These applications write raw PDF code to the \texttt{.pdf} file. +% All special characters need to be escaped. You can see, that \textsf{pdftex} +% and \textsf{dvipdfm} require extra backslashs. +% +% The solution to this problem---the problem of how distiller and the two applications +% handle backslashes---is to define control sequences for all the sequences JavaScript uses +% and to adjust their definitions depending on the driver option. As a result, of these +% background definitions, the JavaScript writer does not worry too much about these details, +% for example +%\begin{verbatim} +%\begin{insDLJS}[HelloWorld]{mydljs}{My Private DLJS} +%function HelloWorld() +%{ +% app.alert("\tugHello", 3); +% var x = "\\"; +% app.alert("x = " + x); +%} +%\end{insDLJS} +%\end{verbatim} +% So much for the complication. +% +%\subsection{Begin Code} +% +% Some control sequences that are useful for formatting JavaScript. +% \begin{macro}{\JS} +% \begin{macro}{\Named} +% A convenience command for writing JavaScript. +% \begin{macrocode} +\providecommand\JS[1]{/S/JavaScript/JS(#1)} +\providecommand\Named[1]{/S/Named/N/#1} +\providecommand{\GoTo}{/S/GoTo/D} +\providecommand{\GoToD}{/S/GoTo/D} +\providecommand{\GoToR}{/S/GoToR} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \begin{macrocode} +\def\previewMiKTeX{\def\jsR{\string\r}\def\jsT{\string\t}} +{\obeylines % +\gdef\js@@R{\noexpand +}} +% \end{macrocode} +% \begin{macrocode} +\let\dljstfor\@tfor +% \end{macrocode} +% 2012/06/20 Change the following code so there are no special cases. +% \begin{macrocode} +\def\jsR{\string\r\string\n} +%\def\jsR{\string\r\eqbs\js@@R} +\def\defineJSjsR{\string\r\eqbs^^J} +% \end{macrocode} +% \changes{v2.0l}{2012/11/10}{Added \cs{jsN}} +% \cs{r} is recognized by hyperref when \cs{pdfstringdef} is used. Hyperref +% then modifies the expansion of \cs{r}. So, we'll use \cs{n} is those situations. +% \begin{macrocode} +\def\jsN{\string\n} +{\catcode`\^^I\active % +\gdef^^I{\noexpand^^I}% +\gdef\js@@T{\noexpand^^I}% +}% end of \catcode`\^^I +\let\jsT=\js@@T +% \end{macrocode} +% Need to write to files. This stream will be used for that purpose. +% \begin{macrocode} +\newwrite\js@verbatim@out +\def\iwvo#1{\immediate\write\js@verbatim@out{#1}} +% \end{macrocode} +% \subsection{Some JavaScript Support} +% +% \begin{macro}{\flJSStr} +% \begin{macro}{\dlJSStr} +% +% A simple command for creating JavaScript strings that recognize unicode escape +% sequences \cs{uXXXX}. This command defines a macro with name contained in \texttt{\#1}, +% the first argument, the second argument \texttt{\#2} is the JavaScript string. Enclosing +% the string with double quotes is not necessary, this is done automatically. Any expandable +% commands within string are expanded at define time, unless they are protected with \cs{protect}. +% The string can be formatted using \cs{r} and \cs{t}. Also, \verb!\\! expands to a backslash +% should the need arise. +%\changes{v2.0b}{2008/06/19} +%{ +% A simple command for creating JS strings with unicode \cs{uXXXX}. +%} +% The following is the old definition, it is superseded by the ones below. +%\begin{verbatim} +%\newcommand{\defineJSStr}[2]{{% +% \let\protect\noexpand +% \let\jslit\string +% \def\\{\eqbs\eqbs}\def\cs##1{\\\\##1}% +% \def\r{\\r}\def\t{\\t}% +% \def\n{\\n}\def\u{\\u}% +% \xdef#1{"#2"}% +%}} +%\end{verbatim} +% \changes{v2.0m}{2013/12/23}{Added \cs{jscsDflt} and \cs{jscsDLJS}, incorporated into \cs{dl@defJSStr}.} +% Added \cs{jscsDflt} and \cs{jscsDLJS}, incorporated them into \cs{dl@defJSStr}. +% \begin{macrocode} +\def\dl@lparen{(}\def\dl@rparen{)} +\def\jscsDflt{\let\protect\noexpand\let\jslit\string + \let\~\dl@tilda\let\^\dl@sup + \def\\{\eqbs\eqbs}\def\cs##1{\\\\##1}% + \def\r{\\r}\def\t{\\t}\def\n{\\n}% + \let\{\dl@lBrace\let\}\dl@rBrace + \ifx\jsstr@useUni\dl@One\def\Uni{\\u}\else\def\u{\\u}\fi + \ifx\jsstr@parens\dl@One\let\l@paren\dl@lparen + \let\r@paren\dl@rparen\else + \let\l@paren\@empty\let\r@paren\@empty\fi +} +\def\jscsDLJS{\let\protect\noexpand\let\jslit\string + \let\~\dl@tilda\let\^\dl@sup + \ifxetex\def\\{\eqbs\eqbs}\else\def\\{\eqbs}\fi\def\cs##1{\\\\##1}% + \def\r{\\r}\def\t{\\t}\def\n{\\n}% + \let\{\dl@lBrace\let\}\dl@rBrace + \ifx\jsstr@useUni\dl@One\def\Uni{\\u}\else\def\u{\\u}\fi + \ifx\jsstr@parens\dl@One\let\l@paren\dl@lparen + \let\r@paren\dl@rparen\else + \let\l@paren\@empty\let\r@paren\@empty\fi +} +\ifpdf\let\jscsDLJS\jscsDflt\fi +\let\dl@JSCS\jscsDflt +% \end{macrocode} +% \DescribeMacro{\flJSStr} This form is designed for writing literal strings +% at the field level. +% When the \texttt{*}-form is used, \texttt{\#2} is passed through \cs{pdfstringdef}, +% needed if there are some latex to pdf strings to be converted. +% \begin{macrocode} +\newcommand{\flJSStr}{\bgroup + \let\dl@JSCS\jscsDflt + \@ifstar{\def\isStar{*}\dl@defJSStr} + {\let\isStar\relax\dl@defJSStr}} +\let\fieldJSStr\flJSStr +% \end{macrocode} +% For backward compatibility, we \cs{let} \cs{defineJSStr} to \cs{flJSStr}. +% \begin{macrocode} +\let\defineJSStr\flJSStr +% \end{macrocode} +% \DescribeMacro{\dlJSStr} This form is designed for writing strings to the document +% level JavaScript, as embedded using the \texttt{insDLJS} environment. +% When the \texttt{*}-form is used, \texttt{\#2} is passed through \cs{pdfstringdef}, +% needed if there are some latex to pdf strings to be converted. +% \begin{macrocode} +\newcommand{\dlJSStr}{\bgroup + \@ifstar{\def\isStar{*}\let\dl@JSCS\jscsDLJS\dl@defJSStr} + {\let\isStar\relax\let\dl@JSCS\jscsDLJS\dl@defJSStr}} +% \end{macrocode} +% Some simple key-values for both commands above. Both commands, by default, +% insert double quotations marks at the beginning and end of the string as a convenience. +% \IndexKey{quotes}\texttt{quotes} option just affirms that default; it need not be specified. +% The \IndexKey{noquotes}\texttt{noquotes} option signals \textsf{eforms} not to +% insert said double quotation marks. The other option, \texttt{useUni} is implemented, but not +% documented publicly, to change the command for unicode from \cs{u} to \cs{Uni} in case there +% is a clash of definitions with some accents, \u{a} (\verb!\u{a}!), for example. Hyperref has a +% \cs{u} command defined in the PU encoding, but \cmd{\flJSStr} and \cmd{\dlJSStr} through +% \cmd{\dl@defJSStr} sets \cmd{\Hy@unicodefalse} to support PD1 encoding only. The user can +% access the full range of unicode glyphs through \cs{u}. +% \begin{macrocode} +\define@key{jsstr}{quotes}[]{\let\jsstr@quotes\dl@One} +\define@key{jsstr}{noquotes}[]{\let\jsstr@quotes\dl@Zero} +\define@key{jsstr}{parens}[]{\let\jsstr@parens\dl@One} +\define@key{jsstr}{noparens}[]{\let\jsstr@parens\dl@Zero} +\let\jsstr@quotes\dl@One\let\jsstr@parens\dl@One +\define@key{jsstr}{useUni}[]{\let\jsstr@useUni\dl@One} +\let\jsstr@useUni\dl@Zero +% \end{macrocode} +% The common part to both \cs{flJSStr} and \cs{dlJSStr}. +% \begin{macrocode} +\newcommand{\dl@defJSStr}[3][quotes]{\def\dl@argi{#1}\ifx\dl@argi\@empty + \else\ifx\dl@JSCS\jscsDLJS\let\jsstr@parens\dl@Zero\fi + \setkeys{jsstr}{#1}\fi\dl@JSCS + \ifx\jsstr@quotes\dl@One + \xdef#2{\l@paren"#3"\r@paren}\else + \xdef#2{\l@paren#3\r@paren}\fi + \if\isStar*\gdef\dl@afterAction{{\Hy@unicodefalse\expandafter + \pdfstringdef\expandafter#2\expandafter{#2}}}\else + \global\let\dl@afterAction\relax\fi + \aftergroup\dl@afterAction\egroup} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \begin{macro}{\dlTC}\hspace{-\marginparsep}\thinspace +% \darg{\ameta{code}} A convenience command to insert a \texttt{try/catch} pair around +% \ameta{code} with no error report. +% \changes{v2.3e}{2017/02/27}{Added convenience command \string\cs{dlTC}} +% \begin{macrocode} +\def\dlTC#1{try{#1}catch(e){}} +% \end{macrocode} +% \end{macro} +% +% \subsection{A Macro for Debugging JS} +% \begin{macro}{\db...\db} +% The \cs{db} macro can be used within the \texttt{insDLJS} to insert +% addition JS commands to help debug the code. Usage: +%\begin{verbatim} +% \db console.println("myVal = " + myVal);\db% +%\end{verbatim} +% Any material (on one line) that is between the two \verb+\db+ will either be +% written to the DLJS (if \cmd{\dljs@debug} expands to \texttt y), or be removed from +% the final output (if \cmd{\dljs@debug} does not expand to \texttt y). +% +% Note that the comment character (|%|) following the terminating \verb+\db+. +% This comment keeps a carriage return from being invoked; if \cmd{dljs@debug} is false +% then this will not create an empty line in your JavaScript. +% \begin{macrocode} +\def\js@R{\ifcase\dljs@drivernum^^J\else\jsR\fi} +% \end{macrocode} +% The three spaces (\cs{space}) is meant to align the debug statement, since |\db| takes +% up three spaces. +% \begin{macrocode} +\def\db#1\db{\ifx\dljs@debug\dl@YES\space\space\space#1\js@R\fi} +% \end{macrocode} +% \end{macro} +% Acrobat (and Reader) expect the JavaScript code will be listed in the JavaScript +% array in sorted form. \texttt{pdftex} and \texttt{dvipdfm} do not sort this array +% and it would be difficult for \TeX{} to do the sorting; therefore a workaround. +% Each set of DLJS will be numbered in the order in which they are defined. This puts +% them naturally in proper sorted order. The following counter, numbers the JS. +% \begin{macrocode} +\newcounter{dljs@cnt} +\newcounter{dljssegs}\setcounter{dljssegs}{2} +% \end{macrocode} +% \subsection{Some Verbatim Write Environments} +% Here is a verbatim write environment, based on an example in the +% \texttt{verbatim} package. One modification: The output stream is +% not opened by this environment, this must be done prior. This is necessary +% to write some other stuff prior to the verbatim write. +% +% This verbatim is used internally to write the \texttt{.djs} files, containing +% the JavaScript. +% \begin{macrocode} +\newenvironment{js@verbatimwrite}% writes to current \js@verbatim@out + {% + \@bsphack + \let\do\@makeother\dospecials\catcode`\^^M\active + \def\verbatim@processline{% + \immediate\write\js@verbatim@out{\the\verbatim@line}}% + \verbatim@start}{\@esphack} +% \end{macrocode} +% Unlike the example of verbatimwrite in the \texttt{verbatim} package, we do not +% automatically close the stream when we finish out \texttt{js@verbatimwrite} environment. +% We need to write more to this file, so we have an explicit close. +% \begin{macrocode} +\def\closejs@verbatim@out{\immediate\closeout\js@verbatim@out} +% \end{macrocode} +% Same as above, except we expand the line with an \cmd{\edef}. +% +% For the case of \texttt{dvipsone/dvips}, which use the pdfmark operator, we have +% a couple of definitions for escape (esc). It turns out, I find it convenient to have +% two versions, a \cs{eqesc}, and a \cs{eqesci}, the latter one is only used once, the former +% one is used numerous times, see the \texttt{\hyperref[dljscc]{dljscc.def}} file. +% \begin{macrocode} +\begingroup +\catcode`\@=0 @catcode`@\=12 +@gdef@eqbs{\} +@gdef@ccpdfmark{@gdef@eqesc{\}@gdef@eqesci{}} +@endgroup +% \end{macrocode} +% Here's a definition of left and right braces that will be used in writing JavaScript code. +% \begin{macrocode} +\begingroup + \catcode`<=1 \catcode`\>=2 \@makeother\{ \@makeother\} +\gdef\definebraces<\def\{<\eqesc{>\def\}<\eqesc}>> +\endgroup +% \end{macrocode} +% My own special dos and don'ts. Preserve |\| and \texttt{\%} +% \begin{macrocode} +\def\eqdospecials{\do\ \do\{\do\}\do\$\do\&% + \do\#\do\^\do\_\do\~} +% \end{macrocode} +% The \texttt{jsexpverbatimwrite} environment is used to write a quasi-verbatim +% file. We keep original default definitions of |\| and |%| (they are not included in the +% \cs{eqdospecials} above). The code for \texttt{jsexpverbatimwrite} is based on that found +% in the \texttt{verbatim} package. The trouble is, this package assumes that |\| has been changed +% to catcode 12, other. Consequently, I had a devil of a time trying to stop the verbatim write +% with |\| as an escape rather than other. I finally decided it was necessary to rewrite some of +% the main macros in \texttt{verbatim} so they would properly stop. Below are the modifications +% designed to stop when \texttt{*end} encountered rather than \cs{end}. These changes seem to +% work o.k. +% \begin{macrocode} +\begingroup +\catcode`\~=\active \lccode`\~=`\^^M +\lowercase{\endgroup + \def\eqverbatim@#1~{\verbatim@@#1*end\@nil}% + \def\eqverbatim@@#1*end{% + \verbatim@addtoline{#1}% + \futurelet\dl@next\eqverbatim@@@}% + \def\eqverbatim@@@#1\@nil{% + \ifx\dl@next\@nil + \verbatim@processline + \verbatim@startline + \let\dl@next\eqverbatim@ + \else + \def\@tempa##1*end\@nil{##1}% + \@temptokena{*end}% + \def\dl@next{\expandafter\verbatim@test\@tempa#1\@nil~}% + \fi\dl@next}% +}% +\def\jsexpverbatimwrite +{% writes to current \js@verbatim@out + \@bsphack +% \escapechar=-1% + \ccpdfmark + \catcode`\<=12 \catcode`\>=12 + \input{dljscc.def}% +% Attempt to redefine some macros from the the verbatim package + \let\verbatim@=\eqverbatim@ + \let\verbatim@@=\eqverbatim@@ + \let\verbatim@@@=\eqverbatim@@@ +% end redefine of verbatim package + \let\do\@makeother\eqdospecials% + \catcode`\^^M=\active\catcode`\^^I=12% + \def\verbatim@processline{% + \edef\expVerb{\the\verbatim@line}% + \immediate\write\js@verbatim@out{\expVerb}}% + \verbatim@start% +} +\def\endjsexpverbatimwrite{\immediate\closeout\js@verbatim@out\@esphack} +% \end{macrocode} +% \begin{macro}{\insPath} +% Set this macro in the \textbf{preamble} of your document to +% direct (almost) all auxiliary files of insDLJS to the specified +% path. The macro takes one parameter, a path on your local hard +% disk. Usage: +%\begin{verbatim} +%\insPath{c:/temp/} +%\end{verbatim} +% Be sure to use only forward slashes, and don't forget to finish +% the string with a final forward slash, as illustrated above. +% +% All \texttt{*.fdf} files are written to this folder. The +% \texttt{.djs} files of any \texttt{insDLJS} environments created +% after the \cmd{\insPath} will also be written to the path. Any +% \texttt{.djs} created by packages loaded earlier (such as +% \textsf{exerquiz}) will be written to the current directory. +% +% This macro may be useful for users of Distiller~5.0, and is of marginal +% value to users of \textsf{pdftex/dvipdfm}. +% \begin{macrocode} +\let\js@Path\@empty +\def\insPath#1{\def\js@Path{#1}} +% \end{macrocode} +% \end{macro} +% \DescribeMacro{\makeJSspecials} +% This command is typically executed at the beginning of each field +% or link (see \cs{eq@setButtonProps} and \cs{eq@setWidgetProps}). +% They are used for formatting JavaScript code. The command +% \cs{makespecialJS} is defined in \textsf{insdljs}. +% \changes{v2.1}{2015/06/15}{Moved \cs{makeJSspecials} from \textsf{eforms} +% to here.} +% \begin{macrocode} +\begingroup +\catcode`\{=12 \catcode`\}=12 \catcode`\<=1 \catcode`\>=2 +\gdef\dl@lBrace<\string\{> \gdef\dl@rBrace<\string\}> +\gdef\dl@tilda<\string~> \gdef\dl@sup<\string^> +\endgroup +\def\makeJSspecials{% + \def\\{\eqbs\eqbs}% % define \\ to be \\ + \let\jslit\string +% \end{macrocode} +% \changes{v2.0n}{2014/05/20}{Remake the definition of \cs{\char`\{} and \cs{\char`\}}} +% In an attempt to avoid the use of \verb~\jslit\{~ and \verb~\jslit\}~, we remake +% the definition of \verb~\{} and \verb~\}~. +% \begin{macrocode} + \let\{\dl@lBrace\let\}\dl@rBrace +% \end{macrocode} +% \changes{v2.1}{2015/07/12}{\cs{let} \cs{u} to \cs{@empty}.} +% \cs{let} \cs{u} to \cs{@empty}. +% \begin{macrocode} + \let\u\@empty + \def\({\eqbs(}\def\){\eqbs)}% + \makespecialJS % make \r=\jsR and \t=\jsT +} +% \end{macrocode} +% \subsection{Open Document Actions}\label{opendocactions} +% Early in the process of opening a document, the `\texttt{/OpenAction}' event occurs, where +% various action-types may be executed. These actions occur before the document JavaScripts +% are read and before any pages are opened. We give support for this event, originally part +% of the \textsf{aeb\_pro} package. +%\changes{v2.1}{2015/06/15}{Moved definition of \cs{addToDocOpen} from +% \textsf{aeb\_pro} to \textsf{insdljs}, added support for \texttt{pdftex} and \texttt{xetex} +% options.} +% \paragraph*{Page views} +% The view can be set when the page key is used. Possible values are +% \texttt{fitpage}, \texttt{actualsize}, \texttt{fitwidth}, +% \texttt{fitvisible}, and \texttt{inheritzoom}. These terms correspond +% to Acrobat's UI. When jumping to a destination, the view is set by the +% destination code. +% \begin{macrocode} +\def\dl@fitpage{/Fit} +\def\dl@actualsize{/XYZ null null 1.0} %{/XYZ -32768 -32768 1.0} +\def\dl@fitwidth{/FitH null} %{/FitH -32768} +\def\dl@fitheight{/FitV null} %{/FitV -32768} +\def\dl@fitvisible{/FitBH null} %{/FitBH -32768} +\def\dl@inheritzoom{/XYZ 0 0 0} +\def\dl@mag#1{/XYZ null null #1} +\edef\dl@Page#1{\ifcase\dljs@drivernum + {Page#1}\or\noexpand\pdfpageref#1\space\space 0 R\or + @page#1\fi} +\def\dl@preProcDefns{\let\Page\dl@Page\let\mag\dl@mag + \let\fitpage\dl@fitpage\let\actualsize\dl@actualsize + \let\fitwidth\dl@fitwidth\let\fitheight\dl@fitheight + \let\fitvisible\dl@fitvisible\let\inheritzoom\dl@inheritzoom +} +\let\aeb@additionalOpenAction\@empty +\let\aeb@addActionCode\@empty +\let\addActionObj\@empty +\let\aebpopentoks\@empty +\let\aebpFA\dl@NO +\def\aebp@rightDelimiters{} +% \end{macrocode} +% The argument of \DescribeMacro\addToDocOpen\cmd{\addToDocOpen} is an action-type, usually +% \textbf{JavaScript} or a \textbf{GoTo}. The command is accumulative, it can be invoked several types +% with different action-types. Must be executed in the preamble or it has no effect. +% It populates the value of the key \textbf{/OpenAction} in the \textbf{Catalog} of the +% PDF file. +%\begin{verbatim} +% \addToDocOpen{\JS{console.println("Open the doc!");}} +% \addToDocOpen{/S/GoTo/D[\Page{2}\fitpage]} +%\end{verbatim} +% \begin{macrocode} +\newcommand{\addToDocOpen}[1]{% + \ifx\aebpFA\dl@NO + \g@addto@macro\aebpopentoks{#1}% + \def\aeb@additionalOpenAction{/Next {pubAddToDocOpen}}% +\ifpdf + \def\aeb@addActionCode{\immediate\pdfobj{<< + \aebpopentoks\aebp@rightDelimiters >>}% + \edef\addActionObj{\the\pdflastobj\space 0 R}}% +\else\ifxetex + \def\aeb@addActionCode{\immediate + \@pdfm@mark{obj @objAddActionObj + << \aebpopentoks\aebp@rightDelimiters >> }}% + \def\addActionObj{@objAddActionObj}% +\else % postscript + \def\aeb@addActionCode{\literalps@out{% + \AEB@psMrk/_objdef {pubAddToDocOpen} + /type/dict /OBJ pdfmark^^J% + \AEB@psMrk{pubAddToDocOpen} << + \aebpopentoks\aebp@rightDelimiters >> /PUT pdfmark}}% + \def\addActionObj{{pubAddToDocOpen}}% +\fi\fi + \global\let\aebpFA\dl@YES + \let\@pdfstartview\@empty + \else + \edef\aebp@dljstmp{\aebp@rightDelimiters}% + \xdef\aebp@rightDelimiters{\aebp@dljstmp >> }% + \g@addto@macro\aebpopentoks{/Next << #1 }% + \fi +} +\def\dljs@OpenActions{/OpenAction \addActionObj} +\def\dljs@setOpenActions{\bgroup\makeJSspecials\dl@preProcDefns + \aeb@addActionCode + \ifpdf\pdfcatalog{\dljs@OpenActions}\else + \ifxetex\immediate + \@pdfm@mark{put @catalog <<\dljs@OpenActions>>}\else + \literalps@out{\AEB@psMrk + {Catalog} <<\dljs@OpenActions>> /PUT pdfmark}\fi\fi\egroup} +% \end{macrocode} +% If \textsf{aeb\_pro} is not loaded, we set the open actions. If \textsf{aeb\_pro} +% is loaded, we do nothing for \textsf{aeb\_pro} has its own contributions to the +% PDF \textbf{Catalog}. +% \changes{v2.3d}{2017/01/08}{Use \cs{aebpFA} to detect open actions} +% \begin{macrocode} +\@ifpackageloaded{aeb_pro}{} + {\AtBeginDocument{\ifx\aebpFA\dl@YES\expandafter + \dljs@setOpenActions\fi}} +% \end{macrocode} +% +% \subsection{Open Page Actions}\label{openaction} +% +% In order to get automatic insertion of DLJS using Distiller~5.0 or greater, it is necessary +% to use a ``Page Open Action'' for page 1 of the document. This section contains some commands +% for defining an open page action. Originally, these macros were defined only for Distiller +% users (\textsf{dvips} and \textsf{dvipsone} users), later, I extended their use to +% \textsf{pdftex} and \textsf{dvipdfm}. +% +%\subsubsection{\texorpdfstring{\cs{OpenAction}}{\textbackslash{OpenAction}}} +% +% Here are the macros that actually place the open page action into the PDF document. One for +% the \textsf{Distiller}, one for \textsf{pdftex}, and one for \textsf{dvipdfm}. +% \begin{macrocode} +\let\@CloseAction\@empty +\def\@OAction@pdfmark{\literalps@out{% + \AEB@psMrk{ThisPage} << /AA << /O << \theFirstAction\space + \opentoks\@rightDelimiters >> \@CloseAction >> >> /PUT pdfmark}} +\def\@POAction@pdfmark{\literalps@out{% + \AEB@psMrk{ThisPage} << /AA << \@thisOpenAction + \@thisCloseAction >> >> /PUT pdfmark}% +} +\def\@OAction@pdftex{% + \ifx\isOpenAction\dl@YES + \xdef\pdftexOAction{/AA << /O << \theFirstAction\space + \opentoks\@rightDelimiters >> \@CloseAction >>}% + \AtNextShipout{\pdfpageattr=\expandafter{\pdftexOAction}}% + \fi +} +\def\@POAction@pdftex{% + \xdef\thisPageActionpdftex{/AA << \@thisOpenAction + \@thisCloseAction >>}% + \AtNextShipout{\pdfpageattr=\expandafter{\thisPageActionpdftex}}% +} +% \end{macrocode} +% For \textsf{dvipdfm} +% \begin{macrocode} +\def\@OAction@dvipdfm{\ifx\isOpenAction\dl@YES + \@pdfm@mark{put @thispage << /AA << /O << \theFirstAction\space + \opentoks\@rightDelimiters >> \@CloseAction >> >>}\fi +} +\def\@POAction@dvipdfm{% + \@pdfm@mark{put @thispage << /AA << \@thisOpenAction + \@thisCloseAction >> >>}% +} +% \end{macrocode} +% Now we choose the one appropriate to the user's driver option. +% \begin{macrocode} +\ifcase\dljs@drivernum + \let\@OAction\@OAction@pdfmark + \let\@POAction\@POAction@pdfmark + \gdef\theFirstAction{/S/JavaScript/JS (\the\importfdftoks)} + \let\isOpenAction\dl@YES +\or + \let\@OAction\@OAction@pdftex + \let\@POAction\@POAction@pdftex + \AtBeginDocument{\@OAction@pdftex} +\or + \let\@OAction\@OAction@dvipdfm + \let\@POAction\@POAction@dvipdfm + \AtBeginDocument{\@OAction@dvipdfm} +\fi +% \end{macrocode} +% \begin{macro}{\OpenAction} +% In order for the DLJS to be inserted, \texttt{insdljs} places an open page action +% on the first page. If the document author wants his/her own open page action, inserting +% it with the pdfmark operator may lead to unpredictable results. For the uses of the +% Distiller (dvipsone and dvips users of the distiller), if additional open page action +% is needed on the first page, you can insert this action using the \cmd{\nextOAction} command. +% +%\medskip\noindent Usage +%\begin{verbatim} +% \OpenAction{\JS{app.beep(-1); app.alert("Welcome to my Page!",3);}} +%\end{verbatim} +% The macro takes two parameters, the \cmd{\Next} followed by the desired action, in this +% case it is a JavaScript action. +% +% From the code below, you can see that \cmd{\nextOAction} ends calling itself. If the next token +% is a \cmd{\Next}, additional code is entered into the open page action. Thus, for example, the +% following code is effectively the same as the above example, but the individual lines are +% listed separately in the GUI action dialog of Acrobat. +%\begin{verbatim} +% \OpenAction{\JS{app.beep(-1);}} +% \Next{\JS{app.alert("Welcome to my Page!",3);}} +%\end{verbatim} +% In the above example, several open page actions are ``chained'' together. +% +% You are not restricted to JavaScript actions, for example, you can perform a \texttt{Named} +% action: +%\begin{verbatim} +% \OpenAction{/S/Named/N/Open} +%\end{verbatim} +% There is a |\Named| command that expands to |/S /Named /N#1|, so the above +% example can be written +%\begin{verbatim} +% \OpenAction{\Named{Open}} +%\end{verbatim} +%\cs{opentoks} accumulates the ``action''. +% \begin{macrocode} +%\newtoks\opentoks \opentoks={} +\def\opentoks{} +% \end{macrocode} +% The open action is really not meant for anything too fancy, such as searching using regular +% expressions. Of the special characters, we include only \cs{r} and \cs{t} for formatting +% purposes. If you want to use a regular expression in the open page action (not likely), +% put it at the document level as a JavaScript function, and call that function from the +% open page action. +% \begin{macrocode} +\def\makespecialJS{% + \let\r\jsR\let\t\jsT\let\n\jsN} +\def\@rightDelimiters{} +% \end{macrocode} +% If the next token is \cs{Next} then we gobble it up, and begin \cs{@OpenAction} +% otherwise we begin \cs{@OpenAction}. This allows the ``chaining'' as illustrated above. +% \begin{macrocode} +\def\OpenAction{\@ifnextchar\Next + {\expandafter\@OpenAction\@gobble}{\@OpenAction}} +% \end{macrocode} +% \cs{@OpenAction}: This is the macro that actually does the work. We differentiate between whether the +% current argument \texttt{\#1} is the first of all open actions, or not. If the former, +% we define it as \cs{theFirstAction}, and reset \cs{isOpenAction}, which keeps track of +% whether there has been a \textit{prior} open action defined. If the latter, we place it in +% the \cs{opentoks} token register. +% \begin{macrocode} +\def\@OpenAction#1{% + \ifx\isOpenAction\dl@NO + {\makespecialJS\xdef\theFirstAction{#1}}% + \global\let\isOpenAction\dl@YES + \else + \edef\dljstmp{\@rightDelimiters}% + \xdef\@rightDelimiters{\dljstmp >> }% + {\makespecialJS\xdef\dljstmp{\opentoks /Next << #1 }}% + \xdef\opentoks{\dljstmp}% + \fi + \@nextOpenAction +} +% \end{macrocode} +% As its last act, \cs{@OpenAction} calls \cs{@nextOpenAction}, which is nearly identical to +% \cs{OpenAction}, except if there is no \cs{Next} token, the macro terminates. +% \begin{macrocode} +\def\@nextOpenAction{\@ifnextchar\Next{\expandafter + \@OpenAction\@gobble}{}} +% \end{macrocode} +% \end{macro} +% Here is a last example that uses the \texttt{insDLJS} environment and the \cs{OpenAction} command. This code +% will cause the following action: Ten seconds after the document is opened, an annoying +% message is placed on the screen. The annoying message appears only \texttt{once}, otherwise, +% it would really be annoying. Reader (Acrobat)~5.0 is required for this code. +%\begin{verbatim} +%\begin{insDLJS}[DoIt]{doit}{DoIt} +%var timeout; +%var didIt = false; +%var myWelcome="Welcome to your PDF Page!\r\r You can remove this annoying" +% +" message by sending \u00A3100 to my Swiss bank account!" +%function startToDoIt() +%{ +% if(!didIt) timeout = app.setInterval("DoIt();", 10000); +%} +%function DoIt() +%{ +% app.beep(-1); +% app.alert(myWelcome,1); +% app.clearInterval(timeout); +% didIt = true; +%} +%\end{insDLJS} +%\OpenAction{/S /JavaScript /JS(startToDoIt();)} +%\end{verbatim} +% See the ``Acrobat JavaScript Object Specification'' for the definitions of some +% of these JavaScript methods. +% +%\subsubsection{\texorpdfstring{\cs{thisPageAction}}{\textbackslash{thisPageAction}}} +% \DescribeMacro{\thisPageAction} places page actions on the current page. +% The first argument is on open page action, the second one is a closed page action. +% \begin{macrocode} +\def\protectJSCtrls{\def\r{\string\r\string\n}% + \def\t{\string\t}\def\n{\string\n}} +\def\dljs@tstlp{\@ifnextchar\bgroup + {\let\dljs@multi\dl@YES\dljs@tstlpi}% + {\let\dljs@multi\dl@NO\dljs@tstlpi}} +\def\dljs@tstlpi#1\@nil{}% +% #1=arg, #2=O|C, #3=cmd +\def\dljs@bldScript#1#2#3{{% + \dljs@tstlp#1\@nil + \ifx\dljs@multi\dl@NO{\protectJSCtrls\xdef#3{/#2<<#1>>}}\else + \toks0={}\let\dljs@rAngles\@empty\count0=0 + \@tfor\dljs@arg:=#1\do{% + \ifnum\count0=0 + \toks0=\expandafter{\dljs@arg}\else + \toks2=\expandafter{\dljs@arg}% + \edef\holdtokstmp{\the\toks0 + /Next<<\the\toks2 }% + \edef\dljs@rAngles{\dljs@rAngles\space>>}% + \toks0=\expandafter{\holdtokstmp}% + \fi + \advance\count0by1 + }% + {\protectJSCtrls\xdef#3{/#2<<\the\toks0 \dljs@rAngles>>}% + \xdef#3{#3}}% + \fi +}} +\newcommand{\thisPageAction}[2]{% + \let\@CloseAction\@empty + \let\@thisOpenAction\@empty + \let\@thisCloseAction\@empty + \def\dljs@argi{#1}\def\dljs@argii{#2}% +% \end{macrocode} +% On the first page, \cs{OpenAction} is used to process the open action +% \begin{macrocode} + \ifnum\value{page}=1\relax + \ifx\dljs@argii\@empty\else + \dljs@bldScript{#2}{C}{\@CloseAction}\fi + \ifx\dljs@argi\@empty\else\dljs@tstlp#1\@nil + \ifx\dljs@multi\dl@NO\OpenAction{#1}\else + \@tfor\dljs@arg:=#1\do{\expandafter + \OpenAction\expandafter{\dljs@arg}% + }\fi + \fi + \else +% \end{macrocode} +% If this is not the first page, we just populate the \texttt{/O} dictionary +% \begin{macrocode} + \ifx\dljs@argi\@empty\else + \dljs@bldScript{#1}{O}{\@thisOpenAction}\fi + \ifx\dljs@argii\@empty\else + \dljs@bldScript{#2}{C}{\@thisCloseAction}\fi + \@POAction + \fi +} +% \end{macrocode} +% \subsection{The \texttt{insDLJS} Environments} +% +% \begin{macro}{insDLJS}\hypertarget{insDLJS}{} +% \begin{macro}{insDLJS*} +% This is the main environment defined by this package. These environments +% first set some global variables, then set the program flow to driver-dependent +% environments. There are two forms of this environment, the \texttt{insDLJS} and the +% \texttt{insDLJS*}. +% +% The \texttt{insDLJS} is the simplest of the two environments. Any material +% within the environment, eventually ends up in the DLJS section of the +% PDF document +% +% The environment takes the \texttt{<base\_name>} and writes the +% file \texttt{<base\_name>.djs}. This file contains a verbatim +% listing of the JS within the environment, plus some changing of +% catcodes. This file is then input back into the document at +% \cmd{\AtBeginDocument} with the necessary code for +% \textsf{pdftex} and \textsf{dvipdfm} properly place the JS. +% +% The case of \textsf{dvipsone} and \textsf{dvips} is a little different. A +% \texttt{<base\_name>.djs} is written and input back, and a second file +% \texttt{<base\_name>.fdf} is written. This second file is later input +% into the PDF document after distillation. +% +% The syntax of usage for this environment, which takes three +% arguments, is given next. +%\begin{verbatim} +% \begin{insDLJS}[<function>]{<base_name>}{<script_name>} +% <JavaScript functions or exposed code> +% ... +% ... +% \end{insDLJS} +%\end{verbatim} +% where, +% \begin{description} +% \item[\texttt{\#1:}] This optional parameter, \texttt{<function>}, +% is \emph{required} for the \texttt{dvipsone} and \texttt{dvips} +% options; otherwise it is ignored. Its value must be the name of +% one of the functions defined in the environment. This is used to +% detect whether the DLJS has already be loaded by Acrobat. +% \item[\texttt{\#2}:] This parameter, \texttt{<base\_name>}, is an +% alphabetic word with no spaces and limited to eight characters. It +% is used to build the names of auxiliary files and to build the +% names of macros used by the environment. +% \item[\texttt{\#3}:] The \texttt{<script\_name>} of your JavaScript. +% This title will appear in the Documentlevel JavaScript dialog of +% Acrobat. +% \end{description} +% Within the insDLJS environment, there are two types of comment characters: +% (1) a \TeX{} comment (|%|) and (2) a JavaScript comment. The JavaScript +% comments are `\texttt{//}', a line comment, and `\texttt{/*...*/}' for more +% extensive commenting. These comments will survive and be placed into the +% PDF file. In JavaScript the `|%|' is used as well, use |\%| when you want to use +% the percent character in a JavaScript statement, for example +% |app.alert("\%.2f", 3.14159);|, this statement will appear within your JavaScript +% code as |app.alert("%.2f", 3.14159);|. +% \changes{v2.2c}{2015/11/13}{Turned \cs{Hy@unicodefalse} so unicode is not written +% in the name of the script.} +% \begin{macrocode} +\let\insdljsloadVar\@empty +\newenvironment{insDLJS}[3][] +{% + \gdef\detectdljs{#1}\gdef\dljsBase{#2}% + \ifxetex{\def\1{\string\1}\def\2{\string2}% + \def\3{\string\3}\xdef\dljsName{#3}}\else + \Hy@unicodefalse\pdfstringdef{\dljsName}{#3}\fi +% \end{macrocode} +% If the optional argument is not passed, +% we generate one for the user. +%\changes{v2.0k}{2012/06/21}{If the optional argument is not passed, +% we generate one for the user.} +% \begin{macrocode} +\ifx\detectdljs\@empty + \stepcounter{dljs@cnt}% + \xdef\detectdljs{_bInsdljsload\arabic{dljs@cnt}}% + \edef\insdljsloadVar{var \detectdljs=true;}% + \addtocounter{dljs@cnt}{-1}% +\fi + \global\let\multisegments\dl@NO\setcounter{dljssegs}{2}% + \global\dljsobjtoks={}% + \expandafter\ifx\csname dljs\dljsBase\endcsname\relax + \else\@insjserrDuplicate\fi + \ifcase\dljs@drivernum + \let\insert@DLJS=\insert@DLJS@pdfmark + \let\endinsDLJS=\endinsert@DLJS@pdfmark + \let\newsegment=\newsegment@pdfmark + \let\endnewsegment=\endnewsegment@pdfmark + \or + \let\insert@DLJS=\insert@DLJS@pdftex + \let\endinsDLJS=\endinsert@DLJS@pdftex + \let\newsegment=\newsegment@pdftex + \let\endnewsegment=\endnewsegment@pdftex + \or + \let\insert@DLJS=\insert@DLJS@dvipdfm + \let\endinsDLJS=\endinsert@DLJS@dvipdfm + \let\newsegment=\newsegment@dvipdfm + \let\endnewsegment=\endnewsegment@dvipdfm + \fi + \insert@DLJS +}{} +% \end{macrocode} +% +% The \texttt{insDLJS*} environment can be used to better organize, +% edit and debug your JavaScript. If you have the full Acrobat +% product, you can open the DLJS edit dialog. There you will see a +% listing of all DLJS contained in the document. When you double +% click on one of the \textsl{script names}, you enter the edit +% window, where you can edit all JavaScript contained under that +% name. Each \texttt{insDLJS} environment creates a new listing +% within this DLJS dialog; and, each environment creates a +% `\texttt{.djs}' file and possibly a \texttt{.fdf}' file. Each +% \texttt{insDLJS*} environment also creates a `\texttt{.djs}' file +% and possibly a `\texttt{.fdf}' file too, but within the +% \texttt{insDLJS*} environment you can create JavaScript under +% different \textsl{script names}. +% +% The syntax is +%\begin{verbatim} +% \begin{insDLJS*}[<function>]{<base_name>} +% \begin{newsegment}{<script_name>} +% <JavaScript functions or exposed code> +% \end{newsegment} +% \begin{newsegment}{<script_name>} +% <JavaScript functions or exposed code> +% \end{newsegment} +% ... +% ... +% <JavaScript functions or exposed code> +% \end{newsegment} +% \begin{newsegment}{<name_name>} +% <JavaScript functions or exposed code> +% \end{newsegment} +% \end{insDLJS*} +%\end{verbatim} +% where, +% \begin{description} +% \item[\texttt{\#1:}] This optional parameter, \texttt{<function>}, +% is \emph{required} for the \texttt{dvipsone} and \texttt{dvips} +% options; otherwise it is ignored. Its value must be the name of +% one of the functions defined in the environment. This is used to +% detect whether the DLJS has already be loaded by Acrobat. +% \item[\texttt{\#2}:] This parameter, \texttt{<base\_name>}, is an +% alphabetic word with no spaces and limited to eight characters. It +% is used to build the names of auxiliary files and to build the +% names of macros used by the environment. +% \item[\texttt{\#3}:] The \texttt{<script\_name>} of your JavaScript. +% This title will appear in the Document level JavaScript dialog of +% Acrobat. +% \end{description} +% \begin{macrocode} +\newenvironment{insDLJS*}[2][] +{% + \gdef\detectdljs{#1}\gdef\dljsBase{#2}% +% \end{macrocode} +% If the optional argument is not passed, +% we generate one for the user. +%\changes{v2.0k}{2012/06/21}{If the optional argument is not passed, +% we generate one for the user.} +% \begin{macrocode} +\ifx\detectdljs\@empty + \stepcounter{dljs@cnt}% + \xdef\detectdljs{_bInsdljsload\arabic{dljs@cnt}}% + \edef\insdljsloadVar{var \detectdljs=true;}% + \addtocounter{dljs@cnt}{-1}% +\fi + \global\let\multisegments\dl@YES\setcounter{dljssegs}{2}% + \global\dljsobjtoks={}% + \expandafter\ifx\csname dljs\dljsBase\endcsname\relax + \else\@insjserrDuplicate\fi + \ifcase\dljs@drivernum + \let\insert@DLJS=\insert@DLJS@pdfmark + \expandafter + \let\csname endinsDLJS*\endcsname\endinsert@DLJS@pdfmark + \let\newsegment=\newsegment@pdfmark + \let\endnewsegment=\endnewsegment@pdfmark + \or + \let\insert@DLJS=\insert@DLJS@pdftex + \expandafter + \let\csname endinsDLJS*\endcsname\endinsert@DLJS@pdftex + \let\newsegment=\newsegment@pdftex + \let\endnewsegment=\endnewsegment@pdftex + \or + \let\insert@DLJS=\insert@DLJS@dvipdfm + \expandafter + \let\csname endinsDLJS*\endcsname\endinsert@DLJS@dvipdfm + \let\newsegment=\newsegment@dvipdfm + \let\endnewsegment=\endnewsegment@dvipdfm + \fi + \insert@DLJS +}{} +\def\@insjserrDuplicate{% + \typeout{^^J! insdljs Package error.} + \typeout{! insDLJS environment: On line number \the\inputlineno,} + \typeout{! the base name `\dljsBase' has already been chosen.} + \typeout{! A DLJS earlier defined has been overwritten!} + \typeout{! Choose another name for the first required argument} + \typeout{! of the insDLJS environment.^^J} +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \subsection{The \texttt{execJS} Environment}\label{execJS} +% This environment works only for those document authors using Acrobat 5.0 or +% Acrobat Approval. The \texttt{execJS} environment writes a verbatim \texttt{.djs} and +% \texttt{.fdf} files using the same scheme as \texttt{insDLJS} environment. +% The \texttt{.fdf} file is imported into the newly created PDF document and the JavaScript contained +% within the environments are executed. +% +% In order for the JavaScript to be imported and executed, the \texttt{execJS} must be used. The +% JavaScript is executed once, when the document is first opened in Acrobat. +% +% This feature is potentially useful for developmental purposes. +% \begin{macrocode} +\newif\ifisdljs \isdljsfalse +\begingroup +\catcode`\~=12 \catcode`\#=12 +\gdef\efdlspecials{\catcode`\~=12 \catcode`\#=12} +\endgroup +\def\ckivspace#1{\if\noexpand#1\space\else\expandafter#1\fi} +% \end{macrocode} +% \changes{v2.2b}{2015/08/03}{Added a hook \cs{DLspecialDefs} into the DJS file} +% (2015/08/03) Added the \cs{DLspecialDefs} hook into the DJS file, used in +% \textsf{aeb\_pro}. +% \begin{macrocode} +\let\DLspecialDefs\@empty +\def\fdfAfterheader +{% + \iwvo{\string\begingroup\string\efdlspecials} + \iwvo{\string\DLspecialDefs} + \iwvo{\string\isdljstrue} + \iwvo{\string\makeatletter} + \iwvo{\string\immediate\string\openout\string +\js@verbatim@out=\string\js@Path\space\dljsBase.fdf}% + \iwvo{\string\begin{jsexpverbatimwrite}} + \iwvo{\string\firstFDFline} + \iwvo{1 0 obj} + \iwvo{<< /FDF << /JavaScript << /Doc 2 0 R /After 3 0 R >> >> >> } + \iwvo{endobj} + \iwvo{2 0 obj} +% \end{macrocode} +% When a non-Distiller workflow, insure execJSs are listed first. +% \changes{v2.2h}{2016/06/09}{When a non-Distiller workflow, insure execJSs are listed first} +% \begin{macrocode} +\ifpdfmarkup + \iwvo{[ (ExecJS \dljsBase) (var _\dljsBase\space = true;) ] }\else + \iwvo{[ (00 ExecJS \dljsBase) (var _\dljsBase\space = true;) ] }\fi + \iwvo{endobj} + \iwvo{3 0 obj} + \iwvo{<<>>} + \iwvo{stream} +} +% \end{macrocode} +% \begin{environment}{execJS} +% The parameter \texttt{\#1} is the base name for this environment. +% The base name will be used to create +% a filename to save the \texttt{.fdf} file under. +% \begin{macrocode} +\newenvironment{execJS}[1] +{% + \gdef\detectdljs{\string_#1}\gdef\dljsBase{#1}% + \global\dljsobjtoks={}% + \expandafter\gdef\csname dljs\dljsBase\endcsname{}% + \ifx\importdljs\dl@YES\ifx\execjs\dl@YES + \ifx\dl@gopro\dl@YES + \ifnum\dljs@drivernum=0\relax + \addImportAnFDF\importAnFDFTemplate + \else + \OpenAction{/S/JavaScript/JS (\importAnFDFTemplate)}% + \fi\fi + \fi\fi + \immediate\openout \js@verbatim@out \js@Path\dljsBase.djs + \fdfAfterheader + \js@verbatimwrite +}{% + \fdfendstreamobj + \endjs@verbatimwrite + \fdftrailer + \closejs@verbatim@out + \expandafter\xdef\csname\dljsBase OBJ\endcsname{\the\dljsobjtoks}% + \edef\@dljstmp{\noexpand\AtBeginDocument{% + \noexpand\input{\js@Path\dljsBase.djs}}}\@dljstmp +% \end{macrocode} +%\changes{v2.2g}{2016/05/11}{Removed \string\cs{AtBeginDocument} code +%from the \string\texttt{execJS} environment. This causes problems with +%the order of \string\texttt{execJS} and \string\texttt{insDLJS}.} +%(2016/05/11) Remove the following code, seens to cause problems with +%the order of \texttt{execJS} and \texttt{insDLJS}. +%\begin{verbatim} +% \ifx\firstdljs\dl@YES +% \AtBeginDocument{\importAnFDF}% +% \global\let\firstdljs\dl@NO +% \fi +%\end{verbatim} +% \begin{macrocode} +} +% \end{macrocode} +% \end{environment} +% \subsection{The \texttt{defineJS} Environment}\label{defineJS} +% When we create a form field that has a JavaScript action attached, it would be nice +% to be able to write verbatim JavaScript code into the action. Due to the limitations +% of \TeX, this is not possible. The other possibility is to create an environment for +% writing JavaScript. This section introduced a couple of environments, the +% \texttt{defineJS} and \texttt{localJS} environments. +% \begin{environment}{defineJS} +% The \texttt{defineJS} environment takes two parameters, the first one optional. +%\begin{description} +%\item[\ttfamily\#1 = ] This optional parameter can be used to change catcodes +% before the verbatim read begins. +%\item[\ttfamily\#2 = ] The command to be defined. +%\end{description} +% The material within the environment is read verbatim and a new command by the name of \#2 +% is defined. +% \begin{macrocode} +\newtoks\JStoks +\newenvironment{defineJS}[2][] +{% + \expandafter\@ifundefined\expandafter{% + \expandafter\@gobble\string#2}{}{% + \PackageWarning{insdljs}{The command + \string#2 already defined}}% + \gdef\defineJSArg{#2}\JStoks={}% + \def\verbatim@processline + {% + \xdef\JS@temp{\the\JStoks\the\verbatim@line\defineJSjsR}% + \global\JStoks=\expandafter{\JS@temp}% + }% + \let\do\@makeother\dospecials\catcode`\^^M\active + #1% + \verbatim@start +}{\gdef\eq@JStemp{\expandafter\edef\defineJSArg{\the\JStoks}}% + \aftergroup\eq@JStemp} +% \end{macrocode} +% Silent version of \texttt{defineJS}, can repeatedly be used to redefine the same +% macro. +% \begin{macrocode} +\newenvironment{@defineJS}[2][] +{% + \gdef\defineJSArg{#2}\JStoks={}% + \def\verbatim@processline + {% + \xdef\JS@temp{\the\JStoks\the\verbatim@line\defineJSjsR}% + \global\JStoks=\expandafter{\JS@temp}% + }% + \let\do\@makeother\dospecials\catcode`\^^M\active + #1% + \verbatim@start +}{\gdef\eq@JStemp{\expandafter\edef\defineJSArg{\the\JStoks}}% + \aftergroup\eq@JStemp} +% \end{macrocode} +% \end{environment} +% An author might want these definitions to be local in definition, so the +% \texttt{localJS} environment is supplied. +% \begin{environment}{localJS} +% This environment does nothing more than to enclose the material +% in \cs{begingroup} and \cs{endgroup}. +% \begin{macrocode} +\newenvironment{localJS}[1][]{}{\ifvmode\else\unskip\fi} +% \end{macrocode} +% \end{environment} +% +% \subsection{Set Document Actions} +% We provide simple environments for writing document actions. +% \begin{environment}{willClose} +% Execute a script just before closing the document. +% \begin{environment}{willSave} +% Execute script just before a save. +% \begin{environment}{didSave} +% Execute a script just after a save +% \begin{environment}{willPrint} +% Execute a script just before a print job +% \begin{environment}{didPrint} +% Execute a script just after a print job +% \begin{macrocode} +\newenvironment{willClose}[1][] +{\@defineJS[#1]{\will@Close}} +{\end@defineJS} +\let\will@Close\@empty +\newenvironment{willSave}[1][] +{\@defineJS[#1]{\will@Save}} +{\end@defineJS} +\let\will@Save\@empty +\newenvironment{didSave}[1][] +{\@defineJS[#1]{\did@Save}} +{\end@defineJS} +\let\did@Save\@empty +\newenvironment{willPrint}[1][] +{\@defineJS[#1]{\will@Print}} +{\end@defineJS} +\let\will@Print\@empty +\newenvironment{didPrint}[1][] +{\@defineJS[#1]{\did@Print}} +{\end@defineJS} +\let\did@Print\@empty +\def\dljs@willDidActions{/AA << + \ifx\test@will@Close\@empty\else/WC << + \JS{\will@Close} >>\fi + \ifx\test@will@Save\@empty\else/WS << + \JS{\will@Save} >>\fi + \ifx\test@did@Save\@empty\else/DS << + \JS{\did@Save} >>\fi + \ifx\test@will@Print\@empty\else/WP << + \JS{\will@Print} >>\fi + \ifx\test@did@Print\@empty\else/DP << + \JS{\did@Print} >>\fi + >> +} +\newcommand\dljs@setDocActions{% + \edef\test@will@Close{\will@Close}% + \edef\test@will@Save{\will@Save}% + \edef\test@did@Save{\did@Save}% + \edef\test@will@Print{\will@Print}% + \edef\test@did@Print{\did@Print}% +% \end{macrocode} +% Driver dependent code to put any document actions into the additional actions +% dictionary of the document catalog. +% \begin{macrocode} + \ifpdf\pdfcatalog{\dljs@willDidActions}\else + \ifxetex\immediate + \@pdfm@mark{put @catalog <<\dljs@willDidActions>>}\else + \literalps@out{\AEB@psMrk + {Catalog} <<\dljs@willDidActions>> /PUT pdfmark}\fi\fi +} +\@ifpackageloaded{aeb_pro}{} + {\AtBeginDocument{\dljs@setDocActions}} +% \end{macrocode} +% \end{environment} +% \end{environment} +% \end{environment} +% \end{environment} +% \end{environment} +% +% \subsection{For \texttt{dvipsone}/\texttt{dvips}} +% The method of automatic insertion of document level JavaScript is to +% write an FDF file (Forms Data Format), then import this FDF into the +% document using the JavaScript method \texttt{Doc.importAnFDF()}. +% +% We break the FDF file into three parts: the \cmd{\fdfheader} (the stuff prior +% to the JavaScript code); the JavaScript code itself; and the +% \cmd{\fdftrailer}, the stuff that follows the code. +% \begin{macrocode} +\begingroup +\catcode`\%=12 +\gdef\firstFDFline{%FDF-1.2} +\gdef\lastFDFline{%%EOF} +\endgroup +\def\fdfheader +{% + \iwvo{\string\begingroup\string\efdlspecials} + \iwvo{\string\isdljstrue} + \iwvo{\string\makeatletter} + \iwvo{\string\immediate\string\openout\string + \js@verbatim@out=\string\js@Path\space\dljsBase.fdf}% + \iwvo{\string\begin{jsexpverbatimwrite}} + \iwvo{\string\firstFDFline} + \iwvo{1 0 obj} + \iwvo{<< /FDF << /JavaScript << /Doc 2 0 R >> >> >>} + \iwvo{endobj} + \iwvo{2 0 obj} + \iwvo{[ \string\csname\string\@gobble\space\dljsBase% + OBJ\string\endcsname]} + \iwvo{endobj} +} +\def\fdfbeginstreamobj +{% + \iwvo{\thedljssegs\space 0 obj} + \iwvo{<<>>} + \iwvo{stream} +% \end{macrocode} +% If the user has not passed the optional +% name, we generated one for him, now we insert it into the \texttt{stream}. +%\changes{v2.0k}{2012/06/21}{If the user has not passed the optional +% name, we generated one for him, now we insert it into the \texttt{stream}.} +% \begin{macrocode} + \ifx\insdljsloadVar\@empty\else + \iwvo{\insdljsloadVar} + \global\let\insdljsloadVar\@empty + \fi +} +\def\fdfendstreamobj{% + \iwvo{endstream} + \iwvo{endobj} +} + \def\fdftrailer{% + \iwvo{trailer} + \iwvo{<< /Root 1 0 R >>} + \iwvo{\string\lastFDFline} +% \end{macrocode} +% Here we write \texttt{*end{jsexpverbatimwrite}} as a signal for our modified verbatim write +% code to stop. +% \begin{macrocode} + \iwvo{*end{jsexpverbatimwrite}} + \iwvo{\string\endgroup} +} +% \end{macrocode} +% There may be more than one use of the \texttt{insDLJS} +% environment and we need to be able to import each of the resultant +% FDF files. The \cmd{\importfdftoks} accumulates material to be +% used after all chance for the user to insert JS code has been +% exhausted. +% \begin{macrocode} +\newtoks\importfdftoks \importfdftoks={} +\newtoks\dljsobjtoks \dljsobjtoks={} +% \end{macrocode} +% This is a template for detecting whether the DLJS has been imported into +% the document. +% \begin{macrocode} +\def\importAnFDFTemplate{% +if(typeof \detectdljs\space == "undefined")\jsR\jsT +% \end{macrocode} +% Beginning with Acrobat 8.1, the \texttt{Doc.importAnFDF} has additional security. We must call +% it through a trusted function which is in the file aeb.js, which resides in the user JavaScript folder. +%\changes{v2.0h}{2006/10/03} +%{ +% Created aeb.js, which must be installed for users of distiller. The importAnFDF method is now called +% through a trusted function. +%} +% \begin{macrocode} + ( app.viewerVersion > 8 ) ? % + aebTrustedFunctions( this, aebImportAnFDF, % + "\js@Path\dljsBase.fdf") : % + this.importAnFDF("\js@Path\dljsBase.fdf");\jsR +} +% \end{macrocode} +% Add in another template into \cmd{\importfdftoks}. +% \begin{macrocode} +\def\addImportAnFDF#1{% + \ifx\importdljs\dl@YES +% \let\jsR\relax\let\jsT\relax + \edef\importAnFDFtmp{\the\importfdftoks#1}% + \global\importfdftoks=\expandafter{\importAnFDFtmp}% + \fi +} +% \end{macrocode} +% This is used by \texttt{insert@DLJS@pdfmark} and is placed +% \cmd{\AtBeginDocument}. +% \begin{macrocode} +\def\importAnFDF{\ifx\importdljs\dl@YES\@OAction\fi} +% \end{macrocode} +% The \texttt{insert@DLJS@pdfmark} environment writes the \cmd{\dljsBase.djs} file +% which is in turn input back in, and rewritten as \cmd{\dljsBase.fdf}. This is +% necessary to give the user a chance to modify the JavaScript code in an +% authorized way. +% \begin{macrocode} +\newenvironment{newsegment@pdfmark}[1]{% + \addtocounter{dljssegs}{1}% + \addtocounter{dljs@cnt}{1}% + \Hy@unicodefalse\pdfstringdef{\dljsName}{#1}% + \edef\@dljstmp{\the\dljsobjtoks(\dljsName) + \thedljssegs\space 0 R\space} + \global\dljsobjtoks=\expandafter{\@dljstmp} + \fdfbeginstreamobj + \js@verbatimwrite +}{% + \fdfendstreamobj + \endjs@verbatimwrite +} +\def\insert@DLJS@pdfmark{% + \global\let\dljspresent\dl@YES + \expandafter\gdef\csname dljs\dljsBase\endcsname{}% + \ifx\importdljs\dl@YES\ifx\dl@gopro\dl@YES + \addImportAnFDF\importAnFDFTemplate + \fi\fi + \immediate\openout \js@verbatim@out \js@Path\dljsBase.djs + \fdfheader + \ifx\multisegments\dl@NO\expandafter + \newsegment\expandafter{\expandafter\dljsName\expandafter}\fi +} +\def\endinsert@DLJS@pdfmark{% + \ifx\importdljs\dl@YES + \ifx\multisegments\dl@NO\expandafter\endnewsegment\fi + \fdftrailer + \closejs@verbatim@out + \expandafter\xdef\csname\dljsBase% + OBJ\endcsname{\the\dljsobjtoks}% + \edef\@dljstmp{\noexpand\AtBeginDocument{% + \noexpand\input{\js@Path\dljsBase.djs}}}% + \@dljstmp + \ifx\firstdljs\dl@YES + \AtBeginDocument{\edef\@dljstmp{\importAnFDF}% + \@dljstmp}\global\let\firstdljs\dl@NO + \fi + \fi +} +% \end{macrocode} +% \subsection{For \texttt{pdftex}/\texttt{dvipdfm}} +% Again, we break the problem of creating DLJS into four parts: \cmd{\begindljs}, +% \cmd{\enddljs}, the code itself, driver dependent material, \cmd{\write@pdftex@obj} +% and \cmd{\write@dvipdfm@obj}. +% +% The following is used by both \texttt{pdftex} and \texttt{dvipdfm}. +% \begin{macrocode} +\begingroup +\catcode`\@=0 @catcode`@\=12 +@gdef@ccpdftex{@gdef@eqesc{\\}@gdef@eqesci{\}} +@endgroup +\def\begindljs +{% + \iwvo{\string\begingroup\string\efdlspecials} + \iwvo{\string\isdljstrue} +% \end{macrocode} +%\changes{v2.2f}{2016/05/07}{Include \string\cs{makeletter} in verbatim write} +% \begin{macrocode} + \iwvo{\string\makeatletter} + {\uccode`c=`\%\uppercase{% + \iwvo{\string\obeyspaces\string\obeylines + \string\let\string^\string^M=\string\jsR c}}} +% \end{macrocode} +% (2014/08/09) For pdftex and xetex, this global let messages up +% the \texttt{Verbatim} environment. Not sure why this is global anyway +%\begin{verbatim} +% \iwvo{\string\obeyspaces\string\obeylines\string +% \global\string\let\string^\string^M=\string\jsR c}}} +%\end{verbatim} +% \begin{macrocode} + {\escapechar=-1 \lccode`C=`\%\lowercase{% + \iwvo{\string\\catcode`\string\\"=12C}}} +} +\def\beginseg +{% + {\lccode`P=`\{\lccode`C=`\%\lowercase{% + \iwvo{\string\gdef\string\dljs\dljsBase\roman{dljssegs}PC}}}% +} +% \end{macrocode} +% With \cs{enddsljs}, we now finish the macro definition with a closing right brace, followed by a +% comment, `\texttt\%, and an end of group. +% \begin{macrocode} +\def\endseg +{% + {\uccode`c=`\%\uccode`p=`\}\uppercase{\iwvo{pc}}}% +} +\def\enddljs +{% + \iwvo{\string\endgroup}% +} +% \end{macrocode} +%\changes{v2.0j}{2011/06/27}{made some changes as suggested by Christian Feuersaenger, who reported some +% problem clashes between \textsf{babel} (spanish) and \textsf{insdljs}.} +% \begin{macrocode} +\def\@roman#1{\romannumeral#1} +\def\write@objs +{% + \iwvo{\begingroup} + \iwvo{\string\catcode`\string\<=12 } + \iwvo{\string\catcode`\string\>=12 } + {\lccode`C=`\%\lowercase{\iwvo{\string\ccpdftex C}}} + {\lccode`C=`\%\lowercase{\iwvo{% + \string\input{dljscc.def}C\the\dljsobjtoks}}} + \iwvo{\endgroup} +} +% \end{macrocode} +% \subsubsection{\texttt{pdftex} Specific Code} +% \begin{macrocode} +\newenvironment{newsegment@pdftex}[1]{% + \addtocounter{dljssegs}{1}% + \addtocounter{dljs@cnt}{1}% + \edef\tmp{^^J\string\immediate\string\pdfobj{ << /S/JavaScript/JS% + (\string\dljs\dljsBase\roman{dljssegs}) >> }}% + \edef\@dljstmp{\the\dljsobjtoks\tmp}% + \global\dljsobjtoks=\expandafter{\@dljstmp}% + \edef\tmp{^^J\string\xdef\string\obj\dljsBase\roman{dljssegs}% + {\string\the\string\pdflastobj\string\space 0 R}}% + \edef\@dljstmp{\the\dljsobjtoks\tmp}% + \global\dljsobjtoks=\expandafter{\@dljstmp}% + \edef\curr@Cnt{\ifnum\arabic{dljs@cnt}<10 0\fi\arabic{dljs@cnt}}% + \Hy@unicodefalse\pdfstringdef{\dljsName}{#1}% + \edef\dljspdftextmp + {\the\importfdftoks (\curr@Cnt\space\dljsName) + \noexpand\csname obj\dljsBase\roman{dljssegs}% + \noexpand\endcsname\space}% + \global\importfdftoks=\expandafter{\dljspdftextmp}% + \beginseg + \js@verbatimwrite +}{% + \endjs@verbatimwrite + \endseg +} +% \end{macrocode} +% The main branch of the \texttt{insDLJS} for \texttt{pdftex}. This +% environment writes to the file \cmd{\dljsBase.djs} all the necessary code, then +% is input back into the file using \cmd{\AtBeginDocument}. +% \begin{macrocode} +\newenvironment{insert@DLJS@pdftex}{% + \expandafter\gdef\csname dljs\dljsBase\endcsname{}% + \immediate\openout \js@verbatim@out \js@Path\dljsBase.djs + \begindljs + \ifx\multisegments\dl@NO\expandafter + \newsegment\expandafter{\expandafter\dljsName\expandafter}\fi +}{% + \ifx\multisegments\dl@NO\expandafter\endnewsegment\fi + \enddljs + \write@objs + \endjs@verbatimwrite + \closejs@verbatim@out + \edef\@dljstmp{\noexpand\AtBeginDocument{% + \noexpand\input{\js@Path\dljsBase.djs}}}% + \@dljstmp + \ifx\importdljs\dl@YES + \ifx\firstdljs\dl@YES + \AtEndDocument{\edef\@dljstmp{\setDLJSRef@pdftex}\@dljstmp} + \global\let\firstdljs\dl@NO + \fi + \fi +} +% \end{macrocode} +% This code places the \texttt{/JavaScript} key-value in the \texttt{/Names} dictionary +% of the PDF document. This code is inserted into the document in \texttt{insert@DLJS@pdftex} +% using \cmd{\AtEndDocument}. +% \begin{macrocode} +\def\setDLJSRef@pdftex +{% + \noexpand\immediate\noexpand\pdfobj {% + << /Names [\the\importfdftoks] >> }% + \edef\noexpand\objNames{\noexpand\the\noexpand\pdflastobj\space 0 R}% + \pdfnames {/JavaScript \noexpand\objNames}% +} +% \end{macrocode} +% \subsubsection{\texttt{dvipdfm} Specific Code} +% Begin by writing driver-specific code to \cmd{\dljsBase.djs}. +% \begin{macrocode} +\newenvironment{newsegment@dvipdfm}[1] +{% + \addtocounter{dljssegs}{1}% + \addtocounter{dljs@cnt}{1}% + \edef\tmp{^^J\string\immediate\string + \csname\space @pdfm@mark\string\endcsname + {obj @obj\dljsBase\roman{dljssegs}\space << /S/JavaScript% + /JS(\string\dljs\dljsBase\roman{dljssegs}) >> }}% + \edef\@dljstmp{\the\dljsobjtoks\space\tmp}% + \global\dljsobjtoks=\expandafter{\@dljstmp}% + \edef\curr@Cnt{\ifnum\arabic{dljs@cnt}<10 0\fi\arabic{dljs@cnt}}% + {\def\1{\string\1}\def\2{\string2}% + \def\3{\string\3}\xdef\dljsName{#1}}% + \edef\dljspdftextmp + {\the\importfdftoks (\curr@Cnt\space \dljsName) % + @obj\dljsBase\roman{dljssegs}\space}% + \global\importfdftoks=\expandafter{\dljspdftextmp}% + \beginseg + \js@verbatimwrite +}{% + \endjs@verbatimwrite + \endseg +} +% \end{macrocode} +% This code places the \texttt{/JavaScript} key-value in the \texttt{/Names} dictionary +% of the PDF document. This code is inserted into the document in \texttt{insert@DLJS@dvipdfm} +% using \cmd{\AtEndDocument}. +% \begin{macrocode} +\def\setDLJSRef@dvipdfm +{% + \immediate\@pdfm@mark{obj @objnames % + << /Names [\the\importfdftoks] >> }% + \@pdfm@mark{put @names % + << /JavaScript @objnames >> }% +} +% \end{macrocode} +% The main branch of the \texttt{insDLJS} for \texttt{dvipdfm}. This +% environment writes to the file \cmd{dljsBase.djs} all the necessary code, then +% is input back into the file using \cmd{\AtBeginDocument}. +% \begin{macrocode} +\newenvironment{insert@DLJS@dvipdfm} +{% + \expandafter\gdef\csname dljs\dljsBase\endcsname{}% + \immediate\openout \js@verbatim@out \js@Path\dljsBase.djs + \begindljs + \ifx\multisegments\dl@NO\expandafter\newsegment\expandafter{% + \expandafter\dljsName\expandafter}\fi +}{% + \ifx\multisegments\dl@NO\expandafter\endnewsegment\fi + \enddljs + \write@objs + \endjs@verbatimwrite + \closejs@verbatim@out + \edef\@dljstmp{\noexpand\AtBeginDocument{% + \noexpand\input{\js@Path\dljsBase.djs}}}% + \@dljstmp + \ifx\importdljs\dl@YES + \ifx\firstdljs\dl@YES +% \end{macrocode} +% 2012/06/09 Changed positioning of \cmd{\setDLJSRef@dvipdfm}. +% \begin{macrocode} + \AtBeginDocument{\setDLJSRef@dvipdfm}% +% \AtEndDocument{\setDLJSRef@dvipdfm} + \global\let\firstdljs\dl@NO + \fi + \fi +} +\catcode`\"=\dl@dquoteCat +%</package> +% \end{macrocode} +% \begin{macrocode} +%<*cc4js> +% \end{macrocode} +%\section{Command Changes for JavaScript}\label{dljscc} +% Regular expressions are a very important part of JavaScript, but they do present +% some problems for \LaTeX. Ideally, we would like to type JavaScript code into the +% \texttt{insDLJS} environment using standard JavaScript syntax. +% (Whether I am successful remains to be seen.) As a result, some new definitions +% and changes in old definitions are necessary. All definitions take place within a +% group, so they are unknown outside the \texttt{insDLJS} environment. +% +%\subsection{Regular Expressions} +% Regular expressions can be constructed in two ways, by using (1) a literal text format; or (2) +% using the \texttt{RegExp} constructor function. The literal text format: +%\begin{flushleft} +%\texttt/\textsl{pattern}\texttt/\textsl{flags} +%\end{flushleft} +% The \texttt{RegExp} constructor method: +%\begin{flushleft}\ttfamily +%new RegExp("\textsl{pattern}" [, "\textsl{flags}"]) +%\end{flushleft} +% For additional details on regular expressions, see +%\begin{flushleft}\small +%\url{http://developer.netscape.com/docs/manuals/js/core/jsref15/regexp.html} +%\end{flushleft} +% There is a further complication when dealing with regular expressions. To quote from the above +% document:\par\medskip\noindent +% \textbf{Description } +% When using the constructor function, the normal string escape rules (preceding special characters with `|\|' when included in a string) are necessary. +% For example, the following are equivalent: +% \begin{flushleft} +% \ttfamily\obeylines +% re = new RegExp("\string\\w+") +% re = /\string\w+/ +%\end{flushleft} +%\subsection{Begin Definitions} +% \subsubsection{Handling of Formatting Sequences} +% The macro \cmd{\eqesc} expands to `|\|' in the case of the distiller and to `|\\|' in the +% case of \textsf{pdftex} or \textsf{dvipdfm}. This group of special characters formats the +% output and they require a different definition than most of the others. +% +% The \cs{ckivspace} (``check for space'') macro sees whether the next token is a space, +% if yes, it absorbs it, if not, it replaces it. I implemented this in order to get +% final output identical to the JavaScript. For example, the following is legal JavaScript +%\begin{verbatim} +% var str = "First line.\r\rSkip a line. // (1) +%\end{verbatim} +% This is a problem for \TeX. In order to delimit the macro, \TeX{} users need to write the +% above line as +%\begin{verbatim} +% var str = "First line.\r\r Skip a line. // (2) +%\end{verbatim} +% which then introduces a spurious space into the JavaScript code. The \cs{ckivspace} solves this +% problem, I hope. With the definition of \cs{r} given below, after expansion of the line (2) +% occurs, we have line (1), the space following the second \cs{r} gets absorbed. Note: (2014/05/20) +% I moved this to the main code thread of \textsf{insdljs}. +% \changes{v2.0n}{2014/05/20}{Moved code for \cs{ckivspace} to main code thread of \textsf{insdljs}.} +% \begin{macrocode} +%\def\ckivspace#1{\if\noexpand#1\space\else\expandafter#1\fi} +% \end{macrocode} +% \begin{macro}{\r} +% Matches a carriage return. +% \begin{macrocode} +\def\r{\eqesc r\ckivspace} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\t} +% Matches a tab. +% \begin{macrocode} +\def\t{\eqesc t\ckivspace} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\n} +% Matches a linefeed. +% \begin{macrocode} +\def\n{\eqesc n\ckivspace} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\f} +% Matches a form-feed. +% \begin{macrocode} +\def\f{\eqesc f\ckivspace} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\v} +% Matches a form-feed. +% \begin{macrocode} +\def\v{\eqesc v\ckivspace} +% \end{macrocode} +% \end{macro} +% \subsubsection{Matching a Word Boundary or Not} +% \begin{macro}{\b} +% Matches a word boundary, such as a space. (Not to be confused with |[\b]|, which +% matches a backspace.) +% \begin{macrocode} +\def\b{\eqesc b\ckivspace} +% \end{macrocode} +% \end{macro} +% The next group are all defined in the same way, pretty much. The macro \cmd{\eqesc} expands to `|\|' +% in the case of the distiller options, and to `|\\\|' otherwise. +% \begin{macro}{\B} +% Matches a non-word boundary. +% \begin{macrocode} +\def\B{\eqesc B\ckivspace} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\cX} +% Where X is a letter from A - Z. Matches a control character in a string. Doesn't seem to have +% much use in Acrobat JavaScript, will comment this one out. Usage: \cs{cM} +% \begin{macrocode} +% \def\doAlpha{\do A\do B\do C\do D\do E\do F% +% \do G\do H\do I\do J\do K\do K\do M\do N% +% \do O\do P\do Q\do R\do S\do T\do U\do V\do W\do X\do Y\do Z} +% \def\mkDefns#1{\expandafter\def\csname c#1\endcsname{\eqesc c#1}} +% \let\do=\mkDefns\doAlpha +% \end{macrocode} +% \end{macro} +% \subsubsection{Matching Digits or Not} +% \begin{macro}{\d} +% Matches a digit character. Equivalent to \texttt{[0-9]}. +% \begin{macrocode} +\def\d{\eqesc d\ckivspace} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\D} +% Matches any non-digit character. Equivalent to |[^0-9]|. +% \begin{macrocode} +\def\D{\eqesc D\ckivspace} +% \end{macrocode} +% \end{macro} +%\subsubsection{Matching Whitespaces or Not} +% \begin{macro}{\s} +% Matches a single white space character, including space, tab, form feed, line feed. +% Equivalent to |[\f\n\r\t\u00A0\u2028\u2029]|. +% \begin{macrocode} +\def\s{\eqesc s\ckivspace} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\S} +% Matches a single character other than white space.\newline +% Equivalent to |[^ \f\n\r\t\u00A0\u2028\u2029]|. +% \begin{macrocode} +\def\S{\eqesc S\ckivspace} +% \end{macrocode} +% \end{macro} +%\subsubsection{Matching Alphanumeric Characters or Not} +% \begin{macro}{\w} +% Matches any alphanumeric character including the underscore. Equivalent to |[A-Za-z0-9\_]|. +% \begin{macrocode} +\def\w{\eqesc w\ckivspace} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\W} +% Matches any non-word character. Equivalent to |[^A-Za-z0-9_]|. +% \begin{macrocode} +\def\W{\eqesc W\ckivspace} +% \end{macrocode} +% \end{macro} +% \subsubsection{Handling of Character Codes} +% \begin{macro}{\xXX} +% Matches the character with the code \texttt{XX} (two hexadecimal digits). +% The character with the Latin-1 encoding specified by the two hexadecimal digits \texttt{XX} +% between 00 and FF. For example, \cs{xA9} is the hexadecimal sequence for the copyright +% symbol. +%\begin{flushleft} +%\textbf{Usage} +%\begin{verbatim} +%\x9A +%\end{verbatim} +%if the most significant digit is a number \texttt{[0-9]}, +%\begin{verbatim} +%\x A9 +%\end{verbatim} +%if the most significant digit is a letter \texttt{[a-fA-F]} +%\end{flushleft} +%\changes{v2.3b}{2016/10/13}{JPC reported bug with French-Babel, traced it to this code.} +%To avoid a French-Babel clash (reported by JPC), we change \cs{catcode} of colon (:) to other, enclose in a group +%and do \cs{xdef} instead of \cs{edef}. +% \begin{macrocode} +\begingroup +\catcode`\:=12\relax +\dljstfor\dlhex:={AA}{AB}{AC}{AD}{AE}{AF}% + {BA}{BB}{BC}{BD}{BE}{BF}{CA}{CB}{CC}{CD}{CE}{CF}% + {DA}{DB}{DC}{DD}{DE}{DF}{EA}{EB}{EC}{ED}{EE}{EF}% + {FA}{FB}{FC}{FD}{FE}{FF}\do{% + \expandafter\xdef\csname x\dlhex\endcsname{\noexpand\eqesc x\dlhex}% +} +\endgroup +% \end{macrocode} +% \end{macro} +% \begin{macro}{\uXXXX} +% In a regular expression search, \cs{uXXXX} matches the character +% with unicode character code \texttt{XXXX} (four hexadecimal +% digits). For example, \cs{u00A9} is the Unicode sequence for the +% copyright symbol. See Unicode Escape Sequences. http://www.unicode.org +%\begin{flushleft} +%\textbf{Usage} +%\begin{verbatim} +%\u00A9 +%\end{verbatim} +%if the most significant digit is a number \texttt{[0-9]}, +%\begin{verbatim} +%\u F0A9 +%\end{verbatim} +%if the most significant digit is a letter \texttt{[a-fA-F]} +%\end{flushleft} +% \begin{macrocode} +\def\u{\eqesc u\ckivspace} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\XXX} +% The character with the Latin-1 encoding specified by up to three octal digits \texttt{XXX} between +% 0 and 377. For example, \cs{251} is the octal sequence for the copyright symbol. +% +% Since this goes only up to octal 377, it suffices to make only the following four definitions. +% \begin{macrocode} +\def\0{\eqesc0} +\def\1{\eqesc1} +\def\2{\eqesc2} +\def\3{\eqesc3} +% \end{macrocode} +% \end{macro} +%\subsubsection{Other Special Characters} +% \begin{macro}{braces} +% Braces are a problem when they are unbalanced. In a regular expression, |\{| works properly, but |\\{| works +% for the distiller options but not otherwise. For example, if I wanted to replace every instance +% of \texttt{\{} with \texttt{(}, we can do this by +%\begin{verbatim} +% myString = myString.replace( /\{/, "\("); +%\end{verbatim} +% This works for all options, even though the braces are not balanced. However, when the constructor +% function is used, we must double-escape: +%\begin{verbatim} +% var re = new RegExp("\\{", "g"); +% myString = myString.replace( re, "\("); +%\end{verbatim} +% This works for the distiller options, but not for \texttt{pdftex/dvipdfm}. The reason |\{| works is that +% it is a control sequence, defined by the \cmd{\definebraces} command below. Where as |\\{| consists +% of the control sequence |\\|, which is defined below, followed by a left brace. +% \TeX{} still requires the braces to be balanced. +% +% If you are searching for balanced braces, there should't be a problem, for example, +% the code +%\begin{verbatim} +% var re = new RegExp("\\{|\\}", "g"); +% myString = myString.replace( re, "\("); +%\end{verbatim} +% works correctly. +% +% To continue the discussion of the problem with searching for +% unbalanced braces, one workaround is to balance out the left +% brace with a right brace in the form of a JavaScript comment. +% This ``fools'' \TeX! For example, +%\begin{verbatim} +% var re = new RegExp("\\{", "g"); // } +% myString = myString.replace( re, "\("); +%\end{verbatim} +% Finally, we have\par\medskip +% \noindent\textbf{The Recommended Workaround:} Use |\\\{| and |\\\}|, e.g., +%\begin{verbatim} +% var re = new RegExp("\\\{", "g"); +% myString = myString.replace( re, "\("); +%\end{verbatim} +% This is more verbose than needed, but it works for all options! These comments are only for regular expression +% strings within the constructor function. Note the replacement text, |\(|, is only escaped. +% +% Here we make the definitions for left and right braces. See the definition of \cs{definebraces} +% given earlier. +% \begin{macrocode} +\definebraces +% \end{macrocode} +% \end{macro} +% \begin{macro}{parentheses} +% Just as braces can give us problems with \TeX, so too, parentheses can give us problems with +% Acrobat JavaScript interpreter. There seems to be a requirement that parentheses be balanced +% unless they are properly escaped. Generally, we have no problems in the case of distiller options, +% once again \textsf{pdftex} and \textsf{dvipdfm} are causing (me) problems. +% +% No problems when the regular expression uses the literal string format +%\begin{verbatim} +% myString = myString.replace(/\(/g, "\["); +%\end{verbatim} +% The above code works for all options. However, for the constructor function we have some problems +% in non-distiller options. If we type instead +%\begin{verbatim} +% var re = new RegExp("\\(", "g"); +% myString = myString.replace(re, "\["); +%\end{verbatim} +% The above code works for the distiller folks, but not for the +% others. In the case of \textsf{pdftex}, I cannot access the UI to +% the document level JavaScripts, and the script is undefined. I suspect +% the lack of balanced parentheses is the curprit. For example, +% consider the code +%\begin{verbatim} +% var re = new RegExp("\\(|\\)", "g"); +% myString = myString.replace(re, "\["); +%\end{verbatim} +% works. I can access the UI to the DLJS from Acrobat, and the script is defined. Another +% example, we can fool the JavaScript interpreter as we did the \TeX{} compiler: +%\begin{verbatim} +% var re = new RegExp("\\(", "g"); // ) +% myString = myString.replace(re, "\["); +%\end{verbatim} +% Here I have placed a balancing right parenthesis as a JavaScript comment. Both sets of code +% work correctly. +%\par\medskip +%\noindent\texttt{Recommended Workaround:} As in the case of parentheses, a more verbose version +% of the script works of all options. +%\begin{verbatim} +% var re = new RegExp("\\\(", "g"); +% myString = myString.replace(re, "\["); +%\end{verbatim} +% This is only for the case of the constructor function. +% \begin{macrocode} +\def\({\eqesc\eqesci(} +\def\){\eqesc\eqesci)} +% \end{macrocode} +% \end{macro} +% The rest of these definitions are for characters that have a +% special meaning when they appear in a regular expression. See +%\begin{flushleft}\small +%\url{http://developer.netscape.com/docs/manuals/js/core/jsref15/regexp.html} +%\end{flushleft} +% for a description of the meaning for the special characters given below (and above). +% To ``escape'' the special meaning of any character, ``escape'' them. +% \begin{macrocode} +\def\.{\eqesc.} +\def\/{\eqesc/} +\def\[{\eqesc[} +\def\]{\eqesc]} +% \end{macrocode} +% \begin{macrocode} +\def\|{\eqesc|} +\def\+{\eqesc+} +\def\*{\eqesc*} +\def\-{\eqesc-} +\def\?{\eqesc?} +\def\${\eqesc$} +\def\^{\eqesc^} +\def\\{\eqesc\eqesc} +% \end{macrocode} +% The next group of characters have no special meaning in a regular expression, but are using elsewhere +% in JavaScript. These definitions may come in handy. +% \begin{macrocode} +\def\'{\eqesc'} +% \end{macrocode} +% The \texttt{german} package makes doublequotes, |"|, active, so within the \texttt{insDLJS} +% environment, we change its catcode to 12. +% \begin{macrocode} +\catcode`\"=12 +\def\"{\eqesc"} +% \end{macrocode} +% We de-activate angle brackets. +% \begin{macrocode} +\catcode`\<=12 +\def\<{\eqesc<} +\catcode`\>=12 +\def\>{\eqesc>} +% \end{macrocode} +% Here, we define `\texttt{\%}' differently. The percent has no special meaning in regular expressions, +% but is used by the \texttt{util.printf()} method. +% \begin{macrocode} +\catcode`\%=12 +\def\%{%} +\catcode`\%=14 +% \end{macrocode} +% The `and' symbol has not special meaning for regular expressions, but is used as a logical `and'. +% Probably don't need this escape. +% \begin{macrocode} +\catcode`\& = 12 +\def\&{\eqesc&} +% \end{macrocode} +% \begin{macrocode} +%</cc4js> +% \end{macrocode} +% \begin{macrocode} +%<*altadbfncs> +% \end{macrocode} +% \section{Alternate names for some Adobe functions}\label{s:AltAdbFncs} +% (2017/03/02) Added alternate names for some common Adobe functions. Used for +% creating custom keystroke and formatting events. +% \changes{v2.3f}{2017/03/02}{Alternate names for Adobe functions added} +% \begin{macrocode} +\begin{insDLJS}{altadbfncs}{eforms: Alternate Adobe Function Names} +var EFNumber_Keystroke=AFNumber_Keystroke; +var EFNumber_Format=AFNumber_Format; +var EFPercent_Keystroke=AFPercent_Keystroke; +var EFPercent_Format=AFPercent_Format; +var EFDate_Format=AFDate_Format; +var EFDate_Keystroke=AFDate_Keystroke; +var EFDate_FormatEx=AFDate_FormatEx; +var EFTime_Keystroke=AFTime_Keystroke; +var EFTime_Format=AFTime_Format; +var EFTime_FormatEx=AFTime_FormatEx; +var EFDate_KeystrokeEx=AFDate_KeystrokeEx; +var EFSpecial_Keystroke=AFSpecial_Keystroke; +var EFSpecial_Format=AFSpecial_Format; +var EFSpecial_KeystrokeEx=AFSpecial_KeystrokeEx; +var EFRange_Validate=AFRange_Validate; +var EFRange_Validate=AFRange_Validate; +var EFSimple_Calculate=AFSimple_Calculate; +var EFMergeChange=AFMergeChange; +\end{insDLJS} +%</altadbfncs> +% \end{macrocode} +% \begin{macrocode} +%<*package> +\inputAltAdbFncs +%</package> +% \end{macrocode} +% \Finale +%\endinput |