\wd 的 LaTeX 等效项

\wd 的 LaTeX 等效项

请考虑以下代码:

\newsavebox{\mybox}
\savebox{\mybox}{some text}
\newlength{\widthmybox}
\settowidth{\widthmybox}{\usebox{\mybox}}

那么\widthmybox相当于\wd\mybox

答案1

\wdLaTeX 中的等效项是\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

相关内容