如何让 \nameref 在 beamer 幻灯片标题上起作用?

如何让 \nameref 在 beamer 幻灯片标题上起作用?

\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 并不容易,因此这里给出的解决方法可能就足够了。

相关内容