チリペヂィア

リンクフリー。サンプルコードなどは関連記事内でライセンスについて明示されない限り商用利用なども自由に行って構いませんが、自己責任でお願いします。またこれら日記内容の著作権自体は放棄していません。引用部分については引用元の権利に従ってください。

Mono Develop ソースコードに日本語コメント打ち込むためフォント作り

Windows用Unity3のMonoでのお話。(Unity4のお話も書きました:チリペヂィア - UnityとMonoDevelop日本語対応状況再確認

関数説明書きのSummaryタグを使いたくなったので日本語を打ち込む必要が出てきました。当日記はなぜかFontForgeでフォントを合成しているので、FontForgeの雑な使い方説明を兼ねているかもしれません。

Monoで日本語コメントのコンパイルが通らない

方法1:コメントの行末に半角スペースを打ち込む癖をつける。

現場によっては慣例的に守られていたりコーディング規約に入ってたりもしますよね。

バカっぽくも意外とそんなもんで良かったりと、これで悪くないと思います。しかしさすがにUnityらしからぬので別の案をもう一つ。

方法2:*.csをUnicode(UTF16)BigEndianで保存する。

UTF16だと滅多な事でもない限りサロゲートペア(ワイド文字版のマルチバイト)が出てこないので大丈夫です。ただし、メモ帳やテキストエディタ、あるいはその他変換ツールなど、わざわざ外部アプリからUnicodeBEに変換するしかないのがちょっと手間です(MonoではUnicodeはLittleEndianでしか保存できず、なおかつLEはコンパイル失敗する模様です。いわゆるバグって奴でしょうか)。

標準フォントだと日本語が変

標準フォントはドットが粗いどころか句読点が文字の真ん中の高さにきてドットみたいになってるので、好きなフォントに変えるしかありません。ただ独自レンダっぽいのでFontLinkも使えず、見やすいフォントを多少選ぶ感じがあります。フォント選びはいつだって難航しますが、環境なんてただの道具なんですから、妥協こそが肝要と思って諦めます。

M+とIPAの合成フォント
MiguとMigMixのシリーズは細かいバリエーションが豊富なので個人的にオススメです。





これより先、Let's冥府魔道。

ん〜微妙にイメージが違うよね。書体の高さが気に食わないよね。この行間許せないよね。(*1

フリーのフォントエディタFontForgeを使ってどうにかします(インストールはcygwinのインストールからなのでちょっと面倒ですけど頑張ってください)。さすがにゼロベースでフォントを作るのは無理ですが、合成できるのならFontLink使えなくても日本語非対応フォントを選択肢に入れることが出来ます。ちなみに私はFontForgeなんて数えるほどしか触った事がないので、ここに書いてあることは吹聴しないで下さい。責任もてません。

FontForgeで作業開始

今回はとりあえず全角をMigMix2P、半角英数にAdobeのSourceCodeProを採用します(SourceSansProも面白そうでしたが今回はスルー)。

最初SCProにMigMix2をマージする方向で「フォントの統合」をすればサクッといけるかなと思ったのですが上手くいかず…ベリファイ後の書き出しで妙なエラーが出て諦めました(特定サイズで文字テーブルがおかしくなる??)。コピペでいきます。どうせ半角英数しかコピーしないので手作業でもすぐ移植できます。

まず文字数の多いMigMix2Pを開き、別名保存してから多少加工しつつコピペでSCProを埋め込みます。要点をまとめます。

  1. いきなり本番を作らない(別名で何個も作る)
  2. 改名する時は
  3. 別のフォントからコピペ・加工する時の下準備
    1. コピー文字の加工
  4. 太くする時は
  5. 行間の高さを変える時は



いきなり本番を作らない(別名で何個も作る)
Winだとフォントはキャッシュされちゃいます。実際に表示してみて微調整を繰り返す場合は、フォントの削除と再インストールを繰り返しても反映してもらえません(だいたいキャッシュが残っています)。なので、まずはフォントを仮の名前で作っていきます。調整作業内容を示すような型番チックなフォント名で新規作成を繰り返し、出来上がってから、完成版以外をアンインストールしてからフォントキャッシュをクリアしてください。



改名する時は
名前を変えるときは以下を全部変更して下さい。これら全てきちんと整合性を取って識別できる名前にしておかないと、インストールできない/選択できないといった状態になります。面倒ですが、元々の命名規則をうまく踏襲すればどうにかなるはずです。ここで手間を惜しんで先の事を考えず適当をやると、調整を繰り返すうちに収集つかなくなるので要注意。

  • エレメント>フォント情報>PS Names
    • フォント名(半角英数ファイル名のつもりで命名する)
    • ファミリー名
    • 表示用の名前
  • エレメント>フォント情報>TTF名
    • ファミリー(言語ごとに複数ある時があります。PS Namesのファミリー名と揃える)
    • UniqueID(フォント名を意図する文字列を組み込むみたいなので、改名する時はここも変更します)




別のフォントからコピペ・加工する時の下準備
以下の作業を移植先とコピー元の両方で行っておきます。加工・移植する文字をまるっと選択して

  • 「編集>参照を解除」(TTFは複数の文字を一つのデータで共有する事があり、部分移植する時はリンクを切ってしまうのが早いです)
  • 「ヒント>ヒント命令を削除」

コピー文字の加工
コピーするとアンカーポイントが無くなるエラーが出る時があり、なんか不安なのでコピー元で加工してからコピー移植するようにしてます。とくに問題は無さそうなのですがなんなのでしょうかねコレ。




太くする時は
「エレメント>輪郭を太らせる」(「内側の輪郭線を削除する」にチェック)。

細らせるのは難しいので太らせる方で作業するのが無難です。この操作により現在の輪郭を太ペンでなぞるように変形して太らせることが出来ます。パラメータの設定は、いろいろトライしてみると良いと思いますが、ちょっとだけ微妙に太らせたい時は「横のみ」または「縦のみ」太らせるのが良いように思います。ストローク量の幅か高さの片方だけをとりあえず(25程度?)設定し、もう片方を1〜2(ゼロにするとバグるかも)くらいにして、ペンの角度を0度か90度に。ペン先の形が垂直か水平の線分に近い楕円になるので、縦方向か横方向だけ輪郭を太らせる事が出来ます。



行間の高さを変える時は
パラメータの意味はこんな感じです。
[エレメント>フォント情報>一般情報]
高さ(Ascent):ベースラインより上側の高さ
深さ(Descent):ベースラインより下側の高さ
EmSize:Ascent + Descent に等しくなるように(表下の注意書きも参照)
[エレメント>フォント情報>OS/2]
WinAscent:Windows用のAscent
WinDescent:Windows用のDescent
組版上の〜:あまり使われないらしいので、他のパラメータと適当に揃えとけば良いと思います。
hhea:Mac用パラメーター
EmSizeは1000か1024か2048にするのが一般的らしいです。1000がMac流、1024とか2048はWin流。かと思いきや違う値になっているフォントもあります。だいたい1000くらいかそれ以上あればわりとなんでも良さそうです。私の設定手順としてはとりあえずWinのAscentとDescentがほとんどのビュワーやエディタでダイレクトに影響を与えるので、まずWinのAscent/Descentを好きに調整し、ちょうど良い値に設定できたら、同じ値をhheaにも設定します。EmSizeを1000にして、WinAscent/Descentと同じ比率を使って一般情報や組版のAscent/Descentを合計1000になる値で埋めます(このへんの正しいやり方はとくに心もとないのでマユツバでオナシャス)。


サンプル

  • MigMix2P Regularをベースに、AdobeSourceCodeProのBasicLatin(0x00-7F)を移植
  • AdobeSourceCodePro部分は、ちょっとだけ輪郭を横に太く(輪郭を太らせる>StrokeWidth:25 StrokeHeight:2 ペン角度:0 線端:Round 線の結び:Round 内側の輪郭線を削除ON)
  • 高さ765/深さ±235/EmSize1000
  • Win,hhea Asc975/Des±300
  • 行間は全てゼロ

オマケ

ちなみにFontForgeはもともとUnityデバッグ画面用のフォントを作るのにインストールしていました。

Unicode VGA fontのアウトライン版フォント(BasicLatin、いわゆる半角英数とその他一部文字のみ)。

View and DownloadMonoSpace/等幅][Proportional/プロポーショナル
注意
もともとのフォントデザインにはXライセンスが適用されています。
Caution on using
This font has been converted to a vector font from Bolkhov's 'Vga Unicode' by tiritomato.
(Converted block is Basic Latin and some chars only.)
Bolkhov's 'Vga Unicode' can be distributed and modified freely, according to the X license.
If you want to more information, visit 'Unicode VGA font'.

暫定にして最小限にして完成してる感、で思いついたのがBIOS画面の文字だったのですが、Unityをはじめ最近のビジュアル環境では「埋め込みビットマップ非対応(ベクタデータのみ)」というケースも珍しくなく。こちら、ビットマップ埋込TTFへの変換ツールはあるんですが、ベクタ形式はないようなので仕方なくビットマップ風のベクタデータを手打ちする事に。

  1. ビットマップ埋込TTFをFontForgeで開く。
  2. FontForgeで一文字ずつ確認しながら、FontStructで手打ちベクタ化&TTF形式にしてDL。
  3. FontForgeで適当に字間調整

目的がデバッグ用だったので200文字くらいで力尽きました。FontStructも初めて使いましたけど、こういう作業はFontStructを使うと本当に早いですね。

*1:冷静に考えてみると行間がおかしいというのは多分元々のソースコードの改行ペースによるものですね。フォント変更前にどういうコーディングをしてたかってことでしょうね…。言ってる事がさっきと全然違うとか聞こえません。