#!/bin/rc # Generate a font to be used with troff & gs. # Run in a dir containing the source font split # into multiple Postscript Type 1 fonts like so: # 00.afm # 00.pfb # 01.afm # 01.pfb # ... # where the numbers represent the block of 256 codepoints # from the basic multilingual plane contained therein. rfork ne force = 0 if(~ $1 -f){ force = 1 shift } if(! ~ $#* 2){ echo usage: gentrofffont [-f] fontname TROFFNAME >[1=2] exit usage } postfontdir = /sys/lib/postscript/font subdir = `{pwd | sed 's;'^$postfontdir^'/;;'} posttroffdir = /sys/lib/postscript/troff troffdir = /sys/lib/troff/font/devutf gsdir = /sys/lib/ghostscript/font if(~ $force 0 && test -f $troffdir/$2){ echo troff font $2 already exists. Overwrite with -f. >[1=2] exit 'font already exists' } blocks = `{ls ??.afm | sed 's/([0-9a-f][0-9a-f]).afm/\1/'} if(~ $#blocks 0 || ! ~ $blocks(1) 00){ echo font files for $1 not found >[1=2] exit 'font files not found' } xh = `{awk '/^XHeight /{print $2}' 00.afm} > $troffdir/$2 {echo name $2 echo fontname $1 for(i in $blocks) awk 'BEGIN{ tolerance = 75 # Who needs two-char sequences when you can enter unicode directly? # Still, better include them in case macros &c. rely on them... dittotab["0022"] = "dq" dittotab["002d"] = "hy" dittotab["005c"] = "bs" dittotab["0060"] = "ga" dittotab["00a1"] = "!!" dittotab["00a2"] = "c|" dittotab["00a3"] = "L-" dittotab["00a4"] = "xo" dittotab["00a5"] = "Y-" dittotab["00a6"] = "||" dittotab["00a7"] = "so" dittotab["00a8"] = "\"\"" dittotab["00a9"] = "co" dittotab["00aa"] = "a_" dittotab["00ab"] = "<<" dittotab["00ac"] = "-," dittotab["00ae"] = "ro" dittotab["00af"] = "-^" dittotab["00b0"] = "0^" dittotab["00b1"] = "+-" dittotab["00b2"] = "2^" dittotab["00b3"] = "3^" dittotab["00b4"] = "aa" dittotab["00b5"] = "/u" dittotab["00b6"] = "pg" dittotab["00b7"] = ".^" dittotab["00b8"] = ",," dittotab["00b9"] = "1^" dittotab["00ba"] = "o_" dittotab["00bb"] = ">>" dittotab["00bc"] = "14" dittotab["00bd"] = "12" dittotab["00be"] = "34" dittotab["00bf"] = "??" dittotab["00c0"] = "A`" dittotab["00c1"] = "A''" dittotab["00c2"] = "A^" dittotab["00c3"] = "A~" dittotab["00c4"] = "A\"" dittotab["00c5"] = "A*" dittotab["00c6"] = "AE" dittotab["00c7"] = "C," dittotab["00c8"] = "E`" dittotab["00c9"] = "E''" dittotab["00ca"] = "E^" dittotab["00cb"] = "E\"" dittotab["00cc"] = "I`" dittotab["00cd"] = "I''" dittotab["00ce"] = "I^" dittotab["00cf"] = "I\"" dittotab["00d0"] = "D-" dittotab["00d1"] = "N~" dittotab["00d2"] = "O`" dittotab["00d3"] = "O''" dittotab["00d4"] = "O^" dittotab["00d5"] = "O~" dittotab["00d6"] = "O\"" dittotab["00d7"] = "xx" dittotab["00d8"] = "O/" dittotab["00d9"] = "U`" dittotab["00da"] = "U''" dittotab["00db"] = "U^" dittotab["00dc"] = "U\"" dittotab["00dd"] = "Y''" dittotab["00de"] = "TH" dittotab["00df"] = "ss" dittotab["00e0"] = "a`" dittotab["00e1"] = "a''" dittotab["00e2"] = "a^" dittotab["00e3"] = "a~" dittotab["00e4"] = "a\"" dittotab["00e5"] = "a*" dittotab["00e6"] = "ae" dittotab["00e7"] = "c," dittotab["00e8"] = "e`" dittotab["00e9"] = "e''" dittotab["00ea"] = "e^" dittotab["00eb"] = "e\"" dittotab["00ec"] = "i`" dittotab["00ed"] = "i''" dittotab["00ee"] = "i^" dittotab["00ef"] = "i\"" dittotab["00f0"] = "d-" dittotab["00f1"] = "n~" dittotab["00f2"] = "o`" dittotab["00f3"] = "o''" dittotab["00f4"] = "o^" dittotab["00f5"] = "o~" dittotab["00f6"] = "o\"" dittotab["00f7"] = "-:" dittotab["00f8"] = "o/" dittotab["00f9"] = "u`" dittotab["00fa"] = "u''" dittotab["00fb"] = "u^" dittotab["00fc"] = "u\"" dittotab["00fd"] = "y''" dittotab["00fe"] = "th" dittotab["00ff"] = "y\"" } /^C 32 ; WX [0-9]+ ; N space ; /{ printf "spacewidth %d\n", int(($5+5)/10) print "charset" next } /^C /{ code = sprintf("%s%.2x", ENVIRON["i"], $2) system("echo -n `{unicode "code"}") printf "\t%d", int(($5+5)/10) ascdesc = 0 # ascender/descender info if($12 < -tolerance) ascdesc++ if($14 > ENVIRON["xh"]+tolerance) ascdesc += 2 printf "\t%d\t0x%s\n", ascdesc, code if(dittotab[code] != "") printf "%s\t\"\n", dittotab[code] }' $i^'.afm'} echo created $troffdir/$2 >[1=2] > $posttroffdir/$2 {for(i in $blocks) echo '0x'^$i^'00 0x'^$i^'ff '^$1^$i} echo created $posttroffdir/$2 >[1=2] >> $postfontdir/fontmap {for(i in $blocks) echo $1^$i^' '^$subdir/$i.pfb} echo appended info to $postfontdir/fontmap >[1=2] cd $gsdir && mk echo rebuilt fontmap in $gsdir >[1=2]