在新框架中重置自定义计数器

在新框架中重置自定义计数器

我正在使用自定义计数器来循环投影仪中的项目符号颜色:

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

结果:

在此处输入图片描述

相关内容