\nameref
有时beamer
需要做一些工作才能很好地协同工作。在下面的 MWE 中,我希望文本显示“\nameref
使用框架标题”,但它显示“\nameref
使用部分标题”。
我曾尝试添加这个,类比定理标题,但没有效果:
\makeatletter
\addtobeamertemplate{frame begin}{%
\expandafter\NR@gettitle\expandafter{\insertframetitle}%
}{}
\makeatother
梅威瑟:
\documentclass{beamer}
\begin{document}
\section{the section title}
\begin{frame}[label=l]{the frame title}
\texttt{\textbackslash nameref} on a frame uses \nameref{l}.
\end{frame}
\end{document}
(如果您想知道我为什么需要幻灯片标题:我beamerarticle
还用它来创建讲义,并xr
用于外部参考。在讲义中,我希望能够引用“幻灯片 3(标题)”。)
答案1
在处理标题之前(在 环境中beamer@frameslide
),投影仪框架中的标签已设置beamerbaseframe.sty
。这使得很难将两个操作(即设置名称\nameref
和设置标签)结合起来。
一种解决方法是在标题处理期间设置附加标签。一个显示标题的宏是\beamer@inlineframetitle
,因此它是使用包进行修补的候选etoolbox
。为了避免定义重复的标签,您可以为新标签使用前缀,例如nr
。
梅威瑟:
\documentclass{beamer}
\usepackage{etoolbox}
\makeatletter
\pretocmd{\beamer@inlineframetitle}{%
\GetTitleString{#1}\let\@currentlabelname\GetTitleStringResult%
\label{nr\beamer@againname}}%
{\typeout{patch ok}}{\typeout{patch failed}}
\makeatother
\begin{document}
\section{the section title}
\begin{frame}[label=l]{the frame title}
Original nameref: \nameref{l}
Extra nameref: \nameref{nrl}.
\end{frame}
\end{document}
结果:
为了改进此解决方案,您可以尝试修补beamer@frameslide
以将标签推迟到标题可用的稍后时间点,以便使用原始标签,或者反之亦然,尝试在此环境中尽早公开标题。但是,以这种方式修改 Beamer 并不容易,因此这里给出的解决方法可能就足够了。