在纯 tex 上使用 color.tex 和 pstricks 时,ghostscript 在 --execute-- 中给出未定义

在纯 tex 上使用 color.tex 和 pstricks 时,ghostscript 在 --execute-- 中给出未定义

假设以下纯 TeX 文件:

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

使用 eTeX 编译很好,dvips 也很好。但是生成的 PS 文件无法使用 gs 处理,如果需要,我会发布错误消息。当不是使用颜色包,处理流程正常。两个生成的 Postscript 文件之间的区别是:

<  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 默认定义了颜色\black\color@gray未定义,因此 color 会 \definecolor{black}{gray}{0} 执行传递给 ps 文件的 ,而不是0 setgray。但是,实际上没有必要使用包color。可以使用 PSTricks 宏为 plainTeX 设置颜色。

答案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 特殊命令(参数位于 color 命令之后)被转换为 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哪个就可以了。

相关内容