在多个宏中发现 \@gobble 和 \@firstofone 的多种用法

在多个宏中发现 \@gobble 和 \@firstofone 的多种用法

我正在搜索我的问题(参见这里了解更多详情)并找到了一个主题commath 和 \ifinner。在线程中,有一个名为的宏\spx,其定义和用法摘录如下。从{^{#1}}定义中可以看出,它似乎是一个改进的^。我理解\if\relax\detokenize{#1}确定是否#1为空,但我不明白这个 -clause 的其余部分如何\if运作。此外,在一些线程中\if可以找到类似的 -clause(例如撰写音乐音调不计“&”符号的表格等等)。

这类 -clause 起什么作用并且和普通 -clause\if有什么区别?\spx^

% ----- definition of \spx and its usage -----
\newcommand{\spx}[1]{%
    \if\relax\detokenize{#1}\relax
        \expandafter\@gobble
    \else
        \expandafter\@firstofone
    \fi
    {^{#1}}%
}
\newcommand\pd[3][]{\frac{\partial\spx{#1}#2}{\partial#3\spx{#1}}}

答案1

反过来回答这个问题,区别在于\spx{}展开为零,而^{}产生一个空的上标原子。这样的空上标场并不等同于没有上标,并且会影响同一基数上下标的位置。

  \expandafter\@gobble
\else
    \expandafter\@firstofone
\fi
{^{#1}}%

{^{#1}在真实情况下从输入流中删除,因为\expandafter扩展了,\else删除了所有内容,\fi 所以接下来的扩展是\@gobble{^#1}其中没有任何内容。

类似地,在错误分支中,您需要\expandafter删除\fi,然后\@firstofone删除外部括号,因此扩展\@firstofone{^{#1}}^{#1}

相关内容