Beamer - 编写一个宏来仅发现框架中枚举的第 i 项

Beamer - 编写一个宏来仅发现框架中枚举的第 i 项

我想在我的演讲中在多个位置重复某个框架。但是,每次我都希望所有项目都被覆盖,或者只覆盖项目 i。如何定义一个宏,使其能够生成一个框架,其中所有项目都被覆盖,或者只覆盖项目 i?


例子

以下代码生成 4 张幻灯片。

  1. 所有未发现的物品
  2. 仅第 3 项未覆盖
  3. 仅发现第 1 项
  4. 仅第 2 项未覆盖

代码:

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

我想使用以下更简洁的代码来生成相同的输出:

\repeatingframe{0}
\repeatingframe{3}
\repeatingframe{1}
\repeatingframe{2}

我该如何定义宏\repeatingframe来实现这一点?

答案1

我不会定义一个新命令,而是使用它自己\againframe提供的功能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}

重复使用带有变化的转发器框架

如果这是一次性的,并且您确实想使用特定命令来重复此特定帧,您可以尝试:

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

这会产生相同的输出,但灵活性稍差。

\newcommand<>{\repeatingframe}[1]{%
  \againframe#2{#1}}

可以让你写

\repeatingframe<1>{repeater}

\againframe这样您就可以对不同的框架使用带有不同标签的相同命令,即语法相似(仅多一个参数),但灵活性更高。但是,在这种情况下,您不妨使用。

答案2

这是一个通过简单的\ifnum #1=xx ... \else ... \fi条件检查就能实现的可能的解决方案。

在此处输入图片描述 在此处输入图片描述 在此处输入图片描述 在此处输入图片描述

代码

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

答案3

这是一个更通用的方法,您还可以确定项目的总数并为单个框架提供替代标题:

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

输出

相关内容