绝对防止在章节标题后分页

绝对防止在章节标题后分页

好的,我搜索过了,但没找到任何现有的解决方案。我的问题是如何绝对禁止在节标题后立即分页。我试过:

\makeatletter
\def\neverbreak{\nopagebreak\@nobreaktrue}
\makeatother
\let\oldsection\section
\renewcommand{\section}[1]{\oldsection{#1}\neverbreak}

但它不起作用。下面是问题的一个例子。我怀疑titlesec这是部分原因,因为当我删除它时问题就消失了。但我想要titlesec我的自定义惩罚,那么如何解决这个问题呢?

\documentclass{article}
\usepackage{titlesec}
\usepackage{etoolbox}
\newcommand\thmbegin{\par\addvspace{.5em plus .2em minus .1em}\penalty-1000}
\newtheorem{thm}{Theorem}
\AtBeginEnvironment{thm}{\thmbegin}
\interlinepenalty=1000
\widowpenalty=1000
\clubpenalty=1000
\parindent=0pt
\def\muchtext{text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text }
\makeatletter
\def\neverbreak{\nopagebreak\@nobreaktrue}
\makeatother
\let\oldsection\section
\renewcommand{\section}[1]{\oldsection{#1}\neverbreak}
\begin{document}
\muchtext\muchtext

\muchtext\muchtext

\muchtext

\muchtext\muchtext\muchtext

\muchtext

\muchtext\muchtext\muchtext\muchtext

\section{title}
\begin{thm} \muchtext\muchtext
\end{thm}
\end{document}

答案1

如果您确实需要这样做,您需要的是\addpenalty而不是 ,\penalty就像您使用\addvspace而不是 一样\vspace

\documentclass{article}
\usepackage{titlesec}
\usepackage{etoolbox}
\newcommand\thmbegin{\par\addvspace{.5em plus .2em minus .1em}%
\addpenalty{-1000}}
\newtheorem{thm}{Theorem}
\AtBeginEnvironment{thm}{\thmbegin}
\interlinepenalty=1000
% does nothing \widowpenalty=1000
% does nothing \clubpenalty=1000
\parindent=0pt
\def\muchtext{text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text }

%\makeatletter
%\def\neverbreak{\nopagebreak\@nobreaktrue}
%\makeatother
%\let\oldsection\section
%\renewcommand{\section}[1]{\oldsection{#1}\neverbreak}

\begin{document}
\muchtext\muchtext

\muchtext\muchtext

\muchtext

\muchtext\muchtext\muchtext

\muchtext

\muchtext\muchtext\muchtext\muchtext

\section{title}
\begin{thm} \muchtext\muchtext
\end{thm}
\end{document}

答案2

尽管@davidcarlisle 提到了惩罚,但我发现在复杂的文档中,我经常会遇到麻烦的单独标题和悬垂部分,尤其是当子标题跟在更高级别的标题后面而中间没有文本时。一种方法是使用 needspace,定义在设置特定级别的标题之前页面上需要多少空间。

或许可以按照下面的思路来做,这取决于需要多少不悬垂性。

\usepackage{needspace}

\usepackage[explicit,pagestyles]{titlesec}

\titleformat{\section}{\needspace{10\baselineskip}\color{headcol}\large\sffamily\bfseries}{\thesection}{1em}{#1}[]
\titleformat{\subsection}{\needspace{7\baselineskip}\color{headcol}\large\sffamily\bfseries}{\thesubsection}{1em}{#1}[]
\titleformat{\subsubsection}{\needspace{4\baselineskip}\normalsize\sffamily\bfseries}{\thesubsubsection}{1em}{#1}[]    

相关内容