当使用带标签的节点(例如流程图)时,它们的大小是自动选择的。可以通过对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}