字母或数字作为 tikz 节点

字母或数字作为 tikz 节点

是否可以在 Latex 文档中的字母(数字)之间绘制 tikz 弧(箭头)?如果可以,那么如何定义节点?

答案1

在页面中已排版的文本上添加图形的一般方法是使用 TikZremember pictureoverlay选项。可以在兴趣点旁边放置一个不可见的 tikz 节点,以便该点获得一个名称,然后另一个 tikzpicture 在这些节点之间绘制连接。

Andrew Stacey 有这个想法,即添加不可见的节点来标记页面上的点,称之为“tizkmarks”,并写道蒂克兹马克包裹。

在您的情况下,由于您的目标是在代码列表之上绘图(如问题后的评论所表达的),它会变得有点复杂,因为在列表环境中您无法输入乳胶命令(因此\tikzmark)而不以某种方式转义它们。

根据您在代码清单中使用的语言,一种简单的方法可能是使用选项mathescape,它允许使用清单内的美元符号转为数学模式。进入数学模式后,您可以使用\tikzmark。但是,如果您的清单是 PHP 或 Perl 脚本,其中美元符号经常出现,则这种方法无效。您可以使用escapechar选择另一个特殊字符来转为 latex。

下面的示例使用mathescape在列表中输入乳胶,并放置 tikz 标记,然后,在列表之后,tikzpicture在这些标记之间绘制一个弯曲的箭头。

\documentclass{article}
\usepackage{tikz}
\usepackage{listings}
\newcommand{\tikzmark}[1]{%
  \tikz[overlay,remember picture] \coordinate (#1) {};}
\begin{document}

\lstset{
    basicstyle=\ttfamily,
    keywordstyle=\color[rgb]{0.13,0.29,0.53}\bfseries,
    stringstyle=\color[rgb]{0.31,0.60,0.02},
    commentstyle=\color[rgb]{0.56,0.35,0.01}\itshape,
    backgroundcolor=\color[RGB]{248,248,248},
    showspaces=false,
    showstringspaces=false,
    linewidth=\textwidth,
    basewidth=0.5em,
    mathescape,
}

\begin{lstlisting}[language=C]
int main(int argc, char *argv[])
{
  char who="world";

  printf("Hello %$\tikzmark{s}$s\n", who$\tikzmark{who}$);
  return 0;
}
\end{lstlisting}
\begin{tikzpicture}[remember picture, overlay]
  \draw[red, ->, shorten >=5pt, shorten <=5pt] 
        (who) to[bend left] node[midway, below] {replaces} (s);
\end{tikzpicture}

\end{document}

结果如下:

结果

请注意,如果列表位于浮点数内,则此方法可能会失败,因为这可能导致列表出现在与注释箭头不同的页面中。在这种情况下,您必须将 放在与tikzpicture列表相同的浮点数内。这将需要使用escapeinside选项来listings定义两个字符来分隔环境内的乳胶代码块lstlistings

相关内容