是否可以在 Latex 文档中的字母(数字)之间绘制 tikz 弧(箭头)?如果可以,那么如何定义节点?
答案1
在页面中已排版的文本上添加图形的一般方法是使用 TikZremember picture
和overlay
选项。可以在兴趣点旁边放置一个不可见的 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
。