Over the past 8 years, I needed to compile LaTeX documents for this or that reason. As time passed, I enhanced them with BibTeX, XFig, and Gnuplot. Further, I generally needed to produce PDF files validated by IEEE PDF eXpress. Here, I share some scripts I developed during the road to ease the pain.
First, note that there is a certain directory structure I stick to.
/ – LaTeX (.tex) and BibTeX (.bib) files are placed here./constants.tex – LaTeX file for constants (variables, definitions, commands, etc.) shared between LaTeX and XFig files./make.sh – Compiles the whole project./figs – XFig (.fig), Gnuplot (.gnu), and EPS (.eps) files go here./figs/fig2eps.sh/figs/make.sh – Compiles the XFig and Gnuplot into EPS format.Below is the entry point, /make.sh. (Make sure you have latex, bibtex, dvips, and pspdf commands available.)
#!/bin/bash
usage() {
    echo "Usage: $0 <BASENAME> <LATEX|BIBTEX|CLEAN>"
    exit 1
}
[ $# -ne 2 ] && usage
BASENAME=$1
ACTION=$2
set -e
set -x
latex() {
    /usr/bin/latex --halt-on-error $1
}
make_bibtex() {
    latex $1 && \
	bibtex $1 && \
	latex $1 && \
	latex $1
}
make_latex() {
    cd figs && ./make.sh && cd .. && \
    latex $1 && \
    dvips -Ppdf -G0 -ta4 $1.dvi -o && \
    ps2pdf \
	-dCompatibilityLevel=1.4 \
	-dPDFSETTINGS=/prepress \
	$1.ps $1.pdf
}
make_clean() {
    rm -f \
	$1.aux \
	$1.bbl \
	$1.blg \
	$1.dvi \
	$1.log \
	$1.pdf \
	$1.ps
}
case $ACTION in
    latex) make_latex $BASENAME;;
    bibtex) make_bibtex $BASENAME;;
    clean) make_clean $BASENAME;;
    *) usage;;
esac
In /make.sh, I follow LaTeX->DVI->PostScript->PDF path. The main reason for the preference of this path over LaTeX->PDF is to properly process scalable EPS figures produced by XFig. (Personally, I hate to see broken figures in published articles.)
Next, here goes /figs/make.sh script. (Per see, gnuplot is required during execution.)
#!/bin/bash
set -e
set -x
get_modify_time() {
    if [ -e "$1" ]; then
	DT=$(stat "$1" | grep ^Modify: | sed 's/^Modify: //g')
	date -d "$DT" +%s
    else
	echo 0
    fi
}
find -name "*.fig" | \
while read FIG; do
    BAS=$(basename "$FIG" | sed 's/\.fig$//g')
    BAK="$BAS.fig.bak"
    EPS="$BAS.eps"
    # See if EPS needs to be updated.
    T_FIG=$(get_modify_time "$FIG")
    T_EPS=$(get_modify_time "$EPS")
    [ $T_FIG -gt $T_EPS ] && ./fig2eps.sh $BAS
    # Remove backup, if there is any.
    rm -f "$BAK"
done
find -name "*.gnu" | \
while read GNU; do
    BAS=$(basename "$GNU" | sed 's/\.gnu$//g')
    EPS="$BAS.eps"
    # See if EPS needs to be updated.
    T_GNU=$(get_modify_time "$GNU")
    T_EPS=$(get_modify_time "$EPS")
    if [ $T_GNU -gt $T_EPS ]; then
	gnuplot $GNU
    fi
done
exit 0
Nothing fancy in /figs/make.sh. First, we process .fig files; second, we process .gnu files.
Finally, below goes /figs/fig2eps.sh script. (Make fig2dev, pdflatex, pdf2ps commands ready. Note that /figs/fig2eps.sh requires /constants.tex for shared LaTeX variables.)
#!/bin/bash
set -x
if [ ${#@} -ne 1 ]; then
    echo "Usage: $0 <BASENAME>"
    exit 1
fi
BASENAME="$1"
cat <<EOF >$BASENAME.tex
\documentclass{article}
\usepackage{graphics}
\usepackage{amsfonts}
\usepackage{color}
\input{../constants}
\begin{document}
\thispagestyle{empty}
\begin{figure}
  \centering
  \input{${BASENAME}_fig.pdf_t}
\end{figure}
\end{document}
EOF
fig2dev -L pdftex $BASENAME.fig ${BASENAME}_fig.pdf && \
fig2dev -L pstex_t -p ${BASENAME}_fig.pdf $BASENAME.fig ${BASENAME}_fig.pdf_t && \
pdflatex $BASENAME && \
pdf2ps $BASENAME.pdf $BASENAME.eps
RET=$?
rm -f \
    ${BASENAME}_fig.pdf \
    ${BASENAME}_fig.pdf_t \
    $BASENAME.aux \
    $BASENAME.pdf \
    $BASENAME.log \
    $BASENAME.tex
exit $RET
After all these fuss, the whole project boils down to
./make.sh paper bibtex
./make.sh paper latex
and you are ready to go.
Scripts need a little bit more cleaning and they are probably not the most correct ones. Anyway, they served well until now, and I hope they would for you as well.