#!/bin/sh
#
# hfoldsty v1.11: A package for using oldstyle numerals with the ec fonts with
#                 better kerning for quillemets
#
# For use with ec fonts (European Computer Modern fonts by J"org Knappen
# <knappen@vkpmzd.kph.uni-mainz.de>, CTAN:/fonts/ec)
#
# Much code is taken from the eco fonts by
# Sebastian Marius Kirsch <skirsch@t-online.de>
#
#Copyright (C) 2003--2004  Harald Harders <h.harders@tu-bs.de>
#
#This program is free software; you can redistribute it and/or modify
#it under the terms of the GNU General Public License as published by
#the Free Software Foundation; either version 2 of the License, or
#(at your option) any later version.
#
#This program is distributed in the hope that it will be useful,
#but WITHOUT ANY WARRANTY; without even the implied warranty of
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#GNU General Public License for more details.
#
#You should have received a copy of the GNU General Public License
#along with this program; if not, write to the Free Software
#Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#
#This Bourne shell script requires the following programs:
# - tftopl, vptovf
# - ed, sed
# - TeX, fontinst >= 1.926
# - a shell which supports here-documents (i.e. bash)
# - a TeX with kpathsea (i.e. teTeX) 
#
# Change v1.13, 2004/11/19: More errors in \ProvidesFile line fixed.
#
# Change v1.12, 2004/09/12: Error in \ProvidesFile line fixed.
#
# Change v1.11, 2004/08/21: Installation is done by Makefile instead of this
#                           script.
#
# Change v1.11, 2004/08/21: Adapt to fix-cm.sty
#
# Change v1.01: Unique Copyright for all files: GPL
#
# Change v1.00: Add kerning to sans-serif fonts, 70% of serif fonts.
#
# Change v0.90: Rename package from hfo to hfoldsty.
#
# Change v0.20: Do not set \hyphenchar to '177. For character produting, the
#               pdfcprot package should be used.

VERSION=1.13
DATE=2004/09/12

size="0500 0600 0700 0800 0900 1000 1095 1200 1440 1728 2074 2488 2986 3583"
# Change v0.2: Use lining figures with small capitals.
# Change v0.4: Use old-style figures with small capitals again.
family="rm ti ui sl rb bx bl bi ss si sx so tt st it vt vi dh cc xc sc oc tc"
#family="rm ti ui sl rb bx bl bi ss si sx so tt st it vt vi dh"

kpsewhich=kpsewhich

logfile=./hfofonts.log

# Change v0.2: Use lining figures with small capitals.
# Change v0.4: Use old-style figures with small capitals again.
rofamily="rm ti ui sl rb bx bl bi cc xc sc oc"
#rofamily="rm ti ui sl rb bx bl bi"
#rfamily="m/sc bx/sc"

# Change v0.2: Use lining figures with small capitals.
# Change v0.4: Use old-style figures with small capitals again.
ttofamily="tt st it tc"
#ttofamily="tt st it"
#ttfamily="m/sc"

ssofamily="ss si sx so"

vtofamily="vt vi"

dhofamily="dh"


function getpl () {
curfam=$1

echo "# Converting .tfm to .pl" >> $logfile

for f in ${curfam}; do 
    for s in ${size}; do 
 	if [ -z `${kpsewhich} tfm ec${f}${s}.tfm` ] ; then 
 	   echo "Making ec${f}${s}.tfm" >> ${logfile}
	   echo -n "ec${f}${s}.tfm "
	   mktextfm ec${f}${s}
	fi
 	if [ `${kpsewhich} tfm ec${f}${s}.tfm` ] ; then 
 	   tftopl `${kpsewhich} tfm ec${f}${s}.tfm` ./ec${f}${s}.pl &>/dev/null;
 	   echo "ec${f}${s}.tfm -> ec${f}${s}.pl" >> ${logfile}
	   echo -n "ec${f}${s}.pl "
 	else
 	   echo "! tfm file ec${f}${s}.tfm not found." >> ${logfile} 
	   echo "! ec${f}${s}.tfm not found."
 	fi
 	if [ -z `${kpsewhich} tfm tc${f}${s}.tfm` ] ; then 
 	   echo "Making tc${f}${s}.tfm" >> ${logfile}
	   echo -n "tc${f}${s}.tfm "
	   mktextfm tc${f}${s}
	fi
 	if [ `${kpsewhich} tfm tc${f}${s}.tfm` ] ; then 
 	   tftopl `${kpsewhich} tfm tc${f}${s}.tfm` ./tc${f}${s}.pl &> /dev/null;
 	   echo "tc${f}${s}.tfm -> tc${f}${s}.pl" >> ${logfile}
	   echo -n "tc${f}${s}.pl "
 	else
 	   echo "! tfm file tc${f}${s}.tfm not found" >> ${logfile}
	   echo "! tc${f}${s}.tfm not found."
 	fi
    done
done

echo
}

