如何使用 pgfkeys 对覆盖参数进行数学运算(处理数字和范围)

如何使用 pgfkeys 对覆盖参数进行数学运算(处理数字和范围)

语境

我是尝试对参数进行一些基本操作pgfkeys,在尝试用它们进行简单的算术运算时遇到了困难。幸运的是,egreg给出了一个很好的解决方案用于处理覆盖的算法。

问题

所以,手头的问题。我想要一种强大的方法来处理要使用的叠加层的参数,pgfkeys以便能够对它们进行算术运算(例如<#1+2><2*#1-1>),同时也能够很好地处理它们的范围(例如<2-><+->)。在范围上,我不确定是否可以添加到范围的开始或结束,但这也很方便(例如,作为输入给出<2->,并且看起来<#1+1>我们应该<3->在计算时将其作为范围获得)。

egreg的解决方案非常好,因为它\numexpr扩展了密钥上的算法onslide。但是,如何扩展此解决方案以适应如此复杂的情况?

\documentclass{beamer}
\usepackage{tikz}
\tikzset{
  onslide/.code args={<#1>#2}{%
    \expandafter\only\expandafter<\the\numexpr#1\relax>{\pgfkeysalso{#2}}%
  },
  mycolor/.style={text=red},
  opaque/.style={opacity=0.5, text opacity=0.5},
  animate/.style={onslide=<#1>{mycolor}, onslide=<#1+1>{opaque}},
}


\begin{document}
\begin{frame}[plain]{Same with forest}
\begin{tikzpicture}
% This works
\node[rectangle, animate={1}] at (0,1) {On slide 1};
\node[rectangle, animate={2}] at (0,2) {On slide 2};
\node[rectangle, animate={3}] at (0,3) {On slide 3};
% But this doesn't
\node[rectangle, animate={4-}] at (0,3) {On slide 4};
\node[rectangle, animate={+-}] at (0,3) {On slide 5};

\end{tikzpicture}

\end{frame}
\end{document}

因此,扩展应如下所示:

  • 输入#1 := 1,则<#1><#1+1>应该变成<1><2>
  • 输入#1 := 2-,则<#1><#1+1>应该变成<2-><3->
  • 输入#1 := +-,则<#1><#1+1>应该变成<+-><+(1)->

也就是说,基本上就是对给定的范围执行操作。对于复杂的范围,可能更困难。

概括

因此,总而言之,我只是试图对参数进行数学运算,以便能够随意更改 中的范围pgfkey。但是,由于参数未解析为数字,因此变得更加困难。因此,对输入和范围进行简单的操作也可以。

答案1

您可以修改 ,<1,3-4,+->而不必将其变成。<2,4-5,+(1)->\beamer@slideinframe

\documentclass{beamer}
    \usepackage{tikz}
\begin{document}
\makeatletter
\tikzset{
    onslide'/.code args={<#1>[#2]#3}{%
        \pgfmathtruncatemacro\beamer@slideinframe{\beamer@slideinframe-#2}%
        \expandafter\only\expandafter<#1>{\pgfkeysalso{#3}}%
    },
    onslide/.code args={<#1>#2}{%
        \expandafter\only\expandafter<#1>{\pgfkeysalso{#2}}%
    },
    mycolor/.style={text=red},
    opaque/.style={opacity=0.5, text opacity=0.5},
    animate/.style={onslide={<#1>{mycolor}}, onslide'={<#1>[+1]{opaque}}},
}
    \begin{frame}[plain]{Same with forest}
        \begin{tikzpicture}
            \node[rectangle, animate={1}] at (0,1) {On slide 1};
            \node[rectangle, animate={2}] at (0,2) {On slide 2};
            \node[rectangle, animate={3}] at (0,3) {On slide 3};
            \node[rectangle, animate={4-}] at (0,4) {On slide 4};
            \node[rectangle, animate={+-}] at (0,5) {On slide 5};
        \end{tikzpicture}
        \vfill\hfill
        ((this is slide \the\beamer@slideinframe))
    \end{frame}
\end{document}

相关内容