以编程方式定义矩阵的节点

以编程方式定义矩阵的节点

我正在尝试以编程方式定义节点矩阵,但是在定义矩阵节点的步骤上遇到问题。

节点的大小不同(dimensionsBigBox 和 DimensionsSmallBox),我可以定义它们,但只能“硬编码”(即通过按行或按列甚至按节点定义节点的样式(语法/row 1))。我想动态定义它们,因为我有一个变量来定义节点 x 需要哪种样式。

这可能吗 ?

我做了一个最小的工作示例,但应用程序实际上有许多我事先不知道的节点。

\documentclass[border=2mm,tikz]{standalone}
\usetikzlibrary{matrix}

\begin{document}
\tikzset{dimensionsBigBox/.style={
        minimum height=3cm,
        rectangle, 
        fill=none, draw=blue,
        text depth=0.5em, text height=1em,
}}

\tikzset{dimensionsSmallBox/.style={
        minimum height=1cm,
        rectangle, 
        fill=none, draw=red,
        text depth=0.5em, text height=1em,
}}

\tikzset{
mygridmatrix/.style={
    matrix of nodes, 
       row sep=-\pgflinewidth, column sep=-\pgflinewidth, 
       nodes={draw, minimum size=1cm}, 
       nodes in empty cells,
    row 1/.style={
        nodes={
            dimensionsBigBox
        }
    },
    row 2/.style={
        nodes={
            dimensionsSmallBox
        }
    },
    row 3/.style={
        nodes={
            dimensionsBigBox
        }
    },
       },
}

\begin{tikzpicture}
\foreach \x/\y  in  {1/dimensionsBigBox, 2/dimensionsBigBox, 3/dimensionsBigBox, 4/dimensionsSmallBox, 5/dimensionsSmallBox, 6/dimensionsSmallBox, 7/dimensionsBigBox, 8/dimensionsBigBox, 9/dimensionsBigBox}{
    Set style \y for node  \x \\
}
\matrix (m) [mygridmatrix]
{
&&&\\
&&&\\
&&&\\
};

\end{tikzpicture}

\end{document}

需要添加的附加内容:

目前,第 1 行和第 3 行是 BigBox。如果我想让第 1 行仅是 BigBox,我需要更改行的硬编码样式:

    row 1/.style={
        nodes={
            dimensionsBigBox
        }
    },
    row 2/.style={
        nodes={
            dimensionsSmallBox
        }
    },
    row 3/.style={
        nodes={
            dimensionsBigBox
        }
    },

我想要有乳胶代码,它实际上允许我通过循环定义所有节点的变量来分别定义每个节点。

\foreach \x/\y  in  {1/dimensionsBigBox, 2/dimensionsBigBox, 3/dimensionsBigBox, 4/dimensionsSmallBox, 5/dimensionsSmallBox, 6/dimensionsSmallBox, 7/dimensionsBigBox, 8/dimensionsBigBox, 9/dimensionsBigBox}{
    Set style \y for node  \x \\
}

============ 编辑以跟进该问题 ===================

我发布了有关该问题的更精确的问题:循环中节点矩阵的附加样式不起作用

答案1

循环设置样式并不容易,foreach因为它是在本地组中执行的,并且样式不会在外部持久化。

为了解决这个问题,您可以使用另一个循环,例如\xintFor\xintForpair来自xinttools库。

下面是一个如何操作的例子。

\documentclass[tikz,border=7pt]{standalone}
\usetikzlibrary{matrix}
\usepackage{xinttools}

\xintForpair #1#2 in  {(1,red), (2,blue), (3,purple), (4,orange),(7,pink)} \do {
  \pgfmathsetmacro\row{int(div(#1-1,4)+1)}
  \pgfmathsetmacro\col{int(mod(#1-1,4)+1)}
  \tikzstyle{row \row\space column \col}=[nodes={fill=#2}]
}
\begin{document}
  \begin{tikzpicture}
    \matrix (m)[
      matrix of nodes,
       row sep=-\pgflinewidth, column sep=-\pgflinewidth,
       nodes={draw, minimum size=1cm},
       nodes in empty cells
    ]
    {
      &&&\\
      &&&\\
      &&&\\
    };
  \end{tikzpicture}
\end{document}

在此处输入图片描述

注意:我使用它tikzstyle只是为了测试-ayatollahs 的耐心tikzset;)

答案2

我对这个问题仍然感到困惑。为什么不直接将节点放入矩阵中,而是定义一个数组来定义矩阵的节点呢?我也不明白关于节点名称的说法,它们确实有名称,你可以使用alias。如果你能告诉我下面的问题是什么,那就太好了,这样有人最终可以回答这个问题。

\documentclass[border=2mm,tikz]{standalone}
\usetikzlibrary{matrix}

\begin{document}
\tikzset{dimensionsBigBox/.style={
        minimum height=3cm,
        rectangle, 
        fill=none, draw=blue,
        text depth=0.5em, text height=1em,
}}

\tikzset{dimensionsSmallBox/.style={
        minimum height=1cm,
        rectangle, 
        fill=none, draw=red,
        text depth=0.5em, text height=1em,
}}


\begin{tikzpicture}[every node/.append style={minimum width=6mm}]
\matrix[matrix of nodes] (m) {%
|[dimensionsBigBox,alias=topleft]|& |[dimensionsBigBox]| &|[dimensionsBigBox]|\\ 
|[dimensionsSmallBox]|& |[dimensionsSmallBox]| &|[dimensionsSmallBox]|\\ 
|[dimensionsBigBox]|& |[dimensionsBigBox]| &|[dimensionsBigBox,alias=bottomright]|\\ };
\draw[blue,-latex] (topleft.center) -- (bottomright.center);
\end{tikzpicture}

\end{document}

在此处输入图片描述

相关内容