源亜こぶり明朝作成の備忘録

Kindle Oasis/Paperwhite用フォント「源亜こぶり明朝」について、その作成の方法を備忘録として残す。

何故フォントを作ろうと思ったのか

Kindle Oasis/Paperwhite組込みのフォントはヒラギノのような見た目をしており、視認性が高いのだが、優秀なフォントであるが故に、長文になるほど文字の主張が強くなり、文章よりも際立ってしまう欠点がある。
代替の候補となるフォントはいくつかあるが、その中の一つに源暎こぶり明朝がある。
源暎こぶり明朝は御琥祢屋様が『〝普通〟であることが特徴の仮名を持つ文芸・縦組み・長文向け本文明朝体』として公開しているフォントである。
非常に人気が高く、自主制作等でよく見られるフォントだ。
では、なぜそのようなフォントがあるにもかかわらず、わざわざフォントを作るに至ったのか。

源暎こぶり明朝をそのままKindleに適用すると、表示が崩れるからだ。縦書きのアルファベットは固定幅フォントとなり、間がスカスカになって気持ち悪い。

表示崩れの例(クリックで表示)

おそらくKindleとの相性が悪いのであろうと推察する。(というか日本語フォントは全般的にKindleとの相性が悪い。)
文字の形自体は非常に素晴らしくKindle上で使えないのが勿体ないので、なんとかこのグリフをKindle上で再現できないか試行錯誤を行った。

以下フォントの作り方に対する説明であるが、興味の無い人はここからダウンロードいただきたい。

目次

前提

  • 自分が趣味プログラマーレベルである点と、表示を司るフォントを触るという性質、アップデートが頻繁にはされないという背景から、極力fontforgeアプリケーション上で操作を行い、プログラミングに頼るのは最低限とする。
  • 本内容を応用することで源暎こぶり明朝以外のフォントもKindleに最適化できるが、参考にする際はライセンスを必ず確認し、ライセンスから逸脱しないフォントを使用すること。
  • Windows 10、fontforge(20th Anniversary Edition)、cygwin(X, fontforge, python)を使用。

1. 回転体フォントの削除

源暎こぶり明朝には時計回りに90度傾けたグリフが存在するが、90度傾いたアルファベットを使用すると固定幅となるようである。
まずは90度傾いたフォントを削除する。
具体的には

  • [16638, 0x40fe, U+????, cid08720, (.notdef)]
    ~ [16918, 0x4216, U+????, cid09147, (.notdef)]
  • [17398, 0x43f6. U+????, cid12870, (.notdef)]
    ~ [17429, 0x4415, U+????, cid12934, (.notdef)]

ここまで出来たら.sfd形式で保存する。

2. 標準体フォントの情報設定

エレメント > フォント情報から、最低限次のように設定する。

  • [PS Name]タブ
    • ファミリー名: アルファベットで付けたいフォント名(ウェイトなし)
    • フォント名: ファミリー名からスペースを削除し、ウェイト(Regular)を追記
    • 表示用の名前: ファミリー名にウェイト(Regular)を追記
    • ウェイト: Regular
    • 著作権: 自分の著作権を追記
  • [一般情報]タブ
    • 縦書きメトリックが存在: チェックされていることを確認
  • [OS/2]タブ
    • ベンダID: 適当なアルファベット4文字
  • [TTF名]タブ
    • 著作権(日本語): 自分の著作権を追記
    • ファミリー(日本語): 日本語で付けたいフォント名(ウェイトなし)
    • スタイル(サブファミリー)(日本語): Regular
    • フルネーム(日本語): 日本語ファミリー名にウェイト(Regular)を追記
    • 製造元, デザイナー, 説明(日本語/英語): 適当に修正
    • ベンダのURL(英語): 適当に修正
    • 著作権, ファミリー, スタイル(サブファミリー), フルネーム(英語): [PS Name]タブと同じ内容になっていることを確認

ここまで来たら再度保存。

3. 太字体の作成

以下のコードをフォントと同じ場所に置き、CygwinのX-Windowから実行する。

bold.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# -*- coding:utf-8 -*-
from os import getenv
from os.path import splitext

import fontforge

stroke_width = 16.5

def Bold(in_file):
font = fontforge.open(in_file)

font.selection.all()
for glyph in list(font.selection.byGlyphs):
if glyph.altuni != None:
_change_weight(glyph, stroke_width / len(glyph.altuni))
else:
_change_weight(glyph, stroke_width)
font.removeOverlap()

font.save(f"[Font Name]-Bold.sfd")

font.close()
return 0

def _change_weight(glyph, num):
glyph.changeWeight(num, "auto", 0, 0, "auto", 1)

Bold("[Font Name]-Regular.sfd")

