読者です 読者をやめる 読者になる 読者になる

ついに ROOT で日本語を使えるようになりました (使わないけども)

ROOT

(多分) ROOT 5.34 から TMathText という新しい class が導入され、ついにマルチバイト文字の扱いもできるようになりました。QtROOT を使えば以前から同じようなことが出来たのですが、非標準の ROOT は使いたくないので試したことがありませんでした。日本語を使いたいという機会が滅多にないですし。

また、マルチバイトの取り扱いができることよりも、TMathText の最大の売りは LaTeX 機能の改善です。TLatex でも LaTeX のような汚い何かは入力できていましたが、TMathText でかなり表示が改善されています。タイトルや軸など、TLatex で表示されていた部分は全て TMathText で置き換わりましたので、今後は TMathText に慣れましょう。

さて、実際に使って試してみます。まずは C++ の例です。japanese.C を utf-8 で保存しましょう (円記号の表示は、実際は backslash で入力)。

void japanese()
{
  TH1D* h = new TH1D("h", "\\hbox{標準偏差 }\\sigma=1\\hbox{ の正規分布の例};\\hbox{物理量};\\hbox{頻度}", 100, -5, 5);
  h->FillRandom("gaus", 10000000);
  h->Draw();
}
$ root
root [0] .x japanese.C

こちらは Python 版です。先頭に utf-8 であることを明記して、C++ と同様、文字列中にそのまま日本語を書き込みます。これも utf-8 で保存します。

# -*- coding: utf-8 -*-
import ROOT

def japanese():
    global h
    h = ROOT.TH1D("h", "\\hbox{標準偏差 }\\sigma=1\\hbox{ の正規分布の例};\\hbox{物理量};\\hbox{頻度}", 100, -5, 5)
    h.FillRandom("gaus", 10000000)
    h.Draw()
$ python
>>> import japanese.py
>>> japanese.japanese()

さて、出力結果は次のようになります。うまく表示できた、と思いきや、「偏」の旁の上の部分がおかしいですね。おかしいというか、日本の漢字ではなく中国の簡体字です。


▲ ROOT で日本語を表示した例。「偏」の字がおかしい。

なぜ日本の漢字ではなく簡体字になるかというと、ROOT と一緒に配布されるフォントが DroidSansFallback.ttf というものだからです。このフォントには日本語、韓国語、中国語などが含まれているのですが、異体字は同じ文字として扱われているため、日本語と簡体字の区別がちゃんとされていません。そのため、異体字が日中で重複してしまうような場合は簡体字が表示されてしまうのです。

それでは、他のフォントにしてしまえば良いのでは? という疑問が湧きますが、DroidSansFallback.ttf 以外のフォントを指定する方法は今のところ無いようです。TTF.cxx などにも、ベタ書きされています。

そこで、$ROOTSYS/fonts/DroidSansFallback.ttf を他のフォントで書き換えてしまいます。例えば、Osaka フォントを無理やり置いてみます。

$ cd $ROOTSYS/fonts 
$ mv DroidSansFallback.ttf DroidSansFallback.ttf.bak
$ cp /Library/Fonts/Osaka.ttf DroidSansFallback.ttf

この状態で japanese.C を再度走らせたものが次の図です。「偏」の表示は日本語らしくなりましたが、なぜか縦軸も横軸もタイトルが消えてしまいます。もう少し調べる必要がありそうです。


▲ 「偏」は直ったが、縦軸と横軸が表示されない。

仕方なく DroidSansFallback.ttf を使うとして、それでもまだ問題があります。まず、PDF に直接保存すると日本語部分が表示されません。仕方なく EPS に保存すると、今度は Mac の Preview.app では PDF に変換できません。Acrobat X を使っても開けません。gs で開くと日本語も表示されますが、うちの環境だと「量」の字が豆腐に化けました。ps2pdf を使って EPS を PDF に変換すると、同様に「量」が化けてしまいました。また、DroidSansFallback.ttf が全て EPS に埋め込まれる仕様のため、EPS の大きさが 20 MB を超えてしまいます。

とまあ、色々とまだ問題があります。