在 TikZ 矩阵中重新定义 \tikzset

在 TikZ 矩阵中重新定义 \tikzset

我正在研究这个问题我发现了一种我不完全理解的行为。

考虑以下 MWE:

\input tikz
\usetikzlibrary{matrix}

\let\oldset\tikzset
\def\fooset{\pgfqkeys{/foo}}

\pgfkeys{
  /foo/.search also=/tikz,
  /foo/bar/.style=/tikz/red
}

\let\tikzset\fooset

\tikzpicture

\matrix [matrix of math nodes][bar] {
 p & o & f \\
 l & o & g \\
};

\endtikzpicture

\bye

我在这里的目的是重新定义\tikzset,以便键入在选项/foo中具有绝对优先权\matrix没有其他的变化

密钥bar按预期找到(矩阵为红色)但所有代码样式单元格和节点似乎都丢失了,即数学模式和基线对齐。

我的问题是:我如何获得我想要的行为?


以下是我所尝试的方法的解释。

以下是相关代码tikzlibrarymatrix.code.tex

\tikzstyle{matrix of nodes}=[%
   matrix,%
   cells={anchor=base},%
   nodes={%
     execute at begin node=,%
     execute at end node=,
     name=\tikzmatrixname-\the\pgfmatrixcurrentrow-\the\pgfmatrixcurrentcolumn%
   },
   execute at begin cell=\tikz@lib@matrix@start@cell,%
   execute at end cell=\tikz@lib@matrix@end@cell,%
   execute at empty cell=\tikz@lib@matrix@empty@cell
]

我尝试搜索那个图书馆,pgfmodulematrix.代码.textikz.代码.tex寻找线索,但仍然不确定断点究竟在哪里,我试图\tikzset通过一些猜测来恢复“在造成任何损害之前”的原始含义。

这就是我想出的:

\input tikz
\usetikzlibrary{matrix}

\let\oldset\tikzset
\def\fooset{\pgfqkeys{/foo}}

\pgfkeys{
  /foo/.search also=/tikz,
  /foo/bar/.style=/tikz/red,
  /tikz/hard probe/.code={\let\tikzset\oldset},
  /tikz/soft probe/.style={every matrix/.append code={\let\tikzset\oldset}}
}

\let\tikzset\fooset

\tikzpicture

\matrix
  [every matrix/.append code={\let\tikzset\oldset}]
  [matrix of math nodes][bar]
{
 p & o & f \\
 l & o & g \\
};

\endtikzpicture

\bye

给出了预期的结果:bar被识别,并且来自的所有样式matrix of math nodes都有效。此外,可以验证现在密钥bar不再在或任何特定节点内被识别every cellevery node期望的行为)。

但是,以下所有情况都会导致bar密钥无法识别:

  1. 附加[every matrix...]到任何外部范围;
  2. 使用[soft probe][hard probe]代替。[every matrix...]\matrix

另外,我怀疑every matrix它是否曾经被这样使用,所以我可能只是滥用了扩展顺序中的一些漏洞(我不完全理解)。

相关内容