数式中でフェニキア文字が使いたくなったときも、あんしん🙂 #多分
— 某ZR(ざんねん🙃) (@zr_tex8r) 2025年7月13日
tcmathphnx パッケージhttps://t.co/08A1nY4BpF#TeX #TeXLaTeX
もしかしたら、フェニキア文字とかを数式で使うLaTeXパッケージをエ~アイが実装できた方がいいかもしれないので、tcmathphnxパッケージのつくり方について簡単に解説することにする。
tcmathphnxパッケージはTeX Liveに収録済のphoenicianパッケージのフォント(およびLaTeXフォント定義)を使っている。このように、TeX Liveで(テキストフォントとして)既に “準備ができている” ものを利用する形にすると「パッケージだけをインストールすればよい1」ことになり、利便性の点でも都合がよい。以下に述べる実装手順は「LaTeXで既にテキストフォントとして\usefont命令を用いて利用できる」ようなフォント2であれば通用するはずである。
前提知識
本記事では以下の知識を仮定する。
手順①:NFSSでのシェープ指定を調べる
まずは、対象のフォント(つまり「phoenicianパッケージで実際に使われているフォント」)のシェープ指定をどうにかして把握する。シェープ指定というのは\usefontで使われるOT1/cmr/m/nのような値のことである。これにはとにかくパッケージの実装コードを精読することが大事である。
まずはphoenicianパッケージの仕様に沿った動作を追うことにする。パッケージの説明書によると、phoenicianを利用してアーレプ(𐤀)・ベート(𐤁)・ギーメル(𐤂)を(左横書き字形3で)出力する場合には次のように書くことになっている。
{\phncfamily abg}

見た感じ、フォントファミリを指定しているのが\phncfamilyっぽいので、これの定義を調べればファミリの定義が判りそうである。phonetician.styの中を見て\phncfamilyの定義を探してみる。
\newcommand{\phncfamily}{\usefont{OT1}{phnc}{m}{n}}
おっと、命令名は“~family”であるが実体は(ファミリでなく)シェープを\usefontで完全指定するものであった🙃 とにかくこれでシェープ指定がOT1/phnc/m/nであることが判明した。
手順②:文字コードを調べる
「使いたいフォント」の正体が判ったので、今度は「使いたい文字」の文字コード(符号位置)を調べることにする。TeXのレガシーフォントが前提であるため、文字コードは0~255の範囲の整数である。
話を簡単にするため、以降では「使いたい文字」を「アーレプ・ベート・ギーメルの右横書き字形」に限定することにする。
※歴史的にフェニキア文字は左横書き(left-to-right)と右横書き(right-to-left)で異なる字形を用いていて、phoenicianパッケージではその両方をサポートしている。最終的には右横書きが定着したため、一般的にはフェニキア文字は右横書きと認識されていて4右横書き字形の方がよく知られている。このため、数式は左横書きであるが5敢えて右横書き用の字形を採用することにする。
phoenicianパッケージでは、右横書き字形を使いたい場合は\AR~という名前の命令を使うことになっている。
% 右横書き字形で左横書きしている {\phncfamily \ARaleph\ARbeth\ARgimel}

