TikZ:矩阵中明确命名的节点在错误的位置提供锚点

TikZ:矩阵中明确命名的节点在错误的位置提供锚点

我已将\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}

在此处输入图片描述

相关内容