More files!
diff --git a/postscript/README b/postscript/README
new file mode 100644
index 0000000..a0117ad
--- /dev/null
+++ b/postscript/README
@@ -0,0 +1,3 @@
+wget -O- http://pdos.lcs.mit.edu/~rsc/software/plan9/postscript.tar.gz|
+	gunzip|
+	tar xf -
diff --git a/postscript/font/NOTICE b/postscript/font/NOTICE
new file mode 100644
index 0000000..27a2479
--- /dev/null
+++ b/postscript/font/NOTICE
@@ -0,0 +1,19 @@
+
+This directory contains Bigelow & Holmes Lucida (R) fonts,
+as licensed by Y&Y Inc. Copyright 1993 Bigelow & Holmes Inc.
+P.O. Box 1432, Santa Monica, CA 90406, USA.
+
+Y&Y LUCIDA FONT SOFTWARE LICENSE AGREEMENT
+
+NOTICE TO USER:
+
+No right is granted to create derivative works of or
+to redistribute (other than with the Plan 9 Operating System)
+the screen imprinter fonts identified in subdirectory
+/lib/font/bit/lucida and printer fonts (Lucida Sans Unicode, Lucida
+Sans Italic, Lucida Sans Demibold, Lucida Typewriter, Lucida Sans
+Typewriter83), identified in subdirectory /sys/lib/postscript/font.
+These directories contain material copyrights by B&H Inc. and Y&Y Inc.
+
+Lucida is a registered trademark of Bigelow & Holmes Incorporated.
+PostScript is a registered trademark of Adobe Systems Incorporated.
diff --git a/postscript/font/fontmap b/postscript/font/fontmap
new file mode 100644
index 0000000..959450c
--- /dev/null
+++ b/postscript/font/fontmap
@@ -0,0 +1,152 @@
+LucidaSans			LucidaSans
+LucidaSans-Demi 		LucidaSans-Demi
+LucidaSans-DemiItalic 		LucidaSans-DemiItalic
+LucidaSans-Italic 		LucidaSans-Italic
+LucidaSans-Typewriter83	LucidaSans-Typewriter83
+LucidaSansUnicode00		lsunr00.pfa
+LucidaSansUnicode01		lsunr01.pfa
+LucidaSansUnicode02		lsunr02.pfa
+LucidaSansUnicode03		lsunr03.pfa
+LucidaSansUnicode04		lsunr04.pfa
+LucidaSansUnicode05		lsunr05.pfa
+LucidaSansUnicode20		lsunr20.pfa
+LucidaSansUnicode21		lsunr21.pfa
+LucidaSansUnicode22		lsunr22.pfa
+LucidaSansUnicode24		lsunr24.pfa
+LucidaSansUnicode25		lsunr25.pfa
+LucidaTypewriter 		LucidaTypewriter
+
+% alias for troff
+LucidaCW			LucidaTypewriter
+
+% Postscript versions of TeX fonts
+CMB10		cm/cmb10.pfa
+CMBSY10		cm/cmbsy10.pfa
+CMBX10		cm/cmbx10.pfa
+CMBX12		cm/cmbx12.pfa
+CMBX5		cm/cmbx5.pfa
+CMBX6		cm/cmbx6.pfa
+CMBX7		cm/cmbx7.pfa
+CMBX8		cm/cmbx8.pfa
+CMBX9		cm/cmbx9.pfa
+CMBXSL10		cm/cmbxsl10.pfa
+CMBXTI10		cm/cmbxti10.pfa
+CMCSC10		cm/cmcsc10.pfa
+CMDUNH10		cm/cmdunh10.pfa
+CMEX10		cm/cmex10.pfa
+CMFF10		cm/cmff10.pfa
+CMFI10		cm/cmfi10.pfa
+CMFIB8		cm/cmfib8.pfa
+CMINCH		cm/cminch.pfa
+CMITT10		cm/cmitt10.pfa
+CMMI10		cm/cmmi10.pfa
+CMMI12		cm/cmmi12.pfa
+CMMI5		cm/cmmi5.pfa
+CMMI6		cm/cmmi6.pfa
+CMMI7		cm/cmmi7.pfa
+CMMI8		cm/cmmi8.pfa
+CMMI9		cm/cmmi9.pfa
+CMMIB10		cm/cmmib10.pfa
+CMR10		cm/cmr10.pfa
+CMR12		cm/cmr12.pfa
+CMR17		cm/cmr17.pfa
+CMR5		cm/cmr5.pfa
+CMR6		cm/cmr6.pfa
+CMR7		cm/cmr7.pfa
+CMR8		cm/cmr8.pfa
+CMR9		cm/cmr9.pfa
+CMSL10		cm/cmsl10.pfa
+CMSL12		cm/cmsl12.pfa
+CMSL8		cm/cmsl8.pfa
+CMSL9		cm/cmsl9.pfa
+CMSLTT10		cm/cmsltt10.pfa
+CMSS10		cm/cmss10.pfa
+CMSS12		cm/cmss12.pfa
+CMSS17		cm/cmss17.pfa
+CMSS8		cm/cmss8.pfa
+CMSS9		cm/cmss9.pfa
+CMSSBX10		cm/cmssbx10.pfa
+CMSSDC10		cm/cmssdc10.pfa
+CMSSI10		cm/cmssi10.pfa
+CMSSI12		cm/cmssi12.pfa
+CMSSI17		cm/cmssi17.pfa
+CMSSI8		cm/cmssi8.pfa
+CMSSI9		cm/cmssi9.pfa
+CMSSQ8		cm/cmssq8.pfa
+CMSSQI8		cm/cmssqi8.pfa
+CMSY10		cm/cmsy10.pfa
+CMSY5		cm/cmsy5.pfa
+CMSY6		cm/cmsy6.pfa
+CMSY7		cm/cmsy7.pfa
+CMSY8		cm/cmsy8.pfa
+CMSY9		cm/cmsy9.pfa
+CMTCSC10		cm/cmtcsc10.pfa
+CMTEX10		cm/cmtex10.pfa
+CMTEX8		cm/cmtex8.pfa
+CMTEX9		cm/cmtex9.pfa
+CMTI10		cm/cmti10.pfa
+CMTI12		cm/cmti12.pfa
+CMTI7		cm/cmti7.pfa
+CMTI8		cm/cmti8.pfa
+CMTI9		cm/cmti9.pfa
+CMTT10		cm/cmtt10.pfa
+CMTT12		cm/cmtt12.pfa
+CMTT8		cm/cmtt8.pfa
+CMTT9		cm/cmtt9.pfa
+CMU10		cm/cmu10.pfa
+CMVTT10		cm/cmvtt10.pfa
+LASY10		cm/lasy10.pfa
+LASY5		cm/lasy5.pfa
+LASY6		cm/lasy6.pfa
+LASY7		cm/lasy7.pfa
+LASY8		cm/lasy8.pfa
+LASY9		cm/lasy9.pfa
+LASYB10		cm/lasyb10.pfa
+LCIRCLE1		cm/lcircle1.pfa
+LCIRCLEW		cm/lcirclew.pfa
+LCMSS8		cm/lcmss8.pfa
+LCMSSB8		cm/lcmssb8.pfa
+LCMSSI8		cm/lcmssi8.pfa
+LINE10		cm/line10.pfa
+LINEW10		cm/linew10.pfa
+LOGO10		cm/logo10.pfa
+LOGO8		cm/logo8.pfa
+LOGO9		cm/logo9.pfa
+LOGOBF10		cm/logobf10.pfa
+LOGOSL10		cm/logosl10.pfa
+
+% AMS fonts for TeX
+CMBSY5		ams/cmbsy5.pfa
+CMBSY7		ams/cmbsy7.pfa
+CMMIB5		ams/cmmib5.pfa
+CMMIB7		ams/cmmib7.pfa
+EUEX10		ams/euex10.pfa
+EUFB10		ams/eufb10.pfa
+EUFB5		ams/eufb5.pfa
+EUFB7		ams/eufb7.pfa
+EUFM10		ams/eufm10.pfa
+EUFM5		ams/eufm5.pfa
+EUFM7		ams/eufm7.pfa
+EURB10		ams/eurb10.pfa
+EURB5		ams/eurb5.pfa
+EURB7		ams/eurb7.pfa
+EURM10		ams/eurm10.pfa
+EURM5		ams/eurm5.pfa
+EURM7		ams/eurm7.pfa
+EUSB10		ams/eusb10.pfa
+EUSB5		ams/eusb5.pfa
+EUSB7		ams/eusb7.pfa
+EUSM10		ams/eusm10.pfa
+EUSM5		ams/eusm5.pfa
+EUSM7		ams/eusm7.pfa
+MSAM10		ams/msam10.pfa
+MSAM5		ams/msam5.pfa
+MSAM7		ams/msam7.pfa
+MSBM10		ams/msbm10.pfa
+MSBM5		ams/msbm5.pfa
+MSBM7		ams/msbm7.pfa
+WNCYB10		ams/wncyb10.pfa
+WNCYI10		ams/wncyi10.pfa
+WNCYR10		ams/wncyr10.pfa
+WNCYSC10		ams/wncysc10.pfa
+WNCYSS10		ams/wncyss10.pfa
diff --git a/postscript/font/lino b/postscript/font/lino
new file mode 100644
index 0000000..70a6ee0
--- /dev/null
+++ b/postscript/font/lino
@@ -0,0 +1,45 @@
+%
+% Resident font list for Linotronics Typesetter
+%
+
+AvantGarde-Book			
+AvantGarde-BookOblique		
+AvantGarde-Demi			
+AvantGarde-DemiOblique		
+Bookman-Demi			
+Bookman-DemiItalic		
+Bookman-Light			
+Bookman-LightItalic		
+Courier				
+Courier-Bold			
+Courier-BoldOblique		
+Courier-Oblique			
+Helvetica			
+Helvetica-Bold	
+Helvetica-BoldOblique
+Helvetica-Oblique
+Helvetica-Narrow		
+Helvetica-Narrow-Oblique	
+Helvetica-Narrow-Bold		
+Helvetica-Narrow-BoldOblique	
+NewCenturySchlbk-Roman		
+NewCenturySchlbk-Italic		
+NewCenturySchlbk-Bold		
+NewCenturySchlbk-BoldItalic	
+Palatino-Roman			
+Palatino-Italic			
+Palatino-Bold			
+Palatino-BoldItalic		
+Symbol				
+Times-Bold			
+Times-BoldItalic		
+Times-Italic			
+Times-Roman			
+Universal-MathOne
+Universal-MathTwo
+Universal-MathThree
+Universal-MathFour
+Universal-MathFive
+Universal-MathSix
+ZapfDingbats			
+ZapfChancery-MediumItalic	
diff --git a/postscript/font/lw+ b/postscript/font/lw+
new file mode 100644
index 0000000..629b561
--- /dev/null
+++ b/postscript/font/lw+
@@ -0,0 +1,39 @@
+%
+% Resident font list for LaserWriter plus and QMS-PS 800+
+%
+
+AvantGarde-Book			
+AvantGarde-BookOblique		
+AvantGarde-Demi			
+AvantGarde-DemiOblique		
+Bookman-Demi			
+Bookman-DemiItalic		
+Bookman-Light			
+Bookman-LightItalic		
+Courier				
+Courier-Bold			
+Courier-BoldOblique		
+Courier-Oblique			
+Helvetica			
+Helvetica-Bold	
+Helvetica-BoldOblique
+Helvetica-Oblique
+Helvetica-Narrow		
+Helvetica-Narrow-Oblique	
+Helvetica-Narrow-Bold		
+Helvetica-Narrow-BoldOblique	
+NewCenturySchlbk-Roman		
+NewCenturySchlbk-Italic		
+NewCenturySchlbk-Bold		
+NewCenturySchlbk-BoldItalic	
+Palatino-Roman			
+Palatino-Italic			
+Palatino-Bold			
+Palatino-BoldItalic		
+Symbol				
+Times-Bold			
+Times-BoldItalic		
+Times-Italic			
+Times-Roman			
+ZapfDingbats			
+ZapfChancery-MediumItalic	
diff --git a/postscript/prologues/Default.enc b/postscript/prologues/Default.enc
new file mode 100644
index 0000000..e1f8c24
--- /dev/null
+++ b/postscript/prologues/Default.enc
@@ -0,0 +1,343 @@
+%
+% Encoding vector, operator and procedure redefinitions for Plan 9 UTF
+% encoding. Prologues are expected to take steps to ensure operator
+% redefinitions given here are actually used. Current implementation
+% assumes UTF byte streams that represent ASCII or Latin1 text.
+%
+
+/UTFLatin1Encoding [
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/space
+	/exclam
+	/quotedbl
+	/numbersign
+	/dollar
+	/percent
+	/ampersand
+	/quoteright
+	/parenleft
+	/parenright
+	/asterisk
+	/plus
+	/comma
+	/minus
+	/period
+	/slash
+	/zero
+	/one
+	/two
+	/three
+	/four
+	/five
+	/six
+	/seven
+	/eight
+	/nine
+	/colon
+	/semicolon
+	/less
+	/equal
+	/greater
+	/question
+	/at
+	/A
+	/B
+	/C
+	/D
+	/E
+	/F
+	/G
+	/H
+	/I
+	/J
+	/K
+	/L
+	/M
+	/N
+	/O
+	/P
+	/Q
+	/R
+	/S
+	/T
+	/U
+	/V
+	/W
+	/X
+	/Y
+	/Z
+	/bracketleft
+	/backslash
+	/bracketright
+	/asciicircum
+	/underscore
+	/quoteleft
+	/a
+	/b
+	/c
+	/d
+	/e
+	/f
+	/g
+	/h
+	/i
+	/j
+	/k
+	/l
+	/m
+	/n
+	/o
+	/p
+	/q
+	/r
+	/s
+	/t
+	/u
+	/v
+	/w
+	/x
+	/y
+	/z
+	/braceleft
+	/bar
+	/braceright
+	/asciitilde
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/dotlessi
+	/grave
+	/acute
+	/circumflex
+	/tilde
+	/macron
+	/breve
+	/dotaccent
+	/dieresis
+	/.notdef
+	/ring
+	/cedilla
+	/.notdef
+	/hungarumlaut
+	/ogonek
+	/caron
+	/space
+	/exclamdown
+	/cent
+	/sterling
+	/currency
+	/yen
+	/brokenbar
+	/section
+	/dieresis
+	/copyright
+	/ordfeminine
+	/guillemotleft
+	/logicalnot
+	/hyphen
+	/registered
+	/macron
+	/degree
+	/plusminus
+	/twosuperior
+	/threesuperior
+	/acute
+	/mu
+	/paragraph
+	/periodcentered
+	/cedilla
+	/onesuperior
+	/ordmasculine
+	/guillemotright
+	/onequarter
+	/onehalf
+	/threequarters
+	/questiondown
+	/Agrave
+	/Aacute
+	/Acircumflex
+	/Atilde
+	/Adieresis
+	/Aring
+	/AE
+	/Ccedilla
+	/Egrave
+	/Eacute
+	/Ecircumflex
+	/Edieresis
+	/Igrave
+	/Iacute
+	/Icircumflex
+	/Idieresis
+	/Eth
+	/Ntilde
+	/Ograve
+	/Oacute
+	/Ocircumflex
+	/Otilde
+	/Odieresis
+	/multiply
+	/Oslash
+	/Ugrave
+	/Uacute
+	/Ucircumflex
+	/Udieresis
+	/Yacute
+	/Thorn
+	/germandbls
+	/agrave
+	/aacute
+	/acircumflex
+	/atilde
+	/adieresis
+	/aring
+	/ae
+	/ccedilla
+	/egrave
+	/eacute
+	/ecircumflex
+	/edieresis
+	/igrave
+	/iacute
+	/icircumflex
+	/idieresis
+	/eth
+	/ntilde
+	/ograve
+	/oacute
+	/ocircumflex
+	/otilde
+	/odieresis
+	/divide
+	/oslash
+	/ugrave
+	/uacute
+	/ucircumflex
+	/udieresis
+	/yacute
+	/thorn
+	/ydieresis
+] def
+
+/NewFontDirectory FontDirectory maxlength dict def
+
+%
+% Apparently no guarantee findfont is defined in systemdict so the obvious
+%
+%	systemdict /findfont get exec
+%
+% can generate an error. So far the only exception is a VT600 (version 48.0).
+%
+
+userdict /@RealFindfont known not {
+	userdict begin
+		/@RealFindfont systemdict begin /findfont load end def
+	end
+} if
+
+/findfont {
+	dup NewFontDirectory exch known not {
+		dup
+		%dup systemdict /findfont get exec	% not always in systemdict
+		dup userdict /@RealFindfont get exec
+		dup /Encoding get StandardEncoding eq {
+			dup length 1 add dict begin
+				{1 index /FID ne {def}{pop pop} ifelse} forall
+				/Encoding UTFLatin1Encoding def
+				/Metrics 1 dict def
+				Metrics /.notdef 0 put
+				currentdict
+			end
+			/DummyFontName exch definefont
+		} if
+		NewFontDirectory 3 1 roll put
+	} if
+	NewFontDirectory exch get
+} bind def
+
+%
+% UTF string decoding for ASCII and Latin1 only:
+%
+%	C2 XX	=> 00 XX
+%	C3 XX	=> XX+40 00
+%
+% Two passes through each string with search is undoubtedly faster than
+% PostScript that examines each byte.
+%
+
+/UTFstring {
+	dup {
+		(\302) search {
+			pop
+			0 0 put
+		}{pop exit} ifelse
+	} loop
+	dup {
+		(\303) search {
+			pop
+			1 index 0 get 16#40 add 0 exch put
+			dup length 0 gt {dup 0 0 put} if
+		}{pop exit} ifelse
+	} loop
+} bind def
+
+/ashow {mark 4 1 roll UTFstring //ashow cvx exec cleartomark} bind def
+/awidthshow {mark 7 1 roll UTFstring //awidthshow cvx exec cleartomark} bind def
+/show {mark exch UTFstring //show cvx exec cleartomark} bind def
+/stringwidth {UTFstring //stringwidth cvx exec} bind def
+/widthshow {mark 5 1 roll UTFstring //widthshow cvx exec cleartomark} bind def
+
+%
+% kshow is harder - stack can't change because of the procedure.
+%
+
+/kshow dup load type /operatortype eq
+	{{UTFstring kshow} bind}
+	{{UTFstring //kshow cvx exec} bind}
+ifelse def
+
diff --git a/postscript/prologues/Latin1.enc b/postscript/prologues/Latin1.enc
new file mode 100644
index 0000000..1e6e60b
--- /dev/null
+++ b/postscript/prologues/Latin1.enc
@@ -0,0 +1,299 @@
+%
+% Encoding vector and redefinition of findfont for the ISO Latin1 standard.
+% The 18 characters missing from ROM based fonts on older printers are noted
+% below.
+%
+
+/ISOLatin1Encoding [
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/space
+	/exclam
+	/quotedbl
+	/numbersign
+	/dollar
+	/percent
+	/ampersand
+	/quoteright
+	/parenleft
+	/parenright
+	/asterisk
+	/plus
+	/comma
+	/minus
+	/period
+	/slash
+	/zero
+	/one
+	/two
+	/three
+	/four
+	/five
+	/six
+	/seven
+	/eight
+	/nine
+	/colon
+	/semicolon
+	/less
+	/equal
+	/greater
+	/question
+	/at
+	/A
+	/B
+	/C
+	/D
+	/E
+	/F
+	/G
+	/H
+	/I
+	/J
+	/K
+	/L
+	/M
+	/N
+	/O
+	/P
+	/Q
+	/R
+	/S
+	/T
+	/U
+	/V
+	/W
+	/X
+	/Y
+	/Z
+	/bracketleft
+	/backslash
+	/bracketright
+	/asciicircum
+	/underscore
+	/quoteleft
+	/a
+	/b
+	/c
+	/d
+	/e
+	/f
+	/g
+	/h
+	/i
+	/j
+	/k
+	/l
+	/m
+	/n
+	/o
+	/p
+	/q
+	/r
+	/s
+	/t
+	/u
+	/v
+	/w
+	/x
+	/y
+	/z
+	/braceleft
+	/bar
+	/braceright
+	/asciitilde
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/dotlessi
+	/grave
+	/acute
+	/circumflex
+	/tilde
+	/macron
+	/breve
+	/dotaccent
+	/dieresis
+	/.notdef
+	/ring
+	/cedilla
+	/.notdef
+	/hungarumlaut
+	/ogonek
+	/caron
+	/space
+	/exclamdown
+	/cent
+	/sterling
+	/currency
+	/yen
+	/brokenbar		% missing
+	/section
+	/dieresis
+	/copyright
+	/ordfeminine
+	/guillemotleft
+	/logicalnot
+	/hyphen
+	/registered
+	/macron
+	/degree			% missing
+	/plusminus		% missing
+	/twosuperior		% missing
+	/threesuperior		% missing
+	/acute
+	/mu			% missing
+	/paragraph
+	/periodcentered
+	/cedilla
+	/onesuperior		% missing
+	/ordmasculine
+	/guillemotright
+	/onequarter		% missing
+	/onehalf		% missing
+	/threequarters		% missing
+	/questiondown
+	/Agrave
+	/Aacute
+	/Acircumflex
+	/Atilde
+	/Adieresis
+	/Aring
+	/AE
+	/Ccedilla
+	/Egrave
+	/Eacute
+	/Ecircumflex
+	/Edieresis
+	/Igrave
+	/Iacute
+	/Icircumflex
+	/Idieresis
+	/Eth			% missing
+	/Ntilde
+	/Ograve
+	/Oacute
+	/Ocircumflex
+	/Otilde
+	/Odieresis
+	/multiply		% missing
+	/Oslash
+	/Ugrave
+	/Uacute
+	/Ucircumflex
+	/Udieresis
+	/Yacute			% missing
+	/Thorn			% missing
+	/germandbls
+	/agrave
+	/aacute
+	/acircumflex
+	/atilde
+	/adieresis
+	/aring
+	/ae
+	/ccedilla
+	/egrave
+	/eacute
+	/ecircumflex
+	/edieresis
+	/igrave
+	/iacute
+	/icircumflex
+	/idieresis
+	/eth			% missing
+	/ntilde
+	/ograve
+	/oacute
+	/ocircumflex
+	/otilde
+	/odieresis
+	/divide			% missing
+	/oslash
+	/ugrave
+	/uacute
+	/ucircumflex
+	/udieresis
+	/yacute			% missing
+	/thorn			% missing
+	/ydieresis
+] def
+
+/NewFontDirectory FontDirectory maxlength dict def
+
+%
+% Apparently no guarantee findfont is defined in systemdict so the obvious
+%
+%	systemdict /findfont get exec
+%
+% can generate an error. So far the only exception is a VT600 (version 48.0).
+%
+
+userdict /@RealFindfont known not {
+	userdict begin
+		/@RealFindfont systemdict begin /findfont load end def
+	end
+} if
+
+/findfont {
+	dup NewFontDirectory exch known not {
+		dup
+		%dup systemdict /findfont get exec	% not always in systemdict
+		dup userdict /@RealFindfont get exec
+		dup /Encoding get StandardEncoding eq {
+			dup length dict begin
+				{1 index /FID ne {def}{pop pop} ifelse} forall
+				/Encoding ISOLatin1Encoding def
+				currentdict
+			end
+			/DummyFontName exch definefont
+		} if
+		NewFontDirectory 3 1 roll put
+	} if
+	NewFontDirectory exch get
+} bind def
+
diff --git a/postscript/prologues/Nroundpage.ps b/postscript/prologues/Nroundpage.ps
new file mode 100644
index 0000000..44a67a6
--- /dev/null
+++ b/postscript/prologues/Nroundpage.ps
@@ -0,0 +1,11 @@
+%
+% A version of roundpage.ps that assumes a symmetric clipping path. Thanks
+% to Matthijs Melchior for the suggestion.
+%
+
+/roundpagebbox {
+	pagebbox dup 0 get pagebbox 2 get add 2 exch put
+	pagebbox dup 1 get pagebbox 3 get add 3 exch put
+	pagebbox 0 0 put
+	pagebbox 1 0 put
+} bind def
diff --git a/postscript/prologues/UTF.enc b/postscript/prologues/UTF.enc
new file mode 100644
index 0000000..234764e
--- /dev/null
+++ b/postscript/prologues/UTF.enc
@@ -0,0 +1,332 @@
+%
+% Encoding vector, operator and procedure redefinitions for Plan 9 UTF
+% encoding. Prologues are expected to take steps to ensure operator
+% redefinitions given here are actually used. Current implementation
+% assumes UTF byte streams that represent ASCII or Latin1 text.
+%
+
+/UTFLatin1Encoding [
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/space
+	/exclam
+	/quotedbl
+	/numbersign
+	/dollar
+	/percent
+	/ampersand
+	/quoteright
+	/parenleft
+	/parenright
+	/asterisk
+	/plus
+	/comma
+	/minus
+	/period
+	/slash
+	/zero
+	/one
+	/two
+	/three
+	/four
+	/five
+	/six
+	/seven
+	/eight
+	/nine
+	/colon
+	/semicolon
+	/less
+	/equal
+	/greater
+	/question
+	/at
+	/A
+	/B
+	/C
+	/D
+	/E
+	/F
+	/G
+	/H
+	/I
+	/J
+	/K
+	/L
+	/M
+	/N
+	/O
+	/P
+	/Q
+	/R
+	/S
+	/T
+	/U
+	/V
+	/W
+	/X
+	/Y
+	/Z
+	/bracketleft
+	/backslash
+	/bracketright
+	/asciicircum
+	/underscore
+	/quoteleft
+	/a
+	/b
+	/c
+	/d
+	/e
+	/f
+	/g
+	/h
+	/i
+	/j
+	/k
+	/l
+	/m
+	/n
+	/o
+	/p
+	/q
+	/r
+	/s
+	/t
+	/u
+	/v
+	/w
+	/x
+	/y
+	/z
+	/braceleft
+	/bar
+	/braceright
+	/asciitilde
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/.notdef
+	/dotlessi
+	/grave
+	/acute
+	/circumflex
+	/tilde
+	/macron
+	/breve
+	/dotaccent
+	/dieresis
+	/.notdef
+	/ring
+	/cedilla
+	/.notdef
+	/hungarumlaut
+	/ogonek
+	/caron
+	/.notdef		% was space
+	/exclamdown
+	/cent
+	/sterling
+	/currency
+	/yen
+	/brokenbar
+	/section
+	/dieresis
+	/copyright
+	/ordfeminine
+	/guillemotleft
+	/logicalnot
+	/hyphen
+	/registered
+	/macron
+	/degree
+	/plusminus
+	/twosuperior
+	/threesuperior
+	/acute
+	/mu
+	/paragraph
+	/periodcentered
+	/cedilla
+	/onesuperior
+	/ordmasculine
+	/guillemotright
+	/onequarter
+	/onehalf
+	/threequarters
+	/questiondown
+	/Agrave
+	/Aacute
+	/Acircumflex
+	/Atilde
+	/Adieresis
+	/Aring
+	/AE
+	/Ccedilla
+	/Egrave
+	/Eacute
+	/Ecircumflex
+	/Edieresis
+	/Igrave
+	/Iacute
+	/Icircumflex
+	/Idieresis
+	/Eth
+	/Ntilde
+	/Ograve
+	/Oacute
+	/Ocircumflex
+	/Otilde
+	/Odieresis
+	/multiply
+	/Oslash
+	/Ugrave
+	/Uacute
+	/Ucircumflex
+	/Udieresis
+	/Yacute
+	/Thorn
+	/germandbls
+	/agrave
+	/aacute
+	/acircumflex
+	/atilde
+	/adieresis
+	/aring
+	/ae
+	/ccedilla
+	/egrave
+	/eacute
+	/ecircumflex
+	/edieresis
+	/igrave
+	/iacute
+	/icircumflex
+	/idieresis
+	/eth
+	/ntilde
+	/ograve
+	/oacute
+	/ocircumflex
+	/otilde
+	/odieresis
+	/divide
+	/oslash
+	/ugrave
+	/uacute
+	/ucircumflex
+	/udieresis
+	/yacute
+	/thorn
+	/ydieresis
+] def
+
+/NewFontDirectory FontDirectory maxlength dict def
+
+%
+% Apparently no guarantee findfont is defined in systemdict so the obvious
+%
+%	systemdict /findfont get exec
+%
+% can generate an error. So far the only exception is a VT600 (version 48.0).
+%
+
+userdict /@RealFindfont known not {
+	userdict begin
+		/@RealFindfont systemdict begin /findfont load end def
+	end
+} if
+
+/findfont {
+	dup NewFontDirectory exch known not {
+		dup
+		%dup systemdict /findfont get exec	% not always in systemdict
+		dup userdict /@RealFindfont get exec
+		dup /Encoding get StandardEncoding eq {
+			dup length 1 add dict begin
+				{1 index /FID ne {def}{pop pop} ifelse} forall
+				/Encoding UTFLatin1Encoding def
+				/Metrics 1 dict def
+				Metrics /.notdef 0 put
+				currentdict
+			end
+			/DummyFontName exch definefont
+		} if
+		NewFontDirectory 3 1 roll put
+	} if
+	NewFontDirectory exch get
+} bind def
+
+%
+% Assume A0, except for A0A0 which is replaced by 20A0, can be ignored.
+% Works with ASCII or Latin1 because A0 has been re-encoded as a zero
+% width non-printing character. 
+%
+
+/UTFstring {
+	dup {
+		(\240\240) search {
+			pop
+			0 16#20 put
+		}{pop exit} ifelse
+	} loop
+} bind def
+
+/ashow {mark 4 1 roll UTFstring //ashow cvx exec cleartomark} bind def
+/awidthshow {mark 7 1 roll UTFstring //awidthshow cvx exec cleartomark} bind def
+/show {mark exch UTFstring //show cvx exec cleartomark} bind def
+/stringwidth {UTFstring //stringwidth cvx exec} bind def
+/widthshow {mark 5 1 roll UTFstring //widthshow cvx exec cleartomark} bind def
+
+%
+% kshow is harder - stack can't change because of the procedure.
+%
+
+/kshow dup load type /operatortype eq
+	{{UTFstring kshow} bind}
+	{{UTFstring //kshow cvx exec} bind}
+ifelse def
+
diff --git a/postscript/prologues/aps.ps b/postscript/prologues/aps.ps
new file mode 100644
index 0000000..9ba0d30
--- /dev/null
+++ b/postscript/prologues/aps.ps
@@ -0,0 +1,127 @@
+%
+% Tune things up so Linotronic output looks more like the APS-5. Pull this file
+% into dpost output using the -C option. To get the best looking output run dpost
+% with the -e2 option and use special font files that look like the APS tables but
+% have character codes (ie. the fourth column in the width tables) appropriate for
+% PostScript fonts. Widths in these tables must be for APS fonts!
+%
+% Start with fat versions of the stroked Courier and Courier-Oblique fonts - from
+% Johnathan Shopiro.
+%
+
+/newdict /Courier findfont length dict def
+/Courier findfont {
+	1 index /FID ne
+		{newdict 3 1 roll put}
+		{pop pop}
+	ifelse
+} forall
+newdict /StrokeWidth 65 put
+/Courier newdict definefont pop
+
+/newdict /Courier-Oblique findfont length dict def
+/Courier-Oblique findfont {
+	1 index /FID ne
+		{newdict 3 1 roll put}
+		{pop pop}
+	ifelse
+} forall
+newdict /StrokeWidth 65 put
+/Courier-Oblique newdict definefont pop
+
+%
+% Scaled down versions of the Helvetica font family.
+%
+
+/newdict /Helvetica findfont length dict def
+/Helvetica findfont {
+	1 index /FontMatrix eq {.922 .922 matrix scale matrix concatmatrix} if
+
+	1 index /FID ne
+		{newdict 3 1 roll put}
+		{pop pop}
+	ifelse
+} forall
+/Helvetica newdict definefont pop
+
+/newdict /Helvetica-Oblique findfont length dict def
+/Helvetica-Oblique findfont {
+	1 index /FontMatrix eq {.922 .922 matrix scale matrix concatmatrix} if
+
+	1 index /FID ne
+		{newdict 3 1 roll put}
+		{pop pop}
+	ifelse
+} forall
+/Helvetica-Oblique newdict definefont pop
+
+/newdict /Helvetica-Bold findfont length dict def
+/Helvetica-Bold findfont {
+	1 index /FontMatrix eq {.922 .922 matrix scale matrix concatmatrix} if
+
+	1 index /FID ne
+		{newdict 3 1 roll put}
+		{pop pop}
+	ifelse
+} forall
+/Helvetica-Bold newdict definefont pop
+
+/newdict /Helvetica-BoldOblique findfont length dict def
+/Helvetica-BoldOblique findfont {
+	1 index /FontMatrix eq {.922 .922 matrix scale matrix concatmatrix} if
+
+	1 index /FID ne
+		{newdict 3 1 roll put}
+		{pop pop}
+	ifelse
+} forall
+/Helvetica-BoldOblique newdict definefont pop
+
+%
+% Scaled up versions of the Times font family.
+%
+
+/newdict /Times-Roman findfont length dict def
+/Times-Roman findfont {
+	1 index /FontMatrix eq {1.0225 1.0225 matrix scale matrix concatmatrix} if
+
+	1 index /FID ne
+		{newdict 3 1 roll put}
+		{pop pop}
+	ifelse
+} forall
+/Times-Roman newdict definefont pop
+
+/newdict /Times-Italic findfont length dict def
+/Times-Italic findfont {
+	1 index /FontMatrix eq {1.0225 1.0225 matrix scale matrix concatmatrix} if
+
+	1 index /FID ne
+		{newdict 3 1 roll put}
+		{pop pop}
+	ifelse
+} forall
+/Times-Italic newdict definefont pop
+
+/newdict /Times-Bold findfont length dict def
+/Times-Bold findfont {
+	1 index /FontMatrix eq {1.0225 1.0225 matrix scale matrix concatmatrix} if
+
+	1 index /FID ne
+		{newdict 3 1 roll put}
+		{pop pop}
+	ifelse
+} forall
+/Times-Bold newdict definefont pop
+
+/newdict /Times-BoldItalic findfont length dict def
+/Times-BoldItalic findfont {
+	1 index /FontMatrix eq {1.0225 1.0225 matrix scale matrix concatmatrix} if
+
+	1 index /FID ne
+		{newdict 3 1 roll put}
+		{pop pop}
+	ifelse
+} forall
+/Times-BoldItalic newdict definefont pop
+
diff --git a/postscript/prologues/banner.ps b/postscript/prologues/banner.ps
new file mode 100644
index 0000000..d563741
--- /dev/null
+++ b/postscript/prologues/banner.ps
@@ -0,0 +1,40 @@
+%
+% Simple program to print a banner page
+%
+
+/banner {
+	/saveobj save def
+	erasepage initgraphics
+
+	/#copies 1 def
+	/inch {72 mul} bind def
+	/pagebbox [clippath pathbbox newpath] def
+
+	/font /Helvetica def
+	/size 20 def
+	/height pagebbox 3 get def
+	/width pagebbox 2 get .09 mul def
+
+	.92 setgray
+	pagebbox 0 get pagebbox 1 get moveto
+	width 0 rlineto 0 height rlineto width neg 0 rlineto closepath eofill
+	pagebbox 2 get pagebbox 1 get moveto
+	width neg 0 rlineto 0 height rlineto width 0 rlineto closepath eofill
+	0 setgray
+
+	font findfont size scalefont setfont
+	/linesp size size .15 mul add neg def
+	/tab (Destination) stringwidth pop 1.5 mul def
+	/nextline {0 0 moveto show tab 0 moveto show 0 linesp translate} def
+
+	pagebbox 0 get 1.5 width mul add pagebbox 3 get 2.0 width mul sub translate
+	(Bin)  nextline
+	(Name) nextline
+	(Owner) nextline
+	(File) nextline
+	(Account) nextline
+	(Destination) nextline
+	(Spooldate) nextline
+	showpage
+	saveobj restore
+} bind def
diff --git a/postscript/prologues/baseline.ps b/postscript/prologues/baseline.ps
new file mode 100644
index 0000000..470047c
--- /dev/null
+++ b/postscript/prologues/baseline.ps
@@ -0,0 +1,156 @@
+%
+% Stuff used to draw or set text along a baseline specified by parametric equations
+% for x and y.
+%
+
+/left -1 def
+/center 0 def
+/right 1 def
+
+/baselinedict 50 dict def
+
+/newbaseline {
+	baselinedict begin
+		/g' exch bind def
+		/f' exch bind def
+		/g  exch bind def
+		/f  exch bind def
+
+		counttomark 2 eq {/hoffset exch def} if
+		/res exch def
+
+		/t 0 def
+		/s 0 def
+		/voffset false def
+		cleartomark
+	end
+} bind def
+
+/drawfunnytext {
+	baselinedict begin
+		/t exch def
+		/mode exch def
+		/str exch def
+
+		mode left eq {
+			/leftstring emptystring def
+			/rightstring str def
+		} if
+
+		mode right eq {
+			/leftstring str reversestring def
+			/rightstring emptystring def
+		} if
+
+		mode center eq {
+			str splitstring
+			/rightstring exch def
+			/leftstring exch reversestring def
+		} if
+
+		gsave currentpoint translate leftstring left t baselineshow grestore
+		gsave currentpoint translate rightstring right t baselineshow grestore
+
+		/t 0 def
+		/s 0 def
+		/voffset false def
+		cleartomark
+	end
+} bind def
+
+/setfunnytext {
+	baselinedict begin
+		/vpos exch def
+		/hpos exch def
+		/str  exch def
+
+		voffset vpos ne {
+			/voffset vpos def
+			/t 0 def
+			/s hoffset def
+		} if
+
+		gsave
+			hoffset voffset translate
+			0 0 moveto
+			/ds hpos s sub def
+			/dt ds t f' dup mul t g' dup mul add sqrt res mul div def
+			/s s ds add def
+			/t t dt add def
+			str right t baselineshow
+		grestore
+	end
+} bind def
+
+baselinedict begin
+
+/f  {} bind def
+/g  {pop 0} bind def
+/f' {pop 1} bind def
+/g' {pop 0} bind def
+
+/s 0 def
+/t 0 def
+/res 72 def
+
+/onecharstring ( ) def
+/emptystring () def
+
+/baselineshow {
+	/t exch def
+	/mode exch def
+	/str exch def
+
+	gsave
+		t f res mul t g res mul translate
+		0 0 moveto
+		t g' t f' atan rotate
+		{
+			mode right eq {pop} if
+			grestore gsave
+			onecharstring 0 3 -1 roll put onecharstring stringwidth pop
+			/ds exch mode mul def
+			/dt ds t f' dup mul t g' dup mul add sqrt res mul div def
+			/t t dt add def
+			/s s ds add def
+			t f res mul t g res mul translate
+			0 0 moveto
+			t g' t f' atan rotate
+			mode left eq {pop} if
+		} str kshow
+	grestore
+} bind def
+
+/reversestring {
+	/str1 exch def
+
+	/str2 str1 length string def
+	/i 0 def
+	/n str1 length 1 sub def
+
+	{
+		str1 n get str2 exch i exch put
+		/i i 1 add def
+		/n n 1 sub def
+		n 0 lt {exit} if
+	} loop
+	str2
+} bind def
+
+/splitstring {
+	/str1 exch def
+
+	/len str1 stringwidth pop def
+	/s 0 def
+	/n 0 def
+	str1 length {
+		str1 n get onecharstring exch 0 exch put
+		/s onecharstring stringwidth pop s add def
+		s len 2 div ge {exit} if
+		/n n 1 add def
+	} repeat
+	str1 0 n 1 add getinterval
+	str1 n str1 length n sub getinterval
+} bind def
+
+end
diff --git a/postscript/prologues/color.ps b/postscript/prologues/color.ps
new file mode 100644
index 0000000..e304cc3
--- /dev/null
+++ b/postscript/prologues/color.ps
@@ -0,0 +1,65 @@
+%
+% Color and reverse video support for dpost. A call made to setcolor with two
+% arguments implies reverse video printing.
+%
+
+/rgb {setrgbcolor} bind def
+/hsb {sethsbcolor} bind def
+
+/colordict 50 dict dup begin
+	/red			{ 1 0 0 } def
+	/green			{ 0 1 0 } def
+	/blue			{ 0 0 1 } def
+	/cyan			{ 0 1 1 } def
+	/magenta		{ 1 0 1 } def
+	/yellow			{ 1 1 0 } def
+	/white			{ 1 1 1 } def
+	/black			{ 0 0 0 } def
+end def
+
+/setcolor {
+	counttomark 1 eq {
+		dup colordict exch known not {pop /black} if
+		colordict exch get exec setrgbcolor
+	} if
+	counttomark 2 eq {
+		/backcolor exch def
+		/textcolor exch def
+		colordict backcolor known not colordict textcolor known not or {
+			/backcolor colordict /black get def
+			/textcolor colordict /white get def
+		} if
+		/backcolor colordict backcolor get def
+		/textcolor colordict textcolor get def
+		/dY1 0 def
+		/dY2 0 def
+		textcolor exec setrgbcolor
+	} if
+} bind def
+
+/drawrvbox {
+	/x2 exch def
+	/x1 exch def
+
+	currentpoint dup
+	/y1 exch def
+	/y2 exch def pop
+
+	dY1 0 eq dY2 0 eq and {
+		currentfont /FontBBox get aload pop
+		currentfont /FontMatrix get dtransform /dY2 exch def pop
+		currentfont /FontMatrix get dtransform /dY1 exch def pop
+	} if
+
+	/y1 y1 dY1 add def
+	/y2 y2 dY2 add def
+
+	backcolor exec setrgbcolor
+	newpath
+	x1 y1 moveto
+	x2 y1 lineto
+	x2 y2 lineto
+	x1 y2 lineto
+	closepath fill
+	textcolor exec setrgbcolor
+} bind def
diff --git a/postscript/prologues/cropmarks.ps b/postscript/prologues/cropmarks.ps
new file mode 100644
index 0000000..256891a
--- /dev/null
+++ b/postscript/prologues/cropmarks.ps
@@ -0,0 +1,131 @@
+%
+% Center pages, based on pageheight and pagewidth, and redefine showpage
+% to put cropmarks at each corner. Device dependent code to expand the
+% paper size goes in procedure expandpagesize. Currently only supports
+% a Linotronic 200P typesetter using 12 inch wide paper. You'll have to
+% add code to expandpagesize to support different typesetters or even a
+% 200P that's running differently.
+%
+
+/CropmarkDict 40 dict dup begin
+
+/expandpage true def
+/magnification 1 def
+/pageheight 11.0 def
+/pagewidth 8.5 def
+/scaletofit false def
+/scaling 1 def
+
+/marklength .3 def	% inches
+/markstart .125 def	% inches
+/markend .04 def	% inches
+/marklinewidth .25 def	% points
+
+/inch {72 mul} def
+/min {2 copy gt {exch} if pop} def
+/max {2 copy lt {exch} if pop} def
+
+/setup {
+	/markspace markstart marklength add markend add inch marklinewidth add def
+	/totalheight pageheight inch markspace 2 mul add def
+	/totalwidth pagewidth inch markspace 2 mul add def
+
+	pagedimensions
+	checkpagesize
+	/scaling getscaling def
+	xcenter ycenter translate
+	scaling scaling scale
+	pagewidth inch 2 div neg pageheight inch 2 div neg translate
+	clippage
+} def
+
+/pagedimensions {
+	clippath pathbbox newpath
+	4 -1 roll exch 4 1 roll 4 copy
+	sub /width exch def
+	sub /height exch def
+	add 2 div /xcenter exch def
+	add 2 div /ycenter exch def
+} def
+
+/checkpagesize {
+	height totalheight lt width totalwidth lt or expandpage and {
+		expandpagesize
+		pagedimensions
+	} if
+} def
+
+/expandpagesize {	% device dependent code
+	/Product statusdict begin /product where {pop product}{()} ifelse end def
+
+	Product (Linotype) eq {		% Linotronic 200P and other models?
+		statusdict /setpageparams known {
+			/maxwidth 12.0 inch def		% 12 inch wide paper?
+			totalheight maxwidth le {
+				totalheight
+				totalwidth
+				maxwidth totalheight sub 2 div
+				0
+			}{
+				totalwidth maxwidth min
+				totalheight
+				maxwidth totalwidth maxwidth min sub 2 div
+				1
+			} ifelse
+			statusdict /setpageparams get exec
+		} if
+	} if
+} def
+
+/getscaling {
+	scaletofit
+		{height totalheight div width totalwidth div min 1 min}
+		{1}
+	ifelse
+} def
+
+/clippage {
+	newpath
+	0 0 moveto
+	pagewidth inch 0 rlineto
+	0 pageheight inch rlineto
+	pagewidth neg inch 0 rlineto
+	closepath clip
+	newpath
+} def
+
+/cropmark {
+	gsave
+	translate
+	rotate
+	marklinewidth dup translate
+	0 0 transform round exch round exch itransform translate
+	markstart inch 0 moveto marklength inch 0 rlineto stroke
+	0 markstart inch moveto 0 marklength inch rlineto stroke
+	grestore
+} bind def
+
+/@PreviousShowpage /showpage load def
+
+end def
+
+%
+% Cropmarks - in the default coordinate system.
+%
+
+/showpage {
+	gsave
+	CropmarkDict begin
+		initgraphics
+		marklinewidth setlinewidth
+		xcenter ycenter translate
+		scaling scaling scale
+		0 pagewidth inch 2 div pageheight inch 2 div cropmark
+		90 pagewidth inch neg 2 div pageheight inch 2 div cropmark
+		180 pagewidth inch neg 2 div pageheight inch 2 div neg cropmark
+		270 pagewidth inch 2 div pageheight inch 2 div neg cropmark
+		@PreviousShowpage
+	end
+	grestore
+} bind def
+
diff --git a/postscript/prologues/dpost.ps b/postscript/prologues/dpost.ps
new file mode 100644
index 0000000..31f98b2
--- /dev/null
+++ b/postscript/prologues/dpost.ps
@@ -0,0 +1,197 @@
+%
+% Version 3.3.2 prologue for troff files.
+%
+
+/#copies 1 store
+/aspectratio 1 def
+/formsperpage 1 def
+/landscape false def
+/linewidth .3 def
+/magnification 1 def
+/margin 0 def
+/orientation 0 def
+/resolution 720 def
+/rotation 1 def
+/xoffset 0 def
+/yoffset 0 def
+
+/roundpage true def
+/useclippath true def
+/pagebbox [0 0 612 792] def
+
+/R  /Times-Roman def
+/I  /Times-Italic def
+/B  /Times-Bold def
+/BI /Times-BoldItalic def
+/H  /Helvetica def
+/HI /Helvetica-Oblique def
+/HB /Helvetica-Bold def
+/HX /Helvetica-BoldOblique def
+/CW /Courier def
+/CO /Courier def
+/CI /Courier-Oblique def
+/CB /Courier-Bold def
+/CX /Courier-BoldOblique def
+/PA /Palatino-Roman def
+/PI /Palatino-Italic def
+/PB /Palatino-Bold def
+/PX /Palatino-BoldItalic def
+/Hr /Helvetica-Narrow def
+/Hi /Helvetica-Narrow-Oblique def
+/Hb /Helvetica-Narrow-Bold def
+/Hx /Helvetica-Narrow-BoldOblique def
+/KR /Bookman-Light def
+/KI /Bookman-LightItalic def
+/KB /Bookman-Demi def
+/KX /Bookman-DemiItalic def
+/AR /AvantGarde-Book def
+/AI /AvantGarde-BookOblique def
+/AB /AvantGarde-Demi def
+/AX /AvantGarde-DemiOblique def
+/NR /NewCenturySchlbk-Roman def
+/NI /NewCenturySchlbk-Italic def
+/NB /NewCenturySchlbk-Bold def
+/NX /NewCenturySchlbk-BoldItalic def
+/ZD /ZapfDingbats def
+/ZI /ZapfChancery-MediumItalic def
+/S  /S def
+/S1 /S1 def
+/GR /Symbol def
+
+/inch {72 mul} bind def
+/min {2 copy gt {exch} if pop} bind def
+
+/setup {
+	counttomark 2 idiv {def} repeat pop
+
+	landscape {/orientation 90 orientation add def} if
+	/scaling 72 resolution div def
+	linewidth setlinewidth
+	1 setlinecap
+
+	pagedimensions
+	xcenter ycenter translate
+	orientation rotation mul rotate
+	width 2 div neg height 2 div translate
+	xoffset inch yoffset inch neg translate
+	margin 2 div dup neg translate
+	magnification dup aspectratio mul scale
+	scaling scaling scale
+
+	addmetrics
+	0 0 moveto
+} def
+
+/pagedimensions {
+	useclippath userdict /gotpagebbox known not and {
+		/pagebbox [clippath pathbbox newpath] def
+		roundpage currentdict /roundpagebbox known and {roundpagebbox} if
+	} if
+	pagebbox aload pop
+	4 -1 roll exch 4 1 roll 4 copy
+	landscape {4 2 roll} if
+	sub /width exch def
+	sub /height exch def
+	add 2 div /xcenter exch def
+	add 2 div /ycenter exch def
+	userdict /gotpagebbox true put
+} def
+
+/addmetrics {
+	/Symbol /S null Sdefs cf
+	/Times-Roman /S1 StandardEncoding dup length array copy S1defs cf
+} def
+
+/pagesetup {
+	/page exch def
+	currentdict /pagedict known currentdict page known and {
+		page load pagedict exch get cvx exec
+	} if
+} def
+
+/decodingdefs [
+	{counttomark 2 idiv {y moveto show} repeat}
+	{neg /y exch def counttomark 2 idiv {y moveto show} repeat}
+	{neg moveto {2 index stringwidth pop sub exch div 0 32 4 -1 roll widthshow} repeat}
+	{neg moveto {spacewidth sub 0.0 32 4 -1 roll widthshow} repeat}
+	{counttomark 2 idiv {y moveto show} repeat}
+	{neg setfunnytext}
+] def
+
+/setdecoding {/t decodingdefs 3 -1 roll get bind def} bind def
+
+/w {neg moveto show} bind def
+/m {neg dup /y exch def moveto} bind def
+/done {/lastpage where {pop lastpage} if} def
+
+/f {
+	dup /font exch def findfont exch
+	dup /ptsize exch def scaling div dup /size exch def scalefont setfont
+	linewidth ptsize mul scaling 10 mul div setlinewidth
+	/spacewidth ( ) stringwidth pop def
+} bind def
+
+/changefont {
+	/fontheight exch def
+	/fontslant exch def
+	currentfont [
+		1 0
+		fontheight ptsize div fontslant sin mul fontslant cos div
+		fontheight ptsize div
+		0 0
+	] makefont setfont
+} bind def
+
+/sf {f} bind def
+
+/cf {
+	dup length 2 idiv
+	/entries exch def
+	/chtab exch def
+	/newencoding exch def
+	/newfont exch def
+
+	findfont dup length 1 add dict
+	/newdict exch def
+	{1 index /FID ne {newdict 3 1 roll put}{pop pop} ifelse} forall
+
+	newencoding type /arraytype eq {newdict /Encoding newencoding put} if
+
+	newdict /Metrics entries dict put
+	newdict /Metrics get
+	begin
+		chtab aload pop
+		1 1 entries {pop def} for
+		newfont newdict definefont pop
+	end
+} bind def
+
+%
+% A few arrays used to adjust reference points and character widths in some
+% of the printer resident fonts. If square roots are too high try changing
+% the lines describing /radical and /radicalex to,
+%
+%	/radical	[0 -75 550 0]
+%	/radicalex	[-50 -75 500 0]
+%
+% Move braceleftbt a bit - default PostScript character is off a bit.
+%
+
+/Sdefs [
+	/bracketlefttp		[201 500]
+	/bracketleftbt		[201 500]
+	/bracketrighttp		[-81 380]
+	/bracketrightbt		[-83 380]
+	/braceleftbt		[203 490]
+	/bracketrightex		[220 -125 500 0]
+	/radical		[0 0 550 0]
+	/radicalex		[-50 0 500 0]
+	/parenleftex		[-20 -170 0 0]
+	/integral		[100 -50 500 0]
+	/infinity		[10 -75 730 0]
+] def
+
+/S1defs [
+	/underscore		[0 80 500 0]
+	/endash			[7 90 650 0]
+] def
diff --git a/postscript/prologues/draw.ps b/postscript/prologues/draw.ps
new file mode 100644
index 0000000..a991c11
--- /dev/null
+++ b/postscript/prologues/draw.ps
@@ -0,0 +1,76 @@
+%
+% Version 3.3.2 drawing procedures for dpost. Automatically pulled in when
+% needed.
+%
+
+/inpath false def
+/savematrix matrix def
+
+/Dl {
+	inpath
+		{neg lineto pop pop}
+		{newpath neg moveto neg lineto stroke}
+	ifelse
+} bind def
+
+/De {
+	/y1 exch 2 div def
+	/x1 exch 2 div def
+	/savematrix savematrix currentmatrix def
+	neg exch x1 add exch translate
+	x1 y1 scale
+	0 0 1 0 360
+	inpath
+		{1 0 moveto arc savematrix setmatrix}
+		{newpath arc savematrix setmatrix stroke}
+	ifelse
+} bind def
+
+/Da {
+	/dy2 exch def
+	/dx2 exch def
+	/dy1 exch def
+	/dx1 exch def
+	dy1 add neg exch dx1 add exch
+	dx1 dx1 mul dy1 dy1 mul add sqrt
+	dy1 dx1 neg atan
+	dy2 neg dx2 atan
+	inpath
+		{arc}
+		{newpath arc stroke}
+	ifelse
+} bind def
+
+/DA {
+	/dy2 exch def
+	/dx2 exch def
+	/dy1 exch def
+	/dx1 exch def
+	dy1 add neg exch dx1 add exch
+	dx1 dx1 mul dy1 dy1 mul add sqrt
+	dy1 dx1 neg atan
+	dy2 neg dx2 atan
+	inpath
+		{arcn}
+		{newpath arcn stroke}
+	ifelse
+} bind def
+
+/Ds {
+	/y2 exch def
+	/x2 exch def
+	/y1 exch def
+	/x1 exch def
+	/y0 exch def
+	/x0 exch def
+	x0 5 x1 mul add 6 div
+	y0 5 y1 mul add -6 div
+	x2 5 x1 mul add 6 div
+	y2 5 y1 mul add -6 div
+	x1 x2 add 2 div
+	y1 y2 add -2 div
+	inpath
+		{curveto}
+		{newpath x0 x1 add 2 div y0 y1 add -2 div moveto curveto stroke}
+	ifelse
+} bind def
diff --git a/postscript/prologues/duplex.ps b/postscript/prologues/duplex.ps
new file mode 100644
index 0000000..99397cb
--- /dev/null
+++ b/postscript/prologues/duplex.ps
@@ -0,0 +1,4 @@
+%!PS-Adobe-3.0
+statusdict /setduplexmode known {
+	statusdict begin true setduplexmode end
+} if
diff --git a/postscript/prologues/fatcourier.ps b/postscript/prologues/fatcourier.ps
new file mode 100644
index 0000000..11d7188
--- /dev/null
+++ b/postscript/prologues/fatcourier.ps
@@ -0,0 +1,26 @@
+%
+% Fat versions of the stroked Courier and Courier-Oblique - from Johnathan Shopiro.
+% Can be selectively pulled in using the -C option that's available with all the
+% PostScript translators or permanently added to any of the prologues. Helps on
+% Linotronic typesetters, where Courier and Courier-Oblique are too light!
+%
+
+/newdict /Courier findfont length 1 add dict def
+/Courier findfont {
+	1 index /FID ne
+		{newdict 3 1 roll put}
+		{pop pop}
+	ifelse
+} forall
+newdict /StrokeWidth 60 put
+/Courier newdict definefont pop
+
+/newdict /Courier-Oblique findfont length 1 add dict def
+/Courier-Oblique findfont {
+	1 index /FID ne
+		{newdict 3 1 roll put}
+		{pop pop}
+	ifelse
+} forall
+newdict /StrokeWidth 60 put
+/Courier-Oblique newdict definefont pop
diff --git a/postscript/prologues/forms.ps b/postscript/prologues/forms.ps
new file mode 100644
index 0000000..a96fcda
--- /dev/null
+++ b/postscript/prologues/forms.ps
@@ -0,0 +1,213 @@
+%
+% Procedures that let you print any number of pages on each sheet of paper. It's
+% far from perfect and won't handle everything (eg. it's not recursive), but should
+% be good enough for now. Assumes the default page coordinate system has been set
+% up before setupforms is called. lastpage makes certain the last page is printed,
+% and should be called immediately after the %%Trailer comment.
+%
+% Three lines of code needed for page image clipping have been commented out for
+% now. It works, but can really slow things down on some versions of PostScript.
+% Uncomment them if you want to clip pages.
+%
+
+/setupforms {
+    /formsperpage exch def
+
+    /currentform 0 def
+    /slop 5 def
+    /min {2 copy gt {exch} if pop} def
+
+%
+% Save the current environment so the real showpage can be restored when we're all
+% done. Occasionally helps when a banner page is included with the job.
+%
+
+    /saveobj save def
+
+%
+% Number of rows and columns we'll need - may exchange them later.
+%
+
+    /columns formsperpage sqrt ceiling cvi def
+    /rows formsperpage columns div ceiling cvi def
+
+%
+% Slop leaves a little room around the edge so page images can be outlined and have
+% the borders show up. Distance is in default coordinates, so we need to figure out
+% how it maps into user coordinates.
+%
+
+    6 array defaultmatrix
+    6 array currentmatrix
+    6 array invertmatrix
+    6 array concatmatrix
+    /tempmatrix exch def
+
+    0 slop tempmatrix dtransform dup mul exch dup mul add sqrt
+    /slop exch def
+
+%
+% Determine how big the image area is, using the clipping path bounding box minus
+% a little and leave the coordinates of the lower left corner of the clipping path
+% on the stack. Also temporarily set the size of each page (ie. formheight and
+% formwidth) from the clipping path - just in case old software uses this stuff.
+% Only works for coordinate systems that have been rotated by a multiple of 90
+% degrees.
+%
+
+    newpath clippath pathbbox
+    2 index sub dup /formheight exch def slop 2 mul sub /pageheight exch def
+    2 index sub dup /formwidth exch def slop 2 mul sub /pagewidth exch def
+
+%
+% New translators all store the size of each page in default coordinates in the
+% pagebbox array and it can be different than the size determined by the clipping
+% path. If we can find pagebbox use it to set the real dimensions of each page.
+% Leaves the coordinates of the lower left corner on the stack, (either from
+% pagebbox or clippath) so four numbers are there when we're done.
+%
+
+    userdict /gotpagebbox known userdict /pagebbox known and {
+	newpath
+	pagebbox 0 get pagebbox 1 get tempmatrix transform moveto
+	pagebbox 0 get pagebbox 3 get tempmatrix transform lineto
+	pagebbox 2 get pagebbox 3 get tempmatrix transform lineto
+	pagebbox 2 get pagebbox 1 get tempmatrix transform lineto
+	closepath pathbbox
+	2 index sub /formheight exch def
+	2 index sub /formwidth exch def
+    } {2 copy} ifelse
+
+%
+% Top two numbers are the displacement from the job's origin to the lower left
+% corner of each page image when we finish setting up the new coordinate system.
+%
+
+    /ycorner exch def
+    /xcorner exch def
+
+%
+% The two numbers left on the stack are the coordinates of the lower left corner
+% of the clipping path. Go there and then up a bit so page images can be outlined.
+%
+
+    translate
+    slop slop translate
+
+%
+% If the page is wider than high we may be able to do better if we exchange rows
+% and columns. Won't make a difference in the current orientation or if rows and
+% columns are the same.
+%
+
+    pagewidth pageheight gt {
+	rows columns /rows exch def /columns exch def
+    } if
+
+%
+% Find the orientation and scaling that makes things as large as possible. More
+% than what's really needed. First calculation essentially finds the minimum of
+% 1/rows and 1/columns.
+%
+
+    pagewidth formwidth columns mul div pageheight formheight rows mul div min
+    pageheight formwidth columns mul div pagewidth formheight rows mul div min
+
+    2 copy lt {
+	rotation 1 eq {
+	    landscape {
+		0 pageheight translate
+		-90 rotate
+	    }{
+		pagewidth 0 translate
+		90 rotate
+	    } ifelse
+	}{
+	    landscape {
+		pagewidth 0 translate
+		90 rotate
+	    }{
+		0 pageheight translate
+		-90 rotate
+	    } ifelse
+	} ifelse
+	pagewidth pageheight /pagewidth exch def /pageheight exch def
+	exch
+    } if
+
+%
+% Second number from the top is the best choice. Scale so everything will fit on
+% the current page, go back to the original origin, and then get ready for the
+% first page - which goes in the upper left corner.
+%
+
+    pop dup dup scale
+    xcorner neg ycorner neg translate
+    0 rows 1 sub formheight mul translate
+
+%
+% Try to center everything on the page - scaling we used is on top of the stack.
+%
+
+    dup pagewidth exch div formwidth columns mul sub 2 div
+    exch pageheight exch div formheight rows mul sub 2 div translate
+
+%
+% Redefine showpage.
+%
+
+    /!PreForms~showpage~ /showpage load def		% save current showpage
+
+    /showpage {
+	saveobj restore
+%	initclip
+	formsperpage 1 gt {
+	    gsave .1 setlinewidth outlineform stroke grestore
+	} if
+	formwidth 0 translate
+	/currentform currentform 1 add def
+	currentform columns mod 0 eq {
+	    columns formwidth mul neg formheight neg translate
+	} if
+	currentform formsperpage mod 0 eq {
+	    gsave !PreForms~showpage~ grestore
+	    currentform columns mod formwidth mul neg
+	    formsperpage columns idiv formheight mul translate
+	    /currentform 0 def
+	} if
+%	outlineform clip newpath
+	/saveobj save def
+    } bind def
+
+    /outlineform {
+	newpath
+	xcorner ycorner moveto
+	formwidth 0 rlineto
+	0 formheight rlineto
+	formwidth neg 0 rlineto
+	closepath
+    } bind def
+
+    /lastpage {
+	formsperpage 1 gt {
+	    currentform 0 ne {
+		/saveobj save def
+		0 1 formsperpage currentform sub formsperpage mod {
+		    pop showpage
+		} for
+		saveobj restore
+	    } if
+	    saveobj restore
+	    saveobj restore
+	} if
+    } def
+
+%
+% Clip the first page image and save the environment we just set up, including
+% the redefined showpage.
+%
+
+%   outlineform clip
+    newpath
+    /saveobj save def
+} def
diff --git a/postscript/prologues/grabit.ps b/postscript/prologues/grabit.ps
new file mode 100644
index 0000000..dab313c
--- /dev/null
+++ b/postscript/prologues/grabit.ps
@@ -0,0 +1,522 @@
+%
+% Dump a PostScript object, occasionally in a form that can be sent back
+% through the interpreter. Similiar to Adobe's == procedure, but output
+% is usually easier to read. No binding so operators like rcheck and exec
+% can be conviently redefined.
+%
+
+/GrabitDict 100 dict dup begin
+
+/recursive true def
+/scratchstring 200 string def
+/slowdown 100 def
+
+/column 0 def
+/lastcolumn 80 def
+/level 0 def
+/multiline 100 array def
+/nextname 0 def
+/arraylength 0 def
+/lengthonly false def
+
+/GrabitSetup {
+	counttomark {OmitNames exch true put} repeat pop
+	0 0 moveto		% for hardcopy output
+} def
+
+/OmitNames 30 dict def		% ignore these names
+/OtherDicts 200 dict def	% unrecognized dictionaries
+
+%
+% All strings returned to the host go through Print. First pass through an
+% array has lengthonly set to true.
+%
+
+/Print {
+	dup type /stringtype ne {scratchstring cvs} if
+	lengthonly {
+		length arraylength add /arraylength exch def
+	}{
+		dup length column add /column exch def
+		print flush
+		slowdown {1 pop} repeat
+	} ifelse
+} def
+
+/Indent {level {(    ) Print} repeat} def
+/Newline {(\n) Print lengthonly not {/column 0 def} if} def
+
+/NextLevel {/level level 1 add def multiline level 0 put} def
+/LastLevel {/level level 1 sub def} def
+
+%
+% Make a unique name for each unrecognized dictionary and remember the name
+% and dictionary in OtherDicts.
+%
+
+/Register {
+	dup type /dicttype eq {
+		/nextname nextname 1 add def
+		dup (UnknownDict   ) dup
+        	(UnknownDict) length nextname (   ) cvs putinterval
+		0 (UnknownDict) length nextname (   ) cvs length add getinterval cvn
+		exch OtherDicts 3 1 roll put
+	} if
+} def
+
+%
+% Replace array or dictionary values by known names. Lookups are in the
+% standard PostScript dictionaries and in OtherDicts. If found replace
+% the value by the name and make it executable so nametype omits the
+% leading /.
+%
+
+/Replace {
+	false
+	1 index type /dicttype eq {pop true} if
+	1 index type /arraytype eq 2 index xcheck not and {pop true} if
+	{
+		false
+		[userdict systemdict statusdict serverdict OtherDicts] {
+			{
+				3 index eq
+					{exch pop exch pop cvx true exit}
+					{pop}
+				ifelse
+			} forall
+			dup {exit} if
+		} forall
+		pop
+	} if
+} def
+
+%
+% Simple type handlers. In some cases (e.g. savetype) what's returned can't
+% be sent back through the interpreter.
+%
+
+/booleantype {{(true )}{(false )} ifelse Print} def
+/marktype {pop (mark ) Print} def
+/nulltype {pop (null ) Print} def
+/integertype {Print ( ) Print} def
+/realtype {Print ( ) Print} def
+/filetype {pop (-file- ) Print} def
+/fonttype {pop (-fontID- ) Print} def
+/savetype {pop (-saveobj- ) Print} def
+
+%
+% Special formatting for operators is enabled if the flag in multiline
+% (for the current level) is set to 1. In that case each operator, after
+% being printed, is looked up in OperatorDict. If found the value is used
+% as an index into the OperatorProcs array and the object at that index
+% is retrieved and executed. Currently only used to choose the operators
+% that end a line.
+%
+
+/operatortype {
+	dup Print ( ) Print
+	multiline level get 1 eq {
+		scratchstring cvs cvn dup OperatorDict exch known {
+			OperatorDict exch get
+			OperatorProcs exch get exec
+		}{
+			pop
+			column lastcolumn gt {Newline Indent} if
+		} ifelse
+	}{pop} ifelse
+} def
+
+%
+% Executable names are passed to operatortype. Non-executable names get a
+% leading /.
+%
+
+/nametype {
+	dup xcheck {
+		operatortype
+	}{
+		(/) Print Print ( ) Print
+	} ifelse
+} def
+
+%
+% Arrays are processed in two passes. The first computes the length of the
+% string returned to the host without any special formatting. If it extends
+% past the last column special formatting is enabled by setting a flag in
+% array multiline. Arrays are processed in a for loop so the last element
+% easily recognized. At that point special fortmatting is disabled.
+%
+
+/packedarraytype {arraytype} def
+
+/arraytype {
+	NextLevel
+	lengthonly not {
+		/lengthonly true def
+		/arraylength 0 def
+		dup dup type exec
+		arraylength 20 gt arraylength column add lastcolumn gt and {
+			multiline level 1 put
+		} if
+		/lengthonly false def
+	} if
+
+	dup rcheck not {
+		(-array- ) Print pop
+	}{
+		dup xcheck {({)}{([)} ifelse Print
+		multiline level get 0 ne {Newline Indent}{( ) Print} ifelse
+		0 1 2 index length 1 sub {
+			2 copy exch length 1 sub eq multiline level get 1 eq and {
+				multiline level 2 put
+			} if
+			2 copy get exch pop
+			dup type /dicttype eq {
+				Replace
+				dup type /dicttype eq {
+					dup Register Replace
+					recursive {
+						2 copy cvlit
+						/def load 3 1 roll
+						count 3 roll
+					} if
+					exch pop
+				} if
+			} if
+			dup type exec
+			dup xcheck not multiline level get 1 eq and {
+				0 index type /arraytype eq
+				1 index type /packedarray eq or
+				1 index type /stringtype eq or {Newline Indent} if
+			} if
+		} for
+		multiline level get 0 ne {Newline LastLevel Indent NextLevel} if
+		xcheck {(} )}{(] )} ifelse Print
+	} ifelse
+	LastLevel
+} def
+
+%
+% Dictionary handler. Try to replace the value by a name before processing
+% the dictionary.
+%
+
+/dicttype {
+	dup
+	rcheck not {
+		(-dictionary- ) Print pop
+	}{
+		dup maxlength Print ( dict dup begin) Print Newline
+		NextLevel
+		{
+			1 index OmitNames exch known {
+				pop pop
+			}{
+				Indent
+				Replace		% arrays and dicts by known names
+				Register	% new dictionaries in OtherDicts
+				exch
+				cvlit dup type exec	% key first - force a /
+				dup type exec		% then the value
+				(def) Print Newline
+			} ifelse
+		} forall
+		LastLevel
+		Indent
+		(end ) Print
+	} ifelse
+} def
+
+%
+% Strings containing characters not in AsciiDict are returned in hex. All
+% others are ASCII strings and use AsciiDict for character mapping.
+%
+
+/onecharstring ( ) def
+/twocharstring (  ) def
+
+/stringtype {
+	dup
+	rcheck not {
+		(-string- ) Print
+	}{
+		/hexit false def
+		dup {
+			onecharstring 0 3 -1 roll put
+			AsciiDict onecharstring cvn known not {
+				/hexit true def exit
+			} if
+		} forall
+
+		hexit {(<)}{(\()} ifelse Print
+		0 1 2 index length 1 sub {
+			2 copy 1 getinterval exch pop
+			hexit {
+				0 get /n exch def
+				n -4 bitshift 16#F and 16 twocharstring cvrs pop
+				n 16#F and twocharstring 1 1 getinterval 16 exch cvrs pop
+				twocharstring
+			}{cvn AsciiDict exch get} ifelse
+			Print
+			column lastcolumn gt {
+				hexit not {(\\) Print} if
+				Newline
+			} if
+		} for
+		hexit {(> )}{(\) )} ifelse Print
+	} ifelse
+	pop
+} def
+
+%
+% ASCII characters and replacement strings. Ensures the returned string will
+% reproduce the original when passed through the scanner. Strings containing
+% characters not in this list should be returned as hex strings.
+%
+
+/AsciiDict 128 dict dup begin
+	(\n) cvn (\\n) def
+	(\r) cvn (\\r) def
+	(\t) cvn (\\t) def
+	(\b) cvn (\\b) def
+	(\f) cvn (\\f) def
+	( ) cvn ( ) def
+	(!) cvn (!) def
+	(") cvn (") def
+	(#) cvn (#) def
+	($) cvn ($) def
+	(%) cvn (\\%) def
+	(&) cvn (&) def
+	(') cvn (') def
+	(\() cvn (\\\() def
+	(\)) cvn (\\\)) def
+	(*) cvn (*) def
+	(+) cvn (+) def
+	(,) cvn (,) def
+	(-) cvn (-) def
+	(.) cvn (.) def
+	(/) cvn (/) def
+	(0) cvn (0) def
+	(1) cvn (1) def
+	(2) cvn (2) def
+	(3) cvn (3) def
+	(4) cvn (4) def
+	(5) cvn (5) def
+	(6) cvn (6) def
+	(7) cvn (7) def
+	(8) cvn (8) def
+	(9) cvn (9) def
+	(:) cvn (:) def
+	(;) cvn (;) def
+	(<) cvn (<) def
+	(=) cvn (=) def
+	(>) cvn (>) def
+	(?) cvn (?) def
+	(@) cvn (@) def
+	(A) cvn (A) def
+	(B) cvn (B) def
+	(C) cvn (C) def
+	(D) cvn (D) def
+	(E) cvn (E) def
+	(F) cvn (F) def
+	(G) cvn (G) def
+	(H) cvn (H) def
+	(I) cvn (I) def
+	(J) cvn (J) def
+	(K) cvn (K) def
+	(L) cvn (L) def
+	(M) cvn (M) def
+	(N) cvn (N) def
+	(O) cvn (O) def
+	(P) cvn (P) def
+	(Q) cvn (Q) def
+	(R) cvn (R) def
+	(S) cvn (S) def
+	(T) cvn (T) def
+	(U) cvn (U) def
+	(V) cvn (V) def
+	(W) cvn (W) def
+	(X) cvn (X) def
+	(Y) cvn (Y) def
+	(Z) cvn (Z) def
+	([) cvn ([) def
+	(\\) cvn (\\\\) def
+	(]) cvn (]) def
+	(^) cvn (^) def
+	(_) cvn (_) def
+	(`) cvn (`) def
+	(a) cvn (a) def
+	(b) cvn (b) def
+	(c) cvn (c) def
+	(d) cvn (d) def
+	(e) cvn (e) def
+	(f) cvn (f) def
+	(g) cvn (g) def
+	(h) cvn (h) def
+	(i) cvn (i) def
+	(j) cvn (j) def
+	(k) cvn (k) def
+	(l) cvn (l) def
+	(m) cvn (m) def
+	(n) cvn (n) def
+	(o) cvn (o) def
+	(p) cvn (p) def
+	(q) cvn (q) def
+	(r) cvn (r) def
+	(s) cvn (s) def
+	(t) cvn (t) def
+	(u) cvn (u) def
+	(v) cvn (v) def
+	(w) cvn (w) def
+	(x) cvn (x) def
+	(y) cvn (y) def
+	(z) cvn (z) def
+	({) cvn ({) def
+	(|) cvn (|) def
+	(}) cvn (}) def
+	(~) cvn (~) def
+end def
+
+%
+% OperatorDict can help format procedure listings. The value assigned to each
+% name is used as an index into the OperatorProcs array. The procedure at that
+% index is fetched and executed after the named operator is printed. What's in
+% OperatorDict is a matter of taste rather than correctness. The default list
+% represents our choice of which of Adobe's operators should end a line.
+%
+
+/OperatorProcs [{} {Newline Indent}] def
+
+/OperatorDict 250 dict def
+
+OperatorDict	/arc			1 put
+OperatorDict	/arcn			1 put
+OperatorDict	/ashow			1 put
+OperatorDict	/awidthshow		1 put
+OperatorDict	/banddevice		1 put
+OperatorDict	/begin			1 put
+OperatorDict	/charpath		1 put
+OperatorDict	/clear			1 put
+OperatorDict	/cleardictstack		1 put
+OperatorDict	/cleartomark		1 put
+OperatorDict	/clip			1 put
+OperatorDict	/clippath		1 put
+OperatorDict	/closefile		1 put
+OperatorDict	/closepath		1 put
+OperatorDict	/concat			1 put
+OperatorDict	/copypage		1 put
+OperatorDict	/curveto		1 put
+OperatorDict	/def			1 put
+OperatorDict	/end			1 put
+OperatorDict	/eoclip			1 put
+OperatorDict	/eofill			1 put
+OperatorDict	/erasepage		1 put
+OperatorDict	/exec			1 put
+OperatorDict	/exit			1 put
+OperatorDict	/fill			1 put
+OperatorDict	/flattenpath		1 put
+OperatorDict	/flush			1 put
+OperatorDict	/flushfile		1 put
+OperatorDict	/for			1 put
+OperatorDict	/forall			1 put
+OperatorDict	/framedevice		1 put
+OperatorDict	/grestore		1 put
+OperatorDict	/grestoreall		1 put
+OperatorDict	/gsave			1 put
+OperatorDict	/handleerror		1 put
+OperatorDict	/if			1 put
+OperatorDict	/ifelse			1 put
+OperatorDict	/image			1 put
+OperatorDict	/imagemask		1 put
+OperatorDict	/initclip		1 put
+OperatorDict	/initgraphics		1 put
+OperatorDict	/initmatrix		1 put
+OperatorDict	/kshow			1 put
+OperatorDict	/lineto			1 put
+OperatorDict	/loop			1 put
+OperatorDict	/moveto			1 put
+OperatorDict	/newpath		1 put
+OperatorDict	/nulldevice		1 put
+OperatorDict	/pathforall		1 put
+OperatorDict	/print			1 put
+OperatorDict	/prompt			1 put
+OperatorDict	/put			1 put
+OperatorDict	/putinterval		1 put
+OperatorDict	/quit			1 put
+OperatorDict	/rcurveto		1 put
+OperatorDict	/renderbands		1 put
+OperatorDict	/repeat			1 put
+OperatorDict	/resetfile		1 put
+OperatorDict	/restore		1 put
+OperatorDict	/reversepath		1 put
+OperatorDict	/rlineto		1 put
+OperatorDict	/rmoveto		1 put
+OperatorDict	/rotate			1 put
+OperatorDict	/run			1 put
+OperatorDict	/scale			1 put
+OperatorDict	/setcachedevice		1 put
+OperatorDict	/setcachelimit		1 put
+OperatorDict	/setcacheparams		1 put
+OperatorDict	/setcharwidth		1 put
+OperatorDict	/setdash		1 put
+OperatorDict	/setdefaulttimeouts	1 put
+OperatorDict	/setdostartpage		1 put
+OperatorDict	/seteescratch		1 put
+OperatorDict	/setflat		1 put
+OperatorDict	/setfont		1 put
+OperatorDict	/setgray		1 put
+OperatorDict	/sethsbcolor		1 put
+OperatorDict	/setidlefonts		1 put
+OperatorDict	/setjobtimeout		1 put
+OperatorDict	/setlinecap		1 put
+OperatorDict	/setlinejoin		1 put
+OperatorDict	/setlinewidth		1 put
+OperatorDict	/setmargins		1 put
+OperatorDict	/setmatrix		1 put
+OperatorDict	/setmiterlimit		1 put
+OperatorDict	/setpacking		1 put
+OperatorDict	/setpagetype		1 put
+OperatorDict	/setprintname		1 put
+OperatorDict	/setrgbcolor		1 put
+OperatorDict	/setsccbatch		1 put
+OperatorDict	/setsccinteractive	1 put
+OperatorDict	/setscreen		1 put
+OperatorDict	/settransfer		1 put
+OperatorDict	/show			1 put
+OperatorDict	/showpage		1 put
+OperatorDict	/start			1 put
+OperatorDict	/stop			1 put
+OperatorDict	/store			1 put
+OperatorDict	/stroke			1 put
+OperatorDict	/strokepath		1 put
+OperatorDict	/translate		1 put
+OperatorDict	/widthshow		1 put
+OperatorDict	/write			1 put
+OperatorDict	/writehexstring		1 put
+OperatorDict	/writestring		1 put
+
+end def
+
+%
+% Put an object on the stack and call Grabit. Output continues until stack
+% is empty. For example,
+%
+%		/letter load Grabit
+%
+% prints a listing of the letter procedure.
+%
+
+/Grabit {
+	/saveobj save def
+	GrabitDict begin
+		{
+			count 0 eq {exit} if
+			count {dup type exec} repeat
+			(\n) print flush
+		} loop
+	end
+	currentpoint			% for hardcopy output
+	saveobj restore
+	moveto
+} def
+
diff --git a/postscript/prologues/hardcopy.ps b/postscript/prologues/hardcopy.ps
new file mode 100644
index 0000000..65eb24d
--- /dev/null
+++ b/postscript/prologues/hardcopy.ps
@@ -0,0 +1,196 @@
+%
+% Redefiniton of the PostScript file output operators so results go to paper.
+% Complicated and slow, but the implementation doesn't place many demands on
+% included PostScript. About all that's required is gentle treatment of the
+% graphics state between write calls.
+%
+
+/#copies 1 store
+/aspectratio 1 def
+/font /Courier def
+/formsperpage 1 def
+/landscape false def
+/magnification 1 def
+/orientation 0 def
+/pointsize 10 def
+/rotation 1 def
+/xoffset .1 def
+/yoffset .1 def
+
+/roundpage true def
+/useclippath true def
+/pagebbox [0 0 612 792] def
+
+/inch {72 mul} def
+/min {2 copy gt {exch} if pop} def
+
+/HardcopySetup {
+	landscape {/orientation 90 orientation add def} if
+	font findfont 1 1.1 div scalefont setfont
+
+	pagedimensions
+	xcenter ycenter translate
+	orientation rotation mul rotate
+	width 2 div neg height 2 div translate
+	xoffset inch yoffset inch neg translate
+	pointsize 1.1 mul dup scale
+	magnification dup aspectratio mul scale
+	height width div 1 min dup scale
+	0 -1 translate
+	0 0 moveto
+} def
+
+/pagedimensions {
+	useclippath {
+		/pagebbox [clippath pathbbox newpath] def
+		roundpage currentdict /roundpagebbox known and {roundpagebbox} if
+	} if
+	pagebbox aload pop
+	4 -1 roll exch 4 1 roll 4 copy
+	landscape {4 2 roll} if
+	sub /width exch def
+	sub /height exch def
+	add 2 div /xcenter exch def
+	add 2 div /ycenter exch def
+} def
+
+%
+% Unbind the operators in an executable array or packedarray. Leaves the
+% unbound array or the original object on the stack.
+%
+
+/Unbind {
+	0 index xcheck
+	1 index type /arraytype eq
+	2 index type /packedarraytype eq or and {
+		dup length array copy cvx
+		dup 0 exch {
+			dup type /operatortype eq {
+				(                          ) cvs cvn cvx
+			} if
+
+			dup type /dicttype eq {
+				dup maxlength dict exch {
+					Unbind
+					3 copy put pop pop
+				} forall
+			} if
+
+			0 index xcheck
+			1 index type /arraytype eq
+			2 index type /packedarraytype eq or and {
+				Unbind
+			} if
+
+			3 copy put pop
+			1 add
+		} forall
+		pop
+	} if
+} def
+
+%
+% New write operator - don't bind the definition! Expands tabs and backspaces,
+% wraps long lines, and starts a new page whenever necessary. The code that
+% handles newlines assumes lines are separated by one vertical unit.
+%
+
+/write {
+	true exch
+
+      %%case '\b':
+	dup 8#10 eq {
+		( ) stringwidth pop neg 0 rmoveto
+		currentpoint pop 0 lt {
+			currentpoint exch pop 0 exch moveto
+		} if
+		exch pop false exch
+	} if
+
+      %%case '\t':
+	dup 8#11 eq {
+		currentpoint pop ( ) stringwidth pop div round cvi
+		8 mod 8 exch sub {
+			2 index 8#40 write
+		} repeat
+		exch pop false exch
+	} if
+
+      %%case '\n':
+	dup 8#12 eq {
+		currentpoint 0 exch 1 sub moveto pop
+
+		gsave clippath pathbbox pop pop exch pop grestore
+		currentpoint exch pop 1 sub ge {
+			2 index 8#14 write
+		} if
+		exch pop false exch
+	} if
+
+      %%case '\f':
+	dup 8#14 eq {
+		gsave showpage grestore
+		0 0 moveto
+		exch pop false exch
+	} if
+
+      %%case '\r':
+	dup 8#15 eq {
+		currentpoint 0 exch moveto pop
+		exch pop false exch
+	} if
+
+      %%case EOF:
+	dup -1 eq {
+		currentpoint 0 ne exch 0 ne or {
+			2 index 8#14 write
+		} if
+		exch pop false exch
+	} if
+
+      %%default:
+	exch {
+		dup
+		gsave clippath pathbbox pop 3 1 roll pop pop grestore 
+		( ) stringwidth pop currentpoint pop add le {
+			2 index 8#12 write
+		} if
+		( ) dup 0 4 -1 roll put show
+	} if
+
+	pop		% the character
+	pop		% and file object
+} def
+
+%
+% All the other file output operators call our redefined write operator.
+%
+
+/print {
+	(%stdout) (w) file exch {1 index exch write} forall
+	pop
+} def
+
+/writestring {
+	{1 index exch write} forall
+	pop
+} def
+
+/writehexstring {
+	(0123456789ABCDEF) 3 1 roll {
+		dup
+		3 index exch -4 bitshift 16#F and get 2 index exch write
+		2 index exch 16#F and get 1 index exch write
+	} forall
+	pop pop
+} def
+
+%
+% Unbind and redefine the remaining file output procedures.
+%
+
+/= dup load Unbind def
+/== dup load Unbind def
+/stack dup load Unbind def
+/pstack dup load Unbind def
+
diff --git a/postscript/prologues/hp4simx.ps b/postscript/prologues/hp4simx.ps
new file mode 100644
index 0000000..6275509
--- /dev/null
+++ b/postscript/prologues/hp4simx.ps
@@ -0,0 +1,5 @@
+%!PS-Adobe-3.0
+serverdict begin 0 exitserver
+statusdict begin
+	1 setdefaultpapertray
+end
diff --git a/postscript/prologues/patch.err.ps b/postscript/prologues/patch.err.ps
new file mode 100644
index 0000000..f9f2fab
--- /dev/null
+++ b/postscript/prologues/patch.err.ps
@@ -0,0 +1,67 @@
+%!PS-Adobe
+% lib/ehandler.ps -- Downloaded Error Break-page handler
+% Copyright (c) 1984, 1985, 1986 Adobe Systems Incorporated. 
+% All Rights Reserved.
+
+0000 % serverloop password
+/$brkpage where
+{pop pop(Error Handler in place - not loaded again\n)print flush stop}
+{dup serverdict begin statusdict begin checkpassword
+ {(Error Handler downloaded.\n)print flush exitserver}
+ {pop(Bad Password on loading error handler!!!\n)print flush stop}ifelse
+}ifelse
+/$brkpage 64 dict def $brkpage begin
+/prnt
+ {dup type/stringtype ne{=string cvs}if dup length 6 mul/tx exch def/ty 10 def
+  currentpoint/toy exch def/tox exch def 1 setgray newpath
+  tox toy 2 sub moveto 0 ty rlineto tx 0 rlineto 0 ty neg rlineto
+  closepath fill tox toy moveto 0 setgray show}bind def
+/nl{currentpoint exch pop lmargin exch moveto 0 -10 rmoveto}def
+/=={/cp 0 def typeprint nl}def
+/typeprint{dup type dup currentdict exch known
+  {exec}{unknowntype}ifelse}readonly def
+/lmargin 72 def/rmargin 72 def
+/tprint{dup length cp add rmargin gt{nl/cp 0 def}if
+  dup length cp add/cp exch def prnt}readonly def
+/cvsprint{=string cvs tprint( )tprint}readonly def
+/unknowntype{exch pop cvlit(??)tprint cvsprint}readonly def
+/integertype{cvsprint}readonly def
+/realtype{cvsprint}readonly def
+/booleantype{cvsprint}readonly def
+/operatortype{(//)tprint cvsprint}readonly def
+/marktype{pop(-mark- )tprint}readonly def
+/dicttype{pop(-dictionary- )tprint}readonly def
+/nulltype{pop(-null- )tprint}readonly def
+/filetype{pop(-filestream- )tprint}readonly def
+/savetype{pop(-savelevel- )tprint}readonly def
+/fonttype{pop(-fontid- )tprint}readonly def
+/nametype{dup xcheck not{(/)tprint}if cvsprint}readonly def
+/stringtype
+ {dup rcheck{(\()tprint tprint(\))tprint}{pop(-string- )tprint}ifelse
+ }readonly def
+/arraytype
+ {dup rcheck{dup xcheck
+  {({)tprint{typeprint}forall(})tprint}
+  {([)tprint{typeprint}forall(])tprint}ifelse}{pop(-array- )tprint}ifelse
+ }readonly def
+/packedarraytype
+ {dup rcheck{dup xcheck
+  {({)tprint{typeprint}forall(})tprint}
+  {([)tprint{typeprint}forall(])tprint}ifelse}{pop(-packedarray- )tprint}ifelse
+ }readonly def
+/courier/Courier findfont 10 scalefont def
+/OLDhandleerror errordict /handleerror get def
+end %$brkpage
+errordict/handleerror
+ {<< /PageSize [612 792] /ImagingBBox null >> setpagedevice
+   systemdict begin $error begin $brkpage begin newerror
+   {/newerror false store 
+    vmstatus pop pop 0 ne{grestoreall}if initgraphics courier setfont
+    lmargin 720 moveto(ERROR: )prnt errorname prnt
+    nl(OFFENDING COMMAND: )prnt/command load prnt
+    $error/ostack 
+    known{nl nl(STACK:)prnt nl nl $error/ostack get aload length{==}repeat}if
+    systemdict/showpage get exec
+    /newerror true store/OLDhandleerror load end end end exec}{end end end}
+  ifelse}
+dup 0 systemdict put dup 4 $brkpage put bind readonly put
diff --git a/postscript/prologues/patch.xon.ps b/postscript/prologues/patch.xon.ps
new file mode 100644
index 0000000..cc9fde1
--- /dev/null
+++ b/postscript/prologues/patch.xon.ps
@@ -0,0 +1,41 @@
+%! 
+0000000000			% the exitserver password
+
+version (23.0) ne
+   {(Patch not installed -- wrong printer type or version) = stop} if
+statusdict /Patch1Installed known
+   {(Patch already installed -- not installed again) = stop} if
+serverdict begin exitserver
+statusdict /Patch1Installed true put
+currentfile eexec
+ce1b9f428ac69e75cc47a554265ae625851e0154ac649ad44c1c34e4c60a0493
+a80212a3bd61248f8859cb1252a7320775a6d4ec524bcbf5771aceb8f61ea2fb
+48fcb3df8da0f105be40f697239ef0976f92c1d41e915a7389200a3e896cd955
+d197ff27f22a617c85bce7ed59ef1a6062d01d0fdee5b4e7d298997638497cc6
+a2d56a0eacc195795949f515bbbda9cfe899e43ad257da93f3144797b00dbb81
+8a41b4fa56a0295c25e693864084cbb5d63834f1d94a46816d4a2cbe005cc57c
+38491a6a34cfbdef303ed8731dbbe84dc6f8e1e790f3d89360d063639c8411fd
+89ad7c53d1b9732bd0942bc36257208d24792ea7c66790b6104c3a2b794a1460
+c476ffdb5552f428f457b47319cccb0c9980036402eaca80c0b5e0ccb5f579df
+09cc6f382b536aa64da7152356c377a5b708a378e855a7ec3eccd848d5508dbf
+5c7bd28c2899e9cfd7f4ff3d7ddc08006cce42b2d8c59ef64af8ec74a2f9d23f
+e8d4d03ba1e2686138fffc2af9c662c994ec8065a32144ba9ac5002623b39012
+521eb49cd829c3506af2895bf275367eb4d31908b14f3b1e0abfaca2f98eb9d8
+8d84ac8271ef44def53d8207ce9653d598fe8046120f223bfca0b5c74a54f70b
+eb5a0bc09d8e79742048b875864a3b489eb91c09b701f506e994271a6640f78a
+d131f1eef3c96e546f7273fb3533799a6470be2ed3b8f2e211bf9f9f209edbd2
+36c19d4b0b3f28ab16c39faa17070699543c212c76081961c949ebd32ada3c93
+ccdc56c2c940a2061bc11794a0159cc37255aa8c8e7e08d78f204161f1eccb7d
+ad3313b737e921b7df1fe794e9a7fc2226702ee555ceb8e803a20ebeaa440a40
+9e1f1a72412586e3071292b10e938e7f386b8e6516758633bab57223e071b1de
+8c4b73cafababc0af7bc902e8763a2817861591d7ee98f85bc28ad0ea4d13660
+d3256aa293df1959b7b57b13edee653cfdda2fafe0698898dc5e371ca4c5b72b
+b92750d0eea5e74955712b06958663f424a46cf75a797590f0d2a36842fe07e3
+db459215dab6e461a4c3fbb40ee2499af3fe4b13790de87e11afde6aadd12e77
+d84d8076146d797269c9188d8fb725898aee284e62c472e0e7b585ef3fed434c
+000b0bb70ad6806e840cfe872ec3f28782dd08b70d29c2da2187e2dc0f13dfc0
+89f75344e3dad78a1c9b909fc72bdd92421afdc8b80850ff0d43605edfd9be56
+d81cb17250ce7208354548f6ccc62366e8196d4adeb2d24fd5ce47bb6295fa72
+c361197cafacbd51efd36dfa59c6f8e6cab8915a8043d609eb64726de86080d2
+4118cc69e01eab0f4ef1f364c815f306d5f43420cf7c9316e5ee69c7183dd8d2
+805a9dfe6abb33c46d3a212d5c6b6fd68418eef971
diff --git a/postscript/prologues/pjw.char.ps b/postscript/prologues/pjw.char.ps
new file mode 100644
index 0000000..5530861
--- /dev/null
+++ b/postscript/prologues/pjw.char.ps
@@ -0,0 +1,142 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: 1 -1 199 258
+%%Creator: MetaPost
+%%CreationDate: 1994.06.28:1046
+/pjw1 {
+37 211 moveto
+37 206 lineto
+41 206 lineto
+43 212 lineto
+44 212 46 212 46 210 curveto
+41 198 35 186 35 174 curveto
+50 174 66 175 81 173 curveto
+81 171 lineto
+61 171 lineto
+61 170 lineto
+86 170 lineto
+88 168 89 166 90 164 curveto
+101 164 111 169 122 172 curveto
+139 172 lineto
+125 194 115 219 93 233 curveto
+87 234 80 236 74 235 curveto
+64 229 54 224 46 217 curveto
+45 217 44 217 44 218 curveto
+61 242 lineto
+67 248 72 258 82 258 curveto
+94 257 107 256 119 254 curveto
+134 247 147 239 161 231 curveto
+180 231 lineto
+180 226 174 228 171 226 curveto
+178 220 185 214 192 207 curveto
+189 207 187 207 187 205 curveto
+190 205 193 204 196 203 curveto
+198 193 202 181 193 181 curveto
+193 177 198 175 198 171 curveto
+196 171 194 171 194 169 curveto
+195 165 196 161 198 157 curveto
+194 147 193 135 184 130 curveto
+180 130 lineto
+169 107 lineto
+171 103 176 104 180 104 curveto
+180 93 176 81 166 76 curveto
+162 76 157 77 155 80 curveto
+153 80 152 80 151 80 curveto
+151 71 lineto
+155 71 lineto
+155 68 153 65 152 63 curveto
+145 62 lineto
+141 47 144 31 144 15 curveto
+141 0 lineto
+124 0 107 -1 90 1 curveto
+72 36 lineto
+86 48 105 49 122 54 curveto
+122 54 lineto
+110 61 97 65 84 69 curveto
+81 71 78 73 78 76 curveto
+86 77 93 77 101 77 curveto
+106 79 113 79 113 84 curveto
+95 86 77 87 59 89 curveto
+59 92 61 95 64 95 curveto
+69 88 80 92 89 92 curveto
+95 92 104 90 104 96 curveto
+93 97 lineto
+87 103 82 109 77 115 curveto
+89 116 101 117 113 118 curveto
+99 154 lineto
+90 154 87 144 82 138 curveto
+77 132 73 124 66 120 curveto
+63 120 59 119 59 122 curveto
+62 123 66 123 66 126 curveto
+58 126 50 127 42 128 curveto
+34 137 lineto
+34 140 34 144 31 144 curveto
+30 135 31 125 31 116 curveto
+25 116 22 122 19 127 curveto
+16 131 15 136 12 139 curveto
+5 139 15 127 9 127 curveto
+3 133 3 142 1 150 curveto
+1 158 6 166 9 173 curveto
+18 186 25 199 35 211 curveto
+closepath
+} bind def
+
+/pjw2 {
+27 112 moveto
+40 75 lineto
+40 74 38 73 37 73 curveto
+25 87 lineto
+17 112 lineto
+closepath 
+43 154 moveto
+43 167 lineto
+41 167 38 167 39 169 curveto
+57 171 lineto
+74 167 lineto
+74 166 73 165 72 165 curveto
+64 164 56 162 49 158 curveto
+48 154 45 149 49 149 curveto
+51 151 53 152 55 154 curveto
+87 153 lineto
+87 144 80 136 74 129 curveto
+64 128 53 126 43 129 curveto
+37 135 lineto
+37 138 36 141 36 145 curveto
+40 145 lineto
+41 148 42 151 43 154 curveto closepath 
+108 145 moveto
+119 145 130 143 141 140 curveto
+146 134 155 129 149 126 curveto
+138 124 126 123 116 129 curveto
+113 134 108 139 108 145 curveto
+closepath 
+114 96 moveto
+116 103 118 110 121 117 curveto
+128 117 134 112 139 107 curveto
+139 101 137 96 132 93 curveto
+closepath 
+134 162 moveto
+115 162 lineto
+115 162 115 163 115 164 curveto
+134 164 lineto
+closepath 
+117 73 moveto
+115 78 121 81 125 85 curveto
+129 85 lineto
+130 83 131 81 131 79 curveto
+128 74 lineto
+124 74 121 73 117 73 curveto closepath 
+141 119 moveto
+134 119 126 117 126 123 curveto
+131 123 136 122 141 121 curveto
+closepath
+} bind def
+
+/pw {
+%% pop
+gsave
+pointsize .0022 mul dup scale
+currentpoint translate
+ pjw1 pjw2 eofill
+grestore
+6 0 rmoveto
+} bind def
diff --git a/postscript/prologues/postdmd.ps b/postscript/prologues/postdmd.ps
new file mode 100644
index 0000000..fa312af
--- /dev/null
+++ b/postscript/prologues/postdmd.ps
@@ -0,0 +1,124 @@
+%
+% Version 3.3.2 prologue for DMD bitmap files.
+%
+
+/#copies 1 store
+/aspectratio 1 def
+/formsperpage 1 def
+/landscape false def
+/magnification 1 def
+/margin 0 def
+/orientation 0 def
+/rotation 1 def
+/screenres 100 def
+/xoffset 0 def
+/yoffset 0 def
+
+/useclippath true def
+/pagebbox [0 0 612 792] def
+
+/inch {72 mul} bind def
+/min {2 copy gt {exch} if pop} bind def
+
+/setup {
+	counttomark 2 idiv {def} repeat pop
+
+	landscape {/orientation 90 orientation add def} if
+
+	pagedimensions
+	xcenter ycenter translate
+	orientation rotation mul rotate
+	xoffset inch yoffset inch translate
+	magnification dup aspectratio mul scale
+
+	/height height margin sub def
+	/width width margin sub def
+} def
+
+/pagedimensions {
+	useclippath {
+		/pagebbox [clippath pathbbox newpath] def
+	} if
+	pagebbox aload pop
+	4 -1 roll exch 4 1 roll 4 copy
+	landscape {4 2 roll} if
+	sub /width exch def
+	sub /height exch def
+	add 2 div /xcenter exch def
+	add 2 div /ycenter exch def
+	userdict /gotpagebbox true put
+} def
+
+/pagesetup {/page exch def} bind def
+
+/bitmap {
+	/scanlines exch def
+	/scanlength exch def
+	/flip exch def
+	/v8format exch def
+
+	/bytelength scanlength 8 idiv def
+	/picstr bytelength string def
+	/lpicstr bytelength string def
+	/bytelength bytelength 1 sub def
+
+	gsave
+
+% First the overall scaling.
+
+	height scanlines div width scanlength div min
+	72 screenres div min
+	dup scale
+
+% Followed by the one for the unit square.
+
+	scanlength neg 2 div scanlines neg 2 div translate
+	scanlength scanlines scale
+	v8format {getv8bitmap} {getbitmap} ifelse
+	grestore
+} bind def
+
+/getbitmap {
+	scanlength scanlines flip [scanlength 0 0 scanlines neg 0 scanlines] {
+		0 {
+			currentfile token pop dup
+			0 eq {pop pop exit} if
+			/charcount exch def
+			picstr 1 index charcount getinterval
+			/repl exch def
+			currentfile repl readhexstring pop pop
+			charcount add
+			currentfile token pop {
+				picstr 1 index repl putinterval
+				charcount add
+			} repeat
+		} loop
+		picstr
+	} imagemask
+} bind def
+
+/getv8bitmap {
+	scanlength scanlines flip not [scanlength 0 0 scanlines neg 0 scanlines] {
+		0 {
+			currentfile token pop dup
+			0 eq {pop pop exit} if
+			/charcount exch def
+			picstr 1 index charcount getinterval
+			/repl exch def
+			currentfile repl readhexstring pop pop
+			charcount add
+			currentfile token pop {
+				picstr 1 index repl putinterval
+				charcount add
+			} repeat
+		} loop
+		0 0 picstr {
+			exch lpicstr exch get xor
+			lpicstr exch 2 index exch put
+			1 add dup
+		} forall
+		pop pop lpicstr
+	} imagemask
+} bind def
+
+/done {/lastpage where {pop lastpage} if} def
diff --git a/postscript/prologues/postgif.ps b/postscript/prologues/postgif.ps
new file mode 100644
index 0000000..9827857
--- /dev/null
+++ b/postscript/prologues/postgif.ps
@@ -0,0 +1,104 @@
+%
+% Version 3.3.2 prologue for GIF pixmap files.
+%
+
+/#copies 1 store
+/aspectratio 1 def
+/formsperpage 1 def
+/landscape false def
+/magnification 1 def
+/margin 0 def
+/orientation 0 def
+/rotation 1 def
+/xoffset 0 def
+/yoffset 0 def
+
+/useclippath true def
+/pagebbox [0 0 612 792] def
+
+/inch {72 mul} bind def
+/min {2 copy gt {exch} if pop} bind def
+
+/setup {
+	counttomark 2 idiv {def} repeat pop
+
+	landscape {/orientation 90 orientation add def} if
+
+	pagedimensions
+	xcenter ycenter translate
+	orientation rotation mul rotate
+	xoffset inch yoffset inch translate
+	magnification dup aspectratio mul scale
+
+	/height height margin sub def
+	/width width margin sub def
+} def
+
+/pagedimensions {
+	useclippath {
+		/pagebbox [clippath pathbbox newpath] def
+	} if
+	pagebbox aload pop
+	4 -1 roll exch 4 1 roll 4 copy
+	landscape {4 2 roll} if
+	sub /width exch def
+	sub /height exch def
+	add 2 div /xcenter exch def
+	add 2 div /ycenter exch def
+	userdict /gotpagebbox true put
+} def
+
+/pagesetup {/page exch def} bind def
+
+/done {/lastpage where {pop lastpage} if} def
+
+/alignment false def
+
+/gifscreen { % scrwidth scrheight $
+    2 copy
+
+    alignment {
+    	100 dup dtransform exch 100 exch div abs exch 100 exch div abs
+	2 copy scale
+	/height exch height exch div def
+	/width exch width exch div def
+    } if
+
+    height exch div exch width exch div
+    2 copy lt { pop } { exch pop } ifelse
+
+    alignment { cvi } if
+
+    dup scale
+
+    neg 2 div exch neg 2 div exch translate
+} def
+
+/gifimage { % gray imagewidth imageheight xorigin yorigin $
+    translate
+    2 copy scale
+    /imageheight exch def
+    /imagewidth exch def
+    /gray exch def
+    imagewidth imageheight 8 [imagewidth 0 0 imageheight neg 0 imageheight]
+    gray {
+	{ currentfile codestr readhexstring pop } image
+    } {
+	/colorimage where {
+	    pop
+	    /picstr imagewidth 3 mul string def
+	    { currentfile codestr readhexstring pop pop
+	    	0 1 imagewidth 1 sub {
+		    picstr exch dup 3 mul exch colortbl exch codestr exch get
+		    3 mul 3 getinterval putinterval
+	    	} for picstr
+	    } false 3 colorimage
+	} {
+	    { currentfile codestr readhexstring pop pop
+	    	0 1 imagewidth 1 sub {
+		    codestr exch dup graytbl exch codestr exch get get put
+	    	} for codestr
+	    } image
+	} ifelse
+    } ifelse
+} def
diff --git a/postscript/prologues/postp9bit.ps b/postscript/prologues/postp9bit.ps
new file mode 100644
index 0000000..ee64633
--- /dev/null
+++ b/postscript/prologues/postp9bit.ps
@@ -0,0 +1,86 @@
+%
+% Version 3.3 prologue for plan9 bitmap files.
+%
+
+/#copies 1 store
+/aspectratio 1 def
+/formsperpage 1 def
+/landscape false def
+/magnification 1 def
+/margin 0 def
+/orientation 0 def
+/rotation 1 def
+/screenres 100 def
+/xoffset 0 def
+/yoffset 0 def
+
+/useclippath true def
+/pagebbox [0 0 612 792] def
+
+/inch {72 mul} bind def
+/min {2 copy gt {exch} if pop} bind def
+
+/setup {
+	counttomark 2 idiv {def} repeat pop
+
+	landscape {/orientation 90 orientation add def} if
+
+	pagedimensions
+	xcenter ycenter translate
+	orientation rotation mul rotate
+	xoffset inch yoffset inch translate
+	magnification dup aspectratio mul scale
+
+	/height height margin sub def
+	/width width margin sub def
+} def
+
+/pagedimensions {
+	useclippath {
+		/pagebbox [clippath pathbbox newpath] def
+	} if
+	pagebbox aload pop
+	4 -1 roll exch 4 1 roll 4 copy
+	landscape {4 2 roll} if
+	sub /width exch def
+	sub /height exch def
+	add 2 div /xcenter exch def
+	add 2 div /ycenter exch def
+	userdict /gotpagebbox true put
+} def
+
+/pagesetup {/page exch def} bind def
+
+/bitmap {
+	/scanlines exch def
+	/scanlength exch def
+	/bitspersample exch def
+%%	/v8format exch def
+
+	/bytelength scanlength bitspersample mult 7 add 8 idiv def
+	/picstr bytelength string def
+	/lpicstr bytelength string def
+%%	/bytelength bytelength 1 sub def
+
+	gsave
+
+% First the overall scaling.
+
+	height scanlines div width scanlength div min
+	72 screenres div min
+	dup scale
+
+% Followed by the one for the unit square.
+
+	scanlength neg 2 div scanlines neg 2 div translate
+	scanlength scanlines scale
+	getp9bitmap
+	grestore
+} bind def
+
+/getp9bitmap {
+	scanlength scanlines bitspersample [scanlength 0 0 scanlines neg 0 scanlines] {
+			currentfile picstr readhexstring pop} image
+} bind def
+
+/done {/lastpage where {pop lastpage} if} def
diff --git a/postscript/prologues/postprint.ps b/postscript/prologues/postprint.ps
new file mode 100644
index 0000000..315b563
--- /dev/null
+++ b/postscript/prologues/postprint.ps
@@ -0,0 +1,75 @@
+%
+% Version 3.3.2 prologue for text files.
+%
+
+/#copies 1 store
+/aspectratio 1 def
+/font /Courier def
+/formsperpage 1 def
+/landscape false def
+/magnification 1 def
+/margin 10 def
+/orientation 0 def
+/pointsize 10 def
+/rotation 1 def
+/xoffset .25 def
+/yoffset .25 def
+
+/roundpage true def
+/useclippath true def
+/pagebbox [0 0 612 792] def
+
+/inch {72 mul} bind def
+/min {2 copy gt {exch} if pop} bind def
+
+/show {show} bind def		% so later references don't bind
+/stringwidth {stringwidth} bind def
+
+/setup {
+	counttomark 2 idiv {def} repeat pop
+
+	landscape {/orientation 90 orientation add def} if
+	font findfont pointsize scalefont setfont
+	/charwidth (M) stringwidth pop def
+	/linespace pointsize pointsize .10 mul add neg def
+
+	pagedimensions
+	xcenter ycenter translate
+	orientation rotation mul rotate
+	width 2 div neg height 2 div translate
+	xoffset inch yoffset inch neg translate
+	margin 2 div dup neg translate
+	magnification dup aspectratio mul scale
+	height width div 1 min dup scale
+	0 linespace translate
+} def
+
+/pagedimensions {
+	useclippath userdict /gotpagebbox known not and {
+		/pagebbox [clippath pathbbox newpath] def
+		roundpage currentdict /roundpagebbox known and {roundpagebbox} if
+	} if
+	pagebbox aload pop
+	4 -1 roll exch 4 1 roll 4 copy
+	landscape {4 2 roll} if
+	sub /width exch def
+	sub /height exch def
+	add 2 div /xcenter exch def
+	add 2 div /ycenter exch def
+	userdict /gotpagebbox true put
+} def
+
+/pagesetup {/page exch def 0 0 moveto 0} bind def
+
+/L {
+	counttomark 2 idiv {charwidth mul currentpoint exch pop moveto show} repeat
+	linespace add dup 0 exch moveto
+} bind def
+
+/l {show linespace add dup 0 exch moveto} bind def
+
+/LL {
+	counttomark 2 idiv {charwidth mul currentpoint exch pop moveto show} repeat
+} bind def
+
+/done {/lastpage where {pop lastpage} if} def
diff --git a/postscript/prologues/posttek.ps b/postscript/prologues/posttek.ps
new file mode 100644
index 0000000..ee2428c
--- /dev/null
+++ b/postscript/prologues/posttek.ps
@@ -0,0 +1,106 @@
+%
+% Version 3.3.2 prologue for tektronix 4014 files.
+%
+
+/#copies 1 store
+/aspectratio 1 def
+/fixlinewidth true def
+/font /Courier def
+/formsperpage 1 def
+/landscape true def
+/linewidth 0 def
+/magnification 1 def
+/margin 10 def
+/orientation 0 def
+/rotation 1 def
+/screenheight 3120 def
+/screenwidth 4150 def
+/spotsize 1 def
+/xoffset 0 def
+/yoffset 0 def
+
+/useclippath true def
+/pagebbox [0 0 612 792] def
+
+/inch {72 mul} bind def
+/min {2 copy gt {exch} if pop} bind def
+
+/kshow {kshow} bind def		% so later references don't bind
+
+/setup {
+	counttomark 2 idiv {def} repeat pop
+
+	landscape {/orientation 90 orientation add def} if
+
+	pagedimensions
+	/scaling
+		height margin sub screenheight div
+		width margin sub screenwidth div
+	min def
+	xcenter ycenter translate
+	orientation rotation mul rotate
+	xoffset inch yoffset inch translate
+	magnification dup aspectratio mul scale
+	scaling scaling scale
+	screenwidth 2 div neg screenheight 2 div neg translate
+
+	tietodevicespace
+	linewidth scaling div setlinewidth
+	1 setlinecap
+	newpath
+} def
+
+/pagedimensions {
+	useclippath {
+		/pagebbox [clippath pathbbox newpath] def
+	} if
+	pagebbox aload pop
+	4 -1 roll exch 4 1 roll 4 copy
+	landscape {4 2 roll} if
+	sub /width exch def
+	sub /height exch def
+	add 2 div /xcenter exch def
+	add 2 div /ycenter exch def
+	userdict /gotpagebbox true put
+} def
+
+/pagesetup {/page exch def} bind def
+
+/tietodevicespace {
+	fixlinewidth linewidth 0 gt and linewidth 1 lt and {
+		/moveto {
+			2 copy /Y exch def /X exch def
+			transform round exch round exch itransform
+			moveto
+		} bind def
+		/lineto {
+			2 copy /Y exch def /X exch def
+			transform round exch round exch itransform
+			lineto
+		} bind def
+		/rlineto {Y add exch X add exch lineto} bind def
+		/v V 0 get bind def
+	} if
+} def
+
+/V [{moveto counttomark 2 idiv {rlineto} repeat stroke}] def
+/v V 0 get bind def
+/p {newpath spotsize 0 360 arc fill} bind def
+
+/l {{scaling div} forall counttomark array astore 0 setdash} bind def
+/w {linewidth 0 eq {.3} {linewidth} ifelse mul linewidth add scaling div setlinewidth} bind def
+/i {3 mul 4 sub -100 div mul .5 add /spotsize exch def} bind def
+
+/f {/charwidth exch def font findfont charwidth .6 div scalefont setfont} bind def
+
+/t {
+	3 1 roll moveto
+	currentpoint {
+		pop pop
+		exch charwidth add exch
+		moveto currentpoint
+	} 4 -1 roll kshow
+	pop pop
+} bind def
+
+/done {/lastpage where {pop lastpage} if} def
diff --git a/postscript/prologues/printfont.ps b/postscript/prologues/printfont.ps
new file mode 100644
index 0000000..7a881a4
--- /dev/null
+++ b/postscript/prologues/printfont.ps
@@ -0,0 +1,321 @@
+%
+% Formatted font dump. Assumes all fonts include valid FontBBox arrays.
+%
+
+/#copies 1 store
+/aspectratio 1 def
+/landscape false def
+/magnification 1 def
+/margin 10 def
+/orientation 0 def
+/rotation 1 def
+/xoffset 0 def
+/yoffset 0 def
+
+/axescount 0 def
+/charwidth false def
+/graynotdef 0.85 def
+/hireslinewidth 0.2 def
+/longnames false def
+/maxsize 6.0 def
+/minsize 4.5 def
+/numbercell true def
+/radix 16 def
+/labelfont /Helvetica def
+/labelspace 36 def
+/zerocell 0 def
+
+/roundpage true def
+/useclippath true def
+/pagebbox [0 0 612 792] def
+
+/inch {72 mul} def
+/min {2 copy gt {exch} if pop} def
+/max {2 copy lt {exch} if pop} def
+
+/LLx {0 get} bind def
+/LLy {1 get} bind def
+/URx {2 get} bind def
+/URy {3 get} bind def
+/BBoxHeight {dup URy exch LLy sub} bind def
+/BBoxWidth {dup URx exch LLx sub} bind def
+
+/setup {
+	/graylevels [1 0 0] def
+	/scratchstring 512 string def
+	/Product statusdict begin /product where {pop product}{(Unknown)} ifelse end def
+	/Resolution 0 72 dtransform dup mul exch dup mul add sqrt cvi def
+	/Version /version where {pop version}{(???)} ifelse def
+
+	landscape {/orientation 90 orientation add def} if
+
+	pagedimensions
+	xcenter ycenter translate
+	orientation rotation mul rotate
+	width 2 div neg height 2 div translate
+	xoffset inch yoffset inch neg translate
+	margin dup neg translate
+	0 labelspace .75 mul neg translate
+	magnification dup aspectratio mul scale
+	0 0 transform round exch round exch itransform translate
+
+	currentdict /linewidth known not {
+		/linewidth Resolution 400 le {0}{hireslinewidth} ifelse def
+	} if
+} def
+
+/pagedimensions {
+	useclippath {
+		/pagebbox [clippath pathbbox newpath] def
+		roundpage currentdict /roundpagebbox known and {roundpagebbox} if
+	} if
+	pagebbox aload pop
+	4 -1 roll exch 4 1 roll 4 copy
+	landscape {4 2 roll} if
+	sub /width exch def
+	sub /height exch def
+	add 2 div /xcenter exch def
+	add 2 div /ycenter exch def
+} def
+
+/CharSetup {
+	/chcode exch def
+	/chname Encoding chcode get def
+	/chstring ( ) dup 0 chcode put def
+	/chknown true def
+
+	graylevels 0 1 put	% initial cell fill
+	graylevels 1 0 put	% cell text
+	graylevels 2 0 put	% cell border
+
+	FontDict /CharStrings known {
+		FontDict /CharStrings get chname known not {
+			/chknown false def
+			graylevels 0 0 put
+			graylevels 1 1 put
+		} if
+	} if
+
+	chname /.notdef eq {
+		/chknown false def
+		graylevels 0 graynotdef put
+		graylevels 1 graynotdef put
+	} if
+
+	/chwid chknown
+		{FontDict 1 scalefont setfont chstring stringwidth pop}
+		{0}
+	ifelse def
+} bind def
+
+/CellSetup {
+	/gridwidth width margin 2 mul sub def
+	/gridheight height labelspace sub margin 2 mul sub def
+	/cellwidth gridwidth radix div def
+	/cellheight gridheight Entries radix div ceiling div def
+
+	cellwidth cellheight dtransform truncate exch truncate exch idtransform
+	/cellheight exch def
+	/cellwidth exch def
+
+	labelfont findfont 1 scalefont setfont
+	/LabelBBox currentfont /FontBBox get TransformBBox def
+
+	LabelBBox 2 0 Encoding {
+		scratchstring cvs stringwidth pop
+		2 copy lt {exch} if
+		pop
+	} forall put
+
+	/CellLabelSize
+		cellheight .20 mul cellwidth .90 mul LabelBBox BestFit
+		minsize max
+		maxsize min
+	def
+	zerocell CellOrigin cellheight add neg exch neg exch translate
+} bind def
+
+/FontSetup {
+	FontName findfont 1 scalefont setfont
+	/BBox currentfont /FontBBox get TransformBBox def
+	/PointSize cellheight .5 mul cellwidth .8 mul BBox BestFit def
+	BBox {PointSize mul} forall BBox astore pop
+
+	/xorigin cellwidth BBox BBoxWidth sub 2 div BBox LLx sub def
+	/yorigin cellheight BBox BBoxHeight sub 2 div BBox LLy sub def
+} bind def
+
+/BestFit {
+	/bbox exch def
+	bbox BBoxWidth div exch
+	bbox BBoxHeight div min
+} bind def
+
+/TransformBBox {	% font bbox to user space
+	aload pop
+	currentfont /FontMatrix get dtransform 4 2 roll
+	currentfont /FontMatrix get dtransform 4 2 roll
+	4 array astore	% should build user space bbox if all zeros
+} bind def
+
+/CellOrigin {
+	dup
+	exch radix mod cellwidth mul
+	exch radix idiv 1 add neg cellheight mul
+} bind def
+
+/CellOutline {
+	newpath
+	CellOrigin moveto
+	cellwidth 0 rlineto
+	0 cellheight rlineto
+	cellwidth neg 0 rlineto
+	closepath
+} bind def
+
+/LabelCell {
+	gsave
+	chcode CellOrigin translate
+	linewidth .5 mul setlinewidth
+	labelfont findfont CellLabelSize scalefont setfont
+
+	numbercell {
+		cellwidth .025 mul cellheight .05 mul moveto
+		chcode radix scratchstring cvrs show
+	} if
+
+	charwidth chknown and {
+		/wid chwid 0.0005 add scratchstring cvs 0 5 getinterval def
+		cellwidth wid stringwidth pop 1.10 mul sub cellheight .05 mul moveto
+		wid show
+	} if
+
+	longnames chknown not or {
+		cellwidth .025 mul
+		cellheight LabelBBox URy CellLabelSize mul sub .05 sub moveto
+		Encoding chcode get scratchstring cvs show
+	} if
+
+	axescount 1 ge chknown and {	% gsave/grestore if not last
+		newpath
+		xorigin yorigin translate
+
+		BBox LLx 0 moveto	% baseline
+		BBox URx 0 lineto stroke
+
+		axescount 2 ge {	% vertical through current origin
+			0 BBox LLy moveto
+			0 BBox URy lineto stroke
+		} if
+
+		axescount 3 ge {	% vertical through next origin
+			chwid PointSize mul BBox LLy
+			dtransform round exch round exch idtransform moveto
+			0 BBox BBoxHeight rlineto stroke
+			%chwid PointSize mul BBox URy lineto stroke
+		} if
+	} if
+	grestore
+} bind def
+
+/PlaceChar {
+	FontName findfont PointSize scalefont setfont
+	chcode CellOrigin moveto
+	xorigin yorigin rmoveto
+	( ) dup 0 chcode put show
+} bind def
+
+/LabelPage {
+	labelfont findfont labelspace .75 mul .75 mul 18 min scalefont setfont
+	0 labelspace .75 mul .25 mul moveto
+	FontName scratchstring cvs show
+
+	labelfont findfont labelspace .25 mul .75 mul 9 min scalefont setfont
+	0 gridheight neg moveto
+	0 labelspace .25 mul .75 mul neg rmoveto
+	Product show ( Version ) show Version show
+	( \() show Resolution scratchstring cvs show (dpi\)) show
+
+	gridwidth gridheight neg moveto
+        0 labelspace .25 mul .75 mul neg rmoveto
+	(size=, ) stringwidth pop neg 0 rmoveto
+	PointSize cvi scratchstring cvs stringwidth pop neg 0 rmoveto
+	(gray=, ) stringwidth pop neg 0 rmoveto
+	graynotdef scratchstring cvs stringwidth pop neg 0 rmoveto
+	(linewidth=) stringwidth pop neg 0 rmoveto
+	linewidth scratchstring cvs stringwidth pop neg 0 rmoveto
+	(size=) show PointSize cvi scratchstring cvs show (, ) show
+	(gray=) show graynotdef scratchstring cvs show (, ) show
+	(linewidth=) show linewidth scratchstring cvs show
+} bind def
+
+%
+% Formatted dump of the encoded characters in a single font.
+%
+
+/PrintFont {
+	/saveobj save def
+	/FontName exch def
+	/FontDict FontName findfont def
+	/Encoding FontDict /Encoding get def
+	/Entries Encoding length def
+
+	CellSetup
+	FontSetup
+	LabelPage
+	zerocell 1 Entries 1 sub {
+		CharSetup
+		graylevels 0 get setgray
+		chcode CellOutline fill
+		graylevels 1 get setgray
+		LabelCell
+		PlaceChar
+		graylevels 2 get setgray
+		linewidth setlinewidth
+		chcode CellOutline stroke
+	} for
+	showpage
+	saveobj restore
+} bind def
+
+%
+% Dump of all ROM and disk fonts - in alphabetical order.
+%
+
+/AllFonts {
+	/AllFontNames FontDirectory maxlength array def
+	AllFontNames 0 0 put
+
+	FontDirectory {pop AllFontNames Insert} forall
+
+	/filenameforall where {
+		pop
+		(fonts/*)
+		{(fonts/) search pop pop pop AllFontNames Insert}
+		200 string
+		filenameforall
+	} if
+
+	1 1 AllFontNames 0 get {
+		AllFontNames exch get cvn PrintFont
+	} for
+} bind def
+
+/Insert {		% name in a sorted list
+	/List exch def
+	/Name exch 128 string cvs def
+
+	/Slot 1 def
+	List 0 get {
+		Name List Slot get le {exit} if
+		/Slot Slot 1 add def
+	} repeat
+
+	List 0 get -1 Slot {
+		dup List exch get
+		List 3 1 roll exch 1 add exch put
+	} for
+	List Slot Name put
+	List 0 List 0 get 1 add put
+} bind def
+
diff --git a/postscript/prologues/ps.requests b/postscript/prologues/ps.requests
new file mode 100644
index 0000000..59e2a57
--- /dev/null
+++ b/postscript/prologues/ps.requests
@@ -0,0 +1,16 @@
+%
+% Keywords begin with an @ in the first column. The value follows on the next
+% line and includes everything up to next keyword line, except for comments
+% which are lines that begin with % in the first column.
+%
+
+@manualfeed
+	statusdict begin
+		/manualfeedtimeout 300 def
+		/manualfeed true def
+	end
+
+@ledgertray
+	statusdict begin
+		ledgertray
+	end
diff --git a/postscript/prologues/roundpage.ps b/postscript/prologues/roundpage.ps
new file mode 100644
index 0000000..68d2d44
--- /dev/null
+++ b/postscript/prologues/roundpage.ps
@@ -0,0 +1,30 @@
+%
+% Tries to round clipping path dimensions, as stored in array pagebbox, so they
+% match one of the known sizes in the papersizes array. Lower left coordinates
+% are always set to 0.
+%
+
+/roundpagebbox {
+    7 dict begin
+	/papersizes [8.5 inch 11 inch 14 inch 17 inch] def
+
+	/mappapersize {
+		/val exch def
+		/slop .5 inch def
+		/diff slop def
+		/j 0 def
+		0 1 papersizes length 1 sub {
+			/i exch def
+			papersizes i get val sub abs
+			dup diff le {/diff exch def /j i def} {pop} ifelse
+		} for
+		diff slop lt {papersizes j get} {val} ifelse
+	} def
+
+	pagebbox 0 0 put
+	pagebbox 1 0 put
+	pagebbox dup 2 get mappapersize 2 exch put
+	pagebbox dup 3 get mappapersize 3 exch put
+    end
+} bind def
+
diff --git a/postscript/prologues/set_ip.ps b/postscript/prologues/set_ip.ps
new file mode 100644
index 0000000..55c2e12
--- /dev/null
+++ b/postscript/prologues/set_ip.ps
@@ -0,0 +1,30 @@
+%!PS-Adobe-3.0

+%% This file changes the IP Address on the Xante Accel-a-Writer

+

+%%Setting the IP Address will restart the printer!!

+

+%%Set The IP Address

+%(%IP%) <</IPAddress (135.104.7.83)>> setdevparams

+%(%IP%) <</NetworkMask (255.255.255.224)>> setdevparams

+%(%IP%) <</BroadcastAddress (135.104.7.95)>> setdevparams

+%(%IP%) <</GatewayAddress (0.0.0.0/135.104.7.65)>> setdevparams

+%serverdict begin 0 exitserver

+%systemdict /quit get exec

+

+

+%% Print out the IP address

+%%To print out the current IP Address, comment out the 

+%%above commands under Set The IP Address with a percent 

+%%sign.  Uncomment the lines below by removing  the leading % sign.

+

+/Courier findfont 24 scalefont setfont

+(%IP%) currentdevparams

+72 72 moveto
+/IPAddress get show
+72 144 moveto
+/NetworkMask get show
+72 216 moveto
+/BroadcastAddress get show
+72 288 moveto
+/GatewayAddress get show
+showpage
\ No newline at end of file
diff --git a/postscript/prologues/shade.ps b/postscript/prologues/shade.ps
new file mode 100644
index 0000000..47e3167
--- /dev/null
+++ b/postscript/prologues/shade.ps
@@ -0,0 +1,52 @@
+%
+% Shading support - primarily for ASCII file translators.
+%
+
+/grays [0.98 0.9 0.75 0.6] def
+
+/setshade {
+	/level exch def
+	level 0 le {
+		/textgray 0 def
+		/backgray 1 def
+	}{
+		/backgray level grays length gt
+			{/textgray 1 def 0}
+			{/textgray 0 def grays level 1 sub get}
+		ifelse def
+	} ifelse
+	textgray setgray
+	/dY1 0 def
+	/dY2 0 def
+} bind def
+
+/drawrvbox {
+	/x2 exch charwidth mul def
+	/x1 exch charwidth mul def
+
+	x1 x2 lt {
+		dup		% expects y on top
+		/y1 exch linespace mul def
+		/y2 y1 def
+
+		dY1 0 eq dY2 0 eq and {
+			currentfont /FontBBox get aload pop
+			160 sub
+			currentfont /FontMatrix get dtransform /dY2 exch def pop
+			100 add
+			currentfont /FontMatrix get dtransform /dY1 exch def pop
+		} if
+
+		/y1 y1 dY1 add def
+		/y2 y2 dY2 add def
+
+		backgray setgray
+		newpath
+		x1 y1 moveto
+		x2 y1 lineto
+		x2 y2 lineto
+		x1 y2 lineto
+		closepath fill
+	} if
+	textgray setgray
+} bind def
diff --git a/postscript/prologues/unbind.ps b/postscript/prologues/unbind.ps
new file mode 100644
index 0000000..98e6283
--- /dev/null
+++ b/postscript/prologues/unbind.ps
@@ -0,0 +1,28 @@
+%
+% Unbind the operators in an executable array or packedarray. Leaves the
+% unbound array or the original object on the stack.
+%
+
+/unbind {
+	0 index xcheck
+	1 index type /arraytype eq
+	2 index type /packedarraytype eq or and {
+		dup length array copy cvx
+		dup 0 exch {
+			dup type /operatortype eq {
+				(                          ) cvs cvn cvx
+			} if
+
+			0 index xcheck
+			1 index type /arraytype eq
+			2 index type /packedarraytype eq or and {
+				unbind
+			} if
+
+			3 copy put pop
+			1 add
+		} forall
+		pop
+	} if
+} def
+
diff --git a/postscript/troff/AB b/postscript/troff/AB
new file mode 100644
index 0000000..d9dc936
--- /dev/null
+++ b/postscript/troff/AB
@@ -0,0 +1 @@
+0x0000 0x00ff AvantGarde-Demi
diff --git a/postscript/troff/AI b/postscript/troff/AI
new file mode 100644
index 0000000..89ad742
--- /dev/null
+++ b/postscript/troff/AI
@@ -0,0 +1,2 @@
+0x0000 0x00ff AvantGarde-BookOblique
+
diff --git a/postscript/troff/AR b/postscript/troff/AR
new file mode 100644
index 0000000..b90f766
--- /dev/null
+++ b/postscript/troff/AR
@@ -0,0 +1 @@
+0x0000 0x00ff AvantGarde-DemiOblique
diff --git a/postscript/troff/B b/postscript/troff/B
new file mode 100644
index 0000000..f2b86de
--- /dev/null
+++ b/postscript/troff/B
@@ -0,0 +1,11 @@
+0x0000 0x00ff Times-Bold
+0x0100 0x01ff LucidaSansUnicode01
+0x0200 0x02ff LucidaSansUnicode02
+0x0300 0x03ff LucidaSansUnicode03
+0x0400 0x04ff LucidaSansUnicode04
+0x0500 0x05ff LucidaSansUnicode05
+0x2000 0x20ff LucidaSansUnicode20
+0x2100 0x21ff LucidaSansUnicode21
+0x2200 0x22ff LucidaSansUnicode22
+0x2400 0x24ff LucidaSansUnicode24
+0x2500 0x25ff LucidaSansUnicode25
diff --git a/postscript/troff/BI b/postscript/troff/BI
new file mode 100644
index 0000000..4dd55b8
--- /dev/null
+++ b/postscript/troff/BI
@@ -0,0 +1,11 @@
+0x0000 0x00ff Times-BoldItalic
+0x0100 0x01ff LucidaSansUnicode01
+0x0200 0x02ff LucidaSansUnicode02
+0x0300 0x03ff LucidaSansUnicode03
+0x0400 0x04ff LucidaSansUnicode04
+0x0500 0x05ff LucidaSansUnicode05
+0x2000 0x20ff LucidaSansUnicode20
+0x2100 0x21ff LucidaSansUnicode21
+0x2200 0x22ff LucidaSansUnicode22
+0x2400 0x24ff LucidaSansUnicode24
+0x2500 0x25ff LucidaSansUnicode25
diff --git a/postscript/troff/C b/postscript/troff/C
new file mode 100644
index 0000000..8a5e2db
--- /dev/null
+++ b/postscript/troff/C
@@ -0,0 +1,11 @@
+0x0000 0x00ff Courier
+0x0100 0x01ff LucidaSansUnicode01
+0x0200 0x02ff LucidaSansUnicode02
+0x0300 0x03ff LucidaSansUnicode03
+0x0400 0x04ff LucidaSansUnicode04
+0x0500 0x05ff LucidaSansUnicode05
+0x2000 0x20ff LucidaSansUnicode20
+0x2100 0x21ff LucidaSansUnicode21
+0x2200 0x22ff LucidaSansUnicode22
+0x2400 0x24ff LucidaSansUnicode24
+0x2500 0x25ff LucidaSansUnicode25
diff --git a/postscript/troff/CB b/postscript/troff/CB
new file mode 100644
index 0000000..be70f14
--- /dev/null
+++ b/postscript/troff/CB
@@ -0,0 +1 @@
+0x0000 0x00ff Courier-Bold
diff --git a/postscript/troff/CI b/postscript/troff/CI
new file mode 100644
index 0000000..5538c33
--- /dev/null
+++ b/postscript/troff/CI
@@ -0,0 +1 @@
+0x0000 0x00ff Courier-Italic
diff --git a/postscript/troff/CW b/postscript/troff/CW
new file mode 100644
index 0000000..8a5e2db
--- /dev/null
+++ b/postscript/troff/CW
@@ -0,0 +1,11 @@
+0x0000 0x00ff Courier
+0x0100 0x01ff LucidaSansUnicode01
+0x0200 0x02ff LucidaSansUnicode02
+0x0300 0x03ff LucidaSansUnicode03
+0x0400 0x04ff LucidaSansUnicode04
+0x0500 0x05ff LucidaSansUnicode05
+0x2000 0x20ff LucidaSansUnicode20
+0x2100 0x21ff LucidaSansUnicode21
+0x2200 0x22ff LucidaSansUnicode22
+0x2400 0x24ff LucidaSansUnicode24
+0x2500 0x25ff LucidaSansUnicode25
diff --git a/postscript/troff/CX b/postscript/troff/CX
new file mode 100644
index 0000000..f71cf6f
--- /dev/null
+++ b/postscript/troff/CX
@@ -0,0 +1 @@
+0x0000 0x00ff Courier-BoldItalic
diff --git a/postscript/troff/H b/postscript/troff/H
new file mode 100644
index 0000000..92872e1
--- /dev/null
+++ b/postscript/troff/H
@@ -0,0 +1,11 @@
+0x0000 0x00ff Helvetica
+0x0100 0x01ff LucidaSansUnicode01
+0x0200 0x02ff LucidaSansUnicode02
+0x0300 0x03ff LucidaSansUnicode03
+0x0400 0x04ff LucidaSansUnicode04
+0x0500 0x05ff LucidaSansUnicode05
+0x2000 0x20ff LucidaSansUnicode20
+0x2100 0x21ff LucidaSansUnicode21
+0x2200 0x22ff LucidaSansUnicode22
+0x2400 0x24ff LucidaSansUnicode24
+0x2500 0x25ff LucidaSansUnicode25
diff --git a/postscript/troff/HB b/postscript/troff/HB
new file mode 100644
index 0000000..0de915c
--- /dev/null
+++ b/postscript/troff/HB
@@ -0,0 +1,11 @@
+0x0000 0x00ff Helvetica-Bold
+0x0100 0x01ff LucidaSansUnicode01
+0x0200 0x02ff LucidaSansUnicode02
+0x0300 0x03ff LucidaSansUnicode03
+0x0400 0x04ff LucidaSansUnicode04
+0x0500 0x05ff LucidaSansUnicode05
+0x2000 0x20ff LucidaSansUnicode20
+0x2100 0x21ff LucidaSansUnicode21
+0x2200 0x22ff LucidaSansUnicode22
+0x2400 0x24ff LucidaSansUnicode24
+0x2500 0x25ff LucidaSansUnicode25
diff --git a/postscript/troff/HI b/postscript/troff/HI
new file mode 100644
index 0000000..709b029
--- /dev/null
+++ b/postscript/troff/HI
@@ -0,0 +1,11 @@
+0x0000 0x00ff Helvetica-Oblique
+0x0100 0x01ff LucidaSansUnicode01
+0x0200 0x02ff LucidaSansUnicode02
+0x0300 0x03ff LucidaSansUnicode03
+0x0400 0x04ff LucidaSansUnicode04
+0x0500 0x05ff LucidaSansUnicode05
+0x2000 0x20ff LucidaSansUnicode20
+0x2100 0x21ff LucidaSansUnicode21
+0x2200 0x22ff LucidaSansUnicode22
+0x2400 0x24ff LucidaSansUnicode24
+0x2500 0x25ff LucidaSansUnicode25
diff --git a/postscript/troff/HL b/postscript/troff/HL
new file mode 100644
index 0000000..507273a
--- /dev/null
+++ b/postscript/troff/HL
@@ -0,0 +1 @@
+0x0000 0x00ff Helvetica-Light
diff --git a/postscript/troff/HX b/postscript/troff/HX
new file mode 100644
index 0000000..3fd78fb
--- /dev/null
+++ b/postscript/troff/HX
@@ -0,0 +1 @@
+0x0000 0x00ff Helvetica-Narrow-BoldOblique
diff --git a/postscript/troff/I b/postscript/troff/I
new file mode 100644
index 0000000..f038366
--- /dev/null
+++ b/postscript/troff/I
@@ -0,0 +1,11 @@
+0x0000 0x00ff Times-Italic
+0x0100 0x01ff LucidaSansUnicode01
+0x0200 0x02ff LucidaSansUnicode02
+0x0300 0x03ff LucidaSansUnicode03
+0x0400 0x04ff LucidaSansUnicode04
+0x0500 0x05ff LucidaSansUnicode05
+0x2000 0x20ff LucidaSansUnicode20
+0x2100 0x21ff LucidaSansUnicode21
+0x2200 0x22ff LucidaSansUnicode22
+0x2400 0x24ff LucidaSansUnicode24
+0x2500 0x25ff LucidaSansUnicode25
diff --git a/postscript/troff/Jp b/postscript/troff/Jp
new file mode 100644
index 0000000..419a731
--- /dev/null
+++ b/postscript/troff/Jp
@@ -0,0 +1 @@
+0x0000 0x0001 Times-Roman
diff --git a/postscript/troff/KB b/postscript/troff/KB
new file mode 100644
index 0000000..a8b9939
--- /dev/null
+++ b/postscript/troff/KB
@@ -0,0 +1 @@
+0x0000 0x00ff	Bookman-Demi
diff --git a/postscript/troff/KI b/postscript/troff/KI
new file mode 100644
index 0000000..0ba5da6
--- /dev/null
+++ b/postscript/troff/KI
@@ -0,0 +1 @@
+0x0000 0x00ff	Bookman-LightItalic
diff --git a/postscript/troff/KR b/postscript/troff/KR
new file mode 100644
index 0000000..5e4a932
--- /dev/null
+++ b/postscript/troff/KR
@@ -0,0 +1 @@
+0x0000 0x00ff	Bookman-Light
diff --git a/postscript/troff/KX b/postscript/troff/KX
new file mode 100644
index 0000000..e1342b8
--- /dev/null
+++ b/postscript/troff/KX
@@ -0,0 +1 @@
+0x0000 0x00ff	Bookman-DemiItalic
diff --git a/postscript/troff/LucidaCW b/postscript/troff/LucidaCW
new file mode 100644
index 0000000..71fe411
--- /dev/null
+++ b/postscript/troff/LucidaCW
@@ -0,0 +1 @@
+0x0000 0x00ff LucidaTypewriter
diff --git a/postscript/troff/LucidaSans b/postscript/troff/LucidaSans
new file mode 100644
index 0000000..f371f5c
--- /dev/null
+++ b/postscript/troff/LucidaSans
@@ -0,0 +1,13 @@
+0x0000 0x00ff LucidaSansUnicode00
+0x0100 0x01ff LucidaSansUnicode01
+0x0200 0x02ff LucidaSansUnicode02
+0x0300 0x03ff LucidaSansUnicode03
+0x0400 0x04ff LucidaSansUnicode04
+0x0500 0x05ff LucidaSansUnicode05
+0x2000 0x20ff LucidaSansUnicode20
+0x2100 0x21ff LucidaSansUnicode21
+0x2200 0x22ff LucidaSansUnicode22
+0x2400 0x24ff LucidaSansUnicode24
+0x2500 0x25ff LucidaSansUnicode25
+0x0027 0x0027 0x19 LucidaSansUnicode20  # map apostrophe to right quote
+0x0060 0x0060 0x18 LucidaSansUnicode20  # map grave to left quote
diff --git a/postscript/troff/LucidaSansB b/postscript/troff/LucidaSansB
new file mode 100644
index 0000000..66f1f2c
--- /dev/null
+++ b/postscript/troff/LucidaSansB
@@ -0,0 +1,11 @@
+0x0000 0x00ff LucidaSans-Demi
+0x0100 0x01ff LucidaSansUnicode01
+0x0200 0x02ff LucidaSansUnicode02
+0x0300 0x03ff LucidaSansUnicode03
+0x0400 0x04ff LucidaSansUnicode04
+0x0500 0x05ff LucidaSansUnicode05
+0x2000 0x20ff LucidaSansUnicode20
+0x2100 0x21ff LucidaSansUnicode21
+0x2200 0x22ff LucidaSansUnicode22
+0x2400 0x24ff LucidaSansUnicode24
+0x2500 0x25ff LucidaSansUnicode25
diff --git a/postscript/troff/LucidaSansCW b/postscript/troff/LucidaSansCW
new file mode 100644
index 0000000..ddf8618
--- /dev/null
+++ b/postscript/troff/LucidaSansCW
@@ -0,0 +1 @@
+0x0000 0x00ff LucidaSans-Typewriter
diff --git a/postscript/troff/LucidaSansCW83 b/postscript/troff/LucidaSansCW83
new file mode 100644
index 0000000..9f9dc2c
--- /dev/null
+++ b/postscript/troff/LucidaSansCW83
@@ -0,0 +1 @@
+0x0000 0x00ff LucidaSans-Typewriter83
diff --git a/postscript/troff/LucidaSansI b/postscript/troff/LucidaSansI
new file mode 100644
index 0000000..300630e
--- /dev/null
+++ b/postscript/troff/LucidaSansI
@@ -0,0 +1,11 @@
+0x0000 0x00ff LucidaSans-Italic
+0x0100 0x01ff LucidaSansUnicode01
+0x0200 0x02ff LucidaSansUnicode02
+0x0300 0x03ff LucidaSansUnicode03
+0x0400 0x04ff LucidaSansUnicode04
+0x0500 0x05ff LucidaSansUnicode05
+0x2000 0x20ff LucidaSansUnicode20
+0x2100 0x21ff LucidaSansUnicode21
+0x2200 0x22ff LucidaSansUnicode22
+0x2400 0x24ff LucidaSansUnicode24
+0x2500 0x25ff LucidaSansUnicode25
diff --git a/postscript/troff/NB b/postscript/troff/NB
new file mode 100644
index 0000000..6fcf657
--- /dev/null
+++ b/postscript/troff/NB
@@ -0,0 +1 @@
+0x0000 0x00ff	NewCenturySchlbk-Bold
diff --git a/postscript/troff/NI b/postscript/troff/NI
new file mode 100644
index 0000000..ff9f96e
--- /dev/null
+++ b/postscript/troff/NI
@@ -0,0 +1 @@
+0x0000 0x00ff	NewCenturySchlbk-Italic
diff --git a/postscript/troff/NR b/postscript/troff/NR
new file mode 100644
index 0000000..070c132
--- /dev/null
+++ b/postscript/troff/NR
@@ -0,0 +1 @@
+0x0000 0x00ff	NewCenturySchlbk-Roman
diff --git a/postscript/troff/NX b/postscript/troff/NX
new file mode 100644
index 0000000..c7b0a5f
--- /dev/null
+++ b/postscript/troff/NX
@@ -0,0 +1 @@
+0x0000 0x00ff	NewCenturySchlbk-BoldItalic
diff --git a/postscript/troff/PA b/postscript/troff/PA
new file mode 100644
index 0000000..b4fb1c0
--- /dev/null
+++ b/postscript/troff/PA
@@ -0,0 +1,11 @@
+0x0000 0x00ff Palatino-Roman
+0x0100 0x01ff LucidaSansUnicode01
+0x0200 0x02ff LucidaSansUnicode02
+0x0300 0x03ff LucidaSansUnicode03
+0x0400 0x04ff LucidaSansUnicode04
+0x0500 0x05ff LucidaSansUnicode05
+0x2000 0x20ff LucidaSansUnicode20
+0x2100 0x21ff LucidaSansUnicode21
+0x2200 0x22ff LucidaSansUnicode22
+0x2400 0x24ff LucidaSansUnicode24
+0x2500 0x25ff LucidaSansUnicode25
diff --git a/postscript/troff/PB b/postscript/troff/PB
new file mode 100644
index 0000000..181aa18
--- /dev/null
+++ b/postscript/troff/PB
@@ -0,0 +1 @@
+0x0000 0x00ff Palatino-Bold
diff --git a/postscript/troff/PI b/postscript/troff/PI
new file mode 100644
index 0000000..d9e845c
--- /dev/null
+++ b/postscript/troff/PI
@@ -0,0 +1 @@
+0x0000 0x00ff Palatino-Italic
diff --git a/postscript/troff/PX b/postscript/troff/PX
new file mode 100644
index 0000000..4061d1f
--- /dev/null
+++ b/postscript/troff/PX
@@ -0,0 +1 @@
+0x0000 0x00ff Palatino-BoldItalic
diff --git a/postscript/troff/R b/postscript/troff/R
new file mode 100644
index 0000000..9e23920
--- /dev/null
+++ b/postscript/troff/R
@@ -0,0 +1,11 @@
+0x0000 0x00ff Times-Roman
+0x0100 0x01ff LucidaSansUnicode01
+0x0200 0x02ff LucidaSansUnicode02
+0x0300 0x03ff LucidaSansUnicode03
+0x0400 0x04ff LucidaSansUnicode04
+0x0500 0x05ff LucidaSansUnicode05
+0x2000 0x20ff LucidaSansUnicode20
+0x2100 0x21ff LucidaSansUnicode21
+0x2200 0x22ff LucidaSansUnicode22
+0x2400 0x24ff LucidaSansUnicode24
+0x2500 0x25ff LucidaSansUnicode25
diff --git a/postscript/troff/R.nomath b/postscript/troff/R.nomath
new file mode 100644
index 0000000..9e23920
--- /dev/null
+++ b/postscript/troff/R.nomath
@@ -0,0 +1,11 @@
+0x0000 0x00ff Times-Roman
+0x0100 0x01ff LucidaSansUnicode01
+0x0200 0x02ff LucidaSansUnicode02
+0x0300 0x03ff LucidaSansUnicode03
+0x0400 0x04ff LucidaSansUnicode04
+0x0500 0x05ff LucidaSansUnicode05
+0x2000 0x20ff LucidaSansUnicode20
+0x2100 0x21ff LucidaSansUnicode21
+0x2200 0x22ff LucidaSansUnicode22
+0x2400 0x24ff LucidaSansUnicode24
+0x2500 0x25ff LucidaSansUnicode25
diff --git a/postscript/troff/S b/postscript/troff/S
new file mode 100644
index 0000000..8ebbe5a
--- /dev/null
+++ b/postscript/troff/S
@@ -0,0 +1,11 @@
+0x0000 0x00ff S
+0x0100 0x01ff LucidaSansUnicode01
+0x0200 0x02ff LucidaSansUnicode02
+0x0300 0x03ff LucidaSansUnicode03
+0x0400 0x04ff LucidaSansUnicode04
+0x0500 0x05ff LucidaSansUnicode05
+0x2000 0x20ff LucidaSansUnicode20
+0x2100 0x21ff LucidaSansUnicode21
+0x2200 0x22ff LucidaSansUnicode22
+0x2400 0x24ff LucidaSansUnicode24
+0x2500 0x25ff LucidaSansUnicode25
diff --git a/postscript/troff/S1 b/postscript/troff/S1
new file mode 100644
index 0000000..f8a98fc
--- /dev/null
+++ b/postscript/troff/S1
@@ -0,0 +1,11 @@
+0x0000 0x00ff S1
+0x0100 0x01ff LucidaSansUnicode01
+0x0200 0x02ff LucidaSansUnicode02
+0x0300 0x03ff LucidaSansUnicode03
+0x0400 0x04ff LucidaSansUnicode04
+0x0500 0x05ff LucidaSansUnicode05
+0x2000 0x20ff LucidaSansUnicode20
+0x2100 0x21ff LucidaSansUnicode21
+0x2200 0x22ff LucidaSansUnicode22
+0x2400 0x24ff LucidaSansUnicode24
+0x2500 0x25ff LucidaSansUnicode25
diff --git a/postscript/troff/Syntax b/postscript/troff/Syntax
new file mode 100644
index 0000000..cf17fdc
--- /dev/null
+++ b/postscript/troff/Syntax
@@ -0,0 +1 @@
+0x0000 0x00ff	Syntax-Roman
diff --git a/postscript/troff/SyntaxB b/postscript/troff/SyntaxB
new file mode 100644
index 0000000..ec4fd30
--- /dev/null
+++ b/postscript/troff/SyntaxB
@@ -0,0 +1 @@
+0x0000 0x00ff	Syntax-Bold
diff --git a/postscript/troff/SyntaxI b/postscript/troff/SyntaxI
new file mode 100644
index 0000000..127726e
--- /dev/null
+++ b/postscript/troff/SyntaxI
@@ -0,0 +1 @@
+0x0000 0x00ff	Syntax-Italic
diff --git a/postscript/troff/ZD b/postscript/troff/ZD
new file mode 100644
index 0000000..5d2e169
--- /dev/null
+++ b/postscript/troff/ZD
@@ -0,0 +1 @@
+0x0000 0x00ff ZapfDingbats
diff --git a/postscript/troff/ZI b/postscript/troff/ZI
new file mode 100644
index 0000000..5769bf7
--- /dev/null
+++ b/postscript/troff/ZI
@@ -0,0 +1,11 @@
+0x0000 0x00ff ZapfChancery-MediumItalic
+0x0100 0x01ff LucidaSansUnicode01
+0x0200 0x02ff LucidaSansUnicode02
+0x0300 0x03ff LucidaSansUnicode03
+0x0400 0x04ff LucidaSansUnicode04
+0x0500 0x05ff LucidaSansUnicode05
+0x2000 0x20ff LucidaSansUnicode20
+0x2100 0x21ff LucidaSansUnicode21
+0x2200 0x22ff LucidaSansUnicode22
+0x2400 0x24ff LucidaSansUnicode24
+0x2500 0x25ff LucidaSansUnicode25