#!/bin/bash
#
# Automate running LaTeX

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

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

# 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

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
}

function usage
{ 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"
}



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

argp=true
while [ $argp = true ] ; do
    case "$1" in
        --pdf)
	    tex=pdflatex
	    format=pdf
	    shift ;;
        --dvi)
	    tex=latex
	    format=dvi
	    shift ;;
	--quiet)
	    quiet=true
	    mkindexopts=-q
	    bibtexopts=-terse
	    shift ;;
	--maxruns=*)
	    maxruns="`echo $1 | sed 's/--maxruns=//'`"
	    shift ;;
	--inputs=*)
	    addinput "`echo $1 | sed 's/--inputs=//'`"
	    shift ;;
	--help)
	    usage
	    exit 0 ;;
	--clean)
	    texclean
	    exit 0
	    ;;
        --*)
	    usage
	    exit 1 ;;
	*)
	    argp=false;
	    ;;
    esac
done

if [ -z "$1" ]; then
  usage
  exit 1
fi

if [ $quiet = false ]; then
  echo "runtex application base = $appbase"
fi

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 [ -r $appbase/correctindex ]; then
	    perl -pi $appbase/correctindex $doc.idx
	fi
	if [ -r $appbase/makeindex.ist ]; then
	    makeindex $mkindexopts -s $appbase/makeindex.ist $doc.idx
	else
	    makeindex $mkindexopts $doc.idx
	fi
    fi
    if test -r $doc.aux && grep -qw bibdata $doc.aux; then
	if [ -f $doc.bbl ]; then cp $doc.bbl $doc.bbl$$; fi
	if [ $quiet == false ]; then
	    echo "%%% Running Bibtex"
	fi
        bibtex $bibtexopts $doc
	if [ -r $doc.bbl -a -r $doc.bbl.$$ ]; then
	   if cmp -s $doc.bbl $doc.bbl.$$; then
	      true
	   else
	      cont=yes
	      if [ $quiet == false ]; then
	          echo "*** Bibtex output changed.  Rerunning $tex ***"
	      fi
	   fi
	fi
	rm -f $doc.bbl$$
    fi
    if [ `basename $tex` = pdflatex -a -r $appbase/Makefile.pdf ]; then
        make --quiet -f $appbase/Makefile.pdf
    fi
    rm -f $doc.log
    if [ $quiet == true ]; then
        $tex $doc -file-line-error -halt-on-error >/dev/null
	stat=$?
    else
	$tex $doc
	stat=$?
    fi
    if [ $stat != 0 ]; then
        rm -f $doc.idx.$$
        exit $stat;
    fi
    if grep -q "$rerun" $doc.log; then
        if [ $quiet == false ]; then
            echo "*** Cross-references changed.  Rerunning $tex ***"
	fi
	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
	      if [ $quiet == false ]; then
	          echo "*** Index changed.  Rerunning $tex ***"
	      fi
	   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
