我知道有一个braket
包可能会为我完成所有这些工作,但是我已经用狄拉克符号为矩阵元素定义了自己的宏:
\makeatletter
\def\me{\@ifstar\@me\@@me}
\def\@me#1#2#3{\ensuremath{\left\langle#1\middle|#2\middle|#3\right\rangle}}
\def\@@me#1#2#3{\ensuremath{\langle#1|#2|#3\rangle}}
\makeatother
我同意,这个名字可以更好。无论如何,当我使用星号版本和匕首运算符时,我得到了可怕的输出:
现在我想知道是否有办法\big
在这样的命令上引入 等效果,这样我就可以在必要时手动调整符号。我正在考虑引入一个可选参数来控制大小,而我目前的解决方案
\makeatletter
\def\me{\@ifstar\@me{\@ifnextchar\bgroup{\@@@me}{\@@me}}}
\def\@me#1#2#3{\ensuremath{\left\langle#1\middle|#2\middle|#3\right\rangle}}
\def\@@me#1#2#3{\ensuremath{\langle#1|#2|#3\rangle}}
\def\@@@me#1#2#3[#4]{\ensuremath{#4\langle#1#4|#2#4|#3#4\rangle}}
\makeatother
有效,但我想知道是否存在更优雅的方法(我所做的感觉有点像用塑料袋里的冰水来冷却你的笔记本电脑 - 它有效,但它看起来有点荒谬,你不禁认为这可能是一个坏主意)。
编辑:好吧,它实际上不起作用。带有可选参数的无星号版本可以工作,带星号的版本也仍然有效,但无星号版本没有可选参数给出错误。
答案1
请始终发布测试文档而不是片段。
我认为您几乎使用了下面的第一种形式,但可能我会使用第二种形式,它不使用\ensuremath
并且会注意使用开放和关闭形式,而不仅仅是\big\langle
不会获得相同的间距。
\documentclass{article}
\makeatletter
\def\me{\@ifstar\@me{\@ifnextchar[{\@@@me}{\@@me}}}
\def\@me#1#2#3{\ensuremath{\left\langle#1\middle|#2\middle|#3\right\rangle}}
\def\@@me#1#2#3{\ensuremath{\langle#1|#2|#3\rangle}}
\def\@@@me[#1]#2#3#4{\ensuremath{#1\langle#2#1|#3#1|#4#1\rangle}}
\newcommand\xme[4][\relax]{%
\ifx#1\relax\langle\else
\ifx*#1\left\langle
\else\mathopen{#1\langle}%
\fi\fi
#2%
\ifx#1\relax\mathrel{|}\else
\ifx*#1\middle|%
\else\mathrel{#1|}%
\fi\fi
#3%
\ifx#1\relax\mathrel{|}\else
\ifx*#1\middle|%
\else\mathrel{#1|}%
\fi\fi
#4%
\ifx#1\relax\rangle\else
\ifx*#1\right\rangle
\else\mathclose{#1\rangle}%
\fi\fi
}
\makeatother
\begin{document}
$\me{a}{B^B}{c}$
$\me*{a}{B^B}{c}$
$\me[\Bigg]{a}{B^B}{c}$
$\xme{a}{B^B}{c}$
$\xme[*]{a}{B^B}{c}$
$\xme[\Bigg]{a}{B^B}{c}$
\end{document}