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で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
で導入可能。
問題はどちらの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に直接貼れないのは結構面倒なので。