I wrote a small package, braketx
, for generalized bra-ket notation in LaTeX (or TeX). It is based on Donald Arseneau’s braket
package. The braket
package provides a few macros, mostly one-liners, for the usual bra-ket and set notations. Donald suggests to copy his macros and replace \(\langle\) and \(\rangle\) with the required delimiters for other bra-ket notations. I did that, but then generalized the definitions and made them into a “package” so that I don’t have to copy the definitions every time I write a new document.
braketx
provides 6 macros:
\xbra
This is a generalized bra. The delimiter is the first argument.
\def\xbra#1#2{\mathinner{#1{#2}|}}
\xket
This is a generalized ket. The delimiter is the last argument.
\def\xket#1#2{\mathinner{|{#1}#2}}
\xbraket
This is a generalized bra-ket inner product. The left delimiter is the first argument, and the right delimiter the second argument.
\def\xket#1#2{\mathinner{|{#1}#2}}
\xBra
Same as
\xbra
, but delimiter adjusts to the size of the label.\def\xBra#1#2{\left#1{#2}\right|}
\xKet
Same as
\xket
, but delimiter adjusts to the size of the label.\def\xKet#1#2{\left|{#1}\right#2}
\xBraket
Same as
\xbraket
, but delimiters and any vertical or double vertical lines within adjust to size of the labels. This is not an one-liner. I couldn’t have figured out the logic to adjust the size of any vertical lines between the delimiters. TeX is complex.\let\protect\relax % {\catcode`\|=\active \xdef\xBraket{\protect\expandafter\noexpand\csname xBraket \endcsname} \expandafter\gdef\csname xBraket \endcsname#1#2#3{\begingroup \ifx\SavedDoubleVert\relax \let\SavedDoubleVert\|\let\|\BraDoubleVert \fi \mathcode`\|32768\let|\BraVert \left#1{#2}\right#3\endgroup} } \def\BraVert{\@ifnextchar|{\|\@gobble}% turn || into \| {\egroup\,\mid@vertical\,\bgroup}} \def\BraDoubleVert{\egroup\,\mid@dblvertical\,\bgroup} \let\SavedDoubleVert\relax \begingroup \edef\@tempa{\meaning\middle} \edef\@tempb{\string\middle} \expandafter \endgroup \ifx\@tempa\@tempb \def\mid@vertical{\middle|} \def\mid@dblvertical{\middle\SavedDoubleVert} \else \def\mid@vertical{\mskip1mu\vrule\mskip1mu} \def\mid@dblvertical{\mskip1mu\vrule\mskip2.5mu\vrule\mskip1mu} \fi
With this you can easily create bra-ket notation like \((a|b\rangle\), \(\{\sigma|\), or even, \[\left\{\frac{1}{2}\frac{1}{2}\middle|O\middle|\alpha\beta\right).\] One caveat of the fixed-size delimiter macros is that they do not check if the arguments that are supposed to be delimiters are actually delimiters. \xket{a}{b}
is as valid as \xket{a}{\rangle}
. But then I don’t expect anyone to actually use \xket{a}{b}
.
Admittedly this is a very niche package. But comes in quite handy when you are writing documents where you need generalized bra-ket notations to distinguish different types of quantum states. For example, distinguishing Slater determinants from product states.
To use it, you can just copy the definitions to a file braketx
which you can then call with \usepackage{braketx}
. Or clone the git repository and put it in your TeX path. On Linux machines I put custom packages under ~/.local/tex/latex/
, and run sudo tlmgr conf auxtrees add ~/.local/texmf/
. You may or may not have to use sudo
. You can use this alongside the braket
package. Or you can redefine the braket
in terms of the braketx
macros. For example, you can define \bra
as:
\def\bra#1{\xbra{\langle}{#1}}