对于我的讲座幻灯片,beamer
我想建立一个部分帧编号方案。为此,我重置了帧计数器\AtBeginSection
并重新定义\insertframenumber
命令以反映新的编号方案:
\renewcommand{\insertframenumber}{\thesection-\theframenumber}
\AtBeginSection{\setcounter{framenumber}{0}}
这种方法效果很好。但是,我在这方面无法正确获取交叉引用,也就是说无法引用标记\frame[label=interesting]
为 section-framenumber 的某些内容。显然,没有办法根据标签提取节号:
\documentclass{beamer}
\renewcommand{\insertframenumber}{\thesection-\theframenumber}
\setbeamertemplate{headline}[text line]{This is frame: \insertframenumber}
\AtBeginSection{\setcounter{framenumber}{0}}
\begin{document}
\section{One}
\begin{frame}{First Frame in Section One}
Slide content\par
\pause
More content
\end{frame}
\begin{frame}[label=interesting]{Second Frame in Section One -- The one to crossref to}
Slide content
\end{frame}
\section{Two}
\begin{frame}{First Frame in Section Two}
Now I want to crossref to interesting slide by section-framenumber (that is, somehow generate \textbf{1-2})
\begin{itemize}
\item \textbackslash{}ref yields: \ref{interesting}, apparently that is the frame number
\item \textbackslash{}page yields: \pageref{interesting}, apparently that is the PDF page number
\item \textbackslash{}autoref yields: \autoref{interesting}, apparently that is the frame number again
\item nothing there that yields \textbackslash{}thesection of our target label?
\end{itemize}
\end{frame}
\end{document}
我查看了生成的.aux
文件。我不太擅长解密.aux
文件;然而,当我读到它时,Beamer 甚至没有存储标签所属的部分编号(在本例中为 1):
...
\newlabel{interesting<1>}{{2}{3}{One\relax }{Doc-Start}{}}
...
那么我是不是运气不好呢?
编辑:我现在正在考虑研究该zref
软件包来解决我的问题。挑战可能是将其与label=mylabel
框架选项集成,该选项会隐式生成那些有用的“覆盖”标签(mylabel<1>
、mylabel<2>
、...
)来引用框架的各个幻灯片。
任何提示或想法仍然非常受欢迎:-)
答案1
label
的键在内部beamer
frame
使用宏。这使用LaTeX 的\label<>
常规宏,该宏使用宏作为标签文本。此宏由其设置,由分段宏、标题和框架使用。它使用相应宏的内容,因此设置并不重要。\label
\@currentlabel
\refstepcounter
\the...
\theframenumber
\insertframenumber
请注意,\insertframenumber
默认情况下设置为,\@arabic\c@framenumber
这是的低级版本\arabic{framenumber}
,即的默认定义\theframenumber
。所以我的第一步是重新定义\theframenumber
并\insertframenumber
使用它:
\renewcommand{\theframenumber}{\thesection-\arabic{framenumber}}
\renewcommand{\insertframenumber}{\theframenumber}
但是,这不起作用。经过一些调试,我发现计数器实际上subsectionslide
是用于label
密钥的。我不知道为什么。也许\refstepcounter{subsectionslide}
在之后处理\refstepcounter{framenumber}
。相关文件是beamerbaseframe.sty
。它不喜欢代码中的它,但我没有时间遵循其中的所有条件。
无论如何,解决方案是将 also(?) 设置\thesubsectionslide
为\thesection-\arabic{framenumber}
或\theframenumber
。然后引用将按您想要的方式显示。但是,对subsectionslide
(无论这到底是什么)的引用可能是错误的。
\documentclass{beamer}
\makeatletter
\renewcommand{\insertframenumber}{\theframenumber}
\renewcommand{\theframenumber}{\thesection-\arabic{framenumber}}
\renewcommand{\thesubsectionslide}{\thesection-\arabic{framenumber}}
\setbeamertemplate{headline}[text line]{This is frame: \insertframenumber}
\AtBeginSection{\setcounter{framenumber}{0}}
\begin{document}
\section{One}
\subsection{a}
\begin{frame}{First Frame in Section One}
Slide content\par
\pause
More content
\end{frame}
\subsection{b}
\begin{frame}[label=interesting]{Second Frame in Section One -- The one to crossref to}
Slide content
\end{frame}
\section{Two}
\begin{frame}{First Frame in Section Two}
Now I want to crossref to interesting slide by section-framenumber (that is, somehow generate \textbf{1-2})
\begin{itemize}
\item \textbackslash{}ref yields: \ref{interesting}, apparently that is the frame number
\item \textbackslash{}page yields: \pageref{interesting}, apparently that is the PDF page number
\item \textbackslash{}autoref yields: \autoref{interesting}, apparently that is the frame number again
\item nothing there that yields \textbackslash{}thesection of our target label?
\end{itemize}
\end{frame}
\end{document}