Work in progress: new PostScript/PDF generator back end
[platform/upstream/nasm.git] / doc / head.ps
1 % $Id$
2 %
3 % PostScript header for NASM documentation
4 %
5
6 % Avoid barfing on old PS implementations
7 /pdfmark where
8 {pop} {userdict /pdfmark /cleartomark load put} ifelse
9 /setpagedevice where
10 {pop} {userdict /setpagedevice /pop load put} ifelse
11
12 % Useful definition
13 /space 32 def
14
15 %
16 % This asks the PostScript interpreter for the proper size paper
17 %
18 /setpagesize {
19   1 dict dup /PageSize [pagewidth pageheight] put setpagedevice
20 } def
21
22 %
23 % Code to handle links
24 %
25 /min { 2 copy gt { exch } if pop } def
26 /max { 2 copy lt { exch } if pop } def
27
28 /lkbegun 0 def
29 /lkisuri false def
30 /lkury 0 def
31 /lkurx 0 def
32 /lklly 0 def
33 /lkllx 0 def
34 /lkxmarg 1 def  % Extra space for link in x dir
35 /lkymarg 1 def  % Extra space for link in y dir
36 /lktarget () def
37
38 % target --
39 /linkbegin {
40   userdict begin
41     /lkbegun 1 def
42     /lkisuri false def
43     /lktarget exch def
44   end
45 } def
46
47 % uristring --
48 /linkbeginuri {
49   userdict begin
50     /lkbegun 1 def
51     /lkisuri true def
52     /lktarget exch def
53   end
54 } def
55
56 % string spacepadding --
57 /linkshow {
58   userdict begin
59     /lspad exch def /lss exch def
60     lkbegun 0 ne {
61       gsave lss true charpath flattenpath pathbbox grestore
62       lkbegun 1 eq {
63         /lkury exch def
64         lss spacecount lspad mul add /lkurx exch def
65         /lklly exch def
66         /lkllx exch def
67         /lkbegun 2 def
68       } {
69         lkury max /lkury exch def
70         lss spacecount lspad mul add lkurx max /lkurx exch def
71         lklly min /lklly exch def
72         lkllx min /lkllx exch def
73       } ifelse
74     } if
75     lspad 0 space lss widthshow
76   end
77 } def
78
79 % --
80 /linkend {
81   userdict begin
82     [ lkisuri {
83         /Action
84         % << .. >> would be languagelevel 2 :(
85         2 dict dup /Subtype /URI put dup /URI lktarget put
86       } {
87         /Dest lktarget
88       } ifelse
89       /Border [0 0 0]
90       /Rect [ lkllx lkxmarg sub
91               lklly lkymarg sub
92               lkurx lkxmarg add
93               lkury lkymarg add ]
94       /Subtype /Link
95       /ANN pdfmark
96     /lkbegun 0 def
97   end
98 } def
99
100 % targetname --
101 /linkdest {
102   [ /Dest 3 -1 roll
103     /View [ /XYZ currentpoint null ]
104     /DEST pdfmark
105 } def
106
107 % A "fontset" is an array of fonts; a "stream" is an array of strings
108 % and numbers or procedures:
109 % [ 0 (Foo) ( ) (mani) ( ) 1 (padme) 0 ( ) (hum.) ]
110 % A number choses a font from the current fontset.
111 % A procedure is invoked as-is when printing the stream.
112 %
113 % When printing justified, an equal amount of space is added in
114 % between each string.
115
116 % string -- spacecount
117 % Count space characters in a string
118 /spacecount {
119   0 exch {
120     space eq { 1 add } if
121   } forall
122 } def
123
124 % stream fontset -- spacecount width
125 % Get the width of a stream in the given fontset, and the
126 % number of space characters in the stream
127 /streamwidth {
128   gsave
129     6 dict begin
130       /f exch def
131       /w 0 def
132       /s 0 def
133       f 0 get setfont
134       /integertype {
135         f exch get setfont
136       } def
137       /stringtype {
138         dup stringwidth pop w add /w exch def
139         spacecount s add /s exch def
140       } def
141       /arraytype { pop } def
142       % The input stream is on the top of the stack now
143       {
144         dup type exec
145       } forall
146       s w
147     end
148   grestore
149 } def
150
151 % stream fontset spacer --
152 % Show the stream in the given fontset, but add a certain amount
153 % of space to each space character
154 /showstreamspc {
155   5 dict begin
156     /spc exch def
157     /f exch def
158     f 0 get setfont
159     /integertype {
160       f exch get setfont
161     } def
162     /stringtype {
163       spc linkshow
164     } def
165     /arraytype {
166       exec
167     } def
168     % Now stream is on the top of the stack
169     {
170       dup type exec
171     } forall
172   end
173 } def
174
175 % stream fontset --
176 % Show the stream in the given fontset, with no extra spacing
177 /showstream {
178   0 showstreamspc
179 } def
180
181 % stream fontset totalspace --
182 % Show the stream justified to fit into a certain number of pixels
183 /showstreamjust {
184   userdict begin
185     /ts exch def /fs exch def /st exch def
186       st fs
187         st fs streamwidth ts exch sub exch
188         dup 0 gt { div } { pop } ifelse
189       showstreamspc
190     end
191 } def
192
193 /bullmarg lmarg bulladj add def
194 /lwidth pagewidth lmarg sub rmarg sub def
195 /bwidth lwidth bulladj sub def
196
197 %
198 % The various paragraph types
199 % The number at the end indicates start (1) of para, end (2) of para
200 %
201 /chapline {
202         currentpoint exch pop 10 sub lmarg exch moveto
203         0 setlinecap 3 setlinewidth
204         lwidth 0 rlineto stroke
205 } def
206
207 /chap0 { lmarg exch moveto cfont lwidth showstreamjust } def
208 /chap1 { lmarg exch moveto cfont lwidth showstreamjust } def
209 /chap2 { lmarg exch moveto cfont showstream chapline } def
210 /chap3 { lmarg exch moveto cfont showstream chapline } def
211
212 /appn0 {chap0} def
213 /appn1 {chap1} def
214 /appn2 {chap2} def
215 /appn3 {chap3} def
216
217 % lbl ypos fontset -- ypos
218 /headlbl {
219   3 -1 roll [exch (  )] exch % ypos strm fontset
220   2 copy % ypos strm fontset strm fontset
221   streamwidth % ypos strm fontset spccount width
222   lmarg exch sub % ypos strm fontset spccount xpos
223   4 index % ypos strm fontset spccount xpos ypos
224   moveto % ypos strm fontset spccount
225   pop % ypos strm fontset spccount
226   showstream % ypos
227 } def
228
229 /head0 { lmarg exch moveto hfont lwidth showstreamjust } def
230 /head1 { hfont headlbl lmarg exch moveto hfont lwidth showstreamjust } def
231 /head2 { lmarg exch moveto hfont showstream } def
232 /head3 { hfont headlbl lmarg exch moveto hfont showstream } def
233
234 /subh0 { lmarg exch moveto sfont lwidth showstreamjust } def
235 /subh1 { sfont headlbl lmarg exch moveto sfont lwidth showstreamjust } def
236 /subh2 { lmarg exch moveto sfont showstream } def
237 /subh3 { sfont headlbl lmarg exch moveto sfont showstream } def
238
239 /norm0 { lmarg exch moveto tfont lwidth showstreamjust } def
240 /norm1 { lmarg exch moveto tfont lwidth showstreamjust } def
241 /norm2 { lmarg exch moveto tfont showstream } def
242 /norm3 { lmarg exch moveto tfont showstream } def
243
244 /code0 { lmarg exch moveto tfont showstream } def
245 /code1 { lmarg exch moveto tfont showstream } def
246 /code2 { lmarg exch moveto tfont showstream } def
247 /code3 { lmarg exch moveto tfont showstream } def
248
249 /bull0 { bullmarg exch moveto tfont bwidth showstreamjust } def
250 /bull1 { dup lmarg exch moveto [(\267)] tfont showstream
251          bullmarg exch moveto tfont bwidth showstreamjust } def
252 /bull2 { bullmarg exch moveto tfont showstream } def
253 /bull3 { dup lmarg exch moveto [(\267)] tfont showstream
254          bullmarg exch moveto tfont showstream } def
255
256 /tocw0 lwidth tocpnz sub def
257 /tocw1 tocw0 tocind sub def
258 /tocw2 tocw1 tocind sub def
259
260 /tocx0 lmarg def
261 /tocx1 tocx0 tocind add def
262 /tocx2 tocx1 tocind add def
263
264 /tocpn {
265   tfont0 setfont
266   3 dict begin
267     /s exch def
268     /x s stringwidth pop pagewidth rmarg sub exch sub def
269     currentpoint /y exch def
270     lmarg sub tocdots div ceiling tocdots mul lmarg add
271     tocdots x {
272       y moveto (.) 0 linkshow
273     } for
274     x y moveto s 0 linkshow
275   end
276   linkend
277 } def
278
279 /toc00 { tocx0 exch moveto 0 rmoveto tfont showstream } def
280 /toc01 { tocx0 exch moveto
281          linkbegin tfont0 setfont 0 linkshow tfont showstream } def
282 /toc02 { tocx0 exch moveto 3 1 roll
283          0 rmoveto tfont showstream tocpn } def
284 /toc03 { tocx0 exch moveto 4 1 roll
285          linkbegin tfont0 setfont 0 linkshow tfont showstream tocpn } def
286
287 /toc10 { tocx1 exch moveto 0 rmoveto tfont showstream } def
288 /toc11 { tocx1 exch moveto
289          linkbegin tfont0 setfont 0 linkshow tfont showstream } def
290 /toc12 { tocx1 exch moveto 3 1 roll
291          0 rmoveto tfont showstream tocpn } def
292 /toc13 { tocx1 exch moveto 4 1 roll
293          linkbegin tfont0 setfont 0 linkshow tfont showstream tocpn } def
294
295 /toc20 { tocx2 exch moveto 0 rmoveto tfont showstream } def
296 /toc21 { tocx2 exch moveto
297          linkbegin tfont0 setfont 0 linkshow tfont showstream } def
298 /toc22 { tocx2 exch moveto 3 1 roll
299          0 rmoveto tfont showstream tocpn } def
300 /toc23 { tocx2 exch moveto 4 1 roll
301          linkbegin tfont0 setfont 0 linkshow tfont showstream tocpn } def
302
303 %
304 % Page numbers
305 %
306 /pagey botmarg pymarg sub def
307 /pagel lmarg plmarg sub def
308 /pager pagewidth rmarg sub prmarg add def
309
310 /pageeven { pagel pagey moveto sfont0 setfont show } def
311 /pageodd  { sfont0 setfont dup stringwidth pop pager exch sub
312             pagey moveto show } def
313
314 %
315 % Functions invoked during parsing
316 %
317 /xa { linkdest } def
318 /xl { linkbegin } def
319 /wl { linkbeginuri } def
320 /el { linkend } def
321
322 %
323 % PDF viewer options
324 %
325 [/PageMode /UseOutlines /DOCVIEW pdfmark        % Display bookmarks
326