home «前の日記(2005-11-17) 最新 次の日記(2005-11-20)»

いろいろ
Seize the day.

2004|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|07|

2005-11-18 [長年日記]

[comp] 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 に恨みがあるようだ)
本日のツッコミ(全2件) [ ツッコミ | permalink | trackback ]
* nao (2005-11-20 18:41)

ツッコミテスト.

* nao2 (2005-11-20 18:42)

ツッコミテスト 2.

このエントリーをはてなブックマークに追加 はてなブックマーク数 はてなブックマークコメント   このエントリーを livedoor クリップに追加 livedoor クリップ数 このエントリーを del.ici.ous に追加 このエントリーを buzzurl に追加 buzzurl クリップ数

お名前:
E-mail:
コメント:
[TrackBack URL: http://nao.s164.xrea.com/td/tb.rb/20051118]
[(注) スパム対策のため,言及リンクのないトラックバックは受け付けていません.]
本日のリンク元
検索

以下の広告はサーバによって自動的に挿入されています.


Copyright © 2004-2006, nao. All rights reserved.