Helvetica と Arial のマイナスとハイフン

MATLAB の吐いた EPS ファイルを Illustrator で開くと,マイナスがハイフンになっちゃってる,という話を以前したが (というかそれ以前にマイナス記号が消える.なんとかしてくれ) [2005-01-19],なんか突然我慢できなくなって調べてみた.

長いので,忙しい方は最後のまとめをご覧下さい.

マイナス記号は別に用意されていた
MATLAB 固有の問題というより,PostScript フォント (Helvetica,Courier) の問題らしい.PostScript フォントにはハイフン (0x2d,HYPHEN-MINUS) の他にちゃんとマイナス記号 (0xb1) があるらしい (後述するが,厳密にはこれはマイナスではなくエンダッシュらしい).

例えば gnuplot なんかでは,やはりマイナスがハイフンとして出力されてしまう問題があり,gnuplot のソースを書き換えるだとか,PostScript 中のハイフンを半角ア (0xb1) で置き換えるだとかいう方法があるようだ.
なぜか±が出て来る
というわけで,Illustrator で半角アを入力すればとりあえず OK じゃね? とか思ったが,甘かった.なぜか「±」が出て来る.Windows文字コード表を見ると,確かに 0xb1 は±になってる.しかもそれ以外にマイナスっぽい記号は皆無.おかしいなー.

ちなみに Helvetica 自体は [2005-02-23] に従ってインストール済だったが,文字コード表に載せるにはさらに $WINDOWS\Fonts にコピーする必要があった.
Helvetica 相当品 Arial を使ってみる
まあ,ともかく,調べていると「Windows では Arial が Helvetica 相当品です」らしい.なにー,そうだったのか.確かに,英数字はほぼ同じ形のようだ.

arialhelvetica

重ねてみると記号などは微妙に違うのがわかる.

diff

ともかく,Arial では Helvetica が使えなかった Unicode が使えるようなので,マイナスも出せるかも知れない.

というわけで,Arial のコード表を調べると,Unicode で 0x2212 に MINUS SIGN という名の記号がある.おお,あった! とか思ったが,なぜか Illustrator で使おうとすると「???」とかに化けてしまう.どうも Illustrator 10 では Unicode が扱えないようだ.がーんん (Illustrator CS 以降は対応してるらしい.が,いまいち踏み切れない [2005-07-14]).

ちなみに Word や PowerPoint では,この通りちゃんと表示されるんだがなー.

word
0261 でマイナス出た!
…と半ば諦めかけつつ,試しに gnuplot が吐いた PostScript から,ハイフン記号をエディタで直接半角アに書き換えて Illustrator で読んでみた.すると…

マイナス出た!!

minus

出ました.マイナス記号.なんだ,Helvetica のフォントセットにちゃんとあるんじゃん.



じゃあ,これは PostScript コードとしてはどうなってるんだ? ってことで,以下のような EPS ファイルを Illustrator で作り,中身を見てみた.

300

PostScript ファイル内では

/Helvetica findfont /Encoding get
dup 45 /hyphen put
dup 48 /zero put
dup 51 /three put
dup 127 /plusminus put
dup 177 /endash put
pop
%ADOEndSubsetFont
/Helvetica*1 
[
45{/.notdef}repeat /hyphen 2{/.notdef}repeat /zero 2{/.notdef}repeat /three 75{/.notdef}repeat /plusminus 
49{/.notdef}repeat /endash 78{/.notdef}repeat
] /Helvetica nfnt
/Helvetica*1 findfont [14 0 0 -14 0 0 ]mfnt sfnt
0.5 271.424 mov
(\261) sh
8.284 271.424 mov
(300) sh
0.5 288.924 mov
(-300) sh
0 305.924 mov
(^?) sh
8.17599 305.924 mov
(300) sh

となっているようだ.けっこう複雑で,どこか 1 行書き換えたら済むようなもんではない.マイナスじゃなくてエンダッシュだったこともここで気がつく.

ちなみに 177 = 0261 = 0xb1 である.あれ? やっぱりマイナス (エンダッシュ) のコードは 0xb1 で合ってたんじゃん.±はというと,コード 127 になっている.じゃあ Windows が間違ってたのか??

コード 0261 の指す文字はエンコーディングに依存する
しかし,今度は MATLAB が吐く EPS のマイナスを \261 にしたり「ア」にしたりすると,やっぱり±になるんである.だんだん混乱してくる.



さらに調べてようやくわかった.

This would be an "endash" (i.e. a dash - with the width of a letter n) in the "Adobe Standard" encoding, but is a "plusminus" in the "ISO Latin 1" encoding.
なにゅー.紛らわしすぎる.MATLAB の吐く EPS をよくみると,

/Helvetica /ISOLatin1Encoding 168 FMSR

という行があった.ああーこれか.というわけで,思い切って

/Helvetica /StandardEncoding 168 FMSR

にしてみたところ,めでたくマイナス記号が出るようになった.なんかどっかに悪い影響が出そうな修正法だけど,とりあえず自分の簡単な EPS では問題ないようだ.



昔,PostScript を MATLAB で編集するというネ申な人が職場にいたりしたがww,そこまで MATLAB に詳しくないので,

perl -p -i.bak -e 's/ISOLatin1/Standard/; s/^\(-/(\261/; ' *.eps

とかすればいいんじゃないかと.



ちなみに "ISO Latin 1" encoding の "endash" (アスキーコード 0227) も試してみたが,ただのハイフンと見分けがつかなかったので却下.

まとめ
  • Helvetica でマイナス記号を使おうとすると,ハイフン (0x2d,HYPHEN-MINUS) になってしまう.
  • マイナス記号 (に近いもの) を使いたければ,エンダッシュ (0xb1,ENDASH) を使えばよい.
  • ただし Helveticaエンコーディングには StandardEncoding と ISOLatin1Encoding があり,前者では 0xb1 はエンダッシュだが,後者では 0xb1 はプラスマイナス (±) をあらわしている.しかも後者にはエンダッシュが存在しない.
  • MATLAB の吐く EPS は ISOLatin1Encoding なので,s/ISOLatin1/Standard/ したうえで,マイナス記号を \261 で置き換えるとよい (多分 s/\(-/(\261/ とかすればよいのかも).
つーかーれーたー.一日潰れたじゃねーか.



なお,PostScript のコードによっては,以上の操作でファイルが壊れる可能性があります.責任は負いませんので,必ずバックアップを取るなり,アンドゥできる状態で編集するなりしてください.
おまけ
Helvetica vs. Arial (格ゲーの一種らしい.よほど Arial に恨みがあるようだ)