TikZ 中的绝对定位和混合组

TikZ 中的绝对定位和混合组

为了对 tikzpicture 进行绝对定位(即,就“当前页面”节点而言),我们需要为图片设置“覆盖”选项。这似乎与在图片内设置混合组之间存在冲突。如果是这样,有没有办法规避它?我希望在同一个 tikzpicture 中同时使用这两个功能。作为 MWE,请

\documentclass[11pt]{article}

\usepackage{tikz}

\pagestyle{empty}

\begin{document}

  \begin{tikzpicture}[
    remember picture,
    overlay,%<- Comment and uncomment to check the difference
    every path/.append style={fill opacity=0.75},
  ]
  \begin{scope}[blend group=lighten]
    \fill[green] (90:1) circle[radius=1.5];
    \fill[orange] (180:1) circle[radius=1.5];
    \fill[red] (0:1) circle[radius=1.5];
  \end{scope}
  \begin{scope}[xshift=6cm,blend group=darken]
    \fill[green] (90:1) circle[radius=1.5];
    \fill[orange] (180:1) circle[radius=1.5];
    \fill[red] (0:1) circle[radius=1.5];
  \end{scope}
  \begin{scope}[xshift=12cm,blend mode=multiply]
    \fill[green] (90:1) circle[radius=1.5];
    \fill[orange] (180:1) circle[radius=1.5];
    \fill[red] (0:1) circle[radius=1.5];
  \end{scope}
  \begin{scope}[yshift=-4cm,blend group=screen]
    \fill[green] (90:1) circle[radius=1.5];
    \fill[orange] (180:1) circle[radius=1.5];
    \fill[red] (0:1) circle[radius=1.5];
  \end{scope}
  \begin{scope}[yshift=-8cm,blend group=overlay]
     \fill[green] (90:1) circle[radius=1.5];
     \fill[orange] (180:1) circle[radius=1.5];
     \fill[red] (0:1) circle[radius=1.5];
  \end{scope}
  \end{tikzpicture}
\end{document}

答案1

我认为这是一个已知的限制,而不是一个错误。或者,如果你愿意的话,可以称为一个已知的错误。至少,TikZ 手册提到了这个问题,给出了解释并指导你找到解决方法。以下解决方案嵌套了tikzpicture环境。我知道这通常是一个坏主意。但是,我认为在这种情况下这是推荐的解决方法,因为嵌套是手册代码的一个功能。

从第350页开始:

请注意,创建透明组时,Tik Z 必须正确确定组内材质的大小。通常,这没有问题,但是当您使用诸如叠加或变换画布之类的东西时,可能会出现麻烦。在这种情况下,请参阅第 111 节,了解如何在这种情况下避开此问题。

追寻踪迹,第 1097 页:

请注意,根据驱动程序的不同,pgf 可能必须猜测透明组内容的大小(因为这样的组放在 pdf 的 XForm 中,并且必须提供边界框)。pgf 通常会使用透明组末尾的图片边界框的大小加上 1cm 的安全边距。在正常情况下,这会很好地工作,因为图片的边界框无论如何都包含所有内容。但是,如果您关闭了图片大小跟踪或正在使用画布转换,则可能必须确保边界框足够大。诀窍是在本地创建“足够大”的图片,然后将此图片插入主图片中,同时忽略尺寸。

本质上,我认为 TikZ 无法正确找出边界框,因为它需要尽早知道这一点,因为使用了透明度组。至少对于 PDF,这似乎是个问题。建议的解决方法是帮助 TikZ 解决,方法是给它提供一个合适的边界框。

\documentclass[11pt]{article}

\usepackage{tikz}

\pagestyle{empty}

\begin{document}

\begin{tikzpicture}% see page 1097, following direction on page 350
  \node [overlay, remember picture, left] at (15,-5)
  {%
  \begin{tikzpicture}[
    every path/.append style={fill opacity=0.75},
  ]
  \begin{scope}[blend group=lighten]
    \fill[green] (90:1) circle[radius=1.5];
    \fill[orange] (180:1) circle[radius=1.5];
    \fill[red] (0:1) circle[radius=1.5];
  \end{scope}
  \begin{scope}[xshift=6cm,blend group=darken]
    \fill[green] (90:1) circle[radius=1.5];
    \fill[orange] (180:1) circle[radius=1.5];
    \fill[red] (0:1) circle[radius=1.5];
  \end{scope}
  \begin{scope}[xshift=12cm,blend mode=multiply]
    \fill[green] (90:1) circle[radius=1.5];
    \fill[orange] (180:1) circle[radius=1.5];
    \fill[red] (0:1) circle[radius=1.5];
  \end{scope}
  \begin{scope}[yshift=-4cm,blend group=screen]
    \fill[green] (90:1) circle[radius=1.5];
    \fill[orange] (180:1) circle[radius=1.5];
    \fill[red] (0:1) circle[radius=1.5];
  \end{scope}
  \begin{scope}[yshift=-8cm,blend group=overlay]
     \fill[green] (90:1) circle[radius=1.5];
     \fill[orange] (180:1) circle[radius=1.5];
     \fill[red] (0:1) circle[radius=1.5];
  \end{scope}
\end{tikzpicture}};
\end{tikzpicture}
\end{document}

混合组重叠

相关内容