#!/usr/local/bin/perl
#
# MakeTeXTFM.pl version 1.0, Copyright (C) 1993,94 by Norman Walsh.
# NO WARRANTY. Distribute freely under the GNU GPL.
#
# This script attempts to make a new TeX TFM file, because one wasn't
# found. The only argument is the name of the TFM file, such as
# `cmr10.tfm' (*NOT* just `cmr10').
#
# This script was designed with two goals in mind: to support recursive
# subdirectory searching for fonts and to provide support for PK files
# built from both MF fonts and PS fonts. It also supports the Sauter
# and DC fonts which can be built at any design size.
#
# This script was designed and tested with the following directory structure
# in mind: each typeface is stored in its own directory with appropriate
# subdirectories for font sources, metrics, and glyphs. The script may not
# work exactly right if you use a different directory structure (the font
# installation, in particular, will probably be incorrect). However,
# several other versions of MakeTeXPK exist which will handle simpler
# directory structures, so you need not feel compelled to use the one
# described here.
#
# For MF fonts: (... is usually something like /usr/local/lib/tex/fonts)
#
# .../typeface/src holds the sources
# /tfm holds the TFM files
# /glyphs root for glyphs
# /glyphs/mode holds the PK files for "mode".
#
# For PS fonts: (... is usually something like /usr/local/lib/tex/fonts)
#
# .../typeface/afm holds the AFM files
# /tfm holds the TFM files
# /vf holds the VF files
# /vpl holds the VPL files
# /glyphs root for glyphs
# /glyphs/pk/999dpi holds the PK files at 999 dpi created by ps2pk
# /glpyhs/type1 holds the type1 PFA/PFB sources for the fonts
#
# The TFM files constructed for PostScript fonts are mapped to the Old TeX
# encoding.
#
require "getopts.pl";
$rc = &Getopts ('v'); # Get options from the user...
chop($CWD = `pwd`); # Where are we?
$TEMPDIR = "/tmp/mkPK.$$"; # Where do temp files go?
$MFBASE = "&plain"; # What MF base do we use by default?
# Where are fonts stored?
$TEXFONTS = $ENV{"TEXFONTS"} || ".:/usr/local/lib/fonts//";
# Define modes that should be used for base resolutions...
$DPI_MODES{300} = "laserwriter";
$DPI_MODES{200} = "FAX";
$DPI_MODES{360} = "lqhires";
$DPI_MODES{400} = "nexthi";
$DPI_MODES{600} = "QMSmoa";
$DPI_MODES{100} = "nextscreen";
# Where are the DC fonts stored and what base names can be used?
$DCR_DIR = '/usr/local/lib/fonts/free/dc/src';
@DCR_GEN = ('dcb','dcbom','dcbx','dcbxsl','dcbxti','dccsc','dcdunh','dcff',
'dcfi','dcfib','dcitt','dcr','dcsl','dcsltt','dcss','dcssbx',
'dcssi','dctcsc','dcti','dctt','dcu','dcvtt' );
# Where are the Sauter fonts stored and what base names can be used?
$SAUTER_DIR = '/usr/local/lib/fonts/free/sauter/src';
@SAUTER_GEN = ('cmb','cmbizx','cmbozx','cmbsy','cmbszx','cmbx','cmbxsl',
'cmbxti', 'cmbz', 'cmbzx', 'cmcsc', 'cmdszc', 'cmdunh',
'cmex', 'cmff', 'cmfi', 'cmfib', 'cminch', 'cmitt', 'cmmi',
'cmmib', 'cmr', 'cmrcz', 'cmrisz', 'cmritz', 'cmriz',
'cmrotz', 'cmroz', 'cmrsz', 'cmrtz', 'cmruz', 'cmrz',
'cmsl', 'cmsltt', 'cmss', 'cmssbx', 'cmssdc', 'cmssi',
'cmssq', 'cmssqi', 'cmsy', 'cmtcsc', 'cmtex', 'cmti',
'cmtt', 'cmu', 'cmvtt', 'czinch', 'czssq', 'czssqi',
'lasy', 'lasyb');
open (TTY, ">/dev/tty");
select (TTY); $| = 1; select(STDOUT);
$tfmFile = @ARGV[0];
if (!$tfmFile) {
print TTY "$0 error: No TFM file specified.\n";
die "\n";
}
print TTY "\nAttempting to build TFM file: $tfmFile.\n";
# This is the *wierdest* bug I've ever seen. When this script is called
# by virtex to build a TFM file, the argument (as interpreted by Perl)
# has (at least one) ASCII 16 attached to the end of the argument. This
# loop removes all control characters from the $tfmFile name string...
$tfmFile =~ /(.)$/;
$char = ord ($1);
while ($char <= 32) {
$tfmFile = $`;
$tfmFile =~ /(.)$/;
$char = ord ($1);
}
# Now we know the name of the TFM file. Next, get the name of the MF file
# and the base name and size of the MF file.
open (SAVEOUT, ">&STDOUT");
open (SAVEERR, ">&STDERR");
close (STDOUT);
open (STDOUT, ">&TTY");
close (STDERR);
open (STDERR, ">&TTY");
# Chdir seems to return a funny exit code. So do it internally...
# (this is a hack)
if (@cmd[0] eq "chdir") {
$rc = chdir(@cmd[1]);
$rc = !$rc;
} else {
$rc = system(@cmd);
}
close (STDOUT);
open (STDOUT, ">&SAVEOUT");
close (SAVEOUT);
close (STDERR);
open (STDERR, ">&SAVEERR");
close (SAVEERR);
if ($rc) {
printf TTY "%s\n", "*" x 72;
print TTY "MakeTeXTFM error : system return code: $rc\n";
print TTY "MakeTeXTFM failed: @cmd\n";
printf TTY "%s\n", "*" x 72;
}
$rc;
}
sub make_and_cd_tempdir {
&run ("mkdir", "$TEMPDIR");
&run ("chdir", "$TEMPDIR");
}
# Note: this perl script has to scan them all, the mask is meaningless.
# Especially since I'm looking for the font *source* not the TFM or
# PK file...