![如何获取 TeX 中 vbox 的实际宽度](https://linux22.com/image/400974/%E5%A6%82%E4%BD%95%E8%8E%B7%E5%8F%96%20TeX%20%E4%B8%AD%20vbox%20%E7%9A%84%E5%AE%9E%E9%99%85%E5%AE%BD%E5%BA%A6.png)
我尝试在 TeX 中获取插入超出盒子尺寸的材料后盒子的实际尺寸。
我可以通过读取 \ht0 和 \dp0 轻松获得高度,但是当我读取 \wd0 时,我得到的是 vbox 的大小,而不是放置在盒子内的实际材料的大小。
在上面的例子中,宽度设置为 350pt。这是我通过读取 \wd0 得到的。但该框中的实际文本大小要宽得多。
任何想法?
评论:
这就是我为什么要寻找的整个故事吗?
这是代码(基于此组中发现的其他解决方案,但效果不佳)。问题是如何自动调整字体大小以使文本在特定限制下紧密贴合定义的框。此小组多次讨论过这个问题,但所描述的解决方案都不适用于我的情况。代码可以工作,但如果文本很短则不行。它之所以不起作用主要是因为唯一要检查的因素是通过读取 \ht0 和 \dp0 尺寸来检查文本是否不长于框深度。但应该考虑另一个方面 - 文本是否不宽于框。
\documentclass{article}
\usepackage{lmodern}
\usepackage{environ}% http://ctan.org/pkg/environ
\usepackage{lipsum}% http://ctan.org/pkg/lipsum
\usepackage{hyphenat}
\usepackage{lato}
\newdimen\fontdim
\newdimen\upperfontdim
\newdimen\lowerfontdim
\newif\ifmoreiterations
\fontdim12pt
\makeatletter%
\NewEnviron{fitbox}[2]{% \begin{fitbox}{<width>}{<height>} stuff \end{fitbox}
\def\buildbox{%
\setbox0\vbox{\hbox{\minipage{#1}%
\fontsize{\fontdim}{1.2\fontdim}%
\selectfont%
\stuff%
\endminipage}}%
\dimen@\ht0%
\advance\dimen@\dp0%
}%
\def\stuff{\BODY}% Store environment body
\buildbox%
% Compute upper and lower bounds
\ifdim\dimen@>#2%
\loop%
\fontdim.5\fontdim% Reduce font size by half
\message{Reducing fontsize}%
\buildbox%
\ifdim\dimen@>#2 \repeat%
\lowerfontdim\fontdim%
\upperfontdim2\fontdim%
\fontdim1.5\fontdim%
\else%
\loop%
\fontdim2\fontdim% Double font size
\message{Doubling fontsize \the\fontdim\space Par2: #2}%
\buildbox %
\ifdim\dimen1 > \dimen3%
% \message{Width lower then max}%
\else%
\message{Width biggern then max}%
\fi%
\ifdim\dimen@<#2 \repeat%
\upperfontdim\fontdim%
\lowerfontdim.5\fontdim%
\fontdim.75\fontdim%
\fi%
% Now try to find the optimum size
\loop%
\message{Bounds: \the\lowerfontdim\space \the\fontdim\space \the\upperfontdim^^J}%
\buildbox%
\ifdim\dimen@>#2 %
\moreiterationstrue%
\upperfontdim\fontdim%
\advance\fontdim\lowerfontdim%
\fontdim.5\fontdim%
\else%
\advance\dimen@-#2%
\ifdim\dimen@<10pt%
\lowerfontdim\fontdim%
\advance\fontdim\upperfontdim%
\fontdim.5\fontdim%
\dimen@\upperfontdim%
\advance\dimen@-\lowerfontdim%
\ifdim\dimen@<.2pt%
\moreiterationsfalse%
\else%
\moreiterationstrue%
\fi%
\else%
\moreiterationsfalse%
\fi%
\fi%
\ifmoreiterations \repeat%
\box0% Typeset content
}
\makeatother%
\begin{document}
\fbox{%
\begin{fitbox}{87mm}{35mm}%
\lato\fontseries{eb}\selectfont \nohyphens{COMEDIANS WINS}
\end{fitbox}%
}
\end{document}