beamer
我想使用外部图片显示演示的进度。
假设我们现在位于 200 张幻灯片中的第 24 张幻灯片,那么我想
12.png
在当前幻灯片上显示一张名为 (24/200 = 12%) 的图片。
我已经能够计算出进度的百分比但我不能使用 \pgfmathresult(\pgfmathprintnumber[precision=0]{\pgfmathresult}
,在我的 MWE 中给出了当前幻灯片的进度百分比)作为文件名的一部分(错误! Missing \endcsname inserted.
)。
我使用calc
库来tikz/pgf
进行计算。
在 MWE 中,我输入了一个外部tex
文件以模拟插入图片。
\documentclass{beamer}
\usepackage{filecontents}
\begin{filecontents}{33.tex}
File with name \texttt{33.tex}.
\end{filecontents}
\begin{filecontents}{67.tex}
File with name \texttt{67.tex}.
\end{filecontents}
\begin{filecontents}{100.tex}
File with name \texttt{100.tex}.
\end{filecontents}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
%% Start of Frame
\begin{frame}
\frametitle{Frame Title}
%
\begin{description}
\item[Current Frame Number] \insertframenumber
\item[Total Frame Number] \inserttotalframenumber
\item[Progress in Percent]
\pgfmathparse{min((100*\insertframenumber/\inserttotalframenumber),100)}
\pgfmathprintnumber[precision=0]{\pgfmathresult}\,\%
\end{description}
%
\input{33.tex}
\end{frame}
%% Start of Frame
\begin{frame}
\frametitle{Frame Title}
%
\begin{description}
\item[Current Frame Number] \insertframenumber
\item[Total Frame Number] \inserttotalframenumber
\item[Progress in Percent]
\pgfmathparse{min((100*\insertframenumber/\inserttotalframenumber),100)}
\pgfmathprintnumber[precision=0]{\pgfmathresult}\,\%
\end{description}
%
\input{67.tex}
\end{frame}
%% Start of Frame
\begin{frame}
\frametitle{Frame Title}
%
\begin{description}
\item[Current Frame Number] \insertframenumber
\item[Total Frame Number] \inserttotalframenumber
\item[Progress in Percent]
\pgfmathparse{min((100*\insertframenumber/\inserttotalframenumber),100)}
\pgfmathprintnumber[precision=0]{\pgfmathresult}\,\%
\end{description}
%
\input{100.tex}
\end{frame}
\end{document}
当您首次编译文档时,
\inserttotalframenumber
其值为 1(一)。因此,如果您在幻灯片 3(三)上,则当前进度百分比为 300(幻灯片 3,共 1 张)。因此,我使用该min
函数将计算结果限制为最大 100。
有关的
答案1
这利用了expl3
易于计算和将值存储到属性列表中的特点,该\prop_item:Nn
命令是可扩展的,而扩展内容在环境组\pgfmathresult
中不存在description
,它很0.0
可能会显示出来。
包装器命令\retrievepercentage
也是可扩展的,并且可以用作参数来\input
生成相应的文件名。
\documentclass{beamer}
\usepackage{filecontents}
\begin{filecontents}{33.tex}
File with name \texttt{33.tex}.
\end{filecontents}
\begin{filecontents}{67.tex}
File with name \texttt{67.tex}.
\end{filecontents}
\begin{filecontents}{100.tex}
File with name \texttt{100.tex}.
\end{filecontents}
\usepackage{tikz}
\usepackage{xparse}
\usetikzlibrary{calc}
\ExplSyntaxOn
\int_new:N \l_beamer_percentage_int
\prop_new:N \g_beamer_percentage_prop
\NewDocumentCommand{\getpercentage}{}{%
\int_set:Nn \l_beamer_percentage_int {\fp_to_int:n {\fp_eval:n { min((100*\insertframenumber/\inserttotalframenumber),100)}}}
\prop_gput:NnV \g_beamer_percentage_prop {percentage} { \l_beamer_percentage_int }
}
\newcommand{\retrievepercentage}{%
\prop_item:Nn \g_beamer_percentage_prop {percentage}
}
\ExplSyntaxOff
\begin{document}
%% Start of Frame
\begin{frame}
\frametitle{Frame Title}
%
\begin{description}
\item[Current Frame Number] \insertframenumber
\item[Total Frame Number] \inserttotalframenumber
\item[Progress in Percent]
\getpercentage%
\retrievepercentage
\end{description}
%
\input{\retrievepercentage.tex}
\end{frame}
%% Start of Frame
\begin{frame}
\frametitle{Frame Title}
%
\begin{description}
\item[Current Frame Number] \insertframenumber
\item[Total Frame Number] \inserttotalframenumber
\item[Progress in Percent]
\getpercentage%
\retrievepercentage
\end{description}
%
\input{\retrievepercentage.tex}
\end{frame}
%% Start of Frame
\begin{frame}
\frametitle{Frame Title}
%
\begin{description}
\item[Current Frame Number] \insertframenumber
\item[Total Frame Number] \inserttotalframenumber
\item[Progress in Percent]
\getpercentage%
\retrievepercentage
\end{description}
\input{\retrievepercentage.tex}
\end{frame}
\end{document}
解决方案的详细信息。
如上所述,由于这是 TeX 组,因此\pgfmathresult
不会将结果存储在环境中。description
一种可能的绕过方法是使用\xdef
基于的方法,即\xdef\foo{\pgfmathresult}
全局扩展的定义,即在定义时\foo
包含的值。\pgfmathresult
我尝试了另一种策略来计算百分比的结果expl3
(即将推出的 (;-)) LaTeX 3 格式)
让我们看一下代码...
\int_new:N \l_beamer_percentage_int
定义一个新的整数“变量”(内部它是一个 TeX 计数寄存器)
\prop_new:N \g_beamer_percentage_prop
定义一个属性列表,它类似于expl3
哈希表或数组的版本,即可以定义键名并为其分配值。
\fp_to_int:n {\fp_eval:n {min((100*\insertframenumber/\inserttotalframenumber),100)}}
计算 ( \fp_eval:n
) 浮点 (fp) 表达式,与min(...)
基本相同pgfmath
。计算后,将其转换 ('截断') 为整数值,并存储到\l_beamer_percentage_int
中\int_set:Nn
。
设置操作不可扩展,它不能用于扩展链,例如像这里请求的文件名生成一样,但将值存储到属性列表中是一种可能的方法
\prop_gput:NnV \g_beamer_percentage_prop {percentage} { \l_beamer_percentage_int }
这意味着:全局将 的值 (V) 放入 (gput)\l_beamer_percentage_int
命名的列表中\g_beamer_percentage_prop
并将其分配给键percentage
。
最后,调用命令\prop_item:Nn \g_beamer_percentage_prop {percentage}
是获取存储值的速度较慢但可扩展的版本。
我参考了的描述texdoc interface3
来了解所使用的名称约定的详细信息expl3
。
答案2
您可以定义一个可扩展的命令:
\begin{filecontents}{33.tex}
File with name \texttt{33.tex}.
\end{filecontents}
\begin{filecontents}{67.tex}
File with name \texttt{67.tex}.
\end{filecontents}
\begin{filecontents}{100.tex}
File with name \texttt{100.tex}.
\end{filecontents}
\documentclass{beamer}
\usepackage{xparse}
\ExplSyntaxOn
\DeclareExpandableDocumentCommand{\percentageofpresentation}{}
{
\fp_to_int:n { 100*\insertframenumber/\inserttotalframenumber }
}
\ExplSyntaxOff
\begin{document}
%% Start of Frame
\begin{frame}
\frametitle{Frame Title}
%
\begin{description}
\item[Current Frame Number] \insertframenumber
\item[Total Frame Number] \inserttotalframenumber
\item[Progress in Percent] \percentageofpresentation
\end{description}
%
\InputIfFileExists{\percentageofpresentation.tex}{}{NOT YET COMPUTED}
\end{frame}
%% Start of Frame
\begin{frame}
\frametitle{Frame Title}
%
\begin{description}
\item[Current Frame Number] \insertframenumber
\item[Total Frame Number] \inserttotalframenumber
\item[Progress in Percent] \percentageofpresentation
\end{description}
%
\InputIfFileExists{\percentageofpresentation.tex}{}{NOT YET COMPUTED}
\end{frame}
%% Start of Frame
\begin{frame}
\frametitle{Frame Title}
%
\begin{description}
\item[Current Frame Number] \insertframenumber
\item[Total Frame Number] \inserttotalframenumber
\item[Progress in Percent] \percentageofpresentation
\end{description}
%
\InputIfFileExists{\percentageofpresentation.tex}{}{NOT YET COMPUTED}
\end{frame}
\end{document}
我们解决了第一次运行 LaTeX时\InputIfFileExists
遇到的问题。在您的项目中,您可以这样做
\IfFileExists{\percentageofpresentation.png}
{\includegraphics{\percentageofpresentation.png}}
{NOT YET COMPUTED}