引用 lasttikznode 的内容,并将它们覆盖在节点上

引用 lasttikznode 的内容,并将它们覆盖在节点上

我正在尝试解决如何正确旋转 Tikz 节点组合而不旋转其标签文本?;我发现tikz pgf - “命令后附加”和“插入路径”的问题

这给了我以下想法 - 定义一个样式,这样它只需将另一个节点放置在“当前”节点之上,并使用彩色背景,这样新节点就会遮住旧节点,并且具有与“当前”节点相同的内容,但经过旋转。这就是我所取得的进展:

\documentclass{standalone}

\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{positioning}
\usetikzlibrary{fit}

% https://tex.stackexchange.com/questions/55722/problem-with-append-after-command-and-insert-path
\makeatletter
\def\mymacro{
\begin{scope}
% { % MUST have this group! or scope!
  \setbox\tikz@figbox=\box\pgfutil@voidb@x
  \node at (\tikzlastnode) [fill=yellow] {\rotatebox{180}{YY}}; %
% }
\end{scope}
}
\makeatother

\tikzstyle{drc} = [draw, rectangle, line width=1pt, align=center,
append after command={\pgfextra{\mymacro}},
% insert path={\pgfextra{\mymacro}}, % no \tikzlastnode
]

\begin{document}

\begin{tikzpicture}[line width=3mm]
\node[drc] at (0,0) {\ \ A};
\node[drc] at (1,1) {B\ \ };
\end{tikzpicture}
\end{document}

这是输出:

测试61.png

问题/疑问是:

  • 附加节点是在后面原始节点,因此它的填充不能遮挡原始节点——有什么方法可以让它位于原始节点的前面吗?
  • 我只是想用这些字母YY进行测试 - 但我更愿意“提取” 的文本\tikzlastnode;但是,似乎\tikzlastnode基本上只是最后一个节点的名称,而不是“对象引用”。无论如何,有没有办法提取和重用 的文本\tikzlastnode

答案1

我认为没有内置方法来保存最后一个节点的盒子,所以这是一种快速而肮脏的方法(并且可能不够健壮):

\documentclass[tikz, border=5]{standalone}
\newbox\lastnodebox
\begin{document}
\begin{tikzpicture}[every node/.style={draw,
  execute at begin node=\global\setbox\lastnodebox\hbox\bgroup,
  execute at end node=\egroup\copy\lastnodebox}]

\foreach \i [count=\y] in {A,...,F}
  \node at (0,-\y/2) {\box\lastnodebox \i};

\end{tikzpicture}
\end{document}

在此处输入图片描述


编辑:关于 OP 示例,即使使用此方法通过 添加附加节点append after command={\pgfextra{\mymacro}},附加的节点仍然“在后面”(因此不会“覆盖”前一个节点)。但是,此方法可以直接在样式中使用,与包turn中的环境一起使用rotating以“按时”发出旋转,因此“附加”或“覆盖”第二个旋转节点是不必要的。所以我们可以使用:

\documentclass{standalone}

\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{positioning}
\usetikzlibrary{fit}
\usepackage{rotating} %tlmgr install rotating
\newbox\lastnodebox
\tikzstyle{drc} = [draw, rectangle, line width=1pt, align=center,]
\tikzstyle{drcr} = [drc,
execute at begin node=\begin{turn}{180}\global\setbox\lastnodebox\hbox\bgroup,
execute at end node=\egroup\copy\lastnodebox\end{turn},
]

\begin{document}
\begin{tikzpicture}[line width=3mm]
\node[drc] at (0,0) {\ \ A\\A\ \ };
\node[drcr] at (1,1) {B\ \ \\\ \ B};
\end{tikzpicture}
\end{document}

... 获得:

测试62.png

相关内容