CID 割り当ての完成

残っているグリフの確認
前回までで、一応 CID の割り当ては完了したので、調整と確認に入ります。

まずは、Adobe-Japan1 の CID に割り当てられておらず、変換元フォントで残ってしまうグリフを確認します。

AFDKO の fontplot コマンドを使って、グリフのリストを PDF で出力しますが、その前に、未使用となるグリフ名のリストを取得する必要があります。

変換元フォント内にあるすべてのグリフの CID から、使用されている CID を除外して、リスト化することになります。
必要なファイル
まず、変換元フォントに含まれる、すべてのグリフの CID 値を取得する必要があるので、おなじみの spot コマンドを使います。

$ spot -nc SourceHanSansJP-Regular.otf > cid.txt

-nc で、フォント内のすべてのグリフの、GID と CID (またはグリフ名) のマッピング情報を、1つ1行で出力します。

--- names[glyphId]=<name>
[0]=<\0>
[1]=<\1>
[2]=<\2>
...

左が GID、右が CID またはグリフ名です。
スクリプトで GID のリストを取得
>> remap-tool.py
(右クリックで、名前を付けて保存してください)

$ python3 remap-tool.py -u out2.txt cid.txt > unused.txt

-u で、変換元フォントで未使用となるグリフの GID の番号を、標準出力に出力します。

1番目に、remap-gsub.py で出力したファイル。
2番目に、spot -nc で出力したファイルを指定してください。

ここでは、結果を unused.txt に出力します。

65,210,211,221,222,223,224,246,250,251,252,
253,254,374,375,376,377,378,379,380,381,382,
383,384,385,386,387,388,389,390,391,392,393,
...

このような形で、カンマで区切った GID のリストが並びます。
※ CID ではありません。
fontplot コマンドで PDF を出力
AFDKO には、グリフのアウトラインを PDF で出力するコマンドがいくつかあります。

fontplot と fontplot2 は、グリフのアウトラインと、グリフ名などの情報をリストで表示します。

fontplot は、グリフの情報が枠内に描画されるため、アウトラインによっては情報が隠れます。
fontplot2 は、グリフの情報が枠の外に描画されます。

ここでは、CID 番号も確認したいので、fontplot2 を使います。

$ fontplot2 -o out.pdf -gf unused.txt --pageIncludeTitle 0 --drawMeta_SideBearings 0 --metaDataNameSize 200 SourceHanSansJP-Regular.otf

-o FILE出力ファイル名
-gf FILEファイルで指定されたグリフを対象にします。
指定がない場合、すべてのグリフが出力されます。

グリフはカンマで区切ります。
',' の前後の空白・タブ・改行は無視されます。
--pageIncludeTitle 0デフォルトで、ページの上部にタイトルが表示されますが、グリフと重なって邪魔な場合があるので、消します。
--drawMeta_SideBearings 0"L=*,R=*,Width=*" の情報を消します。
--metaDataNameSize 200グリフ名のテキストサイズ。
デフォルトでは 80 となり、とても小さくて見えづらいので、大きくします。

PDF 出力に関する細かいパラメータのヘルプは、-help_params で表示できます。

出力が終わると自動で PDF が開かれるので、グリフを確認してください。
自動で開きたくない場合は、-dno を指定してください。
残っているグリフ
主に記号がほとんどですが、韓国語や、縦書き用のひらがな・カタカナなどがあります。
Adobe-Japan1 では定義されていないようなグリフも多いので、基本的には無視して構いません。

縦書き用のひらかなに関しては、源ノフォントにおいては、GSUB の vert で置換グリフがあるため、縦書き時はそのグリフが使用されることになりますが、Adobe-Japan1 では、(小文字を除いて)vert でのひらかなグリフに対する、縦書き用のグリフは存在しません。
ただし、vkna での印刷縦組み用のひらかなは存在します。

