TikZ:根据文本宽度定位节点?

TikZ:根据文本宽度定位节点?

我需要使用 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}

在此处输入图片描述

相关内容