LaTeX タイプセットスクリプト(SemiAutoTeX)

数式番号やページ番号はタイプセットすることで決まるので、それらの数字を参照して表示させるためにタイプセットを繰り返す必要がある。さらに面倒な bibtex 実行は、その前にまず一回タイプセットし、その後に bibtex を実行し、さらにその後に二回タイプセットしないと、正しいプレビューを得られない。

このような LaTeX タイプセットを自動処理する latexmk という Perl スクリプトがある。 必要な処理を全て自動判定してくれる。しかし、判定のために余計に時間がかかるので、作業するマシンによっては遅いとかんじるかもしれない。

YaTeX は次のバージョン(1.76)から auto-rerun 機能が追加される予定になっている。しかし、bibtex を利用している場合に、タイプセットの回数が常に倍になってしまうというデメリットがあり、仕様変更を提案している。その提案している試用の動作確認のために書いたシェルスクリプトがこれだ。YaTeX はもともとタイプセット(C-c C-t j)だけでなく、bibtex や makeindexの実行も Emacs 上からできた(C-c C-t b や C-c C-t i)ので、latexmk のように全ての状況に対応する1つの命令にしなくても、3つそれぞれの処理が賢くなればそれなりに便利ではないだろうか、という提案。bibtex を実行する必要があるとか、makeindex が実行する必要があるというタイミングはユーザーが決めるけど、latexbibtexlatexlatexと手動で順番通り実行する必要はなく、? を見る頻度はずっとすくなくなる。

特徴

ここで試しているシェルスクリプトは、LaTeX の再実行は自動判定だけど、bibtex や makeindex の実行はユーザーが呼び出す必要がある。ただ、予め実行順序が決まっている事なので、YaTeXの C-c C-t b (又はShift+Command+B) で一度呼び出せば必要な処理は一括でしてくれる。この呼び出しを自動でするわけではないので「半自動」のスクリプトだ。普通の入力作業で bibtex を実行する必要がある回数は、普通の LaTeX 実行より圧倒的に少ない。おそらく一つの原稿を完成させるまでに LaTeX を3000回実行するとすると、bibtex の実行回数は100回くらいではないかと思う。

スクリプトの仕様

  • ホームディレクトリの設定ファイル .semiautotexrc でコマンドを指定する。
    • dvipdf が設定されている時は DVI からPDFファイルを生成する。
  • LaTeX 実行は .aux ファイルが変更される限り繰り返す。
    • 参照番号(\ref)、目次(\tableofcontents)を一度の呼び出しで正しくアウトプット
    • .aux ファイルの更新の為に md5 を二回使っているけど必要な時間は合計で0.01秒以下。
    • 1回実行:既に typeset 済みのファイルで、新しい編集が文章のみの場合。目次を付ける場合はセクションのページ番号が変更されない場合。
    • 2回実行:番号付き数式を追加、sectionを追加等。
    • 3回実行:目次のページ数が変化する場合。(@at_aka さんに教えていただいた。
  • BibTeX 実行は LaTeXbibtexLaTeXLaTeX という順序で実行する。
  • MakeIndex 実行は LaTeX(auxをみて繰り返し)→makeindex→LaTeX という順序で実行する。
  • pdflatex を使う時は draftmode オプションを使って、PDF出力の回数を減らす。

処理速度の比較

処理速度の比較 (12ページで12個の図、文献引用36件、数式43個を含む論文の原稿(執筆中!)を10回測定。time コマンドの real の値。MacBook, 2.2Ghz Core 2 Duo

通常の編集で LaTeX を一回実行する必要がある場合

  • pdflatex: 1.19 ± 0.2 sec
  • latexmk: 2.06 ± 0.1 sec
  • semiautotex.sh: 1.19 ± 0.2 sec

bibtex を実行する場合(latexmk は自動判定で実行、semiautotex.sh は -b オプションで実行。LaTeX処理が三回必要なので上の時間の3倍が妥当な時間。)

  • latexmk: 7.70 ± 0.7 sec
  • semiautotex.sh: 3.73 ± 0.2 sec

YaTeXEmacs 上でタイプセットを実行した時の処理時間を計測できるようになっていたので、「通常の編集で LaTeX を一回実行する必要がある場合」を比較してみた。(現在の開発版YaTeX で試されている auto-rerun では bibtex を利用している書類をタイプセットする時に常に typeset + bibtex + typeset と二回タイプセットするようになっている。changeset 262

  • YaTeX auto-rerun: 3.3 ± 0.2 sec
  • semiautotex.sh: 1.2 ± 0.1 sec

動画で比較。


YaTeX の設定

YaTeXの設定は以下のようになる。
~/emacs.d/my_yatex.el