答案1
使用 tikz\matrix
和本答案后面定义的一些样式,您可以像这样编码堆栈:
\begin{tikzpicture}
\matrix [memory] {
& n/sh \\
& |(bi)| //bi \\
& |(cmd)| cmd \\
blub & |(sys)| \&system \\
};
\node[pointer, right=2ex of sys] (esp) {esp};
\draw[->] (esp) -- (sys);
\draw[->] (cmd.east) to[out=-10,in=10] (bi.east);
\end{tikzpicture}
注意语法是多么简单。堆栈基本上是一个有两列的矩阵。第一列用于标签或地址,第二列用于内容。每个单元格都可以使用语法来命名|(name)|
。这些名称稍后可用于绘制箭头、指针等。结果是:
您还可以为其赋予其他属性。例如,将|[!!]|
其放入单元格中会将其标记为重要,并突出显示。您可以将单元格标记为以|[break above]|
获得波浪边框,以表明记忆仍在继续。如以下示例所示:
\begin{tikzpicture}
\matrix [memory] {
& |[break above]| \ldots \\
& n/sh \\
& |(bi)| //bi \\
& |(cmd)| cmd \\
blub & |[!!] (sys)| \&system \\
};
\node[pointer, right=2ex of sys] (esp) {esp};
\draw[->] (esp) -- (sys);
\draw[->] (cmd.east) to[out=-10,in=10] (bi.east);
\end{tikzpicture}
其结果为:
现在,定义这些样式的承诺代码:
\usetikzlibrary{shapes.symbols,matrix, positioning}
\tikzset{
memory/.style={
matrix of nodes, name=M,
every node/.append style={
font=\tt, outer xsep=.4ex,
anchor=base},
column 2/.append style={
every node/.append style=
{draw,fill=white,
minimum width=#1,
minimum height=1.5em}
},
row sep=-.4pt,
},
memory/.default=1.6cm,
break above/.style={shape=tape, tape bend top=in and out, tape bend bottom=none},
break below/.style={shape=tape, tape bend top=none, tape bend bottom=in and out},
!!/.style={fill=green!20},
pointer/.style = {font=\tt, anchor=base, inner sep=2pt},
}
请注意,样式memory
接受一个参数,即每个单元格的最小宽度。然后您可以写\matrix[memory=1cm]
例如。默认值为1.6cm
。但请注意,较宽的单元格将使用所需的宽度,从而“破坏”图形的同质性。如果您有宽单元格,则必须将参数的值调整memory
为该宽单元格的宽度。
答案2
这是你想要的吗?
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{shapes.multipart,calc}
\begin{document}
% From Alan Munn's answer http://tex.stackexchange.com/a/26373/18228
\begin{tikzpicture}[stack/.style={rectangle split, rectangle split parts=#1,draw, anchor=center}]
\node(s)[stack=4] {
n/sh % text
\nodepart{two} //bi % two
\nodepart{three} cmd % three
\nodepart{four} \&system % four
};
% Adding comments and pointers
\node[left=8pt] at (s.four west){blub};
\draw[<-,>=stealth](s.four east)--+(15pt,0) node[anchor=mid west]{esp};
\draw[->,>=stealth](s.three east) .. controls ($(s.two split)+(40pt,-5pt)$)
and ($(s.two split)+(40pt,5pt)$) .. (s.two east);
\end{tikzpicture}
\end{document}
解释
该键stack
定义一个多部分节点,它具有几个预定义的锚点,如下图所示,来自 TikZ/PGF 手册:
\draw
现在您需要做的就是使用TikZ将您的评论和指针放置在相对于正确锚点的位置\node
。