diff options
author | Norbert Preining <norbert@preining.info> | 2017-07-13 10:25:48 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2017-07-13 10:25:48 +0900 |
commit | cfe306ba1b7ec40855a300580b7981845d56edeb (patch) | |
tree | e2feaf2adf8a8afe43a995528097913793874d01 /texmf-dist/source/latex/annot-pro/annot_pro.dtx | |
parent | 32d0671418a3cc6ad0465b06539ed54d96f77784 (diff) |
add aeb-mlink aeb-pro aebxmp graphicxsp annot-pro
Diffstat (limited to 'texmf-dist/source/latex/annot-pro/annot_pro.dtx')
-rw-r--r-- | texmf-dist/source/latex/annot-pro/annot_pro.dtx | 1162 |
1 files changed, 1162 insertions, 0 deletions
diff --git a/texmf-dist/source/latex/annot-pro/annot_pro.dtx b/texmf-dist/source/latex/annot-pro/annot_pro.dtx new file mode 100644 index 00000000..7e30b00e --- /dev/null +++ b/texmf-dist/source/latex/annot-pro/annot_pro.dtx @@ -0,0 +1,1162 @@ +% \iffalse +%<*copyright> +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% annot_pro package, %% +%% Copyright (C) 2002-2016 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{annot_pro} +%<package> [2016/10/18 v1.1b Provides selected PDF annotation support (dps)] +%<*driver> +\documentclass{ltxdoc} +\usepackage[fleqn]{amsmath} +\usepackage[colorlinks,hyperindex=false]{hyperref} +\let\uif\textsf\let\app\textsf +\let\pkg\textsf\let\env\texttt +\def\psf#1{\textsf{\textbf{#1}}} +%\def\texorpdfstring#1#2{#1} +%\pdfstringdefDisableCommands{\let\\\textbackslash} +\OnlyDescription % comment out for implementation details +\EnableCrossrefs \CodelineIndex \RecordChanges +\InputIfFileExists{aebdocfmt.def}{\PackageInfo{annot_pro}{Inputting aebdocfmt.def}} + {\def\IndexOpt{\DescribeMacro}\def\IndexKey{\DescribeMacro}\let\setupFullwidth\relax + \PackageInfo{annot_pro}{aebdocfmt.def cannot be found}} +\begin{document} + \GetFileInfo{annot_pro.sty} + \title{annot\_pro: Selected PDF Annotations} + \author{D. P. Story\\ + Email: \texttt{dpstory@uakron.edu}} + \date{processed \today} + \maketitle + \tableofcontents + \let\Email\texttt + \DocInput{annot_pro.dtx} +\IfFileExists{\jobname.ind}{\newpage\setupFullwidth\par\PrintIndex}{\paragraph*{Index} +The index goes here. Execute +\begin{quote} + \texttt{makeindex -s gind.ist -o annot\_pro.ind annot\_pro.idx} +\end{quote} + on the command line and recompile \texttt{annot\_pro.dtx}.} +\IfFileExists{\jobname.gls}{\PrintChanges}{\paragraph*{Change History} The list +of changes goes here. Execute +\begin{quote} + \texttt{makeindex -s gglo.ist -o annot\_pro.gls annot\_pro.glo} +\end{quote} + on the command line and recompile \texttt{annot\_pro.dtx}.} +\end{document} +%</driver> +% \fi +% +% \MakeShortVerb{|} +% \InputIfFileExists{aebdonotindex.def}{\PackageInfo{web}{Inputting aebdonotindex.def}} +% {\PackageInfo{web}{cannot find aebdonotindex.def}} +% +% \begin{macrocode} +%<*package> +\RequirePackage{xkeyval} +% \end{macrocode} +% \changes{v1.1}{2016/09/29}{Introduced Free Text annotation} +% \changes{v1.0c}{2016/09/28}{Reformatted manual, reformatted DTX file} +% \section{Background Information} +% +% The following annotation types will be supported (taken from table 8.20) +%\begin{itemize} +% \item \textbf{Text}: Subtype \textbf{Text}. See Table 8.23, page 621. In particular, the values +% of the \textbf{Name} key are \textbf{Comment}, \textbf{Help}, \textbf{Insert}, \textbf{Key}, \textbf{NewParagraph}, +% \textbf{Note} (the default), and \textbf{Paragraph}. Other supported names are \textbf{Check}, \textbf{Circle}, \textbf{Cross}, +% \textbf{Star}, \textbf{RightArrow}, \textbf{RightPointer}, \textbf{UpArrow}, \textbf{UpLeftArrow} +% \item \textbf{Stamp}: Subtype \textbf{Stamp}. See Table 8.32, page 635. The values of the \textbf{Name} key are +% \textbf{Approved}, \textbf{AsIs}, \textbf{Confidential}, +% \textbf{Departmental}, \textbf{Draft} (the default), +% \textbf{Experimental}, \textbf{Expired}, \textbf{Final}, +% \textbf{ForComment}, \textbf{ForPublicRelease}, \textbf{NotApproved}, +% \textbf{NotForPublicRelease}, \textbf{Sold}, \textbf{TopSecret}. +% \item \textbf{FileAttachment}: Subtype \textbf{FileAttachment}. Table 8.35, page 638. The Name key has values +% \textbf{Graph}, \textbf{Paperclip}, \textbf{PushPin}, and \textbf{Tag}. +%\end{itemize} +% The options available for any supported annotation +%\begin{itemize} +% \item \verb!type=text | stamp | fileattachment! (text, the default) +% \item \texttt{Contents} will be an argument of the command \cs{annotpro} +% \item \texttt{NM} unique name for the page, optional, if not provided, +% one will be generated. +% \item \texttt{color}, to color the annotation +% \item \verb!margin! to place the annotation in the margin +% \item \texttt{nohspace}, leave no horizontal space +% \item \texttt{novspace}, leave no vertical space +% \item \texttt{nospace}, leave neither vertical or horizontal space. +%\end{itemize} +% \section{Annotation types supported} +% \subsection{Text Annotations} +% The options for the text annotation (\texttt{type=text}) are +%\begin{itemize} +% \item \texttt{name}, one of the standard icons listed above, default Note +% \item \texttt{open}, default \texttt{false} +%\end{itemize} +% \subsection{Rubber Stamp Annotations} +% The options for the text annotation (\texttt{type=stamp}) are +%\begin{itemize} +% \item \texttt{name}, the default is draft. If a name begins with \texttt{\#}, that signals +% a custom appearance. +% \item \texttt{ap}, when the name is a custom name, the \texttt{ap} is used to hold the indirect reference +% to the appearance. If a custom name is specified, \texttt{ap} is required, and \textsf{graphicxsp} is required. +% \item \texttt{open}, default \texttt{false} +%\end{itemize} +% \subsection{File Attachment Annotations} +% The options for the text annotation (\texttt{type=fileattachement}) are +%\begin{itemize} +% \item \texttt{name}, the default is \texttt{PushPin}. +% \item \texttt{file}, the file specification \textbf{FS} key +%\end{itemize} +% \subsection{Text Box (Free Text) Annotations} +% Beginning with Free Text +% \begin{macrocode} +\DeclareOptionX{preview}{\previewtrue} +\@ifundefined{ifpreview}{\newif\ifpreview\previewfalse}{} +% \end{macrocode} +% \changes{v1.1}{2016/09/29}{Added \string\texttt{useA10Icons} and \string\texttt{useTextBox} options} +% (2016/09/29) Added \texttt{useA10Icons} and \texttt{useTextBox} options +% \begin{macrocode} +\newif\ifuseAAXdim\useAAXdimtrue +\DeclareOptionX{useA10Icons}{\useAAXdimtrue} +\DeclareOptionX{!useA10Icons}{\useAAXdimfalse} +% \end{macrocode} +% Require \pkg{richtext}, dated 2016/10/03 or later. +% \changes{v1.1a}{2016/10/18}{Require \string\pkg{richtext}, dated 2016/10/03 or later.} +% \changes{v1.1b}{2016/10/18}{Corrected date specification} +% \begin{macrocode} +\DeclareOptionX{useTextBox}{\def\ap@requireRichTextAsNeeded{% + \RequirePackage{richtext}[2016/10/03]}} +\let\ap@requireRichTextAsNeeded\relax +\ProcessOptionsX\relax +\RequirePackage{hyperref} +\RequirePackage{calc} +\RequirePackage{insdljs} +\RequirePackage[structure]{taborder} +\ap@requireRichTextAsNeeded +% \end{macrocode} +% We see if \textsf{graphicxsp} is loaded, and set a simple switch one way or the other. +% This switch is later used when creating a custom stamp. +% \begin{macrocode} +\@ifpackageloaded{graphicxsp}{% + \let\ap@graphicxsp=1}{\let\ap@graphicxsp=0} +% \end{macrocode} +% For now, we'll support setting the tab order only if the \pkg{eforms} package is loaded. +% \begin{macrocode} +\@ifpackageloaded{eforms}{} + {\newif\ifto@structOrder\to@structOrderfalse} +% \end{macrocode} +% \cs{csarg} from \pkg{comments} package, handy. +% \begin{macrocode} +\def\ap@csarg#1#2{\expandafter#1\csname#2\endcsname} +% \end{macrocode} +% Definitions for creating a rectangle used to create a building box for the annot. +% This switch is later used when creating a custom stamp. +% \begin{macrocode} +\def\ap@Bbox#1#2{% + \edef\bbox@width{#1}\edef\bbox@height{#2}% + \hbox{\ifpreview\setlength\fboxrule{0.4pt}\setlength\fboxsep{0pt}% + \@tempdima=\bbox@width\advance\@tempdima by-\fboxrule + \@tempdimb=\bbox@height\advance\@tempdimb by-\fboxrule + \fbox{\parbox[c][\@tempdimb][c]{\@tempdima}{\hfill\vfill}}\else + \parbox[c][\bbox@height][c]{\bbox@width}{\hfill\vfill}\fi}% +} +% \end{macrocode} +% The postscript operators \texttt{pdf@llx}, etc., are defined in \textsf{hyperref}. +% \begin{macrocode} +\def\ap@Rect{/Rect [pdf@llx pdf@ury pdf@urx pdf@lly]} +% \end{macrocode} +% \begin{macro}{\defineAPath} +% A simple macro to define path. +% \begin{macrocode} +\newcommand{\defineAPath}[1]{\def\ap@ctrl@Name{#1}% + \hyper@normalise\ap@defineAPath} +\def\ap@defineAPath#1{\expandafter\xdef\ap@ctrl@Name{#1}} +% \end{macrocode} +% \end{macro} +% \section{Key-Value Pairs for \texorpdfstring{\protect\cs{annotpro}}{\textbackslash annotpro}} +% \begin{macro}{type} +% We support three types of annotation, text, stamp, and fileattachment. +% \begin{macrocode} +\define@choicekey+{annotpro}{type}[\val\nr]% + {text,stamp,fileattachment,textbox}[text]{% + \edef\ap@save@type{\nr}% + \ifcase\nr\relax + \def\ap@type{Text}\or + \def\ap@type{Stamp}\or + \def\ap@type{FileAttachment}\or + \def\ap@type{FreeText}\fi +}{\PackageWarning{annot_pro}{Bad choice for type, permissible values + are text, stamp, fileattachment, textbox. Try again}} +\def\ap@freetext@type{3} +\let\ap@type\@empty +% \end{macrocode} +% \end{macro} +% \begin{macro}{name} +% The name key can have many different values. The permitted values are +% a function of the \texttt{type}. +% \begin{macrocode} +\define@key{annotpro}{name}[]{\def\annotpro@name{#1}} +\let\annotpro@name\@empty +% \end{macrocode} +% \end{macro} +% For a text annotation, the following are permitted values for \texttt{name}: +% \begin{macrocode} +\define@choicekey+{annnotprotext}{name}{% +Comment,Key,Note,Help,NewParagraph,Paragraph,Insert,Check,% +Circle,Cross,Star,RightArrow,RightPointer,UpArrow,UpLeftArrow,% +CrossHairs}[Note]{\def\annotpro@@name{#1}}% +{\PackageWarning{annot_pro}{Bad choice for name, permissible values +are Comment, Key, Note, Help, NewParagraph, Paragraph, Insert, Check, +Circle, Cross, Star, RightArrow, RightPointer, UpArrow, +UpLeftArrow, CrossHairs. Try again}} +\let\annotpro@@name\@empty +% \end{macrocode} +% For a stamp annotation, the following are permitted values for \texttt{name}. +% \begin{macrocode} +\define@choicekey+{annnotprostamp}{name}{% +Approved,AsIs,Confidential,Departmental,Draft,% +Experimental,Expired,Final,ForComment,% +ForPublicRelease,NotApproved,NotForPublicRelease,Sold,% +TopSecret}[Draft]{\def\annotpro@@name{#1}}% +{\def\ap@custom@name{#1}} +\let\ap@custom@name\@empty +% \end{macrocode} +% If the user enters a value other than the one listed, that value is recorded +% in the text macro \cs{ap@custom@name}. Usually, the user would enter the +% names of stamps that come on his system, but are not part of the PDF Specs. +% \begin{macrocode} +% \end{macrocode} +% \begin{macro}{customStamp} +% There is a third case. The user can create a custom stamp using graphicxsp +% package. +% \begin{macrocode} +\define@key{annotpro}{customStamp}[]{\def\ap@customstamp@name{#1}} +\let\ap@customstamp@name\@empty +% \end{macrocode} +% \end{macro} +% \begin{macro}{ap} +% When the user specifies \texttt{customStamp}, he must supply a custom appearence +% for the stamp with the \texttt{ap} key. The \textsf{graphicxsp} package is required +% for this option. +% \begin{macrocode} +\define@key{annotpro}{ap}[]{\def\annotpro@ap{#1}} +\let\annotpro@ap\@empty +% \end{macrocode} +% \end{macro} +% There is a third case. The user can create a custom stamp using graphicxsp +% package. +% \begin{macro}{width} +% \begin{macro}{height} +% \begin{macro}{rotate} +% \begin{macro}{scale} +% \begin{macro}{widthTo} +% \begin{macro}{heightTo} +% As of this writing, these are used when the user sets the name key equal +% to one of the many stamp names that come with Acrobat (other than ones +% that are documented in the PDF Specs. Use the width and height to set the +% bounding box. Normally, distiller, will place the largest stamp the box +% will hold, and center it in that box. (I think.) +% \begin{macrocode} +\define@key{annotpro}{width}[]{\def\annotpro@width{#1}} +\let\annotpro@width\@empty +\define@key{annotpro}{height}[]{\def\annotpro@height{#1}} +\let\annotpro@height\@empty +\define@key{annotpro}{rotate}[]{\def\annotpro@rotate{#1}} +\let\annotpro@rotate\@empty +\define@key{annotpro}{scale}[]{\def\annotpro@scale{#1}} +\let\annotpro@scale\@empty +\define@key{annotpro}{widthTo}[]{\def\annotpro@widthTo{#1}} +\let\annotpro@widthTo\@empty +\define@key{annotpro}{heightTo}[]{\def\annotpro@heightTo{#1}} +\let\annotpro@heightTo\@empty +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% For a file attachment annotation, the following are permitted values for \texttt{name}. +% \begin{macrocode} +\define@choicekey+{annnotprofileattach}{name}{% +Graph,Paperclip,PushPin,Tag}[PushPin]{\def\annotpro@@name{#1}} +{\PackageWarning{annot_pro}{Bad choice for name, permissible values +are Graph,Paperclip,PushPin,Tag. Try again}} +% \end{macrocode} +% \begin{macro}{file} +% When there is a file attachment, the absolute path to the file must be +% specified using the \texttt{file} key. A path to the file can be defined +% using \cs{defineAPath}. +% \begin{macrocode} +\define@key{annotpro}{file}[]{% + \edef\annotpro@file{#1}% + \ifx\annotpro@file\@empty\else + \edef\ap@exp@tmp{\noexpand\filename@parse{#1}}\ap@exp@tmp + \edef\ap@thisFileName{\filename@base.\filename@ext}\fi +} +\let\annotpro@file\@empty +\define@key{annotprofreetext}{name}[FreeText]{\def\annotpro@@name{#1}} +\define@key{annotprofreetext}{defstyle}[]{\def\annotpro@@ds{#1}} +\let\annotpro@@ds\@empty +\define@key{annotprofreetext}{richtext}[]{\def\annotpro@@rt{#1}} +\let\annotpro@@rt\@empty +% \end{macrocode} +% \end{macro} +% \begin{macro}{margin} +% \begin{macro}{margintext} +% \begin{macro}{\margintextformat} +% When margin is used, the command \cs{marginpar} is used to place the annotation +% in the margins, this is nice for sticky notes (text annotations), small stamps, +% and file attachments. +% +% You can optionally place (small amount of) text under the icon in the margins. The +% format for the text can be redefined using the command \cs{margintextformat}. +% \begin{macrocode} +\define@key{annotpro}{margin}[0]{% + \def\annotpro@margin{0}} +\let\annotpro@margin\@empty +\define@key{annotpro}{margintext}[]{% + \def\apmargintext{\centering\break + \parbox{\linewidth}{\apmargintextformat\strut#1}}} +\let\apmargintext\@empty +\newcommand{\margintextformat}[1]{\def\apmargintextformat{#1}} +\margintextformat{\bfseries\tiny\color{blue}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \begin{macro}{presets} +% A convenience key to allow the introduction of pre-defined options, for example, +% you might like all your comment fields to be red, so you can define +% \verb!\def\myComments{type=text,name=Comment,color=red}!, then say +%\begin{verbatim} +% \annotpro[presets=\myComment]{Way to go!} +%\end{verbatim} +% \begin{macrocode} +\define@key{annotpro}{presets}[]{\def\annotpro@presets{#1}} +\let\annotpro@presets\@empty +% \end{macrocode} +% Added 07/08/09 to support structure tab order. +% \end{macro} +% \begin{macro}{objdef} +% This is a pdfmark feature that inserts a references to this COS object, +% used with setting the tab order using the structure. Tabbing using structure +% is supported by \textsf{eforms}. +% \begin{macrocode} +\define@key{annotpro}{objdef}[]{\def\eq@objdef{/_objdef {#1}}% + \def\eq@objdefName{#1}} +\let\eq@objdef\@empty +% \end{macrocode} +% \end{macro} +% \begin{macro}{taborder} +% \begin{macrocode} +\define@key{annotpro}{taborder}[]{\def\eq@taborder{#1}} +\let\eq@taborder\@empty +% \end{macrocode} +% \end{macro} +% \begin{macro}{open} +% A key to set whether the popup annotation is open or not. +% \begin{macrocode} +\define@choicekey+{annotpro}{open}[\val\nr]{true,false}[true]{% + \def\annotpro@open{#1}}{\PackageWarning{annot_pro}{Bad + choice for open, permissible values are true and false. Try again}} +\def\annotpro@open{false} +% \end{macrocode} +% \end{macro} +% \begin{macro}{subject} +% \begin{macro}{title} +% The subject and title (usually the author's name) of the annotation +% \begin{macrocode} +\define@key{annotpro}{subject}[]{\def\annotpro@subject{#1}} +\define@key{annotpro}{title}[]{\def\annotpro@title{#1}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \begin{macro}{color} +% The color of the annotation. +% \begin{macrocode} +\define@key{annotpro}{color}[1 0 0]{\def\annotpro@color{#1}} +% \end{macrocode} +% For the FreeText annotation, we can specify background color \IndexOpt{bgcolor}\texttt{bgcolor}, +% (default white) and border color \IndexOpt{bcolor}\texttt{bcolor} (default black). +% \begin{macrocode} +\define@key{annotpro}{bgcolor}[]{\def\annotpro@bgcolor{#1}} +\def\annotpro@bgcolor{white} +\define@key{annotpro}{bcolor}[]{\def\annotpro@bcolor{#1}} +\let\annotpro@bcolor\@empty +\def\annotpro@def@bcolor{black} +\def\ap@BE@i{4.08768} +\def\ap@BE@i@calc{\ap@BE@i\space\ap@bwidthNum\space add} +\def\ap@BE@ii{8.26857} +\def\ap@BE@ii@calc{\ap@BE@ii\space add \ap@bwidthNum} +\define@choicekey+{annotpro}{borderstyle}[\val\nr]{none,solid,% + dash1,dash2,dash3,dash4,dash5,dash6,cloud1,cloud2}[solid]{% + \ifcase\nr\relax + \def\ap@border@code{}\or + \def\ap@border@code{/BS <</S/S\ap@bwidth>>}\or + \def\ap@border@code{/BS <</D[2.0 2.0]/S/D\ap@bwidth>>}\or + \def\ap@border@code{/BS <</D[3.0 3.0]/S/D\ap@bwidth>>}\or + \def\ap@border@code{/BS <</D[4.0 4.0]/S/D\ap@bwidth>>}\or + \def\ap@border@code{/BS <</D[4.0 3.0 2.0 3.0]/S/D\ap@bwidth>>}\or + \def\ap@border@code{/BS <</D[4.0 3.0 16.0 3.0]/S/D\ap@bwidth>>}\or + \def\ap@border@code{/BS <</D[8.0 4.0 4.0 4.0]/S/D\ap@bwidth>>}\or + \def\ap@border@code{/BE<</I 1.0/S/C>>/RD[\ap@BE@i@calc\space\ap@BE@i@calc + \space\ap@BE@i@calc\space\ap@BE@i@calc]% + \ifx\ap@bwidth\@empty\else/BS <<\ap@bwidth>>\fi}\or + \def\ap@border@code{/BE<</I 2.0/S/C>>/RD[\ap@BE@ii@calc\space\ap@BE@ii@calc + \space\ap@BE@ii@calc\space\ap@BE@ii@calc]% + \ifx\ap@bwidth\@empty\else/BS <<\ap@bwidth>>\fi}\fi + \def\annotpro@border{#1}}{\PackageWarning{annot_pro}{Bad + choice for borderstyle,\MessageBreak permissible values are none, solid,% + dash1, dash2, dash3,\MessageBreak dash4, dash5, dash6, cloud1, cloud2. Try again}} +\def\ap@border@code{/BS <</S/S\ap@bwidth>>} +\define@choicekey+{annotpro}{borderwidth}[\val\nr]{.5,1,2,3,4,6,8,10}[1]{% + \edef\ap@bwidthNum{\val}% + \def\ap@bwidth{/W #1}}{\PackageWarning{annot_pro}{Bad + choice for borderwidth,\MessageBreak permissible values are .5, 1, 2,\MessageBreak + 3, 4, 6, 8, 10. Try again}} +\def\ap@bwidthNum{1} +\let\ap@bwidth\@empty +% \end{macrocode} +% \end{macro} +% \begin{macro}{readonly} +% Set the annotation to readonly. +% \begin{macrocode} +\define@key{annotpro}{readonly}[ 64 add]{\def\ap@readonly{#1}} +\let\ap@readonly\@empty +% \end{macrocode} +% \end{macro} +% \begin{macro}{nohspace} +% \begin{macro}{nohspace} +% \begin{macro}{nospace} +% These are used only with text annotations. The position of the +% annotation depends only on the upper-right corner. The bounding +% box can be made to have no width or not height, or both. The upper-left +% corner is always defined. The text annotation will take no horizontal, +% vertical, or no space at all in {\TeX} space. The same effect can be accomplished +% using 0pt width boxes or by smashing the bounding box. +% \begin{macrocode} +\define@key{annotpro}{nohspace}[]{\def\annotpro@hspace{0pt}} +\define@key{annotpro}{novspace}[]{\def\annotpro@vspace{0pt}} +\define@key{annotpro}{nospace}[]{\def\annotpro@hspace{0pt}% + \def\annotpro@vspace{0pt}} +\let\annotpro@hspace\@empty\let\annotpro@vspace\@empty +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \begin{macro}{opacity} +% Set the \texttt{opacity} of the annot, if creating a custom stamp using +% graphicxsp, then the file needs to be distilled using \texttt{standard\_transparency} +% job settings for distiller. +% \begin{macrocode} +\define@key{annotpro}{opacity}[]{% + \def\ap@add@ops{[ /ca #1 /SetTransparency pdfmark}% + \def\annotpro@opacity{#1}} +\let\annotpro@opacity\@empty +% \end{macrocode} +% \end{macro} +% \subsection{Dimensions of Standard Text Icons} +% Using the user interface, and the dimensions of each of the standard text annotations +% were obtained and recorded here. +% \begin{macrocode} +% Note in A10, text annots are not 18bp x 18bp and A10 adds CrossHairs +\def\getargsiii#1#2#3{\def\ap@argi{#1}\def\ap@argii{#2}% + \def\ap@argiii{#3}} +\ifuseAAXdim +\@tfor\ap@text@dimen:={{Comment}{18bp}{18bp}}% +{{Key}{13bp}{18bp}}{{Note}{18bp}{20bp}}{{Help}{20bp}{20bp}}% +{{NewParagraph}{13bp}{20bp}}{{Paragraph}{20bp}{20bp}}% +{{Insert}{17bp}{20bp}}{{Check}{20bp}{19bp}}% +{{Circle}{20bp}{20bp}}{{Cross}{20bp}{19bp}}% +{{Star}{20bp}{19bp}}{{RightArrow}{20bp}{20bp}}% +{{RightPointer}{20bp}{17bp}}{{UpArrow}{17bp}{20bp}}% +{{UpLeftArrow}{17bp}{17bp}}{{CrossHairs}{20bp}{20bp}}\do{% + \expandafter\getargsiii\ap@text@dimen + \ap@csarg\edef{ap@\ap@argi Width}{\ap@argii}% + \ap@csarg\edef{ap@\ap@argi Height}{\ap@argiii}% +} \else +\@tfor\ap@text@dimen:={{Comment}{20bp}{18bp}}% +{{Key}{18bp}{17bp}}{{Note}{18bp}{20bp}}{{Help}{20bp}{20bp}}% +{{NewParagraph}{13bp}{20bp}}{{Paragraph}{11bp}{20bp}}% +{{Insert}{20bp}{17bp}}{{Check}{20bp}{19bp}}% +{{Circle}{20bp}{20bp}}{{Cross}{20bp}{20bp}}% +{{Star}{20bp}{19bp}}{{RightArrow}{20bp}{14bp}}% +{{RightPointer}{20bp}{18bp}}{{UpArrow}{19bp}{20bp}}% +{{UpLeftArrow}{17bp}{17bp}}{{CrossHairs}{24bp}{24bp}}\do{% + \expandafter\getargsiii\ap@text@dimen + \ap@csarg\edef{ap@\ap@argi Width}{\ap@argii}% + \ap@csarg\edef{ap@\ap@argi Height}{\ap@argiii}% +} \fi +% \end{macrocode} +% \subsection{Dimensions of Standard File Attachment Icons} +% Similarly, the dimensions of each of the standard file attachment annotations +% were obtained and recorded. All these dimensions have been reduced by 2pt, so that there final +% dimensions match what is displayed through the ui. +% \begin{macrocode} +\ifuseAAXdim +\@tfor\ap@fa@dimen:={{Graph}{20bp}{20bp}} + {{Paperclip}{7bp}{17bp}}{{PushPin}{14bp}{20bp}} + {{Tag}{20bp}{16bp}}\do{% + \expandafter\getargsiii\ap@fa@dimen + \ap@csarg\edef{ap@\ap@argi Width}{\ap@argii}% + \ap@csarg\edef{ap@\ap@argi Height}{\ap@argiii}% +} +\else +\@tfor\ap@fa@dimen:={{Graph}{18bp}{18bp}} + {{Paperclip}{5bp}{15bp}}{{PushPin}{12bp}{18bp}} + {{Tag}{18bp}{14bp}}\do{% + \expandafter\getargsiii\ap@fa@dimen + \ap@csarg\edef{ap@\ap@argi Width}{\ap@argii}% + \ap@csarg\edef{ap@\ap@argi Height}{\ap@argiii}% +} \fi +% \end{macrocode} +% \subsection{Dimensions of Standard Stamp Appearances} +% +% Some default stamp dimensions, when the dimensions are not known or provided. May be +% redefined. +% \begin{macrocode} +\newcommand{\defaultStampWidth}{50bp} +\newcommand{\defaultStampHeight}{50bp} +% \end{macrocode} +% The dimensions of the stamp appearances in the file \texttt{Standard.pdf} +% \begin{macrocode} +\newcommand{\standardStampWidth}{245.38bp} +\newcommand{\standardStampHeight}{64.53bp} +% \end{macrocode} +% The dimensions of the stamp appearances in the file \texttt{StandardBusiness.pdf} +% \begin{macrocode} +\@tfor\ap@dimen:={{SBApproved}{163.50bp}{49.50bp}} +{{SBCompleted}{175.87bp}{49.50bp}} +{{SBConfidential}{209.62bp}{49.50bp}} +{{SBDraft}{113.14bp}{49.75bp}} +{{SBFinal}{97.80bp}{49.75bp}} +{{SBForComment}{211.87bp}{49.50bp}} +{{SBForPublicRelease}{290.04bp}{49.55bp}} +{{SBInformationOnly}{275.00bp}{49.55bp}} +{{SBNotApproved}{218.62bp}{49.50bp}} +{{SBNotForPublicRelease}{346.04bp}{49.55bp}} +{{SBPreliminaryResults}{304.04bp}{49.55bp}} +{{SBVoid}{91.04bp}{49.75bp}}\do{% + \expandafter\getargsiii\ap@dimen + \ap@csarg\edef{ap@\ap@argi Width}{\ap@argii}% + \ap@csarg\edef{ap@\ap@argi Height}{\ap@argiii}% +} +% \end{macrocode} +% The dimensions of the stamp appearances in the file \texttt{SignHere.pdf} +% \begin{macrocode} +\@tfor\ap@dimen:={{SBRejected}{22.68bp}{22.66bp}} +{{SHAccepted}{23.29bp}{20.45bp}} +{{SHInitialHere}{99.69bp}{30.34bp}} +{{SHSignHere}{99.69bp}{30.34bp}} +{{SHWitness}{99.69bp}{30.34bp}}\do{% + \expandafter\getargsiii\ap@dimen + \ap@csarg\edef{ap@\ap@argi Width}{\ap@argii}% + \ap@csarg\edef{ap@\ap@argi Height}{\ap@argiii}% +} +% \end{macrocode} +% The dimensions of the stamp appearances in the file \texttt{\texttt{Dynamic.pdf}} +% \begin{macrocode} +\catcode`\#=11\relax +\@tfor\ap@dimen:={{#DApproved}{255.64bp}{53.83bp}} +{{#DConfidential}{163.28bp}{57.10bp}} +{{#DReceived}{255.64bp}{55.11bp}} +{{#DReviewed}{255.64bp}{55.11bp}} +{{#DRevised}{127.47bp}{55.85bp}}\do{% + \expandafter\getargsiii\ap@dimen + \ap@csarg\edef{ap@\ap@argi Width}{\ap@argii}% + \ap@csarg\edef{ap@\ap@argi Height}{\ap@argiii}% +} +\catcode`\#=6\relax +\newcommand{\stampWidth}[1]{\csname ap@#1Width\endcsname} +\newcommand{\stampHeight}[1]{\csname ap@#1Height\endcsname} +% \end{macrocode} +% The dimensions of the stamp appearances in the file Words.pdf +% \begin{macrocode} +\@tfor\ap@dimen:={{WordsAGenuineFind}{120.68bp}{190.83bp}} +{{WordsBigSavings}{282.84bp}{117.86bp}} +{{WordsDeals}{345.40bp}{132.55bp}} +{{WordsHappyBirthday}{326.50bp}{166.32bp}} +{{WordsHot}{249.64bp}{176.75bp}} +{{WordsLookWhatsNew}{316.59bp}{229.81bp}} +{{WordsNeato}{171.12bp}{86.88bp}} +{{WordsTheBestJustGotBetter}{153.53bp}{153.53bp}}\do{% + \expandafter\getargsiii\ap@dimen + \ap@csarg\edef{ap@\ap@argi Width}{\ap@argii}% + \ap@csarg\edef{ap@\ap@argi Height}{\ap@argiii}% +} +% \end{macrocode} +% The dimensions of the stamp appearances in the file \texttt{Faces.pdf} +% \begin{macrocode} +\@tfor\ap@dimen:={{FacesEcstatic}{223.20bp}{202.80bp}} +{{FacesElectric}{295.80bp}{280.50bp}} +{{FacesGrumpy}{289.92bp}{194.64bp}} +{{FacesHappy}{161.65bp}{161.65bp}} +{{FacesHurt}{289.50bp}{285.75bp}} +{{FacesNeutral}{291.04bp}{279.32bp}} +{{FacesSmirk}{276.75bp}{292.50bp}} +{{FacesSurprised}{220.08bp}{215.04bp}} +{{FacesWorried}{298.11bp}{235.12bp}} +{{FacesWow}{242.32bp}{289.17bp}} +{{FacesZippy}{290.59bp}{263.81bp}}\do{% + \expandafter\getargsiii\ap@dimen + \ap@csarg\edef{ap@\ap@argi Width}{\ap@argii}% + \ap@csarg\edef{ap@\ap@argi Height}{\ap@argiii}% +} +% \end{macrocode} +% The dimensions of the stamp appearances in the file \texttt{Pointers.pdf} +% \begin{macrocode} +\@tfor\ap@dimen:={{PointersBogus}{128.32bp}{53.82bp}} +{{PointersBug}{128.32bp}{51.94bp}} +{{PointersDOA}{136.99bp}{51.48bp}} +{{PointersFYEO}{128.32bp}{48.60bp}} +{{PointersFix}{145.60bp}{58.11bp}} +{{PointersNuke}{128.32bp}{52.30bp}} +{{PointersOptimize}{128.32bp}{48.60bp}} +{{PointersRedFlag}{128.32bp}{57.12bp}} +{{PointersValidate}{128.32bp}{48.60bp}} +{{PointersWarning}{128.32bp}{57.23bp}} +{{PointersWhen}{128.32bp}{63.79bp}}\do{% + \expandafter\getargsiii\ap@dimen + \ap@csarg\edef{ap@\ap@argi Width}{\ap@argii}% + \ap@csarg\edef{ap@\ap@argi Height}{\ap@argiii}% +} +% \end{macrocode} +% \subsection{Default dimensions of Free Text annotation} +% \begin{macrocode} +\def\ap@FreeTextWidth{144bp} +\def\ap@FreeTextHeight{72bp} +% \end{macrocode} +% \begin{macro}{\makeStamp} +% A command to help the creation of custom stamps using graphicxsp. You've got to see it +% to believe it. +% \begin{macrocode} +\newcommand{\makeStamp}[3]{% +\ap@csarg\def{stamp@#2}{% + \begin{sp@createImage}{#1}{#2\the\ap@cusstamp@cnt} + \ap@add@ops#3 + \end{sp@createImage}}} +\let\ap@add@ops\@empty +% \end{macrocode} +% \end{macro} +% This command is used internal in \cs{annotpro} to generate an appearance for +% the stamp. +% \begin{macrocode} +\newcommand{\ap@useStamp}[1]{% + \global\advance\ap@cusstamp@cnt1\relax + \@nameuse{stamp@#1}} +% \end{macrocode} +% \begin{macro}{\setAnnotOptions} +% A command for setting global options. +% \begin{macrocode} +\newcommand{\setAnnotOptions}[1]{% + \setkeys{annotpro}{#1}% +} +% \end{macrocode} +% \end{macro} +% The following code is taken from the \textsf{datetime} package (and modified) as maintained by +% Nicola Talbot. There is no need for the whole package, we just need +% \cs{pdfdate}, named \cs{ap@pdfdate} in \textsf{annot\_pro}. We make all calculations in a group. +%\changes{v1.0a}{2011/07/14}{Added \cs{ap@pdfdate}} +% \begin{macrocode} +\begingroup +\def\withoptz@#1{\ifnum#1<10 0\fi\the#1} +\edef\ap@pdfdate{\the\year\withoptz@\month\withoptz@\day} +% \end{macrocode} +% Calculate the minutes after the hour time by dividing by 60. +% \begin{macrocode} +\count0=\time \count2=\count0 +% \end{macrocode} +% Calculate the number of hours after midnight by dividing by 60 +% \begin{macrocode} +\divide\count2by60 +\edef\ap@pdfdate{\ap@pdfdate\withoptz@{\count2}} +\multiply\count2by60 \advance\count0by-\count2 +\xdef\ap@pdfdate{\ap@pdfdate\withoptz@{\count0}00} +\endgroup +% \end{macrocode} +% \section{The main code} +% \begin{macrocode} +\newcount\ap@annot@cnt +\newcount\ap@cusstamp@cnt +{\catcode`\#=12\gdef\ap@signalCustomAP{#}} +\def\pStamp#1{\ap@signalCustomAP#1} +% \end{macrocode} +% \begin{macrocode} +\def\ap@RV@Body{<?xml version="1.0"?><body % + xfa:APIVersion="Acrobat:9.5.5" % + xfa:contentType="text/html" % + xfa:spec="2.0.2" xmlns="http://www.w3.org/1999/xhtml" % + xmlns:xfa="http://www.xfa.org/schema/xfa-data/1.0/">} +\def\ap@RV@endBody{<body>} +% \end{macrocode} +% The implementation of rich text in a FreeText annotation is a little different from +% that of a rich text form field. We made some adjustments here for an annotation. +% \begin{macrocode} +\def\ap@sub#1{\rvorvstring{<span style="vertical-align:-0.0pt;">#1</span>}{#1}}% +\def\ap@sup#1{\rvorvstring{<span style="vertical-align:+0.0pt;">#1</span>}{#1}}% +\def\ap@uDec#1{\rt@amp\rt@hashtag#1;} +\def\ap@uHex#1{\rt@amp\rt@hashtag x#1;} +\def\ap@afterParaFont{% +% \end{macrocode} +% Cancel out certain attributes that are not used in annotation. +% \begin{macrocode} + \rt@formfieldfalse +} +\def\ap@afterFont{% + \rt@formfieldfalse + \let\rt@url\@empty +} +% \end{macrocode} +% \begin{environment}{textboxpara} +% \begin{macrocode} +\newenvironment{textboxpara}{% + \let\rt@sub\ap@sub\let\rt@sup\ap@sup + \let\rt@afterParaFont\ap@afterParaFont + \let\rt@afterFont\ap@afterFont + \def\rt@br{\rvorvstring{\rt@amp\rt@hashtag13;}{\string\r}}% + \def\rt@spc{\space}\let\uDec\ap@uDec\let\uHex\ap@uHex +}{} +% \end{macrocode} +% \end{environment} +% \begin{macro}{\annotpro} +% Here is the main command of this package, the first optional parameter +% are key-value pairs, as defined above; the second parameter is the content +% of the message. File attachments have not popup message, so the content +% becomes the description of the attachment in the attachments panel; hence, +% in this case, the length of the message should be short. +% \begin{macrocode} +\newcommand{\annotpro}{% + \begingroup +% \end{macrocode} +% Some of the stamp names begin with \texttt{\#}, the user must use +% \verb!\#! +% \begin{macrocode} + \let\#\ap@signalCustomAP + \@nnotpro +} +\newcommand{\@nnotpro}[1][]{% +% \end{macrocode} +% Increment a global counter, to count the annots as we create them. +% \begin{macrocode} + \global\advance\ap@annot@cnt1\relax +% \end{macrocode} +% Process options +% \begin{macrocode} + \setkeys{annotpro}{#1}% + \@nn@tpro +} +\newcommand{\@nn@tpro}[1] +{% +% \end{macrocode} +% See if there were any presets, if so, expand them, and apply +% \cs{setkeys} again. +% \begin{macrocode} + \ifx\annotpro@presets\@empty\else + \edef\ap@exp@tmp{\noexpand\setkeys{annotpro}{\annotpro@presets}}% + \ap@exp@tmp\fi +% \end{macrocode} +% If no type was specified, assume \texttt{Text}. +% \cs{setkeys} again. +% \begin{macrocode} + \ifx\ap@type\@empty\def\ap@type{Text}\def\ap@save@type{0}\fi +% \end{macrocode} +% Now get the value of the name parameter, permissible values depend +% on the stated \texttt{type}. +% \begin{macrocode} + \ifcase\ap@save@type\relax + \def\annot@subtype{annnotprotext}% + \ifx\annotpro@subject\@empty\def\annotpro@subject{Sticky Note}\fi + \ifx\annotpro@name\@empty\def\annotpro@name{Note}\fi + \def\ap@def@name{Note}\or + \ifx\annotpro@subject\@empty\def\annotpro@subject{Rubber Stamp}\fi + \def\annot@subtype{annnotprostamp}% + \def\ap@def@name{Draft}\or + \ifx\annotpro@subject\@empty + \def\annotpro@subject{File Attachment}\fi + \def\annot@subtype{annnotprofileattach}% + \def\ap@def@name{PushPin}\or + \ifx\annotpro@subject\@empty + \def\annotpro@subject{Text Box}\fi + \def\annot@subtype{annotprofreetext}% + \def\ap@def@name{FreeText}% + \fi +% \end{macrocode} +% Get the name! +% \begin{macrocode} + \edef\ap@exp@tmp{% + \noexpand\setkeys{\annot@subtype}{name=\annotpro@name}}% + \ap@exp@tmp\xdef\ap@def@type{\ap@type}% +% \end{macrocode} +% Encode text for contents, title, subject, and color; here \textsf{hyperref} +% commands are used. +% \begin{macrocode} + \let\annotpro@enc@contents\@empty +% \end{macrocode} +% \changes{v1.0b}{2012/11/10}{Included \cs{makespecialJS}} +% We'll use \cs{makespecialJS} here. +% \begin{macrocode} + \makespecialJS +% \end{macrocode} +% If this is a FreeText annot, we get the rich text and default style from \texttt{\#1}. +% Supported keys are richtext and defstyle. The values of these keys are names defined +% by \cs{setRVVContents} and \cs{setDefaultStyle}. If \texttt{defstyle} is not specified, we +% use \cs{useDefaultDS}. +% \begin{macrocode} +\if\ap@save@type\ap@freetext@type + \let\eq@RV@Body\ap@RV@Body\let\eq@RV@endBody\ap@RV@endBody + \setkeys{annotprofreetext}{#1}% + \ifx\annotpro@@ds\@empty + \def\ap@defaultstyle{\useDefaultDS}\else + \edef\ap@defaultstyle{\noexpand\useDS{\annotpro@@ds}}\fi + \ifx\annotpro@@rt\@empty + \let\annotpro@RC\@empty\let\annotpro@C\@empty\else + \edef\annotpro@RC{\noexpand\useRVContent{\annotpro@@rt}}% + \edef\annotpro@C{\noexpand\useVContent{\annotpro@@rt}}\fi +% \end{macrocode} +% If this is a FreeText annot, we define its rich and plain values; requires \pkg{richtext} package +% \begin{macrocode} +\else + \pdfstringdef\annotpro@enc@contents{#1}% +\fi + \let\annotpro@enc@title\@empty + \pdfstringdef\annotpro@enc@title{\annotpro@title}% + \let\annotpro@enc@subject\@empty + \pdfstringdef\annotpro@enc@subject{\annotpro@subject}% +% \end{macrocode} +% Color handling for \texttt{color}, \texttt{bgcolor}, and \texttt{bcolor} via \pkg{hycolor} package +% \begin{macrocode} + \HyColor@XZeroOneThreeFour{\annotpro@color}% + {\annotpro@enc@color}{annotpro}{color}% +\ifx\annotpro@bgcolor\@empty\else + \HyColor@XZeroOneThreeFour{\annotpro@bgcolor} + {\annotpro@enc@bgcolor}{annotpro}{bgcolor}\fi +\ifx\annotpro@bcolor\@empty + \edef\annotpro@bcolor{\annotpro@def@bcolor}\fi + \HyColor@FieldColor{\annotpro@bcolor} + {\annotpro@enc@bcolor}{annotpro}{bcolor}% +% \end{macrocode} +% Initialize some commands to be used later +% \begin{macrocode} + \let\ap@this@AP\@empty\let\ap@this@FS\@empty\let\ap@this@CA\@empty + \let\ap@this@Rotate\@empty +% \end{macrocode} +% See if opacity is requested, and set appropriate key. +% \begin{macrocode} + \ifx\annotpro@opacity\@empty\else + \def\ap@this@CA{/CA \annotpro@opacity}\fi +% \end{macrocode} +% Now, perform annotation specific tasks such as setting the +% bounding box. +% \begin{macrocode} + \ifcase\ap@save@type +% \end{macrocode} +% \textbf{Text annotation.} We use the pre-defined dimensions for +% these text icons, unless the user has specified \texttt{nohspace}, +% \texttt{novspace}, and \texttt{nospace}. If the name has not been +% specified, we use the default (\texttt{Note}). +% \begin{macrocode} + \ifx\annotpro@@name\@empty\edef\annotpro@@name{\ap@def@name}\fi + \edef\ap@thisWidth{\ifx\annotpro@hspace\@empty + \@nameuse{ap@\annotpro@@name Width}\else + \annotpro@hspace\fi}% + \edef\ap@thisHeight{\ifx\annotpro@vspace\@empty + \@nameuse{ap@\annotpro@@name Height}\else + \annotpro@vspace\fi}% +% \end{macrocode} +% \textbf{Stamp annotation.} This is a bit trickier, there are three +% cases: (1) the user references a standard stamp; (2) the user +% references a non-standard stamp, one that ships with Acrobat; (3) +% the user wants to create his own custom stamp using +% \textsf{graphicxsp} techniques. +% \begin{macrocode} + \or + \ifx\annotpro@@name\@empty + \ifx\ap@custom@name\@empty + \ifx\ap@customstamp@name\@empty +% \end{macrocode} +% Neither \texttt{name} nor \texttt{customStamp} was specified, so we assume the default. +% \begin{macrocode} + \ifx\annotpro@@name\@empty + \edef\annotpro@@name{\ap@def@name}\fi + \edef\ap@thisWidth{\standardStampWidth}% + \edef\ap@thisHeight{\standardStampHeight}% + \else +% \end{macrocode} +% Here the user wants a stamp using \textsf{graphicxsp} techniques. +% \begin{macrocode} + \if\ap@graphicxsp0\PackageError{annot_pro}% + {Specifying a custom name for a stamp requires + the graphicxsp package.}\fi + \ifx\annotpro@ap\@empty + \PackageError{annot_pro}{You must specify a value + for the ap key}\fi + \def\ap@ImageRef{\annotpro@ap\the\ap@cusstamp@cnt}% + \expandafter\ap@useStamp\expandafter{\annotpro@ap}% +% \end{macrocode} +% After making many experiments, there seems to be a need to +% reduce dimensions by \texttt{2bp} so that the desired dimensions +% are displayed through the user interface. There seems to +% be an 1bp border around all stamps. +% \begin{macrocode} + \edef\ap@thisWidth{\widthOf{\ap@ImageRef}bp}% + \@tempdima=\ap@thisWidth\advance\@tempdima-2bp + \edef\ap@thisWidth{\the\@tempdima}% + \edef\ap@thisHeight{\heightOf{\ap@ImageRef}bp}% + \@tempdima=\ap@thisHeight\advance\@tempdima-2bp + \edef\ap@thisHeight{\the\@tempdima}% + \def\ap@this@AP{/AP << /N {\ap@ImageRef} >>}% + \edef\annotpro@@name{% + \ap@signalCustomAP\ap@customstamp@name}% + \fi + \else +% \end{macrocode} +% The command \cs{ap@custom@name} is non-empty, so the user it trying +% to access a stamp on his own system. The user has indicated one of +% the stamps documented in the PDF Reference, these all have the same +% dimension +% +% For the bounding box, we use \cs{defaultStampWidth} by +% \cs{defaultStampHeight} as the dimensions, unless the values of +% \texttt{width} and/or \texttt{height} are specified. +% \begin{macrocode} + \edef\annotpro@@name{\ap@custom@name}% + \@ifundefined{ap@\ap@custom@name Width}{% + \edef\ap@thisWidth{\ifx\annotpro@width\@empty + \defaultStampWidth\else\annotpro@width\fi}% + \edef\ap@thisHeight{\ifx\annotpro@height\@empty + \defaultStampWidth\else\annotpro@height\fi}% + }{% + \edef\ap@thisWidth{\ifx\annotpro@width\@empty + \@nameuse{ap@\annotpro@@name Width}\else + \annotpro@width\fi}% + \edef\ap@thisHeight{\ifx\annotpro@height\@empty + \@nameuse{ap@\annotpro@@name Height}\else + \annotpro@height\fi}% + }% + \fi + \else +% \end{macrocode} +% This is the case of specifying one of the document stamps, as +% listed in the PDF Reference. +% \begin{macrocode} + \edef\ap@thisWidth{\standardStampWidth}% + \edef\ap@thisHeight{\standardStampHeight}% + \fi +% \end{macrocode} +% Let's use calc to allow for calculations on dimensions, +% with this, we can conveniently resize the box. +% \begin{macrocode} + \ifx\annotpro@scale\@empty + \ifx\annotpro@widthTo\@empty + \ifx\annotpro@heightTo\@empty\else % heightTo + \edef\ap@thisWidth{% + (\ap@thisWidth)*\noexpand + \ratio{\annotpro@heightTo}{\ap@thisHeight}}% + \edef\ap@thisHeight{\annotpro@heightTo}% + \fi + \else % widthTo + \edef\ap@thisHeight{% + (\ap@thisHeight)*\noexpand + \ratio{\annotpro@widthTo}{\ap@thisWidth}}% + \edef\ap@thisWidth{\annotpro@widthTo}% + \fi + \else %scale + \edef\ap@thisWidth{(\ap@thisWidth)*\noexpand + \real{\annotpro@scale}}% + \edef\ap@thisHeight{(\ap@thisHeight)*\noexpand + \real{\annotpro@scale}}% + \fi + \setlength{\@tempdima}{\ap@thisWidth}% + \edef\ap@thisWidth{\the\@tempdima}% + \setlength{\@tempdima}{\ap@thisHeight}% + \edef\ap@thisHeight{\the\@tempdima}% + \ifx\annotpro@rotate\empty\else + \def\ap@this@Rotate{/Rotate \annotpro@rotate}% + \ap@set@Rotate@BBox + \fi + \or +% \end{macrocode} +% \textbf{File Attachment annotation.} There are only a few icons for +% file attachments, and I've determined their dimensions using the user +% interface. So, we use those. +% +% If a name has not been specified, we use the default (\texttt{PushPin}). +% \begin{macrocode} + \ifx\annotpro@@name\@empty\edef\annotpro@@name{\ap@def@name}\fi + \ifx\annotpro@file\@empty\PackageError{annot_pro}% + {You must specify a path the file to be + attached using the file key.}\fi +% \end{macrocode} +% Set the \textbf{FS} key to specify the file. +% \begin{macrocode} + \def\ap@this@FS{/FS {apEmbedFile\the\ap@annot@cnt}}% + \edef\ap@thisWidth{\@nameuse{ap@\annotpro@@name Width}}% + \edef\ap@thisHeight{\@nameuse{ap@\annotpro@@name Height}}% + \ap@EmbedThisFile + \or +% \end{macrocode} +% \textbf{Free text annotation.} +% \begin{macrocode} + \ifx\annotpro@@name\@empty\edef\annotpro@@name{\ap@def@name}\fi + \ifx\annotpro@width\@empty\else + \setlength\@tempdima{\annotpro@width}% + \def\annotpro@width{\the\@tempdima}\fi + \edef\ap@thisWidth{\ifx\annotpro@width\@empty + \@nameuse{ap@\annotpro@@name Width}\else + \annotpro@width\fi}% + \ifx\annotpro@height\@empty\else + \setlength\@tempdima{\annotpro@height}% + \def\annotpro@height{\the\@tempdima}\fi + \edef\ap@thisHeight{\ifx\annotpro@height\@empty + \@nameuse{ap@\annotpro@@name Height}\else + \annotpro@height\fi}% + \fi +% \end{macrocode} +% if \texttt{margin} is specified, we insert a \cs{marginpar} here. +% \begin{macrocode} + \ifx\annotpro@margin\@empty\let\apmargintext\@empty + \expandafter\relax\else\expandafter\marginpar\fi +% \end{macrocode} +% Set the bounding box, and layout the annotation using the \textbf{pdfmark} operator. +% \begin{macrocode} + {\pdf@rect{\ap@Bbox{\ap@thisWidth}{\ap@thisHeight}}\literalps@out{% + [ \eq@objdef\ap@Rect + /F 4\ap@readonly + /Open \annotpro@open + /Title (\annotpro@enc@title) + /Subj (\annotpro@enc@subject) +% \end{macrocode} +% We have different set of keys for FreeText when for the other annotation types. +% \begin{macrocode} +\if\ap@save@type\ap@freetext@type +% \end{macrocode} +% The definitions of \cs{eq@RV@Body} and \cs{eq@RV@endBody} come from \pkg{richtext}, originally from +% \pkg{eforms}. The \psf{RC} and \psf{Contents} keys get their entries from \cs{annotpro@RC} and +% \cs{annotpro@C}, which are acquired from the \pkg{richtext} package. +% \begin{macrocode} + /RC(\eq@RV@Body\annotpro@RC\eq@RV@endBody) + /Contents (\annotpro@C) + /DS (\ap@defaultstyle) + \ifx\annotpro@bgcolor\@empty\else + /C [\annotpro@enc@bgcolor]\fi + /DA (\annotpro@enc@bcolor\space/Helv 12 Tf) + \ap@border@code +\else + /Open \annotpro@open + /Contents (\annotpro@enc@contents) + /Color [\annotpro@enc@color] +\fi +% \end{macrocode} +% \changes{v1.0a}{2011/07/14}{Changed the value of the \texttt{/Name} key.} +% Changed the value of \texttt{/Name} form a name to a string +% \begin{macrocode} + /Name (\annotpro@@name) + /Subtype/\ap@type + /NM (annotpro\the\ap@annot@cnt) + /M (D:\ap@pdfdate) + \ap@this@AP\ap@this@FS\ap@this@CA\ap@this@Rotate + /ANN pdfmark}\apmargintext}% + \to@insertStrucTabOrder{Annot}\endgroup +} +% \end{macrocode} +% \end{macro} +% When the user specifies the rotate key, we need to enlarge the +% bounding box so the stamp can be rotated within that box. +% \begin{macrocode} +\def\ap@set@Rotate@BBox{% + \CalculateSin\annotpro@rotate\CalculateCos\annotpro@rotate + \edef\c@cos{\UseCos\annotpro@rotate}% + \edef\c@sin{\UseSin\annotpro@rotate}% +% \end{macrocode} +% Determine the quadrant i or iii versus ii or iv +% \begin{macrocode} + \@tempdimb=\c@cos pt + \@tempdimb=\c@sin\@tempdimb + \let\ap@sign\@empty + \ifdim\@tempdimb<\z@\def\ap@sign{-}\fi +% \end{macrocode} +%What we are doing is calculating the \emph{smallest rectangle} whose sides are parallel +%to the horizontal and vertical, that contained the rotated stamp. We use this computed +%rectangle as the bounding rectangle of the rectangle. +% +%The basic algorithm is as follows: +% If the angle is in the first or third quadrant, we use +%\begin{align*} +% \text{width} &=\text{width}'\cos(\theta)+\text{height}'\sin(\theta)\\ +% \text{height} &=\text{width}'\sin(\theta)+\text{height}'\cos(\theta) +%\end{align*} +%else, we use +%\begin{align*} +% \text{width} &=-\text{width}'\cos(\theta)+\text{height}'\sin(\theta)\\ +% \text{height}&=\text{width}'\sin(\theta)-\text{height}'\cos(\theta) +%\end{align*} +% where, $\text{width}'$ and $\text{height}'$ are the original width and height of the bounding rectangle, +% and $\text{width}$ and $\text{height}$ are the new dimensions of the rectangle, after rotation through +% an angle of $\theta$. +% \paragraph*{Width calculation.} Width held in \cs{ap@temp@thisWidth}. +% \begin{macrocode} + \@tempdima=\ap@sign\ap@thisWidth + \@tempdima=\c@cos\@tempdima + \@tempdimb=\ap@thisHeight + \@tempdimb=\c@sin\@tempdimb + \advance\@tempdima by\@tempdimb + \edef\ap@temp@thisWidth{\the\@tempdima}% +% \end{macrocode} +% \paragraph*{Height calculation.} Final height held is \cs{@tempdima}. +% \begin{macrocode} + \@tempdima=\ap@thisWidth + \@tempdima=\c@sin\@tempdima + \@tempdimb=\ap@thisHeight + \@tempdimb=\c@cos\@tempdimb + \advance\@tempdima by\ap@sign\@tempdimb +% \end{macrocode} +% Any negative dimensions are changed to positive. +% \begin{macrocode} + \@tempdimb=\ap@temp@thisWidth\relax + \ifdim\@tempdimb<\z@\@tempdimb=-\the\@tempdimb\fi + \ifdim\@tempdima<\z@\@tempdima=-\the\@tempdima\fi +% \end{macrocode} +% Here are the final calculations, \cs{ap@thisWidth} and \cs{ap@thisHeight}. +% \begin{macrocode} + \edef\ap@thisWidth{\the\@tempdimb}% + \edef\ap@thisHeight{\the\@tempdima}% +} +% \end{macrocode} +% Some code for embedding a file in the PDF document. +% \begin{macrocode} +\def\ap@EmbedThisFile{% + \literalps@out{% + [ /_objdef {apEmbedFile\the\ap@annot@cnt}/type/dict/OBJ pdfmark + [ {apEmbedFile\the\ap@annot@cnt} << + /F (\ap@thisFileName) + /UF (\ap@thisFileName) + /EF << /F {apFileStream\the\ap@annot@cnt} >> + /Type/Filespec + >> /PUT pdfmark}% + \literalps@out{% + [ /_objdef {apFileStream\the\ap@annot@cnt}/type/stream/OBJ pdfmark + [ {apFileStream\the\ap@annot@cnt} (\annotpro@file) + (r) file /PUT pdfmark + [ {apFileStream\the\ap@annot@cnt} << + /Type/EmbeddedFile + >> /PUT pdfmark + [ {apFileStream\the\ap@annot@cnt} /CLOSE pdfmark}% +} +% \end{macrocode} +% Set global options for this package. +% \begin{macrocode} +\setAnnotOptions{title,subject,open=false,color} +%</package> +% \end{macrocode} +% \Finale +\endinput |