Почему обрезка с использованием отмеченного звездочкой графического объекта и его двойника дает разные результаты?

Почему обрезка с использованием отмеченного звездочкой графического объекта и его двойника дает разные результаты?

На основании следующего, взятого из pstricks.tex,

\def\solid@star{%
  \if@star
    \pslinewidth=\z@
    \psdoublelinefalse
    \def\pslinestyle{none}%
    \def\psk@fillstyle{\psfs@solid}%
    \let\psfillcolor\pslinecolor
  \fi}

отмеченный объект

\xxx*[linecolor=<color>]

похож на

\xxx[fillstyle=solid,fillcolor=<color>,linestyle=none,linewidth=0]

Однако это сходство больше не сохраняется, когда мы используем их в качестве контура обрезки. В следующем примере красный сплошной прямоугольник будет обрезан кругом.

Первая вырезка использует звездную версию \pscircle*[linecolor=blue]и создает синий круг. Но вторая вырезка использует ее двойник \pscircle[fillstyle=solid,fillcolor=blue,linestyle=none,linewidth=0]и создает красный круг. Поэтому вторая вырезка дает ожидаемый результат.

введите описание изображения здесь

\documentclass[border=12pt]{standalone}
\usepackage{pstricks}

\begin{document}

\begin{pspicture}[showgrid=top](4,4)
    \psclip{\pscircle*[linecolor=blue](2,2){1}}
        \psframe*[linecolor=red](4,4)
    \endpsclip
\end{pspicture}
\qquad
\begin{pspicture}[showgrid=top](4,4)
    \psclip{\pscircle[fillstyle=solid,fillcolor=blue,linestyle=none,linewidth=0](2,2){1}}
        \psframe*[linecolor=red](4,4)
    \endpsclip
\end{pspicture}

\end{document}

В чем заключается эта разница?

решение1

Вы правы, оба \pscircle*[linecolor=blue](2,2){1} и \pscircle[fillstyle=solid,fillcolor=blue,linestyle=none,linewidth=0](2,2){1} приводят к одному и тому же замкнутому синему кругу. Однако порядок соответствующих postscriptкоманд несколько отличается. Команда \pscircle
...

0 360 arc closepath gsave 0 0 1  setrgbcolor
1. .setopacityalpha fill  grestore clip

сначала строит круговой контур, сохраняет текущее графическое состояние с помощью gsave, устанавливает текущие значения colorи alpha, заполняет круг и восстанавливает графическое состояние с помощью grestoreнепосредственно перед clip, таким образом, команды цвета/заливки отфильтровываются из clipping path.

с другой стороны, команда \pscircle*генерирует другую postscriptпоследовательность:

...

0 0 1  setrgbcolor 56.90549 56.90549 28.45274
1. .setopacityalpha  SD  clip

где SDозначает 0 360 arc fill, таким образом, команды цвета/заливки остаются в контуре обрезки и, по-видимому, они применяются после обрезки.

решение2

вырезкапутьэтозамкнутая криваяинетзаполненная область. Использование версии звезды для контура обрезки приводит к неожиданному поведению

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