![在 TikZ 矩阵中重新定义 \tikzset](https://linux22.com/image/342567/%E5%9C%A8%20TikZ%20%E7%9F%A9%E9%98%B5%E4%B8%AD%E9%87%8D%E6%96%B0%E5%AE%9A%E4%B9%89%20%5Ctikzset.png)
我正在研究这个问题我发现了一种我不完全理解的行为。
考虑以下 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.代码.tex和tikz.代码.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 cell
(every node
期望的行为)。
但是,以下所有情况都会导致bar
密钥无法识别:
- 附加
[every matrix...]
到任何外部范围; - 使用
[soft probe]
或[hard probe]
代替。[every matrix...]
\matrix
另外,我怀疑every matrix
它是否曾经被这样使用,所以我可能只是滥用了扩展顺序中的一些漏洞(我不完全理解)。