我有一个拆分方程,如下面的 MWE 所示。但是,当我单击相应的超链接时,它会将我引导/指向第一个方程行之前的文本行。我希望它指向第一个方程行。这可能吗?如果可能,怎么做?提前谢谢!
\documentclass{article}
\usepackage{lipsum}
\usepackage{amsmath}
\usepackage{hyperref}
\usepackage{cleveref}
\begin{document}
\begin{equation}
\begin{split}
A &= B\\
C &= D\\
E &= F\\
G &= H = I = \\
& \quad = J = K
\end{split}
\label{eq:1}
\end{equation}
\lipsum
Insertion of~\eqref{eq:1}
\end{document}
答案1
这是一种方法,灵感来自这个答案为起点,制作指向以下的方程引用:
环境中的第一个方程线
equation
;align
或环境中的当前行gather
(可以轻松添加其他环境,见下文)。
equation
请注意,由于计数器递增的时间取决于amsmath
所使用的环境,因此我的代码必须区分两种情况。但是,通过检测当前环境,它为您提供了一种“自动模式”,通常情况下,您作为用户不必区分这两种情况。因此,这里有两个选项:
自动选择自定义标签命令:总是使用
\myeqlabel
创建方程标签;手动选择自定义标签命令:
\myeqlabelnoauto*
在诸如align
和之类的环境中使用,可获得给定行的计数器gather
的正确值equation
后结束一行的命令\\
(即,计数器在必须调用的点处太小了一个单位,\myeqlabelnoauto*
以便引用指向我们想要的行);\myeqlabelnoauto
当equation
计数器在被调用的地方已经正确时使用\myeqlabelnoauto
(通常,所有其他情况)。
自动模式(通过\myeqlabel
命令)知道align
和gather
环境需要“特殊处理”(对应于所做的\myeqlabelnoauto*
)。如果您发现其他环境需要相同的特殊处理(这将表现为偏离一个的引用数字),请将它们添加到我的代码的以下行中:
\seq_gset_from_clist:Nn \g_euclides_special_envs_seq { align, gather }
以下是代码:
\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse}
\usepackage{zref}
\usepackage{hyperref}
\ExplSyntaxOn
\seq_new:N \g_euclides_special_envs_seq
\seq_gset_from_clist:Nn \g_euclides_special_envs_seq { align, gather }
\prg_new_protected_conditional:Npnn \euclides_if_special_env:n #1
{ T, F, TF }
{
\seq_if_in:NnTF \g_euclides_special_envs_seq {#1}
{ \prg_return_true: }
{ \prg_return_false: }
}
\prg_generate_conditional_variant:Nnn \euclides_if_special_env:n { V }
{ T, F, TF }
\NewDocumentCommand \ifeuclspecialenv { m m m }
{
\euclides_if_special_env:VTF #1 {#2} {#3}
}
\ExplSyntaxOff
\makeatletter
\zref@newlist{mylist}
\zref@newprop{equation}[??]{0}
\zref@addprop{mylist}{equation}
\newcommand*{\my@set@zref@equation@prop}[1]{%
\zref@setcurrent{equation}{#1}%
}
% Manual labelling command: depending on the enclosing environment, one has to
% use the normal or the star form.
\newcommand*{\myeqlabelnoauto}{%
\@ifstar{\@myeqlabelnoauto{+1}}{\@myeqlabelnoauto{}}%
}
\newcommand*{\@myeqlabelnoauto}[2]{%
\begingroup
\edef\my@tmp@eqnum{\number\numexpr \value{equation} #1 \relax}%
\expandafter
\endgroup
\expandafter\my@set@zref@equation@prop\expandafter{\my@tmp@eqnum}%
\phantomsection\label{zref:#2}%
\zref@wrapper@babel\zref@labelbylist{#2}{mylist}%
}
% Automatic detection of the appropriate labelling command: the code will use
% either \myeqlabelnoauto or \myeqlabelnoauto* depending on the enclosing
% environment.
\newcommand*{\myeqlabel}{%
\ifeuclspecialenv{\@currenvir}{\myeqlabelnoauto*}{\myeqlabelnoauto}%
}
% Referencing command that goes with the above labelling commands.
\newcommand*{\myeqref}[1]{%
\hyperref[zref:#1]{%
\textup{\tagform@{\zref@wrapper@babel\zref@extract{#1}{equation}}}}%
\zref@refused{#1}% uses \zref@wrapper@babel internally
}
\makeatother
\begin{document}
The \verb|equation| environment increments the \verb|equation| counter at the
beginning of the environment; use either \verb|\myeqlabel| or
\verb|\myeqlabelnoauto| there. This example shows a \verb|split| environment
inside \verb|equation|:
\begin{equation}
\begin{split}
\myeqlabel{some-eq}
A &= B\\
C &= D + E\\
& \quad + F + G
\end{split}
\end{equation}
The \verb|align| environment increments the \verb|equation| counter
\emph{after} the \verb|\\| that ends a line; use either \verb|\myeqlabel| or
\verb|\myeqlabelnoauto*|. This example shows an \verb|align| environment:
%
\begin{align}
\myeqlabel{other-eq-a} a &= b + c+ d + e & u - v &= f + f'\\
\myeqlabel{other-eq-b} &= g & z &= h\\
\myeqlabel{other-eq-c} &= i & t &= j
\end{align}
The \verb|gather| environment is similar to \verb|align| as far as the macros
developed here are concerned; use either \verb|\myeqlabel| or
\verb|\myeqlabelnoauto*|:
\begin{gather}
\myeqlabel{gather-eq-a} a_1 = b_1 + c_1\\
\myeqlabel{gather-eq-b} a_2 = b_2 + c_2 - d_2 + e_2
\end{gather}
Pointers to equations \myeqref{some-eq}, \myeqref{other-eq-a},
\myeqref{other-eq-b}, \myeqref{other-eq-c}, \myeqref{gather-eq-a}
and \myeqref{gather-eq-b}.
\end{document}
答案2
您可以局部地或整体地更改由 hyperref 提升的链接数量:
\documentclass{article}
\usepackage{amsmath}
\usepackage{hyperref}
\begin{document}
Some preliminary text...
%also possible, default is 1 \baselineskip.
%\renewcommand\HyperRaiseLinkDefault{2\baselineskip}
\renewcommand\HyperRaiseLinkHook{\setlength\HyperRaiseLinkLength{2\baselineskip}}
\begin{equation}
\begin{split}
A &= B \\
C &= D = E = \\
& \quad = F = G
\end{split}
\label{eq:1}
\end{equation}
Insertion of~\eqref{eq:1}
\end{document}