我正在为一本期刊撰写一篇文章,采用 AMS 数学方程式格式,例如“Eq. (1)”。我想超链接整个“Eq. (1)”,而不仅仅是“1”。目前我使用的是\renewcommand{\equationautorefname}{Eq.}
。但这会产生一个超链接的“Eq. 1”。我更喜欢可以继续使用 的解决方案\autoref
。
解决方案如下:如何使用命令 \autoref 达到与使用命令 \eqref 相同的效果?,但它使用\def
并且期刊风格禁止使用 Tex 的低级命令,如\def
、\edef
和\gdef
。
答案1
如果你不愿意 —— 或者不允许! —— 修改一些低级 TeX 宏,你仍然可以通过 (a) 在序言中执行以下指令来实现自动在交叉引用的方程编号周围放置括号的目标:
\usepackage[nameinlink,capitalize]{cleveref}
以及 (b) 使用\cref
而不是\autoref
来生成交叉引用。
\documentclass{article}
\usepackage[colorlinks]{hyperref}
\usepackage[nameinlink,capitalize]{cleveref}
\setlength\textwidth{3in} %% just for this example
\begin{document}
\begin{equation}\label{eq:pythag}
a^2+b^2=c^2
\end{equation}
A cross-reference to \cref{eq:pythag} via \verb+\cref+.
\end{document}
有关各种交叉引用包的更多信息,特别是hyperref
和cleveref
在这方面的功能,请参阅帖子交叉引用包:使用哪一个,哪些有冲突?
附录: 如果你必须使用\autoref
和 想要在交叉引用的方程编号周围放置括号,则需要重新定义宏\theequation
。假设您还使用amsmath
包,则还需要修改辅助宏\tagform@
。以下 MWE 显示了如何完成此操作。(需要指令\makeatletter
和 ,\makeatother
因为部分代码涉及“特殊”字符@
。)
附注:如果期刊的指导方针禁止\def
在您的文档中使用,那么使用\renewcommand
可能也会被反对。如果是这样,您可能应该使用\cref
而不是\autoref
来创建方程式的交叉引用...
\documentclass{article}
\usepackage{amsmath}
\makeatletter
\let\oldtheequation\theequation
\renewcommand\tagform@[1]{\maketag@@@{\ignorespaces#1\unskip\@@italiccorr}}
\renewcommand\theequation{(\oldtheequation)}
\makeatother
\usepackage[colorlinks]{hyperref}
\renewcommand{\equationautorefname}{Eq.}
\usepackage[nameinlink,capitalize]{cleveref}
%% Need to undo the effect of redefinition of "\theequation" to use \cref:
\creflabelformat{equation}{#2\textup{#1}#3} % No more parentheses around "#1"
\setlength\textwidth{3in} %% just for this example
\begin{document}
\begin{equation}\label{eq:pythag}
a^2+b^2=c^2
\end{equation}
A cross-reference to \autoref{eq:pythag} via \verb+\autoref+.
A cross-reference to Eq.~\eqref{eq:pythag} via \verb+\eqref+.
A cross-reference to \cref{eq:pythag} via \verb+\cref+.
\end{document}
答案2
以下示例定义了\myeqref
,它将公式引用添加到 前面,Eq.~
并将前缀和括号包含在链接中。前缀可以被第一个可选参数覆盖。
名称\autoref
宏无法访问计数器,因此下面的定义\equationautorefname
只是一个肮脏的黑客行为。
\documentclass[a5paper]{article}
\usepackage{amsmath}
\usepackage{hyperref}
\newcommand*{\myeqref}[2][Eq.~]{%
\hyperref[{#2}]{#1(\ref*{#2})}%
}
\def\equationautorefname#1#2\null{%
Eq.#1(#2\null)%
}
\begin{document}
\begin{equation}
\label{eq:einstein}
E=mc^2
\end{equation}
References: \myeqref{eq:einstein} and \myeqref[equation~]{eq:einstein}.\\
Reference: \autoref{eq:einstein}.
\end{document}
答案3
有点肮脏的黑客行为,但只要hyperref
不改变其\autoref
实现,它就可以起作用。
\documentclass{article}
\usepackage{hyperref}
\makeatletter
\AtBeginDocument{%
\let\plain@equationautorefname\equationautorefname
\def\equationautorefname{\plain@equationautorefname\@autoref@insert@tagform}%
\def\@autoref@insert@tagform~#1\null{~(#1\null)}%
}
\makeatother
\begin{document}
\begin{equation}
\label{foo}
a + b = c
\end{equation}
\autoref{foo}
\end{document}