rcmdnk's blog

GSグレイテスト・ヒッツ

Macでepsファイルを使うことがあるのですが、 久しぶりにimagemagickのconvertコマンド使って pdfファイルに変更しようとしたらエラーが出ました。

ちょっと調べてみるとGhostscriptのバージョンが変な事になってるのが問題でした。

Ghostscriptに関する問題

convertコマンドを使ってみると、

$ convert hoge.eps hoge.pdf
GPL Ghostscript 9.19: Can't find initialization file gs_init.ps.
GPL Ghostscript 9.19: Can't find initialization file gs_init.ps.
convert: no images defined `hoge.pdf' @ error/convert.c/ConvertImageCommand/3254.

みたいなエラーが出ました。

いろいろ見てみるとこの問題は HomebrewのGhostscriptのインストールと、 CaskでインストールするMacTexの中でインストールされる Ghostscriptとの競合で起こってる様だと言うことが分かりました。

HomebrewのGhostscriptとMacTexによるGhostscript

MacでTex環境を用意しようと思うと MacTeX を使って導入するのが一番簡単です。

HomebrewではCaskで、

$ brew cask install mactex

でMacTexを導入することが出来ます。

homebrew-cask/mactex.rb

Homebrewでtexを検索してみると、

$ brew search tex
homebrew/emacs/context-coloring
...
Caskroom/cask/mactex
...
Caskroom/versions/textual-beta

If you meant "tex" precisely:

Installing TeX from source is weird and gross, requires a lot of patches,
and only builds 32-bit (and thus can't use Homebrew dependencies)

We recommend using a MacTeX distribution: https://www.tug.org/mactex/

You can install it with Homebrew-Cask:
  brew cask install mactex

こんな感じでMacTexをお勧めしてきます。

このMacTexはインストーラーの中で通常Ghostscriptも同時にインストールします。 インストーラーではGhostscriptのインストールをスキップすることが出来ますが、 Caskの場合はそういったオプションは無いので必ずGhostscriptが入ります。

一方、HomebrewにもGhostscriptのFormulaがあります。

$ brew install ghostscript

で導入可能。

homebrew-core/ghostscript.rb

問題はどちらのGhostscriptも同じ/usr/local下にインストールされる、ということ。

MacTexによるGhostscriptは例えばgsコマンドは

$ ls -l /usr/local/bin/gs
lrwxr-xr-x  1 root  staff  XX XXX XX XX:XX /usr/local/bin/gs -> /usr/local/bin/gs-noX11
$ ls -l /usr/local/bin/gs-noX11
-rwxrwxr-x  1 root  wheel  XXXXXXXX XXX  XX  XX:XX /usr/local/bin/gs-noX11
$

こんな感じでgs-noX11へのシンボリックリンクになっていますが、 そのgs-noX11/usr/local/binに実体があります。 MacTexをCaskで入れる時には管理者権限のパスワードを聞かれて インストールは管理者権限で行われます。

一方、Homebrewで直接Ghostscriptをインストールした場合、

$ ls -l /usr/local/bin/gs
lrwxr-xr-x  1 user  staff  XX XXX  X XX:XX /usr/local/bin/gs -> ../Cellar/ghostscript/9.20/bin/gs
$ ls -l /usr/local/bin/../Cellar/ghostscript/9.20/bin/gs
-r-xr-xr-x  1 user  admin  XXXXXXXX XXX XX XX:XX /usr/local/bin/../Cellar/ghostscript/9.20/bin/gs

こんな感じで/usr/local/binにはCellarへのシンボリックリンクが貼られています。

それぞれインストールの仕方が違うのがそもそも問題ですが、 さらに問題があるのはHomebrewの方では9.20をインストールしているのに対し、 MacTexでは9.19をインストールしています。

また、Homebrewでのインストールよりも MacTexのインストーラーによるインストールのが強力で 先にHomebrewでインストールしていても 後からMacTexをインストールすると /usr/local/bin/gsなどは9.19の実体に書き換えられます。

逆に先にMacTexをインストールすると、Homebrewでシンボリックリンクを作ろうとする時に 失敗してインストールが出来ません。

また、

/usr/local/share/ghostscript

にGhostscriptのライブラリなどが

/usr/local/share/ghostscript/9.19/lib

の様に入っています。 MacTexでインストールする場合、このghostscriptディレクトリは実体がここに作られます。 この中には

一方、Homebrewで直接インストールするとここへは

/usr/local/Cellar/ghostscript/9.20/share/ghostscript

へのシンボリックリンクが作られます。

ここでさらに問題を複雑にするのが、 先にHomebrewでGhostscriptをインストールした後 MacTexをインストールすると、

/usr/local/share/ghostscript

は既にシンボリックリンクですが存在しているので、 その中に9.19のディレクトリが作られます。 (通常のこの手のインストーラーはディレクトリが無ければ作りますが、 シンボリックリンクでもディレクトリがあれば上書きはせずに最終的なファイルだけ 必要であれば上書きするので。)

結果

/usr/local/Cellar/ghostscript/9.20/share/ghostscript/9.19

というディレクトリが出来ます。

この状態はHomebrewでもMacTexでもGhostscriptをインストールした状態ですが、 このままであれば、OSとしてはGhostscript 9.19を見ている状態で そのまま使えます。 (/usr/local/bin/gsは9.19のもの。)

最初に出した問題が出るのは、ここで何らかの理由で HomebrewのGhostscriptを消してしまった場合。

$ brew rm ghostscript
Error: Permission denied - /usr/local/Cellar/ghostscript/9.20/share/ghostscript/9.19/doc/API.htm
Uninstalling /usr/local/Cellar/ghostscript/9.20... (2,885 files, 71M)

この場合、GhostscriptのCellarを削除する時に 中に入った9.19のディレクトリがsudoで作られてるので こんな感じでエラーが出ます。

ただ、このエラーの前に

/usr/local/share/ghostscript

のシンボリックリンクは削除されています。

/usr/local/bin/gs

は残っています。(これもsudoで作られたものになってる)

結果、MacTexでインストールされたGhostscriptに関するものは全て残っては居るのですが、 shareディレクトリは

/usr/local/Cellar/ghostscript/9.20/share/ghostscript/

の中に作られてしまっているため、シンボリックリンクが切れた事によって見えなくなります。 なので今まで見えてた

/usr/local/share/ghostscript/9.19/lib/gs_init.ps
=>
/usr/local/Cellar/ghostscript/9.20/share/ghostscript/9.19/lib/gs_init.ps

が見えなくなって上の様なエラーが出るようになります。

convertコマンドを使うときもepsを変換しようとするとGhostscriptを使うので同様のエラーが出ます。

治す方法と言うか取り敢えずの処置としては

$ brew link --overwrite ghostscript

をすると

/usr/local/share/ghostscript/

のシンボリックリンクが復活するので取り敢えず使える様になります。

brew rm ghostscriptやらbrew install ghotscriptに関しては MacTexで入れたGhostscriptを消さない限りエラーが出来てどうもうこうも出来ない状態になっています。

Macのeps表示問題

このGhostscriptの話と関連してるかと思ったら多分関連して無さそうだった話なんですが、 最近Macでepsファイルを直接見ようとしたりするとフォントが欠けててきちんと表示できなくなっています。

多分Sierraにアップグレードしたときから。

MacOs Sierra: Latex symbols not showing in eps … Communities

ここに投げられてるのと同じ現象でギリシャ文字などが消えてしまいます。 ただ見るだけならまだいいんですが、一番の問題は 作った絵をPowerPointとかに載せる際、 Macだとepsファイルでもそのまま貼り付けることが可能で楽なんですが、 ギリシャ文字が全て消えてしまいます。

元のファイルのせいかと思ってましたが昔載せたのと同じのを載せてもダメなので Mac側の変化によるものです。

以前PowerPointに貼り付けたものはそのままギリシャ文字も見えます。

PowerPointに貼り付ける際にそれ用に画像変換されるので その画像変換に関わる何かが違う様です。

また、ギリシャ文字が入ってないものでも、そのままクリックして プレビューとかで表示しようとすると、

PostScript Conversion Warning

PostScriptファイル"hoge.eps"の変換で次の警告がありました:
  Courrier-Bold not found, using Courier.

こんな警告が出る用になっています。 とりあえずこの場合は表示は出来ますがフォントが無い、と言っています。

良くわからないのがこのCourrier-Bold(typoではなくr2つ)、Courierではなく。 これは元ファイルの問題かもしれませんが、同じ様なファイルを以前も見ていたはずなのに。

ちょっとこの辺はまだ良くわかってませんが、 今のところPowerPointに貼り付けるのは epsの代わりにpdfに変換してから載せています。 (Macにepsで持ってきた場合にはここでGhostscriptを使ったconvertが必要になるので それで今回いろいろ見てみたわけです。)

まとめ

Ghostscriptに関する問題はHomebrewとMacTexでそれぞれ違った方法で Ghostscriptをインストールしている事から起こっていたものでした。

ただし、上の様にちょっと特殊な状態にならないと問題が起こらないので 普段使いとしてはそれ程問題ないと言えばないかもしれません。

一方でGhostscriptの最新版をHomebrewで入れたつもりでも MacTexの方に上書きされて古い方を知らないうちに使ってる可能性は高いです。

一番良いのはMacTexの方でもCaskでインストールする際には HomebrewのGhostscriptを使うことですが、 Caskの方からやるのはいろいろ面倒そうです。

なので出来るならMacTexのインストールそのものをFormulaベースでやってしまうのが 良いと思います。

そもそもMacTexをFormulaベースで出来るかちゃんと見てませんが、 MacTexのインストーラーを動かす際にGhostscriptのインストールオプションを落として 代わりにHomebrewのGhostscriptに依存させておくのが一番問題なく環境を作ることが出来るはずです。

ちょっと作るのが面倒そうなのと、 この問題が全ての人に起こるわけでもないので すぐに需要が沢山あるわけでもなさそうなのでIssueとかに投げてもすぐにどうこうなるか分かりませんが、 できればそういった感じのFormulaを作れたら、と。

あとMacで直接epsファイルを扱うときの問題もまだ良くわかってないので なんとかしたい所です。 PowerPointに直接貼れないのは結構面倒なので。

Sponsored Links
Sponsored Links

« VimperatorのFirefox 51対応が公式レポジトリに反映された GitHubのメニューバーが黒くなった(元に戻すアドオンも登場) »

}