平衡不规则的右线长度

平衡不规则的右线长度

我有一个\section-like 命令,它带有一个可选的标题。标题可能为空(默认)、很短或太长,一行都放不下。在后一种情况下,我希望将其拆分成长度大致相等的行并打印出来\raggedright。这可能吗?

我发现其他问题的方法是减少在每行末尾添加的胶水,但我不认为我能走那条路,因为标题可能是空的,在这种情况下我需要胶水延伸到整条线上。


这是我的命令的玩具版本。

\documentclass{article}

\newcommand*\foo[1]{%
  \par
  {\raggedright\Large\bfseries\sffamily
    \strut #1%
    \par
  }%
  \hrule
  \noindent\ignorespaces
}

\begin{document}

\noindent
asdf

\foo{}
asdf

\foo{short}
asdf

\foo{long, I mean really long, so long that it can't fit on a single line}
asdf

\end{document}

MWE 输出


期望输出: MWE 输出

答案1

我计算文本的自然宽度,然后将其设置\rightskip为线宽减去要排版的线条的近似宽度,并具有一定的可拉伸性。

另外,通过应用一个相当高的值\linepenalty,我们将行数保持在最低限度。

\documentclass[draft]{article}
\usepackage{xfp}

\newcommand{\fooformat}{\Large\bfseries\sffamily}

\newcommand*\foo[1]{%
  \par
  \sbox0{\fooformat #1}%
  {%
   \raggedright
   \fooformat
   \linepenalty3000
   \rightskip=\dimexpr\linewidth-\wd0/\fpeval{1+round(\wd0/\textwidth)}\relax plus 4em\relax
   \strut #1\par
  }%
  \hrule
  \noindent\ignorespaces
}

\begin{document}

\noindent
asdf

\foo{}
asdf

\foo{short}
asdf

\foo{long, I mean really long, so long that it can't fit on a single line}
asdf

\foo{long, I mean really long, so long that it can't fit on a single line
 and even longer, but really really longer}
asdf

\end{document}

在此处输入图片描述

相关内容