phoenician.styの中でこの\AR~の定義を探すと、次のようになっている。
\chardef\ARaleph=`A \chardef\ARbeth=`B \chardef\ARgimel=`G
アーレプ・ベート・ギーメルはA・B・Gの文字コード(数値6でいうと65・66・71)に割り当てられている。
手順③:パッケージの仕様を決める
以上で数式パッケージ実装に必要な情報が揃ったので、次に自分がつくるパッケージの仕様と実装方針7を決めることにする。
既存仕様においてラテン文字以外の文字(例えばギリシャ文字・ヘブライ文字)がどう扱われているかを考えてみると、例えば\piや\alephのように「文字名に基づく、その文字を出力するための命令」が用意されている。基本的にこれを踏襲することにするが、ただしヘブライ文字と区別するため文字名の前にphnxを付けた9ものを命令名とする。つまり次の3つの命令を提供することになる。
\phnxaleph: アーレプ(𐤀)を出力する。\phnxbeth: ベート(𐤁)を出力する。\phnxgimel: ギーメル(𐤂)を出力する。
もちろんこれらの命令は、\piや\alephと同様に「数式中でそれを書いたら自動的に適切なフォントが選ばれる」必要がある。
% 明示的なフォント指定無しで使える $\phnxaleph + \phnxbeth + \phnxgimel = 0$
そして実装方針についても「\alphaや\alephと同様の方式」にする。すなわち「数式記号命令10」として実装する。
手順④:数式記号フォントを定義する
いよいよtcmathphnxパッケージの実装に取り掛かる。まずはいつものパッケージ宣言を書く。
% パッケージ宣言 \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{tcmathphnx}[2025/07/13 v0.1]
新たなフォントに紐づくような数式記号命令を定義するには、まずそのフォントを「数式記号フォント」として定義する必要があり、これには\DeclareSymbolFontという命令を用いる。
\DeclareSymbolFont{«数式記号フォント名»}{«エンコーディング»}{«ファミリ»}{«シリーズ»}{«シェープ»}
最初の引数の«数式記号フォント名»は自分が使う名前であるので(既存のものと被らなければ)何でもよい。ここでは名前空間接頭辞と同じ文字列のtczpxとする。後ろの4つの引数は紐づけたいフォントのシェープ定義であり、手順②においてそれがOT1/phnc/m/nであることを把握している。従って、次の文を実行すればよいことになる。
% 数式記号フォント'tczpx'を定義 \DeclareSymbolFont{tczpx}{OT1}{phnc}{m}{n}
手順⑤:数式記号命令を定義する
次に、\phnxaleph等を数式記号命令として定義したい。数式記号命令を定義するには\DeclareMathSymbolという専用の命令を用いる。
\DeclareMathSymbol{\命令}{«種別»}{«数式記号フォント名»}{«文字コード»}
これで\命令が「«数式記号フォント名»のフォントの«文字コード»の位置の文字を出力する」という命令として定義される。«種別»は「当該の記号の数式中での振る舞い」を規定するもので、次の8種類の値の何れかを指定する。
\mathalpha: 数式英字11\mathord: 数式英字以外の通常の記号・文字\mathop: 大型演算子\mathbin: 二項演算子\mathrel: 関係演算子\mathopen: 開き括弧類\mathclose: 閉じ括弧類\mathpunct: 句読点類
今回定義したいのは“文字”であるため«種別»は\mathordにする。\phnxalephを「数式記号フォントtczpxのAの位置の文字を出力」する命令として定義するには以下の文を実行すればよい。
% 数式記号命令の定義 \DeclareMathSymbol{\phnxaleph}{\mathord}{tczpx}{`A} % 文字コードを数値で指定したい場合 %\DeclareMathSymbol{\phnxaleph}{\mathord}{tczpx}{65}
\phnxbeth・\phnxgimelの定義も同様に行える。
\DeclareMathSymbol{\phnxbeth}{\mathord}{tczpx}{`B} \DeclareMathSymbol{\phnxgimel}{\mathord}{tczpx}{`G}
以上でtcmathphnxパッケージの実装は完了である🙂
動作確認してみる
改めてtcmathphnxパッケージの実装コードを全てまとめて示す。
% パッケージ宣言 \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{tcmathphnx}[2025/07/13 v0.1] % 数式記号フォント'tczpx'を定義 \DeclareSymbolFont{tczpx}{OT1}{phnc}{m}{n} % 数式記号命令の定義 \DeclareMathSymbol{\phnxaleph}{\mathord}{tczpx}{`A} \DeclareMathSymbol{\phnxbeth}{\mathord}{tczpx}{`B} \DeclareMathSymbol{\phnxgimel}{\mathord}{tczpx}{`G}
ひとまず要求仕様(3文字だけ)を満たすパッケージが完成したので動作確認をしてみる。以下のような文書ソースをpdflatexでタイプセットしてみよう。
%#!pdflatex \documentclass[a5paper]{article} \usepackage{tcmathphnx} \begin{document} \[ \frac{\phnxaleph}{\phnxbeth + \phnxgimel} + \frac{\phnxbeth}{\phnxaleph + \phnxgimel} + \frac{\phnxgimel}{\phnxaleph + \phnxbeth} = 4 \] \end{document}

カンペキ😊
実際のtcmathphnxパッケージ
本記事に掲載したコードでは3文字しか使えないが、全てのフェニキア文字を使えるようにこれを拡張したのが、Gistに実際に公開されているtcmathphnxパッケージである。
- LaTeX:数式中でフェニキア文字を出力する(GitHub/Gist)
※記号の定義のコード(\tczpx@do)がチョットアレ🤯な感じになっているが、この部分は以下のようにフツーに大量の\DeclareMathSymbolを書いたのと全く同等である。
\DeclareMathSymbol{\phnxaleph}{\mathord}{tczpx}{`A} \DeclareMathSymbol{\phnxbeth}{\mathord}{tczpx}{`B} \DeclareMathSymbol{\phnxgimel}{\mathord}{tczpx}{`G} \DeclareMathSymbol{\phnxdalet}{\mathord}{tczpx}{`d} \DeclareMathSymbol{\phnxhe}{\mathord}{tczpx}{`e} \DeclareMathSymbol{\phnxvaf}{\mathord}{tczpx}{`f} ……(以下同様)……
まとめ
エ~アイがイロイロなLaTeXパッケージをつくれるようになるといいですね😊
- TeXシステムにおいてフォントとその周辺のファイルをインストールする手順は、多くの場合極めてヤヤコシイものになる。↩
- ただし「Unicode LaTeXでUnicodeのフォントを利用する」パターンについてはスコープ外とする。↩
- フェニキア文字の左横書き字形と右横書き字形の区別については後ほど説明する。なお、この直前の文章の「アーレプ(𐤀)」の部分にあるUnicodeテキストのフェニキア文字は右横書き字形で表示されているはずである。↩
- Unicode標準でもフェニキア文字は右横書きの用字系と規定されていて、このためフェニキア文字のUnicodeフォントに収録されている字形は通常は右横書きのものである。ちなみに、エトルリア文字(等の古代イタリア地方の用字系を統合した“Old Italic”)についてはUnicodeは左横書きと規定していて、コード表の字形も左横書き用になっている。↩
-
\aleph、\beth等の「数式用のヘブライ文字」も本来は右横書き用の字形を左横書きで使っているわけである。↩ -
TeX言語の整数表記規則において
`Aという表記は「Aの文字コード」である65を意味する。↩ - TeX言語でのプログラミングは制約が多いので、仕様を考える際に同時に「この仕様はどうすれば実装できるのか」について思案しておくのが望ましい。↩
- 本記事で紹介するコードの範囲では名前空間接頭辞は使っていない(リリース版のコードでは使っている)が、数式記号フォント名としてこの名前を利用している。↩
-
フェニキア文字のISO 15924用字系コードが
phnxである。↩ -
「数式記号命令とは何か」の説明は割愛する。この後の文で「数式記号命令は
\DeclareMathSymbolで定義する」と説明したが、逆に考えて「\DeclareMathSymbolで定義されるのが数式記号命令」と把握するという手もあるだろう。↩ -
「数式英字」とは「
\mathbf等の数式フォント命令の適用対象となる文字」のことである。今回定義する命令はフォントが固定でないと意味がないため数式英字ではない。↩