이력서와 CV는 읽는 사람이 내용을 읽기도 전에 겉모습으로 판단해 버리는, 몇 안 되는 문서 가운데 하나입니다. 그럼에도 LaTeX으로 쓰는 이유는 “예쁘게 나와서”가 아닙니다. 작년 이력서가 올해도 그대로 컴파일되고, 지원처마다 바꾼 부분이 git의 차이로 남는다는 점 때문입니다. 그런데 이 분야는 인터넷의 조언이 가장 빨리 낡는 구석이기도 합니다. “정석”으로 흔히 거론되는 클래스 가운데 몇 가지는 TeX Live 2024에 아예 들어 있지 않고, 들어 있는 것 중에도 첫 컴파일부터 오류를 내는 것이 있습니다. 이 페이지는 TeX Live 2024에서 실제로 동작하는 것만을 kpsewhich와 직접 컴파일로 확인해 정리합니다. 후반부는 편지입니다. 표준 letter 클래스, KOMA-Script의 scrlttr2, 그리고 일본어 편지입니다.
TeX Live 2024에 들어 있는 CV 클래스와 들어 있지 않은 클래스
결론부터 말하면 moderncv, europecv, europasscv, currvita, komacv, limecv는 TeX Live 2024에 들어 있습니다. 그러나 블로그 글이나 Overleaf 템플릿 소개에서 가장 자주 거론되는 altacv와 awesome-cv는 들어 있지 않습니다. 로컬에서 \documentclass{altacv}라고 쓰면 ! LaTeX Error: File 'altacv.cls' not found.로 멈춥니다(awesome-cv도 같은 문구입니다). 두 클래스는 CTAN이 아니라 GitHub와 Overleaf 템플릿 저장소에서 배포되므로, 쓰려면 저장소를 통째로 받아 .cls를 자기 문서와 같은 디렉터리에 두는 수밖에 없습니다. Overleaf에서 만든 이력서를 로컬에서 다시 조판하려 할 때 가장 먼저 걸리는 함정이 대개 이것입니다. 먼저 kpsewhich altacv.cls를 실행해 아무것도 나오지 않으면 설치되어 있지 않은 것입니다.
| 클래스 / 패키지 | TeX Live 2024 | 무엇을 주는가 |
|---|---|---|
moderncv | 있음 (v2.3.1) | 5가지 스타일, 7가지 색, 이력서와 자기소개서를 한 클래스로 |
europecv | 있음(우회 필요) | EU Europass 형식. 29개 언어의 라벨 정의 포함 |
europasscv | 있음 | Europass 2013년 개정판. README에 2020년 형식은 미구현이라고 명시 |
currvita | 있음 | 클래스가 아니라 패키지. article 위에 cv·cvlist 환경을 더함 |
komacv | 있음 (v1.1.2) | moderncv 풍 외관을 KOMA-Script 위에 다시 구현 |
limecv | 있음 (v0.1.12) | 사이드바가 있는 현대적 레이아웃. 배포판 안에서 altacv에 가장 가까운 답 |
altacv | 없음 | GitHub / Overleaf 배포. kpsewhich altacv.cls는 아무것도 반환하지 않음 |
awesome-cv | 없음 | 위와 같음. ! LaTeX Error: File 'awesome-cv.cls' not found.가 납니다 |
moderncv 사용법 — \moderncvstyle과 \cventry
moderncv의 설계는 “겉모습은 두 줄로 정하고, 나머지는 구조만 쓴다”입니다. \moderncvstyle{...}로 다섯 가지 레이아웃(casual〔기본값〕, classic, banking, oldstyle, fancy) 중 하나를, \moderncvcolor{...}로 일곱 가지 색(blue, black, burgundy, green, grey, orange, purple, red) 중 하나를 고릅니다. TeX Live 2024에 들어 있는 v2.3.1로 다섯 스타일을 모두 pdfLaTeX으로 컴파일해 보니 어느 것도 오류를 내지 않았습니다. 핵심은 \cventry{years}{title}{institution}{location}{grade}{description}의 여섯 인수이며, 비워 둔 {}는 해당 열이 통째로 접힙니다. 한 줄짜리 항목은 \cvitem{header}{text}, 두 개를 나란히 두려면 \cvdoubleitem, 글머리 기호는 \cvlistitem입니다. 구조가 곧 문서이고 스타일은 그 위에 씌우는 껍질입니다. 그래서 지원처에 맞춰 casual을 banking으로 바꿔도 본문은 한 글자도 손댈 필요가 없습니다.
\documentclass[11pt,a4paper,sans]{moderncv}
\moderncvstyle{casual} % casual | classic | banking | oldstyle | fancy
\moderncvcolor{blue}
\usepackage[scale=0.75]{geometry}
\name{Taro}{Yamada}
\title{Software Engineer}
\address{1-1 Chiyoda}{Tokyo}{Japan}
\phone[mobile]{+81~90~0000~0000}
\email{[email protected]}
\begin{document}
\makecvtitle
\section{Experience}
% {years}{title}{institution}{location}{grade}{description}
\cventry{2020--2024}{Engineer}{ABC Inc.}{Tokyo}{}{Web development.}
\cvitem{Skills}{LaTeX, C, Python}
\end{document}moderncv는 버려졌는가 — README가 답합니다
“버려졌다”는 말은 절반만 맞습니다. TeX Live 2024에 함께 들어 있는 README.md가 어느 절반인지 알려 줍니다. 이 배포본은 upstream이 2016년부터 죽어 있기 때문에 CTAN 안에서 moderncv를 살려 두려는 목적의 포크라는 것입니다. 원작자는 Xavier Danaux이며, CHANGELOG의 v2.1.0(2021년 1월 21일) 항목에 “maintainer change: now team maintained”라고 적혀 있어 자원자 팀의 인수가 거기서 시작됩니다. TeX Live 2024에 들어 있는 것은 v2.3.1, 2022년 2월 21일자입니다. 그러니 정확한 표현은 “죽었다”가 아니라 “2016년에 버려졌고 2021년에 입양되었다”이며, TeX Live 2024에서 오류 없이 컴파일됩니다. \social의 서비스 추가와 fontawesome5로의 이행도 이 팀의 작업입니다.
다만 구조된 패키지 특유의 흔적도 남아 있습니다. moderncv에는 매뉴얼이 없습니다. README.md는 “제대로 된 매뉴얼이 쓰일 때까지는” template.tex를 보라고 솔직하게 적어 두었습니다(함께 들어 있는 moderncv_userguide.pdf의 날짜는 여전히 2021년 1월입니다). 그리고 문서 디렉터리에는 KNOWN_BUGS라는 파일이 그대로 놓여 있어, fancy 스타일에서 참고문헌 주위에 생기는 군더더기 여백, bibentry와 함께 쓸 때 나오는 lonely \item--perhaps a missing list environment, CJK와 fancyhdr의 상호작용 같은 알려진 문제를 열거합니다. 이력서에 논문 목록을 실을 예정이라면, 클래스를 정하기 전에 이 파일 하나를 읽어 두는 것이 가장 값싼 조사입니다. 위치는 texdoc -l moderncv로 알 수 있습니다.
europecv의 Sorting rule for 'begindocument' hook applied too late. 고치기
해결책은 한 줄입니다. 프리앰블에 \usepackage{hyperref}(또는 bookmark)를 직접 써 주면 오류가 사라집니다. 원인은 클래스 쪽에 있습니다. europecv.cls는 \AtBeginDocument{...\RequirePackage{hyperref}...} 안에서 hyperref를 불러옵니다. 즉 \begin{document}가 이미 실행되는 도중에 읽어 들이는 것입니다. hyperref가 데려오는 nameref.sty는 \DeclareHookRule{begindocument}{showkeys}{before}{nameref}를 실행하는데, 그때는 이미 begindocument 훅이 돌기 시작한 뒤라 LaTeX 커널이 ! LaTeX hooks Error: Sorting rule for 'begindocument' hook applied too late.를 냅니다. hyperref를 먼저 직접 불러 두면 nameref가 훅 규칙이 아직 유효한 시점에 도착합니다.
% europecv on TeX Live 2024: the class loads hyperref inside \AtBeginDocument,
% so nameref's hook rule arrives too late. Load hyperref yourself first.
\documentclass[a4paper,helvetica]{europecv}
\usepackage{graphicx} % europecv calls \includegraphics but does not load it
\usepackage{hyperref} % <- this line removes the "hook applied too late" error
\ecvname{Yamada, Taro}
\ecvemail{[email protected]}
\begin{document}
\begin{europecv}
\ecvpersonalinfo
\ecvsection{Work experience}
\ecvitem{2020--2024}{Engineer, ABC Inc., Tokyo}
\end{europecv}
\end{document}이것이 초보자의 실수가 아니라 클래스 자체의 결함임은 europecv가 함께 배포하는 예제로 확인할 수 있습니다. doc/latex/europecv/examples/minimal.tex, 곧 공식 최소 예제를 그대로 pdfLaTeX에 넣으면 같은 오류가 납니다. 반면 templates/cv_template_en.tex는 깨끗하게 통과하는데, 유일하게 관련 있는 차이는 그쪽이 \usepackage{bookmark}를 쓰고 있고 bookmark가 hyperref를 먼저 끌어온다는 점입니다. 또한 europecv.cls는 \includegraphics를 호출하면서도 graphicx를 스스로 불러오지 않기 때문에, 로고와 깃발을 켠 상태에서는 ! Undefined control sequence. \draweuropasslogo도 함께 납니다. \usepackage{graphicx}를 추가하거나 클래스 옵션 nologo를 주세요.
Europass 형식 자체에 대해서도, 이름이 비슷한 두 클래스를 혼동하지 마세요. europecv는 2002년에 시작된 유럽 공통 양식의 계보를 구현한 것으로, ecvbg.def부터 ecvsv.def까지 29개 언어의 라벨 정의 파일을 함께 담고 있습니다. europasscv는 2013년에 나온 개정판 레이아웃을 구현한 것이며, 그 README에는 “현재 이 클래스는 2020년에 등장한 최신 europass 레이아웃을 구현하지 않는다”는 경고가 여전히 붙어 있습니다. EU의 양식은 개정되므로, 지원 요건에 “Europass 형식으로”라고 적혀 있다면 상대가 요구하는 것이 어느 판인지부터 확인하는 것이 실무입니다.
표준 letter 클래스 — 파일 하나로 여러 수신자에게
letter 클래스의 진짜 장점은 letter 환경을 쓴 개수만큼 편지가 나온다는 점입니다. 발신자(\address)와 서명(\signature)은 프리앰블에 한 번만 쓰고, \begin{letter}{수신자}를 나란히 늘어놓으면 같은 발신자가 서로 다른 수신자에게 보내는 편지가 한 통에 한 쪽씩 나옵니다. 추천서를 열 명에게 쓰거나 같은 안내문을 서른 곳에 보내는 일이 파일 하나로 끝납니다. 내용은 \opening{인사말}, 본문, \closing{맺음말} 세 부분뿐입니다. 날짜는 \today가 자동으로 넣어 주고, \encl{...}은 encl:로, \cc{...}는 cc:로 인쇄되며, \ps{...}는 추신을 서명 아래에 둡니다. 두 통을 쓰면 두 쪽이 나오는 것은 실제로 컴파일해 보면 확인됩니다.
\documentclass[11pt]{letter}
\address{Taro Yamada\\1-1 Chiyoda\\Tokyo 100-0001}
\signature{Taro Yamada}
\begin{document}
\begin{letter}{Hiring Manager\\ABC Inc.\\Osaka}
\opening{Dear Hiring Manager,}
I am writing to apply for the position.
\closing{Sincerely,}
\encl{CV, transcript} % prints as "encl:"
\cc{Personnel} % prints as "cc:"
\ps{P.S. Available from April.}
\end{letter}
% a second letter, same sender, second page
\begin{letter}{Second Recipient\\XYZ Ltd.}
\opening{Dear Sir or Madam,}
A second letter from the same source file.
\closing{Yours faithfully,}
\end{letter}
\end{document}scrlttr2와 scrletter — 접는 표시와 창봉투
scrlttr2가 표준 letter 클래스와 결정적으로 다른 점은 종이를 접어 봉투에 넣는 데까지 챙겨 준다는 것입니다. 접히는 자리에 옅은 선을 인쇄하고(foldmarks), 수신인 주소를 창 위치에 맞춰 배치합니다. 그 모든 조정은 .lco(letter class option) 파일로 분리되어 있고 \LoadLetterOption{DIN}처럼 불러옵니다. KOMA-Script가 함께 제공하는 .lco에는 DIN, DIN5008A, DIN5008B, DINmtext, NF(프랑스), SN·SNleft(스위스), UScommercial9·UScommercial9DW, 그리고 배치를 눈에 보이게 인쇄해 주는 visualize가 있습니다. 설정은 모두 \setkomavar{fromname}{...} 형식의 변수로 하므로 내용과 체재가 완전히 분리됩니다. 같은 편지를 다른 봉투 규격으로 다시 찍으려면 \LoadLetterOption 한 줄만 바꾸면 됩니다.
또 하나 알아 두면 좋은 것이 scrletter입니다. 이것은 클래스가 아니라 패키지여서, scrartcl이나 scrbook 문서 중간에 letter 환경을 그대로 넣을 수 있습니다. 보고서 부록에 송부장을 붙이거나 계약서 끝에 첨부장을 끼우는 일이 문서를 둘로 나누지 않고 해결됩니다. 실제로 \documentclass{scrartcl}에 \usepackage{scrletter}를 더하고 \section{...} 바로 뒤에 \begin{letter}{...}를 둔 문서는 그대로 통과합니다. scrlttr2와 scrletter는 같은 변수와 같은 .lco를 쓰므로 다시 익힐 것이 없습니다.
\documentclass[fontsize=11pt,foldmarks=true,parskip=half]{scrlttr2}
\LoadLetterOption{DIN} % or NipponEL, KakuLL, UScommercial9, SN, NF ...
\setkomavar{fromname}{Taro Yamada}
\setkomavar{fromaddress}{1-1 Chiyoda\\Tokyo 100-0001}
\setkomavar{signature}{Taro Yamada}
\setkomavar{subject}{Application for the advertised position}
\setkomavar{place}{Tokyo}
\begin{document}
\begin{letter}{Hiring Manager\\ABC Inc.\\Osaka}
\opening{Dear Hiring Manager,}
I am writing to apply for the position.
\closing{Sincerely,}
\encl{CV\\Transcript}
\end{letter}
\end{document}일본어 편지 전용 클래스가 있는가 — \挨拶과 나가가타 봉투용 .lco
TeX Live 2024에는 일본어 편지 전용 클래스가 없습니다. *letter*.cls를 찾아보면 scrlttr2, g-brief, dinbrief, akletter 같은 서구어용만 나오고 일본어 편지 클래스는 보이지 않습니다. 다만 실무적인 답은 두 가지 있습니다. 하나는 봉투 쪽으로, KOMA-Script가 일본 봉투에 맞춘 .lco를 함께 제공한다는 점입니다. NipponEL, NipponEH, NipponLL, NipponLH, NipponRL이 나가가타·요가타 3호/4호에, KakuLL이 가쿠가타 A4에 대응합니다(창 크기는 90×45 mm 또는 90×55 mm). 이 지원은 KOMA-Script 2.97e부터 들어 있으며, 매뉴얼의 부록 한 장을 Gernot Hassenpflug가 써서 JIS A판과 B판 용지의 차이까지 설명합니다.
| .lco 파일 | 대응 봉투 | 창 크기 |
|---|---|---|
DIN | 유럽 DIN 규격 봉투(보통의 출발점) | — |
NipponEL | 나가가타 / 요가타 3호·4호 | 90 × 45 mm |
NipponEH | 위와 같되 창이 높은 것 | 90 × 55 mm |
NipponRL | 창이 오른쪽에 있는 나가가타 / 요가타 | 90 × 45 mm |
KakuLL | 가쿠가타 A4 | 90 × 45 mm |
visualize | 봉투 규격이 아니라 배치 치수를 지면에 인쇄해 확인하는 보조 | — |
다른 하나의 답은 본문의 첫머리에 있습니다. TeX Live에 jsclasses와 함께 배포되는 okumacro.sty(오쿠무라 하루히코의 매크로 모음)에는 이름이 일본어로 쓰인 명령 \挨拶(인사)이 정의되어 있어, 이것만 쓰면 「拝啓」에 이어 그달에 어울리는 계절 인사말이 들어갑니다. 구현은 \ifcase\month로 열두 갈래를 나누는 소박한 방식이며, 1월부터 순서대로 厳寒・春寒・早春・陽春・新緑・向暑・猛暑・残暑・初秋・仲秋・晩秋・初冬가 놓이고 끝에 「の候,ますますご清栄のこととお喜び申し上げます。」가 붙습니다. 실제로 8월에 upLaTeX으로 컴파일하면 「拝啓 残暑の候,ますますご清栄のこととお喜び申し上げます。」가 나옵니다. 제어 시퀀스의 이름을 일본어로 쓸 수 있다는 것 자체가 pTeX 계열의 특징이며, 여기서 일본어가 단순한 문자 데이터가 아니라 언어로 다루어지고 있다는 증거이기도 합니다.
% Japanese letter opening: okumacro defines a Japanese-named command that
% emits the salutation plus the seasonal formula for the current \month.
% Build with: uplatex jl.tex && dvipdfmx jl.dvi
\documentclass[uplatex,a4paper]{jsarticle}
\usepackage{okumacro}
\begin{document}
\挨拶
このたびは大変お世話になりました。
\hfill 敬具
\end{document}실무 — 무엇을 고르고 git에 무엇을 둘 것인가
선택은 대개 제출 요건이 정해 줍니다. Europass가 지정되어 있다면 europecv 또는 europasscv(어느 판인지 확인한 뒤에). JIS 양식의 칸이 필요한 일본어 이력서라면 CV 클래스가 아니라 tabular로 칸을 짜는 편이 빠릅니다. CV 클래스는 모두 서구식 “목록형” 이력서를 전제로 해서, 성명란·사진란·날인란이 늘어선 양식에는 맞지 않습니다. 그 밖의 일반적인 영문 CV라면 moderncv, 더 현대적인 2단 구성을 원하면 limecv, KOMA-Script에 익숙하다면 komacv입니다. 그리고 무엇을 고르든 잊지 말아야 할 것은 자기소개서를 같은 클래스로 쓰는 일입니다. moderncv에는 \recipient, \opening, \makelettertitle, \makeletterclosing, \enclosure가 있어 이력서와 편지의 제목·서체·색이 맞춰집니다. 서로 다른 템플릿으로 만든 두 장은 나란히 놓으면 대개 티가 납니다.
- 지원처별 차이는 브랜치가 아니라 파일 분리로 가져갑니다. 공통
cv-body.tex를 각cv-company-a.tex가\input만 하게 하면 갱신할 곳이 한 군데뿐입니다. - 클래스와 템플릿을 저장소에 함께 넣어 둡니다. 배포판에 없는 것—예컨대
altacv—이야말로 3년 뒤의 자신이 반드시 걸려 넘어질 지점입니다. \jobname에 맡기지 말고 명시적인 출력 파일명을 씁니다.main.pdf라는 첨부는 상대의 다운로드 폴더에서 미아가 됩니다.- PDF 메타데이터를 확인합니다.
pdfinfo로 보이는 작성자 이름과 제목은 파일과 함께 지원처에 그대로 전달됩니다. - 일본어 편지는 인쇄하고 접는 데까지 시험합니다. 창봉투에 넣는다면
scrlttr2의visualize옵션으로 위치를 인쇄해 확인할 수 있습니다.
끝으로, 이 분야에서 LaTeX이 정말 강한 지점은 어디인가. 이력서는 디자인 문서라 겉모습만 겨루면 InDesign에도 Canva 템플릿에도 이기지 못합니다. LaTeX의 강점은 다른 곳에 있습니다. 5년 전의 .tex가 오늘도 같은 PDF를 낸다는 점, 지원처마다 고쳐 쓴 부분이 git diff로 읽힌다는 점, 논문 목록을 .bib에서 자동 생성할 수 있다는 점입니다. 곧 이력서를 “한 번 만드는 작품”이 아니라 “유지하는 자산”으로 다룰 수 있게 해 줍니다. 그래서 클래스를 고를 때 가장 먼저 확인할 것은 겉모습이 아니라 그 클래스가 3년 뒤에도 컴파일되는가입니다. kpsewhich로 존재를, 실제 컴파일로 건전성을 확인하는 순서입니다.