#!/bin/csh -f #(ie run the cshell on this but don't read the .cshrc) # l2: 2002 Nov 12. John Collins. # l2: 2002 Nov 11. John Collins. # l2: 2002 Nov 6. John Collins. # l2: 2002 Nov 5. John Collins. Simplified from l v. 2.17 set myname=l2 set displayErrors = 0 set mainCwd = $cwd #alias beep '(echo -n ""; sleep 1; echo -n "")' alias beep '(echo -n "")' nextarg: if ( "$1" == "-d" ) then set displayErrors=1 shift goto nextarg endif if ( "$1" == "-d-" ) then set displayErrors=0 shift goto nextarg endif if ( ("$1" == "") || ("$1" == "-h") || ("$1" == "--help") ) then echo "Usage $myname [-d|-d-] paper.tex" echo "" echo " -d ==> display errors" echo " -d- ==> do not display errors (default)" echo " -h, --help ==> show this message" exit 0 endif set paper=$1 if ( "$paper:e" == "" ) then set base=$paper set paper=${base}.tex else set base=$paper:r endif if !(-f $paper) then echo $paper does not exist\! exit 1 endif # set overfull = Overfull set overfull = NoOverfull echo ALL $overfull MESSAGES WILL BE SUPPRESSED # see Lamport page 177 for dealing with overfull boxes. # basically, do this: # \documentclass[12pt,draft]{article} # draft will mark the overfull boxes and the solution # will become obvious... # run latex. The cat /dev/null prevents # latex from stopping. Errors are reported to paper.log cat /dev/null | latex $paper | grep -v $overfull # determine if there was an error, by looking at paper.log: grep "Emergency stop" $base.log @ emergencyStop = ($status == 0) # Also find if no output produced: # Examine only the last line of the file to pick out only the # message produced by TeX, and not something else with the same # string. tail -1 $base.log | grep "No pages of output." @ noOutput = ($status == 0) if ($emergencyStop || $noOutput)then # begin latexerrors %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% echo create and display latex errors beep& set err = /tmp/`whoami`-$base:t set tmperr = $err.tex echo "\documentclass[12pt]{article}" > $tmperr echo "\textwidth 7.5in" >> $tmperr echo "\begin{document}" >> $tmperr if ( $emergencyStop ) then echo "Error(s) in tex file ($paper): " >> $tmperr else if ( $noOutput ) then echo "No output from tex file ($paper): " >> $tmperr endif echo "\begin{verbatim}" >> $tmperr cat $base.log >> $tmperr echo "\end{verbatim}" >> $tmperr echo "\end{document}" >> $tmperr # latex puts its generated files in the current directory, rather # than the directory of the source file. So change to the # temporary directory, and run latex with the path removed from the # filename argument: pushd /tmp latex $err:t popd # Give the original latex file a valid dvi file containing the error log. cp $err.dvi $base.dvi # Make a dummy aux file. And also make a .aux.bak file. This # solves the following: # 1. Sometimes a run with errors results from or has produced # a bad .aux file. This gets read in on the next run and # an infinite error loop results unless the .aux file is # deleted or replaced by something innocuous. # 2. Latexmk is liable to make extra runs of latex after an # error is produced. In simple cases, this can be avoided # if the aux file is later than the tex file and the # aux.bak file has the same contents. echo "\relax" > $base.aux echo "\relax" > $base.aux.bak rm -f $err.aux $err.log $err.tex if ( $displayErrors) then # Popup a new window containing the error log if ( $emergencyStop ) then echo xdvi display shows the last page of the errors set page = '+' else set page = '' endif xdvi $err.dvi $page & sleep 2 endif rm -f $err.dvi exit 1 # end latexerrors %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% else echo Successful run exit 0 endif