请考虑以下代码:
\newsavebox{\mybox}
\savebox{\mybox}{some text}
\newlength{\widthmybox}
\settowidth{\widthmybox}{\usebox{\mybox}}
那么\widthmybox
相当于\wd\mybox
?
答案1
\wd
LaTeX 中的等效项是\wd
。;-)
嗯,手册中没有记录,但它肯定可以使用。
“官方”的方式是
% in the preamble
\newsavebox{\mybox}
\newlength{\wdofmybox}
% at usage time
\sbox{\mybox}{some text}
\settowidth{\wdofmybox}{\usebox{\mybox}}
然后\wdofmybox
可以在 TeX 需要长度的任何地方使用。
更简单
\setlength{\wdofmybox}{\wd\mybox}
具有相同的效果,而且速度更快,因为它不需要 TeX 重新装箱 的内容\mybox
。但是你应该记住\wd
是一个原始命令,它需要一个<number>
(\mybox
实际上是)和不括号。换句话说,\wd{\mybox}
这是非法的,并且会导致几个错误。
你甚至可以避免使用这段\setlength
话,在需要的地方直接使用\wd\mybox
,但你不能说
\addtolength{\wd\mybox}{3pt}
对于这样的情况,您需要一个辅助长度寄存器。
答案2
等效性分析
他们是不是等效的。\settowidth
从 LaTeX 内核添加另一个装箱层(latex.ltx
):
% #1: \ht, \dp or \wd
% #2: The argument of \settoheight, \settodepth, or \settowidth
% #3: The box contents
\def\@settodim#1#2#3{%
\setbox\@tempboxa\hbox{{#3}}%
#2#1\@tempboxa
\setbox\@tempboxa\box\voidb@x
}
\DeclareRobustCommand\settoheight{\@settodim\ht}
\DeclareRobustCommand\settodepth {\@settodim\dp}
\DeclareRobustCommand\settowidth {\@settodim\wd}
另外,setbox...\hbox
的令牌寄存器\everyhbox
将被插入到的开头\hbox
:
\documentclass{article}
\newsavebox{\mybox}
\savebox{\mybox}{some text}
\newlength{\widthmybox}
\everyhbox{\kern100pt}
\settowidth{\widthmybox}{\usebox{\mybox}}
\typeout{* \string\wd\string\mybox=\the\wd\mybox}
\typeout{* \string\widthmybox=\the\widthmybox}
\begin{document}
\end{document}
结果:
* \wd\mybox=42.55563pt
* \widthmybox=142.55563pt
实际上,令牌寄存器\everyhbox
通常为空,但它可以包含对宽度有贡献的内容。
软件包 settobox
如果您想要将盒子尺寸分配给长度寄存器,请查看包。它使用LaTeX 宏settobox
包装“低级”内容。我们得到:\wd
\settoboxwidth
\documentclass{article}
\usepackage{settobox}
\newsavebox{\mybox}
\savebox{\mybox}{some text}
\newlength{\widthmybox}
\everyhbox{\kern100pt}
\settoboxwidth{\widthmybox}{\mybox}
\typeout{* \string\wd\string\mybox=\the\wd\mybox}
\typeout{* \string\widthmybox=\the\widthmybox}
\begin{document}
\end{document}
现在这些值是相等的,因为避免了额外的装箱级别:
* \wd\mybox=42.55563pt
* \widthmybox=42.55563pt