physics.sty
在 CTAN 上可以作为阅读physics
包找到
\DeclareDocumentCommand\quantity{}{{\ifnum\z@=`}\fi\@quantity}
我不明白。我很清楚\quantity
被定义为对 的调用\@quantity
。但是构造
{\ifnum\z@=`}\fi
做?
答案1
只需按照扩展操作即可。如果 TeX 发现调用
\quantity\big(x)
它会
{\ifnum\z@=`}\fi\@quantity\big(x)
现在 TeX 会扩展标记或将它们推入喉道。在这种情况下,{
会向下推(并打开一个简单的组)并\ifnum
扩展。由于测试为假,因此只剩\fi
下(实际上测试为假无关紧要)。的扩展\fi
为空,TeX 继续扩展\@quantity
。
这比较复杂,后续处理涉及一些\let
,这就是将所有事情分组进行的原因。最终结果是
\bigl(x\bigr)\ifnum\z@=`{\fi}
\bigl(x\bigr)
经过扩展和执行后,将构建对应的数学列表,并最终\ifnum
进行扩展,其后再次不留下任何内容;尾随部分}
关闭了从头开始的组。
如果我们看看我们得到的结果,这个宏调用本质上与执行
{\bigl(x\bigr)}
即错误的。 例如,
\log\quantity\big(x)
会导致运算符和括号之间出现一个很细的空格,因为
\log{\bigl(x)\bigr)}
将括号内的子公式视为唯一普通的符号。以下是视觉证据:
\documentclass{article}
\usepackage{physics}
\begin{document}
$\log\quantity\big(x)$
$\log\bigl(x\bigr)$
\end{document}
如果定义是
\DeclareDocumentCommand\quantity{ t\big t\Big t\bigg t\Bigg g o d() d|| }
{\begingroup
% Flexible automatic bracketing of an expression in () or [] or {} or ||
% Handles manual override of sizing
[...many lines of code...]
{\ltag\lbrace#5\rtag\rbrace \IfNoValueTF{#6}{}{[#6]} \IfNoValueTF{#7}{}{(#7)} \IfNoValueTF{#8}{}{|#8|}}
\endgroup
}
我认为没有必要使用单独的宏\@quantity
。使用半单group 避免了使用子公式的问题:
\log\begingroup\bigl(x\bigr)\endgroup
不考虑组中的标记来构成子公式,并且 Op 原子\log
和 Open 原子之间的间距\bigl(
是正确的。
答案2
程序员希望\quantity
将宏扩展为{\fi\@quantity
。但是,这在宏定义中不起作用,因为{
未关闭,而 TeX 编译器会}
进一步寻找关闭。为了完成此操作,我们使用了一个技巧来添加 ,}
它在宏定义期间被视为关闭组,但在宏执行期间被忽略(即删除)。
这是通过添加\ifnum\z@=`}\fi
宏来实现的定义现在括号已经匹配,所以编译器很满意。然后在宏执行实际上`
将变成了一个数字(据我所知是 ASCII 数字)。使用这个数字与 (=0)}
进行比较,只是为了再次将其删除而不产生任何输出。由于紧随其后的是闭包,因此整个事情扩展为零,与实际数字值无关。\z@
\ifnum\z@=
\fi
\ifnum\z@=`}\fi
\ifnum 0=`{\fi}
为了使其工作,在稍后的流程中调用的宏中应该有一个匹配的后续内容。
另一个使用它的地方是\hline
。请参阅那里的解释。