summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDr. Clea F. Rees <cfrees@imapmail.org>2008-12-28 23:55:42 +0000
committerDr. Clea F. Rees <cfrees@imapmail.org>2008-12-28 23:55:42 +0000
commit0ea692dfc516c549c696115ab6e0672659fde2dd (patch)
treeb4010874865e73b344cab4ebdc96fe0720c673a9
parentd48f7c90859ad4c4f2d617a2c7f8456c5b1b5b8e (diff)
accfonts update 2008/12/28
git-svn-id: svn://tug.org/texlive/trunk@11742 c570f23f-e606-0410-a88d-b1316a301751
-rw-r--r--Master/texmf-dist/doc/latex/accfonts/CHANGES (renamed from Master/texmf-dist/doc/fonts/accfonts/CHANGES)74
-rw-r--r--Master/texmf-dist/doc/latex/accfonts/COPYING (renamed from Master/texmf-dist/doc/fonts/accfonts/COPYING)0
-rw-r--r--Master/texmf-dist/doc/latex/accfonts/README (renamed from Master/texmf-dist/doc/fonts/accfonts/README)227
-rwxr-xr-x[-rw-r--r--]Master/texmf-dist/doc/latex/accfonts/mkt1font (renamed from Master/texmf-dist/doc/fonts/accfonts/mkt1font)10
-rwxr-xr-xMaster/texmf-dist/doc/latex/accfonts/vpl2ovp1070
-rwxr-xr-x[-rw-r--r--]Master/texmf-dist/doc/latex/accfonts/vpl2vpl (renamed from Master/texmf-dist/doc/fonts/accfonts/vpl2vpl)101
-rw-r--r--Master/texmf-dist/fonts/enc/dvips/accfonts/dvips.enc75
-rw-r--r--Master/texmf-dist/tex/latex/accfonts/IndUni_Omega.def406
8 files changed, 1882 insertions, 81 deletions
diff --git a/Master/texmf-dist/doc/fonts/accfonts/CHANGES b/Master/texmf-dist/doc/latex/accfonts/CHANGES
index 8ae0528cf4c..01af0961fc6 100644
--- a/Master/texmf-dist/doc/fonts/accfonts/CHANGES
+++ b/Master/texmf-dist/doc/latex/accfonts/CHANGES
@@ -84,8 +84,8 @@ vpl2vpl, however, it is likely that such accents will still
sometimes require manual intervention.)
-Changes to vpl2vpl and mkt1font between release 0.1 and release 0.2
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Changes between release 0.1 and release 0.2
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
A. Changes common to both programs
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -163,8 +163,8 @@ this could result in the bottom of the accent failing to print
properly.
-Changes to vpl2vpl and mkt1font between release 0.2 and release 0.21
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Changes between release 0.2 and release 0.21
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Changes common to both programs
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -178,8 +178,8 @@ superscript accents placed on them must be raised above the normal
level has been increased slightly (from 1.1 x xheight to 1.15 x
xheight).
-Changes to vpl2vpl and mkt1font between release 0.21 and release 0.211
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Changes between release 0.21 and release 0.211
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
A. Changes to vpl2vpl
~~~~~~~~~~~~~~~~~~~~~
@@ -198,8 +198,8 @@ Minor bugfixes have been put in place: extra spaces in the the
"noaccess def" and "noaccess put" definitions are now permitted, and
so is a character named ".null". An error message has been improved.
-Changes to vpl2vpl and mkt1font between release 0.211 and release 0.212
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Changes between release 0.211 and release 0.212
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
A. Changes to vpl2vpl
~~~~~~~~~~~~~~~~~~~~~
@@ -214,8 +214,8 @@ B. Changes to mkt1font
Fixed a bug which produced incorrect output in cases where the
character to be accented is defined as blank (e.g. space).
-Changes to vpl2vpl and mkt1font between release 0.212 and release 0.22
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Changes to between release 0.212 and release 0.22
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Changes common to both programs
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -235,8 +235,8 @@ previously happened that the output font contained both characters.
This has been fixed: now only the character requested in the
definition file exists in the output.
-Changes to vpl2vpl and mkt1font between release 0.22 and release 0.221
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Changes between release 0.22 and release 0.221
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
A. Changes to mkt1font
~~~~~~~~~~~~~~~~~~~~~~
@@ -244,11 +244,57 @@ A. Changes to mkt1font
Fixed a bug which caused the program to fail after incorrectly
identifying CharStrings definitions.
-Changes to vpl2vpl and mkt1font between release 0.221 and release 0.222
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Changes tbetween release 0.221 and release 0.222
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
A. Changes to mkt1font
~~~~~~~~~~~~~~~~~~~~~~
Changed FamilyName to remove only the final one of a number of
hyphenated elements from the font name.
+
+Changes tbetween release 0.222 and release 0.23
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+A. Changes to mkt1font
+~~~~~~~~~~~~~~~~~~~~~~
+
+No changes have in fact been made to mkt1font, but its version number
+has been raised to 0.23 to confirm with those of vpl2vpl and vpl2ovp.
+
+B. Changes to vpl2vpl
+~~~~~~~~~~~~~~~~~~~~~
+
+A change has been introduced to permit the program to use the output
+of the AFM conversion utility afm2pl, rather than the earlier afm2tfm.
+This has been done because it has come to light that afm2tfm gives
+incorrect values for the heights of some characters, which can cause
+poor accent placement. Support for the output of afm2tfm has not been
+withdrawn, but afm2pl is now definitely preferred.
+
+B. A new program: vpl2ovp
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The greatest change as of 0.23 is the addition of a third program to
+the suite. Vpl2ovp does essentially the same job as vpl2vpl, in that
+it creates virtual fonts that contain arbitrarily accented characters,
+but its output is a .ovp file suitable for use with Omega (the 16-bit
+Unicode-aware development from TeX). Using vpl2ovp it is possible to
+build substantial Unicode-compliant virtual fonts for use with Omega,
+and a .def file for the set of characters I have included in my
+earlier "IndUni" OpenType fonts is now included in the distribution.
+(IndUni virtual fonts for Omega created with vpl2ovp are available at
+http://bombay.indology.info/software/fonts/induni/index.html.) Glyphs
+representing characters requiring more than a single codepoint are
+stored in the Private Use Area, and a system of ligatures is provided
+to allow them to be accessed. This system also permits
+single-codepoint accented characters to be accessed through their
+"decomposed" component parts. Thus if the characters a-macron (single
+codepoint: U+0101) and a-macron-acute (two codepoints: U+0101 +
+U+0301) are defined, the former will be accessible both as U+0101
+(a-macron) and as U+0061 + U+0304 ("a" + macron); the latter will be
+accessible both as U+0101 + U+0301 (a-macron + acute) and U+0061 +
+U+0304 + U+0301 ("a" + macron + acute). This is a considerable
+advantage, given the different possible ways in which Unicode can be,
+and is, used.
+
diff --git a/Master/texmf-dist/doc/fonts/accfonts/COPYING b/Master/texmf-dist/doc/latex/accfonts/COPYING
index a43ea2126fb..a43ea2126fb 100644
--- a/Master/texmf-dist/doc/fonts/accfonts/COPYING
+++ b/Master/texmf-dist/doc/latex/accfonts/COPYING
diff --git a/Master/texmf-dist/doc/fonts/accfonts/README b/Master/texmf-dist/doc/latex/accfonts/README
index 23fbbb553e2..7f775f1b858 100644
--- a/Master/texmf-dist/doc/fonts/accfonts/README
+++ b/Master/texmf-dist/doc/latex/accfonts/README
@@ -1,33 +1,25 @@
- Mkt1font and vpl2vpl: programs to generate accented fonts
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
- John D. Smith, University of Cambridge, 1997
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-
-These two programs address the same requirement using the same basic
-algorithms: their aim is to make it easy to create versions of
-existing fonts containing whatever accented characters the user may
-need, arranged according to whatever encoding he/she may favour.
-Mkt1font does this by reading in the two files that define a Type 1
-PostScript font and writing out new versions of them; vpl2vpl does
-it by reading in the file that defines a TeX virtual font and
-writing out a new version of it. In each case information about what
-accented characters are required and where they should be located is
-supplied by means of a simple definition file, which has the same
-format for both programs.
-
-It is common to hear someone say, "I need a font containing
-such-and-such special characters," when really they should be
-saying, "I need a version of Times/Palatino/New Century Schoolbook
-etc. containing the special characters for such-and-such a
-language." If we are to take full advantage of computer typesetting
-and desktop publishing, we need to be able to choose our fonts on
-grounds of aesthetic merit rather than expediency, and to move
-towards standardised encodings. These programs should go some way to
-making this possible.
+ Mkt1font, vpl2vpl and vpl2ovp: programs to generate accented fonts
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ John D. Smith
+ ~~~~~~~~~~~~~
+
+
+These three programs, all made available under the GNU General Public
+License, address the same requirement using the same basic algorithms:
+their aim is to make it easy to create versions of existing fonts
+containing whatever accented characters the user may need, arranged
+according to whatever encoding he/she may favour. Mkt1font does this
+by reading in the two files that define a Type 1 PostScript font and
+writing out new versions of them; vpl2vpl does it by reading in the
+file that defines a TeX virtual font and writing out a new version of
+it; vpl2ovp does the same as vpl2vpl, but its output is a 16-bit
+virtual font suitable for Omega, the Unicode-aware development from
+TeX. In each case information about what accented characters are
+required and where they should be located is supplied by means of a
+simple definition file, which has the same format for both programs.
Note that most Type 1 PostScript fonts are commercial products
subject to both copyright and licensing restrictions. If the license
@@ -50,15 +42,14 @@ ftp.tex.ac.uk: look for the most recent font archive file in the
directory /tex-archive/support/ghostscript/gnu/fonts.
A detailed specification of the form of the definition file used by
-mkt1font and vpl2vpl is given below in the instructions for using
-the two programs, but it may be helpful to give a quick idea of its
-contents here. Each line of the file contains something similar to
-"128 x acute", which is an instruction to create a new character
-formed from "x" with an acute accent and located at position 128 in
-the character set. Once a new character has been defined in this
-way, it "exists" in just the same way as any other character, under
-the name "xacute" (or whatever); thus it can even receive further
-accents. The two lines
+mkt1font and vpl2vpl is given below in the instructions for using the
+programs, but it may be helpful to give a quick idea of its contents
+here. Each line of the file contains something similar to "128 x
+acute", which is an instruction to create a new character formed from
+"x" with an acute accent and located at position 128 in the character
+set. Once a new character has been defined in this way, it "exists" in
+just the same way as any other character, under the name "xacute" (or
+whatever); thus it can even receive further accents. The two lines
129 e macron
130 emacron breve
@@ -109,6 +100,9 @@ possible to make changes to this and rebuild the pfb file with t1asm
(see below), but this is not quite as simple as modifying a TeX
virtual font.
+For details on how vpl2ovp handles access to accented characters by
+means of a system of ligatures, see further the CHANGES file.
+
The programs are written in Perl, and have not been tested on
systems other than Unix. (Apart from the #! line at the top, the
only Unix specificities the author is aware of are two references to
@@ -116,15 +110,11 @@ only Unix specificities the author is aware of are two references to
can be of any length.) At run time, mkt1font invokes two further
font utilities, t1asm and t1disasm, written by I. Lee Hetherington
and available from CTAN ftp sites: look in the directory
-/tex-archive/fonts/utilities/t1utils. If it is intended to use the
-fonts output by mkt1font with Adobe Type Manager, it will probably
-be necessary to create ".inf" and/or ".pfm" files for them: for this
-there is a useful shareware program for MS-DOS called REFONT, which
-can be found at http://www.asy.com/sharewr.htm.
+/tex-archive/fonts/utilities/t1utils.
-Detailed instructions for using the two programs follow. In each
-case these instructions can also be seen by typing the name of the
-program with a "-h" option.
+Detailed instructions for using the programs follow. In each case
+these instructions can also be seen by typing the name of the program
+with a "-h" option.
Mkt1font
@@ -239,14 +229,23 @@ will make the necessary changes on the fly.
A typical complete sequence of commands to create a new virtual
font might therefore be
- afm2tfm Times-Roman.afm -t dvips.enc -v ptmr rptmr
- vpl2vpl -d ISO-Latin1.def ptmr.vpl >ptmr_isol1.vpl
- vptovf ptmr_isol1.vpl ptmr_isol1.vf ptmr_isol1.tfm
-for a PostScript font, or
tftopl cmr10.tfm cmr10.pl
vpl2vpl -d ISO-Latin1.def cmr10.pl >cmr10_isol1.vpl
vptovf cmr10_isol1.vpl cmr10_isol1.vf cmr10_isol1.tfm
-for a Computer Modern font.
+for a Computer Modern font, or
+ afm2pl Times-Roman.afm rptmr.pl
+ pltotf rptmr.pl rptmr.tfm
+ vpl2vpl -d ISO-Latin1.def rptmr.pl >ptmr-isol1.vpl
+ vptovf ptmr-isol1.vpl ptmr-isol1.vf ptmr-isol1.tfm
+for a PostScript font.
+
+Another approach for a PostScript font is to use afm2tfm:
+ afm2tfm Times-Roman.afm -t dvips.enc -v ptmr rptmr
+ vpl2vpl -d ISO-Latin1.def ptmr.vpl >ptmr-isol1.vpl
+ vptovf ptmr-isol1.vpl ptmr-isol1.vf ptmr-isol1.tfm
+-- but this is now deprecated, as afm2tfm generates incorrect
+values for the heights of some characters, and this can lead to
+bad accent placing.
In order to keep the whole upper half of the character set free for
the requirements of the encoding specified in the definition file,
@@ -329,5 +328,129 @@ Options:
-h prints this help.
-John D. Smith john.smith@oriental.cam.ac.uk
-University of Cambridge http://bombay.oriental.cam.ac.uk
+Vpl2ovp
+~~~~~~~
+
+Syntax: vpl2ovp -d definition-file [-s shrink-factor]
+ [-c candrabindu-adjustment] [-b] vpl-file
+
+Vpl2ovp creates new Omega virtual fonts based on existing TeX
+virtual fonts ("input fonts"). A successful run will read a vpl
+(Virtual Property List) file and a definition file, and will generate
+a new ovp file on standard output. The input font is assumed to adhere
+to the standard TeX encoding for text fonts unless it was created with
+the program afm2tfm, in which case it is assumed to conform to the
+encoding specified in the file dvips.enc. In either case, the name
+of the input font is assumed to be the name of the input file
+without its .vpl extension: it must conform to normal TeX
+conventions for naming fonts, as vpl2ovp attempts to draw
+conclusions from it about the kind of font it is dealing with.
+
+In the case of a non-virtual font (such as the Computer Modern
+fonts), use a pl (Property List) file, created with the standard
+utility tftopl, as the input file in place of a vpl file; vpl2ovp
+will make the necessary changes on the fly.
+
+A typical complete sequence of commands to create a new virtual
+font might therefore be
+ tftopl cmr10.tfm cmr10.pl
+ vpl2ovp -d Unicode1.def cmr10.pl >cmr10-uni1.ovp
+ ovp2ovf cmr10-uni1.ovp cmr10-uni1.ovf cmr10-uni1.ofm
+for a Computer Modern font, or
+ afm2pl Times-Roman.afm rptmr.pl
+ pltotf rptmr.pl rptmr.tfm
+ vpl2ovp -d Unicode1.def rptmr.pl >ptmr-uni1.ovp
+ ovp2ovf ptmr-uni1.ovp ptmr-uni1.ovf ptmr-uni1.ofm
+for a PostScript font.
+
+Another approach for a PostScript font is to use afm2tfm:
+ afm2tfm Times-Roman.afm -t dvips.enc -v ptmr rptmr
+ vpl2ovp -d Unicode1.def ptmr.vpl >ptmr-uni1.ovp
+ ovp2ovf ptmr-uni1.ovp ptmr-uni1.ovf ptmr-uni1.ofm
+-- but this is now deprecated, as afm2tfm generates incorrect
+values for the heights of some characters, and this can lead to
+bad accent placing.
+
+In order to keep the whole of the character range "F0-"FF free
+for the requirements of the encoding specified in the definition
+file, certain modifications are made to input fonts following the
+dvips.enc encoding to bring them into greater conformity with the
+TeX norm. In particular, the characters dotaccent and hungarumlaut
+are placed in the positions assigned by TeX ("5F, "7D), not those
+enforced by dvips.enc ("C7, "CD). The f-ligatures, double quotes
+and dashes are also moved from the upper half of the character set
+to their normal TeX positions. As a result, the following characters
+are not found in the lower half of the character set: quotesingle,
+quotedbl, backslash, underscore, braceleft, bar, braceright. These
+characters can, however, be assigned positions in the output font if
+they are needed. (Indeed, they could all be explicitly restored to
+their dvips.enc positions if this were desired.)
+
+Options:
+
+ -d should refer to a font definition file. This file (which could
+ usefully be named, e.g., "French.def") should consist of
+ lines of character definitions, in the form
+ "number" "character"
+ or
+ "number" "character" "accent"
+ Here "number" represents the character's position in the new
+ encoding and may be expressed in decimal, octal or hex;
+ "character" names the character (e.g. "comma", "eight",
+ "A") or consists of the word ".notdef" (indicating that
+ the specified number's "slot" in the new encoding is to be
+ empty); and "accent" optionally names an accent to be placed
+ on the character. In addition to the standard accents available
+ in PostScript fonts, "underbar" and "underdot" are also
+ available, as are "under" versions of all the normal
+ superscript accents ("underdieresis", "underring", etc.).
+ The Indian accent "candrabindu" may also be specified: it
+ is formed by overprinting a breve with a dotaccent. Finally,
+ "overdot" may be used as a synonym for "dotaccent".
+
+ If the character named in the "accent" position is not in fact
+ a valid accent character, the program interprets the definition
+ as a request for a digraph formed from the "character" and the
+ "accent". A digraph consisting of, say, "k" and "h" will be
+ indistinguishable from the letters "k" and "h" printed
+ consecutively, but the digraph "kh" can itself receive accents
+ like any other character: see next paragraph.
+
+ A new character (such as "amacron" or "kh") may be freely
+ used in the "character" position of a further definition (such
+ as "amacron breve" or "kh underbar"). There is no constraint
+ on the ordering of definitions within a definition file. The
+ definition of "a macron" does not have to precede that of
+ "amacron breve": requests for "impossible" characters are
+ deferred until their constituents have had a chance to come into
+ being.
+
+ "Slots" for which no new definition is given retain the
+ definition they have in the input font.
+
+ The definition file may also contain blank lines and comments
+ (introduced by "#").
+
+ -s may optionally give the factor, expressed as a per-thousand
+ value, by which normally superscript accents (such as dieresis,
+ ring) should be shrunk when they are used as subscript accents
+ (such as underdieresis, underring). Values of around 800 may be
+ found useful.
+
+ -c may optionally give two comma-separated numerical values to
+ adjust the x and y coordinates of the dotaccent placed within a
+ breve to form the candrabindu accent. A coordinate scheme using
+ "DESIGNUNITS R 1000" is assumed.
+
+ -b may optionally be specified to block the use of predefined
+ accented characters, forcing vpl2ovp to define its own
+ versions. This may be useful to secure a consistent appearance
+ in cases where a font designer does not share vpl2ovp's views
+ on where accents should be placed.
+
+ -h prints this help.
+
+
+John D. Smith
+jds10@cam.ac.uk
+http://bombay.indology.info
diff --git a/Master/texmf-dist/doc/fonts/accfonts/mkt1font b/Master/texmf-dist/doc/latex/accfonts/mkt1font
index f910693ffc9..c092673cb3f 100644..100755
--- a/Master/texmf-dist/doc/fonts/accfonts/mkt1font
+++ b/Master/texmf-dist/doc/latex/accfonts/mkt1font
@@ -17,7 +17,7 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-$version = 0.222;
+$version = 0.23;
#-----------------------------------------------------------------------------#
$description =
"Syntax: mkt1font -n fontname -d definition-file -a afm-file -f font-file
@@ -119,7 +119,7 @@ if ($opt_h or !($opt_n && $opt_d && $opt_a && $opt_f) or ($#ARGV >= 0)) {
print STDERR $description;
exit 1;
}
-($enc = basename($opt_d)) =~ s/\..*$//;
+($enc = basename($opt_d)) =~ s/\..*$//;
if ($opt_n =~ /\s/) { die "Font name cannot contain whitespace\n" }
($famname = $opt_n) =~ s/^(.*)-.*?$/$1/;
if ($opt_s) { $shrink = $opt_s / 1000 } else { $shrink = 1 }
@@ -400,7 +400,7 @@ while (@defs) {
# Now look for new char among existing encoded chars (unless blocked by -b)
#
else {
- if (!($acc and $opt_b)
+ if (!($acc and $opt_b)
and @foundit = grep / ; N $nchar ; /, @metrics_enc) {
($foundit = shift @foundit) =~ s/^C (\d+)/C $num/;
$prevnum = $1;
@@ -455,7 +455,7 @@ while (@defs) {
supacc($num, $char, $acc, $nchar);
fixkerns($char, $acc);
}
- elsif ($acc =~ /^$underacc$/) {
+ elsif ($acc =~ /^$underacc$/) {
underacc($num, $char, $acc, $nchar);
fixkerns($char, $acc);
}
@@ -510,7 +510,7 @@ if ($kdefs) {
}
#
# Eliminate composite character definitions
-#
+#
$afmtail =~ s/\n(Start|End)Composites.*$//gm;
$afmtail =~ s/\nCC .*;$//gm;
print OUTAFM $afmtail;
diff --git a/Master/texmf-dist/doc/latex/accfonts/vpl2ovp b/Master/texmf-dist/doc/latex/accfonts/vpl2ovp
new file mode 100755
index 00000000000..3bbc62ad669
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/accfonts/vpl2ovp
@@ -0,0 +1,1070 @@
+#!/usr/bin/perl
+
+# Vpl2ovp: a program to generate accented virtual fonts for Omega
+# Copyright (C) 2008 John D. Smith
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+$version = 0.23;
+#------------------------------------------------------------------------#
+$description =
+"Syntax: vpl2ovp -d definition-file [-s shrink-factor]
+ [-c candrabindu-adjustment] [-b] vpl-file
+
+Vpl2ovp creates new Omega virtual fonts based on existing TeX
+virtual fonts (\"input fonts\"). A successful run will read a vpl
+(Virtual Property List) file and a definition file, and will generate
+a new ovp file on standard output. The input font is assumed to adhere
+to the standard TeX encoding for text fonts unless it was created with
+the program afm2tfm, in which case it is assumed to conform to the
+encoding specified in the file dvips.enc. In either case, the name
+of the input font is assumed to be the name of the input file
+without its .vpl extension: it must conform to normal TeX
+conventions for naming fonts, as vpl2ovp attempts to draw
+conclusions from it about the kind of font it is dealing with.
+
+In the case of a non-virtual font (such as the Computer Modern
+fonts), use a pl (Property List) file, created with the standard
+utility tftopl, as the input file in place of a vpl file; vpl2ovp
+will make the necessary changes on the fly.
+
+A typical complete sequence of commands to create a new virtual
+font might therefore be
+ tftopl cmr10.tfm cmr10.pl
+ vpl2ovp -d Unicode1.def cmr10.pl >cmr10-uni1.ovp
+ ovp2ovf cmr10-uni1.ovp cmr10-uni1.ovf cmr10-uni1.ofm
+for a Computer Modern font, or
+ afm2pl Times-Roman.afm rptmr.pl
+ pltotf rptmr.pl rptmr.tfm
+ vpl2ovp -d Unicode1.def rptmr.pl >ptmr-uni1.ovp
+ ovp2ovf ptmr-uni1.ovp ptmr-uni1.ovf ptmr-uni1.ofm
+for a PostScript font.
+
+Another approach for a PostScript font is to use afm2tfm:
+ afm2tfm Times-Roman.afm -t dvips.enc -v ptmr rptmr
+ vpl2ovp -d Unicode1.def ptmr.vpl >ptmr-uni1.ovp
+ ovp2ovf ptmr-uni1.ovp ptmr-uni1.ovf ptmr-uni1.ofm
+-- but this is now deprecated, as afm2tfm generates incorrect
+values for the heights of some characters, and this can lead to
+bad accent placing.
+
+In order to keep the whole of the character range \"F0-\"FF free
+for the requirements of the encoding specified in the definition
+file, certain modifications are made to input fonts following the
+dvips.enc encoding to bring them into greater conformity with the
+TeX norm. In particular, the characters dotaccent and hungarumlaut
+are placed in the positions assigned by TeX (\"5F, \"7D), not those
+enforced by dvips.enc (\"C7, \"CD). The f-ligatures, double quotes
+and dashes are also moved from the upper half of the character set
+to their normal TeX positions. As a result, the following characters
+are not found in the lower half of the character set: quotesingle,
+quotedbl, backslash, underscore, braceleft, bar, braceright. These
+characters can, however, be assigned positions in the output font if
+they are needed. (Indeed, they could all be explicitly restored to
+their dvips.enc positions if this were desired.)
+
+Options:
+
+ -d should refer to a font definition file. This file (which could
+ usefully be named, e.g., \"French.def\") should consist of
+ lines of character definitions, in the form
+ \"number\" \"character\"
+ or
+ \"number\" \"character\" \"accent\"
+ Here \"number\" represents the character's position in the new
+ encoding and may be expressed in decimal, octal or hex;
+ \"character\" names the character (e.g. \"comma\", \"eight\",
+ \"A\") or consists of the word \".notdef\" (indicating that
+ the specified number's \"slot\" in the new encoding is to be
+ empty); and \"accent\" optionally names an accent to be placed
+ on the character. In addition to the standard accents available
+ in PostScript fonts, \"underbar\" and \"underdot\" are also
+ available, as are \"under\" versions of all the normal
+ superscript accents (\"underdieresis\", \"underring\", etc.).
+ The Indian accent \"candrabindu\" may also be specified: it
+ is formed by overprinting a breve with a dotaccent. Finally,
+ \"overdot\" may be used as a synonym for \"dotaccent\".
+
+ If the character named in the \"accent\" position is not in fact
+ a valid accent character, the program interprets the definition
+ as a request for a digraph formed from the \"character\" and the
+ \"accent\". A digraph consisting of, say, \"k\" and \"h\" will be
+ indistinguishable from the letters \"k\" and \"h\" printed
+ consecutively, but the digraph \"kh\" can itself receive accents
+ like any other character: see next paragraph.
+
+ A new character (such as \"amacron\" or \"kh\") may be freely
+ used in the \"character\" position of a further definition (such
+ as \"amacron breve\" or \"kh underbar\"). There is no constraint
+ on the ordering of definitions within a definition file. The
+ definition of \"a macron\" does not have to precede that of
+ \"amacron breve\": requests for \"impossible\" characters are
+ deferred until their constituents have had a chance to come into
+ being.
+
+ \"Slots\" for which no new definition is given retain the
+ definition they have in the input font.
+
+ The definition file may also contain blank lines and comments
+ (introduced by \"\#\").
+
+ -s may optionally give the factor, expressed as a per-thousand
+ value, by which normally superscript accents (such as dieresis,
+ ring) should be shrunk when they are used as subscript accents
+ (such as underdieresis, underring). Values of around 800 may be
+ found useful.
+
+ -c may optionally give two comma-separated numerical values to
+ adjust the x and y coordinates of the dotaccent placed within a
+ breve to form the candrabindu accent. A coordinate scheme using
+ \"DESIGNUNITS R 1000\" is assumed.
+
+ -b may optionally be specified to block the use of predefined
+ accented characters, forcing vpl2ovp to define its own
+ versions. This may be useful to secure a consistent appearance
+ in cases where a font designer does not share vpl2ovp's views
+ on where accents should be placed.
+
+ -h prints this help.
+";
+#------------------------------------------------------------------------#
+
+########################
+# Packages and constants
+########################
+#
+use File::Basename;
+use Getopt::Std;
+$cmdline = basename($0) . " " . join " ", @ARGV;
+getopts('d:s:c:bh');
+if ($opt_h or !$opt_d or $#ARGV != 0) {
+ print STDERR $description;
+ exit 1;
+}
+
+$filename = $ARGV[0];
+$dummycodepoint = 0xF8FF;
+($fontname = $filename) =~ s/\..*$//;
+($encname = basename($opt_d)) =~ s/\..*$//;
+$vtitle = "(VTITLE Font $fontname modified for $encname encoding by vpl2ovp";
+$vtitle .= " v. $version" if $version;
+$vtitle .= ")\n(COMMENT Command line: $cmdline)";
+$vtitle .= "\n(OFMLEVEL H 0)";
+
+#
+# Flags for bold and small caps. These are probably a bit iffy, but
+# there's not much that can be done about it.
+#
+if ($fontname =~ /(^p.*b[oi]?[c]?$|^[^p].*bx[a-z]*[0-9]+$)/) { $bold = 1 }
+if ($fontname =~ /(^p.*c$|^[^p].*csc[a-z]*[0-9]+$)/) { $scaps = 1 }
+if ($opt_s) { $shrink = $opt_s / 1000 } else { $shrink = 1 }
+
+#
+# Array to convert from number to vpl representation
+#
+foreach $i (0 .. 0xFFFF) {
+ $nv[$i] = (chr($i) =~ /[0-9A-Za-z]/ ? "C " . chr $i : sprintf("H %04lX", $i));
+}
+
+#
+# Now the encoding vectors.
+#
+@TeXenc = (
+ "Gamma", "Delta", "Theta", "Lambda",
+ "Xi", "Pi", "Sigma", "Upsilon",
+ "Phi", "Psi", "Omega", "ff",
+ "fi", "fl", "ffi", "ffl",
+ "dotlessi", "dotlessj", "grave", "acute",
+ "caron", "breve", "macron", "ring",
+ "cedilla", "germandbls", "ae", "oe",
+ "oslash", "AE", "OE", "Oslash",
+ "space", "exclam", "quotedblright", "numbersign",
+ "dollar", "percent", "ampersand", "quoteright",
+ "parenleft", "parenright", "asterisk", "plus",
+ "comma", "hyphen", "period", "slash",
+ "zero", "one", "two", "three",
+ "four", "five", "six", "seven",
+ "eight", "nine", "colon", "semicolon",
+ "exclamdown", "equal", "questiondown", "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",
+ "quotedblleft", "bracketright", "circumflex", "dotaccent",
+ "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", "endash",
+ "emdash", "hungarumlaut", "tilde", "dieresis"
+);
+
+@dvipsenc = (
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", "quotesingle", "exclamdown", "questiondown",
+ "dotlessi", "dotlessj", "grave", "acute",
+ "caron", "breve", "macron", "ring",
+ "cedilla", "germandbls", "ae", "oe",
+ "oslash", "AE", "OE", "Oslash",
+ "space", "exclam", "quotedbl", "numbersign",
+ "dollar", "percent", "ampersand", "quoteright",
+ "parenleft", "parenright", "asterisk", "plus",
+ "comma", "hyphen", "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", "circumflex", "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", "tilde", "dieresis",
+ "asciicircum", "asciitilde", "Ccedilla", "Iacute",
+ "Icircumflex", "atilde", "edieresis", "egrave",
+ "scaron", "zcaron", "Eth", "ff",
+ "ffi", "ffl", ".notdef", ".notdef",
+ ".notdef", ".notdef", "Scaron", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ "Ydieresis", ".notdef", "Zcaron", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", "cent", "sterling",
+ "fraction", "yen", "florin", "section",
+ "currency", "copyright", "quotedblleft", "guillemotleft",
+ "guilsinglleft", "guilsinglright", "fi", "fl",
+ "degree", "endash", "dagger", "daggerdbl",
+ "periodcentered", ".notdef", "paragraph", "bullet",
+ "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright",
+ "ellipsis", "perthousand", ".notdef", ".notdef",
+ "Agrave", "Aacute", "Acircumflex", "Atilde",
+ "Adieresis", "Aring", ".notdef", "dotaccent",
+ "Egrave", "Eacute", "Ecircumflex", "Edieresis",
+ "Igrave", "hungarumlaut", "ogonek", "Idieresis",
+ "emdash", "Ntilde", "Ograve", "Oacute",
+ "Ocircumflex", "Otilde", "Odieresis", ".notdef",
+ ".notdef", "Ugrave", "Uacute", "Ucircumflex",
+ "Udieresis", "Yacute", "Thorn", ".notdef",
+ "agrave", "aacute", "acircumflex", "ordfeminine",
+ "adieresis", "aring", ".notdef", "ccedilla",
+ "Lslash", "eacute", "ecircumflex", "ordmasculine",
+ "igrave", "iacute", "icircumflex", "idieresis",
+ ".notdef", "ntilde", "ograve", "oacute",
+ "ocircumflex", "otilde", "odieresis", ".notdef",
+ "lslash", "ugrave", "uacute", "ucircumflex",
+ "udieresis", "yacute", "thorn", "ydieresis"
+);
+
+@adobeenc=(
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ "space", "exclam", "quotedbl", "numbersign",
+ "dollar", "percent", "ampersand", "quoteright",
+ "parenleft", "parenright", "asterisk", "plus",
+ "comma", "hyphen", "period", "slash",
+ "zero", "one", "two", "three",
+ "four", "five", "six", "seven",
+ "eight", "nine", "colon", "semicolon",
+ "less", "equal", "greater", "question",
+ "at", "A", "B", "C",
+ "D", "E", "F", "G",
+ "H", "I", "J", "K",
+ "L", "M", "N", "O",
+ "P", "Q", "R", "S",
+ "T", "U", "V", "W",
+ "X", "Y", "Z", "bracketleft",
+ "backslash", "bracketright", "asciicircum", "underscore",
+ "quoteleft", "a", "b", "c",
+ "d", "e", "f", "g",
+ "h", "i", "j", "k",
+ "l", "m", "n", "o",
+ "p", "q", "r", "s",
+ "t", "u", "v", "w",
+ "x", "y", "z", "braceleft",
+ "bar", "braceright", "asciitilde", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", "exclamdown", "cent", "sterling",
+ "fraction", "yen", "florin", "section",
+ "currency", "quotesingle", "quotedblleft", "guillemotleft",
+ "guilsinglleft", "guilsinglright", "fi", "fl",
+ ".notdef", "endash", "dagger", "daggerdbl",
+ "periodcentered", ".notdef", "paragraph", "bullet",
+ "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright",
+ "ellipsis", "perthousand", ".notdef", "questiondown",
+ ".notdef", "grave", "acute", "circumflex",
+ "tilde", "macron", "breve", "dotaccent",
+ "dieresis", ".notdef", "ring", "cedilla",
+ ".notdef", "hungarumlaut", "ogonek", "caron",
+ "emdash", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", "AE", ".notdef", "ordfeminine",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ "Lslash", "Oslash", "OE", "ordmasculine",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", "ae", ".notdef", ".notdef",
+ ".notdef", "dotlessi", ".notdef", ".notdef",
+ "lslash", "oslash", "oe", "germandbls",
+ ".notdef", ".notdef", ".notdef", ".notdef"
+);
+
+###############
+# Read DEF file
+###############
+#
+open DEF, $opt_d or die "Cannot open $opt_d: $!\n";
+while (<DEF>) {
+ next if (/^\s*$/ || /^\#/);
+ s/\s*(\#.*)?$//;
+ push @deflines, $_;
+}
+close DEF;
+
+###############
+# Read VPL file
+###############
+#
+# File header
+#
+$vplhead = <> or exit 1;
+unless ($vplhead =~ /^\((VTITLE|FAMILY) /) {
+ die "$filename is not a vpl file: giving up\n"
+}
+do {
+ $_ = <>;
+ $vplhead .= $_;
+} until ($_ =~ /^\(LIGTABLE$/ or eof);
+if (eof) {
+ die "$filename does not seem to be a text font (no LIGTABLE): giving up\n";
+}
+if ($vplhead =~ s/\A\(VTITLE(.*)$/$vtitle\n(COMMENT Old vtitle:$1/m) {
+ $vplhead =~ s/\n\(COMMENT Please edit that VTITLE .*\)$//m;
+ @enc = @dvipsenc;
+ $dvips = 1;
+}
+elsif ($vplhead =~ /\A\(FAMILY.*\)\n\(CODINGSCHEME ADOBESTANDARDENCODING\)$/m) {
+ $vplhead =~ s/\A/$vtitle\n/m;
+ @enc = @adobeenc;
+ $dvips = 0;
+}
+else {
+ $vplhead =~ s/\A/$vtitle\n/m;
+ @enc = @TeXenc;
+ $dvips = 0;
+}
+if ($vplhead =~ /^\(CODINGSCHEME TEX MATH SYMBOLS/m) {
+ die "$filename is a TeX math font: giving up\n";
+}
+unless ($vplhead =~ s/^(\(CODINGSCHEME .*\+\s?)(\S+)\)$/$1$encname)/m) {
+ $vplhead =~ s/^(\(CODINGSCHEME .*)\)$/$1 + $encname)/m;
+}
+if ($vplhead =~ s/^\(DESIGNUNITS R (.+)\)\n//m) { $scale = $1 }
+else { $scale = 1 }
+$vplhead =~ s/^\(COMMENT.*DESIGNSIZE.*\)\n//gm;
+$vplhead =~ s/^\(BOUNDARYCHAR.*\)\n//gm;
+if ($vplhead =~ /^ \(SLANT R (.+)\)/m) { $slant = $1 }
+if ($vplhead =~ /^ \(XHEIGHT [DR] (.+)\)/m) { $xheight = $1 }
+unless ($vplhead =~ /^\(MAPFONT /m) {
+ if ($vplhead =~ /^\(DESIGNSIZE R (.*)\)$/m) { $dsize = $1 *$scale }
+ $mapfont = "\n(MAPFONT D 0\n (FONTNAME $fontname)\n (FONTDSIZE R $dsize)\n )";
+ $vplhead =~ s/\n\(LIGTABLE\Z/$mapfont$&/m;
+}
+$vplhead =~ s/^(\(FONTDIMEN)/(SEVENBITSAFEFLAG FALSE)\n$1/m;
+if ($opt_s) {
+ $vplhead =~ s[^(\(MAPFONT D )0(.*?)( \))]
+ [$&\n${1}1$2 (FONTAT R ${ \($shrink * $scale) })\n$3]ms;
+}
+@vplhead = split /^/, $vplhead;
+foreach (@vplhead) {
+ s[(?<!(IGNSIZE|MAPFONT)) [RD] (-?)([0-9.]+)\)]
+ [" R " . $2 . $3/$scale . ")"]ge
+}
+
+#
+# Ligatures and kerns
+#
+do {
+ $_ = <>;
+ s/ \(comment .*$//i;
+ s/^( \((?:LABEL|KRN) )O ([0-7]+)(.*)$/$1 . sprintf("H %04lX", oct $2) . $3/e;
+if (/ \(LIG /) {
+ s/O ([0-7]+)/sprintf("H %04lX", oct $1)/ge;
+ }
+ $ligs .= $_;
+} until $_ =~ /^ \)/;
+#
+# Now build a hash to convert from vpl representation to char name
+# and use it to make ligtable readable
+#
+foreach $i (0 .. 255) { $vc{$nv[$i]} = $enc[$i] }
+$ligs =~ s/^( \((?:LABEL|KRN) )(\S+ \S+)(.*\))$/$1$vc{$2}$3/gm;
+$ligs =~ s/^( \(LIG )(\S+ \S+) (\S+ \S+)\)$/$1$vc{$2} $vc{$3})/gm;
+#
+# Character definitions: store "encoded" defs in @chars, store *all*
+# defs in %allchars
+#
+$_ = <>;
+do {
+ if (/^\(CHARACTER/) {
+ $character = $_;
+ do {
+ $_ = <>;
+ $character .= $_;
+ } until $_ =~ /^ \)/;
+ storeinfo($character);
+ $_ = <>;
+ }
+} until eof;
+foreach $i (0 .. $#chars) {
+ if ($chars[$i] and $enc[$i] ne ".notdef") {
+ $allchars{$enc[$i]} = $chars[$i];
+ }
+}
+
+##################
+# Set up constants
+##################
+
+$subacc = "(cedilla|ogonek|commaaccent)";
+$supacc = "(grave|acute|circumflex|tilde|macron|breve|dotaccent|overdot|dieresis|ring|hungarumlaut|caron|candrabindu)";
+$underacc = "(underdot|under$supacc)";
+$accents = "($subacc|$supacc|$underacc|underbar)";
+$underadp = 0.230; # depth of "under" accs
+$underddp = 0.213; # depth of underdot
+if ($bold) { $thk = 0.072 } else { $thk = 0.052 } # thickness and
+$underbdp = 0.082 + $thk; # depth of underbar
+$capheight = $allchars{"X"}{ht};
+$accheight = $allchars{"macron"}{ht};
+$accdepth = $accheight - $thk * $scale; # probable approx. "depth" of macron
+$v1 = $accheight - $xheight; # vertical offset for double accents
+$v2 = $capheight - $xheight; # vertical offset for accented caps etc
+if ($scaps) { # accented small caps
+ $scoffset = $allchars{"x"}{ht} - $xheight;
+ $v1 += $scoffset;
+}
+if ($opt_c) { # candrabindu
+ ($cbx, $cby) = $opt_c =~ /^(.*),(.*)$/;
+ $cbx += ($allchars{"breve"}{wd} - $allchars{"dotaccent"}{wd}) / 2;
+ $cbx /= 1000;
+ $cby /= 1000;
+}
+
+######################
+# Build the characters
+######################
+#
+# First normalise dvips.enc encoding quirks
+#
+if ($dvips) {
+ chmove("fi", 014);
+ chmove("fl", 015);
+ chmove("quotedblright", 042);
+ chmove("quotedblleft", 0134);
+ chmove("dotaccent", 0137);
+ chmove("endash", 0173);
+ chmove("emdash", 0174);
+ chmove("hungarumlaut", 0175);
+}
+#
+# Now build a list of definitions supplied by user
+#
+for (@deflines) {
+ if (/^\s*(\d+|0[0-7]+|0x[0-9a-fA-F]+)\s+([a-zA-Z]+?|\.notdef)(?:\s+([a-zA-Z]+))?$/) {
+ ($num, $char, $acc) = ($1, $2, $3);
+ $num = oct $num if $num =~ /^0/;
+ if ($num > 0xFFFF) { die "Bad definition (number out of range): $_\n" }
+ $def = {};
+ $def->{qdef} = $_;
+ $def->{num} = $num;
+ $def->{char} = $char;
+ $def->{acc} = $acc;
+ if ($char eq "space") { $def->{nchar} = $acc }
+ else { $def->{nchar} = $char . $acc }
+ push @nchars, $def->{nchar};
+ push @defs, $def;
+ }
+ else { die "Bad definition: $_\n" }
+}
+#
+# Work through the list
+#
+while (@defs) {
+ $def = shift @defs;
+ $qdef = $def->{qdef};
+ $num = $def->{num};
+ $char = $def->{char};
+ $acc = $def->{acc};
+ $nchar = $def->{nchar};
+ #
+ # If we can't handle $char/$acc yet, but believe we will be able
+ # to later, send the definition to the back of the queue. In case
+ # it later turns out we were wrong, allow only five loops before
+ # giving up.
+ #
+ if (!$allchars{$char} and $char ne ".notdef") {
+ if (grep /^$char$/, @nchars) {
+ unless (++$def->{requeue} > 5) {
+ push @defs, $def;
+ next;
+ }
+ }
+ else { die "Bad definition (no such character): $qdef\n" }
+ }
+ if ($acc and !$allchars{$acc} and $acc !~ /^$accents$/) {
+ if (grep /^$acc$/, @nchars) {
+ unless (++$def->{requeue} > 5) {
+ push @defs, $def;
+ next;
+ }
+ }
+ else { die "Bad definition (no such accent): $qdef\n" }
+ }
+ #
+ # Remove any existing claims on $num
+ #
+ @{ $allchars{$chars[$num]{id}}{num} } = grep !/$num/,
+ @{ $allchars{$chars[$num]{id}}{num} };
+ #
+ # First deal with .notdef
+ #
+ if ($nchar eq ".notdef") {
+ undef $chars[$num];
+ }
+ #
+ # Next look among existing chars (unless blocked by -b)
+ #
+ elsif (!($acc and $opt_b) and $allchars{$nchar}) {
+ push( @{ $allchars{$nchar}{num} }, $num);
+ $chars[$num] = $allchars{$nchar};
+ }
+ #
+ # If it can't be built from sub-elements, issue a warning and move on
+ #
+ elsif (!$acc) {
+ warn "No such character - ignoring definition: $qdef\n";
+ undef $chars[$num];
+ }
+ #
+ # Now build the char
+ #
+ else {
+ #
+ # First get rid of predefined/duplicated ligtable statements
+ # and character definitions; also synonyms
+ #
+ $ligs =~ s/\n \((LABEL|KRN|LIG) ($nchar .*|.*$nchar)\)$//gm;
+ $allchars{$nchar} = ();
+ if ($acc eq "overdot") {
+ $nchar2 = $char . "dotaccent";
+ $ligs =~ s/\n \((LABEL|KRN|LIG) ($nchar2 .*|.*$nchar2)\)$//gm;
+ delete $allchars{$nchar2};
+ }
+ #
+ # If the character is not a single codepoint (i.e. if it is stored
+ # in the Private Use Area), store the info that will be needed to
+ # have it linked into the LIGTABLE
+ #
+ push @pualigs, "$char: (LIG $acc $nchar)";
+ if (!defined $allchars{$acc}) { dummychar($dummycodepoint--, $acc) }
+ #
+ # Go!
+ #
+ if ($acc =~ /^$subacc$/) {
+ subacc($num, $char, $acc, $nchar);
+ fixkerns($char, $acc);
+ }
+ elsif ($acc =~ /^$supacc$/) {
+ supacc($num, $char, $acc, $nchar);
+ fixkerns($char, $acc);
+ }
+ elsif ($acc =~ /^$underacc$/) {
+ underacc($num, $char, $acc, $nchar);
+ fixkerns($char, $acc);
+ }
+ elsif ($acc =~ /^underbar$/) {
+ underb($num, $char, $nchar);
+ fixkerns($char, $acc);
+ }
+ else {
+ digraph($num, $char, $acc, $nchar);
+ fixkerns($char, $acc);
+ }
+ }
+}
+
+###################
+# Sort out ligtable
+###################
+#
+# Pull in the Private Use Area ligatures
+#
+foreach $pualig (@pualigs) {
+ $pualig =~ s/^(.+)://;
+ $puaelm1 = $1;
+ unless ($ligs =~ s/(^ \(LABEL $puaelm1\)\n)/$1$pualig\n/m) {
+ $ligs =~ s[^( \)\n)]
+ [ \(LABEL $puaelm1\)\n$pualig\n \(STOP\)\n$1]m
+ }
+}
+#
+# Convert to vpl representation, eliminating statements invoking
+# "unencoded" characters
+#
+@liglist = split /\n/, $ligs;
+$ligs = "";
+foreach (@liglist) {
+ if (/^( \(LIG \S+ )(\S+)\)$/) {
+ if ($n = ${ $allchars{$2}{num} }[0]) {
+ s/^( \(LIG \S+ )(\S+)\)$/$1$nv[$n])/;
+ }
+ else { next }
+ }
+ if (/^( \((?:LABEL|LIG|KRN) )([^ )]+)(.*)$/) {
+ ($one, $two, $three) = ($1, $2, $3);
+ foreach $n (@{ $allchars{$two}{num} }) {
+ $ligs .= "$one$nv[$n]$three\n";
+ }
+ }
+ else { $ligs .= "$_\n" }
+}
+#
+# Eliminate sequences orphaned by elimination of a LABEL
+#
+@liglist = split / \(STOP\)\n/, $ligs;
+$ligs = "";
+foreach (@liglist) {
+ if (/^ \(LABEL /m) { $ligs .= "$_ (STOP)\n" }
+ elsif (/^ \)$/m) { $ligs .= $_ }
+}
+#
+# Eliminate empty statements
+#
+$ligs =~ s/(^ \(LABEL .*\)\n)+ \(STOP\)\n//gm;
+@ligs = split /^/, $ligs;
+foreach (@ligs) {
+ s/ [RD] (-?)([0-9.]+)\)/" R " . $1 . $2\/$scale . ")"/ge
+}
+
+####################
+# Output the results
+####################
+#
+print @vplhead, @ligs;
+foreach $i (0 .. 0xFFFF) { if (defined $chars[$i]{id}) { printchar($i) } }
+
+#####################
+# End of main program
+#####################
+
+sub storeinfo {
+ #
+ # Extract info from a character definition and store it in @chars
+ #
+ my $char = shift;
+ my $num;
+ if ($char =~ /\A\(CHARACTER O ([0-7]+)/m) { $num = oct $1 }
+ elsif ($char =~ /\A\(CHARACTER C (.)/m) { $num = ord $1 }
+ $chars[$num]{id} = $enc[$num];
+ push( @{ $chars[$num]{num} }, $num);
+ if ($char =~ /^ \(CHARWD R (.*?)\)$/m) { $chars[$num]{wd} = $1 }
+ if ($char =~ /^ \(CHARHT R (.*?)\)$/m) { $chars[$num]{ht} = $1 }
+ if ($char =~ /^ \(CHARDP R (.*?)\)$/m) { $chars[$num]{dp} = $1 }
+ if ($char =~ /^ \(CHARIC R (.*?)\)$/m) { $chars[$num]{ic} = $1 }
+ if ($char =~ /^ \(MAP\n((.|\n)*)^ \)/m) { $chars[$num]{map} = $1 }
+ else { $chars[$num]{map} = " (SETCHAR $nv[$num])\n" }
+ $chars[$num]{map} =~ s[(\(SETCHAR )O ([0-7]+)\)]
+ [$1 . sprintf("H %04lX", oct $2) . ")"]gme
+}
+
+sub printchar {
+ #
+ # Extract info from @chars and build it into a character definition
+ #
+ my $num = shift;
+ my @ch;
+ push @ch, "(CHARACTER ";
+ if (chr($num) =~ /[0-9A-Za-z]/) { push @ch, "C " . chr($num) }
+ else {
+ push @ch, sprintf("H %04lX", $num);
+ push @ch, " (COMMENT " . $chars[$num]{id} . ")";
+ }
+ push @ch, "\n";
+ push @ch, " (CHARWD R " . $chars[$num]{wd} . ")\n"
+ if defined $chars[$num]{wd};
+ push @ch, " (CHARHT R " . $chars[$num]{ht} . ")\n"
+ if defined $chars[$num]{ht};
+ push @ch, " (CHARDP R " . $chars[$num]{dp} . ")\n" if $chars[$num]{dp};
+ push @ch, " (CHARIC R " . $chars[$num]{ic} . ")\n" if $chars[$num]{ic};
+ push @ch, " (MAP\n";
+ push @ch, $chars[$num]{map};
+ push @ch, " )\n";
+ push @ch, " )\n";
+ foreach (@ch) {
+ s/(?<!SELECTFONT) [RD] (-?)([0-9.]+)\)/" R " . $1 . $2\/$scale . ")"/ge
+ }
+ print @ch
+}
+
+sub chmove {
+ #
+ # Move a character
+ #
+ my ($char, $num) = @_;
+ my $i;
+ foreach $i (@{ $allchars{$char}{num} }) { undef $chars[$i] }
+ @{ $allchars{$char}{num} } = ();
+ @{ $allchars{$chars[$num]{id}}{num} } = grep !/$num/,
+ @{ $allchars{$chars[$num]{id}}{num} };
+ push( @{ $allchars{$char}{num} }, $num);
+ $chars[$num] = $allchars{$char};
+}
+
+sub max {
+ #
+ # Return greater of two values
+ #
+ my ($a, $b) = @_;
+ return $a > $b ? $a : $b;
+}
+
+sub subacc {
+ #
+ # Subscript accents
+ #
+ my ($num, $char, $acc, $id) = @_;
+ my ($h, $s1, $s2, $s3);
+ $allchars{$id}{wd} = $allchars{$char}{wd};
+ $allchars{$id}{ht} = $allchars{$char}{ht};
+ $allchars{$id}{dp} = $allchars{$acc}{dp};
+ $allchars{$id}{ic} = $allchars{$char}{ic};
+ $allchars{$id}{id} = $id;
+ push( @{ $allchars{$id}{num} }, $num);
+ $s1 = $allchars{$char}{map};
+ $s1 =~ s/\A (.*)\n\Z/(PUSH) $1 (POP)/s;
+ $h = sprintf("%.3f", ($allchars{$char}{wd} - $allchars{$acc}{wd}) / 2);
+ if ($h > 0) { $s2 = " (MOVERIGHT R $h) " }
+ elsif ($h < 0) {
+ $h = -$h;
+ $s2 = " (MOVELEFT R $h) ";
+ }
+ else { $s2 = " " }
+ $s3 = $allchars{$acc}{map};
+ $s3 =~ s/\A.*(\(SETCHAR . .+?\)).*\Z/$1/s;
+ $allchars{$id}{map} = " $s1\n$s2$s3\n";
+ $chars[$num] = $allchars{$id};
+}
+
+sub supacc {
+ #
+ # Superscript accents
+ #
+ my ($num, $char, $acc, $id) = @_;
+ my ($cb, $h, $hadj, $tallchar, $ic, $s1, $s2, $s3);
+ if ($char eq "i" and $allchars{"dotlessi"}) { $char = "dotlessi" }
+ if ($char eq "j" and $allchars{"dotlessj"}) { $char = "dotlessj" }
+ if ($acc eq "overdot") { $acc = "dotaccent" }
+ if ($acc eq "candrabindu") {
+ $acc = "breve";
+ ($cb = $allchars{"dotaccent"}{map}) =~ s/\A.*(\(SETCHAR . .+?\)).*\Z/$1/s;
+ }
+ $allchars{$id}{wd} = $allchars{$char}{wd};
+ $allchars{$id}{ht} = $allchars{$acc}{ht};
+ $allchars{$id}{dp} = $allchars{$char}{dp};
+ $allchars{$id}{id} = $id;
+ push( @{ $allchars{$id}{num} }, $num);
+ $s1 = $allchars{$char}{map};
+ $s1 =~ s/\A (.*)\n\Z/(PUSH) $1 (POP)/s;
+ if ($scaps and $char =~ /^[a-z]/) { # accented small caps
+ $tallchar = 1;
+ if ($char =~ /$supacc$/
+ and $char !~ /under$supacc$/) { # double accs
+ $s2 = " (MOVEUP R $v1)";
+ $allchars{$id}{ht} += $v1;
+ $hadj = sprintf("%.3f", $v1 * $slant);
+ $ic = $allchars{$char}{ic};
+ }
+ else { # single accs
+ $s2 = " (MOVEUP R $scoffset)";
+ $allchars{$id}{ht} += $scoffset;
+ $hadj = sprintf("%.3f", $scoffset * $slant);
+ $ic = $allchars{$acc}{ic} + $hadj;
+ }
+ }
+ elsif ($allchars{$char}{ht} >= ($accheight + $v2)) { # double accs
+ $tallchar = 1; # on caps etc.
+ $s2 = " (MOVEUP R ${ \($v1 + $v2) })";
+ $allchars{$id}{ht} += ($v1 + $v2);
+ $hadj = sprintf("%.3f", ($v1 + $v2) * $slant);
+ $ic = $allchars{$char}{ic};
+ }
+ elsif ($allchars{$char}{ht} > 1.15 * $xheight) {
+ $tallchar = 1;
+ if ($char =~ /$supacc$/
+ and $char !~ /under$supacc$/) { # double accs
+ $s2 = " (MOVEUP R $v1)";
+ $allchars{$id}{ht} += $v1;
+ $hadj = sprintf("%.3f", $v1 * $slant);
+ $ic = $allchars{$char}{ic};
+ }
+ else { # caps etc.
+ $s2 = " (MOVEUP R $v2)";
+ $allchars{$id}{ht} += $v2;
+ $hadj = sprintf("%.3f", $v2 * $slant);
+ $ic = $allchars{$char}{ic};
+ }
+ }
+ else { # single accs
+ $s2 = " ";
+ $ic = $allchars{$acc}{ic};
+ }
+ $h = sprintf("%.3f", ($allchars{$char}{wd} - $allchars{$acc}{wd}) / 2);
+ unless ($tallchar) { $ic -= $h }
+ $allchars{$id}{ic} = $ic unless $ic < 0;
+ $h += $hadj;
+ if ($h > 0) { $s2 .= " (MOVERIGHT R $h) " }
+ elsif ($h < 0) {
+ $h = -$h;
+ $s2 .= " (MOVELEFT R $h) ";
+ }
+ else { $s2 .= " " }
+ $s3 = $allchars{$acc}{map};
+ $s3 =~ s/\A.*(\(SETCHAR . .+?\)).*\Z/$1/s;
+ if ($cb) { # candrabindu
+ $cb = $s2 . $cb;
+ if ($cbx) {
+ unless (($cb =~ s/(MOVERIGHT R )([0-9.]+)/$1 . ($2 + $cbx * $scale)/e)
+ or ($cb =~ s/(MOVELEFT R )([0-9.]+)/$1 . ($2 - $cbx * $scale)/e)) {
+ $cb =~ s/^( +)/"$1(MOVERIGHT R " . ($cbx * $scale) . ") "/e;
+ }
+ }
+ if ($cby) {
+ unless ($cb =~ s/(MOVEUP R )([0-9.]+)/$1 . ($2 + $cby * $scale)/e) {
+ $cb =~ s/^( +)/"$1(MOVEUP R " . ($cby * $scale) . ") "/e;
+ }
+ }
+ $cb .= "\n";
+ $s1 = "(PUSH) " . $s1;
+ $s3 .= " (POP)";
+ }
+ $allchars{$id}{map} = " $s1\n$s2$s3\n$cb";
+ $chars[$num] = $allchars{$id};
+}
+
+sub underacc {
+ #
+ # Dropped accents
+ #
+ my ($num, $char, $acc, $id) = @_;
+ my ($h, $v, $s1, $s2, $s3);
+ $acc =~ s/^under//;
+ if ($acc eq "dot") { $acc = "period" }
+ if ($acc eq "candrabindu") { die "Bad definition (no such accent): $qdef\n" }
+ $allchars{$id}{wd} = $allchars{$char}{wd};
+ $allchars{$id}{ht} = $allchars{$char}{ht};
+ $allchars{$id}{ic} = $allchars{$char}{ic};
+ $allchars{$id}{id} = $id;
+ push( @{ $allchars{$id}{num} }, $num);
+ if ($acc =~ /^$supacc$/) {
+ $v = $allchars{$id}{dp} = $underadp * $scale * $shrink;
+ $v += ($accdepth * $shrink);
+ }
+ else {
+ $v = $allchars{$id}{dp} = $underddp * $scale + $allchars{$acc}{dp};
+ }
+ $s1 = $allchars{$char}{map};
+ $s1 =~ s/\A (.*)\n\Z/(PUSH) $1 (POP)/s;
+ if ($acc =~ /^$supacc$/) {
+ $h = ($allchars{$char}{wd} - ($allchars{$acc}{wd} * $shrink)) / 2 - $v * $slant;
+ if ($opt_s) { $s2 = " (SELECTFONT D 1)\n" }
+ }
+ else {
+ $h = ($allchars{$char}{wd} - $allchars{$acc}{wd}) / 2 - $v * $slant;
+ }
+ $h = sprintf("%.3f", $h);
+ if ($h > 0) {
+ $s2 .= " (MOVEDOWN R $v) (MOVERIGHT R $h) ";
+ }
+ elsif ($h < 0) {
+ $h = -$h;
+ $s2 .= " (MOVEDOWN R $v) (MOVELEFT R $h) ";
+ }
+ else { $s2 = " (MOVEDOWN R $v) " }
+ $s3 = $allchars{$acc}{map};
+ $s3 =~ s/\A.*(\(SETCHAR . .+?\)).*\Z/$1/s;
+ if ($opt_s and $acc =~ /^$supacc$/) { $s3 .= "\n (SELECTFONT D 0)" }
+ $allchars{$id}{map} = " $s1\n$s2$s3\n";
+ $chars[$num] = $allchars{$id};
+}
+
+sub underb {
+ #
+ # Underbar
+ #
+ my ($num, $char, $id) = @_;
+ my ($h, $w, $dp, $s1, $s2, $s3);
+ $allchars{$id}{wd} = $allchars{$char}{wd};
+ $allchars{$id}{ht} = $allchars{$char}{ht};
+ $allchars{$id}{dp} = $dp = $underbdp * $scale;
+ $allchars{$id}{ic} = $allchars{$char}{ic};
+ $allchars{$id}{id} = $id;
+ push( @{ $allchars{$id}{num} }, $num);
+ $s1 = $allchars{$char}{map};
+ $s1 =~ s/\A (.*)\n\Z/(PUSH) $1 (POP)/s;
+ $h = sprintf("%.3f", ($allchars{$id}{wd} / 10 - $dp * $slant));
+ $w = sprintf("%.3f", ($allchars{$id}{wd} * 8 / 10));
+ if ($h > 0) {
+ $s2 = " (MOVEDOWN R $dp) (MOVERIGHT R $h) ";
+ }
+ elsif ($h < 0) {
+ $h = -$h;
+ $s2 = " (MOVEDOWN R $dp) (MOVELEFT R $h) ";
+ }
+ else { $s2 .= " (MOVEDOWN R $dp) " }
+ $s3 = "(SETRULE R ${ \($thk) } R $w)";
+ $allchars{$id}{map} = " $s1\n$s2$s3\n";
+ $chars[$num] = $allchars{$id};
+}
+
+sub digraph {
+ #
+ # Make a new character consisting of two existing characters
+ #
+ my ($num, $char, $acc, $id) = @_;
+ my ($one, $two, $kern, $s1, $s2, $charZWJ);
+ #
+ # Fiddle the ligature info to include Zero Width Joiner
+ #
+ if (!defined $allchars{ZWJ}) {
+ dummychar(0x200D, ZWJ)
+ }
+ pop @pualigs;
+ $charZWJ = $char . "ZWJ";
+ dummychar($dummycodepoint--, $charZWJ) unless defined $allchars{$charZWJ};
+ push @pualigs, "$char: (LIG ZWJ $charZWJ)"
+ unless (grep /^$char: \(LIG ZWJ $charZWJ\)$/, @pualigs);
+ push @pualigs, "$charZWJ: (LIG $acc $id)";
+ if ($ligs =~ /^ \(LABEL $char\)\n(.*?)\n \(KRN $acc R (-?[0-9.]+)\)\n/ms) {
+ ($one, $two) = ($1, $2);
+ }
+ $kern = $two if $one !~ /^ \(STOP\)$/m;
+ $allchars{$id}{wd} = $allchars{$char}{wd} + $allchars{$acc}{wd};
+ $allchars{$id}{wd} += $kern;
+ $allchars{$id}{ht} = max($allchars{$char}{ht}, $allchars{$acc}{ht});
+ $allchars{$id}{dp} = max($allchars{$char}{dp}, $allchars{$acc}{dp});
+ $allchars{$id}{ic} = $allchars{$acc}{ic};
+ $allchars{$id}{id} = $id;
+ push( @{ $allchars{$id}{num} }, $num);
+ $s1 = $allchars{$char}{map};
+ chomp ($s2 = $allchars{$acc}{map});
+ $s1 =~ s/(\(SETCHAR .*?\))/$1\n$s2/;
+ if ($kern) {
+ if ($kern < 0) {
+ $kern = -$kern;
+ $s1 =~ s/(\(SETCHAR .*?\))/$1 (MOVELEFT R $kern)/;
+ }
+ else { $s1 =~ s/(\(SETCHAR .*?\))/$1 (MOVERIGHT R $kern)/ }
+ }
+ $allchars{$id}{map} = $s1;
+ $chars[$num] = $allchars{$id};
+}
+
+sub dummychar {
+ #
+ # Make a new dummy character
+ #
+ my ($num, $id) = @_;
+ $allchars{$id}{wd} = 0;
+ $allchars{$id}{ht} = 0;
+ $allchars{$id}{dp} = 0;
+ $allchars{$id}{ic} = 0;
+ $allchars{$id}{id} = $id;
+ push( @{ $allchars{$id}{num} }, $num);
+ $allchars{$id}{map} = " (SETCHAR H 0020)\n";
+ $chars[$num] = $allchars{$id};
+}
+
+sub fixkerns {
+ #
+ # Generalise the kerning info contained in the vpl file by applying
+ # it to new accented chars. Do not kern lower-case chars bearing
+ # superscript accents with capitals, quotes or a preceding "f".
+ #
+ my ($char, $acc) = @_;
+ my ($olabel, $nlabel, @liglist, $lchar, $rchar);
+ return if $char eq "space";
+ if ($acc =~ /^$accents$/) { $lchar = $rchar = $char }
+ else {
+ $lchar = $char;
+ $rchar = $acc;
+ }
+ unless ($char =~ /^[a-z]/ and $acc =~ /^$supacc$/) {
+ $ligs =~ s[(\n \(LABEL )$rchar\)(?!\n \(LIG.*$)]
+ [$&$1$char$acc)]gm
+ unless $ligs =~ /\n \(LABEL $char$acc\)$/m;
+ $ligs =~ s[(\n \(LABEL )$rchar\)(\n \(LIG.*$)+(?!\n \(STOP\))]
+ [$&$1$char$acc)]gm
+ unless $ligs =~ /\n \(LABEL $char$acc\)$/m;
+ $ligs =~ s[(\n \(KRN )$lchar( .*)$]
+ [$&$1$char$acc$2]gm;
+ }
+ else {
+ if ($ligs =~ /\n \(LABEL $char\).*?\(STOP\)/s) {
+ $nlabel = $olabel = $&;
+ $nlabel =~ s/(\n \(LABEL $char)\)/$1$acc)/
+ unless $ligs =~ /\n \(LABEL $char$acc\)/m;
+ $nlabel =~ s/\n \(LIG .*\)$//gm;
+ $nlabel =~ s/\n \(LABEL (?!$char$acc).*\)$//gm;
+ $nlabel =~ s/\n \(KRN ([A-Z]|quote).*\)$//gm;
+ $ligs =~ s/(\n \(LABEL )$char\).*?\(STOP\)/$olabel$nlabel/s;
+ }
+ @liglist = split /\n \(STOP\)/, $ligs;
+ foreach (@liglist) {
+ unless (/\n \(LABEL ([A-Zf]|quote).*\)$/m) {
+ s/(\n \(KRN $char)( .*\))$/$&$1$acc$2/gm;
+ }
+ }
+ $ligs = join("\n (STOP)", @liglist);
+ }
+}
diff --git a/Master/texmf-dist/doc/fonts/accfonts/vpl2vpl b/Master/texmf-dist/doc/latex/accfonts/vpl2vpl
index 17a38b70e8d..d1e34e19dda 100644..100755
--- a/Master/texmf-dist/doc/fonts/accfonts/vpl2vpl
+++ b/Master/texmf-dist/doc/latex/accfonts/vpl2vpl
@@ -17,7 +17,7 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-$version = 0.22;
+$version = 0.23;
#------------------------------------------------------------------------#
$description =
"Syntax: vpl2vpl -d definition-file [-s shrink-factor]
@@ -42,14 +42,23 @@ will make the necessary changes on the fly.
A typical complete sequence of commands to create a new virtual
font might therefore be
- afm2tfm Times-Roman.afm -t dvips.enc -v ptmr rptmr
- vpl2vpl -d ISO-Latin1.def ptmr.vpl >ptmr_isol1.vpl
- vptovf ptmr_isol1.vpl ptmr_isol1.vf ptmr_isol1.tfm
-for a PostScript font, or
tftopl cmr10.tfm cmr10.pl
vpl2vpl -d ISO-Latin1.def cmr10.pl >cmr10_isol1.vpl
vptovf cmr10_isol1.vpl cmr10_isol1.vf cmr10_isol1.tfm
-for a Computer Modern font.
+for a Computer Modern font, or
+ afm2pl Times-Roman.afm rptmr.pl
+ pltotf rptmr.pl rptmr.tfm
+ vpl2vpl -d ISO-Latin1.def rptmr.pl >ptmr-isol1.vpl
+ vptovf ptmr-isol1.vpl ptmr-isol1.vf ptmr-isol1.tfm
+for a PostScript font.
+
+Another approach for a PostScript font is to use afm2tfm:
+ afm2tfm Times-Roman.afm -t dvips.enc -v ptmr rptmr
+ vpl2vpl -d ISO-Latin1.def ptmr.vpl >ptmr-isol1.vpl
+ vptovf ptmr-isol1.vpl ptmr-isol1.vf ptmr-isol1.tfm
+-- but this is now deprecated, as afm2tfm generates incorrect
+values for the heights of some characters, and this can lead to
+bad accent placing.
In order to keep the whole upper half of the character set free for
the requirements of the encoding specified in the definition file,
@@ -157,7 +166,7 @@ $vtitle .= ")\n(COMMENT Command line: $cmdline)";
# there's not much that can be done about it.
#
if ($fontname =~ /(^p.*b[oi]?[c]?$|^[^p].*bx[a-z]*[0-9]+$)/) { $bold = 1 }
-if ($fontname =~ /(^p.*c$|^[^p].*csc[a-z]*[0-9]+$)/) { $scaps = 1 }
+if ($fontname =~ /(^p.*c$|^[^p].*csc[a-z]*[0-9]+$)/) { $scaps = 1 }
if ($opt_s) { $shrink = $opt_s / 1000 } else { $shrink = 1 }
#
@@ -272,6 +281,73 @@ foreach $i (0 .. 255) {
"udieresis", "yacute", "thorn", "ydieresis"
);
+@adobeenc=(
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ "space", "exclam", "quotedbl", "numbersign",
+ "dollar", "percent", "ampersand", "quoteright",
+ "parenleft", "parenright", "asterisk", "plus",
+ "comma", "hyphen", "period", "slash",
+ "zero", "one", "two", "three",
+ "four", "five", "six", "seven",
+ "eight", "nine", "colon", "semicolon",
+ "less", "equal", "greater", "question",
+ "at", "A", "B", "C",
+ "D", "E", "F", "G",
+ "H", "I", "J", "K",
+ "L", "M", "N", "O",
+ "P", "Q", "R", "S",
+ "T", "U", "V", "W",
+ "X", "Y", "Z", "bracketleft",
+ "backslash", "bracketright", "asciicircum", "underscore",
+ "quoteleft", "a", "b", "c",
+ "d", "e", "f", "g",
+ "h", "i", "j", "k",
+ "l", "m", "n", "o",
+ "p", "q", "r", "s",
+ "t", "u", "v", "w",
+ "x", "y", "z", "braceleft",
+ "bar", "braceright", "asciitilde", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", "exclamdown", "cent", "sterling",
+ "fraction", "yen", "florin", "section",
+ "currency", "quotesingle", "quotedblleft", "guillemotleft",
+ "guilsinglleft", "guilsinglright", "fi", "fl",
+ ".notdef", "endash", "dagger", "daggerdbl",
+ "periodcentered", ".notdef", "paragraph", "bullet",
+ "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright",
+ "ellipsis", "perthousand", ".notdef", "questiondown",
+ ".notdef", "grave", "acute", "circumflex",
+ "tilde", "macron", "breve", "dotaccent",
+ "dieresis", ".notdef", "ring", "cedilla",
+ ".notdef", "hungarumlaut", "ogonek", "caron",
+ "emdash", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", "AE", ".notdef", "ordfeminine",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ "Lslash", "Oslash", "OE", "ordmasculine",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", "ae", ".notdef", ".notdef",
+ ".notdef", "dotlessi", ".notdef", ".notdef",
+ "lslash", "oslash", "oe", "germandbls",
+ ".notdef", ".notdef", ".notdef", ".notdef"
+);
+
###############
# Read DEF file
###############
@@ -306,6 +382,11 @@ if ($vplhead =~ s/\A\(VTITLE(.*)$/$vtitle\n(COMMENT Old vtitle:$1/m) {
@enc = @dvipsenc;
$dvips = 1;
}
+elsif ($vplhead =~ /\A\(FAMILY.*\)\n\(CODINGSCHEME ADOBESTANDARDENCODING\)$/m) {
+ $vplhead =~ s/\A/$vtitle\n/m;
+ @enc = @adobeenc;
+ $dvips = 0;
+}
else {
$vplhead =~ s/\A/$vtitle\n/m;
@enc = @TeXenc;
@@ -364,7 +445,7 @@ do {
}
} until eof;
foreach $i (0 .. $#chars) {
- if ($chars[$i] and $enc[$i] ne ".notdef") {
+ if ($chars[$i] and $enc[$i] ne ".notdef") {
$allchars{$enc[$i]} = $chars[$i];
}
}
@@ -480,7 +561,7 @@ while (@defs) {
#
# Next look among existing chars (unless blocked by -b)
#
- elsif (!($acc and $opt_b) and $allchars{$nchar}) {
+ elsif (!($acc and $opt_b) and $allchars{$nchar}) {
push( @{ $allchars{$nchar}{num} }, $num);
$chars[$num] = $allchars{$nchar};
}
@@ -780,7 +861,7 @@ sub underacc {
$allchars{$id}{ic} = $allchars{$char}{ic};
$allchars{$id}{id} = $id;
push( @{ $allchars{$id}{num} }, $num);
- if ($acc =~ /^$supacc$/) {
+ if ($acc =~ /^$supacc$/) {
$v = $allchars{$id}{dp} = $underadp * $scale * $shrink;
$v += ($accdepth * $shrink);
}
diff --git a/Master/texmf-dist/fonts/enc/dvips/accfonts/dvips.enc b/Master/texmf-dist/fonts/enc/dvips/accfonts/dvips.enc
new file mode 100644
index 00000000000..ea451ff106b
--- /dev/null
+++ b/Master/texmf-dist/fonts/enc/dvips/accfonts/dvips.enc
@@ -0,0 +1,75 @@
+% @@psencodingfile@{
+% author = "T. Rokicki, K. Berry",
+% version = "2.0",
+% date = "22 June 1996",
+% filename = "dvips.enc",
+% email = "kb@@mail.tug.org",
+% address = "135 Center Hill Rd. // Plymouth, MA 02360",
+% codetable = "ISO/ASCII",
+% checksum = "75 515 3715",
+% docstring = "An encoding for PostScript fonts to be used with TeX."
+% @}
+%
+% This is almost the default encoding produced by the afm2tfm program
+% that comes with the dvips distribution, when it is applied to a
+% StandardEncoding PostScript font. The positions of the accented
+% characters (which afm2tfm assigned more or less randomly in the
+% previous set of fonts) have been held fixed.
+%
+% It is almost upward-compatible with TeX text. (The primary exceptions
+% are dotaccent and hungarumlaut.) Some of the ligatures are also in
+% different positions, but this is not important, since ligature
+% positions are defined in the TFM file, not by macros.
+%
+% The character positions were assigned in this order:
+% 1) non-composite characters in the afm2tfm encoding (except dotlessj
+% was included in its plain TeX position);
+% 2) available characters in the Cork (EC) encoding;
+% 3) remaining composite characters in the base encoding (starting at
+% position 130 decimal). We don't include all the other base
+% characters because that changes the height/depth/width tables in
+% the TFM files (because more characters mean more distinct values).
+%
+% We leave the initial positions open for the Greek letters in Times-Roman.
+%
+/DvipsEncoding [
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef
+ /.notdef /quotesingle /exclamdown /questiondown
+ /dotlessi /dotlessj /grave /acute /caron /breve /macron /ring
+ /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash
+ /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright
+ /parenleft /parenright /asterisk /plus /comma /hyphen /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 /circumflex /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 /tilde /dieresis
+ /asciicircum /asciitilde /Ccedilla /Iacute
+ /Icircumflex /atilde /edieresis /egrave
+ /scaron /zcaron /Eth /ff /ffi /ffl /.notdef /.notdef
+ /.notdef /.notdef /Scaron /.notdef /.notdef /.notdef /.notdef /.notdef
+ /Ydieresis /.notdef /Zcaron /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /cent /sterling /fraction /yen /florin /section
+ /currency /copyright /quotedblleft /guillemotleft
+ /guilsinglleft /guilsinglright /fi /fl
+ /degree /endash /dagger /daggerdbl /periodcentered /.notdef /paragraph /bullet
+ /quotesinglbase /quotedblbase /quotedblright /guillemotright
+ /ellipsis /perthousand /.notdef /.notdef
+ /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /.notdef /dotaccent
+ /Egrave /Eacute /Ecircumflex /Edieresis
+ /Igrave /hungarumlaut /ogonek /Idieresis
+ /emdash /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /.notdef
+ /.notdef /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /.notdef
+ /agrave /aacute /acircumflex /ordfeminine
+ /adieresis /aring /.notdef /ccedilla
+ /Lslash /eacute /ecircumflex /ordmasculine
+ /igrave /iacute /icircumflex /idieresis
+ /.notdef /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /.notdef
+ /lslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis
+] def
diff --git a/Master/texmf-dist/tex/latex/accfonts/IndUni_Omega.def b/Master/texmf-dist/tex/latex/accfonts/IndUni_Omega.def
new file mode 100644
index 00000000000..5b1f0900a4e
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/accfonts/IndUni_Omega.def
@@ -0,0 +1,406 @@
+# IndUni encoding for mkt1font and vpl2vpl
+#
+# This version designed for use with Omega
+#
+# Characters are intended to represent a complete
+# set of those required for use with Indian languages in
+# transliteration (together with others commonly needed
+# in the same environment).
+
+# ASCII: I should probably put in a complete list, or at least
+# notdef the control codes and return other odds and ends to
+# ASCII normality. I would need to know Omega policies here.
+
+0x007f .notdef
+
+# ISO-Latin1
+
+0x0080 .notdef
+0x0081 .notdef
+0x0082 .notdef
+0x0083 .notdef
+0x0084 .notdef
+0x0085 .notdef
+0x0086 .notdef
+0x0087 .notdef
+0x0088 .notdef
+0x0089 .notdef
+0x008a .notdef
+0x008b .notdef
+0x008c .notdef
+0x008d .notdef
+0x008e .notdef
+0x008f .notdef
+0x0090 .notdef
+0x0091 .notdef
+0x0092 .notdef
+0x0093 .notdef
+0x0094 .notdef
+0x0095 .notdef
+0x0096 .notdef
+0x0097 .notdef
+0x0098 .notdef
+0x0099 .notdef
+0x009a .notdef
+0x009b .notdef
+0x009c .notdef
+0x009d .notdef
+0x009e .notdef
+0x009f .notdef
+0x00a0 space
+0x00a1 exclamdown
+0x00a2 cent
+0x00a3 sterling
+0x00a4 currency
+0x00a5 yen
+0x00a6 brokenbar
+0x00a7 section
+0x00a8 dieresis
+0x00a9 copyright
+0x00aa ordfeminine
+0x00ab guillemotleft
+0x00ac logicalnot
+0x00ad hyphen
+0x00ae registered
+0x00af macron
+0x00b0 degree
+0x00b1 plusminus
+0x00b2 twosuperior
+0x00b3 threesuperior
+0x00b4 acute
+0x00b5 mu
+0x00b6 paragraph
+0x00b7 periodcentered
+0x00b8 cedilla
+0x00b9 onesuperior
+0x00ba ordmasculine
+0x00bb guillemotright
+0x00bc onequarter
+0x00bd onehalf
+0x00be threequarters
+0x00bf questiondown
+0x00c0 A grave
+0x00c1 A acute
+0x00c2 A circumflex
+0x00c3 A tilde
+0x00c4 A dieresis
+0x00c5 A ring
+0x00c6 AE
+0x00c7 C cedilla
+0x00c8 E grave
+0x00c9 E acute
+0x00ca E circumflex
+0x00cb E dieresis
+0x00cc I grave
+0x00cd I acute
+0x00ce I circumflex
+0x00cf I dieresis
+0x00d0 Eth
+0x00d1 N tilde
+0x00d2 O grave
+0x00d3 O acute
+0x00d4 O circumflex
+0x00d5 O tilde
+0x00d6 O dieresis
+0x00d7 multiply
+0x00d8 Oslash
+0x00d9 U grave
+0x00da U acute
+0x00db U circumflex
+0x00dc U dieresis
+0x00dd Y acute
+0x00de Thorn
+0x00df germandbls
+0x00e0 a grave
+0x00e1 a acute
+0x00e2 a circumflex
+0x00e3 a tilde
+0x00e4 a dieresis
+0x00e5 a ring
+0x00e6 ae
+0x00e7 c cedilla
+0x00e8 e grave
+0x00e9 e acute
+0x00ea e circumflex
+0x00eb e dieresis
+0x00ec i grave
+0x00ed i acute
+0x00ee i circumflex
+0x00ef i dieresis
+0x00f0 eth
+0x00f1 n tilde
+0x00f2 o grave
+0x00f3 o acute
+0x00f4 o circumflex
+0x00f5 o tilde
+0x00f6 o dieresis
+0x00f7 divide
+0x00f8 oslash
+0x00f9 u grave
+0x00fa u acute
+0x00fb u circumflex
+0x00fc u dieresis
+0x00fd y acute
+0x00fe thorn
+0x00ff y dieresis
+
+# Bare accents.
+
+0x0327 cedilla
+0x0328 ogonek
+0x0326 commaaccent
+0x0301 acute
+0x0300 grave
+0x0302 circumflex
+0x0303 tilde
+0x0304 macron
+0x0306 breve
+0x0307 overdot
+0x0308 dieresis
+0x030a ring
+0x030b hungarumlaut
+0x030c caron
+0x0310 space candrabindu
+0x0331 space underbar
+0x032e space underbreve
+0x0324 space underdieresis
+0x0323 underdot
+0x0325 space underring
+
+# Indian etc. characters
+
+0x01cd A caron
+0x0100 A macron
+0x01fc AE acute
+0x01e2 AE macron
+0xe000 Amacron tilde
+0xe001 Atilde acute
+0x010c C caron
+0x0108 C circumflex
+0xe002 C macron
+0xe003 C underdot
+0x1e0c D underdot
+0xe004 Dunderdot acute
+0x0114 E breve
+0x011a E caron
+0x0112 E macron
+0x1ebc E tilde
+0xe006 Emacron tilde
+0xe005 Etilde acute
+0xe007 G acute
+0x0120 G overdot
+0xe008 Gacute macron
+0xe009 H acute
+0xe00b H underbar
+0x1e2a H underbreve
+0xe00a H underdieresis
+0x1e24 H underdot
+0x01cf I caron
+0x012a I macron
+0x0128 I tilde
+0xe00d Imacron tilde
+0xe00c Itilde acute
+0xe00f J caron
+0xe00e J macron
+0xe012 K h
+0xe010 K H
+0x1e34 K underbar
+0xe013 Kh underbar
+0xe011 KH underbar
+0x1e3a L underbar
+0x1e36 L underdot
+0xe014 L underring
+0x0141 Lslash
+0x1e38 Lunderdot macron
+0xe015 Lunderring macron
+0xe016 M breve
+0xe017 M candrabindu
+0x1e40 M overdot
+0x1e42 M underdot
+0xe018 N breve
+0x1e44 N overdot
+0x1e48 N underbar
+0x1e46 N underdot
+0x014e O breve
+0x01d1 O caron
+0x014c O macron
+0x0152 OE
+0xe019 Omacron tilde
+0x1e4c Otilde acute
+0x1e54 P acute
+0xe01a R breve
+0x1e5e R underbar
+0x1e5a R underdot
+0xe01b R underring
+0x1e5c Runderdot macron
+0xe01c Runderring macron
+0x015a S acute
+0x0160 S caron
+0xe020 S underbar
+0xe01f S underdieresis
+0x1e62 S underdot
+0xe01d Sacute macron
+0xe01e Sunderdot macron
+0x1e6e T underbar
+0xe022 T underdieresis
+0x1e6c T underdot
+0xe021 Tunderdot acute
+0x016c U breve
+0x01d3 U caron
+0x016a U macron
+0x0168 U tilde
+0x01d7 Udieresis acute
+0x01d9 Udieresis caron
+0x01db Udieresis grave
+0x01d5 Udieresis macron
+0xe023 Umacron tilde
+0x1e78 Utilde acute
+0xe024 V acute
+0x1e88 W underdot
+0x0178 Y dieresis
+0x1e8e Y overdot
+0x0179 Z acute
+0x017d Z caron
+0x017b Z overdot
+0x1e94 Z underbar
+0xe025 Z underdieresis
+0x1e92 Z underdot
+0x0103 a breve
+0x01ce a caron
+0x0101 a macron
+0x01fd ae acute
+0x01e3 ae macron
+0xe026 amacron acute
+0xe029 amacron breve
+0xe027 amacron grave
+0xe028 amacron tilde
+0xe02a atilde acute
+0x010d c caron
+0x0109 c circumflex
+0xe02b c macron
+0xe02c c underdot
+0x1e0d d underdot
+0xe02d dunderdot acute
+0x0115 e breve
+0x011b e caron
+0x0113 e macron
+0x1ebd e tilde
+0xe02f emacron acute
+0xe031 emacron breve
+0xe030 emacron tilde
+0xe02e etilde acute
+0xe032 g acute
+0x0121 g overdot
+0xe033 gacute macron
+0xe034 h acute
+0x1e96 h underbar
+0x1e2b h underbreve
+0xe035 h underdieresis
+0x1e25 h underdot
+0x012d i breve
+0x01d0 i caron
+0x012b i macron
+0x0129 i tilde
+0xe036 imacron acute
+0xe039 imacron breve
+0xe037 imacron grave
+0xe038 imacron tilde
+0xe03a itilde acute
+0x01f0 j caron
+0xe03b j macron
+0xe03c k h
+0x1e35 k underbar
+0xe03d kh underbar
+0xe03e l tilde
+0x1e3b l underbar
+0x1e37 l underdot
+0xe040 l underring
+0x0142 lslash
+0xe03f lunderdot acute
+0x1e39 lunderdot macron
+0xe041 lunderring acute
+0xe042 lunderring macron
+0xe043 m breve
+0xe044 m candrabindu
+0x1e41 m overdot
+0x1e43 m underdot
+0xe045 n breve
+0x1e45 n overdot
+0x1e49 n underbar
+0x1e47 n underdot
+0x014f o breve
+0x01d2 o caron
+0x014d o macron
+0x0153 oe
+0xe047 omacron breve
+0xe046 omacron tilde
+0x1e4d otilde acute
+0x1e55 p acute
+0xe048 r breve
+0x1e5f r underbar
+0xe04c r underdieresis
+0x1e5b r underdot
+0xe04d r underring
+0xe049 runderdot acute
+0xe04a runderdot grave
+0x1e5d runderdot macron
+0xe04b runderdotmacron acute
+0xe04e runderring acute
+0xe04f runderring grave
+0xe050 runderring macron
+0xe051 runderringmacron acute
+0x015b s acute
+0x0161 s caron
+0xe055 s underbar
+0xe054 s underdieresis
+0x1e63 s underdot
+0xe052 sacute macron
+0xe053 sunderdot macron
+0x1e6f t underbar
+0xe057 t underdieresis
+0x1e6d t underdot
+0xe056 tunderdot acute
+0x016d u breve
+0x01d4 u caron
+0x016b u macron
+0x0169 u tilde
+0x01d8 udieresis acute
+0x01da udieresis caron
+0x01dc udieresis grave
+0x01d6 udieresis macron
+0xe058 umacron acute
+0xe05b umacron breve
+0xe059 umacron grave
+0xe05a umacron tilde
+0x1e79 utilde acute
+0xe05c v acute
+0x1e89 w underdot
+0x1e8f y overdot
+0x017a z acute
+0x017e z caron
+0x017c z overdot
+0x1e95 z underbar
+0xe05d z underdieresis
+0x1e93 z underdot
+
+# Odds and ends
+
+0x2002 bullet
+0x2020 dagger
+0x2021 daggerdbl
+0x2026 ellipsis
+0x2014 emdash
+0x2013 endash
+0x0192 florin
+0x2039 guilsinglleft
+0x203a guilsinglright
+0x2212 minus
+0x2030 perthousand
+0x201e quotedblbase
+0x201c quotedblleft
+0x201d quotedblright
+0x2018 quoteleft
+0x2019 quoteright
+0x201a quotesinglbase
+0x0027 quotesingle
+0x2122 trademark