aos/tools/run-pdflatex.sh
Daniel Schwyn 6d444bf552 Main handout
Signed-off-by: Daniel Schwyn <daniel.schwyn@inf.ethz.ch>
2022-03-03 14:57:51 +01:00

178 lines
5.2 KiB
Bash
Executable File

##########################################################################
# Copyright (c) 2010, ETH Zurich.
# All rights reserved.
#
# This file is distributed under the terms in the attached LICENSE file.
# If you do not find this file, copies can be found by writing to:
# ETH Zurich D-INFK, Universitaetstrasse 6, CH-8092 Zurich. Attn: Systems Group.
##########################################################################
#
# run-pdflatex.sh: helper script to build Barrelfish technical notes
#
# This script wraps up pdflatex into something that can be entirely
# controlled by command-line options, making it considerably easier to
# invoke from a Makefile or Hakefile.
#
# In some ways this is a poor relation to rubber, but it doesn't
# require any support packages (not even Python), and is specifically
# tailored to the kinds of filesystem naming games that Hake likes to
# play. That said, it's completely independent of Hake, and usable
# standalone.
#
# Usage summary
#
usage () {
cat >&1 <<EOF
Usage: $0 <options>
--input-tex <filename>
--working-dir <dir>
--output-pdf <filename>
(--texinput <dir>)*
(--bininput <dir>)*
[--has-bib]
EOF
exit 1
}
#
# Shorthand for running pdflatex. This is nicer than using a single
# shell variable as it always gets the quoting right.
#
run_latex () {
# echo "dirs: $WORKING_DIR, $JOB_NAME, $INPUT_TEX, $TEXINPUTS, $BIBINPUTS" \
pdflatex \
-interaction=nonstopmode \
-file-line-error \
-output-directory "$WORKING_DIR" \
-jobname "$JOB_NAME" \
"$INPUT_TEX" #|| exit
}
#
# Work out how to construct TEXINPUTS and BIBINPUTS paths, according
# to Cygwin or not.
#
case "`which pdflatex`" in
/cygdrive/*) _ISCYGWIN=Yes ;;
esac
cons_inputs() {
path=$(readlink -f ${2})
if [ -z "$_ISCYGWIN" ] ; then
echo "${1}${path}//:"
else
echo "${1}${path}//\\;"
fi
}
#
# Initial values for input arguments
#
if [ -z "$TEXINPUTS" ]; then
TEXINPUTS=`cons_inputs "" "."`
else
TEXINPUTS=`cons_inputs "$TEXINPUTS" "."`
fi
# echo "TEXinputs is $TEXINPUTS"
# exit
BIBINPUTS=`cons_inputs "" "."`
INPUT_TEX=
WORKING_DIR=
OUTPUT_PDF=
HAS_BIB=
HAS_GLO=
#
# Argument processing.
#
while [ -n "$*" ]; do
case $1 in
--input-tex)
shift; INPUT_TEX=$1 ;;
--output-pdf)
shift; OUTPUT_PDF="$1" ;;
--working-dir)
shift; WORKING_DIR="$1" ;;
--texinput)
shift; TEXINPUTS=`cons_inputs "$TEXINPUTS" "$1"` ;;
--bibinput)
shift; BIBINPUTS=`cons_inputs "$BIBINPUTS" "$1"` ;;
--has-bib)
HAS_BIB=Yes ;;
--has-glo)
HAS_GLO=Yes ;;
*)
usage ;;
esac
shift
done
if [ -z "$INPUT_TEX" ] ; then usage ; fi
if [ -z "$WORKING_DIR" ] ; then usage ; fi
if [ -z "$OUTPUT_PDF" ] ; then usage ; fi
#
# Calculate all the other stuff we need.
#
INPUT_DIR=`dirname "$INPUT_TEX"`
INPUT_DIR=`readlink -f $INPUT_DIR`
INPUT_BASE=`basename "$INPUT_TEX" .tex`
TEXINPUTS=`cons_inputs "$TEXINPUTS" "$INPUT_DIR"`
BIBINPUTS=`cons_inputs "$BIBINPUTS" "$INPUT_DIR"`
export TEXINPUTS
export BIBINPUTS
#
# We use a different jobname due to parallel Make paranoia: it's a
# good idea if the output file that we really care out only appears as
# the last step of the build. This also allows us to specify
# different directories for the final PDF file and the intermediate
# working files, something (apparently) not possible within pdflatex.
#
JOB_NAME="${INPUT_BASE}.tmp"
# the man page for bibtex specifically reads
# "the filename on the command line must be given without the .aux extension"
AUX_FILE_WITHOUT_AUX="$WORKING_DIR/${JOB_NAME}"
AUX_FILE="$WORKING_DIR/${JOB_NAME}.aux"
OUT_FILE="$WORKING_DIR/${JOB_NAME}.out"
HST_FILE="$WORKING_DIR/${JOB_NAME}.hst"
LOG_FILE="$WORKING_DIR/${JOB_NAME}.log"
TOC_FILE="$WORKING_DIR/${JOB_NAME}.toc"
BBL_FILE="$WORKING_DIR/${JOB_NAME}.bbl"
BLG_FILE="$WORKING_DIR/${JOB_NAME}.blg"
VER_FILE="$WORKING_DIR/${JOB_NAME}.ver"
GLO_FILE="$WORKING_DIR/${JOB_NAME}.glo"
ACN_FILE="$WORKING_DIR/${JOB_NAME}.acn"
IST_FILE="$WORKING_DIR/${JOB_NAME}.ist"
PDF_FILE="$WORKING_DIR/${JOB_NAME}.pdf"
LOT_FILE="$WORKING_DIR/${JOB_NAME}.lot"
LOF_FILE="$WORKING_DIR/${JOB_NAME}.lof"
GLS_FILE="$WORKING_DIR/${JOB_NAME}.gls"
GDE_FILE="$WORKING_DIR/${JOB_NAME}.glsdefs"
GLG_FILE="$WORKING_DIR/${JOB_NAME}.glg"
ACR_FILE="$WORKING_DIR/${JOB_NAME}.acr"
ALG_FILE="$WORKING_DIR/${JOB_NAME}.alg"
# remove ubuntu chroot from environment to make pdflatex work
# -SG, 2014-10-14
export LD_LIBRARY_PATH=
#
# And, finally, do what the old Makefile used to do.
#
# bibtex on cygwin can be miktex which always 0 exit code
run_latex
if [ -n "$HAS_BIB" ]; then (cd $WORKING_DIR && bibtex $JOB_NAME) && test -r $BBL_FILE || exit; echo run_latex; fi
if [ -n "$HAS_GLO" ]; then (makeglossaries -s $IST_FILE $GLO_FILE && makeglossaries -s $IST_FILE $ACN_FILE && test -r $GLO_FILE) || exit; echo run_latex; fi
if [ -e "$TOC_FILE" -o -e "$BBL_FILE" -o -e "$VER_FILE" -o -e "$GLO_FILE" -o -e "$ACN_FILE" ]; then run_latex; fi
while egrep -e '^LaTeX Warning.*Rerun|^\(.*\).*Rerun' "$LOG_FILE"; do run_latex; done
rm -f "$AUX_FILE" "$HST_FILE" "$LOG_FILE" "$TOC_FILE" "$BBL_FILE"
rm -f "$BLG_FILE" "$VER_FILE" "$OUT_FILE" "$GDE_FILE"
rm -f "$GLO_FILE" "$ACN_FILE" "$IST_FILE"
rm -f "$LOT_FILE" "$LOF_FILE" "$GLS_FILE"
rm -f "$GLG_FILE" "$ACR_FILE" "$ALG_FILE"
mv "$PDF_FILE" "$OUTPUT_PDF"
echo "Output file is in $OUTPUT_PDF"