TikZ 中的相对透明度?

TikZ 中的相对透明度?

我一直想知道是否有可能在 TikZ 中定义某种“相对”透明度。我的意思是什么?

有时,您希望填充节点,以便其内容在线条和形状之间可读。现在,假设您有一张 TikZ 图片,背景为阴影。如果可以指定节点相对于图片的其余部分(或范围)不透明,但相对于外部定义的背景保持透明,那就太好了。

\documentclass{article}

\usepackage{framed,xcolor,tikz}
\definecolor{shadecolor}{gray}{.85}

\begin{document}

\begin{shaded}
   \begin{tikzpicture}
      \draw (0,0) --node[fill=shadecolor] {a} (5,0);
   \end{tikzpicture}
\end{shaded}

\end{document}

在上述情况下,可以使用shadecolor,因为环境就是这样shaded工作的。我想知道是否存在更通用的解决方案,例如,在无法找出周围环境的背景颜色的情况下有效的解决方案。

更新信息

我会尝试更清楚地说明一些事情。我经常使用 TikZ 来绘制几何图形和/或图。然后,有时您会在坐标标签上看到线条。在大多数情况下,只需稍微更改图形即可,例如通过将标签移动到不同的锚点,甚至调整某个角度,从而使线条刚好错过标签。

但是,在某些情况下,除了将标签放在内部间隔为 1 或 2 个点的填充节点中,别无他法,这样它才能在所有其他内容中脱颖而出。主要问题是我必须使用背景颜色来填充我的节点,通常是白色,但有时可能是灰色。

我所举的例子很简单,只是为了说明问题。在这个简单的情况下,我当然可以将线分成两部分。在正常用例中,这是不可能的。

换句话说:我很乐意将图形绘制得好像有白色背景一样,用于fill=white此类节点。然后,在完成所有操作后,我可以说所有白色的东西都变得透明,这样灰色(或任何其他)背景就会透过来。

使用 percusse 的transparency groups 解决方案,无法实现我想要的效果。整个范围变得部分透明,因此线条不再是黑色,背景仍然变亮。我希望线条保持完全黑色,节点填充完全不可见。

在此处输入图片描述

答案1

我刚刚有一个类似的问题被标记为与该问题重复。 链接在这里。 不幸的是,此处发布的答案未被标记为答案,并且 OP 指出它不起作用。此方法的功劳归于 @symbol-1。

正如 @percusse 在此处以及链接中的 @cfr 和 @symbol-1 所指出的那样,结果将取决于查看器。代码下方提供了查看器差异的示例。

这里根据 OP 和@percusse 的答案使用环境选项进行了transparency group=knockout修改scope

\documentclass[tikz]{standalone}
\usetikzlibrary{patterns}

\begin{document}

\begin{tikzpicture}
    \path[pattern=crosshatch dots light steel blue](-2,-2) rectangle (2,2);
    \begin{scope}[transparency group=knockout]
        \draw (-2,0) to node(aaaaa){} (2,0);
        \path (aaaaa) node[fill,opacity=0,text opacity=1]{aaaaa};
    \end{scope}
\end{tikzpicture}

\end{document}

您可以将背景更改为任何事物您喜欢,无需进行其他更改。如果您将文本更改为更长/更短,背景不透明度将相应调整大小 - 即除了标签名称之外无需进行其他更改。

在某些 PDF 查看器中(例如 SumatraPDF、TeXworks 预览器等): 不合规 PDF 查看器的结果

在其他 PDF 查看器中(例如 Adob​​e Acrobat): 符合要求的 PDF 查看器的结果

两种情况下的 PDF 都是一样的。我只是截取了在两个不同的 PDF 查看器中打开的 PDF 的屏幕截图。背景似乎也受到了影响,但这里的重点是透明度。

另外,这里有一个附加节点的示例,其中的文本垂直排列,以说明transparency group=knockout多个节点发生的情况:

\documentclass[tikz]{standalone}
\usetikzlibrary{patterns}

\begin{document}

\begin{tikzpicture}
    \path[pattern=crosshatch dots light steel blue](-2,-2) rectangle (2,2);
    \begin{scope}[transparency group=knockout]
        \draw (-2,0) to node(aaaaa){} (2,0);
        \path (aaaaa) node[fill,opacity=0,text opacity=1]{aaaaa};
        \draw (0,-2) to node(bbbbb){} (0,2);
        \path (bbbbb) node[fill,opacity=0,text opacity=1]{\rotatebox[origin=c]{90}{bbbbb}};
        \draw (-2,-0.35) to node(ccccc){} (2,-0.35);
        \path (ccccc) node[fill=red,text opacity=1]{ccccc};
    \end{scope}
\end{tikzpicture}

在某些 PDF 查看器中(例如 SumatraPDF、TeXworks 预览器等): 不符合标准的 PDF 查看器中的第二个示例的结果

在其他 PDF 查看器中(例如 Adob​​e Acrobat): 符合标准的 PDF 查看器中的第二个示例的结果

您会注意到,最后一个项目opacity=0优先于前面的项目。例如,如果您翻转aaaaabbbbb线和节点(即bbbbb首先发生),您将看到以下内容(在符合要求的 PDF 查看器中): 符合标准的 PDF 查看器中的第三个示例的结果

opacity=0也优先于其他项目不要具有不透明度。例如,如果我们ccccc首先在 内移动节点/线条tikzpicture,则结果如下: 符合标准的 PDF 查看器中的第四个示例的结果

请记住!如果您的图片非常复杂,并且您在旧的或(透明度)不合格的 PDF 查看器中打开它,它将不会达到您的预期效果。

如果您有许多具有透明度的节点并且您不喜欢重叠问题,则您需要调整节点的顺序,xshiftyshift/或将节点完全放置在不同的位置。

答案2

这是通过透明度组完成的,主要依赖于 PDF 渲染,因此有时可能会出错。这里有一个示例,在范围内,所有内容都像往常一样按照绘制顺序进行叠印,但总体结果相对于背景是透明的。

\documentclass[tikz]{standalone}
\usetikzlibrary{patterns}
\begin{document}
\begin{tikzpicture}
\path[pattern=crosshatch dots light steel blue](-2,-2) rectangle (2,2);
\begin{scope}[transparency group,opacity=.6]
\node[fill=yellow] {Heeeeeeeeeeeeeeeeeeey!};
\node[align=center,fill,circle,text=white] {Transparent\\ but overpaints\\ the rectangle};
\end{scope}
\end{tikzpicture} 
\end{document}

在此处输入图片描述

相关内容