在 TikZ 中放置节点列表

在 TikZ 中放置节点列表

我想定义一个宏,它将获取一个节点定义列表,如下所示

\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} 

相关内容