“이 도식은 가환이다”는 수학에서 가장 짧으면서도 가장 무게가 큰 문장일지 모릅니다. 풀어 쓰면 여러 줄이 걸리는 등식 묶음이 이 한마디에 담기기 때문입니다. 가환 도식은 대상을 점으로, 사상을 화살표로 바꾸어 놓고 같은 두 대상을 잇는 어떤 유향 경로든 합성하면 같은 사상이 된다고 주장합니다. LaTeX에서 이를 그리는 오늘날의 표준은 \usepackage{tikz-cd}이며, 환경 이름은 하이픈이 없는 tikzcd입니다. 단순한 직사각 격자로 충분하다면 AMS의 amscd도 여전히 쓸 만합니다. 이 페이지에서는 가환 정사각형을 처음부터 조립하고, 라벨을 화살표 양쪽에 나누어 붙이고, 화살표를 휘게 한 다음, 어느 패키지를 읽어야 하는지에 답합니다.
“도식이 가환한다”는 말이 실제로 주장하는 것
가환한다는 것은 시작점과 끝점이 같은 모든 유향 경로가 같은 합성을 준다는 뜻입니다. 네 꼭짓점에 A, B, C, D를 두고 위쪽에 A에서 B로 가는 f, 오른쪽에 B에서 D로 가는 β, 왼쪽에 A에서 C로 가는 α, 아래쪽에 C에서 D로 가는 g를 그린 정사각형이라면, 이 정사각형이 가환하다는 주장은 β∘f = g∘α라는 등식 하나와 정확히 같습니다. 삼각형은 등식 하나, 정사각형도 하나, 정육면체는 면마다 하나씩 여섯 개를 한 장의 그림에 접어 넣습니다. 도식이 커질수록 그림이 담는 정보와 그것을 등식으로 적을 때 드는 분량의 차이는 벌어집니다. 가환 도식은 장식이 아니라 표기의 압축입니다.
이 압축이 가장 크게 힘을 발휘하는 곳이 도식 추적(diagram chasing) 입니다. 호몰로지 대수의 다섯 보조정리나 뱀 보조정리 증명은 어느 한 모서리에서 원소를 하나 골라 화살표를 따라 밀어내며 도식 안을 돌아다니는 방식으로 진행됩니다. 가환성은 그 걸음마다 “어느 길로 가든 같은 자리에 도착한다”를 보장하는 규칙입니다. 그래서 도식은 그림인 동시에 증명을 두는 판이기도 합니다. 이런 그림이 수학 서술에 자리 잡은 것은 범주론을 세운 1945년 논문부터인데, 그 내력과 화살표 기호 자체는 화살표 페이지에서 다룹니다.
도식 자체가 수식이므로 자리는 별행 수식입니다. \[ … \]나 equation 환경에 넣으면 한 줄을 차지하며 가운데에 놓입니다. 역사적으로 이 일을 위한 패키지가 여럿 쓰였습니다. xypic, diagram, kuvio 등입니다. 그러나 새로 쓸 때 실질적인 선택지는 둘뿐입니다. 범용 그림 패키지 TikZ 위에 세워진 tikz-cd와 AMS의 amscd입니다. 아래에서 차례로 살펴봅니다.
\usepackage{tikz-cd}와 tikzcd 환경: 하이픈 하나의 함정
프리앰블에 \usepackage{tikz-cd}를 쓰고, 본문에서는 \begin{tikzcd} … \end{tikzcd}로 도식을 감쌉니다. 패키지 이름에는 하이픈이 있고 환경 이름에는 없습니다. 둘을 바꿔 쓰면 ! LaTeX Error: File 'tikzcd.sty' not found.가 나오고, 패키지를 읽지 않은 채 환경만 쓰면 ! LaTeX Error: Environment tikzcd undefined.가 나옵니다. TikZ를 이미 읽었다면 \usetikzlibrary{cd}로도 같은 것을 얻습니다. CTAN의 현행 판은 1.0(2021년 5월 4일)이며 Augusto Stoffel이 관리합니다. 화살촉은 별도의 라이브러리로 함께 배포되며 Computer Modern 서체의 화살표에 모양을 맞춰 그려져 있습니다. 도식의 화살표가 다른 글꼴에서 빌려 온 것처럼 보이지 않는 이유가 여기에 있습니다.
tikzcd 안의 내용은 tabular나 matrix와 완전히 같은 방식으로 씁니다. 셀은 &로 나누고 행은 \\로 바꿉니다. 각 셀은 도식의 노드가 되고 내용은 자동으로 수식 모드로 조판되므로 $가 필요 없습니다. 여기에 \arrow를 덧붙이면 화살표가 자라납니다. 짧은 별칭 \ar는 완전히 같은 명령입니다. 화살표는 출발하는 셀 에 쓰고, 목적지는 대괄호 안에서 방향 키 로 지정합니다. r은 오른쪽, l은 왼쪽, u는 위, d는 아래입니다. 이들은 문자열로 이어 쓸 수 있어서 [rd]는 오른쪽 아래로 비스듬히, [rr]은 두 칸 건너까지 닿습니다. 한 셀에서 몇 개를 내보내든 상관없습니다.
\usepackage{tikz-cd} % package has a hyphen; environment does not
\[
\begin{tikzcd}
A \arrow[r, "f"] \arrow[d, "\alpha"'] & B \arrow[d, "\beta"] \\
C \arrow[r, "g"'] & D
\end{tikzcd}
\]이것이 가환 정사각형입니다. A, B, C, D가 네 꼭짓점에 놓이고, 위쪽에는 오른쪽으로 가는 f, 아래쪽에는 오른쪽으로 가는 g, 왼쪽과 오른쪽에는 각각 아래로 내려가는 α와 β가 그려집니다. &가 열을, \\가 행을 나누므로 뼈대는 A & B \\ C & D 몇 글자에 지나지 않습니다. 화살표는 그 뼈대에 나중에 끼워 넣은 주석 같은 것이고, 대상의 위치는 화살표를 어떻게 쓰든 전혀 영향을 받지 않습니다. tikzcd 설계에서 가장 기분 좋은 대목입니다.
화살표 위와 아래에 라벨 놓기: "f"와 "f"'의 차이
옵션 안에 따옴표로 묶은 문자열 을 쓰면 라벨이 되고, 닫는 따옴표 바로 뒤에 아포스트로피 ' 를 붙이면 반대쪽으로 옮겨 갑니다. 위치를 정하는 규칙은 “위냐 아래냐”가 아니라 진행 방향 기준 왼쪽 입니다. 오른쪽으로 가는 화살표라면 왼쪽이 곧 위쪽이므로 \arrow[r, "f"]는 f를 위에, \arrow[r, "f"']는 아래에 놓습니다. 아래로 가는 화살표라면 왼쪽은 말 그대로 왼편이므로 \arrow[d, "\alpha"]는 α를 왼쪽에, \arrow[d, "\alpha"']는 오른쪽에 놓습니다. 네 경우를 외울 필요는 없습니다. “진행 방향의 왼쪽”이라는 규칙 하나로 모두 설명됩니다.
화살표 하나에 라벨을 몇 개든 얹을 수 있고, 각각에 고유한 옵션을 줄 수 있습니다. "\phi" near start는 시작점 쪽에, "\eta" near end는 끝점 쪽에 붙고, "h" description은 라벨을 화살표 위에 얹고 그 뒤의 선을 배경색으로 파냅니다. 짧은 화살표에 긴 이름을 붙일 때 쓰는 정석입니다. 라벨 본문이나 그 옵션에 쉼표가 들어가면 중괄호로 감쌉니다("{(x,y)}"). 내부가 수식 모드이므로 일반 단어를 넣으려면 amsmath의 \text{…}를 씁니다.
\[
\begin{tikzcd}
A \arrow[r, "\phi" near start, "\psi"', "\eta" near end] & B \\
X \arrow[r, "h" description] \arrow[rd] & Y \\
& Z
\end{tikzcd}
\]화살표 휘게 하기, 같은 두 대상 사이에 두 개 그리기
bend left와 bend right를 쓰고, 각도를 바꾸려면 bend left=25처럼 적습니다. 휘게 하는 이유는 거의 언제나 하나입니다. 같은 두 대상 사이에 사상이 둘 있기 때문 입니다. 수반, 호모토피 동치, 여등화자의 사상 쌍은 모두 화살표가 두 개 필요한데, 곧게 그으면 겹쳐서 하나로만 보입니다. 휘게 하면 둘 다 읽힙니다. 휘지 않고 평행하게 어긋내고 싶을 뿐이라면 shift left와 shift right(기본값 0.56ex)가 알맞습니다. 이쪽은 직선인 채로 옆으로 밀어 줍니다. 여기서도 “왼쪽”은 늘 진행 방향 기준이므로 bend left는 화살표가 보기에 왼쪽으로 부풀어 오릅니다.
입체적인 도식, 곧 삼차원 정육면체를 지면에 눌러 놓은 그림에서는 뒤쪽 모서리와 앞쪽 모서리가 교차합니다. 이때 화살표에 crossing over를 붙이면 그 아래에 배경색의 굵은 선이 먼저 그려져서 앞으로 지나가는 것처럼 보입니다. 화살표는 쓰인 순서대로 그려지므로, 아래로 지나가야 할 화살표가 먼저 나온 경우에는 뒤쪽 셀에서 from=uu처럼 거꾸로 지정해 그리는 순서를 미룹니다. 정육면체 도식이 제대로 나오느냐 마느냐는 이 두 가지를 아느냐에 달려 있습니다.
\[
\begin{tikzcd}
A \arrow[r, bend left=25, "f"] \arrow[r, bend right=25, "g"'] & B
\end{tikzcd}
\qquad
\begin{tikzcd}
A \arrow[dr] & B \arrow[dl, crossing over] \\
C & D
\end{tikzcd}
\]선 모양과 화살촉도 \arrow 옵션에 키를 더하는 것만으로 바뀝니다. 이름은 두 계열입니다. hook이나 two heads처럼 모양을 설명하는 짧은 이름, 그리고 dashrightarrow처럼 기존 LaTeX 명령에서 역슬래시를 뗀 이름 입니다. 두 번째 관례를 알면 찾아보지 않고도 키를 맞힐 수 있습니다. 키는 겹쳐 쓸 수도 있어서 \arrow[r, tail, two heads, dashed]는 꼬리가 있고 촉이 겹이며 파선인 화살표를 한 번에 만듭니다. 자주 쓰는 키를 아래에 정리했습니다.
| 키 | 효과 |
|---|---|
hook | 꼬리 쪽에 갈고리(⊂)를 붙임. 포함과 단사에 |
hook' | 같은 갈고리를 반대쪽으로 휘게 한 형태 |
tail | 시작점에 꼬리를 붙임. 단사의 또 다른 표기 |
two heads | 화살촉을 이중으로 만듦. 전사에 |
dashed | 파선으로 만듦. 관례상 유일하게 정해지는 사상 |
dotted | 점선으로 만듦. TikZ에서 물려받은 키 |
squiggly | 물결 모양 화살표 |
equal | 화살표 대신 이중선(등호)을 그림 |
maps to | 꼬리에 세로줄을 붙임(\mapsto의 ↦에 해당) |
Rightarrow | 겹선 화살표. 2-사상과 자연 변환에 |
dashrightarrow | \dashrightarrow와 같은 모양(역슬래시를 뗀 이름의 예) |
bend left | 진행 방향의 왼쪽으로 호를 그림. bend left=25로 각도 지정 |
bend right | 진행 방향의 오른쪽으로 호를 그림 |
shift left | 휘지 않고 옆으로 밀어 냄(기본 0.56ex). 평행한 두 개에 |
crossing over | 아래에 배경색 굵은 선을 깔아 앞으로 지나가는 것처럼 보이게 함 |
phantom | 화살표를 보이지 않게 함. 라벨만 남으므로 격자 밖에 기호를 놓을 수 있음 |
description | 라벨 옵션. 라벨을 선 위에 얹고 그 뒤의 선을 파냄 |
동형 기호를 라벨로 얹는 것도 흔한 표기입니다. \arrow[r, dashed, "\simeq"]는 파선 화살표 위에 ≃를 놓습니다(\sim도 마찬가지입니다). 또 tikz-cd는 TikZ 위에 세워져 있으므로 color=…, dotted, in=…/out=… 같은 TikZ 자체의 키도 그대로 받습니다. 표현 범위는 사실상 TikZ 전체에 이릅니다. 뒤집어 말하면 막혔을 때 펼쳐야 할 매뉴얼이 tikz-cd가 아니라 TikZ 쪽일 수도 있다는 뜻입니다.
간격 조절과 당김(pullback) 정사각형 표시
간격은 환경의 선택 인수에서 정합니다. \begin{tikzcd}[column sep=large, row sep=small]처럼 쓰며, 치수(2em 등)와 이름(tiny, small, large, huge)을 모두 받고, 행과 열을 한꺼번에 정하려면 sep을 씁니다. 긴 라벨이 붙은 방향만 넓히고 싶은 경우가 실제로 잦으므로 이 두 키는 기억해 둘 값어치가 있습니다.
당김(올 곱) 정사각형을 표시하는 작은 각 기호 ⌜에는 전용 키가 없습니다. 정석은 보이지 않는 화살표에 라벨만 얹는 것 입니다. \arrow[rd, phantom, "\ulcorner", very near start]라고 쓰면 phantom이 화살표를 지우고, 남은 라벨이 왼쪽 위 모서리 안쪽에 놓입니다(밂이라면 \lrcorner를 오른쪽 아래 가까이에 둡니다). 여기에 함정이 하나 있습니다. \ulcorner는 LaTeX 기본 기호가 아니라 AMSFonts의 것이므로 \usepackage{amssymb}를 잊으면 ! Undefined control sequence.로 멈춥니다. 또한 phantom 화살표의 라벨은 가운데 정렬에 \textstyle 원래 크기로 조판되므로, 작게 하려면 \scriptstyle을 명시합니다.
\usepackage{amssymb} % \ulcorner comes from AMSFonts, not core LaTeX
\[
\begin{tikzcd}[column sep=large, row sep=large]
P \arrow[r, "p"] \arrow[d, "q"'] \arrow[rd, phantom, "\ulcorner", very near start]
& X \arrow[d, "f"] \\
Y \arrow[r, "g"'] & Z
\end{tikzcd}
\]amscd로 충분한 경우: CD 환경
도식이 대각선 없는 직사각 격자이고, 빌드에 TikZ를 끌어들이고 싶지 않을 때 amscd가 답입니다. \usepackage{amscd}가 주는 것은 단 하나, CD 환경 입니다. amsmath 묶음의 일부이고 현행 판은 v2.1(2017년 4월 14일)이며 의존하는 것은 amsgen뿐입니다. 흥미로운 대목은 이 패키지 자신의 문서입니다. AMS-TeX 2.x의 가환 도식 기능을 재현한 것이라고 밝힌 뒤 단순한 직사각형 도식만 지원하며 대각선 화살표나 더 복잡한 기능은 없다고 명시하고, 이어서 많은 사용자에게는 더 강력한 도식 패키지가 나을 것이라며 diagram, xypic, kuvio의 이름까지 듭니다. 첫머리에서 독자를 다른 곳으로 보내는 패키지는 흔하지 않습니다.
내용은 tikz-cd와 마찬가지로 &와 \\로 이루어진 행렬이지만, 화살표는 모두 @ 로 시작하는 특별한 철자로 씁니다. 가로로는 @>>>가 오른쪽, @<<<가 왼쪽을 가리키고, 세로로는 @VVV가 아래(vertical의 V), @AAA가 위(A를 위로 향한 화살촉으로 본 것)를 가리킵니다. 이중선 등호는 가로가 @=, 세로가 @|입니다. 화살표를 두지 않을 격자점에는 “빈 화살표” @.를 넣어 자릿수를 맞춥니다. 가로 화살표는 같은 행의 두 대상 사이에, 세로 화살표는 대상 바로 아래 행에 씁니다.
라벨은 화살표를 이루는 문자 사이 에 끼워 넣습니다. 그리고 여기에 amscd 라벨의 나머지 성질을 한꺼번에 설명해 주는 사실이 있습니다. AMS 문서에 따르면 첫 번째 >와 두 번째 > 사이의 내용은 위 첨자 로, 두 번째와 세 번째 사이의 내용은 아래 첨자 로 조판됩니다. 그래서 @>f>>는 f를 위에, @>>g>는 g를 아래에, @>f>g>는 위아래 모두에 놓습니다. 라벨이 작게 나오는 까닭도 여기에 있습니다. amscd의 화살표는 사실상 첨자를 단, 아주 넓은 관계 기호 이기 때문입니다. 세로 화살표도 같은 규칙을 따르되 첨자가 좌우로 나옵니다. @VfVV는 아래쪽 화살표의 왼쪽에, @VVfV는 오른쪽에 f를 놓습니다.
| 철자 | 의미 |
|---|---|
@>>> | 오른쪽 화살표 |
@<<< | 왼쪽 화살표 |
@VVV | 아래쪽 화살표(V는 vertical) |
@AAA | 위쪽 화살표(A를 위로 향한 화살촉으로 봄) |
@>f>> | 오른쪽 화살표 위에 f(위 첨자 자리) |
@>>g> | 오른쪽 화살표 아래에 g(아래 첨자 자리) |
@>f>g> | 위에 f, 아래에 g |
@VfVV | 아래쪽 화살표 왼쪽에 f |
@VVfV | 아래쪽 화살표 오른쪽에 f |
@= | 가로 이중선(등호) |
@| | 세로 이중선(@\vert도 같음) |
@. | 빈 화살표. 화살표가 없는 격자점의 자리를 채움 |
\usepackage{amscd}
\[
\begin{CD}
A @>f>> B \\
@V\alpha VV @VV\beta V \\
C @>>g> D
\end{CD}
\]이것은 tikz-cd 예와 완전히 같은 정사각형입니다. 왼쪽 변에서는 @V\alpha VV가 α를 화살표 왼쪽에 놓고, 오른쪽 변에서는 @VV\beta V가 β를 화살표 오른쪽에 놓아 두 라벨이 정사각형 바깥을 향하도록 맞추었습니다. 아래쪽은 @>>g>이므로 g가 화살표 아래에 옵니다. CD 환경도 수식 모드이므로 tikz-cd와 마찬가지로 별행 수식 안에 넣습니다. 다음은 AMS 매뉴얼에 실린 예로, \End가 \operatorname에 해당하는 연산자 이름으로 정의되어 있다고 가정합니다.
% from the AMS amscd manual; \End must be defined as an operator name
\[
\begin{CD}
S^{{\mathcal{W}}_\Lambda}\otimes T @>j>> T \\
@VVV @VV{\End P}V \\
(S\otimes T)/I @= (Z\otimes T)/J
\end{CD}
\]위 행은 왼쪽 대상에서 오른쪽 T로 가는 화살표를 만들고 위에 j를 얹습니다. 가운데 행은 세로 화살표 둘을 만드는데, 왼쪽 열은 라벨이 없고 오른쪽 열은 화살표 오른쪽에 End P가 붙습니다. 아래 행은 @=로 두 대상을 이중선으로 잇습니다. {\End P}의 중괄호는 여러 토큰으로 된 라벨을 하나의 덩어리로 묶기 위한 것입니다. 그리고 amscd 안에 머무르면서 굵은 화살표, 파선 화살표, 양방향 화살표나 색이 필요해지면 확장 패키지 amscdx(v2.2x, 2019년)가 바로 그것들을 더해 줍니다. 다만 직사각형만 그릴 수 있다는 제한은 그대로 입니다.
tikz-cd와 amscd, 어떻게 나눌까
판단은 거의 한 질문으로 끝납니다. 대각선 화살표가 필요한가? 필요하다면 amscd는 후보에서 빠집니다. 직사각 격자면 충분하다면 의존이 가볍고 적는 양도 짧은 amscd로 족합니다. 아래 목록은 그 한 질문을 조금 더 나눈 것입니다.
- 대각선 화살표나 곡선이 필요 →
tikz-cd.amscd는 수평과 수직뿐이며, 기울이는 것은 번거로운 정도가 아니라 아예 불가능합니다. - 화살촉과 선 모양을 세밀하게 다루고 싶음(단사
hook・tail, 전사two heads, 파선, 이중선) →tikz-cd. - 단순한 직사각형 도식이면 충분하고 의존성을 가볍게 두고 싶음 →
amscd. TikZ를 읽지 않으므로 조판이 빠르고 프리앰블도 짧게 유지됩니다. - 표기 취향:
amscd의@>f>>는 짧지만 독특하고,tikz-cd의\arrow[r, "f"]는 길지만 반년 뒤에 다시 읽어도 뜻이 통합니다. - 출력 경로:
tikz-cd도식은 DVI 뷰어에서 올바르게 표시되지 않습니다. PDF를 바로 내놓는pdflatex,lualatex,xelatex같은 엔진이나 DVI를 PDF・PS로 바꾸는 경로가 전제입니다.amscd에는 이런 제약이 없습니다. - 애초에 도식이 필요한가: 대상이 둘이고 화살표가 하나라면 본문에
amsmath의\xrightarrow{f}를 쓰는 것으로 끝납니다.
마지막으로, 오래된 문서를 이어받았을 때를 위한 주의 두 가지입니다. tikz-cd에는 따옴표 문법이 나오기 전의 형식 \arrow[옵션]{방향}{라벨}(예: \arrow{r}{f})이 하위 호환을 위해 지금도 남아 동작합니다. 또 \rar, \dar, \uar, \lar(그리고 \drar 같은 대각선판) 같은 축약 명령도 있는데, \rar는 곧 \arrow{r}입니다. 새로 쓸 때는 둘 다 피하고 \arrow[r, "f"]로 일관하는 편이 나중의 자신을 돕는 길입니다.