「IPAゴシック」フォントの「‼」(U+203C)、「⁉」(U+2049)の字形を修正する。ただしFontForgeをフォント出力に使わない。TTX/FontToolsでglyfテーブルを書き換えてフォントを出力する。
TTXを使用してTrueTypeフォントのcmapテーブルを修正
http://itouhiro.hatenablog.com/entry/20141004/font
の続き
Unicodeには「!!」「!?」をそれぞれ1文字にした
‼ U+203C ⁉ U+2049
が用意されているんだが、全角幅と規定されていない。
漫画のセリフでよく使われてるね。漫画のセリフはたいてい縦書きだから、全角になってると便利なんだけど。
ところで「規定」ってどこかにルールでもあるのかい?
wikipedia:東アジアの文字幅 と http://www.unicode.org/reports/tr11/ に解説があるよ。具体的には http://www.unicode.org/Public/UCD/latest/ucd/ にある EastAsianWidth.txt が決めてる。
203C..203D;N # Po [2] DOUBLE EXCLAMATION MARK..INTERROBANG ... 2047..2051;N # Po [11] DOUBLE QUESTION MARK..TWO ASTERISKS ALIGNED VERTICALLY
とある。203Cも2049も N つまり「日本語圏では使われていなかった」とかいう理由で幅が決まってない。全角にしてるフォントもあるけど、IPAゴシックでは半角なんだよね。
そこで、手作業で全角にしてみるだろ。
FontForgeで字形修正
もともとは半角。

[メトリック>幅を設定]で2048にして全角幅にする。全角!?の字形をコピーペーストする。

FontForgeで[ファイル>フォントを出力] でTrueTypeフォントを出力する。[ ] Validate Before Savingのチェックを外すと素早く保存されるぞ。

ちなみにFontForgeの[ファイル>保存]でsfdファイルを保存して、そのsfdファイルを読む込むと何かおかしくなっていたりする。sfdよりttfで保存するほうがむしろ信頼性があると感じる。
でもFontForgeでIPAゴシックを「TrueTypeフォント」出力すると、 http://itouhiro.hatenablog.com/entry/20140910/font に書いたとおりフォントがおかしくなるよね。直さなくていいの?
直さなくていいよ。字形変更したTrueTypeフォントで、実際に使うのはglyfテーブルだけだからね。
TTXで字形置き換え
双方のglyfテーブルをTTXで出力する。 ipag.ttfが変更前のフォント。 IPAGothic.ttf は変更したフォント。
$ ttx -t glyf ipag.ttf Dumping "ipag.ttf" to "ipag.ttx"... Dumping 'glyf' table... $ ttx -t glyf IPAGothic.ttf Dumping "IPAGothic.ttf" to "IPAGothic.ttx"... Dumping 'glyf' table... $
このあと、ipag.ttxファイルを書き換える。 IPAGothic.ttxに含まれる、変更した字形のグリフ名(aj12111.hw と aj12112.hw)の箇所だけを、ipag.ttxに持ってくればいい。
手作業でテキストエディターで書き換えてもいいんだけど、ttxファイルひとつで52MBもあったりして、あと何文字も置き換えるのはスクリプトのほうが確実なので、ここではnode.jsスクリプトで書き換えることにする。
glyfReplace.js
var fs = require('fs');
if (process.argv.length != 4){
console.log('usage: node this.js origianl.ttx newglyph.ttx');
process.exit(1);
}
var replaceCharacters = 'aj12111.hw aj12112.hw'; //U+203C, U+2049
var repChars = replaceCharacters.split(' ');
var orgFile = fs.readFileSync(process.argv[2]) + '';
var glyfFile = fs.readFileSync(process.argv[3]) + '';
var i;
for(i=0; i<repChars.length; i++){
var re = '[ \t]*<TTGlyph name="' +repChars[i]+ '"[\\s\\S]*?</TTGlyph>';
var re2 = '[ \t]*<TTGlyph name="' +repChars[i]+ '"/><!-- contains no outline data -->';
var matchGlyph = glyfFile.match(RegExp(re));
var newGlyph = matchGlyph[0];
var m;
var matched;
if (m = orgFile.match(re)){
//console.log('orgFile match ' + repChars[i]);
matched = m[0];
orgFile = orgFile.replace(matched, newGlyph);
}else{
console.log(repChars[i] + ' not match.');
m = orgFile.match(re2);
if (m){
matched = m[0];
orgFile = orgFile.replace(matched, newGlyph);
}else{
console.log(repChars[i] + ' not match. ignored.');
}
}
}
fs.writeFileSync('new.ttx', orgFile);
このスクリプトを
$ node glyfReplace.js ipag.ttx IPAGothic.ttx
と使うと、新しく new.ttx が作られる。
それを使って、もとのipag.ttfのglyfテーブルを置き換え。
$ ttx -m ipag.ttf new.ttx Compiling "new.ttx" to "new.ttf"... Parsing 'glyf' table...
new.ttfが修正版のフォントだ。

確かに変わったぞ。

- 作者: P Horne
- 出版社/メーカー: Oreilly & Associates Inc
- 発売日: 2007/09
- メディア: ペーパーバック
- 購入: 3人 クリック: 42回
- この商品を含むブログ (11件) を見る