问题描述
在尝试计算 Beamer 演示的进度时,可以使用
\pgfmathtruncatemacro{\prog}{100*(\insertpagenumber)/(\insertdocumentendpage)}
其中\prog
跟踪进度的百分比值。
考虑到演示文稿可能包含附录,并将其中的幻灯片排除在 的计算之外\prog
,我自然想到可以简单地更改\insertdocumentendpage
为\insertpresentationendpage
,或者\insertappendixstartpage-1
当附录确实存在时。但是,这样做会导致错误:
软件包 PGF 数学错误:未知运算符 `=' 或 `=4'(在 '100*(3)/({\beamer@tempcount =4\relax 0})' 中)。
如果\insertappendixendpage
使用,则不会出错(但是的值\prog
会错误)。
下面的 MWE 不包含附录,所以四个\insert<...>
s 应该具有相同的值。但是,取消注释最后两帧中的任何一帧都会导致上述错误。
\documentclass{beamer}
\begin{document}
\frame{
\pgfmathtruncatemacro{\prog}{100*(\insertpagenumber)/(\insertdocumentendpage)}
progress = \prog
}
\frame{
\pgfmathtruncatemacro{\prog}{100*(\insertpagenumber)/(\insertappendixendpage)}
progress = \prog
}
% \frame{
% \pgfmathtruncatemacro{\prog}{100*(\insertpagenumber)/(\insertappendixstartpage-1)}
% progress = \prog
% }
% \frame{
% \pgfmathtruncatemacro{\prog}{100*(\insertpagenumber)/(\insertpresentationendpage)}
% progress = \prog
% }
\end{document}
问题
为什么会出现这种情况?我该如何纠正?
编辑(基于汤姆·邦巴迪尔的长评论)
尝试将其添加到框架外面:
\typeout{======================================}
\show\insertdocumentendpage
\typeout{======================================}
\show\insertpresentationendpage
\typeout{======================================}
\show\insertappendixstartpage
\typeout{======================================}
等号就在那里,这样更容易找到。日志文件。这将返回
======================================
> \insertdocumentendpage=\long macro:
->\beamer@endpageofdocument .
l.27 \show\insertdocumentendpage
======================================
> \insertpresentationendpage=\long macro:
->{\ifx \beamer@startpageofappendix \@empty \beamer@tempcount =\beamer@endpageo
fdocument \relax \else \beamer@prevpage \beamer@startpageofappendix \relax \fi
\the \beamer@tempcount }.
l.29 \show\insertpresentationendpage
======================================
> \insertappendixstartpage=\long macro:
->{\ifx \beamer@startpageofappendix \@empty \beamer@tempcount =\beamer@endpageo
fdocument \relax \else \beamer@tempcount =\beamer@startpageofappendix \relax \f
i \the \beamer@tempcount }.
l.31 \show\insertappendixstartpage
======================================
\insertdocumentendpage
显然,这个问题与只返回一个值,而\insertpresentationendpage
和返回一个需要先求值的表达式有关\insertappendixstartpage
。因此,这个问题可以细化为
- 如何才能
\pgfmathparse
首先强制评估这一点? - 如何在宏中保存这种表达式的结果?
答案1
您还可以为这些编写自己的宏,beamer
代码确实很奇怪。但是,顾名思义,这些不应该被期望是简单的数字,因为数字是插入的,因此警告不扩展。
\documentclass{beamer}
\usepackage{tikz}
\usetheme{Warsaw}
\makeatletter
\gdef\appendixstartpageno{%
\ifx\beamer@startpageofappendix\@empty%
\beamer@endpageofdocument%
\else%
\beamer@startpageofappendix%
\fi%
}
\gdef\presentationendpageno{%
\ifx\beamer@startpageofappendix\@empty%
\beamer@endpageofdocument%
\else%
\number\numexpr\appendixstartpageno-1\relax%
\fi
}
\makeatother
\begin{document}
\foreach \x in {1,...,17}{
\begin{frame}{Frame \x: Progress \pgfmathtruncatemacro{\prog}{round(100*(\insertpagenumber/\presentationendpageno))}\prog \%}
Dummy frame \x
\pgfmathtruncatemacro{\prog}{round(100*(\insertpagenumber/\presentationendpageno))}
\tikz{\fill[blue!20](0,0) rectangle ({(\prog/100)*1cm},5mm) node[below right] {\prog \%};
\draw(0,0) rectangle (1cm,5mm);
}
\end{frame}
}
\appendix
\foreach \x in {1,...,10}{
\begin{frame}{Frame \x}
Dummy appendix frame \x
\end{frame}
}
\end{document}
答案2
通过附录,您可以使用 TeX 计数\beamer@startpageofappendix
。
\documentclass{beamer}
\makeatletter
\def\insertprogress{
\pgfmathtruncatemacro{\prog}{100*(\insertpagenumber)/(\beamer@startpageofappendix - 1)}
\prog
}
\makeatother
\begin{document}
\frame{progress = \insertprogress}
\frame{progress = \insertprogress}
\frame{before appendix; progress = \insertprogress}
\appendix
\frame{Appendix A}
\frame{Appendix B}
\end{document}
答案3
您可以使用附录编号投影仪CTAN 包,它会自动从编号/进度条中排除附录中的幻灯片