2

By help of the answer Is there any way to produce List of frames with beamer? I succesfully created a list of frames. But I'd also like to include the section titles inbetween. This answer unfortunately does not work for me, as I need the original ToC untouched.

So I thought I could create a commamd \sectioninlbf which I call behind every \section (can be automated later...) and create a new content line in the lbf-file. However the \insertsection command seems to be ignored totally.

What am I doing wrong?

MWE

\documentclass{beamer}

\usepackage{hyperref}

\makeatletter
\newcommand\listofframes{\@starttoc{lbf}}
\makeatother

\makeatletter
\addtobeamertemplate{frametitle}{}{%
    \mode<presentation>
    {
    \only<1>{
    \hypertarget{\insertframetitle}{}%
          \addcontentsline{lbf}{section}{\protect\makebox[2em][l]{%
          \protect\usebeamercolor[fg]{structure}\scriptsize\insertframenumber\hfill}%
          \ifx\insertframesubtitle\@empty%
              \scriptsize\protect\hyperlink{\insertframetitle}{\insertframetitle}%
          \else%
              \scriptsize\protect\hyperlink{\insertframetitle}{\insertframesubtitle}%
          \fi%
          \par}%
    }
    }
}
\makeatother

\newcommand{\sectioninlbf}{
\addcontentsline{lbf}{section}{%
        \vspace{0.3\baselineskip}
        \protect\footnotesize%
        \protect\insertsection Here I want the section title.\par}%
}

\begin{document}

\begin{frame}
\frametitle{General outline}
\tableofcontents[hideallsubsections]
\end{frame}

\begin{frame}
\frametitle{List of Frames}
\listofframes
\end{frame}

\section{Test section one}\sectioninlbf

\begin{frame}
\frametitle{Test Frame One}
test
\end{frame}

\section{Test section two}\sectioninlbf
\begin{frame}
\frametitle{Test Frame Two}
\framesubtitle{Test Frame Two Subtitle}
test
\end{frame}
\begin{frame}
\frametitle{Test Frame Three}
\uncover<1->{test}
\uncover<2->{test}
\uncover<3->{test}
\end{frame}

\end{document}

enter image description here

Update

As Sam Carter's answer changes my initial approach, I needed to extend the MWE to include some more requirements: If a framesubtitle exists, the framesubtitle should subsititute the frametitle in the ToC. Also the frame numbers are required. Also I use different frametitle templates, some of them add the frametitles and framesubtitles to the ToC, some of the don't. So I don't know if patching the base-command of frametitle is a good idea, unless an on/off switch exists.

4
  • Would tex.stackexchange.com/a/17233/36296 be an alternative? Sep 13, 2016 at 17:39
  • \tableofcontents[hideallsubsections] will still give you the original toc Sep 13, 2016 at 17:52
  • @samcarter 2) yes I know, I asking about the next frame. But I don't want to "destroy" that first one, as I would with one of the linked answers. Sep 13, 2016 at 18:42
  • @samcarter 1) it highly depends. I heavily use uncover and so on, with my approach now I can handle it quite easy, that I just get an entry for the first occurence. Your linked solution doesn't seem to provide that functionality easily. Sep 13, 2016 at 18:45

2 Answers 2

3

Based on https://tex.stackexchange.com/a/17233/36296

I see two requirements in your question:

  1. "normal" toc should still be available: \tableofcontents[hideallsubsections]

  2. should work with overlays: I modified the code a little bit so that only the first slide in a frame is added to the toc.

  3. show framenumbers

  4. includes subtitle if available


\documentclass{beamer}

\makeatletter
\addtobeamertemplate{frametitle}{}{%
    \only<1>{%
        \addtocontents{toc}{%
         \protect\beamer@subsectionintoc{\the\c@section}{0}{%
                    \insertframenumber\quad%
              \ifx\insertframesubtitle\@empty%
                  \insertframetitle%
              \else%
                  \insertframesubtitle%
              \fi%
         }{\the\c@page}{\the\c@part}{\the\beamer@tocsectionnumber}%
        }%
    }%
}%
\makeatother

\begin{document}

\begin{frame}
\tableofcontents[hideallsubsections]
\end{frame}

\begin{frame}
\tableofcontents
\end{frame}

\section{First Section}

\begin{frame}{First frame}
Text
\end{frame}

\begin{frame}{Second frame}
Text
\end{frame}



\section{Second Section}

\begin{frame}
\frametitle{Third frame}
\framesubtitle{mySubtitle}
Text
\end{frame}

\begin{frame}
\frametitle{Fourth frame}
Text
\pause
more text
\end{frame}

\end{document}

enter image description here

4
  • \apptocmd{\beamer@@frametitle}{% \only<1>{ \addtocontents{toc}{\protect\beamer@subsectionintoc{\the\c@subsection}{0}{#1}{\the\c@page}{\the\c@part}% {\the\beamer@tocsectionnumber}}% }}{}{}% would be enough actually. However, as this answer completely changes the base code of my question I don't know how to proceed and my minimal example is too minimal now. I actually include a test whether a framesubtitle exists and if so, put the framsubtitle instead of the frametitle. Also I need the frame numbers. With my approach I would know how to do all that, now I don't... Sep 14, 2016 at 7:05
  • I'm very sorry, it's always so hard to tell how minimal a minimal example needs to be... Sep 14, 2016 at 7:15
  • @thewaywewalk I added the framenumbers. Will have a look later if the subtitles are possible as well. Sep 14, 2016 at 13:32
  • As your code stands now, you should be able to use the same if condition, as I did in my orginal question, uinder the assumption that the frametitle also exists (which is the case). But I can't try it now. Sep 14, 2016 at 15:50
1

The answer finally was pretty simple:

Instead of \insertsection the undocumented (?) \secname should be used and everything works as desired.

\newcommand{\sectioninlbf}{
\addcontentsline{lbf}{section}{%
        \vspace{0.3\baselineskip}
        \protect\footnotesize%
        \secname\par}%
}

will lead to:

enter image description here

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .