tikz 中节点相对于边的定位

tikz 中节点相对于边的定位

早些时候我问过问题关于用箭头标记图形边缘的问题。Zarko 提出了一个解决方案,精简到最小,如下所示:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning}
\usepackage{mathtools}
\begin{document}
\begin{tikzpicture}
\node (A) at (0,0) {A};
\node (B) at (1,1.5) {B};
\draw (B) --  node[sloped,above] {$\xleftarrow{2}$}  (A);
\end{tikzpicture}
\end{document}

结果如下:

在此处输入图片描述

在我所做的事情的背景下,它看起来很棒,但我不喜欢数字倾斜的方式 - 我希望它被放置在原来的位置,但要直立,就像这样:

在此处输入图片描述

我认为我可以通过定义一个具有更大outer sep且不具有sloped修饰符的第二个节点来做到这一点,如下所示:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}
\node (A) at (0,0) {A};
\node (B) at (1,1.5) {B};
\draw (B) --  node[sloped,above] {$\leftarrow$} node[above,outer sep=6pt] {\scriptsize{2}}  (A);
\end{tikzpicture}
\end{document}

但是,如您所见,这并没有将数字放在我想要的位置,因为它实际上位于线的中点上方,而不是相对于其斜率的“上方”:

在此处输入图片描述

有没有办法可以像倾斜一样定位节点(即沿着垂直于边缘的线移动一定距离),而节点的内容不会倾斜?或者有其他方法可以实现我想要的效果?

答案1

您可以使用空的倾斜节点来获取正确的位置,然后使用该节点的中心锚点来放置所需的非倾斜节点。

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}
\node (A) at (0,0) {A};
\node (B) at (1,1.5) {B};
\draw (B) --  node[sloped,above] {$\leftarrow$} node[sloped,above,outer sep=9pt] (x) {} (A);
\node at (x) {\scriptsize{2}};
\end{tikzpicture}
\end{document}

结果

但是,位置看起来不太正确,因此您可能需要手动稍微移动一下节点位置。

答案2

好吧,我回答的第二个解决方案(您提供链接)可以细化如下:

在此处输入图片描述

我更改了箭头的大小和尖端pic以及它们与添加路径的距离,并为最常见的pic类型添加了默认值。对于此解决方案,TikZ 库arrows.meta不再是必需的。

\documentclass[tikz,border=3mm]{standalone}
    \usetikzlibrary{chains,positioning}

\begin{document}
\begin{tikzpicture}[
    start chain = A going right,
pics/AB/.style args = {#1/#2/#3}{code={
    \draw[solid,thin,->]
        (-2mm,#1 1.5mm) -- node [#2,font=\footnotesize,inner sep=1pt] {#3} ++ (4mm,0mm);}
                            },
pics/AB/.default=/left/1,
pics/BA/.style args = {#1/#2/#3}{code={
    \draw[solid,thin,<-]
        (-2mm,#1 1.5mm) -- node [#2,font=\footnotesize,inner sep=1pt] {#3} ++ (4mm,0mm);}
                            },
                    ]
    \begin{scope}[every node/.style={circle, draw, minimum size=1.5em,
                                     inner sep=2pt, on chain}]
\foreach \i in {1,...,5} \node {};
%
\node (B-1) [below=of A-2] {A};
\node (B-2) [below=of A-4] {B};
    \end{scope}
    \begin{scope}[sloped]
\draw[densely dotted, thick]
                (A-1) -- (A-2)
                (A-2) -- pic {BA=/above/1} (A-3)
                (A-3) -- (A-4)
                (A-4) -- pic {AB=/above/1} (A-5);
\draw[thick]    (B-1) -- pic {AB} (A-2)
                (B-1) -- pic {AB=-/below right/1} (A-3)
%
                (B-2) -- pic {BA=-/below left/1} (A-3)
                (B-2) -- pic {AB} (A-4)
                ;
%
\draw[double]   (A-1) --  (B-1)
                (A-5) -- pic {BA=-/below right/2} (B-2);
    \end{scope}
\end{tikzpicture}
\end{document}

答案3

新节点的坐标node是相对于主箭头的,而不是相对于 的node。因此,一种方法是将 应用于shift新节点:

在此处输入图片描述

代码:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}
\node (A) at (0,0) {A};
\node (B) at (1,1.5) {B};
\draw (B) --  node[sloped,above] {$\leftarrow$} node[shift={(-0.8em,2.1ex)}] {\scriptsize{2}}  (A);
\end{tikzpicture}
\end{document}

相关内容