“그림 3을 보라”, “식 (2)로부터”, “2페이지 참조”처럼 번호와 페이지를 손으로 쓰면, 그림이나 절 하나만 옮겨도 모두 어긋납니다. LaTeX에는 이름표를 붙이고 번호는 기계가 세게 하는 장치가 있습니다. 핵심인 \label과 \ref/\pageref에서 시작해 amsmath의 \eqref, hyperref의 \autoref와 \nameref, 그리고 varioref와 cleveref까지, 모든 참조를 자동으로 올바르게 유지하는 도구를 차례로 살펴봅니다.
핵심 구조 — \label과 \ref
상호 참조의 토대는 단 두 명령입니다. \label{key} 는 그 지점에서 가장 최근에 증가한 카운터 의 값에 key라는 이름표를 묶습니다. \ref{key} 는 그 이름표가 가리키는 번호 를 본문에 넣습니다. 번호 자체는 LaTeX가 세므로 사용자는 번호를 전혀 쓰지 않습니다. key는 자유롭게 붙이는 문자열이며, 소스 안에서 그림, 식, 절을 가리키는 “별명”이 됩니다.
핵심은 “가장 최근에 증가한 카운터”라는 점입니다. \label이 무엇을 잡는지는 어디에 두는지 로 결정됩니다. 그림이나 표라면 \caption 바로 뒤 에 둡니다. 카운터를 올리는 것이 \caption이기 때문입니다. \begin{figure} 바로 뒤에 두면 장 번호 등을 잡을 수 있습니다. 수식이라면 equation 환경 안, 제목이라면 \section 등 바로 뒤 입니다. 번호를 만들어 내는 명령 바로 뒤에 둔다고 기억하세요.
\section{はじめに}
\label{sec:intro}
\begin{equation}
\label{eq:euler}
e^{i\pi} + 1 = 0
\end{equation}
\begin{figure}
\centering
\includegraphics{leaf}
\caption{葉脈の構造}
\label{fig:leaf}
\end{figure}
第\ref{sec:intro}節で述べたように、式~\ref{eq:euler}と図~\ref{fig:leaf}を参照する。\ref는 번호만 돌려주므로 “그림”, “식”, “절” 같은 말은 직접 써야 합니다. 번호 바로 앞은 줄바꿈 때문에 말과 번호가 떨어지지 않도록 보통 공백이 아니라 묶음 공백 ~ 로 잇는 것이 관례입니다. 예를 들어 Figure~\ref{fig:leaf}처럼 씁니다. 이런 말을 손으로 쓰는 번거로움과 종류를 잘못 적을 위험을 없애 주는 것이 아래의 \autoref와 \cref입니다.
왜 두 번 컴파일하는가
상호 참조는 한 번의 컴파일로 확정되지 않습니다. LaTeX는 \label을 만날 때마다 그 번호와 페이지를 .aux 파일(문서와 같은 기본 이름의 보조 파일)에 씁니다. \ref가 사용할 수 있는 것은 *이전* 실행에서 .aux에 기록된 정보입니다. 따라서 첫 번째 처리에서는 참조 대상 번호를 아직 알 수 없어 출력에 굵은 ?? 가 나타나고 로그에는 다음 경고가 남습니다.
LaTeX Warning: Label(s) may have changed. Rerun to get cross references right.한 번 더 컴파일하면 .aux의 값이 다시 읽혀 ??가 올바른 번호로 바뀝니다. 번호가 앞뒤로 밀려 참조값이 바뀌면 이 경고가 다시 나오므로 경고가 사라질 때까지 반복합니다. 실제로는 두 번이면 충분합니다. latexmk 같은 빌드 도구는 이 반복을 자동으로 수행하고, Overleaf는 뒤에서 여러 번 처리하므로 그곳에서는 ??를 거의 보지 않습니다.
페이지 참조와 이름 붙이기
번호가 아니라 페이지 를 가리키고 싶을 때는 \pageref{key} 를 사용합니다. \ref와 같은 이름표를 받아 그 \label이 놓인 페이지 번호 를 돌려줍니다. 이렇게 하면 “see Figure 3 on page 12”처럼 번호와 페이지를 함께 인용할 수 있습니다. 예: Figure~\ref{fig:leaf} on page~\pageref{fig:leaf}.
key는 무엇이든 가능하지만, 종류를 나타내는 접두사 를 붙이는 방식이 널리 쓰입니다. sec:(절), fig:(그림), tab:(표), eq:(식), ch:(장), lst:(코드 목록) 등입니다. 장점은 두 가지입니다. fig:leaf처럼 의미로 이름 붙이면 그림 순서를 바꿔도 라벨 이름을 다시 붙일 필요가 없습니다. 또 \ref{fig:...}만 봐도 참조 대상의 종류를 알 수 있고, 캡션용 이름과 목록용 이름이 충돌하는 것도 막을 수 있습니다.
| 접두사 | 대상 |
|---|---|
ch: | 장 |
sec: | 절과 소절 |
fig: | 그림 |
tab: | 표 |
eq: | 수식 |
lst: | 코드 목록 |
수식 참조 — \eqref(amsmath)
수식 번호는 관례상 괄호를 붙여 씁니다. 예를 들어 “식 (3)으로부터”처럼 말입니다. 기본 \ref는 3만 돌려주므로 괄호를 손으로 더해야 하지만, amsmath를 읽으면 사용할 수 있는 \eqref{key} 는 괄호를 보충해 (3)을 돌려줍니다. 게다가 괄호는 주변 글꼴과 상관없이 항상 직립체 로 조판되므로 이탤릭 문장 안에서도 괄호만 기울어질 걱정이 없습니다. 수식 참조에는 \ref보다 \eqref가 편리합니다.
\usepackage{amsmath}
% ...
式~\eqref{eq:euler}はオイラーの等式である。
% 出力: 式 (1) はオイラーの等式である。hyperref 확장 — \autoref와 \nameref
hyperref 를 읽으면 모든 참조가 PDF 안에서 클릭 가능한 링크가 되고, 편리한 참조 명령 두 가지가 추가됩니다. \autoref{key} 는 참조 대상의 종류에 따라 “Figure”, “section” 같은 말을 자동으로 앞에 붙이고 전체를 링크로 만듭니다. 절이면 “section 3.4”, 그림이면 “Figure 3”이 됩니다. 따라서 Figure~\ref{...}에서 “Figure”를 손으로 쓰는 수고와 잘못 적을 위험이 사라집니다. 앞에 붙는 말은 \figureautorefname, \sectionautorefname 등을 재정의하여 바꿀 수 있으며, 현지화도 이 방식으로 합니다.
다른 하나인 \nameref{key} 는 번호가 아니라 참조 대상의 제목 문자열 자체 를 삽입합니다. \section{Introduction}에 붙인 라벨을 \nameref로 참조하면 “Introduction”이라는 제목문 이 나옵니다. “Introduction에서 논의한 것처럼”처럼 번호가 아니라 제목으로 참조하고 싶을 때 사용합니다.
\usepackage{hyperref}
% ...
\autoref{fig:leaf}を参照。 % 出力: Figure 3 を参照。(リンク付き)
\nameref{sec:intro}で述べた。 % 出力: はじめに で述べた。페이지를 고려한 참조 — varioref
제본된 문서에서는 가까운 대상이라면 “다음 페이지의 그림”, 같은 펼침면이라면 “마주 보는 페이지의 그림”이라고 쓰는 편이 “N페이지의 그림”이라고 기계적으로 쓰는 것보다 자연스럽습니다. varioref의 \vref{key} 는 \ref처럼 번호를 출력하면서 참조 대상이 다른 페이지에 있는지 확인 하고, “on the next page”, “on the facing page”, “on page 5” 같은 페이지 안내 문구를 자동으로 덧붙입니다. 같은 페이지라면 아무것도 더하지 않습니다.
페이지 안내만 원할 때는 \vpageref{key} 를 사용합니다. 번호는 내지 않고 “on the next page” 같은 말만 냅니다. \vpageref에는 두 개의 선택 인수가 있어 첫 번째는 같은 페이지에 있을 때의 문구, 두 번째는 다른 페이지일 때의 앞말을 지정합니다. 참조와 대상이 가까워 페이지 나눔으로 갈릴지 애매할 때 유용합니다. 출력이 페이지 위치에 따라 동적으로 바뀌므로 varioref는 보통 추가 컴파일이 필요할 수 있습니다.
\usepackage{varioref}
% ...
See~\vref{fig:leaf}.
% 同ページ: See figure 3.
% 別ページ: See figure 3 on the next page. / ... on page 12.똑똑한 참조 — cleveref(\cref / \Cref)
cleveref 는 참조를 한 단계 끌어올립니다. \cref{key} 는 \autoref처럼 종류의 말을 자동으로 앞에 붙입니다. 기본값은 “fig. 1”이고, noabbrev 옵션을 쓰면 “figure 1”입니다. 하지만 진짜 강점은 여러 참조와 범위 참조 입니다. \cref{a,b,c}처럼 공백 없이 쉼표로 구분해 라벨을 넘기면 번호를 자동으로 정렬하고 압축 하여 “figures 1, 2 and 3” 또는 “equations~(2) and~(4)”처럼 출력하고, 단수/복수까지 맞춥니다. 연속 범위는 \crefrange{first}{last} 로 “figures 1 to 3”처럼 줄어듭니다.
문장 앞에서는 단어를 대문자로 시작하고 싶으므로 \Cref{key}(첫 글자 대문자)를 사용합니다. “Figure 3 shows …”처럼 문장을 시작할 때 쓰고, 문장 중간에서는 소문자 \cref를 씁니다. 문서 전체에서 항상 대문자로 하고 싶다면 capitalise 옵션으로 읽습니다. 앞에 붙는 말은 \crefname{type}{단수}{복수} 로 정의하거나 바꿀 수 있고, 첫 글자 대문자 버전은 \Crefname입니다. 이를 통해 일본어 등으로 현지화 도 합니다. 예: \crefname{figure}{図}{図}. 기본 \ref처럼 번호만 내고 싶을 때는 \labelcref{key} 를 씁니다.
읽는 순서가 결정적으로 중요 합니다. cleveref는 반드시 마지막, hyperref 뒤 에 읽어야 합니다. varioref도 함께 쓴다면 varioref → hyperref → cleveref 순서로 둡니다. 순서를 틀리면 로그에 경고도 없이 참조가 전혀 다른 대상을 가리킬 수 있습니다.
\usepackage{varioref}
\usepackage{hyperref}
\usepackage{cleveref} % 必ず最後に / always last
% ...
\cref{fig:a,fig:b,fig:c} % figures 1 to 3
\cref{eq:euler,eq:max} % equations (1) and (4)
\Cref{sec:intro} discusses % Section 1 discusses ...무엇을 쓸지 망설여진다면 문서 전체를 cleveref로 통일하는 것을 권합니다. 종류의 말, 단수/복수, 여러 참조, 범위를 모두 자동으로 처리하므로 Figure~\ref{...} 방식에서 생길 수 있는 실수, 예를 들어 “Figure”라고 써야 할 곳에 “Table”이라고 쓰는 일이 일어나지 않습니다.
| 명령 | 출력 |
|---|---|
\label{key} | 가장 최근 카운터에 이름표를 붙임(출력 없음) |
\ref{key} | 번호만(예: 3) |
\pageref{key} | 그 이름표가 있는 페이지 번호 |
\eqref{key} | 괄호 있는 수식 번호(예: (3)) / amsmath |
\autoref{key} | 종류 말 + 번호 + 링크(예: Figure 3) / hyperref |
\nameref{key} | 대상 제목 문자열 / hyperref |
\vref{key} | 번호 + 페이지 안내(다음 페이지 등) / varioref |
\cref{key} | 종류 말 + 번호, 목록/범위 자동 처리 / cleveref |
\Cref{key} | 문장 시작용 대문자 \cref / cleveref |
\crefrange{a}{b} | 연속 범위 참조(예: figures 1 to 3) / cleveref |