#!/usr/bin/env bash # Lint, compile, and export superfig deliverables. # ./scripts/build.sh figure.tex [outdir] set -euo pipefail SRC="${1:?usage: build.sh figure.tex [outdir]}" [[ -f "$SRC" ]] || { echo "no such file: $SRC" >&2; exit 2; } SRCDIR="$(cd "$(dirname "$SRC")" && pwd)" BASE="$(basename "$SRC" .tex)" OUT="${2:-$SRCDIR/build}" ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" mkdir -p "$OUT" if [[ "${SF_SKIP_LINT:-0}" != "1" ]]; then echo "==> lint $BASE" python3 "$ROOT/scripts/lint.py" "$SRC" fi echo "==> xelatex $BASE" TEXINPUTS="$ROOT/assets:$SRCDIR:" \ xelatex -halt-on-error -interaction=nonstopmode \ -output-directory="$OUT" "$SRC" >/dev/null 2>&1 \ || { echo "!! xelatex failed; last errors:" >&2 grep -n -A4 -m3 '^!' "$OUT/$BASE.log" >&2 || tail -30 "$OUT/$BASE.log" >&2 exit 1; } LOG="$OUT/$BASE.log" status=0 if grep -q "Missing character" "$LOG"; then echo "!! missing glyphs:" >&2 grep -m5 "Missing character" "$LOG" >&2 status=1 fi if grep -qE "^(Overfull|Underfull) \\\\[hv]box" "$LOG"; then echo "!! overfull/underfull boxes:" >&2 grep -m5 -E "^(Overfull|Underfull) \\\\[hv]box" "$LOG" >&2 status=1 fi if grep -q "Package superfig Warning" "$LOG"; then echo "!! superfig warnings:" >&2 grep -m5 -A2 "Package superfig Warning" "$LOG" >&2 status=1 fi if command -v pdftocairo >/dev/null 2>&1; then echo "==> exporting svg / png" pdftocairo -svg "$OUT/$BASE.pdf" "$OUT/$BASE.svg" pdftocairo -png -r 300 -singlefile "$OUT/$BASE.pdf" "$OUT/$BASE" pdftocairo -png -r 300 -singlefile -transp "$OUT/$BASE.pdf" "$OUT/$BASE-alpha" pdftocairo -png -scale-to-x 360 -scale-to-y -1 -singlefile \ "$OUT/$BASE.pdf" "$OUT/$BASE-thumb" else echo "!! pdftocairo missing: PDF only, no SVG/PNG" >&2 status=1 fi echo "==> artifacts in $OUT" ls -1 "$OUT/$BASE"*.{pdf,svg,png} 2>/dev/null | sed 's/^/ /' if [[ $status -ne 0 ]]; then echo "==> BUILD DIRTY: fix the warnings above before delivering." >&2 else echo "==> clean. Now do the visual audit (references/checklist.md)." fi exit $status