読者です 読者をやめる 読者になる 読者になる

TeXで強制改行コマンドの後に角括弧をつけるとエラーを吐く理由と対策について

はじめに

はまった上にこれについて書いてある記事なども見つからなかったので備忘録的に残します.

強制改行(\\)の後に角括弧([])を使うと謎のエラーが

LaTeXを書いている時に

[1] http://hoge.hoge.com \\
[2] http://fuga.fuga.com

の部分でエラーが発生しました. しかも,エラーの内容は???でした.

! Illegal unit of measure (pt inserted).

このエラーはTeXで定義されていない寸法単位が使われている時に出るエラーです.
寸法単位なんかどこにも出てきていないしエラーとは関係なさそうに見えます.
この症状は環境が異なっても起こりました.自分は以下の環境で試しました.

  • TeXLive 2015
    • e-pTeX + dvipdfmx
    • LuaTeX

問題は強制改行(\\)のオプション引数

強制改行もTeXのマクロの一つです.よく調べてみると強制改行はオプション引数を取るみたいです.

\\[10pt]

などとすると行間を10pt空けて改行してくれるみたいです.
つまり強制改行のオプション引数は行間の幅を指定する為のもので
強制改行後の角括弧はオプション引数としての括弧として認識されてしまったということです.
角括弧の中の数字には寸法単位がついていない為先述したような謎のエラーが出たという訳です.

なぜ,強制改行(\\)と角括弧([])は違う行にあるのにこのような症状が出るのか

これにはTeX組版としてのルールが絡んできます. 今回影響したTeXの性質として次のような性質があります.

  • (空行以外の)改行文字は空白文字になる
  • 行頭と行末にある空白文字・タブは全て無視される

これにより強制改行と角括弧の間の改行文字が無視されたという訳です.

解決策

これを解決するには強制改行の後に\relaxというコマンドを入れます. つまり以下のようにすれば解決します.

[1] http://hoge.hoge.com \\ \relax
[2] http://fuga.fuga.com

\relaxは「なにもしない」コマンドです.しかし,これが大いに役に立ちます.
\relaxはオプション引数を取らないので角括弧がオプション引数としての括弧として認識されないからです.

最後に

今回はこうなる理由が知りたかったので合わせて解決も書きましたが
本当は強制改行は極力使わない方が良いと思います.
今回の解決策を施したところで1行目が段落の始まりで字下げを行っているので2行目と行頭が揃っていません.
字下げを行わないコマンドもありますがそれならverbatim環境などを使った方がまだいいと思います.
一番良いのは参考文献の記述を人力でやるのではなくthebibliography環境などを使うことだと思います.