function getvf () {
curfam=$1

echo "# Converting .vpl to .vf and .tfm" >> $logfile

for f in $curfam; do 
    for s in $size; do 
	if [ -f	hfo${f}${s}.vpl ]; then 
	   vptovf hfo${f}${s}.vpl hfo${f}${s}.vf hfo${f}${s}.tfm &> /dev/null; 
	   echo "hfo${f}${s}.vpl -> hfo${f}${s}.vf" >> ${logfile}
	   echo -n "hfo${f}${s}.vf "
	else
	   echo "vpl file hfo${f}${s}.vpl not found" >> ${logfile}
	   echo "! hfo${f}${s}.vpl not found."
	fi
    done
done

echo
}

function cleanup () {
curfam=$1

for f in $curfam; do 
    for s in $size; do 
	rm -f hfo${f}${s}.vpl ec${f}${s}.pl ec${f}${s}.mtx tc${f}${s}.pl tc${f}${s}.mtx
    done
done
}

function intro () {
cat << EOM
\input fontinst.sty

\declareencoding{TEX TEXT COMPANION SYMBOLS 1---TS1}{TS1}

\installfonts
EOM
}

function extro () {
cat << EOM
\endinstallfonts

\bye
EOM
}

function echomtx () {
f=$1

echo
for ec in ${size}; do
    if [ -f ec${f}${ec}.pl ]; then
	echo "\frompl{ec${f}${ec}}"
    fi
    if [ -f tc${f}${ec}.pl ]; then
	echo "\frompl{tc${f}${ec}}"
    fi
done;
}

