#!/bin/bash
#
# Automate running LaTeX

program=`basename $0`
tex=latex
format=dvi
rerun='Rerun to get cross-references right'
maxruns=4
quiet=false

function texclean
{ rm -f *.idx *.ind *.ilg *.aux *.log *.lof *.out *.toc
}

# make runtex --clean work without GNU getopt
case "$1" in
	--clean)
	texclean
	exit 0
	;;
esac

appbase=`dirname $0`
case "$appbase" in
    /*)
	;;
    .)  appbase=`pwd`
        ;;
    ./*|../*)
	appbase="`pwd`/$appbase"
	clean=false
	while [ $clean = false ]; do
	  b=`echo $appbase | sed -e 's@/\./@/@g' -e 's@/[a-z]*/\.\./@/@g'`
	    if [ "x$b" = "x$appbase" ]; then
	      clean=true
	    else
	      appbase="$b"
	    fi
	done
	;;
    *)  echo "ERROR: runtex must be called with relative or absolute path"
        exit 1
	;;
esac

echo "runtex application base = $appbase"

function addinput
{ if [ -z "$TEXINPUTS" ]; then
    export TEXINPUTS="$1::"
  else
    export TEXINPUTS=$TEXINPUTS:$1::
  fi
}

function addbstinput
{ if [ -z "$BSTINPUTS" ]; then
    export BSTINPUTS="$1::"
  else
    export BSTINPUTS=$BSTINPUTS:$1::
  fi
}

function addbibinput
{ if [ -z "$BIBINPUTS" ]; then
    export BIBINPUTS="$1::"
  else
    export BIBINPUTS=$BIBINPUTS:$1::
  fi
}

if [ -d $appbase ]; then
  addinput $appbase
  addbstinput $appbase
  addbibinput $appbase
fi

case "`uname`" in
   *Darwin*)	PATH=/opt/local/bin:$PATH 	# We need getopt from Darwinports
		;;
esac

if [ "x`getopt --test`" = "x--" ]; then
   case "$1" in
     --clean)
	texclean
	exit 0
	;;
     *)
        echo "ERROR: runtex requires GNU getopt"
	exit 1
	;;
   esac
fi

TEMP=`getopt -o n --long tex:,pdf,help,dvi,quiet,clean,maxruns,inputs: \
     -n $program -- "$@"`
if [ $? != 0 ] ; then echo "$program: use $program --help for options" >&2 ; exit 1 ; fi
eval set -- "$TEMP"

while true ; do
    case "$1" in
        --pdf)
	    tex=pdflatex
	    format=pdf
	    shift ;;
        --dvi)
	    tex=latex
	    format=dvi
	    shift ;;
	--quiet)
	    quiet=true;
	    shift ;;
	--maxruns)
	    maxruns="$2"
	    shift 2 ;;
	--inputs)
	    addinput "$2"
	    shift 2 ;;
	--help)
	    echo "Usage:"
	    echo ""
	    echo "    $program [options] file"
	    echo ""
	    echo "Options:"
	    echo ""
	    echo "    --pdf        Use pdflatex and make .pdf images"
	    echo "    --dvi        Use latex"
	    echo "    --help       Print this message"
	    echo "    --maxruns=#  Specify maximum # runs"
	    echo "    --clean      Just remove TeX temporary files"
	    exit 0 ;;
	--clean)
	    texclean
	    exit 0
	    ;;
        --)
	    shift ; break ;;
	*)
	    echo "Internal error!" ; exit 1 ;;
    esac
done

file="$1"

# ensure .tex suffix

if [ ${file%.tex} = $file ]; then
    file=$file.tex
fi

doc=${file%.tex}

if [ -r Makefile ] && grep -q '^tex:' Makefile; then
    make tex
fi

cont=yes
done=0
while [ $cont != "no" ]; do
    cont=maybe

					# fix index problems
    if [ -r $doc.idx ]; then
	cp $doc.idx $doc.idx.$$
        if [ -x $appbase/correctindex ]; then
	    $appbase/correctindex $doc.idx
	fi
	if [ -r $appbase/makeindex.ist ]; then
	    makeindex -s $appbase/makeindex.ist $doc
	else
	    makeindex $doc
	fi
    fi 
    if test -r $doc.aux && grep -qw bibdata $doc.aux; then
	if [ -f $doc.bbl ]; then cp $doc.bbl $doc.bbl$$; fi
	echo "%%% Running Bibtex"
        bibtex $doc
	if [ -r $doc.bbl -a -r $doc.bbl.$$ ]; then
	   if cmp -s $doc.bbl $doc.bbl.$$; then
	      true
	   else
	      cont=yes
	      echo "*** Bibtex output changed.  Rerunning $tex ***"
	   fi
	fi
	rm -f $doc.bbl$$
    fi
    if [ `basename $tex` = pdflatex -a -r $appbase/Makefile.pdf ]; then
        make -f $appbase/Makefile.pdf
    fi
    rm -f $doc.log
    if [ $quiet == true ]; then
        $tex $doc -file-line-error -halt-on-error >/dev/null
    else
	$tex $doc
    fi
    if [ $? != 0 ]; then
        rm -f $doc.idx.$$
        exit $?;
    fi
    if grep -q "$rerun" $doc.log; then
        echo "*** Cross-references changed.  Rerunning $tex ***"
	cont=yes
    else
        if [ -r $doc.idx -a -r $doc.idx.$$ ]; then
	   if cmp -s $doc.idx $doc.idx.$$; then
	      true
	   else
	      ls -l $doc.idx $doc.idx.$$
	      cont=yes
	      echo "*** Index changed.  Rerunning $tex ***"
	   fi
        fi
    fi
    rm -f $doc.idx.$$
    done=$(($done+1))
    if [ $done = $maxruns ]; then cont=no; fi
    if [ $cont = maybe ]; then cont=no; fi
done


if grep -q Warning $doc.log; then
   echo ""
   echo "*****************************"
   echo "The following warnings remain"
   echo "*****************************"
   grep Warning $doc.log
fi
