Mit dembeamer
-Klassekann man Frames ganz einfach mit wiederholen \againframe
. Dabei wird die Framenummer um eins erhöht. Sehr oft macht das durchaus Sinn. Ich möchte allerdings den Eindruck erwecken, dass ich wirklich genau dasselbe Frame noch einmal zeige. Daher sollte auch die Framenummer zurückspringen.
Wahrscheinlich macht das folgende MWE meine Frage verständlicher:
\documentclass{beamer}
\useoutertheme{infolines}
\begin{document}
\newcounter{thisframenumber}
\setcounter{thisframenumber}{\value{framenumber}}
\begin{frame}[label=A]
Frame A
\end{frame}
\begin{frame}
Frame B
\end{frame}
% steps frame counter
\againframe{A}
% frame number from previous frame
\againframe[noframenumbering]{A}
% desired behavior
\newcounter{tmpframenumber}
\setcounter{tmpframenumber}{\value{framenumber}}
\setcounter{framenumber}{\value{thisframenumber}}
\againframe{A}
\setcounter{framenumber}{\value{tmpframenumber}}
\begin{frame}
Frame C
\end{frame}
\end{document}
Wie Sie sehen, habe ich eine Lösung gefunden, wie ich das gewünschte Verhalten erreichen kann. Allerdings umfasst diese Lösung zwei \newcounter
und vier \setcounter
Befehle. Gibt es eine weniger umständliche Lösung?
PS: Mein Traum wäre eine Option für \againframe
, so etwa \againframe[originalframenumbering]{A}
.
Antwort1
Vergiss meinen Kommentar.
Beamer stellt hierfür vier Makros zur Verfügung
\beamer@savecounter
: den spezifischen Zähler speichern;\beamer@restorecounter
: den gespeicherten Zähler wiederherstellen;\beamer@labelsavecounter
: den spezifischen Zähler unter dem Etikett speichern;\beamer@labelrestorecounter
: den gespeicherten Zähler wiederherstellen.
Das verbleibende Problem ist also:
Wo und wie kann ich diese einfügen \beamer@xxxxcounter{c@framenumber}
?
Zunächst benötigen Sie einen Schlüssel oldframenumbering
und noframenumbering
geben an, welche Nummer \againframe
verwendet werden soll.
Zweitens benötigen Sie einen continueframenumbering
Mechanismus zur Wiederherstellung, c@framenumber
falls oldframenumbering
sich die Nummer ändert. (Ich stelle die Nummer nur wieder her, wenn es nötig ist. Sie können sie jedoch jederzeit wiederherstellen.)
Drittens muss ich seine Definition kopieren und ändern , da der Beamer die Frame-Nummer innerhalb der \beamer@@@@frame<#1>[#2]
in definierten Nummer verarbeitet.beamerbaseframe.sty
Am Ende komme ich also zu folgendem Ergebnis:
\documentclass[handout,20pt]{beamer}
\useoutertheme{infolines}
\makeatletter
% replacing `noframenumbering' by oldframenumbering
\newif\ifbeamer@oldframenumbering
\beamer@oldframenumberingfalse
\define@key{beamerframe}{oldframenumbering}[true]{\beamer@oldframenumberingtrue}
% replacing `noframenumbering' by continueframenumbering
\newif\ifbeamer@continueframenumbering
\beamer@continueframenumberingfalse
% save framenumber w.r.t. labels
\define@key{beamerframe}{label}{
\def\beamer@againname{#1}
{\let\@elt\beamer@labelsavecounter\beamer@overlaycounterresets}
%%% old definition ↑↑↑
%%%new code ↓↓↓
{
\ifbeamer@continueframenumbering
\beamer@restorecounter{c@framenumber}
\fi
\stepcounter{framenumber}\beamer@labelsavecounter{c@framenumber}\addtocounter{framenumber}{-1}
}
}
% handling frame number
\def\beamer@@@@frame<#1>[#2]{%
\framewidth\textwidth
\beamer@savemode%
\def\beamer@mode{\mode<all>}%
\def\beamer@frametemplate{}%
\def\beamer@againname{}%
\def\beamer@undolabels{}%
\def\beamer@cramped{}%
\def\beamer@displaybreak{}%
\setbox\beamer@footins=\box\voidb@x%
\beamer@autobreakcount=0\relax%
\beamer@autobreaklastheight=16000pt%
\beamer@zoomcount=0\relax%
\beamer@containsverbatimfalse%
\beamer@isfragilefalse%
\beamer@autobreakfalse%
\beamer@shrinkfalse%
\beamer@plainframefalse%
\global\advance\beamer@zoomframecount by1\relax%
\csname beamer@dosecondmode\beamer@defaultdosecondmode\endcsname%
\ifbeamer@centered\setkeys{beamerframe}{c}\else\setkeys{beamerframe}{t}\fi%
\setkeys{beamerframe}{environment=frame}%
\setkeys{beamerframe}{#2}%
\beamer@frametemplate%
%%% old definition ↑↑↑
%%% modified `oldframenumbering' code ↓↓↓
\ifbeamer@noframenumbering
\beamer@noframenumberingfalse
\else
\ifbeamer@continueframenumbering
\beamer@continueframenumberingfalse
\beamer@restorecounter{c@framenumber}
\fi
\ifbeamer@oldframenumbering
\beamer@oldframenumberingfalse
\beamer@continueframenumberingtrue
\beamer@savecounter{c@framenumber}
\beamer@labelrestorecounter{c@framenumber}
\else
\stepcounter{framenumber}
\fi
\fi%
%%% old definition ↓↓↓
{\let\@elt\beamer@savecounter\beamer@overlaycounterresets}
\gdef\beamer@framestartpage{}%
\gdef\beamer@whichframes{#1}%
\ifx\beamer@framerestriction\@undefined\else% restriction stuff
\expandafter\beamer@checkifinlist\beamer@framerestriction\relax%
\fi%
\ifbeamer@inlecture%
\else%
\gdef\beamer@whichframes{all:0}%
\fi%
\ifx\beamer@againname\@empty%
\beamer@slideinframe=0\relax%
\beamer@anotherslidefalse%
{\beamer@masterdecode{\beamer@whichframes}}%
\ifbeamer@anotherslide%
\let\beamer@howtotreatframe\beamer@doseveralframes%
\ifbeamer@containsverbatim%
\let\beamer@howtotreatframe\beamer@dosingleframe%
\fi%
\ifbeamer@autobreak%
\let\beamer@howtotreatframe\beamer@autobreakframe%
\fi%
\ifbeamer@isfragile%
\let\beamer@howtotreatframe\beamer@doexternalframe%
\fi%
\else% no slides in frame
\let\beamer@howtotreatframe\beamer@donoframe%
\fi%
\else% again mode
\let\beamer@howtotreatframe\beamer@doseveralframes%
\ifbeamer@isfragile%
\let\beamer@howtotreatframe\beamer@doexternalframe%
\fi%
\ifbeamer@containsverbatim
\let\beamer@howtotreatframe\beamer@dosingleframe
\fi
\fi%
\beamer@howtotreatframe}
\begin{document}
\makeatletter
\def\insertshortdate{\Huge\hspace*{-5cm}}\Huge
\frame[label=A]{Alfa}
\frame[label=B]{Bravo}
\againframe[oldframenumbering]{A}
\frame[label=C]{Charlie}
\againframe[oldframenumbering]{B}
\againframe[oldframenumbering]{A}
\frame[label=D]{Delta}
\againframe[oldframenumbering]{C}
\againframe[oldframenumbering]{B}
\againframe[oldframenumbering]{A}
\frame[label=E]{Echo}
\frame{Echo}
\againframe[oldframenumbering]{E}
\frame{Echo}
\saved@A@c@framenumber
\saved@B@c@framenumber
\saved@C@c@framenumber
\saved@D@c@framenumber
\saved@E@c@framenumber
\end{document}