TikZ 节点:如何假装所有字符都有上升部和下降部?

TikZ 节点:如何假装所有字符都有上升部和下降部?

我想用 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 的回答,以下技巧重新\\定义了\nlZarko 回答中的含义。因此您可以\\照常使用。

\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}

在此处输入图片描述

相关内容