我想在相同的中间水平位置标记线条(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}