这个 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
命名,给“别名”坐标命名。这样做是可行的,因为名称只需要定位链中的下一个元素,知道中心就足够了。然后:Bar
chain-3
chain-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}