有没有办法自动计算每张幻灯片上的字数,并将其显示在幻灯片上?我希望此功能仅在我创建幻灯片草稿版本时可用。理想情况下,我应该能够在创建幻灯片的最终版本以供分发时关闭此功能。
平均能量损失
\documentclass{beamer}
\begin{document}
\begin{frame}{First Slide}
This is my first slide.
% I want to generate the word count below automatically
nwords = 7
\end{frame}
\begin{frame}{Second Slide}
This is my second slide.
It has more words than the first slide.
% I want to generate the word count below automatically
nwords = 15
\end{frame}
\end{document}
我之所以问这个问题,是因为有些人建议幻灯片中不要有太多文字。例如,Presentation Magazine 的一篇文章,标题为 每张幻灯片上应该写多少个字? 给出了“每张幻灯片少于 40 个字”的经验法则。因此,知道每张幻灯片有多少个字是很有用的。
答案1
幸好,beamer
框架像环境一样将其主体收集在标记列表中amsmath
。因此,我们可以简单地检查存储内容的标记列表。但是,我们必须为此破解 beamer 框架。框架的所有参数(在本例中{First Slide}
)也计算在内。括号组算作一个标记,其他奇怪之处也适用,请参阅 的文档\seq_set_split
。
\documentclass{beamer}
\usepackage{xparse}
\ExplSyntaxOn
\cs_generate_variant:Nn \seq_set_split:Nnn { Nno }
\NewDocumentCommand \setwordcount { m m }
{
% split the frame contents at spaces
\seq_set_split:Nno \l_tmpa_seq { ~ } { \the#2 }
% remove all mentions of the counter variable
\seq_remove_all:Nn \l_tmpa_seq { #1 }
% set counter
\tl_gset:Nx #1 { \seq_count:N \l_tmpa_seq }
}
\ExplSyntaxOff
\makeatletter
\def\beamer@frameenv{%
\def\beamer@process@envbody{\endgroup%
\setwordcount\insertwordcount\beamer@envbody% Count number of space delimited tokens in the input
\expandafter\expandafter\expandafter\beamer@framecommand\expandafter\beamer@frameoptions\expandafter{\the\beamer@envbody}}%
\global\beamer@envbody{}\def\beamer@begin@stack{b}%
\begingroup
\let\frame\beamer@collect@@body
\def\beamer@process@envbody{\frame}%
\beamer@process@envbody%
}
\makeatother
\begin{document}
\begin{frame}{First Slide}
This is my first slide.
\insertwordcount
\end{frame}
\end{document}
用 ... 来计算单词可能更好l3regex
,但也可能不行。谁知道呢?这是子群中的递归,不计算控制序列,但数学材料仍然很棘手。
这会产生类似的输出,但计数为 7。
\documentclass{beamer}
\usepackage{xparse}
\ExplSyntaxOn
\cs_generate_variant:Nn \regex_count:nnN { noN }
\NewDocumentCommand \setwordcount { m m }
{
% regex match words
\regex_count:noN { \w+ } { \the#2 } \l_tmpa_int
% set counter
\tl_gset:Nx #1 { \int_to_arabic:n \l_tmpa_int }
}
\ExplSyntaxOff
\makeatletter
\def\beamer@frameenv{%
\def\beamer@process@envbody{\endgroup%
\setwordcount\insertwordcount\beamer@envbody% Count number of space delimited tokens in the input
\expandafter\expandafter\expandafter\beamer@framecommand\expandafter\beamer@frameoptions\expandafter{\the\beamer@envbody}}%
\global\beamer@envbody{}\def\beamer@begin@stack{b}%
\begingroup
\let\frame\beamer@collect@@body
\def\beamer@process@envbody{\frame}%
\beamer@process@envbody%
}
\makeatother
\begin{document}
\begin{frame}{First Slide}
This is my first slide.
\insertwordcount
\end{frame}
\end{document}