Beamer / TIKZ / PGF:使用变量(数学 / 计算)作为外部文件的文件名的一部分

Beamer / TIKZ / PGF:使用变量(数学 / 计算)作为外部文件的文件名的一部分

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}

enter image description here

enter image description here

enter image description here

当您首次编译文档时,\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}

相关内容