AFDKOで縦書きに対応したフォントを作る

# はじめに
pythonのフォント作成ライブラリのufo2ft, defconでフォントを生成するとき、縦書きに対応したグリフを設定することができません。
縦書き用のグリフを持たないフォントは、縦書きの際に、カギカッコ（「」）や句点（。）、読点（、）、小仮名（ぁぃぅぇぉっゃゅょゎ等）が崩れることになります。そのようなフォントはクオリティが低いと言わざるを得ません。

そもそも縦書きが行えないのは、OpenTypeのvertテーブル、vrt2テーブルに必要な情報が設定されていないためです。
そこで今回は、OpenTypeフォント作成ツールであるAFDKOを使用して、縦書きに対応したフォントを作成します。
AFDKOを使うのは筆者はこれが初めてなので、間違った記述があるかもしれませんが、ご容赦ください。

# AFDKOとは

https://github.com/adobe-type-tools/afdko

AFDKO(Adobe Font Development Kit for OpenType)は、Adobeが公開しているOpenTypeフォントの構築・情報取得を行うツール群です。
python3環境で`pip install afdko`することでインストールできます。
使用する際はpower shell等のターミナルからコマンドを実行します。

# フォント作成の流れ
### 用意するもの
- 横書き用グリフを書き出したOpenTypeフォント（横書きで使うすべてのグリフを含む）
- 縦書き用グリフを書き出したOpenTypeフォント（小仮名、約物・記号など、縦書きの際に置換するグリフだけを含む）

### 概要
OpenTypeフォントを直接OpenTypeフォントにマージすることはできません。
そのため横書きフォントと縦書きフォントを結合した中間ファイルのcidフォントを作成し、cidフォントからOpenTypeフォントを作成します。
フォント作成の流れは以下の通りです。
```
横書き用OpenType + 縦書き用OpenType - (mergefontコマンド) -> cidフォント
cidフォント - (makeotfコマンド) -> OpenTypeフォント
```

このときのcidフォントの文字セットは`Adobe-Japan1-7`を使用します。日本語フォントではもっとも文書類が豊富でデファクトスタンダードとなっている、Adobeが制定した文字セットの規格です。

https://github.com/adobe-type-tools/Adobe-Japan1


# フォントを作成する
## 1.cidフォントを作成する
cidフォントの作成には、mapファイルとcidfontinfoファイルが必要です。

### 1.1. mapファイルを用意する
mapファイルは以下の形式のファイルです

