Repetición de diapositivas en una presentación de proyector, incluido el número de fotograma original

Repetición de diapositivas en una presentación de proyector, incluido el número de fotograma original

Con elbeamer-claseuno puede repetir cuadros fácilmente usando \againframe. Al hacerlo, el número de fotograma aumenta en uno. Muy a menudo esto tiene mucho sentido. Sin embargo, me gustaría dar la impresión de que realmente muestro exactamente el mismo cuadro una vez más. Por lo tanto, el número de fotograma también debería retroceder.

Probablemente el siguiente MWE haga que mi pregunta sea más comprensible:

\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}

Como puede ver, encontré una solución para lograr el comportamiento deseado. Sin embargo, esta solución incluye dos \newcountery cuatro \setcountercomandos. ¿Existe una solución menos engorrosa?

PD: Mi sueño sería una opción para \againframe, como \againframe[originalframenumbering]{A}.

Respuesta1

Olvídate de mi comentario.

Beamer proporciona cuatro macros para este propósito

  • \beamer@savecounter: guarda el contador específico;
  • \beamer@restorecounter: restaurar el contador guardado;
  • \beamer@labelsavecounter: guarda el contador específico debajo de la etiqueta;
  • \beamer@labelrestorecounter: restaurar el contador guardado.

Entonces, el problema restante es:
¿dónde y cómo puedo insertarlos \beamer@xxxxcounter{c@framenumber}?

Primero, necesita una clave oldframenumberingjunto con noframenumberingpara indicar qué número \againframedebe usar.

En segundo lugar, necesita un continueframenumberingmecanismo para restaurar c@framenumberen caso de que oldframenumberingse modifique. (Restauraré el número sólo si es necesario. Sin embargo, siempre puedes restaurarlo).

En tercer lugar, dado que el proyector maneja el número de fotograma \beamer@@@@frame<#1>[#2]definido en beamerbaseframe.sty, necesito copiar y modificar su definición.

Entonces termino con:

\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}

información relacionada