计数器和 \pause 的问题

计数器和 \pause 的问题

我正在尝试为我的演示文稿创建手动连续注释(因为我需要比 beamer 的自动分割功能所提供的更大的灵活性)。

我想到的是,为每组幻灯片创建一个计数器,然后在该序列的每一张连续幻灯片上增加并打印其值。

如果我“手动”执行此操作,一切都会正常进行。

然后我尝试将事情自动化一些,如下所示。该countslides命令接受一个参数,使用该参数作为其名称构建一个计数器(如果不存在),然后增加并打印其值。

不幸的是,代码在第一张幻灯片上产生了错误“缺失数字,视为零”(尽管结果是正确的)。如果我删除\pause此幻灯片上的命令(或者如果我从命令定义中删除\resetcounteronoverlays,但我无法承受),错误就会消失。

也许我的代码是错误的,但我看不出为什么(并且在所有其他情况下它都运行良好)。

\documentclass{beamer}
\usepackage{ifthen}
\begin{document}

\makeatletter
\newcommand{\countslides}[1]{%
  \ifthenelse{\expandafter\isundefined\csname c@cnt#1\endcsname}%
    {\newcounter{cnt#1}%
     \resetcounteronoverlays{cnt#1}%
    }%
    {}%
  \stepcounter{cnt#1}%
  {~\footnotesize (\arabic{cnt#1})}%
}
\makeatother

\begin{frame}
\frametitle{Hello \countslides{abc}}
A
\pause
B
\end{frame}

\begin{frame}
\frametitle{Bye \countslides{abc}}
C
\pause
D
\end{frame}

\end{document}

答案1

解决方案 0:如果您可以接受分离初始定义:

\documentclass{beamer}

\makeatletter
\newcommand\countable[1]{%
  \newcounter{cnt#1}%
  \resetcounteronoverlays{cnt#1}%
}
\newcommand{\countslides}[1]{%
  \stepcounter{cnt#1}%
  {~\footnotesize (\arabic{cnt#1})}%
}
\makeatother
\begin{document}


\countable{abc}
\begin{frame}
\frametitle{Hello \countslides{abc}}
A
\pause
B
\end{frame}

\begin{frame}
\frametitle{Bye \countslides{abc}}
C
\pause
D
\end{frame}

\end{document}

我觉得比较清晰的一个解决方案是:你为有问题的框架提供 contgroup=... 键,它们都应该表现得好像它们自动被破坏了一样,即应用了正常的延续标题模板。

\documentclass{beamer}

\makeatletter

\newcommand\handlecontgroup[1]{%
  \only<1>{%
    \ifcsname ums@cntgroup@#1\endcsname
      \relax
    \else
      \expandafter\gdef\csname ums@cntgroup@#1\endcsname{0}%
    \fi
    \beamer@autobreakcount=\csname ums@cntgroup@#1\endcsname\relax
    \advance\beamer@autobreakcount by 1\relax
    \expandafter\xdef\csname ums@cntgroup@#1\endcsname{%
      \the\beamer@autobreakcount}%
  }%
}
\define@key{beamerframe}{contgroup}{\handlecontgroup{#1}}%
\makeatother
\begin{document}


\begin{frame}[contgroup=abc]
\frametitle{Hello}
A
\pause
B
\end{frame}

\begin{frame}[contgroup=abc]
\frametitle{Bye}
C
\pause
D
\end{frame}

\begin{frame}
\frametitle{Bye}
C
\pause
D
\end{frame}

\begin{frame}[contgroup=abc]
\frametitle{Bye}
C
\pause
D
\end{frame}

\end{document}

答案2

您是否尝试过删除\resetcounteronoverlays{cnt#1}错误的根源"Missing number, treated as zero",然后简单地用\stepcounter{cnt#1}替换\only<1>{\stepcounter{cnt#1}}

就我而言,这个肮脏的替代代码(使用这个技巧)有效

\makeatletter%
\newcommand*\ifcounter[1]{%
  \ifcsname c@#1\endcsname%
    \expandafter\@firstoftwo%
  \else%
    \expandafter\@secondoftwo%
  \fi}
\makeatother

\newcommand{\countslide}[1]{%
\ifcounter{#1}{
% clause for existing counter
}{%
% clause for non existing counter
\newcounter{#1}%
\regtotcounter{#1}%
}%
\only<1>{\addtocounter{#1}{1}}%
\arabic{#1}/\total{#1}%
}

并在文档中

\begin{frame}{Title \countslide{abc}}
...
\end{frame}

注意:该\ifcounter命令不是我发出的。我发现了它这里

相关内容