我有一个\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}
答案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}