我正在尝试使用以下方法获取宏参数的宽度
\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.