Introduction

이 시리즈의 마지막 글이다. 1편에서 강조했듯이, 인간은 누구나 논문을 작성할 때 실수를 하게 되어 있다. ‘나는 아닐 거야’라는 어리석은 생각을 버리자. 100% 실수한다.

C++이나 Python에서는 하드코딩하지 말라고 그렇게 가르치면서, 왜 LaTeX에서는 하드코딩하는가? \newcommand는 LaTeX에서 하드코딩을 방지하는 유일하면서도 가장 강력한 무기이다.

이 글에서는 \newcommand를 활용해 human error를 줄이는 구체적인 방법들을 정리하고자 한다. 더 자세한 내용은 내가 정리한 paper-writing-checklist를 참고하면 된다.


왜 \newcommand를 반드시 써야 하는가

실수 예시 1: 변수 표기 불일치

논문을 처음 쓰는 사람들은 ‘다른 형태의 문자 = 다른 변수’라는 개념이 잘 잡혀 있지 않아서, 아래와 같이 같은 변수 k를 서로 다른 표기법으로 쓰는 실수를 빈번히 한다:

wrong_ks

\newcommand{\timestep}{k}로 미리 정의해두었으면 이런 실수는 원천 봉쇄된다.

실수 예시 2: \mathbf{} 누락

실제로 MambaGlue를 작성할 때 최종 단계에서 아래와 같이 변수가 vector이기 때문에 \mathbf{}를 해야 하는데 깜빡한 실수가 있었다:

image

\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 레포에서 두 가지 프롬프트를 제공한다:

  1. LaTeX Workspace Review (01_latex_workspace_review.md): 매크로 안전성, 패키지 충돌, label 규칙, citation 무결성 등 LaTeX 인프라 수준의 검사
  2. 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을 통한 심화 논문 작성법 시리즈입니다.

  1. LaTex을 통한 심화 논문 작성법 - 1. Introduction
  2. LaTex을 통한 심화 논문 작성법 - 2. Fxxking Overleaf! Overleaf 사용 반대하는 이유
  3. LaTex을 통한 심화 논문 작성법 - 3. 한 줄에 한 문장씩
  4. LaTex을 통한 심화 논문 작성법 - 4. newcommand 활용하기