更新的解决方案

更新的解决方案

这个 TeX.sx 问题询问是否可以沿链使用 TikZ 矩阵。尝试这样做时发生的错误是Package pgf Error: No shape named chain-3 is known.,避免该错误的一种方法是手动为矩阵节点指定该名称。

如果该节点已经使用了在使其成为矩阵之前指定的名称,则可能想给它一个别名,如下所示:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning,chains,matrix}
\begin{document}
\begin{tikzpicture}[start chain]
  \node [on chain] {XYZ};
  \node [on chain,alias=Foo] {123};
  \node [on chain,matrix of nodes,alias=Bar]  (chain-3) {    A \\    B \\    C \\  };
  \node [on chain] {$\alpha\beta\gamma$};
  \fill (Foo) circle (2pt);
  \fill (Bar) circle (2pt);
\end{tikzpicture}
\end{document}

唉,这不起作用,因为矩阵节点似乎只是忽略了别名选项——这可能解释了为什么它们chain-i在链中使用时无法获得名称。

有没有办法给出matrix node一个alias注意:我使用的是 PGF 2.10 版,这是相当新的版本。如果此行为在后续版本中得到修复,请告诉我。

梅威瑟:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix}
\begin{document}
\begin{tikzpicture}
  \node [alias=Foo] (regularnode) {123};
  \node [matrix of nodes,alias=Bar] (matrixnode) {A\\B\\C\\};
  \fill (Foo) circle (2pt);
  \fill (Bar) circle (2pt);
\end{tikzpicture}
\end{document}

Foo这对于(常规节点)来说非常有效,但最后一条\fill命令给出了ERROR: Package pgf Error: No shape named Bar is known.

答案1

更新的解决方案

一个更通用的解决方案,定义matrix on chain样式来修复链上矩阵的命名错误(结果与下面相同)。

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{positioning,chains,matrix,fit}
\tikzset{
  matrix on chain/.style={
    on chain=#1,
    append after command={
      \pgfextra{\node[fit=(\tikzlastnode),inner sep=0] (\tikzchaincurrent){};}
    },
  },
}
\begin{document}
\begin{tikzpicture}[start chain=foo going below,start chain=bar going right]
  \node [on chain] {ooo};
  \node [on chain, alias=Foobar] {123};
  \node [matrix on chain, matrix of nodes,name=Bar] {A\\B\\C\\};
  \node [on chain] {$\alpha\beta\gamma$};
  \node [on chain=foo] {XXX};
  \node [matrix on chain=foo,matrix of nodes,name=Foo] {A\\B\\C\\};
  \node [on chain=foo] {XXX};
  \node [on chain] {$\alpha\beta\gamma$};
  \fill[red] (Foo) circle (2pt);
  \fill[red] (Bar) circle (2pt);
  \fill[blue] (Bar-1-1) circle (2pt);
  \draw[green!50!black] (Bar.south west) -- (Bar.south east);
  \draw[red!50!black,very thick] (Foo.south west) -- (Foo.south east);
\end{tikzpicture}
\end{document}

第一个解决方案

这是一个解决方案(混合JLDiaz 的回答percusse 的评论和我的想法)自动使用fit库(使用两个链进行测试的示例更加复杂)。

在此处输入图片描述

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{positioning,chains,matrix,fit}
\tikzset{
  chainalias/.style={name=#1,append after command={
      \pgfextra{\node[fit=(\tikzlastnode),inner sep=0] (\tikzchaincurrent){};}
    },
  },
}
\begin{document}
\begin{tikzpicture}[start chain=foo going below,start chain=bar going right]
  \node [on chain] {ooo};
  \node [on chain, alias=Foo] {123};
  \node [on chain, matrix of nodes,chainalias=Bar] {A\\B\\C\\};
  \node [on chain] {$\alpha\beta\gamma$};
  \node [on chain=foo] {XXX};
  \node [on chain=foo, matrix of nodes,chainalias=Foo] {A\\B\\C\\};
  \node [on chain=foo] {XXX};
  \node [on chain] {$\alpha\beta\gamma$};
  \fill[red] (Foo) circle (2pt);
  \fill[red] (Bar) circle (2pt);
  \fill[blue] (Bar-1-1) circle (2pt);
  \draw[green!50!black] (Bar.south west) -- (Bar.south east);
  \draw[red!50!black,thick] (Foo.south west) -- (Foo.south east);
\end{tikzpicture}
\end{document}

答案2

一个愚蠢的想法:

\documentclass{article}
\usepackage{tikz}
\begin{document}
\thispagestyle{empty}
\usetikzlibrary{positioning,chains,matrix}
\begin{tikzpicture}[
  start chain
]
  \node [on chain] {XYZ};
  \node [on chain, alias=Foo] {123};
  \node [on chain, matrix of nodes ] (chain-3) {  A \\    B \\    C \\  };
  \coordinate (Bar) at (chain-3);
  \node [on chain] {$\alpha\beta\gamma$};
  \fill[red] (Foo) circle (2pt);
  \fill[red] (Bar) circle (2pt);
\end{tikzpicture}
\end{document}
\end{tikzpicture}
\end{document}

结果

更新:由于 OP 要求能够访问锚点,所以我又想出了一个愚蠢的想法:给矩阵Bar命名,给“别名”坐标命名。这样做是可行的,因为名称只需要定位链中的下一个元素,知道中心就足够了。然后:Barchain-3chain-3

\begin{tikzpicture}[
  start chain
]
  \node [on chain] {XYZ};
  \node [on chain, alias=Foo] {123};
  \node [on chain, matrix of nodes ] (Bar) {  A \\    B \\    C \\  };
  \coordinate (chain-3) at (Bar);
  \node [on chain] {$\alpha\beta\gamma$};
  \fill[red] (Foo) circle (2pt);
  \fill[red] (Bar) circle (2pt);
  \fill[blue] (Bar-1-1) circle (2pt);
  \draw[green!50!black] (Bar.south west) -- (Bar.south east);
\end{tikzpicture}

结果

相关内容