Tikz 中边缘标签的相对定位

Tikz 中边缘标签的相对定位

我有一张图,其中多条边的起点和终点都相同(可能角度不同)。我想将边标签放置在相同的 y 高度。

例子:

\documentclass[a4paper]{article}

\usepackage{tikz}
\usetikzlibrary{arrows,automata}

\begin{document}

\tikz{
 \node[draw,circle,minimum size=5mm] (a1) at (0,0) {};
 \node[draw,circle,minimum size=5mm] (a2) at (1,0) {};
 \node[draw,circle,minimum size=5mm] (b1) at (1,-3) {};
 \node[draw,circle,minimum size=5mm] (b2) at (3,-5) {};
 \draw (a1) to node [auto,near start] {1} (b1);
 \draw (a2) to node [auto,very near start] {2} (b2);
}

\end{document}

输出:

生成的输出

如您所见,标签“1”和“2”不在同一高度。有没有办法将标签“2”定位在与“1”完全相同的 y 坐标上?(x 坐标应该由边缘本身决定)

我想保持边和标签之间的连接,这样即使边的端点(这里是 b1 和 b2)移动,标签也会随之移动。

答案1

在这里,我创建了一个宏\addfig,绘制两个相互连接的圆圈,并\labelht在预先指定的高程 y=- 处放置一个标签。它 \addfig接受四个参数:

1)用于创建节点名称的唯一标识符,

2) 顶部圆的 x 坐标(假设 y=0),

3) 底部圆的 x 坐标,

4) 底部圆的 y 坐标。

重复调用该宏\addfig,因为需要的段数越多。更改的值\labelht将自动调整该高度的标签位置,以考虑线条的斜率(试试看!)。

该解决方案的优点是可以自动计算每个标签的位置。

\documentclass[a4paper]{article}
\usepackage{tikz}
\usetikzlibrary{arrows,automata}
\usepackage{stackengine}
\newcommand\addfig[4]{% {index}{x0}{x1}{y1}
 \node[draw,circle,minimum size=5mm] (a#1) at (#2,0) {};
 \node[draw,circle,minimum size=5mm] (b#1) at (#3,-#4) {};
 \node (c#1) at (#2+#3/#4*\labelht-#2/#4*\labelht+.25,-\labelht) {#1};
 \draw (a#1) to node [auto,near start] {} (b#1);
}
\begin{document}
\def\labelht{0.7}
\tikz{
 \addfig{1}{0}{1}{3}
 \addfig{2}{1}{3}{5}
 \addfig{3}{2}{4}{4.5}
 \addfig{4}{4}{6}{5.5}
}%
\end{document}

在此处输入图片描述


我最初的解决方案是将标签堆叠到成品图片中。缺点是必须单独计算或根据经验确定标签位置。

如果 中没有解决方案tikz,则始终可以将标签插入现有图像的顶部。 s\stackinset可以嵌套,如图所示。lt参数表示插入距离是相对于图像的左上角计算的。

\documentclass[a4paper]{article}
\usepackage{tikz}
\usetikzlibrary{arrows,automata}
\usepackage{stackengine}
\begin{document}
\stackinset{l}{0.70cm}{t}{0.75cm}{1}{%
\stackinset{l}{1.70cm}{t}{0.75cm}{2}{%
\stackinset{l}{2.70cm}{t}{0.75cm}{3}{%
\tikz{
 \node[draw,circle,minimum size=5mm] (a1) at (0,0) {};
 \node[draw,circle,minimum size=5mm] (a2) at (1,0) {};
 \node[draw,circle,minimum size=5mm] (b1) at (1,-3) {};
 \node[draw,circle,minimum size=5mm] (b2) at (3,-5) {};
 \draw (a1) to node [auto,near start] {} (b1);
 \draw (a2) to node [auto,very near start] {} (b2);
}%
}}}
\end{document}

在此处输入图片描述

答案2

使用positioning库:

\documentclass[a4paper]{article}

\usepackage{tikz}
\usetikzlibrary{arrows,automata,positioning}

\begin{document}

\begin{tikzpicture}
 \node[draw,circle,minimum size=5mm] (a1) at (0,0) {};
 \node[draw,circle,minimum size=5mm] (a2) at (1,0) {};
 \node[draw,circle,minimum size=5mm] (b1) at (1,-3) {};
 \node[draw,circle,minimum size=5mm] (b2) at (3,-5) {};
 \draw (a1) to node [auto,near start] (1) {1} (b1);
 \draw (a2) to  (b2);
 \node [right=0.6cm of 1] {2};    %%% draw here
\end{tikzpicture}

\end{document}

在此处输入图片描述

相关内容