我已经定义了这个命令
\newcommand{\edge}[1]{\ifx&\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}