使用 TikZ 的带有指针和注释的简单(执行)堆栈

使用 TikZ 的带有指针和注释的简单(执行)堆栈

我正在寻找一种绘制堆栈的简单方法。我知道抽签堆栈。我其实很喜欢这个包生成的堆栈,但是大小太大了,因为我在论文中使用 IEEEtran。堆栈应该占用尽可能少的空间(即适合文本大小)。这个答案产生了所需的结果,但我正在寻找一种方法来另外绘制指针和注释(参见小样下面)。我对 TikZ 完全陌生,因此不知道如何实现这一点。

在此处输入图片描述

答案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

相关内容