如何才能使 TikZ 节点精确地位于另外两个节点之间?
假设,
\node (a) {a}
\node (c) [right of=c] {c}
\node (b) [between={a,c}] {b}
答案1
我的建议是使用该calc
库(参见 pgfmanual 13.5 坐标计算 - 2010 年 10 月 25 日版本)。
一个例子:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\scalebox{4}{
\begin{tikzpicture}[text height=2ex]
\node (a) {a};
\node (c) [right of=a] {c};
\node (b) at ($(a)!0.5!(c)$) {b};
\end{tikzpicture}
}
\end{document}
结果:
请注意,您使用的语法是错误的:每个节点都应以 结尾,;
并且节点c
不能位于其右侧。
请注意,如果不指定text height
,则节点不会垂直对齐:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\scalebox{4}{
\begin{tikzpicture}
\node (a) {a};
\node (c) [right of=a] {c};
\node (b) at ($(a)!0.5!(c)$) {b};
\end{tikzpicture}
}
\end{document}
参见参考TikZ 和节点内文本的垂直对齐问题。
然而,图书馆calc
并不是唯一的出路。在他的评论中,percusse 提出了另一种方法:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\scalebox{4}{
\begin{tikzpicture}[text height=2ex]
\node (a) {a};
\node (c) [right of=a] {c};
\path (a) -- (c) node[midway] (b) {b};
\end{tikzpicture}
}
\end{document}
我甚至还看到了一个(好吧,不太方便,但为了完整起见我还是报告了)。假设您正在使用positioning
库并且节点被放置on grid
;那么节点距离肯定会以某种方式设置,因此可以按如下方式进行:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning}
\pgfmathtruncatemacro\distance{1}
\begin{document}
\scalebox{4}{
\begin{tikzpicture}[text height=2ex, on grid]
\node (a) {a};
\node (c) [right=\distance cm of a] {c};
\node (b) [right=0.5\distance cm of a]{b};
\end{tikzpicture}
}
\end{document}
两种方法都会导致第一个示例图所示的结果。
答案2
除了@Claudio 的详细答案之外,这里还有一个更简洁的解决方案,它还可以根据文本的基线对齐节点,而不需要明确指定文本高度。
以下内容不要求calc
并且仅要求positioning
因为使用base right
而忠实于问题中的示例。否则,绝对定位(即使用at
)将按预期工作。
\begin{tikzpicture}[anchor=base]
\node (a) {a};
\node (c) [base right=of a] {c};
\path (a.base) -- node (b) {b} (c.base);
\end{tikzpicture}
anchor
全局设置base
可以使代码更简洁,但您可以将其单独应用于每个节点。
(b)
第三行在连接另外两个节点基线的线的中间创建节点。
另请注意,该键right of
已被弃用,取而代之的是right=of ...
(请参阅这个答案)。
附录:如何创建between
密钥
这是一种实际提供问题中提出的语法的方法。
\tikzset{
between/.style args={#1 and #2}{
at = ($(#1)!0.5!(#2)$)
}
}
然后你可以写类似的东西\node[between=a and c] (b) {b};
。同样,如果你想要基线对齐,你必须写between=a.base and c.base
或写一个缩写
\tikzset{
between base/.style args={#1 and #2}{
between=#1.base and #2.base
}
}
所以你只要写就可以了between base=a and c
。
但这需要calc
图书馆。