以编程方式设置 TikZ 中矩阵的列样式

以编程方式设置 TikZ 中矩阵的列样式

我正在尝试以编程方式设置 TikZ 矩阵的列样式。我的尝试如下:

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

\begin{document}

\begin{tikzpicture}

\tikzstyle{mymatrix}=[draw]  
\foreach \c [count=\i] in {red, green, blue} {
    \globaldefs=1        % make tikz style global
    \tikzset{mymatrix/.append style={column \i/.style={nodes={fill=\c}}}}
}

\matrix (m) [matrix of nodes, mymatrix] {
 1 & 2 & 3 & 4 \\
 5 & 6 & 8 & 8 \\ };

\end{tikzpicture}

\end{document}

不幸的是,这段代码无法编译,因为命令\i\c未定义。我猜想 for 循环内的样式必须在 for 循环内扩展,但我不知道该怎么做。有什么想法吗?

答案1

\edef您可以使用定义新命令来扩展变量:

\documentclass{article}
\usepackage{pgfplots}
\usetikzlibrary{matrix}

\begin{document}

\begin{tikzpicture}

\tikzstyle{mymatrix}=[draw]  
\foreach \c [count=\i] in {red, green, blue} {
    \globaldefs=1 
    \edef\dotikzset{
        \noexpand\tikzset{
            mymatrix/.append style={
                column \i/.style={
                    nodes={fill=\c}
                }
            }
        }
    }
    \dotikzset
}

\matrix (m) [matrix of nodes, mymatrix] {
 1 & 2 & 3 & 4 \\
 5 & 6 & 8 & 8 \\ };

\end{tikzpicture}

\end{document}

答案2

杰克更快,但是我从埃格尔那里学到了一些东西在这个问题中

\documentclass{article}
\usepackage{etoolbox}
\usepackage{tikz}
\usetikzlibrary{matrix}

\let\mystyle\empty
\newcommand{\populatestyle}{%
  \foreach \c [count=\i] in {red, green, blue} {
    \begingroup\edef\x{\endgroup
       \noexpand\gappto\noexpand\mystyle{column \i/.style={nodes={fill=\c}},}}\x
    }%
}
\populatestyle

\tikzset{mymatrix/.estyle={\mystyle}}

\begin{document}
\begin{tikzpicture}
\matrix (m) [matrix of nodes,mymatrix] {
 1 & 2 & 3 & 4 \\
  5 & 6 & 7 & 8 \\ };
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案3

这是一个相当老的问题,有两个很好的答案。不过,可能还有一些空间可以容纳另一个既不使用\globaldefs也不加载其他包的答案。(这个答案有一个弱点:如果颜色列表的条目少于矩阵的行数,则会出现错误。)

\documentclass[tikz,border=3.14mm]{standalone}
\usetikzlibrary{matrix} 
\begin{document}
\begin{tikzpicture}[colorize cells/.style={/utils/exec={%
 \pgfmathsetmacro{\mycolor}{{#1}[\the\pgfmatrixcurrentcolumn-1]}
 \pgfkeysalso{/tikz/fill=\mycolor}}}]
 \matrix (m) [matrix of nodes,nodes={colorize cells={"red","green","blue","white"}}] {
 1 & 2 & 3 & 4 \\
 5 & 6 & 8 & 8 \\ };
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容