![\Needspace 产生的额外行](https://linux22.com/image/452723/%5CNeedspace%20%E4%BA%A7%E7%94%9F%E7%9A%84%E9%A2%9D%E5%A4%96%E8%A1%8C.png)
如果定理环境包含的文本少于 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}