TikZ:使用不同锚点进行定位

TikZ:使用不同锚点进行定位

我想在相同的中间水平位置标记线条(pos=0.5)。但由于第二条线倾斜,标签左下角应该接触该线。因此,我需要手动调整第二个标签的位置,比如说 0.4。

有什么方法可以自动完成此操作吗?

南边 A 和 B 正好位于彼此的正下方,但 B 的左下角仍然触及线?

下面是一些最小的例子,其中 B 按照需要接触线,但是 A 和 B 并没有彼此对齐。

\documentclass{minimal}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\draw (0,0) -- (2, 0) node[draw, inner sep=5pt, pos=0.5, anchor=south] {A};
\draw (0,0) -- (2,-3) node[draw, inner sep=5pt, pos=0.5, anchor=south west] {B};
\end{tikzpicture}
\end{document}

答案1

我会使用这个let语法(这需要calc加载库)。这样做的好处是不会影响图片的边界框。

B您可以像这样计算节点左下角所需的坐标:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\draw (0,0) -- (2, 0) node (A) [draw, inner sep=5pt, pos=0.5, anchor=south] {A};
\draw let \p1 = (0,0),
    \p2 = (2,-3),
    \p3 = (A.south west) in
    (\p1) -- (\p2) node at (\x3, {(\y2-\y1)*\x3/(\x2-\x1)}) [name=B,draw, inner sep=5pt, anchor=south west] {B};
\end{tikzpicture}
\end{document}


根据 Andrew Stacey 的建议,这里有一种不同的方法,允许节点具有不同的宽度。
这个想法是使用diamond包含矩形节点作为有效载荷的节点。通过shape aspect根据线的斜率设置并将其下角固定在沿线的所需位置,矩形节点将根据内容的宽度改变其位置。

我使用matrix of nodes来表示外部节点,这样 TikZ 就可以正确处理内部节点(您也可以使用普通节点并使用 来定义内部节点\tikz \node ...;,但这种嵌套导致问题)。使用matrix of nodes意味着您必须使用 来终止您的节点\\

我将计算和样式设置包装到corner on line样式中,并将其参数传递给内部节点。

以下有两个示例:

\draw (0,0) -- (4, 0) node (A) [draw, inner sep=5pt, pos=0.5, anchor=south] {A};
\draw let \p1 = (0,0),
    \p2 = (3,-5),
    \p3 = (A.south) in
    (\p1) -- (\p2) 
    node  [corner on line={draw, inner sep=5pt}] {B\\ }
    node  [corner on line={draw, inner sep=5pt}] {Engorgio!\\ }
;

将产生

以下是相同示例,但外部节点以彩色绘制

\draw (0,0) -- (4, 0) node (A) [draw, inner sep=5pt, pos=0.5, anchor=south] {A};
\draw let \p1 = (0,0),
    \p2 = (3,-5),
    \p3 = (A.south) in
    (\p1) -- (\p2) 
    node  [corner on line={draw=black, inner sep=5pt}, draw=blue] {B\\ }
    node  [corner on line={draw=black, inner sep=5pt}, draw=red] {Engorgio!\\ }
;


完整代码如下:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc, shapes.geometric, matrix}

\tikzset{
    calculate slope/.code={
        \pgfmathsetmacro\aspect{abs((\x2-\x1)/(\y2-\y1))}
        \tikzset{shape aspect=\aspect}
    },
    corner on line/.style={
        at={(\x3, {(\y2-\y1)*\x3/(\x2-\x1)})},
        matrix of nodes,
        diamond,
        anchor=south,
        inner sep=0pt,
        outer sep=-0.5\pgflinewidth,
        calculate slope,
        nodes={
            rectangle,
            #1
        }
    }
}

\begin{document}
\begin{tikzpicture}
\draw (0,0) -- (4, 0) node (A) [draw, inner sep=5pt, pos=0.5, anchor=south] {A};
\draw let \p1 = (0,0),
    \p2 = (3,-5),
    \p3 = (A.south) in
    (\p1) -- (\p2) 
    node  [corner on line={draw=black, inner sep=5pt}, draw=blue] {B\\ }
    node  [corner on line={draw=black, inner sep=5pt}, draw=red] {Engorgio!\\ }
;
\end{tikzpicture}
\end{document}

答案2

这是对 Jake 和 Torbjørn 的答案的修正,避免使用节点 A 来定位节点 B。我认为应该有更好的方法来做到这一点,但这是基于他们使用辅助节点来定位主节点的方法。为了确保节点大小相同,我们使用了我们希望放置的实际节点的空白副本。这确实意味着我们必须将其包含两次,但找出一个可以自动完成所有操作的宏并不难。

以下是对 Torbjørn 的修正:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{intersections}
\begin{document}
\begin{tikzpicture}
\draw (0,0) -- (2, 0) node (A) [draw, inner sep=5pt, pos=0.5, anchor=south] {ABC};
\draw [name path=sloped] (0,0) -- node (B) [inner sep=5pt, pos=0.5, anchor=south] {\phantom{B}} (2,-3);
\path [name path=vertical] (B.south west) -- (B.north west);
\draw [name intersections={of=vertical and sloped, by=x}] (x)
        node[above right,draw,inner sep=5pt] {B};
\end{tikzpicture}
\end{document}

这是杰克的:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\draw (0,0) -- (2, 0) node (A) [draw, inner sep=5pt, pos=0.5, anchor=south] {ABC};
\draw (0,0) -- node (B) [inner sep=5pt, pos=0.5, anchor=south] {\phantom{B}} (2,-3);
\path let \p1 = (0,0),
    \p2 = (2,-3),
    \p3 = (B.south west) in
    (\p1) -- (\p2) node at (\x3, {(\y2-\y1)*\x3/(\x2-\x1)}) [draw, inner sep=5pt, anchor=south west] {B};
\end{tikzpicture}
\end{document}

对他们两人的实际想法都给予充分的赞扬,这只是一个小小的修正,以消除对其他节点的依赖。

结果:

线垂直中间的节点

答案3

可能有更好的方法来实现这一点。下面从顶部节点的西南角垂直向下绘制一条虚拟线,使用intersection库找到这条线与斜线之间的交点,并在该交点处放置一个节点。

\documentclass{minimal}
\usepackage{tikz}
\usetikzlibrary{intersections}
\begin{document}
\begin{tikzpicture}
\draw (0,0) -- (2, 0) node (A) [draw, inner sep=5pt, pos=0.5, anchor=south] {A};
\draw [name path=sloped] (0,0) -- (2,-3);
\path [name path=vertical] (A.south west) -- ++(0,-3);
\draw [name intersections={of=vertical and sloped, by=x}] (x)
        node[above right,draw,inner sep=5pt] {B};
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容