diff options
Diffstat (limited to 'Master/texmf-dist/tex/context/base/spec-pdf.tex')
-rw-r--r-- | Master/texmf-dist/tex/context/base/spec-pdf.tex | 484 |
1 files changed, 484 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/context/base/spec-pdf.tex b/Master/texmf-dist/tex/context/base/spec-pdf.tex new file mode 100644 index 00000000000..ae3f582c70e --- /dev/null +++ b/Master/texmf-dist/tex/context/base/spec-pdf.tex @@ -0,0 +1,484 @@ +%D \module +%D [ file=spec-pdf, +%D version=1997.09.20, +%D title=\CONTEXT\ Special Macros, +%D subtitle=Adobe \ACROBAT\ version 2.1, +%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. + +% funny things: mail to yeny: "please geen auto-crlf in special" + +\unprotect + +%D This driver is build on top of the general \PDF\ macros, +%D as defined in \type{spec-fdf}, so we inherit that one. + +\startspecials[pdf][fdf] + +%D \macros +%D {dosetupinteraction, +%D doPDFsetopenaction,doPDFsetcloseaction} +%D +%D Instead of a prolog, we can put the code in the file +%D ourselve. +%D +%D \starttyping +%D \definespecial\dosetupinteraction% +%D {\special +%D {\@@insertpostscriptretain +%D /pdfmark where +%D {pop} +%D {userdict /pdfmark /cleartomark load put} +%D ifelse}} +%D \stoptyping +%D +%D We decided to use a prolog file. The following code has to +%D be put somewhere, e.g.\ in the startup directory of +%D \DISTILLER. To overcome problems, we always embed the fonts, +%D but copyrights force us always to make subsets. +%D +%D \starttyping +%D /currentdistillerparams where +%D { pop } { userdict /currentdistillerparams { 1 dict } put } ifelse +%D +%D /setdistillerparams where +%D { pop } { userdict /setdistillerparams { pop } put } ifelse +%D +%D << /AntiAliasColorImages true +%D /AntiAliasGrayImages true +%D /AntiAliasMonoImages true +%D /ConvertCMYKImagesToRGB true +%D /MaxSubsetPct 99 +%D /EmbedAllFonts true +%D /SubSetFonts true >> setdistillerparams +%D \stoptyping +%D +%D Beware, this is the PostScript Level 2 way of doing things. + +\definespecial\dosetupinteraction + {\showmessage\m!interactions{21}{acrobat}} + +\definespecial\dosetupopenaction {\doPDFsetupopenaction} +\definespecial\dosetupcloseaction{\doPDFsetupcloseaction} + +%D \macros +%D {dostartthisislocation} +%D +%D We share a lot of macros with the \PDFTEX\ driver. First +%D the one that handles named destinations. + +\definespecial\dostartthisislocation {\doPDFstartthisislocation} + +%D \macros +%D {doresetgotowhereever, +%D dostartgotolocation,dostartgotorealpage,dostartgotoJS, +%D dostartexecutecommand,dostartrunprogram,dostartgotoprofile} +%D +%D The next specials are responsible for handling references. +%D Each goto handler can handle multiple references. + +\definespecial\doresetgotowhereever {\doPDFresetgotowhereever} +\definespecial\dostartgotolocation {\doPDFstartgotolocation} +\definespecial\dostartgotorealpage {\doPDFstartgotorealpage} +\definespecial\dostartgotoJS {\doPDFstartgotoJS} +\definespecial\dostartexecutecommand{\doPDFstartexecutecommand} +\definespecial\dostartrunprogram {\doPDFstartrunprogram} +\definespecial\dostartgotoprofile {\doPDFstartgotoprofile} + +%D \macros +%D {doflushJSpreamble} +%D +%D Thanks to the fact that \DISTILLER\ cannot handle multiple +%D names entries in the document catalog, for the moment we +%D have to misuse the page attributes. Beware, the preambles +%D must be packed. + +\definespecial\doflushJSpreamble#1% + {\bgroup + \ifoneJSpreamble + \edef\sanitizedJScode{\getJSpreamble{#1}}% + \expandafter\doPSsanitizeJScode\sanitizedJScode\to\sanitizedJScode + \special % nota bene, the page starts at 1 + {\@@insertpostscriptretain + [ /_objdef{JS:#1} /type /dict /OBJ pdfmark + [ {JS:#1} << /S /JavaScript /JS (\sanitizedJScode) >> /PUT pdfmark + [ {Page1} << /AA << /O {JS:#1} >> >> /PUT pdfmark}% + \else % temporary message + \writestatus{\m!specials}{Acrobat workaround needed: please pack JS preambles}% + \fi + \egroup} + +%D \macros +%D {dostarthide,dostophide} +%D +%D Hopefully some day hiding navigational things when +%D printing \PDF\ files will be supported properly. + +\definespecial\dostarthide% + {\special + {\@@insertpostscriptretain + [ /DataSource (false \iftrue\string{\else}\fi) + /PS + pdfmark}} + +\definespecial\dostophide% + {\special + {\@@insertpostscriptretain + [ /DataSource (\iffalse{\else\string}\fi if) + /PS + pdfmark}} + +%D \macros +%D {dosetupscreen, +%D dosetupidentity} +%D +%D We can set up the page dimensions, full screen start up +%D mode and identify the file with: + +\definespecial\dosetupscreen {\doPDFsetupscreen \printpaperheight} + +\definespecial\dosetupartbox {\doPDFsetupartbox \printpaperheight} +\definespecial\dosetupcropbox {\doPDFsetupcropbox \printpaperheight} +\definespecial\dosetupbleedbox{\doPDFsetupbleedbox\printpaperheight} +\definespecial\dosetuptrimbox {\doPDFsetuptrimbox \printpaperheight} + +\definespecial\dosetupidentity{\doPDFsetupidentity} + +%D \macros +%D {dobeginofprofile,doendofprofile} +%D +%D Profile support is still far from perfect. This is +%D especially due to the fact that the specification of +%D threads are sort of fuzzy and depend on the viewer. + +\definespecial\dobeginofprofile#1#2#3#4% label width height page + {\bgroup + \setPDFdestination{#1}% + \doifsomething{\PDFdestination} + {\PointsToBigPoints{#2}\width + \PointsToBigPoints{#3}\height + \special + {\@@insertpostscriptretain + [ /Title (\PDFdestination) + /Rect [0 0 \width\space\height] + /ARTICLE + pdfmark}}% + \egroup} + +\definespecial\doendofprofile% + {} + +%D Apart from movies, graphic inclusion is handled in the +%D \POSTSCRIPT\ drivers. We just link the movie annotation +%D handled to the file inclusion system. + +\definefileinsertion{yy}{mov}{\doPDFinsertmov} +\definefileinsertion{tr}{mov}{\doPDFinsertmov} + +\definefileinsertion{yy}{avi}{\doPDFinsertmov} +\definefileinsertion{tr}{avi}{\doPDFinsertmov} + +%D \macros +%D {doinsertsoundtrack} +%D +%D Sounds look much like movies: + +\definespecial\doinsertsoundtrack{\doPDFinsertsoundtrack} + +%D \macros +%D {dostartobject,dostopobject, +%D doinsertobject} +%D +%D Objects, those nice reusable pieces of text and graphics, +%D are handled by three specials: + +\definespecial\dostartobject#1#2#3#4#5% + {\bgroup + \setbox\nextbox=\hbox\bgroup + \bgroup + \PointsToBigPoints{#3}\width + \PointsToBigPoints{#4}\height + \PointsToBigPoints{#5}\depth + \dosetobjectreference{#1}{#2}{#1::#2}% + \special + {\@@insertpostscriptretain + [ /BBox [0 -\depth\space \width\space \height] + /_objdef {#1::#2} + /BP + pdfmark}% + \egroup} + +\definespecial\dostopobject% + {\special + {\@@insertpostscriptretain + [ /EP + pdfmark}% + \egroup + \smashbox\nextbox + \flushatshipout{\box\nextbox}% + \egroup} + +\definespecial\doinsertobject#1#2% + {\hbox + {\dogetobjectreference{#1}{#2}\PDFobjectreference + \ifx\PDFobjectreference\empty \else + \special + {\@@insertpostscriptretain + [ {\PDFobjectreference} + /SP + pdfmark}% + \fi}} + +%D \macros +%D {doinsertbookmark} +%D +%D Although personally I never use bookmarks, \CONTEXT\ does +%D support them, due to user requests. + +\definespecial\doinsertbookmark {\doPDFinsertbookmark} + +%D \macros +%D {dosetpagetransition} +%D +%D Page transitions, again a user wish, is taken care of by: + +\definespecial\dosetpagetransition{\doPDFsetpagetransition} + +%D \macros +%D {doinsertcomment, doflushcomments} +%D +%D I never needed (and used) one until now, but here is the +%D text annotation special: + +\definespecial\doinsertcomment{\doPDFinsertcomment} +\definespecial\doflushcomments{\doPDFflushcomments} + +%D \macros +%D {dopresetlinefield,dopresettextfield, +%D dopresetchoicefield,dopresetpopupfield,dopresetcombofield, +%D dopresetpushfield,dopresetcheckfield, +%D dopresetradiofield,dopresetradiorecord} +%D +%D There is nothing enervating to the next few mappings. + +\definespecial\dopresetlinefield {\doFDFpresetlinefield} +\definespecial\dopresettextfield {\doFDFpresettextfield} +\definespecial\dopresetchoicefield{\doFDFpresetchoicefield} +\definespecial\dopresetpopupfield {\doFDFpresetpopupfield} +\definespecial\dopresetcombofield {\doFDFpresetcombofield} +\definespecial\dopresetpushfield {\doFDFpresetpushfield} +\definespecial\dopresetcheckfield {\doFDFpresetcheckfield} +\definespecial\dopresetradiofield {\doFDFpresetradiofield} +\definespecial\dopresetradiorecord{\doFDFpresetradiorecord} + +%D \macros +%D {dodefinefieldset,dogetfieldset,doiffieldset} +%D +%D Field sets, used in resetting and submitting, are handled +%D by: + +\definespecial\dodefinefieldset{\doFDFdefinefieldset} +\definespecial\dogetfieldset {\doFDFgetfieldset} +\definespecial\doiffieldset {\doFDFiffieldset} + +%D \macros +%D {doregistercalculationset} +%D +%D The calculation order is defined using: + +\definespecial\doregistercalculationset{\doFDFregistercalculationset} + +%D \macros +%D {doPDFdestination} +%D +%D Last we implement the low level pdfmark macros. The +%D definitions are rather verbose. First the destination +%D macro. + +\def\doPDFdestination name #1% + {\special + {\@@insertpostscriptretain + [ /Dest /#1\space + \PDFpageview + /DEST + pdfmark}} + +%D \macros +%D {doPDFaction,doPDFannotation,doPDFannotationobject, +%D ifsharePDFactions} +%D +%D We have three alternative annotation macros. The first +%D handles the goto ones, the second takes care of for instance +%D movies and the third is used in fields. + +\newcount\nofPDFsimilar + +\newif\ifsharePDFactions \sharePDFactionstrue + +\def\dodoPDFaction#1#2#3#4% + {\ifcollectreferenceactions + \xdef\lastPDFaction{#4}% + \else + \bgroup + % does not work well with distiller 4 + %\ifsharePDFactions + % \ifcase\similarreference\relax + % \xdef\lastPDFaction{<<#4>>}% + % \or + % \global\advance\nofPDFsimilar by 1 + % \special + % {\@@insertpostscriptretain + % [ /_objdef {PDF::sim:\the\nofPDFsimilar} /type /dict /OBJ pdfmark + % [ {PDF::sim:\the\nofPDFsimilar} <<#4>>\space /PUT pdfmark}% + % \xdef\lastPDFaction{{PDF::sim:\the\nofPDFsimilar}}% + % \else + % % leave \lastPDFaction untouched + % \fi + %\else + \xdef\lastPDFaction{<<#4>>}% + %\fi + \PointsToBigPoints{#2}\width + \PointsToBigPoints{#1}\height + \special + {\@@insertpostscriptretain + [ #1 + /Action \lastPDFaction\space + /Rect [0 0 \width\space \height] + /Border [0 0 0] + \ifhighlighthyperlinks \else /H /N \fi + /Subtype /Link + /ANN + pdfmark}% + \egroup + \fi} + +\def\doPDFaction width #1 height #2 action #3% + {\dodoPDFaction\empty{#1}{#2}{#3}} + +\def\doPDFannotation width #1 height #2 data #3% + {\bgroup + \PointsToBigPoints{#1}\width + \PointsToBigPoints{#2}\height + \special + {\@@insertpostscriptretain + [ /Rect [0 0 \width\space \height] #3 + /ANN + pdfmark}% + \egroup} + +\def\doPDFannotationobject class #1 name #2 width #3 height #4 data #5% + {\bgroup + \PointsToBigPoints{#3}\width + \PointsToBigPoints{#4}\height + \special + {\@@insertpostscriptretain + [ /_objdef {#1::#2} + /Rect [0 0 \width\space \height] #5 + /ANN + pdfmark}% + \egroup + \dosetobjectreference{#1}{#2}{#1::#2}} + +\def\doPDFactionobject class #1 name #2 width #3 height #4 action #5% + {\dodoPDFaction{/_objdef {#1::#2}}{#3}{#4}{#5}% + \dosetobjectreference{#1}{#2}{#1::#2}} + +%D \macros +%D {doPDFdictionaryobject,doPDFarrayobject} +%D +%D These two macros are used to build low level objects. + +\def\doPDFdictionaryobject class #1 name #2 data #3% + {\special + {\@@insertpostscriptretain + [ /_objdef {#1::#2} /type /dict /OBJ pdfmark + [ {#1::#2} << #3 >> /PUT pdfmark}% + \dosetobjectreference{#1}{#2}{#1::#2}} + +\def\doPDFarrayobject class #1 name #2 data #3% + {\special + {\@@insertpostscriptretain + [ /_objdef {#1::#2} /type /array /OBJ pdfmark + [ {#1::#2} 0 [#3] /PUTINTERVAL pdfmark}% + \dosetobjectreference{#1}{#2}{#1::#2}} + +%D \macros +%D {doPDFaddtocatalog,doPDFaddtoinfo, +%D doPDFpageattribute,doPDFpagesattribute} +%D +%D Next come our housekeeping macros. + +\def\doPDFaddtocatalog#1% + {\doifsomething{#1} + {\special + {\@@insertpostscriptretain + [ {Catalog} << #1 >> /PUT pdfmark}}} + +\def\doPDFaddtoinfo#1% unchecked + {\special + {\@@insertpostscriptretain + [ #1 /DOCINFO pdfmark}} % [ {DocInfo} << #1 >> /PUT pdfmark}} + +\def\doPDFpageattribute#1% + {\doifsomething{#1} + {\special + {\@@insertpostscriptretain + [ {ThisPage} << #1 >> /PUT pdfmark}}} + +\def\doPDFpageresource#1% + {\message{[skipping PDF resource]}} + +\def\doPDFpagesattribute#1% + {\doifsomething{#1} + {\special + {\@@insertpostscriptretain + [ #1 /PAGES pdfmark}}} + +\let\doPDFresetpageresources =\relax +\let\doPDFresetpageattributes=\relax + +%D \macros +%D {doPDFbookmark} +%D +%D This is how we force bookmarks entries in the file. + +\def\doPDFbookmark level #1 n #2 text #3 page #4 open #5% + {\scratchcounter#4\advance\scratchcounter\minusone + \special + {\@@insertpostscriptretain + [ /Page \the\scratchcounter\space + \ifcase#2 \else/Count \ifcase#5-\fi#2 \fi + \PDFpageview + /Title (#3) + /OUT + pdfmark}} + +%D \macros +%D {defaultobjectreference,doPDFgetobjectreference} +%D +%D The object references are \type{{named}}, that is, no hard +%D coded numbers are needed (opposite to \PDFTEX). + +\def\defaultobjectreference#1#2{#1::#2} + +\def\doPDFgetobjectreference#1#2#3% + {\dogetobjectreference{#1}{#2}#3% + \ifx#3\empty\else\edef#3{{#3}}\fi} + %\edef#3{\ifx#3\empty null\else{#3}\fi}} + +% \def\doPDFgetobjectpage #1#2#3{..} +% \def\doPDFgetobjectpagereference#1#2#3{..} + +\def\doPDFgetpagereference#1#2% + {\edef#2{{page#1}}} + +%D Done. + +\stopspecials + +\protect \endinput |