根据 TikZ 手册第 341 页左右的示例,我预计以下代码
\begin{scope}[blend group=overlay]
\fill [ball color=red] (90:.6) circle (1);
\fill [ball color=green] (210:.6) circle (1);
\fill [ball color=blue] (330:.6) circle (1);
\end{scope}%
产生有点像这样的东西(由于 PDF 查看器的特性,仅仅是“有点”):
相反,我得到的是:
即使考虑到观众的奇怪想法,这也有点出乎意料。
然而令人惊讶的是,我确实设法通过使用以下代码产生了上述预期的输出:
\begin{scope}[blend group=overlay]
\node [circle, ball color=red, minimum size=20mm] at (90:.6) {};
\node [circle, ball color=green, minimum size=20mm] at (210:.6) {};
\node [circle, ball color=blue, minimum size=20mm] at (330:.6) {};
\end{scope}%
现在,如果这是观众的问题,我预计至少会看到与混合填充节点和混合填充路径相同的问题。毕竟,我认为我的观众不知道节点和路径之间的区别。话虽如此,这个世界充满了奇怪和令人讨厌的惊喜,所以谁知道呢?据我所知,Okular 可能天生就喜欢节点,而天生就讨厌路径。但似乎表面上不太可能。
那么,为什么填充路径和节点时会得到如此不同的结果,并且可以纠正填充路径的混合吗?
为了完整性,下面进行了并排比较:
完整代码:
\documentclass[border=10pt,multi,tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\begin{scope}[blend group=overlay, xshift=35mm]
\node [circle, ball color=red, minimum size=20mm] at (90:.6) {};
\node [circle, ball color=green, minimum size=20mm] at (210:.6) {};
\node [circle, ball color=blue, minimum size=20mm] at (330:.6) {};
\end{scope}%
\begin{scope}[blend group=overlay]
\fill [ball color=red] (90:.6) circle (1);
\fill [ball color=green] (210:.6) circle (1);
\fill [ball color=blue] (330:.6) circle (1);
\end{scope}%
\end{tikzpicture}
\end{document}
对于感兴趣的人,这里有 TikZ 手册中列出的混合模式的完整比较。请注意,手册中某些模式的名称不正确,并在下面的代码中进行了更正。
首先,填充路径:
二、填充节点:
重现代码:
\documentclass[border=10pt,multi,tikz]{standalone}
\newcommand*\showblend[2][]{% o manual, 314 (gweler hefyd gwestiwn Marcos: http://tex.stackexchange.com/q/248721/)
\begin{scope}[#1,local bounding box/.expanded=#2]
\begin{scope}[blend group=#2]
\fill [ball color=red] (90:.6) circle (1);
\fill [ball color=green] (210:.6) circle (1);
\fill [ball color=blue] (330:.6) circle (1);
\end{scope}%
\end{scope}%
\node [below=5mm of #2, anchor=mid] {#2};
}
\newcommand*\shownodeblend[2][]{%
\begin{scope}[#1,local bounding box/.expanded=#2]
\begin{scope}[blend group=#2]
\node [ball color=red, circle, minimum size=20mm] at (90:.6) {};
\node [ball color=green, circle, minimum size=20mm] at (210:.6) {};
\node [ball color=blue, circle, minimum size=20mm] at (330:.6) {};
\end{scope}%
\end{scope}%
\node [below=5mm of #2, anchor=mid] {#2};
}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}
\showblend{normal}
\showblend[xshift=35mm]{multiply}
\showblend[xshift=70mm]{screen}
\showblend[xshift=105mm]{overlay}
\showblend[xshift=0mm,yshift=-40mm]{darken}
\showblend[xshift=35mm,yshift=-40mm]{lighten}
\showblend[xshift=70mm,yshift=-40mm]{color dodge}
\showblend[xshift=105mm,yshift=-40mm]{color burn}
\showblend[xshift=0pt,yshift=-80mm]{hard light}
\showblend[xshift=35mm,yshift=-80mm]{soft light}
\showblend[xshift=70mm,yshift=-80mm]{difference}
\showblend[xshift=105mm,yshift=-80mm]{exclusion}
\showblend[xshift=0pt,yshift=-120mm]{hue}
\showblend[xshift=35mm,yshift=-120mm]{saturation}
\showblend[xshift=70mm,yshift=-120mm]{color}
\showblend[xshift=105mm,yshift=-120mm]{luminosity}
\end{tikzpicture}
\begin{tikzpicture}
\shownodeblend{normal}
\shownodeblend[xshift=35mm]{multiply}
\shownodeblend[xshift=70mm]{screen}
\shownodeblend[xshift=105mm]{overlay}
\shownodeblend[xshift=0mm,yshift=-40mm]{darken}
\shownodeblend[xshift=35mm,yshift=-40mm]{lighten}
\shownodeblend[xshift=70mm,yshift=-40mm]{color dodge}
\shownodeblend[xshift=105mm,yshift=-40mm]{color burn}
\shownodeblend[xshift=0pt,yshift=-80mm]{hard light}
\shownodeblend[xshift=35mm,yshift=-80mm]{soft light}
\shownodeblend[xshift=70mm,yshift=-80mm]{difference}
\shownodeblend[xshift=105mm,yshift=-80mm]{exclusion}
\shownodeblend[xshift=0pt,yshift=-120mm]{hue}
\shownodeblend[xshift=35mm,yshift=-120mm]{saturation}
\shownodeblend[xshift=70mm,yshift=-120mm]{color}
\shownodeblend[xshift=105mm,yshift=-120mm]{luminosity}
\end{tikzpicture}
\end{document}
以上结果均使用 pdfTeX 生成。但是,使用 XeTeX 测试会产生相同的结果。
答案1
根据 pgfmanual (第 2.14 节阴影) \shade
(而不是\fill
) 是可行的方法:
\documentclass[border=10pt,multi,tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\begin{scope}[blend group=overlay, xshift=35mm]
\node [circle, ball color=red, minimum size=20mm] at (90:.6) {};
\node [circle, ball color=green, minimum size=20mm] at (210:.6) {};
\node [circle, ball color=blue, minimum size=20mm] at (330:.6) {};
\end{scope}%
\begin{scope}[blend group=overlay]
\shade [ball color=red] (90:.6) circle (1);
\shade [ball color=green] (210:.6) circle (1);
\shade [ball color=blue] (330:.6) circle (1);
\end{scope}%
\end{tikzpicture}
\end{document}
解释(cfr)
ball color
shade
因为它是阴影,所以会隐式调用。因此,如果fill
也使用,则填充和阴影会结合在一起。因此,当使用时\fill
,默认颜色(黑色)填充形状,并ball color
使用用于阴影。根据blend mode
,黑色可能完全或部分主导阴影。
因为节点没有被填充而只是被阴影覆盖,所以在这种情况下没有问题。
\showblend
因此,可以通过以下两种方式之一重新定义路径来获得预期结果:
\newcommand*\showblend[2][]{% o manual, 314 (gweler hefyd gwestiwn Marcos: http://tex.stackexchange.com/q/248721/)
\begin{scope}[#1,local bounding box/.expanded=#2]
\begin{scope}[blend group=#2]
\path [ball color=red] (90:.6) circle (1);
\path [ball color=green] (210:.6) circle (1);
\path [ball color=blue] (330:.6) circle (1);
\end{scope}%
\end{scope}%
\node [below=5mm of #2, anchor=mid] {#2};
}
或者
\newcommand*\showblend[2][]{% o manual, 314 (gweler hefyd gwestiwn Marcos: http://tex.stackexchange.com/q/248721/)
\begin{scope}[#1,local bounding box/.expanded=#2]
\begin{scope}[blend group=#2]
\shade [ball color=red] (90:.6) circle (1);
\shade [ball color=green] (210:.6) circle (1);
\shade [ball color=blue] (330:.6) circle (1);
\end{scope}%
\end{scope}%
\node [below=5mm of #2, anchor=mid] {#2};
}
任何一个定义都会产生相同的结果。
阴影路径:
阴影节点:
完整代码:
\documentclass[border=10pt,multi,tikz]{standalone}
\newcommand*\showblend[2][]{% o manual, 314 (gweler hefyd gwestiwn Marcos: http://tex.stackexchange.com/q/248721/)
\begin{scope}[#1,local bounding box/.expanded=#2]
\begin{scope}[blend group=#2]
\shade [ball color=red] (90:.6) circle (1);
\shade [ball color=green] (210:.6) circle (1);
\shade [ball color=blue] (330:.6) circle (1);
\end{scope}%
\end{scope}%
\node [below=5mm of #2, anchor=mid] {#2};
}
\newcommand*\shownodeblend[2][]{%
\begin{scope}[#1,local bounding box/.expanded=#2]
\begin{scope}[blend group=#2]
\node [ball color=red, circle, minimum size=20mm] at (90:.6) {};
\node [ball color=green, circle, minimum size=20mm] at (210:.6) {};
\node [ball color=blue, circle, minimum size=20mm] at (330:.6) {};
\end{scope}%
\end{scope}%
\node [below=5mm of #2, anchor=mid] {#2};
}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}
\showblend{normal}
\showblend[xshift=35mm]{multiply}
\showblend[xshift=70mm]{screen}
\showblend[xshift=105mm]{overlay}
\showblend[xshift=0mm,yshift=-40mm]{darken}
\showblend[xshift=35mm,yshift=-40mm]{lighten}
\showblend[xshift=70mm,yshift=-40mm]{color dodge}
\showblend[xshift=105mm,yshift=-40mm]{color burn}
\showblend[xshift=0pt,yshift=-80mm]{hard light}
\showblend[xshift=35mm,yshift=-80mm]{soft light}
\showblend[xshift=70mm,yshift=-80mm]{difference}
\showblend[xshift=105mm,yshift=-80mm]{exclusion}
\showblend[xshift=0pt,yshift=-120mm]{hue}
\showblend[xshift=35mm,yshift=-120mm]{saturation}
\showblend[xshift=70mm,yshift=-120mm]{color}
\showblend[xshift=105mm,yshift=-120mm]{luminosity}
\end{tikzpicture}
\begin{tikzpicture}
\shownodeblend{normal}
\shownodeblend[xshift=35mm]{multiply}
\shownodeblend[xshift=70mm]{screen}
\shownodeblend[xshift=105mm]{overlay}
\shownodeblend[xshift=0mm,yshift=-40mm]{darken}
\shownodeblend[xshift=35mm,yshift=-40mm]{lighten}
\shownodeblend[xshift=70mm,yshift=-40mm]{color dodge}
\shownodeblend[xshift=105mm,yshift=-40mm]{color burn}
\shownodeblend[xshift=0pt,yshift=-80mm]{hard light}
\shownodeblend[xshift=35mm,yshift=-80mm]{soft light}
\shownodeblend[xshift=70mm,yshift=-80mm]{difference}
\shownodeblend[xshift=105mm,yshift=-80mm]{exclusion}
\shownodeblend[xshift=0pt,yshift=-120mm]{hue}
\shownodeblend[xshift=35mm,yshift=-120mm]{saturation}
\shownodeblend[xshift=70mm,yshift=-120mm]{color}
\shownodeblend[xshift=105mm,yshift=-120mm]{luminosity}
\end{tikzpicture}
\end{document}