マクロツイーター

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

unicode-math を完全に理解したい話(2)

前回の続き)

unicode-math の理論を完全に理解したい

「数式英字(sym系)」と「テキスト数式英字(math系)」の分離

unicode-math では、「単文字と複数文字の区別」を斜体以外の数式書体にも適用する。単文字識別子用の文字を「数式英字(math alphabet)」と呼び、複数文字識別子用の文字を「テキスト数式英字(text math alphabet)」と呼ぶ。*1後者にはテキストの欧文文字と同じ組版規則(リガチャなど)が適用される。

  • 「数式英字」の数式書体の区別については、Unicode の「数式書体付文字」で表す
    • 例えば、「斜体の x」(従来 LaTeX$x$ )は、論理的には“U+1D465 MATHEMATICAL ITALIC SMALL X”で表す。(※ただし後述の入力規則があるため、結局は従来通り $x$ で入力できる。
    • ただ「数式書体付文字」の入力は難しいので、命令による代替表記が用意されて、U+1D465 の代わりに \symit{x} と書くことができる。(MathML の fontvariant 属性のようなもの。)数式英字の書体指定用の命令は \sym<ラベル> という名前をもつ。*2引数には“基本の文字”*3を書く。
    • \sym<ラベル> による数式書体の変更は「別の文字に変えている」のであって、「別のフォントに変えている」のではないことに注意。
  • 「テキスト数式英字」への切替は、\math〜 という命令によって行う。すなわち、従来の LaTeX における数式英字フォント命令 \math〜 は単文字と複数文字の両方に使われたのに対し、unicode-math では \math〜複数文字用に限定したわけである。
    • テキスト数式英字命令は実際にフォントを切り替える。\math〜 の引数に指定するのは“基本の文字”であり、その文字がそのまま出力される。例えば、\mathit{x} は「斜体のフォント」の U+0078(基本の‘x’、U+1D465 ではない)の字形(これは「斜体の x」のはずである)が出力される。
    • フォントの切替であるため、Unicode「数式書体付文字」とは無関係である。\math〜 の部分も「数式書体付文字」のラベルではない。
    • 既定では、次の 5 つのテキスト数式英字命令が提供される。そして、これらはテキストフォントの設定と連動するようになっている。
      命令 説明 次のテキストフォントと同じ
      \mathrm 立体 \rmfamily\mdseries\upshape
      \mathbf 太字立体 \rmfamily\bfseries\upshape
      \mathit 斜体 \rmfamily\mdseries\itshape
      \mathsf サンセリフ立体 \sffamily\mdseries\upshape
      \mathtt 等幅 \ttfamily\mdseries\upshape
      \mathrm には \mathup という別名が存在する。((数式英字命令との整合性をとるなら \mathup が好ましく、従来との互換性をとるなら \mathrm が好ましいので、非常に悩ましい。))
    • テキスト数式英字命令はユーザが自由に追加定義できて、その際には使用するフォントを指定する。そのためのユーザレベル命令 \setmathfontface も用意されている。
\symnormal 命令

\symnormal 命令は、外側の数式英字命令(\sym〜)やテキスト数式英字命令(\math〜)の効果を打ち消して、英字書体の設定を初期状態に戻す。

\mathnormal\symnormal の別名である。

数式フォントの“軸”を再び考える

数式フォントは次の“軸”をもつのであった。

  1. 数式英字フォントの選択
  2. 数式バージョン
  3. フォントサイズ(テキストフォントと共通)

このうち、2 の数式バージョンについては、unicode-math でも扱いは全く変わらない。*43 は明らかに変わらない。1 については次のように変わる。

  • テキスト数式英字フォントの選択
    • 無指定:この場合は「数式英字」のフォントが使われる。従来の「数式イタリック」をはじめとして多彩な「数式書体付文字」が、この一つのフォントに含まれる。「数式書体付文字」は数式英字命令(\sym〜)で代用できる。
    • \mathrm:立体
    • \mathbf:太字立体
    • \mathsfサンセリフ立体
    • \mathit:斜体
    • \mathtt:等幅
    • ユーザ(パッケージ)により追加可能。\setmathfontface 命令が用意されている。

結局、根本的な枠組はあまり変わっていないようで、従来の「数式英字フォント」という概念が用途の限定された「テキスト数式英字フォント」に置き換わっただけ、ともいえそう。

※前述の通り、\mathcal は実用上は単文字識別子用であると見なせる。つまり「テキスト数式英字」ではなく「数式英字」の方に本来は属するため、代わりに \symscr を使うべきであろう。一応互換性のため \mathcal 命令が \symscr の別名として定義されている。((厳密にいうと \mathcal\symcal の別名であり、その \symcal は「ラテン大文字専用の \symscr」に相当するもので、\symscr 自体で常に代替できるため、あまり存在意義はないと思う。(恐らく“cal”という文字範囲を定義したためその副産物として生じたのであろう。)))さらに \mathfrak\symfrak の別名として定義されている。((他にも、\sym〜 のうち「本物の \math〜 命令と重複するもの(up、it、tt)」以外の全てについて、\math〜(例えば \mathbb\mathbfit 等)が別名として定義されている。))しかし、これらの互換用命令は「\math〜 という名前なのに実体が数式英字命令である」という点で非常に紛らわしいので、使用は避けるべきであろう。

unicode-math では \mathnormal(= \symnormal)は「無指定」状態に戻す働きをもつ。

*1:unicode-math のマニュアルでは「テキスト数式英字」について「legacy math alphabet」という用語も用いられているが、両者の数式英字は使い分けるべきものであって、テキスト数式英字が“obsolete”となったわけでは決してないので、この用語は紛らわしいと思う。

*2:「ラベル」は「Unicode の『数式用の書体指定付き文字』」の節で紹介した、it、frak、bfup などの文字列のこと。

*3:テキストと共用されている、本来は立体用の文字のこと。

*4:数式バージョンが変わると、フォントが変わることになる。