各種のフォントフォーマットには参照の使用方法に関する制限があり、その内容はそれぞれ少しずつ異なっています。だからと言って、参照を使うなと言いたいわけではありません——たとえフォントフォーマットのサポートによって直接それを扱えない場合でも、参照が情報をカプセル化する有用な方法であることに変わりありません。グリフ参照を参照の形のままでフォントに書き出せない場合でも、FontForge はなんとかして問題を解決しようと試みます。具体的な解決策としては、参照をそれと等価なアウトラインに置き換えるのが普通です。
最もありふれたフォントフォーマットについて確認してみましょう:
また、TrueType は、アウトラインと参照との混在をサポートしていません。
あるグリフに使用できない参照が 1 つでも含まれている場合 (または、アウトラインと参照が混在している場合)、グリフに含まれる全ての参照が出力時にアウトラインに変換されます。
結論を言えば、グリフ内に含まれる命令はすべて意味を失い、参照されているグリフに含まれる参照されたグリフに含まれることを意味します。
注意: 一般的な変換がサポートされているからと言うだけで、それを使用するのは常によい考えであるわけではありません。参照を反転すると、ラスタライザはたぶんそれに対して困難を抱えることになるでしょう (輪郭線の向きが正しい方向の逆になるでしょう)。参照を回転すると、そこに含まれる命令はおそらくは正しく働かなくなるでしょう。
あるグリフに、Adobe 標準エンコーディングに属する文字への参照 2 個だけが含まれでいて、そのうちのどちらかの参照に適用されている変換行列が単位行列であり (すなわち、移動・拡大/縮小・反転などが一切行われていない)、もう片方は平行移動しか行われていない (移動量が 0 でも構いませんが、拡大/縮小・回転・反転などは不可) という条件が満たされているときに限って、FontForge はこれら 2 つを参照として書き出すことができます (それには‘seac’命令を使います)。CID キー指定フォントはこれをサポートしていません。
これから解ることは、この方式の参照はラテン文字以外の用字系には役に立たないということです (ラテン文字とその他の用字系で共有されているグリフは除きます。ラテン文字の A と同じ形のグリフをギリシャ文字やキリル文字で使うのはよくあることです)。
FontForge はちょっとした拡張を行っており、平行移動を含まない 1 個の参照のみからなるグリフがある場合、FontForge は空白へのダミー参照を追加して、参照の個数がちゃんと 2 個になるようにします。
第 2 のフォーマットはある意味ではより汎用的ではありますが、上記の方式に比べて一層複雑な制約条件を満たしている必要があります。PostScript フォントには、いくつかのグリフで共用される輪郭を定義するのに使用可能な“サブルーチン”の概念があります。FontForge のアルゴリズムは極めて複雑で、どのようにしてグリフ参照を行ったかによっても結果が変わります。しかし基本的には、あるグリフがヒント置換も flex ヒントも含んでいないならば、そのデータをサブルーチンに置くことができます。それらが含まれている場合は、平行移動を行わないときに限りサブルーチン化可能です。複数の参照を含むグリフでは、ある参照をサブルーチン化できない場合でも、その他の参照はサブルーチン化できる可能性があります (TrueType では常に全て参照にするかしないかのどちらかに限られるが、PostScript ではそうとは限らないということです)。参照をサブルーチン化できない場合でも、(参照先のグリフが参照を含む場合であれば) 一部の構成要素をサブルーチン化できることもあります。
FontForge は‘seac’を参照の定義と解釈しますが、サブルーチン呼出しは参照とは見なしません。いったん Type1 フォントを読み込んでから 編集(E)
→参照に置換
を使用してください。
Type2 では、参照されたグリフ記述をサブルーチンに置くことができるのは、ヒント置換が全く含まれていない場合か、ヒント置換を含む参照が元と同じ位置に置かれ、最後以外の構成要素にはヒントが全く含まれていない場合に限られます。Type1 と同様、部分的に参照を使用することができます。
FontForge は Type2 (OTF, CFF, CEF, GAI) フォントの読み込み時に参照をいっさい認識しません。フォントを読み込んだ後に 編集(E)
→参照に置換
を使用してください。