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