实际上,我想要做的事情很简单,但我不知道该去哪里。
我有以下形式的多个节点
\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$
。我使用phantom
s 来保持文本之间的距离。
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
。它仍然需要两次编译,最终结果与之前基本相同。