计算 Tikz 中不同文本量节点的共同高度

计算 Tikz 中不同文本量节点的共同高度

当使用带标签的节点(例如流程图)时,它们的大小是自动选择的。可以通过对minimum height和使用“足够大”的值来强制多个节点具有相同的大小(这必须是事先知道的) minimum width

在以下示例中,由于空间原因,节点宽度受到限制。这导致框包含不同数量的线,因此框大小也不同。

    \documentclass{beamer}
    \usepackage{tikz}
    \usetikzlibrary{positioning}

    \begin{document}
    \begin{frame}
    \begin{tikzpicture}[node distance=2cm]
        \node[rectangle,text width=5em,draw=black] (leftnode) {Short text};
        \node[rectangle,text width=5em,draw=black,right=of leftnode] (rightnode) {A text longer than the other one};
    \end{tikzpicture}
    \end{frame}
    \end{document}

给定两个字符串,应将其写入两个大小相同的单独节点:是否可以让 LaTeX 计算出对两种情况都足够大的最小节点高度并将其用作节点的参数?

答案1

高度相同:

当您指定 时text width,文本将放置在\parbox提供的宽度中text width。因此,一个简单的解决方法是在较短的节点中使用\vphantom{}以确保它具有相同的高度:

在此处输入图片描述

代码:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning}

\newcommand*{\TextWidth}{5em}%
\newcommand*{\StringA}{Short}%
\newcommand*{\StringB}{A text longer than the other one}%

\newcommand{\VPhantom}{\vphantom{\parbox{\TextWidth}{\StringB}}}%

\begin{document}
\begin{tikzpicture}[node distance=0.1cm]
    \node[rectangle,text width=\TextWidth,draw=black, red] (leftnode) {\VPhantom\StringA};
    \node[rectangle,text width=\TextWidth,draw=black, blue, right=of leftnode] (rightnode) {\StringB};
\end{tikzpicture}
\end{document}

宽度相同

您可以使用来\widthof{}计算长度,然后选择最大宽度作为minimum length

在此处输入图片描述

笔记

  • 调整节点两侧的2*\InnerSep值,因此如果该值发生变化,则此公式也需要进行调整。inner sep

代码:

\documentclass{article}
\usepackage{tikz}

\newcommand*{\InnerSep}{0.333em}%
\newcommand*{\StringA}{short}%
\newcommand*{\StringB}{a longer string}%

\begin{document}

\pgfmathsetmacro{\MinimumWidth}{%
    max(\widthof{\StringA},\widthof{\StringB})+2*\InnerSep%
}%

\begin{tikzpicture}[minimum width=\MinimumWidth]
    \node [rectangle, draw=red]  at (0,0) {\StringA};
    \node [rectangle, draw=blue] at (0,1) {\StringB};
\end{tikzpicture}
\end{document}

答案2

如果较小的字符串仅使用一行,则上述答案效果很好。对于两个节点中的多行,我得出了以下解决方案(结合上面给出的两种方法并使用包calc)。

    \documentclass{beamer}
    \usepackage{calc}
    \usepackage{tikz}
    \usetikzlibrary{positioning}

    \newcommand*{\TextWidth}{5em}
    \newcommand*{\Innersep}{0.33em}
    \newcommand{\StringA}{Short multiline text}
    \newcommand{\StringB}{A text longer than the other one}
    \newlength\myheight
    \setlength{\myheight}{\totalheightof{\parbox{\TextWidth}{\StringB}}+Innersep*2}

    \begin{document}
    \begin{frame}
    \begin{tikzpicture}[node distance=2cm]
        \node[rectangle,text width=\TextWidth,inner sep=\Innersep,minimum height=\myheight,draw=black] (leftnode) {\StringA};
        \node[rectangle,text width=\TextWidth,inner sep=\Innersep,minimum height=\myheight,draw=black,right=of leftnode] (rightnode) {\StringB};
    \end{tikzpicture}     
    \end{frame}     
    \end{document}

相关内容