我有一张图,其中多条边的起点和终点都相同(可能角度不同)。我想将边标签放置在相同的 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
可以嵌套,如图所示。l
和t
参数表示插入距离是相对于图像的左上角计算的。
\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}