明治維新で新政府がTeXを旧来の陋習として弾圧したとき、TeX使いたちはわざとTeXの使い勝手を悪くすることで難を逃れたと伝えられています。 — TeXしぐさ
↑「適当にでっち上げた嘘です」と注記しようと思ったが元ネタも適当にでっち上げた嘘だった
TeXの気に食わない点…はきっと皆さんいろいろあると思うが、ここではTeX処理系の挙動に絞った話をする。ここに書いた挙動に関しては、TeXもpdfTeXもXeTeXも大差はないようである。
エラー時の挙動
結果だけ知りたい人は下の方のまとめを見てね。
TeXはデフォルトで、エラーが起こった時にユーザーの入力を求める。例えば、\hoge
という未定義のコマンドを含むファイルをコンパイルしてみよう。
$ cat test.tex⏎ \hoge $ tex test.tex⏎ This is TeX, Version 3.14159265 (TeX Live 2014) (preloaded format=tex) (./test.tex ! Undefined control sequence. l.1 \hoge ? ←なんでいちいちユーザーに応答を求めるんだ。一人じゃ何もできない子供か。⏎ Type <return> to proceed, S to scroll future error messages, R to run without stopping, Q to run quietly, I to insert something, E to edit your file, 1 or ... or 9 to ignore the next 1 to 9 tokens of input, H for help, X to quit. ? X⏎ No pages of output. Transcript written on test.log. $
このように、TeXはいろいろ選択肢を提示してくるが、正直言って「TeXのコンパイルを終了し、元々使っていたエディタに戻ってファイルを修正する」以外の行動(選択肢としては、上の実行例のように X⏎ で終了)を取る人がいるのか疑問である。
しかし、tex
はこれだけ広く使われているプログラムなのだから、きっと何かこの挙動を変えるオプションがあるはずである。tex -help
を実行してみよう。
$ tex -help⏎ Usage: tex [OPTION]... [TEXNAME[.tex]] [COMMANDS] or: tex [OPTION]... \FIRST-LINE or: tex [OPTION]... &FMT ARGS Run TeX on TEXNAME, usually creating TEXNAME.dvi. (略) If no arguments or options are specified, prompt for input. -enc enable encTeX extensions such as \mubyte [-no]-file-line-error disable/enable file:line:error style messages -fmt=FMTNAME use FMTNAME instead of program name or a %& line -halt-on-error stop processing at the first error -ini be initex, for dumping formats; this is implicitly true if the program name is `initex' -interaction=STRING set interaction mode (STRING=batchmode/nonstopmode/ scrollmode/errorstopmode) -ipc send DVI output to a socket as well as the usual output file (略) Email bug reports to tex-k@tug.org. $
長々とオプションが出てきたが、関係ありそうなのは
-halt-on-error stop processing at the first error
と
-interaction=STRING set interaction mode (STRING=batchmode/nonstopmode/ scrollmode/errorstopmode)
である。では -halt-on-error
を指定してみよう。
$ tex -halt-on-error test.tex⏎ This is TeX, Version 3.14159265 (TeX Live 2014) (preloaded format=tex) (./test.tex ! Undefined control sequence. l.1 \hoge No pages of output. Transcript written on test.log. $
そうだ、それでいい。これで万事解決。TeX処理系も大人になったものだ。
…と、そうは問屋が卸さない。「存在しないファイルを\input
させる」とどうなるか見てみよう。
$ cat test2.tex⏎
\input hoge.tex
$ tex -halt-on-error test2.tex⏎
This is TeX, Version 3.14159265 (TeX Live 2014) (preloaded format=tex)
(./test2.tex
! I can't find file `hoge.tex'.
l.1 \input hoge.tex
(Press Enter to retry, or Control-D to exit)
Please type another input file name: ^D
! Emergency stop.
l.1 \input hoge.tex
No pages of output.
Transcript written on test2.log.
$
なんてことだ、-halt-on-error
を指定したのにエラーで止まりやがった。TeX処理系はまだ親離れできない子供だった。
では今度は-interaction
を指定してみよう。だがちょっと待ってほしい。-interaction
の引数には何を指定すれば良いのだ?tex -help
の内容を思い出してみよう。
-interaction=STRING set interaction mode (STRING=batchmode/nonstopmode/ scrollmode/errorstopmode)
これによると、“batchmode”/“nonstopmode”/“scrollmode”/“errorstopmode” の4つのうちいずれかを指定すればよいらしい。だが、それぞれのオプションの意味が書いてない。
これらのオプションは実はTeXのinteraction mode assignmentコマンドの\batchmode
\nonstopmode
\scrollmode
\errorstopmode
に対応していて、The TeXbookとかTeX by Topicを読めばそれらの意味が書いてある。最初の実行例で言うと
Type <return> to proceed, S to scroll future error messages←\scrollmode, R to run without stopping←\nonstopmode, Q to run quietly←\batchmode, I to insert something, E to edit your file, 1 or ... or 9 to ignore the next 1 to 9 tokens of input, H for help, X to quit.
という対応になる。\errorstopmode
は最初の実行例のように「ユーザーに指示を仰ぐ」モードとなる。
ググった感じではこのへんが-interaction
の挙動についてよくまとまっている感じだった。
まとめ
エラー時の挙動については、このへんがよくまとまっていて、要するに
-halt-on-error -interaction=nonstopmode -file-line-error
を指定しておけばいいらしい。(-file-line-error
はエラーメッセージに
./test.tex:1: Undefined control sequence.
のようにファイル名と行番号を追加してくれる)
本当はTeX処理系の気に食わない挙動についてもう1個書こうと思ったが、エラー時の挙動について思ったより長くなったので、記事を分けてまた今度書くことにする。
LaTeXで書いたファイルの不具合が取れないことがしばしばあり、資料を整理しはじめました。URLを記載させてください。続きを期待しています。
エラーの挙動については、
おそらくUNIX時代の名残りだと思います。
時間でマシンの使用料がかかったものですから、出来るだけ処理の回数を減らすために、即時修正が出来たのでしょう。
本当にそれが理由かは分かりませんが、TEXブックに料金うんぬんの記述があります。
ピンバック: TeX の実行あれこれ | 雑記帳
ピンバック: TeX 実行の自動化ツールを作った (ClutTeX) | 雑記帳