TeXの記憶(49) — eqnarrayを再定義してスペースをなくす

TeXの記憶(48) — 複数に1つの式番号の後半ではeqnarrayを使いました。eqnarrayをjbook.clsなどを使うと「&」で囲まれた演算子などの周りに無駄なスペースが入ってしまいます。

0920

jsbook.clsではクラスファイルの中でeqnarrayを再定義しているのでスッキリと表示されます。式が左寄せか右寄せか設定するfleqnオプションにも対応しているので便利ですが、書籍などでは独自のクラスファイルを使っているので他のクラスでも使えるように再定義したeqnarrayを使っています。

この定義は、fleqnオプションに連動しないため数式の左寄せ/中央寄せに合わせて手動で\ifMathCeterをスイッチします。左寄せの場合は

% \newdimen\mathindent
\mathindent=3zw

のような設定も必要になります。

とは言うものの、数式を揃えるならAMS-LaTeXのalignを使ったほうがずっと便利なんですが、受け取る原稿の中にはeqnarrayを使われていることも多いので書籍の組版ではいつも読み込んで使っています。

マクロでは、&と&の間に入る「モノ」を\mathrelで囲んで演算子扱いにしているので、その両側のスペースも演算子の両側のスペースになる、という具合です。

\newif\ifMathCenter
% \MathCenterfalse
\MathCentertrue
...
\def\eqnarray{\stepcounter{equation}%
  \def\@currentlabel{\p@equation\theequation}%
  \bgroup
\ifMathCenter                 % 中央揃え
  \global\@eqnswtrue \m@th \global\@eqcnt\z@ \tabskip\@centering \let\\\@eqncr
  $$\everycr{}\halign to \linewidth\bgroup
  \hskip\@centering $\displaystyle\tabskip\z@skip{##}$\@eqnsel%
   &\global\@eqcnt\@ne \hfil$\displaystyle{}\mathrel{##}{}$\hfil
   &\global\@eqcnt\tw@      $\displaystyle{##}$\hfil\tabskip\@centering
   &\global\@eqcnt\thr@@ \hb@xt@\z@\bgroup\hss##\egroup
   \tabskip\z@skip
   \cr
\else                           % 左揃え
  \global\@eqnswtrue \m@th \global\@eqcnt\z@ \tabskip\z@ \let\\\@eqncr
  $$\everycr{}\halign to \linewidth\bgroup
  \hskip\mathindent\hfil $\displaystyle\tabskip\z@skip{##}$\@eqnsel%
  &\global\@eqcnt\@ne \hfil$\displaystyle{}\mathrel{##}{}$\hfil
  &\global\@eqcnt\tw@      $\displaystyle{##}$\hfil\tabskip\@centering
  &\global\@eqcnt\thr@@ \hb@xt@\z@\bgroup\hss##\egroup
  \tabskip\z@skip
  \cr
\fi}
\def\endeqnarray{%
  \@@eqncr \egroup \global\advance\c@equation\m@ne
  $$\@ignoretrue
  \egroup}

\@namedef{eqnarray*}{\def\@eqncr{\nonumber\@seqncr}\eqnarray}
\@namedef{endeqnarray*}{\nonumber\endeqnarray}

コメント