I parsed the three most popular LaTeX resume templates. One lost the candidate's name.
"Is a LaTeX resume ATS friendly?" gets asked constantly, and the answers are always about LaTeX in general. I maintain a resume parser, so I ran the three templates people actually use through it instead.
- Jake's Resume 98 / 98 Parses clean
- Awesome-CV 53 / 98 At risk
- moderncv (classic) 39 / 98 Breaks
Same parser, same scorer, same day. LaTeX isn't the problem, and neither is PDF. The gap between 98 and 39 comes down to three things a template does or doesn't do.
Jake's Resume: nothing lost
Compiled with pdfLaTeX from jakegut/resume at commit 3e64a93. Name, email, phone, links, all four sections and all seven date ranges came back.
The reason is two lines most LaTeX resumes leave out:
\input{glyphtounicode}
\pdfgentounicode=1
A PDF stores glyphs, the shapes of letters, not the letters themselves. To get text back out, a parser needs a map from each glyph to the character it stands for, and pdfLaTeX only writes a complete map when you tell it to. Jake's template tells it to.
The rest is ordinary good practice: one column, plain section names, contact details written out as text on the second line, and each date on the same line as its job.
Awesome-CV: every hyphen becomes invisible
Awesome-CV has about 28,800 stars on GitHub and looks excellent. I tested the example resume PDF its author publishes (posquit0/Awesome-CV at dfe8635). That PDF encodes every hyphen and every dash between two dates as a soft hyphen, character U+00AD, an invisible mark that text software is built to ignore. There are 41 of them.
The source says cloud-native and Sep. 2023 - Mar. 2024. This is what comes out:
Seasoned SRE/DevOps leader ... seeking highimpact opportunities in fastgrowing startup companies. With 15+ years of handson ... DevOps Engineer Sep. 2023 Mar. 2024
Two things break at once:
- A recruiter searching for
cloud-nativewon't matchcloudnative. Sep. 2023 Mar. 2024is two dates side by side, not a range, so no start and end get recorded.
On page 2 it gets worse. The dates and locations, set at the right of each entry, come out as a separate block after all the jobs. The checker reported seven entries with no dates at all.
To rule out a quirk in my own reader (pdf.js), I ran the same file through poppler's pdftotext. It finds the same 41 soft hyphens. It's in the file.
moderncv: the address becomes your name
Parsers take the first substantial line of a resume as the name. moderncv's classic style (xdanaux/moderncv at 453d694, its published example) prints the address block at the top, so the extracted text opens like this:
street and number postcode city country H +1 (234) 567 890 B j***@doe.org
The parser files "street and number" as the candidate's name. The single letters are the contact icons: they're drawn from a symbol font, and a symbol font's phone or envelope comes out as a letter.
To be fair to moderncv, its example is an unfilled template, with "year-year" where the dates go, so I'm not blaming the layout for its missing dates. The name and the icons come from the layout, though, and they'd follow your content into it.
How to make a LaTeX resume parse
- Add
\input{glyphtounicode}and\pdfgentounicode=1to your preamble and compile with pdfLaTeX. Jake's template already has them. - Put your name on the first line, with nothing above it.
- Write your phone, email and profile URLs as plain text, not icons.
- Keep one column, and keep each date on the same line as the job it belongs to.
- Use a plain hyphen between dates, and check that it survives.
Then check the PDF you actually send, not the source. Copy all of its text into a plain text editor: if your hyphens, dates or name come out wrong there, a parser sees the same thing.
I wrote this up with the full table on my site: Are LaTeX resumes ATS friendly? Three templates, parsed. If you want to see what a parser reads from your own compiled PDF, field by field, the checker runs in your browser and the file never leaves it.
Comments
No comments yet. Start the discussion.