Предположим, что имеется следующий простой 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 по умолчанию определяет цвет \black
.
\color@gray
не определен, поэтому color выполняет ,
\definecolor{black}{gray}{0}
который передается в файл ps вместо 0 setgray
. Однако реальной необходимости в использовании package нет 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 (с аргументами, указанными после команды цвета) преобразуется в 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
которого будет работать.