fleqn 文档类选项、长文本行和 hyperref 包

fleqn 文档类选项、长文本行和 hyperref 包

使用该选项时fleqn,位于“长”文本行(我确切地说)之后的公式前的垂直间距\linewidth设置不正确。见下文:

在此处输入图片描述

mathmode用户指南来看,这个问题可能可以通过\topsep长度来解决。这是正确的做法吗?以下代码重现了这个问题:

\documentclass[12pt,fleqn]{book}
\usepackage{amsmath}
\usepackage{hyperref}
\begin{document}
\chapter{plo}
\section{plo}
eoiu oieu oeiuoe ueoi ueoi ueoiu eoiu oeu oe iupaêio umùaeoiuaem oeiu eoiu eoiu oeee.
eoiu oieu oeiuoe ueoi ueoi ueoiu eoiu oeu oe iupaêio umùaeoiuaemm
\begin{equation}
\cos\pi=-1
\end{equation}
eoiu oieu oeiuoe ueoi ueoi ueoiu eoiu oeu oe iupaêio umùaeoiuaem oeiu eoiu eoiu oeee.
eoiu oieu oeiuoe ueoi ueoi ueoiu eoiu oeu oe iupaêio umùae
\begin{equation}
\cos\pi=-1
\end{equation}
\end{document}

hyperrefamsmath和有问题fleqn。删除其中一个即可解决问题。

答案1

第一个方程式之前的最后一行以空格结尾。这通常不是问题,因为 TeX 在显示的方程式之前以类似于段落结尾的方式结束文本。这意味着,最后一个空格被删除并\parfillskip添加。

但是,包hyperref必须在某个时间插入某个内容。它挂接到\refstepcounter,在显示方程之前调用以更新方程计数器。hyperref如果引用了方程,则使用它来添加作为链接目标所需的锚点。

但是,前一个文本的最后一个空格无法删除,因为 whatsit/anchor 位于中间,隐藏了空格。由于文本填充了前一行,因此结果是一个换行符,后面跟着一个带有锚点的不可见行。新行开头的空格被删除,但不可见的行仍然存在,占用空间。

作为快速解决方法,可以用百分号线删除空格:

...aemm%
\begin{equation}

更好的方法是自动删除空格并修复锚点的位置,因为上一行末尾的位置不是一个好位置。

\documentclass[12pt,fleqn]{book}
\usepackage{amsmath}
\usepackage[colorlinks]{hyperref}

\usepackage{etoolbox}
\makeatletter
\patchcmd{\equation}{\incr@eqnum\mathdisplay@push}{%
  \ifhmode
    \unskip
    \vadjust{%
      \incr@eqnum
      \global\let\gfix@incr@eqnum\incr@eqnum
      \global\let\gfix@currentlabel\@currentlabel
      \global\let\gfix@currentHref\@currentHref
    }%
    \let\incr@eqnum\gfix@incr@eqnum
    \let\@currentlabel\gfix@currentlabel
    \let\@currentHref\gfix@currentHref
  \else
    \incr@eqnum
  \fi
  \mathdisplay@push
}{}{}
\makeatother

\begin{document}
\chapter{plo}
\section{plo}
eoiu oieu oeiuoe ueoi ueoi ueoiu eoiu oeu oe iupaêio umùaeoiuaem oeiu eoiu
eoiu oeee.
eoiu oieu oeiuoe ueoi ueoi ueoiu eoiu oeu oe iupaêio umùaeoiuaemm
\begin{equation}
\label{eq:first}
\cos\pi=-1
\end{equation}
eoiu oieu oeiuoe ueoi ueoi ueoiu eoiu oeu oe iupaêio umùaeoiuaem oeiu eoiu
eoiu oeee.
eoiu oieu oeiuoe ueoi ueoi ueoiu eoiu oeu oe iupaêio umùae
\begin{equation}
\label{eq:second}
\cos\pi=-1
\end{equation}
Equations \ref{eq:first} and \ref{eq:second}.
\end{document}

结果

相关内容