%!PS-Adobe-2.1
%%Title: PostScript Setup File for SLATE
%%Creator: Symmetry Group
%%CreationDate: 06 Feb 1991
%%For: SLATE Support of PostScript Printers  2.2.11
%%Copyright: 1994 The Symmetry Group, Inc all rights reserved
%   =============================================
%   =  MODULE: SETUP.TXT                        =
%   = VERSION: 2.2.11                           =
%   =                                           =
%   =FUNCTION: SLATE - PostScript Setup File    =
%   =                                           =
%   =  SYSTEM: SLATE                            =
%   = SYSVERS: 2.2.11                           =
%   = CREATED: 06FEB91                          =
%   = UPDATED: 11JAN94                          =
%   =                                           =
%   = (c) 1991,92,93,94                         =
%   = BY: The Symmetry Group                    =
%   =============================================
%  UPDATE NOTE:  Be sure to change the Setup File version in
%  the Error Handler and Status routines match the current version.
%
%  To print Status at the bottom of each page, add STAT to the
%  printer Select End string.  (Note: The current version of STAT
%  will only print in the portrait mode.
%
%  This is set to provice a minimum sized file when all
%  comments with single '%' are removed and all extra spaces
%  are removed.
%
%  Functions are described in the form:
%
%  <in_parm1> <in_parm2> ... function <out_parm1> ...
%        where
%          <in_parm..>  are the input parameters on the stack
%                       in the usual PostScript notation.
%          <out_parm.>  are the output parameters left on the stack.
%          function     is the function.
%  
%  Note: Because of the PostScript way of handling text, most functions
%   that are called from SLATE have a text string as the first parameter.
%   In most cases, this should be printed before any additional operations
%   are performed.
%
%  Note: To minimize the size of the command strings in SLATE, most
%   functions that are to be called from SLATE have one character
%   names (usually a capital letter).  Internal functions have two
%   character names and internal variables have two character names
%   starting with '$'.  While this is somewhat hard to read (as is
%   all PostScript), it results in significantly less data transfer,
%   smaller SLATE string space, and a smaller setup file.
%
%  NOTE:  The memory management is rather trickey.  We need to conserve
%   Virtual Memory at the same time that we insure that many functions
%   like fonts, paper sources, page size, etc. are preserved at the 
%   page end.  To accomplish this, two levels of save/restore are used.
%   
%   The lowest level is saved at the beginning of this include file and
%   restored at the end of the close (C) command.  This level is used
%   for all persistant features.  The next level is used as working
%   memory.  It is saved at the end of the startup commands (S or LS)
%   and restored at the beginning of the close (C) command.  It only
%   holds temporary data and is discarded after printing each page
%   with a restore/save operation.
%   
%   To set persistant features: restore, set the features, and save.
%
% HISTORY: 
%     VERS    DATE       BY   NOTES
%
%     2.2.0   06 Feb 91  CVP  Created
%     2.2.2   07 Nov 91  CVP  -Add "Y" Macro to select only.
%                             -Modify "T" and "X" macros to handle
%                             errors correctly.
%             21 Nov 91  CVP  -Add IBM-2 encoding vector and function
%                             (partial).
%     2.2.6C  27 Jul 92  CVP  -Add "IS2" Macro for non square image
%                             pixels.
%                             -Add Timeout set
%                             -Reset Paper Tray & Duplex
%                             -Reset Copies
%     2.2.7   04 Nov 92  CVP  -Add Color support.
%     2.2.11  15 Dec 93  CVP  -Add STAT command to print machine status &
%                             include it in new page command.
%                             -Develop save/restore memory management 
%                             system to prevent leakage of VM memory.
%                             -Add "bind" to most functions to improve
%                             speed.
%                             -Rewrite handleerror.
%                             -Revise timeout routines and set them in
%                             the lowest VM area.
%                             -Add more carefull testing of PS features
%                             before using them.
%                             -Revise Paper Tray Select to work with
%                             level 2 printers.
%
%%EndComments
%
% EJECT SECTION(Initialize & Define Globals)
%
% *** Create a Working Dictionary ***
%   
%   - () <save>
%
%   (Call 'C' at the end to return to the initial state.)
%
save /$WD 150 dict def $WD begin



% *** SLATE PS Temporary Global Variables (in $WD) ***
%   $V   Vertical Scale (points per current unit)
%   $H   Horizontal Scale (points per current unit)
%   $L   Page Length (current units)
%   $W   Page Width (current units)
%   $I2  IBM-2 8 Encoding Vector 
%   $R8  Roman 8 Encoding Vector 
%   $WN  Windows Encoding Vector 
%   $N   Working Font Directory

% *** Define Globals ***
/$V 1 def
/$H 1 def
/$L 792 def
/$W 612 def
/$TMP 40 string def
/$TMP1 40 string def

% EJECT SECTION(Error Reporting)

% *** handleerror - Replacement Error Handler ***
%  This replaces the standard proceedure with a
%  proceedure to write error data at the bottom
%  of the page and then execute the old procedure.
%  NOTE: errordict is the current dictionary when
%  executing.
%
errordict /handleerror
 {
  /Courier-Bold findfont 9 scalefont setfont
   initgraphics
   20 144 moveto
   (*** SLATE PostScript Error ***) show
   20 135 moveto
   (   Setup Vers:  2.2.11) show   %*******Change Here*******************
   20 126 moveto
   (   Error Type: ) show $error /errorname get 20 string cvs show
   20 117 moveto
   (Error Command: ) show $error /command get 20 string cvs show
   20 108 moveto
   (        Stack: ) show 
       $error /ostack get dup length 20 string cvs show
    {currentpoint exch pop 9 sub 80 exch moveto 20 string cvs show} 
   forall
   copypage
    } put

% EJECT SECTION(Print Status Functions)
% These functions only work with portrait mode.
%
% *** STAT - Enable Print Status ***
%
%   - STAT -
%
/STAT {/STX {PSTAT} def } bind def 

% *** STX - Print Status ***
%
%   - STX -
%
/STX {} bind def 

% *** PSTAT - Print Status (Internal) ***
%
%   - PSTAT -
%
/PSTAT {save 
      /Courier-Bold findfont 9 $H div scalefont setfont
      288 $H div dup 90 $V div  moveto
      (         Product: ) show /product where
          {pop product}
          {(Unknown )}
        ifelse show
       (  Version:) show version show
      dup 81 $V div moveto
      (        PS Level: ) show /languagelevel where
          {pop languagelevel}
          {1}
        ifelse 20 string cvs show
       (  Setup File: 2.2.11) show        %*********Change Here***********
      dup 72 $V div moveto
      (       VM Status: Max:) show vmstatus 20 string cvs show
        (  Used:) show 20 string cvs show
        (  Level:) show 20 string cvs show
      dup 63 $V div moveto
      (Oper Stack Count: ) show count 20 string cvs show
      dup 54 $V div moveto
      (Dictionary Count: ) show countdictstack 20 string cvs show
      dup 45 $V div moveto
      (Exec Stack Count: ) show countexecstack 20 string cvs show
      pop restore} bind def

% EJECT SECTION(Reset Timeouts)

% *** Set Waittimeout to 0 ***
%  This sets the wait timeout to 0 (to ignore timeout).
% 
  /statusdict where
    {pop statusdict /waittimeout known 
      {statusdict /waittimeout 0 put}
      if}
    if

% *** Set Jobtimeout to 0 ***
%  This sets the job timeout to 0 (to ignore timeout).
% 
  /statusdict where
    {pop statusdict begin /setjobtimeout where 
      {pop 0 setjobtimeout}
      if end}
    if

% *** Set Manualfeedtimeout to 0 ***
%  This sets the maual feed timeout to 0 (to ignore timeout).
% 
  /statusdict where
    {pop statusdict /manualfeedtimeout known 
      {statusdict /manualfeedtimeout 0 put}
      if}
    if

% EJECT SECTION(IBM-2 Encloding Vector)
% *** IBM-2 Encoding Vector ***
%
/$I2 [
39/quotesingle
94/circumflex 
96/grave 
126/tilde
128/Ccedilla
129/udieresis
130/eacute
131/acircumflex
132/adieresis
133/agrave
134/aring
135/ccedilla
136/ecircumflex
137/edieresis
138/egrave
139/idieresis
140/icircumflex
141/igrave
142/Adieresis
143/Aring
144/Eacute
145/ae
146/AE
147/ocircumflex
148/odieresis
149/ograve
150/ucircumflex
151/ugrave
152/ydieresis
153/Odieresis
154/Udieresis
155/cent
156/sterling
157/yen
158/Pts
159/florin
160/aacute
161/iacute
162/oacute
163/uacute
164/ntilde
165/Ntilde
166/ordfeminine
167/ordmasculine
168/questiondown
170/logicalnot
171/onehalf
172/onequarter
173/exclamdown
174/guillemotleft
175/guillemotright
225/germandbls
226/Gamma
227/pi
228/Sigma
229/sigma
230/mu
231/tau
232/Phi
233/Theta
234/Omega
235/delta
236/infinity
237/phi
238/epsilon
239/intersection
240/equivalence
241/plusminus
242/greaterequal
243/lessequal
246/divide
247/approxequal
248/degree
249/productdot
250/periodcentered
251/radical
252/nsuperior
253/twosuperior
254/filledbox
] def

% EJECT SECTION(Roman 8 Encloding Vector)
% *** Roman 8 Encoding Vector ***
%
/$R8 [
127/square
161/Agrave
162/Acircumflex
163/Egrave
164/Ecircumflex
165/Edieresis
166/Icircumflex
167/Idieresis
168/acute
169/grave
170/circumflex
171/dieresis
172/tilde
173/Ugrave
174/Ucircumflex
175/sterling
176/overscore
177/Yacute
178/yacute
179/degree
180/Ccedilla
181/ccedilla
182/Ntilde
183/ntilde
184/exclamdown
185/questiondown
186/currency
187/sterling
188/yen
189/section
190/florin
191/cent
192/acircumflex
193/ecircumflex
194/ocircumflex
195/ucircumflex
196/aacute
197/eacute
198/oacute
199/uacute
200/agrave
201/egrave
202/ograve
203/ugrave
204/adieresis
205/edieresis
206/odieresis
207/udieresis
208/Aring
209/icircumflex
210/Oslash
211/AE
212/aring
213/iacute
214/oslash
215/ae
216/Adieresis
217/igrave
218/Odieresis
219/Udieresis
220/Eacute
221/idieresis
222/germandbls
223/Ocircumflex
224/Aacute
225/Atilde
226/atilde
227/Eth
228/eth
229/Iacute
230/Igrave
231/Oacute
232/Ograve
233/Otilde
234/otilde
235/Scaron
236/scaron
237/Uacute
238/Ydieresis
239/ydieresis
240/Thorn
241/thorn
242/periodcentered
243/mu
244/paragraph
245/threequarters
246/minus
247/onequarter
248/onehalf
249/ordfeminine
250/ordmasculine
251/guillemotleft
252/stop
253/guillemotright
254/plusminus
] def

% EJECT SECTION(Windows Encloding Vector)
% *** Windows Encoding Vector ***
%
/$WN [
39/quotesingle
96/grave 
124/bar 
145/quoteleft 
146/quoteright 
147/quotedblleft
148/quotedblright 
149/bullet 
150/endash 
151/emdash 
160/space
164/currency 
166/brokenbar
167/section 
168/dieresis 
169/copyright
170/ordfeminine 
171/guillemotleft 
172/logicalnot 
173/hyphen
174/registered 
175/macron 
176/degree 
177/plusminus 
178/twosuperior
179/threesuperior 
180/acute 
181/mu 
182/paragraph 
183/periodcentered
184/cedilla 
185/onesuperior 
186/ordmasculine 
187/guillemotright
188/onequarter 
189/onehalf 
190/threequarters 
191/questiondown
192/Agrave 
193/Aacute 
194/Acircumflex 
195/Atilde 
196/Adieresis
197/Aring 
198/AE 
199/Ccedilla 
200/Egrave 
201/Eacute 
202/Ecircumflex
203/Edieresis 
204/Igrave 
205/Iacute 
206/Icircumflex 
207/Idieresis
208/Eth 
209/Ntilde 
210/Ograve 
211/Oacute 
212/Ocircumflex
213/Otilde 
214/Odieresis 
215/multiply 
216/Oslash 
217/Ugrave
218/Uacute 
219/Ucircumflex 
220/Udieresis 
221/Yacute 
222/Thorn
223/germandbls 
224/agrave 
225/aacute 
226/acircumflex 
227/atilde
228/adieresis 
229/aring 
230/ae 
231/ccedilla 
232/egrave 
233/eacute
234/ecircumflex 
235/edieresis 
236/igrave 
237/iacute 
238/icircumflex
239/idieresis 
240/eth 
241/ntilde 
242/ograve 
243/oacute 
244/ocircumflex
245/otilde 
246/odieresis 
247/divide 
248/oslash 
249/ugrave
250/uacute 
251/ucircumflex 
252/udieresis 
253/yacute 
254/thorn
255/ydieresis
] def

% EJECT SECTION(Setup & Close)
% *** S - Setup Printer ***
%  Set printer resolution (and working units).
%  (This assumes standard 1/72 in units to start.)
%  Also adjust current page width & length.
%  Save VM to restore at end of page.
%
%   <horz_res> <vert_res> S <save>
%
/S {72 exch div /$V exch store
 72 exch div /$H exch store
 /$L $L $V div store /$W $W $H div store
 $H $V scale save () D
 } bind def

% *** LS - Setup Printer (Landscape) ***
%  Set printer resolution (and working units).
%  Change to Landscape Mode.
%  (This assumes standard 1/72 in units to start.)
%  Also adjust current page width & length.
%  Save VM to restore at end of page.
%
%   <horz_res> <vert_res> S <save>
%
/LS {72 exch div /$V exch store
 72 exch div /$H exch store
 /$L $W /$W $L $V div store $H div store
 $H $V scale 
 90 rotate
 % Revise H (Horz Position) definition
   /H {exch P currentpoint exch pop moveto} bind def
 % Revise V (Vertical Position) definition
   /V {exch P 0 exch sub currentpoint pop exch moveto} bind def
 % Revise X (Set Duplex) definition
   /X {exch P /statusdict where
         {pop statusdict begin 1 eq
           {setduplexmode true settumble} stopped {pop} if
           end}
         {pop}
         ifelse} bind def
 save () D} bind def

% *** C - Closing Function ***
% (and handle character string.)
% Restore VM from start.  End Working Dictionary.
%
%   <save> <save> <string> C -
%
/C {P restore
     /#copies 1 store
     /statusdict where
       {pop statusdict begin
         /manualfeed where 
           {/manualfeed false put} if
         0 {setpapertray} stopped {pop} if
         false {setduplexmode} stopped {pop} if
         false {settumble} stopped {pop} if
         end} if
    end restore} bind def

% EJECT SECTION(Size & Position)
% *** W - Set Page Width ***
% In current units
% (and handle character string.)
%
%   <save> <string> <page_wid> W <save>
%
/W {exch P
    currentpoint 4 -1 roll restore moveto
    /$W exch store
    save} bind def



% *** L - Set Page Length ***
% In current Units
% (and handle character string.)
%
%   <save> <string> <page_len> L <save>
%
/L {exch P 
    currentpoint 4 -1 roll restore moveto
    /$L exch store
    save} bind def



% *** H - Set Horizontal Position ***
% (In current Units)
% (and handle character string.)
%
%   <string> <horz_pos> H -
%
/H {exch P currentpoint exch pop moveto} bind def



% *** V - Set Vertical Position ***
% (In current Units)
% (Also convert from Bottom Left Reference to top Right)
% (and handle character string.)
%
%   <string> <vert_pos> V -
%
/V {exch P $L exch sub currentpoint pop exch moveto} bind def



% *** R - Carriage Return ***
% (and handle character string.)
%
%   <string> R -
%
/R {P currentpoint exch pop 0 exch moveto} bind def



% EJECT SECTION(Page & Bin Select)
% *** N - New Page ***
% (and handle character string.)
%
%   <save> <string> N <save>
%
/N {P STX showpage restore save 0 0 moveto} bind def



% *** T - Tray Select ***
% (and handle character string.)
% and print page.
%
%   <save> <string> <tray> <manual> T <save>
%
%   <tray>    0 - n  Tray Number
%            -1      Not Used
%   <manual>  0      Not Manual Feed
%             1      Manual Feed
%            -1      Not Used
%
% NOTE: On some machines, setpapertray resets the CTM and position.  Also
% on some machines, grestore restores the old paper tray.  Thus the
% complex command is necessary for paper tray select.
%
/T {3 -1 roll P
 STX showpage
 3 -1 roll restore 
 /statusdict where
   {pop statusdict begin
     dup -1 eq
       {pop}
       {1 eq /manualfeed exch store}
     ifelse
     dup -1 eq
       {pop}
       {currentpoint matrix currentmatrix 4 -1 roll
         {setpapertray} stopped {pop} if
         setmatrix moveto}
     ifelse  
     end}
   {pop pop}
   ifelse 
 save 0 0 moveto } bind def 



% *** Y - Tray Select (No Page Print) ***
% (and handle character string.)
%
%   <save> <string> <tray> <manual> Y <save>
%
%   <tray>    0 - n  Tray Number
%            -1      Not Used
%   <manual>  0      Not Manual Feed
%             1      Manual Feed
%            -1      Not Used
%
% NOTE: On some machines, setpapertray resets the CTM and position.  Also
% on some machines, grestore restores the old paper tray.  Thus the
% complex command is necessary for paper tray select.
%
/Y {3 -1 roll P
 currentpoint 5 -1 roll restore moveto
 /statusdict where
   {pop statusdict begin
     dup -1 eq
       {pop}
       {1 eq /manualfeed exch store}
     ifelse
     dup -1 eq
       {pop}
       {currentpoint matrix currentmatrix 4 -1 roll
         {setpapertray} stopped {pop} if
         setmatrix moveto}
     ifelse  
     end}
   {pop pop}
   ifelse
   save} bind def

% *** X - Duplex Select ***
% (and handle character string.)
%
%   <save> <string> <dpx> X <save>
%
%   <dpx>     0      Not Duplex
%             1      Duplex
%
/X {exch P 
    currentpoint 4 -1 roll restore moveto
     /statusdict where
       {pop statusdict begin
         1 eq {setduplexmode} stopped {pop} if end}
       {pop}
     ifelse
   save} bind def



% *** O - Set Number of Copies ***
% (and handle character string.)
%
%   <save> <string> <copies> O <save>
%
/O {exch P 
    currentpoint 4 -1 roll restore moveto
    /#copies exch store
    save} bind def



% EJECT SECTION(Print Functions)
% *** P - String Print ***
%  (Force horizontal grid position after each character.)
%
%   <string> P -
%
/P {{pop pop currentpoint exch round exch moveto} exch kshow 
 currentpoint exch round exch moveto} bind def



% *** B - Print Block ***
%  Print Block at current position  (from top left)
%  (and take care of character string.)
%
%   <string> <vert> <horz> <dens> B -
%
/B {4 -1 roll P gsave
 100 exch sub 100 div setgray 
 currentpoint newpath moveto
 dup 0 rlineto
 exch neg 0 exch rlineto
 neg 0 rlineto
 closepath fill grestore} bind def



% *** G - Grey Level Set ***
%  Set grey level (0=white, 100=black)
%  (and handle character string.
%
%   <save> <string> <dens> G <save>
%
/G {exch P 
    currentpoint 4 -1 roll restore moveto
    100 exch sub 100 div setgray
    save} bind def



% *** CO - Color Set ***
%  Set CMYK Color (0=white, 1=Full Color)
%  (and handle character string.
%
%   <save> <string> <cyan> <magenta> <yellow> <black> CO <save>
%
/CO {5 -1 roll P
     currentpoint 7 -1 roll restore moveto
     {setcmykcolor} stopped {pop pop pop pop} if
     save} bind def



% EJECT SECTION(Print Image)
% *** Image Operation ***
%  The IS (Image Start) function sets up the stack.  Slate then
%  builds a HEX image array for one line.  Then IE (Image End)
%  prints the line of data and positions properly.



% *** IS - Image Start ***
%   Setup the stack for subsequent IE call to print a line
%   of image data.  A row of hex image data in the form:
%   {<Hex Data>} should be sent before calling IE.
%   (Also take care of character string.)
%
%   <string> <bytes> <dots> IS <pixels> 
%
/IS {3 -1 roll P
 dup currentpoint 2 copy 5 -1 roll sub moveto gsave translate
 dup scale 8 mul} bind def



% *** CS - Color Image Start ***
%   Setup the stack for subsequent IE call to print a line
%   of image data.  A row of hex image data in the form:
%   {<Hex Data>} should be sent before calling IE.
%   (Also take care of character string.)
%
%   <string> <bytes> <dots> IS <pixels> 
%
/CS {3 -1 roll P
 dup currentpoint 2 copy 5 -1 roll sub moveto gsave translate
 dup scale 2 mul} bind def



% *** IS2 - Image Start (Non Square) ***
%   Setup the stack for subsequent IE call to print a line
%   of image data.  A row of hex image data in the form:
%   {<Hex Data>} should be sent before calling IE.
%   (Also take care of character string.)
%
%   <string> <bytes> <hdots> <vdots> IS <pixels> 
%
/IS2 {4 -1 roll P
 dup currentpoint 2 copy 5 -1 roll sub moveto gsave translate
 scale 8 mul} bind def



% *** IE - Image End ***
%   Print Image data
%
%   <pixels> {<Hex data>} IE -
%
/IE {1 1 matrix 4 -1 roll image grestore} bind def



% *** CE - Color Image End ***
%   Print Image data
%
%   <pixels> {<Hex data>} CE -
%
%   <Hex Data> is the CMYK interleaved data
%
/CE {1 1 matrix 4 -1 roll false 4 colorimage grestore} bind def



% EJECT SECTION(Font Functions)
% *** F - Font Select ***
%  Set current font and size (in points).
%  (and handle character string.)
%
%   <save> <string> <size> <font_name> F <save>
%
%  This is a bit trickey since PostScript Level 1 objects to the
%  font_name object on the stack during the restore.  Copy to 
%  $TMP array in lowest level of VM.
%
/F {3 -1 roll P
    $TMP cvs 
    currentpoint 5 -1 roll restore moveto
    findfont exch $H div scalefont
    setfont
    save
    } bind def



% *** FV - Set new Font Encoding Vector (Internal) ***
%
%   <vector> <new_name> <old_font> FV <new-font>
%
/FV {dup maxlength dict /$N exch def
  {exch dup /FID ne
    {dup /Encoding eq
      {exch dup length array copy $N 3 1 roll put}
      {exch $N 3 1 roll put}
      ifelse}             
    {pop pop}
    ifelse}
  forall
 dup $N /FontName 3 -1 roll put exch aload length 2 idiv
  {$N /Encoding get 3 1 roll put}
  repeat
 $N definefont} bind def



% *** FI - Select IBM-2 Font ***
%  Convert Encoding Vector if necessary. 
%  (and take care of character string.)
%
%   <save> <string> <size> <font_name> <i2_name> FI <save>
%
%  This is a bit trickey since PostScript Level 1 objects to the
%  font_name objects on the stack during the restore.  Copy to 
%  $TMP and $TMP1 arrays in lowest level of VM.
%
/FI {4 -1 roll P
 $TMP cvs exch $TMP1 cvs exch 
 currentpoint 6 -1 roll restore moveto
 dup FontDirectory exch known
  {findfont exch pop}
  {exch findfont $I2 3 1 roll FV}
  ifelse
 exch $H div scalefont setfont
 save} bind def



% *** F8 - Select Roman 8 Font ***
%  Convert Encoding Vector if necessary. 
%  (and take care of character string.)
%
%   <string> <size> <font_name> <r8_name> F8
%
%  This is a bit trickey since PostScript Level 1 objects to the
%  font_name objects on the stack during the restore.  Copy to 
%  $TMP and $TMP1 arrays in lowest level of VM.
%
/F8 {4 -1 roll P
 $TMP cvs exch $TMP1 cvs exch 
 currentpoint 6 -1 roll restore moveto
 dup FontDirectory exch known
  {findfont exch pop}
  {exch findfont $R8 3 1 roll FV}
  ifelse
 exch $H div scalefont setfont
 save} bind def



% *** FW - Select Windows Font ***
%  Convert Encoding Vector if necessary. 
%  (and take care of character string.)
%
%   <string> <size> <font_name> <w_name> FW
%
%  This is a bit trickey since PostScript Level 1 objects to the
%  font_name objects on the stack during the restore.  Copy to 
%  $TMP and $TMP1 arrays in lowest level of VM.
%
/FW {4 -1 roll P
 $TMP cvs exch $TMP1 cvs exch 
 currentpoint 6 -1 roll restore moveto
 dup FontDirectory exch known
  {findfont exch pop}
  {exch findfont $WN 3 1 roll FV}
  ifelse
 exch $H div scalefont setfont
 save} bind def



% *** D - Set Default Font ***
% (and take care of character string.)
%
%   <save> <string> D <save>
%
/D {P 
    currentpoint 3 -1 roll restore moveto
    /Courier findfont 12 $H div scalefont setfont
    save} bind def


% EJECT SECTION(Final Setup)
%*** Final Setup ***/
%
0 0 moveto
/Courier findfont 12 $H div scalefont setfont 
%%EndProlog


