Como atribuir um valor aleatório à chave de opacidade na fase PostScript em vez da fase TeX?

Como atribuir um valor aleatório à chave de opacidade na fase PostScript em vez da fase TeX?

Quero ter uma opacidade aleatória, mas não quero usar fpo pacote. Resumindo, é possível passar uma expressão PostScript para opacity?

Aqui está o exemplo mínimo que não funciona para economizar seu tempo.

\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}

Aviso !

Randhavia sido tacitamente modificado de seu comportamento original (produzindo um número real aleatório entre 0 e 0,5 inclusive) para um novo comportamento (produzindo um número real aleatório entre 0 e 1 inclusive). Se você é novo Rand, é bom; nenhum código precisa ser atualizado em seu código existente.

Responder1

Uma maneira muito fácil é definir uma nova chave, que utiliza seus argumentos como código 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}

insira a descrição da imagem aqui

Responder2

Existe uma forma de passar uma expressão postscript para definir a opacidade, porém não utiliza diretamente a opacityopção PSTricks. Em vez disso, o operador Ghostscript/Postscript .setshapealphapode ser usado. (VerOperadores adicionais do Ghostscript).

Aqui está um 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}

O .setshapealphatambém é usado internamente pelo PSTricks. Na verdade, pst-news08 afirma: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.

Aqui está o resultado do MWE:

resultado do MWE

informação relacionada