让beamer的alert可以像ref一样定位某个地方进行alert
真是一个很难的任务, 花了我差不多整整一天, 解决了:
\usepackage{refcount}
\begin{document}
\makeatletter
\newcommand*{\overlaynumber}{\number\beamer@slideinframe}
\makeatother
\makeatletter
\newcommand{\customlabel}[2]{%
\protected@write \@auxout {}{\string \newlabel {#1}{{#2}{}}}}
\makeatother
\begin{frame}
\begin{multicols}{4}
\on<+-> Do you know about \getrefnumber{foobar}
\on<+-> In the \alert<\getrefnumber{foobar}>{default multicols} environment the
\on<+-> columns are %\alert<{\number\ref{foo1}}>{balanced}
so each one contains the same amount of text. This default format can be changed \alert<+>{by the stared environment multicols*}:
\on<+->
\only<.>{Here is some text. \customlabel{foobar}{\overlaynumber}}
Here is some more text \ref{foobar}.
\on<+-> test
\end{multicols}
\end{frame}
\end{document}
核心问题是\alert<>后面尖括号必须是数字, 而\overlaynumber终于得到了这个数字(注意每次相同的地方, 这个数字会变, 所以需要\only<.>), 但是通过\ref得到的又不是一个数字, 需要变成数字, 这就要用到getrefnumber.