编辑

编辑

我在序言中写了以下命令

\renewcommand{\d}{\;\ensuremath\mathrm{d}}

但出现错误

LaTeX Warning: Command \d invalid in math mode on input line 11.

这种情况只发生在我的几个文档中,我不知道为什么。当我将\a\b、重新定义\c为其他内容(例如向量)时也会发生这种情况。

答案1

其实有两个问题。首先,除非你完全清楚自己在做什么,否则重新定义基本的 TeX 和 LaTeX 宏是一个极其糟糕的主意。

第二个是\;在数学模式之外无效。

也许你想要类似

\documentclass{article}
\begin{document}
\newcommand{\drm}{\ensuremath{\;\mathrm{d}}}
\drm
\end{document}

编辑

这是对OP 的评论

@YanZhou 啊哈!这是另一个包。原来 hyperref 重新定义了它们。

不!不是。hyperref根本没有这样做。这样描述是错误的。我再怎么强调也不为过:hyperref没有重新定义这些宏。

重新定义\d\mathrm{d}或者制作\a为向量的宏与诸如此类的包所做的\c完全不同。hyperref

例如,我们在 中看到的是hyperref这样的puenc.def

\DeclareTextCommand{\d}{PU}[1]{#1\83\043}% U+0323

\DeclareTextCompositeCommand{\d}{PU}{\@empty}{\textdotbelow}%

这些是告诉 TeX在使用编码\d时该做什么。这很好,因为这个宏是PU设计\d依赖于编码。如果您要编写一个应支持的新编码,那么这就是您要做的事情。

hyperref不是重新定义\d。这是(或应该是!)一个新的定义,因为编码在设置PU之前甚至不存在。hyperref

相反,现在hyperref要做的是定义一个新的输出编码。输出编码必须定义某些东西,也可能定义更多。hyperref不是覆盖现有定义,因为它给出的定义是新编码定义的一部分,\c并且\d编码定义与其他编码的相同宏的定义是分开的。

也就是说,hyperref你正在做的事情没有问题。你正在尝试做的事情是一个非常糟糕的想法。这是一个非常糟糕的想法,正是因为这些类型的宏在排版过程中起着根本性的作用,而重新定义它们迟早会给你带来麻烦。

相关内容