定界符 (括号)

LaTeX 里没有「括号」这个概念,只有一张 定界符(delimiter)表。只有当字体为某个字符准备了纵向拉伸用的部件,它才会出现在那张表上;把表外的字符放在 \left 后面,TeX 会立刻回答 ! Missing delimiter (. inserted). 换句话说,能用哪些括号不取决于喜好,而取决于字体。本页用来查这张表上都有什么——圆括号、方括号、花括号、尖括号 \langle,绝对值的 |\lvert,向下取整与向上取整的 \lfloor\lceil,直到那些「怎么找也找不到」的双方括号 ⟦ ⟧ 和角标记 ⌜ ⌝。至于用 \left/\right 还是 \big 系列让括号贴合内容,那是数学页面的职责。

! Missing delimiter (. inserted).——哪些字符才能当括号

这个错误的意思是:\left\right 后面出现了不是定界符的东西。在 TeX Live 2024 上编译 $\left\alpha x \right\alpha$,这一行会出现两次。原因看内核的声明就明白了。定界符的定义形式是 \DeclareMathDelimiter{命令}{类}{小号字体}{位置}{大号字体}{位置}——它 同时指明常规尺寸下使用的字形,以及可拉伸部件的所在fontmath.ltx 中的原文是:\DeclareMathDelimiter{\langle}{\mathopen}{symbols}{"68}{largesymbols}{"0A}\alpha 没有这样的声明,自然也就无从拉伸。

这种「两段式」结构解释了本页余下的一切。只有像样的小号形式、没有大号形式的符号(如 <\mid)不能跟在 \left 之后;反过来,只有大号形式的符号(下文的 \lgroup)直接写在普通公式里则什么都不显示。本页各表的第一列还悄悄携带另一项性质:声明中给出的类。\langle\mathopen(开),\rangle\mathclose(闭),|\mathord(普通符号)。这一差别决定了前后的间距。此外,当你不想在某一侧画出括号时使用的 空定界符 . 也属于这张表;\left. 的用法详见相关页面。

latex
% a delimiter names a small glyph AND the growable pieces
% \DeclareMathDelimiter{\langle}{\mathopen}{symbols}{"68}{largesymbols}{"0A}
\[
  \langle a, b \rangle
  \qquad
  \left\langle \frac{a}{b} \right\rangle
\]
% $\left\alpha x\right\alpha$  ->  ! Missing delimiter (. inserted).

