通过 MakeUpperCase 扩展 hyperref 链接

通过 MakeUpperCase 扩展 hyperref 链接

简洁版本:

如何解决使用MakeUpperCase扩展时使用超链接的问题?

长版本:如果我尝试重新定义:

\renewcommand{\descriptionlabel}[1]{\hspace*{\labelsep}%
\small\spacedallcaps{#1}}

在哪里:

\DeclareRobustCommand{\spacedallcaps}[1]{\sffamily%
\textssc{\MakeTextUppercase{#1}}}%

所以当我想使用描述时:

\begin{description}
\item[{\hyperref[cap:first]{first chapter}}] Bla bla
\end{description}

链接无效,因为 hyperref 正在寻找CAP:FIRST

我该如何修复它(是的,我可以将所有小写标签重新定义为大写,但我想可能还有其他可行的方法。

编辑:

我并不总是hyperref在 中使用description,但我更愿意保留 MakeUpperCase,而不是重写每个描述项。我的意思是,如果我真的必须这样做,我可以(因为我可以重新定义标签),但我仍然对更通用的解决方案感兴趣(如果存在的话)。

答案1

在下面memoir,则可进行以下操作:

在此处输入图片描述

\documentclass{memoir}
\usepackage{hyperref}
\newif\ifhyperrefindesclabel

\makeatletter
\renewcommand{\descriptionlabel}[1]{%
  \let\oldhyperref\hyperref% Store \hyperref in \oldhyperref
  \hyperrefindesclabelfalse% No \hyperref in description
  \renewcommand{\hyperref}[2][]{% Update \hyperref to
    \gdef\h@optarg{##1}% ... store optional argument
    \gdef\h@manarg{##2}% ... store mandatory argument
    \global\hyperrefindesclabeltrue}% ... and mark as \hyperref-being-used
  \setbox1=\hbox{#1}% Evaluate \descriptionlabel argument
  \hspace*{\labelsep}% Insert space
  \small% Change font
  \ifhyperrefindesclabel% Was \hyperref used?
    \oldhyperref[\h@optarg]{\spacedallcaps\h@manarg}% Call \oldhyperref
  \else% ... no \hyperref was used
    \spacedallcaps{#1}% Re-set label using \spacedallcaps
  \fi
  }
\DeclareRobustCommand{\spacedallcaps}[1]{\sffamily%
  \textsc{\MakeTextUppercase{#1}}}%

\makeatother
\begin{document}

\section{First section}\label{sec:first}

\begin{description}
  \item[{\hyperref[sec:first]{first section}}] Bla bla

  \item[second section] Bla bla
\end{description}

\end{document}

扩大定义背后的想法是,每当您在标签内使用时\descriptionlabel,设置一个标志 ( ) 。根据此条件,以修改的方式恢复以在第二个/强制参数中使用\ifhyperrefindesclabel\hyperrefdescription\hyperref\spacedallcaps仅有的

相关内容