フォント

提供:Turgenev's Wiki
2023年11月24日 (金) 21:01時点におけるTurgenev (トーク | 投稿記録)による版 (Notion-MW)

フォントに関する話題。AFDKOによるOpenTypeフォントの作成 も参照。

ttxの使用例: フォント名の変更

ttx

ttxはフォントの中身(またはその一部)をxmlに変えていじってからまたフォントに戻すことができるツールで、fonttoolsに含まれている。入れるのは簡単で、Pythonをインストールしてからpip install fonttoolsとすればよい。またttxはAFDKO(使えるコマンド一覧はこちら)をインストールすることによっても入れられる。こちらもpip install afdkoでよい。

なお、名前からするとtruetypeフォントにしか対応していなさそうだが、opentypeにも使える。実はopentypeはtruetypeの後継で、形式的に全く無関係なわけではなく、AFDKOのツールもこの両方に対応しているものが多い。

truetypeとopentypeの通常の拡張子はそれぞれ.ttfと.otfだが、.ttcや.otcと末尾がcになっているものはフォントコレクションといって複数のttfやotfが一緒にされたものである。

現在、ttxはttcをxmlにすることはできるが、それをttcに戻すことはできないhttps://github.com/fonttools/fonttools/issues/17)(というより多分、ttcを出力すること自体が全くできない)(当然otcもできない)ので、コレクションをフォント単体に分割する必要がある。これはAFDKOのotc2otf(これも名前に反してttcにも使える)を使うとできる。従って、ttcやotcを使う場合は、最初からAFDKOをインストールするほうがよい。

なお、どうせ選ばれるフォントは1つなので、分割して名前を変えたフォントを再びコレクションに戻す必要はないだろう(必要であればotf2otc(名前もさっきと逆なので注意)が使える)。

フォントファイルの選定

名前を変えるための元になるフォントファイルを選ぶ。ttf、ttc、otf、otcのどれかの拡張子のものを選べばよい。新たにダウンロードしてもよいし、インストール済みのC:\Windows\FontsやC:\Users\username\AppData\Local\Microsoft\Windows\Fontsから選んでもよい。以降で誤操作のおそれがあるので作業用フォルダにコピーしておくのがよい。

ところで、C:\Windows\Fontsはエクスプローラーだとコントロールパネル扱いで独特の表示がされていて、コマンドプロンプトで見るなどしないとファイルの拡張子がわからない。個人的にはシンボリックリンクを作成(cmdでmklink /J linkname targetname)してそこ経由で行くのがおすすめだが、そんなことをしなくても実は日本語フォントの拡張子は普通その4種類のどれかなのであまり問題はない。普通のフォルダと同様にフォントファイルのコピーはできるので、他のフォルダに貼り付けて、万が一違ったら考えればいいだろう。日本語フォント以外だとたまに「.fon」とかで終わる謎のフォントがあるがこれが使えるのかは知らない。

なお、フォントファイルをコピーするとなるとライセンスの問題が一応気になるが、同一PCにインストールする分には大丈夫かと思われる。改変についても、合理的な目的と個人利用の範囲であり、倫理的にもあまり問題はないだろう。もちろん、pdfビューアの表示以外でこの改変フォントをわざわざ使用するのはよろしくないかもしれないし、そうする意味もないだろう。

otc2otf

ttcやotcを選んだ場合はこれで分割する必要がある。といっても使い方も何もなく、otc2otf filenameを実行するだけである。フォント名に従ってわかりやすいファイル名で出力される。

ttxで名前の変更

いよいよ名前の変更を行う。ttfやotfのデータはいくつかの「テーブル」に分かれているが、今回使用するのはそのうちの「name」というテーブルである。ttxでこれを取り出すには

vb.net
ttx -t name fontfile.ttf

とする。tはtableの頭文字である。これで、fontfile.ttxというXMLが出力される。

中身はとても簡明で、メモ帳でも問題なく編集できる。

例えばこのような感じ

