我希望有投影仪幻灯片,其中一张幻灯片和下一张幻灯片之间的变化是标准项目符号被勾号或叉号替换。我的第一次尝试:
\begin{itemize}
\item[\onslide<2->{\tick}] Foo
\item[\onslide<3->{\cross}] Bar
\item[\onslide<4->{\tick}] Foo, again.
\end{itemize}
不幸的是,这不太管用,因为正常的项目符号不存在(也就是说,在出现勾号或叉号之前,每个项目的左边什么都没有)。所以我想做这样的事情:
\begin{itemize}
\item[\only<1>{\normalsymbol}\only<2->{\tick}] Foo
\item[\only<1-2>{\normalsymbol}\only<3->{\cross}] Bar
\item[\only<1-3>{\normalsymbol}\only<4->{\tick}] Foo, again.
\end{itemize}
目前,我刚刚找到我正在使用的内部主题,并复制了定义 itemize 符号的代码并完成了\newcommand
。但这并不令人满意,因为如果我想更改内部主题,我必须重新定义它。所以对于我当前的主题(德累斯顿),我有:
\newcommand{\normalsymbol}{\scriptsize\raise1.25pt\hbox{\donotcoloroutermaths$\blacktriangleright$}}
所以我的问题有两个部分:是否有一个命令可以保存当前内部主题的项目符号?还有,有没有更好的方法来实现我想要的?我特别喜欢<+->
在可以的时候使用,这样我就可以添加项目而不更改所有数字......
重申一下,上面的代码应该做的是让所有项目都出现在第一张幻灯片上。然后在每张渐进式幻灯片上,项目符号将替换为勾号或叉号,具体取决于我是否喜欢该项目。上面的代码实现了我想要的功能,但它并不令人满意,因为 (1)\normalsymbol
必须手动设置宏,并且 (2) 必须明确指定幻灯片过渡。
答案1
首先,beamer 使用模板(itemize item
、itemize subitem
、itemize subsubitem
)来排版项目符号。请参阅 beamer 手册中的“项目化、枚举和描述”部分(我的版本为 11.1)。如果您阅读源文件beamerinnerthemedefault.sty
,beamerbaseauxtemplates.sty
您可以看到声明此模板的其他选项的语法。因此,要定义勾号(我理解为复选标记)和跨项目图标,您可以执行以下操作:
\usepackage{pifont}
\defbeamertemplate{itemize item}{cross}{\scriptsize\raise1.25pt\hbox{\donotcoloroutermaths\ding{54}}}
\defbeamertemplate{itemize subitem}{cross}{\tiny\raise1.25pt\hbox{\donotcoloroutermaths\ding{54}}}
\defbeamertemplate{itemize subsubitem}{cross}{\tiny\raise1.25pt\hbox{\donotcoloroutermaths\ding{54}}}
\defbeamertemplate{itemize item}{tick}{\scriptsize\raise1.25pt\hbox{\donotcoloroutermaths\ding{52}}}
\defbeamertemplate{itemize subitem}{tick}{\tiny\raise1.25pt\hbox{\donotcoloroutermaths\ding{52}}}
\defbeamertemplate{itemize subsubitem}{tick}{\tiny\raise1.25pt\hbox{\donotcoloroutermaths\ding{52}}}
然后,如果您想将这些图标设为默认图标,您只需执行以下操作:
\setbeamertemplate{itemize item}[cross] % and so on.
但是要使用自定义图标突出显示当前项目,您可以执行以下操作:
\documentclass{beamer}
\useinnertheme{rectangles}% or whatever inner theme you want
% template defs from above
\makeatletter
\newenvironment{crossenv}{%
\only{%
\beamer@computepref\@itemdepth% sets \beameritemnestingprefix
\setbeamertemplate{itemize \beameritemnestingprefix item}[cross]
}% overlay/action specification gets added here by beamer
}{%
}
\newenvironment{tickenv}{%
\only{%
\beamer@computepref\@itemdepth% sets \beameritemnestingprefix
\setbeamertemplate{itemize \beameritemnestingprefix item}[tick]
}% overlay/action specification gets added here by beamer
}{%
}
\makeatother
\begin{document}
\begin{frame}{Single list}
\begin{itemize}
\item<1- | tick@+-> foo
\item<1- | cross@+-> bar
\item<1- | tick@+-> foo, again
\end{itemize}
\end{frame}
\begin{frame}{Nested lists}
\begin{itemize}[<1-| cross@+>]
\item foo
\item bar
\begin{itemize}
\item bar one
\item bar none
\begin{itemize}
\item bar who?
\item bar none
\end{itemize}
\end{itemize}
\item baz
\end{itemize}
\end{frame}
\end{document}
由于 crossenv 环境围绕着每个选定的项目,因此模板的更改是当地的。在 crossenv 环境之后,模板将恢复到之前的状态。这意味着您不需要知道默认情况下符号是什么。因此这将适用于您正在使用的任何内部主题。
最终编辑:我想我终于明白了你想要什么。你只需要在当前条目级别更改模板,这需要一点技巧。但深入研究后beamerbaselocalstructure.sty
发现了一个解决方案。
最终最终编辑:现在有勾号和叉号。