我有类似的问题Beamer 枚举,继续计数但将项目保持在固定位置. 但提供的解决方案https://tex.stackexchange.com/a/188046无法使第二页上的其他计数器工作(例如步骤和被引用)。
我知道我应该直接在问题答案下发表评论,但我不能,因为我的声誉没有 50 点。
平均能量损失
\documentclass{beamer}
\usepackage{etoolbox}
\makeatletter
\def\c@slideinframe{\beamer@slideinframe}
\def\beamerslideinframe{\beamer@slideinframe}
\makeatother
\def\AdvCnt{\setcounter{enumi}{\numexpr\arabic{slideinframe}-1\relax}}
\pretocmd{\item}{\AdvCnt}{}{}
\begin{document}
\begin{frame}
\begin{enumerate}
\only<+>{
\item Item 1 \label{enu:1}
\begin{equation}
a+b=c\label{equ:1}
\end{equation}
}
\only<+>{
\item Item 2 \label{enu:2}
\begin{equation}%\refstepcounter{equation}
d+e=f\label{equ:2}
\end{equation}
}
\end{enumerate}
\ref{enu:1}, \eqref{equ:1}, \ref{enu:2}, \eqref{equ:2}.
\end{frame}
\end{document}
答案1
默认情况下,\label
宏将尝试在第一个覆盖层上创建标签。由于您的某些项目/方程式未出现在第一个覆盖层上,因此您会得到未定义的引用。
为了避免这种情况,您可以使用\label<>{...}
链接到特定的覆盖:
\documentclass{beamer}
\makeatletter
\def\c@slideinframe{\beamer@slideinframe}
\def\beamerslideinframe{\beamer@slideinframe}
\makeatother
\def\AdvCnt{\setcounter{enumi}{\numexpr\arabic{slideinframe}-1\relax}\setcounter{equation}{\numexpr\arabic{slideinframe}-1\relax}}
\pretocmd{\item}{\AdvCnt}{}{}
\begin{document}
\begin{frame}
\begin{enumerate}
\only<+>{
\item Item 1 \label{enu:1}
\begin{equation}
a+b=c\label{equ:1}
\end{equation}
}
\only<+>{
\item Item 2 \label<.>{enu:2}
\begin{equation}
d+e=f\label<.>{equ:2}
\end{equation}
}
\end{enumerate}
\ref{enu:1}, \eqref{equ:1}, \ref{enu:2}, \eqref{equ:2}.
\end{frame}
\end{document}
恕我直言,您选择一次显示一个项目的方法非常具有侵入性,并且会改变演示文稿中所有项目的行为。我建议采用这种侵入性较小的方法:
\documentclass{beamer}
\begin{document}
\begin{frame}
\begin{enumerate}
\alt<1>{
\item Item 1 \label{enu:1}
\begin{equation}
a+b=c\label{equ:1}
\end{equation}
}{
\refstepcounter{enumi}
\refstepcounter{equation}
\item Item 2 \label<2>{enu:2}
\begin{equation}
d+e=f\label<2>{equ:2}
\end{equation}
}
\end{enumerate}
\ref{enu:1}, \eqref{equ:1}, \ref{enu:2}, \eqref{equ:2}.
\pause
\end{frame}
\end{document}