マクロツイーター

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

チョット数式フォントしてみる話(4)

前回の続き)

“変わりゆく”かつ“変わらない”もの

CM Roman で如何に数式するか

ところでここでもう一度初回の記事を読み返してほしい。そこでは、LaTeX のデフォルトの設定について次のように述べられている。

  • 数式英字フォント \mathrm として OT1/cmr/m/n が割り当てられている。
  • 数式記号フォント“operators”として OT1/cmr/m/n が割り当てられている。

(この OT1/cmr/m/n というシェープは、“LaTeX のデフォルトのテキストフォント”である「Computer Modern Roman」のことである。)

ここで問題であるが、この設定を実現するためにはどのような命令を実行すればよいであろうか。ここまで読み進めてきた読者ならば次の答えを得るのは容易いことだろう。

% 数式英字フォント \mathrm の登録
\DeclareMathAlphabet{\mathrm}{OT1}{cmr}{m}{n]
% 数式記号フォント "operators" の登録
\DeclareSymbolFont{operators}{OT1}{cmr}{m}{n]

もちろんこれで意図通りに動作する。しかしこの設定には大きな問題がある。それは「貴重な資源を浪費している」ということである。

数式フォント登録は“貴重な資源”

LaTeX において \DeclareMathAlphabet\DeclareSymbolFont で登録する数式フォントの個数には、実は次のような非常に厳しい上限がある。

数式フォントは 16 個しか登録できない。

すなわち、数式フォントの“登録枠”というのは LaTeX における“稀少資源”なのである。ところが、先のコードのように、同じ OT1/cmr/m/n を \DeclareMathAlphabet\DeclareSymbolFont で別々に登録すると、登録枠を 2 つ使ってしまうことになる。同じものなんだから“再利用”できないだろうか。

operators で \mathrm する話

実はそれは可能で、LaTeX では「数式英字フォントと数式記号フォントを兼用」させるための命令を用意している。

  • \DeclareSymbolFontAlphabet{\数式フォント命令}{<数式記号フォント名前>} : 既存の数式記号フォントを数式英字フォントとして兼用し、それを使用するための数式フォント命令を定義する。

つまり、1 つの OT1/cmr/m/n を数式英字フォント \mathrm と数式記号フォント operators の両方として用いるには、次のようにすればよい。

% まず数式記号フォント "operators" を登録する
\DeclareSymbolFont{operators}{OT1}{cmr}{m}{n]
% operators を \mathrm として兼用する
\DeclareSymbolFontAlphabet{\mathrm}{operators}

この方法だと登録枠を 1 つしか使わない。実際に LaTeXカーネルはこのように登録している。

symbols で \mathcal する話

LaTeX のデフォルト設定では他にも数式フォントを兼用している例がある。symbol 数式記号フォントこと CMS/cmsy/m/n を見てみよう。

LaTeX 標準の〈×〉(\times)、〈≥〉(\geq)、〈∈〉(\in)などの多くの記号がこの数式記号フォントから得られているのであるが、よく見ると、符号位置 "41〜"5A、つまり ASCII の A〜Z の位置には、筆記体\mathcal)の A〜Z が入っている。ここから判るように、この数式記号フォントは \mathcal の数式英字と兼用されているのである。

\DeclareSymbolFontAlphabet{\mathcal}{symbols}

ただし筆記体の書体はラテン大文字(A〜Z)以外はそもそも用意されていないので、このフォントでは他の数式英字フォントと異なり、ラテン大文字以外の「数式英字」の符号位置には別の文字(記号)が割り当てられている。(例えば OT1 の〈1〉の符号位置 "31 には〈∞〉が入っている。)\mathcal の引数にラテン大文字以外を含めると「文字化け」が起こるのはこのためである。

$\mathcal{ABCabc123}$

演習問題④

ifsym パッケージが提供する ifsym10 フォント(TFM)は次のようなエンコーディングを持っている。

これを次のような要件で数式フォントとして使えるようにせよ。

  • この中の符号位置 "02 の記号((ifsym パッケージでは \FilledSectioningDiamond という(テキスト用の)命令が用意されている。))を二項演算子として用いる数式記号命令 \myDiamond を定義する。
  • さらに、"30〜"39 にある数字の字形(7 セグメント字形、いわゆる“電卓文字”)を数式フォント命令 \mathsseg で指定できるようにする。(\mathsseg に数字以外を入れた場合は「文字化け」してもよい。本文中に出てきた \mathcal と同様の話である。)
  • 文字サイズのバランスをとるために 0.65 倍にスケールする。

その上で以下の数式を出力せよ。