我正在尝试为我的演示文稿创建手动连续注释(因为我需要比 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
命令不是我发出的。我发现了它这里