Hyperref:如何正确地重新定义“\@currentlabel”?

Hyperref:如何正确地重新定义“\@currentlabel”?

我在用我自己的解决方案这个问题创建自定义交叉引用。

\documentclass{article}

\usepackage{hyperref}
\usepackage{lipsum}

\title{My notes for Bla}
\author{myself}

\newcommand{\thingnamestyle}[1]{\textsc{#1}}
\newcommand{\thingnamerefstyle}[1]{[\textsc{#1}]}
% This works, but is unnecessarily complicated
% \newcounter{thing}
%     \newcommand{\thing}[1]{%
%       \thingnamestyle{#1}%
%        \renewcommand{\thething}{\thingnamerefstyle{#1}}%
%        \refstepcounter{thing}%
%     }
\makeatletter
\newcommand{\thing}[1]{%
  \thingnamestyle{#1}%
  \def\@currentlabel{\thingnamerefstyle{#1}}%
}
\makeatother

\begin{document}
\section{Bla}
\lipsum[1]
  \thing{thing-Quick} \label{quick}
\lipsum[1]
  \thing{Task-Brown}  \label{brown}
\lipsum[1]
And \ref{quick} has been completed.
\end{document}

这有效,但hyperref\ref:单击它会跳转到章节标题,我想,这是\@currentlable除了我的\thing宏之外设置的最后一件事。

如果按照上面的注释代码定义\thing使用参考计数器,则链接似乎可以正常工作。

缺少什么才能\thing兼容hyperref

答案1

为了产生适当的超链接,请\phantomsection在末尾发出\thing

\makeatletter
\newcommand{\thing}[1]{%
  \thingnamestyle{#1}%
  \def\@currentlabel{\thingnamerefstyle{#1}}%
  \phantomsection%
}
\makeatother

注意,如果\thingnamerefstyle扩展了写入.aux文件的内容。有时更习惯\protect这样做:

  ...
  \def\@currentlabel{\protect\thingnamerefstyle{#1}}$
  ...

相关内容