% braket.sty Macros for Dirac bra-ket <|> notation and sets {|} % Donald Arseneau asnd@triumf.ca Last modified 12-Sept-2006. % This is free, unencumbered, unsupported software. % % Commands defined are: % \bra{ } \ket{ } \braket{ } \set{ } (small versions) % \Bra{ } \Ket{ } \Braket{ } \Set{ } (expanding versions) % % The "small versions" use fixed-size brackets independent of their % contents, whereas the "expanding versions" make the brackets and % vertical lines expand to envelop their contents (internally using % the \left and \right commands). You should use the vertical bar % character "|" to input any extra vertical lines. In \Braket these % vertical lines will expand to match the arguments, and in \Set the % first vertical will expand. E.g., % % \Braket{ \phi | \frac{\partial^2}{\partial t^2} | \psi } % \Set{ x\in\mathbf{R}^2 | 0<{|x|}<5 } % % Likewise, you may make an expandable double-bar using either % the "\|" command or its local alias "||". % % NOT defined is "\ketbra" (for projection operators) because I prefer % \ket{ } \bra{ }. % % Because each definition is so small, it makes no sense to have a % complicated generic version for many bracket styles. Instead, % you can just copy the definitions and change \langle or \rangle, % to what you like. % \def\bra#1{\mathinner{\langle{#1}|}} \def\ket#1{\mathinner{|{#1}\rangle}} \def\braket#1{\mathinner{\langle{#1}\rangle}} \def\Bra#1{\left\langle#1\right|} \def\Ket#1{\left|#1\right\rangle} % \let\protect\relax % {\catcode`\|=\active \xdef\Braket{\protect\expandafter\noexpand\csname Braket \endcsname} \expandafter\gdef\csname Braket \endcsname#1{\begingroup \ifx\SavedDoubleVert\relax \let\SavedDoubleVert\|\let\|\BraDoubleVert \fi \mathcode`\|32768\let|\BraVert \left\langle{#1}\right\rangle\endgroup} } \def\BraVert{\@ifnextchar|{\|\@gobble}% turn || into \| {\egroup\,\mid@vertical\,\bgroup}} \def\BraDoubleVert{\egroup\,\mid@dblvertical\,\bgroup} \let\SavedDoubleVert\relax % The \mid@vertical is \vrule with ordinary TeX but \middle| in eTeX. % We always avoid a \mathchoice in making the inner vertical lines. % Note that \right\rangle is used now due to a failing in fourier.sty. % % \def\ketbra#1#2{\ket{#1}\bra{#2}} % \def\Ketbra#1#2{\left|{#1}\vphantom{#2}\right\rangle\left\langle{#2}\vphantom{#1}\right|} % \Set{...|...} Only the first | is treated specially. {\catcode`\|=\active \xdef\set{\protect\expandafter\noexpand\csname set \endcsname} \expandafter\gdef\csname set \endcsname#1{\mathinner {\lbrace\,{\mathcode`\|32768\let|\midvert #1}\,\rbrace}} \xdef\Set{\protect\expandafter\noexpand\csname Set \endcsname} \expandafter\gdef\csname Set \endcsname#1{\left\{% \ifx\SavedDoubleVert\relax \let\SavedDoubleVert\|\fi \:{\let\|\SetDoubleVert \mathcode`\|32768\let|\SetVert #1}\:\right\}} } \def\midvert{\egroup\mid\bgroup} \def\SetVert{\@ifnextchar|{\|\@gobble}% turn || into \| {\egroup\;\mid@vertical\;\bgroup}} \def\SetDoubleVert{\egroup\;\mid@dblvertical\;\bgroup} % If the user is using e-TeX with its \middle primitive, use that for % verticals instead of \vrule. % \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 % May 2005: Double verticals; tweak spacing. % June 2005: Make robust % Sept 2006: fourier