ここでは エレメント > スタイル > ウェイトを変更 と同じ機能を用いて太字体を作成している。(エレメント > 輪郭を太らせる でも太字体を作成できるが、設定パラメータが多いため今回はウェイト変更とした。)
ここでpythonによる変形を用いているのは、fontforge上で行うと文字によって太さがバラバラになるためである。
各グリフにはAlternate Unicodeと呼ばれるものが設定されている場合があり、例えば一つのグリフに対し複数の文字を設定する、等の用途だと思われる。このAlternate Unicodeが設定されていると、文字を太くする操作時に、このAlternate Unicodeが設定されている回数分文字を太くする操作がかかるため、グリフによって文字の太さが変わってしまう。(他の変形ではAlternate Unicodeが設定されている数によらず操作される)
この仕様を回避するために、ターゲットの太さをAlternate Unicodeの数で割り、それをAlternate Unicodeの回数分行うことでターゲットの太さを実現している。
なお、stroke_widthは太すぎても細すぎても文字が潰れてしまう。ここで設定している16.5という数字は試行錯誤で見つけ出した値である。

Alternate Unicode 設定無しの例(クリックで表示)
Alternate Unicode 1つ設定の例(クリックで表示)
Alternate Unicode 2つ設定の例(クリックで表示)

好みで以下のグリフをRegularの物に置き換える

  • [830, 0x33e, U+24EB, uni24EB, NEGATIVE CIRCLED NUMBER ELEVEN]
    ~ [839, 0x347, U+24F4, uni24F4, NEGATIVE CIRCLED NUMBER TWENTY]
  • [850, 0x352, U+24FF, uni24FF, NEGATIVE CIRCLED DIGIT ZERO]
  • [1039, 0x40f, U+2776, uni2776, DINGBAT NEGATIVE CIRCLED DIGIT ONE]
    ~ [1048, 0x418, U+277F, uni277F, DINGBAT NEGATIVE CIRCLED DIGIT TEN]
  • [15365, 0x3c05, U+1F150, u1F150, NEGATIVE CIRCLED LATIN CAPITAL LETTER A]
    ~ [15416, 0x3c38, U+1F189, u1F189, NEGATIVE SQUARED LATIN CAPITAL LETTER Z]

ここまで終わったら、生成されたsfdファイルを開き、エレメント > フォント情報から、最低限次のように設定変更する。

  • [PS Name]タブ
    • フォント名: RegularをBoldに変更
    • 表示用の名前: RegularをBoldに変更
    • ウェイト: Bold
    • ファミリー名は変更しない
  • [OS/2]タブ
    • ウェイトクラス: 700 Bold
    • Style Map: RegularをBoldに変更
  • [TTF名]タブ
    • スタイル(サブファミリー)(日本語): Bold
    • フルネーム(日本語): RegularをBoldに変更
    • ファミリー名(日本語)は変更しない

4. 斜体の作成

Kindleは自力でフォントを歪ませる事が出来ず、斜体のフォントを用意しないと斜体表示が出来ない。

斜体は標準体、太字体を変形して作成する。
横書きフォントの斜字体は 編集 > 全て選択 をし、 エレメント > 変形 > 変形 から[選択領域の中心][傾き, 13, clockwise]を設定し、チェックを全て外してOKする。
縦書きフォントの斜字体は 編集 > 全て選択 をし、 エレメント > 変形 > 変形 から[選択領域の中心][回転, 90, withershins][傾き, 13, clockwise][回転, 90, clockwise]を設定し、チェックを全て外してOKする。
縦書きフォントの斜字体に限り、以下のグリフを横書き斜字体に置き換える。

  • [0, 0x0, U+00A0, uni00A0, NO-BREAK SPACE]
    ~ [556, 0x22c, U+215E, seveneighths, VULGAR FRACTION SEVEN EIGHTHS]
  • [15846, 0x3de6. U+????, cid00230, cid00230]
    ~ [15941, 0x3e45, U+????, cid00390, (.notdef)]
  • [16150, 0x3f16. U+????, cid00599, (.notdef)]
    ~ [16185, 0x3f39, U+????, cid00673, (.notdef)]

