
講演の複数の場所で特定のフレームを繰り返したいと思います。ただし、そのたびに、すべての項目がカバーされるか、項目 i のみがカバーされるかのいずれかにする必要があります。すべての項目がカバーされるか、項目 i のみがカバーされるフレームを生成できるマクロを定義するにはどうすればよいでしょうか。
例
次のコードは 4 つのスライドを生成します。
- すべてのアイテムが発見されました
- 項目3のみ明らかに
- 項目 1 のみがカバーされていない
- 項目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}
こうすることで、異なるフレームに対して異なるラベルで同じコマンドを使用できるようになります。つまり、構文は似ていますが (引数が 1 つ増えるだけ)、柔軟性が大幅に高まります。ただし、\againframe
この場合は を使用することもできます。
答え2
これは、単純な条件チェックによる 1 つの解決策です\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}