マクロツイーター

はてダから移行したばかりなので表示が崩れてますが、そのうちに直せればいいのに(えっ)

きょうの LuaTeX (4) ー \Ustack

  • \Ustack{<サブ数式>} : [一般] 汎化分数を含むサブ数式のグループの前に \Ustack を前置すると、そのサブ数式内での \mathstyle が“正しくなる”。

前回の「きょうの LuaTeX」では、\mathstyle という「現在の数式スタイルを判定する」ためのプリミティブを紹介した。既にそこで述べたように、\over\abovewithdelims などの「汎化分数」のサブ数式の中では、“TeX の実装上の制限”のため、\mathstyle が正しい値を返せない。この制限を緩和する目的で用意された拡張プリミティブが \Ustack である。汎化分数をなすグループ({...} で囲われた部分)の直前にこれを配置すると、グループの中で \mathstyle が正しい数式スタイルの情報を返すようになる。

% plain LuaTeX 文書
\input showms.def
\def\X{X\showMS}
$\X = {\X \over \X}$        %==>"T T T'"(誤)
$\X = \Ustack{\X \over \X}$ %==>"T S S'"(正)
\bye

(showms.def は前回の記事で掲載したものと同じ)

ちなみに、\Ustack の直後にあるサブ数式がは汎化分数でなかった場合の挙動については(マニュアルでは)何も規定されていない。現状の実装ではエラーや警告は出ず、かつ \mathstyle は汎化分数であることを仮定しているので誤った情報を返すようである。((そもそも \Ustack の直後にあるものがグループ({...})でない場合、それが何であるかによって、エラーが発生の有無は異なるようである。))

% plain LuaTeX 文書
\input showms.def
\def\X{X\showMS}
$\X = \Ustack{\X}$        %==>"T S"(誤)
\bye

前回と今回の話をまとめると、以下のようになる。

  • 従来の TeX エンジンでは「現在の数式スタイルがどれか」を得るには(非常に不便な)\mathchoice を使うしかなかった。
  • LuaTeX では「現在の数式スタイルがどれか」の情報をその場で返す \mathstyle というプリミティブが新設された。
  • しかしそれを使いたいのであれば、数式の書き方に関して、「汎化分数の前に必ず \Ustack を付ける」という規約を設定する必要がある。

LaTeX で分数や汎化分数を書く場合には \frac 命令や(amsmath パッケージの)\genfrac 命令が用いられる。当然ながらこれらの命令の定義には「\Ustack 無しのプリミティブの汎化分数」が使われている。従って、残念ながら現状の LuaLaTeX では \mathstyle を利用した機能実装はまだ使えないのである。