\Needspace 产生的额外行

\Needspace 产生的额外行

如果定理环境包含的文本少于 3 行,我想防止分页符。我发现needspace包允许通过保留指定的空间或在之前中断页面来执行此操作。

这是MWE:

\documentclass{article}
\usepackage{amsmath}
\usepackage{needspace}

\newtheorem{thr}{Theorem}

\usepackage{etoolbox}
\AtBeginEnvironment{thr}{\Needspace{3\baselineskip}}

\begin{document}

\section{name}

\begin{thr}
lorem ipsum
\end{thr}

\begin{thr}
lorem ipsum
\end{thr}

\end{document}

我面临的问题是s\Needspace之间有一个额外的空格(或者说是一条额外的线) thr,但 s 后面\section却没有。

在此处输入图片描述


我查看了源代码并\Needspace像这样定义

\makeatletter
\newcommand{\Needspace}[1]{\par \penalty-100\begingroup
\setlength{\dimen@}{#1}%
\dimen@ii\pagegoal \advance\dimen@ii-\pagetotal
\ifdim \dimen@>\dimen@ii
\ifdim \dimen@ii>\z@
\vfil
\fi
\break
\fi\endgroup}
\makeatother

如你所见,\par一开始就有了,但是删除它并不能解决问题,但是如果你删除整个\par \penalty-100,那么 s 之间的多余空格thr现在就消失了,但是又出现了一个新问题:如果\section被带到了新的页面,如果thr跟在它后面,那么就会再次发生分页符

在此处输入图片描述

\documentclass{article}
\usepackage{amsmath}
\usepackage{lipsum}
%\usepackage{needspace}

\newtheorem{thr}{Theorem}

\makeatletter
\newcommand{\Needspace}[1]{\begingroup
\setlength{\dimen@}{#1}%
\dimen@ii\pagegoal \advance\dimen@ii-\pagetotal
\ifdim \dimen@>\dimen@ii
\ifdim \dimen@ii>\z@
\vfil
\fi
\break
\fi\endgroup}
\makeatother

\usepackage{etoolbox}
\AtBeginEnvironment{thr}{\Needspace{3\baselineskip}}

\begin{document}

\lipsum[1-5]

\section{name}

\begin{thr}
lorem ipsum
\end{thr}

\begin{thr}
lorem ipsum
\end{thr}

\end{document}

所以我的问题是如何修复\Needspace创建的额外行并防止出现上面我刚刚描述的错误?

答案1

惩罚发生变化\lastskip,然后下一个\addvspace行为会有所不同。您可以尝试使用 hyperref 使用的命令来避免此类问题:

\documentclass{article}
\usepackage{amsmath}
\usepackage{needspace}

\newtheorem{thr}{Theorem}

\usepackage{etoolbox}
\makeatletter
\AtBeginEnvironment{thr}{\Hy@SaveLastskip\Needspace{3\baselineskip}\Hy@RestoreLastskip}
\usepackage{hyperref}

\begin{document}

\section{name}

\begin{thr}
lorem ipsum
\end{thr}

\begin{thr}
lorem ipsum
\end{thr}

\end{document}

相关内容