グリフの編集

一部のグリフを編集する
源ノフォントの場合、「‼ (U+203C)」「⁇ (U+2047)」「⁈ (U+2048)」「⁉ (U+2049)」など、一部のグリフが、全角幅ではなくプロポーショナル幅になっています。
横書き時はそれでも構いませんが、縦書き時は左に寄るような形になるので、問題となります。

また、源ノ明朝の「?」が少し特徴的な形となっているので、普通の形にしたいという場合もあります。

一部のグリフを、さらに別のフォントで置き換えたいという場合は、mergefonts の合成時に、マッピングファイルとフォントの指定を追加すれば問題ありません。

一部のグリフのアウトラインを編集して置き換えたい場合は、以下の手順で行うことができます。
グリフの編集手順
  1. tx コマンドで、フォントの編集対象グリフのみを抽出して、Type 1/CFF/UFO などに変換する。
  2. 出力したファイルを、FontForge などのフォント編集ソフトで読み込み、グリフを編集する。
  3. グリフの編集後、各形式でフォントを保存した後、tx コマンドで CFF に変換する。
  4. psautohint で、ヒント情報をセット。
  5. CFF フォントを mergefonts で合成。
フォント形式
Type 1
(*.pfa, *.pfb)
PostScript によるフォントです。
源ノフォントのソースファイルとしても使われています。
CID フォントやヒントの情報を維持できます。

FontForge で読み込み・保存ができます。
CID で保存する場合は、「PS CID」の形式で保存します。
ただし、出力したファイルは、tx コマンドで変換はできますが、fontplot などのコマンドでは読み込めません。
CFF素の CFF は、OpenType フォント内に直接格納される形式です。

FontForge で読み込み・保存ができます。
ただし、出力したファイルは、fontplot での読み込みや、tx コマンドでの変換ができません。
UFOUFO (Unified Font Object) は、すべてテキストで記述されたフォントフォーマットです。
グリフはそれぞれ、個別に *.glif ファイルに分かれているので、フォント編集時のフォーマットに適しています。

※ UFO は、フォント名をディレクトリとして指定します。
※ ヒントの情報は維持できません。
※ lib.plist ファイルによって CID フォントを維持できますが、フォント辞書は維持できません。

FontForge で読み込み・保存ができますが、注意点がいくつかあります。

・「グリフ名を強制的に変更」を「名前を変更しない」に選択してください。
・FontForge で出力すると、lib.plist の情報が削除されて、CID フォントではなくなってしまいますが、tx コマンドで出力された時の元 lib.plist ファイルをコピーすると、CID フォントに戻すことができます。

FontForge で編集する場合は、形式によって色々と制約があるので、CID フォントのグリフを編集する場合、tx コマンドで CFF に変換した後、FontForge で読み込み、「フォントを出力」で「OpenType CID」形式で出力するのが、一番簡単です。
CID の状態をそのまま維持することができます。

編集するグリフが多数ある場合や、フォント編集ソフトが CFF の読み込みに対応していない場合は、UFO でも構いませんが、いくつか気を付けなければならない点があるので、注意してください。

今回は、UFO に変換して編集する方法を紹介します。
tx コマンドで編集対象のグリフを抽出
AFDKO の tx コマンドは、色々なフォントファイルを、別のフォーマットに変換できます。

tx -u でコマンドのヘルプ、tx -h で使い方のヘルプを表示できます。

ここでは、例として、源ノ明朝の「‼」と「⁉」のグリフ(と、.notdef)を抽出して、UFO で出力してみます。
グリフ名の取得
tx でグリフを指定する場合、グリフ名または CID/GID で指定することになるので、char2name.py を使って、「‼」と「⁉」の CID 値を調べます。

>> char2name.py (前回使ったものと同じ)

[edit.txt] (UTF-8)
c:‼⁉

$ python3 char2name.py -l edit.txt serif-ginfo.txt
U+203C(‼): 736
U+2049(⁉): 740

$ python3 char2name.py -cid edit.txt serif-ginfo.txt 
/736,/740

$ python3 char2name.py -gid edit.txt serif-ginfo.txt
480,484

-l オプションで、指定文字の Unicode とグリフ名 (CID) のリストを表示します。

もしくは、-cid で、tx コマンドで指定するための、コンマ区切りの文字列を、CID 指定で出力することができます。
-gid を指定した場合、CID の代わりに、GID を出力します。
tx コマンドで変換
tx コマンドを使って、フォント内の指定グリフを UFO で出力します。

