Introduction
이 시리즈의 마지막 글이다. 1편에서 강조했듯이, 인간은 누구나 논문을 작성할 때 실수를 하게 되어 있다. ‘나는 아닐 거야’라는 어리석은 생각을 버리자. 100% 실수한다.
C++이나 Python에서는 하드코딩하지 말라고 그렇게 가르치면서, 왜 LaTeX에서는 하드코딩하는가?
\newcommand는 LaTeX에서 하드코딩을 방지하는 유일하면서도 가장 강력한 무기이다.
이 글에서는 \newcommand를 활용해 human error를 줄이는 구체적인 방법들을 정리하고자 한다.
더 자세한 내용은 내가 정리한 paper-writing-checklist를 참고하면 된다.
왜 \newcommand를 반드시 써야 하는가
실수 예시 1: 변수 표기 불일치
논문을 처음 쓰는 사람들은 ‘다른 형태의 문자 = 다른 변수’라는 개념이 잘 잡혀 있지 않아서, 아래와 같이 같은 변수 k를 서로 다른 표기법으로 쓰는 실수를 빈번히 한다:
\newcommand{\timestep}{k}로 미리 정의해두었으면 이런 실수는 원천 봉쇄된다.
실수 예시 2: \mathbf{} 누락
실제로 MambaGlue를 작성할 때 최종 단계에서 아래와 같이 변수가 vector이기 때문에 \mathbf{}를 해야 하는데 깜빡한 실수가 있었다:
\newcommand{\state}{\mathbf{x}}처럼 미리 정의해두었으면 신경 쓰지 않아도 될 부분인데, 일일이 확인해야 해서 번거로웠다.
영구 박제된 나의 Typo
정신 차리고 쓰면 된다고? 다 내가 아래와 같이 human error를 영구히 박제당한 경험으로 피토하며 얻은 교훈이니 꼭 좀 따라주길…
아래는 i라고 쓰다가 k라고 쓰는 게 더 좋을 거 같다고 생각해 바꾸다가 미처 발견하지 못한 typo이다 (see (6)):
논문에 typo 내면 꽤나 부끄럽다…
1. 수식 변수 매크로
논문에서 수식 변수를 정의할 때, 동일한 변수는 반드시 \newcommand로 한 번만 정의하고 재사용해야 한다.
아래는 KISS-Matcher를 작성할 때 실제로 사용한 매크로들이다:
\newcommand{\corr}{\mathcal{A}}
\newcommand{\estoutliers}{\hat{\mathcal{O}}}
\newcommand{\srccloud}{\mathcal{P}}
\newcommand{\tgtcloud}{\mathcal{Q}}
\newcommand{\srcpoint}{\boldsymbol{a}}
\newcommand{\tgtpoint}{\boldsymbol{b}}
\newcommand{\srcidx}{i}
\newcommand{\tgtidx}{j}
\newcommand{\corridx}{k}
\newcommand{\srcpt}{\srcpoint_\srcidx}
\newcommand{\tgtpt}{\tgtpoint_\tgtidx}
이렇게 정의해두면 본문에서는 다음과 같이 작성할 수 있다:
Our objective is to align two unordered voxelized point clouds with a voxel size $v$,
namely the source~$\srccloud$ and target~$\tgtcloud$ point clouds.
Formally, let us assume that the $\corridx$-th pair obtained through matching
consists of the 3D point $\srcpt \in \srccloud$ and the 3D point $\tgtpt \in \tgtcloud$.
이렇게 쓰면:
\srccloud를\mathcal{P}에서\mathcal{S}로 바꾸고 싶을 때,shortcuts.tex에서 딱 한 줄만 수정하면 논문 전체에 반영된다.\srcpt처럼 매크로를 조합해서 정의할 수도 있어서, subscript까지 일관되게 관리된다.- final proofreading 단계에서 논문 내의 모든 동일한 변수를 손쉽게, 실수 없이 바꿀 수 있다.
2. Method Name 매크로
논문에서 제안하는 method 이름은 반드시 매크로로 정의해야 한다. 논문을 쓰다 보면 method 이름을 바꾸는 경우가 빈번하기 때문이다.
% shortcuts.tex
\newcommand{\methodname}{FooNet\xspace}
여기서 \xspace가 중요하다.
\xspace는 매크로 뒤에 적절한 spacing을 자동으로 넣어주는 패키지이다.
이게 없으면 \methodname achieves가 “FooNetachieves”처럼 붙어버린다.
% 하드코딩 (잘못된 예시)
FooNet achieves state-of-the-art performance. % 나중에 이름 바꾸면?
Foonet is designed for... % 어라, 대소문자가 달라졌네?
FooNET outperforms... % 또 다르네...
% 매크로 (올바른 예시)
\methodname achieves state-of-the-art performance. % 한 곳만 바꾸면 전부 반영
\methodname is designed for... % 항상 일관된 표기
\methodname outperforms... % 실수할 여지가 없음
실제로 논문을 쓰면서 method 이름을 최종적으로 결정하기까지 2-3번 바꾸는 경우가 흔하다.
매크로 없이 하드코딩했다면 Ctrl+H로 전체 치환해야 하는데, 이 과정에서 대소문자 불일치나 치환 누락이 발생하기 십상이다.
3. \ie, \eg 매크로
논문에서 i.e.,와 e.g.,를 수동으로 치면 높은 확률로 comma를 빠뜨린다.
이 두 표현은 반드시 매크로로 정의해서 사용해야 한다:
% shortcuts.tex에 추가
\newcommand{\ie}{i.e.,\xspace}
\newcommand{\eg}{e.g.,\xspace}
% 잘못된 예시
i.e. the result shows... % comma 누락 + 매크로 미사용
i.e., the result shows... % 맞지만, 매크로로 통일해야 함
% 올바른 예시
\ie the result shows... % 매크로가 comma와 spacing 모두 처리
\eg KITTI dataset % 일관된 포맷
사소해 보이지만, reviewer 입장에서 i.e.와 i.e.,가 논문 내에서 혼용되어 있으면 proofreading을 제대로 안 했다는 인상을 준다.
매크로 하나면 이런 걱정이 사라진다.
4. \etalcite 매크로
논문에서 다른 연구자의 work를 인용할 때, citation을 명사로 사용하면 안 된다. 이건 내가 만든 paper-writing-checklist에서도 강조한 내용이다:
% 잘못된 예시
[5] proposed BLABLA. % citation 번호가 주어의 역할
BLABLA was proposed in [5]. % passive voice로 저자를 숨김
% 올바른 예시
Lim~\etalcite{lim2023} propose BLABLA. % 저자를 주어로, 동사는 복수형
이를 위해 \etalcite 매크로를 정의하자:
% shortcuts.tex에 추가
\newcommand{\etalcite}[1]{et al.~\cite{#1}}
사용할 때 주의점:
- 저자 이름과
\etalcite사이에 non-breaking space~를 넣어야 한다:Lim~\etalcite{lim2023} et al.은 ‘여러 명’이라는 뜻이므로, 뒤에 오는 동사는 반드시 복수형이다:propose(O),proposes(X)
5. Subscript 매크로
수식에서 같은 subscript가 여러 곳에 반복되면, 이것도 매크로로 빼야 한다.
% 하드코딩 (잘못된 예시)
$\mathbf{p}_{\text{pred}}$ % 여기서는 \text{}
$\mathbf{q}_{\mathrm{pred}}$ % 여기서는 \mathrm{} ← 불일치!
$\mathbf{r}_{\text{GT}}$ % 대문자
$\mathbf{s}_{\mathrm{gt}}$ % 소문자 ← 불일치!
% 매크로 (올바른 예시)
\newcommand{\subPred}{\mathrm{pred}}
\newcommand{\subGT}{\mathrm{GT}}
$\mathbf{p}_{\subPred}$ % 항상 일관
$\mathbf{q}_{\subPred}$ % 항상 일관
$\mathbf{r}_{\subGT}$ % 항상 일관
특히 \text{}와 \mathrm{}가 혼용되는 경우가 정말 흔한데, 매크로로 정의해두면 이런 불일치가 원천적으로 방지된다.
Bonus: Claude Code로 자동 검출하기
위에서 다룬 모든 패턴들 – method name 하드코딩, \xspace 누락, bare i.e./e.g., citation-as-noun, subscript 불일치 등 –을 자동으로 검출할 수 있는 프롬프트를 만들어두었다.
awesome-claudecode-paper-proofreading 레포에서 두 가지 프롬프트를 제공한다:
- LaTeX Workspace Review (
01_latex_workspace_review.md): 매크로 안전성, 패키지 충돌, label 규칙, citation 무결성 등 LaTeX 인프라 수준의 검사 - Paper Proofreading (
02_paper_proofreading.md): 문법, 과장 표현, notation 일관성, caption 완결성 등 논문 내용 수준의 검사
사용법은 간단하다. 논문 workspace에서 Claude Code를 실행한 후:
@~/awesome-claudecode-paper-proofreading/prompts/01_latex_workspace_review.md
@main.tex @shortcuts.tex
이렇게 하면 이 글에서 다룬 \newcommand 관련 문제들을 포함해, submission 전에 놓치기 쉬운 human error들을 체계적으로 잡아준다.
100편 이상의 논문을 리뷰한 경험을 프롬프트에 녹여두었으니 믿고 써도 된다.
정리
| 매크로 | 용도 | 효과 |
|---|---|---|
\newcommand{\srccloud}{\mathcal{P}} |
수식 변수 | 표기 일관성, 일괄 변경 가능 |
\newcommand{\methodname}{FooNet\xspace} |
Method 이름 | 이름 변경 시 한 곳만 수정 |
\newcommand{\ie}{i.e.,\xspace} |
약어 | Comma 누락 방지 |
\newcommand{\etalcite}[1]{et al.~\cite{#1}} |
인용 | Citation-as-noun 방지 |
\newcommand{\subPred}{\mathrm{pred}} |
Subscript | \text vs \mathrm 불일치 방지 |
LaTeX에서 같은 것을 두 번 이상 타이핑하고 있다면, 그건 매크로로 빼야 한다는 신호이다.
C++에서 매직 넘버를 상수로 빼듯이, LaTeX에서도 반복되는 표현은 \newcommand로 빼자.
이 시리즈에서 다룬 내용들을 간단히 정리하면:
- Overleaf 탈출: IDE 환경에서 LaTeX을 코드처럼 관리하자
- 한 줄에 한 문장: Git diff, 협업, latexdiff 모두에서 이점
- \newcommand 활용: Human error를 원천 봉쇄하는 가장 확실한 방법
이 세 가지만 실천해도 논문 작성의 효율성과 품질이 눈에 띄게 달라질 것이다. 더 자세한 checklist는 paper-writing-checklist를, 자동 proofreading은 awesome-claudecode-paper-proofreading을 참고하면 된다.
LaTex을 통한 심화 논문 작성법 시리즈입니다.