白色区域必须是真正透明的(在 PDF 和 PNG 中均保留)。如何在 TikZ 或 PSTricks 中做到这一点?
下图仅作为说明示例。
答案1
使用 PDF 和 PostScript(以及 PSTricks 和 TikZ/pgf),您可以使用两个规则来确定某个点是否位于路径内:“非零规则”或“偶奇规则”。
以下代码(TikZ)显示了差异:
\documentclass[tikz]{standalone}
\usepackage{mwe}
\begin{document}
\begin{tikzpicture}
\begin{scope}
\fill[red] (-1.2,-.6) rectangle (1.2,.6);
\fill[blue,draw=black,nonzero rule]
circle[radius=1.1cm]
(0:1cm) -- (120:1cm) -- (240:1cm) -- cycle;
\end{scope}
\begin{scope}[yshift=1*-2.3cm]
\fill[red] (-1.2,-.6) rectangle (1.2,.6);
\fill[blue,draw=black,nonzero rule]
circle[radius=1.1cm]
(0:1cm) -- (240:1cm) -- (120:1cm) -- cycle;
\end{scope}
\begin{scope}[yshift=2*-2.3cm]
\fill[red] (-1.2,-.6) rectangle (1.2,.6);
\fill[blue,draw=black,even odd rule]
circle[radius=1.1cm]
(0:1cm) -- (120:1cm) -- (240:1cm) -- cycle;
\end{scope}
\begin{scope}[yshift=3*-2.3cm]
\fill[red] (-1.2,-.6) rectangle (1.2,.6);
\fill[blue,draw=black,even odd rule]
circle[radius=1.1cm]
(0:1cm) -- (240:1cm) -- (120:1cm) -- cycle;
\end{scope}
\end{tikzpicture}
\end{document}
PDF 文件是透明的。要获取正确的 PNG 文件(带透明度),请使用convert
ImageMagick(pdftopnm
似乎添加了白色背景)。
以下 PSTricks 代码显示了差异(使用或不使用eofill
fillstyle -eofill
意味着偶数奇数填充):
\documentclass[border=12pt]{standalone}
\usepackage{pstricks}
\begin{document}
\begin{pspicture}[showgrid](6,6)
\pscustom[fillstyle=solid,fillcolor=green]
{
\pscircle(3,3){3}
\psline[liftpen=2](1,2)(5,2)(3,5)(1,2)
}
\end{pspicture}
\begin{pspicture}[showgrid](6,6)
\pscustom[fillstyle=solid,fillcolor=green]
{
\pscircle(3,3){3}
\psline[liftpen=2](3,5)(5,2)(1,2)(3,5)
}
\end{pspicture}
\begin{pspicture}[showgrid](6,6)
\pscustom[fillstyle=eofill,fillcolor=green]
{
\pscircle(3,3){3}
\psline[liftpen=2](1,2)(5,2)(3,5)(1,2)
}
\end{pspicture}
\begin{pspicture}[showgrid](6,6)
\pscustom[fillstyle=eofill,fillcolor=green]
{
\pscircle(3,3){3}
\psline[liftpen=2](3,5)(5,2)(1,2)(3,5)
}
\end{pspicture}
\end{document}
使用 PSTricks 时,eofill
不能与其他填充样式(如 hlines)一起使用(可能是一个错误)。您始终可以使用非零规则(PSTricks 使用的默认规则)并为您的孔指定正确的方向:
\documentclass[border=12pt]{standalone}
\usepackage{pstricks}
\begin{document}
\begin{pspicture}[showgrid](6,6)
\pscustom[fillstyle=hlines,hatchcolor=green]
{
\pscircle(3,3){3}
\psline[liftpen=2](1,2)(5,2)(3,5)(1,2)
}
\end{pspicture}
\begin{pspicture}[showgrid](6,6)
\pscustom[fillstyle=hlines,hatchcolor=green]
{
\pscircle(3,3){3}
\psline[liftpen=2](3,5)(5,2)(1,2)(3,5)
}
\end{pspicture}
\end{document}
答案2
我不知道pstricks
剪辑形状包含孔的非常复杂的剪辑可能性,但你可以(几乎总是)模仿通过叠加层来实现复杂的配置:
\documentclass[pstricks,border=12pt]{standalone}
\usepackage{pstricks}
\begin{document}
\begin{pspicture}[showgrid](6,6)
\psframe[linestyle=none,fillstyle=solid,fillcolor=blue](0,0)(3,3)
\pscircle[linestyle=none,dimen=middle,fillstyle=solid,fillcolor=red](3,3){3}
\begin{psclip}{\pspolygon[linestyle=none,fillstyle=solid,fillcolor=white](2,2)(3,4)(4,2)}
\psframe[linestyle=none,fillstyle=solid,fillcolor=blue](0,0)(3,3)
\end{psclip}
\end{pspicture}
\end{document}
请注意,三角形并不透明,就像示例中的正方形一样。
或者更复杂的
编辑:我认为,正如您的新示例所建议的那样,在最终的 pdf 文件中拥有真正的内部透明区域应该是可能的,因为此功能存在于 Illustrator 和 Inkscape 中,但据我所知,它尚未实现,pstricks
但TikZ
我可能是错的。