假设以下纯 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
哪个就可以了。