# Inserts kerning information to the mtx file
function insertkerns ()
{
    f=$1
# Change v1.00: Scale Kerning by $FAK/1000
    FAK=$2

    for ec in ${size}
    do

	MULTI=`grep '\quad' ec${f}${ec}.mtx | sed s/'.*{\([0-9]*\)}'/'\1'/`
	echo ec${f}${ec}: multiplikator $MULTI

	GKERN="0110"
	GKERN=`echo "$GKERN $MULTI * 1000 / p" | dc`
	KKERN="0070"
	KKERN=`echo "$KKERN $MULTI * 1000 / p" | dc`

	LISTE="%"
	for CHAR in A B C D E F G H I J K L M N O P Q R S T U V W X Y Z \
	    Adieresis Odieresis Udieresis
	do
	    RKERN=$GKERN
	    LKERN=$GKERN
	    case $CHAR in
		A) LKERN=`echo "$LKERN 1200 * 1000 / $FAK * 1000 / p" | dc`; \
		   RKERN=`echo "$RKERN 1200 * 1000 / $FAK * 1000 / p" | dc`;;
		B) LKERN=`echo "$LKERN 300 * 1000 / $FAK * 1000 / p" | dc`;;
		C) LKERN=`echo "$LKERN 300 * 1000 / $FAK * 1000 / p" | dc`; \
		   RKERN=`echo "$RKERN 600 * 1000 / $FAK * 1000 / p" | dc`;;
		D) LKERN=`echo "$LKERN 300 * 1000 / $FAK * 1000 / p" | dc`;;
		E) LKERN=`echo "$LKERN 300 * 1000 / $FAK * 1000 / p" | dc`;;
		G) LKERN=`echo "$LKERN 300 * 1000 / $FAK * 1000 / p" | dc`; \
		   RKERN=`echo "$RKERN 600 * 1000 / $FAK * 1000 / p" | dc`;;
		K) LKERN=`echo "$LKERN 1400 * 1000 / $FAK * 1000 / p" | dc`;;
		L) LKERN=`echo "$LKERN 300 * 1000 / $FAK * 1000 / p" | dc`;;
		N) LKERN=`echo "$LKERN 1100 * 1000 / $FAK * 1000 / p" | dc`;;
		O) LKERN=`echo "$LKERN 600 * 1000 / $FAK * 1000 / p" | dc`; \
		   RKERN=`echo "$RKERN 600 * 1000 / $FAK * 1000 / p" | dc`;;
		P) LKERN=`echo "$LKERN 1100 * 1000 / $FAK * 1000 / p" | dc`;;
		Q) LKERN=`echo "$LKERN 600 * 1000 / $FAK * 1000 / p" | dc`; \
		   RKERN=`echo "$RKERN 600 * 1000 / $FAK * 1000 / p" | dc`;;
		R) LKERN=`echo "$LKERN 300 * 1000 / $FAK * 1000 / p" | dc`;;
		S) LKERN=`echo "$LKERN 300 * 1000 / $FAK * 1000 / p" | dc`; \
		   RKERN=`echo "$RKERN 300 * 1000 / $FAK * 1000 / p" | dc`;;
		T) LKERN=`echo "$LKERN 1200 * 1000 / $FAK * 1000 / p" | dc`; \
		   RKERN=`echo "$RKERN 1200 * 1000 / $FAK * 1000 / p" | dc`;;
		V) LKERN=`echo "$LKERN 1300 * 1000 / $FAK * 1000 / p" | dc`; \
		   RKERN=`echo "$RKERN 1300 * 1000 / $FAK * 1000 / p" | dc`;;
		W) LKERN=`echo "$LKERN 1300 * 1000 / $FAK * 1000 / p" | dc`; \
		   RKERN=`echo "$RKERN 1300 * 1000 / $FAK * 1000 / p" | dc`;;
		X) LKERN=`echo "$LKERN 1300 * 1000 / $FAK * 1000 / p" | dc`; \
		   RKERN=`echo "$RKERN 1300 * 1000 / $FAK * 1000 / p" | dc`;;
		Y) LKERN=`echo "$LKERN 1300 * 1000 / $FAK * 1000 / p" | dc`; \
		   RKERN=`echo "$RKERN 1300 * 1000 / $FAK * 1000 / p" | dc`;;
		Z) LKERN=`echo "$LKERN 300 * 1000 / $FAK * 1000 / p" | dc`;;
		Adieresis) LKERN=`echo "$LKERN 1200 * 1000 / $FAK * 1000 / p" | dc`; \
		   RKERN=`echo "$RKERN 1200 * 1000 / $FAK * 1000 / p" | dc`;;
		Odieresis) LKERN=`echo "$LKERN 600 * 1000 / $FAK * 1000 / p" | dc`; \
		   RKERN=`echo "$RKERN 600 * 1000 / $FAK * 1000 / p" | dc`;;
	    esac
	    LISTE="$LISTE\\
\\\\setkern{guillemotright}{$CHAR}{-$RKERN}\\
\\\\setkern{$CHAR}{guillemotleft}{-$LKERN}"
	done

	for CHAR in a b c d e f g h i j k l m n o p q r s t u v w x y z \
	    adieresis odieresis udieresis germandbls
	do
	    RKERN=$KKERN
	    LKERN=$KKERN
	    case $CHAR in
		b) LKERN=`echo "$LKERN 1000 * 1000 / $FAK * 1000 / p" | dc`; \
		   RKERN=`echo "$RKERN 1200 * 1000 / $FAK * 1000 / p" | dc`;;
	    esac
	    LISTE="$LISTE\\
