マクロツイーター

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

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

前回の続き)

数式英字の話をもうチョット

デフォルトなフォントの話

あの数式をもう一度見てみよう。

一連の記事の冒頭に出てきた数式である。これまで、\mathrm などの数式フォント命令で「数式英字」のフォントが切り替わる、ということを説明したわけだが、そこで問題である。この(数式フォント命令が未適用の)デフォルトの状態で「数式英字」に使われるフォントは何だろうか。

答えは、「文字によって異なる」というものである。

  • 数字およびギリシャ大文字については、operators の数式記号フォント(前回述べたように、これは \mathrm の数式英字フォントと兼用されている)が使われる。
  • ラテン文字については、letters の数式記号フォント(OML/cmm/m/it)が使われる。それはいわゆる「数式用イタリック」のフォントである。
初回の記事にある文字コード表を参照されたい。)
デフォルトなフォントの設定

この”文字ごとに異なるデフォルトのフォント”を決めているのは \DeclareMathSymool 命令である。以前の記事では、数式英字以外の文字についてこの命令を用いて定義する方法を述べたが、実は、この命令は数式英字の定義にも用いられるのである。 数字の例として〈4〉、ラテン文字の例として〈n〉を取り上げる。これは LaTeX カーネルで次のように定義されている。

\DeclareMathSymbol{4}{\mathalpha}{operators}{`4}
\DeclareMathSymbol{n}{\mathalpha}{letters}{`n}

このように、\DeclareMathSymbol の第 2 引数が \mathalpha となっているならば、当該の文字(あるいは制御綴)は数式英字として定義される。そしてこの場合に第 3 引数に与えた数式記号フォントが“デフォルトのフォント”を表しているのである。これに従い、デフォルトの状態で〈4〉は operators のフォント、〈n〉は letters のフォントで出力されるわけである。

チョット補足
  • 数式英字(種別が \mathalpha である文字)は、数式組版上の振舞いについては種別が \mathord の文字と等価になる。つまり「通常の記号、文字」として扱われる。
  • フォントが変わっても、出力文字の符号位置は変わらない、つまり、\DeclareMathSymbol の第 4 引数の値となる。((つまり、もし \DeclareMathSymbol{4}{\mathalpha}{operators}{`5} のような定義を行うと、数式中で〈4〉を入力すると「5」が出力されることになる。))
  • 要するに種別が \mathalpha である文字が数式英字である。なので、「どの文字が数式英字であるか」の範囲は \DeclareMathSymbol 命令の実行により変わる。

数式でハイフンしたい話

計算機科学の分野では、(プログラミング言語と同様に)“複数文字の識別子”が多用される。そして、そのような識別子にハイフンを含めたいことがある。しかし、周知のとおり、数式中で 〈-〉を書くとそれはマイナス記号と解釈されてしまう。((LaTeX では \DeclareMathSymbol{-}{\mathbin}{symbols}{"00} と定義されているので、〈-〉は数式フォント命令の影響を受けない。))

$\mathit{common-prefix}(w_1,w_2)$

数式中でハイフンを出力したい場合によく用いられる方法は、「一時的にテキストに切り替える」、つまり \text{-}((もちろん、この \text は amstext パッケージの命令。))とすることである。しかし、テキスト扱いにするということは当該の数式の外側にあるテキストのフォント設定を引き継ぐ事になるので、都合が悪い場合もある。

% (amstext 読込済)
\newcommand*{\mhyph}{\text{-}}
% ハイフンが太字になってしまう!
{\bfseries The definition of $\mathit{common\mhyph prefix}(w_1,w_2)$.}

本来ならば「その箇所での数式フォント指定」(今の場合は \mathit)と“整合”してほしいのであるが、(La)TeX ではテキストと数式のフォント指定は全く独立なので、「テキストへの切替」を利用している限り、「どんな場合でも正しいフォントで出力する」ようにマクロ \mhyph を定義することは困難である。

しかし、「ハイフンの文字を数式英字として扱う」ことにするとこの問題はあっけなく解決してしまう。数式英字のフォントは当然数式フォント命令に追随するからである。そこで、「数式英字としてのハイフン」の命令 \mhyph を定義してみよう。

% 最初の 2 つの引数は確定
\DeclareMathSymbol{\mhyph}{\mathalpha}{???}{???}

後ろの 2 つの引数の値はどうすればいいだろうか。まずは符号位置を考えよう。数式英字フォントは OT1 のエンコーディングをもつのであった。ということは、OT1 でハイフンがある符号位置、すなわち ASCII の〈-〉の符号位置を表す {`-} を指定すべきである。((敢えて 16 進数で書くと {"2D}。))

あとは、デフォルト状態で適用される数式記号フォントを決める必要がある。といっても、デフォルト状態でハイフンが用いられることはまず無さそうである。*1まあ取りあえず“ハイフンが出れば”いいことにしよう。LaTeX で標準で定義される数式記号フォントのうち、ASCII の〈-〉の位置("2D)にハイフンがあるのは operators だけであるので、これを指定すれば十分であろう。

以上より、\mhyph を定義するための命令は以下のようになる。

% 数式記号命令 \mhyph の定義
\DeclareMathSymbol{\mhyph}{\mathalpha}{operators}{`-}

実際に出力を確かめてみよう。

% LaTeX 文書
\documentclass[a4paper]{article}
\usepackage{amsmath}
\DeclareMathSymbol{\mhyph}{\mathalpha}{operators}{`-}
\begin{document}
\begin{gather*}
  \mathit{common\mhyph prefix}(w_1,w_2) \\
  \mathsf{common\mhyph prefix}(w_1,w_2) \\
  \mathtt{common\mhyph prefix}(w_1,w_2) \\
  \alpha\mhyph1 \qquad \beta\mhyph2  % デフォルト状態のテスト
\end{gather*}
\end{document}

演習問題⑤

LaTeX の既定では、〈?〉の文字は数式英字でなく常に直立体で出力される。

〈?〉の文字を数式英字に変更した上で、次の数式を出力せよ。

演習問題⑥

LaTeX の(数式フォント命令が未適用の)デフォルトの状態では、ラテン文字の大文字・小文字およびギリシャ文字の小文字はイタリック体になるが、ギリシャ文字の大文字だけは直立体で出力される。*2ギリシャ文字の大文字の命令(\Gamma 等)を、デフォルトの状態でイタリック体となるように再定義せよ。

*1:デフォルト状態のラテン文字のフォントは“数式用イタリック”であり、これは“複数文字の識別子”を記すのには決して用いられないからである。

*2:米国の数式組版の習慣に基づくらしい。