问题:

问题:

我有时会在尝试使用\widthofcalc包时遇到问题,但不知道原因。过去,我只是通过两步流程解决了这个问题,即定义 a\newdimen{}并使用\settowidth(或\setlength\widthof) 确定值,然后再尝试使用此长度。

下面的 MWE 显示了当我尝试使用\widthof作为 a 的长度\kern(即\KernA宏)时如何失败,但两步过程工作正常:

在此处输入图片描述

问题:

  1. 为什么\KernA不工作?
  2. 什么时候可以\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}

相关内容