\\\\setkern{guillemotright}{$CHAR}{-$RKERN}\\
\\\\setkern{$CHAR}{guillemotleft}{-$LKERN}"
	done

	sed "1,/\\\\setrawglyph/ { /\\\\setrawglyph/i \\
$LISTE
; }" ec${f}${ec}.mtx > ec${f}${ec}.mtx.tmp && \
	mv -f ec${f}${ec}.mtx.tmp ec${f}${ec}.mtx || \
	rm -f ec${f}${ec}.mtx.tmp
    done
}

function echoinstalls () {
enc=$1; f=$2; se=$3; sh=$4

echo
for ec in ${size}; do
    case ${ec} in
	0500) fs="5";;
        0600) fs="6";;
	0700) fs="7";;
	0800) fs="8";;
	0900) fs="9";;
	1000) fs="10";;
	1095) fs="10.95";;
	1200) fs="12";;
	1440) fs="14.4";;
	1728) fs="17.28";;
	2074) fs="20.74";;
	2488) fs="24.88";;
	2986) fs="29.86";;
	3583) fs="35.83";;
    esac
    if [ -f ec${f}${ec}.pl -a -f tc${f}${ec}.pl ]; then
	echo "\installfont{hfo${f}${ec}}{ec${f}${ec},tc${f}${ec},dostretch}{T19}{T1}{hfo${enc}}{${se}}{${sh}}{<${fs}>}"
# Change v0.2: Use lining figures with small capitals again.
#              Thus, no extra handling for these fonts necessary anymore.
# Change v0.4: Use old-style figures with small capitals again.
    else if [ ${f} == "cc" -o ${f} == "xc" -o ${f} == "sc" -o ${f} == "oc" -o ${f} == "tc" ]
    then
	[ ${f} == "cc" ] && tcf="rm"
	[ ${f} == "xc" ] && tcf="bx"
	[ ${f} == "sc" ] && tcf="sl"
	[ ${f} == "oc" ] && tcf="bl"
	[ ${f} == "tc" ] && tcf="tt"
	if [ -f ec${f}${ec}.pl -a -f tc${tcf}${ec}.pl ]; then
	    echo "\installfont{hfo${f}${ec}}{ec${f}${ec},tc${tcf}${ec},dostretch}{T19}{T1}{hfo${enc}}{${se}}{${sh}}{<${fs}>}"
#	    echo "\installfont{hfo${f}${ec}}{ec${f}${ec},dostretch}{T1}{T1}{hfo${enc}}{${se}}{${sh}}{<${fs}>}"
	fi
    fi
 fi
done;
}


function modfd () 
{
    fdfile=$1

    cat ${fdfile} | \
	grep -1 -e '<[-.0-9]*>' \
		-e 'DeclareFontShape' | \
	grep -v -e '<10\.95>' -e '<14\.4>' -e '<20\.74>' \
		-e '<24\.88>' -e '<29\.86>' -e '<35\.83>' | \
	sed -e 's/<5>/<-6>/g' -e 's/<6>/<6-7>/g' -e 's/<7>/<7-8>/g' \
	    -e 's/<8>/<8-9>/g' -e 's/<9>/<9-10>/g' -e 's/<10>/<10-12>/g' \
	    -e 's/<12>/<12-17>/g' -e 's/<17\.28>/<17->/g' > asdf.fd
    echo '\else' >> asdf.fd
    echo '\typeout{'${fdfile}': Using all design sizes}%' >> asdf.fd
    sed '/\\endinput/d' asdf.fd > tmp.fd && mv -f tmp.fd asdf.fd
    cat ${fdfile} | \
	sed -e '/DeclareFontFamily/i \
\\ifhfofixcm\
\\typeout{'${fdfile}': Using fewer design sizes (fix-cm)}% \
' \
	    -e '/\\endinput/i \
\\fi\
' \
	    -e '/\\DeclareFontFamily/r asdf.fd' > tmp.fd
    mv -f tmp.fd ${fdfile}
    rm -f asdf.fd
}


# function main () {

# Roman family
#

echo >> $logfile
echo "Roman Family" >> $logfile
echo "------------" >> $logfile
echo >> $logfile

