From d66c210746dff5ad39284b6793dd0333a6df6f9d Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Sat, 11 Apr 2009 00:17:48 +0000 Subject: install fontools utilities (10apr09) git-svn-id: svn://tug.org/texlive/trunk@12687 c570f23f-e606-0410-a88d-b1316a301751 --- .../source/texk/texlive/linked_scripts/Makefile.am | 7 + .../texk/texlive/linked_scripts/accfonts/mkt1font | 0 .../texk/texlive/linked_scripts/accfonts/vpl2ovp | 0 .../texk/texlive/linked_scripts/accfonts/vpl2vpl | 0 .../texk/texlive/linked_scripts/fontools/afm2afm | 216 + .../texk/texlive/linked_scripts/fontools/autoinst | 1714 +++++++ .../texk/texlive/linked_scripts/fontools/cmap2enc | 5307 ++++++++++++++++++++ .../texk/texlive/linked_scripts/fontools/font2afm | 185 + .../texk/texlive/linked_scripts/fontools/ot2kpx | 658 +++ .../texk/texlive/linked_scripts/fontools/pfm2kpx | 299 ++ .../texlive/linked_scripts/fontools/showglyphs | 184 + Master/bin/alpha-linux/afm2afm | 1 + Master/bin/alpha-linux/autoinst | 1 + Master/bin/alpha-linux/cmap2enc | 1 + Master/bin/alpha-linux/font2afm | 1 + Master/bin/alpha-linux/ot2kpx | 1 + Master/bin/alpha-linux/pfm2kpx | 1 + Master/bin/alpha-linux/showglyphs | 1 + Master/bin/amd64-freebsd/afm2afm | 1 + Master/bin/amd64-freebsd/autoinst | 1 + Master/bin/amd64-freebsd/cmap2enc | 1 + Master/bin/amd64-freebsd/font2afm | 1 + Master/bin/amd64-freebsd/ot2kpx | 1 + Master/bin/amd64-freebsd/pfm2kpx | 1 + Master/bin/amd64-freebsd/showglyphs | 1 + Master/bin/hppa-hpux/afm2afm | 1 + Master/bin/hppa-hpux/autoinst | 1 + Master/bin/hppa-hpux/cmap2enc | 1 + Master/bin/hppa-hpux/font2afm | 1 + Master/bin/hppa-hpux/ot2kpx | 1 + Master/bin/hppa-hpux/pfm2kpx | 1 + Master/bin/hppa-hpux/showglyphs | 1 + Master/bin/i386-freebsd/afm2afm | 1 + Master/bin/i386-freebsd/autoinst | 1 + Master/bin/i386-freebsd/cmap2enc | 1 + Master/bin/i386-freebsd/font2afm | 1 + Master/bin/i386-freebsd/ot2kpx | 1 + Master/bin/i386-freebsd/pfm2kpx | 1 + Master/bin/i386-freebsd/showglyphs | 1 + Master/bin/i386-linux/afm2afm | 1 + Master/bin/i386-linux/autoinst | 1 + Master/bin/i386-linux/cmap2enc | 1 + Master/bin/i386-linux/font2afm | 1 + Master/bin/i386-linux/ot2kpx | 1 + Master/bin/i386-linux/pfm2kpx | 1 + Master/bin/i386-linux/showglyphs | 1 + Master/bin/i386-openbsd/afm2afm | 1 + Master/bin/i386-openbsd/autoinst | 1 + Master/bin/i386-openbsd/cmap2enc | 1 + Master/bin/i386-openbsd/font2afm | 1 + Master/bin/i386-openbsd/ot2kpx | 1 + Master/bin/i386-openbsd/pfm2kpx | 1 + Master/bin/i386-openbsd/showglyphs | 1 + Master/bin/i386-solaris/afm2afm | 1 + Master/bin/i386-solaris/autoinst | 1 + Master/bin/i386-solaris/cmap2enc | 1 + Master/bin/i386-solaris/font2afm | 1 + Master/bin/i386-solaris/ot2kpx | 1 + Master/bin/i386-solaris/pfm2kpx | 1 + Master/bin/i386-solaris/showglyphs | 1 + Master/bin/mips-irix/afm2afm | 1 + Master/bin/mips-irix/autoinst | 1 + Master/bin/mips-irix/cmap2enc | 1 + Master/bin/mips-irix/font2afm | 1 + Master/bin/mips-irix/ot2kpx | 1 + Master/bin/mips-irix/pfm2kpx | 1 + Master/bin/mips-irix/showglyphs | 1 + Master/bin/powerpc-aix/afm2afm | 1 + Master/bin/powerpc-aix/autoinst | 1 + Master/bin/powerpc-aix/cmap2enc | 1 + Master/bin/powerpc-aix/font2afm | 1 + Master/bin/powerpc-aix/ot2kpx | 1 + Master/bin/powerpc-aix/pfm2kpx | 1 + Master/bin/powerpc-aix/showglyphs | 1 + Master/bin/powerpc-linux/afm2afm | 1 + Master/bin/powerpc-linux/autoinst | 1 + Master/bin/powerpc-linux/cmap2enc | 1 + Master/bin/powerpc-linux/font2afm | 1 + Master/bin/powerpc-linux/ot2kpx | 1 + Master/bin/powerpc-linux/pfm2kpx | 1 + Master/bin/powerpc-linux/showglyphs | 1 + Master/bin/sparc-linux/afm2afm | 1 + Master/bin/sparc-linux/autoinst | 1 + Master/bin/sparc-linux/cmap2enc | 1 + Master/bin/sparc-linux/font2afm | 1 + Master/bin/sparc-linux/ot2kpx | 1 + Master/bin/sparc-linux/pfm2kpx | 1 + Master/bin/sparc-linux/showglyphs | 1 + Master/bin/sparc-solaris/afm2afm | 1 + Master/bin/sparc-solaris/autoinst | 1 + Master/bin/sparc-solaris/cmap2enc | 1 + Master/bin/sparc-solaris/font2afm | 1 + Master/bin/sparc-solaris/ot2kpx | 1 + Master/bin/sparc-solaris/pfm2kpx | 1 + Master/bin/sparc-solaris/showglyphs | 1 + Master/bin/universal-darwin/afm2afm | 1 + Master/bin/universal-darwin/autoinst | 1 + Master/bin/universal-darwin/cmap2enc | 1 + Master/bin/universal-darwin/font2afm | 1 + Master/bin/universal-darwin/ot2kpx | 1 + Master/bin/universal-darwin/pfm2kpx | 1 + Master/bin/universal-darwin/showglyphs | 1 + Master/bin/win32/afm2afm | 8 + Master/bin/win32/autoinst | 8 + Master/bin/win32/cmap2enc | 8 + Master/bin/win32/font2afm | 8 + Master/bin/win32/ot2kpx | 8 + Master/bin/win32/pfm2kpx | 8 + Master/bin/win32/showglyphs | 8 + Master/bin/x86_64-linux/afm2afm | 1 + Master/bin/x86_64-linux/autoinst | 1 + Master/bin/x86_64-linux/cmap2enc | 1 + Master/bin/x86_64-linux/font2afm | 1 + Master/bin/x86_64-linux/ot2kpx | 1 + Master/bin/x86_64-linux/pfm2kpx | 1 + Master/bin/x86_64-linux/showglyphs | 1 + Master/texmf-dist/doc/support/fontools/GPLv2.txt | 341 ++ Master/texmf-dist/doc/support/fontools/README | 82 + .../support/fontools/examples/berling/berling.sty | 11 + .../support/fontools/examples/berling/berling.sub | 10 + .../support/fontools/examples/berling/makeberling | 70 + .../support/fontools/examples/berling/mbr_fnst.tex | 62 + .../fontools/examples/frutiger/frutiger.sty | 12 + .../fontools/examples/frutiger/frutiger.sub | 10 + .../fontools/examples/frutiger/lfr_fnst.tex | 68 + .../fontools/examples/frutiger/makefrutiger | 70 + .../fontools/examples/palatinox/Palatino_fnst.tex | 166 + .../fontools/examples/palatinox/make_Palatino | 92 + .../support/fontools/examples/palatinox/pala.sub | 4 + .../fontools/examples/palatinox/palatinox.sty | 36 + .../fontools/examples/palatinox/unsetSCaps.mtx | 32 + .../fonts/enc/dvips/fontools/fontools_ly1.enc | 272 + .../fonts/enc/dvips/fontools/fontools_ot1.enc | 65 + .../fonts/enc/dvips/fontools/fontools_t1.enc | 304 ++ .../fonts/enc/dvips/fontools/fontools_ts1.enc | 291 ++ Master/texmf-dist/scripts/fontools/afm2afm | 216 + Master/texmf-dist/scripts/fontools/autoinst | 1714 +++++++ Master/texmf-dist/scripts/fontools/cmap2enc | 5307 ++++++++++++++++++++ Master/texmf-dist/scripts/fontools/font2afm | 185 + Master/texmf-dist/scripts/fontools/ot2kpx | 658 +++ Master/texmf-dist/scripts/fontools/pfm2kpx | 299 ++ Master/texmf-dist/scripts/fontools/showglyphs | 184 + Master/texmf/doc/man/man1/afm2afm.1 | 214 + Master/texmf/doc/man/man1/autoinst.1 | 583 +++ Master/texmf/doc/man/man1/cmap2enc.1 | 450 ++ Master/texmf/doc/man/man1/font2afm.1 | 196 + Master/texmf/doc/man/man1/ot2kpx.1 | 205 + Master/texmf/doc/man/man1/pfm2kpx.1 | 208 + Master/texmf/doc/man/man1/showglyphs.1 | 185 + Master/tlpkg/bin/tlpkg-ctan-check | 3 +- Master/tlpkg/libexec/ctan2tds | 29 +- Master/tlpkg/tlpsrc/accfonts.tlpsrc | 7 +- Master/tlpkg/tlpsrc/collection-fontbin.tlpsrc | 7 +- Master/tlpkg/tlpsrc/collection-fontsextra.tlpsrc | 1 - Master/tlpkg/tlpsrc/fontools.tlpsrc | 16 + 155 files changed, 21378 insertions(+), 11 deletions(-) mode change 100644 => 100755 Build/source/texk/texlive/linked_scripts/accfonts/mkt1font mode change 100644 => 100755 Build/source/texk/texlive/linked_scripts/accfonts/vpl2ovp mode change 100644 => 100755 Build/source/texk/texlive/linked_scripts/accfonts/vpl2vpl create mode 100755 Build/source/texk/texlive/linked_scripts/fontools/afm2afm create mode 100755 Build/source/texk/texlive/linked_scripts/fontools/autoinst create mode 100755 Build/source/texk/texlive/linked_scripts/fontools/cmap2enc create mode 100755 Build/source/texk/texlive/linked_scripts/fontools/font2afm create mode 100755 Build/source/texk/texlive/linked_scripts/fontools/ot2kpx create mode 100755 Build/source/texk/texlive/linked_scripts/fontools/pfm2kpx create mode 100755 Build/source/texk/texlive/linked_scripts/fontools/showglyphs create mode 120000 Master/bin/alpha-linux/afm2afm create mode 120000 Master/bin/alpha-linux/autoinst create mode 120000 Master/bin/alpha-linux/cmap2enc create mode 120000 Master/bin/alpha-linux/font2afm create mode 120000 Master/bin/alpha-linux/ot2kpx create mode 120000 Master/bin/alpha-linux/pfm2kpx create mode 120000 Master/bin/alpha-linux/showglyphs create mode 120000 Master/bin/amd64-freebsd/afm2afm create mode 120000 Master/bin/amd64-freebsd/autoinst create mode 120000 Master/bin/amd64-freebsd/cmap2enc create mode 120000 Master/bin/amd64-freebsd/font2afm create mode 120000 Master/bin/amd64-freebsd/ot2kpx create mode 120000 Master/bin/amd64-freebsd/pfm2kpx create mode 120000 Master/bin/amd64-freebsd/showglyphs create mode 120000 Master/bin/hppa-hpux/afm2afm create mode 120000 Master/bin/hppa-hpux/autoinst create mode 120000 Master/bin/hppa-hpux/cmap2enc create mode 120000 Master/bin/hppa-hpux/font2afm create mode 120000 Master/bin/hppa-hpux/ot2kpx create mode 120000 Master/bin/hppa-hpux/pfm2kpx create mode 120000 Master/bin/hppa-hpux/showglyphs create mode 120000 Master/bin/i386-freebsd/afm2afm create mode 120000 Master/bin/i386-freebsd/autoinst create mode 120000 Master/bin/i386-freebsd/cmap2enc create mode 120000 Master/bin/i386-freebsd/font2afm create mode 120000 Master/bin/i386-freebsd/ot2kpx create mode 120000 Master/bin/i386-freebsd/pfm2kpx create mode 120000 Master/bin/i386-freebsd/showglyphs create mode 120000 Master/bin/i386-linux/afm2afm create mode 120000 Master/bin/i386-linux/autoinst create mode 120000 Master/bin/i386-linux/cmap2enc create mode 120000 Master/bin/i386-linux/font2afm create mode 120000 Master/bin/i386-linux/ot2kpx create mode 120000 Master/bin/i386-linux/pfm2kpx create mode 120000 Master/bin/i386-linux/showglyphs create mode 120000 Master/bin/i386-openbsd/afm2afm create mode 120000 Master/bin/i386-openbsd/autoinst create mode 120000 Master/bin/i386-openbsd/cmap2enc create mode 120000 Master/bin/i386-openbsd/font2afm create mode 120000 Master/bin/i386-openbsd/ot2kpx create mode 120000 Master/bin/i386-openbsd/pfm2kpx create mode 120000 Master/bin/i386-openbsd/showglyphs create mode 120000 Master/bin/i386-solaris/afm2afm create mode 120000 Master/bin/i386-solaris/autoinst create mode 120000 Master/bin/i386-solaris/cmap2enc create mode 120000 Master/bin/i386-solaris/font2afm create mode 120000 Master/bin/i386-solaris/ot2kpx create mode 120000 Master/bin/i386-solaris/pfm2kpx create mode 120000 Master/bin/i386-solaris/showglyphs create mode 120000 Master/bin/mips-irix/afm2afm create mode 120000 Master/bin/mips-irix/autoinst create mode 120000 Master/bin/mips-irix/cmap2enc create mode 120000 Master/bin/mips-irix/font2afm create mode 120000 Master/bin/mips-irix/ot2kpx create mode 120000 Master/bin/mips-irix/pfm2kpx create mode 120000 Master/bin/mips-irix/showglyphs create mode 120000 Master/bin/powerpc-aix/afm2afm create mode 120000 Master/bin/powerpc-aix/autoinst create mode 120000 Master/bin/powerpc-aix/cmap2enc create mode 120000 Master/bin/powerpc-aix/font2afm create mode 120000 Master/bin/powerpc-aix/ot2kpx create mode 120000 Master/bin/powerpc-aix/pfm2kpx create mode 120000 Master/bin/powerpc-aix/showglyphs create mode 120000 Master/bin/powerpc-linux/afm2afm create mode 120000 Master/bin/powerpc-linux/autoinst create mode 120000 Master/bin/powerpc-linux/cmap2enc create mode 120000 Master/bin/powerpc-linux/font2afm create mode 120000 Master/bin/powerpc-linux/ot2kpx create mode 120000 Master/bin/powerpc-linux/pfm2kpx create mode 120000 Master/bin/powerpc-linux/showglyphs create mode 120000 Master/bin/sparc-linux/afm2afm create mode 120000 Master/bin/sparc-linux/autoinst create mode 120000 Master/bin/sparc-linux/cmap2enc create mode 120000 Master/bin/sparc-linux/font2afm create mode 120000 Master/bin/sparc-linux/ot2kpx create mode 120000 Master/bin/sparc-linux/pfm2kpx create mode 120000 Master/bin/sparc-linux/showglyphs create mode 120000 Master/bin/sparc-solaris/afm2afm create mode 120000 Master/bin/sparc-solaris/autoinst create mode 120000 Master/bin/sparc-solaris/cmap2enc create mode 120000 Master/bin/sparc-solaris/font2afm create mode 120000 Master/bin/sparc-solaris/ot2kpx create mode 120000 Master/bin/sparc-solaris/pfm2kpx create mode 120000 Master/bin/sparc-solaris/showglyphs create mode 120000 Master/bin/universal-darwin/afm2afm create mode 120000 Master/bin/universal-darwin/autoinst create mode 120000 Master/bin/universal-darwin/cmap2enc create mode 120000 Master/bin/universal-darwin/font2afm create mode 120000 Master/bin/universal-darwin/ot2kpx create mode 120000 Master/bin/universal-darwin/pfm2kpx create mode 120000 Master/bin/universal-darwin/showglyphs create mode 100755 Master/bin/win32/afm2afm create mode 100755 Master/bin/win32/autoinst create mode 100755 Master/bin/win32/cmap2enc create mode 100755 Master/bin/win32/font2afm create mode 100755 Master/bin/win32/ot2kpx create mode 100755 Master/bin/win32/pfm2kpx create mode 100755 Master/bin/win32/showglyphs create mode 120000 Master/bin/x86_64-linux/afm2afm create mode 120000 Master/bin/x86_64-linux/autoinst create mode 120000 Master/bin/x86_64-linux/cmap2enc create mode 120000 Master/bin/x86_64-linux/font2afm create mode 120000 Master/bin/x86_64-linux/ot2kpx create mode 120000 Master/bin/x86_64-linux/pfm2kpx create mode 120000 Master/bin/x86_64-linux/showglyphs create mode 100644 Master/texmf-dist/doc/support/fontools/GPLv2.txt create mode 100644 Master/texmf-dist/doc/support/fontools/README create mode 100644 Master/texmf-dist/doc/support/fontools/examples/berling/berling.sty create mode 100644 Master/texmf-dist/doc/support/fontools/examples/berling/berling.sub create mode 100644 Master/texmf-dist/doc/support/fontools/examples/berling/makeberling create mode 100644 Master/texmf-dist/doc/support/fontools/examples/berling/mbr_fnst.tex create mode 100644 Master/texmf-dist/doc/support/fontools/examples/frutiger/frutiger.sty create mode 100644 Master/texmf-dist/doc/support/fontools/examples/frutiger/frutiger.sub create mode 100644 Master/texmf-dist/doc/support/fontools/examples/frutiger/lfr_fnst.tex create mode 100644 Master/texmf-dist/doc/support/fontools/examples/frutiger/makefrutiger create mode 100644 Master/texmf-dist/doc/support/fontools/examples/palatinox/Palatino_fnst.tex create mode 100644 Master/texmf-dist/doc/support/fontools/examples/palatinox/make_Palatino create mode 100644 Master/texmf-dist/doc/support/fontools/examples/palatinox/pala.sub create mode 100644 Master/texmf-dist/doc/support/fontools/examples/palatinox/palatinox.sty create mode 100644 Master/texmf-dist/doc/support/fontools/examples/palatinox/unsetSCaps.mtx create mode 100644 Master/texmf-dist/fonts/enc/dvips/fontools/fontools_ly1.enc create mode 100644 Master/texmf-dist/fonts/enc/dvips/fontools/fontools_ot1.enc create mode 100644 Master/texmf-dist/fonts/enc/dvips/fontools/fontools_t1.enc create mode 100644 Master/texmf-dist/fonts/enc/dvips/fontools/fontools_ts1.enc create mode 100755 Master/texmf-dist/scripts/fontools/afm2afm create mode 100755 Master/texmf-dist/scripts/fontools/autoinst create mode 100755 Master/texmf-dist/scripts/fontools/cmap2enc create mode 100755 Master/texmf-dist/scripts/fontools/font2afm create mode 100755 Master/texmf-dist/scripts/fontools/ot2kpx create mode 100755 Master/texmf-dist/scripts/fontools/pfm2kpx create mode 100755 Master/texmf-dist/scripts/fontools/showglyphs create mode 100644 Master/texmf/doc/man/man1/afm2afm.1 create mode 100644 Master/texmf/doc/man/man1/autoinst.1 create mode 100644 Master/texmf/doc/man/man1/cmap2enc.1 create mode 100644 Master/texmf/doc/man/man1/font2afm.1 create mode 100644 Master/texmf/doc/man/man1/ot2kpx.1 create mode 100644 Master/texmf/doc/man/man1/pfm2kpx.1 create mode 100644 Master/texmf/doc/man/man1/showglyphs.1 create mode 100644 Master/tlpkg/tlpsrc/fontools.tlpsrc diff --git a/Build/source/texk/texlive/linked_scripts/Makefile.am b/Build/source/texk/texlive/linked_scripts/Makefile.am index 1e4754d58cf..d527ab3cf3c 100644 --- a/Build/source/texk/texlive/linked_scripts/Makefile.am +++ b/Build/source/texk/texlive/linked_scripts/Makefile.am @@ -55,6 +55,13 @@ nobase_dist_script_SCRIPTS = \ dviasm/dviasm.py \ epspdf/epspdf \ epspdf/epspdftk \ + fontools/afm2afm \ + fontools/autoinst \ + fontools/cmap2enc \ + fontools/font2afm \ + fontools/ot2kpx \ + fontools/pfm2kpx \ + fontools/showglyphs \ fragmaster/fragmaster.pl \ glossaries/makeglossaries \ latex2man/latex2man \ diff --git a/Build/source/texk/texlive/linked_scripts/accfonts/mkt1font b/Build/source/texk/texlive/linked_scripts/accfonts/mkt1font old mode 100644 new mode 100755 diff --git a/Build/source/texk/texlive/linked_scripts/accfonts/vpl2ovp b/Build/source/texk/texlive/linked_scripts/accfonts/vpl2ovp old mode 100644 new mode 100755 diff --git a/Build/source/texk/texlive/linked_scripts/accfonts/vpl2vpl b/Build/source/texk/texlive/linked_scripts/accfonts/vpl2vpl old mode 100644 new mode 100755 diff --git a/Build/source/texk/texlive/linked_scripts/fontools/afm2afm b/Build/source/texk/texlive/linked_scripts/fontools/afm2afm new file mode 100755 index 00000000000..80ca105ed90 --- /dev/null +++ b/Build/source/texk/texlive/linked_scripts/fontools/afm2afm @@ -0,0 +1,216 @@ +#!/usr/bin/perl + +use Getopt::Std; +use integer; +use warnings; no warnings qw(uninitialized); + +getopts "e:o:", \%options; + +$0 =~ s!.*/!!; +die "Usage: $0 -e encoding [-o output] afmfile\n" if + @ARGV != 1 or !$options{e}; + +if ($options{o} and -e $options{o}) { + die "$0: output file exists\n"; +} + +if ((chop($fn = `kpsewhich $ARGV[0] 2>&1`) and -e $fn) or + (chop($fn = `findtexmf $ARGV[0] 2>&1`) and -e $fn)) +{ + open AFM, "<$fn" or die "Error: can't open `$fn' - $!\n"; +} +else { + open AFM, "<$ARGV[0]" or + die "Error: can't open `$ARGV[0]' - $!\n"; +} +{ + local $/; + $_ = ; +} + +$Time = localtime; +$FontInfo = /(.*)StartCharMetrics/s ? $1 : ""; +$FontInfo =~ s/(?<=Comment ).*?$/Reencoded at $Time by $0 from $ARGV[0]/m; +$FontInfo =~ s/(?<=ItalicAngle )([\d.]+)/{$1 >= 32768 ? $1 - 65536 : $1}/me; +$FontInfo =~ s/\r+\n/\n/g; +if ($FontInfo =~ /FontName\s+([\w-]+)/) {$FontName = $1} +else {warn "Warning: no FontName found in file `$ARGV[0]'\n"} + +for (/(WX.*?$)/gm) {/N\s+([\w.]+)/ and $WX{$1} = $_} +for (/(KPX.*?$)/gm) {/\s+([\w.]+)\s+([\w.]+)\s+(-?\d+)/ and $KPX{$1}{$2} = $3} + +if ((chop($fn = `kpsewhich $options{e} 2>&1`) and -e $fn) or + (chop($fn = `findtexmf $options{e} 2>&1`) and -e $fn)) +{ + open ENC, "<$fn" or die "Error: can't open `$fn' - $!\n"; +} +else { + open ENC, "<$options{e}" or + die "Error: can't open `$options{e}' - $!\n"; +} +chop(@lines = ); +map s!%.*!!, @lines; +$_ = join "", @lines; +($n, $_) = m!/([\w-]+) \s* \[(.*)\] \s+ def!x; +@vector = m!([\w.]+)!g; + +for $i (0 .. $#vector) { + next if $vector[$i] eq ".notdef"; + if ($WX{$vector[$i]} =~ /WX\s+(-?\d+).*?N\s+([\w.]+).*?B\s+(.*?)\s+;/) { + ($WX, $N, $B) = ($1, $2, $3); + push @WX, "C $i ; WX $WX ; N $N ; B $B ;\n"; + } + for $j (0 .. $#vector) { + next if $vector[$j] eq ".notdef"; + next unless $KPX{$vector[$i]}{$vector[$j]}; + push @KPX, + "KPX $vector[$i] $vector[$j] $KPX{$vector[$i]}{$vector[$j]}\n"; + } +} + +if ($options{o}) { + ($e = $options{e}) =~ s!.*/!!; + ($f = $ARGV[0]) =~ s!.*/|\.afm!!g; + ($o = $options{o}) =~ s!.*/|\.afm!!g; + + $x = "pfb"; + for (qw(pfb pfa ttf otf)) { + if (-e "$f.$_" or + (chop($fn = `kpsewhich "$f.$_" 2>&1`) and -e $fn) or + (chop($fn = `findtexmf "$f.$_" 2>&1`) and -e $fn)) + { + $x = $_; + last; + } + } + print qq($o $FontName <$f.$x <[$e "$n ReEncodeFont"\n); + + if (open OUT, ">$options{o}") { + select OUT; + } + else { + warn "Warning: can't create `$options{o}' - $!\n", + " printing to instead\n"; + } +} + +$WX = @WX; +$KPX = @KPX; +print < file + +=head1 SYNOPSIS + +afm2afm B<-e> I [B<-o> I] I + +=head1 DESCRIPTION + +This program reencodes an F file. It's mainly intended to be used with +F files that were extracted from TrueType or OpenType fonts, since these +are often too big to be handled with tools like F (Adobe's +CaflischScriptPro-Regular font, for example, contains 1289 glyphs and +278678 kerning pairs, leading to an F file of nearly 9MB). + +Glyphs that are absent from the chosen encoding aren't written to the output, +which yields much smaller output files. + +The program also generates an entry for a F-style map file. + +=head1 OPTIONS + +Option names were chosen to match those of F. + +=over 4 + +=item B<-e> I + +Reencode using the encoding given in file I. + +=item B<-o> I + +Write the reencoded F to file I instead of C. +The mapfile entry will still be written to C. + +=back + +=head1 FILES + +All input files are searched using B or B when these +commands are available; otherwise only the current working directory +is searched. + +=head1 SEE ALSO + +F, F, F, F, F. + +=head1 AUTHOR + +Marc Penninga + +=head1 HISTORY + +=over 12 + +=item I<2005-01-10> + +First version + +=item I<2005-01-25> + +Added printing of mapfile entry + +=item I<2005-02-18> + +Rewrote some of the code + +=item I<2005-03-08> + +Input files searched via B (where available) + +=item I<2005-03-15> + +Input files searched using B or B (if available) + +=item I<2005-04-15> + +Updated creation of mapfile entry; look for font file to deduce the correct +font file format (pfb, pfa, ttf). If no font file is found, +pfb is assumed. + +=item I<2005-04-20> + +Program quits if the specified output file exists + +=item I<2005-04-29> + +Improved the documentation + +=item I<2005-07-29> + +Some updates to the documentation + +=item I<2006-01-12> + +A few minor changes to the code + +=back + +=cut + diff --git a/Build/source/texk/texlive/linked_scripts/fontools/autoinst b/Build/source/texk/texlive/linked_scripts/fontools/autoinst new file mode 100755 index 00000000000..7939246d91c --- /dev/null +++ b/Build/source/texk/texlive/linked_scripts/fontools/autoinst @@ -0,0 +1,1714 @@ +#!/usr/bin/perl + +=begin COPYRIGHT ------------------------------------------------------------- + + Copyright (c) 2005-2009 Marc Penninga. + + This program is free software; you can redistribute it and/or modify + it under the terms of version 2 of the GNU General Public License + as published by the Free Software Foundation. + + 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 + Free Software Foundation, Inc., + 59 Temple Place, + Suite 330, + Boston, MA 02111-1307, + USA + +=end ------------------------------------------------------------------------- + +=cut + +use strict; +use warnings; + +use Getopt::Long; + + +my $USAGE =<<'END_USAGE'; + +'autoinst' is a wrapper around Eddie Kohler's TypeTools +(http://www.lcdf.org/type/), for installing OpenType fonts in LaTeX. + +Usage: autoinst [options] font[s] + +Possible options: + --encoding=ENC[,ENC] Use ENC as text encoding(s) (default: LY1) + + --(no)ts1 Toggle creation of TS1 fonts + --(no)smallcaps Toggle creation of smallcaps shape + --(no)swash Toggle creation of swash shape + --(no)titling Toggle creation of titling shape + --(no)superiors Toggle creation of fonts with superior characters + --(no)inferiors Toggle creation of fonts with inferior characters + --(no)ornaments Toggle creation of ornament fonts + --(no)fractions Toggle creation of fonts with digits for fractions + + --sanserif Install font as sanserif font + --typewriter Install font as typewriter font + --manual Manual mode (see documentation) + --extra="TEXT" Add TEXT to the command line for 'otftotfm' + + --help Print this text + --verbose Make some noise + + font[s] The fonts (either .otf or .ttf) to install. + +Please report any bugs or suggestions to . +END_USAGE + + +=begin Comment --------------------------------------------------------------- + + The next three tables map the names of weights, widths and shapes + to NFSS codes. New entries can be added without problems, + as long as the name is in all lowercase. + The 'book' and 'regular' weights and the 'regular' width are mapped + to an empty string rather than 'm', because the 'm' disappears when + weight and width are combined into the NFSS series (unless both are + 'regular', but we deal with that case later on). + The 'oblique' (aka 'slanted') shape is mapped to 'it' to make things + easier for ourselves. This means the program will fail for font + families that have both italic and oblique shapes, but I doubt + whether these exist (apart from Computer Modern, of course). + +=end + +=cut + +my %FD_WEIGHT = ( + thin => 't', + ultralight => 'ul', + extralight => 'el', + light => 'l', + book => '', + regular => '', + medium => 'mb', + demibold => 'db', + semibold => 'sb', + bold => 'b', + extrabold => 'eb', + black => 'a', # Not 'k': that means 'book' in fontname + extrablack => 'ea', + heavy => 'h', + ultra => 'ub', + ultrabold => 'ub', + ultrablack => 'ua', +); + +my %FD_WIDTH = ( + ultracondensed => 'uc', + extracondensed => 'ec', + condensed => 'c', + semicondensed => 'sc', + regular => '', + semiextended => 'sx', + extended => 'x', +); + +my %FD_SHAPE = ( + roman => 'n', + italic => 'it', + oblique => 'it', + slanted => 'it', + romani => 'n', + romanii => 'it', # Map one of Silentium Pro's two roman shapes to 'it' +); + +=begin Comment --------------------------------------------------------------- + + The following tables are used for deciding which font families and shapes + to generate. Each hash governs one of these aspects: + - 'figure style' (lining, oldstyle, tabular, proportional, superior, + inferior etc.); each of these will become a separate font family. + - 'variant' shape (normal, small caps, swash, titling or textcomp). + + + Each key in the %FIGURE_STYLE hash names a figure style; the corresponding + value is an anonymous hash with four key/value pairs: + reqd A list of required OpenType features; + this style is built if the font supports at least one + of these features. + nice A list of optional OpenType features; + these are used if the font supports them, but don't + prevent this style from being built when missing. + extra Extra options passed to otftotfm when creating this style. + shape An anonymous array of 'variant' shapes to build with + this figure style. + + Ornaments are treated as a separate 'figure style'. + This may seem a bit funny, but is actually the easiest way to do it. + + + Each key in the %SHAPE hash names a 'variant' shape; the corresponding + value is (again) an anonymous hash with several key/value pairs: + code An anonymous hash with two possible keys: + 'n' -> the NFSS code to use for this variant shape + if the basic shape is upright; + 'it' -> the NFSS code to use for this variant shape + if the basic shape is italic, slanted or oblique; + If the 'n' ('it') entry is missing, the upright (italic) + version of this variant shape will not be built. + reqd A list of required OpenType features; + this shape is built if the font supports at least one + of these features. + nice A list of optional OpenType features; + these are used if the font supports them, but don't + prevent this shape from being built when missing. + extra Extra options passed to otftotfm when creating this shape. + name A string added to the name of the generated font, + to make it unique. + +=end + +=cut + +my %FIGURE_STYLE = ( + TLF => { + reqd => [], + nice => ['lnum', 'tnum'], + extra => '', + shapes => ['normal', 'smallcaps', 'swash', 'titling', 'textcomp'], + }, + LF => { + reqd => ['pnum'], + nice => ['lnum'], + extra => '', + shapes => ['normal', 'smallcaps', 'swash', 'titling', 'textcomp'], + }, + TOsF => { + reqd => ['onum'], + nice => ['tnum'], + extra => '', + shapes => ['normal', 'smallcaps', 'swash', 'textcomp'], + }, + OsF => { + reqd => ['onum','pnum'], + nice => [], + extra => '', + shapes => ['normal', 'smallcaps', 'swash', 'textcomp'], + }, + Sup => { + reqd => ['sups'], + nice => [], + extra => '--ligkern="* {KL} *"', + shapes => ['normal'], + }, + Inf => { + reqd => ['sinf'], + nice => [], + extra => '--ligkern="* {KL} *"', + shapes => ['normal'], + }, + Numr => { + reqd => ['numr'], + nice => [], + extra => '--ligkern="* {KL} *"', + shapes => ['normal'], + }, + Dnom => { + reqd => ['dnom'], + nice => [], + extra => '--ligkern="* {KL} *"', + shapes => ['normal'], + }, + Orn => { + reqd => ['ornm'], + nice => [], + extra => '--ligkern="* {KL} *"', + shapes => ['normal'], + }, +); + +my %SHAPE = ( + normal => { + code => {n => 'n', it => 'it'}, + reqd => [], + nice => ['kern', 'liga'], + extra => '', + name => '', + }, + smallcaps => { + code => {n => 'sc', it => 'scit'}, + reqd => ['smcp'], + nice => ['kern', 'liga'], + extra => '--unicoding="germandbls =: SSsmall"', + name => 'sc', + }, + swash => { + code => {n => 'nw', it => 'sw'}, + reqd => ['swsh', 'dlig'], + nice => ['kern', 'liga'], + extra => '--include-alternates="*.swash" -faalt', + name => 'swash', + }, + titling => { + code => {n => 'tl', it => 'tlit'}, + reqd => ['titl', 'case', 'cpsp'], + nice => ['kern', 'liga'], + extra => '', + name => 'titling', + }, + textcomp => { + code => {n => 'n', it => 'it'}, + reqd => [], + nice => ['onum'], + extra => '', + name => '', + }, +); + + +# The official names +my %CODING_SCHEME = ( + fontools_ly1 => 'TEX TYPEWRITER AND WINDOWS ANSI', + fontools_t1 => 'EXTENDED TEX FONT ENCODING - LATIN', + fontools_ot1 => 'TEX TEXT', + fontools_ts1 => 'TEX TEXT COMPANION SYMBOLS 1---TS1', +); + +# Default values for the command line arguments +%ARGV = ( + encoding => 'LY1', + textcomp => '2', # 0 = no, 1 = yes, 2 = (enc eq 'T1' ? yes : no) + manual => '0', # 0 = no, 1 = yes + verbose => '0', # 0 = no, 1 = yes + extra => '', + nfss => 'rm', + smallcaps => '1', # 0 = no, 1 = yes + swash => '1', # 0 = no, 1 = yes + titling => '0', # 0 = no, 1 = yes + superiors => '1', # 0 = no, 1 = yes + inferiors => '0', # 0 = no, 1 = yes + ornaments => '1', # 0 = no, 1 = yes + fractions => '0', # 0 = no, 1 = yes +); + +my @time = localtime; +my $date = sprintf "%04d/%02d/%02d", $time[5] + 1900, $time[4] + 1, $time[3]; + + +# ----------------------- subroutine definitions ----------------------- + + +sub main { + parse_options(); + + my (%already_seen, %commands, @fd_data, $err_msg); + + FONTFILE: + for my $filename (@ARGV) { + my %fontinfo = read_font_info($filename); + my $unique + = join ',', @fontinfo{qw(family width weight shape min max)}; + if ( $already_seen{$unique} + and $already_seen{$unique} ne $filename) { + $err_msg .= <<"END_PARSE_ERROR"; + +ERROR: I've parsed both '$already_seen{$unique}' + and '$filename' as + + Family $fontinfo{family} + Width $fontinfo{width} + Weight $fontinfo{weight} + Shape $fontinfo{shape} + Size $fontinfo{min}-$fontinfo{max} +END_PARSE_ERROR + } + else { + $already_seen{$unique} = $filename; + } + + FIGURE_STYLE: + for my $figure_style (keys %FIGURE_STYLE) { + + # Does the font support this figure style? + if ( @{$FIGURE_STYLE{$figure_style}{reqd}} + and not grep { exists $fontinfo{features}{$_} } + @{$FIGURE_STYLE{$figure_style}{reqd}} ) { + next FIGURE_STYLE; + } + + # If so, create all corresponding shapes + my $basic = $FD_SHAPE{$fontinfo{shape}}; + + SHAPE: + for my $shape (@{$FIGURE_STYLE{$figure_style}{shapes}}) { + next SHAPE if not exists $SHAPE{$shape}; + next SHAPE if not exists $SHAPE{$shape}{code}{$basic}; + + # Does the font support this shape? + if ( @{$SHAPE{$shape}{reqd}} + and not grep { exists $fontinfo{features}{$_} } + @{$SHAPE{$shape}{reqd}}) { + next SHAPE; + } + + # Decide which features to use + my @features = grep { exists $fontinfo{features}{$_} } + ( + @{$FIGURE_STYLE{$figure_style}{reqd}}, + @{$FIGURE_STYLE{$figure_style}{nice}}, + @{$SHAPE{$shape}{reqd}}, + @{$SHAPE{$shape}{nice}}, + ); + + # Remove duplicate features + my %tmp_features; + for my $f (@features) { + $tmp_features{$f} = 1; + } + if ($tmp_features{onum} && $tmp_features{lnum}) { + delete $tmp_features{lnum}; + } + @features = keys %tmp_features; + + # Figure out the name and NFSS code for the encodings + my @encodings; + if ($shape eq 'textcomp') { + @encodings = (['fontools_ts1', 'ts1']); + } + elsif ($figure_style eq 'Orn') { + @encodings = ([make_ornament_encoding(%fontinfo), 'u']); + } + else { + @encodings = map { [lc $_, lc $_] } @{$ARGV{encoding}}; + } + + ENCODING: + for my $enc_ref (@encodings) { + my ($enc_name, $enc_code) = @{$enc_ref}; + $enc_name =~ s/\A (ly1|ot1|t1) \z/fontools_$1/xms; + + # Create unique name for this font + my $fontname = join '-', + $fontinfo{name}, + lc $figure_style, + $SHAPE{$shape}{name}, + $enc_code, + ; + $fontname =~ s/[-]{2,}/-/xmsg; + + # Create the command line for otftotfm + my $command + = join ' ', + 'otftotfm', + "--encoding=$enc_name", + ($ARGV{manual} ? '--pl' : '--automatic'), + "--map-file=$fontinfo{family}.map --no-updmap", + ($filename =~ m/[.]ttf\z/xms + ? '--no-type1' + : ''), + ($CODING_SCHEME{$enc_name} + ? "--coding-scheme=" + . "\"$CODING_SCHEME{$enc_name}\"" + : ''), + (map { "--feature=$_" } @features), + $FIGURE_STYLE{$figure_style}{extra}, + $SHAPE{$shape}{extra}, + $ARGV{extra}, + '"' . $filename . '"', + $fontname, + ; + + # Save the command and the necessary data for .fd files + push @{$commands{$fontinfo{family}}}, $command; + push @fd_data, + join '|', + $fontinfo{family}, + uc $enc_code, + $figure_style, + $FD_WEIGHT{$fontinfo{weight}} + . $FD_WIDTH{$fontinfo{width}} + || 'm', + $SHAPE{$shape}{code}{$basic}, + sprintf("%04.1f",$fontinfo{min}), + sprintf("%04.1f",$fontinfo{max}), + $fontname, + ; + + if ($ARGV{verbose}) { + printf " %-42s %4s/%s-%s/%s/%s\n", + $fontname, + uc $enc_code, + $fontinfo{family}, + $figure_style, + $FD_WEIGHT{$fontinfo{weight}} + .$FD_WIDTH{$fontinfo{width}} + || 'm', + $SHAPE{$shape}{code}{$basic}, + ; + } + } + } + } + } + + # If parsing failed, flush STDOUT, print the error messages and die + if (defined $err_msg) { + close STDOUT; + die $err_msg . <<'END_GENERAL_PARSE_ERROR'; + + +I suspect your font family contains some unusual weights or widths. +You might try adding missing widths and weights to the tables +'%FD_WIDTH' and '%FD_WEIGHT' at the beginning of the source code; +otherwise, please send a bug report to . +END_GENERAL_PARSE_ERROR + } + + @fd_data = sort @fd_data; + + for my $fd_line (@fd_data) { + my @fd_line = split /[|]/, $fd_line; + $fd_line[5] += 0; + $fd_line[6] += 0; + $fd_line = \@fd_line; + } + + # Adjust size ranges + $fd_data[0][5] = ''; + for my $i (0 .. $#fd_data - 1) { + if (grep { $fd_data[$i][$_] ne $fd_data[$i + 1][$_] } 0 .. 4) { + $fd_data[$i][6] = $fd_data[$i + 1][5] = ''; + } + else { + $fd_data[$i][6] = $fd_data[$i + 1][5]; + } + } + $fd_data[-1][6] = ''; + + # Generate .fd files + my @fd_prev = ('') x 8; + my $FD; + for my $fd_line_ref (@fd_data) { + my @fd_line = @{$fd_line_ref}; + + write_style_file($fd_line[0], @fd_data) if $fd_line[0] ne $fd_prev[0]; + + if (grep { $fd_line[$_] ne $fd_prev[$_] } 0 .. 2) { + end_fd_file($FD) if $fd_prev[0]; + $FD = start_fd_file(@fd_line[0 .. 2]); + } + + if (grep { $fd_line[$_] ne $fd_prev[$_] } 0 .. 4) { + # Start new fontshape + if (not grep { $fd_line[$_] ne $fd_prev[$_] } 0 .. 2) { + print {$FD} "}{}\n\n"; + } + printf {$FD} "\\DeclareFontShape{%s}{%s-%s}{%s}{%s}{\n", + @fd_line[1, 0, 2, 3, 4]; + } + + # Write fontshape entry + printf {$FD} " %s \\%s\@\@scale %s\n", + sprintf("%5s-%-5s", '<' . $fd_line[5], $fd_line[6] . '>'), + $fd_line[0], + $fd_line[7], + ; + + @fd_prev = @fd_line; + } + + end_fd_file($FD) if $fd_prev[0]; + + # Remove the --no-updmap option from the last command for each family + map { $_->[-1] =~ s/--no-updmap//xms } values %commands; + + # Print or execute the generated commands + if ($ARGV{manual}) { + while (my ($fam, $cmds_ref) = each %commands) { + open my $BAT, '>', "$fam.bat" + or die "ERROR: can't create '$fam.bat' - $!"; + map { print {$BAT} "$_\n" } @{$cmds_ref}; + close $BAT; + } + } + else { + for my $cmds_ref (values %commands) { + for my $cmd (@{$cmds_ref}) { + print "$cmd\n"; + system $cmd and warn <<'END_OTFTOTFM_WARNING'; + +WARNING: 'otftotfm' finished with a non-zero return code; + I'm afraid something went wrong! + +END_OTFTOTFM_WARNING + } + } + } +} + +# ------------------------------------------------------------------------ + +sub parse_options { + my $cmdline = "$0 " . join ' ', @ARGV; + + GetOptions( + 'help' => sub { print $USAGE; exit }, + 'encoding=s' => \$ARGV{encoding}, + 'ts1!' => \$ARGV{textcomp}, + 'manual' => \$ARGV{manual}, + 'verbose' => \$ARGV{verbose}, + 'extra=s' => \$ARGV{extra}, + 'sanserif' => sub { $ARGV{nfss} = 'sf' }, + 'typewriter' => sub { $ARGV{nfss} = 'tt' }, + 'smallcaps!' => \$ARGV{smallcaps}, + 'swash!' => \$ARGV{swash}, + 'titling!' => \$ARGV{titling}, + 'superiors!' => \$ARGV{superiors}, + 'inferiors!' => \$ARGV{inferiors}, + 'ornaments!' => \$ARGV{ornaments}, + 'fractions!' => \$ARGV{fractions}, + ) + or die "$USAGE"; + + die "$USAGE" unless @ARGV; + + if (!$ARGV{smallcaps}) { delete $SHAPE{smallcaps} } + if (!$ARGV{swash} ) { delete $SHAPE{swash} } + if (!$ARGV{titling} ) { delete $SHAPE{titling} } + + if (!$ARGV{superiors}) { delete $FIGURE_STYLE{Sup} } + if (!$ARGV{inferiors}) { delete $FIGURE_STYLE{Inf} } + if (!$ARGV{ornaments}) { delete $FIGURE_STYLE{Orn} } + if (!$ARGV{fractions}) { delete @FIGURE_STYLE{qw(Numr Dnom)} } + + $ARGV{encoding} =~ s/\s+//xmsg; + my @textencodings = grep { $_ ne 'TS1' } + map { uc } + split /,/, $ARGV{encoding}; + $ARGV{encoding} = \@textencodings; + + # TS1-encoded fonts are generated if: + # - text encoding is T1 and the user didn't turn off TS1, or + # - the user explicitly asked for TS1 + if ( + !( (grep { $_ eq 'T1' } @{$ARGV{encoding}} and $ARGV{textcomp}) + or $ARGV{textcomp} == 1 + )) { + delete $SHAPE{textcomp}; + } + + if ($ARGV{verbose}) { + print <<"END_ARGUMENTS"; + +$cmdline + + +I'm using the following options: + + encoding(s): @{[ join ', ', @{$ARGV{encoding}} ]} + NFSS: $ARGV{nfss} @{[ $ARGV{nfss} eq 'rm' ? '(serif)' + : $ARGV{nfss} eq 'sf' ? '(sanserif)' + : $ARGV{nfss} eq 'tt' ? '(typewriter)' + : '(unknown)' + ]} + + (no)ts1: @{[ $SHAPE{textcomp} ? 'ts1' : 'nots1' ]} + (no)smallcaps: @{[ $ARGV{smallcaps} ? 'smallcaps' : 'nosmallcaps' ]} + (no)swash: @{[ $ARGV{swash} ? 'swash' : 'noswash' ]} + (no)titling: @{[ $ARGV{titling} ? 'titling' : 'notitling' ]} + (no)superiors: @{[ $ARGV{superiors} ? 'superiors' : 'nosuperiors' ]} + (no)inferiors: @{[ $ARGV{inferiors} ? 'inferiors' : 'noinferiors' ]} + (no)ornaments: @{[ $ARGV{ornaments} ? 'ornaments' : 'noornaments' ]} + (no)fractions: @{[ $ARGV{fractions} ? 'fractions' : 'nofractions' ]} + + extra: @{[ $ARGV{extra} || 'empty' ]} + + auto/manual: @{[ $ARGV{manual} ? 'manual' : 'automatic' ]} + verbosity: @{[ $ARGV{verbose} ? 'verbose' : 'silent' ]} + +END_ARGUMENTS + } +} + +# ------------------------------------------------------------------------ + +sub read_font_info { + my ($fontfile) = @_; + + my %info = (); + + # Read some general info about the font + open my $OTFINFO, '-|', "otfinfo --info \"$fontfile\"" + or die "ERROR: 'otfinfo --info \"$fontfile\"' failed"; + + LINE: + for my $line (<$OTFINFO>) { + my ($key, $val) = $line =~ m/([^:]+) :\s* ([^\n]+)/xms + or next LINE; + $val =~ s/[^-\w]//xmsg; + $info{$key} = $val; + } + close $OTFINFO; + + if ($info{Family} =~ m/\A (.+ (?: OT | Pro))/xms) { + $info{Family} = $1; + } + + $info{'Full name'} =~ s/$info{Family}//xmsg; + $info{'Full name'} = lc $info{'Full name'}; + $info{Family} =~ s/\A (?: Adobe | ITC ) | LT | MT//xmsg; + + # Set default + my %fontinfo = ( + filename => $fontfile, + name => $info{'PostScript name'}, + family => $info{Family}, + width => 'regular', + weight => 'regular', + shape => 'roman', + min => 0, + max => 0, + features => {}, + ); + + # Try to match width, weight and (basic) shape + WIDTH: + for my $width (map { quotemeta } + reverse sort + { length($a) <=> length($b) || $a cmp $b } + keys %FD_WIDTH) + { + if ($info{'Full name'} =~ s/$width//xmsi) { + $fontinfo{width} = $width; + last WIDTH; + } + } + + WEIGHT: + for my $weight (map { quotemeta } + reverse sort + { length($a) <=> length($b) || $a cmp $b } + keys %FD_WEIGHT) + { + if ($info{'Full name'} =~ s/$weight//xmsi) { + $fontinfo{weight} = $weight; + last WEIGHT; + } + } + SHAPE: + for my $shape (map { quotemeta } + reverse sort + { length($a) <=> length($b) || $a cmp $b } + keys %FD_SHAPE) + { + if ($info{'Full name'} =~ s/$shape//xmsi) { + $fontinfo{shape} = $shape; + last SHAPE; + } + } + + # Read optical size info + open $OTFINFO, '-|',"otfinfo --optical-size \"$fontfile\"" + or die "ERROR: 'otfinfo --optical-size \"$fontfile\"' failed"; + if (my ($fm, $to) + = <$OTFINFO> =~ m/ + [(] + ( [\d.]+ ) \s* pt, \s* + ( [\d.]+ ) \s* pt \s* + []] + /xms) { + # Work around some known bugs + if ($fontinfo{name} eq 'GaramondPremrPro-It' + && $fm == 6 + && $to == 8.9) { + @fontinfo{qw(min max)} = (8.9, 14.9); + } + elsif ($fontinfo{family} eq 'KeplerStd' + && $info{Subfamily} =~ m/Caption/xms + && $fm == 8.9 + && $to == 13.9) { + @fontinfo{qw(min max)} = (6, 8.9); + } + elsif ($fontinfo{family} eq 'KeplerStd' + && $info{Subfamily} =~ m/Subhead/xms + && $fm == 8.9 + && $to == 13.9) { + @fontinfo{qw(min max)} = (13.9, 23); + } + elsif ($fontinfo{family} eq 'KeplerStd' + && $info{Subfamily} =~ m/Display/xms + && $fm == 8.9 + && $to == 13.9) { + @fontinfo{qw(min max)} = (23, 72); + } + else { + @fontinfo{qw(min max)} = ($fm, $to); + } + } + close $OTFINFO; + + # See what features this font provides + open $OTFINFO, '-|',"otfinfo --features \"$fontfile\"" + or die "ERROR: 'otfinfo --features \"$fontfile\"' failed"; + for my $line (<$OTFINFO>) { + if ($line =~ m/\A (\w{4}) \s+/xms) { + $fontinfo{features}{$1} = 1; + } + } + close $OTFINFO; + + if ($ARGV{verbose}) { + print <<"END_FONT_INFO"; + +$fontfile: + Family $fontinfo{family} + Width $fontinfo{width} + Weight $fontinfo{weight} + Shape $fontinfo{shape} + Size @{[ $fontinfo{min} || '']}-@{[ $fontinfo{max} || '' ]} +END_FONT_INFO + + my @features = sort keys %{$fontinfo{features}}; + my $prefix = ' Features '; + while (@features) { + print $prefix, join(' ', splice @features, 0, 10), "\n"; + $prefix = ' ' x length $prefix; + } + print "\n"; + } + + return %fontinfo; +} + + +=begin Comment --------------------------------------------------------------- + + Ornament glyph names vary across fonts, so we generate font-specific + encoding vectors. + This is skipped if a file `_orn.enc' is found in the current + directory, so the user can provide her own vector if she wants to. + +=end + +=cut + +sub make_ornament_encoding { + my (%fontinfo) = @_; + + my $fontfile = $fontinfo{filename}; + my $enc_name = $fontinfo{family} . '_orn'; + + if (not -e "$enc_name.enc") { + + # Default ornament names: 'orn.' plus three digits + my @encoding = map { sprintf "orn.%03d", $_ } 1 .. 256; + + open my $OTFINFO, '-|', "otfinfo --glyphs \"$fontfile\"" + or die "ERROR: 'otfinfo --glyphs \"$fontfile\"' failed"; + chop(my @glyphnames = <$OTFINFO>); + close $OTFINFO; + + # Test for some known alternative names (probably not exhaustive) + my @ornaments + = sort grep { m/\A (?:orn|u2022[.]|word[.]|hand|bullet[.]) | [.]orn \z/xms } + @glyphnames; + + if (@ornaments > 256) { + @encoding = @ornaments[0 .. 255]; + } + else { + @encoding[0 .. $#ornaments] = @ornaments; + } + + open my $ORNAMENTS, '>', "$enc_name.enc" + or die "ERROR: can't create '$enc_name.enc' - $!"; + + print {$ORNAMENTS} "/$fontinfo{family}OrnamentEncoding [\n"; + map { print {$ORNAMENTS} " /$_\n" } @encoding; + print {$ORNAMENTS} "] def\n"; + close $ORNAMENTS; + } + + return $enc_name; +} + +# ------------------------------------------------------------------------ + +sub write_style_file { + my ($family, @fd_data) = @_; + + my (%seen_enc, %seen_style, %seen_series); + + LINE: + for my $line_ref (@fd_data) { + my ($fam, $enc, $style, $series) = @{$line_ref}[0 .. 3]; + next LINE if $fam ne $family; + $seen_enc{$enc} = 1; + $seen_style{$style} = 1; + $seen_series{$series} = 1; + } + + open my $STYLE, '>', "$family.sty" + or die "ERROR: can't create '$family.sty' - $!"; + print {$STYLE} <<"END_STY_HEADER"; +%%Generayed by autoinst on $date +%% +\\NeedsTeXFormat{LaTeX2e} +\\ProvidesPackage{$family} + [$date (autoinst) Style file for $family.] + +END_STY_HEADER + + my $textenc = join ',', grep { $_ ne 'OT1' } @{$ARGV{encoding}}; + + print {$STYLE} "\\RequirePackage[$textenc]{fontenc}\n" if $textenc; + print {$STYLE} "\\RequirePackage{textcomp}\n" if $seen_enc{TS1}; + + print {$STYLE} <<'END_STY_FONTAXES'; +\IfFileExists{fontaxes.sty}{ + \RequirePackage{fontaxes} + \providecommand{\tldefault}{tl} + \DeclareRobustCommand\tlshape{\not@math@alphabet\tlshape\relax + \fontsecondaryshape\tldefault\selectfont} + \DeclareTextFontCommand{\texttl}{\tlshape} + \let\texttitling\texttl + \fa@naming@exception{shape}{{n}{tl}}{tl} + \fa@naming@exception{shape}{{it}{tl}}{tlit} + + \DeclareRobustCommand\swshape{\not@math@alphabet\swshape\relax + \fontprimaryshape\itdefault\fontsecondaryshape\swdefault\selectfont} + \fa@naming@exception{shape}{{n}{sw}}{nw} + \fa@naming@exception{shape}{{it}{sw}}{sw} + + \fa@naming@exception{figures}{{superior}{proportional}}{Sup} + \fa@naming@exception{figures}{{superior}{tabular}}{Sup} + \def\sufigures{\@nomath\sufigures + \fontfigurestyle{superior}\selectfont} + \DeclareTextFontCommand{\textsu}{\sufigures} + \let\textsuperior\textsu + + \fa@naming@exception{figures}{{inferior}{proportional}}{Inf} + \fa@naming@exception{figures}{{inferior}{tabular}}{Inf} + \def\infigures{\@nomath\infigures + \fontfigurestyle{inferior}\selectfont} + \DeclareTextFontCommand{\textin}{\infigures} + \let\textinferior\textin + + \fa@naming@exception{figures}{{ornament}{proportional}}{Orn} + \fa@naming@exception{figures}{{ornament}{tabular}}{Orn} + \def\ornaments{\@nomath\ornaments + \fontencoding{U}\fontfigurestyle{ornament}\selectfont} + \DeclareTextFontCommand{\textornaments}{\ornaments} + \providecommand{\ornament}[1]{\textornaments{\char##1}} + + \fa@naming@exception{figures}{{numerators}{proportional}}{Numr} + \fa@naming@exception{figures}{{numerators}{tabular}}{Numr} + + \fa@naming@exception{figures}{{denominators}{proportional}}{Dnom} + \fa@naming@exception{figures}{{denominators}{tabular}}{Dnom} +}{} + +END_STY_FONTAXES + + print {$STYLE} <<"END_STY_XKEYVAL"; +\\IfFileExists{xkeyval.sty}{ + \\newcommand*{\\$family\@scale}{1} + \\RequirePackage{xkeyval} + \\DeclareOptionX{scaled}{\\renewcommand*{\\$family\@scale}{##1}} +}{ + \\let\\DeclareOptionX\\DeclareOption + \\let\\ExecuteOptionsX\\ExecuteOptions + \\let\\ProcessOptionsX\\ProcessOptions +} + +END_STY_XKEYVAL + + if ($seen_style{LF} or $seen_style{TLF}) { + print {$STYLE} + "\\DeclareOptionX{lining}{\\edef\\$family\@figurestyle{LF}}\n"; + } + if ($seen_style{OsF} or $seen_style{TOsF}) { + print {$STYLE} + "\\DeclareOptionX{oldstyle}{\\edef\\$family\@figurestyle{OsF}}\n"; + } + if ($seen_style{TLF} or $seen_style{TOsF}) { + print {$STYLE} + "\\DeclareOptionX{tabular}{\\edef\\$family\@figurealign{T}}\n"; + } + if ($seen_style{LF} or $seen_style{OsF}) { + print {$STYLE} + "\\DeclareOptionX{proportional}{\\edef\\$family\@figurealign{}}\n"; + } + + my $defaults + = $seen_style{OsF} ? 'oldstyle,proportional' + : $seen_style{TOsF} ? 'oldstyle,tabular' + : $seen_style{LF} ? 'lining,proportional' + : $seen_style{TLF} ? 'lining,tabular' + : die "ERROR: encountered un unknown bug"; + + my $default_bold; + for my $series ( + qw(ultrablack ultrabold heavy extrablack black + extrabold demibold semibold bold)) { + if ($seen_series{$FD_WEIGHT{$series}}) { + printf {$STYLE} + "\\DeclareOptionX{%s}{\\renewcommand*{\\bfdefault}{%s}}\n", + $series, $FD_WEIGHT{$series}; + $default_bold = $series; + } + } + $defaults .= ",$default_bold" if $default_bold; + + my $default_regular; + for my $series ( + qw(light medium regular)) { + if ($seen_series{$FD_WEIGHT{$series} || 'm'}) { + printf {$STYLE} + "\\DeclareOptionX{%s}{\\renewcommand*{\\mddefault}{%s}}\n", + $series, $FD_WEIGHT{$series} || 'm'; + $default_regular = $series; + } + } + $defaults .= ",$default_regular" if $default_regular; + + print {$STYLE} <<"END_STYLE_REST"; +\\ExecuteOptionsX{$defaults} +\\ProcessOptionsX\\relax + +\\renewcommand* + {\\$ARGV{nfss}default} + {$family-\\$family\@figurealign\\$family\@figurestyle} +\\renewcommand*{\\familydefault}{\\$ARGV{nfss}default} + +\\endinput +END_STYLE_REST + + close $STYLE; +} + +# ------------------------------------------------------------------------ + +sub start_fd_file { + my ($fam, $enc, $fig) = @_; + + open my $FD, '>', "$enc$fam-$fig.fd" + or die "ERROR: can't create '$enc$fam-$fig.fd' - $!"; + + print {$FD} <<"END_FD_HEADER"; +%%Generated by autoinst on $date +%% +\\ProvidesFile{$enc$fam-$fig.fd} + [$date (autoinst) Font definitions for $enc/$fam-$fig.] + +\\expandafter\\ifx\\csname $fam\@scale\\endcsname\\relax + \\let\\$fam\@\@scale\\\@empty +\\else + \\edef\\$fam\@\@scale{s*[\\csname $fam\@scale\\endcsname]}% +\\fi + +\\DeclareFontFamily{$enc}{$fam-$fig}{} + +END_FD_HEADER + + return $FD; +} + +# ------------------------------------------------------------------------ + +sub end_fd_file { + my ($FD) = @_; + + print {$FD} "}{}\n\n\\endinput\n"; + close $FD; +} + + +main() + + +__END__ + + + pod2man --center="fontools" --date=`date +"%Y-%m-%d"` \ + --release="fontools" --section=1 autoinst autoinst.1 + + man -t ./autoinst.1 | ps2pdf - autoinst.pdf + + +=pod + +=head1 NAME + +autoinst - wrapper script around the F, +for installing OpenType fonts in LaTeX. + + +=head1 SYNOPSIS + +autoinst [options] I [I ...] + + +=head1 DESCRIPTION + +Eddie Kohler's F, especially F, are great tools for +installing OpenType fonts for use with LaTeX, but their use (even in +automatic mode) is quite complicated because it needs lots of long +command lines and doesn't generate the F and F files LaTeX needs. +B simplifies the font installation +process by generating and executing all commands for F +and by creating all necessary F and F files. All the user then needs +to do is move these files to a suitable location +(C<< $LOCALTEXMF/tex/latex/// >> being the +canonical choice) and update TeX's filename database. + +Given a family of font files (in either F<.ttf> or F<.otf> format), +B will create several LaTeX font families: + +=over 2 + +=over 2 + +=item B<-> + +Four text families (with lining and oldstyle figures, in tabular and +proportional variants), each with the following shapes: + +=over 2 + +=over 4 + +=item I + +Roman text + +=item I + +Small caps + +=item I + +`Upright swash'; usually normal text with some extra `oldstyle' ligatures, +such as ct, sp and st. + +=item I + +Titling shape. Meant for all-caps text only (even though it sometimes contains +lowercase glyphs as well), where letterspacing and the positioning of +punctuation characters have been adjusted to suit all-caps text. +This shape is generated only for the families with lining figures. + +=item I + +Italic or oblique text + +=item I + +Italic small caps + +=item I + +Swash + +=item I + +Italic titling + +=back + +=back + +=item B<-> + +For each text family: a family of TS1-encoded symbol fonts, +in roman and italic shapes. + +=item B<-> + +Four families with superiors, inferiors, numerators and denominators, +in roman and italic shapes. + +=item B<-> + +An ornament family, in roman and italic shapes. + +=back + +=back + +Of course, if the font doesn't contain oldstyle figures, small caps etc., +the corresponding shapes or families are not created; +furthermore, the creation of most families and shapes can be controlled by +command-line options (see below). + +The generated font families are named I<< - >>, +where I<< >> is one of + +=over 8 + +=item I + +proportional (i.e., figures have varying widths) lining figures + +=item I + +tabular (i.e., all figures have the same width) lining figures + +=item I + +proportional oldstyle figures + +=item I + +tabular oldstyle figures + +=item I + +superior characters (many fonts only have an incomplete set +of superiors: figures, some punctuation and the letters +I; normal forms will be used for the other characters) + +=item I + +inferior characters; usually only figures and punctuation, +normal forms for the other characters + +=item I + +ornaments + +=item I + +numerators + +=item I + +denominators + +=back + +The generated fonts are named I<< --- >>, +where I<< >> is the name of the OpenType file, I<< >> +is the same as above (but in lowercase), I<< >> is either empty, +`sc', `swash' or `titling', and I<< >> is the encoding. +A typical name in this scheme is F. + + +=head2 On the choice of text encoding + +By default, all text families use the LY1 encoding. This has been chosen +over T1 (Cork) because many OpenType fonts contain additional ligatures +such as fj and Th, and LY1 has a number of empty slots to accommodate these. + +A different encoding can be selected using the B< --encoding> +command line option (see below). + + +=head2 Using the fonts with LaTeX + +B generates a style file for using the font in LaTeX documents, +named `>.sty'. This style file also takes care of loading the +F and F packages, if necessary. +To use the font, simply put C<\usepackage{MinionPro}> +(or whatever the font is called) in the preamble of your document. + +This style file defines a number of options: + +=over 4 + +=item I + +Choose which figures will be used for the text fonts. +The defaults are `oldstyle' and `proportional' (if available). + +=item I + +Choose the weight that LaTeX will use for the `bold' weight +(i.e., the value of C<\bfdefault>). + +=item I + +Choose the weight that LaTeX will use for the `regular' weight +(i.e., the value of C<\mddefault>). + + +=item I<< scaled= >> + +Scale the font by a factor of I<< >>. +For example: to increase the size of the font by 5%, use the command +C<\usepackage[scaled=1.05]{MyriadPro}>. + +This option is only available when the F package is found +in your TeX installation. + +=back + +The style file will also try to load the F package (part of +the MinionPro for LaTeX project), which gives easy access to various font +shapes and styles. This package can be downloaded from the project's homepage +(F) or directly through +the CVS web interface +(F), +and is also available from CTAN as part of the archive F +(F). + +Using the machinery set up by F, the generated style file +also defines a few commands (which take the text to be typeset as argument) +and declarations (which don't take arguments, but affect all text up to +the end of the current group) of its own: + + + DECLARATION COMMAND SHORT FORM OF COMMAND + + \tlshape \texttitling \texttl + \sufigures \textsuperior \textsu + \infigures \textinferior \textin + + +In addition, the C<\swshape> and C<\textsw> commands are redefined to place +swash on the secondary shape axis (F places it on the primary +shape axis); this allows the use of `upright swash'. +Just saying C<\swshape> will still give normal (italic) swash, +but C<\swshape\upshape> results in upright swash. + +Note that there is no separate command for accessing the italic titling shape; +but these commands behave properly when nested, so C<\tlshape\itshape> gives +italic titling. +There are also no commands for accessing the numerator and denominator +fonts; these can be selected using F' low-level commands, +e.g., C<\fontfigurestyle{numerator}\selectfont>. + +The style file also provides a command C<<< \ornament{I<< >>} >>>, +where C<<< I<< >> >>> is a number from 0 to the total number of +ornaments minus one. Ornaments are always typeset using the current family, +series and shape. A list of all ornaments in a font can be created by +running LaTeX on the file F (part of a standard +LaTeX installation) and specifying the ornament font +(e.g., I). + +This whole machinery builds on F; if that package cannot be found, +the style file doesn't provide high-level access to the more `exotic' +font shapes and styles. In that case, you're limited to using the lower-level +commands from standard NFSS, or even plain TeX's C<\font> primitive +(and it's called `primitive' for a reason!) + + +=head2 Using multiple font families in one document + +If you want to use several font families in one document, make sure +all fonts were installed using the same version of B. +B has seen some non-backward-compatible changes in the past, +and F<.sty> and F<.fd> files that were generated by different versions +of B may not be able to coexist peacefully. + + +=head2 NFSS codes + +In NFSS, weight and width are concatenated into a single `series' attribute. +(I versions of B before 2007-07-27 erroneously formed +the series as `width plus weight' instead of the reverse.) +B maps widths, weights and shapes to NFSS codes using +the following tables. These are based on the tables in Lehman's +F, but some changes had to be made to avoid +name clashes for font families with many different widths and weights +(such as Helvetica Neue). + + + WEIGHT WIDTH + + Thin t Ultra Condensed uc + Ultra Light ul Extra Condensed ec + Extra Light el Condensed c + Light l Semicondensed sc + Book [1] Regular [1] + Regular [1] Semiextended sx + Medium mb Extended x + Demibold db + Semibold sb + Bold b + Extra Bold eb SHAPES + Black a + Extra Black ea Roman n + Heavy h Italic it + Ultra ub Oblique it [2] + Ultra Bold ub RomanI n [3] + Ultra Black ua RomanII it [3] + + +=over 4 + +=item [1] + +When I weight and width are empty, the `series' attribute becomes `m'. + +=item [2] + +Mapping the `Oblique' shape to `it' instead of the canonical `sl' simplifies +B. Since font families with both `Italic' and `Oblique' shapes +probably do not exist (apart from Computer Modern), +this shouldn't cause problems in real life. + +=item [3] + +To the best of my knowledge, the only font family that has two `Roman' shapes +is Silentium; since this has no `Italic' shape, +the `it' code is (ab)used for the `RomanII' shape. + +=back + + +=head2 A note for MikTeX users + +Calling F with the B< --automatic> option (as B does by +default) requires a TeX-installation that uses the F library; with +TeX-installations that implement their own directory searching +(such as MiKTeX) F might complain that it +cannot find a writable F directory and leave all generated F, +F, F and F files in the current working directory. +In that case, you need to move these to their correct destinations. +You also need to tell the dvi-driver (F, F, F etc.) +about the new font map files; this usually means editing some +configuration file. + +Furthermore, some OpenType fonts lead to F and F files that are too +big for MiKTeX's F and F; the versions that come with TeXLive +(F) don't have this +problem. + + +=head1 COMMAND-LINE OPTIONS + +=over 4 + +=item B< --encoding>=I + +Use the encoding I for the text fonts. The default is `LY1'. +A file named `>.enc' (in all I) should be somewhere +where F can find it. Suitable encoding files +for LY1, OT1 and T1/TS1 come with I. (Note that these files are +called I to avoid name clashes with other packages; +the `fontools_' prefix doesn't need to be specified.) + +Multiple text encodings can be specified as well: C< --encoding=OT1,T1,LY1>. +The encodings are passed to F in the order specified, +so the last one will be the default text encoding. + +=item B< --sanserif> + +Install the font as a sanserif font, accessed via C<\sffamily> and C<\textsf>. +Note that the generated style file redefines C<\familydefault>, +so including it will make this font the default text font. + +=item B< --typewriter> + +Install the font as a typewriter font, accessed via C<\ttfamily> and +C<\texttt>. +Note that the generated style file redefines C<\familydefault>, +so including it will make this font the default text font. + +=item B< --ts1> + +=item B< --nots1> + +Turn the creation of TS1-encoded fonts on or off. The default is B< --ts1> +if the text encodings (see I< --encoding> above) include T1, +B< --nots1> otherwise. + +=item B< --smallcaps> + +=item B< --nosmallcaps> + +Turn the creation of small caps fonts on or off. The default is +B< --smallcaps>. + +=item B< --swash> + +=item B< --noswash> + +Turn the creation of swash fonts on or off. The default is B< --swash>. + +=item B< --titling> + +=item B< --notitling> + +Turn the creation of titling fonts on or off. The default is B< --notitling>. + +=item B< --superiors> + +=item B< --nosuperiors> + +Turn the creation of fonts with superior characters on or off. +The default is B< --superiors>. + +=item B< --inferiors> + +=item B< --noinferiors> + +Turn the creation of fonts with inferior figures on or off. +The default is B< --noinferiors>. + +=item B< --fractions> + +=item B< --nofractions> + +Turn the creation of fonts with numerators and denominators on or off. +The default is B< --nofractions>. + +=item B< --ornaments> + +=item B< --noornaments> + +Turn the creation of ornament fonts on or off. The default is B< --ornaments>. + +=item B< --manual> + +Manual mode. By default, B immediately executes all F +command lines it generates; with the B< --manual> option, these commands are +instead written to a batch command file (named `>.bat', to make things +easier for our friends on Windows). Also, the generated F command +lines specify the I< --pl> option and leave out the I< --automatic> option; +this causes human readable (and editable) F and F files to be created +instead of the default F and F files. + +=item B< --verbose> + +Verbose mode; print detailed info about what B thinks it's doing. + +=item B< --extra>=I + +Pass I as options to I. To prevent I from accidentily +being interpreted as options to B, it should be properly quoted. + +=back + + +=head1 SEE ALSO + +Eddie Kohler's TypeTools (F). + +Perl is usually pre-installed on Linux and Unix systems; +for Windows, good (and free) Perl implementations are +Strawberry Perl (F) and +ActivePerl (available from F); + +John Owens' F (F; +also available from CTAN) is another wrapper around F, +and may work for you when B doesn't. + +Ready-made support files for MinionPro, providing more options and features +than B ever will (including math), are available from +F. + +XeTeX (F) is a TeX extension that can use +any font installed in the operating system (including both flavours of +OpenType fonts) without additional support files. +It also isn't hindered by standard TeX's limitation to 8-bit fonts, +so it is especially well suited to fonts with many ligatures and +alternate glyphs, such as Bickham, Poetica and Zapfino. + + +=head1 AUTHOR + +Marc Penninga + +When sending a bug report, please give as much relevant information as +possible; this usually includes (but may not be limited to) the output from +running B with the B< --verbose> option. +Please make sure that this output includes all error messages (if any); +this can be done using the command + + autoinst I<(... all options and files ...)> >autoinst.log 2>&1 + + +=head1 COPYRIGHT + +Copyright (c) 2005-2009 Marc Penninga. + + +=head1 LICENSE + +This program is free software; you can redistribute it and/or modify +it under the terms of version 2 of the GNU General Public License +as published by the Free Software Foundation. + +A copy of the GNU General Public License is included with the I +collection; see the file F. + + +=head1 DISCLAIMER + +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. + + + +=head1 RECENT CHANGES + +(See the source code for the full story.) + +=over 12 + +=item I<2009-04-09> + +Prefixed the filenames of the included encoding files with +`fontools_', to prevent name clashes with other packages. + +=item I<2009-04-06> + +A small patch to the make_ornament_encoding subroutine; +it now also recognises the I ornament glyphs +in Adobe's Kepler Pro. + + +=begin Really_old_history + + +=item I<2007-08-07> + +Fixed a small bug with filename quoting on Windows. + +=item I<2007-07-31> + +Changed the tables that map weights and widths to NFSS codes: +in some extended families (Helvetica Neue), different combinations of +weight and width were mapped to the same `series'. +Added a work-around for incorrect size info in some Kepler fonts. +Fixed a small bug in the generated commands for otftotfm +(sometimes, the I< --onum> feature was included twice). +Added encoding file for OT1 to the I collection. + +=item I<2007-07-27> + +Two bugfixes: a closing brace was missing in the generated style file, +and the NFSS series was formed as `width plus weight' instead of the reverse. + +=item I<2007-06-10> + +Bugfix: silently replacing \DeclareOption, \ProcessOptions and +\ExecuteOptions with their counterparts from the xkeyval package +caused problems for some other packages. + +=item I<2007-06-04> + +Added the F< --no-updmap> option to all generated commands for F +(except the last); this should yield a significant speed-up for large +families (suggested by Steven E. Harris). +Tweaked the font info parsing to work around a bug in the naming of +some FontFont fonts, where every font is in a family of its own. +Added the `scaled' option (including the loading of F) +to the generated style file. +Extended the output of the F< --verbose> option. + +=item I<2007-02-08> + +Yet Another Complete Rewrite. +The code is now much more readable and more flexible; +the program can now handle fonts from different families, +as well as multiple text encodings. +Rewrote the font info parsing code to work for Arno Pro. + +=item I<2006-10-11> + +The program determines the fonts' weights, widths and shapes by parsing +the output from F instead of the font filename. +This should make B work for non-Adobe fonts. +Filenames with spaces now work as well. + +=item I<2006-08-31> + +Made the generated style files try to include `fontaxes.sty'; +changed the names of the generated fonts and families +(to make the previous change possible); +added command line options for most font styles and shapes; +tweaked the filename parsing code for Cronos Pro and Gill Sans Pro; +added runtime generation of encoding vectors for ornament fonts +(because GaramondPremier's ornament names differ from other fonts); +changed the NFSS-code for italic small caps and titling to `scit' and `tlit' +(to work with F); +and edited (and hopefully improved) the documentation. + +=item I<2005-10-03> + +When creating LY1, T1, OT1 or TS1 encoded fonts, the I< --coding-scheme> +option is added to the commands for F; this should make the +generated F and F files acceptable to I. +Also elaborated the documentation somewhat and fixed a small bug. + +=item I<2005-09-22> + +Added check to see if filename parsing succeeded; +updated the filename parsing code to cater for GaramondPremier, Silentium +and some non-Adobe fonts; +added the B< --sanserif> and B< --typewriter> options and hacked the +style files to support using several different font families in one document. + +=item I<2005-09-12> + +Cleaned up the code (it now runs under the F and F pragmas); +fixed a (rather obscure) bug that occurred when creating TS1-encoded +fonts for families with multiple optical masters and oldstyle figures; +added the I etc. options to the style file; +and improved the layout of the generated files. + +=item I<2005-08-11> + +The generated commands weren't actually executed, only printed.... +Also added a small hack to cater for fonts +(such as some recent versions of MinionPro) +that contain swash characters but don't provide a `swsh' feature. + +=item I<2005-08-10> + +Dropped the `fontname' scheme in favor of a more verbose naming scheme, +since many filenames were still more than eight characters long anyway. +Added F-like commands to the generated style file. +Changed the default encoding to LY1 and added the `inferior' shape. + +=item I<2005-08-01> + +Rewrote (and hopefully improved) the user interface; +changed the program to by default execute the generated F command +lines rather than writing them to a file; +added automatic determination of the `fontname' code for the font family; +changed the NFSS code for italic small caps to `si'; added titling shapes; +changed the generated style +file to include an interface for the ornaments and to load Lehman's NFSS +extensions F if this is installed; corrected the `fontname' codes +for OT1, T1, LY1 and user-specific encodings; extended the output generated by +the B< --verbose> option; and rewrote and extended the documentation. + +=item I<2005-06-16> + +Did some more finetuning to the filename-parsing code. + +=item I<2005-05-31> + +Generate correct fontname for OT1-encoded fonts. + +=item I<2005-05-18> + +Tried to make the filename-parsing code a bit more robust by adding several +weights and widths; changed the error that's displayed when filename parsing +fails; commented the code. + +=item I<2005-04-29> + +Rewrote large parts of the code (yes it I even worse). + +=item I<2005-04-18> + +Changed default text-encoding to T1, added TS1. + +=item I<2005-03-29> + +Added support for font families with multiple widths. + +=item I<2005-03-15> + +First version. + +=back + +=end Really_old_history diff --git a/Build/source/texk/texlive/linked_scripts/fontools/cmap2enc b/Build/source/texk/texlive/linked_scripts/fontools/cmap2enc new file mode 100755 index 00000000000..4ba6842e179 --- /dev/null +++ b/Build/source/texk/texlive/linked_scripts/fontools/cmap2enc @@ -0,0 +1,5307 @@ +#!/usr/bin/perl + +=begin COPYRIGHT ------------------------------------------------------------ + + cmap2enc - convert glyph indices in a TrueType-flavored OpenType font to + Adobe glyph names + + Copyright (c) 2005, 2006 Marc Penninga. + + 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 + + Free Software Foundation, Inc., + 59 Temple Place, + Suite 330, + Boston, MA 02111-1307, + USA + +=end ------------------------------------------------------------------------ + +=cut + +use Getopt::Std; +use integer; +use warnings; no warnings qw(uninitialized); + +%friendly_name = ( + aalt => "Access All Alternates", + afrc => "Alternate Fractions", + alts => "Alternate Forms", + calt => "Contextual Alternates", + case => "Case-Sensitive Forms", + clig => "Contextual Ligatures", + cpsp => "Capital Spacing", + cswh => "Contextual Swash", + c2sc => "Small Capitals From Capitals", + dlig => "Discretionary Ligatures", + dnom => "Denominators", + expt => "Expert Forms", + fina => "Terminal Forms", + frac => "Fractions", + hist => "Historical Forms", + hlig => "Historical Ligatures", + init => "Initial Forms", + liga => "Standard Ligatures", + lnum => "Lining Figures", + numr => "Numerators", + onum => "Oldstyle Figures", + ordn => "Ordinals", + ornm => "Ornaments", + pnum => "Proportional Figures", + rlig => "Required Ligatures", + salt => "Stylistic Alternates", + sinf => "Scientific Inferiors", + smcp => "Small Caps", + subs => "Subscripts", + sups => "Superscripts", + swsh => "Swash", + titl => "Titling", + tnum => "Tabular Figures", + zero => "Slashed Zero", +); + +sub getu($) { + my $arg = shift; + my $n = length $arg; + my $r = 0; + + for my $i (0 .. $n - 1) { + $r = ($r << 8) + unpack("C", substr($arg, $i, 1)); + } + + return $r; +} + +sub getcov($) { + my $Coverage = shift; + my $CoverageFormat = getu(substr $Coverage, 0, 2); + my @r = (); + if ($CoverageFormat == 1) { + my $GlyphCount = getu(substr $Coverage, 2, 2); + for my $i (0 .. $GlyphCount - 1) { + push @r, getu(substr $Coverage, 4 + 2 * $i, 2); + } + } elsif ($CoverageFormat == 2) { + my $RangeCount = getu(substr $Coverage, 2, 2); + for my $i (0 .. $RangeCount - 1) { + my $RangeRecord = substr $Coverage, 4 + 6 * $i, 6; + my $Start = getu(substr $RangeRecord, 0, 2); + my $End = getu(substr $RangeRecord, 2, 2); + for my $j ($Start .. $End) { + push @r, $j; + } + } + } else { + warn "Warning: unknown CoverageFormat `$CoverageFormat'\n"; + } + return @r; +} + + +############################################################################## + + +getopts "f:l:ps:x:", \%options; +if ($options{f}) { + for (split ",", $options{f}) { + $feature_selected{$_} = 1; + } +} +$suffix = $feature_selected{ pnum } ? '-' : '-t'; +$suffix .= $feature_selected{ onum } ? 'osf' : 'lf'; +$suffix .= $feature_selected{ smcp } ? '-sc' : ''; +$suffix .= $feature_selected{ swsh } ? '-swash' : ''; +$suffix .= $feature_selected{ titl } ? '-titling' : ''; + +if ( $feature_selected{ sups } ) { $suffix = '-sup' } +if ( $feature_selected{ ornm } ) { $suffix = '-orn' } + +$options{s} ||= "latn"; +$options{l} ||= "DFLT"; + +$0 =~ s!.*/!!; +die "Usage: $0 [options] fontfile encfile\n" + unless ($options{p} and @ARGV == 1) or @ARGV == 2; + +chop(@glyph = ); +for (@glyph) { + next if /^\s*\#/; + /(.+);([\dA-Fa-f]{4})/ and $code{$1} = $2; +} + +if ((chop($fn = `kpsewhich $ARGV[0] 2>&1`) and -e $fn) or + (chop($fn = `findtexmf $ARGV[0] 2>&1`) and -e $fn)) +{ + open FONT, "<$fn" or die "Error: can't open `$fn' - $!\n"; +} else { + open FONT, "<$ARGV[0]" or + die "Error: can't open `$ARGV[0]' - $!\n"; +} +binmode FONT; +{ + local $/; + $font = ; +} + +$OffsetTable = substr $font, 0, 12; +$numTables = getu(substr $OffsetTable, 4, 2); + +$TableDirectory = substr $font, 12, 16 * $numTables; +for $i (0 .. $numTables - 1) { + $entry = substr $TableDirectory, 16 * $i, 16; + + $tag = substr $entry, 0, 4; + $offset{$tag} = getu(substr $entry, 8, 4); + $length{$tag} = getu(substr $entry, 12, 4); +} + +if (exists $offset{GSUB}) { + $GSUB = substr $font, $offset{GSUB}, $length{GSUB}; + $ScriptList = substr $GSUB, getu(substr $GSUB, 4, 2); + $FeatureList = substr $GSUB, getu(substr $GSUB, 6, 2); + $LookupList = substr $GSUB, getu(substr $GSUB, 8, 2); + + $LookupCount = getu(substr $LookupList, 0, 2); + undef @Lookup; + undef @LookupType; + for $i (0 .. $LookupCount - 1) { + $Lookup = substr $LookupList, getu(substr $LookupList, 2 + 2 * $i, 2); + $LookupType[$i] = getu(substr $Lookup, 0, 2); + next unless $LookupType[$i] == 1; + $SubTableCount = getu(substr $Lookup, 4, 2); + for $j (0 .. $SubTableCount - 1) { + $SubTable = substr $Lookup, getu(substr $Lookup, 6 + 2 * $j, 2); + $SubstFormat = getu(substr $SubTable, 0, 2); + if ($SubstFormat == 1) { + $Coverage = substr $SubTable, getu(substr $SubTable, 2, 2); + @Coverage = getcov($Coverage); + $DeltaGlyphID = getu(substr $SubTable, 4, 2); + for $k (0 .. $#Coverage) { + $Lookup[$i]{$Coverage[$k]} = $Coverage[$k] + $DeltaGlyphID; + } + } elsif ($SubstFormat == 2) { + $Coverage = substr $SubTable, getu(substr $SubTable, 2, 2); + @Coverage = getcov($Coverage); + $GlyphCount = getu(substr $SubTable, 4, 2); + if ($GlyphCount != scalar(@Coverage)) { + warn "Error: SingleSubstFormat2 subtable - " . + "GlyphCount wrong\n"; + next; + } + for $k (0 .. $#Coverage) { + $Lookup[$i]{$Coverage[$k]} = + getu(substr $SubTable, 6 + 2 * $k, 2); + } + } else { + warn "Error: unknown SingleSubstFormat `$SubstFormat'\n"; + next; + } + } + } + + undef @FeatureTag; + undef @FeatureLookupListIndex; + $FeatureCount = getu(substr $FeatureList, 0, 2); + for $i (0 .. $FeatureCount - 1) { + $FeatureRecord = substr $FeatureList, 2 + 6 * $i, 6; + $FeatureTag[$i] = substr $FeatureRecord, 0, 4; + $Feature = substr $FeatureList, getu(substr $FeatureRecord, 4, 2); + $LookupCount = getu(substr $Feature, 2, 2); + $feature_supported{$FeatureTag[$i]} = 1; + for $j (0 .. $LookupCount - 1) { + $FeatureLookupListIndex[$i][$j] = + getu(substr $Feature, 4 + 2 * $j, 2); + if ($LookupType[$FeatureLookupListIndex[$i][$j]] != 1) { + $feature_supported{$FeatureTag[$i]} = 0; + } + } + } + + undef %Script; + undef %FeatureIndex; + $ScriptCount = getu(substr $ScriptList, 0, 2); + for $i (0 .. $ScriptCount - 1) { + $ScriptRecord = substr $ScriptList, 2 + 6 * $i, 6; + $ScriptTag = substr $ScriptRecord, 0, 4; + $Script = substr $ScriptList, getu(substr $ScriptRecord, 4, 2); + if (substr($Script, 0, 2)) { + $LangSysTag = "DFLT"; + push @{$Script{$ScriptTag}}, $LangSysTag; + $LangSys = substr $Script, getu(substr $Script, 0, 2); + $FeatureCount = getu(substr $LangSys, 4, 2); + for $k (0 .. $FeatureCount - 1) { + push @{$FeatureIndex{$ScriptTag}{$LangSysTag}}, + getu(substr $LangSys, 6 + 2 * $k, 2); + } + } + $LangSysCount = getu(substr $Script, 2, 2); + for $j (0 .. $LangSysCount - 1) { + $LangSysRecord = substr $Script, 4 + 6 * $j, 6; + $LangSysTag = substr $LangSysRecord, 0, 4; + push @{$Script{$ScriptTag}}, $LangSysTag; + $LangSys = substr $Script, getu(substr $LangSysRecord, 4, 2); + $FeatureCount = getu(substr $LangSys, 4, 2); + for $k (0 .. $FeatureCount - 1) { + push @{$FeatureIndex{$ScriptTag}{$LangSysTag}}, + getu(substr $LangSys, 6 + 2 * $k, 2); + } + } + } +} + +if (exists $offset{GPOS}) { + $GPOS = substr $font, $offset{GPOS}, $length{GPOS}; + $FeatureList = substr $GPOS, getu(substr $GPOS, 6, 2); + $FeatureCount = getu(substr $FeatureList, 0, 2); + for $i (0 .. $FeatureCount - 1) { + $FeatureRecord = substr $FeatureList, 2 + 6 * $i, 6; + $FeatureTag = substr $FeatureRecord, 0, 4; + $feature_supported{$FeatureTag} = 0; + } +} + +if ($options{p}) { + if (exists $offset{name}) { + $name = substr $font, $offset{name}, $length{name}; + $count = getu(substr $name, 2, 2); + $stringOffset = getu(substr $name, 4, 2); + for $i (0 .. $count - 1) { + $nameRecord = substr $name, 6 + 12 * $i, 12; + $platformID = getu(substr $nameRecord, 0, 2); + $encodingID = getu(substr $nameRecord, 2, 2); + $languageID = getu(substr $nameRecord, 4, 2); + $nameID = getu(substr $nameRecord, 6, 2); + $length = getu(substr $nameRecord, 8, 2); + $offset = getu(substr $nameRecord, 10, 2); + $string = substr $name, $stringOffset + $offset, $length; + $string{"$platformID,$encodingID,$languageID,$nameID"} = $string; + } + print "\n", "-" x 80, "\n\n"; + for $i ((6,10,0)) { + if (exists $string{"0,3,0,$i"}) { + print $string{"0,3,0,$i"}, "\n\n"; + } elsif (exists $string{"0,4,0,$i"}) { + print $string{"0,4,0,$i"}, "\n\n"; + } elsif (exists $string{"3,1,1033,$i"}) { + print $string{"3,1,1033,$i"}, "\n\n"; + } elsif (exists $string{"3,10,1033,$i"}) { + print $string{"3,10,1033,$i"}, "\n\n"; + } + } + print "-" x 80, "\n\n"; + } + print "SCRIPT\tLANG\tFEATURES\n\n"; + for $script (keys %Script) { + print "$script"; + for $lang (@{$Script{$script}}) { + print "\t$lang\t"; + for (sort {$a <=> $b} @{$FeatureIndex{$script}{$lang}}) { + print "$FeatureTag[$_]", + exists $friendly_name{$FeatureTag[$_]} + ? " - $friendly_name{$FeatureTag[$_]}" + : " - Unknown Feature", + $feature_supported{$FeatureTag[$_]} + ? "" + : " (not supported by $0)", + "\n\t\t"; + } + print "\n"; + } + } + print "-" x 80, "\n\n"; +} + +undef @subst; +for $i (0 .. 0xFFFF) { + $subst[$i] = $i; +} + +undef %lookup_selected; +for $feature (sort {$a <=> $b} @{$FeatureIndex{$options{s}}{$options{l}}}) { + if (!$feature_selected{$FeatureTag[$feature]}) { + next; + } + if (!$feature_supported{$FeatureTag[$feature]}) { + warn "Warning: feature `$FeatureTag[$feature]' not supported\n"; + next; + } + for (@{$FeatureLookupListIndex[$feature]}) { + $lookup_selected{$_} = 1; + } +} +for $lookup (sort {$a <=> $b} keys %lookup_selected) { + for (sort {$a <=> $b} keys %{$Lookup[$lookup]}) { + $subst[$_] = $Lookup[$lookup]{$_}; + } +} + +if ($options{x}) { + open SUB, "<$options{x}" + or warn "Warning: can't open `$options{x}' - $!\n\tfile skipped\n"; + for () { + if (/^\s*\#/) { + next; + } elsif (/([0-9A-Fa-f]{4});([0-9A-Fa-f]{4})/) { + $subst[hex($1)] = hex($2); + $subst[hex($2)] = hex($2); + } elsif (/(\w+);([0-9A-Fa-f]{4})/) { + $glyphName{$1} ||= sprintf + hex($2) < 256 ? "index0x%02X" : "index0x%04X", hex $2; + delete $code{$1}; + $subst[hex($2)] = hex($2); + } + } +} + +$cmap = substr $font, $offset{cmap}, $length{cmap}; +$numTables = getu(substr $cmap, 2, 2); + +for $i (0 .. $numTables - 1) { + $EncodingRecord = substr $cmap, 4 + $i * 8, 8; + $platformID = getu(substr $EncodingRecord, 0, 2); + $encodingID = getu(substr $EncodingRecord, 2, 2); + $offset = getu(substr $EncodingRecord, 4, 4); + $format = getu(substr $cmap, $offset, 2); + $length = getu(substr $cmap, $offset + 2, 2); + $subtable = substr $cmap, $offset, $length; + + next unless ($platformID == 0 and ($encodingID == 3 or $encodingID == 4)) + or ($platformID == 3 and ($encodingID == 1 or $encodingID == 10)); + + if ($format == 4) { + $segCountX2 = getu(substr $subtable, 6, 2); + $segCount = $segCountX2 / 2; + + $endCount = substr $subtable, 14, $segCountX2; + $startCount = substr $subtable, 16 + $segCountX2, $segCountX2; + $idDelta = substr $subtable, 16 + 2 * $segCountX2, $segCountX2; + $idRangeOffset = substr $subtable, 16 + 3 * $segCountX2, $segCountX2; + + for $j (0 .. $segCount - 1) { + $endCount[$j] = getu(substr $endCount, 2 * $j, 2); + $startCount[$j] = getu(substr $startCount, 2 * $j, 2); + $idDelta[$j] = getu(substr $idDelta, 2 * $j, 2); + $idRangeOffset[$j] = getu(substr $idRangeOffset, 2 * $j, 2); + + next if $startCount[$j] == 0xFFFF; + + for $characterCode ($startCount[$j] .. $endCount[$j]) { + if ($idRangeOffset[$j] != 0) { + $ptr = $idRangeOffset[$j] / 2 + + $characterCode - $startCount[$j] + + 8 + 3 * $segCount + + $j; + $tmp = getu(substr $subtable, 2 * $ptr, 2); + if ($tmp) { + $glyphIndex = ($tmp + $idDelta[$j]) % 65536; + } else { + $glyphIndex = 0; + } + } else { + $glyphIndex = ($characterCode + $idDelta[$j]) % 65536; + } + $glyphIndex = $subst[$glyphIndex]; + $uni = sprintf "%04X", $characterCode; + $glyphName{$uni} ||= sprintf + $glyphIndex < 256 ? "index0x%02X" : "index0x%04X", + $glyphIndex; + } + } + last; + } else { + warn "Warning: unsupported format `$format'\n"; + } +} +if (!keys %glyphName) { + die "Error: no supported platformID/encodingID found in `cmap' table\n"; +} + +if (!$options{p}) { + if ((chop($fn = `kpsewhich $ARGV[1] 2>&1`) and -e $fn) or + (chop($fn = `findtexmf $ARGV[1] 2>&1`) and -e $fn)) + { + open ENC, "<$fn" or die "Error: can't open `$fn' - $!\n"; + } else { + open ENC, "<$ARGV[1]" or die "Error: can't open `$ARGV[1]' - $!\n"; + } + chop(@lines = ); + map s/%.+//, @lines; + $_ = join "", @lines; + ($name, $_) = /\/([\w-]+)\s*\[(.*)\]\s*def/; + @vector = /([\w.]+)/g; + + $ARGV[0] =~ /(.+)\.(?:ttf|otf)/ and $fontname = $1; + $ARGV[1] =~ /(.+)\.enc/ and $encname = $1; + open ENC, ">${encname}${suffix}-${fontname}.enc" or die + "Error: can't open `${encname}${suffix}-${fontname}.enc' - $!\n"; + print ENC "/${name}${suffix}-${fontname} [\n"; + for ($i = 0; $i < 256; $i += 16) { + printf ENC "%% 0x%04x\n", $i; + for ($j = 0; $j < 16; $j += 4) { + for $k (0 .. 3) { + print ENC " /", + $glyphName{$code{$vector[$i + $j + $k]}} || + $glyphName{$vector[$i + $j + $k]} || + $vector[$i + $j + $k]; + } + print ENC "\n"; + } + } + print ENC "] def\n"; + + open MTX, ">reset${fontname}-${encname}${suffix}.mtx" + or die "Error: can't open " . + "'reset${fontname}-${encname}${suffix}.mtx' - $!\n"; + print MTX < I + + +=head1 DESCRIPTION + +Many TrueType-flavored OpenType fonts contain no glyph names. +When creating an F file with F, this causes all glyphs to be +named something +like C, which makes the F file almost useless for use with +F or F. + +B uses the font's `cmap' table to map glyph indices to +Unicode values, and Adobe's F file to map these to glyph names. + +B creates a new encoding file (for downloading with the font file) +and a F file (for use with F). The encoding file contains the +same glyphs as the original one, but has all glyph names replaced with +the corresponding glyph indices; the F file maps these glyph indices back +to the original glyph names (it consists of many commands of the form +C<\renameGlyph{index0x01E7}{Euro}>, plus a definition of that +C<\renameGlyph> command). + +Some of the glyph substitution features of OpenType fonts are supported; +e.g. when the `smcp' (Small Caps) feature is specified, the glyph names +of the lowercase glyphs will be mapped to the glyph indices of the +small capitals. + +A list of features supported by the font can be generated using the B<-p> +option, see below. + + +=head1 EXAMPLES + +NOTE: the F subdirectory in the I distribution contains +several complete examples of the use of B and other tools from +the I collection. + +=over 2 + +=item B<-> + +To display all scripts, languages and features supported by Linotype Palatino: + + cmap2enc -p pala.ttf + + +=item B<-> + +To install Linotype Palatino in T1 encoding, with oldstyle figures: + +=over 3 + +=item B<1.> + +Generate an encoding file F and a metrics file +F: + + cmap2enc -f onum pala.ttf t1.enc + + +=item B<2.> + +Create an F file for the font; this is done best using I +(also in the I collection): + + font2afm pala.ttf + + +=item B<3.> + +Reencode the F file using the F encoding to create +a `raw' font I, with either I (also in the I +collection) or I (but be warned that I might take a long +time, and can even crash if the F is really big): + + afm2afm -e t1-tosf-pala.enc -o rlplrj9d.afm pala.afm + +or + + \transformfont{rlplrj9d}{\reencodefont{t1-tosf-pala}{\fromafm{pala}}} + + +=item B<4.> + +Create a `value-added' F file from this raw font by adding +ligatures, faking missing glyphs etc. with I: + + \installfont{lplrj9d}{rlplrj9d,resetpala-t1-tosf,newlatin} + {t1}{T1}{lplj}{m}{n}{} + + +=back + +=back + + +=head1 OPTIONS + +B supports the following command-line options: + +=over 4 + +=item B<-p> + +Print some info about the font, plus a list of all scripts, languages and +features contained in this font's GSUB table; then exit. (When using +this option, the I need not be specified.) + +=item B<-f> I[,I]* + +Use the specified features when matching glyph indices to glyph names. +Multiple features can be specified as a comma-separated list, +B spaces between the items. + +=item B<-x> I + +Use the user-specified substitutions from I (see below). + +=item B<-l> I + +Select the specified language. The default is `DFLT' (surprise!). + +=item B<-s> I