下一个代码只是描述问题的一个小例子。我想在 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 path
和in 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 command
和path 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}