Странный глюк с \linenottooshort в мемуарах

Странный глюк с \linenottooshort в мемуарах

Согласно документации memoir, глава 8.4.1, команда \linenottooshort должна гарантировать, что последняя строка абзаца не будет короче необязательной длины (по умолчанию 2em). Поэтому я ожидаю, что команда поможет мне сократить количество абзацев с короткими последними строками.

Однако первый MWE (без \linenottooshort) дает результат, показанный слева на рисунке ниже, тогда как второй MWE (с \linenottooshort) дает результат, показанный справа, который явно хуже в отношении коротких последних строк.

Я предполагаю, что текст в последней строке примера справа может быть не короче 2em. Но ведь \linenottooshort не должен делать абзацы хуже, чем они были бы без него? Что здесь происходит?

Левый:

\documentclass[11pt]{memoir}
\setlength{\textwidth}{120mm}
\setlength{\parindent}{0mm}
\usepackage{blindtext}

\begin{document}
\blindtext
\end{document}

Верно:

\documentclass[11pt]{memoir}
\setlength{\textwidth}{120mm}
\setlength{\parindent}{0mm}
\usepackage{blindtext}

\linenottooshort

\begin{document}
\blindtext
\end{document}

до и после

решение1

Расположение \linenottooshortневерное: он должен идти после \begin{document}, так как до него memoirеще не были актуализированы размеры страницы.

В любом случае, команда обязательно выдаст другие странные результаты, поскольку она неправильно устанавливает \@tempdima, значение которого может измениться без уведомления, поскольку он является регистром длины царапины.

Если посмотреть на значение \@tempdimaпосле doing \linenottooshortв преамбуле, то получится 325,19989pt; done в documentсреде значение будет 297,63295pt.

Правильным определением было бы

\documentclass[11pt]{memoir}
\setlength{\textwidth}{120mm}
\setlength{\parindent}{0mm}
\usepackage{blindtext}

\makeatletter
\renewcommand*{\linenottooshort}[1][4em]{%
  \@tempdima=\hsize
  \advance\@tempdima -#1\relax
  %\leftskip\z@skip    % ???
  %\rightskip\leftskip % ???
  \begingroup\edef\x{\endgroup
    \parfillskip=\the\@tempdima \@minus \the\@tempdima\relax
  }\x
}
\makeatother

\AtBeginDocument{\linenottooshort}

\begin{document}

\blindtext

\end{document}

Остерегайтесь, что это может дать странные результаты в minipage, \parboxили списках. Я не совсем уверен в его полезности.

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