+#!/bin/bash
+set -e
+LATEXFLAGS="-file-line-error -halt-on-error"
+
+docs=( thesis presentation )
+
+log(){
+ echo $1 >&2
+}
+
+deps(){
+ [[ "$1" != *.tex && "$1" != *.pre ]] && fn="$1.tex" || fn="$1"
+ echo "$fn"
+ grep -Po '(?<=\\input{).*(?=})|(?<=\\include{).*(?=})' $fn |\
+ while read l; do deps "$l"; done
+}
+
+recompile(){
+ for dep in $(deps "$1"); do
+ [ "$dep" -nt "$2" ] && return 0
+ done
+ return 1
+}
+
+preamble(){
+ pdflatex $LATEXFLAGS -ini -jobname="$2" "&pdflatex $1\dump"
+}
+
+compile(){
+ pdflatex $LATEXFLAGS $1
+ grep -q '^\\bibdata{' $1.aux && bibtex $1
+ grep -q '\@istfilename' $1.aux && makeglossaries $1
+ [ -f $1.idx ] && makeindex $1
+ tmpf=$(mktemp)
+ trap RETURN rm -v $tmpf
+ pdflatex $LATEXFLAGS $1 | tee $tmpf
+ grep -Fiq "Rerun" $tmpf && $LATEX $LATEXFLAGS $1
+ rm -vf $tmpf
+}
+
+pipeline(){
+ log "Processing $1"
+ if [ ! -f $1.tex ]; then
+ log "Skipping $1, no tex available"
+ else
+ # Check for preamble
+ [ -f preamble.tex ] && pre=preamble.tex
+ [ -f $1.pre ] && pre=$1.pre
+
+ if [ ! -z $pre ]; then
+ log "preamble found"
+ recompile $pre $1.fmt\
+ && preamble $pre $1\
+ || log "preamble up to date"
+ fi
+
+ # Compile document
+ recompile "$1.tex" "$1.pdf"\
+ && compile $1\
+ || log "document up to date"
+ fi
+}
+
+clean(){
+ while [ $# -ne 0 ]; do
+ log "Clean $1"
+ rm -fv $1.{acn,acr,alg,aux,bbl,blg,idl,idx,ilg,ind,fmt,glg,glo,gls,\
+ist,loa,lof,log,lol,lot,nav,out,pdf,snm,tdo,toc}
+ shift
+ done
+}
+
+if [ $# -eq 0 ]; then
+ for doc in "${docs[@]}"; do
+ pipeline $doc
+ log ""
+ done
+else
+ while [ $# -ne 0 ]; do
+ if [ $1 = "clean" ]; then
+ if [ $# -eq 2 ];
+ then clean $d
+ else clean "${docs[@]}"
+ fi
+ else
+ pipeline $1
+ fi
+ shift
+ done
+fi
+