![嵌套环境时防止分页](https://linux22.com/image/343031/%E5%B5%8C%E5%A5%97%E7%8E%AF%E5%A2%83%E6%97%B6%E9%98%B2%E6%AD%A2%E5%88%86%E9%A1%B5.png)
我有两个嵌套环境,每个环境都有不同的用途,第一个环境为我提供了一个标题。不幸的是,虽然我\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}