これらの縦書き用のひらかなグリフは割り当てていませんが、実際は、これがなくても、問題なく描画できます。
Adobe-Japan1 で空となるグリフ
Adobe-Japan1 では定義されているけれど、源ノフォントでは存在しないグリフも多数あります。

https://github.com/adobe-type-tools/Adobe-Japan1
Adobe-Japan1 のグリフ一覧は Adobe-Japan1-*.pdf。
各グリフの説明は、Adobe-Japan1-*_ordering.txt で確認できます。

源ノ角ゴシックであれば、単純に 6375 個ほどのグリフが不足しているわけですが、その多くは、縦書き用の90度回転した欧文グリフや、斜体のグリフ、囲み文字など、あまり使われないような文字がほとんどです。

そのため、これらが空であっても、たいして問題はありません。
mergefonts 用のマッピングファイルを出力
グリフの確認は終わりました。

次は、AFDKO の mergefonts コマンドを使って、Adobe-Japan1 の各 CID に源ノフォントのグリフを割り当てたフォントを作成していきます。

mergefonts コマンドは、複数または単体のフォントのグリフから、一つのフォントを作成することができます。
主に、合成フォントを作るために使われますが、グリフの名前を変更する目的でも使うことができます。

まずは、mergefonts を使う前に、実行に必要なファイルを用意します。
グリフのマッピングファイルと、CID のフォント情報です。
マッピングファイル
mergefonts で、一部のグリフを別の名前に変更する場合は、その情報をファイルに記述して、指定する必要があります。
書式は以下のようになっています。

mergefonts [CID フォント辞書名]
[変換先の CID or グリフ名] [変換元の CID or グリフ名]
...

例:
mergefonts SansAJ-Regular-Generic
00000 00000
07479 01078
07480 01079

  • 1行目には、必ず "mergefonts" を記述する。
  • mergefonts の後に、CID フォントのフォント辞書の名前を指定できる。
  • CID 番号は 10 進数で表記し、桁数は自由 (CID は最大5桁)。
  • 行頭が '#' で、コメント。
  • 行末には常に改行が必要。
  • .notdef (CID 0) のグリフは必ず含めること。

mergefonts コマンドでは、ファイルの先頭が "mergefonts" かどうかで、フォントファイルかマッピングファイルかを判断しているので、先頭には必ず "mergefonts" を記述してください。

欧文などの CFF フォントでは、各グリフはグリフ名で識別されるので、その場合は CID 番号ではなく、グリフ名を記述することになります。
CID フォントのフォント辞書
CID フォントでは、フォント内に、複数のフォント辞書が存在し、各グリフは、そのフォント辞書に所属します。

例えば、源ノ角ゴシック CJK の Regular であれば、フォント自体の PostScript 名は「SourceHanSans-Regular」ですが、その中には、以下のようなフォント辞書名が存在します。

SourceHanSans-Regular-Alphabetic
SourceHanSans-Regular-AlphabeticDigits
SourceHanSans-Regular-Dingbats
SourceHanSans-Regular-DingbatsDigits
...

Adobe-Japan1-*_ordering.txt を見てみるとわかりますが、フォント辞書名の末尾の "Alphabetic" などは、各グリフの文字種を表しており、SourceHanSans-Regular-Alphabetic のフォント辞書内には、アルファベットのグリフが格納されています。

このように、CID フォントでは、各グリフの文字種別にフォント辞書が作成されるのが一般的であるため(必須ではありません)、CID フォントを作成する場合は、同じようにするのが好ましいでしょう。

mergefonts のマッピングファイルでは、1行目の "mergefonts" の後に、このファイルで指定されているグリフが所属するフォント辞書名を指定することができます。
指定名のフォント辞書が存在しない場合は新しく作成され、存在する場合は、そこにグリフが追加されます。

フォント辞書名は、基本的に、フォントの PostScript 名に、"-" と文字種の名前を付加した文字列となります。

