
Я хотел бы найти способ предотвратить разрыв страницы между первой строкой примера в следующем коде.
\documentclass{article}
\usepackage{lipsum}
\usepackage{gb4e}
\begin{document}
\lipsum[3-7]
Some extra text to get the page break in the right place.
\begin{exe}
\ex\label{Label} Some description of this example
\begin{xlist}
\ex[*] {
First sentence.}
\ex[] {
First sentence.}
\ex[*] {
Third sentence.}
\end{xlist}
\end{exe}
\end{document}
У меня нет проблем с разрывом страницы после первого фактического элемента (т. е. между элементами (a) и (b)). Я просто не хочу, чтобы заголовок примера был отделен от фактических элементов примера.
Важно, чтобы пример был отформатирован с помощью gb4e
пакета (а не более общей среды списка), поскольку у меня много примеров со сложными лингвистическими глоссами, для которых требуется пакет, посвященный этой проблеме. Я бы предпочел использовать этот пакет, поскольку у меня много примеров, уже отформатированных для этого пакета (в отличие от других пакетов для лингвистических примеров).
Я знаю, что на этом сайте есть много вопросов, касающихся предотвращения или принудительного разрыва страниц в определенных точках, но я не нашел ответа, который бы работал с примерами, созданными с использованием пакета gb4e
. Я пытался добавлять такие вещи, как \nopagebreak
в самом примере или \goodbreak
перед примером, но разрыв страницы остается на том же месте.
Наконец, мне удалось перенести весь пример на следующую страницу, поместив его в minipage
среду, но это имеет два недостатка. Во-первых, это не позволяет сделать разрыв между (a) и (b) в примере, когда это было бы нормально. Во-вторых, это потребовало бы ручной проверки этих сирот. Это не очень практично для длинных документов (например, диссертации).
решение1
Попробуйте использовать следующее \nolistbreak
непосредственно перед (вложенным) xlist
:
\makeatletter
\newcommand{\nolistbreak}{%
\let\oldpar\par\def\par{\oldpar\nobreak}% Any \par issues a \nobreak
\@nobreaktrue% Don't break with first \item
}
\makeatletter
Здесь происходят две вещи:
- Оба
exe
иxlist
создаютlist
среду, и эти списки выполняют кучу тестов в начале. Один из которых — выдать новый абзац (через\par
). Мы обновляем\par
, чтобы всегда выдавать\nobreak
после него (вы можете настроить это); - Первый пункт также выдает a реагирует по-разному, когда
\@nobreaktrue
, устанавливая некоторый произвольно высокий штраф.
Я не уверен, может ли это сломать что-то еще, поэтому используйте с осторожностью. Изменения, инициированные вызовом, \nolistbreak
будут локальными по области действия для среды, в которой он вызывается, так что это может быть не так уж и плохо.
\documentclass{article}
\usepackage{lipsum,gb4e}
\makeatletter
\newcommand{\nolistbreak}{%
\let\oldpar\par\def\par{\oldpar\nobreak}% Any \par issues a \nobreak
\@nobreaktrue% Don't break with first \item
}
\makeatletter
\begin{document}
\lipsum[3-7]
Some extra text to get the page break in the right place.
\begin{exe}
\ex\label{Label} Some description of this example
\nolistbreak
\begin{xlist}
\ex[*] {
First sentence.}
\ex[] {
First sentence.}
\ex[*] {
Third sentence.}
\end{xlist}
\end{exe}
\end{document}