![为什么 TikZ 中的图片前缀不适用于矩阵单元名称?](https://linux22.com/image/470155/%E4%B8%BA%E4%BB%80%E4%B9%88%20TikZ%20%E4%B8%AD%E7%9A%84%E5%9B%BE%E7%89%87%E5%89%8D%E7%BC%80%E4%B8%8D%E9%80%82%E7%94%A8%E4%BA%8E%E7%9F%A9%E9%98%B5%E5%8D%95%E5%85%83%E5%90%8D%E7%A7%B0%EF%BC%9F.png)
当我有一张其代码包含矩阵的图片时,当我为该图片使用名称前缀时,事情不起作用:
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{matrix}
\begin{document}
\begin{tikzpicture}[
test/.pic = {
\matrix (mat) [matrix of nodes, nodes in empty cells, column sep = 15 pt, ampersand replacement = \&, nodes = {draw}]{
\& \\
} ;
\draw (mat-1-1) -- (mat-1-2) ;
}]
\pic (pre-) {test} ;
\end{tikzpicture}
\end{document}
我收到错误:Package pgf Error: No shape named 'mat-1-1' is known.
但当我不使用前缀时:
\pic {test}
我得到了预期的结果:
我相信发生的事情是矩阵名称以(mat)
为前缀(pre-mat)
,但由于某种原因,单个单元格名称(mat-1-1)
像不是(pre-mat-1-1)
正如我所料,得到前缀。
为什么前缀没有附加到矩阵单元格名称上?我该如何修复它才能使其正常工作?
答案1
当一张图片被分配一个名字时,这个名字将被设置为name prefix
其内容。这样,mat
pic 中命名的节点pre-
实际上是命名的pre-mat
,并且此矩阵的名称将存储在中\tikzmatrixname
。
但是,通过matrix of nodes
设置,每个节点都会被分配一个名称\tikzmatrixname-\the\pgfmatrixcurrentrow-\the\pgfmatrixcurrentcolumn
,这通常会为您带来命名良好的节点。但是,这使用与矩阵节点相同的命名机制,因此name prefix
图片中的设置实际上会应用两次。
请参见以下示例,其中节点名为. (是节点名称的内部宏。)Foo-Bar-Foo-Bar-Mat-R-C
\tikz@fig@name
\documentclass[tikz]{standalone}
\usetikzlibrary{matrix}
\begin{document}
\tikz
\path[name prefix=Foo-]
pic (Bar-) { % pic name: Foo-Bar-
code={ % → name prefix: Foo-bar-
\matrix (Mat) [matrix of nodes] { % Matrix name: Foo-Bar-Mat
% → \tikzmatrixname: Foo-Bar-Mat
{\csname tikz@fig@name\endcsname}
\\ % this gets converted to
\node (\tikzmatrixname-\the\pgfmatrixcurrentrow
-\the\pgfmatrixcurrentcolumn)
{\csname tikz@fig@name\endcsname};
\\
};
}
};
\end{document}
现在,在我看来,如果矩阵使用与图片相同的命名机制,即设置自己的命名机制,那就更好了name prefix
,但这并不容易调整。
对于你来说,最简单的方法是使用name prefix ..
作为矩阵的一个选项。
但是,这也会重置不使用 的普通节点的前缀\tikzmatrixname
。因此,包含内容的矩阵将具有名为和的{|(a)| \& |(b)| \\}
节点,而不是/ 。a
b
pre-a
pre-b
代码
\documentclass[tikz]{standalone}
\usetikzlibrary{matrix}
\begin{document}
\begin{tikzpicture}[
test/.pic = {
\matrix (mat) [
matrix of nodes,
nodes in empty cells,
column sep = 15pt,
ampersand replacement = \&,
nodes = draw,
name prefix .. % ←
]{ \& \\};
\draw (mat-1-1) -- (mat-1-2);
}]
\pic (pre-) {test};
\end{tikzpicture}
\end{document}