#!/bin/sh # This script must echo the name of the generated PK file (and nothing # else) to standard output. Yes, this is different from the original MakeTeXPK # # Parameters: # name [destdir] # # `name' is the base name of the font, such as `cmr10'. # `destdir' is the name of the destination directory. # setup section TOOLS="/usr/local/tex/kpsetools-0.2/bin" SCRIPTS="/usr/local/tex/scripts-0.2/bin" KPSEXPAND="$TOOLS/kpsexpand" APPENDDB="$SCRIPTS/append_db" MF="/usr/local/bin/mf" GSFTOPK="/usr/local/bin/gsftopk" GFK="/usr/local/bin/gftopk" AWK="/usr/bin/awk" EGREP="/usr/bin/egrep" RM="/bin/rm -f" MV="/bin/mv -f" MD="/bin/mkdir" CHM="/bin/chmod" # if we are going to install resulting pk, then let us use # a reasonable mode on this installation DPI=400 MAG=1 MODE=nexthi # The root of where to put the new file. (Using the sh construct # ${var=value} is the tersest construct that lets an environment # variable `var' override the value given here.) progname=`basename $0` TEXMF=`$KPSEXPAND '$TEXMF'` DESTROOT=${MTPK_DESTROOT-"$TEXMF/fonts"} # Location of the files that map font name parts to directory names. NAMEMAPDIR="$TEXMF/fontmaps" # If this directory doesn't exist, the DC fonts won't be attempted. dcfontdir="$TEXMF/fonts/public/dc" # If this directory doesn't exist, the Sauter stuff won't be attempted. sauterdir="$TEXMF/fonts/public/sauter" # If the true typeface directory cannot be determined from the fontname, # the files are installed here, relative to $DESTROOT. # TE: change: tfm will be appended later default_namepart=tmp # TEMPDIR needs to be unique for each process because of the possibility # of simultaneous processes running this script. TEMPDIR=${TMPDIR-/tmp}/mttfm.$$ NAME=`basename $1 .tfm` DIR_PERMS=755 FILE_PERMS=444 if test $# -lt 1 ; then echo "Usage: $progname name [destdir]." >&2 exit 1 fi # DESTDIR is harder. case "$2" in "") # Nothing specified, so try to intuit the directory from the # fontname. First the special cases: either $NAME matches an entire # name in special.map, or it matches the abbreviation in # special.map and ends with a numeral (for the pointsize). # We (painfully) use only the minimal features in original awk. if test -r $NAMEMAPDIR/special.map ; then namepart=`$AWK \ '{if ($1 == NAME || (substr (NAME, 1, length ($1)) == $1 \ && substr (NAME, length (NAME), 1) ~ /[0-9]/)) \ { print $2 "/" $3; exit; }}' NAME=$NAME $NAMEMAPDIR/special.map` if test -z "$namepart" ; then # Try the normal case. Source first. s_abbrev=`echo $NAME | cut -c 1-1` sourcedir=`$AWK '{ if ($1 == s_abbrev) { print $2 ; exit ; }}' \ s_abbrev=$s_abbrev $NAMEMAPDIR/source.map` if test -n "$sourcedir" ; then # We found the source. Try for the typeface. t_abbrev=`echo $NAME | cut -c 2-3` typefacedir=`$AWK '{ if ($1 == t_abbrev) { print $2; exit; }}' \ t_abbrev=$t_abbrev $NAMEMAPDIR/typeface.map` if test -n "$typefacedir" ; then # Found everything. namepart=$sourcedir/$typefacedir else echo "$progname: Could not map typeface abbreviation $t_abbrev." >&2 fi else echo "$progname: Could not map source abbreviation $s_abbrev." >&2 fi fi else # No map files. : fi # If we failed for whatever reason, default to a generic subdir. test -z "$namepart" && namepart=$default_namepart namepart=$namepart/tfm # Finally, update the parent of the installation directory. DESTDIR="$DESTROOT/$namepart" ;; /*) DESTDIR=$2 ;; # Absolute, explicit destdir => use it. *) DESTDIR=$DESTROOT/$2 ;; # Relative destdir => append to the default. esac PK_DESTDIR=`echo $DESTDIR | sed s@/tfm\$\@/pk/${MODE}@` GFNAME=$NAME.$DPI'gf' PKNAME=$NAME.$DPI'pk' TFMNAME=$NAME.tfm # Clean up on normal or abnormal exit. DESTDIR changes, hence the eval. trap "cd / ; eval $RM -r $TEMPDIR $DESTDIR/pktmp.$$" 0 1 2 15 # Remember where we were for the paths. We'd most like to replace `.', # wherever it is in the path, with $PWD, but we don't have access to the # compile-time path. So we are conservative, and put this at the end. MFINPUTS="$MFINPUTS:$PWD" export MFINPUTS # Go to the unique working directory. test -d $TEMPDIR || $MD $TEMPDIR cd $TEMPDIR || exit 1 # grep for the font in $PSMAPFILE, if some ps-to-pk is claimed to be supported. test -n "$ps_to_pk" && $EGREP \^$NAME'([ ]|$)' $PSMAPFILE >psline if test -s psline ; then # This is a PostScript font. echo "$progname: Sorry. No support for PostScript fonts here." >&2 exit else if test -r $DESTDIR/$TFMNAME ; then # sigh, this is repeated above echo "$progname: $DESTDIR/$TFMNAME already exists." >&2 echo $DESTDIR/$TFMNAME $APPENDDB $DESTDIR $TFMNAME exit 0 fi # Run Metafont. Always use plain Metafont, since reading cmbase.mf # does not noticeably slow things down. Separate the filename from the # rest, since we have to use ./$NAME if we generate something. cmd="$MF \mode:=$MODE; mag:=$MAG; scrollmode; input" echo "$progname: Running $cmd $NAME" >&2 if $cmd $NAME &2 ; then : # Success already. else # These other cases should really be part of MakeTeXMF. # First have to figure out the real magnification, which means # extracting the point size from the name -- a trailing number. rootname=`echo $NAME | sed 's/[0-9]*$//'` pointsize=`echo $NAME | sed "s/^$rootname//"` case "$pointsize" in 11) realsize=10.95444 ;; # \magstephalf 14) realsize=14.4 ;; # \magstep2 17) realsize=17.28 ;; # \magstep3 20) realsize=20.74 ;; # \magstep4 25) realsize=24.88 ;; # \magstep5 *) realsize=$pointsize ;; esac mfname=$NAME.mf $RM $mfname # We are in $TEMPDIR, so this is safe. if test -z "$pointsize" ; then # No point size, so it can't be a DC or Sauter font. Give up. : elif echo $NAME | $GREP '^dc' >/dev/null ; then echo "$progname: Trying DC font." >&2 echo "if unknown dxbase: input dxbase fi;" >$mfname echo "gensize:=$realsize;" >>$mfname echo "generate $rootname;" >>$mfname echo "$progname: Running $cmd ./$NAME" >&2 $cmd ./$mfname &2 elif test -d $sauterdir ; then echo "$progname: Trying interpolated/extrapolated (Sauter) font." >&2 echo "design_size:=$realsize;" >>$mfname echo "input b-$rootname;" >>$mfname echo "$progname: Running $cmd ./$NAME" >&2 $cmd ./$mfname &2 # Result should go in the sauterdir, not the cm dir. test -z "$6" && $DESTDIR=$sauterdir/pk/$MODE fi # alternative mf sources fi # first mf failed # If we couldn't make the font, quit. test -r $GFNAME || \ { echo "$progname: Metafont failed to make $GFNAME." >&2 ; exit 1 ; } # Success. Make the PK file. $GFK ./$GFNAME $PKNAME || exit 1 fi # If we get here, we've succeeded; move the final font to $DESTDIR. test -d $DESTDIR \ || ($MD $DESTDIR && $CHM $DIR_PERMS $DESTDIR) \ || { echo "$progname: Could not mkdir $DESTDIR." >&2 ; exit 1 ; } test -d $PK_DESTDIR \ || ($MD $PK_DESTDIR && $CHM $DIR_PERMS $PK_DESTDIR) \ || { echo "$progname: Could not mkdir $PK_DESTDIR." >&2 ; exit 1 ; } # Install the PK file carefully, since others may be working simultaneously. $MV $TFMNAME $DESTDIR/tfmtmp.$$ \ || { echo "$progname: Could not mv $TFMNAME $DESTDIR/tfmtmp.$$." >&2 ; exit 1 ; } # Install the PK file carefully, since others may be working simultaneously. if [ ! -f $PK_DESTDIR/$PKNAME ] ; then $MV $PKNAME $PK_DESTDIR/pktmp.$$ \ || { echo "$progname: Could not mv $PKNAME $PK_DESTDIR/pktmp.$$." >&2 ; exit 1 ; } cd $PK_DESTDIR || exit 1 $MV pktmp.$$ $PKNAME $CHM $FILE_PERMS $PKNAME $APPENDDB $DESTDIR $PKNAME fi cd $DESTDIR || exit 1 $MV tfmtmp.$$ $TFMNAME $CHM $FILE_PERMS $TFMNAME # If this line (or an equivalent) is not present, dvipsk/xdvik/dviljk # will think MakeTeXPK failed. Any other output to stdout will also lose. echo $DESTDIR/$TFMNAME $APPENDDB $DESTDIR $TFMNAME exit 0