Skillmon
When using beamer I like to add a bit of stretch to lists to give a more balanced look if I don't have a complete frame's worth of contents. This works for a frame and with a small adjustment also for minipage (why does beamer use second order of infinity, it is supposed to use only first order...). But since one shouldn't use minipage but beamer's columns (why again?) I'd like to make it also work inside those. But it doesn't.

MWE:

tex
\documentclass[]{beamer}

\usepackage{xparse}

\ExplSyntaxOn
\makeatletter
\let\my@orig@listi   \@listi
\let\my@orig@listii  \@listii
\let\my@orig@listiii \@listiii
\NewDocumentCommand\ResetLists{}%>>=
{%
\let\@listi   \my@orig@listi
\let\@listI   \@listi
\let\@listii  \my@orig@listii
\let\@listiii \my@orig@listiii
}%=<<
\newcommand\my@StretchyLists[1]%>>=
{%
\def\@listi
{%
\leftmargin\leftmargini
\topsep  3\p@ \@plus2\p@ \@minus2.5\p@
\parsep  0\p@
\itemsep 3\p@ \@plus#1   \@minus3\p@
}%
\let\@listI\@listi
\def\@listii
{%
\leftmargin\leftmarginii
\topsep  2\p@ \@plus#1  \@minus2\p@
\parsep  0\p@ \@plus\p@
\itemsep 0\p@ \@plus#1
}%
\def\@listiii
{%
\leftmargin\leftmarginiii
\topsep  2\p@ \@plus#1  \@minus2\p@
\parsep  0\p@ \@plus\p@
\itemsep 0\p@ \@plus#1
}%
}%=<<
\NewDocumentCommand\StretchyLists{t! s O{0.3}}%>>=
{%
\IfBooleanTF{#1}
{\my@StretchyLists{#3}}
{%
\IfBooleanTF{#2}
{\my@StretchyLists{#3fil}}
{\my@StretchyLists{#3fill}}%
}%
}%=<<
\makeatother
\ExplSyntaxOff

\StretchyLists

\begin{document}
\begin{frame}{}{}
\begin{itemize}
\item first item
\item second item
\item third item
\end{itemize}
\end{frame}

\begin{frame}{}{}
\begin{columns}[onlytextwidth]
\begin{column}{.45\textwidth}
\begin{itemize}
\item first item
\item second item
\item third item
\end{itemize}
\end{column}
\end{columns}
\end{frame}

\begin{frame}{}{}
\begin{minipage}[c][\textheight][c]{.45\textwidth}
\StretchyLists*
\begin{itemize}
\item first item
\item second item
\item third item
\end{itemize}
\end{minipage}
\end{frame}
\end{document}

samcarter
Beamer columns are basically just minipages with some \hfill between them to distribute them across the page (and a couple of extra features like making them overlay aware etc.). So I would not say "don't use minipages with beamer" but rather that is normally easier to use columns instead of minipages.

In your example, you don't get any extra stretch between your items because the minipages beamer uses for the columns don't have any fixed height, this means they will take the height of the content. Now if the surrounding box has the same height as the content, it will look the same if stretched from from top to bottom of this box or not.

As a proof of concept you could redefine the column environment to use minipages of fixed height and you will see that suddenly you can see the stretch you added. (I added \vfill above and below the list, because this is normally add by beamer to the normal frame content)

Caveat: for everybody not using your custom class but the ordinary beamer class, \textheight will be too height, especially in case there is also a frametitle


\documentclass[]{beamer}

\makeatletter
\renewenvironment<>{beamer@columnenv}[2][\beamer@colmode]{%
\beamer@colclose\def\beamer@colclose{}%
\begin{actionenv}#3%
\setkeys{beamer@col}{#1}%
\begin{minipage}[\beamer@colalign][.99\textheight][c]{#2}%
{\end{minipage}\hfill\end{actionenv}\@ignoretrue}
\makeatother

\usepackage{xparse}

\ExplSyntaxOn
\makeatletter
\let\my@orig@listi   \@listi
\let\my@orig@listii  \@listii
\let\my@orig@listiii \@listiii
\NewDocumentCommand\ResetLists{}%>>=
{%
\let\@listi   \my@orig@listi
\let\@listI   \@listi
\let\@listii  \my@orig@listii
\let\@listiii \my@orig@listiii
}%=<<
\newcommand\my@StretchyLists[1]%>>=
{%
\def\@listi
{%
\leftmargin\leftmargini
\topsep  3\p@ \@plus2\p@ \@minus2.5\p@
\parsep  0\p@
\itemsep 3\p@ \@plus#1   \@minus3\p@
}%
\let\@listI\@listi
\def\@listii
{%
\leftmargin\leftmarginii
\topsep  2\p@ \@plus#1  \@minus2\p@
\parsep  0\p@ \@plus\p@
\itemsep 0\p@ \@plus#1
}%
\def\@listiii
{%
\leftmargin\leftmarginiii
\topsep  2\p@ \@plus#1  \@minus2\p@
\parsep  0\p@ \@plus\p@
\itemsep 0\p@ \@plus#1
}%
}%=<<
\NewDocumentCommand\StretchyLists{t! s O{0.3}}%>>=
{%
\IfBooleanTF{#1}
{\my@StretchyLists{#3}}
{%
\IfBooleanTF{#2}
{\my@StretchyLists{#3fil}}
{\my@StretchyLists{#3fill}}%
}%
}%=<<
\makeatother
\ExplSyntaxOff

\StretchyLists

\begin{document}
\begin{frame}{}{}
\begin{itemize}
\item first item
\item second item
\item third item
\end{itemize}
\end{frame}

\begin{frame}{}{}
\begin{columns}[onlytextwidth]
\begin{column}{.45\textwidth}
\begin{itemize}
\vfill
\item first item
\item second item
\item third item
\vfill
\end{itemize}
\end{column}
\end{columns}
\end{frame}

\end{document}

samcarter
This is not really an answer to the question, because it won't solve the problem with lists in columns, but I just saw an interesting idea how to make normal lists stretchy in beamer (inspired by https://github.com/josephwright/beamer/pull/696):


\documentclass{beamer}

\makeatletter
\define@key{beamerframe}{s}[true]{% stretch
\beamer@frametopskip=0pt\relax%
\beamer@framebottomskip=0pt\relax%
\beamer@frametopskipautobreak=\beamer@frametopskip\relax%
\beamer@framebottomskipautobreak=\beamer@framebottomskip\relax%
}
\makeatother

\begin{document}

\begin{frame}[s]
\begin{itemize}
\item text
\item text
\end{itemize}
\end{frame}

\end{document}


![Screen Shot 2021-06-22 at 14.29.07.png](/image?hash=f7199cfa077f4b28192d7e8a03e4ae7c12e56b9170ce319c59ca46a6738c4823)

Enter question or answer id or url (and optionally further answer ids/urls from the same question) from

Separate each id/url with a space. No need to list your own answers; they will be imported automatically.