段落最后一行居中;但我不喜欢小行

段落最后一行居中;但我不喜欢小行

注意力:这是一个高级 TeX 问题。

我通常不喜欢太小的线条,所以我倾向于添加

\parfilskip=2em plus 0.6\textwidth

到我的文档(除了小行之外,这还可以避免最后几行太靠近右边距,确保段落结束于距边距至少 2em 处)。

我的问题出在图形上,我也希望最后一行居中。Memoir 和其他类/包提供了实现此效果的宏,例如\centerlastline来自 Memoir 的宏,其定义为:

\leftskip=0pt plus 1fil
\rightskip=0pt plus -1fil
\parfilskip=0pt plus 2fil

这个巧妙的代码允许最后一行居中,但有时最后一行很短(例如只有一个单词)。我想要做的是调整该宏,使可拉伸性不是无限拉伸。我的第一个方法是尝试

\leftskip=0pt plus 0.3\textwidth
\rightskip=0pt plus -0.3\textwidth
\parfillskip=0pt plus 0.6\textwidth

我的直觉是,对于段落中间的行,可拉伸性将被计算为 0,因此它们将被写在正确的位置,而最后一个行在左侧和右侧将具有足够的可拉伸性以绝对居中。不幸的是,这不起作用,因为段落会以不稳定的方式排版

\documentclass[10pt,a4paper]{article}
\usepackage{lipsum}
\begin{document}

\leavevmode \vskip-10em \parindent=0pt \hsize=12cm

\textbf{REGULAR}\par
\lipsum[1] \vskip\baselineskip

\textbf{REGULAR / NOT SMALL}\par
{\parfillskip=2em plus 0.6\textwidth
 \lipsum[1]} \vskip\baselineskip

\textbf{CENTRED}\par
{\leftskip=0pt plus 1fil
 \rightskip=0pt plus -1fil
 \parfillskip=0pt plus 2fil
 \lipsum[1]} \vskip\baselineskip

\textbf{CENTRED / NOT SMALL}\par
{\leftskip=0pt plus 0.3\textwidth
 \rightskip=0pt plus -0.3\textwidth
 \parfillskip=0pt plus 0.6\textwidth
 \lipsum[1]} \vskip\baselineskip

\end{document}

上述代码的结果

问题(就我所见)在于空格也会影响线条的可拉伸性。这意味着:

  1. 段落中间行的总可拉伸性不为 0
  2. 然后它就被传播出去了,
  3. 这意味着左边距为正值,右边距为相应的负值
  4. 最终导致松散的线条向右移动(紧线根本不伸展,因此它们被固定在位)。

对这个问题有什么想法吗?

答案1

图哈米评论中的建议让我找到了这个公认的小众问题的答案。解决方案是构建段落,就像正常排版一样,然后手动处理最后一段的定位。具体如下:

\textbf{CENTRED / NOT SMALL}\par
{
    % Typeset as we did previously for the "regular / not small" case
    % by specifying a custom \parfillskip
    \parfillskip=2em plus 0.6\textwidth
    % Create a vbox with the content needed
    \setbox0=\vbox{\lipsum[1]}
    \setbox1=\vbox{%
        % Unwind the previously build box
        \unvbox0
        % put the last box (which is the last line of the paragraph)
        % in its own register
        \setbox2=\lastbox
        % place this box on a new hbox but remove the two last
        % glues, which are the parfillskip and the right margin
        % this box also has \hfill on both sides to centre it
        \hbox to \textwidth{\hfill\unhcopy2 \unskip\unskip\hfill}
    }
    % Unwind the vertical box previously constructed
    \unvbox1
}

结果是,最后一行确实不像未定制的段落那么短,并且也居中:

上述代码的结果

相关内容