我的对象包含多行文本,我想从特定行绘制指向另一个对象的箭头。如何为特定行创建锚点?
例如,如何在不使用的情况下绘制下面的红线yshift
?
\documentclass[letter]{article}
\usepackage{tikz}
\usetikzlibrary{positioning,calc}
\begin{document}
\begin{tikzpicture}
\node[align=left] (text)
{Hello\\
World!};
\draw[->] (1cm,1cm) -- (text.mid east);
\draw[->,red] (1cm,1cm) -- ([yshift=1.2em] text.mid east);
\end{tikzpicture}
\end{document}
答案1
tikzmark
\subnode
可能是最简单的方法。至少,这是我能想到的最简单的方法。
\documentclass[border=10pt,12pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{tikzmark}
\begin{document}
\begin{tikzpicture}[remember picture]
\node [align=left] (text)
{\subnode{a}{Hello}\\
World!};
\draw[->] (1cm,1cm) -- (text.mid east);
\draw[->,red] (1cm,1cm) -- (a -| text.east);
\end{tikzpicture}
\end{document}
答案2
多部分节点怎么样?
(参见第 726 页pgfman.pdf
)
我通过强调选项添加了边框draw
,如果您不想要框线,只需删除该线即可。
您可以向 传递两个参数style 2 args
(顾名思义)。我使用它来指定分割框的数量(#1
参数的rectangle split parts
)和文本的宽度(#2
参数的text width
)。
\documentclass[margin=2mm,tikz]{standalone}
\usetikzlibrary{shapes.multipart}
\begin{document}
\tikzset{
multinode/.style 2 args = {
draw,
rectangle split,
rectangle split parts=#1,
align=left,
text width=#2,
},
}
\begin{tikzpicture}[x=1cm,y=1cm]
\coordinate (ref) at (1.5cm,1.5cm);
\node[multinode={2}{4em}] (text)
{
\nodepart{one}
Hello
\nodepart{two}
World!
};
\draw[->] (ref) -- (text.one east);
\draw[->,red] (ref) -- (text.two east);
\end{tikzpicture}
\end{document}
结果:
编辑:
稍微不同的版本具有左对齐,而无需指定宽度,并且将具有空单元格的最小高度(只是稍微玩了一下)。
\documentclass[margin=2mm,tikz]{standalone}
\usetikzlibrary{shapes.multipart}
\begin{document}
\tikzset{
multinode/.style = {
draw,
rectangle split,
rectangle split parts=#1,
rectangle split empty part height=2ex,
rectangle split part align=left,
},
}
\begin{tikzpicture}[x=1cm,y=1cm]
\coordinate (ref) at (1.5cm,1.5cm);
\node[multinode=4] (text)
{
\nodepart{one}
Hello
\nodepart{two}
World!
\nodepart{three}
Again!
};
\draw[->] (ref) -- (text.one east);
\draw[->,red] (ref) -- (text.two east);
\draw[->,blue] (ref) -- (text.three east);
\end{tikzpicture}
\end{document}