根据最长覆盖版本分配节点大小

根据最长覆盖版本分配节点大小

我想创建一个节点,其文本内容在叠加层之间发生变化。当然,不同的内容有不同的大小,因此节点本身在叠加层之间会改变大小。我想通过分配所需的最大大小来避免这种情况。

下面是一些代码来演示我想要的效果。由于Bar文本标题的大小发生变化,整个图片会跳动。首先,我尝试使用\only来覆盖,但这意味着只有当前的覆盖会占用空间。然后,我尝试使用\visible,但它们总是会占用空间。

\documentclass{beamer}
\usepackage{tikz}
\begin{document}
\begin{frame}{Try 1}

  \begin{center}
  \begin{tikzpicture}
    \draw (0,0) node[draw]{Foo};
    \draw (1,0) node[right]{Bar{\only<2>{short}}{\only<3>{much much longer}}};
  \end{tikzpicture}
  \end{center}
\end{frame}

\begin{frame}{Try 2}

  \begin{center}
  \begin{tikzpicture}
    \draw (0,0) node[draw]{Foo};
    \draw (1,0) node[right]{Bar{\visible<2-3>{\visible<2>{short}}{\visible<3>{much much longer}}}};
  \end{tikzpicture}
  \end{center}
\end{frame}
\end{document}

在此处输入图片描述 在此处输入图片描述 在此处输入图片描述 在此处输入图片描述 在此处输入图片描述 在此处输入图片描述

答案1

如果您事先知道最长的文本(并愿意在文档中指定它),您只需添加选项

text width=width("Barmuch much longer")

到节点。

正如您所注意到的,这仍然会“跳来跳去”(至少在垂直方向上),因为最后一个具有g下降部(TeX 语言中的深度)。

由于您隐式指定right节点应使用其west锚点,因此它将垂直对齐到文本框的中心。

您可以通过底部锚点或中间锚点west midmid、、来锚定您的节点east mid,或者也可以为您的节点指定和。base westbasebase easttexttext depthtext height

添加\strut(也可以通过自动添加到您的节点font=\strut)可以将文本框垂直延伸到足够的距离,以使正常文本不会突出。

但你也可以text depth再次使用text height

\tikzset{
  max text/.style={
    text width ={width("#1")},
    text height={height("#1")},
    text depth ={depth("#1")}},
}

node[max text=Barshourtmuch much longer]

最后,它取决于您的图表需要什么、如何放置节点、是否有draw边界以及是否将线连接到它们。


添加 a\strut类似于执行

text depth=.3\baselineskip,
text height=.7\baselineskip,

尽管\strut将允许文本框垂直增长,text depthtext height将导致固定大小。

答案2

您可以将节点拆分为两个节点,并让长节点在所有幻灯片上占据空间,使其不可见:

\documentclass{beamer}
\usepackage{tikz}

\usetikzlibrary{overlay-beamer-styles}


\begin{document}
\begin{frame}{Try 1}

  \begin{center}
  \begin{tikzpicture}
    \node[draw] (0,0) {Foo};
    \node[right,visible on=<3>] at (1,0) {\strut Barmuch much longer};
    \node[right,visible on=<-2>] at (1,0) {\strut Bar\only<2>{short}};    
  \end{tikzpicture}
  \end{center}
\end{frame}

\end{document}

在此处输入图片描述

相关内容