使用相关包后 Renewcommand 失败

使用相关包后 Renewcommand 失败

我一直在使用此代码来改变引用的外观(将数字括在圆括号内):

\let\oldref\ref
\renewcommand{\ref}[1]{(\oldref{#1})}

之后,我想让引用“可点击”,所以我使用 hidelinks 选项添加了包 hyperref:

\usepackage[hidelinks]{hyperref}

链接工作正常,但我想知道为什么括号不再可见。显然hyperref是重新定义\ref,但\let也应该更新我的定义。这与这些指令在代码中出现的顺序无关。问题出在哪里?

答案1

周围的许多重新定义在(包、 )\ref中被延迟。因此,用户重新定义应该在相当晚的时候进行,例如在前言之后或结束时,延迟。此外,由于,重新定义稍微复杂一些。包有助于:\begin{document}hyperrefnameref\begin{document}\AtBeginDocument\DeclareRobustCommandletltxmacro

\documentclass{article}
\usepackage[hidelinks]{hyperref}
\usepackage{letltxmacro}

\AtBeginDocument{%
  \LetLtxMacro\MyOldRef\ref
  \DeclareRobustCommand*{\ref}[1]{%
    (\MyOldRef{#1})%
  }%
}

\begin{document}
\section{First section}\label{sec:first}
Ref: \ref{sec:first}
\end{document}

结果

amsmath顺便说一句,请参阅包\eqref,它在方程编号周围添加了括号。

相关内容