(2021/07/29更新)

  • [0, 0x0, U+00A0, uni00A0, NO-BREAK SPACE]
    ~ [96, 0x60, U+00A1, exclamdown, INVERTED EXCLAMATION MARK]
  • [99, 0x63, U+00A4, currency, CURRENCY SIGN]
    ~ [101, 0x65, U+00A6, brokenbar, BROKEN BAR]
  • [104, 0x68, U+00A9, copyright, COPYRIGHT SIGN]
    ~ [116, 0x74, U+00B5, mu, MICRO SIGN]
  • [118, 0x76, U+2219, uni2219, BULLET OPERATOR]
    ~ [122, 0x7a, U+00BB, guillemotright, RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK]
  • [126, 0x7e, U+00BF, questiondown, INVERTED QUESTION MARK]
    ~ [149, 0x95, U+00D6, Odieresis, LATIN CAPITAL LETTER O WITH DIAERESIS]
  • [151, 0x97, U+00D8, Oslash, LATIN CAPITAL LETTER O WITH STROKE]
    ~ [181, 0xb5, U+00F6, odieresis, LATIN SMALL LETTER O WITH DIAERESIS]
  • [183, 0xb7, U+00F8, oslash, LATIN SMALL LETTER O WITH STROKE]
    ~ [313, 0x139, U+2014, emdash, EM DASH]
  • [477, 0x1dd, U+1E3E, uni1E3E, LATIN CAPITAL LETTER M WITH ACUTE]
    ~ [492, 0x1ec, U+201A, quotesinglbase, SINGLE LOW-9 QUOTATION MARK]
  • [498, 0x1f2, U+2022, bullet, BULLET]
    ~ [500, 0x1f4, U+2026, ellipsis, HORIZONTAL ELLIPSIS]
  • [502, 0x1f6, U+2032, minute, PRIME]
    ~ [505, 0x1f9, U+203A, guilsinglright, SINGLE RIGHT-POINTING ANGLE QUOTATION MARK]
  • [508, 0x1fc, U+203E, uni203E, OVERLINE]
  • [515, 0x203, U+2070, uni2070, SUPERSCRIPT ZERO]
    ~ [532, 0x214, U+20AC, Euro, EURO SIGN]
  • [610, 0x262, U+2208, element, ELEMENT OF]
    ~ [618, 0x26a, U+2219, uni2219, BULLET OPERATOR]
  • [626, 0x272, U+2227, logicaland, LOGICAL AND]
    ~ [629, 0x275, U+222A, union, UNION]
  • [634, 0x27a, U+2234, therefore, THEREFORE]
    ~ [666, 0x29a, U+2298, uni2298, CIRCLED DIVISION SLASH]
  • [15123, 0x3b13, U+FB00, uniFB00, LATIN SMALL LIGATURE FF]
    ~ [15127, 0x3b17, U+FB04, uniFB04, LATIN SMALL LIGATURE FFL]
  • [15840, 0x3de0, U+????, cid00124, (.notdef)]
  • [15846, 0x3de6, U+????, cid00230, (.notdef)]
    ~ [15941, 0x3e45, U+????, cid00390, (.notdef)]
  • [16052, 0x3eb4, U+????, cid00401, (.notdef)]
  • [16150, 0x3f16, U+????, cid00599, (.notdef)]
    ~ [16183, 0x3f37, U+????, cid00632, (.notdef)]
  • [16380, 0x3ffc, U+????, cid07631, (.notdef)]
    ~ [16381, 0x3ffd, U+????, cid07632, (.notdef)]
  • [16560, 0x40b0, U+????, cid08059, (.notdef)]
    ~ [16561, 0x40b1, U+????, cid08060, (.notdef)]
  • [16568, 0x40b8, U+????, cid08228, (.notdef)]
  • [16717, 0x414d, U+????, cid09356, (.notdef)]
    ~ [16718, 0x414e, U+????, cid09357, (.notdef)]
  • [16801, 0x41a1, U+????, cid12080, (.notdef)]
    ~ [16809, 0x41a9, U+????, cid12101, (.notdef)]
  • [16811, 0x41ab, U+????, cid12119, (.notdef)]
  • [17815, 0x4597, U+????, cid16206, (.notdef)]
  • [17819, 0x459b, U+????, cid16280, (.notdef)]
    ~ [17820, 0x459c, U+????, cid16299, (.notdef)]
  • [17822, 0x459e, U+????, cid16301, (.notdef)]
    ~ [17832, 0x45a8, U+????, cid16311, (.notdef)]

ここまで終わったら、エレメント > フォント情報から、最低限次のように設定変更する。

  • [PS Name]タブ
    • フォント名: RegularをOblique、BoldをBoldObliqueに変更
    • 表示用の名前: RegularをOblique、BoldをBoldObliqueに変更
    • ウェイト: Oblique、またはBoldOblique
    • ファミリー名は変更しない
  • [一般情報]タブ
    • イタリックの傾き: -13
  • [OS/2]タブ
    • Style Map: RegularをItalic、BoldをBold Italicに変更
  • [TTF名]タブ
    • スタイル(サブファミリー)(日本語): Oblique、またはBoldOblique
    • フルネーム(日本語): RegularをOblique、BoldをBoldObliqueに変更
    • ファミリー名(日本語)は変更しない

ここまでで作業完了。
このあと縦書き斜体と横書き斜体を結合し、Lookupからvert、vrt2を設定出来れば斜体フォントは一つで良かったのだが、機械的に作る方法を考えるのが面倒になったので、これで終了。

完成

ダウンロードはここから。

謝辞

源ノ明朝/源ノ角ゴシックを配布してくださっているAdobe-Fonts
源暎こぶり明朝を配布、fontforgeで源ノ明朝/源ノ角ゴシックを改変する方法について解説してくださっている御琥祢屋
この場をお借りし、感謝申し上げます。

参考

fontforge Module attributes
OS/2 — OS/2 and Windows Metrics Table

コメント