节点矩阵的参数化“节点内容”样式存在问题

节点矩阵的参数化“节点内容”样式存在问题

这与从样式中设置 tikz 节点的内容,但这个问题和相应的答案已有八年历史,node contents当时还没有选项。

我本想回答访问 tikz 矩阵单元格内容以编程方式设置单元格样式具有节点样式,其中fillnode contents由可以固定到每个矩阵单元中的参数定义。例如:

\begin{tikzpicture}[mystyle/.style={draw, node contents={#1}}, 
                    mystyle/.default={A}]
\matrix[matrix of nodes, nodes in empty cells, nodes={mystyle}]{
    |[mystyle={B}]|&&\\
     &&\\};
\end{tikzpicture}

由于这不起作用,我最终node contentslabel=center:#1在主节点固定一定大小时起作用的方法进行了替换。

那么问题是为什么以前的代码不起作用?

这是经过先前测试的代码以及所需但不起作用的解决方案。

\documentclass[border=2mm,tikz]{standalone}
\usetikzlibrary{matrix}
\begin{document}
\begin{tikzpicture}
\matrix[matrix of nodes, nodes in empty cells, nodes={draw, node contents={A}}]{
&&\\&&\\};
\end{tikzpicture}

\begin{tikzpicture}[mystyle/.style={draw, node contents={A}}]
\matrix[matrix of nodes, nodes in empty cells, nodes={mystyle}]{
&&\\&&\\};
\end{tikzpicture}

\begin{tikzpicture}[mystyle/.style={draw, node contents={#1}}]
\matrix[matrix of nodes, nodes in empty cells, nodes={mystyle={A}}]{
&&\\&&\\};
\end{tikzpicture}

\begin{tikzpicture}[mystyle/.style={draw, node contents={#1}}, mystyle/.default={A}]
\matrix[matrix of nodes, nodes in empty cells, nodes={mystyle}]{
&&\\&&\\};
\end{tikzpicture}

\begin{tikzpicture}[mystyle/.style={draw, node contents={#1}}, mystyle/.default={A}]
\matrix[matrix of nodes, nodes in empty cells, nodes={mystyle}]{
|[mystyle={B}]|&&\\&&\\};
\end{tikzpicture}

\end{document}

答案1

node contents1) 只能用作节点选项中的最后一个键;2) 它改变节点语法。

\documentclass{article}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}[nodes=draw]
  % without `node contents`, node parser keeps working until a pair of braces
  \node {text};
  % with `node contents`, node parser stops immediately
  \node at (1,0) [node contents=text];
\end{tikzpicture}
\end{document}

但对于matrix of nodes,这两个条件都不成立。

  1. 传递给选项的任何样式nodes={...}实际上every node/.append style={...}都在节点解析器开始之前执行(并且当解析器启动时它会用进行初始化node contents={}),因此nodes={node contents={...}}不会产生任何效果。
  2. matrix of nodes矩阵单元将始终具有以下形式
    execute at begin cell={\node[...] \bgroup}
    execute at end cell  ={\egroup;}
    
    注意到\bgroup <cell content> \egroup节点内容形成了正常的语法。

您可能对如何matrix of nodes在顶部定义execute at (begin|end) cell以及更多矩阵样式感兴趣,tikzlibrarymatrix.code.tex

或者,我认为你的原始任务可以通过选项解决execute at begin node,再加上一些技巧:

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

\begin{document}
\begin{tikzpicture}[execute at begin node={\mytext},
                    execute at begin node once/.store in=\mytext,
                    mystyle/.style={draw, execute at begin node once={#1}}, 
                    mystyle/.default={A}]
\matrix[matrix of nodes, nodes in empty cells, nodes={mystyle}]{
    |[mystyle={B}]|&&\\
     &&\\};
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容