구분 기호(괄호)

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입니다. 스페인어의 거꾸로 된 문장 부호가 난데없이 나타나는 유명한 버그의 정체가 바로 이것입니다. 대처법은 둘입니다. \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 \,\}
\]

내림과 올림 \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.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
\]