#!/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 dvips.
#
# Parameters:
# name dpi bdpi magnification [mode [destdir]]
#
# `name' is the base name of the font, such as `cmr10'.
# `dpi' is the resolution the font is needed at.
# `bdpi' is the base resolution, used to intuit the mode to use.
# `magnification' is a string to pass to MF as the value of `mag'.
# `mode', if supplied, is the mode to use. Unless it's `default', in
# which case we guess. (This is so people can specify a destdir
# without a mode.)
# `destdir', if supplied, is either the absolute directory name to use
# (if it starts with a /) or relative to the default DESTDIR (if not).
# 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.)
# Define to `gsftopk' or `ps2pk' or whatever to make PK files for
# PostScript fonts. If this is defined, PSMAPFILE must also be defined to
# be your psfonts.map file or some equivalent.
ps_to_pk=$GSFTOPK
PSMAPFILE=`$KPSEWHICH dvips_config psfonts.map 2>&-`
# 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: pk 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}/mtpk.$$"
ls_R="$TEXMF/ls-R"
DIR_PERMS=755
#DIR_PERMS=1777
FILE_PERMS=444
if test $# -lt 4 ; then
echo "Usage: $progname name dpi bdpi mag [mode [destdir]]." >&2
exit 1
fi
NAME=$1
DPI=$2
BDPI=$3
MAG=$4
MODE=$5
# DESTDIR is harder.
case "$6" 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/pk"
# Finally, update the parent of the installation directory.
DESTROOT="$DESTROOT/$namepart"
;;
/*) DESTDIR="$6" ;; # Absolute, explicit destdir => use it.
*) DESTDIR="$DESTROOT/$6" ;; # Relative destdir => append to the default.
esac
GFNAME="$NAME.${DPI}gf"
PKNAME="$NAME.${DPI}pk"
# Clean up on normal or abnormal exit. DESTDIR changes, hence the eval.
trap "cd / ; eval $RM -r $TEMPDIR \$DESTDIR/pktmp.$$" 0 1 2 15
# 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.
MODE=`basename $ps_to_pk`
case "$ps_to_pk" in
ps2pk*) special_part=`cat psline | sed -e 's/^.*"//' -e 's/".*$//'`
# .167 SlantFont
slant=`echo $special_part \
| $AWK '{ if ($2 == SlantFont) print "-S" $1 }'`
extend=`echo $special_part \
| $AWK '{ if ($2 == ExtendFont) print "-E" $1 }'`
cmd="$ps_to_pk -v -X$DPI $slant $extend $NAME" ;;
*) cmd="$ps_to_pk $NAME $DPI" ;;
esac
# Update DESTDIR for new mode, and check if we were spuriously called.
test -z "$6" && DESTDIR="$DESTROOT/$MODE"
if test -r "$DESTDIR/$PKNAME" ; then # sigh, this is repeated below
echo "$progname: $DESTDIR/$PKNAME already exists." >&2
append_db "$DESTDIR $PKNAME"
echo "$DESTDIR/$PKNAME"
exit 0
fi
else
# If an explicit mode is not supplied, try to guess. You can get a
# list of extant modes from ftp.cs.umb.edu:pub/tex/modes.mf.
if test -z "$MODE" || test "$MODE" = default ; then
case "$BDPI" in
85) MODE=sun ;;
300) MODE=cx ;;
400) MODE=nexthi ;;
600) MODE=ljfour ;;
1270) MODE=linolo ;;
*) echo "$progname: Can't guess mode for $BDPI dpi devices." >&2
echo "$progname: Use a config file, or update me." >&2
exit 1
esac
fi
# If no destination directory specified, install font in directory
# named for the mode.
test -z "$6" && DESTDIR="$DESTROOT/$MODE"
if test -r $DESTDIR/$PKNAME ; then # sigh, this is repeated above
echo "$progname: $DESTDIR/$PKNAME already exists." >&2
echo "$DESTDIR/$PKNAME"
$APPENDDB "$DESTDIR" "$PKNAME"
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" </dev/null >&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 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" </dev/null >&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 ; }
# Install the PK file carefully, since others may be working simultaneously.
$MV "$PKNAME" "$DESTDIR/pktmp.$$" \
|| { echo "$progname: Could not mv $PKNAME $DESTDIR/pktmp.$$." >&2 ; exit 1 ; }
# 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/$PKNAME
$APPENDDB "$DESTDIR" "$PKNAME"
exit 0