[comp.lang.postscript] Ascii to PostScript conversion

evan@csli.STANFORD.EDU (Evan Kirshenbaum) (05/26/88)

Ok, folk, the initial response has been sufficient to warrant posting
the code to the net.  To install, simply run the following through sh,
and change the definition of 'dir' in a2ps to point to the directory
where the other files are kept.  To use, just say
   	a2ps  file1 file2 ...
This produces output suitable for piping through lpr to a PostScript
printer. 

The program consists of a csh script, a sed file, an awk file and a ps
prolog.  It requires that expand(1) be present in the path.  It has
been run on a Sun-4 running 4.2bsd and HP-Bobcats running HP/UX.

I've got a number of improvements in mind, and I would appreciate any
suggestions (and bugs reports) anyone has.  I will probably post a
spiffier version in a coupe of weeks, but this has served me well for
quite some time.

Enjoy

---
Evan Kirshenbaum
Stanford University
  evan@csli.Stanford.EDU
  ...!ucbvax!csli.stanford.edu!evan

If you think my opinions represent this university, 
you haven't been on campus recently!

--Cut-Here----Cut-Here----Cut-Here----Cut-Here----Cut-Here----Cut-Here--
#! /bin/sh
: This is a shar archive.  Extract with sh, not csh.
echo x - a2ps
cat > a2ps << '5982!Funky!Stuff!'
#!/bin/csh

# File: csli:/user/evan/bin/a2ps
# Created: Wed May 25 11:32:18 1988 by evan@csli (Evan Kirshenbaum)
# Version: 1.0(1)
# Description: Convert files from ascii to PostScript.  
#              Usage:  a2ps file1 file2 ...
#              Writes to standard output (I generally pipe through
#              lpr). Files are prepared for printing landscape, two to
#              a page, boxed.  Header for each page has the format:
#                  Print-Time   File-Name  Page-Number
#              where page-number starts at 1 for each file.  Each
#              sheet in the batch is also numbered in the lower
#              right-hand corner.
#
#              Customizability will be included soon.  
#
#              Requires 'expand' (change tabs to spaces) in the search
#              path. 
#
#              When installing, change the definition of 'dir' to the
#              directory where the a2ps.* files are kept.
#
# Edit History:

set dir= (~evan/bin)
cat $dir/a2ps.ps
date +"/date (%d %h 19%y  %r) def"
echo "startdoc"
foreach f ($*)
  echo "($f) newfile"
  cat $f | expand |sed -f $dir/a2ps.sed | awk -f $dir/a2ps.awk
end
echo "cleanup"
5982!Funky!Stuff!
echo x - a2ps.sed
cat > a2ps.sed << '5982!Funky!Stuff!'
# File: csli:/user/evan/bin/a2ps.sed
# Created: Wed May 25 11:24:07 1988 by evan@csli (Evan Kirshenbaum)
# Version: 1.0(1)
# Description: sed filter for a2ps ascii to PostScript conversion
#              program. Puts backslashes before all parens and
#              backslashes to allow the line to be included directly
#              in a postscript string.
#
# Edit History:

s/[\\()]/\\&/g

5982!Funky!Stuff!
echo x - a2ps.awk
cat > a2ps.awk << '5982!Funky!Stuff!'
# File: csli:/user/evan/bin/a2ps.awk
# Created: Wed May 25 11:26:39 1988 by evan@csli (Evan Kirshenbaum)
# Version: 1.0(1)
# Description: awk filter for a2ps ascii to PostScript conversion
#              program.  Breaks pages every 66 lines or when a line
#              begins with '\f'.
#
# Edit History:

BEGIN {line=0; print "startpage"}
(line>65 || $0~/^/) {line=0; print "endpage startpage"}
$0~/^ *$/ {next}
{print "(" $0 ") s"; line++}
END {print "endpage"}
5982!Funky!Stuff!
echo x - a2ps.ps
cat > a2ps.ps << '5982!Funky!Stuff!'
%!  PostScript Source Code

%  File: csli:/user/evan/bin/a2ps.ps
%  Created: Wed May 25 11:22:04 1988 by evan@csli (Evan Kirshenbaum)
%  Version: 1.0(1)
%  Description: PostScript prolog for a2ps ascii to PostScript program.
% 
%  Edit History:


/xdef {exch def} def
/inch {72 mul} def
/getfont {exch findfont exch scalefont} def

/filenamesize 12 def
/filenamefont /Helvetica-Bold filenamesize getfont def
/linesperpage 66 def


/datesize filenamesize 2 sub def
/datefont /Helvetica datesize getfont def
/headersize filenamesize 4 add def
/bodysize 6.8 def
/bodyfont /Courier bodysize getfont def
/sidemargin 4 def
/topmargin 4 def
/pagewidth 
   bodyfont setfont (0) stringwidth pop 80 mul sidemargin dup add add
   def
/pageheight
   bodysize linesperpage mul topmargin dup add add headersize add
   def
/uppery 8.5 inch pageheight add 2 div def
/upperx [ 11 inch pagewidth 2 mul sub 3 div
          dup 2 mul pagewidth add ] def

/pnum (                  ) def

/endpage
   { pageside 1 eq
       { /pageside 0 def
	 numberpage
         copypage erasepage 
	 /sheet sheet 1 add def }
       { /pageside 1 def }
     ifelse
     /pagenum pagenum 1 add def
    } def
/numberpage
    { 11 inch upperx 0 get sub sidemargin add
      8.5 inch uppery sub headersize sub moveto
      datefont setfont
      sheet pnum cvs show
    } def
/newfile
    { /filename xdef
      /pagenum 1 def 
    } def
/cleanup
    { pageside 1 eq
      {numberpage showpage} if
    } def
/startdoc
    { 8.5 inch 0 inch translate
      90 rotate 
      /pageside 0 def
      /sheet 1 def
    } def
/startpage
    { printheader
      printborder
      upperx pageside get sidemargin add
      uppery topmargin sub bodysize sub headersize sub moveto
      bodyfont setfont
    } def
/s  { gsave
        show
      grestore
      0 bodysize neg rmoveto
    } def
/printheader
    { upperx pageside get uppery headersize sub 1 add moveto
      datefont setfont
      gsave
        sidemargin 2 rmoveto date show
      grestore
      gsave
	/pnum pagenum pnum cvs def
        pagewidth sidemargin sub pnum stringwidth pop sub
        (Page ) stringwidth pop sub 3 rmoveto
        (Page ) show pnum show
      grestore
      gsave
        filenamefont setfont
        pagewidth filename stringwidth pop sub 2 div 2 rmoveto
        filename show
      grestore
    } def
/printborder 
    { upperx pageside get uppery moveto
      gsave
        pagewidth 0 rlineto
        0 pageheight neg rlineto
        pagewidth neg 0 rlineto
        closepath stroke
      grestore
      0 headersize neg rmoveto pagewidth 0 rlineto stroke
    } def
5982!Funky!Stuff!