如何在 tikz 中的箭头右侧和左侧添加标签

如何在 tikz 中的箭头右侧和左侧添加标签

我有以下代码,我想在边缘的左侧和右侧添加标签。该怎么做?

\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}

图像如下所示:这 这里字母 b 略低于字母 a,如何解决这个问题?

答案1

PGF/TikZ 将节点的内容紧密地打包在一个盒子中,然后将该盒子放在节点的中心,周围有一些填充(inner xsepinner 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

这将为 PGF/TikZ 使用的框添加所需的高度:
在此处输入图片描述

还有其他方法更改垂直尺寸节点框,即键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}

相关内容