在一个涉及大量尖括号的项目中,我尝试将其重新定义\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 内核中定义的一个具有双重功能的命令:
\:
为了与普通的 TeX(以及非常古老的 LaTeX)文档保持兼容而创建的别名;环境内部的主要命令
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
对于内积,您可以加载mathtools
并xparse
定义\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
一样,依此类推。