如何为 tikz 矩阵中的空单元格设置特定样式

如何为 tikz 矩阵中的空单元格设置特定样式

我有一个 tikz 矩阵,如下面的代码所示,其中包含一些空单元格。(不必担心列和行分隔的问题。为了简单起见,我省略了这一点。)

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{matrix}

\begin{document}
    \begin{tikzpicture}[
            table/.style={
                matrix of nodes,
                nodes in empty cells,
                nodes = {fill=gray, draw = black},
            }
        ]
        \matrix (test) [table] {
            1 & 2 & 3 \\
            4 &   & 5 \\
        };
    \end{tikzpicture}
\end{document}

我使用该nodes in empty cells选项是因为我希望单元格可以通过矩阵名称和列/行号进行寻址。该选项的一个含义是每个空单元格都包含一个node无内容的单元格,但是其样式与所有其他节点相同。

我正在寻找一种方法来赋予空单元格不同的样式(不同的填充颜色且没有边框),而无需

  1. 失去单细胞的可寻址性
  2. 必须手动向每个空单元格添加样式。

是否存在我尚未找到的选项,或者我必须nodes in empty cells自己“模仿”该选项来插入一些不同的风格?

答案1

库中在空单元格中添加节点的宏matrix似乎是\tikz@lib@matrix@empty@cell,定义在 的第 24 行tikzlibrarymatrix.code.tex。您也许可以为空单元格创建新样式,然后从库中重新定义该宏,以在宏定义中找到的matrix新样式中包含该样式。node

代码输出

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{matrix}
\tikzset{empty node/.style={draw=none,fill=none}}
\makeatletter
\def\tikz@lib@matrix@empty@cell{\iftikz@lib@matrix@empty\node[name=\tikzmatrixname-\the\pgfmatrixcurrentrow-\the\pgfmatrixcurrentcolumn,empty node]{};\fi}
\makeatother
\begin{document}
    \begin{tikzpicture}[
            table/.style={
                matrix of nodes,
                nodes in empty cells,
                nodes = {fill=gray, draw = black},
            }
        ]
        \matrix (test) [table] {
            1 & 2 & 3 \\
            4 &   & 5 \\
        };

     \draw [red] (test-2-2.center) -- (test-1-3.center);
    \end{tikzpicture}
\end{document}

答案2

据我所知,没有empty cells样式。但您可以使用 来.list声明必须使用特定样式的单个单元格列表。代码如下乔尔森回答TikZ 矩阵,组合或行和列的样式

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{matrix}

\begin{document}
    \begin{tikzpicture}[
            table/.style={
                matrix of nodes,
                nodes in empty cells,
                nodes = {fill=gray, draw = black},
            },
            myset/.style args = {(#1,#2)}{%
    row #1 column #2/.style={nodes={draw=none, fill=none, inner sep=0pt}}}
        ]
        \matrix (test) [table,myset/.list={(2,2),(3,1),(3,3)}] {
            1 & 2 & 3 \\
            4 &   & 5 \\
              & 6 &  \\
        };
        \draw[red] (test-3-1)--(test-2-2)--(test-3-3);
    \end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容