当环境前的文本长度equation
接近时\textwidth
,hyperref
会添加一个额外的垂直空间,如下面的快照所示:
对应的代码是
\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
启动显示数学时处理的内部操作无法删除提到的空间因为超链接目标的形式存在障碍。在这种情况下,水平模式比提到的空间更长。现在,这个水平列表被分成两行(第二行是空的),然后显示数学被排版。