※一つのマッピングファイルには、一つのフォント辞書しか指定できないので、複数のフォント辞書を指定する場合は、複数のマッピングファイルが必要になります。
スクリプトでマッピングファイルを作成
>> remap-tool.py
(未使用グリフを確認した、先のスクリプトと同じです)

remap-gsub.py で出力したマッピング情報から、mergefonts 用のマッピングファイルを複数出力します。

$ python3 remap-tool.py -m 7 SansAJ-Regular out2.txt Adobe-Japan1-7_ordering.txt [-o DIR]

-o は、マッピングファイルの出力ディレクトリを指定します。
必要があれば、指定してください。

-m <suppliment> <PostScript名> で、各ファイルを元に、margefonts のマッピングファイルを出力します。

Suppliment は、作成するフォントの ROS の3番目の番号です (3〜7)。
最終的に Adobe-Japan1-7 のフォントを作成するのであれば、"7" を指定します。
それ以前の ROS にしたいのであれば、その番号を指定してください。
CID の総数を、各 ROS に対応した数に減らすだけで、対応できます。

2番目で指定する PostScript 名は、マッピングファイルのフォント辞書名の指定で使います。
最終的に出力するフォントの PostScript 名を指定してください。
基本的には、フォント名から空白や記号などを除外して、"-" とスタイル名を追加した名前となります。
ここでは、仮に "SansAJ-Regular" としておきます。

次に、remap-gsub.py で出力した、CID の割り当て情報のファイルを指定します。

その次に、以下でダウンロードしたファイルを指定してください。
(省略時は "Adobe-Japan1-7_ordering.txt")
各 CID の文字種を取得するために使います。

https://github.com/adobe-type-tools/Adobe-Japan1
- Adobe-Japan1-7_ordering.txt
出力結果
文字種ごとに、map-*.txt のファイルが複数出力されます。

なお、グリフが割り当てられていない CID では、元フォントの CID 0 のグリフを割り当てます。

CID 0 は、.notdef のグリフです。
フォント内にグリフが存在しない時に使われる字形がセットされています。

グリフを定義せずに、空にすることもできますが、CID フォントは基本的にすべての定義グリフが埋まっているものなので、空にせずに、グリフをセットします。
CID フォントの情報
mergefonts で CID フォントを作成する場合は、出力する CID フォントの情報を記したテキストファイルが必要になります。

以下のそれぞれの項目を、出力するファイルに合わせて記述してください。
( ) 内は文字列です。

