不完整的 \ifx:如何在分割环境中使用 Ensuremath?

不完整的 \ifx:如何在分割环境中使用 Ensuremath?

我已经定义了这个命令

\newcommand{\edge}[1]{\ifx&#1&\ensuremath{e}\else\ensuremath{e_{#1}}\fi}

我现在想在公式中使用它:

\begin{equation}
\begin{split}
\edge{1}
\end{split}
\end{equation}

这有效。但是,一旦我在 之前放置另一个 Latex 表达式\edge{1},就会出现“不完整的 \ifx;所有文本都被忽略”错误。我不太确定,但我怀疑ensuremath和的组合split是罪魁祸首。

\begin{equation}
\begin{split}
\exists\edge{s} % Error: Incomplete \ifx; all text was ignored after line...
\end{split}
\end{equation}

你能向我解释一下这种行为并提出解决方案吗?

答案1

让我们看看会发生什么。当split开始时,TeX 必须处理基于 的材料\halign,其中&具有非常特殊的作用。

在第一种情况下,TeX 位于单元格的开头,此时它进入“查找\omit或”\span阶段。\ifx&1&...测试返回 false,并且跳过真实文本,因此&实际上看不到任何内容。

在第二种情况下,上述阶段已经结束,当\edge扩展&token时看到并且第一个结束了单元格,但条件尚未完成。

用更安全的测试代替空虚测试。

\newcommand{\edge}[1]{%
  \if\relax\detokenize{#1}\relax
    \ensuremath{e}%
  \else
    \ensuremath{e_{#1}}%
  \fi
}

\ensuremath(当然,假设你真的想要)。

实际上,这个参数似乎是可选的,所以我建议使用类似

\NewDocumentCommand{\edge}{o}{%
  \ensuremath{e\IfValueT{#1}{_{#1}}}%
}

并调用\edge或。如果您运行的是 2020-10-01 之前发布的 LaTeX,\edge[1]则需要这样做。\usepackage{xparse}

相关内容