自动调整长标签边缘的大小

自动调整长标签边缘的大小

我想知道是否有办法在标签较长时自动调整边缘的大小。例如,以下代码

\documentclass[10pt]{article}
\usepackage{tikz}
\usetikzlibrary{positioning}
\begin{document}

\begin{tikzpicture}
   \node (a) [draw] {a};
   \node (b) [draw, right=of a] {b};
   \node (c) [draw, below right=of b] {c};
   \draw [-stealth] (a) -- node[above]{\scriptsize very long label} (b);
   \draw [-stealth] (b) -- node[below,sloped]{\scriptsize another long label} (c);
\end{tikzpicture}

\end{document}

产生的标签比相应箭头更长:

结果图

我想知道是否有办法自动调整每条边的大小,以便其标签适合(不太松散)在边的端点之间。我想独立于标签的长度来执行此操作。特别是,我不想手动将节点之间的间隔设置为特定的数值距离(例如 2 英寸)。

这个问题可以很容易地转化为其他绘图包/程序。我还想知道是否有可能在 metapost 中实现类似的机制。

编辑:我添加了一个非水平箭头来概括问题,并更好地反映我的意图。

答案1

我认为这是其中一种解决方案,有多种解决方案,从“嗯,它有效!”到真正优雅的解决方案。这是前一种类型的解决方案之一。

\documentclass{standalone}
% \url{http://tex.stackexchange.com/questions/20693}
\usepackage{tikz}
\usetikzlibrary{shapes.multipart}

\tikzset{%
  xrightarrow/.style={
    rectangle split,
    anchor=text split west,
    rectangle split parts=2,
    append after command={%
      (\tikzlastnode.text split west) edge[->] (\tikzlastnode.text split east)
    }
  }
}

\begin{document}
\begin{tikzpicture}[>=stealth]
\node[draw] (a) {a};
\node[xrightarrow] at (a.east) (c) {a very long label \nodepart{two}{and some text underneath}};
\node[draw,anchor=west] (b) at (c.text split east) {b};
\node[xrightarrow,rotate=-45] at (b.south east) (d) {a very long label \nodepart{two}{and some text underneath}};
\node[draw,anchor=north west] (e) at (d.text split east) {c};
\end{tikzpicture}
\end{document}

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{shapes.multipart}

\tikzset{%
  xrightarrow/.style={
    rectangle split,
    anchor=text split west,
    rectangle split parts=2,
    append after command={%
      (\tikzlastnode.text split west) edge[->] (\tikzlastnode.text split east)
    }
  }
}

\begin{document}
\begin{tikzpicture}
\node[draw] (a) {a};
\node[xrightarrow] at (a.east) (c) {a very long label \nodepart{two}{and some text underneath}};
\node[draw,anchor=west] (b) at (c.text split east) {b};
\end{tikzpicture}
\end{document}

结果:

带节点的 xrightarrow

我使用rectangle split形状,这样我们就可以轻松地将文本放在顶部和下方,并使文本很好地居中在箭头上。理想情况下,箭头将是节点形状本身的一部分,但这需要定义一个新的节点形状(我现在太懒了!)。为了解决这个问题,我们用绘制箭头来append after command隐藏它对“用户”。询问(在评论中)扩展时应该发生什么的原因完全取决于绘制事物的顺序。这里,a首先是,然后是边缘,最后是b。要同时拥有ab移动,则先绘制边缘,然后定位ab在其末端。

(人们还可以多玩一会儿,让箭头上的文字自动以较小的字体排版。)

答案2

没有 tikz 也一样

\documentclass{standalone}
\usepackage{amsmath}
\newcommand\foo[4][]{%
  $\fbox{#3}\kern-1pt{\xrightarrow[\text{#1}]{\text{#2}}}\kern-1pt\fbox{#4}$}
\begin{document}

\foo[and some text underneath]{a very long label two}{a}{b}

\end{document}

在此处输入图片描述

相关内容