$ tx -ufo -g 0,/736,/740 SourceHanSerifJP-Bold.otf edit

-ufoUFO で出力します。
-g LISTカンマ区切りで、グリフを指定します。
GID の場合は通常の数値、CID の場合は、'/'+番号 で指定します。

フォントには、.notdef のグリフが必ず必要になるので、CID(GID) = 0 のグリフも含めています。
GID で指定する場合は、-g 0,480,484 でも大丈夫です。
INPUT OUTPUT1番目が入力ファイル、2番目が出力ファイル名です。
UFO の場合は、ディレクトリ名の指定となるので、edit ディレクトリを作成して、各ファイルを出力します。
※ディレクトリが存在すると、出力できません。

スクリプトファイル
今回はグリフ数が少ないので、直接コマンドの引数で指定できますが、グリフが多数ある場合は、コマンドで指定するのは不便です。

tx コマンドでは、ファイルに記述されたグリフ名を読み込む機能はありませんが、代わりに、コマンドの内容を記述したスクリプトファイルを使うことができます。

[script.txt]
-g 0,480,484
SourceHanSerifJP-Bold.otf edit

$ tx -ufo -s script.txt

スクリプトファイルでは、改行は空白として扱われます。
'#' 以降はコメントです。

-s の前に指定されたオプションは有効ですが、-s の後にオプションは指定できないので、-s は常に最後のオプションである必要があります。
FontForge で編集
今回は、FontForge でグリフを編集します。

FontForge を実行すると、フォントを選択する画面になるので、"edit" ディレクトリを選択し、「グリフ名を強制的に変更」を「名前を変更しない」にして、「OK」ボタンを押してください。
グリフ名が変更されると、tx コマンド時に正しく変換できません。
「‼」の編集
グリフ一覧にグリフが表示されるので、まずは「‼」の部分をダブルクリックして、アウトラインの編集画面を表示してください。

グリフの送り幅がプロポーショナル幅になっているので、幅は 671 となっています。
これを、全角幅の 1000 に直して、アウトラインを中央に寄せます。

メニューの「メトリック」>「幅を設定」で、「グリフ幅の設定値」に 1000 を入力して、OK ボタンを押してください。
編集画面上で、幅の線が、671 から 1000 の位置に変更されていると思います。

あとは、この幅に合わせて、アウトラインの位置を右にずらします。

メニューの「メトリック」>「幅の中央に」を実行すると、グリフのアウトラインと幅に合わせて、自動で中央寄せが行われます。

「‼」の編集はこれで完了なので、編集画面を閉じてください。
「⁉」の編集
おなじように、「⁉」も編集します。

同じ手順で、幅の変更と中央寄せをすればよいのですが、「⁉」の場合は、そのままだと左に寄っているように見えるので、少し右に移動します。

Ctrl+A ですべての点を選択した後、ポインタ(矢印)のツールが選択された状態で、□の点のいずれかの上で、左ドラッグします。
すると、全体のアウトラインを移動できるので、Shift キーを押しながらドラッグで、少しずつ水平方向のみに移動し、アウトラインが中央になる位置へ移動してください。

※最初から Shift を押して、点の上で左ボタンを押すと、点の選択の追加/解除となるので、何もキーを押さない状態で左ドラッグを開始した後、Shift キーを押しながら移動してください。
一瞬変な位置に移動しますが、そのままゆっくり水平方向に移動すれば、元の位置に戻って移動します。

ボタンを離すと、移動が確定されます。
保存する前に、lib.plist をコピーする
元が CID フォントで UFO を上書き保存する場合は、保存する前に、現在の UFO ディレクトリ内にある lib.plist をコピーして、別の場所に保存しておいてください。

このファイルには、CID フォントの情報が含まれていますが、FontForge は UFO を CID フォントとして読み込まないため、上書き保存すると、lib.plist の内容が削除されてしまって、CID フォントではなくなってしまうので、元の情報を保存しておきます。

FontForge で出力した後に、このファイルを元に戻すと、再び CID フォントにすることができ、グリフの CID 値を維持することができます。

ただし、元の CID フォント辞書は維持できないので、すべてのグリフが、一つのフォント辞書に属する形となります。
UFO で出力する
編集が終わったら、UFO 形式で出力します。

通常の「保存」では、FontForge の sfd 形式でしか保存できないので、編集データを別のフォントに出力する形で、保存します。

