% \iffalse %<*copyright> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% eForms package, 2004-3-15 %% %% Copyright (C) 2002-2004 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. %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % %\NeedsTeXFormat{LaTeX2e} %\ProvidesPackage{eforms} % [2006/10/03 v1.0a Provides general eForms support (dps)] %<*driver> \documentclass{ltxdoc} \usepackage[dviwindo,colorlinks,hyperindex]{hyperref} \pdfstringdefDisableCommands{\let\\\textbackslash} \OnlyDescription \EnableCrossrefs \CodelineIndex \begin{document} \GetFileInfo{eforms.sty} \title{eForm: PDF Form support for \LaTeX} \author{D. P. Story\\ Email: \texttt{dpstory@uakron.edu}} \date{processed \today} \maketitle \tableofcontents \let\Email\texttt \DocInput{eforms.dtx} \PrintIndex \end{document} % % \fi % % \MakeShortVerb{|} % % \DoNotIndex{\def,\edef,\gdef,\xdef,\global,\long,\let} % \DoNotIndex{\expandafter,\string,\the,\ifx,\else,\fi} % \DoNotIndex{\csname,\endcsname,\relax,\begingroup,\endgroup} % \DoNotIndex{\DeclareTextCommand,\DeclareTextCompositeCommand} % \DoNotIndex{\space,\@empty,\special} % % \begin{macrocode} %<*package> % \end{macrocode} % \section{Introduction} % This {\LaTeX} code was a part of the \textsf{exerquiz} package. I decided it would be useful % to others if I separated the two and make the forms part of \textsf{exerquiz} into a separate % package. The \textsf{eForms} Package is now a part of the {Acro\TeX} eDucation Bundle and is % called by \textsf{exerquiz}, but it is now a stand alone package for others who may want to % use PDF form fields and JavaScript interactivity. % % \section{Package Options} % The package options consist mostly of driver options. % \subsection{Driver Options} % The \textsf{web} package passes these driver options to \textsf{exerquiz}. % These options are needed is \textsf{exerquiz} is used without % \textsf{web}; in this case, the options below must explicitly included. % Set the driver dependent code for the |quiz| environments. % \begin{macro}{dvipsone} % Set the driver for \texttt{dvipsone} % \begin{macrocode} \DeclareOption{dvipsone}{\def\eq@drivernum{0}% \PassOptionsToPackage{dvipsone}{insdljs} \PassOptionsToPackage{dvipsone}{hyperref} } % \end{macrocode} % \end{macro} % \begin{macro}{dvips} % Set the driver for \texttt{dvips} % \begin{macrocode} \DeclareOption{dvips}{\def\eq@drivernum{0}% \PassOptionsToPackage{dvips}{insdljs} \PassOptionsToPackage{dvips}{hyperref} } % \end{macrocode} % \end{macro} % \begin{macro}{pdftex} % Set the driver for \texttt{pdftex} % \begin{macrocode} \DeclareOption{pdftex}{\def\eq@drivernum{1}% \def\eq@driver{pdftex}\def\eq@drivercode{epdftex.def} \PassOptionsToPackage{pdftex}{insdljs} \PassOptionsToPackage{pdftex}{hyperref} } % \end{macrocode} % \end{macro} % \begin{macro}{dvipdfm} % Set the driver for \texttt{dvipdfm} % \begin{macrocode} \DeclareOption{dvipdfm}{\def\eq@drivernum{2}% \def\eq@driver{dvipdfm}\def\eq@drivercode{edvipdfm.def} \PassOptionsToPackage{dvipdfm}{insdljs} \PassOptionsToPackage{dvipdfm}{hyperref} } % \end{macrocode} % \end{macro} % \begin{macro}{textures} % This option, and testing are due to Ross Moore 3/6/02 % \begin{macrocode} \DeclareOption{textures}{\def\eq@drivernum{3}% \def\eq@driver{textures}\def\eq@drivercode{epdfmark.def}% \PassOptionsToPackage{textures}{insdljs}% \PassOptionsToPackage{textures}{hyperref} } % \end{macrocode} % \end{macro} % \begin{macro}{dviwindo} % Set \cmd{\eq@noformstrue}, this inserts an \cmd{\endinput} just after % the end of the |exercise| environment. No quizzes for % \texttt{dviwindo}. % \begin{macrocode} %\DeclareOption{dviwindo}{\def\eq@drivernum{4}\def\eq@driver{dviwindo}% % \PassOptionsToPackage{nodljs}{insdljs} % \PassOptionsToPackage{dviwindo}{hyperref}} % \end{macrocode} % \end{macro} % If no driver is passed, assume it is % dvipsone or dvips---\textsf{hyperref} defines the specials. % Default driver dvipsone/dvips % \begin{macrocode} % \def\eq@drivernum{0} \def\eq@driver{dvipsone/dvips} \def\eq@drivercode{epdfmark.def} % \end{macrocode} % \subsection{Other Options} % \begin{macro}{preview} % The preview option displays the bounding box of each form field with a frame box. % Useful for laying out field with a dvi previewer. % \begin{macrocode} \DeclareOption{preview}{\previewtrue} \DeclareOption*{\PassOptionsToPackage{\CurrentOption}{insdljs}} \newif\ifpreview \previewfalse % \end{macrocode} % \end{macro} % \begin{macrocode} \ProcessOptions \RequirePackage{hyperref} \RequirePackage{insdljs} % \end{macrocode} % \changes{v1.0a}{2006/10/03} % { % If exerquiz is not loaded, we do an automatic begin and end of Form. % Also, if exerquiz is loaded, then we use the driver declared in exerquiz; % otherwise, we set the default to 0 (dvipsone/dvips). % } % If exerquiz is not loaded, we insert \verb!\begin{Form}! and \verb!\end{Form}!, % and if undefined, we set the default driver. % \begin{macrocode} \@ifpackageloaded{exerquiz}{}{% \AtBeginDocument{\begin{Form}} \AtEndDocument{\end{Form}} } \@ifundefined{eq@drivernum}{% \PackageError{eForms}% {You have not specified dvips, dvipsone, pdftex or dvipdfm \MessageBreak in the option list of the eforms package} {Place one of the driver names dvips, dvipsone, pdftex or dvipdfm \MessageBreak in the option list of the eforms package.} }{} % \end{macrocode} % \begin{macrocode} % % \end{macrocode} % When the \texttt{preview} option is used, draw a frame box % around the \textit{inner} bounding rectangle. % \begin{macrocode} %<*package> %\newsavebox{\eq@tmpbox} \@ifundefined{eq@tmpbox}{\newsavebox{\eq@tmpbox}}{} \@ifundefined{eq@tmpdima}{\newdimen\eq@tmpdima}{} %\newdimen\eq@tmpdima \def\Bbox#1#2{% \hbox{\ifpreview\setlength\fboxrule{0.4pt}\setlength\fboxsep{0pt}% \@tempdima=#1\advance\@tempdima by-\fboxrule \@tempdimb=#2\advance\@tempdimb by-\fboxrule \fbox{\parbox[b][\@tempdimb][c]{\@tempdima}{\hfill\vfill}}\else \parbox[b][#2][c]{#1}{\hfill\vfill}\fi}% } % % \end{macrocode} % \section{eForms Support} % \begin{macrocode} %<*package> % \end{macrocode} % Listed below are the various types of form objects available in PDF. %\begin{flushleft} %\hyperref[button]{Button} : \hyperref[pushbutton]{Push buttons}, % \hyperref[checkbox]{Check boxes}, % \hyperref[radiobutton]{Radio Buttons}\\ %\hyperref[textfield]{Text Fields}\\ %\hyperref[choice]{Choice Fields}: \hyperref[listbox]{list box}, % \hyperref[combobox]{combo box}\\ %Signature fields (not supported by Acro\TeX)\\ %\end{flushleft} % % The following macro, \cs{processAppArgs}, is due in part to % Dan Luecking. He proposed a very nice modification of my original % macros. % % The macro \cmd{\processAppArgs} takes an \textit{even} number of arguments; it % picks off two at a time, processes them, then picks off two more. The macro is meant to % process the optional arguments of a form field. % % All legal arguments (see \nameref{eformvariables} for a detailed % listing of the legal arguments) are of the form \verb+\name{arg}+. % The macro takes two tokens at a time and constructs a macro % \verb+\@eqname{arg}+. Each of the macros \verb+\eqname+ must be % defined. Such a macro defines another macro as follows % \verb+\def\eq@name{arg}+. For example if the user enters the token % pair \verb+\RC{Users}+, \cmd{\processAppArgs} will construct % \verb+\@eqRC+, with argument \verb+{arg}+, this macro will be % executed, which expands to \verb+\def\eq@RC{arg}+. The macro % \cmd{\eq@RC} may then be used within the construction of the % widget object. % % The macro \cs{processAppArgs} also does the addition operation for % \texttt{/F} and \texttt{/Ff} keys. % \begin{macrocode} \def\processAppArgs#1#2{% \ifx\end#1% if #1=\end, #2=\@nil. \let\@next=\relax \else % \end{macrocode} % If a token has a value of \cs{@empty} then it has been protected. It is skipped % and there is no user redefinition of that form field attribute allowed. Normally, % this is done for \cs{A} and \cs{AA} to prevent overwriting critical functionality. % \begin{macrocode} \ifx#1\@empty \def\@next{\processAppArgs}% \else \@getCmdName{\Ff}\edef\arg@Ff{\@CmdName}% \@getCmdName{#1}% \ifx\arg@Ff\@CmdName % if \Ff, let's add arguments \ifx\eq@Ff\@empty\def\eq@FfValue{0}\else \expandafter\getFfValue\eq@Ff\@nil\fi \@tempcnta = \eq@FfValue \def\eq@arg{#2}% \ifx\eq@arg\@empty\else \advance\@tempcnta by#2\fi \edef\eq@Ff{/Ff \the\@tempcnta}% \def\@next{\processAppArgs}% \else \@getCmdName{\F}\edef\arg@F{\@CmdName}% \@getCmdName{#1}% \ifx\arg@F\@CmdName % if \Ff, let's add arguments \ifx\eq@F\@empty\def\eq@FValue{0}\else \expandafter\getFValue\eq@F\@nil\fi \@tempcnta = \eq@FValue \def\eq@arg{#2}% \ifx\eq@arg\@empty\else \advance\@tempcnta by#2\fi \edef\eq@F{/F \the\@tempcnta}% \def\@next{\processAppArgs}% \else \csname @eq% \expandafter\@gobble\string#1\endcsname{#2}% \def\@next{\processAppArgs}% \fi \fi \fi \fi \@next } % \end{macrocode} % Process the field defaults and the `every' changes. Build up the required command % in a token list, then execute. % \begin{macrocode} \def\@processEvery{\edef\eqtemp{}\toks0={}\@@processEvery} \def\@@processEvery#1{% \ifx#1\end\def\@next{\the\toks0 }% \else \edef\eqtemp{\the\toks0 }% \toks0=\expandafter{\eqtemp \expandafter\processAppArgs#1\end\@nil}% \def\@next{\@@processEvery}% \fi \@next } % \end{macrocode} % \begin{macrocode} \newdimen\eqcenterWidget % \end{macrocode} % This macro is used to vertically center text fields and buttons on a % line. Seems to work well. % \begin{macrocode} \def\centerWidget#1{% \eqcenterWidget=#1\relax \eqcenterWidget=.5\eqcenterWidget \advance\eqcenterWidget by -4bp } % \end{macrocode} % \subsection{eForm Variables}\label{eformvariables} % % \subsubsection{Key-Value Definitions} % % The following definitions are used in various field templates. % Some convenience macros to help define the button attributes. The default % values are defined within the button macros themselves. Use these macros % within the optional argument of buttons and text fields to modify their % appearance. % % You'll notice, for example, the macros listed are not actually defined. For example % \cmd{\CA} is never actually defined; we define instead \cmd{\@eqCA} and \cmd{\eq@CA}. % The macros \cmd{\processAppArgs} treats \cmd{\CA} as a token, and prefixes with % \texttt{@eq} in a clever sort of way. It's done so that these macros cannot be used % outside the optional macro arguments of the button and text field macros. % % \medskip\noindent\textbf{Entries common to all annotation dictionaries:} % \texttt{F, BS, Border, AP, AS, T, A, AA}. % % \medskip\noindent\textsl{Annotation Flag Bit Field:} See \nameref{F} for values. % \begin{macrocode} \def\@eqF#1{\def\eq@arg{#1}\ifx\eq@arg\@empty \let\eq@F=\@empty\else\def\eq@F{/F #1}\fi}\def\eq@F{} % BS = Border Style: W, S, D (dictionary, optional) % \def\@eqBS#1{\def\eq@BS{#1}} % deprecated \def\@eqW#1{\def\eq@arg{#1}\ifx\eq@arg\@empty \let\eq@W=\@empty\else\def\eq@W{/W #1}\fi} \def\eq@W{} \def\@eqS#1{\def\eq@arg{#1}\ifx\eq@arg\@empty \let\eq@S=\@empty\else\def\eq@S{/S/#1}\fi} \def\eq@S{} % Link keys \def\@eqBorder#1{\def\eq@arg{#1}\ifx\eq@arg\@empty \let\eq@Border=\@empty\else\def\eq@Border{/Border [#1]}\fi}% \def\eq@Border{/Border [0 0 0]} \def\@eqAP#1{\def\eq@arg{#1}\ifx\eq@arg\@empty \let\eq@AP=\@empty\else\def\eq@AP{/AP<<#1>>}\fi}% \def\eq@AP{} % In the AP dictionary for checkboxes is the `On' value. % It is introduced into AP by passing a TeX parameter % normally, this variable is not used. \def\@eqOn#1{\def\eq@On{/#1}}\def\eq@On{/Yes} \def\@eqAS#1{\def\eq@arg{#1}\ifx\eq@arg\@empty \let\eq@AS=\@empty\else\def\eq@AS{/AS/#1}\fi}% \def\eq@AS{} \def\@eqA#1{\def\eq@arg{#1}\ifx\eq@arg\@empty \let\eq@A=\@empty\else\def\eq@A{/A <<#1>>}\fi}\def\eq@A{} \def\@eqAA#1{\def\eq@arg{#1}\ifx\eq@arg\@empty \let\eq@AA=\@empty\else\def\eq@AA{/AA <<#1>>}\fi}\def\eq@AA{} %dps Need to define the keys for the AA dictionary: U, D, E, X, Fo, Bl, F, K, V, C % Note: F is already defined as another key. % \end{macrocode} % \textbf{Additional entries common to fields containing variable text:} \texttt{DR, DA, Q, % DS, RV}. % \begin{macrocode} % DA = Default appearance: (required) \def\@eqDA#1{\def\eq@DA{#1}} \def\eq@DA{\eq@textFont\space\eq@textSize\space Tf \eq@textColor}% % PDF form font \def\@eqtextFont#1{\def\eq@textFont{/#1}} \def\eq@textFont{/Helv} % PDF form text size \def\@eqtextSize#1{\def\eq@textSize{#1}} \def\eq@textSize{9} % Rich text value \def\@eqRV#1{\def\eq@arg{#1}\ifx\eq@arg\@empty \let\eq@RV=\@empty\else\def\eq@RV{/RV(#1)\fi}}\def\eq@RV{} % Rich text default style \def\@eqDS#1{\def\eq@arg{#1}\ifx\eq@arg\@empty \let\eq@DS=\@empty\else\def\eq@DS{/DS(#1)\fi}}\def\eq@DS{} % text color \def\@eqtextColor#1{\def\eq@textColor{#1}} \def\eq@textColor{0 g} % quadding for text fields: Q=0 left-justified, Q=1 centered % Q=2 right-justified % rich strings: DS and RV -- not supported at this time \def\@eqQ#1{\def\eq@arg{#1}\ifx\eq@arg\@empty \let\eq@Q=\@empty\else\def\eq@Q{/Q #1}\fi}\def\eq@Q{} % \end{macrocode} % \textbf{Entries common to all fields:} \texttt{TU, Ff, V, DV, A, AA} % \begin{macrocode} % DV = default value (optional) value field reverts to when field is reset \def\@eqDV#1{\def\eq@arg{#1}\ifx\eq@arg\@empty \let\eq@DV=\@empty\else\def\eq@DV{/DV(#1)}\fi} \def\eq@DV{} % Unicoded DV \def\@equDV#1{\def\eq@arg{#1}\ifx\eq@arg\@empty \let\eq@DV=\@empty\else\def\eq@DV{/DV<#1>}\fi} % V = field value (optional) \def\@eqV#1{\def\eq@arg{#1}\ifx\eq@arg\@empty \let\eq@V=\@empty\else\def\eq@V{/V(#1)}\fi}% \def\eq@V{} % Unicoded V \def\@equV#1{\def\eq@arg{#1}\ifx\eq@arg\@empty \let\eq@V=\@empty\else\def\eq@V{/V<#1>}\fi}% % tool tip (optional, PDF 1.3) \def\@eqTU#1{\def\eq@arg{#1}\ifx\eq@arg\@empty \let\eq@TU\@empty\else\def\eq@TU{/TU(#1)}\fi} \def\eq@TU{} % tool tip, unicode version \def\@equTU#1{\def\eq@arg{#1}\ifx\eq@arg\@empty \let\eq@TU\@empty\else\def\eq@TU{/TU<#1>}\fi} % The Field flags bit field, these values are listed below. \def\@eqFf#1{\def\eq@arg{#1}\ifx\eq@arg\@empty \let\eq@Ff=\@empty\else\def\eq@Ff{/Ff #1}\fi} \def\eq@Ff{} % \end{macrocode} % \textbf{keys specific to text fields:} \texttt{MaxLen} % \begin{macrocode} % text fields only. Restricts number of characters % input. Require if a comb field. \def\@eqMaxLen#1{\def\eq@arg{#1}\ifx\eq@arg\@empty \let\eq@MaxLen=\@empty\else\def\eq@MaxLen{/MaxLen #1}\fi}% \def\eq@MaxLen{} % Highlight, used in text fields and link annotation. Possible values % are None, Push, Outline, Invert (respectively, \H{N}, \H{P}, \H{O}, \H{I}) % The default highlighting is invert (I). \def\@eqH#1{\def\eq@arg{#1}\ifx\eq@arg\@empty \let\eq@H=\@empty\else\def\eq@H{/H/#1}\fi}\def\eq@H{} % \end{macrocode} % \textbf{Appearance characteristics dictionary:} % MK = R, BC, BG, CA, RC, AC, I, % RI, IX, IF, TP % \begin{macrocode} \def\@eqMK#1{\def\eq@arg{#1}\ifx\eq@arg\@empty \let\eq@MK=\@empty\else\def\eq@MK{/MK << #1 >> }\fi}% \def\eq@MK{} % MK dictionary \def\@eqR#1{\def\eq@arg{#1}\ifx\eq@arg\@empty \let\eq@R=\@empty\else\def\eq@R{/R #1}\fi} \def\eq@R{} % Boundary color \def\@eqBC#1{\def\eq@arg{#1}\ifx\eq@arg\@empty \let\eq@BC=\@empty\else\def\eq@BC{/BC [#1]}\fi} \def\eq@BC{} % Background color \def\@eqBG#1{\def\eq@arg{#1}\ifx\eq@arg\@empty \let\eq@BG=\@empty\else\def\eq@BG{/BG [#1]}\fi} \def\eq@BG{} % normal appearance text \def\@eqCA#1{\def\eq@arg{#1}\ifx\eq@arg\@empty \let\eq@CA\@empty\let\ef@kvCA\@empty \else\def\eq@CA{#1}\def\ef@kvCA{/CA(#1)}\fi} \def\eq@CA{}\def\ef@kvCA{} % normal appearance text, unicode version \def\@equCA#1{\def\eq@arg{#1}\ifx\eq@arg\@empty \let\eq@CA\@empty\let\ef@kvCA\@empty \else\def\eq@CA{#1}\def\ef@kvCA{/CA<#1>}\fi} % Roll over text \def\@eqRC#1{\def\eq@arg{#1}\ifx\eq@arg\@empty \let\eq@RC\@empty\let\ef@kvRC\@empty \else\def\eq@RC{#1}\def\ef@kvRC{/RC(#1)}\fi} \def\eq@RC{}\def\ef@kvRC{} % Roll over text, unicode version \def\@equRC#1{\def\eq@arg{#1}\ifx\eq@arg\@empty \let\eq@RC\@empty\let\ef@kvRC\@empty \else\def\eq@RC{#1}\def\ef@kvRC{/RC<#1>}\fi} % Push text \def\@eqAC#1{\def\eq@arg{#1}\ifx\eq@arg\@empty \let\eq@AC\@empty\let\ef@kvAC\@empty \else\def\eq@AC{#1}\def\ef@kvAC{/AC(#1)}\fi} \def\eq@AC{}\def\ef@kvAC{} % Push text, unicode version \def\@equAC#1{\def\eq@arg{#1}\ifx\eq@arg\@empty \let\eq@AC\@empty\let\ef@kvAC\@empty \else\def\eq@AC{#1}\def\ef@kvAC{/AC<#1>}\fi} % Other keys of MK include: I, RI, IX, IF and TP % If I haven't covered everything, use this macro to insert % material into MK \def\@eqmkIns#1{\def\eq@mkIns{#1}}\def\eq@mkIns{} % \end{macrocode} % \textbf{Additional entries specific to choice fields:} \texttt{Opt, TI, I} % \begin{macrocode} % an array of options in the list \def\@eqOpt#1{\def\eq@arg{#1}\ifx\eq@arg\@empty \let\eq@Opt=\@empty\else\def\eq@Opt{/Opt [#1]}\fi} \def\eq@Opt{} % for scrollable list boxes, the top index. \def\@eqTI#1{\def\eq@arg{#1}\ifx\eq@arg\@empty \let\eq@TI=\@empty\else\def\eq@TI{/TI #1}\fi} \def\eq@TI{} % \end{macrocode} % When all else fails, use the \cs{rawPDF} command to modify the widget. % \begin{macrocode} \def\@eqrawPDF#1{\def\eq@rawPDF{#1}}\def\eq@rawPDF{} % \end{macrocode} % \textbf{Specialized, non-PDF Spec, commands} % \begin{macrocode} % Height of a widget \def\@eqrectH#1{\def\eq@rectH{#1}} % Width of a widget \def\@eqrectW#1{\def\eq@rectW{#1}} % autocenter \def\@eqautoCenter#1{\let\autoCenter=#1} \let\autoCenter=y \def\@eqsymbolchoice#1{\expandafter\ifx\csname eq@#1\endcsname\relax \typeout{exerquiz: `#1' is not an acceptable option for \string\symbolechoice, inserting default, `check'.} \edef\symbol@choice{\eq@check}\else \edef\symbol@choice{\csname eq@#1\endcsname}\fi } \def\eq@protect#1{\let#1=\@empty} % \end{macrocode} % \begin{macro}{\DefaultHeightOfWidget} % \begin{macro}{\RBW} % \begin{macro}{\SFW} % \cmd{\DefaultHeightOfWidget} is the default height of all form % fields (except radio fields and checkboxes). \cmd{\RBW} is the % default width of the \cmd{\RespBox}; and \cmd{\SFW} is the % default width of the \cmd{\ScoreField}. Some widgets, such as % buttons have width determined by the width of the text. % \begin{macrocode} \def\tallywidth#1{\def\tally@width{#1}} \def\tally@width{15bp} % \def\DefaultHeightOfWidget{12bp} \def\DefaultHeightOfWidget{11bp} \def\RadioFieldSize{11bp} \def\RBW{2in} \def\SFW{1.5in} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} %\subsection{Symbol Definitions} % Some definitions for radio fields and checkboxes % \begin{macrocode} \def\eq@check{4} \def\eq@circle{l} \def\eq@cross{8} \def\eq@diamond{u} \def\eq@square{n} \def\eq@star{H} % \end{macrocode} % \begin{macro}{\symbolchoice} % Use this macro to change the symbol used in radio and % checkboxes. The default is \cmd{\eq@check}. This macro takes one % argument: permissible values are: check, circle, cross, diamond, % square, and star. The definition of \cs{symbolchoice} is given % above in the definition of \cs{@eqsymbolchoice}. % \begin{macrocode} \let\symbolchoice=\@eqsymbolchoice % \end{macrocode} % Set the default to `check'. % \begin{macrocode} \symbolchoice{check} % \end{macrocode} % \end{macro} %\subsection{Convenience Commands for Writing Actions} % Writing actions for eForms requires certain key-value combinations. The following % commands provides the correct syntax, the code is inserted via the required % argument of each. % \begin{macro}{\JS} % A convenience command for writing JavaScript. % \begin{macrocode} \providecommand\JS[1]{/S/JavaScript/JS(#1)} % \end{macrocode} % \end{macro} % \begin{macro}{\AAMouseUp} % \begin{macro}{\AAMouseDown} % \begin{macro}{\AAMouseEnter} % \begin{macro}{\AAMouseExit} % \begin{macro}{\AAOnFocus} % \begin{macro}{\AAOnBlur} % Some convenient commands for writing actions. All the commands that begin with % \texttt{AA} go into the ``additional actions'' of a field. % \begin{macrocode} \newcommand\AAMouseUp[1]{/U<<#1>>} \newcommand\AAMouseDown[1]{/D<<#1>>} \newcommand\AAMouseEnter[1]{/E<<#1>>} \newcommand\AAMouseExit[1]{/X<<#1>>} \newcommand\AAOnFocus[1]{/Fo<<#1>>} \newcommand\AAOnBlur[1]{/Bl<<#1>>} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \begin{macro}{\AAFormat} % \begin{macro}{\AAKeystroke} % \begin{macro}{\AAValidate} % \begin{macro}{\AACalculate} % These four action events are Javascript only, so we use \cs{JS} % to insert the appropriate code. % \begin{macrocode} \newcommand\AAFormat[1]{/F<<\JS{#1}>>} \newcommand\AAKeystroke[1]{/K<<\JS{#1}>>} \newcommand\AAValidate[1]{/V<<\JS{#1}>>} \newcommand\AACalculate[1]{/C<<\JS{#1}>>} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} %\subsection{Default Colors for Checks, Crosses, and Borders} % \begin{macro}{\checkColor} % \begin{macro}{\crossColor} % \begin{macro}{\correctColor} % \begin{macro}{\wrongColor} % \begin{macro}{\eqDefaultColor} % These five macros are used to define the colors for the checks, % crosses and correct symbols. These are controled by JavaScript, % so use the correct syntax for defining colors here. % \begin{macrocode} \newcommand\checkColor{["RGB", 0, .6, 0]} \newcommand\crossColor{color.red} \newcommand\correctColor{["RGB", 0, .6, 0]} % same as webgreen \newcommand\wrongColor{color.red} \newcommand\eqDefaultColor{color.black} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \subsubsection{Annotation Flag \texttt{/F} Definitions}\label{F} % % \begin{macrocode} \def\FHidden{2} % bit 2: hidden field \def\FPrint{4} % bit 3: print \def\FNoView{32} % bit 6: no view \def\FLock{128} % bit 8: locked field (PDF 1.4) % \end{macrocode} %\textbf{Notes:}\par %\noindent\begin{tabular}{ll} % Visible (and printable) &|\F\FPrint|\\ %Hidden but printable &|\F\FNoView\F\FPrint|\\ %Visible but doesn't print &|\F{}|\\ %Hidden (and does not print) &|\F\FHidden\F\FPrint| %\end{tabular} % %\subsubsection{Field Flags /Ff Definitions}\label{Ff} % \begin{macrocode} \def\FfReadOnly{1} % all \def\FfRequired{2} % all \def\FfNoExport{4} % all \def\FfMultiline{4096} % text \def\FfPassword{8192} % text \def\FfNoToggleToOff{16384} % radio \def\FfRadio{32768} % radio \def\FfPushButton{65536} % Pushbuton \def\FfCombo{131072} % choice \def\FfEdit{262144} % combo \def\FfSort{524288} % choice \def\FfFileSelect{1048576} % text (PDF 1.4) \def\FfMultiSelect{2097152} % choice (PDF 1.4) \def\FfDoNotSpellCheck{4194304} % text, combo (PDF 1.4) \def\FfDoNotScroll{8388608} % text (PDF 1.4) \def\FfComb{16777216} % text (PDF 1.5) \def\FfRadiosInUnison{33554432} % radio (PDF 1.5) \def\FfCommitOnSelChange{67108864} % choice (PDF 1.5) \def\FfRichText{33554432} % radio (PDF 1.5) % \end{macrocode} % The keys \texttt{/F} and \texttt{/Ff} will be additive, that is, % for example, \verb+\F\FHidden\F\FPrint+ will get \texttt{/F 6}, % a field that is both printable and hidden. These are the only % flags that are additive this way. The following to macros % are supportive of the additivity. % \begin{macrocode} \def\getFfValue/Ff#1\@nil{\def\eq@FfValue{#1}} \def\getFValue/F#1\@nil{\def\eq@FValue{#1}} \def\@getCmdName#1{\edef\@CmdName{\expandafter\@gobble\string#1}} % \begin{macrocode} \newcommand\everyTextField[1]{\def\every@TextField{#1}} \def\every@TextField{} % \end{macrocode} % Here, you can control the appearance of all the standard checkboxes, also % effects radio fields of shortquiz and quiz. % \begin{macrocode} \newcommand\everyCheckBox[1]{\def\every@CheckBox{#1}} \def\every@CheckBox{} %\newcommand\everysqCheckBox[1]{\def\every@sqCheckBox{#1}} %\def\every@sqCheckBox{} %\newcommand\everyqCheckBox[1]{\def\every@qCheckBox{#1}} %\def\every@qCheckBox{} % \newcommand\everyRadioButton[1]{\def\every@RadioButton{#1}} \def\every@RadioButton{} % \end{macrocode} % Here, you can control the appearance of all the standard buttons. % \begin{macrocode} \newcommand\everyButtonField[1]{\def\every@ButtonField{#1}} \def\every@ButtonField{} %\let\everyButtonField=\everyeqButtonField \newcommand\everyPushButton[1]{\def\every@PushButton{#1}} \def\every@PushButton{} % Replace everyeqGenButten with everyPushButton %\newcommand\everyeqIcon[1]{\def\every@eqIcon{#1}} %\def\every@eqIcon{} \newcommand\everyListBox[1]{\def\every@listBox{#1}} \newcommand\everyComboBox[1]{\def\every@comboBox{#1}} \def\every@listBox{}\def\every@comboBox{} \newcommand\everyLink[1]{\def\every@Link{#1}} \def\every@Link{} \def\makeJSspecials {% \def\\{\eqbs\eqbs}% % define \\ to be \\ \makespecialJS % make \r=\jsR and \t=\jsT } % \end{macrocode} % \begin{macro}{\eq@setButtonProps} % This macro measure the width of the largest text on defined for the % button, and then passes the this info on to a driver specific macro % \#1, the first parameter. %\begin{verbatim} % #1 is the driver specific macro to build the button widget % #2 are the button properties %\end{verbatim} % \subsection{Set Field Properties} % \begin{macrocode} \def\eq@setButtonProps#1#2% {% \makeJSspecials \processAppArgs#2\end\@nil % set widget properties \Hy@pdfstringfalse \ifx\eq@rectW\@empty \sbox{\eq@tmpbox}{\ \eq@CA\ }\eq@tmpdima=\wd\eq@tmpbox \sbox{\eq@tmpbox}{\ \eq@RC\ }% \ifdim\eq@tmpdima>\wd\eq@tmpbox\else\eq@tmpdima=\wd\eq@tmpbox\fi% \sbox{\eq@tmpbox}{\ \eq@AC\ }% \ifdim\eq@tmpdima>\wd\eq@tmpbox\else\eq@tmpdima=\wd\eq@tmpbox\fi% \wd\eq@tmpbox = \eq@tmpdima \else \wd\eq@tmpbox=\eq@rectW \fi #1% } % \end{macrocode} % \end{macro} % Same as \cmd{\eq@setButtonProps} but does not measure the width of the % field. Simply lays in the optional parameters that modify the appearance % then calls the driver specific macro to build the widget. %\begin{verbatim} % #1 is the driver specific macro to build the widget % #2 are the widget properties %\end{verbatim} % \begin{macrocode} \def\eq@setWidgetProps#1#2% {% \makeJSspecials \processAppArgs#2\end\@nil % set widget properties #1% } % \end{macrocode} % \subsection{Choice Fields}\label{choice} % % This is the form template used for all choice fields, list box and combo box. % \begin{macrocode} \def\common@choiceCode {% /Subtype /Widget /T (\Fld@name) /FT /Ch \eq@Ff \eq@F \eq@TU \eq@TI /BS << \eq@W\eq@S >> /MK <<\eq@R\eq@BC\eq@BG\eq@mkIns>> /DA (\eq@DA) /Opt [\eq@Opt] \eq@DV\eq@V \eq@A\eq@AA \eq@rawPDF } % \end{macrocode} % \subsubsection{List Box}\label{listbox} % The main list box code that can be used to build list box commands, such as % \cs{listBox}, defined below. % \begin{macrocode} \newcommand\list@@Box[8] {% \begingroup \edef\Fld@name{#2}\def\eq@rectW{#3}\def\eq@rectH{#4}\def\eq@Opt{#5}% \def\eq@DA{\eq@textFont\space\eq@textSize\space Tf \eq@textColor}% \@processEvery#8\end\noindent#6#7{#1}% } % \end{macrocode} % \begin{macro}{\listBox} %\begin{verbatim} % #1 = optional, used to enter any modification of the appearance/actions % #2 = the title of the list box field % #3 = the width of the bounding rectangle % #4 = the height of the bounding rectangle % #5 = the appearance/values of list. %\end{verbatim} % \begin{macrocode} \def\listBoxDefaults {% \W{1}\S{I}\F{\FPrint}\BC{0 0 0} } \newcommand\listBox[5][] {% \list@@Box{#1}{#2}{#3}{#4}{#5}{}{\eq@setWidgetProps \eq@choice@driver}{\listBoxDefaults\every@listBox}% } % \end{macrocode} % \end{macro} % \subsubsection{Combo Box}\label{combobox} % \begin{macrocode} \newcommand\combo@@Box[8] {% \begingroup \@eqFf{\FfCombo}\edef\Fld@name{#2}\def\eq@rectW{#3}% \def\eq@rectH{#4}\def\eq@Opt{#5}% \def\eq@DA{\eq@textFont\space\eq@textSize\space Tf \eq@textColor}% \@processEvery#8\end\noindent#6#7{#1}% } % \end{macrocode} % \begin{macro}{\comboBox} % A general combo box command. %\begin{verbatim} % #1 = optional, used to enter any modification of the appearance/actions % #2 = the title of the radio field % #3 = the width of the bounding rectangle % #4 = the height of the bounding rectangle % #5 = the appearance/values of list. %\end{verbatim} % \begin{macrocode} \def\comboBoxDefaults {% \W{1}\S{I}\F{\FPrint}\BC{0 0 0} } \newcommand\comboBox[5][] {% \combo@@Box{#1}{#2}{#3}{#4}{#5}{}{\eq@setWidgetProps \eq@choice@driver}{\comboBoxDefaults\every@comboBox}% } % \end{macrocode} % \end{macro} % \subsection{Button Fields}\label{button} % Here is the field template for push button fields. % \begin{macrocode} \def\common@pushButtonCode {% /Subtype /Widget /T (\Fld@name) /FT /Btn \eq@Ff \eq@TU \eq@H \eq@F /BS <<\eq@W\eq@S >> /MK <<\eq@R\eq@BC\eq@BG% \ef@kvCA\ef@kvRC\ef@kvAC\eq@mkIns>> % /CA(\eq@CA)/RC(\eq@RC)/AC(\eq@AC)\eq@mkIns>> /DA (\eq@DA) \eq@A\eq@AA \eq@rawPDF } % \end{macrocode} % Here is the field template for check boxes and radio button fields fields. % \begin{macrocode} \def\common@RadioCheckCode {% /Subtype /Widget /T (\Fld@name) /FT /Btn \eq@Ff \eq@F \eq@TU /BS <<\eq@W\eq@S>> \eq@MK /DA (\eq@DA) \eq@AP \eq@AS \eq@DV\eq@V \eq@A\eq@AA \eq@rawPDF } % \end{macrocode} % \subsubsection{Push Button}\label{pushbutton} % Here is the basic command for creating a button field. This is the building block % for all other buttons. % \begin{macrocode} \newcommand\push@@Button[7] {% \begingroup \def\eq@Ff{/Ff \FfPushButton}% \def\eq@DA{\eq@textFont\space\eq@textSize\space Tf \eq@textColor}% \edef\Fld@name{#2}\def\eq@rectW{#3}\def\eq@rectH{#4}% \@processEvery#7\end\noindent#5#6{#1}% } % \end{macrocode} % \begin{macro}{\pushButton} %\begin{verbatim} %#1 = optional, used to enter any modification of the appearance/actions %#2 = the title of the button field %#3 = the width of the bounding rectangle %#4 = the height of the bounding rectangle %\end{verbatim} % \begin{macrocode} \def\pushButtonDefaults {% \W{1}\S{B}\F{\FPrint}\BC{0 0 0} \H{P}\BG{.7529 .7529 .7529} } \newcommand\pushButton[4][] {% \push@@Button{#1}{#2}{#3}{#4}{}{\eq@setButtonProps\eq@Button@driver}% {\pushButtonDefaults\every@PushButton}% } % \end{macrocode} % \end{macro} % \subsubsection{Check Box}\label{checkbox} % The basic command for creating check boxes. % \begin{macrocode} \newcommand\check@@Box[8] {% \begingroup \def\@eqDV##1{\def\eq@arg{##1}\ifx\eq@arg\@empty\let\eq@DV=\@empty \else\def\eq@DV{/DV/##1}\fi}% \def\@eqV##1{\def\eq@arg{##1}\ifx\eq@arg\@empty \let\eq@V=\@empty\else\def\eq@V{/V/##1}\fi}% \edef\Fld@name{#2}\def\eq@rectW{#3}\def\eq@rectH{#4}\def\eq@On{/#5}% \@eqAP{/N <<\eq@On<<>>>> }\@eqtextFont{ZaDb}\@eqAS{Off}% \eq@On <<>>? \space/null \def\eq@DA{\eq@textFont\space\eq@textSize\space Tf \eq@textColor}% \@eqMK{\eq@R\eq@BC\eq@BG/CA(\symbol@choice)\eq@mkIns}% \@processEvery#8\end\noindent#6#7{#1}% } % \end{macrocode} % \begin{macro}{\checkBox} %\begin{verbatim} %#1 = optional, used to enter any modification of the appearance/actions %#2 = the title of the check box field %#3 = the width of the bounding rectangle %#4 = the height of the bounding rectangle %#5 = the 'on value' or export value, the default is "Yes". %\end{verbatim} % \begin{macrocode} \def\checkBoxDefaults {% \F{\FPrint}\W{1}\S{S}\BC{0 0 0} } \newcommand\checkBox[5][] {% \check@@Box{#1}{#2}{#3}{#4}{#5}{}{\eq@setWidgetProps \eq@RadioCheck@driver}{\checkBoxDefaults\every@CheckBox}% } % \end{macrocode} % \end{macro} % \subsubsection{Radio Button}\label{radiobutton} % The basic command for creating radio button fields. % \begin{macrocode} % Basic command for building all radio buttons. % \end{macrocode} % \begin{macrocode} \newcommand\radio@@Button[8] {% \begingroup \def\@eqDV##1{\def\eq@arg{##1}\ifx\eq@arg\@empty\let\eq@DV=\@empty \else\def\eq@DV{/DV/##1}\fi}% \def\@eqV##1{\def\eq@arg{##1}\ifx\eq@arg\@empty\let\eq@V=\@empty \else\def\eq@V{/V/##1}\fi}% \def\eq@Ff{/Ff \FfRadio}\@eqtextFont{ZaDb}\@eqAS{Off}% \def\eq@DA{\eq@textFont\space\eq@textSize\space Tf \eq@textColor}% \@eqAP{/N <<\eq@On<<>>>>}% \eq@On <<>>? /null \@eqMK{\eq@R\eq@BC\eq@BG/CA(\symbol@choice)\eq@mkIns}% \edef\Fld@name{#2}\def\eq@rectW{#3}\def\eq@rectH{#4}\def\eq@On{/#5}% \@processEvery#8\end\noindent#6#7{#1}% } % \end{macrocode} % \begin{macro}{\radioButton} %\begin{verbatim} %#1 = optional, used to enter any modification of the appearance/actions %#2 = the title of the radio button field %#3 = the width of the bounding rectangle %#4 = the height of the bounding rectangle %#5 = the 'on value' or export value, the default is "Yes" %\end{verbatim} % \begin{macrocode} \def\radioButtonDefaults {% \W{1}\S{S}\BC{0 0 0}\F{\FPrint} } \newcommand\radioButton[5][] {% \radio@@Button{#1}{#2}{#3}{#4}{#5}{}{\eq@setWidgetProps \eq@RadioCheck@driver}{\radioButtonDefaults\every@RadioButton}% } % \end{macrocode} % \end{macro} % % \subsection{Text Field}\label{textfield} % % The template for a text field. % \begin{macrocode} \def\common@TextFieldCode {% /Subtype /Widget /T (\Fld@name) /FT /Tx \eq@Ff \eq@F \eq@Q \eq@TU \eq@MaxLen /BS <<\eq@W\eq@S>> /MK <<\eq@R\eq@BC\eq@BG\eq@mkIns>> /DA (\eq@DA) \eq@DV\eq@V \eq@RV\eq@DS \eq@A\eq@AA \eq@rawPDF } % \end{macrocode} % The basic text field macro for constructing all other text fields. % \begin{macrocode} \newcommand\text@@Field[7] {% \begingroup \edef\Fld@name{#2}\def\eq@Title{#2}\def\eq@rectW{#3}\def\eq@rectH{#4}% \def\eq@DA{\eq@textFont\space\eq@textSize\space Tf \eq@textColor}% \@processEvery#7\end\noindent#5#6{#1}% } % \end{macrocode} % \begin{macro}{\textField} %\begin{verbatim} %#1 = optional, used to enter any modification of the appearance/actions %#2 = the title of the text field %#3 = the width of the bounding rectangle %#4 = the height of the bounding rectangle %\end{verbatim} % \begin{macrocode} \def\textFieldDefaults {% \F{\FPrint}\BC{0 0 0}\W{1}\S{S} } \newcommand\textField[4][] {% \text@@Field{#1}{#2}{#3}{#4}{}{\eq@setWidgetProps\eq@TextField}% {\textFieldDefaults\every@TextField}% } \let\eqTextField=\textField % \end{macrocode} % \end{macro} % \begin{macro}{\calcTextField} % This command creates a text field that is designed to be used a an % automatic calculation field. This works only for the those who use % the distiller to make PDF and for users of dvipdfm. %\begin{verbatim} %#1 = optional, used to enter any modification of the appearance/actions %#2 = the title of the text field %#3 = the width of the bounding rectangle %#4 = the height of the bounding rectangle %\end{verbatim} % \begin{macrocode} \def\textFieldDefaults {% \F{\FPrint}\BC{0 0 0}\W{1}\S{S} } \newcommand\calcTextField[4][] {% \text@@Field{#1}{#2}{#3}{#4}{}{\eq@setWidgetProps\eq@calcTextField}% {\textFieldDefaults\every@TextField}% } % \end{macrocode} % \end{macro} % \section{Additional Link Support} % % The links in \textsf{hyperref} are not sufficiently general to % allow actions other than jumping. I've included a general link % that increases the usage of the links provided by % \textsf{hyperref}. % \begin{macrocode} \def\common@LinkCode {% \eq@A % Action \eq@rawPDF % everything else } % \end{macrocode} % The basic macro for create links. % \begin{macrocode} \newcommand\set@@Link[7] {% \begingroup \def\eq@rectW{#2}% \ifx\eq@rectW\@empty \def\link@@Box{#4}% \else \def\eq@rectH{#3}% \def\eq@arg{#4}\ifx\eq@arg\@empty \def\eq@content{\hfill\vfill}\else\def\eq@content{#4}\fi \def\link@@Box{\parbox[\eq@pos][\eq@rectH][\eq@innerpos]% {\eq@rectW}{\centering\eq@content}}% \fi \makeJSspecials \@processEvery#7\end\noindent#5#6{#1}% } % \end{macrocode} % \begin{macro}{\setLinkText} % Set a link around some text. %\begin{verbatim} %\setLinkText[\Border{}\A{/S/JavaScript/JS(this.pageNum=6;)} % \rawPDF{/C[1 0 0]}]{\textcolor{\@linkcolor}{Go There!}} %\end{verbatim} % \begin{macrocode} \def\set@LinkTextDefaults{\Border{0 0 0}} \newcommand\setLinkText[2][] {% \set@@Link{#1}{}{}{#2}{}{\eq@setWidgetProps\setLink@driver}% {\set@LinkTextDefaults\every@Link}% } % \end{macrocode} % \end{macro} % \begin{macro}{\setLinkBbox} % Set a link around some text. %\begin{verbatim} %\setLinkBbox % [\Border{}\rawPDF{/Color{1 0 0}}]{50bp}{30bp}[b]{\centering Press Me!} %\end{verbatim} % \begin{macrocode} \def\set@LinkBboxDefaults{\Border{0 0 0}} \newcommand\setLinkBbox[3][] {% \@setLinkBbox{#1}{#2}{#3}% } \def\@setLinkBbox#1#2#3{\@ifnextchar[{\@@setLinkBbox{#1}{#2}{#3}}% {\@@setLinkBbox{#1}{#2}{#3}[c]}} \def\@@setLinkBbox#1#2#3[#4]% {% \@ifnextchar[{\@@@setLinkBbox{#1}{#2}{#3}{#4}}% {\@@@setLinkBbox{#1}{#2}{#3}{#4}[#4]} } \def\@@@setLinkBbox#1#2#3#4[#5]#6% {% \def\eq@pos{#4}\def\eq@innerpos{#5}% \set@@Link{#1}{#2}{#3}{#6}{\eq@setWidgetProps\setLink@driver}% {}{\set@LinkBboxDefaults\every@Link}% } % \end{macrocode} % \end{macro} % \section{Input Driver Specific Code} % Now bring in driver dependent macros. The macros defined are % the answer macros for the \texttt{shortquiz} environment and most all % for the \texttt{quiz} environment. These macros make heavy use of % JavaScript. The method of introducing these JavaScripts and % PDF code related elements depends on the driver. % \begin{macrocode} \input{\eq@drivercode} % \end{macrocode} % \begin{macrocode} % % \end{macrocode} % \subsection{dvipsone and dvips} % \begin{macrocode} %<*epdfmark> % \end{macrocode} % This is the code for the \texttt{dvipsone} and \texttt{dvips} % options. These two are done together. \textsf{hyperref} % redefines the macro \cmd{\literalps@out} appropriate to each of % these drivers. Both use pdfmarks, so we can put them together. % \par\medskip\noindent % This sets the rectangle size allowing for a literal % hyperlink---meaning we can insert arbitrary links actions. % \begin{macrocode} \def\Rect#1{\pdf@rect{\textcolor{\@linkcolor}{#1}}} % \end{macrocode} % Code to hide the solutions page to a quiz that has solutions. % \begin{macrocode} \def\noPeek#1#2{\literalps@out{% [ {ThisPage} << \noPeekAction{#1}{#2} >> /PUT pdfmark}} % \end{macrocode} % Driver dependent code (distiller) for choice fields, list and combo. % \begin{macrocode} \def\eq@choice@driver {% \centerWidget\eq@rectH\if\autoCenter n\eqcenterWidget=0pt\fi \pdf@rect{\lower\eqcenterWidget\Bbox{\eq@rectW}{\eq@rectH}}% \literalps@out{% [ /Rect [pdf@llx pdf@lly pdf@urx pdf@ury] \common@choiceCode /ANN pdfmark}\endgroup } % \end{macrocode} % Driver dependent code (distiller) for push button fields. % \begin{macrocode} \def\eq@Button@driver {% \centerWidget\eq@rectH\if\autoCenter n\eqcenterWidget=0pt\fi \Hy@pdfstringtrue\ifx\eq@rectW\@empty\def\eq@rectW{\wd\eq@tmpbox}\fi \pdf@rect{\lower\eqcenterWidget\Bbox{\eq@rectW}{\eq@rectH}}% \literalps@out{% [ /Rect [pdf@llx pdf@lly pdf@urx pdf@ury] \common@pushButtonCode /ANN pdfmark}\endgroup } % \end{macrocode} % Driver dependent code (distiller) for radio and button fields. % \begin{macrocode} \def\eq@RadioCheck@driver {% \centerWidget\eq@rectH\Hy@pdfstringtrue \if\autoCenter n\eqcenterWidget=0pt\fi \ifx\eq@rectW\@empty\def\eq@rectW{\wd\eq@tmpbox}\fi \pdf@rect{\lower\eqcenterWidget\Bbox{\eq@rectW}{\eq@rectH}}% \literalps@out{% [ /Rect [pdf@llx pdf@lly pdf@urx pdf@ury] \common@RadioCheckCode /ANN pdfmark}\endgroup } \def\eq@l@check@driver {% \pdf@rect{\makebox[\eq@tmpdima]{\phantom{\link@@Content}}}% \literalps@out{% [ /Rect [pdf@llx pdf@lly pdf@urx pdf@ury] \common@RadioCheckCode /ANN pdfmark}\endgroup } % \end{macrocode} % Driver dependent code for text fields. % \begin{macrocode} \def\eq@TextField {% \centerWidget\eq@rectH\if\autoCenter n\eqcenterWidget=0pt\fi \pdf@rect{\lower\eqcenterWidget\Bbox{\eq@rectW}{\eq@rectH}}% \literalps@out{% [ /Rect [pdf@llx pdf@lly pdf@urx pdf@ury] \common@TextFieldCode /ANN pdfmark}\endgroup } \def\eq@calcTextField{\centerWidget\eq@rectH \if\autoCenter n\eqcenterWidget=0pt\fi \leavevmode\pdf@rect{\lower\eqcenterWidget\Bbox{\eq@rectW}% {\eq@rectH}}\literalps@out{% [ /_objdef {\Fld@name} /Rect [pdf@llx pdf@lly pdf@urx pdf@ury] \common@TextFieldCode /ANN pdfmark [ {corder} {\Fld@name} /APPEND pdfmark }\endgroup} % \end{macrocode} % For processing the \texttt{pdfmark} with distiller, the key \texttt{/Action} is % required (not \texttt{/A}). This macro converts \texttt{/A} to \texttt{/Action}, % and is used for the drivers using distiller. % \begin{macrocode} \def\convertAToAction/A#1\@nil{\def\eq@A{/Action #1}} % \end{macrocode} % Driver dependent code for links. % \begin{macrocode} \def\setLink@driver {% \ifx\eq@A\@empty\else\expandafter\convertAToAction\eq@A\@nil\fi \pdf@rect{\link@@Box}% \literalps@out{% [ /Rect [pdf@llx pdf@lly pdf@urx pdf@ury] \eq@Border \common@LinkCode /Subtype /Link /ANN pdfmark}% \endgroup } % \end{macrocode} % \begin{macrocode} % % \end{macrocode} % \subsection{pdftex} % \begin{macrocode} %<*epdftex> % \end{macrocode} % Code used in the case of the \texttt{pdftex} option. %\par\medskip\noindent % Code to hide the solutions page to a quiz that has solutions. % \begin{macrocode} \def\noPeek#1#2{\global\pdfpageattr=\expandafter{\noPeekAction{#1}{#2}}} % \end{macrocode} % driver dependent code for choice fields % \begin{macrocode} \def\eq@choice@driver {% \centerWidget\eq@rectH\if\autoCenter n\eqcenterWidget=0pt\fi \hbox{\pdfstartlink user{\common@choiceCode}% \lower\eqcenterWidget\Bbox{\eq@rectW}{\eq@rectH}\pdfendlink}% \endgroup } \def\eq@Button@driver {% \centerWidget\eq@rectH \if\autoCenter n\eqcenterWidget=0pt\fi \ifx\eq@rectW\@empty\def\eq@rectW{\wd\eq@tmpbox}\fi \hbox{\pdfstartlink user{ \common@pushButtonCode }% \lower\eqcenterWidget\Bbox{\eq@rectW}{\eq@rectH}\pdfendlink}% \endgroup } \def\eq@RadioCheck@driver {% \centerWidget\eq@rectH \if\autoCenter n\eqcenterWidget=0pt\fi \ifx\eq@rectW\@empty\def\eq@rectW{\wd\eq@tmpbox}\fi \hbox{\pdfstartlink user{\common@RadioCheckCode}% \lower\eqcenterWidget\Bbox{\eq@rectW}{\eq@rectH}\pdfendlink}% \endgroup } \def\eq@l@check@driver {% \pdfstartlink user{\common@RadioCheckCode}% \makebox[\eq@tmpdima]{\phantom{\link@@Content}}% \pdfendlink\endgroup } \def\eq@TextField{\centerWidget\eq@rectH \if\autoCenter n\eqcenterWidget=0pt\fi \leavevmode\hbox{\pdfstartlink user{\common@TextFieldCode}% \lower\eqcenterWidget\Bbox{\eq@rectW}{\eq@rectH}\pdfendlink}% \endgroup } \def\eq@calcTextField{\centerWidget\eq@rectH \if\autoCenter n\eqcenterWidget=0pt\fi \leavevmode\hbox{\pdfstartlink user{\common@TextFieldCode}% \lower\eqcenterWidget\Bbox{\eq@rectW}{\eq@rectH}\pdfendlink}% \endgroup } \def\setLink@driver {% \leavevmode\pdfstartlink attr {\eq@Border}% user{/Subtype/Link \common@LinkCode}% \Hy@colorlink{\@linkcolor}\link@@Box \close@pdflink \endgroup } % \end{macrocode} % \begin{macrocode} % % \end{macrocode} % \subsection{dvipdfm} % \begin{macrocode} %<*edvipdfm> % \end{macrocode} % Code to hide the solutions page to a quiz that has solutions. % \begin{macrocode} \def\noPeek#1#2{\@pdfm@mark{put @thispage << \noPeekAction{#1}{#2} >> }} % \end{macrocode} % \begin{macrocode} \def\eq@choice@driver {% \centerWidget\eq@rectH\if\autoCenter n\eqcenterWidget=0pt\fi \leavevmode\setbox\pdfm@box=% \hbox{\lower\eqcenterWidget\Bbox{\eq@rectW}{\eq@rectH}}% \@pdfm@mark{ann @\Fld@name\space\dvipdfm@setdim <<\common@choiceCode>>}\unhbox\pdfm@box\relax% \@pdfm@mark{put @afields @\Fld@name}% record in @afields array \endgroup} \def\eq@Button@driver {% \centerWidget\eq@rectH \if\autoCenter n\eqcenterWidget=0pt\fi \ifx\eq@rectW\@empty\def\eq@rectW{\wd\eq@tmpbox}\fi \setbox\pdfm@box=% \hbox{\lower\eqcenterWidget\Bbox{\eq@rectW}{\eq@rectH}}% \@pdfm@mark{ann @\Fld@name\space\dvipdfm@setdim << \common@pushButtonCode >>}\unhbox\pdfm@box\relax% \@pdfm@mark{put @afields @\Fld@name}% record in @afields array \endgroup } \def\eq@RadioCheck@driver {% \centerWidget\eq@rectH\Hy@pdfstringtrue \if\autoCenter n\eqcenterWidget=0pt\fi \ifx\eq@rectW\@empty\def\eq@rectW{\wd\eq@tmpbox}\fi \setbox\pdfm@box=% \hbox{\lower\eqcenterWidget\Bbox{\eq@rectW}{\eq@rectH}}% \@pdfm@mark{ann \dvipdfm@setdim <<\common@RadioCheckCode>>}\unhbox\pdfm@box\relax% \endgroup } \def\eq@l@check@driver {% \setbox\pdfm@box= \hbox{\makebox[\eq@tmpdima]{\phantom{\link@@Content}}}% \@pdfm@mark{ann \dvipdfm@setdim<<\common@RadioCheckCode>>}% \unhbox\pdfm@box\relax\endgroup } \def\eq@TextField{\centerWidget\eq@rectH \if\autoCenter n\eqcenterWidget=0pt\fi \leavevmode\setbox\pdfm@box=% \hbox{\lower\eqcenterWidget\Bbox{\eq@rectW}{\eq@rectH}}% \@pdfm@mark{ann @\Fld@name\space\dvipdfm@setdim << \common@TextFieldCode >>}\unhbox\pdfm@box\relax% \@pdfm@mark{put @afields @\Fld@name}% record in @afields array \endgroup } \def\eq@calcTextField{\centerWidget\eq@rectH \if\autoCenter n\eqcenterWidget=0pt\fi \leavevmode\hbox{\setbox\pdfm@box=% \hbox{\lower\eqcenterWidget\Bbox{\eq@rectW}{\eq@rectH}}% \@pdfm@mark{ann @\Fld@name\space\dvipdfm@setdim << \common@TextFieldCode >>}\unhbox\pdfm@box\relax}% \@pdfm@mark{put @afields @\Fld@name}% record in @afields array \@pdfm@mark{put @corder @\Fld@name}% \endgroup } \def\setLink@driver {% \leavevmode\@pdfm@mark{bann <>}% \Hy@colorlink{\@linkcolor}\link@@Box\hyper@linkend \endgroup } % % \end{macrocode} % \Finale \endinput