shithub: riscv

ref: 13b1ea74932158069ab1f4c584db81477d9f3551
dir: /sys/src/cmd/postscript/tr2post/shell.lib/

View raw version
#
# Shell library - for building devutf tables.
#

RESOLUTION=720
UNITWIDTH=10

OCTALESCAPES=${OCTALESCAPES:-160}	# <= code means add \0ddd names
DOWNLOADVECTOR=FALSE			# TRUE can mean incomplete tables

#
# BuiltinTables returns command lines that generate PostScript programs
# for building a typesetter description file and font width tables for
# a relatively standard collection of fonts. Use awk to select a command
# line or modify an existing command to build a width table for a new
# font.
#

BuiltinTables() {
	cat <<-'//End of BuiltinTables'
		Proportional	R	Times-Roman
		Proportional	I	Times-Italic
		Proportional	B	Times-Bold
		Proportional	BI	Times-BoldItalic
		Proportional	AB	AvantGarde-Demi
		Proportional	AI	AvantGarde-BookOblique
		Proportional	AR	AvantGarde-Book
		Proportional	AX	AvantGarde-DemiOblique
		Proportional	H	Helvetica
		Proportional	HB	Helvetica-Bold
		Proportional	HI	Helvetica-Oblique
		Proportional	HX	Helvetica-BoldOblique
		Proportional	Hb	Helvetica-Narrow-Bold
		Proportional	Hi	Helvetica-Narrow-Oblique
		Proportional	Hr	Helvetica-Narrow
		Proportional	Hx	Helvetica-Narrow-BoldOblique
		Proportional	KB	Bookman-Demi
		Proportional	KI	Bookman-LightItalic
		Proportional	KR	Bookman-Light
		Proportional	KX	Bookman-DemiItalic
		Proportional	NB	NewCenturySchlbk-Bold
		Proportional	NI	NewCenturySchlbk-Italic
		Proportional	NR	NewCenturySchlbk-Roman
		Proportional	NX	NewCenturySchlbk-BoldItalic
		Proportional	PA	Palatino-Roman
		Proportional	PB	Palatino-Bold
		Proportional	PI	Palatino-Italic
		Proportional	PX	Palatino-BoldItalic
		Proportional	ZI	ZapfChancery-MediumItalic
		FixedWidth	C	Courier
		FixedWidth	CB	Courier-Bold
		FixedWidth	CI	Courier-Oblique
		FixedWidth	CO	Courier
		FixedWidth	CW	Courier
		FixedWidth	CX	Courier-BoldOblique
		Dingbats	ZD	ZapfDingbats
		Greek		GR	Symbol
		Symbol		S	Symbol
		Special		S1	Times-Roman
		Description	DESC	---
	//End of BuiltinTables
}

#
# AllTables prints the complete list of builtin font names.
#

AllTables() {
	BuiltinTables | awk '{print $2}'
}

#
# Charset functions generate keyword/value pairs (as PostScript objects)
# that describe the character set available in a font. The keyword is a
# PostScript string that represents troff's name for the character. The
# value is usually the literal name (i.e. begins with a /) assigned to
# the character in the PostScript font. The value can also be an integer
# or a PostScript string. An integer value is used as an index in the
# current font's Encoding array. A string value is returned to the host
# unchanged when the entry for the character is constructed. Entries that
# have (") as their value are synonyms for the preceeding character.
#
# The 18 characters missing from ROM resident fonts on older printers are
# flagged with the PostScript comment "% missing".
#

