附录:如何创建between密钥

附录:如何创建between密钥

如何才能使 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图书馆。

相关内容