{\ifnum\z@=`}\fi 是什么意思?

{\ifnum\z@=`}\fi 是什么意思?

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。请参阅那里的解释

相关内容