mathtools

amsmath를 불러 수식을 조판하기 시작하면 조금 아쉬운 부분들이 보입니다. :=의 콜론이 약간 아래로 내려가 있고, 한 줄을 가로지르는 긴 화살표의 위아래에 라벨을 달고 싶으며, 절댓값의 세로줄을 내용 높이에 맞춰 자동으로 늘리고 싶습니다. mathtools는 이런 일을 한꺼번에 맡아 주는 패키지입니다. amsmath를 불러온 뒤 보강하는 확장 패키지이므로 \usepackage{mathtools} 한 줄이 amsmath 로드까지 겸합니다. 이 페이지에서는 가장 자주 쓰는 추가 기능, 즉 올바른 :=, 늘어나는 화살표 \xrightarrow, 각진 \overbracket, 자동 크기 조절 \DeclarePairedDelimiter, 폭이 0인 \mathclap, 앞쪽 첨자 \prescript, 열 정렬 행렬 matrix*를 차례로 살펴봅니다.

mathtools란

mathtools는 공식 매뉴얼의 표현을 빌리면 “amsmath에 대한 확장 패키지”입니다. amsmath가 수식 조판의 사실상 표준이라는 점을 전제로, amsmath에 남아 있는 몇 가지 부족함과 버그를 고치고 일상 조판에 유용한 도구를 더합니다. 중요한 점은 mathtools가 내부적으로 amsmath를 필요로 하며 자동으로 불러온다는 것입니다. 따라서 amsmath를 따로 쓸 필요 없이 프리앰블에는 이 한 줄이면 충분합니다.

latex
\usepackage{mathtools}

amsmath에 옵션을 넘기고 싶을 때도 mathtools가 그대로 전달합니다. 매뉴얼이 보이듯 \usepackage[fleqn,tbtags]{mathtools}\usepackage[fleqn,tbtags]{amsmath} 다음에 \usepackage{mathtools}를 쓴 것과 같은 뜻입니다. 즉 mathtools를 읽을 때 준 옵션은 아래의 amsmath에도 전달됩니다.

mathtools의 기능은 폭넓어서 여기서 모두 다룰 수는 없습니다. 이 페이지에서는 오쿠무라의 『LaTeX2e 美文書作成入門』 같은 참고서에서도 다룰 만한 사용 빈도가 높은 추가 기능 에 초점을 맞춥니다. 경우 나누기 확장(dcases), 식 번호 제어(showonlyrefs), 정렬 안의 화살표(\ArrowBetweenLines) 같은 기능도 있지만, 정렬 주변의 자세한 내용은 별도 페이지 “별행, 정렬, 번호가 붙은 수식”에 맡깁니다.

또한 mathtools는 내부적으로 mhsetup 이라는 작은 도우미 패키지에도 의존합니다. 이것은 \DeclarePairedDelimiter의 짝 구분자 메커니즘 등을 뒷받침합니다. TeX Live 같은 주요 배포판에는 함께 들어 있으므로 보통은 신경 쓰지 않아도 됩니다. 현재 유지보수는 Lars Madsen이 이어받았으며 최신 릴리스는 CTAN에 있습니다.

깔끔한 정의 기호 — \coloneqq 계열

정의에 쓰는 “:=”를 수학 모드에서 그대로 :=라고 입력하면 예상보다 어색합니다. :관계 기호가 아니라 구두점 으로 처리되어 앞뒤 간격이 맞지 않고, 콜론이 =의 중심선보다 조금 아래 로 내려가기 때문입니다. mathtools의 \coloneqq는 콜론을 등호에 대해 올바른 높이에 가운데 맞추고, 관계 기호로서 적절한 간격을 가진 “:=”를 조판합니다. 반대 방향 “=:”에는 \eqqcolon을 씁니다.

latex
\[
  f(x) \coloneqq x^2 + 1, \qquad y \eqqcolon g(x)
\]

이 예에서 왼쪽 식은 “f(x)를 x²+1로 정의한다”를 나타내는 :=를, 오른쪽 식은 “g(x)를 y라고 쓴다” 방향의 =:를 조판하며 둘 다 콜론이 깔끔하게 중앙에 놓입니다. 이중 콜론 \dblcolon(::)이나 콜론과 근사, 상사를 조합한 \colonapprox, \colonsim 등도 제공됩니다.

