color.sty, preview.sty と dvips

color.sty, preview.sty と dvips

- 井汲 景太 の投稿
返信数: 6
AUCTeX https://texwiki.texjp.org/?AUCTeX の開発に首を突っ込んでいる者です。preview-latex の機能のために、color パッケージと preview パッケージと dvips の絡んだ問題について困っていることがあるのですが、解決法がお分かりになる方がいらしたら教えてください。

【状況説明と実現したいこと】
添付ファイル中の mytest-prv.tex と preview.sty と prauctex.def を同一ディレクトリに置いて、latex をかけたのち
dvips -Pwww mytest-prv.dvi -o mytest-prv.ps
を実行すると (latex と dvips は TeXLive2019 の、しばらく前にアップデートしたもの)ps ファイルは無事できたように見えるのですが、実際には壊れていて、atril で開こうとすると
typecheck -20
typecheck -20
typecheck -20
fish: 'atril mytest-prv.ps' terminated by signal SIGSEGV (Address boundary error)
というエラーで異常終了します(開けません)。ps2pdf にかけても ghostscript のエラーで中断します。私の所でできた dvi ファイルと ps ファイルは添付ファイル中に同梱してあります。
preview.sty と prauctex.def は公式の preview.sty, prauctex.def をちょっと改変したもので、差分はやはり添付ファイル中に patch-preview-sty, patch-prauctex-def として同梱してあります。
前景色・背景色の指定がちゃんと反映された ps ファイルを作りたいのですが、preview.sty や prauctex.def にどのような変更を加えればいいでしょうか?
同梱されている png ファイルは
dvipng -picky -noghostscript mytest-prv.dvi -o mytest-prv%03d.png
で作ったものですが、こんな感じで指定した色が反映されてほしいのです。
何点か補足します。
  • 添付ファイル中では、前景色・背景色が hard code されていますが、実際に使うときは preview-latex が実行時に emacs の前景色・背景色を指定する予定です。usepackage の行も、実際には LaTeX ファイル中に直接書くのではなく、RequirePackage に置き換えて latex コマンドの呼び出しを
latex "\PassOptionsToPackage{...}{preview}\AtBeginDocument{\RequirePackage....}..." "\input" ファイル名
のような形で行います。
  • \pagecolor が mytest-prv.tex と preview.sty の両方で指定されていますが、preview.sty の方は実際には適当な TeX macro にしておいて、実行時に上の latex コマンドの先行 TeX code の部分で \def\hogehoge{\pagecolor{blue}} みたいな感じで置き換える案を検討中です。\pagecolor の指定箇所が2ヵ所あるのは、後述する複数の呼び出し方のいずれでも機能するようにするためです。

【経緯の説明】
Ghostscript のバージョンが 9.27 になってから、preview-latex がエラーで動かなくなるケースが出てきました。具体的には、次の場合に発症します。
  1. LaTeX ファイルを pdflatex で処理する設定にしてある(デフォルト)
  2. emacs の前景色をカスタマイズして標準(黒)以外にしてある
1.の場合、preview-latex は、pdflatex を上のような特殊な呼び出し方をして作った pdf を pdf2dsc と gs を利用して画像ファイル(png 形式と思ってよいです)に変換するのですが、さらに 2. の場合、gs にトリッキーな ps code を食わせて、作られる画像ファイルの前景色を emacs と合わせようとします。ところが、gs 9.27 になってこのトリッキーな ps code が無効化されて、エラーが出るようになりました。

「何とかならないか」と Ghostscript 開発チームに相談したところ、
「セキュリティー上の理由からそうしたので、Ghostscript の側ではどうにかなる見込みはまずない。それより、最初からそういう色の着いた PDF を作るんではどうか?」ということでした。
それで、上記の 1. の場合は多少の問題は残るものの迂回策に至ったのですが、
preview-latex の動作としては
pdflatex+pdf2dsc+gs
のほかに
latex+dvipng と
latex+dvips+gs
という道筋もありえて、それらでは画像ファイルに期待した色が着きませんでした。latex+dvipng の方は更なる改修案が出て
で指定色が反映されるようになったのですが、残る latex+dvips+gs の方はこれではうまく行かず、
本フォーラムでの質問に至ったという次第です。
上述した \pagecolor が2ヵ所に重複しているのは、最初 pdflatex+pdf2dsc+gs 用に入れたものが latex+dvipng ではダメだったので新たに追加したことによります。
(以上)
井汲 景太 への返信

Re: color.sty, preview.sty と dvips

