縦書きについて

縦書きのレイアウト
TrueType/OpenType の場合、フォント内に格納されているグリフの座標は、基本的に、欧文のベースラインを原点とした横書き時のものです。

稀に、縦書き専用のフォントとして、最初から座標を縦書き用に合わせたフォントもありますが、通常は、横書きを基本として、縦書きにも対応するといったフォントがほとんどです。

実際の縦書きの描画時に、グリフの座標がどのように扱われるかというと、実は、フォント内では縦書き用の追加情報というのはほどんどなく、横書き用に配置されたグリフのアウトラインをそのまま流用する形になります。
FontForge の設定
FontForge で縦書きを有効にする場合は、フォント情報の「一般情報」の項目の中の、
縦書きメトリックが存在」のチェックを ON にする必要があります。
配置
縦書き時のグリフの横幅は、基本的にすべて全角幅として扱われます (EM の値と同じ)。

縦書き時の場合、グリフの座標は、
X 方向では 0〜EM の全角幅、
Y 方向では、上端が ascent (フォント情報の「高さ」)、全角の下端が -descent (フォント情報の「深さ」を負の値にしたもの) となります。

※ CID フォントの場合は、「CIDフォント情報」での高さと深さの値です。



(0, ascent) を左上として、下方向にグリフを配置するような形となるので、縦書き用のグリフを作る際は、そのような位置でパスを配置してください。

なお、漢字などの文字は、ほとんどが (0, ascent) - (EM, -descent) の全角枠の中心に置かれるように配置されているため、横書き時と縦書き時で配置の変化がなく、そういったグリフは、そのままの座標値で横書きも縦書きも両方描画できます。

逆に言うと、たとえグリフの形が同じでも、横書きと縦書きで座標の配置が異なるものは、別のグリフとして作る必要があります。
送り幅
縦書き時のグリフの高さ (次の文字への移動幅) は、基本的に全角高さである場合が多いですが、グリフによっては半角高さにしたりする場合もあるため、各グリフごとに設定が必要になります。

横書き時は横書き用の送り幅が設定できますが、それと同じように、縦書き時は、縦書き用の送り幅を別途設定できます。
(フォントに縦書きメトリックの情報がある場合のみ)

FontForge では、縦書き時の送り幅は、「メトリック」>「縦書き時の送り幅を設定」で設定できます。
縦書きグリフへの置換
横書きと縦書きでグリフの形や配置が異なる場合、横書きのグリフとは別に、縦書き用のグリフを作る必要があります。

フォントで文字を描画する際に、フォント内のグリフを取得する時は、Unicode などでコードを指定して検索しますが、縦書き用に作られたグリフは、基本的にはそういった方法では取得できません。

では、どうやって縦書き用のグリフを取得するかと言うと、フォント描画時の内部処理は以下のようになっています。

縦書き時の内部処理
  1. Unicode などから、フォント内のグリフの ID (横書き用) を取得。
  2. 縦書き時は、フォントの GSUB テーブルから、'vert' または 'vrt2' の情報を使って、上記のグリフ ID を検索。
  3. グリフ ID が見つかった場合、そこに、対応する縦書きグリフの ID が格納されているため、その ID を取得。
  4. 縦書き用のグリフ ID があった場合はそのグリフを、なければ横書き用のグリフを使って描画。

このように、フォント内には、横書きのグリフから、縦書きグリフに置き換えるための情報が含まれているので、これを使って縦書きグリフを取得します。
vert と vrt2
フォント内にある、縦書きグリフ置換のための情報は、GSUB というテーブル内の、vert と vrt2 の情報です。

vrt2 は、欧文を時計回りに 90 度回転したグリフを含む、縦書きの置き換え情報です。
vert は、それらのグリフを含まない、縦書きの置き換え情報です。

縦書き中に、半角の欧文を、90 回転した上で横書きに描画したい場合は、vrt2 を使います。
半角欧文を、そのまま通常の向きで描画したい場合は、vert を使います。

フォントによっては、vert/vrt2 両方の情報がある場合があり、その場合は、各ソフトの処理側で好きな方を使うことができます。
(欧文の回転グリフ以外は、基本的に vert と vrt2 で同じグリフ情報が含まれています)

フォント内に vert もしくは vrt2 の一方しかない場合、縦書きの置き換えにはその一つを使うことになります。

フォントを作成する立場から言うと、欧文を回転したグリフを含む場合は、vert/vrt2 を両方含めると良いです。
欧文を回転したグリフを含まない場合は、vert だけで構いません。
FontForge での vert/vrt2 新規作成
新規作成したフォントや、元々 GSUB (vert/vrt2) の情報がないフォントで、縦書きグリフへの置き換え情報を設定したい場合は、まず、「フォント情報」から GSUB の lookup を新規作成する必要があります。

