注意力:这是一个高级 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}
问题(就我所见)在于空格也会影响线条的可拉伸性。这意味着:
- 段落中间行的总可拉伸性不为 0
- 然后它就被传播出去了,
- 这意味着左边距为正值,右边距为相应的负值
- 最终导致松散的线条向右移动(紧线根本不伸展,因此它们被固定在位)。
对这个问题有什么想法吗?
答案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
}
结果是,最后一行确实不像未定制的段落那么短,并且也居中: