declare smobs in alloc.c
[bpt/emacs.git] / etc / ps-prin1.ps
CommitLineData
48441121 1% === BEGIN ps-print prologue 1
d4757043 2% version: 6.1
48441121 3
ba318903 4% Copyright (C) 2000-2014 Free Software Foundation, Inc.
ab73e885 5
b15a393b 6% This file is part of GNU Emacs.
ab73e885
GM
7
8% GNU Emacs is free software: you can redistribute it and/or modify
b15a393b 9% it under the terms of the GNU General Public License as published by
ab73e885
GM
10% the Free Software Foundation, either version 3 of the License, or
11% (at your option) any later version.
12
b15a393b
GM
13% GNU Emacs is distributed in the hope that it will be useful,
14% but WITHOUT ANY WARRANTY; without even the implied warranty of
15% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16% GNU General Public License for more details.
ab73e885 17
b15a393b 18% You should have received a copy of the GNU General Public License
ab73e885 19% along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
b15a393b 20
91d0c677
RS
21% As a special exception, the copyright holders of this module give
22% you permission to include the module in a Postscript file generated
23% by Emacs or other free software together with the result of
24% converting text to be printed, regardless of the license terms of
25% that text, and to use under terms of your choice the page images
26% resulting from formatting said combination. If you modify this
27% module, you may extend this exception to your version of the module
28% but you are not obligated to do so. If you do not wish to do so,
29% delete this exception statement from your version.
30
31
48441121 32% ISOLatin1Encoding stolen from ps_init.ps in GhostScript 2.6.1.4:
d30e4fd5 33/ISOLatin1Encoding where{pop}{
48441121
KH
34% -- The ISO Latin-1 encoding vector isn't known, so define it.
35% -- The first half is the same as the standard encoding,
36% -- except for minus instead of hyphen at code 055.
37/ISOLatin1Encoding
38StandardEncoding 0 45 getinterval aload pop
39 /minus
40StandardEncoding 46 82 getinterval aload pop
41%*** NOTE: the following are missing in the Adobe documentation,
42%*** but appear in the displayed table:
43%*** macron at 0225, dieresis at 0230, cedilla at 0233, space at 0240.
44% 0200 (128)
d30e4fd5
GM
45 /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
46 /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
47 /dotlessi/grave/acute/circumflex/tilde/macron/breve/dotaccent
48 /dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut/ogonek/caron
48441121 49% 0240 (160)
d30e4fd5
GM
50 /space/exclamdown/cent/sterling
51 /currency/yen/brokenbar/section
52 /dieresis/copyright/ordfeminine/guillemotleft
53 /logicalnot/hyphen/registered/macron
54 /degree/plusminus/twosuperior/threesuperior
55 /acute/mu/paragraph/periodcentered
56 /cedilla/onesuperior/ordmasculine/guillemotright
57 /onequarter/onehalf/threequarters/questiondown
48441121 58% 0300 (192)
d30e4fd5
GM
59 /Agrave/Aacute/Acircumflex/Atilde
60 /Adieresis/Aring/AE/Ccedilla
61 /Egrave/Eacute/Ecircumflex/Edieresis
62 /Igrave/Iacute/Icircumflex/Idieresis
63 /Eth/Ntilde/Ograve/Oacute
64 /Ocircumflex/Otilde/Odieresis/multiply
65 /Oslash/Ugrave/Uacute/Ucircumflex
66 /Udieresis/Yacute/Thorn/germandbls
48441121 67% 0340 (224)
d30e4fd5
GM
68 /agrave/aacute/acircumflex/atilde
69 /adieresis/aring/ae/ccedilla
70 /egrave/eacute/ecircumflex/edieresis
71 /igrave/iacute/icircumflex/idieresis
72 /eth/ntilde/ograve/oacute
73 /ocircumflex/otilde/odieresis/divide
74 /oslash/ugrave/uacute/ucircumflex
75 /udieresis/yacute/thorn/ydieresis
48441121
KH
76256 packedarray def
77}ifelse
78
79/reencodeFontISO{ %def
80 dup
81 length 12 add dict % Make a new font (a new dict the same size
82 % as the old one) with room for our new symbols.
83
84 begin % Make the new font the current dictionary.
85
d30e4fd5
GM
86 % Copy each of the symbols from the old dictionary
87 % to the new one except for the font ID.
88 {1 index/FID ne{def}{pop pop}ifelse}forall
48441121 89
d30e4fd5
GM
90 % Override the encoding with the ISOLatin1 encoding.
91 currentdict/FontType get 0 ne{/Encoding ISOLatin1Encoding def}if
48441121
KH
92
93 % Use the font's bounding box to determine the ascent, descent,
94 % and overall height; don't forget that these values have to be
95 % transformed using the font's matrix.
96
97% ^ (x2 y2)
98% | |
99% | v
100% | +----+ - -
101% | | | ^
102% | | | | Ascent (usually > 0)
103% | | | |
104% (0 0) -> +--+----+-------->
105% | | |
106% | | v Descent (usually < 0)
107% (x1 y1) --> +----+ - -
108
d30e4fd5
GM
109 currentdict/FontType get 0 ne
110 {/FontBBox load aload pop % -- x1 y1 x2 y2
111 FontMatrix transform/Ascent exch def pop
112 FontMatrix transform/Descent exch def pop}
113 {/PrimaryFont FDepVector 0 get def
114 PrimaryFont/FontBBox get aload pop
115 PrimaryFont/FontMatrix get transform/Ascent exch def pop
116 PrimaryFont/FontMatrix get transform/Descent exch def pop}ifelse
48441121
KH
117
118 /FontHeight Ascent Descent sub def % use `sub' because descent < 0
119
120 % Define these in case they're not in the FontInfo
121 % (also, here they're easier to get to).
122 /UnderlinePosition Descent 0.70 mul def
123 /OverlinePosition Descent UnderlinePosition sub Ascent add def
124 /StrikeoutPosition Ascent 0.30 mul def
125 /LineThickness FontHeight 0.05 mul def
126 /Xshadow FontHeight 0.08 mul def
127 /Yshadow FontHeight -0.09 mul def
128 /SpaceBackground Descent neg UnderlinePosition add def
129 /XBox Descent neg def
130 /YBox LineThickness 0.7 mul def
131
132 currentdict % Leave the new font on the stack
133 end % Stop using the font as the current dictionary.
134 definefont % Put the font into the font dictionary
135 pop % Discard the returned font.
136}bind def
137
d30e4fd5
GM
138% Font definition
139/DefFont{findfont exch scalefont reencodeFontISO}def
48441121 140
d30e4fd5
GM
141% Font selection
142/F{
48441121 143 findfont
d30e4fd5
GM
144 dup/Ascent get/Ascent exch def
145 dup/Descent get/Descent exch def
146 dup/FontHeight get/FontHeight exch def
147 dup/UnderlinePosition get/UnderlinePosition exch def
148 dup/OverlinePosition get/OverlinePosition exch def
149 dup/StrikeoutPosition get/StrikeoutPosition exch def
150 dup/LineThickness get/LineThickness exch def
151 dup/Xshadow get/Xshadow exch def
152 dup/Yshadow get/Yshadow exch def
153 dup/SpaceBackground get/SpaceBackground exch def
154 dup/XBox get/XBox exch def
155 dup/YBox get/YBox exch def
48441121
KH
156 setfont
157}def
158
d30e4fd5 159/FG/setrgbcolor load def
48441121
KH
160
161/bg false def
162/BG{
d30e4fd5
GM
163 dup/bg exch def
164 {[4 1 roll]}
165 {[1.0 1.0 1.0]}
48441121
KH
166 ifelse
167 /bgcolor exch def
168}def
169
170% B width C
171% +-----------+
172% | Ascent (usually > 0)
173% A + +
174% | Descent (usually < 0)
175% +-----------+
176% E width D
177
178/dobackground{ % width --
179 currentpoint % -- width x y
180 gsave
181 newpath
182 moveto % A (x y)
183 0 Ascent rmoveto % B
184 dup 0 rlineto % C
185 0 Descent Ascent sub rlineto % D
186 neg 0 rlineto % E
187 closepath
8f4a5e99 188 FillBgColor
48441121
KH
189 grestore
190}def
191
192/eolbg{ % dobackground until right margin
193 PrintWidth % -- x-eol
194 currentpoint pop % -- cur-x
195 sub % -- width until eol
196 dobackground
197}def
198
0f615128
GM
199/LineHS LineHeight LineSpacing add def
200/ParagraphHS LineHeight ParagraphSpacing add def
201/PSL{/h exch def bg{eolbg}if 0 currentpoint exch pop h sub moveto}def
48441121
KH
202/PLN{PrintLineNumber{doLineNumber}if}def
203
0f615128 204/SL{LineHS PSL isLineStep pop}def % Soft Linefeed
48441121 205
0f615128
GM
206/PHL{ParagraphHS PSL PLN}def % Paragraph Hard Linefeed
207/LHL{LineHS PSL PLN}def % Hard Linefeed
48441121
KH
208
209% Some debug
d30e4fd5
GM
210/dcp{currentpoint exch 40 string cvs print(, )print =}def
211/dp{print 2 copy exch 40 string cvs print(, )print =}def
48441121
KH
212
213/W{
d30e4fd5 214 ( )stringwidth % Get the width of a space in the current font.
48441121
KH
215 pop % Discard the Y component.
216 mul % Multiply the width of a space
217 % by the number of spaces to plot
218 bg{dup dobackground}if
219 0 rmoveto
220}def
221
0f615128
GM
222/Effect 0 def
223/EffectUnderline false def
224/EffectStrikeout false def
225/EffectOverline false def
226/EffectShadow false def
227/EffectBox false def
228/EffectOutline false def
48441121 229
48441121
KH
230% effect: 1 - underline 2 - strikeout 4 - overline
231% 8 - shadow 16 - box 32 - outline
0f615128
GM
232/EF{
233 /Effect exch def
234 /EffectUnderline Effect 1 and 0 ne def
235 /EffectStrikeout Effect 2 and 0 ne def
236 /EffectOverline Effect 4 and 0 ne def
237 /EffectShadow Effect 8 and 0 ne def
238 /EffectBox Effect 16 and 0 ne def
239 /EffectOutline Effect 32 and 0 ne def
240}def
241
242% stack: string |- --
48441121 243/S{
d30e4fd5
GM
244 /xx currentpoint dup Descent add/yy exch def
245 Ascent add/YY exch def def
246 dup stringwidth pop xx add/XX exch def
0f615128 247 EffectShadow{
48441121
KH
248 /yy yy Yshadow add def
249 /XX XX Xshadow add def
250 }if
251 bg{
252 true
0f615128 253 EffectBox
48441121
KH
254 {SpaceBackground doBox}
255 {xx yy XX YY doRect}
256 ifelse
257 }if % background
0f615128
GM
258 EffectBox {false 0 doBox}if % box
259 EffectShadow {dup doShadow}if % shadow
260 EffectOutline
48441121
KH
261 {true doOutline} % outline
262 {show} % normal text
263 ifelse
0f615128
GM
264 EffectUnderline{UnderlinePosition Hline}if % underline
265 EffectStrikeout{StrikeoutPosition Hline}if % strikeout
266 EffectOverline {OverlinePosition Hline}if % overline
48441121
KH
267}bind def
268
269% stack: position |- --
270/Hline{
271 currentpoint exch pop add dup
272 gsave
273 newpath
274 xx exch moveto
275 XX exch lineto
276 closepath
277 LineThickness setlinewidth stroke
278 grestore
279}bind def
280
281% stack: fill-or-not delta |- --
282/doBox{
283 /dd exch def
284 xx XBox sub dd sub yy YBox sub dd sub
285 XX XBox add dd add YY YBox add dd add
286 doRect
287}bind def
288
289% stack: fill-or-not lower-x lower-y upper-x upper-y |- --
290/doRect{
291 /rYY exch def
292 /rXX exch def
293 /ryy exch def
294 /rxx exch def
295 gsave
296 newpath
297 rXX rYY moveto
298 rxx rYY lineto
299 rxx ryy lineto
300 rXX ryy lineto
301 closepath
302 % top of stack: fill-or-not
d30e4fd5
GM
303 {FillBgColor}
304 {LineThickness setlinewidth stroke}ifelse
48441121
KH
305 grestore
306}bind def
307
308% stack: string |- --
309/doShadow{
310 gsave
311 Xshadow Yshadow rmoveto
312 false doOutline
313 grestore
314}bind def
315
316/st 1 string def
317
318% stack: string fill-or-not |- --
319/doOutline{
320 /-fillp- exch def
d30e4fd5 321 /-ox- currentpoint/-oy- exch def def
48441121
KH
322 gsave
323 LineThickness setlinewidth
324 {st 0 3 -1 roll put
325 st dup true charpath
326 -fillp- {gsave FillBgColor grestore}if
327 stroke stringwidth
d30e4fd5
GM
328 -oy- add/-oy- exch def
329 -ox- add/-ox- exch def
48441121
KH
330 -ox- -oy- moveto
331 }forall
332 grestore
333 -ox- -oy- moveto
334}bind def
335
336% stack: --
337/FillBgColor{bgcolor aload pop setrgbcolor fill}bind def
338
c00e0292
GM
339% stack: -- |- boolean
340/isLineStep{
341 SyncLineZebra
f4fa5c85
GM
342 {PLScounter 0 gt % or zebra
343 {/PLScounter PLScounter 1 sub def PLScounter 0 eq}
344 {false}ifelse
345 PrintLineStep 1 gt
346 {/PrintLineStep PrintLineStep 1 sub def}
347 {/PrintLineStep ZebraHeight def
348 /PLScounter PrintLineStart def}ifelse}
349 {LineNumber PrintLineStart sub PrintLineStep mod 0 eq}ifelse % or line step
c00e0292
GM
350}def
351
48441121
KH
352% stack: --
353/doLineNumber{
354 /LineNumber where
c00e0292
GM
355 {pop
356 isLineStep % or line step
357 LineNumber Lines ge or % or last line
358 {currentfont
48441121 359 gsave
7953b715 360 LineNumberColor SetColor
48441121
KH
361 /L0 findfont setfont
362 LineNumber Lines ge
c00e0292 363 {(end )}
d30e4fd5 364 {LineNumber 6 string cvs( )strcat}ifelse
48441121
KH
365 dup stringwidth pop neg 0 rmoveto
366 show
367 grestore
c00e0292 368 setfont}if
48441121
KH
369 /LineNumber LineNumber 1 add def
370 }if
371}def
372
8f4a5e99 373% stack: color-specifier |- --
d30e4fd5 374/SetColor{dup type/realtype eq{setgray}{aload pop setrgbcolor}ifelse}def
8f4a5e99 375
48441121
KH
376% stack: --
377/printZebra{
378 gsave
8f4a5e99 379 ZebraColor SetColor
48441121 380 /double-zebra ZebraHeight ZebraHeight add def
0f615128 381 /yiter double-zebra LineHS mul neg def
48441121 382 /xiter PrintWidth InterColumn add def
dc892190 383 /zebra-line LinesPrinted def
48441121
KH
384 NumberOfColumns{LinesPerColumn doColumnZebra xiter 0 rmoveto}repeat
385 grestore
386}def
387
388% stack: lines-per-column |- --
389/doColumnZebra{
d30e4fd5 390 /lpc exch def
48441121 391 gsave
385f7408 392 ZebraFollow 1 and 0 ne{
d30e4fd5
GM
393 /H ZebraHeight zebra-line ZebraHeight mod sub def
394 /lpc lpc H sub def
395 zebra-line double-zebra mod ZebraHeight lt
396 {H doZebra % "black" stripe followed by a "white" stripe
397 /lpc lpc ZebraHeight sub def
398 H ZebraHeight add}
399 {H}ifelse % "white" stripe
0f615128 400 LineHS mul neg 0 exch rmoveto
d30e4fd5
GM
401 /zebra-line zebra-line LinesPerColumn add def
402 }if
0f615128 403 /zspacing 0 def
d30e4fd5 404 lpc dup double-zebra idiv{ZebraHeight doZebra 0 yiter rmoveto}repeat
385f7408 405 double-zebra mod dup 0 le{pop}
0f615128
GM
406 {dup ZebraHeight gt
407 {pop ZebraHeight}
408 {/zspacing LineSpacing def
409 ZebraFollow 2 and 0 ne{pop ZebraHeight}if}ifelse
410 doZebra}ifelse
48441121
KH
411 grestore
412}def
413
414% stack: zebra-height (in lines) |- --
415/doZebra{
0f615128 416 /zh exch 0.05 sub LineHS mul zspacing sub def
48441121
KH
417 gsave
418 0 LineHeight 0.65 mul rmoveto
419 PrintWidth 0 rlineto
420 0 zh neg rlineto
421 PrintWidth neg 0 rlineto
422 0 zh rlineto
423 fill
424 grestore
425}def
426
8f4a5e99
GM
427% stack: --
428/printBackground{
429 /BackgroundColor where{
d4757043
VJL
430 /LHg LineHeight 0.65 mul def
431 /PHg PrintHeight LHg add def
8f4a5e99
GM
432 pop gsave BackgroundColor SetColor
433 NumberOfColumns{
434 gsave
d4757043 435 0 LHg rmoveto
8f4a5e99 436 PrintWidth 0 rlineto
d4757043 437 0 PHg neg rlineto
8f4a5e99 438 PrintWidth neg 0 rlineto
d4757043 439 0 PHg rlineto
8f4a5e99
GM
440 fill
441 grestore
442 PrintWidth InterColumn add 0 rmoveto
443 }repeat
444 grestore
445 }if
446}def
447
48441121
KH
448% tx ty rotation xscale yscale xpos ypos BeginBackImage
449/BeginBackImage{
450 /-save-image- save def
451 /showpage{}def
452 translate
453 scale
454 rotate
455 translate
456}def
457
458/EndBackImage{-save-image- restore}def
459
460% string fontsize fontname rotation gray xpos ypos ShowBackText
461/ShowBackText{
462 gsave
463 translate
464 setgray
465 rotate
d30e4fd5 466 findfont exch dup/-offset- exch -0.25 mul def scalefont setfont
48441121
KH
467 0 -offset- moveto
468 /-saveLineThickness- LineThickness def
469 /LineThickness 1 def
470 false doOutline
471 /LineThickness -saveLineThickness- def
472 grestore
473}def
474
d30e4fd5
GM
475/SetPageSize{
476 BMark/PageSize[PageWidth LandscapePageHeight LandscapeMode{exch}if]EMark setpagedevice
477}def
478
48441121
KH
479/BeginDoc{
480 % ---- Remember space width of the normal text font `f0'.
d30e4fd5 481 /SpaceWidth/f0 findfont setfont( )stringwidth pop def
48441121
KH
482 % ---- save the state of the document (useful for ghostscript!)
483 /docState save def
484 % ---- [andrewi] set PageSize based on chosen dimensions
485 UseSetpagedevice{
d30e4fd5 486 WarnPaperSize{SetPageSize}{mark{SetPageSize}stopped cleartomark}ifelse
48441121
KH
487 }if
488 /ColumnWidth PrintWidth InterColumn add def
48441121
KH
489 % ---- define where printing will start
490 /f0 F % this installs Ascent
491 /PrintStartY PrintHeight Ascent sub def
492 /ColumnIndex 1 def
493 /N-Up-Counter N-Up-End 1 sub def
f4fa5c85 494 /PLScounter PrintLineStart def
48441121
KH
495}def
496
497/EndDoc{
498 % ---- restore the state of the document (useful for ghostscript!)
499 docState restore
500}def
501
502/BeginDSCPage{
503 % ---- when 1st column, save the state of the page
d30e4fd5 504 ColumnIndex 1 eq{/pageState save def}if
48441121
KH
505 % ---- save the state of the column
506 /columnState save def
507}def
508
509/PrintHeaderWidth PrintOnlyOneHeader{PrintPageWidth}{PrintWidth}ifelse def
510
511/BeginPage{
dc892190 512 /LinesPrinted exch def
48441121
KH
513 % ---- when 1st column, print all background effects
514 ColumnIndex 1 eq{
515 0 PrintStartY moveto % move to where printing will start
8f4a5e99 516 printBackground
d30e4fd5 517 Zebra{printZebra}if
48441121
KH
518 printGlobalBackground
519 printLocalBackground
520 }if
7953b715
GM
521 PrintOnlyOneHeader{ColumnIndex 1 eq}{true}ifelse
522 dup PrintHeader and{
523 PrintHeaderFrame{HeaderFrame}if
524 HeaderText
525 }if
526 PrintFooter and{
527 PrintFooterFrame{FooterFrame}if
528 FooterText
48441121
KH
529 }if
530 0 PrintStartY moveto % move to where printing will start
d30e4fd5
GM
531 /LineNumber where
532 {pop
533 SyncLineZebra
534 {/H PageNumber 1 sub NumberOfColumns mul ColumnIndex 1 sub add
535 LinesPerColumn mul ZebraHeight mod def
536 /PLScounter H PrintLineStart ge{0}{PrintLineStart H sub}ifelse def
537 /PrintLineStep ZebraHeight H sub def}if}if
48441121
KH
538 PLN
539}def
540
541/EndPage{bg{eolbg}if}def
542
543/EndDSCPage{
544 ColumnIndex NumberOfColumns eq{
545 % ---- restore the state of the page
546 pageState restore
547 /ColumnIndex 1 def
548 % ---- N-up printing
549 N-Up 1 gt{
d30e4fd5
GM
550 N-Up-Counter 0 gt
551 {% ---- Next page on same row
48441121 552 /N-Up-Counter N-Up-Counter 1 sub def
d30e4fd5
GM
553 N-Up-XColumn N-Up-YColumn}
554 {% ---- Next page on next line
48441121 555 /N-Up-Counter N-Up-End 1 sub def
d30e4fd5 556 N-Up-XLine N-Up-YLine}ifelse
48441121
KH
557 translate
558 }if
559 }{ % else
560 % ---- restore the state of the current column
561 columnState restore
562 % ---- and translate to the next column
563 ColumnWidth 0 translate
564 /ColumnIndex ColumnIndex 1 add def
565 }ifelse
566}def
567
7953b715
GM
568/TextStart{
569 LeftMargin BottomMargin
570 PrintFooter{
571 FooterPad add
572 FooterLines FooterLineHeight mul add
573 FooterPad add
574 FooterOffset add}if
575}def
576
48441121
KH
577% stack: number-of-pages-per-sheet |- --
578/BeginSheet{
579 /sheetState save def
580 /pages-per-sheet exch def
f4fa5c85
GM
581
582 % ---- translate to bottom-right corner of Portrait page
583 LandscapeMode{
584 LandscapePageHeight 0 translate
585 90 rotate
586 }if
587 % ---- [jack] Kludge: my ghostscript window is 21x27.7 instead of 21x29.7
588 /JackGhostscript where{pop 1 27.7 29.7 div scale}if
589 UpsideDown{PageWidth LandscapePageHeight translate 180 rotate}if
590 % ---- N-Up printing
591 N-Up 1 gt{
592 % ---- landscape
593 N-Up-Landscape{
594 PageWidth 0 translate
595 90 rotate
596 }if
597 N-Up-Margin dup translate
598 % ---- scale
599 LandscapeMode{
600 /HH PageWidth def
601 /WW LandscapePageHeight def
602 }{
603 /HH LandscapePageHeight def
604 /WW PageWidth def
605 }ifelse
d30e4fd5
GM
606 /xx 0 def
607 N-Up-Landscape{
608 /ww WW WW mul N-Up-Lines HH mul div def
609 /cc HH N-Up-Columns N-Up-Missing add div def
610 ww cc gt{/xx WW def/WW cc ww div WW mul def/xx xx WW sub def}if
611 }{
612 /hh HH N-Up-Columns N-Up-Missing add div def
613 /cc HH N-Up-Lines div def
614 hh cc gt{/xx WW def/WW cc hh div WW mul def/xx xx WW sub def}if
615 }ifelse
f4fa5c85
GM
616 WW N-Up-Margin sub N-Up-Margin sub
617 N-Up-Landscape
d30e4fd5
GM
618 {N-Up-Lines div HH}
619 {N-Up-Columns N-Up-Missing add div WW}ifelse
f4fa5c85 620 div dup scale
d30e4fd5
GM
621 LandscapeMode{/yy 0 def}{/yy xx def/xx 0 def}ifelse
622 xx N-Up-Repeat 1 sub LandscapePageHeight mul yy add translate
f4fa5c85
GM
623 % ---- go to start position in page matrix
624 N-Up-XStart N-Up-Missing 0.5 mul
625 LandscapeMode
626 {LandscapePageHeight mul N-Up-YStart add}
627 {PageWidth mul add N-Up-YStart}ifelse
628 translate
629 }if
630 % ---- translate to lower left corner of TEXT
7953b715 631 TextStart translate
f4fa5c85 632
48441121
KH
633 % ---- N-up printing
634 N-Up 1 gt N-Up-Border and pages-per-sheet 0 gt and{
635 % ---- page border
636 gsave
637 0 setgray
7953b715 638 TextStart exch neg exch neg moveto
48441121
KH
639 N-Up-Repeat
640 {N-Up-End
641 {gsave
642 PageWidth 0 rlineto
643 0 LandscapePageHeight rlineto
644 PageWidth neg 0 rlineto
645 closepath stroke
646 grestore
647 /pages-per-sheet pages-per-sheet 1 sub def
648 pages-per-sheet 0 le{exit}if
649 N-Up-XColumn N-Up-YColumn rmoveto
650 }repeat
651 pages-per-sheet 0 le{exit}if
652 N-Up-XLine N-Up-XColumn sub N-Up-YLine rmoveto
653 }repeat
654 grestore
655 }if
656}def
657
658/EndSheet{
659 showpage
660 sheetState restore
661}def
662
663/SetHeaderLines{ % nb-lines --
664 /HeaderLines exch def
665 % ---- bottom up
666 HeaderPad
667 HeaderLines 1 sub HeaderLineHeight mul add
668 HeaderTitleLineHeight add
669 HeaderPad add
670 /HeaderHeight exch def
671}def
672
7953b715
GM
673/SetFooterLines{ % nb-lines --
674 /FooterLines exch def
675 % ---- bottom up
676 FooterPad
677 FooterLines FooterLineHeight mul add
678 FooterPad add
679 /FooterHeight exch def
680}def
681
48441121
KH
682% |---------|
683% | tm |
684% |---------|
685% | header |
686% |-+-------| <-- (x y)
687% | ho |
688% |---------|
689% | text |
7953b715
GM
690% |---------|
691% | fo |
692% |---------|
693% | footer |
48441121
KH
694% |-+-------| <-- (0 0)
695% | bm |
696% |---------|
697
d30e4fd5
GM
698% -- |- x y
699/HeaderFrameStart{0 PrintHeight HeaderOffset add}def
7953b715
GM
700/FooterFrameStart{0 FooterHeight FooterOffset add neg}def
701
702/doFramePath{
703 /h exch def
704 PrintHeaderWidth 0 rlineto
705 0 h rlineto
706 PrintHeaderWidth neg 0 rlineto
707 0 h neg rlineto
48441121
KH
708}def
709
7953b715
GM
710/HeaderFramePath{HeaderHeight doFramePath}def
711/FooterFramePath{FooterHeight doFramePath}def
712
713% /path-fun /start-fun vector-property doFrame
714/doFrame{
715 /vecFrame exch def
716 /startFrame exch load def
717 /pathFrame exch load def
48441121 718 gsave
7953b715
GM
719 vecFrame 2 get setlinewidth % frame border width
720 % ---- do the shadow of the next rectangle
721 startFrame moveto
48441121 722 1 -1 rmoveto
7953b715
GM
723 pathFrame
724 vecFrame 4 get SetColor fill % frame shadow color
48441121 725 % ---- do the next rectangle ...
7953b715
GM
726 startFrame moveto
727 pathFrame
728 gsave vecFrame 1 get SetColor fill grestore % frame background
729 gsave vecFrame 3 get SetColor stroke grestore % frame border color
48441121
KH
730 grestore
731}def
732
7953b715
GM
733/HeaderFrame{/HeaderFramePath /HeaderFrameStart HeaderFrameProperties doFrame}def
734/FooterFrame{/FooterFramePath /FooterFrameStart FooterFrameProperties doFrame}def
735
48441121
KH
736/HeaderStart{
737 HeaderFrameStart
738 exch HeaderPad add exch % horizontal pad
739 % ---- bottom up
740 HeaderPad add % vertical pad
741 HeaderDescent sub
742 HeaderLineHeight HeaderLines 1 sub mul add
743}def
744
7953b715
GM
745/FooterStart{
746 FooterFrameStart
747 exch FooterPad add exch % horizontal pad
748 % ---- bottom up
749 FooterPad add % vertical pad
750 FooterDescent sub
751 FooterLineHeight FooterLines 1 sub mul add
752}def
753
30301a73
VJL
754/HeaderClip{HeaderFrameStart moveto HeaderFramePath clip}def
755/FooterClip{FooterFrameStart moveto FooterFramePath clip}def
756
48441121
KH
757/strcat{
758 dup length 3 -1 roll dup length dup 4 -1 roll add string dup
759 0 5 -1 roll putinterval
760 dup 4 2 roll exch putinterval
761}def
762
763/pagenumberstring{
764 PageNumber 32 string cvs
d30e4fd5 765 ShowNofN{(/)strcat PageCount 32 string cvs strcat}if
48441121
KH
766}def
767
7953b715
GM
768% lines is-right HeaderOrFooterTextLines
769/HeaderOrFooterTextLines{
770 /is_right exch def
771 HFStart moveto
772 { % ---- process the lines
773 aload pop
774 exch F
775 gsave
776 dup xcheck{exec}if
777 is_right{
778 dup stringwidth pop
779 PrintHeaderWidth exch sub HFPad HFPad add sub 0 rmoveto
780 }if
781 HFColor SetColor
782 show
783 grestore
784 0 HFLineHeight neg rmoveto
785 }forall
786}def
48441121 787
7953b715
GM
788% right-lines left-lines /start lineheight pad fore-color HeaderOrFooterText
789/HeaderOrFooterText{
790 /HFColor exch def
791 /HFPad exch def
792 /HFLineHeight exch def
793 /HFStart exch load def
48441121 794
7953b715 795 % -- rightLines leftLines -- at stack
48441121 796
7953b715 797 % ---- hack: `PN 1 and' == `PN 2 modulo'
48441121 798 % ---- if even page number and duplex, then exchange left and right
d30e4fd5 799 PageNumber 1 and 0 eq SwitchHeader and{exch}if
48441121 800
7953b715
GM
801 % ---- process the left lines
802 false HeaderOrFooterTextLines
48441121 803
7953b715
GM
804 % ---- process the right lines
805 true HeaderOrFooterTextLines
806}def
48441121 807
7953b715 808/HeaderText{
30301a73 809 gsave HeaderClip
7953b715
GM
810 HeaderLinesRight HeaderLinesLeft
811 /HeaderStart HeaderLineHeight HeaderPad
812 HeaderFrameProperties 0 get
813 HeaderOrFooterText
30301a73 814 grestore
7953b715
GM
815}def
816
817/FooterText{
30301a73 818 gsave FooterClip
7953b715
GM
819 FooterLinesRight FooterLinesLeft
820 /FooterStart FooterLineHeight FooterPad
821 FooterFrameProperties 0 get
822 HeaderOrFooterText
30301a73 823 grestore
48441121
KH
824}def
825
826/ReportFontInfo{
827 2 copy
828 /t0 3 1 roll DefFont
829 /t0 F
830 /lh FontHeight def
d30e4fd5
GM
831 /sw( )stringwidth pop def
832 /aw(01234567890abcdefghijklmnopqrstuvwxyz)dup length exch
48441121 833 stringwidth pop exch div def
d30e4fd5 834 /t1 12/Helvetica-Oblique DefFont
48441121
KH
835 /t1 F
836 gsave
d30e4fd5 837 (languagelevel = )show
8f4a5e99 838 languagelevel 32 string cvs show
48441121
KH
839 grestore
840 0 FontHeight neg rmoveto
841 gsave
d30e4fd5 842 (For )show
48441121 843 128 string cvs show
d30e4fd5 844 ( )show
48441121 845 32 string cvs show
d30e4fd5 846 ( point, the line height is )show
48441121 847 lh 32 string cvs show
d30e4fd5 848 (, the space width is )show
48441121 849 sw 32 string cvs show
d30e4fd5 850 (,)show
48441121
KH
851 grestore
852 0 FontHeight neg rmoveto
853 gsave
d30e4fd5 854 (and a crude estimate of average character width is )show
48441121 855 aw 32 string cvs show
d30e4fd5 856 (.)show
48441121
KH
857 grestore
858 0 FontHeight neg rmoveto
859}def
860
d30e4fd5
GM
861% cm to point
862/cm{72 mul 2.54 div}def
48441121
KH
863
864/ReportAllFontInfo{
d30e4fd5
GM
865 % key = font name value = font dictionary
866 FontDirectory{pop 10 exch ReportFontInfo}forall
48441121
KH
867}def
868
d30e4fd5
GM
869% 3 cm 20 cm moveto 10/Courier ReportFontInfo showpage
870% 3 cm 20 cm moveto ReportAllFontInfo showpage
48441121 871
48441121 872% === END ps-print prologue 1