當在純文字上使用帶有 pstricks 的 color.tex 時,ghostscript 在 --execute-- 中給出未定義

當在純文字上使用帶有 pstricks 的 color.tex 時,ghostscript 在 --execute-- 中給出未定義

假設有以下純 TeX 檔:

\input pstricks
\input color
\pscircle{1.5}
\bye

使用 eTeX 編譯效果很好,dvips 也是如此。但是產生的 PS 檔案無法使用 gs 進行處理,如果需要,我將發布錯誤訊息。什麼時候不是使用顏色包,處理流程正常。兩個產生的 Postscripts 檔案之間的差異是:

<  0.8 SLW 0. setgray   0.0 0.0 2 copy moveto 42.67911 0 CLW mul round
< sub dup 0 rmoveto 0 360 arc closepath  gsave 0.8 SLW 0. setgray  1.
< .setopacityalpha   0  setlinejoin 0  setlinecap stroke  grestore end
---
>  0.8 SLW gray 0   0.0 0.0 2 copy moveto 42.67911 0 CLW mul round sub
> dup 0 rmoveto 0 360 arc closepath  gsave 0.8 SLW gray 0  1. .setopacityalpha
>   0  setlinejoin 0  setlinecap stroke  grestore end

即一次使用“0.setgray”,另一次使用“gray 0”。我試圖澄清,如果「gray」是有效的 Postscript 命令,根據我的發現,定義顏色的通常方法是「setxxx」。

但我仍然不能 100% 確定這是 color.sty 中的問題還是 Ghostscript 中的問題。你能給我一個簡短的提示嗎?謝謝!

答案1

PSTricks 至少需要定義的顏色black,它本身在內部定義為\black它本身擴展為0 setgray。但前提是它被定義了。然而,這有效:

\input pstricks
\input color
\newgray{black}{0}
\pscircle{1.5}
\bye

有問題的部分在於color.sty

\ifx\color@gray\@undefined
  \ifx\color@rgb\@undefined
  \else
    \definecolor{black}{rgb}{0,0,0}
    \definecolor{white}{rgb}{1,1,1}
  \fi
\else
  \definecolor{black}{gray}{0}
  \definecolor{white}{gray}{1}
\fi

由於某些歷史原因,PSTricks 預設定義 color \black\color@gray未定義,因此 color 會 \definecolor{black}{gray}{0} 傳遞到 ps 檔案而不是0 setgray.然而,沒有真正需要使用 package color。可以使用 plainTeX 的 PSTricks 巨集設定顏色。

答案2

這不是gs的問題(產生的PostScript是錯的)

它在乳膠中工作,因為(我認為)xcolor 在這種情況下被加載,即使沒有明確地加載

\documentclass{article}
\usepackage{pstricks}
\usepackage{color}
\begin{document}


\pscircle{1.5}

\end{document}

灰度顏色通常也可以正常工作

\special{color push gray 0.5}
on two
\special{color pop}
three four

\bye

dvips 特殊(參數位於顏色指令之後)轉換為 PostScript

0.5 TeXcolorgray

這或多或少只是原始的 PostScript 調用

 0.5 setgray

顏色包的工作方式是,通常它以“特定於驅動程式的特殊語法”保存內部顏色,因此灰色是gray 0.5黑色gray 0等,並且在需要時乳膠會執行\special{color push \current@color}並產生正確的程式碼。

但這裡的介面轉換為 pstricks 內部形式,因此 pstricks 輸出黑色,而gray 0不是呼叫臭名昭著的命令,\c@lor@to@ps如果您嘗試將 pstricks 與 pdflatex 一起使用,則該命令總是顯示為未定義。

\c@lor@to@ps gray 0這裡會呼叫\c@lor@ps@gray 0哪個擴展到0 setgray哪個可以工作。

相關內容