[Tex/LaTex] Beamer, page/frame numbers, buttons and Appendix slides

appendicesbeamerhyperrefpage-numbering

I am using beamer and I have a slide in an Appendix section. I hyper-reference it with a button. The Appendix does not appear as a section itself. The Appendix material is at the end of the code. I would like all of this to remain.

When I click on the button on Slide 2, it brings me to the Appendix slide. The Appendix Slide says p. 3. Even though the it is linked from Section 2.

Would it be possible to do either of the following two?

  1. Have the appendix slide be the same from which it is buttoned. In this case, say 2/3.
  2. Have the appendix slide have no page number. Just be blank.

The following code should illustrate the point.

\documentclass[professionalfont]{beamer}
\mode<presentation>
\usetheme{Warsaw}
\usetheme{CambridgeUS}
\usepackage{booktabs}
\begin{document}

\section{Section}
\subsection{}

\frame
{
\frametitle{Slide Title}
Slide 1
\hspace{0.01cm}\hyperlink{eaa<1>}{\beamergotobutton{Literature}}
}

\frame
{
\frametitle{Slide Title}
Slide 2
\hspace{0.01cm}\hyperlink{eab<1>}{\beamergotobutton{Literature}}
}

\frame
{
\frametitle{Slide Title}
Slide 3
}

\section*{}

\addtocounter{framenumber}{-1}
\frame[label=eaa]
{
\frametitle{Appendix Material}
Appendix Material here for Slide 1.
{
{\tiny

\hfill\Acrobatmenu{GoBack}{\beamerreturnbutton{}}

}}
}


\addtocounter{framenumber}{-1}
\frame[label=eab]
{
\frametitle{Appendix Material}
Appendix Material here for Slide 2.
{
{\tiny

\hfill\Acrobatmenu{GoBack}{\beamerreturnbutton{}}

}}
}

\end{document}

I would very much appreciate your help.

Best Answer

Here's one way to remove the slide numbering from the Appendix slide, via the etoolbox package. The idea being that you replace the insertion of the frame in the footline template with a \phantom version of itself:

enter image description here

\documentclass{beamer}% http://ctan.org/pkg/beamer
\usepackage{lmodern}% http://ctan.org/pkg/lm
\usepackage{etoolbox}% http://ctan.org/pkg/etoolbox
\mode<presentation>
\usetheme{Warsaw}
\usetheme{CambridgeUS}
\begin{document}

\section{Section}
\subsection{}

\begin{frame}
\frametitle{Slide Title}
Slide 1
\end{frame}

\begin{frame}
\frametitle{Slide Title}
Slide 2
\hspace{0.01cm}\hyperlink{eab<1>}{\beamergotobutton{Literature}}
\end{frame}

\begin{frame}
\frametitle{Slide Title}
Slide 3
\end{frame}

\section*{}

% Remove <frame #> / <total frame #> from footline template
\makeatletter
\patchcmd{\beamer@@tmpl@footline}% <cmd>
  {\insertframenumber{} / \inserttotalframenumber}% <search>
  {\phantom{\insertframenumber{} / \inserttotalframenumber}}% <replace>
  {}% <success>
  {}% <failure>
\makeatother

\begin{frame}[label=eab]
\frametitle{Appendix Material}
Appendix Material here.
{\tiny\hfill\Acrobatmenu{GoBack}{\beamerreturnbutton{}}}
\end{frame}

\addtocounter{framenumber}{-1}% Correct total frame count
\end{document}

The beamer footline template is stored in beamer@@tmpl@footline. It's just easier replacing (or patching) the necessary commands rather than redefining it all over again.


A similar approach can be used to repeat the frame number of some other slide. One way is to "capture" the frame number in a different counter, and then patch the footline to display that number rather than the regular framenumber counter (via \insertframenumber). Here is a complete minimal example:

