当没有加载任何包时,负数的减号后不会插入空格:
\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
环境没有这个问题,但我听说使用align
而equation
不是不好。
第二种情况的输出示例:
答案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}