我在序言中写了以下命令
\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
你正在做的事情没有问题。你正在尝试做的事情是一个非常糟糕的想法。这是一个非常糟糕的想法,正是因为这些类型的宏在排版过程中起着根本性的作用,而重新定义它们迟早会给你带来麻烦。