amsmath 和 hyperref 组合导致减号后的间距不正确

amsmath 和 hyperref 组合导致减号后的间距不正确

当没有加载任何包时,负数的减号后不会插入空格:

\documentclass{article}
\begin{document}
\begin{equation}
  -1 = -1 % output: -1 = -1
\end{equation}
\end{document}

但是,当同时使用 amsmath 和 hyperref 时,会在启动环境内容的负数中插入一个空格equation

\documentclass{article}
\usepackage{amsmath}
\usepackage{hyperref}
\begin{document}
\begin{equation}
  -1 = -1 % output: - 1 = -1
\end{equation}
\end{document}

在后一个例子中,减号似乎被视为减法而不是负数。

两个包加载后,如何才能得到和前面例子一样的结果?我发现align环境没有这个问题,但我听说使用alignequation不是不好

第二种情况的输出示例:

减一

答案1

编辑为另一个纯 amsmath 问题添加了补丁;请参阅答案底部

这不是一件容易的事。首先确实hyperref应该总是在之后加载,amsmath因为它会根据是否amsmath加载来执行操作,但不会将其延迟到At Begin Document

一元减法的问题已经通过 的hyperref重新定义得到解决( hyperref.pdf 中\equation代码注释附近)7553

\mathopen例如,当等式以一元减号开头时,就需要。

amsmath但只有在未加载时才会进行此重新定义。在hyperref检测到的情况下,amsmath它会amsmath以不同的方式修改定义,将\refstepcounter和随后的hyperlink业务移动到公式的开头,以避免将事物放在周围的垂直列表中。然而,似乎hyperref忘记在这种情况下也添加\mathopen事物。

这是一个建议的补丁。

没有经过任何彻底的测试 最好使用 hyperref 来修补仅方程式等...

\documentclass{article}
\usepackage{amsmath}
% always load hyperref after amsmath
\usepackage{hyperref}
\makeatletter
\def\hyper@refstepcounter#1{%
  \edef\This@name{#1}%
  \ifx\This@name\name@of@eq
    \@ifundefined{theHequation}{%
      \make@stripped@name{\theequation}%
      \let\theHequation\newname
    }{}%
  \fi
  \HyCnt@ProvideTheHCounter{#1}%
  \hyper@makecurrent{#1}%
  \ifmeasuring@
  \else
  %%  \ifmmode\mathopen\bgroup\fi  %% first version of the patch (line I)
    \Hy@raisedlink{%
      \hyper@anchorstart{\@currentHref}\hyper@anchorend
    }%
  %%  \ifmmode\egroup\fi           %% first version of the patch (line II)
  \fi
  \ifmmode\mathopen{}\fi           %% second version: THIS LINE ADDED IN PATCH
}
\makeatother
\begin{document}
\begin{equation}
  -1 = -1 % output is now OK
\end{equation}
\end{document}

在此处输入图片描述


正如评论中所指出的,与环境无关的类似问题也hyperref存在于 中。我可以提出以下补丁,但不保证一定能成功,因为这项工作只适合那些已经了解 amsmath 所有内部原理的人。amsmath\multline

补丁是在 的帮助下完成的etoolbox

关于这个补丁,我不确定为什么amsmath\displaystyle{}而不是\displaystyle单独不会产生问题;另一个补丁是简单地用替换\displaystyle{}\displaystyle但可能有一些原因\displaystyle{}(比较\shoveleft中的定义amsmath.sty)。

\documentclass{article}
\usepackage{amsmath}

% un deuxième problème a émergé qui n'est pas lié à hyperref.

\usepackage{etoolbox}

\begin{document}\thispagestyle{empty}

Before the patch:
\begin{multline}
    -1 = -1\\ -2 = -2
\end{multline}

\makeatletter
\patchcmd
{\multline@}{\displaystyle{}}{\displaystyle{}\mathopen{}}
   {\typeout{multpatch SUCCESS}}
   {\typeout{multpatch FAILURE}}

\patchcmd
{\mmeasure@}{\displaystyle{}}{\displaystyle{}\mathopen{}}
   {\typeout{mmpatch SUCCESS}}
   {\typeout{mmpatch FAILURE}}

\makeatother

After the patch
\begin{multline}
    -1 = -1\\ -2 = -2
\end{multline}
\end{document}

在此处输入图片描述

答案2

\mathord通过\mathord{-}或强制一元减法为 类型{-}在此处输入图片描述

\documentclass{article}
\usepackage{amsmath,hyperref}
\begin{document}
\begin{equation}
  {-}1 = -1 % output: -1 = -1
\end{equation}
\end{document}

这很可能是因为hyperref在水平列表的开头插入内容以进行(超)引用。因此,第一个-被视为二元运算符。括号将其恢复为类似于一元运算符的视图。

答案3

尝试使用 eqnarray 代替方程式!它可以解决您的问题。:)

\begin{eqnarray}
  -1 = -1 % output: -1 = -1
\end{eqnarray}

相关内容