(我没有找到更好的标题来回答这个问题。欢迎提出建议。)
我在 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}
答案2
尝试一下这个,使用范围和变换形状
\begin{scope}[shift={(2,0)},rotate=10,transform shape]
\node[draw,rectangle,ground,] (A) at (0,0){a};% not good
\end{scope}