diff options
Diffstat (limited to 'Master/texmf-dist/tex/context/base/spec-fdf.tex')
-rw-r--r-- | Master/texmf-dist/tex/context/base/spec-fdf.tex | 3314 |
1 files changed, 0 insertions, 3314 deletions
diff --git a/Master/texmf-dist/tex/context/base/spec-fdf.tex b/Master/texmf-dist/tex/context/base/spec-fdf.tex deleted file mode 100644 index 51da45ff7a6..00000000000 --- a/Master/texmf-dist/tex/context/base/spec-fdf.tex +++ /dev/null @@ -1,3314 +0,0 @@ -%D \module -%D [ file=spec-fdf, -%D version=1998.05.18, -%D title=\CONTEXT\ \PDF\ Macros, -%D subtitle=Support Macros, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] -%C -%C This module is part of the \CONTEXT\ macro||package and is -%C therefore copyrighted by \PRAGMA. See mreadme.pdf for -%C details. - -%D The name of this module is a bit strange but it started with fields -%D so we keep the name. - -%D When dealing with resources, we share the resource dictionaries -%D between all xforms. This is inefficent in the sense that when no -%D resources are used, redundant entries take space, but on the other -%D hand we save redundant dictionaries so it's a nice compromise. Maybe -%D that in \LUATEX\ I will reimplement most of the code here anyway. - -%D We need to check if we can use \type {\driverreferenced} -%D object in more places. - -%D Initialization of fields is tricky. If a field has no -%D value, it is kind of not there. If ResetForm is used, the -%D default is assigned, but pushbuttons are spoiled. Adding a -%D \type {/MK} dictionary helps, but gives ugly down -%D appearances (displaced with background). What a mess. -%D Also, in order to get at least something, the \type {/AS} -%D key should be provided. - -% to do : /IF << /SW /N >> == no scaling / clipping of widget - -\unprotect - -%D \macros -%D {PDFobjref} -%D -%D Just a shortcut. - -% Watch out, \def\PDFobjref#1{\purenumber#1 0 R} also works, but not when -% #1 == \the\whatever - -\def\PDFobjref#1{\purenumber{#1} 0 R} - -%D \macros -%D {PDFswapdir} - -\let\PDFswapdir\empty \def\PDFswapdir{\ifcase\inlinedirection\or\or-\fi} - -% the pdf spec changed cq. viewers started behaving differently / 5+ - -\chardef\overcomePDFpage\plusone % page numbers/ beware: optimizers remove this one -\chardef\overcomePDFpage\plustwo % page:number -%chardef\overcomePDFpage\plusthree % pdftex page ref feature - -\ifx\pdfpageref\undefined \else \chardef\overcomePDFpage\plusthree \fi - -%D \macros -%D {setPDFdestination} -%D -%D \PDF\ destinations should obey the specifications laid down -%D in the \PDF\ reference manual. The next macro strips illegal -%D characters from the destination name. -%D -%D The \ACROBAT\ programs are not bug free. By setting the next -%D switches, we will at least try to prevent problems. - -\newif\ifovercomePDFbugs \overcomePDFbugsfalse % dest sort problem / 3- -\newif\ifovercomePDFspace \overcomePDFspacetrue % dest sort problem / 3- - -\let\setPDFdestination\gobbleoneargument % a MK specific definition - -%D \macros -%D {sanitizePDFstring} -%D -%D This macro at least tries to convert a arbitrary string -%D into a sequence of characters valid for \PDF\ bookmarks and -%D alike. - -\def\sanitizePDFstring#1\to#2{} - -%D \macros -%D {doPDFdestination, -%D doPDFaction, -%D doPDFannotation, -%D doPDFannotationobject, -%D doPDFdictionaryobject, -%D doPDFarrayobject, -%D doPDFaddtocatalog, -%D doPDFaddtoinfo, -%D doPDFpageattribute, -%D doPDFpageresource, -%D doPDFpagesattribute, -%D doPDFbookmark, -%D defaultobjectreference, -%D doPDFgetobjectreference} -%D -%D This module deals with \PDF\ support, including fill||in -%D forms. Before we present the largely unreadable bunch of -%D macros, we introduce the here||not||defined low level -%D interface macros. These must be provided by the special -%D drivers \type{pdf} (\ACROBAT) and \type{tpd} (\PDFTEX). -%D -%D \starttyping -%D \doPDFdestination #1 name -%D \doPDFaction #1#2#3 width height action -%D \doPDFannotation #1#2#3 width height data -%D \doPDFannotationobject #1#2#3#4#5 class name width height data -%D \doPDFdictionaryobject #1#2#3 class name data -%D \doPDFarrayobject #1#2#3 class name data -%D \doPDFaddtocatalog #1 -%D \doPDFaddtoinfo #1 -%D \doPDFpageattribute #1 -%D \doPDFpageresource #1 -%D \doPDFpagesattribute #1 -%D \doPDFbookmark #1#2#3#4#5 level n text page open -%D -%D \defaultobjectreference #1#2 class name -%D \doPDFgetobjectreference #1#2#3 class name \PDFobjectreference -%D \doPDFgetobjectpagereference #1#2#3 class name \PDFobjectreference -%D \stoptyping -%D -%D The keywords reflect their use. For the moment we stick to -%D keywords, because that way at we get an indication of what -%D we're doing. - -\startspecials[fdf] - -%D Common: - -% \def\doPDFgetobjectreference#1#2#3% -% {\def#3{..}} - -\def\doPDFgetobjectpage#1#2#3% - {\dogetobjectreferencepage{#1}{#2}#3% - \ifx#3\empty\def#3{1}\fi} - -\def\doPDFgetobjectpagereference#1#2#3% - {\dogetobjectreferencepage{#1}{#2}#3% - \ifx#3\empty - \doPDFgetpagereference\realfolio#3% - \else - \doPDFgetpagereference#3#3% we assume that #3 gets expanded - \fi} - -% \def\doPDFgetpagereference#1#2%%%%%%%%%%%%%%% -% {\def#2{...}} - -%D Due to the fact that \PDFTEX\ has a different concept of -%D page attributes, we need: - -\let\doPDFresetpageattributes\relax -\let\doPDFresetpageresources \relax - -\appendtoksonce - \doPDFresetpageattributes - \doPDFresetpageresources -\to \everyaftershipout - -\ifx\PDFcode\undefined - \ifx\pdfliteral\undefined - \def\PDFcode#1{\message{[ignored pdfliteral: #1]}} - \else - \let\PDFcode\pdfliteral - \fi -\fi - -%D For special (\METAPOST) effects, we need to build -%D resource dictionaries. Here is the framework. - -\let\docuPDFextgstates\empty -%let\pagePDFextgstates\empty - -\def\checkPDFextgstates - {\ifx\docuPDFextgstates\empty \else - \ifnum\realpageno=\lastpage\relax - %\doPDFreserveddictionaryobject{FDF}{docuextgstates}{\docuPDFextgstates}% - \doPDFdictionaryobject{FDF}{docuextgstates}{\docuPDFextgstates}% - \fi - \doPDFgetobjectreference{FDF}{docuextgstates}\PDFobjectreference - \doPDFpageresource{/ExtGState \PDFobjectreference}% - \fi} - -\appendtoksonce - \checkPDFextgstates -\to \everyshipout - -\def\appendtoPDFdocumentextgstates#1% - {\xdef\docuPDFextgstates{\docuPDFextgstates\space#1}} - -%D Another special mechanism (needed for color separation): - -\let\docuPDFcolorspaces\empty - -\def\checkPDFcolorspaces - {\ifx\docuPDFcolorspaces\empty \else - \ifnum\realpageno=\lastpage\relax - %\doPDFreserveddictionaryobject{FDF}{colorspaces}{\docuPDFcolorspaces}% - \doPDFdictionaryobject{FDF}{colorspaces}{\docuPDFcolorspaces}% - \fi - \doPDFgetobjectreference{FDF}{colorspaces}\PDFobjectreference - \doPDFpageresource{/ColorSpace \PDFobjectreference}% - \fi} - -\appendtoksonce - \checkPDFcolorspaces -\to \everyshipout - -\def\appendtoPDFdocumentcolorspaces#1% - {\xdef\docuPDFcolorspaces{\docuPDFcolorspaces\space#1}} - -%D And another one (used to be in spec-pdf) - -\let\docuPDFshades\empty - -\def\checkPDFshades - {\ifx\docuPDFshades\empty \else - \ifnum\realpageno=\lastpage\relax - %\doPDFreserveddictionaryobject{FDF}{docushades}{\docuPDFshades}% - \doPDFdictionaryobject{FDF}{docushades}{\docuPDFshades}% - \fi - \doPDFgetobjectreference{FDF}{docushades}\PDFobjectreference - \doPDFpageresource{/Shading \PDFobjectreference}% - \fi} - -\appendtoksonce - \checkPDFshades -\to \everyshipout - -\def\appendtoPDFdocumentshades#1% - {\xdef\docuPDFshades{\docuPDFshades\space#1}} - -%D \macros -%D {doPDFsetupscreen,doPDFsetupidentity} -%D -%D Opposite to \DVI\ drivers, \PDF\ ones must know which what -%D page dimensions they are dealing. We also use the -%D opportunity to launch full screen (1) or show bookmarks (2). - -\let\currentPDFpagemode \empty % document catalog -\let\currentPDFviewerprefs\empty % document catalog - -\let\currentPDFcropbox \empty % page attributes -\let\currentPDFbleedbox \empty % page attributes -\let\currentPDFartbox \empty % page attributes -\let\currentPDFtrimbox \empty % page attributes - -\def\doPDFsetupscreen#1#2#3#4#5#6% watch the extra argument - {\bgroup -% \!!widtha#4% -% \advance\!!widtha#2% -% \!!heighta-#5% -% \!!heightb#1% extra argument -% \advance\!!heightb -#3% -% \advance\!!heighta \!!heightb -% % sometimes whole values give better results -% % \PointsToWholeBigPoints{#2}\left -% % \PointsToWholeBigPoints\!!heighta\bottom -% % \PointsToWholeBigPoints\!!widtha \width -% % \PointsToWholeBigPoints\!!heightb\height -% % but since pdf/x does not round when checking if -% % the boxes fit inside the media box ... -% \PointsToBigPoints{#2}\left -% \PointsToBigPoints\!!heighta\bottom -% \PointsToBigPoints\!!widtha \width -% \PointsToBigPoints\!!heightb\height -% \xdef\currentPDFcropboxspec -% {[\left\space\bottom\space\width\space\height]}% -% \global\let\currentPDFtrimboxspec\currentPDFcropboxspec -% -% \xdef\currentPDFpagemode -% {/PageMode \ifcase#6 -% /UseNone\or/FullScreen\or/UseOutlines\else/UseNone\fi}% -% - \xdef\currentPDFpagemode - {\ifnum#6=4 - /PageLayout /TwoColumnRight - \else - /PageMode \ifcase#6 - /UseNone\or/FullScreen\or/UseOutlines\else/UseNone\fi - \fi}% - \xdef\currentPDFviewerprefs % space after #6 needed, else \relax - {\ifcase#6 \or\or\else /ViewerPreferences << /FitWindow true >>\fi}% - \egroup} - -% not that good if we switch drivers - -\def\addPDFdocumentinfo - {\doPDFaddtocatalog{\currentPDFpagemode\currentPDFviewerprefs}% - \doPDFaddtocatalog{/Version \ifdim\PDFversion00\points>100\points 1.\fi\PDFversion}% - \doPDFaddtoinfo{/Trapped /False}% - \doPDFaddtoinfo{/ConTeXt.Version (\contextversion)}% - \doPDFaddtoinfo{/ConTeXt.Time (\number\normalyear.\twodigits\normalmonth.\twodigits\normalday\space \twodigits\currenthour:\twodigits\currentminute)}% - \doPDFaddtoinfo{/ConTeXt.Jobname (\jobname)}% - \doPDFaddtoinfo{/ConTeXt.Url (www.pragma-ade.com)}} - -\appendtoksonce % hack to prevent duplicates - \addPDFdocumentinfo -\to \everyfirstshipout - -\def\PDFversion{1.5} - -\appendtoksonce - \def\PDFversion{1.5}% - \let\addPDFdocumentinfo\relax -\to \everyresetspecials - -\def\doPDFsetupwhateverbox#1#2#3#4#5#6% watch the extra arguments - {\bgroup - \!!widtha \dimexpr#5+#3\relax - \!!heightb\dimexpr#2-#4\relax - \!!heighta\dimexpr\!!heightb-#6\relax - % sometimes whole values give better results - % \PointsToWholeBigPoints{#3}\left - % \PointsToWholeBigPoints\!!heighta\bottom - % \PointsToWholeBigPoints\!!widtha \width - % \PointsToWholeBigPoints\!!heightb\height - % but since pdf/x does not round when checking if - % the boxes fit inside the media box ... - \PointsToBigPoints{#3}\left - \PointsToBigPoints\!!heighta\bottom - \PointsToBigPoints\!!widtha \width - \PointsToBigPoints\!!heightb\height - \xdef#1{[\left\space\bottom\space\width\space\height]}% - \egroup} - -\def\doPDFsetupartbox {\doPDFsetupwhateverbox\currentPDFartbox } -\def\doPDFsetupcropbox {\doPDFsetupwhateverbox\currentPDFcropbox } -\def\doPDFsetupbleedbox{\doPDFsetupwhateverbox\currentPDFbleedbox} -\def\doPDFsetuptrimbox {\doPDFsetupwhateverbox\currentPDFtrimbox } - -\gdef\currentPDFtrimbox{\currentPDFcropbox} % default, needed for pdf/x - -\def\flushPDFwhateverbox#1#2% - {\doifsomething{#1}{\doPDFpageattribute{/#2Box #1}}} - -\appendtoksonce - \flushPDFwhateverbox\currentPDFartbox {Art}% - \flushPDFwhateverbox\currentPDFcropbox {Crop}% - \flushPDFwhateverbox\currentPDFbleedbox{Bleed}% - \flushPDFwhateverbox\currentPDFtrimbox {Trim}% -\to \everyshipout - -\def\doPDFsetupidentity#1#2#3#4#5#6% - {\bgroup - \enablePDFdocencoding - \edef\!!stringa{#5}% - \ifx\!!stringa\empty \ifx\pdfdate\undefined\else - \edef\!!stringa{D:\pdfdate}% - \fi \fi - \expanded{\doPDFaddtoinfo - {/Title (#1) - /Subject (#2) - /Author (#3) - /Creator (#4) - /ModDate (\!!stringa) - /ID (\jobname.\!!stringa) % needed for pdf/x - /Keywords (#6)}}% - \egroup} - -%D \macros -%D {doPDFsetupopenaction,doPDFsetupcloseaction, -%D doPDFsetupopenpageaction,doPDFsetupclosepageaction} -%D -%D Setting the open and close actions is kind of fuzzy -%D because action chains are derived from the reference -%D mechanism. - -%D Starting with version~5 viewers, when the open actions -%D started yto give problems, for testing purposes we -%D decided use indirect actions. - -% \definespecial\dosetupopenaction {\doPDFsetupopenaction} -% \definespecial\dosetupcloseaction {\doPDFsetupcloseaction} -% \definespecial\dosetupopenpageaction {\doPDFsetupopenpageaction} -% \definespecial\dosetupclosepageaction{\doPDFsetupclosepageaction} - -\let\lastPDFaction\empty - -%D We can safe a couple of references by moving this code -%D to the specific drivers. -%D -%D The following code used to work okay, but as with any -%D update of Acrobat Viewers, upward compatibility was -%D just a dream. - -\definespecial\dosetupopenaction {\doPDFaddtocatalog{/OpenAction <<\lastPDFaction>>}} -\definespecial\dosetupcloseaction{\doPDFaddtocatalog{/CloseAction <<\lastPDFaction>>}} - -% todo: /AA << dictionary in catalog >> - -% \globalletempty\PDFdocumentclose -% \globalletempty\PDFwillsave -% \globalletempty\PDFdidsave -% \globalletempty\PDFwillprint -% \globalletempty\PDFdidprint - -% \definespecial\dosetupdocumentcloseaction {\global\let\PDFdocumentclose\lastPDFaction} -% \definespecial\dosetupwillsaveaction {\global\let\PDFwillsave \lastPDFaction} -% \definespecial\dosetupdidsaveaction {\global\let\PDFdidsave \lastPDFaction} -% \definespecial\dosetupwillprintaction {\global\let\PDFwillprint \lastPDFaction} -% \definespecial\dosetupdidprintaction {\global\let\PDFdidprint \lastPDFaction} - -% \def\checkPDFdocumentactions -% {\iflocation -% \doPDFpageattribute -% {/AA <<\ifx\PDFdocumentclose\empty \else /DC <<\PDFdocumentclose>> \fi -% \ifx\PDFwillsave \empty \else /WS <<\PDFwillsave >> \fi -% \ifx\PDFdidsave \empty \else /DS <<\PDFdidsave >> \fi -% \ifx\PDFwillprint \empty \else /WP <<\PDFwillprint >> \fi -% \ifx\PDFdidprint \empty \else /DP <<\PDFdidprint >> \fi>>}% -% % \globalletempty\PDFdocumentclose -% % \globalletempty\PDFwillsave -% % \globalletempty\PDFdidsave -% % \globalletempty\PDFwillprint -% % \globalletempty\PDFdidprint -% \global\let\checkPDFdocumentactions\relax -% \fi} - -% \appendtoksonce -% \checkPDFdocumentactions -% \to \everylastshipout - -%\def\doPDFsetupopenaction% -% {\doPDFdictionaryobject{FDF}{local:openaction}\lastPDFaction -% \doPDFgetobjectreference{FDF}{local:openaction}\PDFobjectreference -% \doPDFaddtocatalog{/OpenAction \PDFobjectreference}} -% -%\def\doPDFsetupcloseaction% -% {\doPDFdictionaryobject{FDF}{local:closeaction}\lastPDFaction -% \doPDFgetobjectreference{FDF}{local:closeaction}\PDFobjectreference -% \doPDFaddtocatalog{/CloseAction \PDFobjectreference}} - -\let\PDFopenpageaction \empty -\let\PDFclosepageaction\empty - -\definespecial\dosetupopenpageaction {\global\let\PDFopenpageaction \lastPDFaction} -\definespecial\dosetupclosepageaction{\global\let\PDFclosepageaction\lastPDFaction} - -\def\checkPDFpageactions - {\iflocation % important since direct -) - \donefalse - \ifx\PDFopenpageaction \empty\!!doneafalse\else\donetrue\!!doneatrue\fi - \ifx\PDFclosepageaction\empty\!!donebfalse\else\donetrue\!!donebtrue\fi - \ifdone - \doPDFpageattribute - {/AA <<\if!!donea/O <<\PDFopenpageaction >> \fi - \if!!doneb/C <<\PDFclosepageaction>> \fi>>}% - \fi - \global\let\PDFopenpageaction \empty - \global\let\PDFclosepageaction\empty - \fi} - -\appendtoksonce - \checkPDFpageactions -\to \everyshipout - -%D \macros -%D {doPDFstartthisislocation} -%D -%D Next we define the macros that deal with hyperreferencing, -%D graphic inclusion and general document features. These are -%D the olderst ones. I won't comment much because one needs -%D knowledge of \PDF\ itself, and explaning \PDF\ is beyond -%D this documentation. - -\def\doPDFstartthisislocation#1% - {\bgroup - \setPDFdestination{#1}% - %\doifsomething{\PDFdestination} - % {\doPDFdestination{\PDFdestination}}% - \ifx\PDFdestination\empty \else - \doPDFdestination{\PDFdestination}% - \fi - \egroup} - -%D \macros -%D {doPDFstartgotolocation, -%D doPDFstartgotorealpage, -%D doPDFstartgotoJS} -%D -%D The goto macros use the switch \type{\ifsecondaryreference} -%D to determine if actions should be linked. - -\def\locationfilesuffix{pdf} - -% \def\preparePDFlocationfile#1#2% -% {\setreferencefilename#1\to#2% -% \expanded{\doifnotinstring{.\locationfilesuffix}{#2}} -% {\edef#2{#2.\locationfilesuffix}}} -% -% \def\preparePDFlocationfile#1\to#2% -% {\setreferencefilename#1\to#2% -% \expanded{\doifnotinstring{.pdf}{#2}}{\edef#2{#2.pdf}}} - -\def\doPDFstartgotolocation#1#2#3#4#5#6% - {\bgroup - \doifelsenothing{#3} - {\setPDFdestination{#5}% - \doifelsenothing\PDFdestination - {\let\action\empty} - {\doifelsenothing{#4} - {\let\PDFfile\empty} - {\expanded{\beforesplitstring#4}\at.\to\PDFfile - \doifparentfileelse\PDFfile % {#4} - {\let\PDFfile\empty} - %{\setreferencefilename#4.\locationfilesuffix\to\PDFfile - {\@EA\setreferencefilename\PDFfile.\locationfilesuffix\to\PDFfile - \edef\PDFfile - {R /F (\PDFfile)\ifgotonewwindow\space/NewWindow true \fi}}}% - \edef\action% - {/S /GoTo\PDFfile\space /D (\PDFdestination)}}} - {\doifelsenothing{#4} - {\let\PDFfile\empty - \let\PDFdestination\empty} - {\setreferencefilename/#4\to\PDFfile - \setPDFdestination{#5}% - \doifsomething\PDFdestination - {\edef\PDFdestination{\URLhash\PDFdestination}}}% - \edef\action{/S /URI /URI (#3\PDFfile\PDFdestination)}}% - \ifx\action\empty\else - \ifsecondaryreference - \savesecondaryPDFreference\action - \else - \getsecondaryPDFreferences - \doPDFaction{\PDFswapdir#1}{#2}{\action \secondaryPDFreferences}% - \fi - \fi - \egroup} - -\def\PDFgotonewwindow{\ifgotonewwindow\space/NewWindow true \fi} - -% optimization in tpd driver -% -% \edef\PDFdestination{(page:\the\scratchcounter)}% -% -% ==> -% -% \advance\scratchcounter 1 -% \edef\PDFdestination{[\pdfpageref \PDFobjref\scratchcounter\PDFpageviewwrd]}% -% -% \doPDFgetpagedestination#1#2% pagenumber macro % % fuzzy hack - -\def\doPDFstartgotorealpage#1#2#3#4#5% watch the R append trick - {\bgroup - \doifelsenothing{#3}% #1 = url - {\scratchcounter0#5\relax - \ifnum\scratchcounter>0 - \doifelsenothing{#4} - {\let\PDFfile\empty} - {\expanded{\beforesplitstring#4}\at.\to\PDFfile - \doifparentfileelse\PDFfile % {#4} - {\let\PDFfile\empty} - %{\setreferencefilename#4.\locationfilesuffix\to\PDFfile - {\@EA\setreferencefilename\PDFfile.\locationfilesuffix\to\PDFfile - \edef\PDFfile{R /F (\PDFfile)\PDFgotonewwindow}}}% - \ifx\PDFfile\empty - \ifcase\overcomePDFpage - \or % pdf starts numbering at zero - \advance\scratchcounter \minusone - \edef\PDFdestination{[\the\scratchcounter\space\PDFpageviewwrd]}% - \or % pdf starts numbering at zero - \advance\scratchcounter \minusone - \edef\PDFdestination{(page:\the\scratchcounter)}% - \or % pdftex starts numbering at one - \edef\PDFdestination{[\pdfpageref\scratchcounter\space0 R \PDFpageviewwrd]}% - \fi - \else % across files it's a page number / pdf starts numbering at zero - \advance\scratchcounter \minusone - \edef\PDFdestination{[\the\scratchcounter\space\PDFpageviewwrd]}% - \fi - \edef\action{/S /GoTo\PDFfile\space /D \PDFdestination}% - \else - \let\action\empty - \fi} - {\doifelsenothing{#4} - {\let\PDFfile\empty} - {\setreferencefilename/#4\to\PDFfile}% - \edef\action{/S /URI /URI (#3\PDFfile)}}% - \ifx\action\empty\else - \ifsecondaryreference - \savesecondaryPDFreference\action - \else - \getsecondaryPDFreferences - \doPDFaction{\PDFswapdir#1}{#2}{\action \secondaryPDFreferences}% - \fi - \fi - \egroup} - -\let\lastfakedPDFpage\!!zerocount - -\def\fakePDFpagedestination % as in pdf, we start numbering at zero - {\iflocation \ifarrangingpages \ifnum\overcomePDFpage=\plustwo \else - \ifnum\lastfakedPDFpage<\realpageno - \bgroup - \xdef\lastfakedPDFpage{\realfolio}% - \advance\realpageno \minusone % is \expanded needed ? - \expanded{\doPDFdestination{page:\realfolio}}% - \egroup - \fi - \fi \fi \fi} - -\appendtoksonce - \fakePDFpagedestination -\to \everyshipout - -\def\doPDFstartgotoJS#1#2#3% - {\bgroup - \doPSsanitizeJScode#3\to\sanitizedJScode - \edef\action - {/S /JavaScript /JS (\sanitizedJScode)}% - \ifsecondaryreference - \savesecondaryPDFreference\action - \else - \getsecondaryPDFreferences - \doPDFaction{\PDFswapdir#1}{#2}{\action \secondaryPDFreferences}% - \fi - \egroup} - -%D \macros -%D {doPDFstartexecutecommand} -%D -%D At the cost of much auxiliary placeholders, we can pretty -%D fast convert the command asked for. This is how the \PDF\ -%D code looks like. - -\def\PDFmoviecode#1#2#3% - {/Movie - /T (\ifcase#1movie \else sound \fi\ifx\argumentA\empty#2\else\argumentA\fi) - /Operation /\ifcase#3Play\or Stop\or Pause\or Resume\fi\space} - -\def\PDFexecutestartmovie {\PDFmoviecode0\currentmovie0} -\def\PDFexecutestopmovie {\PDFmoviecode0\currentmovie1} -\def\PDFexecutepausemovie {\PDFmoviecode0\currentmovie2} -\def\PDFexecuteresumemovie {\PDFmoviecode0\currentmovie3} - -\def\PDFexecutestartsound {\PDFmoviecode1\currentsound0} -\def\PDFexecutestopsound {\PDFmoviecode1\currentsound1} -\def\PDFexecutepausesound {\PDFmoviecode1\currentsound2} -\def\PDFexecuteresumesound {\PDFmoviecode1\currentsound3} - -\def\PDFformcode#1% - {\doFDFiffieldset{#1}{/Field [\doFDFgetfieldset{#1}]}} - -% bit 3 = html -% bit 6 = xml -% bit 4 = get - -\ifx\PDFsubmitfiller\undefined \let\PDFsubmitfiller\empty \fi - -\chardef\PDFformmethod=1 % 0=GET 1=POST - -\def\PDFformflag#1#2{\ifcase\PDFformmethod#1\else#2\fi} - -\def\PDFexecuteimportform {/Named /N /AcroForm:ImportFDF} -\def\PDFexecuteexportform {/Named /N /AcroForm:ExportFDF} -\def\PDFexecuteresetform {/ResetForm \PDFformcode\argumentA} -\def\PDFexecutesubmitform {/SubmitForm \PDFformcode\argumentB - /Flags \ifcase\submitoutputformat\space - \PDFformflag{12} {4} % 0=unknown - \or \PDFformflag{12} {4} % 1=HTML - \or \PDFformflag {8} {0} % 2=FDF - \or \PDFformflag{40}{32} % 3=XML - \else \PDFformflag{12} {4} % ?=unknown - \fi - /F (\argumentA)\PDFsubmitfiller} - -% urifill permits url substitution - -\def\PDFexecutehide {/Hide /T (\argumentA) /H true} -\def\PDFexecuteshow {/Hide /T (\argumentA) /H false} - -\def\PDFexecutefirst {/Named /N /FirstPage} -\def\PDFexecuteprevious {/Named /N /PrevPage} -\def\PDFexecutenext {/Named /N /NextPage} -\def\PDFexecutelast {/Named /N /LastPage} -\def\PDFexecutebackward {/Named /N /GoBack} -\def\PDFexecuteforward {/Named /N /GoForward} -\def\PDFexecuteprint {/Named /N /Print} -\def\PDFexecuteexit {/Named /N /Quit} -\def\PDFexecuteclose {/Named /N /Close} -\def\PDFexecutesave {/Named /N /Save} -\def\PDFexecutesavenamed {/Named /N /SaveAs} -\def\PDFexecuteopennamed {/Named /N /Open} -\def\PDFexecutehelp {/Named /N /HelpUserGuide} -\def\PDFexecutetoggle {/Named /N /FullScreen} -\def\PDFexecutesearch {/Named /N /Find} -\def\PDFexecutesearchagain {/Named /N /FindAgain} -\def\PDFexecutegotopage {/Named /N /GoToPage} -\def\PDFexecutequery {/Named /N /AcroSrch:Query} -\def\PDFexecutequeryagain {/Named /N /AcroSrch:NextHit} -\def\PDFexecutefitwidth {/Named /N /FitWidth} -\def\PDFexecutefitheight {/Named /N /FitHeight} - -\let\PDFobjectclass\empty -\let\PDFobjectname \empty - -\def\doPDFstartexecutecommand#1#2#3#4% - {\doifdefined{PDFexecute#3} - {\bgroup - \@EA\dogetcommalistelement\@EA1\@EA\from#4\to\argumentA - \@EA\dogetcommalistelement\@EA2\@EA\from#4\to\argumentB - \edef\argument{#4}% - \edef\action% - {/S \getvalue{PDFexecute#3}}% - \ifsecondaryreference - \savesecondaryPDFreference\action - \else - \getsecondaryPDFreferences -% \ifx\PDFobjectclass\empty -% \let\next\doPDFaction -% \else -% \edef\next{\doPDFactionobject{\PDFobjectclass}{\PDFobjectname}}% -% \globalletempty\PDFobjectclass -% \globalletempty\PDFobjectname -% \fi -% \next - \doPDFaction{\PDFswapdir#1}{#2}{\action \secondaryPDFreferences}% - \fi - \egroup}} - -%D \macros -%D {doPDFstartrunprogram} -%D -%D Running programs is possible, but is non that portable, and -%D therefore dangerous. - -\def\doPDFstartrunprogram#1#2#3#4% new: #3 => #3#4 - {\bgroup - %\edef\string{#3}% - %\@EA\beforesplitstring\string\at{ }\to\program - %\@EA\aftersplitstring \string\at{ }\to\parameters - %\edef\action% - % {/S /Launch /F (\program) /P (\parameters) /D (.)}% - \edef\action - {/S /Launch /F (#3) /P (#4) /D (.)}% - \ifsecondaryreference - \savesecondaryPDFreference\action - \else - \getsecondaryPDFreferences - \doPDFaction{\PDFswapdir#1}{#2}{\action \secondaryPDFreferences}% - \fi - \egroup} - -%D \macros -%D {doPDFstartgotoprofile} -%D -%D Far from perfect, but nevertheless present, is the profile -%D handler. We want to misuse article threads for reder -%D profiles. - -\def\doPDFstartgotoprofile#1#2#3% to be done: file - {\bgroup - \setPDFdestination{#3}% - \doifsomething\PDFdestination - {\edef\action - {/S /Thread /D (\PDFdestination)}% - \ifsecondaryreference - \savesecondaryPDFreference\action - \else - \getsecondaryPDFreferences - \doPDFaction{\PDFswapdir#1}{#2}{\action \secondaryPDFreferences}% - \fi}% - \egroup} - -%D \macros -%D {doPDFsetpagetransition} -%D -%D This array holds a reasonable selection of transitions -%D (watch out: \type{replace} is not in this list). Most of -%D the transitions look awful anyway. By the way, \CONTEXT\ is -%D able to select transitions randomly. - -% some day, when 1.5 is on linux and apple, we will add: -% -% \def\pagetransitions -% {{split,in,vertical},{split,in,horizontal}, -% {split,out,vertical},{split,out,horizontal}, -% {blinds,horizontal},{blinds,vertical}, -% {box,in},{box,out}, -% {wipe,east},{wipe,west},{wipe,north},{wipe,south}, -% dissolve, -% {glitter,east},{glitter,south}, -% {fly,in,east},{fly,in,west},{fly,in,north},{fly,in,south}, -% {fly,out,east},{fly,out,west},{fly,out,north},{fly,out,south}, -% {push,east},{push,west},{push,north},{push,south}, -% {cover,east},{cover,west},{cover,north},{cover,south}, -% {uncover,east},{uncover,west},{uncover,north},{uncover,south}, -% fade} - -\def\pagetransitions - {{split,in,vertical},{split,in,horizontal}, - {split,out,vertical},{split,out,horizontal}, - {blinds,horizontal},{blinds,vertical}, - {box,in},{box,out}, - {wipe,east},{wipe,west},{wipe,north},{wipe,south}, - dissolve, - {glitter,east},{glitter,south}} - -%D Again, we use macros as placeholders for \PDF\ key||value -%D pairs. - -\def\PDFpagesplit {/S /Split } -\def\PDFpageblinds {/S /Blinds } -\def\PDFpagebox {/S /Box } -\def\PDFpagewipe {/S /Wipe } -\def\PDFpagedissolve {/S /Dissolve } -\def\PDFpageglitter {/S /Glitter } -\def\PDFpagereplace {/S /R } - -\def\PDFpagefly {/S /Fly } % 1.5 -\def\PDFpagepush {/S /Push } % 1.5 -\def\PDFpagecover {/S /Cover } % 1.5 -\def\PDFpageuncover {/S /Uncover } % 1.5 -\def\PDFpagefade {/S /Fade } % 1.5 - -\def\PDFpagehorizontal {/Dm /H } -\def\PDFpagevertical {/Dm /V } -\def\PDFpagein {/M /I } -\def\PDFpageout {/M /O } -\def\PDFpageeast {/Di 0 } -\def\PDFpagenorth {/Di 90 } -\def\PDFpagewest {/Di 180 } -\def\PDFpagesouth {/Di 270 } - -\def\dodoPDFsetpagetransition#1% - {\doifdefined{PDFpage#1} - {\edef\PDFpagetransitions{\PDFpagetransitions\getvalue{PDFpage#1}}}} - -\def\doPDFsetpagetransition#1#2% - {\let\PDFpagetransitions\empty - \processcommalist[#1]\dodoPDFsetpagetransition - \doPDFpageattribute - %{\ifnum#2>0 /Dur #2 \fi - {\ifnum0<0#2 /Dur #2 \fi - \ifx\PDFpagetransitions\empty\else/Trans <<\PDFpagetransitions>>\fi}} -% \ifx\PDFpagetransitions\empty\else/Trans <</Type /Trans \PDFpagetransitions>>\fi}} - -%D \macros -%D {doPDFinsertmov} -%D -%D Most of the annotations we use here are of type {\em -%D link}, but here is another one: the {\em movie} annotation. -%D The driver module must implement \type {setcurrentmovie}. - -%D Great: this will become an obsolete pdf feature; why did we have to -%D keep up with the bugs ... and by the time acrobat gets better in -%D handling it have to drop it. - -\let\currentmovie\s!unknown - -\def\doPDFinsertmov - {\bgroup - \xdef\currentmovie{\@@DriverImageLabel}% - \PointsToBigPoints\@@DriverImageWidth \width - \PointsToBigPoints\@@DriverImageHeight\height - \let\pdf@@options\empty - \let\pdf@@actions\empty - \donefalse - \expanded{\processallactionsinset[\@@DriverImageOptions]} - [\v!controls=>\donetrue, - \v!repeat=>\edef\pdf@@actions{\pdf@@actions /Mode /Repeat }, - \v!preview=>\edef\pdf@@options{\pdf@@options /Poster true }]% - \edef\pdf@@actions{\pdf@@actions /ShowControls \ifdone true\else false\fi}% - \doPDFannotation\@@DriverImageWidth\@@DriverImageHeight - {/Subtype /Movie - /Border [0 0 0] - /T (movie \currentmovie) - /Movie << /F (\@@DriverImageFile) /Aspect [\width\space\height] \pdf@@options >> - /A << \pdf@@actions >>}% - \egroup} - -%D \macros -%D {doPDFinsertsoundtrack} -%D -%D In \PDF\ sounds can be embedded like movies. - -\ifx\everygoto\undefined \newtoks\everygoto \fi - -\let\currentsound\s!unknown - -\def\doPDFinsertsoundtrack#1#2#3% - {\bgroup - \xdef\currentsound{#2}% - \let\pdf@@actions\empty - \@EA\processallactionsinset\@EA - [#3] - [\v!repeat=>\edef\pdf@@actions{\pdf@@actions /Mode /Repeat }]% - \collectdriverresource - %\flushatshipout % since it can be buried in a chained box - {\doPDFannotation{0pt}{0pt} - {/Subtype /Movie - /Border [0 0 0] - /T (sound \currentsound) - /Movie <</F (#1)>>% - \ifx\pdf@@actions\empty\else/A << \pdf@@actions >>\fi}}% - \egroup} - -%D \macros -%D {doPDFattachfile} - -\def\doPDFfilestreamobject#1#2#3#4% - {} - -\def\doPDFfilestreamidentifier#1% - {0} - -\def\doPDFgetfilestreamreference#1#2% - {0 0 R} - -\def\doPDFattachfile#1#2#3#4#5#6#7#8% - {\bgroup % title width height color symbol file - \edefconvertedargument\PDFfile{#8}% - % beware: the symbol may (indirectly) use the file - % reference when typesetting the object number; - \presetPDFsymbolappearance{#5}{#6}{#2}{#3}{#4}% sets width/height - \startPDFsymbolappearance - \doPDFembedfile\PDFfile{#7}{#8}% - \doPDFgetembeddedfilereference\PDFfile\PDFobjectreference - \setFDFlayer\@@DriverAttachmentLayer - \doPDFannotation{\width}{\totalheight} - {/Subtype /FileAttachment - /FS \PDFobjectreference\space - /Contents (#1) - \PDFsymbol - \FDFlayer - \PDFattributes}% - \stopPDFsymbolappearance - \egroup} - -% semi-public - -\def\doPDFembedfile#1#2#3% symbolic name | filename | user name - {\edefconvertedargument\PDFfile{#1}% - \doifnotflagged{a:\PDFfile}% - {\doPDFfilestreamobject{PDFEF}{\PDFfile}{#2}{#3}% - \doglobal\setflag{a:\PDFfile}}} - -\def\doPDFgetembeddedfilereference#1#2% - {\edefconvertedargument\PDFfile{#1}% - \doPDFgetobjectreference{PDFEF}\PDFfile#2} - -\def\doPDFgetembeddedfilestreamreference#1#2% - {\edefconvertedargument\PDFfile{#1}% - \doPDFgetfilestreamreference\PDFfile#2} % == \doPDFgetobjectreference{PDFFS}\PDFfile#2 - -\definespecial \doattachfile {\doPDFattachfile} - -% requested by Jens-Uwe Morawski: permits usage of pdftosrc -% in viewers that don't support attachments: -% -% \definesymbol -% [ObjectNumber] -% % [object number {\PDFattachmentnumber[xx]}] % named -% [object number \PDFattachmentnumber] % current -% -% \useattachment[test][xx][test.tex] -% \setupattachments[symbol=ObjectNumber] -% \attachment[test] - -\def\PDFattachmentnumber - {\dosingleargument\doPDFattachmentnumber} - -\def\doPDFattachmentnumber[#1]% - {\iffirstargument - \doPDFfilestreamidentifier{#1}% - \else - \doPDFfilestreamidentifier\PDFfile - \fi} - -%D \macros -%D {...} -%D -%D Rather preliminary. We have to wait till the complete specs -%D show up. As usual, we cannot really check it (Acrobat 6.0 -%D has a bug that inhibits us to make a test file). Half a day -%D of testing made clear that trying to control the plugin fails -%D in most cases (we need plugin specs -). We also miss a feature -%D to let acrobat wait with proceeding (action processing) till -%D the media clip is ready. - -% aiff audio/aiff -% au audio/basic -% avi video/avi -% mid audio/midi -% mov video/quicktime -% mp3 audio/x-mp3 (mpeg) -% mp4 audio/mp4 -% mp4 video/mp4 -% mpeg video/mpeg -% smil application/smil -% swf application/x-shockwave-flash - -% beware, this is preliminary code, should be improved - -\def\PDFrenderingspecs#1{\executeifdefined{PDFMR:#1}\empty} - -\def\PDFexecutestartrendering {/Rendition /OP 0 \PDFrenderingspecs\argumentA} -\def\PDFexecutestoprendering {/Rendition /OP 1 \PDFrenderingspecs\argumentA} -\def\PDFexecutepauserendering {/Rendition /OP 2 \PDFrenderingspecs\argumentA} -\def\PDFexecuteresumerendering {/Rendition /OP 3 \PDFrenderingspecs\argumentA} - -% todo : sub files -% -% \doPDFembedfile{pier-39.png}{pier-39.png}{pier-39.png}% -% \doPDFgetembeddedfilestreamreference{pier-39.png}\xPDFobjectreference -% \edef\xxxx{/RF [(pier-39.png) \xPDFobjectreference]}% - -% todo: alternative renderings -% -% object_1 -> <</Type /Rendition /S /MR /C << /Type /MediaClip ... >> >> -% object_2 -> <</Type /Rendition /S /MR /C << /Type /MediaClip ... >> >> -% -% rendering -> <</Type /Rendition /S /MS [objref_1 objref_2]>> - -% todo: embedded files (too buggy) -% -% \let\PDFattribute\empty -% % /D \PDFobjectreference -% % test one, no error, but ignored -% \doifinset\v!file{#4} -% {\doPDFembedfile{#3}{#3}{#3}% -% \doPDFgetembeddedfilestreamreference{#3}\PDFobjectreference -% \edef\PDFattribute{/EF \PDFobjectreference}}% -% % official, does not work either -% \doifinset\v!file{#4} -% {\doPDFembedfile{#3}{#3}{#3}% -% \doPDFgetembeddedfilereference{#3}\PDFobjectreference} -% % do we play the game as follows - -\definespecial\doinsertrendering#1#2#3#4% tag mime file options - {\ifundefined{PDFMR:#1}% - \doifinstringelse{://}{#3}\donetrue\donefalse % evt url as keyword - \doPDFdictionaryobject{PDFMF}{#1} - {/Type /Rendition - /S /MR - % does not work: /SP << /Type /MediaScreenParam /BE << /B [1 0 0] /O 0.5 >> >> - /C << /Type /MediaClip - /S /MCD - /N (#1) - /Alt [() (file not found)] % language id + message - /D << /Type /Filespec - /F (#3) - \ifdone/FS /URL\fi >> - /CT (#2) >>}% - % common code - \doifobjectreferencefoundelse{PDFMS}{#1} - {\doPDFgetobjectreference{PDFMS}{#1}\PDFobjectreferenceB} - {\doPDFgetobjectreference{PDFMU}{#1}\PDFobjectreferenceB}% - \doPDFgetobjectreference{PDFMF}{#1}\PDFobjectreferenceA - \setxvalue{PDFMR:#1}% needed /AA actions in /Screen - {/R \PDFobjectreferenceA - /AN \PDFobjectreferenceB}% - \doifobjectreferencefoundelse{PDFMS}{#1}\donothing - {\dodoinsertrenderingwindow{PDFMU}{#1}\zeropoint\zeropoint{#4}}% - \fi} - -\definespecial\doinsertrenderingobject#1#2#3#4% tag class objectname options - {\ifundefined{PDFMR:#1}% - \doPDFgetobjectreference{#2}{#3}\PDFobjectreference - \doPDFdictionaryobject{PDFMF}{#1} - {/Type /Rendition - /S /MR - /C << /Type /MediaClip - /S /MCD - /N (#1) - /D \PDFobjectreference>>}% - % common code - \doifobjectreferencefoundelse{PDFMS}{#1} - {\doPDFgetobjectreference{PDFMS}{#1}\PDFobjectreferenceB} - {\doPDFgetobjectreference{PDFMU}{#1}\PDFobjectreferenceB}% - \doPDFgetobjectreference{PDFMF}{#1}\PDFobjectreferenceA - \setxvalue{PDFMR:#1}% needed /AA actions in /Screen - {/R \PDFobjectreferenceA - /AN \PDFobjectreferenceB}% - \doifobjectreferencefoundelse{PDFMS}{#1}\donothing - {\dodoinsertrenderingwindow{PDFMU}{#1}\zeropoint\zeropoint{#4}}% - \fi} - -\definespecial\doinsertrenderingwindow - {\dodoinsertrenderingwindow{PDFMS}} - -\def\dodoinsertrenderingwindow#1#2#3#4#5% - {\vbox to #4 \bgroup - \checkPDFscreenactions{#2}{#5}% - \doPDFgetobjectpagereference{PDFMF}{#2}\PDFobjectreferenceA - \doPDFgetobjectreference {PDFMF}{#2}\PDFobjectreferenceB - \vss - \hbox to #3 \bgroup - \doPDFannotationobject{#1}{#2}{#3}{#4} - {/Subtype /Screen - /P \PDFobjectreferenceA - /A \PDFobjectreferenceB - \PDFattributes - /Border [0 0 0]}% - \hss - \egroup - \egroup} - -\global\let\PDFrenderingopenpageaction \empty -\global\let\PDFrenderingclosepageaction\empty - -\def\checkPDFscreenactions#1#2% - {\let\PDFattributes\empty - \iflocation % important since direct -) - % the action can either (already) be set by the window handler - % or (normally when no window [i.e a zero dimensions one] is present) by keyword - \doifinset\v!auto{#2} - {% brrr, here instead of in navigation module, must move and become special - % now two sided dependency - \let\checkrendering\gobbleoneargument - \ifx\PDFrenderingopenpageaction \empty - \handlereferenceactions{\v!StartRendering{#1}}\dosetuprenderingopenpageaction - \fi - \ifx\PDFrenderingclosepageaction\empty - \handlereferenceactions{\v!StopRendering {#1}}\dosetuprenderingclosepageaction - \fi - }% - \donefalse - \ifx\PDFrenderingopenpageaction \empty\!!doneafalse\else\donetrue\!!doneatrue\fi - \ifx\PDFrenderingclosepageaction\empty\!!donebfalse\else\donetrue\!!donebtrue\fi - \ifdone - \edef\PDFattributes - {/AA <<\if!!donea/PO <<\PDFrenderingopenpageaction >> \fi - \if!!doneb/PC <<\PDFrenderingclosepageaction>> \fi>>}% - \fi - \global\let\PDFrenderingopenpageaction \empty - \global\let\PDFrenderingclosepageaction\empty - \fi} - -\definespecial\dosetuprenderingopenpageaction {\global\let\PDFrenderingopenpageaction \lastPDFaction} -\definespecial\dosetuprenderingclosepageaction{\global\let\PDFrenderingclosepageaction\lastPDFaction} - -%D \macros -%D {doPDFinsertbookmark} -%D -%D Well, here is the dreadfull bookmark, rather useless because -%D only standard encoding is possible, no typography is done, -%D and a maximum of 32~characters is advized. - -\def\doPDFinsertbookmark#1#2#3#4#5% level sublevels text page open=1 - {\bgroup - % todo, unicode - \sanitizePDFdocencoding#3\to\bookmarktext % uses scratchcounter - \stripstring\bookmarktext - %\sanitizePDFstring#3\to\bookmarktext - \doPDFbookmark{#1}{#2}{\bookmarktext}{#4}{#5}% - \egroup} - -%D The next section of this module is dedicated to form -%D support. These macros are complicated by the fact that -%D cloning is possible. - -%D \macros -%D {FDFflag...,FDFplus...} -%D -%D The \type{/FT} key determines the type of field: text, -%D button or choice. The latter two come in several disguises, -%D which are set by flipping bits in the \type{/Ff}. Other bits -%D are used to set states. Personally I hate this bitty way of -%D doing things. The next six bit determine the field sub type: - -\def\FDFflagMultiLine {4096} % 13 -\def\FDFflagNoToggleToOff {16384} % 15 -\def\FDFflagRadio {32768} % 16 -\def\FDFflagPushButton {65536} % 17 -\def\FDFflagPopUp {131072} % 18 -\def\FDFflagEdit {262144} % 19 - -% bugged anyway, so we need to drop it: - -\def\FDFflagRadiosInUnison {33554432} % 26 - -%D A few more (pdf 1.4) flags, what the spell check one: for -%D obscure reasons for Adobe downward compatibility means -%D enabling features that harm old applications like testing. - -\def\FDFflagDoNotSpellCheck {4194304} % 23 -\def\FDFflagDoNotScroll {8388608} % 24 - -%D The next bits (watch how strange the bits are organized) -%D take care of the states: - -\def\FDFflagReadOnly {1} % 1 -\def\FDFflagRequired {2} % 2 -\def\FDFflagNoExport {4} % 3 -\def\FDFflagPassword {8192} % 14 -\def\FDFflagSort {524288} % 20 -\def\FDFflagFileSelect {1048576} % 21 - -%D There is a second, again bitset oriented, \type{/F} flag: - -\def\FDFplusInvisible {1} % 1 -\def\FDFplusHidden {2} % 2 -\def\FDFplusPrintable {4} % 3 - -%def\FDFplusNoView {32} % 6 -%def\FDFplusToggleNoView {256} % 9 - -\def\FDFplusAutoView {256} % {288} % 6+9 - -%D \macros -%D {setFDFswitches} -%D -%D The non||type bits are mapped onto user||interface -%D swithes, to be used later on: - -\def\@@FDFflag{FDFflag} -\def\@@FDFplus{FDFplus} - -\letvalue {\@@FDFflag\v!readonly}=\FDFflagReadOnly -\letvalue {\@@FDFflag\v!required}=\FDFflagRequired -\letvalue {\@@FDFflag\v!protected}=\FDFflagPassword -\letvalue {\@@FDFflag\v!sorted}=\FDFflagSort -\letvalue {\@@FDFflag\v!unavailable}=\FDFflagNoExport -\letvalue {\@@FDFflag\v!nocheck}=\FDFflagDoNotSpellCheck -\letvalue {\@@FDFflag\v!fixed}=\FDFflagDoNotScroll -\letvalue {\@@FDFflag\v!file}=\FDFflagFileSelect - -\letvalue {\@@FDFplus\v!hidden}=\FDFplusHidden -\letvalue {\@@FDFplus\v!printable}=\FDFplusPrintable - -\letvalue {\@@FDFplus\v!auto}=\FDFplusAutoView - -%D A set of switches is collected into the flags we mentioned -%D before by the next macro (we don't handle negations yet, -%D but do take care of redundancy): - -\def\FDFflag{0} -\def\FDFplus{0} - -\def\setFDFswitches[#1]% - {\bgroup - \!!counta\zerocount - \!!countb\zerocount - \def\docommand##1% - {\doifsomething{##1} - {\advance\!!counta 0\getvalue{\@@FDFflag##1}% - \setvalue{\@@FDFflag##1}{0}% - \advance\!!countb 0\getvalue{\@@FDFplus##1}% - \setvalue{\@@FDFplus##1}{0}}}% - \processcommacommand[#1]\docommand - \xdef\FDFflag{\the\!!counta}% - \xdef\FDFplus{\the\!!countb}% - \egroup} - -%D \macros -%D {setFDFvalues} -%D -%D Menu items are passed as an array of \type{(string)}'s and -%D the content of this array is build with: - -\let\FDFvalues \empty -\let\FDFfirstvalues \empty -\let\FDFsecondvalues\empty -\let\FDFkidlist \empty -\let\FDFdefaultindex\!!zerocount -\let\FDFdefaultvalue\empty - -% Why do we need to tweak this mechanism each time acrobat updates ... -% it would make sense to have version specific sections in pdf files -% since my guess is that it never will be done right since each year -% new programmers have new ideas about what is supposed to happen with -% kids. So .. best is not to trust this feature esp not for radio -% widgets. (new flags, different interpretation of AS etc etc) - -\def\setFDFvalues[#1][#2]% #1 = list (item=>value) #2 = default - {\let\FDFvalues \empty - %when radio opt works ok - %\let\FDFfirstvalues \empty - %\let\FDFsecondvalues\empty - \let\FDFkidlist \empty - %\let\FDFdefaultindex\!!zerocount - %\let\FDFdefaultvalue\empty - %\scratchcounter\zerocount - \def\dodocommand##1=>##2=>##3\end - {\addtocommalist{##1}\FDFkidlist - %\edef\FDFfirstvalues{\FDFfirstvalues(##1)}% - %\doif{##1}{#2}{\edef\FDFdefaultindex{\the\scratchcounter}}% - %\advance\scratchcounter\plusone - \doifelsenothing{##2} - {\doif{##1}{#2}{\edef\FDFdefaultvalue{##1}}% - %\edef\FDFsecondvalues{\FDFsecondvalues(##1)}% - \edef\FDFvalues{\FDFvalues [(##1)(##1)] }} - {\doif{##1}{#2}{\edef\FDFdefaultvalue{##2}}% - %\edef\FDFsecondvalues{\FDFsecondvalues(##2)}% - \edef\FDFvalues{\FDFvalues [(##2)(##1)] }}}% ! ##1 is shown - \def\docommand##1% - {\dodocommand##1=>=>\end}% - \expanded{\processcommalist[#1]}\docommand} - -%D This macro accepts comma separated \type{visual=>result} -%D pairs. - -%D \macros -%D {setFDFalignment} -%D -%D Text and line fields can be entered and showed in three -%D alternative alingments, indicated by a digit: - -\def\FDFalign{0} - -\def\setFDFalignment[#1]% - {\processaction - [#1] - [ \v!left=>\edef\FDFalign{2}, % raggedleft - \v!middle=>\edef\FDFalign{1}, % raggedcenter - \v!right=>\edef\FDFalign{0}]} % raggedright - -%D \macros -%D {setFDFattributes} -%D -%D The weak part of (at least version 2.1 \PDF) is that only -%D default fonts are handled well. Another restriction is that -%D the encoding vector must be the standard \PDF\ document one. -%D Although the \PDF\ reference explictly states that one could -%D use the normal text operators, leading is not yet handled. -%D -%D For the moment the current \CONTEXT\ font is mapped onto -%D one best suitable default font. The color attribute is -%D less problematic and is directly derived from the \CONTEXT\ -%D color. - -\def\FDFattributes{/Helv 12 Tf 0 g 14.4 TL} - -\def\FDFrm {TiRo} \def\FDFss {Helv} \def\FDFtt {Cour} -\def\FDFrmtf{TiRo} \def\FDFsstf{Helv} \def\FDFtttf{Cour} -\def\FDFrmbf{TiBo} \def\FDFssbf{HeBo} \def\FDFttbf{CoBo} -\def\FDFrmit{TiIt} \def\FDFssit{HeOb} \def\FDFttit{CoOb} -\def\FDFrmsl{TiIt} \def\FDFsssl{HeOb} \def\FDFttsl{CoOb} -\def\FDFrmbi{TiBI} \def\FDFssbi{HeBO} \def\FDFttbi{CoBO} -\def\FDFrmbs{TiBI} \def\FDFssbs{HeBO} \def\FDFttbs{CoBO} - -\let\FDFusedfonts=\FDFsstf - -\def\setFDFattributes[#1,#2,#3,#4]% style, color, backgroundcolor, framecolor - {\bgroup % nog interlinie: n TL - \setbox\scratchbox\hbox - \bgroup - \doconvertfont{#1}{}% - \PointsToBigPoints\bodyfontsize\size % x/xx, so better the actual size - \doifdefinedelse{FDF\fontstyle\fontalternative} - {\xdef\FDFattributes{\getvalue{FDF\fontstyle\fontalternative}}} - {\doifdefinedelse{FDF\fontstyle} - {\xdef\FDFattributes{\getvalue{FDF\fontstyle}}} - {\xdef\FDFattributes{\FDFrm}}}% - \doglobal\addtocommalist\FDFattributes\FDFusedfonts - \xdef\FDFattributes% move up with "x.y Ts" - {/\FDFattributes\space\size\space Tf\space\PDFcolor{#2}}% - \doifelsenothing{#3} - {\global\let\FDFsurroundings\empty} - {\xdef\FDFsurroundings{/BG \FDFcolor{#3}}}% - \doifsomething{#4} - {\xdef\FDFsurroundings{\FDFsurroundings\space /BC \FDFcolor{#4}}}% - \ifx\FDFsurroundings\empty \else - \xdef\FDFsurroundings{/MK << \FDFsurroundings\space>>}% - \fi - \egroup - \egroup} - -%D \macros -%D {setFDFactions} -%D -%D Depending on the type of the field, one can assign -%D \JAVASCRIPT\ code to a mouse event or keystroke. The next -%D preparation macro shows what events are handled. - -\let\FDFactions\empty - -%\def\setFDFactions[#1,#2,#3,#4,#5,#6,#7,#8]% -% {\global\let\FDFactions\empty -% \setFDFaction D#1% mousedown -% \setFDFaction U#2% mouseup -% \setFDFaction E#3% enterregion -% \setFDFaction X#4% exitregion -% \setFDFaction K#5% afterkeystroke -% \setFDFaction F#6% formatresult -% \setFDFaction V#7% validateresult -% \setFDFaction C#8% calculatewhatever -% \ifx\FDFactions\empty\else -% \xdef\FDFactions{/AA << \FDFactions >>}% since 1.3 no longer inherited -% \fi} -%% {\setFDFaction A#2}% mouseup % changed for version 5 - -% \def\setFDFactions[#1,#2,#3,#4,#5,#6,#7,#8,% -% {\global\let\FDFactions\empty -% \setFDFaction D#1% mousedown -% %\setFDFaction U#2% mouseup -% \setFDFaction E#3% enterregion -% \setFDFaction X#4% exitregion -% \setFDFaction K#5% afterkeystroke -% \setFDFaction F#6% formatresult -% \setFDFaction V#7% validateresult -% \setFDFaction C#8% calculatewhatever -% \setFDFactionsmore#2,} - -% \def\setFDFactionsmore#1,#2,#3]% -% {\setFDFaction{Fo}#2% focusin -% \setFDFaction{Bl}#3% focusout % was I (now pdf ref manual explicitly talks about lowercase l) -% \ifx\FDFactions\empty\else -% \xdef\FDFactions{/AA << \FDFactions >>}% since 1.3 no longer inherited -% \fi -% \setFDFaction A#1}% mouseup - -\def\setFDFactions[#1,#2,#3,#4,#5,#6,#7,#8,% - {\global\let\FDFactions\empty - \setFDFaction D#1% mousedown - \setFDFaction U#2% mouseup - \setFDFaction E#3% enterregion - \setFDFaction X#4% exitregion - \setFDFaction K#5% afterkeystroke - \setFDFaction F#6% formatresult - \setFDFaction V#7% validateresult - \setFDFaction C#8% calculatewhatever - \setFDFactionsmore} - -\def\setFDFactionsmore#1,#2]% - {\setFDFaction{Fo}#1% focusin - \setFDFaction{Bl}#2% focusout % was I (now pdf ref manual explicitly talks about lowercase l) - \ifx\FDFactions\empty\else - \xdef\FDFactions{/AA << \FDFactions >>}% since 1.3 no longer inherited - \fi} - -% todo, when new var scheme is implemented -% -% \setFDFaction{PO}\@@DriverFieldPageOpen -% \setFDFaction{PC}\@@DriverFieldPageClose -% \setFDFaction{PV}\@@DriverFieldPageVisible -% \setFDFaction{PI}\@@DriverFieldPageInVisible - -%D The event handler becomes something: -%D -%D \starttyping -%D /AA << /D << /S ... >> ... /C << /S ... >> -%D /A << /S /JavaScript /JS (...) >> -%D \stoptyping - -% \def\setFDFaction#1#2% -% {\bgroup -% \global\let\sanitizedJScode\empty -% \def\setFDFaction##1% -% {\doifreferencefoundelse{##1} -% {\doifelse{\currentreferencespecial}{JS} % filter non-js -% {\presetJScode -% \currentreferenceoperation -% \currentreferencearguments -% \doPSsanitizeJScode\JScode\to\JScode -% \xdef\sanitizedJScode{\sanitizedJScode\space\JScode}} -% {\illegalreference{##1}}} -% {\unknownreference{##1}}}% -% \@EA\processcommalist\@EA[#2]\setFDFaction % one level expansion -% \ifx\sanitizedJScode\empty \else -% \xdef\FDFactions% -% {\FDFactions /#1 << /S /JavaScript /JS (\sanitizedJScode) >> }% -% \fi -% \egroup} -% -% acrobat 5 supports other that JS actions too - -\def\setFDFaction#1#2% - {\bgroup - \def\docommand{\xdef\FDFactions{\FDFactions /#1 << \lastPDFaction >> }}% - \@EA\handlereferenceactions\@EA{#2}\docommand % one level expansion - \egroup} - -%D \macros -%D {testFDFactions} -%D -%D This rather confusion prone series of script can be tested -%D with: -%D -%D \starttyping -%D \testFDFactions -%D \stoptyping -%D -%D which simply redefined the previous macro to one that prints -%D a message to the console. - -\def\testFDFactions - {\def\setFDFaction##1##2% - {\doPSsanitizeJScode console.show();console.println("executing:##1"); \to\sanitizedJScode - \edef\FDFactions{\FDFactions /##1 << /S /JavaScript /JS (\sanitizedJScode) >> }}} - -%D \macros -%D {doFDFregistercalculationset} -%D -%D There is at most one calculation order list, which defines -%D the order in which fields are calculated. - -\let\PDFcalculationset\empty - -\def\doFDFregistercalculationset#1% - {\def\PDFcalculationset{#1}} - -%D \macros -%D {registerFDFobject,everylastshipout} -%D -%D Officially one needs to embed some general datastructures -%D that tell the viewer what fields are present in the file, as -%D well as what resources they use. The next mechanism does that -%D job automatically when one registers the field. - -\def\flushFDFnames - {\ifbuildFDFdictionary - \ifx\FDFcollection\empty\else - \ifbuildFDFencodingvector - \doPDFdictionaryobject{FDF}{local:encodingvector}{\FDFencodingvector}% - \fi - \defineFDFfonts - \doPDFarrayobject{FDF}{local:fields}{\FDFcollection}% - \doPDFgetobjectreference{FDF}{local:fields}\PDFobjectreference - % The /NeedAppearances is pretty important because - % otherwise Acrobat 5 blows up on cloned radio widgets - \doPDFdictionaryobject{FDF}{local:acroform} - {/Fields \PDFobjectreference\space - /NeedAppearances true - \doFDFiffieldset\PDFcalculationset{/CO [\doFDFgetfieldset\PDFcalculationset]} - /DR << /Font << \FDFfonts >> >> - /DA (/Helv 10 Tf 0 g)}% - \doPDFgetobjectreference{FDF}{local:acroform}\PDFobjectreference - \doPDFaddtocatalog - {/AcroForm \PDFobjectreference}% - \global\let\FDFcollection\empty - \global\let\flushFDFnames\relax - \fi - \fi} - -\let\FDFcollection\empty - -\def\registerFDFobject#1% - {\ifbuildFDFdictionary - \ifx\flushFDFnames\relax - \writestatus{FDF}{second run needed for field list (#1)}% - \fi - \doPDFgetobjectreference{FDF}{#1}\PDFobjectreference - \xdef\FDFcollection{\FDFcollection\space\PDFobjectreference}% - \fi} - -\appendtoksonce \flushFDFnames \to \everylastshipout % test \everybye / was \prependtoksonce - -%D \macros -%D {defineFDFfonts, -%D ifbuildFDFdictionary, -%D ifbuildFDFencodingvector} -%D -%D Another datastruture concerns the fonts used. We only -%D define the fonts we use. - -\newif\ifbuildFDFdictionary \buildFDFdictionarytrue -\newif\ifbuildFDFencodingvector \buildFDFencodingvectortrue - -\def\defineFDFfonts - {\let\FDFfonts\empty - \processcommacommand[\FDFusedfonts]\defineFDFfont} - -\def\defineFDFfont#1% - {\ifbuildFDFencodingvector - \doPDFgetobjectreference{FDF}{local:encodingvector}\PDFobjectreference - \fi - \doPDFdictionaryobject{FDF}{local:#1} - {/Type /Font - /Subtype /Type1 - /Name /#1 - \ifbuildFDFencodingvector /Encoding \PDFobjectreference\space\fi - /BaseFont /\getvalue{FDFname#1}}% - \doPDFgetobjectreference{FDF}{local:#1}\PDFobjectreference - \edef\FDFfonts{\FDFfonts \space/#1 \PDFobjectreference}} - -%D Another list of constants: - -\def\FDFnameTiRo {Times-Roman} -\def\FDFnameTiBo {Times-Bold} -\def\FDFnameTiIt {Times-Italic} -\def\FDFnameTiBI {Times-BoldItalic} -\def\FDFnameHelv {Helvetica} -\def\FDFnameHeBo {Helvetica-Bold} -\def\FDFnameHeOb {Helvetica-Oblique} -\def\FDFnameHeBO {Helvetica-BoldOblique} -\def\FDFnameCour {Courier} -\def\FDFnameCoBo {Courier-Bold} -\def\FDFnameCoOb {Courier-Oblique} -\def\FDFnameCoBO {Courier-BoldOblique} - -%D And a big one: (should be run time loaded (spec-run or -%D so)). - -\def\FDFencodingvector - {/Type /Encoding - /Differences - [ 24 /breve /caron /circumflex /dotaccent /hungarumlaut /ogonek - /ring /tilde - 39 /quotesingle - 96 /grave - 128 /bullet /dagger /daggerdbl /ellipsis /emdash /endash /florin - /fraction /guilsinglleft /guilsinglright /minus /perthousand - /quotedblbase /quotedblleft /quotedblright /quoteleft - /quoteright /quotesinglbase /trademark /fi /fl /Lslash /OE - /Scaron /Ydieresis /Zcaron /dotlessi /lslash /oe /scaron - /zcaron - 164 /currency - 166 /brokenbar - 168 /dieresis /copyright /ordfeminine - 172 /logicalnot /.notdef /registered /macron /degree /plusminus - /twosuperior /threesuperior /acute /mu - 183 /periodcentered /cedilla /onesuperior /ordmasculine - 188 /onequarter /onehalf /threequarters 192 /Agrave /Aacute - /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla /Egrave - /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex - /Idieresis /Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde - /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex - /Udieresis /Yacute /Thorn /germandbls /agrave /aacute - /acircumflex /atilde /adieresis /aring /ae /ccedilla /egrave - /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex - /idieresis /eth /ntilde /ograve /oacute /ocircumflex /otilde - /odieresis /divide /oslash /ugrave /uacute /ucircumflex - /udieresis /yacute /thorn /ydieresis ]} - -%D \macros -%D {currentFDFmode,currentFDFparent,currentFDFkids,currenrFDFroot} -%D -%D There are three more quasi global interfacing variables -%D that need to be set. - -\let\currentFDFmode =\fieldlonermode -\let\currentFDFkids =\empty -\let\currentFDFparent=\empty -\let\currentFDFroot =\empty - -%D \macros -%D {dosetfieldstatus} -%D -%D And here comes the special that deals with them. - -\definespecial\dosetfieldstatus#1#2#3#4% - {\chardef\currentFDFmode #1% - \edef\currentFDFparent {#2}% - \edef\currentFDFkids {#3}% - \edef\currentFDFroot {#4}} - -%D \macros -%D {dosetuppageview} -%D -%D Because this command will seldom be called, we can permit -%D slow action processing. We need three settings, one for -%D direct \PDF\ inclusion, the other as \PDFTEX\ keyword, an -%D a last one for form. All determine in what way the -%D screen is adapted when going to a destination. Watch the -%D space. - -\def\PDFpageviewkey{fit} -\def\PDFpageviewwrd{/Fit} -\def\PDFpageview {/View [\PDFpageviewwrd] } -\def\PDFpagexyzspec{0 0 0} % hack, pdftex does handle this - -\def\dosetuppageview#1% watch the v-h swapping here - {\processaction - [#1] - [ \v!fit=>\def\PDFpageviewkey {fit}\def\PDFpageviewwrd{/Fit}, - \v!width=>\def\PDFpageviewkey {fith}\def\PDFpageviewwrd{/FitH}, - \v!height=>\def\PDFpageviewkey {fitv}\def\PDFpageviewwrd{/FitV}, - \v!minwidth=>\def\PDFpageviewkey{fitbh}\def\PDFpageviewwrd{/FitBH}, - \v!minheight=>\def\PDFpageviewkey{fitbv}\def\PDFpageviewwrd{/FitBV}, - \v!standard=>\def\PDFpageviewkey{xyz \PDFpagexyzspec}\def\PDFpageviewwrd{/XYZ \PDFpagexyzspec}, - \s!unknown=>\def\PDFpageviewkey {fit}\def\PDFpageviewwrd{/Fit}]% - \edef\PDFpageview{/View [\PDFpageviewwrd]}} - -%D \macros -%D {setFDFkids} -%D -%D Clones as well as radiofields (which themselves can have -%D cloned components) need a list of kids. The next macro -%D builds one. - -\def\setFDFkids[#1][#2]% tag commalist - {\let\FDFkids\empty - \def\docommand##1% - {\doPDFgetobjectreference{FDF}{#1##1}\PDFobjectreference - \edef\FDFkids{\FDFkids\PDFobjectreference\space}}% - \@EA\processcommalist\@EA[#2]\docommand - \ifx\FDFkids\empty\else\edef\FDFkids{/Kids [\FDFkids]}\fi -% \edef\FDFkids{/Kids [\FDFkids]}% - } - -%D \macros -%D {doFDFpresetlinefield,doFDFpresettextfield, -%D doFDFpresetchoicefield,doFDFpresetpopupfield,doFDFpresetcombofield, -%D doFDFpresetpushfield,doFDFpresetcheckfield, -%D doFDFpresetfield,doFDFpresetradiorecord} -%D -%D I would say: read the \PDF\ reference manual first and see -%D what happens here next. Lucky us that they have so much in -%D common. - -\def\doFDFpresetlinefield#1#2#3#4#5#6#7#8#9% - {\bgroup - \setFDFlayer\@@DriverFieldLayer - \setFDFswitches[#7]% - \setFDFattributes[#6]% - \setFDFalignment[#8]% - \setFDFactions[#9]% - \expanded{\escapePSstring#4}\to\FDFtext - \ifcase\currentFDFmode - \doPDFannotationobject{FDF}{#1}{#2}{#3} - {/Subtype /Widget /T (#1) /FT /Tx - /MaxLen \ifcase0#5 1000 \else#5 \fi - %/DV (#4) /V (#4) % value added - /DV (\FDFtext) /V (\FDFtext) % value added - /Ff \FDFflag\space - /F \FDFplus\space - /DA (\FDFattributes) - \FDFlayer\space - \FDFsurroundings\space - /Q \FDFalign\space - \FDFactions}% - \registerFDFobject{#1}% - \or - \setFDFkids[kids:][\currentFDFkids]% - \doPDFdictionaryobject{FDF}{#1} - {/T (#1) /FT /Tx - /MaxLen \ifcase0#5 1000 \else#5 \fi - \FDFkids\space - %/DV (#4) /V (#4) % value added - /DV (\FDFtext) /V (\FDFtext) % value added - /Ff \FDFflag\space - /F \FDFplus\space - /DA (\FDFattributes) - \FDFlayer\space - \FDFsurroundings\space - /Q \FDFalign\space - \FDFactions}% - \registerFDFobject{#1}% - \or - \doPDFgetobjectreference{FDF}\currentFDFparent\PDFobjectreference - %\global\objectreferencingtrue - \doPDFannotationobject{FDF}{kids:#1}{#2}{#3} - {/Subtype /Widget - /Parent \PDFobjectreference - /Ff \FDFflag\space - /F \FDFplus\space - /DA (\FDFattributes) - \FDFlayer\space - \FDFsurroundings\space - /Q \FDFalign\space - \FDFactions}% - \or - \doPDFgetobjectreference{FDF}\currentFDFparent\PDFobjectreference - %\global\objectreferencingtrue - \doPDFannotationobject{FDF}{kids:#1}{#2}{#3} - {/Subtype /Widget - /Parent \PDFobjectreference - /F \FDFplus - \FDFactions}% - \fi - \egroup} - -\def\doFDFpresettextfield#1#2#3#4#5#6#7#8#9% - {\doFDFpresetlinefield{#1}{#2}{#3}{#4}{#5}{#6}{MultiLine,#7}{#8}{#9}} - -\def\doFDFpresetchoicefield#1#2#3#4#5#6#7#8% - {\bgroup - \setFDFlayer\@@DriverFieldLayer - \setFDFswitches[#6]% - \setFDFattributes[#5]% - \setFDFvalues[#7][#4]% - \setFDFactions[#8]% - \ifcase\currentFDFmode - \doPDFannotationobject{FDF}{#1}{#2}{#3} - {/Subtype /Widget - /T (#1) /FT /Ch - /DV (#4) /V (#4) - /Ff \FDFflag\space - /F \FDFplus\space - /DA (\FDFattributes) - \FDFlayer\space - \FDFsurroundings\space - /Opt [\FDFvalues] - \FDFactions}% - \registerFDFobject{#1}% - \or - \setFDFkids[kids:][\currentFDFkids]% - \doPDFdictionaryobject{FDF}{#1} - {/T (#1) /FT /Ch - \FDFkids\space - /DV (#4) /V (#4) - /Ff \FDFflag\space - /F \FDFplus\space - /DA (\FDFattributes) - \FDFlayer\space - \FDFsurroundings\space - /Opt [\FDFvalues] - \FDFactions}% - \registerFDFobject{#1}% - \or - \doPDFgetobjectreference{FDF}\currentFDFparent\PDFobjectreference - %\global\objectreferencingtrue - \doPDFannotationobject{FDF}{kids:#1}{#2}{#3} - {/Subtype /Widget - /Parent \PDFobjectreference - /Ff \FDFflag\space - /F \FDFplus\space - /DA (\FDFattributes) - \FDFlayer\space - \FDFsurroundings\space - \FDFactions}% - \or - \doPDFgetobjectreference{FDF}\currentFDFparent\PDFobjectreference - %\global\objectreferencingtrue - \doPDFannotationobject{FDF}{kids:#1}{#2}{#3} - {/Subtype /Widget - /Parent \PDFobjectreference - /F \FDFplus - \FDFactions}% - \fi - \egroup} - -\def\doFDFpresetpopupfield#1#2#3#4#5#6#7#8% - {\doFDFpresetchoicefield{#1}{#2}{#3}{#4}{#5}{PopUp,#6}{#7}{#8}} - -\def\doFDFpresetcombofield#1#2#3#4#5#6#7#8% - {\doFDFpresetchoicefield{#1}{#2}{#3}{#4}{#5}{PopUp,Edit,#6}{#7}{#8}} - -\newif\ifFDFvalues - -\def\doFDFpresetpushcheckfield#1#2#3#4#5#6#7#8% in acro<5 (\FDFdefault) - {\bgroup % in acro>5 /\FDFdefault - \setFDFlayer\@@DriverFieldLayer - \ifcase#8\relax\FDFvaluesfalse\else\FDFvaluestrue\fi - \setFDFswitches[#5]% - \setFDFactions[#7]% - \doifelse{#4}{1} - {\def\FDFdefault{On}} - {\def\FDFdefault{Off}}% - \ifcase\currentFDFmode - \doFDFappearance{On}{#6}{#8}% - \doPDFannotationobject{FDF}{#1}{#2}{#3} - {/Subtype /Widget /T (#1) /FT /Btn - \ifFDFvalues - /DV /\FDFdefault\space - /V /\FDFdefault\space - /AS /\FDFdefault\space - \fi - \FDFlayer - /Ff \FDFflag\space - /F \FDFplus\space - \FDFlayer\space - \FDFappearance\space -% /IF << /SW /N >> % strange, only works for stupid buttons - \FDFactions}% - \registerFDFobject{#1}% - \or % no appearance and layer ? - \setFDFkids[kids:][\currentFDFkids]% - \doPDFdictionaryobject{FDF}{#1} - {/T (#1) /FT /Btn - \FDFkids\space - \ifFDFvalues - /DV /\FDFdefault\space - /V /\FDFdefault\space - /AS /\FDFdefault\space - \fi - /Ff \FDFflag\space - /F \FDFplus\space - \FDFactions}% - \registerFDFobject{#1}% - \or - \doFDFappearance{On}{#6}{#8}% - \doPDFgetobjectreference{FDF}\currentFDFparent\PDFobjectreference - %\global\objectreferencingtrue - \doPDFannotationobject{FDF}{kids:#1}{#2}{#3} - {/Subtype /Widget - /Parent \PDFobjectreference\space - \ifFDFvalues - /DV /\FDFdefault\space - /V /\FDFdefault\space - /AS /\FDFdefault\space - \fi - /Ff \FDFflag\space - /F \FDFplus\space - \FDFlayer\space - \FDFappearance\space - \FDFactions}% - \or - \doFDFappearance{On}{#6}{#8}% - \doPDFgetobjectreference{FDF}\currentFDFparent\PDFobjectreference - %\global\objectreferencingtrue - \doPDFannotationobject{FDF}{kids:#1}{#2}{#3} - {/Subtype /Widget - /Parent \PDFobjectreference\space - /F \FDFplus\space - \ifFDFvalues - /DV /\FDFdefault\space - /V /\FDFdefault\space - /AS /\FDFdefault\space - \fi - \FDFlayer\space - \FDFappearance - \FDFactions}% - \fi - \egroup} - -\def\doFDFpresetpushfield#1#2#3#4#5#6#7% - {\doFDFpresetpushcheckfield{#1}{#2}{#3}{#4}{PushButton,#5}{#6}{#7}{0}} - -\def\doFDFpresetcheckfield#1#2#3#4#5#6#7% - {\doFDFpresetpushcheckfield{#1}{#2}{#3}{#4}{#5}{#6}{#7}{1}} - -\def\doFDFpresetradiofield#1#2#3#4#5#6#7#8% - {\bgroup - \setFDFlayer\@@DriverFieldLayer - \FDFvaluestrue - \setFDFswitches[#5]% - \setFDFactions[#8]% - \doifelsenothing{#4} - {\def\FDFdefault{Off}} - {\def\FDFdefault{#4}}% - \@EA\aftersplitstring\FDFdefault\at=>\to\FDFdefaultvalue - \ifx\FDFdefaultvalue\empty\else\let\FDFdefault\FDFdefaultvalue\fi - \ifcase\currentFDFmode - \doFDFappearance{#1}{#7}{1}% - \doPDFgetobjectreference{FDF}{#6}\PDFobjectreference - \doPDFannotationobject{FDF}{#1}{#2}{#3} - {/Subtype /Widget - /Parent \PDFobjectreference\space - /F \FDFplus\space - /AS /\FDFdefault\space - \FDFlayer\space - \FDFappearance\space - \FDFactions}% - \registerFDFobject{#1}% - \or - \setFDFkids[kids:][\currentFDFkids]% - \doPDFgetobjectreference{FDF}{#6}\PDFobjectreference - \doPDFdictionaryobject{FDF}{#1} - {/Parent \PDFobjectreference\space - \FDFkids\space - /F \FDFplus\space - \FDFactions}% - \registerFDFobject{#1}% - \or - %\doFDFappearance{#1}{#7}{1}% - \doFDFappearance{\currentFDFparent}{#7}{1}% - \doPDFgetobjectreference{FDF}\currentFDFparent\PDFobjectreference - %\global\objectreferencingtrue % nb - \doPDFannotationobject{FDF}{kids:#1}{#2}{#3} - {/Subtype /Widget - /Parent \PDFobjectreference\space - /AS /\FDFdefault\space - /F \FDFplus\space - \FDFlayer\space - \FDFappearance\space - \FDFactions}% - \or - %\doFDFappearance{#1}{#7}{1}% - \doFDFappearance{\currentFDFparent}{#7}{1}% - \doPDFgetobjectreference{FDF}\currentFDFparent\PDFobjectreference - %\global\objectreferencingtrue - \doPDFannotationobject{FDF}{kids:#1}{#2}{#3} - {/Subtype /Widget - /Parent \PDFobjectreference\space - /AS /\FDFdefault\space - /F \FDFplus\space - \FDFlayer\space - \FDFappearance\space - \FDFactions}% - \fi - \egroup} - -%D \macros -%D {setFDFstrings} -%D -%D This one creates a string array. - -%\def\setFDFstrings[#1]% -% {\let\FDFstrings\empty -% \def\docommand##1{\edef\FDFstrings{\FDFstrings(##1)}}% -% \processcommacommand[#1]\docommand} - -% Beware, RadiosInUnison is really needed in the pre 1.5/6 time this -% was the default but out of a sudden it's no longer the case. Also -% the NoToggleToOff interferes with kids of kids and both it will -% break older documents, i.e. so much for pdf as standard. With -% features like widgets we can probably best wait till adobe tools -% themselves support it because that's probably the moment that -% functionality gets frozen/becomes definitive. Actually, acrobat -% flattens the kids tree, so that's yet another situation. The -% interesting thing is that it worked ok in acrobat 2/3 but got bugged -% in later versions. [The rationale is in html compatibility, which -% seems to be more important than compatibility of documents, which in -% turn renders acrobat useless for forms.] Anyway, synchronization is -% broken or not depending on the combination pdfversion/acrobatversion. - -\def\doFDFpresetradiorecord#1#2#3#4#5% - {\bgroup - % < pdf 1.5 (1.5 was broken) - % \setFDFswitches[Radio,NoToggleToOff,RadiosInUnison,#3]% - % > pdf 1.5 - \setFDFswitches[Radio,RadiosInUnison,#3]% - % older, else fatal error - % \setFDFkids[#4][]% - % newer - \setFDFvalues[#4][#2]% inits kidlist - \expanded{\setFDFkids[][\FDFkidlist]}% - % - \setFDFactions[#5]% - \doPDFdictionaryobject{FDF}{#1} - {%/Subtype /Widget - /FT /Btn /T (#1) /Rect [0 0 0 0] - % used to be this - % /V (#2) - % then this - % /DV (#2) - % since this bomded in 5 - % /V (#2) - % and now finally this works - /H /N - % /opt is buggy in 5.05, only works once, sigh - %\ifx\FDFfirstvalues\FDFsecondvalues - /V /#2 - %\else - % /V /\FDFdefaultindex\space - % /Opt [\FDFsecondvalues] - %\fi - /Ff \FDFflag\space - /F \FDFplus\space - \FDFkids\space - \FDFactions}% - \egroup} - -%D At the cost of some more references, we can save bytes, -%D by sharing appearance dictionaries. This code needs more -%D documentation. Surprise: - -\def\dodoFDFappearance#1#2% - {\ifx#2\empty\else - \dogetcommacommandelement1\from#2\to\commalistelement - \ifx\commalistelement\empty\else - \doPDFgetobjectreference{SYM}\commalistelement\PDFobjectreference - \edef\N{\ifFDFvalues\N /#1 \fi\PDFobjectreference\space}% - \fi - \dogetcommacommandelement2\from#2\to\commalistelement - \ifx\commalistelement\empty\else - \doPDFgetobjectreference{SYM}\commalistelement\PDFobjectreference - \edef\R{\ifFDFvalues\R /#1 \fi\PDFobjectreference\space}% - \fi - \dogetcommacommandelement3\from#2\to\commalistelement - \ifx\commalistelement\empty\else - \doPDFgetobjectreference{SYM}\commalistelement\PDFobjectreference - \edef\D{\ifFDFvalues\D /#1 \fi\PDFobjectreference\space}% - \def\FDFappearance{/H /P }% - \fi - \fi} - -\def\redoFDFappearance#1% - {\ifx#1\empty\else - \dogetcommacommandelement3\from#1\to\commalistelement - \ifx\commalistelement\empty\else - \def\FDFappearance{/H /P }% - \fi - \fi} - -\def\doFDFappearance#1#2#3% - {\ifcase#3\relax % push only field - \edef\yes{#2}% - \let\no\empty - \else % on / off field - \dogetcommacommandelement1\from#2,\to\yes - \dogetcommacommandelement2\from#2,\to\no - \fi - \def\FDFappearance{/H /N}% - \doifobjectfoundelse{FDF}{ap:#1:\yes:\no} - {\redoFDFappearance\yes - \redoFDFappearance\no} - {\presetobject{FDF}{ap:#1:\yes:\no}% funny hack - \let\N\empty\let\R\empty\let\D\empty - \dodoFDFappearance{#1}\yes - \dodoFDFappearance{Off}\no - \doPDFdictionaryobject{FDF}{ap:#1:\yes:\no} - {\ifx\N\empty\else/N \ifFDFvalues<<\N>>\else\N\fi\fi - \ifx\R\empty\else/R \ifFDFvalues<<\R>>\else\R\fi\fi - \ifx\D\empty\else/D \ifFDFvalues<<\D>>\else\D\fi\fi}}% - \doPDFgetobjectreference{FDF}{ap:#1:\yes:\no}\PDFobjectreference - \edef\FDFappearance{\FDFappearance /AP \PDFobjectreference}} - -%\def\doFDFdefault#1#2% -% {\dogetcommacommandelement1\from#1,\to\commalistelement -% \dogetcommacommandelement1\from\commalistelement\to\commalistelement -% \doifelse{\commalistelement}{#2} % kan ook met \ifx -% {\def\FDFdefault{On}}{\def\FDFdefault{Off}}} - -\def\doFDFdefault#1#2% - {\doifelse{#2}{1}{\def\FDFdefault{On}}{\def\FDFdefault{Off}}} - -%D Layer support: - -\def\setFDFlayer#1% todo : \ifx\PDFobjectreference\noPDFobjectreference ipv found - {\letempty\FDFlayer - \doifsomething{#1}% - {\checkproperty[#1]% == \dodocheckproperty\@@DriverFieldLayer - \doifobjectreferencefoundelse{PDLN}{#1} - {\doPDFgetobjectreference{PDLN}{#1}\!!stringa % we need to avoid a clash with other macros - \edef\FDFlayer{/OC \!!stringa}}% - \donothing}} - -%D The three appearances {\em normal}, \type{roll over} and -%D \type{push down} are passed as comma separated triplets, -%D that is, the second argument can look like: -%D -%D \starttyping -%D {yes,ok,fine},{no,rubish,awful} -%D \stoptyping - -%D \macros -%D {doFDFdefinefieldset,doFDFgetfieldset,doFDFiffieldset} -%D -%D Field sets, the ones we use in submitting and resetting -%D fields, are implemented using the next low level specials: -%D -%D \starttyping -%D \doFDFdefinefieldset{TAG}{name,name,...} -%D \doFDFgetfieldset{TAG} -%D \doFDFiffieldset{TAG}{sequence} -%D \stoptyping - -\def\doFDFdefinefieldset#1#2% tag commalist - {\let\FDFfieldset\empty - \def\docommand##1% - {\doPDFgetobjectreference{FDF}{##1}\PDFobjectreference - \edef\FDFfieldset{\FDFfieldset\PDFobjectreference\space}}% - \processcommacommand[#2]\docommand % nb: command - \setevalue{FDF:set:#1}{\FDFfieldset}} - -\def\doFDFgetfieldset#1% - {\getvalue{FDF:set:#1}} - -\def\doFDFiffieldset#1#2% - {\ifundefined{FDF:set:#1}\else#2\fi} - -%D In the goto specials we took care of secondary references. -%D Here we define the macros used. - -\def\doPDFresetgotowhereever - {\global\let\secondaryPDFreferences\empty} - -\doPDFresetgotowhereever % just to be sure - -% we can (in etex) share more by testing on this - -\def\savesecondaryPDFreference#1% - %{\setxvalue{PDF-SR:\the\nofsecondaryreferences}{#1}} - {\@EA\xdef\csname PDF-SR:\the\nofsecondaryreferences\endcsname{#1}} - -\def\savesecondaryPDFreference % #1 == \action - {\global\@EA\let\csname PDF-SR:\the\nofsecondaryreferences\endcsname} - -%\def\getsecondaryPDFreferences% -% {\ifcase\nofsecondaryreferences\else -% %\doifdefined{PDF-SR:\the\nofsecondaryreferences} -% \xdef\secondaryPDFreferences% -% {/Next << \csname PDF-SR:\the\nofsecondaryreferences\endcsname\space -% \secondaryPDFreferences >>}% -% \global\advance\nofsecondaryreferences \minusone -% \expandafter\getsecondaryPDFreferences -% \fi} - -% test should happen in core-ref - -\beginETEX \ifcsname - -\def\getsecondaryPDFreferences - {\ifcase\nofsecondaryreferences\else - \ifcsname PDF-SR:\the\nofsecondaryreferences\endcsname - \xdef\secondaryPDFreferences - {/Next << \csname PDF-SR:\the\nofsecondaryreferences\endcsname\space - \secondaryPDFreferences >>}% - \fi - \global\advance\nofsecondaryreferences \minusone - \expandafter\getsecondaryPDFreferences - \fi} - -\endETEX - -\beginTEX - -\def\getsecondaryPDFreferences - {\ifcase\nofsecondaryreferences\else - \@EA\ifx\csname PDF-SR:\the\nofsecondaryreferences\endcsname\relax\else - \xdef\secondaryPDFreferences - {/Next << \csname PDF-SR:\the\nofsecondaryreferences\endcsname\space - \secondaryPDFreferences >>}% - \fi - \global\advance\nofsecondaryreferences \minusone - \expandafter\getsecondaryPDFreferences - \fi} - -\endTEX - -%D \macros -%D {loadFDFfields, showFDFfields, -%D getFDFfield, setFDFfield} -%D -%D Once filled in, we can export or submit the field in the -%D \FDF\ file format. Such a file can be loaded by -%D -%D \starttyping -%D \loadFDFfields{fiel-ini} -%D \stoptyping -%D -%D or inspected by -%D -%D \starttyping -%D \showFDFfields{fiel-ini} -%D \stoptyping -%D -%D After both commands, one can use -%D -%D \starttyping -%D \getFDFfield{name} -%D \setFDFfield{name}{value} -%D \stoptyping -%D -%D to inspect and overrule the data. -%D -%D By default \CONTEXT\ calls the perl script \type{fdf2tex}. -%D This script reads the \type{fdf} file and produces a file -%D named \type{filename.fdt}. If one disables the call to this -%D script, by saying: -%D -%D \starttyping -%D \runFDFconverterfalse -%D \stoptyping -%D -%D or when \CONTEXT\ cannot find the \type{fdt} file, it tries -%D to interpret the \type{fdf} file directly. Both mechanisms -%D are rather crude. - -\newif\ifrunFDFconverter \runFDFconvertertrue - -%D The \PERL\ script produces a file formatted as: -%D -%D \starttyping -%D \beginFDFobject -%D \beginFDFdata -%D \beginFDFfields -%D \FDFfield[name=,value=] -%D \endFDFfields -%D \endFDFdata -%D \endFDFobject -%D \stoptyping -%D -%D One reason for using key value pairs is that we cannot be -%D sure or the order in which the name and value are given -%D (actually the reverse). - -\def\PERLloadFDFfields#1% will become obsolete soon - {\bgroup - \global\let\allFDFfields\empty - \ifrunFDFconverter - \executesystemcommand{fdf2tex #1}% - \let\beginFDFobject\relax \let\endFDFobject\relax - \let\beginFDFdata \relax \let\endFDFdata \relax - \let\beginFDFfields\relax \let\endFDFfields\relax - \def\FDFfield[##1]% - {\getparameters[FDF][##1]% - \doglobal\addtocommalist\FDFname\allFDFfields - \global\setFDFfield{\FDFname}{\FDFvalue}}% - \ReadFile{#1.fdt}% - \fi - \egroup} - -%D The next macro does the same job, but now in the \TEX\ way -%D of doing things. Easy eh? Will become obsolete! - -\bgroup - -\catcode`\/=\@@other -\global\let\normalslash=/ -\catcode`\/=\@@escape - -\gdef\TEXloadFDFfields#1% will become obsolete due to XFDF - {\bgroup - \setbox0=\hbox - {\global\let\allFDFfields\empty - \scratchcounter=0 - \escapechar=-1 - \catcode`\/=\@@escape - \catcode`\(=\@@begingroup - \catcode`\)=\@@endgroup - \catcode`\%=\@@letter - \let/A =\relax \let/AS =\relax \let/Kids=\relax \let/Fields=\relax - \let/F =\relax \let/ID =\relax \let/SetF=\relax \let/setFf =\relax - \let/Ff=\relax \let/Opt=\relax \let/ClrF=\relax \let/ClrFf =\relax - \let/AP=\relax \let/FDF=\relax \let/Root=\relax - \def/T##1{\check\Title{##1}} - \def/V{\bgroup\catcode`\/=\@@other\futurelet\next/doV} - \def/doV{\ifx\next\normalslash\@EA/doVb\else\@EA/doVa\fi} - \def/doVa##1{\egroup\check\Value{##1}} - \def/doVb##1##2 {\egroup\check\Value{##2}} % watch the space - \def\check##1##2% - {\def##1{##2} - \advance\scratchcounter\plusone\relax - \ifodd\scratchcounter \else - \defconvertedcommand\asciia\Title - \global\setFDFfield{\asciia}{\Value} - \doglobal\addtocommalist\Title\allFDFfields - \fi} - \ReadFile{#1.fdf}}% - \egroup} - -\egroup - -%D Whatever mechanism is used, the next macros can be used to -%D fetch the values. - -\def\getFDFfield #1{\getvalue {FDFfield::#1}} -\def\setFDFfield#1#2{\setevalue{FDFfield::#1}{#2}} - -%D Of course the fields are only present when the file is -%D loaded. - -\def\loadFDFfields#1% - {\PERLloadFDFfields{#1}% - \ifx\allFDFfields\empty - \TEXloadFDFfields{#1}% - \fi} - -\def\showFDFfields#1% - {\bgroup - \loadFDFfields{#1} - \def\docommand##1{\par##1 = \getFDFfield{##1}\par}% - \processcommacommand[\allFDFfields]\docommand - \egroup} - -%D \macros -%D {sanitizePDFencoding,sanitizePDFdocencoding} -%D -%D We already dealt with the encoding vector. Conversion from -%D \TEX\ \ASCII\ encoding to the other one, is accomplished by -%D the next few macros. Wach out: we don't group here. - -%D This will be reimplemented using the mapping mechanism. - -% \def\enablePDFdocencoding -% {\reducetocoding[pdfdoc]\simplifycommands} - -\def\enablePDFdocencoding - {\enablecoding[pdfdoc]% - \enablelanguagespecifics[\currentlanguage]% redundant ? - \simplifycommands} - -\long\def\sanitizePDFdocencoding#1\to#2% - {\enablePDFcrlf - \enablePDFdocencoding - %\honorunexpanded % otherwise problems with "e etc in de - \edef#2{#1}} - -\bgroup -\catcode`\^^M=\@@active -\gdef\enablePDFcrlf% - {\def\\{\string\r}% - \def\par{\\\\}% - \def\endgraf{\\\\}% - \catcode`\^^M=\@@active% - \let^^M=\\} -\egroup - -\let\sanitizePDFencoding\sanitizePDFdocencoding - -%D A bit out of place, but useful: - -\newevery\everysetfield\relax - -\appendtoksonce - \enablePDFdocencoding - \enablePDFcrlf -\to \everysetfield - -%D \macros -%D {doPDFinsertcomment} -%D -%D An example its use is the next special, one that deals with -%D text annotations. - -% starting point (keep this) -% -% \long\def\doPDFinsertcomment#1#2#3#4#5#6#7#8% -% {\bgroup % title width height color open symbol collect data -% \doifelsenothing{#1} -% {\let\PDFidentifier\empty} -% {\def\PDFidentifier{/T (#1)}}% -% \doifelsenothing{#4} -% {\let\PDFattributes\empty} -% {\def\PDFattributes{/C \FDFcolor{#4}}}% -% \doifundefinedelse{PDFsymbol#6} -% {\let\PDFsymbol\empty} -% {\def\PDFsymbol{/Name \getvalue{PDFsymbol#6} }}% -% \sanitizePDFencoding#8\to\PDFdata -% \setbox\scratchbox\vbox to #3 -% {\vfill -% \doPDFannotation{#2}{#3} -% {/Subtype /Text -% \ifcase#5 \else/Open true\fi -% /Contents \ifPDFunicode <\PDFdata> \else(\PDFdata) \fi -% \PDFsymbol -% \PDFidentifier -% \PDFattributes}}% -% \wd\scratchbox\zeropoint -% \ht\scratchbox\zeropoint -% \dp\scratchbox\zeropoint -% \box\scratchbox -% \egroup} - -\newcounter\nofFDFcomments - -\newif\ifPDFpopupcomments \PDFpopupcommentstrue - -\def\doPDFflushcomments - {\box\PDFsymbolbox} - -\long\def\doPDFinsertcomment#1#2#3#4#5#6#7#8% % \@@DriverCommentLayer set otherwise - {\bgroup % title width height color open symbol collect data - \presetPDFsymbolappearance{#4}{#6}{#2}{#3}\!!zeropoint% sets width/height -% \doifelsenothing{#1} -% {\let\PDFidentifier\empty} -% {\def\PDFidentifier{/T (#1)}}% - \doifelsenothing{#1} - {\let\PDFidentifier\empty} - {\sanitizePDFencoding#1\to\PDFcommenttitle - \def\PDFidentifier{/T \ifPDFunicode <\PDFcommenttitle>\else (\PDFcommenttitle)\fi}}% - \sanitizePDFencoding#8\to\PDFdata - \setFDFlayer\@@DriverCommentLayer - \startPDFsymbolappearance - \ifPDFpopupcomments - \doglobal\increment\nofFDFcomments - \doifobjectreferencefoundelse{FDF}{c:\nofFDFcomments} - {\doPDFgetobjectreference{FDF}{c:\nofFDFcomments}\PDFobjectreference - \donetrue} - \donefalse - \ifdone - \setbox\scratchbox\hbox - {\doPDFannotationobject{FDF}{c::\nofFDFcomments}{#2}{#3}% text window, size does not work - {/Subtype /Popup - /Parent \PDFobjectreference}}% - \ifcase#7\relax - \vbox to \height{\forgetall\vskip#3\box\scratchbox\vss}% - \else % incredible trial and error hack - % it's quite a mess, the annot width cannot be set, well, it can - % but the appearance and text sizes get mixed up -% \setbox\scratchbox\vbox to \height{\forgetall\vskip#3\box\scratchbox\vss}% -% \global\setbox\PDFsymbolbox\vbox -% {\hsize#2% -% \forgetall -% \vsmash{\box\PDFsymbolbox} -% \box\scratchbox}% - % this may change when acrobat gets less bugged - \setbox\scratchbox\vbox to #3{\forgetall\vss\box\scratchbox}% - \wd\scratchbox#2% - \global\setbox\PDFsymbolbox\vbox - {\startoverlay{\box\PDFsymbolbox}{\box\scratchbox}\stopoverlay}% - \fi - \fi - % generic - \doifobjectreferencefoundelse{FDF}{c::\nofFDFcomments} - {\doPDFgetobjectreference{FDF}{c::\nofFDFcomments}\PDFobjectreference - \donetrue} - \donefalse - \doPDFannotationobject{FDF}{c:\nofFDFcomments}{\width}{\height} - {/Subtype /Text - \ifcase#5 \else/Open true\fi - % pdftex (efficient) - % \ifdone /Popup \PDFobjref\pdflastannot\fi - % generic (less efficient) - \ifdone /Popup \PDFobjectreference\fi - /Contents \ifPDFunicode <\PDFdata> \else(\PDFdata) \fi - \PDFidentifier - \FDFlayer - \PDFsymbol - \PDFattributes}% - \else - \doPDFannotation{#2}{#3} - {/Subtype /Text - \ifcase#5 \else/Open true\fi - /Contents \ifPDFunicode <\PDFdata> \else(\PDFdata) \fi - \FDFlayer - \PDFsymbol - \PDFidentifier - \PDFattributes}% - \fi - \stopPDFsymbolappearance - \egroup} - -% symbols with a reasonable default of 18/24 pt - -\newbox\PDFsymbolbox - -\def\PDFsymbolNew {/Insert} -\def\PDFsymbolBalloon {/Comment} -\def\PDFsymbolAddition {/NewParagraph} -\def\PDFsymbolHelp {/Help} -\def\PDFsymbolParagraph {/Paragraph} -\def\PDFsymbolKey {/Key } - -\def\PDFsymbolGraph {/Graph} -\def\PDFsymbolPaperclip {/Paperclip} -\def\PDFsymbolAttachment{/Attachment} -\def\PDFsymbolTag {/Tag} - -\def\startPDFsymbolappearance - {\setbox\scratchbox\vbox to \totalheight \bgroup \vfill} - -\def\stopPDFsymbolappearance - {\egroup - \setbox\scratchbox\hbox{\lower\depth\box\scratchbox}% - \wd\scratchbox\width - \ht\scratchbox\height - \dp\scratchbox\depth - \box\scratchbox} - -\def\presetPDFsymbolappearance#1#2#3#4#5% symbol color width height depth - {\doifelsenothing{#1} - {\let\PDFattributes\empty} - {\def\PDFattributes{/C \FDFcolor{#1}}}% - \scratchdimen#3\edef\width {\the\scratchdimen}% - \scratchdimen#4\edef\height{\the\scratchdimen}% - \scratchdimen#5\edef\depth {\the\scratchdimen}% - \advance\scratchdimen\height\edef\totalheight{\the\scratchdimen}% - \doifelsenothing{#2} - {\let\PDFsymbol\empty} - {\ifundefined{PDFsymbol#2}% - \getfromcommacommand[#2][1]\let\PDFsymbolnormalsymbol\commalistelement - \getfromcommacommand[#2][2]\let\PDFsymboldownsymbol \commalistelement - \doifsymboldefinedelse\PDFsymbolnormalsymbol - {\doifsymboldefinedelse\PDFsymboldownsymbol - {\dopresetPDFsymbolappearance - \PDFsymbolnormalsymbol\PDFsymboldownsymbol} - {\dopresetPDFsymbolappearance - \PDFsymbolnormalsymbol\PDFsymbolnormalsymbol}} - {\doifsymboldefinedelse\PDFsymboldownsymbol - {\dopresetPDFsymbolappearance - \PDFsymboldownsymbol\PDFsymboldownsymbol} - {\let\PDFsymbol\empty}}% - \else - \def\PDFsymbol{/Name \getvalue{PDFsymbol#2} }% - \fi}} - -\def\dopresetPDFsymbolappearance#1#2% - {\dopresetfieldsymbol{#1}% - \dopresetfieldsymbol{#2}% - \setbox\scratchbox\hbox{\symbol[#1]}% - \edef\width {\the\wd\scratchbox}% - \edef\height{\the\ht\scratchbox}% - \edef\depth {\the\dp\scratchbox}% - \scratchdimen\height \advance\scratchdimen\depth - \edef\totalheight{\the\scratchdimen}% - \doPDFgetobjectreference{SYM}{#1}\FDFsymbolNappearance - \doPDFgetobjectreference{SYM}{#2}\FDFsymbolDappearance - \edef\PDFsymbol - {/AP <</N \FDFsymbolNappearance /D \FDFsymbolDappearance>>}} - -%D Hooked into \CONTEXT, this special supports -%D -%D \starttyping -%D \startcomment -%D hello beautiful\\world -%D \stopcomment -%D -%D \startcomment[hello] -%D de \'e\'erste keer -%D the f\'irst time -%D \stopcommen -%D -%D \startcommentaar[hallo][color=green,width=4cm,height=3cm] -%D first -%D -%D second -%D \stopcommentaar -%D \stoptyping -%D -%D So, special characters, forced linebreaks using \type{\\} -%D and \type{\par} are handled in the appropriate way. - -%D \macros -%D {doPDFovalbox} -%D -%D For drawing ovals we use quite raw \PDF\ code. The next -%D implementation does not differ that much from the one -%D implemented in the \POSTSCRIPT\ driver. - -\def\doPDFovalcalc#1#2#3% - {\dimen2=#1% - \advance\dimen2 #2\relax - \PointsToBigPoints{\dimen2}#3} - -\def\doPDFovalbox#1#2#3#4#5#6#7#8% todo: \scratchdimen/\scatchbox - {\bgroup - \dimen0=#4\divide\dimen0 \plustwo - \doPDFovalcalc{0pt}{+\dimen0}\xmin - \doPDFovalcalc{#1}{-\dimen0}\xmax - \doPDFovalcalc{#2}{-\dimen0}\ymax - \doPDFovalcalc{-#3}{+\dimen0}\ymin - \advance\dimen0 by #5% - \doPDFovalcalc{0pt}{+\dimen0}\xxmin - \doPDFovalcalc{#1}{-\dimen0}\xxmax - \doPDFovalcalc{#2}{-\dimen0}\yymax - \doPDFovalcalc{-#3}{+\dimen0}\yymin - \doPDFovalcalc{#4}{\zeropoint}\stroke - \doPDFovalcalc{#5}{\zeropoint}\radius - \edef\dostroke{#6}% - \edef\dofill{#7}% - \edef\mode{\number#8 \space}% - % no \ifcase, else \relax in pdfcode - \setbox\scratchbox\hbox - {\ifnum\dostroke\dofill>\zerocount - \ifPDFstrokecolor\else\ifnum\dostroke=\plusone - \writestatus\m!colors{pdf stroke color will fail}\wait - \fi\fi - \PDFcode - {q - \stroke\space w - \ifcase\mode - \xxmin\space \ymin \space m - \xxmax\space \ymin \space l - \xmax \space \ymin \space \xmax \space \yymin\space y - \xmax \space \yymax\space l - \xmax \space \ymax \space \xxmax\space \ymax \space y - \xxmin\space \ymax \space l - \xmin \space \ymax \space \xmin \space \yymax\space y - \xmin \space \yymin\space l - \xmin \space \ymin \space \xxmin\space \ymin \space y - h - \or % 1 - \xxmin\space \ymin \space m - \xxmax\space \ymin \space l - \xmax \space \ymin \space \xmax \space \yymin\space y - \xmax \space \ymax \space l - \xmin \space \ymax \space l - \xmin \space \yymin\space l - \xmin \space \ymin \space \xxmin\space \ymin \space y - h - \or % 2 - \xxmin\space \ymin \space m - \xmax \space \ymin \space l - \xmax \space \ymax \space l - \xxmin\space \ymax \space l - \xmin \space \ymax \space \xmin \space \yymax\space y - \xmin \space \yymin\space l - \xmin \space \ymin \space \xxmin\space \ymin \space y - h - \or % 3 - \xmin \space \ymin \space m - \xmax \space \ymin \space l - \xmax \space \yymax\space l - \xmax \space \ymax \space \xxmax\space \ymax \space y - \xxmin\space \ymax \space l - \xmin \space \ymax \space \xmin \space \yymax\space y - \xmin \space \ymin \space l - h - \or % 4 - \xmin \space \ymin \space m - \xxmax\space \ymin \space l - \xmax \space \ymin \space \xmax \space \yymin\space y - \xmax \space \yymax\space l - \xmax \space \ymax \space \xxmax\space \ymax \space y - \xmin \space \ymax \space l - \xmin \space \ymin\space l - h - \or % 5 - \xmin \space \ymin \space m - \xmax \space \ymin \space l - \xmax \space \yymax\space l - \xmax \space \ymax \space \xxmax\space \ymax \space y - \xmin \space \ymax \space l - \xmin \space \ymin \space l - h - \or % 6 - \xmin \space \ymin \space m - \xxmax\space \ymin \space l - \xmax \space \ymin \space \xmax \space \yymin\space y - \xmax \space \ymax \space l - \xmin \space \ymax \space l - \xmin \space \ymin \space l - h - \or - \xxmin\space \ymin \space m - \xmax \space \ymin \space l - \xmax \space \ymax \space l - \xmin \space \ymax \space l - \xmin \space \yymin\space l - \xmin \space \ymin \space \xxmin\space \ymin \space y - h - \or - \xmin \space \ymin \space m - \xmax \space \ymin \space l - \xmax \space \ymax \space l - \xxmin\space \ymax \space l - \xmin \space \ymax \space \xmin \space \yymax\space y - \xmin \space \ymin \space l - h - \or % 9 top open - \xmin \space \ymax \space m - \xmin \space \yymin\space l - \xmin \space \ymin \space \xxmin\space \ymin \space y - \xxmax\space \ymin \space l - \xmax \space \ymin \space \xmax \space \yymin\space y - \xmax \space \ymax \space l - \or % 10 right open - \xmax \space \ymax \space m - \xxmin\space \ymax \space l - \xmin \space \ymax \space \xmin \space \yymax\space y - \xmin \space \yymin\space l - \xmin \space \ymin \space \xxmin\space \ymin \space y - \xmax\space \ymin \space l - \or % 11 bottom open - \xmax \space \ymin \space m - \xmax \space \yymax\space l - \xmax \space \ymax \space \xxmax \space \ymax\space y - \xxmin\space \ymax \space l - \xmin \space \ymax \space \xmin \space \yymax\space y - \xmin \space \ymin \space l - \or % 12 left open - \xmin \space \ymax \space m - \xxmax\space \ymax \space l - \xmax \space \ymax \space \xmax \space \yymax\space y - \xmax \space \yymin\space l - \xmax \space \ymin \space \xxmax\space \ymin \space y - \xmin \space \ymin \space l - \or % 13 - \xmin \space \ymax \space m - \xxmax\space \ymax \space l - \xmax \space \ymax \space \xmax \space \yymax\space y - \xmax\space \ymin \space l - \or % 14 - \xmax \space \ymax \space m - \xmax \space \yymin\space l - \xmax \space \ymin \space \xxmax\space \ymin \space y - \xmin \space \ymin \space l - \or % 15 - \xmax \space \ymin \space m - \xxmin\space \ymin \space l - \xmin \space \ymin \space \xmin \space \yymin\space y - \xmin \space \ymax \space l - \or % 16 - \xmin \space \ymin \space m - \xmin \space \yymax\space l - \xmin \space \ymax \space \xxmin\space \ymax \space y - \xmax \space \ymax \space l - \or % 17 - \xxmax\space \ymax \space m - \xmax \space \ymax \space \xmax \space \yymax\space y - \or % 18 - \xmax \space \yymin\space m - \xmax \space \ymin \space \xxmax\space \ymin \space y - \or % 19 - \xxmin\space \ymin \space m - \xmin \space \ymin \space \xmin \space \yymin\space y - \or % 20 - \xmin \space \yymax\space m - \xmin \space \ymax \space \xxmin\space \ymax \space y - \or % 21 - \xxmax\space \ymax \space m - \xmax \space \ymax \space \xmax \space \yymax\space y - \xmin \space \yymax\space m - \xmin \space \ymax \space \xxmin\space \ymax \space y - \or % 22 - \xxmax\space \ymax \space m - \xmax \space \ymax \space \xmax \space \yymax\space y - \xmax \space \yymin\space m - \xmax \space \ymin \space \xxmax\space \ymin \space y - \or % 23 - \xmax \space \yymin\space m - \xmax \space \ymin \space \xxmax\space \ymin \space y - \xxmin\space \ymin \space m - \xmin \space \ymin \space \xmin \space \yymin\space y - \or % 24 - \xxmin\space \ymin \space m - \xmin \space \ymin \space \xmin \space \yymin\space y - \xmin \space \yymax\space m - \xmin \space \ymax \space \xxmin\space \ymax \space y - \or % 25 - \xxmax\space \ymax \space m - \xmax \space \ymax \space \xmax \space \yymax\space y - \xmax \space \yymin\space m - \xmax \space \ymin \space \xxmax\space \ymin \space y - \xxmin\space \ymin \space m - \xmin \space \ymin \space \xmin \space \yymin\space y - \xmin \space \yymax\space m - \xmin \space \ymax \space \xxmin\space \ymax \space y - \or % 26 - \xmax \space \yymin\space m - \xmax \space \ymin \space \xxmax\space \ymin \space y - \xmin \space \yymax\space m - \xmin \space \ymax \space \xxmin\space \ymax \space y - \or % 27 - \xxmax\space \ymax \space m - \xmax \space \ymax \space \xmax \space \yymax\space y - \xxmin\space \ymin \space m - \xmin \space \ymin \space \xmin \space \yymin\space y - \or % 28 - \fi - \ifnum\mode>8 - S - \else - \ifnum\dostroke=\plusone S \fi - \ifnum\dofill =\plusone f \fi - \fi - Q}% - \fi}% - \wd\scratchbox#1\ht\scratchbox#2\dp\scratchbox#3\box\scratchbox - \egroup} - -%D \macros -%D {doPDFstartgraymode,doPDFstopgraymode, -%D doPDFstartrgbcolormode,doPDFstartcmykcolormode,doPDFstartgraycolormode, -%D doPDFstopcolormode} -%D -%D In \PDF\ there are two color states, one for strokes and one -%D for fills. This means that we have to set the color in a -%D rather redundant looking way. Unfortunately this makes the -%D \PDF\ file much larger than needed. We can save few bytes -%D by not setting the stroke color. Due to zip compression we -%D only save a few percent. - -% \newif\ifPDFstrokecolor \PDFstrokecolortrue - -\def\doPDFstartgraymode#1% -% {\PDFdirectcode{#1 g\ifPDFstrokecolor\space#1 G\fi}} - {\PDFcode{#1 g\ifPDFstrokecolor\space#1 G\fi}} - -\def\doPDFstopgraymode -% {\PDFdirectcode{0 g\ifPDFstrokecolor\space0 G\fi}} - {\PDFcode{0 g\ifPDFstrokecolor\space0 G\fi}} - -\def\doPDFstartrgbcolormode#1#2#3% -% {\PDFdirectcode{#1 #2 #3 rg\ifPDFstrokecolor\space#1 #2 #3 RG\fi}} - {\PDFcode{#1 #2 #3 rg\ifPDFstrokecolor\space#1 #2 #3 RG\fi}} - -\def\doPDFstartcmykcolormode#1#2#3#4% -% {\PDFdirectcode{#1 #2 #3 #4 k\ifPDFstrokecolor\space#1 #2 #3 #4 K\fi}} - {\PDFcode{#1 #2 #3 #4 k\ifPDFstrokecolor\space#1 #2 #3 #4 K\fi}} - -\def\doPDFstartgraycolormode#1% -% {\PDFdirectcode{#1 g\ifPDFstrokecolor\space#1 G\fi}} - {\PDFcode{#1 g\ifPDFstrokecolor\space#1 G\fi}} - -\def\doPDFstartspotcolormode#1#2% redefining spotcolors is not possible anyway - {\ifundefined{pdf:scs:#2}% - \bgroup - \getcommacommandsize[#2]% - \ifcase\commalistsize\or - \setxvalue{pdf:scs:#2}{#2 SCN #2 scn}% \setxvalue{pdf:scs:#2}{#2 SC #2 sc}% - \else - \let\PDFspotcolorspecs\empty - \def\dospotcolorcommand##1{\edef\PDFspotcolorspecs{\PDFspotcolorspecs##1\space}}% - \processcommacommand[#2]\dospotcolorcommand - \setxvalue{pdf:scs:#2}{\PDFspotcolorspecs SCN \PDFspotcolorspecs scn}% - \fi - \egroup - \fi -% \PDFdirectcode{/#1 cs /#1 CS \PDFgetspotcolorspec{#2}}} - \PDFcode{/#1 cs /#1 CS \PDFgetspotcolorspec{#2}}} - -\def\PDFgetspotcolorspec#1% - {\executeifdefined{pdf:scs:#1}\empty} % better no default than one with too less args - -\def\doPDFstartnonecolormode -% {\PDFdirectcode{/None CS 1 SC /None cs 1 sc}} - {\PDFcode{/None CS 1 SC /None cs 1 sc}} - -\def\doPDFstopcolormode -% {\PDFdirectcode{0 g\ifPDFstrokecolor\space0 G\fi}} - {\PDFcode{0 g\ifPDFstrokecolor\space0 G\fi}} - -%D We need to register the spot colors and their fallbacks. - -% we cannot use /DeviceN since GS <=7.21 breaks on it -% and Jaws does not handle it at all {[/DeviceN [/All|/None] -% /Device#2 \PDFobjref\pdflastobj]} so we use separation -% colors that work and print ok - -\def\doPDFregistersomespotcolor#1#2#3#4% implemented in the driver - {\writestatus\m!systems{missing spot color definition}\wait} - -\def\doPDFregisternonecolor % internal command - {\doPDFregistergrayspotcolor{None}{1}% - \globallet\doPDFregisternonecolor\relax} - -\def\doPDFregisterspotcolorname#1#2% implemented in the driver - {} - -\definespecial\doregisterspotcolorname{\doPDFregisterspotcolorname} - -\def\dodoPDFregisterrgbspotcolor#1#2#3#4#5#6#7% name noffractions names p's r g b - {\doPDFregistersomespotcolor{#1}{#2}{#3}{#4}{RGB}{0.0 1.0 0.0 1.0 0.0 1.0}% - {\ifcase#2\or dup #5 mul exch dup #6 mul exch #7 mul\else#5 #6 #7\fi}} - -\def\dodoPDFregistercmykspotcolor#1#2#3#4#5#6#7#8% name noffractions names p's c m y k - {\doPDFregistersomespotcolor{#1}{#2}{#3}{#4}{CMYK}{0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0}% - {\ifcase#2\or dup #5 mul exch dup #6 mul exch dup #7 mul exch #8 mul\else #5 #6 #7 #8\fi}} - -\def\dodoPDFregistergrayspotcolor#1#2#3#4#5% name noffractions names p's s - {\doPDFregistersomespotcolor{#1}{#2}{#3}{#4}{Gray}{0.0 1.0}% - {\ifcase#2\or #5 mul\else #5\fi}} - -% \let\doPDFregisterrgbspotcolor \dodoPDFregisterrgbspotcolor -% \let\doPDFregistercmykspotcolor\dodoPDFregistercmykspotcolor -% \let\doPDFregistergrayspotcolor\dodoPDFregistergrayspotcolor - -\def\doPDFregisterrgbspotcolor#1#2#3#4#5#6#7% name noffractions names p's r g b - {\ifRGBsupported - \dodoPDFregisterrgbspotcolor{#1}{#2}{#3}{#4}{#5}{#6}{#7}% - \else - \edef\@@cl@@r{#5}\edef\@@cl@@g{#6}\edef\@@cl@@b{#7}% - \ifCMYKsupported - \convertRGBtoCMYK\@@cl@@r\@@cl@@g\@@cl@@b - \dodoPDFregistercmykspotcolor{#1}{#2}{#3}{#4}\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k - \else - \convertRGBtoGRAY\@@cl@@r\@@cl@@g\@@cl@@b - \dodoPDFregistergrayspotcolor{#1}{#2}{#3}{#4}\@@cl@@s - \fi - \fi} - -\def\doPDFregistercmykspotcolor#1#2#3#4#5#6#7#8% name noffractions names p's c m y k - {\ifCMYKsupported - \dodoPDFregistercmykspotcolor{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}% - \else - \edef\@@cl@@c{#5}\edef\@@cl@@m{#6}\edef\@@cl@@y{#7}\edef\@@cl@@k{#8}% - \ifRGBsupported - \convertCMYKtoRGB\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k - \dodoPDFregisterrgbspotcolor{#1}{#2}{#3}{#4}\@@cl@@r\@@cl@@g\@@cl@@b - \else - \convertCMYKtoGRAY\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k - \dodoPDFregistergrayspotcolor{#1}{#2}{#3}{#4}\@@cl@@s - \fi - \fi} - -\def\doPDFregistergrayspotcolor{\dodoPDFregistergrayspotcolor} - -%D New and very experimental. - -\def\doPDFregistercmykindexcolor#1#2#3#4#5#6#7#8% name noffractions names p's c m y k - {\doPDFregistersomeindexcolor{#1}{#2}{#3}{#4}{CMYK}{0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0}% - {dup #5 mul exch dup #6 mul exch dup #7 mul exch #8 mul}} - -\def\doPDFregisterrgbindexcolor#1#2#3#4#5#6#7% name noffractions names p's r g b - {\doPDFregistersomeindexcolor{#1}{#2}{#3}{#4}{RGB}{0.0 1.0 0.0 1.0 0.0 1.0}% - {dup #5 mul exch dup #6 mul exch #7 mul}} - -\def\doPDFregistergrayindexcolor#1#2#3#4#5% name noffractions names p's s - {\doPDFregistersomeindexcolor{#1}{#2}{#3}{#4}{Gray}{0.0 1.0}% - {pop}} - -\let\checkpredefinedcolor\predefineindexcolor % we need an index in order to negate bitmaps - -\def\doPDFregisterfigurecolor#1% always an index color - {\dogetobjectreference - {PDFIX} - {\internalspotcolorname{#1}} - \PDFimagecolorreference} - -%D \macros -%D {doPDFstartrotation,doPDFstoprotation} -%D -%D Rotating some text can be accomplished by setting the first -%D four elements of the transform matrix. We only support some -%D fixed angles. The \type{q}'s take care of grouping. - -% The original: -% -% \def\doPDFstartrotation#1% -% {\PDFcode{q}% -% \processaction -% [#1] -% [ 90=>\PDFcode{ 0 1 -1 0 0 0 cm}, -% 180=>\PDFcode{-1 0 0 -1 0 0 cm}, -% 270=>\PDFcode{ 0 -1 1 0 0 0 cm}, -% 360=>\PDFcode{ 1 0 0 1 0 0 cm}]} -% -% We cannot directly pass an angle, but have to calculate -% factors (rx and ry). As in the \METAPOST\ to \PDF\ -% converter module we need to compensate the deformation -% by setting (sx and sy). -% -% Optimized but bigger: -% -% \def\doPDFstartrotation#1% -% {\PDFcode{q}% -% \processaction -% [#1] -% [ 0=>\PDFcode{ 1 0 0 1 0 0 cm}, -% 90=>\PDFcode{ 0 1 -1 0 0 0 cm}, -% 180=>\PDFcode{-1 0 0 -1 0 0 cm}, -% 270=>\PDFcode{ 0 -1 1 0 0 0 cm}, -% 360=>\PDFcode{ 1 0 0 1 0 0 cm}, -% #1=>%\calculatecos{#1}% already calculated in core macro -% %\calculatesin{#1}% already calculated in core macro -% \edef\cos{\calculatedcos{#1}}% -% \edef\sin{\calculatedsin{#1}}% -% \PDFcode{\cos \space % cos -% \sin \space % sin -% \negated\sin\space % -sin -% \cos \space % cos -% 0 0 cm}]} -% -% Since the sine and cosine values are preset and rounded we -% can use the next alternative without running into inaccuracies. - -\def\doPDFstartrotation#1% grouped - {\calculatecos{#1}% already calculated in core macro - \calculatesin{#1}% already calculated in core macro - \edef\cos{\calculatedcos{#1}}% - \edef\sin{\calculatedsin{#1}}% - \PDFcode{q \cos\space\sin\space\negated\sin\space\cos\space0 0 cm}} - -\def\doPDFstoprotation - {\PDFcode{Q}} - -%D \macros -%D {doPDFstartscaling,doPDFstopscaling} -%D -%D Scaling is rather straightforward: - -\def\@@PDFzeroscale{.0001} - -\def\doPDFstartscaling#1#2% the test is needed because acrobat is bugged! - {\PDFcode{q \ifdim#1\points=\zeropoint\@@PDFzeroscale\else#1\fi\space 0 0 - \ifdim#2\points=\zeropoint\@@PDFzeroscale\else#2\fi\space 0 0 cm}} - -% \def\doPDFstartscaling#1#2% the test is needed because acrobat is bugged! -% {\PDFcode{q\ifdim#1\points=\zeropoint\else\ifdim#2\points=\zeropoint\else -% \space#1\space 0 0 #2\space 0 0 cm\fi\fi}} - -\def\doPDFstopscaling - {\PDFcode{Q}} - -%D \macros -%D {doPDFstartmirroring,doPDFstopmirroring} -%D -%D Mirroring is implemented in a similar way: - -\def\doPDFstartmirroring - {\PDFcode{-1 0 0 1 0 0 cm}} - -\def\doPDFstopmirroring - {\PDFcode{-1 0 0 1 0 0 cm}} - -%D \macros -%D {doPDFstartnegative,doPDFstopnegative} -%D -%D When producing output for an image setter, sometimes negative -%D output is needed. - -\def\doPDFstartnegative - {\ifx\initializePDFnegative\undefined\else - \initializePDFnegative -% \PDFdirectcode{/GSnegative gs}% - \PDFcode{/GSnegative gs}% - \fi} - -\def\doPDFstopnegative - {\ifx\initializePDFnegative\undefined\else - \initializePDFnegative -% \PDFdirectcode{/GSpositive gs}% - \PDFcode{/GSpositive gs}% - \fi} - -%D \macros -%D {doPDFstartoverprint,doPDFstopoverprint} -%D -%D Some printers like overprint more than knockout. - -\def\doPDFstartoverprint - {\ifx\initializePDFoverprint\undefined\else - \initializePDFoverprint -% \PDFdirectcode{/GSoverprint gs}% - \PDFcode{/GSoverprint gs}% - \fi} - -\def\doPDFstopoverprint - {\ifx\initializePDFoverprint\undefined\else - \initializePDFoverprint -% \PDFdirectcode{/GSknockout gs}% - \PDFcode{/GSknockout gs}% wrong - \fi} - -%D Transparency support: - -\newif\ifPDFtransparencysupported - -\def\PDFtransparancydictionary#1#2#3% type fraction extras - {<</Type /ExtGState - /ca #2 /CA #2 - /BM /\ifcase#1 Normal\or Normal\or Multiply\or Screen\or - Overlay\or SoftLight\or HardLight\or ColorDodge\or - ColorBurn\or Darken\or Lighten\or Difference\or - Exclusion\else Compatible\fi - #3>>} - -\def\dodoPDFstarttransparency#1#2% - {\presetPDFtransparency{#1}{#2}% - \PDFcode{\PDFtransparencyidentifier\space gs }} - -\def\dodoPDFstoptransparency - {\PDFcode{/Tr0 gs }} - -\def\doPDFstarttransparency - {\ifPDFtransparencysupported - \global\let\doPDFstarttransparency\dodoPDFstarttransparency - \global\let\doPDFstoptransparency \dodoPDFstoptransparency - \initializetransparency - \expandafter\doPDFstarttransparency - \else - \expandafter\gobbletwoarguments - \fi} - -% \let\doPDFstoptransparency\relax -% -% This is tricky: because a text stream is handled before -% the page body is built, we can run into stops that will -% match an outer start; however, the stop is needed in case -% of a text color: [text color text] [other color text] on a -% first page combined with color splitting will go wrong if -% we stick to the relaxing method. - -\def\doPDFstoptransparency - {\ifPDFtransparencysupported - \initializetransparency - \dodoPDFstoptransparency - \fi} - -%D These use: - -\let\PDFtransparencyresetreference \empty -\let\PDFtransparencyresetidentifier\empty - -\let\PDFtransparencyreference \empty -\let\PDFtransparencyidentifier\empty - -\let\presetPDFtransparency \gobbletwoarguments -\let\initializetransparency\relax - -%D New trickery: - -\definespecial\dostartgraphicgroup{\PDFcode{q}} -\definespecial\dostopgraphicgroup {\PDFcode{Q}} - -%D Even newer trickery: - -\definespecial\dostartviewerlayer {\doPDFstartlayer} -\definespecial\dostopviewerlayer {\doPDFstoplayer} -\definespecial\dodefineviewerlayer{\doPDFdefinelayer} - -\let\PDFtextlayers\empty -\let\PDFpagelayers\empty -\let\PDFhidelayers\empty -\let\PDFvidelayers\empty - -% \def\doPDFstartlayer#1{\PDFdirectcode{/OC /#1 BDC}} -% \def\doPDFstoplayer {\PDFdirectcode {EMC}} - -\def\doPDFstartlayer#1{\PDFcode{/OC /#1 BDC}} -\def\doPDFstoplayer {\PDFcode {EMC}} - -% resource -> prop -> mc's -> OCG|OCMD (nested) - -% ocg: - -% /Intent/Design - -% ocmd - -% /P /AllOn - -% kan zelf ocmd bevatten - -\def\doPDFdefinelayer#1#2#3#4#5% tag title visible type printable -% {\driverreferenced \doPDFdictionaryobject{PDLN}{#1} - {\doPDFdictionaryobject{PDLN}{#1} - {/Type /OCG - \ifcase#4 \or - /Intent /Design % disable layer hiding by user - \fi - \ifnum#5=\zerocount - /Usage << /Print << /PrintState /OFF >> >> % printable or not - \fi - /Name (#2)}% - \doPDFgetobjectreference{PDLN}{#1}\PDFobjectreference - \xdef\PDFtextlayers{\PDFtextlayers\space\PDFobjectreference}% - \doifelse{#3}\v!start - {\xdef\PDFvidelayers{\PDFvidelayers\space\PDFobjectreference}}% - {\xdef\PDFhidelayers{\PDFhidelayers\space\PDFobjectreference}}% - %\driverreferenced \doPDFdictionaryobject{PDLD}{#1} - \doPDFdictionaryobject{PDLD}{#1} - {/Type /OCMD - /OCGs [\PDFobjectreference]}% - \doPDFgetobjectreference{PDLD}{#1}\PDFobjectreference - \xdef\PDFpagelayers{\PDFpagelayers\space /#1 \PDFobjectreference}} - -\def\flushPDFtextlayers - {\ifx\PDFtextlayers\empty \else - \driverreferenced \doPDFarrayobject{PDF}{textlayers}{\PDFtextlayers}% - \doPDFgetobjectreference{PDF}{textlayers}\!!stringa - \ifx\PDFvidelayers\empty - \def\!!stringb{[null]}% - \else - \driverreferenced \doPDFarrayobject{PDF}{videlayers}{\PDFvidelayers}% - \doPDFgetobjectreference{PDF}{videlayers}\!!stringb - \fi - \ifx\PDFhidelayers\empty - \def\!!stringc{[null]}% - \else - \driverreferenced \doPDFarrayobject{PDF}{hidelayers}{\PDFhidelayers}% - \doPDFgetobjectreference{PDF}{hidelayers}\!!stringc - \fi - \doPDFaddtocatalog - {/OCProperties - << % display in menu - /D << /Order \!!stringa - /ON \!!stringb - /OFF \!!stringc >> - % used properties - /OCGs \!!stringa >>}% - \globallet\flushPDFtextlayers\relax - \fi} - -\def\flushPDFpagelayers - {\ifx\PDFpagelayers\empty \else - \doPDFpageresource{/Properties <<\PDFpagelayers>>}% - \fi} - -\prependtoksonce \flushPDFpagelayers \to \everyshipout -\prependtoksonce \flushPDFtextlayers \to \everylastshipout - -\def\PDFlayeractionlist{null} - -\def\PDFexecutehidelayer {/SetOCGState /State [/OFF \PDFlayeractionlist]} -\def\PDFexecutevidelayer {/SetOCGState /State [/ON \PDFlayeractionlist]} -\def\PDFexecutetogglelayer {/SetOCGState /State [/Toggle \PDFlayeractionlist]} - -\def\domakeviewerlayerlist#1% - {\bgroup - \globallet\PDFlayeractionlist\empty - \def\docommand##1% - {\doPDFgetobjectreference{PDLN}{##1}\PDFobjectreference - \xdef\PDFlayeractionlist{\PDFlayeractionlist\space\PDFobjectreference}}% - \processcommalist[#1]\docommand - \egroup} - -%D Something rather pdf dependent: - -% #1 => 1=fill 2=stroke 3=strokedfill 4=invisible -% #2 => linewidth -% #3 => spacing (beware, one needs to set the hsize as well) - -\def\doPDFstartfonteffect#1#2#3% - {\ifdim#2>\zeropoint - \PointsToBigPoints{#2}\ascii -% \PDFdirectcode{\ascii\space w}% - \PDFcode{\ascii\space w}% - \fi - \ifdim#3\points=\onepoint\else - \scratchdimen#3\points -% \PDFdirectcode{\withoutpt{\the\scratchdimen}\space Tc}% - \PDFcode{\withoutpt{\the\scratchdimen}\space Tc}% - \fi -% \PDFdirectcode{\purenumber#1 Tr}} - \PDFcode{\purenumber#1 Tr}} - -\def\doPDFstopfonteffect -% {\PDFdirectcode{1 w 0 Tc 0 Tr}} - {\PDFcode{1 w 0 Tc 0 Tr}} - -%D Handy for the \METAPOST\ to \PDF\ converter: - -\newevery \everyPDFximage \relax -\newevery \everyPDFxform \relax - -\appendtoksonce - \collectPDFresources - \global\let\currentPDFresources\collectedPDFresources -\to \everyPDFxform - -\let\collectedPDFresources\empty - -\def\collectPDFresources % suboptimal - {\doifobjectreferencefoundelse{FDF}{docushades} % redundant, we have an reserved object now - {\doPDFgetobjectreference{FDF}{docushades}\PDFobjectreference - \xdef\collectedPDFresources{\collectedPDFresources/Shading \PDFobjectreference}}\donothing - \doifobjectreferencefoundelse{FDF}{docuextgstates} - {\doPDFgetobjectreference{FDF}{docuextgstates}\PDFobjectreference - \xdef\collectedPDFresources{\collectedPDFresources/ExtGState \PDFobjectreference}}\donothing - \doifobjectreferencefoundelse{FDF}{colorspaces} - {\doPDFgetobjectreference{FDF}{colorspaces}\PDFobjectreference - \xdef\collectedPDFresources{\collectedPDFresources/ColorSpace \PDFobjectreference}}\donothing - \global\let\collectPDFresources\relax} - -%D And that was all. - -\stopspecials - -\ifx\fullytransparentcolor\undefined \else - - \def\fullytransparentcolor - {\doPDFregisternonecolor - \doPDFstartnonecolormode} - - \let\doPDFstarttransparency\gobbletwoarguments - \let\doPDFstoptransparency\relax - -\fi - -\loadmarkfile{spec-fdf} - -\protect \endinput |