한 가지 주의할 점이 있습니다. 2022년 업데이트에서 mathtools는 다른 패키지와 이름을 맞추기 위해 이 콜론 기호들의 정식 이름을 정리 했습니다. \coloneqq, \eqqcolon 같은 익숙한 이름은 호환을 위해 그대로 사용할 수 있지만, 새 체계에서는 \coloneq 등이 정식 이름입니다. 기존 문서가 계속 컴파일되도록 예전 이름이 남아 있습니다.

늘어나는 화살표 — \xrightarrow\xleftarrow

일반 \rightarrow(→)나 \Rightarrow(⇒)는 길이가 고정되어 있어 위에 얹은 라벨보다 화살표가 짧으면 보기 좋지 않습니다. amsmath는 라벨에 맞춰 가로로 늘어나는 화살표 \xrightarrow\xleftarrow 두 개만 제공합니다. 쓰는 법은 \xrightarrow[아래 라벨]{위 라벨}이며, 중괄호 { }는 화살표 위, 대괄호 [ ]는 화살표 아래 에 놓입니다. 대괄호는 생략할 수 있습니다. 화살표는 라벨 너비에 맞춰 자동으로 늘어납니다.

latex
\[
  A \xrightarrow{f} B \xrightarrow[\sim]{g} C,
  \qquad
  X \xleftarrow[n \to \infty]{\varphi_n} Y
\]

이 예에서 A에서 B로 가는 화살표는 위에 f를 얹은 오른쪽 늘어나는 화살표이고, B에서 C로 가는 화살표는 위에 g, 아래에 가 붙어 있으며 둘 다 라벨 너비에 맞춰 늘어납니다. 오른쪽은 왼쪽을 향한 화살표로, 위에는 사상 φ_n, 아래에는 극한 조건 n→∞이 붙습니다.

amsmath가 제공하는 늘어나는 화살표는 이 오른쪽과 왼쪽 두 개뿐이지만, mathtools는 같은 이름 규칙으로 계열을 크게 늘립니다. 이중선 \xRightarrow, \xLeftarrow, \xLeftrightarrow, 양방향 \xleftrightarrow, 갈고리 달린 \xhookrightarrow, \xhookleftarrow, 사상 화살표 \xmapsto, 그리고 harpoon(한쪽 날개 화살표)과 더 긴 \xlongrightarrow 등이 있습니다. 모두 같은 [아래]{위} 형식으로 씁니다.

각진 괄선 — \overbracket\underbracket

표준 LaTeX와 amsmath에는 식의 위아래에 물결 모양 괄선 을 그리는 \overbrace\underbrace가 있습니다. mathtools는 여기에 각진, 직각 괄선 을 그리는 \overbracket\underbracket를 추가합니다. 둥근 중괄호 모양이 아니라 양끝이 직각으로 꺾인 “⌜ ⌟” 같은 괄선이어서 도식이나 구조의 범위를 표시할 때 더 읽기 쉬울 수 있습니다.

\overbracket에는 두 개의 선택 인수 가 있습니다. 첫 번째는 선 두께, 두 번째는 괄선 높이이며 \overbracket[선 두께][높이]{내용} 순서로 씁니다. 기본값은 선 두께가 \overbrace와 같고(약 5/18 ex), 높이는 약 0.7 ex로 어떤 글자 크기에서도 보기 좋도록 선택되어 있습니다. 두께나 높이를 바꾸고 싶을 때만 대괄호로 줍니다. 위에 올리는 설명은 물결형과 마찬가지로 ^{ }로 붙이고, 아래라면 _{ }로 붙입니다.

latex
\[
  \underbracket{a + b + c}_{\text{3 terms}}
  \quad\text{vs}\quad
  \underbrace{a + b + c}_{\text{3 terms}}
\]