フォント情報を開き、「Lookups」の項目を選択してください。
※ CID フォントの場合は、「CID」>「CIDフォント情報」で開いてください。

GSUB のリスト内に、すでに vert または vrt2 が存在する場合は、そのままで OK です。

vert/vrt2 がない場合は、「Add Lookup」ボタンから追加します。

Lookup
「種類」は、「単純置換」を選択してください。
単純置換は、一つのグリフ ID を、別の一つのグリフ ID に置き換えます。

「Lookup Name」はデフォルトで名前が付けられていますが、好きなように名前を変えることも出来ます (FontForge 上でのみ使われる名前です)。

「機能」の「<New>」の横にあるメニューボタンを押して、「vert Vertical Alternates」を選択し、項目を追加してください。

「用字系と言語」は、とりあえずデフォルトでも構いませんが、日本語にするなら、以下のようにしてください。

用字系言語
DFLTdflt
hani (CJK 統合漢字)dflt (Default)
kana (平仮名と片仮名)dflt (Default)

設定できたら、「OK」を押してください。

サブテーブル
GSUB のリストに、Lookup Name の名前で項目が追加されているので、それを選択した状態で、「Add Subtable」ボタンを押してください。
サブテーブルの名前の入力が求められますが、デフォルトで構わないので、「OK」を押してください。

その後、サブテーブルのウィンドウが表示されますが、ここでは何も行わずに、「OK」だけを押してください。
すると、リスト上で、新規作成した lookup の下に、サブテーブルが追加されます。

完了
これで lookup の新規作成は終了です。

もし、vrt2 も追加するなら、同じ手順を繰り返して、種類には「vrt2 縦書き字形と回転済み文字」を選択して、作成してください。
Lookup について
フォントによっては、vert/vrt2 で複数の Lookup が存在する場合があります。

それらは、CJK フォントなど、複数の用字系を含むフォントで、各用字系 (日本語や中国語など) によって、グリフの置き換え先などを変える必要がある場合のために、用字系ごとにデータを分割しているためです。

フォントを合成した場合、各フォントごとで元の Lookup が追加されますが、出力したフォント上では、すべてのデータが参照される形になるので、複数の種類で複数の Lookup があっても問題ありません。
縦書き用グリフの新規作成
一部の縦書き用の文字は Unicode で割り当てられている場合もありますが、それ以外の縦書き用のグリフは、Unicode などのエンコーディング外のグリフとして追加する必要があります。

CID フォントの場合は、基本的に、縦書き用グリフも各 CID に割り当てられているため、対応する CID を使ってください。

グリフの追加
FontForge で、現在のエンコーディングに存在しない文字をグリフとして追加する場合は、
「エンコーディング」>「エンコーディングスロットを追加」を実行します。

すると、グリフをいくつ追加するかを聞いてくるので、必要な数を入力して、追加します。

その後、グリフ一覧の終端に、"NameMe.****" という名前のグリフが新規追加されます。
(「定義済みのグリフのみ表示」が ON になっている場合は、OFF にしてください)

グリフ名
グリフの新規作成後は、用途に応じて、グリフ名を付けておきましょう。

「エレメント」>「グリフ情報」を開いて、「Unicode」の項目の「Glyph Name」でグリフ名を変更します。

名前は、他のグリフ名と重複しなければ何でも構いません。
縦書き用グリフの場合は、横書き用のグリフ名 + ".vert" を付けるのが一般的です。

エンコーディング外のグリフを検索する場合は、グリフ名を指定することになるので、わかりやすい名前にしておいてください。
横書きグリフに縦書きグリフを関連付ける
FontForge のフォント内で vert/vrt2 が作成されている状態であれば、「グリフ情報」から、横書きのグリフに対して、縦書きグリフの置き換え情報を設定することができます。

横書きのグリフを選択して、「グリフ情報」を開き、「置換」の項目を選択してください。

置き換えを新規追加する場合は、「<新しい置換の変種>」をクリックして、「'vert' ... または 'vrt2' ...」を選択します。

選択後、リストに項目が追加されるので、その右側の「Replacement Glyph Name」の部分をクリックして、置き換え先の縦書き用グリフの名前を入力してください。
(グリフの名前は、グリフ情報の「Unicode」→「Glyph Name」の名前です)

フォント内に vert と vrt2 の両方の情報が含まれる場合、欧文の回転グリフ以外のすべてのグリフで、vert と vrt2 の両方の情報を設定してください。