![使用相关包后 Renewcommand 失败](https://linux22.com/image/340840/%E4%BD%BF%E7%94%A8%E7%9B%B8%E5%85%B3%E5%8C%85%E5%90%8E%20Renewcommand%20%E5%A4%B1%E8%B4%A5.png)
我一直在使用此代码来改变引用的外观(将数字括在圆括号内):
\let\oldref\ref
\renewcommand{\ref}[1]{(\oldref{#1})}
之后,我想让引用“可点击”,所以我使用 hidelinks 选项添加了包 hyperref:
\usepackage[hidelinks]{hyperref}
链接工作正常,但我想知道为什么括号不再可见。显然hyperref
是重新定义\ref
,但\let
也应该更新我的定义。这与这些指令在代码中出现的顺序无关。问题出在哪里?
答案1
周围的许多重新定义在(包、 )\ref
中被延迟。因此,用户重新定义应该在相当晚的时候进行,例如在前言之后或结束时,延迟。此外,由于,重新定义稍微复杂一些。包有助于:\begin{document}
hyperref
nameref
\begin{document}
\AtBeginDocument
\DeclareRobustCommand
letltxmacro
\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
,它在方程编号周围添加了括号。