如下图所示,如果等式前面的行已满,它总是会产生一个额外的垂直空间。
我的发现:
删除hyperref
或选择parskip=full*
可以解决这个问题,但我想知道,这是怎么发生的
谢谢你们。
平均能量损失
\documentclass[a4paper,12pt, parskip=full*]{scrbook}
\usepackage{hyperref}
\usepackage[fleqn]{amsmath}
\setlength{\parindent}{0pt}
\newcommand{\myparagraph}[1]{\paragraph{#1}\mbox{}\\[1em]}
\begin{document}
\section*{Test}
\myparagraph{extra vspace}
xxxxxxxxxxx xxxxxxxxx xxxxxxx xxxxxxxx xxxxxxxxxxxxxxxxxx xxxxxx xxxxx end
\begin{equation}
a + a + a
\end{equation}
\myparagraph{right space}
xxxxxxxxxxx xxxxxxxxx end
\begin{equation}
a + a + a
\end{equation}
\end{document}
答案1
hyperref
当 TeX 开始处理时\begin{equation}
,在显示实际开始之前添加一些对当前段落有贡献的内容。
如果在长行末尾添加%
,则会看到其自然宽度小于行宽,但 hyperref 插入的锚点会导致 TeX 形成空行。添加 后会出现一条关于框已满的消息%
,但这是虚假的,是由于内部工作造成的。
你运气不好。这又是一个不使用的理由parskip
。
请注意,这主要是parskip*
要责怪选项(感谢 Ulrike Fischer 的提醒),因为它设置\parfillskip
为0.25\columnwidth plus 1.0fil
,这使得分段变得更加困难。但是,我认为问题也可能出现在 中parskip=full-
,这不会改变\parfillskip
。我不会调查,因为我坚信使用非零 parskip 是不好的:只是浪费空间,对读者没有任何好处。
最小示例
\documentclass[a4paper,12pt,parskip=full*]{scrbook}
\usepackage{showframe}
\usepackage{hyperref}
\usepackage[fleqn]{amsmath}
\setlength{\parindent}{0pt}
\begin{document}
\section*{Test}
% extra vspace
xxxxxxxxxxx xxxxxxxxx xxxxxxx xxxxxxxx xxxxxxxxxxxxxxxxxx xxxxxx xxxxx end
\begin{equation}
a + a + a
\end{equation}
% no extra vspace
xxxxxxxxxxx xxxxxxxxx xxxxxxx xxxxxxxx xxxxxxxxxxxxxxxxxx xxxxxx xxxxx end%
\begin{equation}
a + a + a
\end{equation}
% right space
xxxxxxxxxxx xxxxxxxxx xxxxxxxxx end
\begin{equation}
a + a + a
\end{equation}
\showoutput
\end{document}
输出
分析日志\showoutput
第一种情况(空间过剩)
.....\OT1/cmr/m/n/12 e
.....\OT1/cmr/m/n/12 n
.....\OT1/cmr/m/n/12 d
.....\glue(\rightskip) 0.0
....\penalty 10050
....\glue(\baselineskip) 14.5
....\hbox(0.0+0.0)x448.13095, glue set 336.09822fil
.....\hbox(0.0+0.0)x0.0
......\hbox(0.0+0.0)x0.0, shifted -14.5
.......\pdfdest name{equation.0.0.1} xyz
.......\penalty 10000
.....\penalty 10000
.....\glue(\parfillskip) 112.03273 plus 1.0fil
.....\glue(\rightskip) 0.0
....\penalty 10000
....\glue(\abovedisplayskip) 12.0 plus 3.0 minus 7.0
空行(仅包含不可见的锚点)非常明显。
第二种情况(带有%
after end
)
.....\OT1/cmr/m/n/12 e
.....\OT1/cmr/m/n/12 n
.....\OT1/cmr/m/n/12 d
.....\penalty 10000
.....\hbox(0.0+0.0)x0.0
......\hbox(0.0+0.0)x0.0, shifted -14.5
.......\pdfdest name{equation.0.0.2} xyz
.......\penalty 10000
.....\penalty 10000
.....\glue(\parfillskip) 112.03273 plus 1.0fil
.....\glue(\rightskip) 0.0
....\penalty 10000
....\glue(\abovedisplayskip) 12.0 plus 3.0 minus 7.0
此处可以将锚点设置为迄今为止段落最后一行的一部分(显示之前)。
第三种情况(短线)
.....\OT1/cmr/m/n/12 e
.....\OT1/cmr/m/n/12 n
.....\OT1/cmr/m/n/12 d
.....\glue 3.91663 plus 1.95831 minus 1.30554
.....\penalty 10000
.....\hbox(0.0+0.0)x0.0
......\hbox(0.0+0.0)x0.0, shifted -14.5
.......\pdfdest name{equation.0.0.3} xyz
.......\penalty 10000
.....\penalty 10000
.....\glue(\parfillskip) 112.03273 plus 1.0fil
.....\glue(\rightskip) 0.0
....\penalty 10000
....\glue(\abovedisplayskip) 12.0 plus 3.0 minus 7.0
这与第二种情况十分相似。