Introduction
로컬에서 LaTeX으로 논문을 작성하기 시작하면 생각보다 빨리 마주치는 귀찮음이 있다. 바로 compile 명령어를 여러 번 직접 돌려야 한다는 것이다.
예를 들어 citation과 reference가 있는 논문을 build할 때, 아래처럼 명령어를 반복해서 치는 경우가 많다.
pdflatex root.tex
bibtex root
pdflatex root.tex
pdflatex root.tex
처음에는 “뭐 이 정도야” 싶다.
하지만 논문을 하루 종일 쓰면서 figure 번호가 바뀌고, citation을 추가하고, section 제목을 고치고, table을 옮기다 보면 이게 꽤나 귀찮아진다.
심지어 언제 bibtex를 다시 돌려야 하는지, pdflatex를 두 번 돌리면 되는지 세 번 돌려야 하는지 헷갈릴 때도 있다.
이 귀찮음을 해결해주는 도구가 바로 latexmk이다.
결론부터 말하면, 위의 네 줄은 아래 한 줄로 바꿀 수 있다.
latexmk -pdf root.tex
이게 끝이다. 진짜로.
왜 LaTeX은 여러 번 compile해야 하는가
먼저 왜 pdflatex를 한 번만 돌리면 안 되는지부터 이해해야 한다.
LaTeX 논문에는 보통 다음과 같은 것들이 들어간다.
\cite{}로 넣은 citation\ref{}와\label{}로 연결한 figure, table, equation 번호\tableofcontents같은 목차- BibTeX 또는 Biber로 관리하는 bibliography
문제는 LaTeX이 이 정보를 한 번에 전부 알 수 없다는 것이다.
첫 번째 pdflatex는 “논문 안에 어떤 citation과 reference가 있는지”를 .aux 파일에 기록한다.
그 다음 bibtex root는 .aux 파일을 읽고 bibliography 결과인 .bbl 파일을 만든다.
그 후 다시 pdflatex를 돌려야 citation 번호와 reference 번호가 PDF에 들어간다.
마지막으로 번호나 목차가 안정화되도록 한 번 더 pdflatex를 돌리는 경우가 많다.
그래서 전통적인 명령어가 아래처럼 생긴 것이다.
pdflatex root.tex
bibtex root
pdflatex root.tex
pdflatex root.tex
여기서 root.tex는 논문의 main 파일이라고 생각하면 된다.
어떤 사람은 main.tex, 어떤 사람은 paper.tex, 어떤 사람은 root.tex라고 부른다.
중요한 것은 \documentclass가 들어있는 최상위 파일이라는 점이다.
latexmk란 무엇인가
latexmk는 LaTeX 문서를 build해주는 자동화 도구이다.
조금 더 쉽게 말하면, latexmk는 LaTeX 전용 build manager이다.
사용자가 pdflatex를 몇 번 돌릴지, bibtex를 돌려야 하는지, reference가 아직 덜 맞았는지를 직접 판단하지 않아도 된다.
latexmk가 log와 aux 파일을 보고 필요한 명령어를 알아서 실행한다.
사용법은 매우 단순하다.
latexmk -pdf root.tex
이 명령어를 실행하면 latexmk가 내부적으로 필요한 만큼 pdflatex, bibtex, 또는 biber를 실행해서 최종 root.pdf를 만들어준다.
즉, 사람이 하던 반복 작업을 latexmk가 대신 해주는 것이다.
LaTeX 자체를 바꾸는 도구가 아니라, LaTeX build 과정을 자동화해주는 도구라고 이해하면 된다.
설치 확인
TeX Live나 MacTeX를 설치했다면 이미 latexmk가 들어있을 가능성이 높다.
먼저 terminal에서 아래 명령어를 쳐보자.
latexmk --version
버전 정보가 뜨면 이미 설치된 것이다.
Ubuntu에서 설치되어 있지 않다면 아래처럼 설치하면 된다.
sudo apt install latexmk
설치 후 다시 확인한다.
latexmk --version
기본 사용법
1. PDF 만들기
가장 많이 쓰는 명령어는 이것이다.
latexmk -pdf root.tex
이 명령어는 root.tex를 입력으로 받아 root.pdf를 만든다.
기존에 수동으로 치던 아래 명령어들을 대체한다고 생각하면 된다.
pdflatex root.tex
bibtex root
pdflatex root.tex
pdflatex root.tex
논문에 citation이 없으면 bibtex를 굳이 돌리지 않는다.
reference가 이미 안정화되어 있으면 불필요하게 여러 번 compile하지 않는다.
이게 latexmk의 핵심이다.
2. XeLaTeX 또는 LuaLaTeX 쓰기
일반적인 IEEE 논문 template은 보통 pdflatex로 충분하다.
하지만 한글, system font, fontspec 등을 써야 해서 XeLaTeX이나 LuaLaTeX을 쓰는 경우도 있다.
그럴 때는 아래처럼 실행하면 된다.
latexmk -xelatex root.tex
또는
latexmk -lualatex root.tex
즉, 내가 쓰는 LaTeX engine에 맞춰 옵션만 바꾸면 된다.
3. 계속 감시하면서 자동 build하기
논문을 쓰는 동안 매번 terminal에 가서 build 명령어를 치는 것도 귀찮다.
이럴 때는 -pvc 옵션을 쓰면 된다.
latexmk -pdf -pvc root.tex
-pvc는 preview continuously의 약자이다.
이 명령어를 켜두면 root.tex나 sections/introduction.tex 같은 관련 파일이 저장될 때마다 자동으로 다시 build한다.
즉, 한쪽에는 editor를 열고, 다른 한쪽에는 PDF viewer를 열어둔 다음, terminal에서는 아래 명령어를 켜두면 된다.
latexmk -pdf -pvc root.tex
그 상태에서 논문을 수정하고 저장하면 PDF가 자동으로 갱신된다.
멈추고 싶으면 terminal에서 Ctrl+C를 누르면 된다.
이 기능은 로컬에서 논문을 쓸 때 체감이 매우 크다. Overleaf에서 compile 버튼 누르고 기다리던 workflow와 비교하면 훨씬 빠르고 편하다.
4. 임시 파일 지우기
LaTeX을 build하면 디렉토리에 이런 파일들이 우르르 생긴다.
root.aux
root.bbl
root.blg
root.fdb_latexmk
root.fls
root.log
root.out
root.synctex.gz
이 파일들은 대부분 다시 만들 수 있는 generated file이다. 논문 소스와 figure만 보고 싶을 때는 지저분하게 느껴진다.
이때는 아래 명령어를 쓰면 된다.
latexmk -c root.tex
-c는 auxiliary file을 지워준다.
중요한 점은 PDF는 남겨둔다는 것이다.
PDF까지 포함해서 build 결과물을 전부 지우고 싶다면 대문자 -C를 쓴다.
latexmk -C root.tex
arXiv에 논문 제출 전에는 개인적으로 아래 순서를 추천한다.
latexmk -C root.tex
latexmk -pdf root.tex
latexmk -c root.tex
첫 번째 줄에서 이전 build 결과물을 싹 지운다. 두 번째 줄에서 깨끗한 상태로 다시 build한다. 세 번째 줄에서 PDF는 남기고 auxiliary file만 정리한다.
latexmk가 특히 유용한 상황
1. Citation을 자주 추가할 때
논문을 쓰다 보면 refs.bib에 reference를 추가하고 본문에 \cite{}를 넣는 일이 많다.
수동 build를 하면 bibtex를 다시 돌려야 하는지 매번 신경 써야 한다.
pdflatex root.tex
bibtex root
pdflatex root.tex
pdflatex root.tex
latexmk를 쓰면 그냥 이 한 줄이면 된다.
latexmk -pdf root.tex
Citation이 바뀌었으면 알아서 bibliography를 다시 만든다.
2. Figure, table, equation 번호가 자주 바뀔 때
논문을 쓰다 보면 figure 순서를 바꾸거나 equation을 추가하면서 번호가 계속 바뀐다.
이때 LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right. 같은 warning을 본 적이 있을 것이다.
수동으로 build하면 이 warning을 보고 pdflatex를 한 번 더 돌려야 한다.
가끔은 두 번 더 돌려야 한다.
latexmk는 이런 warning을 보고 필요한 만큼 다시 compile한다.
그래서 사용자는 그냥 아래 명령어만 기억하면 된다.
latexmk -pdf root.tex
3. 로컬 IDE와 같이 쓸 때
이 시리즈에서 계속 강조했듯이, LaTeX은 코드처럼 다뤄야 한다. VSCode, Pycharm의 TeXiFy, vimtex 같은 도구를 쓰면 file navigation, 전체 검색, Git diff를 자연스럽게 활용할 수 있다.
여기에 latexmk를 붙이면 build까지 자동화된다.
많은 LaTeX editor나 plugin은 내부적으로도 latexmk를 recipe로 등록해서 사용할 수 있다.
즉, latexmk는 terminal에서 직접 써도 좋고, editor의 build command로 등록해도 좋다.
개인적으로는 terminal에서 아래 명령어를 켜두고 논문을 쓰는 방식이 가장 단순하다고 생각한다.
latexmk -pdf -pvc root.tex
Git을 쓴다면 generated file은 commit하지 말자
latexmk를 쓰면 .fdb_latexmk, .fls 같은 파일이 추가로 생긴다.
이 파일들은 latexmk가 “지난번 build에서 어떤 파일을 봤는지” 기억하기 위해 사용하는 파일이다.
논문 소스가 아니라 build 과정에서 생기는 파일이므로 Git에 넣을 필요가 없다.
보통 .gitignore에는 아래 정도를 넣어두면 된다.
*.aux
*.bbl
*.blg
*.fdb_latexmk
*.fls
*.log
*.out
*.synctex.gz
물론 학회나 저널 submission에서 .bbl 파일을 요구하는 경우가 있다.
그때는 최종 제출용으로만 .bbl을 따로 포함하면 된다.
평소 논문 소스 관리에서는 generated file을 최대한 Git에서 빼는 것이 깔끔하다.
정리
수동 build workflow는 아래와 같다.
pdflatex root.tex
bibtex root
pdflatex root.tex
pdflatex root.tex
latexmk를 쓰면 아래 한 줄이면 된다.
latexmk -pdf root.tex
자주 쓰는 명령어만 정리하면 다음과 같다.
| 명령어 | 의미 |
|---|---|
latexmk -pdf root.tex |
PDF build |
latexmk -xelatex root.tex |
XeLaTeX으로 build |
latexmk -lualatex root.tex |
LuaLaTeX으로 build |
latexmk -pdf -pvc root.tex |
파일 저장 시 자동 build |
latexmk -c root.tex |
PDF는 남기고 auxiliary file 삭제 |
latexmk -C root.tex |
PDF까지 포함해서 generated file 삭제 |
LaTeX을 로컬에서 쓴다면 latexmk는 거의 필수에 가깝다.
대단히 어려운 도구가 아니라, 귀찮은 반복 compile을 대신해주는 실용적인 도구이다.
논문 작성에서 중요한 것은 내용에 집중하는 것이다.
pdflatex를 몇 번 돌려야 하는지 고민하는 일은 사람이 할 일이 아니다.
그런 반복 작업은 latexmk에게 맡기고, 우리는 논문을 더 잘 쓰는 데 시간을 쓰자.
LaTex을 통한 심화 논문 작성법 시리즈입니다.