# Beamer presentation without stretching of vertical spaces

Currently I am updating and extending my beamer themes. Thereby I also want to solve a spacing problem, which is sometimes quite annoying.

Think of the following example:

\documentclass[t]{beamer}
%
\newcommand{\testcontent}[2]{%
\frametitle{Frame #2}
Text\medskip\par
Itemize:%
\begin{itemize}
\item a%
\item b%
\item c%
\end{itemize}
\begin{figure}
\framebox(300,#1){Height = #1 units}%
\end{figure}
}
%
\begin{document}
%
\begin{frame}
\testcontent{150}{1}%
\end{frame}
%
\begin{frame}
\testcontent{50}{2}%
\end{frame}
%
\begin{frame}
\testcontent{150}{3}%
\vspace{0ex plus 1fil minus 1fil}%
\end{frame}
%
\end{document}


The example creates the following three frames. Open them in separate tabs to see the differences in vertical spacing:

In the first frame the defined height of the figure forces LaTeX to stretch (shrink) the vertical spaces of \medskip, itemize and figure. This can be seen if compared with the second frame, where the height of the figure is smaller and the vertical spaces are not stretched.

So I was looking for a solution to avoid the stretching of vertical spaces and consequently to have no jumping text lines when switching between frames. I found that someone redefined the corresponding lenghts to have no plus minus glue, but this did not work in my case or I missed to change some lengths.

So I came up with the \vspace{0ex plus 1fil minus 1fil} command in the third frame. This avoids stretching of the other verticals spaces, but gives no warning if the frame content does not fit on the frame. Another problem is, that I have to add this line manually to each frame end. I tried to automate this using \patchcmd for \beamer@collect@@body, but this also did not work.

Now to my questions:

1. Is there another way to avoid the described stretching of vertical spaces and to have constant vertical spaces independent of the frame content?
2. If there is no other solution then I used in the third frame above, is it possible to add the command automatically to each frame end?

Thank you very much for your help.

• If you are open to use one frame instead of three, you can have a look at only<> command. In your case you could use it in the first frame as only<1> for the content of first... then only<2> for the second and 'only<3>' for the third... This works if you really want the above text to be the same for all your 3 frames... If not you can change it too with alt<1>{text for frame 1}{empty or text for others} etc – koleygr Sep 17 '17 at 20:39
• Please see my comment to the answer of @samcarter. – Michael Sep 20 '17 at 17:19

For "frames with only slightly varying content" I would not use separate frames, but slides of the same frame. To get the same shrinking between the slides, you can reserve the required space for your largest figure with the overlayarea environment.

\documentclass[t]{beamer}

\begin{document}

\begin{frame}
\frametitle<1>{Frame 1}
\frametitle<2>{Frame 2}
Text\medskip\par
Itemize:%
\begin{itemize}
\item a%
\item b%
\item c%
\end{itemize}
\begin{overlayarea}{300pt}{150pt}
\begin{figure}
\only<1>{\framebox(300,150){Height = 150 units}}
\only<2>{\framebox(300,50){Height = 50 units}}
\end{figure}
\end{overlayarea}
\end{frame}

\end{document}

• It would be better to write "frames with varying content, but same layout" or leave it away. I edited my question. I know the \only command and the overlayarea environment. My example only should show the stretching of vertical spaces and consequently jumping text lines when switching frames. My question is more about how to remove this stretching. – Michael Sep 20 '17 at 17:14

\documentclass[t]{beamer}
%
\usepackage{calc}
\newdimen\mycurrentheight
\newdimen\mymaxheight
\newdimen\myspace
\newdimen\zerodimen
\newsavebox{\mybox}

\def\keepHeight#1{
\setbox\mybox\vbox{#1}
\setlength{\mycurrentheight}{\ht\mybox+\dp\mybox}
\usebox{\mybox}
\vskip \myspace
}

\ifdim\mycurrentheight>#1
\let\mymaxheight=\mycurrentheight
\let\myspace=\zerodimen
\else
\let\myspace=\zerodimen
\fi
}

\newcommand{\testcontent}[2]{%
\frametitle{Frame #2}
Text\medskip\par
Itemize:%
\begin{itemize}
\item a%
\item b%
\item c%
\end{itemize}
\keepHeight{\begin{figure}
\framebox(300,#1){Height = #1 units}%
\end{figure}}
}
%
\begin{document}
%
\begin{frame}
\testcontent{140}{1}%
\end{frame}
%
\begin{frame}
\testcontent{50}{2}%
\end{frame}
%
\begin{frame}
\testcontent{140}{3}%
%\vspace{0ex plus 1fil minus 1fil}%
\end{frame}
%
\end{document}


I am not really sure if this is what you really want. I have created the command \keepheight{} and used it in your \testcontent.

I suppose we can manipulate it to your wants but I am not sure about that.

Give it a try!

Edit

• I tested it and so far I can see, I get the same result as with my \vspace{0ex plus 1fil minus 1fil} command. It does not disable stretching of vertical spaces in a general manner, as I want it to have. – Michael Sep 20 '17 at 17:44
• Yes, I compiled it and tested it also width Height = 150 units. The result is the same when using \vspace{0ex plus 1fil minus 1fil} for every frame. You used \keepHeight also for every frame. – Michael Sep 20 '17 at 18:36
• Ok... Probably I can not understand what you want to do... You see that mine 140units are almost outside of the page... but you use 150... My code just keeping the same height for everything in my \keepHeight{} command. May be your vspace does the same... but I still don't get your point. – koleygr Sep 20 '17 at 19:19