記号の幅をいいかんじに揃える
LaTeX で BNF 的なものを書くときに,::= や | の記号をいいかんじに揃えたい.
縦に並べるだけなら eqnarray 環境でやればいいかんじに揃う.
\begin{eqnarray*} t &::=& x \\ &|& t + t \\ &|& t - t \\ &|& t \times t \\ &|& t \div t \\ \end{eqnarray*}
しかし一行に複数の要素を書きたいときがある.それを
\begin{eqnarray*} t &::=& x \\ &|& t + t | t - t \\ &|& t \times t | t \div t \\ \end{eqnarray*}
と書いてしまうと,途中の | の幅がかなり小さくて見栄えが悪い.
\; とか \quad とかでスペースを調整するのも面倒だし,揃ったとしてもアドホックなかんじがする.(下図は \; でスペースを入れてみた場合)
そこで,\settowidth で ::= の幅を取得して,\makebox で | の幅をそれに合わせる形にしてみた.
\newcommand{\bnfdef}{::=} \newlength{\len} \settowidth{\len}{$\bnfdef$} \newcommand{\bnfor}{\makebox[\len]{$|$}} \begin{eqnarray*} t &\bnfdef& x \\ &\bnfor& t + t \bnfor t - t \\ &\bnfor& t \times t \bnfor t \div t \\ \end{eqnarray*}