getpl "$rofamily"

(
intro

echomtx rm
echomtx ti
echomtx sl
echomtx ui
echomtx cc
echomtx sc
echomtx rb
echomtx bx
echomtx bi
echomtx bl
echomtx xc
echomtx oc

extro
) > hformtx.tex

tex hformtx.tex

insertkerns rm 1000
insertkerns ti 1000
insertkerns sl 1000
insertkerns ui 1000
insertkerns cc 1000
insertkerns sc 1000
insertkerns rb 1000
insertkerns bx 1000
insertkerns bi 1000
insertkerns bl 1000
insertkerns xc 1000
insertkerns oc 1000

(
intro

echo; echo "\installfamily{T1}{hfor}{}"

echoinstalls r rm m n
echoinstalls r ti m it
echoinstalls r sl m sl
echoinstalls r ui m ui
echoinstalls r cc m sc
echoinstalls r sc m scsl
echoinstalls r rb b n
echoinstalls r bx bx n
echoinstalls r bi bx it
echoinstalls r bl bx sl
echoinstalls r xc bx sc
echoinstalls r oc bx scsl

extro
) > hfor.tex

tex hfor.tex

# Change v0.2: LaTeX is big enough not to split generation of Roman family.

getvf "$rofamily"

cleanup "$rofamily"

ed t1hfor.fd <<EOS
\$-1,\$d
w
q
EOS

(
# Change v0.2: Support slanted small capitals
# Change v0.90: Fix the wrong generation of this entry. It prevented LaTeX
#              from finding the correct small caps with old-style digits.
for f in m bx; do
    echo "\DeclareFontShape{T1}{hfor}{$f}{scit}{<->ssub * hfor/$f/scsl}{}"
done
echo
# Change v0.2: Use lining figures with small capitals again.
# Change v0.4: Use old-style figures with small capitals again.
for f in $rfamily; do
	se=`echo $f | cut -f 1 -d "/"`
	sh=`echo $f | cut -f 2 -d "/"`
	echo "\DeclareFontShape{T1}{hfor}{$se}{$sh}{<->ssub * cmr/$se/$sh}{}"
done
echo
echo '\endinput'
) >> t1hfor.fd

modfd t1hfor.fd

sed 's/Fontinst .*/ v'$VERSION'  European Computer Modern with oldstyle digits]/' \
    t1hfor.fd > asdf && mv -f asdf t1hfor.fd

# Sans Serif family

echo >> $logfile
echo "Sans Serif family" >> $logfile
echo "-----------------" >> $logfile
echo >> $logfile

getpl "$ssofamily"

(
intro

echomtx ss
echomtx si
echomtx sx
echomtx so

extro
) > hfossmtx.tex

tex hfossmtx.tex

# Change v1.00: Add kerning to sans-serif fonts, 70% of serif fonts.
insertkerns ss 0700
insertkerns si 0700
insertkerns sx 0700
insertkerns so 0700

(
intro

echo; echo "\installfamily{T1}{hfoss}{}"

echoinstalls ss ss m n
echoinstalls ss si m sl
echoinstalls ss sx bx n
echoinstalls ss so bx sl

extro
) > hfoss.tex

tex hfoss.tex

getvf "$ssofamily"

cleanup "$ssofamily"

ed t1hfoss.fd <<EOS
\$-1,\$d
w
q
EOS

for f in $ssfamily; do
	se=`echo $f | cut -f 1 -d "/"`
	sh=`echo $f | cut -f 2 -d "/"`
	echo "\DeclareFontShape{T1}{hfoss}{$se}{$sh}{<->ssub * cmss/$se/$sh}{}" >> t1hfoss.fd
done

for f in m bx; do
	echo "\DeclareFontShape{T1}{hfoss}{$f}{it}{<->ssub * hfoss/$f/sl}{}" >> t1hfoss.fd
	echo "\DeclareFontShape{T1}{hfoss}{$f}{scit}{<->ssub * hfoss/$f/sl}{}" >> t1hfoss.fd
	echo "\DeclareFontShape{T1}{hfoss}{$f}{scsl}{<->ssub * hfoss/$f/sl}{}" >> t1hfoss.fd
