diff options
Diffstat (limited to 'fonts/utilities/vplutils')
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 |