分析日志\showoutput

分析日志\showoutput

如下图所示,如果等式前面的行已满,它总是会产生一个额外的垂直空间。

在此处输入图片描述

我的发现:

删除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 的提醒),因为它设置\parfillskip0.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

这与第二种情况十分相似。

相关内容