简洁版本:
如何解决使用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
\hyperref
description
\hyperref
\spacedallcaps
仅有的。