我有以下代码,我想在边缘的左侧和右侧添加标签。该怎么做?
\begin{tikzpicture}[
n1/.style={circle, draw=black!60, fill=black!5, very thick, minimum size=1mm},
]
%Nodes
\node[n1] (Susceptible) {p};
\node[n1] (Infectious) [below=of Susceptible] {q};
%Lines
\draw[->, very thick] (Susceptible.south) to node[right] {$a$} node[left] {$b$} (Infectious.north);
\end{tikzpicture}
答案1
PGF/TikZ 将节点的内容紧密地打包在一个盒子中,然后将该盒子放在节点的中心,周围有一些填充(inner xsep
和inner ysep
)。
使用left
和 ,right
您可以隐式指定锚点east
和 ,west
它们分别是放置的锚点。正如您在rectangle
形状的“定义”,这些锚点垂直居中。
如果我们显示这些节点的边界并连接它们的中心,您会发现它们位于同一高度:
你要么需要使用相对于基线固定的锚点(基地西部,基地东部,基地,中西部,中东,中部,文本),即此处mid right
(用于锚点mid east
)和mid left
(用于锚点mid west
)
\draw[->, very thick]
(Susceptible) to node[mid right] {$a$} node[mid left] {$b$} (Infectious);
或者你需要让节点具有相同的垂直高度。
在这个简单的例子中,您只需添加\vphantom{b}
,即
\draw[->, very thick]
(Susceptible) to node[right] {$\vphantom{b}a$} node[left] {$b$} (Infectious);
这将添加一条具有 垂直尺寸的隐形线b
。
还有其他方法更改垂直尺寸节点框,即键text height
(基线以上的部分)和text depth
(基线以下的部分)。
你可以说
\draw[->, very thick, text height=height("b")]
(Susceptible) to node[right] (a) {$a$} node[left] (b) {$b$} (Infectious);
这将使两个节点的高度均为b
,而不管它们的实际内容如何。这几乎与\vphantom{b}
但是\vphantom
基本上是“最小文本高度”(和深度)。
如果你经常遇到两个节点并排放置在垂直线上的情况,你可以定义自己的自定义样式来自动执行其中一些操作,比如
two edge nodes vertical/.style 2 args={
edge node={node[mid left]{$#1$}node[mid right]{$#2$}}}
% or
two edge nodes vertical/.style 2 args={
edge node={node[left]{$\vphantom{#2}#1$} node[right]{$\vphantom{#1}#2$}}}
然后你就做
\draw[->, very thick] (Susceptible) to[two edge nodes vertical={a}{b}] (Infectious);
请注意,我已从您的线中删除了北和南的明确锚点,因为 TikZ 仅在其边界上自动连接节点。
这也适用于非垂直线上的其他锚点/位置,但除非节点在尺寸上有很大差异,否则这种情况不会那么明显。
代码
\documentclass[tikz]{standalone}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}[
n1/.style={circle, draw=black!60, fill=black!5, very thick, minimum size=1mm},
% mid anchors
two edge nodes vertical/.style 2 args={
edge node={node[mid left]{$#1$} node[mid right]{$#2$}}},
% vphantoms
two edge nodes vertical/.style 2 args={
edge node={node[left]{$\vphantom{#2}#1$} node[right]{$\vphantom{#1}#2$}}}
]
%Nodes
\node[n1] (Susceptible) {p};
\node[n1] (Infectious) [below=of Susceptible] {q};
%Lines
\draw[->, very thick] (Susceptible) to[two edge nodes vertical={a}{b}] (Infectious);
\end{tikzpicture}
\end{document}