記号の幅をいいかんじに揃える

LaTeXBNF 的なものを書くときに,::= や | の記号をいいかんじに揃えたい.

縦に並べるだけなら 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*}


いいかんじ.