expl3/xparse:在命令中进行 **if 检查**

expl3/xparse:在命令中进行 **if 检查**

也许问题不够简单——如果是这样,请告诉我。

由于我不明白不同包之间的联系,所以我不知道正确的标题是什么。

有关的

这个问题在某种程度上是

并且还包括

介绍

beamer基本思想是,我使用以下方法计算演示的进度(百分比)

100*\insertframenumber/\inserttotalframenumber

我添加了一个min(progress in percent,100)围绕这一切的东西,因为在第一次运行中\inserttotalframenumber1我不希望进度超过 100。

目前我不知道哪个 LaTeX 包负责我可以min在这里使用该函数。

所以实际上看起来像

min((100*\insertframenumber/\inserttotalframenumber),100)

如果有附录,此过程将会失败,因为我不希望将附录幻灯片考虑在内。

如果有附录,则此方法

min((100*\insertframenumber/(\beamer@startpageofappendix-1))

有效。关键是\beamer@startpageofappendix。但如果没有附录,它会失败,因为那时\beamer@startpageofappendix-1-1(减一)。

主要问题

我认为,如果有一个检查, \beamer@startpageofappendix为零在代码中。根据结果,将使用方法 a) ( \inserttotalframenumber) 或 b) ( )。\beamer@startpageofappendix-1

代码

\documentclass[t]{beamer}

\usepackage{tikz}
\usepackage{calc}
\usepackage{xparse}

\ExplSyntaxOn
    \int_new:N \l_beamer_percentage_int
    \prop_new:N \g_beamer_percentage_prop
    \makeatletter
    \NewDocumentCommand{\myProgressPercent}{}{%
    \int_set:Nn  \l_beamer_percentage_int {
        \fp_to_int:n {
            \fp_eval:n {min((100*\insertframenumber/(\beamer@startpageofappendix-1)),100)}
            %\fp_eval:n {min((100*\insertframenumber/\inserttotalframenumber),100)}
            }
        } 
    \prop_gput:NnV \g_beamer_percentage_prop {percentage} { \l_beamer_percentage_int }
    \prop_item:Nn \g_beamer_percentage_prop {percentage}
    }
    \makeatother
\ExplSyntaxOff

\begin{document}

\foreach \n in {1,...,10}{
%------------------
\begin{frame}
    \frametitle{Slide \n}
    Progress is \myProgressPercent\,\%
\end{frame}
%------------------
}

%  comment \appendix in and out to see the effect
\appendix

\foreach \n in {1,...,3}{
%------------------
\begin{frame}
    \frametitle{Appendix Slide \n}
    Progress is \myProgressPercent\,\% (Should always be 100\,\%)
\end{frame}
%------------------
}

\end{document}

它有效!

谢谢大家-这就是我想要实现的目标的说明。

在此处输入图片描述

答案1

我不确定为什么需要使用这种间接方式:该命令甚至可以完全扩展:

\documentclass[t]{beamer}

\usepackage{tikz}
\usepackage{calc}
\usepackage{xparse}

\ExplSyntaxOn
\DeclareExpandableDocumentCommand{\myProgressPercent}{}
 {
  \fp_to_int:n
   {
    min(
     100*\insertframenumber
     /
     (
      \use:c{beamer@startpageofappendix} - 1 > 0
      ?
      \use:c{beamer@startpageofappendix} - 1
      :
      \inserttotalframenumber
     )
     ,
     100
    )
   }
 }
\ExplSyntaxOff


\begin{document}

\foreach \n in {1,...,10}{
%------------------
\begin{frame}
    \frametitle{Slide \n}
    Progress is \myProgressPercent\,\%
\end{frame}
%------------------
}

%  comment \appendix in and out to see the effect
\appendix

\foreach \n in {1,...,3}{
%------------------
\begin{frame}
    \frametitle{Appendix Slide \n}
    Progress is \myProgressPercent\,\% (Should always be 100\,\%)
\end{frame}
%------------------
}

\end{document}

我们检查是否\beamer@startpageofappendix设置为某个数字(当然大于一),在这种情况下,我们使用它(小于一)。否则我们使用\inserttotalframenumber

请注意,对于您的预期应用,您甚至可以说

\includegraphics{\myProgressPercent.png}

因为\myProgressPercent只会扩展为一个数字。

答案2

\documentclass[t]{beamer}

\usepackage{tikz}
\usepackage{xparse}

\ExplSyntaxOn

\int_new:N \l_beamer_percentage_int
\prop_new:N \g_beamer_percentage_prop

\NewDocumentCommand \myProgressPercent { }
  {
    \int_set:Nn  \l_beamer_percentage_int
      {
        \fp_to_int:n
          {
            \tl_if_empty:cTF { beamer@startpageofappendix }
              {
                \fp_eval:n
                  {
                    min(100*\insertframenumber/\inserttotalframenumber,100)
                  }
              }
              {
                \fp_eval:n
                  {
                    min(100*\insertframenumber/(\use:c {beamer@startpageofappendix}-1),100)
                  }
              }
         }
      }

    \prop_gput:NnV \g_beamer_percentage_prop {percentage} { \l_beamer_percentage_int }
    \prop_item:Nn \g_beamer_percentage_prop {percentage}
  }

\ExplSyntaxOff

\begin{document}

\foreach \n in {1,...,10}{
  % ------------------
  \begin{frame}{Slide \n}
    Progress is \myProgressPercent\,\%
  \end{frame}
  % ------------------
}

%  comment \appendix in and out to see the effect
%\appendix

\foreach \n in {1,...,3}{
  % ------------------
  \begin{frame}{Appendix Slide \n}
    Progress is \myProgressPercent\,\% (Should always be 100\,\%)
  \end{frame}
  % ------------------
}

\end{document}

在此处输入图片描述


稍微简化的版本。

\documentclass[t]{beamer}

\usepackage{tikz}
\usepackage{xparse}

\ExplSyntaxOn

\DeclareExpandableDocumentCommand \myProgressPercent { }
  {
    \tl_if_empty:cTF { beamer@startpageofappendix }
      {
        \fp_to_int:n
          {
            min(100*\insertframenumber/\inserttotalframenumber,100)
          }
      }   
      {
        \fp_to_int:n
          {
            min(100*\insertframenumber/(\use:c {beamer@startpageofappendix}-1),100)
          }
      }
  }

\ExplSyntaxOff

\begin{document}

\foreach \n in {1,...,10}{
  % ------------------
  \begin{frame}{Slide \n}
    Progress is \myProgressPercent\,\%
  \end{frame}
  % ------------------
}

%  comment \appendix in and out to see the effect
%\appendix

\foreach \n in {1,...,3}{
  % ------------------
  \begin{frame}{Appendix Slide \n}
    Progress is \myProgressPercent\,\% (Should always be 100\,\%)
  \end{frame}
  % ------------------
}

\end{document}

相关内容