![如何对 pgfkeys 参数进行数学运算并将其分配给其他键](https://linux22.com/image/321850/%E5%A6%82%E4%BD%95%E5%AF%B9%20pgfkeys%20%E5%8F%82%E6%95%B0%E8%BF%9B%E8%A1%8C%E6%95%B0%E5%AD%A6%E8%BF%90%E7%AE%97%E5%B9%B6%E5%B0%86%E5%85%B6%E5%88%86%E9%85%8D%E7%BB%99%E5%85%B6%E4%BB%96%E9%94%AE.png)
我试图减少使用不同数字反复应用某些叠加的工作量。但是,我需要计算给定帧的下一帧或上一帧,因此需要对给定值进行简单的算术运算。
然而,由于我对 pgfkeys 了解甚少,这项任务显得相当困难。
下面的代码显示了我正在尝试做的事情
\documentclass{beamer}
\usepackage{tikz}
\tikzset{
onslide/.code args={<#1>#2}{%
\only<#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{document}
\begin{frame}[plain]{Same with forest}
\begin{tikzpicture}
% I want something like this
\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};
% Instead of something like this
%\node[rectangle, onslide=<1>{mycolor}, onslide=<2>{opaque}] at (0,1) {On slide 1};
%\node[rectangle, onslide=<2>{mycolor}, onslide=<3>{opaque}] at (0,2) {On slide 2};
%\node[rectangle, onslide=<3>{mycolor}, onslide=<4>{opaque}] at (0,3) {On slide 3};
\end{tikzpicture}
\end{frame}
\end{document}
问题是,该#1+1
密钥无法在开箱即用。
animate/.style={onslide=<#1>{mycolor}, onslide=<#1+1>{opaque}}
我也尝试使用 a\pgfmathparse
和 a \pgfmathsetmacro
,但也没有用。我认为这与键的扩展或宏的范围有关。
那么,我该如何让这类事情自动运行呢?另外,如果您能给出一个我+-
也能处理范围的一般情况,我会得到加分。但现在还没有必要。
答案1
出于显而易见的原因,这会产生四个覆盖,但想法应该很清楚:您必须将明确的数字传递给\only
,这可以用来完成\numexpr
。
\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}
% I want something like this
\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};
\end{tikzpicture}
\end{frame}
\end{document}