Helvetica と Arial のマイナスとハイフン
MATLAB の吐いた EPS ファイルを Illustrator で開くと,マイナスがハイフンになっちゃってる,という話を以前したが (というかそれ以前にマイナス記号が消える.なんとかしてくれ) [2005-01-19],なんか突然我慢できなくなって調べてみた.
長いので,忙しい方は最後のまとめをご覧下さい.
マイナス記号は別に用意されていた
MATLAB 固有の問題というより,PostScript フォント (Helvetica,Courier) の問題らしい.PostScript フォントにはハイフン (0x2d,HYPHEN-MINUS) の他にちゃんとマイナス記号 (0xb1) があるらしい (後述するが,厳密にはこれはマイナスではなくエンダッシュらしい).例えば gnuplot なんかでは,やはりマイナスがハイフンとして出力されてしまう問題があり,gnuplot のソースを書き換えるだとか,PostScript 中のハイフンを半角ア (0xb1) で置き換えるだとかいう方法があるようだ.
- http://www-lab14.kuee.kyoto-u.ac.jp/~kyamamot/gnuplot.html
- http://www.uopmu.ees.osakafu-u.ac.jp/~yabu/soft/gnuplot/
なぜか±が出て来る
というわけで,Illustrator で半角アを入力すればとりあえず OK じゃね? とか思ったが,甘かった.なぜか「±」が出て来る.Windows の文字コード表を見ると,確かに 0xb1 は±になってる.しかもそれ以外にマイナスっぽい記号は皆無.おかしいなー.ちなみに Helvetica 自体は [2005-02-23] に従ってインストール済だったが,文字コード表に載せるにはさらに $WINDOWS\Fonts にコピーする必要があった.
Helvetica 相当品 Arial を使ってみる
まあ,ともかく,調べていると「Windows では Arial が Helvetica 相当品です」らしい.なにー,そうだったのか.確かに,英数字はほぼ同じ形のようだ.重ねてみると記号などは微妙に違うのがわかる.
ともかく,Arial では Helvetica が使えなかった Unicode が使えるようなので,マイナスも出せるかも知れない.
というわけで,Arial のコード表を調べると,Unicode で 0x2212 に MINUS SIGN という名の記号がある.おお,あった! とか思ったが,なぜか Illustrator で使おうとすると「???」とかに化けてしまう.どうも Illustrator 10 では Unicode が扱えないようだ.がーんん (Illustrator CS 以降は対応してるらしい.が,いまいち踏み切れない [2005-07-14]).
ちなみに Word や PowerPoint では,この通りちゃんと表示されるんだがなー.
0261 でマイナス出た!
…と半ば諦めかけつつ,試しに gnuplot が吐いた PostScript から,ハイフン記号をエディタで直接半角アに書き換えて Illustrator で読んでみた.すると…マイナス出た!!
出ました.マイナス記号.なんだ,Helvetica のフォントセットにちゃんとあるんじゃん.
じゃあ,これは PostScript コードとしてはどうなってるんだ? ってことで,以下のような EPS ファイルを Illustrator で作り,中身を見てみた.
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 にしたり「ア」にしたりすると,やっぱり±になるんである.だんだん混乱してくる.さらに調べてようやくわかった.
なにゅー.紛らわしすぎる.MATLAB の吐く EPS をよくみると,
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.
/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 のコードによっては,以上の操作でファイルが壊れる可能性があります.責任は負いませんので,必ずバックアップを取るなり,アンドゥできる状態で編集するなりしてください.