マクロツイーター

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

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

前回の続き)

演算子を☃にする話

LaTeX を使って、次のような「群の定義」の文章を書いているとする。

ここでは定義中で使う「群の演算」の記号を * にしている。もちろんこれでも構わないのであるが、折角 LaTeX を使っているのだから、定義中で用いる演算子として、ゆきだるま〈☃〉を使いたいというのは当然の要求であろう。

というわけで、ここでは「二項演算子としての☃」を出力する数式記号命令 \Snowman を定義してみよう。

☃できるフォント

☃を使いたいのであれば、まずは☃を含むフォントを NFSS で登録する必要がある。 (JIS X 0213 対応の)和文フォントには☃があるというのは有名であろうが、欧文の LaTeX でも使いたいので、ここでは☃を含む欧文フォントが必要である。*1そこで、CJK パッケージで用いるための Unicode サブフォントを流用することにする。具体的には「IPAex 明朝」フォントの Type1 版サブフォントの中の ipxm-r-u26 を利用する。ひょっとしたら「Unicode サブフォント」についてはチョット理解が足りていない人もいるかも知れないが、心配は無用である。要するに次のようなエンコーディングをもつ欧文フォント(TFM)ipxm-r-u26 があって、その中の符号位置 "03 にある☃を利用したいというわけである。

[欧文フォント ipxm-r-u26]

まずはこのフォント(TFM)を NFSS に登録する。*2シェープ指定は U/mipxmA/m/n としておこう。*3

\DeclareFontFamily{U}{mipxmA}{}
\DeclareFontShape{U}{mipxmA}{m}{n}{<->ipxm-r-u26}{}
☃な数式記号フォント

次に、このフォントを数式記号フォントとして登録する。それには次の命令をもちいる。

  • \DeclareSymbolFont{<名前>}{<エンコーディング>}{<ファミリ>}{<シリーズ>}{<シェープ>} : 後ろの 4 つの引数で示されるフォントシェープを新たに数式記号フォントとして登録する。

ここでは、フォントシェープ U/mipxmA/m/n を数式記号フォント“mipxmA”として登録する。

% 数式記号フォント mipxmA を登録
\DeclareSymbolFont{mipxmA}{U}{mipxmA}{m}{n}
☃な数式記号

数式英字フォントの場合はフォントを登録すれば作業完了であったが、数式記号フォントの場合はそれだけでは役に立たない。数式記号命令を定義する必要がある。

  • \DeclareMathSymbol{<記号>}{<種別>}{<数式記号フォント名前>}{<符号位置>} : 数式記号を定義する。
    • <記号> には制御綴または(非特殊な)文字 1 つを指定する。前者の場合、その制御綴が数式記号命令として定義される。*4後者の場合、数式中にその文字を書いた場合に出力される記号を規定(変更)する。
    • <種別> はその記号の数式組版上の分類(TeX 言語でいう「数式クラス」((実際にここで挙げた制御綴(\mathbin 等)のセットは数式クラスを指定するためのプリミティブのセットとほとんど同じである。ただし、\mathinner が無くて代わりに \mathalpha があるという点が異なる。)))を表し、次の何れかの制御綴を指定する。*5
      • \mathord : 通常の記号、文字
      • \mathop : 大型演算子
      • \mathbin二項演算子
      • \mathrel : 関係演算子
      • \mathopen : 開き括弧類
      • \mathclose : 閉じ括弧類
      • \mathpunct : 句読点類
      • \mathalpha : 数式英字
      注意:
      • 大型演算子\mathop)以外の単項演算子については、〈+〉のように二項演算子を兼ねるものについては \mathbin にする。それ以外のもの、例えば〈∀〉(\forall)については \mathord にする。
      • \mathalpha(数式英字)については後日説明したい。

今の場合、☃は mipxmA の符号位置 "03 であり、かつ二項演算子として扱うので次のようになる。

% 数式記号 \Snowman の定義
\DeclareMathSymbol{\Snowman}{\mathbin}{mipxmA}{"03}
☃な数式を出力する

これまでの定義を合わせて、☃な数式を出力してみよう。

\documentclass[a4paper]{article}
\DeclareFontFamily{U}{mipxmA}{}
\DeclareFontShape{U}{mipxmA}{m}{n}{<->ipxm-r-u26}{}
\DeclareSymbolFont{mipxmA}{U}{mipxmA}{m}{n}
\DeclareMathSymbol{\Snowman}{\mathbin}{mipxmA}{"03}
\begin{document}
\[ (a \Snowman b) \Snowman c = a \Snowman (b \Snowman c) \]
\end{document}

これを見ると、少し☃が大きすぎてバランスが悪いようである。なので、フォントシェープの定義においてフォントにスケールを適用して相対的に小さくなるようにしてみる。

\DeclareFontShape{U}{mipxmA}{m}{n}{<->s*[0.8]ipxm-r-u26}{}

これで大分いい感じになったようだ。

☃な完成品
\documentclass{article}
\usepackage[a6paper]{geometry}
\usepackage{amsmath}
\DeclareFontFamily{U}{mipxmA}{}
\DeclareFontShape{U}{mipxmA}{m}{n}{<->s*[0.8]ipxm-r-u26}{}
\DeclareSymbolFont{mipxmA}{U}{mipxmA}{m}{n}
\DeclareMathSymbol{\Snowman}{\mathbin}{mipxmA}{"03}
\DeclareMathSymbol{\Note}{\mathord}{mipxmA}{"6A}
\begin{document}
A set $G$, together with a binary operation
$\Snowman\colon G \times G \to G$ is called
a \emph{group} when it satisfies the following rules:
\begin{itemize}
\item For all $a$, $b$ and $c$ in $G$,
  \[ (a \Snowman b) \Snowman c = a \Snowman (b \Snowman c). \]
\item There is an element $\Note\in G$ such that for each $a\in G$,
  \[ a \Snowman \Note = \Note \Snowman a = a. \]
\item For each $a\in G$, there exists an element $a'\in G$ such that
  \[ a \Snowman a' = a' \Snowman a = \Note. \]
\end{itemize}
\end{document}

演習問題②

ipxm-r-u26 の符号位置 "68 にある温泉マーク〈♨〉を関係演算子の数学記号命令 \Onsen として定義し、次の数式を出力せよ。

演習問題③

“Concrete Mathematics”(R. Graham, D. E. Knuth, O. Patashnik 著)という本では, 自然数 n に対するかく乱順列数n¡ という記号で表している。(参考) そこで、〈¡〉を数式記号として定義して、以下の数式を出力せよ。

*1:実は、たとえ pLaTeX 系であっても、数式記号フォントには欧文フォントしか割り当てることができない。

*2:当該のフォント ipxm-r-u26(を含む Unicode サブフォント)は CJK パッケージでファミリ ipxm として使っているものなので、そのための NFSS 設定は既に存在するが、それは CJK パッケージの使用を前提とするものだから、今の場合は役に立たない。

*3:NFSS のシェープ指定は、その指定自体を数式以外で用いる予定がないのであれば“何を指定してもよい”ので、そこで悩む必要はない。エンコーディングについては、既存のもの(OT1 等)に当てはまらないものは“U”とすればよいが、例えばここで“OT1”というデタラメな指定をしても動作には影響しない。

*4:当該の制御綴が定義済であった場合は定義が上書きされ、再定義が起こったことがログ情報として記録される。

*5:0〜7 の整数(箇条書きの順に対応する)で指定こともできるが、制御綴で指定した方が解りやすいだろう。