我正在生成一堆标题居中且长度不一的文档。有时标题会延伸到第二行。当它们出现这种情况时,我宁愿让换行符出现在中间某处,以便两行的长度大致相等。但据我所知,LaTeX 不允许这样做,因为这会导致水平盒子未满。
有没有办法可以动态地改变 hbox 的宽度,使之对于给定的行数尽可能窄(例如,一旦有了第二条线,就尽可能地减小 hbox,而不创建第三条线)?
注意:这个问题与“如何让 (La)TeX 优先填充居中线”因为这是关于改变要填充的线条的宽度,而不是让这些宽度逐行减小。我也尝试了 varwidth 包,但没有成功。
\documentclass{article}
\begin{document}
\begin{center}
\LARGE \bfseries
This is a short title.\\
~\\
This is a longer one-line title.\\
~\\
This is a longer title that runs onto two lines.\\
~\\
% I would rather it look like this
\begin{minipage}{3in}
\centering
This is a longer title that runs onto two lines.\\
\end{minipage}
\end{center}
\end{document}
答案1
我想到了一个办法。下面的自定义函数确定文本将分布在多少行上,用文本的宽度除以行数(以获得均匀宽度的行),然后将文本放在适当宽度的 parbox 中。
\usepackage{xparse}
\ExplSyntaxOn
\DeclareExpandableDocumentCommand{\floor}{m}
{
\fp_eval:n { floor ( #1 ) }
}
\ExplSyntaxOff
\newcommand{\compactcentering}[1]{
\newlength{\inputlength}
\settowidth{\inputlength}{#1}
\newcounter{breakerlines}
\setcounter{breakerlines}{\floor{\inputlength / \textwidth}}
\stepcounter{breakerlines}
\parbox{{\inputlength / \value{breakerlines}}+ 2\fboxsep}{\center \noindent #1}
}