%!PS-Adobe-2.0
%%Creator: RZ Uni Zurich, Switzerland
%%Title: ISOLatin1.ps 
%%CreationDate: 10.12.92
%%DocumentFonts: Courier Courier-Bold Helvetica Helvetica-Bold
%%EndComments
%
% This PostScript code simulates the behavior of an IBM standard
% line printer. It supports the ASA carriage control characters,
% some of the machine CC characters and the ISO Latin character set.
% Additionally different format and positioning are user selectable
% as well as line spacing and font size. 
%
% By setting the parameters of the user section below you can customize
% your own line printer emulator, simply copy this code in front of your
% listing and send the whole to your PostScript printer with PRINTDOC
% (the 2 chars %! in front of the file define your file as a native
% PostScript file to PRINTDOC, don't remove them).   
 
% !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
% !! Don't touch the lines of code from here to the user section,!!
% !! unless you are a native PostScript expert.                  !!
% !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
/bdef { bind def } def
/even {/printall false def /printodd false def} bdef   % options def.
/odd  {/printall false def /printodd true  def} bdef
/CC {/withcc true def} bdef
/lm {currentfile token {/x0 exch def}if } bdef
/tm {currentfile token {/y0 exch def}if } bdef
/bm {currentfile token {/y1 exch def}if } bdef
/ps {currentfile token {/ips exch def}if } bdef
/il {currentfile token {/iil exch def /inl 0 def}if } bdef
/nl {currentfile token {/inl exch def /iil 0 def}if } bdef
/A4H {/A4Qopt false def /x0 100 def /y0 750 def /y1 38 def
      /ips 9 def} bdef
/A4Q {/A4Qopt true  def /x0 55  def /y0 540 def /y1 17 def
      /ips 7 def } bdef
/Helvetica {/fontname (Helvetica) def} bdef
/bold {/ibold (-Bold) def} bdef
% options almost case insensitive
/EVEN {even} bdef /ODD {odd} bdef
/a4h {A4H} bdef /a4q {A4Q} bdef /cc {CC} bdef
 
/reencdict 24 dict def
/ReEncode {                            % define character set (ISO Latin 1)
  reencdict begin
    /newcodesandnames exch def
    /newfontname exch def
    /basefontname exch def
    /basefontdict basefontname findfont def
    /newfont basefontdict maxlength dict def
    basefontdict
    { exch dup /FID ne
      { dup /Encoding eq
        { exch dup length array copy newfont 3 1 roll put }
        { exch newfont 3 1 roll put } ifelse
        }
      { pop pop } ifelse
      } forall
    newfont /FontName newfontname put
    newcodesandnames aload pop
    newcodesandnames length 2 idiv
    { newfont /Encoding get 3 1 roll put } repeat
    newfontname newfont definefont pop
    end
  } def
/RZUvec [
  226 /acircumflex
  228 /adieresis
  224 /agrave
  233 /eacute
  234 /ecircumflex
  235 /edieresis
  232 /egrave
  238 /icircumflex
  239 /idieresis
  236 /igrave
  244 /ocircumflex
  246 /odieresis
  242 /ograve
  251 /ucircumflex
  252 /udieresis
  249 /ugrave
  231 /ccedilla
  196 /Adieresis
  214 /Odieresis
  220 /Udieresis
  223 /germandbls
  ] def
/strcat {
   exch 2 copy length exch length exch dup 5 1 roll
   add string dup 3 1 roll copy pop dup 4 2 roll putinterval
   } bdef
 
% define printer emulation procedure
/startprint {
  /toprint printodd printall or def      % initialize
  /fontname fontname ibold strcat def    % prepare text font
  fontname /RZUfont RZUvec ReEncode
  /textfont
    /RZUfont findfont ips scalefont def
  /psplus ips .03  mul def               % calculate overprint incr.
  iil 0 eq {                             % calculate interline spacing
    /iil
    inl 0 eq
      {ips ips .1 mul add }              % defaults to 110% fontsize
      {y0 y1 sub inl div }
      ifelse
    def
    } if
% define outpage ...
  pagenr 0 gt {                          % numbering on
    /titlefont /Courier findfont 5 scalefont def     % set numbering font
    titlefont setfont
    /xt printodd not
      {50} {A4Qopt {700} {530} ifelse filename stringwidth pop sub}
      ifelse def
    /yt y0 ips ips add add def
    /outpage {                     % output page with numbering
      toprint {
        titlefont setfont
        xt yt moveto
        filename show
        3 0 rmoveto
        pagenr 4 string cvs show
        textfont setfont
        gsave showpage grestore
        } if
      /pagenr pagenr 1 add def
      printall not {/toprint toprint not def} if
      } bdef
    }
    { /outpage {                   % output page without numbering
      toprint {gsave showpage grestore} if
      printall not {/toprint toprint not def} if
      } bdef
    } ifelse
 
  A4Qopt {600.0 0 translate 90 rotate} if
 
  x0 y0 iil add moveto
  textfont setfont
  /str256 256 string def
 
  currentfile str256 readline          % clean start line garbage
  pop pop
 
% main loop:
  { currentfile str256 readline             % Start of printer emulator loop
    { dup length 0 le {pop (  ) } if
      withcc {dup 0 get} {32} ifelse
      /cc exch def
      currentpoint exch pop
      { cc 49 eq cc 12 eq or { y0 le {outpage} if      % 1  skip to line 1
         y0 exit } if                          %      on new page
        dup y0 gt withcc and {pop y0} if
        cc 32 eq { iil sub exit } if            % blank space 1 line
        cc 48 eq { iil 2 mul sub exit } if      % 0  space 2 lines
        cc 45 eq { iil 3 mul sub exit } if      % -  space 3 lines
        cc 43 eq { psplus sub exit } if        % +  suppress space
        cc 01 eq { exit } if       % space 1 line after printing
        cc 50 eq { exit } if       % space 1 line after printing
        (PRTLW PS: invalid ASA or machine char) =  pstack
        iil sub exit
        } loop
      dup y1 lt {pop outpage y0} if      % too far at bottom
      x0 exch moveto cc 43 eq { psplus 0 rmoveto} if
      withcc {dup length 1 sub 1 exch getinterval} if
      toprint { show } { pop } ifelse
      cc 43 eq {0 psplus rmoveto} if
      cc 01 eq { 0 iil neg rmoveto } if   % space 1 line after printing
      cc 50 eq { 0 iil neg rmoveto } if   % space 1 line after printing
      }
    {pop outpage printodd not toprint and {showpage} if exit} ifelse
    } loop
  } bdef
%%EndProlog

%%BeginSetup
/fontname (Courier) def
/ibold () def
/pagenr 0 def
/filename (Page) def
%Fname: text to be printed on the right top corner in pointsize 5
%       followed by a page number, 2*fontsize points above the top margin
%Nr     : 0   no numbering of the pages, Fname will not printed too
%       > 0   numbering on, start number of 1. page sent to printer
/printall true def
/printodd true def
A4H
/iil 0 def
/inl 0 def
/withcc false def
 
% %%%%%%%%%%%%% %
% User section: %
% %%%%%%%%%%%%% %
 
%Note: the char % starts a comment on a line !!!!!!!!!!!!!!!
% Here follows a description of the parameters you can modify,
% insert them before the last line.
 
% Per default the imbed of this PostScript prolog in front of
% a file allows you to print it as a text on an A4 unrotated page
% with font size 10, interline spacing 11, top margin 750,
% bottom margin 38 and left margin 100 and font Courier.
%You can override these defaults by entering the corresponding command
%before the last line of this prolog: (see example at the bottom)
 
%"A4H" : select A4H format (unrotated) and set
%        font height (ps),  interline (il), top margin (tm),
%        bottom margin (bm) and left margin to
%        ps 10 il 11  tm 750 bm 38 lm 100 nl 72
%"A4Q" : select A4Q format (rotated) and set
%      ps 7  il 7.7 tm 540 bm 17 lm 55 nl 68
%"ps"  value: font size in points (1/72 inch)
%"il"  value: interline 0: defaults to 110% of fontsize
%"nl"  value: number of lines per page, compute "il" as "tm-bm/nl"
%"bm"  value: bottom margin
%"tm"  value: top margin
%"lm"  value: left margin
 
%Additionally you can select the folowing print options (keyword)
%"Helvetica": Helvetica font selected, (proportional!)
%            default font is Courier
%"bold": bold font
%"even": only even pages are to be printed
%"odd" : only odd pages are to be printed
%"CC"  : ASA or machine carriage control chars in first column
 
% Usage Note:- the last entered options superseeds any previous one
%        e.g. lm 200 bm 200 CC A4Q A4H even odd gives CC A4H odd
%        and default margins for A4H
%      - the print options *must* appear before the start of the emulator
%        unless they would be considered as a text line, the last line
%        with the keyword "startprint" below starts the emulator
%      - options and keywords are case sensitive
 
% Examples (commented):
%    ps 10 bm 38 tm 750 lm 100 nl 65   % A4H, fontsize 10 points
%    ps 9 bm 38 tm 750 lm 100  nl 72   % PRINTDOC A4H param.
%    ps 7 bm 17 tm 540 lm 55   nl 68   % PRINTDOC A4Q param.
% Print etiquette high quality, (generally the last etiquette is too far
%     at bottom and not printed), uncomment next line for manualfeed!
%     (manualfeed don't work correctly on some LaserWriter)
%   statusdict begin /manualfeed true def end
%   ps 8 bm 44 tm 800 lm 340           % 7 etiqu a 12 lines
%   ps 8 bm 10 tm 720 lm 320           % 10 etiqu a 8 lines
%   ps 10 il 10.75 bm 56 tm 810 lm 200 % 7 etiqu a 10 lines
%          for subsequent photocopy on NASHUA 4100 (RZ office)
 
/#copies 1 def
%Here again an example, this time uncommented.
%  your text/listing have to be appended after the *last* line
% A4Q CC
A4Q %%OPTIONS%%
%%EndSetup
startprint    % never touch this line !!!!!!!!!!!!