我想定义一个宏,它将获取一个节点定义列表,如下所示
\mymacro[boxes={{\node[rectangle] {foo};},
{\node[rectangle] {bar};},
{\node[circle] {baz};},
alignment=stacked]{ ... }
并将节点垂直放置,即将其堆叠在一起。
[ ]
[ ]
( )
或者像这样:
\mymacro[boxes={{\node[rectangle] {foo};},
{\node[rectangle] {bar};},
{\node[circle] {baz};},
alignment=listed]{ ... }
[ ] , [ ] , ( )
将它们放在一起,并与另一个节点(在本例中包含一个逗号)交错。
我知道如何使用 pgfkeys 处理列表选项,但不知道从哪里开始堆叠或列出位。
答案1
我会使用样式而不是宏来实现这一点:可以使用 s 来实现垂直和水平放置chain
,可以使用 a 来放置水平节点之间的逗号decoration
。
我在这里使用了两种样式:nodelist
定义要绘制的所有节点并使其成为链的一部分,并调用第二种样式,称为nodelist direction
,它实际上启动链,定义链的增长方向,并且在nodelist direction=horizontal
设置装饰的情况下,用包含逗号的节点替换链的连接。
然后,您只需将节点括在具有样式的范围内nodelist
,一切都会设置好:
\begin{scope}[nodelist]
\node {A};
\node [circle] {B};
\node [star] {C};
\end{scope}
\begin{scope}[xshift=6cm,nodelist=vertical]
\node {A};
\node [circle] {B};
\node [star] {C};
\end{scope}
将导致
完整代码如下:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc,shapes,chains,decorations.markings}
\begin{document}
\tikzset{
nodelist direction/.is choice,
nodelist direction/.default=horizontal,
nodelist direction/horizontal/.style={
start chain=going right,
every node/.style=join,
decoration={
markings, % switch on markings
mark=at position 0.5 with {
\tikzset{every node/.style={}} % Reset the style locally
\node {,}; % Create a node that holds a comma
}
},
every join/.style={
decorate % Decorate every join with the decoration defined above
}
},
nodelist direction/vertical/.style={
start chain=going below, % Much simpler, just go down, no decorations, no joins
},
nodelist/.style={ % Options common to horizontal and vertical
nodelist direction=#1,
every node/.append style={
on chain,
draw
},
}
}
\begin{tikzpicture}
\begin{scope}[nodelist]
\node {A};
\node [circle] {B};
\node [star] {C};
\end{scope}
\begin{scope}[xshift=6cm,nodelist=vertical]
\node {A};
\node [circle] {B};
\node [star] {C};
\end{scope}
\end{tikzpicture}
\end{document}