使用 Beamer 的 \ref*

使用 Beamer 的 \ref*

当我\ref*{xx}在 中使用 时beamer,它会给我一个错误:“ pdfTeX warning (dest): name{*} has been referenced but does not exist。” 这是beamer什么问题,还是我遗漏了什么?

如果我运行常规 MWE,它会运行得很好。

\documentclass{article}
\usepackage{hyperref}
\usepackage{lipsum}

\begin{document}
\section{First}
\lipsum[1-3]

\section{Second}
\lipsum[4-5]
Label \label{jh}

\section{Third}
\lipsum[6-9]

Reference: \ref*{jh}
\end{document}

它在那里打印“2”,没有超级引用。

但是在 中beamer,我的 mwe 给出了我在开始时提到的错误。

\documentclass{beamer}

\begin{document}
\section{test section}
\begin{frame}
  Label: \label{jh}
\end{frame}

\begin{frame}
  Reference: \ref*{jh}
\end{frame}
\end{document}

常规\ref(无星号)效果很好。它会打印参考资料,并使其变得生动。

我今天从 CTAN 下载了beamer,我oberdiek还下载了,因为我收到了一些关于已加载软件包日期的警告,这个问题我已经解决了。除此之外,我还有 Ubuntu 10.04 软件包管理器附带的 TeXLive 2009。

(FWIW,我想要,\ref*因为参考文献来自另一份由 提供的文件xr.sty。)

答案1

beamerhyperref(由 加载beamer)似乎陷入了纠缠,每个都保存了一个“原始”版本,\ref并且每个都添加了额外的功能。

这将使事情回到定义的方向hyperref,我不确定beamer它会失去多少功能,但它似乎在这个例子中起作用,

\documentclass{beamer}

{\def\protect{\global\let\YesIMeanThisRef}\ref}

\AtBeginDocument{\def\ref{\protect\YesIMeanThisRef}}

\begin{document}

\section{test section}
\begin{frame}
  Label: \label{jh}
\end{frame}

\begin{frame}
  Reference: \ref*{jh}
\end{frame}
\end{document}

答案2

详细阐述大卫的回答,beamer 修改\ref,就像大多数其他宏和环境一样。在beameroverlay.sty,则执行以下操作:

\AtBeginDocument
{
  \let\beamer@origref=\ref
  \long\def\ref#1{\hyperlink{#1}{\beamer@origref{#1}}}
}

\ref删除(since )的星号功能\hyperlink{*}{...}没有意义。这是一个最小示例,它\reff改进了原始的星号变体。我相信您也可以用\ref这种方式重新定义。

\documentclass{beamer}% http://ctan.org/pkg/beamer
\usepackage{xparse}% http://ctan.org/pkg/xparse

\makeatletter
\NewDocumentCommand{\reff}{s m}{%
  \IfBooleanTF{#1}% Check for starred variant
    {\beamer@origref{#2}}% \reff*
    {\hyperlink{#2}{\beamer@origref{#2}}}% \reff
}
\makeatother

\begin{document}
\section{test section}
\begin{frame}
  Label: \label{jh}
\end{frame}

\begin{frame}
  Reference: \ref{jh}, \reff{jh}, \reff*{jh}
\end{frame}
\end{document}​

相关内容