done
echo '' >> t1hfoss.fd
echo '\endinput' >> t1hfoss.fd

modfd t1hfoss.fd

sed 's/Fontinst .*/ v'$VERSION'  European Computer Modern with oldstyle digits]/' \
    t1hfoss.fd > asdf && mv -f asdf t1hfoss.fd


# Typewriter family

echo >> $logfile
echo "Typewriter family" >> $logfile
echo "-----------------" >> $logfile
echo >> $logfile

getpl "$ttofamily"

(
intro

echomtx tt
echomtx it
echomtx st
# Change v0.2: Use lining figures with small capitals again.
# Change v0.4: Use old-style figures with small capitals again.
echomtx tc

extro
) > hfottmtx.tex

tex hfottmtx.tex

(
intro

echo; echo "\installfamily{T1}{hfott}{\hyphenchar\font=\m@ne }"

echoinstalls tt tt m n
echoinstalls tt it m it
echoinstalls tt st m sl
# Change v0.2: Use lining figures with small capitals again.
# Change v0.4: Use old-style figures with small capitals again.
echoinstalls tt tc m sc

extro
) > hfott.tex

tex hfott.tex

getvf "$ttofamily"

cleanup "$ttofamily"

ed t1hfott.fd <<EOS
,s/\\\hyphenchar \\\font =\\\m @ne /\\\hyphenchar\\\font=\\\m@ne/
w
q
EOS

(
echo
# Change v0.2: Use lining figures with small capitals again.
# Change v0.4: Use old-style figures with small capitals again.
for f in $ttfamily; do
	se=`echo $f | cut -f 1 -d "/"`
	sh=`echo $f | cut -f 2 -d "/"`
	echo "\DeclareFontShape{T1}{hfott}{$se}{$sh}{<->ssub * cmtt/$se/$sh}{}"
done
echo
echo '\endinput'
) >> t1hfott.fd

modfd t1hfott.fd

sed 's/Fontinst .*/ v'$VERSION'  European Computer Modern with oldstyle digits]/' \
    t1hfott.fd > asdf && mv -f asdf t1hfott.fd


# Dunhill family

echo >> $logfile
echo "Dunhill family" >> $logfile
echo "--------------" >> $logfile
echo >> $logfile

getpl "$dhofamily"

(
intro

echomtx dh

extro

) > hfodhmtx.tex

tex hfodhmtx.tex

(
intro

echo; echo "\installfamily{T1}{hfodh}{}"

echoinstalls dh dh m n

extro

) > hfodh.tex

tex hfodh.tex

getvf "$dhofamily"

cleanup "$dhofamily"

modfd t1hfodh.fd

sed 's/Fontinst .*/ v'$VERSION'  European Computer Modern with oldstyle digits]/' \
    t1hfodh.fd > asdf && mv -f asdf t1hfodh.fd


# Variable width Typewriter family

echo >> $logfile
echo "Variable width Typewriter family" >> $logfile
echo "--------------------------------" >> $logfile
echo >> $logfile

getpl "$vtofamily"

(
intro

echomtx vt
echomtx vi

extro
) > hfovtmtx.tex

tex hfovtmtx.tex

(
intro

echo; echo "\installfamily{T1}{hfovt}{\hyphenchar\font=\m@ne }"

echoinstalls vt vt m n
echoinstalls vt vi m it

extro
) > hfovt.tex

tex hfovt.tex

getvf "$vtofamily"

cleanup "$vtofamily"

ed t1hfovt.fd <<EOS
,s/\\\hyphenchar \\\font =\\\m @ne /\\\hyphenchar\\\font=\\\m@ne/
w
q
EOS

echo '\endinput' >> t1hfovt.fd

modfd t1hfovt.fd

sed 's/Fontinst .*/ v'$VERSION'  European Computer Modern with oldstyle digits]/' \
    t1hfovt.fd > asdf && mv -f asdf t1hfovt.fd


exit 0

# }
