我想用 TikZ 画几个框,每个框包含一个或多个单词,有时包含多行。像这样:
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{chains}
\tikzset{
align=center,
every node/.style=draw,
node distance=1em,
}
\begin{document}
\begin{tikzpicture}[start chain, every node/.append style=on chain]
\node {a};
\node {b};
\node {g};
\node {a\\a};
\node {g\\b};
\node {b\\g};
\end{tikzpicture}
\end{document}
但是,无论使用什么字符,我希望所有单行框都具有相同的高度,并且所有双行框也具有相同的高度。
作为一种解决方法,我可以做这样的事情:
\node {a\strut};
\node {b\strut};
\node {g\strut};
\node {a\strut\\a\strut};
\node {g\strut\\b\strut};
\node {b\strut\\g\strut};
这样可以得到预期的结果,但是如果节点很多的话输入起来会比较麻烦。
有没有什么方法可以更自动地实现这一点?
我尝试使用execute at end node=\strut
,它适用于单行节点和双行节点的底部。我也尝试过execute at begin node=\strut
,但没有达到预期的效果。
答案1
根据 Zarko 的回答,以下技巧重新\\
定义了\nl
Zarko 回答中的含义。因此您可以\\
照常使用。
\documentclass[tikz,border=9]{standalone}
\usetikzlibrary{chains}
\begin{document}
\makeatletter
\def\tikz@align@newline{\vphantom{bg}\pgfutil@protect\tikz@align@newline@}
\begin{tikzpicture}[
node distance=0,start chain,
every node/.style={
on chain,draw,align=center,
execute at end node=\vphantom{bg}
}
]
\node(a){a};
\node(b){b};
\node(g){g};
\node(aa){a\\a};
\node(ag){a\\g};
\node(ba){b\\a};
\node(bg){b\\g};
\end{tikzpicture}
\end{document}
答案2
可能的解决方案:
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{chains, positioning}
\begin{document}
\begin{tikzpicture}[
node distance = 1cm,
start chain,
execute at end node={\vphantom{bg}}, % <---
every node/.append style={on chain, draw, align=center},
]
\def\nl{\vphantom{bg}\\} % <---
\node {a};
\node {b};
\node {y};
\node {a\nl a};
\node {g\nl b};
\node {b\nl g};
\end{tikzpicture}
\end{document}