我想要一个随机的不透明度,但我不想使用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 和 0.5)默认修改为新行为(生成 0 到 1 之间的随机实数,含 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}
PSTricks 内部也使用.setshapealpha
了。事实上 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 的结果: