语境
我是尝试对参数进行一些基本操作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}