[cidfontinfo]
FontName       (SansAJ-Regular)
FullName       (SansAJ Regular)
FamilyName     (SansAJ)
Weight         (Regular)
AdobeCopyright (Copyright 2014-2021 Adobe (http://www.adobe.com/), with Reserved Font Name 'Source'.)
Trademark      (Source is a trademark of Adobe in the United States and/or other countries.)
FSType         0
isFixedPitch   false
version        1.0
Registry       (Adobe)
Ordering       (Japan1)
Supplement     7

[*] は必須の項目です。
FontName [*]フォントの PostScript 名
FullNameフォントの表示名
FamilyNameフォントのファミリ名
Weightスタイル名
AdobeCopyright
Trademark
著作権文字列。
AdobeCopyright + Trademark の文字列が、Notice の文字列としてセットされる。
FSTypeフォント埋め込みに関するフラグ。
0 で、フォントは埋め込み可でインストールも可。
isFixedPitch固定幅か (デフォルトで false)
version [*]フォントのバージョン。
小数点以下ありの数値で指定します。0 は指定できません。
Registry [*]
Ordering
Suppliment
ROS の文字列と数値。
3つを合わせると、ROS となります。
Adobe-Japan1-7 より前の ROS にしたい場合は、Supplement の数字を変更してください。

AFDKO の mergefonts のソースコードを見てみると、これらの項目は、
c/mergefonts/source/mergeFonts.c の readCIDFontInfo 関数内で処理されています。

※最終的に makeotf で OpenType を作成する際、これらの情報はそのまま維持され、上書きされることはありませんので、ここで確実な値を設定しておいてください。
mergefonts で CID フォントを作成
必要なファイルが揃ったので、実際に mergefonts を実行して、源ノフォントを Adobe-Japan1 の CID フォントに変換します。

以下は、源ノ角ゴシックの場合です。

$ mergefonts -cid cidfontinfo out.cff map-Generic.txt SourceHanSansJP-Regular.otf map-Proportional.txt SourceHanSansJP-Regular.otf map-HRoman.txt SourceHanSansJP-Regular.otf map-HKana.txt SourceHanSansJP-Regular.otf map-Dingbats.txt SourceHanSansJP-Regular.otf map-Kana.txt SourceHanSansJP-Regular.otf map-Alphabetic.txt SourceHanSansJP-Regular.otf map-Kanji.txt SourceHanSansJP-Regular.otf map-AlphaNum.txt SourceHanSansJP-Regular.otf map-ProportionalRot.txt SourceHanSansJP-Regular.otf map-HRomanRot.txt SourceHanSansJP-Regular.otf map-HKanaRot.txt SourceHanSansJP-Regular.otf map-DingbatsRot.txt SourceHanSansJP-Regular.otf map-GenericRot.txt SourceHanSansJP-Regular.otf map-Ruby.txt SourceHanSansJP-Regular.otf

-cid で、CID フォントを作成します。
その後には、CID フォントの情報を記述したテキストファイルを指定します。

次に、出力するファイル名を指定します。
※ mergefonts で出力されるのは、OpenType フォントではありません。

その後は、グリフのマッピング情報のファイルと、入力のフォント名を対にして指定します。
出力されるフォント
mergefonts で CID フォントを出力する場合は、CFF 形式の CID フォントが作成されます。
OpenType の CFF テーブルに直接格納されるようなフォーマットとなっています。

CFF フォントには、基本的に、グリフのアウトラインデータと、最低限のフォント情報しか含まれていません。

Unicode とのマッピング情報など、実際にフォントとして使うための多くの情報が含まれないため、このままではまともに使うことはできません。
実際は、このファイルを元にして、makeotf コマンドを使って、OpenType フォントを作成する必要があります。
入力ファイルの指定
入力ファイルは、「マッピングファイル フォントファイル」で、2つを対にして指定するか、フォントファイルのみを指定します。
連続で複数の入力ファイルを指定できます。

フォントファイル指定の前に、マッピングファイルの指定がない場合(前のファイル名の中身の先頭が "mergefonts" ではない時)は、すべてのグリフを、同じグリフ名で、そのまま変換先にコピーします。

もし、複数の入力ファイルで、同じグリフ名にグリフがセットされるような場合は、最初に処理したグリフが優先され、後のフォントのグリフは無視されます。
複数のフォント辞書がある場合
今回の場合、入力フォントは一つですが、CID のフォント辞書を複数作成する必要があります。

一つのマッピングファイルには、一つのフォント辞書しか指定できないため、複数のマッピングファイルを作ってフォント辞書を指定し、入力フォントには、すべて同じファイルを指定することになります。

これらを一つ一つ手作業で入力するのは大変なので、カレントディレクトリにあるマッピングファイル (map-*.txt) と、指定フォント名を、対にして出力するシェルスクリプトを作りました。

引数でフォント名を指定すると、"マッピングファイル フォント名 ..." という文字列が出力されるので、それをコピーして使ってください。

[mapfile.sh]
#!/bin/sh

if test "$1" = "";then
    echo "need fontname"
    exit 0
fi

o=""
for f in map-*.txt;do
    o="$o $f \"$1\""
done

echo "$o"

$ sh mapfile.sh SourceHanSansJP-Regular.otf
結果
問題なければ、指定した出力ファイル名 (out.cff) で、CFF 形式の CID フォントが出力されます。

この状態ではまだ、各 CID に対して、対応するグリフデータが割り当てられただけなので、ここからさらに、フォントの詳細な情報を設定して、OpenType フォントを作成する必要があります。