我需要使用 TikZ 绘制两个水平间隔的节点,以及它们之间的箭头,并用一些文本标记。但箭头的长度必须恰好适合文本,这将是宏的一部分,可以使用长度高度可变的文本调用该宏。问题是,在我绘制箭头并标记它之前,我不知道文本的宽度,但我必须先放置节点,然后才能绘制箭头。TikZ 一定有解决方案 - 有什么想法吗?
编辑:目的是让箭头直达两个节点,这样它显然是从第一个节点“指向”第二个节点,并且箭头的长度刚好足以容纳标签所需的文本。因此,文本越多,箭头越长,节点之间的距离越远;文本越少,节点之间的距离越近。
答案1
您可以测量文本的宽度(另请参阅如何在 TikZ 环境中使用 hbox 进行文本尺寸测量?)并使用该值来定位节点:
\documentclass{article}
\usepackage{tikz}
\newlength{\mylabelwidth}
\begin{document}
\begin{tikzpicture}
\node[draw] (A) {A};
\settowidth{\mylabelwidth}{\pgfinterruptpicture some label \endpgfinterruptpicture}
\node[draw,right] (B) at ([xshift=\mylabelwidth+10pt]A.east) {B};
\draw[->] (A) --(B) node [midway,above] {some label};
\end{tikzpicture}
\end{document}
另外,您可以将箭头标签放置为正常的、正确对齐的节点,然后绘制相对于它箭头和其他节点:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\node[draw](A) {A};
% The distance between the arrow and the nodes is defined by the `inner ysep` and `innser xsep` values, respectively:
\node[inner ysep=2.5pt,inner xsep=5pt,above right] (ABlabel) at (A.east) {some label};
\node[draw,right] (B) at (ABlabel.south east) {B};
\draw[->] (A) --(B);
\end{tikzpicture}
\end{document}
两者都导致相同的结果:
答案2
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\node[draw](A) {A};
\node[draw](B) at (8,0) {B};
\node[inner sep =0pt] (C) at ($(A)!.5!(B)+(0,1ex)$) {my label};
\draw[->] ($(C.south west)+(0,-1ex)$) --($(C.south east)+(0,-1ex)$);
\end{tikzpicture}
\end{document}
2)使用宏,但我不确定我是否正确理解了这个问题
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\newcommand{\addarrow}[3]{%
\path ($(#1)+(0,1ex)$)--($(#2)+(0,1ex)$) node[inner sep=0pt,sloped,pos=.5](tmp){#3};
\draw[->] ($(tmp.south west)+(0,-1ex)$) --($(tmp.south east)+(0,-1ex)$);
}
\begin{tikzpicture}
\node[draw](A) {A};
\node[draw](B) at (8,3) {B};
\addarrow{A}{B}{a very very long label}
\end{tikzpicture}
\end{document}