とともにbeamer
-クラスを使用すると、フレームを簡単に繰り返すことができます\againframe
。その際、フレーム番号が 1 つ増えます。多くの場合、これは非常に理にかなっています。ただし、まったく同じフレームをもう一度表示しているという印象を与えたい場合があります。そのため、フレーム番号も戻る必要があります。
おそらく、次の MWE により私の質問がより理解しやすくなるでしょう。
\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}
ご覧のとおり、目的の動作を実現するソリューションを見つけました。ただし、このソリューションには 2 つと\newcounter
4 つの\setcounter
コマンドが含まれています。もっと面倒でないソリューションはありますか?
\againframe
追伸:私の夢は、 のようなのオプションになることです\againframe[originalframenumbering]{A}
。
答え1
私のコメントは忘れてください。
Beamerはこの目的のために4つのマクロを提供しています。
\beamer@savecounter
: 特定のカウンターを保存します。\beamer@restorecounter
: 保存したカウンターを復元します。\beamer@labelsavecounter
: 特定のカウンターをラベルの下に保存します。\beamer@labelrestorecounter
: 保存したカウンターを復元します。
残る問題は、
どこにどうやって挿入するか\beamer@xxxxcounter{c@framenumber}
ということです。
まず、使用する番号を示すoldframenumbering
キーが必要です。noframenumbering
\againframe
次に、変更した場合にcontinueframenumbering
復元するメカニズムが必要です。(必要な場合にのみ番号を復元します。ただし、いつでも復元できます。)c@framenumber
oldframenumbering
\beamer@@@@frame<#1>[#2]
3 番目に、beamer はで定義されたフレーム番号を処理するためbeamerbaseframe.sty
、その定義をコピーして変更する必要があります。
結局、次のようになります。
\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}