>

チュートリアル (その 7)

条件つき機能

OpenType と Apple のフォントのどちらでも、条件つきの機能を使用することができます。それらは所定の文脈下でのみ実行される機能であり、インド系およびアラビア系の用字系の組版においては必須のものです。OpenType では、文脈は、文書のグリフストリームに対して照合を行うパターンの集まりとして指定されます。あるパターンがマッチすると、それが定義するすべての置換が行われます。Apple のフォントでは、文脈は状態機械——グリフストリームを解析して変換する小さなプログラム——として指定されます

条件つき機能には置換・合字またはカーニング (およびさらに不明瞭なふるまい) を含めることができます。ここでは条件つき置換の一例を示したいと思います。

インド系文字やアラビア文字の例を取り上げる代わりに、私がより慣れ親しんでいるものを例に取り上げることにしましょう。“b”,“o”,“v”と“w”は次の文字と x ハイトのあたりで接続し、その他の文字はすべてベースラインのそばで接続するようなラテン文字の筆記体フォントを組版する問題を考えてみます。この場合、各グリフにつき、ベースラインのあたり (の左側) に接続線があるデフォルトの字形と、x ハイトのところに接続線がある別字形との 2 種類の異字形が必要となります。この 2 番目のセットを“高い”文字と呼び、それらの名前を“a.high”,“b.high”… といった具合につけることにしましょう。

OpenType の例

警告
以下に挙げる例は動作しません! この手順によって生成されるフォントテーブルは完全に正しいのですが、OpenType の設計者たちは、ラテン文字では複雑な条件つき機能("Contextual Alternative" ('calt'))を必要ではないと決定したので、ラテン文字ではそれをサポートしていないのです。

なぜ私は動作しない例を提供しているのでしょう? それが私のできる最善の事だからです。もし私がインド系文字やアラビア文字の組版に通暁していたなら、それらの用字系の例を挙げていたことでしょう。しかし私はその素養を欠いています。手順は同じです。他の何らかの用字系でそれに従って作業すれば、動く物ができるでしょう。

時は流れ、現在は多くのアプリケーションがラテン文字での‘calt’ (選択型の置換) 機能に対応したため、この警告は今やあまり有効なものではなくなりました。

グリフを 3 つのクラスに分けます: “bovw” の4文字、それ以外のすべての英字、そして英字以外のすべてのグリフです。2 つのパターンを作成する必要があります。第 1 のパターンは“bovw”クラスに含まれるグリフの後に“bovw”クラスのグリフが続く場合で、第 2 のパターンは“bovw”クラスの後にそれ以外の英字が続く場合です。これらのどちらかが一致するときには、2 番目のグリフを“高い”異字形に変換する必要があります。

(あなたは「なぜすべての文字を含むクラスと一つのルールの代わりに2つのそれを使っているのか?」という疑問を持ったと思います。理由は、この場合すべてのクラスをまとめることができないからで、2つのクラスの中で1つのグリフが出会うことはできないからです。)

まず最初に、各“低い”文字に、"高い”異字形を対応づける単純置換(訳注:'aalt')を作成する必要があります。これは"単純な置換"("Simple Substitution")lookupで、これはあらゆる機能と接続して使用できるわけではなく、条件付き機能から呼び出すことができます。この置換を、“high”という 4 文字の OpenType タグで呼ぶことにしましょう。このlookupにsubtable(置換)を定義することができ、[Default with Suffix:]ボタンを"高い"異字体を入力する際に使うこともできます。 (訳注:エレメント(L)→グリフ情報(I)... のLookup内GSUBタブにて、[Add Lookup]/[Add Subtable]ボタンから単純置換('aalt')LookupおよびそのSubtableを設定することができます。)

注意を要する部分は、文脈定義のやりかたです。これには既に定義済みの他のLookup(訳注:この場合'aalt')を、文脈連鎖依存の置換('calt')機能と繋げてやる必要があります。(そしてもちろん、subtableを繋げる必要があります)。文脈依存機能のsubtableを設定する一連のダイアログにより、設定を記述することが可能です。

最初のダイアログでは、置換の全体的なフォーマットを指定することができます。私達が使いたいのはクラスベースのシステムです——どのようなグリフクラスを用いるかは、既に述べたとおりです。

その次のダイアログには、興味をひく情報が表示されます。いちばん上には照合するパターンと、文字列が一致したときに行われる置換が並べて表示されています。その下にあるのは、その置換が利用するグリフクラスです。文脈連鎖依存のダイアログは、グリフ列を 3 つのカテゴリーに分割します: 現在のグリフの前にあるグリフ群 (これらは後戻りグリフと呼ばれます)・現在のグリフそのもの (これは 2 個以上指定可能で、この (それらの) グリフに対しては、それに適用される単純置換をもたせることができます)・そして現在のグリフの後のグリフ (これらは先読みグリフと呼ばれます) です。

