A CV is one of the very few documents whose reader judges the typography before reading a word of the content. And yet the reason to write one in LaTeX is not that it comes out beautiful — it is that last year's résumé still compiles this year, and that the changes you make for each employer survive as a git diff. This is also the corner of LaTeX where online advice has gone stalest: several of the classes routinely named as "the standard choice" are not in TeX Live 2024 at all, and one that is ships an error on its very first compile. This page lists only what actually works on TeX Live 2024, checked with kpsewhich and by compiling. The second half is letters — the standard letter class, KOMA-Script's scrlttr2, and Japanese correspondence.
Which CV classes ship with TeX Live 2024 — and which do not
The short answer: moderncv, europecv, europasscv, currvita, komacv and limecv are all in TeX Live 2024, but altacv and awesome-cv — the two names blog posts and Overleaf gallery write-ups reach for most often — are not. Type \documentclass{altacv} locally and the run stops with ! LaTeX Error: File 'altacv.cls' not found. (same wording for awesome-cv). Both are distributed from GitHub and the Overleaf template gallery rather than CTAN, so using one means cloning the repository and dropping the .cls next to your own file. This is the first trap people hit when they try to rebuild an Overleaf CV on their own machine. Run kpsewhich altacv.cls; if it prints nothing, it is not installed.
| Class / package | In TeX Live 2024 | What it gives you |
|---|---|---|
moderncv | yes (v2.3.1) | five styles, seven colours, CV and cover letter from one class |
europecv | yes (needs a workaround) | the EU Europass layout; ships label definitions for 29 languages |
europasscv | yes | the 2013 Europass revision; its README states the 2020 layouts are not implemented |
currvita | yes | a package, not a class: it adds cv and cvlist environments on top of article |
komacv | yes (v1.1.2) | the moderncv look rebuilt on top of KOMA-Script |
limecv | yes (v0.1.12) | a modern sidebar layout — the closest in-distribution answer to altacv |
altacv | no | distributed via GitHub / Overleaf; kpsewhich altacv.cls returns nothing |
awesome-cv | no | likewise; you get ! LaTeX Error: File 'awesome-cv.cls' not found. |
Using moderncv: \moderncvstyle and \cventry
moderncv is built on one idea: decide the appearance in two lines, then write nothing but structure. \moderncvstyle{...} picks one of five layouts (casual [the default], classic, banking, oldstyle, fancy) and \moderncvcolor{...} one of seven colours (blue, black, burgundy, green, grey, orange, purple, red). Compiling all five styles with pdfLaTeX against the v2.3.1 shipped in TeX Live 2024 produced no errors in any of them. The workhorse is \cventry{years}{title}{institution}{location}{grade}{description}, six arguments where an empty {} simply collapses that column. One-line entries use \cvitem{header}{text}, two side by side use \cvdoubleitem, and bulleted ones use \cvlistitem. The structure is the document; the style is a skin over it — which is why switching casual to banking for a different employer touches not a single character of your content.
\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}Is moderncv abandoned? Its own README answers
"Abandoned" is only half right, and the README.md shipped inside TeX Live 2024 says which half: this distribution is a fork whose aim is to keep moderncv alive inside CTAN, because upstream has been dead since 2016. The original author is Xavier Danaux; the CHANGELOG entry for v2.1.0 (21 January 2021) records "maintainer change: now team maintained", which is where the volunteer rescue begins. The version in TeX Live 2024 is v2.3.1, dated 21 February 2022. So the accurate description is not "dead" but "orphaned in 2016 and adopted in 2021" — and it does compile without error on TeX Live 2024. The added \social services and the move to fontawesome5 are that team's work too.
It does carry the marks of a rescued package, though. moderncv has no manual: the README.md says plainly that "until a decent manual is written" you should read template.tex instead (the bundled moderncv_userguide.pdf still bears a January 2021 date). And the documentation directory contains a file simply called KNOWN_BUGS, listing things like the stray space around the bibliography in the fancy style, the lonely \item--perhaps a missing list environment you get with bibentry, and the interaction between CJK and fancyhdr. If your CV is going to carry a publication list, reading that one file before you commit to the class is the cheapest research you will do. texdoc -l moderncv will tell you where it lives.
Fixing europecv's Sorting rule for 'begindocument' hook applied too late.
The fix is one line: load \usepackage{hyperref} (or bookmark) yourself in the preamble, and the error is gone. The cause sits in the class. europecv.cls pulls hyperref in from inside \AtBeginDocument{...\RequirePackage{hyperref}...} — that is, while \begin{document} is already running. The nameref.sty that hyperref brings along executes \DeclareHookRule{begindocument}{showkeys}{before}{nameref}, but by then the begindocument hook has started, so the LaTeX kernel raises ! LaTeX hooks Error: Sorting rule for 'begindocument' hook applied too late. Loading hyperref earlier yourself makes nameref arrive at a moment when its hook rule still counts.
% 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}That this is a defect in the class rather than a beginner's mistake can be checked against europecv's own shipped example: run doc/latex/europecv/examples/minimal.tex — the official minimal file — through pdfLaTeX and you get the same error. templates/cv_template_en.tex, by contrast, compiles cleanly, and the only relevant difference is that it says \usepackage{bookmark}, which drags hyperref in first. Note also that europecv.cls calls \includegraphics without loading graphicx itself, so with the logo and flag still switched on you additionally get ! Undefined control sequence. \draweuropasslogo. Add \usepackage{graphicx}, or pass the class option nologo.
On the Europass format itself, do not mix up the two similarly named classes. europecv implements the lineage of the common European format launched in 2002 and ships label definition files for 29 languages, from ecvbg.def through ecvsv.def. europasscv implements the layout of the 2013 revision, and its README still carries the warning that "at the moment this class does not implement the newest europass layouts that were launched in 2020". The EU revises its template, so when an application asks for "a CV in Europass format", the practical first step is to find out which edition they mean.
The standard letter class: many recipients from one file
The real selling point of the letter class is that you get as many letters as you write letter environments. Put the sender in \address and the signature in \signature once in the preamble, then stack \begin{letter}{recipient} blocks: each produces its own letter, on its own page, from the same sender. Ten reference letters, or the same notice to thirty companies, comes out of a single file. Inside, there are just three parts: \opening{salutation}, the body, and \closing{sign-off}. The date is inserted automatically by \today; \encl{...} prints as encl:, \cc{...} as cc:, and \ps{...} places a postscript below the signature. Two letters in, two pages out — that much you can verify by compiling.
\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 and scrletter: fold marks and window envelopes
What decisively separates scrlttr2 from the plain letter class is that it looks after folding the sheet and putting it in an envelope. It prints faint rules where the paper is to be folded (foldmarks) and positions the address block to show through the window. All of that adjustment is factored out into .lco files — letter class options — loaded with \LoadLetterOption{DIN}. KOMA-Script ships DIN, DIN5008A, DIN5008B, DINmtext, NF (France), SN and SNleft (Switzerland), UScommercial9 and UScommercial9DW, plus visualize, which prints the geometry so you can see it. Everything is configured through variables of the form \setkomavar{fromname}{...}, so values and appearance are completely separate. Re-issuing the same letter for a different envelope standard changes exactly one line: the \LoadLetterOption.
The other thing worth knowing is scrletter, which is not a class but a package: it lets you drop a letter environment into the middle of a scrartcl or scrbook document. A covering letter appended to a report, or a note at the end of a contract, no longer has to become a second document. Adding \usepackage{scrletter} to a \documentclass{scrartcl} file and putting \begin{letter}{...} right after a \section{...} compiles as it stands. scrlttr2 and scrletter use the same variables and the same .lco files, so nothing has to be relearned.
\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}Is there a Japanese letter class? \挨拶 and the Nippon envelope .lco files
There is no dedicated Japanese letter class in TeX Live 2024. Searching for *letter*.cls turns up scrlttr2, g-brief, dinbrief, akletter and other Western classes, but nothing for Japanese correspondence. There are, however, two practical answers. The first concerns the envelope: KOMA-Script ships .lco files cut for Japanese envelopes — NipponEL, NipponEH, NipponLL, NipponLH and NipponRL cover the Chou and You sizes 3 and 4, and KakuLL covers Kaku A4 (windows of 90×45 mm or 90×55 mm). The support has been there since KOMA-Script 2.97e, and an appendix chapter of the manual, written by Gernot Hassenpflug, explains it right down to the difference between JIS A- and B-series paper.
| .lco file | Envelope | Window size |
|---|---|---|
DIN | European DIN envelopes (the usual starting point) | — |
NipponEL | Chou / You sizes 3 and 4 | 90 × 45 mm |
NipponEH | the same, with a taller window | 90 × 55 mm |
NipponRL | Chou / You with the window set to the right | 90 × 45 mm |
KakuLL | Kaku A4 | 90 × 45 mm |
visualize | not an envelope standard: prints the geometry so you can check it | — |
The other answer is about how the letter opens. okumacro.sty — Haruhiko Okumura's macro collection, shipped with jsclasses in TeX Live — defines a command whose name is written in Japanese, \挨拶 ("greeting"), and writing it alone produces 拝啓 followed by the seasonal salutation appropriate to the current month. The implementation is a plain twelve-way \ifcase\month: 厳寒, 春寒, 早春, 陽春, 新緑, 向暑, 猛暑, 残暑, 初秋, 仲秋, 晩秋, 初冬 from January onward, closed by の候,ますますご清栄のこととお喜び申し上げます。 Compiled with upLaTeX in August it really does print 拝啓 残暑の候,ますますご清栄のこととお喜び申し上げます。 That a control sequence can be spelled in Japanese at all is a property of the pTeX family — evidence that Japanese here is treated as a language, not merely as character data.
% 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}In practice: which one to pick, and what to keep in git
The choice is mostly made for you by the submission requirements. If Europass is mandated, use europecv or europasscv (after checking which edition is wanted). If you need a Japanese rirekisho with its JIS-style ruled boxes, build it with tabular rather than a CV class — every CV class assumes the Western list-shaped résumé and fits badly against a form with name, photograph and seal fields. For an ordinary English-language CV, moderncv; if you want a more contemporary two-column look, limecv; if you already live in KOMA-Script, komacv. And whichever you choose, do not forget to write the cover letter in the same class. moderncv provides \recipient, \opening, \makelettertitle, \makeletterclosing and \enclosure, so headings, type and colour match across the two. Two sheets built from two different templates are usually noticed when they land side by side.
- Keep per-employer differences in separate files, not branches: a shared
cv-body.texthat eachcv-company-a.texmerely\inputs means one place to update. - Vendor the class and template into the repository. Anything that is not in the distribution —
altacv, for instance — is what will trip up your future self three years from now. - Use an explicit output name rather than whatever
\jobnamehappens to be. Amain.pdfattachment gets lost in the recipient's downloads folder. - Check the PDF metadata. The author name and title visible to
pdfinfotravel with the file to the employer. - Test a Japanese letter all the way through printing and folding. If it goes into a window envelope,
scrlttr2'svisualizeoption will print the geometry for you to check.
Finally, where LaTeX genuinely wins here. A CV is a design document, and on looks alone it will not beat InDesign or a Canva template. LaTeX's advantage lies elsewhere: a .tex from five years ago still produces the same PDF today, the rewrite you did for each employer is readable as a git diff, and a publication list can be generated from a .bib. In other words, it lets you treat a CV as an asset you maintain rather than an artefact you make once. Which is exactly why the first thing to check when choosing a class is not how it looks but whether it will still compile in three years — existence with kpsewhich, health with a real compile, in that order.