- Akira Kakuto の投稿
mytest-prv.ps を編集して,以下のように変更すると,
エラーにはなりませんが,出力はこれで良いのでしょうか?
この出力を得る preview.sty 等については調べていません。


--- mytest-prv.ps.orig Tue Jun 25 23:22:27 2019
+++ mytest-prv.ps Wed Jun 26 10:33:11 2019
@@ -993,15 +993,17 @@
  end
%%EndSetup
%%Page: 1 1
-TeXDict begin 1 0 bop gsave 0 0 1 TeXcolorrgb clippath fill grestore
+TeXDict begin 1 0 bop
-32891 -32891 32891 32891 655360 0 22609920
+gsave 0 0 1 TeXcolorrgb clippath fill grestore

1 0 0 TeXcolorrgb 1264 -21 a Fc(1)18 b(+)g(1)k(=)h(2)p
1 0 0 TeXcolorrgb 1157 w(\(1\))p 1 0 0 TeXcolorrgb Black
eop end
%%Page: 2 2
-TeXDict begin 2 1 bop gsave 0 0 1 TeXcolorrgb clippath fill grestore
+TeXDict begin 2 1 bop
-32891 -32891 32891 32891 533465 127431 3609783
+gsave 0 0 1 TeXcolorrgb clippath fill grestore

1 0 0 TeXcolorrgb 0 0 a Fb(x)47 -30 y Fa(2)103 0 y Fc(+)18
b Fb(y)230 -30 y Fa(2)290 0 y Fc(=)23 b Fb(z)421 -30
Akira Kakuto への返信

Re: color.sty, preview.sty と dvips

- 井汲 景太 の投稿
返信ありがとうございます。残念ながら、こちらではこのように変更しても同じエラーになってしまいます。
atril だと
typecheck -20
fish: 'atril mytest-prv.ps' terminated by signal SIGSEGV (Address boundary error)
というエラーで、ps2pdf だと
Error: /typecheck in --div--
Operand stack:
1 0 gsave 65781.8
Execution stack:
%interp_exit .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- --nostringval-- false 1 %stopped_push 1976 1 3 %oparray_pop 1975 1 3 %oparray_pop 1963 1 3 %oparray_pop 1817 1 3 %oparray_pop --nostringval-- %errorexec_pop .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- --nostringval-- --nostringval-- 6 --nostringval-- %repeat_continue --nostringval--
Dictionary stack:
--dict:724/1123(ro)(G)-- --dict:0/20(G)-- --dict:79/200(L)-- --dict:177/300(L)--
Current allocation mode is local
Last OS error: Invalid argument
Current file position is 58496
GPL Ghostscript 9.27: Unrecoverable error, exit code 1
となってしまいます。
井汲 景太 への返信

Re: color.sty, preview.sty と dvips

- Akira Kakuto の投稿
> こちらではこのように変更しても同じエラーになってしまいます。

plain text としたのですが,投稿結果に
diff ファイルが正しく反映されていないので,おそらく
-32891 -32891 32891 32891 655360 0 22609920
の行も削除されたと思います。
今回は, ps ファイル mytest-prv.ps をアプロードします。
Akira Kakuto への返信

Re: color.sty, preview.sty と dvips

- 井汲 景太 の投稿
ありがとうございます。確かに、diff 部分を copy&paste して作ったファイルではうまく patch が当たらなかったので手動で変更していたのですが、数字が並んでる部分は削ってしまっていました。
頂いたファイルはちゃんと表示できました。これで何とかならないか調べてみます。
井汲 景太 への返信

Re: color.sty, preview.sty と dvips

- 井汲 景太 の投稿
結局、私の力ではどこをどう直せば所望の出力が得られるのかわかりませんでした。公式の preview.sty 等が入っているディレクトリで
grep -E TeXcolorrgb *
を実行しても何も返ってこないので、dvips の動作の詳細に踏み込まないとダメっぽいです。

引き続き情報は募集しますが、当面「pdflatex+pdf2dsc+gs の時の動作にだけ手を入れて、『color.sty で pdf の色を設定する』『画像の色調節を放棄する』のどちらかを選択できるスイッチを新設する」という方向での対処を考えてみます。
井汲 景太 への返信

Re: color.sty, preview.sty と dvips

- 井汲 景太 の投稿
本件ですが、Ghostscript 開発側から「別のうまい手があった」と知らせがあり、
preview パッケージの方に手を入れることなく解決できそうな見込みになりました。一応残しておいた情報募集はクローズと致します。角藤さんにはお手数をおかけしました。