이 예에서는 같은 “a+b+c”에 대해 왼쪽은 \underbracket직각 괄선, 오른쪽은 \underbrace물결 괄선 이 아래에 놓이고, 둘 다 그 아래에 “3 terms”라는 주석이 붙습니다. 나란히 두면 각진 괄선과 둥근 괄선의 차이가 분명히 보입니다.

자동 조절 구분자 — \DeclarePairedDelimiter

절댓값 |x|나 노름 ‖x‖을 조판할 때 내용이 분수처럼 높으면 고정 크기 세로줄은 내용 높이에 맞지 않아 어색합니다. amsmath 매뉴얼은 \newcommand*\abs[1]{\lvert#1\rvert} 같은 직접 정의를 권하지만, 이것은 가로 간격은 맞아도 \abs{\frac{a}{b}}처럼 내용이 높을 때 세로줄이 늘어나지 않아 모양이 무너집니다. mathtools의 \DeclarePairedDelimiter는 이런 좌우 한 쌍의 구분자를 자동 확장 기능까지 포함해 한 번에 정의 하는 명령입니다. 프리앰블에 이렇게 씁니다.

latex
\DeclarePairedDelimiter\abs{\lvert}{\rvert}
\DeclarePairedDelimiter\norm{\lVert}{\rVert}

이렇게 정의하면 \abs\norm은 각각 세 가지 방식으로 쓸 수 있습니다. 첫째, 그냥 \abs{x} 는 고정 크기 세로줄로 조판합니다. 내용이 낮을 때는 이것으로 충분합니다. 둘째, 별표가 붙은 \abs*{x} 는 내용을 \left … \right로 감싸 높이에 맞춰 자동으로 늘어납니다. 셋째, 선택 인수 형태 \abs[\big]{x} 는 크기를 수동으로 지정하며 \big, \Big, \bigg, \Bigg 네 단계에서 고릅니다.

latex
\[
  \abs{x} = \abs{-x}, \qquad
  \abs*{\frac{a}{b}} = \frac{\abs{a}}{\abs{b}}, \qquad
  \norm[\big]{v}
\]

이 예에서 \abs{x}\abs{-x}는 보통 크기 세로줄이고, \abs*{\frac{a}{b}}분수 높이에 맞춰 늘어난 세로줄이며, \norm[\big]{v}\big 한 단계만큼 크게 한 이중 세로줄입니다. 구분자 메커니즘 자체는 “구분자(\left \right)” 페이지도 참고하세요.

폭 0 중앙 정렬과 앞쪽 첨자

남은 자주 쓰는 도구 세 가지를 함께 봅니다. 첫 번째는 \mathclap입니다. 합이나 곱의 아래에 붙이는 조건이 연산자 자체보다 가로로 길면 그 너비만큼 수식 전체에 여백이 생깁니다. \mathclap{…}는 내용을 폭 0인 상자에 넣고 좌우 대칭으로 중앙 정렬 하므로 조건은 보이지만 수식의 폭은 연산자 본체만큼으로 유지됩니다. 왼쪽, 오른쪽 정렬 버전인 \mathllap, \mathrlap와 본문용 \clap도 있습니다.

latex
\[
  \sum_{\mathclap{1 \le i \le j \le n}} a_{ij}
\]

이 예에서는 합 기호 아래에 “1 ≤ i ≤ j ≤ n”이라는 가로로 긴 조건이 붙습니다. \mathclap으로 감쌌기 때문에 조건은 합 기호 중앙에 겹쳐 놓이고 수식 좌우에 불필요한 여백이 생기지 않습니다. \mathclap을 빼면 긴 조건의 너비만큼 합 기호 앞뒤가 늘어납니다.

두 번째는 \prescript로, 문자 앞, 즉 왼쪽에 위첨자와 아래첨자를 놓는 명령입니다. 인수는 세 개이며 \prescript{앞 위첨자}{앞 아래첨자}{본체} 순서로 씁니다. 화학의 동위원소 표기나 왼쪽 첨자를 쓰는 수학 표기에 편리합니다. 예를 들어 우라늄 238은 질량수 238을 앞 위첨자로, 원자번호 92를 앞 아래첨자로 나타냅니다.

latex
\[
  \prescript{238}{92}{\mathbf{U}}, \qquad
  \prescript{n}{}{C}_{k}
\]

이 예에서 왼쪽은 원소 기호 U의 왼쪽 위에 238, 왼쪽 아래에 92가 붙은 우라늄 동위원소 표기이고, 오른쪽은 C의 왼쪽 위에 n을 두면서 일반적으로처럼 오른쪽 아래에 k를 붙인 형태입니다. 앞 아래첨자가 필요 없을 때는 두 번째 인수를 빈 {}로 둡니다.

세 번째는 \shortintertext입니다. amsmath의 \intertext는 정렬을 유지한 채 행 사이에 문장을 끼워 넣을 수 있지만, 위아래 간격이 조금 넓을 때가 있습니다. \shortintertext{…}는 이를 좁힌 버전으로, 짧은 주석을 행 사이에 넣고 싶을 때 더 잘 맞습니다. \intertext\shortintertext는 모두 gather 환경 안에서도 사용할 수 있습니다.

열을 정렬하는 행렬 — matrix* 계열

amsmath의 행렬 환경(matrix, pmatrix, bmatrix 등)은 각 열을 항상 가운데 정렬 로 조판합니다. 음수가 붙은 성분과 그렇지 않은 성분이 섞이면 가운데 정렬에서는 자릿수가 맞지 않아 읽기 어렵습니다. mathtools는 이에 대응하는 별표 환경 matrix*, pmatrix*, bmatrix*, Bmatrix*, vmatrix*, Vmatrix*를 제공하고, 열 정렬을 선택하는 선택 인수 를 받을 수 있게 합니다. \begin{pmatrix*}[r]처럼 array 환경과 같은 열 지정자(r, l, c)를 주며 기본값은 c입니다.

latex
\[
  \begin{pmatrix*}[r]
    -1 & 3 \\
     2 & -4
  \end{pmatrix*}
\]

이 예에서는 둥근괄호 행렬의 각 열이 오른쪽 정렬 로 조판되므로 -12, 3-4의 숫자 오른쪽 끝이 맞고 음수 기호가 깔끔하게 왼쪽으로 튀어나옵니다. 표준 pmatrix라면 각 성분이 가운데 정렬되어 음수 기호 너비만큼 자릿수가 어긋나 보입니다. 행렬 자체의 기본은 “행렬과 배열” 페이지를 참고하세요.

옵션 설정 — \mathtoolsset

mathtools의 여러 동작은 true/false 같은 스위치를 바꾸어 조정할 수 있습니다. 이를 한곳에서 처리하는 명령이 \mathtoolsset{…}이며, 보통 문서 전체에 적용되도록 프리앰블에 씁니다. 키는 쉼표로 구분해 나열하고 key=value 형태나 값이 자명한 경우에는 key만으로 줍니다.

latex
\mathtoolsset{
  showonlyrefs = true,
  centercolon
}

자주 쓰는 키를 들면, showonlyrefs=true본문에서 참조된 식에만 번호를 붙이고 참조되지 않은 식 번호는 숨깁니다. 다만 참조에는 \ref가 아니라 \eqref를 써야 합니다. centercolon:를 관계 기호로서 중앙 높이에 놓는 동작을 켭니다. 이 밖에도 작은 행렬 변형의 기본 정렬을 정하는 smallmatrix-align, \prescript 첨자의 글꼴을 바꾸는 prescript-sub-format / prescript-sup-format 등 세부 키가 많이 있습니다.

기능명령/환경역할
coloneqq\coloneqq / \eqqcolon콜론을 중앙에 둔 := / =:
xrightarrow\xrightarrow[아래]{위}라벨에 맞춰 늘어나는 화살표
overbracket\overbracket / \underbracket각진 괄선(두께/높이 조정 가능)
DeclarePairedDelimiter\DeclarePairedDelimiter자동 확장 \abs, \norm 정의
mathclap\mathclap / \clap폭 0 중앙 정렬(첨자 정돈)
prescript\prescript{위}{아래}{본체}기호 앞에 첨자를 둠
matrix*matrix* / pmatrix*열 정렬을 선택할 수 있는 행렬 환경