( [ \{ \langle——四种基本括号,以及为什么不能打 <

圆括号 ( ) 和方括号 [ ] 可以直接从键盘输入,花括号却不行。{} 在 LaTeX 中是 用于给参数分组的保留字符,裸写不会出现在页面上,要写成 \{\}。尖括号更麻烦:键盘上的 < >不等号(\mathrel,不是括号。内积与 bra-ket 记法要用 \langle(⟨)和 \rangle(⟩)。名字较长的 \lbrack\rbrack\lbrace\rbrace 是输出与 [ ] \{ \} 相同字符的别名;在宏参数里,裸写的 [ 可能被当成可选参数,这时它们就派上用场。若已载入 mathtools\lparen\rparen 同样可用。

输入字形用途 / 备注
( )( )open / close直接输入;最常用的一对
[ ][ ]open / close\lbrack\rbrack 是同字别名
\{ \}{ }open / close{ 是保留字符;\lbrace\rbrace 同义
\langle \rangle⟨ ⟩open / close内积、bra-ket;< > 是关系符,不能替代
\lparen \rparen( )open / closemathtools 提供的别名;输出与 ( ) 相同
.(无输出)null空定界符;使 \left/\right 的一侧为空

在正文(文本模式)里排尖括号还有一个陷阱。pdfLaTeX 的默认编码 OT1 中,<> 的位置上放的是 ¡ 和 ¿。在 TeX Live 2024 上把 A <x> B 写进正文并编译,从 PDF 里抽出来的字符串是 A ¡x¿ B。西班牙语倒置标点凭空冒出来的那个著名 bug,原因就在这里。有两种解决办法:载入 \usepackage[T1]{fontenc},把 < > 放回正确位置;或者按语义使用 \textless\textgreater(不等号)或 \textlangle\textrangle(真正的尖括号 〈 〉)。后一对属于 TS1,但自 2020 年起已在内核中,无需额外宏包。

| \vert \mid \Vert \| \lvert——一根竖线为何有六种写法

看着一样,这六个其实分三组。先看字形。fontmath.ltx 中,|\vert 以及下文的 \arrowvert 都指向同一个位置(cmsy 的 "6A),实测三者宽度同为 2.77779pt。\|\Vert\Arrowvert 同样共用 "6B,宽 5.00002pt。也就是说,\| 还是 \Vert,输出一个字符都不会变再看类。 它们全是 \mathord(普通符号),既不是开也不是闭。amsmath\lvert/\rvert\lVert/\rVert 用的是同样的字形,但 赋予了开、闭两种类,绝对值和范数需要的正是这一点。

第三组只有 \mid 它的不同不在字形而在类:它被声明为 \mathrel(关系符)。集合的内涵表示法「满足条件的那些 x」中,那根竖线不是括号,而是表示「使得」的关系符,所以 \mid 才是正确选择。差别可以量出来:在 TeX Live 2024 上,$\{x \mid x>0\}$ 宽 48.09702pt,而 $\{x | x>0\}$$\{x \vert x>0\}$ 都是 42.5416pt。5.55542pt 的差 正是关系符两侧各 5 mu 的间距。用裸 | 写出来的集合看着特别挤,原因就是少了这段间距。

输入字形用途 / 备注
| \vert|ord同一个字;2.77779pt;不分开闭
\| \Vertord同一个字;5.00002pt;范数的双竖线
\mid|rel「使得」;集合内涵表示法应当用它
\lvert \rvert| |open / close绝对值;需要 amsmath
\lVert \rVert‖ ‖open / close范数;需要 amsmath
\arrowvert \Arrowvert| ‖ord常规尺寸下与 \vert/\Vert 同字;仅可拉伸部件不同
latex
\usepackage{amsmath}   % \lvert \rvert \lVert \rVert
\[
  \lvert x \rvert \;=\; \lvert -x \rvert,
  \qquad
  \lVert v \rVert \;=\; \sqrt{\langle v, v \rangle},
  \qquad
  \{\, x \mid x > 0 \,\}
\]

floor 与 ceiling:\lfloor\lceil,以及名字里 lr 的含义

向下取整 ⌊x⌋ 用 \lfloor\rfloor,向上取整 ⌈x⌉ 用 \lceil\rceil,四者都属 LaTeX 标准。名字开头的 lr 代表 left(开)和 right(闭),这条规则在 \lbrack/\rbrack\langle/\rangle\lvert/\rvert 上同样贯彻。记住 只有下端有角的是 floor,只有上端有角的是 ceiling,字形也就不会弄混。这两个记号由 Kenneth E. Iverson 引入,出处是他 1962 年的著作 A Programming Language。在此之前,[x] 承担向下取整之意,却没有与之对应的向上取整符号,而且 [x] 与普通方括号混淆——把字形拆成上下两半,正是这一记法的发明所在。

latex
\[
  \lfloor x \rfloor \le x \le \lceil x \rceil,
  \qquad
  \left\lfloor \frac{n}{2} \right\rfloor
  \qquad
  \left\lceil \log_2 n \right\rceil
\]

箭头和斜线也是定界符:\uparrow/\backslash

定界符表上并不只有括号。六个竖向箭头——\uparrow(↑)、\downarrow(↓)、\updownarrow(↕),以及双线的 \Uparrow(⇑)、\Downarrow(⇓)、\Updownarrow(⇕)——在 fontmath.ltx 中以 \DeclareMathDelimiter 声明,放在 \left/\right 之后会伸到内容的高度。不过它们的类是 \mathrel(关系符),在公式中正常使用时表现为箭头。同一个命令,视所在位置既可以是箭头,也可以是括号。 它们常用于在矩阵旁标出范围,或代替表示极限的竖线。

斜线也住在同一张表上。正斜线 / 直接输入;反斜线写作 \backslash(\),因为裸写的 \ 是换行命令。它们用于商集合 G \backslash H,或在 \left. … \right/ 中构成沿对角伸缩的分隔符。表示集合差的二元运算符 \setminus 看着相似,却是另一个命令,类也不同(\mathbin)——详见集合与逻辑符号页。

输入字形用途 / 备注
\uparrow \downarrow↑ ↓rel单线;双向为 \updownarrow
\Uparrow \Downarrow⇑ ⇓rel双线;双向为 \Updownarrow
//ord直接输入;可作为沿对角伸缩的分隔符
\backslash\ord商集合等;裸写的 \ 是换行命令

$\lgroup$ 什么都不出来——只有放大后才现身的括号

\lgroup\rgroup\lmoustache\rmoustache\bracevert 这五个 根本没有常规尺寸的字形。开头看到的声明中,它们的「小号」位置指向的不是普通字体里的某个字符,而是 用来拼装大号符号的部件。在 TeX Live 2024 上验证,症状十分明显:$\lgroup x \rgroup$ 占 23.49307pt 宽(而 $( x )$ 为 13.49307pt),但 pdftotext 只抽出一个字符 x。左右两个括号落在 Unicode 私用区(U+F8F3、U+F8FE),在页面上也不像括号。$\lmoustache x \rmoustache$ 更甚,抽取结果是 zx{——两个部件的位置编号被直接读成了 z{

结论很简单:这五个必须与 \left/\right\bigl/\Bigl … 成对使用。 \lgroup\rgroup 是角更尖、笔画更重的圆括号,在大号行间公式中很好看。\lmoustache\rmoustache 相当于大花括号的上半部和下半部,用于分情况表格逐行分隔之类的特殊场合。\bracevert\arrowvert\Arrowvert 本身就是 把花括号和箭头纵向拉长所用的直线部件。出于同样的原因,这三个也最好不要直接写在行内。

latex
% these have no text-size glyph — always pair them with \left/\right or \big
\[
  \left\lgroup \frac{a}{b} \right\rgroup
  \qquad
  \left\lmoustache \frac{a}{b} \right\rmoustache
\]
% $\lgroup x \rgroup$ alone prints no brackets at all

⟦ ⟧ 与 ⌜ ⌝——标准里没有的括号在哪个宏包里

指称语义中表示 ⟦M⟧ 的 双方括号来自 stmaryrd\llbracket\rrbracket;证明论与蒯因引号所用的 角标记 ⌜ ⌝ 来自 amssymb\ulcorner\urcorner(下方一对是 \llcorner\lrcorner)。二者都不在 LaTeX 标准中,不载入宏包就写会得到 ! Undefined control sequence. 如果在 XeLaTeX/LuaLaTeX 上使用 unicode-math,双方括号的名字改为 \lBrack\rBrack(U+27E6 / U+27E7)。

这里有一个不翻宏包源码就发现不了的陷阱:即使在同一个宏包里,也有的符号声明为定界符,有的不是。stmaryrd.sty 中,\llbracket\rrbracket\DeclareMathDelimiter,而 \llparenthesis\rrparenthesis(⦇ ⦈)以及 \Lbag\Rbag(⟅ ⟆)是 \DeclareMathSymbol——也就是 固定尺寸的符号。在 TeX Live 2024 上编译 $\left\llparenthesis \frac{a}{b} \right\rrparenthesis$,理所当然会得到 ! Missing delimiter (. inserted). 记住「需要伸缩时 \llbracket 可用、\llparenthesis 不可用」,能少踩一次坑。

命令字形宏包能否伸缩 / 备注
\llbracket \rrbracket⟦ ⟧stmaryrd可伸缩;指称语义的 ⟦M⟧
\ulcorner \urcorner⌜ ⌝amssymb固定尺寸;蒯因引号、哥德尔编号
\llcorner \lrcorner⌞ ⌟amssymb固定尺寸;下方的角标记
\llparenthesis \rrparenthesis⦇ ⦈stmaryrd不可伸缩;放在 \left 后会报错
\Lbag \Rbag⟅ ⟆stmaryrd不可伸缩;多重集(bag)的括号
\lBrack \rBrack⟦ ⟧unicode-mathXeLaTeX/LuaLaTeX 下双方括号的名字

最后说一句留在 PDF 里的东西。从含 \langle 的 PDF 中抽取文字,得到的是 U+27E8(MATHEMATICAL LEFT ANGLE BRACKET),复制后仍能粘贴为尖括号。而 stmaryrd 的 ⟦ ⟧ 直接暴露其专用字体的位置编号:在 TeX Live 2024 上,pdftotext 会把它们抽成 JK。当审稿人要从 PDF 里复制公式来讨论时,这一差别就很要紧;因此大量使用双方括号的论文,值得考虑改用 Unicode 引擎加 unicode-math

document.tex
\usepackage{amssymb}    % \ulcorner \urcorner \llcorner \lrcorner
\usepackage{stmaryrd}   % \llbracket \rrbracket \Lbag \Rbag
% ...
\[
  \llbracket M \rrbracket_\rho
  \qquad
  \left\llbracket \frac{a}{b} \right\rrbracket
  \qquad
  \ulcorner \varphi \urcorner
\]