我已经以这种方式定义了差分命令
\let\underdot\d
\renewcommand{\d}{\ifmmode\mathop{}\!\mathrm{d}\else\expandafter\underdot\fi}
这样我就不会丢失文本重音(我不知道它是如何expandafter
工作的,我只是在反复试验后才把它放在那里)。但我有一个问题,如果我\d
在子堆栈中使用它作为第一个命令,它会给我文本 \d
.以下是示例代码:
\documentclass{scrartcl}
\usepackage{mathtools}
\let\underdot\d
\renewcommand{\d}{\ifmmode\mathop{}\!\mathrm{d}\else\expandafter\underdot\fi}
\begin{document}
\[
\substack{\d x = \sigma \d y}
\]
\end{document}
\substack
我不知道为什么会发生这种情况,可能是我的命令定义错误,也可能是( )中存在错误subarray
。我可以用 解决它{}\!\d x = …
,但我想全局修复它。
\d
我该如何解决这个问题? 解决这个问题的最佳方法是什么(可能是以另一种方式重新定义命令)?
答案1
您需要在定义的开头使用\DeclareRobustCommand
或放置,否则在任何对齐单元格开头的测试都将为假,因为它会展开\relax
\ifmmode
前单元格启动(并进入数学模式),而 TeX 正在寻找\omit
(\multicolumn
)