Hatena::ブログ(Diary)

M59の記録 Twitter

2009年07月14日

IPAフォントの改造 濁点

Mac OS Xでは、濁音(半濁音)を清音 + U+3099(U+309A)で表している。

IPAフォントで、そのようなテキスト「がぎぐげごザジズゼゾか゚き゚く゚け゚こ゚パピプペポ」を開いたら、こう表示される。

f:id:mandel59:20090714194918p:image:small

「かきくけこ」に半濁点は、合字の設定がされているから表示されている。ということは、他の文字も設定すれば、きちんと表示される。

f:id:mandel59:20090714194911p:image:small

次のスクリプトを使う。UTF-8で保存。

#!/usr/bin/env fontforge

if ($argc > 2)
   OutputFile = $2;
else
   OutputFile = "new."+$1:t;
endif

Open($1);
Reencode("original");

plain = [0x304B, 0x304D, 0x304F, 0x3051, 0x3053, 0x3055, 0x3057, 0x3059, 0x305B, 0x305D, 0x305F, 0x3061, 0x3064, 0x3066, 0x3068, 0x306F, 0x3072, 0x3075, 0x3078, 0x307B, 0x309D];
Select(0u3099);
v_mark = GlyphInfo("Name");
i = 0;
while (i < SizeOf(plain))
    Select(UCodePoint(plain[i]));
    p = GlyphInfo("Name");
    Select(UCodePoint(plain[i]+1));
    AddPosSub("'ccmp' グリフ合成/分解 lookup 1 subtable", p+" "+v_mark);
    Select(UCodePoint(plain[i]+0x60));
    p = GlyphInfo("Name");
    Select(UCodePoint(plain[i]+0x60+1));
    AddPosSub("'ccmp' グリフ合成/分解 lookup 1 subtable", p+" "+v_mark);
    i++;
endloop

plain = [0x3046, 0x30A6, 0x30EF, 0x30F0, 0x30F1, 0x30F2];
voiced = [0x3094, 0x30F4, 0x30F7, 0x30F8, 0x30F9, 0x30FA];
i = 0;
while (i < SizeOf(plain))
    Select(UCodePoint(plain[i]));
    p = GlyphInfo("Name");
    Select(UCodePoint(voiced[i]));
    AddPosSub("'ccmp' グリフ合成/分解 lookup 1 subtable", p+" "+v_mark);
    i++;
endloop

plain = [0x306F, 0x3072, 0x3075, 0x3078, 0x307B];
Select(0u309A);
v_mark = GlyphInfo("Name");
i = 0;
while (i < SizeOf(plain))
    Select(UCodePoint(plain[i]));
    p = GlyphInfo("Name");
    Select(UCodePoint(plain[i]+2));
    AddPosSub("'ccmp' グリフ合成/分解 lookup 1 subtable", p+" "+v_mark);
    Select(UCodePoint(plain[i]+0x60));
    p = GlyphInfo("Name");
    Select(UCodePoint(plain[i]+0x60+2));
    AddPosSub("'ccmp' グリフ合成/分解 lookup 1 subtable", p+" "+v_mark);
    i++;
endloop

Generate(OutputFile, "otf");
Quit(0);

IPAフォントの改造 円記号をバックスラッシュに変更

微酔半壊: IPAフォントの0x5cをバックスラッシュに

ここのスクリプトを現在のバージョンに使うと、U+00A5には既に全角円記号が割り当てられているのでコピーされず、半角円記号は消えてしまう。

U+005C→バックスラッシュ

U+00A5→半角円記号

U+FFE5→全角円記号

とするようにスクリプトを修正した。

#!/usr/bin/env fontforge
#
# Usage: 0x5c-reverse-solidus.pe <input.otf> [<output.otf>]
# If output filename is not specified,
# new file is created as "new.input.otf" in the current directory.

if ($argc > 2)
   OutputFile = $2;
else
   OutputFile = "new."+$1:t;
endif

Open($1);
Reencode("original");

Select(0u5C);
SetUnicodeValue(0xA5);
cc = CharCnt();
SetCharCnt(cc+1);
Select(0u2F);
Copy();
Select(cc);
Paste();
HFlip();
SetUnicodeValue(0x5C);

Generate(OutputFile, "otf");
Quit(0);

IPAフォントの改造

現在、Ver.003.01が、IPAフォントライセンスv1.0で公開されている。

OTF形式で4書体が配布されているがUbuntuでは(多分ほかのLinuxでも)、そのままでは文字幅が変に表示されてしまうようなので、Fontforgeで一度変換してから使うとよさそうだ。

どうせ変換するなら、IPAフォントに足りない分もあわせて改造したいと思う。

たとえば、円記号とバックスラッシュの入れ替え(微酔半壊: IPAフォントの0x5cをバックスラッシュに)などを行う。

他にも濁点の合成の設定をする。