tikz 节点内单词之间的小 tikz 装饰箭头

tikz 节点内单词之间的小 tikz 装饰箭头

实际上,我想要做的事情很简单,但我不知道该去哪里。

我有以下形式的多个节点

\node (1) at (0,0) {text1 $\rightarrow$ text2};
\node (2) at (0,2) {text2 $\rightarrow$ text3};
\node (3) at (0,4) {text3 $\rightarrow$ text4};

我想用带有特定装饰箭头的 tikz 箭头替换文本箭头 ($\rightarrow$)。但是,我不想在每种情况下都指定这些箭头的起点和终点。有没有办法说

XXXXXXa (arrow from a.right where a is a character of text, to b.left, where b is also a text character) bXXXXXX

并进一步在文本中对节点执行此操作?然后我可以将此节点移动到任意位置,并且箭头停留在我的两个文本单词之间。

我一直在研究嵌套的 tikzenvironments,但这似乎是一种不好的做法,所以希望还有其他方法。

答案1

您可以定义一个宏来进行绘图:

在此处输入图片描述

笔记:

  • 箭头的长度由 决定,\ArrowLength因此可以全局设置,也可以使用 进行本地更改\renewcommand{\ArrowLength}{<length>}

代码:

\documentclass{article}
\usepackage{tikz}

\newcommand*{\ArrowLength}{2.0em}%
\newcommand*{\MyRightArrow}[1][]{%
    \tikz [-stealth, red, yshift=0.5ex, baseline] 
        \draw [-stealth, #1] (0,0) -- (\ArrowLength,0) ;
}%

\begin{document}
\begin{tikzpicture}
    \node (1) at (0,0) {text1 \MyRightArrow text2};
    \node (2) at (0,1) {text2 \MyRightArrow[blue]text3};
    \node (3) at (0,2) {text3 \MyRightArrow[red, densely dashed]text4};
\end{tikzpicture}
\end{document}

答案2

您可以使用tikzmarks

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{tikzmark}

\begin{document}
   \begin{tikzpicture}[remember picture, myarrow/.style={->,yshift=.3em,shorten <=3pt,shorten >=3pt}]

     \node (1) at (0,0) {text1\tikzmark{t1} \phantom{$\rightarrow$} \tikzmark{t2}text2};
     \draw[myarrow](pic cs:t1)--(pic cs:t2);

     \node (2) at (0,2) {text3\tikzmark{t3} \phantom{$\rightarrow$} \tikzmark{t4}text4};
     \draw[myarrow](pic cs:t3)--(pic cs:t4);

     \node (3) at (0,4) {text5 $\rightarrow$ text6};
   \end{tikzpicture}
\end{document}

在此处输入图片描述

myarrow需要运行两次才能将箭头绘制到正确的位置。如果想使箭头与 完全相同,可以进一步调整箭头的样式(在 mwe 中) $\rightarrow$。我使用phantoms 来保持文本之间的距离。

tcolorbox 解决方案

tcolorbox另一种可能性是在您想要连接的节点内部的文本周围加载并绘制一个不可见的框:

\documentclass{article}
\usepackage{tcolorbox}
\tcbuselibrary{skins}

\newtcbox{mybox}[1]{
    enhanced jigsaw,
    size=minimal,
    on line,
    opacityback=0,
    opacityframe=0,
    remember as=#1,
}


\begin{document}
   \begin{tikzpicture}[remember picture,myarrow/.style={->,shorten <=3pt,shorten >=3pt}]

    \node (1) at (0,0) {\mybox{b1}{text1} \phantom{$\rightarrow$} \mybox{b2}{text2}};
    \draw[myarrow](b1.east)--(b2.west);
   \end{tikzpicture}
\end{document}

当您将文本框起来后,您可以使用标准节点锚点(北、南等)连接这些框,就像它是节点内的节点一样。这样就无需调整箭头的 xshift,因为您可以将其锚定到box.east。它仍然需要两次编译,最终结果与之前基本相同。

相关内容