Как присвоить случайное значение ключу непрозрачности в фазе PostScript, а не в фазе TeX?

Как присвоить случайное значение ключу непрозрачности в фазе PostScript, а не в фазе TeX?

Я хочу иметь случайную непрозрачность, но не хочу использовать fpпакет. Короче говоря, возможно ли передать выражение PostScript в opacity?

Вот минимальный неработающий пример, который сэкономит ваше время.

\documentclass[pstricks,border=12pt]{standalone}
\SpecialCoor
\begin{document}
\begin{pspicture}[showgrid](-2,-2)(2,2)
    \psframe*[linecolor=gray,opacity={!Rand}](2,2)
\end{pspicture}
\end{document}

Предупреждение !

Randбыл неявно изменен с его первоначального поведения (производство случайного действительного числа от 0 до 0,5 включительно) на новое поведение (производство случайного действительного числа от 0 до 1 включительно). Если вы новичок в Rand, это хорошо; никакой код не нужно обновлять в вашем существующем коде.

решение1

Очень простой способ — определить новый ключ, который использует свои аргументы как код PostScript:

\documentclass[pstricks]{standalone}
\usepackage{multido}
\makeatletter
\define@key[psset]{pstricks}{psopacity}[1]{%
  \edef\psk@opacityalpha{#1 }%
}%
\makeatother
\begin{document}
\begin{pspicture}(5,2)
  \psset{fillstyle=solid, fillcolor=red, linestyle=none, linewidth=0pt}
  \multido{\ra=0+0.5,\rb=0.5+0.5}{11}{%
    \psframe[psopacity=Rand](\ra,0)(\rb,2)}%
\end{pspicture}
\end{document}

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

решение2

Существует способ передать postscript-выражение для определения непрозрачности, однако он не использует напрямую опцию PSTricks . Вместо этого можно использовать opacityоператор Ghostscript/Postscript . (См..setshapealphaДополнительные операторы Ghostscript).

Вот MWE

\documentclass[pstricks,border=12pt]{standalone}
\SpecialCoor
\begin{document}

\makeatletter
\def\myRandomOpacity{\pst@Verb{Rand .setshapealpha}}
\def\myResetOpacity{\pst@Verb{1.0 .setshapealpha}}
\makeatother


\begin{pspicture}[showgrid,linecolor=red,unit=4cm](-1,-1)(1,1)
  \psdot(! 0 Rand)
  \psdot(! 0 Rand)
  \myRandomOpacity
  \psframe*[linecolor=green](0,0)(1,1)%
  \myRandomOpacity
  \psframe*[linecolor=green](0,0)(1,-1)
  \myRandomOpacity
  \psframe*[linecolor=green](0,0)(-1,-1)
  \myRandomOpacity
  \psframe*[linecolor=green](0,0)(-1,1)  
  \myResetOpacity
\end{pspicture}
\end{document}

Также используется .setshapealphaвнутри PSTricks. Действительно, pst-news08 утверждает:pstricks supports transparent colors with Ghostscript’s .setopacityalpha, .setblendmode, and .setshapealpha. These functions are not known to VTEX or Adobes Distiller. The optional argument vtex disables transparencies and distiller overrides the Ghostscript functions with the ones from the Distiller.

Вот результат MWE:

результат MWE

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