(このデータは花園フォントと同じくGlyphWikiのデータをもとにしたフォントとして筆者が最近公開したhttps://github.com/ge9/NazonoMinchoのものである)

vb.net
<?xml version="1.0" encoding="UTF-8"?>
<ttFont sfntVersion="OTTO" ttLibVersion="4.38">

  <name>
    <namerecord nameID="1" platformID="1" platEncID="0" langID="0x0" unicode="True">
      NazonoMincho Regular
    </namerecord>
    <namerecord nameID="2" platformID="1" platEncID="0" langID="0x0" unicode="True">
      Regular
    </namerecord>
    <namerecord nameID="3" platformID="1" platEncID="0" langID="0x0" unicode="True">
      0.001;YHVH;NazoMin
    </namerecord>
    <namerecord nameID="5" platformID="1" platEncID="0" langID="0x0" unicode="True">
      Version 0.001;hotconv 1.1.0;makeotfexe 2.6.0
    </namerecord>
    <namerecord nameID="6" platformID="1" platEncID="0" langID="0x0" unicode="True">
      NazoMin
    </namerecord>
    <namerecord nameID="16" platformID="1" platEncID="0" langID="0x0" unicode="True">
      NazonoMincho
    </namerecord>
    <namerecord nameID="1" platformID="1" platEncID="1" langID="0xb" unicode="True">
      謎乃明朝 Regular
    </namerecord>
    <namerecord nameID="2" platformID="1" platEncID="1" langID="0xb" unicode="True">
      Regular
    </namerecord>
    <namerecord nameID="4" platformID="1" platEncID="1" langID="0xb" unicode="True">
      謎乃明朝 Regular
    </namerecord>
    <namerecord nameID="16" platformID="1" platEncID="1" langID="0xb" unicode="True">
      謎乃明朝
    </namerecord>
    <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
      NazonoMincho Regular
    </namerecord>
    <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
      Regular
    </namerecord>
    <namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
      0.001;YHVH;NazoMin
    </namerecord>
    <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
      NazonoMincho Regular
    </namerecord>
    <namerecord nameID="5" platformID="3" platEncID="1" langID="0x409">
      Version 0.001;hotconv 1.1.0;makeotfexe 2.6.0
    </namerecord>
    <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
      NazoMin
    </namerecord>
    <namerecord nameID="16" platformID="3" platEncID="1" langID="0x409">
      NazonoMincho
    </namerecord>
    <namerecord nameID="1" platformID="3" platEncID="1" langID="0x411">
      謎乃明朝 Regular
    </namerecord>
    <namerecord nameID="2" platformID="3" platEncID="1" langID="0x411">
      Regular
    </namerecord>
    <namerecord nameID="4" platformID="3" platEncID="1" langID="0x411">
      謎乃明朝 Regular
    </namerecord>
    <namerecord nameID="16" platformID="3" platEncID="1" langID="0x411">
      謎乃明朝
    </namerecord>
  </name>

</ttFont>

色々と名前っぽい欄があってどれを変えたらいいのかわからないので、とりあえず名前っぽいものを手当たり次第全部変えることにしている。

使う文字としては、「-」(ハイフン)を先頭に2つか3つほど付けるのがおすすめ。ハイフンはASCIIコード順でも全ての英数字より前で(意外と数字より後の記号も多い)、多くのフォント名で問題なく使われ、またOffice系のソフトで内部的に使われているとみられる「+見出しのフォント」「+本文のフォント」のような「+」で始まるフォント名と競合する心配もない(+は-よりさらに前)。「0」を1つ付けるだけだと、意外と「01」とかで始まるフォントがあってそれに負けたりするので注意。

.ttxファイルを書き換え終わったら、次のコマンドで元のフォントファイルに適用する。

vb.net
ttx -m fontfile.ttf fontfile.ttx

mはmergeの頭文字である。ttfとttxの順番を間違えやすいので注意すること。基本的に、マージの時に使うフォントファイルは1つ、対してttxファイルは(今回の例とは違って複数のテーブルを一気にマージする場合は)複数あるかもしれないと考えると、1つしかない方を-mの引数にするほうが簡明だと思われるので、それで覚えられる。といっても-tの引数には複数のテーブルを指定できるわけだが…

問題がなければ、fontfile#1.ttfのようなファイルが生成される(既存ファイルへの上書きは回避される)。ダブルクリックで開いてみて、名前が変わっていることを確認する。