24 また Ghostscript で文字化け -- いつものように直せたけれど、 ちょっと考えてみる

(しばらく工事中。結論が出るまで真似は勧めません。)

MacPorts で Ghostscript をインストールしているが、 アップデートして Ghostscript のバージョンが変わると、 ファイルのパス名 (バージョン番号が含まれている) が変わるので、 日本語のための設定を直さないといけない (年に2,3回、使っている全ての Mac で)。 これ、なんとかならないかなあ。


…というのが悩み (軽いけれど、 アップデートのたびに煩わされるので、トータルでは結構時間を食っている) なのだけれど、 そもそも MacPorts の Ghostscript を使うのが面倒の種なのかもしれない、 と考えるようになった。 MacTeX を使っているので TeX Live は入っていて、そちらに Ghostscript があり、 それは日本語もうまく使えるように管理されている(大変素晴らしい)。 二重生活をやめればすっきりするのではないか。


復習をしておく。

復習 (1) MacTeX (TeX Live) の ghostscript (/usr/local/bin/gs) で、日本語が HaranoAji フォントを用いて表示できるようにする
4つのパッケージをインストールして、cjk-gs-integrate を走らせて設定する。 (途中で gs を呼ぶが、 間違えたものを呼ぶと X11 のウィンドウが現れてハングアップする。 PATH を見直すこと。)
curl -fsSL https://www.preining.info/rsa.asc | sudo tlmgr key add -
sudo tlmgr repository add http://contrib.texlive.info/current tlcontrib
sudo tlmgr pinning add tlcontrib '*'
sudo tlmgr install japanese-otf-nonfree ptex-fontmaps-macos cjk-gs-integrate-macos
sudo cjk-gs-integrate --link-texmf --cleanup --force
sudo cjk-gs-integrate-macos --link-texmf --fontdef-add=cjkgs-macos-highsierra.dat --force
sudo mktexlsr
以上は MacTeX の設定でいつもやっていることである -- 「MacTeX 2025が来た」

日本語フォントの選択については、 「MacTeX 2020」 を見よ (kanji-config-updmap-sys コマンドを使う )。

復習 (2) MacPorts の ghostscript (/opt/local/bin/gs) で、日本語表示ができるように設定する
過去の経緯 (古いMacでHiragino残してあればそれを使おうと試すとか -- 個人的趣味。 もう古いMacあまりないし。) からぐちゃぐちゃやっている。一般向きではない。
curl -O https://m-katsurada.sakura.ne.jp/misc/20250316/README
curl -O https://m-katsurada.sakura.ne.jp/misc/20250921/conf-gs.sh
chmod +x conf-gs.sh
./conf-gs.sh
どんなことをやっているか参考になるのは、ちょっと古いけれど 「私の Ghostscript の設定 (Hiraginoフォント)」


私は最近は、PostScriptデータを見るときに gv くらいしか使っていない。 これは内部で gs (ghostscript) を呼んでいるのだが、 gs だけ TeX Live のもの (/usr/local/bin/gs) を呼ぶようにしてみたら、 問題なく表示された。

失敗の記録: PATHの先頭に置く gs
#!/bin/sh
exec /usr/local/bin/gs "$@"

(追記) これは実はダメだ。 /opt/local/bin/gs/opt/local/bin/gsc へのリンクであるが、 /usr/local/bin/gs/usr/local/bin/gs-X11 へのリンクである。 そのためか cjk-gs-integrate が正常に実行できなくなる (途中で gs-X11 が起動されてハングアップする)。 gv で呼び出す ghostscript を指定するには、 ~/.gv というファイルに GV.gsCommand: /usr/local/bin/gs と書くと良い、 ~/.Xresources~/.Xdefaults でも出来る、 というのを教わった。そうなの?あれ、これは新しい gv では使えない? あるいは次のようにする。
修正版 PATH の先頭におく gs
#!/bin/sh
# もし X11 デバイスが指定されていたら、そのときだけ gs-X11 に逃がす
case " $* " in
  *"-sDEVICE=x11"*|*"-sDEVICE=x11alpha"*|*"-sDEVICE=x11cmyk"*)
    exec /usr/local/bin/gs-X11 "$@"
    ;;
  *)
    # 通常はヘッドレスの gsc あるいは gs-noX11 を使う(最も安定)
    exec /usr/local/bin/gs-noX11 "$@"
    ;;
esac

(gsc と gs-noX11 の仕様は?? この辺はよく分からないで試行錯誤したけれど、 段々状況がわかって来たので、そのうちすっきり説明できるようになるかも。)


MacPorts で sudo port install gv とすると、 依存関係で ghostscript がインストールされてしまう。 その辺を解決すると良いのかな?と考えて、そういう旨、ChatGPT に相談してみた。

