Предотвратить разрыв страницы после первой строки примера

Предотвратить разрыв страницы после первой строки примера

Я хотел бы найти способ предотвратить разрыв страницы между первой строкой примера в следующем коде.

\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

Здесь происходят две вещи:

  1. Оба exeи xlistсоздают listсреду, и эти списки выполняют кучу тестов в начале. Один из которых — выдать новый абзац (через \par). Мы обновляем \par, чтобы всегда выдавать \nobreakпосле него (вы можете настроить это);
  2. Первый пункт также выдает 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}

Связанный контент