命令已定义,但无法识别

命令已定义,但无法识别

在一个涉及大量尖括号的项目中,我尝试将其重新定义\rangle\>使用\newcommand,以使事情变得更容易一些。

但是,这显示错误“命令\>已定义”。删除定义后,它确实运行,尽管符号\>显示为粉红色并被列为无法识别的符号。

我关闭了所有软件包,但似乎没有与发生任何冲突\>。我还以完全相同的方式定义了\<\langle没有发生这样的问题。

我不确定这是不是个错误,或者我是否遗漏了一些微妙的东西。使用 TexStudio。

答案1

TeXStudio 只是一个编辑器;它没有突出显示宏并不一定意味着它没有定义,特别是如果它是一个内部宏(即不打算在文档中直接使用)。

现在\<未定义为标准,但\>定义为\mskip \medmuskip。很难知道内核或包可能在哪里使用它,因此更改它是非常不明智的。最好定义一个命令,例如

\newcommand\ang[1]{\langle #1 \rangle}

然后,您可以使用 将对象放在尖括号中\ang{whatever}。根据您的使用情况,您可能需要使用更多参数,例如,内积可能定义为

\newcommand\ip[2]{\langle #1 , #2 \rangle}

最后,您可能希望在定义中使用\left和,以允许括号大小改变。\right

答案2

编辑器不可能跟踪包可能定义的每个命令(有数千个)。

实际上,它被忽略有点令人惊讶\>,因为它是 LaTeX 内核中定义的一个具有双重功能的命令:

  1. \:为了与普通的 TeX(以及非常古老的 LaTeX)文档保持兼容而创建的别名;

  2. 环境内部的主要命令tabbing,它也(重新)定义了\<

如果您不打算使用tabbing,那么重新定义\>可能是安全的。但是,它会在某些软件包中弹出:

skak xskak blog qsymbols ednotes clrscode3e clrscode zxjatype knitting pax
qqru-shipunov gn-logic14 polytable catoptions bxcjkjatype AlProTex program
sgamevar alphabeta textalpha 

在哪里重新定义。我猜你不太可能使用其中的大部分,但最后两个可能会让你感到困惑。

你可以做不同的事情:

\usepackage{mathtools}

\DeclarePairedDelimiter{\foo}{\langle}{\rangle}

然后使用

\foo{x} \foo[\big]{x} ... \foo[\Bigg]{x}

可选参数设置大小,或\foo*{x}用于\left自动\right调整大小(谨慎使用)。

\foo当然,找到一个比 更好的名字。

答案3

对于内积,您可以加载mathtoolsxparse定义\innerp{a,b}命令如下:

\DeclarePairedDelimiterX{\innerp}[1]{\langle}{\rangle}{\innpargs{#1}}
\NewDocumentCommand{\innpargs}{ >{\SplitArgument{1}{,}}m }
 {\innpargsaux#1}
\NewDocumentCommand{\innpargsaux}{ m m }
 {#1\,,#2}%

使用 的\innerp*{a,b}行为就像有一对 一样\left\langle \right\rangle。要微调分隔符的大小,可以使用可选参数:\innerp[\big]{a,b}\innerp[\Big]{a,b}、 &c.,其行为就像有一对\bigl\langle \bigr\rangle\Bigl\langle Bigr\rangle一样,依此类推。

相关内容