各グリフカテゴリはグリフをそれぞれ異なるクラスセットに分類することができますが、この例ではすべてのカテゴリで同じクラスを用いることにします (これにより、置換処理を Apple のフォーマットに変換するのがやりやすくなります)。最初の行 ("Matching rules ~"フィールドに含まれる) は、以下のように読みます: 「もし、後戻りグリフ (現在のグリフの直前のグリフ)が"high-after"クラスに含まれ、続く現在のグリフが"letter"クラスに含まれるなら、そのとき一致した文字列に含まれる文字(これが現在のグリフ)に単純置換'To-TopJoin'を適用する」。 (訳注:'To-TopJoin'は予約語ではなく、aaltサブテーブルに任意に付けることのできる名前。デフォルトではFontForgeが"'aalt' Access All Alternates in Latin lookup 0"のような名前を自動で付ける。)

グリフクラス定義を見ると、"high-after"クラスには“高い”異字形の後にくるグリフがあることが分かるので、この定義には納得がいきます。

2行目は見てみると"high-after | letter @<To-TopJoin> |"の2個目の項目で使われています。 残念なことにこれはスムーズに動作しません。OpenTypeの仕様では有効なのですが、実装では十分にサポートされてはいません。この設定行はLookup内で、subtableにつき1個ずつ設定しなければなりません。
グリフクラスの編集は、その上でダブルクリックするだけで行うことができます。新しく作成するには、(クラスリストの下にある) [新規(N)...] ボタンを押してください。これにより、現在のクラスに含まれる全グリフの名前を表示する別のダイアログが作成されます。[選択] ボタンを押すと、そのクラスに含まれている全グリフがフォントウィンドウ上で選択され、その反対に、[設定] ボタンを押すとフォントウィンドウ内で選択されている文字群がそのクラスの内容として設定されます。

パターンは理解しやすいように書くことができます。グリフ名を入力するときは自動補完が行われます。パターンを入力できる2つのボタンがあり、新しい項目のセパレータ(後戻りor先読み設定の有効化)と、一覧からLookupの呼び出しを設定できます。

文脈依存のふるまいに関する警告: すべてのソフトウェアがこれをサポートするわけではありません。さらに紛らわしいことには、ソフトウェアはある用字系でこれをサポートし、別の用字系ではサポートしないことが許されています。

Apple 高度組版機能

Apple は有限状態機械で文脈を指定します。これは、本質的にはグリフのストリームを調べて、どの置換を適用するかを決定する小さなプログラムです。各状態機械には、グリフクラス定義 (OpenType の例で示したのとちょうど同じような) の集合と状態の集合があります。処理は、グリフストリームの先頭から、状態 0 で始まります。計算機は、現在のグリフがどのクラスに含まれるかを決定し、次に現在の状態を参照して、そのクラスからの入力が与えられたときにどのように振舞うかを調べます。振舞いの中には、別の状態への遷移可能性、入力を次のグリフへ進めること、置換を現在のグリフに適用するか以前のグリフ (“マークつき”グリフ) に適用するかが含まれます。

前と同じ、ラテン文字の筆記体フォントの例を使うことにしましょう……今回も各文字をその“高い”別字形に置換する単純置換が必要となります。この処理は OpenType で行ったのと同じで、実際に同じ置換を使用することができます。今回もグリフを 3 つのクラスに分類します (Apple は、使用するかしないかにかかわらずいくつかの追加クラスを定義していますが、概念上 OpenType の例と同じ 3 つのクラスを使用します)。この場合、状態機械には 2 つの状態が必要で (これも追加の状態が Apple により定義済みですが、これも無視しましょう)、具体的には開始状態 (基本状態——変更は行いません) と、もう一つ、“bovw”クラスからグリフを読み込んだ直後の状態です。

ここでも エレメント(L)フォント情報(F)... ダイアログの [Macの状態機械] タブをクリックして、文脈依存の置換が利用できるようにします。前と同様、文脈依存の振舞いにはいくつかのタイプがあり、ここで興味があるのは文脈依存の置換です。状態機械の上でダブルクリックするか、[新規(N)...] ボタンを押すと、指定した状態機械の概要が表示されます。

ダイアログのいちばん上には、状態機械の機能/設定を指定するフィールドが表示されています。これは Apple の方式では OpenType の 4 文字の機能タグと等価です。その下にあるのはクラス定義のセットで、いちばん下にあるのは状態機械そのものです。

クラスの上でダブルクリックすると、OpenType で使用しているのと似たダイアログが立ち上がります。

状態機械の遷移 (状態/クラスの組合せごとに 1 個の遷移が存在します) の上でクリックすると、状態遷移ダイアログが立ち上がります。指定された状態において指定されたクラスに含まれるグリフを受けつけたときにどのように振舞うかは、ここで制御します。この例では、状態 2 (これは、“bovw”グリフを読み込み済みであることを意味します) で、クラス 4 (これは“bovw”のグリフがもう 1 個来たことを意味します) に含まれるグリフを受け取ったところです。この場合、次の状態も再び状態 2 で (新しい“bovw”グリフを読み込んだ直後となるでしょう)、もう 1 字を読み込んで“high”置換を現在のグリフに施すことになります。

ダイアログのいちばん下にあるのは、状態機械の遷移を移動することができるボタンの列です。

[OK] を何度も押すとこのダイアログの連鎖から抜け、フォントに新しい状態機械を追加します。

目次