summaryrefslogtreecommitdiff
path: root/fonts/utilities/vplutils
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /fonts/utilities/vplutils
Initial commit
Diffstat (limited to 'fonts/utilities/vplutils')
-rw-r--r--fonts/utilities/vplutils/Makefile79
-rw-r--r--fonts/utilities/vplutils/README41
-rw-r--r--fonts/utilities/vplutils/encodings/ASCII.enc50
-rw-r--r--fonts/utilities/vplutils/encodings/CMmathex.enc66
-rw-r--r--fonts/utilities/vplutils/encodings/CMmathit.enc50
-rw-r--r--fonts/utilities/vplutils/encodings/CMsymbol.enc57
-rw-r--r--fonts/utilities/vplutils/encodings/CMtext.enc50
-rw-r--r--fonts/utilities/vplutils/encodings/CMtextit.enc50
-rw-r--r--fonts/utilities/vplutils/encodings/CMtypewriter.enc50
-rw-r--r--fonts/utilities/vplutils/encodings/DC.enc80
-rw-r--r--fonts/utilities/vplutils/encodings/EC.enc88
-rw-r--r--fonts/utilities/vplutils/encodings/extex.enc79
-rw-r--r--fonts/utilities/vplutils/encodings/isolatin1.enc54
-rw-r--r--fonts/utilities/vplutils/encodings/standard.enc52
-rw-r--r--fonts/utilities/vplutils/encodings/symbol.enc58
-rw-r--r--fonts/utilities/vplutils/maketext19
-rw-r--r--fonts/utilities/vplutils/makevpl.man187
-rw-r--r--fonts/utilities/vplutils/makevpl.pl628
-rw-r--r--fonts/utilities/vplutils/parseenc.pl111
-rw-r--r--fonts/utilities/vplutils/parsepl.pl254
-rw-r--r--fonts/utilities/vplutils/paths.pl51
-rw-r--r--fonts/utilities/vplutils/spacevpl.man85
-rw-r--r--fonts/utilities/vplutils/spacevpl.pl349
23 files changed, 2588 insertions, 0 deletions
diff --git a/fonts/utilities/vplutils/Makefile b/fonts/utilities/vplutils/Makefile
new file mode 100644
index 0000000000..e087500cf6
--- /dev/null
+++ b/fonts/utilities/vplutils/Makefile
@@ -0,0 +1,79 @@
+# Makefile for VPL utilities
+# AJCD 24/9/93
+
+RELEASE=1.2
+
+BINMODE=0755
+MANMODE=0644
+CHMOD=chmod
+INSTALL=install -c -m $(BINMODE)
+INSTALLMAN=install -c -m $(MANMODE)
+RM=rm -f
+MKDIR=mkdir
+
+PERL=/usr/local/bin/perl
+SCRIPTDIR=/usr/local/bin
+MANDIR=/usr/local/share/man/man1
+MANEXT=1
+PERLLIBDIR=/usr/local/share/tex/vplutils/perl
+ENCODINGDIR=/usr/local/share/tex/vplutils/encodings
+
+PERLSCRIPTS = makevpl spacevpl
+PACKAGES = paths.pl parsepl.pl parseenc.pl
+MANPAGES = makevpl.$(MANEXT) spacevpl.$(MANEXT)
+ENCODINGS = encodings/ASCII.enc encodings/CMmathex.enc encodings/CMmathit.enc\
+ encodings/CMsymbol.enc encodings/CMtext.enc encodings/CMtextit.enc\
+ encodings/CMtypewriter.enc encodings/DC.enc encodings/EC.enc\
+ encodings/extex.enc encodings/isolatin1.enc encodings/standard.enc\
+ encodings/symbol.enc
+
+all: $(BIN) $(PERLSCRIPTS) $(MANPAGES) $(PACKAGES)
+
+makevpl: makevpl.pl
+ ./maketext @PERL@=$(PERL) @RELEASE@=$(RELEASE) \
+ @ENCODINGDIR@=$(ENCODINGDIR) @PERLLIBDIR@=$(PERLLIBDIR) $? >$@
+ $(CHMOD) $(BINMODE) $@
+
+makevpl.$(MANEXT): makevpl.man
+ ./maketext "@MAN@=$(MANPAGES)" @PERL@=$(PERL) @RELEASE@=$(RELEASE) \
+ @ENCODINGDIR@=$(ENCODINGDIR) @PERLLIBDIR@=$(PERLLIBDIR) $? >$@
+
+spacevpl: spacevpl.pl
+ ./maketext @PERL@=$(PERL) @RELEASE@=$(RELEASE) \
+ @ENCODINGDIR@=$(ENCODINGDIR) @PERLLIBDIR@=$(PERLLIBDIR) $? >$@
+ $(CHMOD) $(BINMODE) $@
+
+spacevpl.$(MANEXT): spacevpl.man
+ ./maketext "@MAN@=$(MANPAGES)" @PERL@=$(PERL) @RELEASE@=$(RELEASE) \
+ @ENCODINGDIR@=$(ENCODINGDIR) @PERLLIBDIR@=$(PERLLIBDIR) $? >$@
+
+clean:
+ $(RM) $(PERLSCRIPTS) $(MANPAGES)
+
+install: install.script install.packages install.man install.encodings
+
+install.script: $(PERLSCRIPTS)
+ @for i in $(PERLSCRIPTS); do \
+ echo Installing $$i; \
+ $(INSTALL) $$i $(SCRIPTDIR); \
+ done
+
+install.encodings: $(ENCODINGS)
+ -mkdir $(ENCODINGDIR)
+ @for i in $(ENCODINGS); do \
+ echo Installing $$i; \
+ $(INSTALLMAN) $$i $(ENCODINGDIR); \
+ done
+
+install.packages: $(PACKAGES)
+ -mkdir $(PERLLIBDIR)
+ @for i in $(PACKAGES); do \
+ echo Installing $$i; \
+ $(INSTALLMAN) $$i $(PERLLIBDIR); \
+ done
+
+install.man: $(MANPAGES)
+ @for i in $(MANPAGES); do \
+ echo Installing manual page for $$i; \
+ $(INSTALLMAN) $$i $(MANDIR)/$$i; \
+ done
diff --git a/fonts/utilities/vplutils/README b/fonts/utilities/vplutils/README
new file mode 100644
index 0000000000..a80def2649
--- /dev/null
+++ b/fonts/utilities/vplutils/README
@@ -0,0 +1,41 @@
+VPL Utilities Angus Duggan 25th September 1993
+
+This directory contains the first in a suite of tools to manipulate TeX
+property list and virtual property list files. More tools may be added as the
+need arises :-) These tools are copyright (C) Angus Duggan 1993, but may be
+re-distributed freely and used for any purpose (including distribution as part
+of a for-profit product) provided that:
+
+1) The original attribution of the programs is clearly displayed in the product
+ and/or documentation, even if the programs are modified and/or renamed as
+ part of the product.
+
+2) The original source code of the programs is provided free of charge (except
+ for reasonable distribution costs). For a definition of reasonable
+ distribution costs, see the Gnu General Public License or Larry Wall's
+ Artistic License (provided with the Perl 4 kit). The GPL and Artistic
+ License in NO WAY affect this license; they are merely used as examples of
+ the spirit in which it is intended.
+
+3) These programs are provided "as-is". No warranty or guarantee of their
+ fitness for any particular task is provided. Use of these programs is
+ completely at your own risk.
+
+The package contains:
+
+SCRIPTS
+ makevpl Merges PL and VPL files, creating a VPL file.
+ spacevpl Alters the spacing in a PL or VPL file.
+
+FILES
+ paths.pl Perl package for expanding and searching paths
+ parsepl.pl Perl package for parsing PL and VPL files
+ parseenc.pl Perl package for parsing encoding vectors
+ encodings/* Encoding vectors for various TeX and other encodings.
+
+INSTALLATION
+ Edit the PERL, PERLLIBDIR, SCRIPTDIR, MANDIR, MANEXT and ENCODINGDIR
+macros in the Makefile, and "make install".
+
+BUGS
+ None that I know of :-)
diff --git a/fonts/utilities/vplutils/encodings/ASCII.enc b/fonts/utilities/vplutils/encodings/ASCII.enc
new file mode 100644
index 0000000000..b6ee96db82
--- /dev/null
+++ b/fonts/utilities/vplutils/encodings/ASCII.enc
@@ -0,0 +1,50 @@
+% This is the ASCII encoding scheme
+%
+/ASCIIEncoding [
+% 0x00
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0x10
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0x20
+ /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright
+ /parenleft /parenright /asterisk /plus /comma /minus /period /slash
+% 0x30
+ /zero /one /two /three /four /five /six /seven
+ /eight /nine /colon /semicolon /less /equal /greater /question
+% 0x40
+ /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O
+% 0x50
+ /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash /bracketright
+ /asciicircum /underscore
+% 0x60
+ /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o
+% 0x70
+ /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar /braceright /asciitilde
+ /.notdef
+% 0x80
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0x90
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xA0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xB0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xC0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xD0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xE0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xF0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+] def
diff --git a/fonts/utilities/vplutils/encodings/CMmathex.enc b/fonts/utilities/vplutils/encodings/CMmathex.enc
new file mode 100644
index 0000000000..97f0ffb00d
--- /dev/null
+++ b/fonts/utilities/vplutils/encodings/CMmathex.enc
@@ -0,0 +1,66 @@
+% Computer Modern Math Extension encoding vector
+/CMMathExtensionEncoding [
+% 0x00
+ /bigparenleft /bigparenright /bigbracketleft /bigbracketright
+ /bigfloorleft /bigfloorright /bigceilingleft /bigceilingright
+ /bigbraceleft /bigbraceright /bigangleleft /bigangleright /vertex
+ /vertdblex /bigslash /bigbackslash
+% 0x10
+ /Bigparenleft /Bigparenright /biggparenleft /biggparenright
+ /biggbracketleft /biggbracketright /biggfloorleft /biggfloorright
+ /biggceilingleft /biggceilingright /biggbraceleft /biggbraceright
+ /biggangleleft /biggangleright /biggslash /biggbackslash
+% 0x20
+ /Biggparenleft /Biggparenright /Biggbracketleft /Biggbracketright
+ /Biggfloorleft /Biggfloorright /Biggceilingleft /Biggceilingright
+ /Biggbraceleft /Biggbraceright /Biggangleleft /Biggangleright
+ /Biggslash /Biggbackslash /Bigslash /Bigbackslash
+% 0x30
+ /parenlefttp /parenrighttp /bracketlefttp /bracketrighttp /bracketleftbt
+ /bracketrighttp /bracketleftex /bracketrightex /bracelefttp /bracerighttp
+ /braceleftbt /bracerightbt /braceleftmid /bracerightmid /braceex
+ /arrowvertex
+% 0x40
+ /parenleftbt /parenrightbt /parenleftex /parenrightex /Bigleftangle
+ /Bigrightangle /unionsq /bigunionsq /loopintegral /bigloopintegral
+ /circledot /bigcircledot /circleplus /bigcircleplus /circlemultiply
+ /bigcirclemultiply
+% 0x50
+ /summation /product /integral /union /intersection /unionplus /logicaland
+ /logicalor /bigsummation /bigproduct /bigintegral /bigunion
+ /bigintersection /bigunionplus /biglogicaland /biglogicalor
+% 0x60
+ /productdown /bigproductdown /bigcircumflex /Bigcircumflex /biggcircumflex
+ /bigtilde /Bigtilde /biggtilde /Bigbracketleft /Bigbracketright
+ /Bigfloorleft /Bigfloorright /Bigceilingleft /Bigceilingright /Bigbraceleft
+ /Bigbraceright
+% 0x70
+ /radical /bigradical /Bigradical /biggradical /radicalbt
+ /radicalvertex /radicalcornerex /arrowdblvertex /arrowup /arrowdown
+ /bracetopleft /bracetopright /bracebotleft /bracebotright /arrowdblup
+ /arrowdbldown
+% 0x80
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0x90
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xA0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xB0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xC0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xD0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xE0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xF0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+] def
diff --git a/fonts/utilities/vplutils/encodings/CMmathit.enc b/fonts/utilities/vplutils/encodings/CMmathit.enc
new file mode 100644
index 0000000000..ef6f374303
--- /dev/null
+++ b/fonts/utilities/vplutils/encodings/CMmathit.enc
@@ -0,0 +1,50 @@
+% Computer Modern Math Italic encoding vector
+/CMMathItalicEncoding [
+% 0x00
+ /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon1
+ /Phi /Psi /Omega /alpha /beta /gamma /delta /epsilon1
+% 0x10
+ /zeta /eta /theta /iota /kappa /lambda /mu /nu
+ /xi /pi /rho /sigma /tau /upsilon /phi /chi
+% 0x20
+ /psi /omega /epsilon /theta1 /omega1 /rho1 /sigma1 /phi1
+ /halfarrowtopleft /halfarrowbotleft /halfarrowtopright /halfarrowbotright
+ /lefthook /righthook /triangleright /triangleleft
+% 0x30
+ /zerooldstyle /oneoldstyle /twooldstyle /threeoldstyle /fouroldstyle
+ /fiveoldstyle /sixoldstyle /sevenoldstyle /eightoldstyle /nineoldstyle
+ /period /comma /less /slash /greater /asteriskmath
+% 0x40
+ /partialdiff /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O
+% 0x50
+ /P /Q /R /S /T /U /V /W /X /Y /Z /flat /natural /sharp /slurbot /slurtop
+% 0x60
+ /lscript /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o
+% 0x70
+ /p /q /r /s /t /u /v /w /x /y /z /dotlessi /dotlessj /weierstrass
+ /vectoraccent /tieaccent
+% 0x80
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0x90
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xA0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xB0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xC0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xD0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xE0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xF0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+] def
diff --git a/fonts/utilities/vplutils/encodings/CMsymbol.enc b/fonts/utilities/vplutils/encodings/CMsymbol.enc
new file mode 100644
index 0000000000..383ed8ae36
--- /dev/null
+++ b/fonts/utilities/vplutils/encodings/CMsymbol.enc
@@ -0,0 +1,57 @@
+% Computer Modern Symbol encoding vector
+/CMSymbolEncoding [
+% 0x00
+ /minus /dotmath /multiply /mathasterisk /divide /lozenge
+ /plusminus /minusplus /circleplus /circleminus /circlemultiply
+ /circleslash /circledot /bigcircle /smallcircle /bullet
+% 0x10
+ /asymptotic /equivalence /reflexsubset /reflexsuperset /lessequal
+ /greaterequal /precedeequal /succeedequal /similar /approxequal /propsubset
+ /propsuperset /lessless /greatergreater /precede /succeed
+% 0x20
+ /arrowleft /arrowright /arrowup /arrowdown /arrowboth /arrowupright
+ /arrowdownright /similarequal /arrowdblleft /arrowdblright /arrowdblup
+ /arrowdbldown /arrowdblboth /arrowupleft /arrowdownleft /proportional
+% 0x30
+ /prime /infinity /element /suchthat /triangleup /triangledown /fraction
+ /mapsto /universal /existential /logicalnot /emptyset /Rfraktur /Ifraktur
+ /perpendiculardown /perpendicular
+% 0x40
+ /aleph /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O
+% 0x50
+ /P /Q /R /S /T /U /V /W /X /Y /Z /union /intersection /unionplus
+ /logicaland /logicalor
+% 0x60
+ /perpendicularright /perpendicularleft /floorleft /floorright
+ /ceilingleft /ceilingright /braceleft /braceright /angleleft
+ /angleright /bar /bardbl /arrowbothvert /arrowdblbothvert /setminus
+ /wreath
+% 0x70
+ /radical /productdown /gradient /integral /unionsq /intersectionsq
+ /subseteqsq /superseteqsq /section /dagger /daggerdbl /paragraph /club
+ /diamond /heart /spade
+% 0x80
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0x90
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xA0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xB0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xC0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xD0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xE0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xF0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+] def
diff --git a/fonts/utilities/vplutils/encodings/CMtext.enc b/fonts/utilities/vplutils/encodings/CMtext.enc
new file mode 100644
index 0000000000..47c0b3d8a8
--- /dev/null
+++ b/fonts/utilities/vplutils/encodings/CMtext.enc
@@ -0,0 +1,50 @@
+% Computer Modern Text encoding vector
+/CMTextEncoding [
+% 0x00
+ /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon1
+ /Phi /Psi /Omega /ff /fi /fl /ffi /ffl
+% 0x10
+ /dotlessi /dotlessj /grave /acute /caron /breve /macron /ring
+ /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash
+% 0x20
+ /slashaccent /exclam /quotedbl /numbersign /dollar /percent /ampersand
+ /quoteright /parenleft /parenright /asterisk /plus /comma /hyphen /period
+ /slash
+% 0x30
+ /zero /one /two /three /four /five /six /seven
+ /eight /nine /colon /semicolon /exclamdown /equal /questiondown /question
+% 0x40
+ /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O
+% 0x50
+ /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /quotedblleft /bracketright
+ /circumflex /dotaccent
+% 0x60
+ /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o
+% 0x70
+ /p /q /r /s /t /u /v /w /x /y /z /endash /emdash /hungarumlaut /tilde
+ /dieresis
+% 0x80
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0x90
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xA0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xB0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xC0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xD0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xE0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xF0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+] def
diff --git a/fonts/utilities/vplutils/encodings/CMtextit.enc b/fonts/utilities/vplutils/encodings/CMtextit.enc
new file mode 100644
index 0000000000..8fe718cbe9
--- /dev/null
+++ b/fonts/utilities/vplutils/encodings/CMtextit.enc
@@ -0,0 +1,50 @@
+% Computer Modern Text Italic encoding vector
+/CMTextItalicEncoding [
+% 0x00
+ /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon1
+ /Phi /Psi /Omega /ff /fi /fl /ffi /ffl
+% 0x10
+ /dotlessi /dotlessj /grave /acute /caron /breve /macron /ring
+ /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash
+% 0x20
+ /slashaccent /exclam /quotedbl /numbersign /sterling /percent /ampersand
+ /quoteright /parenleft /parenright /asterisk /plus /comma /hyphen /period
+ /slash
+% 0x30
+ /zero /one /two /three /four /five /six /seven
+ /eight /nine /colon /semicolon /exclamdown /equal /questiondown /question
+% 0x40
+ /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O
+% 0x50
+ /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /quotedblleft /bracketright
+ /circumflex /dotaccent
+% 0x60
+ /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o
+% 0x70
+ /p /q /r /s /t /u /v /w /x /y /z /endash /emdash /hungarumlaut /tilde
+ /dieresis
+% 0x80
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0x90
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xA0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xB0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xC0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xD0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xE0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xF0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+] def
diff --git a/fonts/utilities/vplutils/encodings/CMtypewriter.enc b/fonts/utilities/vplutils/encodings/CMtypewriter.enc
new file mode 100644
index 0000000000..906d2d7ab7
--- /dev/null
+++ b/fonts/utilities/vplutils/encodings/CMtypewriter.enc
@@ -0,0 +1,50 @@
+% Computer Modern Typewriter encoding vector
+/CMTypewriterEncoding [
+% 0x00
+ /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon1
+ /Phi /Psi /Omega /arrowup /arrowdown /quotesingle /exclamdown /questiondown
+% 0x10
+ /dotlessi /dotlessj /grave /acute /caron /breve /macron /ring
+ /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash
+% 0x20
+ /visiblespace /exclam /quotedbl /numbersign /dollar /percent /ampersand
+ /quoteright /parenleft /parenright /asterisk /plus /comma /hyphen /period
+ /slash
+% 0x30
+ /zero /one /two /three /four /five /six /seven
+ /eight /nine /colon /semicolon /less /equal /greater /question
+% 0x40
+ /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O
+% 0x50
+ /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash /bracketright
+ /circumflex /underscore
+% 0x60
+ /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o
+% 0x70
+ /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar /braceright /tilde
+ /dieresis
+% 0x80
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0x90
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xA0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xB0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xC0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xD0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xE0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xF0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+] def
diff --git a/fonts/utilities/vplutils/encodings/DC.enc b/fonts/utilities/vplutils/encodings/DC.enc
new file mode 100644
index 0000000000..4d23e0bb03
--- /dev/null
+++ b/fonts/utilities/vplutils/encodings/DC.enc
@@ -0,0 +1,80 @@
+%
+% This is the DC encoding.
+%
+% These are the ligs and kerns in addition to those found in the
+% AFM file. (The only ligs in the Times-Roman.afm file are the
+% fi and fl ligatures.)
+%
+% LIGKERN space l =: lslash ; space L =: Lslash ;
+% LIGKERN question quoteleft =: questiondown ; exclam quoteleft =: exclamdown ;
+% LIGKERN hyphen hyphen =: endash ; endash hyphen =: emdash ;
+% LIGKERN quoteleft quoteleft =: quotedblleft ;
+% LIGKERN quoteright quoteright =: quotedblright ;
+%
+% We blow away kerns to and from spaces (TeX doesn't have a
+% space) and also remove any kerns from the numbers (although
+% the only kern pair that mentions a number in Times-Roman.afm
+% is one one.)
+%
+% LIGKERN space {} * ; * {} space ; zero {} * ; * {} zero ;
+% LIGKERN one {} * ; * {} one ; two {} * ; * {} two ;
+% LIGKERN three {} * ; * {} three ; four {} * ; * {} four ;
+% LIGKERN five {} * ; * {} five ; six {} * ; * {} six ;
+% LIGKERN seven {} * ; * {} seven ; eight {} * ; * {} eight ;
+% LIGKERN nine {} * ; * {} nine ;
+% LIGKERN comma comma =: quotedblbase ; less less =: guillemotleft ;
+% LIGKERN greater greater =: guillemotright ;
+%
+/DCEncoding [ % now 256 chars follow
+% 0x00
+ /grave /acute /circumflex /tilde /dieresis /hungarumlaut /ring /caron
+ /breve /macron /dotaccent /cedilla
+ /ogonek /quotesinglbase /guilsinglleft /guilsinglright
+% 0x10
+ /quotedblleft /quotedblright /quotedblbase /guillemotleft
+ /guillemotright /endash /emdash /.notdef
+ /zeroinferior /dotlessi /dotlessj /ff /fi /fl /ffi /ffl
+% 0x20
+ /.notdef /exclam /quotedbl /numbersign
+ /dollar /percent /ampersand /quoteright
+ /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash
+% 0x30
+ /zero /one /two /three /four /five /six /seven
+ /eight /nine /colon /semicolon /less /equal /greater /question
+% 0x40
+ /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O
+% 0x50
+ /P /Q /R /S /T /U /V /W
+ /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore
+% 0x60
+ /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o
+% 0x70
+ /p /q /r /s /t /u /v /w
+ /x /y /z /braceleft /bar /braceright /asciitilde /hyphen
+% 0x80
+ /Abreve /Aogonek /Cacute /Ccaron /Dcaron /Ecaron /Eogonek /Gbreve
+ /Lacute /Lcaron /Lslash /Nacute /Ncaron /Ng /Ohungarumlaut /Racute
+% 0x90
+ /Rcaron /Sacute /Scaron /Scedilla /Tcaron /Tcedilla /Uhungarumlaut /Uring
+ /Ldot /Zacute /Zcaron /Zdotaccent /IJ /Idotaccent /dbar /section
+% 0xA0
+ /abreve /aogonek /cacute /ccaron /dcaron /ecaron /eogonek /gbreve
+ /lacute /lcaron /lslash /nacute /ncaron /ng /ohungarumlaut /racute
+% 0xB0
+ /rcaron /sacute /scaron /scedilla /tcaron /tcedilla /uhungarumlaut /uring
+ /ldot /zacute /zcaron /zdotaccent /ij /exclamdown /questiondown /sterling
+% 0xC0
+ /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla
+ /Egrave /Eacute /Ecircumflex /Edieresis
+ /Igrave /Iacute /Icircumflex /Idieresis
+% 0xD0
+ /Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /OE
+ /Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /SS
+% 0xE0
+ /agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla
+ /egrave /eacute /ecircumflex /edieresis
+ /igrave /iacute /icircumflex /idieresis
+% 0xF0
+ /eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /oe
+ /oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /germandbls
+] def
diff --git a/fonts/utilities/vplutils/encodings/EC.enc b/fonts/utilities/vplutils/encodings/EC.enc
new file mode 100644
index 0000000000..cbf1e18cbf
--- /dev/null
+++ b/fonts/utilities/vplutils/encodings/EC.enc
@@ -0,0 +1,88 @@
+%
+% This is the EC encoding.
+%
+% These are the ligs and kerns in addition to those found in the
+% AFM file. (The only ligs in the Times-Roman.afm file are the
+% fi and fl ligatures.)
+%
+% LIGKERN space l =: lslash ; space L =: Lslash ;
+% LIGKERN question quoteleft =: questiondown ; exclam quoteleft =: exclamdown ;
+% LIGKERN hyphen hyphen =: endash ; endash hyphen =: emdash ;
+% LIGKERN quoteleft quoteleft =: quotedblleft ;
+% LIGKERN quoteright quoteright =: quotedblright ;
+%
+% We blow away kerns to and from spaces (TeX doesn't have a
+% space) and also remove any kerns from the numbers (although
+% the only kern pair that mentions a number in Times-Roman.afm
+% is one one.)
+%
+% LIGKERN space {} * ; * {} space ; 0 {} * ; * {} 0 ;
+% LIGKERN 1 {} * ; * {} 1 ; 2 {} * ; * {} 2 ; 3 {} * ; * {} 3 ;
+% LIGKERN 4 {} * ; * {} 4 ; 5 {} * ; * {} 5 ; 6 {} * ; * {} 6 ;
+% LIGKERN 7 {} * ; * {} 7 ; 8 {} * ; * {} 8 ; 9 {} * ; * {} 9 ;
+% LIGKERN comma comma =: quotedblbase ; less less =: guillemotleft ;
+% LIGKERN greater greater =: guillemotright ;
+%
+% 0x18 should be a small zero which you can put after a percent sign
+% to make it look like perthousand, but since that character is not
+% available and perthousand is, we put perthousand into 0x18 and add
+% a ligature to achieve the same result.
+%
+% LIGKERN percent perthousand =: perthousand ;
+%
+/ECEncoding [ % now 256 chars follow
+% 0x00
+ /grave /acute /circumflex /tilde /dieresis /hungarumlaut /ring /caron
+ /breve /macron /dotaccent /cedilla
+ /ogonek /quotesinglbase /guilsinglleft /guilsinglright
+% 0x10
+ /quotedblleft /quotedblright /quotedblbase /guillemotleft
+ /guillemotright /endash /emdash /compoundwordmark
+ /perthousand /dotlessi /dotlessj /ff /fi /fl /ffi /ffl
+% 0x20
+ /visiblespace /exclam /quotedbl /numbersign
+ /dollar /percent /ampersand /quoteright
+ /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash
+% 0x30
+ /zero /one /two /three /four /five /six /seven
+ /eight /nine /colon /semicolon /less /equal /greater /question
+% 0x40
+ /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O
+% 0x50
+ /P /Q /R /S /T /U /V /W
+ /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore
+% 0x60
+ /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o
+% 0x70
+ /p /q /r /s /t /u /v /w
+ /x /y /z /braceleft /bar /braceright /asciitilde /hyphen
+% 0x80
+ /Abreve /Aogonek /Cacute /Ccaron /Dcaron /Ecaron /Eogonek /Gbreve
+ /Lacute /Lquoteright /Lslash /Nacute /Ncaron /Eng /Ohungarumlaut /Racute
+% 0x90
+ /Rcaron /Sacute /Scaron /Scedilla /Tcaron /Tcedilla /Uhungarumlaut /Uring
+ /Ydieresis /Zacute /Zcaron /Zdotaccent /IJ /Idotaccent /dbar /section
+% 0xA0
+ /abreve /aogonek /cacute /ccaron /dquoteright /ecaron /eogonek /gbreve
+ /lacute /lquoteright /lslash /nacute /ncaron /eng /ohungarumlaut /racute
+% 0xB0
+ /rcaron /sacute /scaron /scedilla
+ /tquoteright /tcedilla /uhungarumlaut /uring
+ /ydieresis /zacute /zcaron /zdotaccent
+ /ij /exclamdown /questiondown /sterling
+% 0xC0
+ /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla
+ /Egrave /Eacute /Ecircumflex /Edieresis
+ /Igrave /Iacute /Icircumflex /Idieresis
+% 0xD0
+ /Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /OE
+ /Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /Germandbls
+% 0xE0
+ /agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla
+ /egrave /eacute /ecircumflex /edieresis
+ /igrave /iacute /icircumflex /idieresis
+% 0xF0
+ /eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /oe
+ /oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /germandbls
+] def
+
diff --git a/fonts/utilities/vplutils/encodings/extex.enc b/fonts/utilities/vplutils/encodings/extex.enc
new file mode 100644
index 0000000000..730479cead
--- /dev/null
+++ b/fonts/utilities/vplutils/encodings/extex.enc
@@ -0,0 +1,79 @@
+%
+% This is the extended TeX encoding.
+%
+% These are the ligs and kerns in addition to those found in the
+% AFM file. (The only ligs in the Times-Roman.afm file are the
+% fi and fl ligatures.)
+%
+% LIGKERN space l =: lslash ; space L =: Lslash ;
+% LIGKERN question quoteleft =: questiondown ; exclam quoteleft =: exclamdown ;
+% LIGKERN hyphen hyphen =: endash ; endash hyphen =: emdash ;
+% LIGKERN quoteleft quoteleft =: quotedblleft ;
+% LIGKERN quoteright quoteright =: quotedblright ;
+%
+% We blow away kerns to and from spaces (TeX doesn't have a
+% space) and also remove any kerns from the numbers (although
+% the only kern pair that mentions a number in Times-Roman.afm
+% is one one.)
+%
+% LIGKERN space {} * ; * {} space ; zero {} * ; * {} zero ;
+% LIGKERN one {} * ; * {} one ; two {} * ; * {} two ;
+% LIGKERN three {} * ; * {} three ; four {} * ; * {} four ;
+% LIGKERN five {} * ; * {} five ; six {} * ; * {} six ;
+% LIGKERN seven {} * ; * {} seven ; eight {} * ; * {} eight ;
+% LIGKERN nine {} * ; * {} nine ;
+% LIGKERN comma coma =: quotedblbase ; less less =: guillemotleft ;
+% LIGKERN greater greater =: guillemotright ;
+%
+/ExtendedTeXEncoding [ % now 256 chars follow
+% 0x00
+ /grave /acute /circumflex /tilde /dieresis /hungarumlaut /ring /caron
+ /breve /macron /dotaccent /cedilla
+ /ogonek /quotesinglbase /guilsinglleft /guilsinglright
+% 0x10
+ /quotedblleft /quotedblright /quotedblbase /guillemotleft
+ /guillemotright /endash /emdash /cwm
+ /zeroinferior /dotlessi /dotlessj /ff /fi /fl /ffi /ffl
+% 0x20
+ /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright
+ /parenleft /parenright /asterisk /plus /comma /minus /period /slash
+% 0x30
+ /zero /one /two /three /four /five /six /seven
+ /eight /nine /colon /semicolon /less /equal /greater /question
+% 0x40
+ /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O
+% 0x50
+ /P /Q /R /S /T /U /V /W
+ /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore
+% 0x60
+ /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o
+% 0x70
+ /p /q /r /s /t /u /v /w
+ /x /y /z /braceleft /bar /braceright /asciitilde /hyphen
+% 0x80
+ /Abreve /Aogonek /Cacute /Ccaron /Dcaron /Ecaron /Eogonek /Gbreve
+ /Lacute /Lcaron /Lslash /Nacute /Ncaron /Eng /Ohungarumlaut /Racute
+% 0x90
+ /Rcaron /Sacute /Scaron /Scedilla /Tcaron /Tcedilla /Uhungarumlaut /Uring
+ /Ydieresis /Zacute /Zcaron /Zdot /IJ /Idot /dstroke /paragraph
+% 0xA0
+ /abreve /aogonek /cacute /ccaron /dcaron /ecaron /eogonek /gbreve
+ /lacute /lcaron /lslash /nacute /ncaron /eng /ohungarumlaut /racute
+% 0xB0
+ /rcaron /sacute /scaron /scedilla /tcaron /tcedilla /uhungarumlaut /uring
+ /ydieresis /zacute /zcaron /zdot /ij /exclamdown /questiondown /sterling
+% 0xC0
+ /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla
+ /Egrave /Eacute /Ecircumflex /Edieresis
+ /Igrave /Iacute /Icircumflex /Idieresis
+% 0xD0
+ /Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /OE
+ /Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /Germandbls
+% 0xE0
+ /agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla
+ /egrave /eacute /ecircumflex /edieresis
+ /igrave /iacute /icircumflex /idieresis
+% 0xF0
+ /eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /oe
+ /oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /germandbls
+] def
diff --git a/fonts/utilities/vplutils/encodings/isolatin1.enc b/fonts/utilities/vplutils/encodings/isolatin1.enc
new file mode 100644
index 0000000000..e5c8d742ed
--- /dev/null
+++ b/fonts/utilities/vplutils/encodings/isolatin1.enc
@@ -0,0 +1,54 @@
+% This is the ISO 8859-1 (Latin-1) encoding vector
+%
+/ISOLatin1Encoding [
+% 0x00
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0x10
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0x20
+ /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright
+ /parenleft /parenright /asterisk /plus /comma /minus /period /slash
+% 0x30
+ /zero /one /two /three /four /five /six /seven
+ /eight /nine /colon /semicolon /less /equal /greater /question
+% 0x40
+ /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O
+% 0x50
+ /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash /bracketright
+ /asciicircum /underscore
+% 0x60
+ /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o
+% 0x70
+ /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar /braceright /asciitilde
+ /.notdef
+% 0x80
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0x90
+ /dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent
+ /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron
+% 0xA0
+ /space /exclamdown /cent /sterling /currency /yen /brokenbar /section
+ /dieresis /copyright /ordfeminine /guillemotleft /logicalnot /hyphen
+ /registered /macron
+% 0xB0
+ /degree /plusminus /twosuperior /threesuperior /acute /mu /paragraph
+ /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright
+ /onequarter /onehalf /threequarters /questiondown
+% 0xC0
+ /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla
+ /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex
+ /Idieresis
+% 0xD0
+ /Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply
+ /Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls
+% 0xE0
+ /agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla
+ /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex
+% 0xF0
+ /idieresis /eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis
+ /divide /oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn
+ /ydieresis
+] def
diff --git a/fonts/utilities/vplutils/encodings/standard.enc b/fonts/utilities/vplutils/encodings/standard.enc
new file mode 100644
index 0000000000..028ec4e4aa
--- /dev/null
+++ b/fonts/utilities/vplutils/encodings/standard.enc
@@ -0,0 +1,52 @@
+% This is the Adobe standard encoding scheme
+%
+/StandardEncoding [
+% 0x00
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0x10
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0x20
+ /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright
+ /parenleft /parenright /asterisk /plus /comma /minus /period /slash
+% 0x30
+ /zero /one /two /three /four /five /six /seven
+ /eight /nine /colon /semicolon /less /equal /greater /question
+% 0x40
+ /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O
+% 0x50
+ /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash /bracketright
+ /asciicircum /underscore
+% 0x60
+ /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o
+% 0x70
+ /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar /braceright /asciitilde
+ /.notdef
+% 0x80
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0x90
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xA0
+ /.notdef /exclamdown /cent /sterling /fraction /yen /florin /section
+ /currency /quotesingle /quotedblleft /guillemotleft /guilsinglleft
+ /guilsinglright /fi /fl
+% 0xB0
+ /.notdef /endash /dagger /daggerdbl /periodcentered /.notdef /paragraph
+ /bullet /quotesinglbase /quotedblbase /quotedblright /guillemotright
+ /ellipsis /perthousand /.notdef /questiondown
+% 0xC0
+ /.notdef /grave /acute /circumflex /tilde /macron /breve /dotaccent
+ /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron
+% 0xD0
+ /emdash /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xE0
+ /.notdef /AE /.notdef /ordfeminine /.notdef /.notdef /.notdef /.notdef
+ /Lslash /Oslash /OE /ordmasculine /.notdef /.notdef /.notdef /.notdef
+% 0xF0
+ /.notdef /ae /.notdef /.notdef /.notdef /dotlessi /.notdef /.notdef
+ /lslash /oslash /oe /germandbls /.notdef /.notdef /.notdef /.notdef
+] def
diff --git a/fonts/utilities/vplutils/encodings/symbol.enc b/fonts/utilities/vplutils/encodings/symbol.enc
new file mode 100644
index 0000000000..40c97e08ef
--- /dev/null
+++ b/fonts/utilities/vplutils/encodings/symbol.enc
@@ -0,0 +1,58 @@
+% Adobe Symbol encoding vector
+/SymbolEncoding [
+% 0x00
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0x10
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0x20
+ /space /exclam /universal /numbersign /existential /percent /ampersand
+ /suchthat /parenleft /parenright /mathasterisk /plus /comma /minus /period
+ /slash
+% 0x30
+ /zero /one /two /three /four /five /six /seven /eight /nine /colon
+ /semicolon /less /equal /greater /question
+% 0x40
+ /congruent /Alpha /Beta /Chi /Delta /Epsilon /Phi /Gamma /Eta /Iota /theta1
+ /Kappa /Lambda /Mu /Nu /Omicron
+% 0x50
+ /Pi /Theta /Rho /Sigma /Tau /Upsilon /sigma1 /Omega /Xi /Psi /Zeta
+ /bracketleft /therefore /bracketright /perpendicular /underscore
+% 0x60
+ /radicalex /alpha /beta /chi /delta /epsilon /phi /gamma /eta /iota /phi1
+ /kappa /lambda /mu /nu /omicron
+% 0x70
+ /pi /theta /rho /sigma /tau /upsilon /omega1 /omega /xi /psi /zeta
+ /braceleft /bar /braceright /similar /.notdef
+% 0x80
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0x90
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% 0xA0
+ /.notdef /Upsilon1 /minute /lessequal /fraction /infinity /florin /club
+ /diamond /heart /spade /arrowboth /arrowleft /arrowup /arrowright /arrowdown
+% 0xB0
+ /degree /plusminus /second /greaterequal /multiply /proportional
+ /partialdiff /bullet /divide /notequal /equivalence /approxequal /ellipsis
+ /arrowvertex /arrowhorizex /carriagereturn
+% 0xC0
+ /aleph /Ifraktur /Rfraktur /weierstrass /circlemultiply /circleplus
+ /emptyset /intersection /union /propsuperset /reflexsuperset /notsubset
+ /propsubset /reflexsubset /element /notelement
+% 0xD0
+ /angle /gradient /registeredserif /copyrightserif /trademarkserif /product
+ /radical /dotmath /logicalnot /logicaland /logicalor /arrowdblboth
+ /arrowdblleft /arrowdblup /arrowdblright /arrowdbldown
+% 0xE0
+ /lozenge /angleleft /registeredsans /copyrightsans /trademarksans
+ /summation /parenlefttp /parenleftex /parenleftbt /bracketlefttp
+ /bracketleftex /bracketleftbt /bracelefttp /braceleftmid /braceleftbt
+ /braceex
+% 0xF0
+ /.notdef /angleright /integral /integraltp /integralex /integralbt
+ /parenrighttp /parenrightex /parenrightbt /bracketrighttp /bracketrightex
+ /bracketrightbt /bracerighttp /bracerightmid /bracerightbt /.notdef
+] def
diff --git a/fonts/utilities/vplutils/maketext b/fonts/utilities/vplutils/maketext
new file mode 100644
index 0000000000..152e1cd8fb
--- /dev/null
+++ b/fonts/utilities/vplutils/maketext
@@ -0,0 +1,19 @@
+#!/bin/sh
+# maketext: sed wrapper to substitute names in scripts and man pages
+# writes to standard output
+
+# get other variables from command line
+expr=
+for arg in "$@"
+do case "$arg" in
+ -debug) debug=true ;;
+ @MAN@=*) arg=`echo $arg | sed -e "s/\.\(.\)/(\1),/g" -e "s/, *$//"`
+ expr="$expr -e 's=$arg='" ;;
+ *=*) expr="$expr -e 's=$arg='" ;;
+ *) if test "$debug" = "true"
+ then echo "sed $expr $arg" 1>&2
+ fi
+ eval sed $expr $arg ;;
+ esac
+ shift
+done
diff --git a/fonts/utilities/vplutils/makevpl.man b/fonts/utilities/vplutils/makevpl.man
new file mode 100644
index 0000000000..6bc0ed28ad
--- /dev/null
+++ b/fonts/utilities/vplutils/makevpl.man
@@ -0,0 +1,187 @@
+.TH MAKEVPL 1 "VPLUtils Release @RELEASE@"
+.SH NAME
+makevpl \- mix and match TeX's PL and VPL fonts
+.SH SYNOPSIS
+.B makevpl
+[
+.B \-quiet
+] [
+.B \-enc
+.I encoding
+] [
+.B \-defenc
+.I encoding
+] [
+.B \-family
+.I famname
+] [
+.B \-face
+.I facenum
+] [
+.B \-coding
+.I scheme
+] [
+.B \-size
+.I designsize
+] [
+.B \-units
+.I designunits
+] [
+.B \-at
+.I pointsize
+] [
+.B \-normal
+] [
+.B \-replace\fR{\fBfd|ch|wd|ht|dp|ic|map\fR}\fB
+.I range
+] [
+.B \-add\fR{\fBfd|ch|wd|ht|dp|ic|map\fR}\fB
+.I range
+]
+.I font[:encoding]...
+.SH DESCRIPTION
+.I Makevpl
+constructs a Virtual Property List (VPL) file containing characters from the
+fonts specified. A property list (\fB.pl\fR) or virtual property list
+(\fB.vpl\fR) file must exist for each font specified; these files are read,
+and a new VPL file containing the merged font is written to standard output.
+.PP
+The action options
+.B \-replace\fIx\fB, \-add\fIx\fB, \-at
+and
+.B \-normal
+determine how the files are merged. These options may be specified several
+times; if they appear before the first font, they set the default action for
+all fonts. If these options appear between fonts, they set the action for the
+next font only.
+.PP
+The actions
+.B \-replace\fIx\fB
+and
+.B \-add\fIx\fB
+determine whether character information from a font is to replace or be added
+to information in the output font. A character range must be specified with
+of these options; only characters in the range are considered for replacement
+or addition. The character range is a comma separated list of numbers or
+subranges of the form
+.I low\-high.
+If
+.I low
+and/or
+.I high
+are omitted, the subrange is unbounded at the appropriate end(s).
+.PP
+There are seven variants of the
+.B \-replace\fIx\fB
+and
+.B \-add\fIx\fB
+options. These are
+.B \-addfd
+and
+.B \-replacefd,
+which add or replace font dimensions in the specified range,
+.B \-addwd, \-replacewd, \-addht, \-replaceht, \-adddp, \-replacedp, \-addic,
+.B \-replaceic, \-addmap,
+and
+.B \-replacemap,
+which add or replace the width, height, depth, italic correction or character
+map of characters in the specified range.
+The options
+.B \-addch,
+and
+.B \-replacech
+will add or replace all of the information for the characters in the specified
+range. Only characters which have a character map will be written to the
+output font; a default character map is supplied for characters in property
+list (\fB.pl\fR) files.
+.PP
+Delimiter and variable size character list information is mapped to the
+corresponding glyphs in the output font encoding, and cannot be controlled
+from the command line. Ligature and kerning information mapped across with
+characters from a font; if you want to add new ligatures or kerns to a font,
+you can merge it with a property list with the same name as the font, but with
+a different extension.
+.PP
+The actions
+.B \-at
+and
+.B \-normal
+determine how the fonts are scaled. The
+.B \-at
+option scales fonts to the point size specified, and the
+.B \-normal
+option leaves fonts at their natural size.
+.PP
+The default actions are to replace all characters, add all font dimensions,
+and leave fonts at their natural size.
+.PP
+Each font file has an associated
+.I encoding
+vector. The encoding vector is used to determine where replacement or
+additional characters are positioned in fonts. The name associated with a
+character's input encoding is used to place the character in the output font.
+Encoding vector files are PostScript fragments, containing an array of 256
+names.
+.PP
+The
+.B \-enc
+option gives the desired output encoding; the default is to use the encoding
+of the first font specified.
+.PP
+The environment variable
+.B ENCPATH
+can be used to set an encoding path which will be searched for the
+encoding files. If a null path component is specified, the default path will
+be searched at that point. The encoding files will be looked for under the
+name given, and also with
+.B .enc
+appended.
+.PP
+The
+.B \-defenc
+option can be used to specify an encoding which will be used for
+each font which does not have an encoding specified. The default encoding is
+.I standard.
+.PP
+The family, face and encoding scheme fields of the output font can be set with
+the
+.B \-family, \-face,
+and
+.B \-coding
+options. The design size and number of design units per design size can be
+specified with the
+.B \-size
+and
+.B \-units
+options.
+.PP
+Normally
+.I makevpl
+informs you about what it is doing; the
+.B \-quiet
+option prevents this behaviour.
+.SH EXAMPLES
+To create a version of Times which can be used for maths in TeX, start
+with the Computer Modern maths font, and replace characters from an obliqued
+version of the symbol font, and Times-Italic:
+.sp
+.ce
+makevpl cmmi:CMsymbol rpsyro:symbol rptmri >ptmmi.vpl
+.sp
+To add ligatures to the standard encoding form of CharterBT-Roman:
+.sp
+.ce
+makevpl rbchr rbchr.ligs >rbchl.vpl
+.sp
+.SH FILES
+@ENCODINGDIR@/*.enc \- encoding vector files
+.SH AUTHOR
+Angus Duggan
+.SH "SEE ALSO"
+@MAN@, vftovp(1), vptovf(1), tftopl(1), afm2tfm(1)
+.SH BUGS
+.I Makevpl
+expands joined kerning and ligature tables; word boundary characters in the
+kerning and ligature tables may also be treated unusually.
+.I Makevpl
+is slow.
diff --git a/fonts/utilities/vplutils/makevpl.pl b/fonts/utilities/vplutils/makevpl.pl
new file mode 100644
index 0000000000..d0812ccf10
--- /dev/null
+++ b/fonts/utilities/vplutils/makevpl.pl
@@ -0,0 +1,628 @@
+#!@PERL@
+# makevpl
+# (C) A. J. C. Duggan 1993
+# Mix and match TeX's PL and VPL files
+#
+# FONTDIMEN actions are ---
+# -replacefd <range> | -addfd <range>
+#
+# CHARACTER actions are ---
+# -replace[ch|ic|wd|ht|dp|map] <range> |
+# -add[ch|ic|wd|ht|dp|map] <range>
+# (ch = character (all), ic = italic correction, wd = width, ht = height,
+# dp = depth, map = character map)
+#
+# mapfont FONTAT actions are ---
+# -normal | -at <size>
+#
+# default actions are:
+# -addfd - -replacech - -normal
+
+# v1.1 20/9/93 AJCD
+# Fixed problems with scaling, removed redundant MAPFONTs
+#
+# v1.2 23/9/93 AJCD
+# Split into reusable packages
+
+($prog) = ($0 =~ /([^\/]*)$/);
+
+unshift(@INC, "@PERLLIBDIR@"); # set perl include directory
+
+require 'paths.pl';
+require 'parseenc.pl';
+require 'parsepl.pl';
+
+###############################################################################
+# Auxiliary routines
+###############################################################################
+
+# fatal(...)
+# causes a fatal error with the arguments given
+sub fatal {
+ print STDERR "$prog: ";
+ printf STDERR @_;
+ print STDERR "\n";
+ exit 1;
+}
+
+# inrange(num, range)
+# tests if number is in the range given
+# range = num[,range] | [num]-[num][,range] | []
+sub inrange {
+ local($number, $range) = @_;
+ foreach (split(/,/, $range)) {
+ if (/^(0x?[\da-fA-F]+)/) {
+ next if $number < oct($1);
+ } elsif (/^(\d+)/) {
+ next if $number < $1;
+ }
+ if (/(0x?[\da-fA-F]+)$/) {
+ next if $number > oct($1);
+ } elsif (/(\d+)$/) {
+ next if $number > $1;
+ }
+ return 1;
+ }
+ 0;
+}
+
+# normalise(number)
+# return real normalised to design units of font
+sub normalise {
+ local($string) = @_;
+ $dunits = $designunits if !defined($dunits);
+ $dsize = $designsize if !defined($dsize);
+ $string = sprintf('R %.5f', &number($string)*$designsize*$dunits/($designunits*$dsize))
+ if $dsize*$designunits != $designsize*$dunits;
+ $string;
+}
+
+###############################################################################
+# Property list manipulation routines
+###############################################################################
+
+# PL property functions
+# called by getpl with normal arguments as parameters
+
+sub checksum { # put checksum in MAPFONT
+ local($name, $number) = @_;
+ $fontprop{$fontname,0,FONTCHECKSUM} = "(FONTCHECKSUM $number)"
+ if !defined($fontprop{$fontname,0,FONTCHECKSUM});
+ undef;
+}
+
+sub designunits { # save designunits
+ local($name, $number) = @_;
+ $designunits = &number($number);
+ undef;
+}
+
+sub designsize { # save designsize
+ local($name, $number) = @_;
+ $fontprop{$fontname,0,FONTDSIZE} = "(FONTDSIZE $number)"
+ if !defined($fontprop{$fontname,0,FONTDSIZE});
+ $designsize = &number($number);
+ undef;
+}
+
+sub codingscheme { # keep original codingscheme
+ local($name, $string) = @_;
+ $fcoding = $string if !defined($fcoding);
+ undef;
+}
+
+sub family { # keep original family
+ local($name, $string) = @_;
+ $ffamily = $string if !defined($ffamily);
+ undef;
+}
+
+sub face { # keep original face
+ local($name, $number) = @_;
+ $fface = &number($number) if !defined($fface);
+ undef;
+}
+
+sub header { # keep original header
+ local($name, $byte, $value) = @_;
+ local($index) = &number($byte);
+ $header[$index] = "$byte $value" if !defined($header[$index]);
+ undef;
+}
+
+# mapfont properties
+sub mapfontprop { # MAPFONT sub-properties
+ join(' ', @_);
+}
+
+sub fontat { # fontat property is relative to designunits
+ local($name, $number) = @_;
+ $dunits = $designunits if !defined($dunits);
+ $dsize = $designsize if !defined($dsize);
+ if (!$scale) {
+ $number = sprintf('R %.5f', &number($number)*$dunits/$designunits)
+ if $dunits != $designunits;
+ } else {
+ local($fontat) = $scale*$dunits/$dsize;
+ $number = sprintf('R %.5f', $fontat)
+ if $fontat != $dunits;
+ }
+ "($name $number)";
+}
+
+sub mapfont { # MAPFONT property
+ local($name, $number, @map) = @_;
+ local($value) = &number($number);
+ foreach (@map) { # put MAPFONT properties into fontprops
+ $fontprop{$fontname,$value,$1} = $_
+ if /^\((\w+)/;
+ }
+ undef;
+}
+
+# ligtable properties
+sub ligprop {
+ join(' ', @_);
+}
+
+# addligs(left, skip, ligtable)
+# put entries into current font's ligtable for left-side character after
+# skipping given number of ligs & kerns
+sub addligs {
+ local($left) = shift;
+ local($skip) = shift;
+ local($lastlabel) = !$skip;
+ local($number);
+ return if $lastlabel && defined($kernslike{$fontname,$left});
+ while ($skip && ($_ = shift)) {
+ $skip-- if /KRN/ || /LIG/;
+ }
+ while (@_) {
+ $_ = shift;
+ last if (/STOP/);
+ if (/SKIP (\S \S+)/) {
+ &addligs($left, &number($1), @_);
+ last;
+ } elsif (/(\/?LIG\/?>?>?) (\S \S+) (\S \S+)/) {
+ foreach $ligto (&mapsto(&number($2))) {
+ if (!defined($ligtable{$fontname,$left,$ligto})) {
+ ($number) = &mapsto(&number($3));
+ $ligtable{$fontname,$left,$ligto} =
+ sprintf("($1 %s %s)", &charnum($ligto), &charnum($number))
+ if defined($number);
+ print STDERR "$ligtable{$fontname,$left,$ligto}\n" if $debug;
+ }
+ }
+ $lastlabel = 0;
+ } elsif (/(KRN) (\S \S+) (\S \S+)/) {
+ foreach $krnto (&mapsto(&number($2))) {
+ if (!defined($ligtable{$fontname,$left,$krnto})) {
+ $ligtable{$fontname,$left,$krnto} =
+ sprintf("($1 %s %s)", &charnum($krnto), &normalise($3));
+ print STDERR "$ligtable{$fontname,$left,$krnto}\n" if $debug;
+ }
+ }
+ $lastlabel = 0;
+ } elsif (/LABEL BOUNDARYCHAR/) {
+ $kernslike{$fontname,BOUNDARYCHAR} = $left
+ if ($lastlabel);
+ } elsif (/LABEL (\S \S+)/) {
+ if ($lastlabel) {
+ foreach (&mapsto(&number($1))) {
+ $kernslike{$fontname,$_} = $left;
+ }
+ }
+ }
+ }
+}
+
+sub ligtable { # merge ligtables
+ local($name) = shift;
+ print STDERR '(Building ligature table...' if !$quiet;
+ while (@_) { # run through program, putting LABELs in
+ $_ = shift;
+ if (/LABEL BOUNDARYCHAR/) {
+ &addligs(BOUNDARYCHAR, 0, @_);
+ } elsif (/LABEL (\S \S+)/) {
+ foreach (&mapsto(&number($1))) { # add lig table for each remapping
+ &addligs($_, 0, @_);
+ }
+ }
+ }
+ print STDERR 'done)' if !$quiet;
+}
+
+sub boundarychar { # keep original boundarychar
+ local($name, $char) = @_;
+ ($fbchar) = &mapsto(&number($char)) if !defined($fbchar);
+ undef;
+}
+
+# list of fontdimen names -> fontdimen numbers
+%fontdimen = (SLANT, 1, SPACE, 2, STRETCH, 3, SHRINK, 4, XHEIGHT, 5, QUAD, 6,
+ EXTRASPACE, 7, NUM1, 8, NUM2, 9, NUM3, 10, DENOM1, 11,
+ DENOM2, 12, SUP1, 13, SUP2, 14, SUP3, 15, SUB1, 16, SUB2, 17,
+ SUPDROP, 18, SUBDROP, 19, DELIM1, 20, DELIM2, 21, AXISHEIGHT, 22,
+ DEFAULTRULETHICKNESS, 8, BIGOPSPACING1, 9, BIGOPSPACING2, 10,
+ BIGOPSPACING3, 11, BIGOPSPACING4, 12, BIGOPSPACING5, 13
+ );
+
+# fontdimen properties
+sub fontdimen {
+ local($name, $number) = @_;
+ local($index) = $fontdimen{$name};
+ $fontdimen[$index] = '('.join(' ', $name, &normalise($number)).')'
+ if (!defined($fontdimen[$index]) && &inrange($index, $add{fd})) ||
+ &inrange($index, $sub{fd});
+ undef;
+}
+
+sub parameter {
+ local($name, $indexstr, $number) = @_;
+ local($index) = &number($indexstr);
+ $fontdimen[$index] = join(' ', "($name", $indexstr, &normalise($number)).')'
+ if (!defined($fontdimen[$index]) && &inrange($index, $add{fd})) ||
+ &inrange($index, $sub{fd});
+ undef;
+}
+
+# character properties
+%charprop = @thismap = ();
+
+sub charprop {
+ local($name, $number) = @_;
+ $charprop{$name} = "($name ".&normalise($number).')';
+ undef;
+}
+
+sub nextlarger { # deal with NEXTLARGER lists
+ local($name, $number) = @_;
+ print STDERR "$name $number : " if $debug;
+ ($charprop{NEXTLARGER}) = &mapsto(&number($number));
+ undef $charprop{VARCHAR}; # mutually exclusive
+}
+
+sub varprop { # deal with VARCHAR lists
+ local($name, $number) = @_;
+ print STDERR "$name $number :" if $debug;
+ ($charprop{$name}) = &mapsto(&number($number));
+ undef $charprop{NEXTLARGER}; # mutually exclusive
+}
+
+sub mapprop { # MAP sub-properties
+ local($name) = shift;
+ join(' ', "($name", @_).')'; # return property
+}
+
+sub mappropn { # normalised MAP sub-properties
+ local($name) = shift;
+ foreach (@_) {
+ $_ = &normalise($_);
+ }
+ join(' ', "($name", @_).')'; # return property
+}
+
+sub map { # deal with MAP lists
+ local($name);
+ ($name, @thismap) = @_;
+ undef;
+}
+
+sub character { # add or replace character properties
+ local($name, $number) = @_;
+ local($position) = &number($number);
+ local($lastsel, $lastfont, $font) = 0;
+ foreach $ch (&mapsto($position)) {
+ $charic[$ch] = $charprop{CHARIC}
+ if (!defined($charic[$ch]) && &inrange($position, $add{ic})) ||
+ &inrange($position, $sub{ic});
+ $charwd[$ch] = $charprop{CHARWD}
+ if (!defined($charwd[$ch]) && &inrange($position, $add{wd})) ||
+ &inrange($position, $sub{wd});
+ $charht[$ch] = $charprop{CHARHT}
+ if (!defined($charht[$ch]) && &inrange($position, $add{ht})) ||
+ &inrange($position, $sub{ht});
+ $chardp[$ch] = $charprop{CHARDP}
+ if (!defined($chardp[$ch]) && &inrange($position, $add{dp})) ||
+ &inrange($position, $sub{dp});
+ if ((!defined($charmap[$ch]) && &inrange($position, $add{map})) ||
+ &inrange($position, $sub{map})) {
+ @thismap = ("(SETCHAR $number)") if !@thismap; # make default MAP
+ $charmap[$ch] = join("\n", '(MAP', @thismap, ')');
+ $charfrom[$ch] = $fontname;
+ $nextlarger[$ch] = $charprop{NEXTLARGER}
+ if defined($charprop{NEXTLARGER});
+ foreach $varprop (TOP, MID, BOT, REP) {
+ $varchar{$ch,$varprop} = $charprop{$varprop}
+ if defined($charprop{$varprop});
+ }
+ }
+ }
+ %charprop = @thismap = ();
+ undef;
+}
+
+###############################################################################
+# Parsing and tokenisation
+###############################################################################
+
+# list of property -> parameters_action
+# (N=number, S=string, P=property list, L=label or number)
+&plactions(CHECKSUM, checksum, DESIGNSIZE, designsize,
+ DESIGNUNITS, designunits, CODINGSCHEME, codingscheme,
+ FAMILY, family, FACE, family, SEVENBITSAFEFLAG, ignore,
+ HEADER, header, BOUNDARYCHAR, boundarychar,
+ VTITLE, ignore, COMMENT, ignore,
+ FONTDIMEN, ignore, # FONTDIMEN properties follow
+ SLANT, fontdimen, SPACE, fontdimen, STRETCH, fontdimen,
+ SHRINK, fontdimen, XHEIGHT, fontdimen, QUAD, fontdimen,
+ EXTRASPACE, fontdimen, NUM1, fontdimen, NUM2, fontdimen,
+ NUM3, fontdimen, DENOM1, fontdimen, DENOM2, fontdimen,
+ SUP1, fontdimen, SUP2, fontdimen, SUP3, fontdimen,
+ SUB1, fontdimen, SUB2, fontdimen, SUPDROP, fontdimen,
+ SUBDROP, fontdimen, DELIM1, fontdimen, DELIM2, fontdimen,
+ AXISHEIGHT, fontdimen, DEFAULTRULETHICKNESS, fontdimen,
+ BIGOPSPACING1, fontdimen, BIGOPSPACING2, fontdimen,
+ BIGOPSPACING3, fontdimen, BIGOPSPACING4, fontdimen,
+ BIGOPSPACING5, fontdimen, PARAMETER, parameter,
+ LIGTABLE, ligtable, # LIGTABLE properties follow
+ LABEL, ligprop, KRN, ligprop, STOP, ligprop,
+ SKIP, ligprop, LIG, ligprop, '/LIG', ligprop,
+ '/LIG>', ligprop, 'LIG/', ligprop, 'LIG/>', ligprop,
+ '/LIG/', ligprop, '/LIG/>', ligprop,
+ '/LIG/>>', ligprop,
+ MAPFONT, mapfont, # MAPFONT properties follow
+ FONTDSIZE, mapfontprop, FONTNAME, mapfontprop,
+ FONTAREA, mapfontprop, FONTCHECKSUM, mapfontprop,
+ FONTAT, fontat,
+ CHARACTER, character, # CHARACTER properties follow
+ CHARWD, charprop, CHARHT, charprop, CHARDP, charprop,
+ CHARIC, charprop, NEXTLARGER, nextlarger,
+ VARCHAR, ignore, # VARCHAR properties follow
+ TOP, varprop, MID, varprop, BOT, varprop, REP, varprop,
+ MAP, map, # MAP properties follow
+ SELECTFONT, mapprop, SETCHAR, mapprop,
+ SETRULE, mappropn, PUSH, mapprop, POP, mapprop,
+ MOVERIGHT, mappropn, MOVELEFT, mappropn, MOVEUP, mappropn,
+ MOVEDOWN, mappropn, SPECIAL, mapprop, SPECIALHEX, mapprop
+ );
+
+sub getpl {
+ local($fontname) = &fontname(@_);
+ $fontprop{$fontname,0,FONTNAME} = "(FONTNAME $fontname)";
+ &parsepl(@_);
+ if ($scale && !defined($fontprop{$fontname,0,FONTAT})) {
+ $dunits = $designunits if !defined($dunits);
+ $dsize = $designsize if !defined($dsize);
+ local($fontat) = $scale*$dunits/$dsize;
+ $fontprop{$fontname,0,FONTAT} = sprintf("(FONTAT R %.5f)", $fontat)
+ if $fontat != $dunits;
+ }
+}
+
+###############################################################################
+# output routines
+###############################################################################
+
+# output VPL variables
+@charic = (); # italic corrections
+@charwd = (); # character widths
+@charht = (); # character heights
+@chardp = (); # character depths
+@charmap = (); # character map
+@nextlarger = (); # nextlarger lists
+%varchar = (); # number,property -> number
+%ligtable = (); # font,left,right -> lig/kern property
+%kernslike = (); # font,number -> number
+@fontdimen = (); # array of number -> property
+%mapfont = (); # number,property -> property
+%fontprop = (); # name,select,propname -> property
+@header = (); # header byte -> value
+@charfrom = (); # number -> font
+
+$mapfont = 0; # current MAPFONT number
+
+# fontmapsto(file, select)
+# maps a font selection number to the final output number and outputs MAPFONT
+sub fontmapsto { # return final MAPFONT of fontname,selectnum
+ local($fn, $select) = @_;
+ local($fontname) = $fontprop{$fn,$select,FONTNAME};
+ local($fontarea) = $fontprop{$fn,$select,FONTAREA};
+ local($fontat) = $fontprop{$fn,$select,FONTAT};
+ if (!defined($mapfont{$fontname,$fontarea,$fontat})) {
+ local(@mapfont);
+ foreach (FONTNAME, FONTAREA, FONTCHECKSUM, FONTAT, FONTDSIZE) {
+ push(@mapfont, $fontprop{$fn,$select,$_})
+ if defined($fontprop{$fn,$select,$_});
+ }
+ &expand("(MAPFONT D $mapfont", @mapfont, ')');
+ $mapfont{$fontname,$fontarea,$fontat} = $mapfont++;
+ }
+ $mapfont{$fontname,$fontarea,$fontat};
+}
+
+# remap(file, map)
+# remaps font selections to the final output font
+sub remap { # remap fontmap to output fonts
+ local($fn) = shift;
+ local($lastsel, $lastfont, $font) = (0, 0);
+ foreach (@_) {
+ if (/\(SELECTFONT (.*)\)/) {
+ $font = &fontmapsto($fn, $lastsel = &number($1));
+ if ($font != $lastfont) { # substitute mapped font
+ $_ = "(SELECTFONT D $font)";
+ } else { # font same as last selected, and can be ignored
+ $_ = '';
+ }
+ $lastfont = $font;
+ } elsif (/SETCHAR/) {
+ $font = &fontmapsto($fn, $lastsel);
+ $_ = "(SELECTFONT D $font)\n$_"
+ if ($font != $lastfont); # substitute mapped font
+ $lastfont = $font;
+ }
+ }
+ join("\n", @_);
+}
+
+# makevpl()
+# print out tidied up vpl file
+sub makevpl {
+ local(@proplist, $index, $temp);
+ local($font, $right, $left, %outlig); # for ligtable construction
+
+ print STDERR "Creating virtual property list\n" if !$quiet;
+
+ print STDERR "...writing header\n" if !$quiet;
+ print "(VTITLE created by $vtitle)\n",
+ "(COMMENT $prog is (C) A. J. C. Duggan 1993)\n";
+
+ printf "(DESIGNSIZE R %.5f)\n", $dsize if defined($dsize);
+ printf "(DESIGNUNITS R %.5f)\n", $dunits if defined($dunits);
+ print "(FAMILY $ffamily)\n" if defined($ffamily);
+ printf "(FACE O %o)\n", $fface if defined($fface);
+ print "(CODINGSCHEME $fcoding)\n" if defined($fcoding);
+
+ for ($index = 0; $index < @header; $index++) { # output header bytes
+ print "(HEADER $header[$index])\n" if defined $header[$index];
+ }
+
+ print STDERR "...writing font dimensions\n" if !$quiet;
+ &expand('(FONTDIMEN', grep($_ ne undef, @fontdimen), ')')
+ if @fontdimen; # output fontdimens
+
+ print STDERR "...writing font mappings\n" if !$quiet;
+ for ($index = 0; $index < 256; $index++) { # remap fonts
+ $charmap[$index] = &remap($charfrom[$index],
+ split("\n", $charmap[$index]))
+ if defined($charmap[$index]);
+ }
+
+ print STDERR "...writing ligature table\n" if !$quiet;
+ printf "(BOUNDARYCHAR %s)\n", &charnum($fbchar) if defined($fbchar);
+ while (($_, $temp) = each %ligtable) { # ligtable mangling
+ ($font, $left, $right) = split($;);
+ $outlig{$left} .= "$temp\n"
+ if ($left eq BOUNDARYCHAR || $charfrom[$left] eq $font) &&
+ ((defined($fbchar) && $right == $fbchar) ||
+ $charfrom[$right] eq $font);
+ }
+ @proplist = (); # clear output LIGTABLE
+ foreach (keys(%outlig)) {
+ while (($left, $right) = each %kernslike) {
+ ($font, $left) = split($;, $left);
+ if ($right eq $_ &&
+ ($left eq BOUNDARYCHAR || $charfrom[$left] eq $font)) {
+ if ($left eq BOUNDARYCHAR) {
+ push(@proplist, "(LABEL $left)");
+ } else {
+ push(@proplist, sprintf("(LABEL %s)", &charnum($left)));
+ }
+ }
+ }
+ if ($_ eq BOUNDARYCHAR) {
+ push(@proplist, "(LABEL $_)");
+ } else {
+ push(@proplist, sprintf("(LABEL %s)", &charnum($_)));
+ }
+ push(@proplist, split("\n", $outlig{$_}));
+ push(@proplist, '(STOP)');
+ }
+ &expand('(LIGTABLE', @proplist, ')')
+ if @proplist; # output ligtable
+
+ print STDERR "...writing characters\n" if !$quiet;
+ for ($index = 0; $index < 256; $index++) { # only output chars with MAPs
+ @proplist = ();
+ foreach (TOP, MID, BOT, REP) {
+ push(@proplist, sprintf("($_ %s)", &charnum($temp)))
+ if defined($temp = $varchar{$index,$_}) &&
+ defined($charmap[$temp]);
+ }
+ &expand(sprintf("(CHARACTER %s", &charnum($index)),
+ sprintf("(COMMENT %s)", &encodeto($index)),
+ $charwd[$index], $charht[$index],
+ $chardp[$index], $charic[$index],
+ defined($temp = $nextlarger[$index]) &&
+ defined($charmap[$temp]) ?
+ sprintf("(NEXTLARGER %s)", &charnum($temp)) : '',
+ @proplist ? ('(VARCHAR', @proplist, ')') : '',
+ $charmap[$index], ')')
+ if defined($charmap[$index]);
+ }
+ print STDERR "...done\n" if !$quiet;
+}
+
+###############################################################################
+# Actions
+###############################################################################
+
+# default actions
+%add = (fd, '-'); # additions
+%sub = (wd, '-', ht, '-', dp, '-', ic, '-', map, '-'); # substitutions
+$scale = 0; # scale
+
+###############################################################################
+# Argument processing
+###############################################################################
+
+$vtitle = join(' ', $prog, @ARGV); # set VTITLE to arguments
+$defaultenc = 'standard'; # default encoding
+
+while (@ARGV) {
+ $_ = shift;
+ ARGSW:
+ {
+ /^-quiet$/ && ($quiet = 1, last ARGSW);
+ /^-defenc$/ && ($defaultenc = shift, last ARGSW);
+ /^-enc$/ && (&getencoding(shift, &pathexpand($ENV{ENCPATH},
+ '.:@ENCODINGDIR@')),
+ last ARGSW);
+ /^-debug$/ && ($debug = 1, last ARGSW);
+ /^-at$/ && ($scale = shift, last ARGSW);
+ /^-normal$/ && ($scale = 0, last ARGSW);
+ /^-replacech$/ &&
+ ($sub{wd} = $sub{ht} = $sub{dp} = $sub{ic} = $sub{map} = shift,
+ $add{wd} = $add{ht} = $add{dp} = $add{ic} = $add{map} = '',
+ last ARGSW);
+ /^-addch$/ &&
+ ($sub{wd} = $sub{ht} = $sub{dp} = $sub{ic} = $sub{map} = '',
+ $add{wd} = $add{ht} = $add{dp} = $add{ic} = $add{map} = shift,
+ last ARGSW);
+ /^-replace(ic|wd|ht|dp|fd|map)$/ &&
+ ($sub{$1} = shift, $add{$1} = '', last ARGSW);
+ /^-add(ic|wd|ht|dp|fd|map)$/ &&
+ ($sub{$1} = '', $add{$1} = shift, last ARGSW);
+ /^-size$/ && ($dsize = shift, last ARGSW);
+ /^-units$/ && ($dunits = shift, last ARGSW);
+ /^-family$/ && ($ffamily = shift, last ARGSW);
+ /^-face$/ && ($fface = shift, last ARGSW);
+ /^-coding$/ && ($fcoding = shift, last ARGSW);
+ if (/^-/) {
+ /^-v$/ && print STDERR "$prog release @RELEASE@\n";
+ print STDERR join("\n",
+ "Usage: $prog [-quiet] [-defenc defaultenc] [-enc enc] [-at size] [-normal]",
+ " [-addxx range|-replacexx range, xx=ch,fd,wd,ht,dp,ic,map]",
+ " [-size num] [-units num] [-family str] [-face num] [-coding scheme]",
+ " filename[:encoding]...\n");
+ exit 1;
+ } else { # filename[:encoding]
+ %defaultadd = %add if !defined(%defaultadd); # set default actions
+ %defaultsub = %sub if !defined(%defaultsub);
+ $defaultscale = $scale if !defined($defaultscale);
+ ($file, $encoding) = split(/:/);
+ &getencoding($encoding eq '' ? $defaultenc : $encoding,
+ &pathexpand($ENV{ENCPATH}, '.:@ENCODINGDIR@'));
+ &getpl($file); # process PL file
+ %add = %defaultadd; # restore default actions
+ %sub = %defaultsub;
+ $scale = $defaultscale;
+ }
+ }
+}
+
+&fatal('no property list files specified') if !defined($file);
+
+&makevpl; # build and print final PL
+
+exit 0; # good termination
diff --git a/fonts/utilities/vplutils/parseenc.pl b/fonts/utilities/vplutils/parseenc.pl
new file mode 100644
index 0000000000..6c2e7f86f5
--- /dev/null
+++ b/fonts/utilities/vplutils/parseenc.pl
@@ -0,0 +1,111 @@
+# -*-perl-*-
+# parseenc.pl
+# (C) A. J. C. Duggan 22/9/93
+# Parsing package for Adobe encoding vector files
+#
+# public routines are:
+# getencoding(name, path) Reads encoding file found in path
+# mapsto(charnumber) Returns character mappings in output encoding
+# charnum(charnumber) Returns character representation for output
+# encodeto(charnumber) Returns glyph name of character number
+
+###############################################################################
+# Encoding reading routines
+###############################################################################
+
+require 'paths.pl'; # needs pathopen
+
+package parseenc; # start package
+
+# default encodings
+%encodings = (); # array of name -> encoding vector
+@encodeto = (); # target encoding
+
+# readencoding(handle)
+# reads an open encoding vector file into @encoding
+sub readencoding {
+ local($file) = shift;
+ local($ordinal, $invector) = (0, 0);
+ @encoding = (); # current encoding vector
+ while (<$file>) {
+ s/%.*//; # remove comments
+ foreach (split(/[\s\/]+/)) {
+ if ($_ eq '[') {
+ $invector++;
+ } elsif ($_ eq ']') {
+ $invector--;
+ } elsif ($_ ne '' && $invector) {
+ push(@encoding, $_);
+ $ordinal++;
+ }
+ }
+ }
+ &main'fatal("encoding vector $file has %d elements, should be 256", #'
+ $ordinal) if $ordinal != 256;
+}
+
+# getencoding(file)
+# packages calls to pathopen and readencoding to get encoding vectors, if they
+# have not already been read.
+sub main'getencoding {
+ local($enc) = shift;
+ if (!defined($encodings{$enc})) {
+ print STDERR "Looking for $enc encoding file\n" if !$quiet;
+ if (&main'pathopen($enc, ',enc', @_)) {
+ &readencoding($enc); # get @encoding vector
+ $encodings{$enc} = join("\n", @encoding);
+ @encodeto = @encoding if !@encodeto; # set target encoding
+ close($enc);
+ } else {
+ &main'fatal("can't find encoding vector $enc");
+ }
+ } else {
+ @encoding = split("\n", $encodings{$enc});
+ }
+ %mapstocache = (); # clear mapping cache
+}
+
+# mapsto(char)
+# return mappings of char in target encoding
+sub main'mapsto {
+ local($number) = shift;
+ local($glyph) = $encoding[$number];
+ local(@mappings);
+ if (defined($mapstocache{$number})) {
+ @mappings = split(', ', $mapstocache{$number});
+ } else {
+ local($index) = 0;
+ grep($glyph eq $_ ? push(@mappings, $index++) : $index++, @encodeto);
+ $mapstocache{$number} = join(', ', @mappings);
+ }
+ print STDERR "Char $number -> $mapstocache{$number} ($glyph)\n"
+ if $main'debug;
+ @mappings;
+}
+
+%charnum = (); # glyph name -> print-as-char
+grep($charnum{$_}++, exclam, quotedbl, numbersign, dollar, percent,
+ ampersand, quoteright, 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);
+
+# charnum(number)
+# expands to character number or code in output encoding
+sub main'charnum {
+ local($char) = shift;
+ $char > 32 && $char < 127 && $char != 40 && $char != 41 &&
+ defined($charnum{$encodeto[$char]}) ?
+ sprintf('C %c', $char) : sprintf('O %o', $char);
+}
+
+# encodeto(number)
+# returns glyph name of character in output encoding
+sub main'encodeto {
+ $encodeto[shift];
+}
+
+1;
diff --git a/fonts/utilities/vplutils/parsepl.pl b/fonts/utilities/vplutils/parsepl.pl
new file mode 100644
index 0000000000..9131730135
--- /dev/null
+++ b/fonts/utilities/vplutils/parsepl.pl
@@ -0,0 +1,254 @@
+# -*-perl-*-
+# parsepl.pl
+# (C) A. J. C. Duggan 22/9/93
+# Parsing package for TeX's PL and VPL files
+#
+# public routines are:
+# number(property) Returns numeric value of number property
+# fontname(file) Returns default font name for filename
+# plactions(name, act...) Register property actions for parsing
+# parsepl(file) Open and parse PL/VPL file using plactions
+# expand(props) Output indented property list
+# default plactions provided are:
+# ignore(props) Ignore property or property list
+# property(prop) Generate (property) form
+# list(proplist) Generate (proplist) form
+
+###############################################################################
+# Property list manipulation routines
+###############################################################################
+
+package parsepl;
+
+# number(property)
+# returns the value of number defined by property
+sub main'number {
+ local($_, $value) = split(' ', shift);
+ local(%xerox) = (MRR, 0, MIR, 1, BRR, 2, BIR, 3, LRR, 4, LIR, 5, MRC, 6,
+ MIC, 7, BRC, 8, BIC, 9, LRC, 10, LIC, 11, MRE, 12,
+ MIE, 13, BRE, 14, BIE, 15, LRE, 16, LIE, 17);
+ NUMBER:
+ {
+ /^C$/ && (($value) = unpack(C, $value), last NUMBER);
+ /^D$/ && ($value = $value+0, last NUMBER);
+ /^F$/ && ($value = $xerox{$value}, last NUMBER);
+ /^O$/ && ($value = oct($value), last NUMBER);
+ /^H$/ && ($value = hex($value), last NUMBER);
+ /^R$/ && ($value = $value+0.0, last NUMBER);
+ &main'fatal("bad number: $_ $value");
+ }
+ $value;
+}
+
+# fontname(file)
+# return default fontname of file
+sub main'fontname {
+ local($_) = shift;
+ print STDERR "Fontname for $_ is " if $main'debug;
+ s:^.*/::; # drop directory names
+ s/\.[^\.]*$//; # drop extension
+ print STDERR "$_\n" if $main'debug;
+ $_;
+}
+
+# plactions(propname, action, ...)
+# register property list actions
+sub main'plactions {
+ local($propname, $action);
+ local($package) = caller;
+ while (@_) {
+ ($propname, $action) = (shift, shift);
+ $actions{$propname} = "${package}'$action";
+ }
+}
+
+# PL property functions
+# called by parsepl with depth and normal arguments as parameters
+sub main'ignore { # ignore
+ print STDERR join(' ', "Ignoring", @_), "\n" if $main'debug;
+ undef;
+}
+
+sub main'property { # return as property
+ '('.join(' ', @_).')';
+}
+
+sub main'list { # return as property list
+ local($name) = shift;
+ join("\n", "($name", @_, ')');
+}
+
+# list of property -> parameters
+# (N=number, S=string, P=property list, L=label or number)
+%parameters = (CHECKSUM, S, DESIGNSIZE, N, DESIGNUNITS, N, CODINGSCHEME, S,
+ FAMILY, S, FACE, N, SEVENBITSAFEFLAG, S, HEADER, NN,
+ BOUNDARYCHAR, N, VTITLE, S, COMMENT, S,
+ FONTDIMEN, P, # FONTDIMEN properties follow
+ SLANT, N, SPACE, N, STRETCH, N, SHRINK, N, XHEIGHT, N, QUAD, N,
+ EXTRASPACE, N, NUM1, N, NUM2, N, NUM3, N, DENOM1, N, DENOM2, N,
+ SUP1, N, SUP2, N, SUP3, N, SUB1, N, SUB2, N, SUPDROP, N,
+ SUBDROP, N, DELIM1, N, DELIM2, N, AXISHEIGHT, N,
+ DEFAULTRULETHICKNESS, N, BIGOPSPACING1, N, BIGOPSPACING2, N,
+ BIGOPSPACING3, N, BIGOPSPACING4, N, BIGOPSPACING5, N,
+ PARAMETER, NN,
+ LIGTABLE, P, # LIGTABLE properties follow
+ LABEL, L, KRN, NN, STOP, '', SKIP, N, LIG, NN, '/LIG', NN,
+ '/LIG>', NN, 'LIG/', NN, 'LIG/>', NN, '/LIG/', NN, '/LIG/>', NN,
+ '/LIG/>>', NN,
+ MAPFONT, NP, # MAPFONT properties follow
+ FONTDSIZE, N, FONTNAME, S, FONTAREA, S, FONTCHECKSUM, N,
+ FONTAT, N,
+ CHARACTER, NP, # CHARACTER properties follow
+ CHARWD, N, CHARHT, N, CHARDP, N, CHARIC, N, NEXTLARGER, N,
+ VARCHAR, P, # VARCHAR properties follow
+ TOP, N, MID, N, BOT, N, REP, N,
+ MAP, P, # MAP properties follow
+ SELECTFONT, N, SETCHAR, N, SETRULE, NN, PUSH, '', POP, '',
+ MOVERIGHT, N, MOVELEFT, N, MOVEUP, N, MOVEDOWN, N, SPECIAL, S,
+ SPECIALHEX, S
+ );
+
+@tokens = (); # list of tokens still to be processed
+$token = undef; # current token value
+
+# gettoken(notblank, [notrequired])
+# gets the next non-null token from the input file, causes an error if there
+# are no tokens and notrequired is false (or not present). Uses the file name
+# from ancestor functions.
+sub gettoken {
+ local($blankok, $notrequired) = @_;
+ for (;;) {
+ while (@tokens) {
+ $token = shift(@tokens);
+ return $token if $token ne '' && ($blankok || $token !~/^\s*$/);
+ }
+ if ($_ = <$file>) {
+ @tokens = split(/(\(|\)|\s+)/);
+ } else {
+ return $token = undef if $notrequired;
+ &main'fatal("property list $file ended early");
+ }
+ }
+}
+
+# getstring()
+# returns a token representing a string
+sub getstring {
+ local($string, $blanks, $paren);
+ while (&gettoken($blanks++) ne ')' || $paren) {
+ $string .= $token;
+ $paren++ if $token eq '(';
+ $paren-- if $token eq ')';
+ }
+ unshift(@tokens, $token);
+ $string;
+}
+
+# getnumber(sep)
+# returns a list representing a number
+sub getnumber {
+ join(' ', &gettoken(), &gettoken());
+}
+
+# getproperty(separator, outer)
+# returns a property, with the parts separated by the separator
+# outer determines if it is an outer-level property
+sub getproperty {
+ local($outer) = shift;
+ local(@property, $propname, $fn);
+ if (&gettoken(0, $outer) ne undef) {
+ if ($token eq '(') {
+ print STDERR '.' if !$main'debug && !$main'quiet;
+ push(@property, $propname = &gettoken()); # get property name
+ &main'fatal("unknown property name $propname in file $file")
+ if !defined($parameters{$propname});
+ $fn = $actions{$propname};
+ foreach (split(//, $parameters{$propname})) {
+ if (/N/) { # number required
+ push(@property, &getnumber());
+ } elsif (/S/) { # string required
+ push(@property, &getstring());
+ } elsif (/L/) { # label or number required
+ if (&gettoken() eq BOUNDARYCHAR) {
+ push(@property, $token);
+ } else {
+ unshift(@tokens, $token);
+ push(@property, &getnumber());
+ }
+ } elsif (/P/) { # property list required
+ push(@property, &getproplist());
+ } else { # internal table error
+ &main'fatal("this can't happen; property $propname parameter is $_");
+ }
+ }
+ &main'fatal("$propname parameter list terminated by $token in $file")
+ if &gettoken() ne ')';
+ $property = do $fn(@property)
+ if $fn ne undef;
+ } else { # token wasn't (, so restore it.
+ unshift(@tokens, $token);
+ $property = EOL;
+ }
+ } else {
+ $property = EOF;
+ }
+ $property;
+}
+
+# getproplist(separator, outer)
+# returns a property list, with the properties separated by the separator
+# outer determines if it is an outer-level property
+sub getproplist {
+ local(@proplist);
+ for (;;) {
+ &getproperty(0);
+ last if $property eq EOL;
+ push(@proplist, $property);
+ }
+ @proplist;
+}
+
+# parsepl(file)
+# parses the property list in file
+sub main'parsepl {
+ local($file) = shift;
+ local($caller) = caller;
+ foreach ("designsize = 10", "designunits = 1", "codingscheme = UNSPECIFIED",
+ "family = UNSPECIFIED") {
+ eval "\$${caller}'$_";
+ }
+ print STDERR "Looking for PL/VPL $file\n" if !$main'quiet; #'
+ if (open($file, $file) || open($file, "$file.pl") ||
+ open($file, "$file.vpl")) {
+ while (&getproperty(1) ne EOF) {
+ print STDERR '/' if !$main'debug && !$main'quiet;
+ };
+ &main'fatal("property list file $file contains extra tokens $token...")
+ if $token ne undef;
+ print STDERR "\n" if !$main'debug && !$main'quiet;
+ close($file);
+ } else {
+ &main'fatal("can't find PL or VPL file for $file");
+ }
+}
+
+###############################################################################
+# VPL output routines
+###############################################################################
+
+# expand(pl)
+# print balanced property list with proper indentation
+sub main'expand {
+ local($indent) = 0;
+ local(@list) = @_;
+ foreach (@list) {
+ foreach (split("\n")) {
+ s/^\s*//;
+ next if /^$/;
+ print ' ' x $indent, $_, "\n";
+ $indent += split('\(', $_, -1) - split('\)', $_, -1);
+ }
+ }
+}
+
+1;
diff --git a/fonts/utilities/vplutils/paths.pl b/fonts/utilities/vplutils/paths.pl
new file mode 100644
index 0000000000..8ba65a9018
--- /dev/null
+++ b/fonts/utilities/vplutils/paths.pl
@@ -0,0 +1,51 @@
+# -*-perl-*-
+# paths.pl
+# (C) A. J. C. Duggan 22/9/93
+# Path expansion and file searching package
+#
+# public routines are:
+# pathexpand(path, default, initial) Expands colon-separated path
+# pathopen(name, suffixes, path) Opens file by searching path
+
+###############################################################################
+# Path manipulation routines
+###############################################################################
+
+package paths; # start package
+
+# pathexpand(path, defaultpath, extra...)
+# expands a colon-separated path and default path to an array, inserting the
+# default path instead of null components in the path. An optional third
+# argument has extra elements to put at the start of the path.
+sub main'pathexpand {
+ local($path, $defaultpath, @path) = @_;
+ grep($_ eq '' ?
+ grep($_ ne '' ? push(@path, $_) : 0, split(/:/, $defaultpath)) :
+ push(@path, $_),
+ split(/:/, $path, -1));
+ @path;
+}
+
+# pathopen(file, suffixes, path...)
+# searches the path for file name and opens it for reading.
+# suffixes is a comma-separated list of suffixes to be applied to file.
+# returns non-zero on success, the undefined value otherwise.
+sub main'pathopen {
+ local($name, $suffixes, @path) = @_;
+ local($package) = caller;
+ print STDERR "Searching ", join(':', @path), " for $name\n",
+ "Suffixes ", join(', ', split(',', $suffixes, -1)), "\n"
+ if $main'debug;
+ foreach $dir (@path) {
+ foreach $suffix (split(',', $suffixes, -1)) {
+ $suffix = ".$suffix" if $suffix ne '';
+ print STDERR "Trying $dir/$name$suffix ...\n" if $main'debug;
+ return $value if $value = open("${package}'$name",
+ "$dir/$name$suffix");
+ }
+ }
+ print STDERR "$name not found\n" if $main'debug;
+ undef;
+}
+
+1;
diff --git a/fonts/utilities/vplutils/spacevpl.man b/fonts/utilities/vplutils/spacevpl.man
new file mode 100644
index 0000000000..1cba9ec9ca
--- /dev/null
+++ b/fonts/utilities/vplutils/spacevpl.man
@@ -0,0 +1,85 @@
+.TH SPACEVPL 1 "VPLUtils Release @RELEASE@"
+.SH NAME
+spacevpl \- alter character dimensions and shifts in TeX's PL and VPL fonts
+.SH SYNOPSIS
+.B spacevpl
+[
+.B \-quiet
+] [
+.B \-range
+.I range
+] [
+.B \-wd
+.I expr
+] [
+.B \-ht
+.I expr
+] [
+.B \-dp
+.I expr
+] [
+.B \-ic
+.I expr
+] [
+.B \-hs
+.I expr
+] [
+.B \-vs
+.I expr
+]
+.I font
+.SH DESCRIPTION
+.I Spacevpl
+alters the dimensions of characters in a property list (PL) or virtual
+property list (VPL) file.
+.PP
+The options
+.B \-wd, \-ht, \-dp, \-ic, \-hs
+and
+.B \-vs
+are used to specify how the character width, height, depth, italic correction,
+horizontal shift, and vertical shift are altered. The
+.I expr
+argument to these options is an arithmetic expression, which may include
+numeric constants (given in points) and any of
+.I wd, ht, dp, ic, hs
+and
+.I vs
+to specify the original values of the character dimensions, or
+.I ds
+to specify the design size of the font. These operands are combined with the
+operators
+.I \-, *, /, +.
+Sub-expressions may be enclosed in parentheses.
+.PP
+The
+.B \-range
+option specifies the range of characters which are modified. The range is a
+comma separated list of numbers or subranges of the form
+.I low\-high.
+If
+.I low
+and/or
+.I high
+are omitted, the subrange is unbounded at the appropriate end(s).
+.PP
+Normally
+.I spacevpl
+informs you about what it is doing; the
+.B \-quiet
+option prevents this behaviour.
+.SH EXAMPLES
+To create adjust a normal italic font so that it is more appropriate for maths
+typesetting, add the italic correction onto the character width, and remove
+the italic correction. Extra left and right sidebearings is applied too:
+.sp
+.ce
+spacevpl -wd 'ic+wd+.15*ds' -ic 0 -hs '0.02*ds' in.pl >out.vpl
+.sp
+.SH AUTHOR
+Angus Duggan
+.SH "SEE ALSO"
+@MAN@, vftovp(1), vptovf(1), tftopl(1), afm2tfm(1)
+.SH BUGS
+.I Spacevpl
+is slow.
diff --git a/fonts/utilities/vplutils/spacevpl.pl b/fonts/utilities/vplutils/spacevpl.pl
new file mode 100644
index 0000000000..f51201630f
--- /dev/null
+++ b/fonts/utilities/vplutils/spacevpl.pl
@@ -0,0 +1,349 @@
+#!@PERL@
+# spacevpl
+# (C) A. J. C. Duggan 1993
+# Alter sizes at sidebearings of VPL files
+#
+# actions are ---
+# -ht expr -wd expr -dp expr -ic expr -hs expr -vs expr
+# (ic = italic correction, wd = width, ht = height, dp = depth,
+# hs = horizontal shift, vs = vertical shift)
+# exprs combine these dimensions and constants with *, /, +, -
+
+# v1.2 23/9/93 AJCD
+# Created at vplutils release level 1.2
+
+($prog) = ($0 =~ /([^\/]*)$/);
+
+unshift(@INC, "@PERLLIBDIR@"); # set perl include directory
+
+require 'paths.pl';
+require 'parseenc.pl';
+require 'parsepl.pl';
+
+###############################################################################
+# Auxiliary routines
+###############################################################################
+
+# fatal(...)
+# causes a fatal error with the arguments given
+sub fatal {
+ print STDERR "$prog: ";
+ printf STDERR @_;
+ print STDERR "\n";
+ exit 1;
+}
+
+# inrange(num, range)
+# tests if number is in the range given
+# range = num[,range] | [num]-[num][,range] | []
+sub inrange {
+ local($number, $range) = @_;
+ foreach (split(/,/, $range)) {
+ if (/^(0x?[\da-fA-F]+)/) {
+ next if $number < oct($1);
+ } elsif (/^(\d+)/) {
+ next if $number < $1;
+ }
+ if (/(0x?[\da-fA-F]+)$/) {
+ next if $number > oct($1);
+ } elsif (/(\d+)$/) {
+ next if $number > $1;
+ }
+ return 1;
+ }
+ 0;
+}
+
+###############################################################################
+# Property list manipulation routines
+###############################################################################
+
+# PL property functions
+# called by parsepl with normal arguments as parameters
+
+sub printprop { # print a property
+ &expand(&property(@_));
+ undef;
+}
+
+sub printlist { # print a property list
+ &expand(&list(@_));
+ undef;
+}
+
+sub mapfont { # print a property list with one previous param
+ local($first) = join(' ', shift, shift);
+ $mapfont = 1;
+ &expand(&list($first, @_));
+ undef;
+}
+
+sub vtitle {
+ &expand(&property("COMMENT", @_));
+ undef;
+}
+
+sub checksum { # save checksum
+ local($name, $number) = @_;
+ push(@fontprops, "(FONTCHECKSUM $number)");
+ &expand(&property($name, $number));
+ undef;
+}
+
+sub designunits { # save designunits
+ local($name, $number) = @_;
+ $designunits = &number($number);
+ &expand(&property($name, $number));
+ undef;
+}
+
+sub designsize { # save designsize
+ local($name, $number) = @_;
+ push(@fontprops, "(FONTDSIZE $number)");
+ $designsize = &number($number);
+ &expand(&property($name, $number));
+ undef;
+}
+
+# character properties
+%charprop = @thismap = ();
+
+sub charprop {
+ local($name, $number) = @_;
+ $charprop{$name} = &number($number)*$designsize/$designunits;
+ undef;
+}
+
+sub moveright {
+ local($name, $number) = @_;
+ if ($charprop{CHARHS} || $charprop{MARKED}) {
+ &property(@_);
+ } else {
+ $charprop{CHARHS} = &number($number)*$designsize/$designunits;
+ undef;
+ }
+}
+
+sub moveleft {
+ local($name, $number) = @_;
+ if ($charprop{CHARHS} || $charprop{MARKED}) {
+ &property(@_);
+ } else {
+ $charprop{CHARHS} = -&number($number)*$designsize/$designunits;
+ undef;
+ }
+}
+
+sub moveup {
+ local($name, $number) = @_;
+ if ($charprop{CHARVS} || $charprop{MARKED}) {
+ &property(@_);
+ } else {
+ $charprop{CHARVS} = &number($number)*$designsize/$designunits;
+ undef;
+ }
+}
+
+sub movedown {
+ local($name, $number) = @_;
+ if ($charprop{CHARVS} || $charprop{MARKED}) {
+ &property(@_);
+ } else {
+ $charprop{CHARVS} = -&number($number)*$designsize/$designunits;
+ undef;
+ }
+}
+
+sub mark { # MAP property which makes a mark
+ $charprop{MARKED} = 1;
+ &property(@_);
+}
+
+sub map { # deal with MAP lists
+ shift;
+ @thismap = @_;
+ undef;
+}
+
+sub character { # add or replace character properties
+ local($name) = shift;
+ local($number) = shift;
+ local($value) = &number($number);
+ local(%props) = %charprop;
+
+ if (!$mapfont) {
+ &expand("(MAPFONT D 0", @fontprops, ")");
+ $mapfont = 1;
+ }
+
+ if (&inrange($value, $range)) { # adjust values
+ print STDERR "Altering properties for character $number\n" if $debug;
+ foreach (CHARWD, CHARHT, CHARDP, CHARIC, CHARHS, CHARVS) {
+ $props{$_} = eval $expr{$_}
+ if defined($expr{$_});
+ }
+ }
+ foreach (CHARWD, CHARHT, CHARDP, CHARIC) {
+ if ($props{$_}) {
+ push(@_, sprintf("($_ R %.5f)", $props{$_}*$designunits/$designsize));
+ }
+ }
+ push(@thismap, "(SETCHAR $number)") # add default map if necessary
+ if !@thismap && ($props{CHARHS} || $props{CHARVS});
+ if ($props{CHARHS} > 0) {
+ unshift(@thismap, sprintf("(MOVERIGHT R %.5f)",
+ $props{CHARHS}*$designunits/$designsize));
+ } elsif ($props{CHARVS} < 0) {
+ unshift(@thismap, sprintf("(MOVELEFT R %.5f)",
+ -$props{CHARHS}*$designunits/$designsize));
+ }
+ if ($props{CHARVS} > 0) {
+ unshift(@thismap, sprintf("(MOVEUP R %.5f)",
+ $props{CHARVS}*$designunits/$designsize));
+ } elsif ($props{CHARVS} < 0) {
+ unshift(@thismap, sprintf("(MOVEDOWN R %.5f)",
+ -$props{CHARVS}*$designunits/$designsize));
+ }
+
+ @thismap = ("(MAP", @thismap, ")")
+ if @thismap;
+
+ &expand("(CHARACTER $number", @_, @thismap, ")");
+
+ %charprop = @thismap = ();
+ undef;
+}
+
+###############################################################################
+# Parsing and tokenisation
+###############################################################################
+
+# list of property -> parameters_action
+# (N=number, S=string, P=property list, L=label or number)
+&plactions(CHECKSUM, checksum, DESIGNSIZE, designsize,
+ DESIGNUNITS, designunits, CODINGSCHEME, printprop,
+ FAMILY, printprop, FACE, printprop, SEVENBITSAFEFLAG, ignore,
+ HEADER, printprop, BOUNDARYCHAR, printprop,
+ VTITLE, vtitle, COMMENT, printprop,
+ FONTDIMEN, printlist, # FONTDIMEN properties follow
+ SLANT, property, SPACE, property, STRETCH, property,
+ SHRINK, property, XHEIGHT, property, QUAD, property,
+ EXTRASPACE, property, NUM1, property, NUM2, property,
+ NUM3, property, DENOM1, property, DENOM2, property,
+ SUP1, property, SUP2, property, SUP3, property,
+ SUB1, property, SUB2, property, SUPDROP, property,
+ SUBDROP, property, DELIM1, property, DELIM2, property,
+ AXISHEIGHT, property, DEFAULTRULETHICKNESS, property,
+ BIGOPSPACING1, property, BIGOPSPACING2, property,
+ BIGOPSPACING3, property, BIGOPSPACING4, property,
+ BIGOPSPACING5, property, PARAMETER, property,
+ LIGTABLE, printlist, # LIGTABLE properties follow
+ LABEL, property, KRN, property, STOP, property,
+ SKIP, property, LIG, property, '/LIG', property,
+ '/LIG>', property, 'LIG/', property, 'LIG/>', property,
+ '/LIG/', property, '/LIG/>', property,
+ '/LIG/>>', property,
+ MAPFONT, mapfont, # MAPFONT properties follow
+ FONTDSIZE, property, FONTNAME, property, FONTAREA, property,
+ FONTCHECKSUM, property, FONTAT, property,
+ CHARACTER, character, # CHARACTER properties follow
+ CHARWD, charprop, CHARHT, charprop, CHARDP, charprop,
+ CHARIC, charprop, NEXTLARGER, property,
+ VARCHAR, list, # VARCHAR properties follow
+ TOP, property, MID, property, BOT, property, REP, property,
+ MAP, map, # MAP properties follow
+ SELECTFONT, property, SETCHAR, mark,
+ SETRULE, mark, PUSH, mark, POP, mark,
+ MOVERIGHT, moveright, MOVELEFT, moveleft, MOVEUP, moveup,
+ MOVEDOWN, movedown, SPECIAL, mark, SPECIALHEX, mark
+ );
+
+###############################################################################
+# Expression checking
+###############################################################################
+
+# compileexpr(expr)
+# sanitise and convert expression to do-form
+sub compileexpr {
+ local($expr) = shift;
+ local($paren, $operand, $newexpr) = (0, 1);
+ foreach (split(/([-()\/*+])/, $expr)) {
+ s/\s*//g; # drop spaces
+ next if /^$/; # ignore empty lines
+ if ($operand) { # operand expected
+ if (/^\d+$/ || /^\d*\.\d+$/) { # constant
+ $newexpr .= $_;
+ $operand = 0;
+ } elsif (/^wd$/ || /^ht$/ || /^dp$/ || /^ic$/ || /^hs$/ || /^vs$/) {
+ tr/a-z/A-Z/; # uppercase
+ $newexpr .= "\$charprop{CHAR$_}"; # character property
+ $operand = 0;
+ } elsif (/^ds$/) { # designsize
+ $newexpr .= "\$designsize";
+ $operand = 0;
+ } elsif (/\(/) { # open parenthesis
+ $newexpr .= $_;
+ $paren++;
+ } elsif (/-/) { # unary negation
+ $newexpr .= $_;
+ } else {
+ &fatal("Operand expected, got $_ in $expr\n");
+ }
+ } else { # operator expected
+ if (/[-+*\/]/) { # operator found
+ $newexpr .= $_;
+ $operand = 1;
+ } elsif (/\)/) { # close parenthesis
+ $newexpr .= $_;
+ &fatal("Unmatched ) in $expr\n") if --$paren < 0;
+ } else {
+ &fatal("Operator expected, got $_ in $expr\n");
+ }
+ }
+ }
+ &fatal("Unmatched ( in $expr\n") if $paren;
+ print STDERR "Compiled $expr to $newexpr\n" if $debug;
+ $newexpr;
+}
+
+###############################################################################
+# Argument processing
+###############################################################################
+
+$vtitle = join(' ', $prog, @ARGV); # set VTITLE to arguments
+%expr = (); # property -> expression
+$range = '-'; # character range
+
+while (@ARGV) {
+ $_ = shift;
+ ARGSW:
+ {
+ /^-quiet$/ && ($quiet = 1, last ARGSW);
+ /^-debug$/ && ($debug = 1, last ARGSW);
+ /^-range$/ && ($range = shift, last ARGSW);
+ /^-(ic|wd|ht|dp|hs|vs)$/ &&
+ (($prop = "CHAR$1") =~ tr/a-z/A-Z/,
+ $expr{$prop} = &compileexpr(shift), last ARGSW);
+ if (/^-/) {
+ /^-v$/ && print STDERR "$prog release @RELEASE@\n";
+ print STDERR join("\n",
+ "Usage: $prog [-quiet] [-defenc defaultenc] [-wd expr] [-ht expr] [-dp expr]",
+ " [-hs expr] [-vs expr] filename\n");
+ exit 1;
+ } else { # filename
+ &fatal('too many property list files specified') if defined($file);
+ $file = $_;
+ }
+ }
+}
+
+&fatal('no property list files specified') if !defined($file);
+
+print "(VTITLE created by $vtitle)\n",
+ "(COMMENT $prog is (C) A. J. C. Duggan 1993)\n";
+
+@fontprops = ("(FONTNAME ".&fontname($file).")");
+
+&parsepl($file); # process PL file
+
+exit 0; # good termination