我正在使用自定义计数器来循环投影仪中的项目符号颜色:
\documentclass{beamer}
\usepackage{graphicx,color}
\usepackage[T1]{fontenc}
\usepackage[latin9]{inputenc}
\usepackage{marvosym}
\newcommand{\myitem}[1]{\item[{\textcolor{#1}\Laserbeam}]}
\newcounter{myc}%[frame] <--if I uncomment [frame] it won't compile
\makeatletter
\def\newitem{
\stepcounter{myc}%
\ifnum\value{myc}=1
\myitem{red}
\else\ifnum\value{myc}=2
\myitem{green}
\else\ifnum\value{myc}=3
\myitem{blue}
\setcounter{myc}{0}
\fi\fi\fi
}
\begin{document}
\begin{frame}
\begin{itemize}
\newitem An item
\newitem Another item
\newitem Yet another item
\newitem These items...
\newitem ...are rather boring
\end{itemize}
\end{frame}
\begin{frame}
\begin{itemize}
\newitem An item on a second slide
\newitem Another item
\newitem Yet another item
\newitem These items...
\newitem ...are rather boring
\end{itemize}
\end{frame}
\end{document}
结果如下(2 张幻灯片合并为 1 张图片)
不过,我希望颜色在新帧开始时重置,而不必\setcounter{myc}{0}
在每个\begin{frame}
基于之后插入这个答案我以为我可以使用\newcounter{myc}[frame]
,但是我不能:! LaTeX Error: No counter 'frame' defined.
那么我该如何重置每帧的计数器呢?
答案1
您已经接近:计数器名为framenumber
。有一种更简单的方法可以针对数字情况进行分支。
\documentclass{beamer}
\usepackage{graphicx,color}
\usepackage[T1]{fontenc}
\usepackage[latin9]{inputenc}
\usepackage{marvosym}
\newcommand{\myitem}[1]{\item[{\textcolor{#1}\Laserbeam}]}
\newcounter{myc}[framenumber]
\newcommand\newitem{%
\stepcounter{myc}%
\ifcase\value{myc}%
% no value for 0
\or
\myitem{red}%
\or
\myitem{green}%
\or
\myitem{blue}%
\setcounter{myc}{0}%
\fi
}
\begin{document}
\begin{frame}
\begin{itemize}
\newitem An item
\newitem Another item
\newitem Yet another item
\newitem These items...
\newitem ...are rather boring
\end{itemize}
\end{frame}
\begin{frame}
\begin{itemize}
\newitem An item on a second slide
\newitem Another item
\newitem Yet another item
\newitem These items...
\newitem ...are rather boring
\end{itemize}
\end{frame}
\end{document}
扩展颜色数量的一种更简单的方法是使用xparse
;您只需将\assigncolors{red,green,blue}
或 与任何其他列表一起调用即可。您可以在文档中随时发出此命令,但最好在框架之外执行此命令,以避免多次评估。
\documentclass{beamer}
\usepackage{graphicx,color}
\usepackage[T1]{fontenc}
\usepackage[latin9]{inputenc}
\usepackage{marvosym}
\usepackage{xparse}
\newcounter{myc}[framenumber]
\ExplSyntaxOn
\NewDocumentCommand{\newitem}{}
{
\chris_newitem:
}
\NewDocumentCommand{\assigncolors}{m}
{
\chris_assign_colors:n { #1 }
}
\seq_new:N \g_chris_colors_seq
\int_new:N \l_chris_color_int
\cs_new_protected:Npn \chris_assign_colors:n #1
{
\seq_gset_from_clist:Nn \g_chris_colors_seq { #1 }
}
\cs_new_protected:Npn \chris_newitem:
{
\stepcounter{myc}
\int_set:Nn \l_chris_color_int
{
\int_mod:nn { \value{myc} } { \seq_count:N \g_chris_colors_seq }
}
\int_compare:nT {\l_chris_color_int = 0 }
{
\int_set:Nn \l_chris_color_int { \seq_count:N \g_chris_colors_seq }
}
\chris_do_item:n
{
\seq_item:Nn \g_chris_colors_seq { \l_chris_color_int }
}
}
\cs_new:Npn \chris_do_item:n #1
{
\item[ \textcolor { #1 }{ \Laserbeam } ]
}
\ExplSyntaxOff
\assigncolors{red,green,blue}
\begin{document}
\begin{frame}
\begin{itemize}
\newitem An item
\newitem Another item
\newitem Yet another item
\newitem These items...
\newitem ...are rather boring
\end{itemize}
\end{frame}
\begin{frame}
\begin{itemize}
\newitem An item on a second slide
\newitem Another item
\newitem Yet another item
\newitem These items...
\newitem ...are rather boring
\end{itemize}
\end{frame}
\end{document}
答案2
在这种情况下,最简单的做法是使用etoolbox
它提供了有用的\AtBeginEnvironment
宏。
因此,在每一帧中重置自定义计数器非常简单:
\usepackage{etoolbox}
\AtBeginEnvironment{frame}{\setcounter{myc}{0}}
完整示例:
\documentclass{beamer}
\usepackage{graphicx,color}% not really needed
\usepackage[T1]{fontenc}
\usepackage[latin9]{inputenc}
\usepackage{marvosym}
\usepackage{etoolbox}
\AtBeginEnvironment{frame}{\setcounter{myc}{0}}
\newcommand{\myitem}[1]{\item[{\textcolor{#1}\Laserbeam}]}
\newcounter{myc}%[frame] <--if I uncomment [frame] it won't compile
\makeatletter
\def\newitem{
\stepcounter{myc}%
\ifnum\value{myc}=1
\myitem{red}
\else\ifnum\value{myc}=2
\myitem{green}
\else\ifnum\value{myc}=3
\myitem{blue}
\setcounter{myc}{0}
\fi\fi\fi
}
\begin{document}
\begin{frame}
\begin{itemize}
\newitem An item
\newitem Another item
\newitem Yet another item
\newitem These items...
\newitem ...are rather boring
\end{itemize}
\end{frame}
\begin{frame}
\begin{itemize}
\newitem An item on a second slide
\newitem Another item
\newitem Yet another item
\newitem These items...
\newitem ...are rather boring
\end{itemize}
\end{frame}
\end{document}
结果: