![覆盖块中的警报项](https://linux22.com/image/287977/%E8%A6%86%E7%9B%96%E5%9D%97%E4%B8%AD%E7%9A%84%E8%AD%A6%E6%8A%A5%E9%A1%B9.png)
考虑以下 MWE:
\documentclass{beamer}
\begin{document}
\begin{frame}
\frametitle{Test}
\begin{block}{First}
block
\end{block}
\begin{block}{Second}
\begin{itemize}
\item Foo
\item Bar
\end{itemize}
\end{block}
\end{frame}
\end{document}
到目前为止,一切都很简单。现在,让我们叠加这些块:
\documentclass{beamer}
\begin{document}
\begin{frame}
\frametitle{Test}
\begin{block}<1->{First}
block
\end{block}
\begin{block}<2->{Second}
\begin{itemize}
\item Foo
\item Bar
\end{itemize}
\end{block}
\end{frame}
\end{document}
仍然很好很简单。现在,我想要的是覆盖第二个块中的项目并提醒它们。
\documentclass{beamer}
\begin{document}
\begin{frame}
\frametitle{Test}
\begin{block}<1->{First}
block
\end{block}
\begin{block}<2->{Second}
\begin{itemize}
\item\alert<+(1)> {Foo}
\item\alert<+(1)> {Bar}
\end{itemize}
\end{block}
\end{frame}
\end{document}
有没有办法缩短覆盖规范?我尝试了很多变体,<+-| @alert+>
但都没有用。我可以从中编写代码这个答案可以工作,但它仍然不够灵活。所以我的问题是:有没有更好、更灵活、更通用的方法来实现这种覆盖?
答案1
包含 3 张幻灯片
\documentclass{beamer}
\begin{document}
\begin{frame}
\frametitle{Test}
\begin{block}<+->{First}
block
\end{block}
\begin{block}<+->{Second}
\begin{itemize}
\item<.-|alert@.> Foo
\item<+-|alert@+> Bar
\end{itemize}
\end{block}
\end{frame}
\end{document}
分解后的版本:
\documentclass{beamer}
\begin{document}
\begin{frame}
\frametitle{Test}
\begin{block}<+->{First}
block
\end{block}
\begin{block}<+->{Second}
\begin{itemize}[<+-|alert@+>]
\item<.-|alert@.> Foo
\item Bar
\end{itemize}
\end{block}
\end{frame}
\end{document}
包含 4 张幻灯片
语法与第一个例子类似的版本:
\documentclass{beamer}
\begin{document}
\begin{frame}
\frametitle{Test}
\begin{block}<+->{First}
block
\end{block}
\begin{block}<+->{Second}
\begin{itemize}
\item<+-|alert@+> Foo
\item<+-|alert@+> Bar
\end{itemize}
\end{block}
\end{frame}
\end{document}
具有分解语法的版本:
\documentclass{beamer}
\begin{document}
\begin{frame}
\frametitle{Test}
\begin{block}<+->{First}
block
\end{block}
\begin{block}<+->{Second}
\begin{itemize}[<+-|alert@+>]
\item Foo
\item Bar
\end{itemize}
\end{block}
\end{frame}
\end{document}
答案2
也许这就是你要找的。我创建了一个宏(不是环境!),\makealerts{}
你可以通过它传递要连续用警报突出显示的组。
已编辑,以宽容参数列表末尾的额外空格\makealerts
(在此 MWE 中,宽容随后的换行符{Bar none}
)。
\documentclass{beamer}
\usepackage{readarray}
\usepackage{ifthen}
\newcounter{index}
\newcommand\makealerts[1]{\itemize\relax
\getargsC{#1}%
\ifthenelse{\equal{\csname arg\romannumeral\narg\endcsname}{}}%
{\def\maxnarg{\numexpr\narg-1\relax}}{\def\maxnarg{\narg}}%
\setcounter{index}{0}%
\whiledo{\theindex<\maxnarg}{%
\stepcounter{index}%
\item\alert<+(1)> {\csname arg\romannumeral\theindex\endcsname}%
}%
\enditemize%
}
\begin{document}
\begin{frame}
\frametitle{Test}
\begin{block}<1->{First}
block
\end{block}
\begin{block}<2->{Second}
\makealerts{%
{Foo of many words}
{Bar none}
}
\end{block}
\end{frame}
\end{document}