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