我有时会在尝试使用\widthof
该calc
包时遇到问题,但不知道原因。过去,我只是通过两步流程解决了这个问题,即定义 a\newdimen{}
并使用\settowidth
(或\setlength
和\widthof
) 确定值,然后再尝试使用此长度。
下面的 MWE 显示了当我尝试使用\widthof
作为 a 的长度\kern
(即\KernA
宏)时如何失败,但两步过程工作正常:
问题:
- 为什么
\KernA
不工作? - 什么时候可以
\widthof
直接用?
参考:
代码:
\documentclass{article}
\usepackage{calc}
\newcommand*{\KernA}{\kern\widthof{$text$}}%
\newdimen{\KernAmount}%
\newcommand*{\KernB}{%
\setlength{\KernAmount}{\widthof{$text$}}%
\kern\KernAmount%
}%
\newcommand*{\KernC}{%
\settowidth{\KernAmount}{$text$}%
\kern\KernAmount%
}%
\begin{document}
x~$text$~y
%x~\KernA~y \verb|\kernA: \widthof| ??
x~\KernB~y \verb|\KernB: \setlength and \widthof|
x~\KernC~y \verb|\KernC: \settowidth|
\end{document}
答案1
\kern
是一个等待维度表达式的 TeX 基元,而是\widthof
一个仅在和朋友calc
中起作用的包函数。它需要内部框分配,而这在普通维度表达式中是不允许的。因此,您不能在等待 TeX 维度表达式的位置使用和其他类似的东西。您需要先使用将值分配给长度寄存器,然后像您所做的那样使用此寄存器。\setlength
\widthof
\setlength
答案2
这里的问题是,它\widthof
实际上只是一个在其中一个内部起作用的“宏”。calc
重新定义的长度宏。使用时\show\widthof
您会注意到它实际上被定义为\ignorespaces
...占位符和用于删除参数中任何前面空格的操作。因此,您需要执行两步程序(使用临时长度)才能获得所需的结果。
替代\settowidth
宏使用(来自latex.ltx
):
\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}