计算 Beamer 演示进度(不包括附录)

计算 Beamer 演示进度(不包括附录)

问题描述

在尝试计算 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 包,它会自动从编号/进度条中排除附录中的幻灯片

相关内容