MacのgnuplotでPDFの文字がおかしくなる問題


TL;DR

Macのgnuplotでは、pangoのバグ(?)に由来して、terminalにpdfやpngcairo等を指定すると文字がおかしくなる問題があったが、最新版(gnuplot 5.4、pango 1.48.0)では解決している。

現象

いつからかよくわからないが、Macのgnuplotではterminalとしてpdfpngcairoなどを指定すると、文字がおかしくなる。これは、Cairoが裏で呼でいるPangoの問題。

$ brew info pango
pango: stable 1.46.1 (bottled), HEAD

$ gnuplot --versio
gnuplot 5.2 patchlevel 8

と、pango 1.46.1、gnuplot 5.2の状態で、以下のファイルを食わせてみる。

test.plt
set term pdf
set out "test.pdf"
p sin(x)
gnuplot test.plt

するとこうなってしまう。

例えば「-5」が、 5のように重なってしまっているのがわかると思う。これはcairoの問題なので、出力にpngcairoを指定しても同じことがおきる。

これを、

brew uninstall pango gnuplot
brew upgrade
brew install gnuplot

等としてpangoとgnuplotをアップデートし、gnuplotが 5.4、pangoが1.48.0になった状態でもう一度実行すると、

ちゃんとなおってめでたい。

補足

おそらく多くの人の環境で

brew uninstall pango gnuplot
brew upgrade
brew install gnuplot

でいけると思うのだが、僕の環境ではgnuplotの再インストールに失敗した。もしかしたら似たようなエラーが出る人がいるかもしれないので、作業ログを残しておく。

作業ログのまとめ

gnuplot再インストール時に、

$ brew uninstall gnuplot
$ brew install gnuplot
(snip)
==> Pouring [email protected]_sur.bottle.tar.gz
Error: An unexpected error occurred during the `brew link` step
The formula built, but is not symlinked into /usr/local
Permission denied @ dir_s_mkdir - /usr/local/Frameworks
Error: Permission denied @ dir_s_mkdir - /usr/local/Frameworks

と言われてこけた。そこでbrew doctorを実行して、その指示に従いながら問題を修正していった。

コマンドラインツールの再インストール。

sudo rm -rf /Library/Developer/CommandLineTools 
sudo xcode-select --instal

コマンドラインツールのアップデート

softwareupdate --all --install --force

brewのアップデート。

git -C "/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core" fetch --unshallow
git -C "/usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask" fetch --unshallow

brew doctorの指示に従って、不要なものの削除。特に僕はpangoをなんとかしようとして手で入れたので、それを削除。

brew doctorに言われたこと。

Warning: Unbrewed dylibs were found in /usr/local/lib.
Warning: Unbrewed header files were found in /usr/local/include.

削除。

```sh
rm -rf /usr/local/include/pango-1.0 
sudo rm -rf /usr/local/include/pango-1.0  
rm /usr/local/lib/pkgconfig/pango.pc  
rm /usr/local/lib/pkgconfig/pangocairo.pc 
rm /usr/local/lib/pkgconfig/pangoft2.pc

brew doctorに「gdk-pixbufとlibrsvgを入れろ」と言われたので入れる。

brew install gdk-pixbuf librsvg

Qtへのパスを通せと言われたので通す(僕はzshで、ローカルの設定は.zshrc.mineに保存しているけど、適宜自分の設定で読み替えてkください)。

echo 'export PATH="/usr/local/opt/qt/bin:$PATH"' >> ~/.zshrc.mine 

以上の設定をした上で、

brew info pango
brew info gnuplot
gnuplot --version

で、それぞれpangoが1.48.0、gnuplotが5.4になった状態で再度PDFを作ったらうまくいった。僕の環境では、brew infoとgnuplot --versionが異なるバージョンを指していた(自分でgnuplotをビルド、インストールしたっぽい)のでややこしいことが起きたが、普通に使っている人は大丈夫だと思う。