![TikZ:矩阵中明确命名的节点在错误的位置提供锚点](https://linux22.com/image/350848/TikZ%EF%BC%9A%E7%9F%A9%E9%98%B5%E4%B8%AD%E6%98%8E%E7%A1%AE%E5%91%BD%E5%90%8D%E7%9A%84%E8%8A%82%E7%82%B9%E5%9C%A8%E9%94%99%E8%AF%AF%E7%9A%84%E4%BD%8D%E7%BD%AE%E6%8F%90%E4%BE%9B%E9%94%9A%E7%82%B9.png)
我已将\node
命令放入 TikZ 中matrix of nodes
。我知道这会破坏自动m-1-1
节点命名,但是当我明确给出节点名称时,锚点位于错误的位置。
完整代码:
\documentclass[tikz,border=10pt,a4paper]{standalone}
\usetikzlibrary{arrows,intersections,shapes,backgrounds,scopes,positioning,fit,matrix}
%% Language and font encodings
\usepackage[english]{babel}
\begin{document}
\tikzset{varname/.style={rectangle,thin,inner sep=0.3ex,font=\ttfamily,text height=1.5ex,text depth=0.35ex}}
\tikzset{vartype/.style={rectangle,text=red,thin,inner sep=0.3ex,font=\ttfamily,text height=1.5ex,text depth=0.35ex}}
\tikzset{struct/.style={draw,matrix of nodes,column 1/.style={anchor=base west},column 2/.style={anchor=base west}}}
\begin{tikzpicture}
\matrix[struct] (foo)
{
\node[varname] (age) {age}; & \node[vartype] {int*}; & \\
\node[varname] {height}; & \node[vartype] {float}; & \\
\node[varname] {weight}; & \node[vartype] {float}; & \\
};
\node[vartype] {Foo} [above=2ex of age.west,anchor=west];
\end{tikzpicture}
\end{document}
(我知道我不需要\node
此示例中的命令,但上述代码是占位符——完整代码需要在某些矩阵单元内进行非平凡绘图。)
节点Foo
出现在矩阵的中间,而不是其上方:
该(age)
节点正在被引用\node[vartype] {Foo} [above=2ex of age.west,anchor=west];
,但我所参考的所有实验somethingelse.west
都无法编译。
为什么Foo
节点出现在矩阵的中间?
答案1
我稍微改变了标签和括号的顺序。顺便说一句,我更喜欢 57.1 节点矩阵中的节点名称Tikz 手册(汽车)。
修改:
\matrix (foo) [struct]
代替
\matrix[struct] (foo)
和
\node[vartype,above=2ex of age.west,anchor=west] {Foo};
取代
\node[vartype] {Foo} [above=2ex of age.west,anchor=west];
。
梅威瑟:
\documentclass[tikz,border=10pt,a4paper]{standalone}
\usetikzlibrary{arrows,intersections,shapes,backgrounds,scopes,positioning,fit,matrix}
%% Language and font encodings
\usepackage[english]{babel}
\begin{document}
\tikzset{varname/.style={rectangle,thin,inner sep=0.3ex,font=\ttfamily,text height=1.5ex,text depth=0.35ex}}
\tikzset{vartype/.style={rectangle,text=red,thin,inner sep=0.3ex,font=\ttfamily,text height=1.5ex,text depth=0.35ex}}
\tikzset{struct/.style={draw,matrix of nodes,column 1/.style={anchor=base west},column 2/.style={anchor=base west}}}
\begin{tikzpicture}
\matrix (foo) [struct]
{
\node[varname] (age) {age}; & \node[vartype] {int*}; & \\
\node[varname] {height}; & \node[vartype] {float}; & \\
\node[varname] {weight}; & \node[vartype] {float}; & \\
};
\node[vartype,above=2ex of age.west,anchor=west] {Foo};
\end{tikzpicture}
\end{document}
答案2
第一个问题。您可以在节点矩阵中同时使用显式名称和自动名称。语法在第 646 页中进行了说明。|(age)|
将名称age
应用于节点以替换自动名称。所有其他节点将保留其自动名称。
实际上,该对|...|
专门用于更改节点属性。在栏内,您使用[...]
来表示选项,(...)
使用 来表示节点名称。例如,|[blue](age)|
将定义一个节点,用蓝色绘制,并命名为age
。
第二个问题:锚点松散。锚点是正确的,但你的语法不正确。
你写了
\node[vartype] {Foo} [above=2ex of age.west,anchor=west];
;%
节点内容后面的所有内容都将被忽略。(尝试使用behind 的同一行{Foo}
)
这就是错误。
您应该将所有选项(无论是否一起)与节点名称一起写,但全部都写在节点文本之前:
\node[vartype] (fooo) [above=2ex of age.west,anchor=west] {Foo};
\node[vartype, above=2ex of age.west,anchor=west] {Foo};
两种方法均可。
matrix of nodes
以下代码显示了如何使用(不带)键入示例\node...
。一个节点被标记 age
,所有其他节点都遵循foo-xx-xx
。并且作为名称混合的示例,在(age)
和之间画了一条线(foo-3-2)
。
\documentclass[tikz,border=10pt,a4paper]{standalone}
\usetikzlibrary{arrows, intersections, shapes, backgrounds,
scopes, positioning, fit, matrix}
%% Language and font encodings
\usepackage[english]{babel}
\begin{document}
\tikzset{%
varname/.style={rectangle, thin, inner sep=0.3ex,
font=\ttfamily, text height=1.5ex, text depth=0.35ex},
vartype/.style={rectangle, text=red, thin,
inner sep=0.3ex, font=\ttfamily, text height=1.5ex,
text depth=0.35ex},
struct/.style={draw, matrix of nodes,
column 1/.style={varname, anchor=base west},
column 2/.style={vartype, anchor=base west}}
}
\begin{tikzpicture}
\matrix[struct] (foo)
{
|(age)| age & int* \\
height & float \\
weight & float \\
};
\node[vartype, above=2ex of age.west, anchor=west] {Foo};
\node[vartype] (fooo) [draw=green, above=2ex of foo.north, anchor=west] {Foo};
\draw (age) -- (foo-3-2);
\end{tikzpicture}
\end{document}