我正在用 编写幻灯片beamer
,其中的各种幻灯片都包含树(图论意义上的)。我将使用此幻灯片进行演讲,讨论更改某个顶点的标签如何影响树中其他地方的另一个顶点的标签。为了在“之前/之后”执行此操作,我使用了\only<1>{some label}\only<2>{some other label}
相关顶点;请参阅本文底部的最小工作示例。
这个例子的问题是新的标签比原来的标签更宽;由于替换发生在树的一侧的顶点上,它会影响整个树的宽度;由于树位于中心,从旧标签到新标签的过渡会使整个树发生一点移动。
为了避免这种情况,我想将原始标签放在 中\makebox
,然后使用新标签的宽度作为框的宽度。我的第一个想法是使用类似 的东西,但它只是在 内\makebox[\hphantom{the new label}][c]{old label}
插入一个框,而不是声明 的宽度。\phantom
\makebox
\makebox
显然,我可以用丑陋的方式来做到这一点,即通过声明宽度(\makebox
以毫米或其他单位)然后尝试不同的宽度,直到找到合适的宽度。我在这里寻找的是一个更通用的解决方案。
\documentclass[dvips,11pt]{beamer}
\mode<presentation>
\usepackage{pstricks,pst-jtree}
\begin{document}
\begin{frame}
\vfill
\begin{center}
\jtree[xunit=3.8em]
\! = {some label}!a .
\!a = <left>{some label} ^<right>{some label}!b .
\!b = <left>{some label} ^<right>{\only<1>{old label}\only<2>{the new label}}!c .
\!c = <vert>{some label} .
\endjtree
\end{center}
\vfill
\end{frame}
\end{document}
答案1
calc
提供\widthof{<stuff>}
返回宽度(作为长度)的功能<stuff>
。因此,您可以使用:
\documentclass[dvips,11pt]{beamer}
\mode<presentation>
\usepackage{pstricks,pst-jtree,calc}
\begin{document}
\begin{frame}
\vfill
\begin{center}
\jtree[xunit=3.8em]
\! = {some label}!a .
\!a = <left>{some label} ^<right>{some label}!b .
\!b = <left>{some label} ^<right>{\only<1>{\makebox[\widthof{the new label}]{old label}}\only<2>{the new label}}!c .
\!c = <vert>{some label} .
\endjtree
\end{center}
\vfill
\end{frame}
\end{document}
根据宽度测量是否受扩展限制,也可以使用以下方法在其他地方捕获长度中的宽度:
\newlength{\mywidth}
\settowidth{\mywidth}{the new label}
然后\mywidth
在您想要引用的宽度的任何地方使用the new label
。
答案2
您可以使用eqparbox
包轻松做到这一点:不是使用声明的宽度,而是使用 \eqparbox
\mbox 来定义一个可与后续 \eqparboxes 一起使用的标签:所有使用此标签的 \eqparboxes 都将具有与第一个相同的宽度。
还有\eqmakebox
、、\eqframebox
命令\eqsavebox
和eqminipage
环境。
演示:
\documentclass[11pt]{article}
\usepackage{pstricks,pst-jtree}
\usepackage{makebox, eqparbox}
\begin{document}
{\fboxsep=0pt\fbox{The new label}}
\eqparbox{new}{The new label}
\eqframebox[new]{Old label}
\end{document}