Using the following code I could put the ToC lines in the center in beamer:
\begin{frame}
\begin{center}
\tableofcontents
\end{center}
\end{frame}
But how to make these ToC lines left aligned and still in the center?
Using the following code I could put the ToC lines in the center in beamer:
\begin{frame}
\begin{center}
\tableofcontents
\end{center}
\end{frame}
But how to make these ToC lines left aligned and still in the center?
A small calculation could advance the margins sufficiently to obtain the centered & left-aligned \tableofcontents display.

\documentclass{beamer}% http://ctan.org/pkg/beamer
\newsavebox{\longestsec}% Box to save longest sectional heading
\begin{document}
\begin{frame}
\frametitle{Table of contents}
\begin{lrbox}{\longestsec}Last section in the presentation\end{lrbox}% Capture longest title
\setlength{\leftskip}{\dimexpr.5\textwidth-.5\wd\longestsec\relax}% Advance left margin accordingly
\tableofcontents
\end{frame}
\section{First section}
\begin{frame}
\frametitle{First slide}
This is a slide.
\end{frame}
\section{Last section in the presentation}% Longest sectional title
\begin{frame}
\frametitle{Another slide}
This is another slide
\end{frame}
\end{document}
The reason for this round-about way is because beamer collapses the spacing when putting \tableofcontents within a minipage or varwidth (from the varwidth package).
Here is an automated way of capturing the width of the longest section:
\documentclass{beamer}% http://ctan.org/pkg/beamer
\usepackage{etoolbox}% http://ctan.org/pkg/etoolbox
\makeatletter
\newlength{\secnamelength}
\newsavebox{\longestsec}% Box to save longest sectional heading
\patchcmd{\beamer@section}% <cmd>
{\beamer@savemode}% <search>
{\begin{lrbox}{\longestsec}#1\end{lrbox}%
\ifdim\wd\longestsec>\secnamelength\relax\setlength{\secnamelength}{\wd\longestsec}\fi%
\beamer@savemode}% <replace>
{}{}% <success><failure>
\AtEndDocument{% http://tex.stackexchange.com/q/137495/5764
\immediate\write\@auxout{\global\secnamelength=\the\secnamelength}%
}
\makeatother
\begin{document}
\begin{frame}
\frametitle{Table of contents}
\setlength{\leftskip}{\dimexpr.5\textwidth-.5\secnamelength\relax}% Advance left margin accordingly
\tableofcontents
\end{frame}
\section{First section}
\begin{frame}
\frametitle{First slide}
This is a slide.
\end{frame}
\section{Last section in the presentation}% Longest sectional title
\begin{frame}
\frametitle{Another slide}
This is another slide
\end{frame}
\end{document}
The above stores the length of the longest section in \secnamelength that is written to the .aux at the end of the document. A patch of \beamer@section (with the aid of etoolbox is necessary to grab the maximum length of a section name and drop it into the .aux \AtEndDocument so it can be retrieved in a successive run.
varwidth inside center environment is possible for beamer TOC?
– Z.H.
Apr 07 '15 at 10:23
\section[shortName]{longName} and of course your code will use the parameter #1. Can you provide a way to avoid this and always take the mandatory argument?
– Ktree
Jun 07 '17 at 11:50
\section to take only two arguments (first is optional, as usual). However, it still considers the optional argument #1 to be what ends up in the ToC. You can change it to use #2, but I'm not sure what the purpose of specifying \section[shortName]{longName} is then.
– Werner
Jun 07 '17 at 16:43
itemsep and labelwidth. Thus I have to use this: \setlength{\leftskip}{\dimexpr.5\textwidth-.5\secnamelength+.5\labelsep-\labelwidth\relax}
– stefanct
Oct 09 '17 at 13:34
By patching \beamer@sectionintoc command, I could use varwidth inside center environment to make ToC lines left aligned and in the center.
The only limitation of this solution is, ToC lines could not be wrapped.
\documentclass{beamer}
\usepackage{varwidth}
\usepackage{etoolbox}
\makeatletter
%\patchcmd{\beamer@sectionintoc}{\vskip1.5em}{\vskip0.5em}{}{}
\patchcmd{\beamer@sectionintoc}{%
\hbox{\vbox{%
\def\beamer@breakhere{\\}%
\beamer@tocact{\ifnum\c@section=#1\beamer@toc@cs\else\beamer@toc@os\fi}{section in toc}}}%
}{%
\hbox{%
\def\beamer@breakhere{}%
\beamer@tocact{\ifnum\c@section=#1\beamer@toc@cs\else\beamer@toc@os\fi}{section in toc}}%
}{}{}
\makeatother
\setbeamertemplate{section in toc}[sections numbered]
\begin{document}
\begin{frame}
\frametitle{Table of contents}
\begin{center}
\begin{varwidth}{\textwidth}
\tableofcontents[sectionstyle=show,subsectionstyle=hide]
\end{varwidth}
\end{center}
\end{frame}
\section{First section}
\begin{frame}
\frametitle{First slide}
This is a slide.
\end{frame}
\section{Second section in the presentation}
\begin{frame}
\frametitle{Another slide}
This is another slide.
\end{frame}
\section{Last section}
\begin{frame}
\frametitle{Last slide}
This is the last slide.
\end{frame}
\end{document}

\vfills between the sections back? For some reason they are gone after using the patch. I have tried adding it back manually by inserting it into the second clause of the patch etc. but that apparently makes either the patch not applying (is there no warning?) or it does not work.
– stefanct
Sep 05 '16 at 09:48
As shown in my comment, the automatism provided by Werner can be problematic if you have short names like \section[shortName]{longName} e.g. for beamer slide headlines. It always takes the first argument, which would then be the short name.
I implemented a quick solution now (with etoolbox and ifthen), which will take the second argument if provided:
\makeatletter
\newlength{\secnamelength}
\newsavebox{\longestsec}% Box to save longest sectional heading
\patchcmd{\beamer@section}% <cmd>
{\beamer@savemode}% <search>
{
\ifstrempty{#2}{%
\begin{lrbox}{\longestsec}#1\end{lrbox}
\ifthenelse{
\wd\longestsec > \secnamelength
}{
\setlength{\secnamelength}{\wd\longestsec}
}{}%else
}{
\begin{lrbox}{\longestsec}#2\end{lrbox}
\ifthenelse{
\wd\longestsec > \secnamelength
}{
\setlength{\secnamelength}{\wd\longestsec}
}{}%else
}
\beamer@savemode
}% <replace>
{}{}% <success><failure>
\AtEndDocument{% http://tex.stackexchange.com/q/137495/5764
\immediate\write\@auxout{\global\secnamelength=\the\secnamelength}%
}
\makeatother
\tableofcontentsinside aminipage-environment which can be centered via\centering. – Marco Daniel Dec 10 '11 at 17:12