有一个问题我尝试解决一段时间了,但至今没有成功。据我所知,TeX 非常擅长根据固定的容器宽度适当地断行文本。我想要实现的是不同的:我希望能够计算给定内容的“最佳”宽度。
所谓最优,是指存在潜在的约束。例如,我希望能够编写一个命令,\settooptimalwidth#1#2#3
该命令需要:
- #1 为调整长度
- #2 作为最大宽度
- #3 作为内容
如果 #3 非常短(比 #2 短),它就会像 一样执行操作\settowidth
。如果 #3 比 #2 长,它会将 #3 分成几行,就像将其放入迷你盒子中一样,并且(这是棘手的部分)返回其中最宽行的长度。我在这里假设换行算法不使用通常的“对齐”对齐,而是使用不规则左/右对齐或居中(否则问题就无关紧要了)。
让我举几个例子来说明这种命令的用处:* 自动调整数组列的宽度,该列的内容将居中,并可能出现换行,* 某种带有精美框架的右对齐诗句环境。如果诗句很短,则框架会很小。如果诗句很长,它会将文本拆分为“最佳”宽度。
我认为应该使用\unhbox
,但我不确定如何使用它。如能得到任何帮助,我将不胜感激。
答案1
正如 David Carlisle 在上面所写,该软件包varwidth
是可行的。它提供了varwidth
我所要求的环境。这是一个使用 beamer 在渐变阴影背景上绘制文本的最小示例。
\documentclass{beamer}
\usepackage{calc,varwidth}
\colorlet{titleshadeA}{white!30!orange}
\colorlet{titleshadeB}{red!30!black}
\newlength\shadeboxwidth
\newlength\shadeboxheight
\newlength\shadeboxsep
\newcommand\shadebox[4]{%
\setlength\shadeboxsep{#3}%
\settowidth\shadeboxwidth{\begin{varwidth}{\textwidth}#4\end{varwidth}}%
\advance\shadeboxwidth by 2\shadeboxsep%
\settototalheight\shadeboxheight{\begin{varwidth}{\textwidth}#4\end{varwidth}}%
\advance\shadeboxheight by 2\shadeboxsep%
\pgfdeclarehorizontalshading{titleshade}{\shadeboxheight}{%
color(0mm)=(#1);%
color(\shadeboxwidth)=(#2)%
}%
\rlap{\pgfuseshading{titleshade}}%
\begin{beamercolorbox}[sep=\shadeboxsep,wd=\shadeboxwidth,ht=\shadeboxheight,dp=0pt]{postit}%
\color{white}\begin{varwidth}{\textwidth}\raggedleft#4\end{varwidth}%
\end{beamercolorbox}%
}
\begin{document}
\begin{frame}
\strut\hfill\shadebox{titleshadeA}{titleshadeB}{1ex}{\raggedleft\LARGE Something short}\\
\strut\hfill\shadebox{titleshadeA}{titleshadeB}{1ex}{\raggedleft\LARGE Something very long which will be broken and aligned to the right}\bigskip
\hrule height 2pt\bigskip
Notice how it doesnt spawn the total text width (see the black rule above), but instead adjusts itself to the longest text line of the content.
\end{frame}
\end{document}