我想定义一组 ket,这样定义集合的括号就可以与里面的内容一起缩放。我不知道该怎么做,因为我通常使用命令\Set
,但如果集合中还有一个 ket,这会出错。以下代码说明了我的问题:
\documentclass[12pt,twoside]{article}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{amsthm}
\usepackage{amsfonts}
\usepackage{braket}
\begin{document}
\begin{equation}
% This works, but the brakets don't scale with the contents inside.
\{ \ket{x} \in \mathcal{H} | \ket{x} = \sum_i c_i \ket{e_i} \}
% The following doesn't work:
%\Set{\ket{x}}
\end{equation}
\end{document}
错误如下:! Missing } inserted.
有没有办法做到这一点?
答案1
braket.sty
我们在里面发现
\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}
并且在\Set
宏中,|
被激活。我不完全理解为什么\Set{\bra{x}}
和\Set{\ket{x}}
会产生错误,而\Set{\Bra{x}}
等不会,但解决这个问题的一个简单方法是重新定义\bra
和\ket
使用其他等效的\vert
而不是|
。
\documentclass[12pt,twoside]{article}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{amsthm}
\usepackage{braket}
\renewcommand\bra[1]{\mathinner{\langle{#1}\vert}}
\renewcommand\ket[1]{\mathinner{\vert{#1}\rangle}}
\renewcommand\Bra[1]{\left\langle#1\right\vert}
\renewcommand\Ket[1]{\left\vert#1\right\rangle}
\begin{document}
\begin{equation}
\Set{ \ket{x} \in \mathcal{H} | \ket{x} = \sum_i c_i \ket{e_i} }
\end{equation}
\end{document}
答案2
答案没有提到错误消息“missing }”在这里的具体含义。让我解释一下。
TeX 基元\middle
必须仅用于与\left
和所界定的组相同的组级别\right
。因此
$$ \left\{ xxx \middle| yyy \right\} $$
\middle
but的正确用法是
$$ \left\{ {xxx \middle| yyy} \right\} $$
不正确,\middle
命令会报告“缺失 } 插入”和“\middle 再次读取”。当然,如果我们接受此处插入,则在处理}
时会得到下一个错误“额外 },或忘记 \right” 。yyy}
扩展\Set{abc|def}
(粗略地说)为
\left\{ {abc}\middle|{def}} \right\},
因为|
被设置为数学活动字符(本地,在第一个内部组中)。它扩展为。这是: 在与外部组相同的组级别上}\middle|{
的正确用法。但定义为\middle
\ket{zzz}
\mathinner{|zzz}
并且因为\Set
设置|
为数学活动字符,所以\Set{\ker{zzz}}
扩展为
\left\{ {\mathinner{ }\middle|{zzz}} \right\}
现在,\middle
是在组级别较低时使用的。