嵌套环境时防止分页

嵌套环境时防止分页

我有两个嵌套环境,每个环境都有不同的用途,第一个环境为我提供了一个标题。不幸的是,虽然我\nobreak在第一个环境之后立即调用第二级环境时在适当的位置有一个(我认为),但它并不能阻止在标题之后立即发生分页符。

在此处输入图片描述

\documentclass{report}
\usepackage{lipsum}
\usepackage{expex}
\newcounter{mycounter}[chapter]%
\renewcommand{\themycounter}{\thechapter.\arabic{mycounter}}
\newenvironment{firstlevel}{%
\par\addvspace{\medskipamount}%
\refstepcounter{mycounter}%
\noindent\textbf{Testing\ \themycounter}%
\par\nobreak\addvspace{\medskipamount}% << nobreak ignored
\noindent\ignorespaces
}{%
\par\addvspace{\medskipamount}\ignorespacesafterend\noindent
} 
\newenvironment{secondlevel}{}{} 

\begin{document}

Extraline to reach end of page

Extraline to reach end of page

\lipsum[2-6]

\begin{firstlevel}
\begin{secondlevel}

\lipsum[2]

\end{secondlevel}
\end{firstlevel} 
\lipsum[1-2]
\end{document}

在这种情况下我怎样才能\nobreak获得尊重?

(MWE 中的第二级环境只是一个虚假环境,但在实际设置中它做了一些重要的事情,而第一级环境却做不到,因为它们并不总是一起出现。)


编辑: 坦白说,我不仅需要在上面的情况中这样做,还需要在另外两种情况下这样做:一种是下一段以引语开头,例如\begin{firstlevel}\begin{quote}Quote\end{quote}\end{firstlevel}

这与上面的解决方案一致。但也有可能下一段以一个expex例子开头:

\begin{firstlevel}
\ex \begingl  \gla  Test  //
\glb  Test  //
\endgl \xe
\end{firstlevel}

在这种情况下,它不起作用。

答案1

分页符不会被忽略,只是您引入了一个只有一行且没有文本的全白段落,并且该行与标题一起保留。

如果你使用

\par\nobreak\addvspace{\medskipamount}% << nobreak ignored
\noindent X\ignorespaces
}{%
\par\addvspace{\medskipamount}\ignorespacesafterend\noindent
} 

然后你就会看到

在此处输入图片描述

如果省略,X该段落仍然存在,但更难看到。

如果您使用,\noindent那么段落从环境的开始代码开始,因此您不能以空白行或列表或任何类型的显示来开始环境主体。

LaTeX 永远不会在它定义的环境中这样做,最好使用列表定义环境并使用\item或将环境设置为标题。这两种方法都可以防止分页符,并且可以选择不使用来抑制缩进(在内部,它们使用而不是使用来\noindent删除缩进)\setbox\noindent

例如

\documentclass{report}
\usepackage{lipsum}
\newcounter{mycounter}[chapter]%
\renewcommand{\themycounter}{\thechapter.\arabic{mycounter}}
\newenvironment{firstlevel}{%
\par\addvspace{\medskipamount}%
\refstepcounter{mycounter}%
\subsection*{Testing\ \themycounter}%
\par\nobreak\addvspace{\medskipamount}% << nobreak ignored
}{%
\par\addvspace{\medskipamount}\ignorespacesafterend
} 
\newenvironment{secondlevel}{}{} 

\begin{document}

Extraline to reach end of page

Extraline to reach end of page

\lipsum[2-6]

\begin{firstlevel}
\begin{secondlevel}

\lipsum[2]

\end{secondlevel}
\end{firstlevel} 
\lipsum[1-2]
\end{document}

相关内容