![physics 和 brackett 包使用不同的 \braket 命令](https://linux22.com/image/368313/physics%20%E5%92%8C%20brackett%20%E5%8C%85%E4%BD%BF%E7%94%A8%E4%B8%8D%E5%90%8C%E7%9A%84%20%5Cbraket%20%E5%91%BD%E4%BB%A4.png)
我正在使用该\usepackage{physics}
包,并想使用 bra-ket 符号写一些内容,但中间有一个双杠(量子化学中的物理学家符号)。可以\braket{0||0}
使用 \usepackage{braket} 包来写,但对于我的大部分工作来说,使用 {physics} 包更有用。我无法使用 {braket} 包,因为命令 \braket 已经是 {physics} 包中的命令,而且我不想篡改我使用该physics
包编写的先前页面。所以我想我有两个问题。
2) 是否可以同时导入两个包,但\braket
在选择时调用不同包中的命令?例如,physics
对于第一个方程,我可能想使用包中的命令,而braket
对于第二个方程,我则使用包中的命令。
答案1
该physics
包可以使用matrix element
命令\matrixel
(\mel
简称)来执行此操作。代码
\documentclass{article}
\usepackage{physics}
\begin{document}
$\mel{ij}{}{kl}$
\end{document}
将产生所需的输出。如果需要,可以插入额外的第二个参数。(示例中为空。)
该命令还有另外两种形式\mel
:\mel*
和mel**
。无星号版本根据第一个和第三个参数调整分隔符高度,但不调整第二个参数。一星号版本根本不调整大小。两星号版本根据所有三个参数调整分隔符大小。例如,代码
$\mel{\rule{2pt}{2ex}}{\rule{2pt}{3ex}}{kl}\quad%
\mel*{\rule{2pt}{2ex}}{\rule{2pt}{3ex}}{kl}\quad%
\mel**{\rule{2pt}{2ex}}{\rule{2pt}{3ex}}{kl}$
产生输出:
请注意,与两星版本相比,无星版本和一星版本之间似乎存在间距不一致。差异似乎正好是thinspace
。请考虑以下代码及其输出:
H$\mel{ij}{}{kl}$H
H$\mel*{ij}{}{kl}$H
H$\mel**{ij}{}{kl}$H
通过在或\!
之前插入负型细空格 ( )来均衡左右两侧的间距。\mel
\mel*
答案2
我提出一个基于mathtools
,xparse
和 的解决方案etoolbox
。语法是\mybraket{1st argt | 2nd argt |3rd arrgt}
。参数分隔符是|
,但可以更改为逗号或分号。
此命令可以采用可选的大小参数(\big, \Big
,&c.)。或者,带星号的版本在分隔符前\mybracket*
添加一个隐式对。\left \right
\documentclass{article}
\usepackage{mathtools}
\usepackage{physics}
\usepackage{xparse, etoolbox}
\DeclarePairedDelimiterX\mybraket[1]{\langle}{\rangle}{\braketargs{#1}}%
\NewDocumentCommand{\braketargs}{ >{\SplitArgument{2}{|}}m }
{\braketargsaux#1}
\NewDocumentCommand{\braketargsaux}{ m m m}%
{\IfNoValueTF{#3}{\IfNoValueTF{#2}{#1}{#1\,\delimsize\vert\,\mathopen{}#2}}%
{\ifblank{#2}{#1\,\delimsize\vert\mkern-1mu\delimsize\vert\,\mathopen{}#3}%
{#1\,\delimsize\vert\,\mathopen{}#2\,\delimsize\vert\,\mathopen{}#3}}}%
\begin{document}
\[ \mybraket*{ij}\quad\mybraket[\big]{ij||jk} \quad\mybraket[\big]{ij|\ell|jk}\]%
\end{document}