こうすれば gv が MacPorts の ghostscript に依存しないようにできる、 という回答を得た。 実はやってもあまり意味がない気もするが、後々参考になりそうなので記録しておく。

  1. ローカル ports ツリーを作る。
    sudo mkdir -p /opt/local/var/macports/sources/local
    sudo chown -R $(whoami) /opt/local/var/macports/sources/local
    
    $(whoami) は自分のユーザー名ということね。
  2. /opt/local/etc/macports/sources.conf の1番上に
    file:///opt/local/var/macports/sources/local
    
    を追加する。

    sources.conf というファイルのバックアップを取ろうと考えたら、 sources.conf.default というファイルがあることを見つけた。 至れり尽くせりですね。

  3. gv のportファイルをコピーする。
    mkdir -p /opt/local/var/macports/sources/local/graphics/gv
    cd /opt/local/var/macports/sources/local/graphics/gv
    port edit gv
    
    depends_libs に ghostscript があるので、それを削除する。 … と言われたけれど depends_libs というのはなかった。 近いものに depends_run-append というのがあったので、 次のようにコメントアウトした。
    #depends_run-append      path:bin/gs:ghostscript
    
    あれ、sudo していないせいで保存できない。正しくは
    sudo mkdir -p /opt/local/var/macports/sources/local/graphics/gv
    cd /opt/local/var/macports/sources/local/graphics/gv
    sudo port edit gv
    
    とするわけか。
  4. port index を作る。
    cd /opt/local/var/macports/sources/local
    portindex
    
  5. gvをインストールする。
    sudo port install gv
    

すいすいできた。ChatGPT って物知りだな。


これで ghostscript をアンインストールすれば良いかな?と思ったが、 やろうとすると
Note: It is not recommended to uninstall/deactivate a port that has dependents as it breaks the dependents.
The following ports will break:
 gv @3.7.4_6
 ImageMagick @6.9.13-21_0
 groff @1.23.0_0
 libspectre @0.2.12_4
Uninstall ghostscript anyway? [y/N]:
と警告された。gv はわかるけれど、ImageMagick, groff, libspectr も依存しているよと。
port rdependents ghostscript
とすると、依存関係が分かりやすく表示される。 すると pandoc とか gnuplot とかにも関係していることが分かった。 これは面倒だ。

…もし MacPorts の ghostscript を使わずにすむならば、 ストレージの消費も抑えられて気持ちが良いが、 今回の試みの発端は、MacPorts の ghostscript が更新されるたびに、 日本語関係の設定を調整する手間を無くしたい、ということだったので、 単に MacPorts の ghostscript には手を出さない、で十分なのかもしれない。

ImageMagick や gnuplot 関係で、もし日本語の文字化けが生じたら (何らかの経路で MacPorts の ghostscript が呼ばれたら)、 そのときまた考えることにしよう。

… あ、LaTeX2HTML の中で ghostscript を呼んでいるんだな。 それも置き換えないといけないのか。 これは /usr/local/bin/pstoimg というシェル・スクリプトを調整するだけなので、何とかなるだろう。
my $GS = '/opt/local/bin/gs -dNOSAFER';
ここを /usr/local/bin/gs に直すだけで良いのかな?

ImageMagick で何が gs を使っているのかな? 私の使い方だと convert 以外に何かある?この問題は結構長引きそうだ。 少しずつ依存を減らしていって…かな。


MacPorts に ghostscript を日本語対応させる port があればいいのかも、 とも考える。



MacPorts の ghostscript で日本語を扱えるためにどうすれば良いか、 改めてチェックする。

pTeX に必要な、 2004-H, 2004-V が MacPorts に存在しない。 私の場合は TeX Live を入れてあるので、 /usr/local/texlive/2025/texmf-dist/fonts/cmap/ptex-fontmaps/ に見つかった。この2つのファイルを /opt/local/share/ghostscript/10.06.0/Resource/CMap/ にコピーするか、リンクを張れば良い。これは簡単だ。

