この例,思いっきり簡略化すると以下でエラーが起こるのと同様ではないかと思う.
\documentclass{article}
\begin{document}
\halign{#\cr
\iftrue
A
\cr
X % この行がないとエラーは起こらない.
\else
\cr
\fi
\cr
}
\end{document}
これを実行すると
! Incomplete \iftrue; all text was ignored after line 7.なるエラーが発生する.一見
\iftrue
,\else
,\fi
の釣り合いはとれているように見える.しかも「X」がないとエラーは起こらず,なんだか不思議である.
エラーの原因,次のような感じではなかろうか.まず\halign
について思い出しておこう.\halign
は
\halign{<u1>#<v1>&...&<un>#<vn>\cr % テンプレート行
<A1>&...&<An>\cr % 表の中身1行目
<B1>&...&<Bn>\cr % 表の中身1行目
...
<X1>&...&<Xn>\cr
}
のように使う.これを実行すると,
<u1><A1><v1> | ... | <un><An><vn> |
<u1><B1><v1> | ... | <un><Bn><vn> |
... | ||
<u1><X1><v1> | ... | <un><An><vn> |
もちろん<ui>,<vi>,<Ai>にはマクロを含めることができる.このマクロ展開のタイミングは原則としては次の通り(だと思う).追記:ZRさんのつぶやきを参考に少し訂正.(まだあまりすっきりわかってない.)
- テンプレート行は,
&
と\cr
を目印として区切られ,内部メモリに格納される. - 次に<A1>を読む.まず展開のみが行われ,先頭に展開不可能なトークンが現れるまで展開が行われる.
- <A1>を展開して得られた部分の<v1>が挿入され,トークン化,展開,実行が行われる.このとき
&
または\cr
を見たら\endtemplate
という特別なトークンを挿入する.これは\outer
なマクロとして扱われる.また,この部分に<v1>を挿入する. \endtemplate
に至ったらセルの構築を終了.- 以下繰り返し.
さて,最初の例をこのルールに従って追跡してみよう.
- <A1>の先頭行は
\iftrue
は展開可能である.その次のAは展開できないため,ここまでで展開は終了する. - 次の
\cr
まででで一行目が完成. - 二行目の先頭行はXであり,これは展開不可能.よって何も展開せずに終了.
- 二行目を作るために,TeXは読み込みを進める.このとき
\else
の後の\cr
には\outer
なマクロ\endtemplate
が付随していると見なされる. ...X\else <\outerなマクロ>
となりエラー.
「X」がない場合には,二行目の先頭行が\else
となり,展開が進み条件分岐が先に完結するためエラーにならない.
0 件のコメント:
コメントを投稿
コメントの追加にはサードパーティーCookieの許可が必要です