防止环境结束后分页(例如诗句)

防止环境结束后分页(例如诗句)

亲爱的女士们,先生们,

我最近一直在排版诗歌和散文,但日期方面有些问题。具体来说,我希望日期紧跟在前面的文本后面,并紧跟在文本后面(例如,不分页)。每当排版散文时,这似乎都是显而易见的——请参阅此解决方法:

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

然而,在环境中使用 verse 时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}

相关内容