Я пишу тексты песен. Если возможно, частично пустые страницы должны быть предпочтительнее разрывов страниц внутри абзацев. Использование \widowpenalties 1 10000
and \raggedbottom
не сработало.
До сих пор мне удавалось добиться желаемого поведения только путем добавления \filbreak
после каждого абзаца (= строфы).
\documentclass[12pt]{article}
\usepackage[paperwidth=16cm, paperheight=9cm]{geometry}
\usepackage{nopageno}
\setlength\parindent{0pt}
\setlength\parskip{1em}
% Manually adding \filbreak at the end of stanza. This works as expected:
\begin{document}
\raggedright
Roads go ever ever on,\\
Over rock and under tree,\\
By caves where never sun has shone,\\
By streams that never find the sea;\\
Over snow by winter sown,\\
And through the merry flowers of June,\\
Over grass and over stone,\\
And under mountains in the moon.\filbreak
Roads go ever ever on\\
Under cloud and under star,\\
Yet feet that wandering have gone\\
Turn at last to home afar.\\
Eyes that fire and sword have seen\\
And horror in the halls of stone\\
Look at last on meadows green\\
And trees and hills they long have known.\filbreak
\end{document}
Однако я не хочу вручную вводить это после каждого абзаца. Я попробовал использовать метод изэтотответ. Проблема в том, что мне также приходится использовать \\
для достижения правильных переносов строк между стихами. Используя метод из вышеупомянутого ответа, я получаю \filbreak
в каждом \\
, так что это не работает.
\documentclass[12pt]{article}
\usepackage[paperwidth=16cm, paperheight=9cm]{geometry}
\usepackage{nopageno}
\setlength\parindent{0pt}
\setlength\parskip{1em}
% Trying to add \filbreak after each paragraph automatically. Not working:
\makeatletter
\def\filbreak{!\@@par\vfil\penalty-200\vfilneg}
% Exclamation mark is there just to show, that \\ is also treated like \par.
\makeatother
\begin{document}
\raggedright
\let\par\filbreak
Roads go ever ever on,\\
Over rock and under tree,\\
By caves where never sun has shone,\\
By streams that never find the sea;\\
Over snow by winter sown,\\
And through the merry flowers of June,\\
Over grass and over stone,\\
And under mountains in the moon.
Roads go ever ever on\\
Under cloud and under star,\\
Yet feet that wandering have gone\\
Turn at last to home afar.\\
Eyes that fire and sword have seen\\
And horror in the halls of stone\\
Look at last on meadows green\\
And trees and hills they long have known.
\end{document}
Можно ли как-то поставить пользовательскую команду ( \filbreak
) после каждого абзаца, но не после каждого \\
? Как на самом деле связаны \par
и \\
? Я предпочитаю не использовать какой-либо другой поэтический пакет, потому что я пишу свой собственный с каким-то другим специфическим поведением, не имеющим отношения к этому вопросу.
решение1
Я предлагаю перейти \\
в \newline
среду poem
, в которой вы установили \interlinepenalty=10000
, так чтобы разрывы страниц были разрешены только между абзацами.
\documentclass[12pt]{article}
\usepackage[paperwidth=16cm, paperheight=9cm]{geometry}
\usepackage{nopageno}
\setlength\parindent{0pt}
\setlength\parskip{1em}
\newenvironment{poem}{%
\begin{flushleft}\let\\\newline
\interlinepenalty=10000
}{\end{flushleft}}
\begin{document}
\begin{poem}
Roads go ever ever on,\\
Over rock and under tree,\\
By caves where never sun has shone,\\
By streams that never find the sea;\\
Over snow by winter sown,\\
And through the merry flowers of June,\\
Over grass and over stone,\\
And under mountains in the moon.
Roads go ever ever on\\
Under cloud and under star,\\
Yet feet that wandering have gone\\
Turn at last to home afar.\\
Eyes that fire and sword have seen\\
And horror in the halls of stone\\
Look at last on meadows green\\
And trees and hills they long have known.
\end{poem}
\end{document}
решение2
Вы можете использовать para
хук, чтобы добавить \filbreak
и предотвратить разрывы страниц в строфе, установив высокий\interlinepenalty
\documentclass[12pt]{article}
\usepackage[paperwidth=16cm, paperheight=9cm]{geometry}
\usepackage{nopageno}
\setlength\parindent{0pt}
\setlength\parskip{1em}
\AddToHook{para/after}{\filbreak}
\showoutput
% Manually adding \filbreak at the end of stanza. This works as expected:
\begin{document}
\interlinepenalty=9000
Roads go ever ever on,\\
Over rock and under tree,\\
By caves where never sun has shone,\\
By streams that never find the sea;\\
Over snow by winter sown,\\
And through the merry flowers of June,\\
Over grass and over stone,\\
And under mountains in the moon.
Roads go ever ever on\\
Under cloud and under star,\\
Yet feet that wandering have gone\\
Turn at last to home afar.\\
Eyes that fire and sword have seen\\
And horror in the halls of stone\\
Look at last on meadows green\\
And trees and hills they long have known.
\end{document}