LaTeX のコンパイルを自動化するスクリプト - ドラフト版のバージョン情報・タイムスタンプも

LaTeXコンパイルを, jbibtex のコンパイルも含めて(自動的に判断される),自動化するスクリプトを書いた.また,昨日の記事 作成時刻やバージョン情報を PDF にスタンプする を使って,バージョン情報,リビジョン情報,タイムスタンプなどをドラフトバージョンに付加できるようにした.

使い方

ソースは後述.

  qlatex hoge.tex

でふつうに hoge.texコンパイルhoge.dvi, hoge.ps, hoge.pdf が生成される.リビジョン番号は1インクリメントされる.

  qlatex hoge.tex -d

でドラフト版コンパイル.リビジョン番号は1インクリメントされる.hoge.pdfの左上に paperid (paperid.dat に保存されている),中央上にタイムスタンプ,右上にバージョン情報 (version.dat と revision.dat に保存されている. revision.dat の数字は読み込んでからインクリメントされる) をそれぞれ表示する.

  qlatex hoge.tex -d -v 3

バージョンを 3 に変更し,コンパイル.リビジョン番号はゼロにリセットされる.

  qlatex hoge.tex -d -v++

バージョンを1だけインクリメントし,コンパイル.リビジョン番号はゼロにリセットされる.

  qlatex hoge.tex -d -pid 'HATEDA'

paperid を 'HATEDA' に変更し,コンパイル. '\begin{large}HATEDA\end{large}' みたいに, LaTeX のコマンドが使える.
この情報は paperid.dat に保存されて,次回からは -pid を指定しなくても自動で読み込まれる.

qlatex

#!/bin/bash
usage="`basename $0` OPTIONS INPUT_FILENAME
  OPTIONS:
    [-p PAGE_SIZE]()
    [-d] : draft version
    [-v++] : increment VERSION (saved to version.dat)
    [-v VERSION] : assign VERSION (saved to version.dat)
    [-pid PAPER_ID] : assign PAPER_ID (saved to paperid.dat)
    [--] : terminate to parse option
    [-help] : show help"
#--------------------------------------------------

src=''
opt_dvips=''
opt_dvipdfmx=''
draft=0

if [ -f version.dat ];then
  version=`head -n1 version.dat`
else
  version=0
fi
if [ -f revision.dat ];then
  revision=`head -n1 revision.dat`
  revision=$((revision+1))
else
  revision=0
fi
if [ -f paperid.dat ];then
  paperid="`cat paperid.dat`"
else
  paperid=''
fi

#--------------------------------------------------

while true; do
  case "$1" in
    # -i) src="$2"; shift 2 ;;
    -p)
        opt_dvips="-t $2"
        opt_dvipdfmx="-p $2"
        shift 2 ;;
    -d) draft=1; shift ;;
    -help|--help) echo "usage: $usage"; exit 0 ;;
    -v++) version=$((version+1)); revision=0; shift 1 ;;
    -v) version=$2; revision=0; shift 2 ;;
    -pid) paperid=$2; shift 2 ;;
    ''|--) shift; break ;;
    *)
        if [ -z "$src" ];then
          src=$1
          shift 1
        else
          echo "unexpected option '$1'" >&2
          echo ''
          echo "usage: $usage"
          exit 1
        fi
        ;;
  esac
done

if [ -z "$src" ];then
  echo "error! specify the INPUT_FILENAME."
  echo ''
  echo "usage: $usage"
  exit 1
fi

#--------------------------------------------------

fname=`echo ${src} | sed 's/\(.\+\)\(\..\{1,10\}$\)/\1/'`
fps="${fname}.ps"
faux="${fname}.aux"
fdvi="${fname}.dvi"
fpdf="${fname}.pdf"
bibtexcmd=jbibtex

if platex ${src}; then
  biberr=0
  if [ `grep 'citation' ${faux} | wc -l` -gt 0 ]; then
    if ! ( $bibtexcmd ${fname} && platex ${src} ) then
      biberr=1
      # exit 1
    fi
  fi
  if platex ${src}; then
    echo "generated: "${fdvi}
    if dvips ${opt_dvips} -o ${fps} ${fdvi}; then
      echo "generated: "${fps}
    else
      echo "error in generating ${fps}"
      exit 1
    fi
    if dvipdfmx ${opt_dvipdfmx} -o ${fpdf} ${fdvi}; then
      echo "generated: "${fpdf}
    else
      echo "error in generating ${fpdf}"
      exit 1
    fi
  fi
  if [ $biberr -ne 0 ];then
    echo "error in ${bibtexcmd}. check ${fname}.blg"
  fi
else
  exit 1
fi

#--------------------------------------------------

echo $version > version.dat
echo "version is saved to version.dat: $(cat version.dat)"
echo $revision > revision.dat
echo "revision is saved to revision.dat: $(cat revision.dat)"
echo $paperid > paperid.dat
echo "paperid is saved to paperid.dat:"
cat paperid.dat

if [ $draft -eq 1 ];then
  tmpfile1=/tmp/qlatex_version_$$.pdf
  tmpfile2=/tmp/qlatex_date_$$.pdf
  tmpfile3=/tmp/qlatex_pid_$$.pdf
  tmpfile4=/tmp/qlatex_draft_$$.pdf
  pdfstamp -t "\begin{Large}ver. $version.$revision\end{Large}" -p rt -f -o $tmpfile1
  pdfstamp -t "`date -R`" -p ct -f -o $tmpfile2
  pdfstamp -t "$paperid" -p lt -f -o $tmpfile3
  pdftk ${fpdf} stamp $tmpfile1 output - \
      | pdftk - stamp $tmpfile2 output - \
      | pdftk - stamp $tmpfile3 output $tmpfile4
  mv -v $tmpfile4 ${fpdf}
  rm $tmpfile1
  rm $tmpfile2
fi