为什么“填充”会覆盖“在命令后附加”元素?

为什么“填充”会覆盖“在命令后附加”元素?

下一个代码只是描述问题的一个小例子。我想在 a 内添加一些元素(行或文本)node,我想通过节点的 来完成.style。我尝试过使用append after command(有和没有postaction),直到fill在外部节点中使用选项,它才有效。然后,所有添加的元素都被填充颜色覆盖,除了节点内容之外什么都没有保留。

在此处输入图片描述

上图显示了问题。我想获得正确的结果

\node[draw, minimum size=3cm, fill=green] (test) {test};
\node[anchor=north] at (test.north) {A};

但使用左节点中使用的代码

\node[draw, minimum size=3cm, append after command={%
    \pgfextra \node[anchor=north] at (\tikzlastnode.north) {A};\endpgfextra}] {test};

填充后产生中心图形

\node[draw, minimum size=3cm, fill=green, append after command={%
    \pgfextra \node[anchor=north] at (\tikzlastnode.north) {A};\endpgfextra}] {test};

我知道我可以用 做同样的事情pic,但我想了解这里发生了什么。我尝试使用postaction={append after ...behind pathin front of path选项,但总是得到类似的结果。

你能解释一下吗?

\documentclass[tikz,border=2mm]{standalone}

\begin{document}
\begin{tikzpicture}

%Left figure: Works without `fill`.
\begin{scope}[xshift=-4cm]
\node[draw, minimum size=3cm, append after command={\pgfextra \node[anchor=north] at (\tikzlastnode.north) {A};\endpgfextra}] {test};
\end{scope}

%Center figure. Fill covers everything inside
\node[draw, minimum size=3cm, fill=green, append after command={\pgfextra \node[anchor=north] at (\tikzlastnode.north) {A};\endpgfextra}] {test};

%Right figure: two commands
\begin{scope}[xshift=4cm]
\node[draw, minimum size=3cm, fill=green] (test) {test};
\node[anchor=north] at (test.north) {A};
\end{scope}
\end{tikzpicture}
\end{document}

更新(2018)

这个问题的主要原因是我想在节点的边距内添加标签,但我不知道该怎么做。我测试了所有提到的选项,但没有成功。

虽然 percusse 的答案解决了我的问题,但并没有解决我真正的问题。所以我认为值得在这里展示解决方案。

现在我知道只需更改其默认锚点即可在节点内部绘制标签。因此,可以使用如下简单命令获取正确的方块:

\node[draw, minimum size=3cm, fill=green, label={[anchor=north]A}] (test) {test};

不需要额外的路径或append after commandpath picture选项。

答案1

后期选项并不涵盖所有属性。append after command\pgfpositionnodelater<...>命令(特别是此处\pgfpositionnodelaterpath)的巧妙快捷机制。因此,填充已存储但未执行。但是形状等已经确定,否则您将无法将该技巧用于放置。在放置和其他详细信息之后,将\pgfpositionnodenow调用并覆盖之前的任何内容。

您可能会争辩说,也许绘图/填充/剪辑可能已经分开,但这将是 T.Tantau 的功能请求。

答案2

我非常感谢@Zarko 让我注意到这个问题这个帖子。我的建议是在前景层上画东西。

\documentclass[tikz,border=2mm]{standalone}
\usetikzlibrary{backgrounds}
\pgfdeclarelayer{background}
\pgfdeclarelayer{foreground}
\pgfsetlayers{background,main,foreground}
\begin{document}
\begin{tikzpicture}

%Left figure: Works without `fill`.
\begin{scope}[xshift=-4cm]
\node[draw, minimum size=3cm, append after command={\pgfextra \node[anchor=north] at (\tikzlastnode.north) {A};\endpgfextra}] {test};
\end{scope}

%Center figure. Fill covers everything inside
\node[draw, minimum size=3cm, fill=green, append after command={\pgfextra{
\begin{pgfonlayer}{foreground} 
\node[anchor=north] at (\tikzlastnode.north) {A};
\end{pgfonlayer}}}] {test};

%Right figure: two commands
\begin{scope}[xshift=4cm]
\node[draw, minimum size=3cm, fill=green] (test) {test};
\node[anchor=north] at (test.north) {A};
\end{scope}
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容