如何在 TikZ 中的不同节点之间共享选定的选项?

如何在 TikZ 中的不同节点之间共享选定的选项?

(我没有找到更好的标题来回答这个问题。欢迎提出建议。)

我在 TikZ 中创建了一些新形状,当将某个键传递到最后一个节点时,我想将其中一个形状放在另一个形状下方。我将使用两个矩形的示例更好地说明我的意思:

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{patterns,calc}

\tikzstyle{ground}=[append after command={;\node[draw=red,rectangle,anchor=north] (B) at (\tikzlastnode.south){a}}]


\begin{document}
\begin{tikzpicture}
  \node[draw,rectangle,ground,rotate=10] (A) at (0,0){a};% not good
  \begin{scope}[shift={(1,0)}]
    \node[draw,rectangle,rotate=10] (B) at (0,0){a};
    \node[draw=red,rectangle,anchor=north,rotate=10] (C) at (B.south){a};% OK
  \end{scope}
\end{tikzpicture}
\end{document}

堆叠节点

如您所见,我创建了一个样式,将第二个节点的创建正确引用到第一个节点。一切正常,但是,如果我需要,例如,同时旋转两个形状,我找不到解决方案,因为只有第一个矩形被旋转(左)。我实现所需结果的唯一方法是代码中显示的方法,我必须手动绘制第二个节点并将选项传递给它rotate

那么,有没有办法实现所需的结果(右侧),但使用第一个例子的语法(左侧)?请注意,所涉及的两个实际形状都是我绘制的,因此如果需要自定义,也可以。

答案1

如果您知道哪些参数会影响附加节点,则可以将它们包含到 中.style。这里有一个基于您的代码的示例。我不知道它是否能解决您的实际问题。

在您的示例中,您想要rotate附加节点,因此我定义了一种ground包含此参数的样式,其中 0 作为默认值。

    ground/.style={%
       append after command={;%
          \node[draw=red,rectangle,
             anchor=north,rotate=#1] (B) 
             at (\tikzlastnode.south){a}}},
    ground/.default=0,

现在可以这样写\node[draw,rectangle,ground=10,rotate=10] (A) at (0,0){a};,但是这样你必须确保在ground和中写入相同的值rotate。一个更好的解决方案是定义一个包含它们两者的新样式,如下所示grounded

    grounded/.style={ground=#1,rotate=#1},
    grounded/.default=0}

完整代码如下:

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

\tikzset{%
    ground/.style={%
       append after command={;%
          \node[draw=red,rectangle,
             anchor=north,rotate=#1] (B) 
             at (\tikzlastnode.south){a}}},
    ground/.default=0,
    grounded/.style={ground=#1,rotate=#1},
    grounded/.default=0}

\begin{document}
\begin{tikzpicture}
  \node[draw,rectangle,ground=10,rotate=10] (A) at (0,0){a};
  \node[draw,rectangle,grounded] (A) at (0.5,0){a};
  \node[draw,rectangle,grounded=25] (A) at (1,0){a};    
  \node[draw,rectangle,grounded=-25] (A) at (1.5,0){a};
\end{tikzpicture}
\end{document}

在此处输入图片描述

请看一下:应该使用 \tikzset 还是 \tikzstyle 来定义 TikZ 样式?

答案2

尝试一下这个,使用范围和变换形状

  \begin{scope}[shift={(2,0)},rotate=10,transform shape]
  \node[draw,rectangle,ground,] (A) at (0,0){a};% not good
  \end{scope}

相关内容