diff --git a/docs/support_table.md b/docs/support_table.md
index fabe3835..e03f5e23 100644
--- a/docs/support_table.md
+++ b/docs/support_table.md
@@ -183,6 +183,9 @@ table td {
|\boxminus|$\boxminus$||
|\boxplus|$\boxplus$||
|\boxtimes|$\boxtimes$||
+|\Bra|$\left\langle\psi\right\|$|`\Bra{\psi}`|
+|\bra|$\mathinner{\langle{\psi}\|}$|`\bra{\psi}`|
+|\braket|$\mathinner{\langle{\phi\|\psi}\rangle}$|`\braket{\phi|\psi}`|
|\brace|${n\brace k}$|`{n\brace k}`|
|\bracevert|Not supported||
|\brack|${n\brack k}$|`{n\brack k}`|
@@ -511,6 +514,8 @@ use `\ce` instead|
|\KaTeX|$\KaTeX$||
|\ker|$\ker$||
|\kern|$I\kern-2.5pt R$|`I\kern-2.5pt R`|
+|\Ket|$\left\|\psi\right\rangle$|`\Ket{\psi}`|
+|\ket|$\mathinner{\|{\psi}\rangle}$|`\ket{\psi}`|
|\Koppa|Not supported||
|\koppa|Not supported||
diff --git a/docs/supported.md b/docs/supported.md
index b18686f7..9c8f1395 100644
--- a/docs/supported.md
+++ b/docs/supported.md
@@ -510,6 +510,15 @@ Direct Input: $← ↑ → ↓ ↔ ↕ ↖ ↗ ↘ ↙ ↚ ↛ ↞ ↠ ↢ ↣
Extensible arrows all can take an optional argument in the same manner
as `\xrightarrow[under]{over}`.
+## Special Notation
+
+**Bra-ket Notation**
+
+||||
+|:----------|:----------|:----------|
+|$\bra{\phi}$ `\bra{\phi}` |$\ket{\psi}$ `\ket{\psi}` |$\braket{\phi\vert\psi}$ `\braket{\phi\vert\psi}` |
+|$\Bra{\phi}$ `\Bra{\phi}` |$\Ket{\psi}$ `\Ket{\psi}` ||
+
## Style, Color, Size, and Font
**Class Assignment**
diff --git a/src/macros.js b/src/macros.js
index 7ad27a08..a59b8033 100644
--- a/src/macros.js
+++ b/src/macros.js
@@ -930,6 +930,16 @@ defineMacro("\\argmin", "\\DOTSB\\operatorname*{arg\\,min}");
defineMacro("\\argmax", "\\DOTSB\\operatorname*{arg\\,max}");
defineMacro("\\plim", "\\DOTSB\\mathop{\\operatorname{plim}}\\limits");
+//////////////////////////////////////////////////////////////////////
+// braket.sty
+// http://ctan.math.washington.edu/tex-archive/macros/latex/contrib/braket/braket.pdf
+
+defineMacro("\\bra", "\\mathinner{\\langle{#1}|}");
+defineMacro("\\ket", "\\mathinner{|{#1}\\rangle}");
+defineMacro("\\braket", "\\mathinner{\\langle{#1}\\rangle}");
+defineMacro("\\Bra", "\\left\\langle#1\\right|");
+defineMacro("\\Ket", "\\left|#1\\right\\rangle");
+
// Custom Khan Academy colors, should be moved to an optional package
defineMacro("\\blue", "\\textcolor{##6495ed}{#1}");
defineMacro("\\orange", "\\textcolor{##ffa500}{#1}");
diff --git a/test/katex-spec.js b/test/katex-spec.js
index 8c89bab3..3db574f0 100644
--- a/test/katex-spec.js
+++ b/test/katex-spec.js
@@ -3312,6 +3312,26 @@ describe("A macro expander", function() {
it("should expand \\argmax as expected", () => {
expect`\argmax`.toParseLike`\operatorname*{arg\,max}`;
});
+
+ it("should expand \\bra as expected", () => {
+ expect`\bra{\phi}`.toParseLike`\mathinner{\langle{\phi}|}`;
+ });
+
+ it("should expand \\ket as expected", () => {
+ expect`\ket{\psi}`.toParseLike`\mathinner{|{\psi}\rangle}`;
+ });
+
+ it("should expand \\braket as expected", () => {
+ expect`\braket{\phi|\psi}`.toParseLike`\mathinner{\langle{\phi|\psi}\rangle}`;
+ });
+
+ it("should expand \\Bra as expected", () => {
+ expect`\Bra{\phi}`.toParseLike`\left\langle\phi\right|`;
+ });
+
+ it("should expand \\Ket as expected", () => {
+ expect`\Ket{\psi}`.toParseLike`\left|\psi\right\rangle`;
+ });
});
describe("\\tag support", function() {