此代码:
\documentclass{scrartcl}
\providecommand{\c}{\mathrm{c}}
\begin{document}
Complement of $A$: $A^\c$.
\end{document}
产生以下错误:
! Missing { inserted.
<to be read again>
\begingroup
l.6 Complement of $A$: $A^\c
$.
! ==> Fatal error occurred, no output PDF file produced!
问题是该命令\c
已经存在(表示“c-cedilla”)。但是,我更愿意\c
在数学模式下使用它来表示集合补集。
似乎出于某种原因,LaTeX 无法从文本模式切换到数学模式。我怎样才能去掉“c-cedilla”并在数学模式下获得正常的“c”?
答案1
这仅为数学模式重新定义了它,保留了它在文本模式下的原始用途。根据 egreg 的建议,已编辑 ,\DeclareRobustCommand
以代替\def
。\expandafter
定义中的 允许\fi
吸收以下内容,以便 的文本版本\c
可以对后面的实际参数进行操作。
\documentclass{book}
\let\svc\c
\DeclareRobustCommand\c{\ifmmode\mathrm{c}\else\expandafter\svc\fi}
\begin{document}
This is a \c complicated test.
Complement of $A$: $A^\c$.
\end{document}
答案2
正如您所正确观察到的,您遇到问题是因为\c
已经提供了。其目的是提供变音符号,实际上可以将其添加到多个字母中。要添加的字母应作为的参数出现\c
,例如\c{c}
产生ç。
因此,如果您想定义一个替代\c
宏,您必须发出\renewcommand
如下指令:
\renewcommand{\c}{\mathrm{c}}
您的代码现在可以工作了。
然而,这不一定是个好主意。如果你需要写关于 limaçons 的文章,你可能会后悔这样做。Steven B. Segletes 对这种情况提供了一个极好的折衷方案。尽管如此,传统观点认为,重新定义基本的 LaTeX 命令时要非常小心,除非你确信你知道用它们做什么。否则,你可能会把事情搞砸。我遇到过的最奇怪的错误是,我以为自己很聪明,编写了一个名为 的小包trig
来提供像 这样的命令\arccsc
。我几乎不知道实际上已经存在一个trig
包,它用于pdflscape
包中所需的一些定义。哦,当我尝试用一个横向页面渲染文档时,我很开心。
无论如何,即使你不需要\c
,通过重新定义基本命令,你的代码也不太可能为其他人工作得很好。如果你只是在做数学作业,这没问题,但\c
如果你随后与其他人合作,请注意不要太习惯你的定义。你还可能会发现,一些编辑器的语法突出显示会因某些重新定义而出错。
一个更好的选择是简单地使用尚未定义的类似定义。
我推荐
\newcommand{\myc}{\mathrm{c}}
这不会给你带来这样的问题,但如果这不符合你的口味也没关系。任何你喜欢的东西都可以。但如果你小心覆盖 LaTeX 的定义,你遇到的问题就会少一些。
但这是你的代码,也许只需添加一条注释来提醒自己你是否重新定义了\c
?
另一种可能对其他人有帮助的方法是考虑找一个具有良好自动完成功能的编辑器,或者如果你觉得长命令太麻烦的话,可以输入长命令。看看此列表看看什么对你有用。我现在知道你自己并不那么关心输入但其他人可能认为这是一个更好的选择。