222 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			222 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/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 *.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
 | |
| 
 | |
| 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
 | |
| }
 | |
| 
 | |
| 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;
 | |
| 	    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
 | |
| 
 | |
| 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
 |