将文本分成等宽的行以使文本居中

将文本分成等宽的行以使文本居中

我正在生成一堆标题居中且长度不一的文档。有时标题会延伸到第二行。当它们出现这种情况时,我宁愿让换行符出现在中间某处,以便两行的长度大致相等。但据我所知,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}
}

相关内容