Beamer - Schreiben eines Makros, um nur Element i einer Aufzählung in einem Frame aufzudecken

Beamer - Schreiben eines Makros, um nur Element i einer Aufzählung in einem Frame aufzudecken

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.

  1. Alle Artikel aufgedeckt
  2. Nur Punkt 3 aufgedeckt
  3. Nur Punkt 1 aufgedeckt
  4. 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, \repeatingframeum dies zu erreichen?

Antwort1

Anstatt einen neuen Befehl zu definieren, würde ich die \againframevon 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}

Wiederholen eines Repeater-Frames mit Variationen

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. \againframeIn diesem Fall können Sie jedoch auch Folgendes verwenden.

Antwort2

Dies ist eine mögliche Lösung durch eine einfache \ifnum #1=xx ... \else ... \fiBedingungsprüfung.

Bildbeschreibung hier eingeben Bildbeschreibung hier eingeben Bildbeschreibung hier eingeben Bildbeschreibung hier eingeben

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}

Ausgabe

verwandte Informationen