如何获取纯 TeX 中参数的宽度?

如何获取纯 TeX 中参数的宽度?

我正在尝试使用以下方法获取宏参数的宽度

\def\getwidthof#1{%
    \newdimen\myl%
    \settowidth\myl{#1}%
    \the\myl%
}

其中\settowidth定义为

\catcode`\@=11
\newbox\@tempboxa
\def\@settodim#1#2#3{\setbox\@tempboxa\hbox{{#3}}#2#1\@tempboxa
   \setbox\@tempboxa\box\voidb@x}
\def\settoheight{\@settodim\ht}
\def\settodepth {\@settodim\dp}
\def\settowidth {\@settodim\wd}
\catcode`\@=12

使用 egreg 的答案这里。我希望代码\getwidthof{some text}打印出宽度some text,在本例中为42.55563pt。代码

\newdimen\myl
\settowidth\myl{some text}
\the\myl

可以工作,但使用参数时会中断。是不是因为#1放入时没有展开\settowidth\myl{#1}

答案1

不管是否错误,你的代码都是错误的。\dimen每次调用时你都会分配一个新的寄存器\getwidthof,这浪费了资源。

让我们看一下没有错误的定义:

\def\getwidthof#1{%
    \csname newdimen\endcsname\myl%
    \settowidth\myl{#1}%
    \the\myl%
}
\catcode`\@=11
\newbox\@tempboxa
\def\@settodim#1#2#3{\setbox\@tempboxa\hbox{{#3}}#2#1\@tempboxa
   \setbox\@tempboxa\box\voidb@x}
\def\settoheight{\@settodim\ht}
\def\settodepth {\@settodim\dp}
\def\settowidth {\@settodim\wd}
\catcode`\@=12

\getwidthof{abc}
\getwidthof{def}
\getwidthof{ghij}

\bye

日志文件将包含

\@tempboxa=\box16
\myl=\dimen16
\myl=\dimen17
\myl=\dimen18

固定代码。

\catcode`\@=11
\newbox\@tempboxa
\def\@settodim#1#2#3{\setbox\@tempboxa\hbox{{#3}}#2#1\@tempboxa
   \setbox\@tempboxa\box\voidb@x}
\def\settoheight{\@settodim\ht}
\def\settodepth {\@settodim\dp}
\def\settowidth {\@settodim\wd}
\catcode`\@=12

\newdimen\myl
\def\printwidthof#1{%
  \settowidth{\myl}{#1}%
  \the\myl
}

\printwidthof{abc}

\printwidthof{def}

\printwidthof{ghil}

\bye

在此处输入图片描述

答案2

这也有帮助:

\newbox\mywidthbox%
\newdimen\mywidthdimen%

\def\getwidthof#1{%
\setbox\mywidthbox=\hbox{#1}%
\mywidthdimen=\wd\mywidthbox%
}

\getwidthof{test}

\showthe\mywidthdimen


\getwidthof{long test}

\showthe\mywidthdimen


\bye

16.16669pt.

37.8334pt.

相关内容