Предотвратить разрыв страницы после окончания среды (например, стиха)

Предотвратить разрыв страницы после окончания среды (например, стиха)

Дамы и господа,

Недавно я занимался набором стихов и прозы, и у меня возникли проблемы с датами. В частности, я хочу, чтобы дата следовала сразу за предыдущим текстом и придерживалась его (например, без разрыва страницы). Это, кажется, очевидно, когда набирается проза --- см. этот обходной путь:

\newcommand{\dated}[1]{\nobreak\par\noindent\null\hfill\textit{#1}}

Однако, со стихом вverse окружении, это становится практически невозможным, так как LaTeX считает, что разрыв всегда благоприятен после \end{verse}, конца окружения. Я гуглил, но не смог найти способ предотвратить его разрывпослеокружающая среда.

С прозой это работает просто чудесно:

\documentclass[12pt, oneside]{article}
\usepackage[utf8]{inputenc}
\usepackage[papersize={11cm, 15cm}, textwidth=10cm, textheight=11.2cm]{geometry}
\usepackage{lipsum}
\newcommand{\dated}[1]{\nobreak\par\noindent\null\hfill\textit{#1}}

\begin{document}
\null\vspace{2.3cm}
\lipsum[1]
\dated{30.01.2018}
\end{document}

Правильный взлом

Однако с поэзией дела обстоят не так:

\documentclass[12pt, oneside]{article}
\usepackage[utf8]{inputenc}
\usepackage[papersize={11cm, 15cm}, textwidth=10cm, textheight=11.2cm]{geometry}
\usepackage{lipsum}
\newcommand{\dated}[1]{\nobreak\par\noindent\null\hfill\textit{#1}}

\begin{document}
\lipsum[1]

\begin{verse}
    THERE was a young lady of Niger \\
    Who smiled as she rode on a Tiger; \\   
    They came back from the ride    \\
    With the lady inside,   \\
    And the smile on the face of the Tiger.
\end{verse}
\dated{30.01.2018}
\end{document}

Неправильный перерыв

Я не могу использовать, \needspaceпотому что все стихи помещаются между этими \begin{verse}... \end{verse}, а стихотворений несколько сотен, поэтому я не могу вставить \needspaceкаждую последнюю строку стиха.

Может быть, можно как-то переопределить стих? Или какой-нибудь другой трюк, чтобы заставить \nobreakработать после \end{verse}?

Любая помощь приветствуется!

решение1

Это решение помещает дату ВНУТРИ среды стиха и прикрепляет ее к последней строке. Хотя можно использовать \unskipили \vskip-\lastskipдля удаления части пространства в конце среды стиха, если вы уже находитесь на следующей странице, это не принесет вам никакой пользы.

\documentclass[12pt, oneside]{article}
\usepackage[utf8]{inputenc}
\usepackage[papersize={11cm, 15cm}, textwidth=10cm, textheight=11.2cm, showframe]{geometry}
\usepackage{lipsum}
\newcommand{\dateverse}[1]{\hfill\rlap{\hspace{\rightmargin}%
  \llap{\raisebox{-\baselineskip}{\textit{#1}}}}}
\begin{document}
\lipsum[1]

\begin{verse}
    THERE was a young lady of Niger \\
    Who smiled as she rode on a Tiger; \\   
    They came back from the ride    \\
    With the lady inside,   \\
    And the smile on the face of the Tiger.
    \dateverse{30.01.2018}
\end{verse}
\end{document}

Мне пришло в голову, что это \raiseboxпревращает дату в выносной элемент, а LaTeX выравнивает только базовые линии внизу страницы, а не выносные элементы. Чтобы переместить базовую линию, нужно включить предыдущую строку в рамку.

\documentclass[12pt, oneside]{article}
\usepackage[utf8]{inputenc}
\usepackage[papersize={11cm, 15cm}, textwidth=10cm, textheight=11.2cm, showframe]{geometry}
\usepackage{lipsum}
\newcommand{\dated}[1]{\ifvmode\else\newline\fi
  \null\hfill\rlap{\hspace{\rightmargin}\llap{\textit{#1}}}}
\begin{document}
\lipsum[1]

\begin{verse}
    THERE was a young lady of Niger \\
    Who smiled as she rode on a Tiger; \\   
    They came back from the ride    \\
    With the lady inside,   \\
    \parbox[b]{\dimexpr \linewidth-\itemindent}%
    {And the smile on the face of the Tiger.
    \dated{30.01.2018}}
\end{verse}
\end{document}

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