読者です 読者をやめる 読者になる 読者になる

にせねこメモ

はてなダイアリーがUTF-8じゃないので移ってきました。

OpenTypeフォントで分数

OpenType機能のタグに「スラッシュを用いた分数」‘frac’というものがあります。「1/2」という文字列をこれを有効にして表示すると「½」のように表示されてほしいです。
料理のレシピなどでよく見る気もします。½カップとか。

これをGSUBを使って実現することができますが、いくつか方法が考えられます。これから挙げるのはその例です。

(i)合字(リガチャ)を利用した表示

「1/2」「1/3」などの特定の並びに対してその合字に置換するという方法です。
この方法は、表示する全ての組合せを用意しないといけないため、全ての組合せを用意することは不可能です。


¼ ½ ¾ ⅓ ⅔ ⅕ ⅖ ⅗ ⅘ ⅙ ⅚ ⅛ ⅜ ⅝ ⅞ の様にすでにUnicodeに用意されているもののについてなどでは簡単にできるかもしれませんが……。

(ii)GSUBによって数字を分子用・分母用に入れ替える

  1. 全ての数字を分子(上付き数字)にする
  2. スラッシュの後に続く数字を分母(下付き数字)にする

のような流れでGSUBによって置換を行います。


実際のGSUBの定義は以下の様になります。

#すべての数字を分子用の数字にする
#ついでにスラッシュも分数用に変える
lookup numeratorize {
	substitute @figure by @fig.num ;
	substitute \slash by \frac_slash ;
} numeratorize;

#スラッシュより後ろの(分子用)数字を分母用数字に変える
lookup denominatorize {
	substitute \frac_slash @fig.num' by @fig.den ;
	substitute @fig.den @fig.num' by @fig.den ;
} denominatorize;

ここで、 @figure は標準の数字、 @fig.num は分子(用の数字)、 @fig.den は分母(用の数字)のクラスです。
これを順に適用するとまず全ての数字が分子になり、次にスラッシュの後につづく分子の数字を分母に置換します。


具体的な動作の例を示します。赤太枠が、これから置換しようとしている文字を示します。
f:id:nixeneko:20150518222355p:plain

実行例

次に実際に動かしている例を示します。
スマートフォンの人はこちらのテストページを参照ください。

1024/157
また、下のテキストエリアに数字を入力して動作を確認することもできます。

サンプルファイルのダウンロード

サンプルファイルは以下からダウンロードできます。

(iii)分数でない数字を分子用数字にしたくない場合

(ii)で挙げた方法では、fracを適用した場合、分数でない(スラッシュを含まない)ただの数字でも分子のように上付きにされてしまいます。

スラッシュが存在しない普通の数字の場合にはそのまま普通の数字を表示する、ということは可能です。ただし、いくらでも大きな桁に対応する、ということはできません。

というのも、GSUBは前から後ろに置換していくことはできますが、後ろから前に置換していくことは基本的にできないためです。

という訳で、数字がスラッシュの前にある場合だけ分子に置換するには、想定する分子の桁数の数に合わせた数のlookupを用意しないといけません。そのため、(ii)で挙げたようにいくらでも大きな桁数に対応するということはできません。

(2016-10-11 追記)

Google DriveのWebホスティング機能の廃止により正しく見えない状態になっていたのを修正しました。