
Ich möchte einen bestimmten Frame an mehreren Stellen in meinem Vortrag wiederholen. Dabei soll jedoch jedes Mal entweder alles oder nur das Element i aufgedeckt werden. Wie definiere ich ein Makro, das einen Frame mit entweder allen oder nur dem Element i aufgedeckten Elementen generieren kann?
Beispiel
Der folgende Code generiert 4 Folien.
- Alle Artikel aufgedeckt
- Nur Punkt 3 aufgedeckt
- Nur Punkt 1 aufgedeckt
- Nur Punkt 2 aufgedeckt
Code:
\documentclass{beamer}
\setbeamercovered{transparent}
\begin{document}
\begin{frame}{Repeating frame}
\begin{enumerate}
\item \uncover<1>{The is item 1}
\item \uncover<1>{The is item 2}
\item \uncover<1>{The is item 3}
\end{enumerate}
\end{frame}
\begin{frame}{Repeating frame}
\begin{enumerate}
\item \uncover<0>{The is item 1}
\item \uncover<0>{The is item 2}
\item \uncover<1>{The is item 3}
\end{enumerate}
\end{frame}
\begin{frame}{Repeating frame}
\begin{enumerate}
\item \uncover<1>{The is item 1}
\item \uncover<0>{The is item 2}
\item \uncover<0>{The is item 3}
\end{enumerate}
\end{frame}
\begin{frame}{Repeating frame}
\begin{enumerate}
\item \uncover<0>{The is item 1}
\item \uncover<1>{The is item 2}
\item \uncover<0>{The is item 3}
\end{enumerate}
\end{frame}
\end{document}
Ich möchte stattdessen den folgenden, prägnanteren Code verwenden, um die gleiche Ausgabe zu erzeugen:
\repeatingframe{0}
\repeatingframe{3}
\repeatingframe{1}
\repeatingframe{2}
Wie definiere ich das Makro, \repeatingframe
um dies zu erreichen?
Antwort1
Anstatt einen neuen Befehl zu definieren, würde ich die \againframe
von ihm selbst angebotene Funktion verwenden beamer
:
\documentclass{beamer}
\setbeamercovered{transparent}
\begin{document}
\begin{frame}<4>[label=repeater]{Repeating frame}
\begin{enumerate}
\item \uncover<1,4>{The is item 1}
\item \uncover<2,4>{The is item 2}
\item \uncover<3-4>{The is item 3}
\end{enumerate}
\end{frame}
\againframe<1>{repeater}
\againframe<2>{repeater}
\againframe<3>{repeater}
\end{document}
Wenn es sich um ein Einzelstück handelt und Sie wirklich einen bestimmten Befehl verwenden möchten, um diesen bestimmten Frame zu wiederholen, können Sie Folgendes versuchen:
\documentclass{beamer}
\setbeamercovered{transparent}
\newcommand<>{\repeatingframe}{%
\againframe#1{repeater}}
\begin{document}
\begin{frame}<4>[label=repeater]{Repeating frame}
\begin{enumerate}
\item \uncover<1,4>{The is item 1}
\item \uncover<2,4>{The is item 2}
\item \uncover<3-4>{The is item 3}
\end{enumerate}
\end{frame}
\repeatingframe<1>
\repeatingframe<2>
\repeatingframe<3>
\end{document}
Dies führt zum gleichen Ergebnis, ist jedoch etwas weniger flexibel.
\newcommand<>{\repeatingframe}[1]{%
\againframe#2{#1}}
würde es Ihnen ermöglichen zu schreiben
\repeatingframe<1>{repeater}
Sie können also denselben Befehl mit unterschiedlichen Bezeichnungen für unterschiedliche Frames verwenden, d. h. mit ähnlicher Syntax (nur ein weiteres Argument), aber viel flexibler. \againframe
In diesem Fall können Sie jedoch auch Folgendes verwenden.
Antwort2
Dies ist eine mögliche Lösung durch eine einfache \ifnum #1=xx ... \else ... \fi
Bedingungsprüfung.
Code
\documentclass{beamer}
\setbeamercovered{transparent}
\newcommand{\repeatingframe}[1]{
\ifnum #1=0
\def\a{1} \def\b{1} \def\c{1}
\else \ifnum #1=3
\def\a{0} \def\b{0} \def\c{1}
\else \ifnum #1=1
\def\a{1} \def\b{0} \def\c{0}
\else \ifnum #1=2
\def\a{0} \def\b{1} \def\c{0}
\fi
\fi
\fi
\fi
\begin{frame}{Repeating frame}
\begin{enumerate}
\item \uncover<\a>{The is item 1}
\item \uncover<\b>{The is item 2}
\item \uncover<\c>{The is item 3}
\end{enumerate}
\end{frame}
}
\begin{document}
\repeatingframe{0}
\repeatingframe{3}
\repeatingframe{1}
\repeatingframe{2}
\end{document}
Antwort3
Hier ist ein allgemeinerer Ansatz, bei dem Sie auch die Gesamtzahl der Elemente bestimmen und einzelnen Frames alternative Titel geben können:
\documentclass{beamer}
\setbeamercovered{transparent}
\usepackage{pgffor}
\makeatletter
\@namedef{theitem1}{The is item 1}
\@namedef{theitem2}{The is item 2}
\@namedef{theitem3}{The is item 3}
\@namedef{theitem4}{The is item 4}
\@namedef{theitem5}{The is item 5}
\@namedef{theitem6}{The is item 6}
\@namedef{theitem7}{The is item 7}
\newcount\uncovered
\newcount\uncovermax
\newcommand{\repeatingframe}[3][Repeating frame]{%
\uncovermax#3
\begin{frame}{#1}
\begin{enumerate}
\itemprocess{#2}
\end{enumerate}
\end{frame}
}
\newcommand{\itemprocess}[1]{%
\begingroup
\uncovered#1
\ifnum\uncovered=0
\foreach \n in {1,...,\the\uncovermax}{%
\item \uncover<1>{\csname theitem\n\endcsname}}
\else
\ifnum\uncovered>1
{\advance\uncovered by -1
\foreach \n in {1,...,\the\uncovered}{%
\item \uncover<0>{\csname theitem\n\endcsname}}}
\fi
\item \uncover<1>{\csname theitem\the\uncovered\endcsname}
\ifnum\uncovered<\uncovermax
{\advance\uncovered by 1
\foreach \n in {\the\uncovered,...,\the\uncovermax}{%
\item \uncover<0>{\csname theitem\n\endcsname}}}
\fi
\fi
\endgroup}%
\makeatother
\begin{document}
\repeatingframe{0}{3}
\repeatingframe{3}{3}
\repeatingframe{1}{3}
\repeatingframe{2}{3}
%for testing the generalized version
%\repeatingframe[Repeating frame with different title]{1}{7}
%\repeatingframe{2}{7}
%\repeatingframe{3}{7}
%\repeatingframe{4}{7}
%\repeatingframe{5}{7}
%\repeatingframe{6}{7}
%\repeatingframe{7}{7}
\end{document}