StandardCharset() {
	cat <<-'//End of StandardCharset'
		(!)	/exclam
		(")	/quotedbl
		(dq)	(")			% synonym
		(#)	/numbersign
		($)	/dollar
		(%)	/percent
		(&)	/ampersand
		(')	/quoteright
		(\()	/parenleft
		(\))	/parenright
		(*)	/asterisk
		(+)	/plus
		(,)	/comma
		(-)	/hyphen			% changed from minus by request
		(.)	/period
		(/)	/slash
		(0)	/zero
		(1)	/one
		(2)	/two
		(3)	/three
		(4)	/four
		(5)	/five
		(6)	/six
		(7)	/seven
		(8)	/eight
		(9)	/nine
		(:)	/colon
		(;)	/semicolon
		(<)	/less
		(=)	/equal
		(>)	/greater
		(?)	/question
		(@)	/at
		(A)	/A
		(B)	/B
		(C)	/C
		(D)	/D
		(E)	/E
		(F)	/F
		(G)	/G
		(H)	/H
		(I)	/I
		(J)	/J
		(K)	/K
		(L)	/L
		(M)	/M
		(N)	/N
		(O)	/O
		(P)	/P
		(Q)	/Q
		(R)	/R
		(S)	/S
		(T)	/T
		(U)	/U
		(V)	/V
		(W)	/W
		(X)	/X
		(Y)	/Y
		(Z)	/Z
		([)	/bracketleft
		(\\)	/backslash
		(bs)	(")			% synonym
		(])	/bracketright
		(^)	/asciicircum
		(_)	/underscore
		(`)	/quoteleft
		(a)	/a
		(b)	/b
		(c)	/c
		(d)	/d
		(e)	/e
		(f)	/f
		(g)	/g
		(h)	/h
		(i)	/i
		(j)	/j
		(k)	/k
		(l)	/l
		(m)	/m
		(n)	/n
		(o)	/o
		(p)	/p
		(q)	/q
		(r)	/r
		(s)	/s
		(t)	/t
		(u)	/u
		(v)	/v
		(w)	/w
		(x)	/x
		(y)	/y
		(z)	/z
		({)	/braceleft
		(|)	/bar
		(})	/braceright
		(~)	/asciitilde
		(\\`)	/grave			% devpost character
		(ga)	(")			% synonym
		(!!)	/exclamdown
		(c|)	/cent
		(ct)	(")			% devpost synonym
		(L-)	/sterling
		(ps)	(")			% devpost synonym
		(xo)	/currency
		(cr)	(")			% devpost synonym
		(Y-)	/yen
		(yn)	(")			% devpost synonym
		(||)	/brokenbar		% missing
		(so)	/section
		(sc)	(")			% devpost synonym
		("")	/dieresis
		(:a)	(")			% devpost synonym
		(co)	/copyright
		(a_)	/ordfeminine
		(<<)	/guillemotleft
		(-,)	/logicalnot
		(hy)	/hyphen
		(--)	/minus
		(ro)	/registered
		(rg)	(")			% devpost synonym
		(-^)	/macron
		(-a)	(")			% devpost synonym
		(0^)	/degree			% missing
		(+-)	/plusminus		% missing
		(2^)	/twosuperior		% missing
		(3^)	/threesuperior		% missing
		(\\')	/acute
		(aa)	(")			% devpost synonym
		(/u)	/mu			% missing
		(P!)	/paragraph
		(pg)	(")			% devpost synonym
		(.^)	/periodcentered
		(,,)	/cedilla
		(,a)	(")			% devpost synonym
		(1^)	/onesuperior		% missing
		(o_)	/ordmasculine
		(>>)	/guillemotright
		(14)	/onequarter		% missing
		(12)	/onehalf		% missing
		(34)	/threequarters		% missing
		(??)	/questiondown
		(A`)	/Agrave
		(A')	/Aacute
		(A^)	/Acircumflex
		(A~)	/Atilde
		(A")	/Adieresis
		(A*)	/Aring
		(AE)	/AE
		(C,)	/Ccedilla
		(E`)	/Egrave
		(E')	/Eacute
		(E^)	/Ecircumflex
		(E")	/Edieresis
		(I`)	/Igrave
		(I')	/Iacute
		(I^)	/Icircumflex
		(I")	/Idieresis
		(D-)	/Eth			% missing
		(N~)	/Ntilde
		(O`)	/Ograve
		(O')	/Oacute
		(O^)	/Ocircumflex
		(O~)	/Otilde
		(O")	/Odieresis
		(xx)	/multiply		% missing
		(O/)	/Oslash
		(U`)	/Ugrave
		(U')	/Uacute
		(U^)	/Ucircumflex
		(U")	/Udieresis
		(Y')	/Yacute			% missing
		(TH)	/Thorn			% missing
		(ss)	/germandbls
		(a`)	/agrave
		(a')	/aacute
		(a^)	/acircumflex
		(a~)	/atilde
		(a")	/adieresis
		(a*)	/aring
		(ae)	/ae
		(c,)	/ccedilla
		(e`)	/egrave
		(e')	/eacute
		(e^)	/ecircumflex
		(e")	/edieresis
		(i`)	/igrave
		(i')	/iacute
		(i^)	/icircumflex
		(i")	/idieresis
		(d-)	/eth			% missing
		(n~)	/ntilde
		(o`)	/ograve
		(o')	/oacute
		(o^)	/ocircumflex
		(o~)	/otilde
		(o")	/odieresis
		(-:)	/divide			% missing
		(o/)	/oslash
		(u`)	/ugrave
		(u')	/uacute
		(u^)	/ucircumflex
		(u")	/udieresis
		(y')	/yacute			% missing
		(th)	/thorn			% missing
		(y")	/ydieresis
		(^a)	/circumflex		% devpost accent
		(~a)	/tilde			% devpost accent
		(Ua)	/breve			% devpost accent
		(.a)	/dotaccent		% devpost accent
		(oa)	/ring			% devpost accent
		("a)	/hungarumlaut		% devpost accent
		(Ca)	/ogonek			% devpost accent
		(va)	/caron			% devpost accent
	//End of StandardCharset
}

#
# DingbatsCharset guarantees changes in StandardCharset don't show up in ZD.
#

DingbatsCharset() {
	cat <<-'//End of DingbatsCharset'
		(!)	/exclam
		(")	/quotedbl
		(#)	/numbersign
		($)	/dollar
		(%)	/percent
		(&)	/ampersand
		(')	/quoteright
		(\()	/parenleft
		(\))	/parenright
		(*)	/asterisk
		(+)	/plus
		(,)	/comma
		(-)	/minus		% also hyphen in devpost
		(.)	/period
		(/)	/slash
		(0)	/zero
		(1)	/one
		(2)	/two
		(3)	/three
		(4)	/four
		(5)	/five
		(6)	/six
		(7)	/seven
		(8)	/eight
		(9)	/nine
		(:)	/colon
		(;)	/semicolon
		(<)	/less
		(=)	/equal
		(>)	/greater
		(?)	/question
		(@)	/at
		(A)	/A
		(B)	/B
		(C)	/C
		(D)	/D
		(E)	/E
		(F)	/F
		(G)	/G
		(H)	/H
		(I)	/I
		(J)	/J
		(K)	/K
		(L)	/L
		(M)	/M
		(N)	/N
		(O)	/O
		(P)	/P
		(Q)	/Q
		(R)	/R
		(S)	/S
		(T)	/T
		(U)	/U
		(V)	/V
		(W)	/W
		(X)	/X
		(Y)	/Y
		(Z)	/Z
		([)	/bracketleft
		(\\)	/backslash
		(])	/bracketright
		(^)	/asciicircum
		(_)	/underscore
		(`)	/quoteleft
		(a)	/a
		(b)	/b
		(c)	/c
		(d)	/d
		(e)	/e
		(f)	/f
		(g)	/g
		(h)	/h
		(i)	/i
		(j)	/j
		(k)	/k
		(l)	/l
		(m)	/m
		(n)	/n
		(o)	/o
		(p)	/p
		(q)	/q
		(r)	/r
		(s)	/s
		(t)	/t
		(u)	/u
		(v)	/v
		(w)	/w
		(x)	/x
		(y)	/y
		(z)	/z
		({)	/braceleft
		(|)	/bar
		(})	/braceright
		(~)	/asciitilde
		(\\`)	/grave			% devpost character
		(!!)	/exclamdown
		(c|)	/cent
		(L-)	/sterling
		(xo)	/currency
		(Y-)	/yen
		(||)	/brokenbar		% missing
		(so)	/section
		("")	/dieresis
		(co)	/copyright
		(a_)	/ordfeminine
		(<<)	/guillemotleft
		(-,)	/logicalnot
		(hy)	/hyphen
		(ro)	/registered
		(-^)	/macron
		(0^)	/degree			% missing
		(+-)	/plusminus		% missing
		(2^)	/twosuperior		% missing
		(3^)	/threesuperior		% missing
		(\\')	/acute
		(/u)	/mu			% missing
		(P!)	/paragraph
		(.^)	/periodcentered
		(,,)	/cedilla
		(1^)	/onesuperior		% missing
		(o_)	/ordmasculine
		(>>)	/guillemotright
		(14)	/onequarter		% missing
		(12)	/onehalf		% missing
		(34)	/threequarters		% missing
		(??)	/questiondown
		(A`)	/Agrave
		(A')	/Aacute
		(A^)	/Acircumflex
		(A~)	/Atilde
		(A")	/Adieresis
		(A*)	/Aring
		(AE)	/AE
		(C,)	/Ccedilla
		(E`)	/Egrave
		(E')	/Eacute
		(E^)	/Ecircumflex
		(E")	/Edieresis
		(I`)	/Igrave
		(I')	/Iacute
		(I^)	/Icircumflex
		(I")	/Idieresis
		(D-)	/Eth			% missing
		(N~)	/Ntilde
		(O`)	/Ograve
		(O')	/Oacute
		(O^)	/Ocircumflex
		(O~)	/Otilde
		(O")	/Odieresis
		(xx)	/multiply		% missing
		(O/)	/Oslash
		(U`)	/Ugrave
		(U')	/Uacute
		(U^)	/Ucircumflex
		(U")	/Udieresis
		(Y')	/Yacute			% missing
		(TH)	/Thorn			% missing
		(ss)	/germandbls
		(a`)	/agrave
		(a')	/aacute
		(a^)	/acircumflex
		(a~)	/atilde
		(a")	/adieresis
		(a*)	/aring
		(ae)	/ae
		(c,)	/ccedilla
		(e`)	/egrave
		(e')	/eacute
		(e^)	/ecircumflex
		(e")	/edieresis
		(i`)	/igrave
		(i')	/iacute
		(i^)	/icircumflex
		(i")	/idieresis
		(d-)	/eth			% missing
		(n~)	/ntilde
		(o`)	/ograve
		(o')	/oacute
		(o^)	/ocircumflex
		(o~)	/otilde
		(o")	/odieresis
		(-:)	/divide			% missing
		(o/)	/oslash
		(u`)	/ugrave
		(u')	/uacute
		(u^)	/ucircumflex
		(u")	/udieresis
		(y')	/yacute			% missing
		(th)	/thorn			% missing
		(y")	/ydieresis
	//End of DingbatsCharset
}

SymbolCharset() {
	cat <<-'//End of SymbolCharset'
		(---)		/exclam
		(fa)		/universal
		(---)		/numbersign
		(te)		/existential
		(---)		/percent
		(---)		/ampersand
		(st)		/suchthat
		(---)		/parenleft
		(---)		/parenright
		(**)		/asteriskmath
		(pl)		/plus
		(---)		/comma
		(mi)		/minus
		(---)		/period
		(sl)		/slash
		(---)		/zero
		(---)		/one
		(---)		/two
		(---)		/three
		(---)		/four
		(---)		/five
		(---)		/six
		(---)		/seven
		(---)		/eight
		(---)		/nine
		(---)		/colon
		(---)		/semicolon
		(<)		/less
		(eq)		/equal
		(>)		/greater
		(---)		/question
		(cg)		/congruent
		(*A)		/Alpha
		(\244x)		(")
		(*B)		/Beta
		(\244y)		(")
		(*X)		/Chi
		(\244\257)	(")
		(*D)		/Delta
		(\244{)		(")
		(*E)		/Epsilon
		(\244|)		(")
		(*F)		/Phi
		(\244\256)	(")
		(*G)		/Gamma
		(\244z)		(")
		(*Y)		/Eta
		(\244~)		(")
		(*I)		/Iota
		(\244\241)	(")
		(---)		/theta1
		(\244\331)	(")
		(*K)		/Kappa
		(\244\242)	(")
		(*L)		/Lambda
		(\244\243)	(")
		(*M)		/Mu
		(\244\244)	(")
		(*N)		/Nu
		(\244\245)	(")
		(*O)		/Omicron
		(\244\247)	(")
		(*P)		/Pi
		(\244\250)	(")
		(*H)		/Theta
		(\244\240)	(")
		(*R)		/Rho
		(\244\251)	(")
		(*S)		/Sigma
		(\244\253)	(")
		(*T)		/Tau
		(\244\254)	(")
		(*U)		/Upsilon
		(\244\255)	(")
		(ts)		/sigma1
		(\244\312)	(")
		(*W)		/Omega
		(\244\261)	(")
		(*C)		/Xi
		(\244\246)	(")
		(*Q)		/Psi
		(\244\260)	(")
		(*Z)		/Zeta
		(\244})		(")
		(---)		/bracketleft
		(tf)		/therefore
		(---)		/bracketright
		(pp)		/perpendicular
		(ul)		/underscore
		(_)		(")			% synonym
		(rn)		/radicalex
		(*a)		/alpha
		(\244\271)	(")
		(*b)		/beta
		(\244\272)	(")
		(*x)		/chi
		(\244\317)	(")
		(*d)		/delta
		(\244\274)	(")
		(*e)		/epsilon
		(\244\275)	(")
		(*f)		/phi
		(\244\316)	(")
		(*g)		/gamma
		(\244\273)	(")
		(*y)		/eta
		(\244\277)	(")
		(*i)		/iota
		(\244\301)	(")
		(---)		/phi1
		(\244\335)	(")
		(*k)		/kappa
		(\244\302)	(")
		(*l)		/lambda
		(\244\303)	(")
		(*m)		/mu
		(\244\304)	(")
		(*n)		/nu
		(\244\305)	(")
		(*o)		/omicron
		(\244\307)	(")
		(*p)		/pi
		(\244\310)	(")
		(*h)		/theta
		(\244\300)	(")
		(*r)		/rho
		(\244\311)	(")
		(*s)		/sigma
		(\244\313)	(")
		(*t)		/tau
		(\244\314)	(")
		(*u)		/upsilon
		(\244\315)	(")
		(---)		/omega1
		(\244\336)	(")
		(*w)		/omega
		(\244\321)	(")
		(*c)		/xi
		(\244\306)	(")
		(*q)		/psi
		(\244\320)	(")
		(*z)		/zeta
		(\244\276)	(")
		(---)		/braceleft
		(or)		/bar
		(---)		/braceright
		(ap)		/similar
		(---)		/Upsilon1
		(fm)		/minute
		(<=)		/lessequal
		(fr)		/fraction		% devpost character
		(if)		/infinity
		(fn)		/florin			% devpost character
		(---)		/club
		(---)		/diamond
		(---)		/heart
		(---)		/spade
		(ab)		/arrowboth
		(<-)		/arrowleft
		(ua)		/arrowup
		(->)		/arrowright
		(da)		/arrowdown
		(de)		/degree
		(+-)		/plusminus
		(---)		/second
		(>=)		/greaterequal
		(mu)		/multiply
		(pt)		/proportional
		(pd)		/partialdiff
		(bu)		/bullet
		(di)		/divide
		(!=)		/notequal
		(==)		/equivalence
		(~~)		/approxequal
		(el)		/ellipsis
		(av)		/arrowvertex
		(ah)		/arrowhorizex
		(CR)		/carriagereturn
		(af)		/aleph
		(If)		/Ifraktur
		(Rf)		/Rfraktur
		(ws)		/weierstrass
		(Ox)		/circlemultiply
		(O+)		/circleplus
		(es)		/emptyset
		(ca)		/intersection
		(cu)		/union
		(sp)		/propersuperset
		(ip)		/reflexsuperset
		(!b)		/notsubset
		(sb)		/propersubset
		(ib)		/reflexsubset
		(mo)		/element
		(!m)		/notelement
		(an)		/angle
		(gr)		/gradient
		(rg)		/registerserif
		(co)		/copyrightserif
		(tm)		/trademarkserif
		(---)		/product
		(sr)		/radical
		(c.)		/dotmath
		(no)		/logicalnot
		(l&)		/logicaland
		(l|)		/logicalor
		(---)		/arrowdblboth
		(---)		/arrowdblleft
		(---)		/arrowdblup
		(---)		/arrowdblright
		(---)		/arrowdbldown
		(lz)		/lozenge
		(b<)		/angleleft
		(RG)		/registersans
		(CO)		/copyrightsans
		(TM)		/trademarksans
		(---)		/summation
		(LT)		/parenlefttp
		(br)		/parenleftex
		(LX)		(")			% synonym
		(LB)		/parenleftbt
		(lc)		/bracketlefttp
		(lx)		/bracketleftex
		(lf)		/bracketleftbt
		(lt)		/bracelefttp
		(lk)		/braceleftmid
		(lb)		/braceleftbt
		(bv)		/braceex
		(|)		(")			% synonym
		(b>)		/angleright
		(is)		/integral
		(---)		/integraltp
		(---)		/integralex
		(---)		/integralbt
		(RT)		/parenrighttp
		(RX)		/parenrightex
		(RB)		/parenrightbt
		(rc)		/bracketrighttp
		(rx)		/bracketrightex
		(rf)		/bracketrightbt
		(rt)		/bracerighttp
		(rk)		/bracerightmid
		(rb)		/bracerightbt
		(~=)		(55	0	1)	% charlib
	//End of SymbolCharset
}

SpecialCharset() {
	cat <<-'//End of SpecialCharset'
		(ru)	/underscore
		('')	/quotedblright		% devpost character
		(``)	/quotedblleft		% devpost character
		(dg)	/dagger			% devpost character
		(dd)	/daggerdbl		% devpost character
		(en)	/endash			% devpost character
		(\\-)	(")			% synonym
		(em)	/emdash
%		(ff)	(60	2	1)	% charlib
%		(Fi)	(84	2	1)	% charlib
%		(Fl)	(84	2	1)	% charlib
		(14)	(75	2	1)	% charlib
		(12)	(75	2	1)	% charlib
		(34)	(75	2	1)	% charlib
		(bx)	(50	2	1)	% charlib
		(ob)	(38	2	1)	% charlib
		(ci)	(75	0	1)	% charlib
		(sq)	(50	2	1)	% charlib
		(Sl)	(50	2	1)	% charlib
		(L1)	(110	1	1)	% charlib
		(LA)	(110	1	1)	% charlib
		(LV)	(110	3	1)	% charlib
		(LH)	(210	1	1)	% charlib
		(lh)	(100	0	1)	% charlib
		(rh)	(100	0	1)	% charlib
		(lH)	(100	0	1)	% charlib
		(rH)	(100	0	1)	% charlib
		(PC)	(220	2	1)	% charlib
		(DG)	(185	2	1)	% charlib
	//End of SpecialCharset
}

#
# Latin1 ensures a font uses the ISOLatin1Encoding vector, although only
# text fonts should be re-encoded. Downloading the Encoding vector doesn't
# often make sense. No ISOLatin1Encoding array likely means ROM based fonts
# on your printer are incomplete. Type 1 fonts with a full Latin1 character
# set appeared sometime after Version 50.0.
#

Latin1() {
	if [ "$DOWNLOADVECTOR" = TRUE ]; then
		cat <<-'//End of ISOLatin1Encoding'
			/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
				/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
		//End of ISOLatin1Encoding
	fi

	echo "ISOLatin1Encoding /$1 ReEncode"
}

#
# Generating functions output PostScript programs that build font width
# tables or a typesetter description file. Send the program to a printer
# and the complete table will come back on the serial port. All write on
# stdout and assume the prologue and other required PostScript files are
# all available.
#

Proportional() {
	echo "/unitwidth $UNITWIDTH def"
	echo "/resolution $RESOLUTION def"
	echo "/octalescapes $OCTALESCAPES def"
	echo "/charset ["
		# Get <>_ and | from S. Use accents for ascii ^ and ~.
		StandardCharset | awk '
			$1 == "(<)" && $2 == "/less" {$1 = "(---)"}
			$1 == "(>)" && $2 == "/greater" {$1 = "(---)"}
			$1 == "(_)" && $2 == "/underscore" {$1 = "(---)"}
			$1 == "(|)" && $2 == "/bar" {$1 = "(---)"}
			$1 == "(^)" && $2 == "/asciicircum" {
				printf "(^)\t/circumflex\n"
				$1 = "(---)"
			}
			$1 == "(~)" && $2 == "/asciitilde" {
				printf "(~)\t/tilde\n"
				$1 = "(---)"
			}
			{printf "%s\t%s\n", $1, $2}
		'
	echo "] def"

	Latin1 $2
	echo "/$2 SelectFont"
	echo "(opO) SetAscender"

	echo "(name $1\\\\n) Print"
	echo "(fontname $2\\\\n) Print"
	echo "/$1 NamedInPrologue"
	echo "(spacewidth ) Print 32 GetWidth Print (\n) Print"
	echo "(charset\\\\n) Print"
	echo "BuildFontCharset"
}

FixedWidth() {
	echo "/unitwidth $UNITWIDTH def"
	echo "/resolution $RESOLUTION def"
	echo "/octalescapes $OCTALESCAPES def"
	echo "/charset ["
		StandardCharset
	echo "] def"

	Latin1 $2
	echo "/$2 SelectFont"
	echo "(opO) SetAscender"

	echo "(name $1\\\\n) Print"
	echo "(fontname $2\\\\n) Print"
	echo "/$1 NamedInPrologue"
	echo "(spacewidth ) Print 32 GetWidth Print (\n) Print"
	echo "(charset\\\\n) Print"
	echo "BuildFontCharset"
}

Dingbats() {
	echo "/unitwidth $UNITWIDTH def"
	echo "/resolution $RESOLUTION def"
	echo "/octalescapes $OCTALESCAPES def"
	echo "/charset ["
		DingbatsCharset | awk '$1 != "(---)" && $2 ~ /^\/[a-zA-Z]/ {
			printf "%s\tISOLatin1Encoding %s GetCode\n", $1, $2
		}'
	echo "] def"

	echo "/$2 SelectFont"
	echo "(   ) SetAscender"

	echo "(name $1\\\\n) Print"
	echo "(fontname $2\\\\n) Print"
	echo "/$1 NamedInPrologue"
	echo "(charset\\\\n) Print"
	echo "BuildFontCharset"
}

Greek() {
	echo "/unitwidth $UNITWIDTH def"
	echo "/resolution $RESOLUTION def"
	echo "/charset ["
		SymbolCharset | awk '
			BEGIN {hit = -1}
			$1 ~ /\(\*[a-zA-Z]\)/ {print; hit = NR}
			$2 == "(\")" && hit == NR-1 {print; hit = NR}
		'
	echo "] def"

	echo "/$2 SelectFont"
	echo "(orO) SetAscender"

	echo "(name $1\\\\n) Print"
	echo "(fontname $2\\\\n) Print"
	echo "/$1 NamedInPrologue"
	echo "(spacewidth ) Print 32 GetWidth Print (\n) Print"
	echo "(charset\\\\n) Print"
	echo "BuildFontCharset"
}

Symbol() {
	echo "/unitwidth $UNITWIDTH def"
	echo "/resolution $RESOLUTION def"
	echo "/charset ["
		SymbolCharset
	echo "] def"

	echo "ChangeMetrics"
	echo "/S SelectFont"
	echo "(orO) SetAscender"

	echo "(name $1\\\\n) Print"
	echo "(fontname $2\\\\n) Print"
	echo "/$1 NamedInPrologue"
	echo "(special\\\\n) Print"
	echo "(charset\\\\n) Print"
	echo "BuildFontCharset"
}

Special() {
	echo "/unitwidth $UNITWIDTH def"
	echo "/resolution $RESOLUTION def"
	echo "/charset ["
		SpecialCharset
	echo "] def"

	echo "ChangeMetrics"
	echo "/S1 SelectFont"

	echo "(# Times-Roman special font\\\\n) Print"
	echo "(name $1\\\\n) Print"
	echo "(fontname $2\\\\n) Print"
	echo "/$1 NamedInPrologue"
	echo "(special\\\\n) Print"
	echo "(charset\\\\n) Print"
	echo "BuildFontCharset"
}

#
# The DESC file doesn't have to be built on a printer. It's only here for
# consistency.
#

Description() {
	echo "/charset ["	# awk - so the stack doesn't overflow
		StandardCharset | awk '$1 !~ /\(\\[0-9]/ {print $1}'
		SymbolCharset | awk '$1 !~ /\(\\[0-9]/ {print $1}'
		SpecialCharset | awk '$1 !~ /\(\\[0-9]/ {print $1}'
	echo "] def"

	cat <<-//DESC
		(#Device Description - utf character set

		PDL PostScript
		Encoding Latin1

		fonts 10 R I B BI CW H HI HB S1 S
		sizes 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
		23 24 25 26 27 28 29 30 31 32 33 34 35 36 38 40 42 44 46
		48 50 52 54 56 58 60 64 68 72 78 84 90 96 100 105 110 115
		120 125 130 135 140 145 150 155 160 0
		res $RESOLUTION
		hor 1
		vert 1
		unitwidth $UNITWIDTH

		) Print
	//DESC
	echo "(charset\\\\n) Print"
	echo "BuildDescCharset"
	echo "(\\\\n) Print"
}