回忆录中的 \linenottooshort 出现奇怪故障

回忆录中的 \linenottooshort 出现奇怪故障

根据回忆录的文档,第 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执行之后的值,你会得到 325.19989pt;在环境中完成之后,该值将为 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我不太确定它的实用性。

相关内容