解释(cfr)

解释(cfr)

根据 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 colorshade因为它是阴影,所以会隐式调用。因此,如果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}

相关内容