それから、 /opt/local/share/ghostscript/10.06.0/Resource/CIDFont/ に日本語フォント関係のファイルがなかった。 (/opt/local/share/ghostscript/10.06.0/Resource/CIDFSubst に ipaex 関係のファイルも見えないな。何でだろう。) HaranoAji フォントを使うには、 /usr/local/texlive/2025/texmf-dist/fonts/opentype/public/{haranoaji,haranoaji-extra} にあるファイルへのリンクをはれば良い。
cd /opt/local/share/ghostscript/10.06.0/Resource/CIDFont
sudo ln -s /usr/local/texlive/2025/texmf-dist/fonts/opentype/public/haranoaji/* .
sudo ln -s /usr/local/texlive/2025/texmf-dist/fonts/opentype/public/haranoaji-extra/* .
で良いかな。

これだけやったら、TeX で
uplatex なんとか.tex
dvips -f なんとか.dvi > なんとか.ps
のようにして作った ps ファイルは、 MacPorts の ghostscript でも表示できるようになった。


ところで、 私は TEX 以外に a2ps-j というソフト (テキスト・ファイルを PostScript に変換する) を使っていて、その出力が正常に表示できなくなっていた。

a2ps-j で、 Ryumin-Ligh-H, GothicBBB-Medium-H という大昔よく利用されたフォントを使うようになっているせい。 a2ps-j の方を書き換えるのが良いのかもしれないが、 ある時期、色々なソフトの設定をいじるのが面倒に感じたため、 Ryumin-Ligh-H, GothicBBB-Medium-H をでっちあげる対応をした。 /opt/local/share/ghostscript/10.06.0/Resource/Font/{Ryumin-Light-H,GothicBBB-Medium-H} というのを用意した。 短いので以下に示す (やっていることは安直で HaranoAji フォントで代用している)。

Ryumin-Light-H
%!PS-Adobe-3.0 Resource-Font
%%DocumentNeededResources: H (CMap)
%%IncludeResource: H (CMap)
%%BeginResource: Font (Ryumin-Light-H)
(Ryumin-Light-H)
(H) /CMap findresource
[(HaranoAjiMincho-Regular) /CIDFont findresource]
composefont
pop
%%EndResource
%%EOF
GothicBBB-Medium-H
%!PS-Adobe-3.0 Resource-Font
%%DocumentNeededResources: H (CMap)
%%IncludeResource: H (CMap)
%%BeginResource: Font (GothicBBB-Medium-H)
(GothicBBB-Medium-H)
(H) /CMap findresource
[(HaranoAjiGothic-Regular) /CIDFont findresource]
composefont
pop
%%EndResource
%%EOF

2025/9/20 とりあえずのまとめ
なるべく TeX Live の gs を使うようにする (それで日本語関係の設定を一々直さずに済む)。

PATH の先頭付近に、 X11 が必要ならば /usr/local/bin/gs-X11 を、そうでないならば /usr/local/bin/gs-noX11 を呼び出すような、 ラッパー (上で示した) を置く。

latex2html については、 /usr/local/bin/pstoimgmy $GS = '/usr/local/bin/gs -dNOSAFER'; と指定する。

以上で、原則として /usr/local/bin/ にある TeX Live に含まれる ghostscript を使うことになるはず、と思っている。

MacPorts のアップデートで MacPorts の ghostscript で、 日本語関係の文字化けが生じたときに、何かおかしなことが起こるか。

ImageMagick で gs を使うというと、convert が思い浮かぶ。 これだけならば PATH の先頭付近のディレクトリィに、 次のスクリプトをおけば良いかな。
convert
#!/bin/sh
GS_EXECUTABLE=/usr/local/bin/gs /opt/local/bin/convert "$@"

gv について、MacPorts のやっかいにはならない、という考え方もある。
curl -O https://ftp.gnu.org/gnu/gv/gv-3.7.4.tar.gz
tar xzf gv-3.7.4.tar.gz
cd gv-3.7.4
./configure --enable-SIGCHLD-fallback
make
sudo make install
(MacPorts で gv をインストールしているため、 必要なものが揃っていて楽になっている、という可能性はあるが、 とにかく難しくはない。) この make の途中で、なぜか sed (/usr/bin/sed) でエラーになったので、 代わりに /opt/local/bin/gsed を使った。 とにかく、これで /usr/local/bin/gv にインストールされる。


休暇の1日弱を使ってしまった…アホらしいような気もするが、 次からは楽になるはず、と思うことにする。


PostScript は少なくとも主役の座は PDF に譲って、 段々不便になって退潮の道を進みつつあるのは確かなのだと考えている。 macOS でもサポートされなくなったし (以前は PDF への変換くらいはやってくれていた、 日本語未対応といういい加減な扱いではあったけれど)。 でも今のところ使えるようにしておくべき、なのだよね。多分。 (それに依存しているものがとても多いから。) そうだとすると、 PostScript を扱える Ghostscript は貴重な存在である。 (初めて噂を聞いたのは、はるか昔だけれど、 そんな便利なものがフリーで使えるようになるなんて信じられなかった。) しかしフリーであるせいで、色々な配布があって、混乱が生じるわけね。 日本語フォントがからむと、面倒が大きくなる (各配布ごとに設定をするなんて…)。 一番便利に使えそうなものを選んで、なるべくそれに寄せる、 とするのが現実的に有効な対応かと考える。

桂田 祐史