带有居中标签的多行方程的超链接指向选项

带有居中标签的多行方程的超链接指向选项

我有一个拆分方程,如下面的 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所使用的环境,因此我的代码必须区分两种情况。但是,通过检测当前环境,它为您提供了一种“自动模式”,通常情况下,您作为用户不必区分这两种情况。因此,这里有两个选项:

  1. 自动选择自定义标签命令:总是使用\myeqlabel创建方程标签;

  2. 手动选择自定义标签命令:

    • \myeqlabelnoauto*在诸如align和之类的环境中使用,可获得给定行的计数器gather的正确值equation结束一行的命令\\(即,计数器在必须调用的点处太小了一个单位,\myeqlabelnoauto*以便引用指向我们想要的行);
    • \myeqlabelnoautoequation计数器在被调用的地方已经正确时使用\myeqlabelnoauto(通常,所有其他情况)。

自动模式(通过\myeqlabel命令)知道aligngather环境需要“特殊处理”(对应于所做的\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}

相关内容