Hyperref 为方程环境添加垂直空间

Hyperref 为方程环境添加垂直空间

当环境前的文本长度equation接近时\textwidthhyperref会添加一个额外的垂直空间,如下面的快照所示:

在此处输入图片描述

对应的代码是

\documentclass[12pt,fleqn]{article}
\usepackage{a4}
\usepackage{amsmath}
\usepackage{hyperref}

\textwidth = 16cm
\setlength{\parskip}{1.5ex plus0.5ex minus0.5ex}
\setlength{\parindent}{0em}

\begin{document}
Suppose $\vec{T}$ is a lower triangular matrix. Then $\vec{T}^{T}$ is upper triangular. By Lemma 2.23921,
\begin{equation}
    \det(\vec{T}) = \det(\vec{T}^{T}) = [\vec{T}]_{11}[\vec{T}]_{22}\dotsb[\vec{T}]_{nn},
\end{equation}
as required.
\end{document}

请注意,它似乎只会影响环境equation

由于没有明显的方法可以预先确定源代码中问题的发生,我将不得不手动扫描输出文本以查找受影响的部分并替换equation为其他数学环境(例如),gather以规避该问题;显然,这种方法不是最优的。

那么,问题是,为什么它只影响环境equation而不影响其他数学环境? 有办法解决这个问题吗?

答案1

你运气不好,但也hyperref应该做得更好。

\documentclass[12pt,a4paper,fleqn]{article}
\usepackage{amsmath}
\usepackage{etoolbox}
\usepackage{hyperref}

\BeforeBeginEnvironment{equation}{%
  \ifhmode\unskip\fi
}

\textwidth = 16cm
\setlength{\parskip}{1.5ex plus0.5ex minus0.5ex}
\setlength{\parindent}{0em}

\begin{document}

Suppose $\vec{T}$ is a lower triangular matrix. Then $\vec{T}^{T}$ is upper
triangular. By Lemma 2.23921,
\begin{equation}
    \det(\vec{T}) = \det(\vec{T}^{T}) = [\vec{T}]_{11}[\vec{T}]_{22}\dotsb[\vec{T}]_{nn},
\end{equation}
as required.

\end{document}

在此处输入图片描述

笔记。我保留了你的设置\parindent\parskip,但这并不意味着我赞同它们。相反,我建议你不是使用这些设置。

答案2

看起来这是hyperref软件包中的一个错误。当hyperref未加载时,显示前的段落部分以空格结束(在您出色的示例中,在行末的逗号后),然后执行\begin{equation}\refstepcounter {equation}扩展为,$$从而启动显示模式。显示模式的开始执行 TeX 内部算法:它通过\unskip(即删除提到的空格)完成当前水平模式并执行类似的事情\par(即,水平列表被分解为行,水平模式被中断并且行被贡献给垂直列表)。然后排版显示数学。请注意,这种情况(水平模式下没有结束空格,因为它已被删除)使段落部分完全适合一行。

hyperref加载时,它会重新定义\refstepcounter宏。现在,此宏将计数器加一,并将超链接目标置于当前模式。当前模式为水平模式,目标置于提到的空间。这个目的地是通过\penalty10000\hbox{...\pdfdest{...}}但这并不重要来实现的。主要结果是\unskip启动显示数学时处理的内部操作无法删除提到的空间因为超链接目标的形式存在障碍。在这种情况下,水平模式比提到的空间更长。现在,这个水平列表被分成两行(第二行是空的),然后显示数学被排版。

相关内容