ghostscript выдает undefined в --execute-- при использовании color.tex с pstricks на обычном тексте

ghostscript выдает undefined в --execute-- при использовании color.tex с pstricks на обычном тексте

Предположим, что имеется следующий простой 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которого будет работать.

Связанный контент