コンテンツにスキップ

Lookup Type 2 — Multiple Substitution

Multiple Substitution は、1 つのグリフを 2 つ以上のグリフの列に置き換える GSUB の規則です。

sub fi by f i;

規則はフィーチャーブロックの中に書きます。たとえば ccmp フィーチャーで使うと次のようになります。

feature ccmp {
sub fi by f i;
} ccmp;

Unicode には、合字を 1 つの文字として符号化したものがあります。fi(U+FB01)がそれにあたります。fi を並べたものとは別の、独立した 1 文字です。

cmap は 1 つの文字に 1 つのグリフしか対応付けられないので、この文字はフォントの中でも 1 つのグリフになります。fi の 2 グリフに戻すには、この規則を使うしかありません。GSUB の規則のうち、グリフ列を入力より長くできるのはこの型だけです。

分けておけば、fi を対象にするフィーチャー(smcpsups など)がそのまま効きます。分けなければ、合字のグリフ専用の異体字を、フィーチャーの数だけ用意することになります。組み合わせの数だけ描くか、部品の数だけ描くかの差です。

タイ文字のように 1 つの文字が複数の部品でできていて、そこにさらに記号が積まれる文字体系では、この差がもっと大きくなります。部品に分けておけば、位置決めは GPOS に任せられます。

sub <glyph> by <glyph sequence>;
  • <glyph> — 置き換え元の 1 つのグリフ。
  • <glyph sequence> — 置き換え先の 2 つ以上のグリフ。置き換え後に現れる順で書きます。

<glyph sequence> にグリフクラスは使えません。使えるとすると、どの列に置き換えるのか規則が曖昧になるためです。

subsubstitute の省略形です。次の 2 つは同じ規則です。

substitute fi by f i;
sub fi by f i;

Lookup Type 4 と書式が似ていますが、Lookup Type を明示する必要はありません。コンパイラが規則の形から判別します。

# 1 グリフ → 2 グリフ = Multiple Substitution(Lookup Type 2)
sub fi by f i;
# 2 グリフ → 1 グリフ = Ligature Substitution(Lookup Type 4)
sub f i by fi;
Without rules
fish fish flow flow
With rules
fish fish flow flow
Compiling…

この Lookup Type を使うフィーチャー

Section titled “この Lookup Type を使うフィーチャー”

OpenType 仕様にあるフィーチャーのうち、次のものはこの Lookup Type での実装が推奨されています。

  • ccmp — Glyph Composition/Decomposition。他のフィーチャーが動く前に、1 つのグリフを複数のグリフへ分解する。
  • stch — Stretching Glyph Decomposition。Syriac Abbreviation Mark など、囲んだ文字列の幅に合わせて伸びるグリフを、奇数個のグリフの列に分解する。