\documentclass{beamer}% http://ctan.org/pkg/beamer
\usepackage{lmodern}% http://ctan.org/pkg/lmodern
\usepackage{etoolbox}% http://ctan.org/pkg/etoolbox
\newcounter{captureframe}
\mode<presentation>
\usetheme{Warsaw}
\usetheme{CambridgeUS}
\begin{document}

\section{Section}
\subsection{}

\begin{frame}
\frametitle{Slide Title}
Slide 1
\end{frame}

\begin{frame}
\frametitle{Slide Title}
Slide 2
\hspace{0.01cm}\hyperlink{eab<1>}{\beamergotobutton{Literature}}
\end{frame}
\setcounter{captureframe}{\value{framenumber}}% Store/capture current frame

\begin{frame}
\frametitle{Slide Title}
Slide 3
\end{frame}

\section*{}

% Replace <frame #> in footline template
\makeatletter
\patchcmd{\beamer@@tmpl@footline}% <cmd>
  {\insertframenumber}% <search>
  {\thecaptureframe}% <replace>
  {}% <success>
  {}% <failure>
\makeatother

\begin{frame}[label=eab]
\frametitle{Appendix Material}
Appendix Material here.
{\tiny\hfill\Acrobatmenu{GoBack}{\beamerreturnbutton{}}}
\end{frame}

\addtocounter{framenumber}{-1}% Correct total frame count
\end{document}

The frame number is captured via

\setcounter{captureframe}{\value{framenumber}}

after defining the new counter captureframe. In the patch to the footline template, \insertframenumber is replaced with \thecaptureframe (which defaults to an \arabic presentation of the counter).

Both of the above solutions will impact all slides/frames following the patch. So, if a modification should be made temporarily, some more work is required (but is not difficult).


Based on certain assumptions, an elementary method using macros (that does not require etoolbox) can be established to reference slides. The assumptions are

  1. There is a clear separation between "frontmatter" and "backmatter" slides. The former contain slides that could be "referenced" while the latter contains the "referenced" slides.
  2. Manual usage of certain macros are required before every "backmatter" slide in order to maintain an accurate count of the total frame number.

Here is an MWE:

\documentclass{beamer}% http://ctan.org/pkg/beamer
\usepackage{lmodern}% http://ctan.org/pkg/lmodern
\makeatletter
\newcommand{\saveframenumber}[1]{%
  \expandafter\edef\csname r@#1\endcsname{\theframenumber}% Store frame number
}
\newcommand{\useframenumber}[1]{%
  \addtocounter{framenumber}{-1}% Decrease framenumber counter
  \renewcommand{\insertframenumber}{%
    \csname r@#1\endcsname%
  }%
}
\makeatother
\newcommand{\restoreframenumberdefault}{%
  \renewcommand{\insertframenumber}{%
    \arabic{framenumber}%
  }%
}

\mode<presentation>
\usetheme{Warsaw}
\usetheme{CambridgeUS}
\begin{document}

\section{Section}
\subsection{}

\begin{frame}
\frametitle{Slide Title}
Slide 1
\end{frame}

\begin{frame}
\frametitle{Slide Title}
Slide 2
\hspace{0.01cm}\hyperlink{eab<1>}{\beamergotobutton{Literature}}
\end{frame}
\saveframenumber{myslide}% Save this slide number as <myslide>

\begin{frame}
\frametitle{Slide Title}
Slide 3
\end{frame}

\section*{}

\useframenumber{myslide}% Use the same number as on <myslide>
\begin{frame}[label=eab]
\frametitle{Appendix Material}
Appendix Material here.
{\tiny\hfill\Acrobatmenu{GoBack}{\beamerreturnbutton{}}}
\end{frame}

\end{document}

The usage is:

  • After a slide that you want to reference in the "backmatter", you place \saveframenumber{<name>}. This stores the value of the current frame in \r@<name>.
  • Before every "backmatter" slide that uses the "referenced" slide in the "frontmatter", you place \useframenumber{<name>}.