```
mergefonts [CID フォント辞書名]
[変換先のCID] [グリフ名]
```
[↑aznote.jakou.comより引用、一部改変](https://aznote.jakou.com/afdko/conv04.html)

このmapにより、Opentypeフォントのあるunicode番号のグリフをAdobe-Japan1-7のcidに紐づけます。
通常のかな文字はmap-Kana.txtに、縦書きの際に置換が必要なグリフのみをmap-Vert.txtに定義します。
cidについてはAdobe-Japan1のリポジトリにおいてある`Adobe-Japan1-7.pdf`や`Adobe-Japan1-7_ordering.txt`を参照してください。
表の「変換元のグリフ名」は、変換元のフォントファイルのグリフ名に適宜読み替えてください。変換元のグリフ名は数字だけにするとcidだと認識されてうまくいかないので、アルファベットを含んでいるのが無難だと思います。

| 変換元ファイル | 変換元ファイルのグリフ | mapファイル | 変換元のグリフ名 | Adobe-Japan1-7のcid |
| :--: | :--: | :--: | :--: | :-: |
| 横書き用OpenType |ぁ| map-Kana.txt | u12353 | 842 |
| 縦書き用OpenType |ぁ| map-Vert.txt | u12353 | 7918 |
| 横書き用OpenType |あ| map-Kana.txt | u12354 | 843 |
| 横書き用OpenType |ぃ| map-Kana.txt | u12355 | 844 |
| 縦書き用OpenType |ぃ| map-Vert.txt | u12355 | 7919 |
| 横書き用OpenType |い| map-Kana.txt | u12355 | 845 |


表をmapファイルにすると以下の通りになります。
CIDフォント辞書名は適当な名称でも支障はなかったです。（本当は良くないのでしょうが）

```map-Kana.txt
mergefonts Test-Regular-Kana
00842 u12353
00843 u12354
00844 u12355
00845 u12356
(以下略)
```

```map-Vert.txt
mergefonts Test-Regular-Kana
07918 u12353
07919 u12355
07920 u12357
(以下略)
```

### 1.2. cidfontinfoを作成する
cidフォントに埋め込む情報を設定するため、以下の形式のファイルを作成します。
作成するフォント名・著作権者に応じて値は変更してください。

```cidfontinfo
FontName       (Test-Regular)
FullName       (Test Regular)
FamilyName     (Test)
Weight         (Regular)
AdobeCopyright (-)
Trademark      (-)
FSType         0
isFixedPitch   false
version        1.0
Registry       (Adobe)
Ordering       (Japan1)
Supplement     7
```

### 1.3. cidフォントを作成する
Power Shell等のターミナルで以下のようなコマンドを実行します。out.cffが出力されていればOKです。
なおmap-Generic.txtでは`00000 u0`を設定しています。cid=0, いわゆる「豆腐」に当たる文字がないとcidフォントが書き出せないためです。
`mergefonts -cid cidfontinfo out.cff map-Generic.txt Test.otf map-Vert.txt TestVert.otf map-Kana.txt Test.otf`

## 2. cidフォントからOpenTypeフォントを生成する
FontMenuNameDBファイルとfeatures.fea ファイルの作成が必要です。

### 2.1. FontMenuNameDBファイルを作成する
FontMenuNameDBではフォント名を設定します。

[]にPostScript名を設定します。cidfontinfoのFontNameと同一でないと認識されないようです。
f,s,lでファミリー名、スタイル名、フルネームを設定します。
日本語環境で日本語名のフォント名を表示する場合は、unicodeに変換したコードを並べて表記します。
例えば「テ」はU+30C6, 「ス」はU+30B9、「ト」はU+30C8なので、以下のようになります。
`3,1,0x411`は日本語環境であることを表す値です。

```
[Test-Regular]

f=Test
s=Regular
l=Test Regular

f=3,1,0x411,\30c6\30b9\30c8
s=3,1,0x411,Regular
l=3,1,0x411,\30c6\30b9\30c8 Regular
```


### 2.2. feature.feaファイルを作成する
feature.feaではフォントに含まれる各テーブルの情報を設定します。
テーブルでは、著作権・ライセンス情報、文字の高さやカーニング、異体字、リガチャ、そして縦書きの際に置換するグリフの情報など、文字の形以外のほとんどの情報を設定します。

縦書きにかかわるテーブルはvertとvrt2の2つです。

```feature.fea
(略)

feature aalt useExtension {
　(略)
  feature vert;
  feature vrt2;
　(略)
} aalt;

(略)

feature vert {
  substitute \842 by \7918;
}vert;

feature vrt2 {
  substitute \842 by \7918;
} vrt2;

(略)
```
のように設定してください。
mapファイルで設定した通り、cid=842は横書きの「ぁ」、cid=7918は縦書きの「ぁ」です。
ここではfeature.feaの詳細は説明できないので、参考サイトをご覧ください。

注意点として、作成するフォントに存在しないcidがfeature.feaに含まれているとエラーになります。
カーニング設定等も全て入れこまなくてはいけないこともあり、作成するのは非常に面倒くさいです。
元にするフォントがある場合、AFDKOの'spot'でGSUB(グリフの置換情報)、GPOS(グリフのカーニング情報)を取得できるので、そこから各テーブルの情報を設定すると楽でしょう。
コマンドは以下の通りです。
`spot -t GSUB=7 X.otf > gsub.txt`
`spot -t GPOS=7 X.otf > gpos.txt`

### 2.3. Adobe-Japan1のリポジトリからファイルを入手する
Adobe-Japan1のGitHubリポジトリから`UniJIS2004-UTF32-H`, `Adobe-Japan1_sequences.txt`を入手します。
異体字の設定が不要な場合は`Adobe-Japan1_sequences.txt`は中身が空のファイルで問題ありません。

### 2.3. makeotfコマンドを実行
以下のコマンドを実行します。
`makeotf -f out.cff -mf FontMenuNameDB -ff features.fea -ch UniJIS2004-UTF32-H -ci Adobe-Japan1_sequences.txt`

`フォント名.otf`が出力されていれば完成です！

# まとめ
GUIによるファイル作成ソフトでも、縦書き対応のため一文字づつ設定を行うのは大変な作業だと思います。
AFDKOによるフォント作成は、コマンドを数回実行するだけでAdobe-Japan1-7準拠のちゃんとしたフォントが作成できる、非常に強力なツールです。
設定ファイルは使い回すこともできるので、苦労した分、次回以降は楽をすることができます。
クオリティの高いフォント作成のため、ぜひAFDKOを使ってみてください。

# 参考サイト
- http://adobe-type-tools.github.io/afdko/
- https://aznote.jakou.com/afdko/index.html
- https://shiromoji.hatenablog.jp/entry/20111206/1323270030