#!/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