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