区切り記号(括弧類)

LaTeX には「括弧」という概念がありません。あるのは 区切り記号(delimiter)の表 です。フォントが縦に伸ばすための部品を用意している文字だけがその表に載り、載っていない文字を \left の後ろに置くと、TeX は即座に ! Missing delimiter (. inserted). と答えます。つまり「どの括弧が使えるか」は好みではなく、フォントが決めています。このページは、その表に何が載っているかを引くための一覧です——丸括弧・角括弧・波括弧・山括弧 \langle、絶対値の |\lvert、床と天井の \lfloor \lceil、そして「探しても見つからない」二重角括弧 ⟦ ⟧ や隅の記号 ⌜ ⌝ まで。括弧を中身の高さに合わせて伸ばす \left\right\big の使い分けは、数式側の専用ページが持っています。

! Missing delimiter (. inserted). ——括弧になれる文字は決まっている

このエラーは「\left\right の後ろに、区切り記号ではないものが来た」という意味です。$\left\alpha x \right\alpha$ を TeX Live 2024 で組むと二回この行が出ます。理由はカーネルの宣言を見ればわかります。区切り記号は \DeclareMathDelimiter{命令}{クラス}{小さい版のフォント}{位置}{大きい版のフォント}{位置} という形で、小さいときのグリフと、大きくするときの部品の在処を二つとも指定 して定義されます。fontmath.ltx の実物はこうです——\DeclareMathDelimiter{\langle}{\mathopen}{symbols}{"68}{largesymbols}{"0A}\alpha にはこの宣言がないので、伸ばしようがない、というだけの話です。

この二重構造が、以下のページ全体を説明します。小さい版だけがまともで大きい版が無い記号<\mid)は \left に使えず、逆に 大きい版しか持たない記号(後述の \lgroup)は素の数式に書いても何も出ません。表の 1 列目には、二つ目の性質もひそかに書き込まれています——宣言の第 2 引数のクラスです。\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 であって括弧ではありません。内積やブラ・ケットには \langle(⟨)と \rangle(⟩)を使います。名前が長い \lbrack\rbrack\lbrace\rbrace[ ] \{ \} と同じ字を出す別名で、マクロの引数のなかで生の [ が省略引数と読まれかねない場面で重宝します。mathtools を読み込んでいれば \lparen\rparen も同様に使えます。

入力字形クラス用途・備考
( )( )open / closeキーから直接。もっとも普通の対
[ ][ ]open / close\lbrack\rbrack は同じ字の別名
\{ \}{ }open / close{ は予約文字。\lbrace\rbrace も同義
\langle \rangle⟨ ⟩open / close内積・ブラケット。< > は不等号なので不可
\lparen \rparen( )open / closemathtools の別名。( ) と同じ出力
.(何も出ない)nullヌル・デリミタ。\left\right の片側を空にする

本文(テキストモード)で山括弧を出したい場合は、さらに落とし穴があります。pdfLaTeX の既定エンコーディング OT1 では、<> の位置に ¡ と ¿ が入っています。TeX Live 2024 で A <x> B と地の文に書いてコンパイルすると、PDF から抜けてくる文字列は A ¡x¿ B です。スペイン語の逆さ感嘆符が突然現れる、というよく知られたバグの正体がこれです。対処は二つ——\usepackage[T1]{fontenc} を入れて < > を正しい位置に持ってくるか、意味に合わせて \textless\textgreater(不等号)や \textlangle\textrangle(本物の山括弧 〈 〉)を使うことです。後者は TS1 の記号ですが、2020 年以降のカーネルには最初から入っているので追加パッケージは要りません。

| \vert \mid \Vert \| \lvert ——縦線が六つもある理由

見た目は同じでも、六つは三組に分かれます。まず字形。 |\vert、そして後述の \arrowvertfontmath.ltx でどれも同じ位置(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 \,\}
\]

床と天井 \lfloor \lceil ——名前の lr が示すもの

切り捨て ⌊x⌋ は \lfloor\rfloor、切り上げ ⌈x⌉ は \lceil\rceil で、いずれも LaTeX 標準です。名前の頭の lr は left(開き)と right(閉じ)で、この規則は \lbrack\rbrack\langle\rangle\lvert\rvert にも一貫して通っています。下だけに角があるのが床、上だけに角があるのが天井 と覚えれば字形も取り違えません。この二つの記号を導入したのは 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 の中身を見ないと分からない落とし穴があります。同じパッケージの記号でも、区切り記号として宣言されているものとそうでないものがある のです。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
\]