为什么 TikZ 中的图片前缀不适用于矩阵单元名称?

为什么 TikZ 中的图片前缀不适用于矩阵单元名称?

当我有一张其代码包含矩阵的图片时,当我为该图片使用名称前缀时,事情不起作用:

\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其内容。这样,matpic 中命名的节点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)| \\}节点,而不是/ 。abpre-apre-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}

相关内容