我试图将此命令放入我的 LaTeX 文档中,但它导致编译器失败,并显示"Missing \begin{document}"
:
\newcommand{\C*}{\mathbb{C} \setminus \lbrace 0 \rbrace}
我也尝试过使用,\C0
而不是\C*
认为星号可能会导致问题,但错误消息没有任何变化。错误消息还说我无法使用\mathbb{.}
数学模式之外的模式,而我并没有尝试这样做。\newcommand{\CC}{\mathbb{C}}
在我的文档中使用效果很好,老实说,我不明白其中的区别,因此我不知道如何解决这个问题。
答案1
命令名称必须是字母或单个非字母,不能有命令\C*
或\C0
在前几次扩展之后,您的输入或多或少与此相同,从而产生相同的错误。
\documentclass{article}
\newcommand{\C}{}{*}{\mathbb{C} \setminus \lbrace 0 \rbrace}
\begin{document}
\end{document}
因此\C
得到定义
\newcommand{\C}{}
然后它开始一段带有符号的文本*
,这会给出缺少文档的错误,因为您之前无法排版文本\begin{document}
{*}
然后如果你滚动过去,它会尝试排版
{\mathbb{C} \setminus \lbrace 0 \rbrace}
由于它不在数学模式,因此会出现错误。
答案2
您已经知道为什么它不起作用。如果您确实想要\C
执行\mathbb{C}
并\C*
执行\mathbb{C}\setminus\{0\}
,您可以轻松做到:
\usepackage{xparse}
\NewDocumentCommand{\C}{s}{%
\mathbb{C}\IfBooleanT{#1}{\setminus\{0\}}%
}
我们\IfBooleanT{#1}
检查是否存在*
。
完整示例
\documentclass{article}
\usepackage{amsmath,amssymb}
\usepackage{xparse}
\NewDocumentCommand{\C}{s}{%
\mathbb{C}\IfBooleanT{#1}{\setminus\{0\}}%
}
\begin{document}
The set of complex numbers is $\C$. If we remove~$0$
we get $\C*$.
\end{document}
如果你愿意的话\C0
,这里是:
\documentclass{article}
\usepackage{amsmath,amssymb}
\usepackage{xparse}
\NewDocumentCommand{\C}{t{0}}{%
\mathbb{C}\IfBooleanT{#1}{\setminus\{0\}}%
}
\begin{document}
The set of complex numbers is $\C$. If we remove~$0$
we get $\C0$.
\end{document}
输出是一样的。
答案3
不知道如何解决这个问题
如果“修复”是指使用一个“其他”字符(例如 * 或 0)定义命令,则可以使用\@ifnextchar
\documentclass[a4paper, twocolumn]{article}
\begin{document}
\makeatletter
% What to do if there is a *
% Need an argument to "eat" the *.
% (so in the below, the argument #1
% is the asterisk)
\newcommand\CStar[2]{GotAStar and #2}
% What to do otherwise
\def\CNoStar{\relax}
% Define \C and delegat what should happen
% if it's followed by a *
\def\C{\@ifnextchar*\CStar\CNoStar}
\makeatother
\C*{ARG}
\end{document}
以下问题的答案很好地解释了这里发生的事情:理解 \@ifnextchar