回想録の \linenottooshort に関する奇妙な不具合

回想録の \linenottooshort に関する奇妙な不具合

memoir のドキュメント、第 8.4.1 章によると、コマンド \linenottooshort は、段落の最後の行がオプションの長さ (デフォルトは 2em) より短くならないようにするためのものです。そのため、このコマンドによって、最後の行が短い段落の数を減らすことができると期待しています。

ただし、最初の MWE (\linenottooshort なし) では下の図の左側の結果が得られ、2 番目の 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いずれにせよ、このコマンドは、スクラッチ長さレジスタである を誤って設定し、予告なしに値が変更されてしまうため、他の奇妙な結果を返すことになります。

プリアンブルで\@tempdimaafter doingの値を見ると、325.19989pt になりますが、環境で done を実行すると、値は 297.63295pt になります。\linenottooshortdocument

正しい定義は

\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。その有用性についてはよくわかりません。

関連情報