メインウィンドウの「ファイル」>「フォントを出力」で、フォント形式を「Unified Font Object (UFO3)」または「Unified Font Object 3」に選択し、「グリフ名を強制的に変更」を「名前を変更しない」にして、出力ディレクトリ名を入力、またはファイルリストから選択してください。
lib.plist をコピーしている場合、上書き保存で問題ありません。

「Validate Before Saving (アウトラインなどのチェック)」は OFF にしておいた方が良いです。

「生成」ボタンを押すと、出力されます。
lib.plist を元に戻す
UFO を出力した後、コピーしておいた、元の lib.plist ファイルを、同じ場所にコピーしてください。

なお、グリフを削除したり追加したりしないのであれば、FontForge で UFO を出力しなくても、グリフ単位でファイルを保存して編集することができます。
その場合、各グリフの編集画面のメニューから、「ファイル」→「書き出し」で、フォーマットを「Glif」にして、UFO 内の各グリフのファイルに上書きしてください。

グリフを個別に保存するやり方で、グリフを追加/削除したい場合は、lib.plist (CID フォントの場合) と glyphs/contents.plist を手動で編集する必要があります。
tx コマンドで CFF に変換
UFO から、OpenType フォントに格納される形の CFF へと変換します。

$ tx -cff edit edit.cff

edit ディレクトリの UFO フォントを、edit.cff に CFF 形式で出力します。

いくつか警告が出ますが、フォントが作成されていれば問題ありません。

UFO の場合は、ヒント情報が含まれていないので、psautohint で CFF にヒント情報をセットします。

$ psautohint edit.cff
合成とフォント作成
後は、mergefonts で各フォントを合成し、OpenType フォントを作成します。

edit.cff のフォント内では、グリフの CID 値は元のままとなっているので、char2name.py で、元のフォントのグリフ情報を使って、マッピングファイルを出力します。

また、今回は、ベースフォントとして、前回作成した merge.cff フォント(グリフを縮小して合成したもの)を使います。

## 編集グリフのマッピングファイルを出力

$ python3 char2name.py edit.txt serif-ginfo.txt -m sans-ginfo.txt > merge-edit.txt

## 必要であれば、merge-edit.txt の1行目にフォント辞書名を指定

$ mergefonts -cid cidfontinfo merge-edit.cff merge-edit.txt edit.cff merge.cff

$ makeotf -f merge-edit.cff -ff features.JP -ch UniSourceHanSansJP-UTF32-H -ci SourceHanSans_JP_sequences.txt -omitMacNames

"/UnderlineThickness invalid (ignored)" は、"下線の太さが無効な値なので無視します" というメッセージなので、特に問題はありません。
(備考) フォントの合成について
OpenType フォントの作成には、いくつかの定義ファイルが必要になります。

源ノフォントの場合は、CMap や features のソースファイルが公開されているので、源ノフォントをベースに合成して、最終的に OpenType フォントを作りたい場合は、各ファイルを用意できますが、それ以外のフォントをベースにしたい場合は、そのフォントに合わせた各ファイルを作る必要があります。
Adobe-Japan1 (CID)
CMap と GSUB 用の features ファイルは、すでに定義されたものが存在するので、それを使うことができます。

ただし、GPOS など、他のテーブルのデータも含める場合は、元のフォントから "spot -t GPOS=7 FONTFILE" などで情報を取得して、features ファイル内に追加する必要があります。
※グリフの編集により、位置や送り幅などの値を変更する必要がある場合は、各グリフごとに値を調整してください。

また、Adobe-Japan1-7 の features ファイルを元に、Adobe-Japan1-5 など用の features ファイルを作りたい場合は、フォントに含まれていない CID を、データから除外する必要があります。
(CMap と異体字のファイルでは、未使用の CID は自動でスキップされるので、そのままでも問題ありません)
Adobe-Identity-0 (CID)
Adobe-Identity-0 の CID フォントを作る場合は、そのフォント用に、Unicode と CID のマッピング情報を指定した CMap ファイルが必要となります。
"spot -t cmap=7 FONTFILE" の情報を元にして、作成することはできます。
元フォントから、vmtx テーブルの設定値を取得
縦書き用のグリフの、原点 Y 位置と送り幅は、features ファイル内で設定する必要があります。
元のフォントの値をそのままセットしたい場合は、以下のスクリプトで、spot コマンドで出力した情報から、features ファイル用の定義に変換して出力できます。

>> conv-vmtx.py

$ spot -t vmtx=8 FONTFILE > vmtx.txt
$ spot -t VORG FONTFILE > vorg.txt

$ python3 conv-vmtx.py vmtx.txt vorg.txt > out.txt

VORG のファイルは省略することもできます。